ZGlmZiAtLWdpdCBhL0xpY2Vuc2UvbGljZW5zZS50eHQgYi9MaWNlbnNlL2xpY2Vuc2UudHh0CmluZGV4IDAwNzIzMTAuLjI5NzdkNTIgMTAwNjQ0Ci0tLSBhL0xpY2Vuc2UvbGljZW5zZS50eHQKKysrIGIvTGljZW5zZS9saWNlbnNlLnR4dApAQCAtMTcsNyArMTcsNyBAQAogTGljZW5zZSB0ZXh0OgogLS0tLS0tLS0tLS0tLQogCi1Db3B5cmlnaHQgKEMpIDIwMTcgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCitDb3B5cmlnaHQgKEMpIDIwMTkgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgogdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bwpkaWZmIC0tZ2l0IGEvUkVBRE1FLm1kIGIvUkVBRE1FLm1kCmluZGV4IDRlODBmMTguLjk5MWJkYjQgMTAwNjQ0Ci0tLSBhL1JFQURNRS5tZAorKysgYi9SRUFETUUubWQKQEAgLTQwLDYgKzQwLDcgQEAKIEZyZWVSVE9TIHwgQ01TSVMgQ29yZSB8CiAtLS0tLS0tLSB8IC0tLS0tLS0tLS0gfAogVGFnIHYxMC4wLjEgfCBUYWcgdjUuNC4wCitUYWcgdjEwLjIuMSB8IFRhZyB2NS40LjAKIAogIyMgVHJvdWJsZXNob290aW5nCiAKZGlmZiAtLWdpdCBhL1NvdXJjZS9DTVNJU19SVE9TL2Ntc2lzX29zLmMgYi9Tb3VyY2UvQ01TSVNfUlRPUy9jbXNpc19vcy5jCmluZGV4IDcyZjIzYWQuLjg5YzM2MzMgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9DTVNJU19SVE9TL2Ntc2lzX29zLmMKKysrIGIvU291cmNlL0NNU0lTX1JUT1MvY21zaXNfb3MuYwpAQCAtMzY0LDcgKzM2NCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgMSwgLy8gcGVyaW9kIHNob3VsZCBiZSBmaWxsZWQgd2hlbiBzdGFydGluZyB0aGUgVGltZXIgdXNpbmcgb3NUaW1lclN0YXJ0CiAgICAgICAgICAgICAgICAgICAgICAgKHR5cGUgPT0gb3NUaW1lclBlcmlvZGljKSA/IHBkVFJVRSA6IHBkRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikgYXJndW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgKFRhc2tGdW5jdGlvbl90KXRpbWVyX2RlZi0+cHRpbWVyLAorICAgICAgICAgICAgICAgICAgICAgIChUaW1lckNhbGxiYWNrRnVuY3Rpb25fdCl0aW1lcl9kZWYtPnB0aW1lciwKICAgICAgICAgICAgICAgICAgICAgICAoU3RhdGljVGltZXJfdCAqKXRpbWVyX2RlZi0+Y29udHJvbGJsb2NrKTsKICAgfQogICBlbHNlIHsKQEAgLTM3MiwyMSArMzcyLDIxIEBACiAgICAgICAgICAgICAgICAgICAgICAgMSwgLy8gcGVyaW9kIHNob3VsZCBiZSBmaWxsZWQgd2hlbiBzdGFydGluZyB0aGUgVGltZXIgdXNpbmcgb3NUaW1lclN0YXJ0CiAgICAgICAgICAgICAgICAgICAgICAgKHR5cGUgPT0gb3NUaW1lclBlcmlvZGljKSA/IHBkVFJVRSA6IHBkRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikgYXJndW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgKFRhc2tGdW5jdGlvbl90KXRpbWVyX2RlZi0+cHRpbWVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAoVGltZXJDYWxsYmFja0Z1bmN0aW9uX3QpdGltZXJfZGVmLT5wdGltZXIpOwogIH0KICNlbGlmKCBjb25maWdTVVBQT1JUX1NUQVRJQ19BTExPQ0FUSU9OID09IDEgKQogICByZXR1cm4geFRpbWVyQ3JlYXRlU3RhdGljKChjb25zdCBjaGFyICopIiIsCiAgICAgICAgICAgICAgICAgICAgICAgMSwgLy8gcGVyaW9kIHNob3VsZCBiZSBmaWxsZWQgd2hlbiBzdGFydGluZyB0aGUgVGltZXIgdXNpbmcgb3NUaW1lclN0YXJ0CiAgICAgICAgICAgICAgICAgICAgICAgKHR5cGUgPT0gb3NUaW1lclBlcmlvZGljKSA/IHBkVFJVRSA6IHBkRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikgYXJndW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgKFRhc2tGdW5jdGlvbl90KXRpbWVyX2RlZi0+cHRpbWVyLAorICAgICAgICAgICAgICAgICAgICAgIChUaW1lckNhbGxiYWNrRnVuY3Rpb25fdCl0aW1lcl9kZWYtPnB0aW1lciwKICAgICAgICAgICAgICAgICAgICAgICAoU3RhdGljVGltZXJfdCAqKXRpbWVyX2RlZi0+Y29udHJvbGJsb2NrKTsgIAogI2Vsc2UKICAgcmV0dXJuIHhUaW1lckNyZWF0ZSgoY29uc3QgY2hhciAqKSIiLAogICAgICAgICAgICAgICAgICAgICAgIDEsIC8vIHBlcmlvZCBzaG91bGQgYmUgZmlsbGVkIHdoZW4gc3RhcnRpbmcgdGhlIFRpbWVyIHVzaW5nIG9zVGltZXJTdGFydAogICAgICAgICAgICAgICAgICAgICAgICh0eXBlID09IG9zVGltZXJQZXJpb2RpYykgPyBwZFRSVUUgOiBwZEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopIGFyZ3VtZW50LAotICAgICAgICAgICAgICAgICAgICAgIChUYXNrRnVuY3Rpb25fdCl0aW1lcl9kZWYtPnB0aW1lcik7CisgICAgICAgICAgICAgICAgICAgICAgKFRpbWVyQ2FsbGJhY2tGdW5jdGlvbl90KXRpbWVyX2RlZi0+cHRpbWVyKTsKICNlbmRpZgogCiAjZWxzZSAKZGlmZiAtLWdpdCBhL1NvdXJjZS9DTVNJU19SVE9TX1YyL2Ntc2lzX29zLmggYi9Tb3VyY2UvQ01TSVNfUlRPU19WMi9jbXNpc19vcy5oCmluZGV4IDNiODg1YmIuLjcxMTQwOGEgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9DTVNJU19SVE9TX1YyL2Ntc2lzX29zLmgKKysrIGIvU291cmNlL0NNU0lTX1JUT1NfVjIvY21zaXNfb3MuaApAQCAtMSw3ICsxLDUgQEAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgqSAyMDE3IFNUTWljcm9lbGVjdHJvbmljcyBJbnRlcm5hdGlvbmFsIE4uVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFBvcnRpb25zIENvcHlyaWdodCAoYykgMjAxMy0yMDE3IEFSTSBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxOSBBUk0gTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAogICoKQEAgLTE3LDggKzE1LDEzIEBACiAgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogJERhdGU6ICAgICAgICAxMC4gSmFudWFyeSAyMDE3CisgKiAkUmV2aXNpb246ICAgIFYyLjEuMAorICoKICAqIFByb2plY3Q6ICAgICAgQ01TSVMtUlRPUyBBUEkKLSAqIFRpdGxlOiAgICAgICAgY21zaXNfb3MuaCBoZWFkZXIgZmlsZQorICogVGl0bGU6ICAgICAgICBjbXNpc19vcy5oIEZyZWVSVE9TIGhlYWRlciBmaWxlCiAgKgogICogVmVyc2lvbiAwLjAyCiAgKiAgICBJbml0aWFsIFByb3Bvc2FsIFBoYXNlCkBAIC0zNiw3ICszOSw3IEBACiAgKiBWZXJzaW9uIDEuMDIKICAqICAgIENvbnRyb2wgZnVuY3Rpb25zIGZvciBzaG9ydCB0aW1lb3V0cyBpbiBtaWNyb3NlY29uZCByZXNvbHV0aW9uOgogICogICAgQWRkZWQ6IG9zS2VybmVsU3lzVGljaywgb3NLZXJuZWxTeXNUaWNrRnJlcXVlbmN5LCBvc0tlcm5lbFN5c1RpY2tNaWNyb1NlYwotICogICAgUmVtb3ZlZDogb3NTaWduYWxHZXQKKyAqICAgIFJlbW92ZWQ6IG9zU2lnbmFsR2V0IAogICogVmVyc2lvbiAyLjAuMAogICogICAgT1Mgb2JqZWN0cyBjcmVhdGlvbiB3aXRob3V0IG1hY3JvcyAoZHluYW1pYyBjcmVhdGlvbiBhbmQgcmVzb3VyY2UgYWxsb2NhdGlvbik6CiAgKiAgICAgLSBhZGRlZDogb3NYeHh4TmV3IGZ1bmN0aW9ucyB3aGljaCByZXBsYWNlIG9zWHh4eENyZWF0ZQpAQCAtNjQsNyArNjcsNyBAQAogICogICAgIC0gYWRkZWQ6IG9zVGhyZWFkU3VzcGVuZCwgb3NUaHJlYWRSZXN1bWUKICAqICAgICAtIGFkZGVkOiBvc1RocmVhZEpvaW4sIG9zVGhyZWFkRGV0YWNoLCBvc1RocmVhZEV4aXQKICAqICAgICAtIGFkZGVkOiBvc1RocmVhZEdldENvdW50LCBvc1RocmVhZEVudW1lcmF0ZQotICogICAgIC0gYWRkZWQ6IFRocmVhZCBGbGFncyAobW92ZWQgZnJvbSBTaWduYWxzKQorICogICAgIC0gYWRkZWQ6IFRocmVhZCBGbGFncyAobW92ZWQgZnJvbSBTaWduYWxzKSAKICAqICAgIFNpZ25hbHM6CiAgKiAgICAgLSByZW5hbWVkIG9zU2lnbmFscyB0byBvc1RocmVhZEZsYWdzIChtb3ZlZCB0byBUaHJlYWQgRmxhZ3MpCiAgKiAgICAgLSBjaGFuZ2VkIHJldHVybiB2YWx1ZSBvZiBTZXQvQ2xlYXIvV2FpdCBmdW5jdGlvbnMKQEAgLTEwNyw3ICsxMTAsNyBAQAogICogICAgIC0gYWRkZWQ6IG9zTWVzc2FnZVF1ZXVlR2V0Q2FwYWNpdHksIG9zTWVzc2FnZVF1ZXVlR2V0TXNnU2l6ZQogICogICAgIC0gYWRkZWQ6IG9zTWVzc2FnZVF1ZXVlR2V0Q291bnQsIG9zTWVzc2FnZVF1ZXVlR2V0U3BhY2UKICAqICAgICAtIGFkZGVkOiBvc01lc3NhZ2VRdWV1ZVJlc2V0LCBvc01lc3NhZ2VRdWV1ZURlbGV0ZQotICogICAgTWFpbCBRdWV1ZToKKyAqICAgIE1haWwgUXVldWU6IAogICogICAgIC0gZGVwcmVjYXRlZCAoc3VwZXJzZWRlZCBieSBleHRlbmRlZCBNZXNzYWdlIFF1ZXVlIGZ1bmN0aW9uYWxpdHkpCiAgKiBWZXJzaW9uIDIuMS4wCiAgKiAgICBTdXBwb3J0IGZvciBjcml0aWNhbCBhbmQgdW5jcml0aWNhbCBzZWN0aW9ucyAobmVzdGluZyBzYWZlKToKQEAgLTExNiwxNiArMTE5LDIyIEBACiAgKiAgICBVcGRhdGVkIFRocmVhZCBhbmQgRXZlbnQgRmxhZ3M6CiAgKiAgICAtIGNoYW5nZWQgZmxhZ3MgcGFyYW1ldGVyIGFuZCByZXR1cm4gdHlwZSBmcm9tIGludDMyX3QgdG8gdWludDMyX3QKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQorIAogI2lmbmRlZiBDTVNJU19PU19IXwogI2RlZmluZSBDTVNJU19PU19IXwogCi0jZGVmaW5lIG9zQ01TSVMgICAgICAgICAgICAgMHgyMDAwMVUgICAgLy8vPCBBUEkgdmVyc2lvbiAobWFpblszMToxNl0uc3ViWzE1OjBdKQorI2luY2x1ZGUgIkZyZWVSVE9TLmgiCisjaW5jbHVkZSAidGFzay5oIgogCi0jZGVmaW5lIG9zQ01TSVNfRnJlZVJUT1MgICAgMHhBMDAwMVUgICAgLy8vPCBSVE9TIGlkZW50aWZpY2F0aW9uIGFuZCB2ZXJzaW9uIChtYWluWzMxOjE2XS5zdWJbMTU6MF0pCisjZGVmaW5lIFJUT1NfSURfbiAgICAgICAgICAgICAoKHRza0tFUk5FTF9WRVJTSU9OX01BSk9SIDw8IDE2KSB8ICh0c2tLRVJORUxfVkVSU0lPTl9NSU5PUikpCisjZGVmaW5lIFJUT1NfSURfcyAgICAgICAgICAgICAoIkZyZWVSVE9TICIgdHNrS0VSTkVMX1ZFUlNJT05fTlVNQkVSKQogCi0jZGVmaW5lIG9zS2VybmVsU3lzdGVtSWQgICAgIkZyZWVSVE9TIFYxMC4wLjEiIC8vLzwgUlRPUyBpZGVudGlmaWNhdGlvbiBzdHJpbmcKKyNkZWZpbmUgb3NDTVNJUyAgICAgICAgICAgICAgIDB4MjAwMDFVICAvLy88IEFQSSB2ZXJzaW9uIChtYWluWzMxOjE2XS5zdWJbMTU6MF0pCiAKKyNkZWZpbmUgb3NDTVNJU19GcmVlUlRPUyAgICAgIFJUT1NfSURfbiAvLy88IFJUT1MgaWRlbnRpZmljYXRpb24gYW5kIHZlcnNpb24gKG1haW5bMzE6MTZdLnN1YlsxNTowXSkKKyAKKyNkZWZpbmUgb3NLZXJuZWxTeXN0ZW1JZCAgICAgIFJUT1NfSURfcyAvLy88IFJUT1MgaWRlbnRpZmljYXRpb24gc3RyaW5nCisgCiAjZGVmaW5lIG9zRmVhdHVyZV9NYWluVGhyZWFkICAwICAgICAgICAgLy8vPCBtYWluIHRocmVhZCAgICAgIDE9bWFpbiBjYW4gYmUgdGhyZWFkLCAwPW5vdCBhdmFpbGFibGUKICNkZWZpbmUgb3NGZWF0dXJlX1NpZ25hbHMgICAgIDI0VSAgICAgICAvLy88IG1heGltdW0gbnVtYmVyIG9mIFNpZ25hbCBGbGFncyBhdmFpbGFibGUgcGVyIHRocmVhZAogI2RlZmluZSBvc0ZlYXR1cmVfU2VtYXBob3JlICAgNjU1MzVVICAgIC8vLzwgbWF4aW11bSBjb3VudCBmb3IgXHJlZiBvc1NlbWFwaG9yZUNyZWF0ZSBmdW5jdGlvbgpAQCAtMTM0LDcgKzE0Myw3IEBACiAjZGVmaW5lIG9zRmVhdHVyZV9Qb29sICAgICAgICAwICAgICAgICAgLy8vPCBNZW1vcnkgUG9vbHM6ICAgIDE9YXZhaWxhYmxlLCAwPW5vdCBhdmFpbGFibGUKICNkZWZpbmUgb3NGZWF0dXJlX01lc3NhZ2VRICAgIDEgICAgICAgICAvLy88IE1lc3NhZ2UgUXVldWVzOiAgMT1hdmFpbGFibGUsIDA9bm90IGF2YWlsYWJsZQogI2RlZmluZSBvc0ZlYXR1cmVfTWFpbFEgICAgICAgMCAgICAgICAgIC8vLzwgTWFpbCBRdWV1ZXM6ICAgICAxPWF2YWlsYWJsZSwgMD1ub3QgYXZhaWxhYmxlCi0KKyAKICNpZiAgIGRlZmluZWQoX19DQ19BUk0pCiAjZGVmaW5lIG9zX0luUmVncyBfX3ZhbHVlX2luX3JlZ3MKICNlbGlmIGRlZmluZWQoX19BUk1DQ19WRVJTSU9OKSAmJiAoX19BUk1DQ19WRVJTSU9OID49IDYwMTAwNTApCkBAIC0xNDIsMTggKzE1MSwxNyBAQAogI2Vsc2UKICNkZWZpbmUgb3NfSW5SZWdzCiAjZW5kaWYKLQorIAogI2luY2x1ZGUgImNtc2lzX29zMi5oIgotI2luY2x1ZGUgIkZyZWVSVE9TLmgiCi0KKyAKICNpZmRlZiAgX19jcGx1c3BsdXMKIGV4dGVybiAiQyIKIHsKICNlbmRpZgotCi0KKyAKKyAKIC8vID09PT0gRW51bWVyYXRpb25zLCBzdHJ1Y3R1cmVzLCBkZWZpbmVzID09PT0KLQorIAogLy8vIFByaW9yaXR5IHZhbHVlcy4KICNpZiAob3NDTVNJUyA8IDB4MjAwMDBVKQogdHlwZWRlZiBlbnVtIHsKQEAgLTE3MywxMCArMTgxLDEwIEBACiAKIC8vLyBFbnRyeSBwb2ludCBvZiBhIHRocmVhZC4KIHR5cGVkZWYgdm9pZCAoKm9zX3B0aHJlYWQpICh2b2lkIGNvbnN0ICphcmd1bWVudCk7Ci0KKyAKIC8vLyBFbnRyeSBwb2ludCBvZiBhIHRpbWVyIGNhbGwgYmFjayBmdW5jdGlvbi4KIHR5cGVkZWYgdm9pZCAoKm9zX3B0aW1lcikgKHZvaWQgY29uc3QgKmFyZ3VtZW50KTsKLQorIAogLy8vIFRpbWVyIHR5cGUuCiAjaWYgKG9zQ01TSVMgPCAweDIwMDAwVSkKIHR5cGVkZWYgZW51bSB7CkBAIC0xODYsMTAgKzE5NCwxMCBAQAogI2Vsc2UKICNkZWZpbmUgb3NfdGltZXJfdHlwZSBvc1RpbWVyVHlwZV90CiAjZW5kaWYKLQorIAogLy8vIFRpbWVvdXQgdmFsdWUuCiAjZGVmaW5lIG9zV2FpdEZvcmV2ZXIgICAgICAgMHhGRkZGRkZGRlUgLy8vPCBXYWl0IGZvcmV2ZXIgdGltZW91dCB2YWx1ZS4KLQorIAogLy8vIFN0YXR1cyBjb2RlIHZhbHVlcyByZXR1cm5lZCBieSBDTVNJUy1SVE9TIGZ1bmN0aW9ucy4KICNpZiAob3NDTVNJUyA8IDB4MjAwMDBVKQogdHlwZWRlZiBlbnVtIHsKQEAgLTIyMSw0OCArMjI5LDQ4IEBACiAjZGVmaW5lIG9zRXJyb3JWYWx1ZSAgICAgICAgICAgICgtMTI3KQogI2RlZmluZSBvc0Vycm9yUHJpb3JpdHkgICAgICAgICAoLTEyOCkKICNlbmRpZgotCi0KKyAKKyAKIC8vID4+PiB0aGUgZm9sbG93aW5nIGRhdGEgdHlwZSBkZWZpbml0aW9ucyBtYXkgYmUgYWRhcHRlZCB0b3dhcmRzIGEgc3BlY2lmaWMgUlRPUwotCisgCiAvLy8gVGhyZWFkIElEIGlkZW50aWZpZXMgdGhlIHRocmVhZC4KICNpZiAob3NDTVNJUyA8IDB4MjAwMDBVKQogdHlwZWRlZiB2b2lkICpvc1RocmVhZElkOwogI2Vsc2UKICNkZWZpbmUgb3NUaHJlYWRJZCBvc1RocmVhZElkX3QKICNlbmRpZgotCisgCiAvLy8gVGltZXIgSUQgaWRlbnRpZmllcyB0aGUgdGltZXIuCiAjaWYgKG9zQ01TSVMgPCAweDIwMDAwVSkKIHR5cGVkZWYgdm9pZCAqb3NUaW1lcklkOwogI2Vsc2UKICNkZWZpbmUgb3NUaW1lcklkIG9zVGltZXJJZF90CiAjZW5kaWYKLQorIAogLy8vIE11dGV4IElEIGlkZW50aWZpZXMgdGhlIG11dGV4LgogI2lmIChvc0NNU0lTIDwgMHgyMDAwMFUpCiB0eXBlZGVmIHZvaWQgKm9zTXV0ZXhJZDsKICNlbHNlCiAjZGVmaW5lIG9zTXV0ZXhJZCBvc011dGV4SWRfdAogI2VuZGlmCi0KKyAKIC8vLyBTZW1hcGhvcmUgSUQgaWRlbnRpZmllcyB0aGUgc2VtYXBob3JlLgogI2lmIChvc0NNU0lTIDwgMHgyMDAwMFUpCiB0eXBlZGVmIHZvaWQgKm9zU2VtYXBob3JlSWQ7CiAjZWxzZQogI2RlZmluZSBvc1NlbWFwaG9yZUlkIG9zU2VtYXBob3JlSWRfdAogI2VuZGlmCi0KKyAKIC8vLyBQb29sIElEIGlkZW50aWZpZXMgdGhlIG1lbW9yeSBwb29sLgogdHlwZWRlZiB2b2lkICpvc1Bvb2xJZDsKLQorIAogLy8vIE1lc3NhZ2UgSUQgaWRlbnRpZmllcyB0aGUgbWVzc2FnZSBxdWV1ZS4KIHR5cGVkZWYgdm9pZCAqb3NNZXNzYWdlUUlkOwotCisgCiAvLy8gTWFpbCBJRCBpZGVudGlmaWVzIHRoZSBtYWlsIHF1ZXVlLgogdHlwZWRlZiB2b2lkICpvc01haWxRSWQ7Ci0KLQorIAorIAogLy8vIFRocmVhZCBEZWZpbml0aW9uIHN0cnVjdHVyZSBjb250YWlucyBzdGFydHVwIGluZm9ybWF0aW9uIG9mIGEgdGhyZWFkLgogI2lmIChvc0NNU0lTIDwgMHgyMDAwMFUpCiB0eXBlZGVmIHN0cnVjdCBvc190aHJlYWRfZGVmIHsKQEAgLTI3Nyw3ICsyODUsNyBAQAogICBvc1RocmVhZEF0dHJfdCAgICAgICAgICAgICAgICBhdHRyOyAgIC8vLzwgdGhyZWFkIGF0dHJpYnV0ZXMKIH0gb3NUaHJlYWREZWZfdDsKICNlbmRpZgotCisgCiAvLy8gVGltZXIgRGVmaW5pdGlvbiBzdHJ1Y3R1cmUgY29udGFpbnMgdGltZXIgcGFyYW1ldGVycy4KICNpZiAob3NDTVNJUyA8IDB4MjAwMDBVKQogdHlwZWRlZiBzdHJ1Y3Qgb3NfdGltZXJfZGVmIHsKQEAgLTI4OSw3ICsyOTcsNyBAQAogICBvc1RpbWVyQXR0cl90ICAgICAgICAgICAgICAgICBhdHRyOyAgIC8vLzwgdGltZXIgYXR0cmlidXRlcwogfSBvc1RpbWVyRGVmX3Q7CiAjZW5kaWYKLQorIAogLy8vIE11dGV4IERlZmluaXRpb24gc3RydWN0dXJlIGNvbnRhaW5zIHNldHVwIGluZm9ybWF0aW9uIGZvciBhIG11dGV4LgogI2lmIChvc0NNU0lTIDwgMHgyMDAwMFUpCiB0eXBlZGVmIHN0cnVjdCBvc19tdXRleF9kZWYgewpAQCAtMjk4LDcgKzMwNiw3IEBACiAjZWxzZQogI2RlZmluZSBvc011dGV4RGVmX3Qgb3NNdXRleEF0dHJfdAogI2VuZGlmCi0KKyAKIC8vLyBTZW1hcGhvcmUgRGVmaW5pdGlvbiBzdHJ1Y3R1cmUgY29udGFpbnMgc2V0dXAgaW5mb3JtYXRpb24gZm9yIGEgc2VtYXBob3JlLgogI2lmIChvc0NNU0lTIDwgMHgyMDAwMFUpCiB0eXBlZGVmIHN0cnVjdCBvc19zZW1hcGhvcmVfZGVmIHsKQEAgLTMwNyw3ICszMTUsNyBAQAogI2Vsc2UKICNkZWZpbmUgb3NTZW1hcGhvcmVEZWZfdCBvc1NlbWFwaG9yZUF0dHJfdAogI2VuZGlmCi0KKyAKIC8vLyBEZWZpbml0aW9uIHN0cnVjdHVyZSBmb3IgbWVtb3J5IGJsb2NrIGFsbG9jYXRpb24uCiAjaWYgKG9zQ01TSVMgPCAweDIwMDAwVSkKIHR5cGVkZWYgc3RydWN0IG9zX3Bvb2xfZGVmIHsKQEAgLTMyMiw3ICszMzAsNyBAQAogICBvc01lbW9yeVBvb2xBdHRyX3QgICAgICAgICAgICBhdHRyOyAgIC8vLzwgbWVtb3J5IHBvb2wgYXR0cmlidXRlcwogfSBvc1Bvb2xEZWZfdDsKICNlbmRpZgotCisgCiAvLy8gRGVmaW5pdGlvbiBzdHJ1Y3R1cmUgZm9yIG1lc3NhZ2UgcXVldWUuCiAjaWYgKG9zQ01TSVMgPCAweDIwMDAwVSkKIHR5cGVkZWYgc3RydWN0IG9zX21lc3NhZ2VRX2RlZiB7CkBAIC0zMzUsNyArMzQzLDcgQEAKICAgb3NNZXNzYWdlUXVldWVBdHRyX3QgICAgICAgICAgYXR0cjsgICAvLy88IG1lc3NhZ2UgcXVldWUgYXR0cmlidXRlcwogfSBvc01lc3NhZ2VRRGVmX3Q7CiAjZW5kaWYKLQorIAogLy8vIERlZmluaXRpb24gc3RydWN0dXJlIGZvciBtYWlsIHF1ZXVlLgogI2lmIChvc0NNU0lTIDwgMHgyMDAwMFUpCiB0eXBlZGVmIHN0cnVjdCBvc19tYWlsUV9kZWYgewpAQCAtMzUyLDggKzM2MCw4IEBACiAgIG9zTWVzc2FnZVF1ZXVlQXR0cl90ICAgICAgIG1xX2F0dHI7ICAgLy8vPCBtZXNzYWdlIHF1ZXVlIGF0dHJpYnV0ZXMKIH0gb3NNYWlsUURlZl90OwogI2VuZGlmCi0KLQorIAorIAogLy8vIEV2ZW50IHN0cnVjdHVyZSBjb250YWlucyBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCBhbiBldmVudC4KIHR5cGVkZWYgc3RydWN0IHsKICAgb3NTdGF0dXMgICAgICAgICAgICAgICAgICAgIHN0YXR1czsgICAvLy88IHN0YXR1cyBjb2RlOiBldmVudCBvciBlcnJvciBpbmZvcm1hdGlvbgpAQCAtMzY3LDQ0ICszNzUsNDQgQEAKICAgICBvc01lc3NhZ2VRSWQgICAgICAgICAgbWVzc2FnZV9pZDsgICAvLy88IG1lc3NhZ2UgaWQgb2J0YWluZWQgYnkgXHJlZiBvc01lc3NhZ2VDcmVhdGUKICAgfSBkZWY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IGV2ZW50IGRlZmluaXRpb24KIH0gb3NFdmVudDsKLQotCisgCisgCiAvLyAgPT09PSBLZXJuZWwgTWFuYWdlbWVudCBGdW5jdGlvbnMgPT09PQotCisgCiAvLy8gSW5pdGlhbGl6ZSB0aGUgUlRPUyBLZXJuZWwgZm9yIGNyZWF0aW5nIG9iamVjdHMuCiAvLy8gXHJldHVybiBzdGF0dXMgY29kZSB0aGF0IGluZGljYXRlcyB0aGUgZXhlY3V0aW9uIHN0YXR1cyBvZiB0aGUgZnVuY3Rpb24uCiAjaWYgKG9zQ01TSVMgPCAweDIwMDAwVSkKIG9zU3RhdHVzIG9zS2VybmVsSW5pdGlhbGl6ZSAodm9pZCk7CiAjZW5kaWYKLQorIAogLy8vIFN0YXJ0IHRoZSBSVE9TIEtlcm5lbCBzY2hlZHVsZXIuCiAvLy8gXHJldHVybiBzdGF0dXMgY29kZSB0aGF0IGluZGljYXRlcyB0aGUgZXhlY3V0aW9uIHN0YXR1cyBvZiB0aGUgZnVuY3Rpb24uCiAjaWYgKG9zQ01TSVMgPCAweDIwMDAwVSkKIG9zU3RhdHVzIG9zS2VybmVsU3RhcnQgKHZvaWQpOwogI2VuZGlmCi0KKyAKIC8vLyBDaGVjayBpZiB0aGUgUlRPUyBrZXJuZWwgaXMgYWxyZWFkeSBzdGFydGVkLgogLy8vIFxyZXR1cm4gMCBSVE9TIGlzIG5vdCBzdGFydGVkLCAxIFJUT1MgaXMgc3RhcnRlZC4KICNpZiAob3NDTVNJUyA8IDB4MjAwMDBVKQogaW50MzJfdCBvc0tlcm5lbFJ1bm5pbmcodm9pZCk7CiAjZW5kaWYKLQorIAogI2lmIChkZWZpbmVkKG9zRmVhdHVyZV9TeXNUaWNrKSAmJiAob3NGZWF0dXJlX1N5c1RpY2sgIT0gMCkpICAvLyBTeXN0ZW0gVGltZXIgYXZhaWxhYmxlCi0KKyAKIC8vLyBHZXQgdGhlIFJUT1Mga2VybmVsIHN5c3RlbSB0aW1lciBjb3VudGVyLgotLy8vIFxyZXR1cm4gUlRPUyBrZXJuZWwgc3lzdGVtIHRpbWVyIGFzIDMyLWJpdCB2YWx1ZQorLy8vIFxyZXR1cm4gUlRPUyBrZXJuZWwgc3lzdGVtIHRpbWVyIGFzIDMyLWJpdCB2YWx1ZSAKICNpZiAob3NDTVNJUyA8IDB4MjAwMDBVKQogdWludDMyX3Qgb3NLZXJuZWxTeXNUaWNrICh2b2lkKTsKICNlbHNlCiAjZGVmaW5lICBvc0tlcm5lbFN5c1RpY2sgb3NLZXJuZWxHZXRTeXNUaW1lckNvdW50CiAjZW5kaWYKLQorIAogLy8vIFRoZSBSVE9TIGtlcm5lbCBzeXN0ZW0gdGltZXIgZnJlcXVlbmN5IGluIEh6LgogLy8vIFxub3RlIFJlZmxlY3RzIHRoZSBzeXN0ZW0gdGltZXIgc2V0dGluZyBhbmQgaXMgdHlwaWNhbGx5IGRlZmluZWQgaW4gYSBjb25maWd1cmF0aW9uIGZpbGUuCiAjaWYgKG9zQ01TSVMgPCAweDIwMDAwVSkKICNkZWZpbmUgb3NLZXJuZWxTeXNUaWNrRnJlcXVlbmN5IDEwMDAwMDAwMAogI2VuZGlmCi0KKyAKIC8vLyBDb252ZXJ0IGEgbWljcm9zZWNvbmRzIHZhbHVlIHRvIGEgUlRPUyBrZXJuZWwgc3lzdGVtIHRpbWVyIHZhbHVlLgogLy8vIFxwYXJhbSAgICAgICAgIG1pY3Jvc2VjICAgICB0aW1lIHZhbHVlIGluIG1pY3Jvc2Vjb25kcy4KIC8vLyBccmV0dXJuIHRpbWUgdmFsdWUgbm9ybWFsaXplZCB0byB0aGUgXHJlZiBvc0tlcm5lbFN5c1RpY2tGcmVxdWVuY3kKQEAgLTQxMywyMyArNDIxLDIzIEBACiAjZWxzZQogI2RlZmluZSBvc0tlcm5lbFN5c1RpY2tNaWNyb1NlYyhtaWNyb3NlYykgKCgodWludDY0X3QpbWljcm9zZWMgKiAgb3NLZXJuZWxHZXRTeXNUaW1lckZyZXEoKSkgLyAxMDAwMDAwKQogI2VuZGlmCi0KKyAKICNlbmRpZiAgLy8gU3lzdGVtIFRpbWVyIGF2YWlsYWJsZQotCi0KKyAKKyAKIC8vICA9PT09IFRocmVhZCBNYW5hZ2VtZW50IEZ1bmN0aW9ucyA9PT09Ci0KKyAKIC8vLyBDcmVhdGUgYSBUaHJlYWQgRGVmaW5pdGlvbiB3aXRoIGZ1bmN0aW9uLCBwcmlvcml0eSwgYW5kIHN0YWNrIHJlcXVpcmVtZW50cy4KIC8vLyBccGFyYW0gICAgICAgICBuYW1lICAgICAgICAgIG5hbWUgb2YgdGhlIHRocmVhZCBmdW5jdGlvbi4KIC8vLyBccGFyYW0gICAgICAgICBwcmlvcml0eSAgICAgIGluaXRpYWwgcHJpb3JpdHkgb2YgdGhlIHRocmVhZCBmdW5jdGlvbi4KLS8vLyBccGFyYW0gICAgICAgICBpbnN0YW5jZXMgICAgIG51bWJlciBvZiBwb3NzaWJsZSB0aHJlYWQgaW5zdGFuY2VzICh1c2VkIHRvIHN0YXRpY2FsbHkgYWxsb2NhdGUgbWVtb3J5KS4KKy8vLyBccGFyYW0gICAgICAgICBpbnN0YW5jZXMgICAgIG51bWJlciBvZiBwb3NzaWJsZSB0aHJlYWQgaW5zdGFuY2VzLgogLy8vIFxwYXJhbSAgICAgICAgIHN0YWNrc3ogICAgICAgc3RhY2sgc2l6ZSAoaW4gYnl0ZXMpIHJlcXVpcmVtZW50cyBmb3IgdGhlIHRocmVhZCBmdW5jdGlvbi4KICNpZiBkZWZpbmVkIChvc09iamVjdHNFeHRlcm5hbCkgIC8vIG9iamVjdCBpcyBleHRlcm5hbAogI2RlZmluZSBvc1RocmVhZERlZihuYW1lLCBwcmlvcml0eSwgaW5zdGFuY2VzLCBzdGFja3N6KSBcCiBleHRlcm4gY29uc3Qgb3NUaHJlYWREZWZfdCBvc190aHJlYWRfZGVmXyMjbmFtZQogI2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVmaW5lIHRoZSBvYmplY3QKICNkZWZpbmUgb3NUaHJlYWREZWYobmFtZSwgcHJpb3JpdHksIGluc3RhbmNlcywgc3RhY2tzeikgXAotc3RhdGljIHVpbnQzMl90IG9zX3RocmVhZF9zdGFjayMjbmFtZVsoc3RhY2tzeik/KCgoc3RhY2tzeiszKS80KSk6MV07IFwKK3N0YXRpYyB1aW50NjRfdCBvc190aHJlYWRfc3RhY2sjI25hbWVbKHN0YWNrc3opPygoKHN0YWNrc3orNykvOCkpOjFdOyBcCiBzdGF0aWMgU3RhdGljVGFza190IG9zX3RocmVhZF9jYl8jI25hbWU7IFwKIGNvbnN0IG9zVGhyZWFkRGVmX3Qgb3NfdGhyZWFkX2RlZl8jI25hbWUgPSBcCiB7IChuYW1lKSwgXApAQCAtNDM3LDI3ICs0NDUsMjcgQEAKICAgICAoaW5zdGFuY2VzID09IDEpID8gKCZvc190aHJlYWRfY2JfIyNuYW1lKSA6IE5VTEwsXAogICAgIChpbnN0YW5jZXMgPT0gMSkgPyBzaXplb2YoU3RhdGljVGFza190KSA6IDBVLCBcCiAgICAgKChzdGFja3N6KSAmJiAoaW5zdGFuY2VzID09IDEpKSA/ICgmb3NfdGhyZWFkX3N0YWNrIyNuYW1lKSA6IE5VTEwsIFwKLSAgICA0Kigoc3RhY2tzeiszKS80KSwgXAorICAgIDgqKChzdGFja3N6KzcpLzgpLCBcCiAgICAgKHByaW9yaXR5KSwgMFUsIDBVIH0gfQogI2VuZGlmCi0KKyAKIC8vLyBBY2Nlc3MgYSBUaHJlYWQgZGVmaW5pdGlvbi4KIC8vLyBccGFyYW0gICAgICAgICBuYW1lICAgICAgICAgIG5hbWUgb2YgdGhlIHRocmVhZCBkZWZpbml0aW9uIG9iamVjdC4KICNkZWZpbmUgb3NUaHJlYWQobmFtZSkgXAogJm9zX3RocmVhZF9kZWZfIyNuYW1lCi0KKyAKIC8vLyBDcmVhdGUgYSB0aHJlYWQgYW5kIGFkZCBpdCB0byBBY3RpdmUgVGhyZWFkcyBhbmQgc2V0IGl0IHRvIHN0YXRlIFJFQURZLgogLy8vIFxwYXJhbVtpbl0gICAgIHRocmVhZF9kZWYgICAgdGhyZWFkIGRlZmluaXRpb24gcmVmZXJlbmNlZCB3aXRoIFxyZWYgb3NUaHJlYWQuCiAvLy8gXHBhcmFtW2luXSAgICAgYXJndW1lbnQgICAgICBwb2ludGVyIHRoYXQgaXMgcGFzc2VkIHRvIHRoZSB0aHJlYWQgZnVuY3Rpb24gYXMgc3RhcnQgYXJndW1lbnQuCiAvLy8gXHJldHVybiB0aHJlYWQgSUQgZm9yIHJlZmVyZW5jZSBieSBvdGhlciBmdW5jdGlvbnMgb3IgTlVMTCBpbiBjYXNlIG9mIGVycm9yLgogb3NUaHJlYWRJZCBvc1RocmVhZENyZWF0ZSAoY29uc3Qgb3NUaHJlYWREZWZfdCAqdGhyZWFkX2RlZiwgdm9pZCAqYXJndW1lbnQpOwotCisgCiAvLy8gUmV0dXJuIHRoZSB0aHJlYWQgSUQgb2YgdGhlIGN1cnJlbnQgcnVubmluZyB0aHJlYWQuCiAvLy8gXHJldHVybiB0aHJlYWQgSUQgZm9yIHJlZmVyZW5jZSBieSBvdGhlciBmdW5jdGlvbnMgb3IgTlVMTCBpbiBjYXNlIG9mIGVycm9yLgogI2lmIChvc0NNU0lTIDwgMHgyMDAwMFUpCiBvc1RocmVhZElkIG9zVGhyZWFkR2V0SWQgKHZvaWQpOwogI2VuZGlmCi0KKyAKIC8vLyBDaGFuZ2UgcHJpb3JpdHkgb2YgYSB0aHJlYWQuCiAvLy8gXHBhcmFtW2luXSAgICAgdGhyZWFkX2lkICAgICB0aHJlYWQgSUQgb2J0YWluZWQgYnkgXHJlZiBvc1RocmVhZENyZWF0ZSBvciBccmVmIG9zVGhyZWFkR2V0SWQuCiAvLy8gXHBhcmFtW2luXSAgICAgcHJpb3JpdHkgICAgICBuZXcgcHJpb3JpdHkgdmFsdWUgZm9yIHRoZSB0aHJlYWQgZnVuY3Rpb24uCkBAIC00NjUsNzAgKzQ3Myw3MCBAQAogI2lmIChvc0NNU0lTIDwgMHgyMDAwMFUpCiBvc1N0YXR1cyBvc1RocmVhZFNldFByaW9yaXR5IChvc1RocmVhZElkIHRocmVhZF9pZCwgb3NQcmlvcml0eSBwcmlvcml0eSk7CiAjZW5kaWYKLQorIAogLy8vIEdldCBjdXJyZW50IHByaW9yaXR5IG9mIGEgdGhyZWFkLgogLy8vIFxwYXJhbVtpbl0gICAgIHRocmVhZF9pZCAgICAgdGhyZWFkIElEIG9idGFpbmVkIGJ5IFxyZWYgb3NUaHJlYWRDcmVhdGUgb3IgXHJlZiBvc1RocmVhZEdldElkLgogLy8vIFxyZXR1cm4gY3VycmVudCBwcmlvcml0eSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHRocmVhZC4KICNpZiAob3NDTVNJUyA8IDB4MjAwMDBVKQogb3NQcmlvcml0eSBvc1RocmVhZEdldFByaW9yaXR5IChvc1RocmVhZElkIHRocmVhZF9pZCk7CiAjZW5kaWYKLQorIAogLy8vIFBhc3MgY29udHJvbCB0byBuZXh0IHRocmVhZCB0aGF0IGlzIGluIHN0YXRlIFxiIFJFQURZLgogLy8vIFxyZXR1cm4gc3RhdHVzIGNvZGUgdGhhdCBpbmRpY2F0ZXMgdGhlIGV4ZWN1dGlvbiBzdGF0dXMgb2YgdGhlIGZ1bmN0aW9uLgogI2lmIChvc0NNU0lTIDwgMHgyMDAwMFUpCiBvc1N0YXR1cyBvc1RocmVhZFlpZWxkICh2b2lkKTsKICNlbmRpZgotCisgCiAvLy8gVGVybWluYXRlIGV4ZWN1dGlvbiBvZiBhIHRocmVhZC4KIC8vLyBccGFyYW1baW5dICAgICB0aHJlYWRfaWQgICAgIHRocmVhZCBJRCBvYnRhaW5lZCBieSBccmVmIG9zVGhyZWFkQ3JlYXRlIG9yIFxyZWYgb3NUaHJlYWRHZXRJZC4KIC8vLyBccmV0dXJuIHN0YXR1cyBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBleGVjdXRpb24gc3RhdHVzIG9mIHRoZSBmdW5jdGlvbi4KICNpZiAob3NDTVNJUyA8IDB4MjAwMDBVKQogb3NTdGF0dXMgb3NUaHJlYWRUZXJtaW5hdGUgKG9zVGhyZWFkSWQgdGhyZWFkX2lkKTsKICNlbmRpZgotCi0KKyAKKyAKIC8vICA9PT09IFNpZ25hbCBNYW5hZ2VtZW50ID09PT0KLQorIAogLy8vIFNldCB0aGUgc3BlY2lmaWVkIFNpZ25hbCBGbGFncyBvZiBhbiBhY3RpdmUgdGhyZWFkLgogLy8vIFxwYXJhbVtpbl0gICAgIHRocmVhZF9pZCAgICAgdGhyZWFkIElEIG9idGFpbmVkIGJ5IFxyZWYgb3NUaHJlYWRDcmVhdGUgb3IgXHJlZiBvc1RocmVhZEdldElkLgogLy8vIFxwYXJhbVtpbl0gICAgIHNpZ25hbHMgICAgICAgc3BlY2lmaWVzIHRoZSBzaWduYWwgZmxhZ3Mgb2YgdGhlIHRocmVhZCB0aGF0IHNob3VsZCBiZSBzZXQuCiAvLy8gXHJldHVybiBwcmV2aW91cyBzaWduYWwgZmxhZ3Mgb2YgdGhlIHNwZWNpZmllZCB0aHJlYWQgb3IgMHg4MDAwMDAwMCBpbiBjYXNlIG9mIGluY29ycmVjdCBwYXJhbWV0ZXJzLgogaW50MzJfdCBvc1NpZ25hbFNldCAob3NUaHJlYWRJZCB0aHJlYWRfaWQsIGludDMyX3Qgc2lnbmFscyk7Ci0KKyAKIC8vLyBDbGVhciB0aGUgc3BlY2lmaWVkIFNpZ25hbCBGbGFncyBvZiBhbiBhY3RpdmUgdGhyZWFkLgogLy8vIFxwYXJhbVtpbl0gICAgIHRocmVhZF9pZCAgICAgdGhyZWFkIElEIG9idGFpbmVkIGJ5IFxyZWYgb3NUaHJlYWRDcmVhdGUgb3IgXHJlZiBvc1RocmVhZEdldElkLgogLy8vIFxwYXJhbVtpbl0gICAgIHNpZ25hbHMgICAgICAgc3BlY2lmaWVzIHRoZSBzaWduYWwgZmxhZ3Mgb2YgdGhlIHRocmVhZCB0aGF0IHNoYWxsIGJlIGNsZWFyZWQuCiAvLy8gXHJldHVybiBwcmV2aW91cyBzaWduYWwgZmxhZ3Mgb2YgdGhlIHNwZWNpZmllZCB0aHJlYWQgb3IgMHg4MDAwMDAwMCBpbiBjYXNlIG9mIGluY29ycmVjdCBwYXJhbWV0ZXJzIG9yIGNhbGwgZnJvbSBJU1IuCiBpbnQzMl90IG9zU2lnbmFsQ2xlYXIgKG9zVGhyZWFkSWQgdGhyZWFkX2lkLCBpbnQzMl90IHNpZ25hbHMpOwotCisgCiAvLy8gV2FpdCBmb3Igb25lIG9yIG1vcmUgU2lnbmFsIEZsYWdzIHRvIGJlY29tZSBzaWduYWxlZCBmb3IgdGhlIGN1cnJlbnQgXGIgUlVOTklORyB0aHJlYWQuCiAvLy8gXHBhcmFtW2luXSAgICAgc2lnbmFscyAgICAgICB3YWl0IHVudGlsIGFsbCBzcGVjaWZpZWQgc2lnbmFsIGZsYWdzIHNldCBvciAwIGZvciBhbnkgc2luZ2xlIHNpZ25hbCBmbGFnLgogLy8vIFxwYXJhbVtpbl0gICAgIG1pbGxpc2VjICAgICAgXHJlZiBDTVNJU19SVE9TX1RpbWVPdXRWYWx1ZSBvciAwIGluIGNhc2Ugb2Ygbm8gdGltZS1vdXQuCiAvLy8gXHJldHVybiBldmVudCBmbGFnIGluZm9ybWF0aW9uIG9yIGVycm9yIGNvZGUuCiBvc19JblJlZ3Mgb3NFdmVudCBvc1NpZ25hbFdhaXQgKGludDMyX3Qgc2lnbmFscywgdWludDMyX3QgbWlsbGlzZWMpOwotCi0KKyAKKyAKIC8vICA9PT09IEdlbmVyaWMgV2FpdCBGdW5jdGlvbnMgPT09PQotCisgCiAvLy8gV2FpdCBmb3IgVGltZW91dCAoVGltZSBEZWxheSkuCiAvLy8gXHBhcmFtW2luXSAgICAgbWlsbGlzZWMgICAgICBccmVmIENNU0lTX1JUT1NfVGltZU91dFZhbHVlICJ0aW1lIGRlbGF5IiB2YWx1ZQogLy8vIFxyZXR1cm4gc3RhdHVzIGNvZGUgdGhhdCBpbmRpY2F0ZXMgdGhlIGV4ZWN1dGlvbiBzdGF0dXMgb2YgdGhlIGZ1bmN0aW9uLgogI2lmIChvc0NNU0lTIDwgMHgyMDAwMFUpCiBvc1N0YXR1cyBvc0RlbGF5ICh1aW50MzJfdCBtaWxsaXNlYyk7CiAjZW5kaWYKLQorIAogI2lmIChkZWZpbmVkIChvc0ZlYXR1cmVfV2FpdCkgJiYgKG9zRmVhdHVyZV9XYWl0ICE9IDApKSAgLy8gR2VuZXJpYyBXYWl0IGF2YWlsYWJsZQotCisgCiAvLy8gV2FpdCBmb3IgU2lnbmFsLCBNZXNzYWdlLCBNYWlsLCBvciBUaW1lb3V0LgogLy8vIFxwYXJhbVtpbl0gbWlsbGlzZWMgICAgICAgICAgXHJlZiBDTVNJU19SVE9TX1RpbWVPdXRWYWx1ZSBvciAwIGluIGNhc2Ugb2Ygbm8gdGltZS1vdXQKIC8vLyBccmV0dXJuIGV2ZW50IHRoYXQgY29udGFpbnMgc2lnbmFsLCBtZXNzYWdlLCBvciBtYWlsIGluZm9ybWF0aW9uIG9yIGVycm9yIGNvZGUuCiBvc19JblJlZ3Mgb3NFdmVudCBvc1dhaXQgKHVpbnQzMl90IG1pbGxpc2VjKTsKLQorIAogI2VuZGlmICAvLyBHZW5lcmljIFdhaXQgYXZhaWxhYmxlCi0KLQorIAorIAogLy8gID09PT0gVGltZXIgTWFuYWdlbWVudCBGdW5jdGlvbnMgPT09PQotCisgCiAvLy8gRGVmaW5lIGEgVGltZXIgb2JqZWN0LgogLy8vIFxwYXJhbSAgICAgICAgIG5hbWUgICAgICAgICAgbmFtZSBvZiB0aGUgdGltZXIgb2JqZWN0LgogLy8vIFxwYXJhbSAgICAgICAgIGZ1bmN0aW9uICAgICAgbmFtZSBvZiB0aGUgdGltZXIgY2FsbCBiYWNrIGZ1bmN0aW9uLgpAQCAtNTQxLDE5ICs1NDksMTkgQEAKIGNvbnN0IG9zVGltZXJEZWZfdCBvc190aW1lcl9kZWZfIyNuYW1lID0gXAogeyAoZnVuY3Rpb24pLCB7IE5VTEwsIDBVLCAoJm9zX3RpbWVyX2NiXyMjbmFtZSksIHNpemVvZihTdGF0aWNUaW1lcl90KSB9IH0KICNlbmRpZgotCisgCiAvLy8gQWNjZXNzIGEgVGltZXIgZGVmaW5pdGlvbi4KIC8vLyBccGFyYW0gICAgICAgICBuYW1lICAgICAgICAgIG5hbWUgb2YgdGhlIHRpbWVyIG9iamVjdC4KICNkZWZpbmUgb3NUaW1lcihuYW1lKSBcCiAmb3NfdGltZXJfZGVmXyMjbmFtZQotCisgCiAvLy8gQ3JlYXRlIGFuZCBJbml0aWFsaXplIGEgdGltZXIuCiAvLy8gXHBhcmFtW2luXSAgICAgdGltZXJfZGVmICAgICB0aW1lciBvYmplY3QgcmVmZXJlbmNlZCB3aXRoIFxyZWYgb3NUaW1lci4KIC8vLyBccGFyYW1baW5dICAgICB0eXBlICAgICAgICAgIG9zVGltZXJPbmNlIGZvciBvbmUtc2hvdCBvciBvc1RpbWVyUGVyaW9kaWMgZm9yIHBlcmlvZGljIGJlaGF2aW9yLgogLy8vIFxwYXJhbVtpbl0gICAgIGFyZ3VtZW50ICAgICAgYXJndW1lbnQgdG8gdGhlIHRpbWVyIGNhbGwgYmFjayBmdW5jdGlvbi4KIC8vLyBccmV0dXJuIHRpbWVyIElEIGZvciByZWZlcmVuY2UgYnkgb3RoZXIgZnVuY3Rpb25zIG9yIE5VTEwgaW4gY2FzZSBvZiBlcnJvci4KIG9zVGltZXJJZCBvc1RpbWVyQ3JlYXRlIChjb25zdCBvc1RpbWVyRGVmX3QgKnRpbWVyX2RlZiwgb3NfdGltZXJfdHlwZSB0eXBlLCB2b2lkICphcmd1bWVudCk7Ci0KKyAKIC8vLyBTdGFydCBvciByZXN0YXJ0IGEgdGltZXIuCiAvLy8gXHBhcmFtW2luXSAgICAgdGltZXJfaWQgICAgICB0aW1lciBJRCBvYnRhaW5lZCBieSBccmVmIG9zVGltZXJDcmVhdGUuCiAvLy8gXHBhcmFtW2luXSAgICAgbWlsbGlzZWMgICAgICBccmVmIENNU0lTX1JUT1NfVGltZU91dFZhbHVlICJ0aW1lIGRlbGF5IiB2YWx1ZSBvZiB0aGUgdGltZXIuCkBAIC01NjEsMjQgKzU2OSwyNCBAQAogI2lmIChvc0NNU0lTIDwgMHgyMDAwMFUpCiBvc1N0YXR1cyBvc1RpbWVyU3RhcnQgKG9zVGltZXJJZCB0aW1lcl9pZCwgdWludDMyX3QgbWlsbGlzZWMpOwogI2VuZGlmCi0KKyAKIC8vLyBTdG9wIGEgdGltZXIuCiAvLy8gXHBhcmFtW2luXSAgICAgdGltZXJfaWQgICAgICB0aW1lciBJRCBvYnRhaW5lZCBieSBccmVmIG9zVGltZXJDcmVhdGUuCiAvLy8gXHJldHVybiBzdGF0dXMgY29kZSB0aGF0IGluZGljYXRlcyB0aGUgZXhlY3V0aW9uIHN0YXR1cyBvZiB0aGUgZnVuY3Rpb24uCiAjaWYgKG9zQ01TSVMgPCAweDIwMDAwVSkKIG9zU3RhdHVzIG9zVGltZXJTdG9wIChvc1RpbWVySWQgdGltZXJfaWQpOwogI2VuZGlmCi0KKyAKIC8vLyBEZWxldGUgYSB0aW1lci4KIC8vLyBccGFyYW1baW5dICAgICB0aW1lcl9pZCAgICAgIHRpbWVyIElEIG9idGFpbmVkIGJ5IFxyZWYgb3NUaW1lckNyZWF0ZS4KIC8vLyBccmV0dXJuIHN0YXR1cyBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBleGVjdXRpb24gc3RhdHVzIG9mIHRoZSBmdW5jdGlvbi4KICNpZiAob3NDTVNJUyA8IDB4MjAwMDBVKQogb3NTdGF0dXMgb3NUaW1lckRlbGV0ZSAob3NUaW1lcklkIHRpbWVyX2lkKTsKICNlbmRpZgotCi0KKyAKKyAKIC8vICA9PT09IE11dGV4IE1hbmFnZW1lbnQgRnVuY3Rpb25zID09PT0KLQorIAogLy8vIERlZmluZSBhIE11dGV4LgogLy8vIFxwYXJhbSAgICAgICAgIG5hbWUgICAgICAgICAgbmFtZSBvZiB0aGUgbXV0ZXggb2JqZWN0LgogI2lmIGRlZmluZWQgKG9zT2JqZWN0c0V4dGVybmFsKSAgLy8gb2JqZWN0IGlzIGV4dGVybmFsCkBAIC01OTAsMTcgKzU5OCwxNyBAQAogY29uc3Qgb3NNdXRleERlZl90IG9zX211dGV4X2RlZl8jI25hbWUgPSBcCiB7IE5VTEwsIG9zTXV0ZXhSZWN1cnNpdmUgfCBvc011dGV4UHJpb0luaGVyaXQsICgmb3NfbXV0ZXhfY2JfIyNuYW1lKSwgc2l6ZW9mKFN0YXRpY1NlbWFwaG9yZV90KSB9CiAjZW5kaWYKLQorIAogLy8vIEFjY2VzcyBhIE11dGV4IGRlZmluaXRpb24uCiAvLy8gXHBhcmFtICAgICAgICAgbmFtZSAgICAgICAgICBuYW1lIG9mIHRoZSBtdXRleCBvYmplY3QuCiAjZGVmaW5lIG9zTXV0ZXgobmFtZSkgXAogJm9zX211dGV4X2RlZl8jI25hbWUKLQorIAogLy8vIENyZWF0ZSBhbmQgSW5pdGlhbGl6ZSBhIE11dGV4IG9iamVjdC4KIC8vLyBccGFyYW1baW5dICAgICBtdXRleF9kZWYgICAgIG11dGV4IGRlZmluaXRpb24gcmVmZXJlbmNlZCB3aXRoIFxyZWYgb3NNdXRleC4KIC8vLyBccmV0dXJuIG11dGV4IElEIGZvciByZWZlcmVuY2UgYnkgb3RoZXIgZnVuY3Rpb25zIG9yIE5VTEwgaW4gY2FzZSBvZiBlcnJvci4KIG9zTXV0ZXhJZCBvc011dGV4Q3JlYXRlIChjb25zdCBvc011dGV4RGVmX3QgKm11dGV4X2RlZik7Ci0KKyAKIC8vLyBXYWl0IHVudGlsIGEgTXV0ZXggYmVjb21lcyBhdmFpbGFibGUuCiAvLy8gXHBhcmFtW2luXSAgICAgbXV0ZXhfaWQgICAgICBtdXRleCBJRCBvYnRhaW5lZCBieSBccmVmIG9zTXV0ZXhDcmVhdGUuCiAvLy8gXHBhcmFtW2luXSAgICAgbWlsbGlzZWMgICAgICBccmVmIENNU0lTX1JUT1NfVGltZU91dFZhbHVlIG9yIDAgaW4gY2FzZSBvZiBubyB0aW1lLW91dC4KQEAgLTYxMCwyNiArNjE4LDI2IEBACiAjZWxzZQogI2RlZmluZSAgb3NNdXRleFdhaXQgb3NNdXRleEFjcXVpcmUKICNlbmRpZgotCisgCiAvLy8gUmVsZWFzZSBhIE11dGV4IHRoYXQgd2FzIG9idGFpbmVkIGJ5IFxyZWYgb3NNdXRleFdhaXQuCiAvLy8gXHBhcmFtW2luXSAgICAgbXV0ZXhfaWQgICAgICBtdXRleCBJRCBvYnRhaW5lZCBieSBccmVmIG9zTXV0ZXhDcmVhdGUuCiAvLy8gXHJldHVybiBzdGF0dXMgY29kZSB0aGF0IGluZGljYXRlcyB0aGUgZXhlY3V0aW9uIHN0YXR1cyBvZiB0aGUgZnVuY3Rpb24uCiAjaWYgKG9zQ01TSVMgPCAweDIwMDAwVSkKIG9zU3RhdHVzIG9zTXV0ZXhSZWxlYXNlIChvc011dGV4SWQgbXV0ZXhfaWQpOwogI2VuZGlmCi0KKyAKIC8vLyBEZWxldGUgYSBNdXRleCBvYmplY3QuCiAvLy8gXHBhcmFtW2luXSAgICAgbXV0ZXhfaWQgICAgICBtdXRleCBJRCBvYnRhaW5lZCBieSBccmVmIG9zTXV0ZXhDcmVhdGUuCiAvLy8gXHJldHVybiBzdGF0dXMgY29kZSB0aGF0IGluZGljYXRlcyB0aGUgZXhlY3V0aW9uIHN0YXR1cyBvZiB0aGUgZnVuY3Rpb24uCiAjaWYgKG9zQ01TSVMgPCAweDIwMDAwVSkKIG9zU3RhdHVzIG9zTXV0ZXhEZWxldGUgKG9zTXV0ZXhJZCBtdXRleF9pZCk7CiAjZW5kaWYKLQotCisgCisgCiAvLyAgPT09PSBTZW1hcGhvcmUgTWFuYWdlbWVudCBGdW5jdGlvbnMgPT09PQotCisgCiAjaWYgKGRlZmluZWQgKG9zRmVhdHVyZV9TZW1hcGhvcmUpICYmIChvc0ZlYXR1cmVfU2VtYXBob3JlICE9IDBVKSkgIC8vIFNlbWFwaG9yZSBhdmFpbGFibGUKLQorIAogLy8vIERlZmluZSBhIFNlbWFwaG9yZSBvYmplY3QuCiAvLy8gXHBhcmFtICAgICAgICAgbmFtZSAgICAgICAgICBuYW1lIG9mIHRoZSBzZW1hcGhvcmUgb2JqZWN0LgogI2lmIGRlZmluZWQgKG9zT2JqZWN0c0V4dGVybmFsKSAgLy8gb2JqZWN0IGlzIGV4dGVybmFsCkBAIC02NDEsNDUgKzY0OSw0NSBAQAogY29uc3Qgb3NTZW1hcGhvcmVEZWZfdCBvc19zZW1hcGhvcmVfZGVmXyMjbmFtZSA9IFwKIHsgTlVMTCwgMFUsICgmb3Nfc2VtYXBob3JlX2NiXyMjbmFtZSksIHNpemVvZihTdGF0aWNTZW1hcGhvcmVfdCkgfQogI2VuZGlmCi0KKyAKIC8vLyBBY2Nlc3MgYSBTZW1hcGhvcmUgZGVmaW5pdGlvbi4KIC8vLyBccGFyYW0gICAgICAgICBuYW1lICAgICAgICAgIG5hbWUgb2YgdGhlIHNlbWFwaG9yZSBvYmplY3QuCiAjZGVmaW5lIG9zU2VtYXBob3JlKG5hbWUpIFwKICZvc19zZW1hcGhvcmVfZGVmXyMjbmFtZQotCisgCiAvLy8gQ3JlYXRlIGFuZCBJbml0aWFsaXplIGEgU2VtYXBob3JlIG9iamVjdC4KIC8vLyBccGFyYW1baW5dICAgICBzZW1hcGhvcmVfZGVmIHNlbWFwaG9yZSBkZWZpbml0aW9uIHJlZmVyZW5jZWQgd2l0aCBccmVmIG9zU2VtYXBob3JlLgogLy8vIFxwYXJhbVtpbl0gICAgIGNvdW50ICAgICAgICAgbWF4aW11bSBhbmQgaW5pdGlhbCBudW1iZXIgb2YgYXZhaWxhYmxlIHRva2Vucy4KIC8vLyBccmV0dXJuIHNlbWFwaG9yZSBJRCBmb3IgcmVmZXJlbmNlIGJ5IG90aGVyIGZ1bmN0aW9ucyBvciBOVUxMIGluIGNhc2Ugb2YgZXJyb3IuCiBvc1NlbWFwaG9yZUlkIG9zU2VtYXBob3JlQ3JlYXRlIChjb25zdCBvc1NlbWFwaG9yZURlZl90ICpzZW1hcGhvcmVfZGVmLCBpbnQzMl90IGNvdW50KTsKLQorIAogLy8vIFdhaXQgdW50aWwgYSBTZW1hcGhvcmUgdG9rZW4gYmVjb21lcyBhdmFpbGFibGUuCiAvLy8gXHBhcmFtW2luXSAgICAgc2VtYXBob3JlX2lkICBzZW1hcGhvcmUgb2JqZWN0IHJlZmVyZW5jZWQgd2l0aCBccmVmIG9zU2VtYXBob3JlQ3JlYXRlLgogLy8vIFxwYXJhbVtpbl0gICAgIG1pbGxpc2VjICAgICAgXHJlZiBDTVNJU19SVE9TX1RpbWVPdXRWYWx1ZSBvciAwIGluIGNhc2Ugb2Ygbm8gdGltZS1vdXQuCiAvLy8gXHJldHVybiBudW1iZXIgb2YgYXZhaWxhYmxlIHRva2Vucywgb3IgLTEgaW4gY2FzZSBvZiBpbmNvcnJlY3QgcGFyYW1ldGVycy4KIGludDMyX3Qgb3NTZW1hcGhvcmVXYWl0IChvc1NlbWFwaG9yZUlkIHNlbWFwaG9yZV9pZCwgdWludDMyX3QgbWlsbGlzZWMpOwotCisgCiAvLy8gUmVsZWFzZSBhIFNlbWFwaG9yZSB0b2tlbi4KIC8vLyBccGFyYW1baW5dICAgICBzZW1hcGhvcmVfaWQgIHNlbWFwaG9yZSBvYmplY3QgcmVmZXJlbmNlZCB3aXRoIFxyZWYgb3NTZW1hcGhvcmVDcmVhdGUuCiAvLy8gXHJldHVybiBzdGF0dXMgY29kZSB0aGF0IGluZGljYXRlcyB0aGUgZXhlY3V0aW9uIHN0YXR1cyBvZiB0aGUgZnVuY3Rpb24uCiAjaWYgKG9zQ01TSVMgPCAweDIwMDAwVSkKIG9zU3RhdHVzIG9zU2VtYXBob3JlUmVsZWFzZSAob3NTZW1hcGhvcmVJZCBzZW1hcGhvcmVfaWQpOwogI2VuZGlmCi0KKyAKIC8vLyBEZWxldGUgYSBTZW1hcGhvcmUgb2JqZWN0LgogLy8vIFxwYXJhbVtpbl0gICAgIHNlbWFwaG9yZV9pZCAgc2VtYXBob3JlIG9iamVjdCByZWZlcmVuY2VkIHdpdGggXHJlZiBvc1NlbWFwaG9yZUNyZWF0ZS4KIC8vLyBccmV0dXJuIHN0YXR1cyBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBleGVjdXRpb24gc3RhdHVzIG9mIHRoZSBmdW5jdGlvbi4KICNpZiAob3NDTVNJUyA8IDB4MjAwMDBVKQogb3NTdGF0dXMgb3NTZW1hcGhvcmVEZWxldGUgKG9zU2VtYXBob3JlSWQgc2VtYXBob3JlX2lkKTsKICNlbmRpZgotCisgCiAjZW5kaWYgIC8vIFNlbWFwaG9yZSBhdmFpbGFibGUKLQotCisgCisgCiAvLyAgPT09PSBNZW1vcnkgUG9vbCBNYW5hZ2VtZW50IEZ1bmN0aW9ucyA9PT09CiAKICNpZiAoZGVmaW5lZChvc0ZlYXR1cmVfUG9vbCkgJiYgKG9zRmVhdHVyZV9Qb29sICE9IDApKSAgLy8gTWVtb3J5IFBvb2wgYXZhaWxhYmxlCi0KKyAKIC8vLyBcYnJpZWYgRGVmaW5lIGEgTWVtb3J5IFBvb2wuCiAvLy8gXHBhcmFtICAgICAgICAgbmFtZSAgICAgICAgICBuYW1lIG9mIHRoZSBtZW1vcnkgcG9vbC4KIC8vLyBccGFyYW0gICAgICAgICBubyAgICAgICAgICAgIG1heGltdW0gbnVtYmVyIG9mIGJsb2NrcyAob2JqZWN0cykgaW4gdGhlIG1lbW9yeSBwb29sLgpAQCAtNjkwLDQyICs2OTgsNDIgQEAKICNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlZmluZSB0aGUgb2JqZWN0CiAjZGVmaW5lIG9zUG9vbERlZihuYW1lLCBubywgdHlwZSkgXAogY29uc3Qgb3NQb29sRGVmX3Qgb3NfcG9vbF9kZWZfIyNuYW1lID0gXAoteyAobm8pLCBzaXplb2YodHlwZSksIE5VTEwgfQoreyAobm8pLCBzaXplb2YodHlwZSksIHtOVUxMfSB9CiAjZW5kaWYKLQorIAogLy8vIFxicmllZiBBY2Nlc3MgYSBNZW1vcnkgUG9vbCBkZWZpbml0aW9uLgogLy8vIFxwYXJhbSAgICAgICAgIG5hbWUgICAgICAgICAgbmFtZSBvZiB0aGUgbWVtb3J5IHBvb2wKICNkZWZpbmUgb3NQb29sKG5hbWUpIFwKICZvc19wb29sX2RlZl8jI25hbWUKLQorIAogLy8vIENyZWF0ZSBhbmQgSW5pdGlhbGl6ZSBhIE1lbW9yeSBQb29sIG9iamVjdC4KIC8vLyBccGFyYW1baW5dICAgICBwb29sX2RlZiAgICAgIG1lbW9yeSBwb29sIGRlZmluaXRpb24gcmVmZXJlbmNlZCB3aXRoIFxyZWYgb3NQb29sLgogLy8vIFxyZXR1cm4gbWVtb3J5IHBvb2wgSUQgZm9yIHJlZmVyZW5jZSBieSBvdGhlciBmdW5jdGlvbnMgb3IgTlVMTCBpbiBjYXNlIG9mIGVycm9yLgogb3NQb29sSWQgb3NQb29sQ3JlYXRlIChjb25zdCBvc1Bvb2xEZWZfdCAqcG9vbF9kZWYpOwotCisgCiAvLy8gQWxsb2NhdGUgYSBtZW1vcnkgYmxvY2sgZnJvbSBhIE1lbW9yeSBQb29sLgogLy8vIFxwYXJhbVtpbl0gICAgIHBvb2xfaWQgICAgICAgbWVtb3J5IHBvb2wgSUQgb2J0YWluIHJlZmVyZW5jZWQgd2l0aCBccmVmIG9zUG9vbENyZWF0ZS4KIC8vLyBccmV0dXJuIGFkZHJlc3Mgb2YgdGhlIGFsbG9jYXRlZCBtZW1vcnkgYmxvY2sgb3IgTlVMTCBpbiBjYXNlIG9mIG5vIG1lbW9yeSBhdmFpbGFibGUuCiB2b2lkICpvc1Bvb2xBbGxvYyAob3NQb29sSWQgcG9vbF9pZCk7Ci0KKyAKIC8vLyBBbGxvY2F0ZSBhIG1lbW9yeSBibG9jayBmcm9tIGEgTWVtb3J5IFBvb2wgYW5kIHNldCBtZW1vcnkgYmxvY2sgdG8gemVyby4KIC8vLyBccGFyYW1baW5dICAgICBwb29sX2lkICAgICAgIG1lbW9yeSBwb29sIElEIG9idGFpbiByZWZlcmVuY2VkIHdpdGggXHJlZiBvc1Bvb2xDcmVhdGUuCiAvLy8gXHJldHVybiBhZGRyZXNzIG9mIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IGJsb2NrIG9yIE5VTEwgaW4gY2FzZSBvZiBubyBtZW1vcnkgYXZhaWxhYmxlLgogdm9pZCAqb3NQb29sQ0FsbG9jIChvc1Bvb2xJZCBwb29sX2lkKTsKLQorIAogLy8vIFJldHVybiBhbiBhbGxvY2F0ZWQgbWVtb3J5IGJsb2NrIGJhY2sgdG8gYSBNZW1vcnkgUG9vbC4KIC8vLyBccGFyYW1baW5dICAgICBwb29sX2lkICAgICAgIG1lbW9yeSBwb29sIElEIG9idGFpbiByZWZlcmVuY2VkIHdpdGggXHJlZiBvc1Bvb2xDcmVhdGUuCiAvLy8gXHBhcmFtW2luXSAgICAgYmxvY2sgICAgICAgICBhZGRyZXNzIG9mIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IGJsb2NrIHRvIGJlIHJldHVybmVkIHRvIHRoZSBtZW1vcnkgcG9vbC4KIC8vLyBccmV0dXJuIHN0YXR1cyBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBleGVjdXRpb24gc3RhdHVzIG9mIHRoZSBmdW5jdGlvbi4KIG9zU3RhdHVzIG9zUG9vbEZyZWUgKG9zUG9vbElkIHBvb2xfaWQsIHZvaWQgKmJsb2NrKTsKLQorIAogI2VuZGlmICAvLyBNZW1vcnkgUG9vbCBhdmFpbGFibGUKLQotCisgCisgCiAvLyAgPT09PSBNZXNzYWdlIFF1ZXVlIE1hbmFnZW1lbnQgRnVuY3Rpb25zID09PT0KLQorIAogI2lmIChkZWZpbmVkKG9zRmVhdHVyZV9NZXNzYWdlUSkgJiYgKG9zRmVhdHVyZV9NZXNzYWdlUSAhPSAwKSkgIC8vIE1lc3NhZ2UgUXVldWUgYXZhaWxhYmxlCi0KKyAgCiAvLy8gXGJyaWVmIENyZWF0ZSBhIE1lc3NhZ2UgUXVldWUgRGVmaW5pdGlvbi4KIC8vLyBccGFyYW0gICAgICAgICBuYW1lICAgICAgICAgIG5hbWUgb2YgdGhlIHF1ZXVlLgogLy8vIFxwYXJhbSAgICAgICAgIHF1ZXVlX3N6ICAgICAgbWF4aW11bSBudW1iZXIgb2YgbWVzc2FnZXMgaW4gdGhlIHF1ZXVlLgpAQCAtNzQyLDM4ICs3NTAsMzggQEAKICAgeyBOVUxMLCAwVSwgKCZvc19tcV9jYl8jI25hbWUpLCBzaXplb2YoU3RhdGljUXVldWVfdCksIFwKICAgICAgICAgICAgICAgKCZvc19tcV9kYXRhXyMjbmFtZSksIHNpemVvZihvc19tcV9kYXRhXyMjbmFtZSkgfSB9CiAjZW5kaWYKLQorIAogLy8vIFxicmllZiBBY2Nlc3MgYSBNZXNzYWdlIFF1ZXVlIERlZmluaXRpb24uCiAvLy8gXHBhcmFtICAgICAgICAgbmFtZSAgICAgICAgICBuYW1lIG9mIHRoZSBxdWV1ZQogI2RlZmluZSBvc01lc3NhZ2VRKG5hbWUpIFwKICZvc19tZXNzYWdlUV9kZWZfIyNuYW1lCi0KKyAKIC8vLyBDcmVhdGUgYW5kIEluaXRpYWxpemUgYSBNZXNzYWdlIFF1ZXVlIG9iamVjdC4KIC8vLyBccGFyYW1baW5dICAgICBxdWV1ZV9kZWYgICAgIG1lc3NhZ2UgcXVldWUgZGVmaW5pdGlvbiByZWZlcmVuY2VkIHdpdGggXHJlZiBvc01lc3NhZ2VRLgogLy8vIFxwYXJhbVtpbl0gICAgIHRocmVhZF9pZCAgICAgdGhyZWFkIElEIChvYnRhaW5lZCBieSBccmVmIG9zVGhyZWFkQ3JlYXRlIG9yIFxyZWYgb3NUaHJlYWRHZXRJZCkgb3IgTlVMTC4KIC8vLyBccmV0dXJuIG1lc3NhZ2UgcXVldWUgSUQgZm9yIHJlZmVyZW5jZSBieSBvdGhlciBmdW5jdGlvbnMgb3IgTlVMTCBpbiBjYXNlIG9mIGVycm9yLgogb3NNZXNzYWdlUUlkIG9zTWVzc2FnZUNyZWF0ZSAoY29uc3Qgb3NNZXNzYWdlUURlZl90ICpxdWV1ZV9kZWYsIG9zVGhyZWFkSWQgdGhyZWFkX2lkKTsKLQorIAogLy8vIFB1dCBhIE1lc3NhZ2UgdG8gYSBRdWV1ZS4KIC8vLyBccGFyYW1baW5dICAgICBxdWV1ZV9pZCAgICAgIG1lc3NhZ2UgcXVldWUgSUQgb2J0YWluZWQgd2l0aCBccmVmIG9zTWVzc2FnZUNyZWF0ZS4KIC8vLyBccGFyYW1baW5dICAgICBpbmZvICAgICAgICAgIG1lc3NhZ2UgaW5mb3JtYXRpb24uCiAvLy8gXHBhcmFtW2luXSAgICAgbWlsbGlzZWMgICAgICBccmVmIENNU0lTX1JUT1NfVGltZU91dFZhbHVlIG9yIDAgaW4gY2FzZSBvZiBubyB0aW1lLW91dC4KIC8vLyBccmV0dXJuIHN0YXR1cyBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBleGVjdXRpb24gc3RhdHVzIG9mIHRoZSBmdW5jdGlvbi4KIG9zU3RhdHVzIG9zTWVzc2FnZVB1dCAob3NNZXNzYWdlUUlkIHF1ZXVlX2lkLCB1aW50MzJfdCBpbmZvLCB1aW50MzJfdCBtaWxsaXNlYyk7Ci0KKyAKIC8vLyBHZXQgYSBNZXNzYWdlIGZyb20gYSBRdWV1ZSBvciB0aW1lb3V0IGlmIFF1ZXVlIGlzIGVtcHR5LgogLy8vIFxwYXJhbVtpbl0gICAgIHF1ZXVlX2lkICAgICAgbWVzc2FnZSBxdWV1ZSBJRCBvYnRhaW5lZCB3aXRoIFxyZWYgb3NNZXNzYWdlQ3JlYXRlLgogLy8vIFxwYXJhbVtpbl0gICAgIG1pbGxpc2VjICAgICAgXHJlZiBDTVNJU19SVE9TX1RpbWVPdXRWYWx1ZSBvciAwIGluIGNhc2Ugb2Ygbm8gdGltZS1vdXQuCiAvLy8gXHJldHVybiBldmVudCBpbmZvcm1hdGlvbiB0aGF0IGluY2x1ZGVzIHN0YXR1cyBjb2RlLgogb3NfSW5SZWdzIG9zRXZlbnQgb3NNZXNzYWdlR2V0IChvc01lc3NhZ2VRSWQgcXVldWVfaWQsIHVpbnQzMl90IG1pbGxpc2VjKTsKLQorIAogI2VuZGlmICAvLyBNZXNzYWdlIFF1ZXVlIGF2YWlsYWJsZQotCi0KKyAKKyAKIC8vICA9PT09IE1haWwgUXVldWUgTWFuYWdlbWVudCBGdW5jdGlvbnMgPT09PQotCisgCiAjaWYgKGRlZmluZWQob3NGZWF0dXJlX01haWxRKSAmJiAob3NGZWF0dXJlX01haWxRICE9IDApKSAgLy8gTWFpbCBRdWV1ZSBhdmFpbGFibGUKLQorIAogLy8vIFxicmllZiBDcmVhdGUgYSBNYWlsIFF1ZXVlIERlZmluaXRpb24uCiAvLy8gXHBhcmFtICAgICAgICAgbmFtZSAgICAgICAgICBuYW1lIG9mIHRoZSBxdWV1ZS4KIC8vLyBccGFyYW0gICAgICAgICBxdWV1ZV9zeiAgICAgIG1heGltdW0gbnVtYmVyIG9mIG1haWxzIGluIHRoZSBxdWV1ZS4KQEAgLTc4Niw1MiArNzk0LDUzIEBACiBjb25zdCBvc01haWxRRGVmX3Qgb3NfbWFpbFFfZGVmXyMjbmFtZSA9IFwKIHsgKHF1ZXVlX3N6KSwgc2l6ZW9mKHR5cGUpLCBOVUxMIH0KICNlbmRpZgotCisgCiAvLy8gXGJyaWVmIEFjY2VzcyBhIE1haWwgUXVldWUgRGVmaW5pdGlvbi4KIC8vLyBccGFyYW0gICAgICAgICBuYW1lICAgICAgICAgIG5hbWUgb2YgdGhlIHF1ZXVlCiAjZGVmaW5lIG9zTWFpbFEobmFtZSkgXAogJm9zX21haWxRX2RlZl8jI25hbWUKLQorIAogLy8vIENyZWF0ZSBhbmQgSW5pdGlhbGl6ZSBhIE1haWwgUXVldWUgb2JqZWN0LgogLy8vIFxwYXJhbVtpbl0gICAgIHF1ZXVlX2RlZiAgICAgbWFpbCBxdWV1ZSBkZWZpbml0aW9uIHJlZmVyZW5jZWQgd2l0aCBccmVmIG9zTWFpbFEuCiAvLy8gXHBhcmFtW2luXSAgICAgdGhyZWFkX2lkICAgICB0aHJlYWQgSUQgKG9idGFpbmVkIGJ5IFxyZWYgb3NUaHJlYWRDcmVhdGUgb3IgXHJlZiBvc1RocmVhZEdldElkKSBvciBOVUxMLgogLy8vIFxyZXR1cm4gbWFpbCBxdWV1ZSBJRCBmb3IgcmVmZXJlbmNlIGJ5IG90aGVyIGZ1bmN0aW9ucyBvciBOVUxMIGluIGNhc2Ugb2YgZXJyb3IuCiBvc01haWxRSWQgb3NNYWlsQ3JlYXRlIChjb25zdCBvc01haWxRRGVmX3QgKnF1ZXVlX2RlZiwgb3NUaHJlYWRJZCB0aHJlYWRfaWQpOwotCisgCiAvLy8gQWxsb2NhdGUgYSBtZW1vcnkgYmxvY2sgZm9yIG1haWwgZnJvbSBhIG1haWwgbWVtb3J5IHBvb2wuCiAvLy8gXHBhcmFtW2luXSAgICAgcXVldWVfaWQgICAgICBtYWlsIHF1ZXVlIElEIG9idGFpbmVkIHdpdGggXHJlZiBvc01haWxDcmVhdGUuCiAvLy8gXHBhcmFtW2luXSAgICAgbWlsbGlzZWMgICAgICBccmVmIENNU0lTX1JUT1NfVGltZU91dFZhbHVlIG9yIDAgaW4gY2FzZSBvZiBubyB0aW1lLW91dAogLy8vIFxyZXR1cm4gcG9pbnRlciB0byBtZW1vcnkgYmxvY2sgdGhhdCBjYW4gYmUgZmlsbGVkIHdpdGggbWFpbCBvciBOVUxMIGluIGNhc2Ugb2YgZXJyb3IuCiB2b2lkICpvc01haWxBbGxvYyAob3NNYWlsUUlkIHF1ZXVlX2lkLCB1aW50MzJfdCBtaWxsaXNlYyk7Ci0KKyAKIC8vLyBBbGxvY2F0ZSBhIG1lbW9yeSBibG9jayBmb3IgbWFpbCBmcm9tIGEgbWFpbCBtZW1vcnkgcG9vbCBhbmQgc2V0IG1lbW9yeSBibG9jayB0byB6ZXJvLgogLy8vIFxwYXJhbVtpbl0gICAgIHF1ZXVlX2lkICAgICAgbWFpbCBxdWV1ZSBJRCBvYnRhaW5lZCB3aXRoIFxyZWYgb3NNYWlsQ3JlYXRlLgogLy8vIFxwYXJhbVtpbl0gICAgIG1pbGxpc2VjICAgICAgXHJlZiBDTVNJU19SVE9TX1RpbWVPdXRWYWx1ZSBvciAwIGluIGNhc2Ugb2Ygbm8gdGltZS1vdXQKIC8vLyBccmV0dXJuIHBvaW50ZXIgdG8gbWVtb3J5IGJsb2NrIHRoYXQgY2FuIGJlIGZpbGxlZCB3aXRoIG1haWwgb3IgTlVMTCBpbiBjYXNlIG9mIGVycm9yLgogdm9pZCAqb3NNYWlsQ0FsbG9jIChvc01haWxRSWQgcXVldWVfaWQsIHVpbnQzMl90IG1pbGxpc2VjKTsKLQorIAogLy8vIFB1dCBhIE1haWwgaW50byBhIFF1ZXVlLgogLy8vIFxwYXJhbVtpbl0gICAgIHF1ZXVlX2lkICAgICAgbWFpbCBxdWV1ZSBJRCBvYnRhaW5lZCB3aXRoIFxyZWYgb3NNYWlsQ3JlYXRlLgogLy8vIFxwYXJhbVtpbl0gICAgIG1haWwgICAgICAgICAgcG9pbnRlciB0byBtZW1vcnkgd2l0aCBtYWlsIHRvIHB1dCBpbnRvIGEgcXVldWUuCiAvLy8gXHJldHVybiBzdGF0dXMgY29kZSB0aGF0IGluZGljYXRlcyB0aGUgZXhlY3V0aW9uIHN0YXR1cyBvZiB0aGUgZnVuY3Rpb24uCiBvc1N0YXR1cyBvc01haWxQdXQgKG9zTWFpbFFJZCBxdWV1ZV9pZCwgY29uc3Qgdm9pZCAqbWFpbCk7Ci0KKyAKIC8vLyBHZXQgYSBNYWlsIGZyb20gYSBRdWV1ZSBvciB0aW1lb3V0IGlmIFF1ZXVlIGlzIGVtcHR5LgogLy8vIFxwYXJhbVtpbl0gICAgIHF1ZXVlX2lkICAgICAgbWFpbCBxdWV1ZSBJRCBvYnRhaW5lZCB3aXRoIFxyZWYgb3NNYWlsQ3JlYXRlLgogLy8vIFxwYXJhbVtpbl0gICAgIG1pbGxpc2VjICAgICAgXHJlZiBDTVNJU19SVE9TX1RpbWVPdXRWYWx1ZSBvciAwIGluIGNhc2Ugb2Ygbm8gdGltZS1vdXQuCiAvLy8gXHJldHVybiBldmVudCBpbmZvcm1hdGlvbiB0aGF0IGluY2x1ZGVzIHN0YXR1cyBjb2RlLgogb3NfSW5SZWdzIG9zRXZlbnQgb3NNYWlsR2V0IChvc01haWxRSWQgcXVldWVfaWQsIHVpbnQzMl90IG1pbGxpc2VjKTsKLQorIAogLy8vIEZyZWUgYSBtZW1vcnkgYmxvY2sgYnkgcmV0dXJuaW5nIGl0IHRvIGEgbWFpbCBtZW1vcnkgcG9vbC4KIC8vLyBccGFyYW1baW5dICAgICBxdWV1ZV9pZCAgICAgIG1haWwgcXVldWUgSUQgb2J0YWluZWQgd2l0aCBccmVmIG9zTWFpbENyZWF0ZS4KIC8vLyBccGFyYW1baW5dICAgICBtYWlsICAgICAgICAgIHBvaW50ZXIgdG8gbWVtb3J5IGJsb2NrIHRoYXQgd2FzIG9idGFpbmVkIHdpdGggXHJlZiBvc01haWxHZXQuCiAvLy8gXHJldHVybiBzdGF0dXMgY29kZSB0aGF0IGluZGljYXRlcyB0aGUgZXhlY3V0aW9uIHN0YXR1cyBvZiB0aGUgZnVuY3Rpb24uCiBvc1N0YXR1cyBvc01haWxGcmVlIChvc01haWxRSWQgcXVldWVfaWQsIHZvaWQgKm1haWwpOwotCisgCiAjZW5kaWYgIC8vIE1haWwgUXVldWUgYXZhaWxhYmxlCi0KKyAKKyAKICNpZmRlZiAgX19jcGx1c3BsdXMKIH0KICNlbmRpZgotCisgCiAjZW5kaWYgIC8vIENNU0lTX09TX0hfCmRpZmYgLS1naXQgYS9Tb3VyY2UvQ01TSVNfUlRPU19WMi9jbXNpc19vczEuYyBiL1NvdXJjZS9DTVNJU19SVE9TX1YyL2Ntc2lzX29zMS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWZmZTM2Li4wMDAwMDAwCi0tLSBhL1NvdXJjZS9DTVNJU19SVE9TX1YyL2Ntc2lzX29zMS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzY4ICswLDAgQEAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNyBBUk0gTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFBvcnRpb25zIENvcHlyaWdodCDCqSAyMDE3IFNUTWljcm9lbGVjdHJvbmljcyBJbnRlcm5hdGlvbmFsIE4uVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTsgeW91IG1heQotICogbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIHd3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsIFdJVEhPVVQKLSAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIFByb2plY3Q6ICAgICAgQ01TSVMtUlRPUyBBUEkgVjEKLSAqIFRpdGxlOiAgICAgICAgY21zaXNfb3MxLmMgVjEgbW9kdWxlIGZpbGUKLSAqCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSAiY21zaXNfb3MuaCIKLQotI2lmIChvc0NNU0lTID49IDB4MjAwMDBVKSAmJiAhZGVmaW5lZChvczFfRGlzYWJsZSkKLQotCi0vLyBUaHJlYWQKLSNpZiAhZGVmaW5lZChvczFfRGlzYWJsZV9UaHJlYWQpCi1vc1RocmVhZElkIG9zVGhyZWFkQ3JlYXRlIChjb25zdCBvc1RocmVhZERlZl90ICp0aHJlYWRfZGVmLCB2b2lkICphcmd1bWVudCkgewotCi0gIGlmICh0aHJlYWRfZGVmID09IE5VTEwpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICByZXR1cm4gb3NUaHJlYWROZXcoKG9zVGhyZWFkRnVuY190KXRocmVhZF9kZWYtPnB0aHJlYWQsIGFyZ3VtZW50LCAmdGhyZWFkX2RlZi0+YXR0cik7Ci19Ci0jZW5kaWYKLQotCi0vLyBTaWduYWxzCi0KLSNpZiAhZGVmaW5lZChvczFfRGlzYWJsZV9TaWduYWwpCi0KLSNkZWZpbmUgU2lnbmFsTWFzayAoKDFVPDxvc0ZlYXR1cmVfU2lnbmFscyktMVUpCi0KLWludDMyX3Qgb3NTaWduYWxTZXQgKG9zVGhyZWFkSWQgdGhyZWFkX2lkLCBpbnQzMl90IHNpZ25hbHMpIHsKLSAgdWludDMyX3QgZmxhZ3M7Ci0KLSAgZmxhZ3MgPSBvc1RocmVhZEZsYWdzU2V0KHRocmVhZF9pZCwgKHVpbnQzMl90KXNpZ25hbHMpOwotICBpZiAoKGZsYWdzICYgMHg4MDAwMDAwMFUpICE9IDBVKSB7Ci0gICAgcmV0dXJuICgoaW50MzJfdCkweDgwMDAwMDAwVSk7Ci0gIH0KLSAgcmV0dXJuICgoaW50MzJfdCkoZmxhZ3MgJiB+KCh1aW50MzJfdClzaWduYWxzKSkpOwotfQotCi1pbnQzMl90IG9zU2lnbmFsQ2xlYXIgKG9zVGhyZWFkSWQgdGhyZWFkX2lkLCBpbnQzMl90IHNpZ25hbHMpIHsKLSAgdWludDMyX3QgZmxhZ3M7Ci0KLSAgaWYgKHRocmVhZF9pZCAhPSBvc1RocmVhZEdldElkKCkpIHsKLSAgICByZXR1cm4gKChpbnQzMl90KTB4ODAwMDAwMDBVKTsKLSAgfQotICBmbGFncyA9IG9zVGhyZWFkRmxhZ3NDbGVhcigodWludDMyX3Qpc2lnbmFscyk7Ci0gIGlmICgoZmxhZ3MgJiAweDgwMDAwMDAwVSkgIT0gMFUpIHsKLSAgICByZXR1cm4gKChpbnQzMl90KTB4ODAwMDAwMDBVKTsKLSAgfQotICByZXR1cm4gKChpbnQzMl90KWZsYWdzKTsKLX0KLQotb3NfSW5SZWdzIG9zRXZlbnQgb3NTaWduYWxXYWl0IChpbnQzMl90IHNpZ25hbHMsIHVpbnQzMl90IG1pbGxpc2VjKSB7Ci0gIG9zRXZlbnQgIGV2ZW50OwotICB1aW50MzJfdCBmbGFnczsKLQotICBpZiAoc2lnbmFscyAhPSAwKSB7Ci0gICAgZmxhZ3MgPSBvc1RocmVhZEZsYWdzV2FpdCgodWludDMyX3Qpc2lnbmFscywgb3NGbGFnc1dhaXRBbGwsIG1pbGxpc2VjKTsKLSAgfSBlbHNlIHsKLSAgICBmbGFncyA9IG9zVGhyZWFkRmxhZ3NXYWl0KFNpZ25hbE1hc2ssICAgICAgICBvc0ZsYWdzV2FpdEFueSwgbWlsbGlzZWMpOwotICB9Ci0gIGlmICgoZmxhZ3MgPiAwVSkgJiYgKGZsYWdzIDwgMHg4MDAwMDAwMFUpKSB7Ci0gICAgZXZlbnQuc3RhdHVzID0gb3NFdmVudFNpZ25hbDsKLSAgICBldmVudC52YWx1ZS5zaWduYWxzID0gKGludDMyX3QpZmxhZ3M7Ci0gIH0gZWxzZSB7Ci0gICAgc3dpdGNoICgoaW50MzJfdClmbGFncykgewotICAgICAgY2FzZSBvc0Vycm9yUmVzb3VyY2U6Ci0gICAgICAgIGV2ZW50LnN0YXR1cyA9IG9zT0s7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBvc0Vycm9yVGltZW91dDoKLSAgICAgICAgZXZlbnQuc3RhdHVzID0gb3NFdmVudFRpbWVvdXQ7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBvc0Vycm9yUGFyYW1ldGVyOgotICAgICAgICBldmVudC5zdGF0dXMgPSBvc0Vycm9yVmFsdWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgZXZlbnQuc3RhdHVzID0gKG9zU3RhdHVzKWZsYWdzOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGV2ZW50OwotfQotCi0jZW5kaWYgIC8vIFNpZ25hbAotCi0KLS8vIFRpbWVyCi0jaWYgIWRlZmluZWQob3MxX0Rpc2FibGVfVGltZXIpCi1vc1RpbWVySWQgb3NUaW1lckNyZWF0ZSAoY29uc3Qgb3NUaW1lckRlZl90ICp0aW1lcl9kZWYsIG9zX3RpbWVyX3R5cGUgdHlwZSwgdm9pZCAqYXJndW1lbnQpIHsKLQotICBpZiAodGltZXJfZGVmID09IE5VTEwpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICByZXR1cm4gb3NUaW1lck5ldygob3NUaW1lckZ1bmNfdCl0aW1lcl9kZWYtPnB0aW1lciwgdHlwZSwgYXJndW1lbnQsICZ0aW1lcl9kZWYtPmF0dHIpOwotfQotI2VuZGlmCi0KLQotLy8gTXV0ZXgKLSNpZiAhZGVmaW5lZChvczFfRGlzYWJsZV9NdXRleCkKLW9zTXV0ZXhJZCBvc011dGV4Q3JlYXRlIChjb25zdCBvc011dGV4RGVmX3QgKm11dGV4X2RlZikgewotCi0gIGlmIChtdXRleF9kZWYgPT0gTlVMTCkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIHJldHVybiBvc011dGV4TmV3KG11dGV4X2RlZik7Ci19Ci0jZW5kaWYKLQotCi0vLyBTZW1hcGhvcmUKLQotI2lmIChkZWZpbmVkIChvc0ZlYXR1cmVfU2VtYXBob3JlKSAmJiAob3NGZWF0dXJlX1NlbWFwaG9yZSAhPSAwVSkpICYmICFkZWZpbmVkKG9zMV9EaXNhYmxlX1NlbWFwaG9yZSkKLQotb3NTZW1hcGhvcmVJZCBvc1NlbWFwaG9yZUNyZWF0ZSAoY29uc3Qgb3NTZW1hcGhvcmVEZWZfdCAqc2VtYXBob3JlX2RlZiwgaW50MzJfdCBjb3VudCkgewotCi0gIGlmIChzZW1hcGhvcmVfZGVmID09IE5VTEwpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICByZXR1cm4gb3NTZW1hcGhvcmVOZXcoKHVpbnQzMl90KWNvdW50LCAodWludDMyX3QpY291bnQsIHNlbWFwaG9yZV9kZWYpOwotfQotCi1pbnQzMl90IG9zU2VtYXBob3JlV2FpdCAob3NTZW1hcGhvcmVJZCBzZW1hcGhvcmVfaWQsIHVpbnQzMl90IG1pbGxpc2VjKSB7Ci0gIG9zU3RhdHVzX3Qgc3RhdHVzOwotICB1aW50MzJfdCAgIGNvdW50OwotCi0gIHN0YXR1cyA9IG9zU2VtYXBob3JlQWNxdWlyZShzZW1hcGhvcmVfaWQsIG1pbGxpc2VjKTsKLSAgc3dpdGNoIChzdGF0dXMpIHsKLSAgICBjYXNlIG9zT0s6Ci0gICAgICBjb3VudCA9IG9zU2VtYXBob3JlR2V0Q291bnQoc2VtYXBob3JlX2lkKTsKLSAgICAgIHJldHVybiAoKGludDMyX3QpY291bnQgKyAxKTsKLSAgICBjYXNlIG9zRXJyb3JSZXNvdXJjZToKLSAgICBjYXNlIG9zRXJyb3JUaW1lb3V0OgotICAgICAgcmV0dXJuIDA7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICB9Ci0gIHJldHVybiAtMTsKLX0KLQotI2VuZGlmICAvLyBTZW1hcGhvcmUKLQotCi0vLyBNZW1vcnkgUG9vbAotCi0jaWYgKGRlZmluZWQob3NGZWF0dXJlX1Bvb2wpICYmIChvc0ZlYXR1cmVfUG9vbCAhPSAwKSkmJiAhZGVmaW5lZChvczFfRGlzYWJsZV9Qb29sKQotCi1vc1Bvb2xJZCBvc1Bvb2xDcmVhdGUgKGNvbnN0IG9zUG9vbERlZl90ICpwb29sX2RlZikgewotCi0gIGlmIChwb29sX2RlZiA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgcmV0dXJuIG9zTWVtb3J5UG9vbE5ldyhwb29sX2RlZi0+cG9vbF9zeiwgcG9vbF9kZWYtPml0ZW1fc3osICZwb29sX2RlZi0+YXR0cik7Ci19Ci0KLXZvaWQgKm9zUG9vbEFsbG9jIChvc1Bvb2xJZCBwb29sX2lkKSB7Ci0gIHJldHVybiBvc01lbW9yeVBvb2xBbGxvYyhwb29sX2lkLCAwVSk7Ci19Ci0KLXZvaWQgKm9zUG9vbENBbGxvYyAob3NQb29sSWQgcG9vbF9pZCkgewotICB2b2lkICAgICpibG9jazsKLSAgdWludDMyX3QgYmxvY2tfc2l6ZTsKLQotICBibG9ja19zaXplID0gb3NNZW1vcnlQb29sR2V0QmxvY2tTaXplKChvc01lbW9yeVBvb2xJZF90KXBvb2xfaWQpOwotICBpZiAoYmxvY2tfc2l6ZSA9PSAwVSkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIGJsb2NrID0gb3NNZW1vcnlQb29sQWxsb2MocG9vbF9pZCwgMFUpOwotICBpZiAoYmxvY2sgIT0gTlVMTCkgewotICAgIG1lbXNldChibG9jaywgMCwgYmxvY2tfc2l6ZSk7Ci0gIH0KLSAgcmV0dXJuIGJsb2NrOwotfQotCi1vc1N0YXR1cyBvc1Bvb2xGcmVlIChvc1Bvb2xJZCBwb29sX2lkLCB2b2lkICpibG9jaykgewotICByZXR1cm4gb3NNZW1vcnlQb29sRnJlZShwb29sX2lkLCBibG9jayk7Ci19Ci0KLSNlbmRpZiAgLy8gTWVtb3J5IFBvb2wKLQotCi0vLyBNZXNzYWdlIFF1ZXVlCi0KLSNpZiAoZGVmaW5lZChvc0ZlYXR1cmVfTWVzc2FnZVEpICYmIChvc0ZlYXR1cmVfTWVzc2FnZVEgIT0gMCkpICYmICFkZWZpbmVkKG9zMV9EaXNhYmxlX01lc3NhZ2VRKQotCi1vc01lc3NhZ2VRSWQgb3NNZXNzYWdlQ3JlYXRlIChjb25zdCBvc01lc3NhZ2VRRGVmX3QgKnF1ZXVlX2RlZiwgb3NUaHJlYWRJZCB0aHJlYWRfaWQpIHsKLSAgKHZvaWQpdGhyZWFkX2lkOwotCi0gIGlmIChxdWV1ZV9kZWYgPT0gTlVMTCkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIHJldHVybiBvc01lc3NhZ2VRdWV1ZU5ldyhxdWV1ZV9kZWYtPnF1ZXVlX3N6LCBzaXplb2YodWludDMyX3QpLCAmcXVldWVfZGVmLT5hdHRyKTsKLX0KLQotb3NTdGF0dXMgb3NNZXNzYWdlUHV0IChvc01lc3NhZ2VRSWQgcXVldWVfaWQsIHVpbnQzMl90IGluZm8sIHVpbnQzMl90IG1pbGxpc2VjKSB7Ci0gIHJldHVybiBvc01lc3NhZ2VRdWV1ZVB1dChxdWV1ZV9pZCwgJmluZm8sIDBVLCBtaWxsaXNlYyk7Ci19Ci0KLW9zX0luUmVncyBvc0V2ZW50IG9zTWVzc2FnZUdldCAob3NNZXNzYWdlUUlkIHF1ZXVlX2lkLCB1aW50MzJfdCBtaWxsaXNlYykgewotICBvc1N0YXR1c190IHN0YXR1czsKLSAgb3NFdmVudCAgICBldmVudDsKLSAgdWludDMyX3QgICBtZXNzYWdlOwotCi0gIHN0YXR1cyA9IG9zTWVzc2FnZVF1ZXVlR2V0KHF1ZXVlX2lkLCAmbWVzc2FnZSwgTlVMTCwgbWlsbGlzZWMpOwotICBzd2l0Y2ggKHN0YXR1cykgewotICAgIGNhc2Ugb3NPSzoKLSAgICAgIGV2ZW50LnN0YXR1cyA9IG9zRXZlbnRNZXNzYWdlOwotICAgICAgZXZlbnQudmFsdWUudiA9IG1lc3NhZ2U7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIG9zRXJyb3JSZXNvdXJjZToKLSAgICAgIGV2ZW50LnN0YXR1cyA9IG9zT0s7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIG9zRXJyb3JUaW1lb3V0OgotICAgICAgZXZlbnQuc3RhdHVzID0gb3NFdmVudFRpbWVvdXQ7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgZXZlbnQuc3RhdHVzID0gc3RhdHVzOwotICAgICAgYnJlYWs7Ci0gIH0KLSAgcmV0dXJuIGV2ZW50OwotfQotCi0jZW5kaWYgIC8vIE1lc3NhZ2UgUXVldWUKLQotCi0vLyBNYWlsIFF1ZXVlCi0KLSNpZiAoZGVmaW5lZChvc0ZlYXR1cmVfTWFpbFEpICYmIChvc0ZlYXR1cmVfTWFpbFEgIT0gMCkpICYmICFkZWZpbmVkKG9zMV9EaXNhYmxlX01haWxRKQotCi10eXBlZGVmIHN0cnVjdCBvc19tYWlsX3F1ZXVlX3MgewotICBvc01lbW9yeVBvb2xJZF90ICAgbXBfaWQ7Ci0gIG9zTWVzc2FnZVF1ZXVlSWRfdCBtcV9pZDsKLX0gb3NfbWFpbF9xdWV1ZV90OwotCi1vc01haWxRSWQgb3NNYWlsQ3JlYXRlIChjb25zdCBvc01haWxRRGVmX3QgKnF1ZXVlX2RlZiwgb3NUaHJlYWRJZCB0aHJlYWRfaWQpIHsKLSAgb3NfbWFpbF9xdWV1ZV90ICpwdHI7Ci0gICh2b2lkKXRocmVhZF9pZDsKLQotICBpZiAocXVldWVfZGVmID09IE5VTEwpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIHB0ciA9IHF1ZXVlX2RlZi0+bWFpbDsKLSAgaWYgKHB0ciA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICBwdHItPm1wX2lkID0gb3NNZW1vcnlQb29sTmV3ICAocXVldWVfZGVmLT5xdWV1ZV9zeiwgcXVldWVfZGVmLT5pdGVtX3N6LCAmcXVldWVfZGVmLT5tcF9hdHRyKTsKLSAgcHRyLT5tcV9pZCA9IG9zTWVzc2FnZVF1ZXVlTmV3KHF1ZXVlX2RlZi0+cXVldWVfc3osIHNpemVvZih2b2lkICopLCAmcXVldWVfZGVmLT5tcV9hdHRyKTsKLSAgaWYgKChwdHItPm1wX2lkID09IE5VTEwpIHx8IChwdHItPm1xX2lkID09IE5VTEwpKSB7Ci0gICAgaWYgKHB0ci0+bXBfaWQgIT0gTlVMTCkgewotICAgICAgb3NNZW1vcnlQb29sRGVsZXRlKHB0ci0+bXBfaWQpOwotICAgIH0KLSAgICBpZiAocHRyLT5tcV9pZCAhPSBOVUxMKSB7Ci0gICAgICBvc01lc3NhZ2VRdWV1ZURlbGV0ZShwdHItPm1xX2lkKTsKLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICByZXR1cm4gcHRyOwotfQotCi12b2lkICpvc01haWxBbGxvYyAob3NNYWlsUUlkIHF1ZXVlX2lkLCB1aW50MzJfdCBtaWxsaXNlYykgewotICBvc19tYWlsX3F1ZXVlX3QgKnB0ciA9IChvc19tYWlsX3F1ZXVlX3QgKilxdWV1ZV9pZDsKLQotICBpZiAocHRyID09IE5VTEwpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICByZXR1cm4gb3NNZW1vcnlQb29sQWxsb2MocHRyLT5tcF9pZCwgbWlsbGlzZWMpOwotfQotCi12b2lkICpvc01haWxDQWxsb2MgKG9zTWFpbFFJZCBxdWV1ZV9pZCwgdWludDMyX3QgbWlsbGlzZWMpIHsKLSAgb3NfbWFpbF9xdWV1ZV90ICpwdHIgPSAob3NfbWFpbF9xdWV1ZV90ICopcXVldWVfaWQ7Ci0gIHZvaWQgICAgICAgICAgICAqYmxvY2s7Ci0gIHVpbnQzMl90ICAgICAgICAgYmxvY2tfc2l6ZTsKLQotICBpZiAocHRyID09IE5VTEwpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICBibG9ja19zaXplID0gb3NNZW1vcnlQb29sR2V0QmxvY2tTaXplKHB0ci0+bXBfaWQpOwotICBpZiAoYmxvY2tfc2l6ZSA9PSAwVSkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIGJsb2NrID0gb3NNZW1vcnlQb29sQWxsb2MocHRyLT5tcF9pZCwgbWlsbGlzZWMpOwotICBpZiAoYmxvY2sgIT0gTlVMTCkgewotICAgIG1lbXNldChibG9jaywgMCwgYmxvY2tfc2l6ZSk7Ci0gIH0KLQotICByZXR1cm4gYmxvY2s7Ci0KLX0KLQotb3NTdGF0dXMgb3NNYWlsUHV0IChvc01haWxRSWQgcXVldWVfaWQsIGNvbnN0IHZvaWQgKm1haWwpIHsKLSAgb3NfbWFpbF9xdWV1ZV90ICpwdHIgPSAob3NfbWFpbF9xdWV1ZV90ICopcXVldWVfaWQ7Ci0KLSAgaWYgKHB0ciA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIG9zRXJyb3JQYXJhbWV0ZXI7Ci0gIH0KLSAgaWYgKG1haWwgPT0gTlVMTCkgewotICAgIHJldHVybiBvc0Vycm9yVmFsdWU7Ci0gIH0KLSAgcmV0dXJuIG9zTWVzc2FnZVF1ZXVlUHV0KHB0ci0+bXFfaWQsICZtYWlsLCAwVSwgMFUpOwotfQotCi1vc19JblJlZ3Mgb3NFdmVudCBvc01haWxHZXQgKG9zTWFpbFFJZCBxdWV1ZV9pZCwgdWludDMyX3QgbWlsbGlzZWMpIHsKLSAgb3NfbWFpbF9xdWV1ZV90ICpwdHIgPSAob3NfbWFpbF9xdWV1ZV90ICopcXVldWVfaWQ7Ci0gIG9zU3RhdHVzX3QgICAgICAgc3RhdHVzOwotICBvc0V2ZW50ICAgICAgICAgIGV2ZW50OwotICB2b2lkICAgICAgICAgICAgKm1haWw7Ci0KLSAgaWYgKHB0ciA9PSBOVUxMKSB7Ci0gICAgZXZlbnQuc3RhdHVzID0gb3NFcnJvclBhcmFtZXRlcjsKLSAgICByZXR1cm4gZXZlbnQ7Ci0gIH0KLQotICBzdGF0dXMgPSBvc01lc3NhZ2VRdWV1ZUdldChwdHItPm1xX2lkLCAmbWFpbCwgTlVMTCwgbWlsbGlzZWMpOwotICBzd2l0Y2ggKHN0YXR1cykgewotICAgIGNhc2Ugb3NPSzoKLSAgICAgIGV2ZW50LnN0YXR1cyA9IG9zRXZlbnRNYWlsOwotICAgICAgZXZlbnQudmFsdWUucCA9IG1haWw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIG9zRXJyb3JSZXNvdXJjZToKLSAgICAgIGV2ZW50LnN0YXR1cyA9IG9zT0s7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIG9zRXJyb3JUaW1lb3V0OgotICAgICAgZXZlbnQuc3RhdHVzID0gb3NFdmVudFRpbWVvdXQ7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgZXZlbnQuc3RhdHVzID0gc3RhdHVzOwotICAgICAgYnJlYWs7Ci0gIH0KLSAgcmV0dXJuIGV2ZW50OwotfQotCi1vc1N0YXR1cyBvc01haWxGcmVlIChvc01haWxRSWQgcXVldWVfaWQsIHZvaWQgKm1haWwpIHsKLSAgb3NfbWFpbF9xdWV1ZV90ICpwdHIgPSAob3NfbWFpbF9xdWV1ZV90ICopcXVldWVfaWQ7Ci0KLSAgaWYgKHB0ciA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIG9zRXJyb3JQYXJhbWV0ZXI7Ci0gIH0KLSAgaWYgKG1haWwgPT0gTlVMTCkgewotICAgIHJldHVybiBvc0Vycm9yVmFsdWU7Ci0gIH0KLSAgcmV0dXJuIG9zTWVtb3J5UG9vbEZyZWUocHRyLT5tcF9pZCwgbWFpbCk7Ci19Ci0KLSNlbmRpZiAgLy8gTWFpbCBRdWV1ZQotCi0KLSNlbmRpZiAgLy8gb3NDTVNJUwpkaWZmIC0tZ2l0IGEvU291cmNlL0NNU0lTX1JUT1NfVjIvY21zaXNfb3MyLmMgYi9Tb3VyY2UvQ01TSVNfUlRPU19WMi9jbXNpc19vczIuYwppbmRleCBiNjViM2EwLi45MWZjYTMwIDEwMDY0NAotLS0gYS9Tb3VyY2UvQ01TSVNfUlRPU19WMi9jbXNpc19vczIuYworKysgYi9Tb3VyY2UvQ01TSVNfUlRPU19WMi9jbXNpc19vczIuYwpAQCAtMSw3ICsxLDYgQEAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgwqkgMjAxNyBTVE1pY3JvZWxlY3Ryb25pY3MgSW50ZXJuYXRpb25hbCBOLlYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBQb3J0aW9ucyBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNyBBUk0gTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBQb3J0aW9ucyBDb3B5cmlnaHQgqSAyMDE5IFNUTWljcm9lbGVjdHJvbmljcyBJbnRlcm5hdGlvbmFsIE4uVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE5IEFybSBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wCiAgKgpAQCAtNTIsMTEgKzUxLDE0IEBACiAjaWYgICAoKF9fQVJNX0FSQ0hfN01fXyAgICAgID09IDFVKSB8fCBcCiAgICAgICAgKF9fQVJNX0FSQ0hfN0VNX18gICAgID09IDFVKSB8fCBcCiAgICAgICAgKF9fQVJNX0FSQ0hfOE1fTUFJTl9fID09IDFVKSkKLSNkZWZpbmUgSVNfSVJRX01BU0tFRCgpICAgICAgICAgICAoKF9fZ2V0X1BSSU1BU0soKSAhPSAwVSkgfHwgKChLZXJuZWxTdGF0ZSA9PSBvc0tlcm5lbFJ1bm5pbmcpICYmIChfX2dldF9CQVNFUFJJKCkgIT0gMFUpKSkKKyNkZWZpbmUgSVNfSVJRX01BU0tFRCgpICAgICAgICAgICAoKF9fZ2V0X1BSSU1BU0soKSAhPSAwVSkgfHwgKF9fZ2V0X0JBU0VQUkkoKSAhPSAwVSkpCiAjZWxpZiAgKF9fQVJNX0FSQ0hfNk1fXyAgICAgID09IDFVKQotI2RlZmluZSBJU19JUlFfTUFTS0VEKCkgICAgICAgICAgICgoX19nZXRfUFJJTUFTSygpICE9IDBVKSAmJiAgKEtlcm5lbFN0YXRlID09IG9zS2VybmVsUnVubmluZykpCi0jZWxpZiAoX19BUk1fQVJDSF83QV9fICAgICAgID09IDEpCi0jZGVmaW5lIElTX0lSUV9NQVNLRUQoKSAgICAgICAgICAgKDBVKQorI2RlZmluZSBJU19JUlFfTUFTS0VEKCkgICAgICAgICAgIChfX2dldF9QUklNQVNLKCkgIT0gMFUpCisjZWxpZiAoX19BUk1fQVJDSF83QV9fICAgICAgID09IDFVKQorLyogQ1BTUiBtYXNrIGJpdHMgKi8KKyNkZWZpbmUgQ1BTUl9NQVNLQklUX0kgICAgICAgICAgICAweDgwVQorCisjZGVmaW5lIElTX0lSUV9NQVNLRUQoKSAgICAgICAgICAgKChfX2dldF9DUFNSKCkgJiBDUFNSX01BU0tCSVRfSSkgIT0gMFUpCiAjZWxzZQogI2RlZmluZSBJU19JUlFfTUFTS0VEKCkgICAgICAgICAgIChfX2dldF9QUklNQVNLKCkgIT0gMFUpCiAjZW5kaWYKQEAgLTcxLDcgKzczLDcgQEAKICNkZWZpbmUgSVNfSVJRX01PREUoKSAgICAgICAgICAgICAoX19nZXRfSVBTUigpICE9IDBVKQogI2VuZGlmCiAKLSNkZWZpbmUgSVNfSVJRKCkgICAgICAgICAgICAgICAgICAoSVNfSVJRX01PREUoKSB8fCBJU19JUlFfTUFTS0VEKCkpCisjZGVmaW5lIElTX0lSUSgpICAgICAgICAgICAgICAgICAgKElTX0lSUV9NT0RFKCkgfHwgKElTX0lSUV9NQVNLRUQoKSAmJiAoS2VybmVsU3RhdGUgPT0gb3NLZXJuZWxSdW5uaW5nKSkpCiAKIC8qIExpbWl0cyAqLwogI2RlZmluZSBNQVhfQklUU19UQVNLX05PVElGWSAgICAgIDMxVQpAQCAtODAsMTIgKzgyLDEyIEBACiAjZGVmaW5lIFRIUkVBRF9GTEFHU19JTlZBTElEX0JJVFMgKH4oKDFVTCA8PCBNQVhfQklUU19UQVNLX05PVElGWSkgIC0gMVUpKQogI2RlZmluZSBFVkVOVF9GTEFHU19JTlZBTElEX0JJVFMgICh+KCgxVUwgPDwgTUFYX0JJVFNfRVZFTlRfR1JPVVBTKSAtIDFVKSkKIAotLyogS2VybmVsIHZlcnNpb24gYW5kIGlkZW50aWZpY2F0aW9uIHN0cmluZyBkZWZpbml0aW9uICovCisvKiBLZXJuZWwgdmVyc2lvbiBhbmQgaWRlbnRpZmljYXRpb24gc3RyaW5nIGRlZmluaXRpb24gKG1ham9yLm1pbm9yLnJldjogbW1ubm5ycnJyIGRlYykgKi8KICNkZWZpbmUgS0VSTkVMX1ZFUlNJT04gICAgICAgICAgICAoKCh1aW50MzJfdCl0c2tLRVJORUxfVkVSU0lPTl9NQUpPUiAqIDEwMDAwMDAwVUwpIHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KXRza0tFUk5FTF9WRVJTSU9OX01JTk9SICogICAgMTAwMDBVTCkgfCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpdHNrS0VSTkVMX1ZFUlNJT05fQlVJTEQgKiAgICAgICAgMVVMKSkKIAotI2RlZmluZSBLRVJORUxfSUQgICAgICAgICAgICAgICAgICJGcmVlUlRPUyBWMTAuMC4xIgorI2RlZmluZSBLRVJORUxfSUQgICAgICAgICAgICAgICAgICgiRnJlZVJUT1MgIiB0c2tLRVJORUxfVkVSU0lPTl9OVU1CRVIpCiAKIC8qIFRpbWVyIGNhbGxiYWNrIGluZm9ybWF0aW9uIHN0cnVjdHVyZSBkZWZpbml0aW9uICovCiB0eXBlZGVmIHN0cnVjdCB7CkBAIC05NCwyNyArOTYsNTUgQEAKIH0gVGltZXJDYWxsYmFja190OwogCiAvKiBLZXJuZWwgaW5pdGlhbGl6YXRpb24gc3RhdGUgKi8KLXN0YXRpYyBvc0tlcm5lbFN0YXRlX3QgS2VybmVsU3RhdGU7CitzdGF0aWMgb3NLZXJuZWxTdGF0ZV90IEtlcm5lbFN0YXRlID0gb3NLZXJuZWxJbmFjdGl2ZTsKIAotLyogSGVhcCByZWdpb24gZGVmaW5pdGlvbiB1c2VkIGJ5IGhlYXBfNSB2YXJpYW50ICovCi0jaWYgZGVmaW5lZChVU0VfRnJlZVJUT1NfSEVBUF81KQotI2lmIChjb25maWdBUFBMSUNBVElPTl9BTExPQ0FURURfSEVBUCA9PSAxKQogLyoKLSAgVGhlIGFwcGxpY2F0aW9uIHdyaXRlciBoYXMgYWxyZWFkeSBkZWZpbmVkIHRoZSBhcnJheSB1c2VkIGZvciB0aGUgUlRPUwotICBoZWFwIC0gcHJvYmFibHkgc28gaXQgY2FuIGJlIHBsYWNlZCBpbiBhIHNwZWNpYWwgc2VnbWVudCBvciBhZGRyZXNzLgotKi8KLSAgZXh0ZXJuIHVpbnQ4X3QgdWNIZWFwW2NvbmZpZ1RPVEFMX0hFQVBfU0laRV07Ci0jZWxzZQotICBzdGF0aWMgdWludDhfdCB1Y0hlYXBbY29uZmlnVE9UQUxfSEVBUF9TSVpFXTsKLSNlbmRpZiAvKiBjb25maWdBUFBMSUNBVElPTl9BTExPQ0FURURfSEVBUCAqLworICBIZWFwIHJlZ2lvbiBkZWZpbml0aW9uIHVzZWQgYnkgaGVhcF81IHZhcmlhbnQKIAotc3RhdGljIEhlYXBSZWdpb25fdCB4SGVhcFJlZ2lvbnNbXSA9IHsKLSAgeyB1Y0hlYXAsIGNvbmZpZ1RPVEFMX0hFQVBfU0laRSB9LAotICB7IE5VTEwsICAgMCAgICAgICAgICAgICAgICAgICAgIH0KLX07Ci0jZW5kaWYgLyogVVNFX0ZyZWVSVE9TX0hFQVBfNSAqLworICBEZWZpbmUgY29uZmlnQVBQTElDQVRJT05fQUxMT0NBVEVEX0hFQVAgYXMgbm9uemVybyB2YWx1ZSBpbiBGcmVlUlRPU0NvbmZpZy5oIGlmCisgIGhlYXAgcmVnaW9ucyBhcmUgYWxyZWFkeSBkZWZpbmVkIGFuZCB2UG9ydERlZmluZUhlYXBSZWdpb25zIGlzIGNhbGxlZCBpbiBhcHBsaWNhdGlvbi4KKworICBPdGhlcndpc2UgdlBvcnREZWZpbmVIZWFwUmVnaW9ucyB3aWxsIGJlIGNhbGxlZCBieSBvc0tlcm5lbEluaXRpYWxpemUgdXNpbmcKKyAgZGVmaW5pdGlvbiBjb25maWdIRUFQXzVfUkVHSU9OUyBhcyBwYXJhbWV0ZXIuIE92ZXJyaWRpbmcgY29uZmlnSEVBUF81X1JFR0lPTlMKKyAgaXMgcG9zc2libGUgYnkgZGVmaW5pbmcgaXQgZ2xvYmFsbHkgb3IgaW4gRnJlZVJUT1NDb25maWcuaC4KKyovCisjaWYgZGVmaW5lZChVU0VfRlJFRVJUT1NfSEVBUF81KQorI2lmIChjb25maWdBUFBMSUNBVElPTl9BTExPQ0FURURfSEVBUCA9PSAwKQorICAvKgorICAgIEZyZWVSVE9TIGhlYXAgaXMgbm90IGRlZmluZWQgYnkgdGhlIGFwcGxpY2F0aW9uLgorICAgIFNpbmdsZSByZWdpb24gb2Ygc2l6ZSBjb25maWdUT1RBTF9IRUFQX1NJWkUgKGRlZmluZWQgaW4gRnJlZVJUT1NDb25maWcuaCkKKyAgICBpcyBwcm92aWRlZCBieSBkZWZhdWx0LiBEZWZpbmUgY29uZmlnSEVBUF81X1JFR0lPTlMgdG8gcHJvdmlkZSBjdXN0b20KKyAgICBIZWFwUmVnaW9uX3QgYXJyYXkuCisgICovCisgICNkZWZpbmUgSEVBUF81X1JFR0lPTl9TRVRVUCAgIDEKKyAgCisgICNpZm5kZWYgY29uZmlnSEVBUF81X1JFR0lPTlMKKyAgICAjZGVmaW5lIGNvbmZpZ0hFQVBfNV9SRUdJT05TIHhIZWFwUmVnaW9ucworCisgICAgc3RhdGljIHVpbnQ4X3QgdWNIZWFwW2NvbmZpZ1RPVEFMX0hFQVBfU0laRV07CisKKyAgICBzdGF0aWMgSGVhcFJlZ2lvbl90IHhIZWFwUmVnaW9uc1tdID0geworICAgICAgeyB1Y0hlYXAsIGNvbmZpZ1RPVEFMX0hFQVBfU0laRSB9LAorICAgICAgeyBOVUxMLCAgIDAgICAgICAgICAgICAgICAgICAgICB9CisgICAgfTsKKyAgI2Vsc2UKKyAgICAvKiBHbG9iYWwgZGVmaW5pdGlvbiBpcyBwcm92aWRlZCB0byBvdmVycmlkZSBkZWZhdWx0IGhlYXAgYXJyYXkgKi8KKyAgICBleHRlcm4gSGVhcFJlZ2lvbl90IGNvbmZpZ0hFQVBfNV9SRUdJT05TW107CisgICNlbmRpZgorI2Vsc2UKKyAgLyoKKyAgICBUaGUgYXBwbGljYXRpb24gYWxyZWFkeSBkZWZpbmVkIHRoZSBhcnJheSB1c2VkIGZvciB0aGUgRnJlZVJUT1MgaGVhcCBhbmQKKyAgICBjYWxsZWQgdlBvcnREZWZpbmVIZWFwUmVnaW9ucyB0byBpbml0aWFsaXplIGhlYXAuCisgICovCisgICNkZWZpbmUgSEVBUF81X1JFR0lPTl9TRVRVUCAgIDAKKyNlbmRpZiAvKiBjb25maWdBUFBMSUNBVElPTl9BTExPQ0FURURfSEVBUCAqLworI2VuZGlmIC8qIFVTRV9GUkVFUlRPU19IRUFQXzUgKi8KIAogI2lmIGRlZmluZWQoU3lzVGljaykKKyN1bmRlZiBTeXNUaWNrX0hhbmRsZXIKKworLyogQ01TSVMgU3lzVGljayBpbnRlcnJ1cHQgaGFuZGxlciBwcm90b3R5cGUgKi8KK2V4dGVybiB2b2lkIFN5c1RpY2tfSGFuZGxlciAgICAgKHZvaWQpOwogLyogRnJlZVJUT1MgdGljayB0aW1lciBpbnRlcnJ1cHQgaGFuZGxlciBwcm90b3R5cGUgKi8KIGV4dGVybiB2b2lkIHhQb3J0U3lzVGlja0hhbmRsZXIgKHZvaWQpOwogCkBAIC0xMjUsMTEgKzE1NSwzMSBAQAogICAvKiBDbGVhciBvdmVyZmxvdyBmbGFnICovCiAgIFN5c1RpY2stPkNUUkw7CiAKLSAgLyogQ2FsbCB0aWNrIGhhbmRsZXIgKi8KLSAgeFBvcnRTeXNUaWNrSGFuZGxlcigpOworICBpZiAoeFRhc2tHZXRTY2hlZHVsZXJTdGF0ZSgpICE9IHRhc2tTQ0hFRFVMRVJfTk9UX1NUQVJURUQpIHsKKyAgICAvKiBDYWxsIHRpY2sgaGFuZGxlciAqLworICAgIHhQb3J0U3lzVGlja0hhbmRsZXIoKTsKKyAgfQogfQogI2VuZGlmIC8qIFN5c1RpY2sgKi8KIAorLyoKKyAgU2V0dXAgU1ZDIHRvIHJlc2V0IHZhbHVlLgorKi8KK19fU1RBVElDX0lOTElORSB2b2lkIFNWQ19TZXR1cCAodm9pZCkgeworI2lmIChfX0FSTV9BUkNIXzdBX18gPT0gMFUpCisgIC8qIFNlcnZpY2UgQ2FsbCBpbnRlcnJ1cHQgbWlnaHQgYmUgY29uZmlndXJlZCBiZWZvcmUga2VybmVsIHN0YXJ0ICAgICAqLworICAvKiBhbmQgd2hlbiBpdHMgcHJpb3JpdHkgaXMgbG93ZXIgb3IgZXF1YWwgdG8gQkFTRVBSSSwgc3ZjIGludHJ1Y3Rpb24gKi8KKyAgLyogY2F1c2VzIGEgSGFyZCBGYXVsdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAvKiAKKyAgKiB0aGUgY2FsbCBiZWxvdyBoYXMgaW50cm9kdWNlZCBhIHJlZ3Jlc3Npb24gY29tcGFyZWQgdG8gcmV2aW91cyByZWxlYXNlCisgICogVGhlIGlzc3VlIHdhcyBsb2dnZWQgdW5kZXI6aHR0cHM6Ly9naXRodWIuY29tL0FSTS1zb2Z0d2FyZS9DTVNJUy1GcmVlUlRPUy9pc3N1ZXMvMzUKKyAgKiB1bnRpbCBpdCBpcyBjb3JyZWN0bHkgZml4ZWQsIHRoZSBjb2RlIGJlbG93IGlzIGNvbW1lbnRlZAorICAqLworLyogICAgTlZJQ19TZXRQcmlvcml0eSAoU1ZDYWxsX0lSUW4sIDBVKTsgKi8KKyNlbmRpZgorfQorCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKIG9zU3RhdHVzX3Qgb3NLZXJuZWxJbml0aWFsaXplICh2b2lkKSB7CkBAIC0xNDAsOCArMTkwLDggQEAKICAgfQogICBlbHNlIHsKICAgICBpZiAoS2VybmVsU3RhdGUgPT0gb3NLZXJuZWxJbmFjdGl2ZSkgewotICAgICAgI2lmIGRlZmluZWQoVVNFX0ZyZWVSVE9TX0hFQVBfNSkKLSAgICAgICAgdlBvcnREZWZpbmVIZWFwUmVnaW9ucyAoeEhlYXBSZWdpb25zKTsKKyAgICAgICNpZiBkZWZpbmVkKFVTRV9GUkVFUlRPU19IRUFQXzUpICYmIChIRUFQXzVfUkVHSU9OX1NFVFVQID09IDEpCisgICAgICAgIHZQb3J0RGVmaW5lSGVhcFJlZ2lvbnMgKGNvbmZpZ0hFQVBfNV9SRUdJT05TKTsKICAgICAgICNlbmRpZgogICAgICAgS2VybmVsU3RhdGUgPSBvc0tlcm5lbFJlYWR5OwogICAgICAgc3RhdCA9IG9zT0s7CkBAIC0xNTYsNiArMjA2LDcgQEAKIG9zU3RhdHVzX3Qgb3NLZXJuZWxHZXRJbmZvIChvc1ZlcnNpb25fdCAqdmVyc2lvbiwgY2hhciAqaWRfYnVmLCB1aW50MzJfdCBpZF9zaXplKSB7CiAKICAgaWYgKHZlcnNpb24gIT0gTlVMTCkgeworICAgIC8qIFZlcnNpb24gZW5jb2RpbmcgaXMgbWFqb3IubWlub3IucmV2OiBtbW5ubnJycnIgZGVjICovCiAgICAgdmVyc2lvbi0+YXBpICAgID0gS0VSTkVMX1ZFUlNJT047CiAgICAgdmVyc2lvbi0+a2VybmVsID0gS0VSTkVMX1ZFUlNJT047CiAgIH0KQEAgLTIwMyw3ICsyNTQsMTEgQEAKICAgfQogICBlbHNlIHsKICAgICBpZiAoS2VybmVsU3RhdGUgPT0gb3NLZXJuZWxSZWFkeSkgeworICAgICAgLyogRW5zdXJlIFNWQyBwcmlvcml0eSBpcyBhdCB0aGUgcmVzZXQgdmFsdWUgKi8KKyAgICAgIFNWQ19TZXR1cCgpOworICAgICAgLyogQ2hhbmdlIHN0YXRlIHRvIGVuYWJsZSBJUlEgbWFza2luZyBjaGVjayAqLwogICAgICAgS2VybmVsU3RhdGUgPSBvc0tlcm5lbFJ1bm5pbmc7CisgICAgICAvKiBTdGFydCB0aGUga2VybmVsIHNjaGVkdWxlciAqLwogICAgICAgdlRhc2tTdGFydFNjaGVkdWxlcigpOwogICAgICAgc3RhdCA9IG9zT0s7CiAgICAgfSBlbHNlIHsKQEAgLTMyNiwxNSArMzgxLDE4IEBACiB9CiAKIHVpbnQzMl90IG9zS2VybmVsR2V0U3lzVGltZXJDb3VudCAodm9pZCkgeworICB1aW50MzJfdCBpcnFtYXNrID0gSVNfSVJRX01BU0tFRCgpOwogICBUaWNrVHlwZV90IHRpY2tzOwogICB1aW50MzJfdCB2YWw7CiAKLSAgcG9ydERJU0FCTEVfSU5URVJSVVBUUygpOworICBfX2Rpc2FibGVfaXJxKCk7CiAKICAgdGlja3MgPSB4VGFza0dldFRpY2tDb3VudCgpOwogCiAgIHZhbCA9IHRpY2tzICogKCBjb25maWdDUFVfQ0xPQ0tfSFogLyBjb25maWdUSUNLX1JBVEVfSFogKTsKLSAgcG9ydEVOQUJMRV9JTlRFUlJVUFRTKCk7CisgIGlmIChpcnFtYXNrID09IDBVKSB7CisgICAgX19lbmFibGVfaXJxKCk7CisgIH0KIAogICByZXR1cm4gKHZhbCk7CiB9CkBAIC0zNDYsNyArNDA0LDYgQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogb3NUaHJlYWRJZF90IG9zVGhyZWFkTmV3IChvc1RocmVhZEZ1bmNfdCBmdW5jLCB2b2lkICphcmd1bWVudCwgY29uc3Qgb3NUaHJlYWRBdHRyX3QgKmF0dHIpIHsKLSAgY2hhciBlbXB0eTsKICAgY29uc3QgY2hhciAqbmFtZTsKICAgdWludDMyX3Qgc3RhY2s7CiAgIFRhc2tIYW5kbGVfdCBoVGFzazsKQEAgLTM1OSw5ICs0MTYsOCBAQAogICAgIHN0YWNrID0gY29uZmlnTUlOSU1BTF9TVEFDS19TSVpFOwogICAgIHByaW8gID0gKFVCYXNlVHlwZV90KW9zUHJpb3JpdHlOb3JtYWw7CiAKLSAgICBlbXB0eSA9ICdcMCc7Ci0gICAgbmFtZSAgPSAmZW1wdHk7Ci0gICAgbWVtICAgPSAtMTsKKyAgICBuYW1lID0gTlVMTDsKKyAgICBtZW0gID0gLTE7CiAKICAgICBpZiAoYXR0ciAhPSBOVUxMKSB7CiAgICAgICBpZiAoYXR0ci0+bmFtZSAhPSBOVUxMKSB7CkBAIC00MjcsMTEgKzQ4Myw3IEBACiBvc1RocmVhZElkX3Qgb3NUaHJlYWRHZXRJZCAodm9pZCkgewogICBvc1RocmVhZElkX3QgaWQ7CiAKLSAgaWYgKElTX0lSUSgpKSB7Ci0gICAgaWQgPSBOVUxMOwotICB9IGVsc2UgewotICAgIGlkID0gKG9zVGhyZWFkSWRfdCl4VGFza0dldEN1cnJlbnRUYXNrSGFuZGxlKCk7Ci0gIH0KKyAgaWQgPSAob3NUaHJlYWRJZF90KXhUYXNrR2V0Q3VycmVudFRhc2tIYW5kbGUoKTsKIAogICByZXR1cm4gKGlkKTsKIH0KQEAgLTQ3MSwxNiArNTIzLDYgQEAKICAgcmV0dXJuIChzeik7CiB9CiAKLXVpbnQzMl90IG9zVGhyZWFkR2V0U3RhY2tTaXplCShvc1RocmVhZElkX3QgdGhyZWFkX2lkKSB7Ci0gIC8qCi0gICAqIHRoaXMgaW1wbG1lbnRhdGlvbiBpcyBub3QgY29ycmVjdC4KLSAgICogdGhpcyBmdW5jdGlvbiBpcyBpbXBsbWVudGVkIHRvIGF2b2lkIGxpbmsgZXJyb3JzICh1bmRlZmluZWQgcmVmZXJlbmNlKQotICAgKiBCdWcgcmVwb3J0ZWQgOiBodHRwczovL2dpdGh1Yi5jb20vQVJNLXNvZnR3YXJlL0NNU0lTLUZyZWVSVE9TL2lzc3Vlcy8xNAotICAgKi8KLSAgKHZvaWQpIHRocmVhZF9pZDsKLSAgcmV0dXJuIDA7Ci19Ci0KIG9zU3RhdHVzX3Qgb3NUaHJlYWRTZXRQcmlvcml0eSAob3NUaHJlYWRJZF90IHRocmVhZF9pZCwgb3NQcmlvcml0eV90IHByaW9yaXR5KSB7CiAgIFRhc2tIYW5kbGVfdCBoVGFzayA9IChUYXNrSGFuZGxlX3QpdGhyZWFkX2lkOwogICBvc1N0YXR1c190IHN0YXQ7CkBAIC04MDYsNyArODQ4LDcgQEAKIH0KIAogb3NTdGF0dXNfdCBvc0RlbGF5VW50aWwgKHVpbnQzMl90IHRpY2tzKSB7Ci0gIFRpY2tUeXBlX3QgdGNudDsKKyAgVGlja1R5cGVfdCB0Y250LCBkZWxheTsKICAgb3NTdGF0dXNfdCBzdGF0OwogCiAgIGlmIChJU19JUlEoKSkgewpAQCAtODE2LDcgKzg1OCwxOCBAQAogICAgIHN0YXQgPSBvc09LOwogICAgIHRjbnQgPSB4VGFza0dldFRpY2tDb3VudCgpOwogCi0gICAgdlRhc2tEZWxheVVudGlsICgmdGNudCwgKFRpY2tUeXBlX3QpKHRpY2tzIC0gdGNudCkpOworICAgIC8qIERldGVybWluZSByZW1haW5pbmcgbnVtYmVyIG9mIHRpY2tzIHRvIGRlbGF5ICovCisgICAgZGVsYXkgPSAoVGlja1R5cGVfdCl0aWNrcyAtIHRjbnQ7CisKKyAgICAvKiBDaGVjayBpZiB0YXJnZXQgdGljayBoYXMgbm90IGV4cGlyZWQgKi8KKyAgICBpZigoZGVsYXkgIT0gMFUpICYmICgwID09IChkZWxheSA+PiAoOCAqIHNpemVvZihUaWNrVHlwZV90KSAtIDEpKSkpIHsKKyAgICAgIHZUYXNrRGVsYXlVbnRpbCAoJnRjbnQsIGRlbGF5KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIE5vIGRlbGF5IG9yIGFscmVhZHkgZXhwaXJlZCAqLworICAgICAgc3RhdCA9IG9zRXJyb3JQYXJhbWV0ZXI7CisgICAgfQogICB9CiAKICAgcmV0dXJuIChzdGF0KTsKQEAgLTEwNDMsNyArMTA5Niw3IEBACiAgIGVsc2UgaWYgKElTX0lSUSgpKSB7CiAgICAgeWllbGQgPSBwZEZBTFNFOwogCi0gICAgaWYgKHhFdmVudEdyb3VwU2V0Qml0c0Zyb21JU1IgKGhFdmVudEdyb3VwLCAoRXZlbnRCaXRzX3QpZmxhZ3MsICZ5aWVsZCkgIT0gcGRGQUlMKSB7CisgICAgaWYgKHhFdmVudEdyb3VwU2V0Qml0c0Zyb21JU1IgKGhFdmVudEdyb3VwLCAoRXZlbnRCaXRzX3QpZmxhZ3MsICZ5aWVsZCkgPT0gcGRGQUlMKSB7CiAgICAgICByZmxhZ3MgPSAodWludDMyX3Qpb3NFcnJvclJlc291cmNlOwogICAgIH0gZWxzZSB7CiAgICAgICByZmxhZ3MgPSBmbGFnczsKQEAgLTE0MTYsNyArMTQ2OSw3IEBACiAgICAgICAgICAgaFNlbWFwaG9yZSA9IHhTZW1hcGhvcmVDcmVhdGVDb3VudGluZyAobWF4X2NvdW50LCBpbml0aWFsX2NvdW50KTsKICAgICAgICAgfQogICAgICAgfQotCisgICAgICAKICAgICAgICNpZiAoY29uZmlnUVVFVUVfUkVHSVNUUllfU0laRSA+IDApCiAgICAgICBpZiAoaFNlbWFwaG9yZSAhPSBOVUxMKSB7CiAgICAgICAgIGlmIChhdHRyICE9IE5VTEwpIHsKZGlmZiAtLWdpdCBhL1NvdXJjZS9jcm91dGluZS5jIGIvU291cmNlL2Nyb3V0aW5lLmMKaW5kZXggYjcxNTg4NC4uNTZjOGFjMiAxMDA2NDQKLS0tIGEvU291cmNlL2Nyb3V0aW5lLmMKKysrIGIvU291cmNlL2Nyb3V0aW5lLmMKQEAgLTEsNiArMSw2IEBACiAvKgotICogRnJlZVJUT1MgS2VybmVsIFYxMC4wLjEKLSAqIENvcHlyaWdodCAoQykgMjAxNyBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMi4xCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgogICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgogICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KQEAgLTI2MCw3ICsyNjAsNyBAQAogCQkJCSggdm9pZCApIHV4TGlzdFJlbW92ZSggJiggcHhDUkNCLT54R2VuZXJpY0xpc3RJdGVtICkgKTsKIAogCQkJCS8qIElzIHRoZSBjby1yb3V0aW5lIHdhaXRpbmcgb24gYW4gZXZlbnQgYWxzbz8gKi8KLQkJCQlpZiggcHhDUkNCLT54RXZlbnRMaXN0SXRlbS5wdkNvbnRhaW5lciApCisJCQkJaWYoIHB4Q1JDQi0+eEV2ZW50TGlzdEl0ZW0ucHhDb250YWluZXIgKQogCQkJCXsKIAkJCQkJKCB2b2lkICkgdXhMaXN0UmVtb3ZlKCAmKCBweENSQ0ItPnhFdmVudExpc3RJdGVtICkgKTsKIAkJCQl9CmRpZmYgLS1naXQgYS9Tb3VyY2UvZXZlbnRfZ3JvdXBzLmMgYi9Tb3VyY2UvZXZlbnRfZ3JvdXBzLmMKaW5kZXggMTRkN2IwMi4uNjVhNWZmMiAxMDA2NDQKLS0tIGEvU291cmNlL2V2ZW50X2dyb3Vwcy5jCisrKyBiL1NvdXJjZS9ldmVudF9ncm91cHMuYwpAQCAtMSw2ICsxLDYgQEAKIC8qCi0gKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjAuMQotICogQ29weXJpZ2h0IChDKSAyMDE3IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRnJlZVJUT1MgS2VybmVsIFYxMC4yLjEKKyAqIENvcHlyaWdodCAoQykgMjAxOSBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCiAgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCiAgKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgpAQCAtMzksMTEgKzM5LDExIEBACiAjaW5jbHVkZSAidGltZXJzLmgiCiAjaW5jbHVkZSAiZXZlbnRfZ3JvdXBzLmgiCiAKLS8qIExpbnQgZTk2MSBhbmQgZTc1MCBhcmUgc3VwcHJlc3NlZCBhcyBhIE1JU1JBIGV4Y2VwdGlvbiBqdXN0aWZpZWQgYmVjYXVzZSB0aGUKLU1QVSBwb3J0cyByZXF1aXJlIE1QVV9XUkFQUEVSU19JTkNMVURFRF9GUk9NX0FQSV9GSUxFIHRvIGJlIGRlZmluZWQgZm9yIHRoZQotaGVhZGVyIGZpbGVzIGFib3ZlLCBidXQgbm90IGluIHRoaXMgZmlsZSwgaW4gb3JkZXIgdG8gZ2VuZXJhdGUgdGhlIGNvcnJlY3QKLXByaXZpbGVnZWQgVnMgdW5wcml2aWxlZ2VkIGxpbmthZ2UgYW5kIHBsYWNlbWVudC4gKi8KLSN1bmRlZiBNUFVfV1JBUFBFUlNfSU5DTFVERURfRlJPTV9BUElfRklMRSAvKmxpbnQgIWU5NjEgIWU3NTAuICovCisvKiBMaW50IGU5NjEsIGU3NTAgYW5kIGU5MDIxIGFyZSBzdXBwcmVzc2VkIGFzIGEgTUlTUkEgZXhjZXB0aW9uIGp1c3RpZmllZAorYmVjYXVzZSB0aGUgTVBVIHBvcnRzIHJlcXVpcmUgTVBVX1dSQVBQRVJTX0lOQ0xVREVEX0ZST01fQVBJX0ZJTEUgdG8gYmUgZGVmaW5lZAorZm9yIHRoZSBoZWFkZXIgZmlsZXMgYWJvdmUsIGJ1dCBub3QgaW4gdGhpcyBmaWxlLCBpbiBvcmRlciB0byBnZW5lcmF0ZSB0aGUKK2NvcnJlY3QgcHJpdmlsZWdlZCBWcyB1bnByaXZpbGVnZWQgbGlua2FnZSBhbmQgcGxhY2VtZW50LiAqLworI3VuZGVmIE1QVV9XUkFQUEVSU19JTkNMVURFRF9GUk9NX0FQSV9GSUxFIC8qbGludCAhZTk2MSAhZTc1MCAhZTkwMjEgU2VlIGNvbW1lbnQgYWJvdmUuICovCiAKIC8qIFRoZSBmb2xsb3dpbmcgYml0IGZpZWxkcyBjb252ZXkgY29udHJvbCBpbmZvcm1hdGlvbiBpbiBhIHRhc2sncyBldmVudCBsaXN0CiBpdGVtIHZhbHVlLiAgSXQgaXMgaW1wb3J0YW50IHRoZXkgZG9uJ3QgY2xhc2ggd2l0aCB0aGUKQEAgLTYwLDcgKzYwLDcgQEAKIAkjZGVmaW5lIGV2ZW50RVZFTlRfQklUU19DT05UUk9MX0JZVEVTCTB4ZmYwMDAwMDBVTAogI2VuZGlmCiAKLXR5cGVkZWYgc3RydWN0IHhFdmVudEdyb3VwRGVmaW5pdGlvbgordHlwZWRlZiBzdHJ1Y3QgRXZlbnRHcm91cERlZl90CiB7CiAJRXZlbnRCaXRzX3QgdXhFdmVudEJpdHM7CiAJTGlzdF90IHhUYXNrc1dhaXRpbmdGb3JCaXRzOwkJLyo8IExpc3Qgb2YgdGFza3Mgd2FpdGluZyBmb3IgYSBiaXQgdG8gYmUgc2V0LiAqLwpAQCAtMTA0LDExICsxMDQsMTEgQEAKIAkJCWV2ZW50IGdyb3VwIHN0cnVjdHVyZS4gKi8KIAkJCXZvbGF0aWxlIHNpemVfdCB4U2l6ZSA9IHNpemVvZiggU3RhdGljRXZlbnRHcm91cF90ICk7CiAJCQljb25maWdBU1NFUlQoIHhTaXplID09IHNpemVvZiggRXZlbnRHcm91cF90ICkgKTsKLQkJfQorCQl9IC8qbGludCAhZTUyOSB4U2l6ZSBpcyByZWZlcmVuY2VkIGlmIGNvbmZpZ0FTU0VSVCgpIGlzIGRlZmluZWQuICovCiAJCSNlbmRpZiAvKiBjb25maWdBU1NFUlRfREVGSU5FRCAqLwogCiAJCS8qIFRoZSB1c2VyIGhhcyBwcm92aWRlZCBhIHN0YXRpY2FsbHkgYWxsb2NhdGVkIGV2ZW50IGdyb3VwIC0gdXNlIGl0LiAqLwotCQlweEV2ZW50Qml0cyA9ICggRXZlbnRHcm91cF90ICogKSBweEV2ZW50R3JvdXBCdWZmZXI7IC8qbGludCAhZTc0MCBFdmVudEdyb3VwX3QgYW5kIFN0YXRpY0V2ZW50R3JvdXBfdCBhcmUgZ3VhcmFudGVlZCB0byBoYXZlIHRoZSBzYW1lIHNpemUgYW5kIGFsaWdubWVudCByZXF1aXJlbWVudCAtIGNoZWNrZWQgYnkgY29uZmlnQVNTRVJUKCkuICovCisJCXB4RXZlbnRCaXRzID0gKCBFdmVudEdyb3VwX3QgKiApIHB4RXZlbnRHcm91cEJ1ZmZlcjsgLypsaW50ICFlNzQwICFlOTA4NyBFdmVudEdyb3VwX3QgYW5kIFN0YXRpY0V2ZW50R3JvdXBfdCBhcmUgZGVsaWJlcmF0ZWx5IGFsaWFzZWQgZm9yIGRhdGEgaGlkaW5nIHB1cnBvc2VzIGFuZCBndWFyYW50ZWVkIHRvIGhhdmUgdGhlIHNhbWUgc2l6ZSBhbmQgYWxpZ25tZW50IHJlcXVpcmVtZW50IC0gY2hlY2tlZCBieSBjb25maWdBU1NFUlQoKS4gKi8KIAogCQlpZiggcHhFdmVudEJpdHMgIT0gTlVMTCApCiAJCXsKQEAgLTEyOCwxMCArMTI4LDEzIEBACiAJCX0KIAkJZWxzZQogCQl7CisJCQkvKiB4RXZlbnRHcm91cENyZWF0ZVN0YXRpYyBzaG91bGQgb25seSBldmVyIGJlIGNhbGxlZCB3aXRoCisJCQlweEV2ZW50R3JvdXBCdWZmZXIgcG9pbnRpbmcgdG8gYSBwcmUtYWxsb2NhdGVkIChjb21waWxlIHRpbWUKKwkJCWFsbG9jYXRlZCkgU3RhdGljRXZlbnRHcm91cF90IHZhcmlhYmxlLiAqLwogCQkJdHJhY2VFVkVOVF9HUk9VUF9DUkVBVEVfRkFJTEVEKCk7CiAJCX0KIAotCQlyZXR1cm4gKCBFdmVudEdyb3VwSGFuZGxlX3QgKSBweEV2ZW50Qml0czsKKwkJcmV0dXJuIHB4RXZlbnRCaXRzOwogCX0KIAogI2VuZGlmIC8qIGNvbmZpZ1NVUFBPUlRfU1RBVElDX0FMTE9DQVRJT04gKi8KQEAgLTE0Myw4ICsxNDYsMjAgQEAKIAl7CiAJRXZlbnRHcm91cF90ICpweEV2ZW50Qml0czsKIAotCQkvKiBBbGxvY2F0ZSB0aGUgZXZlbnQgZ3JvdXAuICovCi0JCXB4RXZlbnRCaXRzID0gKCBFdmVudEdyb3VwX3QgKiApIHB2UG9ydE1hbGxvYyggc2l6ZW9mKCBFdmVudEdyb3VwX3QgKSApOworCQkvKiBBbGxvY2F0ZSB0aGUgZXZlbnQgZ3JvdXAuICBKdXN0aWZpY2F0aW9uIGZvciBNSVNSQSBkZXZpYXRpb24gYXMKKwkJZm9sbG93czogIHB2UG9ydE1hbGxvYygpIGFsd2F5cyBlbnN1cmVzIHJldHVybmVkIG1lbW9yeSBibG9ja3MgYXJlCisJCWFsaWduZWQgcGVyIHRoZSByZXF1aXJlbWVudHMgb2YgdGhlIE1DVSBzdGFjay4gIEluIHRoaXMgY2FzZQorCQlwdlBvcnRNYWxsb2MoKSBtdXN0IHJldHVybiBhIHBvaW50ZXIgdGhhdCBpcyBndWFyYW50ZWVkIHRvIG1lZXQgdGhlCisJCWFsaWdubWVudCByZXF1aXJlbWVudHMgb2YgdGhlIEV2ZW50R3JvdXBfdCBzdHJ1Y3R1cmUgLSB3aGljaCAoaWYgeW91CisJCWZvbGxvdyBpdCB0aHJvdWdoKSBpcyB0aGUgYWxpZ25tZW50IHJlcXVpcmVtZW50cyBvZiB0aGUgVGlja1R5cGVfdCB0eXBlCisJCShFdmVudEJpdHNfdCBiZWluZyBvZiBUaWNrVHlwZV90IGl0c2VsZikuICBUaGVyZWZvcmUsIHdoZW5ldmVyIHRoZQorCQlzdGFjayBhbGlnbm1lbnQgcmVxdWlyZW1lbnRzIGFyZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlCisJCVRpY2tUeXBlX3QgYWxpZ25tZW50IHJlcXVpcmVtZW50cyB0aGUgY2FzdCBpcyBzYWZlLiAgSW4gb3RoZXIgY2FzZXMsCisJCXdoZXJlIHRoZSBuYXR1cmFsIHdvcmQgc2l6ZSBvZiB0aGUgYXJjaGl0ZWN0dXJlIGlzIGxlc3MgdGhhbgorCQlzaXplb2YoIFRpY2tUeXBlX3QgKSwgdGhlIFRpY2tUeXBlX3QgdmFyaWFibGVzIHdpbGwgYmUgYWNjZXNzZWQgaW4gdHdvCisJCW9yIG1vcmUgcmVhZHMgb3BlcmF0aW9ucywgYW5kIHRoZSBhbGlnbm1lbnQgcmVxdWlyZW1lbnRzIGlzIG9ubHkgdGhhdAorCQlvZiBlYWNoIGluZGl2aWR1YWwgcmVhZC4gKi8KKwkJcHhFdmVudEJpdHMgPSAoIEV2ZW50R3JvdXBfdCAqICkgcHZQb3J0TWFsbG9jKCBzaXplb2YoIEV2ZW50R3JvdXBfdCApICk7IC8qbGludCAhZTkwODcgIWU5MDc5IHNlZSBjb21tZW50IGFib3ZlLiAqLwogCiAJCWlmKCBweEV2ZW50Qml0cyAhPSBOVUxMICkKIAkJewpAQCAtMTY0LDEwICsxNzksMTAgQEAKIAkJfQogCQllbHNlCiAJCXsKLQkJCXRyYWNlRVZFTlRfR1JPVVBfQ1JFQVRFX0ZBSUxFRCgpOworCQkJdHJhY2VFVkVOVF9HUk9VUF9DUkVBVEVfRkFJTEVEKCk7IC8qbGludCAhZTkwNjMgRWxzZSBicmFuY2ggb25seSBleGlzdHMgdG8gYWxsb3cgdHJhY2luZyBhbmQgZG9lcyBub3QgZ2VuZXJhdGUgY29kZSBpZiB0cmFjZSBtYWNyb3MgYXJlIG5vdCBkZWZpbmVkLiAqLwogCQl9CiAKLQkJcmV0dXJuICggRXZlbnRHcm91cEhhbmRsZV90ICkgcHhFdmVudEJpdHM7CisJCXJldHVybiBweEV2ZW50Qml0czsKIAl9CiAKICNlbmRpZiAvKiBjb25maWdTVVBQT1JUX0RZTkFNSUNfQUxMT0NBVElPTiAqLwpAQCAtMTc2LDcgKzE5MSw3IEBACiBFdmVudEJpdHNfdCB4RXZlbnRHcm91cFN5bmMoIEV2ZW50R3JvdXBIYW5kbGVfdCB4RXZlbnRHcm91cCwgY29uc3QgRXZlbnRCaXRzX3QgdXhCaXRzVG9TZXQsIGNvbnN0IEV2ZW50Qml0c190IHV4Qml0c1RvV2FpdEZvciwgVGlja1R5cGVfdCB4VGlja3NUb1dhaXQgKQogewogRXZlbnRCaXRzX3QgdXhPcmlnaW5hbEJpdFZhbHVlLCB1eFJldHVybjsKLUV2ZW50R3JvdXBfdCAqcHhFdmVudEJpdHMgPSAoIEV2ZW50R3JvdXBfdCAqICkgeEV2ZW50R3JvdXA7CitFdmVudEdyb3VwX3QgKnB4RXZlbnRCaXRzID0geEV2ZW50R3JvdXA7CiBCYXNlVHlwZV90IHhBbHJlYWR5WWllbGRlZDsKIEJhc2VUeXBlX3QgeFRpbWVvdXRPY2N1cnJlZCA9IHBkRkFMU0U7CiAKQEAgLTI5NSw3ICszMTAsNyBAQAogCiBFdmVudEJpdHNfdCB4RXZlbnRHcm91cFdhaXRCaXRzKCBFdmVudEdyb3VwSGFuZGxlX3QgeEV2ZW50R3JvdXAsIGNvbnN0IEV2ZW50Qml0c190IHV4Qml0c1RvV2FpdEZvciwgY29uc3QgQmFzZVR5cGVfdCB4Q2xlYXJPbkV4aXQsIGNvbnN0IEJhc2VUeXBlX3QgeFdhaXRGb3JBbGxCaXRzLCBUaWNrVHlwZV90IHhUaWNrc1RvV2FpdCApCiB7Ci1FdmVudEdyb3VwX3QgKnB4RXZlbnRCaXRzID0gKCBFdmVudEdyb3VwX3QgKiApIHhFdmVudEdyb3VwOworRXZlbnRHcm91cF90ICpweEV2ZW50Qml0cyA9IHhFdmVudEdyb3VwOwogRXZlbnRCaXRzX3QgdXhSZXR1cm4sIHV4Q29udHJvbEJpdHMgPSAwOwogQmFzZVR5cGVfdCB4V2FpdENvbmRpdGlvbk1ldCwgeEFscmVhZHlZaWVsZGVkOwogQmFzZVR5cGVfdCB4VGltZW91dE9jY3VycmVkID0gcGRGQUxTRTsKQEAgLTQ0NSw3ICs0NjAsNyBAQAogCiBFdmVudEJpdHNfdCB4RXZlbnRHcm91cENsZWFyQml0cyggRXZlbnRHcm91cEhhbmRsZV90IHhFdmVudEdyb3VwLCBjb25zdCBFdmVudEJpdHNfdCB1eEJpdHNUb0NsZWFyICkKIHsKLUV2ZW50R3JvdXBfdCAqcHhFdmVudEJpdHMgPSAoIEV2ZW50R3JvdXBfdCAqICkgeEV2ZW50R3JvdXA7CitFdmVudEdyb3VwX3QgKnB4RXZlbnRCaXRzID0geEV2ZW50R3JvdXA7CiBFdmVudEJpdHNfdCB1eFJldHVybjsKIAogCS8qIENoZWNrIHRoZSB1c2VyIGlzIG5vdCBhdHRlbXB0aW5nIHRvIGNsZWFyIHRoZSBiaXRzIHVzZWQgYnkgdGhlIGtlcm5lbApAQCAtNDc3LDcgKzQ5Miw3IEBACiAJCUJhc2VUeXBlX3QgeFJldHVybjsKIAogCQl0cmFjZUVWRU5UX0dST1VQX0NMRUFSX0JJVFNfRlJPTV9JU1IoIHhFdmVudEdyb3VwLCB1eEJpdHNUb0NsZWFyICk7Ci0JCXhSZXR1cm4gPSB4VGltZXJQZW5kRnVuY3Rpb25DYWxsRnJvbUlTUiggdkV2ZW50R3JvdXBDbGVhckJpdHNDYWxsYmFjaywgKCB2b2lkICogKSB4RXZlbnRHcm91cCwgKCB1aW50MzJfdCApIHV4Qml0c1RvQ2xlYXIsIE5VTEwgKTsKKwkJeFJldHVybiA9IHhUaW1lclBlbmRGdW5jdGlvbkNhbGxGcm9tSVNSKCB2RXZlbnRHcm91cENsZWFyQml0c0NhbGxiYWNrLCAoIHZvaWQgKiApIHhFdmVudEdyb3VwLCAoIHVpbnQzMl90ICkgdXhCaXRzVG9DbGVhciwgTlVMTCApOyAvKmxpbnQgIWU5MDg3IENhbid0IGF2b2lkIGNhc3QgdG8gdm9pZCogYXMgYSBnZW5lcmljIGNhbGxiYWNrIGZ1bmN0aW9uIG5vdCBzcGVjaWZpYyB0byB0aGlzIHVzZSBjYXNlLiBDYWxsYmFjayBjYXN0cyBiYWNrIHRvIG9yaWdpbmFsIHR5cGUgc28gc2FmZS4gKi8KIAogCQlyZXR1cm4geFJldHVybjsKIAl9CkBAIC00ODgsNyArNTAzLDcgQEAKIEV2ZW50Qml0c190IHhFdmVudEdyb3VwR2V0Qml0c0Zyb21JU1IoIEV2ZW50R3JvdXBIYW5kbGVfdCB4RXZlbnRHcm91cCApCiB7CiBVQmFzZVR5cGVfdCB1eFNhdmVkSW50ZXJydXB0U3RhdHVzOwotRXZlbnRHcm91cF90ICpweEV2ZW50Qml0cyA9ICggRXZlbnRHcm91cF90ICogKSB4RXZlbnRHcm91cDsKK0V2ZW50R3JvdXBfdCBjb25zdCAqIGNvbnN0IHB4RXZlbnRCaXRzID0geEV2ZW50R3JvdXA7CiBFdmVudEJpdHNfdCB1eFJldHVybjsKIAogCXV4U2F2ZWRJbnRlcnJ1cHRTdGF0dXMgPSBwb3J0U0VUX0lOVEVSUlVQVF9NQVNLX0ZST01fSVNSKCk7CkBAIC00OTgsMTYgKzUxMywxNiBAQAogCXBvcnRDTEVBUl9JTlRFUlJVUFRfTUFTS19GUk9NX0lTUiggdXhTYXZlZEludGVycnVwdFN0YXR1cyApOwogCiAJcmV0dXJuIHV4UmV0dXJuOwotfQorfSAvKmxpbnQgIWU4MTggRXZlbnRHcm91cEhhbmRsZV90IGlzIGEgdHlwZWRlZiB1c2VkIGluIG90aGVyIGZ1bmN0aW9ucyB0byBzbyBjYW4ndCBiZSBwb2ludGVyIHRvIGNvbnN0LiAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKIEV2ZW50Qml0c190IHhFdmVudEdyb3VwU2V0Qml0cyggRXZlbnRHcm91cEhhbmRsZV90IHhFdmVudEdyb3VwLCBjb25zdCBFdmVudEJpdHNfdCB1eEJpdHNUb1NldCApCiB7CiBMaXN0SXRlbV90ICpweExpc3RJdGVtLCAqcHhOZXh0OwogTGlzdEl0ZW1fdCBjb25zdCAqcHhMaXN0RW5kOwotTGlzdF90ICpweExpc3Q7CitMaXN0X3QgY29uc3QgKiBweExpc3Q7CiBFdmVudEJpdHNfdCB1eEJpdHNUb0NsZWFyID0gMCwgdXhCaXRzV2FpdGVkRm9yLCB1eENvbnRyb2xCaXRzOwotRXZlbnRHcm91cF90ICpweEV2ZW50Qml0cyA9ICggRXZlbnRHcm91cF90ICogKSB4RXZlbnRHcm91cDsKK0V2ZW50R3JvdXBfdCAqcHhFdmVudEJpdHMgPSB4RXZlbnRHcm91cDsKIEJhc2VUeXBlX3QgeE1hdGNoRm91bmQgPSBwZEZBTFNFOwogCiAJLyogQ2hlY2sgdGhlIHVzZXIgaXMgbm90IGF0dGVtcHRpbmcgdG8gc2V0IHRoZSBiaXRzIHVzZWQgYnkgdGhlIGtlcm5lbApAQCAtNTE2LDcgKzUzMSw3IEBACiAJY29uZmlnQVNTRVJUKCAoIHV4Qml0c1RvU2V0ICYgZXZlbnRFVkVOVF9CSVRTX0NPTlRST0xfQllURVMgKSA9PSAwICk7CiAKIAlweExpc3QgPSAmKCBweEV2ZW50Qml0cy0+eFRhc2tzV2FpdGluZ0ZvckJpdHMgKTsKLQlweExpc3RFbmQgPSBsaXN0R0VUX0VORF9NQVJLRVIoIHB4TGlzdCApOyAvKmxpbnQgIWU4MjYgIWU3NDAgVGhlIG1pbmkgbGlzdCBzdHJ1Y3R1cmUgaXMgdXNlZCBhcyB0aGUgbGlzdCBlbmQgdG8gc2F2ZSBSQU0uICBUaGlzIGlzIGNoZWNrZWQgYW5kIHZhbGlkLiAqLworCXB4TGlzdEVuZCA9IGxpc3RHRVRfRU5EX01BUktFUiggcHhMaXN0ICk7IC8qbGludCAhZTgyNiAhZTc0MCAhZTkwODcgVGhlIG1pbmkgbGlzdCBzdHJ1Y3R1cmUgaXMgdXNlZCBhcyB0aGUgbGlzdCBlbmQgdG8gc2F2ZSBSQU0uICBUaGlzIGlzIGNoZWNrZWQgYW5kIHZhbGlkLiAqLwogCXZUYXNrU3VzcGVuZEFsbCgpOwogCXsKIAkJdHJhY2VFVkVOVF9HUk9VUF9TRVRfQklUUyggeEV2ZW50R3JvdXAsIHV4Qml0c1RvU2V0ICk7CkBAIC01OTcsNyArNjEyLDcgQEAKIAogdm9pZCB2RXZlbnRHcm91cERlbGV0ZSggRXZlbnRHcm91cEhhbmRsZV90IHhFdmVudEdyb3VwICkKIHsKLUV2ZW50R3JvdXBfdCAqcHhFdmVudEJpdHMgPSAoIEV2ZW50R3JvdXBfdCAqICkgeEV2ZW50R3JvdXA7CitFdmVudEdyb3VwX3QgKnB4RXZlbnRCaXRzID0geEV2ZW50R3JvdXA7CiBjb25zdCBMaXN0X3QgKnB4VGFza3NXYWl0aW5nRm9yQml0cyA9ICYoIHB4RXZlbnRCaXRzLT54VGFza3NXYWl0aW5nRm9yQml0cyApOwogCiAJdlRhc2tTdXNwZW5kQWxsKCk7CkBAIC02NDEsNyArNjU2LDcgQEAKIGFuIGludGVycnVwdC4gKi8KIHZvaWQgdkV2ZW50R3JvdXBTZXRCaXRzQ2FsbGJhY2soIHZvaWQgKnB2RXZlbnRHcm91cCwgY29uc3QgdWludDMyX3QgdWxCaXRzVG9TZXQgKQogewotCSggdm9pZCApIHhFdmVudEdyb3VwU2V0Qml0cyggcHZFdmVudEdyb3VwLCAoIEV2ZW50Qml0c190ICkgdWxCaXRzVG9TZXQgKTsKKwkoIHZvaWQgKSB4RXZlbnRHcm91cFNldEJpdHMoIHB2RXZlbnRHcm91cCwgKCBFdmVudEJpdHNfdCApIHVsQml0c1RvU2V0ICk7IC8qbGludCAhZTkwNzkgQ2FuJ3QgYXZvaWQgY2FzdCB0byB2b2lkKiBhcyBhIGdlbmVyaWMgdGltZXIgY2FsbGJhY2sgcHJvdG90eXBlLiBDYWxsYmFjayBjYXN0cyBiYWNrIHRvIG9yaWdpbmFsIHR5cGUgc28gc2FmZS4gKi8KIH0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCkBAIC02NDksNyArNjY0LDcgQEAKIGFuIGludGVycnVwdC4gKi8KIHZvaWQgdkV2ZW50R3JvdXBDbGVhckJpdHNDYWxsYmFjayggdm9pZCAqcHZFdmVudEdyb3VwLCBjb25zdCB1aW50MzJfdCB1bEJpdHNUb0NsZWFyICkKIHsKLQkoIHZvaWQgKSB4RXZlbnRHcm91cENsZWFyQml0cyggcHZFdmVudEdyb3VwLCAoIEV2ZW50Qml0c190ICkgdWxCaXRzVG9DbGVhciApOworCSggdm9pZCApIHhFdmVudEdyb3VwQ2xlYXJCaXRzKCBwdkV2ZW50R3JvdXAsICggRXZlbnRCaXRzX3QgKSB1bEJpdHNUb0NsZWFyICk7IC8qbGludCAhZTkwNzkgQ2FuJ3QgYXZvaWQgY2FzdCB0byB2b2lkKiBhcyBhIGdlbmVyaWMgdGltZXIgY2FsbGJhY2sgcHJvdG90eXBlLiBDYWxsYmFjayBjYXN0cyBiYWNrIHRvIG9yaWdpbmFsIHR5cGUgc28gc2FmZS4gKi8KIH0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCkBAIC02OTUsNyArNzEwLDcgQEAKIAlCYXNlVHlwZV90IHhSZXR1cm47CiAKIAkJdHJhY2VFVkVOVF9HUk9VUF9TRVRfQklUU19GUk9NX0lTUiggeEV2ZW50R3JvdXAsIHV4Qml0c1RvU2V0ICk7Ci0JCXhSZXR1cm4gPSB4VGltZXJQZW5kRnVuY3Rpb25DYWxsRnJvbUlTUiggdkV2ZW50R3JvdXBTZXRCaXRzQ2FsbGJhY2ssICggdm9pZCAqICkgeEV2ZW50R3JvdXAsICggdWludDMyX3QgKSB1eEJpdHNUb1NldCwgcHhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbiApOworCQl4UmV0dXJuID0geFRpbWVyUGVuZEZ1bmN0aW9uQ2FsbEZyb21JU1IoIHZFdmVudEdyb3VwU2V0Qml0c0NhbGxiYWNrLCAoIHZvaWQgKiApIHhFdmVudEdyb3VwLCAoIHVpbnQzMl90ICkgdXhCaXRzVG9TZXQsIHB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gKTsgLypsaW50ICFlOTA4NyBDYW4ndCBhdm9pZCBjYXN0IHRvIHZvaWQqIGFzIGEgZ2VuZXJpYyBjYWxsYmFjayBmdW5jdGlvbiBub3Qgc3BlY2lmaWMgdG8gdGhpcyB1c2UgY2FzZS4gQ2FsbGJhY2sgY2FzdHMgYmFjayB0byBvcmlnaW5hbCB0eXBlIHNvIHNhZmUuICovCiAKIAkJcmV0dXJuIHhSZXR1cm47CiAJfQpAQCAtNzA4LDcgKzcyMyw3IEBACiAJVUJhc2VUeXBlX3QgdXhFdmVudEdyb3VwR2V0TnVtYmVyKCB2b2lkKiB4RXZlbnRHcm91cCApCiAJewogCVVCYXNlVHlwZV90IHhSZXR1cm47Ci0JRXZlbnRHcm91cF90ICpweEV2ZW50Qml0cyA9ICggRXZlbnRHcm91cF90ICogKSB4RXZlbnRHcm91cDsKKwlFdmVudEdyb3VwX3QgY29uc3QgKnB4RXZlbnRCaXRzID0gKCBFdmVudEdyb3VwX3QgKiApIHhFdmVudEdyb3VwOyAvKmxpbnQgIWU5MDg3ICFlOTA3OSBFdmVudEdyb3VwSGFuZGxlX3QgaXMgYSBwb2ludGVyIHRvIGFuIEV2ZW50R3JvdXBfdCwgYnV0IEV2ZW50R3JvdXBIYW5kbGVfdCBpcyBrZXB0IG9wYXF1ZSBvdXRzaWRlIG9mIHRoaXMgZmlsZSBmb3IgZGF0YSBoaWRpbmcgcHVycG9zZXMuICovCiAKIAkJaWYoIHhFdmVudEdyb3VwID09IE5VTEwgKQogCQl7CkBAIC03MjksNyArNzQ0LDcgQEAKIAogCXZvaWQgdkV2ZW50R3JvdXBTZXROdW1iZXIoIHZvaWQgKiB4RXZlbnRHcm91cCwgVUJhc2VUeXBlX3QgdXhFdmVudEdyb3VwTnVtYmVyICkKIAl7Ci0JCSggKCBFdmVudEdyb3VwX3QgKiApIHhFdmVudEdyb3VwICktPnV4RXZlbnRHcm91cE51bWJlciA9IHV4RXZlbnRHcm91cE51bWJlcjsKKwkJKCAoIEV2ZW50R3JvdXBfdCAqICkgeEV2ZW50R3JvdXAgKS0+dXhFdmVudEdyb3VwTnVtYmVyID0gdXhFdmVudEdyb3VwTnVtYmVyOyAvKmxpbnQgIWU5MDg3ICFlOTA3OSBFdmVudEdyb3VwSGFuZGxlX3QgaXMgYSBwb2ludGVyIHRvIGFuIEV2ZW50R3JvdXBfdCwgYnV0IEV2ZW50R3JvdXBIYW5kbGVfdCBpcyBrZXB0IG9wYXF1ZSBvdXRzaWRlIG9mIHRoaXMgZmlsZSBmb3IgZGF0YSBoaWRpbmcgcHVycG9zZXMuICovCiAJfQogCiAjZW5kaWYgLyogY29uZmlnVVNFX1RSQUNFX0ZBQ0lMSVRZICovCmRpZmYgLS1naXQgYS9Tb3VyY2UvaW5jbHVkZS9GcmVlUlRPUy5oIGIvU291cmNlL2luY2x1ZGUvRnJlZVJUT1MuaAppbmRleCA3OGQxNzZhLi45ZDA5ZDkxIDEwMDY0NAotLS0gYS9Tb3VyY2UvaW5jbHVkZS9GcmVlUlRPUy5oCisrKyBiL1NvdXJjZS9pbmNsdWRlL0ZyZWVSVE9TLmgKQEAgLTEsNiArMSw2IEBACiAvKgotICogRnJlZVJUT1MgS2VybmVsIFYxMC4wLjEKLSAqIENvcHlyaWdodCAoQykgMjAxNyBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMi4xCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgogICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgogICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KQEAgLTE1Niw2ICsxNTYsMTAgQEAKIAkjZGVmaW5lIElOQ0xVREVfdXhUYXNrR2V0U3RhY2tIaWdoV2F0ZXJNYXJrIDAKICNlbmRpZgogCisjaWZuZGVmIElOQ0xVREVfdXhUYXNrR2V0U3RhY2tIaWdoV2F0ZXJNYXJrMgorCSNkZWZpbmUgSU5DTFVERV91eFRhc2tHZXRTdGFja0hpZ2hXYXRlck1hcmsyIDAKKyNlbmRpZgorCiAjaWZuZGVmIElOQ0xVREVfZVRhc2tHZXRTdGF0ZQogCSNkZWZpbmUgSU5DTFVERV9lVGFza0dldFN0YXRlIDAKICNlbmRpZgpAQCAtMjM3LDYgKzI0MSwxMCBAQAogCSNkZWZpbmUgY29uZmlnQVNTRVJUX0RFRklORUQgMQogI2VuZGlmCiAKKyNpZm5kZWYgcG9ydE1FTU9SWV9CQVJSSUVSCisJI2RlZmluZSBwb3J0TUVNT1JZX0JBUlJJRVIoKQorI2VuZGlmCisKIC8qIFRoZSB0aW1lcnMgbW9kdWxlIHJlbGllcyBvbiB4VGFza0dldFNjaGVkdWxlclN0YXRlKCkuICovCiAjaWYgY29uZmlnVVNFX1RJTUVSUyA9PSAxCiAKQEAgLTc1OCw4ICs3NjYsMTIgQEAKIAkjZGVmaW5lIHBvcnRUQVNLX1VTRVNfRkxPQVRJTkdfUE9JTlQoKQogI2VuZGlmCiAKLSNpZm5kZWYgcG9ydFRBU0tfQ0FMTFNfU0VDVVJFX0ZVTkNUSU9OUwotCSNkZWZpbmUgcG9ydFRBU0tfQ0FMTFNfU0VDVVJFX0ZVTkNUSU9OUygpCisjaWZuZGVmIHBvcnRBTExPQ0FURV9TRUNVUkVfQ09OVEVYVAorCSNkZWZpbmUgcG9ydEFMTE9DQVRFX1NFQ1VSRV9DT05URVhUKCB1bFNlY3VyZVN0YWNrU2l6ZSApCisjZW5kaWYKKworI2lmbmRlZiBwb3J0RE9OVF9ESVNDQVJECisJI2RlZmluZSBwb3J0RE9OVF9ESVNDQVJECiAjZW5kaWYKIAogI2lmbmRlZiBjb25maWdVU0VfVElNRV9TTElDSU5HCkBAIC04MDYsNiArODE4LDEwIEBACiAJI2RlZmluZSBjb25maWdVU0VfVEFTS19OT1RJRklDQVRJT05TIDEKICNlbmRpZgogCisjaWZuZGVmIGNvbmZpZ1VTRV9QT1NJWF9FUlJOTworCSNkZWZpbmUgY29uZmlnVVNFX1BPU0lYX0VSUk5PIDAKKyNlbmRpZgorCiAjaWZuZGVmIHBvcnRUSUNLX1RZUEVfSVNfQVRPTUlDCiAJI2RlZmluZSBwb3J0VElDS19UWVBFX0lTX0FUT01JQyAwCiAjZW5kaWYKQEAgLTgyNiw2ICs4NDIsMTMgQEAKIAkjZGVmaW5lIGNvbmZpZ1NUQUNLX0RFUFRIX1RZUEUgdWludDE2X3QKICNlbmRpZgogCisjaWZuZGVmIGNvbmZpZ01FU1NBR0VfQlVGRkVSX0xFTkdUSF9UWVBFCisJLyogRGVmYXVsdHMgdG8gc2l6ZV90IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCBidXQgY2FuIGJlIG92ZXJyaWRkZW4KKwlpbiBGcmVlUlRPU0NvbmZpZy5oIGlmIGxlbmd0aHMgd2lsbCBhbHdheXMgYmUgbGVzcyB0aGFuIHRoZSBudW1iZXIgb2YgYnl0ZXMKKwlpbiBhIHNpemVfdC4gKi8KKwkjZGVmaW5lIGNvbmZpZ01FU1NBR0VfQlVGRkVSX0xFTkdUSF9UWVBFIHNpemVfdAorI2VuZGlmCisKIC8qIFNhbml0eSBjaGVjayB0aGUgY29uZmlndXJhdGlvbi4gKi8KICNpZiggY29uZmlnVVNFX1RJQ0tMRVNTX0lETEUgIT0gMCApCiAJI2lmKCBJTkNMVURFX3ZUYXNrU3VzcGVuZCAhPSAxICkKQEAgLTkyMSw2ICs5NDQsMTAgQEAKIAkjZGVmaW5lIHBkVEFTS19DT0RFIFRhc2tGdW5jdGlvbl90CiAJI2RlZmluZSB4TGlzdEl0ZW0gTGlzdEl0ZW1fdAogCSNkZWZpbmUgeExpc3QgTGlzdF90CisKKwkvKiBGb3IgbGlicmFyaWVzIHRoYXQgYnJlYWsgdGhlIGxpc3QgZGF0YSBoaWRpbmcsIGFuZCBhY2Nlc3MgbGlzdCBzdHJ1Y3R1cmUKKwltZW1iZXJzIGRpcmVjdGx5ICh3aGljaCBpcyBub3Qgc3VwcG9zZWQgdG8gYmUgZG9uZSkuICovCisJI2RlZmluZSBweENvbnRhaW5lciBwdkNvbnRhaW5lcgogI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9CQUNLV0FSRF9DT01QQVRJQklMSVRZICovCiAKICNpZiggY29uZmlnVVNFX0FMVEVSTkFUSVZFX0FQSSAhPSAwICkKQEAgLTkzNSw2ICs5NjIsNzUgQEAKIAkjZGVmaW5lIGNvbmZpZ1VTRV9UQVNLX0ZQVV9TVVBQT1JUIDEKICNlbmRpZgogCisvKiBTZXQgY29uZmlnRU5BQkxFX01QVSB0byAxIHRvIGVuYWJsZSBNUFUgc3VwcG9ydCBhbmQgMCB0byBkaXNhYmxlIGl0LiBUaGlzIGlzCitjdXJyZW50bHkgdXNlZCBpbiBBUk12OE0gcG9ydHMuICovCisjaWZuZGVmIGNvbmZpZ0VOQUJMRV9NUFUKKwkjZGVmaW5lIGNvbmZpZ0VOQUJMRV9NUFUgMAorI2VuZGlmCisKKy8qIFNldCBjb25maWdFTkFCTEVfRlBVIHRvIDEgdG8gZW5hYmxlIEZQVSBzdXBwb3J0IGFuZCAwIHRvIGRpc2FibGUgaXQuIFRoaXMgaXMKK2N1cnJlbnRseSB1c2VkIGluIEFSTXY4TSBwb3J0cy4gKi8KKyNpZm5kZWYgY29uZmlnRU5BQkxFX0ZQVQorCSNkZWZpbmUgY29uZmlnRU5BQkxFX0ZQVSAxCisjZW5kaWYKKworLyogU2V0IGNvbmZpZ0VOQUJMRV9UUlVTVFpPTkUgdG8gMSBlbmFibGUgVHJ1c3Rab25lIHN1cHBvcnQgYW5kIDAgdG8gZGlzYWJsZSBpdC4KK1RoaXMgaXMgY3VycmVudGx5IHVzZWQgaW4gQVJNdjhNIHBvcnRzLiAqLworI2lmbmRlZiBjb25maWdFTkFCTEVfVFJVU1RaT05FCisJI2RlZmluZSBjb25maWdFTkFCTEVfVFJVU1RaT05FIDEKKyNlbmRpZgorCisvKiBTZXQgY29uZmlnUlVOX0ZSRUVSVE9TX1NFQ1VSRV9PTkxZIHRvIDEgdG8gcnVuIHRoZSBGcmVlUlRPUyBBUk12OE0gcG9ydCBvbgordGhlIFNlY3VyZSBTaWRlIG9ubHkuICovCisjaWZuZGVmIGNvbmZpZ1JVTl9GUkVFUlRPU19TRUNVUkVfT05MWQorCSNkZWZpbmUgY29uZmlnUlVOX0ZSRUVSVE9TX1NFQ1VSRV9PTkxZIDAKKyNlbmRpZgorCisvKiBTb21ldGltZXMgdGhlIEZyZWVSVE9TQ29uZmlnLmggc2V0dGluZ3Mgb25seSBhbGxvdyBhIHRhc2sgdG8gYmUgY3JlYXRlZCB1c2luZworICogZHluYW1pY2FsbHkgYWxsb2NhdGVkIFJBTSwgaW4gd2hpY2ggY2FzZSB3aGVuIGFueSB0YXNrIGlzIGRlbGV0ZWQgaXQgaXMga25vd24KKyAqIHRoYXQgYm90aCB0aGUgdGFzaydzIHN0YWNrIGFuZCBUQ0IgbmVlZCB0byBiZSBmcmVlZC4gIFNvbWV0aW1lcyB0aGUKKyAqIEZyZWVSVE9TQ29uZmlnLmggc2V0dGluZ3Mgb25seSBhbGxvdyBhIHRhc2sgdG8gYmUgY3JlYXRlZCB1c2luZyBzdGF0aWNhbGx5CisgKiBhbGxvY2F0ZWQgUkFNLCBpbiB3aGljaCBjYXNlIHdoZW4gYW55IHRhc2sgaXMgZGVsZXRlZCBpdCBpcyBrbm93biB0aGF0IG5laXRoZXIKKyAqIHRoZSB0YXNrJ3Mgc3RhY2sgb3IgVENCIHNob3VsZCBiZSBmcmVlZC4gIFNvbWV0aW1lcyB0aGUgRnJlZVJUT1NDb25maWcuaAorICogc2V0dGluZ3MgYWxsb3cgYSB0YXNrIHRvIGJlIGNyZWF0ZWQgdXNpbmcgZWl0aGVyIHN0YXRpY2FsbHkgb3IgZHluYW1pY2FsbHkKKyAqIGFsbG9jYXRlZCBSQU0sIGluIHdoaWNoIGNhc2UgYSBtZW1iZXIgb2YgdGhlIFRDQiBpcyB1c2VkIHRvIHJlY29yZCB3aGV0aGVyIHRoZQorICogc3RhY2sgYW5kL29yIFRDQiB3ZXJlIGFsbG9jYXRlZCBzdGF0aWNhbGx5IG9yIGR5bmFtaWNhbGx5LCBzbyB3aGVuIGEgdGFzayBpcworICogZGVsZXRlZCB0aGUgUkFNIHRoYXQgd2FzIGFsbG9jYXRlZCBkeW5hbWljYWxseSBpcyBmcmVlZCBhZ2FpbiBhbmQgbm8gYXR0ZW1wdCBpcworICogbWFkZSB0byBmcmVlIHRoZSBSQU0gdGhhdCB3YXMgYWxsb2NhdGVkIHN0YXRpY2FsbHkuCisgKiB0c2tTVEFUSUNfQU5EX0RZTkFNSUNfQUxMT0NBVElPTl9QT1NTSUJMRSBpcyBvbmx5IHRydWUgaWYgaXQgaXMgcG9zc2libGUgZm9yIGEKKyAqIHRhc2sgdG8gYmUgY3JlYXRlZCB1c2luZyBlaXRoZXIgc3RhdGljYWxseSBvciBkeW5hbWljYWxseSBhbGxvY2F0ZWQgUkFNLiAgTm90ZQorICogdGhhdCBpZiBwb3J0VVNJTkdfTVBVX1dSQVBQRVJTIGlzIDEgdGhlbiBhIHByb3RlY3RlZCB0YXNrIGNhbiBiZSBjcmVhdGVkIHdpdGgKKyAqIGEgc3RhdGljYWxseSBhbGxvY2F0ZWQgc3RhY2sgYW5kIGEgZHluYW1pY2FsbHkgYWxsb2NhdGVkIFRDQi4KKyAqCisgKiBUaGUgZm9sbG93aW5nIHRhYmxlIGxpc3RzIHZhcmlvdXMgY29tYmluYXRpb25zIG9mIHBvcnRVU0lOR19NUFVfV1JBUFBFUlMsCisgKiBjb25maWdTVVBQT1JUX0RZTkFNSUNfQUxMT0NBVElPTiBhbmQgY29uZmlnU1VQUE9SVF9TVEFUSUNfQUxMT0NBVElPTiBhbmQKKyAqIHdoZW4gaXQgaXMgcG9zc2libGUgdG8gaGF2ZSBib3RoIHN0YXRpYyBhbmQgZHluYW1pYyBhbGxvY2F0aW9uOgorICogICstLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKworICogfCBNUFUgfCBEeW5hbWljIHwgU3RhdGljIHwgICAgIEF2YWlsYWJsZSBGdW5jdGlvbnMgICAgIHwgICAgICAgUG9zc2libGUgQWxsb2NhdGlvbnMgICAgICAgIHwgQm90aCBEeW5hbWljIGFuZCB8IE5lZWQgRnJlZSB8CisgKiB8ICAgICB8ICAgICAgICAgfCAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTdGF0aWMgUG9zc2libGUgIHwgICAgICAgICAgIHwKKyAqICstLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKworICogfCAwICAgfCAwICAgICAgIHwgMSAgICAgIHwgeFRhc2tDcmVhdGVTdGF0aWMgICAgICAgICAgIHwgVENCIC0gU3RhdGljLCBTdGFjayAtIFN0YXRpYyAgICAgIHwgTm8gICAgICAgICAgICAgICB8IE5vICAgICAgICB8CisgKiArLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwKKyAqIHwgMCAgIHwgMSAgICAgICB8IDAgICAgICB8IHhUYXNrQ3JlYXRlICAgICAgICAgICAgICAgICB8IFRDQiAtIER5bmFtaWMsIFN0YWNrIC0gRHluYW1pYyAgICB8IE5vICAgICAgICAgICAgICAgfCBZZXMgICAgICAgfAorICogKy0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS18CisgKiB8IDAgICB8IDEgICAgICAgfCAxICAgICAgfCB4VGFza0NyZWF0ZSwgICAgICAgICAgICAgICAgfCAxLiBUQ0IgLSBEeW5hbWljLCBTdGFjayAtIER5bmFtaWMgfCBZZXMgICAgICAgICAgICAgIHwgWWVzICAgICAgIHwKKyAqIHwgICAgIHwgICAgICAgICB8ICAgICAgICB8IHhUYXNrQ3JlYXRlU3RhdGljICAgICAgICAgICB8IDIuIFRDQiAtIFN0YXRpYywgU3RhY2sgLSBTdGF0aWMgICB8ICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfAorICogKy0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS18CisgKiB8IDEgICB8IDAgICAgICAgfCAxICAgICAgfCB4VGFza0NyZWF0ZVN0YXRpYywgICAgICAgICAgfCBUQ0IgLSBTdGF0aWMsIFN0YWNrIC0gU3RhdGljICAgICAgfCBObyAgICAgICAgICAgICAgIHwgTm8gICAgICAgIHwKKyAqIHwgICAgIHwgICAgICAgICB8ICAgICAgICB8IHhUYXNrQ3JlYXRlUmVzdHJpY3RlZFN0YXRpYyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfAorICogKy0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS18CisgKiB8IDEgICB8IDEgICAgICAgfCAwICAgICAgfCB4VGFza0NyZWF0ZSwgICAgICAgICAgICAgICAgfCAxLiBUQ0IgLSBEeW5hbWljLCBTdGFjayAtIER5bmFtaWMgfCBZZXMgICAgICAgICAgICAgIHwgWWVzICAgICAgIHwKKyAqIHwgICAgIHwgICAgICAgICB8ICAgICAgICB8IHhUYXNrQ3JlYXRlUmVzdHJpY3RlZCAgICAgICB8IDIuIFRDQiAtIER5bmFtaWMsIFN0YWNrIC0gU3RhdGljICB8ICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfAorICogKy0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS18CisgKiB8IDEgICB8IDEgICAgICAgfCAxICAgICAgfCB4VGFza0NyZWF0ZSwgICAgICAgICAgICAgICAgfCAxLiBUQ0IgLSBEeW5hbWljLCBTdGFjayAtIER5bmFtaWMgfCBZZXMgICAgICAgICAgICAgIHwgWWVzICAgICAgIHwKKyAqIHwgICAgIHwgICAgICAgICB8ICAgICAgICB8IHhUYXNrQ3JlYXRlU3RhdGljLCAgICAgICAgICB8IDIuIFRDQiAtIER5bmFtaWMsIFN0YWNrIC0gU3RhdGljICB8ICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfAorICogfCAgICAgfCAgICAgICAgIHwgICAgICAgIHwgeFRhc2tDcmVhdGVSZXN0cmljdGVkLCAgICAgIHwgMy4gVENCIC0gU3RhdGljLCBTdGFjayAtIFN0YXRpYyAgIHwgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8CisgKiB8ICAgICB8ICAgICAgICAgfCAgICAgICAgfCB4VGFza0NyZWF0ZVJlc3RyaWN0ZWRTdGF0aWMgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwKKyAqICstLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKworICovCisjZGVmaW5lIHRza1NUQVRJQ19BTkRfRFlOQU1JQ19BTExPQ0FUSU9OX1BPU1NJQkxFCSggKCAoIHBvcnRVU0lOR19NUFVfV1JBUFBFUlMgPT0gMCApICYmICggY29uZmlnU1VQUE9SVF9EWU5BTUlDX0FMTE9DQVRJT04gPT0gMSApICYmICggY29uZmlnU1VQUE9SVF9TVEFUSUNfQUxMT0NBVElPTiA9PSAxICkgKSB8fCBcCisJCQkJCQkJCQkJCQkJICAoICggcG9ydFVTSU5HX01QVV9XUkFQUEVSUyA9PSAxICkgJiYgKCBjb25maWdTVVBQT1JUX0RZTkFNSUNfQUxMT0NBVElPTiA9PSAxICkgKSApCisKIC8qCiAgKiBJbiBsaW5lIHdpdGggc29mdHdhcmUgZW5naW5lZXJpbmcgYmVzdCBwcmFjdGljZSwgRnJlZVJUT1MgaW1wbGVtZW50cyBhIHN0cmljdAogICogZGF0YSBoaWRpbmcgcG9saWN5LCBzbyB0aGUgcmVhbCBzdHJ1Y3R1cmVzIHVzZWQgYnkgRnJlZVJUT1MgdG8gbWFpbnRhaW4gdGhlCkBAIC05NDcsMjUgKzEwNDMsNDAgQEAKICAqLwogc3RydWN0IHhTVEFUSUNfTElTVF9JVEVNCiB7Ci0JVGlja1R5cGVfdCB4RHVtbXkxOwotCXZvaWQgKnB2RHVtbXkyWyA0IF07CisJI2lmKCBjb25maWdVU0VfTElTVF9EQVRBX0lOVEVHUklUWV9DSEVDS19CWVRFUyA9PSAxICkKKwkJVGlja1R5cGVfdCB4RHVtbXkxOworCSNlbmRpZgorCVRpY2tUeXBlX3QgeER1bW15MjsKKwl2b2lkICpwdkR1bW15M1sgNCBdOworCSNpZiggY29uZmlnVVNFX0xJU1RfREFUQV9JTlRFR1JJVFlfQ0hFQ0tfQllURVMgPT0gMSApCisJCVRpY2tUeXBlX3QgeER1bW15NDsKKwkjZW5kaWYKIH07CiB0eXBlZGVmIHN0cnVjdCB4U1RBVElDX0xJU1RfSVRFTSBTdGF0aWNMaXN0SXRlbV90OwogCiAvKiBTZWUgdGhlIGNvbW1lbnRzIGFib3ZlIHRoZSBzdHJ1Y3QgeFNUQVRJQ19MSVNUX0lURU0gZGVmaW5pdGlvbi4gKi8KIHN0cnVjdCB4U1RBVElDX01JTklfTElTVF9JVEVNCiB7Ci0JVGlja1R5cGVfdCB4RHVtbXkxOwotCXZvaWQgKnB2RHVtbXkyWyAyIF07CisJI2lmKCBjb25maWdVU0VfTElTVF9EQVRBX0lOVEVHUklUWV9DSEVDS19CWVRFUyA9PSAxICkKKwkJVGlja1R5cGVfdCB4RHVtbXkxOworCSNlbmRpZgorCVRpY2tUeXBlX3QgeER1bW15MjsKKwl2b2lkICpwdkR1bW15M1sgMiBdOwogfTsKIHR5cGVkZWYgc3RydWN0IHhTVEFUSUNfTUlOSV9MSVNUX0lURU0gU3RhdGljTWluaUxpc3RJdGVtX3Q7CiAKIC8qIFNlZSB0aGUgY29tbWVudHMgYWJvdmUgdGhlIHN0cnVjdCB4U1RBVElDX0xJU1RfSVRFTSBkZWZpbml0aW9uLiAqLwogdHlwZWRlZiBzdHJ1Y3QgeFNUQVRJQ19MSVNUCiB7Ci0JVUJhc2VUeXBlX3QgdXhEdW1teTE7Ci0Jdm9pZCAqcHZEdW1teTI7Ci0JU3RhdGljTWluaUxpc3RJdGVtX3QgeER1bW15MzsKKwkjaWYoIGNvbmZpZ1VTRV9MSVNUX0RBVEFfSU5URUdSSVRZX0NIRUNLX0JZVEVTID09IDEgKQorCQlUaWNrVHlwZV90IHhEdW1teTE7CisJI2VuZGlmCisJVUJhc2VUeXBlX3QgdXhEdW1teTI7CisJdm9pZCAqcHZEdW1teTM7CisJU3RhdGljTWluaUxpc3RJdGVtX3QgeER1bW15NDsKKwkjaWYoIGNvbmZpZ1VTRV9MSVNUX0RBVEFfSU5URUdSSVRZX0NIRUNLX0JZVEVTID09IDEgKQorCQlUaWNrVHlwZV90IHhEdW1teTU7CisJI2VuZGlmCiB9IFN0YXRpY0xpc3RfdDsKIAogLyoKQEAgLTEwMTksMTQgKzExMzAsMTYgQEAKIAkJdWludDMyX3QgCQl1bER1bW15MTg7CiAJCXVpbnQ4X3QgCQl1Y0R1bW15MTk7CiAJI2VuZGlmCi0JI2lmKCAoICggY29uZmlnU1VQUE9SVF9TVEFUSUNfQUxMT0NBVElPTiA9PSAxICkgJiYgKCBjb25maWdTVVBQT1JUX0RZTkFNSUNfQUxMT0NBVElPTiA9PSAxICkgKSB8fCAoIHBvcnRVU0lOR19NUFVfV1JBUFBFUlMgPT0gMSApICkKKwkjaWYgKCB0c2tTVEFUSUNfQU5EX0RZTkFNSUNfQUxMT0NBVElPTl9QT1NTSUJMRSAhPSAwICkKIAkJdWludDhfdAkJCXV4RHVtbXkyMDsKIAkjZW5kaWYKIAogCSNpZiggSU5DTFVERV94VGFza0Fib3J0RGVsYXkgPT0gMSApCiAJCXVpbnQ4X3QgdWNEdW1teTIxOwogCSNlbmRpZgotCisJI2lmICggY29uZmlnVVNFX1BPU0lYX0VSUk5PID09IDEgKQorCQlpbnQJCQkJaUR1bW15MjI7CisJI2VuZGlmCiB9IFN0YXRpY1Rhc2tfdDsKIAogLyoKQEAgLTExMjEsMTUgKzEyMzQsMTIgQEAKIAl2b2lkCQkJCSpwdkR1bW15MTsKIAlTdGF0aWNMaXN0SXRlbV90CXhEdW1teTI7CiAJVGlja1R5cGVfdAkJCXhEdW1teTM7Ci0JVUJhc2VUeXBlX3QJCQl1eER1bW15NDsKLQl2b2lkIAkJCQkqcHZEdW1teTVbIDIgXTsKKwl2b2lkIAkJCQkqcHZEdW1teTU7CisJVGFza0Z1bmN0aW9uX3QJCXB2RHVtbXk2OwogCSNpZiggY29uZmlnVVNFX1RSQUNFX0ZBQ0lMSVRZID09IDEgKQotCQlVQmFzZVR5cGVfdAkJdXhEdW1teTY7CisJCVVCYXNlVHlwZV90CQl1eER1bW15NzsKIAkjZW5kaWYKLQotCSNpZiggKCBjb25maWdTVVBQT1JUX1NUQVRJQ19BTExPQ0FUSU9OID09IDEgKSAmJiAoIGNvbmZpZ1NVUFBPUlRfRFlOQU1JQ19BTExPQ0FUSU9OID09IDEgKSApCi0JCXVpbnQ4X3QgCQl1Y0R1bW15NzsKLQkjZW5kaWYKKwl1aW50OF90IAkJCXVjRHVtbXk4OwogCiB9IFN0YXRpY1RpbWVyX3Q7CiAKZGlmZiAtLWdpdCBhL1NvdXJjZS9pbmNsdWRlL0ZyZWVSVE9TQ29uZmlnX3RlbXBsYXRlLmggYi9Tb3VyY2UvaW5jbHVkZS9GcmVlUlRPU0NvbmZpZ190ZW1wbGF0ZS5oCmluZGV4IDBiZWY1YTQuLmUwZGZmNWMgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9pbmNsdWRlL0ZyZWVSVE9TQ29uZmlnX3RlbXBsYXRlLmgKKysrIGIvU291cmNlL2luY2x1ZGUvRnJlZVJUT1NDb25maWdfdGVtcGxhdGUuaApAQCAtMSw2ICsxLDYgQEAKIC8qCi0gKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjAuMQotICogQ29weXJpZ2h0IChDKSAyMDE3IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRnJlZVJUT1MgS2VybmVsIFYxMC4yLjEKKyAqIENvcHlyaWdodCAoQykgMjAxOSBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCiAgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCiAgKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgpkaWZmIC0tZ2l0IGEvU291cmNlL2luY2x1ZGUvU3RhY2tNYWNyb3MuaCBiL1NvdXJjZS9pbmNsdWRlL1N0YWNrTWFjcm9zLmgKaW5kZXggNTM0ZjAwNC4uM2VkOGIyMiAxMDA2NDQKLS0tIGEvU291cmNlL2luY2x1ZGUvU3RhY2tNYWNyb3MuaAorKysgYi9Tb3VyY2UvaW5jbHVkZS9TdGFja01hY3Jvcy5oCkBAIC0xLDYgKzEsNiBAQAogLyoKLSAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMC4xCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjIuMQorICogQ29weXJpZ2h0IChDKSAyMDE5IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKICAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKICAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCmRpZmYgLS1naXQgYS9Tb3VyY2UvaW5jbHVkZS9jcm91dGluZS5oIGIvU291cmNlL2luY2x1ZGUvY3JvdXRpbmUuaAppbmRleCBmNGM1NGQyLi44YjNiNDFiIDEwMDY0NAotLS0gYS9Tb3VyY2UvaW5jbHVkZS9jcm91dGluZS5oCisrKyBiL1NvdXJjZS9pbmNsdWRlL2Nyb3V0aW5lLmgKQEAgLTEsNiArMSw2IEBACiAvKgotICogRnJlZVJUT1MgS2VybmVsIFYxMC4wLjEKLSAqIENvcHlyaWdodCAoQykgMjAxNyBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMi4xCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgogICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgogICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KZGlmZiAtLWdpdCBhL1NvdXJjZS9pbmNsdWRlL2RlcHJlY2F0ZWRfZGVmaW5pdGlvbnMuaCBiL1NvdXJjZS9pbmNsdWRlL2RlcHJlY2F0ZWRfZGVmaW5pdGlvbnMuaAppbmRleCAxMTI1NjczLi45Y2VjZTk4IDEwMDY0NAotLS0gYS9Tb3VyY2UvaW5jbHVkZS9kZXByZWNhdGVkX2RlZmluaXRpb25zLmgKKysrIGIvU291cmNlL2luY2x1ZGUvZGVwcmVjYXRlZF9kZWZpbml0aW9ucy5oCkBAIC0xLDYgKzEsNiBAQAogLyoKLSAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMC4xCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjIuMQorICogQ29weXJpZ2h0IChDKSAyMDE5IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKICAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKICAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCmRpZmYgLS1naXQgYS9Tb3VyY2UvaW5jbHVkZS9ldmVudF9ncm91cHMuaCBiL1NvdXJjZS9pbmNsdWRlL2V2ZW50X2dyb3Vwcy5oCmluZGV4IDY5ZWMyZTYuLjFmMzhiZGIgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9pbmNsdWRlL2V2ZW50X2dyb3Vwcy5oCisrKyBiL1NvdXJjZS9pbmNsdWRlL2V2ZW50X2dyb3Vwcy5oCkBAIC0xLDYgKzEsNiBAQAogLyoKLSAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMC4xCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjIuMQorICogQ29weXJpZ2h0IChDKSAyMDE5IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKICAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKICAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCkBAIC03OCw3ICs3OCw4IEBACiAgKiBcZGVmZ3JvdXAgRXZlbnRHcm91cEhhbmRsZV90IEV2ZW50R3JvdXBIYW5kbGVfdAogICogXGluZ3JvdXAgRXZlbnRHcm91cAogICovCi10eXBlZGVmIHZvaWQgKiBFdmVudEdyb3VwSGFuZGxlX3Q7CitzdHJ1Y3QgRXZlbnRHcm91cERlZl90OwordHlwZWRlZiBzdHJ1Y3QgRXZlbnRHcm91cERlZl90ICogRXZlbnRHcm91cEhhbmRsZV90OwogCiAvKgogICogVGhlIHR5cGUgdGhhdCBob2xkcyBldmVudCBiaXRzIGFsd2F5cyBtYXRjaGVzIFRpY2tUeXBlX3QgLSB0aGVyZWZvcmUgdGhlCkBAIC00MDQsNyArNDA1LDcgQEAKICAqIFxpbmdyb3VwIEV2ZW50R3JvdXAKICAqLwogI2lmKCBjb25maWdVU0VfVFJBQ0VfRkFDSUxJVFkgPT0gMSApCi0JQmFzZVR5cGVfdCB4RXZlbnRHcm91cENsZWFyQml0c0Zyb21JU1IoIEV2ZW50R3JvdXBIYW5kbGVfdCB4RXZlbnRHcm91cCwgY29uc3QgRXZlbnRCaXRzX3QgdXhCaXRzVG9TZXQgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCUJhc2VUeXBlX3QgeEV2ZW50R3JvdXBDbGVhckJpdHNGcm9tSVNSKCBFdmVudEdyb3VwSGFuZGxlX3QgeEV2ZW50R3JvdXAsIGNvbnN0IEV2ZW50Qml0c190IHV4Qml0c1RvQ2xlYXIgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOwogI2Vsc2UKIAkjZGVmaW5lIHhFdmVudEdyb3VwQ2xlYXJCaXRzRnJvbUlTUiggeEV2ZW50R3JvdXAsIHV4Qml0c1RvQ2xlYXIgKSB4VGltZXJQZW5kRnVuY3Rpb25DYWxsRnJvbUlTUiggdkV2ZW50R3JvdXBDbGVhckJpdHNDYWxsYmFjaywgKCB2b2lkICogKSB4RXZlbnRHcm91cCwgKCB1aW50MzJfdCApIHV4Qml0c1RvQ2xlYXIsIE5VTEwgKQogI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvaW5jbHVkZS9saXN0LmggYi9Tb3VyY2UvaW5jbHVkZS9saXN0LmgKaW5kZXggNGEzYWZhMS4uMmZiNjc3NSAxMDA2NDQKLS0tIGEvU291cmNlL2luY2x1ZGUvbGlzdC5oCisrKyBiL1NvdXJjZS9pbmNsdWRlL2xpc3QuaApAQCAtMSw2ICsxLDYgQEAKIC8qCi0gKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjAuMQotICogQ29weXJpZ2h0IChDKSAyMDE3IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRnJlZVJUT1MgS2VybmVsIFYxMC4yLjEKKyAqIENvcHlyaWdodCAoQykgMjAxOSBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCiAgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCiAgKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgpAQCAtMTM2LDYgKzEzNiw3IEBACiAvKgogICogRGVmaW5pdGlvbiBvZiB0aGUgb25seSB0eXBlIG9mIG9iamVjdCB0aGF0IGEgbGlzdCBjYW4gY29udGFpbi4KICAqLworc3RydWN0IHhMSVNUOwogc3RydWN0IHhMSVNUX0lURU0KIHsKIAlsaXN0RklSU1RfTElTVF9JVEVNX0lOVEVHUklUWV9DSEVDS19WQUxVRQkJCS8qPCBTZXQgdG8gYSBrbm93biB2YWx1ZSBpZiBjb25maWdVU0VfTElTVF9EQVRBX0lOVEVHUklUWV9DSEVDS19CWVRFUyBpcyBzZXQgdG8gMS4gKi8KQEAgLTE0Myw3ICsxNDQsNyBAQAogCXN0cnVjdCB4TElTVF9JVEVNICogY29uZmlnTElTVF9WT0xBVElMRSBweE5leHQ7CQkvKjwgUG9pbnRlciB0byB0aGUgbmV4dCBMaXN0SXRlbV90IGluIHRoZSBsaXN0LiAqLwogCXN0cnVjdCB4TElTVF9JVEVNICogY29uZmlnTElTVF9WT0xBVElMRSBweFByZXZpb3VzOwkvKjwgUG9pbnRlciB0byB0aGUgcHJldmlvdXMgTGlzdEl0ZW1fdCBpbiB0aGUgbGlzdC4gKi8KIAl2b2lkICogcHZPd25lcjsJCQkJCQkJCQkJLyo8IFBvaW50ZXIgdG8gdGhlIG9iamVjdCAobm9ybWFsbHkgYSBUQ0IpIHRoYXQgY29udGFpbnMgdGhlIGxpc3QgaXRlbS4gIFRoZXJlIGlzIHRoZXJlZm9yZSBhIHR3byB3YXkgbGluayBiZXR3ZWVuIHRoZSBvYmplY3QgY29udGFpbmluZyB0aGUgbGlzdCBpdGVtIGFuZCB0aGUgbGlzdCBpdGVtIGl0c2VsZi4gKi8KLQl2b2lkICogY29uZmlnTElTVF9WT0xBVElMRSBwdkNvbnRhaW5lcjsJCQkJLyo8IFBvaW50ZXIgdG8gdGhlIGxpc3QgaW4gd2hpY2ggdGhpcyBsaXN0IGl0ZW0gaXMgcGxhY2VkIChpZiBhbnkpLiAqLworCXN0cnVjdCB4TElTVCAqIGNvbmZpZ0xJU1RfVk9MQVRJTEUgcHhDb250YWluZXI7CQkvKjwgUG9pbnRlciB0byB0aGUgbGlzdCBpbiB3aGljaCB0aGlzIGxpc3QgaXRlbSBpcyBwbGFjZWQgKGlmIGFueSkuICovCiAJbGlzdFNFQ09ORF9MSVNUX0lURU1fSU5URUdSSVRZX0NIRUNLX1ZBTFVFCQkJLyo8IFNldCB0byBhIGtub3duIHZhbHVlIGlmIGNvbmZpZ1VTRV9MSVNUX0RBVEFfSU5URUdSSVRZX0NIRUNLX0JZVEVTIGlzIHNldCB0byAxLiAqLwogfTsKIHR5cGVkZWYgc3RydWN0IHhMSVNUX0lURU0gTGlzdEl0ZW1fdDsJCQkJCS8qIEZvciBzb21lIHJlYXNvbiBsaW50IHdhbnRzIHRoaXMgYXMgdHdvIHNlcGFyYXRlIGRlZmluaXRpb25zLiAqLwpAQCAtMjQ2LDcgKzI0Nyw3IEBACiAgKiBccGFnZSBsaXN0TElTVF9JU19FTVBUWSBsaXN0TElTVF9JU19FTVBUWQogICogXGluZ3JvdXAgTGlua2VkTGlzdAogICovCi0jZGVmaW5lIGxpc3RMSVNUX0lTX0VNUFRZKCBweExpc3QgKQkoICggQmFzZVR5cGVfdCApICggKCBweExpc3QgKS0+dXhOdW1iZXJPZkl0ZW1zID09ICggVUJhc2VUeXBlX3QgKSAwICkgKQorI2RlZmluZSBsaXN0TElTVF9JU19FTVBUWSggcHhMaXN0ICkJKCAoICggcHhMaXN0ICktPnV4TnVtYmVyT2ZJdGVtcyA9PSAoIFVCYXNlVHlwZV90ICkgMCApID8gcGRUUlVFIDogcGRGQUxTRSApCiAKIC8qCiAgKiBBY2Nlc3MgbWFjcm8gdG8gcmV0dXJuIHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIGxpc3QuCkBAIC0zMTQsNyArMzE1LDcgQEAKICAqIEBwYXJhbSBweExpc3RJdGVtIFRoZSBsaXN0IGl0ZW0gd2Ugd2FudCB0byBrbm93IGlmIGlzIGluIHRoZSBsaXN0LgogICogQHJldHVybiBwZFRSVUUgaWYgdGhlIGxpc3QgaXRlbSBpcyBpbiB0aGUgbGlzdCwgb3RoZXJ3aXNlIHBkRkFMU0UuCiAgKi8KLSNkZWZpbmUgbGlzdElTX0NPTlRBSU5FRF9XSVRISU4oIHB4TGlzdCwgcHhMaXN0SXRlbSApICggKCBCYXNlVHlwZV90ICkgKCAoIHB4TGlzdEl0ZW0gKS0+cHZDb250YWluZXIgPT0gKCB2b2lkICogKSAoIHB4TGlzdCApICkgKQorI2RlZmluZSBsaXN0SVNfQ09OVEFJTkVEX1dJVEhJTiggcHhMaXN0LCBweExpc3RJdGVtICkgKCAoICggcHhMaXN0SXRlbSApLT5weENvbnRhaW5lciA9PSAoIHB4TGlzdCApICkgPyAoIHBkVFJVRSApIDogKCBwZEZBTFNFICkgKQogCiAvKgogICogUmV0dXJuIHRoZSBsaXN0IGEgbGlzdCBpdGVtIGlzIGNvbnRhaW5lZCB3aXRoaW4gKHJlZmVyZW5jZWQgZnJvbSkuCkBAIC0zMjIsNyArMzIzLDcgQEAKICAqIEBwYXJhbSBweExpc3RJdGVtIFRoZSBsaXN0IGl0ZW0gYmVpbmcgcXVlcmllZC4KICAqIEByZXR1cm4gQSBwb2ludGVyIHRvIHRoZSBMaXN0X3Qgb2JqZWN0IHRoYXQgcmVmZXJlbmNlcyB0aGUgcHhMaXN0SXRlbQogICovCi0jZGVmaW5lIGxpc3RMSVNUX0lURU1fQ09OVEFJTkVSKCBweExpc3RJdGVtICkgKCAoIHB4TGlzdEl0ZW0gKS0+cHZDb250YWluZXIgKQorI2RlZmluZSBsaXN0TElTVF9JVEVNX0NPTlRBSU5FUiggcHhMaXN0SXRlbSApICggKCBweExpc3RJdGVtICktPnB4Q29udGFpbmVyICkKIAogLyoKICAqIFRoaXMgcHJvdmlkZXMgYSBjcnVkZSBtZWFucyBvZiBrbm93aW5nIGlmIGEgbGlzdCBoYXMgYmVlbiBpbml0aWFsaXNlZCwgYXMKZGlmZiAtLWdpdCBhL1NvdXJjZS9pbmNsdWRlL21lc3NhZ2VfYnVmZmVyLmggYi9Tb3VyY2UvaW5jbHVkZS9tZXNzYWdlX2J1ZmZlci5oCmluZGV4IDkxZTM0ZmEuLmNmYTA4Y2IgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9pbmNsdWRlL21lc3NhZ2VfYnVmZmVyLmgKKysrIGIvU291cmNlL2luY2x1ZGUvbWVzc2FnZV9idWZmZXIuaApAQCAtMSw2ICsxLDYgQEAKIC8qCi0gKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjAuMQotICogQ29weXJpZ2h0IChDKSAyMDE3IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRnJlZVJUT1MgS2VybmVsIFYxMC4yLjEKKyAqIENvcHlyaWdodCAoQykgMjAxOSBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCiAgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCiAgKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgpAQCAtNjkyLDYgKzY5MiwyNiBAQAogICogXGluZ3JvdXAgTWVzc2FnZUJ1ZmZlck1hbmFnZW1lbnQKICAqLwogI2RlZmluZSB4TWVzc2FnZUJ1ZmZlclNwYWNlQXZhaWxhYmxlKCB4TWVzc2FnZUJ1ZmZlciApIHhTdHJlYW1CdWZmZXJTcGFjZXNBdmFpbGFibGUoICggU3RyZWFtQnVmZmVySGFuZGxlX3QgKSB4TWVzc2FnZUJ1ZmZlciApCisjZGVmaW5lIHhNZXNzYWdlQnVmZmVyU3BhY2VzQXZhaWxhYmxlKCB4TWVzc2FnZUJ1ZmZlciApIHhTdHJlYW1CdWZmZXJTcGFjZXNBdmFpbGFibGUoICggU3RyZWFtQnVmZmVySGFuZGxlX3QgKSB4TWVzc2FnZUJ1ZmZlciApIC8qIENvcnJlY3RzIHR5cG8gaW4gb3JpZ2luYWwgbWFjcm8gbmFtZS4gKi8KKworLyoqCisgKiBtZXNzYWdlX2J1ZmZlci5oCisgPHByZT4KKyBzaXplX3QgeE1lc3NhZ2VCdWZmZXJOZXh0TGVuZ3RoQnl0ZXMoIE1lc3NhZ2VCdWZmZXJIYW5kbGVfdCB4TWVzc2FnZUJ1ZmZlciApICk7CisgPC9wcmU+CisgKiBSZXR1cm5zIHRoZSBsZW5ndGggKGluIGJ5dGVzKSBvZiB0aGUgbmV4dCBtZXNzYWdlIGluIGEgbWVzc2FnZSBidWZmZXIuCisgKiBVc2VmdWwgaWYgeE1lc3NhZ2VCdWZmZXJSZWNlaXZlKCkgcmV0dXJuZWQgMCBiZWNhdXNlIHRoZSBzaXplIG9mIHRoZSBidWZmZXIKKyAqIHBhc3NlZCBpbnRvIHhNZXNzYWdlQnVmZmVyUmVjZWl2ZSgpIHdhcyB0b28gc21hbGwgdG8gaG9sZCB0aGUgbmV4dCBtZXNzYWdlLgorICoKKyAqIEBwYXJhbSB4TWVzc2FnZUJ1ZmZlciBUaGUgaGFuZGxlIG9mIHRoZSBtZXNzYWdlIGJ1ZmZlciBiZWluZyBxdWVyaWVkLgorICoKKyAqIEByZXR1cm4gVGhlIGxlbmd0aCAoaW4gYnl0ZXMpIG9mIHRoZSBuZXh0IG1lc3NhZ2UgaW4gdGhlIG1lc3NhZ2UgYnVmZmVyLCBvciAwCisgKiBpZiB0aGUgbWVzc2FnZSBidWZmZXIgaXMgZW1wdHkuCisgKgorICogXGRlZmdyb3VwIHhNZXNzYWdlQnVmZmVyTmV4dExlbmd0aEJ5dGVzIHhNZXNzYWdlQnVmZmVyTmV4dExlbmd0aEJ5dGVzCisgKiBcaW5ncm91cCBNZXNzYWdlQnVmZmVyTWFuYWdlbWVudAorICovCisjZGVmaW5lIHhNZXNzYWdlQnVmZmVyTmV4dExlbmd0aEJ5dGVzKCB4TWVzc2FnZUJ1ZmZlciApIHhTdHJlYW1CdWZmZXJOZXh0TWVzc2FnZUxlbmd0aEJ5dGVzKCAoIFN0cmVhbUJ1ZmZlckhhbmRsZV90ICkgeE1lc3NhZ2VCdWZmZXIgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOwogCiAvKioKICAqIG1lc3NhZ2VfYnVmZmVyLmgKZGlmZiAtLWdpdCBhL1NvdXJjZS9pbmNsdWRlL21wdV9wcm90b3R5cGVzLmggYi9Tb3VyY2UvaW5jbHVkZS9tcHVfcHJvdG90eXBlcy5oCmluZGV4IGUyYzg5YWIuLjVkNzQ5MDcgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9pbmNsdWRlL21wdV9wcm90b3R5cGVzLmgKKysrIGIvU291cmNlL2luY2x1ZGUvbXB1X3Byb3RvdHlwZXMuaApAQCAtMSw2ICsxLDYgQEAKIC8qCi0gKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjAuMQotICogQ29weXJpZ2h0IChDKSAyMDE3IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRnJlZVJUT1MgS2VybmVsIFYxMC4yLjEKKyAqIENvcHlyaWdodCAoQykgMjAxOSBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCiAgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCiAgKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgpAQCAtMzgsMTE2ICszOCwxMTggQEAKICNkZWZpbmUgTVBVX1BST1RPVFlQRVNfSAogCiAvKiBNUFUgdmVyc2lvbnMgb2YgdGFza3MuaCBBUEkgZnVuY3Rpb25zLiAqLwotQmFzZVR5cGVfdCBNUFVfeFRhc2tDcmVhdGUoIFRhc2tGdW5jdGlvbl90IHB4VGFza0NvZGUsIGNvbnN0IGNoYXIgKiBjb25zdCBwY05hbWUsIGNvbnN0IHVpbnQxNl90IHVzU3RhY2tEZXB0aCwgdm9pZCAqIGNvbnN0IHB2UGFyYW1ldGVycywgVUJhc2VUeXBlX3QgdXhQcmlvcml0eSwgVGFza0hhbmRsZV90ICogY29uc3QgcHhDcmVhdGVkVGFzayApOwotVGFza0hhbmRsZV90IE1QVV94VGFza0NyZWF0ZVN0YXRpYyggVGFza0Z1bmN0aW9uX3QgcHhUYXNrQ29kZSwgY29uc3QgY2hhciAqIGNvbnN0IHBjTmFtZSwgY29uc3QgdWludDMyX3QgdWxTdGFja0RlcHRoLCB2b2lkICogY29uc3QgcHZQYXJhbWV0ZXJzLCBVQmFzZVR5cGVfdCB1eFByaW9yaXR5LCBTdGFja1R5cGVfdCAqIGNvbnN0IHB1eFN0YWNrQnVmZmVyLCBTdGF0aWNUYXNrX3QgKiBjb25zdCBweFRhc2tCdWZmZXIgKTsKLUJhc2VUeXBlX3QgTVBVX3hUYXNrQ3JlYXRlUmVzdHJpY3RlZCggY29uc3QgVGFza1BhcmFtZXRlcnNfdCAqIGNvbnN0IHB4VGFza0RlZmluaXRpb24sIFRhc2tIYW5kbGVfdCAqcHhDcmVhdGVkVGFzayApOwotQmFzZVR5cGVfdCBNUFVfeFRhc2tDcmVhdGVSZXN0cmljdGVkU3RhdGljKCBjb25zdCBUYXNrUGFyYW1ldGVyc190ICogY29uc3QgcHhUYXNrRGVmaW5pdGlvbiwgVGFza0hhbmRsZV90ICpweENyZWF0ZWRUYXNrICk7Ci12b2lkIE1QVV92VGFza0FsbG9jYXRlTVBVUmVnaW9ucyggVGFza0hhbmRsZV90IHhUYXNrLCBjb25zdCBNZW1vcnlSZWdpb25fdCAqIGNvbnN0IHB4UmVnaW9ucyApOwotdm9pZCBNUFVfdlRhc2tEZWxldGUoIFRhc2tIYW5kbGVfdCB4VGFza1RvRGVsZXRlICk7Ci12b2lkIE1QVV92VGFza0RlbGF5KCBjb25zdCBUaWNrVHlwZV90IHhUaWNrc1RvRGVsYXkgKTsKLXZvaWQgTVBVX3ZUYXNrRGVsYXlVbnRpbCggVGlja1R5cGVfdCAqIGNvbnN0IHB4UHJldmlvdXNXYWtlVGltZSwgY29uc3QgVGlja1R5cGVfdCB4VGltZUluY3JlbWVudCApOwotQmFzZVR5cGVfdCBNUFVfeFRhc2tBYm9ydERlbGF5KCBUYXNrSGFuZGxlX3QgeFRhc2sgKTsKLVVCYXNlVHlwZV90IE1QVV91eFRhc2tQcmlvcml0eUdldCggVGFza0hhbmRsZV90IHhUYXNrICk7Ci1lVGFza1N0YXRlIE1QVV9lVGFza0dldFN0YXRlKCBUYXNrSGFuZGxlX3QgeFRhc2sgKTsKLXZvaWQgTVBVX3ZUYXNrR2V0SW5mbyggVGFza0hhbmRsZV90IHhUYXNrLCBUYXNrU3RhdHVzX3QgKnB4VGFza1N0YXR1cywgQmFzZVR5cGVfdCB4R2V0RnJlZVN0YWNrU3BhY2UsIGVUYXNrU3RhdGUgZVN0YXRlICk7Ci12b2lkIE1QVV92VGFza1ByaW9yaXR5U2V0KCBUYXNrSGFuZGxlX3QgeFRhc2ssIFVCYXNlVHlwZV90IHV4TmV3UHJpb3JpdHkgKTsKLXZvaWQgTVBVX3ZUYXNrU3VzcGVuZCggVGFza0hhbmRsZV90IHhUYXNrVG9TdXNwZW5kICk7Ci12b2lkIE1QVV92VGFza1Jlc3VtZSggVGFza0hhbmRsZV90IHhUYXNrVG9SZXN1bWUgKTsKLXZvaWQgTVBVX3ZUYXNrU3RhcnRTY2hlZHVsZXIoIHZvaWQgKTsKLXZvaWQgTVBVX3ZUYXNrU3VzcGVuZEFsbCggdm9pZCApOwotQmFzZVR5cGVfdCBNUFVfeFRhc2tSZXN1bWVBbGwoIHZvaWQgKTsKLVRpY2tUeXBlX3QgTVBVX3hUYXNrR2V0VGlja0NvdW50KCB2b2lkICk7Ci1VQmFzZVR5cGVfdCBNUFVfdXhUYXNrR2V0TnVtYmVyT2ZUYXNrcyggdm9pZCApOwotY2hhciAqIE1QVV9wY1Rhc2tHZXROYW1lKCBUYXNrSGFuZGxlX3QgeFRhc2tUb1F1ZXJ5ICk7Ci1UYXNrSGFuZGxlX3QgTVBVX3hUYXNrR2V0SGFuZGxlKCBjb25zdCBjaGFyICpwY05hbWVUb1F1ZXJ5ICk7Ci1VQmFzZVR5cGVfdCBNUFVfdXhUYXNrR2V0U3RhY2tIaWdoV2F0ZXJNYXJrKCBUYXNrSGFuZGxlX3QgeFRhc2sgKTsKLXZvaWQgTVBVX3ZUYXNrU2V0QXBwbGljYXRpb25UYXNrVGFnKCBUYXNrSGFuZGxlX3QgeFRhc2ssIFRhc2tIb29rRnVuY3Rpb25fdCBweEhvb2tGdW5jdGlvbiApOwotVGFza0hvb2tGdW5jdGlvbl90IE1QVV94VGFza0dldEFwcGxpY2F0aW9uVGFza1RhZyggVGFza0hhbmRsZV90IHhUYXNrICk7Ci12b2lkIE1QVV92VGFza1NldFRocmVhZExvY2FsU3RvcmFnZVBvaW50ZXIoIFRhc2tIYW5kbGVfdCB4VGFza1RvU2V0LCBCYXNlVHlwZV90IHhJbmRleCwgdm9pZCAqcHZWYWx1ZSApOwotdm9pZCAqIE1QVV9wdlRhc2tHZXRUaHJlYWRMb2NhbFN0b3JhZ2VQb2ludGVyKCBUYXNrSGFuZGxlX3QgeFRhc2tUb1F1ZXJ5LCBCYXNlVHlwZV90IHhJbmRleCApOwotQmFzZVR5cGVfdCBNUFVfeFRhc2tDYWxsQXBwbGljYXRpb25UYXNrSG9vayggVGFza0hhbmRsZV90IHhUYXNrLCB2b2lkICpwdlBhcmFtZXRlciApOwotVGFza0hhbmRsZV90IE1QVV94VGFza0dldElkbGVUYXNrSGFuZGxlKCB2b2lkICk7Ci1VQmFzZVR5cGVfdCBNUFVfdXhUYXNrR2V0U3lzdGVtU3RhdGUoIFRhc2tTdGF0dXNfdCAqIGNvbnN0IHB4VGFza1N0YXR1c0FycmF5LCBjb25zdCBVQmFzZVR5cGVfdCB1eEFycmF5U2l6ZSwgdWludDMyX3QgKiBjb25zdCBwdWxUb3RhbFJ1blRpbWUgKTsKLXZvaWQgTVBVX3ZUYXNrTGlzdCggY2hhciAqIHBjV3JpdGVCdWZmZXIgKTsKLXZvaWQgTVBVX3ZUYXNrR2V0UnVuVGltZVN0YXRzKCBjaGFyICpwY1dyaXRlQnVmZmVyICk7Ci1CYXNlVHlwZV90IE1QVV94VGFza0dlbmVyaWNOb3RpZnkoIFRhc2tIYW5kbGVfdCB4VGFza1RvTm90aWZ5LCB1aW50MzJfdCB1bFZhbHVlLCBlTm90aWZ5QWN0aW9uIGVBY3Rpb24sIHVpbnQzMl90ICpwdWxQcmV2aW91c05vdGlmaWNhdGlvblZhbHVlICk7Ci1CYXNlVHlwZV90IE1QVV94VGFza05vdGlmeVdhaXQoIHVpbnQzMl90IHVsQml0c1RvQ2xlYXJPbkVudHJ5LCB1aW50MzJfdCB1bEJpdHNUb0NsZWFyT25FeGl0LCB1aW50MzJfdCAqcHVsTm90aWZpY2F0aW9uVmFsdWUsIFRpY2tUeXBlX3QgeFRpY2tzVG9XYWl0ICk7Ci11aW50MzJfdCBNUFVfdWxUYXNrTm90aWZ5VGFrZSggQmFzZVR5cGVfdCB4Q2xlYXJDb3VudE9uRXhpdCwgVGlja1R5cGVfdCB4VGlja3NUb1dhaXQgKTsKLUJhc2VUeXBlX3QgTVBVX3hUYXNrTm90aWZ5U3RhdGVDbGVhciggVGFza0hhbmRsZV90IHhUYXNrICk7Ci1CYXNlVHlwZV90IE1QVV94VGFza0luY3JlbWVudFRpY2soIHZvaWQgKTsKLVRhc2tIYW5kbGVfdCBNUFVfeFRhc2tHZXRDdXJyZW50VGFza0hhbmRsZSggdm9pZCApOwotdm9pZCBNUFVfdlRhc2tTZXRUaW1lT3V0U3RhdGUoIFRpbWVPdXRfdCAqIGNvbnN0IHB4VGltZU91dCApOwotQmFzZVR5cGVfdCBNUFVfeFRhc2tDaGVja0ZvclRpbWVPdXQoIFRpbWVPdXRfdCAqIGNvbnN0IHB4VGltZU91dCwgVGlja1R5cGVfdCAqIGNvbnN0IHB4VGlja3NUb1dhaXQgKTsKLXZvaWQgTVBVX3ZUYXNrTWlzc2VkWWllbGQoIHZvaWQgKTsKLUJhc2VUeXBlX3QgTVBVX3hUYXNrR2V0U2NoZWR1bGVyU3RhdGUoIHZvaWQgKTsKK0Jhc2VUeXBlX3QgTVBVX3hUYXNrQ3JlYXRlKCBUYXNrRnVuY3Rpb25fdCBweFRhc2tDb2RlLCBjb25zdCBjaGFyICogY29uc3QgcGNOYW1lLCBjb25zdCB1aW50MTZfdCB1c1N0YWNrRGVwdGgsIHZvaWQgKiBjb25zdCBwdlBhcmFtZXRlcnMsIFVCYXNlVHlwZV90IHV4UHJpb3JpdHksIFRhc2tIYW5kbGVfdCAqIGNvbnN0IHB4Q3JlYXRlZFRhc2sgKSBGUkVFUlRPU19TWVNURU1fQ0FMTDsKK1Rhc2tIYW5kbGVfdCBNUFVfeFRhc2tDcmVhdGVTdGF0aWMoIFRhc2tGdW5jdGlvbl90IHB4VGFza0NvZGUsIGNvbnN0IGNoYXIgKiBjb25zdCBwY05hbWUsIGNvbnN0IHVpbnQzMl90IHVsU3RhY2tEZXB0aCwgdm9pZCAqIGNvbnN0IHB2UGFyYW1ldGVycywgVUJhc2VUeXBlX3QgdXhQcmlvcml0eSwgU3RhY2tUeXBlX3QgKiBjb25zdCBwdXhTdGFja0J1ZmZlciwgU3RhdGljVGFza190ICogY29uc3QgcHhUYXNrQnVmZmVyICkgRlJFRVJUT1NfU1lTVEVNX0NBTEw7CitCYXNlVHlwZV90IE1QVV94VGFza0NyZWF0ZVJlc3RyaWN0ZWQoIGNvbnN0IFRhc2tQYXJhbWV0ZXJzX3QgKiBjb25zdCBweFRhc2tEZWZpbml0aW9uLCBUYXNrSGFuZGxlX3QgKnB4Q3JlYXRlZFRhc2sgKSBGUkVFUlRPU19TWVNURU1fQ0FMTDsKK0Jhc2VUeXBlX3QgTVBVX3hUYXNrQ3JlYXRlUmVzdHJpY3RlZFN0YXRpYyggY29uc3QgVGFza1BhcmFtZXRlcnNfdCAqIGNvbnN0IHB4VGFza0RlZmluaXRpb24sIFRhc2tIYW5kbGVfdCAqcHhDcmVhdGVkVGFzayApIEZSRUVSVE9TX1NZU1RFTV9DQUxMOwordm9pZCBNUFVfdlRhc2tBbGxvY2F0ZU1QVVJlZ2lvbnMoIFRhc2tIYW5kbGVfdCB4VGFzaywgY29uc3QgTWVtb3J5UmVnaW9uX3QgKiBjb25zdCBweFJlZ2lvbnMgKSBGUkVFUlRPU19TWVNURU1fQ0FMTDsKK3ZvaWQgTVBVX3ZUYXNrRGVsZXRlKCBUYXNrSGFuZGxlX3QgeFRhc2tUb0RlbGV0ZSApIEZSRUVSVE9TX1NZU1RFTV9DQUxMOwordm9pZCBNUFVfdlRhc2tEZWxheSggY29uc3QgVGlja1R5cGVfdCB4VGlja3NUb0RlbGF5ICkgRlJFRVJUT1NfU1lTVEVNX0NBTEw7Cit2b2lkIE1QVV92VGFza0RlbGF5VW50aWwoIFRpY2tUeXBlX3QgKiBjb25zdCBweFByZXZpb3VzV2FrZVRpbWUsIGNvbnN0IFRpY2tUeXBlX3QgeFRpbWVJbmNyZW1lbnQgKSBGUkVFUlRPU19TWVNURU1fQ0FMTDsKK0Jhc2VUeXBlX3QgTVBVX3hUYXNrQWJvcnREZWxheSggVGFza0hhbmRsZV90IHhUYXNrICkgRlJFRVJUT1NfU1lTVEVNX0NBTEw7CitVQmFzZVR5cGVfdCBNUFVfdXhUYXNrUHJpb3JpdHlHZXQoIGNvbnN0IFRhc2tIYW5kbGVfdCB4VGFzayApIEZSRUVSVE9TX1NZU1RFTV9DQUxMOworZVRhc2tTdGF0ZSBNUFVfZVRhc2tHZXRTdGF0ZSggVGFza0hhbmRsZV90IHhUYXNrICkgRlJFRVJUT1NfU1lTVEVNX0NBTEw7Cit2b2lkIE1QVV92VGFza0dldEluZm8oIFRhc2tIYW5kbGVfdCB4VGFzaywgVGFza1N0YXR1c190ICpweFRhc2tTdGF0dXMsIEJhc2VUeXBlX3QgeEdldEZyZWVTdGFja1NwYWNlLCBlVGFza1N0YXRlIGVTdGF0ZSApIEZSRUVSVE9TX1NZU1RFTV9DQUxMOwordm9pZCBNUFVfdlRhc2tQcmlvcml0eVNldCggVGFza0hhbmRsZV90IHhUYXNrLCBVQmFzZVR5cGVfdCB1eE5ld1ByaW9yaXR5ICkgRlJFRVJUT1NfU1lTVEVNX0NBTEw7Cit2b2lkIE1QVV92VGFza1N1c3BlbmQoIFRhc2tIYW5kbGVfdCB4VGFza1RvU3VzcGVuZCApIEZSRUVSVE9TX1NZU1RFTV9DQUxMOwordm9pZCBNUFVfdlRhc2tSZXN1bWUoIFRhc2tIYW5kbGVfdCB4VGFza1RvUmVzdW1lICkgRlJFRVJUT1NfU1lTVEVNX0NBTEw7Cit2b2lkIE1QVV92VGFza1N0YXJ0U2NoZWR1bGVyKCB2b2lkICkgRlJFRVJUT1NfU1lTVEVNX0NBTEw7Cit2b2lkIE1QVV92VGFza1N1c3BlbmRBbGwoIHZvaWQgKSBGUkVFUlRPU19TWVNURU1fQ0FMTDsKK0Jhc2VUeXBlX3QgTVBVX3hUYXNrUmVzdW1lQWxsKCB2b2lkICkgRlJFRVJUT1NfU1lTVEVNX0NBTEw7CitUaWNrVHlwZV90IE1QVV94VGFza0dldFRpY2tDb3VudCggdm9pZCApIEZSRUVSVE9TX1NZU1RFTV9DQUxMOworVUJhc2VUeXBlX3QgTVBVX3V4VGFza0dldE51bWJlck9mVGFza3MoIHZvaWQgKSBGUkVFUlRPU19TWVNURU1fQ0FMTDsKK2NoYXIgKiBNUFVfcGNUYXNrR2V0TmFtZSggVGFza0hhbmRsZV90IHhUYXNrVG9RdWVyeSApIEZSRUVSVE9TX1NZU1RFTV9DQUxMOworVGFza0hhbmRsZV90IE1QVV94VGFza0dldEhhbmRsZSggY29uc3QgY2hhciAqcGNOYW1lVG9RdWVyeSApIEZSRUVSVE9TX1NZU1RFTV9DQUxMOworVUJhc2VUeXBlX3QgTVBVX3V4VGFza0dldFN0YWNrSGlnaFdhdGVyTWFyayggVGFza0hhbmRsZV90IHhUYXNrICkgRlJFRVJUT1NfU1lTVEVNX0NBTEw7Citjb25maWdTVEFDS19ERVBUSF9UWVBFIE1QVV91eFRhc2tHZXRTdGFja0hpZ2hXYXRlck1hcmsyKCBUYXNrSGFuZGxlX3QgeFRhc2sgKSBGUkVFUlRPU19TWVNURU1fQ0FMTDsKK3ZvaWQgTVBVX3ZUYXNrU2V0QXBwbGljYXRpb25UYXNrVGFnKCBUYXNrSGFuZGxlX3QgeFRhc2ssIFRhc2tIb29rRnVuY3Rpb25fdCBweEhvb2tGdW5jdGlvbiApIEZSRUVSVE9TX1NZU1RFTV9DQUxMOworVGFza0hvb2tGdW5jdGlvbl90IE1QVV94VGFza0dldEFwcGxpY2F0aW9uVGFza1RhZyggVGFza0hhbmRsZV90IHhUYXNrICkgRlJFRVJUT1NfU1lTVEVNX0NBTEw7Cit2b2lkIE1QVV92VGFza1NldFRocmVhZExvY2FsU3RvcmFnZVBvaW50ZXIoIFRhc2tIYW5kbGVfdCB4VGFza1RvU2V0LCBCYXNlVHlwZV90IHhJbmRleCwgdm9pZCAqcHZWYWx1ZSApIEZSRUVSVE9TX1NZU1RFTV9DQUxMOwordm9pZCAqIE1QVV9wdlRhc2tHZXRUaHJlYWRMb2NhbFN0b3JhZ2VQb2ludGVyKCBUYXNrSGFuZGxlX3QgeFRhc2tUb1F1ZXJ5LCBCYXNlVHlwZV90IHhJbmRleCApIEZSRUVSVE9TX1NZU1RFTV9DQUxMOworQmFzZVR5cGVfdCBNUFVfeFRhc2tDYWxsQXBwbGljYXRpb25UYXNrSG9vayggVGFza0hhbmRsZV90IHhUYXNrLCB2b2lkICpwdlBhcmFtZXRlciApIEZSRUVSVE9TX1NZU1RFTV9DQUxMOworVGFza0hhbmRsZV90IE1QVV94VGFza0dldElkbGVUYXNrSGFuZGxlKCB2b2lkICkgRlJFRVJUT1NfU1lTVEVNX0NBTEw7CitVQmFzZVR5cGVfdCBNUFVfdXhUYXNrR2V0U3lzdGVtU3RhdGUoIFRhc2tTdGF0dXNfdCAqIGNvbnN0IHB4VGFza1N0YXR1c0FycmF5LCBjb25zdCBVQmFzZVR5cGVfdCB1eEFycmF5U2l6ZSwgdWludDMyX3QgKiBjb25zdCBwdWxUb3RhbFJ1blRpbWUgKSBGUkVFUlRPU19TWVNURU1fQ0FMTDsKK1RpY2tUeXBlX3QgTVBVX3hUYXNrR2V0SWRsZVJ1blRpbWVDb3VudGVyKCB2b2lkICkgRlJFRVJUT1NfU1lTVEVNX0NBTEw7Cit2b2lkIE1QVV92VGFza0xpc3QoIGNoYXIgKiBwY1dyaXRlQnVmZmVyICkgRlJFRVJUT1NfU1lTVEVNX0NBTEw7Cit2b2lkIE1QVV92VGFza0dldFJ1blRpbWVTdGF0cyggY2hhciAqcGNXcml0ZUJ1ZmZlciApIEZSRUVSVE9TX1NZU1RFTV9DQUxMOworQmFzZVR5cGVfdCBNUFVfeFRhc2tHZW5lcmljTm90aWZ5KCBUYXNrSGFuZGxlX3QgeFRhc2tUb05vdGlmeSwgdWludDMyX3QgdWxWYWx1ZSwgZU5vdGlmeUFjdGlvbiBlQWN0aW9uLCB1aW50MzJfdCAqcHVsUHJldmlvdXNOb3RpZmljYXRpb25WYWx1ZSApIEZSRUVSVE9TX1NZU1RFTV9DQUxMOworQmFzZVR5cGVfdCBNUFVfeFRhc2tOb3RpZnlXYWl0KCB1aW50MzJfdCB1bEJpdHNUb0NsZWFyT25FbnRyeSwgdWludDMyX3QgdWxCaXRzVG9DbGVhck9uRXhpdCwgdWludDMyX3QgKnB1bE5vdGlmaWNhdGlvblZhbHVlLCBUaWNrVHlwZV90IHhUaWNrc1RvV2FpdCApIEZSRUVSVE9TX1NZU1RFTV9DQUxMOwordWludDMyX3QgTVBVX3VsVGFza05vdGlmeVRha2UoIEJhc2VUeXBlX3QgeENsZWFyQ291bnRPbkV4aXQsIFRpY2tUeXBlX3QgeFRpY2tzVG9XYWl0ICkgRlJFRVJUT1NfU1lTVEVNX0NBTEw7CitCYXNlVHlwZV90IE1QVV94VGFza05vdGlmeVN0YXRlQ2xlYXIoIFRhc2tIYW5kbGVfdCB4VGFzayApIEZSRUVSVE9TX1NZU1RFTV9DQUxMOworQmFzZVR5cGVfdCBNUFVfeFRhc2tJbmNyZW1lbnRUaWNrKCB2b2lkICkgRlJFRVJUT1NfU1lTVEVNX0NBTEw7CitUYXNrSGFuZGxlX3QgTVBVX3hUYXNrR2V0Q3VycmVudFRhc2tIYW5kbGUoIHZvaWQgKSBGUkVFUlRPU19TWVNURU1fQ0FMTDsKK3ZvaWQgTVBVX3ZUYXNrU2V0VGltZU91dFN0YXRlKCBUaW1lT3V0X3QgKiBjb25zdCBweFRpbWVPdXQgKSBGUkVFUlRPU19TWVNURU1fQ0FMTDsKK0Jhc2VUeXBlX3QgTVBVX3hUYXNrQ2hlY2tGb3JUaW1lT3V0KCBUaW1lT3V0X3QgKiBjb25zdCBweFRpbWVPdXQsIFRpY2tUeXBlX3QgKiBjb25zdCBweFRpY2tzVG9XYWl0ICkgRlJFRVJUT1NfU1lTVEVNX0NBTEw7Cit2b2lkIE1QVV92VGFza01pc3NlZFlpZWxkKCB2b2lkICkgRlJFRVJUT1NfU1lTVEVNX0NBTEw7CitCYXNlVHlwZV90IE1QVV94VGFza0dldFNjaGVkdWxlclN0YXRlKCB2b2lkICkgRlJFRVJUT1NfU1lTVEVNX0NBTEw7CiAKIC8qIE1QVSB2ZXJzaW9ucyBvZiBxdWV1ZS5oIEFQSSBmdW5jdGlvbnMuICovCi1CYXNlVHlwZV90IE1QVV94UXVldWVHZW5lcmljU2VuZCggUXVldWVIYW5kbGVfdCB4UXVldWUsIGNvbnN0IHZvaWQgKiBjb25zdCBwdkl0ZW1Ub1F1ZXVlLCBUaWNrVHlwZV90IHhUaWNrc1RvV2FpdCwgY29uc3QgQmFzZVR5cGVfdCB4Q29weVBvc2l0aW9uICk7Ci1CYXNlVHlwZV90IE1QVV94UXVldWVSZWNlaXZlKCBRdWV1ZUhhbmRsZV90IHhRdWV1ZSwgdm9pZCAqIGNvbnN0IHB2QnVmZmVyLCBUaWNrVHlwZV90IHhUaWNrc1RvV2FpdCApOwotQmFzZVR5cGVfdCBNUFVfeFF1ZXVlUGVlayggUXVldWVIYW5kbGVfdCB4UXVldWUsIHZvaWQgKiBjb25zdCBwdkJ1ZmZlciwgVGlja1R5cGVfdCB4VGlja3NUb1dhaXQgKTsKLUJhc2VUeXBlX3QgTVBVX3hRdWV1ZVNlbWFwaG9yZVRha2UoIFF1ZXVlSGFuZGxlX3QgeFF1ZXVlLCBUaWNrVHlwZV90IHhUaWNrc1RvV2FpdCApOwotVUJhc2VUeXBlX3QgTVBVX3V4UXVldWVNZXNzYWdlc1dhaXRpbmcoIGNvbnN0IFF1ZXVlSGFuZGxlX3QgeFF1ZXVlICk7Ci1VQmFzZVR5cGVfdCBNUFVfdXhRdWV1ZVNwYWNlc0F2YWlsYWJsZSggY29uc3QgUXVldWVIYW5kbGVfdCB4UXVldWUgKTsKLXZvaWQgTVBVX3ZRdWV1ZURlbGV0ZSggUXVldWVIYW5kbGVfdCB4UXVldWUgKTsKLVF1ZXVlSGFuZGxlX3QgTVBVX3hRdWV1ZUNyZWF0ZU11dGV4KCBjb25zdCB1aW50OF90IHVjUXVldWVUeXBlICk7Ci1RdWV1ZUhhbmRsZV90IE1QVV94UXVldWVDcmVhdGVNdXRleFN0YXRpYyggY29uc3QgdWludDhfdCB1Y1F1ZXVlVHlwZSwgU3RhdGljUXVldWVfdCAqcHhTdGF0aWNRdWV1ZSApOwotUXVldWVIYW5kbGVfdCBNUFVfeFF1ZXVlQ3JlYXRlQ291bnRpbmdTZW1hcGhvcmUoIGNvbnN0IFVCYXNlVHlwZV90IHV4TWF4Q291bnQsIGNvbnN0IFVCYXNlVHlwZV90IHV4SW5pdGlhbENvdW50ICk7Ci1RdWV1ZUhhbmRsZV90IE1QVV94UXVldWVDcmVhdGVDb3VudGluZ1NlbWFwaG9yZVN0YXRpYyggY29uc3QgVUJhc2VUeXBlX3QgdXhNYXhDb3VudCwgY29uc3QgVUJhc2VUeXBlX3QgdXhJbml0aWFsQ291bnQsIFN0YXRpY1F1ZXVlX3QgKnB4U3RhdGljUXVldWUgKTsKLXZvaWQqIE1QVV94UXVldWVHZXRNdXRleEhvbGRlciggUXVldWVIYW5kbGVfdCB4U2VtYXBob3JlICk7Ci1CYXNlVHlwZV90IE1QVV94UXVldWVUYWtlTXV0ZXhSZWN1cnNpdmUoIFF1ZXVlSGFuZGxlX3QgeE11dGV4LCBUaWNrVHlwZV90IHhUaWNrc1RvV2FpdCApOwotQmFzZVR5cGVfdCBNUFVfeFF1ZXVlR2l2ZU11dGV4UmVjdXJzaXZlKCBRdWV1ZUhhbmRsZV90IHB4TXV0ZXggKTsKLXZvaWQgTVBVX3ZRdWV1ZUFkZFRvUmVnaXN0cnkoIFF1ZXVlSGFuZGxlX3QgeFF1ZXVlLCBjb25zdCBjaGFyICpwY05hbWUgKTsKLXZvaWQgTVBVX3ZRdWV1ZVVucmVnaXN0ZXJRdWV1ZSggUXVldWVIYW5kbGVfdCB4UXVldWUgKTsKLWNvbnN0IGNoYXIgKiBNUFVfcGNRdWV1ZUdldE5hbWUoIFF1ZXVlSGFuZGxlX3QgeFF1ZXVlICk7Ci1RdWV1ZUhhbmRsZV90IE1QVV94UXVldWVHZW5lcmljQ3JlYXRlKCBjb25zdCBVQmFzZVR5cGVfdCB1eFF1ZXVlTGVuZ3RoLCBjb25zdCBVQmFzZVR5cGVfdCB1eEl0ZW1TaXplLCBjb25zdCB1aW50OF90IHVjUXVldWVUeXBlICk7Ci1RdWV1ZUhhbmRsZV90IE1QVV94UXVldWVHZW5lcmljQ3JlYXRlU3RhdGljKCBjb25zdCBVQmFzZVR5cGVfdCB1eFF1ZXVlTGVuZ3RoLCBjb25zdCBVQmFzZVR5cGVfdCB1eEl0ZW1TaXplLCB1aW50OF90ICpwdWNRdWV1ZVN0b3JhZ2UsIFN0YXRpY1F1ZXVlX3QgKnB4U3RhdGljUXVldWUsIGNvbnN0IHVpbnQ4X3QgdWNRdWV1ZVR5cGUgKTsKLVF1ZXVlU2V0SGFuZGxlX3QgTVBVX3hRdWV1ZUNyZWF0ZVNldCggY29uc3QgVUJhc2VUeXBlX3QgdXhFdmVudFF1ZXVlTGVuZ3RoICk7Ci1CYXNlVHlwZV90IE1QVV94UXVldWVBZGRUb1NldCggUXVldWVTZXRNZW1iZXJIYW5kbGVfdCB4UXVldWVPclNlbWFwaG9yZSwgUXVldWVTZXRIYW5kbGVfdCB4UXVldWVTZXQgKTsKLUJhc2VUeXBlX3QgTVBVX3hRdWV1ZVJlbW92ZUZyb21TZXQoIFF1ZXVlU2V0TWVtYmVySGFuZGxlX3QgeFF1ZXVlT3JTZW1hcGhvcmUsIFF1ZXVlU2V0SGFuZGxlX3QgeFF1ZXVlU2V0ICk7Ci1RdWV1ZVNldE1lbWJlckhhbmRsZV90IE1QVV94UXVldWVTZWxlY3RGcm9tU2V0KCBRdWV1ZVNldEhhbmRsZV90IHhRdWV1ZVNldCwgY29uc3QgVGlja1R5cGVfdCB4VGlja3NUb1dhaXQgKTsKLUJhc2VUeXBlX3QgTVBVX3hRdWV1ZUdlbmVyaWNSZXNldCggUXVldWVIYW5kbGVfdCB4UXVldWUsIEJhc2VUeXBlX3QgeE5ld1F1ZXVlICk7Ci12b2lkIE1QVV92UXVldWVTZXRRdWV1ZU51bWJlciggUXVldWVIYW5kbGVfdCB4UXVldWUsIFVCYXNlVHlwZV90IHV4UXVldWVOdW1iZXIgKTsKLVVCYXNlVHlwZV90IE1QVV91eFF1ZXVlR2V0UXVldWVOdW1iZXIoIFF1ZXVlSGFuZGxlX3QgeFF1ZXVlICk7Ci11aW50OF90IE1QVV91Y1F1ZXVlR2V0UXVldWVUeXBlKCBRdWV1ZUhhbmRsZV90IHhRdWV1ZSApOworQmFzZVR5cGVfdCBNUFVfeFF1ZXVlR2VuZXJpY1NlbmQoIFF1ZXVlSGFuZGxlX3QgeFF1ZXVlLCBjb25zdCB2b2lkICogY29uc3QgcHZJdGVtVG9RdWV1ZSwgVGlja1R5cGVfdCB4VGlja3NUb1dhaXQsIGNvbnN0IEJhc2VUeXBlX3QgeENvcHlQb3NpdGlvbiApIEZSRUVSVE9TX1NZU1RFTV9DQUxMOworQmFzZVR5cGVfdCBNUFVfeFF1ZXVlUmVjZWl2ZSggUXVldWVIYW5kbGVfdCB4UXVldWUsIHZvaWQgKiBjb25zdCBwdkJ1ZmZlciwgVGlja1R5cGVfdCB4VGlja3NUb1dhaXQgKSBGUkVFUlRPU19TWVNURU1fQ0FMTDsKK0Jhc2VUeXBlX3QgTVBVX3hRdWV1ZVBlZWsoIFF1ZXVlSGFuZGxlX3QgeFF1ZXVlLCB2b2lkICogY29uc3QgcHZCdWZmZXIsIFRpY2tUeXBlX3QgeFRpY2tzVG9XYWl0ICkgRlJFRVJUT1NfU1lTVEVNX0NBTEw7CitCYXNlVHlwZV90IE1QVV94UXVldWVTZW1hcGhvcmVUYWtlKCBRdWV1ZUhhbmRsZV90IHhRdWV1ZSwgVGlja1R5cGVfdCB4VGlja3NUb1dhaXQgKSBGUkVFUlRPU19TWVNURU1fQ0FMTDsKK1VCYXNlVHlwZV90IE1QVV91eFF1ZXVlTWVzc2FnZXNXYWl0aW5nKCBjb25zdCBRdWV1ZUhhbmRsZV90IHhRdWV1ZSApIEZSRUVSVE9TX1NZU1RFTV9DQUxMOworVUJhc2VUeXBlX3QgTVBVX3V4UXVldWVTcGFjZXNBdmFpbGFibGUoIGNvbnN0IFF1ZXVlSGFuZGxlX3QgeFF1ZXVlICkgRlJFRVJUT1NfU1lTVEVNX0NBTEw7Cit2b2lkIE1QVV92UXVldWVEZWxldGUoIFF1ZXVlSGFuZGxlX3QgeFF1ZXVlICkgRlJFRVJUT1NfU1lTVEVNX0NBTEw7CitRdWV1ZUhhbmRsZV90IE1QVV94UXVldWVDcmVhdGVNdXRleCggY29uc3QgdWludDhfdCB1Y1F1ZXVlVHlwZSApIEZSRUVSVE9TX1NZU1RFTV9DQUxMOworUXVldWVIYW5kbGVfdCBNUFVfeFF1ZXVlQ3JlYXRlTXV0ZXhTdGF0aWMoIGNvbnN0IHVpbnQ4X3QgdWNRdWV1ZVR5cGUsIFN0YXRpY1F1ZXVlX3QgKnB4U3RhdGljUXVldWUgKSBGUkVFUlRPU19TWVNURU1fQ0FMTDsKK1F1ZXVlSGFuZGxlX3QgTVBVX3hRdWV1ZUNyZWF0ZUNvdW50aW5nU2VtYXBob3JlKCBjb25zdCBVQmFzZVR5cGVfdCB1eE1heENvdW50LCBjb25zdCBVQmFzZVR5cGVfdCB1eEluaXRpYWxDb3VudCApIEZSRUVSVE9TX1NZU1RFTV9DQUxMOworUXVldWVIYW5kbGVfdCBNUFVfeFF1ZXVlQ3JlYXRlQ291bnRpbmdTZW1hcGhvcmVTdGF0aWMoIGNvbnN0IFVCYXNlVHlwZV90IHV4TWF4Q291bnQsIGNvbnN0IFVCYXNlVHlwZV90IHV4SW5pdGlhbENvdW50LCBTdGF0aWNRdWV1ZV90ICpweFN0YXRpY1F1ZXVlICkgRlJFRVJUT1NfU1lTVEVNX0NBTEw7CitUYXNrSGFuZGxlX3QgTVBVX3hRdWV1ZUdldE11dGV4SG9sZGVyKCBRdWV1ZUhhbmRsZV90IHhTZW1hcGhvcmUgKSBGUkVFUlRPU19TWVNURU1fQ0FMTDsKK0Jhc2VUeXBlX3QgTVBVX3hRdWV1ZVRha2VNdXRleFJlY3Vyc2l2ZSggUXVldWVIYW5kbGVfdCB4TXV0ZXgsIFRpY2tUeXBlX3QgeFRpY2tzVG9XYWl0ICkgRlJFRVJUT1NfU1lTVEVNX0NBTEw7CitCYXNlVHlwZV90IE1QVV94UXVldWVHaXZlTXV0ZXhSZWN1cnNpdmUoIFF1ZXVlSGFuZGxlX3QgcHhNdXRleCApIEZSRUVSVE9TX1NZU1RFTV9DQUxMOwordm9pZCBNUFVfdlF1ZXVlQWRkVG9SZWdpc3RyeSggUXVldWVIYW5kbGVfdCB4UXVldWUsIGNvbnN0IGNoYXIgKnBjTmFtZSApIEZSRUVSVE9TX1NZU1RFTV9DQUxMOwordm9pZCBNUFVfdlF1ZXVlVW5yZWdpc3RlclF1ZXVlKCBRdWV1ZUhhbmRsZV90IHhRdWV1ZSApIEZSRUVSVE9TX1NZU1RFTV9DQUxMOworY29uc3QgY2hhciAqIE1QVV9wY1F1ZXVlR2V0TmFtZSggUXVldWVIYW5kbGVfdCB4UXVldWUgKSBGUkVFUlRPU19TWVNURU1fQ0FMTDsKK1F1ZXVlSGFuZGxlX3QgTVBVX3hRdWV1ZUdlbmVyaWNDcmVhdGUoIGNvbnN0IFVCYXNlVHlwZV90IHV4UXVldWVMZW5ndGgsIGNvbnN0IFVCYXNlVHlwZV90IHV4SXRlbVNpemUsIGNvbnN0IHVpbnQ4X3QgdWNRdWV1ZVR5cGUgKSBGUkVFUlRPU19TWVNURU1fQ0FMTDsKK1F1ZXVlSGFuZGxlX3QgTVBVX3hRdWV1ZUdlbmVyaWNDcmVhdGVTdGF0aWMoIGNvbnN0IFVCYXNlVHlwZV90IHV4UXVldWVMZW5ndGgsIGNvbnN0IFVCYXNlVHlwZV90IHV4SXRlbVNpemUsIHVpbnQ4X3QgKnB1Y1F1ZXVlU3RvcmFnZSwgU3RhdGljUXVldWVfdCAqcHhTdGF0aWNRdWV1ZSwgY29uc3QgdWludDhfdCB1Y1F1ZXVlVHlwZSApIEZSRUVSVE9TX1NZU1RFTV9DQUxMOworUXVldWVTZXRIYW5kbGVfdCBNUFVfeFF1ZXVlQ3JlYXRlU2V0KCBjb25zdCBVQmFzZVR5cGVfdCB1eEV2ZW50UXVldWVMZW5ndGggKSBGUkVFUlRPU19TWVNURU1fQ0FMTDsKK0Jhc2VUeXBlX3QgTVBVX3hRdWV1ZUFkZFRvU2V0KCBRdWV1ZVNldE1lbWJlckhhbmRsZV90IHhRdWV1ZU9yU2VtYXBob3JlLCBRdWV1ZVNldEhhbmRsZV90IHhRdWV1ZVNldCApIEZSRUVSVE9TX1NZU1RFTV9DQUxMOworQmFzZVR5cGVfdCBNUFVfeFF1ZXVlUmVtb3ZlRnJvbVNldCggUXVldWVTZXRNZW1iZXJIYW5kbGVfdCB4UXVldWVPclNlbWFwaG9yZSwgUXVldWVTZXRIYW5kbGVfdCB4UXVldWVTZXQgKSBGUkVFUlRPU19TWVNURU1fQ0FMTDsKK1F1ZXVlU2V0TWVtYmVySGFuZGxlX3QgTVBVX3hRdWV1ZVNlbGVjdEZyb21TZXQoIFF1ZXVlU2V0SGFuZGxlX3QgeFF1ZXVlU2V0LCBjb25zdCBUaWNrVHlwZV90IHhUaWNrc1RvV2FpdCApIEZSRUVSVE9TX1NZU1RFTV9DQUxMOworQmFzZVR5cGVfdCBNUFVfeFF1ZXVlR2VuZXJpY1Jlc2V0KCBRdWV1ZUhhbmRsZV90IHhRdWV1ZSwgQmFzZVR5cGVfdCB4TmV3UXVldWUgKSBGUkVFUlRPU19TWVNURU1fQ0FMTDsKK3ZvaWQgTVBVX3ZRdWV1ZVNldFF1ZXVlTnVtYmVyKCBRdWV1ZUhhbmRsZV90IHhRdWV1ZSwgVUJhc2VUeXBlX3QgdXhRdWV1ZU51bWJlciApIEZSRUVSVE9TX1NZU1RFTV9DQUxMOworVUJhc2VUeXBlX3QgTVBVX3V4UXVldWVHZXRRdWV1ZU51bWJlciggUXVldWVIYW5kbGVfdCB4UXVldWUgKSBGUkVFUlRPU19TWVNURU1fQ0FMTDsKK3VpbnQ4X3QgTVBVX3VjUXVldWVHZXRRdWV1ZVR5cGUoIFF1ZXVlSGFuZGxlX3QgeFF1ZXVlICkgRlJFRVJUT1NfU1lTVEVNX0NBTEw7CiAKIC8qIE1QVSB2ZXJzaW9ucyBvZiB0aW1lcnMuaCBBUEkgZnVuY3Rpb25zLiAqLwotVGltZXJIYW5kbGVfdCBNUFVfeFRpbWVyQ3JlYXRlKCBjb25zdCBjaGFyICogY29uc3QgcGNUaW1lck5hbWUsIGNvbnN0IFRpY2tUeXBlX3QgeFRpbWVyUGVyaW9kSW5UaWNrcywgY29uc3QgVUJhc2VUeXBlX3QgdXhBdXRvUmVsb2FkLCB2b2lkICogY29uc3QgcHZUaW1lcklELCBUaW1lckNhbGxiYWNrRnVuY3Rpb25fdCBweENhbGxiYWNrRnVuY3Rpb24gKTsKLVRpbWVySGFuZGxlX3QgTVBVX3hUaW1lckNyZWF0ZVN0YXRpYyggY29uc3QgY2hhciAqIGNvbnN0IHBjVGltZXJOYW1lLCBjb25zdCBUaWNrVHlwZV90IHhUaW1lclBlcmlvZEluVGlja3MsIGNvbnN0IFVCYXNlVHlwZV90IHV4QXV0b1JlbG9hZCwgdm9pZCAqIGNvbnN0IHB2VGltZXJJRCwgVGltZXJDYWxsYmFja0Z1bmN0aW9uX3QgcHhDYWxsYmFja0Z1bmN0aW9uLCBTdGF0aWNUaW1lcl90ICpweFRpbWVyQnVmZmVyICk7Ci12b2lkICogTVBVX3B2VGltZXJHZXRUaW1lcklEKCBjb25zdCBUaW1lckhhbmRsZV90IHhUaW1lciApOwotdm9pZCBNUFVfdlRpbWVyU2V0VGltZXJJRCggVGltZXJIYW5kbGVfdCB4VGltZXIsIHZvaWQgKnB2TmV3SUQgKTsKLUJhc2VUeXBlX3QgTVBVX3hUaW1lcklzVGltZXJBY3RpdmUoIFRpbWVySGFuZGxlX3QgeFRpbWVyICk7Ci1UYXNrSGFuZGxlX3QgTVBVX3hUaW1lckdldFRpbWVyRGFlbW9uVGFza0hhbmRsZSggdm9pZCApOwotQmFzZVR5cGVfdCBNUFVfeFRpbWVyUGVuZEZ1bmN0aW9uQ2FsbCggUGVuZGVkRnVuY3Rpb25fdCB4RnVuY3Rpb25Ub1BlbmQsIHZvaWQgKnB2UGFyYW1ldGVyMSwgdWludDMyX3QgdWxQYXJhbWV0ZXIyLCBUaWNrVHlwZV90IHhUaWNrc1RvV2FpdCApOwotY29uc3QgY2hhciAqIE1QVV9wY1RpbWVyR2V0TmFtZSggVGltZXJIYW5kbGVfdCB4VGltZXIgKTsKLVRpY2tUeXBlX3QgTVBVX3hUaW1lckdldFBlcmlvZCggVGltZXJIYW5kbGVfdCB4VGltZXIgKTsKLVRpY2tUeXBlX3QgTVBVX3hUaW1lckdldEV4cGlyeVRpbWUoIFRpbWVySGFuZGxlX3QgeFRpbWVyICk7Ci1CYXNlVHlwZV90IE1QVV94VGltZXJDcmVhdGVUaW1lclRhc2soIHZvaWQgKTsKLUJhc2VUeXBlX3QgTVBVX3hUaW1lckdlbmVyaWNDb21tYW5kKCBUaW1lckhhbmRsZV90IHhUaW1lciwgY29uc3QgQmFzZVR5cGVfdCB4Q29tbWFuZElELCBjb25zdCBUaWNrVHlwZV90IHhPcHRpb25hbFZhbHVlLCBCYXNlVHlwZV90ICogY29uc3QgcHhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbiwgY29uc3QgVGlja1R5cGVfdCB4VGlja3NUb1dhaXQgKTsKK1RpbWVySGFuZGxlX3QgTVBVX3hUaW1lckNyZWF0ZSggY29uc3QgY2hhciAqIGNvbnN0IHBjVGltZXJOYW1lLCBjb25zdCBUaWNrVHlwZV90IHhUaW1lclBlcmlvZEluVGlja3MsIGNvbnN0IFVCYXNlVHlwZV90IHV4QXV0b1JlbG9hZCwgdm9pZCAqIGNvbnN0IHB2VGltZXJJRCwgVGltZXJDYWxsYmFja0Z1bmN0aW9uX3QgcHhDYWxsYmFja0Z1bmN0aW9uICkgRlJFRVJUT1NfU1lTVEVNX0NBTEw7CitUaW1lckhhbmRsZV90IE1QVV94VGltZXJDcmVhdGVTdGF0aWMoIGNvbnN0IGNoYXIgKiBjb25zdCBwY1RpbWVyTmFtZSwgY29uc3QgVGlja1R5cGVfdCB4VGltZXJQZXJpb2RJblRpY2tzLCBjb25zdCBVQmFzZVR5cGVfdCB1eEF1dG9SZWxvYWQsIHZvaWQgKiBjb25zdCBwdlRpbWVySUQsIFRpbWVyQ2FsbGJhY2tGdW5jdGlvbl90IHB4Q2FsbGJhY2tGdW5jdGlvbiwgU3RhdGljVGltZXJfdCAqcHhUaW1lckJ1ZmZlciApIEZSRUVSVE9TX1NZU1RFTV9DQUxMOwordm9pZCAqIE1QVV9wdlRpbWVyR2V0VGltZXJJRCggY29uc3QgVGltZXJIYW5kbGVfdCB4VGltZXIgKSBGUkVFUlRPU19TWVNURU1fQ0FMTDsKK3ZvaWQgTVBVX3ZUaW1lclNldFRpbWVySUQoIFRpbWVySGFuZGxlX3QgeFRpbWVyLCB2b2lkICpwdk5ld0lEICkgRlJFRVJUT1NfU1lTVEVNX0NBTEw7CitCYXNlVHlwZV90IE1QVV94VGltZXJJc1RpbWVyQWN0aXZlKCBUaW1lckhhbmRsZV90IHhUaW1lciApIEZSRUVSVE9TX1NZU1RFTV9DQUxMOworVGFza0hhbmRsZV90IE1QVV94VGltZXJHZXRUaW1lckRhZW1vblRhc2tIYW5kbGUoIHZvaWQgKSBGUkVFUlRPU19TWVNURU1fQ0FMTDsKK0Jhc2VUeXBlX3QgTVBVX3hUaW1lclBlbmRGdW5jdGlvbkNhbGwoIFBlbmRlZEZ1bmN0aW9uX3QgeEZ1bmN0aW9uVG9QZW5kLCB2b2lkICpwdlBhcmFtZXRlcjEsIHVpbnQzMl90IHVsUGFyYW1ldGVyMiwgVGlja1R5cGVfdCB4VGlja3NUb1dhaXQgKSBGUkVFUlRPU19TWVNURU1fQ0FMTDsKK2NvbnN0IGNoYXIgKiBNUFVfcGNUaW1lckdldE5hbWUoIFRpbWVySGFuZGxlX3QgeFRpbWVyICkgRlJFRVJUT1NfU1lTVEVNX0NBTEw7Cit2b2lkIE1QVV92VGltZXJTZXRSZWxvYWRNb2RlKCBUaW1lckhhbmRsZV90IHhUaW1lciwgY29uc3QgVUJhc2VUeXBlX3QgdXhBdXRvUmVsb2FkICkgRlJFRVJUT1NfU1lTVEVNX0NBTEw7CitUaWNrVHlwZV90IE1QVV94VGltZXJHZXRQZXJpb2QoIFRpbWVySGFuZGxlX3QgeFRpbWVyICkgRlJFRVJUT1NfU1lTVEVNX0NBTEw7CitUaWNrVHlwZV90IE1QVV94VGltZXJHZXRFeHBpcnlUaW1lKCBUaW1lckhhbmRsZV90IHhUaW1lciApIEZSRUVSVE9TX1NZU1RFTV9DQUxMOworQmFzZVR5cGVfdCBNUFVfeFRpbWVyQ3JlYXRlVGltZXJUYXNrKCB2b2lkICkgRlJFRVJUT1NfU1lTVEVNX0NBTEw7CitCYXNlVHlwZV90IE1QVV94VGltZXJHZW5lcmljQ29tbWFuZCggVGltZXJIYW5kbGVfdCB4VGltZXIsIGNvbnN0IEJhc2VUeXBlX3QgeENvbW1hbmRJRCwgY29uc3QgVGlja1R5cGVfdCB4T3B0aW9uYWxWYWx1ZSwgQmFzZVR5cGVfdCAqIGNvbnN0IHB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4sIGNvbnN0IFRpY2tUeXBlX3QgeFRpY2tzVG9XYWl0ICkgRlJFRVJUT1NfU1lTVEVNX0NBTEw7CiAKIC8qIE1QVSB2ZXJzaW9ucyBvZiBldmVudF9ncm91cC5oIEFQSSBmdW5jdGlvbnMuICovCi1FdmVudEdyb3VwSGFuZGxlX3QgTVBVX3hFdmVudEdyb3VwQ3JlYXRlKCB2b2lkICk7Ci1FdmVudEdyb3VwSGFuZGxlX3QgTVBVX3hFdmVudEdyb3VwQ3JlYXRlU3RhdGljKCBTdGF0aWNFdmVudEdyb3VwX3QgKnB4RXZlbnRHcm91cEJ1ZmZlciApOwotRXZlbnRCaXRzX3QgTVBVX3hFdmVudEdyb3VwV2FpdEJpdHMoIEV2ZW50R3JvdXBIYW5kbGVfdCB4RXZlbnRHcm91cCwgY29uc3QgRXZlbnRCaXRzX3QgdXhCaXRzVG9XYWl0Rm9yLCBjb25zdCBCYXNlVHlwZV90IHhDbGVhck9uRXhpdCwgY29uc3QgQmFzZVR5cGVfdCB4V2FpdEZvckFsbEJpdHMsIFRpY2tUeXBlX3QgeFRpY2tzVG9XYWl0ICk7Ci1FdmVudEJpdHNfdCBNUFVfeEV2ZW50R3JvdXBDbGVhckJpdHMoIEV2ZW50R3JvdXBIYW5kbGVfdCB4RXZlbnRHcm91cCwgY29uc3QgRXZlbnRCaXRzX3QgdXhCaXRzVG9DbGVhciApOwotRXZlbnRCaXRzX3QgTVBVX3hFdmVudEdyb3VwU2V0Qml0cyggRXZlbnRHcm91cEhhbmRsZV90IHhFdmVudEdyb3VwLCBjb25zdCBFdmVudEJpdHNfdCB1eEJpdHNUb1NldCApOwotRXZlbnRCaXRzX3QgTVBVX3hFdmVudEdyb3VwU3luYyggRXZlbnRHcm91cEhhbmRsZV90IHhFdmVudEdyb3VwLCBjb25zdCBFdmVudEJpdHNfdCB1eEJpdHNUb1NldCwgY29uc3QgRXZlbnRCaXRzX3QgdXhCaXRzVG9XYWl0Rm9yLCBUaWNrVHlwZV90IHhUaWNrc1RvV2FpdCApOwotdm9pZCBNUFVfdkV2ZW50R3JvdXBEZWxldGUoIEV2ZW50R3JvdXBIYW5kbGVfdCB4RXZlbnRHcm91cCApOwotVUJhc2VUeXBlX3QgTVBVX3V4RXZlbnRHcm91cEdldE51bWJlciggdm9pZCogeEV2ZW50R3JvdXAgKTsKK0V2ZW50R3JvdXBIYW5kbGVfdCBNUFVfeEV2ZW50R3JvdXBDcmVhdGUoIHZvaWQgKSBGUkVFUlRPU19TWVNURU1fQ0FMTDsKK0V2ZW50R3JvdXBIYW5kbGVfdCBNUFVfeEV2ZW50R3JvdXBDcmVhdGVTdGF0aWMoIFN0YXRpY0V2ZW50R3JvdXBfdCAqcHhFdmVudEdyb3VwQnVmZmVyICkgRlJFRVJUT1NfU1lTVEVNX0NBTEw7CitFdmVudEJpdHNfdCBNUFVfeEV2ZW50R3JvdXBXYWl0Qml0cyggRXZlbnRHcm91cEhhbmRsZV90IHhFdmVudEdyb3VwLCBjb25zdCBFdmVudEJpdHNfdCB1eEJpdHNUb1dhaXRGb3IsIGNvbnN0IEJhc2VUeXBlX3QgeENsZWFyT25FeGl0LCBjb25zdCBCYXNlVHlwZV90IHhXYWl0Rm9yQWxsQml0cywgVGlja1R5cGVfdCB4VGlja3NUb1dhaXQgKSBGUkVFUlRPU19TWVNURU1fQ0FMTDsKK0V2ZW50Qml0c190IE1QVV94RXZlbnRHcm91cENsZWFyQml0cyggRXZlbnRHcm91cEhhbmRsZV90IHhFdmVudEdyb3VwLCBjb25zdCBFdmVudEJpdHNfdCB1eEJpdHNUb0NsZWFyICkgRlJFRVJUT1NfU1lTVEVNX0NBTEw7CitFdmVudEJpdHNfdCBNUFVfeEV2ZW50R3JvdXBTZXRCaXRzKCBFdmVudEdyb3VwSGFuZGxlX3QgeEV2ZW50R3JvdXAsIGNvbnN0IEV2ZW50Qml0c190IHV4Qml0c1RvU2V0ICkgRlJFRVJUT1NfU1lTVEVNX0NBTEw7CitFdmVudEJpdHNfdCBNUFVfeEV2ZW50R3JvdXBTeW5jKCBFdmVudEdyb3VwSGFuZGxlX3QgeEV2ZW50R3JvdXAsIGNvbnN0IEV2ZW50Qml0c190IHV4Qml0c1RvU2V0LCBjb25zdCBFdmVudEJpdHNfdCB1eEJpdHNUb1dhaXRGb3IsIFRpY2tUeXBlX3QgeFRpY2tzVG9XYWl0ICkgRlJFRVJUT1NfU1lTVEVNX0NBTEw7Cit2b2lkIE1QVV92RXZlbnRHcm91cERlbGV0ZSggRXZlbnRHcm91cEhhbmRsZV90IHhFdmVudEdyb3VwICkgRlJFRVJUT1NfU1lTVEVNX0NBTEw7CitVQmFzZVR5cGVfdCBNUFVfdXhFdmVudEdyb3VwR2V0TnVtYmVyKCB2b2lkKiB4RXZlbnRHcm91cCApIEZSRUVSVE9TX1NZU1RFTV9DQUxMOwogCiAvKiBNUFUgdmVyc2lvbnMgb2YgbWVzc2FnZS9zdHJlYW1fYnVmZmVyLmggQVBJIGZ1bmN0aW9ucy4gKi8KLXNpemVfdCBNUFVfeFN0cmVhbUJ1ZmZlclNlbmQoIFN0cmVhbUJ1ZmZlckhhbmRsZV90IHhTdHJlYW1CdWZmZXIsIGNvbnN0IHZvaWQgKnB2VHhEYXRhLCBzaXplX3QgeERhdGFMZW5ndGhCeXRlcywgVGlja1R5cGVfdCB4VGlja3NUb1dhaXQgKTsKLXNpemVfdCBNUFVfeFN0cmVhbUJ1ZmZlclNlbmRGcm9tSVNSKCBTdHJlYW1CdWZmZXJIYW5kbGVfdCB4U3RyZWFtQnVmZmVyLCBjb25zdCB2b2lkICpwdlR4RGF0YSwgc2l6ZV90IHhEYXRhTGVuZ3RoQnl0ZXMsIEJhc2VUeXBlX3QgKiBjb25zdCBweEhpZ2hlclByaW9yaXR5VGFza1dva2VuICk7Ci1zaXplX3QgTVBVX3hTdHJlYW1CdWZmZXJSZWNlaXZlKCBTdHJlYW1CdWZmZXJIYW5kbGVfdCB4U3RyZWFtQnVmZmVyLCB2b2lkICpwdlJ4RGF0YSwgc2l6ZV90IHhCdWZmZXJMZW5ndGhCeXRlcywgVGlja1R5cGVfdCB4VGlja3NUb1dhaXQgKTsKLXNpemVfdCBNUFVfeFN0cmVhbUJ1ZmZlclJlY2VpdmVGcm9tSVNSKCBTdHJlYW1CdWZmZXJIYW5kbGVfdCB4U3RyZWFtQnVmZmVyLCB2b2lkICpwdlJ4RGF0YSwgc2l6ZV90IHhCdWZmZXJMZW5ndGhCeXRlcywgQmFzZVR5cGVfdCAqIGNvbnN0IHB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gKTsKLXZvaWQgTVBVX3ZTdHJlYW1CdWZmZXJEZWxldGUoIFN0cmVhbUJ1ZmZlckhhbmRsZV90IHhTdHJlYW1CdWZmZXIgKTsKLUJhc2VUeXBlX3QgTVBVX3hTdHJlYW1CdWZmZXJJc0Z1bGwoIFN0cmVhbUJ1ZmZlckhhbmRsZV90IHhTdHJlYW1CdWZmZXIgKTsKLUJhc2VUeXBlX3QgTVBVX3hTdHJlYW1CdWZmZXJJc0VtcHR5KCBTdHJlYW1CdWZmZXJIYW5kbGVfdCB4U3RyZWFtQnVmZmVyICk7Ci1CYXNlVHlwZV90IE1QVV94U3RyZWFtQnVmZmVyUmVzZXQoIFN0cmVhbUJ1ZmZlckhhbmRsZV90IHhTdHJlYW1CdWZmZXIgKTsKLXNpemVfdCBNUFVfeFN0cmVhbUJ1ZmZlclNwYWNlc0F2YWlsYWJsZSggU3RyZWFtQnVmZmVySGFuZGxlX3QgeFN0cmVhbUJ1ZmZlciApOwotc2l6ZV90IE1QVV94U3RyZWFtQnVmZmVyQnl0ZXNBdmFpbGFibGUoIFN0cmVhbUJ1ZmZlckhhbmRsZV90IHhTdHJlYW1CdWZmZXIgKTsKLUJhc2VUeXBlX3QgTVBVX3hTdHJlYW1CdWZmZXJTZXRUcmlnZ2VyTGV2ZWwoIFN0cmVhbUJ1ZmZlckhhbmRsZV90IHhTdHJlYW1CdWZmZXIsIHNpemVfdCB4VHJpZ2dlckxldmVsICk7Ci1TdHJlYW1CdWZmZXJIYW5kbGVfdCBNUFVfeFN0cmVhbUJ1ZmZlckdlbmVyaWNDcmVhdGUoIHNpemVfdCB4QnVmZmVyU2l6ZUJ5dGVzLCBzaXplX3QgeFRyaWdnZXJMZXZlbEJ5dGVzLCBCYXNlVHlwZV90IHhJc01lc3NhZ2VCdWZmZXIgKTsKLVN0cmVhbUJ1ZmZlckhhbmRsZV90IE1QVV94U3RyZWFtQnVmZmVyR2VuZXJpY0NyZWF0ZVN0YXRpYyggc2l6ZV90IHhCdWZmZXJTaXplQnl0ZXMsIHNpemVfdCB4VHJpZ2dlckxldmVsQnl0ZXMsIEJhc2VUeXBlX3QgeElzTWVzc2FnZUJ1ZmZlciwgdWludDhfdCAqIGNvbnN0IHB1Y1N0cmVhbUJ1ZmZlclN0b3JhZ2VBcmVhLCBTdGF0aWNTdHJlYW1CdWZmZXJfdCAqIGNvbnN0IHB4U3RhdGljU3RyZWFtQnVmZmVyICk7CitzaXplX3QgTVBVX3hTdHJlYW1CdWZmZXJTZW5kKCBTdHJlYW1CdWZmZXJIYW5kbGVfdCB4U3RyZWFtQnVmZmVyLCBjb25zdCB2b2lkICpwdlR4RGF0YSwgc2l6ZV90IHhEYXRhTGVuZ3RoQnl0ZXMsIFRpY2tUeXBlX3QgeFRpY2tzVG9XYWl0ICkgRlJFRVJUT1NfU1lTVEVNX0NBTEw7CitzaXplX3QgTVBVX3hTdHJlYW1CdWZmZXJSZWNlaXZlKCBTdHJlYW1CdWZmZXJIYW5kbGVfdCB4U3RyZWFtQnVmZmVyLCB2b2lkICpwdlJ4RGF0YSwgc2l6ZV90IHhCdWZmZXJMZW5ndGhCeXRlcywgVGlja1R5cGVfdCB4VGlja3NUb1dhaXQgKSBGUkVFUlRPU19TWVNURU1fQ0FMTDsKK3NpemVfdCBNUFVfeFN0cmVhbUJ1ZmZlck5leHRNZXNzYWdlTGVuZ3RoQnl0ZXMoIFN0cmVhbUJ1ZmZlckhhbmRsZV90IHhTdHJlYW1CdWZmZXIgKSBGUkVFUlRPU19TWVNURU1fQ0FMTDsKK3ZvaWQgTVBVX3ZTdHJlYW1CdWZmZXJEZWxldGUoIFN0cmVhbUJ1ZmZlckhhbmRsZV90IHhTdHJlYW1CdWZmZXIgKSBGUkVFUlRPU19TWVNURU1fQ0FMTDsKK0Jhc2VUeXBlX3QgTVBVX3hTdHJlYW1CdWZmZXJJc0Z1bGwoIFN0cmVhbUJ1ZmZlckhhbmRsZV90IHhTdHJlYW1CdWZmZXIgKSBGUkVFUlRPU19TWVNURU1fQ0FMTDsKK0Jhc2VUeXBlX3QgTVBVX3hTdHJlYW1CdWZmZXJJc0VtcHR5KCBTdHJlYW1CdWZmZXJIYW5kbGVfdCB4U3RyZWFtQnVmZmVyICkgRlJFRVJUT1NfU1lTVEVNX0NBTEw7CitCYXNlVHlwZV90IE1QVV94U3RyZWFtQnVmZmVyUmVzZXQoIFN0cmVhbUJ1ZmZlckhhbmRsZV90IHhTdHJlYW1CdWZmZXIgKSBGUkVFUlRPU19TWVNURU1fQ0FMTDsKK3NpemVfdCBNUFVfeFN0cmVhbUJ1ZmZlclNwYWNlc0F2YWlsYWJsZSggU3RyZWFtQnVmZmVySGFuZGxlX3QgeFN0cmVhbUJ1ZmZlciApIEZSRUVSVE9TX1NZU1RFTV9DQUxMOworc2l6ZV90IE1QVV94U3RyZWFtQnVmZmVyQnl0ZXNBdmFpbGFibGUoIFN0cmVhbUJ1ZmZlckhhbmRsZV90IHhTdHJlYW1CdWZmZXIgKSBGUkVFUlRPU19TWVNURU1fQ0FMTDsKK0Jhc2VUeXBlX3QgTVBVX3hTdHJlYW1CdWZmZXJTZXRUcmlnZ2VyTGV2ZWwoIFN0cmVhbUJ1ZmZlckhhbmRsZV90IHhTdHJlYW1CdWZmZXIsIHNpemVfdCB4VHJpZ2dlckxldmVsICkgRlJFRVJUT1NfU1lTVEVNX0NBTEw7CitTdHJlYW1CdWZmZXJIYW5kbGVfdCBNUFVfeFN0cmVhbUJ1ZmZlckdlbmVyaWNDcmVhdGUoIHNpemVfdCB4QnVmZmVyU2l6ZUJ5dGVzLCBzaXplX3QgeFRyaWdnZXJMZXZlbEJ5dGVzLCBCYXNlVHlwZV90IHhJc01lc3NhZ2VCdWZmZXIgKSBGUkVFUlRPU19TWVNURU1fQ0FMTDsKK1N0cmVhbUJ1ZmZlckhhbmRsZV90IE1QVV94U3RyZWFtQnVmZmVyR2VuZXJpY0NyZWF0ZVN0YXRpYyggc2l6ZV90IHhCdWZmZXJTaXplQnl0ZXMsIHNpemVfdCB4VHJpZ2dlckxldmVsQnl0ZXMsIEJhc2VUeXBlX3QgeElzTWVzc2FnZUJ1ZmZlciwgdWludDhfdCAqIGNvbnN0IHB1Y1N0cmVhbUJ1ZmZlclN0b3JhZ2VBcmVhLCBTdGF0aWNTdHJlYW1CdWZmZXJfdCAqIGNvbnN0IHB4U3RhdGljU3RyZWFtQnVmZmVyICkgRlJFRVJUT1NfU1lTVEVNX0NBTEw7CiAKIAogCmRpZmYgLS1naXQgYS9Tb3VyY2UvaW5jbHVkZS9tcHVfd3JhcHBlcnMuaCBiL1NvdXJjZS9pbmNsdWRlL21wdV93cmFwcGVycy5oCmluZGV4IGViMzI2ZTcuLjcxMTM5M2YgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9pbmNsdWRlL21wdV93cmFwcGVycy5oCisrKyBiL1NvdXJjZS9pbmNsdWRlL21wdV93cmFwcGVycy5oCkBAIC0xLDYgKzEsNiBAQAogLyoKLSAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMC4xCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjIuMQorICogQ29weXJpZ2h0IChDKSAyMDE5IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKICAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKICAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCkBAIC02Nyw2ICs2Nyw3IEBACiAJCSNkZWZpbmUgcGNUYXNrR2V0TmFtZQkJCQkJCQlNUFVfcGNUYXNrR2V0TmFtZQogCQkjZGVmaW5lIHhUYXNrR2V0SGFuZGxlCQkJCQkJCU1QVV94VGFza0dldEhhbmRsZQogCQkjZGVmaW5lIHV4VGFza0dldFN0YWNrSGlnaFdhdGVyTWFyawkJCQlNUFVfdXhUYXNrR2V0U3RhY2tIaWdoV2F0ZXJNYXJrCisJCSNkZWZpbmUgdXhUYXNrR2V0U3RhY2tIaWdoV2F0ZXJNYXJrMgkJCU1QVV91eFRhc2tHZXRTdGFja0hpZ2hXYXRlck1hcmsyCiAJCSNkZWZpbmUgdlRhc2tTZXRBcHBsaWNhdGlvblRhc2tUYWcJCQkJTVBVX3ZUYXNrU2V0QXBwbGljYXRpb25UYXNrVGFnCiAJCSNkZWZpbmUgeFRhc2tHZXRBcHBsaWNhdGlvblRhc2tUYWcJCQkJTVBVX3hUYXNrR2V0QXBwbGljYXRpb25UYXNrVGFnCiAJCSNkZWZpbmUgdlRhc2tTZXRUaHJlYWRMb2NhbFN0b3JhZ2VQb2ludGVyCQlNUFVfdlRhc2tTZXRUaHJlYWRMb2NhbFN0b3JhZ2VQb2ludGVyCkBAIC03Niw2ICs3Nyw3IEBACiAJCSNkZWZpbmUgdXhUYXNrR2V0U3lzdGVtU3RhdGUJCQkJCU1QVV91eFRhc2tHZXRTeXN0ZW1TdGF0ZQogCQkjZGVmaW5lIHZUYXNrTGlzdAkJCQkJCQkJTVBVX3ZUYXNrTGlzdAogCQkjZGVmaW5lIHZUYXNrR2V0UnVuVGltZVN0YXRzCQkJCQlNUFVfdlRhc2tHZXRSdW5UaW1lU3RhdHMKKwkJI2RlZmluZSB4VGFza0dldElkbGVSdW5UaW1lQ291bnRlcgkJCQlNUFVfeFRhc2tHZXRJZGxlUnVuVGltZUNvdW50ZXIKIAkJI2RlZmluZSB4VGFza0dlbmVyaWNOb3RpZnkJCQkJCQlNUFVfeFRhc2tHZW5lcmljTm90aWZ5CiAJCSNkZWZpbmUgeFRhc2tOb3RpZnlXYWl0CQkJCQkJCU1QVV94VGFza05vdGlmeVdhaXQKIAkJI2RlZmluZSB1bFRhc2tOb3RpZnlUYWtlCQkJCQkJTVBVX3VsVGFza05vdGlmeVRha2UKQEAgLTEyNCw2ICsxMjYsNyBAQAogCQkjZGVmaW5lIHhUaW1lckdldFRpbWVyRGFlbW9uVGFza0hhbmRsZQkJCU1QVV94VGltZXJHZXRUaW1lckRhZW1vblRhc2tIYW5kbGUKIAkJI2RlZmluZSB4VGltZXJQZW5kRnVuY3Rpb25DYWxsCQkJCQlNUFVfeFRpbWVyUGVuZEZ1bmN0aW9uQ2FsbAogCQkjZGVmaW5lIHBjVGltZXJHZXROYW1lCQkJCQkJCU1QVV9wY1RpbWVyR2V0TmFtZQorCQkjZGVmaW5lIHZUaW1lclNldFJlbG9hZE1vZGUJCQkJCQlNUFVfdlRpbWVyU2V0UmVsb2FkTW9kZQogCQkjZGVmaW5lIHhUaW1lckdldFBlcmlvZAkJCQkJCQlNUFVfeFRpbWVyR2V0UGVyaW9kCiAJCSNkZWZpbmUgeFRpbWVyR2V0RXhwaXJ5VGltZQkJCQkJCU1QVV94VGltZXJHZXRFeHBpcnlUaW1lCiAJCSNkZWZpbmUgeFRpbWVyR2VuZXJpY0NvbW1hbmQJCQkJCU1QVV94VGltZXJHZW5lcmljQ29tbWFuZApAQCAtMTQwLDkgKzE0Myw4IEBACiAJCS8qIE1hcCBzdGFuZGFyZCBtZXNzYWdlL3N0cmVhbV9idWZmZXIuaCBBUEkgZnVuY3Rpb25zIHRvIHRoZSBNUFUKIAkJZXF1aXZhbGVudHMuICovCiAJCSNkZWZpbmUgeFN0cmVhbUJ1ZmZlclNlbmQJCQkJCQlNUFVfeFN0cmVhbUJ1ZmZlclNlbmQKLQkJI2RlZmluZSB4U3RyZWFtQnVmZmVyU2VuZEZyb21JU1IJCQkJTVBVX3hTdHJlYW1CdWZmZXJTZW5kRnJvbUlTUgogCQkjZGVmaW5lIHhTdHJlYW1CdWZmZXJSZWNlaXZlCQkJCQlNUFVfeFN0cmVhbUJ1ZmZlclJlY2VpdmUKLQkJI2RlZmluZSB4U3RyZWFtQnVmZmVyUmVjZWl2ZUZyb21JU1IJCQkJTVBVX3hTdHJlYW1CdWZmZXJSZWNlaXZlRnJvbUlTUgorCQkjZGVmaW5lIHhTdHJlYW1CdWZmZXJOZXh0TWVzc2FnZUxlbmd0aEJ5dGVzCQlNUFVfeFN0cmVhbUJ1ZmZlck5leHRNZXNzYWdlTGVuZ3RoQnl0ZXMKIAkJI2RlZmluZSB2U3RyZWFtQnVmZmVyRGVsZXRlCQkJCQkJTVBVX3ZTdHJlYW1CdWZmZXJEZWxldGUKIAkJI2RlZmluZSB4U3RyZWFtQnVmZmVySXNGdWxsCQkJCQkJTVBVX3hTdHJlYW1CdWZmZXJJc0Z1bGwKIAkJI2RlZmluZSB4U3RyZWFtQnVmZmVySXNFbXB0eQkJCQkJTVBVX3hTdHJlYW1CdWZmZXJJc0VtcHR5CkBAIC0xNTksMTIgKzE2MSwxNCBAQAogCQkodXNlZnVsIHdoZW4gdXNpbmcgc3RhdGljYWxseSBhbGxvY2F0ZWQgb2JqZWN0cykuICovCiAJCSNkZWZpbmUgUFJJVklMRUdFRF9GVU5DVElPTgogCQkjZGVmaW5lIFBSSVZJTEVHRURfREFUQSBfX2F0dHJpYnV0ZV9fKChzZWN0aW9uKCJwcml2aWxlZ2VkX2RhdGEiKSkpCisJCSNkZWZpbmUgRlJFRVJUT1NfU1lTVEVNX0NBTEwKIAogCSNlbHNlIC8qIE1QVV9XUkFQUEVSU19JTkNMVURFRF9GUk9NX0FQSV9GSUxFICovCiAKIAkJLyogRW5zdXJlIEFQSSBmdW5jdGlvbnMgZ28gaW4gdGhlIHByaXZpbGVnZWQgZXhlY3V0aW9uIHNlY3Rpb24uICovCiAJCSNkZWZpbmUgUFJJVklMRUdFRF9GVU5DVElPTiBfX2F0dHJpYnV0ZV9fKChzZWN0aW9uKCJwcml2aWxlZ2VkX2Z1bmN0aW9ucyIpKSkKIAkJI2RlZmluZSBQUklWSUxFR0VEX0RBVEEgX19hdHRyaWJ1dGVfXygoc2VjdGlvbigicHJpdmlsZWdlZF9kYXRhIikpKQorCQkjZGVmaW5lIEZSRUVSVE9TX1NZU1RFTV9DQUxMIF9fYXR0cmlidXRlX18oKHNlY3Rpb24oICJmcmVlcnRvc19zeXN0ZW1fY2FsbHMiKSkpCiAKIAkjZW5kaWYgLyogTVBVX1dSQVBQRVJTX0lOQ0xVREVEX0ZST01fQVBJX0ZJTEUgKi8KIApAQCAtMTcyLDYgKzE3Niw3IEBACiAKIAkjZGVmaW5lIFBSSVZJTEVHRURfRlVOQ1RJT04KIAkjZGVmaW5lIFBSSVZJTEVHRURfREFUQQorCSNkZWZpbmUgRlJFRVJUT1NfU1lTVEVNX0NBTEwKIAkjZGVmaW5lIHBvcnRVU0lOR19NUFVfV1JBUFBFUlMgMAogCiAjZW5kaWYgLyogcG9ydFVTSU5HX01QVV9XUkFQUEVSUyAqLwpkaWZmIC0tZ2l0IGEvU291cmNlL2luY2x1ZGUvcG9ydGFibGUuaCBiL1NvdXJjZS9pbmNsdWRlL3BvcnRhYmxlLmgKaW5kZXggM2QwZWYwYS4uNTllODE2OSAxMDA2NDQKLS0tIGEvU291cmNlL2luY2x1ZGUvcG9ydGFibGUuaAorKysgYi9Tb3VyY2UvaW5jbHVkZS9wb3J0YWJsZS5oCkBAIC0xLDYgKzEsNiBAQAogLyoKLSAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMC4xCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjIuMQorICogQ29weXJpZ2h0IChDKSAyMDE5IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKICAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKICAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCkBAIC04NCw2ICs4NCwxNCBAQAogCSNkZWZpbmUgcG9ydE5VTV9DT05GSUdVUkFCTEVfUkVHSU9OUyAxCiAjZW5kaWYKIAorI2lmbmRlZiBwb3J0SEFTX1NUQUNLX09WRVJGTE9XX0NIRUNLSU5HCisJI2RlZmluZSBwb3J0SEFTX1NUQUNLX09WRVJGTE9XX0NIRUNLSU5HIDAKKyNlbmRpZgorCisjaWZuZGVmIHBvcnRBUkNIX05BTUUKKwkjZGVmaW5lIHBvcnRBUkNIX05BTUUgTlVMTAorI2VuZGlmCisKICNpZmRlZiBfX2NwbHVzcGx1cwogZXh0ZXJuICJDIiB7CiAjZW5kaWYKQEAgLTk3LDkgKzEwNSwxNyBAQAogICoKICAqLwogI2lmKCBwb3J0VVNJTkdfTVBVX1dSQVBQRVJTID09IDEgKQotCVN0YWNrVHlwZV90ICpweFBvcnRJbml0aWFsaXNlU3RhY2soIFN0YWNrVHlwZV90ICpweFRvcE9mU3RhY2ssIFRhc2tGdW5jdGlvbl90IHB4Q29kZSwgdm9pZCAqcHZQYXJhbWV0ZXJzLCBCYXNlVHlwZV90IHhSdW5Qcml2aWxlZ2VkICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKwkjaWYoIHBvcnRIQVNfU1RBQ0tfT1ZFUkZMT1dfQ0hFQ0tJTkcgPT0gMSApCisJCVN0YWNrVHlwZV90ICpweFBvcnRJbml0aWFsaXNlU3RhY2soIFN0YWNrVHlwZV90ICpweFRvcE9mU3RhY2ssIFN0YWNrVHlwZV90ICpweEVuZE9mU3RhY2ssIFRhc2tGdW5jdGlvbl90IHB4Q29kZSwgdm9pZCAqcHZQYXJhbWV0ZXJzLCBCYXNlVHlwZV90IHhSdW5Qcml2aWxlZ2VkICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKwkjZWxzZQorCQlTdGFja1R5cGVfdCAqcHhQb3J0SW5pdGlhbGlzZVN0YWNrKCBTdGFja1R5cGVfdCAqcHhUb3BPZlN0YWNrLCBUYXNrRnVuY3Rpb25fdCBweENvZGUsIHZvaWQgKnB2UGFyYW1ldGVycywgQmFzZVR5cGVfdCB4UnVuUHJpdmlsZWdlZCApIFBSSVZJTEVHRURfRlVOQ1RJT047CisJI2VuZGlmCiAjZWxzZQotCVN0YWNrVHlwZV90ICpweFBvcnRJbml0aWFsaXNlU3RhY2soIFN0YWNrVHlwZV90ICpweFRvcE9mU3RhY2ssIFRhc2tGdW5jdGlvbl90IHB4Q29kZSwgdm9pZCAqcHZQYXJhbWV0ZXJzICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKwkjaWYoIHBvcnRIQVNfU1RBQ0tfT1ZFUkZMT1dfQ0hFQ0tJTkcgPT0gMSApCisJCVN0YWNrVHlwZV90ICpweFBvcnRJbml0aWFsaXNlU3RhY2soIFN0YWNrVHlwZV90ICpweFRvcE9mU3RhY2ssIFN0YWNrVHlwZV90ICpweEVuZE9mU3RhY2ssIFRhc2tGdW5jdGlvbl90IHB4Q29kZSwgdm9pZCAqcHZQYXJhbWV0ZXJzICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKwkjZWxzZQorCQlTdGFja1R5cGVfdCAqcHhQb3J0SW5pdGlhbGlzZVN0YWNrKCBTdGFja1R5cGVfdCAqcHhUb3BPZlN0YWNrLCBUYXNrRnVuY3Rpb25fdCBweENvZGUsIHZvaWQgKnB2UGFyYW1ldGVycyApIFBSSVZJTEVHRURfRlVOQ1RJT047CisJI2VuZGlmCiAjZW5kaWYKIAogLyogVXNlZCBieSBoZWFwXzUuYy4gKi8KZGlmZiAtLWdpdCBhL1NvdXJjZS9pbmNsdWRlL3Byb2pkZWZzLmggYi9Tb3VyY2UvaW5jbHVkZS9wcm9qZGVmcy5oCmluZGV4IDI3MzM3YTguLmUwNDU4NjEgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9pbmNsdWRlL3Byb2pkZWZzLmgKKysrIGIvU291cmNlL2luY2x1ZGUvcHJvamRlZnMuaApAQCAtMSw2ICsxLDYgQEAKIC8qCi0gKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjAuMQotICogQ29weXJpZ2h0IChDKSAyMDE3IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRnJlZVJUT1MgS2VybmVsIFYxMC4yLjEKKyAqIENvcHlyaWdodCAoQykgMjAxOSBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCiAgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCiAgKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgpkaWZmIC0tZ2l0IGEvU291cmNlL2luY2x1ZGUvcXVldWUuaCBiL1NvdXJjZS9pbmNsdWRlL3F1ZXVlLmgKaW5kZXggYTIzZmExZS4uM2I5ZGE5MyAxMDA2NDQKLS0tIGEvU291cmNlL2luY2x1ZGUvcXVldWUuaAorKysgYi9Tb3VyY2UvaW5jbHVkZS9xdWV1ZS5oCkBAIC0xLDYgKzEsNiBAQAogLyoKLSAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMC4xCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjIuMQorICogQ29weXJpZ2h0IChDKSAyMDE5IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKICAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKICAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCkBAIC0zNywyNyArMzcsMjkgQEAKIGV4dGVybiAiQyIgewogI2VuZGlmCiAKKyNpbmNsdWRlICJ0YXNrLmgiCiAKIC8qKgogICogVHlwZSBieSB3aGljaCBxdWV1ZXMgYXJlIHJlZmVyZW5jZWQuICBGb3IgZXhhbXBsZSwgYSBjYWxsIHRvIHhRdWV1ZUNyZWF0ZSgpCiAgKiByZXR1cm5zIGFuIFF1ZXVlSGFuZGxlX3QgdmFyaWFibGUgdGhhdCBjYW4gdGhlbiBiZSB1c2VkIGFzIGEgcGFyYW1ldGVyIHRvCiAgKiB4UXVldWVTZW5kKCksIHhRdWV1ZVJlY2VpdmUoKSwgZXRjLgogICovCi10eXBlZGVmIHZvaWQgKiBRdWV1ZUhhbmRsZV90Oworc3RydWN0IFF1ZXVlRGVmaW5pdGlvbjsgLyogVXNpbmcgb2xkIG5hbWluZyBjb252ZW50aW9uIHNvIGFzIG5vdCB0byBicmVhayBrZXJuZWwgYXdhcmUgZGVidWdnZXJzLiAqLwordHlwZWRlZiBzdHJ1Y3QgUXVldWVEZWZpbml0aW9uICogUXVldWVIYW5kbGVfdDsKIAogLyoqCiAgKiBUeXBlIGJ5IHdoaWNoIHF1ZXVlIHNldHMgYXJlIHJlZmVyZW5jZWQuICBGb3IgZXhhbXBsZSwgYSBjYWxsIHRvCiAgKiB4UXVldWVDcmVhdGVTZXQoKSByZXR1cm5zIGFuIHhRdWV1ZVNldCB2YXJpYWJsZSB0aGF0IGNhbiB0aGVuIGJlIHVzZWQgYXMgYQogICogcGFyYW1ldGVyIHRvIHhRdWV1ZVNlbGVjdEZyb21TZXQoKSwgeFF1ZXVlQWRkVG9TZXQoKSwgZXRjLgogICovCi10eXBlZGVmIHZvaWQgKiBRdWV1ZVNldEhhbmRsZV90OwordHlwZWRlZiBzdHJ1Y3QgUXVldWVEZWZpbml0aW9uICogUXVldWVTZXRIYW5kbGVfdDsKIAogLyoqCiAgKiBRdWV1ZSBzZXRzIGNhbiBjb250YWluIGJvdGggcXVldWVzIGFuZCBzZW1hcGhvcmVzLCBzbyB0aGUKICAqIFF1ZXVlU2V0TWVtYmVySGFuZGxlX3QgaXMgZGVmaW5lZCBhcyBhIHR5cGUgdG8gYmUgdXNlZCB3aGVyZSBhIHBhcmFtZXRlciBvcgogICogcmV0dXJuIHZhbHVlIGNhbiBiZSBlaXRoZXIgYW4gUXVldWVIYW5kbGVfdCBvciBhbiBTZW1hcGhvcmVIYW5kbGVfdC4KICAqLwotdHlwZWRlZiB2b2lkICogUXVldWVTZXRNZW1iZXJIYW5kbGVfdDsKK3R5cGVkZWYgc3RydWN0IFF1ZXVlRGVmaW5pdGlvbiAqIFF1ZXVlU2V0TWVtYmVySGFuZGxlX3Q7CiAKIC8qIEZvciBpbnRlcm5hbCB1c2Ugb25seS4gKi8KICNkZWZpbmUJcXVldWVTRU5EX1RPX0JBQ0sJCSggKCBCYXNlVHlwZV90ICkgMCApCkBAIC0xNDE0LDE1ICsxNDE2LDE1IEBACiBRdWV1ZUhhbmRsZV90IHhRdWV1ZUNyZWF0ZUNvdW50aW5nU2VtYXBob3JlKCBjb25zdCBVQmFzZVR5cGVfdCB1eE1heENvdW50LCBjb25zdCBVQmFzZVR5cGVfdCB1eEluaXRpYWxDb3VudCApIFBSSVZJTEVHRURfRlVOQ1RJT047CiBRdWV1ZUhhbmRsZV90IHhRdWV1ZUNyZWF0ZUNvdW50aW5nU2VtYXBob3JlU3RhdGljKCBjb25zdCBVQmFzZVR5cGVfdCB1eE1heENvdW50LCBjb25zdCBVQmFzZVR5cGVfdCB1eEluaXRpYWxDb3VudCwgU3RhdGljUXVldWVfdCAqcHhTdGF0aWNRdWV1ZSApIFBSSVZJTEVHRURfRlVOQ1RJT047CiBCYXNlVHlwZV90IHhRdWV1ZVNlbWFwaG9yZVRha2UoIFF1ZXVlSGFuZGxlX3QgeFF1ZXVlLCBUaWNrVHlwZV90IHhUaWNrc1RvV2FpdCApIFBSSVZJTEVHRURfRlVOQ1RJT047Ci12b2lkKiB4UXVldWVHZXRNdXRleEhvbGRlciggUXVldWVIYW5kbGVfdCB4U2VtYXBob3JlICkgUFJJVklMRUdFRF9GVU5DVElPTjsKLXZvaWQqIHhRdWV1ZUdldE11dGV4SG9sZGVyRnJvbUlTUiggUXVldWVIYW5kbGVfdCB4U2VtYXBob3JlICkgUFJJVklMRUdFRF9GVU5DVElPTjsKK1Rhc2tIYW5kbGVfdCB4UXVldWVHZXRNdXRleEhvbGRlciggUXVldWVIYW5kbGVfdCB4U2VtYXBob3JlICkgUFJJVklMRUdFRF9GVU5DVElPTjsKK1Rhc2tIYW5kbGVfdCB4UXVldWVHZXRNdXRleEhvbGRlckZyb21JU1IoIFF1ZXVlSGFuZGxlX3QgeFNlbWFwaG9yZSApIFBSSVZJTEVHRURfRlVOQ1RJT047CiAKIC8qCiAgKiBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuICBVc2UgeFNlbWFwaG9yZVRha2VNdXRleFJlY3Vyc2l2ZSgpIG9yCiAgKiB4U2VtYXBob3JlR2l2ZU11dGV4UmVjdXJzaXZlKCkgaW5zdGVhZCBvZiBjYWxsaW5nIHRoZXNlIGZ1bmN0aW9ucyBkaXJlY3RseS4KICAqLwogQmFzZVR5cGVfdCB4UXVldWVUYWtlTXV0ZXhSZWN1cnNpdmUoIFF1ZXVlSGFuZGxlX3QgeE11dGV4LCBUaWNrVHlwZV90IHhUaWNrc1RvV2FpdCApIFBSSVZJTEVHRURfRlVOQ1RJT047Ci1CYXNlVHlwZV90IHhRdWV1ZUdpdmVNdXRleFJlY3Vyc2l2ZSggUXVldWVIYW5kbGVfdCBweE11dGV4ICkgUFJJVklMRUdFRF9GVU5DVElPTjsKK0Jhc2VUeXBlX3QgeFF1ZXVlR2l2ZU11dGV4UmVjdXJzaXZlKCBRdWV1ZUhhbmRsZV90IHhNdXRleCApIFBSSVZJTEVHRURfRlVOQ1RJT047CiAKIC8qCiAgKiBSZXNldCBhIHF1ZXVlIGJhY2sgdG8gaXRzIG9yaWdpbmFsIGVtcHR5IHN0YXRlLiAgVGhlIHJldHVybiB2YWx1ZSBpcyBub3cKQEAgLTE0NTMsNyArMTQ1NSw3IEBACiAgKiBwcmVmZXJhYmx5IGluIFJPTS9GbGFzaCksIG5vdCBvbiB0aGUgc3RhY2suCiAgKi8KICNpZiggY29uZmlnUVVFVUVfUkVHSVNUUllfU0laRSA+IDAgKQotCXZvaWQgdlF1ZXVlQWRkVG9SZWdpc3RyeSggUXVldWVIYW5kbGVfdCB4UXVldWUsIGNvbnN0IGNoYXIgKnBjTmFtZSApIFBSSVZJTEVHRURfRlVOQ1RJT047IC8qbGludCAhZTk3MSBVbnF1YWxpZmllZCBjaGFyIHR5cGVzIGFyZSBhbGxvd2VkIGZvciBzdHJpbmdzIGFuZCBzaW5nbGUgY2hhcmFjdGVycyBvbmx5LiAqLworCXZvaWQgdlF1ZXVlQWRkVG9SZWdpc3RyeSggUXVldWVIYW5kbGVfdCB4UXVldWUsIGNvbnN0IGNoYXIgKnBjUXVldWVOYW1lICkgUFJJVklMRUdFRF9GVU5DVElPTjsgLypsaW50ICFlOTcxIFVucXVhbGlmaWVkIGNoYXIgdHlwZXMgYXJlIGFsbG93ZWQgZm9yIHN0cmluZ3MgYW5kIHNpbmdsZSBjaGFyYWN0ZXJzIG9ubHkuICovCiAjZW5kaWYKIAogLyoKZGlmZiAtLWdpdCBhL1NvdXJjZS9pbmNsdWRlL3NlbXBoci5oIGIvU291cmNlL2luY2x1ZGUvc2VtcGhyLmgKaW5kZXggZTYwM2I0YS4uMmMxMDZlYSAxMDA2NDQKLS0tIGEvU291cmNlL2luY2x1ZGUvc2VtcGhyLmgKKysrIGIvU291cmNlL2luY2x1ZGUvc2VtcGhyLmgKQEAgLTEsNiArMSw2IEBACiAvKgotICogRnJlZVJUT1MgS2VybmVsIFYxMC4wLjEKLSAqIENvcHlyaWdodCAoQykgMjAxNyBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMi4xCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgogICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgogICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KZGlmZiAtLWdpdCBhL1NvdXJjZS9pbmNsdWRlL3N0YWNrX21hY3Jvcy5oIGIvU291cmNlL2luY2x1ZGUvc3RhY2tfbWFjcm9zLmgKaW5kZXggNzlhODNlYS4uMTg0MDZiYiAxMDA2NDQKLS0tIGEvU291cmNlL2luY2x1ZGUvc3RhY2tfbWFjcm9zLmgKKysrIGIvU291cmNlL2luY2x1ZGUvc3RhY2tfbWFjcm9zLmgKQEAgLTEsNiArMSw2IEBACiAvKgotICogRnJlZVJUT1MgS2VybmVsIFYxMC4wLjEKLSAqIENvcHlyaWdodCAoQykgMjAxNyBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMi4xCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgogICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgogICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KQEAgLTgyLDEwICs4MiwxMCBAQAogCQljb25zdCB1aW50MzJfdCAqIGNvbnN0IHB1bFN0YWNrID0gKCB1aW50MzJfdCAqICkgcHhDdXJyZW50VENCLT5weFN0YWNrOwkJCQkJCQlcCiAJCWNvbnN0IHVpbnQzMl90IHVsQ2hlY2tWYWx1ZSA9ICggdWludDMyX3QgKSAweGE1YTVhNWE1OwkJCQkJCQkJCQkJXAogCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlcCi0JCWlmKCAoIHB1bFN0YWNrWyAwIF0gIT0gdWxDaGVja1ZhbHVlICkgfHwJCQkJCQkJCQkJCQlcCi0JCQkoIHB1bFN0YWNrWyAxIF0gIT0gdWxDaGVja1ZhbHVlICkgfHwJCQkJCQkJCQkJCQlcCi0JCQkoIHB1bFN0YWNrWyAyIF0gIT0gdWxDaGVja1ZhbHVlICkgfHwJCQkJCQkJCQkJCQlcCi0JCQkoIHB1bFN0YWNrWyAzIF0gIT0gdWxDaGVja1ZhbHVlICkgKQkJCQkJCQkJCQkJCVwKKwkJaWYoICggcHVsU3RhY2tbIDAgXSAhPSB1bENoZWNrVmFsdWUgKSB8fAkJCQkJCQkJCQkJCQkJXAorCQkJKCBwdWxTdGFja1sgMSBdICE9IHVsQ2hlY2tWYWx1ZSApIHx8CQkJCQkJCQkJCQkJCQlcCisJCQkoIHB1bFN0YWNrWyAyIF0gIT0gdWxDaGVja1ZhbHVlICkgfHwJCQkJCQkJCQkJCQkJCVwKKwkJCSggcHVsU3RhY2tbIDMgXSAhPSB1bENoZWNrVmFsdWUgKSApCQkJCQkJCQkJCQkJCQkJXAogCQl7CQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJXAogCQkJdkFwcGxpY2F0aW9uU3RhY2tPdmVyZmxvd0hvb2soICggVGFza0hhbmRsZV90ICkgcHhDdXJyZW50VENCLCBweEN1cnJlbnRUQ0ItPnBjVGFza05hbWUgKTsJXAogCQl9CQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJXApkaWZmIC0tZ2l0IGEvU291cmNlL2luY2x1ZGUvc3RyZWFtX2J1ZmZlci5oIGIvU291cmNlL2luY2x1ZGUvc3RyZWFtX2J1ZmZlci5oCmluZGV4IDU0MThlMDUuLjBmMDAxMTkgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9pbmNsdWRlL3N0cmVhbV9idWZmZXIuaAorKysgYi9Tb3VyY2UvaW5jbHVkZS9zdHJlYW1fYnVmZmVyLmgKQEAgLTEsNiArMSw2IEBACiAvKgotICogRnJlZVJUT1MgS2VybmVsIFYxMC4wLjEKLSAqIENvcHlyaWdodCAoQykgMjAxNyBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMi4xCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgogICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgogICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KQEAgLTYxLDcgKzYxLDggQEAKICAqIHRoZW4gYmUgdXNlZCBhcyBhIHBhcmFtZXRlciB0byB4U3RyZWFtQnVmZmVyU2VuZCgpLCB4U3RyZWFtQnVmZmVyUmVjZWl2ZSgpLAogICogZXRjLgogICovCi10eXBlZGVmIHZvaWQgKiBTdHJlYW1CdWZmZXJIYW5kbGVfdDsKK3N0cnVjdCBTdHJlYW1CdWZmZXJEZWZfdDsKK3R5cGVkZWYgc3RydWN0IFN0cmVhbUJ1ZmZlckRlZl90ICogU3RyZWFtQnVmZmVySGFuZGxlX3Q7CiAKIAogLyoqCkBAIC0yMjAsNyArMjIxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqcHZUeERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB4RGF0YUxlbmd0aEJ5dGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICBUaWNrVHlwZV90IHhUaWNrc1RvV2FpdCApOwotPHByZT4KKzwvcHJlPgogICoKICAqIFNlbmRzIGJ5dGVzIHRvIGEgc3RyZWFtIGJ1ZmZlci4gIFRoZSBieXRlcyBhcmUgY29waWVkIGludG8gdGhlIHN0cmVhbSBidWZmZXIuCiAgKgpAQCAtMzE3LDcgKzMxOCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpwdlR4RGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB4RGF0YUxlbmd0aEJ5dGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZVR5cGVfdCAqcHhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbiApOwotPHByZT4KKzwvcHJlPgogICoKICAqIEludGVycnVwdCBzYWZlIHZlcnNpb24gb2YgdGhlIEFQSSBmdW5jdGlvbiB0aGF0IHNlbmRzIGEgc3RyZWFtIG9mIGJ5dGVzIHRvCiAgKiB0aGUgc3RyZWFtIGJ1ZmZlci4KQEAgLTgzOSw2ICs4NDAsOCBAQAogCQkJCQkJCQkJCQkJCSAgIHVpbnQ4X3QgKiBjb25zdCBwdWNTdHJlYW1CdWZmZXJTdG9yYWdlQXJlYSwKIAkJCQkJCQkJCQkJCQkgICBTdGF0aWNTdHJlYW1CdWZmZXJfdCAqIGNvbnN0IHB4U3RhdGljU3RyZWFtQnVmZmVyICkgUFJJVklMRUdFRF9GVU5DVElPTjsKIAorc2l6ZV90IHhTdHJlYW1CdWZmZXJOZXh0TWVzc2FnZUxlbmd0aEJ5dGVzKCBTdHJlYW1CdWZmZXJIYW5kbGVfdCB4U3RyZWFtQnVmZmVyICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKwogI2lmKCBjb25maWdVU0VfVFJBQ0VfRkFDSUxJVFkgPT0gMSApCiAJdm9pZCB2U3RyZWFtQnVmZmVyU2V0U3RyZWFtQnVmZmVyTnVtYmVyKCBTdHJlYW1CdWZmZXJIYW5kbGVfdCB4U3RyZWFtQnVmZmVyLCBVQmFzZVR5cGVfdCB1eFN0cmVhbUJ1ZmZlck51bWJlciApIFBSSVZJTEVHRURfRlVOQ1RJT047CiAJVUJhc2VUeXBlX3QgdXhTdHJlYW1CdWZmZXJHZXRTdHJlYW1CdWZmZXJOdW1iZXIoIFN0cmVhbUJ1ZmZlckhhbmRsZV90IHhTdHJlYW1CdWZmZXIgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOwpkaWZmIC0tZ2l0IGEvU291cmNlL2luY2x1ZGUvdGFzay5oIGIvU291cmNlL2luY2x1ZGUvdGFzay5oCmluZGV4IGQwZWUwNjguLmYzY2YxMTggMTAwNjQ0Ci0tLSBhL1NvdXJjZS9pbmNsdWRlL3Rhc2suaAorKysgYi9Tb3VyY2UvaW5jbHVkZS90YXNrLmgKQEAgLTEsNiArMSw2IEBACiAvKgotICogRnJlZVJUT1MgS2VybmVsIFYxMC4wLjEKLSAqIENvcHlyaWdodCAoQykgMjAxNyBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMi4xCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgogICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgogICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KQEAgLTQzLDEwICs0MywxOCBAQAogICogTUFDUk9TIEFORCBERUZJTklUSU9OUwogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotI2RlZmluZSB0c2tLRVJORUxfVkVSU0lPTl9OVU1CRVIgIlYxMC4wLjEiCisjZGVmaW5lIHRza0tFUk5FTF9WRVJTSU9OX05VTUJFUiAiVjEwLjIuMCIKICNkZWZpbmUgdHNrS0VSTkVMX1ZFUlNJT05fTUFKT1IgMTAKLSNkZWZpbmUgdHNrS0VSTkVMX1ZFUlNJT05fTUlOT1IgMAotI2RlZmluZSB0c2tLRVJORUxfVkVSU0lPTl9CVUlMRCAxCisjZGVmaW5lIHRza0tFUk5FTF9WRVJTSU9OX01JTk9SIDIKKyNkZWZpbmUgdHNrS0VSTkVMX1ZFUlNJT05fQlVJTEQgMAorCisvKiBNUFUgcmVnaW9uIHBhcmFtZXRlcnMgcGFzc2VkIGluIHVsUGFyYW1ldGVycworICogb2YgTWVtb3J5UmVnaW9uX3Qgc3RydWN0LiAqLworI2RlZmluZSB0c2tNUFVfUkVHSU9OX1JFQURfT05MWQkJCSggMVVMIDw8IDBVTCApCisjZGVmaW5lIHRza01QVV9SRUdJT05fUkVBRF9XUklURQkJKCAxVUwgPDwgMVVMICkKKyNkZWZpbmUgdHNrTVBVX1JFR0lPTl9FWEVDVVRFX05FVkVSCQkoIDFVTCA8PCAyVUwgKQorI2RlZmluZSB0c2tNUFVfUkVHSU9OX05PUk1BTF9NRU1PUlkJCSggMVVMIDw8IDNVTCApCisjZGVmaW5lIHRza01QVV9SRUdJT05fREVWSUNFX01FTU9SWQkJKCAxVUwgPDwgNFVMICkKIAogLyoqCiAgKiB0YXNrLiBoCkBAIC01OCw3ICs2Niw4IEBACiAgKiBcZGVmZ3JvdXAgVGFza0hhbmRsZV90IFRhc2tIYW5kbGVfdAogICogXGluZ3JvdXAgVGFza3MKICAqLwotdHlwZWRlZiB2b2lkICogVGFza0hhbmRsZV90Oworc3RydWN0IHRza1Rhc2tDb250cm9sQmxvY2s7IC8qIFRoZSBvbGQgbmFtaW5nIGNvbnZlbnRpb24gaXMgdXNlZCB0byBwcmV2ZW50IGJyZWFraW5nIGtlcm5lbCBhd2FyZSBkZWJ1Z2dlcnMuICovCit0eXBlZGVmIHN0cnVjdCB0c2tUYXNrQ29udHJvbEJsb2NrKiBUYXNrSGFuZGxlX3Q7CiAKIC8qCiAgKiBEZWZpbmVzIHRoZSBwcm90b3R5cGUgdG8gd2hpY2ggdGhlIGFwcGxpY2F0aW9uIHRhc2sgaG9vayBmdW5jdGlvbiBtdXN0CkBAIC03NCw3ICs4Myw3IEBACiAJZUJsb2NrZWQsCQkvKiBUaGUgdGFzayBiZWluZyBxdWVyaWVkIGlzIGluIHRoZSBCbG9ja2VkIHN0YXRlLiAqLwogCWVTdXNwZW5kZWQsCQkvKiBUaGUgdGFzayBiZWluZyBxdWVyaWVkIGlzIGluIHRoZSBTdXNwZW5kZWQgc3RhdGUsIG9yIGlzIGluIHRoZSBCbG9ja2VkIHN0YXRlIHdpdGggYW4gaW5maW5pdGUgdGltZSBvdXQuICovCiAJZURlbGV0ZWQsCQkvKiBUaGUgdGFzayBiZWluZyBxdWVyaWVkIGhhcyBiZWVuIGRlbGV0ZWQsIGJ1dCBpdHMgVENCIGhhcyBub3QgeWV0IGJlZW4gZnJlZWQuICovCi0JZUludmFsaWQJCQkvKiBVc2VkIGFzIGFuICdpbnZhbGlkIHN0YXRlJyB2YWx1ZS4gKi8KKwllSW52YWxpZAkJLyogVXNlZCBhcyBhbiAnaW52YWxpZCBzdGF0ZScgdmFsdWUuICovCiB9IGVUYXNrU3RhdGU7CiAKIC8qIEFjdGlvbnMgdGhhdCBjYW4gYmUgcGVyZm9ybWVkIHdoZW4gdlRhc2tOb3RpZnkoKSBpcyBjYWxsZWQuICovCkBAIC0xMTMsNyArMTIyLDcgQEAKIHsKIAlUYXNrRnVuY3Rpb25fdCBwdlRhc2tDb2RlOwogCWNvbnN0IGNoYXIgKiBjb25zdCBwY05hbWU7CS8qbGludCAhZTk3MSBVbnF1YWxpZmllZCBjaGFyIHR5cGVzIGFyZSBhbGxvd2VkIGZvciBzdHJpbmdzIGFuZCBzaW5nbGUgY2hhcmFjdGVycyBvbmx5LiAqLwotCXVpbnQxNl90IHVzU3RhY2tEZXB0aDsKKwljb25maWdTVEFDS19ERVBUSF9UWVBFIHVzU3RhY2tEZXB0aDsKIAl2b2lkICpwdlBhcmFtZXRlcnM7CiAJVUJhc2VUeXBlX3QgdXhQcmlvcml0eTsKIAlTdGFja1R5cGVfdCAqcHV4U3RhY2tCdWZmZXI7CkBAIC0xMzUsNyArMTQ0LDcgQEAKIAlVQmFzZVR5cGVfdCB1eEJhc2VQcmlvcml0eTsJCS8qIFRoZSBwcmlvcml0eSB0byB3aGljaCB0aGUgdGFzayB3aWxsIHJldHVybiBpZiB0aGUgdGFzaydzIGN1cnJlbnQgcHJpb3JpdHkgaGFzIGJlZW4gaW5oZXJpdGVkIHRvIGF2b2lkIHVuYm91bmRlZCBwcmlvcml0eSBpbnZlcnNpb24gd2hlbiBvYnRhaW5pbmcgYSBtdXRleC4gIE9ubHkgdmFsaWQgaWYgY29uZmlnVVNFX01VVEVYRVMgaXMgZGVmaW5lZCBhcyAxIGluIEZyZWVSVE9TQ29uZmlnLmguICovCiAJdWludDMyX3QgdWxSdW5UaW1lQ291bnRlcjsJCS8qIFRoZSB0b3RhbCBydW4gdGltZSBhbGxvY2F0ZWQgdG8gdGhlIHRhc2sgc28gZmFyLCBhcyBkZWZpbmVkIGJ5IHRoZSBydW4gdGltZSBzdGF0cyBjbG9jay4gIFNlZSBodHRwOi8vd3d3LmZyZWVydG9zLm9yZy9ydG9zLXJ1bi10aW1lLXN0YXRzLmh0bWwuICBPbmx5IHZhbGlkIHdoZW4gY29uZmlnR0VORVJBVEVfUlVOX1RJTUVfU1RBVFMgaXMgZGVmaW5lZCBhcyAxIGluIEZyZWVSVE9TQ29uZmlnLmguICovCiAJU3RhY2tUeXBlX3QgKnB4U3RhY2tCYXNlOwkJLyogUG9pbnRzIHRvIHRoZSBsb3dlc3QgYWRkcmVzcyBvZiB0aGUgdGFzaydzIHN0YWNrIGFyZWEuICovCi0JdWludDE2X3QgdXNTdGFja0hpZ2hXYXRlck1hcms7CS8qIFRoZSBtaW5pbXVtIGFtb3VudCBvZiBzdGFjayBzcGFjZSB0aGF0IGhhcyByZW1haW5lZCBmb3IgdGhlIHRhc2sgc2luY2UgdGhlIHRhc2sgd2FzIGNyZWF0ZWQuICBUaGUgY2xvc2VyIHRoaXMgdmFsdWUgaXMgdG8gemVybyB0aGUgY2xvc2VyIHRoZSB0YXNrIGhhcyBjb21lIHRvIG92ZXJmbG93aW5nIGl0cyBzdGFjay4gKi8KKwljb25maWdTVEFDS19ERVBUSF9UWVBFIHVzU3RhY2tIaWdoV2F0ZXJNYXJrOwkvKiBUaGUgbWluaW11bSBhbW91bnQgb2Ygc3RhY2sgc3BhY2UgdGhhdCBoYXMgcmVtYWluZWQgZm9yIHRoZSB0YXNrIHNpbmNlIHRoZSB0YXNrIHdhcyBjcmVhdGVkLiAgVGhlIGNsb3NlciB0aGlzIHZhbHVlIGlzIHRvIHplcm8gdGhlIGNsb3NlciB0aGUgdGFzayBoYXMgY29tZSB0byBvdmVyZmxvd2luZyBpdHMgc3RhY2suICovCiB9IFRhc2tTdGF0dXNfdDsKIAogLyogUG9zc2libGUgcmV0dXJuIHZhbHVlcyBmb3IgZVRhc2tDb25maXJtU2xlZXBNb2RlU3RhdHVzKCkuICovCkBAIC0zNzUsOSArMzg0LDkgQEAKICAqIG1lbW9yeSB0byBiZSBhbGxvY2F0ZWQgZHluYW1pY2FsbHkuCiAgKgogICogQHJldHVybiBJZiBuZWl0aGVyIHB4U3RhY2tCdWZmZXIgb3IgcHhUYXNrQnVmZmVyIGFyZSBOVUxMLCB0aGVuIHRoZSB0YXNrIHdpbGwKLSAqIGJlIGNyZWF0ZWQgYW5kIHBkUEFTUyBpcyByZXR1cm5lZC4gIElmIGVpdGhlciBweFN0YWNrQnVmZmVyIG9yIHB4VGFza0J1ZmZlcgotICogYXJlIE5VTEwgdGhlbiB0aGUgdGFzayB3aWxsIG5vdCBiZSBjcmVhdGVkIGFuZAotICogZXJyQ09VTERfTk9UX0FMTE9DQVRFX1JFUVVJUkVEX01FTU9SWSBpcyByZXR1cm5lZC4KKyAqIGJlIGNyZWF0ZWQgYW5kIGEgaGFuZGxlIHRvIHRoZSBjcmVhdGVkIHRhc2sgaXMgcmV0dXJuZWQuICBJZiBlaXRoZXIKKyAqIHB4U3RhY2tCdWZmZXIgb3IgcHhUYXNrQnVmZmVyIGFyZSBOVUxMIHRoZW4gdGhlIHRhc2sgd2lsbCBub3QgYmUgY3JlYXRlZCBhbmQKKyAqIE5VTEwgaXMgcmV0dXJuZWQuCiAgKgogICogRXhhbXBsZSB1c2FnZToKICAgIDxwcmU+CkBAIC04MzQsNyArODQzLDcgQEAKIAogLyoqCiAgKiB0YXNrLiBoCi0gKiA8cHJlPlVCYXNlVHlwZV90IHV4VGFza1ByaW9yaXR5R2V0KCBUYXNrSGFuZGxlX3QgeFRhc2sgKTs8L3ByZT4KKyAqIDxwcmU+VUJhc2VUeXBlX3QgdXhUYXNrUHJpb3JpdHlHZXQoIGNvbnN0IFRhc2tIYW5kbGVfdCB4VGFzayApOzwvcHJlPgogICoKICAqIElOQ0xVREVfdXhUYXNrUHJpb3JpdHlHZXQgbXVzdCBiZSBkZWZpbmVkIGFzIDEgZm9yIHRoaXMgZnVuY3Rpb24gdG8gYmUgYXZhaWxhYmxlLgogICogU2VlIHRoZSBjb25maWd1cmF0aW9uIHNlY3Rpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24uCkBAIC04NzcsMTUgKzg4NiwxNSBAQAogICogXGRlZmdyb3VwIHV4VGFza1ByaW9yaXR5R2V0IHV4VGFza1ByaW9yaXR5R2V0CiAgKiBcaW5ncm91cCBUYXNrQ3RybAogICovCi1VQmFzZVR5cGVfdCB1eFRhc2tQcmlvcml0eUdldCggVGFza0hhbmRsZV90IHhUYXNrICkgUFJJVklMRUdFRF9GVU5DVElPTjsKK1VCYXNlVHlwZV90IHV4VGFza1ByaW9yaXR5R2V0KCBjb25zdCBUYXNrSGFuZGxlX3QgeFRhc2sgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOwogCiAvKioKICAqIHRhc2suIGgKLSAqIDxwcmU+VUJhc2VUeXBlX3QgdXhUYXNrUHJpb3JpdHlHZXRGcm9tSVNSKCBUYXNrSGFuZGxlX3QgeFRhc2sgKTs8L3ByZT4KKyAqIDxwcmU+VUJhc2VUeXBlX3QgdXhUYXNrUHJpb3JpdHlHZXRGcm9tSVNSKCBjb25zdCBUYXNrSGFuZGxlX3QgeFRhc2sgKTs8L3ByZT4KICAqCiAgKiBBIHZlcnNpb24gb2YgdXhUYXNrUHJpb3JpdHlHZXQoKSB0aGF0IGNhbiBiZSB1c2VkIGZyb20gYW4gSVNSLgogICovCi1VQmFzZVR5cGVfdCB1eFRhc2tQcmlvcml0eUdldEZyb21JU1IoIFRhc2tIYW5kbGVfdCB4VGFzayApIFBSSVZJTEVHRURfRlVOQ1RJT047CitVQmFzZVR5cGVfdCB1eFRhc2tQcmlvcml0eUdldEZyb21JU1IoIGNvbnN0IFRhc2tIYW5kbGVfdCB4VGFzayApIFBSSVZJTEVHRURfRlVOQ1RJT047CiAKIC8qKgogICogdGFzay4gaApAQCAtMTQxMiw2ICsxNDIxLDEyIEBACiAgKiBhIHZhbHVlIG9mIDEgbWVhbnMgNCBieXRlcykgc2luY2UgdGhlIHRhc2sgc3RhcnRlZC4gIFRoZSBzbWFsbGVyIHRoZSByZXR1cm5lZAogICogbnVtYmVyIHRoZSBjbG9zZXIgdGhlIHRhc2sgaGFzIGNvbWUgdG8gb3ZlcmZsb3dpbmcgaXRzIHN0YWNrLgogICoKKyAqIHV4VGFza0dldFN0YWNrSGlnaFdhdGVyTWFyaygpIGFuZCB1eFRhc2tHZXRTdGFja0hpZ2hXYXRlck1hcmsyKCkgYXJlIHRoZQorICogc2FtZSBleGNlcHQgZm9yIHRoZWlyIHJldHVybiB0eXBlLiAgVXNpbmcgY29uZmlnU1RBQ0tfREVQVEhfVFlQRSBhbGxvd3MgdGhlCisgKiB1c2VyIHRvIGRldGVybWluZSB0aGUgcmV0dXJuIHR5cGUuICBJdCBnZXRzIGFyb3VuZCB0aGUgcHJvYmxlbSBvZiB0aGUgdmFsdWUKKyAqIG92ZXJmbG93aW5nIG9uIDgtYml0IHR5cGVzIHdpdGhvdXQgYnJlYWtpbmcgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBmb3IKKyAqIGFwcGxpY2F0aW9ucyB0aGF0IGV4cGVjdCBhbiA4LWJpdCByZXR1cm4gdHlwZS4KKyAqCiAgKiBAcGFyYW0geFRhc2sgSGFuZGxlIG9mIHRoZSB0YXNrIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3RhY2sgdG8gYmUgY2hlY2tlZC4KICAqIFNldCB4VGFzayB0byBOVUxMIHRvIGNoZWNrIHRoZSBzdGFjayBvZiB0aGUgY2FsbGluZyB0YXNrLgogICoKQEAgLTE0MjEsNiArMTQzNiwzMyBAQAogICovCiBVQmFzZVR5cGVfdCB1eFRhc2tHZXRTdGFja0hpZ2hXYXRlck1hcmsoIFRhc2tIYW5kbGVfdCB4VGFzayApIFBSSVZJTEVHRURfRlVOQ1RJT047CiAKKy8qKgorICogdGFzay5oCisgKiA8UFJFPmNvbmZpZ1NUQUNLX0RFUFRIX1RZUEUgdXhUYXNrR2V0U3RhY2tIaWdoV2F0ZXJNYXJrMiggVGFza0hhbmRsZV90IHhUYXNrICk7PC9QUkU+CisgKgorICogSU5DTFVERV91eFRhc2tHZXRTdGFja0hpZ2hXYXRlck1hcmsyIG11c3QgYmUgc2V0IHRvIDEgaW4gRnJlZVJUT1NDb25maWcuaCBmb3IKKyAqIHRoaXMgZnVuY3Rpb24gdG8gYmUgYXZhaWxhYmxlLgorICoKKyAqIFJldHVybnMgdGhlIGhpZ2ggd2F0ZXIgbWFyayBvZiB0aGUgc3RhY2sgYXNzb2NpYXRlZCB3aXRoIHhUYXNrLiAgVGhhdCBpcywKKyAqIHRoZSBtaW5pbXVtIGZyZWUgc3RhY2sgc3BhY2UgdGhlcmUgaGFzIGJlZW4gKGluIHdvcmRzLCBzbyBvbiBhIDMyIGJpdCBtYWNoaW5lCisgKiBhIHZhbHVlIG9mIDEgbWVhbnMgNCBieXRlcykgc2luY2UgdGhlIHRhc2sgc3RhcnRlZC4gIFRoZSBzbWFsbGVyIHRoZSByZXR1cm5lZAorICogbnVtYmVyIHRoZSBjbG9zZXIgdGhlIHRhc2sgaGFzIGNvbWUgdG8gb3ZlcmZsb3dpbmcgaXRzIHN0YWNrLgorICoKKyAqIHV4VGFza0dldFN0YWNrSGlnaFdhdGVyTWFyaygpIGFuZCB1eFRhc2tHZXRTdGFja0hpZ2hXYXRlck1hcmsyKCkgYXJlIHRoZQorICogc2FtZSBleGNlcHQgZm9yIHRoZWlyIHJldHVybiB0eXBlLiAgVXNpbmcgY29uZmlnU1RBQ0tfREVQVEhfVFlQRSBhbGxvd3MgdGhlCisgKiB1c2VyIHRvIGRldGVybWluZSB0aGUgcmV0dXJuIHR5cGUuICBJdCBnZXRzIGFyb3VuZCB0aGUgcHJvYmxlbSBvZiB0aGUgdmFsdWUKKyAqIG92ZXJmbG93aW5nIG9uIDgtYml0IHR5cGVzIHdpdGhvdXQgYnJlYWtpbmcgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBmb3IKKyAqIGFwcGxpY2F0aW9ucyB0aGF0IGV4cGVjdCBhbiA4LWJpdCByZXR1cm4gdHlwZS4KKyAqCisgKiBAcGFyYW0geFRhc2sgSGFuZGxlIG9mIHRoZSB0YXNrIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3RhY2sgdG8gYmUgY2hlY2tlZC4KKyAqIFNldCB4VGFzayB0byBOVUxMIHRvIGNoZWNrIHRoZSBzdGFjayBvZiB0aGUgY2FsbGluZyB0YXNrLgorICoKKyAqIEByZXR1cm4gVGhlIHNtYWxsZXN0IGFtb3VudCBvZiBmcmVlIHN0YWNrIHNwYWNlIHRoZXJlIGhhcyBiZWVuIChpbiB3b3Jkcywgc28KKyAqIGFjdHVhbCBzcGFjZXMgb24gdGhlIHN0YWNrIHJhdGhlciB0aGFuIGJ5dGVzKSBzaW5jZSB0aGUgdGFzayByZWZlcmVuY2VkIGJ5CisgKiB4VGFzayB3YXMgY3JlYXRlZC4KKyAqLworY29uZmlnU1RBQ0tfREVQVEhfVFlQRSB1eFRhc2tHZXRTdGFja0hpZ2hXYXRlck1hcmsyKCBUYXNrSGFuZGxlX3QgeFRhc2sgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCiAvKiBXaGVuIHVzaW5nIHRyYWNlIG1hY3JvcyBpdCBpcyBzb21ldGltZXMgbmVjZXNzYXJ5IHRvIGluY2x1ZGUgdGFzay5oIGJlZm9yZQogRnJlZVJUT1MuaC4gIFdoZW4gdGhpcyBpcyBkb25lIFRhc2tIb29rRnVuY3Rpb25fdCB3aWxsIG5vdCB5ZXQgaGF2ZSBiZWVuIGRlZmluZWQsCiBzbyB0aGUgZm9sbG93aW5nIHR3byBwcm90b3R5cGVzIHdpbGwgY2F1c2UgYSBjb21waWxhdGlvbiBlcnJvci4gIFRoaXMgY2FuIGJlCkBAIC0xNDQzLDkgKzE0ODUsMjAgQEAKIAkJICogdGFzay5oCiAJCSAqIDxwcmU+dm9pZCB4VGFza0dldEFwcGxpY2F0aW9uVGFza1RhZyggVGFza0hhbmRsZV90IHhUYXNrICk7PC9wcmU+CiAJCSAqCi0JCSAqIFJldHVybnMgdGhlIHB4SG9va0Z1bmN0aW9uIHZhbHVlIGFzc2lnbmVkIHRvIHRoZSB0YXNrIHhUYXNrLgorCQkgKiBSZXR1cm5zIHRoZSBweEhvb2tGdW5jdGlvbiB2YWx1ZSBhc3NpZ25lZCB0byB0aGUgdGFzayB4VGFzay4gIERvIG5vdAorCQkgKiBjYWxsIGZyb20gYW4gaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSAtIGNhbGwKKwkJICogeFRhc2tHZXRBcHBsaWNhdGlvblRhc2tUYWdGcm9tSVNSKCkgaW5zdGVhZC4KIAkJICovCiAJCVRhc2tIb29rRnVuY3Rpb25fdCB4VGFza0dldEFwcGxpY2F0aW9uVGFza1RhZyggVGFza0hhbmRsZV90IHhUYXNrICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworCQkvKioKKwkJICogdGFzay5oCisJCSAqIDxwcmU+dm9pZCB4VGFza0dldEFwcGxpY2F0aW9uVGFza1RhZ0Zyb21JU1IoIFRhc2tIYW5kbGVfdCB4VGFzayApOzwvcHJlPgorCQkgKgorCQkgKiBSZXR1cm5zIHRoZSBweEhvb2tGdW5jdGlvbiB2YWx1ZSBhc3NpZ25lZCB0byB0aGUgdGFzayB4VGFzay4gIENhbgorCQkgKiBiZSBjYWxsZWQgZnJvbSBhbiBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lLgorCQkgKi8KKwkJVGFza0hvb2tGdW5jdGlvbl90IHhUYXNrR2V0QXBwbGljYXRpb25UYXNrVGFnRnJvbUlTUiggVGFza0hhbmRsZV90IHhUYXNrICkgUFJJVklMRUdFRF9GVU5DVElPTjsKIAkjZW5kaWYgLyogY29uZmlnVVNFX0FQUExJQ0FUSU9OX1RBU0tfVEFHID09MSAqLwogI2VuZGlmIC8qIGlmZGVmIGNvbmZpZ1VTRV9BUFBMSUNBVElPTl9UQVNLX1RBRyAqLwogCkBAIC0xNjg0LDYgKzE3MzcsMzYgQEAKIHZvaWQgdlRhc2tHZXRSdW5UaW1lU3RhdHMoIGNoYXIgKnBjV3JpdGVCdWZmZXIgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOyAvKmxpbnQgIWU5NzEgVW5xdWFsaWZpZWQgY2hhciB0eXBlcyBhcmUgYWxsb3dlZCBmb3Igc3RyaW5ncyBhbmQgc2luZ2xlIGNoYXJhY3RlcnMgb25seS4gKi8KIAogLyoqCisqIHRhc2suIGgKKyogPFBSRT5UaWNrVHlwZV90IHhUYXNrR2V0SWRsZVJ1blRpbWVDb3VudGVyKCB2b2lkICk7PC9QUkU+CisqCisqIGNvbmZpZ0dFTkVSQVRFX1JVTl9USU1FX1NUQVRTIGFuZCBjb25maWdVU0VfU1RBVFNfRk9STUFUVElOR19GVU5DVElPTlMKKyogbXVzdCBib3RoIGJlIGRlZmluZWQgYXMgMSBmb3IgdGhpcyBmdW5jdGlvbiB0byBiZSBhdmFpbGFibGUuICBUaGUgYXBwbGljYXRpb24KKyogbXVzdCBhbHNvIHRoZW4gcHJvdmlkZSBkZWZpbml0aW9ucyBmb3IKKyogcG9ydENPTkZJR1VSRV9USU1FUl9GT1JfUlVOX1RJTUVfU1RBVFMoKSBhbmQgcG9ydEdFVF9SVU5fVElNRV9DT1VOVEVSX1ZBTFVFKCkKKyogdG8gY29uZmlndXJlIGEgcGVyaXBoZXJhbCB0aW1lci9jb3VudGVyIGFuZCByZXR1cm4gdGhlIHRpbWVycyBjdXJyZW50IGNvdW50CisqIHZhbHVlIHJlc3BlY3RpdmVseS4gIFRoZSBjb3VudGVyIHNob3VsZCBiZSBhdCBsZWFzdCAxMCB0aW1lcyB0aGUgZnJlcXVlbmN5IG9mCisqIHRoZSB0aWNrIGNvdW50LgorKgorKiBTZXR0aW5nIGNvbmZpZ0dFTkVSQVRFX1JVTl9USU1FX1NUQVRTIHRvIDEgd2lsbCByZXN1bHQgaW4gYSB0b3RhbAorKiBhY2N1bXVsYXRlZCBleGVjdXRpb24gdGltZSBiZWluZyBzdG9yZWQgZm9yIGVhY2ggdGFzay4gIFRoZSByZXNvbHV0aW9uCisqIG9mIHRoZSBhY2N1bXVsYXRlZCB0aW1lIHZhbHVlIGRlcGVuZHMgb24gdGhlIGZyZXF1ZW5jeSBvZiB0aGUgdGltZXIKKyogY29uZmlndXJlZCBieSB0aGUgcG9ydENPTkZJR1VSRV9USU1FUl9GT1JfUlVOX1RJTUVfU1RBVFMoKSBtYWNyby4KKyogV2hpbGUgdXhUYXNrR2V0U3lzdGVtU3RhdGUoKSBhbmQgdlRhc2tHZXRSdW5UaW1lU3RhdHMoKSB3cml0ZXMgdGhlIHRvdGFsCisqIGV4ZWN1dGlvbiB0aW1lIG9mIGVhY2ggdGFzayBpbnRvIGEgYnVmZmVyLCB4VGFza0dldElkbGVSdW5UaW1lQ291bnRlcigpCisqIHJldHVybnMgdGhlIHRvdGFsIGV4ZWN1dGlvbiB0aW1lIG9mIGp1c3QgdGhlIGlkbGUgdGFzay4KKyoKKyogQHJldHVybiBUaGUgdG90YWwgcnVuIHRpbWUgb2YgdGhlIGlkbGUgdGFzay4gIFRoaXMgaXMgdGhlIGFtb3VudCBvZiB0aW1lIHRoZQorKiBpZGxlIHRhc2sgaGFzIGFjdHVhbGx5IGJlZW4gZXhlY3V0aW5nLiAgVGhlIHVuaXQgb2YgdGltZSBpcyBkZXBlbmRlbnQgb24gdGhlCisqIGZyZXF1ZW5jeSBjb25maWd1cmVkIHVzaW5nIHRoZSBwb3J0Q09ORklHVVJFX1RJTUVSX0ZPUl9SVU5fVElNRV9TVEFUUygpIGFuZAorKiBwb3J0R0VUX1JVTl9USU1FX0NPVU5URVJfVkFMVUUoKSBtYWNyb3MuCisqCisqIFxkZWZncm91cCB4VGFza0dldElkbGVSdW5UaW1lQ291bnRlciB4VGFza0dldElkbGVSdW5UaW1lQ291bnRlcgorKiBcaW5ncm91cCBUYXNrVXRpbHMKKyovCitUaWNrVHlwZV90IHhUYXNrR2V0SWRsZVJ1blRpbWVDb3VudGVyKCB2b2lkICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworLyoqCiAgKiB0YXNrLiBoCiAgKiA8UFJFPkJhc2VUeXBlX3QgeFRhc2tOb3RpZnkoIFRhc2tIYW5kbGVfdCB4VGFza1RvTm90aWZ5LCB1aW50MzJfdCB1bFZhbHVlLCBlTm90aWZ5QWN0aW9uIGVBY3Rpb24gKTs8L1BSRT4KICAqCkBAIC0yMjIxLDcgKzIzMDQsNyBAQAogICogU2V0cyB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBUQ0IgdG8gdGhlIFRDQiBvZiB0aGUgaGlnaGVzdCBwcmlvcml0eSB0YXNrCiAgKiB0aGF0IGlzIHJlYWR5IHRvIHJ1bi4KICAqLwotdm9pZCB2VGFza1N3aXRjaENvbnRleHQoIHZvaWQgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworcG9ydERPTlRfRElTQ0FSRCB2b2lkIHZUYXNrU3dpdGNoQ29udGV4dCggdm9pZCApIFBSSVZJTEVHRURfRlVOQ1RJT047CiAKIC8qCiAgKiBUSEVTRSBGVU5DVElPTlMgTVVTVCBOT1QgQkUgVVNFRCBGUk9NIEFQUExJQ0FUSU9OIENPREUuICBUSEVZIEFSRSBVU0VEIEJZCkBAIC0yMzAxLDcgKzIzODQsNyBAQAogdm9pZCB2VGFza1N0ZXBUaWNrKCBjb25zdCBUaWNrVHlwZV90IHhUaWNrc1RvSnVtcCApIFBSSVZJTEVHRURfRlVOQ1RJT047CiAKIC8qCi0gKiBPbmx5IGF2aWxhYmxlIHdoZW4gY29uZmlnVVNFX1RJQ0tMRVNTX0lETEUgaXMgc2V0IHRvIDEuCisgKiBPbmx5IGF2YWlsYWJsZSB3aGVuIGNvbmZpZ1VTRV9USUNLTEVTU19JRExFIGlzIHNldCB0byAxLgogICogUHJvdmlkZWQgZm9yIHVzZSB3aXRoaW4gcG9ydFNVUFBSRVNTX1RJQ0tTX0FORF9TTEVFUCgpIHRvIGFsbG93IHRoZSBwb3J0CiAgKiBzcGVjaWZpYyBzbGVlcCBmdW5jdGlvbiB0byBkZXRlcm1pbmUgaWYgaXQgaXMgb2sgdG8gcHJvY2VlZCB3aXRoIHRoZSBzbGVlcCwKICAqIGFuZCBpZiBpdCBpcyBvayB0byBwcm9jZWVkLCBpZiBpdCBpcyBvayB0byBzbGVlcCBpbmRlZmluaXRlbHkuCkBAIC0yMzIwLDcgKzI0MDMsNyBAQAogICogRm9yIGludGVybmFsIHVzZSBvbmx5LiAgSW5jcmVtZW50IHRoZSBtdXRleCBoZWxkIGNvdW50IHdoZW4gYSBtdXRleCBpcwogICogdGFrZW4gYW5kIHJldHVybiB0aGUgaGFuZGxlIG9mIHRoZSB0YXNrIHRoYXQgaGFzIHRha2VuIHRoZSBtdXRleC4KICAqLwotdm9pZCAqcHZUYXNrSW5jcmVtZW50TXV0ZXhIZWxkQ291bnQoIHZvaWQgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworVGFza0hhbmRsZV90IHB2VGFza0luY3JlbWVudE11dGV4SGVsZENvdW50KCB2b2lkICkgUFJJVklMRUdFRF9GVU5DVElPTjsKIAogLyoKICAqIEZvciBpbnRlcm5hbCB1c2Ugb25seS4gIFNhbWUgYXMgdlRhc2tTZXRUaW1lT3V0U3RhdGUoKSwgYnV0IHdpdGhvdXQgYSBjcml0aWFsCmRpZmYgLS1naXQgYS9Tb3VyY2UvaW5jbHVkZS90aW1lcnMuaCBiL1NvdXJjZS9pbmNsdWRlL3RpbWVycy5oCmluZGV4IDA1ZWI5MGYuLmNiNzIxNzkgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9pbmNsdWRlL3RpbWVycy5oCisrKyBiL1NvdXJjZS9pbmNsdWRlL3RpbWVycy5oCkBAIC0xLDYgKzEsNiBAQAogLyoKLSAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMC4xCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjIuMQorICogQ29weXJpZ2h0IChDKSAyMDE5IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKICAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKICAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCkBAIC03Myw3ICs3Myw4IEBACiAgKiByZWZlcmVuY2UgdGhlIHN1YmplY3QgdGltZXIgaW4gY2FsbHMgdG8gb3RoZXIgc29mdHdhcmUgdGltZXIgQVBJIGZ1bmN0aW9ucwogICogKGZvciBleGFtcGxlLCB4VGltZXJTdGFydCgpLCB4VGltZXJSZXNldCgpLCBldGMuKS4KICAqLwotdHlwZWRlZiB2b2lkICogVGltZXJIYW5kbGVfdDsKK3N0cnVjdCB0bXJUaW1lckNvbnRyb2w7IC8qIFRoZSBvbGQgbmFtaW5nIGNvbnZlbnRpb24gaXMgdXNlZCB0byBwcmV2ZW50IGJyZWFraW5nIGtlcm5lbCBhd2FyZSBkZWJ1Z2dlcnMuICovCit0eXBlZGVmIHN0cnVjdCB0bXJUaW1lckNvbnRyb2wgKiBUaW1lckhhbmRsZV90OwogCiAvKgogICogRGVmaW5lcyB0aGUgcHJvdG90eXBlIHRvIHdoaWNoIHRpbWVyIGNhbGxiYWNrIGZ1bmN0aW9ucyBtdXN0IGNvbmZvcm0uCkBAIC0xMjMxLDYgKzEyMzIsMjMgQEAKIGNvbnN0IGNoYXIgKiBwY1RpbWVyR2V0TmFtZSggVGltZXJIYW5kbGVfdCB4VGltZXIgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOyAvKmxpbnQgIWU5NzEgVW5xdWFsaWZpZWQgY2hhciB0eXBlcyBhcmUgYWxsb3dlZCBmb3Igc3RyaW5ncyBhbmQgc2luZ2xlIGNoYXJhY3RlcnMgb25seS4gKi8KIAogLyoqCisgKiB2b2lkIHZUaW1lclNldFJlbG9hZE1vZGUoIFRpbWVySGFuZGxlX3QgeFRpbWVyLCBjb25zdCBVQmFzZVR5cGVfdCB1eEF1dG9SZWxvYWQgKTsKKyAqCisgKiBVcGRhdGVzIGEgdGltZXIgdG8gYmUgZWl0aGVyIGFuIGF1dG9yZWxvYWQgdGltZXIsIGluIHdoaWNoIGNhc2UgdGhlIHRpbWVyCisgKiBhdXRvbWF0aWNhbGx5IHJlc2V0cyBpdHNlbGYgZWFjaCB0aW1lIGl0IGV4cGlyZXMsIG9yIGEgb25lIHNob3QgdGltZXIsIGluCisgKiB3aGljaCBjYXNlIHRoZSB0aW1lciB3aWxsIG9ubHkgZXhwaXJlIG9uY2UgdW5sZXNzIGl0IGlzIG1hbnVhbGx5IHJlc3RhcnRlZC4KKyAqCisgKiBAcGFyYW0geFRpbWVyIFRoZSBoYW5kbGUgb2YgdGhlIHRpbWVyIGJlaW5nIHVwZGF0ZWQuCisgKgorICogQHBhcmFtIHV4QXV0b1JlbG9hZCBJZiB1eEF1dG9SZWxvYWQgaXMgc2V0IHRvIHBkVFJVRSB0aGVuIHRoZSB0aW1lciB3aWxsCisgKiBleHBpcmUgcmVwZWF0ZWRseSB3aXRoIGEgZnJlcXVlbmN5IHNldCBieSB0aGUgdGltZXIncyBwZXJpb2QgKHNlZSB0aGUKKyAqIHhUaW1lclBlcmlvZEluVGlja3MgcGFyYW1ldGVyIG9mIHRoZSB4VGltZXJDcmVhdGUoKSBBUEkgZnVuY3Rpb24pLiAgSWYKKyAqIHV4QXV0b1JlbG9hZCBpcyBzZXQgdG8gcGRGQUxTRSB0aGVuIHRoZSB0aW1lciB3aWxsIGJlIGEgb25lLXNob3QgdGltZXIgYW5kCisgKiBlbnRlciB0aGUgZG9ybWFudCBzdGF0ZSBhZnRlciBpdCBleHBpcmVzLgorICovCit2b2lkIHZUaW1lclNldFJlbG9hZE1vZGUoIFRpbWVySGFuZGxlX3QgeFRpbWVyLCBjb25zdCBVQmFzZVR5cGVfdCB1eEF1dG9SZWxvYWQgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisvKioKICAqIFRpY2tUeXBlX3QgeFRpbWVyR2V0UGVyaW9kKCBUaW1lckhhbmRsZV90IHhUaW1lciApOwogICoKICAqIFJldHVybnMgdGhlIHBlcmlvZCBvZiBhIHRpbWVyLgpkaWZmIC0tZ2l0IGEvU291cmNlL2xpc3QuYyBiL1NvdXJjZS9saXN0LmMKaW5kZXggNzU4NTIzYS4uMjFkYWJkZSAxMDA2NDQKLS0tIGEvU291cmNlL2xpc3QuYworKysgYi9Tb3VyY2UvbGlzdC5jCkBAIC0xLDYgKzEsNiBAQAogLyoKLSAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMC4xCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjIuMQorICogQ29weXJpZ2h0IChDKSAyMDE5IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKICAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKICAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCkBAIC0zOSw3ICszOSw3IEBACiAJLyogVGhlIGxpc3Qgc3RydWN0dXJlIGNvbnRhaW5zIGEgbGlzdCBpdGVtIHdoaWNoIGlzIHVzZWQgdG8gbWFyayB0aGUKIAllbmQgb2YgdGhlIGxpc3QuICBUbyBpbml0aWFsaXNlIHRoZSBsaXN0IHRoZSBsaXN0IGVuZCBpcyBpbnNlcnRlZAogCWFzIHRoZSBvbmx5IGxpc3QgZW50cnkuICovCi0JcHhMaXN0LT5weEluZGV4ID0gKCBMaXN0SXRlbV90ICogKSAmKCBweExpc3QtPnhMaXN0RW5kICk7CQkJLypsaW50ICFlODI2ICFlNzQwIFRoZSBtaW5pIGxpc3Qgc3RydWN0dXJlIGlzIHVzZWQgYXMgdGhlIGxpc3QgZW5kIHRvIHNhdmUgUkFNLiAgVGhpcyBpcyBjaGVja2VkIGFuZCB2YWxpZC4gKi8KKwlweExpc3QtPnB4SW5kZXggPSAoIExpc3RJdGVtX3QgKiApICYoIHB4TGlzdC0+eExpc3RFbmQgKTsJCQkvKmxpbnQgIWU4MjYgIWU3NDAgIWU5MDg3IFRoZSBtaW5pIGxpc3Qgc3RydWN0dXJlIGlzIHVzZWQgYXMgdGhlIGxpc3QgZW5kIHRvIHNhdmUgUkFNLiAgVGhpcyBpcyBjaGVja2VkIGFuZCB2YWxpZC4gKi8KIAogCS8qIFRoZSBsaXN0IGVuZCB2YWx1ZSBpcyB0aGUgaGlnaGVzdCBwb3NzaWJsZSB2YWx1ZSBpbiB0aGUgbGlzdCB0bwogCWVuc3VyZSBpdCByZW1haW5zIGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QuICovCkBAIC00Nyw4ICs0Nyw4IEBACiAKIAkvKiBUaGUgbGlzdCBlbmQgbmV4dCBhbmQgcHJldmlvdXMgcG9pbnRlcnMgcG9pbnQgdG8gaXRzZWxmIHNvIHdlIGtub3cKIAl3aGVuIHRoZSBsaXN0IGlzIGVtcHR5LiAqLwotCXB4TGlzdC0+eExpc3RFbmQucHhOZXh0ID0gKCBMaXN0SXRlbV90ICogKSAmKCBweExpc3QtPnhMaXN0RW5kICk7CS8qbGludCAhZTgyNiAhZTc0MCBUaGUgbWluaSBsaXN0IHN0cnVjdHVyZSBpcyB1c2VkIGFzIHRoZSBsaXN0IGVuZCB0byBzYXZlIFJBTS4gIFRoaXMgaXMgY2hlY2tlZCBhbmQgdmFsaWQuICovCi0JcHhMaXN0LT54TGlzdEVuZC5weFByZXZpb3VzID0gKCBMaXN0SXRlbV90ICogKSAmKCBweExpc3QtPnhMaXN0RW5kICk7LypsaW50ICFlODI2ICFlNzQwIFRoZSBtaW5pIGxpc3Qgc3RydWN0dXJlIGlzIHVzZWQgYXMgdGhlIGxpc3QgZW5kIHRvIHNhdmUgUkFNLiAgVGhpcyBpcyBjaGVja2VkIGFuZCB2YWxpZC4gKi8KKwlweExpc3QtPnhMaXN0RW5kLnB4TmV4dCA9ICggTGlzdEl0ZW1fdCAqICkgJiggcHhMaXN0LT54TGlzdEVuZCApOwkvKmxpbnQgIWU4MjYgIWU3NDAgIWU5MDg3IFRoZSBtaW5pIGxpc3Qgc3RydWN0dXJlIGlzIHVzZWQgYXMgdGhlIGxpc3QgZW5kIHRvIHNhdmUgUkFNLiAgVGhpcyBpcyBjaGVja2VkIGFuZCB2YWxpZC4gKi8KKwlweExpc3QtPnhMaXN0RW5kLnB4UHJldmlvdXMgPSAoIExpc3RJdGVtX3QgKiApICYoIHB4TGlzdC0+eExpc3RFbmQgKTsvKmxpbnQgIWU4MjYgIWU3NDAgIWU5MDg3IFRoZSBtaW5pIGxpc3Qgc3RydWN0dXJlIGlzIHVzZWQgYXMgdGhlIGxpc3QgZW5kIHRvIHNhdmUgUkFNLiAgVGhpcyBpcyBjaGVja2VkIGFuZCB2YWxpZC4gKi8KIAogCXB4TGlzdC0+dXhOdW1iZXJPZkl0ZW1zID0gKCBVQmFzZVR5cGVfdCApIDBVOwogCkBAIC02Miw3ICs2Miw3IEBACiB2b2lkIHZMaXN0SW5pdGlhbGlzZUl0ZW0oIExpc3RJdGVtX3QgKiBjb25zdCBweEl0ZW0gKQogewogCS8qIE1ha2Ugc3VyZSB0aGUgbGlzdCBpdGVtIGlzIG5vdCByZWNvcmRlZCBhcyBiZWluZyBvbiBhIGxpc3QuICovCi0JcHhJdGVtLT5wdkNvbnRhaW5lciA9IE5VTEw7CisJcHhJdGVtLT5weENvbnRhaW5lciA9IE5VTEw7CiAKIAkvKiBXcml0ZSBrbm93biB2YWx1ZXMgaW50byB0aGUgbGlzdCBpdGVtIGlmCiAJY29uZmlnVVNFX0xJU1RfREFUQV9JTlRFR1JJVFlfQ0hFQ0tfQllURVMgaXMgc2V0IHRvIDEuICovCkBAIC05NCw3ICs5NCw3IEBACiAJcHhJbmRleC0+cHhQcmV2aW91cyA9IHB4TmV3TGlzdEl0ZW07CiAKIAkvKiBSZW1lbWJlciB3aGljaCBsaXN0IHRoZSBpdGVtIGlzIGluLiAqLwotCXB4TmV3TGlzdEl0ZW0tPnB2Q29udGFpbmVyID0gKCB2b2lkICogKSBweExpc3Q7CisJcHhOZXdMaXN0SXRlbS0+cHhDb250YWluZXIgPSBweExpc3Q7CiAKIAkoIHB4TGlzdC0+dXhOdW1iZXJPZkl0ZW1zICkrKzsKIH0KQEAgLTExNCw3ICsxMTQsNyBAQAogCS8qIEluc2VydCB0aGUgbmV3IGxpc3QgaXRlbSBpbnRvIHRoZSBsaXN0LCBzb3J0ZWQgaW4geEl0ZW1WYWx1ZSBvcmRlci4KIAogCUlmIHRoZSBsaXN0IGFscmVhZHkgY29udGFpbnMgYSBsaXN0IGl0ZW0gd2l0aCB0aGUgc2FtZSBpdGVtIHZhbHVlIHRoZW4gdGhlCi0JbmV3IGxpc3QgaXRlbSBzaG91bGQgYmUgcGxhY2VkIGFmdGVyIGl0LiAgVGhpcyBlbnN1cmVzIHRoYXQgVENCJ3Mgd2hpY2ggYXJlCisJbmV3IGxpc3QgaXRlbSBzaG91bGQgYmUgcGxhY2VkIGFmdGVyIGl0LiAgVGhpcyBlbnN1cmVzIHRoYXQgVENCcyB3aGljaCBhcmUKIAlzdG9yZWQgaW4gcmVhZHkgbGlzdHMgKGFsbCBvZiB3aGljaCBoYXZlIHRoZSBzYW1lIHhJdGVtVmFsdWUgdmFsdWUpIGdldCBhCiAJc2hhcmUgb2YgdGhlIENQVS4gIEhvd2V2ZXIsIGlmIHRoZSB4SXRlbVZhbHVlIGlzIHRoZSBzYW1lIGFzIHRoZSBiYWNrIG1hcmtlcgogCXRoZSBpdGVyYXRpb24gbG9vcCBiZWxvdyB3aWxsIG5vdCBlbmQuICBUaGVyZWZvcmUgdGhlIHZhbHVlIGlzIGNoZWNrZWQKQEAgLTEyNywxOCArMTI3LDE4IEBACiAJewogCQkvKiAqKiogTk9URSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCQlJZiB5b3UgZmluZCB5b3VyIGFwcGxpY2F0aW9uIGlzIGNyYXNoaW5nIGhlcmUgdGhlbiBsaWtlbHkgY2F1c2VzIGFyZQotCQlsaXN0ZWQgYmVsb3cuICBJbiBhZGRpdGlvbiBzZWUgaHR0cDovL3d3dy5mcmVlcnRvcy5vcmcvRkFRSGVscC5odG1sIGZvcgorCQlsaXN0ZWQgYmVsb3cuICBJbiBhZGRpdGlvbiBzZWUgaHR0cHM6Ly93d3cuZnJlZXJ0b3Mub3JnL0ZBUUhlbHAuaHRtbCBmb3IKIAkJbW9yZSB0aXBzLCBhbmQgZW5zdXJlIGNvbmZpZ0FTU0VSVCgpIGlzIGRlZmluZWQhCi0JCWh0dHA6Ly93d3cuZnJlZXJ0b3Mub3JnL2EwMDExMC5odG1sI2NvbmZpZ0FTU0VSVAorCQlodHRwczovL3d3dy5mcmVlcnRvcy5vcmcvYTAwMTEwLmh0bWwjY29uZmlnQVNTRVJUCiAKIAkJCTEpIFN0YWNrIG92ZXJmbG93IC0KLQkJCSAgIHNlZSBodHRwOi8vd3d3LmZyZWVydG9zLm9yZy9TdGFja3MtYW5kLXN0YWNrLW92ZXJmbG93LWNoZWNraW5nLmh0bWwKKwkJCSAgIHNlZSBodHRwczovL3d3dy5mcmVlcnRvcy5vcmcvU3RhY2tzLWFuZC1zdGFjay1vdmVyZmxvdy1jaGVja2luZy5odG1sCiAJCQkyKSBJbmNvcnJlY3QgaW50ZXJydXB0IHByaW9yaXR5IGFzc2lnbm1lbnQsIGVzcGVjaWFsbHkgb24gQ29ydGV4LU0KIAkJCSAgIHBhcnRzIHdoZXJlIG51bWVyaWNhbGx5IGhpZ2ggcHJpb3JpdHkgdmFsdWVzIGRlbm90ZSBsb3cgYWN0dWFsCiAJCQkgICBpbnRlcnJ1cHQgcHJpb3JpdGllcywgd2hpY2ggY2FuIHNlZW0gY291bnRlciBpbnR1aXRpdmUuICBTZWUKLQkJCSAgIGh0dHA6Ly93d3cuZnJlZXJ0b3Mub3JnL1JUT1MtQ29ydGV4LU0zLU00Lmh0bWwgYW5kIHRoZSBkZWZpbml0aW9uCisJCQkgICBodHRwczovL3d3dy5mcmVlcnRvcy5vcmcvUlRPUy1Db3J0ZXgtTTMtTTQuaHRtbCBhbmQgdGhlIGRlZmluaXRpb24KIAkJCSAgIG9mIGNvbmZpZ01BWF9TWVNDQUxMX0lOVEVSUlVQVF9QUklPUklUWSBvbgotCQkJICAgaHR0cDovL3d3dy5mcmVlcnRvcy5vcmcvYTAwMTEwLmh0bWwKKwkJCSAgIGh0dHBzOi8vd3d3LmZyZWVydG9zLm9yZy9hMDAxMTAuaHRtbAogCQkJMykgQ2FsbGluZyBhbiBBUEkgZnVuY3Rpb24gZnJvbSB3aXRoaW4gYSBjcml0aWNhbCBzZWN0aW9uIG9yIHdoZW4KIAkJCSAgIHRoZSBzY2hlZHVsZXIgaXMgc3VzcGVuZGVkLCBvciBjYWxsaW5nIGFuIEFQSSBmdW5jdGlvbiB0aGF0IGRvZXMKIAkJCSAgIG5vdCBlbmQgaW4gIkZyb21JU1IiIGZyb20gYW4gaW50ZXJydXB0LgpAQCAtMTQ3LDcgKzE0Nyw3IEBACiAJCQkgICBiZWZvcmUgdlRhc2tTdGFydFNjaGVkdWxlcigpIGhhcyBiZWVuIGNhbGxlZD8pLgogCQkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0JCWZvciggcHhJdGVyYXRvciA9ICggTGlzdEl0ZW1fdCAqICkgJiggcHhMaXN0LT54TGlzdEVuZCApOyBweEl0ZXJhdG9yLT5weE5leHQtPnhJdGVtVmFsdWUgPD0geFZhbHVlT2ZJbnNlcnRpb247IHB4SXRlcmF0b3IgPSBweEl0ZXJhdG9yLT5weE5leHQgKSAvKmxpbnQgIWU4MjYgIWU3NDAgVGhlIG1pbmkgbGlzdCBzdHJ1Y3R1cmUgaXMgdXNlZCBhcyB0aGUgbGlzdCBlbmQgdG8gc2F2ZSBSQU0uICBUaGlzIGlzIGNoZWNrZWQgYW5kIHZhbGlkLiAqLworCQlmb3IoIHB4SXRlcmF0b3IgPSAoIExpc3RJdGVtX3QgKiApICYoIHB4TGlzdC0+eExpc3RFbmQgKTsgcHhJdGVyYXRvci0+cHhOZXh0LT54SXRlbVZhbHVlIDw9IHhWYWx1ZU9mSW5zZXJ0aW9uOyBweEl0ZXJhdG9yID0gcHhJdGVyYXRvci0+cHhOZXh0ICkgLypsaW50ICFlODI2ICFlNzQwICFlOTA4NyBUaGUgbWluaSBsaXN0IHN0cnVjdHVyZSBpcyB1c2VkIGFzIHRoZSBsaXN0IGVuZCB0byBzYXZlIFJBTS4gIFRoaXMgaXMgY2hlY2tlZCBhbmQgdmFsaWQuICovLypsaW50ICFlNDQwIFRoZSBpdGVyYXRvciBtb3ZlcyB0byBhIGRpZmZlcmVudCB2YWx1ZSwgbm90IHhWYWx1ZU9mSW5zZXJ0aW9uLiAqLwogCQl7CiAJCQkvKiBUaGVyZSBpcyBub3RoaW5nIHRvIGRvIGhlcmUsIGp1c3QgaXRlcmF0aW5nIHRvIHRoZSB3YW50ZWQKIAkJCWluc2VydGlvbiBwb3NpdGlvbi4gKi8KQEAgLTE2MSw3ICsxNjEsNyBAQAogCiAJLyogUmVtZW1iZXIgd2hpY2ggbGlzdCB0aGUgaXRlbSBpcyBpbi4gIFRoaXMgYWxsb3dzIGZhc3QgcmVtb3ZhbCBvZiB0aGUKIAlpdGVtIGxhdGVyLiAqLwotCXB4TmV3TGlzdEl0ZW0tPnB2Q29udGFpbmVyID0gKCB2b2lkICogKSBweExpc3Q7CisJcHhOZXdMaXN0SXRlbS0+cHhDb250YWluZXIgPSBweExpc3Q7CiAKIAkoIHB4TGlzdC0+dXhOdW1iZXJPZkl0ZW1zICkrKzsKIH0KQEAgLTE3MSw3ICsxNzEsNyBAQAogewogLyogVGhlIGxpc3QgaXRlbSBrbm93cyB3aGljaCBsaXN0IGl0IGlzIGluLiAgT2J0YWluIHRoZSBsaXN0IGZyb20gdGhlIGxpc3QKIGl0ZW0uICovCi1MaXN0X3QgKiBjb25zdCBweExpc3QgPSAoIExpc3RfdCAqICkgcHhJdGVtVG9SZW1vdmUtPnB2Q29udGFpbmVyOworTGlzdF90ICogY29uc3QgcHhMaXN0ID0gcHhJdGVtVG9SZW1vdmUtPnB4Q29udGFpbmVyOwogCiAJcHhJdGVtVG9SZW1vdmUtPnB4TmV4dC0+cHhQcmV2aW91cyA9IHB4SXRlbVRvUmVtb3ZlLT5weFByZXZpb3VzOwogCXB4SXRlbVRvUmVtb3ZlLT5weFByZXZpb3VzLT5weE5leHQgPSBweEl0ZW1Ub1JlbW92ZS0+cHhOZXh0OwpAQCAtMTg5LDcgKzE4OSw3IEBACiAJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKIAl9CiAKLQlweEl0ZW1Ub1JlbW92ZS0+cHZDb250YWluZXIgPSBOVUxMOworCXB4SXRlbVRvUmVtb3ZlLT5weENvbnRhaW5lciA9IE5VTEw7CiAJKCBweExpc3QtPnV4TnVtYmVyT2ZJdGVtcyApLS07CiAKIAlyZXR1cm4gcHhMaXN0LT51eE51bWJlck9mSXRlbXM7CmRpZmYgLS1naXQgYS9Tb3VyY2UvcG9ydGFibGUvQ29tbW9uL21wdV93cmFwcGVycy5jIGIvU291cmNlL3BvcnRhYmxlL0NvbW1vbi9tcHVfd3JhcHBlcnMuYwppbmRleCA2ODcyYjc0Li44YjNmZjI3IDEwMDY0NAotLS0gYS9Tb3VyY2UvcG9ydGFibGUvQ29tbW9uL21wdV93cmFwcGVycy5jCisrKyBiL1NvdXJjZS9wb3J0YWJsZS9Db21tb24vbXB1X3dyYXBwZXJzLmMKQEAgLTEsNiArMSw2IEBACiAvKgotICogRnJlZVJUT1MgS2VybmVsIFYxMC4wLjEKLSAqIENvcHlyaWdodCAoQykgMjAxNyBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMi4xCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgogICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgogICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KQEAgLTQ2LDE3ICs0Niw0OCBAQAogCiAjdW5kZWYgTVBVX1dSQVBQRVJTX0lOQ0xVREVEX0ZST01fQVBJX0ZJTEUKIAotLyoKLSAqIENoZWNrcyB0byBzZWUgaWYgYmVpbmcgY2FsbGVkIGZyb20gdGhlIGNvbnRleHQgb2YgYW4gdW5wcml2aWxlZ2VkIHRhc2ssIGFuZAotICogaWYgc28gcmFpc2VzIHRoZSBwcml2aWxlZ2UgbGV2ZWwgYW5kIHJldHVybnMgZmFsc2UgLSBvdGhlcndpc2UgZG9lcyBub3RoaW5nCi0gKiBvdGhlciB0aGFuIHJldHVybiB0cnVlLgorLyoqCisgKiBAYnJpZWYgQ2FsbHMgdGhlIHBvcnQgc3BlY2lmaWMgY29kZSB0byByYWlzZSB0aGUgcHJpdmlsZWdlLgorICoKKyAqIEByZXR1cm4gcGRGQUxTRSBpZiBwcml2aWxlZ2Ugd2FzIHJhaXNlZCwgcGRUUlVFIG90aGVyd2lzZS4KICAqLwotZXh0ZXJuIEJhc2VUeXBlX3QgeFBvcnRSYWlzZVByaXZpbGVnZSggdm9pZCApOworQmFzZVR5cGVfdCB4UG9ydFJhaXNlUHJpdmlsZWdlKCB2b2lkICkgRlJFRVJUT1NfU1lTVEVNX0NBTEw7CiAKKy8qKgorICogQGJyaWVmIElmIHhSdW5uaW5nUHJpdmlsZWdlZCBpcyBub3QgcGRUUlVFLCBjYWxscyB0aGUgcG9ydCBzcGVjaWZpYworICogY29kZSB0byByZXNldCB0aGUgcHJpdmlsZWdlLCBvdGhlcndpc2UgZG9lcyBub3RoaW5nLgorICovCit2b2lkIHZQb3J0UmVzZXRQcml2aWxlZ2UoIEJhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkICk7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworQmFzZVR5cGVfdCB4UG9ydFJhaXNlUHJpdmlsZWdlKCB2b2lkICkgLyogRlJFRVJUT1NfU1lTVEVNX0NBTEwgKi8KK3sKK0Jhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkOworCisJLyogQ2hlY2sgd2hldGhlciB0aGUgcHJvY2Vzc29yIGlzIGFscmVhZHkgcHJpdmlsZWdlZC4gKi8KKwl4UnVubmluZ1ByaXZpbGVnZWQgPSBwb3J0SVNfUFJJVklMRUdFRCgpOworCisJLyogSWYgdGhlIHByb2Nlc3NvciBpcyBub3QgYWxyZWFkeSBwcml2aWxlZ2VkLCByYWlzZSBwcml2aWxlZ2UuICovCisJaWYoIHhSdW5uaW5nUHJpdmlsZWdlZCAhPSBwZFRSVUUgKQorCXsKKwkJcG9ydFJBSVNFX1BSSVZJTEVHRSgpOworCX0KKworCXJldHVybiB4UnVubmluZ1ByaXZpbGVnZWQ7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCB2UG9ydFJlc2V0UHJpdmlsZWdlKCBCYXNlVHlwZV90IHhSdW5uaW5nUHJpdmlsZWdlZCApCit7CisJaWYoIHhSdW5uaW5nUHJpdmlsZWdlZCAhPSBwZFRSVUUgKQorCXsKKwkJcG9ydFJFU0VUX1BSSVZJTEVHRSgpOworCX0KK30KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiAjaWYoIGNvbmZpZ1NVUFBPUlRfRFlOQU1JQ19BTExPQ0FUSU9OID09IDEgKQotCUJhc2VUeXBlX3QgTVBVX3hUYXNrQ3JlYXRlUmVzdHJpY3RlZCggY29uc3QgVGFza1BhcmFtZXRlcnNfdCAqIGNvbnN0IHB4VGFza0RlZmluaXRpb24sIFRhc2tIYW5kbGVfdCAqcHhDcmVhdGVkVGFzayApCisJQmFzZVR5cGVfdCBNUFVfeFRhc2tDcmVhdGVSZXN0cmljdGVkKCBjb25zdCBUYXNrUGFyYW1ldGVyc190ICogY29uc3QgcHhUYXNrRGVmaW5pdGlvbiwgVGFza0hhbmRsZV90ICpweENyZWF0ZWRUYXNrICkgLyogRlJFRVJUT1NfU1lTVEVNX0NBTEwgKi8KIAl7CiAJQmFzZVR5cGVfdCB4UmV0dXJuOwogCUJhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkID0geFBvcnRSYWlzZVByaXZpbGVnZSgpOwpAQCAtNjksNyArMTAwLDcgQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiAjaWYoIGNvbmZpZ1NVUFBPUlRfU1RBVElDX0FMTE9DQVRJT04gPT0gMSApCi0JQmFzZVR5cGVfdCBNUFVfeFRhc2tDcmVhdGVSZXN0cmljdGVkU3RhdGljKCBjb25zdCBUYXNrUGFyYW1ldGVyc190ICogY29uc3QgcHhUYXNrRGVmaW5pdGlvbiwgVGFza0hhbmRsZV90ICpweENyZWF0ZWRUYXNrICkKKwlCYXNlVHlwZV90IE1QVV94VGFza0NyZWF0ZVJlc3RyaWN0ZWRTdGF0aWMoIGNvbnN0IFRhc2tQYXJhbWV0ZXJzX3QgKiBjb25zdCBweFRhc2tEZWZpbml0aW9uLCBUYXNrSGFuZGxlX3QgKnB4Q3JlYXRlZFRhc2sgKSAvKiBGUkVFUlRPU19TWVNURU1fQ0FMTCAqLwogCXsKIAlCYXNlVHlwZV90IHhSZXR1cm47CiAJQmFzZVR5cGVfdCB4UnVubmluZ1ByaXZpbGVnZWQgPSB4UG9ydFJhaXNlUHJpdmlsZWdlKCk7CkBAIC04Miw3ICsxMTMsNyBAQAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKICNpZiggY29uZmlnU1VQUE9SVF9EWU5BTUlDX0FMTE9DQVRJT04gPT0gMSApCi0JQmFzZVR5cGVfdCBNUFVfeFRhc2tDcmVhdGUoIFRhc2tGdW5jdGlvbl90IHB2VGFza0NvZGUsIGNvbnN0IGNoYXIgKiBjb25zdCBwY05hbWUsIHVpbnQxNl90IHVzU3RhY2tEZXB0aCwgdm9pZCAqcHZQYXJhbWV0ZXJzLCBVQmFzZVR5cGVfdCB1eFByaW9yaXR5LCBUYXNrSGFuZGxlX3QgKnB4Q3JlYXRlZFRhc2sgKQorCUJhc2VUeXBlX3QgTVBVX3hUYXNrQ3JlYXRlKCBUYXNrRnVuY3Rpb25fdCBwdlRhc2tDb2RlLCBjb25zdCBjaGFyICogY29uc3QgcGNOYW1lLCB1aW50MTZfdCB1c1N0YWNrRGVwdGgsIHZvaWQgKnB2UGFyYW1ldGVycywgVUJhc2VUeXBlX3QgdXhQcmlvcml0eSwgVGFza0hhbmRsZV90ICpweENyZWF0ZWRUYXNrICkgLyogRlJFRVJUT1NfU1lTVEVNX0NBTEwgKi8KIAl7CiAJQmFzZVR5cGVfdCB4UmV0dXJuOwogCUJhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkID0geFBvcnRSYWlzZVByaXZpbGVnZSgpOwpAQCAtOTUsNyArMTI2LDcgQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiAjaWYoIGNvbmZpZ1NVUFBPUlRfU1RBVElDX0FMTE9DQVRJT04gPT0gMSApCi0JVGFza0hhbmRsZV90IE1QVV94VGFza0NyZWF0ZVN0YXRpYyggVGFza0Z1bmN0aW9uX3QgcHhUYXNrQ29kZSwgY29uc3QgY2hhciAqIGNvbnN0IHBjTmFtZSwgY29uc3QgdWludDMyX3QgdWxTdGFja0RlcHRoLCB2b2lkICogY29uc3QgcHZQYXJhbWV0ZXJzLCBVQmFzZVR5cGVfdCB1eFByaW9yaXR5LCBTdGFja1R5cGVfdCAqIGNvbnN0IHB1eFN0YWNrQnVmZmVyLCBTdGF0aWNUYXNrX3QgKiBjb25zdCBweFRhc2tCdWZmZXIgKQorCVRhc2tIYW5kbGVfdCBNUFVfeFRhc2tDcmVhdGVTdGF0aWMoIFRhc2tGdW5jdGlvbl90IHB4VGFza0NvZGUsIGNvbnN0IGNoYXIgKiBjb25zdCBwY05hbWUsIGNvbnN0IHVpbnQzMl90IHVsU3RhY2tEZXB0aCwgdm9pZCAqIGNvbnN0IHB2UGFyYW1ldGVycywgVUJhc2VUeXBlX3QgdXhQcmlvcml0eSwgU3RhY2tUeXBlX3QgKiBjb25zdCBwdXhTdGFja0J1ZmZlciwgU3RhdGljVGFza190ICogY29uc3QgcHhUYXNrQnVmZmVyICkgLyogRlJFRVJUT1NfU1lTVEVNX0NBTEwgKi8KIAl7CiAJVGFza0hhbmRsZV90IHhSZXR1cm47CiAJQmFzZVR5cGVfdCB4UnVubmluZ1ByaXZpbGVnZWQgPSB4UG9ydFJhaXNlUHJpdmlsZWdlKCk7CkBAIC0xMDcsNyArMTM4LDcgQEAKICNlbmRpZiAvKiBjb25maWdTVVBQT1JUX1NUQVRJQ19BTExPQ0FUSU9OICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotdm9pZCBNUFVfdlRhc2tBbGxvY2F0ZU1QVVJlZ2lvbnMoIFRhc2tIYW5kbGVfdCB4VGFzaywgY29uc3QgTWVtb3J5UmVnaW9uX3QgKiBjb25zdCB4UmVnaW9ucyApCit2b2lkIE1QVV92VGFza0FsbG9jYXRlTVBVUmVnaW9ucyggVGFza0hhbmRsZV90IHhUYXNrLCBjb25zdCBNZW1vcnlSZWdpb25fdCAqIGNvbnN0IHhSZWdpb25zICkgLyogRlJFRVJUT1NfU1lTVEVNX0NBTEwgKi8KIHsKIEJhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkID0geFBvcnRSYWlzZVByaXZpbGVnZSgpOwogCkBAIC0xMTcsNyArMTQ4LDcgQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiAjaWYgKCBJTkNMVURFX3ZUYXNrRGVsZXRlID09IDEgKQotCXZvaWQgTVBVX3ZUYXNrRGVsZXRlKCBUYXNrSGFuZGxlX3QgcHhUYXNrVG9EZWxldGUgKQorCXZvaWQgTVBVX3ZUYXNrRGVsZXRlKCBUYXNrSGFuZGxlX3QgcHhUYXNrVG9EZWxldGUgKSAvKiBGUkVFUlRPU19TWVNURU1fQ0FMTCAqLwogCXsKIAlCYXNlVHlwZV90IHhSdW5uaW5nUHJpdmlsZWdlZCA9IHhQb3J0UmFpc2VQcml2aWxlZ2UoKTsKIApAQCAtMTI4LDcgKzE1OSw3IEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogI2lmICggSU5DTFVERV92VGFza0RlbGF5VW50aWwgPT0gMSApCi0Jdm9pZCBNUFVfdlRhc2tEZWxheVVudGlsKCBUaWNrVHlwZV90ICogY29uc3QgcHhQcmV2aW91c1dha2VUaW1lLCBUaWNrVHlwZV90IHhUaW1lSW5jcmVtZW50ICkKKwl2b2lkIE1QVV92VGFza0RlbGF5VW50aWwoIFRpY2tUeXBlX3QgKiBjb25zdCBweFByZXZpb3VzV2FrZVRpbWUsIFRpY2tUeXBlX3QgeFRpbWVJbmNyZW1lbnQgKSAvKiBGUkVFUlRPU19TWVNURU1fQ0FMTCAqLwogCXsKIAlCYXNlVHlwZV90IHhSdW5uaW5nUHJpdmlsZWdlZCA9IHhQb3J0UmFpc2VQcml2aWxlZ2UoKTsKIApAQCAtMTM5LDcgKzE3MCw3IEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogI2lmICggSU5DTFVERV94VGFza0Fib3J0RGVsYXkgPT0gMSApCi0JQmFzZVR5cGVfdCBNUFVfeFRhc2tBYm9ydERlbGF5KCBUYXNrSGFuZGxlX3QgeFRhc2sgKQorCUJhc2VUeXBlX3QgTVBVX3hUYXNrQWJvcnREZWxheSggVGFza0hhbmRsZV90IHhUYXNrICkgLyogRlJFRVJUT1NfU1lTVEVNX0NBTEwgKi8KIAl7CiAJQmFzZVR5cGVfdCB4UmV0dXJuOwogCUJhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkID0geFBvcnRSYWlzZVByaXZpbGVnZSgpOwpAQCAtMTUyLDcgKzE4Myw3IEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogI2lmICggSU5DTFVERV92VGFza0RlbGF5ID09IDEgKQotCXZvaWQgTVBVX3ZUYXNrRGVsYXkoIFRpY2tUeXBlX3QgeFRpY2tzVG9EZWxheSApCisJdm9pZCBNUFVfdlRhc2tEZWxheSggVGlja1R5cGVfdCB4VGlja3NUb0RlbGF5ICkgLyogRlJFRVJUT1NfU1lTVEVNX0NBTEwgKi8KIAl7CiAJQmFzZVR5cGVfdCB4UnVubmluZ1ByaXZpbGVnZWQgPSB4UG9ydFJhaXNlUHJpdmlsZWdlKCk7CiAKQEAgLTE2Myw3ICsxOTQsNyBAQAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKICNpZiAoIElOQ0xVREVfdXhUYXNrUHJpb3JpdHlHZXQgPT0gMSApCi0JVUJhc2VUeXBlX3QgTVBVX3V4VGFza1ByaW9yaXR5R2V0KCBUYXNrSGFuZGxlX3QgcHhUYXNrICkKKwlVQmFzZVR5cGVfdCBNUFVfdXhUYXNrUHJpb3JpdHlHZXQoIGNvbnN0IFRhc2tIYW5kbGVfdCBweFRhc2sgKSAvKiBGUkVFUlRPU19TWVNURU1fQ0FMTCAqLwogCXsKIAlVQmFzZVR5cGVfdCB1eFJldHVybjsKIAlCYXNlVHlwZV90IHhSdW5uaW5nUHJpdmlsZWdlZCA9IHhQb3J0UmFpc2VQcml2aWxlZ2UoKTsKQEAgLTE3Niw3ICsyMDcsNyBAQAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKICNpZiAoIElOQ0xVREVfdlRhc2tQcmlvcml0eVNldCA9PSAxICkKLQl2b2lkIE1QVV92VGFza1ByaW9yaXR5U2V0KCBUYXNrSGFuZGxlX3QgcHhUYXNrLCBVQmFzZVR5cGVfdCB1eE5ld1ByaW9yaXR5ICkKKwl2b2lkIE1QVV92VGFza1ByaW9yaXR5U2V0KCBUYXNrSGFuZGxlX3QgcHhUYXNrLCBVQmFzZVR5cGVfdCB1eE5ld1ByaW9yaXR5ICkgLyogRlJFRVJUT1NfU1lTVEVNX0NBTEwgKi8KIAl7CiAJQmFzZVR5cGVfdCB4UnVubmluZ1ByaXZpbGVnZWQgPSB4UG9ydFJhaXNlUHJpdmlsZWdlKCk7CiAKQEAgLTE4Nyw3ICsyMTgsNyBAQAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKICNpZiAoIElOQ0xVREVfZVRhc2tHZXRTdGF0ZSA9PSAxICkKLQllVGFza1N0YXRlIE1QVV9lVGFza0dldFN0YXRlKCBUYXNrSGFuZGxlX3QgcHhUYXNrICkKKwllVGFza1N0YXRlIE1QVV9lVGFza0dldFN0YXRlKCBUYXNrSGFuZGxlX3QgcHhUYXNrICkgLyogRlJFRVJUT1NfU1lTVEVNX0NBTEwgKi8KIAl7CiAJQmFzZVR5cGVfdCB4UnVubmluZ1ByaXZpbGVnZWQgPSB4UG9ydFJhaXNlUHJpdmlsZWdlKCk7CiAJZVRhc2tTdGF0ZSBlUmV0dXJuOwpAQCAtMjAwLDcgKzIzMSw3IEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogI2lmKCBjb25maWdVU0VfVFJBQ0VfRkFDSUxJVFkgPT0gMSApCi0Jdm9pZCBNUFVfdlRhc2tHZXRJbmZvKCBUYXNrSGFuZGxlX3QgeFRhc2ssIFRhc2tTdGF0dXNfdCAqcHhUYXNrU3RhdHVzLCBCYXNlVHlwZV90IHhHZXRGcmVlU3RhY2tTcGFjZSwgZVRhc2tTdGF0ZSBlU3RhdGUgKQorCXZvaWQgTVBVX3ZUYXNrR2V0SW5mbyggVGFza0hhbmRsZV90IHhUYXNrLCBUYXNrU3RhdHVzX3QgKnB4VGFza1N0YXR1cywgQmFzZVR5cGVfdCB4R2V0RnJlZVN0YWNrU3BhY2UsIGVUYXNrU3RhdGUgZVN0YXRlICkgLyogRlJFRVJUT1NfU1lTVEVNX0NBTEwgKi8KIAl7CiAJQmFzZVR5cGVfdCB4UnVubmluZ1ByaXZpbGVnZWQgPSB4UG9ydFJhaXNlUHJpdmlsZWdlKCk7CiAKQEAgLTIxMSw3ICsyNDIsNyBAQAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKICNpZiAoIElOQ0xVREVfeFRhc2tHZXRJZGxlVGFza0hhbmRsZSA9PSAxICkKLQlUYXNrSGFuZGxlX3QgTVBVX3hUYXNrR2V0SWRsZVRhc2tIYW5kbGUoIHZvaWQgKQorCVRhc2tIYW5kbGVfdCBNUFVfeFRhc2tHZXRJZGxlVGFza0hhbmRsZSggdm9pZCApIC8qIEZSRUVSVE9TX1NZU1RFTV9DQUxMICovCiAJewogCVRhc2tIYW5kbGVfdCB4UmV0dXJuOwogCUJhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkID0geFBvcnRSYWlzZVByaXZpbGVnZSgpOwpAQCAtMjI0LDcgKzI1NSw3IEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogI2lmICggSU5DTFVERV92VGFza1N1c3BlbmQgPT0gMSApCi0Jdm9pZCBNUFVfdlRhc2tTdXNwZW5kKCBUYXNrSGFuZGxlX3QgcHhUYXNrVG9TdXNwZW5kICkKKwl2b2lkIE1QVV92VGFza1N1c3BlbmQoIFRhc2tIYW5kbGVfdCBweFRhc2tUb1N1c3BlbmQgKSAvKiBGUkVFUlRPU19TWVNURU1fQ0FMTCAqLwogCXsKIAlCYXNlVHlwZV90IHhSdW5uaW5nUHJpdmlsZWdlZCA9IHhQb3J0UmFpc2VQcml2aWxlZ2UoKTsKIApAQCAtMjM1LDcgKzI2Niw3IEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogI2lmICggSU5DTFVERV92VGFza1N1c3BlbmQgPT0gMSApCi0Jdm9pZCBNUFVfdlRhc2tSZXN1bWUoIFRhc2tIYW5kbGVfdCBweFRhc2tUb1Jlc3VtZSApCisJdm9pZCBNUFVfdlRhc2tSZXN1bWUoIFRhc2tIYW5kbGVfdCBweFRhc2tUb1Jlc3VtZSApIC8qIEZSRUVSVE9TX1NZU1RFTV9DQUxMICovCiAJewogCUJhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkID0geFBvcnRSYWlzZVByaXZpbGVnZSgpOwogCkBAIC0yNDUsNyArMjc2LDcgQEAKICNlbmRpZgogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLXZvaWQgTVBVX3ZUYXNrU3VzcGVuZEFsbCggdm9pZCApCit2b2lkIE1QVV92VGFza1N1c3BlbmRBbGwoIHZvaWQgKSAvKiBGUkVFUlRPU19TWVNURU1fQ0FMTCAqLwogewogQmFzZVR5cGVfdCB4UnVubmluZ1ByaXZpbGVnZWQgPSB4UG9ydFJhaXNlUHJpdmlsZWdlKCk7CiAKQEAgLTI1NCw3ICsyODUsNyBAQAogfQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLUJhc2VUeXBlX3QgTVBVX3hUYXNrUmVzdW1lQWxsKCB2b2lkICkKK0Jhc2VUeXBlX3QgTVBVX3hUYXNrUmVzdW1lQWxsKCB2b2lkICkgLyogRlJFRVJUT1NfU1lTVEVNX0NBTEwgKi8KIHsKIEJhc2VUeXBlX3QgeFJldHVybjsKIEJhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkID0geFBvcnRSYWlzZVByaXZpbGVnZSgpOwpAQCAtMjY1LDcgKzI5Niw3IEBACiB9CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotVGlja1R5cGVfdCBNUFVfeFRhc2tHZXRUaWNrQ291bnQoIHZvaWQgKQorVGlja1R5cGVfdCBNUFVfeFRhc2tHZXRUaWNrQ291bnQoIHZvaWQgKSAvKiBGUkVFUlRPU19TWVNURU1fQ0FMTCAqLwogewogVGlja1R5cGVfdCB4UmV0dXJuOwogQmFzZVR5cGVfdCB4UnVubmluZ1ByaXZpbGVnZWQgPSB4UG9ydFJhaXNlUHJpdmlsZWdlKCk7CkBAIC0yNzYsNyArMzA3LDcgQEAKIH0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi1VQmFzZVR5cGVfdCBNUFVfdXhUYXNrR2V0TnVtYmVyT2ZUYXNrcyggdm9pZCApCitVQmFzZVR5cGVfdCBNUFVfdXhUYXNrR2V0TnVtYmVyT2ZUYXNrcyggdm9pZCApIC8qIEZSRUVSVE9TX1NZU1RFTV9DQUxMICovCiB7CiBVQmFzZVR5cGVfdCB1eFJldHVybjsKIEJhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkID0geFBvcnRSYWlzZVByaXZpbGVnZSgpOwpAQCAtMjg3LDcgKzMxOCw3IEBACiB9CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotY2hhciAqIE1QVV9wY1Rhc2tHZXROYW1lKCBUYXNrSGFuZGxlX3QgeFRhc2tUb1F1ZXJ5ICkKK2NoYXIgKiBNUFVfcGNUYXNrR2V0TmFtZSggVGFza0hhbmRsZV90IHhUYXNrVG9RdWVyeSApIC8qIEZSRUVSVE9TX1NZU1RFTV9DQUxMICovCiB7CiBjaGFyICpwY1JldHVybjsKIEJhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkID0geFBvcnRSYWlzZVByaXZpbGVnZSgpOwpAQCAtMjk5LDcgKzMzMCw3IEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogI2lmICggSU5DTFVERV94VGFza0dldEhhbmRsZSA9PSAxICkKLQlUYXNrSGFuZGxlX3QgTVBVX3hUYXNrR2V0SGFuZGxlKCBjb25zdCBjaGFyICpwY05hbWVUb1F1ZXJ5ICkKKwlUYXNrSGFuZGxlX3QgTVBVX3hUYXNrR2V0SGFuZGxlKCBjb25zdCBjaGFyICpwY05hbWVUb1F1ZXJ5ICkgLyogRlJFRVJUT1NfU1lTVEVNX0NBTEwgKi8KIAl7CiAJVGFza0hhbmRsZV90IHhSZXR1cm47CiAJQmFzZVR5cGVfdCB4UnVubmluZ1ByaXZpbGVnZWQgPSB4UG9ydFJhaXNlUHJpdmlsZWdlKCk7CkBAIC0zMTIsNyArMzQzLDcgQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiAjaWYgKCAoIGNvbmZpZ1VTRV9UUkFDRV9GQUNJTElUWSA9PSAxICkgJiYgKCBjb25maWdVU0VfU1RBVFNfRk9STUFUVElOR19GVU5DVElPTlMgPiAwICkgJiYgKCBjb25maWdTVVBQT1JUX0RZTkFNSUNfQUxMT0NBVElPTiA9PSAxICkgKQotCXZvaWQgTVBVX3ZUYXNrTGlzdCggY2hhciAqcGNXcml0ZUJ1ZmZlciApCisJdm9pZCBNUFVfdlRhc2tMaXN0KCBjaGFyICpwY1dyaXRlQnVmZmVyICkgLyogRlJFRVJUT1NfU1lTVEVNX0NBTEwgKi8KIAl7CiAJQmFzZVR5cGVfdCB4UnVubmluZ1ByaXZpbGVnZWQgPSB4UG9ydFJhaXNlUHJpdmlsZWdlKCk7CiAKQEAgLTMyMyw3ICszNTQsNyBAQAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKICNpZiAoICggY29uZmlnR0VORVJBVEVfUlVOX1RJTUVfU1RBVFMgPT0gMSApICYmICggY29uZmlnVVNFX1NUQVRTX0ZPUk1BVFRJTkdfRlVOQ1RJT05TID4gMCApICYmICggY29uZmlnU1VQUE9SVF9EWU5BTUlDX0FMTE9DQVRJT04gPT0gMSApICkKLQl2b2lkIE1QVV92VGFza0dldFJ1blRpbWVTdGF0cyggY2hhciAqcGNXcml0ZUJ1ZmZlciApCisJdm9pZCBNUFVfdlRhc2tHZXRSdW5UaW1lU3RhdHMoIGNoYXIgKnBjV3JpdGVCdWZmZXIgKSAvKiBGUkVFUlRPU19TWVNURU1fQ0FMTCAqLwogCXsKIAlCYXNlVHlwZV90IHhSdW5uaW5nUHJpdmlsZWdlZCA9IHhQb3J0UmFpc2VQcml2aWxlZ2UoKTsKIApAQCAtMzMzLDggKzM2NCwyMSBAQAogI2VuZGlmCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAorI2lmKCAoIGNvbmZpZ0dFTkVSQVRFX1JVTl9USU1FX1NUQVRTID09IDEgKSAmJiAoIElOQ0xVREVfeFRhc2tHZXRJZGxlVGFza0hhbmRsZSA9PSAxICkgKQorCVRpY2tUeXBlX3QgTVBVX3hUYXNrR2V0SWRsZVJ1blRpbWVDb3VudGVyKCB2b2lkICkgLyogRlJFRVJUT1NfU1lTVEVNX0NBTEwgKi8KKwl7CisJVGlja1R5cGVfdCB4UmV0dXJuOworCUJhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkID0geFBvcnRSYWlzZVByaXZpbGVnZSgpOworCisJCXhSZXR1cm4gPSB4VGFza0dldElkbGVSdW5UaW1lQ291bnRlcigpOworCQl2UG9ydFJlc2V0UHJpdmlsZWdlKCB4UnVubmluZ1ByaXZpbGVnZWQgKTsKKwkJcmV0dXJuIHhSZXR1cm47CisJfQorI2VuZGlmCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwogI2lmICggY29uZmlnVVNFX0FQUExJQ0FUSU9OX1RBU0tfVEFHID09IDEgKQotCXZvaWQgTVBVX3ZUYXNrU2V0QXBwbGljYXRpb25UYXNrVGFnKCBUYXNrSGFuZGxlX3QgeFRhc2ssIFRhc2tIb29rRnVuY3Rpb25fdCBweFRhZ1ZhbHVlICkKKwl2b2lkIE1QVV92VGFza1NldEFwcGxpY2F0aW9uVGFza1RhZyggVGFza0hhbmRsZV90IHhUYXNrLCBUYXNrSG9va0Z1bmN0aW9uX3QgcHhUYWdWYWx1ZSApIC8qIEZSRUVSVE9TX1NZU1RFTV9DQUxMICovCiAJewogCUJhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkID0geFBvcnRSYWlzZVByaXZpbGVnZSgpOwogCkBAIC0zNDUsNyArMzg5LDcgQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiAjaWYgKCBjb25maWdVU0VfQVBQTElDQVRJT05fVEFTS19UQUcgPT0gMSApCi0JVGFza0hvb2tGdW5jdGlvbl90IE1QVV94VGFza0dldEFwcGxpY2F0aW9uVGFza1RhZyggVGFza0hhbmRsZV90IHhUYXNrICkKKwlUYXNrSG9va0Z1bmN0aW9uX3QgTVBVX3hUYXNrR2V0QXBwbGljYXRpb25UYXNrVGFnKCBUYXNrSGFuZGxlX3QgeFRhc2sgKSAvKiBGUkVFUlRPU19TWVNURU1fQ0FMTCAqLwogCXsKIAlUYXNrSG9va0Z1bmN0aW9uX3QgeFJldHVybjsKIAlCYXNlVHlwZV90IHhSdW5uaW5nUHJpdmlsZWdlZCA9IHhQb3J0UmFpc2VQcml2aWxlZ2UoKTsKQEAgLTM1OCw3ICs0MDIsNyBAQAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKICNpZiAoIGNvbmZpZ05VTV9USFJFQURfTE9DQUxfU1RPUkFHRV9QT0lOVEVSUyAhPSAwICkKLQl2b2lkIE1QVV92VGFza1NldFRocmVhZExvY2FsU3RvcmFnZVBvaW50ZXIoIFRhc2tIYW5kbGVfdCB4VGFza1RvU2V0LCBCYXNlVHlwZV90IHhJbmRleCwgdm9pZCAqcHZWYWx1ZSApCisJdm9pZCBNUFVfdlRhc2tTZXRUaHJlYWRMb2NhbFN0b3JhZ2VQb2ludGVyKCBUYXNrSGFuZGxlX3QgeFRhc2tUb1NldCwgQmFzZVR5cGVfdCB4SW5kZXgsIHZvaWQgKnB2VmFsdWUgKSAvKiBGUkVFUlRPU19TWVNURU1fQ0FMTCAqLwogCXsKIAlCYXNlVHlwZV90IHhSdW5uaW5nUHJpdmlsZWdlZCA9IHhQb3J0UmFpc2VQcml2aWxlZ2UoKTsKIApAQCAtMzY5LDcgKzQxMyw3IEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogI2lmICggY29uZmlnTlVNX1RIUkVBRF9MT0NBTF9TVE9SQUdFX1BPSU5URVJTICE9IDAgKQotCXZvaWQgKk1QVV9wdlRhc2tHZXRUaHJlYWRMb2NhbFN0b3JhZ2VQb2ludGVyKCBUYXNrSGFuZGxlX3QgeFRhc2tUb1F1ZXJ5LCBCYXNlVHlwZV90IHhJbmRleCApCisJdm9pZCAqTVBVX3B2VGFza0dldFRocmVhZExvY2FsU3RvcmFnZVBvaW50ZXIoIFRhc2tIYW5kbGVfdCB4VGFza1RvUXVlcnksIEJhc2VUeXBlX3QgeEluZGV4ICkgLyogRlJFRVJUT1NfU1lTVEVNX0NBTEwgKi8KIAl7CiAJdm9pZCAqcHZSZXR1cm47CiAJQmFzZVR5cGVfdCB4UnVubmluZ1ByaXZpbGVnZWQgPSB4UG9ydFJhaXNlUHJpdmlsZWdlKCk7CkBAIC0zODIsNyArNDI2LDcgQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiAjaWYgKCBjb25maWdVU0VfQVBQTElDQVRJT05fVEFTS19UQUcgPT0gMSApCi0JQmFzZVR5cGVfdCBNUFVfeFRhc2tDYWxsQXBwbGljYXRpb25UYXNrSG9vayggVGFza0hhbmRsZV90IHhUYXNrLCB2b2lkICpwdlBhcmFtZXRlciApCisJQmFzZVR5cGVfdCBNUFVfeFRhc2tDYWxsQXBwbGljYXRpb25UYXNrSG9vayggVGFza0hhbmRsZV90IHhUYXNrLCB2b2lkICpwdlBhcmFtZXRlciApIC8qIEZSRUVSVE9TX1NZU1RFTV9DQUxMICovCiAJewogCUJhc2VUeXBlX3QgeFJldHVybjsKIAlCYXNlVHlwZV90IHhSdW5uaW5nUHJpdmlsZWdlZCA9IHhQb3J0UmFpc2VQcml2aWxlZ2UoKTsKQEAgLTM5NSw3ICs0MzksNyBAQAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKICNpZiAoIGNvbmZpZ1VTRV9UUkFDRV9GQUNJTElUWSA9PSAxICkKLQlVQmFzZVR5cGVfdCBNUFVfdXhUYXNrR2V0U3lzdGVtU3RhdGUoIFRhc2tTdGF0dXNfdCAqcHhUYXNrU3RhdHVzQXJyYXksIFVCYXNlVHlwZV90IHV4QXJyYXlTaXplLCB1aW50MzJfdCAqcHVsVG90YWxSdW5UaW1lICkKKwlVQmFzZVR5cGVfdCBNUFVfdXhUYXNrR2V0U3lzdGVtU3RhdGUoIFRhc2tTdGF0dXNfdCAqcHhUYXNrU3RhdHVzQXJyYXksIFVCYXNlVHlwZV90IHV4QXJyYXlTaXplLCB1aW50MzJfdCAqcHVsVG90YWxSdW5UaW1lICkgLyogRlJFRVJUT1NfU1lTVEVNX0NBTEwgKi8KIAl7CiAJVUJhc2VUeXBlX3QgdXhSZXR1cm47CiAJQmFzZVR5cGVfdCB4UnVubmluZ1ByaXZpbGVnZWQgPSB4UG9ydFJhaXNlUHJpdmlsZWdlKCk7CkBAIC00MDgsNyArNDUyLDcgQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiAjaWYgKCBJTkNMVURFX3V4VGFza0dldFN0YWNrSGlnaFdhdGVyTWFyayA9PSAxICkKLQlVQmFzZVR5cGVfdCBNUFVfdXhUYXNrR2V0U3RhY2tIaWdoV2F0ZXJNYXJrKCBUYXNrSGFuZGxlX3QgeFRhc2sgKQorCVVCYXNlVHlwZV90IE1QVV91eFRhc2tHZXRTdGFja0hpZ2hXYXRlck1hcmsoIFRhc2tIYW5kbGVfdCB4VGFzayApIC8qIEZSRUVSVE9TX1NZU1RFTV9DQUxMICovCiAJewogCVVCYXNlVHlwZV90IHV4UmV0dXJuOwogCUJhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkID0geFBvcnRSYWlzZVByaXZpbGVnZSgpOwpAQCAtNDIwLDggKzQ2NCwyMSBAQAogI2VuZGlmCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAorI2lmICggSU5DTFVERV91eFRhc2tHZXRTdGFja0hpZ2hXYXRlck1hcmsyID09IDEgKQorCWNvbmZpZ1NUQUNLX0RFUFRIX1RZUEUgTVBVX3V4VGFza0dldFN0YWNrSGlnaFdhdGVyTWFyazIoIFRhc2tIYW5kbGVfdCB4VGFzayApIC8qIEZSRUVSVE9TX1NZU1RFTV9DQUxMICovCisJeworCWNvbmZpZ1NUQUNLX0RFUFRIX1RZUEUgdXhSZXR1cm47CisJQmFzZVR5cGVfdCB4UnVubmluZ1ByaXZpbGVnZWQgPSB4UG9ydFJhaXNlUHJpdmlsZWdlKCk7CisKKwkJdXhSZXR1cm4gPSB1eFRhc2tHZXRTdGFja0hpZ2hXYXRlck1hcmsyKCB4VGFzayApOworCQl2UG9ydFJlc2V0UHJpdmlsZWdlKCB4UnVubmluZ1ByaXZpbGVnZWQgKTsKKwkJcmV0dXJuIHV4UmV0dXJuOworCX0KKyNlbmRpZgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKICNpZiAoIElOQ0xVREVfeFRhc2tHZXRDdXJyZW50VGFza0hhbmRsZSA9PSAxICkKLQlUYXNrSGFuZGxlX3QgTVBVX3hUYXNrR2V0Q3VycmVudFRhc2tIYW5kbGUoIHZvaWQgKQorCVRhc2tIYW5kbGVfdCBNUFVfeFRhc2tHZXRDdXJyZW50VGFza0hhbmRsZSggdm9pZCApIC8qIEZSRUVSVE9TX1NZU1RFTV9DQUxMICovCiAJewogCVRhc2tIYW5kbGVfdCB4UmV0dXJuOwogCUJhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkID0geFBvcnRSYWlzZVByaXZpbGVnZSgpOwpAQCAtNDM0LDcgKzQ5MSw3IEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogI2lmICggSU5DTFVERV94VGFza0dldFNjaGVkdWxlclN0YXRlID09IDEgKQotCUJhc2VUeXBlX3QgTVBVX3hUYXNrR2V0U2NoZWR1bGVyU3RhdGUoIHZvaWQgKQorCUJhc2VUeXBlX3QgTVBVX3hUYXNrR2V0U2NoZWR1bGVyU3RhdGUoIHZvaWQgKSAvKiBGUkVFUlRPU19TWVNURU1fQ0FMTCAqLwogCXsKIAlCYXNlVHlwZV90IHhSZXR1cm47CiAJQmFzZVR5cGVfdCB4UnVubmluZ1ByaXZpbGVnZWQgPSB4UG9ydFJhaXNlUHJpdmlsZWdlKCk7CkBAIC00NDYsNyArNTAzLDcgQEAKICNlbmRpZgogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLXZvaWQgTVBVX3ZUYXNrU2V0VGltZU91dFN0YXRlKCBUaW1lT3V0X3QgKiBjb25zdCBweFRpbWVPdXQgKQordm9pZCBNUFVfdlRhc2tTZXRUaW1lT3V0U3RhdGUoIFRpbWVPdXRfdCAqIGNvbnN0IHB4VGltZU91dCApIC8qIEZSRUVSVE9TX1NZU1RFTV9DQUxMICovCiB7CiBCYXNlVHlwZV90IHhSdW5uaW5nUHJpdmlsZWdlZCA9IHhQb3J0UmFpc2VQcml2aWxlZ2UoKTsKIApAQCAtNDU1LDcgKzUxMiw3IEBACiB9CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotQmFzZVR5cGVfdCBNUFVfeFRhc2tDaGVja0ZvclRpbWVPdXQoIFRpbWVPdXRfdCAqIGNvbnN0IHB4VGltZU91dCwgVGlja1R5cGVfdCAqIGNvbnN0IHB4VGlja3NUb1dhaXQgKQorQmFzZVR5cGVfdCBNUFVfeFRhc2tDaGVja0ZvclRpbWVPdXQoIFRpbWVPdXRfdCAqIGNvbnN0IHB4VGltZU91dCwgVGlja1R5cGVfdCAqIGNvbnN0IHB4VGlja3NUb1dhaXQgKSAvKiBGUkVFUlRPU19TWVNURU1fQ0FMTCAqLwogewogQmFzZVR5cGVfdCB4UmV0dXJuOwogQmFzZVR5cGVfdCB4UnVubmluZ1ByaXZpbGVnZWQgPSB4UG9ydFJhaXNlUHJpdmlsZWdlKCk7CkBAIC00NjcsNyArNTI0LDcgQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiAjaWYoIGNvbmZpZ1VTRV9UQVNLX05PVElGSUNBVElPTlMgPT0gMSApCi0JQmFzZVR5cGVfdCBNUFVfeFRhc2tHZW5lcmljTm90aWZ5KCBUYXNrSGFuZGxlX3QgeFRhc2tUb05vdGlmeSwgdWludDMyX3QgdWxWYWx1ZSwgZU5vdGlmeUFjdGlvbiBlQWN0aW9uLCB1aW50MzJfdCAqcHVsUHJldmlvdXNOb3RpZmljYXRpb25WYWx1ZSApCisJQmFzZVR5cGVfdCBNUFVfeFRhc2tHZW5lcmljTm90aWZ5KCBUYXNrSGFuZGxlX3QgeFRhc2tUb05vdGlmeSwgdWludDMyX3QgdWxWYWx1ZSwgZU5vdGlmeUFjdGlvbiBlQWN0aW9uLCB1aW50MzJfdCAqcHVsUHJldmlvdXNOb3RpZmljYXRpb25WYWx1ZSApIC8qIEZSRUVSVE9TX1NZU1RFTV9DQUxMICovCiAJewogCUJhc2VUeXBlX3QgeFJldHVybjsKIAlCYXNlVHlwZV90IHhSdW5uaW5nUHJpdmlsZWdlZCA9IHhQb3J0UmFpc2VQcml2aWxlZ2UoKTsKQEAgLTQ4MCw3ICs1MzcsNyBAQAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKICNpZiggY29uZmlnVVNFX1RBU0tfTk9USUZJQ0FUSU9OUyA9PSAxICkKLQlCYXNlVHlwZV90IE1QVV94VGFza05vdGlmeVdhaXQoIHVpbnQzMl90IHVsQml0c1RvQ2xlYXJPbkVudHJ5LCB1aW50MzJfdCB1bEJpdHNUb0NsZWFyT25FeGl0LCB1aW50MzJfdCAqcHVsTm90aWZpY2F0aW9uVmFsdWUsIFRpY2tUeXBlX3QgeFRpY2tzVG9XYWl0ICkKKwlCYXNlVHlwZV90IE1QVV94VGFza05vdGlmeVdhaXQoIHVpbnQzMl90IHVsQml0c1RvQ2xlYXJPbkVudHJ5LCB1aW50MzJfdCB1bEJpdHNUb0NsZWFyT25FeGl0LCB1aW50MzJfdCAqcHVsTm90aWZpY2F0aW9uVmFsdWUsIFRpY2tUeXBlX3QgeFRpY2tzVG9XYWl0ICkgLyogRlJFRVJUT1NfU1lTVEVNX0NBTEwgKi8KIAl7CiAJQmFzZVR5cGVfdCB4UmV0dXJuOwogCUJhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkID0geFBvcnRSYWlzZVByaXZpbGVnZSgpOwpAQCAtNDkzLDcgKzU1MCw3IEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogI2lmKCBjb25maWdVU0VfVEFTS19OT1RJRklDQVRJT05TID09IDEgKQotCXVpbnQzMl90IE1QVV91bFRhc2tOb3RpZnlUYWtlKCBCYXNlVHlwZV90IHhDbGVhckNvdW50T25FeGl0LCBUaWNrVHlwZV90IHhUaWNrc1RvV2FpdCApCisJdWludDMyX3QgTVBVX3VsVGFza05vdGlmeVRha2UoIEJhc2VUeXBlX3QgeENsZWFyQ291bnRPbkV4aXQsIFRpY2tUeXBlX3QgeFRpY2tzVG9XYWl0ICkgLyogRlJFRVJUT1NfU1lTVEVNX0NBTEwgKi8KIAl7CiAJdWludDMyX3QgdWxSZXR1cm47CiAJQmFzZVR5cGVfdCB4UnVubmluZ1ByaXZpbGVnZWQgPSB4UG9ydFJhaXNlUHJpdmlsZWdlKCk7CkBAIC01MDYsNyArNTYzLDcgQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiAjaWYoIGNvbmZpZ1VTRV9UQVNLX05PVElGSUNBVElPTlMgPT0gMSApCi0JQmFzZVR5cGVfdCBNUFVfeFRhc2tOb3RpZnlTdGF0ZUNsZWFyKCBUYXNrSGFuZGxlX3QgeFRhc2sgKQorCUJhc2VUeXBlX3QgTVBVX3hUYXNrTm90aWZ5U3RhdGVDbGVhciggVGFza0hhbmRsZV90IHhUYXNrICkgLyogRlJFRVJUT1NfU1lTVEVNX0NBTEwgKi8KIAl7CiAJQmFzZVR5cGVfdCB4UmV0dXJuOwogCUJhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkID0geFBvcnRSYWlzZVByaXZpbGVnZSgpOwpAQCAtNTE5LDcgKzU3Niw3IEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogI2lmKCBjb25maWdTVVBQT1JUX0RZTkFNSUNfQUxMT0NBVElPTiA9PSAxICkKLQlRdWV1ZUhhbmRsZV90IE1QVV94UXVldWVHZW5lcmljQ3JlYXRlKCBVQmFzZVR5cGVfdCB1eFF1ZXVlTGVuZ3RoLCBVQmFzZVR5cGVfdCB1eEl0ZW1TaXplLCB1aW50OF90IHVjUXVldWVUeXBlICkKKwlRdWV1ZUhhbmRsZV90IE1QVV94UXVldWVHZW5lcmljQ3JlYXRlKCBVQmFzZVR5cGVfdCB1eFF1ZXVlTGVuZ3RoLCBVQmFzZVR5cGVfdCB1eEl0ZW1TaXplLCB1aW50OF90IHVjUXVldWVUeXBlICkgLyogRlJFRVJUT1NfU1lTVEVNX0NBTEwgKi8KIAl7CiAJUXVldWVIYW5kbGVfdCB4UmV0dXJuOwogCUJhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkID0geFBvcnRSYWlzZVByaXZpbGVnZSgpOwpAQCAtNTMyLDcgKzU4OSw3IEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogI2lmKCBjb25maWdTVVBQT1JUX1NUQVRJQ19BTExPQ0FUSU9OID09IDEgKQotCVF1ZXVlSGFuZGxlX3QgTVBVX3hRdWV1ZUdlbmVyaWNDcmVhdGVTdGF0aWMoIGNvbnN0IFVCYXNlVHlwZV90IHV4UXVldWVMZW5ndGgsIGNvbnN0IFVCYXNlVHlwZV90IHV4SXRlbVNpemUsIHVpbnQ4X3QgKnB1Y1F1ZXVlU3RvcmFnZSwgU3RhdGljUXVldWVfdCAqcHhTdGF0aWNRdWV1ZSwgY29uc3QgdWludDhfdCB1Y1F1ZXVlVHlwZSApCisJUXVldWVIYW5kbGVfdCBNUFVfeFF1ZXVlR2VuZXJpY0NyZWF0ZVN0YXRpYyggY29uc3QgVUJhc2VUeXBlX3QgdXhRdWV1ZUxlbmd0aCwgY29uc3QgVUJhc2VUeXBlX3QgdXhJdGVtU2l6ZSwgdWludDhfdCAqcHVjUXVldWVTdG9yYWdlLCBTdGF0aWNRdWV1ZV90ICpweFN0YXRpY1F1ZXVlLCBjb25zdCB1aW50OF90IHVjUXVldWVUeXBlICkgLyogRlJFRVJUT1NfU1lTVEVNX0NBTEwgKi8KIAl7CiAJUXVldWVIYW5kbGVfdCB4UmV0dXJuOwogCUJhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkID0geFBvcnRSYWlzZVByaXZpbGVnZSgpOwpAQCAtNTQ0LDcgKzYwMSw3IEBACiAjZW5kaWYKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi1CYXNlVHlwZV90IE1QVV94UXVldWVHZW5lcmljUmVzZXQoIFF1ZXVlSGFuZGxlX3QgcHhRdWV1ZSwgQmFzZVR5cGVfdCB4TmV3UXVldWUgKQorQmFzZVR5cGVfdCBNUFVfeFF1ZXVlR2VuZXJpY1Jlc2V0KCBRdWV1ZUhhbmRsZV90IHB4UXVldWUsIEJhc2VUeXBlX3QgeE5ld1F1ZXVlICkgLyogRlJFRVJUT1NfU1lTVEVNX0NBTEwgKi8KIHsKIEJhc2VUeXBlX3QgeFJldHVybjsKIEJhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkID0geFBvcnRSYWlzZVByaXZpbGVnZSgpOwpAQCAtNTU1LDcgKzYxMiw3IEBACiB9CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotQmFzZVR5cGVfdCBNUFVfeFF1ZXVlR2VuZXJpY1NlbmQoIFF1ZXVlSGFuZGxlX3QgeFF1ZXVlLCBjb25zdCB2b2lkICogY29uc3QgcHZJdGVtVG9RdWV1ZSwgVGlja1R5cGVfdCB4VGlja3NUb1dhaXQsIEJhc2VUeXBlX3QgeENvcHlQb3NpdGlvbiApCitCYXNlVHlwZV90IE1QVV94UXVldWVHZW5lcmljU2VuZCggUXVldWVIYW5kbGVfdCB4UXVldWUsIGNvbnN0IHZvaWQgKiBjb25zdCBwdkl0ZW1Ub1F1ZXVlLCBUaWNrVHlwZV90IHhUaWNrc1RvV2FpdCwgQmFzZVR5cGVfdCB4Q29weVBvc2l0aW9uICkgLyogRlJFRVJUT1NfU1lTVEVNX0NBTEwgKi8KIHsKIEJhc2VUeXBlX3QgeFJldHVybjsKIEJhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkID0geFBvcnRSYWlzZVByaXZpbGVnZSgpOwpAQCAtNTY2LDcgKzYyMyw3IEBACiB9CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotVUJhc2VUeXBlX3QgTVBVX3V4UXVldWVNZXNzYWdlc1dhaXRpbmcoIGNvbnN0IFF1ZXVlSGFuZGxlX3QgcHhRdWV1ZSApCitVQmFzZVR5cGVfdCBNUFVfdXhRdWV1ZU1lc3NhZ2VzV2FpdGluZyggY29uc3QgUXVldWVIYW5kbGVfdCBweFF1ZXVlICkgLyogRlJFRVJUT1NfU1lTVEVNX0NBTEwgKi8KIHsKIEJhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkID0geFBvcnRSYWlzZVByaXZpbGVnZSgpOwogVUJhc2VUeXBlX3QgdXhSZXR1cm47CkBAIC01NzcsNyArNjM0LDcgQEAKIH0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi1VQmFzZVR5cGVfdCBNUFVfdXhRdWV1ZVNwYWNlc0F2YWlsYWJsZSggY29uc3QgUXVldWVIYW5kbGVfdCB4UXVldWUgKQorVUJhc2VUeXBlX3QgTVBVX3V4UXVldWVTcGFjZXNBdmFpbGFibGUoIGNvbnN0IFF1ZXVlSGFuZGxlX3QgeFF1ZXVlICkgLyogRlJFRVJUT1NfU1lTVEVNX0NBTEwgKi8KIHsKIEJhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkID0geFBvcnRSYWlzZVByaXZpbGVnZSgpOwogVUJhc2VUeXBlX3QgdXhSZXR1cm47CkBAIC01ODgsNyArNjQ1LDcgQEAKIH0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi1CYXNlVHlwZV90IE1QVV94UXVldWVSZWNlaXZlKCBRdWV1ZUhhbmRsZV90IHB4UXVldWUsIHZvaWQgKiBjb25zdCBwdkJ1ZmZlciwgVGlja1R5cGVfdCB4VGlja3NUb1dhaXQgKQorQmFzZVR5cGVfdCBNUFVfeFF1ZXVlUmVjZWl2ZSggUXVldWVIYW5kbGVfdCBweFF1ZXVlLCB2b2lkICogY29uc3QgcHZCdWZmZXIsIFRpY2tUeXBlX3QgeFRpY2tzVG9XYWl0ICkgLyogRlJFRVJUT1NfU1lTVEVNX0NBTEwgKi8KIHsKIEJhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkID0geFBvcnRSYWlzZVByaXZpbGVnZSgpOwogQmFzZVR5cGVfdCB4UmV0dXJuOwpAQCAtNTk5LDcgKzY1Niw3IEBACiB9CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotQmFzZVR5cGVfdCBNUFVfeFF1ZXVlUGVlayggUXVldWVIYW5kbGVfdCB4UXVldWUsIHZvaWQgKiBjb25zdCBwdkJ1ZmZlciwgVGlja1R5cGVfdCB4VGlja3NUb1dhaXQgKQorQmFzZVR5cGVfdCBNUFVfeFF1ZXVlUGVlayggUXVldWVIYW5kbGVfdCB4UXVldWUsIHZvaWQgKiBjb25zdCBwdkJ1ZmZlciwgVGlja1R5cGVfdCB4VGlja3NUb1dhaXQgKSAvKiBGUkVFUlRPU19TWVNURU1fQ0FMTCAqLwogewogQmFzZVR5cGVfdCB4UnVubmluZ1ByaXZpbGVnZWQgPSB4UG9ydFJhaXNlUHJpdmlsZWdlKCk7CiBCYXNlVHlwZV90IHhSZXR1cm47CkBAIC02MTAsNyArNjY3LDcgQEAKIH0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi1CYXNlVHlwZV90IE1QVV94UXVldWVTZW1hcGhvcmVUYWtlKCBRdWV1ZUhhbmRsZV90IHhRdWV1ZSwgVGlja1R5cGVfdCB4VGlja3NUb1dhaXQgKQorQmFzZVR5cGVfdCBNUFVfeFF1ZXVlU2VtYXBob3JlVGFrZSggUXVldWVIYW5kbGVfdCB4UXVldWUsIFRpY2tUeXBlX3QgeFRpY2tzVG9XYWl0ICkgLyogRlJFRVJUT1NfU1lTVEVNX0NBTEwgKi8KIHsKIEJhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkID0geFBvcnRSYWlzZVByaXZpbGVnZSgpOwogQmFzZVR5cGVfdCB4UmV0dXJuOwpAQCAtNjIxLDMwICs2NzgsMjEgQEAKIH0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi1CYXNlVHlwZV90IE1QVV94UXVldWVQZWVrRnJvbUlTUiggUXVldWVIYW5kbGVfdCBweFF1ZXVlLCB2b2lkICogY29uc3QgcHZCdWZmZXIgKQotewotQmFzZVR5cGVfdCB4UnVubmluZ1ByaXZpbGVnZWQgPSB4UG9ydFJhaXNlUHJpdmlsZWdlKCk7Ci1CYXNlVHlwZV90IHhSZXR1cm47CisjaWYgKCAoIGNvbmZpZ1VTRV9NVVRFWEVTID09IDEgKSAmJiAoIElOQ0xVREVfeFNlbWFwaG9yZUdldE11dGV4SG9sZGVyID09IDEgKSApCisJVGFza0hhbmRsZV90IE1QVV94UXVldWVHZXRNdXRleEhvbGRlciggUXVldWVIYW5kbGVfdCB4U2VtYXBob3JlICkgLyogRlJFRVJUT1NfU1lTVEVNX0NBTEwgKi8KKwl7CisJQmFzZVR5cGVfdCB4UnVubmluZ1ByaXZpbGVnZWQgPSB4UG9ydFJhaXNlUHJpdmlsZWdlKCk7CisJdm9pZCAqIHhSZXR1cm47CiAKLQl4UmV0dXJuID0geFF1ZXVlUGVla0Zyb21JU1IoIHB4UXVldWUsIHB2QnVmZmVyICk7Ci0JdlBvcnRSZXNldFByaXZpbGVnZSggeFJ1bm5pbmdQcml2aWxlZ2VkICk7Ci0JcmV0dXJuIHhSZXR1cm47Ci19Ci0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCogTVBVX3hRdWV1ZUdldE11dGV4SG9sZGVyKCBRdWV1ZUhhbmRsZV90IHhTZW1hcGhvcmUgKQotewotQmFzZVR5cGVfdCB4UnVubmluZ1ByaXZpbGVnZWQgPSB4UG9ydFJhaXNlUHJpdmlsZWdlKCk7Ci12b2lkICogeFJldHVybjsKLQotCXhSZXR1cm4gPSAoIHZvaWQgKiApIHhRdWV1ZUdldE11dGV4SG9sZGVyKCB4U2VtYXBob3JlICk7Ci0JdlBvcnRSZXNldFByaXZpbGVnZSggeFJ1bm5pbmdQcml2aWxlZ2VkICk7Ci0JcmV0dXJuIHhSZXR1cm47Ci19CisJCXhSZXR1cm4gPSB4UXVldWVHZXRNdXRleEhvbGRlciggeFNlbWFwaG9yZSApOworCQl2UG9ydFJlc2V0UHJpdmlsZWdlKCB4UnVubmluZ1ByaXZpbGVnZWQgKTsKKwkJcmV0dXJuIHhSZXR1cm47CisJfQorI2VuZGlmCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogI2lmKCAoIGNvbmZpZ1VTRV9NVVRFWEVTID09IDEgKSAmJiAoIGNvbmZpZ1NVUFBPUlRfRFlOQU1JQ19BTExPQ0FUSU9OID09IDEgKSApCi0JUXVldWVIYW5kbGVfdCBNUFVfeFF1ZXVlQ3JlYXRlTXV0ZXgoIGNvbnN0IHVpbnQ4X3QgdWNRdWV1ZVR5cGUgKQorCVF1ZXVlSGFuZGxlX3QgTVBVX3hRdWV1ZUNyZWF0ZU11dGV4KCBjb25zdCB1aW50OF90IHVjUXVldWVUeXBlICkgLyogRlJFRVJUT1NfU1lTVEVNX0NBTEwgKi8KIAl7CiAJUXVldWVIYW5kbGVfdCB4UmV0dXJuOwogCUJhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkID0geFBvcnRSYWlzZVByaXZpbGVnZSgpOwpAQCAtNjU3LDcgKzcwNSw3IEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogI2lmKCAoIGNvbmZpZ1VTRV9NVVRFWEVTID09IDEgKSAmJiAoIGNvbmZpZ1NVUFBPUlRfU1RBVElDX0FMTE9DQVRJT04gPT0gMSApICkKLQlRdWV1ZUhhbmRsZV90IE1QVV94UXVldWVDcmVhdGVNdXRleFN0YXRpYyggY29uc3QgdWludDhfdCB1Y1F1ZXVlVHlwZSwgU3RhdGljUXVldWVfdCAqcHhTdGF0aWNRdWV1ZSApCisJUXVldWVIYW5kbGVfdCBNUFVfeFF1ZXVlQ3JlYXRlTXV0ZXhTdGF0aWMoIGNvbnN0IHVpbnQ4X3QgdWNRdWV1ZVR5cGUsIFN0YXRpY1F1ZXVlX3QgKnB4U3RhdGljUXVldWUgKSAvKiBGUkVFUlRPU19TWVNURU1fQ0FMTCAqLwogCXsKIAlRdWV1ZUhhbmRsZV90IHhSZXR1cm47CiAJQmFzZVR5cGVfdCB4UnVubmluZ1ByaXZpbGVnZWQgPSB4UG9ydFJhaXNlUHJpdmlsZWdlKCk7CkBAIC02NzAsNyArNzE4LDcgQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiAjaWYoICggY29uZmlnVVNFX0NPVU5USU5HX1NFTUFQSE9SRVMgPT0gMSApICYmICggY29uZmlnU1VQUE9SVF9EWU5BTUlDX0FMTE9DQVRJT04gPT0gMSApICkKLQlRdWV1ZUhhbmRsZV90IE1QVV94UXVldWVDcmVhdGVDb3VudGluZ1NlbWFwaG9yZSggVUJhc2VUeXBlX3QgdXhDb3VudFZhbHVlLCBVQmFzZVR5cGVfdCB1eEluaXRpYWxDb3VudCApCisJUXVldWVIYW5kbGVfdCBNUFVfeFF1ZXVlQ3JlYXRlQ291bnRpbmdTZW1hcGhvcmUoIFVCYXNlVHlwZV90IHV4Q291bnRWYWx1ZSwgVUJhc2VUeXBlX3QgdXhJbml0aWFsQ291bnQgKSAvKiBGUkVFUlRPU19TWVNURU1fQ0FMTCAqLwogCXsKIAlRdWV1ZUhhbmRsZV90IHhSZXR1cm47CiAJQmFzZVR5cGVfdCB4UnVubmluZ1ByaXZpbGVnZWQgPSB4UG9ydFJhaXNlUHJpdmlsZWdlKCk7CkBAIC02ODQsNyArNzMyLDcgQEAKIAogI2lmKCAoIGNvbmZpZ1VTRV9DT1VOVElOR19TRU1BUEhPUkVTID09IDEgKSAmJiAoIGNvbmZpZ1NVUFBPUlRfU1RBVElDX0FMTE9DQVRJT04gPT0gMSApICkKIAotCVF1ZXVlSGFuZGxlX3QgTVBVX3hRdWV1ZUNyZWF0ZUNvdW50aW5nU2VtYXBob3JlU3RhdGljKCBjb25zdCBVQmFzZVR5cGVfdCB1eE1heENvdW50LCBjb25zdCBVQmFzZVR5cGVfdCB1eEluaXRpYWxDb3VudCwgU3RhdGljUXVldWVfdCAqcHhTdGF0aWNRdWV1ZSApCisJUXVldWVIYW5kbGVfdCBNUFVfeFF1ZXVlQ3JlYXRlQ291bnRpbmdTZW1hcGhvcmVTdGF0aWMoIGNvbnN0IFVCYXNlVHlwZV90IHV4TWF4Q291bnQsIGNvbnN0IFVCYXNlVHlwZV90IHV4SW5pdGlhbENvdW50LCBTdGF0aWNRdWV1ZV90ICpweFN0YXRpY1F1ZXVlICkgLyogRlJFRVJUT1NfU1lTVEVNX0NBTEwgKi8KIAl7CiAJUXVldWVIYW5kbGVfdCB4UmV0dXJuOwogCUJhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkID0geFBvcnRSYWlzZVByaXZpbGVnZSgpOwpAQCAtNjk3LDcgKzc0NSw3IEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogI2lmICggY29uZmlnVVNFX1JFQ1VSU0lWRV9NVVRFWEVTID09IDEgKQotCUJhc2VUeXBlX3QgTVBVX3hRdWV1ZVRha2VNdXRleFJlY3Vyc2l2ZSggUXVldWVIYW5kbGVfdCB4TXV0ZXgsIFRpY2tUeXBlX3QgeEJsb2NrVGltZSApCisJQmFzZVR5cGVfdCBNUFVfeFF1ZXVlVGFrZU11dGV4UmVjdXJzaXZlKCBRdWV1ZUhhbmRsZV90IHhNdXRleCwgVGlja1R5cGVfdCB4QmxvY2tUaW1lICkgLyogRlJFRVJUT1NfU1lTVEVNX0NBTEwgKi8KIAl7CiAJQmFzZVR5cGVfdCB4UmV0dXJuOwogCUJhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkID0geFBvcnRSYWlzZVByaXZpbGVnZSgpOwpAQCAtNzEwLDcgKzc1OCw3IEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogI2lmICggY29uZmlnVVNFX1JFQ1VSU0lWRV9NVVRFWEVTID09IDEgKQotCUJhc2VUeXBlX3QgTVBVX3hRdWV1ZUdpdmVNdXRleFJlY3Vyc2l2ZSggUXVldWVIYW5kbGVfdCB4TXV0ZXggKQorCUJhc2VUeXBlX3QgTVBVX3hRdWV1ZUdpdmVNdXRleFJlY3Vyc2l2ZSggUXVldWVIYW5kbGVfdCB4TXV0ZXggKSAvKiBGUkVFUlRPU19TWVNURU1fQ0FMTCAqLwogCXsKIAlCYXNlVHlwZV90IHhSZXR1cm47CiAJQmFzZVR5cGVfdCB4UnVubmluZ1ByaXZpbGVnZWQgPSB4UG9ydFJhaXNlUHJpdmlsZWdlKCk7CkBAIC03MjMsNyArNzcxLDcgQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiAjaWYoICggY29uZmlnVVNFX1FVRVVFX1NFVFMgPT0gMSApICYmICggY29uZmlnU1VQUE9SVF9EWU5BTUlDX0FMTE9DQVRJT04gPT0gMSApICkKLQlRdWV1ZVNldEhhbmRsZV90IE1QVV94UXVldWVDcmVhdGVTZXQoIFVCYXNlVHlwZV90IHV4RXZlbnRRdWV1ZUxlbmd0aCApCisJUXVldWVTZXRIYW5kbGVfdCBNUFVfeFF1ZXVlQ3JlYXRlU2V0KCBVQmFzZVR5cGVfdCB1eEV2ZW50UXVldWVMZW5ndGggKSAvKiBGUkVFUlRPU19TWVNURU1fQ0FMTCAqLwogCXsKIAlRdWV1ZVNldEhhbmRsZV90IHhSZXR1cm47CiAJQmFzZVR5cGVfdCB4UnVubmluZ1ByaXZpbGVnZWQgPSB4UG9ydFJhaXNlUHJpdmlsZWdlKCk7CkBAIC03MzYsNyArNzg0LDcgQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiAjaWYgKCBjb25maWdVU0VfUVVFVUVfU0VUUyA9PSAxICkKLQlRdWV1ZVNldE1lbWJlckhhbmRsZV90IE1QVV94UXVldWVTZWxlY3RGcm9tU2V0KCBRdWV1ZVNldEhhbmRsZV90IHhRdWV1ZVNldCwgVGlja1R5cGVfdCB4QmxvY2tUaW1lVGlja3MgKQorCVF1ZXVlU2V0TWVtYmVySGFuZGxlX3QgTVBVX3hRdWV1ZVNlbGVjdEZyb21TZXQoIFF1ZXVlU2V0SGFuZGxlX3QgeFF1ZXVlU2V0LCBUaWNrVHlwZV90IHhCbG9ja1RpbWVUaWNrcyApIC8qIEZSRUVSVE9TX1NZU1RFTV9DQUxMICovCiAJewogCVF1ZXVlU2V0TWVtYmVySGFuZGxlX3QgeFJldHVybjsKIAlCYXNlVHlwZV90IHhSdW5uaW5nUHJpdmlsZWdlZCA9IHhQb3J0UmFpc2VQcml2aWxlZ2UoKTsKQEAgLTc0OSw3ICs3OTcsNyBAQAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKICNpZiAoIGNvbmZpZ1VTRV9RVUVVRV9TRVRTID09IDEgKQotCUJhc2VUeXBlX3QgTVBVX3hRdWV1ZUFkZFRvU2V0KCBRdWV1ZVNldE1lbWJlckhhbmRsZV90IHhRdWV1ZU9yU2VtYXBob3JlLCBRdWV1ZVNldEhhbmRsZV90IHhRdWV1ZVNldCApCisJQmFzZVR5cGVfdCBNUFVfeFF1ZXVlQWRkVG9TZXQoIFF1ZXVlU2V0TWVtYmVySGFuZGxlX3QgeFF1ZXVlT3JTZW1hcGhvcmUsIFF1ZXVlU2V0SGFuZGxlX3QgeFF1ZXVlU2V0ICkgLyogRlJFRVJUT1NfU1lTVEVNX0NBTEwgKi8KIAl7CiAJQmFzZVR5cGVfdCB4UmV0dXJuOwogCUJhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkID0geFBvcnRSYWlzZVByaXZpbGVnZSgpOwpAQCAtNzYyLDcgKzgxMCw3IEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogI2lmICggY29uZmlnVVNFX1FVRVVFX1NFVFMgPT0gMSApCi0JQmFzZVR5cGVfdCBNUFVfeFF1ZXVlUmVtb3ZlRnJvbVNldCggUXVldWVTZXRNZW1iZXJIYW5kbGVfdCB4UXVldWVPclNlbWFwaG9yZSwgUXVldWVTZXRIYW5kbGVfdCB4UXVldWVTZXQgKQorCUJhc2VUeXBlX3QgTVBVX3hRdWV1ZVJlbW92ZUZyb21TZXQoIFF1ZXVlU2V0TWVtYmVySGFuZGxlX3QgeFF1ZXVlT3JTZW1hcGhvcmUsIFF1ZXVlU2V0SGFuZGxlX3QgeFF1ZXVlU2V0ICkgLyogRlJFRVJUT1NfU1lTVEVNX0NBTEwgKi8KIAl7CiAJQmFzZVR5cGVfdCB4UmV0dXJuOwogCUJhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkID0geFBvcnRSYWlzZVByaXZpbGVnZSgpOwpAQCAtNzc1LDcgKzgyMyw3IEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogI2lmIGNvbmZpZ1FVRVVFX1JFR0lTVFJZX1NJWkUgPiAwCi0Jdm9pZCBNUFVfdlF1ZXVlQWRkVG9SZWdpc3RyeSggUXVldWVIYW5kbGVfdCB4UXVldWUsIGNvbnN0IGNoYXIgKnBjTmFtZSApCisJdm9pZCBNUFVfdlF1ZXVlQWRkVG9SZWdpc3RyeSggUXVldWVIYW5kbGVfdCB4UXVldWUsIGNvbnN0IGNoYXIgKnBjTmFtZSApIC8qIEZSRUVSVE9TX1NZU1RFTV9DQUxMICovCiAJewogCUJhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkID0geFBvcnRSYWlzZVByaXZpbGVnZSgpOwogCkBAIC03ODcsNyArODM1LDcgQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiAjaWYgY29uZmlnUVVFVUVfUkVHSVNUUllfU0laRSA+IDAKLQl2b2lkIE1QVV92UXVldWVVbnJlZ2lzdGVyUXVldWUoIFF1ZXVlSGFuZGxlX3QgeFF1ZXVlICkKKwl2b2lkIE1QVV92UXVldWVVbnJlZ2lzdGVyUXVldWUoIFF1ZXVlSGFuZGxlX3QgeFF1ZXVlICkgLyogRlJFRVJUT1NfU1lTVEVNX0NBTEwgKi8KIAl7CiAJQmFzZVR5cGVfdCB4UnVubmluZ1ByaXZpbGVnZWQgPSB4UG9ydFJhaXNlUHJpdmlsZWdlKCk7CiAKQEAgLTc5OSw3ICs4NDcsNyBAQAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKICNpZiBjb25maWdRVUVVRV9SRUdJU1RSWV9TSVpFID4gMAotCWNvbnN0IGNoYXIgKk1QVV9wY1F1ZXVlR2V0TmFtZSggUXVldWVIYW5kbGVfdCB4UXVldWUgKQorCWNvbnN0IGNoYXIgKk1QVV9wY1F1ZXVlR2V0TmFtZSggUXVldWVIYW5kbGVfdCB4UXVldWUgKSAvKiBGUkVFUlRPU19TWVNURU1fQ0FMTCAqLwogCXsKIAlCYXNlVHlwZV90IHhSdW5uaW5nUHJpdmlsZWdlZCA9IHhQb3J0UmFpc2VQcml2aWxlZ2UoKTsKIAljb25zdCBjaGFyICpwY1JldHVybjsKQEAgLTgxMiw3ICs4NjAsNyBAQAogI2VuZGlmCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotdm9pZCBNUFVfdlF1ZXVlRGVsZXRlKCBRdWV1ZUhhbmRsZV90IHhRdWV1ZSApCit2b2lkIE1QVV92UXVldWVEZWxldGUoIFF1ZXVlSGFuZGxlX3QgeFF1ZXVlICkgLyogRlJFRVJUT1NfU1lTVEVNX0NBTEwgKi8KIHsKIEJhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkID0geFBvcnRSYWlzZVByaXZpbGVnZSgpOwogCkBAIC04MjMsNyArODcxLDcgQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiAjaWYoIGNvbmZpZ1NVUFBPUlRfRFlOQU1JQ19BTExPQ0FUSU9OID09IDEgKQotCXZvaWQgKk1QVV9wdlBvcnRNYWxsb2MoIHNpemVfdCB4U2l6ZSApCisJdm9pZCAqTVBVX3B2UG9ydE1hbGxvYyggc2l6ZV90IHhTaXplICkgLyogRlJFRVJUT1NfU1lTVEVNX0NBTEwgKi8KIAl7CiAJdm9pZCAqcHZSZXR1cm47CiAJQmFzZVR5cGVfdCB4UnVubmluZ1ByaXZpbGVnZWQgPSB4UG9ydFJhaXNlUHJpdmlsZWdlKCk7CkBAIC04MzgsNyArODg2LDcgQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiAjaWYoIGNvbmZpZ1NVUFBPUlRfRFlOQU1JQ19BTExPQ0FUSU9OID09IDEgKQotCXZvaWQgTVBVX3ZQb3J0RnJlZSggdm9pZCAqcHYgKQorCXZvaWQgTVBVX3ZQb3J0RnJlZSggdm9pZCAqcHYgKSAvKiBGUkVFUlRPU19TWVNURU1fQ0FMTCAqLwogCXsKIAlCYXNlVHlwZV90IHhSdW5uaW5nUHJpdmlsZWdlZCA9IHhQb3J0UmFpc2VQcml2aWxlZ2UoKTsKIApAQCAtODUwLDcgKzg5OCw3IEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogI2lmKCBjb25maWdTVVBQT1JUX0RZTkFNSUNfQUxMT0NBVElPTiA9PSAxICkKLQl2b2lkIE1QVV92UG9ydEluaXRpYWxpc2VCbG9ja3MoIHZvaWQgKQorCXZvaWQgTVBVX3ZQb3J0SW5pdGlhbGlzZUJsb2Nrcyggdm9pZCApIC8qIEZSRUVSVE9TX1NZU1RFTV9DQUxMICovCiAJewogCUJhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkID0geFBvcnRSYWlzZVByaXZpbGVnZSgpOwogCkBAIC04NjIsNyArOTEwLDcgQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiAjaWYoIGNvbmZpZ1NVUFBPUlRfRFlOQU1JQ19BTExPQ0FUSU9OID09IDEgKQotCXNpemVfdCBNUFVfeFBvcnRHZXRGcmVlSGVhcFNpemUoIHZvaWQgKQorCXNpemVfdCBNUFVfeFBvcnRHZXRGcmVlSGVhcFNpemUoIHZvaWQgKSAvKiBGUkVFUlRPU19TWVNURU1fQ0FMTCAqLwogCXsKIAlzaXplX3QgeFJldHVybjsKIAlCYXNlVHlwZV90IHhSdW5uaW5nUHJpdmlsZWdlZCA9IHhQb3J0UmFpc2VQcml2aWxlZ2UoKTsKQEAgLTg3Nyw3ICs5MjUsNyBAQAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKICNpZiggKCBjb25maWdTVVBQT1JUX0RZTkFNSUNfQUxMT0NBVElPTiA9PSAxICkgJiYgKCBjb25maWdVU0VfVElNRVJTID09IDEgKSApCi0JVGltZXJIYW5kbGVfdCBNUFVfeFRpbWVyQ3JlYXRlKCBjb25zdCBjaGFyICogY29uc3QgcGNUaW1lck5hbWUsIGNvbnN0IFRpY2tUeXBlX3QgeFRpbWVyUGVyaW9kSW5UaWNrcywgY29uc3QgVUJhc2VUeXBlX3QgdXhBdXRvUmVsb2FkLCB2b2lkICogY29uc3QgcHZUaW1lcklELCBUaW1lckNhbGxiYWNrRnVuY3Rpb25fdCBweENhbGxiYWNrRnVuY3Rpb24gKQorCVRpbWVySGFuZGxlX3QgTVBVX3hUaW1lckNyZWF0ZSggY29uc3QgY2hhciAqIGNvbnN0IHBjVGltZXJOYW1lLCBjb25zdCBUaWNrVHlwZV90IHhUaW1lclBlcmlvZEluVGlja3MsIGNvbnN0IFVCYXNlVHlwZV90IHV4QXV0b1JlbG9hZCwgdm9pZCAqIGNvbnN0IHB2VGltZXJJRCwgVGltZXJDYWxsYmFja0Z1bmN0aW9uX3QgcHhDYWxsYmFja0Z1bmN0aW9uICkgLyogRlJFRVJUT1NfU1lTVEVNX0NBTEwgKi8KIAl7CiAJVGltZXJIYW5kbGVfdCB4UmV0dXJuOwogCUJhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkID0geFBvcnRSYWlzZVByaXZpbGVnZSgpOwpAQCAtODkxLDcgKzkzOSw3IEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogI2lmKCAoIGNvbmZpZ1NVUFBPUlRfU1RBVElDX0FMTE9DQVRJT04gPT0gMSApICYmICggY29uZmlnVVNFX1RJTUVSUyA9PSAxICkgKQotCVRpbWVySGFuZGxlX3QgTVBVX3hUaW1lckNyZWF0ZVN0YXRpYyggY29uc3QgY2hhciAqIGNvbnN0IHBjVGltZXJOYW1lLCBjb25zdCBUaWNrVHlwZV90IHhUaW1lclBlcmlvZEluVGlja3MsIGNvbnN0IFVCYXNlVHlwZV90IHV4QXV0b1JlbG9hZCwgdm9pZCAqIGNvbnN0IHB2VGltZXJJRCwgVGltZXJDYWxsYmFja0Z1bmN0aW9uX3QgcHhDYWxsYmFja0Z1bmN0aW9uLCBTdGF0aWNUaW1lcl90ICpweFRpbWVyQnVmZmVyICkKKwlUaW1lckhhbmRsZV90IE1QVV94VGltZXJDcmVhdGVTdGF0aWMoIGNvbnN0IGNoYXIgKiBjb25zdCBwY1RpbWVyTmFtZSwgY29uc3QgVGlja1R5cGVfdCB4VGltZXJQZXJpb2RJblRpY2tzLCBjb25zdCBVQmFzZVR5cGVfdCB1eEF1dG9SZWxvYWQsIHZvaWQgKiBjb25zdCBwdlRpbWVySUQsIFRpbWVyQ2FsbGJhY2tGdW5jdGlvbl90IHB4Q2FsbGJhY2tGdW5jdGlvbiwgU3RhdGljVGltZXJfdCAqcHhUaW1lckJ1ZmZlciApIC8qIEZSRUVSVE9TX1NZU1RFTV9DQUxMICovCiAJewogCVRpbWVySGFuZGxlX3QgeFJldHVybjsKIAlCYXNlVHlwZV90IHhSdW5uaW5nUHJpdmlsZWdlZCA9IHhQb3J0UmFpc2VQcml2aWxlZ2UoKTsKQEAgLTkwNSw3ICs5NTMsNyBAQAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKICNpZiggY29uZmlnVVNFX1RJTUVSUyA9PSAxICkKLQl2b2lkICpNUFVfcHZUaW1lckdldFRpbWVySUQoIGNvbnN0IFRpbWVySGFuZGxlX3QgeFRpbWVyICkKKwl2b2lkICpNUFVfcHZUaW1lckdldFRpbWVySUQoIGNvbnN0IFRpbWVySGFuZGxlX3QgeFRpbWVyICkgLyogRlJFRVJUT1NfU1lTVEVNX0NBTEwgKi8KIAl7CiAJdm9pZCAqIHB2UmV0dXJuOwogCUJhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkID0geFBvcnRSYWlzZVByaXZpbGVnZSgpOwpAQCAtOTE5LDcgKzk2Nyw3IEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogI2lmKCBjb25maWdVU0VfVElNRVJTID09IDEgKQotCXZvaWQgTVBVX3ZUaW1lclNldFRpbWVySUQoIFRpbWVySGFuZGxlX3QgeFRpbWVyLCB2b2lkICpwdk5ld0lEICkKKwl2b2lkIE1QVV92VGltZXJTZXRUaW1lcklEKCBUaW1lckhhbmRsZV90IHhUaW1lciwgdm9pZCAqcHZOZXdJRCApIC8qIEZSRUVSVE9TX1NZU1RFTV9DQUxMICovCiAJewogCUJhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkID0geFBvcnRSYWlzZVByaXZpbGVnZSgpOwogCkBAIC05MzAsNyArOTc4LDcgQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiAjaWYoIGNvbmZpZ1VTRV9USU1FUlMgPT0gMSApCi0JQmFzZVR5cGVfdCBNUFVfeFRpbWVySXNUaW1lckFjdGl2ZSggVGltZXJIYW5kbGVfdCB4VGltZXIgKQorCUJhc2VUeXBlX3QgTVBVX3hUaW1lcklzVGltZXJBY3RpdmUoIFRpbWVySGFuZGxlX3QgeFRpbWVyICkgLyogRlJFRVJUT1NfU1lTVEVNX0NBTEwgKi8KIAl7CiAJQmFzZVR5cGVfdCB4UmV0dXJuOwogCUJhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkID0geFBvcnRSYWlzZVByaXZpbGVnZSgpOwpAQCAtOTQ0LDcgKzk5Miw3IEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogI2lmKCBjb25maWdVU0VfVElNRVJTID09IDEgKQotCVRhc2tIYW5kbGVfdCBNUFVfeFRpbWVyR2V0VGltZXJEYWVtb25UYXNrSGFuZGxlKCB2b2lkICkKKwlUYXNrSGFuZGxlX3QgTVBVX3hUaW1lckdldFRpbWVyRGFlbW9uVGFza0hhbmRsZSggdm9pZCApIC8qIEZSRUVSVE9TX1NZU1RFTV9DQUxMICovCiAJewogCVRhc2tIYW5kbGVfdCB4UmV0dXJuOwogCUJhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkID0geFBvcnRSYWlzZVByaXZpbGVnZSgpOwpAQCAtOTU4LDcgKzEwMDYsNyBAQAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKICNpZiggKCBJTkNMVURFX3hUaW1lclBlbmRGdW5jdGlvbkNhbGwgPT0gMSApICYmICggY29uZmlnVVNFX1RJTUVSUyA9PSAxICkgKQotCUJhc2VUeXBlX3QgTVBVX3hUaW1lclBlbmRGdW5jdGlvbkNhbGwoIFBlbmRlZEZ1bmN0aW9uX3QgeEZ1bmN0aW9uVG9QZW5kLCB2b2lkICpwdlBhcmFtZXRlcjEsIHVpbnQzMl90IHVsUGFyYW1ldGVyMiwgVGlja1R5cGVfdCB4VGlja3NUb1dhaXQgKQorCUJhc2VUeXBlX3QgTVBVX3hUaW1lclBlbmRGdW5jdGlvbkNhbGwoIFBlbmRlZEZ1bmN0aW9uX3QgeEZ1bmN0aW9uVG9QZW5kLCB2b2lkICpwdlBhcmFtZXRlcjEsIHVpbnQzMl90IHVsUGFyYW1ldGVyMiwgVGlja1R5cGVfdCB4VGlja3NUb1dhaXQgKSAvKiBGUkVFUlRPU19TWVNURU1fQ0FMTCAqLwogCXsKIAlCYXNlVHlwZV90IHhSZXR1cm47CiAJQmFzZVR5cGVfdCB4UnVubmluZ1ByaXZpbGVnZWQgPSB4UG9ydFJhaXNlUHJpdmlsZWdlKCk7CkBAIC05NzIsNyArMTAyMCwxOCBAQAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKICNpZiggY29uZmlnVVNFX1RJTUVSUyA9PSAxICkKLQljb25zdCBjaGFyICogTVBVX3BjVGltZXJHZXROYW1lKCBUaW1lckhhbmRsZV90IHhUaW1lciApCisJdm9pZCBNUFVfdlRpbWVyU2V0UmVsb2FkTW9kZSggVGltZXJIYW5kbGVfdCB4VGltZXIsIGNvbnN0IFVCYXNlVHlwZV90IHV4QXV0b1JlbG9hZCApIC8qIEZSRUVSVE9TX1NZU1RFTV9DQUxMICovCisJeworCUJhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkID0geFBvcnRSYWlzZVByaXZpbGVnZSgpOworCisJCXZUaW1lclNldFJlbG9hZE1vZGUoIHhUaW1lciwgdXhBdXRvUmVsb2FkICk7CisJCXZQb3J0UmVzZXRQcml2aWxlZ2UoIHhSdW5uaW5nUHJpdmlsZWdlZCApOworCX0KKyNlbmRpZgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiggY29uZmlnVVNFX1RJTUVSUyA9PSAxICkKKwljb25zdCBjaGFyICogTVBVX3BjVGltZXJHZXROYW1lKCBUaW1lckhhbmRsZV90IHhUaW1lciApIC8qIEZSRUVSVE9TX1NZU1RFTV9DQUxMICovCiAJewogCWNvbnN0IGNoYXIgKiBwY1JldHVybjsKIAlCYXNlVHlwZV90IHhSdW5uaW5nUHJpdmlsZWdlZCA9IHhQb3J0UmFpc2VQcml2aWxlZ2UoKTsKQEAgLTk4Niw3ICsxMDQ1LDcgQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiAjaWYoIGNvbmZpZ1VTRV9USU1FUlMgPT0gMSApCi0JVGlja1R5cGVfdCBNUFVfeFRpbWVyR2V0UGVyaW9kKCBUaW1lckhhbmRsZV90IHhUaW1lciApCisJVGlja1R5cGVfdCBNUFVfeFRpbWVyR2V0UGVyaW9kKCBUaW1lckhhbmRsZV90IHhUaW1lciApIC8qIEZSRUVSVE9TX1NZU1RFTV9DQUxMICovCiAJewogCVRpY2tUeXBlX3QgeFJldHVybjsKIAlCYXNlVHlwZV90IHhSdW5uaW5nUHJpdmlsZWdlZCA9IHhQb3J0UmFpc2VQcml2aWxlZ2UoKTsKQEAgLTEwMDAsNyArMTA1OSw3IEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogI2lmKCBjb25maWdVU0VfVElNRVJTID09IDEgKQotCVRpY2tUeXBlX3QgTVBVX3hUaW1lckdldEV4cGlyeVRpbWUoIFRpbWVySGFuZGxlX3QgeFRpbWVyICkKKwlUaWNrVHlwZV90IE1QVV94VGltZXJHZXRFeHBpcnlUaW1lKCBUaW1lckhhbmRsZV90IHhUaW1lciApIC8qIEZSRUVSVE9TX1NZU1RFTV9DQUxMICovCiAJewogCVRpY2tUeXBlX3QgeFJldHVybjsKIAlCYXNlVHlwZV90IHhSdW5uaW5nUHJpdmlsZWdlZCA9IHhQb3J0UmFpc2VQcml2aWxlZ2UoKTsKQEAgLTEwMTQsNyArMTA3Myw3IEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogI2lmKCBjb25maWdVU0VfVElNRVJTID09IDEgKQotCUJhc2VUeXBlX3QgTVBVX3hUaW1lckdlbmVyaWNDb21tYW5kKCBUaW1lckhhbmRsZV90IHhUaW1lciwgY29uc3QgQmFzZVR5cGVfdCB4Q29tbWFuZElELCBjb25zdCBUaWNrVHlwZV90IHhPcHRpb25hbFZhbHVlLCBCYXNlVHlwZV90ICogY29uc3QgcHhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbiwgY29uc3QgVGlja1R5cGVfdCB4VGlja3NUb1dhaXQgKQorCUJhc2VUeXBlX3QgTVBVX3hUaW1lckdlbmVyaWNDb21tYW5kKCBUaW1lckhhbmRsZV90IHhUaW1lciwgY29uc3QgQmFzZVR5cGVfdCB4Q29tbWFuZElELCBjb25zdCBUaWNrVHlwZV90IHhPcHRpb25hbFZhbHVlLCBCYXNlVHlwZV90ICogY29uc3QgcHhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbiwgY29uc3QgVGlja1R5cGVfdCB4VGlja3NUb1dhaXQgKSAvKiBGUkVFUlRPU19TWVNURU1fQ0FMTCAqLwogCXsKIAlCYXNlVHlwZV90IHhSZXR1cm47CiAJQmFzZVR5cGVfdCB4UnVubmluZ1ByaXZpbGVnZWQgPSB4UG9ydFJhaXNlUHJpdmlsZWdlKCk7CkBAIC0xMDI4LDcgKzEwODcsNyBAQAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKICNpZiggY29uZmlnU1VQUE9SVF9EWU5BTUlDX0FMTE9DQVRJT04gPT0gMSApCi0JRXZlbnRHcm91cEhhbmRsZV90IE1QVV94RXZlbnRHcm91cENyZWF0ZSggdm9pZCApCisJRXZlbnRHcm91cEhhbmRsZV90IE1QVV94RXZlbnRHcm91cENyZWF0ZSggdm9pZCApIC8qIEZSRUVSVE9TX1NZU1RFTV9DQUxMICovCiAJewogCUV2ZW50R3JvdXBIYW5kbGVfdCB4UmV0dXJuOwogCUJhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkID0geFBvcnRSYWlzZVByaXZpbGVnZSgpOwpAQCAtMTA0Miw3ICsxMTAxLDcgQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiAjaWYoIGNvbmZpZ1NVUFBPUlRfU1RBVElDX0FMTE9DQVRJT04gPT0gMSApCi0JRXZlbnRHcm91cEhhbmRsZV90IE1QVV94RXZlbnRHcm91cENyZWF0ZVN0YXRpYyggU3RhdGljRXZlbnRHcm91cF90ICpweEV2ZW50R3JvdXBCdWZmZXIgKQorCUV2ZW50R3JvdXBIYW5kbGVfdCBNUFVfeEV2ZW50R3JvdXBDcmVhdGVTdGF0aWMoIFN0YXRpY0V2ZW50R3JvdXBfdCAqcHhFdmVudEdyb3VwQnVmZmVyICkgLyogRlJFRVJUT1NfU1lTVEVNX0NBTEwgKi8KIAl7CiAJRXZlbnRHcm91cEhhbmRsZV90IHhSZXR1cm47CiAJQmFzZVR5cGVfdCB4UnVubmluZ1ByaXZpbGVnZWQgPSB4UG9ydFJhaXNlUHJpdmlsZWdlKCk7CkBAIC0xMDU1LDcgKzExMTQsNyBAQAogI2VuZGlmCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotRXZlbnRCaXRzX3QgTVBVX3hFdmVudEdyb3VwV2FpdEJpdHMoIEV2ZW50R3JvdXBIYW5kbGVfdCB4RXZlbnRHcm91cCwgY29uc3QgRXZlbnRCaXRzX3QgdXhCaXRzVG9XYWl0Rm9yLCBjb25zdCBCYXNlVHlwZV90IHhDbGVhck9uRXhpdCwgY29uc3QgQmFzZVR5cGVfdCB4V2FpdEZvckFsbEJpdHMsIFRpY2tUeXBlX3QgeFRpY2tzVG9XYWl0ICkKK0V2ZW50Qml0c190IE1QVV94RXZlbnRHcm91cFdhaXRCaXRzKCBFdmVudEdyb3VwSGFuZGxlX3QgeEV2ZW50R3JvdXAsIGNvbnN0IEV2ZW50Qml0c190IHV4Qml0c1RvV2FpdEZvciwgY29uc3QgQmFzZVR5cGVfdCB4Q2xlYXJPbkV4aXQsIGNvbnN0IEJhc2VUeXBlX3QgeFdhaXRGb3JBbGxCaXRzLCBUaWNrVHlwZV90IHhUaWNrc1RvV2FpdCApIC8qIEZSRUVSVE9TX1NZU1RFTV9DQUxMICovCiB7CiBFdmVudEJpdHNfdCB4UmV0dXJuOwogQmFzZVR5cGVfdCB4UnVubmluZ1ByaXZpbGVnZWQgPSB4UG9ydFJhaXNlUHJpdmlsZWdlKCk7CkBAIC0xMDY3LDcgKzExMjYsNyBAQAogfQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLUV2ZW50Qml0c190IE1QVV94RXZlbnRHcm91cENsZWFyQml0cyggRXZlbnRHcm91cEhhbmRsZV90IHhFdmVudEdyb3VwLCBjb25zdCBFdmVudEJpdHNfdCB1eEJpdHNUb0NsZWFyICkKK0V2ZW50Qml0c190IE1QVV94RXZlbnRHcm91cENsZWFyQml0cyggRXZlbnRHcm91cEhhbmRsZV90IHhFdmVudEdyb3VwLCBjb25zdCBFdmVudEJpdHNfdCB1eEJpdHNUb0NsZWFyICkgLyogRlJFRVJUT1NfU1lTVEVNX0NBTEwgKi8KIHsKIEV2ZW50Qml0c190IHhSZXR1cm47CiBCYXNlVHlwZV90IHhSdW5uaW5nUHJpdmlsZWdlZCA9IHhQb3J0UmFpc2VQcml2aWxlZ2UoKTsKQEAgLTEwNzksNyArMTEzOCw3IEBACiB9CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotRXZlbnRCaXRzX3QgTVBVX3hFdmVudEdyb3VwU2V0Qml0cyggRXZlbnRHcm91cEhhbmRsZV90IHhFdmVudEdyb3VwLCBjb25zdCBFdmVudEJpdHNfdCB1eEJpdHNUb1NldCApCitFdmVudEJpdHNfdCBNUFVfeEV2ZW50R3JvdXBTZXRCaXRzKCBFdmVudEdyb3VwSGFuZGxlX3QgeEV2ZW50R3JvdXAsIGNvbnN0IEV2ZW50Qml0c190IHV4Qml0c1RvU2V0ICkgLyogRlJFRVJUT1NfU1lTVEVNX0NBTEwgKi8KIHsKIEV2ZW50Qml0c190IHhSZXR1cm47CiBCYXNlVHlwZV90IHhSdW5uaW5nUHJpdmlsZWdlZCA9IHhQb3J0UmFpc2VQcml2aWxlZ2UoKTsKQEAgLTEwOTEsNyArMTE1MCw3IEBACiB9CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotRXZlbnRCaXRzX3QgTVBVX3hFdmVudEdyb3VwU3luYyggRXZlbnRHcm91cEhhbmRsZV90IHhFdmVudEdyb3VwLCBjb25zdCBFdmVudEJpdHNfdCB1eEJpdHNUb1NldCwgY29uc3QgRXZlbnRCaXRzX3QgdXhCaXRzVG9XYWl0Rm9yLCBUaWNrVHlwZV90IHhUaWNrc1RvV2FpdCApCitFdmVudEJpdHNfdCBNUFVfeEV2ZW50R3JvdXBTeW5jKCBFdmVudEdyb3VwSGFuZGxlX3QgeEV2ZW50R3JvdXAsIGNvbnN0IEV2ZW50Qml0c190IHV4Qml0c1RvU2V0LCBjb25zdCBFdmVudEJpdHNfdCB1eEJpdHNUb1dhaXRGb3IsIFRpY2tUeXBlX3QgeFRpY2tzVG9XYWl0ICkgLyogRlJFRVJUT1NfU1lTVEVNX0NBTEwgKi8KIHsKIEV2ZW50Qml0c190IHhSZXR1cm47CiBCYXNlVHlwZV90IHhSdW5uaW5nUHJpdmlsZWdlZCA9IHhQb3J0UmFpc2VQcml2aWxlZ2UoKTsKQEAgLTExMDMsNyArMTE2Miw3IEBACiB9CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotdm9pZCBNUFVfdkV2ZW50R3JvdXBEZWxldGUoIEV2ZW50R3JvdXBIYW5kbGVfdCB4RXZlbnRHcm91cCApCit2b2lkIE1QVV92RXZlbnRHcm91cERlbGV0ZSggRXZlbnRHcm91cEhhbmRsZV90IHhFdmVudEdyb3VwICkgLyogRlJFRVJUT1NfU1lTVEVNX0NBTEwgKi8KIHsKIEJhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkID0geFBvcnRSYWlzZVByaXZpbGVnZSgpOwogCkBAIC0xMTEyLDcgKzExNzEsNyBAQAogfQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLXNpemVfdCBNUFVfeFN0cmVhbUJ1ZmZlclNlbmQoIFN0cmVhbUJ1ZmZlckhhbmRsZV90IHhTdHJlYW1CdWZmZXIsIGNvbnN0IHZvaWQgKnB2VHhEYXRhLCBzaXplX3QgeERhdGFMZW5ndGhCeXRlcywgVGlja1R5cGVfdCB4VGlja3NUb1dhaXQgKQorc2l6ZV90IE1QVV94U3RyZWFtQnVmZmVyU2VuZCggU3RyZWFtQnVmZmVySGFuZGxlX3QgeFN0cmVhbUJ1ZmZlciwgY29uc3Qgdm9pZCAqcHZUeERhdGEsIHNpemVfdCB4RGF0YUxlbmd0aEJ5dGVzLCBUaWNrVHlwZV90IHhUaWNrc1RvV2FpdCApIC8qIEZSRUVSVE9TX1NZU1RFTV9DQUxMICovCiB7CiBzaXplX3QgeFJldHVybjsKIEJhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkID0geFBvcnRSYWlzZVByaXZpbGVnZSgpOwpAQCAtMTEyNCwxOSArMTE4MywxOSBAQAogfQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLXNpemVfdCBNUFVfeFN0cmVhbUJ1ZmZlclNlbmRGcm9tSVNSKCBTdHJlYW1CdWZmZXJIYW5kbGVfdCB4U3RyZWFtQnVmZmVyLCBjb25zdCB2b2lkICpwdlR4RGF0YSwgc2l6ZV90IHhEYXRhTGVuZ3RoQnl0ZXMsIEJhc2VUeXBlX3QgKiBjb25zdCBweEhpZ2hlclByaW9yaXR5VGFza1dva2VuICkKK3NpemVfdCBNUFVfeFN0cmVhbUJ1ZmZlck5leHRNZXNzYWdlTGVuZ3RoQnl0ZXMoIFN0cmVhbUJ1ZmZlckhhbmRsZV90IHhTdHJlYW1CdWZmZXIgKSAvKiBGUkVFUlRPU19TWVNURU1fQ0FMTCAqLwogewogc2l6ZV90IHhSZXR1cm47CiBCYXNlVHlwZV90IHhSdW5uaW5nUHJpdmlsZWdlZCA9IHhQb3J0UmFpc2VQcml2aWxlZ2UoKTsKIAotCXhSZXR1cm4gPSB4U3RyZWFtQnVmZmVyU2VuZEZyb21JU1IoIHhTdHJlYW1CdWZmZXIsIHB2VHhEYXRhLCB4RGF0YUxlbmd0aEJ5dGVzLCBweEhpZ2hlclByaW9yaXR5VGFza1dva2VuICk7CisJeFJldHVybiA9IHhTdHJlYW1CdWZmZXJOZXh0TWVzc2FnZUxlbmd0aEJ5dGVzKCB4U3RyZWFtQnVmZmVyICk7CiAJdlBvcnRSZXNldFByaXZpbGVnZSggeFJ1bm5pbmdQcml2aWxlZ2VkICk7CiAKIAlyZXR1cm4geFJldHVybjsKIH0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi1zaXplX3QgTVBVX3hTdHJlYW1CdWZmZXJSZWNlaXZlKCBTdHJlYW1CdWZmZXJIYW5kbGVfdCB4U3RyZWFtQnVmZmVyLCB2b2lkICpwdlJ4RGF0YSwgc2l6ZV90IHhCdWZmZXJMZW5ndGhCeXRlcywgVGlja1R5cGVfdCB4VGlja3NUb1dhaXQgKQorc2l6ZV90IE1QVV94U3RyZWFtQnVmZmVyUmVjZWl2ZSggU3RyZWFtQnVmZmVySGFuZGxlX3QgeFN0cmVhbUJ1ZmZlciwgdm9pZCAqcHZSeERhdGEsIHNpemVfdCB4QnVmZmVyTGVuZ3RoQnl0ZXMsIFRpY2tUeXBlX3QgeFRpY2tzVG9XYWl0ICkgLyogRlJFRVJUT1NfU1lTVEVNX0NBTEwgKi8KIHsKIHNpemVfdCB4UmV0dXJuOwogQmFzZVR5cGVfdCB4UnVubmluZ1ByaXZpbGVnZWQgPSB4UG9ydFJhaXNlUHJpdmlsZWdlKCk7CkBAIC0xMTQ4LDE5ICsxMjA3LDcgQEAKIH0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi1zaXplX3QgTVBVX3hTdHJlYW1CdWZmZXJSZWNlaXZlRnJvbUlTUiggU3RyZWFtQnVmZmVySGFuZGxlX3QgeFN0cmVhbUJ1ZmZlciwgdm9pZCAqcHZSeERhdGEsIHNpemVfdCB4QnVmZmVyTGVuZ3RoQnl0ZXMsIEJhc2VUeXBlX3QgKiBjb25zdCBweEhpZ2hlclByaW9yaXR5VGFza1dva2VuICkKLXsKLXNpemVfdCB4UmV0dXJuOwotQmFzZVR5cGVfdCB4UnVubmluZ1ByaXZpbGVnZWQgPSB4UG9ydFJhaXNlUHJpdmlsZWdlKCk7Ci0KLQl4UmV0dXJuID0geFN0cmVhbUJ1ZmZlclJlY2VpdmVGcm9tSVNSKCB4U3RyZWFtQnVmZmVyLCBwdlJ4RGF0YSwgeEJ1ZmZlckxlbmd0aEJ5dGVzLCBweEhpZ2hlclByaW9yaXR5VGFza1dva2VuICk7Ci0JdlBvcnRSZXNldFByaXZpbGVnZSggeFJ1bm5pbmdQcml2aWxlZ2VkICk7Ci0KLQlyZXR1cm4geFJldHVybjsKLX0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi12b2lkIE1QVV92U3RyZWFtQnVmZmVyRGVsZXRlKCBTdHJlYW1CdWZmZXJIYW5kbGVfdCB4U3RyZWFtQnVmZmVyICkKK3ZvaWQgTVBVX3ZTdHJlYW1CdWZmZXJEZWxldGUoIFN0cmVhbUJ1ZmZlckhhbmRsZV90IHhTdHJlYW1CdWZmZXIgKSAvKiBGUkVFUlRPU19TWVNURU1fQ0FMTCAqLwogewogQmFzZVR5cGVfdCB4UnVubmluZ1ByaXZpbGVnZWQgPSB4UG9ydFJhaXNlUHJpdmlsZWdlKCk7CiAKQEAgLTExNjksNyArMTIxNiw3IEBACiB9CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotQmFzZVR5cGVfdCBNUFVfeFN0cmVhbUJ1ZmZlcklzRnVsbCggU3RyZWFtQnVmZmVySGFuZGxlX3QgeFN0cmVhbUJ1ZmZlciApCitCYXNlVHlwZV90IE1QVV94U3RyZWFtQnVmZmVySXNGdWxsKCBTdHJlYW1CdWZmZXJIYW5kbGVfdCB4U3RyZWFtQnVmZmVyICkgLyogRlJFRVJUT1NfU1lTVEVNX0NBTEwgKi8KIHsKIEJhc2VUeXBlX3QgeFJldHVybjsKIEJhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkID0geFBvcnRSYWlzZVByaXZpbGVnZSgpOwpAQCAtMTE4MSw3ICsxMjI4LDcgQEAKIH0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi1CYXNlVHlwZV90IE1QVV94U3RyZWFtQnVmZmVySXNFbXB0eSggU3RyZWFtQnVmZmVySGFuZGxlX3QgeFN0cmVhbUJ1ZmZlciApCitCYXNlVHlwZV90IE1QVV94U3RyZWFtQnVmZmVySXNFbXB0eSggU3RyZWFtQnVmZmVySGFuZGxlX3QgeFN0cmVhbUJ1ZmZlciApIC8qIEZSRUVSVE9TX1NZU1RFTV9DQUxMICovCiB7CiBCYXNlVHlwZV90IHhSZXR1cm47CiBCYXNlVHlwZV90IHhSdW5uaW5nUHJpdmlsZWdlZCA9IHhQb3J0UmFpc2VQcml2aWxlZ2UoKTsKQEAgLTExOTMsNyArMTI0MCw3IEBACiB9CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotQmFzZVR5cGVfdCBNUFVfeFN0cmVhbUJ1ZmZlclJlc2V0KCBTdHJlYW1CdWZmZXJIYW5kbGVfdCB4U3RyZWFtQnVmZmVyICkKK0Jhc2VUeXBlX3QgTVBVX3hTdHJlYW1CdWZmZXJSZXNldCggU3RyZWFtQnVmZmVySGFuZGxlX3QgeFN0cmVhbUJ1ZmZlciApIC8qIEZSRUVSVE9TX1NZU1RFTV9DQUxMICovCiB7CiBCYXNlVHlwZV90IHhSZXR1cm47CiBCYXNlVHlwZV90IHhSdW5uaW5nUHJpdmlsZWdlZCA9IHhQb3J0UmFpc2VQcml2aWxlZ2UoKTsKQEAgLTEyMDUsNyArMTI1Miw3IEBACiB9CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotc2l6ZV90IE1QVV94U3RyZWFtQnVmZmVyU3BhY2VzQXZhaWxhYmxlKCBTdHJlYW1CdWZmZXJIYW5kbGVfdCB4U3RyZWFtQnVmZmVyICkKK3NpemVfdCBNUFVfeFN0cmVhbUJ1ZmZlclNwYWNlc0F2YWlsYWJsZSggU3RyZWFtQnVmZmVySGFuZGxlX3QgeFN0cmVhbUJ1ZmZlciApIC8qIEZSRUVSVE9TX1NZU1RFTV9DQUxMICovCiB7CiBzaXplX3QgeFJldHVybjsKIEJhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkID0geFBvcnRSYWlzZVByaXZpbGVnZSgpOwpAQCAtMTIxNyw3ICsxMjY0LDcgQEAKIH0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi1zaXplX3QgTVBVX3hTdHJlYW1CdWZmZXJCeXRlc0F2YWlsYWJsZSggU3RyZWFtQnVmZmVySGFuZGxlX3QgeFN0cmVhbUJ1ZmZlciApCitzaXplX3QgTVBVX3hTdHJlYW1CdWZmZXJCeXRlc0F2YWlsYWJsZSggU3RyZWFtQnVmZmVySGFuZGxlX3QgeFN0cmVhbUJ1ZmZlciApIC8qIEZSRUVSVE9TX1NZU1RFTV9DQUxMICovCiB7CiBzaXplX3QgeFJldHVybjsKIEJhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkID0geFBvcnRSYWlzZVByaXZpbGVnZSgpOwpAQCAtMTIyOSw3ICsxMjc2LDcgQEAKIH0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi1CYXNlVHlwZV90IE1QVV94U3RyZWFtQnVmZmVyU2V0VHJpZ2dlckxldmVsKCBTdHJlYW1CdWZmZXJIYW5kbGVfdCB4U3RyZWFtQnVmZmVyLCBzaXplX3QgeFRyaWdnZXJMZXZlbCApCitCYXNlVHlwZV90IE1QVV94U3RyZWFtQnVmZmVyU2V0VHJpZ2dlckxldmVsKCBTdHJlYW1CdWZmZXJIYW5kbGVfdCB4U3RyZWFtQnVmZmVyLCBzaXplX3QgeFRyaWdnZXJMZXZlbCApIC8qIEZSRUVSVE9TX1NZU1RFTV9DQUxMICovCiB7CiBCYXNlVHlwZV90IHhSZXR1cm47CiBCYXNlVHlwZV90IHhSdW5uaW5nUHJpdmlsZWdlZCA9IHhQb3J0UmFpc2VQcml2aWxlZ2UoKTsKQEAgLTEyNDIsNyArMTI4OSw3IEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogI2lmKCBjb25maWdTVVBQT1JUX0RZTkFNSUNfQUxMT0NBVElPTiA9PSAxICkKLQlTdHJlYW1CdWZmZXJIYW5kbGVfdCBNUFVfeFN0cmVhbUJ1ZmZlckdlbmVyaWNDcmVhdGUoIHNpemVfdCB4QnVmZmVyU2l6ZUJ5dGVzLCBzaXplX3QgeFRyaWdnZXJMZXZlbEJ5dGVzLCBCYXNlVHlwZV90IHhJc01lc3NhZ2VCdWZmZXIgKQorCVN0cmVhbUJ1ZmZlckhhbmRsZV90IE1QVV94U3RyZWFtQnVmZmVyR2VuZXJpY0NyZWF0ZSggc2l6ZV90IHhCdWZmZXJTaXplQnl0ZXMsIHNpemVfdCB4VHJpZ2dlckxldmVsQnl0ZXMsIEJhc2VUeXBlX3QgeElzTWVzc2FnZUJ1ZmZlciApIC8qIEZSRUVSVE9TX1NZU1RFTV9DQUxMICovCiAJewogCVN0cmVhbUJ1ZmZlckhhbmRsZV90IHhSZXR1cm47CiAJQmFzZVR5cGVfdCB4UnVubmluZ1ByaXZpbGVnZWQgPSB4UG9ydFJhaXNlUHJpdmlsZWdlKCk7CkBAIC0xMjU2LDcgKzEzMDMsNyBAQAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKICNpZiggY29uZmlnU1VQUE9SVF9TVEFUSUNfQUxMT0NBVElPTiA9PSAxICkKLQlTdHJlYW1CdWZmZXJIYW5kbGVfdCBNUFVfeFN0cmVhbUJ1ZmZlckdlbmVyaWNDcmVhdGVTdGF0aWMoIHNpemVfdCB4QnVmZmVyU2l6ZUJ5dGVzLCBzaXplX3QgeFRyaWdnZXJMZXZlbEJ5dGVzLCBCYXNlVHlwZV90IHhJc01lc3NhZ2VCdWZmZXIsIHVpbnQ4X3QgKiBjb25zdCBwdWNTdHJlYW1CdWZmZXJTdG9yYWdlQXJlYSwgU3RhdGljU3RyZWFtQnVmZmVyX3QgKiBjb25zdCBweFN0YXRpY1N0cmVhbUJ1ZmZlciApCisJU3RyZWFtQnVmZmVySGFuZGxlX3QgTVBVX3hTdHJlYW1CdWZmZXJHZW5lcmljQ3JlYXRlU3RhdGljKCBzaXplX3QgeEJ1ZmZlclNpemVCeXRlcywgc2l6ZV90IHhUcmlnZ2VyTGV2ZWxCeXRlcywgQmFzZVR5cGVfdCB4SXNNZXNzYWdlQnVmZmVyLCB1aW50OF90ICogY29uc3QgcHVjU3RyZWFtQnVmZmVyU3RvcmFnZUFyZWEsIFN0YXRpY1N0cmVhbUJ1ZmZlcl90ICogY29uc3QgcHhTdGF0aWNTdHJlYW1CdWZmZXIgKSAvKiBGUkVFUlRPU19TWVNURU1fQ0FMTCAqLwogCXsKIAlTdHJlYW1CdWZmZXJIYW5kbGVfdCB4UmV0dXJuOwogCUJhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkID0geFBvcnRSYWlzZVByaXZpbGVnZSgpOwpkaWZmIC0tZ2l0IGEvU291cmNlL3BvcnRhYmxlL0dDQy9BUk1fQ00wL3BvcnQuYyBiL1NvdXJjZS9wb3J0YWJsZS9HQ0MvQVJNX0NNMC9wb3J0LmMKaW5kZXggZGMyYzVjNi4uYTVmYjRjYyAxMDA2NDQKLS0tIGEvU291cmNlL3BvcnRhYmxlL0dDQy9BUk1fQ00wL3BvcnQuYworKysgYi9Tb3VyY2UvcG9ydGFibGUvR0NDL0FSTV9DTTAvcG9ydC5jCkBAIC0xLDYgKzEsNiBAQAogLyoKLSAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMC4xCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjIuMQorICogQ29weXJpZ2h0IChDKSAyMDE5IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKICAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKICAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCkBAIC0yMTMsNyArMjEzLDcgQEAKICAqLwogQmFzZVR5cGVfdCB4UG9ydFN0YXJ0U2NoZWR1bGVyKCB2b2lkICkKIHsKLQkvKiBNYWtlIFBlbmRTViwgQ2FsbFNWIGFuZCBTeXNUaWNrIHRoZSBzYW1lIHByaXJvaXR5IGFzIHRoZSBrZXJuZWwuICovCisJLyogTWFrZSBQZW5kU1YsIENhbGxTViBhbmQgU3lzVGljayB0aGUgc2FtZSBwcmlvcml0eSBhcyB0aGUga2VybmVsLiAqLwogCSoocG9ydE5WSUNfU1lTUFJJMikgfD0gcG9ydE5WSUNfUEVORFNWX1BSSTsKIAkqKHBvcnROVklDX1NZU1BSSTIpIHw9IHBvcnROVklDX1NZU1RJQ0tfUFJJOwogCmRpZmYgLS1naXQgYS9Tb3VyY2UvcG9ydGFibGUvR0NDL0FSTV9DTTAvcG9ydG1hY3JvLmggYi9Tb3VyY2UvcG9ydGFibGUvR0NDL0FSTV9DTTAvcG9ydG1hY3JvLmgKaW5kZXggMmNhNGNiOS4uZTFhYTQ1MCAxMDA2NDQKLS0tIGEvU291cmNlL3BvcnRhYmxlL0dDQy9BUk1fQ00wL3BvcnRtYWNyby5oCisrKyBiL1NvdXJjZS9wb3J0YWJsZS9HQ0MvQVJNX0NNMC9wb3J0bWFjcm8uaApAQCAtMSw2ICsxLDYgQEAKIC8qCi0gKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjAuMQotICogQ29weXJpZ2h0IChDKSAyMDE3IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRnJlZVJUT1MgS2VybmVsIFYxMC4yLjEKKyAqIENvcHlyaWdodCAoQykgMjAxOSBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCiAgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCiAgKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgpAQCAtMTE1LDYgKzExNSw4IEBACiAKICNkZWZpbmUgcG9ydE5PUCgpCiAKKyNkZWZpbmUgcG9ydE1FTU9SWV9CQVJSSUVSKCkgX19hc20gdm9sYXRpbGUoICIiIDo6OiAibWVtb3J5IiApCisKICNpZmRlZiBfX2NwbHVzcGx1cwogfQogI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvcG9ydGFibGUvR0NDL0FSTV9DTTIzL25vbl9zZWN1cmUvcG9ydC5jIGIvU291cmNlL3BvcnRhYmxlL0dDQy9BUk1fQ00yMy9ub25fc2VjdXJlL3BvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDg1YTZmCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL3BvcnRhYmxlL0dDQy9BUk1fQ00yMy9ub25fc2VjdXJlL3BvcnQuYwpAQCAtMCwwICsxLDg5OSBAQAorLyoKKyAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMi4xCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgorICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KKyAqIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KKyAqIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mCisgKiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCisgKiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKKyAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTCisgKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IKKyAqIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUgorICogSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogaHR0cDovL3d3dy5GcmVlUlRPUy5vcmcKKyAqIGh0dHA6Ly9hd3MuYW1hem9uLmNvbS9mcmVlcnRvcworICoKKyAqIDEgdGFiID09IDQgc3BhY2VzIQorICovCisKKy8qIERlZmluaW5nIE1QVV9XUkFQUEVSU19JTkNMVURFRF9GUk9NX0FQSV9GSUxFIHByZXZlbnRzIHRhc2suaCBmcm9tIHJlZGVmaW5pbmcKKyAqIGFsbCB0aGUgQVBJIGZ1bmN0aW9ucyB0byB1c2UgdGhlIE1QVSB3cmFwcGVycy4gVGhhdCBzaG91bGQgb25seSBiZSBkb25lIHdoZW4KKyAqIHRhc2suaCBpcyBpbmNsdWRlZCBmcm9tIGFuIGFwcGxpY2F0aW9uIGZpbGUuICovCisjZGVmaW5lIE1QVV9XUkFQUEVSU19JTkNMVURFRF9GUk9NX0FQSV9GSUxFCisKKy8qIFNjaGVkdWxlciBpbmNsdWRlcy4gKi8KKyNpbmNsdWRlICJGcmVlUlRPUy5oIgorI2luY2x1ZGUgInRhc2suaCIKKworLyogTVBVIHdyYXBwZXJzIGluY2x1ZGVzLiAqLworI2luY2x1ZGUgIm1wdV93cmFwcGVycy5oIgorCisvKiBQb3J0YXNtIGluY2x1ZGVzLiAqLworI2luY2x1ZGUgInBvcnRhc20uaCIKKworI2lmKCBjb25maWdFTkFCTEVfVFJVU1RaT05FID09IDEgKQorCS8qIFNlY3VyZSBjb21wb25lbnRzIGluY2x1ZGVzLiAqLworCSNpbmNsdWRlICJzZWN1cmVfY29udGV4dC5oIgorCSNpbmNsdWRlICJzZWN1cmVfaW5pdC5oIgorI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9UUlVTVFpPTkUgKi8KKworI3VuZGVmIE1QVV9XUkFQUEVSU19JTkNMVURFRF9GUk9NX0FQSV9GSUxFCisKKy8qKgorICogVGhlIEZyZWVSVE9TIENvcnRleCBNMzMgcG9ydCBjYW4gYmUgY29uZmlndXJlZCB0byBydW4gb24gdGhlIFNlY3VyZSBTaWRlIG9ubHkKKyAqIGkuZS4gdGhlIHByb2Nlc3NvciBib290cyBhcyBzZWN1cmUgYW5kIG5ldmVyIGp1bXBzIHRvIHRoZSBub24tc2VjdXJlIHNpZGUuCisgKiBUaGUgVHJ1c3QgWm9uZSBzdXBwb3J0IGluIHRoZSBwb3J0IG11c3QgYmUgZGlzYWJsZWQgaW4gb3JkZXIgdG8gcnVuIEZyZWVSVE9TCisgKiBvbiB0aGUgc2VjdXJlIHNpZGUuIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSB2YWxpZCBjb25maWd1cmF0aW9uIHNlZXRpbmdzOgorICoKKyAqIDEuIFJ1biBGcmVlUlRPUyBvbiB0aGUgU2VjdXJlIFNpZGU6CisgKgkJY29uZmlnUlVOX0ZSRUVSVE9TX1NFQ1VSRV9PTkxZID0gMSBhbmQgY29uZmlnRU5BQkxFX1RSVVNUWk9ORSA9IDAKKyAqCisgKiAyLiBSdW4gRnJlZVJUT1Mgb24gdGhlIE5vbi1TZWN1cmUgU2lkZSB3aXRoIFNlY3VyZSBTaWRlIGZ1bmN0aW9uIGNhbGwgc3VwcG9ydDoKKyAqCQljb25maWdSVU5fRlJFRVJUT1NfU0VDVVJFX09OTFkgPSAwIGFuZCBjb25maWdFTkFCTEVfVFJVU1RaT05FID0gMQorICoKKyAqIDMuIFJ1biBGcmVlUlRPUyBvbiB0aGUgTm9uLVNlY3VyZSBTaWRlIG9ubHkgaS5lLiBubyBTZWN1cmUgU2lkZSBmdW5jdGlvbiBjYWxsIHN1cHBvcnQ6CisgKgkJY29uZmlnUlVOX0ZSRUVSVE9TX1NFQ1VSRV9PTkxZID0gMCBhbmQgY29uZmlnRU5BQkxFX1RSVVNUWk9ORSA9IDAKKyAqLworI2lmKCAoIGNvbmZpZ1JVTl9GUkVFUlRPU19TRUNVUkVfT05MWSA9PSAxICkgJiYgKCBjb25maWdFTkFCTEVfVFJVU1RaT05FID09IDEgKSApCisJI2Vycm9yIFRydXN0Wm9uZSBuZWVkcyB0byBiZSBkaXNhYmxlZCBpbiBvcmRlciB0byBydW4gRnJlZVJUT1Mgb24gdGhlIFNlY3VyZSBTaWRlLgorI2VuZGlmCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqCisgKiBAYnJpZWYgQ29uc3RhbnRzIHJlcXVpcmVkIHRvIG1hbmlwdWxhdGUgdGhlIE5WSUMuCisgKi8KKyNkZWZpbmUgcG9ydE5WSUNfU1lTVElDS19DVFJMCQkJCSggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZTAxMCApCisjZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfTE9BRAkJCQkoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGUwMTQgKQorI2RlZmluZSBwb3J0TlZJQ19TWVNUSUNLX0NVUlJFTlRfVkFMVUUJCSggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZTAxOCApCisjZGVmaW5lIHBvcnROVklDX0lOVF9DVFJMCQkJCQkoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVkMDQgKQorI2RlZmluZSBwb3J0TlZJQ19TWVNQUkkyCQkJCQkoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVkMjAgKQorI2RlZmluZSBwb3J0TlZJQ19TWVNUSUNLX0NMSwkJCQkoIDB4MDAwMDAwMDQgKQorI2RlZmluZSBwb3J0TlZJQ19TWVNUSUNLX0lOVAkJCQkoIDB4MDAwMDAwMDIgKQorI2RlZmluZSBwb3J0TlZJQ19TWVNUSUNLX0VOQUJMRQkJCQkoIDB4MDAwMDAwMDEgKQorI2RlZmluZSBwb3J0TlZJQ19QRU5EU1ZTRVQJCQkJCSggMHgxMDAwMDAwMCApCisjZGVmaW5lIHBvcnRNSU5fSU5URVJSVVBUX1BSSU9SSVRZCQkJKCAyNTVVTCApCisjZGVmaW5lIHBvcnROVklDX1BFTkRTVl9QUkkJCQkJCSggcG9ydE1JTl9JTlRFUlJVUFRfUFJJT1JJVFkgPDwgMTZVTCApCisjZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfUFJJCQkJCSggcG9ydE1JTl9JTlRFUlJVUFRfUFJJT1JJVFkgPDwgMjRVTCApCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqCisgKiBAYnJpZWYgQ29uc3RhbnRzIHJlcXVpcmVkIHRvIG1hbmlwdWxhdGUgdGhlIFNDQi4KKyAqLworI2RlZmluZSBwb3J0U0NCX1NZU19IQU5ETEVSX0NUUkxfU1RBVEVfUkVHCSggKiAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZDI0ICkKKyNkZWZpbmUgcG9ydFNDQl9NRU1fRkFVTFRfRU5BQkxFCQkJKCAxVUwgPDwgMTZVTCApCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqCisgKiBAYnJpZWYgQ29uc3RhbnRzIHJlcXVpcmVkIHRvIG1hbmlwdWxhdGUgdGhlIEZQVS4KKyAqLworI2RlZmluZSBwb3J0Q1BBQ1IJCQkJCQkJKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZDg4ICkJLyogQ29wcm9jZXNzb3IgQWNjZXNzIENvbnRyb2wgUmVnaXN0ZXIuICovCisjZGVmaW5lIHBvcnRDUEFDUl9DUDEwX1ZBTFVFCQkJCSggM1VMICkKKyNkZWZpbmUgcG9ydENQQUNSX0NQMTFfVkFMVUUJCQkJcG9ydENQQUNSX0NQMTBfVkFMVUUKKyNkZWZpbmUgcG9ydENQQUNSX0NQMTBfUE9TCQkJCQkoIDIwVUwgKQorI2RlZmluZSBwb3J0Q1BBQ1JfQ1AxMV9QT1MJCQkJCSggMjJVTCApCisKKyNkZWZpbmUgcG9ydEZQQ0NSCQkJCQkJCSggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZWYzNCApCS8qIEZsb2F0aW5nIFBvaW50IENvbnRleHQgQ29udHJvbCBSZWdpc3Rlci4gKi8KKyNkZWZpbmUgcG9ydEZQQ0NSX0FTUEVOX1BPUwkJCQkJKCAzMVVMICkKKyNkZWZpbmUgcG9ydEZQQ0NSX0FTUEVOX01BU0sJCQkJKCAxVUwgPDwgcG9ydEZQQ0NSX0FTUEVOX1BPUyApCisjZGVmaW5lIHBvcnRGUENDUl9MU1BFTl9QT1MJCQkJCSggMzBVTCApCisjZGVmaW5lIHBvcnRGUENDUl9MU1BFTl9NQVNLCQkJCSggMVVMIDw8IHBvcnRGUENDUl9MU1BFTl9QT1MgKQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKgorICogQGJyaWVmIENvbnN0YW50cyByZXF1aXJlZCB0byBtYW5pcHVsYXRlIHRoZSBNUFUuCisgKi8KKyNkZWZpbmUgcG9ydE1QVV9UWVBFX1JFRwkJCQkJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZWQ5MCApICkKKyNkZWZpbmUgcG9ydE1QVV9DVFJMX1JFRwkJCQkJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZWQ5NCApICkKKyNkZWZpbmUgcG9ydE1QVV9STlJfUkVHCQkJCQkJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZWQ5OCApICkKKworI2RlZmluZSBwb3J0TVBVX1JCQVJfUkVHCQkJCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZDljICkgKQorI2RlZmluZSBwb3J0TVBVX1JMQVJfUkVHCQkJCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZGEwICkgKQorCisjZGVmaW5lIHBvcnRNUFVfUkJBUl9BMV9SRUcJCQkJCSggKiAoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVkYTQgKSApCisjZGVmaW5lIHBvcnRNUFVfUkxBUl9BMV9SRUcJCQkJCSggKiAoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVkYTggKSApCisKKyNkZWZpbmUgcG9ydE1QVV9SQkFSX0EyX1JFRwkJCQkJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZWRhYyApICkKKyNkZWZpbmUgcG9ydE1QVV9STEFSX0EyX1JFRwkJCQkJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZWRiMCApICkKKworI2RlZmluZSBwb3J0TVBVX1JCQVJfQTNfUkVHCQkJCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZGI0ICkgKQorI2RlZmluZSBwb3J0TVBVX1JMQVJfQTNfUkVHCQkJCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZGI4ICkgKQorCisjZGVmaW5lIHBvcnRNUFVfTUFJUjBfUkVHCQkJCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZGMwICkgKQorI2RlZmluZSBwb3J0TVBVX01BSVIxX1JFRwkJCQkJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZWRjNCApICkKKworI2RlZmluZSBwb3J0TVBVX1JCQVJfQUREUkVTU19NQVNLCQkJKCAweGZmZmZmZmUwICkgLyogTXVzdCBiZSAzMi1ieXRlIGFsaWduZWQuICovCisjZGVmaW5lIHBvcnRNUFVfUkxBUl9BRERSRVNTX01BU0sJCQkoIDB4ZmZmZmZmZTAgKSAvKiBNdXN0IGJlIDMyLWJ5dGUgYWxpZ25lZC4gKi8KKworI2RlZmluZSBwb3J0TVBVX01BSVJfQVRUUjBfUE9TCQkJCSggMFVMICkKKyNkZWZpbmUgcG9ydE1QVV9NQUlSX0FUVFIwX01BU0sJCQkJKCAweDAwMDAwMGZmICkKKworI2RlZmluZSBwb3J0TVBVX01BSVJfQVRUUjFfUE9TCQkJCSggOFVMICkKKyNkZWZpbmUgcG9ydE1QVV9NQUlSX0FUVFIxX01BU0sJCQkJKCAweDAwMDBmZjAwICkKKworI2RlZmluZSBwb3J0TVBVX01BSVJfQVRUUjJfUE9TCQkJCSggMTZVTCApCisjZGVmaW5lIHBvcnRNUFVfTUFJUl9BVFRSMl9NQVNLCQkJCSggMHgwMGZmMDAwMCApCisKKyNkZWZpbmUgcG9ydE1QVV9NQUlSX0FUVFIzX1BPUwkJCQkoIDI0VUwgKQorI2RlZmluZSBwb3J0TVBVX01BSVJfQVRUUjNfTUFTSwkJCQkoIDB4ZmYwMDAwMDAgKQorCisjZGVmaW5lIHBvcnRNUFVfTUFJUl9BVFRSNF9QT1MJCQkJKCAwVUwgKQorI2RlZmluZSBwb3J0TVBVX01BSVJfQVRUUjRfTUFTSwkJCQkoIDB4MDAwMDAwZmYgKQorCisjZGVmaW5lIHBvcnRNUFVfTUFJUl9BVFRSNV9QT1MJCQkJKCA4VUwgKQorI2RlZmluZSBwb3J0TVBVX01BSVJfQVRUUjVfTUFTSwkJCQkoIDB4MDAwMGZmMDAgKQorCisjZGVmaW5lIHBvcnRNUFVfTUFJUl9BVFRSNl9QT1MJCQkJKCAxNlVMICkKKyNkZWZpbmUgcG9ydE1QVV9NQUlSX0FUVFI2X01BU0sJCQkJKCAweDAwZmYwMDAwICkKKworI2RlZmluZSBwb3J0TVBVX01BSVJfQVRUUjdfUE9TCQkJCSggMjRVTCApCisjZGVmaW5lIHBvcnRNUFVfTUFJUl9BVFRSN19NQVNLCQkJCSggMHhmZjAwMDAwMCApCisKKyNkZWZpbmUgcG9ydE1QVV9STEFSX0FUVFJfSU5ERVgwCQkJKCAwVUwgPDwgMVVMICkKKyNkZWZpbmUgcG9ydE1QVV9STEFSX0FUVFJfSU5ERVgxCQkJKCAxVUwgPDwgMVVMICkKKyNkZWZpbmUgcG9ydE1QVV9STEFSX0FUVFJfSU5ERVgyCQkJKCAyVUwgPDwgMVVMICkKKyNkZWZpbmUgcG9ydE1QVV9STEFSX0FUVFJfSU5ERVgzCQkJKCAzVUwgPDwgMVVMICkKKyNkZWZpbmUgcG9ydE1QVV9STEFSX0FUVFJfSU5ERVg0CQkJKCA0VUwgPDwgMVVMICkKKyNkZWZpbmUgcG9ydE1QVV9STEFSX0FUVFJfSU5ERVg1CQkJKCA1VUwgPDwgMVVMICkKKyNkZWZpbmUgcG9ydE1QVV9STEFSX0FUVFJfSU5ERVg2CQkJKCA2VUwgPDwgMVVMICkKKyNkZWZpbmUgcG9ydE1QVV9STEFSX0FUVFJfSU5ERVg3CQkJKCA3VUwgPDwgMVVMICkKKworI2RlZmluZSBwb3J0TVBVX1JMQVJfUkVHSU9OX0VOQUJMRQkJCSggMVVMICkKKworLyogRW5hYmxlIHByaXZpbGVnZWQgYWNjZXNzIHRvIHVubWFwcGVkIHJlZ2lvbi4gKi8KKyNkZWZpbmUgcG9ydE1QVV9QUklWX0JBQ0tHUk9VTkRfRU5BQkxFCQkoIDFVTCA8PCAyVUwgKQorCisvKiBFbmFibGUgTVBVLiAqLworI2RlZmluZSBwb3J0TVBVX0VOQUJMRQkJCQkJCSggMVVMIDw8IDBVTCApCisKKy8qIEV4cGVjdGVkIHZhbHVlIG9mIHRoZSBwb3J0TVBVX1RZUEUgcmVnaXN0ZXIuICovCisjZGVmaW5lIHBvcnRFWFBFQ1RFRF9NUFVfVFlQRV9WQUxVRQkJCSggOFVMIDw8IDhVTCApIC8qIDggcmVnaW9ucywgdW5pZmllZC4gKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAqIEBicmllZiBDb25zdGFudHMgcmVxdWlyZWQgdG8gc2V0IHVwIHRoZSBpbml0aWFsIHN0YWNrLgorICovCisjZGVmaW5lIHBvcnRJTklUSUFMX1hQU1IJCQkJCSggMHgwMTAwMDAwMCApCisKKyNpZiggY29uZmlnUlVOX0ZSRUVSVE9TX1NFQ1VSRV9PTkxZID09IDEgKQorCS8qKgorCSAqIEBicmllZiBJbml0aWFsIEVYQ19SRVRVUk4gdmFsdWUuCisJICoKKwkgKiAgICAgRkYgICAgICAgICBGRiAgICAgICAgIEZGICAgICAgICAgRkQKKwkgKiAxMTExIDExMTEgIDExMTEgMTExMSAgMTExMSAxMTExICAxMTExIDExMDEKKwkgKgorCSAqIEJpdFs2XSAtIDEgLS0+IFRoZSBleGNlcHRpb24gd2FzIHRha2VuIGZyb20gdGhlIFNlY3VyZSBzdGF0ZS4KKwkgKiBCaXRbNV0gLSAxIC0tPiBEbyBub3Qgc2tpcCBzdGFja2luZyBvZiBhZGRpdGlvbmFsIHN0YXRlIGNvbnRleHQuCisJICogQml0WzRdIC0gMSAtLT4gVGhlIFBFIGRpZCBub3QgYWxsb2NhdGUgc3BhY2Ugb24gdGhlIHN0YWNrIGZvciBGUCBjb250ZXh0LgorCSAqIEJpdFszXSAtIDEgLS0+IFJldHVybiB0byB0aGUgVGhyZWFkIG1vZGUuCisJICogQml0WzJdIC0gMSAtLT4gUmVzdG9yZSByZWdpc3RlcnMgZnJvbSB0aGUgcHJvY2VzcyBzdGFjay4KKwkgKiBCaXRbMV0gLSAwIC0tPiBSZXNlcnZlZCwgMC4KKwkgKiBCaXRbMF0gLSAxIC0tPiBUaGUgZXhjZXB0aW9uIHdhcyB0YWtlbiB0byB0aGUgU2VjdXJlIHN0YXRlLgorCSAqLworCSNkZWZpbmUgcG9ydElOSVRJQUxfRVhDX1JFVFVSTgkJCSggMHhmZmZmZmZmZCApCisjZWxzZQorCS8qKgorCSAqIEBicmllZiBJbml0aWFsIEVYQ19SRVRVUk4gdmFsdWUuCisJICoKKwkgKiAgICAgRkYgICAgICAgICBGRiAgICAgICAgIEZGICAgICAgICAgQkMKKwkgKiAxMTExIDExMTEgIDExMTEgMTExMSAgMTExMSAxMTExICAxMDExIDExMDAKKwkgKgorCSAqIEJpdFs2XSAtIDAgLS0+IFRoZSBleGNlcHRpb24gd2FzIHRha2VuIGZyb20gdGhlIE5vbi1TZWN1cmUgc3RhdGUuCisJICogQml0WzVdIC0gMSAtLT4gRG8gbm90IHNraXAgc3RhY2tpbmcgb2YgYWRkaXRpb25hbCBzdGF0ZSBjb250ZXh0LgorCSAqIEJpdFs0XSAtIDEgLS0+IFRoZSBQRSBkaWQgbm90IGFsbG9jYXRlIHNwYWNlIG9uIHRoZSBzdGFjayBmb3IgRlAgY29udGV4dC4KKwkgKiBCaXRbM10gLSAxIC0tPiBSZXR1cm4gdG8gdGhlIFRocmVhZCBtb2RlLgorCSAqIEJpdFsyXSAtIDEgLS0+IFJlc3RvcmUgcmVnaXN0ZXJzIGZyb20gdGhlIHByb2Nlc3Mgc3RhY2suCisJICogQml0WzFdIC0gMCAtLT4gUmVzZXJ2ZWQsIDAuCisJICogQml0WzBdIC0gMCAtLT4gVGhlIGV4Y2VwdGlvbiB3YXMgdGFrZW4gdG8gdGhlIE5vbi1TZWN1cmUgc3RhdGUuCisJICovCisJI2RlZmluZSBwb3J0SU5JVElBTF9FWENfUkVUVVJOCQkJKCAweGZmZmZmZmJjICkKKyNlbmRpZiAvKiBjb25maWdSVU5fRlJFRVJUT1NfU0VDVVJFX09OTFkgKi8KKworLyoqCisgKiBAYnJpZWYgQ09OVFJPTCByZWdpc3RlciBwcml2aWxlZ2VkIGJpdCBtYXNrLgorICoKKyAqIEJpdFswXSBpbiBDT05UUk9MIHJlZ2lzdGVyIHRlbGxzIHRoZSBwcml2aWxlZ2U6CisgKiAgQml0WzBdID0gMCA9PT4gVGhlIHRhc2sgaXMgcHJpdmlsZWdlZC4KKyAqICBCaXRbMF0gPSAxID09PiBUaGUgdGFzayBpcyBub3QgcHJpdmlsZWdlZC4KKyAqLworI2RlZmluZSBwb3J0Q09OVFJPTF9QUklWSUxFR0VEX01BU0sJCQkoIDFVTCA8PCAwVUwgKQorCisvKioKKyAqIEBicmllZiBJbml0aWFsIENPTlRST0wgcmVnaXN0ZXIgdmFsdWVzLgorICovCisjZGVmaW5lIHBvcnRJTklUSUFMX0NPTlRST0xfVU5QUklWSUxFR0VECSggMHgzICkKKyNkZWZpbmUgcG9ydElOSVRJQUxfQ09OVFJPTF9QUklWSUxFR0VECQkoIDB4MiApCisKKy8qKgorICogQGJyaWVmIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgcHJlLWxvYWRpbmcgb2YgdGhlIGluaXRpYWwgTFIgd2l0aCB0aGUKKyAqIGFkZHJlc3Mgb2YgcHJ2VGFza0V4aXRFcnJvcigpIGluIGNhc2UgaXQgbWVzc2VzIHVwIHVud2luZGluZyBvZiB0aGUgc3RhY2sKKyAqIGluIHRoZSBkZWJ1Z2dlci4KKyAqLworI2lmZGVmIGNvbmZpZ1RBU0tfUkVUVVJOX0FERFJFU1MKKwkjZGVmaW5lIHBvcnRUQVNLX1JFVFVSTl9BRERSRVNTCQkJY29uZmlnVEFTS19SRVRVUk5fQUREUkVTUworI2Vsc2UKKwkjZGVmaW5lIHBvcnRUQVNLX1JFVFVSTl9BRERSRVNTCQkJcHJ2VGFza0V4aXRFcnJvcgorI2VuZGlmCisKKy8qKgorICogQGJyaWVmIElmIHBvcnRQUkVMT0FEX1JFR0lTVEVSUyB0aGVuIHJlZ2lzdGVycyB3aWxsIGJlIGdpdmVuIGFuIGluaXRpYWwgdmFsdWUKKyAqIHdoZW4gYSB0YXNrIGlzIGNyZWF0ZWQuIFRoaXMgaGVscHMgaW4gZGVidWdnaW5nIGF0IHRoZSBjb3N0IG9mIGNvZGUgc2l6ZS4KKyAqLworI2RlZmluZSBwb3J0UFJFTE9BRF9SRUdJU1RFUlMJCQkJMQorCisvKioKKyAqIEBicmllZiBBIHRhc2sgaXMgY3JlYXRlZCB3aXRob3V0IGEgc2VjdXJlIGNvbnRleHQsIGFuZCBtdXN0IGNhbGwKKyAqIHBvcnRBTExPQ0FURV9TRUNVUkVfQ09OVEVYVCgpIHRvIGdpdmUgaXRzZWxmIGEgc2VjdXJlIGNvbnRleHQgYmVmb3JlIGl0IG1ha2VzCisgKiBhbnkgc2VjdXJlIGNhbGxzLgorICovCisjZGVmaW5lIHBvcnROT19TRUNVUkVfQ09OVEVYVAkJCQkwCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqCisgKiBAYnJpZWYgU2V0dXAgdGhlIHRpbWVyIHRvIGdlbmVyYXRlIHRoZSB0aWNrIGludGVycnVwdHMuCisgKi8KK3N0YXRpYyB2b2lkIHBydlNldHVwVGltZXJJbnRlcnJ1cHQoIHZvaWQgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisvKioKKyAqIEBicmllZiBVc2VkIHRvIGNhdGNoIHRhc2tzIHRoYXQgYXR0ZW1wdCB0byByZXR1cm4gZnJvbSB0aGVpciBpbXBsZW1lbnRpbmcKKyAqIGZ1bmN0aW9uLgorICovCitzdGF0aWMgdm9pZCBwcnZUYXNrRXhpdEVycm9yKCB2b2lkICk7CisKKyNpZiggY29uZmlnRU5BQkxFX01QVSA9PSAxICkKKwkvKioKKwkgKiBAYnJpZWYgU2V0dXAgdGhlIE1lbW9yeSBQcm90ZWN0aW9uIFVuaXQgKE1QVSkuCisJICovCisJc3RhdGljIHZvaWQgcHJ2U2V0dXBNUFUoIHZvaWQgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9NUFUgKi8KKworI2lmKCBjb25maWdFTkFCTEVfRlBVID09IDEgKQorCS8qKgorCSAqIEBicmllZiBTZXR1cCB0aGUgRmxvYXRpbmcgUG9pbnQgVW5pdCAoRlBVKS4KKwkgKi8KKwlzdGF0aWMgdm9pZCBwcnZTZXR1cEZQVSggdm9pZCApIFBSSVZJTEVHRURfRlVOQ1RJT047CisjZW5kaWYgLyogY29uZmlnRU5BQkxFX0ZQVSAqLworCisvKioKKyAqIEBicmllZiBZaWVsZCB0aGUgcHJvY2Vzc29yLgorICovCit2b2lkIHZQb3J0WWllbGQoIHZvaWQgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisvKioKKyAqIEBicmllZiBFbnRlciBjcml0aWNhbCBzZWN0aW9uLgorICovCit2b2lkIHZQb3J0RW50ZXJDcml0aWNhbCggdm9pZCApIFBSSVZJTEVHRURfRlVOQ1RJT047CisKKy8qKgorICogQGJyaWVmIEV4aXQgZnJvbSBjcml0aWNhbCBzZWN0aW9uLgorICovCit2b2lkIHZQb3J0RXhpdENyaXRpY2FsKCB2b2lkICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworLyoqCisgKiBAYnJpZWYgU3lzVGljayBoYW5kbGVyLgorICovCit2b2lkIFN5c1RpY2tfSGFuZGxlciggdm9pZCApIFBSSVZJTEVHRURfRlVOQ1RJT047CisKKy8qKgorICogQGJyaWVmIEMgcGFydCBvZiBTVkMgaGFuZGxlci4KKyAqLworcG9ydERPTlRfRElTQ0FSRCB2b2lkIHZQb3J0U1ZDSGFuZGxlcl9DKCB1aW50MzJfdCAqcHVsQ2FsbGVyU3RhY2tBZGRyZXNzICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAqIEBicmllZiBFYWNoIHRhc2sgbWFpbnRhaW5zIGl0cyBvd24gaW50ZXJydXB0IHN0YXR1cyBpbiB0aGUgY3JpdGljYWwgbmVzdGluZworICogdmFyaWFibGUuCisgKi8KK3N0YXRpYyB2b2xhdGlsZSB1aW50MzJfdCB1bENyaXRpY2FsTmVzdGluZyA9IDB4YWFhYWFhYWFVTDsKKworI2lmKCBjb25maWdFTkFCTEVfVFJVU1RaT05FID09IDEgKQorCS8qKgorCSAqIEBicmllZiBTYXZlZCBhcyBwYXJ0IG9mIHRoZSB0YXNrIGNvbnRleHQgdG8gaW5kaWNhdGUgd2hpY2ggY29udGV4dCB0aGUKKwkgKiB0YXNrIGlzIHVzaW5nIG9uIHRoZSBzZWN1cmUgc2lkZS4KKwkgKi8KKwlwb3J0RE9OVF9ESVNDQVJEIHZvbGF0aWxlIFNlY3VyZUNvbnRleHRIYW5kbGVfdCB4U2VjdXJlQ29udGV4dCA9IHBvcnROT19TRUNVUkVfQ09OVEVYVDsKKyNlbmRpZiAvKiBjb25maWdFTkFCTEVfVFJVU1RaT05FICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHZvaWQgcHJ2U2V0dXBUaW1lckludGVycnVwdCggdm9pZCApIC8qIFBSSVZJTEVHRURfRlVOQ1RJT04gKi8KK3sKKwkvKiBTdG9wIGFuZCByZXNldCB0aGUgU3lzVGljay4gKi8KKwkqKCBwb3J0TlZJQ19TWVNUSUNLX0NUUkwgKSA9IDBVTDsKKwkqKCBwb3J0TlZJQ19TWVNUSUNLX0NVUlJFTlRfVkFMVUUgKSA9IDBVTDsKKworCS8qIENvbmZpZ3VyZSBTeXNUaWNrIHRvIGludGVycnVwdCBhdCB0aGUgcmVxdWVzdGVkIHJhdGUuICovCisJKiggcG9ydE5WSUNfU1lTVElDS19MT0FEICkgPSAoIGNvbmZpZ0NQVV9DTE9DS19IWiAvIGNvbmZpZ1RJQ0tfUkFURV9IWiApIC0gMVVMOworCSooIHBvcnROVklDX1NZU1RJQ0tfQ1RSTCApID0gcG9ydE5WSUNfU1lTVElDS19DTEsgfCBwb3J0TlZJQ19TWVNUSUNLX0lOVCB8IHBvcnROVklDX1NZU1RJQ0tfRU5BQkxFOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB2b2lkIHBydlRhc2tFeGl0RXJyb3IoIHZvaWQgKQorewordm9sYXRpbGUgdWludDMyX3QgdWxEdW1teSA9IDBVTDsKKworCS8qIEEgZnVuY3Rpb24gdGhhdCBpbXBsZW1lbnRzIGEgdGFzayBtdXN0IG5vdCBleGl0IG9yIGF0dGVtcHQgdG8gcmV0dXJuIHRvCisJICogaXRzIGNhbGxlciBhcyB0aGVyZSBpcyBub3RoaW5nIHRvIHJldHVybiB0by4gSWYgYSB0YXNrIHdhbnRzIHRvIGV4aXQgaXQKKwkgKiBzaG91bGQgaW5zdGVhZCBjYWxsIHZUYXNrRGVsZXRlKCBOVUxMICkuIEFydGlmaWNpYWxseSBmb3JjZSBhbiBhc3NlcnQoKQorCSAqIHRvIGJlIHRyaWdnZXJlZCBpZiBjb25maWdBU1NFUlQoKSBpcyBkZWZpbmVkLCB0aGVuIHN0b3AgaGVyZSBzbworCSAqIGFwcGxpY2F0aW9uIHdyaXRlcnMgY2FuIGNhdGNoIHRoZSBlcnJvci4gKi8KKwljb25maWdBU1NFUlQoIHVsQ3JpdGljYWxOZXN0aW5nID09IH4wVUwgKTsKKwlwb3J0RElTQUJMRV9JTlRFUlJVUFRTKCk7CisKKwl3aGlsZSggdWxEdW1teSA9PSAwICkKKwl7CisJCS8qIFRoaXMgZmlsZSBjYWxscyBwcnZUYXNrRXhpdEVycm9yKCkgYWZ0ZXIgdGhlIHNjaGVkdWxlciBoYXMgYmVlbgorCQkgKiBzdGFydGVkIHRvIHJlbW92ZSBhIGNvbXBpbGVyIHdhcm5pbmcgYWJvdXQgdGhlIGZ1bmN0aW9uIGJlaW5nCisJCSAqIGRlZmluZWQgYnV0IG5ldmVyIGNhbGxlZC4gIHVsRHVtbXkgaXMgdXNlZCBwdXJlbHkgdG8gcXVpZXRlbiBvdGhlcgorCQkgKiB3YXJuaW5ncyBhYm91dCBjb2RlIGFwcGVhcmluZyBhZnRlciB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCAtIG1ha2luZworCQkgKiB1bER1bW15IHZvbGF0aWxlIG1ha2VzIHRoZSBjb21waWxlciB0aGluayB0aGUgZnVuY3Rpb24gY291bGQgcmV0dXJuCisJCSAqIGFuZCB0aGVyZWZvcmUgbm90IG91dHB1dCBhbiAndW5yZWFjaGFibGUgY29kZScgd2FybmluZyBmb3IgY29kZSB0aGF0CisJCSAqIGFwcGVhcnMgYWZ0ZXIgaXQuICovCisJfQorfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiggY29uZmlnRU5BQkxFX01QVSA9PSAxICkKKwlzdGF0aWMgdm9pZCBwcnZTZXR1cE1QVSggdm9pZCApIC8qIFBSSVZJTEVHRURfRlVOQ1RJT04gKi8KKwl7CisJI2lmIGRlZmluZWQoIF9fQVJNQ0NfVkVSU0lPTiApCisJCS8qIERlY2xhcmF0aW9uIHdoZW4gdGhlc2UgdmFyaWFibGUgYXJlIGRlZmluZWQgaW4gY29kZSBpbnN0ZWFkIG9mIGJlaW5nCisJCSAqIGV4cG9ydGVkIGZyb20gbGlua2VyIHNjcmlwdHMuICovCisJCWV4dGVybiB1aW50MzJfdCAqIF9fcHJpdmlsZWdlZF9mdW5jdGlvbnNfc3RhcnRfXzsKKwkJZXh0ZXJuIHVpbnQzMl90ICogX19wcml2aWxlZ2VkX2Z1bmN0aW9uc19lbmRfXzsKKwkJZXh0ZXJuIHVpbnQzMl90ICogX19zeXNjYWxsc19mbGFzaF9zdGFydF9fOworCQlleHRlcm4gdWludDMyX3QgKiBfX3N5c2NhbGxzX2ZsYXNoX2VuZF9fOworCQlleHRlcm4gdWludDMyX3QgKiBfX3VucHJpdmlsZWdlZF9mbGFzaF9zdGFydF9fOworCQlleHRlcm4gdWludDMyX3QgKiBfX3VucHJpdmlsZWdlZF9mbGFzaF9lbmRfXzsKKwkJZXh0ZXJuIHVpbnQzMl90ICogX19wcml2aWxlZ2VkX3NyYW1fc3RhcnRfXzsKKwkJZXh0ZXJuIHVpbnQzMl90ICogX19wcml2aWxlZ2VkX3NyYW1fZW5kX187CisJI2Vsc2UKKwkJLyogRGVjbGFyYXRpb24gd2hlbiB0aGVzZSB2YXJpYWJsZSBhcmUgZXhwb3J0ZWQgZnJvbSBsaW5rZXIgc2NyaXB0cy4gKi8KKwkJZXh0ZXJuIHVpbnQzMl90IF9fcHJpdmlsZWdlZF9mdW5jdGlvbnNfc3RhcnRfX1tdOworCQlleHRlcm4gdWludDMyX3QgX19wcml2aWxlZ2VkX2Z1bmN0aW9uc19lbmRfX1tdOworCQlleHRlcm4gdWludDMyX3QgX19zeXNjYWxsc19mbGFzaF9zdGFydF9fW107CisJCWV4dGVybiB1aW50MzJfdCBfX3N5c2NhbGxzX2ZsYXNoX2VuZF9fW107CisJCWV4dGVybiB1aW50MzJfdCBfX3VucHJpdmlsZWdlZF9mbGFzaF9zdGFydF9fW107CisJCWV4dGVybiB1aW50MzJfdCBfX3VucHJpdmlsZWdlZF9mbGFzaF9lbmRfX1tdOworCQlleHRlcm4gdWludDMyX3QgX19wcml2aWxlZ2VkX3NyYW1fc3RhcnRfX1tdOworCQlleHRlcm4gdWludDMyX3QgX19wcml2aWxlZ2VkX3NyYW1fZW5kX19bXTsKKwkjZW5kaWYgLyogZGVmaW5lZCggX19BUk1DQ19WRVJTSU9OICkgKi8KKworCQkvKiBDaGVjayB0aGF0IHRoZSBNUFUgaXMgcHJlc2VudC4gKi8KKwkJaWYoIHBvcnRNUFVfVFlQRV9SRUcgPT0gcG9ydEVYUEVDVEVEX01QVV9UWVBFX1ZBTFVFICkKKwkJeworCQkJLyogTUFJUjAgLSBJbmRleCAwLiAqLworCQkJcG9ydE1QVV9NQUlSMF9SRUcgfD0gKCAoIHBvcnRNUFVfTk9STUFMX01FTU9SWV9CVUZGRVJBQkxFX0NBQ0hFQUJMRSA8PCBwb3J0TVBVX01BSVJfQVRUUjBfUE9TICkgJiBwb3J0TVBVX01BSVJfQVRUUjBfTUFTSyApOworCQkJLyogTUFJUjAgLSBJbmRleCAxLiAqLworCQkJcG9ydE1QVV9NQUlSMF9SRUcgfD0gKCAoIHBvcnRNUFVfREVWSUNFX01FTU9SWV9uR25SRSA8PCBwb3J0TVBVX01BSVJfQVRUUjFfUE9TICkgJiBwb3J0TVBVX01BSVJfQVRUUjFfTUFTSyApOworCisJCQkvKiBTZXR1cCBwcml2aWxlZ2VkIGZsYXNoIGFzIFJlYWQgT25seSBzbyB0aGF0IHByaXZpbGVnZWQgdGFza3MgY2FuCisJCQkgKiByZWFkIGl0IGJ1dCBub3QgbW9kaWZ5LiAqLworCQkJcG9ydE1QVV9STlJfUkVHID0gcG9ydFBSSVZJTEVHRURfRkxBU0hfUkVHSU9OOworCQkJcG9ydE1QVV9SQkFSX1JFRyA9CSggKCAoIHVpbnQzMl90ICkgX19wcml2aWxlZ2VkX2Z1bmN0aW9uc19zdGFydF9fICkgJiBwb3J0TVBVX1JCQVJfQUREUkVTU19NQVNLICkgfAorCQkJCQkJCQkoIHBvcnRNUFVfUkVHSU9OX05PTl9TSEFSRUFCTEUgKSB8CisJCQkJCQkJCSggcG9ydE1QVV9SRUdJT05fUFJJVklMRUdFRF9SRUFEX09OTFkgKTsKKwkJCXBvcnRNUFVfUkxBUl9SRUcgPQkoICggKCB1aW50MzJfdCApIF9fcHJpdmlsZWdlZF9mdW5jdGlvbnNfZW5kX18gKSAmIHBvcnRNUFVfUkxBUl9BRERSRVNTX01BU0sgKSB8CisJCQkJCQkJCSggcG9ydE1QVV9STEFSX0FUVFJfSU5ERVgwICkgfAorCQkJCQkJCQkoIHBvcnRNUFVfUkxBUl9SRUdJT05fRU5BQkxFICk7CisKKwkJCS8qIFNldHVwIHVucHJpdmlsZWdlZCBmbGFzaCBhcyBSZWFkIE9ubHkgYnkgYm90aCBwcml2aWxlZ2VkIGFuZAorCQkJICogdW5wcml2aWxlZ2VkIHRhc2tzLiBBbGwgdGFza3MgY2FuIHJlYWQgaXQgYnV0IG5vLW9uZSBjYW4gbW9kaWZ5LiAqLworCQkJcG9ydE1QVV9STlJfUkVHID0gcG9ydFVOUFJJVklMRUdFRF9GTEFTSF9SRUdJT047CisJCQlwb3J0TVBVX1JCQVJfUkVHID0JKCAoICggdWludDMyX3QgKSBfX3VucHJpdmlsZWdlZF9mbGFzaF9zdGFydF9fICkgJiBwb3J0TVBVX1JCQVJfQUREUkVTU19NQVNLICkgfAorCQkJCQkJCQkoIHBvcnRNUFVfUkVHSU9OX05PTl9TSEFSRUFCTEUgKSB8CisJCQkJCQkJCSggcG9ydE1QVV9SRUdJT05fUkVBRF9PTkxZICk7CisJCQlwb3J0TVBVX1JMQVJfUkVHID0JKCAoICggdWludDMyX3QgKSBfX3VucHJpdmlsZWdlZF9mbGFzaF9lbmRfXyApICYgcG9ydE1QVV9STEFSX0FERFJFU1NfTUFTSyApIHwKKwkJCQkJCQkJKCBwb3J0TVBVX1JMQVJfQVRUUl9JTkRFWDAgKSB8CisJCQkJCQkJCSggcG9ydE1QVV9STEFSX1JFR0lPTl9FTkFCTEUgKTsKKworCQkJLyogU2V0dXAgdW5wcml2aWxlZ2VkIHN5c2NhbGxzIGZsYXNoIGFzIFJlYWQgT25seSBieSBib3RoIHByaXZpbGVnZWQKKwkJCSAqIGFuZCB1bnByaXZpbGVnZWQgdGFza3MuIEFsbCB0YXNrcyBjYW4gcmVhZCBpdCBidXQgbm8tb25lIGNhbiBtb2RpZnkuICovCisJCQlwb3J0TVBVX1JOUl9SRUcgPSBwb3J0VU5QUklWSUxFR0VEX1NZU0NBTExTX1JFR0lPTjsKKwkJCXBvcnRNUFVfUkJBUl9SRUcgPQkoICggKCB1aW50MzJfdCApIF9fc3lzY2FsbHNfZmxhc2hfc3RhcnRfXyApICYgcG9ydE1QVV9SQkFSX0FERFJFU1NfTUFTSyApIHwKKwkJCQkJCQkJKCBwb3J0TVBVX1JFR0lPTl9OT05fU0hBUkVBQkxFICkgfAorCQkJCQkJCQkoIHBvcnRNUFVfUkVHSU9OX1JFQURfT05MWSApOworCQkJcG9ydE1QVV9STEFSX1JFRyA9CSggKCAoIHVpbnQzMl90ICkgX19zeXNjYWxsc19mbGFzaF9lbmRfXyApICYgcG9ydE1QVV9STEFSX0FERFJFU1NfTUFTSyApIHwKKwkJCQkJCQkJKCBwb3J0TVBVX1JMQVJfQVRUUl9JTkRFWDAgKSB8CisJCQkJCQkJCSggcG9ydE1QVV9STEFSX1JFR0lPTl9FTkFCTEUgKTsKKworCQkJLyogU2V0dXAgUkFNIGNvbnRhaW5pbmcga2VybmVsIGRhdGEgZm9yIHByaXZpbGVnZWQgYWNjZXNzIG9ubHkuICovCisJCQlwb3J0TVBVX1JOUl9SRUcgPSBwb3J0UFJJVklMRUdFRF9SQU1fUkVHSU9OOworCQkJcG9ydE1QVV9SQkFSX1JFRyA9CSggKCAoIHVpbnQzMl90ICkgX19wcml2aWxlZ2VkX3NyYW1fc3RhcnRfXyApICYgcG9ydE1QVV9SQkFSX0FERFJFU1NfTUFTSyApIHwKKwkJCQkJCQkJKCBwb3J0TVBVX1JFR0lPTl9OT05fU0hBUkVBQkxFICkgfAorCQkJCQkJCQkoIHBvcnRNUFVfUkVHSU9OX1BSSVZJTEVHRURfUkVBRF9XUklURSApIHwKKwkJCQkJCQkJKCBwb3J0TVBVX1JFR0lPTl9FWEVDVVRFX05FVkVSICk7CisJCQlwb3J0TVBVX1JMQVJfUkVHID0JKCAoICggdWludDMyX3QgKSBfX3ByaXZpbGVnZWRfc3JhbV9lbmRfXyApICYgcG9ydE1QVV9STEFSX0FERFJFU1NfTUFTSyApIHwKKwkJCQkJCQkJKCBwb3J0TVBVX1JMQVJfQVRUUl9JTkRFWDAgKSB8CisJCQkJCQkJCSggcG9ydE1QVV9STEFSX1JFR0lPTl9FTkFCTEUgKTsKKworCQkJLyogRW5hYmxlIG1lbSBmYXVsdC4gKi8KKwkJCXBvcnRTQ0JfU1lTX0hBTkRMRVJfQ1RSTF9TVEFURV9SRUcgfD0gcG9ydFNDQl9NRU1fRkFVTFRfRU5BQkxFOworCisJCQkvKiBFbmFibGUgTVBVIHdpdGggcHJpdmlsZWdlZCBiYWNrZ3JvdW5kIGFjY2VzcyBpLmUuIHVubWFwcGVkCisJCQkgKiByZWdpb25zIGhhdmUgcHJpdmlsZWdlZCBhY2Nlc3MuICovCisJCQlwb3J0TVBVX0NUUkxfUkVHIHw9ICggcG9ydE1QVV9QUklWX0JBQ0tHUk9VTkRfRU5BQkxFIHwgcG9ydE1QVV9FTkFCTEUgKTsKKwkJfQorCX0KKyNlbmRpZiAvKiBjb25maWdFTkFCTEVfTVBVICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmKCBjb25maWdFTkFCTEVfRlBVID09IDEgKQorCXN0YXRpYyB2b2lkIHBydlNldHVwRlBVKCB2b2lkICkgLyogUFJJVklMRUdFRF9GVU5DVElPTiAqLworCXsKKwkJI2lmKCBjb25maWdFTkFCTEVfVFJVU1RaT05FID09IDEgKQorCQl7CisJCQkvKiBFbmFibGUgbm9uLXNlY3VyZSBhY2Nlc3MgdG8gdGhlIEZQVS4gKi8KKwkJCVNlY3VyZUluaXRfRW5hYmxlTlNGUFVBY2Nlc3MoKTsKKwkJfQorCQkjZW5kaWYgLyogY29uZmlnRU5BQkxFX1RSVVNUWk9ORSAqLworCisJCS8qIENQMTAgPSAxMSA9PT4gRnVsbCBhY2Nlc3MgdG8gRlBVIGkuZS4gYm90aCBwcml2aWxlZ2VkIGFuZAorCQkgKiB1bnByaXZpbGVnZWQgY29kZSBzaG91bGQgYmUgYWJsZSB0byBhY2Nlc3MgRlBVLiBDUDExIHNob3VsZCBiZQorCQkgKiBwcm9ncmFtbWVkIHRvIHRoZSBzYW1lIHZhbHVlIGFzIENQMTAuICovCisJCSooIHBvcnRDUEFDUiApIHw9CSgJKCBwb3J0Q1BBQ1JfQ1AxMF9WQUxVRSA8PCBwb3J0Q1BBQ1JfQ1AxMF9QT1MgKSB8CisJCQkJCQkJCSggcG9ydENQQUNSX0NQMTFfVkFMVUUgPDwgcG9ydENQQUNSX0NQMTFfUE9TICkKKwkJCQkJCQkpOworCisJCS8qIEFTUEVOID0gMSA9PT4gSGFyZHdhcmUgc2hvdWxkIGF1dG9tYXRpY2FsbHkgcHJlc2VydmUgZmxvYXRpbmcgcG9pbnQKKwkJICogY29udGV4dCBvbiBleGNlcHRpb24gZW50cnkgYW5kIHJlc3RvcmUgb24gZXhjZXB0aW9uIHJldHVybi4KKwkJICogTFNQRU4gPSAxID09PiBFbmFibGUgbGF6eSBjb250ZXh0IHNhdmUgb2YgRlAgc3RhdGUuICovCisJCSooIHBvcnRGUENDUiApIHw9ICggcG9ydEZQQ0NSX0FTUEVOX01BU0sgfCBwb3J0RlBDQ1JfTFNQRU5fTUFTSyApOworCX0KKyNlbmRpZiAvKiBjb25maWdFTkFCTEVfRlBVICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCB2UG9ydFlpZWxkKCB2b2lkICkgLyogUFJJVklMRUdFRF9GVU5DVElPTiAqLworeworCS8qIFNldCBhIFBlbmRTViB0byByZXF1ZXN0IGEgY29udGV4dCBzd2l0Y2guICovCisJKiggcG9ydE5WSUNfSU5UX0NUUkwgKSA9IHBvcnROVklDX1BFTkRTVlNFVDsKKworCS8qIEJhcnJpZXJzIGFyZSBub3JtYWxseSBub3QgcmVxdWlyZWQgYnV0IGRvIGVuc3VyZSB0aGUgY29kZSBpcworCSAqIGNvbXBsZXRlbHkgd2l0aGluIHRoZSBzcGVjaWZpZWQgYmVoYXZpb3VyIGZvciB0aGUgYXJjaGl0ZWN0dXJlLiAqLworCV9fYXNtIHZvbGF0aWxlKCAiZHNiIiA6OjogIm1lbW9yeSIgKTsKKwlfX2FzbSB2b2xhdGlsZSggImlzYiIgKTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIHZQb3J0RW50ZXJDcml0aWNhbCggdm9pZCApIC8qIFBSSVZJTEVHRURfRlVOQ1RJT04gKi8KK3sKKwlwb3J0RElTQUJMRV9JTlRFUlJVUFRTKCk7CisJdWxDcml0aWNhbE5lc3RpbmcrKzsKKworCS8qIEJhcnJpZXJzIGFyZSBub3JtYWxseSBub3QgcmVxdWlyZWQgYnV0IGRvIGVuc3VyZSB0aGUgY29kZSBpcworCSAqIGNvbXBsZXRlbHkgd2l0aGluIHRoZSBzcGVjaWZpZWQgYmVoYXZpb3VyIGZvciB0aGUgYXJjaGl0ZWN0dXJlLiAqLworCV9fYXNtIHZvbGF0aWxlKCAiZHNiIiA6OjogIm1lbW9yeSIgKTsKKwlfX2FzbSB2b2xhdGlsZSggImlzYiIgKTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIHZQb3J0RXhpdENyaXRpY2FsKCB2b2lkICkgLyogUFJJVklMRUdFRF9GVU5DVElPTiAqLworeworCWNvbmZpZ0FTU0VSVCggdWxDcml0aWNhbE5lc3RpbmcgKTsKKwl1bENyaXRpY2FsTmVzdGluZy0tOworCisJaWYoIHVsQ3JpdGljYWxOZXN0aW5nID09IDAgKQorCXsKKwkJcG9ydEVOQUJMRV9JTlRFUlJVUFRTKCk7CisJfQorfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgU3lzVGlja19IYW5kbGVyKCB2b2lkICkgLyogUFJJVklMRUdFRF9GVU5DVElPTiAqLworewordWludDMyX3QgdWxQcmV2aW91c01hc2s7CisKKwl1bFByZXZpb3VzTWFzayA9IHBvcnRTRVRfSU5URVJSVVBUX01BU0tfRlJPTV9JU1IoKTsKKwl7CisJCS8qIEluY3JlbWVudCB0aGUgUlRPUyB0aWNrLiAqLworCQlpZiggeFRhc2tJbmNyZW1lbnRUaWNrKCkgIT0gcGRGQUxTRSApCisJCXsKKwkJCS8qIFBlbmQgYSBjb250ZXh0IHN3aXRjaC4gKi8KKwkJCSooIHBvcnROVklDX0lOVF9DVFJMICkgPSBwb3J0TlZJQ19QRU5EU1ZTRVQ7CisJCX0KKwl9CisJcG9ydENMRUFSX0lOVEVSUlVQVF9NQVNLX0ZST01fSVNSKCB1bFByZXZpb3VzTWFzayApOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgdlBvcnRTVkNIYW5kbGVyX0MoIHVpbnQzMl90ICpwdWxDYWxsZXJTdGFja0FkZHJlc3MgKSAvKiBQUklWSUxFR0VEX0ZVTkNUSU9OIHBvcnRET05UX0RJU0NBUkQgKi8KK3sKKyNpZiggY29uZmlnRU5BQkxFX01QVSA9PSAxICkKKwkjaWYgZGVmaW5lZCggX19BUk1DQ19WRVJTSU9OICkKKwkJLyogRGVjbGFyYXRpb24gd2hlbiB0aGVzZSB2YXJpYWJsZSBhcmUgZGVmaW5lZCBpbiBjb2RlIGluc3RlYWQgb2YgYmVpbmcKKwkJICogZXhwb3J0ZWQgZnJvbSBsaW5rZXIgc2NyaXB0cy4gKi8KKwkJZXh0ZXJuIHVpbnQzMl90ICogX19zeXNjYWxsc19mbGFzaF9zdGFydF9fOworCQlleHRlcm4gdWludDMyX3QgKiBfX3N5c2NhbGxzX2ZsYXNoX2VuZF9fOworCSNlbHNlCisJCS8qIERlY2xhcmF0aW9uIHdoZW4gdGhlc2UgdmFyaWFibGUgYXJlIGV4cG9ydGVkIGZyb20gbGlua2VyIHNjcmlwdHMuICovCisJCWV4dGVybiB1aW50MzJfdCBfX3N5c2NhbGxzX2ZsYXNoX3N0YXJ0X19bXTsKKwkJZXh0ZXJuIHVpbnQzMl90IF9fc3lzY2FsbHNfZmxhc2hfZW5kX19bXTsKKwkjZW5kaWYgLyogZGVmaW5lZCggX19BUk1DQ19WRVJTSU9OICkgKi8KKyNlbmRpZiAvKiBjb25maWdFTkFCTEVfTVBVICovCisKK3VpbnQzMl90IHVsUEM7CisKKyNpZiggY29uZmlnRU5BQkxFX1RSVVNUWk9ORSA9PSAxICkKKwl1aW50MzJfdCB1bFIwOworCSNpZiggY29uZmlnRU5BQkxFX01QVSA9PSAxICkKKwkJdWludDMyX3QgdWxDb250cm9sLCB1bElzVGFza1ByaXZpbGVnZWQ7CisJI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9NUFUgKi8KKyNlbmRpZiAvKiBjb25maWdFTkFCTEVfVFJVU1RaT05FICovCit1aW50OF90IHVjU1ZDTnVtYmVyOworCisJLyogUmVnaXN0ZXIgYXJlIHN0b3JlZCBvbiB0aGUgc3RhY2sgaW4gdGhlIGZvbGxvd2luZyBvcmRlciAtIFIwLCBSMSwgUjIsIFIzLAorCSAqIFIxMiwgTFIsIFBDLCB4UFNSLiAqLworCXVsUEMgPSBwdWxDYWxsZXJTdGFja0FkZHJlc3NbIDYgXTsKKwl1Y1NWQ051bWJlciA9ICggKCB1aW50OF90ICopIHVsUEMgKVsgLTIgXTsKKworCXN3aXRjaCggdWNTVkNOdW1iZXIgKQorCXsKKwkJI2lmKCBjb25maWdFTkFCTEVfVFJVU1RaT05FID09IDEgKQorCQkJY2FzZSBwb3J0U1ZDX0FMTE9DQVRFX1NFQ1VSRV9DT05URVhUOgorCQkJeworCQkJCS8qIFIwIGNvbnRhaW5zIHRoZSBzdGFjayBzaXplIHBhc3NlZCBhcyBwYXJhbWV0ZXIgdG8gdGhlCisJCQkJICogdlBvcnRBbGxvY2F0ZVNlY3VyZUNvbnRleHQgZnVuY3Rpb24uICovCisJCQkJdWxSMCA9IHB1bENhbGxlclN0YWNrQWRkcmVzc1sgMCBdOworCisJCQkJI2lmKCBjb25maWdFTkFCTEVfTVBVID09IDEgKQorCQkJCXsKKwkJCQkJLyogUmVhZCB0aGUgQ09OVFJPTCByZWdpc3RlciB2YWx1ZS4gKi8KKwkJCQkJX19hc20gdm9sYXRpbGUgKCAibXJzICUwLCBjb250cm9sIiAgOiAiPXIiICggdWxDb250cm9sICkgKTsKKworCQkJCQkvKiBUaGUgdGFzayB0aGF0IHJhaXNlZCB0aGUgU1ZDIGlzIHByaXZpbGVnZWQgaWYgQml0WzBdCisJCQkJCSAqIGluIHRoZSBDT05UUk9MIHJlZ2lzdGVyIGlzIDAuICovCisJCQkJCXVsSXNUYXNrUHJpdmlsZWdlZCA9ICggKCB1bENvbnRyb2wgJiBwb3J0Q09OVFJPTF9QUklWSUxFR0VEX01BU0sgKSA9PSAwICk7CisKKwkJCQkJLyogQWxsb2NhdGUgYW5kIGxvYWQgYSBjb250ZXh0IGZvciB0aGUgc2VjdXJlIHRhc2suICovCisJCQkJCXhTZWN1cmVDb250ZXh0ID0gU2VjdXJlQ29udGV4dF9BbGxvY2F0ZUNvbnRleHQoIHVsUjAsIHVsSXNUYXNrUHJpdmlsZWdlZCApOworCQkJCX0KKwkJCQkjZWxzZQorCQkJCXsKKwkJCQkJLyogQWxsb2NhdGUgYW5kIGxvYWQgYSBjb250ZXh0IGZvciB0aGUgc2VjdXJlIHRhc2suICovCisJCQkJCXhTZWN1cmVDb250ZXh0ID0gU2VjdXJlQ29udGV4dF9BbGxvY2F0ZUNvbnRleHQoIHVsUjAgKTsKKwkJCQl9CisJCQkJI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9NUFUgKi8KKworCQkJCWNvbmZpZ0FTU0VSVCggeFNlY3VyZUNvbnRleHQgIT0gTlVMTCApOworCQkJCVNlY3VyZUNvbnRleHRfTG9hZENvbnRleHQoIHhTZWN1cmVDb250ZXh0ICk7CisJCQl9CisJCQlicmVhazsKKworCQkJY2FzZSBwb3J0U1ZDX0ZSRUVfU0VDVVJFX0NPTlRFWFQ6CisJCQl7CisJCQkJLyogUjAgY29udGFpbnMgdGhlIHNlY3VyZSBjb250ZXh0IGhhbmRsZSB0byBiZSBmcmVlZC4gKi8KKwkJCQl1bFIwID0gcHVsQ2FsbGVyU3RhY2tBZGRyZXNzWyAwIF07CisKKwkJCQkvKiBGcmVlIHRoZSBzZWN1cmUgY29udGV4dC4gKi8KKwkJCQlTZWN1cmVDb250ZXh0X0ZyZWVDb250ZXh0KCAoIFNlY3VyZUNvbnRleHRIYW5kbGVfdCApIHVsUjAgKTsKKwkJCX0KKwkJCWJyZWFrOworCQkjZW5kaWYgLyogY29uZmlnRU5BQkxFX1RSVVNUWk9ORSAqLworCisJCWNhc2UgcG9ydFNWQ19TVEFSVF9TQ0hFRFVMRVI6CisJCXsKKwkJCSNpZiggY29uZmlnRU5BQkxFX1RSVVNUWk9ORSA9PSAxICkKKwkJCXsKKwkJCQkvKiBEZS1wcmlvcml0aXplIHRoZSBub24tc2VjdXJlIGV4Y2VwdGlvbnMgc28gdGhhdCB0aGUKKwkJCQkgKiBub24tc2VjdXJlIHBlbmRTViBydW5zIGF0IHRoZSBsb3dlc3QgcHJpb3JpdHkuICovCisJCQkJU2VjdXJlSW5pdF9EZVByaW9yaXRpemVOU0V4Y2VwdGlvbnMoKTsKKworCQkJCS8qIEluaXRpYWxpemUgdGhlIHNlY3VyZSBjb250ZXh0IG1hbmFnZW1lbnQgc3lzdGVtLiAqLworCQkJCVNlY3VyZUNvbnRleHRfSW5pdCgpOworCQkJfQorCQkJI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9UUlVTVFpPTkUgKi8KKworCQkJI2lmKCBjb25maWdFTkFCTEVfRlBVID09IDEgKQorCQkJeworCQkJCS8qIFNldHVwIHRoZSBGbG9hdGluZyBQb2ludCBVbml0IChGUFUpLiAqLworCQkJCXBydlNldHVwRlBVKCk7CisJCQl9CisJCQkjZW5kaWYgLyogY29uZmlnRU5BQkxFX0ZQVSAqLworCisJCQkvKiBTZXR1cCB0aGUgY29udGV4dCBvZiB0aGUgZmlyc3QgdGFzayBzbyB0aGF0IHRoZSBmaXJzdCB0YXNrIHN0YXJ0cworCQkJICogZXhlY3V0aW5nLiAqLworCQkJdlJlc3RvcmVDb250ZXh0T2ZGaXJzdFRhc2soKTsKKwkJfQorCQlicmVhazsKKworCQkjaWYoIGNvbmZpZ0VOQUJMRV9NUFUgPT0gMSApCisJCQljYXNlIHBvcnRTVkNfUkFJU0VfUFJJVklMRUdFOgorCQkJeworCQkJCS8qIE9ubHkgcmFpc2UgdGhlIHByaXZpbGVnZSwgaWYgdGhlIHN2YyB3YXMgcmFpc2VkIGZyb20gYW55IG9mCisJCQkJICogdGhlIHN5c3RlbSBjYWxscy4gKi8KKwkJCQlpZiggdWxQQyA+PSAoIHVpbnQzMl90ICkgX19zeXNjYWxsc19mbGFzaF9zdGFydF9fICYmCisJCQkJCXVsUEMgPD0gKCB1aW50MzJfdCApIF9fc3lzY2FsbHNfZmxhc2hfZW5kX18gKQorCQkJCXsKKwkJCQkJdlJhaXNlUHJpdmlsZWdlKCk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCSNlbmRpZiAvKiBjb25maWdFTkFCTEVfTVBVICovCisKKwkJZGVmYXVsdDoKKwkJeworCQkJLyogSW5jb3JyZWN0IFNWQyBjYWxsLiAqLworCQkJY29uZmlnQVNTRVJUKCBwZEZBTFNFICk7CisJCX0KKwl9Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmKCBjb25maWdFTkFCTEVfTVBVID09IDEgKQorCVN0YWNrVHlwZV90ICpweFBvcnRJbml0aWFsaXNlU3RhY2soIFN0YWNrVHlwZV90ICpweFRvcE9mU3RhY2ssIFN0YWNrVHlwZV90ICpweEVuZE9mU3RhY2ssIFRhc2tGdW5jdGlvbl90IHB4Q29kZSwgdm9pZCAqcHZQYXJhbWV0ZXJzLCBCYXNlVHlwZV90IHhSdW5Qcml2aWxlZ2VkICkgLyogUFJJVklMRUdFRF9GVU5DVElPTiAqLworI2Vsc2UKKwlTdGFja1R5cGVfdCAqcHhQb3J0SW5pdGlhbGlzZVN0YWNrKCBTdGFja1R5cGVfdCAqcHhUb3BPZlN0YWNrLCBTdGFja1R5cGVfdCAqcHhFbmRPZlN0YWNrLCBUYXNrRnVuY3Rpb25fdCBweENvZGUsIHZvaWQgKnB2UGFyYW1ldGVycyApIC8qIFBSSVZJTEVHRURfRlVOQ1RJT04gKi8KKyNlbmRpZiAvKiBjb25maWdFTkFCTEVfTVBVICovCit7CisJLyogU2ltdWxhdGUgdGhlIHN0YWNrIGZyYW1lIGFzIGl0IHdvdWxkIGJlIGNyZWF0ZWQgYnkgYSBjb250ZXh0IHN3aXRjaAorCSAqIGludGVycnVwdC4gKi8KKwkjaWYoIHBvcnRQUkVMT0FEX1JFR0lTVEVSUyA9PSAwICkKKwl7CisJCXB4VG9wT2ZTdGFjay0tOyAvKiBPZmZzZXQgYWRkZWQgdG8gYWNjb3VudCBmb3IgdGhlIHdheSB0aGUgTUNVIHVzZXMgdGhlIHN0YWNrIG9uIGVudHJ5L2V4aXQgb2YgaW50ZXJydXB0cy4gKi8KKwkJKnB4VG9wT2ZTdGFjayA9IHBvcnRJTklUSUFMX1hQU1I7CQkJCQkJCS8qIHhQU1IgKi8KKwkJcHhUb3BPZlN0YWNrLS07CisJCSpweFRvcE9mU3RhY2sgPSAoIFN0YWNrVHlwZV90ICkgcHhDb2RlOwkJCQkJCS8qIFBDICovCisJCXB4VG9wT2ZTdGFjay0tOworCQkqcHhUb3BPZlN0YWNrID0gKCBTdGFja1R5cGVfdCApIHBvcnRUQVNLX1JFVFVSTl9BRERSRVNTOwkvKiBMUiAqLworCQlweFRvcE9mU3RhY2sgLT0gNTsJCQkJCQkJCQkJCS8qIFIxMiwgUjMsIFIyIGFuZCBSMS4gKi8KKwkJKnB4VG9wT2ZTdGFjayA9ICggU3RhY2tUeXBlX3QgKSBwdlBhcmFtZXRlcnM7CQkJCS8qIFIwICovCisJCXB4VG9wT2ZTdGFjayAtPSA5OwkJCQkJCQkJCQkJLyogUjExLi5SNCwgRVhDX1JFVFVSTi4gKi8KKwkJKnB4VG9wT2ZTdGFjayA9IHBvcnRJTklUSUFMX0VYQ19SRVRVUk47CisKKwkJI2lmKCBjb25maWdFTkFCTEVfTVBVID09IDEgKQorCQl7CisJCQlweFRvcE9mU3RhY2stLTsKKwkJCWlmKCB4UnVuUHJpdmlsZWdlZCA9PSBwZFRSVUUgKQorCQkJeworCQkJCSpweFRvcE9mU3RhY2sgPSBwb3J0SU5JVElBTF9DT05UUk9MX1BSSVZJTEVHRUQ7CQkvKiBTbG90IHVzZWQgdG8gaG9sZCB0aGlzIHRhc2sncyBDT05UUk9MIHZhbHVlLiAqLworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCSpweFRvcE9mU3RhY2sgPSBwb3J0SU5JVElBTF9DT05UUk9MX1VOUFJJVklMRUdFRDsJLyogU2xvdCB1c2VkIHRvIGhvbGQgdGhpcyB0YXNrJ3MgQ09OVFJPTCB2YWx1ZS4gKi8KKwkJCX0KKwkJfQorCQkjZW5kaWYgLyogY29uZmlnRU5BQkxFX01QVSAqLworCisJCXB4VG9wT2ZTdGFjay0tOworCQkqcHhUb3BPZlN0YWNrID0gKCBTdGFja1R5cGVfdCApIHB4RW5kT2ZTdGFjazsJLyogU2xvdCB1c2VkIHRvIGhvbGQgdGhpcyB0YXNrJ3MgUFNQTElNIHZhbHVlLiAqLworCisJCSNpZiggY29uZmlnRU5BQkxFX1RSVVNUWk9ORSA9PSAxICkKKwkJeworCQkJcHhUb3BPZlN0YWNrLS07CisJCQkqcHhUb3BPZlN0YWNrID0gcG9ydE5PX1NFQ1VSRV9DT05URVhUOwkJLyogU2xvdCB1c2VkIHRvIGhvbGQgdGhpcyB0YXNrJ3MgeFNlY3VyZUNvbnRleHQgdmFsdWUuICovCisJCX0KKwkJI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9UUlVTVFpPTkUgKi8KKwl9CisJI2Vsc2UgLyogcG9ydFBSRUxPQURfUkVHSVNURVJTICovCisJeworCQlweFRvcE9mU3RhY2stLTsgLyogT2Zmc2V0IGFkZGVkIHRvIGFjY291bnQgZm9yIHRoZSB3YXkgdGhlIE1DVSB1c2VzIHRoZSBzdGFjayBvbiBlbnRyeS9leGl0IG9mIGludGVycnVwdHMuICovCisJCSpweFRvcE9mU3RhY2sgPSBwb3J0SU5JVElBTF9YUFNSOwkJCQkJCQkvKiB4UFNSICovCisJCXB4VG9wT2ZTdGFjay0tOworCQkqcHhUb3BPZlN0YWNrID0gKCBTdGFja1R5cGVfdCApIHB4Q29kZTsJCQkJCQkvKiBQQyAqLworCQlweFRvcE9mU3RhY2stLTsKKwkJKnB4VG9wT2ZTdGFjayA9ICggU3RhY2tUeXBlX3QgKSBwb3J0VEFTS19SRVRVUk5fQUREUkVTUzsJLyogTFIgKi8KKwkJcHhUb3BPZlN0YWNrLS07CisJCSpweFRvcE9mU3RhY2sgPSAoIFN0YWNrVHlwZV90ICkgMHgxMjEyMTIxMlVMOwkJCQkvKiBSMTIgKi8KKwkJcHhUb3BPZlN0YWNrLS07CisJCSpweFRvcE9mU3RhY2sgPSAoIFN0YWNrVHlwZV90ICkgMHgwMzAzMDMwM1VMOwkJCQkvKiBSMyAqLworCQlweFRvcE9mU3RhY2stLTsKKwkJKnB4VG9wT2ZTdGFjayA9ICggU3RhY2tUeXBlX3QgKSAweDAyMDIwMjAyVUw7CQkJCS8qIFIyICovCisJCXB4VG9wT2ZTdGFjay0tOworCQkqcHhUb3BPZlN0YWNrID0gKCBTdGFja1R5cGVfdCApIDB4MDEwMTAxMDFVTDsJCQkJLyogUjEgKi8KKwkJcHhUb3BPZlN0YWNrLS07CisJCSpweFRvcE9mU3RhY2sgPSAoIFN0YWNrVHlwZV90ICkgcHZQYXJhbWV0ZXJzOwkJCQkvKiBSMCAqLworCQlweFRvcE9mU3RhY2stLTsKKwkJKnB4VG9wT2ZTdGFjayA9ICggU3RhY2tUeXBlX3QgKSAweDExMTExMTExVUw7CQkJCS8qIFIxMSAqLworCQlweFRvcE9mU3RhY2stLTsKKwkJKnB4VG9wT2ZTdGFjayA9ICggU3RhY2tUeXBlX3QgKSAweDEwMTAxMDEwVUw7CQkJCS8qIFIxMCAqLworCQlweFRvcE9mU3RhY2stLTsKKwkJKnB4VG9wT2ZTdGFjayA9ICggU3RhY2tUeXBlX3QgKSAweDA5MDkwOTA5VUw7CQkJCS8qIFIwOSAqLworCQlweFRvcE9mU3RhY2stLTsKKwkJKnB4VG9wT2ZTdGFjayA9ICggU3RhY2tUeXBlX3QgKSAweDA4MDgwODA4VUw7CQkJCS8qIFIwOCAqLworCQlweFRvcE9mU3RhY2stLTsKKwkJKnB4VG9wT2ZTdGFjayA9ICggU3RhY2tUeXBlX3QgKSAweDA3MDcwNzA3VUw7CQkJCS8qIFIwNyAqLworCQlweFRvcE9mU3RhY2stLTsKKwkJKnB4VG9wT2ZTdGFjayA9ICggU3RhY2tUeXBlX3QgKSAweDA2MDYwNjA2VUw7CQkJCS8qIFIwNiAqLworCQlweFRvcE9mU3RhY2stLTsKKwkJKnB4VG9wT2ZTdGFjayA9ICggU3RhY2tUeXBlX3QgKSAweDA1MDUwNTA1VUw7CQkJCS8qIFIwNSAqLworCQlweFRvcE9mU3RhY2stLTsKKwkJKnB4VG9wT2ZTdGFjayA9ICggU3RhY2tUeXBlX3QgKSAweDA0MDQwNDA0VUw7CQkJCS8qIFIwNCAqLworCQlweFRvcE9mU3RhY2stLTsKKwkJKnB4VG9wT2ZTdGFjayA9IHBvcnRJTklUSUFMX0VYQ19SRVRVUk47CQkJCQkJLyogRVhDX1JFVFVSTiAqLworCisJCSNpZiggY29uZmlnRU5BQkxFX01QVSA9PSAxICkKKwkJeworCQkJcHhUb3BPZlN0YWNrLS07CisJCQlpZiggeFJ1blByaXZpbGVnZWQgPT0gcGRUUlVFICkKKwkJCXsKKwkJCQkqcHhUb3BPZlN0YWNrID0gcG9ydElOSVRJQUxfQ09OVFJPTF9QUklWSUxFR0VEOwkJLyogU2xvdCB1c2VkIHRvIGhvbGQgdGhpcyB0YXNrJ3MgQ09OVFJPTCB2YWx1ZS4gKi8KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkqcHhUb3BPZlN0YWNrID0gcG9ydElOSVRJQUxfQ09OVFJPTF9VTlBSSVZJTEVHRUQ7CS8qIFNsb3QgdXNlZCB0byBob2xkIHRoaXMgdGFzaydzIENPTlRST0wgdmFsdWUuICovCisJCQl9CisJCX0KKwkJI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9NUFUgKi8KKworCQlweFRvcE9mU3RhY2stLTsKKwkJKnB4VG9wT2ZTdGFjayA9ICggU3RhY2tUeXBlX3QgKSBweEVuZE9mU3RhY2s7CS8qIFNsb3QgdXNlZCB0byBob2xkIHRoaXMgdGFzaydzIFBTUExJTSB2YWx1ZS4gKi8KKworCQkjaWYoIGNvbmZpZ0VOQUJMRV9UUlVTVFpPTkUgPT0gMSApCisJCXsKKwkJCXB4VG9wT2ZTdGFjay0tOworCQkJKnB4VG9wT2ZTdGFjayA9IHBvcnROT19TRUNVUkVfQ09OVEVYVDsJCS8qIFNsb3QgdXNlZCB0byBob2xkIHRoaXMgdGFzaydzIHhTZWN1cmVDb250ZXh0IHZhbHVlLiAqLworCQl9CisJCSNlbmRpZiAvKiBjb25maWdFTkFCTEVfVFJVU1RaT05FICovCisJfQorCSNlbmRpZiAvKiBwb3J0UFJFTE9BRF9SRUdJU1RFUlMgKi8KKworCXJldHVybiBweFRvcE9mU3RhY2s7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworQmFzZVR5cGVfdCB4UG9ydFN0YXJ0U2NoZWR1bGVyKCB2b2lkICkgLyogUFJJVklMRUdFRF9GVU5DVElPTiAqLworeworCS8qIE1ha2UgUGVuZFNWLCBDYWxsU1YgYW5kIFN5c1RpY2sgdGhlIHNhbWUgcHJpb3JpdHkgYXMgdGhlIGtlcm5lbC4gKi8KKwkqKCBwb3J0TlZJQ19TWVNQUkkyICkgfD0gcG9ydE5WSUNfUEVORFNWX1BSSTsKKwkqKCBwb3J0TlZJQ19TWVNQUkkyICkgfD0gcG9ydE5WSUNfU1lTVElDS19QUkk7CisKKwkjaWYoIGNvbmZpZ0VOQUJMRV9NUFUgPT0gMSApCisJeworCQkvKiBTZXR1cCB0aGUgTWVtb3J5IFByb3RlY3Rpb24gVW5pdCAoTVBVKS4gKi8KKwkJcHJ2U2V0dXBNUFUoKTsKKwl9CisJI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9NUFUgKi8KKworCS8qIFN0YXJ0IHRoZSB0aW1lciB0aGF0IGdlbmVyYXRlcyB0aGUgdGljayBJU1IuIEludGVycnVwdHMgYXJlIGRpc2FibGVkCisJICogaGVyZSBhbHJlYWR5LiAqLworCXBydlNldHVwVGltZXJJbnRlcnJ1cHQoKTsKKworCS8qIEluaXRpYWxpemUgdGhlIGNyaXRpY2FsIG5lc3RpbmcgY291bnQgcmVhZHkgZm9yIHRoZSBmaXJzdCB0YXNrLiAqLworCXVsQ3JpdGljYWxOZXN0aW5nID0gMDsKKworCS8qIFN0YXJ0IHRoZSBmaXJzdCB0YXNrLiAqLworCXZTdGFydEZpcnN0VGFzaygpOworCisJLyogU2hvdWxkIG5ldmVyIGdldCBoZXJlIGFzIHRoZSB0YXNrcyB3aWxsIG5vdyBiZSBleGVjdXRpbmcuIENhbGwgdGhlIHRhc2sKKwkgKiBleGl0IGVycm9yIGZ1bmN0aW9uIHRvIHByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MgYWJvdXQgYSBzdGF0aWMgZnVuY3Rpb24KKwkgKiBub3QgYmVpbmcgY2FsbGVkIGluIHRoZSBjYXNlIHRoYXQgdGhlIGFwcGxpY2F0aW9uIHdyaXRlciBvdmVycmlkZXMgdGhpcworCSAqIGZ1bmN0aW9uYWxpdHkgYnkgZGVmaW5pbmcgY29uZmlnVEFTS19SRVRVUk5fQUREUkVTUy4gQ2FsbAorCSAqIHZUYXNrU3dpdGNoQ29udGV4dCgpIHNvIGxpbmsgdGltZSBvcHRpbWl6YXRpb24gZG9lcyBub3QgcmVtb3ZlIHRoZQorCSAqIHN5bWJvbC4gKi8KKwl2VGFza1N3aXRjaENvbnRleHQoKTsKKwlwcnZUYXNrRXhpdEVycm9yKCk7CisKKwkvKiBTaG91bGQgbm90IGdldCBoZXJlLiAqLworCXJldHVybiAwOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgdlBvcnRFbmRTY2hlZHVsZXIoIHZvaWQgKSAvKiBQUklWSUxFR0VEX0ZVTkNUSU9OICovCit7CisJLyogTm90IGltcGxlbWVudGVkIGluIHBvcnRzIHdoZXJlIHRoZXJlIGlzIG5vdGhpbmcgdG8gcmV0dXJuIHRvLgorCSAqIEFydGlmaWNpYWxseSBmb3JjZSBhbiBhc3NlcnQuICovCisJY29uZmlnQVNTRVJUKCB1bENyaXRpY2FsTmVzdGluZyA9PSAxMDAwVUwgKTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYoIGNvbmZpZ0VOQUJMRV9NUFUgPT0gMSApCisJdm9pZCB2UG9ydFN0b3JlVGFza01QVVNldHRpbmdzKCB4TVBVX1NFVFRJTkdTICp4TVBVU2V0dGluZ3MsIGNvbnN0IHN0cnVjdCB4TUVNT1JZX1JFR0lPTiAqIGNvbnN0IHhSZWdpb25zLCBTdGFja1R5cGVfdCAqcHhCb3R0b21PZlN0YWNrLCB1aW50MzJfdCB1bFN0YWNrRGVwdGggKQorCXsKKwl1aW50MzJfdCB1bFJlZ2lvblN0YXJ0QWRkcmVzcywgdWxSZWdpb25FbmRBZGRyZXNzLCB1bFJlZ2lvbk51bWJlcjsKKwlpbnQzMl90IGxJbmRleCA9IDA7CisKKwkJLyogU2V0dXAgTUFJUjAuICovCisJCXhNUFVTZXR0aW5ncy0+dWxNQUlSMCA9ICggKCBwb3J0TVBVX05PUk1BTF9NRU1PUllfQlVGRkVSQUJMRV9DQUNIRUFCTEUgPDwgcG9ydE1QVV9NQUlSX0FUVFIwX1BPUyApICYgcG9ydE1QVV9NQUlSX0FUVFIwX01BU0sgKTsKKwkJeE1QVVNldHRpbmdzLT51bE1BSVIwIHw9ICggKCBwb3J0TVBVX0RFVklDRV9NRU1PUllfbkduUkUgPDwgcG9ydE1QVV9NQUlSX0FUVFIxX1BPUyApICYgcG9ydE1QVV9NQUlSX0FUVFIxX01BU0sgKTsKKworCQkvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlIHRhc2sgaXMgY3JlYXRlZCAtIGluCisJCSAqIHdoaWNoIGNhc2UgdGhlIHN0YWNrIHJlZ2lvbiBwYXJhbWV0ZXJzIHdpbGwgYmUgdmFsaWQuICBBdCBhbGwgb3RoZXIKKwkJICogdGltZXMgdGhlIHN0YWNrIHBhcmFtZXRlcnMgd2lsbCBub3QgYmUgdmFsaWQgYW5kIGl0IGlzIGFzc3VtZWQgdGhhdAorCQkgKiB0aGUgc3RhY2sgcmVnaW9uIGhhcyBhbHJlYWR5IGJlZW4gY29uZmlndXJlZC4gKi8KKwkJaWYoIHVsU3RhY2tEZXB0aCA+IDAgKQorCQl7CisJCQkvKiBEZWZpbmUgdGhlIHJlZ2lvbiB0aGF0IGFsbG93cyBhY2Nlc3MgdG8gdGhlIHN0YWNrLiAqLworCQkJdWxSZWdpb25TdGFydEFkZHJlc3MgPSAoICggdWludDMyX3QgKSBweEJvdHRvbU9mU3RhY2sgKSAmIHBvcnRNUFVfUkJBUl9BRERSRVNTX01BU0s7CisJCQl1bFJlZ2lvbkVuZEFkZHJlc3MgPSAoIHVpbnQzMl90ICkgcHhCb3R0b21PZlN0YWNrICsgKCB1bFN0YWNrRGVwdGggKiAoIHVpbnQzMl90ICkgc2l6ZW9mKCBTdGFja1R5cGVfdCApICkgLSAxOworCQkJdWxSZWdpb25FbmRBZGRyZXNzICAmPSBwb3J0TVBVX1JMQVJfQUREUkVTU19NQVNLOworCisJCQl4TVBVU2V0dGluZ3MtPnhSZWdpb25zU2V0dGluZ3NbIDAgXS51bFJCQVIgPQkoIHVsUmVnaW9uU3RhcnRBZGRyZXNzICkgfAorCQkJCQkJCQkJCQkJCQkJKCBwb3J0TVBVX1JFR0lPTl9OT05fU0hBUkVBQkxFICkgfAorCQkJCQkJCQkJCQkJCQkJKCBwb3J0TVBVX1JFR0lPTl9SRUFEX1dSSVRFICkgfAorCQkJCQkJCQkJCQkJCQkJKCBwb3J0TVBVX1JFR0lPTl9FWEVDVVRFX05FVkVSICk7CisKKwkJCXhNUFVTZXR0aW5ncy0+eFJlZ2lvbnNTZXR0aW5nc1sgMCBdLnVsUkxBUiA9CSggdWxSZWdpb25FbmRBZGRyZXNzICkgfAorCQkJCQkJCQkJCQkJCQkJKCBwb3J0TVBVX1JMQVJfQVRUUl9JTkRFWDAgKSB8CisJCQkJCQkJCQkJCQkJCQkoIHBvcnRNUFVfUkxBUl9SRUdJT05fRU5BQkxFICk7CisJCX0KKworCQkvKiBVc2VyIHN1cHBsaWVkIGNvbmZpZ3VyYWJsZSByZWdpb25zLiAqLworCQlmb3IoIHVsUmVnaW9uTnVtYmVyID0gMTsgdWxSZWdpb25OdW1iZXIgPD0gcG9ydE5VTV9DT05GSUdVUkFCTEVfUkVHSU9OUzsgdWxSZWdpb25OdW1iZXIrKyApCisJCXsKKwkJCS8qIElmIHhSZWdpb25zIGlzIE5VTEwgaS5lLiB0aGUgdGFzayBoYXMgbm90IHNwZWNpZmllZCBhbnkgTVBVCisJCQkgKiByZWdpb24sIHRoZSBlbHNlIHBhcnQgZW5zdXJlcyB0aGF0IGFsbCB0aGUgY29uZmlndXJhYmxlIE1QVQorCQkJICogcmVnaW9ucyBhcmUgaW52YWxpZGF0ZWQuICovCisJCQlpZiggKCB4UmVnaW9ucyAhPSBOVUxMICkgJiYgKCB4UmVnaW9uc1sgbEluZGV4IF0udWxMZW5ndGhJbkJ5dGVzID4gMFVMICkgKQorCQkJeworCQkJCS8qIFRyYW5zbGF0ZSB0aGUgZ2VuZXJpYyByZWdpb24gZGVmaW5pdGlvbiBjb250YWluZWQgaW4geFJlZ2lvbnMKKwkJCQkgKiBpbnRvIHRoZSBBUk12OCBzcGVjaWZpYyBNUFUgc2V0dGluZ3MgdGhhdCBhcmUgdGhlbiBzdG9yZWQgaW4KKwkJCQkgKiB4TVBVU2V0dGluZ3MuICovCisJCQkJdWxSZWdpb25TdGFydEFkZHJlc3MgPSAoICggdWludDMyX3QgKSB4UmVnaW9uc1sgbEluZGV4IF0ucHZCYXNlQWRkcmVzcyApICYgcG9ydE1QVV9SQkFSX0FERFJFU1NfTUFTSzsKKwkJCQl1bFJlZ2lvbkVuZEFkZHJlc3MgPSAoIHVpbnQzMl90ICkgeFJlZ2lvbnNbIGxJbmRleCBdLnB2QmFzZUFkZHJlc3MgKyB4UmVnaW9uc1sgbEluZGV4IF0udWxMZW5ndGhJbkJ5dGVzIC0gMTsKKwkJCQl1bFJlZ2lvbkVuZEFkZHJlc3MgICY9IHBvcnRNUFVfUkxBUl9BRERSRVNTX01BU0s7CisKKwkJCQkvKiBTdGFydCBhZGRyZXNzLiAqLworCQkJCXhNUFVTZXR0aW5ncy0+eFJlZ2lvbnNTZXR0aW5nc1sgdWxSZWdpb25OdW1iZXIgXS51bFJCQVIgPQkoIHVsUmVnaW9uU3RhcnRBZGRyZXNzICkgfAorCQkJCQkJCQkJCQkJCQkJCQkJCSggcG9ydE1QVV9SRUdJT05fTk9OX1NIQVJFQUJMRSApOworCisJCQkJLyogUk8vUlcuICovCisJCQkJaWYoICggeFJlZ2lvbnNbIGxJbmRleCBdLnVsUGFyYW1ldGVycyAmIHRza01QVV9SRUdJT05fUkVBRF9PTkxZICkgIT0gMCApCisJCQkJeworCQkJCQl4TVBVU2V0dGluZ3MtPnhSZWdpb25zU2V0dGluZ3NbIHVsUmVnaW9uTnVtYmVyIF0udWxSQkFSIHw9ICggcG9ydE1QVV9SRUdJT05fUkVBRF9PTkxZICk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCXhNUFVTZXR0aW5ncy0+eFJlZ2lvbnNTZXR0aW5nc1sgdWxSZWdpb25OdW1iZXIgXS51bFJCQVIgfD0gKCBwb3J0TVBVX1JFR0lPTl9SRUFEX1dSSVRFICk7CisJCQkJfQorCisJCQkJLyogWE4uICovCisJCQkJaWYoICggeFJlZ2lvbnNbIGxJbmRleCBdLnVsUGFyYW1ldGVycyAmIHRza01QVV9SRUdJT05fRVhFQ1VURV9ORVZFUiApICE9IDAgKQorCQkJCXsKKwkJCQkJeE1QVVNldHRpbmdzLT54UmVnaW9uc1NldHRpbmdzWyB1bFJlZ2lvbk51bWJlciBdLnVsUkJBUiB8PSAoIHBvcnRNUFVfUkVHSU9OX0VYRUNVVEVfTkVWRVIgKTsKKwkJCQl9CisKKwkJCQkvKiBFbmQgQWRkcmVzcy4gKi8KKwkJCQl4TVBVU2V0dGluZ3MtPnhSZWdpb25zU2V0dGluZ3NbIHVsUmVnaW9uTnVtYmVyIF0udWxSTEFSID0JKCB1bFJlZ2lvbkVuZEFkZHJlc3MgKSB8CisJCQkJCQkJCQkJCQkJCQkJCQkJKCBwb3J0TVBVX1JMQVJfUkVHSU9OX0VOQUJMRSApOworCisJCQkJLyogTm9ybWFsIG1lbW9yeS8gRGV2aWNlIG1lbW9yeS4gKi8KKwkJCQlpZiggKCB4UmVnaW9uc1sgbEluZGV4IF0udWxQYXJhbWV0ZXJzICYgdHNrTVBVX1JFR0lPTl9ERVZJQ0VfTUVNT1JZICkgIT0gMCApCisJCQkJeworCQkJCQkvKiBBdHRyMSBpbiBNQUlSMCBpcyBjb25maWd1cmVkIGFzIGRldmljZSBtZW1vcnkuICovCisJCQkJCXhNUFVTZXR0aW5ncy0+eFJlZ2lvbnNTZXR0aW5nc1sgdWxSZWdpb25OdW1iZXIgXS51bFJMQVIgfD0gcG9ydE1QVV9STEFSX0FUVFJfSU5ERVgxOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQkvKiBBdHRyMSBpbiBNQUlSMCBpcyBjb25maWd1cmVkIGFzIG5vcm1hbCBtZW1vcnkuICovCisJCQkJCXhNUFVTZXR0aW5ncy0+eFJlZ2lvbnNTZXR0aW5nc1sgdWxSZWdpb25OdW1iZXIgXS51bFJMQVIgfD0gcG9ydE1QVV9STEFSX0FUVFJfSU5ERVgwOworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkvKiBJbnZhbGlkYXRlIHRoZSByZWdpb24uICovCisJCQkJeE1QVVNldHRpbmdzLT54UmVnaW9uc1NldHRpbmdzWyB1bFJlZ2lvbk51bWJlciBdLnVsUkJBUiA9IDBVTDsKKwkJCQl4TVBVU2V0dGluZ3MtPnhSZWdpb25zU2V0dGluZ3NbIHVsUmVnaW9uTnVtYmVyIF0udWxSTEFSID0gMFVMOworCQkJfQorCisJCQlsSW5kZXgrKzsKKwkJfQorCX0KKyNlbmRpZiAvKiBjb25maWdFTkFCTEVfTVBVICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KZGlmZiAtLWdpdCBhL1NvdXJjZS9wb3J0YWJsZS9HQ0MvQVJNX0NNMjMvbm9uX3NlY3VyZS9wb3J0YXNtLmMgYi9Tb3VyY2UvcG9ydGFibGUvR0NDL0FSTV9DTTIzL25vbl9zZWN1cmUvcG9ydGFzbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4MzQ1YzcKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvcG9ydGFibGUvR0NDL0FSTV9DTTIzL25vbl9zZWN1cmUvcG9ydGFzbS5jCkBAIC0wLDAgKzEsNDY4IEBACisvKgorICogRnJlZVJUT1MgS2VybmVsIFYxMC4yLjEKKyAqIENvcHlyaWdodCAoQykgMjAxOSBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCisgKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgorICogdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bworICogdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YKKyAqIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKKyAqIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAorICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MKKyAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUgorICogQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSCisgKiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBodHRwOi8vd3d3LkZyZWVSVE9TLm9yZworICogaHR0cDovL2F3cy5hbWF6b24uY29tL2ZyZWVydG9zCisgKgorICogMSB0YWIgPT0gNCBzcGFjZXMhCisgKi8KKworLyogU3RhbmRhcmQgaW5jbHVkZXMuICovCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8qIERlZmluaW5nIE1QVV9XUkFQUEVSU19JTkNMVURFRF9GUk9NX0FQSV9GSUxFIGVuc3VyZXMgdGhhdCBQUklWSUxFR0VEX0ZVTkNUSU9OCisgKiBpcyBkZWZpbmVkIGNvcnJlY3RseSBhbmQgcHJpdmlsZWdlZCBmdW5jdGlvbnMgYXJlIHBsYWNlZCBpbiBjb3JyZWN0IHNlY3Rpb25zLiAqLworI2RlZmluZSBNUFVfV1JBUFBFUlNfSU5DTFVERURfRlJPTV9BUElfRklMRQorCisvKiBQb3J0YXNtIGluY2x1ZGVzLiAqLworI2luY2x1ZGUgInBvcnRhc20uaCIKKworLyogTVBVX1dSQVBQRVJTX0lOQ0xVREVEX0ZST01fQVBJX0ZJTEUgaXMgbmVlZGVkIHRvIGJlIGRlZmluZWQgb25seSBmb3IgdGhlCisgKiBoZWFkZXIgZmlsZXMuICovCisjdW5kZWYgTVBVX1dSQVBQRVJTX0lOQ0xVREVEX0ZST01fQVBJX0ZJTEUKKworI2lmKCBjb25maWdFTkFCTEVfRlBVID09IDEgKQorCSNlcnJvciBDb3J0ZXgtTTIzIGRvZXMgbm90IGhhdmUgYSBGbG9hdGluZyBQb2ludCBVbml0IChGUFUpIGFuZCB0aGVyZWZvcmUgY29uZmlnRU5BQkxFX0ZQVSBtdXN0IGJlIHNldCB0byAwLgorI2VuZGlmCisKK3ZvaWQgdlJlc3RvcmVDb250ZXh0T2ZGaXJzdFRhc2soIHZvaWQgKSAvKiBfX2F0dHJpYnV0ZV9fICgoIG5ha2VkICkpIFBSSVZJTEVHRURfRlVOQ1RJT04gKi8KK3sKKwlfX2FzbSB2b2xhdGlsZQorCSgKKwkiCS5zeW50YXggdW5pZmllZAkJCQkJCQkJCVxuIgorCSIJCQkJCQkJCQkJCQkJXG4iCisJIglsZHIgIHIyLCBweEN1cnJlbnRUQ0JDb25zdDIJCQkJCQlcbiIgLyogUmVhZCB0aGUgbG9jYXRpb24gb2YgcHhDdXJyZW50VENCIGkuZS4gJiggcHhDdXJyZW50VENCICkuICovCisJIglsZHIgIHIzLCBbcjJdCQkJCQkJCQkJXG4iIC8qIFJlYWQgcHhDdXJyZW50VENCLiAqLworCSIJbGRyICByMCwgW3IzXQkJCQkJCQkJCVxuIiAvKiBSZWFkIHRvcCBvZiBzdGFjayBmcm9tIFRDQiAtIFRoZSBmaXJzdCBpdGVtIGluIHB4Q3VycmVudFRDQiBpcyB0aGUgdGFzayB0b3Agb2Ygc3RhY2suICovCisJIgkJCQkJCQkJCQkJCQlcbiIKKwkjaWYoIGNvbmZpZ0VOQUJMRV9NUFUgPT0gMSApCisJIglkbWIJCQkJCQkJCQkJCQlcbiIgLyogQ29tcGxldGUgb3V0c3RhbmRpbmcgdHJhbnNmZXJzIGJlZm9yZSBkaXNhYmxpbmcgTVBVLiAqLworCSIJbGRyIHIyLCB4TVBVQ1RSTENvbnN0MgkJCQkJCQlcbiIgLyogcjIgPSAweGUwMDBlZDk0IFtMb2NhdGlvbiBvZiBNUFVfQ1RSTF0uICovCisJIglsZHIgcjQsIFtyMl0JCQkJCQkJCQlcbiIgLyogUmVhZCB0aGUgdmFsdWUgb2YgTVBVX0NUUkwuICovCisJIgltb3ZzIHI1LCAjMQkJCQkJCQkJCQlcbiIgLyogcjUgPSAxLiAqLworCSIJYmljcyByNCwgcjUJCQkJCQkJCQkJXG4iIC8qIHI0ID0gcjQgJiB+cjUgaS5lLiBDbGVhciB0aGUgYml0IDAgaW4gcjQuICovCisJIglzdHIgcjQsIFtyMl0JCQkJCQkJCQlcbiIgLyogRGlzYWJsZSBNUFUuICovCisJIgkJCQkJCQkJCQkJCQlcbiIKKwkiCWFkZHMgcjMsICM0CQkJCQkJCQkJCVxuIiAvKiByMyA9IHIzICsgNC4gcjMgbm93IHBvaW50cyB0byBNQUlSMCBpbiBUQ0IuICovCisJIglsZHIgIHI0LCBbcjNdCQkJCQkJCQkJXG4iIC8qIHI0ID0gKnIzIGkuZS4gcjQgPSBNQUlSMC4gKi8KKwkiCWxkciAgcjIsIHhNQUlSMENvbnN0MgkJCQkJCQlcbiIgLyogcjIgPSAweGUwMDBlZGMwIFtMb2NhdGlvbiBvZiBNQUlSMF0uICovCisJIglzdHIgIHI0LCBbcjJdCQkJCQkJCQkJXG4iIC8qIFByb2dyYW0gTUFJUjAuICovCisJIglsZHIgIHIyLCB4Uk5SQ29uc3QyCQkJCQkJCQlcbiIgLyogcjIgPSAweGUwMDBlZDk4IFtMb2NhdGlvbiBvZiBSTlJdLiAqLworCSIJYWRkcyByMywgIzQJCQkJCQkJCQkJXG4iIC8qIHIzID0gcjMgKyA0LiByMyBub3cgcG9pbnRzIHRvIGZpcnN0IFJCQVIgaW4gVENCLiAqLworCSIJbW92cyByNSwgIzQJCQkJCQkJCQkJXG4iIC8qIHI1ID0gNC4gKi8KKwkiCXN0ciAgcjUsIFtyMl0JCQkJCQkJCQlcbiIgLyogUHJvZ3JhbSBSTlIgPSA0LiAqLworCSIJbGRtaWEgcjMhLCB7cjYscjd9CQkJCQkJCQlcbiIgLyogUmVhZCBmaXJzdCBzZXQgb2YgUkJBUi9STEFSIGZyb20gVENCLiAqLworCSIJbGRyICByNCwgeFJCQVJDb25zdDIJCQkJCQkJXG4iIC8qIHI0ID0gMHhlMDAwZWQ5YyBbTG9jYXRpb24gb2YgUkJBUl0uICovCisJIglzdG1pYSByNCEsIHtyNixyN30JCQkJCQkJCVxuIiAvKiBXcml0ZSBmaXJzdCBzZXQgb2YgUkJBUi9STEFSIHJlZ2lzdGVycy4gKi8KKwkiCW1vdnMgcjUsICM1CQkJCQkJCQkJCVxuIiAvKiByNSA9IDUuICovCisJIglzdHIgIHI1LCBbcjJdCQkJCQkJCQkJXG4iIC8qIFByb2dyYW0gUk5SID0gNS4gKi8KKwkiCWxkbWlhIHIzISwge3I2LHI3fQkJCQkJCQkJXG4iIC8qIFJlYWQgc2Vjb25kIHNldCBvZiBSQkFSL1JMQVIgZnJvbSBUQ0IuICovCisJIglsZHIgIHI0LCB4UkJBUkNvbnN0MgkJCQkJCQlcbiIgLyogcjQgPSAweGUwMDBlZDljIFtMb2NhdGlvbiBvZiBSQkFSXS4gKi8KKwkiCXN0bWlhIHI0ISwge3I2LHI3fQkJCQkJCQkJXG4iIC8qIFdyaXRlIHNlY29uZCBzZXQgb2YgUkJBUi9STEFSIHJlZ2lzdGVycy4gKi8KKwkiCW1vdnMgcjUsICM2CQkJCQkJCQkJCVxuIiAvKiByNSA9IDYuICovCisJIglzdHIgIHI1LCBbcjJdCQkJCQkJCQkJXG4iIC8qIFByb2dyYW0gUk5SID0gNi4gKi8KKwkiCWxkbWlhIHIzISwge3I2LHI3fQkJCQkJCQkJXG4iIC8qIFJlYWQgdGhpcmQgc2V0IG9mIFJCQVIvUkxBUiBmcm9tIFRDQi4gKi8KKwkiCWxkciAgcjQsIHhSQkFSQ29uc3QyCQkJCQkJCVxuIiAvKiByNCA9IDB4ZTAwMGVkOWMgW0xvY2F0aW9uIG9mIFJCQVJdLiAqLworCSIJc3RtaWEgcjQhLCB7cjYscjd9CQkJCQkJCQlcbiIgLyogV3JpdGUgdGhpcmQgc2V0IG9mIFJCQVIvUkxBUiByZWdpc3RlcnMuICovCisJIgltb3ZzIHI1LCAjNwkJCQkJCQkJCQlcbiIgLyogcjUgPSA3LiAqLworCSIJc3RyICByNSwgW3IyXQkJCQkJCQkJCVxuIiAvKiBQcm9ncmFtIFJOUiA9IDcuICovCisJIglsZG1pYSByMyEsIHtyNixyN30JCQkJCQkJCVxuIiAvKiBSZWFkIGZvdXJ0aCBzZXQgb2YgUkJBUi9STEFSIGZyb20gVENCLiAqLworCSIJbGRyICByNCwgeFJCQVJDb25zdDIJCQkJCQkJXG4iIC8qIHI0ID0gMHhlMDAwZWQ5YyBbTG9jYXRpb24gb2YgUkJBUl0uICovCisJIglzdG1pYSByNCEsIHtyNixyN30JCQkJCQkJCVxuIiAvKiBXcml0ZSBmb3VydGggc2V0IG9mIFJCQVIvUkxBUiByZWdpc3RlcnMuICovCisJIgkJCQkJCQkJCQkJCQlcbiIKKwkiCWxkciByMiwgeE1QVUNUUkxDb25zdDIJCQkJCQkJXG4iIC8qIHIyID0gMHhlMDAwZWQ5NCBbTG9jYXRpb24gb2YgTVBVX0NUUkxdLiAqLworCSIJbGRyIHI0LCBbcjJdCQkJCQkJCQkJXG4iIC8qIFJlYWQgdGhlIHZhbHVlIG9mIE1QVV9DVFJMLiAqLworCSIJbW92cyByNSwgIzEJCQkJCQkJCQkJXG4iIC8qIHI1ID0gMS4gKi8KKwkiCW9ycnMgcjQsIHI1CQkJCQkJCQkJCVxuIiAvKiByNCA9IHI0IHwgcjUgaS5lLiBTZXQgdGhlIGJpdCAwIGluIHI0LiAqLworCSIJc3RyIHI0LCBbcjJdCQkJCQkJCQkJXG4iIC8qIEVuYWJsZSBNUFUuICovCisJIglkc2IJCQkJCQkJCQkJCQlcbiIgLyogRm9yY2UgbWVtb3J5IHdyaXRlcyBiZWZvcmUgY29udGludWluZy4gKi8KKwkjZW5kaWYgLyogY29uZmlnRU5BQkxFX01QVSAqLworCSIJCQkJCQkJCQkJCQkJXG4iCisJI2lmKCBjb25maWdFTkFCTEVfTVBVID09IDEgKQorCSIJbGRtICByMCEsIHtyMS1yNH0JCQkJCQkJCVxuIiAvKiBSZWFkIGZyb20gc3RhY2sgLSByMSA9IHhTZWN1cmVDb250ZXh0LCByMiA9IFBTUExJTSwgcjMgPSBDT05UUk9MIGFuZCByNCA9IEVYQ19SRVRVUk4uICovCisJIglsZHIgIHI1LCB4U2VjdXJlQ29udGV4dENvbnN0MgkJCQkJXG4iCisJIglzdHIgIHIxLCBbcjVdCQkJCQkJCQkJXG4iIC8qIFNldCB4U2VjdXJlQ29udGV4dCB0byB0aGlzIHRhc2sncyB2YWx1ZSBmb3IgdGhlIHNhbWUuICovCisJIgltc3IgIHBzcGxpbSwgcjIJCQkJCQkJCQlcbiIgLyogU2V0IHRoaXMgdGFzaydzIFBTUExJTSB2YWx1ZS4gKi8KKwkiCW1zciAgY29udHJvbCwgcjMJCQkJCQkJCVxuIiAvKiBTZXQgdGhpcyB0YXNrJ3MgQ09OVFJPTCB2YWx1ZS4gKi8KKwkiCWFkZHMgcjAsICMzMgkJCQkJCQkJCVxuIiAvKiBEaXNjYXJkIGV2ZXJ5dGhpbmcgdXAgdG8gcjAuICovCisJIgltc3IgIHBzcCwgcjAJCQkJCQkJCQlcbiIgLyogVGhpcyBpcyBub3cgdGhlIG5ldyB0b3Agb2Ygc3RhY2sgdG8gdXNlIGluIHRoZSB0YXNrLiAqLworCSIJaXNiCQkJCQkJCQkJCQkJXG4iCisJIglieCAgIHI0CQkJCQkJCQkJCQlcbiIgLyogRmluYWxseSwgYnJhbmNoIHRvIEVYQ19SRVRVUk4uICovCisJI2Vsc2UgLyogY29uZmlnRU5BQkxFX01QVSAqLworCSIJbGRtICByMCEsIHtyMS1yM30JCQkJCQkJCVxuIiAvKiBSZWFkIGZyb20gc3RhY2sgLSByMSA9IHhTZWN1cmVDb250ZXh0LCByMiA9IFBTUExJTSBhbmQgcjMgPSBFWENfUkVUVVJOLiAqLworCSIJbGRyICByNCwgeFNlY3VyZUNvbnRleHRDb25zdDIJCQkJCVxuIgorCSIJc3RyICByMSwgW3I0XQkJCQkJCQkJCVxuIiAvKiBTZXQgeFNlY3VyZUNvbnRleHQgdG8gdGhpcyB0YXNrJ3MgdmFsdWUgZm9yIHRoZSBzYW1lLiAqLworCSIJbXNyICBwc3BsaW0sIHIyCQkJCQkJCQkJXG4iIC8qIFNldCB0aGlzIHRhc2sncyBQU1BMSU0gdmFsdWUuICovCisJIgltb3ZzIHIxLCAjMgkJCQkJCQkJCQlcbiIgLyogcjEgPSAyLiAqLworCSIJbXNyICBDT05UUk9MLCByMQkJCQkJCQkJXG4iIC8qIFN3aXRjaCB0byB1c2UgUFNQIGluIHRoZSB0aHJlYWQgbW9kZS4gKi8KKwkiCWFkZHMgcjAsICMzMgkJCQkJCQkJCVxuIiAvKiBEaXNjYXJkIGV2ZXJ5dGhpbmcgdXAgdG8gcjAuICovCisJIgltc3IgIHBzcCwgcjAJCQkJCQkJCQlcbiIgLyogVGhpcyBpcyBub3cgdGhlIG5ldyB0b3Agb2Ygc3RhY2sgdG8gdXNlIGluIHRoZSB0YXNrLiAqLworCSIJaXNiCQkJCQkJCQkJCQkJXG4iCisJIglieCAgIHIzCQkJCQkJCQkJCQlcbiIgLyogRmluYWxseSwgYnJhbmNoIHRvIEVYQ19SRVRVUk4uICovCisJI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9NUFUgKi8KKwkiCQkJCQkJCQkJCQkJCVxuIgorCSIJLmFsaWduIDQJCQkJCQkJCQkJXG4iCisJInB4Q3VycmVudFRDQkNvbnN0MjogLndvcmQgcHhDdXJyZW50VENCCQkJCVxuIgorCSJ4U2VjdXJlQ29udGV4dENvbnN0MjogLndvcmQgeFNlY3VyZUNvbnRleHQJCQlcbiIKKwkjaWYoIGNvbmZpZ0VOQUJMRV9NUFUgPT0gMSApCisJInhNUFVDVFJMQ29uc3QyOiAud29yZCAweGUwMDBlZDk0CQkJCQlcbiIKKwkieE1BSVIwQ29uc3QyOiAud29yZCAweGUwMDBlZGMwCQkJCQkJXG4iCisJInhSTlJDb25zdDI6IC53b3JkIDB4ZTAwMGVkOTgJCQkJCQlcbiIKKwkieFJCQVJDb25zdDI6IC53b3JkIDB4ZTAwMGVkOWMJCQkJCQlcbiIKKwkjZW5kaWYgLyogY29uZmlnRU5BQkxFX01QVSAqLworCSk7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworQmFzZVR5cGVfdCB4SXNQcml2aWxlZ2VkKCB2b2lkICkgLyogX19hdHRyaWJ1dGVfXyAoKCBuYWtlZCApKSAqLworeworCV9fYXNtIHZvbGF0aWxlCisJKAorCSIJbXJzIHIwLCBjb250cm9sCQkJCQkJCQkJXG4iIC8qIHIwID0gQ09OVFJPTC4gKi8KKwkiCW1vdnMgcjEsICMxCQkJCQkJCQkJCVxuIiAvKiByMSA9IDEuICovCisJIgl0c3QgcjAsIHIxCQkJCQkJCQkJCVxuIiAvKiBQZXJmb3JtIHIwICYgcjEgKGJpdHdpc2UgQU5EKSBhbmQgdXBkYXRlIHRoZSBjb25kaXRpb25zIGZsYWcuICovCisJIgliZXEgcnVubmluZ19wcml2aWxlZ2VkCQkJCQkJCVxuIiAvKiBJZiB0aGUgcmVzdWx0IG9mIHByZXZpb3VzIEFORCBvcGVyYXRpb24gd2FzIDAsIGJyYW5jaC4gKi8KKwkiCW1vdnMgcjAsICMwCQkJCQkJCQkJCVxuIiAvKiBDT05UUk9MWzBdIT0wLiBSZXR1cm4gZmFsc2UgdG8gaW5kaWNhdGUgdGhhdCB0aGUgcHJvY2Vzc29yIGlzIG5vdCBwcml2aWxlZ2VkLiAqLworCSIJYnggbHIJCQkJCQkJCQkJCVxuIiAvKiBSZXR1cm4uICovCisJIiBydW5uaW5nX3ByaXZpbGVnZWQ6CQkJCQkJCQlcbiIKKwkiCW1vdnMgcjAsICMxCQkJCQkJCQkJCVxuIiAvKiBDT05UUk9MWzBdPT0wLiBSZXR1cm4gdHJ1ZSB0byBpbmRpY2F0ZSB0aGF0IHRoZSBwcm9jZXNzb3IgaXMgcHJpdmlsZWdlZC4gKi8KKwkiCWJ4IGxyCQkJCQkJCQkJCQlcbiIgLyogUmV0dXJuLiAqLworCSIJCQkJCQkJCQkJCQkJXG4iCisJIgkuYWxpZ24gNAkJCQkJCQkJCQlcbiIKKwk6OjogInIwIiwgInIxIiwgIm1lbW9yeSIKKwkpOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgdlJhaXNlUHJpdmlsZWdlKCB2b2lkICkgLyogX19hdHRyaWJ1dGVfXyAoKCBuYWtlZCApKSBQUklWSUxFR0VEX0ZVTkNUSU9OICovCit7CisJIF9fYXNtIHZvbGF0aWxlCisJKAorCSIJbXJzIHIwLCBjb250cm9sCQkJCQkJCQkJXG4iIC8qIFJlYWQgdGhlIENPTlRST0wgcmVnaXN0ZXIuICovCisJIgltb3ZzIHIxLCAjMQkJCQkJCQkJCQlcbiIgLyogcjEgPSAxLiAqLworCSIJYmljcyByMCwgcjEJCQkJCQkJCQkJXG4iIC8qIENsZWFyIHRoZSBiaXQgMC4gKi8KKwkiCW1zciBjb250cm9sLCByMAkJCQkJCQkJCVxuIiAvKiBXcml0ZSBiYWNrIHRoZSBuZXcgQ09OVFJPTCB2YWx1ZS4gKi8KKwkiCWJ4IGxyCQkJCQkJCQkJCQlcbiIgLyogUmV0dXJuIHRvIHRoZSBjYWxsZXIuICovCisJOjo6ICJyMCIsICJyMSIsICJtZW1vcnkiCisJKTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIHZSZXNldFByaXZpbGVnZSggdm9pZCApIC8qIF9fYXR0cmlidXRlX18gKCggbmFrZWQgKSkgKi8KK3sKKwlfX2FzbSB2b2xhdGlsZQorCSgKKwkiCW1ycyByMCwgY29udHJvbAkJCQkJCQkJCVxuIiAvKiByMCA9IENPTlRST0wuICovCisJIgltb3ZzIHIxLCAjMQkJCQkJCQkJCQlcbiIgLyogcjEgPSAxLiAqLworCSIJb3JycyByMCwgcjEJCQkJCQkJCQkJXG4iIC8qIHIwID0gcjAgfCByMS4gKi8KKwkiCW1zciBjb250cm9sLCByMAkJCQkJCQkJCVxuIiAvKiBDT05UUk9MID0gcjAuICovCisJIglieCBscgkJCQkJCQkJCQkJXG4iIC8qIFJldHVybiB0byB0aGUgY2FsbGVyLiAqLworCTo6OiJyMCIsICJyMSIsICJtZW1vcnkiCisJKTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIHZTdGFydEZpcnN0VGFzayggdm9pZCApIC8qIF9fYXR0cmlidXRlX18gKCggbmFrZWQgKSkgUFJJVklMRUdFRF9GVU5DVElPTiAqLworeworCV9fYXNtIHZvbGF0aWxlCisJKAorCSIJbGRyIHIwLCB4VlRPUkNvbnN0CQkJCQkJCQlcbiIgLyogVXNlIHRoZSBOVklDIG9mZnNldCByZWdpc3RlciB0byBsb2NhdGUgdGhlIHN0YWNrLiAqLworCSIJbGRyIHIwLCBbcjBdCQkJCQkJCQkJXG4iIC8qIFJlYWQgdGhlIFZUT1IgcmVnaXN0ZXIgd2hpY2ggZ2l2ZXMgdGhlIGFkZHJlc3Mgb2YgdmVjdG9yIHRhYmxlLiAqLworCSIJbGRyIHIwLCBbcjBdCQkJCQkJCQkJXG4iIC8qIFRoZSBmaXJzdCBlbnRyeSBpbiB2ZWN0b3IgdGFibGUgaXMgc3RhY2sgcG9pbnRlci4gKi8KKwkiCW1zciBtc3AsIHIwCQkJCQkJCQkJCVxuIiAvKiBTZXQgdGhlIE1TUCBiYWNrIHRvIHRoZSBzdGFydCBvZiB0aGUgc3RhY2suICovCisJIgljcHNpZSBpCQkJCQkJCQkJCQlcbiIgLyogR2xvYmFsbHkgZW5hYmxlIGludGVycnVwdHMuICovCisJIglkc2IJCQkJCQkJCQkJCQlcbiIKKwkiCWlzYgkJCQkJCQkJCQkJCVxuIgorCSIJc3ZjICUwCQkJCQkJCQkJCQlcbiIgLyogU3lzdGVtIGNhbGwgdG8gc3RhcnQgdGhlIGZpcnN0IHRhc2suICovCisJIglub3AJCQkJCQkJCQkJCQlcbiIKKwkiCQkJCQkJCQkJCQkJCVxuIgorCSIgICAuYWxpZ24gNAkJCQkJCQkJCQlcbiIKKwkieFZUT1JDb25zdDogLndvcmQgMHhlMDAwZWQwOAkJCQkJCVxuIgorCTo6ICJpIiAoIHBvcnRTVkNfU1RBUlRfU0NIRURVTEVSICkgOiAibWVtb3J5IgorCSk7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordWludDMyX3QgdWxTZXRJbnRlcnJ1cHRNYXNrRnJvbUlTUiggdm9pZCApIC8qIF9fYXR0cmlidXRlX18oKCBuYWtlZCApKSBQUklWSUxFR0VEX0ZVTkNUSU9OICovCit7CisJX19hc20gdm9sYXRpbGUKKwkoCisJIgltcnMgcjAsIFBSSU1BU0sJCQkJCQkJCQlcbiIKKwkiCWNwc2lkIGkJCQkJCQkJCQkJCVxuIgorCSIJYnggbHIJCQkJCQkJCQkJCVxuIgorCTo6OiAibWVtb3J5IgorCSk7CisKKyNpZiAhZGVmaW5lZCAoX19BUk1DQ19WRVJTSU9OKSAmJiAoX19BUk1DQ19WRVJTSU9OID49IDYwMTAwNTApCisJLyogVG8gYXZvaWQgY29tcGlsZXIgd2FybmluZ3MuICBUaGUgcmV0dXJuIHN0YXRlbWVudCB3aWxsIG5ldmVyIGJlIHJlYWNoZWQsCisJICogYnV0IHNvbWUgY29tcGlsZXJzIHdhcm4gaWYgaXQgaXMgbm90IGluY2x1ZGVkLCB3aGlsZSBvdGhlcnMgd29uJ3QgY29tcGlsZQorCSAqIGlmIGl0IGlzLiAqLworCXJldHVybiAwOworI2VuZGlmCit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCB2Q2xlYXJJbnRlcnJ1cHRNYXNrRnJvbUlTUiggX19hdHRyaWJ1dGVfXyggKCB1bnVzZWQgKSApIHVpbnQzMl90IHVsTWFzayApIC8qIF9fYXR0cmlidXRlX18oKCBuYWtlZCApKSBQUklWSUxFR0VEX0ZVTkNUSU9OICovCit7CisJX19hc20gdm9sYXRpbGUKKwkoCisJIgltc3IgUFJJTUFTSywgcjAJCQkJCQkJCQlcbiIKKwkiCWJ4IGxyCQkJCQkJCQkJCQlcbiIKKwk6OjogIm1lbW9yeSIKKwkpOworCisjaWYgIWRlZmluZWQgKF9fQVJNQ0NfVkVSU0lPTikgJiYgKF9fQVJNQ0NfVkVSU0lPTiA+PSA2MDEwMDUwKQorCS8qIEp1c3QgdG8gYXZvaWQgY29tcGlsZXIgd2FybmluZy4gIHVsTWFzayBpcyB1c2VkIGZyb20gdGhlIGFzbSBjb2RlIGJ1dAorCSAqIHRoZSBjb21waWxlciBjYW4ndCBzZWUgdGhhdC4gIFNvbWUgY29tcGlsZXJzIGdlbmVyYXRlIHdhcm5pbmdzIHdpdGhvdXQKKwkgKiB0aGUgZm9sbG93aW5nIGxpbmUsIHdoaWxlIG90aGVycyBnZW5lcmF0ZSB3YXJuaW5ncyBpZiB0aGUgbGluZSBpcworCSAqIGluY2x1ZGVkLiAqLworCSggdm9pZCApIHVsTWFzazsKKyNlbmRpZgorfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgUGVuZFNWX0hhbmRsZXIoIHZvaWQgKSAvKiBfX2F0dHJpYnV0ZV9fICgoIG5ha2VkICkpIFBSSVZJTEVHRURfRlVOQ1RJT04gKi8KK3sKKwlfX2FzbSB2b2xhdGlsZQorCSgKKwkiCS5zeW50YXggdW5pZmllZAkJCQkJCQkJCVxuIgorCSIJLmV4dGVybiBTZWN1cmVDb250ZXh0X1NhdmVDb250ZXh0CQkJCVxuIgorCSIJLmV4dGVybiBTZWN1cmVDb250ZXh0X0xvYWRDb250ZXh0CQkJCVxuIgorCSIJCQkJCQkJCQkJCQkJXG4iCisJIgltcnMgcjEsIHBzcAkJCQkJCQkJCQlcbiIgLyogUmVhZCBQU1AgaW4gcjEuICovCisJIglsZHIgcjIsIHhTZWN1cmVDb250ZXh0Q29uc3QJCQkJCQlcbiIgLyogUmVhZCB0aGUgbG9jYXRpb24gb2YgeFNlY3VyZUNvbnRleHQgaS5lLiAmKCB4U2VjdXJlQ29udGV4dCApLiAqLworCSIJbGRyIHIwLCBbcjJdCQkJCQkJCQkJXG4iIC8qIFJlYWQgeFNlY3VyZUNvbnRleHQgLSBWYWx1ZSBvZiB4U2VjdXJlQ29udGV4dCBtdXN0IGJlIGluIHIwIGFzIGl0IGlzIHVzZWQgYXMgYSBwYXJhbWV0ZXIgbGF0ZXIuICovCisJIgkJCQkJCQkJCQkJCQlcbiIKKwkiCWNieiByMCwgc2F2ZV9uc19jb250ZXh0CQkJCQkJCVxuIiAvKiBObyBzZWN1cmUgY29udGV4dCB0byBzYXZlLiAqLworCSIJcHVzaCB7cjAtcjIsIHIxNH0JCQkJCQkJCVxuIgorCSIJYmwgU2VjdXJlQ29udGV4dF9TYXZlQ29udGV4dAkJCQkJXG4iCisJIglwb3Age3IwLXIzfQkJCQkJCQkJCQlcbiIgLyogTFIgaXMgbm93IGluIHIzLiAqLworCSIJbW92IGxyLCByMwkJCQkJCQkJCQlcbiIgLyogTFIgPSByMy4gKi8KKwkiCWxzbHMgcjIsIHIzLCAjMjUJCQkJCQkJCVxuIiAvKiByMiA9IHIzIDw8IDI1LiBCaXRbNl0gb2YgRVhDX1JFVFVSTiBpcyAxIGlmIHNlY3VyZSBzdGFjayB3YXMgdXNlZCwgMCBpZiBub24tc2VjdXJlIHN0YWNrIHdhcyB1c2VkIHRvIHN0b3JlIHN0YWNrIGZyYW1lLiAqLworCSIJYnBsIHNhdmVfbnNfY29udGV4dAkJCQkJCQkJXG4iIC8qIGJwbCAtIGJyYW5jaCBpZiBwb3NpdGl2ZSBvciB6ZXJvLiBJZiByMiA+PSAwID09PiBCaXRbNl0gaW4gRVhDX1JFVFVSTiBpcyAwIGkuZS4gbm9uLXNlY3VyZSBzdGFjayB3YXMgdXNlZC4gKi8KKwkiCWxkciByMywgcHhDdXJyZW50VENCQ29uc3QJCQkJCQlcbiIgLyogUmVhZCB0aGUgbG9jYXRpb24gb2YgcHhDdXJyZW50VENCIGkuZS4gJiggcHhDdXJyZW50VENCICkuICovCisJIglsZHIgcjIsIFtyM10JCQkJCQkJCQlcbiIgLyogUmVhZCBweEN1cnJlbnRUQ0IuICovCisJI2lmKCBjb25maWdFTkFCTEVfTVBVID09IDEgKQorCSIJc3VicyByMSwgcjEsICMxNgkJCQkJCQkJXG4iIC8qIE1ha2Ugc3BhY2UgZm9yIHhTZWN1cmVDb250ZXh0LCBQU1BMSU0sIENPTlRST0wgYW5kIExSIG9uIHRoZSBzdGFjay4gKi8KKwkiCXN0ciByMSwgW3IyXQkJCQkJCQkJCVxuIiAvKiBTYXZlIHRoZSBuZXcgdG9wIG9mIHN0YWNrIGluIFRDQi4gKi8KKwkiCW1ycyByMiwgcHNwbGltCQkJCQkJCQkJXG4iIC8qIHIyID0gUFNQTElNLiAqLworCSIJbXJzIHIzLCBjb250cm9sCQkJCQkJCQkJXG4iIC8qIHIzID0gQ09OVFJPTC4gKi8KKwkiCW1vdiByNCwgbHIJCQkJCQkJCQkJXG4iIC8qIHI0ID0gTFIvRVhDX1JFVFVSTi4gKi8KKwkiCXN0bWlhIHIxISwge3IwLCByMi1yNH0JCQkJCQkJXG4iIC8qIFN0b3JlIHhTZWN1cmVDb250ZXh0LCBQU1BMSU0sIENPTlRST0wgYW5kIExSIG9uIHRoZSBzdGFjay4gKi8KKwkjZWxzZSAvKiBjb25maWdFTkFCTEVfTVBVICovCisJIglzdWJzIHIxLCByMSwgIzEyCQkJCQkJCQlcbiIgLyogTWFrZSBzcGFjZSBmb3IgeFNlY3VyZUNvbnRleHQsIFBTUExJTSBhbmQgTFIgb24gdGhlIHN0YWNrLiAqLworCSIJc3RyIHIxLCBbcjJdCQkJCQkJCQkJXG4iIC8qIFNhdmUgdGhlIG5ldyB0b3Agb2Ygc3RhY2sgaW4gVENCLiAqLworCSIJbXJzIHIyLCBwc3BsaW0JCQkJCQkJCQlcbiIgLyogcjIgPSBQU1BMSU0uICovCisJIgltb3YgcjMsIGxyCQkJCQkJCQkJCVxuIiAvKiByMyA9IExSL0VYQ19SRVRVUk4uICovCisJIglzdG1pYSByMSEsIHtyMCwgcjItcjN9CQkJCQkJCVxuIiAvKiBTdG9yZSB4U2VjdXJlQ29udGV4dCwgUFNQTElNIGFuZCBMUiBvbiB0aGUgc3RhY2suICovCisJI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9NUFUgKi8KKwkiCWIgc2VsZWN0X25leHRfdGFzawkJCQkJCQkJXG4iCisJIgkJCQkJCQkJCQkJCQlcbiIKKwkiIHNhdmVfbnNfY29udGV4dDoJCQkJCQkJCQlcbiIKKwkiCWxkciByMywgcHhDdXJyZW50VENCQ29uc3QJCQkJCQlcbiIgLyogUmVhZCB0aGUgbG9jYXRpb24gb2YgcHhDdXJyZW50VENCIGkuZS4gJiggcHhDdXJyZW50VENCICkuICovCisJIglsZHIgcjIsIFtyM10JCQkJCQkJCQlcbiIgLyogUmVhZCBweEN1cnJlbnRUQ0IuICovCisJI2lmKCBjb25maWdFTkFCTEVfTVBVID09IDEgKQorCSIJc3VicyByMSwgcjEsICM0OAkJCQkJCQkJXG4iIC8qIE1ha2Ugc3BhY2UgZm9yIHhTZWN1cmVDb250ZXh0LCBQU1BMSU0sIENPTlRST0wsIExSIGFuZCB0aGUgcmVtYWluaW5nIHJlZ2lzdGVycyBvbiB0aGUgc3RhY2suICovCisJIglzdHIgcjEsIFtyMl0JCQkJCQkJCQlcbiIgLyogU2F2ZSB0aGUgbmV3IHRvcCBvZiBzdGFjayBpbiBUQ0IuICovCisJIglhZGRzIHIxLCByMSwgIzE2CQkJCQkJCQlcbiIgLyogcjEgPSByMSArIDE2LiAqLworCSIJc3RtaWEgcjEhLCB7cjQtcjd9CQkJCQkJCQlcbiIgLyogU3RvcmUgdGhlIGxvdyByZWdpc3RlcnMgdGhhdCBhcmUgbm90IHNhdmVkIGF1dG9tYXRpY2FsbHkuICovCisJIgltb3YgcjQsIHI4CQkJCQkJCQkJCVxuIiAvKiByNCA9IHI4LiAqLworCSIJbW92IHI1LCByOQkJCQkJCQkJCQlcbiIgLyogcjUgPSByOS4gKi8KKwkiCW1vdiByNiwgcjEwCQkJCQkJCQkJCVxuIiAvKiByNiA9IHIxMC4gKi8KKwkiCW1vdiByNywgcjExCQkJCQkJCQkJCVxuIiAvKiByNyA9IHIxMS4gKi8KKwkiCXN0bWlhIHIxISwge3I0LXI3fQkJCQkJCQkJXG4iIC8qIFN0b3JlIHRoZSBoaWdoIHJlZ2lzdGVycyB0aGF0IGFyZSBub3Qgc2F2ZWQgYXV0b21hdGljYWxseS4gKi8KKwkiCW1ycyByMiwgcHNwbGltCQkJCQkJCQkJXG4iIC8qIHIyID0gUFNQTElNLiAqLworCSIJbXJzIHIzLCBjb250cm9sCQkJCQkJCQkJXG4iIC8qIHIzID0gQ09OVFJPTC4gKi8KKwkiCW1vdiByNCwgbHIJCQkJCQkJCQkJXG4iIC8qIHI0ID0gTFIvRVhDX1JFVFVSTi4gKi8KKwkiCXN1YnMgcjEsIHIxLCAjNDgJCQkJCQkJCVxuIiAvKiByMSA9IHIxIC0gNDguICovCisJIglzdG1pYSByMSEsIHtyMCwgcjItcjR9CQkJCQkJCVxuIiAvKiBTdG9yZSB4U2VjdXJlQ29udGV4dCwgUFNQTElNLCBDT05UUk9MIGFuZCBMUiBvbiB0aGUgc3RhY2suICovCisJI2Vsc2UgLyogY29uZmlnRU5BQkxFX01QVSAqLworCSIJc3VicyByMSwgcjEsICM0NAkJCQkJCQkJXG4iIC8qIE1ha2Ugc3BhY2UgZm9yIHhTZWN1cmVDb250ZXh0LCBQU1BMSU0sIExSIGFuZCB0aGUgcmVtYWluaW5nIHJlZ2lzdGVycyBvbiB0aGUgc3RhY2suICovCisJIglzdHIgcjEsIFtyMl0JCQkJCQkJCQlcbiIgLyogU2F2ZSB0aGUgbmV3IHRvcCBvZiBzdGFjayBpbiBUQ0IuICovCisJIgltcnMgcjIsIHBzcGxpbQkJCQkJCQkJCVxuIiAvKiByMiA9IFBTUExJTS4gKi8KKwkiCW1vdiByMywgbHIJCQkJCQkJCQkJXG4iIC8qIHIzID0gTFIvRVhDX1JFVFVSTi4gKi8KKwkiCXN0bWlhIHIxISwge3IwLCByMi1yN30JCQkJCQkJXG4iIC8qIFN0b3JlIHhTZWN1cmVDb250ZXh0LCBQU1BMSU0sIExSIGFuZCB0aGUgbG93IHJlZ2lzdGVycyB0aGF0IGFyZSBub3Qgc2F2ZWQgYXV0b21hdGljYWxseS4gKi8KKwkiCW1vdiByNCwgcjgJCQkJCQkJCQkJXG4iIC8qIHI0ID0gcjguICovCisJIgltb3YgcjUsIHI5CQkJCQkJCQkJCVxuIiAvKiByNSA9IHI5LiAqLworCSIJbW92IHI2LCByMTAJCQkJCQkJCQkJXG4iIC8qIHI2ID0gcjEwLiAqLworCSIJbW92IHI3LCByMTEJCQkJCQkJCQkJXG4iIC8qIHI3ID0gcjExLiAqLworCSIJc3RtaWEgcjEhLCB7cjQtcjd9CQkJCQkJCQlcbiIgLyogU3RvcmUgdGhlIGhpZ2ggcmVnaXN0ZXJzIHRoYXQgYXJlIG5vdCBzYXZlZCBhdXRvbWF0aWNhbGx5LiAqLworCSNlbmRpZiAvKiBjb25maWdFTkFCTEVfTVBVICovCisJIgkJCQkJCQkJCQkJCQlcbiIKKwkiIHNlbGVjdF9uZXh0X3Rhc2s6CQkJCQkJCQkJXG4iCisJIgljcHNpZCBpCQkJCQkJCQkJCQlcbiIKKwkiCWJsIHZUYXNrU3dpdGNoQ29udGV4dAkJCQkJCQlcbiIKKwkiCWNwc2llIGkJCQkJCQkJCQkJCVxuIgorCSIJCQkJCQkJCQkJCQkJXG4iCisJIglsZHIgcjIsIHB4Q3VycmVudFRDQkNvbnN0CQkJCQkJXG4iIC8qIFJlYWQgdGhlIGxvY2F0aW9uIG9mIHB4Q3VycmVudFRDQiBpLmUuICYoIHB4Q3VycmVudFRDQiApLiAqLworCSIJbGRyIHIzLCBbcjJdCQkJCQkJCQkJXG4iIC8qIFJlYWQgcHhDdXJyZW50VENCLiAqLworCSIJbGRyIHIxLCBbcjNdCQkJCQkJCQkJXG4iIC8qIFRoZSBmaXJzdCBpdGVtIGluIHB4Q3VycmVudFRDQiBpcyB0aGUgdGFzayB0b3Agb2Ygc3RhY2suIHIxIG5vdyBwb2ludHMgdG8gdGhlIHRvcCBvZiBzdGFjay4gKi8KKwkiCQkJCQkJCQkJCQkJCVxuIgorCSNpZiggY29uZmlnRU5BQkxFX01QVSA9PSAxICkKKwkiCWRtYgkJCQkJCQkJCQkJCVxuIiAvKiBDb21wbGV0ZSBvdXRzdGFuZGluZyB0cmFuc2ZlcnMgYmVmb3JlIGRpc2FibGluZyBNUFUuICovCisJIglsZHIgcjIsIHhNUFVDVFJMQ29uc3QJCQkJCQkJXG4iIC8qIHIyID0gMHhlMDAwZWQ5NCBbTG9jYXRpb24gb2YgTVBVX0NUUkxdLiAqLworCSIJbGRyIHI0LCBbcjJdCQkJCQkJCQkJXG4iIC8qIFJlYWQgdGhlIHZhbHVlIG9mIE1QVV9DVFJMLiAqLworCSIJbW92cyByNSwgIzEJCQkJCQkJCQkJXG4iIC8qIHI1ID0gMS4gKi8KKwkiCWJpY3MgcjQsIHI1CQkJCQkJCQkJCVxuIiAvKiByNCA9IHI0ICYgfnI1IGkuZS4gQ2xlYXIgdGhlIGJpdCAwIGluIHI0LiAqLworCSIJc3RyIHI0LCBbcjJdCQkJCQkJCQkJXG4iIC8qIERpc2FibGUgTVBVLiAqLworCSIJCQkJCQkJCQkJCQkJXG4iCisJIglhZGRzIHIzLCAjNAkJCQkJCQkJCQlcbiIgLyogcjMgPSByMyArIDQuIHIzIG5vdyBwb2ludHMgdG8gTUFJUjAgaW4gVENCLiAqLworCSIJbGRyIHI0LCBbcjNdCQkJCQkJCQkJXG4iIC8qIHI0ID0gKnIzIGkuZS4gcjQgPSBNQUlSMC4gKi8KKwkiCWxkciByMiwgeE1BSVIwQ29uc3QJCQkJCQkJCVxuIiAvKiByMiA9IDB4ZTAwMGVkYzAgW0xvY2F0aW9uIG9mIE1BSVIwXS4gKi8KKwkiCXN0ciByNCwgW3IyXQkJCQkJCQkJCVxuIiAvKiBQcm9ncmFtIE1BSVIwLiAqLworCSIJbGRyIHIyLCB4Uk5SQ29uc3QJCQkJCQkJCVxuIiAvKiByMiA9IDB4ZTAwMGVkOTggW0xvY2F0aW9uIG9mIFJOUl0uICovCisJIglhZGRzIHIzLCAjNAkJCQkJCQkJCQlcbiIgLyogcjMgPSByMyArIDQuIHIzIG5vdyBwb2ludHMgdG8gZmlyc3QgUkJBUiBpbiBUQ0IuICovCisJIgltb3ZzIHI1LCAjNAkJCQkJCQkJCQlcbiIgLyogcjUgPSA0LiAqLworCSIJc3RyICByNSwgW3IyXQkJCQkJCQkJCVxuIiAvKiBQcm9ncmFtIFJOUiA9IDQuICovCisJIglsZG1pYSByMyEsIHtyNixyN30JCQkJCQkJCVxuIiAvKiBSZWFkIGZpcnN0IHNldCBvZiBSQkFSL1JMQVIgZnJvbSBUQ0IuICovCisJIglsZHIgIHI0LCB4UkJBUkNvbnN0CQkJCQkJCQlcbiIgLyogcjQgPSAweGUwMDBlZDljIFtMb2NhdGlvbiBvZiBSQkFSXS4gKi8KKwkiCXN0bWlhIHI0ISwge3I2LHI3fQkJCQkJCQkJXG4iIC8qIFdyaXRlIGZpcnN0IHNldCBvZiBSQkFSL1JMQVIgcmVnaXN0ZXJzLiAqLworCSIJbW92cyByNSwgIzUJCQkJCQkJCQkJXG4iIC8qIHI1ID0gNS4gKi8KKwkiCXN0ciAgcjUsIFtyMl0JCQkJCQkJCQlcbiIgLyogUHJvZ3JhbSBSTlIgPSA1LiAqLworCSIJbGRtaWEgcjMhLCB7cjYscjd9CQkJCQkJCQlcbiIgLyogUmVhZCBzZWNvbmQgc2V0IG9mIFJCQVIvUkxBUiBmcm9tIFRDQi4gKi8KKwkiCWxkciAgcjQsIHhSQkFSQ29uc3QJCQkJCQkJCVxuIiAvKiByNCA9IDB4ZTAwMGVkOWMgW0xvY2F0aW9uIG9mIFJCQVJdLiAqLworCSIJc3RtaWEgcjQhLCB7cjYscjd9CQkJCQkJCQlcbiIgLyogV3JpdGUgc2Vjb25kIHNldCBvZiBSQkFSL1JMQVIgcmVnaXN0ZXJzLiAqLworCSIJbW92cyByNSwgIzYJCQkJCQkJCQkJXG4iIC8qIHI1ID0gNi4gKi8KKwkiCXN0ciAgcjUsIFtyMl0JCQkJCQkJCQlcbiIgLyogUHJvZ3JhbSBSTlIgPSA2LiAqLworCSIJbGRtaWEgcjMhLCB7cjYscjd9CQkJCQkJCQlcbiIgLyogUmVhZCB0aGlyZCBzZXQgb2YgUkJBUi9STEFSIGZyb20gVENCLiAqLworCSIJbGRyICByNCwgeFJCQVJDb25zdAkJCQkJCQkJXG4iIC8qIHI0ID0gMHhlMDAwZWQ5YyBbTG9jYXRpb24gb2YgUkJBUl0uICovCisJIglzdG1pYSByNCEsIHtyNixyN30JCQkJCQkJCVxuIiAvKiBXcml0ZSB0aGlyZCBzZXQgb2YgUkJBUi9STEFSIHJlZ2lzdGVycy4gKi8KKwkiCW1vdnMgcjUsICM3CQkJCQkJCQkJCVxuIiAvKiByNSA9IDcuICovCisJIglzdHIgIHI1LCBbcjJdCQkJCQkJCQkJXG4iIC8qIFByb2dyYW0gUk5SID0gNy4gKi8KKwkiCWxkbWlhIHIzISwge3I2LHI3fQkJCQkJCQkJXG4iIC8qIFJlYWQgZm91cnRoIHNldCBvZiBSQkFSL1JMQVIgZnJvbSBUQ0IuICovCisJIglsZHIgIHI0LCB4UkJBUkNvbnN0CQkJCQkJCQlcbiIgLyogcjQgPSAweGUwMDBlZDljIFtMb2NhdGlvbiBvZiBSQkFSXS4gKi8KKwkiCXN0bWlhIHI0ISwge3I2LHI3fQkJCQkJCQkJXG4iIC8qIFdyaXRlIGZvdXJ0aCBzZXQgb2YgUkJBUi9STEFSIHJlZ2lzdGVycy4gKi8KKwkiCQkJCQkJCQkJCQkJCVxuIgorCSIJbGRyIHIyLCB4TVBVQ1RSTENvbnN0CQkJCQkJCVxuIiAvKiByMiA9IDB4ZTAwMGVkOTQgW0xvY2F0aW9uIG9mIE1QVV9DVFJMXS4gKi8KKwkiCWxkciByNCwgW3IyXQkJCQkJCQkJCVxuIiAvKiBSZWFkIHRoZSB2YWx1ZSBvZiBNUFVfQ1RSTC4gKi8KKwkiCW1vdnMgcjUsICMxCQkJCQkJCQkJCVxuIiAvKiByNSA9IDEuICovCisJIglvcnJzIHI0LCByNQkJCQkJCQkJCQlcbiIgLyogcjQgPSByNCB8IHI1IGkuZS4gU2V0IHRoZSBiaXQgMCBpbiByNC4gKi8KKwkiCXN0ciByNCwgW3IyXQkJCQkJCQkJCVxuIiAvKiBFbmFibGUgTVBVLiAqLworCSIJZHNiCQkJCQkJCQkJCQkJXG4iIC8qIEZvcmNlIG1lbW9yeSB3cml0ZXMgYmVmb3JlIGNvbnRpbnVpbmcuICovCisJI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9NUFUgKi8KKwkiCQkJCQkJCQkJCQkJCVxuIgorCSNpZiggY29uZmlnRU5BQkxFX01QVSA9PSAxICkKKwkiCWxkbWlhIHIxISwge3IwLCByMi1yNH0JCQkJCQkJXG4iIC8qIFJlYWQgZnJvbSBzdGFjayAtIHIwID0geFNlY3VyZUNvbnRleHQsIHIyID0gUFNQTElNLCByMyA9IENPTlRST0wgYW5kIHI0ID0gTFIuICovCisJIgltc3IgcHNwbGltLCByMgkJCQkJCQkJCVxuIiAvKiBSZXN0b3JlIHRoZSBQU1BMSU0gcmVnaXN0ZXIgdmFsdWUgZm9yIHRoZSB0YXNrLiAqLworCSIJbXNyIGNvbnRyb2wsIHIzCQkJCQkJCQkJXG4iIC8qIFJlc3RvcmUgdGhlIENPTlRST0wgcmVnaXN0ZXIgdmFsdWUgZm9yIHRoZSB0YXNrLiAqLworCSIJbW92IGxyLCByNAkJCQkJCQkJCQlcbiIgLyogTFIgPSByNC4gKi8KKwkiCWxkciByMiwgeFNlY3VyZUNvbnRleHRDb25zdAkJCQkJCVxuIiAvKiBSZWFkIHRoZSBsb2NhdGlvbiBvZiB4U2VjdXJlQ29udGV4dCBpLmUuICYoIHhTZWN1cmVDb250ZXh0ICkuICovCisJIglzdHIgcjAsIFtyMl0JCQkJCQkJCQlcbiIgLyogUmVzdG9yZSB0aGUgdGFzaydzIHhTZWN1cmVDb250ZXh0LiAqLworCSIJY2J6IHIwLCByZXN0b3JlX25zX2NvbnRleHQJCQkJCQlcbiIgLyogSWYgdGhlcmUgaXMgbm8gc2VjdXJlIGNvbnRleHQgZm9yIHRoZSB0YXNrLCByZXN0b3JlIHRoZSBub24tc2VjdXJlIGNvbnRleHQuICovCisJIglwdXNoIHtyMSxyNH0JCQkJCQkJCQlcbiIKKwkiCWJsIFNlY3VyZUNvbnRleHRfTG9hZENvbnRleHQJCQkJCVxuIiAvKiBSZXN0b3JlIHRoZSBzZWN1cmUgY29udGV4dC4gKi8KKwkiCXBvcCB7cjEscjR9CQkJCQkJCQkJCVxuIgorCSIJbW92IGxyLCByNAkJCQkJCQkJCQlcbiIgLyogTFIgPSByNC4gKi8KKwkiCWxzbHMgcjIsIHI0LCAjMjUJCQkJCQkJCVxuIiAvKiByMiA9IHI0IDw8IDI1LiBCaXRbNl0gb2YgRVhDX1JFVFVSTiBpcyAxIGlmIHNlY3VyZSBzdGFjayB3YXMgdXNlZCwgMCBpZiBub24tc2VjdXJlIHN0YWNrIHdhcyB1c2VkIHRvIHN0b3JlIHN0YWNrIGZyYW1lLiAqLworCSIJYnBsIHJlc3RvcmVfbnNfY29udGV4dAkJCQkJCQlcbiIgLyogYnBsIC0gYnJhbmNoIGlmIHBvc2l0aXZlIG9yIHplcm8uIElmIHIyID49IDAgPT0+IEJpdFs2XSBpbiBFWENfUkVUVVJOIGlzIDAgaS5lLiBub24tc2VjdXJlIHN0YWNrIHdhcyB1c2VkLiAqLworCSIJbXNyIHBzcCwgcjEJCQkJCQkJCQkJXG4iIC8qIFJlbWVtYmVyIHRoZSBuZXcgdG9wIG9mIHN0YWNrIGZvciB0aGUgdGFzay4gKi8KKwkiCWJ4IGxyCQkJCQkJCQkJCQlcbiIKKwkjZWxzZSAvKiBjb25maWdFTkFCTEVfTVBVICovCisJIglsZG1pYSByMSEsIHtyMCwgcjItcjN9CQkJCQkJCVxuIiAvKiBSZWFkIGZyb20gc3RhY2sgLSByMCA9IHhTZWN1cmVDb250ZXh0LCByMiA9IFBTUExJTSBhbmQgcjMgPSBMUi4gKi8KKwkiCW1zciBwc3BsaW0sIHIyCQkJCQkJCQkJXG4iIC8qIFJlc3RvcmUgdGhlIFBTUExJTSByZWdpc3RlciB2YWx1ZSBmb3IgdGhlIHRhc2suICovCisJIgltb3YgbHIsIHIzCQkJCQkJCQkJCVxuIiAvKiBMUiA9IHIzLiAqLworCSIJbGRyIHIyLCB4U2VjdXJlQ29udGV4dENvbnN0CQkJCQkJXG4iIC8qIFJlYWQgdGhlIGxvY2F0aW9uIG9mIHhTZWN1cmVDb250ZXh0IGkuZS4gJiggeFNlY3VyZUNvbnRleHQgKS4gKi8KKwkiCXN0ciByMCwgW3IyXQkJCQkJCQkJCVxuIiAvKiBSZXN0b3JlIHRoZSB0YXNrJ3MgeFNlY3VyZUNvbnRleHQuICovCisJIgljYnogcjAsIHJlc3RvcmVfbnNfY29udGV4dAkJCQkJCVxuIiAvKiBJZiB0aGVyZSBpcyBubyBzZWN1cmUgY29udGV4dCBmb3IgdGhlIHRhc2ssIHJlc3RvcmUgdGhlIG5vbi1zZWN1cmUgY29udGV4dC4gKi8KKwkiCXB1c2gge3IxLHIzfQkJCQkJCQkJCVxuIgorCSIJYmwgU2VjdXJlQ29udGV4dF9Mb2FkQ29udGV4dAkJCQkJXG4iIC8qIFJlc3RvcmUgdGhlIHNlY3VyZSBjb250ZXh0LiAqLworCSIJcG9wIHtyMSxyM30JCQkJCQkJCQkJXG4iCisJIgltb3YgbHIsIHIzCQkJCQkJCQkJCVxuIiAvKiBMUiA9IHIzLiAqLworCSIJbHNscyByMiwgcjMsICMyNQkJCQkJCQkJXG4iIC8qIHIyID0gcjMgPDwgMjUuIEJpdFs2XSBvZiBFWENfUkVUVVJOIGlzIDEgaWYgc2VjdXJlIHN0YWNrIHdhcyB1c2VkLCAwIGlmIG5vbi1zZWN1cmUgc3RhY2sgd2FzIHVzZWQgdG8gc3RvcmUgc3RhY2sgZnJhbWUuICovCisJIglicGwgcmVzdG9yZV9uc19jb250ZXh0CQkJCQkJCVxuIiAvKiBicGwgLSBicmFuY2ggaWYgcG9zaXRpdmUgb3IgemVyby4gSWYgcjIgPj0gMCA9PT4gQml0WzZdIGluIEVYQ19SRVRVUk4gaXMgMCBpLmUuIG5vbi1zZWN1cmUgc3RhY2sgd2FzIHVzZWQuICovCisJIgltc3IgcHNwLCByMQkJCQkJCQkJCQlcbiIgLyogUmVtZW1iZXIgdGhlIG5ldyB0b3Agb2Ygc3RhY2sgZm9yIHRoZSB0YXNrLiAqLworCSIJYnggbHIJCQkJCQkJCQkJCVxuIgorCSNlbmRpZiAvKiBjb25maWdFTkFCTEVfTVBVICovCisJIgkJCQkJCQkJCQkJCQlcbiIKKwkiIHJlc3RvcmVfbnNfY29udGV4dDoJCQkJCQkJCVxuIgorCSIJYWRkcyByMSwgcjEsICMxNgkJCQkJCQkJXG4iIC8qIE1vdmUgdG8gdGhlIGhpZ2ggcmVnaXN0ZXJzLiAqLworCSIJbGRtaWEgcjEhLCB7cjQtcjd9CQkJCQkJCQlcbiIgLyogUmVzdG9yZSB0aGUgaGlnaCByZWdpc3RlcnMgdGhhdCBhcmUgbm90IGF1dG9tYXRpY2FsbHkgcmVzdG9yZWQuICovCisJIgltb3YgcjgsIHI0CQkJCQkJCQkJCVxuIiAvKiByOCA9IHI0LiAqLworCSIJbW92IHI5LCByNQkJCQkJCQkJCQlcbiIgLyogcjkgPSByNS4gKi8KKwkiCW1vdiByMTAsIHI2CQkJCQkJCQkJCVxuIiAvKiByMTAgPSByNi4gKi8KKwkiCW1vdiByMTEsIHI3CQkJCQkJCQkJCVxuIiAvKiByMTEgPSByNy4gKi8KKwkiCW1zciBwc3AsIHIxCQkJCQkJCQkJCVxuIiAvKiBSZW1lbWJlciB0aGUgbmV3IHRvcCBvZiBzdGFjayBmb3IgdGhlIHRhc2suICovCisJIglzdWJzIHIxLCByMSwgIzMyCQkJCQkJCQlcbiIgLyogR28gYmFjayB0byB0aGUgbG93IHJlZ2lzdGVycy4gKi8KKwkiCWxkbWlhIHIxISwge3I0LXI3fQkJCQkJCQkJXG4iIC8qIFJlc3RvcmUgdGhlIGxvdyByZWdpc3RlcnMgdGhhdCBhcmUgbm90IGF1dG9tYXRpY2FsbHkgcmVzdG9yZWQuICovCisJIglieCBscgkJCQkJCQkJCQkJXG4iCisJIgkJCQkJCQkJCQkJCQlcbiIKKwkiCS5hbGlnbiA0CQkJCQkJCQkJCVxuIgorCSJweEN1cnJlbnRUQ0JDb25zdDogLndvcmQgcHhDdXJyZW50VENCCQkJCVxuIgorCSJ4U2VjdXJlQ29udGV4dENvbnN0OiAud29yZCB4U2VjdXJlQ29udGV4dAkJCVxuIgorCSNpZiggY29uZmlnRU5BQkxFX01QVSA9PSAxICkKKwkieE1QVUNUUkxDb25zdDogLndvcmQgMHhlMDAwZWQ5NAkJCQkJXG4iCisJInhNQUlSMENvbnN0OiAud29yZCAweGUwMDBlZGMwCQkJCQkJXG4iCisJInhSTlJDb25zdDogLndvcmQgMHhlMDAwZWQ5OAkJCQkJCVxuIgorCSJ4UkJBUkNvbnN0OiAud29yZCAweGUwMDBlZDljCQkJCQkJXG4iCisJI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9NUFUgKi8KKwkpOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgU1ZDX0hhbmRsZXIoIHZvaWQgKSAvKiBfX2F0dHJpYnV0ZV9fICgoIG5ha2VkICkpIFBSSVZJTEVHRURfRlVOQ1RJT04gKi8KK3sKKwlfX2FzbSB2b2xhdGlsZQorCSgKKwkiCW1vdnMgcjAsICM0CQkJCQkJCQkJCVxuIgorCSIJbW92IHIxLCBscgkJCQkJCQkJCQlcbiIKKwkiCXRzdCByMCwgcjEJCQkJCQkJCQkJXG4iCisJIgliZXEgc3RhY2tpbmdfdXNlZF9tc3AJCQkJCQkJXG4iCisJIgltcnMgcjAsIHBzcAkJCQkJCQkJCQlcbiIKKwkiCWxkciByMiwgc3ZjaGFuZGxlcl9hZGRyZXNzX2NvbnN0CQkJCVxuIgorCSIJYnggcjIJCQkJCQkJCQkJCVxuIgorCSIgc3RhY2tpbmdfdXNlZF9tc3A6CQkJCQkJCQlcbiIKKwkiCW1ycyByMCwgbXNwCQkJCQkJCQkJCVxuIgorCSIJbGRyIHIyLCBzdmNoYW5kbGVyX2FkZHJlc3NfY29uc3QJCQkJXG4iCisJIglieCByMgkJCQkJCQkJCQkJXG4iCisJIgkJCQkJCQkJCQkJCQlcbiIKKwkiCS5hbGlnbiA0CQkJCQkJCQkJCVxuIgorCSJzdmNoYW5kbGVyX2FkZHJlc3NfY29uc3Q6IC53b3JkIHZQb3J0U1ZDSGFuZGxlcl9DCVxuIgorCSk7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCB2UG9ydEFsbG9jYXRlU2VjdXJlQ29udGV4dCggdWludDMyX3QgdWxTZWN1cmVTdGFja1NpemUgKSAvKiBfX2F0dHJpYnV0ZV9fICgoIG5ha2VkICkpICovCit7CisJX19hc20gdm9sYXRpbGUKKwkoCisJIglzdmMgJTAJCQkJCQkJCQkJCVxuIiAvKiBTZWN1cmUgY29udGV4dCBpcyBhbGxvY2F0ZWQgaW4gdGhlIHN1cGVydmlzb3IgY2FsbC4gKi8KKwkiCWJ4IGxyCQkJCQkJCQkJCQlcbiIgLyogUmV0dXJuLiAqLworCTo6ICJpIiAoIHBvcnRTVkNfQUxMT0NBVEVfU0VDVVJFX0NPTlRFWFQgKSA6ICJtZW1vcnkiCisJKTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIHZQb3J0RnJlZVNlY3VyZUNvbnRleHQoIHVpbnQzMl90ICpwdWxUQ0IgKSAvKiBfX2F0dHJpYnV0ZV9fICgoIG5ha2VkICkpIFBSSVZJTEVHRURfRlVOQ1RJT04gKi8KK3sKKwlfX2FzbSB2b2xhdGlsZQorCSgKKwkiCWxkciByMSwgW3IwXQkJCQkJCQkJCVxuIiAvKiBUaGUgZmlyc3QgaXRlbSBpbiB0aGUgVENCIGlzIHRoZSB0b3Agb2YgdGhlIHN0YWNrLiAqLworCSIJbGRyIHIwLCBbcjFdCQkJCQkJCQkJXG4iIC8qIFRoZSBmaXJzdCBpdGVtIG9uIHRoZSBzdGFjayBpcyB0aGUgdGFzaydzIHhTZWN1cmVDb250ZXh0LiAqLworCSIJY21wIHIwLCAjMAkJCQkJCQkJCQlcbiIgLyogUmFpc2Ugc3ZjIGlmIHRhc2sncyB4U2VjdXJlQ29udGV4dCBpcyBub3QgTlVMTC4gKi8KKwkiCWJlcSBmcmVlX3NlY3VyZV9jb250ZXh0CQkJCQkJCVxuIgorCSIJYnggbHIJCQkJCQkJCQkJCVxuIiAvKiBUaGVyZSBpcyBubyBzZWN1cmUgY29udGV4dCAoeFNlY3VyZUNvbnRleHQgaXMgTlVMTCkuICovCisJIiBmcmVlX3NlY3VyZV9jb250ZXh0OgkJCQkJCQkJXG4iCisJIglzdmMgJTAJCQkJCQkJCQkJCVxuIiAvKiBTZWN1cmUgY29udGV4dCBpcyBmcmVlZCBpbiB0aGUgc3VwZXJ2aXNvciBjYWxsLiAqLworCSIJYnggbHIJCQkJCQkJCQkJCVxuIiAvKiBSZXR1cm4uICovCisJOjogImkiICggcG9ydFNWQ19GUkVFX1NFQ1VSRV9DT05URVhUICkgOiAibWVtb3J5IgorCSk7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KZGlmZiAtLWdpdCBhL1NvdXJjZS9wb3J0YWJsZS9HQ0MvQVJNX0NNMjMvbm9uX3NlY3VyZS9wb3J0YXNtLmggYi9Tb3VyY2UvcG9ydGFibGUvR0NDL0FSTV9DTTIzL25vbl9zZWN1cmUvcG9ydGFzbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlY2YwNGUKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvcG9ydGFibGUvR0NDL0FSTV9DTTIzL25vbl9zZWN1cmUvcG9ydGFzbS5oCkBAIC0wLDAgKzEsMTEzIEBACisvKgorICogRnJlZVJUT1MgS2VybmVsIFYxMC4yLjEKKyAqIENvcHlyaWdodCAoQykgMjAxOSBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCisgKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgorICogdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bworICogdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YKKyAqIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKKyAqIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAorICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MKKyAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUgorICogQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSCisgKiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBodHRwOi8vd3d3LkZyZWVSVE9TLm9yZworICogaHR0cDovL2F3cy5hbWF6b24uY29tL2ZyZWVydG9zCisgKgorICogMSB0YWIgPT0gNCBzcGFjZXMhCisgKi8KKworI2lmbmRlZiBfX1BPUlRfQVNNX0hfXworI2RlZmluZSBfX1BPUlRfQVNNX0hfXworCisvKiBTY2hlZHVsZXIgaW5jbHVkZXMuICovCisjaW5jbHVkZSAiRnJlZVJUT1MuaCIKKworLyogTVBVIHdyYXBwZXJzIGluY2x1ZGVzLiAqLworI2luY2x1ZGUgIm1wdV93cmFwcGVycy5oIgorCisvKioKKyAqIEBicmllZiBSZXN0b3JlIHRoZSBjb250ZXh0IG9mIHRoZSBmaXJzdCB0YXNrIHNvIHRoYXQgdGhlIGZpcnN0IHRhc2sgc3RhcnRzCisgKiBleGVjdXRpbmcuCisgKi8KK3ZvaWQgdlJlc3RvcmVDb250ZXh0T2ZGaXJzdFRhc2soIHZvaWQgKSBfX2F0dHJpYnV0ZV9fICgoIG5ha2VkICkpIFBSSVZJTEVHRURfRlVOQ1RJT047CisKKy8qKgorICogQGJyaWVmIENoZWNrcyB3aGV0aGVyIG9yIG5vdCB0aGUgcHJvY2Vzc29yIGlzIHByaXZpbGVnZWQuCisgKgorICogQHJldHVybiAxIGlmIHRoZSBwcm9jZXNzb3IgaXMgYWxyZWFkeSBwcml2aWxlZ2VkLCAwIG90aGVyd2lzZS4KKyAqLworQmFzZVR5cGVfdCB4SXNQcml2aWxlZ2VkKCB2b2lkICkgX19hdHRyaWJ1dGVfXyAoKCBuYWtlZCApKTsKKworLyoqCisgKiBAYnJpZWYgUmFpc2VzIHRoZSBwcml2aWxlZ2UgbGV2ZWwgYnkgY2xlYXJpbmcgdGhlIGJpdCAwIG9mIHRoZSBDT05UUk9MCisgKiByZWdpc3Rlci4KKyAqCisgKiBAbm90ZSBUaGlzIGlzIGEgcHJpdmlsZWdlZCBmdW5jdGlvbiBhbmQgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGZyb20gdGhlIGtlbnJlbAorICogY29kZS4KKyAqCisgKiBCaXQgMCBvZiB0aGUgQ09OVFJPTCByZWdpc3RlciBkZWZpbmVzIHRoZSBwcml2aWxlZ2UgbGV2ZWwgb2YgVGhyZWFkIE1vZGUuCisgKiAgQml0WzBdID0gMCAtLT4gVGhlIHByb2Nlc3NvciBpcyBydW5uaW5nIHByaXZpbGVnZWQKKyAqICBCaXRbMF0gPSAxIC0tPiBUaGUgcHJvY2Vzc29yIGlzIHJ1bm5pbmcgdW5wcml2aWxlZ2VkLgorICovCit2b2lkIHZSYWlzZVByaXZpbGVnZSggdm9pZCApIF9fYXR0cmlidXRlX18gKCggbmFrZWQgKSkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworLyoqCisgKiBAYnJpZWYgTG93ZXJzIHRoZSBwcml2aWxlZ2UgbGV2ZWwgYnkgc2V0dGluZyB0aGUgYml0IDAgb2YgdGhlIENPTlRST0wKKyAqIHJlZ2lzdGVyLgorICoKKyAqIEJpdCAwIG9mIHRoZSBDT05UUk9MIHJlZ2lzdGVyIGRlZmluZXMgdGhlIHByaXZpbGVnZSBsZXZlbCBvZiBUaHJlYWQgTW9kZS4KKyAqICBCaXRbMF0gPSAwIC0tPiBUaGUgcHJvY2Vzc29yIGlzIHJ1bm5pbmcgcHJpdmlsZWdlZAorICogIEJpdFswXSA9IDEgLS0+IFRoZSBwcm9jZXNzb3IgaXMgcnVubmluZyB1bnByaXZpbGVnZWQuCisgKi8KK3ZvaWQgdlJlc2V0UHJpdmlsZWdlKCB2b2lkICkgX19hdHRyaWJ1dGVfXyAoKCBuYWtlZCApKTsKKworLyoqCisgKiBAYnJpZWYgU3RhcnRzIHRoZSBmaXJzdCB0YXNrLgorICovCit2b2lkIHZTdGFydEZpcnN0VGFzayggdm9pZCApIF9fYXR0cmlidXRlX18gKCggbmFrZWQgKSkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworLyoqCisgKiBAYnJpZWYgRGlzYWJsZXMgaW50ZXJydXB0cy4KKyAqLwordWludDMyX3QgdWxTZXRJbnRlcnJ1cHRNYXNrRnJvbUlTUiggdm9pZCApIF9fYXR0cmlidXRlX18oKCBuYWtlZCApKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisvKioKKyAqIEBicmllZiBFbmFibGVzIGludGVycnVwdHMuCisgKi8KK3ZvaWQgdkNsZWFySW50ZXJydXB0TWFza0Zyb21JU1IoIHVpbnQzMl90IHVsTWFzayApIF9fYXR0cmlidXRlX18oKCBuYWtlZCApKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisvKioKKyAqIEBicmllZiBQZW5kU1YgRXhjZXB0aW9uIGhhbmRsZXIuCisgKi8KK3ZvaWQgUGVuZFNWX0hhbmRsZXIoIHZvaWQgKSBfX2F0dHJpYnV0ZV9fICgoIG5ha2VkICkpIFBSSVZJTEVHRURfRlVOQ1RJT047CisKKy8qKgorICogQGJyaWVmIFNWQyBIYW5kbGVyLgorICovCit2b2lkIFNWQ19IYW5kbGVyKCB2b2lkICkgX19hdHRyaWJ1dGVfXyAoKCBuYWtlZCApKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisvKioKKyAqIEBicmllZiBBbGxvY2F0ZSBhIFNlY3VyZSBjb250ZXh0IGZvciB0aGUgY2FsbGluZyB0YXNrLgorICoKKyAqIEBwYXJhbVtpbl0gdWxTZWN1cmVTdGFja1NpemUgVGhlIHNpemUgb2YgdGhlIHN0YWNrIHRvIGJlIGFsbG9jYXRlZCBvbiB0aGUKKyAqIHNlY3VyZSBzaWRlIGZvciB0aGUgY2FsbGluZyB0YXNrLgorICovCit2b2lkIHZQb3J0QWxsb2NhdGVTZWN1cmVDb250ZXh0KCB1aW50MzJfdCB1bFNlY3VyZVN0YWNrU2l6ZSApIF9fYXR0cmlidXRlX18gKCggbmFrZWQgKSk7CisKKy8qKgorICogQGJyaWVmIEZyZWUgdGhlIHRhc2sncyBzZWN1cmUgY29udGV4dC4KKyAqCisgKiBAcGFyYW1baW5dIHB1bFRDQiBQb2ludGVyIHRvIHRoZSBUYXNrIENvbnRyb2wgQmxvY2sgKFRDQikgb2YgdGhlIHRhc2suCisgKi8KK3ZvaWQgdlBvcnRGcmVlU2VjdXJlQ29udGV4dCggdWludDMyX3QgKnB1bFRDQiApIF9fYXR0cmlidXRlX18gKCggbmFrZWQgKSkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworI2VuZGlmIC8qIF9fUE9SVF9BU01fSF9fICovCmRpZmYgLS1naXQgYS9Tb3VyY2UvcG9ydGFibGUvR0NDL0FSTV9DTTIzL25vbl9zZWN1cmUvcG9ydG1hY3JvLmggYi9Tb3VyY2UvcG9ydGFibGUvR0NDL0FSTV9DTTIzL25vbl9zZWN1cmUvcG9ydG1hY3JvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJhYjFiNwotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9wb3J0YWJsZS9HQ0MvQVJNX0NNMjMvbm9uX3NlY3VyZS9wb3J0bWFjcm8uaApAQCAtMCwwICsxLDI5OSBAQAorLyoKKyAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMi4xCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgorICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KKyAqIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KKyAqIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mCisgKiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCisgKiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKKyAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTCisgKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IKKyAqIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUgorICogSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogaHR0cDovL3d3dy5GcmVlUlRPUy5vcmcKKyAqIGh0dHA6Ly9hd3MuYW1hem9uLmNvbS9mcmVlcnRvcworICoKKyAqIDEgdGFiID09IDQgc3BhY2VzIQorICovCisKKyNpZm5kZWYgUE9SVE1BQ1JPX0gKKyNkZWZpbmUgUE9SVE1BQ1JPX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUG9ydCBzcGVjaWZpYyBkZWZpbml0aW9ucy4KKyAqCisgKiBUaGUgc2V0dGluZ3MgaW4gdGhpcyBmaWxlIGNvbmZpZ3VyZSBGcmVlUlRPUyBjb3JyZWN0bHkgZm9yIHRoZSBnaXZlbiBoYXJkd2FyZQorICogYW5kIGNvbXBpbGVyLgorICoKKyAqIFRoZXNlIHNldHRpbmdzIHNob3VsZCBub3QgYmUgYWx0ZXJlZC4KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworI2lmbmRlZiBjb25maWdFTkFCTEVfRlBVCisJI2Vycm9yIGNvbmZpZ0VOQUJMRV9GUFUgbXVzdCBiZSBkZWZpbmVkIGluIEZyZWVSVE9TQ29uZmlnLmguICBTZXQgY29uZmlnRU5BQkxFX0ZQVSB0byAxIHRvIGVuYWJsZSB0aGUgRlBVIG9yIDAgdG8gZGlzYWJsZSB0aGUgRlBVLgorI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9GUFUgKi8KKworI2lmbmRlZiBjb25maWdFTkFCTEVfTVBVCisJI2Vycm9yIGNvbmZpZ0VOQUJMRV9NUFUgbXVzdCBiZSBkZWZpbmVkIGluIEZyZWVSVE9TQ29uZmlnLmguICBTZXQgY29uZmlnRU5BQkxFX01QVSB0byAxIHRvIGVuYWJsZSB0aGUgTVBVIG9yIDAgdG8gZGlzYWJsZSB0aGUgTVBVLgorI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9NUFUgKi8KKworI2lmbmRlZiBjb25maWdFTkFCTEVfVFJVU1RaT05FCisJI2Vycm9yIGNvbmZpZ0VOQUJMRV9UUlVTVFpPTkUgbXVzdCBiZSBkZWZpbmVkIGluIEZyZWVSVE9TQ29uZmlnLmguICBTZXQgY29uZmlnRU5BQkxFX1RSVVNUWk9ORSB0byAxIHRvIGVuYWJsZSBUcnVzdFpvbmUgb3IgMCB0byBkaXNhYmxlIFRydXN0Wm9uZS4KKyNlbmRpZiAvKiBjb25maWdFTkFCTEVfVFJVU1RaT05FICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAqIEBicmllZiBUeXBlIGRlZmluaXRpb25zLgorICovCisjZGVmaW5lIHBvcnRDSEFSCQkJCQkJCQkJCQljaGFyCisjZGVmaW5lIHBvcnRGTE9BVAkJCQkJCQkJCQkJZmxvYXQKKyNkZWZpbmUgcG9ydERPVUJMRQkJCQkJCQkJCQkJZG91YmxlCisjZGVmaW5lIHBvcnRMT05HCQkJCQkJCQkJCQlsb25nCisjZGVmaW5lIHBvcnRTSE9SVAkJCQkJCQkJCQkJc2hvcnQKKyNkZWZpbmUgcG9ydFNUQUNLX1RZUEUJCQkJCQkJCQkJdWludDMyX3QKKyNkZWZpbmUgcG9ydEJBU0VfVFlQRQkJCQkJCQkJCQlsb25nCisKK3R5cGVkZWYgcG9ydFNUQUNLX1RZUEUJCQkJCQkJCQkJU3RhY2tUeXBlX3Q7Cit0eXBlZGVmIGxvbmcJCQkJCQkJCQkJCQlCYXNlVHlwZV90OwordHlwZWRlZiB1bnNpZ25lZCBsb25nCQkJCQkJCQkJCVVCYXNlVHlwZV90OworCisjaWYoIGNvbmZpZ1VTRV8xNl9CSVRfVElDS1MgPT0gMSApCisJdHlwZWRlZiB1aW50MTZfdCBUaWNrVHlwZV90OworCSNkZWZpbmUgcG9ydE1BWF9ERUxBWSAoIFRpY2tUeXBlX3QgKQkJCQkJMHhmZmZmCisjZWxzZQorCXR5cGVkZWYgdWludDMyX3QgVGlja1R5cGVfdDsKKwkjZGVmaW5lIHBvcnRNQVhfREVMQVkgKCBUaWNrVHlwZV90ICkJCQkJCTB4ZmZmZmZmZmZVTAorCisJLyogMzItYml0IHRpY2sgdHlwZSBvbiBhIDMyLWJpdCBhcmNoaXRlY3R1cmUsIHNvIHJlYWRzIG9mIHRoZSB0aWNrIGNvdW50IGRvCisJICogbm90IG5lZWQgdG8gYmUgZ3VhcmRlZCB3aXRoIGEgY3JpdGljYWwgc2VjdGlvbi4gKi8KKwkjZGVmaW5lIHBvcnRUSUNLX1RZUEVfSVNfQVRPTUlDCQkJCQkJCTEKKyNlbmRpZgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKgorICogQXJjaGl0ZWN0dXJlIHNwZWNpZmljcy4KKyAqLworI2RlZmluZSBwb3J0QVJDSF9OQU1FCQkJCQkJCQkJCSJDb3J0ZXgtTTIzIgorI2RlZmluZSBwb3J0U1RBQ0tfR1JPV1RICQkJCQkJCQkJKCAtMSApCisjZGVmaW5lIHBvcnRUSUNLX1BFUklPRF9NUwkJCQkJCQkJCSggKCBUaWNrVHlwZV90ICkgMTAwMCAvIGNvbmZpZ1RJQ0tfUkFURV9IWiApCisjZGVmaW5lIHBvcnRCWVRFX0FMSUdOTUVOVAkJCQkJCQkJCTgKKyNkZWZpbmUgcG9ydE5PUCgpCisjZGVmaW5lIHBvcnRJTkxJTkUJCQkJCQkJCQkJCV9faW5saW5lCisjaWZuZGVmIHBvcnRGT1JDRV9JTkxJTkUKKwkjZGVmaW5lIHBvcnRGT1JDRV9JTkxJTkUJCQkJCQkJCWlubGluZSBfX2F0dHJpYnV0ZV9fKCggYWx3YXlzX2lubGluZSApKQorI2VuZGlmCisjZGVmaW5lIHBvcnRIQVNfU1RBQ0tfT1ZFUkZMT1dfQ0hFQ0tJTkcJCQkJCQkxCisjZGVmaW5lIHBvcnRET05UX0RJU0NBUkQJCQkJCQkJCQlfX2F0dHJpYnV0ZV9fKCggdXNlZCApKQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKgorICogQGJyaWVmIEV4dGVybiBkZWNsYXJhdGlvbnMuCisgKi8KK2V4dGVybiB2b2lkIHZQb3J0WWllbGQoIHZvaWQgKSAvKiBQUklWSUxFR0VEX0ZVTkNUSU9OICovOworCitleHRlcm4gdm9pZCB2UG9ydEVudGVyQ3JpdGljYWwoIHZvaWQgKSAvKiBQUklWSUxFR0VEX0ZVTkNUSU9OICovOworZXh0ZXJuIHZvaWQgdlBvcnRFeGl0Q3JpdGljYWwoIHZvaWQgKSAvKiBQUklWSUxFR0VEX0ZVTkNUSU9OICovOworCitleHRlcm4gdWludDMyX3QgdWxTZXRJbnRlcnJ1cHRNYXNrRnJvbUlTUiggdm9pZCApIC8qIF9fYXR0cmlidXRlX18oKCBuYWtlZCApKSBQUklWSUxFR0VEX0ZVTkNUSU9OICovOworZXh0ZXJuIHZvaWQgdkNsZWFySW50ZXJydXB0TWFza0Zyb21JU1IoIHVpbnQzMl90IHVsTWFzayApIC8qIF9fYXR0cmlidXRlX18oKCBuYWtlZCApKSBQUklWSUxFR0VEX0ZVTkNUSU9OICovOworCisjaWYoIGNvbmZpZ0VOQUJMRV9UUlVTVFpPTkUgPT0gMSApCisJZXh0ZXJuIHZvaWQgdlBvcnRBbGxvY2F0ZVNlY3VyZUNvbnRleHQoIHVpbnQzMl90IHVsU2VjdXJlU3RhY2tTaXplICk7IC8qIF9fYXR0cmlidXRlX18gKCggbmFrZWQgKSkgKi8KKwlleHRlcm4gdm9pZCB2UG9ydEZyZWVTZWN1cmVDb250ZXh0KCB1aW50MzJfdCAqcHVsVENCICkgLyogX19hdHRyaWJ1dGVfXyAoKCBuYWtlZCApKSBQUklWSUxFR0VEX0ZVTkNUSU9OICovOworI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9UUlVTVFpPTkUgKi8KKworI2lmKCBjb25maWdFTkFCTEVfTVBVID09IDEgKQorCWV4dGVybiBCYXNlVHlwZV90IHhJc1ByaXZpbGVnZWQoIHZvaWQgKSAvKiBfX2F0dHJpYnV0ZV9fICgoIG5ha2VkICkpICovOworCWV4dGVybiB2b2lkIHZSZXNldFByaXZpbGVnZSggdm9pZCApIC8qIF9fYXR0cmlidXRlX18gKCggbmFrZWQgKSkgKi87CisjZW5kaWYgLyogY29uZmlnRU5BQkxFX01QVSAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKgorICogQGJyaWVmIE1QVSBzcGVjaWZpYyBjb25zdGFudHMuCisgKi8KKyNpZiggY29uZmlnRU5BQkxFX01QVSA9PSAxICkKKwkjZGVmaW5lIHBvcnRVU0lOR19NUFVfV1JBUFBFUlMJCQkJCQkJMQorCSNkZWZpbmUgcG9ydFBSSVZJTEVHRV9CSVQJCQkJCQkJCSggMHg4MDAwMDAwMFVMICkKKyNlbHNlCisJI2RlZmluZSBwb3J0UFJJVklMRUdFX0JJVAkJCQkJCQkJKCAweDBVTCApCisjZW5kaWYgLyogY29uZmlnRU5BQkxFX01QVSAqLworCisKKy8qIE1QVSByZWdpb25zLiAqLworI2RlZmluZSBwb3J0UFJJVklMRUdFRF9GTEFTSF9SRUdJT04JCQkJCQkJKCAwVUwgKQorI2RlZmluZSBwb3J0VU5QUklWSUxFR0VEX0ZMQVNIX1JFR0lPTgkJCQkJCSggMVVMICkKKyNkZWZpbmUgcG9ydFVOUFJJVklMRUdFRF9TWVNDQUxMU19SRUdJT04JCQkJCSggMlVMICkKKyNkZWZpbmUgcG9ydFBSSVZJTEVHRURfUkFNX1JFR0lPTgkJCQkJCQkoIDNVTCApCisjZGVmaW5lIHBvcnRTVEFDS19SRUdJT04JCQkJCQkJCQkoIDRVTCApCisjZGVmaW5lIHBvcnRGSVJTVF9DT05GSUdVUkFCTEVfUkVHSU9OCQkJCQkJKCA1VUwgKQorI2RlZmluZSBwb3J0TEFTVF9DT05GSUdVUkFCTEVfUkVHSU9OCQkJCQkJKCA3VUwgKQorI2RlZmluZSBwb3J0TlVNX0NPTkZJR1VSQUJMRV9SRUdJT05TCQkJCQkJKCAoIHBvcnRMQVNUX0NPTkZJR1VSQUJMRV9SRUdJT04gLSBwb3J0RklSU1RfQ09ORklHVVJBQkxFX1JFR0lPTiApICsgMSApCisjZGVmaW5lIHBvcnRUT1RBTF9OVU1fUkVHSU9OUwkJCQkJCQkJKCBwb3J0TlVNX0NPTkZJR1VSQUJMRV9SRUdJT05TICsgMSApIC8qIFBsdXMgb25lIHRvIG1ha2Ugc3BhY2UgZm9yIHRoZSBzdGFjayByZWdpb24uICovCisKKy8qIERldmljZSBtZW1vcnkgYXR0cmlidXRlcyB1c2VkIGluIE1QVV9NQUlSIHJlZ2lzdGVycy4KKyAqCisgKiA4LWJpdCB2YWx1ZXMgZW5jb2RlZCBhcyBmb2xsb3dzOgorICogIEJpdFs3OjRdIC0gMDAwMCAtIERldmljZSBNZW1vcnkKKyAqICBCaXRbMzoyXSAtIDAwIC0tPiBEZXZpY2UtbkduUm5FCisgKgkJCQkwMSAtLT4gRGV2aWNlLW5HblJFCisgKgkJCQkxMCAtLT4gRGV2aWNlLW5HUkUKKyAqCQkJCTExIC0tPiBEZXZpY2UtR1JFCisgKiAgQml0WzE6MF0gLSAwMCwgUmVzZXJ2ZWQuCisgKi8KKyNkZWZpbmUgcG9ydE1QVV9ERVZJQ0VfTUVNT1JZX25HblJuRQkJCQkJCSggMHgwMCApIC8qIDAwMDAgMDAwMCAqLworI2RlZmluZSBwb3J0TVBVX0RFVklDRV9NRU1PUllfbkduUkUJCQkJCQkJKCAweDA0ICkgLyogMDAwMCAwMTAwICovCisjZGVmaW5lIHBvcnRNUFVfREVWSUNFX01FTU9SWV9uR1JFCQkJCQkJCSggMHgwOCApIC8qIDAwMDAgMTAwMCAqLworI2RlZmluZSBwb3J0TVBVX0RFVklDRV9NRU1PUllfR1JFCQkJCQkJCSggMHgwQyApIC8qIDAwMDAgMTEwMCAqLworCisvKiBOb3JtYWwgbWVtb3J5IGF0dHJpYnV0ZXMgdXNlZCBpbiBNUFVfTUFJUiByZWdpc3RlcnMuICovCisjZGVmaW5lIHBvcnRNUFVfTk9STUFMX01FTU9SWV9OT05fQ0FDSEVBQkxFCQkJCQkoIDB4NDQgKSAvKiBOb24tY2FjaGVhYmxlLiAqLworI2RlZmluZSBwb3J0TVBVX05PUk1BTF9NRU1PUllfQlVGRkVSQUJMRV9DQUNIRUFCTEUJCQkoIDB4RkYgKSAvKiBOb24tVHJhbnNpZW50LCBXcml0ZS1iYWNrLCBSZWFkLUFsbG9jYXRlIGFuZCBXcml0ZS1BbGxvY2F0ZS4gKi8KKworLyogQXR0cmlidXRlcyB1c2VkIGluIE1QVV9SQkFSIHJlZ2lzdGVycy4gKi8KKyNkZWZpbmUgcG9ydE1QVV9SRUdJT05fTk9OX1NIQVJFQUJMRQkJCQkJCSggMFVMIDw8IDNVTCApCisjZGVmaW5lIHBvcnRNUFVfUkVHSU9OX0lOTkVSX1NIQVJFQUJMRQkJCQkJCSggMVVMIDw8IDNVTCApCisjZGVmaW5lIHBvcnRNUFVfUkVHSU9OX09VVEVSX1NIQVJFQUJMRQkJCQkJCSggMlVMIDw8IDNVTCApCisKKyNkZWZpbmUgcG9ydE1QVV9SRUdJT05fUFJJVklMRUdFRF9SRUFEX1dSSVRFCQkJCSggMFVMIDw8IDFVTCApCisjZGVmaW5lIHBvcnRNUFVfUkVHSU9OX1JFQURfV1JJVEUJCQkJCQkJKCAxVUwgPDwgMVVMICkKKyNkZWZpbmUgcG9ydE1QVV9SRUdJT05fUFJJVklMRUdFRF9SRUFEX09OTFkJCQkJCSggMlVMIDw8IDFVTCApCisjZGVmaW5lIHBvcnRNUFVfUkVHSU9OX1JFQURfT05MWQkJCQkJCQkoIDNVTCA8PCAxVUwgKQorCisjZGVmaW5lIHBvcnRNUFVfUkVHSU9OX0VYRUNVVEVfTkVWRVIJCQkJCQkoIDFVTCApCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqCisgKiBAYnJpZWYgU2V0dGluZ3MgdG8gZGVmaW5lIGFuIE1QVSByZWdpb24uCisgKi8KK3R5cGVkZWYgc3RydWN0IE1QVVJlZ2lvblNldHRpbmdzCit7CisJdWludDMyX3QgdWxSQkFSOwkvKio8IFJCQVIgZm9yIHRoZSByZWdpb24uICovCisJdWludDMyX3QgdWxSTEFSOwkvKio8IFJMQVIgZm9yIHRoZSByZWdpb24uICovCit9IE1QVVJlZ2lvblNldHRpbmdzX3Q7CisKKy8qKgorICogQGJyaWVmIE1QVSBzZXR0aW5ncyBhcyBzdG9yZWQgaW4gdGhlIFRDQi4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgTVBVX1NFVFRJTkdTCit7CisJdWludDMyX3QgdWxNQUlSMDsJLyoqPCBNQUlSMCBmb3IgdGhlIHRhc2sgY29udGFpbmluZyBhdHRyaWJ1dGVzIGZvciBhbGwgdGhlIDQgcGVyIHRhc2sgcmVnaW9ucy4gKi8KKwlNUFVSZWdpb25TZXR0aW5nc190IHhSZWdpb25zU2V0dGluZ3NbIHBvcnRUT1RBTF9OVU1fUkVHSU9OUyBdOyAvKio8IFNldHRpbmdzIGZvciA0IHBlciB0YXNrIHJlZ2lvbnMuICovCit9IHhNUFVfU0VUVElOR1M7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqCisgKiBAYnJpZWYgU1ZDIG51bWJlcnMuCisgKi8KKyNkZWZpbmUgcG9ydFNWQ19BTExPQ0FURV9TRUNVUkVfQ09OVEVYVAkJCQkJCTAKKyNkZWZpbmUgcG9ydFNWQ19GUkVFX1NFQ1VSRV9DT05URVhUCQkJCQkJCTEKKyNkZWZpbmUgcG9ydFNWQ19TVEFSVF9TQ0hFRFVMRVIJCQkJCQkJCTIKKyNkZWZpbmUgcG9ydFNWQ19SQUlTRV9QUklWSUxFR0UJCQkJCQkJCTMKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAqIEBicmllZiBTY2hlZHVsZXIgdXRpbGl0aWVzLgorICovCisjZGVmaW5lIHBvcnRZSUVMRCgpCQkJCQkJCQkJCQl2UG9ydFlpZWxkKCkKKyNkZWZpbmUgcG9ydE5WSUNfSU5UX0NUUkxfUkVHCQkJCQkJCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZDA0ICkgKQorI2RlZmluZSBwb3J0TlZJQ19QRU5EU1ZTRVRfQklUCQkJCQkJCQkoIDFVTCA8PCAyOFVMICkKKyNkZWZpbmUgcG9ydEVORF9TV0lUQ0hJTkdfSVNSKCB4U3dpdGNoUmVxdWlyZWQgKQkJCWlmKCB4U3dpdGNoUmVxdWlyZWQgKSBwb3J0TlZJQ19JTlRfQ1RSTF9SRUcgPSBwb3J0TlZJQ19QRU5EU1ZTRVRfQklUCisjZGVmaW5lIHBvcnRZSUVMRF9GUk9NX0lTUiggeCApCQkJCQkJCQlwb3J0RU5EX1NXSVRDSElOR19JU1IoIHggKQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKgorICogQGJyaWVmIENyaXRpY2FsIHNlY3Rpb24gbWFuYWdlbWVudC4KKyAqLworI2RlZmluZSBwb3J0U0VUX0lOVEVSUlVQVF9NQVNLX0ZST01fSVNSKCkJCQkJCXVsU2V0SW50ZXJydXB0TWFza0Zyb21JU1IoKQorI2RlZmluZSBwb3J0Q0xFQVJfSU5URVJSVVBUX01BU0tfRlJPTV9JU1IoeCkJCQkJdkNsZWFySW50ZXJydXB0TWFza0Zyb21JU1IoIHggKQorI2RlZmluZSBwb3J0RElTQUJMRV9JTlRFUlJVUFRTKCkJCQkJCQkJX19hc20gdm9sYXRpbGUgKCAiIGNwc2lkIGkgIiA6OjogIm1lbW9yeSIgKQorI2RlZmluZSBwb3J0RU5BQkxFX0lOVEVSUlVQVFMoKQkJCQkJCQkJX19hc20gdm9sYXRpbGUgKCAiIGNwc2llIGkgIiA6OjogIm1lbW9yeSIgKQorI2RlZmluZSBwb3J0RU5URVJfQ1JJVElDQUwoKQkJCQkJCQkJdlBvcnRFbnRlckNyaXRpY2FsKCkKKyNkZWZpbmUgcG9ydEVYSVRfQ1JJVElDQUwoKQkJCQkJCQkJCXZQb3J0RXhpdENyaXRpY2FsKCkKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAqIEBicmllZiBUYXNrIGZ1bmN0aW9uIG1hY3JvcyBhcyBkZXNjcmliZWQgb24gdGhlIEZyZWVSVE9TLm9yZyBXRUIgc2l0ZS4KKyAqLworI2RlZmluZSBwb3J0VEFTS19GVU5DVElPTl9QUk9UTyggdkZ1bmN0aW9uLCBwdlBhcmFtZXRlcnMgKQl2b2lkIHZGdW5jdGlvbiggdm9pZCAqcHZQYXJhbWV0ZXJzICkKKyNkZWZpbmUgcG9ydFRBU0tfRlVOQ1RJT04oIHZGdW5jdGlvbiwgcHZQYXJhbWV0ZXJzICkJCXZvaWQgdkZ1bmN0aW9uKCB2b2lkICpwdlBhcmFtZXRlcnMgKQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiggY29uZmlnRU5BQkxFX1RSVVNUWk9ORSA9PSAxICkKKwkvKioKKwkgKiBAYnJpZWYgQWxsb2NhdGUgYSBzZWN1cmUgY29udGV4dCBmb3IgdGhlIHRhc2suCisJICoKKwkgKiBUYXNrcyBhcmUgbm90IGNyZWF0ZWQgd2l0aCBhIHNlY3VyZSBjb250ZXh0LiBBbnkgdGFzayB0aGF0IGlzIGdvaW5nIHRvIGNhbGwKKwkgKiBzZWN1cmUgZnVuY3Rpb25zIG11c3QgY2FsbCBwb3J0QUxMT0NBVEVfU0VDVVJFX0NPTlRFWFQoKSB0byBhbGxvY2F0ZSBpdHNlbGYgYQorCSAqIHNlY3VyZSBjb250ZXh0IGJlZm9yZSBpdCBjYWxscyBhbnkgc2VjdXJlIGZ1bmN0aW9uLgorCSAqCisJICogQHBhcmFtW2luXSB1bFNlY3VyZVN0YWNrU2l6ZSBUaGUgc2l6ZSBvZiB0aGUgc2VjdXJlIHN0YWNrIHRvIGJlIGFsbG9jYXRlZC4KKwkgKi8KKwkjZGVmaW5lIHBvcnRBTExPQ0FURV9TRUNVUkVfQ09OVEVYVCggdWxTZWN1cmVTdGFja1NpemUgKQl2UG9ydEFsbG9jYXRlU2VjdXJlQ29udGV4dCggdWxTZWN1cmVTdGFja1NpemUgKQorCisJLyoqCisJICogQGJyaWVmIENhbGxlZCB3aGVuIGEgdGFzayBpcyBkZWxldGVkIHRvIGRlbGV0ZSB0aGUgdGFzaydzIHNlY3VyZSBjb250ZXh0LAorCSAqIGlmIGl0IGhhcyBvbmUuCisJICoKKwkgKiBAcGFyYW1baW5dIHB4VENCIFRoZSBUQ0Igb2YgdGhlIHRhc2sgYmVpbmcgZGVsZXRlZC4KKwkgKi8KKwkjZGVmaW5lIHBvcnRDTEVBTl9VUF9UQ0IoIHB4VENCICkJCQkJCQkJdlBvcnRGcmVlU2VjdXJlQ29udGV4dCggKCB1aW50MzJfdCAqICkgcHhUQ0IgKQorI2Vsc2UKKwkjZGVmaW5lIHBvcnRBTExPQ0FURV9TRUNVUkVfQ09OVEVYVCggdWxTZWN1cmVTdGFja1NpemUgKQorCSNkZWZpbmUgcG9ydENMRUFOX1VQX1RDQiggcHhUQ0IgKQorI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9UUlVTVFpPTkUgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYoIGNvbmZpZ0VOQUJMRV9NUFUgPT0gMSApCisJLyoqCisJICogQGJyaWVmIENoZWNrcyB3aGV0aGVyIG9yIG5vdCB0aGUgcHJvY2Vzc29yIGlzIHByaXZpbGVnZWQuCisJICoKKwkgKiBAcmV0dXJuIDEgaWYgdGhlIHByb2Nlc3NvciBpcyBhbHJlYWR5IHByaXZpbGVnZWQsIDAgb3RoZXJ3aXNlLgorCSAqLworCSNkZWZpbmUgcG9ydElTX1BSSVZJTEVHRUQoKQkJCQkJCQkJCXhJc1ByaXZpbGVnZWQoKQorCisJLyoqCisJICogQGJyaWVmIFJhaXNlIGFuIFNWQyByZXF1ZXN0IHRvIHJhaXNlIHByaXZpbGVnZS4KKwkgKgorCSAqIFRoZSBTVkMgaGFuZGxlciBjaGVja3MgdGhhdCB0aGUgU1ZDIHdhcyByYWlzZWQgZnJvbSBhIHN5c3RlbSBjYWxsIGFuZCBvbmx5CisJICogdGhlbiBpdCByYWlzZXMgdGhlIHByaXZpbGVnZS4gSWYgdGhpcyBpcyBjYWxsZWQgZnJvbSBhbnkgb3RoZXIgcGxhY2UsCisJICogdGhlIHByaXZpbGVnZSBpcyBub3QgcmFpc2VkLgorCSAqLworCSNkZWZpbmUgcG9ydFJBSVNFX1BSSVZJTEVHRSgpCQkJCQkJCQlfX2FzbSB2b2xhdGlsZSAoICJzdmMgJTAgXG4iIDo6ICJpIiAoIHBvcnRTVkNfUkFJU0VfUFJJVklMRUdFICkgOiAibWVtb3J5IiApOworCisJLyoqCisJICogQGJyaWVmIExvd2VycyB0aGUgcHJpdmlsZWdlIGxldmVsIGJ5IHNldHRpbmcgdGhlIGJpdCAwIG9mIHRoZSBDT05UUk9MCisJICogcmVnaXN0ZXIuCisJICovCisJI2RlZmluZSBwb3J0UkVTRVRfUFJJVklMRUdFKCkJCQkJCQkJCXZSZXNldFByaXZpbGVnZSgpCisjZWxzZQorCSNkZWZpbmUgcG9ydElTX1BSSVZJTEVHRUQoKQorCSNkZWZpbmUgcG9ydFJBSVNFX1BSSVZJTEVHRSgpCisJI2RlZmluZSBwb3J0UkVTRVRfUFJJVklMRUdFKCkKKyNlbmRpZiAvKiBjb25maWdFTkFCTEVfTVBVICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqCisgKiBAYnJpZWYgQmFycmllcnMuCisgKi8KKyNkZWZpbmUgcG9ydE1FTU9SWV9CQVJSSUVSKCkgX19hc20gdm9sYXRpbGUoICIiIDo6OiAibWVtb3J5IiApCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFBPUlRNQUNST19IICovCmRpZmYgLS1naXQgYS9Tb3VyY2UvcG9ydGFibGUvR0NDL0FSTV9DTTIzL3NlY3VyZS9zZWN1cmVfY29udGV4dC5jIGIvU291cmNlL3BvcnRhYmxlL0dDQy9BUk1fQ00yMy9zZWN1cmUvc2VjdXJlX2NvbnRleHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzUzNWNkCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL3BvcnRhYmxlL0dDQy9BUk1fQ00yMy9zZWN1cmUvc2VjdXJlX2NvbnRleHQuYwpAQCAtMCwwICsxLDIwNCBAQAorLyoKKyAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMi4xCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgorICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KKyAqIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KKyAqIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mCisgKiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCisgKiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKKyAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTCisgKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IKKyAqIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUgorICogSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogaHR0cDovL3d3dy5GcmVlUlRPUy5vcmcKKyAqIGh0dHA6Ly9hd3MuYW1hem9uLmNvbS9mcmVlcnRvcworICoKKyAqIDEgdGFiID09IDQgc3BhY2VzIQorICovCisKKy8qIFNlY3VyZSBjb250ZXh0IGluY2x1ZGVzLiAqLworI2luY2x1ZGUgInNlY3VyZV9jb250ZXh0LmgiCisKKy8qIFNlY3VyZSBoZWFwIGluY2x1ZGVzLiAqLworI2luY2x1ZGUgInNlY3VyZV9oZWFwLmgiCisKKy8qIFNlY3VyZSBwb3J0IG1hY3Jvcy4gKi8KKyNpbmNsdWRlICJzZWN1cmVfcG9ydF9tYWNyb3MuaCIKKworLyoqCisgKiBAYnJpZWYgQ09OVFJPTCB2YWx1ZSBmb3IgcHJpdmlsZWdlZCB0YXNrcy4KKyAqCisgKiBCaXRbMF0gLSAwIC0tPiBUaHJlYWQgbW9kZSBpcyBwcml2aWxlZ2VkLgorICogQml0WzFdIC0gMSAtLT4gVGhyZWFkIG1vZGUgdXNlcyBQU1AuCisgKi8KKyNkZWZpbmUgc2VjdXJlY29udGV4dENPTlRST0xfVkFMVUVfUFJJVklMRUdFRAkJMHgwMgorCisvKioKKyAqIEBicmllZiBDT05UUk9MIHZhbHVlIGZvciB1bi1wcml2aWxlZ2VkIHRhc2tzLgorICoKKyAqIEJpdFswXSAtIDEgLS0+IFRocmVhZCBtb2RlIGlzIHVuLXByaXZpbGVnZWQuCisgKiBCaXRbMV0gLSAxIC0tPiBUaHJlYWQgbW9kZSB1c2VzIFBTUC4KKyAqLworI2RlZmluZSBzZWN1cmVjb250ZXh0Q09OVFJPTF9WQUxVRV9VTlBSSVZJTEVHRUQJCTB4MDMKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAqIEBicmllZiBTdHJ1Y3R1cmUgdG8gcmVwcmVzZW50IHNlY3VyZSBjb250ZXh0LgorICoKKyAqIEBub3RlIFNpbmNlIHN0YWNrIGdyb3dzIGRvd24sIHB1Y1N0YWNrU3RhcnQgaXMgdGhlIGhpZ2hlc3QgYWRkcmVzcyB3aGlsZQorICogcHVjU3RhY2tMaW1pdCBpcyB0aGUgZmlyc3QgYWRkZXNzIG9mIHRoZSBhbGxvY2F0ZWQgbWVtb3J5LgorICovCit0eXBlZGVmIHN0cnVjdCBTZWN1cmVDb250ZXh0Cit7CisJdWludDhfdCAqcHVjQ3VycmVudFN0YWNrUG9pbnRlcjsJLyoqPCBDdXJyZW50IHZhbHVlIG9mIHN0YWNrIHBvaW50ZXIgKFBTUCkuICovCisJdWludDhfdCAqcHVjU3RhY2tMaW1pdDsJCQkJLyoqPCBMYXN0IGxvY2F0aW9uIG9mIHRoZSBzdGFjayBtZW1vcnkgKFBTUExJTSkuICovCisJdWludDhfdCAqcHVjU3RhY2tTdGFydDsJCQkJLyoqPCBGaXJzdCBsb2NhdGlvbiBvZiB0aGUgc3RhY2sgbWVtb3J5LiAqLworfSBTZWN1cmVDb250ZXh0X3Q7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc2VjdXJlcG9ydE5PTl9TRUNVUkVfQ0FMTEFCTEUgdm9pZCBTZWN1cmVDb250ZXh0X0luaXQoIHZvaWQgKQoreworCXVpbnQzMl90IHVsSVBTUjsKKworCS8qIFJlYWQgdGhlIEludGVycnVwdCBQcm9ncmFtIFN0YXR1cyBSZWdpc3RlciAoSVBTUikgdmFsdWUuICovCisJc2VjdXJlcG9ydFJFQURfSVBTUiggdWxJUFNSICk7CisKKwkvKiBEbyBub3RoaW5nIGlmIHRoZSBwcm9jZXNzb3IgaXMgcnVubmluZyBpbiB0aGUgVGhyZWFkIE1vZGUuIElQU1IgaXMgemVybworCSAqIHdoZW4gdGhlIHByb2Nlc3NvciBpcyBydW5uaW5nIGluIHRoZSBUaHJlYWQgTW9kZS4gKi8KKwlpZiggdWxJUFNSICE9IDAgKQorCXsKKwkJLyogTm8gc3RhY2sgZm9yIHRocmVhZCBtb2RlIHVudGlsIGEgdGFzaydzIGNvbnRleHQgaXMgbG9hZGVkLiAqLworCQlzZWN1cmVwb3J0U0VUX1BTUExJTSggc2VjdXJlY29udGV4dE5PX1NUQUNLICk7CisJCXNlY3VyZXBvcnRTRVRfUFNQKCBzZWN1cmVjb250ZXh0Tk9fU1RBQ0sgKTsKKworCQkjaWYoIGNvbmZpZ0VOQUJMRV9NUFUgPT0gMSApCisJCXsKKwkJCS8qIENvbmZpZ3VyZSB0aHJlYWQgbW9kZSB0byB1c2UgUFNQIGFuZCB0byBiZSB1bnByaXZpbGVnZWQuICovCisJCQlzZWN1cmVwb3J0U0VUX0NPTlRST0woIHNlY3VyZWNvbnRleHRDT05UUk9MX1ZBTFVFX1VOUFJJVklMRUdFRCApOworCQl9CisJCSNlbHNlIC8qIGNvbmZpZ0VOQUJMRV9NUFUgKi8KKwkJeworCQkJLyogQ29uZmlndXJlIHRocmVhZCBtb2RlIHRvIHVzZSBQU1AgYW5kIHRvIGJlIHByaXZpbGVnZWQuLiAqLworCQkJc2VjdXJlcG9ydFNFVF9DT05UUk9MKCBzZWN1cmVjb250ZXh0Q09OVFJPTF9WQUxVRV9QUklWSUxFR0VEICk7CisJCX0KKwkJI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9NUFUgKi8KKwl9Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmKCBjb25maWdFTkFCTEVfTVBVID09IDEgKQorCXNlY3VyZXBvcnROT05fU0VDVVJFX0NBTExBQkxFIFNlY3VyZUNvbnRleHRIYW5kbGVfdCBTZWN1cmVDb250ZXh0X0FsbG9jYXRlQ29udGV4dCggdWludDMyX3QgdWxTZWN1cmVTdGFja1NpemUsIHVpbnQzMl90IHVsSXNUYXNrUHJpdmlsZWdlZCApCisjZWxzZSAvKiBjb25maWdFTkFCTEVfTVBVICovCisJc2VjdXJlcG9ydE5PTl9TRUNVUkVfQ0FMTEFCTEUgU2VjdXJlQ29udGV4dEhhbmRsZV90IFNlY3VyZUNvbnRleHRfQWxsb2NhdGVDb250ZXh0KCB1aW50MzJfdCB1bFNlY3VyZVN0YWNrU2l6ZSApCisjZW5kaWYgLyogY29uZmlnRU5BQkxFX01QVSAqLworeworCXVpbnQ4X3QgKnB1Y1N0YWNrTWVtb3J5ID0gTlVMTDsKKwl1aW50MzJfdCB1bElQU1I7CisJU2VjdXJlQ29udGV4dEhhbmRsZV90IHhTZWN1cmVDb250ZXh0SGFuZGxlID0gTlVMTDsKKwkjaWYoIGNvbmZpZ0VOQUJMRV9NUFUgPT0gMSApCisJCXVpbnQzMl90ICpwdWxDdXJyZW50U3RhY2tQb2ludGVyID0gTlVMTDsKKwkjZW5kaWYgLyogY29uZmlnRU5BQkxFX01QVSAqLworCisJLyogUmVhZCB0aGUgSW50ZXJydXB0IFByb2dyYW0gU3RhdHVzIFJlZ2lzdGVyIChJUFNSKSB2YWx1ZS4gKi8KKwlzZWN1cmVwb3J0UkVBRF9JUFNSKCB1bElQU1IgKTsKKworCS8qIERvIG5vdGhpbmcgaWYgdGhlIHByb2Nlc3NvciBpcyBydW5uaW5nIGluIHRoZSBUaHJlYWQgTW9kZS4gSVBTUiBpcyB6ZXJvCisJICogd2hlbiB0aGUgcHJvY2Vzc29yIGlzIHJ1bm5pbmcgaW4gdGhlIFRocmVhZCBNb2RlLiAqLworCWlmKCB1bElQU1IgIT0gMCApCisJeworCQkvKiBBbGxvY2F0ZSB0aGUgY29udGV4dCBzdHJ1Y3R1cmUuICovCisJCXhTZWN1cmVDb250ZXh0SGFuZGxlID0gKCBTZWN1cmVDb250ZXh0SGFuZGxlX3QgKSBwdlBvcnRNYWxsb2MoIHNpemVvZiggU2VjdXJlQ29udGV4dF90ICkgKTsKKworCQlpZiggeFNlY3VyZUNvbnRleHRIYW5kbGUgIT0gTlVMTCApCisJCXsKKwkJCS8qIEFsbG9jYXRlIHRoZSBzdGFjayBzcGFjZS4gKi8KKwkJCXB1Y1N0YWNrTWVtb3J5ID0gcHZQb3J0TWFsbG9jKCB1bFNlY3VyZVN0YWNrU2l6ZSApOworCisJCQlpZiggcHVjU3RhY2tNZW1vcnkgIT0gTlVMTCApCisJCQl7CisJCQkJLyogU2luY2Ugc3RhY2sgZ3Jvd3MgZG93biwgdGhlIHN0YXJ0aW5nIHBvaW50IHdpbGwgYmUgdGhlIGxhc3QKKwkJCQkgKiBsb2NhdGlvbi4gTm90ZSB0aGF0IHRoaXMgbG9jYXRpb24gaXMgbmV4dCB0byB0aGUgbGFzdAorCQkJCSAqIGFsbG9jYXRlZCBieXRlIGJlY2F1c2UgdGhlIGhhcmR3YXJlIGRlY3JlbWVudHMgdGhlIHN0YWNrCisJCQkJICogcG9pbnRlciBiZWZvcmUgd3JpdGluZyBpLmUuIGlmIHN0YWNrIHBvaW50ZXIgaXMgMHgyLCBhIHB1c2gKKwkJCQkgKiBvcGVyYXRpb24gd2lsbCBkZWNyZW1lbnQgdGhlIHN0YWNrIHBvaW50ZXIgdG8gMHgxIGFuZCB0aGVuCisJCQkJICogd3JpdGUgYXQgMHgxLiAqLworCQkJCXhTZWN1cmVDb250ZXh0SGFuZGxlLT5wdWNTdGFja1N0YXJ0ID0gcHVjU3RhY2tNZW1vcnkgKyB1bFNlY3VyZVN0YWNrU2l6ZTsKKworCQkJCS8qIFRoZSBzdGFjayBjYW5ub3QgZ28gYmV5b25kIHRoaXMgbG9jYXRpb24uIFRoaXMgdmFsdWUgaXMKKwkJCQkgKiBwcm9ncmFtbWVkIGluIHRoZSBQU1BMSU0gcmVnaXN0ZXIgb24gY29udGV4dCBzd2l0Y2guKi8KKwkJCQl4U2VjdXJlQ29udGV4dEhhbmRsZS0+cHVjU3RhY2tMaW1pdCA9IHB1Y1N0YWNrTWVtb3J5OworCisJCQkJI2lmKCBjb25maWdFTkFCTEVfTVBVID09IDEgKQorCQkJCXsKKwkJCQkJLyogU3RvcmUgdGhlIGNvcnJlY3QgQ09OVFJPTCB2YWx1ZSBmb3IgdGhlIHRhc2sgb24gdGhlIHN0YWNrLgorCQkJCQkgKiBUaGlzIHZhbHVlIGlzIHByb2dyYW1tZWQgaW4gdGhlIENPTlRST0wgcmVnaXN0ZXIgb24KKwkJCQkJICogY29udGV4dCBzd2l0Y2guICovCisJCQkJCXB1bEN1cnJlbnRTdGFja1BvaW50ZXIgPSAoIHVpbnQzMl90ICogKSB4U2VjdXJlQ29udGV4dEhhbmRsZS0+cHVjU3RhY2tTdGFydDsKKwkJCQkJcHVsQ3VycmVudFN0YWNrUG9pbnRlci0tOworCQkJCQlpZiggdWxJc1Rhc2tQcml2aWxlZ2VkICkKKwkJCQkJeworCQkJCQkJKiggcHVsQ3VycmVudFN0YWNrUG9pbnRlciApID0gc2VjdXJlY29udGV4dENPTlRST0xfVkFMVUVfUFJJVklMRUdFRDsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCSooIHB1bEN1cnJlbnRTdGFja1BvaW50ZXIgKSA9IHNlY3VyZWNvbnRleHRDT05UUk9MX1ZBTFVFX1VOUFJJVklMRUdFRDsKKwkJCQkJfQorCisJCQkJCS8qIFN0b3JlIHRoZSBjdXJyZW50IHN0YWNrIHBvaW50ZXIuIFRoaXMgdmFsdWUgaXMgcHJvZ3JhbW1lZCBpbgorCQkJCQkgKiB0aGUgUFNQIHJlZ2lzdGVyIG9uIGNvbnRleHQgc3dpdGNoLiAqLworCQkJCQl4U2VjdXJlQ29udGV4dEhhbmRsZS0+cHVjQ3VycmVudFN0YWNrUG9pbnRlciA9ICggdWludDhfdCAqICkgcHVsQ3VycmVudFN0YWNrUG9pbnRlcjsKKwkJCQl9CisJCQkJI2Vsc2UgLyogY29uZmlnRU5BQkxFX01QVSAqLworCQkJCXsKKwkJCQkJLyogQ3VycmVudCBTUCBpcyBzZXQgdG8gdGhlIHN0YXJ0aW5nIG9mIHRoZSBzdGFjay4gVGhpcworCQkJCQkgKiB2YWx1ZSBwcm9ncmFtbWVkIGluIHRoZSBQU1AgcmVnaXN0ZXIgb24gY29udGV4dCBzd2l0Y2guICovCisJCQkJCXhTZWN1cmVDb250ZXh0SGFuZGxlLT5wdWNDdXJyZW50U3RhY2tQb2ludGVyID0geFNlY3VyZUNvbnRleHRIYW5kbGUtPnB1Y1N0YWNrU3RhcnQ7CisKKwkJCQl9CisJCQkJI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9NUFUgKi8KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkvKiBGcmVlIHRoZSBjb250ZXh0IHRvIGF2b2lkIG1lbW9yeSBsZWFrIGFuZCBtYWtlIHN1cmUgdG8gcmV0dXJuCisJCQkJICogTlVMTCB0byBpbmRpY2F0ZSBmYWlsdXJlLiAqLworCQkJCXZQb3J0RnJlZSggeFNlY3VyZUNvbnRleHRIYW5kbGUgKTsKKwkJCQl4U2VjdXJlQ29udGV4dEhhbmRsZSA9IE5VTEw7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4geFNlY3VyZUNvbnRleHRIYW5kbGU7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc2VjdXJlcG9ydE5PTl9TRUNVUkVfQ0FMTEFCTEUgdm9pZCBTZWN1cmVDb250ZXh0X0ZyZWVDb250ZXh0KCBTZWN1cmVDb250ZXh0SGFuZGxlX3QgeFNlY3VyZUNvbnRleHRIYW5kbGUgKQoreworCXVpbnQzMl90IHVsSVBTUjsKKworCS8qIFJlYWQgdGhlIEludGVycnVwdCBQcm9ncmFtIFN0YXR1cyBSZWdpc3RlciAoSVBTUikgdmFsdWUuICovCisJc2VjdXJlcG9ydFJFQURfSVBTUiggdWxJUFNSICk7CisKKwkvKiBEbyBub3RoaW5nIGlmIHRoZSBwcm9jZXNzb3IgaXMgcnVubmluZyBpbiB0aGUgVGhyZWFkIE1vZGUuIElQU1IgaXMgemVybworCSAqIHdoZW4gdGhlIHByb2Nlc3NvciBpcyBydW5uaW5nIGluIHRoZSBUaHJlYWQgTW9kZS4gKi8KKwlpZiggdWxJUFNSICE9IDAgKQorCXsKKwkJLyogRW5zdXJlIHRoYXQgdmFsaWQgcGFyYW1ldGVycyBhcmUgcGFzc2VkLiAqLworCQlzZWN1cmVwb3J0QVNTRVJUKCB4U2VjdXJlQ29udGV4dEhhbmRsZSAhPSBOVUxMICk7CisKKwkJLyogRnJlZSB0aGUgc3RhY2sgc3BhY2UuICovCisJCXZQb3J0RnJlZSggeFNlY3VyZUNvbnRleHRIYW5kbGUtPnB1Y1N0YWNrTGltaXQgKTsKKworCQkvKiBGcmVlIHRoZSBjb250ZXh0IGl0c2VsZi4gKi8KKwkJdlBvcnRGcmVlKCB4U2VjdXJlQ29udGV4dEhhbmRsZSApOworCX0KK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpkaWZmIC0tZ2l0IGEvU291cmNlL3BvcnRhYmxlL0dDQy9BUk1fQ00yMy9zZWN1cmUvc2VjdXJlX2NvbnRleHQuaCBiL1NvdXJjZS9wb3J0YWJsZS9HQ0MvQVJNX0NNMjMvc2VjdXJlL3NlY3VyZV9jb250ZXh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE0OGJmZgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9wb3J0YWJsZS9HQ0MvQVJNX0NNMjMvc2VjdXJlL3NlY3VyZV9jb250ZXh0LmgKQEAgLTAsMCArMSwxMTEgQEAKKy8qCisgKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjIuMQorICogQ29weXJpZ2h0IChDKSAyMDE5IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKKyAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCisgKiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCisgKiB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZgorICogdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLAorICogc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCisgKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUworICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SCisgKiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIKKyAqIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIGh0dHA6Ly93d3cuRnJlZVJUT1Mub3JnCisgKiBodHRwOi8vYXdzLmFtYXpvbi5jb20vZnJlZXJ0b3MKKyAqCisgKiAxIHRhYiA9PSA0IHNwYWNlcyEKKyAqLworCisjaWZuZGVmIF9fU0VDVVJFX0NPTlRFWFRfSF9fCisjZGVmaW5lIF9fU0VDVVJFX0NPTlRFWFRfSF9fCisKKy8qIFN0YW5kYXJkIGluY2x1ZGVzLiAqLworI2luY2x1ZGUgPHN0ZGludC5oPgorCisvKiBGcmVlUlRPUyBpbmNsdWRlcy4gKi8KKyNpbmNsdWRlICJGcmVlUlRPU0NvbmZpZy5oIgorCisvKioKKyAqIEBicmllZiBQU1AgdmFsdWUgd2hlbiBubyB0YXNrJ3MgY29udGV4dCBpcyBsb2FkZWQuCisgKi8KKyNkZWZpbmUgc2VjdXJlY29udGV4dE5PX1NUQUNLCTB4MAorCisvKioKKyAqIEBicmllZiBPcGFxdWUgaGFuZGxlLgorICovCitzdHJ1Y3QgU2VjdXJlQ29udGV4dDsKK3R5cGVkZWYgc3RydWN0IFNlY3VyZUNvbnRleHQqCVNlY3VyZUNvbnRleHRIYW5kbGVfdDsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAqIEBicmllZiBJbml0aWFsaXplcyB0aGUgc2VjdXJlIGNvbnRleHQgbWFuYWdlbWVudCBzeXN0ZW0uCisgKgorICogUFNQIGlzIHNldCB0byBOVUxMIGFuZCB0aGVyZWZvcmUgYSB0YXNrIG11c3QgYWxsb2NhdGUgYW5kIGxvYWQgYSBjb250ZXh0CisgKiBiZWZvcmUgY2FsbGluZyBhbnkgc2VjdXJlIHNpZGUgZnVuY3Rpb24gaW4gdGhlIHRocmVhZCBtb2RlLgorICoKKyAqIEBub3RlIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgaW4gdGhlIGhhbmRsZXIgbW9kZS4gSXQgaXMgbm8tb3AgaWYgY2FsbGVkCisgKiBpbiB0aGUgdGhyZWFkIG1vZGUuCisgKi8KK3ZvaWQgU2VjdXJlQ29udGV4dF9Jbml0KCB2b2lkICk7CisKKy8qKgorICogQGJyaWVmIEFsbG9jYXRlcyBhIGNvbnRleHQgb24gdGhlIHNlY3VyZSBzaWRlLgorICoKKyAqIEBub3RlIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgaW4gdGhlIGhhbmRsZXIgbW9kZS4gSXQgaXMgbm8tb3AgaWYgY2FsbGVkCisgKiBpbiB0aGUgdGhyZWFkIG1vZGUuCisgKgorICogQHBhcmFtW2luXSB1bFNlY3VyZVN0YWNrU2l6ZSBTaXplIG9mIHRoZSBzdGFjayB0byBhbGxvY2F0ZSBvbiBzZWN1cmUgc2lkZS4KKyAqIEBwYXJhbVtpbl0gdWxJc1Rhc2tQcml2aWxlZ2VkIDEgaWYgdGhlIGNhbGxpbmcgdGFzayBpcyBwcml2aWxlZ2VkLCAwIG90aGVyd2lzZS4KKyAqCisgKiBAcmV0dXJuIE9wYXF1ZSBjb250ZXh0IGhhbmRsZSBpZiBjb250ZXh0IGlzIHN1Y2Nlc3NmdWxseSBhbGxvY2F0ZWQsIE5VTEwKKyAqIG90aGVyd2lzZS4KKyAqLworI2lmKCBjb25maWdFTkFCTEVfTVBVID09IDEgKQorCVNlY3VyZUNvbnRleHRIYW5kbGVfdCBTZWN1cmVDb250ZXh0X0FsbG9jYXRlQ29udGV4dCggdWludDMyX3QgdWxTZWN1cmVTdGFja1NpemUsIHVpbnQzMl90IHVsSXNUYXNrUHJpdmlsZWdlZCApOworI2Vsc2UgLyogY29uZmlnRU5BQkxFX01QVSAqLworCVNlY3VyZUNvbnRleHRIYW5kbGVfdCBTZWN1cmVDb250ZXh0X0FsbG9jYXRlQ29udGV4dCggdWludDMyX3QgdWxTZWN1cmVTdGFja1NpemUgKTsKKyNlbmRpZiAvKiBjb25maWdFTkFCTEVfTVBVICovCisKKy8qKgorICogQGJyaWVmIEZyZWVzIHRoZSBnaXZlbiBjb250ZXh0LgorICoKKyAqIEBub3RlIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgaW4gdGhlIGhhbmRsZXIgbW9kZS4gSXQgaXMgbm8tb3AgaWYgY2FsbGVkCisgKiBpbiB0aGUgdGhyZWFkIG1vZGUuCisgKgorICogQHBhcmFtW2luXSB4U2VjdXJlQ29udGV4dEhhbmRsZSBDb250ZXh0IGhhbmRsZSBjb3JyZXNwb25kaW5nIHRvIHRoZQorICogY29udGV4dCB0byBiZSBmcmVlZC4KKyAqLwordm9pZCBTZWN1cmVDb250ZXh0X0ZyZWVDb250ZXh0KCBTZWN1cmVDb250ZXh0SGFuZGxlX3QgeFNlY3VyZUNvbnRleHRIYW5kbGUgKTsKKworLyoqCisgKiBAYnJpZWYgTG9hZHMgdGhlIGdpdmVuIGNvbnRleHQuCisgKgorICogQG5vdGUgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBpbiB0aGUgaGFuZGxlciBtb2RlLiBJdCBpcyBuby1vcCBpZiBjYWxsZWQKKyAqIGluIHRoZSB0aHJlYWQgbW9kZS4KKyAqCisgKiBAcGFyYW1baW5dIHhTZWN1cmVDb250ZXh0SGFuZGxlIENvbnRleHQgaGFuZGxlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGNvbnRleHQKKyAqIHRvIGJlIGxvYWRlZC4KKyAqLwordm9pZCBTZWN1cmVDb250ZXh0X0xvYWRDb250ZXh0KCBTZWN1cmVDb250ZXh0SGFuZGxlX3QgeFNlY3VyZUNvbnRleHRIYW5kbGUgKTsKKworLyoqCisgKiBAYnJpZWYgU2F2ZXMgdGhlIGdpdmVuIGNvbnRleHQuCisgKgorICogQG5vdGUgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBpbiB0aGUgaGFuZGxlciBtb2RlLiBJdCBpcyBuby1vcCBpZiBjYWxsZWQKKyAqIGluIHRoZSB0aHJlYWQgbW9kZS4KKyAqCisgKiBAcGFyYW1baW5dIHhTZWN1cmVDb250ZXh0SGFuZGxlIENvbnRleHQgaGFuZGxlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGNvbnRleHQKKyAqIHRvIGJlIHNhdmVkLgorICovCit2b2lkIFNlY3VyZUNvbnRleHRfU2F2ZUNvbnRleHQoIFNlY3VyZUNvbnRleHRIYW5kbGVfdCB4U2VjdXJlQ29udGV4dEhhbmRsZSApOworCisjZW5kaWYgLyogX19TRUNVUkVfQ09OVEVYVF9IX18gKi8KZGlmZiAtLWdpdCBhL1NvdXJjZS9wb3J0YWJsZS9HQ0MvQVJNX0NNMjMvc2VjdXJlL3NlY3VyZV9jb250ZXh0X3BvcnQuYyBiL1NvdXJjZS9wb3J0YWJsZS9HQ0MvQVJNX0NNMjMvc2VjdXJlL3NlY3VyZV9jb250ZXh0X3BvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzAzNDk4Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL3BvcnRhYmxlL0dDQy9BUk1fQ00yMy9zZWN1cmUvc2VjdXJlX2NvbnRleHRfcG9ydC5jCkBAIC0wLDAgKzEsOTEgQEAKKy8qCisgKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjIuMQorICogQ29weXJpZ2h0IChDKSAyMDE5IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKKyAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCisgKiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCisgKiB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZgorICogdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLAorICogc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCisgKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUworICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SCisgKiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIKKyAqIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIGh0dHA6Ly93d3cuRnJlZVJUT1Mub3JnCisgKiBodHRwOi8vYXdzLmFtYXpvbi5jb20vZnJlZXJ0b3MKKyAqCisgKiAxIHRhYiA9PSA0IHNwYWNlcyEKKyAqLworCisvKiBTZWN1cmUgY29udGV4dCBpbmNsdWRlcy4gKi8KKyNpbmNsdWRlICJzZWN1cmVfY29udGV4dC5oIgorCisvKiBTZWN1cmUgcG9ydCBtYWNyb3MuICovCisjaW5jbHVkZSAic2VjdXJlX3BvcnRfbWFjcm9zLmgiCisKKyNpZiggY29uZmlnRU5BQkxFX0ZQVSA9PSAxICkKKwkjZXJyb3IgQ29ydGV4LU0yMyBkb2VzIG5vdCBoYXZlIGEgRmxvYXRpbmcgUG9pbnQgVW5pdCAoRlBVKSBhbmQgdGhlcmVmb3JlIGNvbmZpZ0VOQUJMRV9GUFUgbXVzdCBiZSBzZXQgdG8gMC4KKyNlbmRpZgorCitzZWN1cmVwb3J0Tk9OX1NFQ1VSRV9DQUxMQUJMRSB2b2lkIFNlY3VyZUNvbnRleHRfTG9hZENvbnRleHQoIFNlY3VyZUNvbnRleHRIYW5kbGVfdCB4U2VjdXJlQ29udGV4dEhhbmRsZSApCit7CisJLyogeFNlY3VyZUNvbnRleHRIYW5kbGUgdmFsdWUgaXMgaW4gcjAuICovCisJX19hc20gdm9sYXRpbGUKKwkoCisJIgkuc3ludGF4IHVuaWZpZWQJCQkJCQkJXG4iCisJIgkJCQkJCQkJCQkJXG4iCisJIgltcnMgcjEsIGlwc3IJCQkJCQkJXG4iIC8qIHIxID0gSVBTUi4gKi8KKwkiCWNieiByMSwgbG9hZF9jdHhfdGhlcmFkX21vZGUJCQlcbiIgLyogRG8gbm90aGluZyBpZiB0aGUgcHJvY2Vzc29yIGlzIHJ1bm5pbmcgaW4gdGhlIFRocmVhZCBNb2RlLiAqLworCSIJbGRtaWEgcjAhLCB7cjEsIHIyfQkJCQkJCVxuIiAvKiByMSA9IHhTZWN1cmVDb250ZXh0SGFuZGxlLT5wdWNDdXJyZW50U3RhY2tQb2ludGVyLCByMiA9IHhTZWN1cmVDb250ZXh0SGFuZGxlLT5wdWNTdGFja0xpbWl0LiAqLworCSNpZiggY29uZmlnRU5BQkxFX01QVSA9PSAxICkKKwkiCWxkbWlhIHIxISwge3IzfQkJCQkJCQlcbiIgLyogUmVhZCBDT05UUk9MIHJlZ2lzdGVyIHZhbHVlIGZyb20gdGFzaydzIHN0YWNrLiByMyA9IENPTlRST0wuICovCisJIgltc3IgY29udHJvbCwgcjMJCQkJCQkJXG4iIC8qIENPTlRST0wgPSByMy4gKi8KKwkjZW5kaWYgLyogY29uZmlnRU5BQkxFX01QVSAqLworCSIJbXNyIHBzcGxpbSwgcjIJCQkJCQkJXG4iIC8qIFBTUExJTSA9IHIyLiAqLworCSIJbXNyIHBzcCwgcjEJCQkJCQkJCVxuIiAvKiBQU1AgPSByMS4gKi8KKwkiCQkJCQkJCQkJCQlcbiIKKwkiIGxvYWRfY3R4X3RoZXJhZF9tb2RlOgkJCQkJCVxuIgorCSIJbm9wCQkJCQkJCQkJCVxuIgorCSIJCQkJCQkJCQkJCVxuIgorCTo6OiJyMCIsICJyMSIsICJyMiIKKwkpOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3NlY3VyZXBvcnROT05fU0VDVVJFX0NBTExBQkxFIHZvaWQgU2VjdXJlQ29udGV4dF9TYXZlQ29udGV4dCggU2VjdXJlQ29udGV4dEhhbmRsZV90IHhTZWN1cmVDb250ZXh0SGFuZGxlICkKK3sKKwkvKiB4U2VjdXJlQ29udGV4dEhhbmRsZSB2YWx1ZSBpcyBpbiByMC4gKi8KKwlfX2FzbSB2b2xhdGlsZQorCSgKKwkiCS5zeW50YXggdW5pZmllZAkJCQkJCQlcbiIKKwkiCQkJCQkJCQkJCQlcbiIKKwkiCW1ycyByMSwgaXBzcgkJCQkJCQlcbiIgLyogcjEgPSBJUFNSLiAqLworCSIJY2J6IHIxLCBzYXZlX2N0eF90aGVyYWRfbW9kZQkJCVxuIiAvKiBEbyBub3RoaW5nIGlmIHRoZSBwcm9jZXNzb3IgaXMgcnVubmluZyBpbiB0aGUgVGhyZWFkIE1vZGUuICovCisJIgltcnMgcjEsIHBzcAkJCQkJCQkJXG4iIC8qIHIxID0gUFNQLiAqLworCSNpZiggY29uZmlnRU5BQkxFX01QVSA9PSAxICkKKwkiCW1ycyByMiwgY29udHJvbAkJCQkJCQlcbiIgLyogcjIgPSBDT05UUk9MLiAqLworCSIJc3VicyByMSwgcjEsICM0CQkJCQkJCVxuIiAvKiBNYWtlIHNwYWNlIGZvciB0aGUgQ09OVFJPTCB2YWx1ZSBvbiB0aGUgc3RhY2suICovCisJIglzdHIgcjEsIFtyMF0JCQkJCQkJXG4iIC8qIFNhdmUgdGhlIHRvcCBvZiBzdGFjayBpbiBjb250ZXh0LiB4U2VjdXJlQ29udGV4dEhhbmRsZS0+cHVjQ3VycmVudFN0YWNrUG9pbnRlciA9IHIxLiAqLworCSIJc3RtaWEgcjEhLCB7cjJ9CQkJCQkJCVxuIiAvKiBTdG9yZSBDT05UUk9MIHZhbHVlIG9uIHRoZSBzdGFjay4gKi8KKwkjZWxzZSAvKiBjb25maWdFTkFCTEVfTVBVICovCisJIglzdHIgcjEsIFtyMF0JCQkJCQkJXG4iIC8qIFNhdmUgdGhlIHRvcCBvZiBzdGFjayBpbiBjb250ZXh0LiB4U2VjdXJlQ29udGV4dEhhbmRsZS0+cHVjQ3VycmVudFN0YWNrUG9pbnRlciA9IHIxLiAqLworCSNlbmRpZiAvKiBjb25maWdFTkFCTEVfTVBVICovCisJIgltb3ZzIHIxLCAlMAkJCQkJCQkJXG4iIC8qIHIxID0gc2VjdXJlY29udGV4dE5PX1NUQUNLLiAqLworCSIJbXNyIHBzcGxpbSwgcjEJCQkJCQkJXG4iIC8qIFBTUExJTSA9IHNlY3VyZWNvbnRleHROT19TVEFDSy4gKi8KKwkiCW1zciBwc3AsIHIxCQkJCQkJCQlcbiIgLyogUFNQID0gc2VjdXJlY29udGV4dE5PX1NUQUNLIGkuZS4gTm8gc3RhY2sgZm9yIHRocmVhZCBtb2RlIHVudGlsIG5leHQgdGFzaydzIGNvbnRleHQgaXMgbG9hZGVkLiAqLworCSIJCQkJCQkJCQkJCVxuIgorCSIgc2F2ZV9jdHhfdGhlcmFkX21vZGU6CQkJCQkJXG4iCisJIglub3AJCQkJCQkJCQkJXG4iCisJIgkJCQkJCQkJCQkJXG4iCisJOjogImkiICggc2VjdXJlY29udGV4dE5PX1NUQUNLICkgOiAicjEiLCAibWVtb3J5IgorCSk7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KZGlmZiAtLWdpdCBhL1NvdXJjZS9wb3J0YWJsZS9HQ0MvQVJNX0NNMjMvc2VjdXJlL3NlY3VyZV9oZWFwLmMgYi9Tb3VyY2UvcG9ydGFibGUvR0NDL0FSTV9DTTIzL3NlY3VyZS9zZWN1cmVfaGVhcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwZmNlNWMKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvcG9ydGFibGUvR0NDL0FSTV9DTTIzL3NlY3VyZS9zZWN1cmVfaGVhcC5jCkBAIC0wLDAgKzEsNDUwIEBACisvKgorICogRnJlZVJUT1MgS2VybmVsIFYxMC4yLjEKKyAqIENvcHlyaWdodCAoQykgMjAxOSBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCisgKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgorICogdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bworICogdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YKKyAqIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKKyAqIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAorICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MKKyAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUgorICogQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSCisgKiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBodHRwOi8vd3d3LkZyZWVSVE9TLm9yZworICogaHR0cDovL2F3cy5hbWF6b24uY29tL2ZyZWVydG9zCisgKgorICogMSB0YWIgPT0gNCBzcGFjZXMhCisgKi8KKworLyogU3RhbmRhcmQgaW5jbHVkZXMuICovCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8qIFNlY3VyZSBjb250ZXh0IGhlYXAgaW5jbHVkZXMuICovCisjaW5jbHVkZSAic2VjdXJlX2hlYXAuaCIKKworLyogU2VjdXJlIHBvcnQgbWFjcm9zLiAqLworI2luY2x1ZGUgInNlY3VyZV9wb3J0X21hY3Jvcy5oIgorCisvKioKKyAqIEBicmllZiBUb3RhbCBoZWFwIHNpemUuCisgKi8KKyNkZWZpbmUgc2VjdXJlY29uZmlnVE9UQUxfSEVBUF9TSVpFCQkoICggKCBzaXplX3QgKSAoIDEwICogMTAyNCApICkgKQorCisvKiBObyB0ZXN0IG1hcmtlciBieSBkZWZhdWx0LiAqLworI2lmbmRlZiBtdENPVkVSQUdFX1RFU1RfTUFSS0VSCisJI2RlZmluZSBtdENPVkVSQUdFX1RFU1RfTUFSS0VSKCkKKyNlbmRpZgorCisvKiBObyB0cmFjaW5nIGJ5IGRlZmF1bHQuICovCisjaWZuZGVmIHRyYWNlTUFMTE9DCisJI2RlZmluZSB0cmFjZU1BTExPQyggcHZSZXR1cm4sIHhXYW50ZWRTaXplICkKKyNlbmRpZgorCisvKiBObyB0cmFjaW5nIGJ5IGRlZmF1bHQuICovCisjaWZuZGVmIHRyYWNlRlJFRQorCSNkZWZpbmUgdHJhY2VGUkVFKCBwdiwgeEJsb2NrU2l6ZSApCisjZW5kaWYKKworLyogQmxvY2sgc2l6ZXMgbXVzdCBub3QgZ2V0IHRvbyBzbWFsbC4gKi8KKyNkZWZpbmUgc2VjdXJlaGVhcE1JTklNVU1fQkxPQ0tfU0laRQkoICggc2l6ZV90ICkgKCB4SGVhcFN0cnVjdFNpemUgPDwgMSApICkKKworLyogQXNzdW1lcyA4Yml0IGJ5dGVzISAqLworI2RlZmluZSBzZWN1cmVoZWFwQklUU19QRVJfQllURQkJCSggKCBzaXplX3QgKSA4ICkKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBBbGxvY2F0ZSB0aGUgbWVtb3J5IGZvciB0aGUgaGVhcC4gKi8KKyNpZiggY29uZmlnQVBQTElDQVRJT05fQUxMT0NBVEVEX0hFQVAgPT0gMSApCisJLyogVGhlIGFwcGxpY2F0aW9uIHdyaXRlciBoYXMgYWxyZWFkeSBkZWZpbmVkIHRoZSBhcnJheSB1c2VkIGZvciB0aGUgUlRPUworCSAqIGhlYXAgLSBwcm9iYWJseSBzbyBpdCBjYW4gYmUgcGxhY2VkIGluIGEgc3BlY2lhbCBzZWdtZW50IG9yIGFkZHJlc3MuICovCisJZXh0ZXJuIHVpbnQ4X3QgdWNIZWFwWyBzZWN1cmVjb25maWdUT1RBTF9IRUFQX1NJWkUgXTsKKyNlbHNlIC8qIGNvbmZpZ0FQUExJQ0FUSU9OX0FMTE9DQVRFRF9IRUFQICovCisJc3RhdGljIHVpbnQ4X3QgdWNIZWFwWyBzZWN1cmVjb25maWdUT1RBTF9IRUFQX1NJWkUgXTsKKyNlbmRpZiAvKiBjb25maWdBUFBMSUNBVElPTl9BTExPQ0FURURfSEVBUCAqLworCisvKioKKyAqIEBicmllZiBUaGUgbGlua2VkIGxpc3Qgc3RydWN0dXJlLgorICoKKyAqIFRoaXMgaXMgdXNlZCB0byBsaW5rIGZyZWUgYmxvY2tzIGluIG9yZGVyIG9mIHRoZWlyIG1lbW9yeSBhZGRyZXNzLgorICovCit0eXBlZGVmIHN0cnVjdCBBX0JMT0NLX0xJTksKK3sKKwlzdHJ1Y3QgQV9CTE9DS19MSU5LICpweE5leHRGcmVlQmxvY2s7CS8qKjwgVGhlIG5leHQgZnJlZSBibG9jayBpbiB0aGUgbGlzdC4gKi8KKwlzaXplX3QgeEJsb2NrU2l6ZTsJCQkJCQkvKio8IFRoZSBzaXplIG9mIHRoZSBmcmVlIGJsb2NrLiAqLworfSBCbG9ja0xpbmtfdDsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAqIEBicmllZiBDYWxsZWQgYXV0b21hdGljYWxseSB0byBzZXR1cCB0aGUgcmVxdWlyZWQgaGVhcCBzdHJ1Y3R1cmVzIHRoZSBmaXJzdAorICogdGltZSBwdlBvcnRNYWxsb2MoKSBpcyBjYWxsZWQuCisgKi8KK3N0YXRpYyB2b2lkIHBydkhlYXBJbml0KCB2b2lkICk7CisKKy8qKgorICogQGJyaWVmIEluc2VydHMgYSBibG9jayBvZiBtZW1vcnkgdGhhdCBpcyBiZWluZyBmcmVlZCBpbnRvIHRoZSBjb3JyZWN0CisgKiBwb3NpdGlvbiBpbiB0aGUgbGlzdCBvZiBmcmVlIG1lbW9yeSBibG9ja3MuCisgKgorICogVGhlIGJsb2NrIGJlaW5nIGZyZWVkIHdpbGwgYmUgbWVyZ2VkIHdpdGggdGhlIGJsb2NrIGluIGZyb250IGl0IGFuZC9vciB0aGUKKyAqIGJsb2NrIGJlaGluZCBpdCBpZiB0aGUgbWVtb3J5IGJsb2NrcyBhcmUgYWRqYWNlbnQgdG8gZWFjaCBvdGhlci4KKyAqCisgKiBAcGFyYW1baW5dIHB4QmxvY2tUb0luc2VydCBUaGUgYmxvY2sgYmVpbmcgZnJlZWQuCisgKi8KK3N0YXRpYyB2b2lkIHBydkluc2VydEJsb2NrSW50b0ZyZWVMaXN0KCBCbG9ja0xpbmtfdCAqcHhCbG9ja1RvSW5zZXJ0ICk7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqCisgKiBAYnJpZWYgVGhlIHNpemUgb2YgdGhlIHN0cnVjdHVyZSBwbGFjZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIGFsbG9jYXRlZAorICogbWVtb3J5IGJsb2NrIG11c3QgYnkgY29ycmVjdGx5IGJ5dGUgYWxpZ25lZC4KKyAqLworc3RhdGljIGNvbnN0IHNpemVfdCB4SGVhcFN0cnVjdFNpemUgPSAoIHNpemVvZiggQmxvY2tMaW5rX3QgKSArICggKCBzaXplX3QgKSAoIHNlY3VyZXBvcnRCWVRFX0FMSUdOTUVOVCAtIDEgKSApICkgJiB+KCAoIHNpemVfdCApIHNlY3VyZXBvcnRCWVRFX0FMSUdOTUVOVF9NQVNLICk7CisKKy8qKgorICogQGJyaWVmIENyZWF0ZSBhIGNvdXBsZSBvZiBsaXN0IGxpbmtzIHRvIG1hcmsgdGhlIHN0YXJ0IGFuZCBlbmQgb2YgdGhlIGxpc3QuCisgKi8KK3N0YXRpYyBCbG9ja0xpbmtfdCB4U3RhcnQsICpweEVuZCA9IE5VTEw7CisKKy8qKgorICogQGJyaWVmIEtlZXBzIHRyYWNrIG9mIHRoZSBudW1iZXIgb2YgZnJlZSBieXRlcyByZW1haW5pbmcsIGJ1dCBzYXlzIG5vdGhpbmcKKyAqIGFib3V0IGZyYWdtZW50YXRpb24uCisgKi8KK3N0YXRpYyBzaXplX3QgeEZyZWVCeXRlc1JlbWFpbmluZyA9IDBVOworc3RhdGljIHNpemVfdCB4TWluaW11bUV2ZXJGcmVlQnl0ZXNSZW1haW5pbmcgPSAwVTsKKworLyoqCisgKiBAYnJpZWYgR2V0cyBzZXQgdG8gdGhlIHRvcCBiaXQgb2YgYW4gc2l6ZV90IHR5cGUuCisgKgorICogV2hlbiB0aGlzIGJpdCBpbiB0aGUgeEJsb2NrU2l6ZSBtZW1iZXIgb2YgYW4gQmxvY2tMaW5rX3Qgc3RydWN0dXJlIGlzIHNldAorICogdGhlbiB0aGUgYmxvY2sgYmVsb25ncyB0byB0aGUgYXBwbGljYXRpb24uIFdoZW4gdGhlIGJpdCBpcyBmcmVlIHRoZSBibG9jayBpcworICogc3RpbGwgcGFydCBvZiB0aGUgZnJlZSBoZWFwIHNwYWNlLgorICovCitzdGF0aWMgc2l6ZV90IHhCbG9ja0FsbG9jYXRlZEJpdCA9IDA7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHZvaWQgcHJ2SGVhcEluaXQoIHZvaWQgKQoreworQmxvY2tMaW5rX3QgKnB4Rmlyc3RGcmVlQmxvY2s7Cit1aW50OF90ICpwdWNBbGlnbmVkSGVhcDsKK3NpemVfdCB1eEFkZHJlc3M7CitzaXplX3QgeFRvdGFsSGVhcFNpemUgPSBzZWN1cmVjb25maWdUT1RBTF9IRUFQX1NJWkU7CisKKwkvKiBFbnN1cmUgdGhlIGhlYXAgc3RhcnRzIG9uIGEgY29ycmVjdGx5IGFsaWduZWQgYm91bmRhcnkuICovCisJdXhBZGRyZXNzID0gKCBzaXplX3QgKSB1Y0hlYXA7CisKKwlpZiggKCB1eEFkZHJlc3MgJiBzZWN1cmVwb3J0QllURV9BTElHTk1FTlRfTUFTSyApICE9IDAgKQorCXsKKwkJdXhBZGRyZXNzICs9ICggc2VjdXJlcG9ydEJZVEVfQUxJR05NRU5UIC0gMSApOworCQl1eEFkZHJlc3MgJj0gfiggKCBzaXplX3QgKSBzZWN1cmVwb3J0QllURV9BTElHTk1FTlRfTUFTSyApOworCQl4VG90YWxIZWFwU2l6ZSAtPSB1eEFkZHJlc3MgLSAoIHNpemVfdCApIHVjSGVhcDsKKwl9CisKKwlwdWNBbGlnbmVkSGVhcCA9ICggdWludDhfdCAqICkgdXhBZGRyZXNzOworCisJLyogeFN0YXJ0IGlzIHVzZWQgdG8gaG9sZCBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIGxpc3Qgb2YgZnJlZQorCSAqIGJsb2Nrcy4gIFRoZSB2b2lkIGNhc3QgaXMgdXNlZCB0byBwcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzLiAqLworCXhTdGFydC5weE5leHRGcmVlQmxvY2sgPSAoIHZvaWQgKiApIHB1Y0FsaWduZWRIZWFwOworCXhTdGFydC54QmxvY2tTaXplID0gKCBzaXplX3QgKSAwOworCisJLyogcHhFbmQgaXMgdXNlZCB0byBtYXJrIHRoZSBlbmQgb2YgdGhlIGxpc3Qgb2YgZnJlZSBibG9ja3MgYW5kIGlzIGluc2VydGVkCisJICogYXQgdGhlIGVuZCBvZiB0aGUgaGVhcCBzcGFjZS4gKi8KKwl1eEFkZHJlc3MgPSAoICggc2l6ZV90ICkgcHVjQWxpZ25lZEhlYXAgKSArIHhUb3RhbEhlYXBTaXplOworCXV4QWRkcmVzcyAtPSB4SGVhcFN0cnVjdFNpemU7CisJdXhBZGRyZXNzICY9IH4oICggc2l6ZV90ICkgc2VjdXJlcG9ydEJZVEVfQUxJR05NRU5UX01BU0sgKTsKKwlweEVuZCA9ICggdm9pZCAqICkgdXhBZGRyZXNzOworCXB4RW5kLT54QmxvY2tTaXplID0gMDsKKwlweEVuZC0+cHhOZXh0RnJlZUJsb2NrID0gTlVMTDsKKworCS8qIFRvIHN0YXJ0IHdpdGggdGhlcmUgaXMgYSBzaW5nbGUgZnJlZSBibG9jayB0aGF0IGlzIHNpemVkIHRvIHRha2UgdXAgdGhlCisJICogZW50aXJlIGhlYXAgc3BhY2UsIG1pbnVzIHRoZSBzcGFjZSB0YWtlbiBieSBweEVuZC4gKi8KKwlweEZpcnN0RnJlZUJsb2NrID0gKCB2b2lkICogKSBwdWNBbGlnbmVkSGVhcDsKKwlweEZpcnN0RnJlZUJsb2NrLT54QmxvY2tTaXplID0gdXhBZGRyZXNzIC0gKCBzaXplX3QgKSBweEZpcnN0RnJlZUJsb2NrOworCXB4Rmlyc3RGcmVlQmxvY2stPnB4TmV4dEZyZWVCbG9jayA9IHB4RW5kOworCisJLyogT25seSBvbmUgYmxvY2sgZXhpc3RzIC0gYW5kIGl0IGNvdmVycyB0aGUgZW50aXJlIHVzYWJsZSBoZWFwIHNwYWNlLiAqLworCXhNaW5pbXVtRXZlckZyZWVCeXRlc1JlbWFpbmluZyA9IHB4Rmlyc3RGcmVlQmxvY2stPnhCbG9ja1NpemU7CisJeEZyZWVCeXRlc1JlbWFpbmluZyA9IHB4Rmlyc3RGcmVlQmxvY2stPnhCbG9ja1NpemU7CisKKwkvKiBXb3JrIG91dCB0aGUgcG9zaXRpb24gb2YgdGhlIHRvcCBiaXQgaW4gYSBzaXplX3QgdmFyaWFibGUuICovCisJeEJsb2NrQWxsb2NhdGVkQml0ID0gKCAoIHNpemVfdCApIDEgKSA8PCAoICggc2l6ZW9mKCBzaXplX3QgKSAqIHNlY3VyZWhlYXBCSVRTX1BFUl9CWVRFICkgLSAxICk7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHZvaWQgcHJ2SW5zZXJ0QmxvY2tJbnRvRnJlZUxpc3QoIEJsb2NrTGlua190ICpweEJsb2NrVG9JbnNlcnQgKQoreworQmxvY2tMaW5rX3QgKnB4SXRlcmF0b3I7Cit1aW50OF90ICpwdWM7CisKKwkvKiBJdGVyYXRlIHRocm91Z2ggdGhlIGxpc3QgdW50aWwgYSBibG9jayBpcyBmb3VuZCB0aGF0IGhhcyBhIGhpZ2hlciBhZGRyZXNzCisJICogdGhhbiB0aGUgYmxvY2sgYmVpbmcgaW5zZXJ0ZWQuICovCisJZm9yKCBweEl0ZXJhdG9yID0gJnhTdGFydDsgcHhJdGVyYXRvci0+cHhOZXh0RnJlZUJsb2NrIDwgcHhCbG9ja1RvSW5zZXJ0OyBweEl0ZXJhdG9yID0gcHhJdGVyYXRvci0+cHhOZXh0RnJlZUJsb2NrICkKKwl7CisJCS8qIE5vdGhpbmcgdG8gZG8gaGVyZSwganVzdCBpdGVyYXRlIHRvIHRoZSByaWdodCBwb3NpdGlvbi4gKi8KKwl9CisKKwkvKiBEbyB0aGUgYmxvY2sgYmVpbmcgaW5zZXJ0ZWQsIGFuZCB0aGUgYmxvY2sgaXQgaXMgYmVpbmcgaW5zZXJ0ZWQgYWZ0ZXIKKwkgKiBtYWtlIGEgY29udGlndW91cyBibG9jayBvZiBtZW1vcnk/ICovCisJcHVjID0gKCB1aW50OF90ICogKSBweEl0ZXJhdG9yOworCWlmKCAoIHB1YyArIHB4SXRlcmF0b3ItPnhCbG9ja1NpemUgKSA9PSAoIHVpbnQ4X3QgKiApIHB4QmxvY2tUb0luc2VydCApCisJeworCQlweEl0ZXJhdG9yLT54QmxvY2tTaXplICs9IHB4QmxvY2tUb0luc2VydC0+eEJsb2NrU2l6ZTsKKwkJcHhCbG9ja1RvSW5zZXJ0ID0gcHhJdGVyYXRvcjsKKwl9CisJZWxzZQorCXsKKwkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCX0KKworCS8qIERvIHRoZSBibG9jayBiZWluZyBpbnNlcnRlZCwgYW5kIHRoZSBibG9jayBpdCBpcyBiZWluZyBpbnNlcnRlZCBiZWZvcmUKKwkgKiBtYWtlIGEgY29udGlndW91cyBibG9jayBvZiBtZW1vcnk/ICovCisJcHVjID0gKCB1aW50OF90ICogKSBweEJsb2NrVG9JbnNlcnQ7CisJaWYoICggcHVjICsgcHhCbG9ja1RvSW5zZXJ0LT54QmxvY2tTaXplICkgPT0gKCB1aW50OF90ICogKSBweEl0ZXJhdG9yLT5weE5leHRGcmVlQmxvY2sgKQorCXsKKwkJaWYoIHB4SXRlcmF0b3ItPnB4TmV4dEZyZWVCbG9jayAhPSBweEVuZCApCisJCXsKKwkJCS8qIEZvcm0gb25lIGJpZyBibG9jayBmcm9tIHRoZSB0d28gYmxvY2tzLiAqLworCQkJcHhCbG9ja1RvSW5zZXJ0LT54QmxvY2tTaXplICs9IHB4SXRlcmF0b3ItPnB4TmV4dEZyZWVCbG9jay0+eEJsb2NrU2l6ZTsKKwkJCXB4QmxvY2tUb0luc2VydC0+cHhOZXh0RnJlZUJsb2NrID0gcHhJdGVyYXRvci0+cHhOZXh0RnJlZUJsb2NrLT5weE5leHRGcmVlQmxvY2s7CisJCX0KKwkJZWxzZQorCQl7CisJCQlweEJsb2NrVG9JbnNlcnQtPnB4TmV4dEZyZWVCbG9jayA9IHB4RW5kOworCQl9CisJfQorCWVsc2UKKwl7CisJCXB4QmxvY2tUb0luc2VydC0+cHhOZXh0RnJlZUJsb2NrID0gcHhJdGVyYXRvci0+cHhOZXh0RnJlZUJsb2NrOworCX0KKworCS8qIElmIHRoZSBibG9jayBiZWluZyBpbnNlcnRlZCBwbHVnZ2VkIGEgZ2FiLCBzbyB3YXMgbWVyZ2VkIHdpdGggdGhlIGJsb2NrCisJICogYmVmb3JlIGFuZCB0aGUgYmxvY2sgYWZ0ZXIsIHRoZW4gaXQncyBweE5leHRGcmVlQmxvY2sgcG9pbnRlciB3aWxsIGhhdmUKKwkgKiBhbHJlYWR5IGJlZW4gc2V0LCBhbmQgc2hvdWxkIG5vdCBiZSBzZXQgaGVyZSBhcyB0aGF0IHdvdWxkIG1ha2UgaXQgcG9pbnQKKwkgKiB0byBpdHNlbGYuICovCisJaWYoIHB4SXRlcmF0b3IgIT0gcHhCbG9ja1RvSW5zZXJ0ICkKKwl7CisJCXB4SXRlcmF0b3ItPnB4TmV4dEZyZWVCbG9jayA9IHB4QmxvY2tUb0luc2VydDsKKwl9CisJZWxzZQorCXsKKwkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCX0KK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkICpwdlBvcnRNYWxsb2MoIHNpemVfdCB4V2FudGVkU2l6ZSApCit7CitCbG9ja0xpbmtfdCAqcHhCbG9jaywgKnB4UHJldmlvdXNCbG9jaywgKnB4TmV3QmxvY2tMaW5rOwordm9pZCAqcHZSZXR1cm4gPSBOVUxMOworCisJLyogSWYgdGhpcyBpcyB0aGUgZmlyc3QgY2FsbCB0byBtYWxsb2MgdGhlbiB0aGUgaGVhcCB3aWxsIHJlcXVpcmUKKwkgKiBpbml0aWFsaXNhdGlvbiB0byBzZXR1cCB0aGUgbGlzdCBvZiBmcmVlIGJsb2Nrcy4gKi8KKwlpZiggcHhFbmQgPT0gTlVMTCApCisJeworCQlwcnZIZWFwSW5pdCgpOworCX0KKwllbHNlCisJeworCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJfQorCisJLyogQ2hlY2sgdGhlIHJlcXVlc3RlZCBibG9jayBzaXplIGlzIG5vdCBzbyBsYXJnZSB0aGF0IHRoZSB0b3AgYml0IGlzIHNldC4KKwkgKiBUaGUgdG9wIGJpdCBvZiB0aGUgYmxvY2sgc2l6ZSBtZW1iZXIgb2YgdGhlIEJsb2NrTGlua190IHN0cnVjdHVyZSBpcyB1c2VkCisJICogdG8gZGV0ZXJtaW5lIHdobyBvd25zIHRoZSBibG9jayAtIHRoZSBhcHBsaWNhdGlvbiBvciB0aGUga2VybmVsLCBzbyBpdAorCSAqIG11c3QgYmUgZnJlZS4gKi8KKwlpZiggKCB4V2FudGVkU2l6ZSAmIHhCbG9ja0FsbG9jYXRlZEJpdCApID09IDAgKQorCXsKKwkJLyogVGhlIHdhbnRlZCBzaXplIGlzIGluY3JlYXNlZCBzbyBpdCBjYW4gY29udGFpbiBhIEJsb2NrTGlua190CisJCSAqIHN0cnVjdHVyZSBpbiBhZGRpdGlvbiB0byB0aGUgcmVxdWVzdGVkIGFtb3VudCBvZiBieXRlcy4gKi8KKwkJaWYoIHhXYW50ZWRTaXplID4gMCApCisJCXsKKwkJCXhXYW50ZWRTaXplICs9IHhIZWFwU3RydWN0U2l6ZTsKKworCQkJLyogRW5zdXJlIHRoYXQgYmxvY2tzIGFyZSBhbHdheXMgYWxpZ25lZCB0byB0aGUgcmVxdWlyZWQgbnVtYmVyIG9mCisJCQkgKiBieXRlcy4gKi8KKwkJCWlmKCAoIHhXYW50ZWRTaXplICYgc2VjdXJlcG9ydEJZVEVfQUxJR05NRU5UX01BU0sgKSAhPSAweDAwICkKKwkJCXsKKwkJCQkvKiBCeXRlIGFsaWdubWVudCByZXF1aXJlZC4gKi8KKwkJCQl4V2FudGVkU2l6ZSArPSAoIHNlY3VyZXBvcnRCWVRFX0FMSUdOTUVOVCAtICggeFdhbnRlZFNpemUgJiBzZWN1cmVwb3J0QllURV9BTElHTk1FTlRfTUFTSyApICk7CisJCQkJc2VjdXJlcG9ydEFTU0VSVCggKCB4V2FudGVkU2l6ZSAmIHNlY3VyZXBvcnRCWVRFX0FMSUdOTUVOVF9NQVNLICkgPT0gMCApOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJfQorCisJCWlmKCAoIHhXYW50ZWRTaXplID4gMCApICYmICggeFdhbnRlZFNpemUgPD0geEZyZWVCeXRlc1JlbWFpbmluZyApICkKKwkJeworCQkJLyogVHJhdmVyc2UgdGhlIGxpc3QgZnJvbSB0aGUgc3RhcnQgKGxvd2VzdCBhZGRyZXNzKSBibG9jayB1bnRpbAorCQkJICogb25lIG9mIGFkZXF1YXRlIHNpemUgaXMgZm91bmQuICovCisJCQlweFByZXZpb3VzQmxvY2sgPSAmeFN0YXJ0OworCQkJcHhCbG9jayA9IHhTdGFydC5weE5leHRGcmVlQmxvY2s7CisJCQl3aGlsZSggKCBweEJsb2NrLT54QmxvY2tTaXplIDwgeFdhbnRlZFNpemUgKSAmJiAoIHB4QmxvY2stPnB4TmV4dEZyZWVCbG9jayAhPSBOVUxMICkgKQorCQkJeworCQkJCXB4UHJldmlvdXNCbG9jayA9IHB4QmxvY2s7CisJCQkJcHhCbG9jayA9IHB4QmxvY2stPnB4TmV4dEZyZWVCbG9jazsKKwkJCX0KKworCQkJLyogSWYgdGhlIGVuZCBtYXJrZXIgd2FzIHJlYWNoZWQgdGhlbiBhIGJsb2NrIG9mIGFkZXF1YXRlIHNpemUgd2FzCisJCQkgKiBub3QgZm91bmQuICovCisJCQlpZiggcHhCbG9jayAhPSBweEVuZCApCisJCQl7CisJCQkJLyogUmV0dXJuIHRoZSBtZW1vcnkgc3BhY2UgcG9pbnRlZCB0byAtIGp1bXBpbmcgb3ZlciB0aGUKKwkJCQkgKiBCbG9ja0xpbmtfdCBzdHJ1Y3R1cmUgYXQgaXRzIHN0YXJ0LiAqLworCQkJCXB2UmV0dXJuID0gKCB2b2lkICogKSAoICggKCB1aW50OF90ICogKSBweFByZXZpb3VzQmxvY2stPnB4TmV4dEZyZWVCbG9jayApICsgeEhlYXBTdHJ1Y3RTaXplICk7CisKKwkJCQkvKiBUaGlzIGJsb2NrIGlzIGJlaW5nIHJldHVybmVkIGZvciB1c2Ugc28gbXVzdCBiZSB0YWtlbiBvdXQKKwkJCQkgKiBvZiB0aGUgbGlzdCBvZiBmcmVlIGJsb2Nrcy4gKi8KKwkJCQlweFByZXZpb3VzQmxvY2stPnB4TmV4dEZyZWVCbG9jayA9IHB4QmxvY2stPnB4TmV4dEZyZWVCbG9jazsKKworCQkJCS8qIElmIHRoZSBibG9jayBpcyBsYXJnZXIgdGhhbiByZXF1aXJlZCBpdCBjYW4gYmUgc3BsaXQgaW50bworCQkJCSAqIHR3by4gKi8KKwkJCQlpZiggKCBweEJsb2NrLT54QmxvY2tTaXplIC0geFdhbnRlZFNpemUgKSA+IHNlY3VyZWhlYXBNSU5JTVVNX0JMT0NLX1NJWkUgKQorCQkJCXsKKwkJCQkJLyogVGhpcyBibG9jayBpcyB0byBiZSBzcGxpdCBpbnRvIHR3by4gIENyZWF0ZSBhIG5ldworCQkJCQkgKiBibG9jayBmb2xsb3dpbmcgdGhlIG51bWJlciBvZiBieXRlcyByZXF1ZXN0ZWQuIFRoZSB2b2lkCisJCQkJCSAqIGNhc3QgaXMgdXNlZCB0byBwcmV2ZW50IGJ5dGUgYWxpZ25tZW50IHdhcm5pbmdzIGZyb20gdGhlCisJCQkJCSAqIGNvbXBpbGVyLiAqLworCQkJCQlweE5ld0Jsb2NrTGluayA9ICggdm9pZCAqICkgKCAoICggdWludDhfdCAqICkgcHhCbG9jayApICsgeFdhbnRlZFNpemUgKTsKKwkJCQkJc2VjdXJlcG9ydEFTU0VSVCggKCAoICggc2l6ZV90ICkgcHhOZXdCbG9ja0xpbmsgKSAmIHNlY3VyZXBvcnRCWVRFX0FMSUdOTUVOVF9NQVNLICkgPT0gMCApOworCisJCQkJCS8qIENhbGN1bGF0ZSB0aGUgc2l6ZXMgb2YgdHdvIGJsb2NrcyBzcGxpdCBmcm9tIHRoZSBzaW5nbGUKKwkJCQkJICogYmxvY2suICovCisJCQkJCXB4TmV3QmxvY2tMaW5rLT54QmxvY2tTaXplID0gcHhCbG9jay0+eEJsb2NrU2l6ZSAtIHhXYW50ZWRTaXplOworCQkJCQlweEJsb2NrLT54QmxvY2tTaXplID0geFdhbnRlZFNpemU7CisKKwkJCQkJLyogSW5zZXJ0IHRoZSBuZXcgYmxvY2sgaW50byB0aGUgbGlzdCBvZiBmcmVlIGJsb2Nrcy4gKi8KKwkJCQkJcHJ2SW5zZXJ0QmxvY2tJbnRvRnJlZUxpc3QoIHB4TmV3QmxvY2tMaW5rICk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJCQl9CisKKwkJCQl4RnJlZUJ5dGVzUmVtYWluaW5nIC09IHB4QmxvY2stPnhCbG9ja1NpemU7CisKKwkJCQlpZiggeEZyZWVCeXRlc1JlbWFpbmluZyA8IHhNaW5pbXVtRXZlckZyZWVCeXRlc1JlbWFpbmluZyApCisJCQkJeworCQkJCQl4TWluaW11bUV2ZXJGcmVlQnl0ZXNSZW1haW5pbmcgPSB4RnJlZUJ5dGVzUmVtYWluaW5nOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCQkJfQorCisJCQkJLyogVGhlIGJsb2NrIGlzIGJlaW5nIHJldHVybmVkIC0gaXQgaXMgYWxsb2NhdGVkIGFuZCBvd25lZCBieQorCQkJCSAqIHRoZSBhcHBsaWNhdGlvbiBhbmQgaGFzIG5vICJuZXh0IiBibG9jay4gKi8KKwkJCQlweEJsb2NrLT54QmxvY2tTaXplIHw9IHhCbG9ja0FsbG9jYXRlZEJpdDsKKwkJCQlweEJsb2NrLT5weE5leHRGcmVlQmxvY2sgPSBOVUxMOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJfQorCX0KKwllbHNlCisJeworCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJfQorCisJdHJhY2VNQUxMT0MoIHB2UmV0dXJuLCB4V2FudGVkU2l6ZSApOworCisJI2lmKCBzZWN1cmVjb25maWdVU0VfTUFMTE9DX0ZBSUxFRF9IT09LID09IDEgKQorCXsKKwkJaWYoIHB2UmV0dXJuID09IE5VTEwgKQorCQl7CisJCQlleHRlcm4gdm9pZCB2QXBwbGljYXRpb25NYWxsb2NGYWlsZWRIb29rKCB2b2lkICk7CisJCQl2QXBwbGljYXRpb25NYWxsb2NGYWlsZWRIb29rKCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCX0KKwl9CisJI2VuZGlmCisKKwlzZWN1cmVwb3J0QVNTRVJUKCAoICggKCBzaXplX3QgKSBwdlJldHVybiApICYgKCBzaXplX3QgKSBzZWN1cmVwb3J0QllURV9BTElHTk1FTlRfTUFTSyApID09IDAgKTsKKwlyZXR1cm4gcHZSZXR1cm47Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCB2UG9ydEZyZWUoIHZvaWQgKnB2ICkKK3sKK3VpbnQ4X3QgKnB1YyA9ICggdWludDhfdCAqICkgcHY7CitCbG9ja0xpbmtfdCAqcHhMaW5rOworCisJaWYoIHB2ICE9IE5VTEwgKQorCXsKKwkJLyogVGhlIG1lbW9yeSBiZWluZyBmcmVlZCB3aWxsIGhhdmUgYW4gQmxvY2tMaW5rX3Qgc3RydWN0dXJlIGltbWVkaWF0ZWx5CisJCSAqIGJlZm9yZSBpdC4gKi8KKwkJcHVjIC09IHhIZWFwU3RydWN0U2l6ZTsKKworCQkvKiBUaGlzIGNhc3RpbmcgaXMgdG8ga2VlcCB0aGUgY29tcGlsZXIgZnJvbSBpc3N1aW5nIHdhcm5pbmdzLiAqLworCQlweExpbmsgPSAoIHZvaWQgKiApIHB1YzsKKworCQkvKiBDaGVjayB0aGUgYmxvY2sgaXMgYWN0dWFsbHkgYWxsb2NhdGVkLiAqLworCQlzZWN1cmVwb3J0QVNTRVJUKCAoIHB4TGluay0+eEJsb2NrU2l6ZSAmIHhCbG9ja0FsbG9jYXRlZEJpdCApICE9IDAgKTsKKwkJc2VjdXJlcG9ydEFTU0VSVCggcHhMaW5rLT5weE5leHRGcmVlQmxvY2sgPT0gTlVMTCApOworCisJCWlmKCAoIHB4TGluay0+eEJsb2NrU2l6ZSAmIHhCbG9ja0FsbG9jYXRlZEJpdCApICE9IDAgKQorCQl7CisJCQlpZiggcHhMaW5rLT5weE5leHRGcmVlQmxvY2sgPT0gTlVMTCApCisJCQl7CisJCQkJLyogVGhlIGJsb2NrIGlzIGJlaW5nIHJldHVybmVkIHRvIHRoZSBoZWFwIC0gaXQgaXMgbm8gbG9uZ2VyCisJCQkJICogYWxsb2NhdGVkLiAqLworCQkJCXB4TGluay0+eEJsb2NrU2l6ZSAmPSB+eEJsb2NrQWxsb2NhdGVkQml0OworCisJCQkJc2VjdXJlcG9ydERJU0FCTEVfTk9OX1NFQ1VSRV9JTlRFUlJVUFRTKCk7CisJCQkJeworCQkJCQkvKiBBZGQgdGhpcyBibG9jayB0byB0aGUgbGlzdCBvZiBmcmVlIGJsb2Nrcy4gKi8KKwkJCQkJeEZyZWVCeXRlc1JlbWFpbmluZyArPSBweExpbmstPnhCbG9ja1NpemU7CisJCQkJCXRyYWNlRlJFRSggcHYsIHB4TGluay0+eEJsb2NrU2l6ZSApOworCQkJCQlwcnZJbnNlcnRCbG9ja0ludG9GcmVlTGlzdCggKCAoIEJsb2NrTGlua190ICogKSBweExpbmsgKSApOworCQkJCX0KKwkJCQlzZWN1cmVwb3J0RU5BQkxFX05PTl9TRUNVUkVfSU5URVJSVVBUUygpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJfQorCX0KK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzaXplX3QgeFBvcnRHZXRGcmVlSGVhcFNpemUoIHZvaWQgKQoreworCXJldHVybiB4RnJlZUJ5dGVzUmVtYWluaW5nOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3NpemVfdCB4UG9ydEdldE1pbmltdW1FdmVyRnJlZUhlYXBTaXplKCB2b2lkICkKK3sKKwlyZXR1cm4geE1pbmltdW1FdmVyRnJlZUJ5dGVzUmVtYWluaW5nOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgdlBvcnRJbml0aWFsaXNlQmxvY2tzKCB2b2lkICkKK3sKKwkvKiBUaGlzIGp1c3QgZXhpc3RzIHRvIGtlZXAgdGhlIGxpbmtlciBxdWlldC4gKi8KK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpkaWZmIC0tZ2l0IGEvU291cmNlL3BvcnRhYmxlL0dDQy9BUk1fQ00yMy9zZWN1cmUvc2VjdXJlX2hlYXAuaCBiL1NvdXJjZS9wb3J0YWJsZS9HQ0MvQVJNX0NNMjMvc2VjdXJlL3NlY3VyZV9oZWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjllNGYyYQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9wb3J0YWJsZS9HQ0MvQVJNX0NNMjMvc2VjdXJlL3NlY3VyZV9oZWFwLmgKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMi4xCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgorICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KKyAqIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KKyAqIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mCisgKiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCisgKiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKKyAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTCisgKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IKKyAqIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUgorICogSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogaHR0cDovL3d3dy5GcmVlUlRPUy5vcmcKKyAqIGh0dHA6Ly9hd3MuYW1hem9uLmNvbS9mcmVlcnRvcworICoKKyAqIDEgdGFiID09IDQgc3BhY2VzIQorICovCisKKyNpZm5kZWYgX19TRUNVUkVfSEVBUF9IX18KKyNkZWZpbmUgX19TRUNVUkVfSEVBUF9IX18KKworLyogU3RhbmRhcmQgaW5jbHVkZXMuICovCisjaW5jbHVkZSA8c3RkbGliLmg+CisKKy8qKgorICogQGJyaWVmIEFsbG9jYXRlcyBtZW1vcnkgZnJvbSBoZWFwLgorICoKKyAqIEBwYXJhbVtpbl0geFdhbnRlZFNpemUgVGhlIHNpemUgb2YgdGhlIG1lbW9yeSB0byBiZSBhbGxvY2F0ZWQuCisgKgorICogQHJldHVybiBQb2ludGVyIHRvIHRoZSBtZW1vcnkgcmVnaW9uIGlmIHRoZSBhbGxvY2F0aW9uIGlzIHN1Y2Nlc3NmdWwsIE5VTEwKKyAqIG90aGVyd2lzZS4KKyAqLwordm9pZCAqcHZQb3J0TWFsbG9jKCBzaXplX3QgeFdhbnRlZFNpemUgKTsKKworLyoqCisgKiBAYnJpZWYgRnJlZXMgdGhlIHByZXZpb3VzbHkgYWxsb2NhdGVkIG1lbW9yeS4KKyAqCisgKiBAcGFyYW1baW5dIHB2IFBvaW50ZXIgdG8gdGhlIG1lbW9yeSB0byBiZSBmcmVlZC4KKyAqLwordm9pZCB2UG9ydEZyZWUoIHZvaWQgKnB2ICk7CisKKyNlbmRpZiAvKiBfX1NFQ1VSRV9IRUFQX0hfXyAqLwpkaWZmIC0tZ2l0IGEvU291cmNlL3BvcnRhYmxlL0dDQy9BUk1fQ00yMy9zZWN1cmUvc2VjdXJlX2luaXQuYyBiL1NvdXJjZS9wb3J0YWJsZS9HQ0MvQVJNX0NNMjMvc2VjdXJlL3NlY3VyZV9pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY1MjVmNwotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9wb3J0YWJsZS9HQ0MvQVJNX0NNMjMvc2VjdXJlL3NlY3VyZV9pbml0LmMKQEAgLTAsMCArMSwxMDUgQEAKKy8qCisgKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjIuMQorICogQ29weXJpZ2h0IChDKSAyMDE5IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKKyAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCisgKiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCisgKiB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZgorICogdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLAorICogc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCisgKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUworICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SCisgKiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIKKyAqIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIGh0dHA6Ly93d3cuRnJlZVJUT1Mub3JnCisgKiBodHRwOi8vYXdzLmFtYXpvbi5jb20vZnJlZXJ0b3MKKyAqCisgKiAxIHRhYiA9PSA0IHNwYWNlcyEKKyAqLworCisvKiBTdGFuZGFyZCBpbmNsdWRlcy4gKi8KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLyogU2VjdXJlIGluaXQgaW5jbHVkZXMuICovCisjaW5jbHVkZSAic2VjdXJlX2luaXQuaCIKKworLyogU2VjdXJlIHBvcnQgbWFjcm9zLiAqLworI2luY2x1ZGUgInNlY3VyZV9wb3J0X21hY3Jvcy5oIgorCisvKioKKyAqIEBicmllZiBDb25zdGFudHMgcmVxdWlyZWQgdG8gbWFuaXB1bGF0ZSB0aGUgU0NCLgorICovCisjZGVmaW5lIHNlY3VyZWluaXRTQ0JfQUlSQ1IJCQkJCSggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZWQwYyApICAvKiBBcHBsaWNhdGlvbiBJbnRlcnJ1cHQgYW5kIFJlc2V0IENvbnRyb2wgUmVnaXN0ZXIuICovCisjZGVmaW5lIHNlY3VyZWluaXRTQ0JfQUlSQ1JfVkVDVEtFWV9QT1MJCSggMTZVTCApCisjZGVmaW5lIHNlY3VyZWluaXRTQ0JfQUlSQ1JfVkVDVEtFWV9NQVNLCSggMHhGRkZGVUwgPDwgc2VjdXJlaW5pdFNDQl9BSVJDUl9WRUNUS0VZX1BPUyApCisjZGVmaW5lIHNlY3VyZWluaXRTQ0JfQUlSQ1JfUFJJU19QT1MJCSggMTRVTCApCisjZGVmaW5lIHNlY3VyZWluaXRTQ0JfQUlSQ1JfUFJJU19NQVNLCQkoIDFVTCA8PCBzZWN1cmVpbml0U0NCX0FJUkNSX1BSSVNfUE9TICkKKworLyoqCisgKiBAYnJpZWYgQ29uc3RhbnRzIHJlcXVpcmVkIHRvIG1hbmlwdWxhdGUgdGhlIEZQVS4KKyAqLworI2RlZmluZSBzZWN1cmVpbml0RlBDQ1IJCQkJCQkoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVmMzQgKSAgLyogRmxvYXRpbmcgUG9pbnQgQ29udGV4dCBDb250cm9sIFJlZ2lzdGVyLiAqLworI2RlZmluZSBzZWN1cmVpbml0RlBDQ1JfTFNQRU5TX1BPUwkJCSggMjlVTCApCisjZGVmaW5lIHNlY3VyZWluaXRGUENDUl9MU1BFTlNfTUFTSwkJCSggMVVMIDw8IHNlY3VyZWluaXRGUENDUl9MU1BFTlNfUE9TICkKKyNkZWZpbmUgc2VjdXJlaW5pdEZQQ0NSX1RTX1BPUwkJCQkoIDI2VUwgKQorI2RlZmluZSBzZWN1cmVpbml0RlBDQ1JfVFNfTUFTSwkJCQkoIDFVTCA8PCBzZWN1cmVpbml0RlBDQ1JfVFNfUE9TICkKKworI2RlZmluZSBzZWN1cmVpbml0TlNBQ1IJCQkJCQkoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVkOGMgKSAgLyogTm9uLXNlY3VyZSBBY2Nlc3MgQ29udHJvbCBSZWdpc3Rlci4gKi8KKyNkZWZpbmUgc2VjdXJlaW5pdE5TQUNSX0NQMTBfUE9TCQkJKCAxMFVMICkKKyNkZWZpbmUgc2VjdXJlaW5pdE5TQUNSX0NQMTBfTUFTSwkJCSggMVVMIDw8IHNlY3VyZWluaXROU0FDUl9DUDEwX1BPUyApCisjZGVmaW5lIHNlY3VyZWluaXROU0FDUl9DUDExX1BPUwkJCSggMTFVTCApCisjZGVmaW5lIHNlY3VyZWluaXROU0FDUl9DUDExX01BU0sJCQkoIDFVTCA8PCBzZWN1cmVpbml0TlNBQ1JfQ1AxMV9QT1MgKQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3NlY3VyZXBvcnROT05fU0VDVVJFX0NBTExBQkxFIHZvaWQgU2VjdXJlSW5pdF9EZVByaW9yaXRpemVOU0V4Y2VwdGlvbnMoIHZvaWQgKQoreworCXVpbnQzMl90IHVsSVBTUjsKKworCSAvKiBSZWFkIHRoZSBJbnRlcnJ1cHQgUHJvZ3JhbSBTdGF0dXMgUmVnaXN0ZXIgKElQU1IpIHZhbHVlLiAqLworCXNlY3VyZXBvcnRSRUFEX0lQU1IoIHVsSVBTUiApOworCisJLyogRG8gbm90aGluZyBpZiB0aGUgcHJvY2Vzc29yIGlzIHJ1bm5pbmcgaW4gdGhlIFRocmVhZCBNb2RlLiBJUFNSIGlzIHplcm8KKwkgKiB3aGVuIHRoZSBwcm9jZXNzb3IgaXMgcnVubmluZyBpbiB0aGUgVGhyZWFkIE1vZGUuICovCisJaWYoIHVsSVBTUiAhPSAwICkKKwl7CisJCSooIHNlY3VyZWluaXRTQ0JfQUlSQ1IgKSA9CSggKiggc2VjdXJlaW5pdFNDQl9BSVJDUiApICYgfiggc2VjdXJlaW5pdFNDQl9BSVJDUl9WRUNUS0VZX01BU0sgfCBzZWN1cmVpbml0U0NCX0FJUkNSX1BSSVNfTUFTSyApICkgfAorCQkJCQkJCQkJKCAoIDB4MDVGQVVMIDw8IHNlY3VyZWluaXRTQ0JfQUlSQ1JfVkVDVEtFWV9QT1MgKSAmIHNlY3VyZWluaXRTQ0JfQUlSQ1JfVkVDVEtFWV9NQVNLICkgfAorCQkJCQkJCQkJKCAoIDB4MVVMCTw8IHNlY3VyZWluaXRTQ0JfQUlSQ1JfUFJJU19QT1MgKQkmIHNlY3VyZWluaXRTQ0JfQUlSQ1JfUFJJU19NQVNLICk7CisJfQorfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3NlY3VyZXBvcnROT05fU0VDVVJFX0NBTExBQkxFIHZvaWQgU2VjdXJlSW5pdF9FbmFibGVOU0ZQVUFjY2Vzcyggdm9pZCApCit7CisJdWludDMyX3QgdWxJUFNSOworCisJIC8qIFJlYWQgdGhlIEludGVycnVwdCBQcm9ncmFtIFN0YXR1cyBSZWdpc3RlciAoSVBTUikgdmFsdWUuICovCisJc2VjdXJlcG9ydFJFQURfSVBTUiggdWxJUFNSICk7CisKKwkvKiBEbyBub3RoaW5nIGlmIHRoZSBwcm9jZXNzb3IgaXMgcnVubmluZyBpbiB0aGUgVGhyZWFkIE1vZGUuIElQU1IgaXMgemVybworCSAqIHdoZW4gdGhlIHByb2Nlc3NvciBpcyBydW5uaW5nIGluIHRoZSBUaHJlYWQgTW9kZS4gKi8KKwlpZiggdWxJUFNSICE9IDAgKQorCXsKKwkJLyogQ1AxMCA9IDEgPT0+IE5vbi1zZWN1cmUgYWNjZXNzIHRvIHRoZSBGbG9hdGluZyBQb2ludCBVbml0IGlzCisJCSAqIHBlcm1pdHRlZC4gQ1AxMSBzaG91bGQgYmUgcHJvZ3JhbW1lZCB0byB0aGUgc2FtZSB2YWx1ZSBhcyBDUDEwLiAqLworCQkqKCBzZWN1cmVpbml0TlNBQ1IgKSB8PSAoIHNlY3VyZWluaXROU0FDUl9DUDEwX01BU0sgfCBzZWN1cmVpbml0TlNBQ1JfQ1AxMV9NQVNLICk7CisKKwkJLyogTFNQRU5TID0gMCA9PT4gTFNQRU4gaXMgd3JpdGFibGUgZnJvbiBub24tc2VjdXJlIHN0YXRlLiBUaGlzIGVuc3VyZXMKKwkJICogdGhhdCB3ZSBjYW4gZW5hYmxlL2Rpc2FibGUgbGF6eSBzdGFja2luZyBpbiBwb3J0LmMgZmlsZS4gKi8KKwkJKiggc2VjdXJlaW5pdEZQQ0NSICkgJj0gfiAoIHNlY3VyZWluaXRGUENDUl9MU1BFTlNfTUFTSyApOworCisJCS8qIFRTID0gMSA9PT4gVHJlYXQgRlAgcmVnaXN0ZXJzIGFzIHNlY3VyZSBpLmUuIGNhbGxlZSBzYXZlZCBGUAorCQkgKiByZWdpc3RlcnMgKFMxNi1TMzEpIGFyZSBhbHNvIHB1c2hlZCB0byBzdGFjayBvbiBleGNlcHRpb24gZW50cnkgYW5kCisJCSAqIHJlc3RvcmVkIG9uIGV4Y2VwdGlvbiByZXR1cm4uICovCisJCSooIHNlY3VyZWluaXRGUENDUiApIHw9ICggc2VjdXJlaW5pdEZQQ0NSX1RTX01BU0sgKTsKKwl9Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KZGlmZiAtLWdpdCBhL1NvdXJjZS9wb3J0YWJsZS9HQ0MvQVJNX0NNMjMvc2VjdXJlL3NlY3VyZV9pbml0LmggYi9Tb3VyY2UvcG9ydGFibGUvR0NDL0FSTV9DTTIzL3NlY3VyZS9zZWN1cmVfaW5pdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjNWJjNzEKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvcG9ydGFibGUvR0NDL0FSTV9DTTIzL3NlY3VyZS9zZWN1cmVfaW5pdC5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjIuMQorICogQ29weXJpZ2h0IChDKSAyMDE5IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKKyAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCisgKiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCisgKiB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZgorICogdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLAorICogc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCisgKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUworICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SCisgKiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIKKyAqIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIGh0dHA6Ly93d3cuRnJlZVJUT1Mub3JnCisgKiBodHRwOi8vYXdzLmFtYXpvbi5jb20vZnJlZXJ0b3MKKyAqCisgKiAxIHRhYiA9PSA0IHNwYWNlcyEKKyAqLworCisjaWZuZGVmIF9fU0VDVVJFX0lOSVRfSF9fCisjZGVmaW5lIF9fU0VDVVJFX0lOSVRfSF9fCisKKy8qKgorICogQGJyaWVmIERlLXByaW9yaXRpemVzIHRoZSBub24tc2VjdXJlIGV4Y2VwdGlvbnMuCisgKgorICogVGhpcyBpcyBuZWVkZWQgdG8gZW5zdXJlIHRoYXQgdGhlIG5vbi1zZWN1cmUgUGVuZFNWIHJ1bnMgYXQgdGhlIGxvd2VzdAorICogcHJpb3JpdHkuIENvbnRleHQgc3dpdGNoIGlzIGRvbmUgaW4gdGhlIG5vbi1zZWN1cmUgUGVuZFNWIGhhbmRsZXIuCisgKgorICogQG5vdGUgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBpbiB0aGUgaGFuZGxlciBtb2RlLiBJdCBpcyBuby1vcCBpZiBjYWxsZWQKKyAqIGluIHRoZSB0aHJlYWQgbW9kZS4KKyAqLwordm9pZCBTZWN1cmVJbml0X0RlUHJpb3JpdGl6ZU5TRXhjZXB0aW9ucyggdm9pZCApOworCisvKioKKyAqIEBicmllZiBTZXRzIHVwIHRoZSBGbG9hdGluZyBQb2ludCBVbml0IChGUFUpIGZvciBOb24tU2VjdXJlIGFjY2Vzcy4KKyAqCisgKiBBbHNvIHNldHMgRlBDQ1IuVFM9MSB0byBlbnN1cmUgdGhhdCB0aGUgY29udGVudCBvZiB0aGUgRmxvYXRpbmcgUG9pbnQKKyAqIFJlZ2lzdGVycyBhcmUgbm90IGxlYWtlZCB0byB0aGUgbm9uLXNlY3VyZSBzaWRlLgorICoKKyAqIEBub3RlIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgaW4gdGhlIGhhbmRsZXIgbW9kZS4gSXQgaXMgbm8tb3AgaWYgY2FsbGVkCisgKiBpbiB0aGUgdGhyZWFkIG1vZGUuCisgKi8KK3ZvaWQgU2VjdXJlSW5pdF9FbmFibGVOU0ZQVUFjY2Vzcyggdm9pZCApOworCisjZW5kaWYgLyogX19TRUNVUkVfSU5JVF9IX18gKi8KZGlmZiAtLWdpdCBhL1NvdXJjZS9wb3J0YWJsZS9HQ0MvQVJNX0NNMjMvc2VjdXJlL3NlY3VyZV9wb3J0X21hY3Jvcy5oIGIvU291cmNlL3BvcnRhYmxlL0dDQy9BUk1fQ00yMy9zZWN1cmUvc2VjdXJlX3BvcnRfbWFjcm9zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYwZWRhYgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9wb3J0YWJsZS9HQ0MvQVJNX0NNMjMvc2VjdXJlL3NlY3VyZV9wb3J0X21hY3Jvcy5oCkBAIC0wLDAgKzEsMTMzIEBACisvKgorICogRnJlZVJUT1MgS2VybmVsIFYxMC4yLjEKKyAqIENvcHlyaWdodCAoQykgMjAxOSBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCisgKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgorICogdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bworICogdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YKKyAqIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKKyAqIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAorICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MKKyAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUgorICogQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSCisgKiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBodHRwOi8vd3d3LkZyZWVSVE9TLm9yZworICogaHR0cDovL2F3cy5hbWF6b24uY29tL2ZyZWVydG9zCisgKgorICogMSB0YWIgPT0gNCBzcGFjZXMhCisgKi8KKworI2lmbmRlZiBfX1NFQ1VSRV9QT1JUX01BQ1JPU19IX18KKyNkZWZpbmUgX19TRUNVUkVfUE9SVF9NQUNST1NfSF9fCisKKy8qKgorICogQGJyaWVmIEJ5dGUgYWxpZ25tZW50IHJlcXVpcmVtZW50cy4KKyAqLworI2RlZmluZSBzZWN1cmVwb3J0QllURV9BTElHTk1FTlQJCQkJCTgKKyNkZWZpbmUgc2VjdXJlcG9ydEJZVEVfQUxJR05NRU5UX01BU0sJCQkJKCAweDAwMDcgKQorCisvKioKKyAqIEBicmllZiBNYWNybyB0byBkZWNsYXJlIGEgZnVuY3Rpb24gYXMgbm9uLXNlY3VyZSBjYWxsYWJsZS4KKyAqLworI2lmIGRlZmluZWQoIF9fSUFSX1NZU1RFTVNfSUNDX18gKQorCSNkZWZpbmUgc2VjdXJlcG9ydE5PTl9TRUNVUkVfQ0FMTEFCTEUJCQlfX2Ntc2Vfbm9uc2VjdXJlX2VudHJ5IF9fcm9vdAorI2Vsc2UKKwkjZGVmaW5lIHNlY3VyZXBvcnROT05fU0VDVVJFX0NBTExBQkxFCQkJX19hdHRyaWJ1dGVfXygoY21zZV9ub25zZWN1cmVfZW50cnkpKSBfX2F0dHJpYnV0ZV9fKCh1c2VkKSkKKyNlbmRpZgorCisvKioKKyAqIEBicmllZiBTZXQgdGhlIHNlY3VyZSBQUklNQVNLIHZhbHVlLgorICovCisjZGVmaW5lIHNlY3VyZXBvcnRTRVRfU0VDVVJFX1BSSU1BU0soIHVsUHJpbWFza1ZhbHVlICkgXAorCV9fYXNtIHZvbGF0aWxlICggIm1zciBwcmltYXNrLCAlMCIgOiA6ICJyIiAoIHVsUHJpbWFza1ZhbHVlICkgOiAibWVtb3J5IiApCisKKy8qKgorICogQGJyaWVmIFNldCB0aGUgbm9uLXNlY3VyZSBQUklNQVNLIHZhbHVlLgorICovCisjZGVmaW5lIHNlY3VyZXBvcnRTRVRfTk9OX1NFQ1VSRV9QUklNQVNLKCB1bFByaW1hc2tWYWx1ZSApIFwKKwlfX2FzbSB2b2xhdGlsZSAoICJtc3IgcHJpbWFza19ucywgJTAiIDogOiAiciIgKCB1bFByaW1hc2tWYWx1ZSApIDogIm1lbW9yeSIgKQorCisvKioKKyAqIEBicmllZiBSZWFkIHRoZSBQU1AgdmFsdWUgaW4gdGhlIGdpdmVuIHZhcmlhYmxlLgorICovCisjZGVmaW5lIHNlY3VyZXBvcnRSRUFEX1BTUCggcHVjT3V0Q3VycmVudFN0YWNrUG9pbnRlciApIFwKKwlfX2FzbSB2b2xhdGlsZSAoICJtcnMgJTAsIHBzcCIgIDogIj1yIiAoIHB1Y091dEN1cnJlbnRTdGFja1BvaW50ZXIgKSApCisKKy8qKgorICogQGJyaWVmIFNldCB0aGUgUFNQIHRvIHRoZSBnaXZlbiB2YWx1ZS4KKyAqLworI2RlZmluZSBzZWN1cmVwb3J0U0VUX1BTUCggcHVjQ3VycmVudFN0YWNrUG9pbnRlciApIFwKKwlfX2FzbSB2b2xhdGlsZSAoICJtc3IgcHNwLCAlMCIgOiA6ICJyIiAoIHB1Y0N1cnJlbnRTdGFja1BvaW50ZXIgKSApCisKKy8qKgorICogQGJyaWVmIFNldCB0aGUgUFNQTElNIHRvIHRoZSBnaXZlbiB2YWx1ZS4KKyAqLworI2RlZmluZSBzZWN1cmVwb3J0U0VUX1BTUExJTSggcHVjU3RhY2tMaW1pdCApIFwKKwlfX2FzbSB2b2xhdGlsZSAoICJtc3IgcHNwbGltLCAlMCIgOiA6ICJyIiAoIHB1Y1N0YWNrTGltaXQgKSApCisKKy8qKgorICogQGJyaWVmIFNldCB0aGUgTm9uU2VjdXJlIE1TUCB0byB0aGUgZ2l2ZW4gdmFsdWUuCisgKi8KKyNkZWZpbmUgc2VjdXJlcG9ydFNFVF9NU1BfTlMoIHB1Y01haW5TdGFja1BvaW50ZXIgKSBcCisJX19hc20gdm9sYXRpbGUgKCAibXNyIG1zcF9ucywgJTAiIDogOiAiciIgKCBwdWNNYWluU3RhY2tQb2ludGVyICkgKQorCisvKioKKyAqIEBicmllZiBTZXQgdGhlIENPTlRST0wgcmVnaXN0ZXIgdG8gdGhlIGdpdmVuIHZhbHVlLgorICovCisjZGVmaW5lIHNlY3VyZXBvcnRTRVRfQ09OVFJPTCggdWxDb250cm9sICkgXAorCV9fYXNtIHZvbGF0aWxlICggIm1zciBjb250cm9sLCAlMCIgOiA6ICJyIiAoIHVsQ29udHJvbCApIDogIm1lbW9yeSIgKQorCisvKioKKyAqIEBicmllZiBSZWFkIHRoZSBJbnRlcnJ1cHQgUHJvZ3JhbSBTdGF0dXMgUmVnaXN0ZXIgKElQU1IpIHZhbHVlIGluIHRoZSBnaXZlbgorICogdmFyaWFibGUuCisgKi8KKyNkZWZpbmUgc2VjdXJlcG9ydFJFQURfSVBTUiggdWxJUFNSICkgXAorCV9fYXNtIHZvbGF0aWxlICggIm1ycyAlMCwgaXBzciIgIDogIj1yIiAoIHVsSVBTUiApICkKKworLyoqCisgKiBAYnJpZWYgUFJJTUFTSyB2YWx1ZSB0byBlbmFibGUgaW50ZXJydXB0cy4KKyAqLworI2RlZmluZSBzZWN1cmVwb3J0UFJJTUFTS19FTkFCTEVfSU5URVJSVVBUU19WQUwJCTAKKworLyoqCisgKiBAYnJpZWYgUFJJTUFTSyB2YWx1ZSB0byBkaXNhYmxlIGludGVycnVwdHMuCisgKi8KKyNkZWZpbmUgc2VjdXJlcG9ydFBSSU1BU0tfRElTQUJMRV9JTlRFUlJVUFRTX1ZBTAkxCisKKy8qKgorICogQGJyaWVmIERpc2FibGUgc2VjdXJlIGludGVycnVwdHMuCisgKi8KKyNkZWZpbmUgc2VjdXJlcG9ydERJU0FCTEVfU0VDVVJFX0lOVEVSUlVQVFMoKQkJc2VjdXJlcG9ydFNFVF9TRUNVUkVfUFJJTUFTSyggc2VjdXJlcG9ydFBSSU1BU0tfRElTQUJMRV9JTlRFUlJVUFRTX1ZBTCApCisKKy8qKgorICogQGJyaWVmIERpc2FibGUgbm9uLXNlY3VyZSBpbnRlcnJ1cHRzLgorICoKKyAqIFRoaXMgZWZmZWN0aXZlbHkgZGlzYWJsZXMgY29udGV4dCBzd2l0Y2hlcy4KKyAqLworI2RlZmluZSBzZWN1cmVwb3J0RElTQUJMRV9OT05fU0VDVVJFX0lOVEVSUlVQVFMoKQlzZWN1cmVwb3J0U0VUX05PTl9TRUNVUkVfUFJJTUFTSyggc2VjdXJlcG9ydFBSSU1BU0tfRElTQUJMRV9JTlRFUlJVUFRTX1ZBTCApCisKKy8qKgorICogQGJyaWVmIEVuYWJsZSBub24tc2VjdXJlIGludGVycnVwdHMuCisgKi8KKyNkZWZpbmUgc2VjdXJlcG9ydEVOQUJMRV9OT05fU0VDVVJFX0lOVEVSUlVQVFMoKQlzZWN1cmVwb3J0U0VUX05PTl9TRUNVUkVfUFJJTUFTSyggc2VjdXJlcG9ydFBSSU1BU0tfRU5BQkxFX0lOVEVSUlVQVFNfVkFMICkKKworLyoqCisgKiBAYnJpZWYgQXNzZXJ0IGRlZmluaXRpb24uCisgKi8KKyNkZWZpbmUgc2VjdXJlcG9ydEFTU0VSVCggeCApCQkJCQkJXAorCWlmKCAoIHggKSA9PSAwICkJCQkJCQkJCVwKKwl7CQkJCQkJCQkJCQkJXAorCQlzZWN1cmVwb3J0RElTQUJMRV9TRUNVUkVfSU5URVJSVVBUUygpOwkJXAorCQlzZWN1cmVwb3J0RElTQUJMRV9OT05fU0VDVVJFX0lOVEVSUlVQVFMoKTsJXAorCQlmb3IoIDs7ICk7CQkJCQkJCQkJXAorCX0KKworI2VuZGlmIC8qIF9fU0VDVVJFX1BPUlRfTUFDUk9TX0hfXyAqLwpkaWZmIC0tZ2l0IGEvU291cmNlL3BvcnRhYmxlL0dDQy9BUk1fQ00yM19OVFovbm9uX3NlY3VyZS9wb3J0LmMgYi9Tb3VyY2UvcG9ydGFibGUvR0NDL0FSTV9DTTIzX05UWi9ub25fc2VjdXJlL3BvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDg1YTZmCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL3BvcnRhYmxlL0dDQy9BUk1fQ00yM19OVFovbm9uX3NlY3VyZS9wb3J0LmMKQEAgLTAsMCArMSw4OTkgQEAKKy8qCisgKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjIuMQorICogQ29weXJpZ2h0IChDKSAyMDE5IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKKyAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCisgKiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCisgKiB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZgorICogdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLAorICogc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCisgKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUworICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SCisgKiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIKKyAqIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIGh0dHA6Ly93d3cuRnJlZVJUT1Mub3JnCisgKiBodHRwOi8vYXdzLmFtYXpvbi5jb20vZnJlZXJ0b3MKKyAqCisgKiAxIHRhYiA9PSA0IHNwYWNlcyEKKyAqLworCisvKiBEZWZpbmluZyBNUFVfV1JBUFBFUlNfSU5DTFVERURfRlJPTV9BUElfRklMRSBwcmV2ZW50cyB0YXNrLmggZnJvbSByZWRlZmluaW5nCisgKiBhbGwgdGhlIEFQSSBmdW5jdGlvbnMgdG8gdXNlIHRoZSBNUFUgd3JhcHBlcnMuIFRoYXQgc2hvdWxkIG9ubHkgYmUgZG9uZSB3aGVuCisgKiB0YXNrLmggaXMgaW5jbHVkZWQgZnJvbSBhbiBhcHBsaWNhdGlvbiBmaWxlLiAqLworI2RlZmluZSBNUFVfV1JBUFBFUlNfSU5DTFVERURfRlJPTV9BUElfRklMRQorCisvKiBTY2hlZHVsZXIgaW5jbHVkZXMuICovCisjaW5jbHVkZSAiRnJlZVJUT1MuaCIKKyNpbmNsdWRlICJ0YXNrLmgiCisKKy8qIE1QVSB3cmFwcGVycyBpbmNsdWRlcy4gKi8KKyNpbmNsdWRlICJtcHVfd3JhcHBlcnMuaCIKKworLyogUG9ydGFzbSBpbmNsdWRlcy4gKi8KKyNpbmNsdWRlICJwb3J0YXNtLmgiCisKKyNpZiggY29uZmlnRU5BQkxFX1RSVVNUWk9ORSA9PSAxICkKKwkvKiBTZWN1cmUgY29tcG9uZW50cyBpbmNsdWRlcy4gKi8KKwkjaW5jbHVkZSAic2VjdXJlX2NvbnRleHQuaCIKKwkjaW5jbHVkZSAic2VjdXJlX2luaXQuaCIKKyNlbmRpZiAvKiBjb25maWdFTkFCTEVfVFJVU1RaT05FICovCisKKyN1bmRlZiBNUFVfV1JBUFBFUlNfSU5DTFVERURfRlJPTV9BUElfRklMRQorCisvKioKKyAqIFRoZSBGcmVlUlRPUyBDb3J0ZXggTTMzIHBvcnQgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gcnVuIG9uIHRoZSBTZWN1cmUgU2lkZSBvbmx5CisgKiBpLmUuIHRoZSBwcm9jZXNzb3IgYm9vdHMgYXMgc2VjdXJlIGFuZCBuZXZlciBqdW1wcyB0byB0aGUgbm9uLXNlY3VyZSBzaWRlLgorICogVGhlIFRydXN0IFpvbmUgc3VwcG9ydCBpbiB0aGUgcG9ydCBtdXN0IGJlIGRpc2FibGVkIGluIG9yZGVyIHRvIHJ1biBGcmVlUlRPUworICogb24gdGhlIHNlY3VyZSBzaWRlLiBUaGUgZm9sbG93aW5nIGFyZSB0aGUgdmFsaWQgY29uZmlndXJhdGlvbiBzZWV0aW5nczoKKyAqCisgKiAxLiBSdW4gRnJlZVJUT1Mgb24gdGhlIFNlY3VyZSBTaWRlOgorICoJCWNvbmZpZ1JVTl9GUkVFUlRPU19TRUNVUkVfT05MWSA9IDEgYW5kIGNvbmZpZ0VOQUJMRV9UUlVTVFpPTkUgPSAwCisgKgorICogMi4gUnVuIEZyZWVSVE9TIG9uIHRoZSBOb24tU2VjdXJlIFNpZGUgd2l0aCBTZWN1cmUgU2lkZSBmdW5jdGlvbiBjYWxsIHN1cHBvcnQ6CisgKgkJY29uZmlnUlVOX0ZSRUVSVE9TX1NFQ1VSRV9PTkxZID0gMCBhbmQgY29uZmlnRU5BQkxFX1RSVVNUWk9ORSA9IDEKKyAqCisgKiAzLiBSdW4gRnJlZVJUT1Mgb24gdGhlIE5vbi1TZWN1cmUgU2lkZSBvbmx5IGkuZS4gbm8gU2VjdXJlIFNpZGUgZnVuY3Rpb24gY2FsbCBzdXBwb3J0OgorICoJCWNvbmZpZ1JVTl9GUkVFUlRPU19TRUNVUkVfT05MWSA9IDAgYW5kIGNvbmZpZ0VOQUJMRV9UUlVTVFpPTkUgPSAwCisgKi8KKyNpZiggKCBjb25maWdSVU5fRlJFRVJUT1NfU0VDVVJFX09OTFkgPT0gMSApICYmICggY29uZmlnRU5BQkxFX1RSVVNUWk9ORSA9PSAxICkgKQorCSNlcnJvciBUcnVzdFpvbmUgbmVlZHMgdG8gYmUgZGlzYWJsZWQgaW4gb3JkZXIgdG8gcnVuIEZyZWVSVE9TIG9uIHRoZSBTZWN1cmUgU2lkZS4KKyNlbmRpZgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKgorICogQGJyaWVmIENvbnN0YW50cyByZXF1aXJlZCB0byBtYW5pcHVsYXRlIHRoZSBOVklDLgorICovCisjZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfQ1RSTAkJCQkoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGUwMTAgKQorI2RlZmluZSBwb3J0TlZJQ19TWVNUSUNLX0xPQUQJCQkJKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlMDE0ICkKKyNkZWZpbmUgcG9ydE5WSUNfU1lTVElDS19DVVJSRU5UX1ZBTFVFCQkoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGUwMTggKQorI2RlZmluZSBwb3J0TlZJQ19JTlRfQ1RSTAkJCQkJKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZDA0ICkKKyNkZWZpbmUgcG9ydE5WSUNfU1lTUFJJMgkJCQkJKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZDIwICkKKyNkZWZpbmUgcG9ydE5WSUNfU1lTVElDS19DTEsJCQkJKCAweDAwMDAwMDA0ICkKKyNkZWZpbmUgcG9ydE5WSUNfU1lTVElDS19JTlQJCQkJKCAweDAwMDAwMDAyICkKKyNkZWZpbmUgcG9ydE5WSUNfU1lTVElDS19FTkFCTEUJCQkJKCAweDAwMDAwMDAxICkKKyNkZWZpbmUgcG9ydE5WSUNfUEVORFNWU0VUCQkJCQkoIDB4MTAwMDAwMDAgKQorI2RlZmluZSBwb3J0TUlOX0lOVEVSUlVQVF9QUklPUklUWQkJCSggMjU1VUwgKQorI2RlZmluZSBwb3J0TlZJQ19QRU5EU1ZfUFJJCQkJCQkoIHBvcnRNSU5fSU5URVJSVVBUX1BSSU9SSVRZIDw8IDE2VUwgKQorI2RlZmluZSBwb3J0TlZJQ19TWVNUSUNLX1BSSQkJCQkoIHBvcnRNSU5fSU5URVJSVVBUX1BSSU9SSVRZIDw8IDI0VUwgKQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKgorICogQGJyaWVmIENvbnN0YW50cyByZXF1aXJlZCB0byBtYW5pcHVsYXRlIHRoZSBTQ0IuCisgKi8KKyNkZWZpbmUgcG9ydFNDQl9TWVNfSEFORExFUl9DVFJMX1NUQVRFX1JFRwkoICogKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZWQyNCApCisjZGVmaW5lIHBvcnRTQ0JfTUVNX0ZBVUxUX0VOQUJMRQkJCSggMVVMIDw8IDE2VUwgKQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKgorICogQGJyaWVmIENvbnN0YW50cyByZXF1aXJlZCB0byBtYW5pcHVsYXRlIHRoZSBGUFUuCisgKi8KKyNkZWZpbmUgcG9ydENQQUNSCQkJCQkJCSggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZWQ4OCApCS8qIENvcHJvY2Vzc29yIEFjY2VzcyBDb250cm9sIFJlZ2lzdGVyLiAqLworI2RlZmluZSBwb3J0Q1BBQ1JfQ1AxMF9WQUxVRQkJCQkoIDNVTCApCisjZGVmaW5lIHBvcnRDUEFDUl9DUDExX1ZBTFVFCQkJCXBvcnRDUEFDUl9DUDEwX1ZBTFVFCisjZGVmaW5lIHBvcnRDUEFDUl9DUDEwX1BPUwkJCQkJKCAyMFVMICkKKyNkZWZpbmUgcG9ydENQQUNSX0NQMTFfUE9TCQkJCQkoIDIyVUwgKQorCisjZGVmaW5lIHBvcnRGUENDUgkJCQkJCQkoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVmMzQgKQkvKiBGbG9hdGluZyBQb2ludCBDb250ZXh0IENvbnRyb2wgUmVnaXN0ZXIuICovCisjZGVmaW5lIHBvcnRGUENDUl9BU1BFTl9QT1MJCQkJCSggMzFVTCApCisjZGVmaW5lIHBvcnRGUENDUl9BU1BFTl9NQVNLCQkJCSggMVVMIDw8IHBvcnRGUENDUl9BU1BFTl9QT1MgKQorI2RlZmluZSBwb3J0RlBDQ1JfTFNQRU5fUE9TCQkJCQkoIDMwVUwgKQorI2RlZmluZSBwb3J0RlBDQ1JfTFNQRU5fTUFTSwkJCQkoIDFVTCA8PCBwb3J0RlBDQ1JfTFNQRU5fUE9TICkKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAqIEBicmllZiBDb25zdGFudHMgcmVxdWlyZWQgdG8gbWFuaXB1bGF0ZSB0aGUgTVBVLgorICovCisjZGVmaW5lIHBvcnRNUFVfVFlQRV9SRUcJCQkJCSggKiAoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVkOTAgKSApCisjZGVmaW5lIHBvcnRNUFVfQ1RSTF9SRUcJCQkJCSggKiAoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVkOTQgKSApCisjZGVmaW5lIHBvcnRNUFVfUk5SX1JFRwkJCQkJCSggKiAoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVkOTggKSApCisKKyNkZWZpbmUgcG9ydE1QVV9SQkFSX1JFRwkJCQkJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZWQ5YyApICkKKyNkZWZpbmUgcG9ydE1QVV9STEFSX1JFRwkJCQkJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZWRhMCApICkKKworI2RlZmluZSBwb3J0TVBVX1JCQVJfQTFfUkVHCQkJCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZGE0ICkgKQorI2RlZmluZSBwb3J0TVBVX1JMQVJfQTFfUkVHCQkJCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZGE4ICkgKQorCisjZGVmaW5lIHBvcnRNUFVfUkJBUl9BMl9SRUcJCQkJCSggKiAoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVkYWMgKSApCisjZGVmaW5lIHBvcnRNUFVfUkxBUl9BMl9SRUcJCQkJCSggKiAoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVkYjAgKSApCisKKyNkZWZpbmUgcG9ydE1QVV9SQkFSX0EzX1JFRwkJCQkJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZWRiNCApICkKKyNkZWZpbmUgcG9ydE1QVV9STEFSX0EzX1JFRwkJCQkJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZWRiOCApICkKKworI2RlZmluZSBwb3J0TVBVX01BSVIwX1JFRwkJCQkJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZWRjMCApICkKKyNkZWZpbmUgcG9ydE1QVV9NQUlSMV9SRUcJCQkJCSggKiAoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVkYzQgKSApCisKKyNkZWZpbmUgcG9ydE1QVV9SQkFSX0FERFJFU1NfTUFTSwkJCSggMHhmZmZmZmZlMCApIC8qIE11c3QgYmUgMzItYnl0ZSBhbGlnbmVkLiAqLworI2RlZmluZSBwb3J0TVBVX1JMQVJfQUREUkVTU19NQVNLCQkJKCAweGZmZmZmZmUwICkgLyogTXVzdCBiZSAzMi1ieXRlIGFsaWduZWQuICovCisKKyNkZWZpbmUgcG9ydE1QVV9NQUlSX0FUVFIwX1BPUwkJCQkoIDBVTCApCisjZGVmaW5lIHBvcnRNUFVfTUFJUl9BVFRSMF9NQVNLCQkJCSggMHgwMDAwMDBmZiApCisKKyNkZWZpbmUgcG9ydE1QVV9NQUlSX0FUVFIxX1BPUwkJCQkoIDhVTCApCisjZGVmaW5lIHBvcnRNUFVfTUFJUl9BVFRSMV9NQVNLCQkJCSggMHgwMDAwZmYwMCApCisKKyNkZWZpbmUgcG9ydE1QVV9NQUlSX0FUVFIyX1BPUwkJCQkoIDE2VUwgKQorI2RlZmluZSBwb3J0TVBVX01BSVJfQVRUUjJfTUFTSwkJCQkoIDB4MDBmZjAwMDAgKQorCisjZGVmaW5lIHBvcnRNUFVfTUFJUl9BVFRSM19QT1MJCQkJKCAyNFVMICkKKyNkZWZpbmUgcG9ydE1QVV9NQUlSX0FUVFIzX01BU0sJCQkJKCAweGZmMDAwMDAwICkKKworI2RlZmluZSBwb3J0TVBVX01BSVJfQVRUUjRfUE9TCQkJCSggMFVMICkKKyNkZWZpbmUgcG9ydE1QVV9NQUlSX0FUVFI0X01BU0sJCQkJKCAweDAwMDAwMGZmICkKKworI2RlZmluZSBwb3J0TVBVX01BSVJfQVRUUjVfUE9TCQkJCSggOFVMICkKKyNkZWZpbmUgcG9ydE1QVV9NQUlSX0FUVFI1X01BU0sJCQkJKCAweDAwMDBmZjAwICkKKworI2RlZmluZSBwb3J0TVBVX01BSVJfQVRUUjZfUE9TCQkJCSggMTZVTCApCisjZGVmaW5lIHBvcnRNUFVfTUFJUl9BVFRSNl9NQVNLCQkJCSggMHgwMGZmMDAwMCApCisKKyNkZWZpbmUgcG9ydE1QVV9NQUlSX0FUVFI3X1BPUwkJCQkoIDI0VUwgKQorI2RlZmluZSBwb3J0TVBVX01BSVJfQVRUUjdfTUFTSwkJCQkoIDB4ZmYwMDAwMDAgKQorCisjZGVmaW5lIHBvcnRNUFVfUkxBUl9BVFRSX0lOREVYMAkJCSggMFVMIDw8IDFVTCApCisjZGVmaW5lIHBvcnRNUFVfUkxBUl9BVFRSX0lOREVYMQkJCSggMVVMIDw8IDFVTCApCisjZGVmaW5lIHBvcnRNUFVfUkxBUl9BVFRSX0lOREVYMgkJCSggMlVMIDw8IDFVTCApCisjZGVmaW5lIHBvcnRNUFVfUkxBUl9BVFRSX0lOREVYMwkJCSggM1VMIDw8IDFVTCApCisjZGVmaW5lIHBvcnRNUFVfUkxBUl9BVFRSX0lOREVYNAkJCSggNFVMIDw8IDFVTCApCisjZGVmaW5lIHBvcnRNUFVfUkxBUl9BVFRSX0lOREVYNQkJCSggNVVMIDw8IDFVTCApCisjZGVmaW5lIHBvcnRNUFVfUkxBUl9BVFRSX0lOREVYNgkJCSggNlVMIDw8IDFVTCApCisjZGVmaW5lIHBvcnRNUFVfUkxBUl9BVFRSX0lOREVYNwkJCSggN1VMIDw8IDFVTCApCisKKyNkZWZpbmUgcG9ydE1QVV9STEFSX1JFR0lPTl9FTkFCTEUJCQkoIDFVTCApCisKKy8qIEVuYWJsZSBwcml2aWxlZ2VkIGFjY2VzcyB0byB1bm1hcHBlZCByZWdpb24uICovCisjZGVmaW5lIHBvcnRNUFVfUFJJVl9CQUNLR1JPVU5EX0VOQUJMRQkJKCAxVUwgPDwgMlVMICkKKworLyogRW5hYmxlIE1QVS4gKi8KKyNkZWZpbmUgcG9ydE1QVV9FTkFCTEUJCQkJCQkoIDFVTCA8PCAwVUwgKQorCisvKiBFeHBlY3RlZCB2YWx1ZSBvZiB0aGUgcG9ydE1QVV9UWVBFIHJlZ2lzdGVyLiAqLworI2RlZmluZSBwb3J0RVhQRUNURURfTVBVX1RZUEVfVkFMVUUJCQkoIDhVTCA8PCA4VUwgKSAvKiA4IHJlZ2lvbnMsIHVuaWZpZWQuICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqCisgKiBAYnJpZWYgQ29uc3RhbnRzIHJlcXVpcmVkIHRvIHNldCB1cCB0aGUgaW5pdGlhbCBzdGFjay4KKyAqLworI2RlZmluZSBwb3J0SU5JVElBTF9YUFNSCQkJCQkoIDB4MDEwMDAwMDAgKQorCisjaWYoIGNvbmZpZ1JVTl9GUkVFUlRPU19TRUNVUkVfT05MWSA9PSAxICkKKwkvKioKKwkgKiBAYnJpZWYgSW5pdGlhbCBFWENfUkVUVVJOIHZhbHVlLgorCSAqCisJICogICAgIEZGICAgICAgICAgRkYgICAgICAgICBGRiAgICAgICAgIEZECisJICogMTExMSAxMTExICAxMTExIDExMTEgIDExMTEgMTExMSAgMTExMSAxMTAxCisJICoKKwkgKiBCaXRbNl0gLSAxIC0tPiBUaGUgZXhjZXB0aW9uIHdhcyB0YWtlbiBmcm9tIHRoZSBTZWN1cmUgc3RhdGUuCisJICogQml0WzVdIC0gMSAtLT4gRG8gbm90IHNraXAgc3RhY2tpbmcgb2YgYWRkaXRpb25hbCBzdGF0ZSBjb250ZXh0LgorCSAqIEJpdFs0XSAtIDEgLS0+IFRoZSBQRSBkaWQgbm90IGFsbG9jYXRlIHNwYWNlIG9uIHRoZSBzdGFjayBmb3IgRlAgY29udGV4dC4KKwkgKiBCaXRbM10gLSAxIC0tPiBSZXR1cm4gdG8gdGhlIFRocmVhZCBtb2RlLgorCSAqIEJpdFsyXSAtIDEgLS0+IFJlc3RvcmUgcmVnaXN0ZXJzIGZyb20gdGhlIHByb2Nlc3Mgc3RhY2suCisJICogQml0WzFdIC0gMCAtLT4gUmVzZXJ2ZWQsIDAuCisJICogQml0WzBdIC0gMSAtLT4gVGhlIGV4Y2VwdGlvbiB3YXMgdGFrZW4gdG8gdGhlIFNlY3VyZSBzdGF0ZS4KKwkgKi8KKwkjZGVmaW5lIHBvcnRJTklUSUFMX0VYQ19SRVRVUk4JCQkoIDB4ZmZmZmZmZmQgKQorI2Vsc2UKKwkvKioKKwkgKiBAYnJpZWYgSW5pdGlhbCBFWENfUkVUVVJOIHZhbHVlLgorCSAqCisJICogICAgIEZGICAgICAgICAgRkYgICAgICAgICBGRiAgICAgICAgIEJDCisJICogMTExMSAxMTExICAxMTExIDExMTEgIDExMTEgMTExMSAgMTAxMSAxMTAwCisJICoKKwkgKiBCaXRbNl0gLSAwIC0tPiBUaGUgZXhjZXB0aW9uIHdhcyB0YWtlbiBmcm9tIHRoZSBOb24tU2VjdXJlIHN0YXRlLgorCSAqIEJpdFs1XSAtIDEgLS0+IERvIG5vdCBza2lwIHN0YWNraW5nIG9mIGFkZGl0aW9uYWwgc3RhdGUgY29udGV4dC4KKwkgKiBCaXRbNF0gLSAxIC0tPiBUaGUgUEUgZGlkIG5vdCBhbGxvY2F0ZSBzcGFjZSBvbiB0aGUgc3RhY2sgZm9yIEZQIGNvbnRleHQuCisJICogQml0WzNdIC0gMSAtLT4gUmV0dXJuIHRvIHRoZSBUaHJlYWQgbW9kZS4KKwkgKiBCaXRbMl0gLSAxIC0tPiBSZXN0b3JlIHJlZ2lzdGVycyBmcm9tIHRoZSBwcm9jZXNzIHN0YWNrLgorCSAqIEJpdFsxXSAtIDAgLS0+IFJlc2VydmVkLCAwLgorCSAqIEJpdFswXSAtIDAgLS0+IFRoZSBleGNlcHRpb24gd2FzIHRha2VuIHRvIHRoZSBOb24tU2VjdXJlIHN0YXRlLgorCSAqLworCSNkZWZpbmUgcG9ydElOSVRJQUxfRVhDX1JFVFVSTgkJCSggMHhmZmZmZmZiYyApCisjZW5kaWYgLyogY29uZmlnUlVOX0ZSRUVSVE9TX1NFQ1VSRV9PTkxZICovCisKKy8qKgorICogQGJyaWVmIENPTlRST0wgcmVnaXN0ZXIgcHJpdmlsZWdlZCBiaXQgbWFzay4KKyAqCisgKiBCaXRbMF0gaW4gQ09OVFJPTCByZWdpc3RlciB0ZWxscyB0aGUgcHJpdmlsZWdlOgorICogIEJpdFswXSA9IDAgPT0+IFRoZSB0YXNrIGlzIHByaXZpbGVnZWQuCisgKiAgQml0WzBdID0gMSA9PT4gVGhlIHRhc2sgaXMgbm90IHByaXZpbGVnZWQuCisgKi8KKyNkZWZpbmUgcG9ydENPTlRST0xfUFJJVklMRUdFRF9NQVNLCQkJKCAxVUwgPDwgMFVMICkKKworLyoqCisgKiBAYnJpZWYgSW5pdGlhbCBDT05UUk9MIHJlZ2lzdGVyIHZhbHVlcy4KKyAqLworI2RlZmluZSBwb3J0SU5JVElBTF9DT05UUk9MX1VOUFJJVklMRUdFRAkoIDB4MyApCisjZGVmaW5lIHBvcnRJTklUSUFMX0NPTlRST0xfUFJJVklMRUdFRAkJKCAweDIgKQorCisvKioKKyAqIEBicmllZiBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHByZS1sb2FkaW5nIG9mIHRoZSBpbml0aWFsIExSIHdpdGggdGhlCisgKiBhZGRyZXNzIG9mIHBydlRhc2tFeGl0RXJyb3IoKSBpbiBjYXNlIGl0IG1lc3NlcyB1cCB1bndpbmRpbmcgb2YgdGhlIHN0YWNrCisgKiBpbiB0aGUgZGVidWdnZXIuCisgKi8KKyNpZmRlZiBjb25maWdUQVNLX1JFVFVSTl9BRERSRVNTCisJI2RlZmluZSBwb3J0VEFTS19SRVRVUk5fQUREUkVTUwkJCWNvbmZpZ1RBU0tfUkVUVVJOX0FERFJFU1MKKyNlbHNlCisJI2RlZmluZSBwb3J0VEFTS19SRVRVUk5fQUREUkVTUwkJCXBydlRhc2tFeGl0RXJyb3IKKyNlbmRpZgorCisvKioKKyAqIEBicmllZiBJZiBwb3J0UFJFTE9BRF9SRUdJU1RFUlMgdGhlbiByZWdpc3RlcnMgd2lsbCBiZSBnaXZlbiBhbiBpbml0aWFsIHZhbHVlCisgKiB3aGVuIGEgdGFzayBpcyBjcmVhdGVkLiBUaGlzIGhlbHBzIGluIGRlYnVnZ2luZyBhdCB0aGUgY29zdCBvZiBjb2RlIHNpemUuCisgKi8KKyNkZWZpbmUgcG9ydFBSRUxPQURfUkVHSVNURVJTCQkJCTEKKworLyoqCisgKiBAYnJpZWYgQSB0YXNrIGlzIGNyZWF0ZWQgd2l0aG91dCBhIHNlY3VyZSBjb250ZXh0LCBhbmQgbXVzdCBjYWxsCisgKiBwb3J0QUxMT0NBVEVfU0VDVVJFX0NPTlRFWFQoKSB0byBnaXZlIGl0c2VsZiBhIHNlY3VyZSBjb250ZXh0IGJlZm9yZSBpdCBtYWtlcworICogYW55IHNlY3VyZSBjYWxscy4KKyAqLworI2RlZmluZSBwb3J0Tk9fU0VDVVJFX0NPTlRFWFQJCQkJMAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKgorICogQGJyaWVmIFNldHVwIHRoZSB0aW1lciB0byBnZW5lcmF0ZSB0aGUgdGljayBpbnRlcnJ1cHRzLgorICovCitzdGF0aWMgdm9pZCBwcnZTZXR1cFRpbWVySW50ZXJydXB0KCB2b2lkICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworLyoqCisgKiBAYnJpZWYgVXNlZCB0byBjYXRjaCB0YXNrcyB0aGF0IGF0dGVtcHQgdG8gcmV0dXJuIGZyb20gdGhlaXIgaW1wbGVtZW50aW5nCisgKiBmdW5jdGlvbi4KKyAqLworc3RhdGljIHZvaWQgcHJ2VGFza0V4aXRFcnJvciggdm9pZCApOworCisjaWYoIGNvbmZpZ0VOQUJMRV9NUFUgPT0gMSApCisJLyoqCisJICogQGJyaWVmIFNldHVwIHRoZSBNZW1vcnkgUHJvdGVjdGlvbiBVbml0IChNUFUpLgorCSAqLworCXN0YXRpYyB2b2lkIHBydlNldHVwTVBVKCB2b2lkICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKyNlbmRpZiAvKiBjb25maWdFTkFCTEVfTVBVICovCisKKyNpZiggY29uZmlnRU5BQkxFX0ZQVSA9PSAxICkKKwkvKioKKwkgKiBAYnJpZWYgU2V0dXAgdGhlIEZsb2F0aW5nIFBvaW50IFVuaXQgKEZQVSkuCisJICovCisJc3RhdGljIHZvaWQgcHJ2U2V0dXBGUFUoIHZvaWQgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9GUFUgKi8KKworLyoqCisgKiBAYnJpZWYgWWllbGQgdGhlIHByb2Nlc3Nvci4KKyAqLwordm9pZCB2UG9ydFlpZWxkKCB2b2lkICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworLyoqCisgKiBAYnJpZWYgRW50ZXIgY3JpdGljYWwgc2VjdGlvbi4KKyAqLwordm9pZCB2UG9ydEVudGVyQ3JpdGljYWwoIHZvaWQgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisvKioKKyAqIEBicmllZiBFeGl0IGZyb20gY3JpdGljYWwgc2VjdGlvbi4KKyAqLwordm9pZCB2UG9ydEV4aXRDcml0aWNhbCggdm9pZCApIFBSSVZJTEVHRURfRlVOQ1RJT047CisKKy8qKgorICogQGJyaWVmIFN5c1RpY2sgaGFuZGxlci4KKyAqLwordm9pZCBTeXNUaWNrX0hhbmRsZXIoIHZvaWQgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisvKioKKyAqIEBicmllZiBDIHBhcnQgb2YgU1ZDIGhhbmRsZXIuCisgKi8KK3BvcnRET05UX0RJU0NBUkQgdm9pZCB2UG9ydFNWQ0hhbmRsZXJfQyggdWludDMyX3QgKnB1bENhbGxlclN0YWNrQWRkcmVzcyApIFBSSVZJTEVHRURfRlVOQ1RJT047CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqCisgKiBAYnJpZWYgRWFjaCB0YXNrIG1haW50YWlucyBpdHMgb3duIGludGVycnVwdCBzdGF0dXMgaW4gdGhlIGNyaXRpY2FsIG5lc3RpbmcKKyAqIHZhcmlhYmxlLgorICovCitzdGF0aWMgdm9sYXRpbGUgdWludDMyX3QgdWxDcml0aWNhbE5lc3RpbmcgPSAweGFhYWFhYWFhVUw7CisKKyNpZiggY29uZmlnRU5BQkxFX1RSVVNUWk9ORSA9PSAxICkKKwkvKioKKwkgKiBAYnJpZWYgU2F2ZWQgYXMgcGFydCBvZiB0aGUgdGFzayBjb250ZXh0IHRvIGluZGljYXRlIHdoaWNoIGNvbnRleHQgdGhlCisJICogdGFzayBpcyB1c2luZyBvbiB0aGUgc2VjdXJlIHNpZGUuCisJICovCisJcG9ydERPTlRfRElTQ0FSRCB2b2xhdGlsZSBTZWN1cmVDb250ZXh0SGFuZGxlX3QgeFNlY3VyZUNvbnRleHQgPSBwb3J0Tk9fU0VDVVJFX0NPTlRFWFQ7CisjZW5kaWYgLyogY29uZmlnRU5BQkxFX1RSVVNUWk9ORSAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB2b2lkIHBydlNldHVwVGltZXJJbnRlcnJ1cHQoIHZvaWQgKSAvKiBQUklWSUxFR0VEX0ZVTkNUSU9OICovCit7CisJLyogU3RvcCBhbmQgcmVzZXQgdGhlIFN5c1RpY2suICovCisJKiggcG9ydE5WSUNfU1lTVElDS19DVFJMICkgPSAwVUw7CisJKiggcG9ydE5WSUNfU1lTVElDS19DVVJSRU5UX1ZBTFVFICkgPSAwVUw7CisKKwkvKiBDb25maWd1cmUgU3lzVGljayB0byBpbnRlcnJ1cHQgYXQgdGhlIHJlcXVlc3RlZCByYXRlLiAqLworCSooIHBvcnROVklDX1NZU1RJQ0tfTE9BRCApID0gKCBjb25maWdDUFVfQ0xPQ0tfSFogLyBjb25maWdUSUNLX1JBVEVfSFogKSAtIDFVTDsKKwkqKCBwb3J0TlZJQ19TWVNUSUNLX0NUUkwgKSA9IHBvcnROVklDX1NZU1RJQ0tfQ0xLIHwgcG9ydE5WSUNfU1lTVElDS19JTlQgfCBwb3J0TlZJQ19TWVNUSUNLX0VOQUJMRTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdm9pZCBwcnZUYXNrRXhpdEVycm9yKCB2b2lkICkKK3sKK3ZvbGF0aWxlIHVpbnQzMl90IHVsRHVtbXkgPSAwVUw7CisKKwkvKiBBIGZ1bmN0aW9uIHRoYXQgaW1wbGVtZW50cyBhIHRhc2sgbXVzdCBub3QgZXhpdCBvciBhdHRlbXB0IHRvIHJldHVybiB0bworCSAqIGl0cyBjYWxsZXIgYXMgdGhlcmUgaXMgbm90aGluZyB0byByZXR1cm4gdG8uIElmIGEgdGFzayB3YW50cyB0byBleGl0IGl0CisJICogc2hvdWxkIGluc3RlYWQgY2FsbCB2VGFza0RlbGV0ZSggTlVMTCApLiBBcnRpZmljaWFsbHkgZm9yY2UgYW4gYXNzZXJ0KCkKKwkgKiB0byBiZSB0cmlnZ2VyZWQgaWYgY29uZmlnQVNTRVJUKCkgaXMgZGVmaW5lZCwgdGhlbiBzdG9wIGhlcmUgc28KKwkgKiBhcHBsaWNhdGlvbiB3cml0ZXJzIGNhbiBjYXRjaCB0aGUgZXJyb3IuICovCisJY29uZmlnQVNTRVJUKCB1bENyaXRpY2FsTmVzdGluZyA9PSB+MFVMICk7CisJcG9ydERJU0FCTEVfSU5URVJSVVBUUygpOworCisJd2hpbGUoIHVsRHVtbXkgPT0gMCApCisJeworCQkvKiBUaGlzIGZpbGUgY2FsbHMgcHJ2VGFza0V4aXRFcnJvcigpIGFmdGVyIHRoZSBzY2hlZHVsZXIgaGFzIGJlZW4KKwkJICogc3RhcnRlZCB0byByZW1vdmUgYSBjb21waWxlciB3YXJuaW5nIGFib3V0IHRoZSBmdW5jdGlvbiBiZWluZworCQkgKiBkZWZpbmVkIGJ1dCBuZXZlciBjYWxsZWQuICB1bER1bW15IGlzIHVzZWQgcHVyZWx5IHRvIHF1aWV0ZW4gb3RoZXIKKwkJICogd2FybmluZ3MgYWJvdXQgY29kZSBhcHBlYXJpbmcgYWZ0ZXIgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgLSBtYWtpbmcKKwkJICogdWxEdW1teSB2b2xhdGlsZSBtYWtlcyB0aGUgY29tcGlsZXIgdGhpbmsgdGhlIGZ1bmN0aW9uIGNvdWxkIHJldHVybgorCQkgKiBhbmQgdGhlcmVmb3JlIG5vdCBvdXRwdXQgYW4gJ3VucmVhY2hhYmxlIGNvZGUnIHdhcm5pbmcgZm9yIGNvZGUgdGhhdAorCQkgKiBhcHBlYXJzIGFmdGVyIGl0LiAqLworCX0KK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYoIGNvbmZpZ0VOQUJMRV9NUFUgPT0gMSApCisJc3RhdGljIHZvaWQgcHJ2U2V0dXBNUFUoIHZvaWQgKSAvKiBQUklWSUxFR0VEX0ZVTkNUSU9OICovCisJeworCSNpZiBkZWZpbmVkKCBfX0FSTUNDX1ZFUlNJT04gKQorCQkvKiBEZWNsYXJhdGlvbiB3aGVuIHRoZXNlIHZhcmlhYmxlIGFyZSBkZWZpbmVkIGluIGNvZGUgaW5zdGVhZCBvZiBiZWluZworCQkgKiBleHBvcnRlZCBmcm9tIGxpbmtlciBzY3JpcHRzLiAqLworCQlleHRlcm4gdWludDMyX3QgKiBfX3ByaXZpbGVnZWRfZnVuY3Rpb25zX3N0YXJ0X187CisJCWV4dGVybiB1aW50MzJfdCAqIF9fcHJpdmlsZWdlZF9mdW5jdGlvbnNfZW5kX187CisJCWV4dGVybiB1aW50MzJfdCAqIF9fc3lzY2FsbHNfZmxhc2hfc3RhcnRfXzsKKwkJZXh0ZXJuIHVpbnQzMl90ICogX19zeXNjYWxsc19mbGFzaF9lbmRfXzsKKwkJZXh0ZXJuIHVpbnQzMl90ICogX191bnByaXZpbGVnZWRfZmxhc2hfc3RhcnRfXzsKKwkJZXh0ZXJuIHVpbnQzMl90ICogX191bnByaXZpbGVnZWRfZmxhc2hfZW5kX187CisJCWV4dGVybiB1aW50MzJfdCAqIF9fcHJpdmlsZWdlZF9zcmFtX3N0YXJ0X187CisJCWV4dGVybiB1aW50MzJfdCAqIF9fcHJpdmlsZWdlZF9zcmFtX2VuZF9fOworCSNlbHNlCisJCS8qIERlY2xhcmF0aW9uIHdoZW4gdGhlc2UgdmFyaWFibGUgYXJlIGV4cG9ydGVkIGZyb20gbGlua2VyIHNjcmlwdHMuICovCisJCWV4dGVybiB1aW50MzJfdCBfX3ByaXZpbGVnZWRfZnVuY3Rpb25zX3N0YXJ0X19bXTsKKwkJZXh0ZXJuIHVpbnQzMl90IF9fcHJpdmlsZWdlZF9mdW5jdGlvbnNfZW5kX19bXTsKKwkJZXh0ZXJuIHVpbnQzMl90IF9fc3lzY2FsbHNfZmxhc2hfc3RhcnRfX1tdOworCQlleHRlcm4gdWludDMyX3QgX19zeXNjYWxsc19mbGFzaF9lbmRfX1tdOworCQlleHRlcm4gdWludDMyX3QgX191bnByaXZpbGVnZWRfZmxhc2hfc3RhcnRfX1tdOworCQlleHRlcm4gdWludDMyX3QgX191bnByaXZpbGVnZWRfZmxhc2hfZW5kX19bXTsKKwkJZXh0ZXJuIHVpbnQzMl90IF9fcHJpdmlsZWdlZF9zcmFtX3N0YXJ0X19bXTsKKwkJZXh0ZXJuIHVpbnQzMl90IF9fcHJpdmlsZWdlZF9zcmFtX2VuZF9fW107CisJI2VuZGlmIC8qIGRlZmluZWQoIF9fQVJNQ0NfVkVSU0lPTiApICovCisKKwkJLyogQ2hlY2sgdGhhdCB0aGUgTVBVIGlzIHByZXNlbnQuICovCisJCWlmKCBwb3J0TVBVX1RZUEVfUkVHID09IHBvcnRFWFBFQ1RFRF9NUFVfVFlQRV9WQUxVRSApCisJCXsKKwkJCS8qIE1BSVIwIC0gSW5kZXggMC4gKi8KKwkJCXBvcnRNUFVfTUFJUjBfUkVHIHw9ICggKCBwb3J0TVBVX05PUk1BTF9NRU1PUllfQlVGRkVSQUJMRV9DQUNIRUFCTEUgPDwgcG9ydE1QVV9NQUlSX0FUVFIwX1BPUyApICYgcG9ydE1QVV9NQUlSX0FUVFIwX01BU0sgKTsKKwkJCS8qIE1BSVIwIC0gSW5kZXggMS4gKi8KKwkJCXBvcnRNUFVfTUFJUjBfUkVHIHw9ICggKCBwb3J0TVBVX0RFVklDRV9NRU1PUllfbkduUkUgPDwgcG9ydE1QVV9NQUlSX0FUVFIxX1BPUyApICYgcG9ydE1QVV9NQUlSX0FUVFIxX01BU0sgKTsKKworCQkJLyogU2V0dXAgcHJpdmlsZWdlZCBmbGFzaCBhcyBSZWFkIE9ubHkgc28gdGhhdCBwcml2aWxlZ2VkIHRhc2tzIGNhbgorCQkJICogcmVhZCBpdCBidXQgbm90IG1vZGlmeS4gKi8KKwkJCXBvcnRNUFVfUk5SX1JFRyA9IHBvcnRQUklWSUxFR0VEX0ZMQVNIX1JFR0lPTjsKKwkJCXBvcnRNUFVfUkJBUl9SRUcgPQkoICggKCB1aW50MzJfdCApIF9fcHJpdmlsZWdlZF9mdW5jdGlvbnNfc3RhcnRfXyApICYgcG9ydE1QVV9SQkFSX0FERFJFU1NfTUFTSyApIHwKKwkJCQkJCQkJKCBwb3J0TVBVX1JFR0lPTl9OT05fU0hBUkVBQkxFICkgfAorCQkJCQkJCQkoIHBvcnRNUFVfUkVHSU9OX1BSSVZJTEVHRURfUkVBRF9PTkxZICk7CisJCQlwb3J0TVBVX1JMQVJfUkVHID0JKCAoICggdWludDMyX3QgKSBfX3ByaXZpbGVnZWRfZnVuY3Rpb25zX2VuZF9fICkgJiBwb3J0TVBVX1JMQVJfQUREUkVTU19NQVNLICkgfAorCQkJCQkJCQkoIHBvcnRNUFVfUkxBUl9BVFRSX0lOREVYMCApIHwKKwkJCQkJCQkJKCBwb3J0TVBVX1JMQVJfUkVHSU9OX0VOQUJMRSApOworCisJCQkvKiBTZXR1cCB1bnByaXZpbGVnZWQgZmxhc2ggYXMgUmVhZCBPbmx5IGJ5IGJvdGggcHJpdmlsZWdlZCBhbmQKKwkJCSAqIHVucHJpdmlsZWdlZCB0YXNrcy4gQWxsIHRhc2tzIGNhbiByZWFkIGl0IGJ1dCBuby1vbmUgY2FuIG1vZGlmeS4gKi8KKwkJCXBvcnRNUFVfUk5SX1JFRyA9IHBvcnRVTlBSSVZJTEVHRURfRkxBU0hfUkVHSU9OOworCQkJcG9ydE1QVV9SQkFSX1JFRyA9CSggKCAoIHVpbnQzMl90ICkgX191bnByaXZpbGVnZWRfZmxhc2hfc3RhcnRfXyApICYgcG9ydE1QVV9SQkFSX0FERFJFU1NfTUFTSyApIHwKKwkJCQkJCQkJKCBwb3J0TVBVX1JFR0lPTl9OT05fU0hBUkVBQkxFICkgfAorCQkJCQkJCQkoIHBvcnRNUFVfUkVHSU9OX1JFQURfT05MWSApOworCQkJcG9ydE1QVV9STEFSX1JFRyA9CSggKCAoIHVpbnQzMl90ICkgX191bnByaXZpbGVnZWRfZmxhc2hfZW5kX18gKSAmIHBvcnRNUFVfUkxBUl9BRERSRVNTX01BU0sgKSB8CisJCQkJCQkJCSggcG9ydE1QVV9STEFSX0FUVFJfSU5ERVgwICkgfAorCQkJCQkJCQkoIHBvcnRNUFVfUkxBUl9SRUdJT05fRU5BQkxFICk7CisKKwkJCS8qIFNldHVwIHVucHJpdmlsZWdlZCBzeXNjYWxscyBmbGFzaCBhcyBSZWFkIE9ubHkgYnkgYm90aCBwcml2aWxlZ2VkCisJCQkgKiBhbmQgdW5wcml2aWxlZ2VkIHRhc2tzLiBBbGwgdGFza3MgY2FuIHJlYWQgaXQgYnV0IG5vLW9uZSBjYW4gbW9kaWZ5LiAqLworCQkJcG9ydE1QVV9STlJfUkVHID0gcG9ydFVOUFJJVklMRUdFRF9TWVNDQUxMU19SRUdJT047CisJCQlwb3J0TVBVX1JCQVJfUkVHID0JKCAoICggdWludDMyX3QgKSBfX3N5c2NhbGxzX2ZsYXNoX3N0YXJ0X18gKSAmIHBvcnRNUFVfUkJBUl9BRERSRVNTX01BU0sgKSB8CisJCQkJCQkJCSggcG9ydE1QVV9SRUdJT05fTk9OX1NIQVJFQUJMRSApIHwKKwkJCQkJCQkJKCBwb3J0TVBVX1JFR0lPTl9SRUFEX09OTFkgKTsKKwkJCXBvcnRNUFVfUkxBUl9SRUcgPQkoICggKCB1aW50MzJfdCApIF9fc3lzY2FsbHNfZmxhc2hfZW5kX18gKSAmIHBvcnRNUFVfUkxBUl9BRERSRVNTX01BU0sgKSB8CisJCQkJCQkJCSggcG9ydE1QVV9STEFSX0FUVFJfSU5ERVgwICkgfAorCQkJCQkJCQkoIHBvcnRNUFVfUkxBUl9SRUdJT05fRU5BQkxFICk7CisKKwkJCS8qIFNldHVwIFJBTSBjb250YWluaW5nIGtlcm5lbCBkYXRhIGZvciBwcml2aWxlZ2VkIGFjY2VzcyBvbmx5LiAqLworCQkJcG9ydE1QVV9STlJfUkVHID0gcG9ydFBSSVZJTEVHRURfUkFNX1JFR0lPTjsKKwkJCXBvcnRNUFVfUkJBUl9SRUcgPQkoICggKCB1aW50MzJfdCApIF9fcHJpdmlsZWdlZF9zcmFtX3N0YXJ0X18gKSAmIHBvcnRNUFVfUkJBUl9BRERSRVNTX01BU0sgKSB8CisJCQkJCQkJCSggcG9ydE1QVV9SRUdJT05fTk9OX1NIQVJFQUJMRSApIHwKKwkJCQkJCQkJKCBwb3J0TVBVX1JFR0lPTl9QUklWSUxFR0VEX1JFQURfV1JJVEUgKSB8CisJCQkJCQkJCSggcG9ydE1QVV9SRUdJT05fRVhFQ1VURV9ORVZFUiApOworCQkJcG9ydE1QVV9STEFSX1JFRyA9CSggKCAoIHVpbnQzMl90ICkgX19wcml2aWxlZ2VkX3NyYW1fZW5kX18gKSAmIHBvcnRNUFVfUkxBUl9BRERSRVNTX01BU0sgKSB8CisJCQkJCQkJCSggcG9ydE1QVV9STEFSX0FUVFJfSU5ERVgwICkgfAorCQkJCQkJCQkoIHBvcnRNUFVfUkxBUl9SRUdJT05fRU5BQkxFICk7CisKKwkJCS8qIEVuYWJsZSBtZW0gZmF1bHQuICovCisJCQlwb3J0U0NCX1NZU19IQU5ETEVSX0NUUkxfU1RBVEVfUkVHIHw9IHBvcnRTQ0JfTUVNX0ZBVUxUX0VOQUJMRTsKKworCQkJLyogRW5hYmxlIE1QVSB3aXRoIHByaXZpbGVnZWQgYmFja2dyb3VuZCBhY2Nlc3MgaS5lLiB1bm1hcHBlZAorCQkJICogcmVnaW9ucyBoYXZlIHByaXZpbGVnZWQgYWNjZXNzLiAqLworCQkJcG9ydE1QVV9DVFJMX1JFRyB8PSAoIHBvcnRNUFVfUFJJVl9CQUNLR1JPVU5EX0VOQUJMRSB8IHBvcnRNUFVfRU5BQkxFICk7CisJCX0KKwl9CisjZW5kaWYgLyogY29uZmlnRU5BQkxFX01QVSAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiggY29uZmlnRU5BQkxFX0ZQVSA9PSAxICkKKwlzdGF0aWMgdm9pZCBwcnZTZXR1cEZQVSggdm9pZCApIC8qIFBSSVZJTEVHRURfRlVOQ1RJT04gKi8KKwl7CisJCSNpZiggY29uZmlnRU5BQkxFX1RSVVNUWk9ORSA9PSAxICkKKwkJeworCQkJLyogRW5hYmxlIG5vbi1zZWN1cmUgYWNjZXNzIHRvIHRoZSBGUFUuICovCisJCQlTZWN1cmVJbml0X0VuYWJsZU5TRlBVQWNjZXNzKCk7CisJCX0KKwkJI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9UUlVTVFpPTkUgKi8KKworCQkvKiBDUDEwID0gMTEgPT0+IEZ1bGwgYWNjZXNzIHRvIEZQVSBpLmUuIGJvdGggcHJpdmlsZWdlZCBhbmQKKwkJICogdW5wcml2aWxlZ2VkIGNvZGUgc2hvdWxkIGJlIGFibGUgdG8gYWNjZXNzIEZQVS4gQ1AxMSBzaG91bGQgYmUKKwkJICogcHJvZ3JhbW1lZCB0byB0aGUgc2FtZSB2YWx1ZSBhcyBDUDEwLiAqLworCQkqKCBwb3J0Q1BBQ1IgKSB8PQkoCSggcG9ydENQQUNSX0NQMTBfVkFMVUUgPDwgcG9ydENQQUNSX0NQMTBfUE9TICkgfAorCQkJCQkJCQkoIHBvcnRDUEFDUl9DUDExX1ZBTFVFIDw8IHBvcnRDUEFDUl9DUDExX1BPUyApCisJCQkJCQkJKTsKKworCQkvKiBBU1BFTiA9IDEgPT0+IEhhcmR3YXJlIHNob3VsZCBhdXRvbWF0aWNhbGx5IHByZXNlcnZlIGZsb2F0aW5nIHBvaW50CisJCSAqIGNvbnRleHQgb24gZXhjZXB0aW9uIGVudHJ5IGFuZCByZXN0b3JlIG9uIGV4Y2VwdGlvbiByZXR1cm4uCisJCSAqIExTUEVOID0gMSA9PT4gRW5hYmxlIGxhenkgY29udGV4dCBzYXZlIG9mIEZQIHN0YXRlLiAqLworCQkqKCBwb3J0RlBDQ1IgKSB8PSAoIHBvcnRGUENDUl9BU1BFTl9NQVNLIHwgcG9ydEZQQ0NSX0xTUEVOX01BU0sgKTsKKwl9CisjZW5kaWYgLyogY29uZmlnRU5BQkxFX0ZQVSAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgdlBvcnRZaWVsZCggdm9pZCApIC8qIFBSSVZJTEVHRURfRlVOQ1RJT04gKi8KK3sKKwkvKiBTZXQgYSBQZW5kU1YgdG8gcmVxdWVzdCBhIGNvbnRleHQgc3dpdGNoLiAqLworCSooIHBvcnROVklDX0lOVF9DVFJMICkgPSBwb3J0TlZJQ19QRU5EU1ZTRVQ7CisKKwkvKiBCYXJyaWVycyBhcmUgbm9ybWFsbHkgbm90IHJlcXVpcmVkIGJ1dCBkbyBlbnN1cmUgdGhlIGNvZGUgaXMKKwkgKiBjb21wbGV0ZWx5IHdpdGhpbiB0aGUgc3BlY2lmaWVkIGJlaGF2aW91ciBmb3IgdGhlIGFyY2hpdGVjdHVyZS4gKi8KKwlfX2FzbSB2b2xhdGlsZSggImRzYiIgOjo6ICJtZW1vcnkiICk7CisJX19hc20gdm9sYXRpbGUoICJpc2IiICk7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCB2UG9ydEVudGVyQ3JpdGljYWwoIHZvaWQgKSAvKiBQUklWSUxFR0VEX0ZVTkNUSU9OICovCit7CisJcG9ydERJU0FCTEVfSU5URVJSVVBUUygpOworCXVsQ3JpdGljYWxOZXN0aW5nKys7CisKKwkvKiBCYXJyaWVycyBhcmUgbm9ybWFsbHkgbm90IHJlcXVpcmVkIGJ1dCBkbyBlbnN1cmUgdGhlIGNvZGUgaXMKKwkgKiBjb21wbGV0ZWx5IHdpdGhpbiB0aGUgc3BlY2lmaWVkIGJlaGF2aW91ciBmb3IgdGhlIGFyY2hpdGVjdHVyZS4gKi8KKwlfX2FzbSB2b2xhdGlsZSggImRzYiIgOjo6ICJtZW1vcnkiICk7CisJX19hc20gdm9sYXRpbGUoICJpc2IiICk7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCB2UG9ydEV4aXRDcml0aWNhbCggdm9pZCApIC8qIFBSSVZJTEVHRURfRlVOQ1RJT04gKi8KK3sKKwljb25maWdBU1NFUlQoIHVsQ3JpdGljYWxOZXN0aW5nICk7CisJdWxDcml0aWNhbE5lc3RpbmctLTsKKworCWlmKCB1bENyaXRpY2FsTmVzdGluZyA9PSAwICkKKwl7CisJCXBvcnRFTkFCTEVfSU5URVJSVVBUUygpOworCX0KK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIFN5c1RpY2tfSGFuZGxlciggdm9pZCApIC8qIFBSSVZJTEVHRURfRlVOQ1RJT04gKi8KK3sKK3VpbnQzMl90IHVsUHJldmlvdXNNYXNrOworCisJdWxQcmV2aW91c01hc2sgPSBwb3J0U0VUX0lOVEVSUlVQVF9NQVNLX0ZST01fSVNSKCk7CisJeworCQkvKiBJbmNyZW1lbnQgdGhlIFJUT1MgdGljay4gKi8KKwkJaWYoIHhUYXNrSW5jcmVtZW50VGljaygpICE9IHBkRkFMU0UgKQorCQl7CisJCQkvKiBQZW5kIGEgY29udGV4dCBzd2l0Y2guICovCisJCQkqKCBwb3J0TlZJQ19JTlRfQ1RSTCApID0gcG9ydE5WSUNfUEVORFNWU0VUOworCQl9CisJfQorCXBvcnRDTEVBUl9JTlRFUlJVUFRfTUFTS19GUk9NX0lTUiggdWxQcmV2aW91c01hc2sgKTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIHZQb3J0U1ZDSGFuZGxlcl9DKCB1aW50MzJfdCAqcHVsQ2FsbGVyU3RhY2tBZGRyZXNzICkgLyogUFJJVklMRUdFRF9GVU5DVElPTiBwb3J0RE9OVF9ESVNDQVJEICovCit7CisjaWYoIGNvbmZpZ0VOQUJMRV9NUFUgPT0gMSApCisJI2lmIGRlZmluZWQoIF9fQVJNQ0NfVkVSU0lPTiApCisJCS8qIERlY2xhcmF0aW9uIHdoZW4gdGhlc2UgdmFyaWFibGUgYXJlIGRlZmluZWQgaW4gY29kZSBpbnN0ZWFkIG9mIGJlaW5nCisJCSAqIGV4cG9ydGVkIGZyb20gbGlua2VyIHNjcmlwdHMuICovCisJCWV4dGVybiB1aW50MzJfdCAqIF9fc3lzY2FsbHNfZmxhc2hfc3RhcnRfXzsKKwkJZXh0ZXJuIHVpbnQzMl90ICogX19zeXNjYWxsc19mbGFzaF9lbmRfXzsKKwkjZWxzZQorCQkvKiBEZWNsYXJhdGlvbiB3aGVuIHRoZXNlIHZhcmlhYmxlIGFyZSBleHBvcnRlZCBmcm9tIGxpbmtlciBzY3JpcHRzLiAqLworCQlleHRlcm4gdWludDMyX3QgX19zeXNjYWxsc19mbGFzaF9zdGFydF9fW107CisJCWV4dGVybiB1aW50MzJfdCBfX3N5c2NhbGxzX2ZsYXNoX2VuZF9fW107CisJI2VuZGlmIC8qIGRlZmluZWQoIF9fQVJNQ0NfVkVSU0lPTiApICovCisjZW5kaWYgLyogY29uZmlnRU5BQkxFX01QVSAqLworCit1aW50MzJfdCB1bFBDOworCisjaWYoIGNvbmZpZ0VOQUJMRV9UUlVTVFpPTkUgPT0gMSApCisJdWludDMyX3QgdWxSMDsKKwkjaWYoIGNvbmZpZ0VOQUJMRV9NUFUgPT0gMSApCisJCXVpbnQzMl90IHVsQ29udHJvbCwgdWxJc1Rhc2tQcml2aWxlZ2VkOworCSNlbmRpZiAvKiBjb25maWdFTkFCTEVfTVBVICovCisjZW5kaWYgLyogY29uZmlnRU5BQkxFX1RSVVNUWk9ORSAqLwordWludDhfdCB1Y1NWQ051bWJlcjsKKworCS8qIFJlZ2lzdGVyIGFyZSBzdG9yZWQgb24gdGhlIHN0YWNrIGluIHRoZSBmb2xsb3dpbmcgb3JkZXIgLSBSMCwgUjEsIFIyLCBSMywKKwkgKiBSMTIsIExSLCBQQywgeFBTUi4gKi8KKwl1bFBDID0gcHVsQ2FsbGVyU3RhY2tBZGRyZXNzWyA2IF07CisJdWNTVkNOdW1iZXIgPSAoICggdWludDhfdCAqKSB1bFBDIClbIC0yIF07CisKKwlzd2l0Y2goIHVjU1ZDTnVtYmVyICkKKwl7CisJCSNpZiggY29uZmlnRU5BQkxFX1RSVVNUWk9ORSA9PSAxICkKKwkJCWNhc2UgcG9ydFNWQ19BTExPQ0FURV9TRUNVUkVfQ09OVEVYVDoKKwkJCXsKKwkJCQkvKiBSMCBjb250YWlucyB0aGUgc3RhY2sgc2l6ZSBwYXNzZWQgYXMgcGFyYW1ldGVyIHRvIHRoZQorCQkJCSAqIHZQb3J0QWxsb2NhdGVTZWN1cmVDb250ZXh0IGZ1bmN0aW9uLiAqLworCQkJCXVsUjAgPSBwdWxDYWxsZXJTdGFja0FkZHJlc3NbIDAgXTsKKworCQkJCSNpZiggY29uZmlnRU5BQkxFX01QVSA9PSAxICkKKwkJCQl7CisJCQkJCS8qIFJlYWQgdGhlIENPTlRST0wgcmVnaXN0ZXIgdmFsdWUuICovCisJCQkJCV9fYXNtIHZvbGF0aWxlICggIm1ycyAlMCwgY29udHJvbCIgIDogIj1yIiAoIHVsQ29udHJvbCApICk7CisKKwkJCQkJLyogVGhlIHRhc2sgdGhhdCByYWlzZWQgdGhlIFNWQyBpcyBwcml2aWxlZ2VkIGlmIEJpdFswXQorCQkJCQkgKiBpbiB0aGUgQ09OVFJPTCByZWdpc3RlciBpcyAwLiAqLworCQkJCQl1bElzVGFza1ByaXZpbGVnZWQgPSAoICggdWxDb250cm9sICYgcG9ydENPTlRST0xfUFJJVklMRUdFRF9NQVNLICkgPT0gMCApOworCisJCQkJCS8qIEFsbG9jYXRlIGFuZCBsb2FkIGEgY29udGV4dCBmb3IgdGhlIHNlY3VyZSB0YXNrLiAqLworCQkJCQl4U2VjdXJlQ29udGV4dCA9IFNlY3VyZUNvbnRleHRfQWxsb2NhdGVDb250ZXh0KCB1bFIwLCB1bElzVGFza1ByaXZpbGVnZWQgKTsKKwkJCQl9CisJCQkJI2Vsc2UKKwkJCQl7CisJCQkJCS8qIEFsbG9jYXRlIGFuZCBsb2FkIGEgY29udGV4dCBmb3IgdGhlIHNlY3VyZSB0YXNrLiAqLworCQkJCQl4U2VjdXJlQ29udGV4dCA9IFNlY3VyZUNvbnRleHRfQWxsb2NhdGVDb250ZXh0KCB1bFIwICk7CisJCQkJfQorCQkJCSNlbmRpZiAvKiBjb25maWdFTkFCTEVfTVBVICovCisKKwkJCQljb25maWdBU1NFUlQoIHhTZWN1cmVDb250ZXh0ICE9IE5VTEwgKTsKKwkJCQlTZWN1cmVDb250ZXh0X0xvYWRDb250ZXh0KCB4U2VjdXJlQ29udGV4dCApOworCQkJfQorCQkJYnJlYWs7CisKKwkJCWNhc2UgcG9ydFNWQ19GUkVFX1NFQ1VSRV9DT05URVhUOgorCQkJeworCQkJCS8qIFIwIGNvbnRhaW5zIHRoZSBzZWN1cmUgY29udGV4dCBoYW5kbGUgdG8gYmUgZnJlZWQuICovCisJCQkJdWxSMCA9IHB1bENhbGxlclN0YWNrQWRkcmVzc1sgMCBdOworCisJCQkJLyogRnJlZSB0aGUgc2VjdXJlIGNvbnRleHQuICovCisJCQkJU2VjdXJlQ29udGV4dF9GcmVlQ29udGV4dCggKCBTZWN1cmVDb250ZXh0SGFuZGxlX3QgKSB1bFIwICk7CisJCQl9CisJCQlicmVhazsKKwkJI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9UUlVTVFpPTkUgKi8KKworCQljYXNlIHBvcnRTVkNfU1RBUlRfU0NIRURVTEVSOgorCQl7CisJCQkjaWYoIGNvbmZpZ0VOQUJMRV9UUlVTVFpPTkUgPT0gMSApCisJCQl7CisJCQkJLyogRGUtcHJpb3JpdGl6ZSB0aGUgbm9uLXNlY3VyZSBleGNlcHRpb25zIHNvIHRoYXQgdGhlCisJCQkJICogbm9uLXNlY3VyZSBwZW5kU1YgcnVucyBhdCB0aGUgbG93ZXN0IHByaW9yaXR5LiAqLworCQkJCVNlY3VyZUluaXRfRGVQcmlvcml0aXplTlNFeGNlcHRpb25zKCk7CisKKwkJCQkvKiBJbml0aWFsaXplIHRoZSBzZWN1cmUgY29udGV4dCBtYW5hZ2VtZW50IHN5c3RlbS4gKi8KKwkJCQlTZWN1cmVDb250ZXh0X0luaXQoKTsKKwkJCX0KKwkJCSNlbmRpZiAvKiBjb25maWdFTkFCTEVfVFJVU1RaT05FICovCisKKwkJCSNpZiggY29uZmlnRU5BQkxFX0ZQVSA9PSAxICkKKwkJCXsKKwkJCQkvKiBTZXR1cCB0aGUgRmxvYXRpbmcgUG9pbnQgVW5pdCAoRlBVKS4gKi8KKwkJCQlwcnZTZXR1cEZQVSgpOworCQkJfQorCQkJI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9GUFUgKi8KKworCQkJLyogU2V0dXAgdGhlIGNvbnRleHQgb2YgdGhlIGZpcnN0IHRhc2sgc28gdGhhdCB0aGUgZmlyc3QgdGFzayBzdGFydHMKKwkJCSAqIGV4ZWN1dGluZy4gKi8KKwkJCXZSZXN0b3JlQ29udGV4dE9mRmlyc3RUYXNrKCk7CisJCX0KKwkJYnJlYWs7CisKKwkJI2lmKCBjb25maWdFTkFCTEVfTVBVID09IDEgKQorCQkJY2FzZSBwb3J0U1ZDX1JBSVNFX1BSSVZJTEVHRToKKwkJCXsKKwkJCQkvKiBPbmx5IHJhaXNlIHRoZSBwcml2aWxlZ2UsIGlmIHRoZSBzdmMgd2FzIHJhaXNlZCBmcm9tIGFueSBvZgorCQkJCSAqIHRoZSBzeXN0ZW0gY2FsbHMuICovCisJCQkJaWYoIHVsUEMgPj0gKCB1aW50MzJfdCApIF9fc3lzY2FsbHNfZmxhc2hfc3RhcnRfXyAmJgorCQkJCQl1bFBDIDw9ICggdWludDMyX3QgKSBfX3N5c2NhbGxzX2ZsYXNoX2VuZF9fICkKKwkJCQl7CisJCQkJCXZSYWlzZVByaXZpbGVnZSgpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQkjZW5kaWYgLyogY29uZmlnRU5BQkxFX01QVSAqLworCisJCWRlZmF1bHQ6CisJCXsKKwkJCS8qIEluY29ycmVjdCBTVkMgY2FsbC4gKi8KKwkJCWNvbmZpZ0FTU0VSVCggcGRGQUxTRSApOworCQl9CisJfQorfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiggY29uZmlnRU5BQkxFX01QVSA9PSAxICkKKwlTdGFja1R5cGVfdCAqcHhQb3J0SW5pdGlhbGlzZVN0YWNrKCBTdGFja1R5cGVfdCAqcHhUb3BPZlN0YWNrLCBTdGFja1R5cGVfdCAqcHhFbmRPZlN0YWNrLCBUYXNrRnVuY3Rpb25fdCBweENvZGUsIHZvaWQgKnB2UGFyYW1ldGVycywgQmFzZVR5cGVfdCB4UnVuUHJpdmlsZWdlZCApIC8qIFBSSVZJTEVHRURfRlVOQ1RJT04gKi8KKyNlbHNlCisJU3RhY2tUeXBlX3QgKnB4UG9ydEluaXRpYWxpc2VTdGFjayggU3RhY2tUeXBlX3QgKnB4VG9wT2ZTdGFjaywgU3RhY2tUeXBlX3QgKnB4RW5kT2ZTdGFjaywgVGFza0Z1bmN0aW9uX3QgcHhDb2RlLCB2b2lkICpwdlBhcmFtZXRlcnMgKSAvKiBQUklWSUxFR0VEX0ZVTkNUSU9OICovCisjZW5kaWYgLyogY29uZmlnRU5BQkxFX01QVSAqLworeworCS8qIFNpbXVsYXRlIHRoZSBzdGFjayBmcmFtZSBhcyBpdCB3b3VsZCBiZSBjcmVhdGVkIGJ5IGEgY29udGV4dCBzd2l0Y2gKKwkgKiBpbnRlcnJ1cHQuICovCisJI2lmKCBwb3J0UFJFTE9BRF9SRUdJU1RFUlMgPT0gMCApCisJeworCQlweFRvcE9mU3RhY2stLTsgLyogT2Zmc2V0IGFkZGVkIHRvIGFjY291bnQgZm9yIHRoZSB3YXkgdGhlIE1DVSB1c2VzIHRoZSBzdGFjayBvbiBlbnRyeS9leGl0IG9mIGludGVycnVwdHMuICovCisJCSpweFRvcE9mU3RhY2sgPSBwb3J0SU5JVElBTF9YUFNSOwkJCQkJCQkvKiB4UFNSICovCisJCXB4VG9wT2ZTdGFjay0tOworCQkqcHhUb3BPZlN0YWNrID0gKCBTdGFja1R5cGVfdCApIHB4Q29kZTsJCQkJCQkvKiBQQyAqLworCQlweFRvcE9mU3RhY2stLTsKKwkJKnB4VG9wT2ZTdGFjayA9ICggU3RhY2tUeXBlX3QgKSBwb3J0VEFTS19SRVRVUk5fQUREUkVTUzsJLyogTFIgKi8KKwkJcHhUb3BPZlN0YWNrIC09IDU7CQkJCQkJCQkJCQkvKiBSMTIsIFIzLCBSMiBhbmQgUjEuICovCisJCSpweFRvcE9mU3RhY2sgPSAoIFN0YWNrVHlwZV90ICkgcHZQYXJhbWV0ZXJzOwkJCQkvKiBSMCAqLworCQlweFRvcE9mU3RhY2sgLT0gOTsJCQkJCQkJCQkJCS8qIFIxMS4uUjQsIEVYQ19SRVRVUk4uICovCisJCSpweFRvcE9mU3RhY2sgPSBwb3J0SU5JVElBTF9FWENfUkVUVVJOOworCisJCSNpZiggY29uZmlnRU5BQkxFX01QVSA9PSAxICkKKwkJeworCQkJcHhUb3BPZlN0YWNrLS07CisJCQlpZiggeFJ1blByaXZpbGVnZWQgPT0gcGRUUlVFICkKKwkJCXsKKwkJCQkqcHhUb3BPZlN0YWNrID0gcG9ydElOSVRJQUxfQ09OVFJPTF9QUklWSUxFR0VEOwkJLyogU2xvdCB1c2VkIHRvIGhvbGQgdGhpcyB0YXNrJ3MgQ09OVFJPTCB2YWx1ZS4gKi8KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkqcHhUb3BPZlN0YWNrID0gcG9ydElOSVRJQUxfQ09OVFJPTF9VTlBSSVZJTEVHRUQ7CS8qIFNsb3QgdXNlZCB0byBob2xkIHRoaXMgdGFzaydzIENPTlRST0wgdmFsdWUuICovCisJCQl9CisJCX0KKwkJI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9NUFUgKi8KKworCQlweFRvcE9mU3RhY2stLTsKKwkJKnB4VG9wT2ZTdGFjayA9ICggU3RhY2tUeXBlX3QgKSBweEVuZE9mU3RhY2s7CS8qIFNsb3QgdXNlZCB0byBob2xkIHRoaXMgdGFzaydzIFBTUExJTSB2YWx1ZS4gKi8KKworCQkjaWYoIGNvbmZpZ0VOQUJMRV9UUlVTVFpPTkUgPT0gMSApCisJCXsKKwkJCXB4VG9wT2ZTdGFjay0tOworCQkJKnB4VG9wT2ZTdGFjayA9IHBvcnROT19TRUNVUkVfQ09OVEVYVDsJCS8qIFNsb3QgdXNlZCB0byBob2xkIHRoaXMgdGFzaydzIHhTZWN1cmVDb250ZXh0IHZhbHVlLiAqLworCQl9CisJCSNlbmRpZiAvKiBjb25maWdFTkFCTEVfVFJVU1RaT05FICovCisJfQorCSNlbHNlIC8qIHBvcnRQUkVMT0FEX1JFR0lTVEVSUyAqLworCXsKKwkJcHhUb3BPZlN0YWNrLS07IC8qIE9mZnNldCBhZGRlZCB0byBhY2NvdW50IGZvciB0aGUgd2F5IHRoZSBNQ1UgdXNlcyB0aGUgc3RhY2sgb24gZW50cnkvZXhpdCBvZiBpbnRlcnJ1cHRzLiAqLworCQkqcHhUb3BPZlN0YWNrID0gcG9ydElOSVRJQUxfWFBTUjsJCQkJCQkJLyogeFBTUiAqLworCQlweFRvcE9mU3RhY2stLTsKKwkJKnB4VG9wT2ZTdGFjayA9ICggU3RhY2tUeXBlX3QgKSBweENvZGU7CQkJCQkJLyogUEMgKi8KKwkJcHhUb3BPZlN0YWNrLS07CisJCSpweFRvcE9mU3RhY2sgPSAoIFN0YWNrVHlwZV90ICkgcG9ydFRBU0tfUkVUVVJOX0FERFJFU1M7CS8qIExSICovCisJCXB4VG9wT2ZTdGFjay0tOworCQkqcHhUb3BPZlN0YWNrID0gKCBTdGFja1R5cGVfdCApIDB4MTIxMjEyMTJVTDsJCQkJLyogUjEyICovCisJCXB4VG9wT2ZTdGFjay0tOworCQkqcHhUb3BPZlN0YWNrID0gKCBTdGFja1R5cGVfdCApIDB4MDMwMzAzMDNVTDsJCQkJLyogUjMgKi8KKwkJcHhUb3BPZlN0YWNrLS07CisJCSpweFRvcE9mU3RhY2sgPSAoIFN0YWNrVHlwZV90ICkgMHgwMjAyMDIwMlVMOwkJCQkvKiBSMiAqLworCQlweFRvcE9mU3RhY2stLTsKKwkJKnB4VG9wT2ZTdGFjayA9ICggU3RhY2tUeXBlX3QgKSAweDAxMDEwMTAxVUw7CQkJCS8qIFIxICovCisJCXB4VG9wT2ZTdGFjay0tOworCQkqcHhUb3BPZlN0YWNrID0gKCBTdGFja1R5cGVfdCApIHB2UGFyYW1ldGVyczsJCQkJLyogUjAgKi8KKwkJcHhUb3BPZlN0YWNrLS07CisJCSpweFRvcE9mU3RhY2sgPSAoIFN0YWNrVHlwZV90ICkgMHgxMTExMTExMVVMOwkJCQkvKiBSMTEgKi8KKwkJcHhUb3BPZlN0YWNrLS07CisJCSpweFRvcE9mU3RhY2sgPSAoIFN0YWNrVHlwZV90ICkgMHgxMDEwMTAxMFVMOwkJCQkvKiBSMTAgKi8KKwkJcHhUb3BPZlN0YWNrLS07CisJCSpweFRvcE9mU3RhY2sgPSAoIFN0YWNrVHlwZV90ICkgMHgwOTA5MDkwOVVMOwkJCQkvKiBSMDkgKi8KKwkJcHhUb3BPZlN0YWNrLS07CisJCSpweFRvcE9mU3RhY2sgPSAoIFN0YWNrVHlwZV90ICkgMHgwODA4MDgwOFVMOwkJCQkvKiBSMDggKi8KKwkJcHhUb3BPZlN0YWNrLS07CisJCSpweFRvcE9mU3RhY2sgPSAoIFN0YWNrVHlwZV90ICkgMHgwNzA3MDcwN1VMOwkJCQkvKiBSMDcgKi8KKwkJcHhUb3BPZlN0YWNrLS07CisJCSpweFRvcE9mU3RhY2sgPSAoIFN0YWNrVHlwZV90ICkgMHgwNjA2MDYwNlVMOwkJCQkvKiBSMDYgKi8KKwkJcHhUb3BPZlN0YWNrLS07CisJCSpweFRvcE9mU3RhY2sgPSAoIFN0YWNrVHlwZV90ICkgMHgwNTA1MDUwNVVMOwkJCQkvKiBSMDUgKi8KKwkJcHhUb3BPZlN0YWNrLS07CisJCSpweFRvcE9mU3RhY2sgPSAoIFN0YWNrVHlwZV90ICkgMHgwNDA0MDQwNFVMOwkJCQkvKiBSMDQgKi8KKwkJcHhUb3BPZlN0YWNrLS07CisJCSpweFRvcE9mU3RhY2sgPSBwb3J0SU5JVElBTF9FWENfUkVUVVJOOwkJCQkJCS8qIEVYQ19SRVRVUk4gKi8KKworCQkjaWYoIGNvbmZpZ0VOQUJMRV9NUFUgPT0gMSApCisJCXsKKwkJCXB4VG9wT2ZTdGFjay0tOworCQkJaWYoIHhSdW5Qcml2aWxlZ2VkID09IHBkVFJVRSApCisJCQl7CisJCQkJKnB4VG9wT2ZTdGFjayA9IHBvcnRJTklUSUFMX0NPTlRST0xfUFJJVklMRUdFRDsJCS8qIFNsb3QgdXNlZCB0byBob2xkIHRoaXMgdGFzaydzIENPTlRST0wgdmFsdWUuICovCisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJKnB4VG9wT2ZTdGFjayA9IHBvcnRJTklUSUFMX0NPTlRST0xfVU5QUklWSUxFR0VEOwkvKiBTbG90IHVzZWQgdG8gaG9sZCB0aGlzIHRhc2sncyBDT05UUk9MIHZhbHVlLiAqLworCQkJfQorCQl9CisJCSNlbmRpZiAvKiBjb25maWdFTkFCTEVfTVBVICovCisKKwkJcHhUb3BPZlN0YWNrLS07CisJCSpweFRvcE9mU3RhY2sgPSAoIFN0YWNrVHlwZV90ICkgcHhFbmRPZlN0YWNrOwkvKiBTbG90IHVzZWQgdG8gaG9sZCB0aGlzIHRhc2sncyBQU1BMSU0gdmFsdWUuICovCisKKwkJI2lmKCBjb25maWdFTkFCTEVfVFJVU1RaT05FID09IDEgKQorCQl7CisJCQlweFRvcE9mU3RhY2stLTsKKwkJCSpweFRvcE9mU3RhY2sgPSBwb3J0Tk9fU0VDVVJFX0NPTlRFWFQ7CQkvKiBTbG90IHVzZWQgdG8gaG9sZCB0aGlzIHRhc2sncyB4U2VjdXJlQ29udGV4dCB2YWx1ZS4gKi8KKwkJfQorCQkjZW5kaWYgLyogY29uZmlnRU5BQkxFX1RSVVNUWk9ORSAqLworCX0KKwkjZW5kaWYgLyogcG9ydFBSRUxPQURfUkVHSVNURVJTICovCisKKwlyZXR1cm4gcHhUb3BPZlN0YWNrOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK0Jhc2VUeXBlX3QgeFBvcnRTdGFydFNjaGVkdWxlciggdm9pZCApIC8qIFBSSVZJTEVHRURfRlVOQ1RJT04gKi8KK3sKKwkvKiBNYWtlIFBlbmRTViwgQ2FsbFNWIGFuZCBTeXNUaWNrIHRoZSBzYW1lIHByaW9yaXR5IGFzIHRoZSBrZXJuZWwuICovCisJKiggcG9ydE5WSUNfU1lTUFJJMiApIHw9IHBvcnROVklDX1BFTkRTVl9QUkk7CisJKiggcG9ydE5WSUNfU1lTUFJJMiApIHw9IHBvcnROVklDX1NZU1RJQ0tfUFJJOworCisJI2lmKCBjb25maWdFTkFCTEVfTVBVID09IDEgKQorCXsKKwkJLyogU2V0dXAgdGhlIE1lbW9yeSBQcm90ZWN0aW9uIFVuaXQgKE1QVSkuICovCisJCXBydlNldHVwTVBVKCk7CisJfQorCSNlbmRpZiAvKiBjb25maWdFTkFCTEVfTVBVICovCisKKwkvKiBTdGFydCB0aGUgdGltZXIgdGhhdCBnZW5lcmF0ZXMgdGhlIHRpY2sgSVNSLiBJbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZAorCSAqIGhlcmUgYWxyZWFkeS4gKi8KKwlwcnZTZXR1cFRpbWVySW50ZXJydXB0KCk7CisKKwkvKiBJbml0aWFsaXplIHRoZSBjcml0aWNhbCBuZXN0aW5nIGNvdW50IHJlYWR5IGZvciB0aGUgZmlyc3QgdGFzay4gKi8KKwl1bENyaXRpY2FsTmVzdGluZyA9IDA7CisKKwkvKiBTdGFydCB0aGUgZmlyc3QgdGFzay4gKi8KKwl2U3RhcnRGaXJzdFRhc2soKTsKKworCS8qIFNob3VsZCBuZXZlciBnZXQgaGVyZSBhcyB0aGUgdGFza3Mgd2lsbCBub3cgYmUgZXhlY3V0aW5nLiBDYWxsIHRoZSB0YXNrCisJICogZXhpdCBlcnJvciBmdW5jdGlvbiB0byBwcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzIGFib3V0IGEgc3RhdGljIGZ1bmN0aW9uCisJICogbm90IGJlaW5nIGNhbGxlZCBpbiB0aGUgY2FzZSB0aGF0IHRoZSBhcHBsaWNhdGlvbiB3cml0ZXIgb3ZlcnJpZGVzIHRoaXMKKwkgKiBmdW5jdGlvbmFsaXR5IGJ5IGRlZmluaW5nIGNvbmZpZ1RBU0tfUkVUVVJOX0FERFJFU1MuIENhbGwKKwkgKiB2VGFza1N3aXRjaENvbnRleHQoKSBzbyBsaW5rIHRpbWUgb3B0aW1pemF0aW9uIGRvZXMgbm90IHJlbW92ZSB0aGUKKwkgKiBzeW1ib2wuICovCisJdlRhc2tTd2l0Y2hDb250ZXh0KCk7CisJcHJ2VGFza0V4aXRFcnJvcigpOworCisJLyogU2hvdWxkIG5vdCBnZXQgaGVyZS4gKi8KKwlyZXR1cm4gMDsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIHZQb3J0RW5kU2NoZWR1bGVyKCB2b2lkICkgLyogUFJJVklMRUdFRF9GVU5DVElPTiAqLworeworCS8qIE5vdCBpbXBsZW1lbnRlZCBpbiBwb3J0cyB3aGVyZSB0aGVyZSBpcyBub3RoaW5nIHRvIHJldHVybiB0by4KKwkgKiBBcnRpZmljaWFsbHkgZm9yY2UgYW4gYXNzZXJ0LiAqLworCWNvbmZpZ0FTU0VSVCggdWxDcml0aWNhbE5lc3RpbmcgPT0gMTAwMFVMICk7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmKCBjb25maWdFTkFCTEVfTVBVID09IDEgKQorCXZvaWQgdlBvcnRTdG9yZVRhc2tNUFVTZXR0aW5ncyggeE1QVV9TRVRUSU5HUyAqeE1QVVNldHRpbmdzLCBjb25zdCBzdHJ1Y3QgeE1FTU9SWV9SRUdJT04gKiBjb25zdCB4UmVnaW9ucywgU3RhY2tUeXBlX3QgKnB4Qm90dG9tT2ZTdGFjaywgdWludDMyX3QgdWxTdGFja0RlcHRoICkKKwl7CisJdWludDMyX3QgdWxSZWdpb25TdGFydEFkZHJlc3MsIHVsUmVnaW9uRW5kQWRkcmVzcywgdWxSZWdpb25OdW1iZXI7CisJaW50MzJfdCBsSW5kZXggPSAwOworCisJCS8qIFNldHVwIE1BSVIwLiAqLworCQl4TVBVU2V0dGluZ3MtPnVsTUFJUjAgPSAoICggcG9ydE1QVV9OT1JNQUxfTUVNT1JZX0JVRkZFUkFCTEVfQ0FDSEVBQkxFIDw8IHBvcnRNUFVfTUFJUl9BVFRSMF9QT1MgKSAmIHBvcnRNUFVfTUFJUl9BVFRSMF9NQVNLICk7CisJCXhNUFVTZXR0aW5ncy0+dWxNQUlSMCB8PSAoICggcG9ydE1QVV9ERVZJQ0VfTUVNT1JZX25HblJFIDw8IHBvcnRNUFVfTUFJUl9BVFRSMV9QT1MgKSAmIHBvcnRNUFVfTUFJUl9BVFRSMV9NQVNLICk7CisKKwkJLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYXV0b21hdGljYWxseSB3aGVuIHRoZSB0YXNrIGlzIGNyZWF0ZWQgLSBpbgorCQkgKiB3aGljaCBjYXNlIHRoZSBzdGFjayByZWdpb24gcGFyYW1ldGVycyB3aWxsIGJlIHZhbGlkLiAgQXQgYWxsIG90aGVyCisJCSAqIHRpbWVzIHRoZSBzdGFjayBwYXJhbWV0ZXJzIHdpbGwgbm90IGJlIHZhbGlkIGFuZCBpdCBpcyBhc3N1bWVkIHRoYXQKKwkJICogdGhlIHN0YWNrIHJlZ2lvbiBoYXMgYWxyZWFkeSBiZWVuIGNvbmZpZ3VyZWQuICovCisJCWlmKCB1bFN0YWNrRGVwdGggPiAwICkKKwkJeworCQkJLyogRGVmaW5lIHRoZSByZWdpb24gdGhhdCBhbGxvd3MgYWNjZXNzIHRvIHRoZSBzdGFjay4gKi8KKwkJCXVsUmVnaW9uU3RhcnRBZGRyZXNzID0gKCAoIHVpbnQzMl90ICkgcHhCb3R0b21PZlN0YWNrICkgJiBwb3J0TVBVX1JCQVJfQUREUkVTU19NQVNLOworCQkJdWxSZWdpb25FbmRBZGRyZXNzID0gKCB1aW50MzJfdCApIHB4Qm90dG9tT2ZTdGFjayArICggdWxTdGFja0RlcHRoICogKCB1aW50MzJfdCApIHNpemVvZiggU3RhY2tUeXBlX3QgKSApIC0gMTsKKwkJCXVsUmVnaW9uRW5kQWRkcmVzcyAgJj0gcG9ydE1QVV9STEFSX0FERFJFU1NfTUFTSzsKKworCQkJeE1QVVNldHRpbmdzLT54UmVnaW9uc1NldHRpbmdzWyAwIF0udWxSQkFSID0JKCB1bFJlZ2lvblN0YXJ0QWRkcmVzcyApIHwKKwkJCQkJCQkJCQkJCQkJCSggcG9ydE1QVV9SRUdJT05fTk9OX1NIQVJFQUJMRSApIHwKKwkJCQkJCQkJCQkJCQkJCSggcG9ydE1QVV9SRUdJT05fUkVBRF9XUklURSApIHwKKwkJCQkJCQkJCQkJCQkJCSggcG9ydE1QVV9SRUdJT05fRVhFQ1VURV9ORVZFUiApOworCisJCQl4TVBVU2V0dGluZ3MtPnhSZWdpb25zU2V0dGluZ3NbIDAgXS51bFJMQVIgPQkoIHVsUmVnaW9uRW5kQWRkcmVzcyApIHwKKwkJCQkJCQkJCQkJCQkJCSggcG9ydE1QVV9STEFSX0FUVFJfSU5ERVgwICkgfAorCQkJCQkJCQkJCQkJCQkJKCBwb3J0TVBVX1JMQVJfUkVHSU9OX0VOQUJMRSApOworCQl9CisKKwkJLyogVXNlciBzdXBwbGllZCBjb25maWd1cmFibGUgcmVnaW9ucy4gKi8KKwkJZm9yKCB1bFJlZ2lvbk51bWJlciA9IDE7IHVsUmVnaW9uTnVtYmVyIDw9IHBvcnROVU1fQ09ORklHVVJBQkxFX1JFR0lPTlM7IHVsUmVnaW9uTnVtYmVyKysgKQorCQl7CisJCQkvKiBJZiB4UmVnaW9ucyBpcyBOVUxMIGkuZS4gdGhlIHRhc2sgaGFzIG5vdCBzcGVjaWZpZWQgYW55IE1QVQorCQkJICogcmVnaW9uLCB0aGUgZWxzZSBwYXJ0IGVuc3VyZXMgdGhhdCBhbGwgdGhlIGNvbmZpZ3VyYWJsZSBNUFUKKwkJCSAqIHJlZ2lvbnMgYXJlIGludmFsaWRhdGVkLiAqLworCQkJaWYoICggeFJlZ2lvbnMgIT0gTlVMTCApICYmICggeFJlZ2lvbnNbIGxJbmRleCBdLnVsTGVuZ3RoSW5CeXRlcyA+IDBVTCApICkKKwkJCXsKKwkJCQkvKiBUcmFuc2xhdGUgdGhlIGdlbmVyaWMgcmVnaW9uIGRlZmluaXRpb24gY29udGFpbmVkIGluIHhSZWdpb25zCisJCQkJICogaW50byB0aGUgQVJNdjggc3BlY2lmaWMgTVBVIHNldHRpbmdzIHRoYXQgYXJlIHRoZW4gc3RvcmVkIGluCisJCQkJICogeE1QVVNldHRpbmdzLiAqLworCQkJCXVsUmVnaW9uU3RhcnRBZGRyZXNzID0gKCAoIHVpbnQzMl90ICkgeFJlZ2lvbnNbIGxJbmRleCBdLnB2QmFzZUFkZHJlc3MgKSAmIHBvcnRNUFVfUkJBUl9BRERSRVNTX01BU0s7CisJCQkJdWxSZWdpb25FbmRBZGRyZXNzID0gKCB1aW50MzJfdCApIHhSZWdpb25zWyBsSW5kZXggXS5wdkJhc2VBZGRyZXNzICsgeFJlZ2lvbnNbIGxJbmRleCBdLnVsTGVuZ3RoSW5CeXRlcyAtIDE7CisJCQkJdWxSZWdpb25FbmRBZGRyZXNzICAmPSBwb3J0TVBVX1JMQVJfQUREUkVTU19NQVNLOworCisJCQkJLyogU3RhcnQgYWRkcmVzcy4gKi8KKwkJCQl4TVBVU2V0dGluZ3MtPnhSZWdpb25zU2V0dGluZ3NbIHVsUmVnaW9uTnVtYmVyIF0udWxSQkFSID0JKCB1bFJlZ2lvblN0YXJ0QWRkcmVzcyApIHwKKwkJCQkJCQkJCQkJCQkJCQkJCQkoIHBvcnRNUFVfUkVHSU9OX05PTl9TSEFSRUFCTEUgKTsKKworCQkJCS8qIFJPL1JXLiAqLworCQkJCWlmKCAoIHhSZWdpb25zWyBsSW5kZXggXS51bFBhcmFtZXRlcnMgJiB0c2tNUFVfUkVHSU9OX1JFQURfT05MWSApICE9IDAgKQorCQkJCXsKKwkJCQkJeE1QVVNldHRpbmdzLT54UmVnaW9uc1NldHRpbmdzWyB1bFJlZ2lvbk51bWJlciBdLnVsUkJBUiB8PSAoIHBvcnRNUFVfUkVHSU9OX1JFQURfT05MWSApOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQl4TVBVU2V0dGluZ3MtPnhSZWdpb25zU2V0dGluZ3NbIHVsUmVnaW9uTnVtYmVyIF0udWxSQkFSIHw9ICggcG9ydE1QVV9SRUdJT05fUkVBRF9XUklURSApOworCQkJCX0KKworCQkJCS8qIFhOLiAqLworCQkJCWlmKCAoIHhSZWdpb25zWyBsSW5kZXggXS51bFBhcmFtZXRlcnMgJiB0c2tNUFVfUkVHSU9OX0VYRUNVVEVfTkVWRVIgKSAhPSAwICkKKwkJCQl7CisJCQkJCXhNUFVTZXR0aW5ncy0+eFJlZ2lvbnNTZXR0aW5nc1sgdWxSZWdpb25OdW1iZXIgXS51bFJCQVIgfD0gKCBwb3J0TVBVX1JFR0lPTl9FWEVDVVRFX05FVkVSICk7CisJCQkJfQorCisJCQkJLyogRW5kIEFkZHJlc3MuICovCisJCQkJeE1QVVNldHRpbmdzLT54UmVnaW9uc1NldHRpbmdzWyB1bFJlZ2lvbk51bWJlciBdLnVsUkxBUiA9CSggdWxSZWdpb25FbmRBZGRyZXNzICkgfAorCQkJCQkJCQkJCQkJCQkJCQkJCSggcG9ydE1QVV9STEFSX1JFR0lPTl9FTkFCTEUgKTsKKworCQkJCS8qIE5vcm1hbCBtZW1vcnkvIERldmljZSBtZW1vcnkuICovCisJCQkJaWYoICggeFJlZ2lvbnNbIGxJbmRleCBdLnVsUGFyYW1ldGVycyAmIHRza01QVV9SRUdJT05fREVWSUNFX01FTU9SWSApICE9IDAgKQorCQkJCXsKKwkJCQkJLyogQXR0cjEgaW4gTUFJUjAgaXMgY29uZmlndXJlZCBhcyBkZXZpY2UgbWVtb3J5LiAqLworCQkJCQl4TVBVU2V0dGluZ3MtPnhSZWdpb25zU2V0dGluZ3NbIHVsUmVnaW9uTnVtYmVyIF0udWxSTEFSIHw9IHBvcnRNUFVfUkxBUl9BVFRSX0lOREVYMTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJLyogQXR0cjEgaW4gTUFJUjAgaXMgY29uZmlndXJlZCBhcyBub3JtYWwgbWVtb3J5LiAqLworCQkJCQl4TVBVU2V0dGluZ3MtPnhSZWdpb25zU2V0dGluZ3NbIHVsUmVnaW9uTnVtYmVyIF0udWxSTEFSIHw9IHBvcnRNUFVfUkxBUl9BVFRSX0lOREVYMDsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLyogSW52YWxpZGF0ZSB0aGUgcmVnaW9uLiAqLworCQkJCXhNUFVTZXR0aW5ncy0+eFJlZ2lvbnNTZXR0aW5nc1sgdWxSZWdpb25OdW1iZXIgXS51bFJCQVIgPSAwVUw7CisJCQkJeE1QVVNldHRpbmdzLT54UmVnaW9uc1NldHRpbmdzWyB1bFJlZ2lvbk51bWJlciBdLnVsUkxBUiA9IDBVTDsKKwkJCX0KKworCQkJbEluZGV4Kys7CisJCX0KKwl9CisjZW5kaWYgLyogY29uZmlnRU5BQkxFX01QVSAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCmRpZmYgLS1naXQgYS9Tb3VyY2UvcG9ydGFibGUvR0NDL0FSTV9DTTIzX05UWi9ub25fc2VjdXJlL3BvcnRhc20uYyBiL1NvdXJjZS9wb3J0YWJsZS9HQ0MvQVJNX0NNMjNfTlRaL25vbl9zZWN1cmUvcG9ydGFzbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViOGU2MDQKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvcG9ydGFibGUvR0NDL0FSTV9DTTIzX05UWi9ub25fc2VjdXJlL3BvcnRhc20uYwpAQCAtMCwwICsxLDM4MSBAQAorLyoKKyAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMi4xCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgorICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KKyAqIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KKyAqIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mCisgKiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCisgKiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKKyAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTCisgKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IKKyAqIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUgorICogSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogaHR0cDovL3d3dy5GcmVlUlRPUy5vcmcKKyAqIGh0dHA6Ly9hd3MuYW1hem9uLmNvbS9mcmVlcnRvcworICoKKyAqIDEgdGFiID09IDQgc3BhY2VzIQorICovCisKKy8qIFN0YW5kYXJkIGluY2x1ZGVzLiAqLworI2luY2x1ZGUgPHN0ZGludC5oPgorCisvKiBEZWZpbmluZyBNUFVfV1JBUFBFUlNfSU5DTFVERURfRlJPTV9BUElfRklMRSBlbnN1cmVzIHRoYXQgUFJJVklMRUdFRF9GVU5DVElPTgorICogaXMgZGVmaW5lZCBjb3JyZWN0bHkgYW5kIHByaXZpbGVnZWQgZnVuY3Rpb25zIGFyZSBwbGFjZWQgaW4gY29ycmVjdCBzZWN0aW9ucy4gKi8KKyNkZWZpbmUgTVBVX1dSQVBQRVJTX0lOQ0xVREVEX0ZST01fQVBJX0ZJTEUKKworLyogUG9ydGFzbSBpbmNsdWRlcy4gKi8KKyNpbmNsdWRlICJwb3J0YXNtLmgiCisKKy8qIE1QVV9XUkFQUEVSU19JTkNMVURFRF9GUk9NX0FQSV9GSUxFIGlzIG5lZWRlZCB0byBiZSBkZWZpbmVkIG9ubHkgZm9yIHRoZQorICogaGVhZGVyIGZpbGVzLiAqLworI3VuZGVmIE1QVV9XUkFQUEVSU19JTkNMVURFRF9GUk9NX0FQSV9GSUxFCisKKyNpZiggY29uZmlnRU5BQkxFX0ZQVSA9PSAxICkKKwkjZXJyb3IgQ29ydGV4LU0yMyBkb2VzIG5vdCBoYXZlIGEgRmxvYXRpbmcgUG9pbnQgVW5pdCAoRlBVKSBhbmQgdGhlcmVmb3JlIGNvbmZpZ0VOQUJMRV9GUFUgbXVzdCBiZSBzZXQgdG8gMC4KKyNlbmRpZgorCit2b2lkIHZSZXN0b3JlQ29udGV4dE9mRmlyc3RUYXNrKCB2b2lkICkgLyogX19hdHRyaWJ1dGVfXyAoKCBuYWtlZCApKSBQUklWSUxFR0VEX0ZVTkNUSU9OICovCit7CisJX19hc20gdm9sYXRpbGUKKwkoCisJIgkuc3ludGF4IHVuaWZpZWQJCQkJCQkJCQlcbiIKKwkiCQkJCQkJCQkJCQkJCVxuIgorCSIJbGRyICByMiwgcHhDdXJyZW50VENCQ29uc3QyCQkJCQkJXG4iIC8qIFJlYWQgdGhlIGxvY2F0aW9uIG9mIHB4Q3VycmVudFRDQiBpLmUuICYoIHB4Q3VycmVudFRDQiApLiAqLworCSIJbGRyICByMSwgW3IyXQkJCQkJCQkJCVxuIiAvKiBSZWFkIHB4Q3VycmVudFRDQi4gKi8KKwkiCWxkciAgcjAsIFtyMV0JCQkJCQkJCQlcbiIgLyogUmVhZCB0b3Agb2Ygc3RhY2sgZnJvbSBUQ0IgLSBUaGUgZmlyc3QgaXRlbSBpbiBweEN1cnJlbnRUQ0IgaXMgdGhlIHRhc2sgdG9wIG9mIHN0YWNrLiAqLworCSIJCQkJCQkJCQkJCQkJXG4iCisJI2lmKCBjb25maWdFTkFCTEVfTVBVID09IDEgKQorCSIJZG1iCQkJCQkJCQkJCQkJXG4iIC8qIENvbXBsZXRlIG91dHN0YW5kaW5nIHRyYW5zZmVycyBiZWZvcmUgZGlzYWJsaW5nIE1QVS4gKi8KKwkiCWxkciByMiwgeE1QVUNUUkxDb25zdDIJCQkJCQkJXG4iIC8qIHIyID0gMHhlMDAwZWQ5NCBbTG9jYXRpb24gb2YgTVBVX0NUUkxdLiAqLworCSIJbGRyIHIzLCBbcjJdCQkJCQkJCQkJXG4iIC8qIFJlYWQgdGhlIHZhbHVlIG9mIE1QVV9DVFJMLiAqLworCSIJbW92cyByNCwgIzEJCQkJCQkJCQkJXG4iIC8qIHI0ID0gMS4gKi8KKwkiCWJpY3MgcjMsIHI0CQkJCQkJCQkJCVxuIiAvKiByMyA9IHIzICYgfnI0IGkuZS4gQ2xlYXIgdGhlIGJpdCAwIGluIHIzLiAqLworCSIJc3RyIHIzLCBbcjJdCQkJCQkJCQkJXG4iIC8qIERpc2FibGUgTVBVLiAqLworCSIJCQkJCQkJCQkJCQkJXG4iCisJIglhZGRzIHIxLCAjNAkJCQkJCQkJCQlcbiIgLyogcjEgPSByMSArIDQuIHIxIG5vdyBwb2ludHMgdG8gTUFJUjAgaW4gVENCLiAqLworCSIJbGRyICByNCwgW3IxXQkJCQkJCQkJCVxuIiAvKiByNCA9ICpyMSBpLmUuIHI0ID0gTUFJUjAuICovCisJIglsZHIgIHIyLCB4TUFJUjBDb25zdDIJCQkJCQkJXG4iIC8qIHIyID0gMHhlMDAwZWRjMCBbTG9jYXRpb24gb2YgTUFJUjBdLiAqLworCSIJc3RyICByNCwgW3IyXQkJCQkJCQkJCVxuIiAvKiBQcm9ncmFtIE1BSVIwLiAqLworCSIJbGRyICByMiwgeFJOUkNvbnN0MgkJCQkJCQkJXG4iIC8qIHIyID0gMHhlMDAwZWQ5OCBbTG9jYXRpb24gb2YgUk5SXS4gKi8KKwkiCWFkZHMgcjEsICM0CQkJCQkJCQkJCVxuIiAvKiByMSA9IHIxICsgNC4gcjEgbm93IHBvaW50cyB0byBmaXJzdCBSQkFSIGluIFRDQi4gKi8KKwkiCW1vdnMgcjQsICM0CQkJCQkJCQkJCVxuIiAvKiByNCA9IDQuICovCisJIglzdHIgIHI0LCBbcjJdCQkJCQkJCQkJXG4iIC8qIFByb2dyYW0gUk5SID0gNC4gKi8KKwkiCWxkbWlhIHIxISwge3I1LHI2fQkJCQkJCQkJXG4iIC8qIFJlYWQgZmlyc3Qgc2V0IG9mIFJCQVIvUkxBUiBmcm9tIFRDQi4gKi8KKwkiCWxkciAgcjMsIHhSQkFSQ29uc3QyCQkJCQkJCVxuIiAvKiByMyA9IDB4ZTAwMGVkOWMgW0xvY2F0aW9uIG9mIFJCQVJdLiAqLworCSIJc3RtaWEgcjMhLCB7cjUscjZ9CQkJCQkJCQlcbiIgLyogV3JpdGUgZmlyc3Qgc2V0IG9mIFJCQVIvUkxBUiByZWdpc3RlcnMuICovCisJIgltb3ZzIHI0LCAjNQkJCQkJCQkJCQlcbiIgLyogcjQgPSA1LiAqLworCSIJc3RyICByNCwgW3IyXQkJCQkJCQkJCVxuIiAvKiBQcm9ncmFtIFJOUiA9IDUuICovCisJIglsZG1pYSByMSEsIHtyNSxyNn0JCQkJCQkJCVxuIiAvKiBSZWFkIHNlY29uZCBzZXQgb2YgUkJBUi9STEFSIGZyb20gVENCLiAqLworCSIJbGRyICByMywgeFJCQVJDb25zdDIJCQkJCQkJXG4iIC8qIHIzID0gMHhlMDAwZWQ5YyBbTG9jYXRpb24gb2YgUkJBUl0uICovCisJIglzdG1pYSByMyEsIHtyNSxyNn0JCQkJCQkJCVxuIiAvKiBXcml0ZSBzZWNvbmQgc2V0IG9mIFJCQVIvUkxBUiByZWdpc3RlcnMuICovCisJIgltb3ZzIHI0LCAjNgkJCQkJCQkJCQlcbiIgLyogcjQgPSA2LiAqLworCSIJc3RyICByNCwgW3IyXQkJCQkJCQkJCVxuIiAvKiBQcm9ncmFtIFJOUiA9IDYuICovCisJIglsZG1pYSByMSEsIHtyNSxyNn0JCQkJCQkJCVxuIiAvKiBSZWFkIHRoaXJkIHNldCBvZiBSQkFSL1JMQVIgZnJvbSBUQ0IuICovCisJIglsZHIgIHIzLCB4UkJBUkNvbnN0MgkJCQkJCQlcbiIgLyogcjMgPSAweGUwMDBlZDljIFtMb2NhdGlvbiBvZiBSQkFSXS4gKi8KKwkiCXN0bWlhIHIzISwge3I1LHI2fQkJCQkJCQkJXG4iIC8qIFdyaXRlIHRoaXJkIHNldCBvZiBSQkFSL1JMQVIgcmVnaXN0ZXJzLiAqLworCSIJbW92cyByNCwgIzcJCQkJCQkJCQkJXG4iIC8qIHI0ID0gNy4gKi8KKwkiCXN0ciAgcjQsIFtyMl0JCQkJCQkJCQlcbiIgLyogUHJvZ3JhbSBSTlIgPSA3LiAqLworCSIJbGRtaWEgcjEhLCB7cjUscjZ9CQkJCQkJCQlcbiIgLyogUmVhZCBmb3VydGggc2V0IG9mIFJCQVIvUkxBUiBmcm9tIFRDQi4gKi8KKwkiCWxkciAgcjMsIHhSQkFSQ29uc3QyCQkJCQkJCVxuIiAvKiByMyA9IDB4ZTAwMGVkOWMgW0xvY2F0aW9uIG9mIFJCQVJdLiAqLworCSIJc3RtaWEgcjMhLCB7cjUscjZ9CQkJCQkJCQlcbiIgLyogV3JpdGUgZm91cnRoIHNldCBvZiBSQkFSL1JMQVIgcmVnaXN0ZXJzLiAqLworCSIJCQkJCQkJCQkJCQkJXG4iCisJIglsZHIgcjIsIHhNUFVDVFJMQ29uc3QyCQkJCQkJCVxuIiAvKiByMiA9IDB4ZTAwMGVkOTQgW0xvY2F0aW9uIG9mIE1QVV9DVFJMXS4gKi8KKwkiCWxkciByMywgW3IyXQkJCQkJCQkJCVxuIiAvKiBSZWFkIHRoZSB2YWx1ZSBvZiBNUFVfQ1RSTC4gKi8KKwkiCW1vdnMgcjQsICMxCQkJCQkJCQkJCVxuIiAvKiByNCA9IDEuICovCisJIglvcnJzIHIzLCByNAkJCQkJCQkJCQlcbiIgLyogcjMgPSByMyB8IHI0IGkuZS4gU2V0IHRoZSBiaXQgMCBpbiByMy4gKi8KKwkiCXN0ciByMywgW3IyXQkJCQkJCQkJCVxuIiAvKiBFbmFibGUgTVBVLiAqLworCSIJZHNiCQkJCQkJCQkJCQkJXG4iIC8qIEZvcmNlIG1lbW9yeSB3cml0ZXMgYmVmb3JlIGNvbnRpbnVpbmcuICovCisJI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9NUFUgKi8KKwkiCQkJCQkJCQkJCQkJCVxuIgorCSNpZiggY29uZmlnRU5BQkxFX01QVSA9PSAxICkKKwkiCWxkbSAgcjAhLCB7cjEtcjN9CQkJCQkJCQlcbiIgLyogUmVhZCBmcm9tIHN0YWNrIC0gcjEgPSBQU1BMSU0sIHIyID0gQ09OVFJPTCBhbmQgcjMgPSBFWENfUkVUVVJOLiAqLworCSIJbXNyICBwc3BsaW0sIHIxCQkJCQkJCQkJXG4iIC8qIFNldCB0aGlzIHRhc2sncyBQU1BMSU0gdmFsdWUuICovCisJIgltc3IgIGNvbnRyb2wsIHIyCQkJCQkJCQlcbiIgLyogU2V0IHRoaXMgdGFzaydzIENPTlRST0wgdmFsdWUuICovCisJIglhZGRzIHIwLCAjMzIJCQkJCQkJCQlcbiIgLyogRGlzY2FyZCBldmVyeXRoaW5nIHVwIHRvIHIwLiAqLworCSIJbXNyICBwc3AsIHIwCQkJCQkJCQkJXG4iIC8qIFRoaXMgaXMgbm93IHRoZSBuZXcgdG9wIG9mIHN0YWNrIHRvIHVzZSBpbiB0aGUgdGFzay4gKi8KKwkiCWlzYgkJCQkJCQkJCQkJCVxuIgorCSIJYnggICByMwkJCQkJCQkJCQkJXG4iIC8qIEZpbmFsbHksIGJyYW5jaCB0byBFWENfUkVUVVJOLiAqLworCSNlbHNlIC8qIGNvbmZpZ0VOQUJMRV9NUFUgKi8KKwkiCWxkbSAgcjAhLCB7cjEtcjJ9CQkJCQkJCQlcbiIgLyogUmVhZCBmcm9tIHN0YWNrIC0gcjEgPSBQU1BMSU0gYW5kIHIyID0gRVhDX1JFVFVSTi4gKi8KKwkiCW1zciAgcHNwbGltLCByMQkJCQkJCQkJCVxuIiAvKiBTZXQgdGhpcyB0YXNrJ3MgUFNQTElNIHZhbHVlLiAqLworCSIJbW92cyByMSwgIzIJCQkJCQkJCQkJXG4iIC8qIHIxID0gMi4gKi8KKwkiCW1zciAgQ09OVFJPTCwgcjEJCQkJCQkJCVxuIiAvKiBTd2l0Y2ggdG8gdXNlIFBTUCBpbiB0aGUgdGhyZWFkIG1vZGUuICovCisJIglhZGRzIHIwLCAjMzIJCQkJCQkJCQlcbiIgLyogRGlzY2FyZCBldmVyeXRoaW5nIHVwIHRvIHIwLiAqLworCSIJbXNyICBwc3AsIHIwCQkJCQkJCQkJXG4iIC8qIFRoaXMgaXMgbm93IHRoZSBuZXcgdG9wIG9mIHN0YWNrIHRvIHVzZSBpbiB0aGUgdGFzay4gKi8KKwkiCWlzYgkJCQkJCQkJCQkJCVxuIgorCSIJYnggICByMgkJCQkJCQkJCQkJXG4iIC8qIEZpbmFsbHksIGJyYW5jaCB0byBFWENfUkVUVVJOLiAqLworCSNlbmRpZiAvKiBjb25maWdFTkFCTEVfTVBVICovCisJIgkJCQkJCQkJCQkJCQlcbiIKKwkiCS5hbGlnbiA0CQkJCQkJCQkJCVxuIgorCSJweEN1cnJlbnRUQ0JDb25zdDI6IC53b3JkIHB4Q3VycmVudFRDQgkJCQlcbiIKKwkjaWYoIGNvbmZpZ0VOQUJMRV9NUFUgPT0gMSApCisJInhNUFVDVFJMQ29uc3QyOiAud29yZCAweGUwMDBlZDk0CQkJCQlcbiIKKwkieE1BSVIwQ29uc3QyOiAud29yZCAweGUwMDBlZGMwCQkJCQkJXG4iCisJInhSTlJDb25zdDI6IC53b3JkIDB4ZTAwMGVkOTgJCQkJCQlcbiIKKwkieFJCQVJDb25zdDI6IC53b3JkIDB4ZTAwMGVkOWMJCQkJCQlcbiIKKwkjZW5kaWYgLyogY29uZmlnRU5BQkxFX01QVSAqLworCSk7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworQmFzZVR5cGVfdCB4SXNQcml2aWxlZ2VkKCB2b2lkICkgLyogX19hdHRyaWJ1dGVfXyAoKCBuYWtlZCApKSAqLworeworCV9fYXNtIHZvbGF0aWxlCisJKAorCSIJbXJzIHIwLCBjb250cm9sCQkJCQkJCQkJXG4iIC8qIHIwID0gQ09OVFJPTC4gKi8KKwkiCW1vdnMgcjEsICMxCQkJCQkJCQkJCVxuIiAvKiByMSA9IDEuICovCisJIgl0c3QgcjAsIHIxCQkJCQkJCQkJCVxuIiAvKiBQZXJmb3JtIHIwICYgcjEgKGJpdHdpc2UgQU5EKSBhbmQgdXBkYXRlIHRoZSBjb25kaXRpb25zIGZsYWcuICovCisJIgliZXEgcnVubmluZ19wcml2aWxlZ2VkCQkJCQkJCVxuIiAvKiBJZiB0aGUgcmVzdWx0IG9mIHByZXZpb3VzIEFORCBvcGVyYXRpb24gd2FzIDAsIGJyYW5jaC4gKi8KKwkiCW1vdnMgcjAsICMwCQkJCQkJCQkJCVxuIiAvKiBDT05UUk9MWzBdIT0wLiBSZXR1cm4gZmFsc2UgdG8gaW5kaWNhdGUgdGhhdCB0aGUgcHJvY2Vzc29yIGlzIG5vdCBwcml2aWxlZ2VkLiAqLworCSIJYnggbHIJCQkJCQkJCQkJCVxuIiAvKiBSZXR1cm4uICovCisJIiBydW5uaW5nX3ByaXZpbGVnZWQ6CQkJCQkJCQlcbiIKKwkiCW1vdnMgcjAsICMxCQkJCQkJCQkJCVxuIiAvKiBDT05UUk9MWzBdPT0wLiBSZXR1cm4gdHJ1ZSB0byBpbmRpY2F0ZSB0aGF0IHRoZSBwcm9jZXNzb3IgaXMgcHJpdmlsZWdlZC4gKi8KKwkiCWJ4IGxyCQkJCQkJCQkJCQlcbiIgLyogUmV0dXJuLiAqLworCSIJCQkJCQkJCQkJCQkJXG4iCisJIgkuYWxpZ24gNAkJCQkJCQkJCQlcbiIKKwk6OjogInIwIiwgInIxIiwgIm1lbW9yeSIKKwkpOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgdlJhaXNlUHJpdmlsZWdlKCB2b2lkICkgLyogX19hdHRyaWJ1dGVfXyAoKCBuYWtlZCApKSBQUklWSUxFR0VEX0ZVTkNUSU9OICovCit7CisJIF9fYXNtIHZvbGF0aWxlCisJKAorCSIJbXJzICByMCwgY29udHJvbAkJCQkJCQkJXG4iIC8qIFJlYWQgdGhlIENPTlRST0wgcmVnaXN0ZXIuICovCisJIgltb3ZzIHIxLCAjMQkJCQkJCQkJCQlcbiIgLyogcjEgPSAxLiAqLworCSIJYmljcyByMCwgcjEJCQkJCQkJCQkJXG4iIC8qIENsZWFyIHRoZSBiaXQgMC4gKi8KKwkiCW1zciAgY29udHJvbCwgcjAJCQkJCQkJCVxuIiAvKiBXcml0ZSBiYWNrIHRoZSBuZXcgQ09OVFJPTCB2YWx1ZS4gKi8KKwkiCWJ4IGxyCQkJCQkJCQkJCQlcbiIgLyogUmV0dXJuIHRvIHRoZSBjYWxsZXIuICovCisJOjo6ICJyMCIsICJyMSIsICJtZW1vcnkiCisJKTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIHZSZXNldFByaXZpbGVnZSggdm9pZCApIC8qIF9fYXR0cmlidXRlX18gKCggbmFrZWQgKSkgKi8KK3sKKwlfX2FzbSB2b2xhdGlsZQorCSgKKwkiCW1ycyByMCwgY29udHJvbAkJCQkJCQkJCVxuIiAvKiByMCA9IENPTlRST0wuICovCisJIgltb3ZzIHIxLCAjMQkJCQkJCQkJCQlcbiIgLyogcjEgPSAxLiAqLworCSIJb3JycyByMCwgcjEJCQkJCQkJCQkJXG4iIC8qIHIwID0gcjAgfCByMS4gKi8KKwkiCW1zciBjb250cm9sLCByMAkJCQkJCQkJCVxuIiAvKiBDT05UUk9MID0gcjAuICovCisJIglieCBscgkJCQkJCQkJCQkJXG4iIC8qIFJldHVybiB0byB0aGUgY2FsbGVyLiAqLworCTo6OiJyMCIsICJyMSIsICJtZW1vcnkiCisJKTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIHZTdGFydEZpcnN0VGFzayggdm9pZCApIC8qIF9fYXR0cmlidXRlX18gKCggbmFrZWQgKSkgUFJJVklMRUdFRF9GVU5DVElPTiAqLworeworCV9fYXNtIHZvbGF0aWxlCisJKAorCSIJbGRyIHIwLCB4VlRPUkNvbnN0CQkJCQkJCQlcbiIgLyogVXNlIHRoZSBOVklDIG9mZnNldCByZWdpc3RlciB0byBsb2NhdGUgdGhlIHN0YWNrLiAqLworCSIJbGRyIHIwLCBbcjBdCQkJCQkJCQkJXG4iIC8qIFJlYWQgdGhlIFZUT1IgcmVnaXN0ZXIgd2hpY2ggZ2l2ZXMgdGhlIGFkZHJlc3Mgb2YgdmVjdG9yIHRhYmxlLiAqLworCSIJbGRyIHIwLCBbcjBdCQkJCQkJCQkJXG4iIC8qIFRoZSBmaXJzdCBlbnRyeSBpbiB2ZWN0b3IgdGFibGUgaXMgc3RhY2sgcG9pbnRlci4gKi8KKwkiCW1zciBtc3AsIHIwCQkJCQkJCQkJCVxuIiAvKiBTZXQgdGhlIE1TUCBiYWNrIHRvIHRoZSBzdGFydCBvZiB0aGUgc3RhY2suICovCisJIgljcHNpZSBpCQkJCQkJCQkJCQlcbiIgLyogR2xvYmFsbHkgZW5hYmxlIGludGVycnVwdHMuICovCisJIglkc2IJCQkJCQkJCQkJCQlcbiIKKwkiCWlzYgkJCQkJCQkJCQkJCVxuIgorCSIJc3ZjICUwCQkJCQkJCQkJCQlcbiIgLyogU3lzdGVtIGNhbGwgdG8gc3RhcnQgdGhlIGZpcnN0IHRhc2suICovCisJIglub3AJCQkJCQkJCQkJCQlcbiIKKwkiCQkJCQkJCQkJCQkJCVxuIgorCSIgICAuYWxpZ24gNAkJCQkJCQkJCQlcbiIKKwkieFZUT1JDb25zdDogLndvcmQgMHhlMDAwZWQwOAkJCQkJCVxuIgorCTo6ICJpIiAoIHBvcnRTVkNfU1RBUlRfU0NIRURVTEVSICkgOiAibWVtb3J5IgorCSk7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordWludDMyX3QgdWxTZXRJbnRlcnJ1cHRNYXNrRnJvbUlTUiggdm9pZCApIC8qIF9fYXR0cmlidXRlX18oKCBuYWtlZCApKSBQUklWSUxFR0VEX0ZVTkNUSU9OICovCit7CisJX19hc20gdm9sYXRpbGUKKwkoCisJIgltcnMgcjAsIFBSSU1BU0sJCQkJCQkJCQlcbiIKKwkiCWNwc2lkIGkJCQkJCQkJCQkJCVxuIgorCSIJYnggbHIJCQkJCQkJCQkJCVxuIgorCTo6OiAibWVtb3J5IgorCSk7CisKKyNpZiAhZGVmaW5lZCAoX19BUk1DQ19WRVJTSU9OKSAmJiAoX19BUk1DQ19WRVJTSU9OID49IDYwMTAwNTApCisJLyogVG8gYXZvaWQgY29tcGlsZXIgd2FybmluZ3MuICBUaGUgcmV0dXJuIHN0YXRlbWVudCB3aWxsIG5ldmVyIGJlIHJlYWNoZWQsCisJICogYnV0IHNvbWUgY29tcGlsZXJzIHdhcm4gaWYgaXQgaXMgbm90IGluY2x1ZGVkLCB3aGlsZSBvdGhlcnMgd29uJ3QgY29tcGlsZQorCSAqIGlmIGl0IGlzLiAqLworCXJldHVybiAwOworI2VuZGlmCit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCB2Q2xlYXJJbnRlcnJ1cHRNYXNrRnJvbUlTUiggX19hdHRyaWJ1dGVfXyggKCB1bnVzZWQgKSApIHVpbnQzMl90IHVsTWFzayApIC8qIF9fYXR0cmlidXRlX18oKCBuYWtlZCApKSBQUklWSUxFR0VEX0ZVTkNUSU9OICovCit7CisJX19hc20gdm9sYXRpbGUKKwkoCisJIgltc3IgUFJJTUFTSywgcjAJCQkJCQkJCQlcbiIKKwkiCWJ4IGxyCQkJCQkJCQkJCQlcbiIKKwk6OjogIm1lbW9yeSIKKwkpOworCisjaWYgIWRlZmluZWQgKF9fQVJNQ0NfVkVSU0lPTikgJiYgKF9fQVJNQ0NfVkVSU0lPTiA+PSA2MDEwMDUwKQorCS8qIEp1c3QgdG8gYXZvaWQgY29tcGlsZXIgd2FybmluZy4gIHVsTWFzayBpcyB1c2VkIGZyb20gdGhlIGFzbSBjb2RlIGJ1dAorCSAqIHRoZSBjb21waWxlciBjYW4ndCBzZWUgdGhhdC4gIFNvbWUgY29tcGlsZXJzIGdlbmVyYXRlIHdhcm5pbmdzIHdpdGhvdXQKKwkgKiB0aGUgZm9sbG93aW5nIGxpbmUsIHdoaWxlIG90aGVycyBnZW5lcmF0ZSB3YXJuaW5ncyBpZiB0aGUgbGluZSBpcworCSAqIGluY2x1ZGVkLiAqLworCSggdm9pZCApIHVsTWFzazsKKyNlbmRpZgorfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgUGVuZFNWX0hhbmRsZXIoIHZvaWQgKSAvKiBfX2F0dHJpYnV0ZV9fICgoIG5ha2VkICkpIFBSSVZJTEVHRURfRlVOQ1RJT04gKi8KK3sKKwlfX2FzbSB2b2xhdGlsZQorCSgKKwkiCS5zeW50YXggdW5pZmllZAkJCQkJCQkJCVxuIgorCSIJCQkJCQkJCQkJCQkJXG4iCisJIgltcnMgcjAsIHBzcAkJCQkJCQkJCQlcbiIgLyogUmVhZCBQU1AgaW4gcjAuICovCisJIglsZHIgcjIsIHB4Q3VycmVudFRDQkNvbnN0CQkJCQkJXG4iIC8qIFJlYWQgdGhlIGxvY2F0aW9uIG9mIHB4Q3VycmVudFRDQiBpLmUuICYoIHB4Q3VycmVudFRDQiApLiAqLworCSIJbGRyIHIxLCBbcjJdCQkJCQkJCQkJXG4iIC8qIFJlYWQgcHhDdXJyZW50VENCLiAqLworCSNpZiggY29uZmlnRU5BQkxFX01QVSA9PSAxICkKKwkiCXN1YnMgcjAsIHIwLCAjNDQJCQkJCQkJCVxuIiAvKiBNYWtlIHNwYWNlIGZvciBQU1BMSU0sIENPTlRST0wsIExSIGFuZCB0aGUgcmVtYWluaW5nIHJlZ2lzdGVycyBvbiB0aGUgc3RhY2suICovCisJIglzdHIgcjAsIFtyMV0JCQkJCQkJCQlcbiIgLyogU2F2ZSB0aGUgbmV3IHRvcCBvZiBzdGFjayBpbiBUQ0IuICovCisJIgltcnMgcjEsIHBzcGxpbQkJCQkJCQkJCVxuIiAvKiByMSA9IFBTUExJTS4gKi8KKwkiCW1ycyByMiwgY29udHJvbAkJCQkJCQkJCVxuIiAvKiByMiA9IENPTlRST0wuICovCisJIgltb3YgcjMsIGxyCQkJCQkJCQkJCVxuIiAvKiByMyA9IExSL0VYQ19SRVRVUk4uICovCisJIglzdG1pYSByMCEsIHtyMS1yN30JCQkJCQkJCVxuIiAvKiBTdG9yZSBvbiB0aGUgc3RhY2sgLSBQU1BMSU0sIENPTlRST0wsIExSIGFuZCBsb3cgcmVnaXN0ZXJzIHRoYXQgYXJlIG5vdCBhdXRvbWF0aWNhbGx5IHNhdmVkLiAqLworCSIJbW92IHI0LCByOAkJCQkJCQkJCQlcbiIgLyogcjQgPSByOC4gKi8KKwkiCW1vdiByNSwgcjkJCQkJCQkJCQkJXG4iIC8qIHI1ID0gcjkuICovCisJIgltb3YgcjYsIHIxMAkJCQkJCQkJCQlcbiIgLyogcjYgPSByMTAuICovCisJIgltb3YgcjcsIHIxMQkJCQkJCQkJCQlcbiIgLyogcjcgPSByMTEuICovCisJIglzdG1pYSByMCEsIHtyNC1yN30JCQkJCQkJCVxuIiAvKiBTdG9yZSB0aGUgaGlnaCByZWdpc3RlcnMgdGhhdCBhcmUgbm90IHNhdmVkIGF1dG9tYXRpY2FsbHkuICovCisJI2Vsc2UgLyogY29uZmlnRU5BQkxFX01QVSAqLworCSIJc3VicyByMCwgcjAsICM0MAkJCQkJCQkJXG4iIC8qIE1ha2Ugc3BhY2UgZm9yIFBTUExJTSwgTFIgYW5kIHRoZSByZW1haW5pbmcgcmVnaXN0ZXJzIG9uIHRoZSBzdGFjay4gKi8KKwkiCXN0ciByMCwgW3IxXQkJCQkJCQkJCVxuIiAvKiBTYXZlIHRoZSBuZXcgdG9wIG9mIHN0YWNrIGluIFRDQi4gKi8KKwkiCW1ycyByMiwgcHNwbGltCQkJCQkJCQkJXG4iIC8qIHIyID0gUFNQTElNLiAqLworCSIJbW92IHIzLCBscgkJCQkJCQkJCQlcbiIgLyogcjMgPSBMUi9FWENfUkVUVVJOLiAqLworCSIJc3RtaWEgcjAhLCB7cjItcjd9CQkJCQkJCQlcbiIgLyogU3RvcmUgb24gdGhlIHN0YWNrIC0gUFNQTElNLCBMUiBhbmQgbG93IHJlZ2lzdGVycyB0aGF0IGFyZSBub3QgYXV0b21hdGljYWxseSBzYXZlZC4gKi8KKwkiCW1vdiByNCwgcjgJCQkJCQkJCQkJXG4iIC8qIHI0ID0gcjguICovCisJIgltb3YgcjUsIHI5CQkJCQkJCQkJCVxuIiAvKiByNSA9IHI5LiAqLworCSIJbW92IHI2LCByMTAJCQkJCQkJCQkJXG4iIC8qIHI2ID0gcjEwLiAqLworCSIJbW92IHI3LCByMTEJCQkJCQkJCQkJXG4iIC8qIHI3ID0gcjExLiAqLworCSIJc3RtaWEgcjAhLCB7cjQtcjd9CQkJCQkJCQlcbiIgLyogU3RvcmUgdGhlIGhpZ2ggcmVnaXN0ZXJzIHRoYXQgYXJlIG5vdCBzYXZlZCBhdXRvbWF0aWNhbGx5LiAqLworCSNlbmRpZiAvKiBjb25maWdFTkFCTEVfTVBVICovCisJIgkJCQkJCQkJCQkJCQlcbiIKKwkiCWNwc2lkIGkJCQkJCQkJCQkJCVxuIgorCSIJYmwgdlRhc2tTd2l0Y2hDb250ZXh0CQkJCQkJCVxuIgorCSIJY3BzaWUgaQkJCQkJCQkJCQkJXG4iCisJIgkJCQkJCQkJCQkJCQlcbiIKKwkiCWxkciByMiwgcHhDdXJyZW50VENCQ29uc3QJCQkJCQlcbiIgLyogUmVhZCB0aGUgbG9jYXRpb24gb2YgcHhDdXJyZW50VENCIGkuZS4gJiggcHhDdXJyZW50VENCICkuICovCisJIglsZHIgcjEsIFtyMl0JCQkJCQkJCQlcbiIgLyogUmVhZCBweEN1cnJlbnRUQ0IuICovCisJIglsZHIgcjAsIFtyMV0JCQkJCQkJCQlcbiIgLyogVGhlIGZpcnN0IGl0ZW0gaW4gcHhDdXJyZW50VENCIGlzIHRoZSB0YXNrIHRvcCBvZiBzdGFjay4gcjAgbm93IHBvaW50cyB0byB0aGUgdG9wIG9mIHN0YWNrLiAqLworCSIJCQkJCQkJCQkJCQkJXG4iCisJI2lmKCBjb25maWdFTkFCTEVfTVBVID09IDEgKQorCSIJZG1iCQkJCQkJCQkJCQkJXG4iIC8qIENvbXBsZXRlIG91dHN0YW5kaW5nIHRyYW5zZmVycyBiZWZvcmUgZGlzYWJsaW5nIE1QVS4gKi8KKwkiCWxkciByMiwgeE1QVUNUUkxDb25zdAkJCQkJCQlcbiIgLyogcjIgPSAweGUwMDBlZDk0IFtMb2NhdGlvbiBvZiBNUFVfQ1RSTF0uICovCisJIglsZHIgcjMsIFtyMl0JCQkJCQkJCQlcbiIgLyogUmVhZCB0aGUgdmFsdWUgb2YgTVBVX0NUUkwuICovCisJIgltb3ZzIHI0LCAjMQkJCQkJCQkJCQlcbiIgLyogcjQgPSAxLiAqLworCSIJYmljcyByMywgcjQJCQkJCQkJCQkJXG4iIC8qIHIzID0gcjMgJiB+cjQgaS5lLiBDbGVhciB0aGUgYml0IDAgaW4gcjMuICovCisJIglzdHIgcjMsIFtyMl0JCQkJCQkJCQlcbiIgLyogRGlzYWJsZSBNUFUuICovCisJIgkJCQkJCQkJCQkJCQlcbiIKKwkiCWFkZHMgcjEsICM0CQkJCQkJCQkJCVxuIiAvKiByMSA9IHIxICsgNC4gcjEgbm93IHBvaW50cyB0byBNQUlSMCBpbiBUQ0IuICovCisJIglsZHIgIHI0LCBbcjFdCQkJCQkJCQkJXG4iIC8qIHI0ID0gKnIxIGkuZS4gcjQgPSBNQUlSMC4gKi8KKwkiCWxkciAgcjIsIHhNQUlSMENvbnN0CQkJCQkJCVxuIiAvKiByMiA9IDB4ZTAwMGVkYzAgW0xvY2F0aW9uIG9mIE1BSVIwXS4gKi8KKwkiCXN0ciAgcjQsIFtyMl0JCQkJCQkJCQlcbiIgLyogUHJvZ3JhbSBNQUlSMC4gKi8KKwkiCWxkciAgcjIsIHhSTlJDb25zdAkJCQkJCQkJXG4iIC8qIHIyID0gMHhlMDAwZWQ5OCBbTG9jYXRpb24gb2YgUk5SXS4gKi8KKwkiCWFkZHMgcjEsICM0CQkJCQkJCQkJCVxuIiAvKiByMSA9IHIxICsgNC4gcjEgbm93IHBvaW50cyB0byBmaXJzdCBSQkFSIGluIFRDQi4gKi8KKwkiCW1vdnMgcjQsICM0CQkJCQkJCQkJCVxuIiAvKiByNCA9IDQuICovCisJIglzdHIgIHI0LCBbcjJdCQkJCQkJCQkJXG4iIC8qIFByb2dyYW0gUk5SID0gNC4gKi8KKwkiCWxkbWlhIHIxISwge3I1LHI2fQkJCQkJCQkJXG4iIC8qIFJlYWQgZmlyc3Qgc2V0IG9mIFJCQVIvUkxBUiBmcm9tIFRDQi4gKi8KKwkiCWxkciAgcjMsIHhSQkFSQ29uc3QJCQkJCQkJCVxuIiAvKiByMyA9IDB4ZTAwMGVkOWMgW0xvY2F0aW9uIG9mIFJCQVJdLiAqLworCSIJc3RtaWEgcjMhLCB7cjUscjZ9CQkJCQkJCQlcbiIgLyogV3JpdGUgZmlyc3Qgc2V0IG9mIFJCQVIvUkxBUiByZWdpc3RlcnMuICovCisJIgltb3ZzIHI0LCAjNQkJCQkJCQkJCQlcbiIgLyogcjQgPSA1LiAqLworCSIJc3RyICByNCwgW3IyXQkJCQkJCQkJCVxuIiAvKiBQcm9ncmFtIFJOUiA9IDUuICovCisJIglsZG1pYSByMSEsIHtyNSxyNn0JCQkJCQkJCVxuIiAvKiBSZWFkIHNlY29uZCBzZXQgb2YgUkJBUi9STEFSIGZyb20gVENCLiAqLworCSIJbGRyICByMywgeFJCQVJDb25zdAkJCQkJCQkJXG4iIC8qIHIzID0gMHhlMDAwZWQ5YyBbTG9jYXRpb24gb2YgUkJBUl0uICovCisJIglzdG1pYSByMyEsIHtyNSxyNn0JCQkJCQkJCVxuIiAvKiBXcml0ZSBzZWNvbmQgc2V0IG9mIFJCQVIvUkxBUiByZWdpc3RlcnMuICovCisJIgltb3ZzIHI0LCAjNgkJCQkJCQkJCQlcbiIgLyogcjQgPSA2LiAqLworCSIJc3RyICByNCwgW3IyXQkJCQkJCQkJCVxuIiAvKiBQcm9ncmFtIFJOUiA9IDYuICovCisJIglsZG1pYSByMSEsIHtyNSxyNn0JCQkJCQkJCVxuIiAvKiBSZWFkIHRoaXJkIHNldCBvZiBSQkFSL1JMQVIgZnJvbSBUQ0IuICovCisJIglsZHIgIHIzLCB4UkJBUkNvbnN0CQkJCQkJCQlcbiIgLyogcjMgPSAweGUwMDBlZDljIFtMb2NhdGlvbiBvZiBSQkFSXS4gKi8KKwkiCXN0bWlhIHIzISwge3I1LHI2fQkJCQkJCQkJXG4iIC8qIFdyaXRlIHRoaXJkIHNldCBvZiBSQkFSL1JMQVIgcmVnaXN0ZXJzLiAqLworCSIJbW92cyByNCwgIzcJCQkJCQkJCQkJXG4iIC8qIHI0ID0gNy4gKi8KKwkiCXN0ciAgcjQsIFtyMl0JCQkJCQkJCQlcbiIgLyogUHJvZ3JhbSBSTlIgPSA3LiAqLworCSIJbGRtaWEgcjEhLCB7cjUscjZ9CQkJCQkJCQlcbiIgLyogUmVhZCBmb3VydGggc2V0IG9mIFJCQVIvUkxBUiBmcm9tIFRDQi4gKi8KKwkiCWxkciAgcjMsIHhSQkFSQ29uc3QJCQkJCQkJCVxuIiAvKiByMyA9IDB4ZTAwMGVkOWMgW0xvY2F0aW9uIG9mIFJCQVJdLiAqLworCSIJc3RtaWEgcjMhLCB7cjUscjZ9CQkJCQkJCQlcbiIgLyogV3JpdGUgZm91cnRoIHNldCBvZiBSQkFSL1JMQVIgcmVnaXN0ZXJzLiAqLworCSIJCQkJCQkJCQkJCQkJXG4iCisJIglsZHIgcjIsIHhNUFVDVFJMQ29uc3QJCQkJCQkJXG4iIC8qIHIyID0gMHhlMDAwZWQ5NCBbTG9jYXRpb24gb2YgTVBVX0NUUkxdLiAqLworCSIJbGRyIHIzLCBbcjJdCQkJCQkJCQkJXG4iIC8qIFJlYWQgdGhlIHZhbHVlIG9mIE1QVV9DVFJMLiAqLworCSIJbW92cyByNCwgIzEJCQkJCQkJCQkJXG4iIC8qIHI0ID0gMS4gKi8KKwkiCW9ycnMgcjMsIHI0CQkJCQkJCQkJCVxuIiAvKiByMyA9IHIzIHwgcjQgaS5lLiBTZXQgdGhlIGJpdCAwIGluIHIzLiAqLworCSIJc3RyIHIzLCBbcjJdCQkJCQkJCQkJXG4iIC8qIEVuYWJsZSBNUFUuICovCisJIglkc2IJCQkJCQkJCQkJCQlcbiIgLyogRm9yY2UgbWVtb3J5IHdyaXRlcyBiZWZvcmUgY29udGludWluZy4gKi8KKwkjZW5kaWYgLyogY29uZmlnRU5BQkxFX01QVSAqLworCSIJCQkJCQkJCQkJCQkJXG4iCisJI2lmKCBjb25maWdFTkFCTEVfTVBVID09IDEgKQorCSIJYWRkcyByMCwgcjAsICMyOAkJCQkJCQkJXG4iIC8qIE1vdmUgdG8gdGhlIGhpZ2ggcmVnaXN0ZXJzLiAqLworCSIJbGRtaWEgcjAhLCB7cjQtcjd9CQkJCQkJCQlcbiIgLyogUmVzdG9yZSB0aGUgaGlnaCByZWdpc3RlcnMgdGhhdCBhcmUgbm90IGF1dG9tYXRpY2FsbHkgcmVzdG9yZWQuICovCisJIgltb3YgcjgsIHI0CQkJCQkJCQkJCVxuIiAvKiByOCA9IHI0LiAqLworCSIJbW92IHI5LCByNQkJCQkJCQkJCQlcbiIgLyogcjkgPSByNS4gKi8KKwkiCW1vdiByMTAsIHI2CQkJCQkJCQkJCVxuIiAvKiByMTAgPSByNi4gKi8KKwkiCW1vdiByMTEsIHI3CQkJCQkJCQkJCVxuIiAvKiByMTEgPSByNy4gKi8KKwkiCW1zciBwc3AsIHIwCQkJCQkJCQkJCVxuIiAvKiBSZW1lbWJlciB0aGUgbmV3IHRvcCBvZiBzdGFjayBmb3IgdGhlIHRhc2suICovCisJIglzdWJzIHIwLCByMCwgIzQ0CQkJCQkJCQlcbiIgLyogTW92ZSB0byB0aGUgc3RhcnRpbmcgb2YgdGhlIHNhdmVkIGNvbnRleHQuICovCisJIglsZG1pYSByMCEsIHtyMS1yN30JCQkJCQkJCVxuIiAvKiBSZWFkIGZyb20gc3RhY2sgLSByMSA9IFBTUExJTSwgcjIgPSBDT05UUk9MLCByMyA9IExSIGFuZCByNC1yNyByZXN0b3JlZC4gKi8KKwkiCW1zciBwc3BsaW0sIHIxCQkJCQkJCQkJXG4iIC8qIFJlc3RvcmUgdGhlIFBTUExJTSByZWdpc3RlciB2YWx1ZSBmb3IgdGhlIHRhc2suICovCisJIgltc3IgY29udHJvbCwgcjIJCQkJCQkJCQlcbiIgLyogUmVzdG9yZSB0aGUgQ09OVFJPTCByZWdpc3RlciB2YWx1ZSBmb3IgdGhlIHRhc2suICovCisJIglieCByMwkJCQkJCQkJCQkJXG4iCisJI2Vsc2UgLyogY29uZmlnRU5BQkxFX01QVSAqLworCSIJYWRkcyByMCwgcjAsICMyNAkJCQkJCQkJXG4iIC8qIE1vdmUgdG8gdGhlIGhpZ2ggcmVnaXN0ZXJzLiAqLworCSIJbGRtaWEgcjAhLCB7cjQtcjd9CQkJCQkJCQlcbiIgLyogUmVzdG9yZSB0aGUgaGlnaCByZWdpc3RlcnMgdGhhdCBhcmUgbm90IGF1dG9tYXRpY2FsbHkgcmVzdG9yZWQuICovCisJIgltb3YgcjgsIHI0CQkJCQkJCQkJCVxuIiAvKiByOCA9IHI0LiAqLworCSIJbW92IHI5LCByNQkJCQkJCQkJCQlcbiIgLyogcjkgPSByNS4gKi8KKwkiCW1vdiByMTAsIHI2CQkJCQkJCQkJCVxuIiAvKiByMTAgPSByNi4gKi8KKwkiCW1vdiByMTEsIHI3CQkJCQkJCQkJCVxuIiAvKiByMTEgPSByNy4gKi8KKwkiCW1zciBwc3AsIHIwCQkJCQkJCQkJCVxuIiAvKiBSZW1lbWJlciB0aGUgbmV3IHRvcCBvZiBzdGFjayBmb3IgdGhlIHRhc2suICovCisJIglzdWJzIHIwLCByMCwgIzQwCQkJCQkJCQlcbiIgLyogTW92ZSB0byB0aGUgc3RhcnRpbmcgb2YgdGhlIHNhdmVkIGNvbnRleHQuICovCisJIglsZG1pYSByMCEsIHtyMi1yN30JCQkJCQkJCVxuIiAvKiBSZWFkIGZyb20gc3RhY2sgLSByMiA9IFBTUExJTSwgcjMgPSBMUiBhbmQgcjQtcjcgcmVzdG9yZWQuICovCisJIgltc3IgcHNwbGltLCByMgkJCQkJCQkJCVxuIiAvKiBSZXN0b3JlIHRoZSBQU1BMSU0gcmVnaXN0ZXIgdmFsdWUgZm9yIHRoZSB0YXNrLiAqLworCSIJYnggcjMJCQkJCQkJCQkJCVxuIgorCSNlbmRpZiAvKiBjb25maWdFTkFCTEVfTVBVICovCisJIgkJCQkJCQkJCQkJCQlcbiIKKwkiCS5hbGlnbiA0CQkJCQkJCQkJCVxuIgorCSJweEN1cnJlbnRUQ0JDb25zdDogLndvcmQgcHhDdXJyZW50VENCCQkJCVxuIgorCSNpZiggY29uZmlnRU5BQkxFX01QVSA9PSAxICkKKwkieE1QVUNUUkxDb25zdDogLndvcmQgMHhlMDAwZWQ5NAkJCQkJXG4iCisJInhNQUlSMENvbnN0OiAud29yZCAweGUwMDBlZGMwCQkJCQkJXG4iCisJInhSTlJDb25zdDogLndvcmQgMHhlMDAwZWQ5OAkJCQkJCVxuIgorCSJ4UkJBUkNvbnN0OiAud29yZCAweGUwMDBlZDljCQkJCQkJXG4iCisJI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9NUFUgKi8KKwkpOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgU1ZDX0hhbmRsZXIoIHZvaWQgKSAvKiBfX2F0dHJpYnV0ZV9fICgoIG5ha2VkICkpIFBSSVZJTEVHRURfRlVOQ1RJT04gKi8KK3sKKwlfX2FzbSB2b2xhdGlsZQorCSgKKwkiCW1vdnMgcjAsICM0CQkJCQkJCQkJCVxuIgorCSIJbW92IHIxLCBscgkJCQkJCQkJCQlcbiIKKwkiCXRzdCByMCwgcjEJCQkJCQkJCQkJXG4iCisJIgliZXEgc3RhY2tpbmdfdXNlZF9tc3AJCQkJCQkJXG4iCisJIgltcnMgcjAsIHBzcAkJCQkJCQkJCQlcbiIKKwkiCWxkciByMiwgc3ZjaGFuZGxlcl9hZGRyZXNzX2NvbnN0CQkJCVxuIgorCSIJYnggcjIJCQkJCQkJCQkJCVxuIgorCSIgc3RhY2tpbmdfdXNlZF9tc3A6CQkJCQkJCQlcbiIKKwkiCW1ycyByMCwgbXNwCQkJCQkJCQkJCVxuIgorCSIJbGRyIHIyLCBzdmNoYW5kbGVyX2FkZHJlc3NfY29uc3QJCQkJXG4iCisJIglieCByMgkJCQkJCQkJCQkJXG4iCisJIgkJCQkJCQkJCQkJCQlcbiIKKwkiCS5hbGlnbiA0CQkJCQkJCQkJCVxuIgorCSJzdmNoYW5kbGVyX2FkZHJlc3NfY29uc3Q6IC53b3JkIHZQb3J0U1ZDSGFuZGxlcl9DCVxuIgorCSk7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KZGlmZiAtLWdpdCBhL1NvdXJjZS9wb3J0YWJsZS9HQ0MvQVJNX0NNMjNfTlRaL25vbl9zZWN1cmUvcG9ydGFzbS5oIGIvU291cmNlL3BvcnRhYmxlL0dDQy9BUk1fQ00yM19OVFovbm9uX3NlY3VyZS9wb3J0YXNtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmVjZjA0ZQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9wb3J0YWJsZS9HQ0MvQVJNX0NNMjNfTlRaL25vbl9zZWN1cmUvcG9ydGFzbS5oCkBAIC0wLDAgKzEsMTEzIEBACisvKgorICogRnJlZVJUT1MgS2VybmVsIFYxMC4yLjEKKyAqIENvcHlyaWdodCAoQykgMjAxOSBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCisgKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgorICogdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bworICogdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YKKyAqIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKKyAqIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAorICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MKKyAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUgorICogQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSCisgKiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBodHRwOi8vd3d3LkZyZWVSVE9TLm9yZworICogaHR0cDovL2F3cy5hbWF6b24uY29tL2ZyZWVydG9zCisgKgorICogMSB0YWIgPT0gNCBzcGFjZXMhCisgKi8KKworI2lmbmRlZiBfX1BPUlRfQVNNX0hfXworI2RlZmluZSBfX1BPUlRfQVNNX0hfXworCisvKiBTY2hlZHVsZXIgaW5jbHVkZXMuICovCisjaW5jbHVkZSAiRnJlZVJUT1MuaCIKKworLyogTVBVIHdyYXBwZXJzIGluY2x1ZGVzLiAqLworI2luY2x1ZGUgIm1wdV93cmFwcGVycy5oIgorCisvKioKKyAqIEBicmllZiBSZXN0b3JlIHRoZSBjb250ZXh0IG9mIHRoZSBmaXJzdCB0YXNrIHNvIHRoYXQgdGhlIGZpcnN0IHRhc2sgc3RhcnRzCisgKiBleGVjdXRpbmcuCisgKi8KK3ZvaWQgdlJlc3RvcmVDb250ZXh0T2ZGaXJzdFRhc2soIHZvaWQgKSBfX2F0dHJpYnV0ZV9fICgoIG5ha2VkICkpIFBSSVZJTEVHRURfRlVOQ1RJT047CisKKy8qKgorICogQGJyaWVmIENoZWNrcyB3aGV0aGVyIG9yIG5vdCB0aGUgcHJvY2Vzc29yIGlzIHByaXZpbGVnZWQuCisgKgorICogQHJldHVybiAxIGlmIHRoZSBwcm9jZXNzb3IgaXMgYWxyZWFkeSBwcml2aWxlZ2VkLCAwIG90aGVyd2lzZS4KKyAqLworQmFzZVR5cGVfdCB4SXNQcml2aWxlZ2VkKCB2b2lkICkgX19hdHRyaWJ1dGVfXyAoKCBuYWtlZCApKTsKKworLyoqCisgKiBAYnJpZWYgUmFpc2VzIHRoZSBwcml2aWxlZ2UgbGV2ZWwgYnkgY2xlYXJpbmcgdGhlIGJpdCAwIG9mIHRoZSBDT05UUk9MCisgKiByZWdpc3Rlci4KKyAqCisgKiBAbm90ZSBUaGlzIGlzIGEgcHJpdmlsZWdlZCBmdW5jdGlvbiBhbmQgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGZyb20gdGhlIGtlbnJlbAorICogY29kZS4KKyAqCisgKiBCaXQgMCBvZiB0aGUgQ09OVFJPTCByZWdpc3RlciBkZWZpbmVzIHRoZSBwcml2aWxlZ2UgbGV2ZWwgb2YgVGhyZWFkIE1vZGUuCisgKiAgQml0WzBdID0gMCAtLT4gVGhlIHByb2Nlc3NvciBpcyBydW5uaW5nIHByaXZpbGVnZWQKKyAqICBCaXRbMF0gPSAxIC0tPiBUaGUgcHJvY2Vzc29yIGlzIHJ1bm5pbmcgdW5wcml2aWxlZ2VkLgorICovCit2b2lkIHZSYWlzZVByaXZpbGVnZSggdm9pZCApIF9fYXR0cmlidXRlX18gKCggbmFrZWQgKSkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworLyoqCisgKiBAYnJpZWYgTG93ZXJzIHRoZSBwcml2aWxlZ2UgbGV2ZWwgYnkgc2V0dGluZyB0aGUgYml0IDAgb2YgdGhlIENPTlRST0wKKyAqIHJlZ2lzdGVyLgorICoKKyAqIEJpdCAwIG9mIHRoZSBDT05UUk9MIHJlZ2lzdGVyIGRlZmluZXMgdGhlIHByaXZpbGVnZSBsZXZlbCBvZiBUaHJlYWQgTW9kZS4KKyAqICBCaXRbMF0gPSAwIC0tPiBUaGUgcHJvY2Vzc29yIGlzIHJ1bm5pbmcgcHJpdmlsZWdlZAorICogIEJpdFswXSA9IDEgLS0+IFRoZSBwcm9jZXNzb3IgaXMgcnVubmluZyB1bnByaXZpbGVnZWQuCisgKi8KK3ZvaWQgdlJlc2V0UHJpdmlsZWdlKCB2b2lkICkgX19hdHRyaWJ1dGVfXyAoKCBuYWtlZCApKTsKKworLyoqCisgKiBAYnJpZWYgU3RhcnRzIHRoZSBmaXJzdCB0YXNrLgorICovCit2b2lkIHZTdGFydEZpcnN0VGFzayggdm9pZCApIF9fYXR0cmlidXRlX18gKCggbmFrZWQgKSkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworLyoqCisgKiBAYnJpZWYgRGlzYWJsZXMgaW50ZXJydXB0cy4KKyAqLwordWludDMyX3QgdWxTZXRJbnRlcnJ1cHRNYXNrRnJvbUlTUiggdm9pZCApIF9fYXR0cmlidXRlX18oKCBuYWtlZCApKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisvKioKKyAqIEBicmllZiBFbmFibGVzIGludGVycnVwdHMuCisgKi8KK3ZvaWQgdkNsZWFySW50ZXJydXB0TWFza0Zyb21JU1IoIHVpbnQzMl90IHVsTWFzayApIF9fYXR0cmlidXRlX18oKCBuYWtlZCApKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisvKioKKyAqIEBicmllZiBQZW5kU1YgRXhjZXB0aW9uIGhhbmRsZXIuCisgKi8KK3ZvaWQgUGVuZFNWX0hhbmRsZXIoIHZvaWQgKSBfX2F0dHJpYnV0ZV9fICgoIG5ha2VkICkpIFBSSVZJTEVHRURfRlVOQ1RJT047CisKKy8qKgorICogQGJyaWVmIFNWQyBIYW5kbGVyLgorICovCit2b2lkIFNWQ19IYW5kbGVyKCB2b2lkICkgX19hdHRyaWJ1dGVfXyAoKCBuYWtlZCApKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisvKioKKyAqIEBicmllZiBBbGxvY2F0ZSBhIFNlY3VyZSBjb250ZXh0IGZvciB0aGUgY2FsbGluZyB0YXNrLgorICoKKyAqIEBwYXJhbVtpbl0gdWxTZWN1cmVTdGFja1NpemUgVGhlIHNpemUgb2YgdGhlIHN0YWNrIHRvIGJlIGFsbG9jYXRlZCBvbiB0aGUKKyAqIHNlY3VyZSBzaWRlIGZvciB0aGUgY2FsbGluZyB0YXNrLgorICovCit2b2lkIHZQb3J0QWxsb2NhdGVTZWN1cmVDb250ZXh0KCB1aW50MzJfdCB1bFNlY3VyZVN0YWNrU2l6ZSApIF9fYXR0cmlidXRlX18gKCggbmFrZWQgKSk7CisKKy8qKgorICogQGJyaWVmIEZyZWUgdGhlIHRhc2sncyBzZWN1cmUgY29udGV4dC4KKyAqCisgKiBAcGFyYW1baW5dIHB1bFRDQiBQb2ludGVyIHRvIHRoZSBUYXNrIENvbnRyb2wgQmxvY2sgKFRDQikgb2YgdGhlIHRhc2suCisgKi8KK3ZvaWQgdlBvcnRGcmVlU2VjdXJlQ29udGV4dCggdWludDMyX3QgKnB1bFRDQiApIF9fYXR0cmlidXRlX18gKCggbmFrZWQgKSkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworI2VuZGlmIC8qIF9fUE9SVF9BU01fSF9fICovCmRpZmYgLS1naXQgYS9Tb3VyY2UvcG9ydGFibGUvR0NDL0FSTV9DTTIzX05UWi9ub25fc2VjdXJlL3BvcnRtYWNyby5oIGIvU291cmNlL3BvcnRhYmxlL0dDQy9BUk1fQ00yM19OVFovbm9uX3NlY3VyZS9wb3J0bWFjcm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmFiMWI3Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL3BvcnRhYmxlL0dDQy9BUk1fQ00yM19OVFovbm9uX3NlY3VyZS9wb3J0bWFjcm8uaApAQCAtMCwwICsxLDI5OSBAQAorLyoKKyAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMi4xCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgorICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KKyAqIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KKyAqIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mCisgKiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCisgKiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKKyAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTCisgKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IKKyAqIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUgorICogSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogaHR0cDovL3d3dy5GcmVlUlRPUy5vcmcKKyAqIGh0dHA6Ly9hd3MuYW1hem9uLmNvbS9mcmVlcnRvcworICoKKyAqIDEgdGFiID09IDQgc3BhY2VzIQorICovCisKKyNpZm5kZWYgUE9SVE1BQ1JPX0gKKyNkZWZpbmUgUE9SVE1BQ1JPX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUG9ydCBzcGVjaWZpYyBkZWZpbml0aW9ucy4KKyAqCisgKiBUaGUgc2V0dGluZ3MgaW4gdGhpcyBmaWxlIGNvbmZpZ3VyZSBGcmVlUlRPUyBjb3JyZWN0bHkgZm9yIHRoZSBnaXZlbiBoYXJkd2FyZQorICogYW5kIGNvbXBpbGVyLgorICoKKyAqIFRoZXNlIHNldHRpbmdzIHNob3VsZCBub3QgYmUgYWx0ZXJlZC4KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworI2lmbmRlZiBjb25maWdFTkFCTEVfRlBVCisJI2Vycm9yIGNvbmZpZ0VOQUJMRV9GUFUgbXVzdCBiZSBkZWZpbmVkIGluIEZyZWVSVE9TQ29uZmlnLmguICBTZXQgY29uZmlnRU5BQkxFX0ZQVSB0byAxIHRvIGVuYWJsZSB0aGUgRlBVIG9yIDAgdG8gZGlzYWJsZSB0aGUgRlBVLgorI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9GUFUgKi8KKworI2lmbmRlZiBjb25maWdFTkFCTEVfTVBVCisJI2Vycm9yIGNvbmZpZ0VOQUJMRV9NUFUgbXVzdCBiZSBkZWZpbmVkIGluIEZyZWVSVE9TQ29uZmlnLmguICBTZXQgY29uZmlnRU5BQkxFX01QVSB0byAxIHRvIGVuYWJsZSB0aGUgTVBVIG9yIDAgdG8gZGlzYWJsZSB0aGUgTVBVLgorI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9NUFUgKi8KKworI2lmbmRlZiBjb25maWdFTkFCTEVfVFJVU1RaT05FCisJI2Vycm9yIGNvbmZpZ0VOQUJMRV9UUlVTVFpPTkUgbXVzdCBiZSBkZWZpbmVkIGluIEZyZWVSVE9TQ29uZmlnLmguICBTZXQgY29uZmlnRU5BQkxFX1RSVVNUWk9ORSB0byAxIHRvIGVuYWJsZSBUcnVzdFpvbmUgb3IgMCB0byBkaXNhYmxlIFRydXN0Wm9uZS4KKyNlbmRpZiAvKiBjb25maWdFTkFCTEVfVFJVU1RaT05FICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAqIEBicmllZiBUeXBlIGRlZmluaXRpb25zLgorICovCisjZGVmaW5lIHBvcnRDSEFSCQkJCQkJCQkJCQljaGFyCisjZGVmaW5lIHBvcnRGTE9BVAkJCQkJCQkJCQkJZmxvYXQKKyNkZWZpbmUgcG9ydERPVUJMRQkJCQkJCQkJCQkJZG91YmxlCisjZGVmaW5lIHBvcnRMT05HCQkJCQkJCQkJCQlsb25nCisjZGVmaW5lIHBvcnRTSE9SVAkJCQkJCQkJCQkJc2hvcnQKKyNkZWZpbmUgcG9ydFNUQUNLX1RZUEUJCQkJCQkJCQkJdWludDMyX3QKKyNkZWZpbmUgcG9ydEJBU0VfVFlQRQkJCQkJCQkJCQlsb25nCisKK3R5cGVkZWYgcG9ydFNUQUNLX1RZUEUJCQkJCQkJCQkJU3RhY2tUeXBlX3Q7Cit0eXBlZGVmIGxvbmcJCQkJCQkJCQkJCQlCYXNlVHlwZV90OwordHlwZWRlZiB1bnNpZ25lZCBsb25nCQkJCQkJCQkJCVVCYXNlVHlwZV90OworCisjaWYoIGNvbmZpZ1VTRV8xNl9CSVRfVElDS1MgPT0gMSApCisJdHlwZWRlZiB1aW50MTZfdCBUaWNrVHlwZV90OworCSNkZWZpbmUgcG9ydE1BWF9ERUxBWSAoIFRpY2tUeXBlX3QgKQkJCQkJMHhmZmZmCisjZWxzZQorCXR5cGVkZWYgdWludDMyX3QgVGlja1R5cGVfdDsKKwkjZGVmaW5lIHBvcnRNQVhfREVMQVkgKCBUaWNrVHlwZV90ICkJCQkJCTB4ZmZmZmZmZmZVTAorCisJLyogMzItYml0IHRpY2sgdHlwZSBvbiBhIDMyLWJpdCBhcmNoaXRlY3R1cmUsIHNvIHJlYWRzIG9mIHRoZSB0aWNrIGNvdW50IGRvCisJICogbm90IG5lZWQgdG8gYmUgZ3VhcmRlZCB3aXRoIGEgY3JpdGljYWwgc2VjdGlvbi4gKi8KKwkjZGVmaW5lIHBvcnRUSUNLX1RZUEVfSVNfQVRPTUlDCQkJCQkJCTEKKyNlbmRpZgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKgorICogQXJjaGl0ZWN0dXJlIHNwZWNpZmljcy4KKyAqLworI2RlZmluZSBwb3J0QVJDSF9OQU1FCQkJCQkJCQkJCSJDb3J0ZXgtTTIzIgorI2RlZmluZSBwb3J0U1RBQ0tfR1JPV1RICQkJCQkJCQkJKCAtMSApCisjZGVmaW5lIHBvcnRUSUNLX1BFUklPRF9NUwkJCQkJCQkJCSggKCBUaWNrVHlwZV90ICkgMTAwMCAvIGNvbmZpZ1RJQ0tfUkFURV9IWiApCisjZGVmaW5lIHBvcnRCWVRFX0FMSUdOTUVOVAkJCQkJCQkJCTgKKyNkZWZpbmUgcG9ydE5PUCgpCisjZGVmaW5lIHBvcnRJTkxJTkUJCQkJCQkJCQkJCV9faW5saW5lCisjaWZuZGVmIHBvcnRGT1JDRV9JTkxJTkUKKwkjZGVmaW5lIHBvcnRGT1JDRV9JTkxJTkUJCQkJCQkJCWlubGluZSBfX2F0dHJpYnV0ZV9fKCggYWx3YXlzX2lubGluZSApKQorI2VuZGlmCisjZGVmaW5lIHBvcnRIQVNfU1RBQ0tfT1ZFUkZMT1dfQ0hFQ0tJTkcJCQkJCQkxCisjZGVmaW5lIHBvcnRET05UX0RJU0NBUkQJCQkJCQkJCQlfX2F0dHJpYnV0ZV9fKCggdXNlZCApKQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKgorICogQGJyaWVmIEV4dGVybiBkZWNsYXJhdGlvbnMuCisgKi8KK2V4dGVybiB2b2lkIHZQb3J0WWllbGQoIHZvaWQgKSAvKiBQUklWSUxFR0VEX0ZVTkNUSU9OICovOworCitleHRlcm4gdm9pZCB2UG9ydEVudGVyQ3JpdGljYWwoIHZvaWQgKSAvKiBQUklWSUxFR0VEX0ZVTkNUSU9OICovOworZXh0ZXJuIHZvaWQgdlBvcnRFeGl0Q3JpdGljYWwoIHZvaWQgKSAvKiBQUklWSUxFR0VEX0ZVTkNUSU9OICovOworCitleHRlcm4gdWludDMyX3QgdWxTZXRJbnRlcnJ1cHRNYXNrRnJvbUlTUiggdm9pZCApIC8qIF9fYXR0cmlidXRlX18oKCBuYWtlZCApKSBQUklWSUxFR0VEX0ZVTkNUSU9OICovOworZXh0ZXJuIHZvaWQgdkNsZWFySW50ZXJydXB0TWFza0Zyb21JU1IoIHVpbnQzMl90IHVsTWFzayApIC8qIF9fYXR0cmlidXRlX18oKCBuYWtlZCApKSBQUklWSUxFR0VEX0ZVTkNUSU9OICovOworCisjaWYoIGNvbmZpZ0VOQUJMRV9UUlVTVFpPTkUgPT0gMSApCisJZXh0ZXJuIHZvaWQgdlBvcnRBbGxvY2F0ZVNlY3VyZUNvbnRleHQoIHVpbnQzMl90IHVsU2VjdXJlU3RhY2tTaXplICk7IC8qIF9fYXR0cmlidXRlX18gKCggbmFrZWQgKSkgKi8KKwlleHRlcm4gdm9pZCB2UG9ydEZyZWVTZWN1cmVDb250ZXh0KCB1aW50MzJfdCAqcHVsVENCICkgLyogX19hdHRyaWJ1dGVfXyAoKCBuYWtlZCApKSBQUklWSUxFR0VEX0ZVTkNUSU9OICovOworI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9UUlVTVFpPTkUgKi8KKworI2lmKCBjb25maWdFTkFCTEVfTVBVID09IDEgKQorCWV4dGVybiBCYXNlVHlwZV90IHhJc1ByaXZpbGVnZWQoIHZvaWQgKSAvKiBfX2F0dHJpYnV0ZV9fICgoIG5ha2VkICkpICovOworCWV4dGVybiB2b2lkIHZSZXNldFByaXZpbGVnZSggdm9pZCApIC8qIF9fYXR0cmlidXRlX18gKCggbmFrZWQgKSkgKi87CisjZW5kaWYgLyogY29uZmlnRU5BQkxFX01QVSAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKgorICogQGJyaWVmIE1QVSBzcGVjaWZpYyBjb25zdGFudHMuCisgKi8KKyNpZiggY29uZmlnRU5BQkxFX01QVSA9PSAxICkKKwkjZGVmaW5lIHBvcnRVU0lOR19NUFVfV1JBUFBFUlMJCQkJCQkJMQorCSNkZWZpbmUgcG9ydFBSSVZJTEVHRV9CSVQJCQkJCQkJCSggMHg4MDAwMDAwMFVMICkKKyNlbHNlCisJI2RlZmluZSBwb3J0UFJJVklMRUdFX0JJVAkJCQkJCQkJKCAweDBVTCApCisjZW5kaWYgLyogY29uZmlnRU5BQkxFX01QVSAqLworCisKKy8qIE1QVSByZWdpb25zLiAqLworI2RlZmluZSBwb3J0UFJJVklMRUdFRF9GTEFTSF9SRUdJT04JCQkJCQkJKCAwVUwgKQorI2RlZmluZSBwb3J0VU5QUklWSUxFR0VEX0ZMQVNIX1JFR0lPTgkJCQkJCSggMVVMICkKKyNkZWZpbmUgcG9ydFVOUFJJVklMRUdFRF9TWVNDQUxMU19SRUdJT04JCQkJCSggMlVMICkKKyNkZWZpbmUgcG9ydFBSSVZJTEVHRURfUkFNX1JFR0lPTgkJCQkJCQkoIDNVTCApCisjZGVmaW5lIHBvcnRTVEFDS19SRUdJT04JCQkJCQkJCQkoIDRVTCApCisjZGVmaW5lIHBvcnRGSVJTVF9DT05GSUdVUkFCTEVfUkVHSU9OCQkJCQkJKCA1VUwgKQorI2RlZmluZSBwb3J0TEFTVF9DT05GSUdVUkFCTEVfUkVHSU9OCQkJCQkJKCA3VUwgKQorI2RlZmluZSBwb3J0TlVNX0NPTkZJR1VSQUJMRV9SRUdJT05TCQkJCQkJKCAoIHBvcnRMQVNUX0NPTkZJR1VSQUJMRV9SRUdJT04gLSBwb3J0RklSU1RfQ09ORklHVVJBQkxFX1JFR0lPTiApICsgMSApCisjZGVmaW5lIHBvcnRUT1RBTF9OVU1fUkVHSU9OUwkJCQkJCQkJKCBwb3J0TlVNX0NPTkZJR1VSQUJMRV9SRUdJT05TICsgMSApIC8qIFBsdXMgb25lIHRvIG1ha2Ugc3BhY2UgZm9yIHRoZSBzdGFjayByZWdpb24uICovCisKKy8qIERldmljZSBtZW1vcnkgYXR0cmlidXRlcyB1c2VkIGluIE1QVV9NQUlSIHJlZ2lzdGVycy4KKyAqCisgKiA4LWJpdCB2YWx1ZXMgZW5jb2RlZCBhcyBmb2xsb3dzOgorICogIEJpdFs3OjRdIC0gMDAwMCAtIERldmljZSBNZW1vcnkKKyAqICBCaXRbMzoyXSAtIDAwIC0tPiBEZXZpY2UtbkduUm5FCisgKgkJCQkwMSAtLT4gRGV2aWNlLW5HblJFCisgKgkJCQkxMCAtLT4gRGV2aWNlLW5HUkUKKyAqCQkJCTExIC0tPiBEZXZpY2UtR1JFCisgKiAgQml0WzE6MF0gLSAwMCwgUmVzZXJ2ZWQuCisgKi8KKyNkZWZpbmUgcG9ydE1QVV9ERVZJQ0VfTUVNT1JZX25HblJuRQkJCQkJCSggMHgwMCApIC8qIDAwMDAgMDAwMCAqLworI2RlZmluZSBwb3J0TVBVX0RFVklDRV9NRU1PUllfbkduUkUJCQkJCQkJKCAweDA0ICkgLyogMDAwMCAwMTAwICovCisjZGVmaW5lIHBvcnRNUFVfREVWSUNFX01FTU9SWV9uR1JFCQkJCQkJCSggMHgwOCApIC8qIDAwMDAgMTAwMCAqLworI2RlZmluZSBwb3J0TVBVX0RFVklDRV9NRU1PUllfR1JFCQkJCQkJCSggMHgwQyApIC8qIDAwMDAgMTEwMCAqLworCisvKiBOb3JtYWwgbWVtb3J5IGF0dHJpYnV0ZXMgdXNlZCBpbiBNUFVfTUFJUiByZWdpc3RlcnMuICovCisjZGVmaW5lIHBvcnRNUFVfTk9STUFMX01FTU9SWV9OT05fQ0FDSEVBQkxFCQkJCQkoIDB4NDQgKSAvKiBOb24tY2FjaGVhYmxlLiAqLworI2RlZmluZSBwb3J0TVBVX05PUk1BTF9NRU1PUllfQlVGRkVSQUJMRV9DQUNIRUFCTEUJCQkoIDB4RkYgKSAvKiBOb24tVHJhbnNpZW50LCBXcml0ZS1iYWNrLCBSZWFkLUFsbG9jYXRlIGFuZCBXcml0ZS1BbGxvY2F0ZS4gKi8KKworLyogQXR0cmlidXRlcyB1c2VkIGluIE1QVV9SQkFSIHJlZ2lzdGVycy4gKi8KKyNkZWZpbmUgcG9ydE1QVV9SRUdJT05fTk9OX1NIQVJFQUJMRQkJCQkJCSggMFVMIDw8IDNVTCApCisjZGVmaW5lIHBvcnRNUFVfUkVHSU9OX0lOTkVSX1NIQVJFQUJMRQkJCQkJCSggMVVMIDw8IDNVTCApCisjZGVmaW5lIHBvcnRNUFVfUkVHSU9OX09VVEVSX1NIQVJFQUJMRQkJCQkJCSggMlVMIDw8IDNVTCApCisKKyNkZWZpbmUgcG9ydE1QVV9SRUdJT05fUFJJVklMRUdFRF9SRUFEX1dSSVRFCQkJCSggMFVMIDw8IDFVTCApCisjZGVmaW5lIHBvcnRNUFVfUkVHSU9OX1JFQURfV1JJVEUJCQkJCQkJKCAxVUwgPDwgMVVMICkKKyNkZWZpbmUgcG9ydE1QVV9SRUdJT05fUFJJVklMRUdFRF9SRUFEX09OTFkJCQkJCSggMlVMIDw8IDFVTCApCisjZGVmaW5lIHBvcnRNUFVfUkVHSU9OX1JFQURfT05MWQkJCQkJCQkoIDNVTCA8PCAxVUwgKQorCisjZGVmaW5lIHBvcnRNUFVfUkVHSU9OX0VYRUNVVEVfTkVWRVIJCQkJCQkoIDFVTCApCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqCisgKiBAYnJpZWYgU2V0dGluZ3MgdG8gZGVmaW5lIGFuIE1QVSByZWdpb24uCisgKi8KK3R5cGVkZWYgc3RydWN0IE1QVVJlZ2lvblNldHRpbmdzCit7CisJdWludDMyX3QgdWxSQkFSOwkvKio8IFJCQVIgZm9yIHRoZSByZWdpb24uICovCisJdWludDMyX3QgdWxSTEFSOwkvKio8IFJMQVIgZm9yIHRoZSByZWdpb24uICovCit9IE1QVVJlZ2lvblNldHRpbmdzX3Q7CisKKy8qKgorICogQGJyaWVmIE1QVSBzZXR0aW5ncyBhcyBzdG9yZWQgaW4gdGhlIFRDQi4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgTVBVX1NFVFRJTkdTCit7CisJdWludDMyX3QgdWxNQUlSMDsJLyoqPCBNQUlSMCBmb3IgdGhlIHRhc2sgY29udGFpbmluZyBhdHRyaWJ1dGVzIGZvciBhbGwgdGhlIDQgcGVyIHRhc2sgcmVnaW9ucy4gKi8KKwlNUFVSZWdpb25TZXR0aW5nc190IHhSZWdpb25zU2V0dGluZ3NbIHBvcnRUT1RBTF9OVU1fUkVHSU9OUyBdOyAvKio8IFNldHRpbmdzIGZvciA0IHBlciB0YXNrIHJlZ2lvbnMuICovCit9IHhNUFVfU0VUVElOR1M7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqCisgKiBAYnJpZWYgU1ZDIG51bWJlcnMuCisgKi8KKyNkZWZpbmUgcG9ydFNWQ19BTExPQ0FURV9TRUNVUkVfQ09OVEVYVAkJCQkJCTAKKyNkZWZpbmUgcG9ydFNWQ19GUkVFX1NFQ1VSRV9DT05URVhUCQkJCQkJCTEKKyNkZWZpbmUgcG9ydFNWQ19TVEFSVF9TQ0hFRFVMRVIJCQkJCQkJCTIKKyNkZWZpbmUgcG9ydFNWQ19SQUlTRV9QUklWSUxFR0UJCQkJCQkJCTMKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAqIEBicmllZiBTY2hlZHVsZXIgdXRpbGl0aWVzLgorICovCisjZGVmaW5lIHBvcnRZSUVMRCgpCQkJCQkJCQkJCQl2UG9ydFlpZWxkKCkKKyNkZWZpbmUgcG9ydE5WSUNfSU5UX0NUUkxfUkVHCQkJCQkJCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZDA0ICkgKQorI2RlZmluZSBwb3J0TlZJQ19QRU5EU1ZTRVRfQklUCQkJCQkJCQkoIDFVTCA8PCAyOFVMICkKKyNkZWZpbmUgcG9ydEVORF9TV0lUQ0hJTkdfSVNSKCB4U3dpdGNoUmVxdWlyZWQgKQkJCWlmKCB4U3dpdGNoUmVxdWlyZWQgKSBwb3J0TlZJQ19JTlRfQ1RSTF9SRUcgPSBwb3J0TlZJQ19QRU5EU1ZTRVRfQklUCisjZGVmaW5lIHBvcnRZSUVMRF9GUk9NX0lTUiggeCApCQkJCQkJCQlwb3J0RU5EX1NXSVRDSElOR19JU1IoIHggKQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKgorICogQGJyaWVmIENyaXRpY2FsIHNlY3Rpb24gbWFuYWdlbWVudC4KKyAqLworI2RlZmluZSBwb3J0U0VUX0lOVEVSUlVQVF9NQVNLX0ZST01fSVNSKCkJCQkJCXVsU2V0SW50ZXJydXB0TWFza0Zyb21JU1IoKQorI2RlZmluZSBwb3J0Q0xFQVJfSU5URVJSVVBUX01BU0tfRlJPTV9JU1IoeCkJCQkJdkNsZWFySW50ZXJydXB0TWFza0Zyb21JU1IoIHggKQorI2RlZmluZSBwb3J0RElTQUJMRV9JTlRFUlJVUFRTKCkJCQkJCQkJX19hc20gdm9sYXRpbGUgKCAiIGNwc2lkIGkgIiA6OjogIm1lbW9yeSIgKQorI2RlZmluZSBwb3J0RU5BQkxFX0lOVEVSUlVQVFMoKQkJCQkJCQkJX19hc20gdm9sYXRpbGUgKCAiIGNwc2llIGkgIiA6OjogIm1lbW9yeSIgKQorI2RlZmluZSBwb3J0RU5URVJfQ1JJVElDQUwoKQkJCQkJCQkJdlBvcnRFbnRlckNyaXRpY2FsKCkKKyNkZWZpbmUgcG9ydEVYSVRfQ1JJVElDQUwoKQkJCQkJCQkJCXZQb3J0RXhpdENyaXRpY2FsKCkKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAqIEBicmllZiBUYXNrIGZ1bmN0aW9uIG1hY3JvcyBhcyBkZXNjcmliZWQgb24gdGhlIEZyZWVSVE9TLm9yZyBXRUIgc2l0ZS4KKyAqLworI2RlZmluZSBwb3J0VEFTS19GVU5DVElPTl9QUk9UTyggdkZ1bmN0aW9uLCBwdlBhcmFtZXRlcnMgKQl2b2lkIHZGdW5jdGlvbiggdm9pZCAqcHZQYXJhbWV0ZXJzICkKKyNkZWZpbmUgcG9ydFRBU0tfRlVOQ1RJT04oIHZGdW5jdGlvbiwgcHZQYXJhbWV0ZXJzICkJCXZvaWQgdkZ1bmN0aW9uKCB2b2lkICpwdlBhcmFtZXRlcnMgKQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiggY29uZmlnRU5BQkxFX1RSVVNUWk9ORSA9PSAxICkKKwkvKioKKwkgKiBAYnJpZWYgQWxsb2NhdGUgYSBzZWN1cmUgY29udGV4dCBmb3IgdGhlIHRhc2suCisJICoKKwkgKiBUYXNrcyBhcmUgbm90IGNyZWF0ZWQgd2l0aCBhIHNlY3VyZSBjb250ZXh0LiBBbnkgdGFzayB0aGF0IGlzIGdvaW5nIHRvIGNhbGwKKwkgKiBzZWN1cmUgZnVuY3Rpb25zIG11c3QgY2FsbCBwb3J0QUxMT0NBVEVfU0VDVVJFX0NPTlRFWFQoKSB0byBhbGxvY2F0ZSBpdHNlbGYgYQorCSAqIHNlY3VyZSBjb250ZXh0IGJlZm9yZSBpdCBjYWxscyBhbnkgc2VjdXJlIGZ1bmN0aW9uLgorCSAqCisJICogQHBhcmFtW2luXSB1bFNlY3VyZVN0YWNrU2l6ZSBUaGUgc2l6ZSBvZiB0aGUgc2VjdXJlIHN0YWNrIHRvIGJlIGFsbG9jYXRlZC4KKwkgKi8KKwkjZGVmaW5lIHBvcnRBTExPQ0FURV9TRUNVUkVfQ09OVEVYVCggdWxTZWN1cmVTdGFja1NpemUgKQl2UG9ydEFsbG9jYXRlU2VjdXJlQ29udGV4dCggdWxTZWN1cmVTdGFja1NpemUgKQorCisJLyoqCisJICogQGJyaWVmIENhbGxlZCB3aGVuIGEgdGFzayBpcyBkZWxldGVkIHRvIGRlbGV0ZSB0aGUgdGFzaydzIHNlY3VyZSBjb250ZXh0LAorCSAqIGlmIGl0IGhhcyBvbmUuCisJICoKKwkgKiBAcGFyYW1baW5dIHB4VENCIFRoZSBUQ0Igb2YgdGhlIHRhc2sgYmVpbmcgZGVsZXRlZC4KKwkgKi8KKwkjZGVmaW5lIHBvcnRDTEVBTl9VUF9UQ0IoIHB4VENCICkJCQkJCQkJdlBvcnRGcmVlU2VjdXJlQ29udGV4dCggKCB1aW50MzJfdCAqICkgcHhUQ0IgKQorI2Vsc2UKKwkjZGVmaW5lIHBvcnRBTExPQ0FURV9TRUNVUkVfQ09OVEVYVCggdWxTZWN1cmVTdGFja1NpemUgKQorCSNkZWZpbmUgcG9ydENMRUFOX1VQX1RDQiggcHhUQ0IgKQorI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9UUlVTVFpPTkUgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYoIGNvbmZpZ0VOQUJMRV9NUFUgPT0gMSApCisJLyoqCisJICogQGJyaWVmIENoZWNrcyB3aGV0aGVyIG9yIG5vdCB0aGUgcHJvY2Vzc29yIGlzIHByaXZpbGVnZWQuCisJICoKKwkgKiBAcmV0dXJuIDEgaWYgdGhlIHByb2Nlc3NvciBpcyBhbHJlYWR5IHByaXZpbGVnZWQsIDAgb3RoZXJ3aXNlLgorCSAqLworCSNkZWZpbmUgcG9ydElTX1BSSVZJTEVHRUQoKQkJCQkJCQkJCXhJc1ByaXZpbGVnZWQoKQorCisJLyoqCisJICogQGJyaWVmIFJhaXNlIGFuIFNWQyByZXF1ZXN0IHRvIHJhaXNlIHByaXZpbGVnZS4KKwkgKgorCSAqIFRoZSBTVkMgaGFuZGxlciBjaGVja3MgdGhhdCB0aGUgU1ZDIHdhcyByYWlzZWQgZnJvbSBhIHN5c3RlbSBjYWxsIGFuZCBvbmx5CisJICogdGhlbiBpdCByYWlzZXMgdGhlIHByaXZpbGVnZS4gSWYgdGhpcyBpcyBjYWxsZWQgZnJvbSBhbnkgb3RoZXIgcGxhY2UsCisJICogdGhlIHByaXZpbGVnZSBpcyBub3QgcmFpc2VkLgorCSAqLworCSNkZWZpbmUgcG9ydFJBSVNFX1BSSVZJTEVHRSgpCQkJCQkJCQlfX2FzbSB2b2xhdGlsZSAoICJzdmMgJTAgXG4iIDo6ICJpIiAoIHBvcnRTVkNfUkFJU0VfUFJJVklMRUdFICkgOiAibWVtb3J5IiApOworCisJLyoqCisJICogQGJyaWVmIExvd2VycyB0aGUgcHJpdmlsZWdlIGxldmVsIGJ5IHNldHRpbmcgdGhlIGJpdCAwIG9mIHRoZSBDT05UUk9MCisJICogcmVnaXN0ZXIuCisJICovCisJI2RlZmluZSBwb3J0UkVTRVRfUFJJVklMRUdFKCkJCQkJCQkJCXZSZXNldFByaXZpbGVnZSgpCisjZWxzZQorCSNkZWZpbmUgcG9ydElTX1BSSVZJTEVHRUQoKQorCSNkZWZpbmUgcG9ydFJBSVNFX1BSSVZJTEVHRSgpCisJI2RlZmluZSBwb3J0UkVTRVRfUFJJVklMRUdFKCkKKyNlbmRpZiAvKiBjb25maWdFTkFCTEVfTVBVICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqCisgKiBAYnJpZWYgQmFycmllcnMuCisgKi8KKyNkZWZpbmUgcG9ydE1FTU9SWV9CQVJSSUVSKCkgX19hc20gdm9sYXRpbGUoICIiIDo6OiAibWVtb3J5IiApCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFBPUlRNQUNST19IICovCmRpZmYgLS1naXQgYS9Tb3VyY2UvcG9ydGFibGUvR0NDL0FSTV9DTTMvcG9ydC5jIGIvU291cmNlL3BvcnRhYmxlL0dDQy9BUk1fQ00zL3BvcnQuYwppbmRleCBkNzcwOWMwLi43NDUxZmVlIDEwMDY0NAotLS0gYS9Tb3VyY2UvcG9ydGFibGUvR0NDL0FSTV9DTTMvcG9ydC5jCisrKyBiL1NvdXJjZS9wb3J0YWJsZS9HQ0MvQVJNX0NNMy9wb3J0LmMKQEAgLTEsNiArMSw2IEBACiAvKgotICogRnJlZVJUT1MgS2VybmVsIFYxMC4wLjEKLSAqIENvcHlyaWdodCAoQykgMjAxNyBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMi4xCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgogICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgogICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KZGlmZiAtLWdpdCBhL1NvdXJjZS9wb3J0YWJsZS9HQ0MvQVJNX0NNMy9wb3J0bWFjcm8uaCBiL1NvdXJjZS9wb3J0YWJsZS9HQ0MvQVJNX0NNMy9wb3J0bWFjcm8uaAppbmRleCA3N2E1ZDI3Li5mMWJlY2IzIDEwMDY0NAotLS0gYS9Tb3VyY2UvcG9ydGFibGUvR0NDL0FSTV9DTTMvcG9ydG1hY3JvLmgKKysrIGIvU291cmNlL3BvcnRhYmxlL0dDQy9BUk1fQ00zL3BvcnRtYWNyby5oCkBAIC0xLDYgKzEsNiBAQAogLyoKLSAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMC4xCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjIuMQorICogQ29weXJpZ2h0IChDKSAyMDE5IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKICAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKICAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCkBAIC0yMzMsNiArMjMzLDcgQEAKIH0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCisjZGVmaW5lIHBvcnRNRU1PUllfQkFSUklFUigpIF9fYXNtIHZvbGF0aWxlKCAiIiA6OjogIm1lbW9yeSIgKQogCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KZGlmZiAtLWdpdCBhL1NvdXJjZS9wb3J0YWJsZS9HQ0MvQVJNX0NNMzMvbm9uX3NlY3VyZS9wb3J0LmMgYi9Tb3VyY2UvcG9ydGFibGUvR0NDL0FSTV9DTTMzL25vbl9zZWN1cmUvcG9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkODVhNmYKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvcG9ydGFibGUvR0NDL0FSTV9DTTMzL25vbl9zZWN1cmUvcG9ydC5jCkBAIC0wLDAgKzEsODk5IEBACisvKgorICogRnJlZVJUT1MgS2VybmVsIFYxMC4yLjEKKyAqIENvcHlyaWdodCAoQykgMjAxOSBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCisgKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgorICogdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bworICogdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YKKyAqIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKKyAqIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAorICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MKKyAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUgorICogQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSCisgKiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBodHRwOi8vd3d3LkZyZWVSVE9TLm9yZworICogaHR0cDovL2F3cy5hbWF6b24uY29tL2ZyZWVydG9zCisgKgorICogMSB0YWIgPT0gNCBzcGFjZXMhCisgKi8KKworLyogRGVmaW5pbmcgTVBVX1dSQVBQRVJTX0lOQ0xVREVEX0ZST01fQVBJX0ZJTEUgcHJldmVudHMgdGFzay5oIGZyb20gcmVkZWZpbmluZworICogYWxsIHRoZSBBUEkgZnVuY3Rpb25zIHRvIHVzZSB0aGUgTVBVIHdyYXBwZXJzLiBUaGF0IHNob3VsZCBvbmx5IGJlIGRvbmUgd2hlbgorICogdGFzay5oIGlzIGluY2x1ZGVkIGZyb20gYW4gYXBwbGljYXRpb24gZmlsZS4gKi8KKyNkZWZpbmUgTVBVX1dSQVBQRVJTX0lOQ0xVREVEX0ZST01fQVBJX0ZJTEUKKworLyogU2NoZWR1bGVyIGluY2x1ZGVzLiAqLworI2luY2x1ZGUgIkZyZWVSVE9TLmgiCisjaW5jbHVkZSAidGFzay5oIgorCisvKiBNUFUgd3JhcHBlcnMgaW5jbHVkZXMuICovCisjaW5jbHVkZSAibXB1X3dyYXBwZXJzLmgiCisKKy8qIFBvcnRhc20gaW5jbHVkZXMuICovCisjaW5jbHVkZSAicG9ydGFzbS5oIgorCisjaWYoIGNvbmZpZ0VOQUJMRV9UUlVTVFpPTkUgPT0gMSApCisJLyogU2VjdXJlIGNvbXBvbmVudHMgaW5jbHVkZXMuICovCisJI2luY2x1ZGUgInNlY3VyZV9jb250ZXh0LmgiCisJI2luY2x1ZGUgInNlY3VyZV9pbml0LmgiCisjZW5kaWYgLyogY29uZmlnRU5BQkxFX1RSVVNUWk9ORSAqLworCisjdW5kZWYgTVBVX1dSQVBQRVJTX0lOQ0xVREVEX0ZST01fQVBJX0ZJTEUKKworLyoqCisgKiBUaGUgRnJlZVJUT1MgQ29ydGV4IE0zMyBwb3J0IGNhbiBiZSBjb25maWd1cmVkIHRvIHJ1biBvbiB0aGUgU2VjdXJlIFNpZGUgb25seQorICogaS5lLiB0aGUgcHJvY2Vzc29yIGJvb3RzIGFzIHNlY3VyZSBhbmQgbmV2ZXIganVtcHMgdG8gdGhlIG5vbi1zZWN1cmUgc2lkZS4KKyAqIFRoZSBUcnVzdCBab25lIHN1cHBvcnQgaW4gdGhlIHBvcnQgbXVzdCBiZSBkaXNhYmxlZCBpbiBvcmRlciB0byBydW4gRnJlZVJUT1MKKyAqIG9uIHRoZSBzZWN1cmUgc2lkZS4gVGhlIGZvbGxvd2luZyBhcmUgdGhlIHZhbGlkIGNvbmZpZ3VyYXRpb24gc2VldGluZ3M6CisgKgorICogMS4gUnVuIEZyZWVSVE9TIG9uIHRoZSBTZWN1cmUgU2lkZToKKyAqCQljb25maWdSVU5fRlJFRVJUT1NfU0VDVVJFX09OTFkgPSAxIGFuZCBjb25maWdFTkFCTEVfVFJVU1RaT05FID0gMAorICoKKyAqIDIuIFJ1biBGcmVlUlRPUyBvbiB0aGUgTm9uLVNlY3VyZSBTaWRlIHdpdGggU2VjdXJlIFNpZGUgZnVuY3Rpb24gY2FsbCBzdXBwb3J0OgorICoJCWNvbmZpZ1JVTl9GUkVFUlRPU19TRUNVUkVfT05MWSA9IDAgYW5kIGNvbmZpZ0VOQUJMRV9UUlVTVFpPTkUgPSAxCisgKgorICogMy4gUnVuIEZyZWVSVE9TIG9uIHRoZSBOb24tU2VjdXJlIFNpZGUgb25seSBpLmUuIG5vIFNlY3VyZSBTaWRlIGZ1bmN0aW9uIGNhbGwgc3VwcG9ydDoKKyAqCQljb25maWdSVU5fRlJFRVJUT1NfU0VDVVJFX09OTFkgPSAwIGFuZCBjb25maWdFTkFCTEVfVFJVU1RaT05FID0gMAorICovCisjaWYoICggY29uZmlnUlVOX0ZSRUVSVE9TX1NFQ1VSRV9PTkxZID09IDEgKSAmJiAoIGNvbmZpZ0VOQUJMRV9UUlVTVFpPTkUgPT0gMSApICkKKwkjZXJyb3IgVHJ1c3Rab25lIG5lZWRzIHRvIGJlIGRpc2FibGVkIGluIG9yZGVyIHRvIHJ1biBGcmVlUlRPUyBvbiB0aGUgU2VjdXJlIFNpZGUuCisjZW5kaWYKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAqIEBicmllZiBDb25zdGFudHMgcmVxdWlyZWQgdG8gbWFuaXB1bGF0ZSB0aGUgTlZJQy4KKyAqLworI2RlZmluZSBwb3J0TlZJQ19TWVNUSUNLX0NUUkwJCQkJKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlMDEwICkKKyNkZWZpbmUgcG9ydE5WSUNfU1lTVElDS19MT0FECQkJCSggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZTAxNCApCisjZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfQ1VSUkVOVF9WQUxVRQkJKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlMDE4ICkKKyNkZWZpbmUgcG9ydE5WSUNfSU5UX0NUUkwJCQkJCSggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZWQwNCApCisjZGVmaW5lIHBvcnROVklDX1NZU1BSSTIJCQkJCSggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZWQyMCApCisjZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfQ0xLCQkJCSggMHgwMDAwMDAwNCApCisjZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfSU5UCQkJCSggMHgwMDAwMDAwMiApCisjZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfRU5BQkxFCQkJCSggMHgwMDAwMDAwMSApCisjZGVmaW5lIHBvcnROVklDX1BFTkRTVlNFVAkJCQkJKCAweDEwMDAwMDAwICkKKyNkZWZpbmUgcG9ydE1JTl9JTlRFUlJVUFRfUFJJT1JJVFkJCQkoIDI1NVVMICkKKyNkZWZpbmUgcG9ydE5WSUNfUEVORFNWX1BSSQkJCQkJKCBwb3J0TUlOX0lOVEVSUlVQVF9QUklPUklUWSA8PCAxNlVMICkKKyNkZWZpbmUgcG9ydE5WSUNfU1lTVElDS19QUkkJCQkJKCBwb3J0TUlOX0lOVEVSUlVQVF9QUklPUklUWSA8PCAyNFVMICkKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAqIEBicmllZiBDb25zdGFudHMgcmVxdWlyZWQgdG8gbWFuaXB1bGF0ZSB0aGUgU0NCLgorICovCisjZGVmaW5lIHBvcnRTQ0JfU1lTX0hBTkRMRVJfQ1RSTF9TVEFURV9SRUcJKCAqICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVkMjQgKQorI2RlZmluZSBwb3J0U0NCX01FTV9GQVVMVF9FTkFCTEUJCQkoIDFVTCA8PCAxNlVMICkKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAqIEBicmllZiBDb25zdGFudHMgcmVxdWlyZWQgdG8gbWFuaXB1bGF0ZSB0aGUgRlBVLgorICovCisjZGVmaW5lIHBvcnRDUEFDUgkJCQkJCQkoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVkODggKQkvKiBDb3Byb2Nlc3NvciBBY2Nlc3MgQ29udHJvbCBSZWdpc3Rlci4gKi8KKyNkZWZpbmUgcG9ydENQQUNSX0NQMTBfVkFMVUUJCQkJKCAzVUwgKQorI2RlZmluZSBwb3J0Q1BBQ1JfQ1AxMV9WQUxVRQkJCQlwb3J0Q1BBQ1JfQ1AxMF9WQUxVRQorI2RlZmluZSBwb3J0Q1BBQ1JfQ1AxMF9QT1MJCQkJCSggMjBVTCApCisjZGVmaW5lIHBvcnRDUEFDUl9DUDExX1BPUwkJCQkJKCAyMlVMICkKKworI2RlZmluZSBwb3J0RlBDQ1IJCQkJCQkJKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZjM0ICkJLyogRmxvYXRpbmcgUG9pbnQgQ29udGV4dCBDb250cm9sIFJlZ2lzdGVyLiAqLworI2RlZmluZSBwb3J0RlBDQ1JfQVNQRU5fUE9TCQkJCQkoIDMxVUwgKQorI2RlZmluZSBwb3J0RlBDQ1JfQVNQRU5fTUFTSwkJCQkoIDFVTCA8PCBwb3J0RlBDQ1JfQVNQRU5fUE9TICkKKyNkZWZpbmUgcG9ydEZQQ0NSX0xTUEVOX1BPUwkJCQkJKCAzMFVMICkKKyNkZWZpbmUgcG9ydEZQQ0NSX0xTUEVOX01BU0sJCQkJKCAxVUwgPDwgcG9ydEZQQ0NSX0xTUEVOX1BPUyApCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqCisgKiBAYnJpZWYgQ29uc3RhbnRzIHJlcXVpcmVkIHRvIG1hbmlwdWxhdGUgdGhlIE1QVS4KKyAqLworI2RlZmluZSBwb3J0TVBVX1RZUEVfUkVHCQkJCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZDkwICkgKQorI2RlZmluZSBwb3J0TVBVX0NUUkxfUkVHCQkJCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZDk0ICkgKQorI2RlZmluZSBwb3J0TVBVX1JOUl9SRUcJCQkJCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZDk4ICkgKQorCisjZGVmaW5lIHBvcnRNUFVfUkJBUl9SRUcJCQkJCSggKiAoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVkOWMgKSApCisjZGVmaW5lIHBvcnRNUFVfUkxBUl9SRUcJCQkJCSggKiAoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVkYTAgKSApCisKKyNkZWZpbmUgcG9ydE1QVV9SQkFSX0ExX1JFRwkJCQkJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZWRhNCApICkKKyNkZWZpbmUgcG9ydE1QVV9STEFSX0ExX1JFRwkJCQkJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZWRhOCApICkKKworI2RlZmluZSBwb3J0TVBVX1JCQVJfQTJfUkVHCQkJCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZGFjICkgKQorI2RlZmluZSBwb3J0TVBVX1JMQVJfQTJfUkVHCQkJCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZGIwICkgKQorCisjZGVmaW5lIHBvcnRNUFVfUkJBUl9BM19SRUcJCQkJCSggKiAoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVkYjQgKSApCisjZGVmaW5lIHBvcnRNUFVfUkxBUl9BM19SRUcJCQkJCSggKiAoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVkYjggKSApCisKKyNkZWZpbmUgcG9ydE1QVV9NQUlSMF9SRUcJCQkJCSggKiAoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVkYzAgKSApCisjZGVmaW5lIHBvcnRNUFVfTUFJUjFfUkVHCQkJCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZGM0ICkgKQorCisjZGVmaW5lIHBvcnRNUFVfUkJBUl9BRERSRVNTX01BU0sJCQkoIDB4ZmZmZmZmZTAgKSAvKiBNdXN0IGJlIDMyLWJ5dGUgYWxpZ25lZC4gKi8KKyNkZWZpbmUgcG9ydE1QVV9STEFSX0FERFJFU1NfTUFTSwkJCSggMHhmZmZmZmZlMCApIC8qIE11c3QgYmUgMzItYnl0ZSBhbGlnbmVkLiAqLworCisjZGVmaW5lIHBvcnRNUFVfTUFJUl9BVFRSMF9QT1MJCQkJKCAwVUwgKQorI2RlZmluZSBwb3J0TVBVX01BSVJfQVRUUjBfTUFTSwkJCQkoIDB4MDAwMDAwZmYgKQorCisjZGVmaW5lIHBvcnRNUFVfTUFJUl9BVFRSMV9QT1MJCQkJKCA4VUwgKQorI2RlZmluZSBwb3J0TVBVX01BSVJfQVRUUjFfTUFTSwkJCQkoIDB4MDAwMGZmMDAgKQorCisjZGVmaW5lIHBvcnRNUFVfTUFJUl9BVFRSMl9QT1MJCQkJKCAxNlVMICkKKyNkZWZpbmUgcG9ydE1QVV9NQUlSX0FUVFIyX01BU0sJCQkJKCAweDAwZmYwMDAwICkKKworI2RlZmluZSBwb3J0TVBVX01BSVJfQVRUUjNfUE9TCQkJCSggMjRVTCApCisjZGVmaW5lIHBvcnRNUFVfTUFJUl9BVFRSM19NQVNLCQkJCSggMHhmZjAwMDAwMCApCisKKyNkZWZpbmUgcG9ydE1QVV9NQUlSX0FUVFI0X1BPUwkJCQkoIDBVTCApCisjZGVmaW5lIHBvcnRNUFVfTUFJUl9BVFRSNF9NQVNLCQkJCSggMHgwMDAwMDBmZiApCisKKyNkZWZpbmUgcG9ydE1QVV9NQUlSX0FUVFI1X1BPUwkJCQkoIDhVTCApCisjZGVmaW5lIHBvcnRNUFVfTUFJUl9BVFRSNV9NQVNLCQkJCSggMHgwMDAwZmYwMCApCisKKyNkZWZpbmUgcG9ydE1QVV9NQUlSX0FUVFI2X1BPUwkJCQkoIDE2VUwgKQorI2RlZmluZSBwb3J0TVBVX01BSVJfQVRUUjZfTUFTSwkJCQkoIDB4MDBmZjAwMDAgKQorCisjZGVmaW5lIHBvcnRNUFVfTUFJUl9BVFRSN19QT1MJCQkJKCAyNFVMICkKKyNkZWZpbmUgcG9ydE1QVV9NQUlSX0FUVFI3X01BU0sJCQkJKCAweGZmMDAwMDAwICkKKworI2RlZmluZSBwb3J0TVBVX1JMQVJfQVRUUl9JTkRFWDAJCQkoIDBVTCA8PCAxVUwgKQorI2RlZmluZSBwb3J0TVBVX1JMQVJfQVRUUl9JTkRFWDEJCQkoIDFVTCA8PCAxVUwgKQorI2RlZmluZSBwb3J0TVBVX1JMQVJfQVRUUl9JTkRFWDIJCQkoIDJVTCA8PCAxVUwgKQorI2RlZmluZSBwb3J0TVBVX1JMQVJfQVRUUl9JTkRFWDMJCQkoIDNVTCA8PCAxVUwgKQorI2RlZmluZSBwb3J0TVBVX1JMQVJfQVRUUl9JTkRFWDQJCQkoIDRVTCA8PCAxVUwgKQorI2RlZmluZSBwb3J0TVBVX1JMQVJfQVRUUl9JTkRFWDUJCQkoIDVVTCA8PCAxVUwgKQorI2RlZmluZSBwb3J0TVBVX1JMQVJfQVRUUl9JTkRFWDYJCQkoIDZVTCA8PCAxVUwgKQorI2RlZmluZSBwb3J0TVBVX1JMQVJfQVRUUl9JTkRFWDcJCQkoIDdVTCA8PCAxVUwgKQorCisjZGVmaW5lIHBvcnRNUFVfUkxBUl9SRUdJT05fRU5BQkxFCQkJKCAxVUwgKQorCisvKiBFbmFibGUgcHJpdmlsZWdlZCBhY2Nlc3MgdG8gdW5tYXBwZWQgcmVnaW9uLiAqLworI2RlZmluZSBwb3J0TVBVX1BSSVZfQkFDS0dST1VORF9FTkFCTEUJCSggMVVMIDw8IDJVTCApCisKKy8qIEVuYWJsZSBNUFUuICovCisjZGVmaW5lIHBvcnRNUFVfRU5BQkxFCQkJCQkJKCAxVUwgPDwgMFVMICkKKworLyogRXhwZWN0ZWQgdmFsdWUgb2YgdGhlIHBvcnRNUFVfVFlQRSByZWdpc3Rlci4gKi8KKyNkZWZpbmUgcG9ydEVYUEVDVEVEX01QVV9UWVBFX1ZBTFVFCQkJKCA4VUwgPDwgOFVMICkgLyogOCByZWdpb25zLCB1bmlmaWVkLiAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKgorICogQGJyaWVmIENvbnN0YW50cyByZXF1aXJlZCB0byBzZXQgdXAgdGhlIGluaXRpYWwgc3RhY2suCisgKi8KKyNkZWZpbmUgcG9ydElOSVRJQUxfWFBTUgkJCQkJKCAweDAxMDAwMDAwICkKKworI2lmKCBjb25maWdSVU5fRlJFRVJUT1NfU0VDVVJFX09OTFkgPT0gMSApCisJLyoqCisJICogQGJyaWVmIEluaXRpYWwgRVhDX1JFVFVSTiB2YWx1ZS4KKwkgKgorCSAqICAgICBGRiAgICAgICAgIEZGICAgICAgICAgRkYgICAgICAgICBGRAorCSAqIDExMTEgMTExMSAgMTExMSAxMTExICAxMTExIDExMTEgIDExMTEgMTEwMQorCSAqCisJICogQml0WzZdIC0gMSAtLT4gVGhlIGV4Y2VwdGlvbiB3YXMgdGFrZW4gZnJvbSB0aGUgU2VjdXJlIHN0YXRlLgorCSAqIEJpdFs1XSAtIDEgLS0+IERvIG5vdCBza2lwIHN0YWNraW5nIG9mIGFkZGl0aW9uYWwgc3RhdGUgY29udGV4dC4KKwkgKiBCaXRbNF0gLSAxIC0tPiBUaGUgUEUgZGlkIG5vdCBhbGxvY2F0ZSBzcGFjZSBvbiB0aGUgc3RhY2sgZm9yIEZQIGNvbnRleHQuCisJICogQml0WzNdIC0gMSAtLT4gUmV0dXJuIHRvIHRoZSBUaHJlYWQgbW9kZS4KKwkgKiBCaXRbMl0gLSAxIC0tPiBSZXN0b3JlIHJlZ2lzdGVycyBmcm9tIHRoZSBwcm9jZXNzIHN0YWNrLgorCSAqIEJpdFsxXSAtIDAgLS0+IFJlc2VydmVkLCAwLgorCSAqIEJpdFswXSAtIDEgLS0+IFRoZSBleGNlcHRpb24gd2FzIHRha2VuIHRvIHRoZSBTZWN1cmUgc3RhdGUuCisJICovCisJI2RlZmluZSBwb3J0SU5JVElBTF9FWENfUkVUVVJOCQkJKCAweGZmZmZmZmZkICkKKyNlbHNlCisJLyoqCisJICogQGJyaWVmIEluaXRpYWwgRVhDX1JFVFVSTiB2YWx1ZS4KKwkgKgorCSAqICAgICBGRiAgICAgICAgIEZGICAgICAgICAgRkYgICAgICAgICBCQworCSAqIDExMTEgMTExMSAgMTExMSAxMTExICAxMTExIDExMTEgIDEwMTEgMTEwMAorCSAqCisJICogQml0WzZdIC0gMCAtLT4gVGhlIGV4Y2VwdGlvbiB3YXMgdGFrZW4gZnJvbSB0aGUgTm9uLVNlY3VyZSBzdGF0ZS4KKwkgKiBCaXRbNV0gLSAxIC0tPiBEbyBub3Qgc2tpcCBzdGFja2luZyBvZiBhZGRpdGlvbmFsIHN0YXRlIGNvbnRleHQuCisJICogQml0WzRdIC0gMSAtLT4gVGhlIFBFIGRpZCBub3QgYWxsb2NhdGUgc3BhY2Ugb24gdGhlIHN0YWNrIGZvciBGUCBjb250ZXh0LgorCSAqIEJpdFszXSAtIDEgLS0+IFJldHVybiB0byB0aGUgVGhyZWFkIG1vZGUuCisJICogQml0WzJdIC0gMSAtLT4gUmVzdG9yZSByZWdpc3RlcnMgZnJvbSB0aGUgcHJvY2VzcyBzdGFjay4KKwkgKiBCaXRbMV0gLSAwIC0tPiBSZXNlcnZlZCwgMC4KKwkgKiBCaXRbMF0gLSAwIC0tPiBUaGUgZXhjZXB0aW9uIHdhcyB0YWtlbiB0byB0aGUgTm9uLVNlY3VyZSBzdGF0ZS4KKwkgKi8KKwkjZGVmaW5lIHBvcnRJTklUSUFMX0VYQ19SRVRVUk4JCQkoIDB4ZmZmZmZmYmMgKQorI2VuZGlmIC8qIGNvbmZpZ1JVTl9GUkVFUlRPU19TRUNVUkVfT05MWSAqLworCisvKioKKyAqIEBicmllZiBDT05UUk9MIHJlZ2lzdGVyIHByaXZpbGVnZWQgYml0IG1hc2suCisgKgorICogQml0WzBdIGluIENPTlRST0wgcmVnaXN0ZXIgdGVsbHMgdGhlIHByaXZpbGVnZToKKyAqICBCaXRbMF0gPSAwID09PiBUaGUgdGFzayBpcyBwcml2aWxlZ2VkLgorICogIEJpdFswXSA9IDEgPT0+IFRoZSB0YXNrIGlzIG5vdCBwcml2aWxlZ2VkLgorICovCisjZGVmaW5lIHBvcnRDT05UUk9MX1BSSVZJTEVHRURfTUFTSwkJCSggMVVMIDw8IDBVTCApCisKKy8qKgorICogQGJyaWVmIEluaXRpYWwgQ09OVFJPTCByZWdpc3RlciB2YWx1ZXMuCisgKi8KKyNkZWZpbmUgcG9ydElOSVRJQUxfQ09OVFJPTF9VTlBSSVZJTEVHRUQJKCAweDMgKQorI2RlZmluZSBwb3J0SU5JVElBTF9DT05UUk9MX1BSSVZJTEVHRUQJCSggMHgyICkKKworLyoqCisgKiBAYnJpZWYgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSBwcmUtbG9hZGluZyBvZiB0aGUgaW5pdGlhbCBMUiB3aXRoIHRoZQorICogYWRkcmVzcyBvZiBwcnZUYXNrRXhpdEVycm9yKCkgaW4gY2FzZSBpdCBtZXNzZXMgdXAgdW53aW5kaW5nIG9mIHRoZSBzdGFjaworICogaW4gdGhlIGRlYnVnZ2VyLgorICovCisjaWZkZWYgY29uZmlnVEFTS19SRVRVUk5fQUREUkVTUworCSNkZWZpbmUgcG9ydFRBU0tfUkVUVVJOX0FERFJFU1MJCQljb25maWdUQVNLX1JFVFVSTl9BRERSRVNTCisjZWxzZQorCSNkZWZpbmUgcG9ydFRBU0tfUkVUVVJOX0FERFJFU1MJCQlwcnZUYXNrRXhpdEVycm9yCisjZW5kaWYKKworLyoqCisgKiBAYnJpZWYgSWYgcG9ydFBSRUxPQURfUkVHSVNURVJTIHRoZW4gcmVnaXN0ZXJzIHdpbGwgYmUgZ2l2ZW4gYW4gaW5pdGlhbCB2YWx1ZQorICogd2hlbiBhIHRhc2sgaXMgY3JlYXRlZC4gVGhpcyBoZWxwcyBpbiBkZWJ1Z2dpbmcgYXQgdGhlIGNvc3Qgb2YgY29kZSBzaXplLgorICovCisjZGVmaW5lIHBvcnRQUkVMT0FEX1JFR0lTVEVSUwkJCQkxCisKKy8qKgorICogQGJyaWVmIEEgdGFzayBpcyBjcmVhdGVkIHdpdGhvdXQgYSBzZWN1cmUgY29udGV4dCwgYW5kIG11c3QgY2FsbAorICogcG9ydEFMTE9DQVRFX1NFQ1VSRV9DT05URVhUKCkgdG8gZ2l2ZSBpdHNlbGYgYSBzZWN1cmUgY29udGV4dCBiZWZvcmUgaXQgbWFrZXMKKyAqIGFueSBzZWN1cmUgY2FsbHMuCisgKi8KKyNkZWZpbmUgcG9ydE5PX1NFQ1VSRV9DT05URVhUCQkJCTAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAqIEBicmllZiBTZXR1cCB0aGUgdGltZXIgdG8gZ2VuZXJhdGUgdGhlIHRpY2sgaW50ZXJydXB0cy4KKyAqLworc3RhdGljIHZvaWQgcHJ2U2V0dXBUaW1lckludGVycnVwdCggdm9pZCApIFBSSVZJTEVHRURfRlVOQ1RJT047CisKKy8qKgorICogQGJyaWVmIFVzZWQgdG8gY2F0Y2ggdGFza3MgdGhhdCBhdHRlbXB0IHRvIHJldHVybiBmcm9tIHRoZWlyIGltcGxlbWVudGluZworICogZnVuY3Rpb24uCisgKi8KK3N0YXRpYyB2b2lkIHBydlRhc2tFeGl0RXJyb3IoIHZvaWQgKTsKKworI2lmKCBjb25maWdFTkFCTEVfTVBVID09IDEgKQorCS8qKgorCSAqIEBicmllZiBTZXR1cCB0aGUgTWVtb3J5IFByb3RlY3Rpb24gVW5pdCAoTVBVKS4KKwkgKi8KKwlzdGF0aWMgdm9pZCBwcnZTZXR1cE1QVSggdm9pZCApIFBSSVZJTEVHRURfRlVOQ1RJT047CisjZW5kaWYgLyogY29uZmlnRU5BQkxFX01QVSAqLworCisjaWYoIGNvbmZpZ0VOQUJMRV9GUFUgPT0gMSApCisJLyoqCisJICogQGJyaWVmIFNldHVwIHRoZSBGbG9hdGluZyBQb2ludCBVbml0IChGUFUpLgorCSAqLworCXN0YXRpYyB2b2lkIHBydlNldHVwRlBVKCB2b2lkICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKyNlbmRpZiAvKiBjb25maWdFTkFCTEVfRlBVICovCisKKy8qKgorICogQGJyaWVmIFlpZWxkIHRoZSBwcm9jZXNzb3IuCisgKi8KK3ZvaWQgdlBvcnRZaWVsZCggdm9pZCApIFBSSVZJTEVHRURfRlVOQ1RJT047CisKKy8qKgorICogQGJyaWVmIEVudGVyIGNyaXRpY2FsIHNlY3Rpb24uCisgKi8KK3ZvaWQgdlBvcnRFbnRlckNyaXRpY2FsKCB2b2lkICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworLyoqCisgKiBAYnJpZWYgRXhpdCBmcm9tIGNyaXRpY2FsIHNlY3Rpb24uCisgKi8KK3ZvaWQgdlBvcnRFeGl0Q3JpdGljYWwoIHZvaWQgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisvKioKKyAqIEBicmllZiBTeXNUaWNrIGhhbmRsZXIuCisgKi8KK3ZvaWQgU3lzVGlja19IYW5kbGVyKCB2b2lkICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworLyoqCisgKiBAYnJpZWYgQyBwYXJ0IG9mIFNWQyBoYW5kbGVyLgorICovCitwb3J0RE9OVF9ESVNDQVJEIHZvaWQgdlBvcnRTVkNIYW5kbGVyX0MoIHVpbnQzMl90ICpwdWxDYWxsZXJTdGFja0FkZHJlc3MgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKgorICogQGJyaWVmIEVhY2ggdGFzayBtYWludGFpbnMgaXRzIG93biBpbnRlcnJ1cHQgc3RhdHVzIGluIHRoZSBjcml0aWNhbCBuZXN0aW5nCisgKiB2YXJpYWJsZS4KKyAqLworc3RhdGljIHZvbGF0aWxlIHVpbnQzMl90IHVsQ3JpdGljYWxOZXN0aW5nID0gMHhhYWFhYWFhYVVMOworCisjaWYoIGNvbmZpZ0VOQUJMRV9UUlVTVFpPTkUgPT0gMSApCisJLyoqCisJICogQGJyaWVmIFNhdmVkIGFzIHBhcnQgb2YgdGhlIHRhc2sgY29udGV4dCB0byBpbmRpY2F0ZSB3aGljaCBjb250ZXh0IHRoZQorCSAqIHRhc2sgaXMgdXNpbmcgb24gdGhlIHNlY3VyZSBzaWRlLgorCSAqLworCXBvcnRET05UX0RJU0NBUkQgdm9sYXRpbGUgU2VjdXJlQ29udGV4dEhhbmRsZV90IHhTZWN1cmVDb250ZXh0ID0gcG9ydE5PX1NFQ1VSRV9DT05URVhUOworI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9UUlVTVFpPTkUgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdm9pZCBwcnZTZXR1cFRpbWVySW50ZXJydXB0KCB2b2lkICkgLyogUFJJVklMRUdFRF9GVU5DVElPTiAqLworeworCS8qIFN0b3AgYW5kIHJlc2V0IHRoZSBTeXNUaWNrLiAqLworCSooIHBvcnROVklDX1NZU1RJQ0tfQ1RSTCApID0gMFVMOworCSooIHBvcnROVklDX1NZU1RJQ0tfQ1VSUkVOVF9WQUxVRSApID0gMFVMOworCisJLyogQ29uZmlndXJlIFN5c1RpY2sgdG8gaW50ZXJydXB0IGF0IHRoZSByZXF1ZXN0ZWQgcmF0ZS4gKi8KKwkqKCBwb3J0TlZJQ19TWVNUSUNLX0xPQUQgKSA9ICggY29uZmlnQ1BVX0NMT0NLX0haIC8gY29uZmlnVElDS19SQVRFX0haICkgLSAxVUw7CisJKiggcG9ydE5WSUNfU1lTVElDS19DVFJMICkgPSBwb3J0TlZJQ19TWVNUSUNLX0NMSyB8IHBvcnROVklDX1NZU1RJQ0tfSU5UIHwgcG9ydE5WSUNfU1lTVElDS19FTkFCTEU7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHZvaWQgcHJ2VGFza0V4aXRFcnJvciggdm9pZCApCit7Cit2b2xhdGlsZSB1aW50MzJfdCB1bER1bW15ID0gMFVMOworCisJLyogQSBmdW5jdGlvbiB0aGF0IGltcGxlbWVudHMgYSB0YXNrIG11c3Qgbm90IGV4aXQgb3IgYXR0ZW1wdCB0byByZXR1cm4gdG8KKwkgKiBpdHMgY2FsbGVyIGFzIHRoZXJlIGlzIG5vdGhpbmcgdG8gcmV0dXJuIHRvLiBJZiBhIHRhc2sgd2FudHMgdG8gZXhpdCBpdAorCSAqIHNob3VsZCBpbnN0ZWFkIGNhbGwgdlRhc2tEZWxldGUoIE5VTEwgKS4gQXJ0aWZpY2lhbGx5IGZvcmNlIGFuIGFzc2VydCgpCisJICogdG8gYmUgdHJpZ2dlcmVkIGlmIGNvbmZpZ0FTU0VSVCgpIGlzIGRlZmluZWQsIHRoZW4gc3RvcCBoZXJlIHNvCisJICogYXBwbGljYXRpb24gd3JpdGVycyBjYW4gY2F0Y2ggdGhlIGVycm9yLiAqLworCWNvbmZpZ0FTU0VSVCggdWxDcml0aWNhbE5lc3RpbmcgPT0gfjBVTCApOworCXBvcnRESVNBQkxFX0lOVEVSUlVQVFMoKTsKKworCXdoaWxlKCB1bER1bW15ID09IDAgKQorCXsKKwkJLyogVGhpcyBmaWxlIGNhbGxzIHBydlRhc2tFeGl0RXJyb3IoKSBhZnRlciB0aGUgc2NoZWR1bGVyIGhhcyBiZWVuCisJCSAqIHN0YXJ0ZWQgdG8gcmVtb3ZlIGEgY29tcGlsZXIgd2FybmluZyBhYm91dCB0aGUgZnVuY3Rpb24gYmVpbmcKKwkJICogZGVmaW5lZCBidXQgbmV2ZXIgY2FsbGVkLiAgdWxEdW1teSBpcyB1c2VkIHB1cmVseSB0byBxdWlldGVuIG90aGVyCisJCSAqIHdhcm5pbmdzIGFib3V0IGNvZGUgYXBwZWFyaW5nIGFmdGVyIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIC0gbWFraW5nCisJCSAqIHVsRHVtbXkgdm9sYXRpbGUgbWFrZXMgdGhlIGNvbXBpbGVyIHRoaW5rIHRoZSBmdW5jdGlvbiBjb3VsZCByZXR1cm4KKwkJICogYW5kIHRoZXJlZm9yZSBub3Qgb3V0cHV0IGFuICd1bnJlYWNoYWJsZSBjb2RlJyB3YXJuaW5nIGZvciBjb2RlIHRoYXQKKwkJICogYXBwZWFycyBhZnRlciBpdC4gKi8KKwl9Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmKCBjb25maWdFTkFCTEVfTVBVID09IDEgKQorCXN0YXRpYyB2b2lkIHBydlNldHVwTVBVKCB2b2lkICkgLyogUFJJVklMRUdFRF9GVU5DVElPTiAqLworCXsKKwkjaWYgZGVmaW5lZCggX19BUk1DQ19WRVJTSU9OICkKKwkJLyogRGVjbGFyYXRpb24gd2hlbiB0aGVzZSB2YXJpYWJsZSBhcmUgZGVmaW5lZCBpbiBjb2RlIGluc3RlYWQgb2YgYmVpbmcKKwkJICogZXhwb3J0ZWQgZnJvbSBsaW5rZXIgc2NyaXB0cy4gKi8KKwkJZXh0ZXJuIHVpbnQzMl90ICogX19wcml2aWxlZ2VkX2Z1bmN0aW9uc19zdGFydF9fOworCQlleHRlcm4gdWludDMyX3QgKiBfX3ByaXZpbGVnZWRfZnVuY3Rpb25zX2VuZF9fOworCQlleHRlcm4gdWludDMyX3QgKiBfX3N5c2NhbGxzX2ZsYXNoX3N0YXJ0X187CisJCWV4dGVybiB1aW50MzJfdCAqIF9fc3lzY2FsbHNfZmxhc2hfZW5kX187CisJCWV4dGVybiB1aW50MzJfdCAqIF9fdW5wcml2aWxlZ2VkX2ZsYXNoX3N0YXJ0X187CisJCWV4dGVybiB1aW50MzJfdCAqIF9fdW5wcml2aWxlZ2VkX2ZsYXNoX2VuZF9fOworCQlleHRlcm4gdWludDMyX3QgKiBfX3ByaXZpbGVnZWRfc3JhbV9zdGFydF9fOworCQlleHRlcm4gdWludDMyX3QgKiBfX3ByaXZpbGVnZWRfc3JhbV9lbmRfXzsKKwkjZWxzZQorCQkvKiBEZWNsYXJhdGlvbiB3aGVuIHRoZXNlIHZhcmlhYmxlIGFyZSBleHBvcnRlZCBmcm9tIGxpbmtlciBzY3JpcHRzLiAqLworCQlleHRlcm4gdWludDMyX3QgX19wcml2aWxlZ2VkX2Z1bmN0aW9uc19zdGFydF9fW107CisJCWV4dGVybiB1aW50MzJfdCBfX3ByaXZpbGVnZWRfZnVuY3Rpb25zX2VuZF9fW107CisJCWV4dGVybiB1aW50MzJfdCBfX3N5c2NhbGxzX2ZsYXNoX3N0YXJ0X19bXTsKKwkJZXh0ZXJuIHVpbnQzMl90IF9fc3lzY2FsbHNfZmxhc2hfZW5kX19bXTsKKwkJZXh0ZXJuIHVpbnQzMl90IF9fdW5wcml2aWxlZ2VkX2ZsYXNoX3N0YXJ0X19bXTsKKwkJZXh0ZXJuIHVpbnQzMl90IF9fdW5wcml2aWxlZ2VkX2ZsYXNoX2VuZF9fW107CisJCWV4dGVybiB1aW50MzJfdCBfX3ByaXZpbGVnZWRfc3JhbV9zdGFydF9fW107CisJCWV4dGVybiB1aW50MzJfdCBfX3ByaXZpbGVnZWRfc3JhbV9lbmRfX1tdOworCSNlbmRpZiAvKiBkZWZpbmVkKCBfX0FSTUNDX1ZFUlNJT04gKSAqLworCisJCS8qIENoZWNrIHRoYXQgdGhlIE1QVSBpcyBwcmVzZW50LiAqLworCQlpZiggcG9ydE1QVV9UWVBFX1JFRyA9PSBwb3J0RVhQRUNURURfTVBVX1RZUEVfVkFMVUUgKQorCQl7CisJCQkvKiBNQUlSMCAtIEluZGV4IDAuICovCisJCQlwb3J0TVBVX01BSVIwX1JFRyB8PSAoICggcG9ydE1QVV9OT1JNQUxfTUVNT1JZX0JVRkZFUkFCTEVfQ0FDSEVBQkxFIDw8IHBvcnRNUFVfTUFJUl9BVFRSMF9QT1MgKSAmIHBvcnRNUFVfTUFJUl9BVFRSMF9NQVNLICk7CisJCQkvKiBNQUlSMCAtIEluZGV4IDEuICovCisJCQlwb3J0TVBVX01BSVIwX1JFRyB8PSAoICggcG9ydE1QVV9ERVZJQ0VfTUVNT1JZX25HblJFIDw8IHBvcnRNUFVfTUFJUl9BVFRSMV9QT1MgKSAmIHBvcnRNUFVfTUFJUl9BVFRSMV9NQVNLICk7CisKKwkJCS8qIFNldHVwIHByaXZpbGVnZWQgZmxhc2ggYXMgUmVhZCBPbmx5IHNvIHRoYXQgcHJpdmlsZWdlZCB0YXNrcyBjYW4KKwkJCSAqIHJlYWQgaXQgYnV0IG5vdCBtb2RpZnkuICovCisJCQlwb3J0TVBVX1JOUl9SRUcgPSBwb3J0UFJJVklMRUdFRF9GTEFTSF9SRUdJT047CisJCQlwb3J0TVBVX1JCQVJfUkVHID0JKCAoICggdWludDMyX3QgKSBfX3ByaXZpbGVnZWRfZnVuY3Rpb25zX3N0YXJ0X18gKSAmIHBvcnRNUFVfUkJBUl9BRERSRVNTX01BU0sgKSB8CisJCQkJCQkJCSggcG9ydE1QVV9SRUdJT05fTk9OX1NIQVJFQUJMRSApIHwKKwkJCQkJCQkJKCBwb3J0TVBVX1JFR0lPTl9QUklWSUxFR0VEX1JFQURfT05MWSApOworCQkJcG9ydE1QVV9STEFSX1JFRyA9CSggKCAoIHVpbnQzMl90ICkgX19wcml2aWxlZ2VkX2Z1bmN0aW9uc19lbmRfXyApICYgcG9ydE1QVV9STEFSX0FERFJFU1NfTUFTSyApIHwKKwkJCQkJCQkJKCBwb3J0TVBVX1JMQVJfQVRUUl9JTkRFWDAgKSB8CisJCQkJCQkJCSggcG9ydE1QVV9STEFSX1JFR0lPTl9FTkFCTEUgKTsKKworCQkJLyogU2V0dXAgdW5wcml2aWxlZ2VkIGZsYXNoIGFzIFJlYWQgT25seSBieSBib3RoIHByaXZpbGVnZWQgYW5kCisJCQkgKiB1bnByaXZpbGVnZWQgdGFza3MuIEFsbCB0YXNrcyBjYW4gcmVhZCBpdCBidXQgbm8tb25lIGNhbiBtb2RpZnkuICovCisJCQlwb3J0TVBVX1JOUl9SRUcgPSBwb3J0VU5QUklWSUxFR0VEX0ZMQVNIX1JFR0lPTjsKKwkJCXBvcnRNUFVfUkJBUl9SRUcgPQkoICggKCB1aW50MzJfdCApIF9fdW5wcml2aWxlZ2VkX2ZsYXNoX3N0YXJ0X18gKSAmIHBvcnRNUFVfUkJBUl9BRERSRVNTX01BU0sgKSB8CisJCQkJCQkJCSggcG9ydE1QVV9SRUdJT05fTk9OX1NIQVJFQUJMRSApIHwKKwkJCQkJCQkJKCBwb3J0TVBVX1JFR0lPTl9SRUFEX09OTFkgKTsKKwkJCXBvcnRNUFVfUkxBUl9SRUcgPQkoICggKCB1aW50MzJfdCApIF9fdW5wcml2aWxlZ2VkX2ZsYXNoX2VuZF9fICkgJiBwb3J0TVBVX1JMQVJfQUREUkVTU19NQVNLICkgfAorCQkJCQkJCQkoIHBvcnRNUFVfUkxBUl9BVFRSX0lOREVYMCApIHwKKwkJCQkJCQkJKCBwb3J0TVBVX1JMQVJfUkVHSU9OX0VOQUJMRSApOworCisJCQkvKiBTZXR1cCB1bnByaXZpbGVnZWQgc3lzY2FsbHMgZmxhc2ggYXMgUmVhZCBPbmx5IGJ5IGJvdGggcHJpdmlsZWdlZAorCQkJICogYW5kIHVucHJpdmlsZWdlZCB0YXNrcy4gQWxsIHRhc2tzIGNhbiByZWFkIGl0IGJ1dCBuby1vbmUgY2FuIG1vZGlmeS4gKi8KKwkJCXBvcnRNUFVfUk5SX1JFRyA9IHBvcnRVTlBSSVZJTEVHRURfU1lTQ0FMTFNfUkVHSU9OOworCQkJcG9ydE1QVV9SQkFSX1JFRyA9CSggKCAoIHVpbnQzMl90ICkgX19zeXNjYWxsc19mbGFzaF9zdGFydF9fICkgJiBwb3J0TVBVX1JCQVJfQUREUkVTU19NQVNLICkgfAorCQkJCQkJCQkoIHBvcnRNUFVfUkVHSU9OX05PTl9TSEFSRUFCTEUgKSB8CisJCQkJCQkJCSggcG9ydE1QVV9SRUdJT05fUkVBRF9PTkxZICk7CisJCQlwb3J0TVBVX1JMQVJfUkVHID0JKCAoICggdWludDMyX3QgKSBfX3N5c2NhbGxzX2ZsYXNoX2VuZF9fICkgJiBwb3J0TVBVX1JMQVJfQUREUkVTU19NQVNLICkgfAorCQkJCQkJCQkoIHBvcnRNUFVfUkxBUl9BVFRSX0lOREVYMCApIHwKKwkJCQkJCQkJKCBwb3J0TVBVX1JMQVJfUkVHSU9OX0VOQUJMRSApOworCisJCQkvKiBTZXR1cCBSQU0gY29udGFpbmluZyBrZXJuZWwgZGF0YSBmb3IgcHJpdmlsZWdlZCBhY2Nlc3Mgb25seS4gKi8KKwkJCXBvcnRNUFVfUk5SX1JFRyA9IHBvcnRQUklWSUxFR0VEX1JBTV9SRUdJT047CisJCQlwb3J0TVBVX1JCQVJfUkVHID0JKCAoICggdWludDMyX3QgKSBfX3ByaXZpbGVnZWRfc3JhbV9zdGFydF9fICkgJiBwb3J0TVBVX1JCQVJfQUREUkVTU19NQVNLICkgfAorCQkJCQkJCQkoIHBvcnRNUFVfUkVHSU9OX05PTl9TSEFSRUFCTEUgKSB8CisJCQkJCQkJCSggcG9ydE1QVV9SRUdJT05fUFJJVklMRUdFRF9SRUFEX1dSSVRFICkgfAorCQkJCQkJCQkoIHBvcnRNUFVfUkVHSU9OX0VYRUNVVEVfTkVWRVIgKTsKKwkJCXBvcnRNUFVfUkxBUl9SRUcgPQkoICggKCB1aW50MzJfdCApIF9fcHJpdmlsZWdlZF9zcmFtX2VuZF9fICkgJiBwb3J0TVBVX1JMQVJfQUREUkVTU19NQVNLICkgfAorCQkJCQkJCQkoIHBvcnRNUFVfUkxBUl9BVFRSX0lOREVYMCApIHwKKwkJCQkJCQkJKCBwb3J0TVBVX1JMQVJfUkVHSU9OX0VOQUJMRSApOworCisJCQkvKiBFbmFibGUgbWVtIGZhdWx0LiAqLworCQkJcG9ydFNDQl9TWVNfSEFORExFUl9DVFJMX1NUQVRFX1JFRyB8PSBwb3J0U0NCX01FTV9GQVVMVF9FTkFCTEU7CisKKwkJCS8qIEVuYWJsZSBNUFUgd2l0aCBwcml2aWxlZ2VkIGJhY2tncm91bmQgYWNjZXNzIGkuZS4gdW5tYXBwZWQKKwkJCSAqIHJlZ2lvbnMgaGF2ZSBwcml2aWxlZ2VkIGFjY2Vzcy4gKi8KKwkJCXBvcnRNUFVfQ1RSTF9SRUcgfD0gKCBwb3J0TVBVX1BSSVZfQkFDS0dST1VORF9FTkFCTEUgfCBwb3J0TVBVX0VOQUJMRSApOworCQl9CisJfQorI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9NUFUgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYoIGNvbmZpZ0VOQUJMRV9GUFUgPT0gMSApCisJc3RhdGljIHZvaWQgcHJ2U2V0dXBGUFUoIHZvaWQgKSAvKiBQUklWSUxFR0VEX0ZVTkNUSU9OICovCisJeworCQkjaWYoIGNvbmZpZ0VOQUJMRV9UUlVTVFpPTkUgPT0gMSApCisJCXsKKwkJCS8qIEVuYWJsZSBub24tc2VjdXJlIGFjY2VzcyB0byB0aGUgRlBVLiAqLworCQkJU2VjdXJlSW5pdF9FbmFibGVOU0ZQVUFjY2VzcygpOworCQl9CisJCSNlbmRpZiAvKiBjb25maWdFTkFCTEVfVFJVU1RaT05FICovCisKKwkJLyogQ1AxMCA9IDExID09PiBGdWxsIGFjY2VzcyB0byBGUFUgaS5lLiBib3RoIHByaXZpbGVnZWQgYW5kCisJCSAqIHVucHJpdmlsZWdlZCBjb2RlIHNob3VsZCBiZSBhYmxlIHRvIGFjY2VzcyBGUFUuIENQMTEgc2hvdWxkIGJlCisJCSAqIHByb2dyYW1tZWQgdG8gdGhlIHNhbWUgdmFsdWUgYXMgQ1AxMC4gKi8KKwkJKiggcG9ydENQQUNSICkgfD0JKAkoIHBvcnRDUEFDUl9DUDEwX1ZBTFVFIDw8IHBvcnRDUEFDUl9DUDEwX1BPUyApIHwKKwkJCQkJCQkJKCBwb3J0Q1BBQ1JfQ1AxMV9WQUxVRSA8PCBwb3J0Q1BBQ1JfQ1AxMV9QT1MgKQorCQkJCQkJCSk7CisKKwkJLyogQVNQRU4gPSAxID09PiBIYXJkd2FyZSBzaG91bGQgYXV0b21hdGljYWxseSBwcmVzZXJ2ZSBmbG9hdGluZyBwb2ludAorCQkgKiBjb250ZXh0IG9uIGV4Y2VwdGlvbiBlbnRyeSBhbmQgcmVzdG9yZSBvbiBleGNlcHRpb24gcmV0dXJuLgorCQkgKiBMU1BFTiA9IDEgPT0+IEVuYWJsZSBsYXp5IGNvbnRleHQgc2F2ZSBvZiBGUCBzdGF0ZS4gKi8KKwkJKiggcG9ydEZQQ0NSICkgfD0gKCBwb3J0RlBDQ1JfQVNQRU5fTUFTSyB8IHBvcnRGUENDUl9MU1BFTl9NQVNLICk7CisJfQorI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9GUFUgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIHZQb3J0WWllbGQoIHZvaWQgKSAvKiBQUklWSUxFR0VEX0ZVTkNUSU9OICovCit7CisJLyogU2V0IGEgUGVuZFNWIHRvIHJlcXVlc3QgYSBjb250ZXh0IHN3aXRjaC4gKi8KKwkqKCBwb3J0TlZJQ19JTlRfQ1RSTCApID0gcG9ydE5WSUNfUEVORFNWU0VUOworCisJLyogQmFycmllcnMgYXJlIG5vcm1hbGx5IG5vdCByZXF1aXJlZCBidXQgZG8gZW5zdXJlIHRoZSBjb2RlIGlzCisJICogY29tcGxldGVseSB3aXRoaW4gdGhlIHNwZWNpZmllZCBiZWhhdmlvdXIgZm9yIHRoZSBhcmNoaXRlY3R1cmUuICovCisJX19hc20gdm9sYXRpbGUoICJkc2IiIDo6OiAibWVtb3J5IiApOworCV9fYXNtIHZvbGF0aWxlKCAiaXNiIiApOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgdlBvcnRFbnRlckNyaXRpY2FsKCB2b2lkICkgLyogUFJJVklMRUdFRF9GVU5DVElPTiAqLworeworCXBvcnRESVNBQkxFX0lOVEVSUlVQVFMoKTsKKwl1bENyaXRpY2FsTmVzdGluZysrOworCisJLyogQmFycmllcnMgYXJlIG5vcm1hbGx5IG5vdCByZXF1aXJlZCBidXQgZG8gZW5zdXJlIHRoZSBjb2RlIGlzCisJICogY29tcGxldGVseSB3aXRoaW4gdGhlIHNwZWNpZmllZCBiZWhhdmlvdXIgZm9yIHRoZSBhcmNoaXRlY3R1cmUuICovCisJX19hc20gdm9sYXRpbGUoICJkc2IiIDo6OiAibWVtb3J5IiApOworCV9fYXNtIHZvbGF0aWxlKCAiaXNiIiApOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgdlBvcnRFeGl0Q3JpdGljYWwoIHZvaWQgKSAvKiBQUklWSUxFR0VEX0ZVTkNUSU9OICovCit7CisJY29uZmlnQVNTRVJUKCB1bENyaXRpY2FsTmVzdGluZyApOworCXVsQ3JpdGljYWxOZXN0aW5nLS07CisKKwlpZiggdWxDcml0aWNhbE5lc3RpbmcgPT0gMCApCisJeworCQlwb3J0RU5BQkxFX0lOVEVSUlVQVFMoKTsKKwl9Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBTeXNUaWNrX0hhbmRsZXIoIHZvaWQgKSAvKiBQUklWSUxFR0VEX0ZVTkNUSU9OICovCit7Cit1aW50MzJfdCB1bFByZXZpb3VzTWFzazsKKworCXVsUHJldmlvdXNNYXNrID0gcG9ydFNFVF9JTlRFUlJVUFRfTUFTS19GUk9NX0lTUigpOworCXsKKwkJLyogSW5jcmVtZW50IHRoZSBSVE9TIHRpY2suICovCisJCWlmKCB4VGFza0luY3JlbWVudFRpY2soKSAhPSBwZEZBTFNFICkKKwkJeworCQkJLyogUGVuZCBhIGNvbnRleHQgc3dpdGNoLiAqLworCQkJKiggcG9ydE5WSUNfSU5UX0NUUkwgKSA9IHBvcnROVklDX1BFTkRTVlNFVDsKKwkJfQorCX0KKwlwb3J0Q0xFQVJfSU5URVJSVVBUX01BU0tfRlJPTV9JU1IoIHVsUHJldmlvdXNNYXNrICk7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCB2UG9ydFNWQ0hhbmRsZXJfQyggdWludDMyX3QgKnB1bENhbGxlclN0YWNrQWRkcmVzcyApIC8qIFBSSVZJTEVHRURfRlVOQ1RJT04gcG9ydERPTlRfRElTQ0FSRCAqLworeworI2lmKCBjb25maWdFTkFCTEVfTVBVID09IDEgKQorCSNpZiBkZWZpbmVkKCBfX0FSTUNDX1ZFUlNJT04gKQorCQkvKiBEZWNsYXJhdGlvbiB3aGVuIHRoZXNlIHZhcmlhYmxlIGFyZSBkZWZpbmVkIGluIGNvZGUgaW5zdGVhZCBvZiBiZWluZworCQkgKiBleHBvcnRlZCBmcm9tIGxpbmtlciBzY3JpcHRzLiAqLworCQlleHRlcm4gdWludDMyX3QgKiBfX3N5c2NhbGxzX2ZsYXNoX3N0YXJ0X187CisJCWV4dGVybiB1aW50MzJfdCAqIF9fc3lzY2FsbHNfZmxhc2hfZW5kX187CisJI2Vsc2UKKwkJLyogRGVjbGFyYXRpb24gd2hlbiB0aGVzZSB2YXJpYWJsZSBhcmUgZXhwb3J0ZWQgZnJvbSBsaW5rZXIgc2NyaXB0cy4gKi8KKwkJZXh0ZXJuIHVpbnQzMl90IF9fc3lzY2FsbHNfZmxhc2hfc3RhcnRfX1tdOworCQlleHRlcm4gdWludDMyX3QgX19zeXNjYWxsc19mbGFzaF9lbmRfX1tdOworCSNlbmRpZiAvKiBkZWZpbmVkKCBfX0FSTUNDX1ZFUlNJT04gKSAqLworI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9NUFUgKi8KKwordWludDMyX3QgdWxQQzsKKworI2lmKCBjb25maWdFTkFCTEVfVFJVU1RaT05FID09IDEgKQorCXVpbnQzMl90IHVsUjA7CisJI2lmKCBjb25maWdFTkFCTEVfTVBVID09IDEgKQorCQl1aW50MzJfdCB1bENvbnRyb2wsIHVsSXNUYXNrUHJpdmlsZWdlZDsKKwkjZW5kaWYgLyogY29uZmlnRU5BQkxFX01QVSAqLworI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9UUlVTVFpPTkUgKi8KK3VpbnQ4X3QgdWNTVkNOdW1iZXI7CisKKwkvKiBSZWdpc3RlciBhcmUgc3RvcmVkIG9uIHRoZSBzdGFjayBpbiB0aGUgZm9sbG93aW5nIG9yZGVyIC0gUjAsIFIxLCBSMiwgUjMsCisJICogUjEyLCBMUiwgUEMsIHhQU1IuICovCisJdWxQQyA9IHB1bENhbGxlclN0YWNrQWRkcmVzc1sgNiBdOworCXVjU1ZDTnVtYmVyID0gKCAoIHVpbnQ4X3QgKikgdWxQQyApWyAtMiBdOworCisJc3dpdGNoKCB1Y1NWQ051bWJlciApCisJeworCQkjaWYoIGNvbmZpZ0VOQUJMRV9UUlVTVFpPTkUgPT0gMSApCisJCQljYXNlIHBvcnRTVkNfQUxMT0NBVEVfU0VDVVJFX0NPTlRFWFQ6CisJCQl7CisJCQkJLyogUjAgY29udGFpbnMgdGhlIHN0YWNrIHNpemUgcGFzc2VkIGFzIHBhcmFtZXRlciB0byB0aGUKKwkJCQkgKiB2UG9ydEFsbG9jYXRlU2VjdXJlQ29udGV4dCBmdW5jdGlvbi4gKi8KKwkJCQl1bFIwID0gcHVsQ2FsbGVyU3RhY2tBZGRyZXNzWyAwIF07CisKKwkJCQkjaWYoIGNvbmZpZ0VOQUJMRV9NUFUgPT0gMSApCisJCQkJeworCQkJCQkvKiBSZWFkIHRoZSBDT05UUk9MIHJlZ2lzdGVyIHZhbHVlLiAqLworCQkJCQlfX2FzbSB2b2xhdGlsZSAoICJtcnMgJTAsIGNvbnRyb2wiICA6ICI9ciIgKCB1bENvbnRyb2wgKSApOworCisJCQkJCS8qIFRoZSB0YXNrIHRoYXQgcmFpc2VkIHRoZSBTVkMgaXMgcHJpdmlsZWdlZCBpZiBCaXRbMF0KKwkJCQkJICogaW4gdGhlIENPTlRST0wgcmVnaXN0ZXIgaXMgMC4gKi8KKwkJCQkJdWxJc1Rhc2tQcml2aWxlZ2VkID0gKCAoIHVsQ29udHJvbCAmIHBvcnRDT05UUk9MX1BSSVZJTEVHRURfTUFTSyApID09IDAgKTsKKworCQkJCQkvKiBBbGxvY2F0ZSBhbmQgbG9hZCBhIGNvbnRleHQgZm9yIHRoZSBzZWN1cmUgdGFzay4gKi8KKwkJCQkJeFNlY3VyZUNvbnRleHQgPSBTZWN1cmVDb250ZXh0X0FsbG9jYXRlQ29udGV4dCggdWxSMCwgdWxJc1Rhc2tQcml2aWxlZ2VkICk7CisJCQkJfQorCQkJCSNlbHNlCisJCQkJeworCQkJCQkvKiBBbGxvY2F0ZSBhbmQgbG9hZCBhIGNvbnRleHQgZm9yIHRoZSBzZWN1cmUgdGFzay4gKi8KKwkJCQkJeFNlY3VyZUNvbnRleHQgPSBTZWN1cmVDb250ZXh0X0FsbG9jYXRlQ29udGV4dCggdWxSMCApOworCQkJCX0KKwkJCQkjZW5kaWYgLyogY29uZmlnRU5BQkxFX01QVSAqLworCisJCQkJY29uZmlnQVNTRVJUKCB4U2VjdXJlQ29udGV4dCAhPSBOVUxMICk7CisJCQkJU2VjdXJlQ29udGV4dF9Mb2FkQ29udGV4dCggeFNlY3VyZUNvbnRleHQgKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCQljYXNlIHBvcnRTVkNfRlJFRV9TRUNVUkVfQ09OVEVYVDoKKwkJCXsKKwkJCQkvKiBSMCBjb250YWlucyB0aGUgc2VjdXJlIGNvbnRleHQgaGFuZGxlIHRvIGJlIGZyZWVkLiAqLworCQkJCXVsUjAgPSBwdWxDYWxsZXJTdGFja0FkZHJlc3NbIDAgXTsKKworCQkJCS8qIEZyZWUgdGhlIHNlY3VyZSBjb250ZXh0LiAqLworCQkJCVNlY3VyZUNvbnRleHRfRnJlZUNvbnRleHQoICggU2VjdXJlQ29udGV4dEhhbmRsZV90ICkgdWxSMCApOworCQkJfQorCQkJYnJlYWs7CisJCSNlbmRpZiAvKiBjb25maWdFTkFCTEVfVFJVU1RaT05FICovCisKKwkJY2FzZSBwb3J0U1ZDX1NUQVJUX1NDSEVEVUxFUjoKKwkJeworCQkJI2lmKCBjb25maWdFTkFCTEVfVFJVU1RaT05FID09IDEgKQorCQkJeworCQkJCS8qIERlLXByaW9yaXRpemUgdGhlIG5vbi1zZWN1cmUgZXhjZXB0aW9ucyBzbyB0aGF0IHRoZQorCQkJCSAqIG5vbi1zZWN1cmUgcGVuZFNWIHJ1bnMgYXQgdGhlIGxvd2VzdCBwcmlvcml0eS4gKi8KKwkJCQlTZWN1cmVJbml0X0RlUHJpb3JpdGl6ZU5TRXhjZXB0aW9ucygpOworCisJCQkJLyogSW5pdGlhbGl6ZSB0aGUgc2VjdXJlIGNvbnRleHQgbWFuYWdlbWVudCBzeXN0ZW0uICovCisJCQkJU2VjdXJlQ29udGV4dF9Jbml0KCk7CisJCQl9CisJCQkjZW5kaWYgLyogY29uZmlnRU5BQkxFX1RSVVNUWk9ORSAqLworCisJCQkjaWYoIGNvbmZpZ0VOQUJMRV9GUFUgPT0gMSApCisJCQl7CisJCQkJLyogU2V0dXAgdGhlIEZsb2F0aW5nIFBvaW50IFVuaXQgKEZQVSkuICovCisJCQkJcHJ2U2V0dXBGUFUoKTsKKwkJCX0KKwkJCSNlbmRpZiAvKiBjb25maWdFTkFCTEVfRlBVICovCisKKwkJCS8qIFNldHVwIHRoZSBjb250ZXh0IG9mIHRoZSBmaXJzdCB0YXNrIHNvIHRoYXQgdGhlIGZpcnN0IHRhc2sgc3RhcnRzCisJCQkgKiBleGVjdXRpbmcuICovCisJCQl2UmVzdG9yZUNvbnRleHRPZkZpcnN0VGFzaygpOworCQl9CisJCWJyZWFrOworCisJCSNpZiggY29uZmlnRU5BQkxFX01QVSA9PSAxICkKKwkJCWNhc2UgcG9ydFNWQ19SQUlTRV9QUklWSUxFR0U6CisJCQl7CisJCQkJLyogT25seSByYWlzZSB0aGUgcHJpdmlsZWdlLCBpZiB0aGUgc3ZjIHdhcyByYWlzZWQgZnJvbSBhbnkgb2YKKwkJCQkgKiB0aGUgc3lzdGVtIGNhbGxzLiAqLworCQkJCWlmKCB1bFBDID49ICggdWludDMyX3QgKSBfX3N5c2NhbGxzX2ZsYXNoX3N0YXJ0X18gJiYKKwkJCQkJdWxQQyA8PSAoIHVpbnQzMl90ICkgX19zeXNjYWxsc19mbGFzaF9lbmRfXyApCisJCQkJeworCQkJCQl2UmFpc2VQcml2aWxlZ2UoKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9NUFUgKi8KKworCQlkZWZhdWx0OgorCQl7CisJCQkvKiBJbmNvcnJlY3QgU1ZDIGNhbGwuICovCisJCQljb25maWdBU1NFUlQoIHBkRkFMU0UgKTsKKwkJfQorCX0KK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYoIGNvbmZpZ0VOQUJMRV9NUFUgPT0gMSApCisJU3RhY2tUeXBlX3QgKnB4UG9ydEluaXRpYWxpc2VTdGFjayggU3RhY2tUeXBlX3QgKnB4VG9wT2ZTdGFjaywgU3RhY2tUeXBlX3QgKnB4RW5kT2ZTdGFjaywgVGFza0Z1bmN0aW9uX3QgcHhDb2RlLCB2b2lkICpwdlBhcmFtZXRlcnMsIEJhc2VUeXBlX3QgeFJ1blByaXZpbGVnZWQgKSAvKiBQUklWSUxFR0VEX0ZVTkNUSU9OICovCisjZWxzZQorCVN0YWNrVHlwZV90ICpweFBvcnRJbml0aWFsaXNlU3RhY2soIFN0YWNrVHlwZV90ICpweFRvcE9mU3RhY2ssIFN0YWNrVHlwZV90ICpweEVuZE9mU3RhY2ssIFRhc2tGdW5jdGlvbl90IHB4Q29kZSwgdm9pZCAqcHZQYXJhbWV0ZXJzICkgLyogUFJJVklMRUdFRF9GVU5DVElPTiAqLworI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9NUFUgKi8KK3sKKwkvKiBTaW11bGF0ZSB0aGUgc3RhY2sgZnJhbWUgYXMgaXQgd291bGQgYmUgY3JlYXRlZCBieSBhIGNvbnRleHQgc3dpdGNoCisJICogaW50ZXJydXB0LiAqLworCSNpZiggcG9ydFBSRUxPQURfUkVHSVNURVJTID09IDAgKQorCXsKKwkJcHhUb3BPZlN0YWNrLS07IC8qIE9mZnNldCBhZGRlZCB0byBhY2NvdW50IGZvciB0aGUgd2F5IHRoZSBNQ1UgdXNlcyB0aGUgc3RhY2sgb24gZW50cnkvZXhpdCBvZiBpbnRlcnJ1cHRzLiAqLworCQkqcHhUb3BPZlN0YWNrID0gcG9ydElOSVRJQUxfWFBTUjsJCQkJCQkJLyogeFBTUiAqLworCQlweFRvcE9mU3RhY2stLTsKKwkJKnB4VG9wT2ZTdGFjayA9ICggU3RhY2tUeXBlX3QgKSBweENvZGU7CQkJCQkJLyogUEMgKi8KKwkJcHhUb3BPZlN0YWNrLS07CisJCSpweFRvcE9mU3RhY2sgPSAoIFN0YWNrVHlwZV90ICkgcG9ydFRBU0tfUkVUVVJOX0FERFJFU1M7CS8qIExSICovCisJCXB4VG9wT2ZTdGFjayAtPSA1OwkJCQkJCQkJCQkJLyogUjEyLCBSMywgUjIgYW5kIFIxLiAqLworCQkqcHhUb3BPZlN0YWNrID0gKCBTdGFja1R5cGVfdCApIHB2UGFyYW1ldGVyczsJCQkJLyogUjAgKi8KKwkJcHhUb3BPZlN0YWNrIC09IDk7CQkJCQkJCQkJCQkvKiBSMTEuLlI0LCBFWENfUkVUVVJOLiAqLworCQkqcHhUb3BPZlN0YWNrID0gcG9ydElOSVRJQUxfRVhDX1JFVFVSTjsKKworCQkjaWYoIGNvbmZpZ0VOQUJMRV9NUFUgPT0gMSApCisJCXsKKwkJCXB4VG9wT2ZTdGFjay0tOworCQkJaWYoIHhSdW5Qcml2aWxlZ2VkID09IHBkVFJVRSApCisJCQl7CisJCQkJKnB4VG9wT2ZTdGFjayA9IHBvcnRJTklUSUFMX0NPTlRST0xfUFJJVklMRUdFRDsJCS8qIFNsb3QgdXNlZCB0byBob2xkIHRoaXMgdGFzaydzIENPTlRST0wgdmFsdWUuICovCisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJKnB4VG9wT2ZTdGFjayA9IHBvcnRJTklUSUFMX0NPTlRST0xfVU5QUklWSUxFR0VEOwkvKiBTbG90IHVzZWQgdG8gaG9sZCB0aGlzIHRhc2sncyBDT05UUk9MIHZhbHVlLiAqLworCQkJfQorCQl9CisJCSNlbmRpZiAvKiBjb25maWdFTkFCTEVfTVBVICovCisKKwkJcHhUb3BPZlN0YWNrLS07CisJCSpweFRvcE9mU3RhY2sgPSAoIFN0YWNrVHlwZV90ICkgcHhFbmRPZlN0YWNrOwkvKiBTbG90IHVzZWQgdG8gaG9sZCB0aGlzIHRhc2sncyBQU1BMSU0gdmFsdWUuICovCisKKwkJI2lmKCBjb25maWdFTkFCTEVfVFJVU1RaT05FID09IDEgKQorCQl7CisJCQlweFRvcE9mU3RhY2stLTsKKwkJCSpweFRvcE9mU3RhY2sgPSBwb3J0Tk9fU0VDVVJFX0NPTlRFWFQ7CQkvKiBTbG90IHVzZWQgdG8gaG9sZCB0aGlzIHRhc2sncyB4U2VjdXJlQ29udGV4dCB2YWx1ZS4gKi8KKwkJfQorCQkjZW5kaWYgLyogY29uZmlnRU5BQkxFX1RSVVNUWk9ORSAqLworCX0KKwkjZWxzZSAvKiBwb3J0UFJFTE9BRF9SRUdJU1RFUlMgKi8KKwl7CisJCXB4VG9wT2ZTdGFjay0tOyAvKiBPZmZzZXQgYWRkZWQgdG8gYWNjb3VudCBmb3IgdGhlIHdheSB0aGUgTUNVIHVzZXMgdGhlIHN0YWNrIG9uIGVudHJ5L2V4aXQgb2YgaW50ZXJydXB0cy4gKi8KKwkJKnB4VG9wT2ZTdGFjayA9IHBvcnRJTklUSUFMX1hQU1I7CQkJCQkJCS8qIHhQU1IgKi8KKwkJcHhUb3BPZlN0YWNrLS07CisJCSpweFRvcE9mU3RhY2sgPSAoIFN0YWNrVHlwZV90ICkgcHhDb2RlOwkJCQkJCS8qIFBDICovCisJCXB4VG9wT2ZTdGFjay0tOworCQkqcHhUb3BPZlN0YWNrID0gKCBTdGFja1R5cGVfdCApIHBvcnRUQVNLX1JFVFVSTl9BRERSRVNTOwkvKiBMUiAqLworCQlweFRvcE9mU3RhY2stLTsKKwkJKnB4VG9wT2ZTdGFjayA9ICggU3RhY2tUeXBlX3QgKSAweDEyMTIxMjEyVUw7CQkJCS8qIFIxMiAqLworCQlweFRvcE9mU3RhY2stLTsKKwkJKnB4VG9wT2ZTdGFjayA9ICggU3RhY2tUeXBlX3QgKSAweDAzMDMwMzAzVUw7CQkJCS8qIFIzICovCisJCXB4VG9wT2ZTdGFjay0tOworCQkqcHhUb3BPZlN0YWNrID0gKCBTdGFja1R5cGVfdCApIDB4MDIwMjAyMDJVTDsJCQkJLyogUjIgKi8KKwkJcHhUb3BPZlN0YWNrLS07CisJCSpweFRvcE9mU3RhY2sgPSAoIFN0YWNrVHlwZV90ICkgMHgwMTAxMDEwMVVMOwkJCQkvKiBSMSAqLworCQlweFRvcE9mU3RhY2stLTsKKwkJKnB4VG9wT2ZTdGFjayA9ICggU3RhY2tUeXBlX3QgKSBwdlBhcmFtZXRlcnM7CQkJCS8qIFIwICovCisJCXB4VG9wT2ZTdGFjay0tOworCQkqcHhUb3BPZlN0YWNrID0gKCBTdGFja1R5cGVfdCApIDB4MTExMTExMTFVTDsJCQkJLyogUjExICovCisJCXB4VG9wT2ZTdGFjay0tOworCQkqcHhUb3BPZlN0YWNrID0gKCBTdGFja1R5cGVfdCApIDB4MTAxMDEwMTBVTDsJCQkJLyogUjEwICovCisJCXB4VG9wT2ZTdGFjay0tOworCQkqcHhUb3BPZlN0YWNrID0gKCBTdGFja1R5cGVfdCApIDB4MDkwOTA5MDlVTDsJCQkJLyogUjA5ICovCisJCXB4VG9wT2ZTdGFjay0tOworCQkqcHhUb3BPZlN0YWNrID0gKCBTdGFja1R5cGVfdCApIDB4MDgwODA4MDhVTDsJCQkJLyogUjA4ICovCisJCXB4VG9wT2ZTdGFjay0tOworCQkqcHhUb3BPZlN0YWNrID0gKCBTdGFja1R5cGVfdCApIDB4MDcwNzA3MDdVTDsJCQkJLyogUjA3ICovCisJCXB4VG9wT2ZTdGFjay0tOworCQkqcHhUb3BPZlN0YWNrID0gKCBTdGFja1R5cGVfdCApIDB4MDYwNjA2MDZVTDsJCQkJLyogUjA2ICovCisJCXB4VG9wT2ZTdGFjay0tOworCQkqcHhUb3BPZlN0YWNrID0gKCBTdGFja1R5cGVfdCApIDB4MDUwNTA1MDVVTDsJCQkJLyogUjA1ICovCisJCXB4VG9wT2ZTdGFjay0tOworCQkqcHhUb3BPZlN0YWNrID0gKCBTdGFja1R5cGVfdCApIDB4MDQwNDA0MDRVTDsJCQkJLyogUjA0ICovCisJCXB4VG9wT2ZTdGFjay0tOworCQkqcHhUb3BPZlN0YWNrID0gcG9ydElOSVRJQUxfRVhDX1JFVFVSTjsJCQkJCQkvKiBFWENfUkVUVVJOICovCisKKwkJI2lmKCBjb25maWdFTkFCTEVfTVBVID09IDEgKQorCQl7CisJCQlweFRvcE9mU3RhY2stLTsKKwkJCWlmKCB4UnVuUHJpdmlsZWdlZCA9PSBwZFRSVUUgKQorCQkJeworCQkJCSpweFRvcE9mU3RhY2sgPSBwb3J0SU5JVElBTF9DT05UUk9MX1BSSVZJTEVHRUQ7CQkvKiBTbG90IHVzZWQgdG8gaG9sZCB0aGlzIHRhc2sncyBDT05UUk9MIHZhbHVlLiAqLworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCSpweFRvcE9mU3RhY2sgPSBwb3J0SU5JVElBTF9DT05UUk9MX1VOUFJJVklMRUdFRDsJLyogU2xvdCB1c2VkIHRvIGhvbGQgdGhpcyB0YXNrJ3MgQ09OVFJPTCB2YWx1ZS4gKi8KKwkJCX0KKwkJfQorCQkjZW5kaWYgLyogY29uZmlnRU5BQkxFX01QVSAqLworCisJCXB4VG9wT2ZTdGFjay0tOworCQkqcHhUb3BPZlN0YWNrID0gKCBTdGFja1R5cGVfdCApIHB4RW5kT2ZTdGFjazsJLyogU2xvdCB1c2VkIHRvIGhvbGQgdGhpcyB0YXNrJ3MgUFNQTElNIHZhbHVlLiAqLworCisJCSNpZiggY29uZmlnRU5BQkxFX1RSVVNUWk9ORSA9PSAxICkKKwkJeworCQkJcHhUb3BPZlN0YWNrLS07CisJCQkqcHhUb3BPZlN0YWNrID0gcG9ydE5PX1NFQ1VSRV9DT05URVhUOwkJLyogU2xvdCB1c2VkIHRvIGhvbGQgdGhpcyB0YXNrJ3MgeFNlY3VyZUNvbnRleHQgdmFsdWUuICovCisJCX0KKwkJI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9UUlVTVFpPTkUgKi8KKwl9CisJI2VuZGlmIC8qIHBvcnRQUkVMT0FEX1JFR0lTVEVSUyAqLworCisJcmV0dXJuIHB4VG9wT2ZTdGFjazsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitCYXNlVHlwZV90IHhQb3J0U3RhcnRTY2hlZHVsZXIoIHZvaWQgKSAvKiBQUklWSUxFR0VEX0ZVTkNUSU9OICovCit7CisJLyogTWFrZSBQZW5kU1YsIENhbGxTViBhbmQgU3lzVGljayB0aGUgc2FtZSBwcmlvcml0eSBhcyB0aGUga2VybmVsLiAqLworCSooIHBvcnROVklDX1NZU1BSSTIgKSB8PSBwb3J0TlZJQ19QRU5EU1ZfUFJJOworCSooIHBvcnROVklDX1NZU1BSSTIgKSB8PSBwb3J0TlZJQ19TWVNUSUNLX1BSSTsKKworCSNpZiggY29uZmlnRU5BQkxFX01QVSA9PSAxICkKKwl7CisJCS8qIFNldHVwIHRoZSBNZW1vcnkgUHJvdGVjdGlvbiBVbml0IChNUFUpLiAqLworCQlwcnZTZXR1cE1QVSgpOworCX0KKwkjZW5kaWYgLyogY29uZmlnRU5BQkxFX01QVSAqLworCisJLyogU3RhcnQgdGhlIHRpbWVyIHRoYXQgZ2VuZXJhdGVzIHRoZSB0aWNrIElTUi4gSW50ZXJydXB0cyBhcmUgZGlzYWJsZWQKKwkgKiBoZXJlIGFscmVhZHkuICovCisJcHJ2U2V0dXBUaW1lckludGVycnVwdCgpOworCisJLyogSW5pdGlhbGl6ZSB0aGUgY3JpdGljYWwgbmVzdGluZyBjb3VudCByZWFkeSBmb3IgdGhlIGZpcnN0IHRhc2suICovCisJdWxDcml0aWNhbE5lc3RpbmcgPSAwOworCisJLyogU3RhcnQgdGhlIGZpcnN0IHRhc2suICovCisJdlN0YXJ0Rmlyc3RUYXNrKCk7CisKKwkvKiBTaG91bGQgbmV2ZXIgZ2V0IGhlcmUgYXMgdGhlIHRhc2tzIHdpbGwgbm93IGJlIGV4ZWN1dGluZy4gQ2FsbCB0aGUgdGFzaworCSAqIGV4aXQgZXJyb3IgZnVuY3Rpb24gdG8gcHJldmVudCBjb21waWxlciB3YXJuaW5ncyBhYm91dCBhIHN0YXRpYyBmdW5jdGlvbgorCSAqIG5vdCBiZWluZyBjYWxsZWQgaW4gdGhlIGNhc2UgdGhhdCB0aGUgYXBwbGljYXRpb24gd3JpdGVyIG92ZXJyaWRlcyB0aGlzCisJICogZnVuY3Rpb25hbGl0eSBieSBkZWZpbmluZyBjb25maWdUQVNLX1JFVFVSTl9BRERSRVNTLiBDYWxsCisJICogdlRhc2tTd2l0Y2hDb250ZXh0KCkgc28gbGluayB0aW1lIG9wdGltaXphdGlvbiBkb2VzIG5vdCByZW1vdmUgdGhlCisJICogc3ltYm9sLiAqLworCXZUYXNrU3dpdGNoQ29udGV4dCgpOworCXBydlRhc2tFeGl0RXJyb3IoKTsKKworCS8qIFNob3VsZCBub3QgZ2V0IGhlcmUuICovCisJcmV0dXJuIDA7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCB2UG9ydEVuZFNjaGVkdWxlciggdm9pZCApIC8qIFBSSVZJTEVHRURfRlVOQ1RJT04gKi8KK3sKKwkvKiBOb3QgaW1wbGVtZW50ZWQgaW4gcG9ydHMgd2hlcmUgdGhlcmUgaXMgbm90aGluZyB0byByZXR1cm4gdG8uCisJICogQXJ0aWZpY2lhbGx5IGZvcmNlIGFuIGFzc2VydC4gKi8KKwljb25maWdBU1NFUlQoIHVsQ3JpdGljYWxOZXN0aW5nID09IDEwMDBVTCApOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiggY29uZmlnRU5BQkxFX01QVSA9PSAxICkKKwl2b2lkIHZQb3J0U3RvcmVUYXNrTVBVU2V0dGluZ3MoIHhNUFVfU0VUVElOR1MgKnhNUFVTZXR0aW5ncywgY29uc3Qgc3RydWN0IHhNRU1PUllfUkVHSU9OICogY29uc3QgeFJlZ2lvbnMsIFN0YWNrVHlwZV90ICpweEJvdHRvbU9mU3RhY2ssIHVpbnQzMl90IHVsU3RhY2tEZXB0aCApCisJeworCXVpbnQzMl90IHVsUmVnaW9uU3RhcnRBZGRyZXNzLCB1bFJlZ2lvbkVuZEFkZHJlc3MsIHVsUmVnaW9uTnVtYmVyOworCWludDMyX3QgbEluZGV4ID0gMDsKKworCQkvKiBTZXR1cCBNQUlSMC4gKi8KKwkJeE1QVVNldHRpbmdzLT51bE1BSVIwID0gKCAoIHBvcnRNUFVfTk9STUFMX01FTU9SWV9CVUZGRVJBQkxFX0NBQ0hFQUJMRSA8PCBwb3J0TVBVX01BSVJfQVRUUjBfUE9TICkgJiBwb3J0TVBVX01BSVJfQVRUUjBfTUFTSyApOworCQl4TVBVU2V0dGluZ3MtPnVsTUFJUjAgfD0gKCAoIHBvcnRNUFVfREVWSUNFX01FTU9SWV9uR25SRSA8PCBwb3J0TVBVX01BSVJfQVRUUjFfUE9TICkgJiBwb3J0TVBVX01BSVJfQVRUUjFfTUFTSyApOworCisJCS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgdGFzayBpcyBjcmVhdGVkIC0gaW4KKwkJICogd2hpY2ggY2FzZSB0aGUgc3RhY2sgcmVnaW9uIHBhcmFtZXRlcnMgd2lsbCBiZSB2YWxpZC4gIEF0IGFsbCBvdGhlcgorCQkgKiB0aW1lcyB0aGUgc3RhY2sgcGFyYW1ldGVycyB3aWxsIG5vdCBiZSB2YWxpZCBhbmQgaXQgaXMgYXNzdW1lZCB0aGF0CisJCSAqIHRoZSBzdGFjayByZWdpb24gaGFzIGFscmVhZHkgYmVlbiBjb25maWd1cmVkLiAqLworCQlpZiggdWxTdGFja0RlcHRoID4gMCApCisJCXsKKwkJCS8qIERlZmluZSB0aGUgcmVnaW9uIHRoYXQgYWxsb3dzIGFjY2VzcyB0byB0aGUgc3RhY2suICovCisJCQl1bFJlZ2lvblN0YXJ0QWRkcmVzcyA9ICggKCB1aW50MzJfdCApIHB4Qm90dG9tT2ZTdGFjayApICYgcG9ydE1QVV9SQkFSX0FERFJFU1NfTUFTSzsKKwkJCXVsUmVnaW9uRW5kQWRkcmVzcyA9ICggdWludDMyX3QgKSBweEJvdHRvbU9mU3RhY2sgKyAoIHVsU3RhY2tEZXB0aCAqICggdWludDMyX3QgKSBzaXplb2YoIFN0YWNrVHlwZV90ICkgKSAtIDE7CisJCQl1bFJlZ2lvbkVuZEFkZHJlc3MgICY9IHBvcnRNUFVfUkxBUl9BRERSRVNTX01BU0s7CisKKwkJCXhNUFVTZXR0aW5ncy0+eFJlZ2lvbnNTZXR0aW5nc1sgMCBdLnVsUkJBUiA9CSggdWxSZWdpb25TdGFydEFkZHJlc3MgKSB8CisJCQkJCQkJCQkJCQkJCQkoIHBvcnRNUFVfUkVHSU9OX05PTl9TSEFSRUFCTEUgKSB8CisJCQkJCQkJCQkJCQkJCQkoIHBvcnRNUFVfUkVHSU9OX1JFQURfV1JJVEUgKSB8CisJCQkJCQkJCQkJCQkJCQkoIHBvcnRNUFVfUkVHSU9OX0VYRUNVVEVfTkVWRVIgKTsKKworCQkJeE1QVVNldHRpbmdzLT54UmVnaW9uc1NldHRpbmdzWyAwIF0udWxSTEFSID0JKCB1bFJlZ2lvbkVuZEFkZHJlc3MgKSB8CisJCQkJCQkJCQkJCQkJCQkoIHBvcnRNUFVfUkxBUl9BVFRSX0lOREVYMCApIHwKKwkJCQkJCQkJCQkJCQkJCSggcG9ydE1QVV9STEFSX1JFR0lPTl9FTkFCTEUgKTsKKwkJfQorCisJCS8qIFVzZXIgc3VwcGxpZWQgY29uZmlndXJhYmxlIHJlZ2lvbnMuICovCisJCWZvciggdWxSZWdpb25OdW1iZXIgPSAxOyB1bFJlZ2lvbk51bWJlciA8PSBwb3J0TlVNX0NPTkZJR1VSQUJMRV9SRUdJT05TOyB1bFJlZ2lvbk51bWJlcisrICkKKwkJeworCQkJLyogSWYgeFJlZ2lvbnMgaXMgTlVMTCBpLmUuIHRoZSB0YXNrIGhhcyBub3Qgc3BlY2lmaWVkIGFueSBNUFUKKwkJCSAqIHJlZ2lvbiwgdGhlIGVsc2UgcGFydCBlbnN1cmVzIHRoYXQgYWxsIHRoZSBjb25maWd1cmFibGUgTVBVCisJCQkgKiByZWdpb25zIGFyZSBpbnZhbGlkYXRlZC4gKi8KKwkJCWlmKCAoIHhSZWdpb25zICE9IE5VTEwgKSAmJiAoIHhSZWdpb25zWyBsSW5kZXggXS51bExlbmd0aEluQnl0ZXMgPiAwVUwgKSApCisJCQl7CisJCQkJLyogVHJhbnNsYXRlIHRoZSBnZW5lcmljIHJlZ2lvbiBkZWZpbml0aW9uIGNvbnRhaW5lZCBpbiB4UmVnaW9ucworCQkJCSAqIGludG8gdGhlIEFSTXY4IHNwZWNpZmljIE1QVSBzZXR0aW5ncyB0aGF0IGFyZSB0aGVuIHN0b3JlZCBpbgorCQkJCSAqIHhNUFVTZXR0aW5ncy4gKi8KKwkJCQl1bFJlZ2lvblN0YXJ0QWRkcmVzcyA9ICggKCB1aW50MzJfdCApIHhSZWdpb25zWyBsSW5kZXggXS5wdkJhc2VBZGRyZXNzICkgJiBwb3J0TVBVX1JCQVJfQUREUkVTU19NQVNLOworCQkJCXVsUmVnaW9uRW5kQWRkcmVzcyA9ICggdWludDMyX3QgKSB4UmVnaW9uc1sgbEluZGV4IF0ucHZCYXNlQWRkcmVzcyArIHhSZWdpb25zWyBsSW5kZXggXS51bExlbmd0aEluQnl0ZXMgLSAxOworCQkJCXVsUmVnaW9uRW5kQWRkcmVzcyAgJj0gcG9ydE1QVV9STEFSX0FERFJFU1NfTUFTSzsKKworCQkJCS8qIFN0YXJ0IGFkZHJlc3MuICovCisJCQkJeE1QVVNldHRpbmdzLT54UmVnaW9uc1NldHRpbmdzWyB1bFJlZ2lvbk51bWJlciBdLnVsUkJBUiA9CSggdWxSZWdpb25TdGFydEFkZHJlc3MgKSB8CisJCQkJCQkJCQkJCQkJCQkJCQkJKCBwb3J0TVBVX1JFR0lPTl9OT05fU0hBUkVBQkxFICk7CisKKwkJCQkvKiBSTy9SVy4gKi8KKwkJCQlpZiggKCB4UmVnaW9uc1sgbEluZGV4IF0udWxQYXJhbWV0ZXJzICYgdHNrTVBVX1JFR0lPTl9SRUFEX09OTFkgKSAhPSAwICkKKwkJCQl7CisJCQkJCXhNUFVTZXR0aW5ncy0+eFJlZ2lvbnNTZXR0aW5nc1sgdWxSZWdpb25OdW1iZXIgXS51bFJCQVIgfD0gKCBwb3J0TVBVX1JFR0lPTl9SRUFEX09OTFkgKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJeE1QVVNldHRpbmdzLT54UmVnaW9uc1NldHRpbmdzWyB1bFJlZ2lvbk51bWJlciBdLnVsUkJBUiB8PSAoIHBvcnRNUFVfUkVHSU9OX1JFQURfV1JJVEUgKTsKKwkJCQl9CisKKwkJCQkvKiBYTi4gKi8KKwkJCQlpZiggKCB4UmVnaW9uc1sgbEluZGV4IF0udWxQYXJhbWV0ZXJzICYgdHNrTVBVX1JFR0lPTl9FWEVDVVRFX05FVkVSICkgIT0gMCApCisJCQkJeworCQkJCQl4TVBVU2V0dGluZ3MtPnhSZWdpb25zU2V0dGluZ3NbIHVsUmVnaW9uTnVtYmVyIF0udWxSQkFSIHw9ICggcG9ydE1QVV9SRUdJT05fRVhFQ1VURV9ORVZFUiApOworCQkJCX0KKworCQkJCS8qIEVuZCBBZGRyZXNzLiAqLworCQkJCXhNUFVTZXR0aW5ncy0+eFJlZ2lvbnNTZXR0aW5nc1sgdWxSZWdpb25OdW1iZXIgXS51bFJMQVIgPQkoIHVsUmVnaW9uRW5kQWRkcmVzcyApIHwKKwkJCQkJCQkJCQkJCQkJCQkJCQkoIHBvcnRNUFVfUkxBUl9SRUdJT05fRU5BQkxFICk7CisKKwkJCQkvKiBOb3JtYWwgbWVtb3J5LyBEZXZpY2UgbWVtb3J5LiAqLworCQkJCWlmKCAoIHhSZWdpb25zWyBsSW5kZXggXS51bFBhcmFtZXRlcnMgJiB0c2tNUFVfUkVHSU9OX0RFVklDRV9NRU1PUlkgKSAhPSAwICkKKwkJCQl7CisJCQkJCS8qIEF0dHIxIGluIE1BSVIwIGlzIGNvbmZpZ3VyZWQgYXMgZGV2aWNlIG1lbW9yeS4gKi8KKwkJCQkJeE1QVVNldHRpbmdzLT54UmVnaW9uc1NldHRpbmdzWyB1bFJlZ2lvbk51bWJlciBdLnVsUkxBUiB8PSBwb3J0TVBVX1JMQVJfQVRUUl9JTkRFWDE7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCS8qIEF0dHIxIGluIE1BSVIwIGlzIGNvbmZpZ3VyZWQgYXMgbm9ybWFsIG1lbW9yeS4gKi8KKwkJCQkJeE1QVVNldHRpbmdzLT54UmVnaW9uc1NldHRpbmdzWyB1bFJlZ2lvbk51bWJlciBdLnVsUkxBUiB8PSBwb3J0TVBVX1JMQVJfQVRUUl9JTkRFWDA7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8qIEludmFsaWRhdGUgdGhlIHJlZ2lvbi4gKi8KKwkJCQl4TVBVU2V0dGluZ3MtPnhSZWdpb25zU2V0dGluZ3NbIHVsUmVnaW9uTnVtYmVyIF0udWxSQkFSID0gMFVMOworCQkJCXhNUFVTZXR0aW5ncy0+eFJlZ2lvbnNTZXR0aW5nc1sgdWxSZWdpb25OdW1iZXIgXS51bFJMQVIgPSAwVUw7CisJCQl9CisKKwkJCWxJbmRleCsrOworCQl9CisJfQorI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9NUFUgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpkaWZmIC0tZ2l0IGEvU291cmNlL3BvcnRhYmxlL0dDQy9BUk1fQ00zMy9ub25fc2VjdXJlL3BvcnRhc20uYyBiL1NvdXJjZS9wb3J0YWJsZS9HQ0MvQVJNX0NNMzMvbm9uX3NlY3VyZS9wb3J0YXNtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2EyNGYzYQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9wb3J0YWJsZS9HQ0MvQVJNX0NNMzMvbm9uX3NlY3VyZS9wb3J0YXNtLmMKQEAgLTAsMCArMSw0MTUgQEAKKy8qCisgKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjIuMQorICogQ29weXJpZ2h0IChDKSAyMDE5IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKKyAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCisgKiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCisgKiB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZgorICogdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLAorICogc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCisgKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUworICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SCisgKiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIKKyAqIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIGh0dHA6Ly93d3cuRnJlZVJUT1Mub3JnCisgKiBodHRwOi8vYXdzLmFtYXpvbi5jb20vZnJlZXJ0b3MKKyAqCisgKiAxIHRhYiA9PSA0IHNwYWNlcyEKKyAqLworCisvKiBTdGFuZGFyZCBpbmNsdWRlcy4gKi8KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLyogRGVmaW5pbmcgTVBVX1dSQVBQRVJTX0lOQ0xVREVEX0ZST01fQVBJX0ZJTEUgZW5zdXJlcyB0aGF0IFBSSVZJTEVHRURfRlVOQ1RJT04KKyAqIGlzIGRlZmluZWQgY29ycmVjdGx5IGFuZCBwcml2aWxlZ2VkIGZ1bmN0aW9ucyBhcmUgcGxhY2VkIGluIGNvcnJlY3Qgc2VjdGlvbnMuICovCisjZGVmaW5lIE1QVV9XUkFQUEVSU19JTkNMVURFRF9GUk9NX0FQSV9GSUxFCisKKy8qIFBvcnRhc20gaW5jbHVkZXMuICovCisjaW5jbHVkZSAicG9ydGFzbS5oIgorCisvKiBNUFVfV1JBUFBFUlNfSU5DTFVERURfRlJPTV9BUElfRklMRSBpcyBuZWVkZWQgdG8gYmUgZGVmaW5lZCBvbmx5IGZvciB0aGUKKyAqIGhlYWRlciBmaWxlcy4gKi8KKyN1bmRlZiBNUFVfV1JBUFBFUlNfSU5DTFVERURfRlJPTV9BUElfRklMRQorCit2b2lkIHZSZXN0b3JlQ29udGV4dE9mRmlyc3RUYXNrKCB2b2lkICkgLyogX19hdHRyaWJ1dGVfXyAoKCBuYWtlZCApKSBQUklWSUxFR0VEX0ZVTkNUSU9OICovCit7CisJX19hc20gdm9sYXRpbGUKKwkoCisJIgkuc3ludGF4IHVuaWZpZWQJCQkJCQkJCQlcbiIKKwkiCQkJCQkJCQkJCQkJCVxuIgorCSIJbGRyICByMiwgcHhDdXJyZW50VENCQ29uc3QyCQkJCQkJXG4iIC8qIFJlYWQgdGhlIGxvY2F0aW9uIG9mIHB4Q3VycmVudFRDQiBpLmUuICYoIHB4Q3VycmVudFRDQiApLiAqLworCSIJbGRyICByMywgW3IyXQkJCQkJCQkJCVxuIiAvKiBSZWFkIHB4Q3VycmVudFRDQi4gKi8KKwkiCWxkciAgcjAsIFtyM10JCQkJCQkJCQlcbiIgLyogUmVhZCB0b3Agb2Ygc3RhY2sgZnJvbSBUQ0IgLSBUaGUgZmlyc3QgaXRlbSBpbiBweEN1cnJlbnRUQ0IgaXMgdGhlIHRhc2sgdG9wIG9mIHN0YWNrLiAqLworCSIJCQkJCQkJCQkJCQkJXG4iCisJI2lmKCBjb25maWdFTkFCTEVfTVBVID09IDEgKQorCSIJZG1iCQkJCQkJCQkJCQkJXG4iIC8qIENvbXBsZXRlIG91dHN0YW5kaW5nIHRyYW5zZmVycyBiZWZvcmUgZGlzYWJsaW5nIE1QVS4gKi8KKwkiCWxkciByMiwgeE1QVUNUUkxDb25zdDIJCQkJCQkJXG4iIC8qIHIyID0gMHhlMDAwZWQ5NCBbTG9jYXRpb24gb2YgTVBVX0NUUkxdLiAqLworCSIJbGRyIHI0LCBbcjJdCQkJCQkJCQkJXG4iIC8qIFJlYWQgdGhlIHZhbHVlIG9mIE1QVV9DVFJMLiAqLworCSIJYmljIHI0LCAjMQkJCQkJCQkJCQlcbiIgLyogcjQgPSByNCAmIH4xIGkuZS4gQ2xlYXIgdGhlIGJpdCAwIGluIHI0LiAqLworCSIJc3RyIHI0LCBbcjJdCQkJCQkJCQkJXG4iIC8qIERpc2FibGUgTVBVLiAqLworCSIJCQkJCQkJCQkJCQkJXG4iCisJIglhZGRzIHIzLCAjNAkJCQkJCQkJCQlcbiIgLyogcjMgPSByMyArIDQuIHIzIG5vdyBwb2ludHMgdG8gTUFJUjAgaW4gVENCLiAqLworCSIJbGRyICByNCwgW3IzXQkJCQkJCQkJCVxuIiAvKiByNCA9ICpyMyBpLmUuIHI0ID0gTUFJUjAuICovCisJIglsZHIgIHIyLCB4TUFJUjBDb25zdDIJCQkJCQkJXG4iIC8qIHIyID0gMHhlMDAwZWRjMCBbTG9jYXRpb24gb2YgTUFJUjBdLiAqLworCSIJc3RyICByNCwgW3IyXQkJCQkJCQkJCVxuIiAvKiBQcm9ncmFtIE1BSVIwLiAqLworCSIJbGRyICByMiwgeFJOUkNvbnN0MgkJCQkJCQkJXG4iIC8qIHIyID0gMHhlMDAwZWQ5OCBbTG9jYXRpb24gb2YgUk5SXS4gKi8KKwkiCW1vdnMgcjQsICM0CQkJCQkJCQkJCVxuIiAvKiByNCA9IDQuICovCisJIglzdHIgIHI0LCBbcjJdCQkJCQkJCQkJXG4iIC8qIFByb2dyYW0gUk5SID0gNC4gKi8KKwkiCWFkZHMgcjMsICM0CQkJCQkJCQkJCVxuIiAvKiByMyA9IHIzICsgNC4gcjMgbm93IHBvaW50cyB0byBmaXJzdCBSQkFSIGluIFRDQi4gKi8KKwkiCWxkciAgcjIsIHhSQkFSQ29uc3QyCQkJCQkJCVxuIiAvKiByMiA9IDB4ZTAwMGVkOWMgW0xvY2F0aW9uIG9mIFJCQVJdLiAqLworCSIJbGRtaWEgcjMhLCB7cjQtcjExfQkJCQkJCQkJXG4iIC8qIFJlYWQgNCBzZXQgb2YgUkJBUi9STEFSIHJlZ2lzdGVycyBmcm9tIFRDQi4gKi8KKwkiCXN0bWlhIHIyISwge3I0LXIxMX0JCQkJCQkJCVxuIiAvKiBXcml0ZSA0IHNldCBvZiBSQkFSL1JMQVIgcmVnaXN0ZXJzIHVzaW5nIGFsaWFzIHJlZ2lzdGVycy4gKi8KKwkiCQkJCQkJCQkJCQkJCVxuIgorCSIJbGRyIHIyLCB4TVBVQ1RSTENvbnN0MgkJCQkJCQlcbiIgLyogcjIgPSAweGUwMDBlZDk0IFtMb2NhdGlvbiBvZiBNUFVfQ1RSTF0uICovCisJIglsZHIgcjQsIFtyMl0JCQkJCQkJCQlcbiIgLyogUmVhZCB0aGUgdmFsdWUgb2YgTVBVX0NUUkwuICovCisJIglvcnIgcjQsICMxCQkJCQkJCQkJCVxuIiAvKiByNCA9IHI0IHwgMSBpLmUuIFNldCB0aGUgYml0IDAgaW4gcjQuICovCisJIglzdHIgcjQsIFtyMl0JCQkJCQkJCQlcbiIgLyogRW5hYmxlIE1QVS4gKi8KKwkiCWRzYgkJCQkJCQkJCQkJCVxuIiAvKiBGb3JjZSBtZW1vcnkgd3JpdGVzIGJlZm9yZSBjb250aW51aW5nLiAqLworCSNlbmRpZiAvKiBjb25maWdFTkFCTEVfTVBVICovCisJIgkJCQkJCQkJCQkJCQlcbiIKKwkjaWYoIGNvbmZpZ0VOQUJMRV9NUFUgPT0gMSApCisJIglsZG0gIHIwISwge3IxLXI0fQkJCQkJCQkJXG4iIC8qIFJlYWQgZnJvbSBzdGFjayAtIHIxID0geFNlY3VyZUNvbnRleHQsIHIyID0gUFNQTElNLCByMyA9IENPTlRST0wgYW5kIHI0ID0gRVhDX1JFVFVSTi4gKi8KKwkiCWxkciAgcjUsIHhTZWN1cmVDb250ZXh0Q29uc3QyCQkJCQlcbiIKKwkiCXN0ciAgcjEsIFtyNV0JCQkJCQkJCQlcbiIgLyogU2V0IHhTZWN1cmVDb250ZXh0IHRvIHRoaXMgdGFzaydzIHZhbHVlIGZvciB0aGUgc2FtZS4gKi8KKwkiCW1zciAgcHNwbGltLCByMgkJCQkJCQkJCVxuIiAvKiBTZXQgdGhpcyB0YXNrJ3MgUFNQTElNIHZhbHVlLiAqLworCSIJbXNyICBjb250cm9sLCByMwkJCQkJCQkJXG4iIC8qIFNldCB0aGlzIHRhc2sncyBDT05UUk9MIHZhbHVlLiAqLworCSIJYWRkcyByMCwgIzMyCQkJCQkJCQkJXG4iIC8qIERpc2NhcmQgZXZlcnl0aGluZyB1cCB0byByMC4gKi8KKwkiCW1zciAgcHNwLCByMAkJCQkJCQkJCVxuIiAvKiBUaGlzIGlzIG5vdyB0aGUgbmV3IHRvcCBvZiBzdGFjayB0byB1c2UgaW4gdGhlIHRhc2suICovCisJIglpc2IJCQkJCQkJCQkJCQlcbiIKKwkiCWJ4ICAgcjQJCQkJCQkJCQkJCVxuIiAvKiBGaW5hbGx5LCBicmFuY2ggdG8gRVhDX1JFVFVSTi4gKi8KKwkjZWxzZSAvKiBjb25maWdFTkFCTEVfTVBVICovCisJIglsZG0gIHIwISwge3IxLXIzfQkJCQkJCQkJXG4iIC8qIFJlYWQgZnJvbSBzdGFjayAtIHIxID0geFNlY3VyZUNvbnRleHQsIHIyID0gUFNQTElNIGFuZCByMyA9IEVYQ19SRVRVUk4uICovCisJIglsZHIgIHI0LCB4U2VjdXJlQ29udGV4dENvbnN0MgkJCQkJXG4iCisJIglzdHIgIHIxLCBbcjRdCQkJCQkJCQkJXG4iIC8qIFNldCB4U2VjdXJlQ29udGV4dCB0byB0aGlzIHRhc2sncyB2YWx1ZSBmb3IgdGhlIHNhbWUuICovCisJIgltc3IgIHBzcGxpbSwgcjIJCQkJCQkJCQlcbiIgLyogU2V0IHRoaXMgdGFzaydzIFBTUExJTSB2YWx1ZS4gKi8KKwkiCW1vdnMgcjEsICMyCQkJCQkJCQkJCVxuIiAvKiByMSA9IDIuICovCisJIgltc3IgIENPTlRST0wsIHIxCQkJCQkJCQlcbiIgLyogU3dpdGNoIHRvIHVzZSBQU1AgaW4gdGhlIHRocmVhZCBtb2RlLiAqLworCSIJYWRkcyByMCwgIzMyCQkJCQkJCQkJXG4iIC8qIERpc2NhcmQgZXZlcnl0aGluZyB1cCB0byByMC4gKi8KKwkiCW1zciAgcHNwLCByMAkJCQkJCQkJCVxuIiAvKiBUaGlzIGlzIG5vdyB0aGUgbmV3IHRvcCBvZiBzdGFjayB0byB1c2UgaW4gdGhlIHRhc2suICovCisJIglpc2IJCQkJCQkJCQkJCQlcbiIKKwkiCWJ4ICAgcjMJCQkJCQkJCQkJCVxuIiAvKiBGaW5hbGx5LCBicmFuY2ggdG8gRVhDX1JFVFVSTi4gKi8KKwkjZW5kaWYgLyogY29uZmlnRU5BQkxFX01QVSAqLworCSIJCQkJCQkJCQkJCQkJXG4iCisJIgkuYWxpZ24gNAkJCQkJCQkJCQlcbiIKKwkicHhDdXJyZW50VENCQ29uc3QyOiAud29yZCBweEN1cnJlbnRUQ0IJCQkJXG4iCisJInhTZWN1cmVDb250ZXh0Q29uc3QyOiAud29yZCB4U2VjdXJlQ29udGV4dAkJCVxuIgorCSNpZiggY29uZmlnRU5BQkxFX01QVSA9PSAxICkKKwkieE1QVUNUUkxDb25zdDI6IC53b3JkIDB4ZTAwMGVkOTQJCQkJCVxuIgorCSJ4TUFJUjBDb25zdDI6IC53b3JkIDB4ZTAwMGVkYzAJCQkJCQlcbiIKKwkieFJOUkNvbnN0MjogLndvcmQgMHhlMDAwZWQ5OAkJCQkJCVxuIgorCSJ4UkJBUkNvbnN0MjogLndvcmQgMHhlMDAwZWQ5YwkJCQkJCVxuIgorCSNlbmRpZiAvKiBjb25maWdFTkFCTEVfTVBVICovCisJKTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitCYXNlVHlwZV90IHhJc1ByaXZpbGVnZWQoIHZvaWQgKSAvKiBfX2F0dHJpYnV0ZV9fICgoIG5ha2VkICkpICovCit7CisJX19hc20gdm9sYXRpbGUKKwkoCisJIgltcnMgcjAsIGNvbnRyb2wJCQkJCQkJCQlcbiIgLyogcjAgPSBDT05UUk9MLiAqLworCSIJdHN0IHIwLCAjMQkJCQkJCQkJCQlcbiIgLyogUGVyZm9ybSByMCAmIDEgKGJpdHdpc2UgQU5EKSBhbmQgdXBkYXRlIHRoZSBjb25kaXRpb25zIGZsYWcuICovCisJIglpdGUgbmUJCQkJCQkJCQkJCVxuIgorCSIJbW92bmUgcjAsICMwCQkJCQkJCQkJXG4iIC8qIENPTlRST0xbMF0hPTAuIFJldHVybiBmYWxzZSB0byBpbmRpY2F0ZSB0aGF0IHRoZSBwcm9jZXNzb3IgaXMgbm90IHByaXZpbGVnZWQuICovCisJIgltb3ZlcSByMCwgIzEJCQkJCQkJCQlcbiIgLyogQ09OVFJPTFswXT09MC4gUmV0dXJuIHRydWUgdG8gaW5kaWNhdGUgdGhhdCB0aGUgcHJvY2Vzc29yIGlzIHByaXZpbGVnZWQuICovCisJIglieCBscgkJCQkJCQkJCQkJXG4iIC8qIFJldHVybi4gKi8KKwkiCQkJCQkJCQkJCQkJCVxuIgorCSIJLmFsaWduIDQJCQkJCQkJCQkJXG4iCisJOjo6ICJyMCIsICJtZW1vcnkiCisJKTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIHZSYWlzZVByaXZpbGVnZSggdm9pZCApIC8qIF9fYXR0cmlidXRlX18gKCggbmFrZWQgKSkgUFJJVklMRUdFRF9GVU5DVElPTiAqLworeworCSBfX2FzbSB2b2xhdGlsZQorCSgKKwkiCW1ycyByMCwgY29udHJvbAkJCQkJCQkJCVxuIiAvKiBSZWFkIHRoZSBDT05UUk9MIHJlZ2lzdGVyLiAqLworCSIJYmljIHIwLCAjMQkJCQkJCQkJCQlcbiIgLyogQ2xlYXIgdGhlIGJpdCAwLiAqLworCSIJbXNyIGNvbnRyb2wsIHIwCQkJCQkJCQkJXG4iIC8qIFdyaXRlIGJhY2sgdGhlIG5ldyBDT05UUk9MIHZhbHVlLiAqLworCSIJYnggbHIJCQkJCQkJCQkJCVxuIiAvKiBSZXR1cm4gdG8gdGhlIGNhbGxlci4gKi8KKwk6OjogInIwIiwgIm1lbW9yeSIKKwkpOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgdlJlc2V0UHJpdmlsZWdlKCB2b2lkICkgLyogX19hdHRyaWJ1dGVfXyAoKCBuYWtlZCApKSAqLworeworCV9fYXNtIHZvbGF0aWxlCisJKAorCSIJbXJzIHIwLCBjb250cm9sCQkJCQkJCQkJXG4iIC8qIHIwID0gQ09OVFJPTC4gKi8KKwkiCW9yciByMCwgIzEJCQkJCQkJCQkJXG4iIC8qIHIwID0gcjAgfCAxLiAqLworCSIJbXNyIGNvbnRyb2wsIHIwCQkJCQkJCQkJXG4iIC8qIENPTlRST0wgPSByMC4gKi8KKwkiCWJ4IGxyCQkJCQkJCQkJCQlcbiIgLyogUmV0dXJuIHRvIHRoZSBjYWxsZXIuICovCisJOjo6InIwIiwgIm1lbW9yeSIKKwkpOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgdlN0YXJ0Rmlyc3RUYXNrKCB2b2lkICkgLyogX19hdHRyaWJ1dGVfXyAoKCBuYWtlZCApKSBQUklWSUxFR0VEX0ZVTkNUSU9OICovCit7CisJX19hc20gdm9sYXRpbGUKKwkoCisJIglsZHIgcjAsIHhWVE9SQ29uc3QJCQkJCQkJCVxuIiAvKiBVc2UgdGhlIE5WSUMgb2Zmc2V0IHJlZ2lzdGVyIHRvIGxvY2F0ZSB0aGUgc3RhY2suICovCisJIglsZHIgcjAsIFtyMF0JCQkJCQkJCQlcbiIgLyogUmVhZCB0aGUgVlRPUiByZWdpc3RlciB3aGljaCBnaXZlcyB0aGUgYWRkcmVzcyBvZiB2ZWN0b3IgdGFibGUuICovCisJIglsZHIgcjAsIFtyMF0JCQkJCQkJCQlcbiIgLyogVGhlIGZpcnN0IGVudHJ5IGluIHZlY3RvciB0YWJsZSBpcyBzdGFjayBwb2ludGVyLiAqLworCSIJbXNyIG1zcCwgcjAJCQkJCQkJCQkJXG4iIC8qIFNldCB0aGUgTVNQIGJhY2sgdG8gdGhlIHN0YXJ0IG9mIHRoZSBzdGFjay4gKi8KKwkiCWNwc2llIGkJCQkJCQkJCQkJCVxuIiAvKiBHbG9iYWxseSBlbmFibGUgaW50ZXJydXB0cy4gKi8KKwkiCWNwc2llIGYJCQkJCQkJCQkJCVxuIgorCSIJZHNiCQkJCQkJCQkJCQkJXG4iCisJIglpc2IJCQkJCQkJCQkJCQlcbiIKKwkiCXN2YyAlMAkJCQkJCQkJCQkJXG4iIC8qIFN5c3RlbSBjYWxsIHRvIHN0YXJ0IHRoZSBmaXJzdCB0YXNrLiAqLworCSIJbm9wCQkJCQkJCQkJCQkJXG4iCisJIgkJCQkJCQkJCQkJCQlcbiIKKwkiICAgLmFsaWduIDQJCQkJCQkJCQkJXG4iCisJInhWVE9SQ29uc3Q6IC53b3JkIDB4ZTAwMGVkMDgJCQkJCQlcbiIKKwk6OiAiaSIgKCBwb3J0U1ZDX1NUQVJUX1NDSEVEVUxFUiApIDogIm1lbW9yeSIKKwkpOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3VpbnQzMl90IHVsU2V0SW50ZXJydXB0TWFza0Zyb21JU1IoIHZvaWQgKSAvKiBfX2F0dHJpYnV0ZV9fKCggbmFrZWQgKSkgUFJJVklMRUdFRF9GVU5DVElPTiAqLworeworCV9fYXNtIHZvbGF0aWxlCisJKAorCSIJbXJzIHIwLCBQUklNQVNLCQkJCQkJCQkJXG4iCisJIgljcHNpZCBpCQkJCQkJCQkJCQlcbiIKKwkiCWJ4IGxyCQkJCQkJCQkJCQlcbiIKKwk6OjogIm1lbW9yeSIKKwkpOworCisjaWYgIWRlZmluZWQgKF9fQVJNQ0NfVkVSU0lPTikgJiYgKF9fQVJNQ0NfVkVSU0lPTiA+PSA2MDEwMDUwKQorCS8qIFRvIGF2b2lkIGNvbXBpbGVyIHdhcm5pbmdzLiAgVGhlIHJldHVybiBzdGF0ZW1lbnQgd2lsbCBuZXZlciBiZSByZWFjaGVkLAorCSAqIGJ1dCBzb21lIGNvbXBpbGVycyB3YXJuIGlmIGl0IGlzIG5vdCBpbmNsdWRlZCwgd2hpbGUgb3RoZXJzIHdvbid0IGNvbXBpbGUKKwkgKiBpZiBpdCBpcy4gKi8KKwlyZXR1cm4gMDsKKyNlbmRpZgorfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgdkNsZWFySW50ZXJydXB0TWFza0Zyb21JU1IoIF9fYXR0cmlidXRlX18oICggdW51c2VkICkgKSB1aW50MzJfdCB1bE1hc2sgKSAvKiBfX2F0dHJpYnV0ZV9fKCggbmFrZWQgKSkgUFJJVklMRUdFRF9GVU5DVElPTiAqLworeworCV9fYXNtIHZvbGF0aWxlCisJKAorCSIJbXNyIFBSSU1BU0ssIHIwCQkJCQkJCQkJXG4iCisJIglieCBscgkJCQkJCQkJCQkJXG4iCisJOjo6ICJtZW1vcnkiCisJKTsKKworI2lmICFkZWZpbmVkIChfX0FSTUNDX1ZFUlNJT04pICYmIChfX0FSTUNDX1ZFUlNJT04gPj0gNjAxMDA1MCkKKwkvKiBKdXN0IHRvIGF2b2lkIGNvbXBpbGVyIHdhcm5pbmcuICB1bE1hc2sgaXMgdXNlZCBmcm9tIHRoZSBhc20gY29kZSBidXQKKwkgKiB0aGUgY29tcGlsZXIgY2FuJ3Qgc2VlIHRoYXQuICBTb21lIGNvbXBpbGVycyBnZW5lcmF0ZSB3YXJuaW5ncyB3aXRob3V0CisJICogdGhlIGZvbGxvd2luZyBsaW5lLCB3aGlsZSBvdGhlcnMgZ2VuZXJhdGUgd2FybmluZ3MgaWYgdGhlIGxpbmUgaXMKKwkgKiBpbmNsdWRlZC4gKi8KKwkoIHZvaWQgKSB1bE1hc2s7CisjZW5kaWYKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIFBlbmRTVl9IYW5kbGVyKCB2b2lkICkgLyogX19hdHRyaWJ1dGVfXyAoKCBuYWtlZCApKSBQUklWSUxFR0VEX0ZVTkNUSU9OICovCit7CisJX19hc20gdm9sYXRpbGUKKwkoCisJIgkuc3ludGF4IHVuaWZpZWQJCQkJCQkJCQlcbiIKKwkiCS5leHRlcm4gU2VjdXJlQ29udGV4dF9TYXZlQ29udGV4dAkJCQlcbiIKKwkiCS5leHRlcm4gU2VjdXJlQ29udGV4dF9Mb2FkQ29udGV4dAkJCQlcbiIKKwkiCQkJCQkJCQkJCQkJCVxuIgorCSIJbXJzIHIxLCBwc3AJCQkJCQkJCQkJXG4iIC8qIFJlYWQgUFNQIGluIHIxLiAqLworCSIJbGRyIHIyLCB4U2VjdXJlQ29udGV4dENvbnN0CQkJCQkJXG4iIC8qIFJlYWQgdGhlIGxvY2F0aW9uIG9mIHhTZWN1cmVDb250ZXh0IGkuZS4gJiggeFNlY3VyZUNvbnRleHQgKS4gKi8KKwkiCWxkciByMCwgW3IyXQkJCQkJCQkJCVxuIiAvKiBSZWFkIHhTZWN1cmVDb250ZXh0IC0gVmFsdWUgb2YgeFNlY3VyZUNvbnRleHQgbXVzdCBiZSBpbiByMCBhcyBpdCBpcyB1c2VkIGFzIGEgcGFyYW1ldGVyIGxhdGVyLiAqLworCSIJCQkJCQkJCQkJCQkJXG4iCisJIgljYnogcjAsIHNhdmVfbnNfY29udGV4dAkJCQkJCQlcbiIgLyogTm8gc2VjdXJlIGNvbnRleHQgdG8gc2F2ZS4gKi8KKwkiCXB1c2gge3IwLXIyLCByMTR9CQkJCQkJCQlcbiIKKwkiCWJsIFNlY3VyZUNvbnRleHRfU2F2ZUNvbnRleHQJCQkJCVxuIgorCSIJcG9wIHtyMC1yM30JCQkJCQkJCQkJXG4iIC8qIExSIGlzIG5vdyBpbiByMy4gKi8KKwkiCW1vdiBsciwgcjMJCQkJCQkJCQkJXG4iIC8qIExSID0gcjMuICovCisJIglsc2xzIHIyLCByMywgIzI1CQkJCQkJCQlcbiIgLyogcjIgPSByMyA8PCAyNS4gQml0WzZdIG9mIEVYQ19SRVRVUk4gaXMgMSBpZiBzZWN1cmUgc3RhY2sgd2FzIHVzZWQsIDAgaWYgbm9uLXNlY3VyZSBzdGFjayB3YXMgdXNlZCB0byBzdG9yZSBzdGFjayBmcmFtZS4gKi8KKwkiCWJwbCBzYXZlX25zX2NvbnRleHQJCQkJCQkJCVxuIiAvKiBicGwgLSBicmFuY2ggaWYgcG9zaXRpdmUgb3IgemVyby4gSWYgcjIgPj0gMCA9PT4gQml0WzZdIGluIEVYQ19SRVRVUk4gaXMgMCBpLmUuIG5vbi1zZWN1cmUgc3RhY2sgd2FzIHVzZWQuICovCisJIglsZHIgcjMsIHB4Q3VycmVudFRDQkNvbnN0CQkJCQkJXG4iIC8qIFJlYWQgdGhlIGxvY2F0aW9uIG9mIHB4Q3VycmVudFRDQiBpLmUuICYoIHB4Q3VycmVudFRDQiApLiAqLworCSIJbGRyIHIyLCBbcjNdCQkJCQkJCQkJXG4iIC8qIFJlYWQgcHhDdXJyZW50VENCLiAqLworCSNpZiggY29uZmlnRU5BQkxFX01QVSA9PSAxICkKKwkiCXN1YnMgcjEsIHIxLCAjMTYJCQkJCQkJCVxuIiAvKiBNYWtlIHNwYWNlIGZvciB4U2VjdXJlQ29udGV4dCwgUFNQTElNLCBDT05UUk9MIGFuZCBMUiBvbiB0aGUgc3RhY2suICovCisJIglzdHIgcjEsIFtyMl0JCQkJCQkJCQlcbiIgLyogU2F2ZSB0aGUgbmV3IHRvcCBvZiBzdGFjayBpbiBUQ0IuICovCisJIgltcnMgcjIsIHBzcGxpbQkJCQkJCQkJCVxuIiAvKiByMiA9IFBTUExJTS4gKi8KKwkiCW1ycyByMywgY29udHJvbAkJCQkJCQkJCVxuIiAvKiByMyA9IENPTlRST0wuICovCisJIgltb3YgcjQsIGxyCQkJCQkJCQkJCVxuIiAvKiByNCA9IExSL0VYQ19SRVRVUk4uICovCisJIglzdG1pYSByMSEsIHtyMCwgcjItcjR9CQkJCQkJCVxuIiAvKiBTdG9yZSB4U2VjdXJlQ29udGV4dCwgUFNQTElNLCBDT05UUk9MIGFuZCBMUiBvbiB0aGUgc3RhY2suICovCisJI2Vsc2UgLyogY29uZmlnRU5BQkxFX01QVSAqLworCSIJc3VicyByMSwgcjEsICMxMgkJCQkJCQkJXG4iIC8qIE1ha2Ugc3BhY2UgZm9yIHhTZWN1cmVDb250ZXh0LCBQU1BMSU0gYW5kIExSIG9uIHRoZSBzdGFjay4gKi8KKwkiCXN0ciByMSwgW3IyXQkJCQkJCQkJCVxuIiAvKiBTYXZlIHRoZSBuZXcgdG9wIG9mIHN0YWNrIGluIFRDQi4gKi8KKwkiCW1ycyByMiwgcHNwbGltCQkJCQkJCQkJXG4iIC8qIHIyID0gUFNQTElNLiAqLworCSIJbW92IHIzLCBscgkJCQkJCQkJCQlcbiIgLyogcjMgPSBMUi9FWENfUkVUVVJOLiAqLworCSIJc3RtaWEgcjEhLCB7cjAsIHIyLXIzfQkJCQkJCQlcbiIgLyogU3RvcmUgeFNlY3VyZUNvbnRleHQsIFBTUExJTSBhbmQgTFIgb24gdGhlIHN0YWNrLiAqLworCSNlbmRpZiAvKiBjb25maWdFTkFCTEVfTVBVICovCisJIgliIHNlbGVjdF9uZXh0X3Rhc2sJCQkJCQkJCVxuIgorCSIJCQkJCQkJCQkJCQkJXG4iCisJIiBzYXZlX25zX2NvbnRleHQ6CQkJCQkJCQkJXG4iCisJIglsZHIgcjMsIHB4Q3VycmVudFRDQkNvbnN0CQkJCQkJXG4iIC8qIFJlYWQgdGhlIGxvY2F0aW9uIG9mIHB4Q3VycmVudFRDQiBpLmUuICYoIHB4Q3VycmVudFRDQiApLiAqLworCSIJbGRyIHIyLCBbcjNdCQkJCQkJCQkJXG4iIC8qIFJlYWQgcHhDdXJyZW50VENCLiAqLworCSNpZiggY29uZmlnRU5BQkxFX0ZQVSA9PSAxICkKKwkiCXRzdCBsciwgIzB4MTAJCQkJCQkJCQlcbiIgLyogVGVzdCBCaXRbNF0gaW4gTFIuIEJpdFs0XSBvZiBFWENfUkVUVVJOIGlzIDAgaWYgdGhlIEZQVSBpcyBpbiB1c2UuICovCisJIglpdCBlcQkJCQkJCQkJCQkJXG4iCisJIgl2c3RtZGJlcSByMSEsIHtzMTYtczMxfQkJCQkJCQlcbiIgLyogU3RvcmUgdGhlIEZQVSByZWdpc3RlcnMgd2hpY2ggYXJlIG5vdCBzYXZlZCBhdXRvbWF0aWNhbGx5LiAqLworCSNlbmRpZiAvKiBjb25maWdFTkFCTEVfRlBVICovCisJI2lmKCBjb25maWdFTkFCTEVfTVBVID09IDEgKQorCSIJc3VicyByMSwgcjEsICM0OAkJCQkJCQkJXG4iIC8qIE1ha2Ugc3BhY2UgZm9yIHhTZWN1cmVDb250ZXh0LCBQU1BMSU0sIENPTlRST0wsIExSIGFuZCB0aGUgcmVtYWluaW5nIHJlZ2lzdGVycyBvbiB0aGUgc3RhY2suICovCisJIglzdHIgcjEsIFtyMl0JCQkJCQkJCQlcbiIgLyogU2F2ZSB0aGUgbmV3IHRvcCBvZiBzdGFjayBpbiBUQ0IuICovCisJIglhZGRzIHIxLCByMSwgIzE2CQkJCQkJCQlcbiIgLyogcjEgPSByMSArIDE2LiAqLworCSIJc3RtIHIxLCB7cjQtcjExfQkJCQkJCQkJXG4iIC8qIFN0b3JlIHRoZSByZWdpc3RlcnMgdGhhdCBhcmUgbm90IHNhdmVkIGF1dG9tYXRpY2FsbHkuICovCisJIgltcnMgcjIsIHBzcGxpbQkJCQkJCQkJCVxuIiAvKiByMiA9IFBTUExJTS4gKi8KKwkiCW1ycyByMywgY29udHJvbAkJCQkJCQkJCVxuIiAvKiByMyA9IENPTlRST0wuICovCisJIgltb3YgcjQsIGxyCQkJCQkJCQkJCVxuIiAvKiByNCA9IExSL0VYQ19SRVRVUk4uICovCisJIglzdWJzIHIxLCByMSwgIzE2CQkJCQkJCQlcbiIgLyogcjEgPSByMSAtIDE2LiAqLworCSIJc3RtIHIxLCB7cjAsIHIyLXI0fQkJCQkJCQkJXG4iIC8qIFN0b3JlIHhTZWN1cmVDb250ZXh0LCBQU1BMSU0sIENPTlRST0wgYW5kIExSIG9uIHRoZSBzdGFjay4gKi8KKwkjZWxzZSAvKiBjb25maWdFTkFCTEVfTVBVICovCisJIglzdWJzIHIxLCByMSwgIzQ0CQkJCQkJCQlcbiIgLyogTWFrZSBzcGFjZSBmb3IgeFNlY3VyZUNvbnRleHQsIFBTUExJTSwgTFIgYW5kIHRoZSByZW1haW5pbmcgcmVnaXN0ZXJzIG9uIHRoZSBzdGFjay4gKi8KKwkiCXN0ciByMSwgW3IyXQkJCQkJCQkJCVxuIiAvKiBTYXZlIHRoZSBuZXcgdG9wIG9mIHN0YWNrIGluIFRDQi4gKi8KKwkiCWFkZHMgcjEsIHIxLCAjMTIJCQkJCQkJCVxuIiAvKiByMSA9IHIxICsgMTIuICovCisJIglzdG0gcjEsIHtyNC1yMTF9CQkJCQkJCQlcbiIgLyogU3RvcmUgdGhlIHJlZ2lzdGVycyB0aGF0IGFyZSBub3Qgc2F2ZWQgYXV0b21hdGljYWxseS4gKi8KKwkiCW1ycyByMiwgcHNwbGltCQkJCQkJCQkJXG4iIC8qIHIyID0gUFNQTElNLiAqLworCSIJbW92IHIzLCBscgkJCQkJCQkJCQlcbiIgLyogcjMgPSBMUi9FWENfUkVUVVJOLiAqLworCSIJc3VicyByMSwgcjEsICMxMgkJCQkJCQkJXG4iIC8qIHIxID0gcjEgLSAxMi4gKi8KKwkiCXN0bWlhIHIxISwge3IwLCByMi1yM30JCQkJCQkJXG4iIC8qIFN0b3JlIHhTZWN1cmVDb250ZXh0LCBQU1BMSU0gYW5kIExSIG9uIHRoZSBzdGFjay4gKi8KKwkjZW5kaWYgLyogY29uZmlnRU5BQkxFX01QVSAqLworCSIJCQkJCQkJCQkJCQkJXG4iCisJIiBzZWxlY3RfbmV4dF90YXNrOgkJCQkJCQkJCVxuIgorCSIJY3BzaWQgaQkJCQkJCQkJCQkJXG4iCisJIglibCB2VGFza1N3aXRjaENvbnRleHQJCQkJCQkJXG4iCisJIgljcHNpZSBpCQkJCQkJCQkJCQlcbiIKKwkiCQkJCQkJCQkJCQkJCVxuIgorCSIJbGRyIHIyLCBweEN1cnJlbnRUQ0JDb25zdAkJCQkJCVxuIiAvKiBSZWFkIHRoZSBsb2NhdGlvbiBvZiBweEN1cnJlbnRUQ0IgaS5lLiAmKCBweEN1cnJlbnRUQ0IgKS4gKi8KKwkiCWxkciByMywgW3IyXQkJCQkJCQkJCVxuIiAvKiBSZWFkIHB4Q3VycmVudFRDQi4gKi8KKwkiCWxkciByMSwgW3IzXQkJCQkJCQkJCVxuIiAvKiBUaGUgZmlyc3QgaXRlbSBpbiBweEN1cnJlbnRUQ0IgaXMgdGhlIHRhc2sgdG9wIG9mIHN0YWNrLiByMSBub3cgcG9pbnRzIHRvIHRoZSB0b3Agb2Ygc3RhY2suICovCisJIgkJCQkJCQkJCQkJCQlcbiIKKwkjaWYoIGNvbmZpZ0VOQUJMRV9NUFUgPT0gMSApCisJIglkbWIJCQkJCQkJCQkJCQlcbiIgLyogQ29tcGxldGUgb3V0c3RhbmRpbmcgdHJhbnNmZXJzIGJlZm9yZSBkaXNhYmxpbmcgTVBVLiAqLworCSIJbGRyIHIyLCB4TVBVQ1RSTENvbnN0CQkJCQkJCVxuIiAvKiByMiA9IDB4ZTAwMGVkOTQgW0xvY2F0aW9uIG9mIE1QVV9DVFJMXS4gKi8KKwkiCWxkciByNCwgW3IyXQkJCQkJCQkJCVxuIiAvKiBSZWFkIHRoZSB2YWx1ZSBvZiBNUFVfQ1RSTC4gKi8KKwkiCWJpYyByNCwgIzEJCQkJCQkJCQkJXG4iIC8qIHI0ID0gcjQgJiB+MSBpLmUuIENsZWFyIHRoZSBiaXQgMCBpbiByNC4gKi8KKwkiCXN0ciByNCwgW3IyXQkJCQkJCQkJCVxuIiAvKiBEaXNhYmxlIE1QVS4gKi8KKwkiCQkJCQkJCQkJCQkJCVxuIgorCSIJYWRkcyByMywgIzQJCQkJCQkJCQkJXG4iIC8qIHIzID0gcjMgKyA0LiByMyBub3cgcG9pbnRzIHRvIE1BSVIwIGluIFRDQi4gKi8KKwkiCWxkciByNCwgW3IzXQkJCQkJCQkJCVxuIiAvKiByNCA9ICpyMyBpLmUuIHI0ID0gTUFJUjAuICovCisJIglsZHIgcjIsIHhNQUlSMENvbnN0CQkJCQkJCQlcbiIgLyogcjIgPSAweGUwMDBlZGMwIFtMb2NhdGlvbiBvZiBNQUlSMF0uICovCisJIglzdHIgcjQsIFtyMl0JCQkJCQkJCQlcbiIgLyogUHJvZ3JhbSBNQUlSMC4gKi8KKwkiCWxkciByMiwgeFJOUkNvbnN0CQkJCQkJCQlcbiIgLyogcjIgPSAweGUwMDBlZDk4IFtMb2NhdGlvbiBvZiBSTlJdLiAqLworCSIJbW92cyByNCwgIzQJCQkJCQkJCQkJXG4iIC8qIHI0ID0gNC4gKi8KKwkiCXN0ciByNCwgW3IyXQkJCQkJCQkJCVxuIiAvKiBQcm9ncmFtIFJOUiA9IDQuICovCisJIglhZGRzIHIzLCAjNAkJCQkJCQkJCQlcbiIgLyogcjMgPSByMyArIDQuIHIzIG5vdyBwb2ludHMgdG8gZmlyc3QgUkJBUiBpbiBUQ0IuICovCisJIglsZHIgIHIyLCB4UkJBUkNvbnN0CQkJCQkJCQlcbiIgLyogcjIgPSAweGUwMDBlZDljIFtMb2NhdGlvbiBvZiBSQkFSXS4gKi8KKwkiCWxkbWlhIHIzISwge3I0LXIxMX0JCQkJCQkJCVxuIiAvKiBSZWFkIDQgc2V0cyBvZiBSQkFSL1JMQVIgcmVnaXN0ZXJzIGZyb20gVENCLiAqLworCSIJc3RtaWEgcjIhLCB7cjQtcjExfQkJCQkJCQkJXG4iIC8qIFdyaXRlIDQgc2V0IG9mIFJCQVIvUkxBUiByZWdpc3RlcnMgdXNpbmcgYWxpYXMgcmVnaXN0ZXJzLiAqLworCSIJCQkJCQkJCQkJCQkJXG4iCisJIglsZHIgcjIsIHhNUFVDVFJMQ29uc3QJCQkJCQkJXG4iIC8qIHIyID0gMHhlMDAwZWQ5NCBbTG9jYXRpb24gb2YgTVBVX0NUUkxdLiAqLworCSIJbGRyIHI0LCBbcjJdCQkJCQkJCQkJXG4iIC8qIFJlYWQgdGhlIHZhbHVlIG9mIE1QVV9DVFJMLiAqLworCSIJb3JyIHI0LCAjMQkJCQkJCQkJCQlcbiIgLyogcjQgPSByNCB8IDEgaS5lLiBTZXQgdGhlIGJpdCAwIGluIHI0LiAqLworCSIJc3RyIHI0LCBbcjJdCQkJCQkJCQkJXG4iIC8qIEVuYWJsZSBNUFUuICovCisJIglkc2IJCQkJCQkJCQkJCQlcbiIgLyogRm9yY2UgbWVtb3J5IHdyaXRlcyBiZWZvcmUgY29udGludWluZy4gKi8KKwkjZW5kaWYgLyogY29uZmlnRU5BQkxFX01QVSAqLworCSIJCQkJCQkJCQkJCQkJXG4iCisJI2lmKCBjb25maWdFTkFCTEVfTVBVID09IDEgKQorCSIJbGRtaWEgcjEhLCB7cjAsIHIyLXI0fQkJCQkJCQlcbiIgLyogUmVhZCBmcm9tIHN0YWNrIC0gcjAgPSB4U2VjdXJlQ29udGV4dCwgcjIgPSBQU1BMSU0sIHIzID0gQ09OVFJPTCBhbmQgcjQgPSBMUi4gKi8KKwkiCW1zciBwc3BsaW0sIHIyCQkJCQkJCQkJXG4iIC8qIFJlc3RvcmUgdGhlIFBTUExJTSByZWdpc3RlciB2YWx1ZSBmb3IgdGhlIHRhc2suICovCisJIgltc3IgY29udHJvbCwgcjMJCQkJCQkJCQlcbiIgLyogUmVzdG9yZSB0aGUgQ09OVFJPTCByZWdpc3RlciB2YWx1ZSBmb3IgdGhlIHRhc2suICovCisJIgltb3YgbHIsIHI0CQkJCQkJCQkJCVxuIiAvKiBMUiA9IHI0LiAqLworCSIJbGRyIHIyLCB4U2VjdXJlQ29udGV4dENvbnN0CQkJCQkJXG4iIC8qIFJlYWQgdGhlIGxvY2F0aW9uIG9mIHhTZWN1cmVDb250ZXh0IGkuZS4gJiggeFNlY3VyZUNvbnRleHQgKS4gKi8KKwkiCXN0ciByMCwgW3IyXQkJCQkJCQkJCVxuIiAvKiBSZXN0b3JlIHRoZSB0YXNrJ3MgeFNlY3VyZUNvbnRleHQuICovCisJIgljYnogcjAsIHJlc3RvcmVfbnNfY29udGV4dAkJCQkJCVxuIiAvKiBJZiB0aGVyZSBpcyBubyBzZWN1cmUgY29udGV4dCBmb3IgdGhlIHRhc2ssIHJlc3RvcmUgdGhlIG5vbi1zZWN1cmUgY29udGV4dC4gKi8KKwkiCXB1c2gge3IxLHI0fQkJCQkJCQkJCVxuIgorCSIJYmwgU2VjdXJlQ29udGV4dF9Mb2FkQ29udGV4dAkJCQkJXG4iIC8qIFJlc3RvcmUgdGhlIHNlY3VyZSBjb250ZXh0LiAqLworCSIJcG9wIHtyMSxyNH0JCQkJCQkJCQkJXG4iCisJIgltb3YgbHIsIHI0CQkJCQkJCQkJCVxuIiAvKiBMUiA9IHI0LiAqLworCSIJbHNscyByMiwgcjQsICMyNQkJCQkJCQkJXG4iIC8qIHIyID0gcjQgPDwgMjUuIEJpdFs2XSBvZiBFWENfUkVUVVJOIGlzIDEgaWYgc2VjdXJlIHN0YWNrIHdhcyB1c2VkLCAwIGlmIG5vbi1zZWN1cmUgc3RhY2sgd2FzIHVzZWQgdG8gc3RvcmUgc3RhY2sgZnJhbWUuICovCisJIglicGwgcmVzdG9yZV9uc19jb250ZXh0CQkJCQkJCVxuIiAvKiBicGwgLSBicmFuY2ggaWYgcG9zaXRpdmUgb3IgemVyby4gSWYgcjIgPj0gMCA9PT4gQml0WzZdIGluIEVYQ19SRVRVUk4gaXMgMCBpLmUuIG5vbi1zZWN1cmUgc3RhY2sgd2FzIHVzZWQuICovCisJIgltc3IgcHNwLCByMQkJCQkJCQkJCQlcbiIgLyogUmVtZW1iZXIgdGhlIG5ldyB0b3Agb2Ygc3RhY2sgZm9yIHRoZSB0YXNrLiAqLworCSIJYnggbHIJCQkJCQkJCQkJCVxuIgorCSNlbHNlIC8qIGNvbmZpZ0VOQUJMRV9NUFUgKi8KKwkiCWxkbWlhIHIxISwge3IwLCByMi1yM30JCQkJCQkJXG4iIC8qIFJlYWQgZnJvbSBzdGFjayAtIHIwID0geFNlY3VyZUNvbnRleHQsIHIyID0gUFNQTElNIGFuZCByMyA9IExSLiAqLworCSIJbXNyIHBzcGxpbSwgcjIJCQkJCQkJCQlcbiIgLyogUmVzdG9yZSB0aGUgUFNQTElNIHJlZ2lzdGVyIHZhbHVlIGZvciB0aGUgdGFzay4gKi8KKwkiCW1vdiBsciwgcjMJCQkJCQkJCQkJXG4iIC8qIExSID0gcjMuICovCisJIglsZHIgcjIsIHhTZWN1cmVDb250ZXh0Q29uc3QJCQkJCQlcbiIgLyogUmVhZCB0aGUgbG9jYXRpb24gb2YgeFNlY3VyZUNvbnRleHQgaS5lLiAmKCB4U2VjdXJlQ29udGV4dCApLiAqLworCSIJc3RyIHIwLCBbcjJdCQkJCQkJCQkJXG4iIC8qIFJlc3RvcmUgdGhlIHRhc2sncyB4U2VjdXJlQ29udGV4dC4gKi8KKwkiCWNieiByMCwgcmVzdG9yZV9uc19jb250ZXh0CQkJCQkJXG4iIC8qIElmIHRoZXJlIGlzIG5vIHNlY3VyZSBjb250ZXh0IGZvciB0aGUgdGFzaywgcmVzdG9yZSB0aGUgbm9uLXNlY3VyZSBjb250ZXh0LiAqLworCSIJcHVzaCB7cjEscjN9CQkJCQkJCQkJXG4iCisJIglibCBTZWN1cmVDb250ZXh0X0xvYWRDb250ZXh0CQkJCQlcbiIgLyogUmVzdG9yZSB0aGUgc2VjdXJlIGNvbnRleHQuICovCisJIglwb3Age3IxLHIzfQkJCQkJCQkJCQlcbiIKKwkiCW1vdiBsciwgcjMJCQkJCQkJCQkJXG4iIC8qIExSID0gcjMuICovCisJIglsc2xzIHIyLCByMywgIzI1CQkJCQkJCQlcbiIgLyogcjIgPSByMyA8PCAyNS4gQml0WzZdIG9mIEVYQ19SRVRVUk4gaXMgMSBpZiBzZWN1cmUgc3RhY2sgd2FzIHVzZWQsIDAgaWYgbm9uLXNlY3VyZSBzdGFjayB3YXMgdXNlZCB0byBzdG9yZSBzdGFjayBmcmFtZS4gKi8KKwkiCWJwbCByZXN0b3JlX25zX2NvbnRleHQJCQkJCQkJXG4iIC8qIGJwbCAtIGJyYW5jaCBpZiBwb3NpdGl2ZSBvciB6ZXJvLiBJZiByMiA+PSAwID09PiBCaXRbNl0gaW4gRVhDX1JFVFVSTiBpcyAwIGkuZS4gbm9uLXNlY3VyZSBzdGFjayB3YXMgdXNlZC4gKi8KKwkiCW1zciBwc3AsIHIxCQkJCQkJCQkJCVxuIiAvKiBSZW1lbWJlciB0aGUgbmV3IHRvcCBvZiBzdGFjayBmb3IgdGhlIHRhc2suICovCisJIglieCBscgkJCQkJCQkJCQkJXG4iCisJI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9NUFUgKi8KKwkiCQkJCQkJCQkJCQkJCVxuIgorCSIgcmVzdG9yZV9uc19jb250ZXh0OgkJCQkJCQkJXG4iCisJIglsZG1pYSByMSEsIHtyNC1yMTF9CQkJCQkJCQlcbiIgLyogUmVzdG9yZSB0aGUgcmVnaXN0ZXJzIHRoYXQgYXJlIG5vdCBhdXRvbWF0aWNhbGx5IHJlc3RvcmVkLiAqLworCSNpZiggY29uZmlnRU5BQkxFX0ZQVSA9PSAxICkKKwkiCXRzdCBsciwgIzB4MTAJCQkJCQkJCQlcbiIgLyogVGVzdCBCaXRbNF0gaW4gTFIuIEJpdFs0XSBvZiBFWENfUkVUVVJOIGlzIDAgaWYgdGhlIEZQVSBpcyBpbiB1c2UuICovCisJIglpdCBlcQkJCQkJCQkJCQkJXG4iCisJIgl2bGRtaWFlcSByMSEsIHtzMTYtczMxfQkJCQkJCQlcbiIgLyogUmVzdG9yZSB0aGUgRlBVIHJlZ2lzdGVycyB3aGljaCBhcmUgbm90IHJlc3RvcmVkIGF1dG9tYXRpY2FsbHkuICovCisJI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9GUFUgKi8KKwkiCW1zciBwc3AsIHIxCQkJCQkJCQkJCVxuIiAvKiBSZW1lbWJlciB0aGUgbmV3IHRvcCBvZiBzdGFjayBmb3IgdGhlIHRhc2suICovCisJIglieCBscgkJCQkJCQkJCQkJXG4iCisJIgkJCQkJCQkJCQkJCQlcbiIKKwkiCS5hbGlnbiA0CQkJCQkJCQkJCVxuIgorCSJweEN1cnJlbnRUQ0JDb25zdDogLndvcmQgcHhDdXJyZW50VENCCQkJCVxuIgorCSJ4U2VjdXJlQ29udGV4dENvbnN0OiAud29yZCB4U2VjdXJlQ29udGV4dAkJCVxuIgorCSNpZiggY29uZmlnRU5BQkxFX01QVSA9PSAxICkKKwkieE1QVUNUUkxDb25zdDogLndvcmQgMHhlMDAwZWQ5NAkJCQkJXG4iCisJInhNQUlSMENvbnN0OiAud29yZCAweGUwMDBlZGMwCQkJCQkJXG4iCisJInhSTlJDb25zdDogLndvcmQgMHhlMDAwZWQ5OAkJCQkJCVxuIgorCSJ4UkJBUkNvbnN0OiAud29yZCAweGUwMDBlZDljCQkJCQkJXG4iCisJI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9NUFUgKi8KKwkpOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgU1ZDX0hhbmRsZXIoIHZvaWQgKSAvKiBfX2F0dHJpYnV0ZV9fICgoIG5ha2VkICkpIFBSSVZJTEVHRURfRlVOQ1RJT04gKi8KK3sKKwlfX2FzbSB2b2xhdGlsZQorCSgKKwkiCXRzdCBsciwgIzQJCQkJCQkJCQkJXG4iCisJIglpdGUgZXEJCQkJCQkJCQkJCVxuIgorCSIJbXJzZXEgcjAsIG1zcAkJCQkJCQkJCVxuIgorCSIJbXJzbmUgcjAsIHBzcAkJCQkJCQkJCVxuIgorCSIJbGRyIHIxLCBzdmNoYW5kbGVyX2FkZHJlc3NfY29uc3QJCQkJXG4iCisJIglieCByMQkJCQkJCQkJCQkJXG4iCisJIgkJCQkJCQkJCQkJCQlcbiIKKwkiCS5hbGlnbiA0CQkJCQkJCQkJCVxuIgorCSJzdmNoYW5kbGVyX2FkZHJlc3NfY29uc3Q6IC53b3JkIHZQb3J0U1ZDSGFuZGxlcl9DCVxuIgorCSk7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCB2UG9ydEFsbG9jYXRlU2VjdXJlQ29udGV4dCggdWludDMyX3QgdWxTZWN1cmVTdGFja1NpemUgKSAvKiBfX2F0dHJpYnV0ZV9fICgoIG5ha2VkICkpICovCit7CisJX19hc20gdm9sYXRpbGUKKwkoCisJIglzdmMgJTAJCQkJCQkJCQkJCVxuIiAvKiBTZWN1cmUgY29udGV4dCBpcyBhbGxvY2F0ZWQgaW4gdGhlIHN1cGVydmlzb3IgY2FsbC4gKi8KKwkiCWJ4IGxyCQkJCQkJCQkJCQlcbiIgLyogUmV0dXJuLiAqLworCTo6ICJpIiAoIHBvcnRTVkNfQUxMT0NBVEVfU0VDVVJFX0NPTlRFWFQgKSA6ICJtZW1vcnkiCisJKTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIHZQb3J0RnJlZVNlY3VyZUNvbnRleHQoIHVpbnQzMl90ICpwdWxUQ0IgKSAvKiBfX2F0dHJpYnV0ZV9fICgoIG5ha2VkICkpIFBSSVZJTEVHRURfRlVOQ1RJT04gKi8KK3sKKwlfX2FzbSB2b2xhdGlsZQorCSgKKwkiCWxkciByMSwgW3IwXQkJCQkJCQkJCVxuIiAvKiBUaGUgZmlyc3QgaXRlbSBpbiB0aGUgVENCIGlzIHRoZSB0b3Agb2YgdGhlIHN0YWNrLiAqLworCSIJbGRyIHIwLCBbcjFdCQkJCQkJCQkJXG4iIC8qIFRoZSBmaXJzdCBpdGVtIG9uIHRoZSBzdGFjayBpcyB0aGUgdGFzaydzIHhTZWN1cmVDb250ZXh0LiAqLworCSIJY21wIHIwLCAjMAkJCQkJCQkJCQlcbiIgLyogUmFpc2Ugc3ZjIGlmIHRhc2sncyB4U2VjdXJlQ29udGV4dCBpcyBub3QgTlVMTC4gKi8KKwkiCWl0IG5lCQkJCQkJCQkJCQlcbiIKKwkiCXN2Y25lICUwCQkJCQkJCQkJCVxuIiAvKiBTZWN1cmUgY29udGV4dCBpcyBmcmVlZCBpbiB0aGUgc3VwZXJ2aXNvciBjYWxsLiAqLworCSIJYnggbHIJCQkJCQkJCQkJCVxuIiAvKiBSZXR1cm4uICovCisJOjogImkiICggcG9ydFNWQ19GUkVFX1NFQ1VSRV9DT05URVhUICkgOiAibWVtb3J5IgorCSk7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KZGlmZiAtLWdpdCBhL1NvdXJjZS9wb3J0YWJsZS9HQ0MvQVJNX0NNMzMvbm9uX3NlY3VyZS9wb3J0YXNtLmggYi9Tb3VyY2UvcG9ydGFibGUvR0NDL0FSTV9DTTMzL25vbl9zZWN1cmUvcG9ydGFzbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlY2YwNGUKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvcG9ydGFibGUvR0NDL0FSTV9DTTMzL25vbl9zZWN1cmUvcG9ydGFzbS5oCkBAIC0wLDAgKzEsMTEzIEBACisvKgorICogRnJlZVJUT1MgS2VybmVsIFYxMC4yLjEKKyAqIENvcHlyaWdodCAoQykgMjAxOSBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCisgKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgorICogdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bworICogdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YKKyAqIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKKyAqIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAorICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MKKyAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUgorICogQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSCisgKiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBodHRwOi8vd3d3LkZyZWVSVE9TLm9yZworICogaHR0cDovL2F3cy5hbWF6b24uY29tL2ZyZWVydG9zCisgKgorICogMSB0YWIgPT0gNCBzcGFjZXMhCisgKi8KKworI2lmbmRlZiBfX1BPUlRfQVNNX0hfXworI2RlZmluZSBfX1BPUlRfQVNNX0hfXworCisvKiBTY2hlZHVsZXIgaW5jbHVkZXMuICovCisjaW5jbHVkZSAiRnJlZVJUT1MuaCIKKworLyogTVBVIHdyYXBwZXJzIGluY2x1ZGVzLiAqLworI2luY2x1ZGUgIm1wdV93cmFwcGVycy5oIgorCisvKioKKyAqIEBicmllZiBSZXN0b3JlIHRoZSBjb250ZXh0IG9mIHRoZSBmaXJzdCB0YXNrIHNvIHRoYXQgdGhlIGZpcnN0IHRhc2sgc3RhcnRzCisgKiBleGVjdXRpbmcuCisgKi8KK3ZvaWQgdlJlc3RvcmVDb250ZXh0T2ZGaXJzdFRhc2soIHZvaWQgKSBfX2F0dHJpYnV0ZV9fICgoIG5ha2VkICkpIFBSSVZJTEVHRURfRlVOQ1RJT047CisKKy8qKgorICogQGJyaWVmIENoZWNrcyB3aGV0aGVyIG9yIG5vdCB0aGUgcHJvY2Vzc29yIGlzIHByaXZpbGVnZWQuCisgKgorICogQHJldHVybiAxIGlmIHRoZSBwcm9jZXNzb3IgaXMgYWxyZWFkeSBwcml2aWxlZ2VkLCAwIG90aGVyd2lzZS4KKyAqLworQmFzZVR5cGVfdCB4SXNQcml2aWxlZ2VkKCB2b2lkICkgX19hdHRyaWJ1dGVfXyAoKCBuYWtlZCApKTsKKworLyoqCisgKiBAYnJpZWYgUmFpc2VzIHRoZSBwcml2aWxlZ2UgbGV2ZWwgYnkgY2xlYXJpbmcgdGhlIGJpdCAwIG9mIHRoZSBDT05UUk9MCisgKiByZWdpc3Rlci4KKyAqCisgKiBAbm90ZSBUaGlzIGlzIGEgcHJpdmlsZWdlZCBmdW5jdGlvbiBhbmQgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGZyb20gdGhlIGtlbnJlbAorICogY29kZS4KKyAqCisgKiBCaXQgMCBvZiB0aGUgQ09OVFJPTCByZWdpc3RlciBkZWZpbmVzIHRoZSBwcml2aWxlZ2UgbGV2ZWwgb2YgVGhyZWFkIE1vZGUuCisgKiAgQml0WzBdID0gMCAtLT4gVGhlIHByb2Nlc3NvciBpcyBydW5uaW5nIHByaXZpbGVnZWQKKyAqICBCaXRbMF0gPSAxIC0tPiBUaGUgcHJvY2Vzc29yIGlzIHJ1bm5pbmcgdW5wcml2aWxlZ2VkLgorICovCit2b2lkIHZSYWlzZVByaXZpbGVnZSggdm9pZCApIF9fYXR0cmlidXRlX18gKCggbmFrZWQgKSkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworLyoqCisgKiBAYnJpZWYgTG93ZXJzIHRoZSBwcml2aWxlZ2UgbGV2ZWwgYnkgc2V0dGluZyB0aGUgYml0IDAgb2YgdGhlIENPTlRST0wKKyAqIHJlZ2lzdGVyLgorICoKKyAqIEJpdCAwIG9mIHRoZSBDT05UUk9MIHJlZ2lzdGVyIGRlZmluZXMgdGhlIHByaXZpbGVnZSBsZXZlbCBvZiBUaHJlYWQgTW9kZS4KKyAqICBCaXRbMF0gPSAwIC0tPiBUaGUgcHJvY2Vzc29yIGlzIHJ1bm5pbmcgcHJpdmlsZWdlZAorICogIEJpdFswXSA9IDEgLS0+IFRoZSBwcm9jZXNzb3IgaXMgcnVubmluZyB1bnByaXZpbGVnZWQuCisgKi8KK3ZvaWQgdlJlc2V0UHJpdmlsZWdlKCB2b2lkICkgX19hdHRyaWJ1dGVfXyAoKCBuYWtlZCApKTsKKworLyoqCisgKiBAYnJpZWYgU3RhcnRzIHRoZSBmaXJzdCB0YXNrLgorICovCit2b2lkIHZTdGFydEZpcnN0VGFzayggdm9pZCApIF9fYXR0cmlidXRlX18gKCggbmFrZWQgKSkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworLyoqCisgKiBAYnJpZWYgRGlzYWJsZXMgaW50ZXJydXB0cy4KKyAqLwordWludDMyX3QgdWxTZXRJbnRlcnJ1cHRNYXNrRnJvbUlTUiggdm9pZCApIF9fYXR0cmlidXRlX18oKCBuYWtlZCApKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisvKioKKyAqIEBicmllZiBFbmFibGVzIGludGVycnVwdHMuCisgKi8KK3ZvaWQgdkNsZWFySW50ZXJydXB0TWFza0Zyb21JU1IoIHVpbnQzMl90IHVsTWFzayApIF9fYXR0cmlidXRlX18oKCBuYWtlZCApKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisvKioKKyAqIEBicmllZiBQZW5kU1YgRXhjZXB0aW9uIGhhbmRsZXIuCisgKi8KK3ZvaWQgUGVuZFNWX0hhbmRsZXIoIHZvaWQgKSBfX2F0dHJpYnV0ZV9fICgoIG5ha2VkICkpIFBSSVZJTEVHRURfRlVOQ1RJT047CisKKy8qKgorICogQGJyaWVmIFNWQyBIYW5kbGVyLgorICovCit2b2lkIFNWQ19IYW5kbGVyKCB2b2lkICkgX19hdHRyaWJ1dGVfXyAoKCBuYWtlZCApKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisvKioKKyAqIEBicmllZiBBbGxvY2F0ZSBhIFNlY3VyZSBjb250ZXh0IGZvciB0aGUgY2FsbGluZyB0YXNrLgorICoKKyAqIEBwYXJhbVtpbl0gdWxTZWN1cmVTdGFja1NpemUgVGhlIHNpemUgb2YgdGhlIHN0YWNrIHRvIGJlIGFsbG9jYXRlZCBvbiB0aGUKKyAqIHNlY3VyZSBzaWRlIGZvciB0aGUgY2FsbGluZyB0YXNrLgorICovCit2b2lkIHZQb3J0QWxsb2NhdGVTZWN1cmVDb250ZXh0KCB1aW50MzJfdCB1bFNlY3VyZVN0YWNrU2l6ZSApIF9fYXR0cmlidXRlX18gKCggbmFrZWQgKSk7CisKKy8qKgorICogQGJyaWVmIEZyZWUgdGhlIHRhc2sncyBzZWN1cmUgY29udGV4dC4KKyAqCisgKiBAcGFyYW1baW5dIHB1bFRDQiBQb2ludGVyIHRvIHRoZSBUYXNrIENvbnRyb2wgQmxvY2sgKFRDQikgb2YgdGhlIHRhc2suCisgKi8KK3ZvaWQgdlBvcnRGcmVlU2VjdXJlQ29udGV4dCggdWludDMyX3QgKnB1bFRDQiApIF9fYXR0cmlidXRlX18gKCggbmFrZWQgKSkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworI2VuZGlmIC8qIF9fUE9SVF9BU01fSF9fICovCmRpZmYgLS1naXQgYS9Tb3VyY2UvcG9ydGFibGUvR0NDL0FSTV9DTTMzL25vbl9zZWN1cmUvcG9ydG1hY3JvLmggYi9Tb3VyY2UvcG9ydGFibGUvR0NDL0FSTV9DTTMzL25vbl9zZWN1cmUvcG9ydG1hY3JvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA1MWRkYwotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9wb3J0YWJsZS9HQ0MvQVJNX0NNMzMvbm9uX3NlY3VyZS9wb3J0bWFjcm8uaApAQCAtMCwwICsxLDI5OSBAQAorLyoKKyAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMi4xCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgorICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KKyAqIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KKyAqIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mCisgKiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCisgKiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKKyAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTCisgKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IKKyAqIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUgorICogSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogaHR0cDovL3d3dy5GcmVlUlRPUy5vcmcKKyAqIGh0dHA6Ly9hd3MuYW1hem9uLmNvbS9mcmVlcnRvcworICoKKyAqIDEgdGFiID09IDQgc3BhY2VzIQorICovCisKKyNpZm5kZWYgUE9SVE1BQ1JPX0gKKyNkZWZpbmUgUE9SVE1BQ1JPX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUG9ydCBzcGVjaWZpYyBkZWZpbml0aW9ucy4KKyAqCisgKiBUaGUgc2V0dGluZ3MgaW4gdGhpcyBmaWxlIGNvbmZpZ3VyZSBGcmVlUlRPUyBjb3JyZWN0bHkgZm9yIHRoZSBnaXZlbiBoYXJkd2FyZQorICogYW5kIGNvbXBpbGVyLgorICoKKyAqIFRoZXNlIHNldHRpbmdzIHNob3VsZCBub3QgYmUgYWx0ZXJlZC4KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworI2lmbmRlZiBjb25maWdFTkFCTEVfRlBVCisJI2Vycm9yIGNvbmZpZ0VOQUJMRV9GUFUgbXVzdCBiZSBkZWZpbmVkIGluIEZyZWVSVE9TQ29uZmlnLmguICBTZXQgY29uZmlnRU5BQkxFX0ZQVSB0byAxIHRvIGVuYWJsZSB0aGUgRlBVIG9yIDAgdG8gZGlzYWJsZSB0aGUgRlBVLgorI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9GUFUgKi8KKworI2lmbmRlZiBjb25maWdFTkFCTEVfTVBVCisJI2Vycm9yIGNvbmZpZ0VOQUJMRV9NUFUgbXVzdCBiZSBkZWZpbmVkIGluIEZyZWVSVE9TQ29uZmlnLmguICBTZXQgY29uZmlnRU5BQkxFX01QVSB0byAxIHRvIGVuYWJsZSB0aGUgTVBVIG9yIDAgdG8gZGlzYWJsZSB0aGUgTVBVLgorI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9NUFUgKi8KKworI2lmbmRlZiBjb25maWdFTkFCTEVfVFJVU1RaT05FCisJI2Vycm9yIGNvbmZpZ0VOQUJMRV9UUlVTVFpPTkUgbXVzdCBiZSBkZWZpbmVkIGluIEZyZWVSVE9TQ29uZmlnLmguICBTZXQgY29uZmlnRU5BQkxFX1RSVVNUWk9ORSB0byAxIHRvIGVuYWJsZSBUcnVzdFpvbmUgb3IgMCB0byBkaXNhYmxlIFRydXN0Wm9uZS4KKyNlbmRpZiAvKiBjb25maWdFTkFCTEVfVFJVU1RaT05FICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAqIEBicmllZiBUeXBlIGRlZmluaXRpb25zLgorICovCisjZGVmaW5lIHBvcnRDSEFSCQkJCQkJCQkJCQljaGFyCisjZGVmaW5lIHBvcnRGTE9BVAkJCQkJCQkJCQkJZmxvYXQKKyNkZWZpbmUgcG9ydERPVUJMRQkJCQkJCQkJCQkJZG91YmxlCisjZGVmaW5lIHBvcnRMT05HCQkJCQkJCQkJCQlsb25nCisjZGVmaW5lIHBvcnRTSE9SVAkJCQkJCQkJCQkJc2hvcnQKKyNkZWZpbmUgcG9ydFNUQUNLX1RZUEUJCQkJCQkJCQkJdWludDMyX3QKKyNkZWZpbmUgcG9ydEJBU0VfVFlQRQkJCQkJCQkJCQlsb25nCisKK3R5cGVkZWYgcG9ydFNUQUNLX1RZUEUJCQkJCQkJCQkJU3RhY2tUeXBlX3Q7Cit0eXBlZGVmIGxvbmcJCQkJCQkJCQkJCQlCYXNlVHlwZV90OwordHlwZWRlZiB1bnNpZ25lZCBsb25nCQkJCQkJCQkJCVVCYXNlVHlwZV90OworCisjaWYoIGNvbmZpZ1VTRV8xNl9CSVRfVElDS1MgPT0gMSApCisJdHlwZWRlZiB1aW50MTZfdCBUaWNrVHlwZV90OworCSNkZWZpbmUgcG9ydE1BWF9ERUxBWSAoIFRpY2tUeXBlX3QgKQkJCQkJMHhmZmZmCisjZWxzZQorCXR5cGVkZWYgdWludDMyX3QgVGlja1R5cGVfdDsKKwkjZGVmaW5lIHBvcnRNQVhfREVMQVkgKCBUaWNrVHlwZV90ICkJCQkJCTB4ZmZmZmZmZmZVTAorCisJLyogMzItYml0IHRpY2sgdHlwZSBvbiBhIDMyLWJpdCBhcmNoaXRlY3R1cmUsIHNvIHJlYWRzIG9mIHRoZSB0aWNrIGNvdW50IGRvCisJICogbm90IG5lZWQgdG8gYmUgZ3VhcmRlZCB3aXRoIGEgY3JpdGljYWwgc2VjdGlvbi4gKi8KKwkjZGVmaW5lIHBvcnRUSUNLX1RZUEVfSVNfQVRPTUlDCQkJCQkJCTEKKyNlbmRpZgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKgorICogQXJjaGl0ZWN0dXJlIHNwZWNpZmljcy4KKyAqLworI2RlZmluZSBwb3J0QVJDSF9OQU1FCQkJCQkJCQkJCSJDb3J0ZXgtTTMzIgorI2RlZmluZSBwb3J0U1RBQ0tfR1JPV1RICQkJCQkJCQkJKCAtMSApCisjZGVmaW5lIHBvcnRUSUNLX1BFUklPRF9NUwkJCQkJCQkJCSggKCBUaWNrVHlwZV90ICkgMTAwMCAvIGNvbmZpZ1RJQ0tfUkFURV9IWiApCisjZGVmaW5lIHBvcnRCWVRFX0FMSUdOTUVOVAkJCQkJCQkJCTgKKyNkZWZpbmUgcG9ydE5PUCgpCisjZGVmaW5lIHBvcnRJTkxJTkUJCQkJCQkJCQkJCV9faW5saW5lCisjaWZuZGVmIHBvcnRGT1JDRV9JTkxJTkUKKwkjZGVmaW5lIHBvcnRGT1JDRV9JTkxJTkUJCQkJCQkJCWlubGluZSBfX2F0dHJpYnV0ZV9fKCggYWx3YXlzX2lubGluZSApKQorI2VuZGlmCisjZGVmaW5lIHBvcnRIQVNfU1RBQ0tfT1ZFUkZMT1dfQ0hFQ0tJTkcJCQkJCQkxCisjZGVmaW5lIHBvcnRET05UX0RJU0NBUkQJCQkJCQkJCQlfX2F0dHJpYnV0ZV9fKCggdXNlZCApKQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKgorICogQGJyaWVmIEV4dGVybiBkZWNsYXJhdGlvbnMuCisgKi8KK2V4dGVybiB2b2lkIHZQb3J0WWllbGQoIHZvaWQgKSAvKiBQUklWSUxFR0VEX0ZVTkNUSU9OICovOworCitleHRlcm4gdm9pZCB2UG9ydEVudGVyQ3JpdGljYWwoIHZvaWQgKSAvKiBQUklWSUxFR0VEX0ZVTkNUSU9OICovOworZXh0ZXJuIHZvaWQgdlBvcnRFeGl0Q3JpdGljYWwoIHZvaWQgKSAvKiBQUklWSUxFR0VEX0ZVTkNUSU9OICovOworCitleHRlcm4gdWludDMyX3QgdWxTZXRJbnRlcnJ1cHRNYXNrRnJvbUlTUiggdm9pZCApIC8qIF9fYXR0cmlidXRlX18oKCBuYWtlZCApKSBQUklWSUxFR0VEX0ZVTkNUSU9OICovOworZXh0ZXJuIHZvaWQgdkNsZWFySW50ZXJydXB0TWFza0Zyb21JU1IoIHVpbnQzMl90IHVsTWFzayApIC8qIF9fYXR0cmlidXRlX18oKCBuYWtlZCApKSBQUklWSUxFR0VEX0ZVTkNUSU9OICovOworCisjaWYoIGNvbmZpZ0VOQUJMRV9UUlVTVFpPTkUgPT0gMSApCisJZXh0ZXJuIHZvaWQgdlBvcnRBbGxvY2F0ZVNlY3VyZUNvbnRleHQoIHVpbnQzMl90IHVsU2VjdXJlU3RhY2tTaXplICk7IC8qIF9fYXR0cmlidXRlX18gKCggbmFrZWQgKSkgKi8KKwlleHRlcm4gdm9pZCB2UG9ydEZyZWVTZWN1cmVDb250ZXh0KCB1aW50MzJfdCAqcHVsVENCICkgLyogX19hdHRyaWJ1dGVfXyAoKCBuYWtlZCApKSBQUklWSUxFR0VEX0ZVTkNUSU9OICovOworI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9UUlVTVFpPTkUgKi8KKworI2lmKCBjb25maWdFTkFCTEVfTVBVID09IDEgKQorCWV4dGVybiBCYXNlVHlwZV90IHhJc1ByaXZpbGVnZWQoIHZvaWQgKSAvKiBfX2F0dHJpYnV0ZV9fICgoIG5ha2VkICkpICovOworCWV4dGVybiB2b2lkIHZSZXNldFByaXZpbGVnZSggdm9pZCApIC8qIF9fYXR0cmlidXRlX18gKCggbmFrZWQgKSkgKi87CisjZW5kaWYgLyogY29uZmlnRU5BQkxFX01QVSAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKgorICogQGJyaWVmIE1QVSBzcGVjaWZpYyBjb25zdGFudHMuCisgKi8KKyNpZiggY29uZmlnRU5BQkxFX01QVSA9PSAxICkKKwkjZGVmaW5lIHBvcnRVU0lOR19NUFVfV1JBUFBFUlMJCQkJCQkJMQorCSNkZWZpbmUgcG9ydFBSSVZJTEVHRV9CSVQJCQkJCQkJCSggMHg4MDAwMDAwMFVMICkKKyNlbHNlCisJI2RlZmluZSBwb3J0UFJJVklMRUdFX0JJVAkJCQkJCQkJKCAweDBVTCApCisjZW5kaWYgLyogY29uZmlnRU5BQkxFX01QVSAqLworCisKKy8qIE1QVSByZWdpb25zLiAqLworI2RlZmluZSBwb3J0UFJJVklMRUdFRF9GTEFTSF9SRUdJT04JCQkJCQkJKCAwVUwgKQorI2RlZmluZSBwb3J0VU5QUklWSUxFR0VEX0ZMQVNIX1JFR0lPTgkJCQkJCSggMVVMICkKKyNkZWZpbmUgcG9ydFVOUFJJVklMRUdFRF9TWVNDQUxMU19SRUdJT04JCQkJCSggMlVMICkKKyNkZWZpbmUgcG9ydFBSSVZJTEVHRURfUkFNX1JFR0lPTgkJCQkJCQkoIDNVTCApCisjZGVmaW5lIHBvcnRTVEFDS19SRUdJT04JCQkJCQkJCQkoIDRVTCApCisjZGVmaW5lIHBvcnRGSVJTVF9DT05GSUdVUkFCTEVfUkVHSU9OCQkJCQkJKCA1VUwgKQorI2RlZmluZSBwb3J0TEFTVF9DT05GSUdVUkFCTEVfUkVHSU9OCQkJCQkJKCA3VUwgKQorI2RlZmluZSBwb3J0TlVNX0NPTkZJR1VSQUJMRV9SRUdJT05TCQkJCQkJKCAoIHBvcnRMQVNUX0NPTkZJR1VSQUJMRV9SRUdJT04gLSBwb3J0RklSU1RfQ09ORklHVVJBQkxFX1JFR0lPTiApICsgMSApCisjZGVmaW5lIHBvcnRUT1RBTF9OVU1fUkVHSU9OUwkJCQkJCQkJKCBwb3J0TlVNX0NPTkZJR1VSQUJMRV9SRUdJT05TICsgMSApIC8qIFBsdXMgb25lIHRvIG1ha2Ugc3BhY2UgZm9yIHRoZSBzdGFjayByZWdpb24uICovCisKKy8qIERldmljZSBtZW1vcnkgYXR0cmlidXRlcyB1c2VkIGluIE1QVV9NQUlSIHJlZ2lzdGVycy4KKyAqCisgKiA4LWJpdCB2YWx1ZXMgZW5jb2RlZCBhcyBmb2xsb3dzOgorICogIEJpdFs3OjRdIC0gMDAwMCAtIERldmljZSBNZW1vcnkKKyAqICBCaXRbMzoyXSAtIDAwIC0tPiBEZXZpY2UtbkduUm5FCisgKgkJCQkwMSAtLT4gRGV2aWNlLW5HblJFCisgKgkJCQkxMCAtLT4gRGV2aWNlLW5HUkUKKyAqCQkJCTExIC0tPiBEZXZpY2UtR1JFCisgKiAgQml0WzE6MF0gLSAwMCwgUmVzZXJ2ZWQuCisgKi8KKyNkZWZpbmUgcG9ydE1QVV9ERVZJQ0VfTUVNT1JZX25HblJuRQkJCQkJCSggMHgwMCApIC8qIDAwMDAgMDAwMCAqLworI2RlZmluZSBwb3J0TVBVX0RFVklDRV9NRU1PUllfbkduUkUJCQkJCQkJKCAweDA0ICkgLyogMDAwMCAwMTAwICovCisjZGVmaW5lIHBvcnRNUFVfREVWSUNFX01FTU9SWV9uR1JFCQkJCQkJCSggMHgwOCApIC8qIDAwMDAgMTAwMCAqLworI2RlZmluZSBwb3J0TVBVX0RFVklDRV9NRU1PUllfR1JFCQkJCQkJCSggMHgwQyApIC8qIDAwMDAgMTEwMCAqLworCisvKiBOb3JtYWwgbWVtb3J5IGF0dHJpYnV0ZXMgdXNlZCBpbiBNUFVfTUFJUiByZWdpc3RlcnMuICovCisjZGVmaW5lIHBvcnRNUFVfTk9STUFMX01FTU9SWV9OT05fQ0FDSEVBQkxFCQkJCQkoIDB4NDQgKSAvKiBOb24tY2FjaGVhYmxlLiAqLworI2RlZmluZSBwb3J0TVBVX05PUk1BTF9NRU1PUllfQlVGRkVSQUJMRV9DQUNIRUFCTEUJCQkoIDB4RkYgKSAvKiBOb24tVHJhbnNpZW50LCBXcml0ZS1iYWNrLCBSZWFkLUFsbG9jYXRlIGFuZCBXcml0ZS1BbGxvY2F0ZS4gKi8KKworLyogQXR0cmlidXRlcyB1c2VkIGluIE1QVV9SQkFSIHJlZ2lzdGVycy4gKi8KKyNkZWZpbmUgcG9ydE1QVV9SRUdJT05fTk9OX1NIQVJFQUJMRQkJCQkJCSggMFVMIDw8IDNVTCApCisjZGVmaW5lIHBvcnRNUFVfUkVHSU9OX0lOTkVSX1NIQVJFQUJMRQkJCQkJCSggMVVMIDw8IDNVTCApCisjZGVmaW5lIHBvcnRNUFVfUkVHSU9OX09VVEVSX1NIQVJFQUJMRQkJCQkJCSggMlVMIDw8IDNVTCApCisKKyNkZWZpbmUgcG9ydE1QVV9SRUdJT05fUFJJVklMRUdFRF9SRUFEX1dSSVRFCQkJCSggMFVMIDw8IDFVTCApCisjZGVmaW5lIHBvcnRNUFVfUkVHSU9OX1JFQURfV1JJVEUJCQkJCQkJKCAxVUwgPDwgMVVMICkKKyNkZWZpbmUgcG9ydE1QVV9SRUdJT05fUFJJVklMRUdFRF9SRUFEX09OTFkJCQkJCSggMlVMIDw8IDFVTCApCisjZGVmaW5lIHBvcnRNUFVfUkVHSU9OX1JFQURfT05MWQkJCQkJCQkoIDNVTCA8PCAxVUwgKQorCisjZGVmaW5lIHBvcnRNUFVfUkVHSU9OX0VYRUNVVEVfTkVWRVIJCQkJCQkoIDFVTCApCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqCisgKiBAYnJpZWYgU2V0dGluZ3MgdG8gZGVmaW5lIGFuIE1QVSByZWdpb24uCisgKi8KK3R5cGVkZWYgc3RydWN0IE1QVVJlZ2lvblNldHRpbmdzCit7CisJdWludDMyX3QgdWxSQkFSOwkvKio8IFJCQVIgZm9yIHRoZSByZWdpb24uICovCisJdWludDMyX3QgdWxSTEFSOwkvKio8IFJMQVIgZm9yIHRoZSByZWdpb24uICovCit9IE1QVVJlZ2lvblNldHRpbmdzX3Q7CisKKy8qKgorICogQGJyaWVmIE1QVSBzZXR0aW5ncyBhcyBzdG9yZWQgaW4gdGhlIFRDQi4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgTVBVX1NFVFRJTkdTCit7CisJdWludDMyX3QgdWxNQUlSMDsJLyoqPCBNQUlSMCBmb3IgdGhlIHRhc2sgY29udGFpbmluZyBhdHRyaWJ1dGVzIGZvciBhbGwgdGhlIDQgcGVyIHRhc2sgcmVnaW9ucy4gKi8KKwlNUFVSZWdpb25TZXR0aW5nc190IHhSZWdpb25zU2V0dGluZ3NbIHBvcnRUT1RBTF9OVU1fUkVHSU9OUyBdOyAvKio8IFNldHRpbmdzIGZvciA0IHBlciB0YXNrIHJlZ2lvbnMuICovCit9IHhNUFVfU0VUVElOR1M7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqCisgKiBAYnJpZWYgU1ZDIG51bWJlcnMuCisgKi8KKyNkZWZpbmUgcG9ydFNWQ19BTExPQ0FURV9TRUNVUkVfQ09OVEVYVAkJCQkJCTAKKyNkZWZpbmUgcG9ydFNWQ19GUkVFX1NFQ1VSRV9DT05URVhUCQkJCQkJCTEKKyNkZWZpbmUgcG9ydFNWQ19TVEFSVF9TQ0hFRFVMRVIJCQkJCQkJCTIKKyNkZWZpbmUgcG9ydFNWQ19SQUlTRV9QUklWSUxFR0UJCQkJCQkJCTMKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAqIEBicmllZiBTY2hlZHVsZXIgdXRpbGl0aWVzLgorICovCisjZGVmaW5lIHBvcnRZSUVMRCgpCQkJCQkJCQkJCQl2UG9ydFlpZWxkKCkKKyNkZWZpbmUgcG9ydE5WSUNfSU5UX0NUUkxfUkVHCQkJCQkJCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZDA0ICkgKQorI2RlZmluZSBwb3J0TlZJQ19QRU5EU1ZTRVRfQklUCQkJCQkJCQkoIDFVTCA8PCAyOFVMICkKKyNkZWZpbmUgcG9ydEVORF9TV0lUQ0hJTkdfSVNSKCB4U3dpdGNoUmVxdWlyZWQgKQkJCWlmKCB4U3dpdGNoUmVxdWlyZWQgKSBwb3J0TlZJQ19JTlRfQ1RSTF9SRUcgPSBwb3J0TlZJQ19QRU5EU1ZTRVRfQklUCisjZGVmaW5lIHBvcnRZSUVMRF9GUk9NX0lTUiggeCApCQkJCQkJCQlwb3J0RU5EX1NXSVRDSElOR19JU1IoIHggKQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKgorICogQGJyaWVmIENyaXRpY2FsIHNlY3Rpb24gbWFuYWdlbWVudC4KKyAqLworI2RlZmluZSBwb3J0U0VUX0lOVEVSUlVQVF9NQVNLX0ZST01fSVNSKCkJCQkJCXVsU2V0SW50ZXJydXB0TWFza0Zyb21JU1IoKQorI2RlZmluZSBwb3J0Q0xFQVJfSU5URVJSVVBUX01BU0tfRlJPTV9JU1IoeCkJCQkJdkNsZWFySW50ZXJydXB0TWFza0Zyb21JU1IoIHggKQorI2RlZmluZSBwb3J0RElTQUJMRV9JTlRFUlJVUFRTKCkJCQkJCQkJX19hc20gdm9sYXRpbGUgKCAiIGNwc2lkIGkgIiA6OjogIm1lbW9yeSIgKQorI2RlZmluZSBwb3J0RU5BQkxFX0lOVEVSUlVQVFMoKQkJCQkJCQkJX19hc20gdm9sYXRpbGUgKCAiIGNwc2llIGkgIiA6OjogIm1lbW9yeSIgKQorI2RlZmluZSBwb3J0RU5URVJfQ1JJVElDQUwoKQkJCQkJCQkJdlBvcnRFbnRlckNyaXRpY2FsKCkKKyNkZWZpbmUgcG9ydEVYSVRfQ1JJVElDQUwoKQkJCQkJCQkJCXZQb3J0RXhpdENyaXRpY2FsKCkKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAqIEBicmllZiBUYXNrIGZ1bmN0aW9uIG1hY3JvcyBhcyBkZXNjcmliZWQgb24gdGhlIEZyZWVSVE9TLm9yZyBXRUIgc2l0ZS4KKyAqLworI2RlZmluZSBwb3J0VEFTS19GVU5DVElPTl9QUk9UTyggdkZ1bmN0aW9uLCBwdlBhcmFtZXRlcnMgKQl2b2lkIHZGdW5jdGlvbiggdm9pZCAqcHZQYXJhbWV0ZXJzICkKKyNkZWZpbmUgcG9ydFRBU0tfRlVOQ1RJT04oIHZGdW5jdGlvbiwgcHZQYXJhbWV0ZXJzICkJCXZvaWQgdkZ1bmN0aW9uKCB2b2lkICpwdlBhcmFtZXRlcnMgKQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiggY29uZmlnRU5BQkxFX1RSVVNUWk9ORSA9PSAxICkKKwkvKioKKwkgKiBAYnJpZWYgQWxsb2NhdGUgYSBzZWN1cmUgY29udGV4dCBmb3IgdGhlIHRhc2suCisJICoKKwkgKiBUYXNrcyBhcmUgbm90IGNyZWF0ZWQgd2l0aCBhIHNlY3VyZSBjb250ZXh0LiBBbnkgdGFzayB0aGF0IGlzIGdvaW5nIHRvIGNhbGwKKwkgKiBzZWN1cmUgZnVuY3Rpb25zIG11c3QgY2FsbCBwb3J0QUxMT0NBVEVfU0VDVVJFX0NPTlRFWFQoKSB0byBhbGxvY2F0ZSBpdHNlbGYgYQorCSAqIHNlY3VyZSBjb250ZXh0IGJlZm9yZSBpdCBjYWxscyBhbnkgc2VjdXJlIGZ1bmN0aW9uLgorCSAqCisJICogQHBhcmFtW2luXSB1bFNlY3VyZVN0YWNrU2l6ZSBUaGUgc2l6ZSBvZiB0aGUgc2VjdXJlIHN0YWNrIHRvIGJlIGFsbG9jYXRlZC4KKwkgKi8KKwkjZGVmaW5lIHBvcnRBTExPQ0FURV9TRUNVUkVfQ09OVEVYVCggdWxTZWN1cmVTdGFja1NpemUgKQl2UG9ydEFsbG9jYXRlU2VjdXJlQ29udGV4dCggdWxTZWN1cmVTdGFja1NpemUgKQorCisJLyoqCisJICogQGJyaWVmIENhbGxlZCB3aGVuIGEgdGFzayBpcyBkZWxldGVkIHRvIGRlbGV0ZSB0aGUgdGFzaydzIHNlY3VyZSBjb250ZXh0LAorCSAqIGlmIGl0IGhhcyBvbmUuCisJICoKKwkgKiBAcGFyYW1baW5dIHB4VENCIFRoZSBUQ0Igb2YgdGhlIHRhc2sgYmVpbmcgZGVsZXRlZC4KKwkgKi8KKwkjZGVmaW5lIHBvcnRDTEVBTl9VUF9UQ0IoIHB4VENCICkJCQkJCQkJdlBvcnRGcmVlU2VjdXJlQ29udGV4dCggKCB1aW50MzJfdCAqICkgcHhUQ0IgKQorI2Vsc2UKKwkjZGVmaW5lIHBvcnRBTExPQ0FURV9TRUNVUkVfQ09OVEVYVCggdWxTZWN1cmVTdGFja1NpemUgKQorCSNkZWZpbmUgcG9ydENMRUFOX1VQX1RDQiggcHhUQ0IgKQorI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9UUlVTVFpPTkUgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYoIGNvbmZpZ0VOQUJMRV9NUFUgPT0gMSApCisJLyoqCisJICogQGJyaWVmIENoZWNrcyB3aGV0aGVyIG9yIG5vdCB0aGUgcHJvY2Vzc29yIGlzIHByaXZpbGVnZWQuCisJICoKKwkgKiBAcmV0dXJuIDEgaWYgdGhlIHByb2Nlc3NvciBpcyBhbHJlYWR5IHByaXZpbGVnZWQsIDAgb3RoZXJ3aXNlLgorCSAqLworCSNkZWZpbmUgcG9ydElTX1BSSVZJTEVHRUQoKQkJCQkJCQkJCXhJc1ByaXZpbGVnZWQoKQorCisJLyoqCisJICogQGJyaWVmIFJhaXNlIGFuIFNWQyByZXF1ZXN0IHRvIHJhaXNlIHByaXZpbGVnZS4KKwkgKgorCSAqIFRoZSBTVkMgaGFuZGxlciBjaGVja3MgdGhhdCB0aGUgU1ZDIHdhcyByYWlzZWQgZnJvbSBhIHN5c3RlbSBjYWxsIGFuZCBvbmx5CisJICogdGhlbiBpdCByYWlzZXMgdGhlIHByaXZpbGVnZS4gSWYgdGhpcyBpcyBjYWxsZWQgZnJvbSBhbnkgb3RoZXIgcGxhY2UsCisJICogdGhlIHByaXZpbGVnZSBpcyBub3QgcmFpc2VkLgorCSAqLworCSNkZWZpbmUgcG9ydFJBSVNFX1BSSVZJTEVHRSgpCQkJCQkJCQlfX2FzbSB2b2xhdGlsZSAoICJzdmMgJTAgXG4iIDo6ICJpIiAoIHBvcnRTVkNfUkFJU0VfUFJJVklMRUdFICkgOiAibWVtb3J5IiApOworCisJLyoqCisJICogQGJyaWVmIExvd2VycyB0aGUgcHJpdmlsZWdlIGxldmVsIGJ5IHNldHRpbmcgdGhlIGJpdCAwIG9mIHRoZSBDT05UUk9MCisJICogcmVnaXN0ZXIuCisJICovCisJI2RlZmluZSBwb3J0UkVTRVRfUFJJVklMRUdFKCkJCQkJCQkJCXZSZXNldFByaXZpbGVnZSgpCisjZWxzZQorCSNkZWZpbmUgcG9ydElTX1BSSVZJTEVHRUQoKQorCSNkZWZpbmUgcG9ydFJBSVNFX1BSSVZJTEVHRSgpCisJI2RlZmluZSBwb3J0UkVTRVRfUFJJVklMRUdFKCkKKyNlbmRpZiAvKiBjb25maWdFTkFCTEVfTVBVICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqCisgKiBAYnJpZWYgQmFycmllcnMuCisgKi8KKyNkZWZpbmUgcG9ydE1FTU9SWV9CQVJSSUVSKCkgX19hc20gdm9sYXRpbGUoICIiIDo6OiAibWVtb3J5IiApCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFBPUlRNQUNST19IICovCmRpZmYgLS1naXQgYS9Tb3VyY2UvcG9ydGFibGUvR0NDL0FSTV9DTTMzL3NlY3VyZS9zZWN1cmVfY29udGV4dC5jIGIvU291cmNlL3BvcnRhYmxlL0dDQy9BUk1fQ00zMy9zZWN1cmUvc2VjdXJlX2NvbnRleHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzUzNWNkCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL3BvcnRhYmxlL0dDQy9BUk1fQ00zMy9zZWN1cmUvc2VjdXJlX2NvbnRleHQuYwpAQCAtMCwwICsxLDIwNCBAQAorLyoKKyAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMi4xCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgorICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KKyAqIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KKyAqIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mCisgKiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCisgKiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKKyAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTCisgKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IKKyAqIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUgorICogSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogaHR0cDovL3d3dy5GcmVlUlRPUy5vcmcKKyAqIGh0dHA6Ly9hd3MuYW1hem9uLmNvbS9mcmVlcnRvcworICoKKyAqIDEgdGFiID09IDQgc3BhY2VzIQorICovCisKKy8qIFNlY3VyZSBjb250ZXh0IGluY2x1ZGVzLiAqLworI2luY2x1ZGUgInNlY3VyZV9jb250ZXh0LmgiCisKKy8qIFNlY3VyZSBoZWFwIGluY2x1ZGVzLiAqLworI2luY2x1ZGUgInNlY3VyZV9oZWFwLmgiCisKKy8qIFNlY3VyZSBwb3J0IG1hY3Jvcy4gKi8KKyNpbmNsdWRlICJzZWN1cmVfcG9ydF9tYWNyb3MuaCIKKworLyoqCisgKiBAYnJpZWYgQ09OVFJPTCB2YWx1ZSBmb3IgcHJpdmlsZWdlZCB0YXNrcy4KKyAqCisgKiBCaXRbMF0gLSAwIC0tPiBUaHJlYWQgbW9kZSBpcyBwcml2aWxlZ2VkLgorICogQml0WzFdIC0gMSAtLT4gVGhyZWFkIG1vZGUgdXNlcyBQU1AuCisgKi8KKyNkZWZpbmUgc2VjdXJlY29udGV4dENPTlRST0xfVkFMVUVfUFJJVklMRUdFRAkJMHgwMgorCisvKioKKyAqIEBicmllZiBDT05UUk9MIHZhbHVlIGZvciB1bi1wcml2aWxlZ2VkIHRhc2tzLgorICoKKyAqIEJpdFswXSAtIDEgLS0+IFRocmVhZCBtb2RlIGlzIHVuLXByaXZpbGVnZWQuCisgKiBCaXRbMV0gLSAxIC0tPiBUaHJlYWQgbW9kZSB1c2VzIFBTUC4KKyAqLworI2RlZmluZSBzZWN1cmVjb250ZXh0Q09OVFJPTF9WQUxVRV9VTlBSSVZJTEVHRUQJCTB4MDMKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAqIEBicmllZiBTdHJ1Y3R1cmUgdG8gcmVwcmVzZW50IHNlY3VyZSBjb250ZXh0LgorICoKKyAqIEBub3RlIFNpbmNlIHN0YWNrIGdyb3dzIGRvd24sIHB1Y1N0YWNrU3RhcnQgaXMgdGhlIGhpZ2hlc3QgYWRkcmVzcyB3aGlsZQorICogcHVjU3RhY2tMaW1pdCBpcyB0aGUgZmlyc3QgYWRkZXNzIG9mIHRoZSBhbGxvY2F0ZWQgbWVtb3J5LgorICovCit0eXBlZGVmIHN0cnVjdCBTZWN1cmVDb250ZXh0Cit7CisJdWludDhfdCAqcHVjQ3VycmVudFN0YWNrUG9pbnRlcjsJLyoqPCBDdXJyZW50IHZhbHVlIG9mIHN0YWNrIHBvaW50ZXIgKFBTUCkuICovCisJdWludDhfdCAqcHVjU3RhY2tMaW1pdDsJCQkJLyoqPCBMYXN0IGxvY2F0aW9uIG9mIHRoZSBzdGFjayBtZW1vcnkgKFBTUExJTSkuICovCisJdWludDhfdCAqcHVjU3RhY2tTdGFydDsJCQkJLyoqPCBGaXJzdCBsb2NhdGlvbiBvZiB0aGUgc3RhY2sgbWVtb3J5LiAqLworfSBTZWN1cmVDb250ZXh0X3Q7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc2VjdXJlcG9ydE5PTl9TRUNVUkVfQ0FMTEFCTEUgdm9pZCBTZWN1cmVDb250ZXh0X0luaXQoIHZvaWQgKQoreworCXVpbnQzMl90IHVsSVBTUjsKKworCS8qIFJlYWQgdGhlIEludGVycnVwdCBQcm9ncmFtIFN0YXR1cyBSZWdpc3RlciAoSVBTUikgdmFsdWUuICovCisJc2VjdXJlcG9ydFJFQURfSVBTUiggdWxJUFNSICk7CisKKwkvKiBEbyBub3RoaW5nIGlmIHRoZSBwcm9jZXNzb3IgaXMgcnVubmluZyBpbiB0aGUgVGhyZWFkIE1vZGUuIElQU1IgaXMgemVybworCSAqIHdoZW4gdGhlIHByb2Nlc3NvciBpcyBydW5uaW5nIGluIHRoZSBUaHJlYWQgTW9kZS4gKi8KKwlpZiggdWxJUFNSICE9IDAgKQorCXsKKwkJLyogTm8gc3RhY2sgZm9yIHRocmVhZCBtb2RlIHVudGlsIGEgdGFzaydzIGNvbnRleHQgaXMgbG9hZGVkLiAqLworCQlzZWN1cmVwb3J0U0VUX1BTUExJTSggc2VjdXJlY29udGV4dE5PX1NUQUNLICk7CisJCXNlY3VyZXBvcnRTRVRfUFNQKCBzZWN1cmVjb250ZXh0Tk9fU1RBQ0sgKTsKKworCQkjaWYoIGNvbmZpZ0VOQUJMRV9NUFUgPT0gMSApCisJCXsKKwkJCS8qIENvbmZpZ3VyZSB0aHJlYWQgbW9kZSB0byB1c2UgUFNQIGFuZCB0byBiZSB1bnByaXZpbGVnZWQuICovCisJCQlzZWN1cmVwb3J0U0VUX0NPTlRST0woIHNlY3VyZWNvbnRleHRDT05UUk9MX1ZBTFVFX1VOUFJJVklMRUdFRCApOworCQl9CisJCSNlbHNlIC8qIGNvbmZpZ0VOQUJMRV9NUFUgKi8KKwkJeworCQkJLyogQ29uZmlndXJlIHRocmVhZCBtb2RlIHRvIHVzZSBQU1AgYW5kIHRvIGJlIHByaXZpbGVnZWQuLiAqLworCQkJc2VjdXJlcG9ydFNFVF9DT05UUk9MKCBzZWN1cmVjb250ZXh0Q09OVFJPTF9WQUxVRV9QUklWSUxFR0VEICk7CisJCX0KKwkJI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9NUFUgKi8KKwl9Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmKCBjb25maWdFTkFCTEVfTVBVID09IDEgKQorCXNlY3VyZXBvcnROT05fU0VDVVJFX0NBTExBQkxFIFNlY3VyZUNvbnRleHRIYW5kbGVfdCBTZWN1cmVDb250ZXh0X0FsbG9jYXRlQ29udGV4dCggdWludDMyX3QgdWxTZWN1cmVTdGFja1NpemUsIHVpbnQzMl90IHVsSXNUYXNrUHJpdmlsZWdlZCApCisjZWxzZSAvKiBjb25maWdFTkFCTEVfTVBVICovCisJc2VjdXJlcG9ydE5PTl9TRUNVUkVfQ0FMTEFCTEUgU2VjdXJlQ29udGV4dEhhbmRsZV90IFNlY3VyZUNvbnRleHRfQWxsb2NhdGVDb250ZXh0KCB1aW50MzJfdCB1bFNlY3VyZVN0YWNrU2l6ZSApCisjZW5kaWYgLyogY29uZmlnRU5BQkxFX01QVSAqLworeworCXVpbnQ4X3QgKnB1Y1N0YWNrTWVtb3J5ID0gTlVMTDsKKwl1aW50MzJfdCB1bElQU1I7CisJU2VjdXJlQ29udGV4dEhhbmRsZV90IHhTZWN1cmVDb250ZXh0SGFuZGxlID0gTlVMTDsKKwkjaWYoIGNvbmZpZ0VOQUJMRV9NUFUgPT0gMSApCisJCXVpbnQzMl90ICpwdWxDdXJyZW50U3RhY2tQb2ludGVyID0gTlVMTDsKKwkjZW5kaWYgLyogY29uZmlnRU5BQkxFX01QVSAqLworCisJLyogUmVhZCB0aGUgSW50ZXJydXB0IFByb2dyYW0gU3RhdHVzIFJlZ2lzdGVyIChJUFNSKSB2YWx1ZS4gKi8KKwlzZWN1cmVwb3J0UkVBRF9JUFNSKCB1bElQU1IgKTsKKworCS8qIERvIG5vdGhpbmcgaWYgdGhlIHByb2Nlc3NvciBpcyBydW5uaW5nIGluIHRoZSBUaHJlYWQgTW9kZS4gSVBTUiBpcyB6ZXJvCisJICogd2hlbiB0aGUgcHJvY2Vzc29yIGlzIHJ1bm5pbmcgaW4gdGhlIFRocmVhZCBNb2RlLiAqLworCWlmKCB1bElQU1IgIT0gMCApCisJeworCQkvKiBBbGxvY2F0ZSB0aGUgY29udGV4dCBzdHJ1Y3R1cmUuICovCisJCXhTZWN1cmVDb250ZXh0SGFuZGxlID0gKCBTZWN1cmVDb250ZXh0SGFuZGxlX3QgKSBwdlBvcnRNYWxsb2MoIHNpemVvZiggU2VjdXJlQ29udGV4dF90ICkgKTsKKworCQlpZiggeFNlY3VyZUNvbnRleHRIYW5kbGUgIT0gTlVMTCApCisJCXsKKwkJCS8qIEFsbG9jYXRlIHRoZSBzdGFjayBzcGFjZS4gKi8KKwkJCXB1Y1N0YWNrTWVtb3J5ID0gcHZQb3J0TWFsbG9jKCB1bFNlY3VyZVN0YWNrU2l6ZSApOworCisJCQlpZiggcHVjU3RhY2tNZW1vcnkgIT0gTlVMTCApCisJCQl7CisJCQkJLyogU2luY2Ugc3RhY2sgZ3Jvd3MgZG93biwgdGhlIHN0YXJ0aW5nIHBvaW50IHdpbGwgYmUgdGhlIGxhc3QKKwkJCQkgKiBsb2NhdGlvbi4gTm90ZSB0aGF0IHRoaXMgbG9jYXRpb24gaXMgbmV4dCB0byB0aGUgbGFzdAorCQkJCSAqIGFsbG9jYXRlZCBieXRlIGJlY2F1c2UgdGhlIGhhcmR3YXJlIGRlY3JlbWVudHMgdGhlIHN0YWNrCisJCQkJICogcG9pbnRlciBiZWZvcmUgd3JpdGluZyBpLmUuIGlmIHN0YWNrIHBvaW50ZXIgaXMgMHgyLCBhIHB1c2gKKwkJCQkgKiBvcGVyYXRpb24gd2lsbCBkZWNyZW1lbnQgdGhlIHN0YWNrIHBvaW50ZXIgdG8gMHgxIGFuZCB0aGVuCisJCQkJICogd3JpdGUgYXQgMHgxLiAqLworCQkJCXhTZWN1cmVDb250ZXh0SGFuZGxlLT5wdWNTdGFja1N0YXJ0ID0gcHVjU3RhY2tNZW1vcnkgKyB1bFNlY3VyZVN0YWNrU2l6ZTsKKworCQkJCS8qIFRoZSBzdGFjayBjYW5ub3QgZ28gYmV5b25kIHRoaXMgbG9jYXRpb24uIFRoaXMgdmFsdWUgaXMKKwkJCQkgKiBwcm9ncmFtbWVkIGluIHRoZSBQU1BMSU0gcmVnaXN0ZXIgb24gY29udGV4dCBzd2l0Y2guKi8KKwkJCQl4U2VjdXJlQ29udGV4dEhhbmRsZS0+cHVjU3RhY2tMaW1pdCA9IHB1Y1N0YWNrTWVtb3J5OworCisJCQkJI2lmKCBjb25maWdFTkFCTEVfTVBVID09IDEgKQorCQkJCXsKKwkJCQkJLyogU3RvcmUgdGhlIGNvcnJlY3QgQ09OVFJPTCB2YWx1ZSBmb3IgdGhlIHRhc2sgb24gdGhlIHN0YWNrLgorCQkJCQkgKiBUaGlzIHZhbHVlIGlzIHByb2dyYW1tZWQgaW4gdGhlIENPTlRST0wgcmVnaXN0ZXIgb24KKwkJCQkJICogY29udGV4dCBzd2l0Y2guICovCisJCQkJCXB1bEN1cnJlbnRTdGFja1BvaW50ZXIgPSAoIHVpbnQzMl90ICogKSB4U2VjdXJlQ29udGV4dEhhbmRsZS0+cHVjU3RhY2tTdGFydDsKKwkJCQkJcHVsQ3VycmVudFN0YWNrUG9pbnRlci0tOworCQkJCQlpZiggdWxJc1Rhc2tQcml2aWxlZ2VkICkKKwkJCQkJeworCQkJCQkJKiggcHVsQ3VycmVudFN0YWNrUG9pbnRlciApID0gc2VjdXJlY29udGV4dENPTlRST0xfVkFMVUVfUFJJVklMRUdFRDsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCSooIHB1bEN1cnJlbnRTdGFja1BvaW50ZXIgKSA9IHNlY3VyZWNvbnRleHRDT05UUk9MX1ZBTFVFX1VOUFJJVklMRUdFRDsKKwkJCQkJfQorCisJCQkJCS8qIFN0b3JlIHRoZSBjdXJyZW50IHN0YWNrIHBvaW50ZXIuIFRoaXMgdmFsdWUgaXMgcHJvZ3JhbW1lZCBpbgorCQkJCQkgKiB0aGUgUFNQIHJlZ2lzdGVyIG9uIGNvbnRleHQgc3dpdGNoLiAqLworCQkJCQl4U2VjdXJlQ29udGV4dEhhbmRsZS0+cHVjQ3VycmVudFN0YWNrUG9pbnRlciA9ICggdWludDhfdCAqICkgcHVsQ3VycmVudFN0YWNrUG9pbnRlcjsKKwkJCQl9CisJCQkJI2Vsc2UgLyogY29uZmlnRU5BQkxFX01QVSAqLworCQkJCXsKKwkJCQkJLyogQ3VycmVudCBTUCBpcyBzZXQgdG8gdGhlIHN0YXJ0aW5nIG9mIHRoZSBzdGFjay4gVGhpcworCQkJCQkgKiB2YWx1ZSBwcm9ncmFtbWVkIGluIHRoZSBQU1AgcmVnaXN0ZXIgb24gY29udGV4dCBzd2l0Y2guICovCisJCQkJCXhTZWN1cmVDb250ZXh0SGFuZGxlLT5wdWNDdXJyZW50U3RhY2tQb2ludGVyID0geFNlY3VyZUNvbnRleHRIYW5kbGUtPnB1Y1N0YWNrU3RhcnQ7CisKKwkJCQl9CisJCQkJI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9NUFUgKi8KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkvKiBGcmVlIHRoZSBjb250ZXh0IHRvIGF2b2lkIG1lbW9yeSBsZWFrIGFuZCBtYWtlIHN1cmUgdG8gcmV0dXJuCisJCQkJICogTlVMTCB0byBpbmRpY2F0ZSBmYWlsdXJlLiAqLworCQkJCXZQb3J0RnJlZSggeFNlY3VyZUNvbnRleHRIYW5kbGUgKTsKKwkJCQl4U2VjdXJlQ29udGV4dEhhbmRsZSA9IE5VTEw7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4geFNlY3VyZUNvbnRleHRIYW5kbGU7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc2VjdXJlcG9ydE5PTl9TRUNVUkVfQ0FMTEFCTEUgdm9pZCBTZWN1cmVDb250ZXh0X0ZyZWVDb250ZXh0KCBTZWN1cmVDb250ZXh0SGFuZGxlX3QgeFNlY3VyZUNvbnRleHRIYW5kbGUgKQoreworCXVpbnQzMl90IHVsSVBTUjsKKworCS8qIFJlYWQgdGhlIEludGVycnVwdCBQcm9ncmFtIFN0YXR1cyBSZWdpc3RlciAoSVBTUikgdmFsdWUuICovCisJc2VjdXJlcG9ydFJFQURfSVBTUiggdWxJUFNSICk7CisKKwkvKiBEbyBub3RoaW5nIGlmIHRoZSBwcm9jZXNzb3IgaXMgcnVubmluZyBpbiB0aGUgVGhyZWFkIE1vZGUuIElQU1IgaXMgemVybworCSAqIHdoZW4gdGhlIHByb2Nlc3NvciBpcyBydW5uaW5nIGluIHRoZSBUaHJlYWQgTW9kZS4gKi8KKwlpZiggdWxJUFNSICE9IDAgKQorCXsKKwkJLyogRW5zdXJlIHRoYXQgdmFsaWQgcGFyYW1ldGVycyBhcmUgcGFzc2VkLiAqLworCQlzZWN1cmVwb3J0QVNTRVJUKCB4U2VjdXJlQ29udGV4dEhhbmRsZSAhPSBOVUxMICk7CisKKwkJLyogRnJlZSB0aGUgc3RhY2sgc3BhY2UuICovCisJCXZQb3J0RnJlZSggeFNlY3VyZUNvbnRleHRIYW5kbGUtPnB1Y1N0YWNrTGltaXQgKTsKKworCQkvKiBGcmVlIHRoZSBjb250ZXh0IGl0c2VsZi4gKi8KKwkJdlBvcnRGcmVlKCB4U2VjdXJlQ29udGV4dEhhbmRsZSApOworCX0KK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpkaWZmIC0tZ2l0IGEvU291cmNlL3BvcnRhYmxlL0dDQy9BUk1fQ00zMy9zZWN1cmUvc2VjdXJlX2NvbnRleHQuaCBiL1NvdXJjZS9wb3J0YWJsZS9HQ0MvQVJNX0NNMzMvc2VjdXJlL3NlY3VyZV9jb250ZXh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE0OGJmZgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9wb3J0YWJsZS9HQ0MvQVJNX0NNMzMvc2VjdXJlL3NlY3VyZV9jb250ZXh0LmgKQEAgLTAsMCArMSwxMTEgQEAKKy8qCisgKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjIuMQorICogQ29weXJpZ2h0IChDKSAyMDE5IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKKyAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCisgKiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCisgKiB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZgorICogdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLAorICogc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCisgKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUworICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SCisgKiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIKKyAqIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIGh0dHA6Ly93d3cuRnJlZVJUT1Mub3JnCisgKiBodHRwOi8vYXdzLmFtYXpvbi5jb20vZnJlZXJ0b3MKKyAqCisgKiAxIHRhYiA9PSA0IHNwYWNlcyEKKyAqLworCisjaWZuZGVmIF9fU0VDVVJFX0NPTlRFWFRfSF9fCisjZGVmaW5lIF9fU0VDVVJFX0NPTlRFWFRfSF9fCisKKy8qIFN0YW5kYXJkIGluY2x1ZGVzLiAqLworI2luY2x1ZGUgPHN0ZGludC5oPgorCisvKiBGcmVlUlRPUyBpbmNsdWRlcy4gKi8KKyNpbmNsdWRlICJGcmVlUlRPU0NvbmZpZy5oIgorCisvKioKKyAqIEBicmllZiBQU1AgdmFsdWUgd2hlbiBubyB0YXNrJ3MgY29udGV4dCBpcyBsb2FkZWQuCisgKi8KKyNkZWZpbmUgc2VjdXJlY29udGV4dE5PX1NUQUNLCTB4MAorCisvKioKKyAqIEBicmllZiBPcGFxdWUgaGFuZGxlLgorICovCitzdHJ1Y3QgU2VjdXJlQ29udGV4dDsKK3R5cGVkZWYgc3RydWN0IFNlY3VyZUNvbnRleHQqCVNlY3VyZUNvbnRleHRIYW5kbGVfdDsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAqIEBicmllZiBJbml0aWFsaXplcyB0aGUgc2VjdXJlIGNvbnRleHQgbWFuYWdlbWVudCBzeXN0ZW0uCisgKgorICogUFNQIGlzIHNldCB0byBOVUxMIGFuZCB0aGVyZWZvcmUgYSB0YXNrIG11c3QgYWxsb2NhdGUgYW5kIGxvYWQgYSBjb250ZXh0CisgKiBiZWZvcmUgY2FsbGluZyBhbnkgc2VjdXJlIHNpZGUgZnVuY3Rpb24gaW4gdGhlIHRocmVhZCBtb2RlLgorICoKKyAqIEBub3RlIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgaW4gdGhlIGhhbmRsZXIgbW9kZS4gSXQgaXMgbm8tb3AgaWYgY2FsbGVkCisgKiBpbiB0aGUgdGhyZWFkIG1vZGUuCisgKi8KK3ZvaWQgU2VjdXJlQ29udGV4dF9Jbml0KCB2b2lkICk7CisKKy8qKgorICogQGJyaWVmIEFsbG9jYXRlcyBhIGNvbnRleHQgb24gdGhlIHNlY3VyZSBzaWRlLgorICoKKyAqIEBub3RlIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgaW4gdGhlIGhhbmRsZXIgbW9kZS4gSXQgaXMgbm8tb3AgaWYgY2FsbGVkCisgKiBpbiB0aGUgdGhyZWFkIG1vZGUuCisgKgorICogQHBhcmFtW2luXSB1bFNlY3VyZVN0YWNrU2l6ZSBTaXplIG9mIHRoZSBzdGFjayB0byBhbGxvY2F0ZSBvbiBzZWN1cmUgc2lkZS4KKyAqIEBwYXJhbVtpbl0gdWxJc1Rhc2tQcml2aWxlZ2VkIDEgaWYgdGhlIGNhbGxpbmcgdGFzayBpcyBwcml2aWxlZ2VkLCAwIG90aGVyd2lzZS4KKyAqCisgKiBAcmV0dXJuIE9wYXF1ZSBjb250ZXh0IGhhbmRsZSBpZiBjb250ZXh0IGlzIHN1Y2Nlc3NmdWxseSBhbGxvY2F0ZWQsIE5VTEwKKyAqIG90aGVyd2lzZS4KKyAqLworI2lmKCBjb25maWdFTkFCTEVfTVBVID09IDEgKQorCVNlY3VyZUNvbnRleHRIYW5kbGVfdCBTZWN1cmVDb250ZXh0X0FsbG9jYXRlQ29udGV4dCggdWludDMyX3QgdWxTZWN1cmVTdGFja1NpemUsIHVpbnQzMl90IHVsSXNUYXNrUHJpdmlsZWdlZCApOworI2Vsc2UgLyogY29uZmlnRU5BQkxFX01QVSAqLworCVNlY3VyZUNvbnRleHRIYW5kbGVfdCBTZWN1cmVDb250ZXh0X0FsbG9jYXRlQ29udGV4dCggdWludDMyX3QgdWxTZWN1cmVTdGFja1NpemUgKTsKKyNlbmRpZiAvKiBjb25maWdFTkFCTEVfTVBVICovCisKKy8qKgorICogQGJyaWVmIEZyZWVzIHRoZSBnaXZlbiBjb250ZXh0LgorICoKKyAqIEBub3RlIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgaW4gdGhlIGhhbmRsZXIgbW9kZS4gSXQgaXMgbm8tb3AgaWYgY2FsbGVkCisgKiBpbiB0aGUgdGhyZWFkIG1vZGUuCisgKgorICogQHBhcmFtW2luXSB4U2VjdXJlQ29udGV4dEhhbmRsZSBDb250ZXh0IGhhbmRsZSBjb3JyZXNwb25kaW5nIHRvIHRoZQorICogY29udGV4dCB0byBiZSBmcmVlZC4KKyAqLwordm9pZCBTZWN1cmVDb250ZXh0X0ZyZWVDb250ZXh0KCBTZWN1cmVDb250ZXh0SGFuZGxlX3QgeFNlY3VyZUNvbnRleHRIYW5kbGUgKTsKKworLyoqCisgKiBAYnJpZWYgTG9hZHMgdGhlIGdpdmVuIGNvbnRleHQuCisgKgorICogQG5vdGUgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBpbiB0aGUgaGFuZGxlciBtb2RlLiBJdCBpcyBuby1vcCBpZiBjYWxsZWQKKyAqIGluIHRoZSB0aHJlYWQgbW9kZS4KKyAqCisgKiBAcGFyYW1baW5dIHhTZWN1cmVDb250ZXh0SGFuZGxlIENvbnRleHQgaGFuZGxlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGNvbnRleHQKKyAqIHRvIGJlIGxvYWRlZC4KKyAqLwordm9pZCBTZWN1cmVDb250ZXh0X0xvYWRDb250ZXh0KCBTZWN1cmVDb250ZXh0SGFuZGxlX3QgeFNlY3VyZUNvbnRleHRIYW5kbGUgKTsKKworLyoqCisgKiBAYnJpZWYgU2F2ZXMgdGhlIGdpdmVuIGNvbnRleHQuCisgKgorICogQG5vdGUgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBpbiB0aGUgaGFuZGxlciBtb2RlLiBJdCBpcyBuby1vcCBpZiBjYWxsZWQKKyAqIGluIHRoZSB0aHJlYWQgbW9kZS4KKyAqCisgKiBAcGFyYW1baW5dIHhTZWN1cmVDb250ZXh0SGFuZGxlIENvbnRleHQgaGFuZGxlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGNvbnRleHQKKyAqIHRvIGJlIHNhdmVkLgorICovCit2b2lkIFNlY3VyZUNvbnRleHRfU2F2ZUNvbnRleHQoIFNlY3VyZUNvbnRleHRIYW5kbGVfdCB4U2VjdXJlQ29udGV4dEhhbmRsZSApOworCisjZW5kaWYgLyogX19TRUNVUkVfQ09OVEVYVF9IX18gKi8KZGlmZiAtLWdpdCBhL1NvdXJjZS9wb3J0YWJsZS9HQ0MvQVJNX0NNMzMvc2VjdXJlL3NlY3VyZV9jb250ZXh0X3BvcnQuYyBiL1NvdXJjZS9wb3J0YWJsZS9HQ0MvQVJNX0NNMzMvc2VjdXJlL3NlY3VyZV9jb250ZXh0X3BvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzU1NmY1Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL3BvcnRhYmxlL0dDQy9BUk1fQ00zMy9zZWN1cmUvc2VjdXJlX2NvbnRleHRfcG9ydC5jCkBAIC0wLDAgKzEsODggQEAKKy8qCisgKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjIuMQorICogQ29weXJpZ2h0IChDKSAyMDE5IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKKyAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCisgKiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCisgKiB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZgorICogdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLAorICogc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCisgKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUworICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SCisgKiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIKKyAqIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIGh0dHA6Ly93d3cuRnJlZVJUT1Mub3JnCisgKiBodHRwOi8vYXdzLmFtYXpvbi5jb20vZnJlZXJ0b3MKKyAqCisgKiAxIHRhYiA9PSA0IHNwYWNlcyEKKyAqLworCisvKiBTZWN1cmUgY29udGV4dCBpbmNsdWRlcy4gKi8KKyNpbmNsdWRlICJzZWN1cmVfY29udGV4dC5oIgorCisvKiBTZWN1cmUgcG9ydCBtYWNyb3MuICovCisjaW5jbHVkZSAic2VjdXJlX3BvcnRfbWFjcm9zLmgiCisKK3NlY3VyZXBvcnROT05fU0VDVVJFX0NBTExBQkxFIHZvaWQgU2VjdXJlQ29udGV4dF9Mb2FkQ29udGV4dCggU2VjdXJlQ29udGV4dEhhbmRsZV90IHhTZWN1cmVDb250ZXh0SGFuZGxlICkKK3sKKwkvKiB4U2VjdXJlQ29udGV4dEhhbmRsZSB2YWx1ZSBpcyBpbiByMC4gKi8KKwlfX2FzbSB2b2xhdGlsZQorCSgKKwkiCS5zeW50YXggdW5pZmllZAkJCQkJCQlcbiIKKwkiCQkJCQkJCQkJCQlcbiIKKwkiCW1ycyByMSwgaXBzcgkJCQkJCQlcbiIgLyogcjEgPSBJUFNSLiAqLworCSIJY2J6IHIxLCBsb2FkX2N0eF90aGVyYWRfbW9kZQkJCVxuIiAvKiBEbyBub3RoaW5nIGlmIHRoZSBwcm9jZXNzb3IgaXMgcnVubmluZyBpbiB0aGUgVGhyZWFkIE1vZGUuICovCisJIglsZG1pYSByMCEsIHtyMSwgcjJ9CQkJCQkJXG4iIC8qIHIxID0geFNlY3VyZUNvbnRleHRIYW5kbGUtPnB1Y0N1cnJlbnRTdGFja1BvaW50ZXIsIHIyID0geFNlY3VyZUNvbnRleHRIYW5kbGUtPnB1Y1N0YWNrTGltaXQuICovCisJI2lmKCBjb25maWdFTkFCTEVfTVBVID09IDEgKQorCSIJbGRtaWEgcjEhLCB7cjN9CQkJCQkJCVxuIiAvKiBSZWFkIENPTlRST0wgcmVnaXN0ZXIgdmFsdWUgZnJvbSB0YXNrJ3Mgc3RhY2suIHIzID0gQ09OVFJPTC4gKi8KKwkiCW1zciBjb250cm9sLCByMwkJCQkJCQlcbiIgLyogQ09OVFJPTCA9IHIzLiAqLworCSNlbmRpZiAvKiBjb25maWdFTkFCTEVfTVBVICovCisJIgltc3IgcHNwbGltLCByMgkJCQkJCQlcbiIgLyogUFNQTElNID0gcjIuICovCisJIgltc3IgcHNwLCByMQkJCQkJCQkJXG4iIC8qIFBTUCA9IHIxLiAqLworCSIJCQkJCQkJCQkJCVxuIgorCSIgbG9hZF9jdHhfdGhlcmFkX21vZGU6CQkJCQkJXG4iCisJIglub3AJCQkJCQkJCQkJXG4iCisJIgkJCQkJCQkJCQkJXG4iCisJOjo6InIwIiwgInIxIiwgInIyIgorCSk7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc2VjdXJlcG9ydE5PTl9TRUNVUkVfQ0FMTEFCTEUgdm9pZCBTZWN1cmVDb250ZXh0X1NhdmVDb250ZXh0KCBTZWN1cmVDb250ZXh0SGFuZGxlX3QgeFNlY3VyZUNvbnRleHRIYW5kbGUgKQoreworCS8qIHhTZWN1cmVDb250ZXh0SGFuZGxlIHZhbHVlIGlzIGluIHIwLiAqLworCV9fYXNtIHZvbGF0aWxlCisJKAorCSIJLnN5bnRheCB1bmlmaWVkCQkJCQkJCVxuIgorCSIJCQkJCQkJCQkJCVxuIgorCSIJbXJzIHIxLCBpcHNyCQkJCQkJCVxuIiAvKiByMSA9IElQU1IuICovCisJIgljYnogcjEsIHNhdmVfY3R4X3RoZXJhZF9tb2RlCQkJXG4iIC8qIERvIG5vdGhpbmcgaWYgdGhlIHByb2Nlc3NvciBpcyBydW5uaW5nIGluIHRoZSBUaHJlYWQgTW9kZS4gKi8KKwkiCW1ycyByMSwgcHNwCQkJCQkJCQlcbiIgLyogcjEgPSBQU1AuICovCisJI2lmKCBjb25maWdFTkFCTEVfRlBVID09IDEgKQorCSIJdnN0bWRiIHIxISwge3MwfQkJCQkJCVxuIiAvKiBUcmlnZ2VyIHRoZSBkZWZmZXJyZWQgc3RhY2tpbmcgb2YgRlBVIHJlZ2lzdGVycy4gKi8KKwkiCXZsZG1pYSByMSEsIHtzMH0JCQkJCQlcbiIgLyogTnVsbGlmeSB0aGUgZWZmZWN0IG9mIHRoZSBwZXJ2aW91cyBzdGF0ZW1lbnQuICovCisJI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9GUFUgKi8KKwkjaWYoIGNvbmZpZ0VOQUJMRV9NUFUgPT0gMSApCisJIgltcnMgcjIsIGNvbnRyb2wJCQkJCQkJXG4iIC8qIHIyID0gQ09OVFJPTC4gKi8KKwkiCXN0bWRiIHIxISwge3IyfQkJCQkJCQlcbiIgLyogU3RvcmUgQ09OVFJPTCB2YWx1ZSBvbiB0aGUgc3RhY2suICovCisJI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9NUFUgKi8KKwkiCXN0ciByMSwgW3IwXQkJCQkJCQlcbiIgLyogU2F2ZSB0aGUgdG9wIG9mIHN0YWNrIGluIGNvbnRleHQuIHhTZWN1cmVDb250ZXh0SGFuZGxlLT5wdWNDdXJyZW50U3RhY2tQb2ludGVyID0gcjEuICovCisJIgltb3ZzIHIxLCAlMAkJCQkJCQkJXG4iIC8qIHIxID0gc2VjdXJlY29udGV4dE5PX1NUQUNLLiAqLworCSIJbXNyIHBzcGxpbSwgcjEJCQkJCQkJXG4iIC8qIFBTUExJTSA9IHNlY3VyZWNvbnRleHROT19TVEFDSy4gKi8KKwkiCW1zciBwc3AsIHIxCQkJCQkJCQlcbiIgLyogUFNQID0gc2VjdXJlY29udGV4dE5PX1NUQUNLIGkuZS4gTm8gc3RhY2sgZm9yIHRocmVhZCBtb2RlIHVudGlsIG5leHQgdGFzaydzIGNvbnRleHQgaXMgbG9hZGVkLiAqLworCSIJCQkJCQkJCQkJCVxuIgorCSIgc2F2ZV9jdHhfdGhlcmFkX21vZGU6CQkJCQkJXG4iCisJIglub3AJCQkJCQkJCQkJXG4iCisJIgkJCQkJCQkJCQkJXG4iCisJOjogImkiICggc2VjdXJlY29udGV4dE5PX1NUQUNLICkgOiAicjEiLCAibWVtb3J5IgorCSk7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KZGlmZiAtLWdpdCBhL1NvdXJjZS9wb3J0YWJsZS9HQ0MvQVJNX0NNMzMvc2VjdXJlL3NlY3VyZV9oZWFwLmMgYi9Tb3VyY2UvcG9ydGFibGUvR0NDL0FSTV9DTTMzL3NlY3VyZS9zZWN1cmVfaGVhcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwZmNlNWMKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvcG9ydGFibGUvR0NDL0FSTV9DTTMzL3NlY3VyZS9zZWN1cmVfaGVhcC5jCkBAIC0wLDAgKzEsNDUwIEBACisvKgorICogRnJlZVJUT1MgS2VybmVsIFYxMC4yLjEKKyAqIENvcHlyaWdodCAoQykgMjAxOSBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCisgKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgorICogdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bworICogdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YKKyAqIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKKyAqIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAorICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MKKyAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUgorICogQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSCisgKiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBodHRwOi8vd3d3LkZyZWVSVE9TLm9yZworICogaHR0cDovL2F3cy5hbWF6b24uY29tL2ZyZWVydG9zCisgKgorICogMSB0YWIgPT0gNCBzcGFjZXMhCisgKi8KKworLyogU3RhbmRhcmQgaW5jbHVkZXMuICovCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8qIFNlY3VyZSBjb250ZXh0IGhlYXAgaW5jbHVkZXMuICovCisjaW5jbHVkZSAic2VjdXJlX2hlYXAuaCIKKworLyogU2VjdXJlIHBvcnQgbWFjcm9zLiAqLworI2luY2x1ZGUgInNlY3VyZV9wb3J0X21hY3Jvcy5oIgorCisvKioKKyAqIEBicmllZiBUb3RhbCBoZWFwIHNpemUuCisgKi8KKyNkZWZpbmUgc2VjdXJlY29uZmlnVE9UQUxfSEVBUF9TSVpFCQkoICggKCBzaXplX3QgKSAoIDEwICogMTAyNCApICkgKQorCisvKiBObyB0ZXN0IG1hcmtlciBieSBkZWZhdWx0LiAqLworI2lmbmRlZiBtdENPVkVSQUdFX1RFU1RfTUFSS0VSCisJI2RlZmluZSBtdENPVkVSQUdFX1RFU1RfTUFSS0VSKCkKKyNlbmRpZgorCisvKiBObyB0cmFjaW5nIGJ5IGRlZmF1bHQuICovCisjaWZuZGVmIHRyYWNlTUFMTE9DCisJI2RlZmluZSB0cmFjZU1BTExPQyggcHZSZXR1cm4sIHhXYW50ZWRTaXplICkKKyNlbmRpZgorCisvKiBObyB0cmFjaW5nIGJ5IGRlZmF1bHQuICovCisjaWZuZGVmIHRyYWNlRlJFRQorCSNkZWZpbmUgdHJhY2VGUkVFKCBwdiwgeEJsb2NrU2l6ZSApCisjZW5kaWYKKworLyogQmxvY2sgc2l6ZXMgbXVzdCBub3QgZ2V0IHRvbyBzbWFsbC4gKi8KKyNkZWZpbmUgc2VjdXJlaGVhcE1JTklNVU1fQkxPQ0tfU0laRQkoICggc2l6ZV90ICkgKCB4SGVhcFN0cnVjdFNpemUgPDwgMSApICkKKworLyogQXNzdW1lcyA4Yml0IGJ5dGVzISAqLworI2RlZmluZSBzZWN1cmVoZWFwQklUU19QRVJfQllURQkJCSggKCBzaXplX3QgKSA4ICkKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBBbGxvY2F0ZSB0aGUgbWVtb3J5IGZvciB0aGUgaGVhcC4gKi8KKyNpZiggY29uZmlnQVBQTElDQVRJT05fQUxMT0NBVEVEX0hFQVAgPT0gMSApCisJLyogVGhlIGFwcGxpY2F0aW9uIHdyaXRlciBoYXMgYWxyZWFkeSBkZWZpbmVkIHRoZSBhcnJheSB1c2VkIGZvciB0aGUgUlRPUworCSAqIGhlYXAgLSBwcm9iYWJseSBzbyBpdCBjYW4gYmUgcGxhY2VkIGluIGEgc3BlY2lhbCBzZWdtZW50IG9yIGFkZHJlc3MuICovCisJZXh0ZXJuIHVpbnQ4X3QgdWNIZWFwWyBzZWN1cmVjb25maWdUT1RBTF9IRUFQX1NJWkUgXTsKKyNlbHNlIC8qIGNvbmZpZ0FQUExJQ0FUSU9OX0FMTE9DQVRFRF9IRUFQICovCisJc3RhdGljIHVpbnQ4X3QgdWNIZWFwWyBzZWN1cmVjb25maWdUT1RBTF9IRUFQX1NJWkUgXTsKKyNlbmRpZiAvKiBjb25maWdBUFBMSUNBVElPTl9BTExPQ0FURURfSEVBUCAqLworCisvKioKKyAqIEBicmllZiBUaGUgbGlua2VkIGxpc3Qgc3RydWN0dXJlLgorICoKKyAqIFRoaXMgaXMgdXNlZCB0byBsaW5rIGZyZWUgYmxvY2tzIGluIG9yZGVyIG9mIHRoZWlyIG1lbW9yeSBhZGRyZXNzLgorICovCit0eXBlZGVmIHN0cnVjdCBBX0JMT0NLX0xJTksKK3sKKwlzdHJ1Y3QgQV9CTE9DS19MSU5LICpweE5leHRGcmVlQmxvY2s7CS8qKjwgVGhlIG5leHQgZnJlZSBibG9jayBpbiB0aGUgbGlzdC4gKi8KKwlzaXplX3QgeEJsb2NrU2l6ZTsJCQkJCQkvKio8IFRoZSBzaXplIG9mIHRoZSBmcmVlIGJsb2NrLiAqLworfSBCbG9ja0xpbmtfdDsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAqIEBicmllZiBDYWxsZWQgYXV0b21hdGljYWxseSB0byBzZXR1cCB0aGUgcmVxdWlyZWQgaGVhcCBzdHJ1Y3R1cmVzIHRoZSBmaXJzdAorICogdGltZSBwdlBvcnRNYWxsb2MoKSBpcyBjYWxsZWQuCisgKi8KK3N0YXRpYyB2b2lkIHBydkhlYXBJbml0KCB2b2lkICk7CisKKy8qKgorICogQGJyaWVmIEluc2VydHMgYSBibG9jayBvZiBtZW1vcnkgdGhhdCBpcyBiZWluZyBmcmVlZCBpbnRvIHRoZSBjb3JyZWN0CisgKiBwb3NpdGlvbiBpbiB0aGUgbGlzdCBvZiBmcmVlIG1lbW9yeSBibG9ja3MuCisgKgorICogVGhlIGJsb2NrIGJlaW5nIGZyZWVkIHdpbGwgYmUgbWVyZ2VkIHdpdGggdGhlIGJsb2NrIGluIGZyb250IGl0IGFuZC9vciB0aGUKKyAqIGJsb2NrIGJlaGluZCBpdCBpZiB0aGUgbWVtb3J5IGJsb2NrcyBhcmUgYWRqYWNlbnQgdG8gZWFjaCBvdGhlci4KKyAqCisgKiBAcGFyYW1baW5dIHB4QmxvY2tUb0luc2VydCBUaGUgYmxvY2sgYmVpbmcgZnJlZWQuCisgKi8KK3N0YXRpYyB2b2lkIHBydkluc2VydEJsb2NrSW50b0ZyZWVMaXN0KCBCbG9ja0xpbmtfdCAqcHhCbG9ja1RvSW5zZXJ0ICk7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqCisgKiBAYnJpZWYgVGhlIHNpemUgb2YgdGhlIHN0cnVjdHVyZSBwbGFjZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIGFsbG9jYXRlZAorICogbWVtb3J5IGJsb2NrIG11c3QgYnkgY29ycmVjdGx5IGJ5dGUgYWxpZ25lZC4KKyAqLworc3RhdGljIGNvbnN0IHNpemVfdCB4SGVhcFN0cnVjdFNpemUgPSAoIHNpemVvZiggQmxvY2tMaW5rX3QgKSArICggKCBzaXplX3QgKSAoIHNlY3VyZXBvcnRCWVRFX0FMSUdOTUVOVCAtIDEgKSApICkgJiB+KCAoIHNpemVfdCApIHNlY3VyZXBvcnRCWVRFX0FMSUdOTUVOVF9NQVNLICk7CisKKy8qKgorICogQGJyaWVmIENyZWF0ZSBhIGNvdXBsZSBvZiBsaXN0IGxpbmtzIHRvIG1hcmsgdGhlIHN0YXJ0IGFuZCBlbmQgb2YgdGhlIGxpc3QuCisgKi8KK3N0YXRpYyBCbG9ja0xpbmtfdCB4U3RhcnQsICpweEVuZCA9IE5VTEw7CisKKy8qKgorICogQGJyaWVmIEtlZXBzIHRyYWNrIG9mIHRoZSBudW1iZXIgb2YgZnJlZSBieXRlcyByZW1haW5pbmcsIGJ1dCBzYXlzIG5vdGhpbmcKKyAqIGFib3V0IGZyYWdtZW50YXRpb24uCisgKi8KK3N0YXRpYyBzaXplX3QgeEZyZWVCeXRlc1JlbWFpbmluZyA9IDBVOworc3RhdGljIHNpemVfdCB4TWluaW11bUV2ZXJGcmVlQnl0ZXNSZW1haW5pbmcgPSAwVTsKKworLyoqCisgKiBAYnJpZWYgR2V0cyBzZXQgdG8gdGhlIHRvcCBiaXQgb2YgYW4gc2l6ZV90IHR5cGUuCisgKgorICogV2hlbiB0aGlzIGJpdCBpbiB0aGUgeEJsb2NrU2l6ZSBtZW1iZXIgb2YgYW4gQmxvY2tMaW5rX3Qgc3RydWN0dXJlIGlzIHNldAorICogdGhlbiB0aGUgYmxvY2sgYmVsb25ncyB0byB0aGUgYXBwbGljYXRpb24uIFdoZW4gdGhlIGJpdCBpcyBmcmVlIHRoZSBibG9jayBpcworICogc3RpbGwgcGFydCBvZiB0aGUgZnJlZSBoZWFwIHNwYWNlLgorICovCitzdGF0aWMgc2l6ZV90IHhCbG9ja0FsbG9jYXRlZEJpdCA9IDA7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHZvaWQgcHJ2SGVhcEluaXQoIHZvaWQgKQoreworQmxvY2tMaW5rX3QgKnB4Rmlyc3RGcmVlQmxvY2s7Cit1aW50OF90ICpwdWNBbGlnbmVkSGVhcDsKK3NpemVfdCB1eEFkZHJlc3M7CitzaXplX3QgeFRvdGFsSGVhcFNpemUgPSBzZWN1cmVjb25maWdUT1RBTF9IRUFQX1NJWkU7CisKKwkvKiBFbnN1cmUgdGhlIGhlYXAgc3RhcnRzIG9uIGEgY29ycmVjdGx5IGFsaWduZWQgYm91bmRhcnkuICovCisJdXhBZGRyZXNzID0gKCBzaXplX3QgKSB1Y0hlYXA7CisKKwlpZiggKCB1eEFkZHJlc3MgJiBzZWN1cmVwb3J0QllURV9BTElHTk1FTlRfTUFTSyApICE9IDAgKQorCXsKKwkJdXhBZGRyZXNzICs9ICggc2VjdXJlcG9ydEJZVEVfQUxJR05NRU5UIC0gMSApOworCQl1eEFkZHJlc3MgJj0gfiggKCBzaXplX3QgKSBzZWN1cmVwb3J0QllURV9BTElHTk1FTlRfTUFTSyApOworCQl4VG90YWxIZWFwU2l6ZSAtPSB1eEFkZHJlc3MgLSAoIHNpemVfdCApIHVjSGVhcDsKKwl9CisKKwlwdWNBbGlnbmVkSGVhcCA9ICggdWludDhfdCAqICkgdXhBZGRyZXNzOworCisJLyogeFN0YXJ0IGlzIHVzZWQgdG8gaG9sZCBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIGxpc3Qgb2YgZnJlZQorCSAqIGJsb2Nrcy4gIFRoZSB2b2lkIGNhc3QgaXMgdXNlZCB0byBwcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzLiAqLworCXhTdGFydC5weE5leHRGcmVlQmxvY2sgPSAoIHZvaWQgKiApIHB1Y0FsaWduZWRIZWFwOworCXhTdGFydC54QmxvY2tTaXplID0gKCBzaXplX3QgKSAwOworCisJLyogcHhFbmQgaXMgdXNlZCB0byBtYXJrIHRoZSBlbmQgb2YgdGhlIGxpc3Qgb2YgZnJlZSBibG9ja3MgYW5kIGlzIGluc2VydGVkCisJICogYXQgdGhlIGVuZCBvZiB0aGUgaGVhcCBzcGFjZS4gKi8KKwl1eEFkZHJlc3MgPSAoICggc2l6ZV90ICkgcHVjQWxpZ25lZEhlYXAgKSArIHhUb3RhbEhlYXBTaXplOworCXV4QWRkcmVzcyAtPSB4SGVhcFN0cnVjdFNpemU7CisJdXhBZGRyZXNzICY9IH4oICggc2l6ZV90ICkgc2VjdXJlcG9ydEJZVEVfQUxJR05NRU5UX01BU0sgKTsKKwlweEVuZCA9ICggdm9pZCAqICkgdXhBZGRyZXNzOworCXB4RW5kLT54QmxvY2tTaXplID0gMDsKKwlweEVuZC0+cHhOZXh0RnJlZUJsb2NrID0gTlVMTDsKKworCS8qIFRvIHN0YXJ0IHdpdGggdGhlcmUgaXMgYSBzaW5nbGUgZnJlZSBibG9jayB0aGF0IGlzIHNpemVkIHRvIHRha2UgdXAgdGhlCisJICogZW50aXJlIGhlYXAgc3BhY2UsIG1pbnVzIHRoZSBzcGFjZSB0YWtlbiBieSBweEVuZC4gKi8KKwlweEZpcnN0RnJlZUJsb2NrID0gKCB2b2lkICogKSBwdWNBbGlnbmVkSGVhcDsKKwlweEZpcnN0RnJlZUJsb2NrLT54QmxvY2tTaXplID0gdXhBZGRyZXNzIC0gKCBzaXplX3QgKSBweEZpcnN0RnJlZUJsb2NrOworCXB4Rmlyc3RGcmVlQmxvY2stPnB4TmV4dEZyZWVCbG9jayA9IHB4RW5kOworCisJLyogT25seSBvbmUgYmxvY2sgZXhpc3RzIC0gYW5kIGl0IGNvdmVycyB0aGUgZW50aXJlIHVzYWJsZSBoZWFwIHNwYWNlLiAqLworCXhNaW5pbXVtRXZlckZyZWVCeXRlc1JlbWFpbmluZyA9IHB4Rmlyc3RGcmVlQmxvY2stPnhCbG9ja1NpemU7CisJeEZyZWVCeXRlc1JlbWFpbmluZyA9IHB4Rmlyc3RGcmVlQmxvY2stPnhCbG9ja1NpemU7CisKKwkvKiBXb3JrIG91dCB0aGUgcG9zaXRpb24gb2YgdGhlIHRvcCBiaXQgaW4gYSBzaXplX3QgdmFyaWFibGUuICovCisJeEJsb2NrQWxsb2NhdGVkQml0ID0gKCAoIHNpemVfdCApIDEgKSA8PCAoICggc2l6ZW9mKCBzaXplX3QgKSAqIHNlY3VyZWhlYXBCSVRTX1BFUl9CWVRFICkgLSAxICk7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHZvaWQgcHJ2SW5zZXJ0QmxvY2tJbnRvRnJlZUxpc3QoIEJsb2NrTGlua190ICpweEJsb2NrVG9JbnNlcnQgKQoreworQmxvY2tMaW5rX3QgKnB4SXRlcmF0b3I7Cit1aW50OF90ICpwdWM7CisKKwkvKiBJdGVyYXRlIHRocm91Z2ggdGhlIGxpc3QgdW50aWwgYSBibG9jayBpcyBmb3VuZCB0aGF0IGhhcyBhIGhpZ2hlciBhZGRyZXNzCisJICogdGhhbiB0aGUgYmxvY2sgYmVpbmcgaW5zZXJ0ZWQuICovCisJZm9yKCBweEl0ZXJhdG9yID0gJnhTdGFydDsgcHhJdGVyYXRvci0+cHhOZXh0RnJlZUJsb2NrIDwgcHhCbG9ja1RvSW5zZXJ0OyBweEl0ZXJhdG9yID0gcHhJdGVyYXRvci0+cHhOZXh0RnJlZUJsb2NrICkKKwl7CisJCS8qIE5vdGhpbmcgdG8gZG8gaGVyZSwganVzdCBpdGVyYXRlIHRvIHRoZSByaWdodCBwb3NpdGlvbi4gKi8KKwl9CisKKwkvKiBEbyB0aGUgYmxvY2sgYmVpbmcgaW5zZXJ0ZWQsIGFuZCB0aGUgYmxvY2sgaXQgaXMgYmVpbmcgaW5zZXJ0ZWQgYWZ0ZXIKKwkgKiBtYWtlIGEgY29udGlndW91cyBibG9jayBvZiBtZW1vcnk/ICovCisJcHVjID0gKCB1aW50OF90ICogKSBweEl0ZXJhdG9yOworCWlmKCAoIHB1YyArIHB4SXRlcmF0b3ItPnhCbG9ja1NpemUgKSA9PSAoIHVpbnQ4X3QgKiApIHB4QmxvY2tUb0luc2VydCApCisJeworCQlweEl0ZXJhdG9yLT54QmxvY2tTaXplICs9IHB4QmxvY2tUb0luc2VydC0+eEJsb2NrU2l6ZTsKKwkJcHhCbG9ja1RvSW5zZXJ0ID0gcHhJdGVyYXRvcjsKKwl9CisJZWxzZQorCXsKKwkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCX0KKworCS8qIERvIHRoZSBibG9jayBiZWluZyBpbnNlcnRlZCwgYW5kIHRoZSBibG9jayBpdCBpcyBiZWluZyBpbnNlcnRlZCBiZWZvcmUKKwkgKiBtYWtlIGEgY29udGlndW91cyBibG9jayBvZiBtZW1vcnk/ICovCisJcHVjID0gKCB1aW50OF90ICogKSBweEJsb2NrVG9JbnNlcnQ7CisJaWYoICggcHVjICsgcHhCbG9ja1RvSW5zZXJ0LT54QmxvY2tTaXplICkgPT0gKCB1aW50OF90ICogKSBweEl0ZXJhdG9yLT5weE5leHRGcmVlQmxvY2sgKQorCXsKKwkJaWYoIHB4SXRlcmF0b3ItPnB4TmV4dEZyZWVCbG9jayAhPSBweEVuZCApCisJCXsKKwkJCS8qIEZvcm0gb25lIGJpZyBibG9jayBmcm9tIHRoZSB0d28gYmxvY2tzLiAqLworCQkJcHhCbG9ja1RvSW5zZXJ0LT54QmxvY2tTaXplICs9IHB4SXRlcmF0b3ItPnB4TmV4dEZyZWVCbG9jay0+eEJsb2NrU2l6ZTsKKwkJCXB4QmxvY2tUb0luc2VydC0+cHhOZXh0RnJlZUJsb2NrID0gcHhJdGVyYXRvci0+cHhOZXh0RnJlZUJsb2NrLT5weE5leHRGcmVlQmxvY2s7CisJCX0KKwkJZWxzZQorCQl7CisJCQlweEJsb2NrVG9JbnNlcnQtPnB4TmV4dEZyZWVCbG9jayA9IHB4RW5kOworCQl9CisJfQorCWVsc2UKKwl7CisJCXB4QmxvY2tUb0luc2VydC0+cHhOZXh0RnJlZUJsb2NrID0gcHhJdGVyYXRvci0+cHhOZXh0RnJlZUJsb2NrOworCX0KKworCS8qIElmIHRoZSBibG9jayBiZWluZyBpbnNlcnRlZCBwbHVnZ2VkIGEgZ2FiLCBzbyB3YXMgbWVyZ2VkIHdpdGggdGhlIGJsb2NrCisJICogYmVmb3JlIGFuZCB0aGUgYmxvY2sgYWZ0ZXIsIHRoZW4gaXQncyBweE5leHRGcmVlQmxvY2sgcG9pbnRlciB3aWxsIGhhdmUKKwkgKiBhbHJlYWR5IGJlZW4gc2V0LCBhbmQgc2hvdWxkIG5vdCBiZSBzZXQgaGVyZSBhcyB0aGF0IHdvdWxkIG1ha2UgaXQgcG9pbnQKKwkgKiB0byBpdHNlbGYuICovCisJaWYoIHB4SXRlcmF0b3IgIT0gcHhCbG9ja1RvSW5zZXJ0ICkKKwl7CisJCXB4SXRlcmF0b3ItPnB4TmV4dEZyZWVCbG9jayA9IHB4QmxvY2tUb0luc2VydDsKKwl9CisJZWxzZQorCXsKKwkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCX0KK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkICpwdlBvcnRNYWxsb2MoIHNpemVfdCB4V2FudGVkU2l6ZSApCit7CitCbG9ja0xpbmtfdCAqcHhCbG9jaywgKnB4UHJldmlvdXNCbG9jaywgKnB4TmV3QmxvY2tMaW5rOwordm9pZCAqcHZSZXR1cm4gPSBOVUxMOworCisJLyogSWYgdGhpcyBpcyB0aGUgZmlyc3QgY2FsbCB0byBtYWxsb2MgdGhlbiB0aGUgaGVhcCB3aWxsIHJlcXVpcmUKKwkgKiBpbml0aWFsaXNhdGlvbiB0byBzZXR1cCB0aGUgbGlzdCBvZiBmcmVlIGJsb2Nrcy4gKi8KKwlpZiggcHhFbmQgPT0gTlVMTCApCisJeworCQlwcnZIZWFwSW5pdCgpOworCX0KKwllbHNlCisJeworCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJfQorCisJLyogQ2hlY2sgdGhlIHJlcXVlc3RlZCBibG9jayBzaXplIGlzIG5vdCBzbyBsYXJnZSB0aGF0IHRoZSB0b3AgYml0IGlzIHNldC4KKwkgKiBUaGUgdG9wIGJpdCBvZiB0aGUgYmxvY2sgc2l6ZSBtZW1iZXIgb2YgdGhlIEJsb2NrTGlua190IHN0cnVjdHVyZSBpcyB1c2VkCisJICogdG8gZGV0ZXJtaW5lIHdobyBvd25zIHRoZSBibG9jayAtIHRoZSBhcHBsaWNhdGlvbiBvciB0aGUga2VybmVsLCBzbyBpdAorCSAqIG11c3QgYmUgZnJlZS4gKi8KKwlpZiggKCB4V2FudGVkU2l6ZSAmIHhCbG9ja0FsbG9jYXRlZEJpdCApID09IDAgKQorCXsKKwkJLyogVGhlIHdhbnRlZCBzaXplIGlzIGluY3JlYXNlZCBzbyBpdCBjYW4gY29udGFpbiBhIEJsb2NrTGlua190CisJCSAqIHN0cnVjdHVyZSBpbiBhZGRpdGlvbiB0byB0aGUgcmVxdWVzdGVkIGFtb3VudCBvZiBieXRlcy4gKi8KKwkJaWYoIHhXYW50ZWRTaXplID4gMCApCisJCXsKKwkJCXhXYW50ZWRTaXplICs9IHhIZWFwU3RydWN0U2l6ZTsKKworCQkJLyogRW5zdXJlIHRoYXQgYmxvY2tzIGFyZSBhbHdheXMgYWxpZ25lZCB0byB0aGUgcmVxdWlyZWQgbnVtYmVyIG9mCisJCQkgKiBieXRlcy4gKi8KKwkJCWlmKCAoIHhXYW50ZWRTaXplICYgc2VjdXJlcG9ydEJZVEVfQUxJR05NRU5UX01BU0sgKSAhPSAweDAwICkKKwkJCXsKKwkJCQkvKiBCeXRlIGFsaWdubWVudCByZXF1aXJlZC4gKi8KKwkJCQl4V2FudGVkU2l6ZSArPSAoIHNlY3VyZXBvcnRCWVRFX0FMSUdOTUVOVCAtICggeFdhbnRlZFNpemUgJiBzZWN1cmVwb3J0QllURV9BTElHTk1FTlRfTUFTSyApICk7CisJCQkJc2VjdXJlcG9ydEFTU0VSVCggKCB4V2FudGVkU2l6ZSAmIHNlY3VyZXBvcnRCWVRFX0FMSUdOTUVOVF9NQVNLICkgPT0gMCApOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJfQorCisJCWlmKCAoIHhXYW50ZWRTaXplID4gMCApICYmICggeFdhbnRlZFNpemUgPD0geEZyZWVCeXRlc1JlbWFpbmluZyApICkKKwkJeworCQkJLyogVHJhdmVyc2UgdGhlIGxpc3QgZnJvbSB0aGUgc3RhcnQgKGxvd2VzdCBhZGRyZXNzKSBibG9jayB1bnRpbAorCQkJICogb25lIG9mIGFkZXF1YXRlIHNpemUgaXMgZm91bmQuICovCisJCQlweFByZXZpb3VzQmxvY2sgPSAmeFN0YXJ0OworCQkJcHhCbG9jayA9IHhTdGFydC5weE5leHRGcmVlQmxvY2s7CisJCQl3aGlsZSggKCBweEJsb2NrLT54QmxvY2tTaXplIDwgeFdhbnRlZFNpemUgKSAmJiAoIHB4QmxvY2stPnB4TmV4dEZyZWVCbG9jayAhPSBOVUxMICkgKQorCQkJeworCQkJCXB4UHJldmlvdXNCbG9jayA9IHB4QmxvY2s7CisJCQkJcHhCbG9jayA9IHB4QmxvY2stPnB4TmV4dEZyZWVCbG9jazsKKwkJCX0KKworCQkJLyogSWYgdGhlIGVuZCBtYXJrZXIgd2FzIHJlYWNoZWQgdGhlbiBhIGJsb2NrIG9mIGFkZXF1YXRlIHNpemUgd2FzCisJCQkgKiBub3QgZm91bmQuICovCisJCQlpZiggcHhCbG9jayAhPSBweEVuZCApCisJCQl7CisJCQkJLyogUmV0dXJuIHRoZSBtZW1vcnkgc3BhY2UgcG9pbnRlZCB0byAtIGp1bXBpbmcgb3ZlciB0aGUKKwkJCQkgKiBCbG9ja0xpbmtfdCBzdHJ1Y3R1cmUgYXQgaXRzIHN0YXJ0LiAqLworCQkJCXB2UmV0dXJuID0gKCB2b2lkICogKSAoICggKCB1aW50OF90ICogKSBweFByZXZpb3VzQmxvY2stPnB4TmV4dEZyZWVCbG9jayApICsgeEhlYXBTdHJ1Y3RTaXplICk7CisKKwkJCQkvKiBUaGlzIGJsb2NrIGlzIGJlaW5nIHJldHVybmVkIGZvciB1c2Ugc28gbXVzdCBiZSB0YWtlbiBvdXQKKwkJCQkgKiBvZiB0aGUgbGlzdCBvZiBmcmVlIGJsb2Nrcy4gKi8KKwkJCQlweFByZXZpb3VzQmxvY2stPnB4TmV4dEZyZWVCbG9jayA9IHB4QmxvY2stPnB4TmV4dEZyZWVCbG9jazsKKworCQkJCS8qIElmIHRoZSBibG9jayBpcyBsYXJnZXIgdGhhbiByZXF1aXJlZCBpdCBjYW4gYmUgc3BsaXQgaW50bworCQkJCSAqIHR3by4gKi8KKwkJCQlpZiggKCBweEJsb2NrLT54QmxvY2tTaXplIC0geFdhbnRlZFNpemUgKSA+IHNlY3VyZWhlYXBNSU5JTVVNX0JMT0NLX1NJWkUgKQorCQkJCXsKKwkJCQkJLyogVGhpcyBibG9jayBpcyB0byBiZSBzcGxpdCBpbnRvIHR3by4gIENyZWF0ZSBhIG5ldworCQkJCQkgKiBibG9jayBmb2xsb3dpbmcgdGhlIG51bWJlciBvZiBieXRlcyByZXF1ZXN0ZWQuIFRoZSB2b2lkCisJCQkJCSAqIGNhc3QgaXMgdXNlZCB0byBwcmV2ZW50IGJ5dGUgYWxpZ25tZW50IHdhcm5pbmdzIGZyb20gdGhlCisJCQkJCSAqIGNvbXBpbGVyLiAqLworCQkJCQlweE5ld0Jsb2NrTGluayA9ICggdm9pZCAqICkgKCAoICggdWludDhfdCAqICkgcHhCbG9jayApICsgeFdhbnRlZFNpemUgKTsKKwkJCQkJc2VjdXJlcG9ydEFTU0VSVCggKCAoICggc2l6ZV90ICkgcHhOZXdCbG9ja0xpbmsgKSAmIHNlY3VyZXBvcnRCWVRFX0FMSUdOTUVOVF9NQVNLICkgPT0gMCApOworCisJCQkJCS8qIENhbGN1bGF0ZSB0aGUgc2l6ZXMgb2YgdHdvIGJsb2NrcyBzcGxpdCBmcm9tIHRoZSBzaW5nbGUKKwkJCQkJICogYmxvY2suICovCisJCQkJCXB4TmV3QmxvY2tMaW5rLT54QmxvY2tTaXplID0gcHhCbG9jay0+eEJsb2NrU2l6ZSAtIHhXYW50ZWRTaXplOworCQkJCQlweEJsb2NrLT54QmxvY2tTaXplID0geFdhbnRlZFNpemU7CisKKwkJCQkJLyogSW5zZXJ0IHRoZSBuZXcgYmxvY2sgaW50byB0aGUgbGlzdCBvZiBmcmVlIGJsb2Nrcy4gKi8KKwkJCQkJcHJ2SW5zZXJ0QmxvY2tJbnRvRnJlZUxpc3QoIHB4TmV3QmxvY2tMaW5rICk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJCQl9CisKKwkJCQl4RnJlZUJ5dGVzUmVtYWluaW5nIC09IHB4QmxvY2stPnhCbG9ja1NpemU7CisKKwkJCQlpZiggeEZyZWVCeXRlc1JlbWFpbmluZyA8IHhNaW5pbXVtRXZlckZyZWVCeXRlc1JlbWFpbmluZyApCisJCQkJeworCQkJCQl4TWluaW11bUV2ZXJGcmVlQnl0ZXNSZW1haW5pbmcgPSB4RnJlZUJ5dGVzUmVtYWluaW5nOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCQkJfQorCisJCQkJLyogVGhlIGJsb2NrIGlzIGJlaW5nIHJldHVybmVkIC0gaXQgaXMgYWxsb2NhdGVkIGFuZCBvd25lZCBieQorCQkJCSAqIHRoZSBhcHBsaWNhdGlvbiBhbmQgaGFzIG5vICJuZXh0IiBibG9jay4gKi8KKwkJCQlweEJsb2NrLT54QmxvY2tTaXplIHw9IHhCbG9ja0FsbG9jYXRlZEJpdDsKKwkJCQlweEJsb2NrLT5weE5leHRGcmVlQmxvY2sgPSBOVUxMOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJfQorCX0KKwllbHNlCisJeworCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJfQorCisJdHJhY2VNQUxMT0MoIHB2UmV0dXJuLCB4V2FudGVkU2l6ZSApOworCisJI2lmKCBzZWN1cmVjb25maWdVU0VfTUFMTE9DX0ZBSUxFRF9IT09LID09IDEgKQorCXsKKwkJaWYoIHB2UmV0dXJuID09IE5VTEwgKQorCQl7CisJCQlleHRlcm4gdm9pZCB2QXBwbGljYXRpb25NYWxsb2NGYWlsZWRIb29rKCB2b2lkICk7CisJCQl2QXBwbGljYXRpb25NYWxsb2NGYWlsZWRIb29rKCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCX0KKwl9CisJI2VuZGlmCisKKwlzZWN1cmVwb3J0QVNTRVJUKCAoICggKCBzaXplX3QgKSBwdlJldHVybiApICYgKCBzaXplX3QgKSBzZWN1cmVwb3J0QllURV9BTElHTk1FTlRfTUFTSyApID09IDAgKTsKKwlyZXR1cm4gcHZSZXR1cm47Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCB2UG9ydEZyZWUoIHZvaWQgKnB2ICkKK3sKK3VpbnQ4X3QgKnB1YyA9ICggdWludDhfdCAqICkgcHY7CitCbG9ja0xpbmtfdCAqcHhMaW5rOworCisJaWYoIHB2ICE9IE5VTEwgKQorCXsKKwkJLyogVGhlIG1lbW9yeSBiZWluZyBmcmVlZCB3aWxsIGhhdmUgYW4gQmxvY2tMaW5rX3Qgc3RydWN0dXJlIGltbWVkaWF0ZWx5CisJCSAqIGJlZm9yZSBpdC4gKi8KKwkJcHVjIC09IHhIZWFwU3RydWN0U2l6ZTsKKworCQkvKiBUaGlzIGNhc3RpbmcgaXMgdG8ga2VlcCB0aGUgY29tcGlsZXIgZnJvbSBpc3N1aW5nIHdhcm5pbmdzLiAqLworCQlweExpbmsgPSAoIHZvaWQgKiApIHB1YzsKKworCQkvKiBDaGVjayB0aGUgYmxvY2sgaXMgYWN0dWFsbHkgYWxsb2NhdGVkLiAqLworCQlzZWN1cmVwb3J0QVNTRVJUKCAoIHB4TGluay0+eEJsb2NrU2l6ZSAmIHhCbG9ja0FsbG9jYXRlZEJpdCApICE9IDAgKTsKKwkJc2VjdXJlcG9ydEFTU0VSVCggcHhMaW5rLT5weE5leHRGcmVlQmxvY2sgPT0gTlVMTCApOworCisJCWlmKCAoIHB4TGluay0+eEJsb2NrU2l6ZSAmIHhCbG9ja0FsbG9jYXRlZEJpdCApICE9IDAgKQorCQl7CisJCQlpZiggcHhMaW5rLT5weE5leHRGcmVlQmxvY2sgPT0gTlVMTCApCisJCQl7CisJCQkJLyogVGhlIGJsb2NrIGlzIGJlaW5nIHJldHVybmVkIHRvIHRoZSBoZWFwIC0gaXQgaXMgbm8gbG9uZ2VyCisJCQkJICogYWxsb2NhdGVkLiAqLworCQkJCXB4TGluay0+eEJsb2NrU2l6ZSAmPSB+eEJsb2NrQWxsb2NhdGVkQml0OworCisJCQkJc2VjdXJlcG9ydERJU0FCTEVfTk9OX1NFQ1VSRV9JTlRFUlJVUFRTKCk7CisJCQkJeworCQkJCQkvKiBBZGQgdGhpcyBibG9jayB0byB0aGUgbGlzdCBvZiBmcmVlIGJsb2Nrcy4gKi8KKwkJCQkJeEZyZWVCeXRlc1JlbWFpbmluZyArPSBweExpbmstPnhCbG9ja1NpemU7CisJCQkJCXRyYWNlRlJFRSggcHYsIHB4TGluay0+eEJsb2NrU2l6ZSApOworCQkJCQlwcnZJbnNlcnRCbG9ja0ludG9GcmVlTGlzdCggKCAoIEJsb2NrTGlua190ICogKSBweExpbmsgKSApOworCQkJCX0KKwkJCQlzZWN1cmVwb3J0RU5BQkxFX05PTl9TRUNVUkVfSU5URVJSVVBUUygpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJfQorCX0KK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzaXplX3QgeFBvcnRHZXRGcmVlSGVhcFNpemUoIHZvaWQgKQoreworCXJldHVybiB4RnJlZUJ5dGVzUmVtYWluaW5nOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3NpemVfdCB4UG9ydEdldE1pbmltdW1FdmVyRnJlZUhlYXBTaXplKCB2b2lkICkKK3sKKwlyZXR1cm4geE1pbmltdW1FdmVyRnJlZUJ5dGVzUmVtYWluaW5nOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgdlBvcnRJbml0aWFsaXNlQmxvY2tzKCB2b2lkICkKK3sKKwkvKiBUaGlzIGp1c3QgZXhpc3RzIHRvIGtlZXAgdGhlIGxpbmtlciBxdWlldC4gKi8KK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpkaWZmIC0tZ2l0IGEvU291cmNlL3BvcnRhYmxlL0dDQy9BUk1fQ00zMy9zZWN1cmUvc2VjdXJlX2hlYXAuaCBiL1NvdXJjZS9wb3J0YWJsZS9HQ0MvQVJNX0NNMzMvc2VjdXJlL3NlY3VyZV9oZWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjllNGYyYQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9wb3J0YWJsZS9HQ0MvQVJNX0NNMzMvc2VjdXJlL3NlY3VyZV9oZWFwLmgKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMi4xCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgorICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KKyAqIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KKyAqIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mCisgKiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCisgKiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKKyAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTCisgKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IKKyAqIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUgorICogSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogaHR0cDovL3d3dy5GcmVlUlRPUy5vcmcKKyAqIGh0dHA6Ly9hd3MuYW1hem9uLmNvbS9mcmVlcnRvcworICoKKyAqIDEgdGFiID09IDQgc3BhY2VzIQorICovCisKKyNpZm5kZWYgX19TRUNVUkVfSEVBUF9IX18KKyNkZWZpbmUgX19TRUNVUkVfSEVBUF9IX18KKworLyogU3RhbmRhcmQgaW5jbHVkZXMuICovCisjaW5jbHVkZSA8c3RkbGliLmg+CisKKy8qKgorICogQGJyaWVmIEFsbG9jYXRlcyBtZW1vcnkgZnJvbSBoZWFwLgorICoKKyAqIEBwYXJhbVtpbl0geFdhbnRlZFNpemUgVGhlIHNpemUgb2YgdGhlIG1lbW9yeSB0byBiZSBhbGxvY2F0ZWQuCisgKgorICogQHJldHVybiBQb2ludGVyIHRvIHRoZSBtZW1vcnkgcmVnaW9uIGlmIHRoZSBhbGxvY2F0aW9uIGlzIHN1Y2Nlc3NmdWwsIE5VTEwKKyAqIG90aGVyd2lzZS4KKyAqLwordm9pZCAqcHZQb3J0TWFsbG9jKCBzaXplX3QgeFdhbnRlZFNpemUgKTsKKworLyoqCisgKiBAYnJpZWYgRnJlZXMgdGhlIHByZXZpb3VzbHkgYWxsb2NhdGVkIG1lbW9yeS4KKyAqCisgKiBAcGFyYW1baW5dIHB2IFBvaW50ZXIgdG8gdGhlIG1lbW9yeSB0byBiZSBmcmVlZC4KKyAqLwordm9pZCB2UG9ydEZyZWUoIHZvaWQgKnB2ICk7CisKKyNlbmRpZiAvKiBfX1NFQ1VSRV9IRUFQX0hfXyAqLwpkaWZmIC0tZ2l0IGEvU291cmNlL3BvcnRhYmxlL0dDQy9BUk1fQ00zMy9zZWN1cmUvc2VjdXJlX2luaXQuYyBiL1NvdXJjZS9wb3J0YWJsZS9HQ0MvQVJNX0NNMzMvc2VjdXJlL3NlY3VyZV9pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY1MjVmNwotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9wb3J0YWJsZS9HQ0MvQVJNX0NNMzMvc2VjdXJlL3NlY3VyZV9pbml0LmMKQEAgLTAsMCArMSwxMDUgQEAKKy8qCisgKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjIuMQorICogQ29weXJpZ2h0IChDKSAyMDE5IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKKyAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCisgKiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCisgKiB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZgorICogdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLAorICogc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCisgKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUworICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SCisgKiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIKKyAqIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIGh0dHA6Ly93d3cuRnJlZVJUT1Mub3JnCisgKiBodHRwOi8vYXdzLmFtYXpvbi5jb20vZnJlZXJ0b3MKKyAqCisgKiAxIHRhYiA9PSA0IHNwYWNlcyEKKyAqLworCisvKiBTdGFuZGFyZCBpbmNsdWRlcy4gKi8KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLyogU2VjdXJlIGluaXQgaW5jbHVkZXMuICovCisjaW5jbHVkZSAic2VjdXJlX2luaXQuaCIKKworLyogU2VjdXJlIHBvcnQgbWFjcm9zLiAqLworI2luY2x1ZGUgInNlY3VyZV9wb3J0X21hY3Jvcy5oIgorCisvKioKKyAqIEBicmllZiBDb25zdGFudHMgcmVxdWlyZWQgdG8gbWFuaXB1bGF0ZSB0aGUgU0NCLgorICovCisjZGVmaW5lIHNlY3VyZWluaXRTQ0JfQUlSQ1IJCQkJCSggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZWQwYyApICAvKiBBcHBsaWNhdGlvbiBJbnRlcnJ1cHQgYW5kIFJlc2V0IENvbnRyb2wgUmVnaXN0ZXIuICovCisjZGVmaW5lIHNlY3VyZWluaXRTQ0JfQUlSQ1JfVkVDVEtFWV9QT1MJCSggMTZVTCApCisjZGVmaW5lIHNlY3VyZWluaXRTQ0JfQUlSQ1JfVkVDVEtFWV9NQVNLCSggMHhGRkZGVUwgPDwgc2VjdXJlaW5pdFNDQl9BSVJDUl9WRUNUS0VZX1BPUyApCisjZGVmaW5lIHNlY3VyZWluaXRTQ0JfQUlSQ1JfUFJJU19QT1MJCSggMTRVTCApCisjZGVmaW5lIHNlY3VyZWluaXRTQ0JfQUlSQ1JfUFJJU19NQVNLCQkoIDFVTCA8PCBzZWN1cmVpbml0U0NCX0FJUkNSX1BSSVNfUE9TICkKKworLyoqCisgKiBAYnJpZWYgQ29uc3RhbnRzIHJlcXVpcmVkIHRvIG1hbmlwdWxhdGUgdGhlIEZQVS4KKyAqLworI2RlZmluZSBzZWN1cmVpbml0RlBDQ1IJCQkJCQkoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVmMzQgKSAgLyogRmxvYXRpbmcgUG9pbnQgQ29udGV4dCBDb250cm9sIFJlZ2lzdGVyLiAqLworI2RlZmluZSBzZWN1cmVpbml0RlBDQ1JfTFNQRU5TX1BPUwkJCSggMjlVTCApCisjZGVmaW5lIHNlY3VyZWluaXRGUENDUl9MU1BFTlNfTUFTSwkJCSggMVVMIDw8IHNlY3VyZWluaXRGUENDUl9MU1BFTlNfUE9TICkKKyNkZWZpbmUgc2VjdXJlaW5pdEZQQ0NSX1RTX1BPUwkJCQkoIDI2VUwgKQorI2RlZmluZSBzZWN1cmVpbml0RlBDQ1JfVFNfTUFTSwkJCQkoIDFVTCA8PCBzZWN1cmVpbml0RlBDQ1JfVFNfUE9TICkKKworI2RlZmluZSBzZWN1cmVpbml0TlNBQ1IJCQkJCQkoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVkOGMgKSAgLyogTm9uLXNlY3VyZSBBY2Nlc3MgQ29udHJvbCBSZWdpc3Rlci4gKi8KKyNkZWZpbmUgc2VjdXJlaW5pdE5TQUNSX0NQMTBfUE9TCQkJKCAxMFVMICkKKyNkZWZpbmUgc2VjdXJlaW5pdE5TQUNSX0NQMTBfTUFTSwkJCSggMVVMIDw8IHNlY3VyZWluaXROU0FDUl9DUDEwX1BPUyApCisjZGVmaW5lIHNlY3VyZWluaXROU0FDUl9DUDExX1BPUwkJCSggMTFVTCApCisjZGVmaW5lIHNlY3VyZWluaXROU0FDUl9DUDExX01BU0sJCQkoIDFVTCA8PCBzZWN1cmVpbml0TlNBQ1JfQ1AxMV9QT1MgKQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3NlY3VyZXBvcnROT05fU0VDVVJFX0NBTExBQkxFIHZvaWQgU2VjdXJlSW5pdF9EZVByaW9yaXRpemVOU0V4Y2VwdGlvbnMoIHZvaWQgKQoreworCXVpbnQzMl90IHVsSVBTUjsKKworCSAvKiBSZWFkIHRoZSBJbnRlcnJ1cHQgUHJvZ3JhbSBTdGF0dXMgUmVnaXN0ZXIgKElQU1IpIHZhbHVlLiAqLworCXNlY3VyZXBvcnRSRUFEX0lQU1IoIHVsSVBTUiApOworCisJLyogRG8gbm90aGluZyBpZiB0aGUgcHJvY2Vzc29yIGlzIHJ1bm5pbmcgaW4gdGhlIFRocmVhZCBNb2RlLiBJUFNSIGlzIHplcm8KKwkgKiB3aGVuIHRoZSBwcm9jZXNzb3IgaXMgcnVubmluZyBpbiB0aGUgVGhyZWFkIE1vZGUuICovCisJaWYoIHVsSVBTUiAhPSAwICkKKwl7CisJCSooIHNlY3VyZWluaXRTQ0JfQUlSQ1IgKSA9CSggKiggc2VjdXJlaW5pdFNDQl9BSVJDUiApICYgfiggc2VjdXJlaW5pdFNDQl9BSVJDUl9WRUNUS0VZX01BU0sgfCBzZWN1cmVpbml0U0NCX0FJUkNSX1BSSVNfTUFTSyApICkgfAorCQkJCQkJCQkJKCAoIDB4MDVGQVVMIDw8IHNlY3VyZWluaXRTQ0JfQUlSQ1JfVkVDVEtFWV9QT1MgKSAmIHNlY3VyZWluaXRTQ0JfQUlSQ1JfVkVDVEtFWV9NQVNLICkgfAorCQkJCQkJCQkJKCAoIDB4MVVMCTw8IHNlY3VyZWluaXRTQ0JfQUlSQ1JfUFJJU19QT1MgKQkmIHNlY3VyZWluaXRTQ0JfQUlSQ1JfUFJJU19NQVNLICk7CisJfQorfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3NlY3VyZXBvcnROT05fU0VDVVJFX0NBTExBQkxFIHZvaWQgU2VjdXJlSW5pdF9FbmFibGVOU0ZQVUFjY2Vzcyggdm9pZCApCit7CisJdWludDMyX3QgdWxJUFNSOworCisJIC8qIFJlYWQgdGhlIEludGVycnVwdCBQcm9ncmFtIFN0YXR1cyBSZWdpc3RlciAoSVBTUikgdmFsdWUuICovCisJc2VjdXJlcG9ydFJFQURfSVBTUiggdWxJUFNSICk7CisKKwkvKiBEbyBub3RoaW5nIGlmIHRoZSBwcm9jZXNzb3IgaXMgcnVubmluZyBpbiB0aGUgVGhyZWFkIE1vZGUuIElQU1IgaXMgemVybworCSAqIHdoZW4gdGhlIHByb2Nlc3NvciBpcyBydW5uaW5nIGluIHRoZSBUaHJlYWQgTW9kZS4gKi8KKwlpZiggdWxJUFNSICE9IDAgKQorCXsKKwkJLyogQ1AxMCA9IDEgPT0+IE5vbi1zZWN1cmUgYWNjZXNzIHRvIHRoZSBGbG9hdGluZyBQb2ludCBVbml0IGlzCisJCSAqIHBlcm1pdHRlZC4gQ1AxMSBzaG91bGQgYmUgcHJvZ3JhbW1lZCB0byB0aGUgc2FtZSB2YWx1ZSBhcyBDUDEwLiAqLworCQkqKCBzZWN1cmVpbml0TlNBQ1IgKSB8PSAoIHNlY3VyZWluaXROU0FDUl9DUDEwX01BU0sgfCBzZWN1cmVpbml0TlNBQ1JfQ1AxMV9NQVNLICk7CisKKwkJLyogTFNQRU5TID0gMCA9PT4gTFNQRU4gaXMgd3JpdGFibGUgZnJvbiBub24tc2VjdXJlIHN0YXRlLiBUaGlzIGVuc3VyZXMKKwkJICogdGhhdCB3ZSBjYW4gZW5hYmxlL2Rpc2FibGUgbGF6eSBzdGFja2luZyBpbiBwb3J0LmMgZmlsZS4gKi8KKwkJKiggc2VjdXJlaW5pdEZQQ0NSICkgJj0gfiAoIHNlY3VyZWluaXRGUENDUl9MU1BFTlNfTUFTSyApOworCisJCS8qIFRTID0gMSA9PT4gVHJlYXQgRlAgcmVnaXN0ZXJzIGFzIHNlY3VyZSBpLmUuIGNhbGxlZSBzYXZlZCBGUAorCQkgKiByZWdpc3RlcnMgKFMxNi1TMzEpIGFyZSBhbHNvIHB1c2hlZCB0byBzdGFjayBvbiBleGNlcHRpb24gZW50cnkgYW5kCisJCSAqIHJlc3RvcmVkIG9uIGV4Y2VwdGlvbiByZXR1cm4uICovCisJCSooIHNlY3VyZWluaXRGUENDUiApIHw9ICggc2VjdXJlaW5pdEZQQ0NSX1RTX01BU0sgKTsKKwl9Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KZGlmZiAtLWdpdCBhL1NvdXJjZS9wb3J0YWJsZS9HQ0MvQVJNX0NNMzMvc2VjdXJlL3NlY3VyZV9pbml0LmggYi9Tb3VyY2UvcG9ydGFibGUvR0NDL0FSTV9DTTMzL3NlY3VyZS9zZWN1cmVfaW5pdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjNWJjNzEKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvcG9ydGFibGUvR0NDL0FSTV9DTTMzL3NlY3VyZS9zZWN1cmVfaW5pdC5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjIuMQorICogQ29weXJpZ2h0IChDKSAyMDE5IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKKyAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCisgKiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCisgKiB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZgorICogdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLAorICogc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCisgKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUworICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SCisgKiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIKKyAqIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIGh0dHA6Ly93d3cuRnJlZVJUT1Mub3JnCisgKiBodHRwOi8vYXdzLmFtYXpvbi5jb20vZnJlZXJ0b3MKKyAqCisgKiAxIHRhYiA9PSA0IHNwYWNlcyEKKyAqLworCisjaWZuZGVmIF9fU0VDVVJFX0lOSVRfSF9fCisjZGVmaW5lIF9fU0VDVVJFX0lOSVRfSF9fCisKKy8qKgorICogQGJyaWVmIERlLXByaW9yaXRpemVzIHRoZSBub24tc2VjdXJlIGV4Y2VwdGlvbnMuCisgKgorICogVGhpcyBpcyBuZWVkZWQgdG8gZW5zdXJlIHRoYXQgdGhlIG5vbi1zZWN1cmUgUGVuZFNWIHJ1bnMgYXQgdGhlIGxvd2VzdAorICogcHJpb3JpdHkuIENvbnRleHQgc3dpdGNoIGlzIGRvbmUgaW4gdGhlIG5vbi1zZWN1cmUgUGVuZFNWIGhhbmRsZXIuCisgKgorICogQG5vdGUgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBpbiB0aGUgaGFuZGxlciBtb2RlLiBJdCBpcyBuby1vcCBpZiBjYWxsZWQKKyAqIGluIHRoZSB0aHJlYWQgbW9kZS4KKyAqLwordm9pZCBTZWN1cmVJbml0X0RlUHJpb3JpdGl6ZU5TRXhjZXB0aW9ucyggdm9pZCApOworCisvKioKKyAqIEBicmllZiBTZXRzIHVwIHRoZSBGbG9hdGluZyBQb2ludCBVbml0IChGUFUpIGZvciBOb24tU2VjdXJlIGFjY2Vzcy4KKyAqCisgKiBBbHNvIHNldHMgRlBDQ1IuVFM9MSB0byBlbnN1cmUgdGhhdCB0aGUgY29udGVudCBvZiB0aGUgRmxvYXRpbmcgUG9pbnQKKyAqIFJlZ2lzdGVycyBhcmUgbm90IGxlYWtlZCB0byB0aGUgbm9uLXNlY3VyZSBzaWRlLgorICoKKyAqIEBub3RlIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgaW4gdGhlIGhhbmRsZXIgbW9kZS4gSXQgaXMgbm8tb3AgaWYgY2FsbGVkCisgKiBpbiB0aGUgdGhyZWFkIG1vZGUuCisgKi8KK3ZvaWQgU2VjdXJlSW5pdF9FbmFibGVOU0ZQVUFjY2Vzcyggdm9pZCApOworCisjZW5kaWYgLyogX19TRUNVUkVfSU5JVF9IX18gKi8KZGlmZiAtLWdpdCBhL1NvdXJjZS9wb3J0YWJsZS9HQ0MvQVJNX0NNMzMvc2VjdXJlL3NlY3VyZV9wb3J0X21hY3Jvcy5oIGIvU291cmNlL3BvcnRhYmxlL0dDQy9BUk1fQ00zMy9zZWN1cmUvc2VjdXJlX3BvcnRfbWFjcm9zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYwZWRhYgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9wb3J0YWJsZS9HQ0MvQVJNX0NNMzMvc2VjdXJlL3NlY3VyZV9wb3J0X21hY3Jvcy5oCkBAIC0wLDAgKzEsMTMzIEBACisvKgorICogRnJlZVJUT1MgS2VybmVsIFYxMC4yLjEKKyAqIENvcHlyaWdodCAoQykgMjAxOSBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCisgKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgorICogdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bworICogdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YKKyAqIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKKyAqIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAorICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MKKyAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUgorICogQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSCisgKiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBodHRwOi8vd3d3LkZyZWVSVE9TLm9yZworICogaHR0cDovL2F3cy5hbWF6b24uY29tL2ZyZWVydG9zCisgKgorICogMSB0YWIgPT0gNCBzcGFjZXMhCisgKi8KKworI2lmbmRlZiBfX1NFQ1VSRV9QT1JUX01BQ1JPU19IX18KKyNkZWZpbmUgX19TRUNVUkVfUE9SVF9NQUNST1NfSF9fCisKKy8qKgorICogQGJyaWVmIEJ5dGUgYWxpZ25tZW50IHJlcXVpcmVtZW50cy4KKyAqLworI2RlZmluZSBzZWN1cmVwb3J0QllURV9BTElHTk1FTlQJCQkJCTgKKyNkZWZpbmUgc2VjdXJlcG9ydEJZVEVfQUxJR05NRU5UX01BU0sJCQkJKCAweDAwMDcgKQorCisvKioKKyAqIEBicmllZiBNYWNybyB0byBkZWNsYXJlIGEgZnVuY3Rpb24gYXMgbm9uLXNlY3VyZSBjYWxsYWJsZS4KKyAqLworI2lmIGRlZmluZWQoIF9fSUFSX1NZU1RFTVNfSUNDX18gKQorCSNkZWZpbmUgc2VjdXJlcG9ydE5PTl9TRUNVUkVfQ0FMTEFCTEUJCQlfX2Ntc2Vfbm9uc2VjdXJlX2VudHJ5IF9fcm9vdAorI2Vsc2UKKwkjZGVmaW5lIHNlY3VyZXBvcnROT05fU0VDVVJFX0NBTExBQkxFCQkJX19hdHRyaWJ1dGVfXygoY21zZV9ub25zZWN1cmVfZW50cnkpKSBfX2F0dHJpYnV0ZV9fKCh1c2VkKSkKKyNlbmRpZgorCisvKioKKyAqIEBicmllZiBTZXQgdGhlIHNlY3VyZSBQUklNQVNLIHZhbHVlLgorICovCisjZGVmaW5lIHNlY3VyZXBvcnRTRVRfU0VDVVJFX1BSSU1BU0soIHVsUHJpbWFza1ZhbHVlICkgXAorCV9fYXNtIHZvbGF0aWxlICggIm1zciBwcmltYXNrLCAlMCIgOiA6ICJyIiAoIHVsUHJpbWFza1ZhbHVlICkgOiAibWVtb3J5IiApCisKKy8qKgorICogQGJyaWVmIFNldCB0aGUgbm9uLXNlY3VyZSBQUklNQVNLIHZhbHVlLgorICovCisjZGVmaW5lIHNlY3VyZXBvcnRTRVRfTk9OX1NFQ1VSRV9QUklNQVNLKCB1bFByaW1hc2tWYWx1ZSApIFwKKwlfX2FzbSB2b2xhdGlsZSAoICJtc3IgcHJpbWFza19ucywgJTAiIDogOiAiciIgKCB1bFByaW1hc2tWYWx1ZSApIDogIm1lbW9yeSIgKQorCisvKioKKyAqIEBicmllZiBSZWFkIHRoZSBQU1AgdmFsdWUgaW4gdGhlIGdpdmVuIHZhcmlhYmxlLgorICovCisjZGVmaW5lIHNlY3VyZXBvcnRSRUFEX1BTUCggcHVjT3V0Q3VycmVudFN0YWNrUG9pbnRlciApIFwKKwlfX2FzbSB2b2xhdGlsZSAoICJtcnMgJTAsIHBzcCIgIDogIj1yIiAoIHB1Y091dEN1cnJlbnRTdGFja1BvaW50ZXIgKSApCisKKy8qKgorICogQGJyaWVmIFNldCB0aGUgUFNQIHRvIHRoZSBnaXZlbiB2YWx1ZS4KKyAqLworI2RlZmluZSBzZWN1cmVwb3J0U0VUX1BTUCggcHVjQ3VycmVudFN0YWNrUG9pbnRlciApIFwKKwlfX2FzbSB2b2xhdGlsZSAoICJtc3IgcHNwLCAlMCIgOiA6ICJyIiAoIHB1Y0N1cnJlbnRTdGFja1BvaW50ZXIgKSApCisKKy8qKgorICogQGJyaWVmIFNldCB0aGUgUFNQTElNIHRvIHRoZSBnaXZlbiB2YWx1ZS4KKyAqLworI2RlZmluZSBzZWN1cmVwb3J0U0VUX1BTUExJTSggcHVjU3RhY2tMaW1pdCApIFwKKwlfX2FzbSB2b2xhdGlsZSAoICJtc3IgcHNwbGltLCAlMCIgOiA6ICJyIiAoIHB1Y1N0YWNrTGltaXQgKSApCisKKy8qKgorICogQGJyaWVmIFNldCB0aGUgTm9uU2VjdXJlIE1TUCB0byB0aGUgZ2l2ZW4gdmFsdWUuCisgKi8KKyNkZWZpbmUgc2VjdXJlcG9ydFNFVF9NU1BfTlMoIHB1Y01haW5TdGFja1BvaW50ZXIgKSBcCisJX19hc20gdm9sYXRpbGUgKCAibXNyIG1zcF9ucywgJTAiIDogOiAiciIgKCBwdWNNYWluU3RhY2tQb2ludGVyICkgKQorCisvKioKKyAqIEBicmllZiBTZXQgdGhlIENPTlRST0wgcmVnaXN0ZXIgdG8gdGhlIGdpdmVuIHZhbHVlLgorICovCisjZGVmaW5lIHNlY3VyZXBvcnRTRVRfQ09OVFJPTCggdWxDb250cm9sICkgXAorCV9fYXNtIHZvbGF0aWxlICggIm1zciBjb250cm9sLCAlMCIgOiA6ICJyIiAoIHVsQ29udHJvbCApIDogIm1lbW9yeSIgKQorCisvKioKKyAqIEBicmllZiBSZWFkIHRoZSBJbnRlcnJ1cHQgUHJvZ3JhbSBTdGF0dXMgUmVnaXN0ZXIgKElQU1IpIHZhbHVlIGluIHRoZSBnaXZlbgorICogdmFyaWFibGUuCisgKi8KKyNkZWZpbmUgc2VjdXJlcG9ydFJFQURfSVBTUiggdWxJUFNSICkgXAorCV9fYXNtIHZvbGF0aWxlICggIm1ycyAlMCwgaXBzciIgIDogIj1yIiAoIHVsSVBTUiApICkKKworLyoqCisgKiBAYnJpZWYgUFJJTUFTSyB2YWx1ZSB0byBlbmFibGUgaW50ZXJydXB0cy4KKyAqLworI2RlZmluZSBzZWN1cmVwb3J0UFJJTUFTS19FTkFCTEVfSU5URVJSVVBUU19WQUwJCTAKKworLyoqCisgKiBAYnJpZWYgUFJJTUFTSyB2YWx1ZSB0byBkaXNhYmxlIGludGVycnVwdHMuCisgKi8KKyNkZWZpbmUgc2VjdXJlcG9ydFBSSU1BU0tfRElTQUJMRV9JTlRFUlJVUFRTX1ZBTAkxCisKKy8qKgorICogQGJyaWVmIERpc2FibGUgc2VjdXJlIGludGVycnVwdHMuCisgKi8KKyNkZWZpbmUgc2VjdXJlcG9ydERJU0FCTEVfU0VDVVJFX0lOVEVSUlVQVFMoKQkJc2VjdXJlcG9ydFNFVF9TRUNVUkVfUFJJTUFTSyggc2VjdXJlcG9ydFBSSU1BU0tfRElTQUJMRV9JTlRFUlJVUFRTX1ZBTCApCisKKy8qKgorICogQGJyaWVmIERpc2FibGUgbm9uLXNlY3VyZSBpbnRlcnJ1cHRzLgorICoKKyAqIFRoaXMgZWZmZWN0aXZlbHkgZGlzYWJsZXMgY29udGV4dCBzd2l0Y2hlcy4KKyAqLworI2RlZmluZSBzZWN1cmVwb3J0RElTQUJMRV9OT05fU0VDVVJFX0lOVEVSUlVQVFMoKQlzZWN1cmVwb3J0U0VUX05PTl9TRUNVUkVfUFJJTUFTSyggc2VjdXJlcG9ydFBSSU1BU0tfRElTQUJMRV9JTlRFUlJVUFRTX1ZBTCApCisKKy8qKgorICogQGJyaWVmIEVuYWJsZSBub24tc2VjdXJlIGludGVycnVwdHMuCisgKi8KKyNkZWZpbmUgc2VjdXJlcG9ydEVOQUJMRV9OT05fU0VDVVJFX0lOVEVSUlVQVFMoKQlzZWN1cmVwb3J0U0VUX05PTl9TRUNVUkVfUFJJTUFTSyggc2VjdXJlcG9ydFBSSU1BU0tfRU5BQkxFX0lOVEVSUlVQVFNfVkFMICkKKworLyoqCisgKiBAYnJpZWYgQXNzZXJ0IGRlZmluaXRpb24uCisgKi8KKyNkZWZpbmUgc2VjdXJlcG9ydEFTU0VSVCggeCApCQkJCQkJXAorCWlmKCAoIHggKSA9PSAwICkJCQkJCQkJCVwKKwl7CQkJCQkJCQkJCQkJXAorCQlzZWN1cmVwb3J0RElTQUJMRV9TRUNVUkVfSU5URVJSVVBUUygpOwkJXAorCQlzZWN1cmVwb3J0RElTQUJMRV9OT05fU0VDVVJFX0lOVEVSUlVQVFMoKTsJXAorCQlmb3IoIDs7ICk7CQkJCQkJCQkJXAorCX0KKworI2VuZGlmIC8qIF9fU0VDVVJFX1BPUlRfTUFDUk9TX0hfXyAqLwpkaWZmIC0tZ2l0IGEvU291cmNlL3BvcnRhYmxlL0dDQy9BUk1fQ00zM19OVFovbm9uX3NlY3VyZS9wb3J0LmMgYi9Tb3VyY2UvcG9ydGFibGUvR0NDL0FSTV9DTTMzX05UWi9ub25fc2VjdXJlL3BvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDg1YTZmCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL3BvcnRhYmxlL0dDQy9BUk1fQ00zM19OVFovbm9uX3NlY3VyZS9wb3J0LmMKQEAgLTAsMCArMSw4OTkgQEAKKy8qCisgKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjIuMQorICogQ29weXJpZ2h0IChDKSAyMDE5IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKKyAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCisgKiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCisgKiB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZgorICogdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLAorICogc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCisgKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUworICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SCisgKiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIKKyAqIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIGh0dHA6Ly93d3cuRnJlZVJUT1Mub3JnCisgKiBodHRwOi8vYXdzLmFtYXpvbi5jb20vZnJlZXJ0b3MKKyAqCisgKiAxIHRhYiA9PSA0IHNwYWNlcyEKKyAqLworCisvKiBEZWZpbmluZyBNUFVfV1JBUFBFUlNfSU5DTFVERURfRlJPTV9BUElfRklMRSBwcmV2ZW50cyB0YXNrLmggZnJvbSByZWRlZmluaW5nCisgKiBhbGwgdGhlIEFQSSBmdW5jdGlvbnMgdG8gdXNlIHRoZSBNUFUgd3JhcHBlcnMuIFRoYXQgc2hvdWxkIG9ubHkgYmUgZG9uZSB3aGVuCisgKiB0YXNrLmggaXMgaW5jbHVkZWQgZnJvbSBhbiBhcHBsaWNhdGlvbiBmaWxlLiAqLworI2RlZmluZSBNUFVfV1JBUFBFUlNfSU5DTFVERURfRlJPTV9BUElfRklMRQorCisvKiBTY2hlZHVsZXIgaW5jbHVkZXMuICovCisjaW5jbHVkZSAiRnJlZVJUT1MuaCIKKyNpbmNsdWRlICJ0YXNrLmgiCisKKy8qIE1QVSB3cmFwcGVycyBpbmNsdWRlcy4gKi8KKyNpbmNsdWRlICJtcHVfd3JhcHBlcnMuaCIKKworLyogUG9ydGFzbSBpbmNsdWRlcy4gKi8KKyNpbmNsdWRlICJwb3J0YXNtLmgiCisKKyNpZiggY29uZmlnRU5BQkxFX1RSVVNUWk9ORSA9PSAxICkKKwkvKiBTZWN1cmUgY29tcG9uZW50cyBpbmNsdWRlcy4gKi8KKwkjaW5jbHVkZSAic2VjdXJlX2NvbnRleHQuaCIKKwkjaW5jbHVkZSAic2VjdXJlX2luaXQuaCIKKyNlbmRpZiAvKiBjb25maWdFTkFCTEVfVFJVU1RaT05FICovCisKKyN1bmRlZiBNUFVfV1JBUFBFUlNfSU5DTFVERURfRlJPTV9BUElfRklMRQorCisvKioKKyAqIFRoZSBGcmVlUlRPUyBDb3J0ZXggTTMzIHBvcnQgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gcnVuIG9uIHRoZSBTZWN1cmUgU2lkZSBvbmx5CisgKiBpLmUuIHRoZSBwcm9jZXNzb3IgYm9vdHMgYXMgc2VjdXJlIGFuZCBuZXZlciBqdW1wcyB0byB0aGUgbm9uLXNlY3VyZSBzaWRlLgorICogVGhlIFRydXN0IFpvbmUgc3VwcG9ydCBpbiB0aGUgcG9ydCBtdXN0IGJlIGRpc2FibGVkIGluIG9yZGVyIHRvIHJ1biBGcmVlUlRPUworICogb24gdGhlIHNlY3VyZSBzaWRlLiBUaGUgZm9sbG93aW5nIGFyZSB0aGUgdmFsaWQgY29uZmlndXJhdGlvbiBzZWV0aW5nczoKKyAqCisgKiAxLiBSdW4gRnJlZVJUT1Mgb24gdGhlIFNlY3VyZSBTaWRlOgorICoJCWNvbmZpZ1JVTl9GUkVFUlRPU19TRUNVUkVfT05MWSA9IDEgYW5kIGNvbmZpZ0VOQUJMRV9UUlVTVFpPTkUgPSAwCisgKgorICogMi4gUnVuIEZyZWVSVE9TIG9uIHRoZSBOb24tU2VjdXJlIFNpZGUgd2l0aCBTZWN1cmUgU2lkZSBmdW5jdGlvbiBjYWxsIHN1cHBvcnQ6CisgKgkJY29uZmlnUlVOX0ZSRUVSVE9TX1NFQ1VSRV9PTkxZID0gMCBhbmQgY29uZmlnRU5BQkxFX1RSVVNUWk9ORSA9IDEKKyAqCisgKiAzLiBSdW4gRnJlZVJUT1Mgb24gdGhlIE5vbi1TZWN1cmUgU2lkZSBvbmx5IGkuZS4gbm8gU2VjdXJlIFNpZGUgZnVuY3Rpb24gY2FsbCBzdXBwb3J0OgorICoJCWNvbmZpZ1JVTl9GUkVFUlRPU19TRUNVUkVfT05MWSA9IDAgYW5kIGNvbmZpZ0VOQUJMRV9UUlVTVFpPTkUgPSAwCisgKi8KKyNpZiggKCBjb25maWdSVU5fRlJFRVJUT1NfU0VDVVJFX09OTFkgPT0gMSApICYmICggY29uZmlnRU5BQkxFX1RSVVNUWk9ORSA9PSAxICkgKQorCSNlcnJvciBUcnVzdFpvbmUgbmVlZHMgdG8gYmUgZGlzYWJsZWQgaW4gb3JkZXIgdG8gcnVuIEZyZWVSVE9TIG9uIHRoZSBTZWN1cmUgU2lkZS4KKyNlbmRpZgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKgorICogQGJyaWVmIENvbnN0YW50cyByZXF1aXJlZCB0byBtYW5pcHVsYXRlIHRoZSBOVklDLgorICovCisjZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfQ1RSTAkJCQkoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGUwMTAgKQorI2RlZmluZSBwb3J0TlZJQ19TWVNUSUNLX0xPQUQJCQkJKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlMDE0ICkKKyNkZWZpbmUgcG9ydE5WSUNfU1lTVElDS19DVVJSRU5UX1ZBTFVFCQkoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGUwMTggKQorI2RlZmluZSBwb3J0TlZJQ19JTlRfQ1RSTAkJCQkJKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZDA0ICkKKyNkZWZpbmUgcG9ydE5WSUNfU1lTUFJJMgkJCQkJKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZDIwICkKKyNkZWZpbmUgcG9ydE5WSUNfU1lTVElDS19DTEsJCQkJKCAweDAwMDAwMDA0ICkKKyNkZWZpbmUgcG9ydE5WSUNfU1lTVElDS19JTlQJCQkJKCAweDAwMDAwMDAyICkKKyNkZWZpbmUgcG9ydE5WSUNfU1lTVElDS19FTkFCTEUJCQkJKCAweDAwMDAwMDAxICkKKyNkZWZpbmUgcG9ydE5WSUNfUEVORFNWU0VUCQkJCQkoIDB4MTAwMDAwMDAgKQorI2RlZmluZSBwb3J0TUlOX0lOVEVSUlVQVF9QUklPUklUWQkJCSggMjU1VUwgKQorI2RlZmluZSBwb3J0TlZJQ19QRU5EU1ZfUFJJCQkJCQkoIHBvcnRNSU5fSU5URVJSVVBUX1BSSU9SSVRZIDw8IDE2VUwgKQorI2RlZmluZSBwb3J0TlZJQ19TWVNUSUNLX1BSSQkJCQkoIHBvcnRNSU5fSU5URVJSVVBUX1BSSU9SSVRZIDw8IDI0VUwgKQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKgorICogQGJyaWVmIENvbnN0YW50cyByZXF1aXJlZCB0byBtYW5pcHVsYXRlIHRoZSBTQ0IuCisgKi8KKyNkZWZpbmUgcG9ydFNDQl9TWVNfSEFORExFUl9DVFJMX1NUQVRFX1JFRwkoICogKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZWQyNCApCisjZGVmaW5lIHBvcnRTQ0JfTUVNX0ZBVUxUX0VOQUJMRQkJCSggMVVMIDw8IDE2VUwgKQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKgorICogQGJyaWVmIENvbnN0YW50cyByZXF1aXJlZCB0byBtYW5pcHVsYXRlIHRoZSBGUFUuCisgKi8KKyNkZWZpbmUgcG9ydENQQUNSCQkJCQkJCSggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZWQ4OCApCS8qIENvcHJvY2Vzc29yIEFjY2VzcyBDb250cm9sIFJlZ2lzdGVyLiAqLworI2RlZmluZSBwb3J0Q1BBQ1JfQ1AxMF9WQUxVRQkJCQkoIDNVTCApCisjZGVmaW5lIHBvcnRDUEFDUl9DUDExX1ZBTFVFCQkJCXBvcnRDUEFDUl9DUDEwX1ZBTFVFCisjZGVmaW5lIHBvcnRDUEFDUl9DUDEwX1BPUwkJCQkJKCAyMFVMICkKKyNkZWZpbmUgcG9ydENQQUNSX0NQMTFfUE9TCQkJCQkoIDIyVUwgKQorCisjZGVmaW5lIHBvcnRGUENDUgkJCQkJCQkoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVmMzQgKQkvKiBGbG9hdGluZyBQb2ludCBDb250ZXh0IENvbnRyb2wgUmVnaXN0ZXIuICovCisjZGVmaW5lIHBvcnRGUENDUl9BU1BFTl9QT1MJCQkJCSggMzFVTCApCisjZGVmaW5lIHBvcnRGUENDUl9BU1BFTl9NQVNLCQkJCSggMVVMIDw8IHBvcnRGUENDUl9BU1BFTl9QT1MgKQorI2RlZmluZSBwb3J0RlBDQ1JfTFNQRU5fUE9TCQkJCQkoIDMwVUwgKQorI2RlZmluZSBwb3J0RlBDQ1JfTFNQRU5fTUFTSwkJCQkoIDFVTCA8PCBwb3J0RlBDQ1JfTFNQRU5fUE9TICkKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAqIEBicmllZiBDb25zdGFudHMgcmVxdWlyZWQgdG8gbWFuaXB1bGF0ZSB0aGUgTVBVLgorICovCisjZGVmaW5lIHBvcnRNUFVfVFlQRV9SRUcJCQkJCSggKiAoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVkOTAgKSApCisjZGVmaW5lIHBvcnRNUFVfQ1RSTF9SRUcJCQkJCSggKiAoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVkOTQgKSApCisjZGVmaW5lIHBvcnRNUFVfUk5SX1JFRwkJCQkJCSggKiAoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVkOTggKSApCisKKyNkZWZpbmUgcG9ydE1QVV9SQkFSX1JFRwkJCQkJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZWQ5YyApICkKKyNkZWZpbmUgcG9ydE1QVV9STEFSX1JFRwkJCQkJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZWRhMCApICkKKworI2RlZmluZSBwb3J0TVBVX1JCQVJfQTFfUkVHCQkJCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZGE0ICkgKQorI2RlZmluZSBwb3J0TVBVX1JMQVJfQTFfUkVHCQkJCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZGE4ICkgKQorCisjZGVmaW5lIHBvcnRNUFVfUkJBUl9BMl9SRUcJCQkJCSggKiAoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVkYWMgKSApCisjZGVmaW5lIHBvcnRNUFVfUkxBUl9BMl9SRUcJCQkJCSggKiAoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVkYjAgKSApCisKKyNkZWZpbmUgcG9ydE1QVV9SQkFSX0EzX1JFRwkJCQkJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZWRiNCApICkKKyNkZWZpbmUgcG9ydE1QVV9STEFSX0EzX1JFRwkJCQkJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZWRiOCApICkKKworI2RlZmluZSBwb3J0TVBVX01BSVIwX1JFRwkJCQkJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZWRjMCApICkKKyNkZWZpbmUgcG9ydE1QVV9NQUlSMV9SRUcJCQkJCSggKiAoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVkYzQgKSApCisKKyNkZWZpbmUgcG9ydE1QVV9SQkFSX0FERFJFU1NfTUFTSwkJCSggMHhmZmZmZmZlMCApIC8qIE11c3QgYmUgMzItYnl0ZSBhbGlnbmVkLiAqLworI2RlZmluZSBwb3J0TVBVX1JMQVJfQUREUkVTU19NQVNLCQkJKCAweGZmZmZmZmUwICkgLyogTXVzdCBiZSAzMi1ieXRlIGFsaWduZWQuICovCisKKyNkZWZpbmUgcG9ydE1QVV9NQUlSX0FUVFIwX1BPUwkJCQkoIDBVTCApCisjZGVmaW5lIHBvcnRNUFVfTUFJUl9BVFRSMF9NQVNLCQkJCSggMHgwMDAwMDBmZiApCisKKyNkZWZpbmUgcG9ydE1QVV9NQUlSX0FUVFIxX1BPUwkJCQkoIDhVTCApCisjZGVmaW5lIHBvcnRNUFVfTUFJUl9BVFRSMV9NQVNLCQkJCSggMHgwMDAwZmYwMCApCisKKyNkZWZpbmUgcG9ydE1QVV9NQUlSX0FUVFIyX1BPUwkJCQkoIDE2VUwgKQorI2RlZmluZSBwb3J0TVBVX01BSVJfQVRUUjJfTUFTSwkJCQkoIDB4MDBmZjAwMDAgKQorCisjZGVmaW5lIHBvcnRNUFVfTUFJUl9BVFRSM19QT1MJCQkJKCAyNFVMICkKKyNkZWZpbmUgcG9ydE1QVV9NQUlSX0FUVFIzX01BU0sJCQkJKCAweGZmMDAwMDAwICkKKworI2RlZmluZSBwb3J0TVBVX01BSVJfQVRUUjRfUE9TCQkJCSggMFVMICkKKyNkZWZpbmUgcG9ydE1QVV9NQUlSX0FUVFI0X01BU0sJCQkJKCAweDAwMDAwMGZmICkKKworI2RlZmluZSBwb3J0TVBVX01BSVJfQVRUUjVfUE9TCQkJCSggOFVMICkKKyNkZWZpbmUgcG9ydE1QVV9NQUlSX0FUVFI1X01BU0sJCQkJKCAweDAwMDBmZjAwICkKKworI2RlZmluZSBwb3J0TVBVX01BSVJfQVRUUjZfUE9TCQkJCSggMTZVTCApCisjZGVmaW5lIHBvcnRNUFVfTUFJUl9BVFRSNl9NQVNLCQkJCSggMHgwMGZmMDAwMCApCisKKyNkZWZpbmUgcG9ydE1QVV9NQUlSX0FUVFI3X1BPUwkJCQkoIDI0VUwgKQorI2RlZmluZSBwb3J0TVBVX01BSVJfQVRUUjdfTUFTSwkJCQkoIDB4ZmYwMDAwMDAgKQorCisjZGVmaW5lIHBvcnRNUFVfUkxBUl9BVFRSX0lOREVYMAkJCSggMFVMIDw8IDFVTCApCisjZGVmaW5lIHBvcnRNUFVfUkxBUl9BVFRSX0lOREVYMQkJCSggMVVMIDw8IDFVTCApCisjZGVmaW5lIHBvcnRNUFVfUkxBUl9BVFRSX0lOREVYMgkJCSggMlVMIDw8IDFVTCApCisjZGVmaW5lIHBvcnRNUFVfUkxBUl9BVFRSX0lOREVYMwkJCSggM1VMIDw8IDFVTCApCisjZGVmaW5lIHBvcnRNUFVfUkxBUl9BVFRSX0lOREVYNAkJCSggNFVMIDw8IDFVTCApCisjZGVmaW5lIHBvcnRNUFVfUkxBUl9BVFRSX0lOREVYNQkJCSggNVVMIDw8IDFVTCApCisjZGVmaW5lIHBvcnRNUFVfUkxBUl9BVFRSX0lOREVYNgkJCSggNlVMIDw8IDFVTCApCisjZGVmaW5lIHBvcnRNUFVfUkxBUl9BVFRSX0lOREVYNwkJCSggN1VMIDw8IDFVTCApCisKKyNkZWZpbmUgcG9ydE1QVV9STEFSX1JFR0lPTl9FTkFCTEUJCQkoIDFVTCApCisKKy8qIEVuYWJsZSBwcml2aWxlZ2VkIGFjY2VzcyB0byB1bm1hcHBlZCByZWdpb24uICovCisjZGVmaW5lIHBvcnRNUFVfUFJJVl9CQUNLR1JPVU5EX0VOQUJMRQkJKCAxVUwgPDwgMlVMICkKKworLyogRW5hYmxlIE1QVS4gKi8KKyNkZWZpbmUgcG9ydE1QVV9FTkFCTEUJCQkJCQkoIDFVTCA8PCAwVUwgKQorCisvKiBFeHBlY3RlZCB2YWx1ZSBvZiB0aGUgcG9ydE1QVV9UWVBFIHJlZ2lzdGVyLiAqLworI2RlZmluZSBwb3J0RVhQRUNURURfTVBVX1RZUEVfVkFMVUUJCQkoIDhVTCA8PCA4VUwgKSAvKiA4IHJlZ2lvbnMsIHVuaWZpZWQuICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqCisgKiBAYnJpZWYgQ29uc3RhbnRzIHJlcXVpcmVkIHRvIHNldCB1cCB0aGUgaW5pdGlhbCBzdGFjay4KKyAqLworI2RlZmluZSBwb3J0SU5JVElBTF9YUFNSCQkJCQkoIDB4MDEwMDAwMDAgKQorCisjaWYoIGNvbmZpZ1JVTl9GUkVFUlRPU19TRUNVUkVfT05MWSA9PSAxICkKKwkvKioKKwkgKiBAYnJpZWYgSW5pdGlhbCBFWENfUkVUVVJOIHZhbHVlLgorCSAqCisJICogICAgIEZGICAgICAgICAgRkYgICAgICAgICBGRiAgICAgICAgIEZECisJICogMTExMSAxMTExICAxMTExIDExMTEgIDExMTEgMTExMSAgMTExMSAxMTAxCisJICoKKwkgKiBCaXRbNl0gLSAxIC0tPiBUaGUgZXhjZXB0aW9uIHdhcyB0YWtlbiBmcm9tIHRoZSBTZWN1cmUgc3RhdGUuCisJICogQml0WzVdIC0gMSAtLT4gRG8gbm90IHNraXAgc3RhY2tpbmcgb2YgYWRkaXRpb25hbCBzdGF0ZSBjb250ZXh0LgorCSAqIEJpdFs0XSAtIDEgLS0+IFRoZSBQRSBkaWQgbm90IGFsbG9jYXRlIHNwYWNlIG9uIHRoZSBzdGFjayBmb3IgRlAgY29udGV4dC4KKwkgKiBCaXRbM10gLSAxIC0tPiBSZXR1cm4gdG8gdGhlIFRocmVhZCBtb2RlLgorCSAqIEJpdFsyXSAtIDEgLS0+IFJlc3RvcmUgcmVnaXN0ZXJzIGZyb20gdGhlIHByb2Nlc3Mgc3RhY2suCisJICogQml0WzFdIC0gMCAtLT4gUmVzZXJ2ZWQsIDAuCisJICogQml0WzBdIC0gMSAtLT4gVGhlIGV4Y2VwdGlvbiB3YXMgdGFrZW4gdG8gdGhlIFNlY3VyZSBzdGF0ZS4KKwkgKi8KKwkjZGVmaW5lIHBvcnRJTklUSUFMX0VYQ19SRVRVUk4JCQkoIDB4ZmZmZmZmZmQgKQorI2Vsc2UKKwkvKioKKwkgKiBAYnJpZWYgSW5pdGlhbCBFWENfUkVUVVJOIHZhbHVlLgorCSAqCisJICogICAgIEZGICAgICAgICAgRkYgICAgICAgICBGRiAgICAgICAgIEJDCisJICogMTExMSAxMTExICAxMTExIDExMTEgIDExMTEgMTExMSAgMTAxMSAxMTAwCisJICoKKwkgKiBCaXRbNl0gLSAwIC0tPiBUaGUgZXhjZXB0aW9uIHdhcyB0YWtlbiBmcm9tIHRoZSBOb24tU2VjdXJlIHN0YXRlLgorCSAqIEJpdFs1XSAtIDEgLS0+IERvIG5vdCBza2lwIHN0YWNraW5nIG9mIGFkZGl0aW9uYWwgc3RhdGUgY29udGV4dC4KKwkgKiBCaXRbNF0gLSAxIC0tPiBUaGUgUEUgZGlkIG5vdCBhbGxvY2F0ZSBzcGFjZSBvbiB0aGUgc3RhY2sgZm9yIEZQIGNvbnRleHQuCisJICogQml0WzNdIC0gMSAtLT4gUmV0dXJuIHRvIHRoZSBUaHJlYWQgbW9kZS4KKwkgKiBCaXRbMl0gLSAxIC0tPiBSZXN0b3JlIHJlZ2lzdGVycyBmcm9tIHRoZSBwcm9jZXNzIHN0YWNrLgorCSAqIEJpdFsxXSAtIDAgLS0+IFJlc2VydmVkLCAwLgorCSAqIEJpdFswXSAtIDAgLS0+IFRoZSBleGNlcHRpb24gd2FzIHRha2VuIHRvIHRoZSBOb24tU2VjdXJlIHN0YXRlLgorCSAqLworCSNkZWZpbmUgcG9ydElOSVRJQUxfRVhDX1JFVFVSTgkJCSggMHhmZmZmZmZiYyApCisjZW5kaWYgLyogY29uZmlnUlVOX0ZSRUVSVE9TX1NFQ1VSRV9PTkxZICovCisKKy8qKgorICogQGJyaWVmIENPTlRST0wgcmVnaXN0ZXIgcHJpdmlsZWdlZCBiaXQgbWFzay4KKyAqCisgKiBCaXRbMF0gaW4gQ09OVFJPTCByZWdpc3RlciB0ZWxscyB0aGUgcHJpdmlsZWdlOgorICogIEJpdFswXSA9IDAgPT0+IFRoZSB0YXNrIGlzIHByaXZpbGVnZWQuCisgKiAgQml0WzBdID0gMSA9PT4gVGhlIHRhc2sgaXMgbm90IHByaXZpbGVnZWQuCisgKi8KKyNkZWZpbmUgcG9ydENPTlRST0xfUFJJVklMRUdFRF9NQVNLCQkJKCAxVUwgPDwgMFVMICkKKworLyoqCisgKiBAYnJpZWYgSW5pdGlhbCBDT05UUk9MIHJlZ2lzdGVyIHZhbHVlcy4KKyAqLworI2RlZmluZSBwb3J0SU5JVElBTF9DT05UUk9MX1VOUFJJVklMRUdFRAkoIDB4MyApCisjZGVmaW5lIHBvcnRJTklUSUFMX0NPTlRST0xfUFJJVklMRUdFRAkJKCAweDIgKQorCisvKioKKyAqIEBicmllZiBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHByZS1sb2FkaW5nIG9mIHRoZSBpbml0aWFsIExSIHdpdGggdGhlCisgKiBhZGRyZXNzIG9mIHBydlRhc2tFeGl0RXJyb3IoKSBpbiBjYXNlIGl0IG1lc3NlcyB1cCB1bndpbmRpbmcgb2YgdGhlIHN0YWNrCisgKiBpbiB0aGUgZGVidWdnZXIuCisgKi8KKyNpZmRlZiBjb25maWdUQVNLX1JFVFVSTl9BRERSRVNTCisJI2RlZmluZSBwb3J0VEFTS19SRVRVUk5fQUREUkVTUwkJCWNvbmZpZ1RBU0tfUkVUVVJOX0FERFJFU1MKKyNlbHNlCisJI2RlZmluZSBwb3J0VEFTS19SRVRVUk5fQUREUkVTUwkJCXBydlRhc2tFeGl0RXJyb3IKKyNlbmRpZgorCisvKioKKyAqIEBicmllZiBJZiBwb3J0UFJFTE9BRF9SRUdJU1RFUlMgdGhlbiByZWdpc3RlcnMgd2lsbCBiZSBnaXZlbiBhbiBpbml0aWFsIHZhbHVlCisgKiB3aGVuIGEgdGFzayBpcyBjcmVhdGVkLiBUaGlzIGhlbHBzIGluIGRlYnVnZ2luZyBhdCB0aGUgY29zdCBvZiBjb2RlIHNpemUuCisgKi8KKyNkZWZpbmUgcG9ydFBSRUxPQURfUkVHSVNURVJTCQkJCTEKKworLyoqCisgKiBAYnJpZWYgQSB0YXNrIGlzIGNyZWF0ZWQgd2l0aG91dCBhIHNlY3VyZSBjb250ZXh0LCBhbmQgbXVzdCBjYWxsCisgKiBwb3J0QUxMT0NBVEVfU0VDVVJFX0NPTlRFWFQoKSB0byBnaXZlIGl0c2VsZiBhIHNlY3VyZSBjb250ZXh0IGJlZm9yZSBpdCBtYWtlcworICogYW55IHNlY3VyZSBjYWxscy4KKyAqLworI2RlZmluZSBwb3J0Tk9fU0VDVVJFX0NPTlRFWFQJCQkJMAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKgorICogQGJyaWVmIFNldHVwIHRoZSB0aW1lciB0byBnZW5lcmF0ZSB0aGUgdGljayBpbnRlcnJ1cHRzLgorICovCitzdGF0aWMgdm9pZCBwcnZTZXR1cFRpbWVySW50ZXJydXB0KCB2b2lkICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworLyoqCisgKiBAYnJpZWYgVXNlZCB0byBjYXRjaCB0YXNrcyB0aGF0IGF0dGVtcHQgdG8gcmV0dXJuIGZyb20gdGhlaXIgaW1wbGVtZW50aW5nCisgKiBmdW5jdGlvbi4KKyAqLworc3RhdGljIHZvaWQgcHJ2VGFza0V4aXRFcnJvciggdm9pZCApOworCisjaWYoIGNvbmZpZ0VOQUJMRV9NUFUgPT0gMSApCisJLyoqCisJICogQGJyaWVmIFNldHVwIHRoZSBNZW1vcnkgUHJvdGVjdGlvbiBVbml0IChNUFUpLgorCSAqLworCXN0YXRpYyB2b2lkIHBydlNldHVwTVBVKCB2b2lkICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKyNlbmRpZiAvKiBjb25maWdFTkFCTEVfTVBVICovCisKKyNpZiggY29uZmlnRU5BQkxFX0ZQVSA9PSAxICkKKwkvKioKKwkgKiBAYnJpZWYgU2V0dXAgdGhlIEZsb2F0aW5nIFBvaW50IFVuaXQgKEZQVSkuCisJICovCisJc3RhdGljIHZvaWQgcHJ2U2V0dXBGUFUoIHZvaWQgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9GUFUgKi8KKworLyoqCisgKiBAYnJpZWYgWWllbGQgdGhlIHByb2Nlc3Nvci4KKyAqLwordm9pZCB2UG9ydFlpZWxkKCB2b2lkICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworLyoqCisgKiBAYnJpZWYgRW50ZXIgY3JpdGljYWwgc2VjdGlvbi4KKyAqLwordm9pZCB2UG9ydEVudGVyQ3JpdGljYWwoIHZvaWQgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisvKioKKyAqIEBicmllZiBFeGl0IGZyb20gY3JpdGljYWwgc2VjdGlvbi4KKyAqLwordm9pZCB2UG9ydEV4aXRDcml0aWNhbCggdm9pZCApIFBSSVZJTEVHRURfRlVOQ1RJT047CisKKy8qKgorICogQGJyaWVmIFN5c1RpY2sgaGFuZGxlci4KKyAqLwordm9pZCBTeXNUaWNrX0hhbmRsZXIoIHZvaWQgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisvKioKKyAqIEBicmllZiBDIHBhcnQgb2YgU1ZDIGhhbmRsZXIuCisgKi8KK3BvcnRET05UX0RJU0NBUkQgdm9pZCB2UG9ydFNWQ0hhbmRsZXJfQyggdWludDMyX3QgKnB1bENhbGxlclN0YWNrQWRkcmVzcyApIFBSSVZJTEVHRURfRlVOQ1RJT047CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqCisgKiBAYnJpZWYgRWFjaCB0YXNrIG1haW50YWlucyBpdHMgb3duIGludGVycnVwdCBzdGF0dXMgaW4gdGhlIGNyaXRpY2FsIG5lc3RpbmcKKyAqIHZhcmlhYmxlLgorICovCitzdGF0aWMgdm9sYXRpbGUgdWludDMyX3QgdWxDcml0aWNhbE5lc3RpbmcgPSAweGFhYWFhYWFhVUw7CisKKyNpZiggY29uZmlnRU5BQkxFX1RSVVNUWk9ORSA9PSAxICkKKwkvKioKKwkgKiBAYnJpZWYgU2F2ZWQgYXMgcGFydCBvZiB0aGUgdGFzayBjb250ZXh0IHRvIGluZGljYXRlIHdoaWNoIGNvbnRleHQgdGhlCisJICogdGFzayBpcyB1c2luZyBvbiB0aGUgc2VjdXJlIHNpZGUuCisJICovCisJcG9ydERPTlRfRElTQ0FSRCB2b2xhdGlsZSBTZWN1cmVDb250ZXh0SGFuZGxlX3QgeFNlY3VyZUNvbnRleHQgPSBwb3J0Tk9fU0VDVVJFX0NPTlRFWFQ7CisjZW5kaWYgLyogY29uZmlnRU5BQkxFX1RSVVNUWk9ORSAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB2b2lkIHBydlNldHVwVGltZXJJbnRlcnJ1cHQoIHZvaWQgKSAvKiBQUklWSUxFR0VEX0ZVTkNUSU9OICovCit7CisJLyogU3RvcCBhbmQgcmVzZXQgdGhlIFN5c1RpY2suICovCisJKiggcG9ydE5WSUNfU1lTVElDS19DVFJMICkgPSAwVUw7CisJKiggcG9ydE5WSUNfU1lTVElDS19DVVJSRU5UX1ZBTFVFICkgPSAwVUw7CisKKwkvKiBDb25maWd1cmUgU3lzVGljayB0byBpbnRlcnJ1cHQgYXQgdGhlIHJlcXVlc3RlZCByYXRlLiAqLworCSooIHBvcnROVklDX1NZU1RJQ0tfTE9BRCApID0gKCBjb25maWdDUFVfQ0xPQ0tfSFogLyBjb25maWdUSUNLX1JBVEVfSFogKSAtIDFVTDsKKwkqKCBwb3J0TlZJQ19TWVNUSUNLX0NUUkwgKSA9IHBvcnROVklDX1NZU1RJQ0tfQ0xLIHwgcG9ydE5WSUNfU1lTVElDS19JTlQgfCBwb3J0TlZJQ19TWVNUSUNLX0VOQUJMRTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdm9pZCBwcnZUYXNrRXhpdEVycm9yKCB2b2lkICkKK3sKK3ZvbGF0aWxlIHVpbnQzMl90IHVsRHVtbXkgPSAwVUw7CisKKwkvKiBBIGZ1bmN0aW9uIHRoYXQgaW1wbGVtZW50cyBhIHRhc2sgbXVzdCBub3QgZXhpdCBvciBhdHRlbXB0IHRvIHJldHVybiB0bworCSAqIGl0cyBjYWxsZXIgYXMgdGhlcmUgaXMgbm90aGluZyB0byByZXR1cm4gdG8uIElmIGEgdGFzayB3YW50cyB0byBleGl0IGl0CisJICogc2hvdWxkIGluc3RlYWQgY2FsbCB2VGFza0RlbGV0ZSggTlVMTCApLiBBcnRpZmljaWFsbHkgZm9yY2UgYW4gYXNzZXJ0KCkKKwkgKiB0byBiZSB0cmlnZ2VyZWQgaWYgY29uZmlnQVNTRVJUKCkgaXMgZGVmaW5lZCwgdGhlbiBzdG9wIGhlcmUgc28KKwkgKiBhcHBsaWNhdGlvbiB3cml0ZXJzIGNhbiBjYXRjaCB0aGUgZXJyb3IuICovCisJY29uZmlnQVNTRVJUKCB1bENyaXRpY2FsTmVzdGluZyA9PSB+MFVMICk7CisJcG9ydERJU0FCTEVfSU5URVJSVVBUUygpOworCisJd2hpbGUoIHVsRHVtbXkgPT0gMCApCisJeworCQkvKiBUaGlzIGZpbGUgY2FsbHMgcHJ2VGFza0V4aXRFcnJvcigpIGFmdGVyIHRoZSBzY2hlZHVsZXIgaGFzIGJlZW4KKwkJICogc3RhcnRlZCB0byByZW1vdmUgYSBjb21waWxlciB3YXJuaW5nIGFib3V0IHRoZSBmdW5jdGlvbiBiZWluZworCQkgKiBkZWZpbmVkIGJ1dCBuZXZlciBjYWxsZWQuICB1bER1bW15IGlzIHVzZWQgcHVyZWx5IHRvIHF1aWV0ZW4gb3RoZXIKKwkJICogd2FybmluZ3MgYWJvdXQgY29kZSBhcHBlYXJpbmcgYWZ0ZXIgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgLSBtYWtpbmcKKwkJICogdWxEdW1teSB2b2xhdGlsZSBtYWtlcyB0aGUgY29tcGlsZXIgdGhpbmsgdGhlIGZ1bmN0aW9uIGNvdWxkIHJldHVybgorCQkgKiBhbmQgdGhlcmVmb3JlIG5vdCBvdXRwdXQgYW4gJ3VucmVhY2hhYmxlIGNvZGUnIHdhcm5pbmcgZm9yIGNvZGUgdGhhdAorCQkgKiBhcHBlYXJzIGFmdGVyIGl0LiAqLworCX0KK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYoIGNvbmZpZ0VOQUJMRV9NUFUgPT0gMSApCisJc3RhdGljIHZvaWQgcHJ2U2V0dXBNUFUoIHZvaWQgKSAvKiBQUklWSUxFR0VEX0ZVTkNUSU9OICovCisJeworCSNpZiBkZWZpbmVkKCBfX0FSTUNDX1ZFUlNJT04gKQorCQkvKiBEZWNsYXJhdGlvbiB3aGVuIHRoZXNlIHZhcmlhYmxlIGFyZSBkZWZpbmVkIGluIGNvZGUgaW5zdGVhZCBvZiBiZWluZworCQkgKiBleHBvcnRlZCBmcm9tIGxpbmtlciBzY3JpcHRzLiAqLworCQlleHRlcm4gdWludDMyX3QgKiBfX3ByaXZpbGVnZWRfZnVuY3Rpb25zX3N0YXJ0X187CisJCWV4dGVybiB1aW50MzJfdCAqIF9fcHJpdmlsZWdlZF9mdW5jdGlvbnNfZW5kX187CisJCWV4dGVybiB1aW50MzJfdCAqIF9fc3lzY2FsbHNfZmxhc2hfc3RhcnRfXzsKKwkJZXh0ZXJuIHVpbnQzMl90ICogX19zeXNjYWxsc19mbGFzaF9lbmRfXzsKKwkJZXh0ZXJuIHVpbnQzMl90ICogX191bnByaXZpbGVnZWRfZmxhc2hfc3RhcnRfXzsKKwkJZXh0ZXJuIHVpbnQzMl90ICogX191bnByaXZpbGVnZWRfZmxhc2hfZW5kX187CisJCWV4dGVybiB1aW50MzJfdCAqIF9fcHJpdmlsZWdlZF9zcmFtX3N0YXJ0X187CisJCWV4dGVybiB1aW50MzJfdCAqIF9fcHJpdmlsZWdlZF9zcmFtX2VuZF9fOworCSNlbHNlCisJCS8qIERlY2xhcmF0aW9uIHdoZW4gdGhlc2UgdmFyaWFibGUgYXJlIGV4cG9ydGVkIGZyb20gbGlua2VyIHNjcmlwdHMuICovCisJCWV4dGVybiB1aW50MzJfdCBfX3ByaXZpbGVnZWRfZnVuY3Rpb25zX3N0YXJ0X19bXTsKKwkJZXh0ZXJuIHVpbnQzMl90IF9fcHJpdmlsZWdlZF9mdW5jdGlvbnNfZW5kX19bXTsKKwkJZXh0ZXJuIHVpbnQzMl90IF9fc3lzY2FsbHNfZmxhc2hfc3RhcnRfX1tdOworCQlleHRlcm4gdWludDMyX3QgX19zeXNjYWxsc19mbGFzaF9lbmRfX1tdOworCQlleHRlcm4gdWludDMyX3QgX191bnByaXZpbGVnZWRfZmxhc2hfc3RhcnRfX1tdOworCQlleHRlcm4gdWludDMyX3QgX191bnByaXZpbGVnZWRfZmxhc2hfZW5kX19bXTsKKwkJZXh0ZXJuIHVpbnQzMl90IF9fcHJpdmlsZWdlZF9zcmFtX3N0YXJ0X19bXTsKKwkJZXh0ZXJuIHVpbnQzMl90IF9fcHJpdmlsZWdlZF9zcmFtX2VuZF9fW107CisJI2VuZGlmIC8qIGRlZmluZWQoIF9fQVJNQ0NfVkVSU0lPTiApICovCisKKwkJLyogQ2hlY2sgdGhhdCB0aGUgTVBVIGlzIHByZXNlbnQuICovCisJCWlmKCBwb3J0TVBVX1RZUEVfUkVHID09IHBvcnRFWFBFQ1RFRF9NUFVfVFlQRV9WQUxVRSApCisJCXsKKwkJCS8qIE1BSVIwIC0gSW5kZXggMC4gKi8KKwkJCXBvcnRNUFVfTUFJUjBfUkVHIHw9ICggKCBwb3J0TVBVX05PUk1BTF9NRU1PUllfQlVGRkVSQUJMRV9DQUNIRUFCTEUgPDwgcG9ydE1QVV9NQUlSX0FUVFIwX1BPUyApICYgcG9ydE1QVV9NQUlSX0FUVFIwX01BU0sgKTsKKwkJCS8qIE1BSVIwIC0gSW5kZXggMS4gKi8KKwkJCXBvcnRNUFVfTUFJUjBfUkVHIHw9ICggKCBwb3J0TVBVX0RFVklDRV9NRU1PUllfbkduUkUgPDwgcG9ydE1QVV9NQUlSX0FUVFIxX1BPUyApICYgcG9ydE1QVV9NQUlSX0FUVFIxX01BU0sgKTsKKworCQkJLyogU2V0dXAgcHJpdmlsZWdlZCBmbGFzaCBhcyBSZWFkIE9ubHkgc28gdGhhdCBwcml2aWxlZ2VkIHRhc2tzIGNhbgorCQkJICogcmVhZCBpdCBidXQgbm90IG1vZGlmeS4gKi8KKwkJCXBvcnRNUFVfUk5SX1JFRyA9IHBvcnRQUklWSUxFR0VEX0ZMQVNIX1JFR0lPTjsKKwkJCXBvcnRNUFVfUkJBUl9SRUcgPQkoICggKCB1aW50MzJfdCApIF9fcHJpdmlsZWdlZF9mdW5jdGlvbnNfc3RhcnRfXyApICYgcG9ydE1QVV9SQkFSX0FERFJFU1NfTUFTSyApIHwKKwkJCQkJCQkJKCBwb3J0TVBVX1JFR0lPTl9OT05fU0hBUkVBQkxFICkgfAorCQkJCQkJCQkoIHBvcnRNUFVfUkVHSU9OX1BSSVZJTEVHRURfUkVBRF9PTkxZICk7CisJCQlwb3J0TVBVX1JMQVJfUkVHID0JKCAoICggdWludDMyX3QgKSBfX3ByaXZpbGVnZWRfZnVuY3Rpb25zX2VuZF9fICkgJiBwb3J0TVBVX1JMQVJfQUREUkVTU19NQVNLICkgfAorCQkJCQkJCQkoIHBvcnRNUFVfUkxBUl9BVFRSX0lOREVYMCApIHwKKwkJCQkJCQkJKCBwb3J0TVBVX1JMQVJfUkVHSU9OX0VOQUJMRSApOworCisJCQkvKiBTZXR1cCB1bnByaXZpbGVnZWQgZmxhc2ggYXMgUmVhZCBPbmx5IGJ5IGJvdGggcHJpdmlsZWdlZCBhbmQKKwkJCSAqIHVucHJpdmlsZWdlZCB0YXNrcy4gQWxsIHRhc2tzIGNhbiByZWFkIGl0IGJ1dCBuby1vbmUgY2FuIG1vZGlmeS4gKi8KKwkJCXBvcnRNUFVfUk5SX1JFRyA9IHBvcnRVTlBSSVZJTEVHRURfRkxBU0hfUkVHSU9OOworCQkJcG9ydE1QVV9SQkFSX1JFRyA9CSggKCAoIHVpbnQzMl90ICkgX191bnByaXZpbGVnZWRfZmxhc2hfc3RhcnRfXyApICYgcG9ydE1QVV9SQkFSX0FERFJFU1NfTUFTSyApIHwKKwkJCQkJCQkJKCBwb3J0TVBVX1JFR0lPTl9OT05fU0hBUkVBQkxFICkgfAorCQkJCQkJCQkoIHBvcnRNUFVfUkVHSU9OX1JFQURfT05MWSApOworCQkJcG9ydE1QVV9STEFSX1JFRyA9CSggKCAoIHVpbnQzMl90ICkgX191bnByaXZpbGVnZWRfZmxhc2hfZW5kX18gKSAmIHBvcnRNUFVfUkxBUl9BRERSRVNTX01BU0sgKSB8CisJCQkJCQkJCSggcG9ydE1QVV9STEFSX0FUVFJfSU5ERVgwICkgfAorCQkJCQkJCQkoIHBvcnRNUFVfUkxBUl9SRUdJT05fRU5BQkxFICk7CisKKwkJCS8qIFNldHVwIHVucHJpdmlsZWdlZCBzeXNjYWxscyBmbGFzaCBhcyBSZWFkIE9ubHkgYnkgYm90aCBwcml2aWxlZ2VkCisJCQkgKiBhbmQgdW5wcml2aWxlZ2VkIHRhc2tzLiBBbGwgdGFza3MgY2FuIHJlYWQgaXQgYnV0IG5vLW9uZSBjYW4gbW9kaWZ5LiAqLworCQkJcG9ydE1QVV9STlJfUkVHID0gcG9ydFVOUFJJVklMRUdFRF9TWVNDQUxMU19SRUdJT047CisJCQlwb3J0TVBVX1JCQVJfUkVHID0JKCAoICggdWludDMyX3QgKSBfX3N5c2NhbGxzX2ZsYXNoX3N0YXJ0X18gKSAmIHBvcnRNUFVfUkJBUl9BRERSRVNTX01BU0sgKSB8CisJCQkJCQkJCSggcG9ydE1QVV9SRUdJT05fTk9OX1NIQVJFQUJMRSApIHwKKwkJCQkJCQkJKCBwb3J0TVBVX1JFR0lPTl9SRUFEX09OTFkgKTsKKwkJCXBvcnRNUFVfUkxBUl9SRUcgPQkoICggKCB1aW50MzJfdCApIF9fc3lzY2FsbHNfZmxhc2hfZW5kX18gKSAmIHBvcnRNUFVfUkxBUl9BRERSRVNTX01BU0sgKSB8CisJCQkJCQkJCSggcG9ydE1QVV9STEFSX0FUVFJfSU5ERVgwICkgfAorCQkJCQkJCQkoIHBvcnRNUFVfUkxBUl9SRUdJT05fRU5BQkxFICk7CisKKwkJCS8qIFNldHVwIFJBTSBjb250YWluaW5nIGtlcm5lbCBkYXRhIGZvciBwcml2aWxlZ2VkIGFjY2VzcyBvbmx5LiAqLworCQkJcG9ydE1QVV9STlJfUkVHID0gcG9ydFBSSVZJTEVHRURfUkFNX1JFR0lPTjsKKwkJCXBvcnRNUFVfUkJBUl9SRUcgPQkoICggKCB1aW50MzJfdCApIF9fcHJpdmlsZWdlZF9zcmFtX3N0YXJ0X18gKSAmIHBvcnRNUFVfUkJBUl9BRERSRVNTX01BU0sgKSB8CisJCQkJCQkJCSggcG9ydE1QVV9SRUdJT05fTk9OX1NIQVJFQUJMRSApIHwKKwkJCQkJCQkJKCBwb3J0TVBVX1JFR0lPTl9QUklWSUxFR0VEX1JFQURfV1JJVEUgKSB8CisJCQkJCQkJCSggcG9ydE1QVV9SRUdJT05fRVhFQ1VURV9ORVZFUiApOworCQkJcG9ydE1QVV9STEFSX1JFRyA9CSggKCAoIHVpbnQzMl90ICkgX19wcml2aWxlZ2VkX3NyYW1fZW5kX18gKSAmIHBvcnRNUFVfUkxBUl9BRERSRVNTX01BU0sgKSB8CisJCQkJCQkJCSggcG9ydE1QVV9STEFSX0FUVFJfSU5ERVgwICkgfAorCQkJCQkJCQkoIHBvcnRNUFVfUkxBUl9SRUdJT05fRU5BQkxFICk7CisKKwkJCS8qIEVuYWJsZSBtZW0gZmF1bHQuICovCisJCQlwb3J0U0NCX1NZU19IQU5ETEVSX0NUUkxfU1RBVEVfUkVHIHw9IHBvcnRTQ0JfTUVNX0ZBVUxUX0VOQUJMRTsKKworCQkJLyogRW5hYmxlIE1QVSB3aXRoIHByaXZpbGVnZWQgYmFja2dyb3VuZCBhY2Nlc3MgaS5lLiB1bm1hcHBlZAorCQkJICogcmVnaW9ucyBoYXZlIHByaXZpbGVnZWQgYWNjZXNzLiAqLworCQkJcG9ydE1QVV9DVFJMX1JFRyB8PSAoIHBvcnRNUFVfUFJJVl9CQUNLR1JPVU5EX0VOQUJMRSB8IHBvcnRNUFVfRU5BQkxFICk7CisJCX0KKwl9CisjZW5kaWYgLyogY29uZmlnRU5BQkxFX01QVSAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiggY29uZmlnRU5BQkxFX0ZQVSA9PSAxICkKKwlzdGF0aWMgdm9pZCBwcnZTZXR1cEZQVSggdm9pZCApIC8qIFBSSVZJTEVHRURfRlVOQ1RJT04gKi8KKwl7CisJCSNpZiggY29uZmlnRU5BQkxFX1RSVVNUWk9ORSA9PSAxICkKKwkJeworCQkJLyogRW5hYmxlIG5vbi1zZWN1cmUgYWNjZXNzIHRvIHRoZSBGUFUuICovCisJCQlTZWN1cmVJbml0X0VuYWJsZU5TRlBVQWNjZXNzKCk7CisJCX0KKwkJI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9UUlVTVFpPTkUgKi8KKworCQkvKiBDUDEwID0gMTEgPT0+IEZ1bGwgYWNjZXNzIHRvIEZQVSBpLmUuIGJvdGggcHJpdmlsZWdlZCBhbmQKKwkJICogdW5wcml2aWxlZ2VkIGNvZGUgc2hvdWxkIGJlIGFibGUgdG8gYWNjZXNzIEZQVS4gQ1AxMSBzaG91bGQgYmUKKwkJICogcHJvZ3JhbW1lZCB0byB0aGUgc2FtZSB2YWx1ZSBhcyBDUDEwLiAqLworCQkqKCBwb3J0Q1BBQ1IgKSB8PQkoCSggcG9ydENQQUNSX0NQMTBfVkFMVUUgPDwgcG9ydENQQUNSX0NQMTBfUE9TICkgfAorCQkJCQkJCQkoIHBvcnRDUEFDUl9DUDExX1ZBTFVFIDw8IHBvcnRDUEFDUl9DUDExX1BPUyApCisJCQkJCQkJKTsKKworCQkvKiBBU1BFTiA9IDEgPT0+IEhhcmR3YXJlIHNob3VsZCBhdXRvbWF0aWNhbGx5IHByZXNlcnZlIGZsb2F0aW5nIHBvaW50CisJCSAqIGNvbnRleHQgb24gZXhjZXB0aW9uIGVudHJ5IGFuZCByZXN0b3JlIG9uIGV4Y2VwdGlvbiByZXR1cm4uCisJCSAqIExTUEVOID0gMSA9PT4gRW5hYmxlIGxhenkgY29udGV4dCBzYXZlIG9mIEZQIHN0YXRlLiAqLworCQkqKCBwb3J0RlBDQ1IgKSB8PSAoIHBvcnRGUENDUl9BU1BFTl9NQVNLIHwgcG9ydEZQQ0NSX0xTUEVOX01BU0sgKTsKKwl9CisjZW5kaWYgLyogY29uZmlnRU5BQkxFX0ZQVSAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgdlBvcnRZaWVsZCggdm9pZCApIC8qIFBSSVZJTEVHRURfRlVOQ1RJT04gKi8KK3sKKwkvKiBTZXQgYSBQZW5kU1YgdG8gcmVxdWVzdCBhIGNvbnRleHQgc3dpdGNoLiAqLworCSooIHBvcnROVklDX0lOVF9DVFJMICkgPSBwb3J0TlZJQ19QRU5EU1ZTRVQ7CisKKwkvKiBCYXJyaWVycyBhcmUgbm9ybWFsbHkgbm90IHJlcXVpcmVkIGJ1dCBkbyBlbnN1cmUgdGhlIGNvZGUgaXMKKwkgKiBjb21wbGV0ZWx5IHdpdGhpbiB0aGUgc3BlY2lmaWVkIGJlaGF2aW91ciBmb3IgdGhlIGFyY2hpdGVjdHVyZS4gKi8KKwlfX2FzbSB2b2xhdGlsZSggImRzYiIgOjo6ICJtZW1vcnkiICk7CisJX19hc20gdm9sYXRpbGUoICJpc2IiICk7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCB2UG9ydEVudGVyQ3JpdGljYWwoIHZvaWQgKSAvKiBQUklWSUxFR0VEX0ZVTkNUSU9OICovCit7CisJcG9ydERJU0FCTEVfSU5URVJSVVBUUygpOworCXVsQ3JpdGljYWxOZXN0aW5nKys7CisKKwkvKiBCYXJyaWVycyBhcmUgbm9ybWFsbHkgbm90IHJlcXVpcmVkIGJ1dCBkbyBlbnN1cmUgdGhlIGNvZGUgaXMKKwkgKiBjb21wbGV0ZWx5IHdpdGhpbiB0aGUgc3BlY2lmaWVkIGJlaGF2aW91ciBmb3IgdGhlIGFyY2hpdGVjdHVyZS4gKi8KKwlfX2FzbSB2b2xhdGlsZSggImRzYiIgOjo6ICJtZW1vcnkiICk7CisJX19hc20gdm9sYXRpbGUoICJpc2IiICk7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCB2UG9ydEV4aXRDcml0aWNhbCggdm9pZCApIC8qIFBSSVZJTEVHRURfRlVOQ1RJT04gKi8KK3sKKwljb25maWdBU1NFUlQoIHVsQ3JpdGljYWxOZXN0aW5nICk7CisJdWxDcml0aWNhbE5lc3RpbmctLTsKKworCWlmKCB1bENyaXRpY2FsTmVzdGluZyA9PSAwICkKKwl7CisJCXBvcnRFTkFCTEVfSU5URVJSVVBUUygpOworCX0KK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIFN5c1RpY2tfSGFuZGxlciggdm9pZCApIC8qIFBSSVZJTEVHRURfRlVOQ1RJT04gKi8KK3sKK3VpbnQzMl90IHVsUHJldmlvdXNNYXNrOworCisJdWxQcmV2aW91c01hc2sgPSBwb3J0U0VUX0lOVEVSUlVQVF9NQVNLX0ZST01fSVNSKCk7CisJeworCQkvKiBJbmNyZW1lbnQgdGhlIFJUT1MgdGljay4gKi8KKwkJaWYoIHhUYXNrSW5jcmVtZW50VGljaygpICE9IHBkRkFMU0UgKQorCQl7CisJCQkvKiBQZW5kIGEgY29udGV4dCBzd2l0Y2guICovCisJCQkqKCBwb3J0TlZJQ19JTlRfQ1RSTCApID0gcG9ydE5WSUNfUEVORFNWU0VUOworCQl9CisJfQorCXBvcnRDTEVBUl9JTlRFUlJVUFRfTUFTS19GUk9NX0lTUiggdWxQcmV2aW91c01hc2sgKTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIHZQb3J0U1ZDSGFuZGxlcl9DKCB1aW50MzJfdCAqcHVsQ2FsbGVyU3RhY2tBZGRyZXNzICkgLyogUFJJVklMRUdFRF9GVU5DVElPTiBwb3J0RE9OVF9ESVNDQVJEICovCit7CisjaWYoIGNvbmZpZ0VOQUJMRV9NUFUgPT0gMSApCisJI2lmIGRlZmluZWQoIF9fQVJNQ0NfVkVSU0lPTiApCisJCS8qIERlY2xhcmF0aW9uIHdoZW4gdGhlc2UgdmFyaWFibGUgYXJlIGRlZmluZWQgaW4gY29kZSBpbnN0ZWFkIG9mIGJlaW5nCisJCSAqIGV4cG9ydGVkIGZyb20gbGlua2VyIHNjcmlwdHMuICovCisJCWV4dGVybiB1aW50MzJfdCAqIF9fc3lzY2FsbHNfZmxhc2hfc3RhcnRfXzsKKwkJZXh0ZXJuIHVpbnQzMl90ICogX19zeXNjYWxsc19mbGFzaF9lbmRfXzsKKwkjZWxzZQorCQkvKiBEZWNsYXJhdGlvbiB3aGVuIHRoZXNlIHZhcmlhYmxlIGFyZSBleHBvcnRlZCBmcm9tIGxpbmtlciBzY3JpcHRzLiAqLworCQlleHRlcm4gdWludDMyX3QgX19zeXNjYWxsc19mbGFzaF9zdGFydF9fW107CisJCWV4dGVybiB1aW50MzJfdCBfX3N5c2NhbGxzX2ZsYXNoX2VuZF9fW107CisJI2VuZGlmIC8qIGRlZmluZWQoIF9fQVJNQ0NfVkVSU0lPTiApICovCisjZW5kaWYgLyogY29uZmlnRU5BQkxFX01QVSAqLworCit1aW50MzJfdCB1bFBDOworCisjaWYoIGNvbmZpZ0VOQUJMRV9UUlVTVFpPTkUgPT0gMSApCisJdWludDMyX3QgdWxSMDsKKwkjaWYoIGNvbmZpZ0VOQUJMRV9NUFUgPT0gMSApCisJCXVpbnQzMl90IHVsQ29udHJvbCwgdWxJc1Rhc2tQcml2aWxlZ2VkOworCSNlbmRpZiAvKiBjb25maWdFTkFCTEVfTVBVICovCisjZW5kaWYgLyogY29uZmlnRU5BQkxFX1RSVVNUWk9ORSAqLwordWludDhfdCB1Y1NWQ051bWJlcjsKKworCS8qIFJlZ2lzdGVyIGFyZSBzdG9yZWQgb24gdGhlIHN0YWNrIGluIHRoZSBmb2xsb3dpbmcgb3JkZXIgLSBSMCwgUjEsIFIyLCBSMywKKwkgKiBSMTIsIExSLCBQQywgeFBTUi4gKi8KKwl1bFBDID0gcHVsQ2FsbGVyU3RhY2tBZGRyZXNzWyA2IF07CisJdWNTVkNOdW1iZXIgPSAoICggdWludDhfdCAqKSB1bFBDIClbIC0yIF07CisKKwlzd2l0Y2goIHVjU1ZDTnVtYmVyICkKKwl7CisJCSNpZiggY29uZmlnRU5BQkxFX1RSVVNUWk9ORSA9PSAxICkKKwkJCWNhc2UgcG9ydFNWQ19BTExPQ0FURV9TRUNVUkVfQ09OVEVYVDoKKwkJCXsKKwkJCQkvKiBSMCBjb250YWlucyB0aGUgc3RhY2sgc2l6ZSBwYXNzZWQgYXMgcGFyYW1ldGVyIHRvIHRoZQorCQkJCSAqIHZQb3J0QWxsb2NhdGVTZWN1cmVDb250ZXh0IGZ1bmN0aW9uLiAqLworCQkJCXVsUjAgPSBwdWxDYWxsZXJTdGFja0FkZHJlc3NbIDAgXTsKKworCQkJCSNpZiggY29uZmlnRU5BQkxFX01QVSA9PSAxICkKKwkJCQl7CisJCQkJCS8qIFJlYWQgdGhlIENPTlRST0wgcmVnaXN0ZXIgdmFsdWUuICovCisJCQkJCV9fYXNtIHZvbGF0aWxlICggIm1ycyAlMCwgY29udHJvbCIgIDogIj1yIiAoIHVsQ29udHJvbCApICk7CisKKwkJCQkJLyogVGhlIHRhc2sgdGhhdCByYWlzZWQgdGhlIFNWQyBpcyBwcml2aWxlZ2VkIGlmIEJpdFswXQorCQkJCQkgKiBpbiB0aGUgQ09OVFJPTCByZWdpc3RlciBpcyAwLiAqLworCQkJCQl1bElzVGFza1ByaXZpbGVnZWQgPSAoICggdWxDb250cm9sICYgcG9ydENPTlRST0xfUFJJVklMRUdFRF9NQVNLICkgPT0gMCApOworCisJCQkJCS8qIEFsbG9jYXRlIGFuZCBsb2FkIGEgY29udGV4dCBmb3IgdGhlIHNlY3VyZSB0YXNrLiAqLworCQkJCQl4U2VjdXJlQ29udGV4dCA9IFNlY3VyZUNvbnRleHRfQWxsb2NhdGVDb250ZXh0KCB1bFIwLCB1bElzVGFza1ByaXZpbGVnZWQgKTsKKwkJCQl9CisJCQkJI2Vsc2UKKwkJCQl7CisJCQkJCS8qIEFsbG9jYXRlIGFuZCBsb2FkIGEgY29udGV4dCBmb3IgdGhlIHNlY3VyZSB0YXNrLiAqLworCQkJCQl4U2VjdXJlQ29udGV4dCA9IFNlY3VyZUNvbnRleHRfQWxsb2NhdGVDb250ZXh0KCB1bFIwICk7CisJCQkJfQorCQkJCSNlbmRpZiAvKiBjb25maWdFTkFCTEVfTVBVICovCisKKwkJCQljb25maWdBU1NFUlQoIHhTZWN1cmVDb250ZXh0ICE9IE5VTEwgKTsKKwkJCQlTZWN1cmVDb250ZXh0X0xvYWRDb250ZXh0KCB4U2VjdXJlQ29udGV4dCApOworCQkJfQorCQkJYnJlYWs7CisKKwkJCWNhc2UgcG9ydFNWQ19GUkVFX1NFQ1VSRV9DT05URVhUOgorCQkJeworCQkJCS8qIFIwIGNvbnRhaW5zIHRoZSBzZWN1cmUgY29udGV4dCBoYW5kbGUgdG8gYmUgZnJlZWQuICovCisJCQkJdWxSMCA9IHB1bENhbGxlclN0YWNrQWRkcmVzc1sgMCBdOworCisJCQkJLyogRnJlZSB0aGUgc2VjdXJlIGNvbnRleHQuICovCisJCQkJU2VjdXJlQ29udGV4dF9GcmVlQ29udGV4dCggKCBTZWN1cmVDb250ZXh0SGFuZGxlX3QgKSB1bFIwICk7CisJCQl9CisJCQlicmVhazsKKwkJI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9UUlVTVFpPTkUgKi8KKworCQljYXNlIHBvcnRTVkNfU1RBUlRfU0NIRURVTEVSOgorCQl7CisJCQkjaWYoIGNvbmZpZ0VOQUJMRV9UUlVTVFpPTkUgPT0gMSApCisJCQl7CisJCQkJLyogRGUtcHJpb3JpdGl6ZSB0aGUgbm9uLXNlY3VyZSBleGNlcHRpb25zIHNvIHRoYXQgdGhlCisJCQkJICogbm9uLXNlY3VyZSBwZW5kU1YgcnVucyBhdCB0aGUgbG93ZXN0IHByaW9yaXR5LiAqLworCQkJCVNlY3VyZUluaXRfRGVQcmlvcml0aXplTlNFeGNlcHRpb25zKCk7CisKKwkJCQkvKiBJbml0aWFsaXplIHRoZSBzZWN1cmUgY29udGV4dCBtYW5hZ2VtZW50IHN5c3RlbS4gKi8KKwkJCQlTZWN1cmVDb250ZXh0X0luaXQoKTsKKwkJCX0KKwkJCSNlbmRpZiAvKiBjb25maWdFTkFCTEVfVFJVU1RaT05FICovCisKKwkJCSNpZiggY29uZmlnRU5BQkxFX0ZQVSA9PSAxICkKKwkJCXsKKwkJCQkvKiBTZXR1cCB0aGUgRmxvYXRpbmcgUG9pbnQgVW5pdCAoRlBVKS4gKi8KKwkJCQlwcnZTZXR1cEZQVSgpOworCQkJfQorCQkJI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9GUFUgKi8KKworCQkJLyogU2V0dXAgdGhlIGNvbnRleHQgb2YgdGhlIGZpcnN0IHRhc2sgc28gdGhhdCB0aGUgZmlyc3QgdGFzayBzdGFydHMKKwkJCSAqIGV4ZWN1dGluZy4gKi8KKwkJCXZSZXN0b3JlQ29udGV4dE9mRmlyc3RUYXNrKCk7CisJCX0KKwkJYnJlYWs7CisKKwkJI2lmKCBjb25maWdFTkFCTEVfTVBVID09IDEgKQorCQkJY2FzZSBwb3J0U1ZDX1JBSVNFX1BSSVZJTEVHRToKKwkJCXsKKwkJCQkvKiBPbmx5IHJhaXNlIHRoZSBwcml2aWxlZ2UsIGlmIHRoZSBzdmMgd2FzIHJhaXNlZCBmcm9tIGFueSBvZgorCQkJCSAqIHRoZSBzeXN0ZW0gY2FsbHMuICovCisJCQkJaWYoIHVsUEMgPj0gKCB1aW50MzJfdCApIF9fc3lzY2FsbHNfZmxhc2hfc3RhcnRfXyAmJgorCQkJCQl1bFBDIDw9ICggdWludDMyX3QgKSBfX3N5c2NhbGxzX2ZsYXNoX2VuZF9fICkKKwkJCQl7CisJCQkJCXZSYWlzZVByaXZpbGVnZSgpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQkjZW5kaWYgLyogY29uZmlnRU5BQkxFX01QVSAqLworCisJCWRlZmF1bHQ6CisJCXsKKwkJCS8qIEluY29ycmVjdCBTVkMgY2FsbC4gKi8KKwkJCWNvbmZpZ0FTU0VSVCggcGRGQUxTRSApOworCQl9CisJfQorfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiggY29uZmlnRU5BQkxFX01QVSA9PSAxICkKKwlTdGFja1R5cGVfdCAqcHhQb3J0SW5pdGlhbGlzZVN0YWNrKCBTdGFja1R5cGVfdCAqcHhUb3BPZlN0YWNrLCBTdGFja1R5cGVfdCAqcHhFbmRPZlN0YWNrLCBUYXNrRnVuY3Rpb25fdCBweENvZGUsIHZvaWQgKnB2UGFyYW1ldGVycywgQmFzZVR5cGVfdCB4UnVuUHJpdmlsZWdlZCApIC8qIFBSSVZJTEVHRURfRlVOQ1RJT04gKi8KKyNlbHNlCisJU3RhY2tUeXBlX3QgKnB4UG9ydEluaXRpYWxpc2VTdGFjayggU3RhY2tUeXBlX3QgKnB4VG9wT2ZTdGFjaywgU3RhY2tUeXBlX3QgKnB4RW5kT2ZTdGFjaywgVGFza0Z1bmN0aW9uX3QgcHhDb2RlLCB2b2lkICpwdlBhcmFtZXRlcnMgKSAvKiBQUklWSUxFR0VEX0ZVTkNUSU9OICovCisjZW5kaWYgLyogY29uZmlnRU5BQkxFX01QVSAqLworeworCS8qIFNpbXVsYXRlIHRoZSBzdGFjayBmcmFtZSBhcyBpdCB3b3VsZCBiZSBjcmVhdGVkIGJ5IGEgY29udGV4dCBzd2l0Y2gKKwkgKiBpbnRlcnJ1cHQuICovCisJI2lmKCBwb3J0UFJFTE9BRF9SRUdJU1RFUlMgPT0gMCApCisJeworCQlweFRvcE9mU3RhY2stLTsgLyogT2Zmc2V0IGFkZGVkIHRvIGFjY291bnQgZm9yIHRoZSB3YXkgdGhlIE1DVSB1c2VzIHRoZSBzdGFjayBvbiBlbnRyeS9leGl0IG9mIGludGVycnVwdHMuICovCisJCSpweFRvcE9mU3RhY2sgPSBwb3J0SU5JVElBTF9YUFNSOwkJCQkJCQkvKiB4UFNSICovCisJCXB4VG9wT2ZTdGFjay0tOworCQkqcHhUb3BPZlN0YWNrID0gKCBTdGFja1R5cGVfdCApIHB4Q29kZTsJCQkJCQkvKiBQQyAqLworCQlweFRvcE9mU3RhY2stLTsKKwkJKnB4VG9wT2ZTdGFjayA9ICggU3RhY2tUeXBlX3QgKSBwb3J0VEFTS19SRVRVUk5fQUREUkVTUzsJLyogTFIgKi8KKwkJcHhUb3BPZlN0YWNrIC09IDU7CQkJCQkJCQkJCQkvKiBSMTIsIFIzLCBSMiBhbmQgUjEuICovCisJCSpweFRvcE9mU3RhY2sgPSAoIFN0YWNrVHlwZV90ICkgcHZQYXJhbWV0ZXJzOwkJCQkvKiBSMCAqLworCQlweFRvcE9mU3RhY2sgLT0gOTsJCQkJCQkJCQkJCS8qIFIxMS4uUjQsIEVYQ19SRVRVUk4uICovCisJCSpweFRvcE9mU3RhY2sgPSBwb3J0SU5JVElBTF9FWENfUkVUVVJOOworCisJCSNpZiggY29uZmlnRU5BQkxFX01QVSA9PSAxICkKKwkJeworCQkJcHhUb3BPZlN0YWNrLS07CisJCQlpZiggeFJ1blByaXZpbGVnZWQgPT0gcGRUUlVFICkKKwkJCXsKKwkJCQkqcHhUb3BPZlN0YWNrID0gcG9ydElOSVRJQUxfQ09OVFJPTF9QUklWSUxFR0VEOwkJLyogU2xvdCB1c2VkIHRvIGhvbGQgdGhpcyB0YXNrJ3MgQ09OVFJPTCB2YWx1ZS4gKi8KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkqcHhUb3BPZlN0YWNrID0gcG9ydElOSVRJQUxfQ09OVFJPTF9VTlBSSVZJTEVHRUQ7CS8qIFNsb3QgdXNlZCB0byBob2xkIHRoaXMgdGFzaydzIENPTlRST0wgdmFsdWUuICovCisJCQl9CisJCX0KKwkJI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9NUFUgKi8KKworCQlweFRvcE9mU3RhY2stLTsKKwkJKnB4VG9wT2ZTdGFjayA9ICggU3RhY2tUeXBlX3QgKSBweEVuZE9mU3RhY2s7CS8qIFNsb3QgdXNlZCB0byBob2xkIHRoaXMgdGFzaydzIFBTUExJTSB2YWx1ZS4gKi8KKworCQkjaWYoIGNvbmZpZ0VOQUJMRV9UUlVTVFpPTkUgPT0gMSApCisJCXsKKwkJCXB4VG9wT2ZTdGFjay0tOworCQkJKnB4VG9wT2ZTdGFjayA9IHBvcnROT19TRUNVUkVfQ09OVEVYVDsJCS8qIFNsb3QgdXNlZCB0byBob2xkIHRoaXMgdGFzaydzIHhTZWN1cmVDb250ZXh0IHZhbHVlLiAqLworCQl9CisJCSNlbmRpZiAvKiBjb25maWdFTkFCTEVfVFJVU1RaT05FICovCisJfQorCSNlbHNlIC8qIHBvcnRQUkVMT0FEX1JFR0lTVEVSUyAqLworCXsKKwkJcHhUb3BPZlN0YWNrLS07IC8qIE9mZnNldCBhZGRlZCB0byBhY2NvdW50IGZvciB0aGUgd2F5IHRoZSBNQ1UgdXNlcyB0aGUgc3RhY2sgb24gZW50cnkvZXhpdCBvZiBpbnRlcnJ1cHRzLiAqLworCQkqcHhUb3BPZlN0YWNrID0gcG9ydElOSVRJQUxfWFBTUjsJCQkJCQkJLyogeFBTUiAqLworCQlweFRvcE9mU3RhY2stLTsKKwkJKnB4VG9wT2ZTdGFjayA9ICggU3RhY2tUeXBlX3QgKSBweENvZGU7CQkJCQkJLyogUEMgKi8KKwkJcHhUb3BPZlN0YWNrLS07CisJCSpweFRvcE9mU3RhY2sgPSAoIFN0YWNrVHlwZV90ICkgcG9ydFRBU0tfUkVUVVJOX0FERFJFU1M7CS8qIExSICovCisJCXB4VG9wT2ZTdGFjay0tOworCQkqcHhUb3BPZlN0YWNrID0gKCBTdGFja1R5cGVfdCApIDB4MTIxMjEyMTJVTDsJCQkJLyogUjEyICovCisJCXB4VG9wT2ZTdGFjay0tOworCQkqcHhUb3BPZlN0YWNrID0gKCBTdGFja1R5cGVfdCApIDB4MDMwMzAzMDNVTDsJCQkJLyogUjMgKi8KKwkJcHhUb3BPZlN0YWNrLS07CisJCSpweFRvcE9mU3RhY2sgPSAoIFN0YWNrVHlwZV90ICkgMHgwMjAyMDIwMlVMOwkJCQkvKiBSMiAqLworCQlweFRvcE9mU3RhY2stLTsKKwkJKnB4VG9wT2ZTdGFjayA9ICggU3RhY2tUeXBlX3QgKSAweDAxMDEwMTAxVUw7CQkJCS8qIFIxICovCisJCXB4VG9wT2ZTdGFjay0tOworCQkqcHhUb3BPZlN0YWNrID0gKCBTdGFja1R5cGVfdCApIHB2UGFyYW1ldGVyczsJCQkJLyogUjAgKi8KKwkJcHhUb3BPZlN0YWNrLS07CisJCSpweFRvcE9mU3RhY2sgPSAoIFN0YWNrVHlwZV90ICkgMHgxMTExMTExMVVMOwkJCQkvKiBSMTEgKi8KKwkJcHhUb3BPZlN0YWNrLS07CisJCSpweFRvcE9mU3RhY2sgPSAoIFN0YWNrVHlwZV90ICkgMHgxMDEwMTAxMFVMOwkJCQkvKiBSMTAgKi8KKwkJcHhUb3BPZlN0YWNrLS07CisJCSpweFRvcE9mU3RhY2sgPSAoIFN0YWNrVHlwZV90ICkgMHgwOTA5MDkwOVVMOwkJCQkvKiBSMDkgKi8KKwkJcHhUb3BPZlN0YWNrLS07CisJCSpweFRvcE9mU3RhY2sgPSAoIFN0YWNrVHlwZV90ICkgMHgwODA4MDgwOFVMOwkJCQkvKiBSMDggKi8KKwkJcHhUb3BPZlN0YWNrLS07CisJCSpweFRvcE9mU3RhY2sgPSAoIFN0YWNrVHlwZV90ICkgMHgwNzA3MDcwN1VMOwkJCQkvKiBSMDcgKi8KKwkJcHhUb3BPZlN0YWNrLS07CisJCSpweFRvcE9mU3RhY2sgPSAoIFN0YWNrVHlwZV90ICkgMHgwNjA2MDYwNlVMOwkJCQkvKiBSMDYgKi8KKwkJcHhUb3BPZlN0YWNrLS07CisJCSpweFRvcE9mU3RhY2sgPSAoIFN0YWNrVHlwZV90ICkgMHgwNTA1MDUwNVVMOwkJCQkvKiBSMDUgKi8KKwkJcHhUb3BPZlN0YWNrLS07CisJCSpweFRvcE9mU3RhY2sgPSAoIFN0YWNrVHlwZV90ICkgMHgwNDA0MDQwNFVMOwkJCQkvKiBSMDQgKi8KKwkJcHhUb3BPZlN0YWNrLS07CisJCSpweFRvcE9mU3RhY2sgPSBwb3J0SU5JVElBTF9FWENfUkVUVVJOOwkJCQkJCS8qIEVYQ19SRVRVUk4gKi8KKworCQkjaWYoIGNvbmZpZ0VOQUJMRV9NUFUgPT0gMSApCisJCXsKKwkJCXB4VG9wT2ZTdGFjay0tOworCQkJaWYoIHhSdW5Qcml2aWxlZ2VkID09IHBkVFJVRSApCisJCQl7CisJCQkJKnB4VG9wT2ZTdGFjayA9IHBvcnRJTklUSUFMX0NPTlRST0xfUFJJVklMRUdFRDsJCS8qIFNsb3QgdXNlZCB0byBob2xkIHRoaXMgdGFzaydzIENPTlRST0wgdmFsdWUuICovCisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJKnB4VG9wT2ZTdGFjayA9IHBvcnRJTklUSUFMX0NPTlRST0xfVU5QUklWSUxFR0VEOwkvKiBTbG90IHVzZWQgdG8gaG9sZCB0aGlzIHRhc2sncyBDT05UUk9MIHZhbHVlLiAqLworCQkJfQorCQl9CisJCSNlbmRpZiAvKiBjb25maWdFTkFCTEVfTVBVICovCisKKwkJcHhUb3BPZlN0YWNrLS07CisJCSpweFRvcE9mU3RhY2sgPSAoIFN0YWNrVHlwZV90ICkgcHhFbmRPZlN0YWNrOwkvKiBTbG90IHVzZWQgdG8gaG9sZCB0aGlzIHRhc2sncyBQU1BMSU0gdmFsdWUuICovCisKKwkJI2lmKCBjb25maWdFTkFCTEVfVFJVU1RaT05FID09IDEgKQorCQl7CisJCQlweFRvcE9mU3RhY2stLTsKKwkJCSpweFRvcE9mU3RhY2sgPSBwb3J0Tk9fU0VDVVJFX0NPTlRFWFQ7CQkvKiBTbG90IHVzZWQgdG8gaG9sZCB0aGlzIHRhc2sncyB4U2VjdXJlQ29udGV4dCB2YWx1ZS4gKi8KKwkJfQorCQkjZW5kaWYgLyogY29uZmlnRU5BQkxFX1RSVVNUWk9ORSAqLworCX0KKwkjZW5kaWYgLyogcG9ydFBSRUxPQURfUkVHSVNURVJTICovCisKKwlyZXR1cm4gcHhUb3BPZlN0YWNrOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK0Jhc2VUeXBlX3QgeFBvcnRTdGFydFNjaGVkdWxlciggdm9pZCApIC8qIFBSSVZJTEVHRURfRlVOQ1RJT04gKi8KK3sKKwkvKiBNYWtlIFBlbmRTViwgQ2FsbFNWIGFuZCBTeXNUaWNrIHRoZSBzYW1lIHByaW9yaXR5IGFzIHRoZSBrZXJuZWwuICovCisJKiggcG9ydE5WSUNfU1lTUFJJMiApIHw9IHBvcnROVklDX1BFTkRTVl9QUkk7CisJKiggcG9ydE5WSUNfU1lTUFJJMiApIHw9IHBvcnROVklDX1NZU1RJQ0tfUFJJOworCisJI2lmKCBjb25maWdFTkFCTEVfTVBVID09IDEgKQorCXsKKwkJLyogU2V0dXAgdGhlIE1lbW9yeSBQcm90ZWN0aW9uIFVuaXQgKE1QVSkuICovCisJCXBydlNldHVwTVBVKCk7CisJfQorCSNlbmRpZiAvKiBjb25maWdFTkFCTEVfTVBVICovCisKKwkvKiBTdGFydCB0aGUgdGltZXIgdGhhdCBnZW5lcmF0ZXMgdGhlIHRpY2sgSVNSLiBJbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZAorCSAqIGhlcmUgYWxyZWFkeS4gKi8KKwlwcnZTZXR1cFRpbWVySW50ZXJydXB0KCk7CisKKwkvKiBJbml0aWFsaXplIHRoZSBjcml0aWNhbCBuZXN0aW5nIGNvdW50IHJlYWR5IGZvciB0aGUgZmlyc3QgdGFzay4gKi8KKwl1bENyaXRpY2FsTmVzdGluZyA9IDA7CisKKwkvKiBTdGFydCB0aGUgZmlyc3QgdGFzay4gKi8KKwl2U3RhcnRGaXJzdFRhc2soKTsKKworCS8qIFNob3VsZCBuZXZlciBnZXQgaGVyZSBhcyB0aGUgdGFza3Mgd2lsbCBub3cgYmUgZXhlY3V0aW5nLiBDYWxsIHRoZSB0YXNrCisJICogZXhpdCBlcnJvciBmdW5jdGlvbiB0byBwcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzIGFib3V0IGEgc3RhdGljIGZ1bmN0aW9uCisJICogbm90IGJlaW5nIGNhbGxlZCBpbiB0aGUgY2FzZSB0aGF0IHRoZSBhcHBsaWNhdGlvbiB3cml0ZXIgb3ZlcnJpZGVzIHRoaXMKKwkgKiBmdW5jdGlvbmFsaXR5IGJ5IGRlZmluaW5nIGNvbmZpZ1RBU0tfUkVUVVJOX0FERFJFU1MuIENhbGwKKwkgKiB2VGFza1N3aXRjaENvbnRleHQoKSBzbyBsaW5rIHRpbWUgb3B0aW1pemF0aW9uIGRvZXMgbm90IHJlbW92ZSB0aGUKKwkgKiBzeW1ib2wuICovCisJdlRhc2tTd2l0Y2hDb250ZXh0KCk7CisJcHJ2VGFza0V4aXRFcnJvcigpOworCisJLyogU2hvdWxkIG5vdCBnZXQgaGVyZS4gKi8KKwlyZXR1cm4gMDsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIHZQb3J0RW5kU2NoZWR1bGVyKCB2b2lkICkgLyogUFJJVklMRUdFRF9GVU5DVElPTiAqLworeworCS8qIE5vdCBpbXBsZW1lbnRlZCBpbiBwb3J0cyB3aGVyZSB0aGVyZSBpcyBub3RoaW5nIHRvIHJldHVybiB0by4KKwkgKiBBcnRpZmljaWFsbHkgZm9yY2UgYW4gYXNzZXJ0LiAqLworCWNvbmZpZ0FTU0VSVCggdWxDcml0aWNhbE5lc3RpbmcgPT0gMTAwMFVMICk7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmKCBjb25maWdFTkFCTEVfTVBVID09IDEgKQorCXZvaWQgdlBvcnRTdG9yZVRhc2tNUFVTZXR0aW5ncyggeE1QVV9TRVRUSU5HUyAqeE1QVVNldHRpbmdzLCBjb25zdCBzdHJ1Y3QgeE1FTU9SWV9SRUdJT04gKiBjb25zdCB4UmVnaW9ucywgU3RhY2tUeXBlX3QgKnB4Qm90dG9tT2ZTdGFjaywgdWludDMyX3QgdWxTdGFja0RlcHRoICkKKwl7CisJdWludDMyX3QgdWxSZWdpb25TdGFydEFkZHJlc3MsIHVsUmVnaW9uRW5kQWRkcmVzcywgdWxSZWdpb25OdW1iZXI7CisJaW50MzJfdCBsSW5kZXggPSAwOworCisJCS8qIFNldHVwIE1BSVIwLiAqLworCQl4TVBVU2V0dGluZ3MtPnVsTUFJUjAgPSAoICggcG9ydE1QVV9OT1JNQUxfTUVNT1JZX0JVRkZFUkFCTEVfQ0FDSEVBQkxFIDw8IHBvcnRNUFVfTUFJUl9BVFRSMF9QT1MgKSAmIHBvcnRNUFVfTUFJUl9BVFRSMF9NQVNLICk7CisJCXhNUFVTZXR0aW5ncy0+dWxNQUlSMCB8PSAoICggcG9ydE1QVV9ERVZJQ0VfTUVNT1JZX25HblJFIDw8IHBvcnRNUFVfTUFJUl9BVFRSMV9QT1MgKSAmIHBvcnRNUFVfTUFJUl9BVFRSMV9NQVNLICk7CisKKwkJLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYXV0b21hdGljYWxseSB3aGVuIHRoZSB0YXNrIGlzIGNyZWF0ZWQgLSBpbgorCQkgKiB3aGljaCBjYXNlIHRoZSBzdGFjayByZWdpb24gcGFyYW1ldGVycyB3aWxsIGJlIHZhbGlkLiAgQXQgYWxsIG90aGVyCisJCSAqIHRpbWVzIHRoZSBzdGFjayBwYXJhbWV0ZXJzIHdpbGwgbm90IGJlIHZhbGlkIGFuZCBpdCBpcyBhc3N1bWVkIHRoYXQKKwkJICogdGhlIHN0YWNrIHJlZ2lvbiBoYXMgYWxyZWFkeSBiZWVuIGNvbmZpZ3VyZWQuICovCisJCWlmKCB1bFN0YWNrRGVwdGggPiAwICkKKwkJeworCQkJLyogRGVmaW5lIHRoZSByZWdpb24gdGhhdCBhbGxvd3MgYWNjZXNzIHRvIHRoZSBzdGFjay4gKi8KKwkJCXVsUmVnaW9uU3RhcnRBZGRyZXNzID0gKCAoIHVpbnQzMl90ICkgcHhCb3R0b21PZlN0YWNrICkgJiBwb3J0TVBVX1JCQVJfQUREUkVTU19NQVNLOworCQkJdWxSZWdpb25FbmRBZGRyZXNzID0gKCB1aW50MzJfdCApIHB4Qm90dG9tT2ZTdGFjayArICggdWxTdGFja0RlcHRoICogKCB1aW50MzJfdCApIHNpemVvZiggU3RhY2tUeXBlX3QgKSApIC0gMTsKKwkJCXVsUmVnaW9uRW5kQWRkcmVzcyAgJj0gcG9ydE1QVV9STEFSX0FERFJFU1NfTUFTSzsKKworCQkJeE1QVVNldHRpbmdzLT54UmVnaW9uc1NldHRpbmdzWyAwIF0udWxSQkFSID0JKCB1bFJlZ2lvblN0YXJ0QWRkcmVzcyApIHwKKwkJCQkJCQkJCQkJCQkJCSggcG9ydE1QVV9SRUdJT05fTk9OX1NIQVJFQUJMRSApIHwKKwkJCQkJCQkJCQkJCQkJCSggcG9ydE1QVV9SRUdJT05fUkVBRF9XUklURSApIHwKKwkJCQkJCQkJCQkJCQkJCSggcG9ydE1QVV9SRUdJT05fRVhFQ1VURV9ORVZFUiApOworCisJCQl4TVBVU2V0dGluZ3MtPnhSZWdpb25zU2V0dGluZ3NbIDAgXS51bFJMQVIgPQkoIHVsUmVnaW9uRW5kQWRkcmVzcyApIHwKKwkJCQkJCQkJCQkJCQkJCSggcG9ydE1QVV9STEFSX0FUVFJfSU5ERVgwICkgfAorCQkJCQkJCQkJCQkJCQkJKCBwb3J0TVBVX1JMQVJfUkVHSU9OX0VOQUJMRSApOworCQl9CisKKwkJLyogVXNlciBzdXBwbGllZCBjb25maWd1cmFibGUgcmVnaW9ucy4gKi8KKwkJZm9yKCB1bFJlZ2lvbk51bWJlciA9IDE7IHVsUmVnaW9uTnVtYmVyIDw9IHBvcnROVU1fQ09ORklHVVJBQkxFX1JFR0lPTlM7IHVsUmVnaW9uTnVtYmVyKysgKQorCQl7CisJCQkvKiBJZiB4UmVnaW9ucyBpcyBOVUxMIGkuZS4gdGhlIHRhc2sgaGFzIG5vdCBzcGVjaWZpZWQgYW55IE1QVQorCQkJICogcmVnaW9uLCB0aGUgZWxzZSBwYXJ0IGVuc3VyZXMgdGhhdCBhbGwgdGhlIGNvbmZpZ3VyYWJsZSBNUFUKKwkJCSAqIHJlZ2lvbnMgYXJlIGludmFsaWRhdGVkLiAqLworCQkJaWYoICggeFJlZ2lvbnMgIT0gTlVMTCApICYmICggeFJlZ2lvbnNbIGxJbmRleCBdLnVsTGVuZ3RoSW5CeXRlcyA+IDBVTCApICkKKwkJCXsKKwkJCQkvKiBUcmFuc2xhdGUgdGhlIGdlbmVyaWMgcmVnaW9uIGRlZmluaXRpb24gY29udGFpbmVkIGluIHhSZWdpb25zCisJCQkJICogaW50byB0aGUgQVJNdjggc3BlY2lmaWMgTVBVIHNldHRpbmdzIHRoYXQgYXJlIHRoZW4gc3RvcmVkIGluCisJCQkJICogeE1QVVNldHRpbmdzLiAqLworCQkJCXVsUmVnaW9uU3RhcnRBZGRyZXNzID0gKCAoIHVpbnQzMl90ICkgeFJlZ2lvbnNbIGxJbmRleCBdLnB2QmFzZUFkZHJlc3MgKSAmIHBvcnRNUFVfUkJBUl9BRERSRVNTX01BU0s7CisJCQkJdWxSZWdpb25FbmRBZGRyZXNzID0gKCB1aW50MzJfdCApIHhSZWdpb25zWyBsSW5kZXggXS5wdkJhc2VBZGRyZXNzICsgeFJlZ2lvbnNbIGxJbmRleCBdLnVsTGVuZ3RoSW5CeXRlcyAtIDE7CisJCQkJdWxSZWdpb25FbmRBZGRyZXNzICAmPSBwb3J0TVBVX1JMQVJfQUREUkVTU19NQVNLOworCisJCQkJLyogU3RhcnQgYWRkcmVzcy4gKi8KKwkJCQl4TVBVU2V0dGluZ3MtPnhSZWdpb25zU2V0dGluZ3NbIHVsUmVnaW9uTnVtYmVyIF0udWxSQkFSID0JKCB1bFJlZ2lvblN0YXJ0QWRkcmVzcyApIHwKKwkJCQkJCQkJCQkJCQkJCQkJCQkoIHBvcnRNUFVfUkVHSU9OX05PTl9TSEFSRUFCTEUgKTsKKworCQkJCS8qIFJPL1JXLiAqLworCQkJCWlmKCAoIHhSZWdpb25zWyBsSW5kZXggXS51bFBhcmFtZXRlcnMgJiB0c2tNUFVfUkVHSU9OX1JFQURfT05MWSApICE9IDAgKQorCQkJCXsKKwkJCQkJeE1QVVNldHRpbmdzLT54UmVnaW9uc1NldHRpbmdzWyB1bFJlZ2lvbk51bWJlciBdLnVsUkJBUiB8PSAoIHBvcnRNUFVfUkVHSU9OX1JFQURfT05MWSApOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQl4TVBVU2V0dGluZ3MtPnhSZWdpb25zU2V0dGluZ3NbIHVsUmVnaW9uTnVtYmVyIF0udWxSQkFSIHw9ICggcG9ydE1QVV9SRUdJT05fUkVBRF9XUklURSApOworCQkJCX0KKworCQkJCS8qIFhOLiAqLworCQkJCWlmKCAoIHhSZWdpb25zWyBsSW5kZXggXS51bFBhcmFtZXRlcnMgJiB0c2tNUFVfUkVHSU9OX0VYRUNVVEVfTkVWRVIgKSAhPSAwICkKKwkJCQl7CisJCQkJCXhNUFVTZXR0aW5ncy0+eFJlZ2lvbnNTZXR0aW5nc1sgdWxSZWdpb25OdW1iZXIgXS51bFJCQVIgfD0gKCBwb3J0TVBVX1JFR0lPTl9FWEVDVVRFX05FVkVSICk7CisJCQkJfQorCisJCQkJLyogRW5kIEFkZHJlc3MuICovCisJCQkJeE1QVVNldHRpbmdzLT54UmVnaW9uc1NldHRpbmdzWyB1bFJlZ2lvbk51bWJlciBdLnVsUkxBUiA9CSggdWxSZWdpb25FbmRBZGRyZXNzICkgfAorCQkJCQkJCQkJCQkJCQkJCQkJCSggcG9ydE1QVV9STEFSX1JFR0lPTl9FTkFCTEUgKTsKKworCQkJCS8qIE5vcm1hbCBtZW1vcnkvIERldmljZSBtZW1vcnkuICovCisJCQkJaWYoICggeFJlZ2lvbnNbIGxJbmRleCBdLnVsUGFyYW1ldGVycyAmIHRza01QVV9SRUdJT05fREVWSUNFX01FTU9SWSApICE9IDAgKQorCQkJCXsKKwkJCQkJLyogQXR0cjEgaW4gTUFJUjAgaXMgY29uZmlndXJlZCBhcyBkZXZpY2UgbWVtb3J5LiAqLworCQkJCQl4TVBVU2V0dGluZ3MtPnhSZWdpb25zU2V0dGluZ3NbIHVsUmVnaW9uTnVtYmVyIF0udWxSTEFSIHw9IHBvcnRNUFVfUkxBUl9BVFRSX0lOREVYMTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJLyogQXR0cjEgaW4gTUFJUjAgaXMgY29uZmlndXJlZCBhcyBub3JtYWwgbWVtb3J5LiAqLworCQkJCQl4TVBVU2V0dGluZ3MtPnhSZWdpb25zU2V0dGluZ3NbIHVsUmVnaW9uTnVtYmVyIF0udWxSTEFSIHw9IHBvcnRNUFVfUkxBUl9BVFRSX0lOREVYMDsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLyogSW52YWxpZGF0ZSB0aGUgcmVnaW9uLiAqLworCQkJCXhNUFVTZXR0aW5ncy0+eFJlZ2lvbnNTZXR0aW5nc1sgdWxSZWdpb25OdW1iZXIgXS51bFJCQVIgPSAwVUw7CisJCQkJeE1QVVNldHRpbmdzLT54UmVnaW9uc1NldHRpbmdzWyB1bFJlZ2lvbk51bWJlciBdLnVsUkxBUiA9IDBVTDsKKwkJCX0KKworCQkJbEluZGV4Kys7CisJCX0KKwl9CisjZW5kaWYgLyogY29uZmlnRU5BQkxFX01QVSAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCmRpZmYgLS1naXQgYS9Tb3VyY2UvcG9ydGFibGUvR0NDL0FSTV9DTTMzX05UWi9ub25fc2VjdXJlL3BvcnRhc20uYyBiL1NvdXJjZS9wb3J0YWJsZS9HQ0MvQVJNX0NNMzNfTlRaL25vbl9zZWN1cmUvcG9ydGFzbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhNGE2OWMKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvcG9ydGFibGUvR0NDL0FSTV9DTTMzX05UWi9ub25fc2VjdXJlL3BvcnRhc20uYwpAQCAtMCwwICsxLDMyMSBAQAorLyoKKyAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMi4xCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgorICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KKyAqIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KKyAqIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mCisgKiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCisgKiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKKyAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTCisgKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IKKyAqIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUgorICogSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogaHR0cDovL3d3dy5GcmVlUlRPUy5vcmcKKyAqIGh0dHA6Ly9hd3MuYW1hem9uLmNvbS9mcmVlcnRvcworICoKKyAqIDEgdGFiID09IDQgc3BhY2VzIQorICovCisKKy8qIFN0YW5kYXJkIGluY2x1ZGVzLiAqLworI2luY2x1ZGUgPHN0ZGludC5oPgorCisvKiBEZWZpbmluZyBNUFVfV1JBUFBFUlNfSU5DTFVERURfRlJPTV9BUElfRklMRSBlbnN1cmVzIHRoYXQgUFJJVklMRUdFRF9GVU5DVElPTgorICogaXMgZGVmaW5lZCBjb3JyZWN0bHkgYW5kIHByaXZpbGVnZWQgZnVuY3Rpb25zIGFyZSBwbGFjZWQgaW4gY29ycmVjdCBzZWN0aW9ucy4gKi8KKyNkZWZpbmUgTVBVX1dSQVBQRVJTX0lOQ0xVREVEX0ZST01fQVBJX0ZJTEUKKworLyogUG9ydGFzbSBpbmNsdWRlcy4gKi8KKyNpbmNsdWRlICJwb3J0YXNtLmgiCisKKy8qIE1QVV9XUkFQUEVSU19JTkNMVURFRF9GUk9NX0FQSV9GSUxFIGlzIG5lZWRlZCB0byBiZSBkZWZpbmVkIG9ubHkgZm9yIHRoZQorICogaGVhZGVyIGZpbGVzLiAqLworI3VuZGVmIE1QVV9XUkFQUEVSU19JTkNMVURFRF9GUk9NX0FQSV9GSUxFCisKK3ZvaWQgdlJlc3RvcmVDb250ZXh0T2ZGaXJzdFRhc2soIHZvaWQgKSAvKiBfX2F0dHJpYnV0ZV9fICgoIG5ha2VkICkpIFBSSVZJTEVHRURfRlVOQ1RJT04gKi8KK3sKKwlfX2FzbSB2b2xhdGlsZQorCSgKKwkiCS5zeW50YXggdW5pZmllZAkJCQkJCQkJCVxuIgorCSIJCQkJCQkJCQkJCQkJXG4iCisJIglsZHIgIHIyLCBweEN1cnJlbnRUQ0JDb25zdDIJCQkJCQlcbiIgLyogUmVhZCB0aGUgbG9jYXRpb24gb2YgcHhDdXJyZW50VENCIGkuZS4gJiggcHhDdXJyZW50VENCICkuICovCisJIglsZHIgIHIxLCBbcjJdCQkJCQkJCQkJXG4iIC8qIFJlYWQgcHhDdXJyZW50VENCLiAqLworCSIJbGRyICByMCwgW3IxXQkJCQkJCQkJCVxuIiAvKiBSZWFkIHRvcCBvZiBzdGFjayBmcm9tIFRDQiAtIFRoZSBmaXJzdCBpdGVtIGluIHB4Q3VycmVudFRDQiBpcyB0aGUgdGFzayB0b3Agb2Ygc3RhY2suICovCisJIgkJCQkJCQkJCQkJCQlcbiIKKwkjaWYoIGNvbmZpZ0VOQUJMRV9NUFUgPT0gMSApCisJIglkbWIJCQkJCQkJCQkJCQlcbiIgLyogQ29tcGxldGUgb3V0c3RhbmRpbmcgdHJhbnNmZXJzIGJlZm9yZSBkaXNhYmxpbmcgTVBVLiAqLworCSIJbGRyIHIyLCB4TVBVQ1RSTENvbnN0MgkJCQkJCQlcbiIgLyogcjIgPSAweGUwMDBlZDk0IFtMb2NhdGlvbiBvZiBNUFVfQ1RSTF0uICovCisJIglsZHIgcjQsIFtyMl0JCQkJCQkJCQlcbiIgLyogUmVhZCB0aGUgdmFsdWUgb2YgTVBVX0NUUkwuICovCisJIgliaWMgcjQsICMxCQkJCQkJCQkJCVxuIiAvKiByNCA9IHI0ICYgfjEgaS5lLiBDbGVhciB0aGUgYml0IDAgaW4gcjQuICovCisJIglzdHIgcjQsIFtyMl0JCQkJCQkJCQlcbiIgLyogRGlzYWJsZSBNUFUuICovCisJIgkJCQkJCQkJCQkJCQlcbiIKKwkiCWFkZHMgcjEsICM0CQkJCQkJCQkJCVxuIiAvKiByMSA9IHIxICsgNC4gcjEgbm93IHBvaW50cyB0byBNQUlSMCBpbiBUQ0IuICovCisJIglsZHIgIHIzLCBbcjFdCQkJCQkJCQkJXG4iIC8qIHIzID0gKnIxIGkuZS4gcjMgPSBNQUlSMC4gKi8KKwkiCWxkciAgcjIsIHhNQUlSMENvbnN0MgkJCQkJCQlcbiIgLyogcjIgPSAweGUwMDBlZGMwIFtMb2NhdGlvbiBvZiBNQUlSMF0uICovCisJIglzdHIgIHIzLCBbcjJdCQkJCQkJCQkJXG4iIC8qIFByb2dyYW0gTUFJUjAuICovCisJIglsZHIgIHIyLCB4Uk5SQ29uc3QyCQkJCQkJCQlcbiIgLyogcjIgPSAweGUwMDBlZDk4IFtMb2NhdGlvbiBvZiBSTlJdLiAqLworCSIJbW92cyByMywgIzQJCQkJCQkJCQkJXG4iIC8qIHIzID0gNC4gKi8KKwkiCXN0ciAgcjMsIFtyMl0JCQkJCQkJCQlcbiIgLyogUHJvZ3JhbSBSTlIgPSA0LiAqLworCSIJYWRkcyByMSwgIzQJCQkJCQkJCQkJXG4iIC8qIHIxID0gcjEgKyA0LiByMSBub3cgcG9pbnRzIHRvIGZpcnN0IFJCQVIgaW4gVENCLiAqLworCSIJbGRyICByMiwgeFJCQVJDb25zdDIJCQkJCQkJXG4iIC8qIHIyID0gMHhlMDAwZWQ5YyBbTG9jYXRpb24gb2YgUkJBUl0uICovCisJIglsZG1pYSByMSEsIHtyNC1yMTF9CQkJCQkJCQlcbiIgLyogUmVhZCA0IHNldCBvZiBSQkFSL1JMQVIgcmVnaXN0ZXJzIGZyb20gVENCLiAqLworCSIJc3RtaWEgcjIhLCB7cjQtcjExfQkJCQkJCQkJXG4iIC8qIFdyaXRlIDQgc2V0IG9mIFJCQVIvUkxBUiByZWdpc3RlcnMgdXNpbmcgYWxpYXMgcmVnaXN0ZXJzLiAqLworCSIJCQkJCQkJCQkJCQkJXG4iCisJIglsZHIgcjIsIHhNUFVDVFJMQ29uc3QyCQkJCQkJCVxuIiAvKiByMiA9IDB4ZTAwMGVkOTQgW0xvY2F0aW9uIG9mIE1QVV9DVFJMXS4gKi8KKwkiCWxkciByNCwgW3IyXQkJCQkJCQkJCVxuIiAvKiBSZWFkIHRoZSB2YWx1ZSBvZiBNUFVfQ1RSTC4gKi8KKwkiCW9yciByNCwgIzEJCQkJCQkJCQkJXG4iIC8qIHI0ID0gcjQgfCAxIGkuZS4gU2V0IHRoZSBiaXQgMCBpbiByNC4gKi8KKwkiCXN0ciByNCwgW3IyXQkJCQkJCQkJCVxuIiAvKiBFbmFibGUgTVBVLiAqLworCSIJZHNiCQkJCQkJCQkJCQkJXG4iIC8qIEZvcmNlIG1lbW9yeSB3cml0ZXMgYmVmb3JlIGNvbnRpbnVpbmcuICovCisJI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9NUFUgKi8KKwkiCQkJCQkJCQkJCQkJCVxuIgorCSNpZiggY29uZmlnRU5BQkxFX01QVSA9PSAxICkKKwkiCWxkbSAgcjAhLCB7cjEtcjN9CQkJCQkJCQlcbiIgLyogUmVhZCBmcm9tIHN0YWNrIC0gcjEgPSBQU1BMSU0sIHIyID0gQ09OVFJPTCBhbmQgcjMgPSBFWENfUkVUVVJOLiAqLworCSIJbXNyICBwc3BsaW0sIHIxCQkJCQkJCQkJXG4iIC8qIFNldCB0aGlzIHRhc2sncyBQU1BMSU0gdmFsdWUuICovCisJIgltc3IgIGNvbnRyb2wsIHIyCQkJCQkJCQlcbiIgLyogU2V0IHRoaXMgdGFzaydzIENPTlRST0wgdmFsdWUuICovCisJIglhZGRzIHIwLCAjMzIJCQkJCQkJCQlcbiIgLyogRGlzY2FyZCBldmVyeXRoaW5nIHVwIHRvIHIwLiAqLworCSIJbXNyICBwc3AsIHIwCQkJCQkJCQkJXG4iIC8qIFRoaXMgaXMgbm93IHRoZSBuZXcgdG9wIG9mIHN0YWNrIHRvIHVzZSBpbiB0aGUgdGFzay4gKi8KKwkiCWlzYgkJCQkJCQkJCQkJCVxuIgorCSIJYnggICByMwkJCQkJCQkJCQkJXG4iIC8qIEZpbmFsbHksIGJyYW5jaCB0byBFWENfUkVUVVJOLiAqLworCSNlbHNlIC8qIGNvbmZpZ0VOQUJMRV9NUFUgKi8KKwkiCWxkbSAgcjAhLCB7cjEtcjJ9CQkJCQkJCQlcbiIgLyogUmVhZCBmcm9tIHN0YWNrIC0gcjEgPSBQU1BMSU0gYW5kIHIyID0gRVhDX1JFVFVSTi4gKi8KKwkiCW1zciAgcHNwbGltLCByMQkJCQkJCQkJCVxuIiAvKiBTZXQgdGhpcyB0YXNrJ3MgUFNQTElNIHZhbHVlLiAqLworCSIJbW92cyByMSwgIzIJCQkJCQkJCQkJXG4iIC8qIHIxID0gMi4gKi8KKwkiCW1zciAgQ09OVFJPTCwgcjEJCQkJCQkJCVxuIiAvKiBTd2l0Y2ggdG8gdXNlIFBTUCBpbiB0aGUgdGhyZWFkIG1vZGUuICovCisJIglhZGRzIHIwLCAjMzIJCQkJCQkJCQlcbiIgLyogRGlzY2FyZCBldmVyeXRoaW5nIHVwIHRvIHIwLiAqLworCSIJbXNyICBwc3AsIHIwCQkJCQkJCQkJXG4iIC8qIFRoaXMgaXMgbm93IHRoZSBuZXcgdG9wIG9mIHN0YWNrIHRvIHVzZSBpbiB0aGUgdGFzay4gKi8KKwkiCWlzYgkJCQkJCQkJCQkJCVxuIgorCSIJYnggICByMgkJCQkJCQkJCQkJXG4iIC8qIEZpbmFsbHksIGJyYW5jaCB0byBFWENfUkVUVVJOLiAqLworCSNlbmRpZiAvKiBjb25maWdFTkFCTEVfTVBVICovCisJIgkJCQkJCQkJCQkJCQlcbiIKKwkiCS5hbGlnbiA0CQkJCQkJCQkJCVxuIgorCSJweEN1cnJlbnRUQ0JDb25zdDI6IC53b3JkIHB4Q3VycmVudFRDQgkJCQlcbiIKKwkjaWYoIGNvbmZpZ0VOQUJMRV9NUFUgPT0gMSApCisJInhNUFVDVFJMQ29uc3QyOiAud29yZCAweGUwMDBlZDk0CQkJCQlcbiIKKwkieE1BSVIwQ29uc3QyOiAud29yZCAweGUwMDBlZGMwCQkJCQkJXG4iCisJInhSTlJDb25zdDI6IC53b3JkIDB4ZTAwMGVkOTgJCQkJCQlcbiIKKwkieFJCQVJDb25zdDI6IC53b3JkIDB4ZTAwMGVkOWMJCQkJCQlcbiIKKwkjZW5kaWYgLyogY29uZmlnRU5BQkxFX01QVSAqLworCSk7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworQmFzZVR5cGVfdCB4SXNQcml2aWxlZ2VkKCB2b2lkICkgLyogX19hdHRyaWJ1dGVfXyAoKCBuYWtlZCApKSAqLworeworCV9fYXNtIHZvbGF0aWxlCisJKAorCSIJbXJzIHIwLCBjb250cm9sCQkJCQkJCQkJXG4iIC8qIHIwID0gQ09OVFJPTC4gKi8KKwkiCXRzdCByMCwgIzEJCQkJCQkJCQkJXG4iIC8qIFBlcmZvcm0gcjAgJiAxIChiaXR3aXNlIEFORCkgYW5kIHVwZGF0ZSB0aGUgY29uZGl0aW9ucyBmbGFnLiAqLworCSIJaXRlIG5lCQkJCQkJCQkJCQlcbiIKKwkiCW1vdm5lIHIwLCAjMAkJCQkJCQkJCVxuIiAvKiBDT05UUk9MWzBdIT0wLiBSZXR1cm4gZmFsc2UgdG8gaW5kaWNhdGUgdGhhdCB0aGUgcHJvY2Vzc29yIGlzIG5vdCBwcml2aWxlZ2VkLiAqLworCSIJbW92ZXEgcjAsICMxCQkJCQkJCQkJXG4iIC8qIENPTlRST0xbMF09PTAuIFJldHVybiB0cnVlIHRvIGluZGljYXRlIHRoYXQgdGhlIHByb2Nlc3NvciBpcyBwcml2aWxlZ2VkLiAqLworCSIJYnggbHIJCQkJCQkJCQkJCVxuIiAvKiBSZXR1cm4uICovCisJIgkJCQkJCQkJCQkJCQlcbiIKKwkiCS5hbGlnbiA0CQkJCQkJCQkJCVxuIgorCTo6OiAicjAiLCAibWVtb3J5IgorCSk7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCB2UmFpc2VQcml2aWxlZ2UoIHZvaWQgKSAvKiBfX2F0dHJpYnV0ZV9fICgoIG5ha2VkICkpIFBSSVZJTEVHRURfRlVOQ1RJT04gKi8KK3sKKwkgX19hc20gdm9sYXRpbGUKKwkoCisJIgltcnMgIHIwLCBjb250cm9sCQkJCQkJCQlcbiIgLyogUmVhZCB0aGUgQ09OVFJPTCByZWdpc3Rlci4gKi8KKwkiCWJpYyByMCwgIzEJCQkJCQkJCQkJXG4iIC8qIENsZWFyIHRoZSBiaXQgMC4gKi8KKwkiCW1zciAgY29udHJvbCwgcjAJCQkJCQkJCVxuIiAvKiBXcml0ZSBiYWNrIHRoZSBuZXcgQ09OVFJPTCB2YWx1ZS4gKi8KKwkiCWJ4IGxyCQkJCQkJCQkJCQlcbiIgLyogUmV0dXJuIHRvIHRoZSBjYWxsZXIuICovCisJOjo6ICJyMCIsICJtZW1vcnkiCisJKTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIHZSZXNldFByaXZpbGVnZSggdm9pZCApIC8qIF9fYXR0cmlidXRlX18gKCggbmFrZWQgKSkgKi8KK3sKKwlfX2FzbSB2b2xhdGlsZQorCSgKKwkiCW1ycyByMCwgY29udHJvbAkJCQkJCQkJCVxuIiAvKiByMCA9IENPTlRST0wuICovCisJIglvcnIgcjAsICMxCQkJCQkJCQkJCVxuIiAvKiByMCA9IHIwIHwgMS4gKi8KKwkiCW1zciBjb250cm9sLCByMAkJCQkJCQkJCVxuIiAvKiBDT05UUk9MID0gcjAuICovCisJIglieCBscgkJCQkJCQkJCQkJXG4iIC8qIFJldHVybiB0byB0aGUgY2FsbGVyLiAqLworCTo6OiJyMCIsICJtZW1vcnkiCisJKTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIHZTdGFydEZpcnN0VGFzayggdm9pZCApIC8qIF9fYXR0cmlidXRlX18gKCggbmFrZWQgKSkgUFJJVklMRUdFRF9GVU5DVElPTiAqLworeworCV9fYXNtIHZvbGF0aWxlCisJKAorCSIJbGRyIHIwLCB4VlRPUkNvbnN0CQkJCQkJCQlcbiIgLyogVXNlIHRoZSBOVklDIG9mZnNldCByZWdpc3RlciB0byBsb2NhdGUgdGhlIHN0YWNrLiAqLworCSIJbGRyIHIwLCBbcjBdCQkJCQkJCQkJXG4iIC8qIFJlYWQgdGhlIFZUT1IgcmVnaXN0ZXIgd2hpY2ggZ2l2ZXMgdGhlIGFkZHJlc3Mgb2YgdmVjdG9yIHRhYmxlLiAqLworCSIJbGRyIHIwLCBbcjBdCQkJCQkJCQkJXG4iIC8qIFRoZSBmaXJzdCBlbnRyeSBpbiB2ZWN0b3IgdGFibGUgaXMgc3RhY2sgcG9pbnRlci4gKi8KKwkiCW1zciBtc3AsIHIwCQkJCQkJCQkJCVxuIiAvKiBTZXQgdGhlIE1TUCBiYWNrIHRvIHRoZSBzdGFydCBvZiB0aGUgc3RhY2suICovCisJIgljcHNpZSBpCQkJCQkJCQkJCQlcbiIgLyogR2xvYmFsbHkgZW5hYmxlIGludGVycnVwdHMuICovCisJIgljcHNpZSBmCQkJCQkJCQkJCQlcbiIKKwkiCWRzYgkJCQkJCQkJCQkJCVxuIgorCSIJaXNiCQkJCQkJCQkJCQkJXG4iCisJIglzdmMgJTAJCQkJCQkJCQkJCVxuIiAvKiBTeXN0ZW0gY2FsbCB0byBzdGFydCB0aGUgZmlyc3QgdGFzay4gKi8KKwkiCW5vcAkJCQkJCQkJCQkJCVxuIgorCSIJCQkJCQkJCQkJCQkJXG4iCisJIiAgIC5hbGlnbiA0CQkJCQkJCQkJCVxuIgorCSJ4VlRPUkNvbnN0OiAud29yZCAweGUwMDBlZDA4CQkJCQkJXG4iCisJOjogImkiICggcG9ydFNWQ19TVEFSVF9TQ0hFRFVMRVIgKSA6ICJtZW1vcnkiCisJKTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1aW50MzJfdCB1bFNldEludGVycnVwdE1hc2tGcm9tSVNSKCB2b2lkICkgLyogX19hdHRyaWJ1dGVfXygoIG5ha2VkICkpIFBSSVZJTEVHRURfRlVOQ1RJT04gKi8KK3sKKwlfX2FzbSB2b2xhdGlsZQorCSgKKwkiCW1ycyByMCwgUFJJTUFTSwkJCQkJCQkJCVxuIgorCSIJY3BzaWQgaQkJCQkJCQkJCQkJXG4iCisJIglieCBscgkJCQkJCQkJCQkJXG4iCisJOjo6ICJtZW1vcnkiCisJKTsKKworI2lmICFkZWZpbmVkIChfX0FSTUNDX1ZFUlNJT04pICYmIChfX0FSTUNDX1ZFUlNJT04gPj0gNjAxMDA1MCkKKwkvKiBUbyBhdm9pZCBjb21waWxlciB3YXJuaW5ncy4gIFRoZSByZXR1cm4gc3RhdGVtZW50IHdpbGwgbmV2ZXIgYmUgcmVhY2hlZCwKKwkgKiBidXQgc29tZSBjb21waWxlcnMgd2FybiBpZiBpdCBpcyBub3QgaW5jbHVkZWQsIHdoaWxlIG90aGVycyB3b24ndCBjb21waWxlCisJICogaWYgaXQgaXMuICovCisJcmV0dXJuIDA7CisjZW5kaWYKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIHZDbGVhckludGVycnVwdE1hc2tGcm9tSVNSKCBfX2F0dHJpYnV0ZV9fKCAoIHVudXNlZCApICkgdWludDMyX3QgdWxNYXNrICkgLyogX19hdHRyaWJ1dGVfXygoIG5ha2VkICkpIFBSSVZJTEVHRURfRlVOQ1RJT04gKi8KK3sKKwlfX2FzbSB2b2xhdGlsZQorCSgKKwkiCW1zciBQUklNQVNLLCByMAkJCQkJCQkJCVxuIgorCSIJYnggbHIJCQkJCQkJCQkJCVxuIgorCTo6OiAibWVtb3J5IgorCSk7CisKKyNpZiAhZGVmaW5lZCAoX19BUk1DQ19WRVJTSU9OKSAmJiAoX19BUk1DQ19WRVJTSU9OID49IDYwMTAwNTApCisJLyogSnVzdCB0byBhdm9pZCBjb21waWxlciB3YXJuaW5nLiAgdWxNYXNrIGlzIHVzZWQgZnJvbSB0aGUgYXNtIGNvZGUgYnV0CisJICogdGhlIGNvbXBpbGVyIGNhbid0IHNlZSB0aGF0LiAgU29tZSBjb21waWxlcnMgZ2VuZXJhdGUgd2FybmluZ3Mgd2l0aG91dAorCSAqIHRoZSBmb2xsb3dpbmcgbGluZSwgd2hpbGUgb3RoZXJzIGdlbmVyYXRlIHdhcm5pbmdzIGlmIHRoZSBsaW5lIGlzCisJICogaW5jbHVkZWQuICovCisJKCB2b2lkICkgdWxNYXNrOworI2VuZGlmCit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBQZW5kU1ZfSGFuZGxlciggdm9pZCApIC8qIF9fYXR0cmlidXRlX18gKCggbmFrZWQgKSkgUFJJVklMRUdFRF9GVU5DVElPTiAqLworeworCV9fYXNtIHZvbGF0aWxlCisJKAorCSIJLnN5bnRheCB1bmlmaWVkCQkJCQkJCQkJXG4iCisJIgkJCQkJCQkJCQkJCQlcbiIKKwkiCW1ycyByMCwgcHNwCQkJCQkJCQkJCVxuIiAvKiBSZWFkIFBTUCBpbiByMC4gKi8KKwkjaWYoIGNvbmZpZ0VOQUJMRV9GUFUgPT0gMSApCisJIgl0c3QgbHIsICMweDEwCQkJCQkJCQkJXG4iIC8qIFRlc3QgQml0WzRdIGluIExSLiBCaXRbNF0gb2YgRVhDX1JFVFVSTiBpcyAwIGlmIHRoZSBGUFUgaXMgaW4gdXNlLiAqLworCSIJaXQgZXEJCQkJCQkJCQkJCVxuIgorCSIJdnN0bWRiZXEgcjAhLCB7czE2LXMzMX0JCQkJCQkJXG4iIC8qIFN0b3JlIHRoZSBGUFUgcmVnaXN0ZXJzIHdoaWNoIGFyZSBub3Qgc2F2ZWQgYXV0b21hdGljYWxseS4gKi8KKwkjZW5kaWYgLyogY29uZmlnRU5BQkxFX0ZQVSAqLworCSNpZiggY29uZmlnRU5BQkxFX01QVSA9PSAxICkKKwkiCW1ycyByMSwgcHNwbGltCQkJCQkJCQkJXG4iIC8qIHIxID0gUFNQTElNLiAqLworCSIJbXJzIHIyLCBjb250cm9sCQkJCQkJCQkJXG4iIC8qIHIyID0gQ09OVFJPTC4gKi8KKwkiCW1vdiByMywgbHIJCQkJCQkJCQkJXG4iIC8qIHIzID0gTFIvRVhDX1JFVFVSTi4gKi8KKwkiCXN0bWRiIHIwISwge3IxLXIxMX0JCQkJCQkJCVxuIiAvKiBTdG9yZSBvbiB0aGUgc3RhY2sgLSBQU1BMSU0sIENPTlRST0wsIExSIGFuZCByZWdpc3RlcnMgdGhhdCBhcmUgbm90IGF1dG9tYXRpY2FsbHkgc2F2ZWQuICovCisJI2Vsc2UgLyogY29uZmlnRU5BQkxFX01QVSAqLworCSIJbXJzIHIyLCBwc3BsaW0JCQkJCQkJCQlcbiIgLyogcjIgPSBQU1BMSU0uICovCisJIgltb3YgcjMsIGxyCQkJCQkJCQkJCVxuIiAvKiByMyA9IExSL0VYQ19SRVRVUk4uICovCisJIglzdG1kYiByMCEsIHtyMi1yMTF9CQkJCQkJCQlcbiIgLyogU3RvcmUgb24gdGhlIHN0YWNrIC0gUFNQTElNLCBMUiBhbmQgcmVnaXN0ZXJzIHRoYXQgYXJlIG5vdCBhdXRvbWF0aWNhbGx5IHNhdmVkLiAqLworCSNlbmRpZiAvKiBjb25maWdFTkFCTEVfTVBVICovCisJIgkJCQkJCQkJCQkJCQlcbiIKKwkiCWxkciByMiwgcHhDdXJyZW50VENCQ29uc3QJCQkJCQlcbiIgLyogUmVhZCB0aGUgbG9jYXRpb24gb2YgcHhDdXJyZW50VENCIGkuZS4gJiggcHhDdXJyZW50VENCICkuICovCisJIglsZHIgcjEsIFtyMl0JCQkJCQkJCQlcbiIgLyogUmVhZCBweEN1cnJlbnRUQ0IuICovCisJIglzdHIgcjAsIFtyMV0JCQkJCQkJCQlcbiIgLyogU2F2ZSB0aGUgbmV3IHRvcCBvZiBzdGFjayBpbiBUQ0IuICovCisJIgkJCQkJCQkJCQkJCQlcbiIKKwkiCWNwc2lkIGkJCQkJCQkJCQkJCVxuIgorCSIJYmwgdlRhc2tTd2l0Y2hDb250ZXh0CQkJCQkJCVxuIgorCSIJY3BzaWUgaQkJCQkJCQkJCQkJXG4iCisJIgkJCQkJCQkJCQkJCQlcbiIKKwkiCWxkciByMiwgcHhDdXJyZW50VENCQ29uc3QJCQkJCQlcbiIgLyogUmVhZCB0aGUgbG9jYXRpb24gb2YgcHhDdXJyZW50VENCIGkuZS4gJiggcHhDdXJyZW50VENCICkuICovCisJIglsZHIgcjEsIFtyMl0JCQkJCQkJCQlcbiIgLyogUmVhZCBweEN1cnJlbnRUQ0IuICovCisJIglsZHIgcjAsIFtyMV0JCQkJCQkJCQlcbiIgLyogVGhlIGZpcnN0IGl0ZW0gaW4gcHhDdXJyZW50VENCIGlzIHRoZSB0YXNrIHRvcCBvZiBzdGFjay4gcjAgbm93IHBvaW50cyB0byB0aGUgdG9wIG9mIHN0YWNrLiAqLworCSIJCQkJCQkJCQkJCQkJXG4iCisJI2lmKCBjb25maWdFTkFCTEVfTVBVID09IDEgKQorCSIJZG1iCQkJCQkJCQkJCQkJXG4iIC8qIENvbXBsZXRlIG91dHN0YW5kaW5nIHRyYW5zZmVycyBiZWZvcmUgZGlzYWJsaW5nIE1QVS4gKi8KKwkiCWxkciByMiwgeE1QVUNUUkxDb25zdAkJCQkJCQlcbiIgLyogcjIgPSAweGUwMDBlZDk0IFtMb2NhdGlvbiBvZiBNUFVfQ1RSTF0uICovCisJIglsZHIgcjQsIFtyMl0JCQkJCQkJCQlcbiIgLyogUmVhZCB0aGUgdmFsdWUgb2YgTVBVX0NUUkwuICovCisJIgliaWMgcjQsICMxCQkJCQkJCQkJCVxuIiAvKiByNCA9IHI0ICYgfjEgaS5lLiBDbGVhciB0aGUgYml0IDAgaW4gcjQuICovCisJIglzdHIgcjQsIFtyMl0JCQkJCQkJCQlcbiIgLyogRGlzYWJsZSBNUFUuICovCisJIgkJCQkJCQkJCQkJCQlcbiIKKwkiCWFkZHMgcjEsICM0CQkJCQkJCQkJCVxuIiAvKiByMSA9IHIxICsgNC4gcjEgbm93IHBvaW50cyB0byBNQUlSMCBpbiBUQ0IuICovCisJIglsZHIgcjMsIFtyMV0JCQkJCQkJCQlcbiIgLyogcjMgPSAqcjEgaS5lLiByMyA9IE1BSVIwLiAqLworCSIJbGRyIHIyLCB4TUFJUjBDb25zdAkJCQkJCQkJXG4iIC8qIHIyID0gMHhlMDAwZWRjMCBbTG9jYXRpb24gb2YgTUFJUjBdLiAqLworCSIJc3RyIHIzLCBbcjJdCQkJCQkJCQkJXG4iIC8qIFByb2dyYW0gTUFJUjAuICovCisJIglsZHIgcjIsIHhSTlJDb25zdAkJCQkJCQkJXG4iIC8qIHIyID0gMHhlMDAwZWQ5OCBbTG9jYXRpb24gb2YgUk5SXS4gKi8KKwkiCW1vdnMgcjMsICM0CQkJCQkJCQkJCVxuIiAvKiByMyA9IDQuICovCisJIglzdHIgcjMsIFtyMl0JCQkJCQkJCQlcbiIgLyogUHJvZ3JhbSBSTlIgPSA0LiAqLworCSIJYWRkcyByMSwgIzQJCQkJCQkJCQkJXG4iIC8qIHIxID0gcjEgKyA0LiByMSBub3cgcG9pbnRzIHRvIGZpcnN0IFJCQVIgaW4gVENCLiAqLworCSIJbGRyIHIyLCB4UkJBUkNvbnN0CQkJCQkJCQlcbiIgLyogcjIgPSAweGUwMDBlZDljIFtMb2NhdGlvbiBvZiBSQkFSXS4gKi8KKwkiCWxkbWlhIHIxISwge3I0LXIxMX0JCQkJCQkJCVxuIiAvKiBSZWFkIDQgc2V0cyBvZiBSQkFSL1JMQVIgcmVnaXN0ZXJzIGZyb20gVENCLiAqLworCSIJc3RtaWEgcjIhLCB7cjQtcjExfQkJCQkJCQkJXG4iIC8qIFdyaXRlIDQgc2V0IG9mIFJCQVIvUkxBUiByZWdpc3RlcnMgdXNpbmcgYWxpYXMgcmVnaXN0ZXJzLiAqLworCSIJCQkJCQkJCQkJCQkJXG4iCisJIglsZHIgcjIsIHhNUFVDVFJMQ29uc3QJCQkJCQkJXG4iIC8qIHIyID0gMHhlMDAwZWQ5NCBbTG9jYXRpb24gb2YgTVBVX0NUUkxdLiAqLworCSIJbGRyIHI0LCBbcjJdCQkJCQkJCQkJXG4iIC8qIFJlYWQgdGhlIHZhbHVlIG9mIE1QVV9DVFJMLiAqLworCSIJb3JyIHI0LCAjMQkJCQkJCQkJCQlcbiIgLyogcjQgPSByNCB8IDEgaS5lLiBTZXQgdGhlIGJpdCAwIGluIHI0LiAqLworCSIJc3RyIHI0LCBbcjJdCQkJCQkJCQkJXG4iIC8qIEVuYWJsZSBNUFUuICovCisJIglkc2IJCQkJCQkJCQkJCQlcbiIgLyogRm9yY2UgbWVtb3J5IHdyaXRlcyBiZWZvcmUgY29udGludWluZy4gKi8KKwkjZW5kaWYgLyogY29uZmlnRU5BQkxFX01QVSAqLworCSIJCQkJCQkJCQkJCQkJXG4iCisJI2lmKCBjb25maWdFTkFCTEVfTVBVID09IDEgKQorCSIJbGRtaWEgcjAhLCB7cjEtcjExfQkJCQkJCQkJXG4iIC8qIFJlYWQgZnJvbSBzdGFjayAtIHIxID0gUFNQTElNLCByMiA9IENPTlRST0wsIHIzID0gTFIgYW5kIHI0LXIxMSByZXN0b3JlZC4gKi8KKwkjZWxzZSAvKiBjb25maWdFTkFCTEVfTVBVICovCisJIglsZG1pYSByMCEsIHtyMi1yMTF9CQkJCQkJCQlcbiIgLyogUmVhZCBmcm9tIHN0YWNrIC0gcjIgPSBQU1BMSU0sIHIzID0gTFIgYW5kIHI0LXIxMSByZXN0b3JlZC4gKi8KKwkjZW5kaWYgLyogY29uZmlnRU5BQkxFX01QVSAqLworCSIJCQkJCQkJCQkJCQkJXG4iCisJI2lmKCBjb25maWdFTkFCTEVfRlBVID09IDEgKQorCSIJdHN0IHIzLCAjMHgxMAkJCQkJCQkJCVxuIiAvKiBUZXN0IEJpdFs0XSBpbiBMUi4gQml0WzRdIG9mIEVYQ19SRVRVUk4gaXMgMCBpZiB0aGUgRlBVIGlzIGluIHVzZS4gKi8KKwkiCWl0IGVxCQkJCQkJCQkJCQlcbiIKKwkiCXZsZG1pYWVxIHIwISwge3MxNi1zMzF9CQkJCQkJCVxuIiAvKiBSZXN0b3JlIHRoZSBGUFUgcmVnaXN0ZXJzIHdoaWNoIGFyZSBub3QgcmVzdG9yZWQgYXV0b21hdGljYWxseS4gKi8KKwkjZW5kaWYgLyogY29uZmlnRU5BQkxFX0ZQVSAqLworCSIJCQkJCQkJCQkJCQkJXG4iCisJI2lmKCBjb25maWdFTkFCTEVfTVBVID09IDEgKQorCSIJbXNyIHBzcGxpbSwgcjEJCQkJCQkJCQlcbiIgLyogUmVzdG9yZSB0aGUgUFNQTElNIHJlZ2lzdGVyIHZhbHVlIGZvciB0aGUgdGFzay4gKi8KKwkiCW1zciBjb250cm9sLCByMgkJCQkJCQkJCVxuIiAvKiBSZXN0b3JlIHRoZSBDT05UUk9MIHJlZ2lzdGVyIHZhbHVlIGZvciB0aGUgdGFzay4gKi8KKwkjZWxzZSAvKiBjb25maWdFTkFCTEVfTVBVICovCisJIgltc3IgcHNwbGltLCByMgkJCQkJCQkJCVxuIiAvKiBSZXN0b3JlIHRoZSBQU1BMSU0gcmVnaXN0ZXIgdmFsdWUgZm9yIHRoZSB0YXNrLiAqLworCSNlbmRpZiAvKiBjb25maWdFTkFCTEVfTVBVICovCisJIgltc3IgcHNwLCByMAkJCQkJCQkJCQlcbiIgLyogUmVtZW1iZXIgdGhlIG5ldyB0b3Agb2Ygc3RhY2sgZm9yIHRoZSB0YXNrLiAqLworCSIJYnggcjMJCQkJCQkJCQkJCVxuIgorCSIJCQkJCQkJCQkJCQkJXG4iCisJIgkuYWxpZ24gNAkJCQkJCQkJCQlcbiIKKwkicHhDdXJyZW50VENCQ29uc3Q6IC53b3JkIHB4Q3VycmVudFRDQgkJCQlcbiIKKwkjaWYoIGNvbmZpZ0VOQUJMRV9NUFUgPT0gMSApCisJInhNUFVDVFJMQ29uc3Q6IC53b3JkIDB4ZTAwMGVkOTQJCQkJCVxuIgorCSJ4TUFJUjBDb25zdDogLndvcmQgMHhlMDAwZWRjMAkJCQkJCVxuIgorCSJ4Uk5SQ29uc3Q6IC53b3JkIDB4ZTAwMGVkOTgJCQkJCQlcbiIKKwkieFJCQVJDb25zdDogLndvcmQgMHhlMDAwZWQ5YwkJCQkJCVxuIgorCSNlbmRpZiAvKiBjb25maWdFTkFCTEVfTVBVICovCisJKTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIFNWQ19IYW5kbGVyKCB2b2lkICkgLyogX19hdHRyaWJ1dGVfXyAoKCBuYWtlZCApKSBQUklWSUxFR0VEX0ZVTkNUSU9OICovCit7CisJX19hc20gdm9sYXRpbGUKKwkoCisJIgl0c3QgbHIsICM0CQkJCQkJCQkJCVxuIgorCSIJaXRlIGVxCQkJCQkJCQkJCQlcbiIKKwkiCW1yc2VxIHIwLCBtc3AJCQkJCQkJCQlcbiIKKwkiCW1yc25lIHIwLCBwc3AJCQkJCQkJCQlcbiIKKwkiCWxkciByMSwgc3ZjaGFuZGxlcl9hZGRyZXNzX2NvbnN0CQkJCVxuIgorCSIJYnggcjEJCQkJCQkJCQkJCVxuIgorCSIJCQkJCQkJCQkJCQkJXG4iCisJIgkuYWxpZ24gNAkJCQkJCQkJCQlcbiIKKwkic3ZjaGFuZGxlcl9hZGRyZXNzX2NvbnN0OiAud29yZCB2UG9ydFNWQ0hhbmRsZXJfQwlcbiIKKwkpOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCmRpZmYgLS1naXQgYS9Tb3VyY2UvcG9ydGFibGUvR0NDL0FSTV9DTTMzX05UWi9ub25fc2VjdXJlL3BvcnRhc20uaCBiL1NvdXJjZS9wb3J0YWJsZS9HQ0MvQVJNX0NNMzNfTlRaL25vbl9zZWN1cmUvcG9ydGFzbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlY2YwNGUKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvcG9ydGFibGUvR0NDL0FSTV9DTTMzX05UWi9ub25fc2VjdXJlL3BvcnRhc20uaApAQCAtMCwwICsxLDExMyBAQAorLyoKKyAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMi4xCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgorICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KKyAqIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KKyAqIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mCisgKiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCisgKiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKKyAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTCisgKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IKKyAqIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUgorICogSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogaHR0cDovL3d3dy5GcmVlUlRPUy5vcmcKKyAqIGh0dHA6Ly9hd3MuYW1hem9uLmNvbS9mcmVlcnRvcworICoKKyAqIDEgdGFiID09IDQgc3BhY2VzIQorICovCisKKyNpZm5kZWYgX19QT1JUX0FTTV9IX18KKyNkZWZpbmUgX19QT1JUX0FTTV9IX18KKworLyogU2NoZWR1bGVyIGluY2x1ZGVzLiAqLworI2luY2x1ZGUgIkZyZWVSVE9TLmgiCisKKy8qIE1QVSB3cmFwcGVycyBpbmNsdWRlcy4gKi8KKyNpbmNsdWRlICJtcHVfd3JhcHBlcnMuaCIKKworLyoqCisgKiBAYnJpZWYgUmVzdG9yZSB0aGUgY29udGV4dCBvZiB0aGUgZmlyc3QgdGFzayBzbyB0aGF0IHRoZSBmaXJzdCB0YXNrIHN0YXJ0cworICogZXhlY3V0aW5nLgorICovCit2b2lkIHZSZXN0b3JlQ29udGV4dE9mRmlyc3RUYXNrKCB2b2lkICkgX19hdHRyaWJ1dGVfXyAoKCBuYWtlZCApKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisvKioKKyAqIEBicmllZiBDaGVja3Mgd2hldGhlciBvciBub3QgdGhlIHByb2Nlc3NvciBpcyBwcml2aWxlZ2VkLgorICoKKyAqIEByZXR1cm4gMSBpZiB0aGUgcHJvY2Vzc29yIGlzIGFscmVhZHkgcHJpdmlsZWdlZCwgMCBvdGhlcndpc2UuCisgKi8KK0Jhc2VUeXBlX3QgeElzUHJpdmlsZWdlZCggdm9pZCApIF9fYXR0cmlidXRlX18gKCggbmFrZWQgKSk7CisKKy8qKgorICogQGJyaWVmIFJhaXNlcyB0aGUgcHJpdmlsZWdlIGxldmVsIGJ5IGNsZWFyaW5nIHRoZSBiaXQgMCBvZiB0aGUgQ09OVFJPTAorICogcmVnaXN0ZXIuCisgKgorICogQG5vdGUgVGhpcyBpcyBhIHByaXZpbGVnZWQgZnVuY3Rpb24gYW5kIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBmcm9tIHRoZSBrZW5yZWwKKyAqIGNvZGUuCisgKgorICogQml0IDAgb2YgdGhlIENPTlRST0wgcmVnaXN0ZXIgZGVmaW5lcyB0aGUgcHJpdmlsZWdlIGxldmVsIG9mIFRocmVhZCBNb2RlLgorICogIEJpdFswXSA9IDAgLS0+IFRoZSBwcm9jZXNzb3IgaXMgcnVubmluZyBwcml2aWxlZ2VkCisgKiAgQml0WzBdID0gMSAtLT4gVGhlIHByb2Nlc3NvciBpcyBydW5uaW5nIHVucHJpdmlsZWdlZC4KKyAqLwordm9pZCB2UmFpc2VQcml2aWxlZ2UoIHZvaWQgKSBfX2F0dHJpYnV0ZV9fICgoIG5ha2VkICkpIFBSSVZJTEVHRURfRlVOQ1RJT047CisKKy8qKgorICogQGJyaWVmIExvd2VycyB0aGUgcHJpdmlsZWdlIGxldmVsIGJ5IHNldHRpbmcgdGhlIGJpdCAwIG9mIHRoZSBDT05UUk9MCisgKiByZWdpc3Rlci4KKyAqCisgKiBCaXQgMCBvZiB0aGUgQ09OVFJPTCByZWdpc3RlciBkZWZpbmVzIHRoZSBwcml2aWxlZ2UgbGV2ZWwgb2YgVGhyZWFkIE1vZGUuCisgKiAgQml0WzBdID0gMCAtLT4gVGhlIHByb2Nlc3NvciBpcyBydW5uaW5nIHByaXZpbGVnZWQKKyAqICBCaXRbMF0gPSAxIC0tPiBUaGUgcHJvY2Vzc29yIGlzIHJ1bm5pbmcgdW5wcml2aWxlZ2VkLgorICovCit2b2lkIHZSZXNldFByaXZpbGVnZSggdm9pZCApIF9fYXR0cmlidXRlX18gKCggbmFrZWQgKSk7CisKKy8qKgorICogQGJyaWVmIFN0YXJ0cyB0aGUgZmlyc3QgdGFzay4KKyAqLwordm9pZCB2U3RhcnRGaXJzdFRhc2soIHZvaWQgKSBfX2F0dHJpYnV0ZV9fICgoIG5ha2VkICkpIFBSSVZJTEVHRURfRlVOQ1RJT047CisKKy8qKgorICogQGJyaWVmIERpc2FibGVzIGludGVycnVwdHMuCisgKi8KK3VpbnQzMl90IHVsU2V0SW50ZXJydXB0TWFza0Zyb21JU1IoIHZvaWQgKSBfX2F0dHJpYnV0ZV9fKCggbmFrZWQgKSkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworLyoqCisgKiBAYnJpZWYgRW5hYmxlcyBpbnRlcnJ1cHRzLgorICovCit2b2lkIHZDbGVhckludGVycnVwdE1hc2tGcm9tSVNSKCB1aW50MzJfdCB1bE1hc2sgKSBfX2F0dHJpYnV0ZV9fKCggbmFrZWQgKSkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworLyoqCisgKiBAYnJpZWYgUGVuZFNWIEV4Y2VwdGlvbiBoYW5kbGVyLgorICovCit2b2lkIFBlbmRTVl9IYW5kbGVyKCB2b2lkICkgX19hdHRyaWJ1dGVfXyAoKCBuYWtlZCApKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisvKioKKyAqIEBicmllZiBTVkMgSGFuZGxlci4KKyAqLwordm9pZCBTVkNfSGFuZGxlciggdm9pZCApIF9fYXR0cmlidXRlX18gKCggbmFrZWQgKSkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworLyoqCisgKiBAYnJpZWYgQWxsb2NhdGUgYSBTZWN1cmUgY29udGV4dCBmb3IgdGhlIGNhbGxpbmcgdGFzay4KKyAqCisgKiBAcGFyYW1baW5dIHVsU2VjdXJlU3RhY2tTaXplIFRoZSBzaXplIG9mIHRoZSBzdGFjayB0byBiZSBhbGxvY2F0ZWQgb24gdGhlCisgKiBzZWN1cmUgc2lkZSBmb3IgdGhlIGNhbGxpbmcgdGFzay4KKyAqLwordm9pZCB2UG9ydEFsbG9jYXRlU2VjdXJlQ29udGV4dCggdWludDMyX3QgdWxTZWN1cmVTdGFja1NpemUgKSBfX2F0dHJpYnV0ZV9fICgoIG5ha2VkICkpOworCisvKioKKyAqIEBicmllZiBGcmVlIHRoZSB0YXNrJ3Mgc2VjdXJlIGNvbnRleHQuCisgKgorICogQHBhcmFtW2luXSBwdWxUQ0IgUG9pbnRlciB0byB0aGUgVGFzayBDb250cm9sIEJsb2NrIChUQ0IpIG9mIHRoZSB0YXNrLgorICovCit2b2lkIHZQb3J0RnJlZVNlY3VyZUNvbnRleHQoIHVpbnQzMl90ICpwdWxUQ0IgKSBfX2F0dHJpYnV0ZV9fICgoIG5ha2VkICkpIFBSSVZJTEVHRURfRlVOQ1RJT047CisKKyNlbmRpZiAvKiBfX1BPUlRfQVNNX0hfXyAqLwpkaWZmIC0tZ2l0IGEvU291cmNlL3BvcnRhYmxlL0dDQy9BUk1fQ00zM19OVFovbm9uX3NlY3VyZS9wb3J0bWFjcm8uaCBiL1NvdXJjZS9wb3J0YWJsZS9HQ0MvQVJNX0NNMzNfTlRaL25vbl9zZWN1cmUvcG9ydG1hY3JvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA1MWRkYwotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9wb3J0YWJsZS9HQ0MvQVJNX0NNMzNfTlRaL25vbl9zZWN1cmUvcG9ydG1hY3JvLmgKQEAgLTAsMCArMSwyOTkgQEAKKy8qCisgKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjIuMQorICogQ29weXJpZ2h0IChDKSAyMDE5IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKKyAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCisgKiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCisgKiB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZgorICogdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLAorICogc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCisgKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUworICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SCisgKiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIKKyAqIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIGh0dHA6Ly93d3cuRnJlZVJUT1Mub3JnCisgKiBodHRwOi8vYXdzLmFtYXpvbi5jb20vZnJlZXJ0b3MKKyAqCisgKiAxIHRhYiA9PSA0IHNwYWNlcyEKKyAqLworCisjaWZuZGVmIFBPUlRNQUNST19ICisjZGVmaW5lIFBPUlRNQUNST19ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFBvcnQgc3BlY2lmaWMgZGVmaW5pdGlvbnMuCisgKgorICogVGhlIHNldHRpbmdzIGluIHRoaXMgZmlsZSBjb25maWd1cmUgRnJlZVJUT1MgY29ycmVjdGx5IGZvciB0aGUgZ2l2ZW4gaGFyZHdhcmUKKyAqIGFuZCBjb21waWxlci4KKyAqCisgKiBUaGVzZSBzZXR0aW5ncyBzaG91bGQgbm90IGJlIGFsdGVyZWQuCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKyNpZm5kZWYgY29uZmlnRU5BQkxFX0ZQVQorCSNlcnJvciBjb25maWdFTkFCTEVfRlBVIG11c3QgYmUgZGVmaW5lZCBpbiBGcmVlUlRPU0NvbmZpZy5oLiAgU2V0IGNvbmZpZ0VOQUJMRV9GUFUgdG8gMSB0byBlbmFibGUgdGhlIEZQVSBvciAwIHRvIGRpc2FibGUgdGhlIEZQVS4KKyNlbmRpZiAvKiBjb25maWdFTkFCTEVfRlBVICovCisKKyNpZm5kZWYgY29uZmlnRU5BQkxFX01QVQorCSNlcnJvciBjb25maWdFTkFCTEVfTVBVIG11c3QgYmUgZGVmaW5lZCBpbiBGcmVlUlRPU0NvbmZpZy5oLiAgU2V0IGNvbmZpZ0VOQUJMRV9NUFUgdG8gMSB0byBlbmFibGUgdGhlIE1QVSBvciAwIHRvIGRpc2FibGUgdGhlIE1QVS4KKyNlbmRpZiAvKiBjb25maWdFTkFCTEVfTVBVICovCisKKyNpZm5kZWYgY29uZmlnRU5BQkxFX1RSVVNUWk9ORQorCSNlcnJvciBjb25maWdFTkFCTEVfVFJVU1RaT05FIG11c3QgYmUgZGVmaW5lZCBpbiBGcmVlUlRPU0NvbmZpZy5oLiAgU2V0IGNvbmZpZ0VOQUJMRV9UUlVTVFpPTkUgdG8gMSB0byBlbmFibGUgVHJ1c3Rab25lIG9yIDAgdG8gZGlzYWJsZSBUcnVzdFpvbmUuCisjZW5kaWYgLyogY29uZmlnRU5BQkxFX1RSVVNUWk9ORSAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqCisgKiBAYnJpZWYgVHlwZSBkZWZpbml0aW9ucy4KKyAqLworI2RlZmluZSBwb3J0Q0hBUgkJCQkJCQkJCQkJY2hhcgorI2RlZmluZSBwb3J0RkxPQVQJCQkJCQkJCQkJCWZsb2F0CisjZGVmaW5lIHBvcnRET1VCTEUJCQkJCQkJCQkJCWRvdWJsZQorI2RlZmluZSBwb3J0TE9ORwkJCQkJCQkJCQkJbG9uZworI2RlZmluZSBwb3J0U0hPUlQJCQkJCQkJCQkJCXNob3J0CisjZGVmaW5lIHBvcnRTVEFDS19UWVBFCQkJCQkJCQkJCXVpbnQzMl90CisjZGVmaW5lIHBvcnRCQVNFX1RZUEUJCQkJCQkJCQkJbG9uZworCit0eXBlZGVmIHBvcnRTVEFDS19UWVBFCQkJCQkJCQkJCVN0YWNrVHlwZV90OwordHlwZWRlZiBsb25nCQkJCQkJCQkJCQkJQmFzZVR5cGVfdDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZwkJCQkJCQkJCQlVQmFzZVR5cGVfdDsKKworI2lmKCBjb25maWdVU0VfMTZfQklUX1RJQ0tTID09IDEgKQorCXR5cGVkZWYgdWludDE2X3QgVGlja1R5cGVfdDsKKwkjZGVmaW5lIHBvcnRNQVhfREVMQVkgKCBUaWNrVHlwZV90ICkJCQkJCTB4ZmZmZgorI2Vsc2UKKwl0eXBlZGVmIHVpbnQzMl90IFRpY2tUeXBlX3Q7CisJI2RlZmluZSBwb3J0TUFYX0RFTEFZICggVGlja1R5cGVfdCApCQkJCQkweGZmZmZmZmZmVUwKKworCS8qIDMyLWJpdCB0aWNrIHR5cGUgb24gYSAzMi1iaXQgYXJjaGl0ZWN0dXJlLCBzbyByZWFkcyBvZiB0aGUgdGljayBjb3VudCBkbworCSAqIG5vdCBuZWVkIHRvIGJlIGd1YXJkZWQgd2l0aCBhIGNyaXRpY2FsIHNlY3Rpb24uICovCisJI2RlZmluZSBwb3J0VElDS19UWVBFX0lTX0FUT01JQwkJCQkJCQkxCisjZW5kaWYKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAqIEFyY2hpdGVjdHVyZSBzcGVjaWZpY3MuCisgKi8KKyNkZWZpbmUgcG9ydEFSQ0hfTkFNRQkJCQkJCQkJCQkiQ29ydGV4LU0zMyIKKyNkZWZpbmUgcG9ydFNUQUNLX0dST1dUSAkJCQkJCQkJCSggLTEgKQorI2RlZmluZSBwb3J0VElDS19QRVJJT0RfTVMJCQkJCQkJCQkoICggVGlja1R5cGVfdCApIDEwMDAgLyBjb25maWdUSUNLX1JBVEVfSFogKQorI2RlZmluZSBwb3J0QllURV9BTElHTk1FTlQJCQkJCQkJCQk4CisjZGVmaW5lIHBvcnROT1AoKQorI2RlZmluZSBwb3J0SU5MSU5FCQkJCQkJCQkJCQlfX2lubGluZQorI2lmbmRlZiBwb3J0Rk9SQ0VfSU5MSU5FCisJI2RlZmluZSBwb3J0Rk9SQ0VfSU5MSU5FCQkJCQkJCQlpbmxpbmUgX19hdHRyaWJ1dGVfXygoIGFsd2F5c19pbmxpbmUgKSkKKyNlbmRpZgorI2RlZmluZSBwb3J0SEFTX1NUQUNLX09WRVJGTE9XX0NIRUNLSU5HCQkJCQkJMQorI2RlZmluZSBwb3J0RE9OVF9ESVNDQVJECQkJCQkJCQkJX19hdHRyaWJ1dGVfXygoIHVzZWQgKSkKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAqIEBicmllZiBFeHRlcm4gZGVjbGFyYXRpb25zLgorICovCitleHRlcm4gdm9pZCB2UG9ydFlpZWxkKCB2b2lkICkgLyogUFJJVklMRUdFRF9GVU5DVElPTiAqLzsKKworZXh0ZXJuIHZvaWQgdlBvcnRFbnRlckNyaXRpY2FsKCB2b2lkICkgLyogUFJJVklMRUdFRF9GVU5DVElPTiAqLzsKK2V4dGVybiB2b2lkIHZQb3J0RXhpdENyaXRpY2FsKCB2b2lkICkgLyogUFJJVklMRUdFRF9GVU5DVElPTiAqLzsKKworZXh0ZXJuIHVpbnQzMl90IHVsU2V0SW50ZXJydXB0TWFza0Zyb21JU1IoIHZvaWQgKSAvKiBfX2F0dHJpYnV0ZV9fKCggbmFrZWQgKSkgUFJJVklMRUdFRF9GVU5DVElPTiAqLzsKK2V4dGVybiB2b2lkIHZDbGVhckludGVycnVwdE1hc2tGcm9tSVNSKCB1aW50MzJfdCB1bE1hc2sgKSAvKiBfX2F0dHJpYnV0ZV9fKCggbmFrZWQgKSkgUFJJVklMRUdFRF9GVU5DVElPTiAqLzsKKworI2lmKCBjb25maWdFTkFCTEVfVFJVU1RaT05FID09IDEgKQorCWV4dGVybiB2b2lkIHZQb3J0QWxsb2NhdGVTZWN1cmVDb250ZXh0KCB1aW50MzJfdCB1bFNlY3VyZVN0YWNrU2l6ZSApOyAvKiBfX2F0dHJpYnV0ZV9fICgoIG5ha2VkICkpICovCisJZXh0ZXJuIHZvaWQgdlBvcnRGcmVlU2VjdXJlQ29udGV4dCggdWludDMyX3QgKnB1bFRDQiApIC8qIF9fYXR0cmlidXRlX18gKCggbmFrZWQgKSkgUFJJVklMRUdFRF9GVU5DVElPTiAqLzsKKyNlbmRpZiAvKiBjb25maWdFTkFCTEVfVFJVU1RaT05FICovCisKKyNpZiggY29uZmlnRU5BQkxFX01QVSA9PSAxICkKKwlleHRlcm4gQmFzZVR5cGVfdCB4SXNQcml2aWxlZ2VkKCB2b2lkICkgLyogX19hdHRyaWJ1dGVfXyAoKCBuYWtlZCApKSAqLzsKKwlleHRlcm4gdm9pZCB2UmVzZXRQcml2aWxlZ2UoIHZvaWQgKSAvKiBfX2F0dHJpYnV0ZV9fICgoIG5ha2VkICkpICovOworI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9NUFUgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAqIEBicmllZiBNUFUgc3BlY2lmaWMgY29uc3RhbnRzLgorICovCisjaWYoIGNvbmZpZ0VOQUJMRV9NUFUgPT0gMSApCisJI2RlZmluZSBwb3J0VVNJTkdfTVBVX1dSQVBQRVJTCQkJCQkJCTEKKwkjZGVmaW5lIHBvcnRQUklWSUxFR0VfQklUCQkJCQkJCQkoIDB4ODAwMDAwMDBVTCApCisjZWxzZQorCSNkZWZpbmUgcG9ydFBSSVZJTEVHRV9CSVQJCQkJCQkJCSggMHgwVUwgKQorI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9NUFUgKi8KKworCisvKiBNUFUgcmVnaW9ucy4gKi8KKyNkZWZpbmUgcG9ydFBSSVZJTEVHRURfRkxBU0hfUkVHSU9OCQkJCQkJCSggMFVMICkKKyNkZWZpbmUgcG9ydFVOUFJJVklMRUdFRF9GTEFTSF9SRUdJT04JCQkJCQkoIDFVTCApCisjZGVmaW5lIHBvcnRVTlBSSVZJTEVHRURfU1lTQ0FMTFNfUkVHSU9OCQkJCQkoIDJVTCApCisjZGVmaW5lIHBvcnRQUklWSUxFR0VEX1JBTV9SRUdJT04JCQkJCQkJKCAzVUwgKQorI2RlZmluZSBwb3J0U1RBQ0tfUkVHSU9OCQkJCQkJCQkJKCA0VUwgKQorI2RlZmluZSBwb3J0RklSU1RfQ09ORklHVVJBQkxFX1JFR0lPTgkJCQkJCSggNVVMICkKKyNkZWZpbmUgcG9ydExBU1RfQ09ORklHVVJBQkxFX1JFR0lPTgkJCQkJCSggN1VMICkKKyNkZWZpbmUgcG9ydE5VTV9DT05GSUdVUkFCTEVfUkVHSU9OUwkJCQkJCSggKCBwb3J0TEFTVF9DT05GSUdVUkFCTEVfUkVHSU9OIC0gcG9ydEZJUlNUX0NPTkZJR1VSQUJMRV9SRUdJT04gKSArIDEgKQorI2RlZmluZSBwb3J0VE9UQUxfTlVNX1JFR0lPTlMJCQkJCQkJCSggcG9ydE5VTV9DT05GSUdVUkFCTEVfUkVHSU9OUyArIDEgKSAvKiBQbHVzIG9uZSB0byBtYWtlIHNwYWNlIGZvciB0aGUgc3RhY2sgcmVnaW9uLiAqLworCisvKiBEZXZpY2UgbWVtb3J5IGF0dHJpYnV0ZXMgdXNlZCBpbiBNUFVfTUFJUiByZWdpc3RlcnMuCisgKgorICogOC1iaXQgdmFsdWVzIGVuY29kZWQgYXMgZm9sbG93czoKKyAqICBCaXRbNzo0XSAtIDAwMDAgLSBEZXZpY2UgTWVtb3J5CisgKiAgQml0WzM6Ml0gLSAwMCAtLT4gRGV2aWNlLW5HblJuRQorICoJCQkJMDEgLS0+IERldmljZS1uR25SRQorICoJCQkJMTAgLS0+IERldmljZS1uR1JFCisgKgkJCQkxMSAtLT4gRGV2aWNlLUdSRQorICogIEJpdFsxOjBdIC0gMDAsIFJlc2VydmVkLgorICovCisjZGVmaW5lIHBvcnRNUFVfREVWSUNFX01FTU9SWV9uR25SbkUJCQkJCQkoIDB4MDAgKSAvKiAwMDAwIDAwMDAgKi8KKyNkZWZpbmUgcG9ydE1QVV9ERVZJQ0VfTUVNT1JZX25HblJFCQkJCQkJCSggMHgwNCApIC8qIDAwMDAgMDEwMCAqLworI2RlZmluZSBwb3J0TVBVX0RFVklDRV9NRU1PUllfbkdSRQkJCQkJCQkoIDB4MDggKSAvKiAwMDAwIDEwMDAgKi8KKyNkZWZpbmUgcG9ydE1QVV9ERVZJQ0VfTUVNT1JZX0dSRQkJCQkJCQkoIDB4MEMgKSAvKiAwMDAwIDExMDAgKi8KKworLyogTm9ybWFsIG1lbW9yeSBhdHRyaWJ1dGVzIHVzZWQgaW4gTVBVX01BSVIgcmVnaXN0ZXJzLiAqLworI2RlZmluZSBwb3J0TVBVX05PUk1BTF9NRU1PUllfTk9OX0NBQ0hFQUJMRQkJCQkJKCAweDQ0ICkgLyogTm9uLWNhY2hlYWJsZS4gKi8KKyNkZWZpbmUgcG9ydE1QVV9OT1JNQUxfTUVNT1JZX0JVRkZFUkFCTEVfQ0FDSEVBQkxFCQkJKCAweEZGICkgLyogTm9uLVRyYW5zaWVudCwgV3JpdGUtYmFjaywgUmVhZC1BbGxvY2F0ZSBhbmQgV3JpdGUtQWxsb2NhdGUuICovCisKKy8qIEF0dHJpYnV0ZXMgdXNlZCBpbiBNUFVfUkJBUiByZWdpc3RlcnMuICovCisjZGVmaW5lIHBvcnRNUFVfUkVHSU9OX05PTl9TSEFSRUFCTEUJCQkJCQkoIDBVTCA8PCAzVUwgKQorI2RlZmluZSBwb3J0TVBVX1JFR0lPTl9JTk5FUl9TSEFSRUFCTEUJCQkJCQkoIDFVTCA8PCAzVUwgKQorI2RlZmluZSBwb3J0TVBVX1JFR0lPTl9PVVRFUl9TSEFSRUFCTEUJCQkJCQkoIDJVTCA8PCAzVUwgKQorCisjZGVmaW5lIHBvcnRNUFVfUkVHSU9OX1BSSVZJTEVHRURfUkVBRF9XUklURQkJCQkoIDBVTCA8PCAxVUwgKQorI2RlZmluZSBwb3J0TVBVX1JFR0lPTl9SRUFEX1dSSVRFCQkJCQkJCSggMVVMIDw8IDFVTCApCisjZGVmaW5lIHBvcnRNUFVfUkVHSU9OX1BSSVZJTEVHRURfUkVBRF9PTkxZCQkJCQkoIDJVTCA8PCAxVUwgKQorI2RlZmluZSBwb3J0TVBVX1JFR0lPTl9SRUFEX09OTFkJCQkJCQkJKCAzVUwgPDwgMVVMICkKKworI2RlZmluZSBwb3J0TVBVX1JFR0lPTl9FWEVDVVRFX05FVkVSCQkJCQkJKCAxVUwgKQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKgorICogQGJyaWVmIFNldHRpbmdzIHRvIGRlZmluZSBhbiBNUFUgcmVnaW9uLgorICovCit0eXBlZGVmIHN0cnVjdCBNUFVSZWdpb25TZXR0aW5ncworeworCXVpbnQzMl90IHVsUkJBUjsJLyoqPCBSQkFSIGZvciB0aGUgcmVnaW9uLiAqLworCXVpbnQzMl90IHVsUkxBUjsJLyoqPCBSTEFSIGZvciB0aGUgcmVnaW9uLiAqLworfSBNUFVSZWdpb25TZXR0aW5nc190OworCisvKioKKyAqIEBicmllZiBNUFUgc2V0dGluZ3MgYXMgc3RvcmVkIGluIHRoZSBUQ0IuCisgKi8KK3R5cGVkZWYgc3RydWN0IE1QVV9TRVRUSU5HUworeworCXVpbnQzMl90IHVsTUFJUjA7CS8qKjwgTUFJUjAgZm9yIHRoZSB0YXNrIGNvbnRhaW5pbmcgYXR0cmlidXRlcyBmb3IgYWxsIHRoZSA0IHBlciB0YXNrIHJlZ2lvbnMuICovCisJTVBVUmVnaW9uU2V0dGluZ3NfdCB4UmVnaW9uc1NldHRpbmdzWyBwb3J0VE9UQUxfTlVNX1JFR0lPTlMgXTsgLyoqPCBTZXR0aW5ncyBmb3IgNCBwZXIgdGFzayByZWdpb25zLiAqLworfSB4TVBVX1NFVFRJTkdTOworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKgorICogQGJyaWVmIFNWQyBudW1iZXJzLgorICovCisjZGVmaW5lIHBvcnRTVkNfQUxMT0NBVEVfU0VDVVJFX0NPTlRFWFQJCQkJCQkwCisjZGVmaW5lIHBvcnRTVkNfRlJFRV9TRUNVUkVfQ09OVEVYVAkJCQkJCQkxCisjZGVmaW5lIHBvcnRTVkNfU1RBUlRfU0NIRURVTEVSCQkJCQkJCQkyCisjZGVmaW5lIHBvcnRTVkNfUkFJU0VfUFJJVklMRUdFCQkJCQkJCQkzCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqCisgKiBAYnJpZWYgU2NoZWR1bGVyIHV0aWxpdGllcy4KKyAqLworI2RlZmluZSBwb3J0WUlFTEQoKQkJCQkJCQkJCQkJdlBvcnRZaWVsZCgpCisjZGVmaW5lIHBvcnROVklDX0lOVF9DVFJMX1JFRwkJCQkJCQkJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZWQwNCApICkKKyNkZWZpbmUgcG9ydE5WSUNfUEVORFNWU0VUX0JJVAkJCQkJCQkJKCAxVUwgPDwgMjhVTCApCisjZGVmaW5lIHBvcnRFTkRfU1dJVENISU5HX0lTUiggeFN3aXRjaFJlcXVpcmVkICkJCQlpZiggeFN3aXRjaFJlcXVpcmVkICkgcG9ydE5WSUNfSU5UX0NUUkxfUkVHID0gcG9ydE5WSUNfUEVORFNWU0VUX0JJVAorI2RlZmluZSBwb3J0WUlFTERfRlJPTV9JU1IoIHggKQkJCQkJCQkJcG9ydEVORF9TV0lUQ0hJTkdfSVNSKCB4ICkKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAqIEBicmllZiBDcml0aWNhbCBzZWN0aW9uIG1hbmFnZW1lbnQuCisgKi8KKyNkZWZpbmUgcG9ydFNFVF9JTlRFUlJVUFRfTUFTS19GUk9NX0lTUigpCQkJCQl1bFNldEludGVycnVwdE1hc2tGcm9tSVNSKCkKKyNkZWZpbmUgcG9ydENMRUFSX0lOVEVSUlVQVF9NQVNLX0ZST01fSVNSKHgpCQkJCXZDbGVhckludGVycnVwdE1hc2tGcm9tSVNSKCB4ICkKKyNkZWZpbmUgcG9ydERJU0FCTEVfSU5URVJSVVBUUygpCQkJCQkJCV9fYXNtIHZvbGF0aWxlICggIiBjcHNpZCBpICIgOjo6ICJtZW1vcnkiICkKKyNkZWZpbmUgcG9ydEVOQUJMRV9JTlRFUlJVUFRTKCkJCQkJCQkJCV9fYXNtIHZvbGF0aWxlICggIiBjcHNpZSBpICIgOjo6ICJtZW1vcnkiICkKKyNkZWZpbmUgcG9ydEVOVEVSX0NSSVRJQ0FMKCkJCQkJCQkJCXZQb3J0RW50ZXJDcml0aWNhbCgpCisjZGVmaW5lIHBvcnRFWElUX0NSSVRJQ0FMKCkJCQkJCQkJCQl2UG9ydEV4aXRDcml0aWNhbCgpCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqCisgKiBAYnJpZWYgVGFzayBmdW5jdGlvbiBtYWNyb3MgYXMgZGVzY3JpYmVkIG9uIHRoZSBGcmVlUlRPUy5vcmcgV0VCIHNpdGUuCisgKi8KKyNkZWZpbmUgcG9ydFRBU0tfRlVOQ1RJT05fUFJPVE8oIHZGdW5jdGlvbiwgcHZQYXJhbWV0ZXJzICkJdm9pZCB2RnVuY3Rpb24oIHZvaWQgKnB2UGFyYW1ldGVycyApCisjZGVmaW5lIHBvcnRUQVNLX0ZVTkNUSU9OKCB2RnVuY3Rpb24sIHB2UGFyYW1ldGVycyApCQl2b2lkIHZGdW5jdGlvbiggdm9pZCAqcHZQYXJhbWV0ZXJzICkKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYoIGNvbmZpZ0VOQUJMRV9UUlVTVFpPTkUgPT0gMSApCisJLyoqCisJICogQGJyaWVmIEFsbG9jYXRlIGEgc2VjdXJlIGNvbnRleHQgZm9yIHRoZSB0YXNrLgorCSAqCisJICogVGFza3MgYXJlIG5vdCBjcmVhdGVkIHdpdGggYSBzZWN1cmUgY29udGV4dC4gQW55IHRhc2sgdGhhdCBpcyBnb2luZyB0byBjYWxsCisJICogc2VjdXJlIGZ1bmN0aW9ucyBtdXN0IGNhbGwgcG9ydEFMTE9DQVRFX1NFQ1VSRV9DT05URVhUKCkgdG8gYWxsb2NhdGUgaXRzZWxmIGEKKwkgKiBzZWN1cmUgY29udGV4dCBiZWZvcmUgaXQgY2FsbHMgYW55IHNlY3VyZSBmdW5jdGlvbi4KKwkgKgorCSAqIEBwYXJhbVtpbl0gdWxTZWN1cmVTdGFja1NpemUgVGhlIHNpemUgb2YgdGhlIHNlY3VyZSBzdGFjayB0byBiZSBhbGxvY2F0ZWQuCisJICovCisJI2RlZmluZSBwb3J0QUxMT0NBVEVfU0VDVVJFX0NPTlRFWFQoIHVsU2VjdXJlU3RhY2tTaXplICkJdlBvcnRBbGxvY2F0ZVNlY3VyZUNvbnRleHQoIHVsU2VjdXJlU3RhY2tTaXplICkKKworCS8qKgorCSAqIEBicmllZiBDYWxsZWQgd2hlbiBhIHRhc2sgaXMgZGVsZXRlZCB0byBkZWxldGUgdGhlIHRhc2sncyBzZWN1cmUgY29udGV4dCwKKwkgKiBpZiBpdCBoYXMgb25lLgorCSAqCisJICogQHBhcmFtW2luXSBweFRDQiBUaGUgVENCIG9mIHRoZSB0YXNrIGJlaW5nIGRlbGV0ZWQuCisJICovCisJI2RlZmluZSBwb3J0Q0xFQU5fVVBfVENCKCBweFRDQiApCQkJCQkJCXZQb3J0RnJlZVNlY3VyZUNvbnRleHQoICggdWludDMyX3QgKiApIHB4VENCICkKKyNlbHNlCisJI2RlZmluZSBwb3J0QUxMT0NBVEVfU0VDVVJFX0NPTlRFWFQoIHVsU2VjdXJlU3RhY2tTaXplICkKKwkjZGVmaW5lIHBvcnRDTEVBTl9VUF9UQ0IoIHB4VENCICkKKyNlbmRpZiAvKiBjb25maWdFTkFCTEVfVFJVU1RaT05FICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmKCBjb25maWdFTkFCTEVfTVBVID09IDEgKQorCS8qKgorCSAqIEBicmllZiBDaGVja3Mgd2hldGhlciBvciBub3QgdGhlIHByb2Nlc3NvciBpcyBwcml2aWxlZ2VkLgorCSAqCisJICogQHJldHVybiAxIGlmIHRoZSBwcm9jZXNzb3IgaXMgYWxyZWFkeSBwcml2aWxlZ2VkLCAwIG90aGVyd2lzZS4KKwkgKi8KKwkjZGVmaW5lIHBvcnRJU19QUklWSUxFR0VEKCkJCQkJCQkJCQl4SXNQcml2aWxlZ2VkKCkKKworCS8qKgorCSAqIEBicmllZiBSYWlzZSBhbiBTVkMgcmVxdWVzdCB0byByYWlzZSBwcml2aWxlZ2UuCisJICoKKwkgKiBUaGUgU1ZDIGhhbmRsZXIgY2hlY2tzIHRoYXQgdGhlIFNWQyB3YXMgcmFpc2VkIGZyb20gYSBzeXN0ZW0gY2FsbCBhbmQgb25seQorCSAqIHRoZW4gaXQgcmFpc2VzIHRoZSBwcml2aWxlZ2UuIElmIHRoaXMgaXMgY2FsbGVkIGZyb20gYW55IG90aGVyIHBsYWNlLAorCSAqIHRoZSBwcml2aWxlZ2UgaXMgbm90IHJhaXNlZC4KKwkgKi8KKwkjZGVmaW5lIHBvcnRSQUlTRV9QUklWSUxFR0UoKQkJCQkJCQkJX19hc20gdm9sYXRpbGUgKCAic3ZjICUwIFxuIiA6OiAiaSIgKCBwb3J0U1ZDX1JBSVNFX1BSSVZJTEVHRSApIDogIm1lbW9yeSIgKTsKKworCS8qKgorCSAqIEBicmllZiBMb3dlcnMgdGhlIHByaXZpbGVnZSBsZXZlbCBieSBzZXR0aW5nIHRoZSBiaXQgMCBvZiB0aGUgQ09OVFJPTAorCSAqIHJlZ2lzdGVyLgorCSAqLworCSNkZWZpbmUgcG9ydFJFU0VUX1BSSVZJTEVHRSgpCQkJCQkJCQl2UmVzZXRQcml2aWxlZ2UoKQorI2Vsc2UKKwkjZGVmaW5lIHBvcnRJU19QUklWSUxFR0VEKCkKKwkjZGVmaW5lIHBvcnRSQUlTRV9QUklWSUxFR0UoKQorCSNkZWZpbmUgcG9ydFJFU0VUX1BSSVZJTEVHRSgpCisjZW5kaWYgLyogY29uZmlnRU5BQkxFX01QVSAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKgorICogQGJyaWVmIEJhcnJpZXJzLgorICovCisjZGVmaW5lIHBvcnRNRU1PUllfQkFSUklFUigpIF9fYXNtIHZvbGF0aWxlKCAiIiA6OjogIm1lbW9yeSIgKQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBQT1JUTUFDUk9fSCAqLwpkaWZmIC0tZ2l0IGEvU291cmNlL3BvcnRhYmxlL0dDQy9BUk1fQ00zX01QVS9wb3J0LmMgYi9Tb3VyY2UvcG9ydGFibGUvR0NDL0FSTV9DTTNfTVBVL3BvcnQuYwppbmRleCAzOWNmYmZjLi40NTRmOTBmIDEwMDY0NAotLS0gYS9Tb3VyY2UvcG9ydGFibGUvR0NDL0FSTV9DTTNfTVBVL3BvcnQuYworKysgYi9Tb3VyY2UvcG9ydGFibGUvR0NDL0FSTV9DTTNfTVBVL3BvcnQuYwpAQCAtMSw2ICsxLDYgQEAKIC8qCi0gKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjAuMQotICogQ29weXJpZ2h0IChDKSAyMDE3IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRnJlZVJUT1MgS2VybmVsIFYxMC4yLjEKKyAqIENvcHlyaWdodCAoQykgMjAxOSBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCiAgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCiAgKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgpAQCAtMTE1LDEzICsxMTUsNiBAQAogc3RhdGljIHVpbnQzMl90IHBydkdldE1QVVJlZ2lvblNpemVTZXR0aW5nKCB1aW50MzJfdCB1bEFjdHVhbFNpemVJbkJ5dGVzICkgUFJJVklMRUdFRF9GVU5DVElPTjsKIAogLyoKLSAqIENoZWNrcyB0byBzZWUgaWYgYmVpbmcgY2FsbGVkIGZyb20gdGhlIGNvbnRleHQgb2YgYW4gdW5wcml2aWxlZ2VkIHRhc2ssIGFuZAotICogaWYgc28gcmFpc2VzIHRoZSBwcml2aWxlZ2UgbGV2ZWwgYW5kIHJldHVybnMgZmFsc2UgLSBvdGhlcndpc2UgZG9lcyBub3RoaW5nCi0gKiBvdGhlciB0aGFuIHJldHVybiB0cnVlLgotICovCi1CYXNlVHlwZV90IHhQb3J0UmFpc2VQcml2aWxlZ2UoIHZvaWQgKSBfX2F0dHJpYnV0ZV9fKCggbmFrZWQgKSk7Ci0KLS8qCiAgKiBTZXR1cCB0aGUgdGltZXIgdG8gZ2VuZXJhdGUgdGhlIHRpY2sgaW50ZXJydXB0cy4gIFRoZSBpbXBsZW1lbnRhdGlvbiBpbiB0aGlzCiAgKiBmaWxlIGlzIHdlYWsgdG8gYWxsb3cgYXBwbGljYXRpb24gd3JpdGVycyB0byBjaGFuZ2UgdGhlIHRpbWVyIHVzZWQgdG8KICAqIGdlbmVyYXRlIHRoZSB0aWNrIGludGVycnVwdC4KQEAgLTE0Niw2ICsxMzksMzUgQEAKICAqLwogc3RhdGljIHZvaWQgcHJ2U1ZDSGFuZGxlciggdWludDMyX3QgKnB1bFJlZ2lzdGVycyApIF9fYXR0cmlidXRlX18oKCBub2lubGluZSApKSBQUklWSUxFR0VEX0ZVTkNUSU9OOwogCisvKioKKyAqIEBicmllZiBDaGVja3Mgd2hldGhlciBvciBub3QgdGhlIHByb2Nlc3NvciBpcyBwcml2aWxlZ2VkLgorICoKKyAqIEByZXR1cm4gMSBpZiB0aGUgcHJvY2Vzc29yIGlzIGFscmVhZHkgcHJpdmlsZWdlZCwgMCBvdGhlcndpc2UuCisgKi8KK0Jhc2VUeXBlX3QgeElzUHJpdmlsZWdlZCggdm9pZCApIF9fYXR0cmlidXRlX18gKCggbmFrZWQgKSk7CisKKy8qKgorICogQGJyaWVmIExvd2VycyB0aGUgcHJpdmlsZWdlIGxldmVsIGJ5IHNldHRpbmcgdGhlIGJpdCAwIG9mIHRoZSBDT05UUk9MCisgKiByZWdpc3Rlci4KKyAqCisgKiBCaXQgMCBvZiB0aGUgQ09OVFJPTCByZWdpc3RlciBkZWZpbmVzIHRoZSBwcml2aWxlZ2UgbGV2ZWwgb2YgVGhyZWFkIE1vZGUuCisgKiAgQml0WzBdID0gMCAtLT4gVGhlIHByb2Nlc3NvciBpcyBydW5uaW5nIHByaXZpbGVnZWQKKyAqICBCaXRbMF0gPSAxIC0tPiBUaGUgcHJvY2Vzc29yIGlzIHJ1bm5pbmcgdW5wcml2aWxlZ2VkLgorICovCit2b2lkIHZSZXNldFByaXZpbGVnZSggdm9pZCApIF9fYXR0cmlidXRlX18gKCggbmFrZWQgKSk7CisKKy8qKgorICogQGJyaWVmIENhbGxzIHRoZSBwb3J0IHNwZWNpZmljIGNvZGUgdG8gcmFpc2UgdGhlIHByaXZpbGVnZS4KKyAqCisgKiBAcmV0dXJuIHBkRkFMU0UgaWYgcHJpdmlsZWdlIHdhcyByYWlzZWQsIHBkVFJVRSBvdGhlcndpc2UuCisgKi8KK2V4dGVybiBCYXNlVHlwZV90IHhQb3J0UmFpc2VQcml2aWxlZ2UoIHZvaWQgKTsKKworLyoqCisgKiBAYnJpZWYgSWYgeFJ1bm5pbmdQcml2aWxlZ2VkIGlzIG5vdCBwZFRSVUUsIGNhbGxzIHRoZSBwb3J0IHNwZWNpZmljCisgKiBjb2RlIHRvIHJlc2V0IHRoZSBwcml2aWxlZ2UsIG90aGVyd2lzZSBkb2VzIG5vdGhpbmcuCisgKi8KK2V4dGVybiB2b2lkIHZQb3J0UmVzZXRQcml2aWxlZ2UoIEJhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkICk7CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogLyogRWFjaCB0YXNrIG1haW50YWlucyBpdHMgb3duIGludGVycnVwdCBzdGF0dXMgaW4gdGhlIGNyaXRpY2FsIG5lc3RpbmcKQEAgLTU4NSwyMSArNjA3LDMzIEBACiB9CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotQmFzZVR5cGVfdCB4UG9ydFJhaXNlUHJpdmlsZWdlKCB2b2lkICkKK0Jhc2VUeXBlX3QgeElzUHJpdmlsZWdlZCggdm9pZCApIC8qIF9fYXR0cmlidXRlX18gKCggbmFrZWQgKSkgKi8KIHsKIAlfX2FzbSB2b2xhdGlsZQogCSgKLQkJIgltcnMgcjAsIGNvbnRyb2wJCQkJCQlcbiIKLQkJIgl0c3QgcjAsICMxCQkJCQkJCVxuIiAvKiBJcyB0aGUgdGFzayBydW5uaW5nIHByaXZpbGVnZWQ/ICovCi0JCSIJaXR0ZSBuZQkJCQkJCQkJXG4iCi0JCSIJbW92bmUgcjAsICMwCQkJCQkJXG4iIC8qIENPTlRST0xbMF0hPTAsIHJldHVybiBmYWxzZS4gKi8KLQkJIglzdmNuZSAlMAkJCQkJCQlcbiIgLyogU3dpdGNoIHRvIHByaXZpbGVnZWQuICovCi0JCSIJbW92ZXEgcjAsICMxCQkJCQkJXG4iIC8qIENPTlRST0xbMF09PTAsIHJldHVybiB0cnVlLiAqLwotCQkiCWJ4IGxyCQkJCQkJCQlcbiIKLQkJOjogImkiIChwb3J0U1ZDX1JBSVNFX1BSSVZJTEVHRSkgOiAicjAiLCAibWVtb3J5IgorCSIJbXJzIHIwLCBjb250cm9sCQkJCQkJCVxuIiAvKiByMCA9IENPTlRST0wuICovCisJIgl0c3QgcjAsICMxCQkJCQkJCQlcbiIgLyogUGVyZm9ybSByMCAmIDEgKGJpdHdpc2UgQU5EKSBhbmQgdXBkYXRlIHRoZSBjb25kaXRpb25zIGZsYWcuICovCisJIglpdGUgbmUJCQkJCQkJCQlcbiIKKwkiCW1vdm5lIHIwLCAjMAkJCQkJCQlcbiIgLyogQ09OVFJPTFswXSE9MC4gUmV0dXJuIGZhbHNlIHRvIGluZGljYXRlIHRoYXQgdGhlIHByb2Nlc3NvciBpcyBub3QgcHJpdmlsZWdlZC4gKi8KKwkiCW1vdmVxIHIwLCAjMQkJCQkJCQlcbiIgLyogQ09OVFJPTFswXT09MC4gUmV0dXJuIHRydWUgdG8gaW5kaWNhdGUgdGhhdCB0aGUgcHJvY2Vzc29yIGlzIHByaXZpbGVnZWQuICovCisJIglieCBscgkJCQkJCQkJCVxuIiAvKiBSZXR1cm4uICovCisJIgkJCQkJCQkJCQkJXG4iCisJIgkuYWxpZ24gNAkJCQkJCQkJXG4iCisJOjo6ICJyMCIsICJtZW1vcnkiCiAJKTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi0JcmV0dXJuIDA7Cit2b2lkIHZSZXNldFByaXZpbGVnZSggdm9pZCApIC8qIF9fYXR0cmlidXRlX18gKCggbmFrZWQgKSkgKi8KK3sKKwlfX2FzbSB2b2xhdGlsZQorCSgKKwkiCW1ycyByMCwgY29udHJvbAkJCQkJCQlcbiIgLyogcjAgPSBDT05UUk9MLiAqLworCSIJb3JyIHIwLCAjMQkJCQkJCQkJXG4iIC8qIHIwID0gcjAgfCAxLiAqLworCSIJbXNyIGNvbnRyb2wsIHIwCQkJCQkJCVxuIiAvKiBDT05UUk9MID0gcjAuICovCisJIglieCBscgkJCQkJCQkJCVxuIiAvKiBSZXR1cm4gdG8gdGhlIGNhbGxlci4gKi8KKwk6OjoicjAiLCAibWVtb3J5IgorCSk7CiB9CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIApkaWZmIC0tZ2l0IGEvU291cmNlL3BvcnRhYmxlL0dDQy9BUk1fQ00zX01QVS9wb3J0bWFjcm8uaCBiL1NvdXJjZS9wb3J0YWJsZS9HQ0MvQVJNX0NNM19NUFUvcG9ydG1hY3JvLmgKaW5kZXggNjA1N2YxYy4uMzQ1OGIwZSAxMDA2NDQKLS0tIGEvU291cmNlL3BvcnRhYmxlL0dDQy9BUk1fQ00zX01QVS9wb3J0bWFjcm8uaAorKysgYi9Tb3VyY2UvcG9ydGFibGUvR0NDL0FSTV9DTTNfTVBVL3BvcnRtYWNyby5oCkBAIC0xLDYgKzEsNiBAQAogLyoKLSAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMC4xCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjIuMQorICogQ29weXJpZ2h0IChDKSAyMDE5IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKICAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKICAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCkBAIC0yMDAsMTggKzIwMCwyOCBAQAogI2lmbmRlZiBwb3J0Rk9SQ0VfSU5MSU5FCiAJI2RlZmluZSBwb3J0Rk9SQ0VfSU5MSU5FIGlubGluZSBfX2F0dHJpYnV0ZV9fKCggYWx3YXlzX2lubGluZSkpCiAjZW5kaWYKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi0vKiBTZXQgdGhlIHByaXZpbGVnZSBsZXZlbCB0byB1c2VyIG1vZGUgaWYgeFJ1bm5pbmdQcml2aWxlZ2VkIGlzIGZhbHNlLiAqLwotcG9ydEZPUkNFX0lOTElORSBzdGF0aWMgdm9pZCB2UG9ydFJlc2V0UHJpdmlsZWdlKCBCYXNlVHlwZV90IHhSdW5uaW5nUHJpdmlsZWdlZCApCi17Ci0JaWYoIHhSdW5uaW5nUHJpdmlsZWdlZCAhPSBwZFRSVUUgKQotCXsKLQkJX19hc20gdm9sYXRpbGUgKCAiIG1ycyByMCwgY29udHJvbCAJXG4iIFwKLQkJCQkJCSAiIG9yciByMCwgIzEgCQlcbiIgXAotCQkJCQkJICIgbXNyIGNvbnRyb2wsIHIwCVxuIglcCi0JCQkJCQkgOjo6InIwIiwgIm1lbW9yeSIgKTsKLQl9Ci19CitleHRlcm4gQmFzZVR5cGVfdCB4SXNQcml2aWxlZ2VkKCB2b2lkICk7CitleHRlcm4gdm9pZCB2UmVzZXRQcml2aWxlZ2UoIHZvaWQgKTsKKworLyoqCisgKiBAYnJpZWYgQ2hlY2tzIHdoZXRoZXIgb3Igbm90IHRoZSBwcm9jZXNzb3IgaXMgcHJpdmlsZWdlZC4KKyAqCisgKiBAcmV0dXJuIDEgaWYgdGhlIHByb2Nlc3NvciBpcyBhbHJlYWR5IHByaXZpbGVnZWQsIDAgb3RoZXJ3aXNlLgorICovCisjZGVmaW5lIHBvcnRJU19QUklWSUxFR0VEKCkJCQl4SXNQcml2aWxlZ2VkKCkKKworLyoqCisgKiBAYnJpZWYgUmFpc2UgYW4gU1ZDIHJlcXVlc3QgdG8gcmFpc2UgcHJpdmlsZWdlLgorKi8KKyNkZWZpbmUgcG9ydFJBSVNFX1BSSVZJTEVHRSgpCQlfX2FzbSB2b2xhdGlsZSAoICJzdmMgJTAgXG4iIDo6ICJpIiAoIHBvcnRTVkNfUkFJU0VfUFJJVklMRUdFICkgOiAibWVtb3J5IiApOworCisvKioKKyAqIEBicmllZiBMb3dlcnMgdGhlIHByaXZpbGVnZSBsZXZlbCBieSBzZXR0aW5nIHRoZSBiaXQgMCBvZiB0aGUgQ09OVFJPTAorICogcmVnaXN0ZXIuCisgKi8KKyNkZWZpbmUgcG9ydFJFU0VUX1BSSVZJTEVHRSgpCQl2UmVzZXRQcml2aWxlZ2UoKQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKIHBvcnRGT1JDRV9JTkxJTkUgc3RhdGljIEJhc2VUeXBlX3QgeFBvcnRJc0luc2lkZUludGVycnVwdCggdm9pZCApCkBAIC0yODEsNiArMjkxLDcgQEAKIH0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCisjZGVmaW5lIHBvcnRNRU1PUllfQkFSUklFUigpIF9fYXNtIHZvbGF0aWxlKCAiIiA6OjogIm1lbW9yeSIgKQogCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KZGlmZiAtLWdpdCBhL1NvdXJjZS9wb3J0YWJsZS9HQ0MvQVJNX0NNNEYvcG9ydC5jIGIvU291cmNlL3BvcnRhYmxlL0dDQy9BUk1fQ000Ri9wb3J0LmMKaW5kZXggYWU5NmI0Yy4uYTA2NWFiZiAxMDA2NDQKLS0tIGEvU291cmNlL3BvcnRhYmxlL0dDQy9BUk1fQ000Ri9wb3J0LmMKKysrIGIvU291cmNlL3BvcnRhYmxlL0dDQy9BUk1fQ000Ri9wb3J0LmMKQEAgLTEsNiArMSw2IEBACiAvKgotICogRnJlZVJUT1MgS2VybmVsIFYxMC4wLjEKLSAqIENvcHlyaWdodCAoQykgMjAxNyBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMi4xCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgogICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgogICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KZGlmZiAtLWdpdCBhL1NvdXJjZS9wb3J0YWJsZS9HQ0MvQVJNX0NNNEYvcG9ydG1hY3JvLmggYi9Tb3VyY2UvcG9ydGFibGUvR0NDL0FSTV9DTTRGL3BvcnRtYWNyby5oCmluZGV4IDFhOTUwMTYuLmZkMzFkMjIgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9wb3J0YWJsZS9HQ0MvQVJNX0NNNEYvcG9ydG1hY3JvLmgKKysrIGIvU291cmNlL3BvcnRhYmxlL0dDQy9BUk1fQ000Ri9wb3J0bWFjcm8uaApAQCAtMSw2ICsxLDYgQEAKIC8qCi0gKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjAuMQotICogQ29weXJpZ2h0IChDKSAyMDE3IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRnJlZVJUT1MgS2VybmVsIFYxMC4yLjEKKyAqIENvcHlyaWdodCAoQykgMjAxOSBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCiAgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCiAgKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgpAQCAtMjMzLDYgKzIzMyw3IEBACiB9CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAorI2RlZmluZSBwb3J0TUVNT1JZX0JBUlJJRVIoKSBfX2FzbSB2b2xhdGlsZSggIiIgOjo6ICJtZW1vcnkiICkKIAogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CmRpZmYgLS1naXQgYS9Tb3VyY2UvcG9ydGFibGUvR0NDL0FSTV9DTTRfTVBVL3BvcnQuYyBiL1NvdXJjZS9wb3J0YWJsZS9HQ0MvQVJNX0NNNF9NUFUvcG9ydC5jCmluZGV4IDVhODgxZjQuLjljNjgxNzggMTAwNjQ0Ci0tLSBhL1NvdXJjZS9wb3J0YWJsZS9HQ0MvQVJNX0NNNF9NUFUvcG9ydC5jCisrKyBiL1NvdXJjZS9wb3J0YWJsZS9HQ0MvQVJNX0NNNF9NUFUvcG9ydC5jCkBAIC0xLDYgKzEsNiBAQAogLyoKLSAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMC4xCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjIuMQorICogQ29weXJpZ2h0IChDKSAyMDE5IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKICAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKICAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCkBAIC0xMjQsMTMgKzEyNCw2IEBACiBzdGF0aWMgdWludDMyX3QgcHJ2R2V0TVBVUmVnaW9uU2l6ZVNldHRpbmcoIHVpbnQzMl90IHVsQWN0dWFsU2l6ZUluQnl0ZXMgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOwogCiAvKgotICogQ2hlY2tzIHRvIHNlZSBpZiBiZWluZyBjYWxsZWQgZnJvbSB0aGUgY29udGV4dCBvZiBhbiB1bnByaXZpbGVnZWQgdGFzaywgYW5kCi0gKiBpZiBzbyByYWlzZXMgdGhlIHByaXZpbGVnZSBsZXZlbCBhbmQgcmV0dXJucyBmYWxzZSAtIG90aGVyd2lzZSBkb2VzIG5vdGhpbmcKLSAqIG90aGVyIHRoYW4gcmV0dXJuIHRydWUuCi0gKi8KLUJhc2VUeXBlX3QgeFBvcnRSYWlzZVByaXZpbGVnZSggdm9pZCApIF9fYXR0cmlidXRlX18oKCBuYWtlZCApKTsKLQotLyoKICAqIFNldHVwIHRoZSB0aW1lciB0byBnZW5lcmF0ZSB0aGUgdGljayBpbnRlcnJ1cHRzLiAgVGhlIGltcGxlbWVudGF0aW9uIGluIHRoaXMKICAqIGZpbGUgaXMgd2VhayB0byBhbGxvdyBhcHBsaWNhdGlvbiB3cml0ZXJzIHRvIGNoYW5nZSB0aGUgdGltZXIgdXNlZCB0bwogICogZ2VuZXJhdGUgdGhlIHRpY2sgaW50ZXJydXB0LgpAQCAtMTYwLDYgKzE1MywzNSBAQAogICovCiAgc3RhdGljIHZvaWQgdlBvcnRFbmFibGVWRlAoIHZvaWQgKSBfX2F0dHJpYnV0ZV9fICgoIG5ha2VkICkpOwogCisvKioKKyAqIEBicmllZiBDaGVja3Mgd2hldGhlciBvciBub3QgdGhlIHByb2Nlc3NvciBpcyBwcml2aWxlZ2VkLgorICoKKyAqIEByZXR1cm4gMSBpZiB0aGUgcHJvY2Vzc29yIGlzIGFscmVhZHkgcHJpdmlsZWdlZCwgMCBvdGhlcndpc2UuCisgKi8KK0Jhc2VUeXBlX3QgeElzUHJpdmlsZWdlZCggdm9pZCApIF9fYXR0cmlidXRlX18gKCggbmFrZWQgKSk7CisKKy8qKgorICogQGJyaWVmIExvd2VycyB0aGUgcHJpdmlsZWdlIGxldmVsIGJ5IHNldHRpbmcgdGhlIGJpdCAwIG9mIHRoZSBDT05UUk9MCisgKiByZWdpc3Rlci4KKyAqCisgKiBCaXQgMCBvZiB0aGUgQ09OVFJPTCByZWdpc3RlciBkZWZpbmVzIHRoZSBwcml2aWxlZ2UgbGV2ZWwgb2YgVGhyZWFkIE1vZGUuCisgKiAgQml0WzBdID0gMCAtLT4gVGhlIHByb2Nlc3NvciBpcyBydW5uaW5nIHByaXZpbGVnZWQKKyAqICBCaXRbMF0gPSAxIC0tPiBUaGUgcHJvY2Vzc29yIGlzIHJ1bm5pbmcgdW5wcml2aWxlZ2VkLgorICovCit2b2lkIHZSZXNldFByaXZpbGVnZSggdm9pZCApIF9fYXR0cmlidXRlX18gKCggbmFrZWQgKSk7CisKKy8qKgorICogQGJyaWVmIENhbGxzIHRoZSBwb3J0IHNwZWNpZmljIGNvZGUgdG8gcmFpc2UgdGhlIHByaXZpbGVnZS4KKyAqCisgKiBAcmV0dXJuIHBkRkFMU0UgaWYgcHJpdmlsZWdlIHdhcyByYWlzZWQsIHBkVFJVRSBvdGhlcndpc2UuCisgKi8KK2V4dGVybiBCYXNlVHlwZV90IHhQb3J0UmFpc2VQcml2aWxlZ2UoIHZvaWQgKTsKKworLyoqCisgKiBAYnJpZWYgSWYgeFJ1bm5pbmdQcml2aWxlZ2VkIGlzIG5vdCBwZFRSVUUsIGNhbGxzIHRoZSBwb3J0IHNwZWNpZmljCisgKiBjb2RlIHRvIHJlc2V0IHRoZSBwcml2aWxlZ2UsIG90aGVyd2lzZSBkb2VzIG5vdGhpbmcuCisgKi8KK2V4dGVybiB2b2lkIHZQb3J0UmVzZXRQcml2aWxlZ2UoIEJhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkICk7CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogLyogRWFjaCB0YXNrIG1haW50YWlucyBpdHMgb3duIGludGVycnVwdCBzdGF0dXMgaW4gdGhlIGNyaXRpY2FsIG5lc3RpbmcKQEAgLTU3Myw3ICs1OTUsNyBAQAogCQkJCQkJCQkJCSggcHJ2R2V0TVBVUmVnaW9uU2l6ZVNldHRpbmcoICggdWludDMyX3QgKSBfX0ZMQVNIX3NlZ21lbnRfZW5kX18gLSAoIHVpbnQzMl90ICkgX19GTEFTSF9zZWdtZW50X3N0YXJ0X18gKSApIHwKIAkJCQkJCQkJCQkoIHBvcnRNUFVfUkVHSU9OX0VOQUJMRSApOwogCi0JCS8qIFNldHVwIHRoZSBmaXJzdCAxNksgZm9yIHByaXZpbGVnZWQgb25seSBhY2Nlc3MgKGV2ZW4gdGhvdWdoIGxlc3MKKwkJLyogU2V0dXAgdGhlIGZpcnN0IG5LIGZvciBwcml2aWxlZ2VkIG9ubHkgYWNjZXNzIChldmVuIHRob3VnaCBsZXNzCiAJCXRoYW4gMTBLIGlzIGFjdHVhbGx5IGJlaW5nIHVzZWQpLiAgVGhpcyBpcyB3aGVyZSB0aGUga2VybmVsIGNvZGUgaXMKIAkJcGxhY2VkLiAqLwogCQlwb3J0TVBVX1JFR0lPTl9CQVNFX0FERFJFU1NfUkVHID0JKCAoIHVpbnQzMl90ICkgX19GTEFTSF9zZWdtZW50X3N0YXJ0X18gKSB8IC8qIEJhc2UgYWRkcmVzcy4gKi8KQEAgLTYzOSwyMSArNjYxLDMzIEBACiB9CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotQmFzZVR5cGVfdCB4UG9ydFJhaXNlUHJpdmlsZWdlKCB2b2lkICkKK0Jhc2VUeXBlX3QgeElzUHJpdmlsZWdlZCggdm9pZCApIC8qIF9fYXR0cmlidXRlX18gKCggbmFrZWQgKSkgKi8KIHsKIAlfX2FzbSB2b2xhdGlsZQogCSgKLQkJIgltcnMgcjAsIGNvbnRyb2wJCQkJCQlcbiIKLQkJIgl0c3QgcjAsICMxCQkJCQkJCVxuIiAvKiBJcyB0aGUgdGFzayBydW5uaW5nIHByaXZpbGVnZWQ/ICovCi0JCSIJaXR0ZSBuZQkJCQkJCQkJXG4iCi0JCSIJbW92bmUgcjAsICMwCQkJCQkJXG4iIC8qIENPTlRST0xbMF0hPTAsIHJldHVybiBmYWxzZS4gKi8KLQkJIglzdmNuZSAlMAkJCQkJCQlcbiIgLyogU3dpdGNoIHRvIHByaXZpbGVnZWQuICovCi0JCSIJbW92ZXEgcjAsICMxCQkJCQkJXG4iIC8qIENPTlRST0xbMF09PTAsIHJldHVybiB0cnVlLiAqLwotCQkiCWJ4IGxyCQkJCQkJCQlcbiIKLQkJOjogImkiIChwb3J0U1ZDX1JBSVNFX1BSSVZJTEVHRSkgOiAicjAiLCAibWVtb3J5IgorCSIJbXJzIHIwLCBjb250cm9sCQkJCQkJCVxuIiAvKiByMCA9IENPTlRST0wuICovCisJIgl0c3QgcjAsICMxCQkJCQkJCQlcbiIgLyogUGVyZm9ybSByMCAmIDEgKGJpdHdpc2UgQU5EKSBhbmQgdXBkYXRlIHRoZSBjb25kaXRpb25zIGZsYWcuICovCisJIglpdGUgbmUJCQkJCQkJCQlcbiIKKwkiCW1vdm5lIHIwLCAjMAkJCQkJCQlcbiIgLyogQ09OVFJPTFswXSE9MC4gUmV0dXJuIGZhbHNlIHRvIGluZGljYXRlIHRoYXQgdGhlIHByb2Nlc3NvciBpcyBub3QgcHJpdmlsZWdlZC4gKi8KKwkiCW1vdmVxIHIwLCAjMQkJCQkJCQlcbiIgLyogQ09OVFJPTFswXT09MC4gUmV0dXJuIHRydWUgdG8gaW5kaWNhdGUgdGhhdCB0aGUgcHJvY2Vzc29yIGlzIHByaXZpbGVnZWQuICovCisJIglieCBscgkJCQkJCQkJCVxuIiAvKiBSZXR1cm4uICovCisJIgkJCQkJCQkJCQkJXG4iCisJIgkuYWxpZ24gNAkJCQkJCQkJXG4iCisJOjo6ICJyMCIsICJtZW1vcnkiCiAJKTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi0JcmV0dXJuIDA7Cit2b2lkIHZSZXNldFByaXZpbGVnZSggdm9pZCApIC8qIF9fYXR0cmlidXRlX18gKCggbmFrZWQgKSkgKi8KK3sKKwlfX2FzbSB2b2xhdGlsZQorCSgKKwkiCW1ycyByMCwgY29udHJvbAkJCQkJCQlcbiIgLyogcjAgPSBDT05UUk9MLiAqLworCSIJb3JyIHIwLCAjMQkJCQkJCQkJXG4iIC8qIHIwID0gcjAgfCAxLiAqLworCSIJbXNyIGNvbnRyb2wsIHIwCQkJCQkJCVxuIiAvKiBDT05UUk9MID0gcjAuICovCisJIglieCBscgkJCQkJCQkJCVxuIiAvKiBSZXR1cm4gdG8gdGhlIGNhbGxlci4gKi8KKwk6OjoicjAiLCAibWVtb3J5IgorCSk7CiB9CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIApkaWZmIC0tZ2l0IGEvU291cmNlL3BvcnRhYmxlL0dDQy9BUk1fQ000X01QVS9wb3J0bWFjcm8uaCBiL1NvdXJjZS9wb3J0YWJsZS9HQ0MvQVJNX0NNNF9NUFUvcG9ydG1hY3JvLmgKaW5kZXggNjA1N2YxYy4uMzQ1OGIwZSAxMDA2NDQKLS0tIGEvU291cmNlL3BvcnRhYmxlL0dDQy9BUk1fQ000X01QVS9wb3J0bWFjcm8uaAorKysgYi9Tb3VyY2UvcG9ydGFibGUvR0NDL0FSTV9DTTRfTVBVL3BvcnRtYWNyby5oCkBAIC0xLDYgKzEsNiBAQAogLyoKLSAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMC4xCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjIuMQorICogQ29weXJpZ2h0IChDKSAyMDE5IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKICAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKICAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCkBAIC0yMDAsMTggKzIwMCwyOCBAQAogI2lmbmRlZiBwb3J0Rk9SQ0VfSU5MSU5FCiAJI2RlZmluZSBwb3J0Rk9SQ0VfSU5MSU5FIGlubGluZSBfX2F0dHJpYnV0ZV9fKCggYWx3YXlzX2lubGluZSkpCiAjZW5kaWYKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi0vKiBTZXQgdGhlIHByaXZpbGVnZSBsZXZlbCB0byB1c2VyIG1vZGUgaWYgeFJ1bm5pbmdQcml2aWxlZ2VkIGlzIGZhbHNlLiAqLwotcG9ydEZPUkNFX0lOTElORSBzdGF0aWMgdm9pZCB2UG9ydFJlc2V0UHJpdmlsZWdlKCBCYXNlVHlwZV90IHhSdW5uaW5nUHJpdmlsZWdlZCApCi17Ci0JaWYoIHhSdW5uaW5nUHJpdmlsZWdlZCAhPSBwZFRSVUUgKQotCXsKLQkJX19hc20gdm9sYXRpbGUgKCAiIG1ycyByMCwgY29udHJvbCAJXG4iIFwKLQkJCQkJCSAiIG9yciByMCwgIzEgCQlcbiIgXAotCQkJCQkJICIgbXNyIGNvbnRyb2wsIHIwCVxuIglcCi0JCQkJCQkgOjo6InIwIiwgIm1lbW9yeSIgKTsKLQl9Ci19CitleHRlcm4gQmFzZVR5cGVfdCB4SXNQcml2aWxlZ2VkKCB2b2lkICk7CitleHRlcm4gdm9pZCB2UmVzZXRQcml2aWxlZ2UoIHZvaWQgKTsKKworLyoqCisgKiBAYnJpZWYgQ2hlY2tzIHdoZXRoZXIgb3Igbm90IHRoZSBwcm9jZXNzb3IgaXMgcHJpdmlsZWdlZC4KKyAqCisgKiBAcmV0dXJuIDEgaWYgdGhlIHByb2Nlc3NvciBpcyBhbHJlYWR5IHByaXZpbGVnZWQsIDAgb3RoZXJ3aXNlLgorICovCisjZGVmaW5lIHBvcnRJU19QUklWSUxFR0VEKCkJCQl4SXNQcml2aWxlZ2VkKCkKKworLyoqCisgKiBAYnJpZWYgUmFpc2UgYW4gU1ZDIHJlcXVlc3QgdG8gcmFpc2UgcHJpdmlsZWdlLgorKi8KKyNkZWZpbmUgcG9ydFJBSVNFX1BSSVZJTEVHRSgpCQlfX2FzbSB2b2xhdGlsZSAoICJzdmMgJTAgXG4iIDo6ICJpIiAoIHBvcnRTVkNfUkFJU0VfUFJJVklMRUdFICkgOiAibWVtb3J5IiApOworCisvKioKKyAqIEBicmllZiBMb3dlcnMgdGhlIHByaXZpbGVnZSBsZXZlbCBieSBzZXR0aW5nIHRoZSBiaXQgMCBvZiB0aGUgQ09OVFJPTAorICogcmVnaXN0ZXIuCisgKi8KKyNkZWZpbmUgcG9ydFJFU0VUX1BSSVZJTEVHRSgpCQl2UmVzZXRQcml2aWxlZ2UoKQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKIHBvcnRGT1JDRV9JTkxJTkUgc3RhdGljIEJhc2VUeXBlX3QgeFBvcnRJc0luc2lkZUludGVycnVwdCggdm9pZCApCkBAIC0yODEsNiArMjkxLDcgQEAKIH0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCisjZGVmaW5lIHBvcnRNRU1PUllfQkFSUklFUigpIF9fYXNtIHZvbGF0aWxlKCAiIiA6OjogIm1lbW9yeSIgKQogCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KZGlmZiAtLWdpdCBhL1NvdXJjZS9wb3J0YWJsZS9HQ0MvQVJNX0NNNy9yMHAxL3BvcnQuYyBiL1NvdXJjZS9wb3J0YWJsZS9HQ0MvQVJNX0NNNy9yMHAxL3BvcnQuYwppbmRleCAzMjUyNjRkLi5jZTg2N2VlIDEwMDY0NAotLS0gYS9Tb3VyY2UvcG9ydGFibGUvR0NDL0FSTV9DTTcvcjBwMS9wb3J0LmMKKysrIGIvU291cmNlL3BvcnRhYmxlL0dDQy9BUk1fQ003L3IwcDEvcG9ydC5jCkBAIC0xLDYgKzEsNiBAQAogLyoKLSAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMC4xCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjIuMQorICogQ29weXJpZ2h0IChDKSAyMDE5IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKICAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKICAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCmRpZmYgLS1naXQgYS9Tb3VyY2UvcG9ydGFibGUvR0NDL0FSTV9DTTcvcjBwMS9wb3J0bWFjcm8uaCBiL1NvdXJjZS9wb3J0YWJsZS9HQ0MvQVJNX0NNNy9yMHAxL3BvcnRtYWNyby5oCmluZGV4IDVmOTEyYWUuLjYyNTQzYWMgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9wb3J0YWJsZS9HQ0MvQVJNX0NNNy9yMHAxL3BvcnRtYWNyby5oCisrKyBiL1NvdXJjZS9wb3J0YWJsZS9HQ0MvQVJNX0NNNy9yMHAxL3BvcnRtYWNyby5oCkBAIC0xLDYgKzEsNiBAQAogLyoKLSAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMC4xCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjIuMQorICogQ29weXJpZ2h0IChDKSAyMDE5IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKICAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKICAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCkBAIC0yMzcsNiArMjM3LDcgQEAKIH0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCisjZGVmaW5lIHBvcnRNRU1PUllfQkFSUklFUigpIF9fYXNtIHZvbGF0aWxlKCAiIiA6OjogIm1lbW9yeSIgKQogCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KZGlmZiAtLWdpdCBhL1NvdXJjZS9wb3J0YWJsZS9HQ0MvQVJNX0NNN19NUFUvcjBwMS9wb3J0LmMgYi9Tb3VyY2UvcG9ydGFibGUvR0NDL0FSTV9DTTdfTVBVL3IwcDEvcG9ydC5jCmluZGV4IDEyNDNmNDcuLjZlOGE5MzMgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9wb3J0YWJsZS9HQ0MvQVJNX0NNN19NUFUvcjBwMS9wb3J0LmMKKysrIGIvU291cmNlL3BvcnRhYmxlL0dDQy9BUk1fQ003X01QVS9yMHAxL3BvcnQuYwpAQCAtMSw2ICsxLDYgQEAKIC8qCi0gKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjAuMQotICogQ29weXJpZ2h0IChDKSAyMDE3IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRnJlZVJUT1MgS2VybmVsIFYxMC4yLjEKKyAqIENvcHlyaWdodCAoQykgMjAxOSBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCiAgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCiAgKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgpAQCAtNDcsMTIgKzQ3LDE4IEBACiAKICNpZm5kZWYgY29uZmlnU1lTVElDS19DTE9DS19IWgogCSNkZWZpbmUgY29uZmlnU1lTVElDS19DTE9DS19IWiBjb25maWdDUFVfQ0xPQ0tfSFoKKwkvKiBFbnN1cmUgdGhlIFN5c1RpY2sgaXMgY2xvY2tlZCBhdCB0aGUgc2FtZSBmcmVxdWVuY3kgYXMgdGhlIGNvcmUuICovCisJI2RlZmluZSBwb3J0TlZJQ19TWVNUSUNLX0NMSwkoIDFVTCA8PCAyVUwgKQorI2Vsc2UKKwkvKiBUaGUgd2F5IHRoZSBTeXNUaWNrIGlzIGNsb2NrZWQgaXMgbm90IG1vZGlmaWVkIGluIGNhc2UgaXQgaXMgbm90IHRoZSBzYW1lCisJYXMgdGhlIGNvcmUuICovCisJI2RlZmluZSBwb3J0TlZJQ19TWVNUSUNLX0NMSwkoIDAgKQogI2VuZGlmCiAKIC8qIENvbnN0YW50cyByZXF1aXJlZCB0byBhY2Nlc3MgYW5kIG1hbmlwdWxhdGUgdGhlIE5WSUMuICovCiAjZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfQ1RSTF9SRUcJCQkJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZTAxMCApICkKICNkZWZpbmUgcG9ydE5WSUNfU1lTVElDS19MT0FEX1JFRwkJCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlMDE0ICkgKQotI2RlZmluZSBwb3J0TlZJQ19TWVNUSUNLX0NVUlJFTlRfVkFMVUVfUkVHCSAgICAoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlMDE4ICkgKQorI2RlZmluZSBwb3J0TlZJQ19TWVNUSUNLX0NVUlJFTlRfVkFMVUVfUkVHCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlMDE4ICkgKQogI2RlZmluZSBwb3J0TlZJQ19TWVNQUkkyX1JFRwkJCQkJKCAqCSggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZWQyMCApICkKICNkZWZpbmUgcG9ydE5WSUNfU1lTUFJJMV9SRUcJCQkJCSggKiAoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVkMWMgKSApCiAjZGVmaW5lIHBvcnROVklDX1NZU19DVFJMX1NUQVRFX1JFRwkJCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZDI0ICkgKQpAQCAtNzMsOSArNzksNyBAQAogI2RlZmluZSBwb3J0UEVSSVBIRVJBTFNfRU5EX0FERFJFU1MJCQkJMHg1RkZGRkZGRlVMCiAKIC8qIENvbnN0YW50cyByZXF1aXJlZCB0byBhY2Nlc3MgYW5kIG1hbmlwdWxhdGUgdGhlIFN5c1RpY2suICovCi0jZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfQ0xLCQkJCQkoIDB4MDAwMDAwMDRVTCApCiAjZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfSU5UCQkJCQkoIDB4MDAwMDAwMDJVTCApCi0jZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfQ09VTlRfRkxBRyAgICAgIAkJKCAxVUwgPDwgMTZVTCApCiAjZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfRU5BQkxFCQkJCQkoIDB4MDAwMDAwMDFVTCApCiAjZGVmaW5lIHBvcnROVklDX1BFTkRTVl9QUkkJCQkJCQkoICggKCB1aW50MzJfdCApIGNvbmZpZ0tFUk5FTF9JTlRFUlJVUFRfUFJJT1JJVFkgKSA8PCAxNlVMICkKICNkZWZpbmUgcG9ydE5WSUNfU1lTVElDS19QUkkJCQkJCSggKCAoIHVpbnQzMl90ICkgY29uZmlnS0VSTkVMX0lOVEVSUlVQVF9QUklPUklUWSApIDw8IDI0VUwgKQpAQCAtODcsNyArOTEsNyBAQAogCiAvKiBDb25zdGFudHMgcmVxdWlyZWQgdG8gc2V0IHVwIHRoZSBpbml0aWFsIHN0YWNrLiAqLwogI2RlZmluZSBwb3J0SU5JVElBTF9YUFNSCQkJCQkJKCAweDAxMDAwMDAwVUwgKQotI2RlZmluZSBwb3J0SU5JVElBTF9FWEVDX1JFVFVSTgkJCQkJKCAweGZmZmZmZmZkVUwgKQorI2RlZmluZSBwb3J0SU5JVElBTF9FWENfUkVUVVJOCQkJCQkoIDB4ZmZmZmZmZmRVTCApCiAjZGVmaW5lIHBvcnRJTklUSUFMX0NPTlRST0xfSUZfVU5QUklWSUxFR0VECQkoIDB4MDMgKQogI2RlZmluZSBwb3J0SU5JVElBTF9DT05UUk9MX0lGX1BSSVZJTEVHRUQJCSggMHgwMiApCiAKQEAgLTE0MSwxMSArMTQ1LDExIEBACiBzdGF0aWMgdWludDMyX3QgcHJ2R2V0TVBVUmVnaW9uU2l6ZVNldHRpbmcoIHVpbnQzMl90IHVsQWN0dWFsU2l6ZUluQnl0ZXMgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOwogCiAvKgotICogQ2hlY2tzIHRvIHNlZSBpZiBiZWluZyBjYWxsZWQgZnJvbSB0aGUgY29udGV4dCBvZiBhbiB1bnByaXZpbGVnZWQgdGFzaywgYW5kCi0gKiBpZiBzbyByYWlzZXMgdGhlIHByaXZpbGVnZSBsZXZlbCBhbmQgcmV0dXJucyBmYWxzZSAtIG90aGVyd2lzZSBkb2VzIG5vdGhpbmcKLSAqIG90aGVyIHRoYW4gcmV0dXJuIHRydWUuCisgKiBTZXR1cCB0aGUgdGltZXIgdG8gZ2VuZXJhdGUgdGhlIHRpY2sgaW50ZXJydXB0cy4gIFRoZSBpbXBsZW1lbnRhdGlvbiBpbiB0aGlzCisgKiBmaWxlIGlzIHdlYWsgdG8gYWxsb3cgYXBwbGljYXRpb24gd3JpdGVycyB0byBjaGFuZ2UgdGhlIHRpbWVyIHVzZWQgdG8KKyAqIGdlbmVyYXRlIHRoZSB0aWNrIGludGVycnVwdC4KICAqLwotQmFzZVR5cGVfdCB4UG9ydFJhaXNlUHJpdmlsZWdlKCB2b2lkICkgX19hdHRyaWJ1dGVfXygoIG5ha2VkICkpOwordm9pZCB2UG9ydFNldHVwVGltZXJJbnRlcnJ1cHQoIHZvaWQgKTsKIAogLyoKICAqIFN0YW5kYXJkIEZyZWVSVE9TIGV4Y2VwdGlvbiBoYW5kbGVycy4KQEAgLTE2OSw0MyArMTczLDQzIEBACiAgKiBGdW5jdGlvbiB0byBlbmFibGUgdGhlIFZGUC4KICAqLwogIHN0YXRpYyB2b2lkIHZQb3J0RW5hYmxlVkZQKCB2b2lkICkgX19hdHRyaWJ1dGVfXyAoKCBuYWtlZCApKTsKLSAKLS8qCi0gKiBUaGUgbnVtYmVyIG9mIFN5c1RpY2sgaW5jcmVtZW50cyB0aGF0IG1ha2UgdXAgb25lIHRpY2sgcGVyaW9kLgotICovCi0jaWYgY29uZmlnVVNFX1RJQ0tMRVNTX0lETEUgPT0gMQotCXN0YXRpYyB1aW50MzJfdCB1bFRpbWVyQ291bnRzRm9yT25lVGljayA9IDA7Ci0jZW5kaWYgLyogY29uZmlnVVNFX1RJQ0tMRVNTX0lETEUgKi8KIAotLyoKLSAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiB0aWNrIHBlcmlvZHMgdGhhdCBjYW4gYmUgc3VwcHJlc3NlZCBpcyBsaW1pdGVkIGJ5IHRoZQotICogMjQgYml0IHJlc29sdXRpb24gb2YgdGhlIFN5c1RpY2sgdGltZXIuCisvKioKKyAqIEBicmllZiBDaGVja3Mgd2hldGhlciBvciBub3QgdGhlIHByb2Nlc3NvciBpcyBwcml2aWxlZ2VkLgorICoKKyAqIEByZXR1cm4gMSBpZiB0aGUgcHJvY2Vzc29yIGlzIGFscmVhZHkgcHJpdmlsZWdlZCwgMCBvdGhlcndpc2UuCiAgKi8KLSNpZiBjb25maWdVU0VfVElDS0xFU1NfSURMRSA9PSAxCi0Jc3RhdGljIHVpbnQzMl90IHhNYXhpbXVtUG9zc2libGVTdXBwcmVzc2VkVGlja3MgPSAwOwotI2VuZGlmIC8qIGNvbmZpZ1VTRV9USUNLTEVTU19JRExFICovCitCYXNlVHlwZV90IHhJc1ByaXZpbGVnZWQoIHZvaWQgKSBfX2F0dHJpYnV0ZV9fICgoIG5ha2VkICkpOwogCi0vKgotICogQ29tcGVuc2F0ZSBmb3IgdGhlIENQVSBjeWNsZXMgdGhhdCBwYXNzIHdoaWxlIHRoZSBTeXNUaWNrIGlzIHN0b3BwZWQgKGxvdwotICogcG93ZXIgZnVuY3Rpb25hbGl0eSBvbmx5LgorLyoqCisgKiBAYnJpZWYgTG93ZXJzIHRoZSBwcml2aWxlZ2UgbGV2ZWwgYnkgc2V0dGluZyB0aGUgYml0IDAgb2YgdGhlIENPTlRST0wKKyAqIHJlZ2lzdGVyLgorICoKKyAqIEJpdCAwIG9mIHRoZSBDT05UUk9MIHJlZ2lzdGVyIGRlZmluZXMgdGhlIHByaXZpbGVnZSBsZXZlbCBvZiBUaHJlYWQgTW9kZS4KKyAqICBCaXRbMF0gPSAwIC0tPiBUaGUgcHJvY2Vzc29yIGlzIHJ1bm5pbmcgcHJpdmlsZWdlZAorICogIEJpdFswXSA9IDEgLS0+IFRoZSBwcm9jZXNzb3IgaXMgcnVubmluZyB1bnByaXZpbGVnZWQuCiAgKi8KLSNpZiBjb25maWdVU0VfVElDS0xFU1NfSURMRSA9PSAxCi0Jc3RhdGljIHVpbnQzMl90IHVsU3RvcHBlZFRpbWVyQ29tcGVuc2F0aW9uID0gMDsKLSNlbmRpZiAvKiBjb25maWdVU0VfVElDS0xFU1NfSURMRSAqLwordm9pZCB2UmVzZXRQcml2aWxlZ2UoIHZvaWQgKSBfX2F0dHJpYnV0ZV9fICgoIG5ha2VkICkpOwogCi0vKgotICogVXNlZCBieSB0aGUgcG9ydEFTU0VSVF9JRl9JTlRFUlJVUFRfUFJJT1JJVFlfSU5WQUxJRCgpIG1hY3JvIHRvIGVuc3VyZQotICogRnJlZVJUT1MgQVBJIGZ1bmN0aW9ucyBhcmUgbm90IGNhbGxlZCBmcm9tIGludGVycnVwdHMgdGhhdCBoYXZlIGJlZW4gYXNzaWduZWQKLSAqIGEgcHJpb3JpdHkgYWJvdmUgY29uZmlnTUFYX1NZU0NBTExfSU5URVJSVVBUX1BSSU9SSVRZLgorLyoqCisgKiBAYnJpZWYgQ2FsbHMgdGhlIHBvcnQgc3BlY2lmaWMgY29kZSB0byByYWlzZSB0aGUgcHJpdmlsZWdlLgorICoKKyAqIEByZXR1cm4gcGRGQUxTRSBpZiBwcml2aWxlZ2Ugd2FzIHJhaXNlZCwgcGRUUlVFIG90aGVyd2lzZS4KICAqLworZXh0ZXJuIEJhc2VUeXBlX3QgeFBvcnRSYWlzZVByaXZpbGVnZSggdm9pZCApOworCisvKioKKyAqIEBicmllZiBJZiB4UnVubmluZ1ByaXZpbGVnZWQgaXMgbm90IHBkVFJVRSwgY2FsbHMgdGhlIHBvcnQgc3BlY2lmaWMKKyAqIGNvZGUgdG8gcmVzZXQgdGhlIHByaXZpbGVnZSwgb3RoZXJ3aXNlIGRvZXMgbm90aGluZy4KKyAqLworZXh0ZXJuIHZvaWQgdlBvcnRSZXNldFByaXZpbGVnZSggQmFzZVR5cGVfdCB4UnVubmluZ1ByaXZpbGVnZWQgKTsKKwogI2lmICggY29uZmlnQVNTRVJUX0RFRklORUQgPT0gMSApCiAJIHN0YXRpYyB1aW50OF90IHVjTWF4U3lzQ2FsbFByaW9yaXR5ID0gMDsKIAkgc3RhdGljIHVpbnQzMl90IHVsTWF4UFJJR1JPVVBWYWx1ZSA9IDA7CiAJIHN0YXRpYyBjb25zdCB2b2xhdGlsZSB1aW50OF90ICogY29uc3QgcGNJbnRlcnJ1cHRQcmlvcml0eVJlZ2lzdGVycyA9ICggY29uc3Qgdm9sYXRpbGUgdWludDhfdCAqIGNvbnN0ICkgcG9ydE5WSUNfSVBfUkVHSVNURVJTX09GRlNFVF8xNjsKICNlbmRpZiAvKiBjb25maWdBU1NFUlRfREVGSU5FRCAqLwogCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQogLyoKICAqIFNlZSBoZWFkZXIgZmlsZSBmb3IgZGVzY3JpcHRpb24uCiAgKi8KQEAgLTIyMSwxMiArMjI1LDEyIEBACiAJKnB4VG9wT2ZTdGFjayA9IDA7CS8qIExSICovCiAJcHhUb3BPZlN0YWNrIC09IDU7CS8qIFIxMiwgUjMsIFIyIGFuZCBSMS4gKi8KIAkqcHhUb3BPZlN0YWNrID0gKCBTdGFja1R5cGVfdCApIHB2UGFyYW1ldGVyczsJLyogUjAgKi8KLQkKKwogCS8qIEEgc2F2ZSBtZXRob2QgaXMgYmVpbmcgdXNlZCB0aGF0IHJlcXVpcmVzIGVhY2ggdGFzayB0byBtYWludGFpbiBpdHMKIAlvd24gZXhlYyByZXR1cm4gdmFsdWUuICovCiAJcHhUb3BPZlN0YWNrLS07Ci0JKnB4VG9wT2ZTdGFjayA9IHBvcnRJTklUSUFMX0VYRUNfUkVUVVJOOwotCQorCSpweFRvcE9mU3RhY2sgPSBwb3J0SU5JVElBTF9FWENfUkVUVVJOOworCiAJcHhUb3BPZlN0YWNrIC09IDk7CS8qIFIxMSwgUjEwLCBSOSwgUjgsIFI3LCBSNiwgUjUgYW5kIFI0LiAqLwogCiAJaWYoIHhSdW5Qcml2aWxlZ2VkID09IHBkVFJVRSApCkBAIC0yNTYsNyArMjYwLDcgQEAKIAkJCSIJbXJzIHIwLCBwc3AJCQkJCQlcbiIKIAkJI2VuZGlmCiAJCQkiCWIgJTAJCQkJCQkJXG4iCi0JCQk6OiJpIihwcnZTVkNIYW5kbGVyKToicjAiCisJCQk6OiJpIihwcnZTVkNIYW5kbGVyKToicjAiLCAibWVtb3J5IgogCSk7CiB9CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTI3OSw3ICsyODMsNyBAQAogCQkJCQkJCQkJCQlidXQgZG8gZW5zdXJlIHRoZSBjb2RlIGlzIGNvbXBsZXRlbHkKIAkJCQkJCQkJCQkJd2l0aGluIHRoZSBzcGVjaWZpZWQgYmVoYXZpb3VyIGZvciB0aGUKIAkJCQkJCQkJCQkJYXJjaGl0ZWN0dXJlLiAqLwotCQkJCQkJCQkJCQlfX2FzbSB2b2xhdGlsZSggImRzYiIgKTsKKwkJCQkJCQkJCQkJX19hc20gdm9sYXRpbGUoICJkc2IiIDo6OiAibWVtb3J5IiApOwogCQkJCQkJCQkJCQlfX2FzbSB2b2xhdGlsZSggImlzYiIgKTsKIAogCQkJCQkJCQkJCQlicmVhazsKQEAgLTI4OSw3ICsyOTMsNyBAQAogCQkJCQkJCQkJCQkJIgltcnMgcjEsIGNvbnRyb2wJCVxuIiAvKiBPYnRhaW4gY3VycmVudCBjb250cm9sIHZhbHVlLiAqLwogCQkJCQkJCQkJCQkJIgliaWMgcjEsICMxCQkJXG4iIC8qIFNldCBwcml2aWxlZ2UgYml0LiAqLwogCQkJCQkJCQkJCQkJIgltc3IgY29udHJvbCwgcjEJCVxuIiAvKiBXcml0ZSBiYWNrIG5ldyBjb250cm9sIHZhbHVlLiAqLwotCQkJCQkJCQkJCQkJOjo6InIxIgorCQkJCQkJCQkJCQkJOjo6ICJyMSIsICJtZW1vcnkiCiAJCQkJCQkJCQkJCSk7CiAJCQkJCQkJCQkJCWJyZWFrOwogCkBAIC0zNjksNiArMzczLDI0IEBACiAJCQl1Y01heFByaW9yaXR5VmFsdWUgPDw9ICggdWludDhfdCApIDB4MDE7CiAJCX0KIAorCQkjaWZkZWYgX19OVklDX1BSSU9fQklUUworCQl7CisJCQkvKiBDaGVjayB0aGUgQ01TSVMgY29uZmlndXJhdGlvbiB0aGF0IGRlZmluZXMgdGhlIG51bWJlciBvZgorCQkJcHJpb3JpdHkgYml0cyBtYXRjaGVzIHRoZSBudW1iZXIgb2YgcHJpb3JpdHkgYml0cyBhY3R1YWxseSBxdWVyaWVkCisJCQlmcm9tIHRoZSBoYXJkd2FyZS4gKi8KKwkJCWNvbmZpZ0FTU0VSVCggKCBwb3J0TUFYX1BSSUdST1VQX0JJVFMgLSB1bE1heFBSSUdST1VQVmFsdWUgKSA9PSBfX05WSUNfUFJJT19CSVRTICk7CisJCX0KKwkJI2VuZGlmCisKKwkJI2lmZGVmIGNvbmZpZ1BSSU9fQklUUworCQl7CisJCQkvKiBDaGVjayB0aGUgRnJlZVJUT1MgY29uZmlndXJhdGlvbiB0aGF0IGRlZmluZXMgdGhlIG51bWJlciBvZgorCQkJcHJpb3JpdHkgYml0cyBtYXRjaGVzIHRoZSBudW1iZXIgb2YgcHJpb3JpdHkgYml0cyBhY3R1YWxseSBxdWVyaWVkCisJCQlmcm9tIHRoZSBoYXJkd2FyZS4gKi8KKwkJCWNvbmZpZ0FTU0VSVCggKCBwb3J0TUFYX1BSSUdST1VQX0JJVFMgLSB1bE1heFBSSUdST1VQVmFsdWUgKSA9PSBjb25maWdQUklPX0JJVFMgKTsKKwkJfQorCQkjZW5kaWYKKwogCQkvKiBTaGlmdCB0aGUgcHJpb3JpdHkgZ3JvdXAgdmFsdWUgYmFjayB0byBpdHMgcG9zaXRpb24gd2l0aGluIHRoZSBBSVJDUgogCQlyZWdpc3Rlci4gKi8KIAkJdWxNYXhQUklHUk9VUFZhbHVlIDw8PSBwb3J0UFJJR1JPVVBfU0hJRlQ7CkBAIC00MDIsMTkgKzQyNCwyNCBAQAogCS8qIExhenkgc2F2ZSBhbHdheXMuICovCiAJKiggcG9ydEZQQ0NSICkgfD0gcG9ydEFTUEVOX0FORF9MU1BFTl9CSVRTOwogCi0JLyogU3RhcnQgdGhlIGZpcnN0IHRhc2suICovCisJLyogU3RhcnQgdGhlIGZpcnN0IHRhc2suICBUaGlzIGFsc28gY2xlYXJzIHRoZSBiaXQgdGhhdCBpbmRpY2F0ZXMgdGhlIEZQVSBpcworCWluIHVzZSBpbiBjYXNlIHRoZSBGUFUgd2FzIHVzZWQgYmVmb3JlIHRoZSBzY2hlZHVsZXIgd2FzIHN0YXJ0ZWQgLSB3aGljaAorCXdvdWxkIG90aGVyd2lzZSByZXN1bHQgaW4gdGhlIHVubmVjZXNzYXJ5IGxlYXZpbmcgb2Ygc3BhY2UgaW4gdGhlIFNWQyBzdGFjaworCWZvciBsYXp5IHNhdmluZyBvZiBGUFUgcmVnaXN0ZXJzLiAqLwogCV9fYXNtIHZvbGF0aWxlKAogCQkJCQkiIGxkciByMCwgPTB4RTAwMEVEMDggCVxuIiAvKiBVc2UgdGhlIE5WSUMgb2Zmc2V0IHJlZ2lzdGVyIHRvIGxvY2F0ZSB0aGUgc3RhY2suICovCiAJCQkJCSIgbGRyIHIwLCBbcjBdIAkJCVxuIgogCQkJCQkiIGxkciByMCwgW3IwXSAJCQlcbiIKIAkJCQkJIiBtc3IgbXNwLCByMAkJCVxuIiAvKiBTZXQgdGhlIG1zcCBiYWNrIHRvIHRoZSBzdGFydCBvZiB0aGUgc3RhY2suICovCisJCQkJCSIgbW92IHIwLCAjMAkJCVxuIiAvKiBDbGVhciB0aGUgYml0IHRoYXQgaW5kaWNhdGVzIHRoZSBGUFUgaXMgaW4gdXNlLCBzZWUgY29tbWVudCBhYm92ZS4gKi8KKwkJCQkJIiBtc3IgY29udHJvbCwgcjAJCVxuIgogCQkJCQkiIGNwc2llIGkJCQkJXG4iIC8qIEdsb2JhbGx5IGVuYWJsZSBpbnRlcnJ1cHRzLiAqLwogCQkJCQkiIGNwc2llIGYJCQkJXG4iCiAJCQkJCSIgZHNiCQkJCQlcbiIKIAkJCQkJIiBpc2IJCQkJCVxuIgogCQkJCQkiIHN2YyAlMAkJCQlcbiIgLyogU3lzdGVtIGNhbGwgdG8gc3RhcnQgZmlyc3QgdGFzay4gKi8KIAkJCQkJIiBub3AJCQkJCVxuIgotCQkJCQk6OiAiaSIgKHBvcnRTVkNfU1RBUlRfU0NIRURVTEVSKSApOworCQkJCQk6OiAiaSIgKHBvcnRTVkNfU1RBUlRfU0NIRURVTEVSKSA6ICJtZW1vcnkiICk7CiAKIAkvKiBTaG91bGQgbm90IGdldCBoZXJlISAqLwogCXJldHVybiAwOwpAQCAtNDYxLDYgKzQ4OCw3IEBACiAJX19hc20gdm9sYXRpbGUKIAkoCiAJCSIJbXJzIHIwLCBwc3AJCQkJCQkJXG4iCisJCSIJaXNiCQkJCQkJCQkJXG4iCiAJCSIJCQkJCQkJCQkJXG4iCiAJCSIJbGRyCXIzLCBweEN1cnJlbnRUQ0JDb25zdAkJCVxuIiAvKiBHZXQgdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IFRDQi4gKi8KIAkJIglsZHIJcjIsIFtyM10JCQkJCQlcbiIKQEAgLTQ3Myw3ICs1MDEsNyBAQAogCQkiCXN0bWRiIHIwISwge3IxLCByNC1yMTEsIHIxNH0JCVxuIiAvKiBTYXZlIHRoZSByZW1haW5pbmcgcmVnaXN0ZXJzLiAqLwogCQkiCXN0ciByMCwgW3IyXQkJCQkJCVxuIiAvKiBTYXZlIHRoZSBuZXcgdG9wIG9mIHN0YWNrIGludG8gdGhlIGZpcnN0IG1lbWJlciBvZiB0aGUgVENCLiAqLwogCQkiCQkJCQkJCQkJCVxuIgotCQkiCXN0bWRiIHNwISwge3IzfQkJCQkJCVxuIgorCQkiCXN0bWRiIHNwISwge3IwLCByM30JCQkJCVxuIgogCQkiCW1vdiByMCwgJTAJCQkJCQkJXG4iCiAJICAiCWNwc2lkIGkJCQkJCQkJCVxuIiAvKiBFcnJhdGEgd29ya2Fyb3VuZC4gKi8KIAkJIgltc3IgYmFzZXByaSwgcjAJCQkJCQlcbiIKQEAgLTQ4Myw4ICs1MTEsOCBAQAogCQkiCWJsIHZUYXNrU3dpdGNoQ29udGV4dAkJCQlcbiIKIAkJIgltb3YgcjAsICMwCQkJCQkJCVxuIgogCQkiCW1zciBiYXNlcHJpLCByMAkJCQkJCVxuIgotCQkiCWxkbWlhIHNwISwge3IzfQkJCQkJCVxuIgotCQkiCQkJCQkJCQkJCVxuIgkvKiBSZXN0b3JlIHRoZSBjb250ZXh0LiAqLworCQkiCWxkbWlhIHNwISwge3IwLCByM30JCQkJCVxuIgorCQkiCQkJCQkJCQkJCVxuIiAvKiBSZXN0b3JlIHRoZSBjb250ZXh0LiAqLwogCQkiCWxkciByMSwgW3IzXQkJCQkJCVxuIgogCQkiCWxkciByMCwgW3IxXQkJCQkJCVxuIiAvKiBUaGUgZmlyc3QgaXRlbSBpbiB0aGUgVENCIGlzIHRoZSB0YXNrIHRvcCBvZiBzdGFjay4gKi8KIAkJIglhZGQgcjEsIHIxLCAjNAkJCQkJCVxuIiAvKiBNb3ZlIG9udG8gdGhlIHNlY29uZCBpdGVtIGluIHRoZSBUQ0IuLi4gKi8KQEAgLTY4NiwxNCArNzE0LDkgQEAKICAqLwogX19hdHRyaWJ1dGVfXygoIHdlYWsgKSkgdm9pZCB2UG9ydFNldHVwVGltZXJJbnRlcnJ1cHQoIHZvaWQgKQogewotCS8qIENhbGN1bGF0ZSB0aGUgY29uc3RhbnRzIHJlcXVpcmVkIHRvIGNvbmZpZ3VyZSB0aGUgdGljayBpbnRlcnJ1cHQuICovCi0JI2lmIGNvbmZpZ1VTRV9USUNLTEVTU19JRExFID09IDEKLQl7Ci0JCXVsVGltZXJDb3VudHNGb3JPbmVUaWNrID0gKCBjb25maWdTWVNUSUNLX0NMT0NLX0haIC8gY29uZmlnVElDS19SQVRFX0haICk7Ci0JCXhNYXhpbXVtUG9zc2libGVTdXBwcmVzc2VkVGlja3MgPSBwb3J0TUFYXzI0X0JJVF9OVU1CRVIgLyB1bFRpbWVyQ291bnRzRm9yT25lVGljazsKLQkJdWxTdG9wcGVkVGltZXJDb21wZW5zYXRpb24gPSBwb3J0TUlTU0VEX0NPVU5UU19GQUNUT1IgLyAoIGNvbmZpZ0NQVV9DTE9DS19IWiAvIGNvbmZpZ1NZU1RJQ0tfQ0xPQ0tfSFogKTsKLQl9Ci0JI2VuZGlmIC8qIGNvbmZpZ1VTRV9USUNLTEVTU19JRExFICovCisJLyogU3RvcCBhbmQgY2xlYXIgdGhlIFN5c1RpY2suICovCisJcG9ydE5WSUNfU1lTVElDS19DVFJMX1JFRyA9IDBVTDsKKwlwb3J0TlZJQ19TWVNUSUNLX0NVUlJFTlRfVkFMVUVfUkVHID0gMFVMOwogCiAJLyogQ29uZmlndXJlIFN5c1RpY2sgdG8gaW50ZXJydXB0IGF0IHRoZSByZXF1ZXN0ZWQgcmF0ZS4gKi8KIAlwb3J0TlZJQ19TWVNUSUNLX0xPQURfUkVHID0gKCBjb25maWdTWVNUSUNLX0NMT0NLX0haIC8gY29uZmlnVElDS19SQVRFX0haICkgLSAxVUw7CkBAIC03MjUsNiArNzQ4LDkgQEAKIGV4dGVybiB1aW50MzJfdCBfX3ByaXZpbGVnZWRfZGF0YV9zdGFydF9fW107CiBleHRlcm4gdWludDMyX3QgX19wcml2aWxlZ2VkX2RhdGFfZW5kX19bXTsKIAorCS8qIENoZWNrIHRoZSBleHBlY3RlZCBNUFUgaXMgcHJlc2VudC4gKi8KKwlpZiggcG9ydE1QVV9UWVBFX1JFRyA9PSBwb3J0RVhQRUNURURfTVBVX1RZUEVfVkFMVUUgKQorCXsKIAkJLyogRmlyc3Qgc2V0dXAgdGhlIGVudGlyZSBmbGFzaCBmb3IgdW5wcml2aWxlZ2VkIHJlYWQgb25seSBhY2Nlc3MuICovCiAJCXBvcnRNUFVfUkVHSU9OX0JBU0VfQUREUkVTU19SRUcgPQkoICggdWludDMyX3QgKSBfX0ZMQVNIX3NlZ21lbnRfc3RhcnRfXyApIHwgLyogQmFzZSBhZGRyZXNzLiAqLwogCQkJCQkJCQkJCQkoIHBvcnRNUFVfUkVHSU9OX1ZBTElEICkgfApAQCAtNzM1LDcgKzc2MSw3IEBACiAJCQkJCQkJCQkJKCBwcnZHZXRNUFVSZWdpb25TaXplU2V0dGluZyggKCB1aW50MzJfdCApIF9fRkxBU0hfc2VnbWVudF9lbmRfXyAtICggdWludDMyX3QgKSBfX0ZMQVNIX3NlZ21lbnRfc3RhcnRfXyApICkgfAogCQkJCQkJCQkJCSggcG9ydE1QVV9SRUdJT05fRU5BQkxFICk7CiAKLQkJLyogU2V0dXAgdGhlIGZpcnN0IDE2SyBmb3IgcHJpdmlsZWdlZCBvbmx5IGFjY2VzcyAoZXZlbiB0aG91Z2ggbGVzcworCQkvKiBTZXR1cCB0aGUgZmlyc3QgbksgZm9yIHByaXZpbGVnZWQgb25seSBhY2Nlc3MgKGV2ZW4gdGhvdWdoIGxlc3MKIAkJdGhhbiAxMEsgaXMgYWN0dWFsbHkgYmVpbmcgdXNlZCkuICBUaGlzIGlzIHdoZXJlIHRoZSBrZXJuZWwgY29kZSBpcwogCQlwbGFjZWQuICovCiAJCXBvcnRNUFVfUkVHSU9OX0JBU0VfQUREUkVTU19SRUcgPQkoICggdWludDMyX3QgKSBfX0ZMQVNIX3NlZ21lbnRfc3RhcnRfXyApIHwgLyogQmFzZSBhZGRyZXNzLiAqLwpAQCAtNzczLDYgKzc5OSw3IEBACiAKIAkJLyogRW5hYmxlIHRoZSBNUFUgd2l0aCB0aGUgYmFja2dyb3VuZCByZWdpb24gY29uZmlndXJlZC4gKi8KIAkJcG9ydE1QVV9DVFJMX1JFRyB8PSAoIHBvcnRNUFVfRU5BQkxFIHwgcG9ydE1QVV9CQUNLR1JPVU5EX0VOQUJMRSApOworICAgIH0KIH0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCkBAIC04MDAsMjEgKzgyNywzMyBAQAogfQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLUJhc2VUeXBlX3QgeFBvcnRSYWlzZVByaXZpbGVnZSggdm9pZCApCitCYXNlVHlwZV90IHhJc1ByaXZpbGVnZWQoIHZvaWQgKSAvKiBfX2F0dHJpYnV0ZV9fICgoIG5ha2VkICkpICovCiB7CiAJX19hc20gdm9sYXRpbGUKIAkoCi0JCSIJbXJzIHIwLCBjb250cm9sCQkJCQkJXG4iCi0JCSIJdHN0IHIwLCAjMQkJCQkJCQlcbiIgLyogSXMgdGhlIHRhc2sgcnVubmluZyBwcml2aWxlZ2VkPyAqLwotCQkiCWl0dGUgbmUJCQkJCQkJCVxuIgotCQkiCW1vdm5lIHIwLCAjMAkJCQkJCVxuIiAvKiBDT05UUk9MWzBdIT0wLCByZXR1cm4gZmFsc2UuICovCi0JCSIJc3ZjbmUgJTAJCQkJCQkJXG4iIC8qIFN3aXRjaCB0byBwcml2aWxlZ2VkLiAqLwotCQkiCW1vdmVxIHIwLCAjMQkJCQkJCVxuIiAvKiBDT05UUk9MWzBdPT0wLCByZXR1cm4gdHJ1ZS4gKi8KLQkJIglieCBscgkJCQkJCQkJXG4iCi0JCTo6ICJpIiAocG9ydFNWQ19SQUlTRV9QUklWSUxFR0UpIDogInIwIgorCSIJbXJzIHIwLCBjb250cm9sCQkJCQkJCVxuIiAvKiByMCA9IENPTlRST0wuICovCisJIgl0c3QgcjAsICMxCQkJCQkJCQlcbiIgLyogUGVyZm9ybSByMCAmIDEgKGJpdHdpc2UgQU5EKSBhbmQgdXBkYXRlIHRoZSBjb25kaXRpb25zIGZsYWcuICovCisJIglpdGUgbmUJCQkJCQkJCQlcbiIKKwkiCW1vdm5lIHIwLCAjMAkJCQkJCQlcbiIgLyogQ09OVFJPTFswXSE9MC4gUmV0dXJuIGZhbHNlIHRvIGluZGljYXRlIHRoYXQgdGhlIHByb2Nlc3NvciBpcyBub3QgcHJpdmlsZWdlZC4gKi8KKwkiCW1vdmVxIHIwLCAjMQkJCQkJCQlcbiIgLyogQ09OVFJPTFswXT09MC4gUmV0dXJuIHRydWUgdG8gaW5kaWNhdGUgdGhhdCB0aGUgcHJvY2Vzc29yIGlzIHByaXZpbGVnZWQuICovCisJIglieCBscgkJCQkJCQkJCVxuIiAvKiBSZXR1cm4uICovCisJIgkJCQkJCQkJCQkJXG4iCisJIgkuYWxpZ24gNAkJCQkJCQkJXG4iCisJOjo6ICJyMCIsICJtZW1vcnkiCiAJKTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi0JcmV0dXJuIDA7Cit2b2lkIHZSZXNldFByaXZpbGVnZSggdm9pZCApIC8qIF9fYXR0cmlidXRlX18gKCggbmFrZWQgKSkgKi8KK3sKKwlfX2FzbSB2b2xhdGlsZQorCSgKKwkiCW1ycyByMCwgY29udHJvbAkJCQkJCQlcbiIgLyogcjAgPSBDT05UUk9MLiAqLworCSIJb3JyIHIwLCAjMQkJCQkJCQkJXG4iIC8qIHIwID0gcjAgfCAxLiAqLworCSIJbXNyIGNvbnRyb2wsIHIwCQkJCQkJCVxuIiAvKiBDT05UUk9MID0gcjAuICovCisJIglieCBscgkJCQkJCQkJCVxuIiAvKiBSZXR1cm4gdG8gdGhlIGNhbGxlci4gKi8KKwk6OjoicjAiLCAibWVtb3J5IgorCSk7CiB9CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIApAQCAtOTIyLDcgKzk2MSw3IEBACiAJdWludDhfdCB1Y0N1cnJlbnRQcmlvcml0eTsKIAogCQkvKiBPYnRhaW4gdGhlIG51bWJlciBvZiB0aGUgY3VycmVudGx5IGV4ZWN1dGluZyBpbnRlcnJ1cHQuICovCi0JCV9fYXNtIHZvbGF0aWxlKCAibXJzICUwLCBpcHNyIiA6ICI9ciIoIHVsQ3VycmVudEludGVycnVwdCApICk7CisJCV9fYXNtIHZvbGF0aWxlKCAibXJzICUwLCBpcHNyIiA6ICI9ciIoIHVsQ3VycmVudEludGVycnVwdCApIDo6ICJtZW1vcnkiICk7CiAKIAkJLyogSXMgdGhlIGludGVycnVwdCBudW1iZXIgYSB1c2VyIGRlZmluZWQgaW50ZXJydXB0PyAqLwogCQlpZiggdWxDdXJyZW50SW50ZXJydXB0ID49IHBvcnRGSVJTVF9VU0VSX0lOVEVSUlVQVF9OVU1CRVIgKQpkaWZmIC0tZ2l0IGEvU291cmNlL3BvcnRhYmxlL0dDQy9BUk1fQ003X01QVS9yMHAxL3BvcnRtYWNyby5oIGIvU291cmNlL3BvcnRhYmxlL0dDQy9BUk1fQ003X01QVS9yMHAxL3BvcnRtYWNyby5oCmluZGV4IGJlMWQ3NDIuLjNhMmQ2MDQgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9wb3J0YWJsZS9HQ0MvQVJNX0NNN19NUFUvcjBwMS9wb3J0bWFjcm8uaAorKysgYi9Tb3VyY2UvcG9ydGFibGUvR0NDL0FSTV9DTTdfTVBVL3IwcDEvcG9ydG1hY3JvLmgKQEAgLTEsNiArMSw2IEBACiAvKgotICogRnJlZVJUT1MgS2VybmVsIFYxMC4wLjEKLSAqIENvcHlyaWdodCAoQykgMjAxNyBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMi4xCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgogICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgogICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KQEAgLTg5LDcgKzg5LDcgQEAKICNkZWZpbmUgcG9ydE5VTV9DT05GSUdVUkFCTEVfUkVHSU9OUwkJKCAoIHBvcnRMQVNUX0NPTkZJR1VSQUJMRV9SRUdJT04gLSBwb3J0RklSU1RfQ09ORklHVVJBQkxFX1JFR0lPTiApICsgMSApCiAjZGVmaW5lIHBvcnRUT1RBTF9OVU1fUkVHSU9OUwkJCQkoIHBvcnROVU1fQ09ORklHVVJBQkxFX1JFR0lPTlMgKyAxICkgLyogUGx1cyBvbmUgdG8gbWFrZSBzcGFjZSBmb3IgdGhlIHN0YWNrIHJlZ2lvbi4gKi8KIAotI2RlZmluZSBwb3J0U1dJVENIX1RPX1VTRVJfTU9ERSgpIF9fYXNtIHZvbGF0aWxlICggIiBtcnMgcjAsIGNvbnRyb2wgXG4gb3JyIHIwLCAjMSBcbiBtc3IgY29udHJvbCwgcjAgIiA6OjoicjAiICkKKyNkZWZpbmUgcG9ydFNXSVRDSF9UT19VU0VSX01PREUoKSBfX2FzbSB2b2xhdGlsZSAoICIgbXJzIHIwLCBjb250cm9sIFxuIG9yciByMCwgIzEgXG4gbXNyIGNvbnRyb2wsIHIwICIgOjo6ICJyMCIsICJtZW1vcnkiICkKIAogdHlwZWRlZiBzdHJ1Y3QgTVBVX1JFR0lPTl9SRUdJU1RFUlMKIHsKQEAgLTExNiw3ICsxMTYsNyBAQAogCiAvKiBTY2hlZHVsZXIgdXRpbGl0aWVzLiAqLwogCi0jZGVmaW5lIHBvcnRZSUVMRCgpCQkJCV9fYXNtIHZvbGF0aWxlICggIglTVkMJJTAJXG4iIDo6ICJpIiAocG9ydFNWQ19ZSUVMRCkgKQorI2RlZmluZSBwb3J0WUlFTEQoKQkJCQlfX2FzbSB2b2xhdGlsZSAoICIJU1ZDCSUwCVxuIiA6OiAiaSIgKHBvcnRTVkNfWUlFTEQpIDogIm1lbW9yeSIgKQogI2RlZmluZSBwb3J0WUlFTERfV0lUSElOX0FQSSgpIAkJCQkJCQkJCQkJCQlcCiB7CQkJCQkJCQkJCQkJCQkJCQkJCQlcCiAJLyogU2V0IGEgUGVuZFNWIHRvIHJlcXVlc3QgYSBjb250ZXh0IHN3aXRjaC4gKi8JCQkJCQkJCVwKQEAgLTEyNCw3ICsxMjQsNyBAQAogCQkJCQkJCQkJCQkJCQkJCQkJCQlcCiAJLyogQmFycmllcnMgYXJlIG5vcm1hbGx5IG5vdCByZXF1aXJlZCBidXQgZG8gZW5zdXJlIHRoZSBjb2RlIGlzIGNvbXBsZXRlbHkJXAogCXdpdGhpbiB0aGUgc3BlY2lmaWVkIGJlaGF2aW91ciBmb3IgdGhlIGFyY2hpdGVjdHVyZS4gKi8JCQkJCQlcCi0JX19hc20gdm9sYXRpbGUoICJkc2IiICk7CQkJCQkJCQkJCQkJCVwKKwlfX2FzbSB2b2xhdGlsZSggImRzYiIgOjo6ICJtZW1vcnkiICk7CQkJCQkJCQkJCVwKIAlfX2FzbSB2b2xhdGlsZSggImlzYiIgKTsJCQkJCQkJCQkJCQkJXAogfQogCkBAIC0xNjUsNyArMTY1LDcgQEAKIAl7CiAJdWludDhfdCB1Y1JldHVybjsKIAotCQlfX2FzbSB2b2xhdGlsZSAoICJjbHogJTAsICUxIiA6ICI9ciIgKCB1Y1JldHVybiApIDogInIiICggdWxCaXRtYXAgKSApOworCQlfX2FzbSB2b2xhdGlsZSAoICJjbHogJTAsICUxIiA6ICI9ciIgKCB1Y1JldHVybiApIDogInIiICggdWxCaXRtYXAgKSA6ICJtZW1vcnkiICk7CiAJCXJldHVybiB1Y1JldHVybjsKIAl9CiAKQEAgLTE5OSwxOCArMTk5LDI4IEBACiAjaWZuZGVmIHBvcnRGT1JDRV9JTkxJTkUKIAkjZGVmaW5lIHBvcnRGT1JDRV9JTkxJTkUgaW5saW5lIF9fYXR0cmlidXRlX18oKCBhbHdheXNfaW5saW5lKSkKICNlbmRpZgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLS8qIFNldCB0aGUgcHJpdmlsZWdlIGxldmVsIHRvIHVzZXIgbW9kZSBpZiB4UnVubmluZ1ByaXZpbGVnZWQgaXMgZmFsc2UuICovCi1wb3J0Rk9SQ0VfSU5MSU5FIHN0YXRpYyB2b2lkIHZQb3J0UmVzZXRQcml2aWxlZ2UoIEJhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkICkKLXsKLQlpZiggeFJ1bm5pbmdQcml2aWxlZ2VkICE9IHBkVFJVRSApIAotCXsKLQkJX19hc20gdm9sYXRpbGUgKCAiIG1ycyByMCwgY29udHJvbCAJXG4iIFwKLQkJCQkJCSAiIG9yciByMCwgIzEgCQlcbiIgXAotCQkJCQkJICIgbXNyIGNvbnRyb2wsIHIwCVxuIglcCi0JCQkJCQkgOjo6InIwIiApOwotCX0KLX0KK2V4dGVybiBCYXNlVHlwZV90IHhJc1ByaXZpbGVnZWQoIHZvaWQgKTsKK2V4dGVybiB2b2lkIHZSZXNldFByaXZpbGVnZSggdm9pZCApOworCisvKioKKyAqIEBicmllZiBDaGVja3Mgd2hldGhlciBvciBub3QgdGhlIHByb2Nlc3NvciBpcyBwcml2aWxlZ2VkLgorICoKKyAqIEByZXR1cm4gMSBpZiB0aGUgcHJvY2Vzc29yIGlzIGFscmVhZHkgcHJpdmlsZWdlZCwgMCBvdGhlcndpc2UuCisgKi8KKyNkZWZpbmUgcG9ydElTX1BSSVZJTEVHRUQoKQkJCXhJc1ByaXZpbGVnZWQoKQorCisvKioKKyAqIEBicmllZiBSYWlzZSBhbiBTVkMgcmVxdWVzdCB0byByYWlzZSBwcml2aWxlZ2UuCisqLworI2RlZmluZSBwb3J0UkFJU0VfUFJJVklMRUdFKCkJCV9fYXNtIHZvbGF0aWxlICggInN2YyAlMCBcbiIgOjogImkiICggcG9ydFNWQ19SQUlTRV9QUklWSUxFR0UgKSA6ICJtZW1vcnkiICk7CisKKy8qKgorICogQGJyaWVmIExvd2VycyB0aGUgcHJpdmlsZWdlIGxldmVsIGJ5IHNldHRpbmcgdGhlIGJpdCAwIG9mIHRoZSBDT05UUk9MCisgKiByZWdpc3Rlci4KKyAqLworI2RlZmluZSBwb3J0UkVTRVRfUFJJVklMRUdFKCkJCXZSZXNldFByaXZpbGVnZSgpCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogcG9ydEZPUkNFX0lOTElORSBzdGF0aWMgQmFzZVR5cGVfdCB4UG9ydElzSW5zaWRlSW50ZXJydXB0KCB2b2lkICkKQEAgLTIxOSw3ICsyMjksNyBAQAogQmFzZVR5cGVfdCB4UmV0dXJuOwogCiAJLyogT2J0YWluIHRoZSBudW1iZXIgb2YgdGhlIGN1cnJlbnRseSBleGVjdXRpbmcgaW50ZXJydXB0LiAqLwotCV9fYXNtIHZvbGF0aWxlKCAibXJzICUwLCBpcHNyIiA6ICI9ciIoIHVsQ3VycmVudEludGVycnVwdCApICk7CisJX19hc20gdm9sYXRpbGUoICJtcnMgJTAsIGlwc3IiIDogIj1yIiggdWxDdXJyZW50SW50ZXJydXB0ICkgOjogIm1lbW9yeSIgKTsKIAogCWlmKCB1bEN1cnJlbnRJbnRlcnJ1cHQgPT0gMCApCiAJewpAQCAtMjQ3LDcgKzI1Nyw3IEBACiAJCSIJaXNiCQkJCQkJCQkJCQkJCQlcbiIgXAogCQkiCWRzYgkJCQkJCQkJCQkJCQkJXG4iIFwKIAkJIgljcHNpZSBpCQkJCQkJCQkJCQkJCVxuIiBcCi0JCToiPXIiICh1bE5ld0JBU0VQUkkpIDogImkiICggY29uZmlnTUFYX1NZU0NBTExfSU5URVJSVVBUX1BSSU9SSVRZICkKKwkJOiI9ciIgKHVsTmV3QkFTRVBSSSkgOiAiaSIgKCBjb25maWdNQVhfU1lTQ0FMTF9JTlRFUlJVUFRfUFJJT1JJVFkgKSA6ICJtZW1vcnkiCiAJKTsKIH0KIApAQCAtMjY2LDcgKzI3Niw3IEBACiAJCSIJaXNiCQkJCQkJCQkJCQkJCQlcbiIgXAogCQkiCWRzYgkJCQkJCQkJCQkJCQkJXG4iIFwKIAkJIgljcHNpZSBpCQkJCQkJCQkJCQkJCVxuIiBcCi0JCToiPXIiICh1bE9yaWdpbmFsQkFTRVBSSSksICI9ciIgKHVsTmV3QkFTRVBSSSkgOiAiaSIgKCBjb25maWdNQVhfU1lTQ0FMTF9JTlRFUlJVUFRfUFJJT1JJVFkgKQorCQk6Ij1yIiAodWxPcmlnaW5hbEJBU0VQUkkpLCAiPXIiICh1bE5ld0JBU0VQUkkpIDogImkiICggY29uZmlnTUFYX1NZU0NBTExfSU5URVJSVVBUX1BSSU9SSVRZICkgOiAibWVtb3J5IgogCSk7CiAKIAkvKiBUaGlzIHJldHVybiB3aWxsIG5vdCBiZSByZWFjaGVkIGJ1dCBpcyBuZWNlc3NhcnkgdG8gcHJldmVudCBjb21waWxlcgpAQCAtMjc5LDExICsyODksMTIgQEAKIHsKIAlfX2FzbSB2b2xhdGlsZQogCSgKLQkJIgltc3IgYmFzZXByaSwgJTAJIiA6OiAiciIgKCB1bE5ld01hc2tWYWx1ZSApCisJCSIJbXNyIGJhc2VwcmksICUwCSIgOjogInIiICggdWxOZXdNYXNrVmFsdWUgKSA6ICJtZW1vcnkiCiAJKTsKIH0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCisjZGVmaW5lIHBvcnRNRU1PUllfQkFSUklFUigpIF9fYXNtIHZvbGF0aWxlKCAiIiA6OjogIm1lbW9yeSIgKQogCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KZGlmZiAtLWdpdCBhL1NvdXJjZS9wb3J0YWJsZS9JQVIvQVJNX0NNMC9wb3J0LmMgYi9Tb3VyY2UvcG9ydGFibGUvSUFSL0FSTV9DTTAvcG9ydC5jCmluZGV4IGFhYTE4MDEuLjM2YjgxYWEgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9wb3J0YWJsZS9JQVIvQVJNX0NNMC9wb3J0LmMKKysrIGIvU291cmNlL3BvcnRhYmxlL0lBUi9BUk1fQ00wL3BvcnQuYwpAQCAtMSw2ICsxLDYgQEAKIC8qCi0gKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjAuMQotICogQ29weXJpZ2h0IChDKSAyMDE3IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRnJlZVJUT1MgS2VybmVsIFYxMC4yLjEKKyAqIENvcHlyaWdodCAoQykgMjAxOSBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCiAgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCiAgKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgpkaWZmIC0tZ2l0IGEvU291cmNlL3BvcnRhYmxlL0lBUi9BUk1fQ00wL3BvcnRhc20ucyBiL1NvdXJjZS9wb3J0YWJsZS9JQVIvQVJNX0NNMC9wb3J0YXNtLnMKaW5kZXggZWM5OGE4Ni4uYTJlM2NlOCAxMDA2NDQKLS0tIGEvU291cmNlL3BvcnRhYmxlL0lBUi9BUk1fQ00wL3BvcnRhc20ucworKysgYi9Tb3VyY2UvcG9ydGFibGUvSUFSL0FSTV9DTTAvcG9ydGFzbS5zCkBAIC0xLDYgKzEsNiBAQAogLyoKLSAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMC4xCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjIuMQorICogQ29weXJpZ2h0IChDKSAyMDE5IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKICAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKICAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCmRpZmYgLS1naXQgYS9Tb3VyY2UvcG9ydGFibGUvSUFSL0FSTV9DTTAvcG9ydG1hY3JvLmggYi9Tb3VyY2UvcG9ydGFibGUvSUFSL0FSTV9DTTAvcG9ydG1hY3JvLmgKaW5kZXggMDJlMmNiZC4uNzU4ZjgwZiAxMDA2NDQKLS0tIGEvU291cmNlL3BvcnRhYmxlL0lBUi9BUk1fQ00wL3BvcnRtYWNyby5oCisrKyBiL1NvdXJjZS9wb3J0YWJsZS9JQVIvQVJNX0NNMC9wb3J0bWFjcm8uaApAQCAtMSw2ICsxLDYgQEAKIC8qCi0gKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjAuMQotICogQ29weXJpZ2h0IChDKSAyMDE3IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRnJlZVJUT1MgS2VybmVsIFYxMC4yLjEKKyAqIENvcHlyaWdodCAoQykgMjAxOSBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCiAgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCiAgKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgpkaWZmIC0tZ2l0IGEvU291cmNlL3BvcnRhYmxlL0lBUi9BUk1fQ00yMy9ub25fc2VjdXJlL3BvcnQuYyBiL1NvdXJjZS9wb3J0YWJsZS9JQVIvQVJNX0NNMjMvbm9uX3NlY3VyZS9wb3J0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ4NWE2ZgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9wb3J0YWJsZS9JQVIvQVJNX0NNMjMvbm9uX3NlY3VyZS9wb3J0LmMKQEAgLTAsMCArMSw4OTkgQEAKKy8qCisgKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjIuMQorICogQ29weXJpZ2h0IChDKSAyMDE5IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKKyAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCisgKiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCisgKiB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZgorICogdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLAorICogc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCisgKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUworICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SCisgKiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIKKyAqIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIGh0dHA6Ly93d3cuRnJlZVJUT1Mub3JnCisgKiBodHRwOi8vYXdzLmFtYXpvbi5jb20vZnJlZXJ0b3MKKyAqCisgKiAxIHRhYiA9PSA0IHNwYWNlcyEKKyAqLworCisvKiBEZWZpbmluZyBNUFVfV1JBUFBFUlNfSU5DTFVERURfRlJPTV9BUElfRklMRSBwcmV2ZW50cyB0YXNrLmggZnJvbSByZWRlZmluaW5nCisgKiBhbGwgdGhlIEFQSSBmdW5jdGlvbnMgdG8gdXNlIHRoZSBNUFUgd3JhcHBlcnMuIFRoYXQgc2hvdWxkIG9ubHkgYmUgZG9uZSB3aGVuCisgKiB0YXNrLmggaXMgaW5jbHVkZWQgZnJvbSBhbiBhcHBsaWNhdGlvbiBmaWxlLiAqLworI2RlZmluZSBNUFVfV1JBUFBFUlNfSU5DTFVERURfRlJPTV9BUElfRklMRQorCisvKiBTY2hlZHVsZXIgaW5jbHVkZXMuICovCisjaW5jbHVkZSAiRnJlZVJUT1MuaCIKKyNpbmNsdWRlICJ0YXNrLmgiCisKKy8qIE1QVSB3cmFwcGVycyBpbmNsdWRlcy4gKi8KKyNpbmNsdWRlICJtcHVfd3JhcHBlcnMuaCIKKworLyogUG9ydGFzbSBpbmNsdWRlcy4gKi8KKyNpbmNsdWRlICJwb3J0YXNtLmgiCisKKyNpZiggY29uZmlnRU5BQkxFX1RSVVNUWk9ORSA9PSAxICkKKwkvKiBTZWN1cmUgY29tcG9uZW50cyBpbmNsdWRlcy4gKi8KKwkjaW5jbHVkZSAic2VjdXJlX2NvbnRleHQuaCIKKwkjaW5jbHVkZSAic2VjdXJlX2luaXQuaCIKKyNlbmRpZiAvKiBjb25maWdFTkFCTEVfVFJVU1RaT05FICovCisKKyN1bmRlZiBNUFVfV1JBUFBFUlNfSU5DTFVERURfRlJPTV9BUElfRklMRQorCisvKioKKyAqIFRoZSBGcmVlUlRPUyBDb3J0ZXggTTMzIHBvcnQgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gcnVuIG9uIHRoZSBTZWN1cmUgU2lkZSBvbmx5CisgKiBpLmUuIHRoZSBwcm9jZXNzb3IgYm9vdHMgYXMgc2VjdXJlIGFuZCBuZXZlciBqdW1wcyB0byB0aGUgbm9uLXNlY3VyZSBzaWRlLgorICogVGhlIFRydXN0IFpvbmUgc3VwcG9ydCBpbiB0aGUgcG9ydCBtdXN0IGJlIGRpc2FibGVkIGluIG9yZGVyIHRvIHJ1biBGcmVlUlRPUworICogb24gdGhlIHNlY3VyZSBzaWRlLiBUaGUgZm9sbG93aW5nIGFyZSB0aGUgdmFsaWQgY29uZmlndXJhdGlvbiBzZWV0aW5nczoKKyAqCisgKiAxLiBSdW4gRnJlZVJUT1Mgb24gdGhlIFNlY3VyZSBTaWRlOgorICoJCWNvbmZpZ1JVTl9GUkVFUlRPU19TRUNVUkVfT05MWSA9IDEgYW5kIGNvbmZpZ0VOQUJMRV9UUlVTVFpPTkUgPSAwCisgKgorICogMi4gUnVuIEZyZWVSVE9TIG9uIHRoZSBOb24tU2VjdXJlIFNpZGUgd2l0aCBTZWN1cmUgU2lkZSBmdW5jdGlvbiBjYWxsIHN1cHBvcnQ6CisgKgkJY29uZmlnUlVOX0ZSRUVSVE9TX1NFQ1VSRV9PTkxZID0gMCBhbmQgY29uZmlnRU5BQkxFX1RSVVNUWk9ORSA9IDEKKyAqCisgKiAzLiBSdW4gRnJlZVJUT1Mgb24gdGhlIE5vbi1TZWN1cmUgU2lkZSBvbmx5IGkuZS4gbm8gU2VjdXJlIFNpZGUgZnVuY3Rpb24gY2FsbCBzdXBwb3J0OgorICoJCWNvbmZpZ1JVTl9GUkVFUlRPU19TRUNVUkVfT05MWSA9IDAgYW5kIGNvbmZpZ0VOQUJMRV9UUlVTVFpPTkUgPSAwCisgKi8KKyNpZiggKCBjb25maWdSVU5fRlJFRVJUT1NfU0VDVVJFX09OTFkgPT0gMSApICYmICggY29uZmlnRU5BQkxFX1RSVVNUWk9ORSA9PSAxICkgKQorCSNlcnJvciBUcnVzdFpvbmUgbmVlZHMgdG8gYmUgZGlzYWJsZWQgaW4gb3JkZXIgdG8gcnVuIEZyZWVSVE9TIG9uIHRoZSBTZWN1cmUgU2lkZS4KKyNlbmRpZgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKgorICogQGJyaWVmIENvbnN0YW50cyByZXF1aXJlZCB0byBtYW5pcHVsYXRlIHRoZSBOVklDLgorICovCisjZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfQ1RSTAkJCQkoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGUwMTAgKQorI2RlZmluZSBwb3J0TlZJQ19TWVNUSUNLX0xPQUQJCQkJKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlMDE0ICkKKyNkZWZpbmUgcG9ydE5WSUNfU1lTVElDS19DVVJSRU5UX1ZBTFVFCQkoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGUwMTggKQorI2RlZmluZSBwb3J0TlZJQ19JTlRfQ1RSTAkJCQkJKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZDA0ICkKKyNkZWZpbmUgcG9ydE5WSUNfU1lTUFJJMgkJCQkJKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZDIwICkKKyNkZWZpbmUgcG9ydE5WSUNfU1lTVElDS19DTEsJCQkJKCAweDAwMDAwMDA0ICkKKyNkZWZpbmUgcG9ydE5WSUNfU1lTVElDS19JTlQJCQkJKCAweDAwMDAwMDAyICkKKyNkZWZpbmUgcG9ydE5WSUNfU1lTVElDS19FTkFCTEUJCQkJKCAweDAwMDAwMDAxICkKKyNkZWZpbmUgcG9ydE5WSUNfUEVORFNWU0VUCQkJCQkoIDB4MTAwMDAwMDAgKQorI2RlZmluZSBwb3J0TUlOX0lOVEVSUlVQVF9QUklPUklUWQkJCSggMjU1VUwgKQorI2RlZmluZSBwb3J0TlZJQ19QRU5EU1ZfUFJJCQkJCQkoIHBvcnRNSU5fSU5URVJSVVBUX1BSSU9SSVRZIDw8IDE2VUwgKQorI2RlZmluZSBwb3J0TlZJQ19TWVNUSUNLX1BSSQkJCQkoIHBvcnRNSU5fSU5URVJSVVBUX1BSSU9SSVRZIDw8IDI0VUwgKQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKgorICogQGJyaWVmIENvbnN0YW50cyByZXF1aXJlZCB0byBtYW5pcHVsYXRlIHRoZSBTQ0IuCisgKi8KKyNkZWZpbmUgcG9ydFNDQl9TWVNfSEFORExFUl9DVFJMX1NUQVRFX1JFRwkoICogKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZWQyNCApCisjZGVmaW5lIHBvcnRTQ0JfTUVNX0ZBVUxUX0VOQUJMRQkJCSggMVVMIDw8IDE2VUwgKQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKgorICogQGJyaWVmIENvbnN0YW50cyByZXF1aXJlZCB0byBtYW5pcHVsYXRlIHRoZSBGUFUuCisgKi8KKyNkZWZpbmUgcG9ydENQQUNSCQkJCQkJCSggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZWQ4OCApCS8qIENvcHJvY2Vzc29yIEFjY2VzcyBDb250cm9sIFJlZ2lzdGVyLiAqLworI2RlZmluZSBwb3J0Q1BBQ1JfQ1AxMF9WQUxVRQkJCQkoIDNVTCApCisjZGVmaW5lIHBvcnRDUEFDUl9DUDExX1ZBTFVFCQkJCXBvcnRDUEFDUl9DUDEwX1ZBTFVFCisjZGVmaW5lIHBvcnRDUEFDUl9DUDEwX1BPUwkJCQkJKCAyMFVMICkKKyNkZWZpbmUgcG9ydENQQUNSX0NQMTFfUE9TCQkJCQkoIDIyVUwgKQorCisjZGVmaW5lIHBvcnRGUENDUgkJCQkJCQkoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVmMzQgKQkvKiBGbG9hdGluZyBQb2ludCBDb250ZXh0IENvbnRyb2wgUmVnaXN0ZXIuICovCisjZGVmaW5lIHBvcnRGUENDUl9BU1BFTl9QT1MJCQkJCSggMzFVTCApCisjZGVmaW5lIHBvcnRGUENDUl9BU1BFTl9NQVNLCQkJCSggMVVMIDw8IHBvcnRGUENDUl9BU1BFTl9QT1MgKQorI2RlZmluZSBwb3J0RlBDQ1JfTFNQRU5fUE9TCQkJCQkoIDMwVUwgKQorI2RlZmluZSBwb3J0RlBDQ1JfTFNQRU5fTUFTSwkJCQkoIDFVTCA8PCBwb3J0RlBDQ1JfTFNQRU5fUE9TICkKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAqIEBicmllZiBDb25zdGFudHMgcmVxdWlyZWQgdG8gbWFuaXB1bGF0ZSB0aGUgTVBVLgorICovCisjZGVmaW5lIHBvcnRNUFVfVFlQRV9SRUcJCQkJCSggKiAoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVkOTAgKSApCisjZGVmaW5lIHBvcnRNUFVfQ1RSTF9SRUcJCQkJCSggKiAoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVkOTQgKSApCisjZGVmaW5lIHBvcnRNUFVfUk5SX1JFRwkJCQkJCSggKiAoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVkOTggKSApCisKKyNkZWZpbmUgcG9ydE1QVV9SQkFSX1JFRwkJCQkJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZWQ5YyApICkKKyNkZWZpbmUgcG9ydE1QVV9STEFSX1JFRwkJCQkJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZWRhMCApICkKKworI2RlZmluZSBwb3J0TVBVX1JCQVJfQTFfUkVHCQkJCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZGE0ICkgKQorI2RlZmluZSBwb3J0TVBVX1JMQVJfQTFfUkVHCQkJCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZGE4ICkgKQorCisjZGVmaW5lIHBvcnRNUFVfUkJBUl9BMl9SRUcJCQkJCSggKiAoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVkYWMgKSApCisjZGVmaW5lIHBvcnRNUFVfUkxBUl9BMl9SRUcJCQkJCSggKiAoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVkYjAgKSApCisKKyNkZWZpbmUgcG9ydE1QVV9SQkFSX0EzX1JFRwkJCQkJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZWRiNCApICkKKyNkZWZpbmUgcG9ydE1QVV9STEFSX0EzX1JFRwkJCQkJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZWRiOCApICkKKworI2RlZmluZSBwb3J0TVBVX01BSVIwX1JFRwkJCQkJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZWRjMCApICkKKyNkZWZpbmUgcG9ydE1QVV9NQUlSMV9SRUcJCQkJCSggKiAoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVkYzQgKSApCisKKyNkZWZpbmUgcG9ydE1QVV9SQkFSX0FERFJFU1NfTUFTSwkJCSggMHhmZmZmZmZlMCApIC8qIE11c3QgYmUgMzItYnl0ZSBhbGlnbmVkLiAqLworI2RlZmluZSBwb3J0TVBVX1JMQVJfQUREUkVTU19NQVNLCQkJKCAweGZmZmZmZmUwICkgLyogTXVzdCBiZSAzMi1ieXRlIGFsaWduZWQuICovCisKKyNkZWZpbmUgcG9ydE1QVV9NQUlSX0FUVFIwX1BPUwkJCQkoIDBVTCApCisjZGVmaW5lIHBvcnRNUFVfTUFJUl9BVFRSMF9NQVNLCQkJCSggMHgwMDAwMDBmZiApCisKKyNkZWZpbmUgcG9ydE1QVV9NQUlSX0FUVFIxX1BPUwkJCQkoIDhVTCApCisjZGVmaW5lIHBvcnRNUFVfTUFJUl9BVFRSMV9NQVNLCQkJCSggMHgwMDAwZmYwMCApCisKKyNkZWZpbmUgcG9ydE1QVV9NQUlSX0FUVFIyX1BPUwkJCQkoIDE2VUwgKQorI2RlZmluZSBwb3J0TVBVX01BSVJfQVRUUjJfTUFTSwkJCQkoIDB4MDBmZjAwMDAgKQorCisjZGVmaW5lIHBvcnRNUFVfTUFJUl9BVFRSM19QT1MJCQkJKCAyNFVMICkKKyNkZWZpbmUgcG9ydE1QVV9NQUlSX0FUVFIzX01BU0sJCQkJKCAweGZmMDAwMDAwICkKKworI2RlZmluZSBwb3J0TVBVX01BSVJfQVRUUjRfUE9TCQkJCSggMFVMICkKKyNkZWZpbmUgcG9ydE1QVV9NQUlSX0FUVFI0X01BU0sJCQkJKCAweDAwMDAwMGZmICkKKworI2RlZmluZSBwb3J0TVBVX01BSVJfQVRUUjVfUE9TCQkJCSggOFVMICkKKyNkZWZpbmUgcG9ydE1QVV9NQUlSX0FUVFI1X01BU0sJCQkJKCAweDAwMDBmZjAwICkKKworI2RlZmluZSBwb3J0TVBVX01BSVJfQVRUUjZfUE9TCQkJCSggMTZVTCApCisjZGVmaW5lIHBvcnRNUFVfTUFJUl9BVFRSNl9NQVNLCQkJCSggMHgwMGZmMDAwMCApCisKKyNkZWZpbmUgcG9ydE1QVV9NQUlSX0FUVFI3X1BPUwkJCQkoIDI0VUwgKQorI2RlZmluZSBwb3J0TVBVX01BSVJfQVRUUjdfTUFTSwkJCQkoIDB4ZmYwMDAwMDAgKQorCisjZGVmaW5lIHBvcnRNUFVfUkxBUl9BVFRSX0lOREVYMAkJCSggMFVMIDw8IDFVTCApCisjZGVmaW5lIHBvcnRNUFVfUkxBUl9BVFRSX0lOREVYMQkJCSggMVVMIDw8IDFVTCApCisjZGVmaW5lIHBvcnRNUFVfUkxBUl9BVFRSX0lOREVYMgkJCSggMlVMIDw8IDFVTCApCisjZGVmaW5lIHBvcnRNUFVfUkxBUl9BVFRSX0lOREVYMwkJCSggM1VMIDw8IDFVTCApCisjZGVmaW5lIHBvcnRNUFVfUkxBUl9BVFRSX0lOREVYNAkJCSggNFVMIDw8IDFVTCApCisjZGVmaW5lIHBvcnRNUFVfUkxBUl9BVFRSX0lOREVYNQkJCSggNVVMIDw8IDFVTCApCisjZGVmaW5lIHBvcnRNUFVfUkxBUl9BVFRSX0lOREVYNgkJCSggNlVMIDw8IDFVTCApCisjZGVmaW5lIHBvcnRNUFVfUkxBUl9BVFRSX0lOREVYNwkJCSggN1VMIDw8IDFVTCApCisKKyNkZWZpbmUgcG9ydE1QVV9STEFSX1JFR0lPTl9FTkFCTEUJCQkoIDFVTCApCisKKy8qIEVuYWJsZSBwcml2aWxlZ2VkIGFjY2VzcyB0byB1bm1hcHBlZCByZWdpb24uICovCisjZGVmaW5lIHBvcnRNUFVfUFJJVl9CQUNLR1JPVU5EX0VOQUJMRQkJKCAxVUwgPDwgMlVMICkKKworLyogRW5hYmxlIE1QVS4gKi8KKyNkZWZpbmUgcG9ydE1QVV9FTkFCTEUJCQkJCQkoIDFVTCA8PCAwVUwgKQorCisvKiBFeHBlY3RlZCB2YWx1ZSBvZiB0aGUgcG9ydE1QVV9UWVBFIHJlZ2lzdGVyLiAqLworI2RlZmluZSBwb3J0RVhQRUNURURfTVBVX1RZUEVfVkFMVUUJCQkoIDhVTCA8PCA4VUwgKSAvKiA4IHJlZ2lvbnMsIHVuaWZpZWQuICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqCisgKiBAYnJpZWYgQ29uc3RhbnRzIHJlcXVpcmVkIHRvIHNldCB1cCB0aGUgaW5pdGlhbCBzdGFjay4KKyAqLworI2RlZmluZSBwb3J0SU5JVElBTF9YUFNSCQkJCQkoIDB4MDEwMDAwMDAgKQorCisjaWYoIGNvbmZpZ1JVTl9GUkVFUlRPU19TRUNVUkVfT05MWSA9PSAxICkKKwkvKioKKwkgKiBAYnJpZWYgSW5pdGlhbCBFWENfUkVUVVJOIHZhbHVlLgorCSAqCisJICogICAgIEZGICAgICAgICAgRkYgICAgICAgICBGRiAgICAgICAgIEZECisJICogMTExMSAxMTExICAxMTExIDExMTEgIDExMTEgMTExMSAgMTExMSAxMTAxCisJICoKKwkgKiBCaXRbNl0gLSAxIC0tPiBUaGUgZXhjZXB0aW9uIHdhcyB0YWtlbiBmcm9tIHRoZSBTZWN1cmUgc3RhdGUuCisJICogQml0WzVdIC0gMSAtLT4gRG8gbm90IHNraXAgc3RhY2tpbmcgb2YgYWRkaXRpb25hbCBzdGF0ZSBjb250ZXh0LgorCSAqIEJpdFs0XSAtIDEgLS0+IFRoZSBQRSBkaWQgbm90IGFsbG9jYXRlIHNwYWNlIG9uIHRoZSBzdGFjayBmb3IgRlAgY29udGV4dC4KKwkgKiBCaXRbM10gLSAxIC0tPiBSZXR1cm4gdG8gdGhlIFRocmVhZCBtb2RlLgorCSAqIEJpdFsyXSAtIDEgLS0+IFJlc3RvcmUgcmVnaXN0ZXJzIGZyb20gdGhlIHByb2Nlc3Mgc3RhY2suCisJICogQml0WzFdIC0gMCAtLT4gUmVzZXJ2ZWQsIDAuCisJICogQml0WzBdIC0gMSAtLT4gVGhlIGV4Y2VwdGlvbiB3YXMgdGFrZW4gdG8gdGhlIFNlY3VyZSBzdGF0ZS4KKwkgKi8KKwkjZGVmaW5lIHBvcnRJTklUSUFMX0VYQ19SRVRVUk4JCQkoIDB4ZmZmZmZmZmQgKQorI2Vsc2UKKwkvKioKKwkgKiBAYnJpZWYgSW5pdGlhbCBFWENfUkVUVVJOIHZhbHVlLgorCSAqCisJICogICAgIEZGICAgICAgICAgRkYgICAgICAgICBGRiAgICAgICAgIEJDCisJICogMTExMSAxMTExICAxMTExIDExMTEgIDExMTEgMTExMSAgMTAxMSAxMTAwCisJICoKKwkgKiBCaXRbNl0gLSAwIC0tPiBUaGUgZXhjZXB0aW9uIHdhcyB0YWtlbiBmcm9tIHRoZSBOb24tU2VjdXJlIHN0YXRlLgorCSAqIEJpdFs1XSAtIDEgLS0+IERvIG5vdCBza2lwIHN0YWNraW5nIG9mIGFkZGl0aW9uYWwgc3RhdGUgY29udGV4dC4KKwkgKiBCaXRbNF0gLSAxIC0tPiBUaGUgUEUgZGlkIG5vdCBhbGxvY2F0ZSBzcGFjZSBvbiB0aGUgc3RhY2sgZm9yIEZQIGNvbnRleHQuCisJICogQml0WzNdIC0gMSAtLT4gUmV0dXJuIHRvIHRoZSBUaHJlYWQgbW9kZS4KKwkgKiBCaXRbMl0gLSAxIC0tPiBSZXN0b3JlIHJlZ2lzdGVycyBmcm9tIHRoZSBwcm9jZXNzIHN0YWNrLgorCSAqIEJpdFsxXSAtIDAgLS0+IFJlc2VydmVkLCAwLgorCSAqIEJpdFswXSAtIDAgLS0+IFRoZSBleGNlcHRpb24gd2FzIHRha2VuIHRvIHRoZSBOb24tU2VjdXJlIHN0YXRlLgorCSAqLworCSNkZWZpbmUgcG9ydElOSVRJQUxfRVhDX1JFVFVSTgkJCSggMHhmZmZmZmZiYyApCisjZW5kaWYgLyogY29uZmlnUlVOX0ZSRUVSVE9TX1NFQ1VSRV9PTkxZICovCisKKy8qKgorICogQGJyaWVmIENPTlRST0wgcmVnaXN0ZXIgcHJpdmlsZWdlZCBiaXQgbWFzay4KKyAqCisgKiBCaXRbMF0gaW4gQ09OVFJPTCByZWdpc3RlciB0ZWxscyB0aGUgcHJpdmlsZWdlOgorICogIEJpdFswXSA9IDAgPT0+IFRoZSB0YXNrIGlzIHByaXZpbGVnZWQuCisgKiAgQml0WzBdID0gMSA9PT4gVGhlIHRhc2sgaXMgbm90IHByaXZpbGVnZWQuCisgKi8KKyNkZWZpbmUgcG9ydENPTlRST0xfUFJJVklMRUdFRF9NQVNLCQkJKCAxVUwgPDwgMFVMICkKKworLyoqCisgKiBAYnJpZWYgSW5pdGlhbCBDT05UUk9MIHJlZ2lzdGVyIHZhbHVlcy4KKyAqLworI2RlZmluZSBwb3J0SU5JVElBTF9DT05UUk9MX1VOUFJJVklMRUdFRAkoIDB4MyApCisjZGVmaW5lIHBvcnRJTklUSUFMX0NPTlRST0xfUFJJVklMRUdFRAkJKCAweDIgKQorCisvKioKKyAqIEBicmllZiBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHByZS1sb2FkaW5nIG9mIHRoZSBpbml0aWFsIExSIHdpdGggdGhlCisgKiBhZGRyZXNzIG9mIHBydlRhc2tFeGl0RXJyb3IoKSBpbiBjYXNlIGl0IG1lc3NlcyB1cCB1bndpbmRpbmcgb2YgdGhlIHN0YWNrCisgKiBpbiB0aGUgZGVidWdnZXIuCisgKi8KKyNpZmRlZiBjb25maWdUQVNLX1JFVFVSTl9BRERSRVNTCisJI2RlZmluZSBwb3J0VEFTS19SRVRVUk5fQUREUkVTUwkJCWNvbmZpZ1RBU0tfUkVUVVJOX0FERFJFU1MKKyNlbHNlCisJI2RlZmluZSBwb3J0VEFTS19SRVRVUk5fQUREUkVTUwkJCXBydlRhc2tFeGl0RXJyb3IKKyNlbmRpZgorCisvKioKKyAqIEBicmllZiBJZiBwb3J0UFJFTE9BRF9SRUdJU1RFUlMgdGhlbiByZWdpc3RlcnMgd2lsbCBiZSBnaXZlbiBhbiBpbml0aWFsIHZhbHVlCisgKiB3aGVuIGEgdGFzayBpcyBjcmVhdGVkLiBUaGlzIGhlbHBzIGluIGRlYnVnZ2luZyBhdCB0aGUgY29zdCBvZiBjb2RlIHNpemUuCisgKi8KKyNkZWZpbmUgcG9ydFBSRUxPQURfUkVHSVNURVJTCQkJCTEKKworLyoqCisgKiBAYnJpZWYgQSB0YXNrIGlzIGNyZWF0ZWQgd2l0aG91dCBhIHNlY3VyZSBjb250ZXh0LCBhbmQgbXVzdCBjYWxsCisgKiBwb3J0QUxMT0NBVEVfU0VDVVJFX0NPTlRFWFQoKSB0byBnaXZlIGl0c2VsZiBhIHNlY3VyZSBjb250ZXh0IGJlZm9yZSBpdCBtYWtlcworICogYW55IHNlY3VyZSBjYWxscy4KKyAqLworI2RlZmluZSBwb3J0Tk9fU0VDVVJFX0NPTlRFWFQJCQkJMAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKgorICogQGJyaWVmIFNldHVwIHRoZSB0aW1lciB0byBnZW5lcmF0ZSB0aGUgdGljayBpbnRlcnJ1cHRzLgorICovCitzdGF0aWMgdm9pZCBwcnZTZXR1cFRpbWVySW50ZXJydXB0KCB2b2lkICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworLyoqCisgKiBAYnJpZWYgVXNlZCB0byBjYXRjaCB0YXNrcyB0aGF0IGF0dGVtcHQgdG8gcmV0dXJuIGZyb20gdGhlaXIgaW1wbGVtZW50aW5nCisgKiBmdW5jdGlvbi4KKyAqLworc3RhdGljIHZvaWQgcHJ2VGFza0V4aXRFcnJvciggdm9pZCApOworCisjaWYoIGNvbmZpZ0VOQUJMRV9NUFUgPT0gMSApCisJLyoqCisJICogQGJyaWVmIFNldHVwIHRoZSBNZW1vcnkgUHJvdGVjdGlvbiBVbml0IChNUFUpLgorCSAqLworCXN0YXRpYyB2b2lkIHBydlNldHVwTVBVKCB2b2lkICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKyNlbmRpZiAvKiBjb25maWdFTkFCTEVfTVBVICovCisKKyNpZiggY29uZmlnRU5BQkxFX0ZQVSA9PSAxICkKKwkvKioKKwkgKiBAYnJpZWYgU2V0dXAgdGhlIEZsb2F0aW5nIFBvaW50IFVuaXQgKEZQVSkuCisJICovCisJc3RhdGljIHZvaWQgcHJ2U2V0dXBGUFUoIHZvaWQgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9GUFUgKi8KKworLyoqCisgKiBAYnJpZWYgWWllbGQgdGhlIHByb2Nlc3Nvci4KKyAqLwordm9pZCB2UG9ydFlpZWxkKCB2b2lkICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworLyoqCisgKiBAYnJpZWYgRW50ZXIgY3JpdGljYWwgc2VjdGlvbi4KKyAqLwordm9pZCB2UG9ydEVudGVyQ3JpdGljYWwoIHZvaWQgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisvKioKKyAqIEBicmllZiBFeGl0IGZyb20gY3JpdGljYWwgc2VjdGlvbi4KKyAqLwordm9pZCB2UG9ydEV4aXRDcml0aWNhbCggdm9pZCApIFBSSVZJTEVHRURfRlVOQ1RJT047CisKKy8qKgorICogQGJyaWVmIFN5c1RpY2sgaGFuZGxlci4KKyAqLwordm9pZCBTeXNUaWNrX0hhbmRsZXIoIHZvaWQgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisvKioKKyAqIEBicmllZiBDIHBhcnQgb2YgU1ZDIGhhbmRsZXIuCisgKi8KK3BvcnRET05UX0RJU0NBUkQgdm9pZCB2UG9ydFNWQ0hhbmRsZXJfQyggdWludDMyX3QgKnB1bENhbGxlclN0YWNrQWRkcmVzcyApIFBSSVZJTEVHRURfRlVOQ1RJT047CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqCisgKiBAYnJpZWYgRWFjaCB0YXNrIG1haW50YWlucyBpdHMgb3duIGludGVycnVwdCBzdGF0dXMgaW4gdGhlIGNyaXRpY2FsIG5lc3RpbmcKKyAqIHZhcmlhYmxlLgorICovCitzdGF0aWMgdm9sYXRpbGUgdWludDMyX3QgdWxDcml0aWNhbE5lc3RpbmcgPSAweGFhYWFhYWFhVUw7CisKKyNpZiggY29uZmlnRU5BQkxFX1RSVVNUWk9ORSA9PSAxICkKKwkvKioKKwkgKiBAYnJpZWYgU2F2ZWQgYXMgcGFydCBvZiB0aGUgdGFzayBjb250ZXh0IHRvIGluZGljYXRlIHdoaWNoIGNvbnRleHQgdGhlCisJICogdGFzayBpcyB1c2luZyBvbiB0aGUgc2VjdXJlIHNpZGUuCisJICovCisJcG9ydERPTlRfRElTQ0FSRCB2b2xhdGlsZSBTZWN1cmVDb250ZXh0SGFuZGxlX3QgeFNlY3VyZUNvbnRleHQgPSBwb3J0Tk9fU0VDVVJFX0NPTlRFWFQ7CisjZW5kaWYgLyogY29uZmlnRU5BQkxFX1RSVVNUWk9ORSAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB2b2lkIHBydlNldHVwVGltZXJJbnRlcnJ1cHQoIHZvaWQgKSAvKiBQUklWSUxFR0VEX0ZVTkNUSU9OICovCit7CisJLyogU3RvcCBhbmQgcmVzZXQgdGhlIFN5c1RpY2suICovCisJKiggcG9ydE5WSUNfU1lTVElDS19DVFJMICkgPSAwVUw7CisJKiggcG9ydE5WSUNfU1lTVElDS19DVVJSRU5UX1ZBTFVFICkgPSAwVUw7CisKKwkvKiBDb25maWd1cmUgU3lzVGljayB0byBpbnRlcnJ1cHQgYXQgdGhlIHJlcXVlc3RlZCByYXRlLiAqLworCSooIHBvcnROVklDX1NZU1RJQ0tfTE9BRCApID0gKCBjb25maWdDUFVfQ0xPQ0tfSFogLyBjb25maWdUSUNLX1JBVEVfSFogKSAtIDFVTDsKKwkqKCBwb3J0TlZJQ19TWVNUSUNLX0NUUkwgKSA9IHBvcnROVklDX1NZU1RJQ0tfQ0xLIHwgcG9ydE5WSUNfU1lTVElDS19JTlQgfCBwb3J0TlZJQ19TWVNUSUNLX0VOQUJMRTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdm9pZCBwcnZUYXNrRXhpdEVycm9yKCB2b2lkICkKK3sKK3ZvbGF0aWxlIHVpbnQzMl90IHVsRHVtbXkgPSAwVUw7CisKKwkvKiBBIGZ1bmN0aW9uIHRoYXQgaW1wbGVtZW50cyBhIHRhc2sgbXVzdCBub3QgZXhpdCBvciBhdHRlbXB0IHRvIHJldHVybiB0bworCSAqIGl0cyBjYWxsZXIgYXMgdGhlcmUgaXMgbm90aGluZyB0byByZXR1cm4gdG8uIElmIGEgdGFzayB3YW50cyB0byBleGl0IGl0CisJICogc2hvdWxkIGluc3RlYWQgY2FsbCB2VGFza0RlbGV0ZSggTlVMTCApLiBBcnRpZmljaWFsbHkgZm9yY2UgYW4gYXNzZXJ0KCkKKwkgKiB0byBiZSB0cmlnZ2VyZWQgaWYgY29uZmlnQVNTRVJUKCkgaXMgZGVmaW5lZCwgdGhlbiBzdG9wIGhlcmUgc28KKwkgKiBhcHBsaWNhdGlvbiB3cml0ZXJzIGNhbiBjYXRjaCB0aGUgZXJyb3IuICovCisJY29uZmlnQVNTRVJUKCB1bENyaXRpY2FsTmVzdGluZyA9PSB+MFVMICk7CisJcG9ydERJU0FCTEVfSU5URVJSVVBUUygpOworCisJd2hpbGUoIHVsRHVtbXkgPT0gMCApCisJeworCQkvKiBUaGlzIGZpbGUgY2FsbHMgcHJ2VGFza0V4aXRFcnJvcigpIGFmdGVyIHRoZSBzY2hlZHVsZXIgaGFzIGJlZW4KKwkJICogc3RhcnRlZCB0byByZW1vdmUgYSBjb21waWxlciB3YXJuaW5nIGFib3V0IHRoZSBmdW5jdGlvbiBiZWluZworCQkgKiBkZWZpbmVkIGJ1dCBuZXZlciBjYWxsZWQuICB1bER1bW15IGlzIHVzZWQgcHVyZWx5IHRvIHF1aWV0ZW4gb3RoZXIKKwkJICogd2FybmluZ3MgYWJvdXQgY29kZSBhcHBlYXJpbmcgYWZ0ZXIgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgLSBtYWtpbmcKKwkJICogdWxEdW1teSB2b2xhdGlsZSBtYWtlcyB0aGUgY29tcGlsZXIgdGhpbmsgdGhlIGZ1bmN0aW9uIGNvdWxkIHJldHVybgorCQkgKiBhbmQgdGhlcmVmb3JlIG5vdCBvdXRwdXQgYW4gJ3VucmVhY2hhYmxlIGNvZGUnIHdhcm5pbmcgZm9yIGNvZGUgdGhhdAorCQkgKiBhcHBlYXJzIGFmdGVyIGl0LiAqLworCX0KK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYoIGNvbmZpZ0VOQUJMRV9NUFUgPT0gMSApCisJc3RhdGljIHZvaWQgcHJ2U2V0dXBNUFUoIHZvaWQgKSAvKiBQUklWSUxFR0VEX0ZVTkNUSU9OICovCisJeworCSNpZiBkZWZpbmVkKCBfX0FSTUNDX1ZFUlNJT04gKQorCQkvKiBEZWNsYXJhdGlvbiB3aGVuIHRoZXNlIHZhcmlhYmxlIGFyZSBkZWZpbmVkIGluIGNvZGUgaW5zdGVhZCBvZiBiZWluZworCQkgKiBleHBvcnRlZCBmcm9tIGxpbmtlciBzY3JpcHRzLiAqLworCQlleHRlcm4gdWludDMyX3QgKiBfX3ByaXZpbGVnZWRfZnVuY3Rpb25zX3N0YXJ0X187CisJCWV4dGVybiB1aW50MzJfdCAqIF9fcHJpdmlsZWdlZF9mdW5jdGlvbnNfZW5kX187CisJCWV4dGVybiB1aW50MzJfdCAqIF9fc3lzY2FsbHNfZmxhc2hfc3RhcnRfXzsKKwkJZXh0ZXJuIHVpbnQzMl90ICogX19zeXNjYWxsc19mbGFzaF9lbmRfXzsKKwkJZXh0ZXJuIHVpbnQzMl90ICogX191bnByaXZpbGVnZWRfZmxhc2hfc3RhcnRfXzsKKwkJZXh0ZXJuIHVpbnQzMl90ICogX191bnByaXZpbGVnZWRfZmxhc2hfZW5kX187CisJCWV4dGVybiB1aW50MzJfdCAqIF9fcHJpdmlsZWdlZF9zcmFtX3N0YXJ0X187CisJCWV4dGVybiB1aW50MzJfdCAqIF9fcHJpdmlsZWdlZF9zcmFtX2VuZF9fOworCSNlbHNlCisJCS8qIERlY2xhcmF0aW9uIHdoZW4gdGhlc2UgdmFyaWFibGUgYXJlIGV4cG9ydGVkIGZyb20gbGlua2VyIHNjcmlwdHMuICovCisJCWV4dGVybiB1aW50MzJfdCBfX3ByaXZpbGVnZWRfZnVuY3Rpb25zX3N0YXJ0X19bXTsKKwkJZXh0ZXJuIHVpbnQzMl90IF9fcHJpdmlsZWdlZF9mdW5jdGlvbnNfZW5kX19bXTsKKwkJZXh0ZXJuIHVpbnQzMl90IF9fc3lzY2FsbHNfZmxhc2hfc3RhcnRfX1tdOworCQlleHRlcm4gdWludDMyX3QgX19zeXNjYWxsc19mbGFzaF9lbmRfX1tdOworCQlleHRlcm4gdWludDMyX3QgX191bnByaXZpbGVnZWRfZmxhc2hfc3RhcnRfX1tdOworCQlleHRlcm4gdWludDMyX3QgX191bnByaXZpbGVnZWRfZmxhc2hfZW5kX19bXTsKKwkJZXh0ZXJuIHVpbnQzMl90IF9fcHJpdmlsZWdlZF9zcmFtX3N0YXJ0X19bXTsKKwkJZXh0ZXJuIHVpbnQzMl90IF9fcHJpdmlsZWdlZF9zcmFtX2VuZF9fW107CisJI2VuZGlmIC8qIGRlZmluZWQoIF9fQVJNQ0NfVkVSU0lPTiApICovCisKKwkJLyogQ2hlY2sgdGhhdCB0aGUgTVBVIGlzIHByZXNlbnQuICovCisJCWlmKCBwb3J0TVBVX1RZUEVfUkVHID09IHBvcnRFWFBFQ1RFRF9NUFVfVFlQRV9WQUxVRSApCisJCXsKKwkJCS8qIE1BSVIwIC0gSW5kZXggMC4gKi8KKwkJCXBvcnRNUFVfTUFJUjBfUkVHIHw9ICggKCBwb3J0TVBVX05PUk1BTF9NRU1PUllfQlVGRkVSQUJMRV9DQUNIRUFCTEUgPDwgcG9ydE1QVV9NQUlSX0FUVFIwX1BPUyApICYgcG9ydE1QVV9NQUlSX0FUVFIwX01BU0sgKTsKKwkJCS8qIE1BSVIwIC0gSW5kZXggMS4gKi8KKwkJCXBvcnRNUFVfTUFJUjBfUkVHIHw9ICggKCBwb3J0TVBVX0RFVklDRV9NRU1PUllfbkduUkUgPDwgcG9ydE1QVV9NQUlSX0FUVFIxX1BPUyApICYgcG9ydE1QVV9NQUlSX0FUVFIxX01BU0sgKTsKKworCQkJLyogU2V0dXAgcHJpdmlsZWdlZCBmbGFzaCBhcyBSZWFkIE9ubHkgc28gdGhhdCBwcml2aWxlZ2VkIHRhc2tzIGNhbgorCQkJICogcmVhZCBpdCBidXQgbm90IG1vZGlmeS4gKi8KKwkJCXBvcnRNUFVfUk5SX1JFRyA9IHBvcnRQUklWSUxFR0VEX0ZMQVNIX1JFR0lPTjsKKwkJCXBvcnRNUFVfUkJBUl9SRUcgPQkoICggKCB1aW50MzJfdCApIF9fcHJpdmlsZWdlZF9mdW5jdGlvbnNfc3RhcnRfXyApICYgcG9ydE1QVV9SQkFSX0FERFJFU1NfTUFTSyApIHwKKwkJCQkJCQkJKCBwb3J0TVBVX1JFR0lPTl9OT05fU0hBUkVBQkxFICkgfAorCQkJCQkJCQkoIHBvcnRNUFVfUkVHSU9OX1BSSVZJTEVHRURfUkVBRF9PTkxZICk7CisJCQlwb3J0TVBVX1JMQVJfUkVHID0JKCAoICggdWludDMyX3QgKSBfX3ByaXZpbGVnZWRfZnVuY3Rpb25zX2VuZF9fICkgJiBwb3J0TVBVX1JMQVJfQUREUkVTU19NQVNLICkgfAorCQkJCQkJCQkoIHBvcnRNUFVfUkxBUl9BVFRSX0lOREVYMCApIHwKKwkJCQkJCQkJKCBwb3J0TVBVX1JMQVJfUkVHSU9OX0VOQUJMRSApOworCisJCQkvKiBTZXR1cCB1bnByaXZpbGVnZWQgZmxhc2ggYXMgUmVhZCBPbmx5IGJ5IGJvdGggcHJpdmlsZWdlZCBhbmQKKwkJCSAqIHVucHJpdmlsZWdlZCB0YXNrcy4gQWxsIHRhc2tzIGNhbiByZWFkIGl0IGJ1dCBuby1vbmUgY2FuIG1vZGlmeS4gKi8KKwkJCXBvcnRNUFVfUk5SX1JFRyA9IHBvcnRVTlBSSVZJTEVHRURfRkxBU0hfUkVHSU9OOworCQkJcG9ydE1QVV9SQkFSX1JFRyA9CSggKCAoIHVpbnQzMl90ICkgX191bnByaXZpbGVnZWRfZmxhc2hfc3RhcnRfXyApICYgcG9ydE1QVV9SQkFSX0FERFJFU1NfTUFTSyApIHwKKwkJCQkJCQkJKCBwb3J0TVBVX1JFR0lPTl9OT05fU0hBUkVBQkxFICkgfAorCQkJCQkJCQkoIHBvcnRNUFVfUkVHSU9OX1JFQURfT05MWSApOworCQkJcG9ydE1QVV9STEFSX1JFRyA9CSggKCAoIHVpbnQzMl90ICkgX191bnByaXZpbGVnZWRfZmxhc2hfZW5kX18gKSAmIHBvcnRNUFVfUkxBUl9BRERSRVNTX01BU0sgKSB8CisJCQkJCQkJCSggcG9ydE1QVV9STEFSX0FUVFJfSU5ERVgwICkgfAorCQkJCQkJCQkoIHBvcnRNUFVfUkxBUl9SRUdJT05fRU5BQkxFICk7CisKKwkJCS8qIFNldHVwIHVucHJpdmlsZWdlZCBzeXNjYWxscyBmbGFzaCBhcyBSZWFkIE9ubHkgYnkgYm90aCBwcml2aWxlZ2VkCisJCQkgKiBhbmQgdW5wcml2aWxlZ2VkIHRhc2tzLiBBbGwgdGFza3MgY2FuIHJlYWQgaXQgYnV0IG5vLW9uZSBjYW4gbW9kaWZ5LiAqLworCQkJcG9ydE1QVV9STlJfUkVHID0gcG9ydFVOUFJJVklMRUdFRF9TWVNDQUxMU19SRUdJT047CisJCQlwb3J0TVBVX1JCQVJfUkVHID0JKCAoICggdWludDMyX3QgKSBfX3N5c2NhbGxzX2ZsYXNoX3N0YXJ0X18gKSAmIHBvcnRNUFVfUkJBUl9BRERSRVNTX01BU0sgKSB8CisJCQkJCQkJCSggcG9ydE1QVV9SRUdJT05fTk9OX1NIQVJFQUJMRSApIHwKKwkJCQkJCQkJKCBwb3J0TVBVX1JFR0lPTl9SRUFEX09OTFkgKTsKKwkJCXBvcnRNUFVfUkxBUl9SRUcgPQkoICggKCB1aW50MzJfdCApIF9fc3lzY2FsbHNfZmxhc2hfZW5kX18gKSAmIHBvcnRNUFVfUkxBUl9BRERSRVNTX01BU0sgKSB8CisJCQkJCQkJCSggcG9ydE1QVV9STEFSX0FUVFJfSU5ERVgwICkgfAorCQkJCQkJCQkoIHBvcnRNUFVfUkxBUl9SRUdJT05fRU5BQkxFICk7CisKKwkJCS8qIFNldHVwIFJBTSBjb250YWluaW5nIGtlcm5lbCBkYXRhIGZvciBwcml2aWxlZ2VkIGFjY2VzcyBvbmx5LiAqLworCQkJcG9ydE1QVV9STlJfUkVHID0gcG9ydFBSSVZJTEVHRURfUkFNX1JFR0lPTjsKKwkJCXBvcnRNUFVfUkJBUl9SRUcgPQkoICggKCB1aW50MzJfdCApIF9fcHJpdmlsZWdlZF9zcmFtX3N0YXJ0X18gKSAmIHBvcnRNUFVfUkJBUl9BRERSRVNTX01BU0sgKSB8CisJCQkJCQkJCSggcG9ydE1QVV9SRUdJT05fTk9OX1NIQVJFQUJMRSApIHwKKwkJCQkJCQkJKCBwb3J0TVBVX1JFR0lPTl9QUklWSUxFR0VEX1JFQURfV1JJVEUgKSB8CisJCQkJCQkJCSggcG9ydE1QVV9SRUdJT05fRVhFQ1VURV9ORVZFUiApOworCQkJcG9ydE1QVV9STEFSX1JFRyA9CSggKCAoIHVpbnQzMl90ICkgX19wcml2aWxlZ2VkX3NyYW1fZW5kX18gKSAmIHBvcnRNUFVfUkxBUl9BRERSRVNTX01BU0sgKSB8CisJCQkJCQkJCSggcG9ydE1QVV9STEFSX0FUVFJfSU5ERVgwICkgfAorCQkJCQkJCQkoIHBvcnRNUFVfUkxBUl9SRUdJT05fRU5BQkxFICk7CisKKwkJCS8qIEVuYWJsZSBtZW0gZmF1bHQuICovCisJCQlwb3J0U0NCX1NZU19IQU5ETEVSX0NUUkxfU1RBVEVfUkVHIHw9IHBvcnRTQ0JfTUVNX0ZBVUxUX0VOQUJMRTsKKworCQkJLyogRW5hYmxlIE1QVSB3aXRoIHByaXZpbGVnZWQgYmFja2dyb3VuZCBhY2Nlc3MgaS5lLiB1bm1hcHBlZAorCQkJICogcmVnaW9ucyBoYXZlIHByaXZpbGVnZWQgYWNjZXNzLiAqLworCQkJcG9ydE1QVV9DVFJMX1JFRyB8PSAoIHBvcnRNUFVfUFJJVl9CQUNLR1JPVU5EX0VOQUJMRSB8IHBvcnRNUFVfRU5BQkxFICk7CisJCX0KKwl9CisjZW5kaWYgLyogY29uZmlnRU5BQkxFX01QVSAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiggY29uZmlnRU5BQkxFX0ZQVSA9PSAxICkKKwlzdGF0aWMgdm9pZCBwcnZTZXR1cEZQVSggdm9pZCApIC8qIFBSSVZJTEVHRURfRlVOQ1RJT04gKi8KKwl7CisJCSNpZiggY29uZmlnRU5BQkxFX1RSVVNUWk9ORSA9PSAxICkKKwkJeworCQkJLyogRW5hYmxlIG5vbi1zZWN1cmUgYWNjZXNzIHRvIHRoZSBGUFUuICovCisJCQlTZWN1cmVJbml0X0VuYWJsZU5TRlBVQWNjZXNzKCk7CisJCX0KKwkJI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9UUlVTVFpPTkUgKi8KKworCQkvKiBDUDEwID0gMTEgPT0+IEZ1bGwgYWNjZXNzIHRvIEZQVSBpLmUuIGJvdGggcHJpdmlsZWdlZCBhbmQKKwkJICogdW5wcml2aWxlZ2VkIGNvZGUgc2hvdWxkIGJlIGFibGUgdG8gYWNjZXNzIEZQVS4gQ1AxMSBzaG91bGQgYmUKKwkJICogcHJvZ3JhbW1lZCB0byB0aGUgc2FtZSB2YWx1ZSBhcyBDUDEwLiAqLworCQkqKCBwb3J0Q1BBQ1IgKSB8PQkoCSggcG9ydENQQUNSX0NQMTBfVkFMVUUgPDwgcG9ydENQQUNSX0NQMTBfUE9TICkgfAorCQkJCQkJCQkoIHBvcnRDUEFDUl9DUDExX1ZBTFVFIDw8IHBvcnRDUEFDUl9DUDExX1BPUyApCisJCQkJCQkJKTsKKworCQkvKiBBU1BFTiA9IDEgPT0+IEhhcmR3YXJlIHNob3VsZCBhdXRvbWF0aWNhbGx5IHByZXNlcnZlIGZsb2F0aW5nIHBvaW50CisJCSAqIGNvbnRleHQgb24gZXhjZXB0aW9uIGVudHJ5IGFuZCByZXN0b3JlIG9uIGV4Y2VwdGlvbiByZXR1cm4uCisJCSAqIExTUEVOID0gMSA9PT4gRW5hYmxlIGxhenkgY29udGV4dCBzYXZlIG9mIEZQIHN0YXRlLiAqLworCQkqKCBwb3J0RlBDQ1IgKSB8PSAoIHBvcnRGUENDUl9BU1BFTl9NQVNLIHwgcG9ydEZQQ0NSX0xTUEVOX01BU0sgKTsKKwl9CisjZW5kaWYgLyogY29uZmlnRU5BQkxFX0ZQVSAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgdlBvcnRZaWVsZCggdm9pZCApIC8qIFBSSVZJTEVHRURfRlVOQ1RJT04gKi8KK3sKKwkvKiBTZXQgYSBQZW5kU1YgdG8gcmVxdWVzdCBhIGNvbnRleHQgc3dpdGNoLiAqLworCSooIHBvcnROVklDX0lOVF9DVFJMICkgPSBwb3J0TlZJQ19QRU5EU1ZTRVQ7CisKKwkvKiBCYXJyaWVycyBhcmUgbm9ybWFsbHkgbm90IHJlcXVpcmVkIGJ1dCBkbyBlbnN1cmUgdGhlIGNvZGUgaXMKKwkgKiBjb21wbGV0ZWx5IHdpdGhpbiB0aGUgc3BlY2lmaWVkIGJlaGF2aW91ciBmb3IgdGhlIGFyY2hpdGVjdHVyZS4gKi8KKwlfX2FzbSB2b2xhdGlsZSggImRzYiIgOjo6ICJtZW1vcnkiICk7CisJX19hc20gdm9sYXRpbGUoICJpc2IiICk7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCB2UG9ydEVudGVyQ3JpdGljYWwoIHZvaWQgKSAvKiBQUklWSUxFR0VEX0ZVTkNUSU9OICovCit7CisJcG9ydERJU0FCTEVfSU5URVJSVVBUUygpOworCXVsQ3JpdGljYWxOZXN0aW5nKys7CisKKwkvKiBCYXJyaWVycyBhcmUgbm9ybWFsbHkgbm90IHJlcXVpcmVkIGJ1dCBkbyBlbnN1cmUgdGhlIGNvZGUgaXMKKwkgKiBjb21wbGV0ZWx5IHdpdGhpbiB0aGUgc3BlY2lmaWVkIGJlaGF2aW91ciBmb3IgdGhlIGFyY2hpdGVjdHVyZS4gKi8KKwlfX2FzbSB2b2xhdGlsZSggImRzYiIgOjo6ICJtZW1vcnkiICk7CisJX19hc20gdm9sYXRpbGUoICJpc2IiICk7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCB2UG9ydEV4aXRDcml0aWNhbCggdm9pZCApIC8qIFBSSVZJTEVHRURfRlVOQ1RJT04gKi8KK3sKKwljb25maWdBU1NFUlQoIHVsQ3JpdGljYWxOZXN0aW5nICk7CisJdWxDcml0aWNhbE5lc3RpbmctLTsKKworCWlmKCB1bENyaXRpY2FsTmVzdGluZyA9PSAwICkKKwl7CisJCXBvcnRFTkFCTEVfSU5URVJSVVBUUygpOworCX0KK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIFN5c1RpY2tfSGFuZGxlciggdm9pZCApIC8qIFBSSVZJTEVHRURfRlVOQ1RJT04gKi8KK3sKK3VpbnQzMl90IHVsUHJldmlvdXNNYXNrOworCisJdWxQcmV2aW91c01hc2sgPSBwb3J0U0VUX0lOVEVSUlVQVF9NQVNLX0ZST01fSVNSKCk7CisJeworCQkvKiBJbmNyZW1lbnQgdGhlIFJUT1MgdGljay4gKi8KKwkJaWYoIHhUYXNrSW5jcmVtZW50VGljaygpICE9IHBkRkFMU0UgKQorCQl7CisJCQkvKiBQZW5kIGEgY29udGV4dCBzd2l0Y2guICovCisJCQkqKCBwb3J0TlZJQ19JTlRfQ1RSTCApID0gcG9ydE5WSUNfUEVORFNWU0VUOworCQl9CisJfQorCXBvcnRDTEVBUl9JTlRFUlJVUFRfTUFTS19GUk9NX0lTUiggdWxQcmV2aW91c01hc2sgKTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIHZQb3J0U1ZDSGFuZGxlcl9DKCB1aW50MzJfdCAqcHVsQ2FsbGVyU3RhY2tBZGRyZXNzICkgLyogUFJJVklMRUdFRF9GVU5DVElPTiBwb3J0RE9OVF9ESVNDQVJEICovCit7CisjaWYoIGNvbmZpZ0VOQUJMRV9NUFUgPT0gMSApCisJI2lmIGRlZmluZWQoIF9fQVJNQ0NfVkVSU0lPTiApCisJCS8qIERlY2xhcmF0aW9uIHdoZW4gdGhlc2UgdmFyaWFibGUgYXJlIGRlZmluZWQgaW4gY29kZSBpbnN0ZWFkIG9mIGJlaW5nCisJCSAqIGV4cG9ydGVkIGZyb20gbGlua2VyIHNjcmlwdHMuICovCisJCWV4dGVybiB1aW50MzJfdCAqIF9fc3lzY2FsbHNfZmxhc2hfc3RhcnRfXzsKKwkJZXh0ZXJuIHVpbnQzMl90ICogX19zeXNjYWxsc19mbGFzaF9lbmRfXzsKKwkjZWxzZQorCQkvKiBEZWNsYXJhdGlvbiB3aGVuIHRoZXNlIHZhcmlhYmxlIGFyZSBleHBvcnRlZCBmcm9tIGxpbmtlciBzY3JpcHRzLiAqLworCQlleHRlcm4gdWludDMyX3QgX19zeXNjYWxsc19mbGFzaF9zdGFydF9fW107CisJCWV4dGVybiB1aW50MzJfdCBfX3N5c2NhbGxzX2ZsYXNoX2VuZF9fW107CisJI2VuZGlmIC8qIGRlZmluZWQoIF9fQVJNQ0NfVkVSU0lPTiApICovCisjZW5kaWYgLyogY29uZmlnRU5BQkxFX01QVSAqLworCit1aW50MzJfdCB1bFBDOworCisjaWYoIGNvbmZpZ0VOQUJMRV9UUlVTVFpPTkUgPT0gMSApCisJdWludDMyX3QgdWxSMDsKKwkjaWYoIGNvbmZpZ0VOQUJMRV9NUFUgPT0gMSApCisJCXVpbnQzMl90IHVsQ29udHJvbCwgdWxJc1Rhc2tQcml2aWxlZ2VkOworCSNlbmRpZiAvKiBjb25maWdFTkFCTEVfTVBVICovCisjZW5kaWYgLyogY29uZmlnRU5BQkxFX1RSVVNUWk9ORSAqLwordWludDhfdCB1Y1NWQ051bWJlcjsKKworCS8qIFJlZ2lzdGVyIGFyZSBzdG9yZWQgb24gdGhlIHN0YWNrIGluIHRoZSBmb2xsb3dpbmcgb3JkZXIgLSBSMCwgUjEsIFIyLCBSMywKKwkgKiBSMTIsIExSLCBQQywgeFBTUi4gKi8KKwl1bFBDID0gcHVsQ2FsbGVyU3RhY2tBZGRyZXNzWyA2IF07CisJdWNTVkNOdW1iZXIgPSAoICggdWludDhfdCAqKSB1bFBDIClbIC0yIF07CisKKwlzd2l0Y2goIHVjU1ZDTnVtYmVyICkKKwl7CisJCSNpZiggY29uZmlnRU5BQkxFX1RSVVNUWk9ORSA9PSAxICkKKwkJCWNhc2UgcG9ydFNWQ19BTExPQ0FURV9TRUNVUkVfQ09OVEVYVDoKKwkJCXsKKwkJCQkvKiBSMCBjb250YWlucyB0aGUgc3RhY2sgc2l6ZSBwYXNzZWQgYXMgcGFyYW1ldGVyIHRvIHRoZQorCQkJCSAqIHZQb3J0QWxsb2NhdGVTZWN1cmVDb250ZXh0IGZ1bmN0aW9uLiAqLworCQkJCXVsUjAgPSBwdWxDYWxsZXJTdGFja0FkZHJlc3NbIDAgXTsKKworCQkJCSNpZiggY29uZmlnRU5BQkxFX01QVSA9PSAxICkKKwkJCQl7CisJCQkJCS8qIFJlYWQgdGhlIENPTlRST0wgcmVnaXN0ZXIgdmFsdWUuICovCisJCQkJCV9fYXNtIHZvbGF0aWxlICggIm1ycyAlMCwgY29udHJvbCIgIDogIj1yIiAoIHVsQ29udHJvbCApICk7CisKKwkJCQkJLyogVGhlIHRhc2sgdGhhdCByYWlzZWQgdGhlIFNWQyBpcyBwcml2aWxlZ2VkIGlmIEJpdFswXQorCQkJCQkgKiBpbiB0aGUgQ09OVFJPTCByZWdpc3RlciBpcyAwLiAqLworCQkJCQl1bElzVGFza1ByaXZpbGVnZWQgPSAoICggdWxDb250cm9sICYgcG9ydENPTlRST0xfUFJJVklMRUdFRF9NQVNLICkgPT0gMCApOworCisJCQkJCS8qIEFsbG9jYXRlIGFuZCBsb2FkIGEgY29udGV4dCBmb3IgdGhlIHNlY3VyZSB0YXNrLiAqLworCQkJCQl4U2VjdXJlQ29udGV4dCA9IFNlY3VyZUNvbnRleHRfQWxsb2NhdGVDb250ZXh0KCB1bFIwLCB1bElzVGFza1ByaXZpbGVnZWQgKTsKKwkJCQl9CisJCQkJI2Vsc2UKKwkJCQl7CisJCQkJCS8qIEFsbG9jYXRlIGFuZCBsb2FkIGEgY29udGV4dCBmb3IgdGhlIHNlY3VyZSB0YXNrLiAqLworCQkJCQl4U2VjdXJlQ29udGV4dCA9IFNlY3VyZUNvbnRleHRfQWxsb2NhdGVDb250ZXh0KCB1bFIwICk7CisJCQkJfQorCQkJCSNlbmRpZiAvKiBjb25maWdFTkFCTEVfTVBVICovCisKKwkJCQljb25maWdBU1NFUlQoIHhTZWN1cmVDb250ZXh0ICE9IE5VTEwgKTsKKwkJCQlTZWN1cmVDb250ZXh0X0xvYWRDb250ZXh0KCB4U2VjdXJlQ29udGV4dCApOworCQkJfQorCQkJYnJlYWs7CisKKwkJCWNhc2UgcG9ydFNWQ19GUkVFX1NFQ1VSRV9DT05URVhUOgorCQkJeworCQkJCS8qIFIwIGNvbnRhaW5zIHRoZSBzZWN1cmUgY29udGV4dCBoYW5kbGUgdG8gYmUgZnJlZWQuICovCisJCQkJdWxSMCA9IHB1bENhbGxlclN0YWNrQWRkcmVzc1sgMCBdOworCisJCQkJLyogRnJlZSB0aGUgc2VjdXJlIGNvbnRleHQuICovCisJCQkJU2VjdXJlQ29udGV4dF9GcmVlQ29udGV4dCggKCBTZWN1cmVDb250ZXh0SGFuZGxlX3QgKSB1bFIwICk7CisJCQl9CisJCQlicmVhazsKKwkJI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9UUlVTVFpPTkUgKi8KKworCQljYXNlIHBvcnRTVkNfU1RBUlRfU0NIRURVTEVSOgorCQl7CisJCQkjaWYoIGNvbmZpZ0VOQUJMRV9UUlVTVFpPTkUgPT0gMSApCisJCQl7CisJCQkJLyogRGUtcHJpb3JpdGl6ZSB0aGUgbm9uLXNlY3VyZSBleGNlcHRpb25zIHNvIHRoYXQgdGhlCisJCQkJICogbm9uLXNlY3VyZSBwZW5kU1YgcnVucyBhdCB0aGUgbG93ZXN0IHByaW9yaXR5LiAqLworCQkJCVNlY3VyZUluaXRfRGVQcmlvcml0aXplTlNFeGNlcHRpb25zKCk7CisKKwkJCQkvKiBJbml0aWFsaXplIHRoZSBzZWN1cmUgY29udGV4dCBtYW5hZ2VtZW50IHN5c3RlbS4gKi8KKwkJCQlTZWN1cmVDb250ZXh0X0luaXQoKTsKKwkJCX0KKwkJCSNlbmRpZiAvKiBjb25maWdFTkFCTEVfVFJVU1RaT05FICovCisKKwkJCSNpZiggY29uZmlnRU5BQkxFX0ZQVSA9PSAxICkKKwkJCXsKKwkJCQkvKiBTZXR1cCB0aGUgRmxvYXRpbmcgUG9pbnQgVW5pdCAoRlBVKS4gKi8KKwkJCQlwcnZTZXR1cEZQVSgpOworCQkJfQorCQkJI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9GUFUgKi8KKworCQkJLyogU2V0dXAgdGhlIGNvbnRleHQgb2YgdGhlIGZpcnN0IHRhc2sgc28gdGhhdCB0aGUgZmlyc3QgdGFzayBzdGFydHMKKwkJCSAqIGV4ZWN1dGluZy4gKi8KKwkJCXZSZXN0b3JlQ29udGV4dE9mRmlyc3RUYXNrKCk7CisJCX0KKwkJYnJlYWs7CisKKwkJI2lmKCBjb25maWdFTkFCTEVfTVBVID09IDEgKQorCQkJY2FzZSBwb3J0U1ZDX1JBSVNFX1BSSVZJTEVHRToKKwkJCXsKKwkJCQkvKiBPbmx5IHJhaXNlIHRoZSBwcml2aWxlZ2UsIGlmIHRoZSBzdmMgd2FzIHJhaXNlZCBmcm9tIGFueSBvZgorCQkJCSAqIHRoZSBzeXN0ZW0gY2FsbHMuICovCisJCQkJaWYoIHVsUEMgPj0gKCB1aW50MzJfdCApIF9fc3lzY2FsbHNfZmxhc2hfc3RhcnRfXyAmJgorCQkJCQl1bFBDIDw9ICggdWludDMyX3QgKSBfX3N5c2NhbGxzX2ZsYXNoX2VuZF9fICkKKwkJCQl7CisJCQkJCXZSYWlzZVByaXZpbGVnZSgpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQkjZW5kaWYgLyogY29uZmlnRU5BQkxFX01QVSAqLworCisJCWRlZmF1bHQ6CisJCXsKKwkJCS8qIEluY29ycmVjdCBTVkMgY2FsbC4gKi8KKwkJCWNvbmZpZ0FTU0VSVCggcGRGQUxTRSApOworCQl9CisJfQorfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiggY29uZmlnRU5BQkxFX01QVSA9PSAxICkKKwlTdGFja1R5cGVfdCAqcHhQb3J0SW5pdGlhbGlzZVN0YWNrKCBTdGFja1R5cGVfdCAqcHhUb3BPZlN0YWNrLCBTdGFja1R5cGVfdCAqcHhFbmRPZlN0YWNrLCBUYXNrRnVuY3Rpb25fdCBweENvZGUsIHZvaWQgKnB2UGFyYW1ldGVycywgQmFzZVR5cGVfdCB4UnVuUHJpdmlsZWdlZCApIC8qIFBSSVZJTEVHRURfRlVOQ1RJT04gKi8KKyNlbHNlCisJU3RhY2tUeXBlX3QgKnB4UG9ydEluaXRpYWxpc2VTdGFjayggU3RhY2tUeXBlX3QgKnB4VG9wT2ZTdGFjaywgU3RhY2tUeXBlX3QgKnB4RW5kT2ZTdGFjaywgVGFza0Z1bmN0aW9uX3QgcHhDb2RlLCB2b2lkICpwdlBhcmFtZXRlcnMgKSAvKiBQUklWSUxFR0VEX0ZVTkNUSU9OICovCisjZW5kaWYgLyogY29uZmlnRU5BQkxFX01QVSAqLworeworCS8qIFNpbXVsYXRlIHRoZSBzdGFjayBmcmFtZSBhcyBpdCB3b3VsZCBiZSBjcmVhdGVkIGJ5IGEgY29udGV4dCBzd2l0Y2gKKwkgKiBpbnRlcnJ1cHQuICovCisJI2lmKCBwb3J0UFJFTE9BRF9SRUdJU1RFUlMgPT0gMCApCisJeworCQlweFRvcE9mU3RhY2stLTsgLyogT2Zmc2V0IGFkZGVkIHRvIGFjY291bnQgZm9yIHRoZSB3YXkgdGhlIE1DVSB1c2VzIHRoZSBzdGFjayBvbiBlbnRyeS9leGl0IG9mIGludGVycnVwdHMuICovCisJCSpweFRvcE9mU3RhY2sgPSBwb3J0SU5JVElBTF9YUFNSOwkJCQkJCQkvKiB4UFNSICovCisJCXB4VG9wT2ZTdGFjay0tOworCQkqcHhUb3BPZlN0YWNrID0gKCBTdGFja1R5cGVfdCApIHB4Q29kZTsJCQkJCQkvKiBQQyAqLworCQlweFRvcE9mU3RhY2stLTsKKwkJKnB4VG9wT2ZTdGFjayA9ICggU3RhY2tUeXBlX3QgKSBwb3J0VEFTS19SRVRVUk5fQUREUkVTUzsJLyogTFIgKi8KKwkJcHhUb3BPZlN0YWNrIC09IDU7CQkJCQkJCQkJCQkvKiBSMTIsIFIzLCBSMiBhbmQgUjEuICovCisJCSpweFRvcE9mU3RhY2sgPSAoIFN0YWNrVHlwZV90ICkgcHZQYXJhbWV0ZXJzOwkJCQkvKiBSMCAqLworCQlweFRvcE9mU3RhY2sgLT0gOTsJCQkJCQkJCQkJCS8qIFIxMS4uUjQsIEVYQ19SRVRVUk4uICovCisJCSpweFRvcE9mU3RhY2sgPSBwb3J0SU5JVElBTF9FWENfUkVUVVJOOworCisJCSNpZiggY29uZmlnRU5BQkxFX01QVSA9PSAxICkKKwkJeworCQkJcHhUb3BPZlN0YWNrLS07CisJCQlpZiggeFJ1blByaXZpbGVnZWQgPT0gcGRUUlVFICkKKwkJCXsKKwkJCQkqcHhUb3BPZlN0YWNrID0gcG9ydElOSVRJQUxfQ09OVFJPTF9QUklWSUxFR0VEOwkJLyogU2xvdCB1c2VkIHRvIGhvbGQgdGhpcyB0YXNrJ3MgQ09OVFJPTCB2YWx1ZS4gKi8KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkqcHhUb3BPZlN0YWNrID0gcG9ydElOSVRJQUxfQ09OVFJPTF9VTlBSSVZJTEVHRUQ7CS8qIFNsb3QgdXNlZCB0byBob2xkIHRoaXMgdGFzaydzIENPTlRST0wgdmFsdWUuICovCisJCQl9CisJCX0KKwkJI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9NUFUgKi8KKworCQlweFRvcE9mU3RhY2stLTsKKwkJKnB4VG9wT2ZTdGFjayA9ICggU3RhY2tUeXBlX3QgKSBweEVuZE9mU3RhY2s7CS8qIFNsb3QgdXNlZCB0byBob2xkIHRoaXMgdGFzaydzIFBTUExJTSB2YWx1ZS4gKi8KKworCQkjaWYoIGNvbmZpZ0VOQUJMRV9UUlVTVFpPTkUgPT0gMSApCisJCXsKKwkJCXB4VG9wT2ZTdGFjay0tOworCQkJKnB4VG9wT2ZTdGFjayA9IHBvcnROT19TRUNVUkVfQ09OVEVYVDsJCS8qIFNsb3QgdXNlZCB0byBob2xkIHRoaXMgdGFzaydzIHhTZWN1cmVDb250ZXh0IHZhbHVlLiAqLworCQl9CisJCSNlbmRpZiAvKiBjb25maWdFTkFCTEVfVFJVU1RaT05FICovCisJfQorCSNlbHNlIC8qIHBvcnRQUkVMT0FEX1JFR0lTVEVSUyAqLworCXsKKwkJcHhUb3BPZlN0YWNrLS07IC8qIE9mZnNldCBhZGRlZCB0byBhY2NvdW50IGZvciB0aGUgd2F5IHRoZSBNQ1UgdXNlcyB0aGUgc3RhY2sgb24gZW50cnkvZXhpdCBvZiBpbnRlcnJ1cHRzLiAqLworCQkqcHhUb3BPZlN0YWNrID0gcG9ydElOSVRJQUxfWFBTUjsJCQkJCQkJLyogeFBTUiAqLworCQlweFRvcE9mU3RhY2stLTsKKwkJKnB4VG9wT2ZTdGFjayA9ICggU3RhY2tUeXBlX3QgKSBweENvZGU7CQkJCQkJLyogUEMgKi8KKwkJcHhUb3BPZlN0YWNrLS07CisJCSpweFRvcE9mU3RhY2sgPSAoIFN0YWNrVHlwZV90ICkgcG9ydFRBU0tfUkVUVVJOX0FERFJFU1M7CS8qIExSICovCisJCXB4VG9wT2ZTdGFjay0tOworCQkqcHhUb3BPZlN0YWNrID0gKCBTdGFja1R5cGVfdCApIDB4MTIxMjEyMTJVTDsJCQkJLyogUjEyICovCisJCXB4VG9wT2ZTdGFjay0tOworCQkqcHhUb3BPZlN0YWNrID0gKCBTdGFja1R5cGVfdCApIDB4MDMwMzAzMDNVTDsJCQkJLyogUjMgKi8KKwkJcHhUb3BPZlN0YWNrLS07CisJCSpweFRvcE9mU3RhY2sgPSAoIFN0YWNrVHlwZV90ICkgMHgwMjAyMDIwMlVMOwkJCQkvKiBSMiAqLworCQlweFRvcE9mU3RhY2stLTsKKwkJKnB4VG9wT2ZTdGFjayA9ICggU3RhY2tUeXBlX3QgKSAweDAxMDEwMTAxVUw7CQkJCS8qIFIxICovCisJCXB4VG9wT2ZTdGFjay0tOworCQkqcHhUb3BPZlN0YWNrID0gKCBTdGFja1R5cGVfdCApIHB2UGFyYW1ldGVyczsJCQkJLyogUjAgKi8KKwkJcHhUb3BPZlN0YWNrLS07CisJCSpweFRvcE9mU3RhY2sgPSAoIFN0YWNrVHlwZV90ICkgMHgxMTExMTExMVVMOwkJCQkvKiBSMTEgKi8KKwkJcHhUb3BPZlN0YWNrLS07CisJCSpweFRvcE9mU3RhY2sgPSAoIFN0YWNrVHlwZV90ICkgMHgxMDEwMTAxMFVMOwkJCQkvKiBSMTAgKi8KKwkJcHhUb3BPZlN0YWNrLS07CisJCSpweFRvcE9mU3RhY2sgPSAoIFN0YWNrVHlwZV90ICkgMHgwOTA5MDkwOVVMOwkJCQkvKiBSMDkgKi8KKwkJcHhUb3BPZlN0YWNrLS07CisJCSpweFRvcE9mU3RhY2sgPSAoIFN0YWNrVHlwZV90ICkgMHgwODA4MDgwOFVMOwkJCQkvKiBSMDggKi8KKwkJcHhUb3BPZlN0YWNrLS07CisJCSpweFRvcE9mU3RhY2sgPSAoIFN0YWNrVHlwZV90ICkgMHgwNzA3MDcwN1VMOwkJCQkvKiBSMDcgKi8KKwkJcHhUb3BPZlN0YWNrLS07CisJCSpweFRvcE9mU3RhY2sgPSAoIFN0YWNrVHlwZV90ICkgMHgwNjA2MDYwNlVMOwkJCQkvKiBSMDYgKi8KKwkJcHhUb3BPZlN0YWNrLS07CisJCSpweFRvcE9mU3RhY2sgPSAoIFN0YWNrVHlwZV90ICkgMHgwNTA1MDUwNVVMOwkJCQkvKiBSMDUgKi8KKwkJcHhUb3BPZlN0YWNrLS07CisJCSpweFRvcE9mU3RhY2sgPSAoIFN0YWNrVHlwZV90ICkgMHgwNDA0MDQwNFVMOwkJCQkvKiBSMDQgKi8KKwkJcHhUb3BPZlN0YWNrLS07CisJCSpweFRvcE9mU3RhY2sgPSBwb3J0SU5JVElBTF9FWENfUkVUVVJOOwkJCQkJCS8qIEVYQ19SRVRVUk4gKi8KKworCQkjaWYoIGNvbmZpZ0VOQUJMRV9NUFUgPT0gMSApCisJCXsKKwkJCXB4VG9wT2ZTdGFjay0tOworCQkJaWYoIHhSdW5Qcml2aWxlZ2VkID09IHBkVFJVRSApCisJCQl7CisJCQkJKnB4VG9wT2ZTdGFjayA9IHBvcnRJTklUSUFMX0NPTlRST0xfUFJJVklMRUdFRDsJCS8qIFNsb3QgdXNlZCB0byBob2xkIHRoaXMgdGFzaydzIENPTlRST0wgdmFsdWUuICovCisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJKnB4VG9wT2ZTdGFjayA9IHBvcnRJTklUSUFMX0NPTlRST0xfVU5QUklWSUxFR0VEOwkvKiBTbG90IHVzZWQgdG8gaG9sZCB0aGlzIHRhc2sncyBDT05UUk9MIHZhbHVlLiAqLworCQkJfQorCQl9CisJCSNlbmRpZiAvKiBjb25maWdFTkFCTEVfTVBVICovCisKKwkJcHhUb3BPZlN0YWNrLS07CisJCSpweFRvcE9mU3RhY2sgPSAoIFN0YWNrVHlwZV90ICkgcHhFbmRPZlN0YWNrOwkvKiBTbG90IHVzZWQgdG8gaG9sZCB0aGlzIHRhc2sncyBQU1BMSU0gdmFsdWUuICovCisKKwkJI2lmKCBjb25maWdFTkFCTEVfVFJVU1RaT05FID09IDEgKQorCQl7CisJCQlweFRvcE9mU3RhY2stLTsKKwkJCSpweFRvcE9mU3RhY2sgPSBwb3J0Tk9fU0VDVVJFX0NPTlRFWFQ7CQkvKiBTbG90IHVzZWQgdG8gaG9sZCB0aGlzIHRhc2sncyB4U2VjdXJlQ29udGV4dCB2YWx1ZS4gKi8KKwkJfQorCQkjZW5kaWYgLyogY29uZmlnRU5BQkxFX1RSVVNUWk9ORSAqLworCX0KKwkjZW5kaWYgLyogcG9ydFBSRUxPQURfUkVHSVNURVJTICovCisKKwlyZXR1cm4gcHhUb3BPZlN0YWNrOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK0Jhc2VUeXBlX3QgeFBvcnRTdGFydFNjaGVkdWxlciggdm9pZCApIC8qIFBSSVZJTEVHRURfRlVOQ1RJT04gKi8KK3sKKwkvKiBNYWtlIFBlbmRTViwgQ2FsbFNWIGFuZCBTeXNUaWNrIHRoZSBzYW1lIHByaW9yaXR5IGFzIHRoZSBrZXJuZWwuICovCisJKiggcG9ydE5WSUNfU1lTUFJJMiApIHw9IHBvcnROVklDX1BFTkRTVl9QUkk7CisJKiggcG9ydE5WSUNfU1lTUFJJMiApIHw9IHBvcnROVklDX1NZU1RJQ0tfUFJJOworCisJI2lmKCBjb25maWdFTkFCTEVfTVBVID09IDEgKQorCXsKKwkJLyogU2V0dXAgdGhlIE1lbW9yeSBQcm90ZWN0aW9uIFVuaXQgKE1QVSkuICovCisJCXBydlNldHVwTVBVKCk7CisJfQorCSNlbmRpZiAvKiBjb25maWdFTkFCTEVfTVBVICovCisKKwkvKiBTdGFydCB0aGUgdGltZXIgdGhhdCBnZW5lcmF0ZXMgdGhlIHRpY2sgSVNSLiBJbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZAorCSAqIGhlcmUgYWxyZWFkeS4gKi8KKwlwcnZTZXR1cFRpbWVySW50ZXJydXB0KCk7CisKKwkvKiBJbml0aWFsaXplIHRoZSBjcml0aWNhbCBuZXN0aW5nIGNvdW50IHJlYWR5IGZvciB0aGUgZmlyc3QgdGFzay4gKi8KKwl1bENyaXRpY2FsTmVzdGluZyA9IDA7CisKKwkvKiBTdGFydCB0aGUgZmlyc3QgdGFzay4gKi8KKwl2U3RhcnRGaXJzdFRhc2soKTsKKworCS8qIFNob3VsZCBuZXZlciBnZXQgaGVyZSBhcyB0aGUgdGFza3Mgd2lsbCBub3cgYmUgZXhlY3V0aW5nLiBDYWxsIHRoZSB0YXNrCisJICogZXhpdCBlcnJvciBmdW5jdGlvbiB0byBwcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzIGFib3V0IGEgc3RhdGljIGZ1bmN0aW9uCisJICogbm90IGJlaW5nIGNhbGxlZCBpbiB0aGUgY2FzZSB0aGF0IHRoZSBhcHBsaWNhdGlvbiB3cml0ZXIgb3ZlcnJpZGVzIHRoaXMKKwkgKiBmdW5jdGlvbmFsaXR5IGJ5IGRlZmluaW5nIGNvbmZpZ1RBU0tfUkVUVVJOX0FERFJFU1MuIENhbGwKKwkgKiB2VGFza1N3aXRjaENvbnRleHQoKSBzbyBsaW5rIHRpbWUgb3B0aW1pemF0aW9uIGRvZXMgbm90IHJlbW92ZSB0aGUKKwkgKiBzeW1ib2wuICovCisJdlRhc2tTd2l0Y2hDb250ZXh0KCk7CisJcHJ2VGFza0V4aXRFcnJvcigpOworCisJLyogU2hvdWxkIG5vdCBnZXQgaGVyZS4gKi8KKwlyZXR1cm4gMDsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIHZQb3J0RW5kU2NoZWR1bGVyKCB2b2lkICkgLyogUFJJVklMRUdFRF9GVU5DVElPTiAqLworeworCS8qIE5vdCBpbXBsZW1lbnRlZCBpbiBwb3J0cyB3aGVyZSB0aGVyZSBpcyBub3RoaW5nIHRvIHJldHVybiB0by4KKwkgKiBBcnRpZmljaWFsbHkgZm9yY2UgYW4gYXNzZXJ0LiAqLworCWNvbmZpZ0FTU0VSVCggdWxDcml0aWNhbE5lc3RpbmcgPT0gMTAwMFVMICk7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmKCBjb25maWdFTkFCTEVfTVBVID09IDEgKQorCXZvaWQgdlBvcnRTdG9yZVRhc2tNUFVTZXR0aW5ncyggeE1QVV9TRVRUSU5HUyAqeE1QVVNldHRpbmdzLCBjb25zdCBzdHJ1Y3QgeE1FTU9SWV9SRUdJT04gKiBjb25zdCB4UmVnaW9ucywgU3RhY2tUeXBlX3QgKnB4Qm90dG9tT2ZTdGFjaywgdWludDMyX3QgdWxTdGFja0RlcHRoICkKKwl7CisJdWludDMyX3QgdWxSZWdpb25TdGFydEFkZHJlc3MsIHVsUmVnaW9uRW5kQWRkcmVzcywgdWxSZWdpb25OdW1iZXI7CisJaW50MzJfdCBsSW5kZXggPSAwOworCisJCS8qIFNldHVwIE1BSVIwLiAqLworCQl4TVBVU2V0dGluZ3MtPnVsTUFJUjAgPSAoICggcG9ydE1QVV9OT1JNQUxfTUVNT1JZX0JVRkZFUkFCTEVfQ0FDSEVBQkxFIDw8IHBvcnRNUFVfTUFJUl9BVFRSMF9QT1MgKSAmIHBvcnRNUFVfTUFJUl9BVFRSMF9NQVNLICk7CisJCXhNUFVTZXR0aW5ncy0+dWxNQUlSMCB8PSAoICggcG9ydE1QVV9ERVZJQ0VfTUVNT1JZX25HblJFIDw8IHBvcnRNUFVfTUFJUl9BVFRSMV9QT1MgKSAmIHBvcnRNUFVfTUFJUl9BVFRSMV9NQVNLICk7CisKKwkJLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYXV0b21hdGljYWxseSB3aGVuIHRoZSB0YXNrIGlzIGNyZWF0ZWQgLSBpbgorCQkgKiB3aGljaCBjYXNlIHRoZSBzdGFjayByZWdpb24gcGFyYW1ldGVycyB3aWxsIGJlIHZhbGlkLiAgQXQgYWxsIG90aGVyCisJCSAqIHRpbWVzIHRoZSBzdGFjayBwYXJhbWV0ZXJzIHdpbGwgbm90IGJlIHZhbGlkIGFuZCBpdCBpcyBhc3N1bWVkIHRoYXQKKwkJICogdGhlIHN0YWNrIHJlZ2lvbiBoYXMgYWxyZWFkeSBiZWVuIGNvbmZpZ3VyZWQuICovCisJCWlmKCB1bFN0YWNrRGVwdGggPiAwICkKKwkJeworCQkJLyogRGVmaW5lIHRoZSByZWdpb24gdGhhdCBhbGxvd3MgYWNjZXNzIHRvIHRoZSBzdGFjay4gKi8KKwkJCXVsUmVnaW9uU3RhcnRBZGRyZXNzID0gKCAoIHVpbnQzMl90ICkgcHhCb3R0b21PZlN0YWNrICkgJiBwb3J0TVBVX1JCQVJfQUREUkVTU19NQVNLOworCQkJdWxSZWdpb25FbmRBZGRyZXNzID0gKCB1aW50MzJfdCApIHB4Qm90dG9tT2ZTdGFjayArICggdWxTdGFja0RlcHRoICogKCB1aW50MzJfdCApIHNpemVvZiggU3RhY2tUeXBlX3QgKSApIC0gMTsKKwkJCXVsUmVnaW9uRW5kQWRkcmVzcyAgJj0gcG9ydE1QVV9STEFSX0FERFJFU1NfTUFTSzsKKworCQkJeE1QVVNldHRpbmdzLT54UmVnaW9uc1NldHRpbmdzWyAwIF0udWxSQkFSID0JKCB1bFJlZ2lvblN0YXJ0QWRkcmVzcyApIHwKKwkJCQkJCQkJCQkJCQkJCSggcG9ydE1QVV9SRUdJT05fTk9OX1NIQVJFQUJMRSApIHwKKwkJCQkJCQkJCQkJCQkJCSggcG9ydE1QVV9SRUdJT05fUkVBRF9XUklURSApIHwKKwkJCQkJCQkJCQkJCQkJCSggcG9ydE1QVV9SRUdJT05fRVhFQ1VURV9ORVZFUiApOworCisJCQl4TVBVU2V0dGluZ3MtPnhSZWdpb25zU2V0dGluZ3NbIDAgXS51bFJMQVIgPQkoIHVsUmVnaW9uRW5kQWRkcmVzcyApIHwKKwkJCQkJCQkJCQkJCQkJCSggcG9ydE1QVV9STEFSX0FUVFJfSU5ERVgwICkgfAorCQkJCQkJCQkJCQkJCQkJKCBwb3J0TVBVX1JMQVJfUkVHSU9OX0VOQUJMRSApOworCQl9CisKKwkJLyogVXNlciBzdXBwbGllZCBjb25maWd1cmFibGUgcmVnaW9ucy4gKi8KKwkJZm9yKCB1bFJlZ2lvbk51bWJlciA9IDE7IHVsUmVnaW9uTnVtYmVyIDw9IHBvcnROVU1fQ09ORklHVVJBQkxFX1JFR0lPTlM7IHVsUmVnaW9uTnVtYmVyKysgKQorCQl7CisJCQkvKiBJZiB4UmVnaW9ucyBpcyBOVUxMIGkuZS4gdGhlIHRhc2sgaGFzIG5vdCBzcGVjaWZpZWQgYW55IE1QVQorCQkJICogcmVnaW9uLCB0aGUgZWxzZSBwYXJ0IGVuc3VyZXMgdGhhdCBhbGwgdGhlIGNvbmZpZ3VyYWJsZSBNUFUKKwkJCSAqIHJlZ2lvbnMgYXJlIGludmFsaWRhdGVkLiAqLworCQkJaWYoICggeFJlZ2lvbnMgIT0gTlVMTCApICYmICggeFJlZ2lvbnNbIGxJbmRleCBdLnVsTGVuZ3RoSW5CeXRlcyA+IDBVTCApICkKKwkJCXsKKwkJCQkvKiBUcmFuc2xhdGUgdGhlIGdlbmVyaWMgcmVnaW9uIGRlZmluaXRpb24gY29udGFpbmVkIGluIHhSZWdpb25zCisJCQkJICogaW50byB0aGUgQVJNdjggc3BlY2lmaWMgTVBVIHNldHRpbmdzIHRoYXQgYXJlIHRoZW4gc3RvcmVkIGluCisJCQkJICogeE1QVVNldHRpbmdzLiAqLworCQkJCXVsUmVnaW9uU3RhcnRBZGRyZXNzID0gKCAoIHVpbnQzMl90ICkgeFJlZ2lvbnNbIGxJbmRleCBdLnB2QmFzZUFkZHJlc3MgKSAmIHBvcnRNUFVfUkJBUl9BRERSRVNTX01BU0s7CisJCQkJdWxSZWdpb25FbmRBZGRyZXNzID0gKCB1aW50MzJfdCApIHhSZWdpb25zWyBsSW5kZXggXS5wdkJhc2VBZGRyZXNzICsgeFJlZ2lvbnNbIGxJbmRleCBdLnVsTGVuZ3RoSW5CeXRlcyAtIDE7CisJCQkJdWxSZWdpb25FbmRBZGRyZXNzICAmPSBwb3J0TVBVX1JMQVJfQUREUkVTU19NQVNLOworCisJCQkJLyogU3RhcnQgYWRkcmVzcy4gKi8KKwkJCQl4TVBVU2V0dGluZ3MtPnhSZWdpb25zU2V0dGluZ3NbIHVsUmVnaW9uTnVtYmVyIF0udWxSQkFSID0JKCB1bFJlZ2lvblN0YXJ0QWRkcmVzcyApIHwKKwkJCQkJCQkJCQkJCQkJCQkJCQkoIHBvcnRNUFVfUkVHSU9OX05PTl9TSEFSRUFCTEUgKTsKKworCQkJCS8qIFJPL1JXLiAqLworCQkJCWlmKCAoIHhSZWdpb25zWyBsSW5kZXggXS51bFBhcmFtZXRlcnMgJiB0c2tNUFVfUkVHSU9OX1JFQURfT05MWSApICE9IDAgKQorCQkJCXsKKwkJCQkJeE1QVVNldHRpbmdzLT54UmVnaW9uc1NldHRpbmdzWyB1bFJlZ2lvbk51bWJlciBdLnVsUkJBUiB8PSAoIHBvcnRNUFVfUkVHSU9OX1JFQURfT05MWSApOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQl4TVBVU2V0dGluZ3MtPnhSZWdpb25zU2V0dGluZ3NbIHVsUmVnaW9uTnVtYmVyIF0udWxSQkFSIHw9ICggcG9ydE1QVV9SRUdJT05fUkVBRF9XUklURSApOworCQkJCX0KKworCQkJCS8qIFhOLiAqLworCQkJCWlmKCAoIHhSZWdpb25zWyBsSW5kZXggXS51bFBhcmFtZXRlcnMgJiB0c2tNUFVfUkVHSU9OX0VYRUNVVEVfTkVWRVIgKSAhPSAwICkKKwkJCQl7CisJCQkJCXhNUFVTZXR0aW5ncy0+eFJlZ2lvbnNTZXR0aW5nc1sgdWxSZWdpb25OdW1iZXIgXS51bFJCQVIgfD0gKCBwb3J0TVBVX1JFR0lPTl9FWEVDVVRFX05FVkVSICk7CisJCQkJfQorCisJCQkJLyogRW5kIEFkZHJlc3MuICovCisJCQkJeE1QVVNldHRpbmdzLT54UmVnaW9uc1NldHRpbmdzWyB1bFJlZ2lvbk51bWJlciBdLnVsUkxBUiA9CSggdWxSZWdpb25FbmRBZGRyZXNzICkgfAorCQkJCQkJCQkJCQkJCQkJCQkJCSggcG9ydE1QVV9STEFSX1JFR0lPTl9FTkFCTEUgKTsKKworCQkJCS8qIE5vcm1hbCBtZW1vcnkvIERldmljZSBtZW1vcnkuICovCisJCQkJaWYoICggeFJlZ2lvbnNbIGxJbmRleCBdLnVsUGFyYW1ldGVycyAmIHRza01QVV9SRUdJT05fREVWSUNFX01FTU9SWSApICE9IDAgKQorCQkJCXsKKwkJCQkJLyogQXR0cjEgaW4gTUFJUjAgaXMgY29uZmlndXJlZCBhcyBkZXZpY2UgbWVtb3J5LiAqLworCQkJCQl4TVBVU2V0dGluZ3MtPnhSZWdpb25zU2V0dGluZ3NbIHVsUmVnaW9uTnVtYmVyIF0udWxSTEFSIHw9IHBvcnRNUFVfUkxBUl9BVFRSX0lOREVYMTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJLyogQXR0cjEgaW4gTUFJUjAgaXMgY29uZmlndXJlZCBhcyBub3JtYWwgbWVtb3J5LiAqLworCQkJCQl4TVBVU2V0dGluZ3MtPnhSZWdpb25zU2V0dGluZ3NbIHVsUmVnaW9uTnVtYmVyIF0udWxSTEFSIHw9IHBvcnRNUFVfUkxBUl9BVFRSX0lOREVYMDsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLyogSW52YWxpZGF0ZSB0aGUgcmVnaW9uLiAqLworCQkJCXhNUFVTZXR0aW5ncy0+eFJlZ2lvbnNTZXR0aW5nc1sgdWxSZWdpb25OdW1iZXIgXS51bFJCQVIgPSAwVUw7CisJCQkJeE1QVVNldHRpbmdzLT54UmVnaW9uc1NldHRpbmdzWyB1bFJlZ2lvbk51bWJlciBdLnVsUkxBUiA9IDBVTDsKKwkJCX0KKworCQkJbEluZGV4Kys7CisJCX0KKwl9CisjZW5kaWYgLyogY29uZmlnRU5BQkxFX01QVSAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCmRpZmYgLS1naXQgYS9Tb3VyY2UvcG9ydGFibGUvSUFSL0FSTV9DTTIzL25vbl9zZWN1cmUvcG9ydGFzbS5oIGIvU291cmNlL3BvcnRhYmxlL0lBUi9BUk1fQ00yMy9ub25fc2VjdXJlL3BvcnRhc20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWNmMDRlCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL3BvcnRhYmxlL0lBUi9BUk1fQ00yMy9ub25fc2VjdXJlL3BvcnRhc20uaApAQCAtMCwwICsxLDExMyBAQAorLyoKKyAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMi4xCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgorICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KKyAqIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KKyAqIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mCisgKiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCisgKiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKKyAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTCisgKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IKKyAqIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUgorICogSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogaHR0cDovL3d3dy5GcmVlUlRPUy5vcmcKKyAqIGh0dHA6Ly9hd3MuYW1hem9uLmNvbS9mcmVlcnRvcworICoKKyAqIDEgdGFiID09IDQgc3BhY2VzIQorICovCisKKyNpZm5kZWYgX19QT1JUX0FTTV9IX18KKyNkZWZpbmUgX19QT1JUX0FTTV9IX18KKworLyogU2NoZWR1bGVyIGluY2x1ZGVzLiAqLworI2luY2x1ZGUgIkZyZWVSVE9TLmgiCisKKy8qIE1QVSB3cmFwcGVycyBpbmNsdWRlcy4gKi8KKyNpbmNsdWRlICJtcHVfd3JhcHBlcnMuaCIKKworLyoqCisgKiBAYnJpZWYgUmVzdG9yZSB0aGUgY29udGV4dCBvZiB0aGUgZmlyc3QgdGFzayBzbyB0aGF0IHRoZSBmaXJzdCB0YXNrIHN0YXJ0cworICogZXhlY3V0aW5nLgorICovCit2b2lkIHZSZXN0b3JlQ29udGV4dE9mRmlyc3RUYXNrKCB2b2lkICkgX19hdHRyaWJ1dGVfXyAoKCBuYWtlZCApKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisvKioKKyAqIEBicmllZiBDaGVja3Mgd2hldGhlciBvciBub3QgdGhlIHByb2Nlc3NvciBpcyBwcml2aWxlZ2VkLgorICoKKyAqIEByZXR1cm4gMSBpZiB0aGUgcHJvY2Vzc29yIGlzIGFscmVhZHkgcHJpdmlsZWdlZCwgMCBvdGhlcndpc2UuCisgKi8KK0Jhc2VUeXBlX3QgeElzUHJpdmlsZWdlZCggdm9pZCApIF9fYXR0cmlidXRlX18gKCggbmFrZWQgKSk7CisKKy8qKgorICogQGJyaWVmIFJhaXNlcyB0aGUgcHJpdmlsZWdlIGxldmVsIGJ5IGNsZWFyaW5nIHRoZSBiaXQgMCBvZiB0aGUgQ09OVFJPTAorICogcmVnaXN0ZXIuCisgKgorICogQG5vdGUgVGhpcyBpcyBhIHByaXZpbGVnZWQgZnVuY3Rpb24gYW5kIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBmcm9tIHRoZSBrZW5yZWwKKyAqIGNvZGUuCisgKgorICogQml0IDAgb2YgdGhlIENPTlRST0wgcmVnaXN0ZXIgZGVmaW5lcyB0aGUgcHJpdmlsZWdlIGxldmVsIG9mIFRocmVhZCBNb2RlLgorICogIEJpdFswXSA9IDAgLS0+IFRoZSBwcm9jZXNzb3IgaXMgcnVubmluZyBwcml2aWxlZ2VkCisgKiAgQml0WzBdID0gMSAtLT4gVGhlIHByb2Nlc3NvciBpcyBydW5uaW5nIHVucHJpdmlsZWdlZC4KKyAqLwordm9pZCB2UmFpc2VQcml2aWxlZ2UoIHZvaWQgKSBfX2F0dHJpYnV0ZV9fICgoIG5ha2VkICkpIFBSSVZJTEVHRURfRlVOQ1RJT047CisKKy8qKgorICogQGJyaWVmIExvd2VycyB0aGUgcHJpdmlsZWdlIGxldmVsIGJ5IHNldHRpbmcgdGhlIGJpdCAwIG9mIHRoZSBDT05UUk9MCisgKiByZWdpc3Rlci4KKyAqCisgKiBCaXQgMCBvZiB0aGUgQ09OVFJPTCByZWdpc3RlciBkZWZpbmVzIHRoZSBwcml2aWxlZ2UgbGV2ZWwgb2YgVGhyZWFkIE1vZGUuCisgKiAgQml0WzBdID0gMCAtLT4gVGhlIHByb2Nlc3NvciBpcyBydW5uaW5nIHByaXZpbGVnZWQKKyAqICBCaXRbMF0gPSAxIC0tPiBUaGUgcHJvY2Vzc29yIGlzIHJ1bm5pbmcgdW5wcml2aWxlZ2VkLgorICovCit2b2lkIHZSZXNldFByaXZpbGVnZSggdm9pZCApIF9fYXR0cmlidXRlX18gKCggbmFrZWQgKSk7CisKKy8qKgorICogQGJyaWVmIFN0YXJ0cyB0aGUgZmlyc3QgdGFzay4KKyAqLwordm9pZCB2U3RhcnRGaXJzdFRhc2soIHZvaWQgKSBfX2F0dHJpYnV0ZV9fICgoIG5ha2VkICkpIFBSSVZJTEVHRURfRlVOQ1RJT047CisKKy8qKgorICogQGJyaWVmIERpc2FibGVzIGludGVycnVwdHMuCisgKi8KK3VpbnQzMl90IHVsU2V0SW50ZXJydXB0TWFza0Zyb21JU1IoIHZvaWQgKSBfX2F0dHJpYnV0ZV9fKCggbmFrZWQgKSkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworLyoqCisgKiBAYnJpZWYgRW5hYmxlcyBpbnRlcnJ1cHRzLgorICovCit2b2lkIHZDbGVhckludGVycnVwdE1hc2tGcm9tSVNSKCB1aW50MzJfdCB1bE1hc2sgKSBfX2F0dHJpYnV0ZV9fKCggbmFrZWQgKSkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworLyoqCisgKiBAYnJpZWYgUGVuZFNWIEV4Y2VwdGlvbiBoYW5kbGVyLgorICovCit2b2lkIFBlbmRTVl9IYW5kbGVyKCB2b2lkICkgX19hdHRyaWJ1dGVfXyAoKCBuYWtlZCApKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisvKioKKyAqIEBicmllZiBTVkMgSGFuZGxlci4KKyAqLwordm9pZCBTVkNfSGFuZGxlciggdm9pZCApIF9fYXR0cmlidXRlX18gKCggbmFrZWQgKSkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworLyoqCisgKiBAYnJpZWYgQWxsb2NhdGUgYSBTZWN1cmUgY29udGV4dCBmb3IgdGhlIGNhbGxpbmcgdGFzay4KKyAqCisgKiBAcGFyYW1baW5dIHVsU2VjdXJlU3RhY2tTaXplIFRoZSBzaXplIG9mIHRoZSBzdGFjayB0byBiZSBhbGxvY2F0ZWQgb24gdGhlCisgKiBzZWN1cmUgc2lkZSBmb3IgdGhlIGNhbGxpbmcgdGFzay4KKyAqLwordm9pZCB2UG9ydEFsbG9jYXRlU2VjdXJlQ29udGV4dCggdWludDMyX3QgdWxTZWN1cmVTdGFja1NpemUgKSBfX2F0dHJpYnV0ZV9fICgoIG5ha2VkICkpOworCisvKioKKyAqIEBicmllZiBGcmVlIHRoZSB0YXNrJ3Mgc2VjdXJlIGNvbnRleHQuCisgKgorICogQHBhcmFtW2luXSBwdWxUQ0IgUG9pbnRlciB0byB0aGUgVGFzayBDb250cm9sIEJsb2NrIChUQ0IpIG9mIHRoZSB0YXNrLgorICovCit2b2lkIHZQb3J0RnJlZVNlY3VyZUNvbnRleHQoIHVpbnQzMl90ICpwdWxUQ0IgKSBfX2F0dHJpYnV0ZV9fICgoIG5ha2VkICkpIFBSSVZJTEVHRURfRlVOQ1RJT047CisKKyNlbmRpZiAvKiBfX1BPUlRfQVNNX0hfXyAqLwpkaWZmIC0tZ2l0IGEvU291cmNlL3BvcnRhYmxlL0lBUi9BUk1fQ00yMy9ub25fc2VjdXJlL3BvcnRhc20ucyBiL1NvdXJjZS9wb3J0YWJsZS9JQVIvQVJNX0NNMjMvbm9uX3NlY3VyZS9wb3J0YXNtLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFhNTQzYQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9wb3J0YWJsZS9JQVIvQVJNX0NNMjMvbm9uX3NlY3VyZS9wb3J0YXNtLnMKQEAgLTAsMCArMSwzNzcgQEAKKy8qCisgKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjIuMQorICogQ29weXJpZ2h0IChDKSAyMDE5IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKKyAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCisgKiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCisgKiB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZgorICogdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLAorICogc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCisgKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUworICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SCisgKiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIKKyAqIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIGh0dHA6Ly93d3cuRnJlZVJUT1Mub3JnCisgKiBodHRwOi8vYXdzLmFtYXpvbi5jb20vZnJlZXJ0b3MKKyAqCisgKiAxIHRhYiA9PSA0IHNwYWNlcyEKKyAqLworCisJRVhURVJOIHB4Q3VycmVudFRDQgorCUVYVEVSTiB4U2VjdXJlQ29udGV4dAorCUVYVEVSTiB2VGFza1N3aXRjaENvbnRleHQKKwlFWFRFUk4gdlBvcnRTVkNIYW5kbGVyX0MKKwlFWFRFUk4gU2VjdXJlQ29udGV4dF9TYXZlQ29udGV4dAorCUVYVEVSTiBTZWN1cmVDb250ZXh0X0xvYWRDb250ZXh0CisKKwlQVUJMSUMgeElzUHJpdmlsZWdlZAorCVBVQkxJQyB2UmVzZXRQcml2aWxlZ2UKKwlQVUJMSUMgdlBvcnRBbGxvY2F0ZVNlY3VyZUNvbnRleHQKKwlQVUJMSUMgdlJlc3RvcmVDb250ZXh0T2ZGaXJzdFRhc2sKKwlQVUJMSUMgdlJhaXNlUHJpdmlsZWdlCisJUFVCTElDIHZTdGFydEZpcnN0VGFzaworCVBVQkxJQyB1bFNldEludGVycnVwdE1hc2tGcm9tSVNSCisJUFVCTElDIHZDbGVhckludGVycnVwdE1hc2tGcm9tSVNSCisJUFVCTElDIFBlbmRTVl9IYW5kbGVyCisJUFVCTElDIFNWQ19IYW5kbGVyCisJUFVCTElDIHZQb3J0RnJlZVNlY3VyZUNvbnRleHQKKworI2lmICggY29uZmlnRU5BQkxFX0ZQVSA9PSAxICkKKwkjZXJyb3IgQ29ydGV4LU0yMyBkb2VzIG5vdCBoYXZlIGEgRmxvYXRpbmcgUG9pbnQgVW5pdCAoRlBVKSBhbmQgdGhlcmVmb3JlIGNvbmZpZ0VOQUJMRV9GUFUgbXVzdCBiZSBzZXQgdG8gMC4KKyNlbmRpZgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLSBVbnByaXZpbGVnZWQgRnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCVNFQ1RJT04gLnRleHQ6Q09ERTpOT1JPT1QoMikKKwlUSFVNQgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3hJc1ByaXZpbGVnZWQ6CisJbXJzIHIwLCBjb250cm9sCQkJCQkJCS8qIHIwID0gQ09OVFJPTC4gKi8KKwltb3ZzIHIxLCAjMQkJCQkJCQkJLyogcjEgPSAxLiAqLworCXRzdCByMCwgcjEJCQkJCQkJCS8qIFBlcmZvcm0gcjAgJiByMSAoYml0d2lzZSBBTkQpIGFuZCB1cGRhdGUgdGhlIGNvbmRpdGlvbnMgZmxhZy4gKi8KKwliZXEgcnVubmluZ19wcml2aWxlZ2VkCQkJCQkvKiBJZiB0aGUgcmVzdWx0IG9mIHByZXZpb3VzIEFORCBvcGVyYXRpb24gd2FzIDAsIGJyYW5jaC4gKi8KKwltb3ZzIHIwLCAjMAkJCQkJCQkJLyogQ09OVFJPTFswXSE9MC4gUmV0dXJuIGZhbHNlIHRvIGluZGljYXRlIHRoYXQgdGhlIHByb2Nlc3NvciBpcyBub3QgcHJpdmlsZWdlZC4gKi8KKwlieCBscgkJCQkJCQkJCS8qIFJldHVybi4gKi8KKwlydW5uaW5nX3ByaXZpbGVnZWQ6CisJCW1vdnMgcjAsICMxCQkJCQkJCS8qIENPTlRST0xbMF09PTAuIFJldHVybiB0cnVlIHRvIGluZGljYXRlIHRoYXQgdGhlIHByb2Nlc3NvciBpcyBwcml2aWxlZ2VkLiAqLworCQlieCBscgkJCQkJCQkJLyogUmV0dXJuLiAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZSZXNldFByaXZpbGVnZToKKwltcnMgcjAsIGNvbnRyb2wJCQkJCQkJLyogcjAgPSBDT05UUk9MLiAqLworCW1vdnMgcjEsICMxCQkJCQkJCQkvKiByMSA9IDEuICovCisJb3JycyByMCwgcjEJCQkJCQkJCS8qIHIwID0gcjAgfCByMS4gKi8KKwltc3IgY29udHJvbCwgcjAJCQkJCQkJLyogQ09OVFJPTCA9IHIwLiAqLworCWJ4IGxyCQkJCQkJCQkJLyogUmV0dXJuIHRvIHRoZSBjYWxsZXIuICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordlBvcnRBbGxvY2F0ZVNlY3VyZUNvbnRleHQ6CisJc3ZjIDAJCQkJCQkJCQkvKiBTZWN1cmUgY29udGV4dCBpcyBhbGxvY2F0ZWQgaW4gdGhlIHN1cGVydmlzb3IgY2FsbC4gcG9ydFNWQ19BTExPQ0FURV9TRUNVUkVfQ09OVEVYVCA9IDAuICovCisJYnggbHIJCQkJCQkJCQkvKiBSZXR1cm4uICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLSBQcml2aWxlZ2VkIEZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJU0VDVElPTiBwcml2aWxlZ2VkX2Z1bmN0aW9uczpDT0RFOk5PUk9PVCgyKQorCVRIVU1CCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordlJlc3RvcmVDb250ZXh0T2ZGaXJzdFRhc2s6CisJbGRyICByMiwgPXB4Q3VycmVudFRDQgkJCQkJLyogUmVhZCB0aGUgbG9jYXRpb24gb2YgcHhDdXJyZW50VENCIGkuZS4gJiggcHhDdXJyZW50VENCICkuICovCisJbGRyICByMywgW3IyXQkJCQkJCQkvKiBSZWFkIHB4Q3VycmVudFRDQi4gKi8KKwlsZHIgIHIwLCBbcjNdCQkJCQkJCS8qIFJlYWQgdG9wIG9mIHN0YWNrIGZyb20gVENCIC0gVGhlIGZpcnN0IGl0ZW0gaW4gcHhDdXJyZW50VENCIGlzIHRoZSB0YXNrIHRvcCBvZiBzdGFjay4gKi8KKworI2lmICggY29uZmlnRU5BQkxFX01QVSA9PSAxICkKKwlkbWIJCQkJCQkJCQkJLyogQ29tcGxldGUgb3V0c3RhbmRpbmcgdHJhbnNmZXJzIGJlZm9yZSBkaXNhYmxpbmcgTVBVLiAqLworCWxkciByMiwgPTB4ZTAwMGVkOTQJCQkJCQkvKiByMiA9IDB4ZTAwMGVkOTQgW0xvY2F0aW9uIG9mIE1QVV9DVFJMXS4gKi8KKwlsZHIgcjQsIFtyMl0JCQkJCQkJLyogUmVhZCB0aGUgdmFsdWUgb2YgTVBVX0NUUkwuICovCisJbW92cyByNSwgIzEJCQkJCQkJCS8qIHI1ID0gMS4gKi8KKwliaWNzIHI0LCByNQkJCQkJCQkJLyogcjQgPSByNCAmIH5yNSBpLmUuIENsZWFyIHRoZSBiaXQgMCBpbiByNC4gKi8KKwlzdHIgcjQsIFtyMl0JCQkJCQkJLyogRGlzYWJsZSBNUFUuICovCisKKwlhZGRzIHIzLCAjNAkJCQkJCQkJLyogcjMgPSByMyArIDQuIHIzIG5vdyBwb2ludHMgdG8gTUFJUjAgaW4gVENCLiAqLworCWxkciAgcjQsIFtyM10JCQkJCQkJLyogcjQgPSAqcjMgaS5lLiByNCA9IE1BSVIwLiAqLworCWxkciAgcjIsID0weGUwMDBlZGMwCQkJCQkvKiByMiA9IDB4ZTAwMGVkYzAgW0xvY2F0aW9uIG9mIE1BSVIwXS4gKi8KKwlzdHIgIHI0LCBbcjJdCQkJCQkJCS8qIFByb2dyYW0gTUFJUjAuICovCisJbGRyICByMiwgPTB4ZTAwMGVkOTgJCQkJCS8qIHIyID0gMHhlMDAwZWQ5OCBbTG9jYXRpb24gb2YgUk5SXS4gKi8KKwlhZGRzIHIzLCAjNAkJCQkJCQkJLyogcjMgPSByMyArIDQuIHIzIG5vdyBwb2ludHMgdG8gZmlyc3QgUkJBUiBpbiBUQ0IuICovCisJbW92cyByNSwgIzQJCQkJCQkJCS8qIHI1ID0gNC4gKi8KKwlzdHIgIHI1LCBbcjJdCQkJCQkJCS8qIFByb2dyYW0gUk5SID0gNC4gKi8KKwlsZG1pYSByMyEsIHtyNixyN30JCQkJCQkvKiBSZWFkIGZpcnN0IHNldCBvZiBSQkFSL1JMQVIgZnJvbSBUQ0IuICovCisJbGRyICByNCwgPTB4ZTAwMGVkOWMJCQkJCS8qIHI0ID0gMHhlMDAwZWQ5YyBbTG9jYXRpb24gb2YgUkJBUl0uICovCisJc3RtaWEgcjQhLCB7cjYscjd9CQkJCQkJLyogV3JpdGUgZmlyc3Qgc2V0IG9mIFJCQVIvUkxBUiByZWdpc3RlcnMuICovCisJbW92cyByNSwgIzUJCQkJCQkJCS8qIHI1ID0gNS4gKi8KKwlzdHIgIHI1LCBbcjJdCQkJCQkJCS8qIFByb2dyYW0gUk5SID0gNS4gKi8KKwlsZG1pYSByMyEsIHtyNixyN30JCQkJCQkvKiBSZWFkIHNlY29uZCBzZXQgb2YgUkJBUi9STEFSIGZyb20gVENCLiAqLworCWxkciAgcjQsID0weGUwMDBlZDljCQkJCQkvKiByNCA9IDB4ZTAwMGVkOWMgW0xvY2F0aW9uIG9mIFJCQVJdLiAqLworCXN0bWlhIHI0ISwge3I2LHI3fQkJCQkJCS8qIFdyaXRlIHNlY29uZCBzZXQgb2YgUkJBUi9STEFSIHJlZ2lzdGVycy4gKi8KKwltb3ZzIHI1LCAjNgkJCQkJCQkJLyogcjUgPSA2LiAqLworCXN0ciAgcjUsIFtyMl0JCQkJCQkJLyogUHJvZ3JhbSBSTlIgPSA2LiAqLworCWxkbWlhIHIzISwge3I2LHI3fQkJCQkJCS8qIFJlYWQgdGhpcmQgc2V0IG9mIFJCQVIvUkxBUiBmcm9tIFRDQi4gKi8KKwlsZHIgIHI0LCA9MHhlMDAwZWQ5YwkJCQkJLyogcjQgPSAweGUwMDBlZDljIFtMb2NhdGlvbiBvZiBSQkFSXS4gKi8KKwlzdG1pYSByNCEsIHtyNixyN30JCQkJCQkvKiBXcml0ZSB0aGlyZCBzZXQgb2YgUkJBUi9STEFSIHJlZ2lzdGVycy4gKi8KKwltb3ZzIHI1LCAjNwkJCQkJCQkJLyogcjUgPSA3LiAqLworCXN0ciAgcjUsIFtyMl0JCQkJCQkJLyogUHJvZ3JhbSBSTlIgPSA3LiAqLworCWxkbWlhIHIzISwge3I2LHI3fQkJCQkJCS8qIFJlYWQgZm91cnRoIHNldCBvZiBSQkFSL1JMQVIgZnJvbSBUQ0IuICovCisJbGRyICByNCwgPTB4ZTAwMGVkOWMJCQkJCS8qIHI0ID0gMHhlMDAwZWQ5YyBbTG9jYXRpb24gb2YgUkJBUl0uICovCisJc3RtaWEgcjQhLCB7cjYscjd9CQkJCQkJLyogV3JpdGUgZm91cnRoIHNldCBvZiBSQkFSL1JMQVIgcmVnaXN0ZXJzLiAqLworCisJbGRyIHIyLCA9MHhlMDAwZWQ5NAkJCQkJCS8qIHIyID0gMHhlMDAwZWQ5NCBbTG9jYXRpb24gb2YgTVBVX0NUUkxdLiAqLworCWxkciByNCwgW3IyXQkJCQkJCQkvKiBSZWFkIHRoZSB2YWx1ZSBvZiBNUFVfQ1RSTC4gKi8KKwltb3ZzIHI1LCAjMQkJCQkJCQkJLyogcjUgPSAxLiAqLworCW9ycnMgcjQsIHI1CQkJCQkJCQkvKiByNCA9IHI0IHwgcjUgaS5lLiBTZXQgdGhlIGJpdCAwIGluIHI0LiAqLworCXN0ciByNCwgW3IyXQkJCQkJCQkvKiBFbmFibGUgTVBVLiAqLworCWRzYgkJCQkJCQkJCQkvKiBGb3JjZSBtZW1vcnkgd3JpdGVzIGJlZm9yZSBjb250aW51aW5nLiAqLworI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9NUFUgKi8KKworI2lmICggY29uZmlnRU5BQkxFX01QVSA9PSAxICkKKwlsZG0gIHIwISwge3IxLXI0fQkJCQkJCS8qIFJlYWQgZnJvbSBzdGFjayAtIHIxID0geFNlY3VyZUNvbnRleHQsIHIyID0gUFNQTElNLCByMyA9IENPTlRST0wgYW5kIHI0ID0gRVhDX1JFVFVSTi4gKi8KKwlsZHIgIHI1LCA9eFNlY3VyZUNvbnRleHQKKwlzdHIgIHIxLCBbcjVdCQkJCQkJCS8qIFNldCB4U2VjdXJlQ29udGV4dCB0byB0aGlzIHRhc2sncyB2YWx1ZSBmb3IgdGhlIHNhbWUuICovCisJbXNyICBwc3BsaW0sIHIyCQkJCQkJCS8qIFNldCB0aGlzIHRhc2sncyBQU1BMSU0gdmFsdWUuICovCisJbXNyICBjb250cm9sLCByMwkJCQkJCS8qIFNldCB0aGlzIHRhc2sncyBDT05UUk9MIHZhbHVlLiAqLworCWFkZHMgcjAsICMzMgkJCQkJCQkvKiBEaXNjYXJkIGV2ZXJ5dGhpbmcgdXAgdG8gcjAuICovCisJbXNyICBwc3AsIHIwCQkJCQkJCS8qIFRoaXMgaXMgbm93IHRoZSBuZXcgdG9wIG9mIHN0YWNrIHRvIHVzZSBpbiB0aGUgdGFzay4gKi8KKwlpc2IKKwlieCAgIHI0CQkJCQkJCQkJLyogRmluYWxseSwgYnJhbmNoIHRvIEVYQ19SRVRVUk4uICovCisjZWxzZSAvKiBjb25maWdFTkFCTEVfTVBVICovCisJbGRtICByMCEsIHtyMS1yM30JCQkJCQkvKiBSZWFkIGZyb20gc3RhY2sgLSByMSA9IHhTZWN1cmVDb250ZXh0LCByMiA9IFBTUExJTSBhbmQgcjMgPSBFWENfUkVUVVJOLiAqLworCWxkciAgcjQsID14U2VjdXJlQ29udGV4dAorCXN0ciAgcjEsIFtyNF0JCQkJCQkJLyogU2V0IHhTZWN1cmVDb250ZXh0IHRvIHRoaXMgdGFzaydzIHZhbHVlIGZvciB0aGUgc2FtZS4gKi8KKwltc3IgIHBzcGxpbSwgcjIJCQkJCQkJLyogU2V0IHRoaXMgdGFzaydzIFBTUExJTSB2YWx1ZS4gKi8KKwltb3ZzIHIxLCAjMgkJCQkJCQkJLyogcjEgPSAyLiAqLworCW1zciAgQ09OVFJPTCwgcjEJCQkJCQkvKiBTd2l0Y2ggdG8gdXNlIFBTUCBpbiB0aGUgdGhyZWFkIG1vZGUuICovCisJYWRkcyByMCwgIzMyCQkJCQkJCS8qIERpc2NhcmQgZXZlcnl0aGluZyB1cCB0byByMC4gKi8KKwltc3IgIHBzcCwgcjAJCQkJCQkJLyogVGhpcyBpcyBub3cgdGhlIG5ldyB0b3Agb2Ygc3RhY2sgdG8gdXNlIGluIHRoZSB0YXNrLiAqLworCWlzYgorCWJ4ICAgcjMJCQkJCQkJCQkvKiBGaW5hbGx5LCBicmFuY2ggdG8gRVhDX1JFVFVSTi4gKi8KKyNlbmRpZiAvKiBjb25maWdFTkFCTEVfTVBVICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordlJhaXNlUHJpdmlsZWdlOgorCW1ycyByMCwgY29udHJvbAkJCQkJCQkvKiBSZWFkIHRoZSBDT05UUk9MIHJlZ2lzdGVyLiAqLworCW1vdnMgcjEsICMxCQkJCQkJCQkvKiByMSA9IDEuICovCisJYmljcyByMCwgcjEJCQkJCQkJCS8qIENsZWFyIHRoZSBiaXQgMC4gKi8KKwltc3IgY29udHJvbCwgcjAJCQkJCQkJLyogV3JpdGUgYmFjayB0aGUgbmV3IENPTlRST0wgdmFsdWUuICovCisJYnggbHIJCQkJCQkJCQkvKiBSZXR1cm4gdG8gdGhlIGNhbGxlci4gKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2U3RhcnRGaXJzdFRhc2s6CisJbGRyIHIwLCA9MHhlMDAwZWQwOAkJCQkJCS8qIFVzZSB0aGUgTlZJQyBvZmZzZXQgcmVnaXN0ZXIgdG8gbG9jYXRlIHRoZSBzdGFjay4gKi8KKwlsZHIgcjAsIFtyMF0JCQkJCQkJLyogUmVhZCB0aGUgVlRPUiByZWdpc3RlciB3aGljaCBnaXZlcyB0aGUgYWRkcmVzcyBvZiB2ZWN0b3IgdGFibGUuICovCisJbGRyIHIwLCBbcjBdCQkJCQkJCS8qIFRoZSBmaXJzdCBlbnRyeSBpbiB2ZWN0b3IgdGFibGUgaXMgc3RhY2sgcG9pbnRlci4gKi8KKwltc3IgbXNwLCByMAkJCQkJCQkJLyogU2V0IHRoZSBNU1AgYmFjayB0byB0aGUgc3RhcnQgb2YgdGhlIHN0YWNrLiAqLworCWNwc2llIGkJCQkJCQkJCQkvKiBHbG9iYWxseSBlbmFibGUgaW50ZXJydXB0cy4gKi8KKwlkc2IKKwlpc2IKKwlzdmMgMgkJCQkJCQkJCS8qIFN5c3RlbSBjYWxsIHRvIHN0YXJ0IHRoZSBmaXJzdCB0YXNrLiBwb3J0U1ZDX1NUQVJUX1NDSEVEVUxFUiA9IDIuICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordWxTZXRJbnRlcnJ1cHRNYXNrRnJvbUlTUjoKKwltcnMgcjAsIFBSSU1BU0sKKwljcHNpZCBpCisJYnggbHIKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2Q2xlYXJJbnRlcnJ1cHRNYXNrRnJvbUlTUjoKKwltc3IgUFJJTUFTSywgcjAKKwlieCBscgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK1BlbmRTVl9IYW5kbGVyOgorCW1ycyByMSwgcHNwCQkJCQkJCQkvKiBSZWFkIFBTUCBpbiByMS4gKi8KKwlsZHIgcjIsID14U2VjdXJlQ29udGV4dAkJCQkJLyogUmVhZCB0aGUgbG9jYXRpb24gb2YgeFNlY3VyZUNvbnRleHQgaS5lLiAmKCB4U2VjdXJlQ29udGV4dCApLiAqLworCWxkciByMCwgW3IyXQkJCQkJCQkvKiBSZWFkIHhTZWN1cmVDb250ZXh0IC0gVmFsdWUgb2YgeFNlY3VyZUNvbnRleHQgbXVzdCBiZSBpbiByMCBhcyBpdCBpcyB1c2VkIGFzIGEgcGFyYW1ldGVyIGxhdGVyLiAqLworCisJY2J6IHIwLCBzYXZlX25zX2NvbnRleHQJCQkJCS8qIE5vIHNlY3VyZSBjb250ZXh0IHRvIHNhdmUuICovCisJcHVzaCB7cjAtcjIsIHIxNH0KKwlibCBTZWN1cmVDb250ZXh0X1NhdmVDb250ZXh0CisJcG9wIHtyMC1yM30JCQkJCQkJCS8qIExSIGlzIG5vdyBpbiByMy4gKi8KKwltb3YgbHIsIHIzCQkJCQkJCQkvKiBMUiA9IHIzLiAqLworCWxzbHMgcjIsIHIzLCAjMjUJCQkJCQkvKiByMiA9IHIzIDw8IDI1LiBCaXRbNl0gb2YgRVhDX1JFVFVSTiBpcyAxIGlmIHNlY3VyZSBzdGFjayB3YXMgdXNlZCwgMCBpZiBub24tc2VjdXJlIHN0YWNrIHdhcyB1c2VkIHRvIHN0b3JlIHN0YWNrIGZyYW1lLiAqLworCWJwbCBzYXZlX25zX2NvbnRleHQJCQkJCQkvKiBicGwgLSBicmFuY2ggaWYgcG9zaXRpdmUgb3IgemVyby4gSWYgcjIgPj0gMCA9PT4gQml0WzZdIGluIEVYQ19SRVRVUk4gaXMgMCBpLmUuIG5vbi1zZWN1cmUgc3RhY2sgd2FzIHVzZWQuICovCisJbGRyIHIzLCA9cHhDdXJyZW50VENCCQkJCQkvKiBSZWFkIHRoZSBsb2NhdGlvbiBvZiBweEN1cnJlbnRUQ0IgaS5lLiAmKCBweEN1cnJlbnRUQ0IgKS4gKi8KKwlsZHIgcjIsIFtyM10JCQkJCQkJLyogUmVhZCBweEN1cnJlbnRUQ0IuICovCisjaWYgKCBjb25maWdFTkFCTEVfTVBVID09IDEgKQorCXN1YnMgcjEsIHIxLCAjMTYJCQkJCQkvKiBNYWtlIHNwYWNlIGZvciB4U2VjdXJlQ29udGV4dCwgUFNQTElNLCBDT05UUk9MIGFuZCBMUiBvbiB0aGUgc3RhY2suICovCisJc3RyIHIxLCBbcjJdCQkJCQkJCS8qIFNhdmUgdGhlIG5ldyB0b3Agb2Ygc3RhY2sgaW4gVENCLiAqLworCW1ycyByMiwgcHNwbGltCQkJCQkJCS8qIHIyID0gUFNQTElNLiAqLworCW1ycyByMywgY29udHJvbAkJCQkJCQkvKiByMyA9IENPTlRST0wuICovCisJbW92IHI0LCBscgkJCQkJCQkJLyogcjQgPSBMUi9FWENfUkVUVVJOLiAqLworCXN0bWlhIHIxISwge3IwLCByMi1yNH0JCQkJCS8qIFN0b3JlIHhTZWN1cmVDb250ZXh0LCBQU1BMSU0sIENPTlRST0wgYW5kIExSIG9uIHRoZSBzdGFjay4gKi8KKyNlbHNlIC8qIGNvbmZpZ0VOQUJMRV9NUFUgKi8KKwlzdWJzIHIxLCByMSwgIzEyCQkJCQkJLyogTWFrZSBzcGFjZSBmb3IgeFNlY3VyZUNvbnRleHQsIFBTUExJTSBhbmQgTFIgb24gdGhlIHN0YWNrLiAqLworCXN0ciByMSwgW3IyXQkJCQkJCQkvKiBTYXZlIHRoZSBuZXcgdG9wIG9mIHN0YWNrIGluIFRDQi4gKi8KKwltcnMgcjIsIHBzcGxpbQkJCQkJCQkvKiByMiA9IFBTUExJTS4gKi8KKwltb3YgcjMsIGxyCQkJCQkJCQkvKiByMyA9IExSL0VYQ19SRVRVUk4uICovCisJc3RtaWEgcjEhLCB7cjAsIHIyLXIzfQkJCQkJLyogU3RvcmUgeFNlY3VyZUNvbnRleHQsIFBTUExJTSBhbmQgTFIgb24gdGhlIHN0YWNrLiAqLworI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9NUFUgKi8KKwliIHNlbGVjdF9uZXh0X3Rhc2sKKworCXNhdmVfbnNfY29udGV4dDoKKwkJbGRyIHIzLCA9cHhDdXJyZW50VENCCQkJCS8qIFJlYWQgdGhlIGxvY2F0aW9uIG9mIHB4Q3VycmVudFRDQiBpLmUuICYoIHB4Q3VycmVudFRDQiApLiAqLworCQlsZHIgcjIsIFtyM10JCQkJCQkvKiBSZWFkIHB4Q3VycmVudFRDQi4gKi8KKwkjaWYgKCBjb25maWdFTkFCTEVfTVBVID09IDEgKQorCQlzdWJzIHIxLCByMSwgIzQ4CQkJCQkvKiBNYWtlIHNwYWNlIGZvciB4U2VjdXJlQ29udGV4dCwgUFNQTElNLCBDT05UUk9MLCBMUiBhbmQgdGhlIHJlbWFpbmluZyByZWdpc3RlcnMgb24gdGhlIHN0YWNrLiAqLworCQlzdHIgcjEsIFtyMl0JCQkJCQkvKiBTYXZlIHRoZSBuZXcgdG9wIG9mIHN0YWNrIGluIFRDQi4gKi8KKwkJYWRkcyByMSwgcjEsICMxNgkJCQkJLyogcjEgPSByMSArIDE2LiAqLworCQlzdG1pYSByMSEsIHtyNC1yN30JCQkJCS8qIFN0b3JlIHRoZSBsb3cgcmVnaXN0ZXJzIHRoYXQgYXJlIG5vdCBzYXZlZCBhdXRvbWF0aWNhbGx5LiAqLworCQltb3YgcjQsIHI4CQkJCQkJCS8qIHI0ID0gcjguICovCisJCW1vdiByNSwgcjkJCQkJCQkJLyogcjUgPSByOS4gKi8KKwkJbW92IHI2LCByMTAJCQkJCQkJLyogcjYgPSByMTAuICovCisJCW1vdiByNywgcjExCQkJCQkJCS8qIHI3ID0gcjExLiAqLworCQlzdG1pYSByMSEsIHtyNC1yN30JCQkJCS8qIFN0b3JlIHRoZSBoaWdoIHJlZ2lzdGVycyB0aGF0IGFyZSBub3Qgc2F2ZWQgYXV0b21hdGljYWxseS4gKi8KKwkJbXJzIHIyLCBwc3BsaW0JCQkJCQkvKiByMiA9IFBTUExJTS4gKi8KKwkJbXJzIHIzLCBjb250cm9sCQkJCQkJLyogcjMgPSBDT05UUk9MLiAqLworCQltb3YgcjQsIGxyCQkJCQkJCS8qIHI0ID0gTFIvRVhDX1JFVFVSTi4gKi8KKwkJc3VicyByMSwgcjEsICM0OAkJCQkJLyogcjEgPSByMSAtIDQ4LiAqLworCQlzdG1pYSByMSEsIHtyMCwgcjItcjR9CQkJCS8qIFN0b3JlIHhTZWN1cmVDb250ZXh0LCBQU1BMSU0sIENPTlRST0wgYW5kIExSIG9uIHRoZSBzdGFjay4gKi8KKwkjZWxzZSAvKiBjb25maWdFTkFCTEVfTVBVICovCisJCXN1YnMgcjEsIHIxLCAjNDQJCQkJCS8qIE1ha2Ugc3BhY2UgZm9yIHhTZWN1cmVDb250ZXh0LCBQU1BMSU0sIExSIGFuZCB0aGUgcmVtYWluaW5nIHJlZ2lzdGVycyBvbiB0aGUgc3RhY2suICovCisJCXN0ciByMSwgW3IyXQkJCQkJCS8qIFNhdmUgdGhlIG5ldyB0b3Agb2Ygc3RhY2sgaW4gVENCLiAqLworCQltcnMgcjIsIHBzcGxpbQkJCQkJCS8qIHIyID0gUFNQTElNLiAqLworCQltb3YgcjMsIGxyCQkJCQkJCS8qIHIzID0gTFIvRVhDX1JFVFVSTi4gKi8KKwkJc3RtaWEgcjEhLCB7cjAsIHIyLXI3fQkJCQkvKiBTdG9yZSB4U2VjdXJlQ29udGV4dCwgUFNQTElNLCBMUiBhbmQgdGhlIGxvdyByZWdpc3RlcnMgdGhhdCBhcmUgbm90IHNhdmVkIGF1dG9tYXRpY2FsbHkuICovCisJCW1vdiByNCwgcjgJCQkJCQkJLyogcjQgPSByOC4gKi8KKwkJbW92IHI1LCByOQkJCQkJCQkvKiByNSA9IHI5LiAqLworCQltb3YgcjYsIHIxMAkJCQkJCQkvKiByNiA9IHIxMC4gKi8KKwkJbW92IHI3LCByMTEJCQkJCQkJLyogcjcgPSByMTEuICovCisJCXN0bWlhIHIxISwge3I0LXI3fQkJCQkJLyogU3RvcmUgdGhlIGhpZ2ggcmVnaXN0ZXJzIHRoYXQgYXJlIG5vdCBzYXZlZCBhdXRvbWF0aWNhbGx5LiAqLworCSNlbmRpZiAvKiBjb25maWdFTkFCTEVfTVBVICovCisKKwlzZWxlY3RfbmV4dF90YXNrOgorCQljcHNpZCBpCisJCWJsIHZUYXNrU3dpdGNoQ29udGV4dAorCQljcHNpZSBpCisKKwkJbGRyIHIyLCA9cHhDdXJyZW50VENCCQkJCS8qIFJlYWQgdGhlIGxvY2F0aW9uIG9mIHB4Q3VycmVudFRDQiBpLmUuICYoIHB4Q3VycmVudFRDQiApLiAqLworCQlsZHIgcjMsIFtyMl0JCQkJCQkvKiBSZWFkIHB4Q3VycmVudFRDQi4gKi8KKwkJbGRyIHIxLCBbcjNdCQkJCQkJLyogVGhlIGZpcnN0IGl0ZW0gaW4gcHhDdXJyZW50VENCIGlzIHRoZSB0YXNrIHRvcCBvZiBzdGFjay4gcjEgbm93IHBvaW50cyB0byB0aGUgdG9wIG9mIHN0YWNrLiAqLworCisJI2lmICggY29uZmlnRU5BQkxFX01QVSA9PSAxICkKKwkJZG1iCQkJCQkJCQkJLyogQ29tcGxldGUgb3V0c3RhbmRpbmcgdHJhbnNmZXJzIGJlZm9yZSBkaXNhYmxpbmcgTVBVLiAqLworCQlsZHIgcjIsID0weGUwMDBlZDk0CQkJCQkvKiByMiA9IDB4ZTAwMGVkOTQgW0xvY2F0aW9uIG9mIE1QVV9DVFJMXS4gKi8KKwkJbGRyIHI0LCBbcjJdCQkJCQkJLyogUmVhZCB0aGUgdmFsdWUgb2YgTVBVX0NUUkwuICovCisJCW1vdnMgcjUsICMxCQkJCQkJCS8qIHI1ID0gMS4gKi8KKwkJYmljcyByNCwgcjUJCQkJCQkJLyogcjQgPSByNCAmIH5yNSBpLmUuIENsZWFyIHRoZSBiaXQgMCBpbiByNC4gKi8KKwkJc3RyIHI0LCBbcjJdCQkJCQkJLyogRGlzYWJsZSBNUFUuICovCisKKwkJYWRkcyByMywgIzQJCQkJCQkJLyogcjMgPSByMyArIDQuIHIzIG5vdyBwb2ludHMgdG8gTUFJUjAgaW4gVENCLiAqLworCQlsZHIgcjQsIFtyM10JCQkJCQkvKiByNCA9ICpyMyBpLmUuIHI0ID0gTUFJUjAuICovCisJCWxkciByMiwgPTB4ZTAwMGVkYzAJCQkJCS8qIHIyID0gMHhlMDAwZWRjMCBbTG9jYXRpb24gb2YgTUFJUjBdLiAqLworCQlzdHIgcjQsIFtyMl0JCQkJCQkvKiBQcm9ncmFtIE1BSVIwLiAqLworCQlsZHIgcjIsID0weGUwMDBlZDk4CQkJCQkvKiByMiA9IDB4ZTAwMGVkOTggW0xvY2F0aW9uIG9mIFJOUl0uICovCisJCWFkZHMgcjMsICM0CQkJCQkJCS8qIHIzID0gcjMgKyA0LiByMyBub3cgcG9pbnRzIHRvIGZpcnN0IFJCQVIgaW4gVENCLiAqLworCQltb3ZzIHI1LCAjNAkJCQkJCQkvKiByNSA9IDQuICovCisJCXN0ciAgcjUsIFtyMl0JCQkJCQkvKiBQcm9ncmFtIFJOUiA9IDQuICovCisJCWxkbWlhIHIzISwge3I2LHI3fQkJCQkJLyogUmVhZCBmaXJzdCBzZXQgb2YgUkJBUi9STEFSIGZyb20gVENCLiAqLworCQlsZHIgIHI0LCA9MHhlMDAwZWQ5YwkJCQkvKiByNCA9IDB4ZTAwMGVkOWMgW0xvY2F0aW9uIG9mIFJCQVJdLiAqLworCQlzdG1pYSByNCEsIHtyNixyN30JCQkJCS8qIFdyaXRlIGZpcnN0IHNldCBvZiBSQkFSL1JMQVIgcmVnaXN0ZXJzLiAqLworCQltb3ZzIHI1LCAjNQkJCQkJCQkvKiByNSA9IDUuICovCisJCXN0ciAgcjUsIFtyMl0JCQkJCQkvKiBQcm9ncmFtIFJOUiA9IDUuICovCisJCWxkbWlhIHIzISwge3I2LHI3fQkJCQkJLyogUmVhZCBzZWNvbmQgc2V0IG9mIFJCQVIvUkxBUiBmcm9tIFRDQi4gKi8KKwkJbGRyICByNCwgPTB4ZTAwMGVkOWMJCQkJLyogcjQgPSAweGUwMDBlZDljIFtMb2NhdGlvbiBvZiBSQkFSXS4gKi8KKwkJc3RtaWEgcjQhLCB7cjYscjd9CQkJCQkvKiBXcml0ZSBzZWNvbmQgc2V0IG9mIFJCQVIvUkxBUiByZWdpc3RlcnMuICovCisJCW1vdnMgcjUsICM2CQkJCQkJCS8qIHI1ID0gNi4gKi8KKwkJc3RyICByNSwgW3IyXQkJCQkJCS8qIFByb2dyYW0gUk5SID0gNi4gKi8KKwkJbGRtaWEgcjMhLCB7cjYscjd9CQkJCQkvKiBSZWFkIHRoaXJkIHNldCBvZiBSQkFSL1JMQVIgZnJvbSBUQ0IuICovCisJCWxkciAgcjQsID0weGUwMDBlZDljCQkJCS8qIHI0ID0gMHhlMDAwZWQ5YyBbTG9jYXRpb24gb2YgUkJBUl0uICovCisJCXN0bWlhIHI0ISwge3I2LHI3fQkJCQkJLyogV3JpdGUgdGhpcmQgc2V0IG9mIFJCQVIvUkxBUiByZWdpc3RlcnMuICovCisJCW1vdnMgcjUsICM3CQkJCQkJCS8qIHI1ID0gNy4gKi8KKwkJc3RyICByNSwgW3IyXQkJCQkJCS8qIFByb2dyYW0gUk5SID0gNy4gKi8KKwkJbGRtaWEgcjMhLCB7cjYscjd9CQkJCQkvKiBSZWFkIGZvdXJ0aCBzZXQgb2YgUkJBUi9STEFSIGZyb20gVENCLiAqLworCQlsZHIgIHI0LCA9MHhlMDAwZWQ5YwkJCQkvKiByNCA9IDB4ZTAwMGVkOWMgW0xvY2F0aW9uIG9mIFJCQVJdLiAqLworCQlzdG1pYSByNCEsIHtyNixyN30JCQkJCS8qIFdyaXRlIGZvdXJ0aCBzZXQgb2YgUkJBUi9STEFSIHJlZ2lzdGVycy4gKi8KKworCQlsZHIgcjIsID0weGUwMDBlZDk0CQkJCQkvKiByMiA9IDB4ZTAwMGVkOTQgW0xvY2F0aW9uIG9mIE1QVV9DVFJMXS4gKi8KKwkJbGRyIHI0LCBbcjJdCQkJCQkJLyogUmVhZCB0aGUgdmFsdWUgb2YgTVBVX0NUUkwuICovCisJCW1vdnMgcjUsICMxCQkJCQkJCS8qIHI1ID0gMS4gKi8KKwkJb3JycyByNCwgcjUJCQkJCQkJLyogcjQgPSByNCB8IHI1IGkuZS4gU2V0IHRoZSBiaXQgMCBpbiByNC4gKi8KKwkJc3RyIHI0LCBbcjJdCQkJCQkJLyogRW5hYmxlIE1QVS4gKi8KKwkJZHNiCQkJCQkJCQkJLyogRm9yY2UgbWVtb3J5IHdyaXRlcyBiZWZvcmUgY29udGludWluZy4gKi8KKwkjZW5kaWYgLyogY29uZmlnRU5BQkxFX01QVSAqLworCisJI2lmICggY29uZmlnRU5BQkxFX01QVSA9PSAxICkKKwkJbGRtaWEgcjEhLCB7cjAsIHIyLXI0fQkJCQkvKiBSZWFkIGZyb20gc3RhY2sgLSByMCA9IHhTZWN1cmVDb250ZXh0LCByMiA9IFBTUExJTSwgcjMgPSBDT05UUk9MIGFuZCByNCA9IExSLiAqLworCQltc3IgcHNwbGltLCByMgkJCQkJCS8qIFJlc3RvcmUgdGhlIFBTUExJTSByZWdpc3RlciB2YWx1ZSBmb3IgdGhlIHRhc2suICovCisJCW1zciBjb250cm9sLCByMwkJCQkJCS8qIFJlc3RvcmUgdGhlIENPTlRST0wgcmVnaXN0ZXIgdmFsdWUgZm9yIHRoZSB0YXNrLiAqLworCQltb3YgbHIsIHI0CQkJCQkJCS8qIExSID0gcjQuICovCisJCWxkciByMiwgPXhTZWN1cmVDb250ZXh0CQkJCS8qIFJlYWQgdGhlIGxvY2F0aW9uIG9mIHhTZWN1cmVDb250ZXh0IGkuZS4gJiggeFNlY3VyZUNvbnRleHQgKS4gKi8KKwkJc3RyIHIwLCBbcjJdCQkJCQkJLyogUmVzdG9yZSB0aGUgdGFzaydzIHhTZWN1cmVDb250ZXh0LiAqLworCQljYnogcjAsIHJlc3RvcmVfbnNfY29udGV4dAkJCS8qIElmIHRoZXJlIGlzIG5vIHNlY3VyZSBjb250ZXh0IGZvciB0aGUgdGFzaywgcmVzdG9yZSB0aGUgbm9uLXNlY3VyZSBjb250ZXh0LiAqLworCQlwdXNoIHtyMSxyNH0KKwkJYmwgU2VjdXJlQ29udGV4dF9Mb2FkQ29udGV4dAkJLyogUmVzdG9yZSB0aGUgc2VjdXJlIGNvbnRleHQuICovCisJCXBvcCB7cjEscjR9CisJCW1vdiBsciwgcjQJCQkJCQkJLyogTFIgPSByNC4gKi8KKwkJbHNscyByMiwgcjQsICMyNQkJCQkJLyogcjIgPSByNCA8PCAyNS4gQml0WzZdIG9mIEVYQ19SRVRVUk4gaXMgMSBpZiBzZWN1cmUgc3RhY2sgd2FzIHVzZWQsIDAgaWYgbm9uLXNlY3VyZSBzdGFjayB3YXMgdXNlZCB0byBzdG9yZSBzdGFjayBmcmFtZS4gKi8KKwkJYnBsIHJlc3RvcmVfbnNfY29udGV4dAkJCQkvKiBicGwgLSBicmFuY2ggaWYgcG9zaXRpdmUgb3IgemVyby4gSWYgcjIgPj0gMCA9PT4gQml0WzZdIGluIEVYQ19SRVRVUk4gaXMgMCBpLmUuIG5vbi1zZWN1cmUgc3RhY2sgd2FzIHVzZWQuICovCisJCW1zciBwc3AsIHIxCQkJCQkJCS8qIFJlbWVtYmVyIHRoZSBuZXcgdG9wIG9mIHN0YWNrIGZvciB0aGUgdGFzay4gKi8KKwkJYnggbHIKKwkjZWxzZSAvKiBjb25maWdFTkFCTEVfTVBVICovCisJCWxkbWlhIHIxISwge3IwLCByMi1yM30JCQkJLyogUmVhZCBmcm9tIHN0YWNrIC0gcjAgPSB4U2VjdXJlQ29udGV4dCwgcjIgPSBQU1BMSU0gYW5kIHIzID0gTFIuICovCisJCW1zciBwc3BsaW0sIHIyCQkJCQkJLyogUmVzdG9yZSB0aGUgUFNQTElNIHJlZ2lzdGVyIHZhbHVlIGZvciB0aGUgdGFzay4gKi8KKwkJbW92IGxyLCByMwkJCQkJCQkvKiBMUiA9IHIzLiAqLworCQlsZHIgcjIsID14U2VjdXJlQ29udGV4dAkJCQkvKiBSZWFkIHRoZSBsb2NhdGlvbiBvZiB4U2VjdXJlQ29udGV4dCBpLmUuICYoIHhTZWN1cmVDb250ZXh0ICkuICovCisJCXN0ciByMCwgW3IyXQkJCQkJCS8qIFJlc3RvcmUgdGhlIHRhc2sncyB4U2VjdXJlQ29udGV4dC4gKi8KKwkJY2J6IHIwLCByZXN0b3JlX25zX2NvbnRleHQJCQkvKiBJZiB0aGVyZSBpcyBubyBzZWN1cmUgY29udGV4dCBmb3IgdGhlIHRhc2ssIHJlc3RvcmUgdGhlIG5vbi1zZWN1cmUgY29udGV4dC4gKi8KKwkJcHVzaCB7cjEscjN9CisJCWJsIFNlY3VyZUNvbnRleHRfTG9hZENvbnRleHQJCS8qIFJlc3RvcmUgdGhlIHNlY3VyZSBjb250ZXh0LiAqLworCQlwb3Age3IxLHIzfQorCQltb3YgbHIsIHIzCQkJCQkJCS8qIExSID0gcjMuICovCisJCWxzbHMgcjIsIHIzLCAjMjUJCQkJCS8qIHIyID0gcjMgPDwgMjUuIEJpdFs2XSBvZiBFWENfUkVUVVJOIGlzIDEgaWYgc2VjdXJlIHN0YWNrIHdhcyB1c2VkLCAwIGlmIG5vbi1zZWN1cmUgc3RhY2sgd2FzIHVzZWQgdG8gc3RvcmUgc3RhY2sgZnJhbWUuICovCisJCWJwbCByZXN0b3JlX25zX2NvbnRleHQJCQkJLyogYnBsIC0gYnJhbmNoIGlmIHBvc2l0aXZlIG9yIHplcm8uIElmIHIyID49IDAgPT0+IEJpdFs2XSBpbiBFWENfUkVUVVJOIGlzIDAgaS5lLiBub24tc2VjdXJlIHN0YWNrIHdhcyB1c2VkLiAqLworCQltc3IgcHNwLCByMQkJCQkJCQkvKiBSZW1lbWJlciB0aGUgbmV3IHRvcCBvZiBzdGFjayBmb3IgdGhlIHRhc2suICovCisJCWJ4IGxyCisJI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9NUFUgKi8KKworCXJlc3RvcmVfbnNfY29udGV4dDoKKwkJYWRkcyByMSwgcjEsICMxNgkJCQkJLyogTW92ZSB0byB0aGUgaGlnaCByZWdpc3RlcnMuICovCisJCWxkbWlhIHIxISwge3I0LXI3fQkJCQkJLyogUmVzdG9yZSB0aGUgaGlnaCByZWdpc3RlcnMgdGhhdCBhcmUgbm90IGF1dG9tYXRpY2FsbHkgcmVzdG9yZWQuICovCisJCW1vdiByOCwgcjQJCQkJCQkJLyogcjggPSByNC4gKi8KKwkJbW92IHI5LCByNQkJCQkJCQkvKiByOSA9IHI1LiAqLworCQltb3YgcjEwLCByNgkJCQkJCQkvKiByMTAgPSByNi4gKi8KKwkJbW92IHIxMSwgcjcJCQkJCQkJLyogcjExID0gcjcuICovCisJCW1zciBwc3AsIHIxCQkJCQkJCS8qIFJlbWVtYmVyIHRoZSBuZXcgdG9wIG9mIHN0YWNrIGZvciB0aGUgdGFzay4gKi8KKwkJc3VicyByMSwgcjEsICMzMgkJCQkJLyogR28gYmFjayB0byB0aGUgbG93IHJlZ2lzdGVycy4gKi8KKwkJbGRtaWEgcjEhLCB7cjQtcjd9CQkJCQkvKiBSZXN0b3JlIHRoZSBsb3cgcmVnaXN0ZXJzIHRoYXQgYXJlIG5vdCBhdXRvbWF0aWNhbGx5IHJlc3RvcmVkLiAqLworCQlieCBscgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK1NWQ19IYW5kbGVyOgorCW1vdnMgcjAsICM0CisJbW92IHIxLCBscgorCXRzdCByMCwgcjEKKwliZXEgc3RhY2tpbmdfdXNlZF9tc3AKKwltcnMgcjAsIHBzcAorCWIgdlBvcnRTVkNIYW5kbGVyX0MKKwlzdGFja2luZ191c2VkX21zcDoKKwkJbXJzIHIwLCBtc3AKKwkJYiB2UG9ydFNWQ0hhbmRsZXJfQworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZQb3J0RnJlZVNlY3VyZUNvbnRleHQ6CisJbGRyIHIxLCBbcjBdCQkJCQkJCS8qIFRoZSBmaXJzdCBpdGVtIGluIHRoZSBUQ0IgaXMgdGhlIHRvcCBvZiB0aGUgc3RhY2suICovCisJbGRyIHIwLCBbcjFdCQkJCQkJCS8qIFRoZSBmaXJzdCBpdGVtIG9uIHRoZSBzdGFjayBpcyB0aGUgdGFzaydzIHhTZWN1cmVDb250ZXh0LiAqLworCWNtcCByMCwgIzAJCQkJCQkJCS8qIFJhaXNlIHN2YyBpZiB0YXNrJ3MgeFNlY3VyZUNvbnRleHQgaXMgbm90IE5VTEwuICovCisJYmVxIGZyZWVfc2VjdXJlX2NvbnRleHQKKwlieCBscgkJCQkJCQkJCS8qIFRoZXJlIGlzIG5vIHNlY3VyZSBjb250ZXh0ICh4U2VjdXJlQ29udGV4dCBpcyBOVUxMKS4gKi8KKwlmcmVlX3NlY3VyZV9jb250ZXh0OgorCQlzdmMgMQkJCQkJCQkJLyogU2VjdXJlIGNvbnRleHQgaXMgZnJlZWQgaW4gdGhlIHN1cGVydmlzb3IgY2FsbC4gcG9ydFNWQ19GUkVFX1NFQ1VSRV9DT05URVhUID0gMS4gKi8KKwkJYnggbHIJCQkJCQkJCS8qIFJldHVybi4gKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJRU5ECmRpZmYgLS1naXQgYS9Tb3VyY2UvcG9ydGFibGUvSUFSL0FSTV9DTTIzL25vbl9zZWN1cmUvcG9ydG1hY3JvLmggYi9Tb3VyY2UvcG9ydGFibGUvSUFSL0FSTV9DTTIzL25vbl9zZWN1cmUvcG9ydG1hY3JvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVhNTM0MAotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9wb3J0YWJsZS9JQVIvQVJNX0NNMjMvbm9uX3NlY3VyZS9wb3J0bWFjcm8uaApAQCAtMCwwICsxLDMwNiBAQAorLyoKKyAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMi4xCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgorICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KKyAqIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KKyAqIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mCisgKiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCisgKiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKKyAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTCisgKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IKKyAqIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUgorICogSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogaHR0cDovL3d3dy5GcmVlUlRPUy5vcmcKKyAqIGh0dHA6Ly9hd3MuYW1hem9uLmNvbS9mcmVlcnRvcworICoKKyAqIDEgdGFiID09IDQgc3BhY2VzIQorICovCisKKyNpZm5kZWYgUE9SVE1BQ1JPX0gKKyNkZWZpbmUgUE9SVE1BQ1JPX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUG9ydCBzcGVjaWZpYyBkZWZpbml0aW9ucy4KKyAqCisgKiBUaGUgc2V0dGluZ3MgaW4gdGhpcyBmaWxlIGNvbmZpZ3VyZSBGcmVlUlRPUyBjb3JyZWN0bHkgZm9yIHRoZSBnaXZlbiBoYXJkd2FyZQorICogYW5kIGNvbXBpbGVyLgorICoKKyAqIFRoZXNlIHNldHRpbmdzIHNob3VsZCBub3QgYmUgYWx0ZXJlZC4KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworI2lmbmRlZiBjb25maWdFTkFCTEVfRlBVCisJI2Vycm9yIGNvbmZpZ0VOQUJMRV9GUFUgbXVzdCBiZSBkZWZpbmVkIGluIEZyZWVSVE9TQ29uZmlnLmguICBTZXQgY29uZmlnRU5BQkxFX0ZQVSB0byAxIHRvIGVuYWJsZSB0aGUgRlBVIG9yIDAgdG8gZGlzYWJsZSB0aGUgRlBVLgorI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9GUFUgKi8KKworI2lmbmRlZiBjb25maWdFTkFCTEVfTVBVCisJI2Vycm9yIGNvbmZpZ0VOQUJMRV9NUFUgbXVzdCBiZSBkZWZpbmVkIGluIEZyZWVSVE9TQ29uZmlnLmguICBTZXQgY29uZmlnRU5BQkxFX01QVSB0byAxIHRvIGVuYWJsZSB0aGUgTVBVIG9yIDAgdG8gZGlzYWJsZSB0aGUgTVBVLgorI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9NUFUgKi8KKworI2lmbmRlZiBjb25maWdFTkFCTEVfVFJVU1RaT05FCisJI2Vycm9yIGNvbmZpZ0VOQUJMRV9UUlVTVFpPTkUgbXVzdCBiZSBkZWZpbmVkIGluIEZyZWVSVE9TQ29uZmlnLmguICBTZXQgY29uZmlnRU5BQkxFX1RSVVNUWk9ORSB0byAxIHRvIGVuYWJsZSBUcnVzdFpvbmUgb3IgMCB0byBkaXNhYmxlIFRydXN0Wm9uZS4KKyNlbmRpZiAvKiBjb25maWdFTkFCTEVfVFJVU1RaT05FICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAqIEBicmllZiBUeXBlIGRlZmluaXRpb25zLgorICovCisjZGVmaW5lIHBvcnRDSEFSCQkJCQkJCQkJCQljaGFyCisjZGVmaW5lIHBvcnRGTE9BVAkJCQkJCQkJCQkJZmxvYXQKKyNkZWZpbmUgcG9ydERPVUJMRQkJCQkJCQkJCQkJZG91YmxlCisjZGVmaW5lIHBvcnRMT05HCQkJCQkJCQkJCQlsb25nCisjZGVmaW5lIHBvcnRTSE9SVAkJCQkJCQkJCQkJc2hvcnQKKyNkZWZpbmUgcG9ydFNUQUNLX1RZUEUJCQkJCQkJCQkJdWludDMyX3QKKyNkZWZpbmUgcG9ydEJBU0VfVFlQRQkJCQkJCQkJCQlsb25nCisKK3R5cGVkZWYgcG9ydFNUQUNLX1RZUEUJCQkJCQkJCQkJU3RhY2tUeXBlX3Q7Cit0eXBlZGVmIGxvbmcJCQkJCQkJCQkJCQlCYXNlVHlwZV90OwordHlwZWRlZiB1bnNpZ25lZCBsb25nCQkJCQkJCQkJCVVCYXNlVHlwZV90OworCisjaWYoIGNvbmZpZ1VTRV8xNl9CSVRfVElDS1MgPT0gMSApCisJdHlwZWRlZiB1aW50MTZfdCBUaWNrVHlwZV90OworCSNkZWZpbmUgcG9ydE1BWF9ERUxBWSAoIFRpY2tUeXBlX3QgKQkJCQkJMHhmZmZmCisjZWxzZQorCXR5cGVkZWYgdWludDMyX3QgVGlja1R5cGVfdDsKKwkjZGVmaW5lIHBvcnRNQVhfREVMQVkgKCBUaWNrVHlwZV90ICkJCQkJCTB4ZmZmZmZmZmZVTAorCisJLyogMzItYml0IHRpY2sgdHlwZSBvbiBhIDMyLWJpdCBhcmNoaXRlY3R1cmUsIHNvIHJlYWRzIG9mIHRoZSB0aWNrIGNvdW50IGRvCisJICogbm90IG5lZWQgdG8gYmUgZ3VhcmRlZCB3aXRoIGEgY3JpdGljYWwgc2VjdGlvbi4gKi8KKwkjZGVmaW5lIHBvcnRUSUNLX1RZUEVfSVNfQVRPTUlDCQkJCQkJCTEKKyNlbmRpZgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKgorICogQXJjaGl0ZWN0dXJlIHNwZWNpZmljcy4KKyAqLworI2RlZmluZSBwb3J0QVJDSF9OQU1FCQkJCQkJCQkJCSJDb3J0ZXgtTTIzIgorI2RlZmluZSBwb3J0U1RBQ0tfR1JPV1RICQkJCQkJCQkJKCAtMSApCisjZGVmaW5lIHBvcnRUSUNLX1BFUklPRF9NUwkJCQkJCQkJCSggKCBUaWNrVHlwZV90ICkgMTAwMCAvIGNvbmZpZ1RJQ0tfUkFURV9IWiApCisjZGVmaW5lIHBvcnRCWVRFX0FMSUdOTUVOVAkJCQkJCQkJCTgKKyNkZWZpbmUgcG9ydE5PUCgpCisjZGVmaW5lIHBvcnRJTkxJTkUJCQkJCQkJCQkJCV9faW5saW5lCisjaWZuZGVmIHBvcnRGT1JDRV9JTkxJTkUKKwkjZGVmaW5lIHBvcnRGT1JDRV9JTkxJTkUJCQkJCQkJCWlubGluZSBfX2F0dHJpYnV0ZV9fKCggYWx3YXlzX2lubGluZSApKQorI2VuZGlmCisjZGVmaW5lIHBvcnRIQVNfU1RBQ0tfT1ZFUkZMT1dfQ0hFQ0tJTkcJCQkJCQkxCisjZGVmaW5lIHBvcnRET05UX0RJU0NBUkQJCQkJCQkJCQlfX3Jvb3QKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAqIEBicmllZiBFeHRlcm4gZGVjbGFyYXRpb25zLgorICovCitleHRlcm4gdm9pZCB2UG9ydFlpZWxkKCB2b2lkICkgLyogUFJJVklMRUdFRF9GVU5DVElPTiAqLzsKKworZXh0ZXJuIHZvaWQgdlBvcnRFbnRlckNyaXRpY2FsKCB2b2lkICkgLyogUFJJVklMRUdFRF9GVU5DVElPTiAqLzsKK2V4dGVybiB2b2lkIHZQb3J0RXhpdENyaXRpY2FsKCB2b2lkICkgLyogUFJJVklMRUdFRF9GVU5DVElPTiAqLzsKKworZXh0ZXJuIHVpbnQzMl90IHVsU2V0SW50ZXJydXB0TWFza0Zyb21JU1IoIHZvaWQgKSAvKiBfX2F0dHJpYnV0ZV9fKCggbmFrZWQgKSkgUFJJVklMRUdFRF9GVU5DVElPTiAqLzsKK2V4dGVybiB2b2lkIHZDbGVhckludGVycnVwdE1hc2tGcm9tSVNSKCB1aW50MzJfdCB1bE1hc2sgKSAvKiBfX2F0dHJpYnV0ZV9fKCggbmFrZWQgKSkgUFJJVklMRUdFRF9GVU5DVElPTiAqLzsKKworI2lmKCBjb25maWdFTkFCTEVfVFJVU1RaT05FID09IDEgKQorCWV4dGVybiB2b2lkIHZQb3J0QWxsb2NhdGVTZWN1cmVDb250ZXh0KCB1aW50MzJfdCB1bFNlY3VyZVN0YWNrU2l6ZSApOyAvKiBfX2F0dHJpYnV0ZV9fICgoIG5ha2VkICkpICovCisJZXh0ZXJuIHZvaWQgdlBvcnRGcmVlU2VjdXJlQ29udGV4dCggdWludDMyX3QgKnB1bFRDQiApIC8qIF9fYXR0cmlidXRlX18gKCggbmFrZWQgKSkgUFJJVklMRUdFRF9GVU5DVElPTiAqLzsKKyNlbmRpZiAvKiBjb25maWdFTkFCTEVfVFJVU1RaT05FICovCisKKyNpZiggY29uZmlnRU5BQkxFX01QVSA9PSAxICkKKwlleHRlcm4gQmFzZVR5cGVfdCB4SXNQcml2aWxlZ2VkKCB2b2lkICkgLyogX19hdHRyaWJ1dGVfXyAoKCBuYWtlZCApKSAqLzsKKwlleHRlcm4gdm9pZCB2UmVzZXRQcml2aWxlZ2UoIHZvaWQgKSAvKiBfX2F0dHJpYnV0ZV9fICgoIG5ha2VkICkpICovOworI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9NUFUgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAqIEBicmllZiBNUFUgc3BlY2lmaWMgY29uc3RhbnRzLgorICovCisjaWYoIGNvbmZpZ0VOQUJMRV9NUFUgPT0gMSApCisJI2RlZmluZSBwb3J0VVNJTkdfTVBVX1dSQVBQRVJTCQkJCQkJCTEKKwkjZGVmaW5lIHBvcnRQUklWSUxFR0VfQklUCQkJCQkJCQkoIDB4ODAwMDAwMDBVTCApCisjZWxzZQorCSNkZWZpbmUgcG9ydFBSSVZJTEVHRV9CSVQJCQkJCQkJCSggMHgwVUwgKQorI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9NUFUgKi8KKworCisvKiBNUFUgcmVnaW9ucy4gKi8KKyNkZWZpbmUgcG9ydFBSSVZJTEVHRURfRkxBU0hfUkVHSU9OCQkJCQkJCSggMFVMICkKKyNkZWZpbmUgcG9ydFVOUFJJVklMRUdFRF9GTEFTSF9SRUdJT04JCQkJCQkoIDFVTCApCisjZGVmaW5lIHBvcnRVTlBSSVZJTEVHRURfU1lTQ0FMTFNfUkVHSU9OCQkJCQkoIDJVTCApCisjZGVmaW5lIHBvcnRQUklWSUxFR0VEX1JBTV9SRUdJT04JCQkJCQkJKCAzVUwgKQorI2RlZmluZSBwb3J0U1RBQ0tfUkVHSU9OCQkJCQkJCQkJKCA0VUwgKQorI2RlZmluZSBwb3J0RklSU1RfQ09ORklHVVJBQkxFX1JFR0lPTgkJCQkJCSggNVVMICkKKyNkZWZpbmUgcG9ydExBU1RfQ09ORklHVVJBQkxFX1JFR0lPTgkJCQkJCSggN1VMICkKKyNkZWZpbmUgcG9ydE5VTV9DT05GSUdVUkFCTEVfUkVHSU9OUwkJCQkJCSggKCBwb3J0TEFTVF9DT05GSUdVUkFCTEVfUkVHSU9OIC0gcG9ydEZJUlNUX0NPTkZJR1VSQUJMRV9SRUdJT04gKSArIDEgKQorI2RlZmluZSBwb3J0VE9UQUxfTlVNX1JFR0lPTlMJCQkJCQkJCSggcG9ydE5VTV9DT05GSUdVUkFCTEVfUkVHSU9OUyArIDEgKSAvKiBQbHVzIG9uZSB0byBtYWtlIHNwYWNlIGZvciB0aGUgc3RhY2sgcmVnaW9uLiAqLworCisvKiBEZXZpY2UgbWVtb3J5IGF0dHJpYnV0ZXMgdXNlZCBpbiBNUFVfTUFJUiByZWdpc3RlcnMuCisgKgorICogOC1iaXQgdmFsdWVzIGVuY29kZWQgYXMgZm9sbG93czoKKyAqICBCaXRbNzo0XSAtIDAwMDAgLSBEZXZpY2UgTWVtb3J5CisgKiAgQml0WzM6Ml0gLSAwMCAtLT4gRGV2aWNlLW5HblJuRQorICoJCQkJMDEgLS0+IERldmljZS1uR25SRQorICoJCQkJMTAgLS0+IERldmljZS1uR1JFCisgKgkJCQkxMSAtLT4gRGV2aWNlLUdSRQorICogIEJpdFsxOjBdIC0gMDAsIFJlc2VydmVkLgorICovCisjZGVmaW5lIHBvcnRNUFVfREVWSUNFX01FTU9SWV9uR25SbkUJCQkJCQkoIDB4MDAgKSAvKiAwMDAwIDAwMDAgKi8KKyNkZWZpbmUgcG9ydE1QVV9ERVZJQ0VfTUVNT1JZX25HblJFCQkJCQkJCSggMHgwNCApIC8qIDAwMDAgMDEwMCAqLworI2RlZmluZSBwb3J0TVBVX0RFVklDRV9NRU1PUllfbkdSRQkJCQkJCQkoIDB4MDggKSAvKiAwMDAwIDEwMDAgKi8KKyNkZWZpbmUgcG9ydE1QVV9ERVZJQ0VfTUVNT1JZX0dSRQkJCQkJCQkoIDB4MEMgKSAvKiAwMDAwIDExMDAgKi8KKworLyogTm9ybWFsIG1lbW9yeSBhdHRyaWJ1dGVzIHVzZWQgaW4gTVBVX01BSVIgcmVnaXN0ZXJzLiAqLworI2RlZmluZSBwb3J0TVBVX05PUk1BTF9NRU1PUllfTk9OX0NBQ0hFQUJMRQkJCQkJKCAweDQ0ICkgLyogTm9uLWNhY2hlYWJsZS4gKi8KKyNkZWZpbmUgcG9ydE1QVV9OT1JNQUxfTUVNT1JZX0JVRkZFUkFCTEVfQ0FDSEVBQkxFCQkJKCAweEZGICkgLyogTm9uLVRyYW5zaWVudCwgV3JpdGUtYmFjaywgUmVhZC1BbGxvY2F0ZSBhbmQgV3JpdGUtQWxsb2NhdGUuICovCisKKy8qIEF0dHJpYnV0ZXMgdXNlZCBpbiBNUFVfUkJBUiByZWdpc3RlcnMuICovCisjZGVmaW5lIHBvcnRNUFVfUkVHSU9OX05PTl9TSEFSRUFCTEUJCQkJCQkoIDBVTCA8PCAzVUwgKQorI2RlZmluZSBwb3J0TVBVX1JFR0lPTl9JTk5FUl9TSEFSRUFCTEUJCQkJCQkoIDFVTCA8PCAzVUwgKQorI2RlZmluZSBwb3J0TVBVX1JFR0lPTl9PVVRFUl9TSEFSRUFCTEUJCQkJCQkoIDJVTCA8PCAzVUwgKQorCisjZGVmaW5lIHBvcnRNUFVfUkVHSU9OX1BSSVZJTEVHRURfUkVBRF9XUklURQkJCQkoIDBVTCA8PCAxVUwgKQorI2RlZmluZSBwb3J0TVBVX1JFR0lPTl9SRUFEX1dSSVRFCQkJCQkJCSggMVVMIDw8IDFVTCApCisjZGVmaW5lIHBvcnRNUFVfUkVHSU9OX1BSSVZJTEVHRURfUkVBRF9PTkxZCQkJCQkoIDJVTCA8PCAxVUwgKQorI2RlZmluZSBwb3J0TVBVX1JFR0lPTl9SRUFEX09OTFkJCQkJCQkJKCAzVUwgPDwgMVVMICkKKworI2RlZmluZSBwb3J0TVBVX1JFR0lPTl9FWEVDVVRFX05FVkVSCQkJCQkJKCAxVUwgKQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKgorICogQGJyaWVmIFNldHRpbmdzIHRvIGRlZmluZSBhbiBNUFUgcmVnaW9uLgorICovCit0eXBlZGVmIHN0cnVjdCBNUFVSZWdpb25TZXR0aW5ncworeworCXVpbnQzMl90IHVsUkJBUjsJLyoqPCBSQkFSIGZvciB0aGUgcmVnaW9uLiAqLworCXVpbnQzMl90IHVsUkxBUjsJLyoqPCBSTEFSIGZvciB0aGUgcmVnaW9uLiAqLworfSBNUFVSZWdpb25TZXR0aW5nc190OworCisvKioKKyAqIEBicmllZiBNUFUgc2V0dGluZ3MgYXMgc3RvcmVkIGluIHRoZSBUQ0IuCisgKi8KK3R5cGVkZWYgc3RydWN0IE1QVV9TRVRUSU5HUworeworCXVpbnQzMl90IHVsTUFJUjA7CS8qKjwgTUFJUjAgZm9yIHRoZSB0YXNrIGNvbnRhaW5pbmcgYXR0cmlidXRlcyBmb3IgYWxsIHRoZSA0IHBlciB0YXNrIHJlZ2lvbnMuICovCisJTVBVUmVnaW9uU2V0dGluZ3NfdCB4UmVnaW9uc1NldHRpbmdzWyBwb3J0VE9UQUxfTlVNX1JFR0lPTlMgXTsgLyoqPCBTZXR0aW5ncyBmb3IgNCBwZXIgdGFzayByZWdpb25zLiAqLworfSB4TVBVX1NFVFRJTkdTOworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKgorICogQGJyaWVmIFNWQyBudW1iZXJzLgorICovCisjZGVmaW5lIHBvcnRTVkNfQUxMT0NBVEVfU0VDVVJFX0NPTlRFWFQJCQkJCQkwCisjZGVmaW5lIHBvcnRTVkNfRlJFRV9TRUNVUkVfQ09OVEVYVAkJCQkJCQkxCisjZGVmaW5lIHBvcnRTVkNfU1RBUlRfU0NIRURVTEVSCQkJCQkJCQkyCisjZGVmaW5lIHBvcnRTVkNfUkFJU0VfUFJJVklMRUdFCQkJCQkJCQkzCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqCisgKiBAYnJpZWYgU2NoZWR1bGVyIHV0aWxpdGllcy4KKyAqLworI2RlZmluZSBwb3J0WUlFTEQoKQkJCQkJCQkJCQkJdlBvcnRZaWVsZCgpCisjZGVmaW5lIHBvcnROVklDX0lOVF9DVFJMX1JFRwkJCQkJCQkJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZWQwNCApICkKKyNkZWZpbmUgcG9ydE5WSUNfUEVORFNWU0VUX0JJVAkJCQkJCQkJKCAxVUwgPDwgMjhVTCApCisjZGVmaW5lIHBvcnRFTkRfU1dJVENISU5HX0lTUiggeFN3aXRjaFJlcXVpcmVkICkJCQlpZiggeFN3aXRjaFJlcXVpcmVkICkgcG9ydE5WSUNfSU5UX0NUUkxfUkVHID0gcG9ydE5WSUNfUEVORFNWU0VUX0JJVAorI2RlZmluZSBwb3J0WUlFTERfRlJPTV9JU1IoIHggKQkJCQkJCQkJcG9ydEVORF9TV0lUQ0hJTkdfSVNSKCB4ICkKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAqIEBicmllZiBDcml0aWNhbCBzZWN0aW9uIG1hbmFnZW1lbnQuCisgKi8KKyNkZWZpbmUgcG9ydFNFVF9JTlRFUlJVUFRfTUFTS19GUk9NX0lTUigpCQkJCQl1bFNldEludGVycnVwdE1hc2tGcm9tSVNSKCkKKyNkZWZpbmUgcG9ydENMRUFSX0lOVEVSUlVQVF9NQVNLX0ZST01fSVNSKHgpCQkJCXZDbGVhckludGVycnVwdE1hc2tGcm9tSVNSKCB4ICkKKyNkZWZpbmUgcG9ydERJU0FCTEVfSU5URVJSVVBUUygpCQkJCQkJCV9fYXNtIHZvbGF0aWxlICggIiBjcHNpZCBpICIgOjo6ICJtZW1vcnkiICkKKyNkZWZpbmUgcG9ydEVOQUJMRV9JTlRFUlJVUFRTKCkJCQkJCQkJCV9fYXNtIHZvbGF0aWxlICggIiBjcHNpZSBpICIgOjo6ICJtZW1vcnkiICkKKyNkZWZpbmUgcG9ydEVOVEVSX0NSSVRJQ0FMKCkJCQkJCQkJCXZQb3J0RW50ZXJDcml0aWNhbCgpCisjZGVmaW5lIHBvcnRFWElUX0NSSVRJQ0FMKCkJCQkJCQkJCQl2UG9ydEV4aXRDcml0aWNhbCgpCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqCisgKiBAYnJpZWYgVGFzayBmdW5jdGlvbiBtYWNyb3MgYXMgZGVzY3JpYmVkIG9uIHRoZSBGcmVlUlRPUy5vcmcgV0VCIHNpdGUuCisgKi8KKyNkZWZpbmUgcG9ydFRBU0tfRlVOQ1RJT05fUFJPVE8oIHZGdW5jdGlvbiwgcHZQYXJhbWV0ZXJzICkJdm9pZCB2RnVuY3Rpb24oIHZvaWQgKnB2UGFyYW1ldGVycyApCisjZGVmaW5lIHBvcnRUQVNLX0ZVTkNUSU9OKCB2RnVuY3Rpb24sIHB2UGFyYW1ldGVycyApCQl2b2lkIHZGdW5jdGlvbiggdm9pZCAqcHZQYXJhbWV0ZXJzICkKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYoIGNvbmZpZ0VOQUJMRV9UUlVTVFpPTkUgPT0gMSApCisJLyoqCisJICogQGJyaWVmIEFsbG9jYXRlIGEgc2VjdXJlIGNvbnRleHQgZm9yIHRoZSB0YXNrLgorCSAqCisJICogVGFza3MgYXJlIG5vdCBjcmVhdGVkIHdpdGggYSBzZWN1cmUgY29udGV4dC4gQW55IHRhc2sgdGhhdCBpcyBnb2luZyB0byBjYWxsCisJICogc2VjdXJlIGZ1bmN0aW9ucyBtdXN0IGNhbGwgcG9ydEFMTE9DQVRFX1NFQ1VSRV9DT05URVhUKCkgdG8gYWxsb2NhdGUgaXRzZWxmIGEKKwkgKiBzZWN1cmUgY29udGV4dCBiZWZvcmUgaXQgY2FsbHMgYW55IHNlY3VyZSBmdW5jdGlvbi4KKwkgKgorCSAqIEBwYXJhbVtpbl0gdWxTZWN1cmVTdGFja1NpemUgVGhlIHNpemUgb2YgdGhlIHNlY3VyZSBzdGFjayB0byBiZSBhbGxvY2F0ZWQuCisJICovCisJI2RlZmluZSBwb3J0QUxMT0NBVEVfU0VDVVJFX0NPTlRFWFQoIHVsU2VjdXJlU3RhY2tTaXplICkJdlBvcnRBbGxvY2F0ZVNlY3VyZUNvbnRleHQoIHVsU2VjdXJlU3RhY2tTaXplICkKKworCS8qKgorCSAqIEBicmllZiBDYWxsZWQgd2hlbiBhIHRhc2sgaXMgZGVsZXRlZCB0byBkZWxldGUgdGhlIHRhc2sncyBzZWN1cmUgY29udGV4dCwKKwkgKiBpZiBpdCBoYXMgb25lLgorCSAqCisJICogQHBhcmFtW2luXSBweFRDQiBUaGUgVENCIG9mIHRoZSB0YXNrIGJlaW5nIGRlbGV0ZWQuCisJICovCisJI2RlZmluZSBwb3J0Q0xFQU5fVVBfVENCKCBweFRDQiApCQkJCQkJCXZQb3J0RnJlZVNlY3VyZUNvbnRleHQoICggdWludDMyX3QgKiApIHB4VENCICkKKyNlbHNlCisJI2RlZmluZSBwb3J0QUxMT0NBVEVfU0VDVVJFX0NPTlRFWFQoIHVsU2VjdXJlU3RhY2tTaXplICkKKwkjZGVmaW5lIHBvcnRDTEVBTl9VUF9UQ0IoIHB4VENCICkKKyNlbmRpZiAvKiBjb25maWdFTkFCTEVfVFJVU1RaT05FICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmKCBjb25maWdFTkFCTEVfTVBVID09IDEgKQorCS8qKgorCSAqIEBicmllZiBDaGVja3Mgd2hldGhlciBvciBub3QgdGhlIHByb2Nlc3NvciBpcyBwcml2aWxlZ2VkLgorCSAqCisJICogQHJldHVybiAxIGlmIHRoZSBwcm9jZXNzb3IgaXMgYWxyZWFkeSBwcml2aWxlZ2VkLCAwIG90aGVyd2lzZS4KKwkgKi8KKwkjZGVmaW5lIHBvcnRJU19QUklWSUxFR0VEKCkJCQkJCQkJCQl4SXNQcml2aWxlZ2VkKCkKKworCS8qKgorCSAqIEBicmllZiBSYWlzZSBhbiBTVkMgcmVxdWVzdCB0byByYWlzZSBwcml2aWxlZ2UuCisJICoKKwkgKiBUaGUgU1ZDIGhhbmRsZXIgY2hlY2tzIHRoYXQgdGhlIFNWQyB3YXMgcmFpc2VkIGZyb20gYSBzeXN0ZW0gY2FsbCBhbmQgb25seQorCSAqIHRoZW4gaXQgcmFpc2VzIHRoZSBwcml2aWxlZ2UuIElmIHRoaXMgaXMgY2FsbGVkIGZyb20gYW55IG90aGVyIHBsYWNlLAorCSAqIHRoZSBwcml2aWxlZ2UgaXMgbm90IHJhaXNlZC4KKwkgKi8KKwkjZGVmaW5lIHBvcnRSQUlTRV9QUklWSUxFR0UoKQkJCQkJCQkJX19hc20gdm9sYXRpbGUgKCAic3ZjICUwIFxuIiA6OiAiaSIgKCBwb3J0U1ZDX1JBSVNFX1BSSVZJTEVHRSApIDogIm1lbW9yeSIgKTsKKworCS8qKgorCSAqIEBicmllZiBMb3dlcnMgdGhlIHByaXZpbGVnZSBsZXZlbCBieSBzZXR0aW5nIHRoZSBiaXQgMCBvZiB0aGUgQ09OVFJPTAorCSAqIHJlZ2lzdGVyLgorCSAqLworCSNkZWZpbmUgcG9ydFJFU0VUX1BSSVZJTEVHRSgpCQkJCQkJCQl2UmVzZXRQcml2aWxlZ2UoKQorI2Vsc2UKKwkjZGVmaW5lIHBvcnRJU19QUklWSUxFR0VEKCkKKwkjZGVmaW5lIHBvcnRSQUlTRV9QUklWSUxFR0UoKQorCSNkZWZpbmUgcG9ydFJFU0VUX1BSSVZJTEVHRSgpCisjZW5kaWYgLyogY29uZmlnRU5BQkxFX01QVSAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKgorICogQGJyaWVmIEJhcnJpZXJzLgorICovCisjZGVmaW5lIHBvcnRNRU1PUllfQkFSUklFUigpIF9fYXNtIHZvbGF0aWxlKCAiIiA6OjogIm1lbW9yeSIgKQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFN1cHByZXNzIHdhcm5pbmdzIHRoYXQgYXJlIGdlbmVyYXRlZCBieSB0aGUgSUFSIHRvb2xzLCBidXQgY2Fubm90IGJlIGZpeGVkIGluCisgKiB0aGUgc291cmNlIGNvZGUgYmVjYXVzZSB0byBkbyBzbyB3b3VsZCBjYXVzZSBvdGhlciBjb21waWxlcnMgdG8gZ2VuZXJhdGUKKyAqIHdhcm5pbmdzLiAqLworI3ByYWdtYSBkaWFnX3N1cHByZXNzPUJlMDA2CisjcHJhZ21hIGRpYWdfc3VwcHJlc3M9UGEwODIKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogUE9SVE1BQ1JPX0ggKi8KZGlmZiAtLWdpdCBhL1NvdXJjZS9wb3J0YWJsZS9JQVIvQVJNX0NNMjMvc2VjdXJlL3NlY3VyZV9jb250ZXh0LmMgYi9Tb3VyY2UvcG9ydGFibGUvSUFSL0FSTV9DTTIzL3NlY3VyZS9zZWN1cmVfY29udGV4dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzNTM1Y2QKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvcG9ydGFibGUvSUFSL0FSTV9DTTIzL3NlY3VyZS9zZWN1cmVfY29udGV4dC5jCkBAIC0wLDAgKzEsMjA0IEBACisvKgorICogRnJlZVJUT1MgS2VybmVsIFYxMC4yLjEKKyAqIENvcHlyaWdodCAoQykgMjAxOSBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCisgKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgorICogdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bworICogdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YKKyAqIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKKyAqIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAorICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MKKyAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUgorICogQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSCisgKiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBodHRwOi8vd3d3LkZyZWVSVE9TLm9yZworICogaHR0cDovL2F3cy5hbWF6b24uY29tL2ZyZWVydG9zCisgKgorICogMSB0YWIgPT0gNCBzcGFjZXMhCisgKi8KKworLyogU2VjdXJlIGNvbnRleHQgaW5jbHVkZXMuICovCisjaW5jbHVkZSAic2VjdXJlX2NvbnRleHQuaCIKKworLyogU2VjdXJlIGhlYXAgaW5jbHVkZXMuICovCisjaW5jbHVkZSAic2VjdXJlX2hlYXAuaCIKKworLyogU2VjdXJlIHBvcnQgbWFjcm9zLiAqLworI2luY2x1ZGUgInNlY3VyZV9wb3J0X21hY3Jvcy5oIgorCisvKioKKyAqIEBicmllZiBDT05UUk9MIHZhbHVlIGZvciBwcml2aWxlZ2VkIHRhc2tzLgorICoKKyAqIEJpdFswXSAtIDAgLS0+IFRocmVhZCBtb2RlIGlzIHByaXZpbGVnZWQuCisgKiBCaXRbMV0gLSAxIC0tPiBUaHJlYWQgbW9kZSB1c2VzIFBTUC4KKyAqLworI2RlZmluZSBzZWN1cmVjb250ZXh0Q09OVFJPTF9WQUxVRV9QUklWSUxFR0VECQkweDAyCisKKy8qKgorICogQGJyaWVmIENPTlRST0wgdmFsdWUgZm9yIHVuLXByaXZpbGVnZWQgdGFza3MuCisgKgorICogQml0WzBdIC0gMSAtLT4gVGhyZWFkIG1vZGUgaXMgdW4tcHJpdmlsZWdlZC4KKyAqIEJpdFsxXSAtIDEgLS0+IFRocmVhZCBtb2RlIHVzZXMgUFNQLgorICovCisjZGVmaW5lIHNlY3VyZWNvbnRleHRDT05UUk9MX1ZBTFVFX1VOUFJJVklMRUdFRAkJMHgwMworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKgorICogQGJyaWVmIFN0cnVjdHVyZSB0byByZXByZXNlbnQgc2VjdXJlIGNvbnRleHQuCisgKgorICogQG5vdGUgU2luY2Ugc3RhY2sgZ3Jvd3MgZG93biwgcHVjU3RhY2tTdGFydCBpcyB0aGUgaGlnaGVzdCBhZGRyZXNzIHdoaWxlCisgKiBwdWNTdGFja0xpbWl0IGlzIHRoZSBmaXJzdCBhZGRlc3Mgb2YgdGhlIGFsbG9jYXRlZCBtZW1vcnkuCisgKi8KK3R5cGVkZWYgc3RydWN0IFNlY3VyZUNvbnRleHQKK3sKKwl1aW50OF90ICpwdWNDdXJyZW50U3RhY2tQb2ludGVyOwkvKio8IEN1cnJlbnQgdmFsdWUgb2Ygc3RhY2sgcG9pbnRlciAoUFNQKS4gKi8KKwl1aW50OF90ICpwdWNTdGFja0xpbWl0OwkJCQkvKio8IExhc3QgbG9jYXRpb24gb2YgdGhlIHN0YWNrIG1lbW9yeSAoUFNQTElNKS4gKi8KKwl1aW50OF90ICpwdWNTdGFja1N0YXJ0OwkJCQkvKio8IEZpcnN0IGxvY2F0aW9uIG9mIHRoZSBzdGFjayBtZW1vcnkuICovCit9IFNlY3VyZUNvbnRleHRfdDsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzZWN1cmVwb3J0Tk9OX1NFQ1VSRV9DQUxMQUJMRSB2b2lkIFNlY3VyZUNvbnRleHRfSW5pdCggdm9pZCApCit7CisJdWludDMyX3QgdWxJUFNSOworCisJLyogUmVhZCB0aGUgSW50ZXJydXB0IFByb2dyYW0gU3RhdHVzIFJlZ2lzdGVyIChJUFNSKSB2YWx1ZS4gKi8KKwlzZWN1cmVwb3J0UkVBRF9JUFNSKCB1bElQU1IgKTsKKworCS8qIERvIG5vdGhpbmcgaWYgdGhlIHByb2Nlc3NvciBpcyBydW5uaW5nIGluIHRoZSBUaHJlYWQgTW9kZS4gSVBTUiBpcyB6ZXJvCisJICogd2hlbiB0aGUgcHJvY2Vzc29yIGlzIHJ1bm5pbmcgaW4gdGhlIFRocmVhZCBNb2RlLiAqLworCWlmKCB1bElQU1IgIT0gMCApCisJeworCQkvKiBObyBzdGFjayBmb3IgdGhyZWFkIG1vZGUgdW50aWwgYSB0YXNrJ3MgY29udGV4dCBpcyBsb2FkZWQuICovCisJCXNlY3VyZXBvcnRTRVRfUFNQTElNKCBzZWN1cmVjb250ZXh0Tk9fU1RBQ0sgKTsKKwkJc2VjdXJlcG9ydFNFVF9QU1AoIHNlY3VyZWNvbnRleHROT19TVEFDSyApOworCisJCSNpZiggY29uZmlnRU5BQkxFX01QVSA9PSAxICkKKwkJeworCQkJLyogQ29uZmlndXJlIHRocmVhZCBtb2RlIHRvIHVzZSBQU1AgYW5kIHRvIGJlIHVucHJpdmlsZWdlZC4gKi8KKwkJCXNlY3VyZXBvcnRTRVRfQ09OVFJPTCggc2VjdXJlY29udGV4dENPTlRST0xfVkFMVUVfVU5QUklWSUxFR0VEICk7CisJCX0KKwkJI2Vsc2UgLyogY29uZmlnRU5BQkxFX01QVSAqLworCQl7CisJCQkvKiBDb25maWd1cmUgdGhyZWFkIG1vZGUgdG8gdXNlIFBTUCBhbmQgdG8gYmUgcHJpdmlsZWdlZC4uICovCisJCQlzZWN1cmVwb3J0U0VUX0NPTlRST0woIHNlY3VyZWNvbnRleHRDT05UUk9MX1ZBTFVFX1BSSVZJTEVHRUQgKTsKKwkJfQorCQkjZW5kaWYgLyogY29uZmlnRU5BQkxFX01QVSAqLworCX0KK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYoIGNvbmZpZ0VOQUJMRV9NUFUgPT0gMSApCisJc2VjdXJlcG9ydE5PTl9TRUNVUkVfQ0FMTEFCTEUgU2VjdXJlQ29udGV4dEhhbmRsZV90IFNlY3VyZUNvbnRleHRfQWxsb2NhdGVDb250ZXh0KCB1aW50MzJfdCB1bFNlY3VyZVN0YWNrU2l6ZSwgdWludDMyX3QgdWxJc1Rhc2tQcml2aWxlZ2VkICkKKyNlbHNlIC8qIGNvbmZpZ0VOQUJMRV9NUFUgKi8KKwlzZWN1cmVwb3J0Tk9OX1NFQ1VSRV9DQUxMQUJMRSBTZWN1cmVDb250ZXh0SGFuZGxlX3QgU2VjdXJlQ29udGV4dF9BbGxvY2F0ZUNvbnRleHQoIHVpbnQzMl90IHVsU2VjdXJlU3RhY2tTaXplICkKKyNlbmRpZiAvKiBjb25maWdFTkFCTEVfTVBVICovCit7CisJdWludDhfdCAqcHVjU3RhY2tNZW1vcnkgPSBOVUxMOworCXVpbnQzMl90IHVsSVBTUjsKKwlTZWN1cmVDb250ZXh0SGFuZGxlX3QgeFNlY3VyZUNvbnRleHRIYW5kbGUgPSBOVUxMOworCSNpZiggY29uZmlnRU5BQkxFX01QVSA9PSAxICkKKwkJdWludDMyX3QgKnB1bEN1cnJlbnRTdGFja1BvaW50ZXIgPSBOVUxMOworCSNlbmRpZiAvKiBjb25maWdFTkFCTEVfTVBVICovCisKKwkvKiBSZWFkIHRoZSBJbnRlcnJ1cHQgUHJvZ3JhbSBTdGF0dXMgUmVnaXN0ZXIgKElQU1IpIHZhbHVlLiAqLworCXNlY3VyZXBvcnRSRUFEX0lQU1IoIHVsSVBTUiApOworCisJLyogRG8gbm90aGluZyBpZiB0aGUgcHJvY2Vzc29yIGlzIHJ1bm5pbmcgaW4gdGhlIFRocmVhZCBNb2RlLiBJUFNSIGlzIHplcm8KKwkgKiB3aGVuIHRoZSBwcm9jZXNzb3IgaXMgcnVubmluZyBpbiB0aGUgVGhyZWFkIE1vZGUuICovCisJaWYoIHVsSVBTUiAhPSAwICkKKwl7CisJCS8qIEFsbG9jYXRlIHRoZSBjb250ZXh0IHN0cnVjdHVyZS4gKi8KKwkJeFNlY3VyZUNvbnRleHRIYW5kbGUgPSAoIFNlY3VyZUNvbnRleHRIYW5kbGVfdCApIHB2UG9ydE1hbGxvYyggc2l6ZW9mKCBTZWN1cmVDb250ZXh0X3QgKSApOworCisJCWlmKCB4U2VjdXJlQ29udGV4dEhhbmRsZSAhPSBOVUxMICkKKwkJeworCQkJLyogQWxsb2NhdGUgdGhlIHN0YWNrIHNwYWNlLiAqLworCQkJcHVjU3RhY2tNZW1vcnkgPSBwdlBvcnRNYWxsb2MoIHVsU2VjdXJlU3RhY2tTaXplICk7CisKKwkJCWlmKCBwdWNTdGFja01lbW9yeSAhPSBOVUxMICkKKwkJCXsKKwkJCQkvKiBTaW5jZSBzdGFjayBncm93cyBkb3duLCB0aGUgc3RhcnRpbmcgcG9pbnQgd2lsbCBiZSB0aGUgbGFzdAorCQkJCSAqIGxvY2F0aW9uLiBOb3RlIHRoYXQgdGhpcyBsb2NhdGlvbiBpcyBuZXh0IHRvIHRoZSBsYXN0CisJCQkJICogYWxsb2NhdGVkIGJ5dGUgYmVjYXVzZSB0aGUgaGFyZHdhcmUgZGVjcmVtZW50cyB0aGUgc3RhY2sKKwkJCQkgKiBwb2ludGVyIGJlZm9yZSB3cml0aW5nIGkuZS4gaWYgc3RhY2sgcG9pbnRlciBpcyAweDIsIGEgcHVzaAorCQkJCSAqIG9wZXJhdGlvbiB3aWxsIGRlY3JlbWVudCB0aGUgc3RhY2sgcG9pbnRlciB0byAweDEgYW5kIHRoZW4KKwkJCQkgKiB3cml0ZSBhdCAweDEuICovCisJCQkJeFNlY3VyZUNvbnRleHRIYW5kbGUtPnB1Y1N0YWNrU3RhcnQgPSBwdWNTdGFja01lbW9yeSArIHVsU2VjdXJlU3RhY2tTaXplOworCisJCQkJLyogVGhlIHN0YWNrIGNhbm5vdCBnbyBiZXlvbmQgdGhpcyBsb2NhdGlvbi4gVGhpcyB2YWx1ZSBpcworCQkJCSAqIHByb2dyYW1tZWQgaW4gdGhlIFBTUExJTSByZWdpc3RlciBvbiBjb250ZXh0IHN3aXRjaC4qLworCQkJCXhTZWN1cmVDb250ZXh0SGFuZGxlLT5wdWNTdGFja0xpbWl0ID0gcHVjU3RhY2tNZW1vcnk7CisKKwkJCQkjaWYoIGNvbmZpZ0VOQUJMRV9NUFUgPT0gMSApCisJCQkJeworCQkJCQkvKiBTdG9yZSB0aGUgY29ycmVjdCBDT05UUk9MIHZhbHVlIGZvciB0aGUgdGFzayBvbiB0aGUgc3RhY2suCisJCQkJCSAqIFRoaXMgdmFsdWUgaXMgcHJvZ3JhbW1lZCBpbiB0aGUgQ09OVFJPTCByZWdpc3RlciBvbgorCQkJCQkgKiBjb250ZXh0IHN3aXRjaC4gKi8KKwkJCQkJcHVsQ3VycmVudFN0YWNrUG9pbnRlciA9ICggdWludDMyX3QgKiApIHhTZWN1cmVDb250ZXh0SGFuZGxlLT5wdWNTdGFja1N0YXJ0OworCQkJCQlwdWxDdXJyZW50U3RhY2tQb2ludGVyLS07CisJCQkJCWlmKCB1bElzVGFza1ByaXZpbGVnZWQgKQorCQkJCQl7CisJCQkJCQkqKCBwdWxDdXJyZW50U3RhY2tQb2ludGVyICkgPSBzZWN1cmVjb250ZXh0Q09OVFJPTF9WQUxVRV9QUklWSUxFR0VEOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJKiggcHVsQ3VycmVudFN0YWNrUG9pbnRlciApID0gc2VjdXJlY29udGV4dENPTlRST0xfVkFMVUVfVU5QUklWSUxFR0VEOworCQkJCQl9CisKKwkJCQkJLyogU3RvcmUgdGhlIGN1cnJlbnQgc3RhY2sgcG9pbnRlci4gVGhpcyB2YWx1ZSBpcyBwcm9ncmFtbWVkIGluCisJCQkJCSAqIHRoZSBQU1AgcmVnaXN0ZXIgb24gY29udGV4dCBzd2l0Y2guICovCisJCQkJCXhTZWN1cmVDb250ZXh0SGFuZGxlLT5wdWNDdXJyZW50U3RhY2tQb2ludGVyID0gKCB1aW50OF90ICogKSBwdWxDdXJyZW50U3RhY2tQb2ludGVyOworCQkJCX0KKwkJCQkjZWxzZSAvKiBjb25maWdFTkFCTEVfTVBVICovCisJCQkJeworCQkJCQkvKiBDdXJyZW50IFNQIGlzIHNldCB0byB0aGUgc3RhcnRpbmcgb2YgdGhlIHN0YWNrLiBUaGlzCisJCQkJCSAqIHZhbHVlIHByb2dyYW1tZWQgaW4gdGhlIFBTUCByZWdpc3RlciBvbiBjb250ZXh0IHN3aXRjaC4gKi8KKwkJCQkJeFNlY3VyZUNvbnRleHRIYW5kbGUtPnB1Y0N1cnJlbnRTdGFja1BvaW50ZXIgPSB4U2VjdXJlQ29udGV4dEhhbmRsZS0+cHVjU3RhY2tTdGFydDsKKworCQkJCX0KKwkJCQkjZW5kaWYgLyogY29uZmlnRU5BQkxFX01QVSAqLworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8qIEZyZWUgdGhlIGNvbnRleHQgdG8gYXZvaWQgbWVtb3J5IGxlYWsgYW5kIG1ha2Ugc3VyZSB0byByZXR1cm4KKwkJCQkgKiBOVUxMIHRvIGluZGljYXRlIGZhaWx1cmUuICovCisJCQkJdlBvcnRGcmVlKCB4U2VjdXJlQ29udGV4dEhhbmRsZSApOworCQkJCXhTZWN1cmVDb250ZXh0SGFuZGxlID0gTlVMTDsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiB4U2VjdXJlQ29udGV4dEhhbmRsZTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzZWN1cmVwb3J0Tk9OX1NFQ1VSRV9DQUxMQUJMRSB2b2lkIFNlY3VyZUNvbnRleHRfRnJlZUNvbnRleHQoIFNlY3VyZUNvbnRleHRIYW5kbGVfdCB4U2VjdXJlQ29udGV4dEhhbmRsZSApCit7CisJdWludDMyX3QgdWxJUFNSOworCisJLyogUmVhZCB0aGUgSW50ZXJydXB0IFByb2dyYW0gU3RhdHVzIFJlZ2lzdGVyIChJUFNSKSB2YWx1ZS4gKi8KKwlzZWN1cmVwb3J0UkVBRF9JUFNSKCB1bElQU1IgKTsKKworCS8qIERvIG5vdGhpbmcgaWYgdGhlIHByb2Nlc3NvciBpcyBydW5uaW5nIGluIHRoZSBUaHJlYWQgTW9kZS4gSVBTUiBpcyB6ZXJvCisJICogd2hlbiB0aGUgcHJvY2Vzc29yIGlzIHJ1bm5pbmcgaW4gdGhlIFRocmVhZCBNb2RlLiAqLworCWlmKCB1bElQU1IgIT0gMCApCisJeworCQkvKiBFbnN1cmUgdGhhdCB2YWxpZCBwYXJhbWV0ZXJzIGFyZSBwYXNzZWQuICovCisJCXNlY3VyZXBvcnRBU1NFUlQoIHhTZWN1cmVDb250ZXh0SGFuZGxlICE9IE5VTEwgKTsKKworCQkvKiBGcmVlIHRoZSBzdGFjayBzcGFjZS4gKi8KKwkJdlBvcnRGcmVlKCB4U2VjdXJlQ29udGV4dEhhbmRsZS0+cHVjU3RhY2tMaW1pdCApOworCisJCS8qIEZyZWUgdGhlIGNvbnRleHQgaXRzZWxmLiAqLworCQl2UG9ydEZyZWUoIHhTZWN1cmVDb250ZXh0SGFuZGxlICk7CisJfQorfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCmRpZmYgLS1naXQgYS9Tb3VyY2UvcG9ydGFibGUvSUFSL0FSTV9DTTIzL3NlY3VyZS9zZWN1cmVfY29udGV4dC5oIGIvU291cmNlL3BvcnRhYmxlL0lBUi9BUk1fQ00yMy9zZWN1cmUvc2VjdXJlX2NvbnRleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTQ4YmZmCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL3BvcnRhYmxlL0lBUi9BUk1fQ00yMy9zZWN1cmUvc2VjdXJlX2NvbnRleHQuaApAQCAtMCwwICsxLDExMSBAQAorLyoKKyAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMi4xCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgorICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KKyAqIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KKyAqIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mCisgKiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCisgKiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKKyAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTCisgKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IKKyAqIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUgorICogSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogaHR0cDovL3d3dy5GcmVlUlRPUy5vcmcKKyAqIGh0dHA6Ly9hd3MuYW1hem9uLmNvbS9mcmVlcnRvcworICoKKyAqIDEgdGFiID09IDQgc3BhY2VzIQorICovCisKKyNpZm5kZWYgX19TRUNVUkVfQ09OVEVYVF9IX18KKyNkZWZpbmUgX19TRUNVUkVfQ09OVEVYVF9IX18KKworLyogU3RhbmRhcmQgaW5jbHVkZXMuICovCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8qIEZyZWVSVE9TIGluY2x1ZGVzLiAqLworI2luY2x1ZGUgIkZyZWVSVE9TQ29uZmlnLmgiCisKKy8qKgorICogQGJyaWVmIFBTUCB2YWx1ZSB3aGVuIG5vIHRhc2sncyBjb250ZXh0IGlzIGxvYWRlZC4KKyAqLworI2RlZmluZSBzZWN1cmVjb250ZXh0Tk9fU1RBQ0sJMHgwCisKKy8qKgorICogQGJyaWVmIE9wYXF1ZSBoYW5kbGUuCisgKi8KK3N0cnVjdCBTZWN1cmVDb250ZXh0OwordHlwZWRlZiBzdHJ1Y3QgU2VjdXJlQ29udGV4dCoJU2VjdXJlQ29udGV4dEhhbmRsZV90OworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKgorICogQGJyaWVmIEluaXRpYWxpemVzIHRoZSBzZWN1cmUgY29udGV4dCBtYW5hZ2VtZW50IHN5c3RlbS4KKyAqCisgKiBQU1AgaXMgc2V0IHRvIE5VTEwgYW5kIHRoZXJlZm9yZSBhIHRhc2sgbXVzdCBhbGxvY2F0ZSBhbmQgbG9hZCBhIGNvbnRleHQKKyAqIGJlZm9yZSBjYWxsaW5nIGFueSBzZWN1cmUgc2lkZSBmdW5jdGlvbiBpbiB0aGUgdGhyZWFkIG1vZGUuCisgKgorICogQG5vdGUgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBpbiB0aGUgaGFuZGxlciBtb2RlLiBJdCBpcyBuby1vcCBpZiBjYWxsZWQKKyAqIGluIHRoZSB0aHJlYWQgbW9kZS4KKyAqLwordm9pZCBTZWN1cmVDb250ZXh0X0luaXQoIHZvaWQgKTsKKworLyoqCisgKiBAYnJpZWYgQWxsb2NhdGVzIGEgY29udGV4dCBvbiB0aGUgc2VjdXJlIHNpZGUuCisgKgorICogQG5vdGUgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBpbiB0aGUgaGFuZGxlciBtb2RlLiBJdCBpcyBuby1vcCBpZiBjYWxsZWQKKyAqIGluIHRoZSB0aHJlYWQgbW9kZS4KKyAqCisgKiBAcGFyYW1baW5dIHVsU2VjdXJlU3RhY2tTaXplIFNpemUgb2YgdGhlIHN0YWNrIHRvIGFsbG9jYXRlIG9uIHNlY3VyZSBzaWRlLgorICogQHBhcmFtW2luXSB1bElzVGFza1ByaXZpbGVnZWQgMSBpZiB0aGUgY2FsbGluZyB0YXNrIGlzIHByaXZpbGVnZWQsIDAgb3RoZXJ3aXNlLgorICoKKyAqIEByZXR1cm4gT3BhcXVlIGNvbnRleHQgaGFuZGxlIGlmIGNvbnRleHQgaXMgc3VjY2Vzc2Z1bGx5IGFsbG9jYXRlZCwgTlVMTAorICogb3RoZXJ3aXNlLgorICovCisjaWYoIGNvbmZpZ0VOQUJMRV9NUFUgPT0gMSApCisJU2VjdXJlQ29udGV4dEhhbmRsZV90IFNlY3VyZUNvbnRleHRfQWxsb2NhdGVDb250ZXh0KCB1aW50MzJfdCB1bFNlY3VyZVN0YWNrU2l6ZSwgdWludDMyX3QgdWxJc1Rhc2tQcml2aWxlZ2VkICk7CisjZWxzZSAvKiBjb25maWdFTkFCTEVfTVBVICovCisJU2VjdXJlQ29udGV4dEhhbmRsZV90IFNlY3VyZUNvbnRleHRfQWxsb2NhdGVDb250ZXh0KCB1aW50MzJfdCB1bFNlY3VyZVN0YWNrU2l6ZSApOworI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9NUFUgKi8KKworLyoqCisgKiBAYnJpZWYgRnJlZXMgdGhlIGdpdmVuIGNvbnRleHQuCisgKgorICogQG5vdGUgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBpbiB0aGUgaGFuZGxlciBtb2RlLiBJdCBpcyBuby1vcCBpZiBjYWxsZWQKKyAqIGluIHRoZSB0aHJlYWQgbW9kZS4KKyAqCisgKiBAcGFyYW1baW5dIHhTZWN1cmVDb250ZXh0SGFuZGxlIENvbnRleHQgaGFuZGxlIGNvcnJlc3BvbmRpbmcgdG8gdGhlCisgKiBjb250ZXh0IHRvIGJlIGZyZWVkLgorICovCit2b2lkIFNlY3VyZUNvbnRleHRfRnJlZUNvbnRleHQoIFNlY3VyZUNvbnRleHRIYW5kbGVfdCB4U2VjdXJlQ29udGV4dEhhbmRsZSApOworCisvKioKKyAqIEBicmllZiBMb2FkcyB0aGUgZ2l2ZW4gY29udGV4dC4KKyAqCisgKiBAbm90ZSBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGluIHRoZSBoYW5kbGVyIG1vZGUuIEl0IGlzIG5vLW9wIGlmIGNhbGxlZAorICogaW4gdGhlIHRocmVhZCBtb2RlLgorICoKKyAqIEBwYXJhbVtpbl0geFNlY3VyZUNvbnRleHRIYW5kbGUgQ29udGV4dCBoYW5kbGUgY29ycmVzcG9uZGluZyB0byB0aGUgY29udGV4dAorICogdG8gYmUgbG9hZGVkLgorICovCit2b2lkIFNlY3VyZUNvbnRleHRfTG9hZENvbnRleHQoIFNlY3VyZUNvbnRleHRIYW5kbGVfdCB4U2VjdXJlQ29udGV4dEhhbmRsZSApOworCisvKioKKyAqIEBicmllZiBTYXZlcyB0aGUgZ2l2ZW4gY29udGV4dC4KKyAqCisgKiBAbm90ZSBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGluIHRoZSBoYW5kbGVyIG1vZGUuIEl0IGlzIG5vLW9wIGlmIGNhbGxlZAorICogaW4gdGhlIHRocmVhZCBtb2RlLgorICoKKyAqIEBwYXJhbVtpbl0geFNlY3VyZUNvbnRleHRIYW5kbGUgQ29udGV4dCBoYW5kbGUgY29ycmVzcG9uZGluZyB0byB0aGUgY29udGV4dAorICogdG8gYmUgc2F2ZWQuCisgKi8KK3ZvaWQgU2VjdXJlQ29udGV4dF9TYXZlQ29udGV4dCggU2VjdXJlQ29udGV4dEhhbmRsZV90IHhTZWN1cmVDb250ZXh0SGFuZGxlICk7CisKKyNlbmRpZiAvKiBfX1NFQ1VSRV9DT05URVhUX0hfXyAqLwpkaWZmIC0tZ2l0IGEvU291cmNlL3BvcnRhYmxlL0lBUi9BUk1fQ00yMy9zZWN1cmUvc2VjdXJlX2NvbnRleHRfcG9ydC5jIGIvU291cmNlL3BvcnRhYmxlL0lBUi9BUk1fQ00yMy9zZWN1cmUvc2VjdXJlX2NvbnRleHRfcG9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxOWRiMWUKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvcG9ydGFibGUvSUFSL0FSTV9DTTIzL3NlY3VyZS9zZWN1cmVfY29udGV4dF9wb3J0LmMKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMi4xCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgorICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KKyAqIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KKyAqIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mCisgKiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCisgKiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKKyAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTCisgKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IKKyAqIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUgorICogSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogaHR0cDovL3d3dy5GcmVlUlRPUy5vcmcKKyAqIGh0dHA6Ly9hd3MuYW1hem9uLmNvbS9mcmVlcnRvcworICoKKyAqIDEgdGFiID09IDQgc3BhY2VzIQorICovCisKKy8qIFNlY3VyZSBjb250ZXh0IGluY2x1ZGVzLiAqLworI2luY2x1ZGUgInNlY3VyZV9jb250ZXh0LmgiCisKKy8qIFNlY3VyZSBwb3J0IG1hY3Jvcy4gKi8KKyNpbmNsdWRlICJzZWN1cmVfcG9ydF9tYWNyb3MuaCIKKworLyogRnVuY3Rpb25zIGltcGxlbWVudGVkIGluIGFzc2VtYmxlciBmaWxlLiAqLworZXh0ZXJuIHZvaWQgU2VjdXJlQ29udGV4dF9Mb2FkQ29udGV4dEFzbSggU2VjdXJlQ29udGV4dEhhbmRsZV90IHhTZWN1cmVDb250ZXh0SGFuZGxlICk7CitleHRlcm4gdm9pZCBTZWN1cmVDb250ZXh0X1NhdmVDb250ZXh0QXNtKCBTZWN1cmVDb250ZXh0SGFuZGxlX3QgeFNlY3VyZUNvbnRleHRIYW5kbGUgKTsKKworc2VjdXJlcG9ydE5PTl9TRUNVUkVfQ0FMTEFCTEUgdm9pZCBTZWN1cmVDb250ZXh0X0xvYWRDb250ZXh0KCBTZWN1cmVDb250ZXh0SGFuZGxlX3QgeFNlY3VyZUNvbnRleHRIYW5kbGUgKQoreworCVNlY3VyZUNvbnRleHRfTG9hZENvbnRleHRBc20oIHhTZWN1cmVDb250ZXh0SGFuZGxlICk7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc2VjdXJlcG9ydE5PTl9TRUNVUkVfQ0FMTEFCTEUgdm9pZCBTZWN1cmVDb250ZXh0X1NhdmVDb250ZXh0KCBTZWN1cmVDb250ZXh0SGFuZGxlX3QgeFNlY3VyZUNvbnRleHRIYW5kbGUgKQoreworCVNlY3VyZUNvbnRleHRfU2F2ZUNvbnRleHRBc20oIHhTZWN1cmVDb250ZXh0SGFuZGxlICk7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KZGlmZiAtLWdpdCBhL1NvdXJjZS9wb3J0YWJsZS9JQVIvQVJNX0NNMjMvc2VjdXJlL3NlY3VyZV9jb250ZXh0X3BvcnRfYXNtLnMgYi9Tb3VyY2UvcG9ydGFibGUvSUFSL0FSTV9DTTIzL3NlY3VyZS9zZWN1cmVfY29udGV4dF9wb3J0X2FzbS5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1Y2VlMGMKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvcG9ydGFibGUvSUFSL0FSTV9DTTIzL3NlY3VyZS9zZWN1cmVfY29udGV4dF9wb3J0X2FzbS5zCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjIuMQorICogQ29weXJpZ2h0IChDKSAyMDE5IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKKyAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCisgKiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCisgKiB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZgorICogdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLAorICogc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCisgKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUworICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SCisgKiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIKKyAqIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIGh0dHA6Ly93d3cuRnJlZVJUT1Mub3JnCisgKiBodHRwOi8vYXdzLmFtYXpvbi5jb20vZnJlZXJ0b3MKKyAqCisgKiAxIHRhYiA9PSA0IHNwYWNlcyEKKyAqLworCisJU0VDVElPTiAudGV4dDpDT0RFOk5PUk9PVCgyKQorCVRIVU1CCisKKwlQVUJMSUMgU2VjdXJlQ29udGV4dF9Mb2FkQ29udGV4dEFzbQorCVBVQkxJQyBTZWN1cmVDb250ZXh0X1NhdmVDb250ZXh0QXNtCisKKyNpZiAoIGNvbmZpZ0VOQUJMRV9GUFUgPT0gMSApCisJI2Vycm9yIENvcnRleC1NMjMgZG9lcyBub3QgaGF2ZSBhIEZsb2F0aW5nIFBvaW50IFVuaXQgKEZQVSkgYW5kIHRoZXJlZm9yZSBjb25maWdFTkFCTEVfRlBVIG11c3QgYmUgc2V0IHRvIDAuCisjZW5kaWYKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitTZWN1cmVDb250ZXh0X0xvYWRDb250ZXh0QXNtOgorCS8qIHhTZWN1cmVDb250ZXh0SGFuZGxlIHZhbHVlIGlzIGluIHIwLiAqLworCW1ycyByMSwgaXBzcgkJCQkJCQkvKiByMSA9IElQU1IuICovCisJY2J6IHIxLCBsb2FkX2N0eF90aGVyYWRfbW9kZQkJCS8qIERvIG5vdGhpbmcgaWYgdGhlIHByb2Nlc3NvciBpcyBydW5uaW5nIGluIHRoZSBUaHJlYWQgTW9kZS4gKi8KKwlsZG1pYSByMCEsIHtyMSwgcjJ9CQkJCQkJLyogcjEgPSB4U2VjdXJlQ29udGV4dEhhbmRsZS0+cHVjQ3VycmVudFN0YWNrUG9pbnRlciwgcjIgPSB4U2VjdXJlQ29udGV4dEhhbmRsZS0+cHVjU3RhY2tMaW1pdC4gKi8KKyNpZiAoIGNvbmZpZ0VOQUJMRV9NUFUgPT0gMSApCisJbGRtaWEgcjEhLCB7cjN9CQkJCQkJCS8qIFJlYWQgQ09OVFJPTCByZWdpc3RlciB2YWx1ZSBmcm9tIHRhc2sncyBzdGFjay4gcjMgPSBDT05UUk9MLiAqLworCW1zciBjb250cm9sLCByMwkJCQkJCQkvKiBDT05UUk9MID0gcjMuICovCisjZW5kaWYgLyogY29uZmlnRU5BQkxFX01QVSAqLworCW1zciBwc3BsaW0sIHIyCQkJCQkJCS8qIFBTUExJTSA9IHIyLiAqLworCW1zciBwc3AsIHIxCQkJCQkJCQkvKiBQU1AgPSByMS4gKi8KKworCWxvYWRfY3R4X3RoZXJhZF9tb2RlOgorCQlieCBscgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK1NlY3VyZUNvbnRleHRfU2F2ZUNvbnRleHRBc206CisJLyogeFNlY3VyZUNvbnRleHRIYW5kbGUgdmFsdWUgaXMgaW4gcjAuICovCisJbXJzIHIxLCBpcHNyCQkJCQkJCS8qIHIxID0gSVBTUi4gKi8KKwljYnogcjEsIHNhdmVfY3R4X3RoZXJhZF9tb2RlCQkJLyogRG8gbm90aGluZyBpZiB0aGUgcHJvY2Vzc29yIGlzIHJ1bm5pbmcgaW4gdGhlIFRocmVhZCBNb2RlLiAqLworCW1ycyByMSwgcHNwCQkJCQkJCQkvKiByMSA9IFBTUC4gKi8KKyNpZiAoIGNvbmZpZ0VOQUJMRV9NUFUgPT0gMSApCisJbXJzIHIyLCBjb250cm9sCQkJCQkJCS8qIHIyID0gQ09OVFJPTC4gKi8KKwlzdWJzIHIxLCByMSwgIzQJCQkJCQkJLyogTWFrZSBzcGFjZSBmb3IgdGhlIENPTlRST0wgdmFsdWUgb24gdGhlIHN0YWNrLiAqLworCXN0ciByMSwgW3IwXQkJCQkJCQkvKiBTYXZlIHRoZSB0b3Agb2Ygc3RhY2sgaW4gY29udGV4dC4geFNlY3VyZUNvbnRleHRIYW5kbGUtPnB1Y0N1cnJlbnRTdGFja1BvaW50ZXIgPSByMS4gKi8KKwlzdG1pYSByMSEsIHtyMn0JCQkJCQkJLyogU3RvcmUgQ09OVFJPTCB2YWx1ZSBvbiB0aGUgc3RhY2suICovCisjZWxzZSAvKiBjb25maWdFTkFCTEVfTVBVICovCisJc3RyIHIxLCBbcjBdCQkJCQkJCS8qIFNhdmUgdGhlIHRvcCBvZiBzdGFjayBpbiBjb250ZXh0LiB4U2VjdXJlQ29udGV4dEhhbmRsZS0+cHVjQ3VycmVudFN0YWNrUG9pbnRlciA9IHIxLiAqLworI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9NUFUgKi8KKwltb3ZzIHIxLCAjMAkJCQkJCQkJLyogcjEgPSBzZWN1cmVjb250ZXh0Tk9fU1RBQ0suICovCisJbXNyIHBzcGxpbSwgcjEJCQkJCQkJLyogUFNQTElNID0gc2VjdXJlY29udGV4dE5PX1NUQUNLLiAqLworCW1zciBwc3AsIHIxCQkJCQkJCQkvKiBQU1AgPSBzZWN1cmVjb250ZXh0Tk9fU1RBQ0sgaS5lLiBObyBzdGFjayBmb3IgdGhyZWFkIG1vZGUgdW50aWwgbmV4dCB0YXNrJ3MgY29udGV4dCBpcyBsb2FkZWQuICovCisKKwlzYXZlX2N0eF90aGVyYWRfbW9kZToKKwkJYnggbHIKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJRU5ECmRpZmYgLS1naXQgYS9Tb3VyY2UvcG9ydGFibGUvSUFSL0FSTV9DTTIzL3NlY3VyZS9zZWN1cmVfaGVhcC5jIGIvU291cmNlL3BvcnRhYmxlL0lBUi9BUk1fQ00yMy9zZWN1cmUvc2VjdXJlX2hlYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGZjZTVjCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL3BvcnRhYmxlL0lBUi9BUk1fQ00yMy9zZWN1cmUvc2VjdXJlX2hlYXAuYwpAQCAtMCwwICsxLDQ1MCBAQAorLyoKKyAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMi4xCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgorICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KKyAqIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KKyAqIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mCisgKiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCisgKiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKKyAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTCisgKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IKKyAqIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUgorICogSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogaHR0cDovL3d3dy5GcmVlUlRPUy5vcmcKKyAqIGh0dHA6Ly9hd3MuYW1hem9uLmNvbS9mcmVlcnRvcworICoKKyAqIDEgdGFiID09IDQgc3BhY2VzIQorICovCisKKy8qIFN0YW5kYXJkIGluY2x1ZGVzLiAqLworI2luY2x1ZGUgPHN0ZGludC5oPgorCisvKiBTZWN1cmUgY29udGV4dCBoZWFwIGluY2x1ZGVzLiAqLworI2luY2x1ZGUgInNlY3VyZV9oZWFwLmgiCisKKy8qIFNlY3VyZSBwb3J0IG1hY3Jvcy4gKi8KKyNpbmNsdWRlICJzZWN1cmVfcG9ydF9tYWNyb3MuaCIKKworLyoqCisgKiBAYnJpZWYgVG90YWwgaGVhcCBzaXplLgorICovCisjZGVmaW5lIHNlY3VyZWNvbmZpZ1RPVEFMX0hFQVBfU0laRQkJKCAoICggc2l6ZV90ICkgKCAxMCAqIDEwMjQgKSApICkKKworLyogTm8gdGVzdCBtYXJrZXIgYnkgZGVmYXVsdC4gKi8KKyNpZm5kZWYgbXRDT1ZFUkFHRV9URVNUX01BUktFUgorCSNkZWZpbmUgbXRDT1ZFUkFHRV9URVNUX01BUktFUigpCisjZW5kaWYKKworLyogTm8gdHJhY2luZyBieSBkZWZhdWx0LiAqLworI2lmbmRlZiB0cmFjZU1BTExPQworCSNkZWZpbmUgdHJhY2VNQUxMT0MoIHB2UmV0dXJuLCB4V2FudGVkU2l6ZSApCisjZW5kaWYKKworLyogTm8gdHJhY2luZyBieSBkZWZhdWx0LiAqLworI2lmbmRlZiB0cmFjZUZSRUUKKwkjZGVmaW5lIHRyYWNlRlJFRSggcHYsIHhCbG9ja1NpemUgKQorI2VuZGlmCisKKy8qIEJsb2NrIHNpemVzIG11c3Qgbm90IGdldCB0b28gc21hbGwuICovCisjZGVmaW5lIHNlY3VyZWhlYXBNSU5JTVVNX0JMT0NLX1NJWkUJKCAoIHNpemVfdCApICggeEhlYXBTdHJ1Y3RTaXplIDw8IDEgKSApCisKKy8qIEFzc3VtZXMgOGJpdCBieXRlcyEgKi8KKyNkZWZpbmUgc2VjdXJlaGVhcEJJVFNfUEVSX0JZVEUJCQkoICggc2l6ZV90ICkgOCApCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogQWxsb2NhdGUgdGhlIG1lbW9yeSBmb3IgdGhlIGhlYXAuICovCisjaWYoIGNvbmZpZ0FQUExJQ0FUSU9OX0FMTE9DQVRFRF9IRUFQID09IDEgKQorCS8qIFRoZSBhcHBsaWNhdGlvbiB3cml0ZXIgaGFzIGFscmVhZHkgZGVmaW5lZCB0aGUgYXJyYXkgdXNlZCBmb3IgdGhlIFJUT1MKKwkgKiBoZWFwIC0gcHJvYmFibHkgc28gaXQgY2FuIGJlIHBsYWNlZCBpbiBhIHNwZWNpYWwgc2VnbWVudCBvciBhZGRyZXNzLiAqLworCWV4dGVybiB1aW50OF90IHVjSGVhcFsgc2VjdXJlY29uZmlnVE9UQUxfSEVBUF9TSVpFIF07CisjZWxzZSAvKiBjb25maWdBUFBMSUNBVElPTl9BTExPQ0FURURfSEVBUCAqLworCXN0YXRpYyB1aW50OF90IHVjSGVhcFsgc2VjdXJlY29uZmlnVE9UQUxfSEVBUF9TSVpFIF07CisjZW5kaWYgLyogY29uZmlnQVBQTElDQVRJT05fQUxMT0NBVEVEX0hFQVAgKi8KKworLyoqCisgKiBAYnJpZWYgVGhlIGxpbmtlZCBsaXN0IHN0cnVjdHVyZS4KKyAqCisgKiBUaGlzIGlzIHVzZWQgdG8gbGluayBmcmVlIGJsb2NrcyBpbiBvcmRlciBvZiB0aGVpciBtZW1vcnkgYWRkcmVzcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgQV9CTE9DS19MSU5LCit7CisJc3RydWN0IEFfQkxPQ0tfTElOSyAqcHhOZXh0RnJlZUJsb2NrOwkvKio8IFRoZSBuZXh0IGZyZWUgYmxvY2sgaW4gdGhlIGxpc3QuICovCisJc2l6ZV90IHhCbG9ja1NpemU7CQkJCQkJLyoqPCBUaGUgc2l6ZSBvZiB0aGUgZnJlZSBibG9jay4gKi8KK30gQmxvY2tMaW5rX3Q7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqCisgKiBAYnJpZWYgQ2FsbGVkIGF1dG9tYXRpY2FsbHkgdG8gc2V0dXAgdGhlIHJlcXVpcmVkIGhlYXAgc3RydWN0dXJlcyB0aGUgZmlyc3QKKyAqIHRpbWUgcHZQb3J0TWFsbG9jKCkgaXMgY2FsbGVkLgorICovCitzdGF0aWMgdm9pZCBwcnZIZWFwSW5pdCggdm9pZCApOworCisvKioKKyAqIEBicmllZiBJbnNlcnRzIGEgYmxvY2sgb2YgbWVtb3J5IHRoYXQgaXMgYmVpbmcgZnJlZWQgaW50byB0aGUgY29ycmVjdAorICogcG9zaXRpb24gaW4gdGhlIGxpc3Qgb2YgZnJlZSBtZW1vcnkgYmxvY2tzLgorICoKKyAqIFRoZSBibG9jayBiZWluZyBmcmVlZCB3aWxsIGJlIG1lcmdlZCB3aXRoIHRoZSBibG9jayBpbiBmcm9udCBpdCBhbmQvb3IgdGhlCisgKiBibG9jayBiZWhpbmQgaXQgaWYgdGhlIG1lbW9yeSBibG9ja3MgYXJlIGFkamFjZW50IHRvIGVhY2ggb3RoZXIuCisgKgorICogQHBhcmFtW2luXSBweEJsb2NrVG9JbnNlcnQgVGhlIGJsb2NrIGJlaW5nIGZyZWVkLgorICovCitzdGF0aWMgdm9pZCBwcnZJbnNlcnRCbG9ja0ludG9GcmVlTGlzdCggQmxvY2tMaW5rX3QgKnB4QmxvY2tUb0luc2VydCApOworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKgorICogQGJyaWVmIFRoZSBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgcGxhY2VkIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBhbGxvY2F0ZWQKKyAqIG1lbW9yeSBibG9jayBtdXN0IGJ5IGNvcnJlY3RseSBieXRlIGFsaWduZWQuCisgKi8KK3N0YXRpYyBjb25zdCBzaXplX3QgeEhlYXBTdHJ1Y3RTaXplID0gKCBzaXplb2YoIEJsb2NrTGlua190ICkgKyAoICggc2l6ZV90ICkgKCBzZWN1cmVwb3J0QllURV9BTElHTk1FTlQgLSAxICkgKSApICYgfiggKCBzaXplX3QgKSBzZWN1cmVwb3J0QllURV9BTElHTk1FTlRfTUFTSyApOworCisvKioKKyAqIEBicmllZiBDcmVhdGUgYSBjb3VwbGUgb2YgbGlzdCBsaW5rcyB0byBtYXJrIHRoZSBzdGFydCBhbmQgZW5kIG9mIHRoZSBsaXN0LgorICovCitzdGF0aWMgQmxvY2tMaW5rX3QgeFN0YXJ0LCAqcHhFbmQgPSBOVUxMOworCisvKioKKyAqIEBicmllZiBLZWVwcyB0cmFjayBvZiB0aGUgbnVtYmVyIG9mIGZyZWUgYnl0ZXMgcmVtYWluaW5nLCBidXQgc2F5cyBub3RoaW5nCisgKiBhYm91dCBmcmFnbWVudGF0aW9uLgorICovCitzdGF0aWMgc2l6ZV90IHhGcmVlQnl0ZXNSZW1haW5pbmcgPSAwVTsKK3N0YXRpYyBzaXplX3QgeE1pbmltdW1FdmVyRnJlZUJ5dGVzUmVtYWluaW5nID0gMFU7CisKKy8qKgorICogQGJyaWVmIEdldHMgc2V0IHRvIHRoZSB0b3AgYml0IG9mIGFuIHNpemVfdCB0eXBlLgorICoKKyAqIFdoZW4gdGhpcyBiaXQgaW4gdGhlIHhCbG9ja1NpemUgbWVtYmVyIG9mIGFuIEJsb2NrTGlua190IHN0cnVjdHVyZSBpcyBzZXQKKyAqIHRoZW4gdGhlIGJsb2NrIGJlbG9uZ3MgdG8gdGhlIGFwcGxpY2F0aW9uLiBXaGVuIHRoZSBiaXQgaXMgZnJlZSB0aGUgYmxvY2sgaXMKKyAqIHN0aWxsIHBhcnQgb2YgdGhlIGZyZWUgaGVhcCBzcGFjZS4KKyAqLworc3RhdGljIHNpemVfdCB4QmxvY2tBbGxvY2F0ZWRCaXQgPSAwOworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB2b2lkIHBydkhlYXBJbml0KCB2b2lkICkKK3sKK0Jsb2NrTGlua190ICpweEZpcnN0RnJlZUJsb2NrOwordWludDhfdCAqcHVjQWxpZ25lZEhlYXA7CitzaXplX3QgdXhBZGRyZXNzOworc2l6ZV90IHhUb3RhbEhlYXBTaXplID0gc2VjdXJlY29uZmlnVE9UQUxfSEVBUF9TSVpFOworCisJLyogRW5zdXJlIHRoZSBoZWFwIHN0YXJ0cyBvbiBhIGNvcnJlY3RseSBhbGlnbmVkIGJvdW5kYXJ5LiAqLworCXV4QWRkcmVzcyA9ICggc2l6ZV90ICkgdWNIZWFwOworCisJaWYoICggdXhBZGRyZXNzICYgc2VjdXJlcG9ydEJZVEVfQUxJR05NRU5UX01BU0sgKSAhPSAwICkKKwl7CisJCXV4QWRkcmVzcyArPSAoIHNlY3VyZXBvcnRCWVRFX0FMSUdOTUVOVCAtIDEgKTsKKwkJdXhBZGRyZXNzICY9IH4oICggc2l6ZV90ICkgc2VjdXJlcG9ydEJZVEVfQUxJR05NRU5UX01BU0sgKTsKKwkJeFRvdGFsSGVhcFNpemUgLT0gdXhBZGRyZXNzIC0gKCBzaXplX3QgKSB1Y0hlYXA7CisJfQorCisJcHVjQWxpZ25lZEhlYXAgPSAoIHVpbnQ4X3QgKiApIHV4QWRkcmVzczsKKworCS8qIHhTdGFydCBpcyB1c2VkIHRvIGhvbGQgYSBwb2ludGVyIHRvIHRoZSBmaXJzdCBpdGVtIGluIHRoZSBsaXN0IG9mIGZyZWUKKwkgKiBibG9ja3MuICBUaGUgdm9pZCBjYXN0IGlzIHVzZWQgdG8gcHJldmVudCBjb21waWxlciB3YXJuaW5ncy4gKi8KKwl4U3RhcnQucHhOZXh0RnJlZUJsb2NrID0gKCB2b2lkICogKSBwdWNBbGlnbmVkSGVhcDsKKwl4U3RhcnQueEJsb2NrU2l6ZSA9ICggc2l6ZV90ICkgMDsKKworCS8qIHB4RW5kIGlzIHVzZWQgdG8gbWFyayB0aGUgZW5kIG9mIHRoZSBsaXN0IG9mIGZyZWUgYmxvY2tzIGFuZCBpcyBpbnNlcnRlZAorCSAqIGF0IHRoZSBlbmQgb2YgdGhlIGhlYXAgc3BhY2UuICovCisJdXhBZGRyZXNzID0gKCAoIHNpemVfdCApIHB1Y0FsaWduZWRIZWFwICkgKyB4VG90YWxIZWFwU2l6ZTsKKwl1eEFkZHJlc3MgLT0geEhlYXBTdHJ1Y3RTaXplOworCXV4QWRkcmVzcyAmPSB+KCAoIHNpemVfdCApIHNlY3VyZXBvcnRCWVRFX0FMSUdOTUVOVF9NQVNLICk7CisJcHhFbmQgPSAoIHZvaWQgKiApIHV4QWRkcmVzczsKKwlweEVuZC0+eEJsb2NrU2l6ZSA9IDA7CisJcHhFbmQtPnB4TmV4dEZyZWVCbG9jayA9IE5VTEw7CisKKwkvKiBUbyBzdGFydCB3aXRoIHRoZXJlIGlzIGEgc2luZ2xlIGZyZWUgYmxvY2sgdGhhdCBpcyBzaXplZCB0byB0YWtlIHVwIHRoZQorCSAqIGVudGlyZSBoZWFwIHNwYWNlLCBtaW51cyB0aGUgc3BhY2UgdGFrZW4gYnkgcHhFbmQuICovCisJcHhGaXJzdEZyZWVCbG9jayA9ICggdm9pZCAqICkgcHVjQWxpZ25lZEhlYXA7CisJcHhGaXJzdEZyZWVCbG9jay0+eEJsb2NrU2l6ZSA9IHV4QWRkcmVzcyAtICggc2l6ZV90ICkgcHhGaXJzdEZyZWVCbG9jazsKKwlweEZpcnN0RnJlZUJsb2NrLT5weE5leHRGcmVlQmxvY2sgPSBweEVuZDsKKworCS8qIE9ubHkgb25lIGJsb2NrIGV4aXN0cyAtIGFuZCBpdCBjb3ZlcnMgdGhlIGVudGlyZSB1c2FibGUgaGVhcCBzcGFjZS4gKi8KKwl4TWluaW11bUV2ZXJGcmVlQnl0ZXNSZW1haW5pbmcgPSBweEZpcnN0RnJlZUJsb2NrLT54QmxvY2tTaXplOworCXhGcmVlQnl0ZXNSZW1haW5pbmcgPSBweEZpcnN0RnJlZUJsb2NrLT54QmxvY2tTaXplOworCisJLyogV29yayBvdXQgdGhlIHBvc2l0aW9uIG9mIHRoZSB0b3AgYml0IGluIGEgc2l6ZV90IHZhcmlhYmxlLiAqLworCXhCbG9ja0FsbG9jYXRlZEJpdCA9ICggKCBzaXplX3QgKSAxICkgPDwgKCAoIHNpemVvZiggc2l6ZV90ICkgKiBzZWN1cmVoZWFwQklUU19QRVJfQllURSApIC0gMSApOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB2b2lkIHBydkluc2VydEJsb2NrSW50b0ZyZWVMaXN0KCBCbG9ja0xpbmtfdCAqcHhCbG9ja1RvSW5zZXJ0ICkKK3sKK0Jsb2NrTGlua190ICpweEl0ZXJhdG9yOwordWludDhfdCAqcHVjOworCisJLyogSXRlcmF0ZSB0aHJvdWdoIHRoZSBsaXN0IHVudGlsIGEgYmxvY2sgaXMgZm91bmQgdGhhdCBoYXMgYSBoaWdoZXIgYWRkcmVzcworCSAqIHRoYW4gdGhlIGJsb2NrIGJlaW5nIGluc2VydGVkLiAqLworCWZvciggcHhJdGVyYXRvciA9ICZ4U3RhcnQ7IHB4SXRlcmF0b3ItPnB4TmV4dEZyZWVCbG9jayA8IHB4QmxvY2tUb0luc2VydDsgcHhJdGVyYXRvciA9IHB4SXRlcmF0b3ItPnB4TmV4dEZyZWVCbG9jayApCisJeworCQkvKiBOb3RoaW5nIHRvIGRvIGhlcmUsIGp1c3QgaXRlcmF0ZSB0byB0aGUgcmlnaHQgcG9zaXRpb24uICovCisJfQorCisJLyogRG8gdGhlIGJsb2NrIGJlaW5nIGluc2VydGVkLCBhbmQgdGhlIGJsb2NrIGl0IGlzIGJlaW5nIGluc2VydGVkIGFmdGVyCisJICogbWFrZSBhIGNvbnRpZ3VvdXMgYmxvY2sgb2YgbWVtb3J5PyAqLworCXB1YyA9ICggdWludDhfdCAqICkgcHhJdGVyYXRvcjsKKwlpZiggKCBwdWMgKyBweEl0ZXJhdG9yLT54QmxvY2tTaXplICkgPT0gKCB1aW50OF90ICogKSBweEJsb2NrVG9JbnNlcnQgKQorCXsKKwkJcHhJdGVyYXRvci0+eEJsb2NrU2l6ZSArPSBweEJsb2NrVG9JbnNlcnQtPnhCbG9ja1NpemU7CisJCXB4QmxvY2tUb0luc2VydCA9IHB4SXRlcmF0b3I7CisJfQorCWVsc2UKKwl7CisJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwl9CisKKwkvKiBEbyB0aGUgYmxvY2sgYmVpbmcgaW5zZXJ0ZWQsIGFuZCB0aGUgYmxvY2sgaXQgaXMgYmVpbmcgaW5zZXJ0ZWQgYmVmb3JlCisJICogbWFrZSBhIGNvbnRpZ3VvdXMgYmxvY2sgb2YgbWVtb3J5PyAqLworCXB1YyA9ICggdWludDhfdCAqICkgcHhCbG9ja1RvSW5zZXJ0OworCWlmKCAoIHB1YyArIHB4QmxvY2tUb0luc2VydC0+eEJsb2NrU2l6ZSApID09ICggdWludDhfdCAqICkgcHhJdGVyYXRvci0+cHhOZXh0RnJlZUJsb2NrICkKKwl7CisJCWlmKCBweEl0ZXJhdG9yLT5weE5leHRGcmVlQmxvY2sgIT0gcHhFbmQgKQorCQl7CisJCQkvKiBGb3JtIG9uZSBiaWcgYmxvY2sgZnJvbSB0aGUgdHdvIGJsb2Nrcy4gKi8KKwkJCXB4QmxvY2tUb0luc2VydC0+eEJsb2NrU2l6ZSArPSBweEl0ZXJhdG9yLT5weE5leHRGcmVlQmxvY2stPnhCbG9ja1NpemU7CisJCQlweEJsb2NrVG9JbnNlcnQtPnB4TmV4dEZyZWVCbG9jayA9IHB4SXRlcmF0b3ItPnB4TmV4dEZyZWVCbG9jay0+cHhOZXh0RnJlZUJsb2NrOworCQl9CisJCWVsc2UKKwkJeworCQkJcHhCbG9ja1RvSW5zZXJ0LT5weE5leHRGcmVlQmxvY2sgPSBweEVuZDsKKwkJfQorCX0KKwllbHNlCisJeworCQlweEJsb2NrVG9JbnNlcnQtPnB4TmV4dEZyZWVCbG9jayA9IHB4SXRlcmF0b3ItPnB4TmV4dEZyZWVCbG9jazsKKwl9CisKKwkvKiBJZiB0aGUgYmxvY2sgYmVpbmcgaW5zZXJ0ZWQgcGx1Z2dlZCBhIGdhYiwgc28gd2FzIG1lcmdlZCB3aXRoIHRoZSBibG9jaworCSAqIGJlZm9yZSBhbmQgdGhlIGJsb2NrIGFmdGVyLCB0aGVuIGl0J3MgcHhOZXh0RnJlZUJsb2NrIHBvaW50ZXIgd2lsbCBoYXZlCisJICogYWxyZWFkeSBiZWVuIHNldCwgYW5kIHNob3VsZCBub3QgYmUgc2V0IGhlcmUgYXMgdGhhdCB3b3VsZCBtYWtlIGl0IHBvaW50CisJICogdG8gaXRzZWxmLiAqLworCWlmKCBweEl0ZXJhdG9yICE9IHB4QmxvY2tUb0luc2VydCApCisJeworCQlweEl0ZXJhdG9yLT5weE5leHRGcmVlQmxvY2sgPSBweEJsb2NrVG9JbnNlcnQ7CisJfQorCWVsc2UKKwl7CisJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwl9Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCAqcHZQb3J0TWFsbG9jKCBzaXplX3QgeFdhbnRlZFNpemUgKQoreworQmxvY2tMaW5rX3QgKnB4QmxvY2ssICpweFByZXZpb3VzQmxvY2ssICpweE5ld0Jsb2NrTGluazsKK3ZvaWQgKnB2UmV0dXJuID0gTlVMTDsKKworCS8qIElmIHRoaXMgaXMgdGhlIGZpcnN0IGNhbGwgdG8gbWFsbG9jIHRoZW4gdGhlIGhlYXAgd2lsbCByZXF1aXJlCisJICogaW5pdGlhbGlzYXRpb24gdG8gc2V0dXAgdGhlIGxpc3Qgb2YgZnJlZSBibG9ja3MuICovCisJaWYoIHB4RW5kID09IE5VTEwgKQorCXsKKwkJcHJ2SGVhcEluaXQoKTsKKwl9CisJZWxzZQorCXsKKwkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCX0KKworCS8qIENoZWNrIHRoZSByZXF1ZXN0ZWQgYmxvY2sgc2l6ZSBpcyBub3Qgc28gbGFyZ2UgdGhhdCB0aGUgdG9wIGJpdCBpcyBzZXQuCisJICogVGhlIHRvcCBiaXQgb2YgdGhlIGJsb2NrIHNpemUgbWVtYmVyIG9mIHRoZSBCbG9ja0xpbmtfdCBzdHJ1Y3R1cmUgaXMgdXNlZAorCSAqIHRvIGRldGVybWluZSB3aG8gb3ducyB0aGUgYmxvY2sgLSB0aGUgYXBwbGljYXRpb24gb3IgdGhlIGtlcm5lbCwgc28gaXQKKwkgKiBtdXN0IGJlIGZyZWUuICovCisJaWYoICggeFdhbnRlZFNpemUgJiB4QmxvY2tBbGxvY2F0ZWRCaXQgKSA9PSAwICkKKwl7CisJCS8qIFRoZSB3YW50ZWQgc2l6ZSBpcyBpbmNyZWFzZWQgc28gaXQgY2FuIGNvbnRhaW4gYSBCbG9ja0xpbmtfdAorCQkgKiBzdHJ1Y3R1cmUgaW4gYWRkaXRpb24gdG8gdGhlIHJlcXVlc3RlZCBhbW91bnQgb2YgYnl0ZXMuICovCisJCWlmKCB4V2FudGVkU2l6ZSA+IDAgKQorCQl7CisJCQl4V2FudGVkU2l6ZSArPSB4SGVhcFN0cnVjdFNpemU7CisKKwkJCS8qIEVuc3VyZSB0aGF0IGJsb2NrcyBhcmUgYWx3YXlzIGFsaWduZWQgdG8gdGhlIHJlcXVpcmVkIG51bWJlciBvZgorCQkJICogYnl0ZXMuICovCisJCQlpZiggKCB4V2FudGVkU2l6ZSAmIHNlY3VyZXBvcnRCWVRFX0FMSUdOTUVOVF9NQVNLICkgIT0gMHgwMCApCisJCQl7CisJCQkJLyogQnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuICovCisJCQkJeFdhbnRlZFNpemUgKz0gKCBzZWN1cmVwb3J0QllURV9BTElHTk1FTlQgLSAoIHhXYW50ZWRTaXplICYgc2VjdXJlcG9ydEJZVEVfQUxJR05NRU5UX01BU0sgKSApOworCQkJCXNlY3VyZXBvcnRBU1NFUlQoICggeFdhbnRlZFNpemUgJiBzZWN1cmVwb3J0QllURV9BTElHTk1FTlRfTUFTSyApID09IDAgKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCX0KKworCQlpZiggKCB4V2FudGVkU2l6ZSA+IDAgKSAmJiAoIHhXYW50ZWRTaXplIDw9IHhGcmVlQnl0ZXNSZW1haW5pbmcgKSApCisJCXsKKwkJCS8qIFRyYXZlcnNlIHRoZSBsaXN0IGZyb20gdGhlIHN0YXJ0IChsb3dlc3QgYWRkcmVzcykgYmxvY2sgdW50aWwKKwkJCSAqIG9uZSBvZiBhZGVxdWF0ZSBzaXplIGlzIGZvdW5kLiAqLworCQkJcHhQcmV2aW91c0Jsb2NrID0gJnhTdGFydDsKKwkJCXB4QmxvY2sgPSB4U3RhcnQucHhOZXh0RnJlZUJsb2NrOworCQkJd2hpbGUoICggcHhCbG9jay0+eEJsb2NrU2l6ZSA8IHhXYW50ZWRTaXplICkgJiYgKCBweEJsb2NrLT5weE5leHRGcmVlQmxvY2sgIT0gTlVMTCApICkKKwkJCXsKKwkJCQlweFByZXZpb3VzQmxvY2sgPSBweEJsb2NrOworCQkJCXB4QmxvY2sgPSBweEJsb2NrLT5weE5leHRGcmVlQmxvY2s7CisJCQl9CisKKwkJCS8qIElmIHRoZSBlbmQgbWFya2VyIHdhcyByZWFjaGVkIHRoZW4gYSBibG9jayBvZiBhZGVxdWF0ZSBzaXplIHdhcworCQkJICogbm90IGZvdW5kLiAqLworCQkJaWYoIHB4QmxvY2sgIT0gcHhFbmQgKQorCQkJeworCQkJCS8qIFJldHVybiB0aGUgbWVtb3J5IHNwYWNlIHBvaW50ZWQgdG8gLSBqdW1waW5nIG92ZXIgdGhlCisJCQkJICogQmxvY2tMaW5rX3Qgc3RydWN0dXJlIGF0IGl0cyBzdGFydC4gKi8KKwkJCQlwdlJldHVybiA9ICggdm9pZCAqICkgKCAoICggdWludDhfdCAqICkgcHhQcmV2aW91c0Jsb2NrLT5weE5leHRGcmVlQmxvY2sgKSArIHhIZWFwU3RydWN0U2l6ZSApOworCisJCQkJLyogVGhpcyBibG9jayBpcyBiZWluZyByZXR1cm5lZCBmb3IgdXNlIHNvIG11c3QgYmUgdGFrZW4gb3V0CisJCQkJICogb2YgdGhlIGxpc3Qgb2YgZnJlZSBibG9ja3MuICovCisJCQkJcHhQcmV2aW91c0Jsb2NrLT5weE5leHRGcmVlQmxvY2sgPSBweEJsb2NrLT5weE5leHRGcmVlQmxvY2s7CisKKwkJCQkvKiBJZiB0aGUgYmxvY2sgaXMgbGFyZ2VyIHRoYW4gcmVxdWlyZWQgaXQgY2FuIGJlIHNwbGl0IGludG8KKwkJCQkgKiB0d28uICovCisJCQkJaWYoICggcHhCbG9jay0+eEJsb2NrU2l6ZSAtIHhXYW50ZWRTaXplICkgPiBzZWN1cmVoZWFwTUlOSU1VTV9CTE9DS19TSVpFICkKKwkJCQl7CisJCQkJCS8qIFRoaXMgYmxvY2sgaXMgdG8gYmUgc3BsaXQgaW50byB0d28uICBDcmVhdGUgYSBuZXcKKwkJCQkJICogYmxvY2sgZm9sbG93aW5nIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWVzdGVkLiBUaGUgdm9pZAorCQkJCQkgKiBjYXN0IGlzIHVzZWQgdG8gcHJldmVudCBieXRlIGFsaWdubWVudCB3YXJuaW5ncyBmcm9tIHRoZQorCQkJCQkgKiBjb21waWxlci4gKi8KKwkJCQkJcHhOZXdCbG9ja0xpbmsgPSAoIHZvaWQgKiApICggKCAoIHVpbnQ4X3QgKiApIHB4QmxvY2sgKSArIHhXYW50ZWRTaXplICk7CisJCQkJCXNlY3VyZXBvcnRBU1NFUlQoICggKCAoIHNpemVfdCApIHB4TmV3QmxvY2tMaW5rICkgJiBzZWN1cmVwb3J0QllURV9BTElHTk1FTlRfTUFTSyApID09IDAgKTsKKworCQkJCQkvKiBDYWxjdWxhdGUgdGhlIHNpemVzIG9mIHR3byBibG9ja3Mgc3BsaXQgZnJvbSB0aGUgc2luZ2xlCisJCQkJCSAqIGJsb2NrLiAqLworCQkJCQlweE5ld0Jsb2NrTGluay0+eEJsb2NrU2l6ZSA9IHB4QmxvY2stPnhCbG9ja1NpemUgLSB4V2FudGVkU2l6ZTsKKwkJCQkJcHhCbG9jay0+eEJsb2NrU2l6ZSA9IHhXYW50ZWRTaXplOworCisJCQkJCS8qIEluc2VydCB0aGUgbmV3IGJsb2NrIGludG8gdGhlIGxpc3Qgb2YgZnJlZSBibG9ja3MuICovCisJCQkJCXBydkluc2VydEJsb2NrSW50b0ZyZWVMaXN0KCBweE5ld0Jsb2NrTGluayApOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCQkJfQorCisJCQkJeEZyZWVCeXRlc1JlbWFpbmluZyAtPSBweEJsb2NrLT54QmxvY2tTaXplOworCisJCQkJaWYoIHhGcmVlQnl0ZXNSZW1haW5pbmcgPCB4TWluaW11bUV2ZXJGcmVlQnl0ZXNSZW1haW5pbmcgKQorCQkJCXsKKwkJCQkJeE1pbmltdW1FdmVyRnJlZUJ5dGVzUmVtYWluaW5nID0geEZyZWVCeXRlc1JlbWFpbmluZzsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCQkJCX0KKworCQkJCS8qIFRoZSBibG9jayBpcyBiZWluZyByZXR1cm5lZCAtIGl0IGlzIGFsbG9jYXRlZCBhbmQgb3duZWQgYnkKKwkJCQkgKiB0aGUgYXBwbGljYXRpb24gYW5kIGhhcyBubyAibmV4dCIgYmxvY2suICovCisJCQkJcHhCbG9jay0+eEJsb2NrU2l6ZSB8PSB4QmxvY2tBbGxvY2F0ZWRCaXQ7CisJCQkJcHhCbG9jay0+cHhOZXh0RnJlZUJsb2NrID0gTlVMTDsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCX0KKworCXRyYWNlTUFMTE9DKCBwdlJldHVybiwgeFdhbnRlZFNpemUgKTsKKworCSNpZiggc2VjdXJlY29uZmlnVVNFX01BTExPQ19GQUlMRURfSE9PSyA9PSAxICkKKwl7CisJCWlmKCBwdlJldHVybiA9PSBOVUxMICkKKwkJeworCQkJZXh0ZXJuIHZvaWQgdkFwcGxpY2F0aW9uTWFsbG9jRmFpbGVkSG9vayggdm9pZCApOworCQkJdkFwcGxpY2F0aW9uTWFsbG9jRmFpbGVkSG9vaygpOworCQl9CisJCWVsc2UKKwkJeworCQkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCQl9CisJfQorCSNlbmRpZgorCisJc2VjdXJlcG9ydEFTU0VSVCggKCAoICggc2l6ZV90ICkgcHZSZXR1cm4gKSAmICggc2l6ZV90ICkgc2VjdXJlcG9ydEJZVEVfQUxJR05NRU5UX01BU0sgKSA9PSAwICk7CisJcmV0dXJuIHB2UmV0dXJuOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgdlBvcnRGcmVlKCB2b2lkICpwdiApCit7Cit1aW50OF90ICpwdWMgPSAoIHVpbnQ4X3QgKiApIHB2OworQmxvY2tMaW5rX3QgKnB4TGluazsKKworCWlmKCBwdiAhPSBOVUxMICkKKwl7CisJCS8qIFRoZSBtZW1vcnkgYmVpbmcgZnJlZWQgd2lsbCBoYXZlIGFuIEJsb2NrTGlua190IHN0cnVjdHVyZSBpbW1lZGlhdGVseQorCQkgKiBiZWZvcmUgaXQuICovCisJCXB1YyAtPSB4SGVhcFN0cnVjdFNpemU7CisKKwkJLyogVGhpcyBjYXN0aW5nIGlzIHRvIGtlZXAgdGhlIGNvbXBpbGVyIGZyb20gaXNzdWluZyB3YXJuaW5ncy4gKi8KKwkJcHhMaW5rID0gKCB2b2lkICogKSBwdWM7CisKKwkJLyogQ2hlY2sgdGhlIGJsb2NrIGlzIGFjdHVhbGx5IGFsbG9jYXRlZC4gKi8KKwkJc2VjdXJlcG9ydEFTU0VSVCggKCBweExpbmstPnhCbG9ja1NpemUgJiB4QmxvY2tBbGxvY2F0ZWRCaXQgKSAhPSAwICk7CisJCXNlY3VyZXBvcnRBU1NFUlQoIHB4TGluay0+cHhOZXh0RnJlZUJsb2NrID09IE5VTEwgKTsKKworCQlpZiggKCBweExpbmstPnhCbG9ja1NpemUgJiB4QmxvY2tBbGxvY2F0ZWRCaXQgKSAhPSAwICkKKwkJeworCQkJaWYoIHB4TGluay0+cHhOZXh0RnJlZUJsb2NrID09IE5VTEwgKQorCQkJeworCQkJCS8qIFRoZSBibG9jayBpcyBiZWluZyByZXR1cm5lZCB0byB0aGUgaGVhcCAtIGl0IGlzIG5vIGxvbmdlcgorCQkJCSAqIGFsbG9jYXRlZC4gKi8KKwkJCQlweExpbmstPnhCbG9ja1NpemUgJj0gfnhCbG9ja0FsbG9jYXRlZEJpdDsKKworCQkJCXNlY3VyZXBvcnRESVNBQkxFX05PTl9TRUNVUkVfSU5URVJSVVBUUygpOworCQkJCXsKKwkJCQkJLyogQWRkIHRoaXMgYmxvY2sgdG8gdGhlIGxpc3Qgb2YgZnJlZSBibG9ja3MuICovCisJCQkJCXhGcmVlQnl0ZXNSZW1haW5pbmcgKz0gcHhMaW5rLT54QmxvY2tTaXplOworCQkJCQl0cmFjZUZSRUUoIHB2LCBweExpbmstPnhCbG9ja1NpemUgKTsKKwkJCQkJcHJ2SW5zZXJ0QmxvY2tJbnRvRnJlZUxpc3QoICggKCBCbG9ja0xpbmtfdCAqICkgcHhMaW5rICkgKTsKKwkJCQl9CisJCQkJc2VjdXJlcG9ydEVOQUJMRV9OT05fU0VDVVJFX0lOVEVSUlVQVFMoKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCX0KKwl9Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc2l6ZV90IHhQb3J0R2V0RnJlZUhlYXBTaXplKCB2b2lkICkKK3sKKwlyZXR1cm4geEZyZWVCeXRlc1JlbWFpbmluZzsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzaXplX3QgeFBvcnRHZXRNaW5pbXVtRXZlckZyZWVIZWFwU2l6ZSggdm9pZCApCit7CisJcmV0dXJuIHhNaW5pbXVtRXZlckZyZWVCeXRlc1JlbWFpbmluZzsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIHZQb3J0SW5pdGlhbGlzZUJsb2Nrcyggdm9pZCApCit7CisJLyogVGhpcyBqdXN0IGV4aXN0cyB0byBrZWVwIHRoZSBsaW5rZXIgcXVpZXQuICovCit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KZGlmZiAtLWdpdCBhL1NvdXJjZS9wb3J0YWJsZS9JQVIvQVJNX0NNMjMvc2VjdXJlL3NlY3VyZV9oZWFwLmggYi9Tb3VyY2UvcG9ydGFibGUvSUFSL0FSTV9DTTIzL3NlY3VyZS9zZWN1cmVfaGVhcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5ZTRmMmEKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvcG9ydGFibGUvSUFSL0FSTV9DTTIzL3NlY3VyZS9zZWN1cmVfaGVhcC5oCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjIuMQorICogQ29weXJpZ2h0IChDKSAyMDE5IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKKyAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCisgKiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCisgKiB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZgorICogdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLAorICogc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCisgKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUworICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SCisgKiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIKKyAqIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIGh0dHA6Ly93d3cuRnJlZVJUT1Mub3JnCisgKiBodHRwOi8vYXdzLmFtYXpvbi5jb20vZnJlZXJ0b3MKKyAqCisgKiAxIHRhYiA9PSA0IHNwYWNlcyEKKyAqLworCisjaWZuZGVmIF9fU0VDVVJFX0hFQVBfSF9fCisjZGVmaW5lIF9fU0VDVVJFX0hFQVBfSF9fCisKKy8qIFN0YW5kYXJkIGluY2x1ZGVzLiAqLworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisvKioKKyAqIEBicmllZiBBbGxvY2F0ZXMgbWVtb3J5IGZyb20gaGVhcC4KKyAqCisgKiBAcGFyYW1baW5dIHhXYW50ZWRTaXplIFRoZSBzaXplIG9mIHRoZSBtZW1vcnkgdG8gYmUgYWxsb2NhdGVkLgorICoKKyAqIEByZXR1cm4gUG9pbnRlciB0byB0aGUgbWVtb3J5IHJlZ2lvbiBpZiB0aGUgYWxsb2NhdGlvbiBpcyBzdWNjZXNzZnVsLCBOVUxMCisgKiBvdGhlcndpc2UuCisgKi8KK3ZvaWQgKnB2UG9ydE1hbGxvYyggc2l6ZV90IHhXYW50ZWRTaXplICk7CisKKy8qKgorICogQGJyaWVmIEZyZWVzIHRoZSBwcmV2aW91c2x5IGFsbG9jYXRlZCBtZW1vcnkuCisgKgorICogQHBhcmFtW2luXSBwdiBQb2ludGVyIHRvIHRoZSBtZW1vcnkgdG8gYmUgZnJlZWQuCisgKi8KK3ZvaWQgdlBvcnRGcmVlKCB2b2lkICpwdiApOworCisjZW5kaWYgLyogX19TRUNVUkVfSEVBUF9IX18gKi8KZGlmZiAtLWdpdCBhL1NvdXJjZS9wb3J0YWJsZS9JQVIvQVJNX0NNMjMvc2VjdXJlL3NlY3VyZV9pbml0LmMgYi9Tb3VyY2UvcG9ydGFibGUvSUFSL0FSTV9DTTIzL3NlY3VyZS9zZWN1cmVfaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2NTI1ZjcKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvcG9ydGFibGUvSUFSL0FSTV9DTTIzL3NlY3VyZS9zZWN1cmVfaW5pdC5jCkBAIC0wLDAgKzEsMTA1IEBACisvKgorICogRnJlZVJUT1MgS2VybmVsIFYxMC4yLjEKKyAqIENvcHlyaWdodCAoQykgMjAxOSBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCisgKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgorICogdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bworICogdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YKKyAqIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKKyAqIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAorICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MKKyAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUgorICogQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSCisgKiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBodHRwOi8vd3d3LkZyZWVSVE9TLm9yZworICogaHR0cDovL2F3cy5hbWF6b24uY29tL2ZyZWVydG9zCisgKgorICogMSB0YWIgPT0gNCBzcGFjZXMhCisgKi8KKworLyogU3RhbmRhcmQgaW5jbHVkZXMuICovCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8qIFNlY3VyZSBpbml0IGluY2x1ZGVzLiAqLworI2luY2x1ZGUgInNlY3VyZV9pbml0LmgiCisKKy8qIFNlY3VyZSBwb3J0IG1hY3Jvcy4gKi8KKyNpbmNsdWRlICJzZWN1cmVfcG9ydF9tYWNyb3MuaCIKKworLyoqCisgKiBAYnJpZWYgQ29uc3RhbnRzIHJlcXVpcmVkIHRvIG1hbmlwdWxhdGUgdGhlIFNDQi4KKyAqLworI2RlZmluZSBzZWN1cmVpbml0U0NCX0FJUkNSCQkJCQkoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVkMGMgKSAgLyogQXBwbGljYXRpb24gSW50ZXJydXB0IGFuZCBSZXNldCBDb250cm9sIFJlZ2lzdGVyLiAqLworI2RlZmluZSBzZWN1cmVpbml0U0NCX0FJUkNSX1ZFQ1RLRVlfUE9TCQkoIDE2VUwgKQorI2RlZmluZSBzZWN1cmVpbml0U0NCX0FJUkNSX1ZFQ1RLRVlfTUFTSwkoIDB4RkZGRlVMIDw8IHNlY3VyZWluaXRTQ0JfQUlSQ1JfVkVDVEtFWV9QT1MgKQorI2RlZmluZSBzZWN1cmVpbml0U0NCX0FJUkNSX1BSSVNfUE9TCQkoIDE0VUwgKQorI2RlZmluZSBzZWN1cmVpbml0U0NCX0FJUkNSX1BSSVNfTUFTSwkJKCAxVUwgPDwgc2VjdXJlaW5pdFNDQl9BSVJDUl9QUklTX1BPUyApCisKKy8qKgorICogQGJyaWVmIENvbnN0YW50cyByZXF1aXJlZCB0byBtYW5pcHVsYXRlIHRoZSBGUFUuCisgKi8KKyNkZWZpbmUgc2VjdXJlaW5pdEZQQ0NSCQkJCQkJKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZjM0ICkgIC8qIEZsb2F0aW5nIFBvaW50IENvbnRleHQgQ29udHJvbCBSZWdpc3Rlci4gKi8KKyNkZWZpbmUgc2VjdXJlaW5pdEZQQ0NSX0xTUEVOU19QT1MJCQkoIDI5VUwgKQorI2RlZmluZSBzZWN1cmVpbml0RlBDQ1JfTFNQRU5TX01BU0sJCQkoIDFVTCA8PCBzZWN1cmVpbml0RlBDQ1JfTFNQRU5TX1BPUyApCisjZGVmaW5lIHNlY3VyZWluaXRGUENDUl9UU19QT1MJCQkJKCAyNlVMICkKKyNkZWZpbmUgc2VjdXJlaW5pdEZQQ0NSX1RTX01BU0sJCQkJKCAxVUwgPDwgc2VjdXJlaW5pdEZQQ0NSX1RTX1BPUyApCisKKyNkZWZpbmUgc2VjdXJlaW5pdE5TQUNSCQkJCQkJKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZDhjICkgIC8qIE5vbi1zZWN1cmUgQWNjZXNzIENvbnRyb2wgUmVnaXN0ZXIuICovCisjZGVmaW5lIHNlY3VyZWluaXROU0FDUl9DUDEwX1BPUwkJCSggMTBVTCApCisjZGVmaW5lIHNlY3VyZWluaXROU0FDUl9DUDEwX01BU0sJCQkoIDFVTCA8PCBzZWN1cmVpbml0TlNBQ1JfQ1AxMF9QT1MgKQorI2RlZmluZSBzZWN1cmVpbml0TlNBQ1JfQ1AxMV9QT1MJCQkoIDExVUwgKQorI2RlZmluZSBzZWN1cmVpbml0TlNBQ1JfQ1AxMV9NQVNLCQkJKCAxVUwgPDwgc2VjdXJlaW5pdE5TQUNSX0NQMTFfUE9TICkKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzZWN1cmVwb3J0Tk9OX1NFQ1VSRV9DQUxMQUJMRSB2b2lkIFNlY3VyZUluaXRfRGVQcmlvcml0aXplTlNFeGNlcHRpb25zKCB2b2lkICkKK3sKKwl1aW50MzJfdCB1bElQU1I7CisKKwkgLyogUmVhZCB0aGUgSW50ZXJydXB0IFByb2dyYW0gU3RhdHVzIFJlZ2lzdGVyIChJUFNSKSB2YWx1ZS4gKi8KKwlzZWN1cmVwb3J0UkVBRF9JUFNSKCB1bElQU1IgKTsKKworCS8qIERvIG5vdGhpbmcgaWYgdGhlIHByb2Nlc3NvciBpcyBydW5uaW5nIGluIHRoZSBUaHJlYWQgTW9kZS4gSVBTUiBpcyB6ZXJvCisJICogd2hlbiB0aGUgcHJvY2Vzc29yIGlzIHJ1bm5pbmcgaW4gdGhlIFRocmVhZCBNb2RlLiAqLworCWlmKCB1bElQU1IgIT0gMCApCisJeworCQkqKCBzZWN1cmVpbml0U0NCX0FJUkNSICkgPQkoICooIHNlY3VyZWluaXRTQ0JfQUlSQ1IgKSAmIH4oIHNlY3VyZWluaXRTQ0JfQUlSQ1JfVkVDVEtFWV9NQVNLIHwgc2VjdXJlaW5pdFNDQl9BSVJDUl9QUklTX01BU0sgKSApIHwKKwkJCQkJCQkJCSggKCAweDA1RkFVTCA8PCBzZWN1cmVpbml0U0NCX0FJUkNSX1ZFQ1RLRVlfUE9TICkgJiBzZWN1cmVpbml0U0NCX0FJUkNSX1ZFQ1RLRVlfTUFTSyApIHwKKwkJCQkJCQkJCSggKCAweDFVTAk8PCBzZWN1cmVpbml0U0NCX0FJUkNSX1BSSVNfUE9TICkJJiBzZWN1cmVpbml0U0NCX0FJUkNSX1BSSVNfTUFTSyApOworCX0KK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzZWN1cmVwb3J0Tk9OX1NFQ1VSRV9DQUxMQUJMRSB2b2lkIFNlY3VyZUluaXRfRW5hYmxlTlNGUFVBY2Nlc3MoIHZvaWQgKQoreworCXVpbnQzMl90IHVsSVBTUjsKKworCSAvKiBSZWFkIHRoZSBJbnRlcnJ1cHQgUHJvZ3JhbSBTdGF0dXMgUmVnaXN0ZXIgKElQU1IpIHZhbHVlLiAqLworCXNlY3VyZXBvcnRSRUFEX0lQU1IoIHVsSVBTUiApOworCisJLyogRG8gbm90aGluZyBpZiB0aGUgcHJvY2Vzc29yIGlzIHJ1bm5pbmcgaW4gdGhlIFRocmVhZCBNb2RlLiBJUFNSIGlzIHplcm8KKwkgKiB3aGVuIHRoZSBwcm9jZXNzb3IgaXMgcnVubmluZyBpbiB0aGUgVGhyZWFkIE1vZGUuICovCisJaWYoIHVsSVBTUiAhPSAwICkKKwl7CisJCS8qIENQMTAgPSAxID09PiBOb24tc2VjdXJlIGFjY2VzcyB0byB0aGUgRmxvYXRpbmcgUG9pbnQgVW5pdCBpcworCQkgKiBwZXJtaXR0ZWQuIENQMTEgc2hvdWxkIGJlIHByb2dyYW1tZWQgdG8gdGhlIHNhbWUgdmFsdWUgYXMgQ1AxMC4gKi8KKwkJKiggc2VjdXJlaW5pdE5TQUNSICkgfD0gKCBzZWN1cmVpbml0TlNBQ1JfQ1AxMF9NQVNLIHwgc2VjdXJlaW5pdE5TQUNSX0NQMTFfTUFTSyApOworCisJCS8qIExTUEVOUyA9IDAgPT0+IExTUEVOIGlzIHdyaXRhYmxlIGZyb24gbm9uLXNlY3VyZSBzdGF0ZS4gVGhpcyBlbnN1cmVzCisJCSAqIHRoYXQgd2UgY2FuIGVuYWJsZS9kaXNhYmxlIGxhenkgc3RhY2tpbmcgaW4gcG9ydC5jIGZpbGUuICovCisJCSooIHNlY3VyZWluaXRGUENDUiApICY9IH4gKCBzZWN1cmVpbml0RlBDQ1JfTFNQRU5TX01BU0sgKTsKKworCQkvKiBUUyA9IDEgPT0+IFRyZWF0IEZQIHJlZ2lzdGVycyBhcyBzZWN1cmUgaS5lLiBjYWxsZWUgc2F2ZWQgRlAKKwkJICogcmVnaXN0ZXJzIChTMTYtUzMxKSBhcmUgYWxzbyBwdXNoZWQgdG8gc3RhY2sgb24gZXhjZXB0aW9uIGVudHJ5IGFuZAorCQkgKiByZXN0b3JlZCBvbiBleGNlcHRpb24gcmV0dXJuLiAqLworCQkqKCBzZWN1cmVpbml0RlBDQ1IgKSB8PSAoIHNlY3VyZWluaXRGUENDUl9UU19NQVNLICk7CisJfQorfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCmRpZmYgLS1naXQgYS9Tb3VyY2UvcG9ydGFibGUvSUFSL0FSTV9DTTIzL3NlY3VyZS9zZWN1cmVfaW5pdC5oIGIvU291cmNlL3BvcnRhYmxlL0lBUi9BUk1fQ00yMy9zZWN1cmUvc2VjdXJlX2luaXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzViYzcxCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL3BvcnRhYmxlL0lBUi9BUk1fQ00yMy9zZWN1cmUvc2VjdXJlX2luaXQuaApAQCAtMCwwICsxLDUzIEBACisvKgorICogRnJlZVJUT1MgS2VybmVsIFYxMC4yLjEKKyAqIENvcHlyaWdodCAoQykgMjAxOSBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCisgKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgorICogdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bworICogdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YKKyAqIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKKyAqIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAorICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MKKyAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUgorICogQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSCisgKiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBodHRwOi8vd3d3LkZyZWVSVE9TLm9yZworICogaHR0cDovL2F3cy5hbWF6b24uY29tL2ZyZWVydG9zCisgKgorICogMSB0YWIgPT0gNCBzcGFjZXMhCisgKi8KKworI2lmbmRlZiBfX1NFQ1VSRV9JTklUX0hfXworI2RlZmluZSBfX1NFQ1VSRV9JTklUX0hfXworCisvKioKKyAqIEBicmllZiBEZS1wcmlvcml0aXplcyB0aGUgbm9uLXNlY3VyZSBleGNlcHRpb25zLgorICoKKyAqIFRoaXMgaXMgbmVlZGVkIHRvIGVuc3VyZSB0aGF0IHRoZSBub24tc2VjdXJlIFBlbmRTViBydW5zIGF0IHRoZSBsb3dlc3QKKyAqIHByaW9yaXR5LiBDb250ZXh0IHN3aXRjaCBpcyBkb25lIGluIHRoZSBub24tc2VjdXJlIFBlbmRTViBoYW5kbGVyLgorICoKKyAqIEBub3RlIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgaW4gdGhlIGhhbmRsZXIgbW9kZS4gSXQgaXMgbm8tb3AgaWYgY2FsbGVkCisgKiBpbiB0aGUgdGhyZWFkIG1vZGUuCisgKi8KK3ZvaWQgU2VjdXJlSW5pdF9EZVByaW9yaXRpemVOU0V4Y2VwdGlvbnMoIHZvaWQgKTsKKworLyoqCisgKiBAYnJpZWYgU2V0cyB1cCB0aGUgRmxvYXRpbmcgUG9pbnQgVW5pdCAoRlBVKSBmb3IgTm9uLVNlY3VyZSBhY2Nlc3MuCisgKgorICogQWxzbyBzZXRzIEZQQ0NSLlRTPTEgdG8gZW5zdXJlIHRoYXQgdGhlIGNvbnRlbnQgb2YgdGhlIEZsb2F0aW5nIFBvaW50CisgKiBSZWdpc3RlcnMgYXJlIG5vdCBsZWFrZWQgdG8gdGhlIG5vbi1zZWN1cmUgc2lkZS4KKyAqCisgKiBAbm90ZSBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGluIHRoZSBoYW5kbGVyIG1vZGUuIEl0IGlzIG5vLW9wIGlmIGNhbGxlZAorICogaW4gdGhlIHRocmVhZCBtb2RlLgorICovCit2b2lkIFNlY3VyZUluaXRfRW5hYmxlTlNGUFVBY2Nlc3MoIHZvaWQgKTsKKworI2VuZGlmIC8qIF9fU0VDVVJFX0lOSVRfSF9fICovCmRpZmYgLS1naXQgYS9Tb3VyY2UvcG9ydGFibGUvSUFSL0FSTV9DTTIzL3NlY3VyZS9zZWN1cmVfcG9ydF9tYWNyb3MuaCBiL1NvdXJjZS9wb3J0YWJsZS9JQVIvQVJNX0NNMjMvc2VjdXJlL3NlY3VyZV9wb3J0X21hY3Jvcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2MGVkYWIKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvcG9ydGFibGUvSUFSL0FSTV9DTTIzL3NlY3VyZS9zZWN1cmVfcG9ydF9tYWNyb3MuaApAQCAtMCwwICsxLDEzMyBAQAorLyoKKyAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMi4xCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgorICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KKyAqIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KKyAqIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mCisgKiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCisgKiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKKyAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTCisgKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IKKyAqIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUgorICogSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogaHR0cDovL3d3dy5GcmVlUlRPUy5vcmcKKyAqIGh0dHA6Ly9hd3MuYW1hem9uLmNvbS9mcmVlcnRvcworICoKKyAqIDEgdGFiID09IDQgc3BhY2VzIQorICovCisKKyNpZm5kZWYgX19TRUNVUkVfUE9SVF9NQUNST1NfSF9fCisjZGVmaW5lIF9fU0VDVVJFX1BPUlRfTUFDUk9TX0hfXworCisvKioKKyAqIEBicmllZiBCeXRlIGFsaWdubWVudCByZXF1aXJlbWVudHMuCisgKi8KKyNkZWZpbmUgc2VjdXJlcG9ydEJZVEVfQUxJR05NRU5UCQkJCQk4CisjZGVmaW5lIHNlY3VyZXBvcnRCWVRFX0FMSUdOTUVOVF9NQVNLCQkJCSggMHgwMDA3ICkKKworLyoqCisgKiBAYnJpZWYgTWFjcm8gdG8gZGVjbGFyZSBhIGZ1bmN0aW9uIGFzIG5vbi1zZWN1cmUgY2FsbGFibGUuCisgKi8KKyNpZiBkZWZpbmVkKCBfX0lBUl9TWVNURU1TX0lDQ19fICkKKwkjZGVmaW5lIHNlY3VyZXBvcnROT05fU0VDVVJFX0NBTExBQkxFCQkJX19jbXNlX25vbnNlY3VyZV9lbnRyeSBfX3Jvb3QKKyNlbHNlCisJI2RlZmluZSBzZWN1cmVwb3J0Tk9OX1NFQ1VSRV9DQUxMQUJMRQkJCV9fYXR0cmlidXRlX18oKGNtc2Vfbm9uc2VjdXJlX2VudHJ5KSkgX19hdHRyaWJ1dGVfXygodXNlZCkpCisjZW5kaWYKKworLyoqCisgKiBAYnJpZWYgU2V0IHRoZSBzZWN1cmUgUFJJTUFTSyB2YWx1ZS4KKyAqLworI2RlZmluZSBzZWN1cmVwb3J0U0VUX1NFQ1VSRV9QUklNQVNLKCB1bFByaW1hc2tWYWx1ZSApIFwKKwlfX2FzbSB2b2xhdGlsZSAoICJtc3IgcHJpbWFzaywgJTAiIDogOiAiciIgKCB1bFByaW1hc2tWYWx1ZSApIDogIm1lbW9yeSIgKQorCisvKioKKyAqIEBicmllZiBTZXQgdGhlIG5vbi1zZWN1cmUgUFJJTUFTSyB2YWx1ZS4KKyAqLworI2RlZmluZSBzZWN1cmVwb3J0U0VUX05PTl9TRUNVUkVfUFJJTUFTSyggdWxQcmltYXNrVmFsdWUgKSBcCisJX19hc20gdm9sYXRpbGUgKCAibXNyIHByaW1hc2tfbnMsICUwIiA6IDogInIiICggdWxQcmltYXNrVmFsdWUgKSA6ICJtZW1vcnkiICkKKworLyoqCisgKiBAYnJpZWYgUmVhZCB0aGUgUFNQIHZhbHVlIGluIHRoZSBnaXZlbiB2YXJpYWJsZS4KKyAqLworI2RlZmluZSBzZWN1cmVwb3J0UkVBRF9QU1AoIHB1Y091dEN1cnJlbnRTdGFja1BvaW50ZXIgKSBcCisJX19hc20gdm9sYXRpbGUgKCAibXJzICUwLCBwc3AiICA6ICI9ciIgKCBwdWNPdXRDdXJyZW50U3RhY2tQb2ludGVyICkgKQorCisvKioKKyAqIEBicmllZiBTZXQgdGhlIFBTUCB0byB0aGUgZ2l2ZW4gdmFsdWUuCisgKi8KKyNkZWZpbmUgc2VjdXJlcG9ydFNFVF9QU1AoIHB1Y0N1cnJlbnRTdGFja1BvaW50ZXIgKSBcCisJX19hc20gdm9sYXRpbGUgKCAibXNyIHBzcCwgJTAiIDogOiAiciIgKCBwdWNDdXJyZW50U3RhY2tQb2ludGVyICkgKQorCisvKioKKyAqIEBicmllZiBTZXQgdGhlIFBTUExJTSB0byB0aGUgZ2l2ZW4gdmFsdWUuCisgKi8KKyNkZWZpbmUgc2VjdXJlcG9ydFNFVF9QU1BMSU0oIHB1Y1N0YWNrTGltaXQgKSBcCisJX19hc20gdm9sYXRpbGUgKCAibXNyIHBzcGxpbSwgJTAiIDogOiAiciIgKCBwdWNTdGFja0xpbWl0ICkgKQorCisvKioKKyAqIEBicmllZiBTZXQgdGhlIE5vblNlY3VyZSBNU1AgdG8gdGhlIGdpdmVuIHZhbHVlLgorICovCisjZGVmaW5lIHNlY3VyZXBvcnRTRVRfTVNQX05TKCBwdWNNYWluU3RhY2tQb2ludGVyICkgXAorCV9fYXNtIHZvbGF0aWxlICggIm1zciBtc3BfbnMsICUwIiA6IDogInIiICggcHVjTWFpblN0YWNrUG9pbnRlciApICkKKworLyoqCisgKiBAYnJpZWYgU2V0IHRoZSBDT05UUk9MIHJlZ2lzdGVyIHRvIHRoZSBnaXZlbiB2YWx1ZS4KKyAqLworI2RlZmluZSBzZWN1cmVwb3J0U0VUX0NPTlRST0woIHVsQ29udHJvbCApIFwKKwlfX2FzbSB2b2xhdGlsZSAoICJtc3IgY29udHJvbCwgJTAiIDogOiAiciIgKCB1bENvbnRyb2wgKSA6ICJtZW1vcnkiICkKKworLyoqCisgKiBAYnJpZWYgUmVhZCB0aGUgSW50ZXJydXB0IFByb2dyYW0gU3RhdHVzIFJlZ2lzdGVyIChJUFNSKSB2YWx1ZSBpbiB0aGUgZ2l2ZW4KKyAqIHZhcmlhYmxlLgorICovCisjZGVmaW5lIHNlY3VyZXBvcnRSRUFEX0lQU1IoIHVsSVBTUiApIFwKKwlfX2FzbSB2b2xhdGlsZSAoICJtcnMgJTAsIGlwc3IiICA6ICI9ciIgKCB1bElQU1IgKSApCisKKy8qKgorICogQGJyaWVmIFBSSU1BU0sgdmFsdWUgdG8gZW5hYmxlIGludGVycnVwdHMuCisgKi8KKyNkZWZpbmUgc2VjdXJlcG9ydFBSSU1BU0tfRU5BQkxFX0lOVEVSUlVQVFNfVkFMCQkwCisKKy8qKgorICogQGJyaWVmIFBSSU1BU0sgdmFsdWUgdG8gZGlzYWJsZSBpbnRlcnJ1cHRzLgorICovCisjZGVmaW5lIHNlY3VyZXBvcnRQUklNQVNLX0RJU0FCTEVfSU5URVJSVVBUU19WQUwJMQorCisvKioKKyAqIEBicmllZiBEaXNhYmxlIHNlY3VyZSBpbnRlcnJ1cHRzLgorICovCisjZGVmaW5lIHNlY3VyZXBvcnRESVNBQkxFX1NFQ1VSRV9JTlRFUlJVUFRTKCkJCXNlY3VyZXBvcnRTRVRfU0VDVVJFX1BSSU1BU0soIHNlY3VyZXBvcnRQUklNQVNLX0RJU0FCTEVfSU5URVJSVVBUU19WQUwgKQorCisvKioKKyAqIEBicmllZiBEaXNhYmxlIG5vbi1zZWN1cmUgaW50ZXJydXB0cy4KKyAqCisgKiBUaGlzIGVmZmVjdGl2ZWx5IGRpc2FibGVzIGNvbnRleHQgc3dpdGNoZXMuCisgKi8KKyNkZWZpbmUgc2VjdXJlcG9ydERJU0FCTEVfTk9OX1NFQ1VSRV9JTlRFUlJVUFRTKCkJc2VjdXJlcG9ydFNFVF9OT05fU0VDVVJFX1BSSU1BU0soIHNlY3VyZXBvcnRQUklNQVNLX0RJU0FCTEVfSU5URVJSVVBUU19WQUwgKQorCisvKioKKyAqIEBicmllZiBFbmFibGUgbm9uLXNlY3VyZSBpbnRlcnJ1cHRzLgorICovCisjZGVmaW5lIHNlY3VyZXBvcnRFTkFCTEVfTk9OX1NFQ1VSRV9JTlRFUlJVUFRTKCkJc2VjdXJlcG9ydFNFVF9OT05fU0VDVVJFX1BSSU1BU0soIHNlY3VyZXBvcnRQUklNQVNLX0VOQUJMRV9JTlRFUlJVUFRTX1ZBTCApCisKKy8qKgorICogQGJyaWVmIEFzc2VydCBkZWZpbml0aW9uLgorICovCisjZGVmaW5lIHNlY3VyZXBvcnRBU1NFUlQoIHggKQkJCQkJCVwKKwlpZiggKCB4ICkgPT0gMCApCQkJCQkJCQlcCisJewkJCQkJCQkJCQkJCVwKKwkJc2VjdXJlcG9ydERJU0FCTEVfU0VDVVJFX0lOVEVSUlVQVFMoKTsJCVwKKwkJc2VjdXJlcG9ydERJU0FCTEVfTk9OX1NFQ1VSRV9JTlRFUlJVUFRTKCk7CVwKKwkJZm9yKCA7OyApOwkJCQkJCQkJCVwKKwl9CisKKyNlbmRpZiAvKiBfX1NFQ1VSRV9QT1JUX01BQ1JPU19IX18gKi8KZGlmZiAtLWdpdCBhL1NvdXJjZS9wb3J0YWJsZS9JQVIvQVJNX0NNMjNfTlRaL25vbl9zZWN1cmUvcG9ydC5jIGIvU291cmNlL3BvcnRhYmxlL0lBUi9BUk1fQ00yM19OVFovbm9uX3NlY3VyZS9wb3J0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ4NWE2ZgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9wb3J0YWJsZS9JQVIvQVJNX0NNMjNfTlRaL25vbl9zZWN1cmUvcG9ydC5jCkBAIC0wLDAgKzEsODk5IEBACisvKgorICogRnJlZVJUT1MgS2VybmVsIFYxMC4yLjEKKyAqIENvcHlyaWdodCAoQykgMjAxOSBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCisgKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgorICogdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bworICogdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YKKyAqIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKKyAqIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAorICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MKKyAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUgorICogQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSCisgKiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBodHRwOi8vd3d3LkZyZWVSVE9TLm9yZworICogaHR0cDovL2F3cy5hbWF6b24uY29tL2ZyZWVydG9zCisgKgorICogMSB0YWIgPT0gNCBzcGFjZXMhCisgKi8KKworLyogRGVmaW5pbmcgTVBVX1dSQVBQRVJTX0lOQ0xVREVEX0ZST01fQVBJX0ZJTEUgcHJldmVudHMgdGFzay5oIGZyb20gcmVkZWZpbmluZworICogYWxsIHRoZSBBUEkgZnVuY3Rpb25zIHRvIHVzZSB0aGUgTVBVIHdyYXBwZXJzLiBUaGF0IHNob3VsZCBvbmx5IGJlIGRvbmUgd2hlbgorICogdGFzay5oIGlzIGluY2x1ZGVkIGZyb20gYW4gYXBwbGljYXRpb24gZmlsZS4gKi8KKyNkZWZpbmUgTVBVX1dSQVBQRVJTX0lOQ0xVREVEX0ZST01fQVBJX0ZJTEUKKworLyogU2NoZWR1bGVyIGluY2x1ZGVzLiAqLworI2luY2x1ZGUgIkZyZWVSVE9TLmgiCisjaW5jbHVkZSAidGFzay5oIgorCisvKiBNUFUgd3JhcHBlcnMgaW5jbHVkZXMuICovCisjaW5jbHVkZSAibXB1X3dyYXBwZXJzLmgiCisKKy8qIFBvcnRhc20gaW5jbHVkZXMuICovCisjaW5jbHVkZSAicG9ydGFzbS5oIgorCisjaWYoIGNvbmZpZ0VOQUJMRV9UUlVTVFpPTkUgPT0gMSApCisJLyogU2VjdXJlIGNvbXBvbmVudHMgaW5jbHVkZXMuICovCisJI2luY2x1ZGUgInNlY3VyZV9jb250ZXh0LmgiCisJI2luY2x1ZGUgInNlY3VyZV9pbml0LmgiCisjZW5kaWYgLyogY29uZmlnRU5BQkxFX1RSVVNUWk9ORSAqLworCisjdW5kZWYgTVBVX1dSQVBQRVJTX0lOQ0xVREVEX0ZST01fQVBJX0ZJTEUKKworLyoqCisgKiBUaGUgRnJlZVJUT1MgQ29ydGV4IE0zMyBwb3J0IGNhbiBiZSBjb25maWd1cmVkIHRvIHJ1biBvbiB0aGUgU2VjdXJlIFNpZGUgb25seQorICogaS5lLiB0aGUgcHJvY2Vzc29yIGJvb3RzIGFzIHNlY3VyZSBhbmQgbmV2ZXIganVtcHMgdG8gdGhlIG5vbi1zZWN1cmUgc2lkZS4KKyAqIFRoZSBUcnVzdCBab25lIHN1cHBvcnQgaW4gdGhlIHBvcnQgbXVzdCBiZSBkaXNhYmxlZCBpbiBvcmRlciB0byBydW4gRnJlZVJUT1MKKyAqIG9uIHRoZSBzZWN1cmUgc2lkZS4gVGhlIGZvbGxvd2luZyBhcmUgdGhlIHZhbGlkIGNvbmZpZ3VyYXRpb24gc2VldGluZ3M6CisgKgorICogMS4gUnVuIEZyZWVSVE9TIG9uIHRoZSBTZWN1cmUgU2lkZToKKyAqCQljb25maWdSVU5fRlJFRVJUT1NfU0VDVVJFX09OTFkgPSAxIGFuZCBjb25maWdFTkFCTEVfVFJVU1RaT05FID0gMAorICoKKyAqIDIuIFJ1biBGcmVlUlRPUyBvbiB0aGUgTm9uLVNlY3VyZSBTaWRlIHdpdGggU2VjdXJlIFNpZGUgZnVuY3Rpb24gY2FsbCBzdXBwb3J0OgorICoJCWNvbmZpZ1JVTl9GUkVFUlRPU19TRUNVUkVfT05MWSA9IDAgYW5kIGNvbmZpZ0VOQUJMRV9UUlVTVFpPTkUgPSAxCisgKgorICogMy4gUnVuIEZyZWVSVE9TIG9uIHRoZSBOb24tU2VjdXJlIFNpZGUgb25seSBpLmUuIG5vIFNlY3VyZSBTaWRlIGZ1bmN0aW9uIGNhbGwgc3VwcG9ydDoKKyAqCQljb25maWdSVU5fRlJFRVJUT1NfU0VDVVJFX09OTFkgPSAwIGFuZCBjb25maWdFTkFCTEVfVFJVU1RaT05FID0gMAorICovCisjaWYoICggY29uZmlnUlVOX0ZSRUVSVE9TX1NFQ1VSRV9PTkxZID09IDEgKSAmJiAoIGNvbmZpZ0VOQUJMRV9UUlVTVFpPTkUgPT0gMSApICkKKwkjZXJyb3IgVHJ1c3Rab25lIG5lZWRzIHRvIGJlIGRpc2FibGVkIGluIG9yZGVyIHRvIHJ1biBGcmVlUlRPUyBvbiB0aGUgU2VjdXJlIFNpZGUuCisjZW5kaWYKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAqIEBicmllZiBDb25zdGFudHMgcmVxdWlyZWQgdG8gbWFuaXB1bGF0ZSB0aGUgTlZJQy4KKyAqLworI2RlZmluZSBwb3J0TlZJQ19TWVNUSUNLX0NUUkwJCQkJKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlMDEwICkKKyNkZWZpbmUgcG9ydE5WSUNfU1lTVElDS19MT0FECQkJCSggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZTAxNCApCisjZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfQ1VSUkVOVF9WQUxVRQkJKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlMDE4ICkKKyNkZWZpbmUgcG9ydE5WSUNfSU5UX0NUUkwJCQkJCSggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZWQwNCApCisjZGVmaW5lIHBvcnROVklDX1NZU1BSSTIJCQkJCSggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZWQyMCApCisjZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfQ0xLCQkJCSggMHgwMDAwMDAwNCApCisjZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfSU5UCQkJCSggMHgwMDAwMDAwMiApCisjZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfRU5BQkxFCQkJCSggMHgwMDAwMDAwMSApCisjZGVmaW5lIHBvcnROVklDX1BFTkRTVlNFVAkJCQkJKCAweDEwMDAwMDAwICkKKyNkZWZpbmUgcG9ydE1JTl9JTlRFUlJVUFRfUFJJT1JJVFkJCQkoIDI1NVVMICkKKyNkZWZpbmUgcG9ydE5WSUNfUEVORFNWX1BSSQkJCQkJKCBwb3J0TUlOX0lOVEVSUlVQVF9QUklPUklUWSA8PCAxNlVMICkKKyNkZWZpbmUgcG9ydE5WSUNfU1lTVElDS19QUkkJCQkJKCBwb3J0TUlOX0lOVEVSUlVQVF9QUklPUklUWSA8PCAyNFVMICkKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAqIEBicmllZiBDb25zdGFudHMgcmVxdWlyZWQgdG8gbWFuaXB1bGF0ZSB0aGUgU0NCLgorICovCisjZGVmaW5lIHBvcnRTQ0JfU1lTX0hBTkRMRVJfQ1RSTF9TVEFURV9SRUcJKCAqICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVkMjQgKQorI2RlZmluZSBwb3J0U0NCX01FTV9GQVVMVF9FTkFCTEUJCQkoIDFVTCA8PCAxNlVMICkKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAqIEBicmllZiBDb25zdGFudHMgcmVxdWlyZWQgdG8gbWFuaXB1bGF0ZSB0aGUgRlBVLgorICovCisjZGVmaW5lIHBvcnRDUEFDUgkJCQkJCQkoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVkODggKQkvKiBDb3Byb2Nlc3NvciBBY2Nlc3MgQ29udHJvbCBSZWdpc3Rlci4gKi8KKyNkZWZpbmUgcG9ydENQQUNSX0NQMTBfVkFMVUUJCQkJKCAzVUwgKQorI2RlZmluZSBwb3J0Q1BBQ1JfQ1AxMV9WQUxVRQkJCQlwb3J0Q1BBQ1JfQ1AxMF9WQUxVRQorI2RlZmluZSBwb3J0Q1BBQ1JfQ1AxMF9QT1MJCQkJCSggMjBVTCApCisjZGVmaW5lIHBvcnRDUEFDUl9DUDExX1BPUwkJCQkJKCAyMlVMICkKKworI2RlZmluZSBwb3J0RlBDQ1IJCQkJCQkJKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZjM0ICkJLyogRmxvYXRpbmcgUG9pbnQgQ29udGV4dCBDb250cm9sIFJlZ2lzdGVyLiAqLworI2RlZmluZSBwb3J0RlBDQ1JfQVNQRU5fUE9TCQkJCQkoIDMxVUwgKQorI2RlZmluZSBwb3J0RlBDQ1JfQVNQRU5fTUFTSwkJCQkoIDFVTCA8PCBwb3J0RlBDQ1JfQVNQRU5fUE9TICkKKyNkZWZpbmUgcG9ydEZQQ0NSX0xTUEVOX1BPUwkJCQkJKCAzMFVMICkKKyNkZWZpbmUgcG9ydEZQQ0NSX0xTUEVOX01BU0sJCQkJKCAxVUwgPDwgcG9ydEZQQ0NSX0xTUEVOX1BPUyApCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqCisgKiBAYnJpZWYgQ29uc3RhbnRzIHJlcXVpcmVkIHRvIG1hbmlwdWxhdGUgdGhlIE1QVS4KKyAqLworI2RlZmluZSBwb3J0TVBVX1RZUEVfUkVHCQkJCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZDkwICkgKQorI2RlZmluZSBwb3J0TVBVX0NUUkxfUkVHCQkJCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZDk0ICkgKQorI2RlZmluZSBwb3J0TVBVX1JOUl9SRUcJCQkJCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZDk4ICkgKQorCisjZGVmaW5lIHBvcnRNUFVfUkJBUl9SRUcJCQkJCSggKiAoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVkOWMgKSApCisjZGVmaW5lIHBvcnRNUFVfUkxBUl9SRUcJCQkJCSggKiAoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVkYTAgKSApCisKKyNkZWZpbmUgcG9ydE1QVV9SQkFSX0ExX1JFRwkJCQkJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZWRhNCApICkKKyNkZWZpbmUgcG9ydE1QVV9STEFSX0ExX1JFRwkJCQkJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZWRhOCApICkKKworI2RlZmluZSBwb3J0TVBVX1JCQVJfQTJfUkVHCQkJCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZGFjICkgKQorI2RlZmluZSBwb3J0TVBVX1JMQVJfQTJfUkVHCQkJCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZGIwICkgKQorCisjZGVmaW5lIHBvcnRNUFVfUkJBUl9BM19SRUcJCQkJCSggKiAoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVkYjQgKSApCisjZGVmaW5lIHBvcnRNUFVfUkxBUl9BM19SRUcJCQkJCSggKiAoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVkYjggKSApCisKKyNkZWZpbmUgcG9ydE1QVV9NQUlSMF9SRUcJCQkJCSggKiAoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVkYzAgKSApCisjZGVmaW5lIHBvcnRNUFVfTUFJUjFfUkVHCQkJCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZGM0ICkgKQorCisjZGVmaW5lIHBvcnRNUFVfUkJBUl9BRERSRVNTX01BU0sJCQkoIDB4ZmZmZmZmZTAgKSAvKiBNdXN0IGJlIDMyLWJ5dGUgYWxpZ25lZC4gKi8KKyNkZWZpbmUgcG9ydE1QVV9STEFSX0FERFJFU1NfTUFTSwkJCSggMHhmZmZmZmZlMCApIC8qIE11c3QgYmUgMzItYnl0ZSBhbGlnbmVkLiAqLworCisjZGVmaW5lIHBvcnRNUFVfTUFJUl9BVFRSMF9QT1MJCQkJKCAwVUwgKQorI2RlZmluZSBwb3J0TVBVX01BSVJfQVRUUjBfTUFTSwkJCQkoIDB4MDAwMDAwZmYgKQorCisjZGVmaW5lIHBvcnRNUFVfTUFJUl9BVFRSMV9QT1MJCQkJKCA4VUwgKQorI2RlZmluZSBwb3J0TVBVX01BSVJfQVRUUjFfTUFTSwkJCQkoIDB4MDAwMGZmMDAgKQorCisjZGVmaW5lIHBvcnRNUFVfTUFJUl9BVFRSMl9QT1MJCQkJKCAxNlVMICkKKyNkZWZpbmUgcG9ydE1QVV9NQUlSX0FUVFIyX01BU0sJCQkJKCAweDAwZmYwMDAwICkKKworI2RlZmluZSBwb3J0TVBVX01BSVJfQVRUUjNfUE9TCQkJCSggMjRVTCApCisjZGVmaW5lIHBvcnRNUFVfTUFJUl9BVFRSM19NQVNLCQkJCSggMHhmZjAwMDAwMCApCisKKyNkZWZpbmUgcG9ydE1QVV9NQUlSX0FUVFI0X1BPUwkJCQkoIDBVTCApCisjZGVmaW5lIHBvcnRNUFVfTUFJUl9BVFRSNF9NQVNLCQkJCSggMHgwMDAwMDBmZiApCisKKyNkZWZpbmUgcG9ydE1QVV9NQUlSX0FUVFI1X1BPUwkJCQkoIDhVTCApCisjZGVmaW5lIHBvcnRNUFVfTUFJUl9BVFRSNV9NQVNLCQkJCSggMHgwMDAwZmYwMCApCisKKyNkZWZpbmUgcG9ydE1QVV9NQUlSX0FUVFI2X1BPUwkJCQkoIDE2VUwgKQorI2RlZmluZSBwb3J0TVBVX01BSVJfQVRUUjZfTUFTSwkJCQkoIDB4MDBmZjAwMDAgKQorCisjZGVmaW5lIHBvcnRNUFVfTUFJUl9BVFRSN19QT1MJCQkJKCAyNFVMICkKKyNkZWZpbmUgcG9ydE1QVV9NQUlSX0FUVFI3X01BU0sJCQkJKCAweGZmMDAwMDAwICkKKworI2RlZmluZSBwb3J0TVBVX1JMQVJfQVRUUl9JTkRFWDAJCQkoIDBVTCA8PCAxVUwgKQorI2RlZmluZSBwb3J0TVBVX1JMQVJfQVRUUl9JTkRFWDEJCQkoIDFVTCA8PCAxVUwgKQorI2RlZmluZSBwb3J0TVBVX1JMQVJfQVRUUl9JTkRFWDIJCQkoIDJVTCA8PCAxVUwgKQorI2RlZmluZSBwb3J0TVBVX1JMQVJfQVRUUl9JTkRFWDMJCQkoIDNVTCA8PCAxVUwgKQorI2RlZmluZSBwb3J0TVBVX1JMQVJfQVRUUl9JTkRFWDQJCQkoIDRVTCA8PCAxVUwgKQorI2RlZmluZSBwb3J0TVBVX1JMQVJfQVRUUl9JTkRFWDUJCQkoIDVVTCA8PCAxVUwgKQorI2RlZmluZSBwb3J0TVBVX1JMQVJfQVRUUl9JTkRFWDYJCQkoIDZVTCA8PCAxVUwgKQorI2RlZmluZSBwb3J0TVBVX1JMQVJfQVRUUl9JTkRFWDcJCQkoIDdVTCA8PCAxVUwgKQorCisjZGVmaW5lIHBvcnRNUFVfUkxBUl9SRUdJT05fRU5BQkxFCQkJKCAxVUwgKQorCisvKiBFbmFibGUgcHJpdmlsZWdlZCBhY2Nlc3MgdG8gdW5tYXBwZWQgcmVnaW9uLiAqLworI2RlZmluZSBwb3J0TVBVX1BSSVZfQkFDS0dST1VORF9FTkFCTEUJCSggMVVMIDw8IDJVTCApCisKKy8qIEVuYWJsZSBNUFUuICovCisjZGVmaW5lIHBvcnRNUFVfRU5BQkxFCQkJCQkJKCAxVUwgPDwgMFVMICkKKworLyogRXhwZWN0ZWQgdmFsdWUgb2YgdGhlIHBvcnRNUFVfVFlQRSByZWdpc3Rlci4gKi8KKyNkZWZpbmUgcG9ydEVYUEVDVEVEX01QVV9UWVBFX1ZBTFVFCQkJKCA4VUwgPDwgOFVMICkgLyogOCByZWdpb25zLCB1bmlmaWVkLiAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKgorICogQGJyaWVmIENvbnN0YW50cyByZXF1aXJlZCB0byBzZXQgdXAgdGhlIGluaXRpYWwgc3RhY2suCisgKi8KKyNkZWZpbmUgcG9ydElOSVRJQUxfWFBTUgkJCQkJKCAweDAxMDAwMDAwICkKKworI2lmKCBjb25maWdSVU5fRlJFRVJUT1NfU0VDVVJFX09OTFkgPT0gMSApCisJLyoqCisJICogQGJyaWVmIEluaXRpYWwgRVhDX1JFVFVSTiB2YWx1ZS4KKwkgKgorCSAqICAgICBGRiAgICAgICAgIEZGICAgICAgICAgRkYgICAgICAgICBGRAorCSAqIDExMTEgMTExMSAgMTExMSAxMTExICAxMTExIDExMTEgIDExMTEgMTEwMQorCSAqCisJICogQml0WzZdIC0gMSAtLT4gVGhlIGV4Y2VwdGlvbiB3YXMgdGFrZW4gZnJvbSB0aGUgU2VjdXJlIHN0YXRlLgorCSAqIEJpdFs1XSAtIDEgLS0+IERvIG5vdCBza2lwIHN0YWNraW5nIG9mIGFkZGl0aW9uYWwgc3RhdGUgY29udGV4dC4KKwkgKiBCaXRbNF0gLSAxIC0tPiBUaGUgUEUgZGlkIG5vdCBhbGxvY2F0ZSBzcGFjZSBvbiB0aGUgc3RhY2sgZm9yIEZQIGNvbnRleHQuCisJICogQml0WzNdIC0gMSAtLT4gUmV0dXJuIHRvIHRoZSBUaHJlYWQgbW9kZS4KKwkgKiBCaXRbMl0gLSAxIC0tPiBSZXN0b3JlIHJlZ2lzdGVycyBmcm9tIHRoZSBwcm9jZXNzIHN0YWNrLgorCSAqIEJpdFsxXSAtIDAgLS0+IFJlc2VydmVkLCAwLgorCSAqIEJpdFswXSAtIDEgLS0+IFRoZSBleGNlcHRpb24gd2FzIHRha2VuIHRvIHRoZSBTZWN1cmUgc3RhdGUuCisJICovCisJI2RlZmluZSBwb3J0SU5JVElBTF9FWENfUkVUVVJOCQkJKCAweGZmZmZmZmZkICkKKyNlbHNlCisJLyoqCisJICogQGJyaWVmIEluaXRpYWwgRVhDX1JFVFVSTiB2YWx1ZS4KKwkgKgorCSAqICAgICBGRiAgICAgICAgIEZGICAgICAgICAgRkYgICAgICAgICBCQworCSAqIDExMTEgMTExMSAgMTExMSAxMTExICAxMTExIDExMTEgIDEwMTEgMTEwMAorCSAqCisJICogQml0WzZdIC0gMCAtLT4gVGhlIGV4Y2VwdGlvbiB3YXMgdGFrZW4gZnJvbSB0aGUgTm9uLVNlY3VyZSBzdGF0ZS4KKwkgKiBCaXRbNV0gLSAxIC0tPiBEbyBub3Qgc2tpcCBzdGFja2luZyBvZiBhZGRpdGlvbmFsIHN0YXRlIGNvbnRleHQuCisJICogQml0WzRdIC0gMSAtLT4gVGhlIFBFIGRpZCBub3QgYWxsb2NhdGUgc3BhY2Ugb24gdGhlIHN0YWNrIGZvciBGUCBjb250ZXh0LgorCSAqIEJpdFszXSAtIDEgLS0+IFJldHVybiB0byB0aGUgVGhyZWFkIG1vZGUuCisJICogQml0WzJdIC0gMSAtLT4gUmVzdG9yZSByZWdpc3RlcnMgZnJvbSB0aGUgcHJvY2VzcyBzdGFjay4KKwkgKiBCaXRbMV0gLSAwIC0tPiBSZXNlcnZlZCwgMC4KKwkgKiBCaXRbMF0gLSAwIC0tPiBUaGUgZXhjZXB0aW9uIHdhcyB0YWtlbiB0byB0aGUgTm9uLVNlY3VyZSBzdGF0ZS4KKwkgKi8KKwkjZGVmaW5lIHBvcnRJTklUSUFMX0VYQ19SRVRVUk4JCQkoIDB4ZmZmZmZmYmMgKQorI2VuZGlmIC8qIGNvbmZpZ1JVTl9GUkVFUlRPU19TRUNVUkVfT05MWSAqLworCisvKioKKyAqIEBicmllZiBDT05UUk9MIHJlZ2lzdGVyIHByaXZpbGVnZWQgYml0IG1hc2suCisgKgorICogQml0WzBdIGluIENPTlRST0wgcmVnaXN0ZXIgdGVsbHMgdGhlIHByaXZpbGVnZToKKyAqICBCaXRbMF0gPSAwID09PiBUaGUgdGFzayBpcyBwcml2aWxlZ2VkLgorICogIEJpdFswXSA9IDEgPT0+IFRoZSB0YXNrIGlzIG5vdCBwcml2aWxlZ2VkLgorICovCisjZGVmaW5lIHBvcnRDT05UUk9MX1BSSVZJTEVHRURfTUFTSwkJCSggMVVMIDw8IDBVTCApCisKKy8qKgorICogQGJyaWVmIEluaXRpYWwgQ09OVFJPTCByZWdpc3RlciB2YWx1ZXMuCisgKi8KKyNkZWZpbmUgcG9ydElOSVRJQUxfQ09OVFJPTF9VTlBSSVZJTEVHRUQJKCAweDMgKQorI2RlZmluZSBwb3J0SU5JVElBTF9DT05UUk9MX1BSSVZJTEVHRUQJCSggMHgyICkKKworLyoqCisgKiBAYnJpZWYgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSBwcmUtbG9hZGluZyBvZiB0aGUgaW5pdGlhbCBMUiB3aXRoIHRoZQorICogYWRkcmVzcyBvZiBwcnZUYXNrRXhpdEVycm9yKCkgaW4gY2FzZSBpdCBtZXNzZXMgdXAgdW53aW5kaW5nIG9mIHRoZSBzdGFjaworICogaW4gdGhlIGRlYnVnZ2VyLgorICovCisjaWZkZWYgY29uZmlnVEFTS19SRVRVUk5fQUREUkVTUworCSNkZWZpbmUgcG9ydFRBU0tfUkVUVVJOX0FERFJFU1MJCQljb25maWdUQVNLX1JFVFVSTl9BRERSRVNTCisjZWxzZQorCSNkZWZpbmUgcG9ydFRBU0tfUkVUVVJOX0FERFJFU1MJCQlwcnZUYXNrRXhpdEVycm9yCisjZW5kaWYKKworLyoqCisgKiBAYnJpZWYgSWYgcG9ydFBSRUxPQURfUkVHSVNURVJTIHRoZW4gcmVnaXN0ZXJzIHdpbGwgYmUgZ2l2ZW4gYW4gaW5pdGlhbCB2YWx1ZQorICogd2hlbiBhIHRhc2sgaXMgY3JlYXRlZC4gVGhpcyBoZWxwcyBpbiBkZWJ1Z2dpbmcgYXQgdGhlIGNvc3Qgb2YgY29kZSBzaXplLgorICovCisjZGVmaW5lIHBvcnRQUkVMT0FEX1JFR0lTVEVSUwkJCQkxCisKKy8qKgorICogQGJyaWVmIEEgdGFzayBpcyBjcmVhdGVkIHdpdGhvdXQgYSBzZWN1cmUgY29udGV4dCwgYW5kIG11c3QgY2FsbAorICogcG9ydEFMTE9DQVRFX1NFQ1VSRV9DT05URVhUKCkgdG8gZ2l2ZSBpdHNlbGYgYSBzZWN1cmUgY29udGV4dCBiZWZvcmUgaXQgbWFrZXMKKyAqIGFueSBzZWN1cmUgY2FsbHMuCisgKi8KKyNkZWZpbmUgcG9ydE5PX1NFQ1VSRV9DT05URVhUCQkJCTAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAqIEBicmllZiBTZXR1cCB0aGUgdGltZXIgdG8gZ2VuZXJhdGUgdGhlIHRpY2sgaW50ZXJydXB0cy4KKyAqLworc3RhdGljIHZvaWQgcHJ2U2V0dXBUaW1lckludGVycnVwdCggdm9pZCApIFBSSVZJTEVHRURfRlVOQ1RJT047CisKKy8qKgorICogQGJyaWVmIFVzZWQgdG8gY2F0Y2ggdGFza3MgdGhhdCBhdHRlbXB0IHRvIHJldHVybiBmcm9tIHRoZWlyIGltcGxlbWVudGluZworICogZnVuY3Rpb24uCisgKi8KK3N0YXRpYyB2b2lkIHBydlRhc2tFeGl0RXJyb3IoIHZvaWQgKTsKKworI2lmKCBjb25maWdFTkFCTEVfTVBVID09IDEgKQorCS8qKgorCSAqIEBicmllZiBTZXR1cCB0aGUgTWVtb3J5IFByb3RlY3Rpb24gVW5pdCAoTVBVKS4KKwkgKi8KKwlzdGF0aWMgdm9pZCBwcnZTZXR1cE1QVSggdm9pZCApIFBSSVZJTEVHRURfRlVOQ1RJT047CisjZW5kaWYgLyogY29uZmlnRU5BQkxFX01QVSAqLworCisjaWYoIGNvbmZpZ0VOQUJMRV9GUFUgPT0gMSApCisJLyoqCisJICogQGJyaWVmIFNldHVwIHRoZSBGbG9hdGluZyBQb2ludCBVbml0IChGUFUpLgorCSAqLworCXN0YXRpYyB2b2lkIHBydlNldHVwRlBVKCB2b2lkICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKyNlbmRpZiAvKiBjb25maWdFTkFCTEVfRlBVICovCisKKy8qKgorICogQGJyaWVmIFlpZWxkIHRoZSBwcm9jZXNzb3IuCisgKi8KK3ZvaWQgdlBvcnRZaWVsZCggdm9pZCApIFBSSVZJTEVHRURfRlVOQ1RJT047CisKKy8qKgorICogQGJyaWVmIEVudGVyIGNyaXRpY2FsIHNlY3Rpb24uCisgKi8KK3ZvaWQgdlBvcnRFbnRlckNyaXRpY2FsKCB2b2lkICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworLyoqCisgKiBAYnJpZWYgRXhpdCBmcm9tIGNyaXRpY2FsIHNlY3Rpb24uCisgKi8KK3ZvaWQgdlBvcnRFeGl0Q3JpdGljYWwoIHZvaWQgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisvKioKKyAqIEBicmllZiBTeXNUaWNrIGhhbmRsZXIuCisgKi8KK3ZvaWQgU3lzVGlja19IYW5kbGVyKCB2b2lkICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworLyoqCisgKiBAYnJpZWYgQyBwYXJ0IG9mIFNWQyBoYW5kbGVyLgorICovCitwb3J0RE9OVF9ESVNDQVJEIHZvaWQgdlBvcnRTVkNIYW5kbGVyX0MoIHVpbnQzMl90ICpwdWxDYWxsZXJTdGFja0FkZHJlc3MgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKgorICogQGJyaWVmIEVhY2ggdGFzayBtYWludGFpbnMgaXRzIG93biBpbnRlcnJ1cHQgc3RhdHVzIGluIHRoZSBjcml0aWNhbCBuZXN0aW5nCisgKiB2YXJpYWJsZS4KKyAqLworc3RhdGljIHZvbGF0aWxlIHVpbnQzMl90IHVsQ3JpdGljYWxOZXN0aW5nID0gMHhhYWFhYWFhYVVMOworCisjaWYoIGNvbmZpZ0VOQUJMRV9UUlVTVFpPTkUgPT0gMSApCisJLyoqCisJICogQGJyaWVmIFNhdmVkIGFzIHBhcnQgb2YgdGhlIHRhc2sgY29udGV4dCB0byBpbmRpY2F0ZSB3aGljaCBjb250ZXh0IHRoZQorCSAqIHRhc2sgaXMgdXNpbmcgb24gdGhlIHNlY3VyZSBzaWRlLgorCSAqLworCXBvcnRET05UX0RJU0NBUkQgdm9sYXRpbGUgU2VjdXJlQ29udGV4dEhhbmRsZV90IHhTZWN1cmVDb250ZXh0ID0gcG9ydE5PX1NFQ1VSRV9DT05URVhUOworI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9UUlVTVFpPTkUgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdm9pZCBwcnZTZXR1cFRpbWVySW50ZXJydXB0KCB2b2lkICkgLyogUFJJVklMRUdFRF9GVU5DVElPTiAqLworeworCS8qIFN0b3AgYW5kIHJlc2V0IHRoZSBTeXNUaWNrLiAqLworCSooIHBvcnROVklDX1NZU1RJQ0tfQ1RSTCApID0gMFVMOworCSooIHBvcnROVklDX1NZU1RJQ0tfQ1VSUkVOVF9WQUxVRSApID0gMFVMOworCisJLyogQ29uZmlndXJlIFN5c1RpY2sgdG8gaW50ZXJydXB0IGF0IHRoZSByZXF1ZXN0ZWQgcmF0ZS4gKi8KKwkqKCBwb3J0TlZJQ19TWVNUSUNLX0xPQUQgKSA9ICggY29uZmlnQ1BVX0NMT0NLX0haIC8gY29uZmlnVElDS19SQVRFX0haICkgLSAxVUw7CisJKiggcG9ydE5WSUNfU1lTVElDS19DVFJMICkgPSBwb3J0TlZJQ19TWVNUSUNLX0NMSyB8IHBvcnROVklDX1NZU1RJQ0tfSU5UIHwgcG9ydE5WSUNfU1lTVElDS19FTkFCTEU7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHZvaWQgcHJ2VGFza0V4aXRFcnJvciggdm9pZCApCit7Cit2b2xhdGlsZSB1aW50MzJfdCB1bER1bW15ID0gMFVMOworCisJLyogQSBmdW5jdGlvbiB0aGF0IGltcGxlbWVudHMgYSB0YXNrIG11c3Qgbm90IGV4aXQgb3IgYXR0ZW1wdCB0byByZXR1cm4gdG8KKwkgKiBpdHMgY2FsbGVyIGFzIHRoZXJlIGlzIG5vdGhpbmcgdG8gcmV0dXJuIHRvLiBJZiBhIHRhc2sgd2FudHMgdG8gZXhpdCBpdAorCSAqIHNob3VsZCBpbnN0ZWFkIGNhbGwgdlRhc2tEZWxldGUoIE5VTEwgKS4gQXJ0aWZpY2lhbGx5IGZvcmNlIGFuIGFzc2VydCgpCisJICogdG8gYmUgdHJpZ2dlcmVkIGlmIGNvbmZpZ0FTU0VSVCgpIGlzIGRlZmluZWQsIHRoZW4gc3RvcCBoZXJlIHNvCisJICogYXBwbGljYXRpb24gd3JpdGVycyBjYW4gY2F0Y2ggdGhlIGVycm9yLiAqLworCWNvbmZpZ0FTU0VSVCggdWxDcml0aWNhbE5lc3RpbmcgPT0gfjBVTCApOworCXBvcnRESVNBQkxFX0lOVEVSUlVQVFMoKTsKKworCXdoaWxlKCB1bER1bW15ID09IDAgKQorCXsKKwkJLyogVGhpcyBmaWxlIGNhbGxzIHBydlRhc2tFeGl0RXJyb3IoKSBhZnRlciB0aGUgc2NoZWR1bGVyIGhhcyBiZWVuCisJCSAqIHN0YXJ0ZWQgdG8gcmVtb3ZlIGEgY29tcGlsZXIgd2FybmluZyBhYm91dCB0aGUgZnVuY3Rpb24gYmVpbmcKKwkJICogZGVmaW5lZCBidXQgbmV2ZXIgY2FsbGVkLiAgdWxEdW1teSBpcyB1c2VkIHB1cmVseSB0byBxdWlldGVuIG90aGVyCisJCSAqIHdhcm5pbmdzIGFib3V0IGNvZGUgYXBwZWFyaW5nIGFmdGVyIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIC0gbWFraW5nCisJCSAqIHVsRHVtbXkgdm9sYXRpbGUgbWFrZXMgdGhlIGNvbXBpbGVyIHRoaW5rIHRoZSBmdW5jdGlvbiBjb3VsZCByZXR1cm4KKwkJICogYW5kIHRoZXJlZm9yZSBub3Qgb3V0cHV0IGFuICd1bnJlYWNoYWJsZSBjb2RlJyB3YXJuaW5nIGZvciBjb2RlIHRoYXQKKwkJICogYXBwZWFycyBhZnRlciBpdC4gKi8KKwl9Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmKCBjb25maWdFTkFCTEVfTVBVID09IDEgKQorCXN0YXRpYyB2b2lkIHBydlNldHVwTVBVKCB2b2lkICkgLyogUFJJVklMRUdFRF9GVU5DVElPTiAqLworCXsKKwkjaWYgZGVmaW5lZCggX19BUk1DQ19WRVJTSU9OICkKKwkJLyogRGVjbGFyYXRpb24gd2hlbiB0aGVzZSB2YXJpYWJsZSBhcmUgZGVmaW5lZCBpbiBjb2RlIGluc3RlYWQgb2YgYmVpbmcKKwkJICogZXhwb3J0ZWQgZnJvbSBsaW5rZXIgc2NyaXB0cy4gKi8KKwkJZXh0ZXJuIHVpbnQzMl90ICogX19wcml2aWxlZ2VkX2Z1bmN0aW9uc19zdGFydF9fOworCQlleHRlcm4gdWludDMyX3QgKiBfX3ByaXZpbGVnZWRfZnVuY3Rpb25zX2VuZF9fOworCQlleHRlcm4gdWludDMyX3QgKiBfX3N5c2NhbGxzX2ZsYXNoX3N0YXJ0X187CisJCWV4dGVybiB1aW50MzJfdCAqIF9fc3lzY2FsbHNfZmxhc2hfZW5kX187CisJCWV4dGVybiB1aW50MzJfdCAqIF9fdW5wcml2aWxlZ2VkX2ZsYXNoX3N0YXJ0X187CisJCWV4dGVybiB1aW50MzJfdCAqIF9fdW5wcml2aWxlZ2VkX2ZsYXNoX2VuZF9fOworCQlleHRlcm4gdWludDMyX3QgKiBfX3ByaXZpbGVnZWRfc3JhbV9zdGFydF9fOworCQlleHRlcm4gdWludDMyX3QgKiBfX3ByaXZpbGVnZWRfc3JhbV9lbmRfXzsKKwkjZWxzZQorCQkvKiBEZWNsYXJhdGlvbiB3aGVuIHRoZXNlIHZhcmlhYmxlIGFyZSBleHBvcnRlZCBmcm9tIGxpbmtlciBzY3JpcHRzLiAqLworCQlleHRlcm4gdWludDMyX3QgX19wcml2aWxlZ2VkX2Z1bmN0aW9uc19zdGFydF9fW107CisJCWV4dGVybiB1aW50MzJfdCBfX3ByaXZpbGVnZWRfZnVuY3Rpb25zX2VuZF9fW107CisJCWV4dGVybiB1aW50MzJfdCBfX3N5c2NhbGxzX2ZsYXNoX3N0YXJ0X19bXTsKKwkJZXh0ZXJuIHVpbnQzMl90IF9fc3lzY2FsbHNfZmxhc2hfZW5kX19bXTsKKwkJZXh0ZXJuIHVpbnQzMl90IF9fdW5wcml2aWxlZ2VkX2ZsYXNoX3N0YXJ0X19bXTsKKwkJZXh0ZXJuIHVpbnQzMl90IF9fdW5wcml2aWxlZ2VkX2ZsYXNoX2VuZF9fW107CisJCWV4dGVybiB1aW50MzJfdCBfX3ByaXZpbGVnZWRfc3JhbV9zdGFydF9fW107CisJCWV4dGVybiB1aW50MzJfdCBfX3ByaXZpbGVnZWRfc3JhbV9lbmRfX1tdOworCSNlbmRpZiAvKiBkZWZpbmVkKCBfX0FSTUNDX1ZFUlNJT04gKSAqLworCisJCS8qIENoZWNrIHRoYXQgdGhlIE1QVSBpcyBwcmVzZW50LiAqLworCQlpZiggcG9ydE1QVV9UWVBFX1JFRyA9PSBwb3J0RVhQRUNURURfTVBVX1RZUEVfVkFMVUUgKQorCQl7CisJCQkvKiBNQUlSMCAtIEluZGV4IDAuICovCisJCQlwb3J0TVBVX01BSVIwX1JFRyB8PSAoICggcG9ydE1QVV9OT1JNQUxfTUVNT1JZX0JVRkZFUkFCTEVfQ0FDSEVBQkxFIDw8IHBvcnRNUFVfTUFJUl9BVFRSMF9QT1MgKSAmIHBvcnRNUFVfTUFJUl9BVFRSMF9NQVNLICk7CisJCQkvKiBNQUlSMCAtIEluZGV4IDEuICovCisJCQlwb3J0TVBVX01BSVIwX1JFRyB8PSAoICggcG9ydE1QVV9ERVZJQ0VfTUVNT1JZX25HblJFIDw8IHBvcnRNUFVfTUFJUl9BVFRSMV9QT1MgKSAmIHBvcnRNUFVfTUFJUl9BVFRSMV9NQVNLICk7CisKKwkJCS8qIFNldHVwIHByaXZpbGVnZWQgZmxhc2ggYXMgUmVhZCBPbmx5IHNvIHRoYXQgcHJpdmlsZWdlZCB0YXNrcyBjYW4KKwkJCSAqIHJlYWQgaXQgYnV0IG5vdCBtb2RpZnkuICovCisJCQlwb3J0TVBVX1JOUl9SRUcgPSBwb3J0UFJJVklMRUdFRF9GTEFTSF9SRUdJT047CisJCQlwb3J0TVBVX1JCQVJfUkVHID0JKCAoICggdWludDMyX3QgKSBfX3ByaXZpbGVnZWRfZnVuY3Rpb25zX3N0YXJ0X18gKSAmIHBvcnRNUFVfUkJBUl9BRERSRVNTX01BU0sgKSB8CisJCQkJCQkJCSggcG9ydE1QVV9SRUdJT05fTk9OX1NIQVJFQUJMRSApIHwKKwkJCQkJCQkJKCBwb3J0TVBVX1JFR0lPTl9QUklWSUxFR0VEX1JFQURfT05MWSApOworCQkJcG9ydE1QVV9STEFSX1JFRyA9CSggKCAoIHVpbnQzMl90ICkgX19wcml2aWxlZ2VkX2Z1bmN0aW9uc19lbmRfXyApICYgcG9ydE1QVV9STEFSX0FERFJFU1NfTUFTSyApIHwKKwkJCQkJCQkJKCBwb3J0TVBVX1JMQVJfQVRUUl9JTkRFWDAgKSB8CisJCQkJCQkJCSggcG9ydE1QVV9STEFSX1JFR0lPTl9FTkFCTEUgKTsKKworCQkJLyogU2V0dXAgdW5wcml2aWxlZ2VkIGZsYXNoIGFzIFJlYWQgT25seSBieSBib3RoIHByaXZpbGVnZWQgYW5kCisJCQkgKiB1bnByaXZpbGVnZWQgdGFza3MuIEFsbCB0YXNrcyBjYW4gcmVhZCBpdCBidXQgbm8tb25lIGNhbiBtb2RpZnkuICovCisJCQlwb3J0TVBVX1JOUl9SRUcgPSBwb3J0VU5QUklWSUxFR0VEX0ZMQVNIX1JFR0lPTjsKKwkJCXBvcnRNUFVfUkJBUl9SRUcgPQkoICggKCB1aW50MzJfdCApIF9fdW5wcml2aWxlZ2VkX2ZsYXNoX3N0YXJ0X18gKSAmIHBvcnRNUFVfUkJBUl9BRERSRVNTX01BU0sgKSB8CisJCQkJCQkJCSggcG9ydE1QVV9SRUdJT05fTk9OX1NIQVJFQUJMRSApIHwKKwkJCQkJCQkJKCBwb3J0TVBVX1JFR0lPTl9SRUFEX09OTFkgKTsKKwkJCXBvcnRNUFVfUkxBUl9SRUcgPQkoICggKCB1aW50MzJfdCApIF9fdW5wcml2aWxlZ2VkX2ZsYXNoX2VuZF9fICkgJiBwb3J0TVBVX1JMQVJfQUREUkVTU19NQVNLICkgfAorCQkJCQkJCQkoIHBvcnRNUFVfUkxBUl9BVFRSX0lOREVYMCApIHwKKwkJCQkJCQkJKCBwb3J0TVBVX1JMQVJfUkVHSU9OX0VOQUJMRSApOworCisJCQkvKiBTZXR1cCB1bnByaXZpbGVnZWQgc3lzY2FsbHMgZmxhc2ggYXMgUmVhZCBPbmx5IGJ5IGJvdGggcHJpdmlsZWdlZAorCQkJICogYW5kIHVucHJpdmlsZWdlZCB0YXNrcy4gQWxsIHRhc2tzIGNhbiByZWFkIGl0IGJ1dCBuby1vbmUgY2FuIG1vZGlmeS4gKi8KKwkJCXBvcnRNUFVfUk5SX1JFRyA9IHBvcnRVTlBSSVZJTEVHRURfU1lTQ0FMTFNfUkVHSU9OOworCQkJcG9ydE1QVV9SQkFSX1JFRyA9CSggKCAoIHVpbnQzMl90ICkgX19zeXNjYWxsc19mbGFzaF9zdGFydF9fICkgJiBwb3J0TVBVX1JCQVJfQUREUkVTU19NQVNLICkgfAorCQkJCQkJCQkoIHBvcnRNUFVfUkVHSU9OX05PTl9TSEFSRUFCTEUgKSB8CisJCQkJCQkJCSggcG9ydE1QVV9SRUdJT05fUkVBRF9PTkxZICk7CisJCQlwb3J0TVBVX1JMQVJfUkVHID0JKCAoICggdWludDMyX3QgKSBfX3N5c2NhbGxzX2ZsYXNoX2VuZF9fICkgJiBwb3J0TVBVX1JMQVJfQUREUkVTU19NQVNLICkgfAorCQkJCQkJCQkoIHBvcnRNUFVfUkxBUl9BVFRSX0lOREVYMCApIHwKKwkJCQkJCQkJKCBwb3J0TVBVX1JMQVJfUkVHSU9OX0VOQUJMRSApOworCisJCQkvKiBTZXR1cCBSQU0gY29udGFpbmluZyBrZXJuZWwgZGF0YSBmb3IgcHJpdmlsZWdlZCBhY2Nlc3Mgb25seS4gKi8KKwkJCXBvcnRNUFVfUk5SX1JFRyA9IHBvcnRQUklWSUxFR0VEX1JBTV9SRUdJT047CisJCQlwb3J0TVBVX1JCQVJfUkVHID0JKCAoICggdWludDMyX3QgKSBfX3ByaXZpbGVnZWRfc3JhbV9zdGFydF9fICkgJiBwb3J0TVBVX1JCQVJfQUREUkVTU19NQVNLICkgfAorCQkJCQkJCQkoIHBvcnRNUFVfUkVHSU9OX05PTl9TSEFSRUFCTEUgKSB8CisJCQkJCQkJCSggcG9ydE1QVV9SRUdJT05fUFJJVklMRUdFRF9SRUFEX1dSSVRFICkgfAorCQkJCQkJCQkoIHBvcnRNUFVfUkVHSU9OX0VYRUNVVEVfTkVWRVIgKTsKKwkJCXBvcnRNUFVfUkxBUl9SRUcgPQkoICggKCB1aW50MzJfdCApIF9fcHJpdmlsZWdlZF9zcmFtX2VuZF9fICkgJiBwb3J0TVBVX1JMQVJfQUREUkVTU19NQVNLICkgfAorCQkJCQkJCQkoIHBvcnRNUFVfUkxBUl9BVFRSX0lOREVYMCApIHwKKwkJCQkJCQkJKCBwb3J0TVBVX1JMQVJfUkVHSU9OX0VOQUJMRSApOworCisJCQkvKiBFbmFibGUgbWVtIGZhdWx0LiAqLworCQkJcG9ydFNDQl9TWVNfSEFORExFUl9DVFJMX1NUQVRFX1JFRyB8PSBwb3J0U0NCX01FTV9GQVVMVF9FTkFCTEU7CisKKwkJCS8qIEVuYWJsZSBNUFUgd2l0aCBwcml2aWxlZ2VkIGJhY2tncm91bmQgYWNjZXNzIGkuZS4gdW5tYXBwZWQKKwkJCSAqIHJlZ2lvbnMgaGF2ZSBwcml2aWxlZ2VkIGFjY2Vzcy4gKi8KKwkJCXBvcnRNUFVfQ1RSTF9SRUcgfD0gKCBwb3J0TVBVX1BSSVZfQkFDS0dST1VORF9FTkFCTEUgfCBwb3J0TVBVX0VOQUJMRSApOworCQl9CisJfQorI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9NUFUgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYoIGNvbmZpZ0VOQUJMRV9GUFUgPT0gMSApCisJc3RhdGljIHZvaWQgcHJ2U2V0dXBGUFUoIHZvaWQgKSAvKiBQUklWSUxFR0VEX0ZVTkNUSU9OICovCisJeworCQkjaWYoIGNvbmZpZ0VOQUJMRV9UUlVTVFpPTkUgPT0gMSApCisJCXsKKwkJCS8qIEVuYWJsZSBub24tc2VjdXJlIGFjY2VzcyB0byB0aGUgRlBVLiAqLworCQkJU2VjdXJlSW5pdF9FbmFibGVOU0ZQVUFjY2VzcygpOworCQl9CisJCSNlbmRpZiAvKiBjb25maWdFTkFCTEVfVFJVU1RaT05FICovCisKKwkJLyogQ1AxMCA9IDExID09PiBGdWxsIGFjY2VzcyB0byBGUFUgaS5lLiBib3RoIHByaXZpbGVnZWQgYW5kCisJCSAqIHVucHJpdmlsZWdlZCBjb2RlIHNob3VsZCBiZSBhYmxlIHRvIGFjY2VzcyBGUFUuIENQMTEgc2hvdWxkIGJlCisJCSAqIHByb2dyYW1tZWQgdG8gdGhlIHNhbWUgdmFsdWUgYXMgQ1AxMC4gKi8KKwkJKiggcG9ydENQQUNSICkgfD0JKAkoIHBvcnRDUEFDUl9DUDEwX1ZBTFVFIDw8IHBvcnRDUEFDUl9DUDEwX1BPUyApIHwKKwkJCQkJCQkJKCBwb3J0Q1BBQ1JfQ1AxMV9WQUxVRSA8PCBwb3J0Q1BBQ1JfQ1AxMV9QT1MgKQorCQkJCQkJCSk7CisKKwkJLyogQVNQRU4gPSAxID09PiBIYXJkd2FyZSBzaG91bGQgYXV0b21hdGljYWxseSBwcmVzZXJ2ZSBmbG9hdGluZyBwb2ludAorCQkgKiBjb250ZXh0IG9uIGV4Y2VwdGlvbiBlbnRyeSBhbmQgcmVzdG9yZSBvbiBleGNlcHRpb24gcmV0dXJuLgorCQkgKiBMU1BFTiA9IDEgPT0+IEVuYWJsZSBsYXp5IGNvbnRleHQgc2F2ZSBvZiBGUCBzdGF0ZS4gKi8KKwkJKiggcG9ydEZQQ0NSICkgfD0gKCBwb3J0RlBDQ1JfQVNQRU5fTUFTSyB8IHBvcnRGUENDUl9MU1BFTl9NQVNLICk7CisJfQorI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9GUFUgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIHZQb3J0WWllbGQoIHZvaWQgKSAvKiBQUklWSUxFR0VEX0ZVTkNUSU9OICovCit7CisJLyogU2V0IGEgUGVuZFNWIHRvIHJlcXVlc3QgYSBjb250ZXh0IHN3aXRjaC4gKi8KKwkqKCBwb3J0TlZJQ19JTlRfQ1RSTCApID0gcG9ydE5WSUNfUEVORFNWU0VUOworCisJLyogQmFycmllcnMgYXJlIG5vcm1hbGx5IG5vdCByZXF1aXJlZCBidXQgZG8gZW5zdXJlIHRoZSBjb2RlIGlzCisJICogY29tcGxldGVseSB3aXRoaW4gdGhlIHNwZWNpZmllZCBiZWhhdmlvdXIgZm9yIHRoZSBhcmNoaXRlY3R1cmUuICovCisJX19hc20gdm9sYXRpbGUoICJkc2IiIDo6OiAibWVtb3J5IiApOworCV9fYXNtIHZvbGF0aWxlKCAiaXNiIiApOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgdlBvcnRFbnRlckNyaXRpY2FsKCB2b2lkICkgLyogUFJJVklMRUdFRF9GVU5DVElPTiAqLworeworCXBvcnRESVNBQkxFX0lOVEVSUlVQVFMoKTsKKwl1bENyaXRpY2FsTmVzdGluZysrOworCisJLyogQmFycmllcnMgYXJlIG5vcm1hbGx5IG5vdCByZXF1aXJlZCBidXQgZG8gZW5zdXJlIHRoZSBjb2RlIGlzCisJICogY29tcGxldGVseSB3aXRoaW4gdGhlIHNwZWNpZmllZCBiZWhhdmlvdXIgZm9yIHRoZSBhcmNoaXRlY3R1cmUuICovCisJX19hc20gdm9sYXRpbGUoICJkc2IiIDo6OiAibWVtb3J5IiApOworCV9fYXNtIHZvbGF0aWxlKCAiaXNiIiApOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgdlBvcnRFeGl0Q3JpdGljYWwoIHZvaWQgKSAvKiBQUklWSUxFR0VEX0ZVTkNUSU9OICovCit7CisJY29uZmlnQVNTRVJUKCB1bENyaXRpY2FsTmVzdGluZyApOworCXVsQ3JpdGljYWxOZXN0aW5nLS07CisKKwlpZiggdWxDcml0aWNhbE5lc3RpbmcgPT0gMCApCisJeworCQlwb3J0RU5BQkxFX0lOVEVSUlVQVFMoKTsKKwl9Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBTeXNUaWNrX0hhbmRsZXIoIHZvaWQgKSAvKiBQUklWSUxFR0VEX0ZVTkNUSU9OICovCit7Cit1aW50MzJfdCB1bFByZXZpb3VzTWFzazsKKworCXVsUHJldmlvdXNNYXNrID0gcG9ydFNFVF9JTlRFUlJVUFRfTUFTS19GUk9NX0lTUigpOworCXsKKwkJLyogSW5jcmVtZW50IHRoZSBSVE9TIHRpY2suICovCisJCWlmKCB4VGFza0luY3JlbWVudFRpY2soKSAhPSBwZEZBTFNFICkKKwkJeworCQkJLyogUGVuZCBhIGNvbnRleHQgc3dpdGNoLiAqLworCQkJKiggcG9ydE5WSUNfSU5UX0NUUkwgKSA9IHBvcnROVklDX1BFTkRTVlNFVDsKKwkJfQorCX0KKwlwb3J0Q0xFQVJfSU5URVJSVVBUX01BU0tfRlJPTV9JU1IoIHVsUHJldmlvdXNNYXNrICk7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCB2UG9ydFNWQ0hhbmRsZXJfQyggdWludDMyX3QgKnB1bENhbGxlclN0YWNrQWRkcmVzcyApIC8qIFBSSVZJTEVHRURfRlVOQ1RJT04gcG9ydERPTlRfRElTQ0FSRCAqLworeworI2lmKCBjb25maWdFTkFCTEVfTVBVID09IDEgKQorCSNpZiBkZWZpbmVkKCBfX0FSTUNDX1ZFUlNJT04gKQorCQkvKiBEZWNsYXJhdGlvbiB3aGVuIHRoZXNlIHZhcmlhYmxlIGFyZSBkZWZpbmVkIGluIGNvZGUgaW5zdGVhZCBvZiBiZWluZworCQkgKiBleHBvcnRlZCBmcm9tIGxpbmtlciBzY3JpcHRzLiAqLworCQlleHRlcm4gdWludDMyX3QgKiBfX3N5c2NhbGxzX2ZsYXNoX3N0YXJ0X187CisJCWV4dGVybiB1aW50MzJfdCAqIF9fc3lzY2FsbHNfZmxhc2hfZW5kX187CisJI2Vsc2UKKwkJLyogRGVjbGFyYXRpb24gd2hlbiB0aGVzZSB2YXJpYWJsZSBhcmUgZXhwb3J0ZWQgZnJvbSBsaW5rZXIgc2NyaXB0cy4gKi8KKwkJZXh0ZXJuIHVpbnQzMl90IF9fc3lzY2FsbHNfZmxhc2hfc3RhcnRfX1tdOworCQlleHRlcm4gdWludDMyX3QgX19zeXNjYWxsc19mbGFzaF9lbmRfX1tdOworCSNlbmRpZiAvKiBkZWZpbmVkKCBfX0FSTUNDX1ZFUlNJT04gKSAqLworI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9NUFUgKi8KKwordWludDMyX3QgdWxQQzsKKworI2lmKCBjb25maWdFTkFCTEVfVFJVU1RaT05FID09IDEgKQorCXVpbnQzMl90IHVsUjA7CisJI2lmKCBjb25maWdFTkFCTEVfTVBVID09IDEgKQorCQl1aW50MzJfdCB1bENvbnRyb2wsIHVsSXNUYXNrUHJpdmlsZWdlZDsKKwkjZW5kaWYgLyogY29uZmlnRU5BQkxFX01QVSAqLworI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9UUlVTVFpPTkUgKi8KK3VpbnQ4X3QgdWNTVkNOdW1iZXI7CisKKwkvKiBSZWdpc3RlciBhcmUgc3RvcmVkIG9uIHRoZSBzdGFjayBpbiB0aGUgZm9sbG93aW5nIG9yZGVyIC0gUjAsIFIxLCBSMiwgUjMsCisJICogUjEyLCBMUiwgUEMsIHhQU1IuICovCisJdWxQQyA9IHB1bENhbGxlclN0YWNrQWRkcmVzc1sgNiBdOworCXVjU1ZDTnVtYmVyID0gKCAoIHVpbnQ4X3QgKikgdWxQQyApWyAtMiBdOworCisJc3dpdGNoKCB1Y1NWQ051bWJlciApCisJeworCQkjaWYoIGNvbmZpZ0VOQUJMRV9UUlVTVFpPTkUgPT0gMSApCisJCQljYXNlIHBvcnRTVkNfQUxMT0NBVEVfU0VDVVJFX0NPTlRFWFQ6CisJCQl7CisJCQkJLyogUjAgY29udGFpbnMgdGhlIHN0YWNrIHNpemUgcGFzc2VkIGFzIHBhcmFtZXRlciB0byB0aGUKKwkJCQkgKiB2UG9ydEFsbG9jYXRlU2VjdXJlQ29udGV4dCBmdW5jdGlvbi4gKi8KKwkJCQl1bFIwID0gcHVsQ2FsbGVyU3RhY2tBZGRyZXNzWyAwIF07CisKKwkJCQkjaWYoIGNvbmZpZ0VOQUJMRV9NUFUgPT0gMSApCisJCQkJeworCQkJCQkvKiBSZWFkIHRoZSBDT05UUk9MIHJlZ2lzdGVyIHZhbHVlLiAqLworCQkJCQlfX2FzbSB2b2xhdGlsZSAoICJtcnMgJTAsIGNvbnRyb2wiICA6ICI9ciIgKCB1bENvbnRyb2wgKSApOworCisJCQkJCS8qIFRoZSB0YXNrIHRoYXQgcmFpc2VkIHRoZSBTVkMgaXMgcHJpdmlsZWdlZCBpZiBCaXRbMF0KKwkJCQkJICogaW4gdGhlIENPTlRST0wgcmVnaXN0ZXIgaXMgMC4gKi8KKwkJCQkJdWxJc1Rhc2tQcml2aWxlZ2VkID0gKCAoIHVsQ29udHJvbCAmIHBvcnRDT05UUk9MX1BSSVZJTEVHRURfTUFTSyApID09IDAgKTsKKworCQkJCQkvKiBBbGxvY2F0ZSBhbmQgbG9hZCBhIGNvbnRleHQgZm9yIHRoZSBzZWN1cmUgdGFzay4gKi8KKwkJCQkJeFNlY3VyZUNvbnRleHQgPSBTZWN1cmVDb250ZXh0X0FsbG9jYXRlQ29udGV4dCggdWxSMCwgdWxJc1Rhc2tQcml2aWxlZ2VkICk7CisJCQkJfQorCQkJCSNlbHNlCisJCQkJeworCQkJCQkvKiBBbGxvY2F0ZSBhbmQgbG9hZCBhIGNvbnRleHQgZm9yIHRoZSBzZWN1cmUgdGFzay4gKi8KKwkJCQkJeFNlY3VyZUNvbnRleHQgPSBTZWN1cmVDb250ZXh0X0FsbG9jYXRlQ29udGV4dCggdWxSMCApOworCQkJCX0KKwkJCQkjZW5kaWYgLyogY29uZmlnRU5BQkxFX01QVSAqLworCisJCQkJY29uZmlnQVNTRVJUKCB4U2VjdXJlQ29udGV4dCAhPSBOVUxMICk7CisJCQkJU2VjdXJlQ29udGV4dF9Mb2FkQ29udGV4dCggeFNlY3VyZUNvbnRleHQgKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCQljYXNlIHBvcnRTVkNfRlJFRV9TRUNVUkVfQ09OVEVYVDoKKwkJCXsKKwkJCQkvKiBSMCBjb250YWlucyB0aGUgc2VjdXJlIGNvbnRleHQgaGFuZGxlIHRvIGJlIGZyZWVkLiAqLworCQkJCXVsUjAgPSBwdWxDYWxsZXJTdGFja0FkZHJlc3NbIDAgXTsKKworCQkJCS8qIEZyZWUgdGhlIHNlY3VyZSBjb250ZXh0LiAqLworCQkJCVNlY3VyZUNvbnRleHRfRnJlZUNvbnRleHQoICggU2VjdXJlQ29udGV4dEhhbmRsZV90ICkgdWxSMCApOworCQkJfQorCQkJYnJlYWs7CisJCSNlbmRpZiAvKiBjb25maWdFTkFCTEVfVFJVU1RaT05FICovCisKKwkJY2FzZSBwb3J0U1ZDX1NUQVJUX1NDSEVEVUxFUjoKKwkJeworCQkJI2lmKCBjb25maWdFTkFCTEVfVFJVU1RaT05FID09IDEgKQorCQkJeworCQkJCS8qIERlLXByaW9yaXRpemUgdGhlIG5vbi1zZWN1cmUgZXhjZXB0aW9ucyBzbyB0aGF0IHRoZQorCQkJCSAqIG5vbi1zZWN1cmUgcGVuZFNWIHJ1bnMgYXQgdGhlIGxvd2VzdCBwcmlvcml0eS4gKi8KKwkJCQlTZWN1cmVJbml0X0RlUHJpb3JpdGl6ZU5TRXhjZXB0aW9ucygpOworCisJCQkJLyogSW5pdGlhbGl6ZSB0aGUgc2VjdXJlIGNvbnRleHQgbWFuYWdlbWVudCBzeXN0ZW0uICovCisJCQkJU2VjdXJlQ29udGV4dF9Jbml0KCk7CisJCQl9CisJCQkjZW5kaWYgLyogY29uZmlnRU5BQkxFX1RSVVNUWk9ORSAqLworCisJCQkjaWYoIGNvbmZpZ0VOQUJMRV9GUFUgPT0gMSApCisJCQl7CisJCQkJLyogU2V0dXAgdGhlIEZsb2F0aW5nIFBvaW50IFVuaXQgKEZQVSkuICovCisJCQkJcHJ2U2V0dXBGUFUoKTsKKwkJCX0KKwkJCSNlbmRpZiAvKiBjb25maWdFTkFCTEVfRlBVICovCisKKwkJCS8qIFNldHVwIHRoZSBjb250ZXh0IG9mIHRoZSBmaXJzdCB0YXNrIHNvIHRoYXQgdGhlIGZpcnN0IHRhc2sgc3RhcnRzCisJCQkgKiBleGVjdXRpbmcuICovCisJCQl2UmVzdG9yZUNvbnRleHRPZkZpcnN0VGFzaygpOworCQl9CisJCWJyZWFrOworCisJCSNpZiggY29uZmlnRU5BQkxFX01QVSA9PSAxICkKKwkJCWNhc2UgcG9ydFNWQ19SQUlTRV9QUklWSUxFR0U6CisJCQl7CisJCQkJLyogT25seSByYWlzZSB0aGUgcHJpdmlsZWdlLCBpZiB0aGUgc3ZjIHdhcyByYWlzZWQgZnJvbSBhbnkgb2YKKwkJCQkgKiB0aGUgc3lzdGVtIGNhbGxzLiAqLworCQkJCWlmKCB1bFBDID49ICggdWludDMyX3QgKSBfX3N5c2NhbGxzX2ZsYXNoX3N0YXJ0X18gJiYKKwkJCQkJdWxQQyA8PSAoIHVpbnQzMl90ICkgX19zeXNjYWxsc19mbGFzaF9lbmRfXyApCisJCQkJeworCQkJCQl2UmFpc2VQcml2aWxlZ2UoKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9NUFUgKi8KKworCQlkZWZhdWx0OgorCQl7CisJCQkvKiBJbmNvcnJlY3QgU1ZDIGNhbGwuICovCisJCQljb25maWdBU1NFUlQoIHBkRkFMU0UgKTsKKwkJfQorCX0KK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYoIGNvbmZpZ0VOQUJMRV9NUFUgPT0gMSApCisJU3RhY2tUeXBlX3QgKnB4UG9ydEluaXRpYWxpc2VTdGFjayggU3RhY2tUeXBlX3QgKnB4VG9wT2ZTdGFjaywgU3RhY2tUeXBlX3QgKnB4RW5kT2ZTdGFjaywgVGFza0Z1bmN0aW9uX3QgcHhDb2RlLCB2b2lkICpwdlBhcmFtZXRlcnMsIEJhc2VUeXBlX3QgeFJ1blByaXZpbGVnZWQgKSAvKiBQUklWSUxFR0VEX0ZVTkNUSU9OICovCisjZWxzZQorCVN0YWNrVHlwZV90ICpweFBvcnRJbml0aWFsaXNlU3RhY2soIFN0YWNrVHlwZV90ICpweFRvcE9mU3RhY2ssIFN0YWNrVHlwZV90ICpweEVuZE9mU3RhY2ssIFRhc2tGdW5jdGlvbl90IHB4Q29kZSwgdm9pZCAqcHZQYXJhbWV0ZXJzICkgLyogUFJJVklMRUdFRF9GVU5DVElPTiAqLworI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9NUFUgKi8KK3sKKwkvKiBTaW11bGF0ZSB0aGUgc3RhY2sgZnJhbWUgYXMgaXQgd291bGQgYmUgY3JlYXRlZCBieSBhIGNvbnRleHQgc3dpdGNoCisJICogaW50ZXJydXB0LiAqLworCSNpZiggcG9ydFBSRUxPQURfUkVHSVNURVJTID09IDAgKQorCXsKKwkJcHhUb3BPZlN0YWNrLS07IC8qIE9mZnNldCBhZGRlZCB0byBhY2NvdW50IGZvciB0aGUgd2F5IHRoZSBNQ1UgdXNlcyB0aGUgc3RhY2sgb24gZW50cnkvZXhpdCBvZiBpbnRlcnJ1cHRzLiAqLworCQkqcHhUb3BPZlN0YWNrID0gcG9ydElOSVRJQUxfWFBTUjsJCQkJCQkJLyogeFBTUiAqLworCQlweFRvcE9mU3RhY2stLTsKKwkJKnB4VG9wT2ZTdGFjayA9ICggU3RhY2tUeXBlX3QgKSBweENvZGU7CQkJCQkJLyogUEMgKi8KKwkJcHhUb3BPZlN0YWNrLS07CisJCSpweFRvcE9mU3RhY2sgPSAoIFN0YWNrVHlwZV90ICkgcG9ydFRBU0tfUkVUVVJOX0FERFJFU1M7CS8qIExSICovCisJCXB4VG9wT2ZTdGFjayAtPSA1OwkJCQkJCQkJCQkJLyogUjEyLCBSMywgUjIgYW5kIFIxLiAqLworCQkqcHhUb3BPZlN0YWNrID0gKCBTdGFja1R5cGVfdCApIHB2UGFyYW1ldGVyczsJCQkJLyogUjAgKi8KKwkJcHhUb3BPZlN0YWNrIC09IDk7CQkJCQkJCQkJCQkvKiBSMTEuLlI0LCBFWENfUkVUVVJOLiAqLworCQkqcHhUb3BPZlN0YWNrID0gcG9ydElOSVRJQUxfRVhDX1JFVFVSTjsKKworCQkjaWYoIGNvbmZpZ0VOQUJMRV9NUFUgPT0gMSApCisJCXsKKwkJCXB4VG9wT2ZTdGFjay0tOworCQkJaWYoIHhSdW5Qcml2aWxlZ2VkID09IHBkVFJVRSApCisJCQl7CisJCQkJKnB4VG9wT2ZTdGFjayA9IHBvcnRJTklUSUFMX0NPTlRST0xfUFJJVklMRUdFRDsJCS8qIFNsb3QgdXNlZCB0byBob2xkIHRoaXMgdGFzaydzIENPTlRST0wgdmFsdWUuICovCisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJKnB4VG9wT2ZTdGFjayA9IHBvcnRJTklUSUFMX0NPTlRST0xfVU5QUklWSUxFR0VEOwkvKiBTbG90IHVzZWQgdG8gaG9sZCB0aGlzIHRhc2sncyBDT05UUk9MIHZhbHVlLiAqLworCQkJfQorCQl9CisJCSNlbmRpZiAvKiBjb25maWdFTkFCTEVfTVBVICovCisKKwkJcHhUb3BPZlN0YWNrLS07CisJCSpweFRvcE9mU3RhY2sgPSAoIFN0YWNrVHlwZV90ICkgcHhFbmRPZlN0YWNrOwkvKiBTbG90IHVzZWQgdG8gaG9sZCB0aGlzIHRhc2sncyBQU1BMSU0gdmFsdWUuICovCisKKwkJI2lmKCBjb25maWdFTkFCTEVfVFJVU1RaT05FID09IDEgKQorCQl7CisJCQlweFRvcE9mU3RhY2stLTsKKwkJCSpweFRvcE9mU3RhY2sgPSBwb3J0Tk9fU0VDVVJFX0NPTlRFWFQ7CQkvKiBTbG90IHVzZWQgdG8gaG9sZCB0aGlzIHRhc2sncyB4U2VjdXJlQ29udGV4dCB2YWx1ZS4gKi8KKwkJfQorCQkjZW5kaWYgLyogY29uZmlnRU5BQkxFX1RSVVNUWk9ORSAqLworCX0KKwkjZWxzZSAvKiBwb3J0UFJFTE9BRF9SRUdJU1RFUlMgKi8KKwl7CisJCXB4VG9wT2ZTdGFjay0tOyAvKiBPZmZzZXQgYWRkZWQgdG8gYWNjb3VudCBmb3IgdGhlIHdheSB0aGUgTUNVIHVzZXMgdGhlIHN0YWNrIG9uIGVudHJ5L2V4aXQgb2YgaW50ZXJydXB0cy4gKi8KKwkJKnB4VG9wT2ZTdGFjayA9IHBvcnRJTklUSUFMX1hQU1I7CQkJCQkJCS8qIHhQU1IgKi8KKwkJcHhUb3BPZlN0YWNrLS07CisJCSpweFRvcE9mU3RhY2sgPSAoIFN0YWNrVHlwZV90ICkgcHhDb2RlOwkJCQkJCS8qIFBDICovCisJCXB4VG9wT2ZTdGFjay0tOworCQkqcHhUb3BPZlN0YWNrID0gKCBTdGFja1R5cGVfdCApIHBvcnRUQVNLX1JFVFVSTl9BRERSRVNTOwkvKiBMUiAqLworCQlweFRvcE9mU3RhY2stLTsKKwkJKnB4VG9wT2ZTdGFjayA9ICggU3RhY2tUeXBlX3QgKSAweDEyMTIxMjEyVUw7CQkJCS8qIFIxMiAqLworCQlweFRvcE9mU3RhY2stLTsKKwkJKnB4VG9wT2ZTdGFjayA9ICggU3RhY2tUeXBlX3QgKSAweDAzMDMwMzAzVUw7CQkJCS8qIFIzICovCisJCXB4VG9wT2ZTdGFjay0tOworCQkqcHhUb3BPZlN0YWNrID0gKCBTdGFja1R5cGVfdCApIDB4MDIwMjAyMDJVTDsJCQkJLyogUjIgKi8KKwkJcHhUb3BPZlN0YWNrLS07CisJCSpweFRvcE9mU3RhY2sgPSAoIFN0YWNrVHlwZV90ICkgMHgwMTAxMDEwMVVMOwkJCQkvKiBSMSAqLworCQlweFRvcE9mU3RhY2stLTsKKwkJKnB4VG9wT2ZTdGFjayA9ICggU3RhY2tUeXBlX3QgKSBwdlBhcmFtZXRlcnM7CQkJCS8qIFIwICovCisJCXB4VG9wT2ZTdGFjay0tOworCQkqcHhUb3BPZlN0YWNrID0gKCBTdGFja1R5cGVfdCApIDB4MTExMTExMTFVTDsJCQkJLyogUjExICovCisJCXB4VG9wT2ZTdGFjay0tOworCQkqcHhUb3BPZlN0YWNrID0gKCBTdGFja1R5cGVfdCApIDB4MTAxMDEwMTBVTDsJCQkJLyogUjEwICovCisJCXB4VG9wT2ZTdGFjay0tOworCQkqcHhUb3BPZlN0YWNrID0gKCBTdGFja1R5cGVfdCApIDB4MDkwOTA5MDlVTDsJCQkJLyogUjA5ICovCisJCXB4VG9wT2ZTdGFjay0tOworCQkqcHhUb3BPZlN0YWNrID0gKCBTdGFja1R5cGVfdCApIDB4MDgwODA4MDhVTDsJCQkJLyogUjA4ICovCisJCXB4VG9wT2ZTdGFjay0tOworCQkqcHhUb3BPZlN0YWNrID0gKCBTdGFja1R5cGVfdCApIDB4MDcwNzA3MDdVTDsJCQkJLyogUjA3ICovCisJCXB4VG9wT2ZTdGFjay0tOworCQkqcHhUb3BPZlN0YWNrID0gKCBTdGFja1R5cGVfdCApIDB4MDYwNjA2MDZVTDsJCQkJLyogUjA2ICovCisJCXB4VG9wT2ZTdGFjay0tOworCQkqcHhUb3BPZlN0YWNrID0gKCBTdGFja1R5cGVfdCApIDB4MDUwNTA1MDVVTDsJCQkJLyogUjA1ICovCisJCXB4VG9wT2ZTdGFjay0tOworCQkqcHhUb3BPZlN0YWNrID0gKCBTdGFja1R5cGVfdCApIDB4MDQwNDA0MDRVTDsJCQkJLyogUjA0ICovCisJCXB4VG9wT2ZTdGFjay0tOworCQkqcHhUb3BPZlN0YWNrID0gcG9ydElOSVRJQUxfRVhDX1JFVFVSTjsJCQkJCQkvKiBFWENfUkVUVVJOICovCisKKwkJI2lmKCBjb25maWdFTkFCTEVfTVBVID09IDEgKQorCQl7CisJCQlweFRvcE9mU3RhY2stLTsKKwkJCWlmKCB4UnVuUHJpdmlsZWdlZCA9PSBwZFRSVUUgKQorCQkJeworCQkJCSpweFRvcE9mU3RhY2sgPSBwb3J0SU5JVElBTF9DT05UUk9MX1BSSVZJTEVHRUQ7CQkvKiBTbG90IHVzZWQgdG8gaG9sZCB0aGlzIHRhc2sncyBDT05UUk9MIHZhbHVlLiAqLworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCSpweFRvcE9mU3RhY2sgPSBwb3J0SU5JVElBTF9DT05UUk9MX1VOUFJJVklMRUdFRDsJLyogU2xvdCB1c2VkIHRvIGhvbGQgdGhpcyB0YXNrJ3MgQ09OVFJPTCB2YWx1ZS4gKi8KKwkJCX0KKwkJfQorCQkjZW5kaWYgLyogY29uZmlnRU5BQkxFX01QVSAqLworCisJCXB4VG9wT2ZTdGFjay0tOworCQkqcHhUb3BPZlN0YWNrID0gKCBTdGFja1R5cGVfdCApIHB4RW5kT2ZTdGFjazsJLyogU2xvdCB1c2VkIHRvIGhvbGQgdGhpcyB0YXNrJ3MgUFNQTElNIHZhbHVlLiAqLworCisJCSNpZiggY29uZmlnRU5BQkxFX1RSVVNUWk9ORSA9PSAxICkKKwkJeworCQkJcHhUb3BPZlN0YWNrLS07CisJCQkqcHhUb3BPZlN0YWNrID0gcG9ydE5PX1NFQ1VSRV9DT05URVhUOwkJLyogU2xvdCB1c2VkIHRvIGhvbGQgdGhpcyB0YXNrJ3MgeFNlY3VyZUNvbnRleHQgdmFsdWUuICovCisJCX0KKwkJI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9UUlVTVFpPTkUgKi8KKwl9CisJI2VuZGlmIC8qIHBvcnRQUkVMT0FEX1JFR0lTVEVSUyAqLworCisJcmV0dXJuIHB4VG9wT2ZTdGFjazsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitCYXNlVHlwZV90IHhQb3J0U3RhcnRTY2hlZHVsZXIoIHZvaWQgKSAvKiBQUklWSUxFR0VEX0ZVTkNUSU9OICovCit7CisJLyogTWFrZSBQZW5kU1YsIENhbGxTViBhbmQgU3lzVGljayB0aGUgc2FtZSBwcmlvcml0eSBhcyB0aGUga2VybmVsLiAqLworCSooIHBvcnROVklDX1NZU1BSSTIgKSB8PSBwb3J0TlZJQ19QRU5EU1ZfUFJJOworCSooIHBvcnROVklDX1NZU1BSSTIgKSB8PSBwb3J0TlZJQ19TWVNUSUNLX1BSSTsKKworCSNpZiggY29uZmlnRU5BQkxFX01QVSA9PSAxICkKKwl7CisJCS8qIFNldHVwIHRoZSBNZW1vcnkgUHJvdGVjdGlvbiBVbml0IChNUFUpLiAqLworCQlwcnZTZXR1cE1QVSgpOworCX0KKwkjZW5kaWYgLyogY29uZmlnRU5BQkxFX01QVSAqLworCisJLyogU3RhcnQgdGhlIHRpbWVyIHRoYXQgZ2VuZXJhdGVzIHRoZSB0aWNrIElTUi4gSW50ZXJydXB0cyBhcmUgZGlzYWJsZWQKKwkgKiBoZXJlIGFscmVhZHkuICovCisJcHJ2U2V0dXBUaW1lckludGVycnVwdCgpOworCisJLyogSW5pdGlhbGl6ZSB0aGUgY3JpdGljYWwgbmVzdGluZyBjb3VudCByZWFkeSBmb3IgdGhlIGZpcnN0IHRhc2suICovCisJdWxDcml0aWNhbE5lc3RpbmcgPSAwOworCisJLyogU3RhcnQgdGhlIGZpcnN0IHRhc2suICovCisJdlN0YXJ0Rmlyc3RUYXNrKCk7CisKKwkvKiBTaG91bGQgbmV2ZXIgZ2V0IGhlcmUgYXMgdGhlIHRhc2tzIHdpbGwgbm93IGJlIGV4ZWN1dGluZy4gQ2FsbCB0aGUgdGFzaworCSAqIGV4aXQgZXJyb3IgZnVuY3Rpb24gdG8gcHJldmVudCBjb21waWxlciB3YXJuaW5ncyBhYm91dCBhIHN0YXRpYyBmdW5jdGlvbgorCSAqIG5vdCBiZWluZyBjYWxsZWQgaW4gdGhlIGNhc2UgdGhhdCB0aGUgYXBwbGljYXRpb24gd3JpdGVyIG92ZXJyaWRlcyB0aGlzCisJICogZnVuY3Rpb25hbGl0eSBieSBkZWZpbmluZyBjb25maWdUQVNLX1JFVFVSTl9BRERSRVNTLiBDYWxsCisJICogdlRhc2tTd2l0Y2hDb250ZXh0KCkgc28gbGluayB0aW1lIG9wdGltaXphdGlvbiBkb2VzIG5vdCByZW1vdmUgdGhlCisJICogc3ltYm9sLiAqLworCXZUYXNrU3dpdGNoQ29udGV4dCgpOworCXBydlRhc2tFeGl0RXJyb3IoKTsKKworCS8qIFNob3VsZCBub3QgZ2V0IGhlcmUuICovCisJcmV0dXJuIDA7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCB2UG9ydEVuZFNjaGVkdWxlciggdm9pZCApIC8qIFBSSVZJTEVHRURfRlVOQ1RJT04gKi8KK3sKKwkvKiBOb3QgaW1wbGVtZW50ZWQgaW4gcG9ydHMgd2hlcmUgdGhlcmUgaXMgbm90aGluZyB0byByZXR1cm4gdG8uCisJICogQXJ0aWZpY2lhbGx5IGZvcmNlIGFuIGFzc2VydC4gKi8KKwljb25maWdBU1NFUlQoIHVsQ3JpdGljYWxOZXN0aW5nID09IDEwMDBVTCApOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiggY29uZmlnRU5BQkxFX01QVSA9PSAxICkKKwl2b2lkIHZQb3J0U3RvcmVUYXNrTVBVU2V0dGluZ3MoIHhNUFVfU0VUVElOR1MgKnhNUFVTZXR0aW5ncywgY29uc3Qgc3RydWN0IHhNRU1PUllfUkVHSU9OICogY29uc3QgeFJlZ2lvbnMsIFN0YWNrVHlwZV90ICpweEJvdHRvbU9mU3RhY2ssIHVpbnQzMl90IHVsU3RhY2tEZXB0aCApCisJeworCXVpbnQzMl90IHVsUmVnaW9uU3RhcnRBZGRyZXNzLCB1bFJlZ2lvbkVuZEFkZHJlc3MsIHVsUmVnaW9uTnVtYmVyOworCWludDMyX3QgbEluZGV4ID0gMDsKKworCQkvKiBTZXR1cCBNQUlSMC4gKi8KKwkJeE1QVVNldHRpbmdzLT51bE1BSVIwID0gKCAoIHBvcnRNUFVfTk9STUFMX01FTU9SWV9CVUZGRVJBQkxFX0NBQ0hFQUJMRSA8PCBwb3J0TVBVX01BSVJfQVRUUjBfUE9TICkgJiBwb3J0TVBVX01BSVJfQVRUUjBfTUFTSyApOworCQl4TVBVU2V0dGluZ3MtPnVsTUFJUjAgfD0gKCAoIHBvcnRNUFVfREVWSUNFX01FTU9SWV9uR25SRSA8PCBwb3J0TVBVX01BSVJfQVRUUjFfUE9TICkgJiBwb3J0TVBVX01BSVJfQVRUUjFfTUFTSyApOworCisJCS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgdGFzayBpcyBjcmVhdGVkIC0gaW4KKwkJICogd2hpY2ggY2FzZSB0aGUgc3RhY2sgcmVnaW9uIHBhcmFtZXRlcnMgd2lsbCBiZSB2YWxpZC4gIEF0IGFsbCBvdGhlcgorCQkgKiB0aW1lcyB0aGUgc3RhY2sgcGFyYW1ldGVycyB3aWxsIG5vdCBiZSB2YWxpZCBhbmQgaXQgaXMgYXNzdW1lZCB0aGF0CisJCSAqIHRoZSBzdGFjayByZWdpb24gaGFzIGFscmVhZHkgYmVlbiBjb25maWd1cmVkLiAqLworCQlpZiggdWxTdGFja0RlcHRoID4gMCApCisJCXsKKwkJCS8qIERlZmluZSB0aGUgcmVnaW9uIHRoYXQgYWxsb3dzIGFjY2VzcyB0byB0aGUgc3RhY2suICovCisJCQl1bFJlZ2lvblN0YXJ0QWRkcmVzcyA9ICggKCB1aW50MzJfdCApIHB4Qm90dG9tT2ZTdGFjayApICYgcG9ydE1QVV9SQkFSX0FERFJFU1NfTUFTSzsKKwkJCXVsUmVnaW9uRW5kQWRkcmVzcyA9ICggdWludDMyX3QgKSBweEJvdHRvbU9mU3RhY2sgKyAoIHVsU3RhY2tEZXB0aCAqICggdWludDMyX3QgKSBzaXplb2YoIFN0YWNrVHlwZV90ICkgKSAtIDE7CisJCQl1bFJlZ2lvbkVuZEFkZHJlc3MgICY9IHBvcnRNUFVfUkxBUl9BRERSRVNTX01BU0s7CisKKwkJCXhNUFVTZXR0aW5ncy0+eFJlZ2lvbnNTZXR0aW5nc1sgMCBdLnVsUkJBUiA9CSggdWxSZWdpb25TdGFydEFkZHJlc3MgKSB8CisJCQkJCQkJCQkJCQkJCQkoIHBvcnRNUFVfUkVHSU9OX05PTl9TSEFSRUFCTEUgKSB8CisJCQkJCQkJCQkJCQkJCQkoIHBvcnRNUFVfUkVHSU9OX1JFQURfV1JJVEUgKSB8CisJCQkJCQkJCQkJCQkJCQkoIHBvcnRNUFVfUkVHSU9OX0VYRUNVVEVfTkVWRVIgKTsKKworCQkJeE1QVVNldHRpbmdzLT54UmVnaW9uc1NldHRpbmdzWyAwIF0udWxSTEFSID0JKCB1bFJlZ2lvbkVuZEFkZHJlc3MgKSB8CisJCQkJCQkJCQkJCQkJCQkoIHBvcnRNUFVfUkxBUl9BVFRSX0lOREVYMCApIHwKKwkJCQkJCQkJCQkJCQkJCSggcG9ydE1QVV9STEFSX1JFR0lPTl9FTkFCTEUgKTsKKwkJfQorCisJCS8qIFVzZXIgc3VwcGxpZWQgY29uZmlndXJhYmxlIHJlZ2lvbnMuICovCisJCWZvciggdWxSZWdpb25OdW1iZXIgPSAxOyB1bFJlZ2lvbk51bWJlciA8PSBwb3J0TlVNX0NPTkZJR1VSQUJMRV9SRUdJT05TOyB1bFJlZ2lvbk51bWJlcisrICkKKwkJeworCQkJLyogSWYgeFJlZ2lvbnMgaXMgTlVMTCBpLmUuIHRoZSB0YXNrIGhhcyBub3Qgc3BlY2lmaWVkIGFueSBNUFUKKwkJCSAqIHJlZ2lvbiwgdGhlIGVsc2UgcGFydCBlbnN1cmVzIHRoYXQgYWxsIHRoZSBjb25maWd1cmFibGUgTVBVCisJCQkgKiByZWdpb25zIGFyZSBpbnZhbGlkYXRlZC4gKi8KKwkJCWlmKCAoIHhSZWdpb25zICE9IE5VTEwgKSAmJiAoIHhSZWdpb25zWyBsSW5kZXggXS51bExlbmd0aEluQnl0ZXMgPiAwVUwgKSApCisJCQl7CisJCQkJLyogVHJhbnNsYXRlIHRoZSBnZW5lcmljIHJlZ2lvbiBkZWZpbml0aW9uIGNvbnRhaW5lZCBpbiB4UmVnaW9ucworCQkJCSAqIGludG8gdGhlIEFSTXY4IHNwZWNpZmljIE1QVSBzZXR0aW5ncyB0aGF0IGFyZSB0aGVuIHN0b3JlZCBpbgorCQkJCSAqIHhNUFVTZXR0aW5ncy4gKi8KKwkJCQl1bFJlZ2lvblN0YXJ0QWRkcmVzcyA9ICggKCB1aW50MzJfdCApIHhSZWdpb25zWyBsSW5kZXggXS5wdkJhc2VBZGRyZXNzICkgJiBwb3J0TVBVX1JCQVJfQUREUkVTU19NQVNLOworCQkJCXVsUmVnaW9uRW5kQWRkcmVzcyA9ICggdWludDMyX3QgKSB4UmVnaW9uc1sgbEluZGV4IF0ucHZCYXNlQWRkcmVzcyArIHhSZWdpb25zWyBsSW5kZXggXS51bExlbmd0aEluQnl0ZXMgLSAxOworCQkJCXVsUmVnaW9uRW5kQWRkcmVzcyAgJj0gcG9ydE1QVV9STEFSX0FERFJFU1NfTUFTSzsKKworCQkJCS8qIFN0YXJ0IGFkZHJlc3MuICovCisJCQkJeE1QVVNldHRpbmdzLT54UmVnaW9uc1NldHRpbmdzWyB1bFJlZ2lvbk51bWJlciBdLnVsUkJBUiA9CSggdWxSZWdpb25TdGFydEFkZHJlc3MgKSB8CisJCQkJCQkJCQkJCQkJCQkJCQkJKCBwb3J0TVBVX1JFR0lPTl9OT05fU0hBUkVBQkxFICk7CisKKwkJCQkvKiBSTy9SVy4gKi8KKwkJCQlpZiggKCB4UmVnaW9uc1sgbEluZGV4IF0udWxQYXJhbWV0ZXJzICYgdHNrTVBVX1JFR0lPTl9SRUFEX09OTFkgKSAhPSAwICkKKwkJCQl7CisJCQkJCXhNUFVTZXR0aW5ncy0+eFJlZ2lvbnNTZXR0aW5nc1sgdWxSZWdpb25OdW1iZXIgXS51bFJCQVIgfD0gKCBwb3J0TVBVX1JFR0lPTl9SRUFEX09OTFkgKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJeE1QVVNldHRpbmdzLT54UmVnaW9uc1NldHRpbmdzWyB1bFJlZ2lvbk51bWJlciBdLnVsUkJBUiB8PSAoIHBvcnRNUFVfUkVHSU9OX1JFQURfV1JJVEUgKTsKKwkJCQl9CisKKwkJCQkvKiBYTi4gKi8KKwkJCQlpZiggKCB4UmVnaW9uc1sgbEluZGV4IF0udWxQYXJhbWV0ZXJzICYgdHNrTVBVX1JFR0lPTl9FWEVDVVRFX05FVkVSICkgIT0gMCApCisJCQkJeworCQkJCQl4TVBVU2V0dGluZ3MtPnhSZWdpb25zU2V0dGluZ3NbIHVsUmVnaW9uTnVtYmVyIF0udWxSQkFSIHw9ICggcG9ydE1QVV9SRUdJT05fRVhFQ1VURV9ORVZFUiApOworCQkJCX0KKworCQkJCS8qIEVuZCBBZGRyZXNzLiAqLworCQkJCXhNUFVTZXR0aW5ncy0+eFJlZ2lvbnNTZXR0aW5nc1sgdWxSZWdpb25OdW1iZXIgXS51bFJMQVIgPQkoIHVsUmVnaW9uRW5kQWRkcmVzcyApIHwKKwkJCQkJCQkJCQkJCQkJCQkJCQkoIHBvcnRNUFVfUkxBUl9SRUdJT05fRU5BQkxFICk7CisKKwkJCQkvKiBOb3JtYWwgbWVtb3J5LyBEZXZpY2UgbWVtb3J5LiAqLworCQkJCWlmKCAoIHhSZWdpb25zWyBsSW5kZXggXS51bFBhcmFtZXRlcnMgJiB0c2tNUFVfUkVHSU9OX0RFVklDRV9NRU1PUlkgKSAhPSAwICkKKwkJCQl7CisJCQkJCS8qIEF0dHIxIGluIE1BSVIwIGlzIGNvbmZpZ3VyZWQgYXMgZGV2aWNlIG1lbW9yeS4gKi8KKwkJCQkJeE1QVVNldHRpbmdzLT54UmVnaW9uc1NldHRpbmdzWyB1bFJlZ2lvbk51bWJlciBdLnVsUkxBUiB8PSBwb3J0TVBVX1JMQVJfQVRUUl9JTkRFWDE7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCS8qIEF0dHIxIGluIE1BSVIwIGlzIGNvbmZpZ3VyZWQgYXMgbm9ybWFsIG1lbW9yeS4gKi8KKwkJCQkJeE1QVVNldHRpbmdzLT54UmVnaW9uc1NldHRpbmdzWyB1bFJlZ2lvbk51bWJlciBdLnVsUkxBUiB8PSBwb3J0TVBVX1JMQVJfQVRUUl9JTkRFWDA7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8qIEludmFsaWRhdGUgdGhlIHJlZ2lvbi4gKi8KKwkJCQl4TVBVU2V0dGluZ3MtPnhSZWdpb25zU2V0dGluZ3NbIHVsUmVnaW9uTnVtYmVyIF0udWxSQkFSID0gMFVMOworCQkJCXhNUFVTZXR0aW5ncy0+eFJlZ2lvbnNTZXR0aW5nc1sgdWxSZWdpb25OdW1iZXIgXS51bFJMQVIgPSAwVUw7CisJCQl9CisKKwkJCWxJbmRleCsrOworCQl9CisJfQorI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9NUFUgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpkaWZmIC0tZ2l0IGEvU291cmNlL3BvcnRhYmxlL0lBUi9BUk1fQ00yM19OVFovbm9uX3NlY3VyZS9wb3J0YXNtLmggYi9Tb3VyY2UvcG9ydGFibGUvSUFSL0FSTV9DTTIzX05UWi9ub25fc2VjdXJlL3BvcnRhc20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWNmMDRlCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL3BvcnRhYmxlL0lBUi9BUk1fQ00yM19OVFovbm9uX3NlY3VyZS9wb3J0YXNtLmgKQEAgLTAsMCArMSwxMTMgQEAKKy8qCisgKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjIuMQorICogQ29weXJpZ2h0IChDKSAyMDE5IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKKyAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCisgKiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCisgKiB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZgorICogdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLAorICogc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCisgKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUworICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SCisgKiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIKKyAqIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIGh0dHA6Ly93d3cuRnJlZVJUT1Mub3JnCisgKiBodHRwOi8vYXdzLmFtYXpvbi5jb20vZnJlZXJ0b3MKKyAqCisgKiAxIHRhYiA9PSA0IHNwYWNlcyEKKyAqLworCisjaWZuZGVmIF9fUE9SVF9BU01fSF9fCisjZGVmaW5lIF9fUE9SVF9BU01fSF9fCisKKy8qIFNjaGVkdWxlciBpbmNsdWRlcy4gKi8KKyNpbmNsdWRlICJGcmVlUlRPUy5oIgorCisvKiBNUFUgd3JhcHBlcnMgaW5jbHVkZXMuICovCisjaW5jbHVkZSAibXB1X3dyYXBwZXJzLmgiCisKKy8qKgorICogQGJyaWVmIFJlc3RvcmUgdGhlIGNvbnRleHQgb2YgdGhlIGZpcnN0IHRhc2sgc28gdGhhdCB0aGUgZmlyc3QgdGFzayBzdGFydHMKKyAqIGV4ZWN1dGluZy4KKyAqLwordm9pZCB2UmVzdG9yZUNvbnRleHRPZkZpcnN0VGFzayggdm9pZCApIF9fYXR0cmlidXRlX18gKCggbmFrZWQgKSkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworLyoqCisgKiBAYnJpZWYgQ2hlY2tzIHdoZXRoZXIgb3Igbm90IHRoZSBwcm9jZXNzb3IgaXMgcHJpdmlsZWdlZC4KKyAqCisgKiBAcmV0dXJuIDEgaWYgdGhlIHByb2Nlc3NvciBpcyBhbHJlYWR5IHByaXZpbGVnZWQsIDAgb3RoZXJ3aXNlLgorICovCitCYXNlVHlwZV90IHhJc1ByaXZpbGVnZWQoIHZvaWQgKSBfX2F0dHJpYnV0ZV9fICgoIG5ha2VkICkpOworCisvKioKKyAqIEBicmllZiBSYWlzZXMgdGhlIHByaXZpbGVnZSBsZXZlbCBieSBjbGVhcmluZyB0aGUgYml0IDAgb2YgdGhlIENPTlRST0wKKyAqIHJlZ2lzdGVyLgorICoKKyAqIEBub3RlIFRoaXMgaXMgYSBwcml2aWxlZ2VkIGZ1bmN0aW9uIGFuZCBzaG91bGQgb25seSBiZSBjYWxsZWQgZnJvbSB0aGUga2VucmVsCisgKiBjb2RlLgorICoKKyAqIEJpdCAwIG9mIHRoZSBDT05UUk9MIHJlZ2lzdGVyIGRlZmluZXMgdGhlIHByaXZpbGVnZSBsZXZlbCBvZiBUaHJlYWQgTW9kZS4KKyAqICBCaXRbMF0gPSAwIC0tPiBUaGUgcHJvY2Vzc29yIGlzIHJ1bm5pbmcgcHJpdmlsZWdlZAorICogIEJpdFswXSA9IDEgLS0+IFRoZSBwcm9jZXNzb3IgaXMgcnVubmluZyB1bnByaXZpbGVnZWQuCisgKi8KK3ZvaWQgdlJhaXNlUHJpdmlsZWdlKCB2b2lkICkgX19hdHRyaWJ1dGVfXyAoKCBuYWtlZCApKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisvKioKKyAqIEBicmllZiBMb3dlcnMgdGhlIHByaXZpbGVnZSBsZXZlbCBieSBzZXR0aW5nIHRoZSBiaXQgMCBvZiB0aGUgQ09OVFJPTAorICogcmVnaXN0ZXIuCisgKgorICogQml0IDAgb2YgdGhlIENPTlRST0wgcmVnaXN0ZXIgZGVmaW5lcyB0aGUgcHJpdmlsZWdlIGxldmVsIG9mIFRocmVhZCBNb2RlLgorICogIEJpdFswXSA9IDAgLS0+IFRoZSBwcm9jZXNzb3IgaXMgcnVubmluZyBwcml2aWxlZ2VkCisgKiAgQml0WzBdID0gMSAtLT4gVGhlIHByb2Nlc3NvciBpcyBydW5uaW5nIHVucHJpdmlsZWdlZC4KKyAqLwordm9pZCB2UmVzZXRQcml2aWxlZ2UoIHZvaWQgKSBfX2F0dHJpYnV0ZV9fICgoIG5ha2VkICkpOworCisvKioKKyAqIEBicmllZiBTdGFydHMgdGhlIGZpcnN0IHRhc2suCisgKi8KK3ZvaWQgdlN0YXJ0Rmlyc3RUYXNrKCB2b2lkICkgX19hdHRyaWJ1dGVfXyAoKCBuYWtlZCApKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisvKioKKyAqIEBicmllZiBEaXNhYmxlcyBpbnRlcnJ1cHRzLgorICovCit1aW50MzJfdCB1bFNldEludGVycnVwdE1hc2tGcm9tSVNSKCB2b2lkICkgX19hdHRyaWJ1dGVfXygoIG5ha2VkICkpIFBSSVZJTEVHRURfRlVOQ1RJT047CisKKy8qKgorICogQGJyaWVmIEVuYWJsZXMgaW50ZXJydXB0cy4KKyAqLwordm9pZCB2Q2xlYXJJbnRlcnJ1cHRNYXNrRnJvbUlTUiggdWludDMyX3QgdWxNYXNrICkgX19hdHRyaWJ1dGVfXygoIG5ha2VkICkpIFBSSVZJTEVHRURfRlVOQ1RJT047CisKKy8qKgorICogQGJyaWVmIFBlbmRTViBFeGNlcHRpb24gaGFuZGxlci4KKyAqLwordm9pZCBQZW5kU1ZfSGFuZGxlciggdm9pZCApIF9fYXR0cmlidXRlX18gKCggbmFrZWQgKSkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworLyoqCisgKiBAYnJpZWYgU1ZDIEhhbmRsZXIuCisgKi8KK3ZvaWQgU1ZDX0hhbmRsZXIoIHZvaWQgKSBfX2F0dHJpYnV0ZV9fICgoIG5ha2VkICkpIFBSSVZJTEVHRURfRlVOQ1RJT047CisKKy8qKgorICogQGJyaWVmIEFsbG9jYXRlIGEgU2VjdXJlIGNvbnRleHQgZm9yIHRoZSBjYWxsaW5nIHRhc2suCisgKgorICogQHBhcmFtW2luXSB1bFNlY3VyZVN0YWNrU2l6ZSBUaGUgc2l6ZSBvZiB0aGUgc3RhY2sgdG8gYmUgYWxsb2NhdGVkIG9uIHRoZQorICogc2VjdXJlIHNpZGUgZm9yIHRoZSBjYWxsaW5nIHRhc2suCisgKi8KK3ZvaWQgdlBvcnRBbGxvY2F0ZVNlY3VyZUNvbnRleHQoIHVpbnQzMl90IHVsU2VjdXJlU3RhY2tTaXplICkgX19hdHRyaWJ1dGVfXyAoKCBuYWtlZCApKTsKKworLyoqCisgKiBAYnJpZWYgRnJlZSB0aGUgdGFzaydzIHNlY3VyZSBjb250ZXh0LgorICoKKyAqIEBwYXJhbVtpbl0gcHVsVENCIFBvaW50ZXIgdG8gdGhlIFRhc2sgQ29udHJvbCBCbG9jayAoVENCKSBvZiB0aGUgdGFzay4KKyAqLwordm9pZCB2UG9ydEZyZWVTZWN1cmVDb250ZXh0KCB1aW50MzJfdCAqcHVsVENCICkgX19hdHRyaWJ1dGVfXyAoKCBuYWtlZCApKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisjZW5kaWYgLyogX19QT1JUX0FTTV9IX18gKi8KZGlmZiAtLWdpdCBhL1NvdXJjZS9wb3J0YWJsZS9JQVIvQVJNX0NNMjNfTlRaL25vbl9zZWN1cmUvcG9ydGFzbS5zIGIvU291cmNlL3BvcnRhYmxlL0lBUi9BUk1fQ00yM19OVFovbm9uX3NlY3VyZS9wb3J0YXNtLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzEyMWRmNgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9wb3J0YWJsZS9JQVIvQVJNX0NNMjNfTlRaL25vbl9zZWN1cmUvcG9ydGFzbS5zCkBAIC0wLDAgKzEsMzAzIEBACisvKgorICogRnJlZVJUT1MgS2VybmVsIFYxMC4yLjEKKyAqIENvcHlyaWdodCAoQykgMjAxOSBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCisgKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgorICogdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bworICogdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YKKyAqIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKKyAqIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAorICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MKKyAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUgorICogQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSCisgKiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBodHRwOi8vd3d3LkZyZWVSVE9TLm9yZworICogaHR0cDovL2F3cy5hbWF6b24uY29tL2ZyZWVydG9zCisgKgorICogMSB0YWIgPT0gNCBzcGFjZXMhCisgKi8KKworCUVYVEVSTiBweEN1cnJlbnRUQ0IKKwlFWFRFUk4gdlRhc2tTd2l0Y2hDb250ZXh0CisJRVhURVJOIHZQb3J0U1ZDSGFuZGxlcl9DCisKKwlQVUJMSUMgeElzUHJpdmlsZWdlZAorCVBVQkxJQyB2UmVzZXRQcml2aWxlZ2UKKwlQVUJMSUMgdlJlc3RvcmVDb250ZXh0T2ZGaXJzdFRhc2sKKwlQVUJMSUMgdlJhaXNlUHJpdmlsZWdlCisJUFVCTElDIHZTdGFydEZpcnN0VGFzaworCVBVQkxJQyB1bFNldEludGVycnVwdE1hc2tGcm9tSVNSCisJUFVCTElDIHZDbGVhckludGVycnVwdE1hc2tGcm9tSVNSCisJUFVCTElDIFBlbmRTVl9IYW5kbGVyCisJUFVCTElDIFNWQ19IYW5kbGVyCisKKyNpZiAoIGNvbmZpZ0VOQUJMRV9GUFUgPT0gMSApCisJI2Vycm9yIENvcnRleC1NMjMgZG9lcyBub3QgaGF2ZSBhIEZsb2F0aW5nIFBvaW50IFVuaXQgKEZQVSkgYW5kIHRoZXJlZm9yZSBjb25maWdFTkFCTEVfRlBVIG11c3QgYmUgc2V0IHRvIDAuCisjZW5kaWYKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0gVW5wcml2aWxlZ2VkIEZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwlTRUNUSU9OIC50ZXh0OkNPREU6Tk9ST09UKDIpCisJVEhVTUIKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit4SXNQcml2aWxlZ2VkOgorCW1ycyByMCwgY29udHJvbAkJCQkJCQkvKiByMCA9IENPTlRST0wuICovCisJbW92cyByMSwgIzEJCQkJCQkJCS8qIHIxID0gMS4gKi8KKwl0c3QgcjAsIHIxCQkJCQkJCQkvKiBQZXJmb3JtIHIwICYgcjEgKGJpdHdpc2UgQU5EKSBhbmQgdXBkYXRlIHRoZSBjb25kaXRpb25zIGZsYWcuICovCisJYmVxIHJ1bm5pbmdfcHJpdmlsZWdlZAkJCQkJLyogSWYgdGhlIHJlc3VsdCBvZiBwcmV2aW91cyBBTkQgb3BlcmF0aW9uIHdhcyAwLCBicmFuY2guICovCisJbW92cyByMCwgIzAJCQkJCQkJCS8qIENPTlRST0xbMF0hPTAuIFJldHVybiBmYWxzZSB0byBpbmRpY2F0ZSB0aGF0IHRoZSBwcm9jZXNzb3IgaXMgbm90IHByaXZpbGVnZWQuICovCisJYnggbHIJCQkJCQkJCQkvKiBSZXR1cm4uICovCisJcnVubmluZ19wcml2aWxlZ2VkOgorCQltb3ZzIHIwLCAjMQkJCQkJCQkvKiBDT05UUk9MWzBdPT0wLiBSZXR1cm4gdHJ1ZSB0byBpbmRpY2F0ZSB0aGF0IHRoZSBwcm9jZXNzb3IgaXMgcHJpdmlsZWdlZC4gKi8KKwkJYnggbHIJCQkJCQkJCS8qIFJldHVybi4gKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZSZXNldFByaXZpbGVnZToKKwltcnMgcjAsIGNvbnRyb2wJCQkJCQkJLyogcjAgPSBDT05UUk9MLiAqLworCW1vdnMgcjEsICMxCQkJCQkJCQkvKiByMSA9IDEuICovCisJb3JycyByMCwgcjEJCQkJCQkJCS8qIHIwID0gcjAgfCByMS4gKi8KKwltc3IgY29udHJvbCwgcjAJCQkJCQkJLyogQ09OVFJPTCA9IHIwLiAqLworCWJ4IGxyCQkJCQkJCQkJLyogUmV0dXJuIHRvIHRoZSBjYWxsZXIuICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLSBQcml2aWxlZ2VkIEZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJU0VDVElPTiBwcml2aWxlZ2VkX2Z1bmN0aW9uczpDT0RFOk5PUk9PVCgyKQorCVRIVU1CCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordlJlc3RvcmVDb250ZXh0T2ZGaXJzdFRhc2s6CisJbGRyICByMiwgPXB4Q3VycmVudFRDQgkJCQkJLyogUmVhZCB0aGUgbG9jYXRpb24gb2YgcHhDdXJyZW50VENCIGkuZS4gJiggcHhDdXJyZW50VENCICkuICovCisJbGRyICByMSwgW3IyXQkJCQkJCQkvKiBSZWFkIHB4Q3VycmVudFRDQi4gKi8KKwlsZHIgIHIwLCBbcjFdCQkJCQkJCS8qIFJlYWQgdG9wIG9mIHN0YWNrIGZyb20gVENCIC0gVGhlIGZpcnN0IGl0ZW0gaW4gcHhDdXJyZW50VENCIGlzIHRoZSB0YXNrIHRvcCBvZiBzdGFjay4gKi8KKworI2lmICggY29uZmlnRU5BQkxFX01QVSA9PSAxICkKKwlkbWIJCQkJCQkJCQkJLyogQ29tcGxldGUgb3V0c3RhbmRpbmcgdHJhbnNmZXJzIGJlZm9yZSBkaXNhYmxpbmcgTVBVLiAqLworCWxkciByMiwgPTB4ZTAwMGVkOTQJCQkJCQkvKiByMiA9IDB4ZTAwMGVkOTQgW0xvY2F0aW9uIG9mIE1QVV9DVFJMXS4gKi8KKwlsZHIgcjMsIFtyMl0JCQkJCQkJLyogUmVhZCB0aGUgdmFsdWUgb2YgTVBVX0NUUkwuICovCisJbW92cyByNCwgIzEJCQkJCQkJCS8qIHI0ID0gMS4gKi8KKwliaWNzIHIzLCByNAkJCQkJCQkJLyogcjMgPSByMyAmIH5yNCBpLmUuIENsZWFyIHRoZSBiaXQgMCBpbiByMy4gKi8KKwlzdHIgcjMsIFtyMl0JCQkJCQkJLyogRGlzYWJsZSBNUFUuICovCisKKwlhZGRzIHIxLCAjNAkJCQkJCQkJLyogcjEgPSByMSArIDQuIHIxIG5vdyBwb2ludHMgdG8gTUFJUjAgaW4gVENCLiAqLworCWxkciAgcjQsIFtyMV0JCQkJCQkJLyogcjQgPSAqcjEgaS5lLiByNCA9IE1BSVIwLiAqLworCWxkciAgcjIsID0weGUwMDBlZGMwCQkJCQkvKiByMiA9IDB4ZTAwMGVkYzAgW0xvY2F0aW9uIG9mIE1BSVIwXS4gKi8KKwlzdHIgIHI0LCBbcjJdCQkJCQkJCS8qIFByb2dyYW0gTUFJUjAuICovCisJbGRyICByMiwgPTB4ZTAwMGVkOTgJCQkJCS8qIHIyID0gMHhlMDAwZWQ5OCBbTG9jYXRpb24gb2YgUk5SXS4gKi8KKwlhZGRzIHIxLCAjNAkJCQkJCQkJLyogcjEgPSByMSArIDQuIHIxIG5vdyBwb2ludHMgdG8gZmlyc3QgUkJBUiBpbiBUQ0IuICovCisJbW92cyByNCwgIzQJCQkJCQkJCS8qIHI0ID0gNC4gKi8KKwlzdHIgIHI0LCBbcjJdCQkJCQkJCS8qIFByb2dyYW0gUk5SID0gNC4gKi8KKwlsZG1pYSByMSEsIHtyNSxyNn0JCQkJCQkvKiBSZWFkIGZpcnN0IHNldCBvZiBSQkFSL1JMQVIgZnJvbSBUQ0IuICovCisJbGRyICByMywgPTB4ZTAwMGVkOWMJCQkJCS8qIHIzID0gMHhlMDAwZWQ5YyBbTG9jYXRpb24gb2YgUkJBUl0uICovCisJc3RtaWEgcjMhLCB7cjUscjZ9CQkJCQkJLyogV3JpdGUgZmlyc3Qgc2V0IG9mIFJCQVIvUkxBUiByZWdpc3RlcnMuICovCisJbW92cyByNCwgIzUJCQkJCQkJCS8qIHI0ID0gNS4gKi8KKwlzdHIgIHI0LCBbcjJdCQkJCQkJCS8qIFByb2dyYW0gUk5SID0gNS4gKi8KKwlsZG1pYSByMSEsIHtyNSxyNn0JCQkJCQkvKiBSZWFkIHNlY29uZCBzZXQgb2YgUkJBUi9STEFSIGZyb20gVENCLiAqLworCWxkciAgcjMsID0weGUwMDBlZDljCQkJCQkvKiByMyA9IDB4ZTAwMGVkOWMgW0xvY2F0aW9uIG9mIFJCQVJdLiAqLworCXN0bWlhIHIzISwge3I1LHI2fQkJCQkJCS8qIFdyaXRlIHNlY29uZCBzZXQgb2YgUkJBUi9STEFSIHJlZ2lzdGVycy4gKi8KKwltb3ZzIHI0LCAjNgkJCQkJCQkJLyogcjQgPSA2LiAqLworCXN0ciAgcjQsIFtyMl0JCQkJCQkJLyogUHJvZ3JhbSBSTlIgPSA2LiAqLworCWxkbWlhIHIxISwge3I1LHI2fQkJCQkJCS8qIFJlYWQgdGhpcmQgc2V0IG9mIFJCQVIvUkxBUiBmcm9tIFRDQi4gKi8KKwlsZHIgIHIzLCA9MHhlMDAwZWQ5YwkJCQkJLyogcjMgPSAweGUwMDBlZDljIFtMb2NhdGlvbiBvZiBSQkFSXS4gKi8KKwlzdG1pYSByMyEsIHtyNSxyNn0JCQkJCQkvKiBXcml0ZSB0aGlyZCBzZXQgb2YgUkJBUi9STEFSIHJlZ2lzdGVycy4gKi8KKwltb3ZzIHI0LCAjNwkJCQkJCQkJLyogcjQgPSA3LiAqLworCXN0ciAgcjQsIFtyMl0JCQkJCQkJLyogUHJvZ3JhbSBSTlIgPSA3LiAqLworCWxkbWlhIHIxISwge3I1LHI2fQkJCQkJCS8qIFJlYWQgZm91cnRoIHNldCBvZiBSQkFSL1JMQVIgZnJvbSBUQ0IuICovCisJbGRyICByMywgPTB4ZTAwMGVkOWMJCQkJCS8qIHIzID0gMHhlMDAwZWQ5YyBbTG9jYXRpb24gb2YgUkJBUl0uICovCisJc3RtaWEgcjMhLCB7cjUscjZ9CQkJCQkJLyogV3JpdGUgZm91cnRoIHNldCBvZiBSQkFSL1JMQVIgcmVnaXN0ZXJzLiAqLworCisJbGRyIHIyLCA9MHhlMDAwZWQ5NAkJCQkJCS8qIHIyID0gMHhlMDAwZWQ5NCBbTG9jYXRpb24gb2YgTVBVX0NUUkxdLiAqLworCWxkciByMywgW3IyXQkJCQkJCQkvKiBSZWFkIHRoZSB2YWx1ZSBvZiBNUFVfQ1RSTC4gKi8KKwltb3ZzIHI0LCAjMQkJCQkJCQkJLyogcjQgPSAxLiAqLworCW9ycnMgcjMsIHI0CQkJCQkJCQkvKiByMyA9IHIzIHwgcjQgaS5lLiBTZXQgdGhlIGJpdCAwIGluIHIzLiAqLworCXN0ciByMywgW3IyXQkJCQkJCQkvKiBFbmFibGUgTVBVLiAqLworCWRzYgkJCQkJCQkJCQkvKiBGb3JjZSBtZW1vcnkgd3JpdGVzIGJlZm9yZSBjb250aW51aW5nLiAqLworI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9NUFUgKi8KKworI2lmICggY29uZmlnRU5BQkxFX01QVSA9PSAxICkKKwlsZG0gIHIwISwge3IxLXIzfQkJCQkJCS8qIFJlYWQgZnJvbSBzdGFjayAtIHIxID0gUFNQTElNLCByMiA9IENPTlRST0wgYW5kIHIzID0gRVhDX1JFVFVSTi4gKi8KKwltc3IgIHBzcGxpbSwgcjEJCQkJCQkJLyogU2V0IHRoaXMgdGFzaydzIFBTUExJTSB2YWx1ZS4gKi8KKwltc3IgIGNvbnRyb2wsIHIyCQkJCQkJLyogU2V0IHRoaXMgdGFzaydzIENPTlRST0wgdmFsdWUuICovCisJYWRkcyByMCwgIzMyCQkJCQkJCS8qIERpc2NhcmQgZXZlcnl0aGluZyB1cCB0byByMC4gKi8KKwltc3IgIHBzcCwgcjAJCQkJCQkJLyogVGhpcyBpcyBub3cgdGhlIG5ldyB0b3Agb2Ygc3RhY2sgdG8gdXNlIGluIHRoZSB0YXNrLiAqLworCWlzYgorCWJ4ICAgcjMJCQkJCQkJCQkvKiBGaW5hbGx5LCBicmFuY2ggdG8gRVhDX1JFVFVSTi4gKi8KKyNlbHNlIC8qIGNvbmZpZ0VOQUJMRV9NUFUgKi8KKwlsZG0gIHIwISwge3IxLXIyfQkJCQkJCS8qIFJlYWQgZnJvbSBzdGFjayAtIHIxID0gUFNQTElNIGFuZCByMiA9IEVYQ19SRVRVUk4uICovCisJbXNyICBwc3BsaW0sIHIxCQkJCQkJCS8qIFNldCB0aGlzIHRhc2sncyBQU1BMSU0gdmFsdWUuICovCisJbW92cyByMSwgIzIJCQkJCQkJCS8qIHIxID0gMi4gKi8KKwltc3IgIENPTlRST0wsIHIxCQkJCQkJLyogU3dpdGNoIHRvIHVzZSBQU1AgaW4gdGhlIHRocmVhZCBtb2RlLiAqLworCWFkZHMgcjAsICMzMgkJCQkJCQkvKiBEaXNjYXJkIGV2ZXJ5dGhpbmcgdXAgdG8gcjAuICovCisJbXNyICBwc3AsIHIwCQkJCQkJCS8qIFRoaXMgaXMgbm93IHRoZSBuZXcgdG9wIG9mIHN0YWNrIHRvIHVzZSBpbiB0aGUgdGFzay4gKi8KKwlpc2IKKwlieCAgIHIyCQkJCQkJCQkJLyogRmluYWxseSwgYnJhbmNoIHRvIEVYQ19SRVRVUk4uICovCisjZW5kaWYgLyogY29uZmlnRU5BQkxFX01QVSAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZSYWlzZVByaXZpbGVnZToKKwltcnMgIHIwLCBjb250cm9sCQkJCQkJLyogUmVhZCB0aGUgQ09OVFJPTCByZWdpc3Rlci4gKi8KKwltb3ZzIHIxLCAjMQkJCQkJCQkJLyogcjEgPSAxLiAqLworCWJpY3MgcjAsIHIxCQkJCQkJCQkvKiBDbGVhciB0aGUgYml0IDAuICovCisJbXNyICBjb250cm9sLCByMAkJCQkJCS8qIFdyaXRlIGJhY2sgdGhlIG5ldyBDT05UUk9MIHZhbHVlLiAqLworCWJ4IGxyCQkJCQkJCQkJLyogUmV0dXJuIHRvIHRoZSBjYWxsZXIuICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordlN0YXJ0Rmlyc3RUYXNrOgorCWxkciByMCwgPTB4ZTAwMGVkMDgJCQkJCQkvKiBVc2UgdGhlIE5WSUMgb2Zmc2V0IHJlZ2lzdGVyIHRvIGxvY2F0ZSB0aGUgc3RhY2suICovCisJbGRyIHIwLCBbcjBdCQkJCQkJCS8qIFJlYWQgdGhlIFZUT1IgcmVnaXN0ZXIgd2hpY2ggZ2l2ZXMgdGhlIGFkZHJlc3Mgb2YgdmVjdG9yIHRhYmxlLiAqLworCWxkciByMCwgW3IwXQkJCQkJCQkvKiBUaGUgZmlyc3QgZW50cnkgaW4gdmVjdG9yIHRhYmxlIGlzIHN0YWNrIHBvaW50ZXIuICovCisJbXNyIG1zcCwgcjAJCQkJCQkJCS8qIFNldCB0aGUgTVNQIGJhY2sgdG8gdGhlIHN0YXJ0IG9mIHRoZSBzdGFjay4gKi8KKwljcHNpZSBpCQkJCQkJCQkJLyogR2xvYmFsbHkgZW5hYmxlIGludGVycnVwdHMuICovCisJZHNiCisJaXNiCisJc3ZjIDIJCQkJCQkJCQkvKiBTeXN0ZW0gY2FsbCB0byBzdGFydCB0aGUgZmlyc3QgdGFzay4gcG9ydFNWQ19TVEFSVF9TQ0hFRFVMRVIgPSAyLiAqLworCW5vcAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3VsU2V0SW50ZXJydXB0TWFza0Zyb21JU1I6CisJbXJzIHIwLCBQUklNQVNLCisJY3BzaWQgaQorCWJ4IGxyCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordkNsZWFySW50ZXJydXB0TWFza0Zyb21JU1I6CisJbXNyIFBSSU1BU0ssIHIwCisJYnggbHIKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitQZW5kU1ZfSGFuZGxlcjoKKwltcnMgcjAsIHBzcAkJCQkJCQkJLyogUmVhZCBQU1AgaW4gcjAuICovCisJbGRyIHIyLCA9cHhDdXJyZW50VENCCQkJCQkvKiBSZWFkIHRoZSBsb2NhdGlvbiBvZiBweEN1cnJlbnRUQ0IgaS5lLiAmKCBweEN1cnJlbnRUQ0IgKS4gKi8KKwlsZHIgcjEsIFtyMl0JCQkJCQkJLyogUmVhZCBweEN1cnJlbnRUQ0IuICovCisjaWYgKCBjb25maWdFTkFCTEVfTVBVID09IDEgKQorCXN1YnMgcjAsIHIwLCAjNDQJCQkJCQkvKiBNYWtlIHNwYWNlIGZvciBQU1BMSU0sIENPTlRST0wsIExSIGFuZCB0aGUgcmVtYWluaW5nIHJlZ2lzdGVycyBvbiB0aGUgc3RhY2suICovCisJc3RyIHIwLCBbcjFdCQkJCQkJCS8qIFNhdmUgdGhlIG5ldyB0b3Agb2Ygc3RhY2sgaW4gVENCLiAqLworCW1ycyByMSwgcHNwbGltCQkJCQkJCS8qIHIxID0gUFNQTElNLiAqLworCW1ycyByMiwgY29udHJvbAkJCQkJCQkvKiByMiA9IENPTlRST0wuICovCisJbW92IHIzLCBscgkJCQkJCQkJLyogcjMgPSBMUi9FWENfUkVUVVJOLiAqLworCXN0bWlhIHIwISwge3IxLXI3fQkJCQkJCS8qIFN0b3JlIG9uIHRoZSBzdGFjayAtIFBTUExJTSwgQ09OVFJPTCwgTFIgYW5kIGxvdyByZWdpc3RlcnMgdGhhdCBhcmUgbm90IGF1dG9tYXRpY2FsbHkgc2F2ZWQuICovCisJbW92IHI0LCByOAkJCQkJCQkJLyogcjQgPSByOC4gKi8KKwltb3YgcjUsIHI5CQkJCQkJCQkvKiByNSA9IHI5LiAqLworCW1vdiByNiwgcjEwCQkJCQkJCQkvKiByNiA9IHIxMC4gKi8KKwltb3YgcjcsIHIxMQkJCQkJCQkJLyogcjcgPSByMTEuICovCisJc3RtaWEgcjAhLCB7cjQtcjd9CQkJCQkJLyogU3RvcmUgdGhlIGhpZ2ggcmVnaXN0ZXJzIHRoYXQgYXJlIG5vdCBzYXZlZCBhdXRvbWF0aWNhbGx5LiAqLworI2Vsc2UgLyogY29uZmlnRU5BQkxFX01QVSAqLworCXN1YnMgcjAsIHIwLCAjNDAJCQkJCQkvKiBNYWtlIHNwYWNlIGZvciBQU1BMSU0sIExSIGFuZCB0aGUgcmVtYWluaW5nIHJlZ2lzdGVycyBvbiB0aGUgc3RhY2suICovCisJc3RyIHIwLCBbcjFdCQkJCQkJCS8qIFNhdmUgdGhlIG5ldyB0b3Agb2Ygc3RhY2sgaW4gVENCLiAqLworCW1ycyByMiwgcHNwbGltCQkJCQkJCS8qIHIyID0gUFNQTElNLiAqLworCW1vdiByMywgbHIJCQkJCQkJCS8qIHIzID0gTFIvRVhDX1JFVFVSTi4gKi8KKwlzdG1pYSByMCEsIHtyMi1yN30JCQkJCQkvKiBTdG9yZSBvbiB0aGUgc3RhY2sgLSBQU1BMSU0sIExSIGFuZCBsb3cgcmVnaXN0ZXJzIHRoYXQgYXJlIG5vdCBhdXRvbWF0aWNhbGx5IHNhdmVkLiAqLworCW1vdiByNCwgcjgJCQkJCQkJCS8qIHI0ID0gcjguICovCisJbW92IHI1LCByOQkJCQkJCQkJLyogcjUgPSByOS4gKi8KKwltb3YgcjYsIHIxMAkJCQkJCQkJLyogcjYgPSByMTAuICovCisJbW92IHI3LCByMTEJCQkJCQkJCS8qIHI3ID0gcjExLiAqLworCXN0bWlhIHIwISwge3I0LXI3fQkJCQkJCS8qIFN0b3JlIHRoZSBoaWdoIHJlZ2lzdGVycyB0aGF0IGFyZSBub3Qgc2F2ZWQgYXV0b21hdGljYWxseS4gKi8KKyNlbmRpZiAvKiBjb25maWdFTkFCTEVfTVBVICovCisKKwljcHNpZCBpCisJYmwgdlRhc2tTd2l0Y2hDb250ZXh0CisJY3BzaWUgaQorCisJbGRyIHIyLCA9cHhDdXJyZW50VENCCQkJCQkvKiBSZWFkIHRoZSBsb2NhdGlvbiBvZiBweEN1cnJlbnRUQ0IgaS5lLiAmKCBweEN1cnJlbnRUQ0IgKS4gKi8KKwlsZHIgcjEsIFtyMl0JCQkJCQkJLyogUmVhZCBweEN1cnJlbnRUQ0IuICovCisJbGRyIHIwLCBbcjFdCQkJCQkJCS8qIFRoZSBmaXJzdCBpdGVtIGluIHB4Q3VycmVudFRDQiBpcyB0aGUgdGFzayB0b3Agb2Ygc3RhY2suIHIwIG5vdyBwb2ludHMgdG8gdGhlIHRvcCBvZiBzdGFjay4gKi8KKworI2lmICggY29uZmlnRU5BQkxFX01QVSA9PSAxICkKKwlkbWIJCQkJCQkJCQkJLyogQ29tcGxldGUgb3V0c3RhbmRpbmcgdHJhbnNmZXJzIGJlZm9yZSBkaXNhYmxpbmcgTVBVLiAqLworCWxkciByMiwgPTB4ZTAwMGVkOTQJCQkJCQkvKiByMiA9IDB4ZTAwMGVkOTQgW0xvY2F0aW9uIG9mIE1QVV9DVFJMXS4gKi8KKwlsZHIgcjMsIFtyMl0JCQkJCQkJLyogUmVhZCB0aGUgdmFsdWUgb2YgTVBVX0NUUkwuICovCisJbW92cyByNCwgIzEJCQkJCQkJCS8qIHI0ID0gMS4gKi8KKwliaWNzIHIzLCByNAkJCQkJCQkJLyogcjMgPSByMyAmIH5yNCBpLmUuIENsZWFyIHRoZSBiaXQgMCBpbiByMy4gKi8KKwlzdHIgcjMsIFtyMl0JCQkJCQkJLyogRGlzYWJsZSBNUFUuICovCisKKwlhZGRzIHIxLCAjNAkJCQkJCQkJLyogcjEgPSByMSArIDQuIHIxIG5vdyBwb2ludHMgdG8gTUFJUjAgaW4gVENCLiAqLworCWxkciAgcjQsIFtyMV0JCQkJCQkJLyogcjQgPSAqcjEgaS5lLiByNCA9IE1BSVIwLiAqLworCWxkciAgcjIsID0weGUwMDBlZGMwCQkJCQkvKiByMiA9IDB4ZTAwMGVkYzAgW0xvY2F0aW9uIG9mIE1BSVIwXS4gKi8KKwlzdHIgIHI0LCBbcjJdCQkJCQkJCS8qIFByb2dyYW0gTUFJUjAuICovCisJbGRyICByMiwgPTB4ZTAwMGVkOTgJCQkJCS8qIHIyID0gMHhlMDAwZWQ5OCBbTG9jYXRpb24gb2YgUk5SXS4gKi8KKwlhZGRzIHIxLCAjNAkJCQkJCQkJLyogcjEgPSByMSArIDQuIHIxIG5vdyBwb2ludHMgdG8gZmlyc3QgUkJBUiBpbiBUQ0IuICovCisJbW92cyByNCwgIzQJCQkJCQkJCS8qIHI0ID0gNC4gKi8KKwlzdHIgIHI0LCBbcjJdCQkJCQkJCS8qIFByb2dyYW0gUk5SID0gNC4gKi8KKwlsZG1pYSByMSEsIHtyNSxyNn0JCQkJCQkvKiBSZWFkIGZpcnN0IHNldCBvZiBSQkFSL1JMQVIgZnJvbSBUQ0IuICovCisJbGRyICByMywgPTB4ZTAwMGVkOWMJCQkJCS8qIHIzID0gMHhlMDAwZWQ5YyBbTG9jYXRpb24gb2YgUkJBUl0uICovCisJc3RtaWEgcjMhLCB7cjUscjZ9CQkJCQkJLyogV3JpdGUgZmlyc3Qgc2V0IG9mIFJCQVIvUkxBUiByZWdpc3RlcnMuICovCisJbW92cyByNCwgIzUJCQkJCQkJCS8qIHI0ID0gNS4gKi8KKwlzdHIgIHI0LCBbcjJdCQkJCQkJCS8qIFByb2dyYW0gUk5SID0gNS4gKi8KKwlsZG1pYSByMSEsIHtyNSxyNn0JCQkJCQkvKiBSZWFkIHNlY29uZCBzZXQgb2YgUkJBUi9STEFSIGZyb20gVENCLiAqLworCWxkciAgcjMsID0weGUwMDBlZDljCQkJCQkvKiByMyA9IDB4ZTAwMGVkOWMgW0xvY2F0aW9uIG9mIFJCQVJdLiAqLworCXN0bWlhIHIzISwge3I1LHI2fQkJCQkJCS8qIFdyaXRlIHNlY29uZCBzZXQgb2YgUkJBUi9STEFSIHJlZ2lzdGVycy4gKi8KKwltb3ZzIHI0LCAjNgkJCQkJCQkJLyogcjQgPSA2LiAqLworCXN0ciAgcjQsIFtyMl0JCQkJCQkJLyogUHJvZ3JhbSBSTlIgPSA2LiAqLworCWxkbWlhIHIxISwge3I1LHI2fQkJCQkJCS8qIFJlYWQgdGhpcmQgc2V0IG9mIFJCQVIvUkxBUiBmcm9tIFRDQi4gKi8KKwlsZHIgIHIzLCA9MHhlMDAwZWQ5YwkJCQkJLyogcjMgPSAweGUwMDBlZDljIFtMb2NhdGlvbiBvZiBSQkFSXS4gKi8KKwlzdG1pYSByMyEsIHtyNSxyNn0JCQkJCQkvKiBXcml0ZSB0aGlyZCBzZXQgb2YgUkJBUi9STEFSIHJlZ2lzdGVycy4gKi8KKwltb3ZzIHI0LCAjNwkJCQkJCQkJLyogcjQgPSA3LiAqLworCXN0ciAgcjQsIFtyMl0JCQkJCQkJLyogUHJvZ3JhbSBSTlIgPSA3LiAqLworCWxkbWlhIHIxISwge3I1LHI2fQkJCQkJCS8qIFJlYWQgZm91cnRoIHNldCBvZiBSQkFSL1JMQVIgZnJvbSBUQ0IuICovCisJbGRyICByMywgPTB4ZTAwMGVkOWMJCQkJCS8qIHIzID0gMHhlMDAwZWQ5YyBbTG9jYXRpb24gb2YgUkJBUl0uICovCisJc3RtaWEgcjMhLCB7cjUscjZ9CQkJCQkJLyogV3JpdGUgZm91cnRoIHNldCBvZiBSQkFSL1JMQVIgcmVnaXN0ZXJzLiAqLworCisJbGRyIHIyLCA9MHhlMDAwZWQ5NAkJCQkJCS8qIHIyID0gMHhlMDAwZWQ5NCBbTG9jYXRpb24gb2YgTVBVX0NUUkxdLiAqLworCWxkciByMywgW3IyXQkJCQkJCQkvKiBSZWFkIHRoZSB2YWx1ZSBvZiBNUFVfQ1RSTC4gKi8KKwltb3ZzIHI0LCAjMQkJCQkJCQkJLyogcjQgPSAxLiAqLworCW9ycnMgcjMsIHI0CQkJCQkJCQkvKiByMyA9IHIzIHwgcjQgaS5lLiBTZXQgdGhlIGJpdCAwIGluIHIzLiAqLworCXN0ciByMywgW3IyXQkJCQkJCQkvKiBFbmFibGUgTVBVLiAqLworCWRzYgkJCQkJCQkJCQkvKiBGb3JjZSBtZW1vcnkgd3JpdGVzIGJlZm9yZSBjb250aW51aW5nLiAqLworI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9NUFUgKi8KKworI2lmICggY29uZmlnRU5BQkxFX01QVSA9PSAxICkKKwlhZGRzIHIwLCByMCwgIzI4CQkJCQkJLyogTW92ZSB0byB0aGUgaGlnaCByZWdpc3RlcnMuICovCisJbGRtaWEgcjAhLCB7cjQtcjd9CQkJCQkJLyogUmVzdG9yZSB0aGUgaGlnaCByZWdpc3RlcnMgdGhhdCBhcmUgbm90IGF1dG9tYXRpY2FsbHkgcmVzdG9yZWQuICovCisJbW92IHI4LCByNAkJCQkJCQkJLyogcjggPSByNC4gKi8KKwltb3YgcjksIHI1CQkJCQkJCQkvKiByOSA9IHI1LiAqLworCW1vdiByMTAsIHI2CQkJCQkJCQkvKiByMTAgPSByNi4gKi8KKwltb3YgcjExLCByNwkJCQkJCQkJLyogcjExID0gcjcuICovCisJbXNyIHBzcCwgcjAJCQkJCQkJCS8qIFJlbWVtYmVyIHRoZSBuZXcgdG9wIG9mIHN0YWNrIGZvciB0aGUgdGFzay4gKi8KKwlzdWJzIHIwLCByMCwgIzQ0CQkJCQkJLyogTW92ZSB0byB0aGUgc3RhcnRpbmcgb2YgdGhlIHNhdmVkIGNvbnRleHQuICovCisJbGRtaWEgcjAhLCB7cjEtcjd9CQkJCQkJLyogUmVhZCBmcm9tIHN0YWNrIC0gcjEgPSBQU1BMSU0sIHIyID0gQ09OVFJPTCwgcjMgPSBMUiBhbmQgcjQtcjcgcmVzdG9yZWQuICovCisJbXNyIHBzcGxpbSwgcjEJCQkJCQkJLyogUmVzdG9yZSB0aGUgUFNQTElNIHJlZ2lzdGVyIHZhbHVlIGZvciB0aGUgdGFzay4gKi8KKwltc3IgY29udHJvbCwgcjIJCQkJCQkJLyogUmVzdG9yZSB0aGUgQ09OVFJPTCByZWdpc3RlciB2YWx1ZSBmb3IgdGhlIHRhc2suICovCisJYnggcjMKKyNlbHNlIC8qIGNvbmZpZ0VOQUJMRV9NUFUgKi8KKwlhZGRzIHIwLCByMCwgIzI0CQkJCQkJLyogTW92ZSB0byB0aGUgaGlnaCByZWdpc3RlcnMuICovCisJbGRtaWEgcjAhLCB7cjQtcjd9CQkJCQkJLyogUmVzdG9yZSB0aGUgaGlnaCByZWdpc3RlcnMgdGhhdCBhcmUgbm90IGF1dG9tYXRpY2FsbHkgcmVzdG9yZWQuICovCisJbW92IHI4LCByNAkJCQkJCQkJLyogcjggPSByNC4gKi8KKwltb3YgcjksIHI1CQkJCQkJCQkvKiByOSA9IHI1LiAqLworCW1vdiByMTAsIHI2CQkJCQkJCQkvKiByMTAgPSByNi4gKi8KKwltb3YgcjExLCByNwkJCQkJCQkJLyogcjExID0gcjcuICovCisJbXNyIHBzcCwgcjAJCQkJCQkJCS8qIFJlbWVtYmVyIHRoZSBuZXcgdG9wIG9mIHN0YWNrIGZvciB0aGUgdGFzay4gKi8KKwlzdWJzIHIwLCByMCwgIzQwCQkJCQkJLyogTW92ZSB0byB0aGUgc3RhcnRpbmcgb2YgdGhlIHNhdmVkIGNvbnRleHQuICovCisJbGRtaWEgcjAhLCB7cjItcjd9CQkJCQkJLyogUmVhZCBmcm9tIHN0YWNrIC0gcjIgPSBQU1BMSU0sIHIzID0gTFIgYW5kIHI0LXI3IHJlc3RvcmVkLiAqLworCW1zciBwc3BsaW0sIHIyCQkJCQkJCS8qIFJlc3RvcmUgdGhlIFBTUExJTSByZWdpc3RlciB2YWx1ZSBmb3IgdGhlIHRhc2suICovCisJYnggcjMKKyNlbmRpZiAvKiBjb25maWdFTkFCTEVfTVBVICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworU1ZDX0hhbmRsZXI6CisJbW92cyByMCwgIzQKKwltb3YgcjEsIGxyCisJdHN0IHIwLCByMQorCWJlcSBzdGFja2luZ191c2VkX21zcAorCW1ycyByMCwgcHNwCisJYiB2UG9ydFNWQ0hhbmRsZXJfQworCXN0YWNraW5nX3VzZWRfbXNwOgorCQltcnMgcjAsIG1zcAorCQliIHZQb3J0U1ZDSGFuZGxlcl9DCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCUVORApkaWZmIC0tZ2l0IGEvU291cmNlL3BvcnRhYmxlL0lBUi9BUk1fQ00yM19OVFovbm9uX3NlY3VyZS9wb3J0bWFjcm8uaCBiL1NvdXJjZS9wb3J0YWJsZS9JQVIvQVJNX0NNMjNfTlRaL25vbl9zZWN1cmUvcG9ydG1hY3JvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVhNTM0MAotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9wb3J0YWJsZS9JQVIvQVJNX0NNMjNfTlRaL25vbl9zZWN1cmUvcG9ydG1hY3JvLmgKQEAgLTAsMCArMSwzMDYgQEAKKy8qCisgKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjIuMQorICogQ29weXJpZ2h0IChDKSAyMDE5IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKKyAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCisgKiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCisgKiB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZgorICogdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLAorICogc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCisgKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUworICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SCisgKiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIKKyAqIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIGh0dHA6Ly93d3cuRnJlZVJUT1Mub3JnCisgKiBodHRwOi8vYXdzLmFtYXpvbi5jb20vZnJlZXJ0b3MKKyAqCisgKiAxIHRhYiA9PSA0IHNwYWNlcyEKKyAqLworCisjaWZuZGVmIFBPUlRNQUNST19ICisjZGVmaW5lIFBPUlRNQUNST19ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFBvcnQgc3BlY2lmaWMgZGVmaW5pdGlvbnMuCisgKgorICogVGhlIHNldHRpbmdzIGluIHRoaXMgZmlsZSBjb25maWd1cmUgRnJlZVJUT1MgY29ycmVjdGx5IGZvciB0aGUgZ2l2ZW4gaGFyZHdhcmUKKyAqIGFuZCBjb21waWxlci4KKyAqCisgKiBUaGVzZSBzZXR0aW5ncyBzaG91bGQgbm90IGJlIGFsdGVyZWQuCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKyNpZm5kZWYgY29uZmlnRU5BQkxFX0ZQVQorCSNlcnJvciBjb25maWdFTkFCTEVfRlBVIG11c3QgYmUgZGVmaW5lZCBpbiBGcmVlUlRPU0NvbmZpZy5oLiAgU2V0IGNvbmZpZ0VOQUJMRV9GUFUgdG8gMSB0byBlbmFibGUgdGhlIEZQVSBvciAwIHRvIGRpc2FibGUgdGhlIEZQVS4KKyNlbmRpZiAvKiBjb25maWdFTkFCTEVfRlBVICovCisKKyNpZm5kZWYgY29uZmlnRU5BQkxFX01QVQorCSNlcnJvciBjb25maWdFTkFCTEVfTVBVIG11c3QgYmUgZGVmaW5lZCBpbiBGcmVlUlRPU0NvbmZpZy5oLiAgU2V0IGNvbmZpZ0VOQUJMRV9NUFUgdG8gMSB0byBlbmFibGUgdGhlIE1QVSBvciAwIHRvIGRpc2FibGUgdGhlIE1QVS4KKyNlbmRpZiAvKiBjb25maWdFTkFCTEVfTVBVICovCisKKyNpZm5kZWYgY29uZmlnRU5BQkxFX1RSVVNUWk9ORQorCSNlcnJvciBjb25maWdFTkFCTEVfVFJVU1RaT05FIG11c3QgYmUgZGVmaW5lZCBpbiBGcmVlUlRPU0NvbmZpZy5oLiAgU2V0IGNvbmZpZ0VOQUJMRV9UUlVTVFpPTkUgdG8gMSB0byBlbmFibGUgVHJ1c3Rab25lIG9yIDAgdG8gZGlzYWJsZSBUcnVzdFpvbmUuCisjZW5kaWYgLyogY29uZmlnRU5BQkxFX1RSVVNUWk9ORSAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqCisgKiBAYnJpZWYgVHlwZSBkZWZpbml0aW9ucy4KKyAqLworI2RlZmluZSBwb3J0Q0hBUgkJCQkJCQkJCQkJY2hhcgorI2RlZmluZSBwb3J0RkxPQVQJCQkJCQkJCQkJCWZsb2F0CisjZGVmaW5lIHBvcnRET1VCTEUJCQkJCQkJCQkJCWRvdWJsZQorI2RlZmluZSBwb3J0TE9ORwkJCQkJCQkJCQkJbG9uZworI2RlZmluZSBwb3J0U0hPUlQJCQkJCQkJCQkJCXNob3J0CisjZGVmaW5lIHBvcnRTVEFDS19UWVBFCQkJCQkJCQkJCXVpbnQzMl90CisjZGVmaW5lIHBvcnRCQVNFX1RZUEUJCQkJCQkJCQkJbG9uZworCit0eXBlZGVmIHBvcnRTVEFDS19UWVBFCQkJCQkJCQkJCVN0YWNrVHlwZV90OwordHlwZWRlZiBsb25nCQkJCQkJCQkJCQkJQmFzZVR5cGVfdDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZwkJCQkJCQkJCQlVQmFzZVR5cGVfdDsKKworI2lmKCBjb25maWdVU0VfMTZfQklUX1RJQ0tTID09IDEgKQorCXR5cGVkZWYgdWludDE2X3QgVGlja1R5cGVfdDsKKwkjZGVmaW5lIHBvcnRNQVhfREVMQVkgKCBUaWNrVHlwZV90ICkJCQkJCTB4ZmZmZgorI2Vsc2UKKwl0eXBlZGVmIHVpbnQzMl90IFRpY2tUeXBlX3Q7CisJI2RlZmluZSBwb3J0TUFYX0RFTEFZICggVGlja1R5cGVfdCApCQkJCQkweGZmZmZmZmZmVUwKKworCS8qIDMyLWJpdCB0aWNrIHR5cGUgb24gYSAzMi1iaXQgYXJjaGl0ZWN0dXJlLCBzbyByZWFkcyBvZiB0aGUgdGljayBjb3VudCBkbworCSAqIG5vdCBuZWVkIHRvIGJlIGd1YXJkZWQgd2l0aCBhIGNyaXRpY2FsIHNlY3Rpb24uICovCisJI2RlZmluZSBwb3J0VElDS19UWVBFX0lTX0FUT01JQwkJCQkJCQkxCisjZW5kaWYKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAqIEFyY2hpdGVjdHVyZSBzcGVjaWZpY3MuCisgKi8KKyNkZWZpbmUgcG9ydEFSQ0hfTkFNRQkJCQkJCQkJCQkiQ29ydGV4LU0yMyIKKyNkZWZpbmUgcG9ydFNUQUNLX0dST1dUSAkJCQkJCQkJCSggLTEgKQorI2RlZmluZSBwb3J0VElDS19QRVJJT0RfTVMJCQkJCQkJCQkoICggVGlja1R5cGVfdCApIDEwMDAgLyBjb25maWdUSUNLX1JBVEVfSFogKQorI2RlZmluZSBwb3J0QllURV9BTElHTk1FTlQJCQkJCQkJCQk4CisjZGVmaW5lIHBvcnROT1AoKQorI2RlZmluZSBwb3J0SU5MSU5FCQkJCQkJCQkJCQlfX2lubGluZQorI2lmbmRlZiBwb3J0Rk9SQ0VfSU5MSU5FCisJI2RlZmluZSBwb3J0Rk9SQ0VfSU5MSU5FCQkJCQkJCQlpbmxpbmUgX19hdHRyaWJ1dGVfXygoIGFsd2F5c19pbmxpbmUgKSkKKyNlbmRpZgorI2RlZmluZSBwb3J0SEFTX1NUQUNLX09WRVJGTE9XX0NIRUNLSU5HCQkJCQkJMQorI2RlZmluZSBwb3J0RE9OVF9ESVNDQVJECQkJCQkJCQkJX19yb290CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqCisgKiBAYnJpZWYgRXh0ZXJuIGRlY2xhcmF0aW9ucy4KKyAqLworZXh0ZXJuIHZvaWQgdlBvcnRZaWVsZCggdm9pZCApIC8qIFBSSVZJTEVHRURfRlVOQ1RJT04gKi87CisKK2V4dGVybiB2b2lkIHZQb3J0RW50ZXJDcml0aWNhbCggdm9pZCApIC8qIFBSSVZJTEVHRURfRlVOQ1RJT04gKi87CitleHRlcm4gdm9pZCB2UG9ydEV4aXRDcml0aWNhbCggdm9pZCApIC8qIFBSSVZJTEVHRURfRlVOQ1RJT04gKi87CisKK2V4dGVybiB1aW50MzJfdCB1bFNldEludGVycnVwdE1hc2tGcm9tSVNSKCB2b2lkICkgLyogX19hdHRyaWJ1dGVfXygoIG5ha2VkICkpIFBSSVZJTEVHRURfRlVOQ1RJT04gKi87CitleHRlcm4gdm9pZCB2Q2xlYXJJbnRlcnJ1cHRNYXNrRnJvbUlTUiggdWludDMyX3QgdWxNYXNrICkgLyogX19hdHRyaWJ1dGVfXygoIG5ha2VkICkpIFBSSVZJTEVHRURfRlVOQ1RJT04gKi87CisKKyNpZiggY29uZmlnRU5BQkxFX1RSVVNUWk9ORSA9PSAxICkKKwlleHRlcm4gdm9pZCB2UG9ydEFsbG9jYXRlU2VjdXJlQ29udGV4dCggdWludDMyX3QgdWxTZWN1cmVTdGFja1NpemUgKTsgLyogX19hdHRyaWJ1dGVfXyAoKCBuYWtlZCApKSAqLworCWV4dGVybiB2b2lkIHZQb3J0RnJlZVNlY3VyZUNvbnRleHQoIHVpbnQzMl90ICpwdWxUQ0IgKSAvKiBfX2F0dHJpYnV0ZV9fICgoIG5ha2VkICkpIFBSSVZJTEVHRURfRlVOQ1RJT04gKi87CisjZW5kaWYgLyogY29uZmlnRU5BQkxFX1RSVVNUWk9ORSAqLworCisjaWYoIGNvbmZpZ0VOQUJMRV9NUFUgPT0gMSApCisJZXh0ZXJuIEJhc2VUeXBlX3QgeElzUHJpdmlsZWdlZCggdm9pZCApIC8qIF9fYXR0cmlidXRlX18gKCggbmFrZWQgKSkgKi87CisJZXh0ZXJuIHZvaWQgdlJlc2V0UHJpdmlsZWdlKCB2b2lkICkgLyogX19hdHRyaWJ1dGVfXyAoKCBuYWtlZCApKSAqLzsKKyNlbmRpZiAvKiBjb25maWdFTkFCTEVfTVBVICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqCisgKiBAYnJpZWYgTVBVIHNwZWNpZmljIGNvbnN0YW50cy4KKyAqLworI2lmKCBjb25maWdFTkFCTEVfTVBVID09IDEgKQorCSNkZWZpbmUgcG9ydFVTSU5HX01QVV9XUkFQUEVSUwkJCQkJCQkxCisJI2RlZmluZSBwb3J0UFJJVklMRUdFX0JJVAkJCQkJCQkJKCAweDgwMDAwMDAwVUwgKQorI2Vsc2UKKwkjZGVmaW5lIHBvcnRQUklWSUxFR0VfQklUCQkJCQkJCQkoIDB4MFVMICkKKyNlbmRpZiAvKiBjb25maWdFTkFCTEVfTVBVICovCisKKworLyogTVBVIHJlZ2lvbnMuICovCisjZGVmaW5lIHBvcnRQUklWSUxFR0VEX0ZMQVNIX1JFR0lPTgkJCQkJCQkoIDBVTCApCisjZGVmaW5lIHBvcnRVTlBSSVZJTEVHRURfRkxBU0hfUkVHSU9OCQkJCQkJKCAxVUwgKQorI2RlZmluZSBwb3J0VU5QUklWSUxFR0VEX1NZU0NBTExTX1JFR0lPTgkJCQkJKCAyVUwgKQorI2RlZmluZSBwb3J0UFJJVklMRUdFRF9SQU1fUkVHSU9OCQkJCQkJCSggM1VMICkKKyNkZWZpbmUgcG9ydFNUQUNLX1JFR0lPTgkJCQkJCQkJCSggNFVMICkKKyNkZWZpbmUgcG9ydEZJUlNUX0NPTkZJR1VSQUJMRV9SRUdJT04JCQkJCQkoIDVVTCApCisjZGVmaW5lIHBvcnRMQVNUX0NPTkZJR1VSQUJMRV9SRUdJT04JCQkJCQkoIDdVTCApCisjZGVmaW5lIHBvcnROVU1fQ09ORklHVVJBQkxFX1JFR0lPTlMJCQkJCQkoICggcG9ydExBU1RfQ09ORklHVVJBQkxFX1JFR0lPTiAtIHBvcnRGSVJTVF9DT05GSUdVUkFCTEVfUkVHSU9OICkgKyAxICkKKyNkZWZpbmUgcG9ydFRPVEFMX05VTV9SRUdJT05TCQkJCQkJCQkoIHBvcnROVU1fQ09ORklHVVJBQkxFX1JFR0lPTlMgKyAxICkgLyogUGx1cyBvbmUgdG8gbWFrZSBzcGFjZSBmb3IgdGhlIHN0YWNrIHJlZ2lvbi4gKi8KKworLyogRGV2aWNlIG1lbW9yeSBhdHRyaWJ1dGVzIHVzZWQgaW4gTVBVX01BSVIgcmVnaXN0ZXJzLgorICoKKyAqIDgtYml0IHZhbHVlcyBlbmNvZGVkIGFzIGZvbGxvd3M6CisgKiAgQml0Wzc6NF0gLSAwMDAwIC0gRGV2aWNlIE1lbW9yeQorICogIEJpdFszOjJdIC0gMDAgLS0+IERldmljZS1uR25SbkUKKyAqCQkJCTAxIC0tPiBEZXZpY2UtbkduUkUKKyAqCQkJCTEwIC0tPiBEZXZpY2UtbkdSRQorICoJCQkJMTEgLS0+IERldmljZS1HUkUKKyAqICBCaXRbMTowXSAtIDAwLCBSZXNlcnZlZC4KKyAqLworI2RlZmluZSBwb3J0TVBVX0RFVklDRV9NRU1PUllfbkduUm5FCQkJCQkJKCAweDAwICkgLyogMDAwMCAwMDAwICovCisjZGVmaW5lIHBvcnRNUFVfREVWSUNFX01FTU9SWV9uR25SRQkJCQkJCQkoIDB4MDQgKSAvKiAwMDAwIDAxMDAgKi8KKyNkZWZpbmUgcG9ydE1QVV9ERVZJQ0VfTUVNT1JZX25HUkUJCQkJCQkJKCAweDA4ICkgLyogMDAwMCAxMDAwICovCisjZGVmaW5lIHBvcnRNUFVfREVWSUNFX01FTU9SWV9HUkUJCQkJCQkJKCAweDBDICkgLyogMDAwMCAxMTAwICovCisKKy8qIE5vcm1hbCBtZW1vcnkgYXR0cmlidXRlcyB1c2VkIGluIE1QVV9NQUlSIHJlZ2lzdGVycy4gKi8KKyNkZWZpbmUgcG9ydE1QVV9OT1JNQUxfTUVNT1JZX05PTl9DQUNIRUFCTEUJCQkJCSggMHg0NCApIC8qIE5vbi1jYWNoZWFibGUuICovCisjZGVmaW5lIHBvcnRNUFVfTk9STUFMX01FTU9SWV9CVUZGRVJBQkxFX0NBQ0hFQUJMRQkJCSggMHhGRiApIC8qIE5vbi1UcmFuc2llbnQsIFdyaXRlLWJhY2ssIFJlYWQtQWxsb2NhdGUgYW5kIFdyaXRlLUFsbG9jYXRlLiAqLworCisvKiBBdHRyaWJ1dGVzIHVzZWQgaW4gTVBVX1JCQVIgcmVnaXN0ZXJzLiAqLworI2RlZmluZSBwb3J0TVBVX1JFR0lPTl9OT05fU0hBUkVBQkxFCQkJCQkJKCAwVUwgPDwgM1VMICkKKyNkZWZpbmUgcG9ydE1QVV9SRUdJT05fSU5ORVJfU0hBUkVBQkxFCQkJCQkJKCAxVUwgPDwgM1VMICkKKyNkZWZpbmUgcG9ydE1QVV9SRUdJT05fT1VURVJfU0hBUkVBQkxFCQkJCQkJKCAyVUwgPDwgM1VMICkKKworI2RlZmluZSBwb3J0TVBVX1JFR0lPTl9QUklWSUxFR0VEX1JFQURfV1JJVEUJCQkJKCAwVUwgPDwgMVVMICkKKyNkZWZpbmUgcG9ydE1QVV9SRUdJT05fUkVBRF9XUklURQkJCQkJCQkoIDFVTCA8PCAxVUwgKQorI2RlZmluZSBwb3J0TVBVX1JFR0lPTl9QUklWSUxFR0VEX1JFQURfT05MWQkJCQkJKCAyVUwgPDwgMVVMICkKKyNkZWZpbmUgcG9ydE1QVV9SRUdJT05fUkVBRF9PTkxZCQkJCQkJCSggM1VMIDw8IDFVTCApCisKKyNkZWZpbmUgcG9ydE1QVV9SRUdJT05fRVhFQ1VURV9ORVZFUgkJCQkJCSggMVVMICkKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAqIEBicmllZiBTZXR0aW5ncyB0byBkZWZpbmUgYW4gTVBVIHJlZ2lvbi4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgTVBVUmVnaW9uU2V0dGluZ3MKK3sKKwl1aW50MzJfdCB1bFJCQVI7CS8qKjwgUkJBUiBmb3IgdGhlIHJlZ2lvbi4gKi8KKwl1aW50MzJfdCB1bFJMQVI7CS8qKjwgUkxBUiBmb3IgdGhlIHJlZ2lvbi4gKi8KK30gTVBVUmVnaW9uU2V0dGluZ3NfdDsKKworLyoqCisgKiBAYnJpZWYgTVBVIHNldHRpbmdzIGFzIHN0b3JlZCBpbiB0aGUgVENCLgorICovCit0eXBlZGVmIHN0cnVjdCBNUFVfU0VUVElOR1MKK3sKKwl1aW50MzJfdCB1bE1BSVIwOwkvKio8IE1BSVIwIGZvciB0aGUgdGFzayBjb250YWluaW5nIGF0dHJpYnV0ZXMgZm9yIGFsbCB0aGUgNCBwZXIgdGFzayByZWdpb25zLiAqLworCU1QVVJlZ2lvblNldHRpbmdzX3QgeFJlZ2lvbnNTZXR0aW5nc1sgcG9ydFRPVEFMX05VTV9SRUdJT05TIF07IC8qKjwgU2V0dGluZ3MgZm9yIDQgcGVyIHRhc2sgcmVnaW9ucy4gKi8KK30geE1QVV9TRVRUSU5HUzsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAqIEBicmllZiBTVkMgbnVtYmVycy4KKyAqLworI2RlZmluZSBwb3J0U1ZDX0FMTE9DQVRFX1NFQ1VSRV9DT05URVhUCQkJCQkJMAorI2RlZmluZSBwb3J0U1ZDX0ZSRUVfU0VDVVJFX0NPTlRFWFQJCQkJCQkJMQorI2RlZmluZSBwb3J0U1ZDX1NUQVJUX1NDSEVEVUxFUgkJCQkJCQkJMgorI2RlZmluZSBwb3J0U1ZDX1JBSVNFX1BSSVZJTEVHRQkJCQkJCQkJMworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKgorICogQGJyaWVmIFNjaGVkdWxlciB1dGlsaXRpZXMuCisgKi8KKyNkZWZpbmUgcG9ydFlJRUxEKCkJCQkJCQkJCQkJCXZQb3J0WWllbGQoKQorI2RlZmluZSBwb3J0TlZJQ19JTlRfQ1RSTF9SRUcJCQkJCQkJCSggKiAoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVkMDQgKSApCisjZGVmaW5lIHBvcnROVklDX1BFTkRTVlNFVF9CSVQJCQkJCQkJCSggMVVMIDw8IDI4VUwgKQorI2RlZmluZSBwb3J0RU5EX1NXSVRDSElOR19JU1IoIHhTd2l0Y2hSZXF1aXJlZCApCQkJaWYoIHhTd2l0Y2hSZXF1aXJlZCApIHBvcnROVklDX0lOVF9DVFJMX1JFRyA9IHBvcnROVklDX1BFTkRTVlNFVF9CSVQKKyNkZWZpbmUgcG9ydFlJRUxEX0ZST01fSVNSKCB4ICkJCQkJCQkJCXBvcnRFTkRfU1dJVENISU5HX0lTUiggeCApCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqCisgKiBAYnJpZWYgQ3JpdGljYWwgc2VjdGlvbiBtYW5hZ2VtZW50LgorICovCisjZGVmaW5lIHBvcnRTRVRfSU5URVJSVVBUX01BU0tfRlJPTV9JU1IoKQkJCQkJdWxTZXRJbnRlcnJ1cHRNYXNrRnJvbUlTUigpCisjZGVmaW5lIHBvcnRDTEVBUl9JTlRFUlJVUFRfTUFTS19GUk9NX0lTUih4KQkJCQl2Q2xlYXJJbnRlcnJ1cHRNYXNrRnJvbUlTUiggeCApCisjZGVmaW5lIHBvcnRESVNBQkxFX0lOVEVSUlVQVFMoKQkJCQkJCQlfX2FzbSB2b2xhdGlsZSAoICIgY3BzaWQgaSAiIDo6OiAibWVtb3J5IiApCisjZGVmaW5lIHBvcnRFTkFCTEVfSU5URVJSVVBUUygpCQkJCQkJCQlfX2FzbSB2b2xhdGlsZSAoICIgY3BzaWUgaSAiIDo6OiAibWVtb3J5IiApCisjZGVmaW5lIHBvcnRFTlRFUl9DUklUSUNBTCgpCQkJCQkJCQl2UG9ydEVudGVyQ3JpdGljYWwoKQorI2RlZmluZSBwb3J0RVhJVF9DUklUSUNBTCgpCQkJCQkJCQkJdlBvcnRFeGl0Q3JpdGljYWwoKQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKgorICogQGJyaWVmIFRhc2sgZnVuY3Rpb24gbWFjcm9zIGFzIGRlc2NyaWJlZCBvbiB0aGUgRnJlZVJUT1Mub3JnIFdFQiBzaXRlLgorICovCisjZGVmaW5lIHBvcnRUQVNLX0ZVTkNUSU9OX1BST1RPKCB2RnVuY3Rpb24sIHB2UGFyYW1ldGVycyApCXZvaWQgdkZ1bmN0aW9uKCB2b2lkICpwdlBhcmFtZXRlcnMgKQorI2RlZmluZSBwb3J0VEFTS19GVU5DVElPTiggdkZ1bmN0aW9uLCBwdlBhcmFtZXRlcnMgKQkJdm9pZCB2RnVuY3Rpb24oIHZvaWQgKnB2UGFyYW1ldGVycyApCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmKCBjb25maWdFTkFCTEVfVFJVU1RaT05FID09IDEgKQorCS8qKgorCSAqIEBicmllZiBBbGxvY2F0ZSBhIHNlY3VyZSBjb250ZXh0IGZvciB0aGUgdGFzay4KKwkgKgorCSAqIFRhc2tzIGFyZSBub3QgY3JlYXRlZCB3aXRoIGEgc2VjdXJlIGNvbnRleHQuIEFueSB0YXNrIHRoYXQgaXMgZ29pbmcgdG8gY2FsbAorCSAqIHNlY3VyZSBmdW5jdGlvbnMgbXVzdCBjYWxsIHBvcnRBTExPQ0FURV9TRUNVUkVfQ09OVEVYVCgpIHRvIGFsbG9jYXRlIGl0c2VsZiBhCisJICogc2VjdXJlIGNvbnRleHQgYmVmb3JlIGl0IGNhbGxzIGFueSBzZWN1cmUgZnVuY3Rpb24uCisJICoKKwkgKiBAcGFyYW1baW5dIHVsU2VjdXJlU3RhY2tTaXplIFRoZSBzaXplIG9mIHRoZSBzZWN1cmUgc3RhY2sgdG8gYmUgYWxsb2NhdGVkLgorCSAqLworCSNkZWZpbmUgcG9ydEFMTE9DQVRFX1NFQ1VSRV9DT05URVhUKCB1bFNlY3VyZVN0YWNrU2l6ZSApCXZQb3J0QWxsb2NhdGVTZWN1cmVDb250ZXh0KCB1bFNlY3VyZVN0YWNrU2l6ZSApCisKKwkvKioKKwkgKiBAYnJpZWYgQ2FsbGVkIHdoZW4gYSB0YXNrIGlzIGRlbGV0ZWQgdG8gZGVsZXRlIHRoZSB0YXNrJ3Mgc2VjdXJlIGNvbnRleHQsCisJICogaWYgaXQgaGFzIG9uZS4KKwkgKgorCSAqIEBwYXJhbVtpbl0gcHhUQ0IgVGhlIFRDQiBvZiB0aGUgdGFzayBiZWluZyBkZWxldGVkLgorCSAqLworCSNkZWZpbmUgcG9ydENMRUFOX1VQX1RDQiggcHhUQ0IgKQkJCQkJCQl2UG9ydEZyZWVTZWN1cmVDb250ZXh0KCAoIHVpbnQzMl90ICogKSBweFRDQiApCisjZWxzZQorCSNkZWZpbmUgcG9ydEFMTE9DQVRFX1NFQ1VSRV9DT05URVhUKCB1bFNlY3VyZVN0YWNrU2l6ZSApCisJI2RlZmluZSBwb3J0Q0xFQU5fVVBfVENCKCBweFRDQiApCisjZW5kaWYgLyogY29uZmlnRU5BQkxFX1RSVVNUWk9ORSAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiggY29uZmlnRU5BQkxFX01QVSA9PSAxICkKKwkvKioKKwkgKiBAYnJpZWYgQ2hlY2tzIHdoZXRoZXIgb3Igbm90IHRoZSBwcm9jZXNzb3IgaXMgcHJpdmlsZWdlZC4KKwkgKgorCSAqIEByZXR1cm4gMSBpZiB0aGUgcHJvY2Vzc29yIGlzIGFscmVhZHkgcHJpdmlsZWdlZCwgMCBvdGhlcndpc2UuCisJICovCisJI2RlZmluZSBwb3J0SVNfUFJJVklMRUdFRCgpCQkJCQkJCQkJeElzUHJpdmlsZWdlZCgpCisKKwkvKioKKwkgKiBAYnJpZWYgUmFpc2UgYW4gU1ZDIHJlcXVlc3QgdG8gcmFpc2UgcHJpdmlsZWdlLgorCSAqCisJICogVGhlIFNWQyBoYW5kbGVyIGNoZWNrcyB0aGF0IHRoZSBTVkMgd2FzIHJhaXNlZCBmcm9tIGEgc3lzdGVtIGNhbGwgYW5kIG9ubHkKKwkgKiB0aGVuIGl0IHJhaXNlcyB0aGUgcHJpdmlsZWdlLiBJZiB0aGlzIGlzIGNhbGxlZCBmcm9tIGFueSBvdGhlciBwbGFjZSwKKwkgKiB0aGUgcHJpdmlsZWdlIGlzIG5vdCByYWlzZWQuCisJICovCisJI2RlZmluZSBwb3J0UkFJU0VfUFJJVklMRUdFKCkJCQkJCQkJCV9fYXNtIHZvbGF0aWxlICggInN2YyAlMCBcbiIgOjogImkiICggcG9ydFNWQ19SQUlTRV9QUklWSUxFR0UgKSA6ICJtZW1vcnkiICk7CisKKwkvKioKKwkgKiBAYnJpZWYgTG93ZXJzIHRoZSBwcml2aWxlZ2UgbGV2ZWwgYnkgc2V0dGluZyB0aGUgYml0IDAgb2YgdGhlIENPTlRST0wKKwkgKiByZWdpc3Rlci4KKwkgKi8KKwkjZGVmaW5lIHBvcnRSRVNFVF9QUklWSUxFR0UoKQkJCQkJCQkJdlJlc2V0UHJpdmlsZWdlKCkKKyNlbHNlCisJI2RlZmluZSBwb3J0SVNfUFJJVklMRUdFRCgpCisJI2RlZmluZSBwb3J0UkFJU0VfUFJJVklMRUdFKCkKKwkjZGVmaW5lIHBvcnRSRVNFVF9QUklWSUxFR0UoKQorI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9NUFUgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAqIEBicmllZiBCYXJyaWVycy4KKyAqLworI2RlZmluZSBwb3J0TUVNT1JZX0JBUlJJRVIoKSBfX2FzbSB2b2xhdGlsZSggIiIgOjo6ICJtZW1vcnkiICkKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBTdXBwcmVzcyB3YXJuaW5ncyB0aGF0IGFyZSBnZW5lcmF0ZWQgYnkgdGhlIElBUiB0b29scywgYnV0IGNhbm5vdCBiZSBmaXhlZCBpbgorICogdGhlIHNvdXJjZSBjb2RlIGJlY2F1c2UgdG8gZG8gc28gd291bGQgY2F1c2Ugb3RoZXIgY29tcGlsZXJzIHRvIGdlbmVyYXRlCisgKiB3YXJuaW5ncy4gKi8KKyNwcmFnbWEgZGlhZ19zdXBwcmVzcz1CZTAwNgorI3ByYWdtYSBkaWFnX3N1cHByZXNzPVBhMDgyCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFBPUlRNQUNST19IICovCmRpZmYgLS1naXQgYS9Tb3VyY2UvcG9ydGFibGUvSUFSL0FSTV9DTTMvcG9ydC5jIGIvU291cmNlL3BvcnRhYmxlL0lBUi9BUk1fQ00zL3BvcnQuYwppbmRleCA3YmYzNjZlLi5mMTNhYTg0IDEwMDY0NAotLS0gYS9Tb3VyY2UvcG9ydGFibGUvSUFSL0FSTV9DTTMvcG9ydC5jCisrKyBiL1NvdXJjZS9wb3J0YWJsZS9JQVIvQVJNX0NNMy9wb3J0LmMKQEAgLTEsNiArMSw2IEBACiAvKgotICogRnJlZVJUT1MgS2VybmVsIFYxMC4wLjEKLSAqIENvcHlyaWdodCAoQykgMjAxNyBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMi4xCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgogICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgogICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KZGlmZiAtLWdpdCBhL1NvdXJjZS9wb3J0YWJsZS9JQVIvQVJNX0NNMy9wb3J0YXNtLnMgYi9Tb3VyY2UvcG9ydGFibGUvSUFSL0FSTV9DTTMvcG9ydGFzbS5zCmluZGV4IGNmMmUxM2UuLmZiYzI3OGEgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9wb3J0YWJsZS9JQVIvQVJNX0NNMy9wb3J0YXNtLnMKKysrIGIvU291cmNlL3BvcnRhYmxlL0lBUi9BUk1fQ00zL3BvcnRhc20ucwpAQCAtMSw2ICsxLDYgQEAKIC8qCi0gKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjAuMQotICogQ29weXJpZ2h0IChDKSAyMDE3IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRnJlZVJUT1MgS2VybmVsIFYxMC4yLjEKKyAqIENvcHlyaWdodCAoQykgMjAxOSBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCiAgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCiAgKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgpkaWZmIC0tZ2l0IGEvU291cmNlL3BvcnRhYmxlL0lBUi9BUk1fQ00zL3BvcnRtYWNyby5oIGIvU291cmNlL3BvcnRhYmxlL0lBUi9BUk1fQ00zL3BvcnRtYWNyby5oCmluZGV4IDdmYzU5YzIuLjFkNjkwNjkgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9wb3J0YWJsZS9JQVIvQVJNX0NNMy9wb3J0bWFjcm8uaAorKysgYi9Tb3VyY2UvcG9ydGFibGUvSUFSL0FSTV9DTTMvcG9ydG1hY3JvLmgKQEAgLTEsNiArMSw2IEBACiAvKgotICogRnJlZVJUT1MgS2VybmVsIFYxMC4wLjEKLSAqIENvcHlyaWdodCAoQykgMjAxNyBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMi4xCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgogICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgogICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KQEAgLTc4LDYgKzc4LDEyIEBACiAjZGVmaW5lIHBvcnRCWVRFX0FMSUdOTUVOVAkJCTgKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCisvKiBDb21waWxlciBkaXJlY3RpdmVzLiAqLworI2RlZmluZSBwb3J0V0VBS19TWU1CT0wJCQkJX19hdHRyaWJ1dGVfXyggKCB3ZWFrICkgKQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCiAvKiBTY2hlZHVsZXIgdXRpbGl0aWVzLiAqLwogI2RlZmluZSBwb3J0WUlFTEQoKQkJCQkJCQkJCQkJXAogewkJCQkJCQkJCQkJCQkJCVwKZGlmZiAtLWdpdCBhL1NvdXJjZS9wb3J0YWJsZS9JQVIvQVJNX0NNMzMvbm9uX3NlY3VyZS9wb3J0LmMgYi9Tb3VyY2UvcG9ydGFibGUvSUFSL0FSTV9DTTMzL25vbl9zZWN1cmUvcG9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkODVhNmYKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvcG9ydGFibGUvSUFSL0FSTV9DTTMzL25vbl9zZWN1cmUvcG9ydC5jCkBAIC0wLDAgKzEsODk5IEBACisvKgorICogRnJlZVJUT1MgS2VybmVsIFYxMC4yLjEKKyAqIENvcHlyaWdodCAoQykgMjAxOSBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCisgKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgorICogdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bworICogdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YKKyAqIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKKyAqIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAorICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MKKyAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUgorICogQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSCisgKiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBodHRwOi8vd3d3LkZyZWVSVE9TLm9yZworICogaHR0cDovL2F3cy5hbWF6b24uY29tL2ZyZWVydG9zCisgKgorICogMSB0YWIgPT0gNCBzcGFjZXMhCisgKi8KKworLyogRGVmaW5pbmcgTVBVX1dSQVBQRVJTX0lOQ0xVREVEX0ZST01fQVBJX0ZJTEUgcHJldmVudHMgdGFzay5oIGZyb20gcmVkZWZpbmluZworICogYWxsIHRoZSBBUEkgZnVuY3Rpb25zIHRvIHVzZSB0aGUgTVBVIHdyYXBwZXJzLiBUaGF0IHNob3VsZCBvbmx5IGJlIGRvbmUgd2hlbgorICogdGFzay5oIGlzIGluY2x1ZGVkIGZyb20gYW4gYXBwbGljYXRpb24gZmlsZS4gKi8KKyNkZWZpbmUgTVBVX1dSQVBQRVJTX0lOQ0xVREVEX0ZST01fQVBJX0ZJTEUKKworLyogU2NoZWR1bGVyIGluY2x1ZGVzLiAqLworI2luY2x1ZGUgIkZyZWVSVE9TLmgiCisjaW5jbHVkZSAidGFzay5oIgorCisvKiBNUFUgd3JhcHBlcnMgaW5jbHVkZXMuICovCisjaW5jbHVkZSAibXB1X3dyYXBwZXJzLmgiCisKKy8qIFBvcnRhc20gaW5jbHVkZXMuICovCisjaW5jbHVkZSAicG9ydGFzbS5oIgorCisjaWYoIGNvbmZpZ0VOQUJMRV9UUlVTVFpPTkUgPT0gMSApCisJLyogU2VjdXJlIGNvbXBvbmVudHMgaW5jbHVkZXMuICovCisJI2luY2x1ZGUgInNlY3VyZV9jb250ZXh0LmgiCisJI2luY2x1ZGUgInNlY3VyZV9pbml0LmgiCisjZW5kaWYgLyogY29uZmlnRU5BQkxFX1RSVVNUWk9ORSAqLworCisjdW5kZWYgTVBVX1dSQVBQRVJTX0lOQ0xVREVEX0ZST01fQVBJX0ZJTEUKKworLyoqCisgKiBUaGUgRnJlZVJUT1MgQ29ydGV4IE0zMyBwb3J0IGNhbiBiZSBjb25maWd1cmVkIHRvIHJ1biBvbiB0aGUgU2VjdXJlIFNpZGUgb25seQorICogaS5lLiB0aGUgcHJvY2Vzc29yIGJvb3RzIGFzIHNlY3VyZSBhbmQgbmV2ZXIganVtcHMgdG8gdGhlIG5vbi1zZWN1cmUgc2lkZS4KKyAqIFRoZSBUcnVzdCBab25lIHN1cHBvcnQgaW4gdGhlIHBvcnQgbXVzdCBiZSBkaXNhYmxlZCBpbiBvcmRlciB0byBydW4gRnJlZVJUT1MKKyAqIG9uIHRoZSBzZWN1cmUgc2lkZS4gVGhlIGZvbGxvd2luZyBhcmUgdGhlIHZhbGlkIGNvbmZpZ3VyYXRpb24gc2VldGluZ3M6CisgKgorICogMS4gUnVuIEZyZWVSVE9TIG9uIHRoZSBTZWN1cmUgU2lkZToKKyAqCQljb25maWdSVU5fRlJFRVJUT1NfU0VDVVJFX09OTFkgPSAxIGFuZCBjb25maWdFTkFCTEVfVFJVU1RaT05FID0gMAorICoKKyAqIDIuIFJ1biBGcmVlUlRPUyBvbiB0aGUgTm9uLVNlY3VyZSBTaWRlIHdpdGggU2VjdXJlIFNpZGUgZnVuY3Rpb24gY2FsbCBzdXBwb3J0OgorICoJCWNvbmZpZ1JVTl9GUkVFUlRPU19TRUNVUkVfT05MWSA9IDAgYW5kIGNvbmZpZ0VOQUJMRV9UUlVTVFpPTkUgPSAxCisgKgorICogMy4gUnVuIEZyZWVSVE9TIG9uIHRoZSBOb24tU2VjdXJlIFNpZGUgb25seSBpLmUuIG5vIFNlY3VyZSBTaWRlIGZ1bmN0aW9uIGNhbGwgc3VwcG9ydDoKKyAqCQljb25maWdSVU5fRlJFRVJUT1NfU0VDVVJFX09OTFkgPSAwIGFuZCBjb25maWdFTkFCTEVfVFJVU1RaT05FID0gMAorICovCisjaWYoICggY29uZmlnUlVOX0ZSRUVSVE9TX1NFQ1VSRV9PTkxZID09IDEgKSAmJiAoIGNvbmZpZ0VOQUJMRV9UUlVTVFpPTkUgPT0gMSApICkKKwkjZXJyb3IgVHJ1c3Rab25lIG5lZWRzIHRvIGJlIGRpc2FibGVkIGluIG9yZGVyIHRvIHJ1biBGcmVlUlRPUyBvbiB0aGUgU2VjdXJlIFNpZGUuCisjZW5kaWYKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAqIEBicmllZiBDb25zdGFudHMgcmVxdWlyZWQgdG8gbWFuaXB1bGF0ZSB0aGUgTlZJQy4KKyAqLworI2RlZmluZSBwb3J0TlZJQ19TWVNUSUNLX0NUUkwJCQkJKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlMDEwICkKKyNkZWZpbmUgcG9ydE5WSUNfU1lTVElDS19MT0FECQkJCSggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZTAxNCApCisjZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfQ1VSUkVOVF9WQUxVRQkJKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlMDE4ICkKKyNkZWZpbmUgcG9ydE5WSUNfSU5UX0NUUkwJCQkJCSggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZWQwNCApCisjZGVmaW5lIHBvcnROVklDX1NZU1BSSTIJCQkJCSggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZWQyMCApCisjZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfQ0xLCQkJCSggMHgwMDAwMDAwNCApCisjZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfSU5UCQkJCSggMHgwMDAwMDAwMiApCisjZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfRU5BQkxFCQkJCSggMHgwMDAwMDAwMSApCisjZGVmaW5lIHBvcnROVklDX1BFTkRTVlNFVAkJCQkJKCAweDEwMDAwMDAwICkKKyNkZWZpbmUgcG9ydE1JTl9JTlRFUlJVUFRfUFJJT1JJVFkJCQkoIDI1NVVMICkKKyNkZWZpbmUgcG9ydE5WSUNfUEVORFNWX1BSSQkJCQkJKCBwb3J0TUlOX0lOVEVSUlVQVF9QUklPUklUWSA8PCAxNlVMICkKKyNkZWZpbmUgcG9ydE5WSUNfU1lTVElDS19QUkkJCQkJKCBwb3J0TUlOX0lOVEVSUlVQVF9QUklPUklUWSA8PCAyNFVMICkKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAqIEBicmllZiBDb25zdGFudHMgcmVxdWlyZWQgdG8gbWFuaXB1bGF0ZSB0aGUgU0NCLgorICovCisjZGVmaW5lIHBvcnRTQ0JfU1lTX0hBTkRMRVJfQ1RSTF9TVEFURV9SRUcJKCAqICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVkMjQgKQorI2RlZmluZSBwb3J0U0NCX01FTV9GQVVMVF9FTkFCTEUJCQkoIDFVTCA8PCAxNlVMICkKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAqIEBicmllZiBDb25zdGFudHMgcmVxdWlyZWQgdG8gbWFuaXB1bGF0ZSB0aGUgRlBVLgorICovCisjZGVmaW5lIHBvcnRDUEFDUgkJCQkJCQkoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVkODggKQkvKiBDb3Byb2Nlc3NvciBBY2Nlc3MgQ29udHJvbCBSZWdpc3Rlci4gKi8KKyNkZWZpbmUgcG9ydENQQUNSX0NQMTBfVkFMVUUJCQkJKCAzVUwgKQorI2RlZmluZSBwb3J0Q1BBQ1JfQ1AxMV9WQUxVRQkJCQlwb3J0Q1BBQ1JfQ1AxMF9WQUxVRQorI2RlZmluZSBwb3J0Q1BBQ1JfQ1AxMF9QT1MJCQkJCSggMjBVTCApCisjZGVmaW5lIHBvcnRDUEFDUl9DUDExX1BPUwkJCQkJKCAyMlVMICkKKworI2RlZmluZSBwb3J0RlBDQ1IJCQkJCQkJKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZjM0ICkJLyogRmxvYXRpbmcgUG9pbnQgQ29udGV4dCBDb250cm9sIFJlZ2lzdGVyLiAqLworI2RlZmluZSBwb3J0RlBDQ1JfQVNQRU5fUE9TCQkJCQkoIDMxVUwgKQorI2RlZmluZSBwb3J0RlBDQ1JfQVNQRU5fTUFTSwkJCQkoIDFVTCA8PCBwb3J0RlBDQ1JfQVNQRU5fUE9TICkKKyNkZWZpbmUgcG9ydEZQQ0NSX0xTUEVOX1BPUwkJCQkJKCAzMFVMICkKKyNkZWZpbmUgcG9ydEZQQ0NSX0xTUEVOX01BU0sJCQkJKCAxVUwgPDwgcG9ydEZQQ0NSX0xTUEVOX1BPUyApCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqCisgKiBAYnJpZWYgQ29uc3RhbnRzIHJlcXVpcmVkIHRvIG1hbmlwdWxhdGUgdGhlIE1QVS4KKyAqLworI2RlZmluZSBwb3J0TVBVX1RZUEVfUkVHCQkJCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZDkwICkgKQorI2RlZmluZSBwb3J0TVBVX0NUUkxfUkVHCQkJCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZDk0ICkgKQorI2RlZmluZSBwb3J0TVBVX1JOUl9SRUcJCQkJCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZDk4ICkgKQorCisjZGVmaW5lIHBvcnRNUFVfUkJBUl9SRUcJCQkJCSggKiAoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVkOWMgKSApCisjZGVmaW5lIHBvcnRNUFVfUkxBUl9SRUcJCQkJCSggKiAoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVkYTAgKSApCisKKyNkZWZpbmUgcG9ydE1QVV9SQkFSX0ExX1JFRwkJCQkJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZWRhNCApICkKKyNkZWZpbmUgcG9ydE1QVV9STEFSX0ExX1JFRwkJCQkJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZWRhOCApICkKKworI2RlZmluZSBwb3J0TVBVX1JCQVJfQTJfUkVHCQkJCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZGFjICkgKQorI2RlZmluZSBwb3J0TVBVX1JMQVJfQTJfUkVHCQkJCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZGIwICkgKQorCisjZGVmaW5lIHBvcnRNUFVfUkJBUl9BM19SRUcJCQkJCSggKiAoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVkYjQgKSApCisjZGVmaW5lIHBvcnRNUFVfUkxBUl9BM19SRUcJCQkJCSggKiAoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVkYjggKSApCisKKyNkZWZpbmUgcG9ydE1QVV9NQUlSMF9SRUcJCQkJCSggKiAoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVkYzAgKSApCisjZGVmaW5lIHBvcnRNUFVfTUFJUjFfUkVHCQkJCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZGM0ICkgKQorCisjZGVmaW5lIHBvcnRNUFVfUkJBUl9BRERSRVNTX01BU0sJCQkoIDB4ZmZmZmZmZTAgKSAvKiBNdXN0IGJlIDMyLWJ5dGUgYWxpZ25lZC4gKi8KKyNkZWZpbmUgcG9ydE1QVV9STEFSX0FERFJFU1NfTUFTSwkJCSggMHhmZmZmZmZlMCApIC8qIE11c3QgYmUgMzItYnl0ZSBhbGlnbmVkLiAqLworCisjZGVmaW5lIHBvcnRNUFVfTUFJUl9BVFRSMF9QT1MJCQkJKCAwVUwgKQorI2RlZmluZSBwb3J0TVBVX01BSVJfQVRUUjBfTUFTSwkJCQkoIDB4MDAwMDAwZmYgKQorCisjZGVmaW5lIHBvcnRNUFVfTUFJUl9BVFRSMV9QT1MJCQkJKCA4VUwgKQorI2RlZmluZSBwb3J0TVBVX01BSVJfQVRUUjFfTUFTSwkJCQkoIDB4MDAwMGZmMDAgKQorCisjZGVmaW5lIHBvcnRNUFVfTUFJUl9BVFRSMl9QT1MJCQkJKCAxNlVMICkKKyNkZWZpbmUgcG9ydE1QVV9NQUlSX0FUVFIyX01BU0sJCQkJKCAweDAwZmYwMDAwICkKKworI2RlZmluZSBwb3J0TVBVX01BSVJfQVRUUjNfUE9TCQkJCSggMjRVTCApCisjZGVmaW5lIHBvcnRNUFVfTUFJUl9BVFRSM19NQVNLCQkJCSggMHhmZjAwMDAwMCApCisKKyNkZWZpbmUgcG9ydE1QVV9NQUlSX0FUVFI0X1BPUwkJCQkoIDBVTCApCisjZGVmaW5lIHBvcnRNUFVfTUFJUl9BVFRSNF9NQVNLCQkJCSggMHgwMDAwMDBmZiApCisKKyNkZWZpbmUgcG9ydE1QVV9NQUlSX0FUVFI1X1BPUwkJCQkoIDhVTCApCisjZGVmaW5lIHBvcnRNUFVfTUFJUl9BVFRSNV9NQVNLCQkJCSggMHgwMDAwZmYwMCApCisKKyNkZWZpbmUgcG9ydE1QVV9NQUlSX0FUVFI2X1BPUwkJCQkoIDE2VUwgKQorI2RlZmluZSBwb3J0TVBVX01BSVJfQVRUUjZfTUFTSwkJCQkoIDB4MDBmZjAwMDAgKQorCisjZGVmaW5lIHBvcnRNUFVfTUFJUl9BVFRSN19QT1MJCQkJKCAyNFVMICkKKyNkZWZpbmUgcG9ydE1QVV9NQUlSX0FUVFI3X01BU0sJCQkJKCAweGZmMDAwMDAwICkKKworI2RlZmluZSBwb3J0TVBVX1JMQVJfQVRUUl9JTkRFWDAJCQkoIDBVTCA8PCAxVUwgKQorI2RlZmluZSBwb3J0TVBVX1JMQVJfQVRUUl9JTkRFWDEJCQkoIDFVTCA8PCAxVUwgKQorI2RlZmluZSBwb3J0TVBVX1JMQVJfQVRUUl9JTkRFWDIJCQkoIDJVTCA8PCAxVUwgKQorI2RlZmluZSBwb3J0TVBVX1JMQVJfQVRUUl9JTkRFWDMJCQkoIDNVTCA8PCAxVUwgKQorI2RlZmluZSBwb3J0TVBVX1JMQVJfQVRUUl9JTkRFWDQJCQkoIDRVTCA8PCAxVUwgKQorI2RlZmluZSBwb3J0TVBVX1JMQVJfQVRUUl9JTkRFWDUJCQkoIDVVTCA8PCAxVUwgKQorI2RlZmluZSBwb3J0TVBVX1JMQVJfQVRUUl9JTkRFWDYJCQkoIDZVTCA8PCAxVUwgKQorI2RlZmluZSBwb3J0TVBVX1JMQVJfQVRUUl9JTkRFWDcJCQkoIDdVTCA8PCAxVUwgKQorCisjZGVmaW5lIHBvcnRNUFVfUkxBUl9SRUdJT05fRU5BQkxFCQkJKCAxVUwgKQorCisvKiBFbmFibGUgcHJpdmlsZWdlZCBhY2Nlc3MgdG8gdW5tYXBwZWQgcmVnaW9uLiAqLworI2RlZmluZSBwb3J0TVBVX1BSSVZfQkFDS0dST1VORF9FTkFCTEUJCSggMVVMIDw8IDJVTCApCisKKy8qIEVuYWJsZSBNUFUuICovCisjZGVmaW5lIHBvcnRNUFVfRU5BQkxFCQkJCQkJKCAxVUwgPDwgMFVMICkKKworLyogRXhwZWN0ZWQgdmFsdWUgb2YgdGhlIHBvcnRNUFVfVFlQRSByZWdpc3Rlci4gKi8KKyNkZWZpbmUgcG9ydEVYUEVDVEVEX01QVV9UWVBFX1ZBTFVFCQkJKCA4VUwgPDwgOFVMICkgLyogOCByZWdpb25zLCB1bmlmaWVkLiAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKgorICogQGJyaWVmIENvbnN0YW50cyByZXF1aXJlZCB0byBzZXQgdXAgdGhlIGluaXRpYWwgc3RhY2suCisgKi8KKyNkZWZpbmUgcG9ydElOSVRJQUxfWFBTUgkJCQkJKCAweDAxMDAwMDAwICkKKworI2lmKCBjb25maWdSVU5fRlJFRVJUT1NfU0VDVVJFX09OTFkgPT0gMSApCisJLyoqCisJICogQGJyaWVmIEluaXRpYWwgRVhDX1JFVFVSTiB2YWx1ZS4KKwkgKgorCSAqICAgICBGRiAgICAgICAgIEZGICAgICAgICAgRkYgICAgICAgICBGRAorCSAqIDExMTEgMTExMSAgMTExMSAxMTExICAxMTExIDExMTEgIDExMTEgMTEwMQorCSAqCisJICogQml0WzZdIC0gMSAtLT4gVGhlIGV4Y2VwdGlvbiB3YXMgdGFrZW4gZnJvbSB0aGUgU2VjdXJlIHN0YXRlLgorCSAqIEJpdFs1XSAtIDEgLS0+IERvIG5vdCBza2lwIHN0YWNraW5nIG9mIGFkZGl0aW9uYWwgc3RhdGUgY29udGV4dC4KKwkgKiBCaXRbNF0gLSAxIC0tPiBUaGUgUEUgZGlkIG5vdCBhbGxvY2F0ZSBzcGFjZSBvbiB0aGUgc3RhY2sgZm9yIEZQIGNvbnRleHQuCisJICogQml0WzNdIC0gMSAtLT4gUmV0dXJuIHRvIHRoZSBUaHJlYWQgbW9kZS4KKwkgKiBCaXRbMl0gLSAxIC0tPiBSZXN0b3JlIHJlZ2lzdGVycyBmcm9tIHRoZSBwcm9jZXNzIHN0YWNrLgorCSAqIEJpdFsxXSAtIDAgLS0+IFJlc2VydmVkLCAwLgorCSAqIEJpdFswXSAtIDEgLS0+IFRoZSBleGNlcHRpb24gd2FzIHRha2VuIHRvIHRoZSBTZWN1cmUgc3RhdGUuCisJICovCisJI2RlZmluZSBwb3J0SU5JVElBTF9FWENfUkVUVVJOCQkJKCAweGZmZmZmZmZkICkKKyNlbHNlCisJLyoqCisJICogQGJyaWVmIEluaXRpYWwgRVhDX1JFVFVSTiB2YWx1ZS4KKwkgKgorCSAqICAgICBGRiAgICAgICAgIEZGICAgICAgICAgRkYgICAgICAgICBCQworCSAqIDExMTEgMTExMSAgMTExMSAxMTExICAxMTExIDExMTEgIDEwMTEgMTEwMAorCSAqCisJICogQml0WzZdIC0gMCAtLT4gVGhlIGV4Y2VwdGlvbiB3YXMgdGFrZW4gZnJvbSB0aGUgTm9uLVNlY3VyZSBzdGF0ZS4KKwkgKiBCaXRbNV0gLSAxIC0tPiBEbyBub3Qgc2tpcCBzdGFja2luZyBvZiBhZGRpdGlvbmFsIHN0YXRlIGNvbnRleHQuCisJICogQml0WzRdIC0gMSAtLT4gVGhlIFBFIGRpZCBub3QgYWxsb2NhdGUgc3BhY2Ugb24gdGhlIHN0YWNrIGZvciBGUCBjb250ZXh0LgorCSAqIEJpdFszXSAtIDEgLS0+IFJldHVybiB0byB0aGUgVGhyZWFkIG1vZGUuCisJICogQml0WzJdIC0gMSAtLT4gUmVzdG9yZSByZWdpc3RlcnMgZnJvbSB0aGUgcHJvY2VzcyBzdGFjay4KKwkgKiBCaXRbMV0gLSAwIC0tPiBSZXNlcnZlZCwgMC4KKwkgKiBCaXRbMF0gLSAwIC0tPiBUaGUgZXhjZXB0aW9uIHdhcyB0YWtlbiB0byB0aGUgTm9uLVNlY3VyZSBzdGF0ZS4KKwkgKi8KKwkjZGVmaW5lIHBvcnRJTklUSUFMX0VYQ19SRVRVUk4JCQkoIDB4ZmZmZmZmYmMgKQorI2VuZGlmIC8qIGNvbmZpZ1JVTl9GUkVFUlRPU19TRUNVUkVfT05MWSAqLworCisvKioKKyAqIEBicmllZiBDT05UUk9MIHJlZ2lzdGVyIHByaXZpbGVnZWQgYml0IG1hc2suCisgKgorICogQml0WzBdIGluIENPTlRST0wgcmVnaXN0ZXIgdGVsbHMgdGhlIHByaXZpbGVnZToKKyAqICBCaXRbMF0gPSAwID09PiBUaGUgdGFzayBpcyBwcml2aWxlZ2VkLgorICogIEJpdFswXSA9IDEgPT0+IFRoZSB0YXNrIGlzIG5vdCBwcml2aWxlZ2VkLgorICovCisjZGVmaW5lIHBvcnRDT05UUk9MX1BSSVZJTEVHRURfTUFTSwkJCSggMVVMIDw8IDBVTCApCisKKy8qKgorICogQGJyaWVmIEluaXRpYWwgQ09OVFJPTCByZWdpc3RlciB2YWx1ZXMuCisgKi8KKyNkZWZpbmUgcG9ydElOSVRJQUxfQ09OVFJPTF9VTlBSSVZJTEVHRUQJKCAweDMgKQorI2RlZmluZSBwb3J0SU5JVElBTF9DT05UUk9MX1BSSVZJTEVHRUQJCSggMHgyICkKKworLyoqCisgKiBAYnJpZWYgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSBwcmUtbG9hZGluZyBvZiB0aGUgaW5pdGlhbCBMUiB3aXRoIHRoZQorICogYWRkcmVzcyBvZiBwcnZUYXNrRXhpdEVycm9yKCkgaW4gY2FzZSBpdCBtZXNzZXMgdXAgdW53aW5kaW5nIG9mIHRoZSBzdGFjaworICogaW4gdGhlIGRlYnVnZ2VyLgorICovCisjaWZkZWYgY29uZmlnVEFTS19SRVRVUk5fQUREUkVTUworCSNkZWZpbmUgcG9ydFRBU0tfUkVUVVJOX0FERFJFU1MJCQljb25maWdUQVNLX1JFVFVSTl9BRERSRVNTCisjZWxzZQorCSNkZWZpbmUgcG9ydFRBU0tfUkVUVVJOX0FERFJFU1MJCQlwcnZUYXNrRXhpdEVycm9yCisjZW5kaWYKKworLyoqCisgKiBAYnJpZWYgSWYgcG9ydFBSRUxPQURfUkVHSVNURVJTIHRoZW4gcmVnaXN0ZXJzIHdpbGwgYmUgZ2l2ZW4gYW4gaW5pdGlhbCB2YWx1ZQorICogd2hlbiBhIHRhc2sgaXMgY3JlYXRlZC4gVGhpcyBoZWxwcyBpbiBkZWJ1Z2dpbmcgYXQgdGhlIGNvc3Qgb2YgY29kZSBzaXplLgorICovCisjZGVmaW5lIHBvcnRQUkVMT0FEX1JFR0lTVEVSUwkJCQkxCisKKy8qKgorICogQGJyaWVmIEEgdGFzayBpcyBjcmVhdGVkIHdpdGhvdXQgYSBzZWN1cmUgY29udGV4dCwgYW5kIG11c3QgY2FsbAorICogcG9ydEFMTE9DQVRFX1NFQ1VSRV9DT05URVhUKCkgdG8gZ2l2ZSBpdHNlbGYgYSBzZWN1cmUgY29udGV4dCBiZWZvcmUgaXQgbWFrZXMKKyAqIGFueSBzZWN1cmUgY2FsbHMuCisgKi8KKyNkZWZpbmUgcG9ydE5PX1NFQ1VSRV9DT05URVhUCQkJCTAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAqIEBicmllZiBTZXR1cCB0aGUgdGltZXIgdG8gZ2VuZXJhdGUgdGhlIHRpY2sgaW50ZXJydXB0cy4KKyAqLworc3RhdGljIHZvaWQgcHJ2U2V0dXBUaW1lckludGVycnVwdCggdm9pZCApIFBSSVZJTEVHRURfRlVOQ1RJT047CisKKy8qKgorICogQGJyaWVmIFVzZWQgdG8gY2F0Y2ggdGFza3MgdGhhdCBhdHRlbXB0IHRvIHJldHVybiBmcm9tIHRoZWlyIGltcGxlbWVudGluZworICogZnVuY3Rpb24uCisgKi8KK3N0YXRpYyB2b2lkIHBydlRhc2tFeGl0RXJyb3IoIHZvaWQgKTsKKworI2lmKCBjb25maWdFTkFCTEVfTVBVID09IDEgKQorCS8qKgorCSAqIEBicmllZiBTZXR1cCB0aGUgTWVtb3J5IFByb3RlY3Rpb24gVW5pdCAoTVBVKS4KKwkgKi8KKwlzdGF0aWMgdm9pZCBwcnZTZXR1cE1QVSggdm9pZCApIFBSSVZJTEVHRURfRlVOQ1RJT047CisjZW5kaWYgLyogY29uZmlnRU5BQkxFX01QVSAqLworCisjaWYoIGNvbmZpZ0VOQUJMRV9GUFUgPT0gMSApCisJLyoqCisJICogQGJyaWVmIFNldHVwIHRoZSBGbG9hdGluZyBQb2ludCBVbml0IChGUFUpLgorCSAqLworCXN0YXRpYyB2b2lkIHBydlNldHVwRlBVKCB2b2lkICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKyNlbmRpZiAvKiBjb25maWdFTkFCTEVfRlBVICovCisKKy8qKgorICogQGJyaWVmIFlpZWxkIHRoZSBwcm9jZXNzb3IuCisgKi8KK3ZvaWQgdlBvcnRZaWVsZCggdm9pZCApIFBSSVZJTEVHRURfRlVOQ1RJT047CisKKy8qKgorICogQGJyaWVmIEVudGVyIGNyaXRpY2FsIHNlY3Rpb24uCisgKi8KK3ZvaWQgdlBvcnRFbnRlckNyaXRpY2FsKCB2b2lkICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworLyoqCisgKiBAYnJpZWYgRXhpdCBmcm9tIGNyaXRpY2FsIHNlY3Rpb24uCisgKi8KK3ZvaWQgdlBvcnRFeGl0Q3JpdGljYWwoIHZvaWQgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisvKioKKyAqIEBicmllZiBTeXNUaWNrIGhhbmRsZXIuCisgKi8KK3ZvaWQgU3lzVGlja19IYW5kbGVyKCB2b2lkICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworLyoqCisgKiBAYnJpZWYgQyBwYXJ0IG9mIFNWQyBoYW5kbGVyLgorICovCitwb3J0RE9OVF9ESVNDQVJEIHZvaWQgdlBvcnRTVkNIYW5kbGVyX0MoIHVpbnQzMl90ICpwdWxDYWxsZXJTdGFja0FkZHJlc3MgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKgorICogQGJyaWVmIEVhY2ggdGFzayBtYWludGFpbnMgaXRzIG93biBpbnRlcnJ1cHQgc3RhdHVzIGluIHRoZSBjcml0aWNhbCBuZXN0aW5nCisgKiB2YXJpYWJsZS4KKyAqLworc3RhdGljIHZvbGF0aWxlIHVpbnQzMl90IHVsQ3JpdGljYWxOZXN0aW5nID0gMHhhYWFhYWFhYVVMOworCisjaWYoIGNvbmZpZ0VOQUJMRV9UUlVTVFpPTkUgPT0gMSApCisJLyoqCisJICogQGJyaWVmIFNhdmVkIGFzIHBhcnQgb2YgdGhlIHRhc2sgY29udGV4dCB0byBpbmRpY2F0ZSB3aGljaCBjb250ZXh0IHRoZQorCSAqIHRhc2sgaXMgdXNpbmcgb24gdGhlIHNlY3VyZSBzaWRlLgorCSAqLworCXBvcnRET05UX0RJU0NBUkQgdm9sYXRpbGUgU2VjdXJlQ29udGV4dEhhbmRsZV90IHhTZWN1cmVDb250ZXh0ID0gcG9ydE5PX1NFQ1VSRV9DT05URVhUOworI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9UUlVTVFpPTkUgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdm9pZCBwcnZTZXR1cFRpbWVySW50ZXJydXB0KCB2b2lkICkgLyogUFJJVklMRUdFRF9GVU5DVElPTiAqLworeworCS8qIFN0b3AgYW5kIHJlc2V0IHRoZSBTeXNUaWNrLiAqLworCSooIHBvcnROVklDX1NZU1RJQ0tfQ1RSTCApID0gMFVMOworCSooIHBvcnROVklDX1NZU1RJQ0tfQ1VSUkVOVF9WQUxVRSApID0gMFVMOworCisJLyogQ29uZmlndXJlIFN5c1RpY2sgdG8gaW50ZXJydXB0IGF0IHRoZSByZXF1ZXN0ZWQgcmF0ZS4gKi8KKwkqKCBwb3J0TlZJQ19TWVNUSUNLX0xPQUQgKSA9ICggY29uZmlnQ1BVX0NMT0NLX0haIC8gY29uZmlnVElDS19SQVRFX0haICkgLSAxVUw7CisJKiggcG9ydE5WSUNfU1lTVElDS19DVFJMICkgPSBwb3J0TlZJQ19TWVNUSUNLX0NMSyB8IHBvcnROVklDX1NZU1RJQ0tfSU5UIHwgcG9ydE5WSUNfU1lTVElDS19FTkFCTEU7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHZvaWQgcHJ2VGFza0V4aXRFcnJvciggdm9pZCApCit7Cit2b2xhdGlsZSB1aW50MzJfdCB1bER1bW15ID0gMFVMOworCisJLyogQSBmdW5jdGlvbiB0aGF0IGltcGxlbWVudHMgYSB0YXNrIG11c3Qgbm90IGV4aXQgb3IgYXR0ZW1wdCB0byByZXR1cm4gdG8KKwkgKiBpdHMgY2FsbGVyIGFzIHRoZXJlIGlzIG5vdGhpbmcgdG8gcmV0dXJuIHRvLiBJZiBhIHRhc2sgd2FudHMgdG8gZXhpdCBpdAorCSAqIHNob3VsZCBpbnN0ZWFkIGNhbGwgdlRhc2tEZWxldGUoIE5VTEwgKS4gQXJ0aWZpY2lhbGx5IGZvcmNlIGFuIGFzc2VydCgpCisJICogdG8gYmUgdHJpZ2dlcmVkIGlmIGNvbmZpZ0FTU0VSVCgpIGlzIGRlZmluZWQsIHRoZW4gc3RvcCBoZXJlIHNvCisJICogYXBwbGljYXRpb24gd3JpdGVycyBjYW4gY2F0Y2ggdGhlIGVycm9yLiAqLworCWNvbmZpZ0FTU0VSVCggdWxDcml0aWNhbE5lc3RpbmcgPT0gfjBVTCApOworCXBvcnRESVNBQkxFX0lOVEVSUlVQVFMoKTsKKworCXdoaWxlKCB1bER1bW15ID09IDAgKQorCXsKKwkJLyogVGhpcyBmaWxlIGNhbGxzIHBydlRhc2tFeGl0RXJyb3IoKSBhZnRlciB0aGUgc2NoZWR1bGVyIGhhcyBiZWVuCisJCSAqIHN0YXJ0ZWQgdG8gcmVtb3ZlIGEgY29tcGlsZXIgd2FybmluZyBhYm91dCB0aGUgZnVuY3Rpb24gYmVpbmcKKwkJICogZGVmaW5lZCBidXQgbmV2ZXIgY2FsbGVkLiAgdWxEdW1teSBpcyB1c2VkIHB1cmVseSB0byBxdWlldGVuIG90aGVyCisJCSAqIHdhcm5pbmdzIGFib3V0IGNvZGUgYXBwZWFyaW5nIGFmdGVyIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIC0gbWFraW5nCisJCSAqIHVsRHVtbXkgdm9sYXRpbGUgbWFrZXMgdGhlIGNvbXBpbGVyIHRoaW5rIHRoZSBmdW5jdGlvbiBjb3VsZCByZXR1cm4KKwkJICogYW5kIHRoZXJlZm9yZSBub3Qgb3V0cHV0IGFuICd1bnJlYWNoYWJsZSBjb2RlJyB3YXJuaW5nIGZvciBjb2RlIHRoYXQKKwkJICogYXBwZWFycyBhZnRlciBpdC4gKi8KKwl9Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmKCBjb25maWdFTkFCTEVfTVBVID09IDEgKQorCXN0YXRpYyB2b2lkIHBydlNldHVwTVBVKCB2b2lkICkgLyogUFJJVklMRUdFRF9GVU5DVElPTiAqLworCXsKKwkjaWYgZGVmaW5lZCggX19BUk1DQ19WRVJTSU9OICkKKwkJLyogRGVjbGFyYXRpb24gd2hlbiB0aGVzZSB2YXJpYWJsZSBhcmUgZGVmaW5lZCBpbiBjb2RlIGluc3RlYWQgb2YgYmVpbmcKKwkJICogZXhwb3J0ZWQgZnJvbSBsaW5rZXIgc2NyaXB0cy4gKi8KKwkJZXh0ZXJuIHVpbnQzMl90ICogX19wcml2aWxlZ2VkX2Z1bmN0aW9uc19zdGFydF9fOworCQlleHRlcm4gdWludDMyX3QgKiBfX3ByaXZpbGVnZWRfZnVuY3Rpb25zX2VuZF9fOworCQlleHRlcm4gdWludDMyX3QgKiBfX3N5c2NhbGxzX2ZsYXNoX3N0YXJ0X187CisJCWV4dGVybiB1aW50MzJfdCAqIF9fc3lzY2FsbHNfZmxhc2hfZW5kX187CisJCWV4dGVybiB1aW50MzJfdCAqIF9fdW5wcml2aWxlZ2VkX2ZsYXNoX3N0YXJ0X187CisJCWV4dGVybiB1aW50MzJfdCAqIF9fdW5wcml2aWxlZ2VkX2ZsYXNoX2VuZF9fOworCQlleHRlcm4gdWludDMyX3QgKiBfX3ByaXZpbGVnZWRfc3JhbV9zdGFydF9fOworCQlleHRlcm4gdWludDMyX3QgKiBfX3ByaXZpbGVnZWRfc3JhbV9lbmRfXzsKKwkjZWxzZQorCQkvKiBEZWNsYXJhdGlvbiB3aGVuIHRoZXNlIHZhcmlhYmxlIGFyZSBleHBvcnRlZCBmcm9tIGxpbmtlciBzY3JpcHRzLiAqLworCQlleHRlcm4gdWludDMyX3QgX19wcml2aWxlZ2VkX2Z1bmN0aW9uc19zdGFydF9fW107CisJCWV4dGVybiB1aW50MzJfdCBfX3ByaXZpbGVnZWRfZnVuY3Rpb25zX2VuZF9fW107CisJCWV4dGVybiB1aW50MzJfdCBfX3N5c2NhbGxzX2ZsYXNoX3N0YXJ0X19bXTsKKwkJZXh0ZXJuIHVpbnQzMl90IF9fc3lzY2FsbHNfZmxhc2hfZW5kX19bXTsKKwkJZXh0ZXJuIHVpbnQzMl90IF9fdW5wcml2aWxlZ2VkX2ZsYXNoX3N0YXJ0X19bXTsKKwkJZXh0ZXJuIHVpbnQzMl90IF9fdW5wcml2aWxlZ2VkX2ZsYXNoX2VuZF9fW107CisJCWV4dGVybiB1aW50MzJfdCBfX3ByaXZpbGVnZWRfc3JhbV9zdGFydF9fW107CisJCWV4dGVybiB1aW50MzJfdCBfX3ByaXZpbGVnZWRfc3JhbV9lbmRfX1tdOworCSNlbmRpZiAvKiBkZWZpbmVkKCBfX0FSTUNDX1ZFUlNJT04gKSAqLworCisJCS8qIENoZWNrIHRoYXQgdGhlIE1QVSBpcyBwcmVzZW50LiAqLworCQlpZiggcG9ydE1QVV9UWVBFX1JFRyA9PSBwb3J0RVhQRUNURURfTVBVX1RZUEVfVkFMVUUgKQorCQl7CisJCQkvKiBNQUlSMCAtIEluZGV4IDAuICovCisJCQlwb3J0TVBVX01BSVIwX1JFRyB8PSAoICggcG9ydE1QVV9OT1JNQUxfTUVNT1JZX0JVRkZFUkFCTEVfQ0FDSEVBQkxFIDw8IHBvcnRNUFVfTUFJUl9BVFRSMF9QT1MgKSAmIHBvcnRNUFVfTUFJUl9BVFRSMF9NQVNLICk7CisJCQkvKiBNQUlSMCAtIEluZGV4IDEuICovCisJCQlwb3J0TVBVX01BSVIwX1JFRyB8PSAoICggcG9ydE1QVV9ERVZJQ0VfTUVNT1JZX25HblJFIDw8IHBvcnRNUFVfTUFJUl9BVFRSMV9QT1MgKSAmIHBvcnRNUFVfTUFJUl9BVFRSMV9NQVNLICk7CisKKwkJCS8qIFNldHVwIHByaXZpbGVnZWQgZmxhc2ggYXMgUmVhZCBPbmx5IHNvIHRoYXQgcHJpdmlsZWdlZCB0YXNrcyBjYW4KKwkJCSAqIHJlYWQgaXQgYnV0IG5vdCBtb2RpZnkuICovCisJCQlwb3J0TVBVX1JOUl9SRUcgPSBwb3J0UFJJVklMRUdFRF9GTEFTSF9SRUdJT047CisJCQlwb3J0TVBVX1JCQVJfUkVHID0JKCAoICggdWludDMyX3QgKSBfX3ByaXZpbGVnZWRfZnVuY3Rpb25zX3N0YXJ0X18gKSAmIHBvcnRNUFVfUkJBUl9BRERSRVNTX01BU0sgKSB8CisJCQkJCQkJCSggcG9ydE1QVV9SRUdJT05fTk9OX1NIQVJFQUJMRSApIHwKKwkJCQkJCQkJKCBwb3J0TVBVX1JFR0lPTl9QUklWSUxFR0VEX1JFQURfT05MWSApOworCQkJcG9ydE1QVV9STEFSX1JFRyA9CSggKCAoIHVpbnQzMl90ICkgX19wcml2aWxlZ2VkX2Z1bmN0aW9uc19lbmRfXyApICYgcG9ydE1QVV9STEFSX0FERFJFU1NfTUFTSyApIHwKKwkJCQkJCQkJKCBwb3J0TVBVX1JMQVJfQVRUUl9JTkRFWDAgKSB8CisJCQkJCQkJCSggcG9ydE1QVV9STEFSX1JFR0lPTl9FTkFCTEUgKTsKKworCQkJLyogU2V0dXAgdW5wcml2aWxlZ2VkIGZsYXNoIGFzIFJlYWQgT25seSBieSBib3RoIHByaXZpbGVnZWQgYW5kCisJCQkgKiB1bnByaXZpbGVnZWQgdGFza3MuIEFsbCB0YXNrcyBjYW4gcmVhZCBpdCBidXQgbm8tb25lIGNhbiBtb2RpZnkuICovCisJCQlwb3J0TVBVX1JOUl9SRUcgPSBwb3J0VU5QUklWSUxFR0VEX0ZMQVNIX1JFR0lPTjsKKwkJCXBvcnRNUFVfUkJBUl9SRUcgPQkoICggKCB1aW50MzJfdCApIF9fdW5wcml2aWxlZ2VkX2ZsYXNoX3N0YXJ0X18gKSAmIHBvcnRNUFVfUkJBUl9BRERSRVNTX01BU0sgKSB8CisJCQkJCQkJCSggcG9ydE1QVV9SRUdJT05fTk9OX1NIQVJFQUJMRSApIHwKKwkJCQkJCQkJKCBwb3J0TVBVX1JFR0lPTl9SRUFEX09OTFkgKTsKKwkJCXBvcnRNUFVfUkxBUl9SRUcgPQkoICggKCB1aW50MzJfdCApIF9fdW5wcml2aWxlZ2VkX2ZsYXNoX2VuZF9fICkgJiBwb3J0TVBVX1JMQVJfQUREUkVTU19NQVNLICkgfAorCQkJCQkJCQkoIHBvcnRNUFVfUkxBUl9BVFRSX0lOREVYMCApIHwKKwkJCQkJCQkJKCBwb3J0TVBVX1JMQVJfUkVHSU9OX0VOQUJMRSApOworCisJCQkvKiBTZXR1cCB1bnByaXZpbGVnZWQgc3lzY2FsbHMgZmxhc2ggYXMgUmVhZCBPbmx5IGJ5IGJvdGggcHJpdmlsZWdlZAorCQkJICogYW5kIHVucHJpdmlsZWdlZCB0YXNrcy4gQWxsIHRhc2tzIGNhbiByZWFkIGl0IGJ1dCBuby1vbmUgY2FuIG1vZGlmeS4gKi8KKwkJCXBvcnRNUFVfUk5SX1JFRyA9IHBvcnRVTlBSSVZJTEVHRURfU1lTQ0FMTFNfUkVHSU9OOworCQkJcG9ydE1QVV9SQkFSX1JFRyA9CSggKCAoIHVpbnQzMl90ICkgX19zeXNjYWxsc19mbGFzaF9zdGFydF9fICkgJiBwb3J0TVBVX1JCQVJfQUREUkVTU19NQVNLICkgfAorCQkJCQkJCQkoIHBvcnRNUFVfUkVHSU9OX05PTl9TSEFSRUFCTEUgKSB8CisJCQkJCQkJCSggcG9ydE1QVV9SRUdJT05fUkVBRF9PTkxZICk7CisJCQlwb3J0TVBVX1JMQVJfUkVHID0JKCAoICggdWludDMyX3QgKSBfX3N5c2NhbGxzX2ZsYXNoX2VuZF9fICkgJiBwb3J0TVBVX1JMQVJfQUREUkVTU19NQVNLICkgfAorCQkJCQkJCQkoIHBvcnRNUFVfUkxBUl9BVFRSX0lOREVYMCApIHwKKwkJCQkJCQkJKCBwb3J0TVBVX1JMQVJfUkVHSU9OX0VOQUJMRSApOworCisJCQkvKiBTZXR1cCBSQU0gY29udGFpbmluZyBrZXJuZWwgZGF0YSBmb3IgcHJpdmlsZWdlZCBhY2Nlc3Mgb25seS4gKi8KKwkJCXBvcnRNUFVfUk5SX1JFRyA9IHBvcnRQUklWSUxFR0VEX1JBTV9SRUdJT047CisJCQlwb3J0TVBVX1JCQVJfUkVHID0JKCAoICggdWludDMyX3QgKSBfX3ByaXZpbGVnZWRfc3JhbV9zdGFydF9fICkgJiBwb3J0TVBVX1JCQVJfQUREUkVTU19NQVNLICkgfAorCQkJCQkJCQkoIHBvcnRNUFVfUkVHSU9OX05PTl9TSEFSRUFCTEUgKSB8CisJCQkJCQkJCSggcG9ydE1QVV9SRUdJT05fUFJJVklMRUdFRF9SRUFEX1dSSVRFICkgfAorCQkJCQkJCQkoIHBvcnRNUFVfUkVHSU9OX0VYRUNVVEVfTkVWRVIgKTsKKwkJCXBvcnRNUFVfUkxBUl9SRUcgPQkoICggKCB1aW50MzJfdCApIF9fcHJpdmlsZWdlZF9zcmFtX2VuZF9fICkgJiBwb3J0TVBVX1JMQVJfQUREUkVTU19NQVNLICkgfAorCQkJCQkJCQkoIHBvcnRNUFVfUkxBUl9BVFRSX0lOREVYMCApIHwKKwkJCQkJCQkJKCBwb3J0TVBVX1JMQVJfUkVHSU9OX0VOQUJMRSApOworCisJCQkvKiBFbmFibGUgbWVtIGZhdWx0LiAqLworCQkJcG9ydFNDQl9TWVNfSEFORExFUl9DVFJMX1NUQVRFX1JFRyB8PSBwb3J0U0NCX01FTV9GQVVMVF9FTkFCTEU7CisKKwkJCS8qIEVuYWJsZSBNUFUgd2l0aCBwcml2aWxlZ2VkIGJhY2tncm91bmQgYWNjZXNzIGkuZS4gdW5tYXBwZWQKKwkJCSAqIHJlZ2lvbnMgaGF2ZSBwcml2aWxlZ2VkIGFjY2Vzcy4gKi8KKwkJCXBvcnRNUFVfQ1RSTF9SRUcgfD0gKCBwb3J0TVBVX1BSSVZfQkFDS0dST1VORF9FTkFCTEUgfCBwb3J0TVBVX0VOQUJMRSApOworCQl9CisJfQorI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9NUFUgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYoIGNvbmZpZ0VOQUJMRV9GUFUgPT0gMSApCisJc3RhdGljIHZvaWQgcHJ2U2V0dXBGUFUoIHZvaWQgKSAvKiBQUklWSUxFR0VEX0ZVTkNUSU9OICovCisJeworCQkjaWYoIGNvbmZpZ0VOQUJMRV9UUlVTVFpPTkUgPT0gMSApCisJCXsKKwkJCS8qIEVuYWJsZSBub24tc2VjdXJlIGFjY2VzcyB0byB0aGUgRlBVLiAqLworCQkJU2VjdXJlSW5pdF9FbmFibGVOU0ZQVUFjY2VzcygpOworCQl9CisJCSNlbmRpZiAvKiBjb25maWdFTkFCTEVfVFJVU1RaT05FICovCisKKwkJLyogQ1AxMCA9IDExID09PiBGdWxsIGFjY2VzcyB0byBGUFUgaS5lLiBib3RoIHByaXZpbGVnZWQgYW5kCisJCSAqIHVucHJpdmlsZWdlZCBjb2RlIHNob3VsZCBiZSBhYmxlIHRvIGFjY2VzcyBGUFUuIENQMTEgc2hvdWxkIGJlCisJCSAqIHByb2dyYW1tZWQgdG8gdGhlIHNhbWUgdmFsdWUgYXMgQ1AxMC4gKi8KKwkJKiggcG9ydENQQUNSICkgfD0JKAkoIHBvcnRDUEFDUl9DUDEwX1ZBTFVFIDw8IHBvcnRDUEFDUl9DUDEwX1BPUyApIHwKKwkJCQkJCQkJKCBwb3J0Q1BBQ1JfQ1AxMV9WQUxVRSA8PCBwb3J0Q1BBQ1JfQ1AxMV9QT1MgKQorCQkJCQkJCSk7CisKKwkJLyogQVNQRU4gPSAxID09PiBIYXJkd2FyZSBzaG91bGQgYXV0b21hdGljYWxseSBwcmVzZXJ2ZSBmbG9hdGluZyBwb2ludAorCQkgKiBjb250ZXh0IG9uIGV4Y2VwdGlvbiBlbnRyeSBhbmQgcmVzdG9yZSBvbiBleGNlcHRpb24gcmV0dXJuLgorCQkgKiBMU1BFTiA9IDEgPT0+IEVuYWJsZSBsYXp5IGNvbnRleHQgc2F2ZSBvZiBGUCBzdGF0ZS4gKi8KKwkJKiggcG9ydEZQQ0NSICkgfD0gKCBwb3J0RlBDQ1JfQVNQRU5fTUFTSyB8IHBvcnRGUENDUl9MU1BFTl9NQVNLICk7CisJfQorI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9GUFUgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIHZQb3J0WWllbGQoIHZvaWQgKSAvKiBQUklWSUxFR0VEX0ZVTkNUSU9OICovCit7CisJLyogU2V0IGEgUGVuZFNWIHRvIHJlcXVlc3QgYSBjb250ZXh0IHN3aXRjaC4gKi8KKwkqKCBwb3J0TlZJQ19JTlRfQ1RSTCApID0gcG9ydE5WSUNfUEVORFNWU0VUOworCisJLyogQmFycmllcnMgYXJlIG5vcm1hbGx5IG5vdCByZXF1aXJlZCBidXQgZG8gZW5zdXJlIHRoZSBjb2RlIGlzCisJICogY29tcGxldGVseSB3aXRoaW4gdGhlIHNwZWNpZmllZCBiZWhhdmlvdXIgZm9yIHRoZSBhcmNoaXRlY3R1cmUuICovCisJX19hc20gdm9sYXRpbGUoICJkc2IiIDo6OiAibWVtb3J5IiApOworCV9fYXNtIHZvbGF0aWxlKCAiaXNiIiApOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgdlBvcnRFbnRlckNyaXRpY2FsKCB2b2lkICkgLyogUFJJVklMRUdFRF9GVU5DVElPTiAqLworeworCXBvcnRESVNBQkxFX0lOVEVSUlVQVFMoKTsKKwl1bENyaXRpY2FsTmVzdGluZysrOworCisJLyogQmFycmllcnMgYXJlIG5vcm1hbGx5IG5vdCByZXF1aXJlZCBidXQgZG8gZW5zdXJlIHRoZSBjb2RlIGlzCisJICogY29tcGxldGVseSB3aXRoaW4gdGhlIHNwZWNpZmllZCBiZWhhdmlvdXIgZm9yIHRoZSBhcmNoaXRlY3R1cmUuICovCisJX19hc20gdm9sYXRpbGUoICJkc2IiIDo6OiAibWVtb3J5IiApOworCV9fYXNtIHZvbGF0aWxlKCAiaXNiIiApOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgdlBvcnRFeGl0Q3JpdGljYWwoIHZvaWQgKSAvKiBQUklWSUxFR0VEX0ZVTkNUSU9OICovCit7CisJY29uZmlnQVNTRVJUKCB1bENyaXRpY2FsTmVzdGluZyApOworCXVsQ3JpdGljYWxOZXN0aW5nLS07CisKKwlpZiggdWxDcml0aWNhbE5lc3RpbmcgPT0gMCApCisJeworCQlwb3J0RU5BQkxFX0lOVEVSUlVQVFMoKTsKKwl9Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBTeXNUaWNrX0hhbmRsZXIoIHZvaWQgKSAvKiBQUklWSUxFR0VEX0ZVTkNUSU9OICovCit7Cit1aW50MzJfdCB1bFByZXZpb3VzTWFzazsKKworCXVsUHJldmlvdXNNYXNrID0gcG9ydFNFVF9JTlRFUlJVUFRfTUFTS19GUk9NX0lTUigpOworCXsKKwkJLyogSW5jcmVtZW50IHRoZSBSVE9TIHRpY2suICovCisJCWlmKCB4VGFza0luY3JlbWVudFRpY2soKSAhPSBwZEZBTFNFICkKKwkJeworCQkJLyogUGVuZCBhIGNvbnRleHQgc3dpdGNoLiAqLworCQkJKiggcG9ydE5WSUNfSU5UX0NUUkwgKSA9IHBvcnROVklDX1BFTkRTVlNFVDsKKwkJfQorCX0KKwlwb3J0Q0xFQVJfSU5URVJSVVBUX01BU0tfRlJPTV9JU1IoIHVsUHJldmlvdXNNYXNrICk7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCB2UG9ydFNWQ0hhbmRsZXJfQyggdWludDMyX3QgKnB1bENhbGxlclN0YWNrQWRkcmVzcyApIC8qIFBSSVZJTEVHRURfRlVOQ1RJT04gcG9ydERPTlRfRElTQ0FSRCAqLworeworI2lmKCBjb25maWdFTkFCTEVfTVBVID09IDEgKQorCSNpZiBkZWZpbmVkKCBfX0FSTUNDX1ZFUlNJT04gKQorCQkvKiBEZWNsYXJhdGlvbiB3aGVuIHRoZXNlIHZhcmlhYmxlIGFyZSBkZWZpbmVkIGluIGNvZGUgaW5zdGVhZCBvZiBiZWluZworCQkgKiBleHBvcnRlZCBmcm9tIGxpbmtlciBzY3JpcHRzLiAqLworCQlleHRlcm4gdWludDMyX3QgKiBfX3N5c2NhbGxzX2ZsYXNoX3N0YXJ0X187CisJCWV4dGVybiB1aW50MzJfdCAqIF9fc3lzY2FsbHNfZmxhc2hfZW5kX187CisJI2Vsc2UKKwkJLyogRGVjbGFyYXRpb24gd2hlbiB0aGVzZSB2YXJpYWJsZSBhcmUgZXhwb3J0ZWQgZnJvbSBsaW5rZXIgc2NyaXB0cy4gKi8KKwkJZXh0ZXJuIHVpbnQzMl90IF9fc3lzY2FsbHNfZmxhc2hfc3RhcnRfX1tdOworCQlleHRlcm4gdWludDMyX3QgX19zeXNjYWxsc19mbGFzaF9lbmRfX1tdOworCSNlbmRpZiAvKiBkZWZpbmVkKCBfX0FSTUNDX1ZFUlNJT04gKSAqLworI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9NUFUgKi8KKwordWludDMyX3QgdWxQQzsKKworI2lmKCBjb25maWdFTkFCTEVfVFJVU1RaT05FID09IDEgKQorCXVpbnQzMl90IHVsUjA7CisJI2lmKCBjb25maWdFTkFCTEVfTVBVID09IDEgKQorCQl1aW50MzJfdCB1bENvbnRyb2wsIHVsSXNUYXNrUHJpdmlsZWdlZDsKKwkjZW5kaWYgLyogY29uZmlnRU5BQkxFX01QVSAqLworI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9UUlVTVFpPTkUgKi8KK3VpbnQ4X3QgdWNTVkNOdW1iZXI7CisKKwkvKiBSZWdpc3RlciBhcmUgc3RvcmVkIG9uIHRoZSBzdGFjayBpbiB0aGUgZm9sbG93aW5nIG9yZGVyIC0gUjAsIFIxLCBSMiwgUjMsCisJICogUjEyLCBMUiwgUEMsIHhQU1IuICovCisJdWxQQyA9IHB1bENhbGxlclN0YWNrQWRkcmVzc1sgNiBdOworCXVjU1ZDTnVtYmVyID0gKCAoIHVpbnQ4X3QgKikgdWxQQyApWyAtMiBdOworCisJc3dpdGNoKCB1Y1NWQ051bWJlciApCisJeworCQkjaWYoIGNvbmZpZ0VOQUJMRV9UUlVTVFpPTkUgPT0gMSApCisJCQljYXNlIHBvcnRTVkNfQUxMT0NBVEVfU0VDVVJFX0NPTlRFWFQ6CisJCQl7CisJCQkJLyogUjAgY29udGFpbnMgdGhlIHN0YWNrIHNpemUgcGFzc2VkIGFzIHBhcmFtZXRlciB0byB0aGUKKwkJCQkgKiB2UG9ydEFsbG9jYXRlU2VjdXJlQ29udGV4dCBmdW5jdGlvbi4gKi8KKwkJCQl1bFIwID0gcHVsQ2FsbGVyU3RhY2tBZGRyZXNzWyAwIF07CisKKwkJCQkjaWYoIGNvbmZpZ0VOQUJMRV9NUFUgPT0gMSApCisJCQkJeworCQkJCQkvKiBSZWFkIHRoZSBDT05UUk9MIHJlZ2lzdGVyIHZhbHVlLiAqLworCQkJCQlfX2FzbSB2b2xhdGlsZSAoICJtcnMgJTAsIGNvbnRyb2wiICA6ICI9ciIgKCB1bENvbnRyb2wgKSApOworCisJCQkJCS8qIFRoZSB0YXNrIHRoYXQgcmFpc2VkIHRoZSBTVkMgaXMgcHJpdmlsZWdlZCBpZiBCaXRbMF0KKwkJCQkJICogaW4gdGhlIENPTlRST0wgcmVnaXN0ZXIgaXMgMC4gKi8KKwkJCQkJdWxJc1Rhc2tQcml2aWxlZ2VkID0gKCAoIHVsQ29udHJvbCAmIHBvcnRDT05UUk9MX1BSSVZJTEVHRURfTUFTSyApID09IDAgKTsKKworCQkJCQkvKiBBbGxvY2F0ZSBhbmQgbG9hZCBhIGNvbnRleHQgZm9yIHRoZSBzZWN1cmUgdGFzay4gKi8KKwkJCQkJeFNlY3VyZUNvbnRleHQgPSBTZWN1cmVDb250ZXh0X0FsbG9jYXRlQ29udGV4dCggdWxSMCwgdWxJc1Rhc2tQcml2aWxlZ2VkICk7CisJCQkJfQorCQkJCSNlbHNlCisJCQkJeworCQkJCQkvKiBBbGxvY2F0ZSBhbmQgbG9hZCBhIGNvbnRleHQgZm9yIHRoZSBzZWN1cmUgdGFzay4gKi8KKwkJCQkJeFNlY3VyZUNvbnRleHQgPSBTZWN1cmVDb250ZXh0X0FsbG9jYXRlQ29udGV4dCggdWxSMCApOworCQkJCX0KKwkJCQkjZW5kaWYgLyogY29uZmlnRU5BQkxFX01QVSAqLworCisJCQkJY29uZmlnQVNTRVJUKCB4U2VjdXJlQ29udGV4dCAhPSBOVUxMICk7CisJCQkJU2VjdXJlQ29udGV4dF9Mb2FkQ29udGV4dCggeFNlY3VyZUNvbnRleHQgKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCQljYXNlIHBvcnRTVkNfRlJFRV9TRUNVUkVfQ09OVEVYVDoKKwkJCXsKKwkJCQkvKiBSMCBjb250YWlucyB0aGUgc2VjdXJlIGNvbnRleHQgaGFuZGxlIHRvIGJlIGZyZWVkLiAqLworCQkJCXVsUjAgPSBwdWxDYWxsZXJTdGFja0FkZHJlc3NbIDAgXTsKKworCQkJCS8qIEZyZWUgdGhlIHNlY3VyZSBjb250ZXh0LiAqLworCQkJCVNlY3VyZUNvbnRleHRfRnJlZUNvbnRleHQoICggU2VjdXJlQ29udGV4dEhhbmRsZV90ICkgdWxSMCApOworCQkJfQorCQkJYnJlYWs7CisJCSNlbmRpZiAvKiBjb25maWdFTkFCTEVfVFJVU1RaT05FICovCisKKwkJY2FzZSBwb3J0U1ZDX1NUQVJUX1NDSEVEVUxFUjoKKwkJeworCQkJI2lmKCBjb25maWdFTkFCTEVfVFJVU1RaT05FID09IDEgKQorCQkJeworCQkJCS8qIERlLXByaW9yaXRpemUgdGhlIG5vbi1zZWN1cmUgZXhjZXB0aW9ucyBzbyB0aGF0IHRoZQorCQkJCSAqIG5vbi1zZWN1cmUgcGVuZFNWIHJ1bnMgYXQgdGhlIGxvd2VzdCBwcmlvcml0eS4gKi8KKwkJCQlTZWN1cmVJbml0X0RlUHJpb3JpdGl6ZU5TRXhjZXB0aW9ucygpOworCisJCQkJLyogSW5pdGlhbGl6ZSB0aGUgc2VjdXJlIGNvbnRleHQgbWFuYWdlbWVudCBzeXN0ZW0uICovCisJCQkJU2VjdXJlQ29udGV4dF9Jbml0KCk7CisJCQl9CisJCQkjZW5kaWYgLyogY29uZmlnRU5BQkxFX1RSVVNUWk9ORSAqLworCisJCQkjaWYoIGNvbmZpZ0VOQUJMRV9GUFUgPT0gMSApCisJCQl7CisJCQkJLyogU2V0dXAgdGhlIEZsb2F0aW5nIFBvaW50IFVuaXQgKEZQVSkuICovCisJCQkJcHJ2U2V0dXBGUFUoKTsKKwkJCX0KKwkJCSNlbmRpZiAvKiBjb25maWdFTkFCTEVfRlBVICovCisKKwkJCS8qIFNldHVwIHRoZSBjb250ZXh0IG9mIHRoZSBmaXJzdCB0YXNrIHNvIHRoYXQgdGhlIGZpcnN0IHRhc2sgc3RhcnRzCisJCQkgKiBleGVjdXRpbmcuICovCisJCQl2UmVzdG9yZUNvbnRleHRPZkZpcnN0VGFzaygpOworCQl9CisJCWJyZWFrOworCisJCSNpZiggY29uZmlnRU5BQkxFX01QVSA9PSAxICkKKwkJCWNhc2UgcG9ydFNWQ19SQUlTRV9QUklWSUxFR0U6CisJCQl7CisJCQkJLyogT25seSByYWlzZSB0aGUgcHJpdmlsZWdlLCBpZiB0aGUgc3ZjIHdhcyByYWlzZWQgZnJvbSBhbnkgb2YKKwkJCQkgKiB0aGUgc3lzdGVtIGNhbGxzLiAqLworCQkJCWlmKCB1bFBDID49ICggdWludDMyX3QgKSBfX3N5c2NhbGxzX2ZsYXNoX3N0YXJ0X18gJiYKKwkJCQkJdWxQQyA8PSAoIHVpbnQzMl90ICkgX19zeXNjYWxsc19mbGFzaF9lbmRfXyApCisJCQkJeworCQkJCQl2UmFpc2VQcml2aWxlZ2UoKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9NUFUgKi8KKworCQlkZWZhdWx0OgorCQl7CisJCQkvKiBJbmNvcnJlY3QgU1ZDIGNhbGwuICovCisJCQljb25maWdBU1NFUlQoIHBkRkFMU0UgKTsKKwkJfQorCX0KK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYoIGNvbmZpZ0VOQUJMRV9NUFUgPT0gMSApCisJU3RhY2tUeXBlX3QgKnB4UG9ydEluaXRpYWxpc2VTdGFjayggU3RhY2tUeXBlX3QgKnB4VG9wT2ZTdGFjaywgU3RhY2tUeXBlX3QgKnB4RW5kT2ZTdGFjaywgVGFza0Z1bmN0aW9uX3QgcHhDb2RlLCB2b2lkICpwdlBhcmFtZXRlcnMsIEJhc2VUeXBlX3QgeFJ1blByaXZpbGVnZWQgKSAvKiBQUklWSUxFR0VEX0ZVTkNUSU9OICovCisjZWxzZQorCVN0YWNrVHlwZV90ICpweFBvcnRJbml0aWFsaXNlU3RhY2soIFN0YWNrVHlwZV90ICpweFRvcE9mU3RhY2ssIFN0YWNrVHlwZV90ICpweEVuZE9mU3RhY2ssIFRhc2tGdW5jdGlvbl90IHB4Q29kZSwgdm9pZCAqcHZQYXJhbWV0ZXJzICkgLyogUFJJVklMRUdFRF9GVU5DVElPTiAqLworI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9NUFUgKi8KK3sKKwkvKiBTaW11bGF0ZSB0aGUgc3RhY2sgZnJhbWUgYXMgaXQgd291bGQgYmUgY3JlYXRlZCBieSBhIGNvbnRleHQgc3dpdGNoCisJICogaW50ZXJydXB0LiAqLworCSNpZiggcG9ydFBSRUxPQURfUkVHSVNURVJTID09IDAgKQorCXsKKwkJcHhUb3BPZlN0YWNrLS07IC8qIE9mZnNldCBhZGRlZCB0byBhY2NvdW50IGZvciB0aGUgd2F5IHRoZSBNQ1UgdXNlcyB0aGUgc3RhY2sgb24gZW50cnkvZXhpdCBvZiBpbnRlcnJ1cHRzLiAqLworCQkqcHhUb3BPZlN0YWNrID0gcG9ydElOSVRJQUxfWFBTUjsJCQkJCQkJLyogeFBTUiAqLworCQlweFRvcE9mU3RhY2stLTsKKwkJKnB4VG9wT2ZTdGFjayA9ICggU3RhY2tUeXBlX3QgKSBweENvZGU7CQkJCQkJLyogUEMgKi8KKwkJcHhUb3BPZlN0YWNrLS07CisJCSpweFRvcE9mU3RhY2sgPSAoIFN0YWNrVHlwZV90ICkgcG9ydFRBU0tfUkVUVVJOX0FERFJFU1M7CS8qIExSICovCisJCXB4VG9wT2ZTdGFjayAtPSA1OwkJCQkJCQkJCQkJLyogUjEyLCBSMywgUjIgYW5kIFIxLiAqLworCQkqcHhUb3BPZlN0YWNrID0gKCBTdGFja1R5cGVfdCApIHB2UGFyYW1ldGVyczsJCQkJLyogUjAgKi8KKwkJcHhUb3BPZlN0YWNrIC09IDk7CQkJCQkJCQkJCQkvKiBSMTEuLlI0LCBFWENfUkVUVVJOLiAqLworCQkqcHhUb3BPZlN0YWNrID0gcG9ydElOSVRJQUxfRVhDX1JFVFVSTjsKKworCQkjaWYoIGNvbmZpZ0VOQUJMRV9NUFUgPT0gMSApCisJCXsKKwkJCXB4VG9wT2ZTdGFjay0tOworCQkJaWYoIHhSdW5Qcml2aWxlZ2VkID09IHBkVFJVRSApCisJCQl7CisJCQkJKnB4VG9wT2ZTdGFjayA9IHBvcnRJTklUSUFMX0NPTlRST0xfUFJJVklMRUdFRDsJCS8qIFNsb3QgdXNlZCB0byBob2xkIHRoaXMgdGFzaydzIENPTlRST0wgdmFsdWUuICovCisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJKnB4VG9wT2ZTdGFjayA9IHBvcnRJTklUSUFMX0NPTlRST0xfVU5QUklWSUxFR0VEOwkvKiBTbG90IHVzZWQgdG8gaG9sZCB0aGlzIHRhc2sncyBDT05UUk9MIHZhbHVlLiAqLworCQkJfQorCQl9CisJCSNlbmRpZiAvKiBjb25maWdFTkFCTEVfTVBVICovCisKKwkJcHhUb3BPZlN0YWNrLS07CisJCSpweFRvcE9mU3RhY2sgPSAoIFN0YWNrVHlwZV90ICkgcHhFbmRPZlN0YWNrOwkvKiBTbG90IHVzZWQgdG8gaG9sZCB0aGlzIHRhc2sncyBQU1BMSU0gdmFsdWUuICovCisKKwkJI2lmKCBjb25maWdFTkFCTEVfVFJVU1RaT05FID09IDEgKQorCQl7CisJCQlweFRvcE9mU3RhY2stLTsKKwkJCSpweFRvcE9mU3RhY2sgPSBwb3J0Tk9fU0VDVVJFX0NPTlRFWFQ7CQkvKiBTbG90IHVzZWQgdG8gaG9sZCB0aGlzIHRhc2sncyB4U2VjdXJlQ29udGV4dCB2YWx1ZS4gKi8KKwkJfQorCQkjZW5kaWYgLyogY29uZmlnRU5BQkxFX1RSVVNUWk9ORSAqLworCX0KKwkjZWxzZSAvKiBwb3J0UFJFTE9BRF9SRUdJU1RFUlMgKi8KKwl7CisJCXB4VG9wT2ZTdGFjay0tOyAvKiBPZmZzZXQgYWRkZWQgdG8gYWNjb3VudCBmb3IgdGhlIHdheSB0aGUgTUNVIHVzZXMgdGhlIHN0YWNrIG9uIGVudHJ5L2V4aXQgb2YgaW50ZXJydXB0cy4gKi8KKwkJKnB4VG9wT2ZTdGFjayA9IHBvcnRJTklUSUFMX1hQU1I7CQkJCQkJCS8qIHhQU1IgKi8KKwkJcHhUb3BPZlN0YWNrLS07CisJCSpweFRvcE9mU3RhY2sgPSAoIFN0YWNrVHlwZV90ICkgcHhDb2RlOwkJCQkJCS8qIFBDICovCisJCXB4VG9wT2ZTdGFjay0tOworCQkqcHhUb3BPZlN0YWNrID0gKCBTdGFja1R5cGVfdCApIHBvcnRUQVNLX1JFVFVSTl9BRERSRVNTOwkvKiBMUiAqLworCQlweFRvcE9mU3RhY2stLTsKKwkJKnB4VG9wT2ZTdGFjayA9ICggU3RhY2tUeXBlX3QgKSAweDEyMTIxMjEyVUw7CQkJCS8qIFIxMiAqLworCQlweFRvcE9mU3RhY2stLTsKKwkJKnB4VG9wT2ZTdGFjayA9ICggU3RhY2tUeXBlX3QgKSAweDAzMDMwMzAzVUw7CQkJCS8qIFIzICovCisJCXB4VG9wT2ZTdGFjay0tOworCQkqcHhUb3BPZlN0YWNrID0gKCBTdGFja1R5cGVfdCApIDB4MDIwMjAyMDJVTDsJCQkJLyogUjIgKi8KKwkJcHhUb3BPZlN0YWNrLS07CisJCSpweFRvcE9mU3RhY2sgPSAoIFN0YWNrVHlwZV90ICkgMHgwMTAxMDEwMVVMOwkJCQkvKiBSMSAqLworCQlweFRvcE9mU3RhY2stLTsKKwkJKnB4VG9wT2ZTdGFjayA9ICggU3RhY2tUeXBlX3QgKSBwdlBhcmFtZXRlcnM7CQkJCS8qIFIwICovCisJCXB4VG9wT2ZTdGFjay0tOworCQkqcHhUb3BPZlN0YWNrID0gKCBTdGFja1R5cGVfdCApIDB4MTExMTExMTFVTDsJCQkJLyogUjExICovCisJCXB4VG9wT2ZTdGFjay0tOworCQkqcHhUb3BPZlN0YWNrID0gKCBTdGFja1R5cGVfdCApIDB4MTAxMDEwMTBVTDsJCQkJLyogUjEwICovCisJCXB4VG9wT2ZTdGFjay0tOworCQkqcHhUb3BPZlN0YWNrID0gKCBTdGFja1R5cGVfdCApIDB4MDkwOTA5MDlVTDsJCQkJLyogUjA5ICovCisJCXB4VG9wT2ZTdGFjay0tOworCQkqcHhUb3BPZlN0YWNrID0gKCBTdGFja1R5cGVfdCApIDB4MDgwODA4MDhVTDsJCQkJLyogUjA4ICovCisJCXB4VG9wT2ZTdGFjay0tOworCQkqcHhUb3BPZlN0YWNrID0gKCBTdGFja1R5cGVfdCApIDB4MDcwNzA3MDdVTDsJCQkJLyogUjA3ICovCisJCXB4VG9wT2ZTdGFjay0tOworCQkqcHhUb3BPZlN0YWNrID0gKCBTdGFja1R5cGVfdCApIDB4MDYwNjA2MDZVTDsJCQkJLyogUjA2ICovCisJCXB4VG9wT2ZTdGFjay0tOworCQkqcHhUb3BPZlN0YWNrID0gKCBTdGFja1R5cGVfdCApIDB4MDUwNTA1MDVVTDsJCQkJLyogUjA1ICovCisJCXB4VG9wT2ZTdGFjay0tOworCQkqcHhUb3BPZlN0YWNrID0gKCBTdGFja1R5cGVfdCApIDB4MDQwNDA0MDRVTDsJCQkJLyogUjA0ICovCisJCXB4VG9wT2ZTdGFjay0tOworCQkqcHhUb3BPZlN0YWNrID0gcG9ydElOSVRJQUxfRVhDX1JFVFVSTjsJCQkJCQkvKiBFWENfUkVUVVJOICovCisKKwkJI2lmKCBjb25maWdFTkFCTEVfTVBVID09IDEgKQorCQl7CisJCQlweFRvcE9mU3RhY2stLTsKKwkJCWlmKCB4UnVuUHJpdmlsZWdlZCA9PSBwZFRSVUUgKQorCQkJeworCQkJCSpweFRvcE9mU3RhY2sgPSBwb3J0SU5JVElBTF9DT05UUk9MX1BSSVZJTEVHRUQ7CQkvKiBTbG90IHVzZWQgdG8gaG9sZCB0aGlzIHRhc2sncyBDT05UUk9MIHZhbHVlLiAqLworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCSpweFRvcE9mU3RhY2sgPSBwb3J0SU5JVElBTF9DT05UUk9MX1VOUFJJVklMRUdFRDsJLyogU2xvdCB1c2VkIHRvIGhvbGQgdGhpcyB0YXNrJ3MgQ09OVFJPTCB2YWx1ZS4gKi8KKwkJCX0KKwkJfQorCQkjZW5kaWYgLyogY29uZmlnRU5BQkxFX01QVSAqLworCisJCXB4VG9wT2ZTdGFjay0tOworCQkqcHhUb3BPZlN0YWNrID0gKCBTdGFja1R5cGVfdCApIHB4RW5kT2ZTdGFjazsJLyogU2xvdCB1c2VkIHRvIGhvbGQgdGhpcyB0YXNrJ3MgUFNQTElNIHZhbHVlLiAqLworCisJCSNpZiggY29uZmlnRU5BQkxFX1RSVVNUWk9ORSA9PSAxICkKKwkJeworCQkJcHhUb3BPZlN0YWNrLS07CisJCQkqcHhUb3BPZlN0YWNrID0gcG9ydE5PX1NFQ1VSRV9DT05URVhUOwkJLyogU2xvdCB1c2VkIHRvIGhvbGQgdGhpcyB0YXNrJ3MgeFNlY3VyZUNvbnRleHQgdmFsdWUuICovCisJCX0KKwkJI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9UUlVTVFpPTkUgKi8KKwl9CisJI2VuZGlmIC8qIHBvcnRQUkVMT0FEX1JFR0lTVEVSUyAqLworCisJcmV0dXJuIHB4VG9wT2ZTdGFjazsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitCYXNlVHlwZV90IHhQb3J0U3RhcnRTY2hlZHVsZXIoIHZvaWQgKSAvKiBQUklWSUxFR0VEX0ZVTkNUSU9OICovCit7CisJLyogTWFrZSBQZW5kU1YsIENhbGxTViBhbmQgU3lzVGljayB0aGUgc2FtZSBwcmlvcml0eSBhcyB0aGUga2VybmVsLiAqLworCSooIHBvcnROVklDX1NZU1BSSTIgKSB8PSBwb3J0TlZJQ19QRU5EU1ZfUFJJOworCSooIHBvcnROVklDX1NZU1BSSTIgKSB8PSBwb3J0TlZJQ19TWVNUSUNLX1BSSTsKKworCSNpZiggY29uZmlnRU5BQkxFX01QVSA9PSAxICkKKwl7CisJCS8qIFNldHVwIHRoZSBNZW1vcnkgUHJvdGVjdGlvbiBVbml0IChNUFUpLiAqLworCQlwcnZTZXR1cE1QVSgpOworCX0KKwkjZW5kaWYgLyogY29uZmlnRU5BQkxFX01QVSAqLworCisJLyogU3RhcnQgdGhlIHRpbWVyIHRoYXQgZ2VuZXJhdGVzIHRoZSB0aWNrIElTUi4gSW50ZXJydXB0cyBhcmUgZGlzYWJsZWQKKwkgKiBoZXJlIGFscmVhZHkuICovCisJcHJ2U2V0dXBUaW1lckludGVycnVwdCgpOworCisJLyogSW5pdGlhbGl6ZSB0aGUgY3JpdGljYWwgbmVzdGluZyBjb3VudCByZWFkeSBmb3IgdGhlIGZpcnN0IHRhc2suICovCisJdWxDcml0aWNhbE5lc3RpbmcgPSAwOworCisJLyogU3RhcnQgdGhlIGZpcnN0IHRhc2suICovCisJdlN0YXJ0Rmlyc3RUYXNrKCk7CisKKwkvKiBTaG91bGQgbmV2ZXIgZ2V0IGhlcmUgYXMgdGhlIHRhc2tzIHdpbGwgbm93IGJlIGV4ZWN1dGluZy4gQ2FsbCB0aGUgdGFzaworCSAqIGV4aXQgZXJyb3IgZnVuY3Rpb24gdG8gcHJldmVudCBjb21waWxlciB3YXJuaW5ncyBhYm91dCBhIHN0YXRpYyBmdW5jdGlvbgorCSAqIG5vdCBiZWluZyBjYWxsZWQgaW4gdGhlIGNhc2UgdGhhdCB0aGUgYXBwbGljYXRpb24gd3JpdGVyIG92ZXJyaWRlcyB0aGlzCisJICogZnVuY3Rpb25hbGl0eSBieSBkZWZpbmluZyBjb25maWdUQVNLX1JFVFVSTl9BRERSRVNTLiBDYWxsCisJICogdlRhc2tTd2l0Y2hDb250ZXh0KCkgc28gbGluayB0aW1lIG9wdGltaXphdGlvbiBkb2VzIG5vdCByZW1vdmUgdGhlCisJICogc3ltYm9sLiAqLworCXZUYXNrU3dpdGNoQ29udGV4dCgpOworCXBydlRhc2tFeGl0RXJyb3IoKTsKKworCS8qIFNob3VsZCBub3QgZ2V0IGhlcmUuICovCisJcmV0dXJuIDA7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCB2UG9ydEVuZFNjaGVkdWxlciggdm9pZCApIC8qIFBSSVZJTEVHRURfRlVOQ1RJT04gKi8KK3sKKwkvKiBOb3QgaW1wbGVtZW50ZWQgaW4gcG9ydHMgd2hlcmUgdGhlcmUgaXMgbm90aGluZyB0byByZXR1cm4gdG8uCisJICogQXJ0aWZpY2lhbGx5IGZvcmNlIGFuIGFzc2VydC4gKi8KKwljb25maWdBU1NFUlQoIHVsQ3JpdGljYWxOZXN0aW5nID09IDEwMDBVTCApOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiggY29uZmlnRU5BQkxFX01QVSA9PSAxICkKKwl2b2lkIHZQb3J0U3RvcmVUYXNrTVBVU2V0dGluZ3MoIHhNUFVfU0VUVElOR1MgKnhNUFVTZXR0aW5ncywgY29uc3Qgc3RydWN0IHhNRU1PUllfUkVHSU9OICogY29uc3QgeFJlZ2lvbnMsIFN0YWNrVHlwZV90ICpweEJvdHRvbU9mU3RhY2ssIHVpbnQzMl90IHVsU3RhY2tEZXB0aCApCisJeworCXVpbnQzMl90IHVsUmVnaW9uU3RhcnRBZGRyZXNzLCB1bFJlZ2lvbkVuZEFkZHJlc3MsIHVsUmVnaW9uTnVtYmVyOworCWludDMyX3QgbEluZGV4ID0gMDsKKworCQkvKiBTZXR1cCBNQUlSMC4gKi8KKwkJeE1QVVNldHRpbmdzLT51bE1BSVIwID0gKCAoIHBvcnRNUFVfTk9STUFMX01FTU9SWV9CVUZGRVJBQkxFX0NBQ0hFQUJMRSA8PCBwb3J0TVBVX01BSVJfQVRUUjBfUE9TICkgJiBwb3J0TVBVX01BSVJfQVRUUjBfTUFTSyApOworCQl4TVBVU2V0dGluZ3MtPnVsTUFJUjAgfD0gKCAoIHBvcnRNUFVfREVWSUNFX01FTU9SWV9uR25SRSA8PCBwb3J0TVBVX01BSVJfQVRUUjFfUE9TICkgJiBwb3J0TVBVX01BSVJfQVRUUjFfTUFTSyApOworCisJCS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgdGFzayBpcyBjcmVhdGVkIC0gaW4KKwkJICogd2hpY2ggY2FzZSB0aGUgc3RhY2sgcmVnaW9uIHBhcmFtZXRlcnMgd2lsbCBiZSB2YWxpZC4gIEF0IGFsbCBvdGhlcgorCQkgKiB0aW1lcyB0aGUgc3RhY2sgcGFyYW1ldGVycyB3aWxsIG5vdCBiZSB2YWxpZCBhbmQgaXQgaXMgYXNzdW1lZCB0aGF0CisJCSAqIHRoZSBzdGFjayByZWdpb24gaGFzIGFscmVhZHkgYmVlbiBjb25maWd1cmVkLiAqLworCQlpZiggdWxTdGFja0RlcHRoID4gMCApCisJCXsKKwkJCS8qIERlZmluZSB0aGUgcmVnaW9uIHRoYXQgYWxsb3dzIGFjY2VzcyB0byB0aGUgc3RhY2suICovCisJCQl1bFJlZ2lvblN0YXJ0QWRkcmVzcyA9ICggKCB1aW50MzJfdCApIHB4Qm90dG9tT2ZTdGFjayApICYgcG9ydE1QVV9SQkFSX0FERFJFU1NfTUFTSzsKKwkJCXVsUmVnaW9uRW5kQWRkcmVzcyA9ICggdWludDMyX3QgKSBweEJvdHRvbU9mU3RhY2sgKyAoIHVsU3RhY2tEZXB0aCAqICggdWludDMyX3QgKSBzaXplb2YoIFN0YWNrVHlwZV90ICkgKSAtIDE7CisJCQl1bFJlZ2lvbkVuZEFkZHJlc3MgICY9IHBvcnRNUFVfUkxBUl9BRERSRVNTX01BU0s7CisKKwkJCXhNUFVTZXR0aW5ncy0+eFJlZ2lvbnNTZXR0aW5nc1sgMCBdLnVsUkJBUiA9CSggdWxSZWdpb25TdGFydEFkZHJlc3MgKSB8CisJCQkJCQkJCQkJCQkJCQkoIHBvcnRNUFVfUkVHSU9OX05PTl9TSEFSRUFCTEUgKSB8CisJCQkJCQkJCQkJCQkJCQkoIHBvcnRNUFVfUkVHSU9OX1JFQURfV1JJVEUgKSB8CisJCQkJCQkJCQkJCQkJCQkoIHBvcnRNUFVfUkVHSU9OX0VYRUNVVEVfTkVWRVIgKTsKKworCQkJeE1QVVNldHRpbmdzLT54UmVnaW9uc1NldHRpbmdzWyAwIF0udWxSTEFSID0JKCB1bFJlZ2lvbkVuZEFkZHJlc3MgKSB8CisJCQkJCQkJCQkJCQkJCQkoIHBvcnRNUFVfUkxBUl9BVFRSX0lOREVYMCApIHwKKwkJCQkJCQkJCQkJCQkJCSggcG9ydE1QVV9STEFSX1JFR0lPTl9FTkFCTEUgKTsKKwkJfQorCisJCS8qIFVzZXIgc3VwcGxpZWQgY29uZmlndXJhYmxlIHJlZ2lvbnMuICovCisJCWZvciggdWxSZWdpb25OdW1iZXIgPSAxOyB1bFJlZ2lvbk51bWJlciA8PSBwb3J0TlVNX0NPTkZJR1VSQUJMRV9SRUdJT05TOyB1bFJlZ2lvbk51bWJlcisrICkKKwkJeworCQkJLyogSWYgeFJlZ2lvbnMgaXMgTlVMTCBpLmUuIHRoZSB0YXNrIGhhcyBub3Qgc3BlY2lmaWVkIGFueSBNUFUKKwkJCSAqIHJlZ2lvbiwgdGhlIGVsc2UgcGFydCBlbnN1cmVzIHRoYXQgYWxsIHRoZSBjb25maWd1cmFibGUgTVBVCisJCQkgKiByZWdpb25zIGFyZSBpbnZhbGlkYXRlZC4gKi8KKwkJCWlmKCAoIHhSZWdpb25zICE9IE5VTEwgKSAmJiAoIHhSZWdpb25zWyBsSW5kZXggXS51bExlbmd0aEluQnl0ZXMgPiAwVUwgKSApCisJCQl7CisJCQkJLyogVHJhbnNsYXRlIHRoZSBnZW5lcmljIHJlZ2lvbiBkZWZpbml0aW9uIGNvbnRhaW5lZCBpbiB4UmVnaW9ucworCQkJCSAqIGludG8gdGhlIEFSTXY4IHNwZWNpZmljIE1QVSBzZXR0aW5ncyB0aGF0IGFyZSB0aGVuIHN0b3JlZCBpbgorCQkJCSAqIHhNUFVTZXR0aW5ncy4gKi8KKwkJCQl1bFJlZ2lvblN0YXJ0QWRkcmVzcyA9ICggKCB1aW50MzJfdCApIHhSZWdpb25zWyBsSW5kZXggXS5wdkJhc2VBZGRyZXNzICkgJiBwb3J0TVBVX1JCQVJfQUREUkVTU19NQVNLOworCQkJCXVsUmVnaW9uRW5kQWRkcmVzcyA9ICggdWludDMyX3QgKSB4UmVnaW9uc1sgbEluZGV4IF0ucHZCYXNlQWRkcmVzcyArIHhSZWdpb25zWyBsSW5kZXggXS51bExlbmd0aEluQnl0ZXMgLSAxOworCQkJCXVsUmVnaW9uRW5kQWRkcmVzcyAgJj0gcG9ydE1QVV9STEFSX0FERFJFU1NfTUFTSzsKKworCQkJCS8qIFN0YXJ0IGFkZHJlc3MuICovCisJCQkJeE1QVVNldHRpbmdzLT54UmVnaW9uc1NldHRpbmdzWyB1bFJlZ2lvbk51bWJlciBdLnVsUkJBUiA9CSggdWxSZWdpb25TdGFydEFkZHJlc3MgKSB8CisJCQkJCQkJCQkJCQkJCQkJCQkJKCBwb3J0TVBVX1JFR0lPTl9OT05fU0hBUkVBQkxFICk7CisKKwkJCQkvKiBSTy9SVy4gKi8KKwkJCQlpZiggKCB4UmVnaW9uc1sgbEluZGV4IF0udWxQYXJhbWV0ZXJzICYgdHNrTVBVX1JFR0lPTl9SRUFEX09OTFkgKSAhPSAwICkKKwkJCQl7CisJCQkJCXhNUFVTZXR0aW5ncy0+eFJlZ2lvbnNTZXR0aW5nc1sgdWxSZWdpb25OdW1iZXIgXS51bFJCQVIgfD0gKCBwb3J0TVBVX1JFR0lPTl9SRUFEX09OTFkgKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJeE1QVVNldHRpbmdzLT54UmVnaW9uc1NldHRpbmdzWyB1bFJlZ2lvbk51bWJlciBdLnVsUkJBUiB8PSAoIHBvcnRNUFVfUkVHSU9OX1JFQURfV1JJVEUgKTsKKwkJCQl9CisKKwkJCQkvKiBYTi4gKi8KKwkJCQlpZiggKCB4UmVnaW9uc1sgbEluZGV4IF0udWxQYXJhbWV0ZXJzICYgdHNrTVBVX1JFR0lPTl9FWEVDVVRFX05FVkVSICkgIT0gMCApCisJCQkJeworCQkJCQl4TVBVU2V0dGluZ3MtPnhSZWdpb25zU2V0dGluZ3NbIHVsUmVnaW9uTnVtYmVyIF0udWxSQkFSIHw9ICggcG9ydE1QVV9SRUdJT05fRVhFQ1VURV9ORVZFUiApOworCQkJCX0KKworCQkJCS8qIEVuZCBBZGRyZXNzLiAqLworCQkJCXhNUFVTZXR0aW5ncy0+eFJlZ2lvbnNTZXR0aW5nc1sgdWxSZWdpb25OdW1iZXIgXS51bFJMQVIgPQkoIHVsUmVnaW9uRW5kQWRkcmVzcyApIHwKKwkJCQkJCQkJCQkJCQkJCQkJCQkoIHBvcnRNUFVfUkxBUl9SRUdJT05fRU5BQkxFICk7CisKKwkJCQkvKiBOb3JtYWwgbWVtb3J5LyBEZXZpY2UgbWVtb3J5LiAqLworCQkJCWlmKCAoIHhSZWdpb25zWyBsSW5kZXggXS51bFBhcmFtZXRlcnMgJiB0c2tNUFVfUkVHSU9OX0RFVklDRV9NRU1PUlkgKSAhPSAwICkKKwkJCQl7CisJCQkJCS8qIEF0dHIxIGluIE1BSVIwIGlzIGNvbmZpZ3VyZWQgYXMgZGV2aWNlIG1lbW9yeS4gKi8KKwkJCQkJeE1QVVNldHRpbmdzLT54UmVnaW9uc1NldHRpbmdzWyB1bFJlZ2lvbk51bWJlciBdLnVsUkxBUiB8PSBwb3J0TVBVX1JMQVJfQVRUUl9JTkRFWDE7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCS8qIEF0dHIxIGluIE1BSVIwIGlzIGNvbmZpZ3VyZWQgYXMgbm9ybWFsIG1lbW9yeS4gKi8KKwkJCQkJeE1QVVNldHRpbmdzLT54UmVnaW9uc1NldHRpbmdzWyB1bFJlZ2lvbk51bWJlciBdLnVsUkxBUiB8PSBwb3J0TVBVX1JMQVJfQVRUUl9JTkRFWDA7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8qIEludmFsaWRhdGUgdGhlIHJlZ2lvbi4gKi8KKwkJCQl4TVBVU2V0dGluZ3MtPnhSZWdpb25zU2V0dGluZ3NbIHVsUmVnaW9uTnVtYmVyIF0udWxSQkFSID0gMFVMOworCQkJCXhNUFVTZXR0aW5ncy0+eFJlZ2lvbnNTZXR0aW5nc1sgdWxSZWdpb25OdW1iZXIgXS51bFJMQVIgPSAwVUw7CisJCQl9CisKKwkJCWxJbmRleCsrOworCQl9CisJfQorI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9NUFUgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpkaWZmIC0tZ2l0IGEvU291cmNlL3BvcnRhYmxlL0lBUi9BUk1fQ00zMy9ub25fc2VjdXJlL3BvcnRhc20uaCBiL1NvdXJjZS9wb3J0YWJsZS9JQVIvQVJNX0NNMzMvbm9uX3NlY3VyZS9wb3J0YXNtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmVjZjA0ZQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9wb3J0YWJsZS9JQVIvQVJNX0NNMzMvbm9uX3NlY3VyZS9wb3J0YXNtLmgKQEAgLTAsMCArMSwxMTMgQEAKKy8qCisgKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjIuMQorICogQ29weXJpZ2h0IChDKSAyMDE5IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKKyAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCisgKiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCisgKiB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZgorICogdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLAorICogc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCisgKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUworICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SCisgKiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIKKyAqIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIGh0dHA6Ly93d3cuRnJlZVJUT1Mub3JnCisgKiBodHRwOi8vYXdzLmFtYXpvbi5jb20vZnJlZXJ0b3MKKyAqCisgKiAxIHRhYiA9PSA0IHNwYWNlcyEKKyAqLworCisjaWZuZGVmIF9fUE9SVF9BU01fSF9fCisjZGVmaW5lIF9fUE9SVF9BU01fSF9fCisKKy8qIFNjaGVkdWxlciBpbmNsdWRlcy4gKi8KKyNpbmNsdWRlICJGcmVlUlRPUy5oIgorCisvKiBNUFUgd3JhcHBlcnMgaW5jbHVkZXMuICovCisjaW5jbHVkZSAibXB1X3dyYXBwZXJzLmgiCisKKy8qKgorICogQGJyaWVmIFJlc3RvcmUgdGhlIGNvbnRleHQgb2YgdGhlIGZpcnN0IHRhc2sgc28gdGhhdCB0aGUgZmlyc3QgdGFzayBzdGFydHMKKyAqIGV4ZWN1dGluZy4KKyAqLwordm9pZCB2UmVzdG9yZUNvbnRleHRPZkZpcnN0VGFzayggdm9pZCApIF9fYXR0cmlidXRlX18gKCggbmFrZWQgKSkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworLyoqCisgKiBAYnJpZWYgQ2hlY2tzIHdoZXRoZXIgb3Igbm90IHRoZSBwcm9jZXNzb3IgaXMgcHJpdmlsZWdlZC4KKyAqCisgKiBAcmV0dXJuIDEgaWYgdGhlIHByb2Nlc3NvciBpcyBhbHJlYWR5IHByaXZpbGVnZWQsIDAgb3RoZXJ3aXNlLgorICovCitCYXNlVHlwZV90IHhJc1ByaXZpbGVnZWQoIHZvaWQgKSBfX2F0dHJpYnV0ZV9fICgoIG5ha2VkICkpOworCisvKioKKyAqIEBicmllZiBSYWlzZXMgdGhlIHByaXZpbGVnZSBsZXZlbCBieSBjbGVhcmluZyB0aGUgYml0IDAgb2YgdGhlIENPTlRST0wKKyAqIHJlZ2lzdGVyLgorICoKKyAqIEBub3RlIFRoaXMgaXMgYSBwcml2aWxlZ2VkIGZ1bmN0aW9uIGFuZCBzaG91bGQgb25seSBiZSBjYWxsZWQgZnJvbSB0aGUga2VucmVsCisgKiBjb2RlLgorICoKKyAqIEJpdCAwIG9mIHRoZSBDT05UUk9MIHJlZ2lzdGVyIGRlZmluZXMgdGhlIHByaXZpbGVnZSBsZXZlbCBvZiBUaHJlYWQgTW9kZS4KKyAqICBCaXRbMF0gPSAwIC0tPiBUaGUgcHJvY2Vzc29yIGlzIHJ1bm5pbmcgcHJpdmlsZWdlZAorICogIEJpdFswXSA9IDEgLS0+IFRoZSBwcm9jZXNzb3IgaXMgcnVubmluZyB1bnByaXZpbGVnZWQuCisgKi8KK3ZvaWQgdlJhaXNlUHJpdmlsZWdlKCB2b2lkICkgX19hdHRyaWJ1dGVfXyAoKCBuYWtlZCApKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisvKioKKyAqIEBicmllZiBMb3dlcnMgdGhlIHByaXZpbGVnZSBsZXZlbCBieSBzZXR0aW5nIHRoZSBiaXQgMCBvZiB0aGUgQ09OVFJPTAorICogcmVnaXN0ZXIuCisgKgorICogQml0IDAgb2YgdGhlIENPTlRST0wgcmVnaXN0ZXIgZGVmaW5lcyB0aGUgcHJpdmlsZWdlIGxldmVsIG9mIFRocmVhZCBNb2RlLgorICogIEJpdFswXSA9IDAgLS0+IFRoZSBwcm9jZXNzb3IgaXMgcnVubmluZyBwcml2aWxlZ2VkCisgKiAgQml0WzBdID0gMSAtLT4gVGhlIHByb2Nlc3NvciBpcyBydW5uaW5nIHVucHJpdmlsZWdlZC4KKyAqLwordm9pZCB2UmVzZXRQcml2aWxlZ2UoIHZvaWQgKSBfX2F0dHJpYnV0ZV9fICgoIG5ha2VkICkpOworCisvKioKKyAqIEBicmllZiBTdGFydHMgdGhlIGZpcnN0IHRhc2suCisgKi8KK3ZvaWQgdlN0YXJ0Rmlyc3RUYXNrKCB2b2lkICkgX19hdHRyaWJ1dGVfXyAoKCBuYWtlZCApKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisvKioKKyAqIEBicmllZiBEaXNhYmxlcyBpbnRlcnJ1cHRzLgorICovCit1aW50MzJfdCB1bFNldEludGVycnVwdE1hc2tGcm9tSVNSKCB2b2lkICkgX19hdHRyaWJ1dGVfXygoIG5ha2VkICkpIFBSSVZJTEVHRURfRlVOQ1RJT047CisKKy8qKgorICogQGJyaWVmIEVuYWJsZXMgaW50ZXJydXB0cy4KKyAqLwordm9pZCB2Q2xlYXJJbnRlcnJ1cHRNYXNrRnJvbUlTUiggdWludDMyX3QgdWxNYXNrICkgX19hdHRyaWJ1dGVfXygoIG5ha2VkICkpIFBSSVZJTEVHRURfRlVOQ1RJT047CisKKy8qKgorICogQGJyaWVmIFBlbmRTViBFeGNlcHRpb24gaGFuZGxlci4KKyAqLwordm9pZCBQZW5kU1ZfSGFuZGxlciggdm9pZCApIF9fYXR0cmlidXRlX18gKCggbmFrZWQgKSkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworLyoqCisgKiBAYnJpZWYgU1ZDIEhhbmRsZXIuCisgKi8KK3ZvaWQgU1ZDX0hhbmRsZXIoIHZvaWQgKSBfX2F0dHJpYnV0ZV9fICgoIG5ha2VkICkpIFBSSVZJTEVHRURfRlVOQ1RJT047CisKKy8qKgorICogQGJyaWVmIEFsbG9jYXRlIGEgU2VjdXJlIGNvbnRleHQgZm9yIHRoZSBjYWxsaW5nIHRhc2suCisgKgorICogQHBhcmFtW2luXSB1bFNlY3VyZVN0YWNrU2l6ZSBUaGUgc2l6ZSBvZiB0aGUgc3RhY2sgdG8gYmUgYWxsb2NhdGVkIG9uIHRoZQorICogc2VjdXJlIHNpZGUgZm9yIHRoZSBjYWxsaW5nIHRhc2suCisgKi8KK3ZvaWQgdlBvcnRBbGxvY2F0ZVNlY3VyZUNvbnRleHQoIHVpbnQzMl90IHVsU2VjdXJlU3RhY2tTaXplICkgX19hdHRyaWJ1dGVfXyAoKCBuYWtlZCApKTsKKworLyoqCisgKiBAYnJpZWYgRnJlZSB0aGUgdGFzaydzIHNlY3VyZSBjb250ZXh0LgorICoKKyAqIEBwYXJhbVtpbl0gcHVsVENCIFBvaW50ZXIgdG8gdGhlIFRhc2sgQ29udHJvbCBCbG9jayAoVENCKSBvZiB0aGUgdGFzay4KKyAqLwordm9pZCB2UG9ydEZyZWVTZWN1cmVDb250ZXh0KCB1aW50MzJfdCAqcHVsVENCICkgX19hdHRyaWJ1dGVfXyAoKCBuYWtlZCApKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisjZW5kaWYgLyogX19QT1JUX0FTTV9IX18gKi8KZGlmZiAtLWdpdCBhL1NvdXJjZS9wb3J0YWJsZS9JQVIvQVJNX0NNMzMvbm9uX3NlY3VyZS9wb3J0YXNtLnMgYi9Tb3VyY2UvcG9ydGFibGUvSUFSL0FSTV9DTTMzL25vbl9zZWN1cmUvcG9ydGFzbS5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzODEwNGMKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvcG9ydGFibGUvSUFSL0FSTV9DTTMzL25vbl9zZWN1cmUvcG9ydGFzbS5zCkBAIC0wLDAgKzEsMzI2IEBACisvKgorICogRnJlZVJUT1MgS2VybmVsIFYxMC4yLjEKKyAqIENvcHlyaWdodCAoQykgMjAxOSBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCisgKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgorICogdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bworICogdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YKKyAqIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKKyAqIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAorICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MKKyAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUgorICogQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSCisgKiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBodHRwOi8vd3d3LkZyZWVSVE9TLm9yZworICogaHR0cDovL2F3cy5hbWF6b24uY29tL2ZyZWVydG9zCisgKgorICogMSB0YWIgPT0gNCBzcGFjZXMhCisgKi8KKworCUVYVEVSTiBweEN1cnJlbnRUQ0IKKwlFWFRFUk4geFNlY3VyZUNvbnRleHQKKwlFWFRFUk4gdlRhc2tTd2l0Y2hDb250ZXh0CisJRVhURVJOIHZQb3J0U1ZDSGFuZGxlcl9DCisJRVhURVJOIFNlY3VyZUNvbnRleHRfU2F2ZUNvbnRleHQKKwlFWFRFUk4gU2VjdXJlQ29udGV4dF9Mb2FkQ29udGV4dAorCisJUFVCTElDIHhJc1ByaXZpbGVnZWQKKwlQVUJMSUMgdlJlc2V0UHJpdmlsZWdlCisJUFVCTElDIHZQb3J0QWxsb2NhdGVTZWN1cmVDb250ZXh0CisJUFVCTElDIHZSZXN0b3JlQ29udGV4dE9mRmlyc3RUYXNrCisJUFVCTElDIHZSYWlzZVByaXZpbGVnZQorCVBVQkxJQyB2U3RhcnRGaXJzdFRhc2sKKwlQVUJMSUMgdWxTZXRJbnRlcnJ1cHRNYXNrRnJvbUlTUgorCVBVQkxJQyB2Q2xlYXJJbnRlcnJ1cHRNYXNrRnJvbUlTUgorCVBVQkxJQyBQZW5kU1ZfSGFuZGxlcgorCVBVQkxJQyBTVkNfSGFuZGxlcgorCVBVQkxJQyB2UG9ydEZyZWVTZWN1cmVDb250ZXh0CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tIFVucHJpdmlsZWdlZCBGdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJU0VDVElPTiAudGV4dDpDT0RFOk5PUk9PVCgyKQorCVRIVU1CCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworeElzUHJpdmlsZWdlZDoKKwltcnMgcjAsIGNvbnRyb2wJCQkJCQkJLyogcjAgPSBDT05UUk9MLiAqLworCXRzdCByMCwgIzEJCQkJCQkJCS8qIFBlcmZvcm0gcjAgJiAxIChiaXR3aXNlIEFORCkgYW5kIHVwZGF0ZSB0aGUgY29uZGl0aW9ucyBmbGFnLiAqLworCWl0ZSBuZQorCW1vdm5lIHIwLCAjMAkJCQkJCQkvKiBDT05UUk9MWzBdIT0wLiBSZXR1cm4gZmFsc2UgdG8gaW5kaWNhdGUgdGhhdCB0aGUgcHJvY2Vzc29yIGlzIG5vdCBwcml2aWxlZ2VkLiAqLworCW1vdmVxIHIwLCAjMQkJCQkJCQkvKiBDT05UUk9MWzBdPT0wLiBSZXR1cm4gdHJ1ZSB0byBpbmRpY2F0ZSB0aGF0IHRoZSBwcm9jZXNzb3IgaXMgbm90IHByaXZpbGVnZWQuICovCisJYnggbHIJCQkJCQkJCQkvKiBSZXR1cm4uICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordlJlc2V0UHJpdmlsZWdlOgorCW1ycyByMCwgY29udHJvbAkJCQkJCQkvKiByMCA9IENPTlRST0wuICovCisJb3JyIHIwLCByMCwgIzEJCQkJCQkJLyogcjAgPSByMCB8IDEuICovCisJbXNyIGNvbnRyb2wsIHIwCQkJCQkJCS8qIENPTlRST0wgPSByMC4gKi8KKwlieCBscgkJCQkJCQkJCS8qIFJldHVybiB0byB0aGUgY2FsbGVyLiAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZQb3J0QWxsb2NhdGVTZWN1cmVDb250ZXh0OgorCXN2YyAwCQkJCQkJCQkJLyogU2VjdXJlIGNvbnRleHQgaXMgYWxsb2NhdGVkIGluIHRoZSBzdXBlcnZpc29yIGNhbGwuIHBvcnRTVkNfQUxMT0NBVEVfU0VDVVJFX0NPTlRFWFQgPSAwLiAqLworCWJ4IGxyCQkJCQkJCQkJLyogUmV0dXJuLiAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0gUHJpdmlsZWdlZCBGdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCVNFQ1RJT04gcHJpdmlsZWdlZF9mdW5jdGlvbnM6Q09ERTpOT1JPT1QoMikKKwlUSFVNQgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZSZXN0b3JlQ29udGV4dE9mRmlyc3RUYXNrOgorCWxkciAgcjIsID1weEN1cnJlbnRUQ0IJCQkJCS8qIFJlYWQgdGhlIGxvY2F0aW9uIG9mIHB4Q3VycmVudFRDQiBpLmUuICYoIHB4Q3VycmVudFRDQiApLiAqLworCWxkciAgcjMsIFtyMl0JCQkJCQkJLyogUmVhZCBweEN1cnJlbnRUQ0IuICovCisJbGRyICByMCwgW3IzXQkJCQkJCQkvKiBSZWFkIHRvcCBvZiBzdGFjayBmcm9tIFRDQiAtIFRoZSBmaXJzdCBpdGVtIGluIHB4Q3VycmVudFRDQiBpcyB0aGUgdGFzayB0b3Agb2Ygc3RhY2suICovCisKKyNpZiAoIGNvbmZpZ0VOQUJMRV9NUFUgPT0gMSApCisJZG1iCQkJCQkJCQkJCS8qIENvbXBsZXRlIG91dHN0YW5kaW5nIHRyYW5zZmVycyBiZWZvcmUgZGlzYWJsaW5nIE1QVS4gKi8KKwlsZHIgcjIsID0weGUwMDBlZDk0CQkJCQkJLyogcjIgPSAweGUwMDBlZDk0IFtMb2NhdGlvbiBvZiBNUFVfQ1RSTF0uICovCisJbGRyIHI0LCBbcjJdCQkJCQkJCS8qIFJlYWQgdGhlIHZhbHVlIG9mIE1QVV9DVFJMLiAqLworCWJpYyByNCwgcjQsICMxCQkJCQkJCS8qIHI0ID0gcjQgJiB+MSBpLmUuIENsZWFyIHRoZSBiaXQgMCBpbiByNC4gKi8KKwlzdHIgcjQsIFtyMl0JCQkJCQkJLyogRGlzYWJsZSBNUFUuICovCisKKwlhZGRzIHIzLCAjNAkJCQkJCQkJLyogcjMgPSByMyArIDQuIHIzIG5vdyBwb2ludHMgdG8gTUFJUjAgaW4gVENCLiAqLworCWxkciAgcjQsIFtyM10JCQkJCQkJLyogcjQgPSAqcjMgaS5lLiByNCA9IE1BSVIwLiAqLworCWxkciAgcjIsID0weGUwMDBlZGMwCQkJCQkvKiByMiA9IDB4ZTAwMGVkYzAgW0xvY2F0aW9uIG9mIE1BSVIwXS4gKi8KKwlzdHIgIHI0LCBbcjJdCQkJCQkJCS8qIFByb2dyYW0gTUFJUjAuICovCisJbGRyICByMiwgPTB4ZTAwMGVkOTgJCQkJCS8qIHIyID0gMHhlMDAwZWQ5OCBbTG9jYXRpb24gb2YgUk5SXS4gKi8KKwltb3ZzIHI0LCAjNAkJCQkJCQkJLyogcjQgPSA0LiAqLworCXN0ciAgcjQsIFtyMl0JCQkJCQkJLyogUHJvZ3JhbSBSTlIgPSA0LiAqLworCWFkZHMgcjMsICM0CQkJCQkJCQkvKiByMyA9IHIzICsgNC4gcjMgbm93IHBvaW50cyB0byBmaXJzdCBSQkFSIGluIFRDQi4gKi8KKwlsZHIgIHIyLCA9MHhlMDAwZWQ5YwkJCQkJLyogcjIgPSAweGUwMDBlZDljIFtMb2NhdGlvbiBvZiBSQkFSXS4gKi8KKwlsZG1pYSByMyEsIHtyNC1yMTF9CQkJCQkJLyogUmVhZCA0IHNldCBvZiBSQkFSL1JMQVIgcmVnaXN0ZXJzIGZyb20gVENCLiAqLworCXN0bWlhIHIyISwge3I0LXIxMX0JCQkJCQkvKiBXcml0ZSA0IHNldCBvZiBSQkFSL1JMQVIgcmVnaXN0ZXJzIHVzaW5nIGFsaWFzIHJlZ2lzdGVycy4gKi8KKworCWxkciByMiwgPTB4ZTAwMGVkOTQJCQkJCQkvKiByMiA9IDB4ZTAwMGVkOTQgW0xvY2F0aW9uIG9mIE1QVV9DVFJMXS4gKi8KKwlsZHIgcjQsIFtyMl0JCQkJCQkJLyogUmVhZCB0aGUgdmFsdWUgb2YgTVBVX0NUUkwuICovCisJb3JyIHI0LCByNCwgIzEJCQkJCQkJLyogcjQgPSByNCB8IDEgaS5lLiBTZXQgdGhlIGJpdCAwIGluIHI0LiAqLworCXN0ciByNCwgW3IyXQkJCQkJCQkvKiBFbmFibGUgTVBVLiAqLworCWRzYgkJCQkJCQkJCQkvKiBGb3JjZSBtZW1vcnkgd3JpdGVzIGJlZm9yZSBjb250aW51aW5nLiAqLworI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9NUFUgKi8KKworI2lmICggY29uZmlnRU5BQkxFX01QVSA9PSAxICkKKwlsZG0gIHIwISwge3IxLXI0fQkJCQkJCS8qIFJlYWQgZnJvbSBzdGFjayAtIHIxID0geFNlY3VyZUNvbnRleHQsIHIyID0gUFNQTElNLCByMyA9IENPTlRST0wgYW5kIHI0ID0gRVhDX1JFVFVSTi4gKi8KKwlsZHIgIHI1LCA9eFNlY3VyZUNvbnRleHQKKwlzdHIgIHIxLCBbcjVdCQkJCQkJCS8qIFNldCB4U2VjdXJlQ29udGV4dCB0byB0aGlzIHRhc2sncyB2YWx1ZSBmb3IgdGhlIHNhbWUuICovCisJbXNyICBwc3BsaW0sIHIyCQkJCQkJCS8qIFNldCB0aGlzIHRhc2sncyBQU1BMSU0gdmFsdWUuICovCisJbXNyICBjb250cm9sLCByMwkJCQkJCS8qIFNldCB0aGlzIHRhc2sncyBDT05UUk9MIHZhbHVlLiAqLworCWFkZHMgcjAsICMzMgkJCQkJCQkvKiBEaXNjYXJkIGV2ZXJ5dGhpbmcgdXAgdG8gcjAuICovCisJbXNyICBwc3AsIHIwCQkJCQkJCS8qIFRoaXMgaXMgbm93IHRoZSBuZXcgdG9wIG9mIHN0YWNrIHRvIHVzZSBpbiB0aGUgdGFzay4gKi8KKwlpc2IKKwlieCAgIHI0CQkJCQkJCQkJLyogRmluYWxseSwgYnJhbmNoIHRvIEVYQ19SRVRVUk4uICovCisjZWxzZSAvKiBjb25maWdFTkFCTEVfTVBVICovCisJbGRtICByMCEsIHtyMS1yM30JCQkJCQkvKiBSZWFkIGZyb20gc3RhY2sgLSByMSA9IHhTZWN1cmVDb250ZXh0LCByMiA9IFBTUExJTSBhbmQgcjMgPSBFWENfUkVUVVJOLiAqLworCWxkciAgcjQsID14U2VjdXJlQ29udGV4dAorCXN0ciAgcjEsIFtyNF0JCQkJCQkJLyogU2V0IHhTZWN1cmVDb250ZXh0IHRvIHRoaXMgdGFzaydzIHZhbHVlIGZvciB0aGUgc2FtZS4gKi8KKwltc3IgIHBzcGxpbSwgcjIJCQkJCQkJLyogU2V0IHRoaXMgdGFzaydzIFBTUExJTSB2YWx1ZS4gKi8KKwltb3ZzIHIxLCAjMgkJCQkJCQkJLyogcjEgPSAyLiAqLworCW1zciAgQ09OVFJPTCwgcjEJCQkJCQkvKiBTd2l0Y2ggdG8gdXNlIFBTUCBpbiB0aGUgdGhyZWFkIG1vZGUuICovCisJYWRkcyByMCwgIzMyCQkJCQkJCS8qIERpc2NhcmQgZXZlcnl0aGluZyB1cCB0byByMC4gKi8KKwltc3IgIHBzcCwgcjAJCQkJCQkJLyogVGhpcyBpcyBub3cgdGhlIG5ldyB0b3Agb2Ygc3RhY2sgdG8gdXNlIGluIHRoZSB0YXNrLiAqLworCWlzYgorCWJ4ICAgcjMJCQkJCQkJCQkvKiBGaW5hbGx5LCBicmFuY2ggdG8gRVhDX1JFVFVSTi4gKi8KKyNlbmRpZiAvKiBjb25maWdFTkFCTEVfTVBVICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordlJhaXNlUHJpdmlsZWdlOgorCW1ycyAgcjAsIGNvbnRyb2wJCQkJCQkvKiBSZWFkIHRoZSBDT05UUk9MIHJlZ2lzdGVyLiAqLworCWJpYyByMCwgcjAsICMxCQkJCQkJCS8qIENsZWFyIHRoZSBiaXQgMC4gKi8KKwltc3IgIGNvbnRyb2wsIHIwCQkJCQkJLyogV3JpdGUgYmFjayB0aGUgbmV3IENPTlRST0wgdmFsdWUuICovCisJYnggbHIJCQkJCQkJCQkvKiBSZXR1cm4gdG8gdGhlIGNhbGxlci4gKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2U3RhcnRGaXJzdFRhc2s6CisJbGRyIHIwLCA9MHhlMDAwZWQwOAkJCQkJCS8qIFVzZSB0aGUgTlZJQyBvZmZzZXQgcmVnaXN0ZXIgdG8gbG9jYXRlIHRoZSBzdGFjay4gKi8KKwlsZHIgcjAsIFtyMF0JCQkJCQkJLyogUmVhZCB0aGUgVlRPUiByZWdpc3RlciB3aGljaCBnaXZlcyB0aGUgYWRkcmVzcyBvZiB2ZWN0b3IgdGFibGUuICovCisJbGRyIHIwLCBbcjBdCQkJCQkJCS8qIFRoZSBmaXJzdCBlbnRyeSBpbiB2ZWN0b3IgdGFibGUgaXMgc3RhY2sgcG9pbnRlci4gKi8KKwltc3IgbXNwLCByMAkJCQkJCQkJLyogU2V0IHRoZSBNU1AgYmFjayB0byB0aGUgc3RhcnQgb2YgdGhlIHN0YWNrLiAqLworCWNwc2llIGkJCQkJCQkJCQkvKiBHbG9iYWxseSBlbmFibGUgaW50ZXJydXB0cy4gKi8KKwljcHNpZSBmCisJZHNiCisJaXNiCisJc3ZjIDIJCQkJCQkJCQkvKiBTeXN0ZW0gY2FsbCB0byBzdGFydCB0aGUgZmlyc3QgdGFzay4gcG9ydFNWQ19TVEFSVF9TQ0hFRFVMRVIgPSAyLiAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3VsU2V0SW50ZXJydXB0TWFza0Zyb21JU1I6CisJbXJzIHIwLCBQUklNQVNLCisJY3BzaWQgaQorCWJ4IGxyCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordkNsZWFySW50ZXJydXB0TWFza0Zyb21JU1I6CisJbXNyIFBSSU1BU0ssIHIwCisJYnggbHIKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitQZW5kU1ZfSGFuZGxlcjoKKwltcnMgcjEsIHBzcAkJCQkJCQkJLyogUmVhZCBQU1AgaW4gcjEuICovCisJbGRyIHIyLCA9eFNlY3VyZUNvbnRleHQJCQkJCS8qIFJlYWQgdGhlIGxvY2F0aW9uIG9mIHhTZWN1cmVDb250ZXh0IGkuZS4gJiggeFNlY3VyZUNvbnRleHQgKS4gKi8KKwlsZHIgcjAsIFtyMl0JCQkJCQkJLyogUmVhZCB4U2VjdXJlQ29udGV4dCAtIFZhbHVlIG9mIHhTZWN1cmVDb250ZXh0IG11c3QgYmUgaW4gcjAgYXMgaXQgaXMgdXNlZCBhcyBhIHBhcmFtZXRlciBsYXRlci4gKi8KKworCWNieiByMCwgc2F2ZV9uc19jb250ZXh0CQkJCQkvKiBObyBzZWN1cmUgY29udGV4dCB0byBzYXZlLiAqLworCXB1c2gge3IwLXIyLCByMTR9CisJYmwgU2VjdXJlQ29udGV4dF9TYXZlQ29udGV4dAorCXBvcCB7cjAtcjN9CQkJCQkJCQkvKiBMUiBpcyBub3cgaW4gcjMuICovCisJbW92IGxyLCByMwkJCQkJCQkJLyogTFIgPSByMy4gKi8KKwlsc2xzIHIyLCByMywgIzI1CQkJCQkJLyogcjIgPSByMyA8PCAyNS4gQml0WzZdIG9mIEVYQ19SRVRVUk4gaXMgMSBpZiBzZWN1cmUgc3RhY2sgd2FzIHVzZWQsIDAgaWYgbm9uLXNlY3VyZSBzdGFjayB3YXMgdXNlZCB0byBzdG9yZSBzdGFjayBmcmFtZS4gKi8KKwlicGwgc2F2ZV9uc19jb250ZXh0CQkJCQkJLyogYnBsIC0gYnJhbmNoIGlmIHBvc2l0aXZlIG9yIHplcm8uIElmIHIyID49IDAgPT0+IEJpdFs2XSBpbiBFWENfUkVUVVJOIGlzIDAgaS5lLiBub24tc2VjdXJlIHN0YWNrIHdhcyB1c2VkLiAqLworCWxkciByMywgPXB4Q3VycmVudFRDQgkJCQkJLyogUmVhZCB0aGUgbG9jYXRpb24gb2YgcHhDdXJyZW50VENCIGkuZS4gJiggcHhDdXJyZW50VENCICkuICovCisJbGRyIHIyLCBbcjNdCQkJCQkJCS8qIFJlYWQgcHhDdXJyZW50VENCLiAqLworI2lmICggY29uZmlnRU5BQkxFX01QVSA9PSAxICkKKwlzdWJzIHIxLCByMSwgIzE2CQkJCQkJLyogTWFrZSBzcGFjZSBmb3IgeFNlY3VyZUNvbnRleHQsIFBTUExJTSwgQ09OVFJPTCBhbmQgTFIgb24gdGhlIHN0YWNrLiAqLworCXN0ciByMSwgW3IyXQkJCQkJCQkvKiBTYXZlIHRoZSBuZXcgdG9wIG9mIHN0YWNrIGluIFRDQi4gKi8KKwltcnMgcjIsIHBzcGxpbQkJCQkJCQkvKiByMiA9IFBTUExJTS4gKi8KKwltcnMgcjMsIGNvbnRyb2wJCQkJCQkJLyogcjMgPSBDT05UUk9MLiAqLworCW1vdiByNCwgbHIJCQkJCQkJCS8qIHI0ID0gTFIvRVhDX1JFVFVSTi4gKi8KKwlzdG1pYSByMSEsIHtyMCwgcjItcjR9CQkJCQkvKiBTdG9yZSB4U2VjdXJlQ29udGV4dCwgUFNQTElNLCBDT05UUk9MIGFuZCBMUiBvbiB0aGUgc3RhY2suICovCisjZWxzZSAvKiBjb25maWdFTkFCTEVfTVBVICovCisJc3VicyByMSwgcjEsICMxMgkJCQkJCS8qIE1ha2Ugc3BhY2UgZm9yIHhTZWN1cmVDb250ZXh0LCBQU1BMSU0gYW5kIExSIG9uIHRoZSBzdGFjay4gKi8KKwlzdHIgcjEsIFtyMl0JCQkJCQkJLyogU2F2ZSB0aGUgbmV3IHRvcCBvZiBzdGFjayBpbiBUQ0IuICovCisJbXJzIHIyLCBwc3BsaW0JCQkJCQkJLyogcjIgPSBQU1BMSU0uICovCisJbW92IHIzLCBscgkJCQkJCQkJLyogcjMgPSBMUi9FWENfUkVUVVJOLiAqLworCXN0bWlhIHIxISwge3IwLCByMi1yM30JCQkJCS8qIFN0b3JlIHhTZWN1cmVDb250ZXh0LCBQU1BMSU0gYW5kIExSIG9uIHRoZSBzdGFjay4gKi8KKyNlbmRpZiAvKiBjb25maWdFTkFCTEVfTVBVICovCisJYiBzZWxlY3RfbmV4dF90YXNrCisKKwlzYXZlX25zX2NvbnRleHQ6CisJCWxkciByMywgPXB4Q3VycmVudFRDQgkJCQkvKiBSZWFkIHRoZSBsb2NhdGlvbiBvZiBweEN1cnJlbnRUQ0IgaS5lLiAmKCBweEN1cnJlbnRUQ0IgKS4gKi8KKwkJbGRyIHIyLCBbcjNdCQkJCQkJLyogUmVhZCBweEN1cnJlbnRUQ0IuICovCisJI2lmICggY29uZmlnRU5BQkxFX0ZQVSA9PSAxICkKKwkJdHN0IGxyLCAjMHgxMAkJCQkJCS8qIFRlc3QgQml0WzRdIGluIExSLiBCaXRbNF0gb2YgRVhDX1JFVFVSTiBpcyAwIGlmIHRoZSBGUFUgaXMgaW4gdXNlLiAqLworCQlpdCBlcQorCQl2c3RtZGJlcSByMSEsIHtzMTYtczMxfQkJCQkvKiBTdG9yZSB0aGUgRlBVIHJlZ2lzdGVycyB3aGljaCBhcmUgbm90IHNhdmVkIGF1dG9tYXRpY2FsbHkuICovCisJI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9GUFUgKi8KKwkjaWYgKCBjb25maWdFTkFCTEVfTVBVID09IDEgKQorCQlzdWJzIHIxLCByMSwgIzQ4CQkJCQkvKiBNYWtlIHNwYWNlIGZvciB4U2VjdXJlQ29udGV4dCwgUFNQTElNLCBDT05UUk9MLCBMUiBhbmQgdGhlIHJlbWFpbmluZyByZWdpc3RlcnMgb24gdGhlIHN0YWNrLiAqLworCQlzdHIgcjEsIFtyMl0JCQkJCQkvKiBTYXZlIHRoZSBuZXcgdG9wIG9mIHN0YWNrIGluIFRDQi4gKi8KKwkJYWRkcyByMSwgcjEsICMxNgkJCQkJLyogcjEgPSByMSArIDE2LiAqLworCQlzdG0gcjEsIHtyNC1yMTF9CQkJCQkvKiBTdG9yZSB0aGUgcmVnaXN0ZXJzIHRoYXQgYXJlIG5vdCBzYXZlZCBhdXRvbWF0aWNhbGx5LiAqLworCQltcnMgcjIsIHBzcGxpbQkJCQkJCS8qIHIyID0gUFNQTElNLiAqLworCQltcnMgcjMsIGNvbnRyb2wJCQkJCQkvKiByMyA9IENPTlRST0wuICovCisJCW1vdiByNCwgbHIJCQkJCQkJLyogcjQgPSBMUi9FWENfUkVUVVJOLiAqLworCQlzdWJzIHIxLCByMSwgIzE2CQkJCQkvKiByMSA9IHIxIC0gMTYuICovCisJCXN0bSByMSwge3IwLCByMi1yNH0JCQkJCS8qIFN0b3JlIHhTZWN1cmVDb250ZXh0LCBQU1BMSU0sIENPTlRST0wgYW5kIExSIG9uIHRoZSBzdGFjay4gKi8KKwkjZWxzZSAvKiBjb25maWdFTkFCTEVfTVBVICovCisJCXN1YnMgcjEsIHIxLCAjNDQJCQkJCS8qIE1ha2Ugc3BhY2UgZm9yIHhTZWN1cmVDb250ZXh0LCBQU1BMSU0sIExSIGFuZCB0aGUgcmVtYWluaW5nIHJlZ2lzdGVycyBvbiB0aGUgc3RhY2suICovCisJCXN0ciByMSwgW3IyXQkJCQkJCS8qIFNhdmUgdGhlIG5ldyB0b3Agb2Ygc3RhY2sgaW4gVENCLiAqLworCQlhZGRzIHIxLCByMSwgIzEyCQkJCQkvKiByMSA9IHIxICsgMTIuICovCisJCXN0bSByMSwge3I0LXIxMX0JCQkJCS8qIFN0b3JlIHRoZSByZWdpc3RlcnMgdGhhdCBhcmUgbm90IHNhdmVkIGF1dG9tYXRpY2FsbHkuICovCisJCW1ycyByMiwgcHNwbGltCQkJCQkJLyogcjIgPSBQU1BMSU0uICovCisJCW1vdiByMywgbHIJCQkJCQkJLyogcjMgPSBMUi9FWENfUkVUVVJOLiAqLworCQlzdWJzIHIxLCByMSwgIzEyCQkJCQkvKiByMSA9IHIxIC0gMTIuICovCisJCXN0bWlhIHIxISwge3IwLCByMi1yM30JCQkJLyogU3RvcmUgeFNlY3VyZUNvbnRleHQsIFBTUExJTSBhbmQgTFIgb24gdGhlIHN0YWNrLiAqLworCSNlbmRpZiAvKiBjb25maWdFTkFCTEVfTVBVICovCisKKwlzZWxlY3RfbmV4dF90YXNrOgorCQljcHNpZCBpCisJCWJsIHZUYXNrU3dpdGNoQ29udGV4dAorCQljcHNpZSBpCisKKwkJbGRyIHIyLCA9cHhDdXJyZW50VENCCQkJCS8qIFJlYWQgdGhlIGxvY2F0aW9uIG9mIHB4Q3VycmVudFRDQiBpLmUuICYoIHB4Q3VycmVudFRDQiApLiAqLworCQlsZHIgcjMsIFtyMl0JCQkJCQkvKiBSZWFkIHB4Q3VycmVudFRDQi4gKi8KKwkJbGRyIHIxLCBbcjNdCQkJCQkJLyogVGhlIGZpcnN0IGl0ZW0gaW4gcHhDdXJyZW50VENCIGlzIHRoZSB0YXNrIHRvcCBvZiBzdGFjay4gcjEgbm93IHBvaW50cyB0byB0aGUgdG9wIG9mIHN0YWNrLiAqLworCisJI2lmICggY29uZmlnRU5BQkxFX01QVSA9PSAxICkKKwkJZG1iCQkJCQkJCQkJLyogQ29tcGxldGUgb3V0c3RhbmRpbmcgdHJhbnNmZXJzIGJlZm9yZSBkaXNhYmxpbmcgTVBVLiAqLworCQlsZHIgcjIsID0weGUwMDBlZDk0CQkJCQkvKiByMiA9IDB4ZTAwMGVkOTQgW0xvY2F0aW9uIG9mIE1QVV9DVFJMXS4gKi8KKwkJbGRyIHI0LCBbcjJdCQkJCQkJLyogUmVhZCB0aGUgdmFsdWUgb2YgTVBVX0NUUkwuICovCisJCWJpYyByNCwgcjQsICMxCQkJCQkJLyogcjQgPSByNCAmIH4xIGkuZS4gQ2xlYXIgdGhlIGJpdCAwIGluIHI0LiAqLworCQlzdHIgcjQsIFtyMl0JCQkJCQkvKiBEaXNhYmxlIE1QVS4gKi8KKworCQlhZGRzIHIzLCAjNAkJCQkJCQkvKiByMyA9IHIzICsgNC4gcjMgbm93IHBvaW50cyB0byBNQUlSMCBpbiBUQ0IuICovCisJCWxkciByNCwgW3IzXQkJCQkJCS8qIHI0ID0gKnIzIGkuZS4gcjQgPSBNQUlSMC4gKi8KKwkJbGRyIHIyLCA9MHhlMDAwZWRjMAkJCQkJLyogcjIgPSAweGUwMDBlZGMwIFtMb2NhdGlvbiBvZiBNQUlSMF0uICovCisJCXN0ciByNCwgW3IyXQkJCQkJCS8qIFByb2dyYW0gTUFJUjAuICovCisJCWxkciByMiwgPTB4ZTAwMGVkOTgJCQkJCS8qIHIyID0gMHhlMDAwZWQ5OCBbTG9jYXRpb24gb2YgUk5SXS4gKi8KKwkJbW92cyByNCwgIzQJCQkJCQkJLyogcjQgPSA0LiAqLworCQlzdHIgcjQsIFtyMl0JCQkJCQkvKiBQcm9ncmFtIFJOUiA9IDQuICovCisJCWFkZHMgcjMsICM0CQkJCQkJCS8qIHIzID0gcjMgKyA0LiByMyBub3cgcG9pbnRzIHRvIGZpcnN0IFJCQVIgaW4gVENCLiAqLworCQlsZHIgIHIyLCA9MHhlMDAwZWQ5YwkJCQkvKiByMiA9IDB4ZTAwMGVkOWMgW0xvY2F0aW9uIG9mIFJCQVJdLiAqLworCQlsZG1pYSByMyEsIHtyNC1yMTF9CQkJCQkvKiBSZWFkIDQgc2V0cyBvZiBSQkFSL1JMQVIgcmVnaXN0ZXJzIGZyb20gVENCLiAqLworCQlzdG1pYSByMiEsIHtyNC1yMTF9CQkJCQkvKiBXcml0ZSA0IHNldCBvZiBSQkFSL1JMQVIgcmVnaXN0ZXJzIHVzaW5nIGFsaWFzIHJlZ2lzdGVycy4gKi8KKworCQlsZHIgcjIsID0weGUwMDBlZDk0CQkJCQkvKiByMiA9IDB4ZTAwMGVkOTQgW0xvY2F0aW9uIG9mIE1QVV9DVFJMXS4gKi8KKwkJbGRyIHI0LCBbcjJdCQkJCQkJLyogUmVhZCB0aGUgdmFsdWUgb2YgTVBVX0NUUkwuICovCisJCW9yciByNCwgcjQsICMxCQkJCQkJLyogcjQgPSByNCB8IDEgaS5lLiBTZXQgdGhlIGJpdCAwIGluIHI0LiAqLworCQlzdHIgcjQsIFtyMl0JCQkJCQkvKiBFbmFibGUgTVBVLiAqLworCQlkc2IJCQkJCQkJCQkvKiBGb3JjZSBtZW1vcnkgd3JpdGVzIGJlZm9yZSBjb250aW51aW5nLiAqLworCSNlbmRpZiAvKiBjb25maWdFTkFCTEVfTVBVICovCisKKwkjaWYgKCBjb25maWdFTkFCTEVfTVBVID09IDEgKQorCQlsZG1pYSByMSEsIHtyMCwgcjItcjR9CQkJCS8qIFJlYWQgZnJvbSBzdGFjayAtIHIwID0geFNlY3VyZUNvbnRleHQsIHIyID0gUFNQTElNLCByMyA9IENPTlRST0wgYW5kIHI0ID0gTFIuICovCisJCW1zciBwc3BsaW0sIHIyCQkJCQkJLyogUmVzdG9yZSB0aGUgUFNQTElNIHJlZ2lzdGVyIHZhbHVlIGZvciB0aGUgdGFzay4gKi8KKwkJbXNyIGNvbnRyb2wsIHIzCQkJCQkJLyogUmVzdG9yZSB0aGUgQ09OVFJPTCByZWdpc3RlciB2YWx1ZSBmb3IgdGhlIHRhc2suICovCisJCW1vdiBsciwgcjQJCQkJCQkJLyogTFIgPSByNC4gKi8KKwkJbGRyIHIyLCA9eFNlY3VyZUNvbnRleHQJCQkJLyogUmVhZCB0aGUgbG9jYXRpb24gb2YgeFNlY3VyZUNvbnRleHQgaS5lLiAmKCB4U2VjdXJlQ29udGV4dCApLiAqLworCQlzdHIgcjAsIFtyMl0JCQkJCQkvKiBSZXN0b3JlIHRoZSB0YXNrJ3MgeFNlY3VyZUNvbnRleHQuICovCisJCWNieiByMCwgcmVzdG9yZV9uc19jb250ZXh0CQkJLyogSWYgdGhlcmUgaXMgbm8gc2VjdXJlIGNvbnRleHQgZm9yIHRoZSB0YXNrLCByZXN0b3JlIHRoZSBub24tc2VjdXJlIGNvbnRleHQuICovCisJCXB1c2gge3IxLHI0fQorCQlibCBTZWN1cmVDb250ZXh0X0xvYWRDb250ZXh0CQkvKiBSZXN0b3JlIHRoZSBzZWN1cmUgY29udGV4dC4gKi8KKwkJcG9wIHtyMSxyNH0KKwkJbW92IGxyLCByNAkJCQkJCQkvKiBMUiA9IHI0LiAqLworCQlsc2xzIHIyLCByNCwgIzI1CQkJCQkvKiByMiA9IHI0IDw8IDI1LiBCaXRbNl0gb2YgRVhDX1JFVFVSTiBpcyAxIGlmIHNlY3VyZSBzdGFjayB3YXMgdXNlZCwgMCBpZiBub24tc2VjdXJlIHN0YWNrIHdhcyB1c2VkIHRvIHN0b3JlIHN0YWNrIGZyYW1lLiAqLworCQlicGwgcmVzdG9yZV9uc19jb250ZXh0CQkJCS8qIGJwbCAtIGJyYW5jaCBpZiBwb3NpdGl2ZSBvciB6ZXJvLiBJZiByMiA+PSAwID09PiBCaXRbNl0gaW4gRVhDX1JFVFVSTiBpcyAwIGkuZS4gbm9uLXNlY3VyZSBzdGFjayB3YXMgdXNlZC4gKi8KKwkJbXNyIHBzcCwgcjEJCQkJCQkJLyogUmVtZW1iZXIgdGhlIG5ldyB0b3Agb2Ygc3RhY2sgZm9yIHRoZSB0YXNrLiAqLworCQlieCBscgorCSNlbHNlIC8qIGNvbmZpZ0VOQUJMRV9NUFUgKi8KKwkJbGRtaWEgcjEhLCB7cjAsIHIyLXIzfQkJCQkvKiBSZWFkIGZyb20gc3RhY2sgLSByMCA9IHhTZWN1cmVDb250ZXh0LCByMiA9IFBTUExJTSBhbmQgcjMgPSBMUi4gKi8KKwkJbXNyIHBzcGxpbSwgcjIJCQkJCQkvKiBSZXN0b3JlIHRoZSBQU1BMSU0gcmVnaXN0ZXIgdmFsdWUgZm9yIHRoZSB0YXNrLiAqLworCQltb3YgbHIsIHIzCQkJCQkJCS8qIExSID0gcjMuICovCisJCWxkciByMiwgPXhTZWN1cmVDb250ZXh0CQkJCS8qIFJlYWQgdGhlIGxvY2F0aW9uIG9mIHhTZWN1cmVDb250ZXh0IGkuZS4gJiggeFNlY3VyZUNvbnRleHQgKS4gKi8KKwkJc3RyIHIwLCBbcjJdCQkJCQkJLyogUmVzdG9yZSB0aGUgdGFzaydzIHhTZWN1cmVDb250ZXh0LiAqLworCQljYnogcjAsIHJlc3RvcmVfbnNfY29udGV4dAkJCS8qIElmIHRoZXJlIGlzIG5vIHNlY3VyZSBjb250ZXh0IGZvciB0aGUgdGFzaywgcmVzdG9yZSB0aGUgbm9uLXNlY3VyZSBjb250ZXh0LiAqLworCQlwdXNoIHtyMSxyM30KKwkJYmwgU2VjdXJlQ29udGV4dF9Mb2FkQ29udGV4dAkJLyogUmVzdG9yZSB0aGUgc2VjdXJlIGNvbnRleHQuICovCisJCXBvcCB7cjEscjN9CisJCW1vdiBsciwgcjMJCQkJCQkJLyogTFIgPSByMy4gKi8KKwkJbHNscyByMiwgcjMsICMyNQkJCQkJLyogcjIgPSByMyA8PCAyNS4gQml0WzZdIG9mIEVYQ19SRVRVUk4gaXMgMSBpZiBzZWN1cmUgc3RhY2sgd2FzIHVzZWQsIDAgaWYgbm9uLXNlY3VyZSBzdGFjayB3YXMgdXNlZCB0byBzdG9yZSBzdGFjayBmcmFtZS4gKi8KKwkJYnBsIHJlc3RvcmVfbnNfY29udGV4dAkJCQkvKiBicGwgLSBicmFuY2ggaWYgcG9zaXRpdmUgb3IgemVyby4gSWYgcjIgPj0gMCA9PT4gQml0WzZdIGluIEVYQ19SRVRVUk4gaXMgMCBpLmUuIG5vbi1zZWN1cmUgc3RhY2sgd2FzIHVzZWQuICovCisJCW1zciBwc3AsIHIxCQkJCQkJCS8qIFJlbWVtYmVyIHRoZSBuZXcgdG9wIG9mIHN0YWNrIGZvciB0aGUgdGFzay4gKi8KKwkJYnggbHIKKwkjZW5kaWYgLyogY29uZmlnRU5BQkxFX01QVSAqLworCisJcmVzdG9yZV9uc19jb250ZXh0OgorCQlsZG1pYSByMSEsIHtyNC1yMTF9CQkJCQkvKiBSZXN0b3JlIHRoZSByZWdpc3RlcnMgdGhhdCBhcmUgbm90IGF1dG9tYXRpY2FsbHkgcmVzdG9yZWQuICovCisJI2lmICggY29uZmlnRU5BQkxFX0ZQVSA9PSAxICkKKwkJdHN0IGxyLCAjMHgxMAkJCQkJCS8qIFRlc3QgQml0WzRdIGluIExSLiBCaXRbNF0gb2YgRVhDX1JFVFVSTiBpcyAwIGlmIHRoZSBGUFUgaXMgaW4gdXNlLiAqLworCQlpdCBlcQorCQl2bGRtaWFlcSByMSEsIHtzMTYtczMxfQkJCQkvKiBSZXN0b3JlIHRoZSBGUFUgcmVnaXN0ZXJzIHdoaWNoIGFyZSBub3QgcmVzdG9yZWQgYXV0b21hdGljYWxseS4gKi8KKwkjZW5kaWYgLyogY29uZmlnRU5BQkxFX0ZQVSAqLworCQltc3IgcHNwLCByMQkJCQkJCQkvKiBSZW1lbWJlciB0aGUgbmV3IHRvcCBvZiBzdGFjayBmb3IgdGhlIHRhc2suICovCisJCWJ4IGxyCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworU1ZDX0hhbmRsZXI6CisJdHN0IGxyLCAjNAorCWl0ZSBlcQorCW1yc2VxIHIwLCBtc3AKKwltcnNuZSByMCwgcHNwCisJYiB2UG9ydFNWQ0hhbmRsZXJfQworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZQb3J0RnJlZVNlY3VyZUNvbnRleHQ6CisJLyogcjAgPSB1aW50MzJfdCAqcHVsVENCLiAqLworCWxkciByMSwgW3IwXQkJCQkJCQkvKiBUaGUgZmlyc3QgaXRlbSBpbiB0aGUgVENCIGlzIHRoZSB0b3Agb2YgdGhlIHN0YWNrLiAqLworCWxkciByMCwgW3IxXQkJCQkJCQkvKiBUaGUgZmlyc3QgaXRlbSBvbiB0aGUgc3RhY2sgaXMgdGhlIHRhc2sncyB4U2VjdXJlQ29udGV4dC4gKi8KKwljbXAgcjAsICMwCQkJCQkJCQkvKiBSYWlzZSBzdmMgaWYgdGFzaydzIHhTZWN1cmVDb250ZXh0IGlzIG5vdCBOVUxMLiAqLworCWl0IG5lCisJc3ZjbmUgMQkJCQkJCQkJCS8qIFNlY3VyZSBjb250ZXh0IGlzIGZyZWVkIGluIHRoZSBzdXBlcnZpc29yIGNhbGwuIHBvcnRTVkNfRlJFRV9TRUNVUkVfQ09OVEVYVCA9IDEuICovCisJYnggbHIJCQkJCQkJCQkvKiBSZXR1cm4uICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCUVORApkaWZmIC0tZ2l0IGEvU291cmNlL3BvcnRhYmxlL0lBUi9BUk1fQ00zMy9ub25fc2VjdXJlL3BvcnRtYWNyby5oIGIvU291cmNlL3BvcnRhYmxlL0lBUi9BUk1fQ00zMy9ub25fc2VjdXJlL3BvcnRtYWNyby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzYTExZDQKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvcG9ydGFibGUvSUFSL0FSTV9DTTMzL25vbl9zZWN1cmUvcG9ydG1hY3JvLmgKQEAgLTAsMCArMSwzMDYgQEAKKy8qCisgKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjIuMQorICogQ29weXJpZ2h0IChDKSAyMDE5IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKKyAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCisgKiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCisgKiB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZgorICogdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLAorICogc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCisgKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUworICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SCisgKiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIKKyAqIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIGh0dHA6Ly93d3cuRnJlZVJUT1Mub3JnCisgKiBodHRwOi8vYXdzLmFtYXpvbi5jb20vZnJlZXJ0b3MKKyAqCisgKiAxIHRhYiA9PSA0IHNwYWNlcyEKKyAqLworCisjaWZuZGVmIFBPUlRNQUNST19ICisjZGVmaW5lIFBPUlRNQUNST19ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFBvcnQgc3BlY2lmaWMgZGVmaW5pdGlvbnMuCisgKgorICogVGhlIHNldHRpbmdzIGluIHRoaXMgZmlsZSBjb25maWd1cmUgRnJlZVJUT1MgY29ycmVjdGx5IGZvciB0aGUgZ2l2ZW4gaGFyZHdhcmUKKyAqIGFuZCBjb21waWxlci4KKyAqCisgKiBUaGVzZSBzZXR0aW5ncyBzaG91bGQgbm90IGJlIGFsdGVyZWQuCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKyNpZm5kZWYgY29uZmlnRU5BQkxFX0ZQVQorCSNlcnJvciBjb25maWdFTkFCTEVfRlBVIG11c3QgYmUgZGVmaW5lZCBpbiBGcmVlUlRPU0NvbmZpZy5oLiAgU2V0IGNvbmZpZ0VOQUJMRV9GUFUgdG8gMSB0byBlbmFibGUgdGhlIEZQVSBvciAwIHRvIGRpc2FibGUgdGhlIEZQVS4KKyNlbmRpZiAvKiBjb25maWdFTkFCTEVfRlBVICovCisKKyNpZm5kZWYgY29uZmlnRU5BQkxFX01QVQorCSNlcnJvciBjb25maWdFTkFCTEVfTVBVIG11c3QgYmUgZGVmaW5lZCBpbiBGcmVlUlRPU0NvbmZpZy5oLiAgU2V0IGNvbmZpZ0VOQUJMRV9NUFUgdG8gMSB0byBlbmFibGUgdGhlIE1QVSBvciAwIHRvIGRpc2FibGUgdGhlIE1QVS4KKyNlbmRpZiAvKiBjb25maWdFTkFCTEVfTVBVICovCisKKyNpZm5kZWYgY29uZmlnRU5BQkxFX1RSVVNUWk9ORQorCSNlcnJvciBjb25maWdFTkFCTEVfVFJVU1RaT05FIG11c3QgYmUgZGVmaW5lZCBpbiBGcmVlUlRPU0NvbmZpZy5oLiAgU2V0IGNvbmZpZ0VOQUJMRV9UUlVTVFpPTkUgdG8gMSB0byBlbmFibGUgVHJ1c3Rab25lIG9yIDAgdG8gZGlzYWJsZSBUcnVzdFpvbmUuCisjZW5kaWYgLyogY29uZmlnRU5BQkxFX1RSVVNUWk9ORSAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqCisgKiBAYnJpZWYgVHlwZSBkZWZpbml0aW9ucy4KKyAqLworI2RlZmluZSBwb3J0Q0hBUgkJCQkJCQkJCQkJY2hhcgorI2RlZmluZSBwb3J0RkxPQVQJCQkJCQkJCQkJCWZsb2F0CisjZGVmaW5lIHBvcnRET1VCTEUJCQkJCQkJCQkJCWRvdWJsZQorI2RlZmluZSBwb3J0TE9ORwkJCQkJCQkJCQkJbG9uZworI2RlZmluZSBwb3J0U0hPUlQJCQkJCQkJCQkJCXNob3J0CisjZGVmaW5lIHBvcnRTVEFDS19UWVBFCQkJCQkJCQkJCXVpbnQzMl90CisjZGVmaW5lIHBvcnRCQVNFX1RZUEUJCQkJCQkJCQkJbG9uZworCit0eXBlZGVmIHBvcnRTVEFDS19UWVBFCQkJCQkJCQkJCVN0YWNrVHlwZV90OwordHlwZWRlZiBsb25nCQkJCQkJCQkJCQkJQmFzZVR5cGVfdDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZwkJCQkJCQkJCQlVQmFzZVR5cGVfdDsKKworI2lmKCBjb25maWdVU0VfMTZfQklUX1RJQ0tTID09IDEgKQorCXR5cGVkZWYgdWludDE2X3QgVGlja1R5cGVfdDsKKwkjZGVmaW5lIHBvcnRNQVhfREVMQVkgKCBUaWNrVHlwZV90ICkJCQkJCTB4ZmZmZgorI2Vsc2UKKwl0eXBlZGVmIHVpbnQzMl90IFRpY2tUeXBlX3Q7CisJI2RlZmluZSBwb3J0TUFYX0RFTEFZICggVGlja1R5cGVfdCApCQkJCQkweGZmZmZmZmZmVUwKKworCS8qIDMyLWJpdCB0aWNrIHR5cGUgb24gYSAzMi1iaXQgYXJjaGl0ZWN0dXJlLCBzbyByZWFkcyBvZiB0aGUgdGljayBjb3VudCBkbworCSAqIG5vdCBuZWVkIHRvIGJlIGd1YXJkZWQgd2l0aCBhIGNyaXRpY2FsIHNlY3Rpb24uICovCisJI2RlZmluZSBwb3J0VElDS19UWVBFX0lTX0FUT01JQwkJCQkJCQkxCisjZW5kaWYKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAqIEFyY2hpdGVjdHVyZSBzcGVjaWZpY3MuCisgKi8KKyNkZWZpbmUgcG9ydEFSQ0hfTkFNRQkJCQkJCQkJCQkiQ29ydGV4LU0zMyIKKyNkZWZpbmUgcG9ydFNUQUNLX0dST1dUSAkJCQkJCQkJCSggLTEgKQorI2RlZmluZSBwb3J0VElDS19QRVJJT0RfTVMJCQkJCQkJCQkoICggVGlja1R5cGVfdCApIDEwMDAgLyBjb25maWdUSUNLX1JBVEVfSFogKQorI2RlZmluZSBwb3J0QllURV9BTElHTk1FTlQJCQkJCQkJCQk4CisjZGVmaW5lIHBvcnROT1AoKQorI2RlZmluZSBwb3J0SU5MSU5FCQkJCQkJCQkJCQlfX2lubGluZQorI2lmbmRlZiBwb3J0Rk9SQ0VfSU5MSU5FCisJI2RlZmluZSBwb3J0Rk9SQ0VfSU5MSU5FCQkJCQkJCQlpbmxpbmUgX19hdHRyaWJ1dGVfXygoIGFsd2F5c19pbmxpbmUgKSkKKyNlbmRpZgorI2RlZmluZSBwb3J0SEFTX1NUQUNLX09WRVJGTE9XX0NIRUNLSU5HCQkJCQkJMQorI2RlZmluZSBwb3J0RE9OVF9ESVNDQVJECQkJCQkJCQkJX19yb290CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqCisgKiBAYnJpZWYgRXh0ZXJuIGRlY2xhcmF0aW9ucy4KKyAqLworZXh0ZXJuIHZvaWQgdlBvcnRZaWVsZCggdm9pZCApIC8qIFBSSVZJTEVHRURfRlVOQ1RJT04gKi87CisKK2V4dGVybiB2b2lkIHZQb3J0RW50ZXJDcml0aWNhbCggdm9pZCApIC8qIFBSSVZJTEVHRURfRlVOQ1RJT04gKi87CitleHRlcm4gdm9pZCB2UG9ydEV4aXRDcml0aWNhbCggdm9pZCApIC8qIFBSSVZJTEVHRURfRlVOQ1RJT04gKi87CisKK2V4dGVybiB1aW50MzJfdCB1bFNldEludGVycnVwdE1hc2tGcm9tSVNSKCB2b2lkICkgLyogX19hdHRyaWJ1dGVfXygoIG5ha2VkICkpIFBSSVZJTEVHRURfRlVOQ1RJT04gKi87CitleHRlcm4gdm9pZCB2Q2xlYXJJbnRlcnJ1cHRNYXNrRnJvbUlTUiggdWludDMyX3QgdWxNYXNrICkgLyogX19hdHRyaWJ1dGVfXygoIG5ha2VkICkpIFBSSVZJTEVHRURfRlVOQ1RJT04gKi87CisKKyNpZiggY29uZmlnRU5BQkxFX1RSVVNUWk9ORSA9PSAxICkKKwlleHRlcm4gdm9pZCB2UG9ydEFsbG9jYXRlU2VjdXJlQ29udGV4dCggdWludDMyX3QgdWxTZWN1cmVTdGFja1NpemUgKTsgLyogX19hdHRyaWJ1dGVfXyAoKCBuYWtlZCApKSAqLworCWV4dGVybiB2b2lkIHZQb3J0RnJlZVNlY3VyZUNvbnRleHQoIHVpbnQzMl90ICpwdWxUQ0IgKSAvKiBfX2F0dHJpYnV0ZV9fICgoIG5ha2VkICkpIFBSSVZJTEVHRURfRlVOQ1RJT04gKi87CisjZW5kaWYgLyogY29uZmlnRU5BQkxFX1RSVVNUWk9ORSAqLworCisjaWYoIGNvbmZpZ0VOQUJMRV9NUFUgPT0gMSApCisJZXh0ZXJuIEJhc2VUeXBlX3QgeElzUHJpdmlsZWdlZCggdm9pZCApIC8qIF9fYXR0cmlidXRlX18gKCggbmFrZWQgKSkgKi87CisJZXh0ZXJuIHZvaWQgdlJlc2V0UHJpdmlsZWdlKCB2b2lkICkgLyogX19hdHRyaWJ1dGVfXyAoKCBuYWtlZCApKSAqLzsKKyNlbmRpZiAvKiBjb25maWdFTkFCTEVfTVBVICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqCisgKiBAYnJpZWYgTVBVIHNwZWNpZmljIGNvbnN0YW50cy4KKyAqLworI2lmKCBjb25maWdFTkFCTEVfTVBVID09IDEgKQorCSNkZWZpbmUgcG9ydFVTSU5HX01QVV9XUkFQUEVSUwkJCQkJCQkxCisJI2RlZmluZSBwb3J0UFJJVklMRUdFX0JJVAkJCQkJCQkJKCAweDgwMDAwMDAwVUwgKQorI2Vsc2UKKwkjZGVmaW5lIHBvcnRQUklWSUxFR0VfQklUCQkJCQkJCQkoIDB4MFVMICkKKyNlbmRpZiAvKiBjb25maWdFTkFCTEVfTVBVICovCisKKworLyogTVBVIHJlZ2lvbnMuICovCisjZGVmaW5lIHBvcnRQUklWSUxFR0VEX0ZMQVNIX1JFR0lPTgkJCQkJCQkoIDBVTCApCisjZGVmaW5lIHBvcnRVTlBSSVZJTEVHRURfRkxBU0hfUkVHSU9OCQkJCQkJKCAxVUwgKQorI2RlZmluZSBwb3J0VU5QUklWSUxFR0VEX1NZU0NBTExTX1JFR0lPTgkJCQkJKCAyVUwgKQorI2RlZmluZSBwb3J0UFJJVklMRUdFRF9SQU1fUkVHSU9OCQkJCQkJCSggM1VMICkKKyNkZWZpbmUgcG9ydFNUQUNLX1JFR0lPTgkJCQkJCQkJCSggNFVMICkKKyNkZWZpbmUgcG9ydEZJUlNUX0NPTkZJR1VSQUJMRV9SRUdJT04JCQkJCQkoIDVVTCApCisjZGVmaW5lIHBvcnRMQVNUX0NPTkZJR1VSQUJMRV9SRUdJT04JCQkJCQkoIDdVTCApCisjZGVmaW5lIHBvcnROVU1fQ09ORklHVVJBQkxFX1JFR0lPTlMJCQkJCQkoICggcG9ydExBU1RfQ09ORklHVVJBQkxFX1JFR0lPTiAtIHBvcnRGSVJTVF9DT05GSUdVUkFCTEVfUkVHSU9OICkgKyAxICkKKyNkZWZpbmUgcG9ydFRPVEFMX05VTV9SRUdJT05TCQkJCQkJCQkoIHBvcnROVU1fQ09ORklHVVJBQkxFX1JFR0lPTlMgKyAxICkgLyogUGx1cyBvbmUgdG8gbWFrZSBzcGFjZSBmb3IgdGhlIHN0YWNrIHJlZ2lvbi4gKi8KKworLyogRGV2aWNlIG1lbW9yeSBhdHRyaWJ1dGVzIHVzZWQgaW4gTVBVX01BSVIgcmVnaXN0ZXJzLgorICoKKyAqIDgtYml0IHZhbHVlcyBlbmNvZGVkIGFzIGZvbGxvd3M6CisgKiAgQml0Wzc6NF0gLSAwMDAwIC0gRGV2aWNlIE1lbW9yeQorICogIEJpdFszOjJdIC0gMDAgLS0+IERldmljZS1uR25SbkUKKyAqCQkJCTAxIC0tPiBEZXZpY2UtbkduUkUKKyAqCQkJCTEwIC0tPiBEZXZpY2UtbkdSRQorICoJCQkJMTEgLS0+IERldmljZS1HUkUKKyAqICBCaXRbMTowXSAtIDAwLCBSZXNlcnZlZC4KKyAqLworI2RlZmluZSBwb3J0TVBVX0RFVklDRV9NRU1PUllfbkduUm5FCQkJCQkJKCAweDAwICkgLyogMDAwMCAwMDAwICovCisjZGVmaW5lIHBvcnRNUFVfREVWSUNFX01FTU9SWV9uR25SRQkJCQkJCQkoIDB4MDQgKSAvKiAwMDAwIDAxMDAgKi8KKyNkZWZpbmUgcG9ydE1QVV9ERVZJQ0VfTUVNT1JZX25HUkUJCQkJCQkJKCAweDA4ICkgLyogMDAwMCAxMDAwICovCisjZGVmaW5lIHBvcnRNUFVfREVWSUNFX01FTU9SWV9HUkUJCQkJCQkJKCAweDBDICkgLyogMDAwMCAxMTAwICovCisKKy8qIE5vcm1hbCBtZW1vcnkgYXR0cmlidXRlcyB1c2VkIGluIE1QVV9NQUlSIHJlZ2lzdGVycy4gKi8KKyNkZWZpbmUgcG9ydE1QVV9OT1JNQUxfTUVNT1JZX05PTl9DQUNIRUFCTEUJCQkJCSggMHg0NCApIC8qIE5vbi1jYWNoZWFibGUuICovCisjZGVmaW5lIHBvcnRNUFVfTk9STUFMX01FTU9SWV9CVUZGRVJBQkxFX0NBQ0hFQUJMRQkJCSggMHhGRiApIC8qIE5vbi1UcmFuc2llbnQsIFdyaXRlLWJhY2ssIFJlYWQtQWxsb2NhdGUgYW5kIFdyaXRlLUFsbG9jYXRlLiAqLworCisvKiBBdHRyaWJ1dGVzIHVzZWQgaW4gTVBVX1JCQVIgcmVnaXN0ZXJzLiAqLworI2RlZmluZSBwb3J0TVBVX1JFR0lPTl9OT05fU0hBUkVBQkxFCQkJCQkJKCAwVUwgPDwgM1VMICkKKyNkZWZpbmUgcG9ydE1QVV9SRUdJT05fSU5ORVJfU0hBUkVBQkxFCQkJCQkJKCAxVUwgPDwgM1VMICkKKyNkZWZpbmUgcG9ydE1QVV9SRUdJT05fT1VURVJfU0hBUkVBQkxFCQkJCQkJKCAyVUwgPDwgM1VMICkKKworI2RlZmluZSBwb3J0TVBVX1JFR0lPTl9QUklWSUxFR0VEX1JFQURfV1JJVEUJCQkJKCAwVUwgPDwgMVVMICkKKyNkZWZpbmUgcG9ydE1QVV9SRUdJT05fUkVBRF9XUklURQkJCQkJCQkoIDFVTCA8PCAxVUwgKQorI2RlZmluZSBwb3J0TVBVX1JFR0lPTl9QUklWSUxFR0VEX1JFQURfT05MWQkJCQkJKCAyVUwgPDwgMVVMICkKKyNkZWZpbmUgcG9ydE1QVV9SRUdJT05fUkVBRF9PTkxZCQkJCQkJCSggM1VMIDw8IDFVTCApCisKKyNkZWZpbmUgcG9ydE1QVV9SRUdJT05fRVhFQ1VURV9ORVZFUgkJCQkJCSggMVVMICkKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAqIEBicmllZiBTZXR0aW5ncyB0byBkZWZpbmUgYW4gTVBVIHJlZ2lvbi4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgTVBVUmVnaW9uU2V0dGluZ3MKK3sKKwl1aW50MzJfdCB1bFJCQVI7CS8qKjwgUkJBUiBmb3IgdGhlIHJlZ2lvbi4gKi8KKwl1aW50MzJfdCB1bFJMQVI7CS8qKjwgUkxBUiBmb3IgdGhlIHJlZ2lvbi4gKi8KK30gTVBVUmVnaW9uU2V0dGluZ3NfdDsKKworLyoqCisgKiBAYnJpZWYgTVBVIHNldHRpbmdzIGFzIHN0b3JlZCBpbiB0aGUgVENCLgorICovCit0eXBlZGVmIHN0cnVjdCBNUFVfU0VUVElOR1MKK3sKKwl1aW50MzJfdCB1bE1BSVIwOwkvKio8IE1BSVIwIGZvciB0aGUgdGFzayBjb250YWluaW5nIGF0dHJpYnV0ZXMgZm9yIGFsbCB0aGUgNCBwZXIgdGFzayByZWdpb25zLiAqLworCU1QVVJlZ2lvblNldHRpbmdzX3QgeFJlZ2lvbnNTZXR0aW5nc1sgcG9ydFRPVEFMX05VTV9SRUdJT05TIF07IC8qKjwgU2V0dGluZ3MgZm9yIDQgcGVyIHRhc2sgcmVnaW9ucy4gKi8KK30geE1QVV9TRVRUSU5HUzsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAqIEBicmllZiBTVkMgbnVtYmVycy4KKyAqLworI2RlZmluZSBwb3J0U1ZDX0FMTE9DQVRFX1NFQ1VSRV9DT05URVhUCQkJCQkJMAorI2RlZmluZSBwb3J0U1ZDX0ZSRUVfU0VDVVJFX0NPTlRFWFQJCQkJCQkJMQorI2RlZmluZSBwb3J0U1ZDX1NUQVJUX1NDSEVEVUxFUgkJCQkJCQkJMgorI2RlZmluZSBwb3J0U1ZDX1JBSVNFX1BSSVZJTEVHRQkJCQkJCQkJMworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKgorICogQGJyaWVmIFNjaGVkdWxlciB1dGlsaXRpZXMuCisgKi8KKyNkZWZpbmUgcG9ydFlJRUxEKCkJCQkJCQkJCQkJCXZQb3J0WWllbGQoKQorI2RlZmluZSBwb3J0TlZJQ19JTlRfQ1RSTF9SRUcJCQkJCQkJCSggKiAoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVkMDQgKSApCisjZGVmaW5lIHBvcnROVklDX1BFTkRTVlNFVF9CSVQJCQkJCQkJCSggMVVMIDw8IDI4VUwgKQorI2RlZmluZSBwb3J0RU5EX1NXSVRDSElOR19JU1IoIHhTd2l0Y2hSZXF1aXJlZCApCQkJaWYoIHhTd2l0Y2hSZXF1aXJlZCApIHBvcnROVklDX0lOVF9DVFJMX1JFRyA9IHBvcnROVklDX1BFTkRTVlNFVF9CSVQKKyNkZWZpbmUgcG9ydFlJRUxEX0ZST01fSVNSKCB4ICkJCQkJCQkJCXBvcnRFTkRfU1dJVENISU5HX0lTUiggeCApCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqCisgKiBAYnJpZWYgQ3JpdGljYWwgc2VjdGlvbiBtYW5hZ2VtZW50LgorICovCisjZGVmaW5lIHBvcnRTRVRfSU5URVJSVVBUX01BU0tfRlJPTV9JU1IoKQkJCQkJdWxTZXRJbnRlcnJ1cHRNYXNrRnJvbUlTUigpCisjZGVmaW5lIHBvcnRDTEVBUl9JTlRFUlJVUFRfTUFTS19GUk9NX0lTUih4KQkJCQl2Q2xlYXJJbnRlcnJ1cHRNYXNrRnJvbUlTUiggeCApCisjZGVmaW5lIHBvcnRESVNBQkxFX0lOVEVSUlVQVFMoKQkJCQkJCQlfX2FzbSB2b2xhdGlsZSAoICIgY3BzaWQgaSAiIDo6OiAibWVtb3J5IiApCisjZGVmaW5lIHBvcnRFTkFCTEVfSU5URVJSVVBUUygpCQkJCQkJCQlfX2FzbSB2b2xhdGlsZSAoICIgY3BzaWUgaSAiIDo6OiAibWVtb3J5IiApCisjZGVmaW5lIHBvcnRFTlRFUl9DUklUSUNBTCgpCQkJCQkJCQl2UG9ydEVudGVyQ3JpdGljYWwoKQorI2RlZmluZSBwb3J0RVhJVF9DUklUSUNBTCgpCQkJCQkJCQkJdlBvcnRFeGl0Q3JpdGljYWwoKQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKgorICogQGJyaWVmIFRhc2sgZnVuY3Rpb24gbWFjcm9zIGFzIGRlc2NyaWJlZCBvbiB0aGUgRnJlZVJUT1Mub3JnIFdFQiBzaXRlLgorICovCisjZGVmaW5lIHBvcnRUQVNLX0ZVTkNUSU9OX1BST1RPKCB2RnVuY3Rpb24sIHB2UGFyYW1ldGVycyApCXZvaWQgdkZ1bmN0aW9uKCB2b2lkICpwdlBhcmFtZXRlcnMgKQorI2RlZmluZSBwb3J0VEFTS19GVU5DVElPTiggdkZ1bmN0aW9uLCBwdlBhcmFtZXRlcnMgKQkJdm9pZCB2RnVuY3Rpb24oIHZvaWQgKnB2UGFyYW1ldGVycyApCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmKCBjb25maWdFTkFCTEVfVFJVU1RaT05FID09IDEgKQorCS8qKgorCSAqIEBicmllZiBBbGxvY2F0ZSBhIHNlY3VyZSBjb250ZXh0IGZvciB0aGUgdGFzay4KKwkgKgorCSAqIFRhc2tzIGFyZSBub3QgY3JlYXRlZCB3aXRoIGEgc2VjdXJlIGNvbnRleHQuIEFueSB0YXNrIHRoYXQgaXMgZ29pbmcgdG8gY2FsbAorCSAqIHNlY3VyZSBmdW5jdGlvbnMgbXVzdCBjYWxsIHBvcnRBTExPQ0FURV9TRUNVUkVfQ09OVEVYVCgpIHRvIGFsbG9jYXRlIGl0c2VsZiBhCisJICogc2VjdXJlIGNvbnRleHQgYmVmb3JlIGl0IGNhbGxzIGFueSBzZWN1cmUgZnVuY3Rpb24uCisJICoKKwkgKiBAcGFyYW1baW5dIHVsU2VjdXJlU3RhY2tTaXplIFRoZSBzaXplIG9mIHRoZSBzZWN1cmUgc3RhY2sgdG8gYmUgYWxsb2NhdGVkLgorCSAqLworCSNkZWZpbmUgcG9ydEFMTE9DQVRFX1NFQ1VSRV9DT05URVhUKCB1bFNlY3VyZVN0YWNrU2l6ZSApCXZQb3J0QWxsb2NhdGVTZWN1cmVDb250ZXh0KCB1bFNlY3VyZVN0YWNrU2l6ZSApCisKKwkvKioKKwkgKiBAYnJpZWYgQ2FsbGVkIHdoZW4gYSB0YXNrIGlzIGRlbGV0ZWQgdG8gZGVsZXRlIHRoZSB0YXNrJ3Mgc2VjdXJlIGNvbnRleHQsCisJICogaWYgaXQgaGFzIG9uZS4KKwkgKgorCSAqIEBwYXJhbVtpbl0gcHhUQ0IgVGhlIFRDQiBvZiB0aGUgdGFzayBiZWluZyBkZWxldGVkLgorCSAqLworCSNkZWZpbmUgcG9ydENMRUFOX1VQX1RDQiggcHhUQ0IgKQkJCQkJCQl2UG9ydEZyZWVTZWN1cmVDb250ZXh0KCAoIHVpbnQzMl90ICogKSBweFRDQiApCisjZWxzZQorCSNkZWZpbmUgcG9ydEFMTE9DQVRFX1NFQ1VSRV9DT05URVhUKCB1bFNlY3VyZVN0YWNrU2l6ZSApCisJI2RlZmluZSBwb3J0Q0xFQU5fVVBfVENCKCBweFRDQiApCisjZW5kaWYgLyogY29uZmlnRU5BQkxFX1RSVVNUWk9ORSAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiggY29uZmlnRU5BQkxFX01QVSA9PSAxICkKKwkvKioKKwkgKiBAYnJpZWYgQ2hlY2tzIHdoZXRoZXIgb3Igbm90IHRoZSBwcm9jZXNzb3IgaXMgcHJpdmlsZWdlZC4KKwkgKgorCSAqIEByZXR1cm4gMSBpZiB0aGUgcHJvY2Vzc29yIGlzIGFscmVhZHkgcHJpdmlsZWdlZCwgMCBvdGhlcndpc2UuCisJICovCisJI2RlZmluZSBwb3J0SVNfUFJJVklMRUdFRCgpCQkJCQkJCQkJeElzUHJpdmlsZWdlZCgpCisKKwkvKioKKwkgKiBAYnJpZWYgUmFpc2UgYW4gU1ZDIHJlcXVlc3QgdG8gcmFpc2UgcHJpdmlsZWdlLgorCSAqCisJICogVGhlIFNWQyBoYW5kbGVyIGNoZWNrcyB0aGF0IHRoZSBTVkMgd2FzIHJhaXNlZCBmcm9tIGEgc3lzdGVtIGNhbGwgYW5kIG9ubHkKKwkgKiB0aGVuIGl0IHJhaXNlcyB0aGUgcHJpdmlsZWdlLiBJZiB0aGlzIGlzIGNhbGxlZCBmcm9tIGFueSBvdGhlciBwbGFjZSwKKwkgKiB0aGUgcHJpdmlsZWdlIGlzIG5vdCByYWlzZWQuCisJICovCisJI2RlZmluZSBwb3J0UkFJU0VfUFJJVklMRUdFKCkJCQkJCQkJCV9fYXNtIHZvbGF0aWxlICggInN2YyAlMCBcbiIgOjogImkiICggcG9ydFNWQ19SQUlTRV9QUklWSUxFR0UgKSA6ICJtZW1vcnkiICk7CisKKwkvKioKKwkgKiBAYnJpZWYgTG93ZXJzIHRoZSBwcml2aWxlZ2UgbGV2ZWwgYnkgc2V0dGluZyB0aGUgYml0IDAgb2YgdGhlIENPTlRST0wKKwkgKiByZWdpc3Rlci4KKwkgKi8KKwkjZGVmaW5lIHBvcnRSRVNFVF9QUklWSUxFR0UoKQkJCQkJCQkJdlJlc2V0UHJpdmlsZWdlKCkKKyNlbHNlCisJI2RlZmluZSBwb3J0SVNfUFJJVklMRUdFRCgpCisJI2RlZmluZSBwb3J0UkFJU0VfUFJJVklMRUdFKCkKKwkjZGVmaW5lIHBvcnRSRVNFVF9QUklWSUxFR0UoKQorI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9NUFUgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAqIEBicmllZiBCYXJyaWVycy4KKyAqLworI2RlZmluZSBwb3J0TUVNT1JZX0JBUlJJRVIoKSBfX2FzbSB2b2xhdGlsZSggIiIgOjo6ICJtZW1vcnkiICkKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBTdXBwcmVzcyB3YXJuaW5ncyB0aGF0IGFyZSBnZW5lcmF0ZWQgYnkgdGhlIElBUiB0b29scywgYnV0IGNhbm5vdCBiZSBmaXhlZCBpbgorICogdGhlIHNvdXJjZSBjb2RlIGJlY2F1c2UgdG8gZG8gc28gd291bGQgY2F1c2Ugb3RoZXIgY29tcGlsZXJzIHRvIGdlbmVyYXRlCisgKiB3YXJuaW5ncy4gKi8KKyNwcmFnbWEgZGlhZ19zdXBwcmVzcz1CZTAwNgorI3ByYWdtYSBkaWFnX3N1cHByZXNzPVBhMDgyCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFBPUlRNQUNST19IICovCmRpZmYgLS1naXQgYS9Tb3VyY2UvcG9ydGFibGUvSUFSL0FSTV9DTTMzL3NlY3VyZS9zZWN1cmVfY29udGV4dC5jIGIvU291cmNlL3BvcnRhYmxlL0lBUi9BUk1fQ00zMy9zZWN1cmUvc2VjdXJlX2NvbnRleHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzUzNWNkCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL3BvcnRhYmxlL0lBUi9BUk1fQ00zMy9zZWN1cmUvc2VjdXJlX2NvbnRleHQuYwpAQCAtMCwwICsxLDIwNCBAQAorLyoKKyAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMi4xCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgorICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KKyAqIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KKyAqIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mCisgKiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCisgKiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKKyAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTCisgKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IKKyAqIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUgorICogSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogaHR0cDovL3d3dy5GcmVlUlRPUy5vcmcKKyAqIGh0dHA6Ly9hd3MuYW1hem9uLmNvbS9mcmVlcnRvcworICoKKyAqIDEgdGFiID09IDQgc3BhY2VzIQorICovCisKKy8qIFNlY3VyZSBjb250ZXh0IGluY2x1ZGVzLiAqLworI2luY2x1ZGUgInNlY3VyZV9jb250ZXh0LmgiCisKKy8qIFNlY3VyZSBoZWFwIGluY2x1ZGVzLiAqLworI2luY2x1ZGUgInNlY3VyZV9oZWFwLmgiCisKKy8qIFNlY3VyZSBwb3J0IG1hY3Jvcy4gKi8KKyNpbmNsdWRlICJzZWN1cmVfcG9ydF9tYWNyb3MuaCIKKworLyoqCisgKiBAYnJpZWYgQ09OVFJPTCB2YWx1ZSBmb3IgcHJpdmlsZWdlZCB0YXNrcy4KKyAqCisgKiBCaXRbMF0gLSAwIC0tPiBUaHJlYWQgbW9kZSBpcyBwcml2aWxlZ2VkLgorICogQml0WzFdIC0gMSAtLT4gVGhyZWFkIG1vZGUgdXNlcyBQU1AuCisgKi8KKyNkZWZpbmUgc2VjdXJlY29udGV4dENPTlRST0xfVkFMVUVfUFJJVklMRUdFRAkJMHgwMgorCisvKioKKyAqIEBicmllZiBDT05UUk9MIHZhbHVlIGZvciB1bi1wcml2aWxlZ2VkIHRhc2tzLgorICoKKyAqIEJpdFswXSAtIDEgLS0+IFRocmVhZCBtb2RlIGlzIHVuLXByaXZpbGVnZWQuCisgKiBCaXRbMV0gLSAxIC0tPiBUaHJlYWQgbW9kZSB1c2VzIFBTUC4KKyAqLworI2RlZmluZSBzZWN1cmVjb250ZXh0Q09OVFJPTF9WQUxVRV9VTlBSSVZJTEVHRUQJCTB4MDMKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAqIEBicmllZiBTdHJ1Y3R1cmUgdG8gcmVwcmVzZW50IHNlY3VyZSBjb250ZXh0LgorICoKKyAqIEBub3RlIFNpbmNlIHN0YWNrIGdyb3dzIGRvd24sIHB1Y1N0YWNrU3RhcnQgaXMgdGhlIGhpZ2hlc3QgYWRkcmVzcyB3aGlsZQorICogcHVjU3RhY2tMaW1pdCBpcyB0aGUgZmlyc3QgYWRkZXNzIG9mIHRoZSBhbGxvY2F0ZWQgbWVtb3J5LgorICovCit0eXBlZGVmIHN0cnVjdCBTZWN1cmVDb250ZXh0Cit7CisJdWludDhfdCAqcHVjQ3VycmVudFN0YWNrUG9pbnRlcjsJLyoqPCBDdXJyZW50IHZhbHVlIG9mIHN0YWNrIHBvaW50ZXIgKFBTUCkuICovCisJdWludDhfdCAqcHVjU3RhY2tMaW1pdDsJCQkJLyoqPCBMYXN0IGxvY2F0aW9uIG9mIHRoZSBzdGFjayBtZW1vcnkgKFBTUExJTSkuICovCisJdWludDhfdCAqcHVjU3RhY2tTdGFydDsJCQkJLyoqPCBGaXJzdCBsb2NhdGlvbiBvZiB0aGUgc3RhY2sgbWVtb3J5LiAqLworfSBTZWN1cmVDb250ZXh0X3Q7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc2VjdXJlcG9ydE5PTl9TRUNVUkVfQ0FMTEFCTEUgdm9pZCBTZWN1cmVDb250ZXh0X0luaXQoIHZvaWQgKQoreworCXVpbnQzMl90IHVsSVBTUjsKKworCS8qIFJlYWQgdGhlIEludGVycnVwdCBQcm9ncmFtIFN0YXR1cyBSZWdpc3RlciAoSVBTUikgdmFsdWUuICovCisJc2VjdXJlcG9ydFJFQURfSVBTUiggdWxJUFNSICk7CisKKwkvKiBEbyBub3RoaW5nIGlmIHRoZSBwcm9jZXNzb3IgaXMgcnVubmluZyBpbiB0aGUgVGhyZWFkIE1vZGUuIElQU1IgaXMgemVybworCSAqIHdoZW4gdGhlIHByb2Nlc3NvciBpcyBydW5uaW5nIGluIHRoZSBUaHJlYWQgTW9kZS4gKi8KKwlpZiggdWxJUFNSICE9IDAgKQorCXsKKwkJLyogTm8gc3RhY2sgZm9yIHRocmVhZCBtb2RlIHVudGlsIGEgdGFzaydzIGNvbnRleHQgaXMgbG9hZGVkLiAqLworCQlzZWN1cmVwb3J0U0VUX1BTUExJTSggc2VjdXJlY29udGV4dE5PX1NUQUNLICk7CisJCXNlY3VyZXBvcnRTRVRfUFNQKCBzZWN1cmVjb250ZXh0Tk9fU1RBQ0sgKTsKKworCQkjaWYoIGNvbmZpZ0VOQUJMRV9NUFUgPT0gMSApCisJCXsKKwkJCS8qIENvbmZpZ3VyZSB0aHJlYWQgbW9kZSB0byB1c2UgUFNQIGFuZCB0byBiZSB1bnByaXZpbGVnZWQuICovCisJCQlzZWN1cmVwb3J0U0VUX0NPTlRST0woIHNlY3VyZWNvbnRleHRDT05UUk9MX1ZBTFVFX1VOUFJJVklMRUdFRCApOworCQl9CisJCSNlbHNlIC8qIGNvbmZpZ0VOQUJMRV9NUFUgKi8KKwkJeworCQkJLyogQ29uZmlndXJlIHRocmVhZCBtb2RlIHRvIHVzZSBQU1AgYW5kIHRvIGJlIHByaXZpbGVnZWQuLiAqLworCQkJc2VjdXJlcG9ydFNFVF9DT05UUk9MKCBzZWN1cmVjb250ZXh0Q09OVFJPTF9WQUxVRV9QUklWSUxFR0VEICk7CisJCX0KKwkJI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9NUFUgKi8KKwl9Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmKCBjb25maWdFTkFCTEVfTVBVID09IDEgKQorCXNlY3VyZXBvcnROT05fU0VDVVJFX0NBTExBQkxFIFNlY3VyZUNvbnRleHRIYW5kbGVfdCBTZWN1cmVDb250ZXh0X0FsbG9jYXRlQ29udGV4dCggdWludDMyX3QgdWxTZWN1cmVTdGFja1NpemUsIHVpbnQzMl90IHVsSXNUYXNrUHJpdmlsZWdlZCApCisjZWxzZSAvKiBjb25maWdFTkFCTEVfTVBVICovCisJc2VjdXJlcG9ydE5PTl9TRUNVUkVfQ0FMTEFCTEUgU2VjdXJlQ29udGV4dEhhbmRsZV90IFNlY3VyZUNvbnRleHRfQWxsb2NhdGVDb250ZXh0KCB1aW50MzJfdCB1bFNlY3VyZVN0YWNrU2l6ZSApCisjZW5kaWYgLyogY29uZmlnRU5BQkxFX01QVSAqLworeworCXVpbnQ4X3QgKnB1Y1N0YWNrTWVtb3J5ID0gTlVMTDsKKwl1aW50MzJfdCB1bElQU1I7CisJU2VjdXJlQ29udGV4dEhhbmRsZV90IHhTZWN1cmVDb250ZXh0SGFuZGxlID0gTlVMTDsKKwkjaWYoIGNvbmZpZ0VOQUJMRV9NUFUgPT0gMSApCisJCXVpbnQzMl90ICpwdWxDdXJyZW50U3RhY2tQb2ludGVyID0gTlVMTDsKKwkjZW5kaWYgLyogY29uZmlnRU5BQkxFX01QVSAqLworCisJLyogUmVhZCB0aGUgSW50ZXJydXB0IFByb2dyYW0gU3RhdHVzIFJlZ2lzdGVyIChJUFNSKSB2YWx1ZS4gKi8KKwlzZWN1cmVwb3J0UkVBRF9JUFNSKCB1bElQU1IgKTsKKworCS8qIERvIG5vdGhpbmcgaWYgdGhlIHByb2Nlc3NvciBpcyBydW5uaW5nIGluIHRoZSBUaHJlYWQgTW9kZS4gSVBTUiBpcyB6ZXJvCisJICogd2hlbiB0aGUgcHJvY2Vzc29yIGlzIHJ1bm5pbmcgaW4gdGhlIFRocmVhZCBNb2RlLiAqLworCWlmKCB1bElQU1IgIT0gMCApCisJeworCQkvKiBBbGxvY2F0ZSB0aGUgY29udGV4dCBzdHJ1Y3R1cmUuICovCisJCXhTZWN1cmVDb250ZXh0SGFuZGxlID0gKCBTZWN1cmVDb250ZXh0SGFuZGxlX3QgKSBwdlBvcnRNYWxsb2MoIHNpemVvZiggU2VjdXJlQ29udGV4dF90ICkgKTsKKworCQlpZiggeFNlY3VyZUNvbnRleHRIYW5kbGUgIT0gTlVMTCApCisJCXsKKwkJCS8qIEFsbG9jYXRlIHRoZSBzdGFjayBzcGFjZS4gKi8KKwkJCXB1Y1N0YWNrTWVtb3J5ID0gcHZQb3J0TWFsbG9jKCB1bFNlY3VyZVN0YWNrU2l6ZSApOworCisJCQlpZiggcHVjU3RhY2tNZW1vcnkgIT0gTlVMTCApCisJCQl7CisJCQkJLyogU2luY2Ugc3RhY2sgZ3Jvd3MgZG93biwgdGhlIHN0YXJ0aW5nIHBvaW50IHdpbGwgYmUgdGhlIGxhc3QKKwkJCQkgKiBsb2NhdGlvbi4gTm90ZSB0aGF0IHRoaXMgbG9jYXRpb24gaXMgbmV4dCB0byB0aGUgbGFzdAorCQkJCSAqIGFsbG9jYXRlZCBieXRlIGJlY2F1c2UgdGhlIGhhcmR3YXJlIGRlY3JlbWVudHMgdGhlIHN0YWNrCisJCQkJICogcG9pbnRlciBiZWZvcmUgd3JpdGluZyBpLmUuIGlmIHN0YWNrIHBvaW50ZXIgaXMgMHgyLCBhIHB1c2gKKwkJCQkgKiBvcGVyYXRpb24gd2lsbCBkZWNyZW1lbnQgdGhlIHN0YWNrIHBvaW50ZXIgdG8gMHgxIGFuZCB0aGVuCisJCQkJICogd3JpdGUgYXQgMHgxLiAqLworCQkJCXhTZWN1cmVDb250ZXh0SGFuZGxlLT5wdWNTdGFja1N0YXJ0ID0gcHVjU3RhY2tNZW1vcnkgKyB1bFNlY3VyZVN0YWNrU2l6ZTsKKworCQkJCS8qIFRoZSBzdGFjayBjYW5ub3QgZ28gYmV5b25kIHRoaXMgbG9jYXRpb24uIFRoaXMgdmFsdWUgaXMKKwkJCQkgKiBwcm9ncmFtbWVkIGluIHRoZSBQU1BMSU0gcmVnaXN0ZXIgb24gY29udGV4dCBzd2l0Y2guKi8KKwkJCQl4U2VjdXJlQ29udGV4dEhhbmRsZS0+cHVjU3RhY2tMaW1pdCA9IHB1Y1N0YWNrTWVtb3J5OworCisJCQkJI2lmKCBjb25maWdFTkFCTEVfTVBVID09IDEgKQorCQkJCXsKKwkJCQkJLyogU3RvcmUgdGhlIGNvcnJlY3QgQ09OVFJPTCB2YWx1ZSBmb3IgdGhlIHRhc2sgb24gdGhlIHN0YWNrLgorCQkJCQkgKiBUaGlzIHZhbHVlIGlzIHByb2dyYW1tZWQgaW4gdGhlIENPTlRST0wgcmVnaXN0ZXIgb24KKwkJCQkJICogY29udGV4dCBzd2l0Y2guICovCisJCQkJCXB1bEN1cnJlbnRTdGFja1BvaW50ZXIgPSAoIHVpbnQzMl90ICogKSB4U2VjdXJlQ29udGV4dEhhbmRsZS0+cHVjU3RhY2tTdGFydDsKKwkJCQkJcHVsQ3VycmVudFN0YWNrUG9pbnRlci0tOworCQkJCQlpZiggdWxJc1Rhc2tQcml2aWxlZ2VkICkKKwkJCQkJeworCQkJCQkJKiggcHVsQ3VycmVudFN0YWNrUG9pbnRlciApID0gc2VjdXJlY29udGV4dENPTlRST0xfVkFMVUVfUFJJVklMRUdFRDsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCSooIHB1bEN1cnJlbnRTdGFja1BvaW50ZXIgKSA9IHNlY3VyZWNvbnRleHRDT05UUk9MX1ZBTFVFX1VOUFJJVklMRUdFRDsKKwkJCQkJfQorCisJCQkJCS8qIFN0b3JlIHRoZSBjdXJyZW50IHN0YWNrIHBvaW50ZXIuIFRoaXMgdmFsdWUgaXMgcHJvZ3JhbW1lZCBpbgorCQkJCQkgKiB0aGUgUFNQIHJlZ2lzdGVyIG9uIGNvbnRleHQgc3dpdGNoLiAqLworCQkJCQl4U2VjdXJlQ29udGV4dEhhbmRsZS0+cHVjQ3VycmVudFN0YWNrUG9pbnRlciA9ICggdWludDhfdCAqICkgcHVsQ3VycmVudFN0YWNrUG9pbnRlcjsKKwkJCQl9CisJCQkJI2Vsc2UgLyogY29uZmlnRU5BQkxFX01QVSAqLworCQkJCXsKKwkJCQkJLyogQ3VycmVudCBTUCBpcyBzZXQgdG8gdGhlIHN0YXJ0aW5nIG9mIHRoZSBzdGFjay4gVGhpcworCQkJCQkgKiB2YWx1ZSBwcm9ncmFtbWVkIGluIHRoZSBQU1AgcmVnaXN0ZXIgb24gY29udGV4dCBzd2l0Y2guICovCisJCQkJCXhTZWN1cmVDb250ZXh0SGFuZGxlLT5wdWNDdXJyZW50U3RhY2tQb2ludGVyID0geFNlY3VyZUNvbnRleHRIYW5kbGUtPnB1Y1N0YWNrU3RhcnQ7CisKKwkJCQl9CisJCQkJI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9NUFUgKi8KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkvKiBGcmVlIHRoZSBjb250ZXh0IHRvIGF2b2lkIG1lbW9yeSBsZWFrIGFuZCBtYWtlIHN1cmUgdG8gcmV0dXJuCisJCQkJICogTlVMTCB0byBpbmRpY2F0ZSBmYWlsdXJlLiAqLworCQkJCXZQb3J0RnJlZSggeFNlY3VyZUNvbnRleHRIYW5kbGUgKTsKKwkJCQl4U2VjdXJlQ29udGV4dEhhbmRsZSA9IE5VTEw7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4geFNlY3VyZUNvbnRleHRIYW5kbGU7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc2VjdXJlcG9ydE5PTl9TRUNVUkVfQ0FMTEFCTEUgdm9pZCBTZWN1cmVDb250ZXh0X0ZyZWVDb250ZXh0KCBTZWN1cmVDb250ZXh0SGFuZGxlX3QgeFNlY3VyZUNvbnRleHRIYW5kbGUgKQoreworCXVpbnQzMl90IHVsSVBTUjsKKworCS8qIFJlYWQgdGhlIEludGVycnVwdCBQcm9ncmFtIFN0YXR1cyBSZWdpc3RlciAoSVBTUikgdmFsdWUuICovCisJc2VjdXJlcG9ydFJFQURfSVBTUiggdWxJUFNSICk7CisKKwkvKiBEbyBub3RoaW5nIGlmIHRoZSBwcm9jZXNzb3IgaXMgcnVubmluZyBpbiB0aGUgVGhyZWFkIE1vZGUuIElQU1IgaXMgemVybworCSAqIHdoZW4gdGhlIHByb2Nlc3NvciBpcyBydW5uaW5nIGluIHRoZSBUaHJlYWQgTW9kZS4gKi8KKwlpZiggdWxJUFNSICE9IDAgKQorCXsKKwkJLyogRW5zdXJlIHRoYXQgdmFsaWQgcGFyYW1ldGVycyBhcmUgcGFzc2VkLiAqLworCQlzZWN1cmVwb3J0QVNTRVJUKCB4U2VjdXJlQ29udGV4dEhhbmRsZSAhPSBOVUxMICk7CisKKwkJLyogRnJlZSB0aGUgc3RhY2sgc3BhY2UuICovCisJCXZQb3J0RnJlZSggeFNlY3VyZUNvbnRleHRIYW5kbGUtPnB1Y1N0YWNrTGltaXQgKTsKKworCQkvKiBGcmVlIHRoZSBjb250ZXh0IGl0c2VsZi4gKi8KKwkJdlBvcnRGcmVlKCB4U2VjdXJlQ29udGV4dEhhbmRsZSApOworCX0KK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpkaWZmIC0tZ2l0IGEvU291cmNlL3BvcnRhYmxlL0lBUi9BUk1fQ00zMy9zZWN1cmUvc2VjdXJlX2NvbnRleHQuaCBiL1NvdXJjZS9wb3J0YWJsZS9JQVIvQVJNX0NNMzMvc2VjdXJlL3NlY3VyZV9jb250ZXh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE0OGJmZgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9wb3J0YWJsZS9JQVIvQVJNX0NNMzMvc2VjdXJlL3NlY3VyZV9jb250ZXh0LmgKQEAgLTAsMCArMSwxMTEgQEAKKy8qCisgKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjIuMQorICogQ29weXJpZ2h0IChDKSAyMDE5IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKKyAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCisgKiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCisgKiB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZgorICogdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLAorICogc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCisgKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUworICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SCisgKiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIKKyAqIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIGh0dHA6Ly93d3cuRnJlZVJUT1Mub3JnCisgKiBodHRwOi8vYXdzLmFtYXpvbi5jb20vZnJlZXJ0b3MKKyAqCisgKiAxIHRhYiA9PSA0IHNwYWNlcyEKKyAqLworCisjaWZuZGVmIF9fU0VDVVJFX0NPTlRFWFRfSF9fCisjZGVmaW5lIF9fU0VDVVJFX0NPTlRFWFRfSF9fCisKKy8qIFN0YW5kYXJkIGluY2x1ZGVzLiAqLworI2luY2x1ZGUgPHN0ZGludC5oPgorCisvKiBGcmVlUlRPUyBpbmNsdWRlcy4gKi8KKyNpbmNsdWRlICJGcmVlUlRPU0NvbmZpZy5oIgorCisvKioKKyAqIEBicmllZiBQU1AgdmFsdWUgd2hlbiBubyB0YXNrJ3MgY29udGV4dCBpcyBsb2FkZWQuCisgKi8KKyNkZWZpbmUgc2VjdXJlY29udGV4dE5PX1NUQUNLCTB4MAorCisvKioKKyAqIEBicmllZiBPcGFxdWUgaGFuZGxlLgorICovCitzdHJ1Y3QgU2VjdXJlQ29udGV4dDsKK3R5cGVkZWYgc3RydWN0IFNlY3VyZUNvbnRleHQqCVNlY3VyZUNvbnRleHRIYW5kbGVfdDsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAqIEBicmllZiBJbml0aWFsaXplcyB0aGUgc2VjdXJlIGNvbnRleHQgbWFuYWdlbWVudCBzeXN0ZW0uCisgKgorICogUFNQIGlzIHNldCB0byBOVUxMIGFuZCB0aGVyZWZvcmUgYSB0YXNrIG11c3QgYWxsb2NhdGUgYW5kIGxvYWQgYSBjb250ZXh0CisgKiBiZWZvcmUgY2FsbGluZyBhbnkgc2VjdXJlIHNpZGUgZnVuY3Rpb24gaW4gdGhlIHRocmVhZCBtb2RlLgorICoKKyAqIEBub3RlIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgaW4gdGhlIGhhbmRsZXIgbW9kZS4gSXQgaXMgbm8tb3AgaWYgY2FsbGVkCisgKiBpbiB0aGUgdGhyZWFkIG1vZGUuCisgKi8KK3ZvaWQgU2VjdXJlQ29udGV4dF9Jbml0KCB2b2lkICk7CisKKy8qKgorICogQGJyaWVmIEFsbG9jYXRlcyBhIGNvbnRleHQgb24gdGhlIHNlY3VyZSBzaWRlLgorICoKKyAqIEBub3RlIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgaW4gdGhlIGhhbmRsZXIgbW9kZS4gSXQgaXMgbm8tb3AgaWYgY2FsbGVkCisgKiBpbiB0aGUgdGhyZWFkIG1vZGUuCisgKgorICogQHBhcmFtW2luXSB1bFNlY3VyZVN0YWNrU2l6ZSBTaXplIG9mIHRoZSBzdGFjayB0byBhbGxvY2F0ZSBvbiBzZWN1cmUgc2lkZS4KKyAqIEBwYXJhbVtpbl0gdWxJc1Rhc2tQcml2aWxlZ2VkIDEgaWYgdGhlIGNhbGxpbmcgdGFzayBpcyBwcml2aWxlZ2VkLCAwIG90aGVyd2lzZS4KKyAqCisgKiBAcmV0dXJuIE9wYXF1ZSBjb250ZXh0IGhhbmRsZSBpZiBjb250ZXh0IGlzIHN1Y2Nlc3NmdWxseSBhbGxvY2F0ZWQsIE5VTEwKKyAqIG90aGVyd2lzZS4KKyAqLworI2lmKCBjb25maWdFTkFCTEVfTVBVID09IDEgKQorCVNlY3VyZUNvbnRleHRIYW5kbGVfdCBTZWN1cmVDb250ZXh0X0FsbG9jYXRlQ29udGV4dCggdWludDMyX3QgdWxTZWN1cmVTdGFja1NpemUsIHVpbnQzMl90IHVsSXNUYXNrUHJpdmlsZWdlZCApOworI2Vsc2UgLyogY29uZmlnRU5BQkxFX01QVSAqLworCVNlY3VyZUNvbnRleHRIYW5kbGVfdCBTZWN1cmVDb250ZXh0X0FsbG9jYXRlQ29udGV4dCggdWludDMyX3QgdWxTZWN1cmVTdGFja1NpemUgKTsKKyNlbmRpZiAvKiBjb25maWdFTkFCTEVfTVBVICovCisKKy8qKgorICogQGJyaWVmIEZyZWVzIHRoZSBnaXZlbiBjb250ZXh0LgorICoKKyAqIEBub3RlIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgaW4gdGhlIGhhbmRsZXIgbW9kZS4gSXQgaXMgbm8tb3AgaWYgY2FsbGVkCisgKiBpbiB0aGUgdGhyZWFkIG1vZGUuCisgKgorICogQHBhcmFtW2luXSB4U2VjdXJlQ29udGV4dEhhbmRsZSBDb250ZXh0IGhhbmRsZSBjb3JyZXNwb25kaW5nIHRvIHRoZQorICogY29udGV4dCB0byBiZSBmcmVlZC4KKyAqLwordm9pZCBTZWN1cmVDb250ZXh0X0ZyZWVDb250ZXh0KCBTZWN1cmVDb250ZXh0SGFuZGxlX3QgeFNlY3VyZUNvbnRleHRIYW5kbGUgKTsKKworLyoqCisgKiBAYnJpZWYgTG9hZHMgdGhlIGdpdmVuIGNvbnRleHQuCisgKgorICogQG5vdGUgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBpbiB0aGUgaGFuZGxlciBtb2RlLiBJdCBpcyBuby1vcCBpZiBjYWxsZWQKKyAqIGluIHRoZSB0aHJlYWQgbW9kZS4KKyAqCisgKiBAcGFyYW1baW5dIHhTZWN1cmVDb250ZXh0SGFuZGxlIENvbnRleHQgaGFuZGxlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGNvbnRleHQKKyAqIHRvIGJlIGxvYWRlZC4KKyAqLwordm9pZCBTZWN1cmVDb250ZXh0X0xvYWRDb250ZXh0KCBTZWN1cmVDb250ZXh0SGFuZGxlX3QgeFNlY3VyZUNvbnRleHRIYW5kbGUgKTsKKworLyoqCisgKiBAYnJpZWYgU2F2ZXMgdGhlIGdpdmVuIGNvbnRleHQuCisgKgorICogQG5vdGUgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBpbiB0aGUgaGFuZGxlciBtb2RlLiBJdCBpcyBuby1vcCBpZiBjYWxsZWQKKyAqIGluIHRoZSB0aHJlYWQgbW9kZS4KKyAqCisgKiBAcGFyYW1baW5dIHhTZWN1cmVDb250ZXh0SGFuZGxlIENvbnRleHQgaGFuZGxlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGNvbnRleHQKKyAqIHRvIGJlIHNhdmVkLgorICovCit2b2lkIFNlY3VyZUNvbnRleHRfU2F2ZUNvbnRleHQoIFNlY3VyZUNvbnRleHRIYW5kbGVfdCB4U2VjdXJlQ29udGV4dEhhbmRsZSApOworCisjZW5kaWYgLyogX19TRUNVUkVfQ09OVEVYVF9IX18gKi8KZGlmZiAtLWdpdCBhL1NvdXJjZS9wb3J0YWJsZS9JQVIvQVJNX0NNMzMvc2VjdXJlL3NlY3VyZV9jb250ZXh0X3BvcnQuYyBiL1NvdXJjZS9wb3J0YWJsZS9JQVIvQVJNX0NNMzMvc2VjdXJlL3NlY3VyZV9jb250ZXh0X3BvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTlkYjFlCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL3BvcnRhYmxlL0lBUi9BUk1fQ00zMy9zZWN1cmUvc2VjdXJlX2NvbnRleHRfcG9ydC5jCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjIuMQorICogQ29weXJpZ2h0IChDKSAyMDE5IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKKyAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCisgKiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCisgKiB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZgorICogdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLAorICogc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCisgKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUworICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SCisgKiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIKKyAqIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIGh0dHA6Ly93d3cuRnJlZVJUT1Mub3JnCisgKiBodHRwOi8vYXdzLmFtYXpvbi5jb20vZnJlZXJ0b3MKKyAqCisgKiAxIHRhYiA9PSA0IHNwYWNlcyEKKyAqLworCisvKiBTZWN1cmUgY29udGV4dCBpbmNsdWRlcy4gKi8KKyNpbmNsdWRlICJzZWN1cmVfY29udGV4dC5oIgorCisvKiBTZWN1cmUgcG9ydCBtYWNyb3MuICovCisjaW5jbHVkZSAic2VjdXJlX3BvcnRfbWFjcm9zLmgiCisKKy8qIEZ1bmN0aW9ucyBpbXBsZW1lbnRlZCBpbiBhc3NlbWJsZXIgZmlsZS4gKi8KK2V4dGVybiB2b2lkIFNlY3VyZUNvbnRleHRfTG9hZENvbnRleHRBc20oIFNlY3VyZUNvbnRleHRIYW5kbGVfdCB4U2VjdXJlQ29udGV4dEhhbmRsZSApOworZXh0ZXJuIHZvaWQgU2VjdXJlQ29udGV4dF9TYXZlQ29udGV4dEFzbSggU2VjdXJlQ29udGV4dEhhbmRsZV90IHhTZWN1cmVDb250ZXh0SGFuZGxlICk7CisKK3NlY3VyZXBvcnROT05fU0VDVVJFX0NBTExBQkxFIHZvaWQgU2VjdXJlQ29udGV4dF9Mb2FkQ29udGV4dCggU2VjdXJlQ29udGV4dEhhbmRsZV90IHhTZWN1cmVDb250ZXh0SGFuZGxlICkKK3sKKwlTZWN1cmVDb250ZXh0X0xvYWRDb250ZXh0QXNtKCB4U2VjdXJlQ29udGV4dEhhbmRsZSApOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3NlY3VyZXBvcnROT05fU0VDVVJFX0NBTExBQkxFIHZvaWQgU2VjdXJlQ29udGV4dF9TYXZlQ29udGV4dCggU2VjdXJlQ29udGV4dEhhbmRsZV90IHhTZWN1cmVDb250ZXh0SGFuZGxlICkKK3sKKwlTZWN1cmVDb250ZXh0X1NhdmVDb250ZXh0QXNtKCB4U2VjdXJlQ29udGV4dEhhbmRsZSApOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCmRpZmYgLS1naXQgYS9Tb3VyY2UvcG9ydGFibGUvSUFSL0FSTV9DTTMzL3NlY3VyZS9zZWN1cmVfY29udGV4dF9wb3J0X2FzbS5zIGIvU291cmNlL3BvcnRhYmxlL0lBUi9BUk1fQ00zMy9zZWN1cmUvc2VjdXJlX2NvbnRleHRfcG9ydF9hc20ucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2JmZTZlCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL3BvcnRhYmxlL0lBUi9BUk1fQ00zMy9zZWN1cmUvc2VjdXJlX2NvbnRleHRfcG9ydF9hc20ucwpAQCAtMCwwICsxLDczIEBACisvKgorICogRnJlZVJUT1MgS2VybmVsIFYxMC4yLjEKKyAqIENvcHlyaWdodCAoQykgMjAxOSBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCisgKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgorICogdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bworICogdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YKKyAqIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKKyAqIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAorICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MKKyAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUgorICogQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSCisgKiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBodHRwOi8vd3d3LkZyZWVSVE9TLm9yZworICogaHR0cDovL2F3cy5hbWF6b24uY29tL2ZyZWVydG9zCisgKgorICogMSB0YWIgPT0gNCBzcGFjZXMhCisgKi8KKworCVNFQ1RJT04gLnRleHQ6Q09ERTpOT1JPT1QoMikKKwlUSFVNQgorCisJUFVCTElDIFNlY3VyZUNvbnRleHRfTG9hZENvbnRleHRBc20KKwlQVUJMSUMgU2VjdXJlQ29udGV4dF9TYXZlQ29udGV4dEFzbQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK1NlY3VyZUNvbnRleHRfTG9hZENvbnRleHRBc206CisJLyogeFNlY3VyZUNvbnRleHRIYW5kbGUgdmFsdWUgaXMgaW4gcjAuICovCisJbXJzIHIxLCBpcHNyCQkJCQkJCS8qIHIxID0gSVBTUi4gKi8KKwljYnogcjEsIGxvYWRfY3R4X3RoZXJhZF9tb2RlCQkJLyogRG8gbm90aGluZyBpZiB0aGUgcHJvY2Vzc29yIGlzIHJ1bm5pbmcgaW4gdGhlIFRocmVhZCBNb2RlLiAqLworCWxkbWlhIHIwISwge3IxLCByMn0JCQkJCQkvKiByMSA9IHhTZWN1cmVDb250ZXh0SGFuZGxlLT5wdWNDdXJyZW50U3RhY2tQb2ludGVyLCByMiA9IHhTZWN1cmVDb250ZXh0SGFuZGxlLT5wdWNTdGFja0xpbWl0LiAqLworI2lmICggY29uZmlnRU5BQkxFX01QVSA9PSAxICkKKwlsZG1pYSByMSEsIHtyM30JCQkJCQkJLyogUmVhZCBDT05UUk9MIHJlZ2lzdGVyIHZhbHVlIGZyb20gdGFzaydzIHN0YWNrLiByMyA9IENPTlRST0wuICovCisJbXNyIGNvbnRyb2wsIHIzCQkJCQkJCS8qIENPTlRST0wgPSByMy4gKi8KKyNlbmRpZiAvKiBjb25maWdFTkFCTEVfTVBVICovCisJbXNyIHBzcGxpbSwgcjIJCQkJCQkJLyogUFNQTElNID0gcjIuICovCisJbXNyIHBzcCwgcjEJCQkJCQkJCS8qIFBTUCA9IHIxLiAqLworCisJbG9hZF9jdHhfdGhlcmFkX21vZGU6CisJCWJ4IGxyCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworU2VjdXJlQ29udGV4dF9TYXZlQ29udGV4dEFzbToKKwkvKiB4U2VjdXJlQ29udGV4dEhhbmRsZSB2YWx1ZSBpcyBpbiByMC4gKi8KKwltcnMgcjEsIGlwc3IJCQkJCQkJLyogcjEgPSBJUFNSLiAqLworCWNieiByMSwgc2F2ZV9jdHhfdGhlcmFkX21vZGUJCQkvKiBEbyBub3RoaW5nIGlmIHRoZSBwcm9jZXNzb3IgaXMgcnVubmluZyBpbiB0aGUgVGhyZWFkIE1vZGUuICovCisJbXJzIHIxLCBwc3AJCQkJCQkJCS8qIHIxID0gUFNQLiAqLworI2lmICggY29uZmlnRU5BQkxFX0ZQVSA9PSAxICkKKwl2c3RtZGIgcjEhLCB7czB9CQkJCQkJLyogVHJpZ2dlciB0aGUgZGVmZmVycmVkIHN0YWNraW5nIG9mIEZQVSByZWdpc3RlcnMuICovCisJdmxkbWlhIHIxISwge3MwfQkJCQkJCS8qIE51bGxpZnkgdGhlIGVmZmVjdCBvZiB0aGUgcGVydmlvdXMgc3RhdGVtZW50LiAqLworI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9GUFUgKi8KKyNpZiAoIGNvbmZpZ0VOQUJMRV9NUFUgPT0gMSApCisJbXJzIHIyLCBjb250cm9sCQkJCQkJCS8qIHIyID0gQ09OVFJPTC4gKi8KKwlzdG1kYiByMSEsIHtyMn0JCQkJCQkJLyogU3RvcmUgQ09OVFJPTCB2YWx1ZSBvbiB0aGUgc3RhY2suICovCisjZW5kaWYgLyogY29uZmlnRU5BQkxFX01QVSAqLworCXN0ciByMSwgW3IwXQkJCQkJCQkvKiBTYXZlIHRoZSB0b3Agb2Ygc3RhY2sgaW4gY29udGV4dC4geFNlY3VyZUNvbnRleHRIYW5kbGUtPnB1Y0N1cnJlbnRTdGFja1BvaW50ZXIgPSByMS4gKi8KKwltb3ZzIHIxLCAjMAkJCQkJCQkJLyogcjEgPSBzZWN1cmVjb250ZXh0Tk9fU1RBQ0suICovCisJbXNyIHBzcGxpbSwgcjEJCQkJCQkJLyogUFNQTElNID0gc2VjdXJlY29udGV4dE5PX1NUQUNLLiAqLworCW1zciBwc3AsIHIxCQkJCQkJCQkvKiBQU1AgPSBzZWN1cmVjb250ZXh0Tk9fU1RBQ0sgaS5lLiBObyBzdGFjayBmb3IgdGhyZWFkIG1vZGUgdW50aWwgbmV4dCB0YXNrJ3MgY29udGV4dCBpcyBsb2FkZWQuICovCisKKwlzYXZlX2N0eF90aGVyYWRfbW9kZToKKwkJYnggbHIKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJRU5ECmRpZmYgLS1naXQgYS9Tb3VyY2UvcG9ydGFibGUvSUFSL0FSTV9DTTMzL3NlY3VyZS9zZWN1cmVfaGVhcC5jIGIvU291cmNlL3BvcnRhYmxlL0lBUi9BUk1fQ00zMy9zZWN1cmUvc2VjdXJlX2hlYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGZjZTVjCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL3BvcnRhYmxlL0lBUi9BUk1fQ00zMy9zZWN1cmUvc2VjdXJlX2hlYXAuYwpAQCAtMCwwICsxLDQ1MCBAQAorLyoKKyAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMi4xCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgorICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KKyAqIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KKyAqIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mCisgKiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCisgKiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKKyAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTCisgKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IKKyAqIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUgorICogSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogaHR0cDovL3d3dy5GcmVlUlRPUy5vcmcKKyAqIGh0dHA6Ly9hd3MuYW1hem9uLmNvbS9mcmVlcnRvcworICoKKyAqIDEgdGFiID09IDQgc3BhY2VzIQorICovCisKKy8qIFN0YW5kYXJkIGluY2x1ZGVzLiAqLworI2luY2x1ZGUgPHN0ZGludC5oPgorCisvKiBTZWN1cmUgY29udGV4dCBoZWFwIGluY2x1ZGVzLiAqLworI2luY2x1ZGUgInNlY3VyZV9oZWFwLmgiCisKKy8qIFNlY3VyZSBwb3J0IG1hY3Jvcy4gKi8KKyNpbmNsdWRlICJzZWN1cmVfcG9ydF9tYWNyb3MuaCIKKworLyoqCisgKiBAYnJpZWYgVG90YWwgaGVhcCBzaXplLgorICovCisjZGVmaW5lIHNlY3VyZWNvbmZpZ1RPVEFMX0hFQVBfU0laRQkJKCAoICggc2l6ZV90ICkgKCAxMCAqIDEwMjQgKSApICkKKworLyogTm8gdGVzdCBtYXJrZXIgYnkgZGVmYXVsdC4gKi8KKyNpZm5kZWYgbXRDT1ZFUkFHRV9URVNUX01BUktFUgorCSNkZWZpbmUgbXRDT1ZFUkFHRV9URVNUX01BUktFUigpCisjZW5kaWYKKworLyogTm8gdHJhY2luZyBieSBkZWZhdWx0LiAqLworI2lmbmRlZiB0cmFjZU1BTExPQworCSNkZWZpbmUgdHJhY2VNQUxMT0MoIHB2UmV0dXJuLCB4V2FudGVkU2l6ZSApCisjZW5kaWYKKworLyogTm8gdHJhY2luZyBieSBkZWZhdWx0LiAqLworI2lmbmRlZiB0cmFjZUZSRUUKKwkjZGVmaW5lIHRyYWNlRlJFRSggcHYsIHhCbG9ja1NpemUgKQorI2VuZGlmCisKKy8qIEJsb2NrIHNpemVzIG11c3Qgbm90IGdldCB0b28gc21hbGwuICovCisjZGVmaW5lIHNlY3VyZWhlYXBNSU5JTVVNX0JMT0NLX1NJWkUJKCAoIHNpemVfdCApICggeEhlYXBTdHJ1Y3RTaXplIDw8IDEgKSApCisKKy8qIEFzc3VtZXMgOGJpdCBieXRlcyEgKi8KKyNkZWZpbmUgc2VjdXJlaGVhcEJJVFNfUEVSX0JZVEUJCQkoICggc2l6ZV90ICkgOCApCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogQWxsb2NhdGUgdGhlIG1lbW9yeSBmb3IgdGhlIGhlYXAuICovCisjaWYoIGNvbmZpZ0FQUExJQ0FUSU9OX0FMTE9DQVRFRF9IRUFQID09IDEgKQorCS8qIFRoZSBhcHBsaWNhdGlvbiB3cml0ZXIgaGFzIGFscmVhZHkgZGVmaW5lZCB0aGUgYXJyYXkgdXNlZCBmb3IgdGhlIFJUT1MKKwkgKiBoZWFwIC0gcHJvYmFibHkgc28gaXQgY2FuIGJlIHBsYWNlZCBpbiBhIHNwZWNpYWwgc2VnbWVudCBvciBhZGRyZXNzLiAqLworCWV4dGVybiB1aW50OF90IHVjSGVhcFsgc2VjdXJlY29uZmlnVE9UQUxfSEVBUF9TSVpFIF07CisjZWxzZSAvKiBjb25maWdBUFBMSUNBVElPTl9BTExPQ0FURURfSEVBUCAqLworCXN0YXRpYyB1aW50OF90IHVjSGVhcFsgc2VjdXJlY29uZmlnVE9UQUxfSEVBUF9TSVpFIF07CisjZW5kaWYgLyogY29uZmlnQVBQTElDQVRJT05fQUxMT0NBVEVEX0hFQVAgKi8KKworLyoqCisgKiBAYnJpZWYgVGhlIGxpbmtlZCBsaXN0IHN0cnVjdHVyZS4KKyAqCisgKiBUaGlzIGlzIHVzZWQgdG8gbGluayBmcmVlIGJsb2NrcyBpbiBvcmRlciBvZiB0aGVpciBtZW1vcnkgYWRkcmVzcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgQV9CTE9DS19MSU5LCit7CisJc3RydWN0IEFfQkxPQ0tfTElOSyAqcHhOZXh0RnJlZUJsb2NrOwkvKio8IFRoZSBuZXh0IGZyZWUgYmxvY2sgaW4gdGhlIGxpc3QuICovCisJc2l6ZV90IHhCbG9ja1NpemU7CQkJCQkJLyoqPCBUaGUgc2l6ZSBvZiB0aGUgZnJlZSBibG9jay4gKi8KK30gQmxvY2tMaW5rX3Q7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqCisgKiBAYnJpZWYgQ2FsbGVkIGF1dG9tYXRpY2FsbHkgdG8gc2V0dXAgdGhlIHJlcXVpcmVkIGhlYXAgc3RydWN0dXJlcyB0aGUgZmlyc3QKKyAqIHRpbWUgcHZQb3J0TWFsbG9jKCkgaXMgY2FsbGVkLgorICovCitzdGF0aWMgdm9pZCBwcnZIZWFwSW5pdCggdm9pZCApOworCisvKioKKyAqIEBicmllZiBJbnNlcnRzIGEgYmxvY2sgb2YgbWVtb3J5IHRoYXQgaXMgYmVpbmcgZnJlZWQgaW50byB0aGUgY29ycmVjdAorICogcG9zaXRpb24gaW4gdGhlIGxpc3Qgb2YgZnJlZSBtZW1vcnkgYmxvY2tzLgorICoKKyAqIFRoZSBibG9jayBiZWluZyBmcmVlZCB3aWxsIGJlIG1lcmdlZCB3aXRoIHRoZSBibG9jayBpbiBmcm9udCBpdCBhbmQvb3IgdGhlCisgKiBibG9jayBiZWhpbmQgaXQgaWYgdGhlIG1lbW9yeSBibG9ja3MgYXJlIGFkamFjZW50IHRvIGVhY2ggb3RoZXIuCisgKgorICogQHBhcmFtW2luXSBweEJsb2NrVG9JbnNlcnQgVGhlIGJsb2NrIGJlaW5nIGZyZWVkLgorICovCitzdGF0aWMgdm9pZCBwcnZJbnNlcnRCbG9ja0ludG9GcmVlTGlzdCggQmxvY2tMaW5rX3QgKnB4QmxvY2tUb0luc2VydCApOworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKgorICogQGJyaWVmIFRoZSBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgcGxhY2VkIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBhbGxvY2F0ZWQKKyAqIG1lbW9yeSBibG9jayBtdXN0IGJ5IGNvcnJlY3RseSBieXRlIGFsaWduZWQuCisgKi8KK3N0YXRpYyBjb25zdCBzaXplX3QgeEhlYXBTdHJ1Y3RTaXplID0gKCBzaXplb2YoIEJsb2NrTGlua190ICkgKyAoICggc2l6ZV90ICkgKCBzZWN1cmVwb3J0QllURV9BTElHTk1FTlQgLSAxICkgKSApICYgfiggKCBzaXplX3QgKSBzZWN1cmVwb3J0QllURV9BTElHTk1FTlRfTUFTSyApOworCisvKioKKyAqIEBicmllZiBDcmVhdGUgYSBjb3VwbGUgb2YgbGlzdCBsaW5rcyB0byBtYXJrIHRoZSBzdGFydCBhbmQgZW5kIG9mIHRoZSBsaXN0LgorICovCitzdGF0aWMgQmxvY2tMaW5rX3QgeFN0YXJ0LCAqcHhFbmQgPSBOVUxMOworCisvKioKKyAqIEBicmllZiBLZWVwcyB0cmFjayBvZiB0aGUgbnVtYmVyIG9mIGZyZWUgYnl0ZXMgcmVtYWluaW5nLCBidXQgc2F5cyBub3RoaW5nCisgKiBhYm91dCBmcmFnbWVudGF0aW9uLgorICovCitzdGF0aWMgc2l6ZV90IHhGcmVlQnl0ZXNSZW1haW5pbmcgPSAwVTsKK3N0YXRpYyBzaXplX3QgeE1pbmltdW1FdmVyRnJlZUJ5dGVzUmVtYWluaW5nID0gMFU7CisKKy8qKgorICogQGJyaWVmIEdldHMgc2V0IHRvIHRoZSB0b3AgYml0IG9mIGFuIHNpemVfdCB0eXBlLgorICoKKyAqIFdoZW4gdGhpcyBiaXQgaW4gdGhlIHhCbG9ja1NpemUgbWVtYmVyIG9mIGFuIEJsb2NrTGlua190IHN0cnVjdHVyZSBpcyBzZXQKKyAqIHRoZW4gdGhlIGJsb2NrIGJlbG9uZ3MgdG8gdGhlIGFwcGxpY2F0aW9uLiBXaGVuIHRoZSBiaXQgaXMgZnJlZSB0aGUgYmxvY2sgaXMKKyAqIHN0aWxsIHBhcnQgb2YgdGhlIGZyZWUgaGVhcCBzcGFjZS4KKyAqLworc3RhdGljIHNpemVfdCB4QmxvY2tBbGxvY2F0ZWRCaXQgPSAwOworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB2b2lkIHBydkhlYXBJbml0KCB2b2lkICkKK3sKK0Jsb2NrTGlua190ICpweEZpcnN0RnJlZUJsb2NrOwordWludDhfdCAqcHVjQWxpZ25lZEhlYXA7CitzaXplX3QgdXhBZGRyZXNzOworc2l6ZV90IHhUb3RhbEhlYXBTaXplID0gc2VjdXJlY29uZmlnVE9UQUxfSEVBUF9TSVpFOworCisJLyogRW5zdXJlIHRoZSBoZWFwIHN0YXJ0cyBvbiBhIGNvcnJlY3RseSBhbGlnbmVkIGJvdW5kYXJ5LiAqLworCXV4QWRkcmVzcyA9ICggc2l6ZV90ICkgdWNIZWFwOworCisJaWYoICggdXhBZGRyZXNzICYgc2VjdXJlcG9ydEJZVEVfQUxJR05NRU5UX01BU0sgKSAhPSAwICkKKwl7CisJCXV4QWRkcmVzcyArPSAoIHNlY3VyZXBvcnRCWVRFX0FMSUdOTUVOVCAtIDEgKTsKKwkJdXhBZGRyZXNzICY9IH4oICggc2l6ZV90ICkgc2VjdXJlcG9ydEJZVEVfQUxJR05NRU5UX01BU0sgKTsKKwkJeFRvdGFsSGVhcFNpemUgLT0gdXhBZGRyZXNzIC0gKCBzaXplX3QgKSB1Y0hlYXA7CisJfQorCisJcHVjQWxpZ25lZEhlYXAgPSAoIHVpbnQ4X3QgKiApIHV4QWRkcmVzczsKKworCS8qIHhTdGFydCBpcyB1c2VkIHRvIGhvbGQgYSBwb2ludGVyIHRvIHRoZSBmaXJzdCBpdGVtIGluIHRoZSBsaXN0IG9mIGZyZWUKKwkgKiBibG9ja3MuICBUaGUgdm9pZCBjYXN0IGlzIHVzZWQgdG8gcHJldmVudCBjb21waWxlciB3YXJuaW5ncy4gKi8KKwl4U3RhcnQucHhOZXh0RnJlZUJsb2NrID0gKCB2b2lkICogKSBwdWNBbGlnbmVkSGVhcDsKKwl4U3RhcnQueEJsb2NrU2l6ZSA9ICggc2l6ZV90ICkgMDsKKworCS8qIHB4RW5kIGlzIHVzZWQgdG8gbWFyayB0aGUgZW5kIG9mIHRoZSBsaXN0IG9mIGZyZWUgYmxvY2tzIGFuZCBpcyBpbnNlcnRlZAorCSAqIGF0IHRoZSBlbmQgb2YgdGhlIGhlYXAgc3BhY2UuICovCisJdXhBZGRyZXNzID0gKCAoIHNpemVfdCApIHB1Y0FsaWduZWRIZWFwICkgKyB4VG90YWxIZWFwU2l6ZTsKKwl1eEFkZHJlc3MgLT0geEhlYXBTdHJ1Y3RTaXplOworCXV4QWRkcmVzcyAmPSB+KCAoIHNpemVfdCApIHNlY3VyZXBvcnRCWVRFX0FMSUdOTUVOVF9NQVNLICk7CisJcHhFbmQgPSAoIHZvaWQgKiApIHV4QWRkcmVzczsKKwlweEVuZC0+eEJsb2NrU2l6ZSA9IDA7CisJcHhFbmQtPnB4TmV4dEZyZWVCbG9jayA9IE5VTEw7CisKKwkvKiBUbyBzdGFydCB3aXRoIHRoZXJlIGlzIGEgc2luZ2xlIGZyZWUgYmxvY2sgdGhhdCBpcyBzaXplZCB0byB0YWtlIHVwIHRoZQorCSAqIGVudGlyZSBoZWFwIHNwYWNlLCBtaW51cyB0aGUgc3BhY2UgdGFrZW4gYnkgcHhFbmQuICovCisJcHhGaXJzdEZyZWVCbG9jayA9ICggdm9pZCAqICkgcHVjQWxpZ25lZEhlYXA7CisJcHhGaXJzdEZyZWVCbG9jay0+eEJsb2NrU2l6ZSA9IHV4QWRkcmVzcyAtICggc2l6ZV90ICkgcHhGaXJzdEZyZWVCbG9jazsKKwlweEZpcnN0RnJlZUJsb2NrLT5weE5leHRGcmVlQmxvY2sgPSBweEVuZDsKKworCS8qIE9ubHkgb25lIGJsb2NrIGV4aXN0cyAtIGFuZCBpdCBjb3ZlcnMgdGhlIGVudGlyZSB1c2FibGUgaGVhcCBzcGFjZS4gKi8KKwl4TWluaW11bUV2ZXJGcmVlQnl0ZXNSZW1haW5pbmcgPSBweEZpcnN0RnJlZUJsb2NrLT54QmxvY2tTaXplOworCXhGcmVlQnl0ZXNSZW1haW5pbmcgPSBweEZpcnN0RnJlZUJsb2NrLT54QmxvY2tTaXplOworCisJLyogV29yayBvdXQgdGhlIHBvc2l0aW9uIG9mIHRoZSB0b3AgYml0IGluIGEgc2l6ZV90IHZhcmlhYmxlLiAqLworCXhCbG9ja0FsbG9jYXRlZEJpdCA9ICggKCBzaXplX3QgKSAxICkgPDwgKCAoIHNpemVvZiggc2l6ZV90ICkgKiBzZWN1cmVoZWFwQklUU19QRVJfQllURSApIC0gMSApOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB2b2lkIHBydkluc2VydEJsb2NrSW50b0ZyZWVMaXN0KCBCbG9ja0xpbmtfdCAqcHhCbG9ja1RvSW5zZXJ0ICkKK3sKK0Jsb2NrTGlua190ICpweEl0ZXJhdG9yOwordWludDhfdCAqcHVjOworCisJLyogSXRlcmF0ZSB0aHJvdWdoIHRoZSBsaXN0IHVudGlsIGEgYmxvY2sgaXMgZm91bmQgdGhhdCBoYXMgYSBoaWdoZXIgYWRkcmVzcworCSAqIHRoYW4gdGhlIGJsb2NrIGJlaW5nIGluc2VydGVkLiAqLworCWZvciggcHhJdGVyYXRvciA9ICZ4U3RhcnQ7IHB4SXRlcmF0b3ItPnB4TmV4dEZyZWVCbG9jayA8IHB4QmxvY2tUb0luc2VydDsgcHhJdGVyYXRvciA9IHB4SXRlcmF0b3ItPnB4TmV4dEZyZWVCbG9jayApCisJeworCQkvKiBOb3RoaW5nIHRvIGRvIGhlcmUsIGp1c3QgaXRlcmF0ZSB0byB0aGUgcmlnaHQgcG9zaXRpb24uICovCisJfQorCisJLyogRG8gdGhlIGJsb2NrIGJlaW5nIGluc2VydGVkLCBhbmQgdGhlIGJsb2NrIGl0IGlzIGJlaW5nIGluc2VydGVkIGFmdGVyCisJICogbWFrZSBhIGNvbnRpZ3VvdXMgYmxvY2sgb2YgbWVtb3J5PyAqLworCXB1YyA9ICggdWludDhfdCAqICkgcHhJdGVyYXRvcjsKKwlpZiggKCBwdWMgKyBweEl0ZXJhdG9yLT54QmxvY2tTaXplICkgPT0gKCB1aW50OF90ICogKSBweEJsb2NrVG9JbnNlcnQgKQorCXsKKwkJcHhJdGVyYXRvci0+eEJsb2NrU2l6ZSArPSBweEJsb2NrVG9JbnNlcnQtPnhCbG9ja1NpemU7CisJCXB4QmxvY2tUb0luc2VydCA9IHB4SXRlcmF0b3I7CisJfQorCWVsc2UKKwl7CisJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwl9CisKKwkvKiBEbyB0aGUgYmxvY2sgYmVpbmcgaW5zZXJ0ZWQsIGFuZCB0aGUgYmxvY2sgaXQgaXMgYmVpbmcgaW5zZXJ0ZWQgYmVmb3JlCisJICogbWFrZSBhIGNvbnRpZ3VvdXMgYmxvY2sgb2YgbWVtb3J5PyAqLworCXB1YyA9ICggdWludDhfdCAqICkgcHhCbG9ja1RvSW5zZXJ0OworCWlmKCAoIHB1YyArIHB4QmxvY2tUb0luc2VydC0+eEJsb2NrU2l6ZSApID09ICggdWludDhfdCAqICkgcHhJdGVyYXRvci0+cHhOZXh0RnJlZUJsb2NrICkKKwl7CisJCWlmKCBweEl0ZXJhdG9yLT5weE5leHRGcmVlQmxvY2sgIT0gcHhFbmQgKQorCQl7CisJCQkvKiBGb3JtIG9uZSBiaWcgYmxvY2sgZnJvbSB0aGUgdHdvIGJsb2Nrcy4gKi8KKwkJCXB4QmxvY2tUb0luc2VydC0+eEJsb2NrU2l6ZSArPSBweEl0ZXJhdG9yLT5weE5leHRGcmVlQmxvY2stPnhCbG9ja1NpemU7CisJCQlweEJsb2NrVG9JbnNlcnQtPnB4TmV4dEZyZWVCbG9jayA9IHB4SXRlcmF0b3ItPnB4TmV4dEZyZWVCbG9jay0+cHhOZXh0RnJlZUJsb2NrOworCQl9CisJCWVsc2UKKwkJeworCQkJcHhCbG9ja1RvSW5zZXJ0LT5weE5leHRGcmVlQmxvY2sgPSBweEVuZDsKKwkJfQorCX0KKwllbHNlCisJeworCQlweEJsb2NrVG9JbnNlcnQtPnB4TmV4dEZyZWVCbG9jayA9IHB4SXRlcmF0b3ItPnB4TmV4dEZyZWVCbG9jazsKKwl9CisKKwkvKiBJZiB0aGUgYmxvY2sgYmVpbmcgaW5zZXJ0ZWQgcGx1Z2dlZCBhIGdhYiwgc28gd2FzIG1lcmdlZCB3aXRoIHRoZSBibG9jaworCSAqIGJlZm9yZSBhbmQgdGhlIGJsb2NrIGFmdGVyLCB0aGVuIGl0J3MgcHhOZXh0RnJlZUJsb2NrIHBvaW50ZXIgd2lsbCBoYXZlCisJICogYWxyZWFkeSBiZWVuIHNldCwgYW5kIHNob3VsZCBub3QgYmUgc2V0IGhlcmUgYXMgdGhhdCB3b3VsZCBtYWtlIGl0IHBvaW50CisJICogdG8gaXRzZWxmLiAqLworCWlmKCBweEl0ZXJhdG9yICE9IHB4QmxvY2tUb0luc2VydCApCisJeworCQlweEl0ZXJhdG9yLT5weE5leHRGcmVlQmxvY2sgPSBweEJsb2NrVG9JbnNlcnQ7CisJfQorCWVsc2UKKwl7CisJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwl9Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCAqcHZQb3J0TWFsbG9jKCBzaXplX3QgeFdhbnRlZFNpemUgKQoreworQmxvY2tMaW5rX3QgKnB4QmxvY2ssICpweFByZXZpb3VzQmxvY2ssICpweE5ld0Jsb2NrTGluazsKK3ZvaWQgKnB2UmV0dXJuID0gTlVMTDsKKworCS8qIElmIHRoaXMgaXMgdGhlIGZpcnN0IGNhbGwgdG8gbWFsbG9jIHRoZW4gdGhlIGhlYXAgd2lsbCByZXF1aXJlCisJICogaW5pdGlhbGlzYXRpb24gdG8gc2V0dXAgdGhlIGxpc3Qgb2YgZnJlZSBibG9ja3MuICovCisJaWYoIHB4RW5kID09IE5VTEwgKQorCXsKKwkJcHJ2SGVhcEluaXQoKTsKKwl9CisJZWxzZQorCXsKKwkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCX0KKworCS8qIENoZWNrIHRoZSByZXF1ZXN0ZWQgYmxvY2sgc2l6ZSBpcyBub3Qgc28gbGFyZ2UgdGhhdCB0aGUgdG9wIGJpdCBpcyBzZXQuCisJICogVGhlIHRvcCBiaXQgb2YgdGhlIGJsb2NrIHNpemUgbWVtYmVyIG9mIHRoZSBCbG9ja0xpbmtfdCBzdHJ1Y3R1cmUgaXMgdXNlZAorCSAqIHRvIGRldGVybWluZSB3aG8gb3ducyB0aGUgYmxvY2sgLSB0aGUgYXBwbGljYXRpb24gb3IgdGhlIGtlcm5lbCwgc28gaXQKKwkgKiBtdXN0IGJlIGZyZWUuICovCisJaWYoICggeFdhbnRlZFNpemUgJiB4QmxvY2tBbGxvY2F0ZWRCaXQgKSA9PSAwICkKKwl7CisJCS8qIFRoZSB3YW50ZWQgc2l6ZSBpcyBpbmNyZWFzZWQgc28gaXQgY2FuIGNvbnRhaW4gYSBCbG9ja0xpbmtfdAorCQkgKiBzdHJ1Y3R1cmUgaW4gYWRkaXRpb24gdG8gdGhlIHJlcXVlc3RlZCBhbW91bnQgb2YgYnl0ZXMuICovCisJCWlmKCB4V2FudGVkU2l6ZSA+IDAgKQorCQl7CisJCQl4V2FudGVkU2l6ZSArPSB4SGVhcFN0cnVjdFNpemU7CisKKwkJCS8qIEVuc3VyZSB0aGF0IGJsb2NrcyBhcmUgYWx3YXlzIGFsaWduZWQgdG8gdGhlIHJlcXVpcmVkIG51bWJlciBvZgorCQkJICogYnl0ZXMuICovCisJCQlpZiggKCB4V2FudGVkU2l6ZSAmIHNlY3VyZXBvcnRCWVRFX0FMSUdOTUVOVF9NQVNLICkgIT0gMHgwMCApCisJCQl7CisJCQkJLyogQnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuICovCisJCQkJeFdhbnRlZFNpemUgKz0gKCBzZWN1cmVwb3J0QllURV9BTElHTk1FTlQgLSAoIHhXYW50ZWRTaXplICYgc2VjdXJlcG9ydEJZVEVfQUxJR05NRU5UX01BU0sgKSApOworCQkJCXNlY3VyZXBvcnRBU1NFUlQoICggeFdhbnRlZFNpemUgJiBzZWN1cmVwb3J0QllURV9BTElHTk1FTlRfTUFTSyApID09IDAgKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCX0KKworCQlpZiggKCB4V2FudGVkU2l6ZSA+IDAgKSAmJiAoIHhXYW50ZWRTaXplIDw9IHhGcmVlQnl0ZXNSZW1haW5pbmcgKSApCisJCXsKKwkJCS8qIFRyYXZlcnNlIHRoZSBsaXN0IGZyb20gdGhlIHN0YXJ0IChsb3dlc3QgYWRkcmVzcykgYmxvY2sgdW50aWwKKwkJCSAqIG9uZSBvZiBhZGVxdWF0ZSBzaXplIGlzIGZvdW5kLiAqLworCQkJcHhQcmV2aW91c0Jsb2NrID0gJnhTdGFydDsKKwkJCXB4QmxvY2sgPSB4U3RhcnQucHhOZXh0RnJlZUJsb2NrOworCQkJd2hpbGUoICggcHhCbG9jay0+eEJsb2NrU2l6ZSA8IHhXYW50ZWRTaXplICkgJiYgKCBweEJsb2NrLT5weE5leHRGcmVlQmxvY2sgIT0gTlVMTCApICkKKwkJCXsKKwkJCQlweFByZXZpb3VzQmxvY2sgPSBweEJsb2NrOworCQkJCXB4QmxvY2sgPSBweEJsb2NrLT5weE5leHRGcmVlQmxvY2s7CisJCQl9CisKKwkJCS8qIElmIHRoZSBlbmQgbWFya2VyIHdhcyByZWFjaGVkIHRoZW4gYSBibG9jayBvZiBhZGVxdWF0ZSBzaXplIHdhcworCQkJICogbm90IGZvdW5kLiAqLworCQkJaWYoIHB4QmxvY2sgIT0gcHhFbmQgKQorCQkJeworCQkJCS8qIFJldHVybiB0aGUgbWVtb3J5IHNwYWNlIHBvaW50ZWQgdG8gLSBqdW1waW5nIG92ZXIgdGhlCisJCQkJICogQmxvY2tMaW5rX3Qgc3RydWN0dXJlIGF0IGl0cyBzdGFydC4gKi8KKwkJCQlwdlJldHVybiA9ICggdm9pZCAqICkgKCAoICggdWludDhfdCAqICkgcHhQcmV2aW91c0Jsb2NrLT5weE5leHRGcmVlQmxvY2sgKSArIHhIZWFwU3RydWN0U2l6ZSApOworCisJCQkJLyogVGhpcyBibG9jayBpcyBiZWluZyByZXR1cm5lZCBmb3IgdXNlIHNvIG11c3QgYmUgdGFrZW4gb3V0CisJCQkJICogb2YgdGhlIGxpc3Qgb2YgZnJlZSBibG9ja3MuICovCisJCQkJcHhQcmV2aW91c0Jsb2NrLT5weE5leHRGcmVlQmxvY2sgPSBweEJsb2NrLT5weE5leHRGcmVlQmxvY2s7CisKKwkJCQkvKiBJZiB0aGUgYmxvY2sgaXMgbGFyZ2VyIHRoYW4gcmVxdWlyZWQgaXQgY2FuIGJlIHNwbGl0IGludG8KKwkJCQkgKiB0d28uICovCisJCQkJaWYoICggcHhCbG9jay0+eEJsb2NrU2l6ZSAtIHhXYW50ZWRTaXplICkgPiBzZWN1cmVoZWFwTUlOSU1VTV9CTE9DS19TSVpFICkKKwkJCQl7CisJCQkJCS8qIFRoaXMgYmxvY2sgaXMgdG8gYmUgc3BsaXQgaW50byB0d28uICBDcmVhdGUgYSBuZXcKKwkJCQkJICogYmxvY2sgZm9sbG93aW5nIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWVzdGVkLiBUaGUgdm9pZAorCQkJCQkgKiBjYXN0IGlzIHVzZWQgdG8gcHJldmVudCBieXRlIGFsaWdubWVudCB3YXJuaW5ncyBmcm9tIHRoZQorCQkJCQkgKiBjb21waWxlci4gKi8KKwkJCQkJcHhOZXdCbG9ja0xpbmsgPSAoIHZvaWQgKiApICggKCAoIHVpbnQ4X3QgKiApIHB4QmxvY2sgKSArIHhXYW50ZWRTaXplICk7CisJCQkJCXNlY3VyZXBvcnRBU1NFUlQoICggKCAoIHNpemVfdCApIHB4TmV3QmxvY2tMaW5rICkgJiBzZWN1cmVwb3J0QllURV9BTElHTk1FTlRfTUFTSyApID09IDAgKTsKKworCQkJCQkvKiBDYWxjdWxhdGUgdGhlIHNpemVzIG9mIHR3byBibG9ja3Mgc3BsaXQgZnJvbSB0aGUgc2luZ2xlCisJCQkJCSAqIGJsb2NrLiAqLworCQkJCQlweE5ld0Jsb2NrTGluay0+eEJsb2NrU2l6ZSA9IHB4QmxvY2stPnhCbG9ja1NpemUgLSB4V2FudGVkU2l6ZTsKKwkJCQkJcHhCbG9jay0+eEJsb2NrU2l6ZSA9IHhXYW50ZWRTaXplOworCisJCQkJCS8qIEluc2VydCB0aGUgbmV3IGJsb2NrIGludG8gdGhlIGxpc3Qgb2YgZnJlZSBibG9ja3MuICovCisJCQkJCXBydkluc2VydEJsb2NrSW50b0ZyZWVMaXN0KCBweE5ld0Jsb2NrTGluayApOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCQkJfQorCisJCQkJeEZyZWVCeXRlc1JlbWFpbmluZyAtPSBweEJsb2NrLT54QmxvY2tTaXplOworCisJCQkJaWYoIHhGcmVlQnl0ZXNSZW1haW5pbmcgPCB4TWluaW11bUV2ZXJGcmVlQnl0ZXNSZW1haW5pbmcgKQorCQkJCXsKKwkJCQkJeE1pbmltdW1FdmVyRnJlZUJ5dGVzUmVtYWluaW5nID0geEZyZWVCeXRlc1JlbWFpbmluZzsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCQkJCX0KKworCQkJCS8qIFRoZSBibG9jayBpcyBiZWluZyByZXR1cm5lZCAtIGl0IGlzIGFsbG9jYXRlZCBhbmQgb3duZWQgYnkKKwkJCQkgKiB0aGUgYXBwbGljYXRpb24gYW5kIGhhcyBubyAibmV4dCIgYmxvY2suICovCisJCQkJcHhCbG9jay0+eEJsb2NrU2l6ZSB8PSB4QmxvY2tBbGxvY2F0ZWRCaXQ7CisJCQkJcHhCbG9jay0+cHhOZXh0RnJlZUJsb2NrID0gTlVMTDsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCX0KKworCXRyYWNlTUFMTE9DKCBwdlJldHVybiwgeFdhbnRlZFNpemUgKTsKKworCSNpZiggc2VjdXJlY29uZmlnVVNFX01BTExPQ19GQUlMRURfSE9PSyA9PSAxICkKKwl7CisJCWlmKCBwdlJldHVybiA9PSBOVUxMICkKKwkJeworCQkJZXh0ZXJuIHZvaWQgdkFwcGxpY2F0aW9uTWFsbG9jRmFpbGVkSG9vayggdm9pZCApOworCQkJdkFwcGxpY2F0aW9uTWFsbG9jRmFpbGVkSG9vaygpOworCQl9CisJCWVsc2UKKwkJeworCQkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCQl9CisJfQorCSNlbmRpZgorCisJc2VjdXJlcG9ydEFTU0VSVCggKCAoICggc2l6ZV90ICkgcHZSZXR1cm4gKSAmICggc2l6ZV90ICkgc2VjdXJlcG9ydEJZVEVfQUxJR05NRU5UX01BU0sgKSA9PSAwICk7CisJcmV0dXJuIHB2UmV0dXJuOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgdlBvcnRGcmVlKCB2b2lkICpwdiApCit7Cit1aW50OF90ICpwdWMgPSAoIHVpbnQ4X3QgKiApIHB2OworQmxvY2tMaW5rX3QgKnB4TGluazsKKworCWlmKCBwdiAhPSBOVUxMICkKKwl7CisJCS8qIFRoZSBtZW1vcnkgYmVpbmcgZnJlZWQgd2lsbCBoYXZlIGFuIEJsb2NrTGlua190IHN0cnVjdHVyZSBpbW1lZGlhdGVseQorCQkgKiBiZWZvcmUgaXQuICovCisJCXB1YyAtPSB4SGVhcFN0cnVjdFNpemU7CisKKwkJLyogVGhpcyBjYXN0aW5nIGlzIHRvIGtlZXAgdGhlIGNvbXBpbGVyIGZyb20gaXNzdWluZyB3YXJuaW5ncy4gKi8KKwkJcHhMaW5rID0gKCB2b2lkICogKSBwdWM7CisKKwkJLyogQ2hlY2sgdGhlIGJsb2NrIGlzIGFjdHVhbGx5IGFsbG9jYXRlZC4gKi8KKwkJc2VjdXJlcG9ydEFTU0VSVCggKCBweExpbmstPnhCbG9ja1NpemUgJiB4QmxvY2tBbGxvY2F0ZWRCaXQgKSAhPSAwICk7CisJCXNlY3VyZXBvcnRBU1NFUlQoIHB4TGluay0+cHhOZXh0RnJlZUJsb2NrID09IE5VTEwgKTsKKworCQlpZiggKCBweExpbmstPnhCbG9ja1NpemUgJiB4QmxvY2tBbGxvY2F0ZWRCaXQgKSAhPSAwICkKKwkJeworCQkJaWYoIHB4TGluay0+cHhOZXh0RnJlZUJsb2NrID09IE5VTEwgKQorCQkJeworCQkJCS8qIFRoZSBibG9jayBpcyBiZWluZyByZXR1cm5lZCB0byB0aGUgaGVhcCAtIGl0IGlzIG5vIGxvbmdlcgorCQkJCSAqIGFsbG9jYXRlZC4gKi8KKwkJCQlweExpbmstPnhCbG9ja1NpemUgJj0gfnhCbG9ja0FsbG9jYXRlZEJpdDsKKworCQkJCXNlY3VyZXBvcnRESVNBQkxFX05PTl9TRUNVUkVfSU5URVJSVVBUUygpOworCQkJCXsKKwkJCQkJLyogQWRkIHRoaXMgYmxvY2sgdG8gdGhlIGxpc3Qgb2YgZnJlZSBibG9ja3MuICovCisJCQkJCXhGcmVlQnl0ZXNSZW1haW5pbmcgKz0gcHhMaW5rLT54QmxvY2tTaXplOworCQkJCQl0cmFjZUZSRUUoIHB2LCBweExpbmstPnhCbG9ja1NpemUgKTsKKwkJCQkJcHJ2SW5zZXJ0QmxvY2tJbnRvRnJlZUxpc3QoICggKCBCbG9ja0xpbmtfdCAqICkgcHhMaW5rICkgKTsKKwkJCQl9CisJCQkJc2VjdXJlcG9ydEVOQUJMRV9OT05fU0VDVVJFX0lOVEVSUlVQVFMoKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCX0KKwl9Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc2l6ZV90IHhQb3J0R2V0RnJlZUhlYXBTaXplKCB2b2lkICkKK3sKKwlyZXR1cm4geEZyZWVCeXRlc1JlbWFpbmluZzsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzaXplX3QgeFBvcnRHZXRNaW5pbXVtRXZlckZyZWVIZWFwU2l6ZSggdm9pZCApCit7CisJcmV0dXJuIHhNaW5pbXVtRXZlckZyZWVCeXRlc1JlbWFpbmluZzsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIHZQb3J0SW5pdGlhbGlzZUJsb2Nrcyggdm9pZCApCit7CisJLyogVGhpcyBqdXN0IGV4aXN0cyB0byBrZWVwIHRoZSBsaW5rZXIgcXVpZXQuICovCit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KZGlmZiAtLWdpdCBhL1NvdXJjZS9wb3J0YWJsZS9JQVIvQVJNX0NNMzMvc2VjdXJlL3NlY3VyZV9oZWFwLmggYi9Tb3VyY2UvcG9ydGFibGUvSUFSL0FSTV9DTTMzL3NlY3VyZS9zZWN1cmVfaGVhcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5ZTRmMmEKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvcG9ydGFibGUvSUFSL0FSTV9DTTMzL3NlY3VyZS9zZWN1cmVfaGVhcC5oCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjIuMQorICogQ29weXJpZ2h0IChDKSAyMDE5IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKKyAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCisgKiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCisgKiB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZgorICogdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLAorICogc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCisgKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUworICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SCisgKiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIKKyAqIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIGh0dHA6Ly93d3cuRnJlZVJUT1Mub3JnCisgKiBodHRwOi8vYXdzLmFtYXpvbi5jb20vZnJlZXJ0b3MKKyAqCisgKiAxIHRhYiA9PSA0IHNwYWNlcyEKKyAqLworCisjaWZuZGVmIF9fU0VDVVJFX0hFQVBfSF9fCisjZGVmaW5lIF9fU0VDVVJFX0hFQVBfSF9fCisKKy8qIFN0YW5kYXJkIGluY2x1ZGVzLiAqLworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisvKioKKyAqIEBicmllZiBBbGxvY2F0ZXMgbWVtb3J5IGZyb20gaGVhcC4KKyAqCisgKiBAcGFyYW1baW5dIHhXYW50ZWRTaXplIFRoZSBzaXplIG9mIHRoZSBtZW1vcnkgdG8gYmUgYWxsb2NhdGVkLgorICoKKyAqIEByZXR1cm4gUG9pbnRlciB0byB0aGUgbWVtb3J5IHJlZ2lvbiBpZiB0aGUgYWxsb2NhdGlvbiBpcyBzdWNjZXNzZnVsLCBOVUxMCisgKiBvdGhlcndpc2UuCisgKi8KK3ZvaWQgKnB2UG9ydE1hbGxvYyggc2l6ZV90IHhXYW50ZWRTaXplICk7CisKKy8qKgorICogQGJyaWVmIEZyZWVzIHRoZSBwcmV2aW91c2x5IGFsbG9jYXRlZCBtZW1vcnkuCisgKgorICogQHBhcmFtW2luXSBwdiBQb2ludGVyIHRvIHRoZSBtZW1vcnkgdG8gYmUgZnJlZWQuCisgKi8KK3ZvaWQgdlBvcnRGcmVlKCB2b2lkICpwdiApOworCisjZW5kaWYgLyogX19TRUNVUkVfSEVBUF9IX18gKi8KZGlmZiAtLWdpdCBhL1NvdXJjZS9wb3J0YWJsZS9JQVIvQVJNX0NNMzMvc2VjdXJlL3NlY3VyZV9pbml0LmMgYi9Tb3VyY2UvcG9ydGFibGUvSUFSL0FSTV9DTTMzL3NlY3VyZS9zZWN1cmVfaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2NTI1ZjcKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvcG9ydGFibGUvSUFSL0FSTV9DTTMzL3NlY3VyZS9zZWN1cmVfaW5pdC5jCkBAIC0wLDAgKzEsMTA1IEBACisvKgorICogRnJlZVJUT1MgS2VybmVsIFYxMC4yLjEKKyAqIENvcHlyaWdodCAoQykgMjAxOSBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCisgKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgorICogdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bworICogdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YKKyAqIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKKyAqIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAorICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MKKyAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUgorICogQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSCisgKiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBodHRwOi8vd3d3LkZyZWVSVE9TLm9yZworICogaHR0cDovL2F3cy5hbWF6b24uY29tL2ZyZWVydG9zCisgKgorICogMSB0YWIgPT0gNCBzcGFjZXMhCisgKi8KKworLyogU3RhbmRhcmQgaW5jbHVkZXMuICovCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8qIFNlY3VyZSBpbml0IGluY2x1ZGVzLiAqLworI2luY2x1ZGUgInNlY3VyZV9pbml0LmgiCisKKy8qIFNlY3VyZSBwb3J0IG1hY3Jvcy4gKi8KKyNpbmNsdWRlICJzZWN1cmVfcG9ydF9tYWNyb3MuaCIKKworLyoqCisgKiBAYnJpZWYgQ29uc3RhbnRzIHJlcXVpcmVkIHRvIG1hbmlwdWxhdGUgdGhlIFNDQi4KKyAqLworI2RlZmluZSBzZWN1cmVpbml0U0NCX0FJUkNSCQkJCQkoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVkMGMgKSAgLyogQXBwbGljYXRpb24gSW50ZXJydXB0IGFuZCBSZXNldCBDb250cm9sIFJlZ2lzdGVyLiAqLworI2RlZmluZSBzZWN1cmVpbml0U0NCX0FJUkNSX1ZFQ1RLRVlfUE9TCQkoIDE2VUwgKQorI2RlZmluZSBzZWN1cmVpbml0U0NCX0FJUkNSX1ZFQ1RLRVlfTUFTSwkoIDB4RkZGRlVMIDw8IHNlY3VyZWluaXRTQ0JfQUlSQ1JfVkVDVEtFWV9QT1MgKQorI2RlZmluZSBzZWN1cmVpbml0U0NCX0FJUkNSX1BSSVNfUE9TCQkoIDE0VUwgKQorI2RlZmluZSBzZWN1cmVpbml0U0NCX0FJUkNSX1BSSVNfTUFTSwkJKCAxVUwgPDwgc2VjdXJlaW5pdFNDQl9BSVJDUl9QUklTX1BPUyApCisKKy8qKgorICogQGJyaWVmIENvbnN0YW50cyByZXF1aXJlZCB0byBtYW5pcHVsYXRlIHRoZSBGUFUuCisgKi8KKyNkZWZpbmUgc2VjdXJlaW5pdEZQQ0NSCQkJCQkJKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZjM0ICkgIC8qIEZsb2F0aW5nIFBvaW50IENvbnRleHQgQ29udHJvbCBSZWdpc3Rlci4gKi8KKyNkZWZpbmUgc2VjdXJlaW5pdEZQQ0NSX0xTUEVOU19QT1MJCQkoIDI5VUwgKQorI2RlZmluZSBzZWN1cmVpbml0RlBDQ1JfTFNQRU5TX01BU0sJCQkoIDFVTCA8PCBzZWN1cmVpbml0RlBDQ1JfTFNQRU5TX1BPUyApCisjZGVmaW5lIHNlY3VyZWluaXRGUENDUl9UU19QT1MJCQkJKCAyNlVMICkKKyNkZWZpbmUgc2VjdXJlaW5pdEZQQ0NSX1RTX01BU0sJCQkJKCAxVUwgPDwgc2VjdXJlaW5pdEZQQ0NSX1RTX1BPUyApCisKKyNkZWZpbmUgc2VjdXJlaW5pdE5TQUNSCQkJCQkJKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZDhjICkgIC8qIE5vbi1zZWN1cmUgQWNjZXNzIENvbnRyb2wgUmVnaXN0ZXIuICovCisjZGVmaW5lIHNlY3VyZWluaXROU0FDUl9DUDEwX1BPUwkJCSggMTBVTCApCisjZGVmaW5lIHNlY3VyZWluaXROU0FDUl9DUDEwX01BU0sJCQkoIDFVTCA8PCBzZWN1cmVpbml0TlNBQ1JfQ1AxMF9QT1MgKQorI2RlZmluZSBzZWN1cmVpbml0TlNBQ1JfQ1AxMV9QT1MJCQkoIDExVUwgKQorI2RlZmluZSBzZWN1cmVpbml0TlNBQ1JfQ1AxMV9NQVNLCQkJKCAxVUwgPDwgc2VjdXJlaW5pdE5TQUNSX0NQMTFfUE9TICkKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzZWN1cmVwb3J0Tk9OX1NFQ1VSRV9DQUxMQUJMRSB2b2lkIFNlY3VyZUluaXRfRGVQcmlvcml0aXplTlNFeGNlcHRpb25zKCB2b2lkICkKK3sKKwl1aW50MzJfdCB1bElQU1I7CisKKwkgLyogUmVhZCB0aGUgSW50ZXJydXB0IFByb2dyYW0gU3RhdHVzIFJlZ2lzdGVyIChJUFNSKSB2YWx1ZS4gKi8KKwlzZWN1cmVwb3J0UkVBRF9JUFNSKCB1bElQU1IgKTsKKworCS8qIERvIG5vdGhpbmcgaWYgdGhlIHByb2Nlc3NvciBpcyBydW5uaW5nIGluIHRoZSBUaHJlYWQgTW9kZS4gSVBTUiBpcyB6ZXJvCisJICogd2hlbiB0aGUgcHJvY2Vzc29yIGlzIHJ1bm5pbmcgaW4gdGhlIFRocmVhZCBNb2RlLiAqLworCWlmKCB1bElQU1IgIT0gMCApCisJeworCQkqKCBzZWN1cmVpbml0U0NCX0FJUkNSICkgPQkoICooIHNlY3VyZWluaXRTQ0JfQUlSQ1IgKSAmIH4oIHNlY3VyZWluaXRTQ0JfQUlSQ1JfVkVDVEtFWV9NQVNLIHwgc2VjdXJlaW5pdFNDQl9BSVJDUl9QUklTX01BU0sgKSApIHwKKwkJCQkJCQkJCSggKCAweDA1RkFVTCA8PCBzZWN1cmVpbml0U0NCX0FJUkNSX1ZFQ1RLRVlfUE9TICkgJiBzZWN1cmVpbml0U0NCX0FJUkNSX1ZFQ1RLRVlfTUFTSyApIHwKKwkJCQkJCQkJCSggKCAweDFVTAk8PCBzZWN1cmVpbml0U0NCX0FJUkNSX1BSSVNfUE9TICkJJiBzZWN1cmVpbml0U0NCX0FJUkNSX1BSSVNfTUFTSyApOworCX0KK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzZWN1cmVwb3J0Tk9OX1NFQ1VSRV9DQUxMQUJMRSB2b2lkIFNlY3VyZUluaXRfRW5hYmxlTlNGUFVBY2Nlc3MoIHZvaWQgKQoreworCXVpbnQzMl90IHVsSVBTUjsKKworCSAvKiBSZWFkIHRoZSBJbnRlcnJ1cHQgUHJvZ3JhbSBTdGF0dXMgUmVnaXN0ZXIgKElQU1IpIHZhbHVlLiAqLworCXNlY3VyZXBvcnRSRUFEX0lQU1IoIHVsSVBTUiApOworCisJLyogRG8gbm90aGluZyBpZiB0aGUgcHJvY2Vzc29yIGlzIHJ1bm5pbmcgaW4gdGhlIFRocmVhZCBNb2RlLiBJUFNSIGlzIHplcm8KKwkgKiB3aGVuIHRoZSBwcm9jZXNzb3IgaXMgcnVubmluZyBpbiB0aGUgVGhyZWFkIE1vZGUuICovCisJaWYoIHVsSVBTUiAhPSAwICkKKwl7CisJCS8qIENQMTAgPSAxID09PiBOb24tc2VjdXJlIGFjY2VzcyB0byB0aGUgRmxvYXRpbmcgUG9pbnQgVW5pdCBpcworCQkgKiBwZXJtaXR0ZWQuIENQMTEgc2hvdWxkIGJlIHByb2dyYW1tZWQgdG8gdGhlIHNhbWUgdmFsdWUgYXMgQ1AxMC4gKi8KKwkJKiggc2VjdXJlaW5pdE5TQUNSICkgfD0gKCBzZWN1cmVpbml0TlNBQ1JfQ1AxMF9NQVNLIHwgc2VjdXJlaW5pdE5TQUNSX0NQMTFfTUFTSyApOworCisJCS8qIExTUEVOUyA9IDAgPT0+IExTUEVOIGlzIHdyaXRhYmxlIGZyb24gbm9uLXNlY3VyZSBzdGF0ZS4gVGhpcyBlbnN1cmVzCisJCSAqIHRoYXQgd2UgY2FuIGVuYWJsZS9kaXNhYmxlIGxhenkgc3RhY2tpbmcgaW4gcG9ydC5jIGZpbGUuICovCisJCSooIHNlY3VyZWluaXRGUENDUiApICY9IH4gKCBzZWN1cmVpbml0RlBDQ1JfTFNQRU5TX01BU0sgKTsKKworCQkvKiBUUyA9IDEgPT0+IFRyZWF0IEZQIHJlZ2lzdGVycyBhcyBzZWN1cmUgaS5lLiBjYWxsZWUgc2F2ZWQgRlAKKwkJICogcmVnaXN0ZXJzIChTMTYtUzMxKSBhcmUgYWxzbyBwdXNoZWQgdG8gc3RhY2sgb24gZXhjZXB0aW9uIGVudHJ5IGFuZAorCQkgKiByZXN0b3JlZCBvbiBleGNlcHRpb24gcmV0dXJuLiAqLworCQkqKCBzZWN1cmVpbml0RlBDQ1IgKSB8PSAoIHNlY3VyZWluaXRGUENDUl9UU19NQVNLICk7CisJfQorfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCmRpZmYgLS1naXQgYS9Tb3VyY2UvcG9ydGFibGUvSUFSL0FSTV9DTTMzL3NlY3VyZS9zZWN1cmVfaW5pdC5oIGIvU291cmNlL3BvcnRhYmxlL0lBUi9BUk1fQ00zMy9zZWN1cmUvc2VjdXJlX2luaXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzViYzcxCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL3BvcnRhYmxlL0lBUi9BUk1fQ00zMy9zZWN1cmUvc2VjdXJlX2luaXQuaApAQCAtMCwwICsxLDUzIEBACisvKgorICogRnJlZVJUT1MgS2VybmVsIFYxMC4yLjEKKyAqIENvcHlyaWdodCAoQykgMjAxOSBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCisgKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgorICogdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bworICogdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YKKyAqIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKKyAqIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAorICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MKKyAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUgorICogQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSCisgKiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBodHRwOi8vd3d3LkZyZWVSVE9TLm9yZworICogaHR0cDovL2F3cy5hbWF6b24uY29tL2ZyZWVydG9zCisgKgorICogMSB0YWIgPT0gNCBzcGFjZXMhCisgKi8KKworI2lmbmRlZiBfX1NFQ1VSRV9JTklUX0hfXworI2RlZmluZSBfX1NFQ1VSRV9JTklUX0hfXworCisvKioKKyAqIEBicmllZiBEZS1wcmlvcml0aXplcyB0aGUgbm9uLXNlY3VyZSBleGNlcHRpb25zLgorICoKKyAqIFRoaXMgaXMgbmVlZGVkIHRvIGVuc3VyZSB0aGF0IHRoZSBub24tc2VjdXJlIFBlbmRTViBydW5zIGF0IHRoZSBsb3dlc3QKKyAqIHByaW9yaXR5LiBDb250ZXh0IHN3aXRjaCBpcyBkb25lIGluIHRoZSBub24tc2VjdXJlIFBlbmRTViBoYW5kbGVyLgorICoKKyAqIEBub3RlIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgaW4gdGhlIGhhbmRsZXIgbW9kZS4gSXQgaXMgbm8tb3AgaWYgY2FsbGVkCisgKiBpbiB0aGUgdGhyZWFkIG1vZGUuCisgKi8KK3ZvaWQgU2VjdXJlSW5pdF9EZVByaW9yaXRpemVOU0V4Y2VwdGlvbnMoIHZvaWQgKTsKKworLyoqCisgKiBAYnJpZWYgU2V0cyB1cCB0aGUgRmxvYXRpbmcgUG9pbnQgVW5pdCAoRlBVKSBmb3IgTm9uLVNlY3VyZSBhY2Nlc3MuCisgKgorICogQWxzbyBzZXRzIEZQQ0NSLlRTPTEgdG8gZW5zdXJlIHRoYXQgdGhlIGNvbnRlbnQgb2YgdGhlIEZsb2F0aW5nIFBvaW50CisgKiBSZWdpc3RlcnMgYXJlIG5vdCBsZWFrZWQgdG8gdGhlIG5vbi1zZWN1cmUgc2lkZS4KKyAqCisgKiBAbm90ZSBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGluIHRoZSBoYW5kbGVyIG1vZGUuIEl0IGlzIG5vLW9wIGlmIGNhbGxlZAorICogaW4gdGhlIHRocmVhZCBtb2RlLgorICovCit2b2lkIFNlY3VyZUluaXRfRW5hYmxlTlNGUFVBY2Nlc3MoIHZvaWQgKTsKKworI2VuZGlmIC8qIF9fU0VDVVJFX0lOSVRfSF9fICovCmRpZmYgLS1naXQgYS9Tb3VyY2UvcG9ydGFibGUvSUFSL0FSTV9DTTMzL3NlY3VyZS9zZWN1cmVfcG9ydF9tYWNyb3MuaCBiL1NvdXJjZS9wb3J0YWJsZS9JQVIvQVJNX0NNMzMvc2VjdXJlL3NlY3VyZV9wb3J0X21hY3Jvcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2MGVkYWIKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvcG9ydGFibGUvSUFSL0FSTV9DTTMzL3NlY3VyZS9zZWN1cmVfcG9ydF9tYWNyb3MuaApAQCAtMCwwICsxLDEzMyBAQAorLyoKKyAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMi4xCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgorICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KKyAqIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KKyAqIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mCisgKiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCisgKiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKKyAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTCisgKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IKKyAqIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUgorICogSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogaHR0cDovL3d3dy5GcmVlUlRPUy5vcmcKKyAqIGh0dHA6Ly9hd3MuYW1hem9uLmNvbS9mcmVlcnRvcworICoKKyAqIDEgdGFiID09IDQgc3BhY2VzIQorICovCisKKyNpZm5kZWYgX19TRUNVUkVfUE9SVF9NQUNST1NfSF9fCisjZGVmaW5lIF9fU0VDVVJFX1BPUlRfTUFDUk9TX0hfXworCisvKioKKyAqIEBicmllZiBCeXRlIGFsaWdubWVudCByZXF1aXJlbWVudHMuCisgKi8KKyNkZWZpbmUgc2VjdXJlcG9ydEJZVEVfQUxJR05NRU5UCQkJCQk4CisjZGVmaW5lIHNlY3VyZXBvcnRCWVRFX0FMSUdOTUVOVF9NQVNLCQkJCSggMHgwMDA3ICkKKworLyoqCisgKiBAYnJpZWYgTWFjcm8gdG8gZGVjbGFyZSBhIGZ1bmN0aW9uIGFzIG5vbi1zZWN1cmUgY2FsbGFibGUuCisgKi8KKyNpZiBkZWZpbmVkKCBfX0lBUl9TWVNURU1TX0lDQ19fICkKKwkjZGVmaW5lIHNlY3VyZXBvcnROT05fU0VDVVJFX0NBTExBQkxFCQkJX19jbXNlX25vbnNlY3VyZV9lbnRyeSBfX3Jvb3QKKyNlbHNlCisJI2RlZmluZSBzZWN1cmVwb3J0Tk9OX1NFQ1VSRV9DQUxMQUJMRQkJCV9fYXR0cmlidXRlX18oKGNtc2Vfbm9uc2VjdXJlX2VudHJ5KSkgX19hdHRyaWJ1dGVfXygodXNlZCkpCisjZW5kaWYKKworLyoqCisgKiBAYnJpZWYgU2V0IHRoZSBzZWN1cmUgUFJJTUFTSyB2YWx1ZS4KKyAqLworI2RlZmluZSBzZWN1cmVwb3J0U0VUX1NFQ1VSRV9QUklNQVNLKCB1bFByaW1hc2tWYWx1ZSApIFwKKwlfX2FzbSB2b2xhdGlsZSAoICJtc3IgcHJpbWFzaywgJTAiIDogOiAiciIgKCB1bFByaW1hc2tWYWx1ZSApIDogIm1lbW9yeSIgKQorCisvKioKKyAqIEBicmllZiBTZXQgdGhlIG5vbi1zZWN1cmUgUFJJTUFTSyB2YWx1ZS4KKyAqLworI2RlZmluZSBzZWN1cmVwb3J0U0VUX05PTl9TRUNVUkVfUFJJTUFTSyggdWxQcmltYXNrVmFsdWUgKSBcCisJX19hc20gdm9sYXRpbGUgKCAibXNyIHByaW1hc2tfbnMsICUwIiA6IDogInIiICggdWxQcmltYXNrVmFsdWUgKSA6ICJtZW1vcnkiICkKKworLyoqCisgKiBAYnJpZWYgUmVhZCB0aGUgUFNQIHZhbHVlIGluIHRoZSBnaXZlbiB2YXJpYWJsZS4KKyAqLworI2RlZmluZSBzZWN1cmVwb3J0UkVBRF9QU1AoIHB1Y091dEN1cnJlbnRTdGFja1BvaW50ZXIgKSBcCisJX19hc20gdm9sYXRpbGUgKCAibXJzICUwLCBwc3AiICA6ICI9ciIgKCBwdWNPdXRDdXJyZW50U3RhY2tQb2ludGVyICkgKQorCisvKioKKyAqIEBicmllZiBTZXQgdGhlIFBTUCB0byB0aGUgZ2l2ZW4gdmFsdWUuCisgKi8KKyNkZWZpbmUgc2VjdXJlcG9ydFNFVF9QU1AoIHB1Y0N1cnJlbnRTdGFja1BvaW50ZXIgKSBcCisJX19hc20gdm9sYXRpbGUgKCAibXNyIHBzcCwgJTAiIDogOiAiciIgKCBwdWNDdXJyZW50U3RhY2tQb2ludGVyICkgKQorCisvKioKKyAqIEBicmllZiBTZXQgdGhlIFBTUExJTSB0byB0aGUgZ2l2ZW4gdmFsdWUuCisgKi8KKyNkZWZpbmUgc2VjdXJlcG9ydFNFVF9QU1BMSU0oIHB1Y1N0YWNrTGltaXQgKSBcCisJX19hc20gdm9sYXRpbGUgKCAibXNyIHBzcGxpbSwgJTAiIDogOiAiciIgKCBwdWNTdGFja0xpbWl0ICkgKQorCisvKioKKyAqIEBicmllZiBTZXQgdGhlIE5vblNlY3VyZSBNU1AgdG8gdGhlIGdpdmVuIHZhbHVlLgorICovCisjZGVmaW5lIHNlY3VyZXBvcnRTRVRfTVNQX05TKCBwdWNNYWluU3RhY2tQb2ludGVyICkgXAorCV9fYXNtIHZvbGF0aWxlICggIm1zciBtc3BfbnMsICUwIiA6IDogInIiICggcHVjTWFpblN0YWNrUG9pbnRlciApICkKKworLyoqCisgKiBAYnJpZWYgU2V0IHRoZSBDT05UUk9MIHJlZ2lzdGVyIHRvIHRoZSBnaXZlbiB2YWx1ZS4KKyAqLworI2RlZmluZSBzZWN1cmVwb3J0U0VUX0NPTlRST0woIHVsQ29udHJvbCApIFwKKwlfX2FzbSB2b2xhdGlsZSAoICJtc3IgY29udHJvbCwgJTAiIDogOiAiciIgKCB1bENvbnRyb2wgKSA6ICJtZW1vcnkiICkKKworLyoqCisgKiBAYnJpZWYgUmVhZCB0aGUgSW50ZXJydXB0IFByb2dyYW0gU3RhdHVzIFJlZ2lzdGVyIChJUFNSKSB2YWx1ZSBpbiB0aGUgZ2l2ZW4KKyAqIHZhcmlhYmxlLgorICovCisjZGVmaW5lIHNlY3VyZXBvcnRSRUFEX0lQU1IoIHVsSVBTUiApIFwKKwlfX2FzbSB2b2xhdGlsZSAoICJtcnMgJTAsIGlwc3IiICA6ICI9ciIgKCB1bElQU1IgKSApCisKKy8qKgorICogQGJyaWVmIFBSSU1BU0sgdmFsdWUgdG8gZW5hYmxlIGludGVycnVwdHMuCisgKi8KKyNkZWZpbmUgc2VjdXJlcG9ydFBSSU1BU0tfRU5BQkxFX0lOVEVSUlVQVFNfVkFMCQkwCisKKy8qKgorICogQGJyaWVmIFBSSU1BU0sgdmFsdWUgdG8gZGlzYWJsZSBpbnRlcnJ1cHRzLgorICovCisjZGVmaW5lIHNlY3VyZXBvcnRQUklNQVNLX0RJU0FCTEVfSU5URVJSVVBUU19WQUwJMQorCisvKioKKyAqIEBicmllZiBEaXNhYmxlIHNlY3VyZSBpbnRlcnJ1cHRzLgorICovCisjZGVmaW5lIHNlY3VyZXBvcnRESVNBQkxFX1NFQ1VSRV9JTlRFUlJVUFRTKCkJCXNlY3VyZXBvcnRTRVRfU0VDVVJFX1BSSU1BU0soIHNlY3VyZXBvcnRQUklNQVNLX0RJU0FCTEVfSU5URVJSVVBUU19WQUwgKQorCisvKioKKyAqIEBicmllZiBEaXNhYmxlIG5vbi1zZWN1cmUgaW50ZXJydXB0cy4KKyAqCisgKiBUaGlzIGVmZmVjdGl2ZWx5IGRpc2FibGVzIGNvbnRleHQgc3dpdGNoZXMuCisgKi8KKyNkZWZpbmUgc2VjdXJlcG9ydERJU0FCTEVfTk9OX1NFQ1VSRV9JTlRFUlJVUFRTKCkJc2VjdXJlcG9ydFNFVF9OT05fU0VDVVJFX1BSSU1BU0soIHNlY3VyZXBvcnRQUklNQVNLX0RJU0FCTEVfSU5URVJSVVBUU19WQUwgKQorCisvKioKKyAqIEBicmllZiBFbmFibGUgbm9uLXNlY3VyZSBpbnRlcnJ1cHRzLgorICovCisjZGVmaW5lIHNlY3VyZXBvcnRFTkFCTEVfTk9OX1NFQ1VSRV9JTlRFUlJVUFRTKCkJc2VjdXJlcG9ydFNFVF9OT05fU0VDVVJFX1BSSU1BU0soIHNlY3VyZXBvcnRQUklNQVNLX0VOQUJMRV9JTlRFUlJVUFRTX1ZBTCApCisKKy8qKgorICogQGJyaWVmIEFzc2VydCBkZWZpbml0aW9uLgorICovCisjZGVmaW5lIHNlY3VyZXBvcnRBU1NFUlQoIHggKQkJCQkJCVwKKwlpZiggKCB4ICkgPT0gMCApCQkJCQkJCQlcCisJewkJCQkJCQkJCQkJCVwKKwkJc2VjdXJlcG9ydERJU0FCTEVfU0VDVVJFX0lOVEVSUlVQVFMoKTsJCVwKKwkJc2VjdXJlcG9ydERJU0FCTEVfTk9OX1NFQ1VSRV9JTlRFUlJVUFRTKCk7CVwKKwkJZm9yKCA7OyApOwkJCQkJCQkJCVwKKwl9CisKKyNlbmRpZiAvKiBfX1NFQ1VSRV9QT1JUX01BQ1JPU19IX18gKi8KZGlmZiAtLWdpdCBhL1NvdXJjZS9wb3J0YWJsZS9JQVIvQVJNX0NNMzNfTlRaL25vbl9zZWN1cmUvcG9ydC5jIGIvU291cmNlL3BvcnRhYmxlL0lBUi9BUk1fQ00zM19OVFovbm9uX3NlY3VyZS9wb3J0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ4NWE2ZgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9wb3J0YWJsZS9JQVIvQVJNX0NNMzNfTlRaL25vbl9zZWN1cmUvcG9ydC5jCkBAIC0wLDAgKzEsODk5IEBACisvKgorICogRnJlZVJUT1MgS2VybmVsIFYxMC4yLjEKKyAqIENvcHlyaWdodCAoQykgMjAxOSBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCisgKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgorICogdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bworICogdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YKKyAqIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKKyAqIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAorICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MKKyAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUgorICogQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSCisgKiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBodHRwOi8vd3d3LkZyZWVSVE9TLm9yZworICogaHR0cDovL2F3cy5hbWF6b24uY29tL2ZyZWVydG9zCisgKgorICogMSB0YWIgPT0gNCBzcGFjZXMhCisgKi8KKworLyogRGVmaW5pbmcgTVBVX1dSQVBQRVJTX0lOQ0xVREVEX0ZST01fQVBJX0ZJTEUgcHJldmVudHMgdGFzay5oIGZyb20gcmVkZWZpbmluZworICogYWxsIHRoZSBBUEkgZnVuY3Rpb25zIHRvIHVzZSB0aGUgTVBVIHdyYXBwZXJzLiBUaGF0IHNob3VsZCBvbmx5IGJlIGRvbmUgd2hlbgorICogdGFzay5oIGlzIGluY2x1ZGVkIGZyb20gYW4gYXBwbGljYXRpb24gZmlsZS4gKi8KKyNkZWZpbmUgTVBVX1dSQVBQRVJTX0lOQ0xVREVEX0ZST01fQVBJX0ZJTEUKKworLyogU2NoZWR1bGVyIGluY2x1ZGVzLiAqLworI2luY2x1ZGUgIkZyZWVSVE9TLmgiCisjaW5jbHVkZSAidGFzay5oIgorCisvKiBNUFUgd3JhcHBlcnMgaW5jbHVkZXMuICovCisjaW5jbHVkZSAibXB1X3dyYXBwZXJzLmgiCisKKy8qIFBvcnRhc20gaW5jbHVkZXMuICovCisjaW5jbHVkZSAicG9ydGFzbS5oIgorCisjaWYoIGNvbmZpZ0VOQUJMRV9UUlVTVFpPTkUgPT0gMSApCisJLyogU2VjdXJlIGNvbXBvbmVudHMgaW5jbHVkZXMuICovCisJI2luY2x1ZGUgInNlY3VyZV9jb250ZXh0LmgiCisJI2luY2x1ZGUgInNlY3VyZV9pbml0LmgiCisjZW5kaWYgLyogY29uZmlnRU5BQkxFX1RSVVNUWk9ORSAqLworCisjdW5kZWYgTVBVX1dSQVBQRVJTX0lOQ0xVREVEX0ZST01fQVBJX0ZJTEUKKworLyoqCisgKiBUaGUgRnJlZVJUT1MgQ29ydGV4IE0zMyBwb3J0IGNhbiBiZSBjb25maWd1cmVkIHRvIHJ1biBvbiB0aGUgU2VjdXJlIFNpZGUgb25seQorICogaS5lLiB0aGUgcHJvY2Vzc29yIGJvb3RzIGFzIHNlY3VyZSBhbmQgbmV2ZXIganVtcHMgdG8gdGhlIG5vbi1zZWN1cmUgc2lkZS4KKyAqIFRoZSBUcnVzdCBab25lIHN1cHBvcnQgaW4gdGhlIHBvcnQgbXVzdCBiZSBkaXNhYmxlZCBpbiBvcmRlciB0byBydW4gRnJlZVJUT1MKKyAqIG9uIHRoZSBzZWN1cmUgc2lkZS4gVGhlIGZvbGxvd2luZyBhcmUgdGhlIHZhbGlkIGNvbmZpZ3VyYXRpb24gc2VldGluZ3M6CisgKgorICogMS4gUnVuIEZyZWVSVE9TIG9uIHRoZSBTZWN1cmUgU2lkZToKKyAqCQljb25maWdSVU5fRlJFRVJUT1NfU0VDVVJFX09OTFkgPSAxIGFuZCBjb25maWdFTkFCTEVfVFJVU1RaT05FID0gMAorICoKKyAqIDIuIFJ1biBGcmVlUlRPUyBvbiB0aGUgTm9uLVNlY3VyZSBTaWRlIHdpdGggU2VjdXJlIFNpZGUgZnVuY3Rpb24gY2FsbCBzdXBwb3J0OgorICoJCWNvbmZpZ1JVTl9GUkVFUlRPU19TRUNVUkVfT05MWSA9IDAgYW5kIGNvbmZpZ0VOQUJMRV9UUlVTVFpPTkUgPSAxCisgKgorICogMy4gUnVuIEZyZWVSVE9TIG9uIHRoZSBOb24tU2VjdXJlIFNpZGUgb25seSBpLmUuIG5vIFNlY3VyZSBTaWRlIGZ1bmN0aW9uIGNhbGwgc3VwcG9ydDoKKyAqCQljb25maWdSVU5fRlJFRVJUT1NfU0VDVVJFX09OTFkgPSAwIGFuZCBjb25maWdFTkFCTEVfVFJVU1RaT05FID0gMAorICovCisjaWYoICggY29uZmlnUlVOX0ZSRUVSVE9TX1NFQ1VSRV9PTkxZID09IDEgKSAmJiAoIGNvbmZpZ0VOQUJMRV9UUlVTVFpPTkUgPT0gMSApICkKKwkjZXJyb3IgVHJ1c3Rab25lIG5lZWRzIHRvIGJlIGRpc2FibGVkIGluIG9yZGVyIHRvIHJ1biBGcmVlUlRPUyBvbiB0aGUgU2VjdXJlIFNpZGUuCisjZW5kaWYKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAqIEBicmllZiBDb25zdGFudHMgcmVxdWlyZWQgdG8gbWFuaXB1bGF0ZSB0aGUgTlZJQy4KKyAqLworI2RlZmluZSBwb3J0TlZJQ19TWVNUSUNLX0NUUkwJCQkJKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlMDEwICkKKyNkZWZpbmUgcG9ydE5WSUNfU1lTVElDS19MT0FECQkJCSggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZTAxNCApCisjZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfQ1VSUkVOVF9WQUxVRQkJKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlMDE4ICkKKyNkZWZpbmUgcG9ydE5WSUNfSU5UX0NUUkwJCQkJCSggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZWQwNCApCisjZGVmaW5lIHBvcnROVklDX1NZU1BSSTIJCQkJCSggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZWQyMCApCisjZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfQ0xLCQkJCSggMHgwMDAwMDAwNCApCisjZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfSU5UCQkJCSggMHgwMDAwMDAwMiApCisjZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfRU5BQkxFCQkJCSggMHgwMDAwMDAwMSApCisjZGVmaW5lIHBvcnROVklDX1BFTkRTVlNFVAkJCQkJKCAweDEwMDAwMDAwICkKKyNkZWZpbmUgcG9ydE1JTl9JTlRFUlJVUFRfUFJJT1JJVFkJCQkoIDI1NVVMICkKKyNkZWZpbmUgcG9ydE5WSUNfUEVORFNWX1BSSQkJCQkJKCBwb3J0TUlOX0lOVEVSUlVQVF9QUklPUklUWSA8PCAxNlVMICkKKyNkZWZpbmUgcG9ydE5WSUNfU1lTVElDS19QUkkJCQkJKCBwb3J0TUlOX0lOVEVSUlVQVF9QUklPUklUWSA8PCAyNFVMICkKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAqIEBicmllZiBDb25zdGFudHMgcmVxdWlyZWQgdG8gbWFuaXB1bGF0ZSB0aGUgU0NCLgorICovCisjZGVmaW5lIHBvcnRTQ0JfU1lTX0hBTkRMRVJfQ1RSTF9TVEFURV9SRUcJKCAqICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVkMjQgKQorI2RlZmluZSBwb3J0U0NCX01FTV9GQVVMVF9FTkFCTEUJCQkoIDFVTCA8PCAxNlVMICkKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAqIEBicmllZiBDb25zdGFudHMgcmVxdWlyZWQgdG8gbWFuaXB1bGF0ZSB0aGUgRlBVLgorICovCisjZGVmaW5lIHBvcnRDUEFDUgkJCQkJCQkoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVkODggKQkvKiBDb3Byb2Nlc3NvciBBY2Nlc3MgQ29udHJvbCBSZWdpc3Rlci4gKi8KKyNkZWZpbmUgcG9ydENQQUNSX0NQMTBfVkFMVUUJCQkJKCAzVUwgKQorI2RlZmluZSBwb3J0Q1BBQ1JfQ1AxMV9WQUxVRQkJCQlwb3J0Q1BBQ1JfQ1AxMF9WQUxVRQorI2RlZmluZSBwb3J0Q1BBQ1JfQ1AxMF9QT1MJCQkJCSggMjBVTCApCisjZGVmaW5lIHBvcnRDUEFDUl9DUDExX1BPUwkJCQkJKCAyMlVMICkKKworI2RlZmluZSBwb3J0RlBDQ1IJCQkJCQkJKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZjM0ICkJLyogRmxvYXRpbmcgUG9pbnQgQ29udGV4dCBDb250cm9sIFJlZ2lzdGVyLiAqLworI2RlZmluZSBwb3J0RlBDQ1JfQVNQRU5fUE9TCQkJCQkoIDMxVUwgKQorI2RlZmluZSBwb3J0RlBDQ1JfQVNQRU5fTUFTSwkJCQkoIDFVTCA8PCBwb3J0RlBDQ1JfQVNQRU5fUE9TICkKKyNkZWZpbmUgcG9ydEZQQ0NSX0xTUEVOX1BPUwkJCQkJKCAzMFVMICkKKyNkZWZpbmUgcG9ydEZQQ0NSX0xTUEVOX01BU0sJCQkJKCAxVUwgPDwgcG9ydEZQQ0NSX0xTUEVOX1BPUyApCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqCisgKiBAYnJpZWYgQ29uc3RhbnRzIHJlcXVpcmVkIHRvIG1hbmlwdWxhdGUgdGhlIE1QVS4KKyAqLworI2RlZmluZSBwb3J0TVBVX1RZUEVfUkVHCQkJCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZDkwICkgKQorI2RlZmluZSBwb3J0TVBVX0NUUkxfUkVHCQkJCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZDk0ICkgKQorI2RlZmluZSBwb3J0TVBVX1JOUl9SRUcJCQkJCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZDk4ICkgKQorCisjZGVmaW5lIHBvcnRNUFVfUkJBUl9SRUcJCQkJCSggKiAoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVkOWMgKSApCisjZGVmaW5lIHBvcnRNUFVfUkxBUl9SRUcJCQkJCSggKiAoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVkYTAgKSApCisKKyNkZWZpbmUgcG9ydE1QVV9SQkFSX0ExX1JFRwkJCQkJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZWRhNCApICkKKyNkZWZpbmUgcG9ydE1QVV9STEFSX0ExX1JFRwkJCQkJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZWRhOCApICkKKworI2RlZmluZSBwb3J0TVBVX1JCQVJfQTJfUkVHCQkJCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZGFjICkgKQorI2RlZmluZSBwb3J0TVBVX1JMQVJfQTJfUkVHCQkJCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZGIwICkgKQorCisjZGVmaW5lIHBvcnRNUFVfUkJBUl9BM19SRUcJCQkJCSggKiAoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVkYjQgKSApCisjZGVmaW5lIHBvcnRNUFVfUkxBUl9BM19SRUcJCQkJCSggKiAoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVkYjggKSApCisKKyNkZWZpbmUgcG9ydE1QVV9NQUlSMF9SRUcJCQkJCSggKiAoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVkYzAgKSApCisjZGVmaW5lIHBvcnRNUFVfTUFJUjFfUkVHCQkJCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZGM0ICkgKQorCisjZGVmaW5lIHBvcnRNUFVfUkJBUl9BRERSRVNTX01BU0sJCQkoIDB4ZmZmZmZmZTAgKSAvKiBNdXN0IGJlIDMyLWJ5dGUgYWxpZ25lZC4gKi8KKyNkZWZpbmUgcG9ydE1QVV9STEFSX0FERFJFU1NfTUFTSwkJCSggMHhmZmZmZmZlMCApIC8qIE11c3QgYmUgMzItYnl0ZSBhbGlnbmVkLiAqLworCisjZGVmaW5lIHBvcnRNUFVfTUFJUl9BVFRSMF9QT1MJCQkJKCAwVUwgKQorI2RlZmluZSBwb3J0TVBVX01BSVJfQVRUUjBfTUFTSwkJCQkoIDB4MDAwMDAwZmYgKQorCisjZGVmaW5lIHBvcnRNUFVfTUFJUl9BVFRSMV9QT1MJCQkJKCA4VUwgKQorI2RlZmluZSBwb3J0TVBVX01BSVJfQVRUUjFfTUFTSwkJCQkoIDB4MDAwMGZmMDAgKQorCisjZGVmaW5lIHBvcnRNUFVfTUFJUl9BVFRSMl9QT1MJCQkJKCAxNlVMICkKKyNkZWZpbmUgcG9ydE1QVV9NQUlSX0FUVFIyX01BU0sJCQkJKCAweDAwZmYwMDAwICkKKworI2RlZmluZSBwb3J0TVBVX01BSVJfQVRUUjNfUE9TCQkJCSggMjRVTCApCisjZGVmaW5lIHBvcnRNUFVfTUFJUl9BVFRSM19NQVNLCQkJCSggMHhmZjAwMDAwMCApCisKKyNkZWZpbmUgcG9ydE1QVV9NQUlSX0FUVFI0X1BPUwkJCQkoIDBVTCApCisjZGVmaW5lIHBvcnRNUFVfTUFJUl9BVFRSNF9NQVNLCQkJCSggMHgwMDAwMDBmZiApCisKKyNkZWZpbmUgcG9ydE1QVV9NQUlSX0FUVFI1X1BPUwkJCQkoIDhVTCApCisjZGVmaW5lIHBvcnRNUFVfTUFJUl9BVFRSNV9NQVNLCQkJCSggMHgwMDAwZmYwMCApCisKKyNkZWZpbmUgcG9ydE1QVV9NQUlSX0FUVFI2X1BPUwkJCQkoIDE2VUwgKQorI2RlZmluZSBwb3J0TVBVX01BSVJfQVRUUjZfTUFTSwkJCQkoIDB4MDBmZjAwMDAgKQorCisjZGVmaW5lIHBvcnRNUFVfTUFJUl9BVFRSN19QT1MJCQkJKCAyNFVMICkKKyNkZWZpbmUgcG9ydE1QVV9NQUlSX0FUVFI3X01BU0sJCQkJKCAweGZmMDAwMDAwICkKKworI2RlZmluZSBwb3J0TVBVX1JMQVJfQVRUUl9JTkRFWDAJCQkoIDBVTCA8PCAxVUwgKQorI2RlZmluZSBwb3J0TVBVX1JMQVJfQVRUUl9JTkRFWDEJCQkoIDFVTCA8PCAxVUwgKQorI2RlZmluZSBwb3J0TVBVX1JMQVJfQVRUUl9JTkRFWDIJCQkoIDJVTCA8PCAxVUwgKQorI2RlZmluZSBwb3J0TVBVX1JMQVJfQVRUUl9JTkRFWDMJCQkoIDNVTCA8PCAxVUwgKQorI2RlZmluZSBwb3J0TVBVX1JMQVJfQVRUUl9JTkRFWDQJCQkoIDRVTCA8PCAxVUwgKQorI2RlZmluZSBwb3J0TVBVX1JMQVJfQVRUUl9JTkRFWDUJCQkoIDVVTCA8PCAxVUwgKQorI2RlZmluZSBwb3J0TVBVX1JMQVJfQVRUUl9JTkRFWDYJCQkoIDZVTCA8PCAxVUwgKQorI2RlZmluZSBwb3J0TVBVX1JMQVJfQVRUUl9JTkRFWDcJCQkoIDdVTCA8PCAxVUwgKQorCisjZGVmaW5lIHBvcnRNUFVfUkxBUl9SRUdJT05fRU5BQkxFCQkJKCAxVUwgKQorCisvKiBFbmFibGUgcHJpdmlsZWdlZCBhY2Nlc3MgdG8gdW5tYXBwZWQgcmVnaW9uLiAqLworI2RlZmluZSBwb3J0TVBVX1BSSVZfQkFDS0dST1VORF9FTkFCTEUJCSggMVVMIDw8IDJVTCApCisKKy8qIEVuYWJsZSBNUFUuICovCisjZGVmaW5lIHBvcnRNUFVfRU5BQkxFCQkJCQkJKCAxVUwgPDwgMFVMICkKKworLyogRXhwZWN0ZWQgdmFsdWUgb2YgdGhlIHBvcnRNUFVfVFlQRSByZWdpc3Rlci4gKi8KKyNkZWZpbmUgcG9ydEVYUEVDVEVEX01QVV9UWVBFX1ZBTFVFCQkJKCA4VUwgPDwgOFVMICkgLyogOCByZWdpb25zLCB1bmlmaWVkLiAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKgorICogQGJyaWVmIENvbnN0YW50cyByZXF1aXJlZCB0byBzZXQgdXAgdGhlIGluaXRpYWwgc3RhY2suCisgKi8KKyNkZWZpbmUgcG9ydElOSVRJQUxfWFBTUgkJCQkJKCAweDAxMDAwMDAwICkKKworI2lmKCBjb25maWdSVU5fRlJFRVJUT1NfU0VDVVJFX09OTFkgPT0gMSApCisJLyoqCisJICogQGJyaWVmIEluaXRpYWwgRVhDX1JFVFVSTiB2YWx1ZS4KKwkgKgorCSAqICAgICBGRiAgICAgICAgIEZGICAgICAgICAgRkYgICAgICAgICBGRAorCSAqIDExMTEgMTExMSAgMTExMSAxMTExICAxMTExIDExMTEgIDExMTEgMTEwMQorCSAqCisJICogQml0WzZdIC0gMSAtLT4gVGhlIGV4Y2VwdGlvbiB3YXMgdGFrZW4gZnJvbSB0aGUgU2VjdXJlIHN0YXRlLgorCSAqIEJpdFs1XSAtIDEgLS0+IERvIG5vdCBza2lwIHN0YWNraW5nIG9mIGFkZGl0aW9uYWwgc3RhdGUgY29udGV4dC4KKwkgKiBCaXRbNF0gLSAxIC0tPiBUaGUgUEUgZGlkIG5vdCBhbGxvY2F0ZSBzcGFjZSBvbiB0aGUgc3RhY2sgZm9yIEZQIGNvbnRleHQuCisJICogQml0WzNdIC0gMSAtLT4gUmV0dXJuIHRvIHRoZSBUaHJlYWQgbW9kZS4KKwkgKiBCaXRbMl0gLSAxIC0tPiBSZXN0b3JlIHJlZ2lzdGVycyBmcm9tIHRoZSBwcm9jZXNzIHN0YWNrLgorCSAqIEJpdFsxXSAtIDAgLS0+IFJlc2VydmVkLCAwLgorCSAqIEJpdFswXSAtIDEgLS0+IFRoZSBleGNlcHRpb24gd2FzIHRha2VuIHRvIHRoZSBTZWN1cmUgc3RhdGUuCisJICovCisJI2RlZmluZSBwb3J0SU5JVElBTF9FWENfUkVUVVJOCQkJKCAweGZmZmZmZmZkICkKKyNlbHNlCisJLyoqCisJICogQGJyaWVmIEluaXRpYWwgRVhDX1JFVFVSTiB2YWx1ZS4KKwkgKgorCSAqICAgICBGRiAgICAgICAgIEZGICAgICAgICAgRkYgICAgICAgICBCQworCSAqIDExMTEgMTExMSAgMTExMSAxMTExICAxMTExIDExMTEgIDEwMTEgMTEwMAorCSAqCisJICogQml0WzZdIC0gMCAtLT4gVGhlIGV4Y2VwdGlvbiB3YXMgdGFrZW4gZnJvbSB0aGUgTm9uLVNlY3VyZSBzdGF0ZS4KKwkgKiBCaXRbNV0gLSAxIC0tPiBEbyBub3Qgc2tpcCBzdGFja2luZyBvZiBhZGRpdGlvbmFsIHN0YXRlIGNvbnRleHQuCisJICogQml0WzRdIC0gMSAtLT4gVGhlIFBFIGRpZCBub3QgYWxsb2NhdGUgc3BhY2Ugb24gdGhlIHN0YWNrIGZvciBGUCBjb250ZXh0LgorCSAqIEJpdFszXSAtIDEgLS0+IFJldHVybiB0byB0aGUgVGhyZWFkIG1vZGUuCisJICogQml0WzJdIC0gMSAtLT4gUmVzdG9yZSByZWdpc3RlcnMgZnJvbSB0aGUgcHJvY2VzcyBzdGFjay4KKwkgKiBCaXRbMV0gLSAwIC0tPiBSZXNlcnZlZCwgMC4KKwkgKiBCaXRbMF0gLSAwIC0tPiBUaGUgZXhjZXB0aW9uIHdhcyB0YWtlbiB0byB0aGUgTm9uLVNlY3VyZSBzdGF0ZS4KKwkgKi8KKwkjZGVmaW5lIHBvcnRJTklUSUFMX0VYQ19SRVRVUk4JCQkoIDB4ZmZmZmZmYmMgKQorI2VuZGlmIC8qIGNvbmZpZ1JVTl9GUkVFUlRPU19TRUNVUkVfT05MWSAqLworCisvKioKKyAqIEBicmllZiBDT05UUk9MIHJlZ2lzdGVyIHByaXZpbGVnZWQgYml0IG1hc2suCisgKgorICogQml0WzBdIGluIENPTlRST0wgcmVnaXN0ZXIgdGVsbHMgdGhlIHByaXZpbGVnZToKKyAqICBCaXRbMF0gPSAwID09PiBUaGUgdGFzayBpcyBwcml2aWxlZ2VkLgorICogIEJpdFswXSA9IDEgPT0+IFRoZSB0YXNrIGlzIG5vdCBwcml2aWxlZ2VkLgorICovCisjZGVmaW5lIHBvcnRDT05UUk9MX1BSSVZJTEVHRURfTUFTSwkJCSggMVVMIDw8IDBVTCApCisKKy8qKgorICogQGJyaWVmIEluaXRpYWwgQ09OVFJPTCByZWdpc3RlciB2YWx1ZXMuCisgKi8KKyNkZWZpbmUgcG9ydElOSVRJQUxfQ09OVFJPTF9VTlBSSVZJTEVHRUQJKCAweDMgKQorI2RlZmluZSBwb3J0SU5JVElBTF9DT05UUk9MX1BSSVZJTEVHRUQJCSggMHgyICkKKworLyoqCisgKiBAYnJpZWYgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSBwcmUtbG9hZGluZyBvZiB0aGUgaW5pdGlhbCBMUiB3aXRoIHRoZQorICogYWRkcmVzcyBvZiBwcnZUYXNrRXhpdEVycm9yKCkgaW4gY2FzZSBpdCBtZXNzZXMgdXAgdW53aW5kaW5nIG9mIHRoZSBzdGFjaworICogaW4gdGhlIGRlYnVnZ2VyLgorICovCisjaWZkZWYgY29uZmlnVEFTS19SRVRVUk5fQUREUkVTUworCSNkZWZpbmUgcG9ydFRBU0tfUkVUVVJOX0FERFJFU1MJCQljb25maWdUQVNLX1JFVFVSTl9BRERSRVNTCisjZWxzZQorCSNkZWZpbmUgcG9ydFRBU0tfUkVUVVJOX0FERFJFU1MJCQlwcnZUYXNrRXhpdEVycm9yCisjZW5kaWYKKworLyoqCisgKiBAYnJpZWYgSWYgcG9ydFBSRUxPQURfUkVHSVNURVJTIHRoZW4gcmVnaXN0ZXJzIHdpbGwgYmUgZ2l2ZW4gYW4gaW5pdGlhbCB2YWx1ZQorICogd2hlbiBhIHRhc2sgaXMgY3JlYXRlZC4gVGhpcyBoZWxwcyBpbiBkZWJ1Z2dpbmcgYXQgdGhlIGNvc3Qgb2YgY29kZSBzaXplLgorICovCisjZGVmaW5lIHBvcnRQUkVMT0FEX1JFR0lTVEVSUwkJCQkxCisKKy8qKgorICogQGJyaWVmIEEgdGFzayBpcyBjcmVhdGVkIHdpdGhvdXQgYSBzZWN1cmUgY29udGV4dCwgYW5kIG11c3QgY2FsbAorICogcG9ydEFMTE9DQVRFX1NFQ1VSRV9DT05URVhUKCkgdG8gZ2l2ZSBpdHNlbGYgYSBzZWN1cmUgY29udGV4dCBiZWZvcmUgaXQgbWFrZXMKKyAqIGFueSBzZWN1cmUgY2FsbHMuCisgKi8KKyNkZWZpbmUgcG9ydE5PX1NFQ1VSRV9DT05URVhUCQkJCTAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAqIEBicmllZiBTZXR1cCB0aGUgdGltZXIgdG8gZ2VuZXJhdGUgdGhlIHRpY2sgaW50ZXJydXB0cy4KKyAqLworc3RhdGljIHZvaWQgcHJ2U2V0dXBUaW1lckludGVycnVwdCggdm9pZCApIFBSSVZJTEVHRURfRlVOQ1RJT047CisKKy8qKgorICogQGJyaWVmIFVzZWQgdG8gY2F0Y2ggdGFza3MgdGhhdCBhdHRlbXB0IHRvIHJldHVybiBmcm9tIHRoZWlyIGltcGxlbWVudGluZworICogZnVuY3Rpb24uCisgKi8KK3N0YXRpYyB2b2lkIHBydlRhc2tFeGl0RXJyb3IoIHZvaWQgKTsKKworI2lmKCBjb25maWdFTkFCTEVfTVBVID09IDEgKQorCS8qKgorCSAqIEBicmllZiBTZXR1cCB0aGUgTWVtb3J5IFByb3RlY3Rpb24gVW5pdCAoTVBVKS4KKwkgKi8KKwlzdGF0aWMgdm9pZCBwcnZTZXR1cE1QVSggdm9pZCApIFBSSVZJTEVHRURfRlVOQ1RJT047CisjZW5kaWYgLyogY29uZmlnRU5BQkxFX01QVSAqLworCisjaWYoIGNvbmZpZ0VOQUJMRV9GUFUgPT0gMSApCisJLyoqCisJICogQGJyaWVmIFNldHVwIHRoZSBGbG9hdGluZyBQb2ludCBVbml0IChGUFUpLgorCSAqLworCXN0YXRpYyB2b2lkIHBydlNldHVwRlBVKCB2b2lkICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKyNlbmRpZiAvKiBjb25maWdFTkFCTEVfRlBVICovCisKKy8qKgorICogQGJyaWVmIFlpZWxkIHRoZSBwcm9jZXNzb3IuCisgKi8KK3ZvaWQgdlBvcnRZaWVsZCggdm9pZCApIFBSSVZJTEVHRURfRlVOQ1RJT047CisKKy8qKgorICogQGJyaWVmIEVudGVyIGNyaXRpY2FsIHNlY3Rpb24uCisgKi8KK3ZvaWQgdlBvcnRFbnRlckNyaXRpY2FsKCB2b2lkICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworLyoqCisgKiBAYnJpZWYgRXhpdCBmcm9tIGNyaXRpY2FsIHNlY3Rpb24uCisgKi8KK3ZvaWQgdlBvcnRFeGl0Q3JpdGljYWwoIHZvaWQgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisvKioKKyAqIEBicmllZiBTeXNUaWNrIGhhbmRsZXIuCisgKi8KK3ZvaWQgU3lzVGlja19IYW5kbGVyKCB2b2lkICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworLyoqCisgKiBAYnJpZWYgQyBwYXJ0IG9mIFNWQyBoYW5kbGVyLgorICovCitwb3J0RE9OVF9ESVNDQVJEIHZvaWQgdlBvcnRTVkNIYW5kbGVyX0MoIHVpbnQzMl90ICpwdWxDYWxsZXJTdGFja0FkZHJlc3MgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKgorICogQGJyaWVmIEVhY2ggdGFzayBtYWludGFpbnMgaXRzIG93biBpbnRlcnJ1cHQgc3RhdHVzIGluIHRoZSBjcml0aWNhbCBuZXN0aW5nCisgKiB2YXJpYWJsZS4KKyAqLworc3RhdGljIHZvbGF0aWxlIHVpbnQzMl90IHVsQ3JpdGljYWxOZXN0aW5nID0gMHhhYWFhYWFhYVVMOworCisjaWYoIGNvbmZpZ0VOQUJMRV9UUlVTVFpPTkUgPT0gMSApCisJLyoqCisJICogQGJyaWVmIFNhdmVkIGFzIHBhcnQgb2YgdGhlIHRhc2sgY29udGV4dCB0byBpbmRpY2F0ZSB3aGljaCBjb250ZXh0IHRoZQorCSAqIHRhc2sgaXMgdXNpbmcgb24gdGhlIHNlY3VyZSBzaWRlLgorCSAqLworCXBvcnRET05UX0RJU0NBUkQgdm9sYXRpbGUgU2VjdXJlQ29udGV4dEhhbmRsZV90IHhTZWN1cmVDb250ZXh0ID0gcG9ydE5PX1NFQ1VSRV9DT05URVhUOworI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9UUlVTVFpPTkUgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdm9pZCBwcnZTZXR1cFRpbWVySW50ZXJydXB0KCB2b2lkICkgLyogUFJJVklMRUdFRF9GVU5DVElPTiAqLworeworCS8qIFN0b3AgYW5kIHJlc2V0IHRoZSBTeXNUaWNrLiAqLworCSooIHBvcnROVklDX1NZU1RJQ0tfQ1RSTCApID0gMFVMOworCSooIHBvcnROVklDX1NZU1RJQ0tfQ1VSUkVOVF9WQUxVRSApID0gMFVMOworCisJLyogQ29uZmlndXJlIFN5c1RpY2sgdG8gaW50ZXJydXB0IGF0IHRoZSByZXF1ZXN0ZWQgcmF0ZS4gKi8KKwkqKCBwb3J0TlZJQ19TWVNUSUNLX0xPQUQgKSA9ICggY29uZmlnQ1BVX0NMT0NLX0haIC8gY29uZmlnVElDS19SQVRFX0haICkgLSAxVUw7CisJKiggcG9ydE5WSUNfU1lTVElDS19DVFJMICkgPSBwb3J0TlZJQ19TWVNUSUNLX0NMSyB8IHBvcnROVklDX1NZU1RJQ0tfSU5UIHwgcG9ydE5WSUNfU1lTVElDS19FTkFCTEU7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHZvaWQgcHJ2VGFza0V4aXRFcnJvciggdm9pZCApCit7Cit2b2xhdGlsZSB1aW50MzJfdCB1bER1bW15ID0gMFVMOworCisJLyogQSBmdW5jdGlvbiB0aGF0IGltcGxlbWVudHMgYSB0YXNrIG11c3Qgbm90IGV4aXQgb3IgYXR0ZW1wdCB0byByZXR1cm4gdG8KKwkgKiBpdHMgY2FsbGVyIGFzIHRoZXJlIGlzIG5vdGhpbmcgdG8gcmV0dXJuIHRvLiBJZiBhIHRhc2sgd2FudHMgdG8gZXhpdCBpdAorCSAqIHNob3VsZCBpbnN0ZWFkIGNhbGwgdlRhc2tEZWxldGUoIE5VTEwgKS4gQXJ0aWZpY2lhbGx5IGZvcmNlIGFuIGFzc2VydCgpCisJICogdG8gYmUgdHJpZ2dlcmVkIGlmIGNvbmZpZ0FTU0VSVCgpIGlzIGRlZmluZWQsIHRoZW4gc3RvcCBoZXJlIHNvCisJICogYXBwbGljYXRpb24gd3JpdGVycyBjYW4gY2F0Y2ggdGhlIGVycm9yLiAqLworCWNvbmZpZ0FTU0VSVCggdWxDcml0aWNhbE5lc3RpbmcgPT0gfjBVTCApOworCXBvcnRESVNBQkxFX0lOVEVSUlVQVFMoKTsKKworCXdoaWxlKCB1bER1bW15ID09IDAgKQorCXsKKwkJLyogVGhpcyBmaWxlIGNhbGxzIHBydlRhc2tFeGl0RXJyb3IoKSBhZnRlciB0aGUgc2NoZWR1bGVyIGhhcyBiZWVuCisJCSAqIHN0YXJ0ZWQgdG8gcmVtb3ZlIGEgY29tcGlsZXIgd2FybmluZyBhYm91dCB0aGUgZnVuY3Rpb24gYmVpbmcKKwkJICogZGVmaW5lZCBidXQgbmV2ZXIgY2FsbGVkLiAgdWxEdW1teSBpcyB1c2VkIHB1cmVseSB0byBxdWlldGVuIG90aGVyCisJCSAqIHdhcm5pbmdzIGFib3V0IGNvZGUgYXBwZWFyaW5nIGFmdGVyIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIC0gbWFraW5nCisJCSAqIHVsRHVtbXkgdm9sYXRpbGUgbWFrZXMgdGhlIGNvbXBpbGVyIHRoaW5rIHRoZSBmdW5jdGlvbiBjb3VsZCByZXR1cm4KKwkJICogYW5kIHRoZXJlZm9yZSBub3Qgb3V0cHV0IGFuICd1bnJlYWNoYWJsZSBjb2RlJyB3YXJuaW5nIGZvciBjb2RlIHRoYXQKKwkJICogYXBwZWFycyBhZnRlciBpdC4gKi8KKwl9Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmKCBjb25maWdFTkFCTEVfTVBVID09IDEgKQorCXN0YXRpYyB2b2lkIHBydlNldHVwTVBVKCB2b2lkICkgLyogUFJJVklMRUdFRF9GVU5DVElPTiAqLworCXsKKwkjaWYgZGVmaW5lZCggX19BUk1DQ19WRVJTSU9OICkKKwkJLyogRGVjbGFyYXRpb24gd2hlbiB0aGVzZSB2YXJpYWJsZSBhcmUgZGVmaW5lZCBpbiBjb2RlIGluc3RlYWQgb2YgYmVpbmcKKwkJICogZXhwb3J0ZWQgZnJvbSBsaW5rZXIgc2NyaXB0cy4gKi8KKwkJZXh0ZXJuIHVpbnQzMl90ICogX19wcml2aWxlZ2VkX2Z1bmN0aW9uc19zdGFydF9fOworCQlleHRlcm4gdWludDMyX3QgKiBfX3ByaXZpbGVnZWRfZnVuY3Rpb25zX2VuZF9fOworCQlleHRlcm4gdWludDMyX3QgKiBfX3N5c2NhbGxzX2ZsYXNoX3N0YXJ0X187CisJCWV4dGVybiB1aW50MzJfdCAqIF9fc3lzY2FsbHNfZmxhc2hfZW5kX187CisJCWV4dGVybiB1aW50MzJfdCAqIF9fdW5wcml2aWxlZ2VkX2ZsYXNoX3N0YXJ0X187CisJCWV4dGVybiB1aW50MzJfdCAqIF9fdW5wcml2aWxlZ2VkX2ZsYXNoX2VuZF9fOworCQlleHRlcm4gdWludDMyX3QgKiBfX3ByaXZpbGVnZWRfc3JhbV9zdGFydF9fOworCQlleHRlcm4gdWludDMyX3QgKiBfX3ByaXZpbGVnZWRfc3JhbV9lbmRfXzsKKwkjZWxzZQorCQkvKiBEZWNsYXJhdGlvbiB3aGVuIHRoZXNlIHZhcmlhYmxlIGFyZSBleHBvcnRlZCBmcm9tIGxpbmtlciBzY3JpcHRzLiAqLworCQlleHRlcm4gdWludDMyX3QgX19wcml2aWxlZ2VkX2Z1bmN0aW9uc19zdGFydF9fW107CisJCWV4dGVybiB1aW50MzJfdCBfX3ByaXZpbGVnZWRfZnVuY3Rpb25zX2VuZF9fW107CisJCWV4dGVybiB1aW50MzJfdCBfX3N5c2NhbGxzX2ZsYXNoX3N0YXJ0X19bXTsKKwkJZXh0ZXJuIHVpbnQzMl90IF9fc3lzY2FsbHNfZmxhc2hfZW5kX19bXTsKKwkJZXh0ZXJuIHVpbnQzMl90IF9fdW5wcml2aWxlZ2VkX2ZsYXNoX3N0YXJ0X19bXTsKKwkJZXh0ZXJuIHVpbnQzMl90IF9fdW5wcml2aWxlZ2VkX2ZsYXNoX2VuZF9fW107CisJCWV4dGVybiB1aW50MzJfdCBfX3ByaXZpbGVnZWRfc3JhbV9zdGFydF9fW107CisJCWV4dGVybiB1aW50MzJfdCBfX3ByaXZpbGVnZWRfc3JhbV9lbmRfX1tdOworCSNlbmRpZiAvKiBkZWZpbmVkKCBfX0FSTUNDX1ZFUlNJT04gKSAqLworCisJCS8qIENoZWNrIHRoYXQgdGhlIE1QVSBpcyBwcmVzZW50LiAqLworCQlpZiggcG9ydE1QVV9UWVBFX1JFRyA9PSBwb3J0RVhQRUNURURfTVBVX1RZUEVfVkFMVUUgKQorCQl7CisJCQkvKiBNQUlSMCAtIEluZGV4IDAuICovCisJCQlwb3J0TVBVX01BSVIwX1JFRyB8PSAoICggcG9ydE1QVV9OT1JNQUxfTUVNT1JZX0JVRkZFUkFCTEVfQ0FDSEVBQkxFIDw8IHBvcnRNUFVfTUFJUl9BVFRSMF9QT1MgKSAmIHBvcnRNUFVfTUFJUl9BVFRSMF9NQVNLICk7CisJCQkvKiBNQUlSMCAtIEluZGV4IDEuICovCisJCQlwb3J0TVBVX01BSVIwX1JFRyB8PSAoICggcG9ydE1QVV9ERVZJQ0VfTUVNT1JZX25HblJFIDw8IHBvcnRNUFVfTUFJUl9BVFRSMV9QT1MgKSAmIHBvcnRNUFVfTUFJUl9BVFRSMV9NQVNLICk7CisKKwkJCS8qIFNldHVwIHByaXZpbGVnZWQgZmxhc2ggYXMgUmVhZCBPbmx5IHNvIHRoYXQgcHJpdmlsZWdlZCB0YXNrcyBjYW4KKwkJCSAqIHJlYWQgaXQgYnV0IG5vdCBtb2RpZnkuICovCisJCQlwb3J0TVBVX1JOUl9SRUcgPSBwb3J0UFJJVklMRUdFRF9GTEFTSF9SRUdJT047CisJCQlwb3J0TVBVX1JCQVJfUkVHID0JKCAoICggdWludDMyX3QgKSBfX3ByaXZpbGVnZWRfZnVuY3Rpb25zX3N0YXJ0X18gKSAmIHBvcnRNUFVfUkJBUl9BRERSRVNTX01BU0sgKSB8CisJCQkJCQkJCSggcG9ydE1QVV9SRUdJT05fTk9OX1NIQVJFQUJMRSApIHwKKwkJCQkJCQkJKCBwb3J0TVBVX1JFR0lPTl9QUklWSUxFR0VEX1JFQURfT05MWSApOworCQkJcG9ydE1QVV9STEFSX1JFRyA9CSggKCAoIHVpbnQzMl90ICkgX19wcml2aWxlZ2VkX2Z1bmN0aW9uc19lbmRfXyApICYgcG9ydE1QVV9STEFSX0FERFJFU1NfTUFTSyApIHwKKwkJCQkJCQkJKCBwb3J0TVBVX1JMQVJfQVRUUl9JTkRFWDAgKSB8CisJCQkJCQkJCSggcG9ydE1QVV9STEFSX1JFR0lPTl9FTkFCTEUgKTsKKworCQkJLyogU2V0dXAgdW5wcml2aWxlZ2VkIGZsYXNoIGFzIFJlYWQgT25seSBieSBib3RoIHByaXZpbGVnZWQgYW5kCisJCQkgKiB1bnByaXZpbGVnZWQgdGFza3MuIEFsbCB0YXNrcyBjYW4gcmVhZCBpdCBidXQgbm8tb25lIGNhbiBtb2RpZnkuICovCisJCQlwb3J0TVBVX1JOUl9SRUcgPSBwb3J0VU5QUklWSUxFR0VEX0ZMQVNIX1JFR0lPTjsKKwkJCXBvcnRNUFVfUkJBUl9SRUcgPQkoICggKCB1aW50MzJfdCApIF9fdW5wcml2aWxlZ2VkX2ZsYXNoX3N0YXJ0X18gKSAmIHBvcnRNUFVfUkJBUl9BRERSRVNTX01BU0sgKSB8CisJCQkJCQkJCSggcG9ydE1QVV9SRUdJT05fTk9OX1NIQVJFQUJMRSApIHwKKwkJCQkJCQkJKCBwb3J0TVBVX1JFR0lPTl9SRUFEX09OTFkgKTsKKwkJCXBvcnRNUFVfUkxBUl9SRUcgPQkoICggKCB1aW50MzJfdCApIF9fdW5wcml2aWxlZ2VkX2ZsYXNoX2VuZF9fICkgJiBwb3J0TVBVX1JMQVJfQUREUkVTU19NQVNLICkgfAorCQkJCQkJCQkoIHBvcnRNUFVfUkxBUl9BVFRSX0lOREVYMCApIHwKKwkJCQkJCQkJKCBwb3J0TVBVX1JMQVJfUkVHSU9OX0VOQUJMRSApOworCisJCQkvKiBTZXR1cCB1bnByaXZpbGVnZWQgc3lzY2FsbHMgZmxhc2ggYXMgUmVhZCBPbmx5IGJ5IGJvdGggcHJpdmlsZWdlZAorCQkJICogYW5kIHVucHJpdmlsZWdlZCB0YXNrcy4gQWxsIHRhc2tzIGNhbiByZWFkIGl0IGJ1dCBuby1vbmUgY2FuIG1vZGlmeS4gKi8KKwkJCXBvcnRNUFVfUk5SX1JFRyA9IHBvcnRVTlBSSVZJTEVHRURfU1lTQ0FMTFNfUkVHSU9OOworCQkJcG9ydE1QVV9SQkFSX1JFRyA9CSggKCAoIHVpbnQzMl90ICkgX19zeXNjYWxsc19mbGFzaF9zdGFydF9fICkgJiBwb3J0TVBVX1JCQVJfQUREUkVTU19NQVNLICkgfAorCQkJCQkJCQkoIHBvcnRNUFVfUkVHSU9OX05PTl9TSEFSRUFCTEUgKSB8CisJCQkJCQkJCSggcG9ydE1QVV9SRUdJT05fUkVBRF9PTkxZICk7CisJCQlwb3J0TVBVX1JMQVJfUkVHID0JKCAoICggdWludDMyX3QgKSBfX3N5c2NhbGxzX2ZsYXNoX2VuZF9fICkgJiBwb3J0TVBVX1JMQVJfQUREUkVTU19NQVNLICkgfAorCQkJCQkJCQkoIHBvcnRNUFVfUkxBUl9BVFRSX0lOREVYMCApIHwKKwkJCQkJCQkJKCBwb3J0TVBVX1JMQVJfUkVHSU9OX0VOQUJMRSApOworCisJCQkvKiBTZXR1cCBSQU0gY29udGFpbmluZyBrZXJuZWwgZGF0YSBmb3IgcHJpdmlsZWdlZCBhY2Nlc3Mgb25seS4gKi8KKwkJCXBvcnRNUFVfUk5SX1JFRyA9IHBvcnRQUklWSUxFR0VEX1JBTV9SRUdJT047CisJCQlwb3J0TVBVX1JCQVJfUkVHID0JKCAoICggdWludDMyX3QgKSBfX3ByaXZpbGVnZWRfc3JhbV9zdGFydF9fICkgJiBwb3J0TVBVX1JCQVJfQUREUkVTU19NQVNLICkgfAorCQkJCQkJCQkoIHBvcnRNUFVfUkVHSU9OX05PTl9TSEFSRUFCTEUgKSB8CisJCQkJCQkJCSggcG9ydE1QVV9SRUdJT05fUFJJVklMRUdFRF9SRUFEX1dSSVRFICkgfAorCQkJCQkJCQkoIHBvcnRNUFVfUkVHSU9OX0VYRUNVVEVfTkVWRVIgKTsKKwkJCXBvcnRNUFVfUkxBUl9SRUcgPQkoICggKCB1aW50MzJfdCApIF9fcHJpdmlsZWdlZF9zcmFtX2VuZF9fICkgJiBwb3J0TVBVX1JMQVJfQUREUkVTU19NQVNLICkgfAorCQkJCQkJCQkoIHBvcnRNUFVfUkxBUl9BVFRSX0lOREVYMCApIHwKKwkJCQkJCQkJKCBwb3J0TVBVX1JMQVJfUkVHSU9OX0VOQUJMRSApOworCisJCQkvKiBFbmFibGUgbWVtIGZhdWx0LiAqLworCQkJcG9ydFNDQl9TWVNfSEFORExFUl9DVFJMX1NUQVRFX1JFRyB8PSBwb3J0U0NCX01FTV9GQVVMVF9FTkFCTEU7CisKKwkJCS8qIEVuYWJsZSBNUFUgd2l0aCBwcml2aWxlZ2VkIGJhY2tncm91bmQgYWNjZXNzIGkuZS4gdW5tYXBwZWQKKwkJCSAqIHJlZ2lvbnMgaGF2ZSBwcml2aWxlZ2VkIGFjY2Vzcy4gKi8KKwkJCXBvcnRNUFVfQ1RSTF9SRUcgfD0gKCBwb3J0TVBVX1BSSVZfQkFDS0dST1VORF9FTkFCTEUgfCBwb3J0TVBVX0VOQUJMRSApOworCQl9CisJfQorI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9NUFUgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYoIGNvbmZpZ0VOQUJMRV9GUFUgPT0gMSApCisJc3RhdGljIHZvaWQgcHJ2U2V0dXBGUFUoIHZvaWQgKSAvKiBQUklWSUxFR0VEX0ZVTkNUSU9OICovCisJeworCQkjaWYoIGNvbmZpZ0VOQUJMRV9UUlVTVFpPTkUgPT0gMSApCisJCXsKKwkJCS8qIEVuYWJsZSBub24tc2VjdXJlIGFjY2VzcyB0byB0aGUgRlBVLiAqLworCQkJU2VjdXJlSW5pdF9FbmFibGVOU0ZQVUFjY2VzcygpOworCQl9CisJCSNlbmRpZiAvKiBjb25maWdFTkFCTEVfVFJVU1RaT05FICovCisKKwkJLyogQ1AxMCA9IDExID09PiBGdWxsIGFjY2VzcyB0byBGUFUgaS5lLiBib3RoIHByaXZpbGVnZWQgYW5kCisJCSAqIHVucHJpdmlsZWdlZCBjb2RlIHNob3VsZCBiZSBhYmxlIHRvIGFjY2VzcyBGUFUuIENQMTEgc2hvdWxkIGJlCisJCSAqIHByb2dyYW1tZWQgdG8gdGhlIHNhbWUgdmFsdWUgYXMgQ1AxMC4gKi8KKwkJKiggcG9ydENQQUNSICkgfD0JKAkoIHBvcnRDUEFDUl9DUDEwX1ZBTFVFIDw8IHBvcnRDUEFDUl9DUDEwX1BPUyApIHwKKwkJCQkJCQkJKCBwb3J0Q1BBQ1JfQ1AxMV9WQUxVRSA8PCBwb3J0Q1BBQ1JfQ1AxMV9QT1MgKQorCQkJCQkJCSk7CisKKwkJLyogQVNQRU4gPSAxID09PiBIYXJkd2FyZSBzaG91bGQgYXV0b21hdGljYWxseSBwcmVzZXJ2ZSBmbG9hdGluZyBwb2ludAorCQkgKiBjb250ZXh0IG9uIGV4Y2VwdGlvbiBlbnRyeSBhbmQgcmVzdG9yZSBvbiBleGNlcHRpb24gcmV0dXJuLgorCQkgKiBMU1BFTiA9IDEgPT0+IEVuYWJsZSBsYXp5IGNvbnRleHQgc2F2ZSBvZiBGUCBzdGF0ZS4gKi8KKwkJKiggcG9ydEZQQ0NSICkgfD0gKCBwb3J0RlBDQ1JfQVNQRU5fTUFTSyB8IHBvcnRGUENDUl9MU1BFTl9NQVNLICk7CisJfQorI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9GUFUgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIHZQb3J0WWllbGQoIHZvaWQgKSAvKiBQUklWSUxFR0VEX0ZVTkNUSU9OICovCit7CisJLyogU2V0IGEgUGVuZFNWIHRvIHJlcXVlc3QgYSBjb250ZXh0IHN3aXRjaC4gKi8KKwkqKCBwb3J0TlZJQ19JTlRfQ1RSTCApID0gcG9ydE5WSUNfUEVORFNWU0VUOworCisJLyogQmFycmllcnMgYXJlIG5vcm1hbGx5IG5vdCByZXF1aXJlZCBidXQgZG8gZW5zdXJlIHRoZSBjb2RlIGlzCisJICogY29tcGxldGVseSB3aXRoaW4gdGhlIHNwZWNpZmllZCBiZWhhdmlvdXIgZm9yIHRoZSBhcmNoaXRlY3R1cmUuICovCisJX19hc20gdm9sYXRpbGUoICJkc2IiIDo6OiAibWVtb3J5IiApOworCV9fYXNtIHZvbGF0aWxlKCAiaXNiIiApOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgdlBvcnRFbnRlckNyaXRpY2FsKCB2b2lkICkgLyogUFJJVklMRUdFRF9GVU5DVElPTiAqLworeworCXBvcnRESVNBQkxFX0lOVEVSUlVQVFMoKTsKKwl1bENyaXRpY2FsTmVzdGluZysrOworCisJLyogQmFycmllcnMgYXJlIG5vcm1hbGx5IG5vdCByZXF1aXJlZCBidXQgZG8gZW5zdXJlIHRoZSBjb2RlIGlzCisJICogY29tcGxldGVseSB3aXRoaW4gdGhlIHNwZWNpZmllZCBiZWhhdmlvdXIgZm9yIHRoZSBhcmNoaXRlY3R1cmUuICovCisJX19hc20gdm9sYXRpbGUoICJkc2IiIDo6OiAibWVtb3J5IiApOworCV9fYXNtIHZvbGF0aWxlKCAiaXNiIiApOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgdlBvcnRFeGl0Q3JpdGljYWwoIHZvaWQgKSAvKiBQUklWSUxFR0VEX0ZVTkNUSU9OICovCit7CisJY29uZmlnQVNTRVJUKCB1bENyaXRpY2FsTmVzdGluZyApOworCXVsQ3JpdGljYWxOZXN0aW5nLS07CisKKwlpZiggdWxDcml0aWNhbE5lc3RpbmcgPT0gMCApCisJeworCQlwb3J0RU5BQkxFX0lOVEVSUlVQVFMoKTsKKwl9Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBTeXNUaWNrX0hhbmRsZXIoIHZvaWQgKSAvKiBQUklWSUxFR0VEX0ZVTkNUSU9OICovCit7Cit1aW50MzJfdCB1bFByZXZpb3VzTWFzazsKKworCXVsUHJldmlvdXNNYXNrID0gcG9ydFNFVF9JTlRFUlJVUFRfTUFTS19GUk9NX0lTUigpOworCXsKKwkJLyogSW5jcmVtZW50IHRoZSBSVE9TIHRpY2suICovCisJCWlmKCB4VGFza0luY3JlbWVudFRpY2soKSAhPSBwZEZBTFNFICkKKwkJeworCQkJLyogUGVuZCBhIGNvbnRleHQgc3dpdGNoLiAqLworCQkJKiggcG9ydE5WSUNfSU5UX0NUUkwgKSA9IHBvcnROVklDX1BFTkRTVlNFVDsKKwkJfQorCX0KKwlwb3J0Q0xFQVJfSU5URVJSVVBUX01BU0tfRlJPTV9JU1IoIHVsUHJldmlvdXNNYXNrICk7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCB2UG9ydFNWQ0hhbmRsZXJfQyggdWludDMyX3QgKnB1bENhbGxlclN0YWNrQWRkcmVzcyApIC8qIFBSSVZJTEVHRURfRlVOQ1RJT04gcG9ydERPTlRfRElTQ0FSRCAqLworeworI2lmKCBjb25maWdFTkFCTEVfTVBVID09IDEgKQorCSNpZiBkZWZpbmVkKCBfX0FSTUNDX1ZFUlNJT04gKQorCQkvKiBEZWNsYXJhdGlvbiB3aGVuIHRoZXNlIHZhcmlhYmxlIGFyZSBkZWZpbmVkIGluIGNvZGUgaW5zdGVhZCBvZiBiZWluZworCQkgKiBleHBvcnRlZCBmcm9tIGxpbmtlciBzY3JpcHRzLiAqLworCQlleHRlcm4gdWludDMyX3QgKiBfX3N5c2NhbGxzX2ZsYXNoX3N0YXJ0X187CisJCWV4dGVybiB1aW50MzJfdCAqIF9fc3lzY2FsbHNfZmxhc2hfZW5kX187CisJI2Vsc2UKKwkJLyogRGVjbGFyYXRpb24gd2hlbiB0aGVzZSB2YXJpYWJsZSBhcmUgZXhwb3J0ZWQgZnJvbSBsaW5rZXIgc2NyaXB0cy4gKi8KKwkJZXh0ZXJuIHVpbnQzMl90IF9fc3lzY2FsbHNfZmxhc2hfc3RhcnRfX1tdOworCQlleHRlcm4gdWludDMyX3QgX19zeXNjYWxsc19mbGFzaF9lbmRfX1tdOworCSNlbmRpZiAvKiBkZWZpbmVkKCBfX0FSTUNDX1ZFUlNJT04gKSAqLworI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9NUFUgKi8KKwordWludDMyX3QgdWxQQzsKKworI2lmKCBjb25maWdFTkFCTEVfVFJVU1RaT05FID09IDEgKQorCXVpbnQzMl90IHVsUjA7CisJI2lmKCBjb25maWdFTkFCTEVfTVBVID09IDEgKQorCQl1aW50MzJfdCB1bENvbnRyb2wsIHVsSXNUYXNrUHJpdmlsZWdlZDsKKwkjZW5kaWYgLyogY29uZmlnRU5BQkxFX01QVSAqLworI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9UUlVTVFpPTkUgKi8KK3VpbnQ4X3QgdWNTVkNOdW1iZXI7CisKKwkvKiBSZWdpc3RlciBhcmUgc3RvcmVkIG9uIHRoZSBzdGFjayBpbiB0aGUgZm9sbG93aW5nIG9yZGVyIC0gUjAsIFIxLCBSMiwgUjMsCisJICogUjEyLCBMUiwgUEMsIHhQU1IuICovCisJdWxQQyA9IHB1bENhbGxlclN0YWNrQWRkcmVzc1sgNiBdOworCXVjU1ZDTnVtYmVyID0gKCAoIHVpbnQ4X3QgKikgdWxQQyApWyAtMiBdOworCisJc3dpdGNoKCB1Y1NWQ051bWJlciApCisJeworCQkjaWYoIGNvbmZpZ0VOQUJMRV9UUlVTVFpPTkUgPT0gMSApCisJCQljYXNlIHBvcnRTVkNfQUxMT0NBVEVfU0VDVVJFX0NPTlRFWFQ6CisJCQl7CisJCQkJLyogUjAgY29udGFpbnMgdGhlIHN0YWNrIHNpemUgcGFzc2VkIGFzIHBhcmFtZXRlciB0byB0aGUKKwkJCQkgKiB2UG9ydEFsbG9jYXRlU2VjdXJlQ29udGV4dCBmdW5jdGlvbi4gKi8KKwkJCQl1bFIwID0gcHVsQ2FsbGVyU3RhY2tBZGRyZXNzWyAwIF07CisKKwkJCQkjaWYoIGNvbmZpZ0VOQUJMRV9NUFUgPT0gMSApCisJCQkJeworCQkJCQkvKiBSZWFkIHRoZSBDT05UUk9MIHJlZ2lzdGVyIHZhbHVlLiAqLworCQkJCQlfX2FzbSB2b2xhdGlsZSAoICJtcnMgJTAsIGNvbnRyb2wiICA6ICI9ciIgKCB1bENvbnRyb2wgKSApOworCisJCQkJCS8qIFRoZSB0YXNrIHRoYXQgcmFpc2VkIHRoZSBTVkMgaXMgcHJpdmlsZWdlZCBpZiBCaXRbMF0KKwkJCQkJICogaW4gdGhlIENPTlRST0wgcmVnaXN0ZXIgaXMgMC4gKi8KKwkJCQkJdWxJc1Rhc2tQcml2aWxlZ2VkID0gKCAoIHVsQ29udHJvbCAmIHBvcnRDT05UUk9MX1BSSVZJTEVHRURfTUFTSyApID09IDAgKTsKKworCQkJCQkvKiBBbGxvY2F0ZSBhbmQgbG9hZCBhIGNvbnRleHQgZm9yIHRoZSBzZWN1cmUgdGFzay4gKi8KKwkJCQkJeFNlY3VyZUNvbnRleHQgPSBTZWN1cmVDb250ZXh0X0FsbG9jYXRlQ29udGV4dCggdWxSMCwgdWxJc1Rhc2tQcml2aWxlZ2VkICk7CisJCQkJfQorCQkJCSNlbHNlCisJCQkJeworCQkJCQkvKiBBbGxvY2F0ZSBhbmQgbG9hZCBhIGNvbnRleHQgZm9yIHRoZSBzZWN1cmUgdGFzay4gKi8KKwkJCQkJeFNlY3VyZUNvbnRleHQgPSBTZWN1cmVDb250ZXh0X0FsbG9jYXRlQ29udGV4dCggdWxSMCApOworCQkJCX0KKwkJCQkjZW5kaWYgLyogY29uZmlnRU5BQkxFX01QVSAqLworCisJCQkJY29uZmlnQVNTRVJUKCB4U2VjdXJlQ29udGV4dCAhPSBOVUxMICk7CisJCQkJU2VjdXJlQ29udGV4dF9Mb2FkQ29udGV4dCggeFNlY3VyZUNvbnRleHQgKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCQljYXNlIHBvcnRTVkNfRlJFRV9TRUNVUkVfQ09OVEVYVDoKKwkJCXsKKwkJCQkvKiBSMCBjb250YWlucyB0aGUgc2VjdXJlIGNvbnRleHQgaGFuZGxlIHRvIGJlIGZyZWVkLiAqLworCQkJCXVsUjAgPSBwdWxDYWxsZXJTdGFja0FkZHJlc3NbIDAgXTsKKworCQkJCS8qIEZyZWUgdGhlIHNlY3VyZSBjb250ZXh0LiAqLworCQkJCVNlY3VyZUNvbnRleHRfRnJlZUNvbnRleHQoICggU2VjdXJlQ29udGV4dEhhbmRsZV90ICkgdWxSMCApOworCQkJfQorCQkJYnJlYWs7CisJCSNlbmRpZiAvKiBjb25maWdFTkFCTEVfVFJVU1RaT05FICovCisKKwkJY2FzZSBwb3J0U1ZDX1NUQVJUX1NDSEVEVUxFUjoKKwkJeworCQkJI2lmKCBjb25maWdFTkFCTEVfVFJVU1RaT05FID09IDEgKQorCQkJeworCQkJCS8qIERlLXByaW9yaXRpemUgdGhlIG5vbi1zZWN1cmUgZXhjZXB0aW9ucyBzbyB0aGF0IHRoZQorCQkJCSAqIG5vbi1zZWN1cmUgcGVuZFNWIHJ1bnMgYXQgdGhlIGxvd2VzdCBwcmlvcml0eS4gKi8KKwkJCQlTZWN1cmVJbml0X0RlUHJpb3JpdGl6ZU5TRXhjZXB0aW9ucygpOworCisJCQkJLyogSW5pdGlhbGl6ZSB0aGUgc2VjdXJlIGNvbnRleHQgbWFuYWdlbWVudCBzeXN0ZW0uICovCisJCQkJU2VjdXJlQ29udGV4dF9Jbml0KCk7CisJCQl9CisJCQkjZW5kaWYgLyogY29uZmlnRU5BQkxFX1RSVVNUWk9ORSAqLworCisJCQkjaWYoIGNvbmZpZ0VOQUJMRV9GUFUgPT0gMSApCisJCQl7CisJCQkJLyogU2V0dXAgdGhlIEZsb2F0aW5nIFBvaW50IFVuaXQgKEZQVSkuICovCisJCQkJcHJ2U2V0dXBGUFUoKTsKKwkJCX0KKwkJCSNlbmRpZiAvKiBjb25maWdFTkFCTEVfRlBVICovCisKKwkJCS8qIFNldHVwIHRoZSBjb250ZXh0IG9mIHRoZSBmaXJzdCB0YXNrIHNvIHRoYXQgdGhlIGZpcnN0IHRhc2sgc3RhcnRzCisJCQkgKiBleGVjdXRpbmcuICovCisJCQl2UmVzdG9yZUNvbnRleHRPZkZpcnN0VGFzaygpOworCQl9CisJCWJyZWFrOworCisJCSNpZiggY29uZmlnRU5BQkxFX01QVSA9PSAxICkKKwkJCWNhc2UgcG9ydFNWQ19SQUlTRV9QUklWSUxFR0U6CisJCQl7CisJCQkJLyogT25seSByYWlzZSB0aGUgcHJpdmlsZWdlLCBpZiB0aGUgc3ZjIHdhcyByYWlzZWQgZnJvbSBhbnkgb2YKKwkJCQkgKiB0aGUgc3lzdGVtIGNhbGxzLiAqLworCQkJCWlmKCB1bFBDID49ICggdWludDMyX3QgKSBfX3N5c2NhbGxzX2ZsYXNoX3N0YXJ0X18gJiYKKwkJCQkJdWxQQyA8PSAoIHVpbnQzMl90ICkgX19zeXNjYWxsc19mbGFzaF9lbmRfXyApCisJCQkJeworCQkJCQl2UmFpc2VQcml2aWxlZ2UoKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9NUFUgKi8KKworCQlkZWZhdWx0OgorCQl7CisJCQkvKiBJbmNvcnJlY3QgU1ZDIGNhbGwuICovCisJCQljb25maWdBU1NFUlQoIHBkRkFMU0UgKTsKKwkJfQorCX0KK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYoIGNvbmZpZ0VOQUJMRV9NUFUgPT0gMSApCisJU3RhY2tUeXBlX3QgKnB4UG9ydEluaXRpYWxpc2VTdGFjayggU3RhY2tUeXBlX3QgKnB4VG9wT2ZTdGFjaywgU3RhY2tUeXBlX3QgKnB4RW5kT2ZTdGFjaywgVGFza0Z1bmN0aW9uX3QgcHhDb2RlLCB2b2lkICpwdlBhcmFtZXRlcnMsIEJhc2VUeXBlX3QgeFJ1blByaXZpbGVnZWQgKSAvKiBQUklWSUxFR0VEX0ZVTkNUSU9OICovCisjZWxzZQorCVN0YWNrVHlwZV90ICpweFBvcnRJbml0aWFsaXNlU3RhY2soIFN0YWNrVHlwZV90ICpweFRvcE9mU3RhY2ssIFN0YWNrVHlwZV90ICpweEVuZE9mU3RhY2ssIFRhc2tGdW5jdGlvbl90IHB4Q29kZSwgdm9pZCAqcHZQYXJhbWV0ZXJzICkgLyogUFJJVklMRUdFRF9GVU5DVElPTiAqLworI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9NUFUgKi8KK3sKKwkvKiBTaW11bGF0ZSB0aGUgc3RhY2sgZnJhbWUgYXMgaXQgd291bGQgYmUgY3JlYXRlZCBieSBhIGNvbnRleHQgc3dpdGNoCisJICogaW50ZXJydXB0LiAqLworCSNpZiggcG9ydFBSRUxPQURfUkVHSVNURVJTID09IDAgKQorCXsKKwkJcHhUb3BPZlN0YWNrLS07IC8qIE9mZnNldCBhZGRlZCB0byBhY2NvdW50IGZvciB0aGUgd2F5IHRoZSBNQ1UgdXNlcyB0aGUgc3RhY2sgb24gZW50cnkvZXhpdCBvZiBpbnRlcnJ1cHRzLiAqLworCQkqcHhUb3BPZlN0YWNrID0gcG9ydElOSVRJQUxfWFBTUjsJCQkJCQkJLyogeFBTUiAqLworCQlweFRvcE9mU3RhY2stLTsKKwkJKnB4VG9wT2ZTdGFjayA9ICggU3RhY2tUeXBlX3QgKSBweENvZGU7CQkJCQkJLyogUEMgKi8KKwkJcHhUb3BPZlN0YWNrLS07CisJCSpweFRvcE9mU3RhY2sgPSAoIFN0YWNrVHlwZV90ICkgcG9ydFRBU0tfUkVUVVJOX0FERFJFU1M7CS8qIExSICovCisJCXB4VG9wT2ZTdGFjayAtPSA1OwkJCQkJCQkJCQkJLyogUjEyLCBSMywgUjIgYW5kIFIxLiAqLworCQkqcHhUb3BPZlN0YWNrID0gKCBTdGFja1R5cGVfdCApIHB2UGFyYW1ldGVyczsJCQkJLyogUjAgKi8KKwkJcHhUb3BPZlN0YWNrIC09IDk7CQkJCQkJCQkJCQkvKiBSMTEuLlI0LCBFWENfUkVUVVJOLiAqLworCQkqcHhUb3BPZlN0YWNrID0gcG9ydElOSVRJQUxfRVhDX1JFVFVSTjsKKworCQkjaWYoIGNvbmZpZ0VOQUJMRV9NUFUgPT0gMSApCisJCXsKKwkJCXB4VG9wT2ZTdGFjay0tOworCQkJaWYoIHhSdW5Qcml2aWxlZ2VkID09IHBkVFJVRSApCisJCQl7CisJCQkJKnB4VG9wT2ZTdGFjayA9IHBvcnRJTklUSUFMX0NPTlRST0xfUFJJVklMRUdFRDsJCS8qIFNsb3QgdXNlZCB0byBob2xkIHRoaXMgdGFzaydzIENPTlRST0wgdmFsdWUuICovCisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJKnB4VG9wT2ZTdGFjayA9IHBvcnRJTklUSUFMX0NPTlRST0xfVU5QUklWSUxFR0VEOwkvKiBTbG90IHVzZWQgdG8gaG9sZCB0aGlzIHRhc2sncyBDT05UUk9MIHZhbHVlLiAqLworCQkJfQorCQl9CisJCSNlbmRpZiAvKiBjb25maWdFTkFCTEVfTVBVICovCisKKwkJcHhUb3BPZlN0YWNrLS07CisJCSpweFRvcE9mU3RhY2sgPSAoIFN0YWNrVHlwZV90ICkgcHhFbmRPZlN0YWNrOwkvKiBTbG90IHVzZWQgdG8gaG9sZCB0aGlzIHRhc2sncyBQU1BMSU0gdmFsdWUuICovCisKKwkJI2lmKCBjb25maWdFTkFCTEVfVFJVU1RaT05FID09IDEgKQorCQl7CisJCQlweFRvcE9mU3RhY2stLTsKKwkJCSpweFRvcE9mU3RhY2sgPSBwb3J0Tk9fU0VDVVJFX0NPTlRFWFQ7CQkvKiBTbG90IHVzZWQgdG8gaG9sZCB0aGlzIHRhc2sncyB4U2VjdXJlQ29udGV4dCB2YWx1ZS4gKi8KKwkJfQorCQkjZW5kaWYgLyogY29uZmlnRU5BQkxFX1RSVVNUWk9ORSAqLworCX0KKwkjZWxzZSAvKiBwb3J0UFJFTE9BRF9SRUdJU1RFUlMgKi8KKwl7CisJCXB4VG9wT2ZTdGFjay0tOyAvKiBPZmZzZXQgYWRkZWQgdG8gYWNjb3VudCBmb3IgdGhlIHdheSB0aGUgTUNVIHVzZXMgdGhlIHN0YWNrIG9uIGVudHJ5L2V4aXQgb2YgaW50ZXJydXB0cy4gKi8KKwkJKnB4VG9wT2ZTdGFjayA9IHBvcnRJTklUSUFMX1hQU1I7CQkJCQkJCS8qIHhQU1IgKi8KKwkJcHhUb3BPZlN0YWNrLS07CisJCSpweFRvcE9mU3RhY2sgPSAoIFN0YWNrVHlwZV90ICkgcHhDb2RlOwkJCQkJCS8qIFBDICovCisJCXB4VG9wT2ZTdGFjay0tOworCQkqcHhUb3BPZlN0YWNrID0gKCBTdGFja1R5cGVfdCApIHBvcnRUQVNLX1JFVFVSTl9BRERSRVNTOwkvKiBMUiAqLworCQlweFRvcE9mU3RhY2stLTsKKwkJKnB4VG9wT2ZTdGFjayA9ICggU3RhY2tUeXBlX3QgKSAweDEyMTIxMjEyVUw7CQkJCS8qIFIxMiAqLworCQlweFRvcE9mU3RhY2stLTsKKwkJKnB4VG9wT2ZTdGFjayA9ICggU3RhY2tUeXBlX3QgKSAweDAzMDMwMzAzVUw7CQkJCS8qIFIzICovCisJCXB4VG9wT2ZTdGFjay0tOworCQkqcHhUb3BPZlN0YWNrID0gKCBTdGFja1R5cGVfdCApIDB4MDIwMjAyMDJVTDsJCQkJLyogUjIgKi8KKwkJcHhUb3BPZlN0YWNrLS07CisJCSpweFRvcE9mU3RhY2sgPSAoIFN0YWNrVHlwZV90ICkgMHgwMTAxMDEwMVVMOwkJCQkvKiBSMSAqLworCQlweFRvcE9mU3RhY2stLTsKKwkJKnB4VG9wT2ZTdGFjayA9ICggU3RhY2tUeXBlX3QgKSBwdlBhcmFtZXRlcnM7CQkJCS8qIFIwICovCisJCXB4VG9wT2ZTdGFjay0tOworCQkqcHhUb3BPZlN0YWNrID0gKCBTdGFja1R5cGVfdCApIDB4MTExMTExMTFVTDsJCQkJLyogUjExICovCisJCXB4VG9wT2ZTdGFjay0tOworCQkqcHhUb3BPZlN0YWNrID0gKCBTdGFja1R5cGVfdCApIDB4MTAxMDEwMTBVTDsJCQkJLyogUjEwICovCisJCXB4VG9wT2ZTdGFjay0tOworCQkqcHhUb3BPZlN0YWNrID0gKCBTdGFja1R5cGVfdCApIDB4MDkwOTA5MDlVTDsJCQkJLyogUjA5ICovCisJCXB4VG9wT2ZTdGFjay0tOworCQkqcHhUb3BPZlN0YWNrID0gKCBTdGFja1R5cGVfdCApIDB4MDgwODA4MDhVTDsJCQkJLyogUjA4ICovCisJCXB4VG9wT2ZTdGFjay0tOworCQkqcHhUb3BPZlN0YWNrID0gKCBTdGFja1R5cGVfdCApIDB4MDcwNzA3MDdVTDsJCQkJLyogUjA3ICovCisJCXB4VG9wT2ZTdGFjay0tOworCQkqcHhUb3BPZlN0YWNrID0gKCBTdGFja1R5cGVfdCApIDB4MDYwNjA2MDZVTDsJCQkJLyogUjA2ICovCisJCXB4VG9wT2ZTdGFjay0tOworCQkqcHhUb3BPZlN0YWNrID0gKCBTdGFja1R5cGVfdCApIDB4MDUwNTA1MDVVTDsJCQkJLyogUjA1ICovCisJCXB4VG9wT2ZTdGFjay0tOworCQkqcHhUb3BPZlN0YWNrID0gKCBTdGFja1R5cGVfdCApIDB4MDQwNDA0MDRVTDsJCQkJLyogUjA0ICovCisJCXB4VG9wT2ZTdGFjay0tOworCQkqcHhUb3BPZlN0YWNrID0gcG9ydElOSVRJQUxfRVhDX1JFVFVSTjsJCQkJCQkvKiBFWENfUkVUVVJOICovCisKKwkJI2lmKCBjb25maWdFTkFCTEVfTVBVID09IDEgKQorCQl7CisJCQlweFRvcE9mU3RhY2stLTsKKwkJCWlmKCB4UnVuUHJpdmlsZWdlZCA9PSBwZFRSVUUgKQorCQkJeworCQkJCSpweFRvcE9mU3RhY2sgPSBwb3J0SU5JVElBTF9DT05UUk9MX1BSSVZJTEVHRUQ7CQkvKiBTbG90IHVzZWQgdG8gaG9sZCB0aGlzIHRhc2sncyBDT05UUk9MIHZhbHVlLiAqLworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCSpweFRvcE9mU3RhY2sgPSBwb3J0SU5JVElBTF9DT05UUk9MX1VOUFJJVklMRUdFRDsJLyogU2xvdCB1c2VkIHRvIGhvbGQgdGhpcyB0YXNrJ3MgQ09OVFJPTCB2YWx1ZS4gKi8KKwkJCX0KKwkJfQorCQkjZW5kaWYgLyogY29uZmlnRU5BQkxFX01QVSAqLworCisJCXB4VG9wT2ZTdGFjay0tOworCQkqcHhUb3BPZlN0YWNrID0gKCBTdGFja1R5cGVfdCApIHB4RW5kT2ZTdGFjazsJLyogU2xvdCB1c2VkIHRvIGhvbGQgdGhpcyB0YXNrJ3MgUFNQTElNIHZhbHVlLiAqLworCisJCSNpZiggY29uZmlnRU5BQkxFX1RSVVNUWk9ORSA9PSAxICkKKwkJeworCQkJcHhUb3BPZlN0YWNrLS07CisJCQkqcHhUb3BPZlN0YWNrID0gcG9ydE5PX1NFQ1VSRV9DT05URVhUOwkJLyogU2xvdCB1c2VkIHRvIGhvbGQgdGhpcyB0YXNrJ3MgeFNlY3VyZUNvbnRleHQgdmFsdWUuICovCisJCX0KKwkJI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9UUlVTVFpPTkUgKi8KKwl9CisJI2VuZGlmIC8qIHBvcnRQUkVMT0FEX1JFR0lTVEVSUyAqLworCisJcmV0dXJuIHB4VG9wT2ZTdGFjazsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitCYXNlVHlwZV90IHhQb3J0U3RhcnRTY2hlZHVsZXIoIHZvaWQgKSAvKiBQUklWSUxFR0VEX0ZVTkNUSU9OICovCit7CisJLyogTWFrZSBQZW5kU1YsIENhbGxTViBhbmQgU3lzVGljayB0aGUgc2FtZSBwcmlvcml0eSBhcyB0aGUga2VybmVsLiAqLworCSooIHBvcnROVklDX1NZU1BSSTIgKSB8PSBwb3J0TlZJQ19QRU5EU1ZfUFJJOworCSooIHBvcnROVklDX1NZU1BSSTIgKSB8PSBwb3J0TlZJQ19TWVNUSUNLX1BSSTsKKworCSNpZiggY29uZmlnRU5BQkxFX01QVSA9PSAxICkKKwl7CisJCS8qIFNldHVwIHRoZSBNZW1vcnkgUHJvdGVjdGlvbiBVbml0IChNUFUpLiAqLworCQlwcnZTZXR1cE1QVSgpOworCX0KKwkjZW5kaWYgLyogY29uZmlnRU5BQkxFX01QVSAqLworCisJLyogU3RhcnQgdGhlIHRpbWVyIHRoYXQgZ2VuZXJhdGVzIHRoZSB0aWNrIElTUi4gSW50ZXJydXB0cyBhcmUgZGlzYWJsZWQKKwkgKiBoZXJlIGFscmVhZHkuICovCisJcHJ2U2V0dXBUaW1lckludGVycnVwdCgpOworCisJLyogSW5pdGlhbGl6ZSB0aGUgY3JpdGljYWwgbmVzdGluZyBjb3VudCByZWFkeSBmb3IgdGhlIGZpcnN0IHRhc2suICovCisJdWxDcml0aWNhbE5lc3RpbmcgPSAwOworCisJLyogU3RhcnQgdGhlIGZpcnN0IHRhc2suICovCisJdlN0YXJ0Rmlyc3RUYXNrKCk7CisKKwkvKiBTaG91bGQgbmV2ZXIgZ2V0IGhlcmUgYXMgdGhlIHRhc2tzIHdpbGwgbm93IGJlIGV4ZWN1dGluZy4gQ2FsbCB0aGUgdGFzaworCSAqIGV4aXQgZXJyb3IgZnVuY3Rpb24gdG8gcHJldmVudCBjb21waWxlciB3YXJuaW5ncyBhYm91dCBhIHN0YXRpYyBmdW5jdGlvbgorCSAqIG5vdCBiZWluZyBjYWxsZWQgaW4gdGhlIGNhc2UgdGhhdCB0aGUgYXBwbGljYXRpb24gd3JpdGVyIG92ZXJyaWRlcyB0aGlzCisJICogZnVuY3Rpb25hbGl0eSBieSBkZWZpbmluZyBjb25maWdUQVNLX1JFVFVSTl9BRERSRVNTLiBDYWxsCisJICogdlRhc2tTd2l0Y2hDb250ZXh0KCkgc28gbGluayB0aW1lIG9wdGltaXphdGlvbiBkb2VzIG5vdCByZW1vdmUgdGhlCisJICogc3ltYm9sLiAqLworCXZUYXNrU3dpdGNoQ29udGV4dCgpOworCXBydlRhc2tFeGl0RXJyb3IoKTsKKworCS8qIFNob3VsZCBub3QgZ2V0IGhlcmUuICovCisJcmV0dXJuIDA7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCB2UG9ydEVuZFNjaGVkdWxlciggdm9pZCApIC8qIFBSSVZJTEVHRURfRlVOQ1RJT04gKi8KK3sKKwkvKiBOb3QgaW1wbGVtZW50ZWQgaW4gcG9ydHMgd2hlcmUgdGhlcmUgaXMgbm90aGluZyB0byByZXR1cm4gdG8uCisJICogQXJ0aWZpY2lhbGx5IGZvcmNlIGFuIGFzc2VydC4gKi8KKwljb25maWdBU1NFUlQoIHVsQ3JpdGljYWxOZXN0aW5nID09IDEwMDBVTCApOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiggY29uZmlnRU5BQkxFX01QVSA9PSAxICkKKwl2b2lkIHZQb3J0U3RvcmVUYXNrTVBVU2V0dGluZ3MoIHhNUFVfU0VUVElOR1MgKnhNUFVTZXR0aW5ncywgY29uc3Qgc3RydWN0IHhNRU1PUllfUkVHSU9OICogY29uc3QgeFJlZ2lvbnMsIFN0YWNrVHlwZV90ICpweEJvdHRvbU9mU3RhY2ssIHVpbnQzMl90IHVsU3RhY2tEZXB0aCApCisJeworCXVpbnQzMl90IHVsUmVnaW9uU3RhcnRBZGRyZXNzLCB1bFJlZ2lvbkVuZEFkZHJlc3MsIHVsUmVnaW9uTnVtYmVyOworCWludDMyX3QgbEluZGV4ID0gMDsKKworCQkvKiBTZXR1cCBNQUlSMC4gKi8KKwkJeE1QVVNldHRpbmdzLT51bE1BSVIwID0gKCAoIHBvcnRNUFVfTk9STUFMX01FTU9SWV9CVUZGRVJBQkxFX0NBQ0hFQUJMRSA8PCBwb3J0TVBVX01BSVJfQVRUUjBfUE9TICkgJiBwb3J0TVBVX01BSVJfQVRUUjBfTUFTSyApOworCQl4TVBVU2V0dGluZ3MtPnVsTUFJUjAgfD0gKCAoIHBvcnRNUFVfREVWSUNFX01FTU9SWV9uR25SRSA8PCBwb3J0TVBVX01BSVJfQVRUUjFfUE9TICkgJiBwb3J0TVBVX01BSVJfQVRUUjFfTUFTSyApOworCisJCS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgdGFzayBpcyBjcmVhdGVkIC0gaW4KKwkJICogd2hpY2ggY2FzZSB0aGUgc3RhY2sgcmVnaW9uIHBhcmFtZXRlcnMgd2lsbCBiZSB2YWxpZC4gIEF0IGFsbCBvdGhlcgorCQkgKiB0aW1lcyB0aGUgc3RhY2sgcGFyYW1ldGVycyB3aWxsIG5vdCBiZSB2YWxpZCBhbmQgaXQgaXMgYXNzdW1lZCB0aGF0CisJCSAqIHRoZSBzdGFjayByZWdpb24gaGFzIGFscmVhZHkgYmVlbiBjb25maWd1cmVkLiAqLworCQlpZiggdWxTdGFja0RlcHRoID4gMCApCisJCXsKKwkJCS8qIERlZmluZSB0aGUgcmVnaW9uIHRoYXQgYWxsb3dzIGFjY2VzcyB0byB0aGUgc3RhY2suICovCisJCQl1bFJlZ2lvblN0YXJ0QWRkcmVzcyA9ICggKCB1aW50MzJfdCApIHB4Qm90dG9tT2ZTdGFjayApICYgcG9ydE1QVV9SQkFSX0FERFJFU1NfTUFTSzsKKwkJCXVsUmVnaW9uRW5kQWRkcmVzcyA9ICggdWludDMyX3QgKSBweEJvdHRvbU9mU3RhY2sgKyAoIHVsU3RhY2tEZXB0aCAqICggdWludDMyX3QgKSBzaXplb2YoIFN0YWNrVHlwZV90ICkgKSAtIDE7CisJCQl1bFJlZ2lvbkVuZEFkZHJlc3MgICY9IHBvcnRNUFVfUkxBUl9BRERSRVNTX01BU0s7CisKKwkJCXhNUFVTZXR0aW5ncy0+eFJlZ2lvbnNTZXR0aW5nc1sgMCBdLnVsUkJBUiA9CSggdWxSZWdpb25TdGFydEFkZHJlc3MgKSB8CisJCQkJCQkJCQkJCQkJCQkoIHBvcnRNUFVfUkVHSU9OX05PTl9TSEFSRUFCTEUgKSB8CisJCQkJCQkJCQkJCQkJCQkoIHBvcnRNUFVfUkVHSU9OX1JFQURfV1JJVEUgKSB8CisJCQkJCQkJCQkJCQkJCQkoIHBvcnRNUFVfUkVHSU9OX0VYRUNVVEVfTkVWRVIgKTsKKworCQkJeE1QVVNldHRpbmdzLT54UmVnaW9uc1NldHRpbmdzWyAwIF0udWxSTEFSID0JKCB1bFJlZ2lvbkVuZEFkZHJlc3MgKSB8CisJCQkJCQkJCQkJCQkJCQkoIHBvcnRNUFVfUkxBUl9BVFRSX0lOREVYMCApIHwKKwkJCQkJCQkJCQkJCQkJCSggcG9ydE1QVV9STEFSX1JFR0lPTl9FTkFCTEUgKTsKKwkJfQorCisJCS8qIFVzZXIgc3VwcGxpZWQgY29uZmlndXJhYmxlIHJlZ2lvbnMuICovCisJCWZvciggdWxSZWdpb25OdW1iZXIgPSAxOyB1bFJlZ2lvbk51bWJlciA8PSBwb3J0TlVNX0NPTkZJR1VSQUJMRV9SRUdJT05TOyB1bFJlZ2lvbk51bWJlcisrICkKKwkJeworCQkJLyogSWYgeFJlZ2lvbnMgaXMgTlVMTCBpLmUuIHRoZSB0YXNrIGhhcyBub3Qgc3BlY2lmaWVkIGFueSBNUFUKKwkJCSAqIHJlZ2lvbiwgdGhlIGVsc2UgcGFydCBlbnN1cmVzIHRoYXQgYWxsIHRoZSBjb25maWd1cmFibGUgTVBVCisJCQkgKiByZWdpb25zIGFyZSBpbnZhbGlkYXRlZC4gKi8KKwkJCWlmKCAoIHhSZWdpb25zICE9IE5VTEwgKSAmJiAoIHhSZWdpb25zWyBsSW5kZXggXS51bExlbmd0aEluQnl0ZXMgPiAwVUwgKSApCisJCQl7CisJCQkJLyogVHJhbnNsYXRlIHRoZSBnZW5lcmljIHJlZ2lvbiBkZWZpbml0aW9uIGNvbnRhaW5lZCBpbiB4UmVnaW9ucworCQkJCSAqIGludG8gdGhlIEFSTXY4IHNwZWNpZmljIE1QVSBzZXR0aW5ncyB0aGF0IGFyZSB0aGVuIHN0b3JlZCBpbgorCQkJCSAqIHhNUFVTZXR0aW5ncy4gKi8KKwkJCQl1bFJlZ2lvblN0YXJ0QWRkcmVzcyA9ICggKCB1aW50MzJfdCApIHhSZWdpb25zWyBsSW5kZXggXS5wdkJhc2VBZGRyZXNzICkgJiBwb3J0TVBVX1JCQVJfQUREUkVTU19NQVNLOworCQkJCXVsUmVnaW9uRW5kQWRkcmVzcyA9ICggdWludDMyX3QgKSB4UmVnaW9uc1sgbEluZGV4IF0ucHZCYXNlQWRkcmVzcyArIHhSZWdpb25zWyBsSW5kZXggXS51bExlbmd0aEluQnl0ZXMgLSAxOworCQkJCXVsUmVnaW9uRW5kQWRkcmVzcyAgJj0gcG9ydE1QVV9STEFSX0FERFJFU1NfTUFTSzsKKworCQkJCS8qIFN0YXJ0IGFkZHJlc3MuICovCisJCQkJeE1QVVNldHRpbmdzLT54UmVnaW9uc1NldHRpbmdzWyB1bFJlZ2lvbk51bWJlciBdLnVsUkJBUiA9CSggdWxSZWdpb25TdGFydEFkZHJlc3MgKSB8CisJCQkJCQkJCQkJCQkJCQkJCQkJKCBwb3J0TVBVX1JFR0lPTl9OT05fU0hBUkVBQkxFICk7CisKKwkJCQkvKiBSTy9SVy4gKi8KKwkJCQlpZiggKCB4UmVnaW9uc1sgbEluZGV4IF0udWxQYXJhbWV0ZXJzICYgdHNrTVBVX1JFR0lPTl9SRUFEX09OTFkgKSAhPSAwICkKKwkJCQl7CisJCQkJCXhNUFVTZXR0aW5ncy0+eFJlZ2lvbnNTZXR0aW5nc1sgdWxSZWdpb25OdW1iZXIgXS51bFJCQVIgfD0gKCBwb3J0TVBVX1JFR0lPTl9SRUFEX09OTFkgKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJeE1QVVNldHRpbmdzLT54UmVnaW9uc1NldHRpbmdzWyB1bFJlZ2lvbk51bWJlciBdLnVsUkJBUiB8PSAoIHBvcnRNUFVfUkVHSU9OX1JFQURfV1JJVEUgKTsKKwkJCQl9CisKKwkJCQkvKiBYTi4gKi8KKwkJCQlpZiggKCB4UmVnaW9uc1sgbEluZGV4IF0udWxQYXJhbWV0ZXJzICYgdHNrTVBVX1JFR0lPTl9FWEVDVVRFX05FVkVSICkgIT0gMCApCisJCQkJeworCQkJCQl4TVBVU2V0dGluZ3MtPnhSZWdpb25zU2V0dGluZ3NbIHVsUmVnaW9uTnVtYmVyIF0udWxSQkFSIHw9ICggcG9ydE1QVV9SRUdJT05fRVhFQ1VURV9ORVZFUiApOworCQkJCX0KKworCQkJCS8qIEVuZCBBZGRyZXNzLiAqLworCQkJCXhNUFVTZXR0aW5ncy0+eFJlZ2lvbnNTZXR0aW5nc1sgdWxSZWdpb25OdW1iZXIgXS51bFJMQVIgPQkoIHVsUmVnaW9uRW5kQWRkcmVzcyApIHwKKwkJCQkJCQkJCQkJCQkJCQkJCQkoIHBvcnRNUFVfUkxBUl9SRUdJT05fRU5BQkxFICk7CisKKwkJCQkvKiBOb3JtYWwgbWVtb3J5LyBEZXZpY2UgbWVtb3J5LiAqLworCQkJCWlmKCAoIHhSZWdpb25zWyBsSW5kZXggXS51bFBhcmFtZXRlcnMgJiB0c2tNUFVfUkVHSU9OX0RFVklDRV9NRU1PUlkgKSAhPSAwICkKKwkJCQl7CisJCQkJCS8qIEF0dHIxIGluIE1BSVIwIGlzIGNvbmZpZ3VyZWQgYXMgZGV2aWNlIG1lbW9yeS4gKi8KKwkJCQkJeE1QVVNldHRpbmdzLT54UmVnaW9uc1NldHRpbmdzWyB1bFJlZ2lvbk51bWJlciBdLnVsUkxBUiB8PSBwb3J0TVBVX1JMQVJfQVRUUl9JTkRFWDE7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCS8qIEF0dHIxIGluIE1BSVIwIGlzIGNvbmZpZ3VyZWQgYXMgbm9ybWFsIG1lbW9yeS4gKi8KKwkJCQkJeE1QVVNldHRpbmdzLT54UmVnaW9uc1NldHRpbmdzWyB1bFJlZ2lvbk51bWJlciBdLnVsUkxBUiB8PSBwb3J0TVBVX1JMQVJfQVRUUl9JTkRFWDA7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8qIEludmFsaWRhdGUgdGhlIHJlZ2lvbi4gKi8KKwkJCQl4TVBVU2V0dGluZ3MtPnhSZWdpb25zU2V0dGluZ3NbIHVsUmVnaW9uTnVtYmVyIF0udWxSQkFSID0gMFVMOworCQkJCXhNUFVTZXR0aW5ncy0+eFJlZ2lvbnNTZXR0aW5nc1sgdWxSZWdpb25OdW1iZXIgXS51bFJMQVIgPSAwVUw7CisJCQl9CisKKwkJCWxJbmRleCsrOworCQl9CisJfQorI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9NUFUgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpkaWZmIC0tZ2l0IGEvU291cmNlL3BvcnRhYmxlL0lBUi9BUk1fQ00zM19OVFovbm9uX3NlY3VyZS9wb3J0YXNtLmggYi9Tb3VyY2UvcG9ydGFibGUvSUFSL0FSTV9DTTMzX05UWi9ub25fc2VjdXJlL3BvcnRhc20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWNmMDRlCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL3BvcnRhYmxlL0lBUi9BUk1fQ00zM19OVFovbm9uX3NlY3VyZS9wb3J0YXNtLmgKQEAgLTAsMCArMSwxMTMgQEAKKy8qCisgKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjIuMQorICogQ29weXJpZ2h0IChDKSAyMDE5IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKKyAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCisgKiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCisgKiB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZgorICogdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLAorICogc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCisgKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUworICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SCisgKiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIKKyAqIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIGh0dHA6Ly93d3cuRnJlZVJUT1Mub3JnCisgKiBodHRwOi8vYXdzLmFtYXpvbi5jb20vZnJlZXJ0b3MKKyAqCisgKiAxIHRhYiA9PSA0IHNwYWNlcyEKKyAqLworCisjaWZuZGVmIF9fUE9SVF9BU01fSF9fCisjZGVmaW5lIF9fUE9SVF9BU01fSF9fCisKKy8qIFNjaGVkdWxlciBpbmNsdWRlcy4gKi8KKyNpbmNsdWRlICJGcmVlUlRPUy5oIgorCisvKiBNUFUgd3JhcHBlcnMgaW5jbHVkZXMuICovCisjaW5jbHVkZSAibXB1X3dyYXBwZXJzLmgiCisKKy8qKgorICogQGJyaWVmIFJlc3RvcmUgdGhlIGNvbnRleHQgb2YgdGhlIGZpcnN0IHRhc2sgc28gdGhhdCB0aGUgZmlyc3QgdGFzayBzdGFydHMKKyAqIGV4ZWN1dGluZy4KKyAqLwordm9pZCB2UmVzdG9yZUNvbnRleHRPZkZpcnN0VGFzayggdm9pZCApIF9fYXR0cmlidXRlX18gKCggbmFrZWQgKSkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworLyoqCisgKiBAYnJpZWYgQ2hlY2tzIHdoZXRoZXIgb3Igbm90IHRoZSBwcm9jZXNzb3IgaXMgcHJpdmlsZWdlZC4KKyAqCisgKiBAcmV0dXJuIDEgaWYgdGhlIHByb2Nlc3NvciBpcyBhbHJlYWR5IHByaXZpbGVnZWQsIDAgb3RoZXJ3aXNlLgorICovCitCYXNlVHlwZV90IHhJc1ByaXZpbGVnZWQoIHZvaWQgKSBfX2F0dHJpYnV0ZV9fICgoIG5ha2VkICkpOworCisvKioKKyAqIEBicmllZiBSYWlzZXMgdGhlIHByaXZpbGVnZSBsZXZlbCBieSBjbGVhcmluZyB0aGUgYml0IDAgb2YgdGhlIENPTlRST0wKKyAqIHJlZ2lzdGVyLgorICoKKyAqIEBub3RlIFRoaXMgaXMgYSBwcml2aWxlZ2VkIGZ1bmN0aW9uIGFuZCBzaG91bGQgb25seSBiZSBjYWxsZWQgZnJvbSB0aGUga2VucmVsCisgKiBjb2RlLgorICoKKyAqIEJpdCAwIG9mIHRoZSBDT05UUk9MIHJlZ2lzdGVyIGRlZmluZXMgdGhlIHByaXZpbGVnZSBsZXZlbCBvZiBUaHJlYWQgTW9kZS4KKyAqICBCaXRbMF0gPSAwIC0tPiBUaGUgcHJvY2Vzc29yIGlzIHJ1bm5pbmcgcHJpdmlsZWdlZAorICogIEJpdFswXSA9IDEgLS0+IFRoZSBwcm9jZXNzb3IgaXMgcnVubmluZyB1bnByaXZpbGVnZWQuCisgKi8KK3ZvaWQgdlJhaXNlUHJpdmlsZWdlKCB2b2lkICkgX19hdHRyaWJ1dGVfXyAoKCBuYWtlZCApKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisvKioKKyAqIEBicmllZiBMb3dlcnMgdGhlIHByaXZpbGVnZSBsZXZlbCBieSBzZXR0aW5nIHRoZSBiaXQgMCBvZiB0aGUgQ09OVFJPTAorICogcmVnaXN0ZXIuCisgKgorICogQml0IDAgb2YgdGhlIENPTlRST0wgcmVnaXN0ZXIgZGVmaW5lcyB0aGUgcHJpdmlsZWdlIGxldmVsIG9mIFRocmVhZCBNb2RlLgorICogIEJpdFswXSA9IDAgLS0+IFRoZSBwcm9jZXNzb3IgaXMgcnVubmluZyBwcml2aWxlZ2VkCisgKiAgQml0WzBdID0gMSAtLT4gVGhlIHByb2Nlc3NvciBpcyBydW5uaW5nIHVucHJpdmlsZWdlZC4KKyAqLwordm9pZCB2UmVzZXRQcml2aWxlZ2UoIHZvaWQgKSBfX2F0dHJpYnV0ZV9fICgoIG5ha2VkICkpOworCisvKioKKyAqIEBicmllZiBTdGFydHMgdGhlIGZpcnN0IHRhc2suCisgKi8KK3ZvaWQgdlN0YXJ0Rmlyc3RUYXNrKCB2b2lkICkgX19hdHRyaWJ1dGVfXyAoKCBuYWtlZCApKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisvKioKKyAqIEBicmllZiBEaXNhYmxlcyBpbnRlcnJ1cHRzLgorICovCit1aW50MzJfdCB1bFNldEludGVycnVwdE1hc2tGcm9tSVNSKCB2b2lkICkgX19hdHRyaWJ1dGVfXygoIG5ha2VkICkpIFBSSVZJTEVHRURfRlVOQ1RJT047CisKKy8qKgorICogQGJyaWVmIEVuYWJsZXMgaW50ZXJydXB0cy4KKyAqLwordm9pZCB2Q2xlYXJJbnRlcnJ1cHRNYXNrRnJvbUlTUiggdWludDMyX3QgdWxNYXNrICkgX19hdHRyaWJ1dGVfXygoIG5ha2VkICkpIFBSSVZJTEVHRURfRlVOQ1RJT047CisKKy8qKgorICogQGJyaWVmIFBlbmRTViBFeGNlcHRpb24gaGFuZGxlci4KKyAqLwordm9pZCBQZW5kU1ZfSGFuZGxlciggdm9pZCApIF9fYXR0cmlidXRlX18gKCggbmFrZWQgKSkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworLyoqCisgKiBAYnJpZWYgU1ZDIEhhbmRsZXIuCisgKi8KK3ZvaWQgU1ZDX0hhbmRsZXIoIHZvaWQgKSBfX2F0dHJpYnV0ZV9fICgoIG5ha2VkICkpIFBSSVZJTEVHRURfRlVOQ1RJT047CisKKy8qKgorICogQGJyaWVmIEFsbG9jYXRlIGEgU2VjdXJlIGNvbnRleHQgZm9yIHRoZSBjYWxsaW5nIHRhc2suCisgKgorICogQHBhcmFtW2luXSB1bFNlY3VyZVN0YWNrU2l6ZSBUaGUgc2l6ZSBvZiB0aGUgc3RhY2sgdG8gYmUgYWxsb2NhdGVkIG9uIHRoZQorICogc2VjdXJlIHNpZGUgZm9yIHRoZSBjYWxsaW5nIHRhc2suCisgKi8KK3ZvaWQgdlBvcnRBbGxvY2F0ZVNlY3VyZUNvbnRleHQoIHVpbnQzMl90IHVsU2VjdXJlU3RhY2tTaXplICkgX19hdHRyaWJ1dGVfXyAoKCBuYWtlZCApKTsKKworLyoqCisgKiBAYnJpZWYgRnJlZSB0aGUgdGFzaydzIHNlY3VyZSBjb250ZXh0LgorICoKKyAqIEBwYXJhbVtpbl0gcHVsVENCIFBvaW50ZXIgdG8gdGhlIFRhc2sgQ29udHJvbCBCbG9jayAoVENCKSBvZiB0aGUgdGFzay4KKyAqLwordm9pZCB2UG9ydEZyZWVTZWN1cmVDb250ZXh0KCB1aW50MzJfdCAqcHVsVENCICkgX19hdHRyaWJ1dGVfXyAoKCBuYWtlZCApKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCisjZW5kaWYgLyogX19QT1JUX0FTTV9IX18gKi8KZGlmZiAtLWdpdCBhL1NvdXJjZS9wb3J0YWJsZS9JQVIvQVJNX0NNMzNfTlRaL25vbl9zZWN1cmUvcG9ydGFzbS5zIGIvU291cmNlL3BvcnRhYmxlL0lBUi9BUk1fQ00zM19OVFovbm9uX3NlY3VyZS9wb3J0YXNtLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDAwNzU1YgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9wb3J0YWJsZS9JQVIvQVJNX0NNMzNfTlRaL25vbl9zZWN1cmUvcG9ydGFzbS5zCkBAIC0wLDAgKzEsMjQyIEBACisvKgorICogRnJlZVJUT1MgS2VybmVsIFYxMC4yLjEKKyAqIENvcHlyaWdodCAoQykgMjAxOSBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCisgKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgorICogdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bworICogdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YKKyAqIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKKyAqIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAorICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MKKyAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUgorICogQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSCisgKiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBodHRwOi8vd3d3LkZyZWVSVE9TLm9yZworICogaHR0cDovL2F3cy5hbWF6b24uY29tL2ZyZWVydG9zCisgKgorICogMSB0YWIgPT0gNCBzcGFjZXMhCisgKi8KKworCUVYVEVSTiBweEN1cnJlbnRUQ0IKKwlFWFRFUk4gdlRhc2tTd2l0Y2hDb250ZXh0CisJRVhURVJOIHZQb3J0U1ZDSGFuZGxlcl9DCisKKwlQVUJMSUMgeElzUHJpdmlsZWdlZAorCVBVQkxJQyB2UmVzZXRQcml2aWxlZ2UKKwlQVUJMSUMgdlJlc3RvcmVDb250ZXh0T2ZGaXJzdFRhc2sKKwlQVUJMSUMgdlJhaXNlUHJpdmlsZWdlCisJUFVCTElDIHZTdGFydEZpcnN0VGFzaworCVBVQkxJQyB1bFNldEludGVycnVwdE1hc2tGcm9tSVNSCisJUFVCTElDIHZDbGVhckludGVycnVwdE1hc2tGcm9tSVNSCisJUFVCTElDIFBlbmRTVl9IYW5kbGVyCisJUFVCTElDIFNWQ19IYW5kbGVyCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tIFVucHJpdmlsZWdlZCBGdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisJU0VDVElPTiAudGV4dDpDT0RFOk5PUk9PVCgyKQorCVRIVU1CCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworeElzUHJpdmlsZWdlZDoKKwltcnMgcjAsIGNvbnRyb2wJCQkJCQkJLyogcjAgPSBDT05UUk9MLiAqLworCXRzdCByMCwgIzEJCQkJCQkJCS8qIFBlcmZvcm0gcjAgJiAxIChiaXR3aXNlIEFORCkgYW5kIHVwZGF0ZSB0aGUgY29uZGl0aW9ucyBmbGFnLiAqLworCWl0ZSBuZQorCW1vdm5lIHIwLCAjMAkJCQkJCQkvKiBDT05UUk9MWzBdIT0wLiBSZXR1cm4gZmFsc2UgdG8gaW5kaWNhdGUgdGhhdCB0aGUgcHJvY2Vzc29yIGlzIG5vdCBwcml2aWxlZ2VkLiAqLworCW1vdmVxIHIwLCAjMQkJCQkJCQkvKiBDT05UUk9MWzBdPT0wLiBSZXR1cm4gdHJ1ZSB0byBpbmRpY2F0ZSB0aGF0IHRoZSBwcm9jZXNzb3IgaXMgbm90IHByaXZpbGVnZWQuICovCisJYnggbHIJCQkJCQkJCQkvKiBSZXR1cm4uICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordlJlc2V0UHJpdmlsZWdlOgorCW1ycyByMCwgY29udHJvbAkJCQkJCQkvKiByMCA9IENPTlRST0wuICovCisJb3JyIHIwLCByMCwgIzEJCQkJCQkJLyogcjAgPSByMCB8IDEuICovCisJbXNyIGNvbnRyb2wsIHIwCQkJCQkJCS8qIENPTlRST0wgPSByMC4gKi8KKwlieCBscgkJCQkJCQkJCS8qIFJldHVybiB0byB0aGUgY2FsbGVyLiAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0gUHJpdmlsZWdlZCBGdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCVNFQ1RJT04gcHJpdmlsZWdlZF9mdW5jdGlvbnM6Q09ERTpOT1JPT1QoMikKKwlUSFVNQgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZSZXN0b3JlQ29udGV4dE9mRmlyc3RUYXNrOgorCWxkciAgcjIsID1weEN1cnJlbnRUQ0IJCQkJCS8qIFJlYWQgdGhlIGxvY2F0aW9uIG9mIHB4Q3VycmVudFRDQiBpLmUuICYoIHB4Q3VycmVudFRDQiApLiAqLworCWxkciAgcjEsIFtyMl0JCQkJCQkJLyogUmVhZCBweEN1cnJlbnRUQ0IuICovCisJbGRyICByMCwgW3IxXQkJCQkJCQkvKiBSZWFkIHRvcCBvZiBzdGFjayBmcm9tIFRDQiAtIFRoZSBmaXJzdCBpdGVtIGluIHB4Q3VycmVudFRDQiBpcyB0aGUgdGFzayB0b3Agb2Ygc3RhY2suICovCisKKyNpZiAoIGNvbmZpZ0VOQUJMRV9NUFUgPT0gMSApCisJZG1iCQkJCQkJCQkJCS8qIENvbXBsZXRlIG91dHN0YW5kaW5nIHRyYW5zZmVycyBiZWZvcmUgZGlzYWJsaW5nIE1QVS4gKi8KKwlsZHIgcjIsID0weGUwMDBlZDk0CQkJCQkJLyogcjIgPSAweGUwMDBlZDk0IFtMb2NhdGlvbiBvZiBNUFVfQ1RSTF0uICovCisJbGRyIHI0LCBbcjJdCQkJCQkJCS8qIFJlYWQgdGhlIHZhbHVlIG9mIE1QVV9DVFJMLiAqLworCWJpYyByNCwgcjQsICMxCQkJCQkJCS8qIHI0ID0gcjQgJiB+MSBpLmUuIENsZWFyIHRoZSBiaXQgMCBpbiByNC4gKi8KKwlzdHIgcjQsIFtyMl0JCQkJCQkJLyogRGlzYWJsZSBNUFUuICovCisKKwlhZGRzIHIxLCAjNAkJCQkJCQkJLyogcjEgPSByMSArIDQuIHIxIG5vdyBwb2ludHMgdG8gTUFJUjAgaW4gVENCLiAqLworCWxkciByMywgW3IxXQkJCQkJCQkvKiByMyA9ICpyMSBpLmUuIHIzID0gTUFJUjAuICovCisJbGRyIHIyLCA9MHhlMDAwZWRjMAkJCQkJCS8qIHIyID0gMHhlMDAwZWRjMCBbTG9jYXRpb24gb2YgTUFJUjBdLiAqLworCXN0ciByMywgW3IyXQkJCQkJCQkvKiBQcm9ncmFtIE1BSVIwLiAqLworCWxkciByMiwgPTB4ZTAwMGVkOTgJCQkJCQkvKiByMiA9IDB4ZTAwMGVkOTggW0xvY2F0aW9uIG9mIFJOUl0uICovCisJbW92cyByMywgIzQJCQkJCQkJCS8qIHIzID0gNC4gKi8KKwlzdHIgcjMsIFtyMl0JCQkJCQkJLyogUHJvZ3JhbSBSTlIgPSA0LiAqLworCWFkZHMgcjEsICM0CQkJCQkJCQkvKiByMSA9IHIxICsgNC4gcjEgbm93IHBvaW50cyB0byBmaXJzdCBSQkFSIGluIFRDQi4gKi8KKwlsZHIgcjIsID0weGUwMDBlZDljCQkJCQkJLyogcjIgPSAweGUwMDBlZDljIFtMb2NhdGlvbiBvZiBSQkFSXS4gKi8KKwlsZG1pYSByMSEsIHtyNC1yMTF9CQkJCQkJLyogUmVhZCA0IHNldHMgb2YgUkJBUi9STEFSIHJlZ2lzdGVycyBmcm9tIFRDQi4gKi8KKwlzdG1pYSByMiEsIHtyNC1yMTF9CQkJCQkJLyogV3JpdGUgNCBzZXQgb2YgUkJBUi9STEFSIHJlZ2lzdGVycyB1c2luZyBhbGlhcyByZWdpc3RlcnMuICovCisKKwlsZHIgcjIsID0weGUwMDBlZDk0CQkJCQkJLyogcjIgPSAweGUwMDBlZDk0IFtMb2NhdGlvbiBvZiBNUFVfQ1RSTF0uICovCisJbGRyIHI0LCBbcjJdCQkJCQkJCS8qIFJlYWQgdGhlIHZhbHVlIG9mIE1QVV9DVFJMLiAqLworCW9yciByNCwgcjQsICMxCQkJCQkJCS8qIHI0ID0gcjQgfCAxIGkuZS4gU2V0IHRoZSBiaXQgMCBpbiByNC4gKi8KKwlzdHIgcjQsIFtyMl0JCQkJCQkJLyogRW5hYmxlIE1QVS4gKi8KKwlkc2IJCQkJCQkJCQkJLyogRm9yY2UgbWVtb3J5IHdyaXRlcyBiZWZvcmUgY29udGludWluZy4gKi8KKyNlbmRpZiAvKiBjb25maWdFTkFCTEVfTVBVICovCisKKyNpZiAoIGNvbmZpZ0VOQUJMRV9NUFUgPT0gMSApCisJbGRtICByMCEsIHtyMS1yM30JCQkJCQkvKiBSZWFkIGZyb20gc3RhY2sgLSByMSA9IFBTUExJTSwgcjIgPSBDT05UUk9MIGFuZCByMyA9IEVYQ19SRVRVUk4uICovCisJbXNyICBwc3BsaW0sIHIxCQkJCQkJCS8qIFNldCB0aGlzIHRhc2sncyBQU1BMSU0gdmFsdWUuICovCisJbXNyICBjb250cm9sLCByMgkJCQkJCS8qIFNldCB0aGlzIHRhc2sncyBDT05UUk9MIHZhbHVlLiAqLworCWFkZHMgcjAsICMzMgkJCQkJCQkvKiBEaXNjYXJkIGV2ZXJ5dGhpbmcgdXAgdG8gcjAuICovCisJbXNyICBwc3AsIHIwCQkJCQkJCS8qIFRoaXMgaXMgbm93IHRoZSBuZXcgdG9wIG9mIHN0YWNrIHRvIHVzZSBpbiB0aGUgdGFzay4gKi8KKwlpc2IKKwlieCAgIHIzCQkJCQkJCQkJLyogRmluYWxseSwgYnJhbmNoIHRvIEVYQ19SRVRVUk4uICovCisjZWxzZSAvKiBjb25maWdFTkFCTEVfTVBVICovCisJbGRtICByMCEsIHtyMS1yMn0JCQkJCQkvKiBSZWFkIGZyb20gc3RhY2sgLSByMSA9IFBTUExJTSBhbmQgcjIgPSBFWENfUkVUVVJOLiAqLworCW1zciAgcHNwbGltLCByMQkJCQkJCQkvKiBTZXQgdGhpcyB0YXNrJ3MgUFNQTElNIHZhbHVlLiAqLworCW1vdnMgcjEsICMyCQkJCQkJCQkvKiByMSA9IDIuICovCisJbXNyICBDT05UUk9MLCByMQkJCQkJCS8qIFN3aXRjaCB0byB1c2UgUFNQIGluIHRoZSB0aHJlYWQgbW9kZS4gKi8KKwlhZGRzIHIwLCAjMzIJCQkJCQkJLyogRGlzY2FyZCBldmVyeXRoaW5nIHVwIHRvIHIwLiAqLworCW1zciAgcHNwLCByMAkJCQkJCQkvKiBUaGlzIGlzIG5vdyB0aGUgbmV3IHRvcCBvZiBzdGFjayB0byB1c2UgaW4gdGhlIHRhc2suICovCisJaXNiCisJYnggICByMgkJCQkJCQkJCS8qIEZpbmFsbHksIGJyYW5jaCB0byBFWENfUkVUVVJOLiAqLworI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9NUFUgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2UmFpc2VQcml2aWxlZ2U6CisJbXJzICByMCwgY29udHJvbAkJCQkJCS8qIFJlYWQgdGhlIENPTlRST0wgcmVnaXN0ZXIuICovCisJYmljIHIwLCByMCwgIzEJCQkJCQkJLyogQ2xlYXIgdGhlIGJpdCAwLiAqLworCW1zciAgY29udHJvbCwgcjAJCQkJCQkvKiBXcml0ZSBiYWNrIHRoZSBuZXcgQ09OVFJPTCB2YWx1ZS4gKi8KKwlieCBscgkJCQkJCQkJCS8qIFJldHVybiB0byB0aGUgY2FsbGVyLiAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZTdGFydEZpcnN0VGFzazoKKwlsZHIgcjAsID0weGUwMDBlZDA4CQkJCQkJLyogVXNlIHRoZSBOVklDIG9mZnNldCByZWdpc3RlciB0byBsb2NhdGUgdGhlIHN0YWNrLiAqLworCWxkciByMCwgW3IwXQkJCQkJCQkvKiBSZWFkIHRoZSBWVE9SIHJlZ2lzdGVyIHdoaWNoIGdpdmVzIHRoZSBhZGRyZXNzIG9mIHZlY3RvciB0YWJsZS4gKi8KKwlsZHIgcjAsIFtyMF0JCQkJCQkJLyogVGhlIGZpcnN0IGVudHJ5IGluIHZlY3RvciB0YWJsZSBpcyBzdGFjayBwb2ludGVyLiAqLworCW1zciBtc3AsIHIwCQkJCQkJCQkvKiBTZXQgdGhlIE1TUCBiYWNrIHRvIHRoZSBzdGFydCBvZiB0aGUgc3RhY2suICovCisJY3BzaWUgaQkJCQkJCQkJCS8qIEdsb2JhbGx5IGVuYWJsZSBpbnRlcnJ1cHRzLiAqLworCWNwc2llIGYKKwlkc2IKKwlpc2IKKwlzdmMgMgkJCQkJCQkJCS8qIFN5c3RlbSBjYWxsIHRvIHN0YXJ0IHRoZSBmaXJzdCB0YXNrLiBwb3J0U1ZDX1NUQVJUX1NDSEVEVUxFUiA9IDIuICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordWxTZXRJbnRlcnJ1cHRNYXNrRnJvbUlTUjoKKwltcnMgcjAsIFBSSU1BU0sKKwljcHNpZCBpCisJYnggbHIKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2Q2xlYXJJbnRlcnJ1cHRNYXNrRnJvbUlTUjoKKwltc3IgUFJJTUFTSywgcjAKKwlieCBscgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK1BlbmRTVl9IYW5kbGVyOgorCW1ycyByMCwgcHNwCQkJCQkJCQkvKiBSZWFkIFBTUCBpbiByMC4gKi8KKyNpZiAoIGNvbmZpZ0VOQUJMRV9GUFUgPT0gMSApCisJdHN0IGxyLCAjMHgxMAkJCQkJCQkvKiBUZXN0IEJpdFs0XSBpbiBMUi4gQml0WzRdIG9mIEVYQ19SRVRVUk4gaXMgMCBpZiB0aGUgRlBVIGlzIGluIHVzZS4gKi8KKwlpdCBlcQorCXZzdG1kYmVxIHIwISwge3MxNi1zMzF9CQkJCQkvKiBTdG9yZSB0aGUgRlBVIHJlZ2lzdGVycyB3aGljaCBhcmUgbm90IHNhdmVkIGF1dG9tYXRpY2FsbHkuICovCisjZW5kaWYgLyogY29uZmlnRU5BQkxFX0ZQVSAqLworI2lmICggY29uZmlnRU5BQkxFX01QVSA9PSAxICkKKwltcnMgcjEsIHBzcGxpbQkJCQkJCQkvKiByMSA9IFBTUExJTS4gKi8KKwltcnMgcjIsIGNvbnRyb2wJCQkJCQkJLyogcjIgPSBDT05UUk9MLiAqLworCW1vdiByMywgbHIJCQkJCQkJCS8qIHIzID0gTFIvRVhDX1JFVFVSTi4gKi8KKwlzdG1kYiByMCEsIHtyMS1yMTF9CQkJCQkJLyogU3RvcmUgb24gdGhlIHN0YWNrIC0gUFNQTElNLCBDT05UUk9MLCBMUiBhbmQgcmVnaXN0ZXJzIHRoYXQgYXJlIG5vdCBhdXRvbWF0aWNhbGx5IHNhdmVkLiAqLworI2Vsc2UgLyogY29uZmlnRU5BQkxFX01QVSAqLworCW1ycyByMiwgcHNwbGltCQkJCQkJCS8qIHIyID0gUFNQTElNLiAqLworCW1vdiByMywgbHIJCQkJCQkJCS8qIHIzID0gTFIvRVhDX1JFVFVSTi4gKi8KKwlzdG1kYiByMCEsIHtyMi1yMTF9CQkJCQkJLyogU3RvcmUgb24gdGhlIHN0YWNrIC0gUFNQTElNLCBMUiBhbmQgcmVnaXN0ZXJzIHRoYXQgYXJlIG5vdCBhdXRvbWF0aWNhbGx5LiAqLworI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9NUFUgKi8KKworCWxkciByMiwgPXB4Q3VycmVudFRDQgkJCQkJLyogUmVhZCB0aGUgbG9jYXRpb24gb2YgcHhDdXJyZW50VENCIGkuZS4gJiggcHhDdXJyZW50VENCICkuICovCisJbGRyIHIxLCBbcjJdCQkJCQkJCS8qIFJlYWQgcHhDdXJyZW50VENCLiAqLworCXN0ciByMCwgW3IxXQkJCQkJCQkvKiBTYXZlIHRoZSBuZXcgdG9wIG9mIHN0YWNrIGluIFRDQi4gKi8KKworCWNwc2lkIGkKKwlibCB2VGFza1N3aXRjaENvbnRleHQKKwljcHNpZSBpCisKKwlsZHIgcjIsID1weEN1cnJlbnRUQ0IJCQkJCS8qIFJlYWQgdGhlIGxvY2F0aW9uIG9mIHB4Q3VycmVudFRDQiBpLmUuICYoIHB4Q3VycmVudFRDQiApLiAqLworCWxkciByMSwgW3IyXQkJCQkJCQkvKiBSZWFkIHB4Q3VycmVudFRDQi4gKi8KKwlsZHIgcjAsIFtyMV0JCQkJCQkJLyogVGhlIGZpcnN0IGl0ZW0gaW4gcHhDdXJyZW50VENCIGlzIHRoZSB0YXNrIHRvcCBvZiBzdGFjay4gcjAgbm93IHBvaW50cyB0byB0aGUgdG9wIG9mIHN0YWNrLiAqLworCisjaWYgKCBjb25maWdFTkFCTEVfTVBVID09IDEgKQorCWRtYgkJCQkJCQkJCQkvKiBDb21wbGV0ZSBvdXRzdGFuZGluZyB0cmFuc2ZlcnMgYmVmb3JlIGRpc2FibGluZyBNUFUuICovCisJbGRyIHIyLCA9MHhlMDAwZWQ5NAkJCQkJCS8qIHIyID0gMHhlMDAwZWQ5NCBbTG9jYXRpb24gb2YgTVBVX0NUUkxdLiAqLworCWxkciByNCwgW3IyXQkJCQkJCQkvKiBSZWFkIHRoZSB2YWx1ZSBvZiBNUFVfQ1RSTC4gKi8KKwliaWMgcjQsIHI0LCAjMQkJCQkJCQkvKiByNCA9IHI0ICYgfjEgaS5lLiBDbGVhciB0aGUgYml0IDAgaW4gcjQuICovCisJc3RyIHI0LCBbcjJdCQkJCQkJCS8qIERpc2FibGUgTVBVLiAqLworCisJYWRkcyByMSwgIzQJCQkJCQkJCS8qIHIxID0gcjEgKyA0LiByMSBub3cgcG9pbnRzIHRvIE1BSVIwIGluIFRDQi4gKi8KKwlsZHIgcjMsIFtyMV0JCQkJCQkJLyogcjMgPSAqcjEgaS5lLiByMyA9IE1BSVIwLiAqLworCWxkciByMiwgPTB4ZTAwMGVkYzAJCQkJCQkvKiByMiA9IDB4ZTAwMGVkYzAgW0xvY2F0aW9uIG9mIE1BSVIwXS4gKi8KKwlzdHIgcjMsIFtyMl0JCQkJCQkJLyogUHJvZ3JhbSBNQUlSMC4gKi8KKwlsZHIgcjIsID0weGUwMDBlZDk4CQkJCQkJLyogcjIgPSAweGUwMDBlZDk4IFtMb2NhdGlvbiBvZiBSTlJdLiAqLworCW1vdnMgcjMsICM0CQkJCQkJCQkvKiByMyA9IDQuICovCisJc3RyIHIzLCBbcjJdCQkJCQkJCS8qIFByb2dyYW0gUk5SID0gNC4gKi8KKwlhZGRzIHIxLCAjNAkJCQkJCQkJLyogcjEgPSByMSArIDQuIHIxIG5vdyBwb2ludHMgdG8gZmlyc3QgUkJBUiBpbiBUQ0IuICovCisJbGRyIHIyLCA9MHhlMDAwZWQ5YwkJCQkJCS8qIHIyID0gMHhlMDAwZWQ5YyBbTG9jYXRpb24gb2YgUkJBUl0uICovCisJbGRtaWEgcjEhLCB7cjQtcjExfQkJCQkJCS8qIFJlYWQgNCBzZXRzIG9mIFJCQVIvUkxBUiByZWdpc3RlcnMgZnJvbSBUQ0IuICovCisJc3RtaWEgcjIhLCB7cjQtcjExfQkJCQkJCS8qIFdyaXRlIDQgc2V0IG9mIFJCQVIvUkxBUiByZWdpc3RlcnMgdXNpbmcgYWxpYXMgcmVnaXN0ZXJzLiAqLworCisJbGRyIHIyLCA9MHhlMDAwZWQ5NAkJCQkJCS8qIHIyID0gMHhlMDAwZWQ5NCBbTG9jYXRpb24gb2YgTVBVX0NUUkxdLiAqLworCWxkciByNCwgW3IyXQkJCQkJCQkvKiBSZWFkIHRoZSB2YWx1ZSBvZiBNUFVfQ1RSTC4gKi8KKwlvcnIgcjQsIHI0LCAjMQkJCQkJCQkvKiByNCA9IHI0IHwgMSBpLmUuIFNldCB0aGUgYml0IDAgaW4gcjQuICovCisJc3RyIHI0LCBbcjJdCQkJCQkJCS8qIEVuYWJsZSBNUFUuICovCisJZHNiCQkJCQkJCQkJCS8qIEZvcmNlIG1lbW9yeSB3cml0ZXMgYmVmb3JlIGNvbnRpbnVpbmcuICovCisjZW5kaWYgLyogY29uZmlnRU5BQkxFX01QVSAqLworCisjaWYgKCBjb25maWdFTkFCTEVfTVBVID09IDEgKQorCWxkbWlhIHIwISwge3IxLXIxMX0JCQkJCQkvKiBSZWFkIGZyb20gc3RhY2sgLSByMSA9IFBTUExJTSwgcjIgPSBDT05UUk9MLCByMyA9IExSIGFuZCByNC1yMTEgcmVzdG9yZWQuICovCisjZWxzZSAvKiBjb25maWdFTkFCTEVfTVBVICovCisJbGRtaWEgcjAhLCB7cjItcjExfQkJCQkJCS8qIFJlYWQgZnJvbSBzdGFjayAtIHIyID0gUFNQTElNLCByMyA9IExSIGFuZCByNC1yMTEgcmVzdG9yZWQuICovCisjZW5kaWYgLyogY29uZmlnRU5BQkxFX01QVSAqLworCisjaWYgKCBjb25maWdFTkFCTEVfRlBVID09IDEgKQorCXRzdCByMywgIzB4MTAJCQkJCQkJLyogVGVzdCBCaXRbNF0gaW4gTFIuIEJpdFs0XSBvZiBFWENfUkVUVVJOIGlzIDAgaWYgdGhlIEZQVSBpcyBpbiB1c2UuICovCisJaXQgZXEKKwl2bGRtaWFlcSByMCEsIHtzMTYtczMxfQkJCQkJLyogUmVzdG9yZSB0aGUgRlBVIHJlZ2lzdGVycyB3aGljaCBhcmUgbm90IHJlc3RvcmVkIGF1dG9tYXRpY2FsbHkuICovCisjZW5kaWYgLyogY29uZmlnRU5BQkxFX0ZQVSAqLworCisgI2lmICggY29uZmlnRU5BQkxFX01QVSA9PSAxICkKKwltc3IgcHNwbGltLCByMQkJCQkJCQkvKiBSZXN0b3JlIHRoZSBQU1BMSU0gcmVnaXN0ZXIgdmFsdWUgZm9yIHRoZSB0YXNrLiAqLworCW1zciBjb250cm9sLCByMgkJCQkJCQkvKiBSZXN0b3JlIHRoZSBDT05UUk9MIHJlZ2lzdGVyIHZhbHVlIGZvciB0aGUgdGFzay4gKi8KKyNlbHNlIC8qIGNvbmZpZ0VOQUJMRV9NUFUgKi8KKwltc3IgcHNwbGltLCByMgkJCQkJCQkvKiBSZXN0b3JlIHRoZSBQU1BMSU0gcmVnaXN0ZXIgdmFsdWUgZm9yIHRoZSB0YXNrLiAqLworI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9NUFUgKi8KKwltc3IgcHNwLCByMAkJCQkJCQkJLyogUmVtZW1iZXIgdGhlIG5ldyB0b3Agb2Ygc3RhY2sgZm9yIHRoZSB0YXNrLiAqLworCWJ4IHIzCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworU1ZDX0hhbmRsZXI6CisJdHN0IGxyLCAjNAorCWl0ZSBlcQorCW1yc2VxIHIwLCBtc3AKKwltcnNuZSByMCwgcHNwCisJYiB2UG9ydFNWQ0hhbmRsZXJfQworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKwlFTkQKZGlmZiAtLWdpdCBhL1NvdXJjZS9wb3J0YWJsZS9JQVIvQVJNX0NNMzNfTlRaL25vbl9zZWN1cmUvcG9ydG1hY3JvLmggYi9Tb3VyY2UvcG9ydGFibGUvSUFSL0FSTV9DTTMzX05UWi9ub25fc2VjdXJlL3BvcnRtYWNyby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzYTExZDQKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvcG9ydGFibGUvSUFSL0FSTV9DTTMzX05UWi9ub25fc2VjdXJlL3BvcnRtYWNyby5oCkBAIC0wLDAgKzEsMzA2IEBACisvKgorICogRnJlZVJUT1MgS2VybmVsIFYxMC4yLjEKKyAqIENvcHlyaWdodCAoQykgMjAxOSBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCisgKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgorICogdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bworICogdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YKKyAqIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKKyAqIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAorICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MKKyAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUgorICogQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSCisgKiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBodHRwOi8vd3d3LkZyZWVSVE9TLm9yZworICogaHR0cDovL2F3cy5hbWF6b24uY29tL2ZyZWVydG9zCisgKgorICogMSB0YWIgPT0gNCBzcGFjZXMhCisgKi8KKworI2lmbmRlZiBQT1JUTUFDUk9fSAorI2RlZmluZSBQT1JUTUFDUk9fSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBQb3J0IHNwZWNpZmljIGRlZmluaXRpb25zLgorICoKKyAqIFRoZSBzZXR0aW5ncyBpbiB0aGlzIGZpbGUgY29uZmlndXJlIEZyZWVSVE9TIGNvcnJlY3RseSBmb3IgdGhlIGdpdmVuIGhhcmR3YXJlCisgKiBhbmQgY29tcGlsZXIuCisgKgorICogVGhlc2Ugc2V0dGluZ3Mgc2hvdWxkIG5vdCBiZSBhbHRlcmVkLgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisjaWZuZGVmIGNvbmZpZ0VOQUJMRV9GUFUKKwkjZXJyb3IgY29uZmlnRU5BQkxFX0ZQVSBtdXN0IGJlIGRlZmluZWQgaW4gRnJlZVJUT1NDb25maWcuaC4gIFNldCBjb25maWdFTkFCTEVfRlBVIHRvIDEgdG8gZW5hYmxlIHRoZSBGUFUgb3IgMCB0byBkaXNhYmxlIHRoZSBGUFUuCisjZW5kaWYgLyogY29uZmlnRU5BQkxFX0ZQVSAqLworCisjaWZuZGVmIGNvbmZpZ0VOQUJMRV9NUFUKKwkjZXJyb3IgY29uZmlnRU5BQkxFX01QVSBtdXN0IGJlIGRlZmluZWQgaW4gRnJlZVJUT1NDb25maWcuaC4gIFNldCBjb25maWdFTkFCTEVfTVBVIHRvIDEgdG8gZW5hYmxlIHRoZSBNUFUgb3IgMCB0byBkaXNhYmxlIHRoZSBNUFUuCisjZW5kaWYgLyogY29uZmlnRU5BQkxFX01QVSAqLworCisjaWZuZGVmIGNvbmZpZ0VOQUJMRV9UUlVTVFpPTkUKKwkjZXJyb3IgY29uZmlnRU5BQkxFX1RSVVNUWk9ORSBtdXN0IGJlIGRlZmluZWQgaW4gRnJlZVJUT1NDb25maWcuaC4gIFNldCBjb25maWdFTkFCTEVfVFJVU1RaT05FIHRvIDEgdG8gZW5hYmxlIFRydXN0Wm9uZSBvciAwIHRvIGRpc2FibGUgVHJ1c3Rab25lLgorI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9UUlVTVFpPTkUgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKgorICogQGJyaWVmIFR5cGUgZGVmaW5pdGlvbnMuCisgKi8KKyNkZWZpbmUgcG9ydENIQVIJCQkJCQkJCQkJCWNoYXIKKyNkZWZpbmUgcG9ydEZMT0FUCQkJCQkJCQkJCQlmbG9hdAorI2RlZmluZSBwb3J0RE9VQkxFCQkJCQkJCQkJCQlkb3VibGUKKyNkZWZpbmUgcG9ydExPTkcJCQkJCQkJCQkJCWxvbmcKKyNkZWZpbmUgcG9ydFNIT1JUCQkJCQkJCQkJCQlzaG9ydAorI2RlZmluZSBwb3J0U1RBQ0tfVFlQRQkJCQkJCQkJCQl1aW50MzJfdAorI2RlZmluZSBwb3J0QkFTRV9UWVBFCQkJCQkJCQkJCWxvbmcKKwordHlwZWRlZiBwb3J0U1RBQ0tfVFlQRQkJCQkJCQkJCQlTdGFja1R5cGVfdDsKK3R5cGVkZWYgbG9uZwkJCQkJCQkJCQkJCUJhc2VUeXBlX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcJCQkJCQkJCQkJVUJhc2VUeXBlX3Q7CisKKyNpZiggY29uZmlnVVNFXzE2X0JJVF9USUNLUyA9PSAxICkKKwl0eXBlZGVmIHVpbnQxNl90IFRpY2tUeXBlX3Q7CisJI2RlZmluZSBwb3J0TUFYX0RFTEFZICggVGlja1R5cGVfdCApCQkJCQkweGZmZmYKKyNlbHNlCisJdHlwZWRlZiB1aW50MzJfdCBUaWNrVHlwZV90OworCSNkZWZpbmUgcG9ydE1BWF9ERUxBWSAoIFRpY2tUeXBlX3QgKQkJCQkJMHhmZmZmZmZmZlVMCisKKwkvKiAzMi1iaXQgdGljayB0eXBlIG9uIGEgMzItYml0IGFyY2hpdGVjdHVyZSwgc28gcmVhZHMgb2YgdGhlIHRpY2sgY291bnQgZG8KKwkgKiBub3QgbmVlZCB0byBiZSBndWFyZGVkIHdpdGggYSBjcml0aWNhbCBzZWN0aW9uLiAqLworCSNkZWZpbmUgcG9ydFRJQ0tfVFlQRV9JU19BVE9NSUMJCQkJCQkJMQorI2VuZGlmCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqCisgKiBBcmNoaXRlY3R1cmUgc3BlY2lmaWNzLgorICovCisjZGVmaW5lIHBvcnRBUkNIX05BTUUJCQkJCQkJCQkJIkNvcnRleC1NMzMiCisjZGVmaW5lIHBvcnRTVEFDS19HUk9XVEgJCQkJCQkJCQkoIC0xICkKKyNkZWZpbmUgcG9ydFRJQ0tfUEVSSU9EX01TCQkJCQkJCQkJKCAoIFRpY2tUeXBlX3QgKSAxMDAwIC8gY29uZmlnVElDS19SQVRFX0haICkKKyNkZWZpbmUgcG9ydEJZVEVfQUxJR05NRU5UCQkJCQkJCQkJOAorI2RlZmluZSBwb3J0Tk9QKCkKKyNkZWZpbmUgcG9ydElOTElORQkJCQkJCQkJCQkJX19pbmxpbmUKKyNpZm5kZWYgcG9ydEZPUkNFX0lOTElORQorCSNkZWZpbmUgcG9ydEZPUkNFX0lOTElORQkJCQkJCQkJaW5saW5lIF9fYXR0cmlidXRlX18oKCBhbHdheXNfaW5saW5lICkpCisjZW5kaWYKKyNkZWZpbmUgcG9ydEhBU19TVEFDS19PVkVSRkxPV19DSEVDS0lORwkJCQkJCTEKKyNkZWZpbmUgcG9ydERPTlRfRElTQ0FSRAkJCQkJCQkJCV9fcm9vdAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKgorICogQGJyaWVmIEV4dGVybiBkZWNsYXJhdGlvbnMuCisgKi8KK2V4dGVybiB2b2lkIHZQb3J0WWllbGQoIHZvaWQgKSAvKiBQUklWSUxFR0VEX0ZVTkNUSU9OICovOworCitleHRlcm4gdm9pZCB2UG9ydEVudGVyQ3JpdGljYWwoIHZvaWQgKSAvKiBQUklWSUxFR0VEX0ZVTkNUSU9OICovOworZXh0ZXJuIHZvaWQgdlBvcnRFeGl0Q3JpdGljYWwoIHZvaWQgKSAvKiBQUklWSUxFR0VEX0ZVTkNUSU9OICovOworCitleHRlcm4gdWludDMyX3QgdWxTZXRJbnRlcnJ1cHRNYXNrRnJvbUlTUiggdm9pZCApIC8qIF9fYXR0cmlidXRlX18oKCBuYWtlZCApKSBQUklWSUxFR0VEX0ZVTkNUSU9OICovOworZXh0ZXJuIHZvaWQgdkNsZWFySW50ZXJydXB0TWFza0Zyb21JU1IoIHVpbnQzMl90IHVsTWFzayApIC8qIF9fYXR0cmlidXRlX18oKCBuYWtlZCApKSBQUklWSUxFR0VEX0ZVTkNUSU9OICovOworCisjaWYoIGNvbmZpZ0VOQUJMRV9UUlVTVFpPTkUgPT0gMSApCisJZXh0ZXJuIHZvaWQgdlBvcnRBbGxvY2F0ZVNlY3VyZUNvbnRleHQoIHVpbnQzMl90IHVsU2VjdXJlU3RhY2tTaXplICk7IC8qIF9fYXR0cmlidXRlX18gKCggbmFrZWQgKSkgKi8KKwlleHRlcm4gdm9pZCB2UG9ydEZyZWVTZWN1cmVDb250ZXh0KCB1aW50MzJfdCAqcHVsVENCICkgLyogX19hdHRyaWJ1dGVfXyAoKCBuYWtlZCApKSBQUklWSUxFR0VEX0ZVTkNUSU9OICovOworI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9UUlVTVFpPTkUgKi8KKworI2lmKCBjb25maWdFTkFCTEVfTVBVID09IDEgKQorCWV4dGVybiBCYXNlVHlwZV90IHhJc1ByaXZpbGVnZWQoIHZvaWQgKSAvKiBfX2F0dHJpYnV0ZV9fICgoIG5ha2VkICkpICovOworCWV4dGVybiB2b2lkIHZSZXNldFByaXZpbGVnZSggdm9pZCApIC8qIF9fYXR0cmlidXRlX18gKCggbmFrZWQgKSkgKi87CisjZW5kaWYgLyogY29uZmlnRU5BQkxFX01QVSAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKgorICogQGJyaWVmIE1QVSBzcGVjaWZpYyBjb25zdGFudHMuCisgKi8KKyNpZiggY29uZmlnRU5BQkxFX01QVSA9PSAxICkKKwkjZGVmaW5lIHBvcnRVU0lOR19NUFVfV1JBUFBFUlMJCQkJCQkJMQorCSNkZWZpbmUgcG9ydFBSSVZJTEVHRV9CSVQJCQkJCQkJCSggMHg4MDAwMDAwMFVMICkKKyNlbHNlCisJI2RlZmluZSBwb3J0UFJJVklMRUdFX0JJVAkJCQkJCQkJKCAweDBVTCApCisjZW5kaWYgLyogY29uZmlnRU5BQkxFX01QVSAqLworCisKKy8qIE1QVSByZWdpb25zLiAqLworI2RlZmluZSBwb3J0UFJJVklMRUdFRF9GTEFTSF9SRUdJT04JCQkJCQkJKCAwVUwgKQorI2RlZmluZSBwb3J0VU5QUklWSUxFR0VEX0ZMQVNIX1JFR0lPTgkJCQkJCSggMVVMICkKKyNkZWZpbmUgcG9ydFVOUFJJVklMRUdFRF9TWVNDQUxMU19SRUdJT04JCQkJCSggMlVMICkKKyNkZWZpbmUgcG9ydFBSSVZJTEVHRURfUkFNX1JFR0lPTgkJCQkJCQkoIDNVTCApCisjZGVmaW5lIHBvcnRTVEFDS19SRUdJT04JCQkJCQkJCQkoIDRVTCApCisjZGVmaW5lIHBvcnRGSVJTVF9DT05GSUdVUkFCTEVfUkVHSU9OCQkJCQkJKCA1VUwgKQorI2RlZmluZSBwb3J0TEFTVF9DT05GSUdVUkFCTEVfUkVHSU9OCQkJCQkJKCA3VUwgKQorI2RlZmluZSBwb3J0TlVNX0NPTkZJR1VSQUJMRV9SRUdJT05TCQkJCQkJKCAoIHBvcnRMQVNUX0NPTkZJR1VSQUJMRV9SRUdJT04gLSBwb3J0RklSU1RfQ09ORklHVVJBQkxFX1JFR0lPTiApICsgMSApCisjZGVmaW5lIHBvcnRUT1RBTF9OVU1fUkVHSU9OUwkJCQkJCQkJKCBwb3J0TlVNX0NPTkZJR1VSQUJMRV9SRUdJT05TICsgMSApIC8qIFBsdXMgb25lIHRvIG1ha2Ugc3BhY2UgZm9yIHRoZSBzdGFjayByZWdpb24uICovCisKKy8qIERldmljZSBtZW1vcnkgYXR0cmlidXRlcyB1c2VkIGluIE1QVV9NQUlSIHJlZ2lzdGVycy4KKyAqCisgKiA4LWJpdCB2YWx1ZXMgZW5jb2RlZCBhcyBmb2xsb3dzOgorICogIEJpdFs3OjRdIC0gMDAwMCAtIERldmljZSBNZW1vcnkKKyAqICBCaXRbMzoyXSAtIDAwIC0tPiBEZXZpY2UtbkduUm5FCisgKgkJCQkwMSAtLT4gRGV2aWNlLW5HblJFCisgKgkJCQkxMCAtLT4gRGV2aWNlLW5HUkUKKyAqCQkJCTExIC0tPiBEZXZpY2UtR1JFCisgKiAgQml0WzE6MF0gLSAwMCwgUmVzZXJ2ZWQuCisgKi8KKyNkZWZpbmUgcG9ydE1QVV9ERVZJQ0VfTUVNT1JZX25HblJuRQkJCQkJCSggMHgwMCApIC8qIDAwMDAgMDAwMCAqLworI2RlZmluZSBwb3J0TVBVX0RFVklDRV9NRU1PUllfbkduUkUJCQkJCQkJKCAweDA0ICkgLyogMDAwMCAwMTAwICovCisjZGVmaW5lIHBvcnRNUFVfREVWSUNFX01FTU9SWV9uR1JFCQkJCQkJCSggMHgwOCApIC8qIDAwMDAgMTAwMCAqLworI2RlZmluZSBwb3J0TVBVX0RFVklDRV9NRU1PUllfR1JFCQkJCQkJCSggMHgwQyApIC8qIDAwMDAgMTEwMCAqLworCisvKiBOb3JtYWwgbWVtb3J5IGF0dHJpYnV0ZXMgdXNlZCBpbiBNUFVfTUFJUiByZWdpc3RlcnMuICovCisjZGVmaW5lIHBvcnRNUFVfTk9STUFMX01FTU9SWV9OT05fQ0FDSEVBQkxFCQkJCQkoIDB4NDQgKSAvKiBOb24tY2FjaGVhYmxlLiAqLworI2RlZmluZSBwb3J0TVBVX05PUk1BTF9NRU1PUllfQlVGRkVSQUJMRV9DQUNIRUFCTEUJCQkoIDB4RkYgKSAvKiBOb24tVHJhbnNpZW50LCBXcml0ZS1iYWNrLCBSZWFkLUFsbG9jYXRlIGFuZCBXcml0ZS1BbGxvY2F0ZS4gKi8KKworLyogQXR0cmlidXRlcyB1c2VkIGluIE1QVV9SQkFSIHJlZ2lzdGVycy4gKi8KKyNkZWZpbmUgcG9ydE1QVV9SRUdJT05fTk9OX1NIQVJFQUJMRQkJCQkJCSggMFVMIDw8IDNVTCApCisjZGVmaW5lIHBvcnRNUFVfUkVHSU9OX0lOTkVSX1NIQVJFQUJMRQkJCQkJCSggMVVMIDw8IDNVTCApCisjZGVmaW5lIHBvcnRNUFVfUkVHSU9OX09VVEVSX1NIQVJFQUJMRQkJCQkJCSggMlVMIDw8IDNVTCApCisKKyNkZWZpbmUgcG9ydE1QVV9SRUdJT05fUFJJVklMRUdFRF9SRUFEX1dSSVRFCQkJCSggMFVMIDw8IDFVTCApCisjZGVmaW5lIHBvcnRNUFVfUkVHSU9OX1JFQURfV1JJVEUJCQkJCQkJKCAxVUwgPDwgMVVMICkKKyNkZWZpbmUgcG9ydE1QVV9SRUdJT05fUFJJVklMRUdFRF9SRUFEX09OTFkJCQkJCSggMlVMIDw8IDFVTCApCisjZGVmaW5lIHBvcnRNUFVfUkVHSU9OX1JFQURfT05MWQkJCQkJCQkoIDNVTCA8PCAxVUwgKQorCisjZGVmaW5lIHBvcnRNUFVfUkVHSU9OX0VYRUNVVEVfTkVWRVIJCQkJCQkoIDFVTCApCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqCisgKiBAYnJpZWYgU2V0dGluZ3MgdG8gZGVmaW5lIGFuIE1QVSByZWdpb24uCisgKi8KK3R5cGVkZWYgc3RydWN0IE1QVVJlZ2lvblNldHRpbmdzCit7CisJdWludDMyX3QgdWxSQkFSOwkvKio8IFJCQVIgZm9yIHRoZSByZWdpb24uICovCisJdWludDMyX3QgdWxSTEFSOwkvKio8IFJMQVIgZm9yIHRoZSByZWdpb24uICovCit9IE1QVVJlZ2lvblNldHRpbmdzX3Q7CisKKy8qKgorICogQGJyaWVmIE1QVSBzZXR0aW5ncyBhcyBzdG9yZWQgaW4gdGhlIFRDQi4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgTVBVX1NFVFRJTkdTCit7CisJdWludDMyX3QgdWxNQUlSMDsJLyoqPCBNQUlSMCBmb3IgdGhlIHRhc2sgY29udGFpbmluZyBhdHRyaWJ1dGVzIGZvciBhbGwgdGhlIDQgcGVyIHRhc2sgcmVnaW9ucy4gKi8KKwlNUFVSZWdpb25TZXR0aW5nc190IHhSZWdpb25zU2V0dGluZ3NbIHBvcnRUT1RBTF9OVU1fUkVHSU9OUyBdOyAvKio8IFNldHRpbmdzIGZvciA0IHBlciB0YXNrIHJlZ2lvbnMuICovCit9IHhNUFVfU0VUVElOR1M7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqCisgKiBAYnJpZWYgU1ZDIG51bWJlcnMuCisgKi8KKyNkZWZpbmUgcG9ydFNWQ19BTExPQ0FURV9TRUNVUkVfQ09OVEVYVAkJCQkJCTAKKyNkZWZpbmUgcG9ydFNWQ19GUkVFX1NFQ1VSRV9DT05URVhUCQkJCQkJCTEKKyNkZWZpbmUgcG9ydFNWQ19TVEFSVF9TQ0hFRFVMRVIJCQkJCQkJCTIKKyNkZWZpbmUgcG9ydFNWQ19SQUlTRV9QUklWSUxFR0UJCQkJCQkJCTMKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAqIEBicmllZiBTY2hlZHVsZXIgdXRpbGl0aWVzLgorICovCisjZGVmaW5lIHBvcnRZSUVMRCgpCQkJCQkJCQkJCQl2UG9ydFlpZWxkKCkKKyNkZWZpbmUgcG9ydE5WSUNfSU5UX0NUUkxfUkVHCQkJCQkJCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZDA0ICkgKQorI2RlZmluZSBwb3J0TlZJQ19QRU5EU1ZTRVRfQklUCQkJCQkJCQkoIDFVTCA8PCAyOFVMICkKKyNkZWZpbmUgcG9ydEVORF9TV0lUQ0hJTkdfSVNSKCB4U3dpdGNoUmVxdWlyZWQgKQkJCWlmKCB4U3dpdGNoUmVxdWlyZWQgKSBwb3J0TlZJQ19JTlRfQ1RSTF9SRUcgPSBwb3J0TlZJQ19QRU5EU1ZTRVRfQklUCisjZGVmaW5lIHBvcnRZSUVMRF9GUk9NX0lTUiggeCApCQkJCQkJCQlwb3J0RU5EX1NXSVRDSElOR19JU1IoIHggKQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKgorICogQGJyaWVmIENyaXRpY2FsIHNlY3Rpb24gbWFuYWdlbWVudC4KKyAqLworI2RlZmluZSBwb3J0U0VUX0lOVEVSUlVQVF9NQVNLX0ZST01fSVNSKCkJCQkJCXVsU2V0SW50ZXJydXB0TWFza0Zyb21JU1IoKQorI2RlZmluZSBwb3J0Q0xFQVJfSU5URVJSVVBUX01BU0tfRlJPTV9JU1IoeCkJCQkJdkNsZWFySW50ZXJydXB0TWFza0Zyb21JU1IoIHggKQorI2RlZmluZSBwb3J0RElTQUJMRV9JTlRFUlJVUFRTKCkJCQkJCQkJX19hc20gdm9sYXRpbGUgKCAiIGNwc2lkIGkgIiA6OjogIm1lbW9yeSIgKQorI2RlZmluZSBwb3J0RU5BQkxFX0lOVEVSUlVQVFMoKQkJCQkJCQkJX19hc20gdm9sYXRpbGUgKCAiIGNwc2llIGkgIiA6OjogIm1lbW9yeSIgKQorI2RlZmluZSBwb3J0RU5URVJfQ1JJVElDQUwoKQkJCQkJCQkJdlBvcnRFbnRlckNyaXRpY2FsKCkKKyNkZWZpbmUgcG9ydEVYSVRfQ1JJVElDQUwoKQkJCQkJCQkJCXZQb3J0RXhpdENyaXRpY2FsKCkKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAqIEBicmllZiBUYXNrIGZ1bmN0aW9uIG1hY3JvcyBhcyBkZXNjcmliZWQgb24gdGhlIEZyZWVSVE9TLm9yZyBXRUIgc2l0ZS4KKyAqLworI2RlZmluZSBwb3J0VEFTS19GVU5DVElPTl9QUk9UTyggdkZ1bmN0aW9uLCBwdlBhcmFtZXRlcnMgKQl2b2lkIHZGdW5jdGlvbiggdm9pZCAqcHZQYXJhbWV0ZXJzICkKKyNkZWZpbmUgcG9ydFRBU0tfRlVOQ1RJT04oIHZGdW5jdGlvbiwgcHZQYXJhbWV0ZXJzICkJCXZvaWQgdkZ1bmN0aW9uKCB2b2lkICpwdlBhcmFtZXRlcnMgKQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiggY29uZmlnRU5BQkxFX1RSVVNUWk9ORSA9PSAxICkKKwkvKioKKwkgKiBAYnJpZWYgQWxsb2NhdGUgYSBzZWN1cmUgY29udGV4dCBmb3IgdGhlIHRhc2suCisJICoKKwkgKiBUYXNrcyBhcmUgbm90IGNyZWF0ZWQgd2l0aCBhIHNlY3VyZSBjb250ZXh0LiBBbnkgdGFzayB0aGF0IGlzIGdvaW5nIHRvIGNhbGwKKwkgKiBzZWN1cmUgZnVuY3Rpb25zIG11c3QgY2FsbCBwb3J0QUxMT0NBVEVfU0VDVVJFX0NPTlRFWFQoKSB0byBhbGxvY2F0ZSBpdHNlbGYgYQorCSAqIHNlY3VyZSBjb250ZXh0IGJlZm9yZSBpdCBjYWxscyBhbnkgc2VjdXJlIGZ1bmN0aW9uLgorCSAqCisJICogQHBhcmFtW2luXSB1bFNlY3VyZVN0YWNrU2l6ZSBUaGUgc2l6ZSBvZiB0aGUgc2VjdXJlIHN0YWNrIHRvIGJlIGFsbG9jYXRlZC4KKwkgKi8KKwkjZGVmaW5lIHBvcnRBTExPQ0FURV9TRUNVUkVfQ09OVEVYVCggdWxTZWN1cmVTdGFja1NpemUgKQl2UG9ydEFsbG9jYXRlU2VjdXJlQ29udGV4dCggdWxTZWN1cmVTdGFja1NpemUgKQorCisJLyoqCisJICogQGJyaWVmIENhbGxlZCB3aGVuIGEgdGFzayBpcyBkZWxldGVkIHRvIGRlbGV0ZSB0aGUgdGFzaydzIHNlY3VyZSBjb250ZXh0LAorCSAqIGlmIGl0IGhhcyBvbmUuCisJICoKKwkgKiBAcGFyYW1baW5dIHB4VENCIFRoZSBUQ0Igb2YgdGhlIHRhc2sgYmVpbmcgZGVsZXRlZC4KKwkgKi8KKwkjZGVmaW5lIHBvcnRDTEVBTl9VUF9UQ0IoIHB4VENCICkJCQkJCQkJdlBvcnRGcmVlU2VjdXJlQ29udGV4dCggKCB1aW50MzJfdCAqICkgcHhUQ0IgKQorI2Vsc2UKKwkjZGVmaW5lIHBvcnRBTExPQ0FURV9TRUNVUkVfQ09OVEVYVCggdWxTZWN1cmVTdGFja1NpemUgKQorCSNkZWZpbmUgcG9ydENMRUFOX1VQX1RDQiggcHhUQ0IgKQorI2VuZGlmIC8qIGNvbmZpZ0VOQUJMRV9UUlVTVFpPTkUgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYoIGNvbmZpZ0VOQUJMRV9NUFUgPT0gMSApCisJLyoqCisJICogQGJyaWVmIENoZWNrcyB3aGV0aGVyIG9yIG5vdCB0aGUgcHJvY2Vzc29yIGlzIHByaXZpbGVnZWQuCisJICoKKwkgKiBAcmV0dXJuIDEgaWYgdGhlIHByb2Nlc3NvciBpcyBhbHJlYWR5IHByaXZpbGVnZWQsIDAgb3RoZXJ3aXNlLgorCSAqLworCSNkZWZpbmUgcG9ydElTX1BSSVZJTEVHRUQoKQkJCQkJCQkJCXhJc1ByaXZpbGVnZWQoKQorCisJLyoqCisJICogQGJyaWVmIFJhaXNlIGFuIFNWQyByZXF1ZXN0IHRvIHJhaXNlIHByaXZpbGVnZS4KKwkgKgorCSAqIFRoZSBTVkMgaGFuZGxlciBjaGVja3MgdGhhdCB0aGUgU1ZDIHdhcyByYWlzZWQgZnJvbSBhIHN5c3RlbSBjYWxsIGFuZCBvbmx5CisJICogdGhlbiBpdCByYWlzZXMgdGhlIHByaXZpbGVnZS4gSWYgdGhpcyBpcyBjYWxsZWQgZnJvbSBhbnkgb3RoZXIgcGxhY2UsCisJICogdGhlIHByaXZpbGVnZSBpcyBub3QgcmFpc2VkLgorCSAqLworCSNkZWZpbmUgcG9ydFJBSVNFX1BSSVZJTEVHRSgpCQkJCQkJCQlfX2FzbSB2b2xhdGlsZSAoICJzdmMgJTAgXG4iIDo6ICJpIiAoIHBvcnRTVkNfUkFJU0VfUFJJVklMRUdFICkgOiAibWVtb3J5IiApOworCisJLyoqCisJICogQGJyaWVmIExvd2VycyB0aGUgcHJpdmlsZWdlIGxldmVsIGJ5IHNldHRpbmcgdGhlIGJpdCAwIG9mIHRoZSBDT05UUk9MCisJICogcmVnaXN0ZXIuCisJICovCisJI2RlZmluZSBwb3J0UkVTRVRfUFJJVklMRUdFKCkJCQkJCQkJCXZSZXNldFByaXZpbGVnZSgpCisjZWxzZQorCSNkZWZpbmUgcG9ydElTX1BSSVZJTEVHRUQoKQorCSNkZWZpbmUgcG9ydFJBSVNFX1BSSVZJTEVHRSgpCisJI2RlZmluZSBwb3J0UkVTRVRfUFJJVklMRUdFKCkKKyNlbmRpZiAvKiBjb25maWdFTkFCTEVfTVBVICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoqCisgKiBAYnJpZWYgQmFycmllcnMuCisgKi8KKyNkZWZpbmUgcG9ydE1FTU9SWV9CQVJSSUVSKCkgX19hc20gdm9sYXRpbGUoICIiIDo6OiAibWVtb3J5IiApCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogU3VwcHJlc3Mgd2FybmluZ3MgdGhhdCBhcmUgZ2VuZXJhdGVkIGJ5IHRoZSBJQVIgdG9vbHMsIGJ1dCBjYW5ub3QgYmUgZml4ZWQgaW4KKyAqIHRoZSBzb3VyY2UgY29kZSBiZWNhdXNlIHRvIGRvIHNvIHdvdWxkIGNhdXNlIG90aGVyIGNvbXBpbGVycyB0byBnZW5lcmF0ZQorICogd2FybmluZ3MuICovCisjcHJhZ21hIGRpYWdfc3VwcHJlc3M9QmUwMDYKKyNwcmFnbWEgZGlhZ19zdXBwcmVzcz1QYTA4MgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBQT1JUTUFDUk9fSCAqLwpkaWZmIC0tZ2l0IGEvU291cmNlL3BvcnRhYmxlL0lBUi9BUk1fQ000Ri9wb3J0LmMgYi9Tb3VyY2UvcG9ydGFibGUvSUFSL0FSTV9DTTRGL3BvcnQuYwppbmRleCAyNzEwZDJmLi5mNDA1MTYzIDEwMDY0NAotLS0gYS9Tb3VyY2UvcG9ydGFibGUvSUFSL0FSTV9DTTRGL3BvcnQuYworKysgYi9Tb3VyY2UvcG9ydGFibGUvSUFSL0FSTV9DTTRGL3BvcnQuYwpAQCAtMSw2ICsxLDYgQEAKIC8qCi0gKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjAuMQotICogQ29weXJpZ2h0IChDKSAyMDE3IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRnJlZVJUT1MgS2VybmVsIFYxMC4yLjEKKyAqIENvcHlyaWdodCAoQykgMjAxOSBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCiAgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCiAgKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgpkaWZmIC0tZ2l0IGEvU291cmNlL3BvcnRhYmxlL0lBUi9BUk1fQ000Ri9wb3J0YXNtLnMgYi9Tb3VyY2UvcG9ydGFibGUvSUFSL0FSTV9DTTRGL3BvcnRhc20ucwppbmRleCAyMGZkOWQyLi5kYTcxNWFlIDEwMDY0NAotLS0gYS9Tb3VyY2UvcG9ydGFibGUvSUFSL0FSTV9DTTRGL3BvcnRhc20ucworKysgYi9Tb3VyY2UvcG9ydGFibGUvSUFSL0FSTV9DTTRGL3BvcnRhc20ucwpAQCAtMSw2ICsxLDYgQEAKIC8qCi0gKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjAuMQotICogQ29weXJpZ2h0IChDKSAyMDE3IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRnJlZVJUT1MgS2VybmVsIFYxMC4yLjEKKyAqIENvcHlyaWdodCAoQykgMjAxOSBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCiAgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCiAgKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgpkaWZmIC0tZ2l0IGEvU291cmNlL3BvcnRhYmxlL0lBUi9BUk1fQ000Ri9wb3J0bWFjcm8uaCBiL1NvdXJjZS9wb3J0YWJsZS9JQVIvQVJNX0NNNEYvcG9ydG1hY3JvLmgKaW5kZXggZjE5ZWY0NS4uMDhmNWQxYyAxMDA2NDQKLS0tIGEvU291cmNlL3BvcnRhYmxlL0lBUi9BUk1fQ000Ri9wb3J0bWFjcm8uaAorKysgYi9Tb3VyY2UvcG9ydGFibGUvSUFSL0FSTV9DTTRGL3BvcnRtYWNyby5oCkBAIC0xLDYgKzEsNiBAQAogLyoKLSAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMC4xCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjIuMQorICogQ29weXJpZ2h0IChDKSAyMDE5IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKICAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKICAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCmRpZmYgLS1naXQgYS9Tb3VyY2UvcG9ydGFibGUvSUFSL0FSTV9DTTRfTVBVL3BvcnQuYyBiL1NvdXJjZS9wb3J0YWJsZS9JQVIvQVJNX0NNNF9NUFUvcG9ydC5jCmluZGV4IGExM2FmNDkuLmI4NDNlNTYgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9wb3J0YWJsZS9JQVIvQVJNX0NNNF9NUFUvcG9ydC5jCisrKyBiL1NvdXJjZS9wb3J0YWJsZS9JQVIvQVJNX0NNNF9NUFUvcG9ydC5jCkBAIC0xLDYgKzEsNiBAQAogLyoKLSAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMC4wCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjIuMQorICogQ29weXJpZ2h0IChDKSAyMDE5IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKICAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKICAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCkBAIC0xMCw4ICsxMCw3IEBACiAgKiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKICAqCiAgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKLSAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuIElmIHlvdSB3aXNoIHRvIHVzZSBvdXIgQW1hem9uCi0gKiBGcmVlUlRPUyBuYW1lLCBwbGVhc2UgZG8gc28gaW4gYSBmYWlyIHVzZSB3YXkgdGhhdCBkb2VzIG5vdCBjYXVzZSBjb25mdXNpb24uCisgKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgogICoKICAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCiAgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUwpAQCAtMTQzLDIxICsxNDIsMTQgQEAKIC8qCiAgKiBDb25maWd1cmUgYSBudW1iZXIgb2Ygc3RhbmRhcmQgTVBVIHJlZ2lvbnMgdGhhdCBhcmUgdXNlZCBieSBhbGwgdGFza3MuCiAgKi8KLVBSSVZJTEVHRURfRlVOQ1RJT04gc3RhdGljIHZvaWQgcHJ2U2V0dXBNUFUoIHZvaWQgKTsKK3N0YXRpYyB2b2lkIHBydlNldHVwTVBVKCB2b2lkICkgUFJJVklMRUdFRF9GVU5DVElPTjsKIAogLyoKICAqIFJldHVybiB0aGUgc21hbGxlc3QgTVBVIHJlZ2lvbiBzaXplIHRoYXQgYSBnaXZlbiBudW1iZXIgb2YgYnl0ZXMgd2lsbCBmaXQKICAqIGludG8uICBUaGUgcmVnaW9uIHNpemUgaXMgcmV0dXJuZWQgYXMgdGhlIHZhbHVlIHRoYXQgc2hvdWxkIGJlIHByb2dyYW1tZWQKICAqIGludG8gdGhlIHJlZ2lvbiBhdHRyaWJ1dGUgcmVnaXN0ZXIgZm9yIHRoYXQgcmVnaW9uLgogICovCi1QUklWSUxFR0VEX0ZVTkNUSU9OIHN0YXRpYyB1aW50MzJfdCBwcnZHZXRNUFVSZWdpb25TaXplU2V0dGluZyggdWludDMyX3QgdWxBY3R1YWxTaXplSW5CeXRlcyApOwotCi0vKgotICogQ2hlY2tzIHRvIHNlZSBpZiBiZWluZyBjYWxsZWQgZnJvbSB0aGUgY29udGV4dCBvZiBhbiB1bnByaXZpbGVnZWQgdGFzaywgYW5kCi0gKiBpZiBzbyByYWlzZXMgdGhlIHByaXZpbGVnZSBsZXZlbCBhbmQgcmV0dXJucyBmYWxzZSAtIG90aGVyd2lzZSBkb2VzIG5vdGhpbmcKLSAqIG90aGVyIHRoYW4gcmV0dXJuIHRydWUuCi0gKi8KLWV4dGVybiBCYXNlVHlwZV90IHhQb3J0UmFpc2VQcml2aWxlZ2UoIHZvaWQgKTsKK3N0YXRpYyB1aW50MzJfdCBwcnZHZXRNUFVSZWdpb25TaXplU2V0dGluZyggdWludDMyX3QgdWxBY3R1YWxTaXplSW5CeXRlcyApIFBSSVZJTEVHRURfRlVOQ1RJT047CiAKIC8qCiAgKiBTZXR1cCB0aGUgdGltZXIgdG8gZ2VuZXJhdGUgdGhlIHRpY2sgaW50ZXJydXB0cy4gIFRoZSBpbXBsZW1lbnRhdGlvbiBpbiB0aGlzCkBAIC0xNjksMTIgKzE2MSwxMiBAQAogLyoKICAqIEV4Y2VwdGlvbiBoYW5kbGVycy4KICAqLwotUFJJVklMRUdFRF9GVU5DVElPTiB2b2lkIHhQb3J0U3lzVGlja0hhbmRsZXIoIHZvaWQgKTsKK3ZvaWQgeFBvcnRTeXNUaWNrSGFuZGxlciggdm9pZCApIFBSSVZJTEVHRURfRlVOQ1RJT047CiAKIC8qCiAgKiBTdGFydCBmaXJzdCB0YXNrIGlzIGEgc2VwYXJhdGUgZnVuY3Rpb24gc28gaXQgY2FuIGJlIHRlc3RlZCBpbiBpc29sYXRpb24uCiAgKi8KLVBSSVZJTEVHRURfRlVOQ1RJT04gZXh0ZXJuIHZvaWQgdlBvcnRTdGFydEZpcnN0VGFzayggdm9pZCApOworZXh0ZXJuIHZvaWQgdlBvcnRTdGFydEZpcnN0VGFzayggdm9pZCApIFBSSVZJTEVHRURfRlVOQ1RJT047CiAKIC8qCiAgKiBUdXJuIHRoZSBWRlAgb24uCkBAIC0xODksOCArMTgxLDIwIEBACiAvKgogICogQ2FsbGVkIGZyb20gdGhlIFNWQyBoYW5kbGVyIHVzZWQgdG8gc3RhcnQgdGhlIHNjaGVkdWxlci4KICAqLwotUFJJVklMRUdFRF9GVU5DVElPTiBleHRlcm4gdm9pZCB2UG9ydFJlc3RvcmVDb250ZXh0T2ZGaXJzdFRhc2soIHZvaWQgKTsKK2V4dGVybiB2b2lkIHZQb3J0UmVzdG9yZUNvbnRleHRPZkZpcnN0VGFzayggdm9pZCApIFBSSVZJTEVHRURfRlVOQ1RJT047CiAKKy8qKgorICogQGJyaWVmIENhbGxzIHRoZSBwb3J0IHNwZWNpZmljIGNvZGUgdG8gcmFpc2UgdGhlIHByaXZpbGVnZS4KKyAqCisgKiBAcmV0dXJuIHBkRkFMU0UgaWYgcHJpdmlsZWdlIHdhcyByYWlzZWQsIHBkVFJVRSBvdGhlcndpc2UuCisgKi8KK2V4dGVybiBCYXNlVHlwZV90IHhQb3J0UmFpc2VQcml2aWxlZ2UoIHZvaWQgKTsKKworLyoqCisgKiBAYnJpZWYgSWYgeFJ1bm5pbmdQcml2aWxlZ2VkIGlzIG5vdCBwZFRSVUUsIGNhbGxzIHRoZSBwb3J0IHNwZWNpZmljCisgKiBjb2RlIHRvIHJlc2V0IHRoZSBwcml2aWxlZ2UsIG90aGVyd2lzZSBkb2VzIG5vdGhpbmcuCisgKi8KK2V4dGVybiB2b2lkIHZQb3J0UmVzZXRQcml2aWxlZ2UoIEJhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkICk7CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogLyogRWFjaCB0YXNrIG1haW50YWlucyBpdHMgb3duIGludGVycnVwdCBzdGF0dXMgaW4gdGhlIGNyaXRpY2FsIG5lc3RpbmcKQEAgLTQ4NCw2ICs0ODgsOSBAQAogZXh0ZXJuIHVpbnQzMl90IF9fcHJpdmlsZWdlZF9kYXRhX3N0YXJ0X187CiBleHRlcm4gdWludDMyX3QgX19wcml2aWxlZ2VkX2RhdGFfZW5kX187CiAKKwkvKiBDaGVjayB0aGUgZXhwZWN0ZWQgTVBVIGlzIHByZXNlbnQuICovCisJaWYoIHBvcnRNUFVfVFlQRV9SRUcgPT0gcG9ydEVYUEVDVEVEX01QVV9UWVBFX1ZBTFVFICkKKwl7CiAJCS8qIEZpcnN0IHNldHVwIHRoZSBlbnRpcmUgZmxhc2ggZm9yIHVucHJpdmlsZWdlZCByZWFkIG9ubHkgYWNjZXNzLiAqLwogCQlwb3J0TVBVX1JFR0lPTl9CQVNFX0FERFJFU1NfUkVHID0JKCAoIHVpbnQzMl90ICkgX19GTEFTSF9zZWdtZW50X3N0YXJ0X18gKSB8IC8qIEJhc2UgYWRkcmVzcy4gKi8KIAkJCQkJCQkJCQkJKCBwb3J0TVBVX1JFR0lPTl9WQUxJRCApIHwKQEAgLTUzMiw2ICs1MzksNyBAQAogCiAJCS8qIEVuYWJsZSB0aGUgTVBVIHdpdGggdGhlIGJhY2tncm91bmQgcmVnaW9uIGNvbmZpZ3VyZWQuICovCiAJCXBvcnRNUFVfQ1RSTF9SRUcgfD0gKCBwb3J0TVBVX0VOQUJMRSB8IHBvcnRNUFVfQkFDS0dST1VORF9FTkFCTEUgKTsKKwl9CiB9CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIApAQCAtNTU5LDE4ICs1NjcsNiBAQAogfQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLXZvaWQgdlBvcnRSZXNldFByaXZpbGVnZSggQmFzZVR5cGVfdCB4UnVubmluZ1ByaXZpbGVnZWQgKQotewotCWlmKCB4UnVubmluZ1ByaXZpbGVnZWQgIT0gcGRUUlVFICkKLQl7Ci0JCV9fYXNtIHZvbGF0aWxlICggIiBtcnMgcjAsIGNvbnRyb2wgCVxuIiBcCi0JCQkJCQkgIiBvcnIgcjAsIHIwLCAjMQlcbiIgXAotCQkJCQkJICIgbXNyIGNvbnRyb2wsIHIwCVxuIglcCi0JCQkJCQkgOjo6InIwIiwgIm1lbW9yeSIgKTsKLQl9Ci19Ci0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQogdm9pZCB2UG9ydFN0b3JlVGFza01QVVNldHRpbmdzKCB4TVBVX1NFVFRJTkdTICp4TVBVU2V0dGluZ3MsIGNvbnN0IHN0cnVjdCB4TUVNT1JZX1JFR0lPTiAqIGNvbnN0IHhSZWdpb25zLCBTdGFja1R5cGVfdCAqcHhCb3R0b21PZlN0YWNrLCB1aW50MzJfdCB1bFN0YWNrRGVwdGggKQogewogZXh0ZXJuIHVpbnQzMl90IF9fU1JBTV9zZWdtZW50X3N0YXJ0X187CmRpZmYgLS1naXQgYS9Tb3VyY2UvcG9ydGFibGUvSUFSL0FSTV9DTTRfTVBVL3BvcnRhc20ucyBiL1NvdXJjZS9wb3J0YWJsZS9JQVIvQVJNX0NNNF9NUFUvcG9ydGFzbS5zCmluZGV4IGY3NDEwNjkuLjM3ZjFhODAgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9wb3J0YWJsZS9JQVIvQVJNX0NNNF9NUFUvcG9ydGFzbS5zCisrKyBiL1NvdXJjZS9wb3J0YWJsZS9JQVIvQVJNX0NNNF9NUFUvcG9ydGFzbS5zCkBAIC0xLDYgKzEsNiBAQAogLyoKLSAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMC4wCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjIuMQorICogQ29weXJpZ2h0IChDKSAyMDE5IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKICAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKICAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCkBAIC0xMCw4ICsxMCw3IEBACiAgKiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKICAqCiAgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKLSAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuIElmIHlvdSB3aXNoIHRvIHVzZSBvdXIgQW1hem9uCi0gKiBGcmVlUlRPUyBuYW1lLCBwbGVhc2UgZG8gc28gaW4gYSBmYWlyIHVzZSB3YXkgdGhhdCBkb2VzIG5vdCBjYXVzZSBjb25mdXNpb24uCisgKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgogICoKICAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCiAgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUwpAQCAtNDAsNyArMzksOCBAQAogCVBVQkxJQyB2UG9ydFN0YXJ0Rmlyc3RUYXNrCiAJUFVCTElDIHZQb3J0RW5hYmxlVkZQCiAJUFVCTElDIHZQb3J0UmVzdG9yZUNvbnRleHRPZkZpcnN0VGFzawotCVBVQkxJQyB4UG9ydFJhaXNlUHJpdmlsZWdlCisJUFVCTElDIHhJc1ByaXZpbGVnZWQKKwlQVUJMSUMgdlJlc2V0UHJpdmlsZWdlCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCkBAIC0xMTUsNyArMTE1LDcgQEAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLXZQb3J0U3RhcnRGaXJzdFRhc2sKK3ZQb3J0U3RhcnRGaXJzdFRhc2s6CiAJLyogVXNlIHRoZSBOVklDIG9mZnNldCByZWdpc3RlciB0byBsb2NhdGUgdGhlIHN0YWNrLiAqLwogCWxkciByMCwgPTB4RTAwMEVEMDgKIAlsZHIgcjAsIFtyMF0KQEAgLTEzNyw3ICsxMzcsNyBAQAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotdlBvcnRSZXN0b3JlQ29udGV4dE9mRmlyc3RUYXNrCit2UG9ydFJlc3RvcmVDb250ZXh0T2ZGaXJzdFRhc2s6CiAJLyogVXNlIHRoZSBOVklDIG9mZnNldCByZWdpc3RlciB0byBsb2NhdGUgdGhlIHN0YWNrLiAqLwogCWxkciByMCwgPTB4RTAwMEVEMDgKIAlsZHIgcjAsIFtyMF0KQEAgLTE2OCw3ICsxNjgsNyBAQAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotdlBvcnRFbmFibGVWRlAKK3ZQb3J0RW5hYmxlVkZQOgogCS8qIFRoZSBGUFUgZW5hYmxlIGJpdHMgYXJlIGluIHRoZSBDUEFDUi4gKi8KIAlsZHIudyByMCwgPTB4RTAwMEVEODgKIAlsZHIJcjEsIFtyMF0KQEAgLTE4MCwxOSArMTgwLDIwIEBACiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi14UG9ydFJhaXNlUHJpdmlsZWdlCi0JbXJzIHIwLCBjb250cm9sCi0JLyogSXMgdGhlIHRhc2sgcnVubmluZyBwcml2aWxlZ2VkPyAqLwotCXRzdCByMCwgIzEKLQlpdHRlIG5lCi0JLyogQ09OVFJPTFswXSE9MCwgcmV0dXJuIGZhbHNlLiAqLwotCW1vdm5lIHIwLCAjMAotCS8qIFN3aXRjaCB0byBwcml2aWxlZ2VkLiAqLwotCXN2Y25lIDIJLyogMiA9PSBwb3J0U1ZDX1JBSVNFX1BSSVZJTEVHRSAqLwotCS8qIENPTlRST0xbMF09PTAsIHJldHVybiB0cnVlLiAqLwotCW1vdmVxIHIwLCAjMQotCWJ4IGxyCit4SXNQcml2aWxlZ2VkOgorCW1ycyByMCwgY29udHJvbAkJLyogcjAgPSBDT05UUk9MLiAqLworCXRzdCByMCwgIzEJCQkvKiBQZXJmb3JtIHIwICYgMSAoYml0d2lzZSBBTkQpIGFuZCB1cGRhdGUgdGhlIGNvbmRpdGlvbnMgZmxhZy4gKi8KKwlpdGUgbmUKKwltb3ZuZSByMCwgIzAJCS8qIENPTlRST0xbMF0hPTAuIFJldHVybiBmYWxzZSB0byBpbmRpY2F0ZSB0aGF0IHRoZSBwcm9jZXNzb3IgaXMgbm90IHByaXZpbGVnZWQuICovCisJbW92ZXEgcjAsICMxCQkvKiBDT05UUk9MWzBdPT0wLiBSZXR1cm4gdHJ1ZSB0byBpbmRpY2F0ZSB0aGF0IHRoZSBwcm9jZXNzb3IgaXMgcHJpdmlsZWdlZC4gKi8KKwlieCBscgkJCQkvKiBSZXR1cm4uICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAordlJlc2V0UHJpdmlsZWdlOgorCW1ycyByMCwgY29udHJvbAkJLyogcjAgPSBDT05UUk9MLiAqLworCW9yciByMCwgcjAsICMxCQkvKiByMCA9IHIwIHwgMS4gKi8KKwltc3IgY29udHJvbCwgcjAJCS8qIENPTlRST0wgPSByMC4gKi8KKwlieCBscgkJCQkvKiBSZXR1cm4gdG8gdGhlIGNhbGxlci4gKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiAJRU5ECi0KZGlmZiAtLWdpdCBhL1NvdXJjZS9wb3J0YWJsZS9JQVIvQVJNX0NNNF9NUFUvcG9ydG1hY3JvLmggYi9Tb3VyY2UvcG9ydGFibGUvSUFSL0FSTV9DTTRfTVBVL3BvcnRtYWNyby5oCmluZGV4IDU5ZDljOGIuLmVjZGQwY2YgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9wb3J0YWJsZS9JQVIvQVJNX0NNNF9NUFUvcG9ydG1hY3JvLmgKKysrIGIvU291cmNlL3BvcnRhYmxlL0lBUi9BUk1fQ000X01QVS9wb3J0bWFjcm8uaApAQCAtMSw2ICsxLDYgQEAKIC8qCi0gKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjAuMAotICogQ29weXJpZ2h0IChDKSAyMDE3IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRnJlZVJUT1MgS2VybmVsIFYxMC4yLjEKKyAqIENvcHlyaWdodCAoQykgMjAxOSBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCiAgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCiAgKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgpAQCAtMTAsOCArMTAsNyBAQAogICogc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAgKgogICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCi0gKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLiBJZiB5b3Ugd2lzaCB0byB1c2Ugb3VyIEFtYXpvbgotICogRnJlZVJUT1MgbmFtZSwgcGxlYXNlIGRvIHNvIGluIGEgZmFpciB1c2Ugd2F5IHRoYXQgZG9lcyBub3QgY2F1c2UgY29uZnVzaW9uLgorICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KICAqCiAgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgogICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MKQEAgLTE5MSwxMSArMTkwLDI4IEBACiAKIC8qIHBvcnROT1AoKSBpcyBub3QgcmVxdWlyZWQgYnkgdGhpcyBwb3J0LiAqLwogI2RlZmluZSBwb3J0Tk9QKCkKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCitleHRlcm4gQmFzZVR5cGVfdCB4SXNQcml2aWxlZ2VkKCB2b2lkICk7CitleHRlcm4gdm9pZCB2UmVzZXRQcml2aWxlZ2UoIHZvaWQgKTsKIAotLyogU2V0IHRoZSBwcml2aWxlZ2UgbGV2ZWwgdG8gdXNlciBtb2RlIGlmIHhSdW5uaW5nUHJpdmlsZWdlZCBpcyBmYWxzZS4gKi8KLXZvaWQgdlBvcnRSZXNldFByaXZpbGVnZSggQmFzZVR5cGVfdCB4UnVubmluZ1ByaXZpbGVnZWQgKTsKKy8qKgorICogQGJyaWVmIENoZWNrcyB3aGV0aGVyIG9yIG5vdCB0aGUgcHJvY2Vzc29yIGlzIHByaXZpbGVnZWQuCisgKgorICogQHJldHVybiAxIGlmIHRoZSBwcm9jZXNzb3IgaXMgYWxyZWFkeSBwcml2aWxlZ2VkLCAwIG90aGVyd2lzZS4KKyAqLworI2RlZmluZSBwb3J0SVNfUFJJVklMRUdFRCgpCQkJeElzUHJpdmlsZWdlZCgpCiAKKy8qKgorICogQGJyaWVmIFJhaXNlIGFuIFNWQyByZXF1ZXN0IHRvIHJhaXNlIHByaXZpbGVnZS4KKyovCisjZGVmaW5lIHBvcnRSQUlTRV9QUklWSUxFR0UoKQkJX19hc20gdm9sYXRpbGUgKCAic3ZjICUwIFxuIiA6OiAiaSIgKCBwb3J0U1ZDX1JBSVNFX1BSSVZJTEVHRSApIDogIm1lbW9yeSIgKTsKKworLyoqCisgKiBAYnJpZWYgTG93ZXJzIHRoZSBwcml2aWxlZ2UgbGV2ZWwgYnkgc2V0dGluZyB0aGUgYml0IDAgb2YgdGhlIENPTlRST0wKKyAqIHJlZ2lzdGVyLgorICovCisjZGVmaW5lIHBvcnRSRVNFVF9QUklWSUxFR0UoKQkJdlJlc2V0UHJpdmlsZWdlKCkKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiAvKiBTdXBwcmVzcyB3YXJuaW5ncyB0aGF0IGFyZSBnZW5lcmF0ZWQgYnkgdGhlIElBUiB0b29scywgYnV0IGNhbm5vdCBiZSBmaXhlZCBpbgpkaWZmIC0tZ2l0IGEvU291cmNlL3BvcnRhYmxlL0lBUi9BUk1fQ003L3IwcDEvcG9ydC5jIGIvU291cmNlL3BvcnRhYmxlL0lBUi9BUk1fQ003L3IwcDEvcG9ydC5jCmluZGV4IGVlODQ2ZGEuLjUwM2Y1ZGIgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9wb3J0YWJsZS9JQVIvQVJNX0NNNy9yMHAxL3BvcnQuYworKysgYi9Tb3VyY2UvcG9ydGFibGUvSUFSL0FSTV9DTTcvcjBwMS9wb3J0LmMKQEAgLTEsNiArMSw2IEBACiAvKgotICogRnJlZVJUT1MgS2VybmVsIFYxMC4wLjEKLSAqIENvcHlyaWdodCAoQykgMjAxNyBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMi4xCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgogICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgogICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KZGlmZiAtLWdpdCBhL1NvdXJjZS9wb3J0YWJsZS9JQVIvQVJNX0NNNy9yMHAxL3BvcnRhc20ucyBiL1NvdXJjZS9wb3J0YWJsZS9JQVIvQVJNX0NNNy9yMHAxL3BvcnRhc20ucwppbmRleCA1YjQ5MmYxLi5hZDgwNzBjIDEwMDY0NAotLS0gYS9Tb3VyY2UvcG9ydGFibGUvSUFSL0FSTV9DTTcvcjBwMS9wb3J0YXNtLnMKKysrIGIvU291cmNlL3BvcnRhYmxlL0lBUi9BUk1fQ003L3IwcDEvcG9ydGFzbS5zCkBAIC0xLDYgKzEsNiBAQAogLyoKLSAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMC4xCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjIuMQorICogQ29weXJpZ2h0IChDKSAyMDE5IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKICAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKICAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCmRpZmYgLS1naXQgYS9Tb3VyY2UvcG9ydGFibGUvSUFSL0FSTV9DTTcvcjBwMS9wb3J0bWFjcm8uaCBiL1NvdXJjZS9wb3J0YWJsZS9JQVIvQVJNX0NNNy9yMHAxL3BvcnRtYWNyby5oCmluZGV4IDIxMTQ2ZjQuLjlmM2MyNjEgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9wb3J0YWJsZS9JQVIvQVJNX0NNNy9yMHAxL3BvcnRtYWNyby5oCisrKyBiL1NvdXJjZS9wb3J0YWJsZS9JQVIvQVJNX0NNNy9yMHAxL3BvcnRtYWNyby5oCkBAIC0xLDYgKzEsNiBAQAogLyoKLSAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMC4xCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjIuMQorICogQ29weXJpZ2h0IChDKSAyMDE5IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKICAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKICAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCmRpZmYgLS1naXQgYS9Tb3VyY2UvcG9ydGFibGUvSUFSL0FSTV9DTTdfTVBVL3IwcDEvcG9ydC5jIGIvU291cmNlL3BvcnRhYmxlL0lBUi9BUk1fQ003X01QVS9yMHAxL3BvcnQuYwppbmRleCA0M2MxMjc4Li5iODg0YmEwIDEwMDY0NAotLS0gYS9Tb3VyY2UvcG9ydGFibGUvSUFSL0FSTV9DTTdfTVBVL3IwcDEvcG9ydC5jCisrKyBiL1NvdXJjZS9wb3J0YWJsZS9JQVIvQVJNX0NNN19NUFUvcjBwMS9wb3J0LmMKQEAgLTEsNiArMSw2IEBACiAvKgotICogRnJlZVJUT1MgS2VybmVsIFYxMC4wLjEKLSAqIENvcHlyaWdodCAoQykgMjAxNyBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMi4xCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgogICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgogICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KQEAgLTI5LDcgKzI5LDcgQEAKICAqIEltcGxlbWVudGF0aW9uIG9mIGZ1bmN0aW9ucyBkZWZpbmVkIGluIHBvcnRhYmxlLmggZm9yIHRoZSBBUk0gQ000RiBwb3J0LgogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotLyogQ29tcGlsZXIgaW5jbHVkZXMuICovCisvKiBJQVIgaW5jbHVkZXMuICovCiAjaW5jbHVkZSA8aW50cmluc2ljcy5oPgogCiAvKiBEZWZpbmluZyBNUFVfV1JBUFBFUlNfSU5DTFVERURfRlJPTV9BUElfRklMRSBwcmV2ZW50cyB0YXNrLmggZnJvbSByZWRlZmluaW5nCkBAIC00MiwxNiArNDIsMTUgQEAKICNpbmNsdWRlICJ0YXNrLmgiCiAKICN1bmRlZiBNUFVfV1JBUFBFUlNfSU5DTFVERURfRlJPTV9BUElfRklMRQorCiAjaWZuZGVmIF9fQVJNVkZQX18KIAkjZXJyb3IgVGhpcyBwb3J0IGNhbiBvbmx5IGJlIHVzZWQgd2hlbiB0aGUgcHJvamVjdCBvcHRpb25zIGFyZSBjb25maWd1cmVkIHRvIGVuYWJsZSBoYXJkd2FyZSBmbG9hdGluZyBwb2ludCBzdXBwb3J0LgogI2VuZGlmCiAKLSNpZiBjb25maWdNQVhfU1lTQ0FMTF9JTlRFUlJVUFRfUFJJT1JJVFkgPT0gMAorI2lmKCBjb25maWdNQVhfU1lTQ0FMTF9JTlRFUlJVUFRfUFJJT1JJVFkgPT0gMCApCiAJI2Vycm9yIGNvbmZpZ01BWF9TWVNDQUxMX0lOVEVSUlVQVF9QUklPUklUWSBtdXN0IG5vdCBiZSBzZXQgdG8gMC4gIFNlZSBodHRwOi8vd3d3LkZyZWVSVE9TLm9yZy9SVE9TLUNvcnRleC1NMy1NNC5odG1sCiAjZW5kaWYKIAotI3VuZGVmIE1QVV9XUkFQUEVSU19JTkNMVURFRF9GUk9NX0FQSV9GSUxFCi0KICNpZm5kZWYgY29uZmlnU1lTVElDS19DTE9DS19IWgogCSNkZWZpbmUgY29uZmlnU1lTVElDS19DTE9DS19IWiBjb25maWdDUFVfQ0xPQ0tfSFoKIAkvKiBFbnN1cmUgdGhlIFN5c1RpY2sgaXMgY2xvY2tlZCBhdCB0aGUgc2FtZSBmcmVxdWVuY3kgYXMgdGhlIGNvcmUuICovCkBAIC02MywzNiArNjIsMTMgQEAKICNlbmRpZgogCiAvKiBDb25zdGFudHMgcmVxdWlyZWQgdG8gbWFuaXB1bGF0ZSB0aGUgY29yZS4gIFJlZ2lzdGVycyBmaXJzdC4uLiAqLwotI2RlZmluZSBwb3J0TlZJQ19TWVNUSUNLX0NUUkxfUkVHCQkJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZTAxMCApICkKLSNkZWZpbmUgcG9ydE5WSUNfU1lTVElDS19MT0FEX1JFRwkJCSggKiAoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGUwMTQgKSApCi0jZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfQ1VSUkVOVF9WQUxVRV9SRUcJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZTAxOCApICkKLSNkZWZpbmUgcG9ydE5WSUNfU1lTUFJJMl9SRUcJCQkJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZWQyMCApICkKKyNkZWZpbmUgcG9ydE5WSUNfU1lTVElDS19DVFJMX1JFRwkJCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlMDEwICkgKQorI2RlZmluZSBwb3J0TlZJQ19TWVNUSUNLX0xPQURfUkVHCQkJCSggKiAoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGUwMTQgKSApCisjZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfQ1VSUkVOVF9WQUxVRV9SRUcJCSggKiAoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGUwMTggKSApCisjZGVmaW5lIHBvcnROVklDX1NZU1BSSTJfUkVHCQkJCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZDIwICkgKQogI2RlZmluZSBwb3J0TlZJQ19TWVNQUkkxX1JFRwkJCQkJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZWQxYyApICkKICNkZWZpbmUgcG9ydE5WSUNfU1lTX0NUUkxfU1RBVEVfUkVHCQkJCSggKiAoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVkMjQgKSApCiAjZGVmaW5lIHBvcnROVklDX01FTV9GQVVMVF9FTkFCTEUJCQkJKCAxVUwgPDwgMTZVTCApCi0vKiAuLi50aGVuIGJpdHMgaW4gdGhlIHJlZ2lzdGVycy4gKi8KLSNkZWZpbmUgcG9ydE5WSUNfU1lTVElDS19JTlRfQklUCQkJKCAxVUwgPDwgMVVMICkKLSNkZWZpbmUgcG9ydE5WSUNfU1lTVElDS19FTkFCTEVfQklUCQkJKCAxVUwgPDwgMFVMICkKLSNkZWZpbmUgcG9ydE5WSUNfU1lTVElDS19DT1VOVF9GTEFHX0JJVAkJKCAxVUwgPDwgMTZVTCApCi0jZGVmaW5lIHBvcnROVklDX1BFTkRTVkNMRUFSX0JJVCAJCQkoIDFVTCA8PCAyN1VMICkKLSNkZWZpbmUgcG9ydE5WSUNfUEVORF9TWVNUSUNLX0NMRUFSX0JJVAkJKCAxVUwgPDwgMjVVTCApCi0KLSNkZWZpbmUgcG9ydE5WSUNfUEVORFNWX1BSSQkJCQkJKCAoICggdWludDMyX3QgKSBjb25maWdLRVJORUxfSU5URVJSVVBUX1BSSU9SSVRZICkgPDwgMTZVTCApCi0jZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfUFJJCQkJCSggKCAoIHVpbnQzMl90ICkgY29uZmlnS0VSTkVMX0lOVEVSUlVQVF9QUklPUklUWSApIDw8IDI0VUwgKQotI2RlZmluZSBwb3J0TlZJQ19TVkNfUFJJCQkJCQkJKCAoICggdWludDMyX3QgKSBjb25maWdNQVhfU1lTQ0FMTF9JTlRFUlJVUFRfUFJJT1JJVFkgLSAxVUwgKSA8PCAyNFVMICkKLQotLyogQ29uc3RhbnRzIHJlcXVpcmVkIHRvIGNoZWNrIHRoZSB2YWxpZGl0eSBvZiBhbiBpbnRlcnJ1cHQgcHJpb3JpdHkuICovCi0jZGVmaW5lIHBvcnRGSVJTVF9VU0VSX0lOVEVSUlVQVF9OVU1CRVIJCSggMTYgKQotI2RlZmluZSBwb3J0TlZJQ19JUF9SRUdJU1RFUlNfT0ZGU0VUXzE2IAkoIDB4RTAwMEUzRjAgKQotI2RlZmluZSBwb3J0QUlSQ1JfUkVHCQkJCQkJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhFMDAwRUQwQyApICkKLSNkZWZpbmUgcG9ydE1BWF84X0JJVF9WQUxVRQkJCQkJKCAoIHVpbnQ4X3QgKSAweGZmICkKLSNkZWZpbmUgcG9ydFRPUF9CSVRfT0ZfQllURQkJCQkJKCAoIHVpbnQ4X3QgKSAweDgwICkKLSNkZWZpbmUgcG9ydE1BWF9QUklHUk9VUF9CSVRTCQkJCSggKCB1aW50OF90ICkgNyApCi0jZGVmaW5lIHBvcnRQUklPUklUWV9HUk9VUF9NQVNLCQkJCSggMHgwN1VMIDw8IDhVTCApCi0jZGVmaW5lIHBvcnRQUklHUk9VUF9TSElGVAkJCQkJKCA4VUwgKQotCi0vKiBNYXNrcyBvZmYgYWxsIGJpdHMgYnV0IHRoZSBWRUNUQUNUSVZFIGJpdHMgaW4gdGhlIElDU1IgcmVnaXN0ZXIuICovCi0jZGVmaW5lIHBvcnRWRUNUQUNUSVZFX01BU0sJCQkJCSggMHhGRlVMICkKIAogLyogQ29uc3RhbnRzIHJlcXVpcmVkIHRvIGFjY2VzcyBhbmQgbWFuaXB1bGF0ZSB0aGUgTVBVLiAqLwogI2RlZmluZSBwb3J0TVBVX1RZUEVfUkVHCQkJCQkJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZWQ5MCApICkKQEAgLTEwOCwxNSArODQsMzkgQEAKICNkZWZpbmUgcG9ydFBFUklQSEVSQUxTX1NUQVJUX0FERFJFU1MJCQkweDQwMDAwMDAwVUwKICNkZWZpbmUgcG9ydFBFUklQSEVSQUxTX0VORF9BRERSRVNTCQkJCTB4NUZGRkZGRkZVTAogCisvKiAuLi50aGVuIGJpdHMgaW4gdGhlIHJlZ2lzdGVycy4gKi8KKyNkZWZpbmUgcG9ydE5WSUNfU1lTVElDS19JTlRfQklUCQkJKCAxVUwgPDwgMVVMICkKKyNkZWZpbmUgcG9ydE5WSUNfU1lTVElDS19FTkFCTEVfQklUCQkJKCAxVUwgPDwgMFVMICkKKyNkZWZpbmUgcG9ydE5WSUNfU1lTVElDS19DT1VOVF9GTEFHX0JJVAkJKCAxVUwgPDwgMTZVTCApCisjZGVmaW5lIHBvcnROVklDX1BFTkRTVkNMRUFSX0JJVCAJCQkoIDFVTCA8PCAyN1VMICkKKyNkZWZpbmUgcG9ydE5WSUNfUEVORF9TWVNUSUNLX0NMRUFSX0JJVAkJKCAxVUwgPDwgMjVVTCApCisKKyNkZWZpbmUgcG9ydE5WSUNfUEVORFNWX1BSSQkJCQkJKCAoICggdWludDMyX3QgKSBjb25maWdLRVJORUxfSU5URVJSVVBUX1BSSU9SSVRZICkgPDwgMTZVTCApCisjZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfUFJJCQkJCSggKCAoIHVpbnQzMl90ICkgY29uZmlnS0VSTkVMX0lOVEVSUlVQVF9QUklPUklUWSApIDw8IDI0VUwgKQorI2RlZmluZSBwb3J0TlZJQ19TVkNfUFJJCQkJCQkoICggKCB1aW50MzJfdCApIGNvbmZpZ01BWF9TWVNDQUxMX0lOVEVSUlVQVF9QUklPUklUWSAtIDFVTCApIDw8IDI0VUwgKQorCisvKiBDb25zdGFudHMgcmVxdWlyZWQgdG8gY2hlY2sgdGhlIHZhbGlkaXR5IG9mIGFuIGludGVycnVwdCBwcmlvcml0eS4gKi8KKyNkZWZpbmUgcG9ydEZJUlNUX1VTRVJfSU5URVJSVVBUX05VTUJFUgkJKCAxNiApCisjZGVmaW5lIHBvcnROVklDX0lQX1JFR0lTVEVSU19PRkZTRVRfMTYgCSggMHhFMDAwRTNGMCApCisjZGVmaW5lIHBvcnRBSVJDUl9SRUcJCQkJCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweEUwMDBFRDBDICkgKQorI2RlZmluZSBwb3J0TUFYXzhfQklUX1ZBTFVFCQkJCQkoICggdWludDhfdCApIDB4ZmYgKQorI2RlZmluZSBwb3J0VE9QX0JJVF9PRl9CWVRFCQkJCQkoICggdWludDhfdCApIDB4ODAgKQorI2RlZmluZSBwb3J0TUFYX1BSSUdST1VQX0JJVFMJCQkJKCAoIHVpbnQ4X3QgKSA3ICkKKyNkZWZpbmUgcG9ydFBSSU9SSVRZX0dST1VQX01BU0sJCQkJKCAweDA3VUwgPDwgOFVMICkKKyNkZWZpbmUgcG9ydFBSSUdST1VQX1NISUZUCQkJCQkoIDhVTCApCisKKy8qIE1hc2tzIG9mZiBhbGwgYml0cyBidXQgdGhlIFZFQ1RBQ1RJVkUgYml0cyBpbiB0aGUgSUNTUiByZWdpc3Rlci4gKi8KKyNkZWZpbmUgcG9ydFZFQ1RBQ1RJVkVfTUFTSwkJCQkJKCAweEZGVUwgKQorCiAvKiBDb25zdGFudHMgcmVxdWlyZWQgdG8gbWFuaXB1bGF0ZSB0aGUgVkZQLiAqLwogI2RlZmluZSBwb3J0RlBDQ1IJCQkJCQkJKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZjM0ICkgLyogRmxvYXRpbmcgcG9pbnQgY29udGV4dCBjb250cm9sIHJlZ2lzdGVyLiAqLwogI2RlZmluZSBwb3J0QVNQRU5fQU5EX0xTUEVOX0JJVFMJCQkoIDB4M1VMIDw8IDMwVUwgKQogCiAvKiBDb25zdGFudHMgcmVxdWlyZWQgdG8gc2V0IHVwIHRoZSBpbml0aWFsIHN0YWNrLiAqLwotI2RlZmluZSBwb3J0SU5JVElBTF9YUFNSCQkJCQkJKCAweDAxMDAwMDAwVUwgKQotI2RlZmluZSBwb3J0SU5JVElBTF9FWEVDX1JFVFVSTgkJCQkJKCAweGZmZmZmZmZkVUwgKQotI2RlZmluZSBwb3J0SU5JVElBTF9DT05UUk9MX0lGX1VOUFJJVklMRUdFRAkJKCAweDAzICkKLSNkZWZpbmUgcG9ydElOSVRJQUxfQ09OVFJPTF9JRl9QUklWSUxFR0VECQkoIDB4MDIgKQorI2RlZmluZSBwb3J0SU5JVElBTF9YUFNSCQkJCQkoIDB4MDEwMDAwMDAgKQorI2RlZmluZSBwb3J0SU5JVElBTF9FWENfUkVUVVJOCQkJCSggMHhmZmZmZmZmZCApCisjZGVmaW5lIHBvcnRJTklUSUFMX0NPTlRST0xfSUZfVU5QUklWSUxFR0VECSggMHgwMyApCisjZGVmaW5lIHBvcnRJTklUSUFMX0NPTlRST0xfSUZfUFJJVklMRUdFRAkoIDB4MDIgKQogCiAvKiBPZmZzZXRzIGluIHRoZSBzdGFjayB0byB0aGUgcGFyYW1ldGVycyB3aGVuIGluc2lkZSB0aGUgU1ZDIGhhbmRsZXIuICovCiAjZGVmaW5lIHBvcnRPRkZTRVRfVE9fUEMJCQkJCQkoIDYgKQpAQCAtMTMzLDkgKzEzMywxNyBAQAogaGF2ZSBiaXQtMCBjbGVhciwgYXMgaXQgaXMgbG9hZGVkIGludG8gdGhlIFBDIG9uIGV4aXQgZnJvbSBhbiBJU1IuICovCiAjZGVmaW5lIHBvcnRTVEFSVF9BRERSRVNTX01BU0sJCQkJKCAoIFN0YWNrVHlwZV90ICkgMHhmZmZmZmZmZVVMICkKIAotLyogRWFjaCB0YXNrIG1haW50YWlucyBpdHMgb3duIGludGVycnVwdCBzdGF0dXMgaW4gdGhlIGNyaXRpY2FsIG5lc3RpbmcKLXZhcmlhYmxlLiAqLwotc3RhdGljIFVCYXNlVHlwZV90IHV4Q3JpdGljYWxOZXN0aW5nID0gMHhhYWFhYWFhYTsKKy8qCisgKiBDb25maWd1cmUgYSBudW1iZXIgb2Ygc3RhbmRhcmQgTVBVIHJlZ2lvbnMgdGhhdCBhcmUgdXNlZCBieSBhbGwgdGFza3MuCisgKi8KK3N0YXRpYyB2b2lkIHBydlNldHVwTVBVKCB2b2lkICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworLyoKKyAqIFJldHVybiB0aGUgc21hbGxlc3QgTVBVIHJlZ2lvbiBzaXplIHRoYXQgYSBnaXZlbiBudW1iZXIgb2YgYnl0ZXMgd2lsbCBmaXQKKyAqIGludG8uICBUaGUgcmVnaW9uIHNpemUgaXMgcmV0dXJuZWQgYXMgdGhlIHZhbHVlIHRoYXQgc2hvdWxkIGJlIHByb2dyYW1tZWQKKyAqIGludG8gdGhlIHJlZ2lvbiBhdHRyaWJ1dGUgcmVnaXN0ZXIgZm9yIHRoYXQgcmVnaW9uLgorICovCitzdGF0aWMgdWludDMyX3QgcHJ2R2V0TVBVUmVnaW9uU2l6ZVNldHRpbmcoIHVpbnQzMl90IHVsQWN0dWFsU2l6ZUluQnl0ZXMgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOwogCiAvKgogICogU2V0dXAgdGhlIHRpbWVyIHRvIGdlbmVyYXRlIHRoZSB0aWNrIGludGVycnVwdHMuICBUaGUgaW1wbGVtZW50YXRpb24gaW4gdGhpcwpAQCAtMTQ1LDU2ICsxNTMsNjMgQEAKIHZvaWQgdlBvcnRTZXR1cFRpbWVySW50ZXJydXB0KCB2b2lkICk7CiAKIC8qCi0gKiBDb25maWd1cmUgYSBudW1iZXIgb2Ygc3RhbmRhcmQgTVBVIHJlZ2lvbnMgdGhhdCBhcmUgdXNlZCBieSBhbGwgdGFza3MuCi0gKi8KLVBSSVZJTEVHRURfRlVOQ1RJT04gc3RhdGljIHZvaWQgcHJ2U2V0dXBNUFUoIHZvaWQgKTsKLQotLyoKLSAqIFJldHVybiB0aGUgc21hbGxlc3QgTVBVIHJlZ2lvbiBzaXplIHRoYXQgYSBnaXZlbiBudW1iZXIgb2YgYnl0ZXMgd2lsbCBmaXQKLSAqIGludG8uICBUaGUgcmVnaW9uIHNpemUgaXMgcmV0dXJuZWQgYXMgdGhlIHZhbHVlIHRoYXQgc2hvdWxkIGJlIHByb2dyYW1tZWQKLSAqIGludG8gdGhlIHJlZ2lvbiBhdHRyaWJ1dGUgcmVnaXN0ZXIgZm9yIHRoYXQgcmVnaW9uLgotICovCi1QUklWSUxFR0VEX0ZVTkNUSU9OIHN0YXRpYyB1aW50MzJfdCBwcnZHZXRNUFVSZWdpb25TaXplU2V0dGluZyggdWludDMyX3QgdWxBY3R1YWxTaXplSW5CeXRlcyApOwotCi0vKgogICogRXhjZXB0aW9uIGhhbmRsZXJzLgogICovCi12b2lkIHhQb3J0U3lzVGlja0hhbmRsZXIoIHZvaWQgKTsKK3ZvaWQgeFBvcnRTeXNUaWNrSGFuZGxlciggdm9pZCApIFBSSVZJTEVHRURfRlVOQ1RJT047CiAKIC8qCiAgKiBTdGFydCBmaXJzdCB0YXNrIGlzIGEgc2VwYXJhdGUgZnVuY3Rpb24gc28gaXQgY2FuIGJlIHRlc3RlZCBpbiBpc29sYXRpb24uCiAgKi8KLWV4dGVybiB2b2lkIHZQb3J0U3RhcnRGaXJzdFRhc2soIHZvaWQgKTsKLQotZXh0ZXJuIHZvaWQgdlJlc3RvcmVDb250ZXh0T2ZGaXJzdFRhc2soIHZvaWQgKTsKK2V4dGVybiB2b2lkIHZQb3J0U3RhcnRGaXJzdFRhc2soIHZvaWQgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOwogCiAvKgogICogVHVybiB0aGUgVkZQIG9uLgogICovCiBleHRlcm4gdm9pZCB2UG9ydEVuYWJsZVZGUCggdm9pZCApOwogCisvKgorICogVGhlIEMgcG9ydGlvbiBvZiB0aGUgU1ZDIGhhbmRsZXIuCisgKi8KK3ZvaWQgdlBvcnRTVkNIYW5kbGVyX0MoIHVpbnQzMl90ICpwdWxQYXJhbSApOworCisvKgorICogQ2FsbGVkIGZyb20gdGhlIFNWQyBoYW5kbGVyIHVzZWQgdG8gc3RhcnQgdGhlIHNjaGVkdWxlci4KKyAqLworZXh0ZXJuIHZvaWQgdlBvcnRSZXN0b3JlQ29udGV4dE9mRmlyc3RUYXNrKCB2b2lkICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKworLyoqCisgKiBAYnJpZWYgQ2FsbHMgdGhlIHBvcnQgc3BlY2lmaWMgY29kZSB0byByYWlzZSB0aGUgcHJpdmlsZWdlLgorICoKKyAqIEByZXR1cm4gcGRGQUxTRSBpZiBwcml2aWxlZ2Ugd2FzIHJhaXNlZCwgcGRUUlVFIG90aGVyd2lzZS4KKyAqLworZXh0ZXJuIEJhc2VUeXBlX3QgeFBvcnRSYWlzZVByaXZpbGVnZSggdm9pZCApOworCisvKioKKyAqIEBicmllZiBJZiB4UnVubmluZ1ByaXZpbGVnZWQgaXMgbm90IHBkVFJVRSwgY2FsbHMgdGhlIHBvcnQgc3BlY2lmaWMKKyAqIGNvZGUgdG8gcmVzZXQgdGhlIHByaXZpbGVnZSwgb3RoZXJ3aXNlIGRvZXMgbm90aGluZy4KKyAqLworZXh0ZXJuIHZvaWQgdlBvcnRSZXNldFByaXZpbGVnZSggQmFzZVR5cGVfdCB4UnVubmluZ1ByaXZpbGVnZWQgKTsKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCisvKiBFYWNoIHRhc2sgbWFpbnRhaW5zIGl0cyBvd24gaW50ZXJydXB0IHN0YXR1cyBpbiB0aGUgY3JpdGljYWwgbmVzdGluZwordmFyaWFibGUuICovCitzdGF0aWMgVUJhc2VUeXBlX3QgdXhDcml0aWNhbE5lc3RpbmcgPSAweGFhYWFhYWFhOworCisjaWYoIGNvbmZpZ1VTRV9USUNLTEVTU19JRExFID09IDEgKQogLyoKICAqIFRoZSBudW1iZXIgb2YgU3lzVGljayBpbmNyZW1lbnRzIHRoYXQgbWFrZSB1cCBvbmUgdGljayBwZXJpb2QuCiAgKi8KLSNpZiBjb25maWdVU0VfVElDS0xFU1NfSURMRSA9PSAxCiAJc3RhdGljIHVpbnQzMl90IHVsVGltZXJDb3VudHNGb3JPbmVUaWNrID0gMDsKLSNlbmRpZiAvKiBjb25maWdVU0VfVElDS0xFU1NfSURMRSAqLwotCiAvKgogICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHRpY2sgcGVyaW9kcyB0aGF0IGNhbiBiZSBzdXBwcmVzc2VkIGlzIGxpbWl0ZWQgYnkgdGhlCiAgKiAyNCBiaXQgcmVzb2x1dGlvbiBvZiB0aGUgU3lzVGljayB0aW1lci4KICAqLwotI2lmIGNvbmZpZ1VTRV9USUNLTEVTU19JRExFID09IDEKIAlzdGF0aWMgdWludDMyX3QgeE1heGltdW1Qb3NzaWJsZVN1cHByZXNzZWRUaWNrcyA9IDA7Ci0jZW5kaWYgLyogY29uZmlnVVNFX1RJQ0tMRVNTX0lETEUgKi8KIAogLyoKICAqIENvbXBlbnNhdGUgZm9yIHRoZSBDUFUgY3ljbGVzIHRoYXQgcGFzcyB3aGlsZSB0aGUgU3lzVGljayBpcyBzdG9wcGVkIChsb3cKICAqIHBvd2VyIGZ1bmN0aW9uYWxpdHkgb25seS4KICAqLwotI2lmIGNvbmZpZ1VTRV9USUNLTEVTU19JRExFID09IDEKIAlzdGF0aWMgdWludDMyX3QgdWxTdG9wcGVkVGltZXJDb21wZW5zYXRpb24gPSAwOwogI2VuZGlmIC8qIGNvbmZpZ1VTRV9USUNLTEVTU19JRExFICovCiAKQEAgLTIwMyw3ICsyMTgsNyBAQAogICogRnJlZVJUT1MgQVBJIGZ1bmN0aW9ucyBhcmUgbm90IGNhbGxlZCBmcm9tIGludGVycnVwdHMgdGhhdCBoYXZlIGJlZW4gYXNzaWduZWQKICAqIGEgcHJpb3JpdHkgYWJvdmUgY29uZmlnTUFYX1NZU0NBTExfSU5URVJSVVBUX1BSSU9SSVRZLgogICovCi0jaWYgKCBjb25maWdBU1NFUlRfREVGSU5FRCA9PSAxICkKKyNpZiggY29uZmlnQVNTRVJUX0RFRklORUQgPT0gMSApCiAJIHN0YXRpYyB1aW50OF90IHVjTWF4U3lzQ2FsbFByaW9yaXR5ID0gMDsKIAkgc3RhdGljIHVpbnQzMl90IHVsTWF4UFJJR1JPVVBWYWx1ZSA9IDA7CiAJIHN0YXRpYyBjb25zdCB2b2xhdGlsZSB1aW50OF90ICogY29uc3QgcGNJbnRlcnJ1cHRQcmlvcml0eVJlZ2lzdGVycyA9ICggY29uc3Qgdm9sYXRpbGUgdWludDhfdCAqIGNvbnN0ICkgcG9ydE5WSUNfSVBfUkVHSVNURVJTX09GRlNFVF8xNjsKQEAgLTIzNiw2MSArMjUxLDU5IEBACiAJLyogQSBzYXZlIG1ldGhvZCBpcyBiZWluZyB1c2VkIHRoYXQgcmVxdWlyZXMgZWFjaCB0YXNrIHRvIG1haW50YWluIGl0cwogCW93biBleGVjIHJldHVybiB2YWx1ZS4gKi8KIAlweFRvcE9mU3RhY2stLTsKLQkqcHhUb3BPZlN0YWNrID0gcG9ydElOSVRJQUxfRVhFQ19SRVRVUk47Ci0gICAgICAgIAorCSpweFRvcE9mU3RhY2sgPSBwb3J0SU5JVElBTF9FWENfUkVUVVJOOworCiAJcHhUb3BPZlN0YWNrIC09IDk7CS8qIFIxMSwgUjEwLCBSOSwgUjgsIFI3LCBSNiwgUjUgYW5kIFI0LiAqLwotICAgICAgICAKLSAgICAgICAgaWYoIHhSdW5Qcml2aWxlZ2VkID09IHBkVFJVRSApCisKKwlpZiggeFJ1blByaXZpbGVnZWQgPT0gcGRUUlVFICkKIAl7Ci0gICAgICAgICAgKnB4VG9wT2ZTdGFjayA9IHBvcnRJTklUSUFMX0NPTlRST0xfSUZfUFJJVklMRUdFRDsKKwkJKnB4VG9wT2ZTdGFjayA9IHBvcnRJTklUSUFMX0NPTlRST0xfSUZfUFJJVklMRUdFRDsKIAl9CiAJZWxzZQogCXsKLSAgICAgICAgICAqcHhUb3BPZlN0YWNrID0gcG9ydElOSVRJQUxfQ09OVFJPTF9JRl9VTlBSSVZJTEVHRUQ7CisJCSpweFRvcE9mU3RhY2sgPSBwb3J0SU5JVElBTF9DT05UUk9MX0lGX1VOUFJJVklMRUdFRDsKIAl9Ci0gICAgICAgIAorCiAJcmV0dXJuIHB4VG9wT2ZTdGFjazsKIH0KLQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIHZTVkNIYW5kbGVyKCB1aW50MzJfdCAqcHVsUGFyYW0gKQorCit2b2lkIHZQb3J0U1ZDSGFuZGxlcl9DKCB1aW50MzJfdCAqcHVsUGFyYW0gKQogewogdWludDhfdCB1Y1NWQ051bWJlcjsKLXVpbnQzMl90IHVsUmVnOwogCiAJLyogVGhlIHN0YWNrIGNvbnRhaW5zOiByMCwgcjEsIHIyLCByMywgcjEyLCByMTQsIHRoZSByZXR1cm4gYWRkcmVzcyBhbmQKIAl4UFNSLiAgVGhlIGZpcnN0IGFyZ3VtZW50IChyMCkgaXMgcHVsUGFyYW1bIDAgXS4gKi8KIAl1Y1NWQ051bWJlciA9ICggKCB1aW50OF90ICogKSBwdWxQYXJhbVsgcG9ydE9GRlNFVF9UT19QQyBdIClbIC0yIF07CiAJc3dpdGNoKCB1Y1NWQ051bWJlciApCiAJewotCQljYXNlIHBvcnRTVkNfU1RBUlRfU0NIRURVTEVSIDoJCi0gICAgICAgICAgICAgICAgICBwb3J0TlZJQ19TWVNQUkkxX1JFRyB8PSBwb3J0TlZJQ19TVkNfUFJJOwotCQkgIHZSZXN0b3JlQ29udGV4dE9mRmlyc3RUYXNrKCk7Ci0JCSBicmVhazsKKwkJY2FzZSBwb3J0U1ZDX1NUQVJUX1NDSEVEVUxFUgk6CXBvcnROVklDX1NZU1BSSTFfUkVHIHw9IHBvcnROVklDX1NWQ19QUkk7CisJCQkJCQkJCQkJCXZQb3J0UmVzdG9yZUNvbnRleHRPZkZpcnN0VGFzaygpOworCQkJCQkJCQkJCQlicmVhazsKIAotCQljYXNlIHBvcnRTVkNfWUlFTEQgOgotICAgICAgICAgICAgICAgICAgcG9ydE5WSUNfSU5UX0NUUkxfUkVHID0gcG9ydE5WSUNfUEVORFNWU0VUX0JJVDsKLQkJICAvKiBCYXJyaWVycyBhcmUgbm9ybWFsbHkgbm90IHJlcXVpcmVkCi0JCSAgICAgYnV0IGRvIGVuc3VyZSB0aGUgY29kZSBpcyBjb21wbGV0ZWx5Ci0JCSAgICAgd2l0aGluIHRoZSBzcGVjaWZpZWQgYmVoYXZpb3VyIGZvciB0aGUKLQkJICAgICBhcmNoaXRlY3R1cmUuICovCi0JCSAgX19EU0IoKTsKLQkJICBfX0lTQigpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7CisJCWNhc2UgcG9ydFNWQ19ZSUVMRAkJCQk6CXBvcnROVklDX0lOVF9DVFJMX1JFRyA9IHBvcnROVklDX1BFTkRTVlNFVF9CSVQ7CisJCQkJCQkJCQkJCS8qIEJhcnJpZXJzIGFyZSBub3JtYWxseSBub3QgcmVxdWlyZWQKKwkJCQkJCQkJCQkJYnV0IGRvIGVuc3VyZSB0aGUgY29kZSBpcyBjb21wbGV0ZWx5CisJCQkJCQkJCQkJCXdpdGhpbiB0aGUgc3BlY2lmaWVkIGJlaGF2aW91ciBmb3IgdGhlCisJCQkJCQkJCQkJCWFyY2hpdGVjdHVyZS4gKi8KKwkJCQkJCQkJCQkJX19hc20gdm9sYXRpbGUoICJkc2IiIDo6OiAibWVtb3J5IiApOworCQkJCQkJCQkJCQlfX2FzbSB2b2xhdGlsZSggImlzYiIgKTsKIAotCQljYXNlIHBvcnRTVkNfUkFJU0VfUFJJVklMRUdFIDoKKwkJCQkJCQkJCQkJYnJlYWs7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bFJlZyA9IF9fZ2V0X0NPTlRST0woKTsKLSAgICAgICAgICB1bFJlZyAmPSAweEZGRkZGRkZFOwotICAgICAgICAgIF9fc2V0X0NPTlRST0wodWxSZWcpOwotICAgICAgICAgICAgICAgICAgCi0JCWJyZWFrOworCQljYXNlIHBvcnRTVkNfUkFJU0VfUFJJVklMRUdFCToJX19hc20gdm9sYXRpbGUKKwkJCQkJCQkJCQkJKAorCQkJCQkJCQkJCQkJIgltcnMgcjEsIGNvbnRyb2wJCVxuIiAvKiBPYnRhaW4gY3VycmVudCBjb250cm9sIHZhbHVlLiAqLworCQkJCQkJCQkJCQkJIgliaWMgcjEsIHIxLCAjMQkJXG4iIC8qIFNldCBwcml2aWxlZ2UgYml0LiAqLworCQkJCQkJCQkJCQkJIgltc3IgY29udHJvbCwgcjEJCVxuIiAvKiBXcml0ZSBiYWNrIG5ldyBjb250cm9sIHZhbHVlLiAqLworCQkJCQkJCQkJCQkJOjo6ICJyMSIsICJtZW1vcnkiCisJCQkJCQkJCQkJCSk7CisJCQkJCQkJCQkJCWJyZWFrOwogCi0JCWRlZmF1bHQJOgkvKiBVbmtub3duIFNWQyBjYWxsLiAqLwotICAgICAgICAgICAgICAgIGJyZWFrOworCQlkZWZhdWx0CQkJCQkJCToJLyogVW5rbm93biBTVkMgY2FsbC4gKi8KKwkJCQkJCQkJCQkJYnJlYWs7CiAJfQogfQotCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogLyoKQEAgLTI5OCw2ICszMTEsMTAgQEAKICAqLwogQmFzZVR5cGVfdCB4UG9ydFN0YXJ0U2NoZWR1bGVyKCB2b2lkICkKIHsKKwkvKiBjb25maWdNQVhfU1lTQ0FMTF9JTlRFUlJVUFRfUFJJT1JJVFkgbXVzdCBub3QgYmUgc2V0IHRvIDAuCisJU2VlIGh0dHA6Ly93d3cuRnJlZVJUT1Mub3JnL1JUT1MtQ29ydGV4LU0zLU00Lmh0bWwgKi8KKwljb25maWdBU1NFUlQoIGNvbmZpZ01BWF9TWVNDQUxMX0lOVEVSUlVQVF9QUklPUklUWSApOworCiAJI2lmKCBjb25maWdBU1NFUlRfREVGSU5FRCA9PSAxICkKIAl7CiAJCXZvbGF0aWxlIHVpbnQzMl90IHVsT3JpZ2luYWxQcmlvcml0eTsKQEAgLTMzMSw2ICszNDgsMjQgQEAKIAkJCXVjTWF4UHJpb3JpdHlWYWx1ZSA8PD0gKCB1aW50OF90ICkgMHgwMTsKIAkJfQogCisJCSNpZmRlZiBfX05WSUNfUFJJT19CSVRTCisJCXsKKwkJCS8qIENoZWNrIHRoZSBDTVNJUyBjb25maWd1cmF0aW9uIHRoYXQgZGVmaW5lcyB0aGUgbnVtYmVyIG9mCisJCQlwcmlvcml0eSBiaXRzIG1hdGNoZXMgdGhlIG51bWJlciBvZiBwcmlvcml0eSBiaXRzIGFjdHVhbGx5IHF1ZXJpZWQKKwkJCWZyb20gdGhlIGhhcmR3YXJlLiAqLworCQkJY29uZmlnQVNTRVJUKCAoIHBvcnRNQVhfUFJJR1JPVVBfQklUUyAtIHVsTWF4UFJJR1JPVVBWYWx1ZSApID09IF9fTlZJQ19QUklPX0JJVFMgKTsKKwkJfQorCQkjZW5kaWYKKworCQkjaWZkZWYgY29uZmlnUFJJT19CSVRTCisJCXsKKwkJCS8qIENoZWNrIHRoZSBGcmVlUlRPUyBjb25maWd1cmF0aW9uIHRoYXQgZGVmaW5lcyB0aGUgbnVtYmVyIG9mCisJCQlwcmlvcml0eSBiaXRzIG1hdGNoZXMgdGhlIG51bWJlciBvZiBwcmlvcml0eSBiaXRzIGFjdHVhbGx5IHF1ZXJpZWQKKwkJCWZyb20gdGhlIGhhcmR3YXJlLiAqLworCQkJY29uZmlnQVNTRVJUKCAoIHBvcnRNQVhfUFJJR1JPVVBfQklUUyAtIHVsTWF4UFJJR1JPVVBWYWx1ZSApID09IGNvbmZpZ1BSSU9fQklUUyApOworCQl9CisJCSNlbmRpZgorCiAJCS8qIFNoaWZ0IHRoZSBwcmlvcml0eSBncm91cCB2YWx1ZSBiYWNrIHRvIGl0cyBwb3NpdGlvbiB3aXRoaW4gdGhlIEFJUkNSCiAJCXJlZ2lzdGVyLiAqLwogCQl1bE1heFBSSUdST1VQVmFsdWUgPDw9IHBvcnRQUklHUk9VUF9TSElGVDsKQEAgLTM0NSw3ICszODAsNyBAQAogCS8qIE1ha2UgUGVuZFNWIGFuZCBTeXNUaWNrIHRoZSBsb3dlc3QgcHJpb3JpdHkgaW50ZXJydXB0cy4gKi8KIAlwb3J0TlZJQ19TWVNQUkkyX1JFRyB8PSBwb3J0TlZJQ19QRU5EU1ZfUFJJOwogCXBvcnROVklDX1NZU1BSSTJfUkVHIHw9IHBvcnROVklDX1NZU1RJQ0tfUFJJOwotICAgICAgICAKKwogCS8qIENvbmZpZ3VyZSB0aGUgcmVnaW9ucyBpbiB0aGUgTVBVIHRoYXQgYXJlIGNvbW1vbiB0byBhbGwgdGFza3MuICovCiAJcHJ2U2V0dXBNUFUoKTsKIApAQCAtMzgwLDkgKzQxNSwxMyBAQAogCiB2b2lkIHZQb3J0RW50ZXJDcml0aWNhbCggdm9pZCApCiB7CisgQmFzZVR5cGVfdCB4UnVubmluZ1ByaXZpbGVnZWQgPSB4UG9ydFJhaXNlUHJpdmlsZWdlKCk7CisKIAlwb3J0RElTQUJMRV9JTlRFUlJVUFRTKCk7CiAJdXhDcml0aWNhbE5lc3RpbmcrKzsKIAorCXZQb3J0UmVzZXRQcml2aWxlZ2UoIHhSdW5uaW5nUHJpdmlsZWdlZCApOworCiAJLyogVGhpcyBpcyBub3QgdGhlIGludGVycnVwdCBzYWZlIHZlcnNpb24gb2YgdGhlIGVudGVyIGNyaXRpY2FsIGZ1bmN0aW9uIHNvCiAJYXNzZXJ0KCkgaWYgaXQgaXMgYmVpbmcgY2FsbGVkIGZyb20gYW4gaW50ZXJydXB0IGNvbnRleHQuICBPbmx5IEFQSQogCWZ1bmN0aW9ucyB0aGF0IGVuZCBpbiAiRnJvbUlTUiIgY2FuIGJlIHVzZWQgaW4gYW4gaW50ZXJydXB0LiAgT25seSBhc3NlcnQgaWYKQEAgLTM5NywxMiArNDM2LDE3IEBACiAKIHZvaWQgdlBvcnRFeGl0Q3JpdGljYWwoIHZvaWQgKQogeworQmFzZVR5cGVfdCB4UnVubmluZ1ByaXZpbGVnZWQgPSB4UG9ydFJhaXNlUHJpdmlsZWdlKCk7CisKIAljb25maWdBU1NFUlQoIHV4Q3JpdGljYWxOZXN0aW5nICk7CisKIAl1eENyaXRpY2FsTmVzdGluZy0tOwogCWlmKCB1eENyaXRpY2FsTmVzdGluZyA9PSAwICkKIAl7CiAJCXBvcnRFTkFCTEVfSU5URVJSVVBUUygpOwogCX0KKworCXZQb3J0UmVzZXRQcml2aWxlZ2UoIHhSdW5uaW5nUHJpdmlsZWdlZCApOwogfQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKQEAgLTQyNCwyNCArNDY4LDkgQEAKIAl9CiAJcG9ydEVOQUJMRV9JTlRFUlJVUFRTKCk7CiB9Ci0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi12b2lkIHZQb3J0UmVzZXRQcml2aWxlZ2UoIEJhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkICkKLXsKLXVpbnQzMl90IHVsUmVnOwotCQotCWlmKCB4UnVubmluZ1ByaXZpbGVnZWQgIT0gcGRUUlVFICkgCi0JewotICAgICAgICAgIHVsUmVnID0gX19nZXRfQ09OVFJPTCgpOwotICAgICAgICAgIHVsUmVnIHw9IDB4MTsKLSAgICAgICAgICBfX3NldF9DT05UUk9MKHVsUmVnKTsKLQl9Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWYgY29uZmlnVVNFX1RJQ0tMRVNTX0lETEUgPT0gMQorI2lmKCBjb25maWdVU0VfVElDS0xFU1NfSURMRSA9PSAxICkKIAogCV9fd2VhayB2b2lkIHZQb3J0U3VwcHJlc3NUaWNrc0FuZFNsZWVwKCBUaWNrVHlwZV90IHhFeHBlY3RlZElkbGVUaW1lICkKIAl7CkBAIC01OTQsNyArNjIzLDYgQEAKIAl9CiAKICNlbmRpZiAvKiAjaWYgY29uZmlnVVNFX1RJQ0tMRVNTX0lETEUgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiAvKgogICogU2V0dXAgdGhlIHN5c3RpY2sgdGltZXIgdG8gZ2VuZXJhdGUgdGhlIHRpY2sgaW50ZXJydXB0cyBhdCB0aGUgcmVxdWlyZWQKQEAgLTYwMiwxNCArNjMwLDE4IEBACiAgKi8KIF9fd2VhayB2b2lkIHZQb3J0U2V0dXBUaW1lckludGVycnVwdCggdm9pZCApCiB7CisJLyogU3RvcCBhbmQgY2xlYXIgdGhlIFN5c1RpY2suICovCisJcG9ydE5WSUNfU1lTVElDS19DVFJMX1JFRyA9IDBVTDsKKwlwb3J0TlZJQ19TWVNUSUNLX0NVUlJFTlRfVkFMVUVfUkVHID0gMFVMOworCiAJLyogQ2FsY3VsYXRlIHRoZSBjb25zdGFudHMgcmVxdWlyZWQgdG8gY29uZmlndXJlIHRoZSB0aWNrIGludGVycnVwdC4gKi8KLQkjaWYoIGNvbmZpZ1VTRV9USUNLTEVTU19JRExFID09IDEgKQorI2lmKCBjb25maWdVU0VfVElDS0xFU1NfSURMRSA9PSAxICkKIAl7CiAJCXVsVGltZXJDb3VudHNGb3JPbmVUaWNrID0gKCBjb25maWdTWVNUSUNLX0NMT0NLX0haIC8gY29uZmlnVElDS19SQVRFX0haICk7CiAJCXhNYXhpbXVtUG9zc2libGVTdXBwcmVzc2VkVGlja3MgPSBwb3J0TUFYXzI0X0JJVF9OVU1CRVIgLyB1bFRpbWVyQ291bnRzRm9yT25lVGljazsKIAkJdWxTdG9wcGVkVGltZXJDb21wZW5zYXRpb24gPSBwb3J0TUlTU0VEX0NPVU5UU19GQUNUT1IgLyAoIGNvbmZpZ0NQVV9DTE9DS19IWiAvIGNvbmZpZ1NZU1RJQ0tfQ0xPQ0tfSFogKTsKIAl9Ci0JI2VuZGlmIC8qIGNvbmZpZ1VTRV9USUNLTEVTU19JRExFICovCisjZW5kaWYgLyogY29uZmlnVVNFX1RJQ0tMRVNTX0lETEUgKi8KIAogCS8qIENvbmZpZ3VyZSBTeXNUaWNrIHRvIGludGVycnVwdCBhdCB0aGUgcmVxdWVzdGVkIHJhdGUuICovCiAJcG9ydE5WSUNfU1lTVElDS19MT0FEX1JFRyA9ICggY29uZmlnU1lTVElDS19DTE9DS19IWiAvIGNvbmZpZ1RJQ0tfUkFURV9IWiApIC0gMVVMOwpAQCAtNjI1LDYgKzY1Nyw5IEBACiBleHRlcm4gdWludDMyX3QgX19wcml2aWxlZ2VkX2RhdGFfc3RhcnRfXzsKIGV4dGVybiB1aW50MzJfdCBfX3ByaXZpbGVnZWRfZGF0YV9lbmRfXzsKIAorCS8qIENoZWNrIHRoZSBleHBlY3RlZCBNUFUgaXMgcHJlc2VudC4gKi8KKwlpZiggcG9ydE1QVV9UWVBFX1JFRyA9PSBwb3J0RVhQRUNURURfTVBVX1RZUEVfVkFMVUUgKQorCXsKIAkJLyogRmlyc3Qgc2V0dXAgdGhlIGVudGlyZSBmbGFzaCBmb3IgdW5wcml2aWxlZ2VkIHJlYWQgb25seSBhY2Nlc3MuICovCiAJCXBvcnRNUFVfUkVHSU9OX0JBU0VfQUREUkVTU19SRUcgPQkoICggdWludDMyX3QgKSBfX0ZMQVNIX3NlZ21lbnRfc3RhcnRfXyApIHwgLyogQmFzZSBhZGRyZXNzLiAqLwogCQkJCQkJCQkJCQkoIHBvcnRNUFVfUkVHSU9OX1ZBTElEICkgfApAQCAtNjczLDYgKzcwOCw3IEBACiAKIAkJLyogRW5hYmxlIHRoZSBNUFUgd2l0aCB0aGUgYmFja2dyb3VuZCByZWdpb24gY29uZmlndXJlZC4gKi8KIAkJcG9ydE1QVV9DVFJMX1JFRyB8PSAoIHBvcnRNUFVfRU5BQkxFIHwgcG9ydE1QVV9CQUNLR1JPVU5EX0VOQUJMRSApOworCX0KIH0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCkBAIC02OTksMTQgKzczNSwxMyBAQAogCXJldHVybiAoIHVsUmV0dXJuVmFsdWUgPDwgMVVMICk7CiB9CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwogdm9pZCB2UG9ydFN0b3JlVGFza01QVVNldHRpbmdzKCB4TVBVX1NFVFRJTkdTICp4TVBVU2V0dGluZ3MsIGNvbnN0IHN0cnVjdCB4TUVNT1JZX1JFR0lPTiAqIGNvbnN0IHhSZWdpb25zLCBTdGFja1R5cGVfdCAqcHhCb3R0b21PZlN0YWNrLCB1aW50MzJfdCB1bFN0YWNrRGVwdGggKQogewogZXh0ZXJuIHVpbnQzMl90IF9fU1JBTV9zZWdtZW50X3N0YXJ0X187CiBleHRlcm4gdWludDMyX3QgX19TUkFNX3NlZ21lbnRfZW5kX187CiBleHRlcm4gdWludDMyX3QgX19wcml2aWxlZ2VkX2RhdGFfc3RhcnRfXzsKIGV4dGVybiB1aW50MzJfdCBfX3ByaXZpbGVnZWRfZGF0YV9lbmRfXzsKLQotCQogaW50MzJfdCBsSW5kZXg7CiB1aW50MzJfdCB1bDsKIApAQCAtNzk1LDcgKzgzMCw2IEBACiAJCX0KIAl9CiB9Ci0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiAjaWYoIGNvbmZpZ0FTU0VSVF9ERUZJTkVEID09IDEgKQpAQCAtODA2LDcgKzg0MCw3IEBACiAJdWludDhfdCB1Y0N1cnJlbnRQcmlvcml0eTsKIAogCQkvKiBPYnRhaW4gdGhlIG51bWJlciBvZiB0aGUgY3VycmVudGx5IGV4ZWN1dGluZyBpbnRlcnJ1cHQuICovCi0JCV9fYXNtIHZvbGF0aWxlKCAibXJzICUwLCBpcHNyIiA6ICI9ciIoIHVsQ3VycmVudEludGVycnVwdCApICk7CisJCV9fYXNtIHZvbGF0aWxlKCAibXJzICUwLCBpcHNyIiA6ICI9ciIoIHVsQ3VycmVudEludGVycnVwdCApIDo6ICJtZW1vcnkiICk7CiAKIAkJLyogSXMgdGhlIGludGVycnVwdCBudW1iZXIgYSB1c2VyIGRlZmluZWQgaW50ZXJydXB0PyAqLwogCQlpZiggdWxDdXJyZW50SW50ZXJydXB0ID49IHBvcnRGSVJTVF9VU0VSX0lOVEVSUlVQVF9OVU1CRVIgKQpAQCAtODUyLDcgKzg4Niw3IEBACiAJCWRldmljZXMgYnkgY2FsbGluZyBOVklDX1NldFByaW9yaXR5R3JvdXBpbmcoIDAgKTsgYmVmb3JlIHN0YXJ0aW5nIHRoZQogCQlzY2hlZHVsZXIuICBOb3RlIGhvd2V2ZXIgdGhhdCBzb21lIHZlbmRvciBzcGVjaWZpYyBwZXJpcGhlcmFsIGxpYnJhcmllcwogCQlhc3N1bWUgYSBub24temVybyBwcmlvcml0eSBncm91cCBzZXR0aW5nLCBpbiB3aGljaCBjYXNlcyB1c2luZyBhIHZhbHVlCi0JCW9mIHplcm8gd2lsbCByZXN1bHQgaW4gdW5wcmVkaWNhYmxlIGJlaGF2aW91ci4gKi8KKwkJb2YgemVybyB3aWxsIHJlc3VsdCBpbiB1bnByZWRpY3RhYmxlIGJlaGF2aW91ci4gKi8KIAkJY29uZmlnQVNTRVJUKCAoIHBvcnRBSVJDUl9SRUcgJiBwb3J0UFJJT1JJVFlfR1JPVVBfTUFTSyApIDw9IHVsTWF4UFJJR1JPVVBWYWx1ZSApOwogCX0KIApkaWZmIC0tZ2l0IGEvU291cmNlL3BvcnRhYmxlL0lBUi9BUk1fQ003X01QVS9yMHAxL3BvcnRhc20ucyBiL1NvdXJjZS9wb3J0YWJsZS9JQVIvQVJNX0NNN19NUFUvcjBwMS9wb3J0YXNtLnMKaW5kZXggNDdlOGYzMS4uODZkNWIyOSAxMDA2NDQKLS0tIGEvU291cmNlL3BvcnRhYmxlL0lBUi9BUk1fQ003X01QVS9yMHAxL3BvcnRhc20ucworKysgYi9Tb3VyY2UvcG9ydGFibGUvSUFSL0FSTV9DTTdfTVBVL3IwcDEvcG9ydGFzbS5zCkBAIC0xLDYgKzEsNiBAQAogLyoKLSAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMC4xCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjIuMQorICogQ29weXJpZ2h0IChDKSAyMDE5IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKICAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKICAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCkBAIC0zMiwxNyArMzIsMTUgQEAKIAogCUVYVEVSTiBweEN1cnJlbnRUQ0IKIAlFWFRFUk4gdlRhc2tTd2l0Y2hDb250ZXh0Ci0gICAgICAgIEVYVEVSTiB2U1ZDSGFuZGxlcgorCUVYVEVSTiB2UG9ydFNWQ0hhbmRsZXJfQwogCiAJUFVCTElDIHhQb3J0UGVuZFNWSGFuZGxlcgogCVBVQkxJQyB2UG9ydFNWQ0hhbmRsZXIKIAlQVUJMSUMgdlBvcnRTdGFydEZpcnN0VGFzawotICAgICAgICBQVUJMSUMgdlJlc3RvcmVDb250ZXh0T2ZGaXJzdFRhc2sKIAlQVUJMSUMgdlBvcnRFbmFibGVWRlAKLSAgICAgICAgUFVCTElDIHhQb3J0UmFpc2VQcml2aWxlZ2UKLSAgICAgICAgUFVCTElDIHZQb3J0U3dpdGNoVG9Vc2VyTW9kZQotICAgICAgICAKLQorCVBVQkxJQyB2UG9ydFJlc3RvcmVDb250ZXh0T2ZGaXJzdFRhc2sKKwlQVUJMSUMgeElzUHJpdmlsZWdlZAorCVBVQkxJQyB2UmVzZXRQcml2aWxlZ2UKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKQEAgLTU4LDM3ICs1NiwzOSBAQAogCWl0IGVxCiAJdnN0bWRiZXEgcjAhLCB7czE2LXMzMX0KIAorCS8qIFNhdmUgdGhlIGNvcmUgcmVnaXN0ZXJzLiAqLwogCW1ycyByMSwgY29udHJvbAotICAgICAgICAvKiBTYXZlIHRoZSBjb3JlIHJlZ2lzdGVycy4gKi8KIAlzdG1kYiByMCEsIHtyMSwgcjQtcjExLCByMTR9CiAKIAkvKiBTYXZlIHRoZSBuZXcgdG9wIG9mIHN0YWNrIGludG8gdGhlIGZpcnN0IG1lbWJlciBvZiB0aGUgVENCLiAqLwogCXN0ciByMCwgW3IyXQogCi0Jc3RtZGIgc3AhLCB7cjN9CisJc3RtZGIgc3AhLCB7cjAsIHIzfQogCW1vdiByMCwgI2NvbmZpZ01BWF9TWVNDQUxMX0lOVEVSUlVQVF9QUklPUklUWQotICBjcHNpZCBpCisgICAgY3BzaWQgaQogCW1zciBiYXNlcHJpLCByMAogCWRzYgogCWlzYgotICBjcHNpZSBpCisgICAgY3BzaWUgaQogCWJsIHZUYXNrU3dpdGNoQ29udGV4dAogCW1vdiByMCwgIzAKIAltc3IgYmFzZXByaSwgcjAKLQlsZG1pYSBzcCEsIHtyM30KKwlsZG1pYSBzcCEsIHtyMCwgcjN9CiAKIAkvKiBUaGUgZmlyc3QgaXRlbSBpbiBweEN1cnJlbnRUQ0IgaXMgdGhlIHRhc2sgdG9wIG9mIHN0YWNrLiAqLwogCWxkciByMSwgW3IzXQogCWxkciByMCwgW3IxXQotICAgICAgICAKLSAJYWRkIHIxLCByMSwgIzQJCQkJCS8qIE1vdmUgb250byB0aGUgc2Vjb25kIGl0ZW0gaW4gdGhlIFRDQi4uLiAqLwotCWxkciByMiwgPTB4ZTAwMGVkOWMJCQkJLyogUmVnaW9uIEJhc2UgQWRkcmVzcyByZWdpc3Rlci4gKi8KLQlsZG1pYSByMSEsIHtyNC1yMTF9CQkJCS8qIFJlYWQgNCBzZXRzIG9mIE1QVSByZWdpc3RlcnMuICovCi0Jc3RtaWEgcjIhLCB7cjQtcjExfQkJCQkvKiBXcml0ZSA0IHNldHMgb2YgTVBVIHJlZ2lzdGVycy4gKi8KLQotCS8qIFBvcCB0aGUgY29yZSByZWdpc3RlcnMuICovCisJLyogTW92ZSBvbnRvIHRoZSBzZWNvbmQgaXRlbSBpbiB0aGUgVENCLi4uICovCisJYWRkIHIxLCByMSwgIzQKKwkvKiBSZWdpb24gQmFzZSBBZGRyZXNzIHJlZ2lzdGVyLiAqLworCWxkciByMiwgPTB4ZTAwMGVkOWMKKwkvKiBSZWFkIDQgc2V0cyBvZiBNUFUgcmVnaXN0ZXJzLiAqLworCWxkbWlhIHIxISwge3I0LXIxMX0KKwkvKiBXcml0ZSA0IHNldHMgb2YgTVBVIHJlZ2lzdGVycy4gKi8KKwlzdG1pYSByMiEsIHtyNC1yMTF9CisJLyogUG9wIHRoZSByZWdpc3RlcnMgdGhhdCBhcmUgbm90IGF1dG9tYXRpY2FsbHkgc2F2ZWQgb24gZXhjZXB0aW9uIGVudHJ5LiAqLwogCWxkbWlhIHIwISwge3IzLXIxMSwgcjE0fQotICAgICAgICBtc3IgY29udHJvbCwgcjMKKwltc3IgY29udHJvbCwgcjMKIAogCS8qIElzIHRoZSB0YXNrIHVzaW5nIHRoZSBGUFUgY29udGV4dD8gIElmIHNvLCBwb3AgdGhlIGhpZ2ggdmZwIHJlZ2lzdGVycwogCXRvby4gKi8KQEAgLTk4LDEyICs5OCw2IEBACiAKIAltc3IgcHNwLCByMAogCWlzYgotCSNpZmRlZiBXT1JLQVJPVU5EX1BNVV9DTTAwMSAvKiBYTUM0MDAwIHNwZWNpZmljIGVycmF0YSAqLwotCQkjaWYgV09SS0FST1VORF9QTVVfQ00wMDEgPT0gMQotCQkJcHVzaCB7IHIxNCB9Ci0JCQlwb3AgeyBwYyB9Ci0JCSNlbmRpZgotCSNlbmRpZgogCiAJYnggcjE0CiAKQEAgLTExMSw3ICsxMDUsNiBAQAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKIHZQb3J0U1ZDSGFuZGxlcjoKLQkvKiBBc3N1bWVzIHBzcCB3YXMgaW4gdXNlLiAqLwogCSNpZm5kZWYgVVNFX1BST0NFU1NfU1RBQ0sJLyogQ29kZSBzaG91bGQgbm90IGJlIHJlcXVpcmVkIGlmIGEgbWFpbigpIGlzIHVzaW5nIHRoZSBwcm9jZXNzIHN0YWNrLiAqLwogCQl0c3QgbHIsICM0CiAJCWl0ZSBlcQpAQCAtMTIwLDcgKzExMyw3IEBACiAJI2Vsc2UKIAkJbXJzIHIwLCBwc3AKIAkjZW5kaWYKLQkJYiB2U1ZDSGFuZGxlcgorCQliIHZQb3J0U1ZDSGFuZGxlcl9DCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCkBAIC0xMzEsMzMgKzEyNCw1MCBAQAogCWxkciByMCwgW3IwXQogCS8qIFNldCB0aGUgbXNwIGJhY2sgdG8gdGhlIHN0YXJ0IG9mIHRoZSBzdGFjay4gKi8KIAltc3IgbXNwLCByMAorCS8qIENsZWFyIHRoZSBiaXQgdGhhdCBpbmRpY2F0ZXMgdGhlIEZQVSBpcyBpbiB1c2UgaW4gY2FzZSB0aGUgRlBVIHdhcyB1c2VkCisJYmVmb3JlIHRoZSBzY2hlZHVsZXIgd2FzIHN0YXJ0ZWQgLSB3aGljaCB3b3VsZCBvdGhlcndpc2UgcmVzdWx0IGluIHRoZQorCXVubmVjZXNzYXJ5IGxlYXZpbmcgb2Ygc3BhY2UgaW4gdGhlIFNWQyBzdGFjayBmb3IgbGF6eSBzYXZpbmcgb2YgRlBVCisJcmVnaXN0ZXJzLiAqLworCW1vdiByMCwgIzAKKwltc3IgY29udHJvbCwgcjAKIAkvKiBDYWxsIFNWQyB0byBzdGFydCB0aGUgZmlyc3QgdGFzay4gKi8KIAljcHNpZSBpCiAJY3BzaWUgZgogCWRzYgogCWlzYgotCXN2YyAwCS8qIFN5c3RlbSBjYWxsIHRvIHN0YXJ0IGZpcnN0IHRhc2suICovCi0gIAotdlJlc3RvcmVDb250ZXh0T2ZGaXJzdFRhc2s6CisJc3ZjIDAKIAotCWxkciByMCwgPTB4RTAwMEVEMDgJCQkJLyogVXNlIHRoZSBOVklDIG9mZnNldCByZWdpc3RlciB0byBsb2NhdGUgdGhlIHN0YWNrLiAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZQb3J0UmVzdG9yZUNvbnRleHRPZkZpcnN0VGFzazoKKwkvKiBVc2UgdGhlIE5WSUMgb2Zmc2V0IHJlZ2lzdGVyIHRvIGxvY2F0ZSB0aGUgc3RhY2suICovCisJbGRyIHIwLCA9MHhFMDAwRUQwOAogCWxkciByMCwgW3IwXQogCWxkciByMCwgW3IwXQotCW1zciBtc3AsIHIwCQkJCQkJLyogU2V0IHRoZSBtc3AgYmFjayB0byB0aGUgc3RhcnQgb2YgdGhlIHN0YWNrLiAqLwotCWxkcglyMywgPXB4Q3VycmVudFRDQgkJCS8qIFJlc3RvcmUgdGhlIGNvbnRleHQuICovCisJLyogU2V0IHRoZSBtc3AgYmFjayB0byB0aGUgc3RhcnQgb2YgdGhlIHN0YWNrLiAqLworCW1zciBtc3AsIHIwCisJLyogUmVzdG9yZSB0aGUgY29udGV4dC4gKi8KKwlsZHIJcjMsID1weEN1cnJlbnRUQ0IKIAlsZHIgcjEsIFtyM10KLQlsZHIgcjAsIFtyMV0JCQkJCS8qIFRoZSBmaXJzdCBpdGVtIGluIHRoZSBUQ0IgaXMgdGhlIHRhc2sgdG9wIG9mIHN0YWNrLiAqLwotCWFkZCByMSwgcjEsICM0CQkJCQkvKiBNb3ZlIG9udG8gdGhlIHNlY29uZCBpdGVtIGluIHRoZSBUQ0IuLi4gKi8KLQlsZHIgcjIsID0weGUwMDBlZDljCQkJCS8qIFJlZ2lvbiBCYXNlIEFkZHJlc3MgcmVnaXN0ZXIuICovCi0JbGRtaWEgcjEhLCB7cjQtcjExfQkJCQkvKiBSZWFkIDQgc2V0cyBvZiBNUFUgcmVnaXN0ZXJzLiAqLwotCXN0bWlhIHIyISwge3I0LXIxMX0JCQkJLyogV3JpdGUgNCBzZXRzIG9mIE1QVSByZWdpc3RlcnMuICovCi0JbGRtaWEgcjAhLCB7cjMtcjExLCByMTR9CS8qIFBvcCB0aGUgcmVnaXN0ZXJzIHRoYXQgYXJlIG5vdCBhdXRvbWF0aWNhbGx5IHNhdmVkIG9uIGV4Y2VwdGlvbiBlbnRyeS4gKi8KKwkvKiBUaGUgZmlyc3QgaXRlbSBpbiB0aGUgVENCIGlzIHRoZSB0YXNrIHRvcCBvZiBzdGFjay4gKi8KKwlsZHIgcjAsIFtyMV0KKwkvKiBNb3ZlIG9udG8gdGhlIHNlY29uZCBpdGVtIGluIHRoZSBUQ0IuLi4gKi8KKwlhZGQgcjEsIHIxLCAjNAorCS8qIFJlZ2lvbiBCYXNlIEFkZHJlc3MgcmVnaXN0ZXIuICovCisJbGRyIHIyLCA9MHhlMDAwZWQ5YworCS8qIFJlYWQgNCBzZXRzIG9mIE1QVSByZWdpc3RlcnMuICovCisJbGRtaWEgcjEhLCB7cjQtcjExfQorCS8qIFdyaXRlIDQgc2V0cyBvZiBNUFUgcmVnaXN0ZXJzLiAqLworCXN0bWlhIHIyISwge3I0LXIxMX0KKwkvKiBQb3AgdGhlIHJlZ2lzdGVycyB0aGF0IGFyZSBub3QgYXV0b21hdGljYWxseSBzYXZlZCBvbiBleGNlcHRpb24gZW50cnkuICovCisJbGRtaWEgcjAhLCB7cjMtcjExLCByMTR9CiAJbXNyIGNvbnRyb2wsIHIzCi0JbXNyIHBzcCwgcjAJCQkJCQkvKiBSZXN0b3JlIHRoZSB0YXNrIHN0YWNrIHBvaW50ZXIuICovCisJLyogUmVzdG9yZSB0aGUgdGFzayBzdGFjayBwb2ludGVyLiAqLworCW1zciBwc3AsIHIwCiAJbW92IHIwLCAjMAogCW1zcgliYXNlcHJpLCByMAogCWJ4IHIxNAotICAKKwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKIHZQb3J0RW5hYmxlVkZQOgpAQCAtMTcwLDI1ICsxODAsMjIgQEAKIAlzdHIgcjEsIFtyMF0KIAlieAlyMTQKIAoteFBvcnRSYWlzZVByaXZpbGVnZToKLQltcnMgcjAsIGNvbnRyb2wKLQl0c3QgcjAsICMxCQkJCQkJLyogSXMgdGhlIHRhc2sgcnVubmluZyBwcml2aWxlZ2VkPyAqLwotCWl0dGUgbmUKLQltb3ZuZSByMCwgIzAJCQkJCS8qIENPTlRST0xbMF0hPTAsIHJldHVybiBmYWxzZS4gKi8KLQlzdmNuZSAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkvKiBTd2l0Y2ggdG8gcHJpdmlsZWdlZC4gKi8KLQltb3ZlcSByMCwgIzEJCQkJCS8qIENPTlRST0xbMF09PTAsIHJldHVybiB0cnVlLiAqLwotCWJ4IGxyCi0gICAgICAgIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKK3hJc1ByaXZpbGVnZWQ6CisJbXJzIHIwLCBjb250cm9sCQkvKiByMCA9IENPTlRST0wuICovCisJdHN0IHIwLCAjMQkJCS8qIFBlcmZvcm0gcjAgJiAxIChiaXR3aXNlIEFORCkgYW5kIHVwZGF0ZSB0aGUgY29uZGl0aW9ucyBmbGFnLiAqLworCWl0ZSBuZQorCW1vdm5lIHIwLCAjMAkJLyogQ09OVFJPTFswXSE9MC4gUmV0dXJuIGZhbHNlIHRvIGluZGljYXRlIHRoYXQgdGhlIHByb2Nlc3NvciBpcyBub3QgcHJpdmlsZWdlZC4gKi8KKwltb3ZlcSByMCwgIzEJCS8qIENPTlRST0xbMF09PTAuIFJldHVybiB0cnVlIHRvIGluZGljYXRlIHRoYXQgdGhlIHByb2Nlc3NvciBpcyBwcml2aWxlZ2VkLiAqLworCWJ4IGxyCQkJCS8qIFJldHVybi4gKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi0KLXZQb3J0U3dpdGNoVG9Vc2VyTW9kZToKLQkKLQltcnMgcjAsIGNvbnRyb2wKLQlvcnIgcjAsIHIwLCAjMQotCW1zciBjb250cm9sLCByMAotCWJ4IHIxNAordlJlc2V0UHJpdmlsZWdlOgorCW1ycyByMCwgY29udHJvbAkJLyogcjAgPSBDT05UUk9MLiAqLworCW9yciByMCwgcjAsICMxCQkvKiByMCA9IHIwIHwgMS4gKi8KKwltc3IgY29udHJvbCwgcjAJCS8qIENPTlRST0wgPSByMC4gKi8KKwlieCBscgkJCQkvKiBSZXR1cm4gdG8gdGhlIGNhbGxlci4gKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiAJRU5ECi0KZGlmZiAtLWdpdCBhL1NvdXJjZS9wb3J0YWJsZS9JQVIvQVJNX0NNN19NUFUvcjBwMS9wb3J0bWFjcm8uaCBiL1NvdXJjZS9wb3J0YWJsZS9JQVIvQVJNX0NNN19NUFUvcjBwMS9wb3J0bWFjcm8uaAppbmRleCA0M2Q0ZTQ1Li4zMTVlNDdjIDEwMDY0NAotLS0gYS9Tb3VyY2UvcG9ydGFibGUvSUFSL0FSTV9DTTdfTVBVL3IwcDEvcG9ydG1hY3JvLmgKKysrIGIvU291cmNlL3BvcnRhYmxlL0lBUi9BUk1fQ003X01QVS9yMHAxL3BvcnRtYWNyby5oCkBAIC0xLDYgKzEsNiBAQAogLyoKLSAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMC4xCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjIuMQorICogQ29weXJpZ2h0IChDKSAyMDE5IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKICAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKICAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCkBAIC00Miw2ICs0Miw5IEBACiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKi8KIAorLyogSUFSIGluY2x1ZGVzLiAqLworI2luY2x1ZGUgPGludHJpbnNpY3MuaD4KKwogLyogVHlwZSBkZWZpbml0aW9ucy4gKi8KICNkZWZpbmUgcG9ydENIQVIJCWNoYXIKICNkZWZpbmUgcG9ydEZMT0FUCQlmbG9hdApAQCAtNjYsOCArNjksOCBAQAogCW5vdCBuZWVkIHRvIGJlIGd1YXJkZWQgd2l0aCBhIGNyaXRpY2FsIHNlY3Rpb24uICovCiAJI2RlZmluZSBwb3J0VElDS19UWVBFX0lTX0FUT01JQyAxCiAjZW5kaWYKLQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKIC8qIE1QVSBzcGVjaWZpYyBjb25zdGFudHMuICovCiAjZGVmaW5lIHBvcnRVU0lOR19NUFVfV1JBUFBFUlMJCTEKICNkZWZpbmUgcG9ydFBSSVZJTEVHRV9CSVQJCQkoIDB4ODAwMDAwMDBVTCApCkBAIC03OSwxOCArODIsMTcgQEAKICNkZWZpbmUgcG9ydE1QVV9SRUdJT05fQ0FDSEVBQkxFX0JVRkZFUkFCTEUJCSggMHgwN1VMIDw8IDE2VUwgKQogI2RlZmluZSBwb3J0TVBVX1JFR0lPTl9FWEVDVVRFX05FVkVSCQkJKCAweDAxVUwgPDwgMjhVTCApCiAKLSNkZWZpbmUgcG9ydFVOUFJJVklMRUdFRF9GTEFTSF9SRUdJT04JCSggMFVMICkKLSNkZWZpbmUgcG9ydFBSSVZJTEVHRURfRkxBU0hfUkVHSU9OCQkJKCAxVUwgKQotI2RlZmluZSBwb3J0UFJJVklMRUdFRF9SQU1fUkVHSU9OCQkJKCAyVUwgKQotI2RlZmluZSBwb3J0R0VORVJBTF9QRVJJUEhFUkFMU19SRUdJT04JCSggM1VMICkKLSNkZWZpbmUgcG9ydFNUQUNLX1JFR0lPTgkJCQkJKCA0VUwgKQotI2RlZmluZSBwb3J0RklSU1RfQ09ORklHVVJBQkxFX1JFR0lPTgkgICAgKCA1VUwgKQotI2RlZmluZSBwb3J0TEFTVF9DT05GSUdVUkFCTEVfUkVHSU9OCQkoIDdVTCApCi0jZGVmaW5lIHBvcnROVU1fQ09ORklHVVJBQkxFX1JFR0lPTlMJCSggKCBwb3J0TEFTVF9DT05GSUdVUkFCTEVfUkVHSU9OIC0gcG9ydEZJUlNUX0NPTkZJR1VSQUJMRV9SRUdJT04gKSArIDEgKQotI2RlZmluZSBwb3J0VE9UQUxfTlVNX1JFR0lPTlMJCQkJKCBwb3J0TlVNX0NPTkZJR1VSQUJMRV9SRUdJT05TICsgMSApIC8qIFBsdXMgb25lIHRvIG1ha2Ugc3BhY2UgZm9yIHRoZSBzdGFjayByZWdpb24uICovCisjZGVmaW5lIHBvcnRVTlBSSVZJTEVHRURfRkxBU0hfUkVHSU9OCQkJKCAwVUwgKQorI2RlZmluZSBwb3J0UFJJVklMRUdFRF9GTEFTSF9SRUdJT04JCQkJKCAxVUwgKQorI2RlZmluZSBwb3J0UFJJVklMRUdFRF9SQU1fUkVHSU9OCQkJCSggMlVMICkKKyNkZWZpbmUgcG9ydEdFTkVSQUxfUEVSSVBIRVJBTFNfUkVHSU9OCQkJKCAzVUwgKQorI2RlZmluZSBwb3J0U1RBQ0tfUkVHSU9OCQkJCQkJKCA0VUwgKQorI2RlZmluZSBwb3J0RklSU1RfQ09ORklHVVJBQkxFX1JFR0lPTgkJCSggNVVMICkKKyNkZWZpbmUgcG9ydExBU1RfQ09ORklHVVJBQkxFX1JFR0lPTgkJCSggN1VMICkKKyNkZWZpbmUgcG9ydE5VTV9DT05GSUdVUkFCTEVfUkVHSU9OUwkJCSggKCBwb3J0TEFTVF9DT05GSUdVUkFCTEVfUkVHSU9OIC0gcG9ydEZJUlNUX0NPTkZJR1VSQUJMRV9SRUdJT04gKSArIDEgKQorI2RlZmluZSBwb3J0VE9UQUxfTlVNX1JFR0lPTlMJCQkJCSggcG9ydE5VTV9DT05GSUdVUkFCTEVfUkVHSU9OUyArIDEgKSAvKiBQbHVzIG9uZSB0byBtYWtlIHNwYWNlIGZvciB0aGUgc3RhY2sgcmVnaW9uLiAqLwogCi12b2lkIHZQb3J0U3dpdGNoVG9Vc2VyTW9kZSggdm9pZCApOwotI2RlZmluZSBwb3J0U1dJVENIX1RPX1VTRVJfTU9ERSgpCXZQb3J0U3dpdGNoVG9Vc2VyTW9kZSgpCisjZGVmaW5lIHBvcnRTV0lUQ0hfVE9fVVNFUl9NT0RFKCkgX19hc20gdm9sYXRpbGUgKCAiIG1ycyByMCwgY29udHJvbCBcbiBvcnIgcjAsIHIwLCAjMSBcbiBtc3IgY29udHJvbCwgcjAgIiA6OjogInIwIiwgIm1lbW9yeSIgKQogCiB0eXBlZGVmIHN0cnVjdCBNUFVfUkVHSU9OX1JFR0lTVEVSUwogewpAQCAtMTA1LDIwICsxMDcsMjAgQEAKIH0geE1QVV9TRVRUSU5HUzsKIAogCi0KIC8qIEFyY2hpdGVjdHVyZSBzcGVjaWZpY3MuICovCiAjZGVmaW5lIHBvcnRTVEFDS19HUk9XVEgJCQkoIC0xICkKICNkZWZpbmUgcG9ydFRJQ0tfUEVSSU9EX01TCQkJKCAoIFRpY2tUeXBlX3QgKSAxMDAwIC8gY29uZmlnVElDS19SQVRFX0haICkKICNkZWZpbmUgcG9ydEJZVEVfQUxJR05NRU5UCQkJOAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKIC8qIFNWQyBudW1iZXJzIGZvciB2YXJpb3VzIHNlcnZpY2VzLiAqLwogI2RlZmluZSBwb3J0U1ZDX1NUQVJUX1NDSEVEVUxFUgkJCQkwCiAjZGVmaW5lIHBvcnRTVkNfWUlFTEQJCQkJCQkxCiAjZGVmaW5lIHBvcnRTVkNfUkFJU0VfUFJJVklMRUdFCQkJCTIKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiAvKiBTY2hlZHVsZXIgdXRpbGl0aWVzLiAqLwotI2RlZmluZSBwb3J0WUlFTEQoKQkJCQkJCQkJCQkJXAorI2RlZmluZSBwb3J0WUlFTEQoKQkJCQlfX2FzbSB2b2xhdGlsZSAoICIJU1ZDCSUwCVxuIiA6OiAiaSIgKHBvcnRTVkNfWUlFTEQpIDogIm1lbW9yeSIgKQorI2RlZmluZSBwb3J0WUlFTERfV0lUSElOX0FQSSgpCQkJCQkJCQlcCiB7CQkJCQkJCQkJCQkJCQkJXAogCS8qIFNldCBhIFBlbmRTViB0byByZXF1ZXN0IGEgY29udGV4dCBzd2l0Y2guICovCQkJXAogCXBvcnROVklDX0lOVF9DVFJMX1JFRyA9IHBvcnROVklDX1BFTkRTVlNFVF9CSVQ7CQkJXApAQCAtMTI2LDExICsxMjgsOSBAQAogCV9fSVNCKCk7CQkJCQkJCQkJCQkJXAogfQogCi0KLQogI2RlZmluZSBwb3J0TlZJQ19JTlRfQ1RSTF9SRUcJCSggKiAoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVkMDQgKSApCiAjZGVmaW5lIHBvcnROVklDX1BFTkRTVlNFVF9CSVQJCSggMVVMIDw8IDI4VUwgKQotI2RlZmluZSBwb3J0RU5EX1NXSVRDSElOR19JU1IoIHhTd2l0Y2hSZXF1aXJlZCApIGlmKCB4U3dpdGNoUmVxdWlyZWQgIT0gcGRGQUxTRSApIHBvcnRZSUVMRCgpCisjZGVmaW5lIHBvcnRFTkRfU1dJVENISU5HX0lTUiggeFN3aXRjaFJlcXVpcmVkICkgaWYoIHhTd2l0Y2hSZXF1aXJlZCAhPSBwZEZBTFNFICkgcG9ydFlJRUxEX1dJVEhJTl9BUEkoKQogI2RlZmluZSBwb3J0WUlFTERfRlJPTV9JU1IoIHggKSBwb3J0RU5EX1NXSVRDSElOR19JU1IoIHggKQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTE0MCw3ICsxNDAsNyBAQAogCSNkZWZpbmUgY29uZmlnVVNFX1BPUlRfT1BUSU1JU0VEX1RBU0tfU0VMRUNUSU9OIDEKICNlbmRpZgogCi0jaWYgY29uZmlnVVNFX1BPUlRfT1BUSU1JU0VEX1RBU0tfU0VMRUNUSU9OID09IDEKKyNpZiggY29uZmlnVVNFX1BPUlRfT1BUSU1JU0VEX1RBU0tfU0VMRUNUSU9OID09IDEgKQogCiAJLyogQ2hlY2sgdGhlIGNvbmZpZ3VyYXRpb24uICovCiAJI2lmKCBjb25maWdNQVhfUFJJT1JJVElFUyA+IDMyICkKQEAgLTE1Myw3ICsxNTMsNiBAQAogCiAJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLQkjaW5jbHVkZSA8aW50cmluc2ljcy5oPgogCSNkZWZpbmUgcG9ydEdFVF9ISUdIRVNUX1BSSU9SSVRZKCB1eFRvcFByaW9yaXR5LCB1eFJlYWR5UHJpb3JpdGllcyApIHV4VG9wUHJpb3JpdHkgPSAoIDMxVUwgLSAoICggdWludDMyX3QgKSBfX0NMWiggKCB1eFJlYWR5UHJpb3JpdGllcyApICkgKSApCiAKICNlbmRpZiAvKiBjb25maWdVU0VfUE9SVF9PUFRJTUlTRURfVEFTS19TRUxFQ1RJT04gKi8KQEAgLTE2NSwxMiArMTY0LDExIEBACiAKICNkZWZpbmUgcG9ydERJU0FCTEVfSU5URVJSVVBUUygpCQkJCQkJCVwKIHsJCQkJCQkJCQkJCQkJCQlcCi0JIC8qIEVycmF0YSB3b3JrIGFyb3VuZC4gKi8JCQkJCQkJCVwKLQlfX2Rpc2FibGVfaW50ZXJydXB0KCk7CQkJCQkJCQkJXAorICAgIF9fZGlzYWJsZV9pbnRlcnJ1cHQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogCV9fc2V0X0JBU0VQUkkoIGNvbmZpZ01BWF9TWVNDQUxMX0lOVEVSUlVQVF9QUklPUklUWSApOwlcCiAJX19EU0IoKTsJCQkJCQkJCQkJCQlcCiAJX19JU0IoKTsJCQkJCQkJCQkJCQlcCi0JX19lbmFibGVfaW50ZXJydXB0KCk7CQkJCQkJCQkJXAorICAgIF9fZW5hYmxlX2ludGVycnVwdCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogfQogCiAjZGVmaW5lIHBvcnRFTkFCTEVfSU5URVJSVVBUUygpCQkJCQlfX3NldF9CQVNFUFJJKCAwICkKQEAgLTE4MCwxNCArMTc4LDYgQEAKICNkZWZpbmUgcG9ydENMRUFSX0lOVEVSUlVQVF9NQVNLX0ZST01fSVNSKHgpCV9fc2V0X0JBU0VQUkkoIHggKQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLS8qIFRpY2tsZXNzIGlkbGUvbG93IHBvd2VyIGZ1bmN0aW9uYWxpdHkuICovCi0jaWZuZGVmIHBvcnRTVVBQUkVTU19USUNLU19BTkRfU0xFRVAKLQlleHRlcm4gdm9pZCB2UG9ydFN1cHByZXNzVGlja3NBbmRTbGVlcCggVGlja1R5cGVfdCB4RXhwZWN0ZWRJZGxlVGltZSApOwotCSNkZWZpbmUgcG9ydFNVUFBSRVNTX1RJQ0tTX0FORF9TTEVFUCggeEV4cGVjdGVkSWRsZVRpbWUgKSB2UG9ydFN1cHByZXNzVGlja3NBbmRTbGVlcCggeEV4cGVjdGVkSWRsZVRpbWUgKQotI2VuZGlmCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCiAvKiBUYXNrIGZ1bmN0aW9uIG1hY3JvcyBhcyBkZXNjcmliZWQgb24gdGhlIEZyZWVSVE9TLm9yZyBXRUIgc2l0ZS4gIFRoZXNlIGFyZQogbm90IG5lY2Vzc2FyeSBmb3IgdG8gdXNlIHRoaXMgcG9ydC4gIFRoZXkgYXJlIGRlZmluZWQgc28gdGhlIGNvbW1vbiBkZW1vIGZpbGVzCiAod2hpY2ggYnVpbGQgd2l0aCBhbGwgdGhlIHBvcnRzKSB3aWxsIGJ1aWxkLiAqLwpAQCAtMjAwLDkgKzE5MCwzMCBAQAogCSNkZWZpbmUgcG9ydEFTU0VSVF9JRl9JTlRFUlJVUFRfUFJJT1JJVFlfSU5WQUxJRCgpIAl2UG9ydFZhbGlkYXRlSW50ZXJydXB0UHJpb3JpdHkoKQogI2VuZGlmCiAKLXZvaWQgdlNWQ0hhbmRsZXIoIHVpbnQzMl90ICpwdWxQYXJhbSApOwotdm9pZCB2UG9ydFJlc2V0UHJpdmlsZWdlKCBCYXNlVHlwZV90IHhSdW5uaW5nUHJpdmlsZWdlZCApOworLyogcG9ydE5PUCgpIGlzIG5vdCByZXF1aXJlZCBieSB0aGlzIHBvcnQuICovCisjZGVmaW5lIHBvcnROT1AoKQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKK2V4dGVybiBCYXNlVHlwZV90IHhJc1ByaXZpbGVnZWQoIHZvaWQgKTsKK2V4dGVybiB2b2lkIHZSZXNldFByaXZpbGVnZSggdm9pZCApOworCisvKioKKyAqIEBicmllZiBDaGVja3Mgd2hldGhlciBvciBub3QgdGhlIHByb2Nlc3NvciBpcyBwcml2aWxlZ2VkLgorICoKKyAqIEByZXR1cm4gMSBpZiB0aGUgcHJvY2Vzc29yIGlzIGFscmVhZHkgcHJpdmlsZWdlZCwgMCBvdGhlcndpc2UuCisgKi8KKyNkZWZpbmUgcG9ydElTX1BSSVZJTEVHRUQoKQkJCXhJc1ByaXZpbGVnZWQoKQorCisvKioKKyAqIEBicmllZiBSYWlzZSBhbiBTVkMgcmVxdWVzdCB0byByYWlzZSBwcml2aWxlZ2UuCisqLworI2RlZmluZSBwb3J0UkFJU0VfUFJJVklMRUdFKCkJCV9fYXNtIHZvbGF0aWxlICggInN2YyAlMCBcbiIgOjogImkiICggcG9ydFNWQ19SQUlTRV9QUklWSUxFR0UgKSA6ICJtZW1vcnkiICk7CisKKy8qKgorICogQGJyaWVmIExvd2VycyB0aGUgcHJpdmlsZWdlIGxldmVsIGJ5IHNldHRpbmcgdGhlIGJpdCAwIG9mIHRoZSBDT05UUk9MCisgKiByZWdpc3Rlci4KKyAqLworI2RlZmluZSBwb3J0UkVTRVRfUFJJVklMRUdFKCkJCXZSZXNldFByaXZpbGVnZSgpCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogLyogU3VwcHJlc3Mgd2FybmluZ3MgdGhhdCBhcmUgZ2VuZXJhdGVkIGJ5IHRoZSBJQVIgdG9vbHMsIGJ1dCBjYW5ub3QgYmUgZml4ZWQgaW4KZGlmZiAtLWdpdCBhL1NvdXJjZS9wb3J0YWJsZS9NZW1NYW5nL2hlYXBfMS5jIGIvU291cmNlL3BvcnRhYmxlL01lbU1hbmcvaGVhcF8xLmMKaW5kZXggN2ZmNmRmYS4uNTQyMzE3ZCAxMDA2NDQKLS0tIGEvU291cmNlL3BvcnRhYmxlL01lbU1hbmcvaGVhcF8xLmMKKysrIGIvU291cmNlL3BvcnRhYmxlL01lbU1hbmcvaGVhcF8xLmMKQEAgLTEsNiArMSw2IEBACiAvKgotICogRnJlZVJUT1MgS2VybmVsIFYxMC4wLjEKLSAqIENvcHlyaWdodCAoQykgMjAxNyBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMi4xCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgogICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgogICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KQEAgLTUzLDcgKzUzLDYgQEAKICNkZWZpbmUgY29uZmlnQURKVVNURURfSEVBUF9TSVpFCSggY29uZmlnVE9UQUxfSEVBUF9TSVpFIC0gcG9ydEJZVEVfQUxJR05NRU5UICkKIAogLyogQWxsb2NhdGUgdGhlIG1lbW9yeSBmb3IgdGhlIGhlYXAuICovCi0vKiBBbGxvY2F0ZSB0aGUgbWVtb3J5IGZvciB0aGUgaGVhcC4gKi8KICNpZiggY29uZmlnQVBQTElDQVRJT05fQUxMT0NBVEVEX0hFQVAgPT0gMSApCiAJLyogVGhlIGFwcGxpY2F0aW9uIHdyaXRlciBoYXMgYWxyZWFkeSBkZWZpbmVkIHRoZSBhcnJheSB1c2VkIGZvciB0aGUgUlRPUwogCWhlYXAgLSBwcm9iYWJseSBzbyBpdCBjYW4gYmUgcGxhY2VkIGluIGEgc3BlY2lhbCBzZWdtZW50IG9yIGFkZHJlc3MuICovCmRpZmYgLS1naXQgYS9Tb3VyY2UvcG9ydGFibGUvTWVtTWFuZy9oZWFwXzIuYyBiL1NvdXJjZS9wb3J0YWJsZS9NZW1NYW5nL2hlYXBfMi5jCmluZGV4IDk0MWI0ZjIuLjdkMDY5MjEgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9wb3J0YWJsZS9NZW1NYW5nL2hlYXBfMi5jCisrKyBiL1NvdXJjZS9wb3J0YWJsZS9NZW1NYW5nL2hlYXBfMi5jCkBAIC0xLDYgKzEsNiBAQAogLyoKLSAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMC4xCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjIuMQorICogQ29weXJpZ2h0IChDKSAyMDE5IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKICAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKICAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCmRpZmYgLS1naXQgYS9Tb3VyY2UvcG9ydGFibGUvTWVtTWFuZy9oZWFwXzMuYyBiL1NvdXJjZS9wb3J0YWJsZS9NZW1NYW5nL2hlYXBfMy5jCmluZGV4IGM4YzNmNTQuLmU2YTI5OTAgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9wb3J0YWJsZS9NZW1NYW5nL2hlYXBfMy5jCisrKyBiL1NvdXJjZS9wb3J0YWJsZS9NZW1NYW5nL2hlYXBfMy5jCkBAIC0xLDYgKzEsNiBAQAogLyoKLSAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMC4xCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjIuMQorICogQ29weXJpZ2h0IChDKSAyMDE5IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKICAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKICAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCmRpZmYgLS1naXQgYS9Tb3VyY2UvcG9ydGFibGUvTWVtTWFuZy9oZWFwXzQuYyBiL1NvdXJjZS9wb3J0YWJsZS9NZW1NYW5nL2hlYXBfNC5jCmluZGV4IDAyMjUxYzAuLmQ3Y2Q4YTUgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9wb3J0YWJsZS9NZW1NYW5nL2hlYXBfNC5jCisrKyBiL1NvdXJjZS9wb3J0YWJsZS9NZW1NYW5nL2hlYXBfNC5jCkBAIC0xLDYgKzEsNiBAQAogLyoKLSAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMC4xCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjIuMQorICogQ29weXJpZ2h0IChDKSAyMDE5IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKICAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKICAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCmRpZmYgLS1naXQgYS9Tb3VyY2UvcG9ydGFibGUvTWVtTWFuZy9oZWFwXzUuYyBiL1NvdXJjZS9wb3J0YWJsZS9NZW1NYW5nL2hlYXBfNS5jCmluZGV4IDUxYzUzYTkuLmI1MmQ2MWMgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9wb3J0YWJsZS9NZW1NYW5nL2hlYXBfNS5jCisrKyBiL1NvdXJjZS9wb3J0YWJsZS9NZW1NYW5nL2hlYXBfNS5jCkBAIC0xLDYgKzEsNiBAQAogLyoKLSAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMC4xCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjIuMQorICogQ29weXJpZ2h0IChDKSAyMDE5IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKICAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKICAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCmRpZmYgLS1naXQgYS9Tb3VyY2UvcG9ydGFibGUvUlZEUy9BUk1fQ00wL3BvcnQuYyBiL1NvdXJjZS9wb3J0YWJsZS9SVkRTL0FSTV9DTTAvcG9ydC5jCmluZGV4IDZlMWNlNWYuLjMzYmYzZWIgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9wb3J0YWJsZS9SVkRTL0FSTV9DTTAvcG9ydC5jCisrKyBiL1NvdXJjZS9wb3J0YWJsZS9SVkRTL0FSTV9DTTAvcG9ydC5jCkBAIC0xLDYgKzEsNiBAQAogLyoKLSAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMC4xCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjIuMQorICogQ29weXJpZ2h0IChDKSAyMDE5IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKICAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKICAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCkBAIC0xOTMsNyArMTkzLDcgQEAKICAqLwogQmFzZVR5cGVfdCB4UG9ydFN0YXJ0U2NoZWR1bGVyKCB2b2lkICkKIHsKLQkvKiBNYWtlIFBlbmRTViwgQ2FsbFNWIGFuZCBTeXNUaWNrIHRoZSBzYW1lIHByaXJvaXR5IGFzIHRoZSBrZXJuZWwuICovCisJLyogTWFrZSBQZW5kU1YsIENhbGxTViBhbmQgU3lzVGljayB0aGUgc2FtZSBwcmlvcml0eSBhcyB0aGUga2VybmVsLiAqLwogCSoocG9ydE5WSUNfU1lTUFJJMikgfD0gcG9ydE5WSUNfUEVORFNWX1BSSTsKIAkqKHBvcnROVklDX1NZU1BSSTIpIHw9IHBvcnROVklDX1NZU1RJQ0tfUFJJOwogCmRpZmYgLS1naXQgYS9Tb3VyY2UvcG9ydGFibGUvUlZEUy9BUk1fQ00wL3BvcnRtYWNyby5oIGIvU291cmNlL3BvcnRhYmxlL1JWRFMvQVJNX0NNMC9wb3J0bWFjcm8uaAppbmRleCA0ZjlmN2E1Li45ODQzNzc4IDEwMDY0NAotLS0gYS9Tb3VyY2UvcG9ydGFibGUvUlZEUy9BUk1fQ00wL3BvcnRtYWNyby5oCisrKyBiL1NvdXJjZS9wb3J0YWJsZS9SVkRTL0FSTV9DTTAvcG9ydG1hY3JvLmgKQEAgLTEsNiArMSw2IEBACiAvKgotICogRnJlZVJUT1MgS2VybmVsIFYxMC4wLjEKLSAqIENvcHlyaWdodCAoQykgMjAxNyBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMi4xCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgogICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgogICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KZGlmZiAtLWdpdCBhL1NvdXJjZS9wb3J0YWJsZS9SVkRTL0FSTV9DTTMvcG9ydC5jIGIvU291cmNlL3BvcnRhYmxlL1JWRFMvQVJNX0NNMy9wb3J0LmMKaW5kZXggZmFiNWE0ZC4uOWQ1NzU1YiAxMDA2NDQKLS0tIGEvU291cmNlL3BvcnRhYmxlL1JWRFMvQVJNX0NNMy9wb3J0LmMKKysrIGIvU291cmNlL3BvcnRhYmxlL1JWRFMvQVJNX0NNMy9wb3J0LmMKQEAgLTEsNiArMSw2IEBACiAvKgotICogRnJlZVJUT1MgS2VybmVsIFYxMC4wLjEKLSAqIENvcHlyaWdodCAoQykgMjAxNyBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMi4xCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgogICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgogICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KZGlmZiAtLWdpdCBhL1NvdXJjZS9wb3J0YWJsZS9SVkRTL0FSTV9DTTMvcG9ydG1hY3JvLmggYi9Tb3VyY2UvcG9ydGFibGUvUlZEUy9BUk1fQ00zL3BvcnRtYWNyby5oCmluZGV4IGEyYmYwMTguLjY1Y2QyN2UgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9wb3J0YWJsZS9SVkRTL0FSTV9DTTMvcG9ydG1hY3JvLmgKKysrIGIvU291cmNlL3BvcnRhYmxlL1JWRFMvQVJNX0NNMy9wb3J0bWFjcm8uaApAQCAtMSw2ICsxLDYgQEAKIC8qCi0gKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjAuMQotICogQ29weXJpZ2h0IChDKSAyMDE3IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRnJlZVJUT1MgS2VybmVsIFYxMC4yLjEKKyAqIENvcHlyaWdodCAoQykgMjAxOSBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCiAgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCiAgKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgpkaWZmIC0tZ2l0IGEvU291cmNlL3BvcnRhYmxlL1JWRFMvQVJNX0NNNEYvcG9ydC5jIGIvU291cmNlL3BvcnRhYmxlL1JWRFMvQVJNX0NNNEYvcG9ydC5jCmluZGV4IDQyOTI4MjYuLmE3NjU4YzMgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9wb3J0YWJsZS9SVkRTL0FSTV9DTTRGL3BvcnQuYworKysgYi9Tb3VyY2UvcG9ydGFibGUvUlZEUy9BUk1fQ000Ri9wb3J0LmMKQEAgLTEsNiArMSw2IEBACiAvKgotICogRnJlZVJUT1MgS2VybmVsIFYxMC4wLjEKLSAqIENvcHlyaWdodCAoQykgMjAxNyBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMi4xCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgogICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgogICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KZGlmZiAtLWdpdCBhL1NvdXJjZS9wb3J0YWJsZS9SVkRTL0FSTV9DTTRGL3BvcnRtYWNyby5oIGIvU291cmNlL3BvcnRhYmxlL1JWRFMvQVJNX0NNNEYvcG9ydG1hY3JvLmgKaW5kZXggYTJiZjAxOC4uNjVjZDI3ZSAxMDA2NDQKLS0tIGEvU291cmNlL3BvcnRhYmxlL1JWRFMvQVJNX0NNNEYvcG9ydG1hY3JvLmgKKysrIGIvU291cmNlL3BvcnRhYmxlL1JWRFMvQVJNX0NNNEYvcG9ydG1hY3JvLmgKQEAgLTEsNiArMSw2IEBACiAvKgotICogRnJlZVJUT1MgS2VybmVsIFYxMC4wLjEKLSAqIENvcHlyaWdodCAoQykgMjAxNyBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMi4xCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgogICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgogICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KZGlmZiAtLWdpdCBhL1NvdXJjZS9wb3J0YWJsZS9SVkRTL0FSTV9DTTRfTVBVL3BvcnQuYyBiL1NvdXJjZS9wb3J0YWJsZS9SVkRTL0FSTV9DTTRfTVBVL3BvcnQuYwppbmRleCA2MjFiYzA2Li43OTU1N2ZlIDEwMDY0NAotLS0gYS9Tb3VyY2UvcG9ydGFibGUvUlZEUy9BUk1fQ000X01QVS9wb3J0LmMKKysrIGIvU291cmNlL3BvcnRhYmxlL1JWRFMvQVJNX0NNNF9NUFUvcG9ydC5jCkBAIC0xLDYgKzEsNiBAQAogLyoKLSAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMC4xCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjIuMQorICogQ29weXJpZ2h0IChDKSAyMDE5IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKICAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKICAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCkBAIC0xMzAsMTMgKzEzMCw2IEBACiBzdGF0aWMgdWludDMyX3QgcHJ2R2V0TVBVUmVnaW9uU2l6ZVNldHRpbmcoIHVpbnQzMl90IHVsQWN0dWFsU2l6ZUluQnl0ZXMgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOwogCiAvKgotICogQ2hlY2tzIHRvIHNlZSBpZiBiZWluZyBjYWxsZWQgZnJvbSB0aGUgY29udGV4dCBvZiBhbiB1bnByaXZpbGVnZWQgdGFzaywgYW5kCi0gKiBpZiBzbyByYWlzZXMgdGhlIHByaXZpbGVnZSBsZXZlbCBhbmQgcmV0dXJucyBmYWxzZSAtIG90aGVyd2lzZSBkb2VzIG5vdGhpbmcKLSAqIG90aGVyIHRoYW4gcmV0dXJuIHRydWUuCi0gKi8KLUJhc2VUeXBlX3QgeFBvcnRSYWlzZVByaXZpbGVnZSggdm9pZCApOwotCi0vKgogICogU3RhbmRhcmQgRnJlZVJUT1MgZXhjZXB0aW9uIGhhbmRsZXJzLgogICovCiB2b2lkIHhQb3J0UGVuZFNWSGFuZGxlciggdm9pZCApIFBSSVZJTEVHRURfRlVOQ1RJT047CkBAIC0xNzUsNiArMTY4LDM1IEBACiAJIHN0YXRpYyBjb25zdCB2b2xhdGlsZSB1aW50OF90ICogY29uc3QgcGNJbnRlcnJ1cHRQcmlvcml0eVJlZ2lzdGVycyA9ICggY29uc3QgdWludDhfdCAqICkgcG9ydE5WSUNfSVBfUkVHSVNURVJTX09GRlNFVF8xNjsKICNlbmRpZiAvKiBjb25maWdBU1NFUlRfREVGSU5FRCAqLwogCisvKioKKyAqIEBicmllZiBDaGVja3Mgd2hldGhlciBvciBub3QgdGhlIHByb2Nlc3NvciBpcyBwcml2aWxlZ2VkLgorICoKKyAqIEByZXR1cm4gMSBpZiB0aGUgcHJvY2Vzc29yIGlzIGFscmVhZHkgcHJpdmlsZWdlZCwgMCBvdGhlcndpc2UuCisgKi8KK0Jhc2VUeXBlX3QgeElzUHJpdmlsZWdlZCggdm9pZCApOworCisvKioKKyAqIEBicmllZiBMb3dlcnMgdGhlIHByaXZpbGVnZSBsZXZlbCBieSBzZXR0aW5nIHRoZSBiaXQgMCBvZiB0aGUgQ09OVFJPTAorICogcmVnaXN0ZXIuCisgKgorICogQml0IDAgb2YgdGhlIENPTlRST0wgcmVnaXN0ZXIgZGVmaW5lcyB0aGUgcHJpdmlsZWdlIGxldmVsIG9mIFRocmVhZCBNb2RlLgorICogIEJpdFswXSA9IDAgLS0+IFRoZSBwcm9jZXNzb3IgaXMgcnVubmluZyBwcml2aWxlZ2VkCisgKiAgQml0WzBdID0gMSAtLT4gVGhlIHByb2Nlc3NvciBpcyBydW5uaW5nIHVucHJpdmlsZWdlZC4KKyAqLwordm9pZCB2UmVzZXRQcml2aWxlZ2UoIHZvaWQgKTsKKworLyoqCisgKiBAYnJpZWYgQ2FsbHMgdGhlIHBvcnQgc3BlY2lmaWMgY29kZSB0byByYWlzZSB0aGUgcHJpdmlsZWdlLgorICoKKyAqIEByZXR1cm4gcGRGQUxTRSBpZiBwcml2aWxlZ2Ugd2FzIHJhaXNlZCwgcGRUUlVFIG90aGVyd2lzZS4KKyAqLworZXh0ZXJuIEJhc2VUeXBlX3QgeFBvcnRSYWlzZVByaXZpbGVnZSggdm9pZCApOworCisvKioKKyAqIEBicmllZiBJZiB4UnVubmluZ1ByaXZpbGVnZWQgaXMgbm90IHBkVFJVRSwgY2FsbHMgdGhlIHBvcnQgc3BlY2lmaWMKKyAqIGNvZGUgdG8gcmVzZXQgdGhlIHByaXZpbGVnZSwgb3RoZXJ3aXNlIGRvZXMgbm90aGluZy4KKyAqLworZXh0ZXJuIHZvaWQgdlBvcnRSZXNldFByaXZpbGVnZSggQmFzZVR5cGVfdCB4UnVubmluZ1ByaXZpbGVnZWQgKTsKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiAvKgpAQCAtNjUxLDE1ICs2NzMsMjcgQEAKIH0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi1fX2FzbSBCYXNlVHlwZV90IHhQb3J0UmFpc2VQcml2aWxlZ2UoIHZvaWQgKQorX19hc20gQmFzZVR5cGVfdCB4SXNQcml2aWxlZ2VkKCB2b2lkICkKIHsKLQltcnMgcjAsIGNvbnRyb2wKLQl0c3QgcjAsICMxCQkJCQkJLyogSXMgdGhlIHRhc2sgcnVubmluZyBwcml2aWxlZ2VkPyAqLwotCWl0dGUgbmUKLQltb3ZuZSByMCwgIzAJCQkJCS8qIENPTlRST0xbMF0hPTAsIHJldHVybiBmYWxzZS4gKi8KLQlzdmNuZSBwb3J0U1ZDX1JBSVNFX1BSSVZJTEVHRQkvKiBTd2l0Y2ggdG8gcHJpdmlsZWdlZC4gKi8KLQltb3ZlcSByMCwgIzEJCQkJCS8qIENPTlRST0xbMF09PTAsIHJldHVybiB0cnVlLiAqLwotCWJ4IGxyCisJUFJFU0VSVkU4CisKKwltcnMgcjAsIGNvbnRyb2wJCS8qIHIwID0gQ09OVFJPTC4gKi8KKwl0c3QgcjAsICMxCQkJLyogUGVyZm9ybSByMCAmIDEgKGJpdHdpc2UgQU5EKSBhbmQgdXBkYXRlIHRoZSBjb25kaXRpb25zIGZsYWcuICovCisJaXRlIG5lCisJbW92bmUgcjAsICMwCQkvKiBDT05UUk9MWzBdIT0wLiBSZXR1cm4gZmFsc2UgdG8gaW5kaWNhdGUgdGhhdCB0aGUgcHJvY2Vzc29yIGlzIG5vdCBwcml2aWxlZ2VkLiAqLworCW1vdmVxIHIwLCAjMQkJLyogQ09OVFJPTFswXT09MC4gUmV0dXJuIHRydWUgdG8gaW5kaWNhdGUgdGhhdCB0aGUgcHJvY2Vzc29yIGlzIHByaXZpbGVnZWQuICovCisJYnggbHIJCQkJLyogUmV0dXJuLiAqLworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK19fYXNtIHZvaWQgdlJlc2V0UHJpdmlsZWdlKCB2b2lkICkKK3sKKwlQUkVTRVJWRTgKKworCW1ycyByMCwgY29udHJvbAkJLyogcjAgPSBDT05UUk9MLiAqLworCW9ycnMgcjAsICMxCQkJLyogcjAgPSByMCB8IDEuICovCisJbXNyIGNvbnRyb2wsIHIwCQkvKiBDT05UUk9MID0gcjAuICovCisJYnggbHIJCQkJLyogUmV0dXJuLiAqLwogfQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKZGlmZiAtLWdpdCBhL1NvdXJjZS9wb3J0YWJsZS9SVkRTL0FSTV9DTTRfTVBVL3BvcnRtYWNyby5oIGIvU291cmNlL3BvcnRhYmxlL1JWRFMvQVJNX0NNNF9NUFUvcG9ydG1hY3JvLmgKaW5kZXggOGUxYWQ5Ni4uOWEzNzYwMCAxMDA2NDQKLS0tIGEvU291cmNlL3BvcnRhYmxlL1JWRFMvQVJNX0NNNF9NUFUvcG9ydG1hY3JvLmgKKysrIGIvU291cmNlL3BvcnRhYmxlL1JWRFMvQVJNX0NNNF9NUFUvcG9ydG1hY3JvLmgKQEAgLTEsNiArMSw2IEBACiAvKgotICogRnJlZVJUT1MgS2VybmVsIFYxMC4wLjEKLSAqIENvcHlyaWdodCAoQykgMjAxNyBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMi4xCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgogICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgogICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KQEAgLTg1LDcgKzg1LDcgQEAKICNkZWZpbmUgcG9ydFBSSVZJTEVHRURfUkFNX1JFR0lPTgkJCSggMlVMICkKICNkZWZpbmUgcG9ydEdFTkVSQUxfUEVSSVBIRVJBTFNfUkVHSU9OCQkoIDNVTCApCiAjZGVmaW5lIHBvcnRTVEFDS19SRUdJT04JCQkJCSggNFVMICkKLSNkZWZpbmUgcG9ydEZJUlNUX0NPTkZJR1VSQUJMRV9SRUdJT04JICAgICggNVVMICkKKyNkZWZpbmUgcG9ydEZJUlNUX0NPTkZJR1VSQUJMRV9SRUdJT04JCSggNVVMICkKICNkZWZpbmUgcG9ydExBU1RfQ09ORklHVVJBQkxFX1JFR0lPTgkJKCA3VUwgKQogI2RlZmluZSBwb3J0TlVNX0NPTkZJR1VSQUJMRV9SRUdJT05TCQkoICggcG9ydExBU1RfQ09ORklHVVJBQkxFX1JFR0lPTiAtIHBvcnRGSVJTVF9DT05GSUdVUkFCTEVfUkVHSU9OICkgKyAxICkKICNkZWZpbmUgcG9ydFRPVEFMX05VTV9SRUdJT05TCQkJCSggcG9ydE5VTV9DT05GSUdVUkFCTEVfUkVHSU9OUyArIDEgKSAvKiBQbHVzIG9uZSB0byBtYWtlIHNwYWNlIGZvciB0aGUgc3RhY2sgcmVnaW9uLiAqLwpAQCAtMTk3LDcgKzE5NywyOCBAQAogI2lmbmRlZiBwb3J0Rk9SQ0VfSU5MSU5FCiAJI2RlZmluZSBwb3J0Rk9SQ0VfSU5MSU5FIF9fZm9yY2VpbmxpbmUKICNlbmRpZgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKK2V4dGVybiBCYXNlVHlwZV90IHhJc1ByaXZpbGVnZWQoIHZvaWQgKTsKK2V4dGVybiB2b2lkIHZSZXNldFByaXZpbGVnZSggdm9pZCApOworCisvKioKKyAqIEBicmllZiBDaGVja3Mgd2hldGhlciBvciBub3QgdGhlIHByb2Nlc3NvciBpcyBwcml2aWxlZ2VkLgorICoKKyAqIEByZXR1cm4gMSBpZiB0aGUgcHJvY2Vzc29yIGlzIGFscmVhZHkgcHJpdmlsZWdlZCwgMCBvdGhlcndpc2UuCisgKi8KKyNkZWZpbmUgcG9ydElTX1BSSVZJTEVHRUQoKQkJCXhJc1ByaXZpbGVnZWQoKQorCisvKioKKyAqIEBicmllZiBSYWlzZSBhbiBTVkMgcmVxdWVzdCB0byByYWlzZSBwcml2aWxlZ2UuCisgKi8KKyNkZWZpbmUgcG9ydFJBSVNFX1BSSVZJTEVHRSgpCQlfX2FzbSB7IHN2YyBwb3J0U1ZDX1JBSVNFX1BSSVZJTEVHRSB9CisKKy8qKgorICogQGJyaWVmIExvd2VycyB0aGUgcHJpdmlsZWdlIGxldmVsIGJ5IHNldHRpbmcgdGhlIGJpdCAwIG9mIHRoZSBDT05UUk9MCisgKiByZWdpc3Rlci4KKyAqLworI2RlZmluZSBwb3J0UkVTRVRfUFJJVklMRUdFKCkJCXZSZXNldFByaXZpbGVnZSgpCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogc3RhdGljIHBvcnRGT1JDRV9JTkxJTkUgdm9pZCB2UG9ydFNldEJBU0VQUkkoIHVpbnQzMl90IHVsQkFTRVBSSSApCkBAIC0yODAsMjQgKzMwMSw2IEBACiB9CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotLyogU2V0IHRoZSBwcml2aWxlZ2UgbGV2ZWwgdG8gdXNlciBtb2RlIGlmIHhSdW5uaW5nUHJpdmlsZWdlZCBpcyBmYWxzZS4gKi8KLXBvcnRGT1JDRV9JTkxJTkUgc3RhdGljIHZvaWQgdlBvcnRSZXNldFByaXZpbGVnZSggQmFzZVR5cGVfdCB4UnVubmluZ1ByaXZpbGVnZWQgKQotewotdWludDMyX3QgdWxSZWc7Ci0KLQlpZiggeFJ1bm5pbmdQcml2aWxlZ2VkICE9IHBkVFJVRSApCi0JewotCQlfX2FzbQotCQl7Ci0JCQltcnMgdWxSZWcsIGNvbnRyb2wKLQkJCW9yciB1bFJlZywgIzEKLQkJCW1zciBjb250cm9sLCB1bFJlZwotCQl9Ci0JfQotfQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLQogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9wb3J0YWJsZS9SVkRTL0FSTV9DTTcvcjBwMS9wb3J0LmMgYi9Tb3VyY2UvcG9ydGFibGUvUlZEUy9BUk1fQ003L3IwcDEvcG9ydC5jCmluZGV4IGY1ZTM0OGYuLmY0MzBlOGUgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9wb3J0YWJsZS9SVkRTL0FSTV9DTTcvcjBwMS9wb3J0LmMKKysrIGIvU291cmNlL3BvcnRhYmxlL1JWRFMvQVJNX0NNNy9yMHAxL3BvcnQuYwpAQCAtMSw2ICsxLDYgQEAKIC8qCi0gKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjAuMQotICogQ29weXJpZ2h0IChDKSAyMDE3IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRnJlZVJUT1MgS2VybmVsIFYxMC4yLjEKKyAqIENvcHlyaWdodCAoQykgMjAxOSBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCiAgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCiAgKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgpkaWZmIC0tZ2l0IGEvU291cmNlL3BvcnRhYmxlL1JWRFMvQVJNX0NNNy9yMHAxL3BvcnRtYWNyby5oIGIvU291cmNlL3BvcnRhYmxlL1JWRFMvQVJNX0NNNy9yMHAxL3BvcnRtYWNyby5oCmluZGV4IDc1OTM0ZWMuLjcwMDQ3NTYgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9wb3J0YWJsZS9SVkRTL0FSTV9DTTcvcjBwMS9wb3J0bWFjcm8uaAorKysgYi9Tb3VyY2UvcG9ydGFibGUvUlZEUy9BUk1fQ003L3IwcDEvcG9ydG1hY3JvLmgKQEAgLTEsNiArMSw2IEBACiAvKgotICogRnJlZVJUT1MgS2VybmVsIFYxMC4wLjEKLSAqIENvcHlyaWdodCAoQykgMjAxNyBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMi4xCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgogICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgogICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KZGlmZiAtLWdpdCBhL1NvdXJjZS9wb3J0YWJsZS9SVkRTL0FSTV9DTTdfTVBVL3IwcDEvcG9ydC5jIGIvU291cmNlL3BvcnRhYmxlL1JWRFMvQVJNX0NNN19NUFUvcjBwMS9wb3J0LmMKaW5kZXggZGJhNzI5Yy4uZjA5ODJjYSAxMDA2NDQKLS0tIGEvU291cmNlL3BvcnRhYmxlL1JWRFMvQVJNX0NNN19NUFUvcjBwMS9wb3J0LmMKKysrIGIvU291cmNlL3BvcnRhYmxlL1JWRFMvQVJNX0NNN19NUFUvcjBwMS9wb3J0LmMKQEAgLTEsNiArMSw2IEBACiAvKgotICogRnJlZVJUT1MgS2VybmVsIFYxMC4wLjEKLSAqIENvcHlyaWdodCAoQykgMjAxNyBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMi4xCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgogICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgogICogdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KQEAgLTUyLDYgKzUyLDI0IEBACiAjZGVmaW5lIHBvcnROVklDX1NZU1BSSTFfUkVHCQkJCQkoICogKCAoIHZvbGF0aWxlIHVpbnQzMl90ICogKSAweGUwMDBlZDFjICkgKQogI2RlZmluZSBwb3J0TlZJQ19TWVNfQ1RSTF9TVEFURV9SRUcJCQkJKCAqICggKCB2b2xhdGlsZSB1aW50MzJfdCAqICkgMHhlMDAwZWQyNCApICkKICNkZWZpbmUgcG9ydE5WSUNfTUVNX0ZBVUxUX0VOQUJMRQkJCQkoIDFVTCA8PCAxNlVMICkKKyNkZWZpbmUgcG9ydE5WSUNfU1lTVElDS19JTlRfQklUCQkJKCAxVUwgPDwgMVVMICkKKyNkZWZpbmUgcG9ydE5WSUNfU1lTVElDS19FTkFCTEVfQklUCQkJKCAxVUwgPDwgMFVMICkKKyNkZWZpbmUgcG9ydE5WSUNfU1lTVElDS19DT1VOVF9GTEFHX0JJVAkJKCAxVUwgPDwgMTZVTCApCisjZGVmaW5lIHBvcnROVklDX1BFTkRTVkNMRUFSX0JJVCAJCQkoIDFVTCA8PCAyN1VMICkKKyNkZWZpbmUgcG9ydE5WSUNfUEVORF9TWVNUSUNLX0NMRUFSX0JJVAkJKCAxVUwgPDwgMjVVTCApCisKKyNpZm5kZWYgY29uZmlnU1lTVElDS19DTE9DS19IWgorCSNkZWZpbmUgY29uZmlnU1lTVElDS19DTE9DS19IWiBjb25maWdDUFVfQ0xPQ0tfSFoKKwkvKiBFbnN1cmUgdGhlIFN5c1RpY2sgaXMgY2xvY2tlZCBhdCB0aGUgc2FtZSBmcmVxdWVuY3kgYXMgdGhlIGNvcmUuICovCisJI2RlZmluZSBwb3J0TlZJQ19TWVNUSUNLX0NMS19CSVQJKCAxVUwgPDwgMlVMICkKKyNlbHNlCisJLyogVGhlIHdheSB0aGUgU3lzVGljayBpcyBjbG9ja2VkIGlzIG5vdCBtb2RpZmllZCBpbiBjYXNlIGl0IGlzIG5vdCB0aGUgc2FtZQorCWFzIHRoZSBjb3JlLiAqLworCSNkZWZpbmUgcG9ydE5WSUNfU1lTVElDS19DTEtfQklUCSggMCApCisjZW5kaWYKKworI2RlZmluZSBwb3J0TUFYXzI0X0JJVF9OVU1CRVIgICAgICAgKCAweGZmZmZmZlVMICkKKyNkZWZpbmUgcG9ydE1JU1NFRF9DT1VOVFNfRkFDVE9SICAgICggNDVVTCApCiAKIC8qIENvbnN0YW50cyByZXF1aXJlZCB0byBhY2Nlc3MgYW5kIG1hbmlwdWxhdGUgdGhlIE1QVS4gKi8KICNkZWZpbmUgcG9ydE1QVV9UWVBFX1JFRwkJCQkJCSggKiAoICggdm9sYXRpbGUgdWludDMyX3QgKiApIDB4ZTAwMGVkOTAgKSApCkBAIC03MSw3ICs4OSw2IEBACiAjZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfQ0xLCQkJCQkoIDB4MDAwMDAwMDRVTCApCiAjZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfSU5UCQkJCQkoIDB4MDAwMDAwMDJVTCApCiAjZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfRU5BQkxFCQkJCQkoIDB4MDAwMDAwMDFVTCApCi0jZGVmaW5lIHBvcnROVklDX1NZU1RJQ0tfQ09VTlRfRkxBRwkJKCAxVUwgPDwgMTZVTCApCiAjZGVmaW5lIHBvcnROVklDX1BFTkRTVl9QUkkJCQkJCQkoICggKCB1aW50MzJfdCApIGNvbmZpZ0tFUk5FTF9JTlRFUlJVUFRfUFJJT1JJVFkgKSA8PCAxNlVMICkKICNkZWZpbmUgcG9ydE5WSUNfU1lTVElDS19QUkkJCQkJCSggKCAoIHVpbnQzMl90ICkgY29uZmlnS0VSTkVMX0lOVEVSUlVQVF9QUklPUklUWSApIDw8IDI0VUwgKQogI2RlZmluZSBwb3J0TlZJQ19TVkNfUFJJCQkJCQkJKCAoICggdWludDMyX3QgKSBjb25maWdNQVhfU1lTQ0FMTF9JTlRFUlJVUFRfUFJJT1JJVFkgLSAxVUwgKSA8PCAyNFVMICkKQEAgLTgyLDcgKzk5LDcgQEAKIAogLyogQ29uc3RhbnRzIHJlcXVpcmVkIHRvIHNldCB1cCB0aGUgaW5pdGlhbCBzdGFjay4gKi8KICNkZWZpbmUgcG9ydElOSVRJQUxfWFBTUgkJCQkJCSggMHgwMTAwMDAwMFVMICkKLSNkZWZpbmUgcG9ydElOSVRJQUxfRVhFQ19SRVRVUk4JCQkJCSggMHhmZmZmZmZmZFVMICkKKyNkZWZpbmUgcG9ydElOSVRJQUxfRVhDX1JFVFVSTgkJCQkJKCAweGZmZmZmZmZkVUwgKQogI2RlZmluZSBwb3J0SU5JVElBTF9DT05UUk9MX0lGX1VOUFJJVklMRUdFRAkJKCAweDAzICkKICNkZWZpbmUgcG9ydElOSVRJQUxfQ09OVFJPTF9JRl9QUklWSUxFR0VECQkoIDB4MDIgKQogCkBAIC05OSwxNCArMTE2LDYgQEAKIC8qIE9mZnNldHMgaW4gdGhlIHN0YWNrIHRvIHRoZSBwYXJhbWV0ZXJzIHdoZW4gaW5zaWRlIHRoZSBTVkMgaGFuZGxlci4gKi8KICNkZWZpbmUgcG9ydE9GRlNFVF9UT19QQwkJCQkJCSggNiApCiAKLS8qIFRoZSBzeXN0aWNrIGlzIGEgMjQtYml0IGNvdW50ZXIuICovCi0jZGVmaW5lIHBvcnRNQVhfMjRfQklUX05VTUJFUgkJKCAweGZmZmZmZlVMICkKLQotLyogQSBmaWRkbGUgZmFjdG9yIHRvIGVzdGltYXRlIHRoZSBudW1iZXIgb2YgU3lzVGljayBjb3VudHMgdGhhdCB3b3VsZCBoYXZlCi1vY2N1cnJlZCB3aGlsZSB0aGUgU3lzVGljayBjb3VudGVyIGlzIHN0b3BwZWQgZHVyaW5nIHRpY2tsZXNzIGlkbGUKLWNhbGN1bGF0aW9ucy4gKi8KLSNkZWZpbmUgcG9ydE1JU1NFRF9DT1VOVFNfRkFDVE9SCSggNDVVTCApCi0KIC8qIEZvciBzdHJpY3QgY29tcGxpYW5jZSB3aXRoIHRoZSBDb3J0ZXgtTSBzcGVjIHRoZSB0YXNrIHN0YXJ0IGFkZHJlc3Mgc2hvdWxkCiBoYXZlIGJpdC0wIGNsZWFyLCBhcyBpdCBpcyBsb2FkZWQgaW50byB0aGUgUEMgb24gZXhpdCBmcm9tIGFuIElTUi4gKi8KICNkZWZpbmUgcG9ydFNUQVJUX0FERFJFU1NfTUFTSwkJCQkoICggU3RhY2tUeXBlX3QgKSAweGZmZmZmZmZlVUwgKQpAQCAtMTE2LDEyICsxMjUsMzAgQEAKIHN3aXRjaGVzIGNhbiBvbmx5IG9jY3VyIHdoZW4gdXhDcml0aWNhbE5lc3RpbmcgaXMgemVyby4gKi8KIHN0YXRpYyBVQmFzZVR5cGVfdCB1eENyaXRpY2FsTmVzdGluZyA9IDB4YWFhYWFhYWE7CiAKKyNpZiggY29uZmlnVVNFX1RJQ0tMRVNTX0lETEUgPT0gMSApCiAvKgotICogU2V0dXAgdGhlIHRpbWVyIHRvIGdlbmVyYXRlIHRoZSB0aWNrIGludGVycnVwdHMuICBUaGUgaW1wbGVtZW50YXRpb24gaW4gdGhpcwotICogZmlsZSBpcyB3ZWFrIHRvIGFsbG93IGFwcGxpY2F0aW9uIHdyaXRlcnMgdG8gY2hhbmdlIHRoZSB0aW1lciB1c2VkIHRvCi0gKiBnZW5lcmF0ZSB0aGUgdGljayBpbnRlcnJ1cHQuCisgKiBUaGUgbnVtYmVyIG9mIFN5c1RpY2sgaW5jcmVtZW50cyB0aGF0IG1ha2UgdXAgb25lIHRpY2sgcGVyaW9kLgogICovCi12b2lkIHZQb3J0U2V0dXBUaW1lckludGVycnVwdCggdm9pZCApOworCXN0YXRpYyB1aW50MzJfdCB1bFRpbWVyQ291bnRzRm9yT25lVGljayA9IDA7CisKKy8qCisgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgdGljayBwZXJpb2RzIHRoYXQgY2FuIGJlIHN1cHByZXNzZWQgaXMgbGltaXRlZCBieSB0aGUKKyAqIDI0IGJpdCByZXNvbHV0aW9uIG9mIHRoZSBTeXNUaWNrIHRpbWVyLgorICovCisJc3RhdGljIHVpbnQzMl90IHhNYXhpbXVtUG9zc2libGVTdXBwcmVzc2VkVGlja3MgPSAwOworCisvKgorICogQ29tcGVuc2F0ZSBmb3IgdGhlIENQVSBjeWNsZXMgdGhhdCBwYXNzIHdoaWxlIHRoZSBTeXNUaWNrIGlzIHN0b3BwZWQgKGxvdworICogcG93ZXIgZnVuY3Rpb25hbGl0eSBvbmx5LgorICovCisJc3RhdGljIHVpbnQzMl90IHVsU3RvcHBlZFRpbWVyQ29tcGVuc2F0aW9uID0gMDsKKyNlbmRpZiAvKiBjb25maWdVU0VfVElDS0xFU1NfSURMRSAqLworCisKKy8qCisgKiBTZXR1cCB0aGUgdGltZXIgdG8gZ2VuZXJhdGUgdGhlIHRpY2sgaW50ZXJydXB0cy4KKyAqLworc3RhdGljIHZvaWQgcHJ2U2V0dXBUaW1lckludGVycnVwdCggdm9pZCApIFBSSVZJTEVHRURfRlVOQ1RJT047CiAKIC8qCiAgKiBDb25maWd1cmUgYSBudW1iZXIgb2Ygc3RhbmRhcmQgTVBVIHJlZ2lvbnMgdGhhdCBhcmUgdXNlZCBieSBhbGwgdGFza3MuCkBAIC0xNDEsMTMgKzE2OCw2IEBACiBzdGF0aWMgdWludDMyX3QgcHJ2R2V0TVBVUmVnaW9uU2l6ZVNldHRpbmcoIHVpbnQzMl90IHVsQWN0dWFsU2l6ZUluQnl0ZXMgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOwogCiAvKgotICogQ2hlY2tzIHRvIHNlZSBpZiBiZWluZyBjYWxsZWQgZnJvbSB0aGUgY29udGV4dCBvZiBhbiB1bnByaXZpbGVnZWQgdGFzaywgYW5kCi0gKiBpZiBzbyByYWlzZXMgdGhlIHByaXZpbGVnZSBsZXZlbCBhbmQgcmV0dXJucyBmYWxzZSAtIG90aGVyd2lzZSBkb2VzIG5vdGhpbmcKLSAqIG90aGVyIHRoYW4gcmV0dXJuIHRydWUuCi0gKi8KLUJhc2VUeXBlX3QgeFBvcnRSYWlzZVByaXZpbGVnZSggdm9pZCApOwotCi0vKgogICogU3RhbmRhcmQgRnJlZVJUT1MgZXhjZXB0aW9uIGhhbmRsZXJzLgogICovCiB2b2lkIHhQb3J0UGVuZFNWSGFuZGxlciggdm9pZCApIFBSSVZJTEVHRURfRlVOQ1RJT047CkBAIC0xNzYsMjkgKzE5Niw2IEBACiBzdGF0aWMgdWludDMyX3QgcHJ2UG9ydEdldElQU1IoIHZvaWQgKTsKIAogLyoKLSAqIFRoZSBudW1iZXIgb2YgU3lzVGljayBpbmNyZW1lbnRzIHRoYXQgbWFrZSB1cCBvbmUgdGljayBwZXJpb2QuCi0gKi8KLSNpZiBjb25maWdVU0VfVElDS0xFU1NfSURMRSA9PSAxCi0Jc3RhdGljIHVpbnQzMl90IHVsVGltZXJDb3VudHNGb3JPbmVUaWNrID0gMDsKLSNlbmRpZiAvKiBjb25maWdVU0VfVElDS0xFU1NfSURMRSAqLwotCi0vKgotICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHRpY2sgcGVyaW9kcyB0aGF0IGNhbiBiZSBzdXBwcmVzc2VkIGlzIGxpbWl0ZWQgYnkgdGhlCi0gKiAyNCBiaXQgcmVzb2x1dGlvbiBvZiB0aGUgU3lzVGljayB0aW1lci4KLSAqLwotI2lmIGNvbmZpZ1VTRV9USUNLTEVTU19JRExFID09IDEKLQlzdGF0aWMgdWludDMyX3QgeE1heGltdW1Qb3NzaWJsZVN1cHByZXNzZWRUaWNrcyA9IDA7Ci0jZW5kaWYgLyogY29uZmlnVVNFX1RJQ0tMRVNTX0lETEUgKi8KLQotLyoKLSAqIENvbXBlbnNhdGUgZm9yIHRoZSBDUFUgY3ljbGVzIHRoYXQgcGFzcyB3aGlsZSB0aGUgU3lzVGljayBpcyBzdG9wcGVkIChsb3cKLSAqIHBvd2VyIGZ1bmN0aW9uYWxpdHkgb25seS4KLSAqLwotI2lmIGNvbmZpZ1VTRV9USUNLTEVTU19JRExFID09IDEKLQlzdGF0aWMgdWludDMyX3QgdWxTdG9wcGVkVGltZXJDb21wZW5zYXRpb24gPSAwOwotI2VuZGlmIC8qIGNvbmZpZ1VTRV9USUNLTEVTU19JRExFICovCi0JCi0vKgogICogVXNlZCBieSB0aGUgcG9ydEFTU0VSVF9JRl9JTlRFUlJVUFRfUFJJT1JJVFlfSU5WQUxJRCgpIG1hY3JvIHRvIGVuc3VyZQogICogRnJlZVJUT1MgQVBJIGZ1bmN0aW9ucyBhcmUgbm90IGNhbGxlZCBmcm9tIGludGVycnVwdHMgdGhhdCBoYXZlIGJlZW4gYXNzaWduZWQKICAqIGEgcHJpb3JpdHkgYWJvdmUgY29uZmlnTUFYX1NZU0NBTExfSU5URVJSVVBUX1BSSU9SSVRZLgpAQCAtMjA5LDYgKzIwNiwzNSBAQAogCSBzdGF0aWMgY29uc3Qgdm9sYXRpbGUgdWludDhfdCAqIGNvbnN0IHBjSW50ZXJydXB0UHJpb3JpdHlSZWdpc3RlcnMgPSAoIGNvbnN0IHVpbnQ4X3QgKiApIHBvcnROVklDX0lQX1JFR0lTVEVSU19PRkZTRVRfMTY7CiAjZW5kaWYgLyogY29uZmlnQVNTRVJUX0RFRklORUQgKi8KIAorLyoqCisgKiBAYnJpZWYgQ2hlY2tzIHdoZXRoZXIgb3Igbm90IHRoZSBwcm9jZXNzb3IgaXMgcHJpdmlsZWdlZC4KKyAqCisgKiBAcmV0dXJuIDEgaWYgdGhlIHByb2Nlc3NvciBpcyBhbHJlYWR5IHByaXZpbGVnZWQsIDAgb3RoZXJ3aXNlLgorICovCitCYXNlVHlwZV90IHhJc1ByaXZpbGVnZWQoIHZvaWQgKTsKKworLyoqCisgKiBAYnJpZWYgTG93ZXJzIHRoZSBwcml2aWxlZ2UgbGV2ZWwgYnkgc2V0dGluZyB0aGUgYml0IDAgb2YgdGhlIENPTlRST0wKKyAqIHJlZ2lzdGVyLgorICoKKyAqIEJpdCAwIG9mIHRoZSBDT05UUk9MIHJlZ2lzdGVyIGRlZmluZXMgdGhlIHByaXZpbGVnZSBsZXZlbCBvZiBUaHJlYWQgTW9kZS4KKyAqICBCaXRbMF0gPSAwIC0tPiBUaGUgcHJvY2Vzc29yIGlzIHJ1bm5pbmcgcHJpdmlsZWdlZAorICogIEJpdFswXSA9IDEgLS0+IFRoZSBwcm9jZXNzb3IgaXMgcnVubmluZyB1bnByaXZpbGVnZWQuCisgKi8KK3ZvaWQgdlJlc2V0UHJpdmlsZWdlKCB2b2lkICk7CisKKy8qKgorICogQGJyaWVmIENhbGxzIHRoZSBwb3J0IHNwZWNpZmljIGNvZGUgdG8gcmFpc2UgdGhlIHByaXZpbGVnZS4KKyAqCisgKiBAcmV0dXJuIHBkRkFMU0UgaWYgcHJpdmlsZWdlIHdhcyByYWlzZWQsIHBkVFJVRSBvdGhlcndpc2UuCisgKi8KK2V4dGVybiBCYXNlVHlwZV90IHhQb3J0UmFpc2VQcml2aWxlZ2UoIHZvaWQgKTsKKworLyoqCisgKiBAYnJpZWYgSWYgeFJ1bm5pbmdQcml2aWxlZ2VkIGlzIG5vdCBwZFRSVUUsIGNhbGxzIHRoZSBwb3J0IHNwZWNpZmljCisgKiBjb2RlIHRvIHJlc2V0IHRoZSBwcml2aWxlZ2UsIG90aGVyd2lzZSBkb2VzIG5vdGhpbmcuCisgKi8KK2V4dGVybiB2b2lkIHZQb3J0UmVzZXRQcml2aWxlZ2UoIEJhc2VUeXBlX3QgeFJ1bm5pbmdQcml2aWxlZ2VkICk7CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogLyoKQEAgLTIzMCw3ICsyNTYsNyBAQAogCS8qIEEgc2F2ZSBtZXRob2QgaXMgYmVpbmcgdXNlZCB0aGF0IHJlcXVpcmVzIGVhY2ggdGFzayB0byBtYWludGFpbiBpdHMKIAlvd24gZXhlYyByZXR1cm4gdmFsdWUuICovCiAJcHhUb3BPZlN0YWNrLS07Ci0JKnB4VG9wT2ZTdGFjayA9IHBvcnRJTklUSUFMX0VYRUNfUkVUVVJOOworCSpweFRvcE9mU3RhY2sgPSBwb3J0SU5JVElBTF9FWENfUkVUVVJOOwogCiAJcHhUb3BPZlN0YWNrIC09IDk7CS8qIFIxMSwgUjEwLCBSOSwgUjgsIFI3LCBSNiwgUjUgYW5kIFI0LiAqLwogCkBAIC0zNzEsNiArMzk3LDI0IEBACiAJCQl1Y01heFByaW9yaXR5VmFsdWUgPDw9ICggdWludDhfdCApIDB4MDE7CiAJCX0KIAorCQkjaWZkZWYgX19OVklDX1BSSU9fQklUUworCQl7CisJCQkvKiBDaGVjayB0aGUgQ01TSVMgY29uZmlndXJhdGlvbiB0aGF0IGRlZmluZXMgdGhlIG51bWJlciBvZgorCQkJcHJpb3JpdHkgYml0cyBtYXRjaGVzIHRoZSBudW1iZXIgb2YgcHJpb3JpdHkgYml0cyBhY3R1YWxseSBxdWVyaWVkCisJCQlmcm9tIHRoZSBoYXJkd2FyZS4gKi8KKwkJCWNvbmZpZ0FTU0VSVCggKCBwb3J0TUFYX1BSSUdST1VQX0JJVFMgLSB1bE1heFBSSUdST1VQVmFsdWUgKSA9PSBfX05WSUNfUFJJT19CSVRTICk7CisJCX0KKwkJI2VuZGlmCisKKwkJI2lmZGVmIGNvbmZpZ1BSSU9fQklUUworCQl7CisJCQkvKiBDaGVjayB0aGUgRnJlZVJUT1MgY29uZmlndXJhdGlvbiB0aGF0IGRlZmluZXMgdGhlIG51bWJlciBvZgorCQkJcHJpb3JpdHkgYml0cyBtYXRjaGVzIHRoZSBudW1iZXIgb2YgcHJpb3JpdHkgYml0cyBhY3R1YWxseSBxdWVyaWVkCisJCQlmcm9tIHRoZSBoYXJkd2FyZS4gKi8KKwkJCWNvbmZpZ0FTU0VSVCggKCBwb3J0TUFYX1BSSUdST1VQX0JJVFMgLSB1bE1heFBSSUdST1VQVmFsdWUgKSA9PSBjb25maWdQUklPX0JJVFMgKTsKKwkJfQorCQkjZW5kaWYKKwogCQkvKiBTaGlmdCB0aGUgcHJpb3JpdHkgZ3JvdXAgdmFsdWUgYmFjayB0byBpdHMgcG9zaXRpb24gd2l0aGluIHRoZSBBSVJDUgogCQlyZWdpc3Rlci4gKi8KIAkJdWxNYXhQUklHUk9VUFZhbHVlIDw8PSBwb3J0UFJJR1JPVVBfU0hJRlQ7CkBAIC0zOTMsNyArNDM3LDcgQEAKIAogCS8qIFN0YXJ0IHRoZSB0aW1lciB0aGF0IGdlbmVyYXRlcyB0aGUgdGljayBJU1IuICBJbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZAogCWhlcmUgYWxyZWFkeS4gKi8KLQl2UG9ydFNldHVwVGltZXJJbnRlcnJ1cHQoKTsKKwlwcnZTZXR1cFRpbWVySW50ZXJydXB0KCk7CiAKIAkvKiBJbml0aWFsaXNlIHRoZSBjcml0aWNhbCBuZXN0aW5nIGNvdW50IHJlYWR5IGZvciB0aGUgZmlyc3QgdGFzay4gKi8KIAl1eENyaXRpY2FsTmVzdGluZyA9IDA7CkBAIC00MTUsMTIgKzQ1OSwyMSBAQAogX19hc20gdm9pZCBwcnZTdGFydEZpcnN0VGFzayggdm9pZCApCiB7CiAJUFJFU0VSVkU4Ci0JCi0JbGRyIHIwLCA9MHhFMDAwRUQwOAkvKiBVc2UgdGhlIE5WSUMgb2Zmc2V0IHJlZ2lzdGVyIHRvIGxvY2F0ZSB0aGUgc3RhY2suICovCisKKwkvKiBVc2UgdGhlIE5WSUMgb2Zmc2V0IHJlZ2lzdGVyIHRvIGxvY2F0ZSB0aGUgc3RhY2suICovCisJbGRyIHIwLCA9MHhFMDAwRUQwOAogCWxkciByMCwgW3IwXQogCWxkciByMCwgW3IwXQotCW1zciBtc3AsIHIwCQkJLyogU2V0IHRoZSBtc3AgYmFjayB0byB0aGUgc3RhcnQgb2YgdGhlIHN0YWNrLiAqLwotCWNwc2llIGkJCQkJLyogR2xvYmFsbHkgZW5hYmxlIGludGVycnVwdHMuICovCisJLyogU2V0IHRoZSBtc3AgYmFjayB0byB0aGUgc3RhcnQgb2YgdGhlIHN0YWNrLiAqLworCW1zciBtc3AsIHIwCisJLyogQ2xlYXIgdGhlIGJpdCB0aGF0IGluZGljYXRlcyB0aGUgRlBVIGlzIGluIHVzZSBpbiBjYXNlIHRoZSBGUFUgd2FzIHVzZWQKKwliZWZvcmUgdGhlIHNjaGVkdWxlciB3YXMgc3RhcnRlZCAtIHdoaWNoIHdvdWxkIG90aGVyd2lzZSByZXN1bHQgaW4gdGhlCisJdW5uZWNlc3NhcnkgbGVhdmluZyBvZiBzcGFjZSBpbiB0aGUgU1ZDIHN0YWNrIGZvciBsYXp5IHNhdmluZyBvZiBGUFUKKwlyZWdpc3RlcnMuICovCisJbW92IHIwLCAjMAorCW1zciBjb250cm9sLCByMAorCS8qIEdsb2JhbGx5IGVuYWJsZSBpbnRlcnJ1cHRzLiAqLworCWNwc2llIGkKIAljcHNpZSBmCiAJZHNiCiAJaXNiCkBAIC00NzIsOCArNTI1LDggQEAKIAogCW1ycyByMCwgcHNwCiAKLQlsZHIJcjMsID1weEN1cnJlbnRUQ0IJCQkvKiBHZXQgdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IFRDQi4gKi8KLQlsZHIJcjIsIFtyM10KKwlsZHIgcjMsID1weEN1cnJlbnRUQ0IJCQkvKiBHZXQgdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IFRDQi4gKi8KKwlsZHIgcjIsIFtyM10KIAogCXRzdCByMTQsICMweDEwCQkJCQkvKiBJcyB0aGUgdGFzayB1c2luZyB0aGUgRlBVIGNvbnRleHQ/ICBJZiBzbywgcHVzaCBoaWdoIHZmcCByZWdpc3RlcnMuICovCiAJaXQgZXEKQEAgLTQ4Myw5ICs1MzYsOCBAQAogCXN0bWRiIHIwISwge3IxLCByNC1yMTEsIHIxNH0JLyogU2F2ZSB0aGUgcmVtYWluaW5nIHJlZ2lzdGVycy4gKi8KIAlzdHIgcjAsIFtyMl0JCQkJCS8qIFNhdmUgdGhlIG5ldyB0b3Agb2Ygc3RhY2sgaW50byB0aGUgZmlyc3QgbWVtYmVyIG9mIHRoZSBUQ0IuICovCiAKLQlzdG1kYiBzcCEsIHtyM30KKwlzdG1kYiBzcCEsIHtyMCwgcjN9CiAJbW92IHIwLCAjY29uZmlnTUFYX1NZU0NBTExfSU5URVJSVVBUX1BSSU9SSVRZCi0gIGNwc2lkIGkKIAltc3IgYmFzZXByaSwgcjAKIAlkc2IKIAlpc2IKQEAgLTQ5Myw3ICs1NDUsNyBAQAogCWJsIHZUYXNrU3dpdGNoQ29udGV4dAogCW1vdiByMCwgIzAKIAltc3IgYmFzZXByaSwgcjAKLQlsZG1pYSBzcCEsIHtyM30KKwlsZG1pYSBzcCEsIHtyMCwgcjN9CiAJCQkJCQkJCQkvKiBSZXN0b3JlIHRoZSBjb250ZXh0LiAqLwogCWxkciByMSwgW3IzXQogCWxkciByMCwgW3IxXQkJCQkJLyogVGhlIGZpcnN0IGl0ZW0gaW4gdGhlIFRDQiBpcyB0aGUgdGFzayB0b3Agb2Ygc3RhY2suICovCkBAIC01MTEsMjkgKzU2MywxNiBAQAogCW1zciBwc3AsIHIwCiAJYnggcjE0CiAJbm9wCisJbm9wCiB9CisKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi12b2lkIHhQb3J0U3lzVGlja0hhbmRsZXIoIHZvaWQgKQotewotdWludDMyX3QgdWxEdW1teTsKKyNpZiggY29uZmlnVVNFX1RJQ0tMRVNTX0lETEUgPT0gMSApCiAKLQl1bER1bW15ID0gcG9ydFNFVF9JTlRFUlJVUFRfTUFTS19GUk9NX0lTUigpOwotCXsKLQkJLyogSW5jcmVtZW50IHRoZSBSVE9TIHRpY2suICovCi0JCWlmKCB4VGFza0luY3JlbWVudFRpY2soKSAhPSBwZEZBTFNFICkKLQkJewotCQkJLyogUGVuZCBhIGNvbnRleHQgc3dpdGNoLiAqLwotCQkJcG9ydE5WSUNfSU5UX0NUUkxfUkVHID0gcG9ydE5WSUNfUEVORFNWU0VUX0JJVDsKLQkJfQotCX0KLQlwb3J0Q0xFQVJfSU5URVJSVVBUX01BU0tfRlJPTV9JU1IoIHVsRHVtbXkgKTsKLX0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2lmIGNvbmZpZ1VTRV9USUNLTEVTU19JRExFID09IDEKIAlfX3dlYWsgdm9pZCB2UG9ydFN1cHByZXNzVGlja3NBbmRTbGVlcCggVGlja1R5cGVfdCB4RXhwZWN0ZWRJZGxlVGltZSApCiAJewotCXVpbnQzMl90IHVsUmVsb2FkVmFsdWUsIHVsQ29tcGxldGVUaWNrUGVyaW9kcywgdWxDb21wbGV0ZWRTeXNUaWNrRGVjcmVtZW50cywgdWxTeXNUaWNrQ1RSTDsKKwl1aW50MzJfdCB1bFJlbG9hZFZhbHVlLCB1bENvbXBsZXRlVGlja1BlcmlvZHMsIHVsQ29tcGxldGVkU3lzVGlja0RlY3JlbWVudHM7CiAJVGlja1R5cGVfdCB4TW9kaWZpYWJsZUlkbGVUaW1lOwogCiAJCS8qIE1ha2Ugc3VyZSB0aGUgU3lzVGljayByZWxvYWQgdmFsdWUgZG9lcyBub3Qgb3ZlcmZsb3cgdGhlIGNvdW50ZXIuICovCkBAIC01NDYsNyArNTg1LDcgQEAKIAkJaXMgYWNjb3VudGVkIGZvciBhcyBiZXN0IGl0IGNhbiBiZSwgYnV0IHVzaW5nIHRoZSB0aWNrbGVzcyBtb2RlIHdpbGwKIAkJaW5ldml0YWJseSByZXN1bHQgaW4gc29tZSB0aW55IGRyaWZ0IG9mIHRoZSB0aW1lIG1haW50YWluZWQgYnkgdGhlCiAJCWtlcm5lbCB3aXRoIHJlc3BlY3QgdG8gY2FsZW5kYXIgdGltZS4gKi8KLQkJcG9ydE5WSUNfU1lTVElDS19DVFJMX1JFRyAmPSB+cG9ydE5WSUNfU1lTVElDS19FTkFCTEU7CisJCXBvcnROVklDX1NZU1RJQ0tfQ1RSTF9SRUcgJj0gfnBvcnROVklDX1NZU1RJQ0tfRU5BQkxFX0JJVDsKIAogCQkvKiBDYWxjdWxhdGUgdGhlIHJlbG9hZCB2YWx1ZSByZXF1aXJlZCB0byB3YWl0IHhFeHBlY3RlZElkbGVUaW1lCiAJCXRpY2sgcGVyaW9kcy4gIC0xIGlzIHVzZWQgYmVjYXVzZSB0aGlzIGNvZGUgd2lsbCBleGVjdXRlIHBhcnQgd2F5CkBAIC01NzIsNyArNjExLDcgQEAKIAkJCXBvcnROVklDX1NZU1RJQ0tfTE9BRF9SRUcgPSBwb3J0TlZJQ19TWVNUSUNLX0NVUlJFTlRfVkFMVUVfUkVHOwogCiAJCQkvKiBSZXN0YXJ0IFN5c1RpY2suICovCi0JCQlwb3J0TlZJQ19TWVNUSUNLX0NUUkxfUkVHIHw9IHBvcnROVklDX1NZU1RJQ0tfRU5BQkxFOworCQkJcG9ydE5WSUNfU1lTVElDS19DVFJMX1JFRyB8PSBwb3J0TlZJQ19TWVNUSUNLX0VOQUJMRV9CSVQ7CiAKIAkJCS8qIFJlc2V0IHRoZSByZWxvYWQgcmVnaXN0ZXIgdG8gdGhlIHZhbHVlIHJlcXVpcmVkIGZvciBub3JtYWwgdGljawogCQkJcGVyaW9kcy4gKi8KQEAgLTU5Miw3ICs2MzEsNyBAQAogCQkJcG9ydE5WSUNfU1lTVElDS19DVVJSRU5UX1ZBTFVFX1JFRyA9IDBVTDsKIAogCQkJLyogUmVzdGFydCBTeXNUaWNrLiAqLwotCQkJcG9ydE5WSUNfU1lTVElDS19DVFJMX1JFRyB8PSBwb3J0TlZJQ19TWVNUSUNLX0VOQUJMRTsKKwkJCXBvcnROVklDX1NZU1RJQ0tfQ1RSTF9SRUcgfD0gcG9ydE5WSUNfU1lTVElDS19FTkFCTEVfQklUOwogCiAJCQkvKiBTbGVlcCB1bnRpbCBzb21ldGhpbmcgaGFwcGVucy4gIGNvbmZpZ1BSRV9TTEVFUF9QUk9DRVNTSU5HKCkgY2FuCiAJCQlzZXQgaXRzIHBhcmFtZXRlciB0byAwIHRvIGluZGljYXRlIHRoYXQgaXRzIGltcGxlbWVudGF0aW9uIGNvbnRhaW5zCkBAIC02MDksMjMgKzY0OCw0MSBAQAogCQkJfQogCQkJY29uZmlnUE9TVF9TTEVFUF9QUk9DRVNTSU5HKCAmeEV4cGVjdGVkSWRsZVRpbWUgKTsKIAotCQkJLyogU3RvcCBTeXNUaWNrLiAgQWdhaW4sIHRoZSB0aW1lIHRoZSBTeXNUaWNrIGlzIHN0b3BwZWQgZm9yIGlzCi0JCQlhY2NvdW50ZWQgZm9yIGFzIGJlc3QgaXQgY2FuIGJlLCBidXQgdXNpbmcgdGhlIHRpY2tsZXNzIG1vZGUgd2lsbAotCQkJaW5ldml0YWJseSByZXN1bHQgaW4gc29tZSB0aW55IGRyaWZ0IG9mIHRoZSB0aW1lIG1haW50YWluZWQgYnkgdGhlCi0JCQlrZXJuZWwgd2l0aCByZXNwZWN0IHRvIGNhbGVuZGFyIHRpbWUuICovCi0JCQl1bFN5c1RpY2tDVFJMID0gcG9ydE5WSUNfU1lTVElDS19DVFJMX1JFRzsKLQkJCXBvcnROVklDX1NZU1RJQ0tfQ1RSTF9SRUcgPSAoIHVsU3lzVGlja0NUUkwgJiB+cG9ydE5WSUNfU1lTVElDS19FTkFCTEUgKTsKLQotCQkJLyogUmUtZW5hYmxlIGludGVycnVwdHMgLSBzZWUgY29tbWVudHMgYWJvdmUgX19kaXNhYmxlX2lycSgpIGNhbGwKLQkJCWFib3ZlLiAqLworCQkJLyogUmUtZW5hYmxlIGludGVycnVwdHMgdG8gYWxsb3cgdGhlIGludGVycnVwdCB0aGF0IGJyb3VnaHQgdGhlIE1DVQorCQkJb3V0IG9mIHNsZWVwIG1vZGUgdG8gZXhlY3V0ZSBpbW1lZGlhdGVseS4gIHNlZSBjb21tZW50cyBhYm92ZQorCQkJX19kaXNhYmxlX2ludGVycnVwdCgpIGNhbGwgYWJvdmUuICovCiAJCQlfX2VuYWJsZV9pcnEoKTsKKwkJCV9fZHNiKCBwb3J0U1lfRlVMTF9SRUFEX1dSSVRFICk7CisJCQlfX2lzYiggcG9ydFNZX0ZVTExfUkVBRF9XUklURSApOwogCi0JCQlpZiggKCB1bFN5c1RpY2tDVFJMICYgcG9ydE5WSUNfU1lTVElDS19DT1VOVF9GTEFHICkgIT0gMCApCisJCQkvKiBEaXNhYmxlIGludGVycnVwdHMgYWdhaW4gYmVjYXVzZSB0aGUgY2xvY2sgaXMgYWJvdXQgdG8gYmUgc3RvcHBlZAorCQkJYW5kIGludGVycnVwdHMgdGhhdCBleGVjdXRlIHdoaWxlIHRoZSBjbG9jayBpcyBzdG9wcGVkIHdpbGwgaW5jcmVhc2UKKwkJCWFueSBzbGlwcGFnZSBiZXR3ZWVuIHRoZSB0aW1lIG1haW50YWluZWQgYnkgdGhlIFJUT1MgYW5kIGNhbGVuZGFyCisJCQl0aW1lLiAqLworCQkJX19kaXNhYmxlX2lycSgpOworCQkJX19kc2IoIHBvcnRTWV9GVUxMX1JFQURfV1JJVEUgKTsKKwkJCV9faXNiKCBwb3J0U1lfRlVMTF9SRUFEX1dSSVRFICk7CisKKwkJCS8qIERpc2FibGUgdGhlIFN5c1RpY2sgY2xvY2sgd2l0aG91dCByZWFkaW5nIHRoZQorCQkJcG9ydE5WSUNfU1lTVElDS19DVFJMX1JFRyByZWdpc3RlciB0byBlbnN1cmUgdGhlCisJCQlwb3J0TlZJQ19TWVNUSUNLX0NPVU5UX0ZMQUdfQklUIGlzIG5vdCBjbGVhcmVkIGlmIGl0IGlzIHNldC4gIEFnYWluLAorCQkJdGhlIHRpbWUgdGhlIFN5c1RpY2sgaXMgc3RvcHBlZCBmb3IgaXMgYWNjb3VudGVkIGZvciBhcyBiZXN0IGl0IGNhbgorCQkJYmUsIGJ1dCB1c2luZyB0aGUgdGlja2xlc3MgbW9kZSB3aWxsIGluZXZpdGFibHkgcmVzdWx0IGluIHNvbWUgdGlueQorCQkJZHJpZnQgb2YgdGhlIHRpbWUgbWFpbnRhaW5lZCBieSB0aGUga2VybmVsIHdpdGggcmVzcGVjdCB0byBjYWxlbmRhcgorCQkJdGltZSovCisJCQlwb3J0TlZJQ19TWVNUSUNLX0NUUkxfUkVHID0gKCBwb3J0TlZJQ19TWVNUSUNLX0NMS19CSVQgfCBwb3J0TlZJQ19TWVNUSUNLX0lOVF9CSVQgKTsKKworCQkJLyogRGV0ZXJtaW5lIGlmIHRoZSBTeXNUaWNrIGNsb2NrIGhhcyBhbHJlYWR5IGNvdW50ZWQgdG8gemVybyBhbmQKKwkJCWJlZW4gc2V0IGJhY2sgdG8gdGhlIGN1cnJlbnQgcmVsb2FkIHZhbHVlICh0aGUgcmVsb2FkIGJhY2sgYmVpbmcKKwkJCWNvcnJlY3QgZm9yIHRoZSBlbnRpcmUgZXhwZWN0ZWQgaWRsZSB0aW1lKSBvciBpZiB0aGUgU3lzVGljayBpcyB5ZXQKKwkJCXRvIGNvdW50IHRvIHplcm8gKGluIHdoaWNoIGNhc2UgYW4gaW50ZXJydXB0IG90aGVyIHRoYW4gdGhlIFN5c1RpY2sKKwkJCW11c3QgaGF2ZSBicm91Z2h0IHRoZSBzeXN0ZW0gb3V0IG9mIHNsZWVwIG1vZGUpLiAqLworCQkJaWYoICggcG9ydE5WSUNfU1lTVElDS19DVFJMX1JFRyAmIHBvcnROVklDX1NZU1RJQ0tfQ09VTlRfRkxBR19CSVQgKSAhPSAwICkKIAkJCXsKIAkJCQl1aW50MzJfdCB1bENhbGN1bGF0ZWRMb2FkVmFsdWU7CiAKLQkJCQkvKiBUaGUgdGljayBpbnRlcnJ1cHQgaGFzIGFscmVhZHkgZXhlY3V0ZWQsIGFuZCB0aGUgU3lzVGljawotCQkJCWNvdW50IHJlbG9hZGVkIHdpdGggdWxSZWxvYWRWYWx1ZS4gIFJlc2V0IHRoZQorCQkJCS8qIFRoZSB0aWNrIGludGVycnVwdCBpcyBhbHJlYWR5IHBlbmRpbmcsIGFuZCB0aGUgU3lzVGljayBjb3VudAorCQkJCXJlbG9hZGVkIHdpdGggdWxSZWxvYWRWYWx1ZS4gIFJlc2V0IHRoZQogCQkJCXBvcnROVklDX1NZU1RJQ0tfTE9BRF9SRUcgd2l0aCB3aGF0ZXZlciByZW1haW5zIG9mIHRoaXMgdGljawogCQkJCXBlcmlvZC4gKi8KIAkJCQl1bENhbGN1bGF0ZWRMb2FkVmFsdWUgPSAoIHVsVGltZXJDb3VudHNGb3JPbmVUaWNrIC0gMVVMICkgLSAoIHVsUmVsb2FkVmFsdWUgLSBwb3J0TlZJQ19TWVNUSUNLX0NVUlJFTlRfVkFMVUVfUkVHICk7CkBAIC02NDAsMTEgKzY5Nyw5IEBACiAKIAkJCQlwb3J0TlZJQ19TWVNUSUNLX0xPQURfUkVHID0gdWxDYWxjdWxhdGVkTG9hZFZhbHVlOwogCi0JCQkJLyogVGhlIHRpY2sgaW50ZXJydXB0IGhhbmRsZXIgd2lsbCBhbHJlYWR5IGhhdmUgcGVuZGVkIHRoZSB0aWNrCi0JCQkJcHJvY2Vzc2luZyBpbiB0aGUga2VybmVsLiAgQXMgdGhlIHBlbmRpbmcgdGljayB3aWxsIGJlCi0JCQkJcHJvY2Vzc2VkIGFzIHNvb24gYXMgdGhpcyBmdW5jdGlvbiBleGl0cywgdGhlIHRpY2sgdmFsdWUKLQkJCQltYWludGFpbmVkIGJ5IHRoZSB0aWNrIGlzIHN0ZXBwZWQgZm9yd2FyZCBieSBvbmUgbGVzcyB0aGFuIHRoZQotCQkJCXRpbWUgc3BlbnQgd2FpdGluZy4gKi8KKwkJCQkvKiBBcyB0aGUgcGVuZGluZyB0aWNrIHdpbGwgYmUgcHJvY2Vzc2VkIGFzIHNvb24gYXMgdGhpcworCQkJCWZ1bmN0aW9uIGV4aXRzLCB0aGUgdGljayB2YWx1ZSBtYWludGFpbmVkIGJ5IHRoZSB0aWNrIGlzIHN0ZXBwZWQKKwkJCQlmb3J3YXJkIGJ5IG9uZSBsZXNzIHRoYW4gdGhlIHRpbWUgc3BlbnQgd2FpdGluZy4gKi8KIAkJCQl1bENvbXBsZXRlVGlja1BlcmlvZHMgPSB4RXhwZWN0ZWRJZGxlVGltZSAtIDFVTDsKIAkJCX0KIAkJCWVsc2UKQEAgLTY2Niw2MyArNzIxLDc1IEBACiAKIAkJCS8qIFJlc3RhcnQgU3lzVGljayBzbyBpdCBydW5zIGZyb20gcG9ydE5WSUNfU1lTVElDS19MT0FEX1JFRwogCQkJYWdhaW4sIHRoZW4gc2V0IHBvcnROVklDX1NZU1RJQ0tfTE9BRF9SRUcgYmFjayB0byBpdHMgc3RhbmRhcmQKLQkJCXZhbHVlLiAgVGhlIGNyaXRpY2FsIHNlY3Rpb24gaXMgdXNlZCB0byBlbnN1cmUgdGhlIHRpY2sgaW50ZXJydXB0Ci0JCQljYW4gb25seSBleGVjdXRlIG9uY2UgaW4gdGhlIGNhc2UgdGhhdCB0aGUgcmVsb2FkIHJlZ2lzdGVyIGlzIG5lYXIKLQkJCXplcm8uICovCisJCQl2YWx1ZS4gKi8KIAkJCXBvcnROVklDX1NZU1RJQ0tfQ1VSUkVOVF9WQUxVRV9SRUcgPSAwVUw7Ci0JCQlwb3J0RU5URVJfQ1JJVElDQUwoKTsKLQkJCXsKLQkJCQlwb3J0TlZJQ19TWVNUSUNLX0NUUkxfUkVHIHw9IHBvcnROVklDX1NZU1RJQ0tfRU5BQkxFOwotCQkJCXZUYXNrU3RlcFRpY2soIHVsQ29tcGxldGVUaWNrUGVyaW9kcyApOwotCQkJCXBvcnROVklDX1NZU1RJQ0tfTE9BRF9SRUcgPSB1bFRpbWVyQ291bnRzRm9yT25lVGljayAtIDFVTDsKLQkJCX0KLQkJCXBvcnRFWElUX0NSSVRJQ0FMKCk7CisJCQlwb3J0TlZJQ19TWVNUSUNLX0NUUkxfUkVHIHw9IHBvcnROVklDX1NZU1RJQ0tfRU5BQkxFX0JJVDsKKwkJCXZUYXNrU3RlcFRpY2soIHVsQ29tcGxldGVUaWNrUGVyaW9kcyApOworCQkJcG9ydE5WSUNfU1lTVElDS19MT0FEX1JFRyA9IHVsVGltZXJDb3VudHNGb3JPbmVUaWNrIC0gMVVMOworCisJCQkvKiBFeGl0IHdpdGggaW50ZXJycHRzIGVuYWJsZWQuICovCisJCQlfX2VuYWJsZV9pcnEoKTsKIAkJfQogCX0KIAogI2VuZGlmIC8qICNpZiBjb25maWdVU0VfVElDS0xFU1NfSURMRSAqLwogCit2b2lkIHhQb3J0U3lzVGlja0hhbmRsZXIoIHZvaWQgKQorewordWludDMyX3QgdWxEdW1teTsKKworCXVsRHVtbXkgPSBwb3J0U0VUX0lOVEVSUlVQVF9NQVNLX0ZST01fSVNSKCk7CisJeworCQkvKiBJbmNyZW1lbnQgdGhlIFJUT1MgdGljay4gKi8KKwkJaWYoIHhUYXNrSW5jcmVtZW50VGljaygpICE9IHBkRkFMU0UgKQorCQl7CisJCQkvKiBQZW5kIGEgY29udGV4dCBzd2l0Y2guICovCisJCQlwb3J0TlZJQ19JTlRfQ1RSTF9SRUcgPSBwb3J0TlZJQ19QRU5EU1ZTRVRfQklUOworCQl9CisJfQorCXBvcnRDTEVBUl9JTlRFUlJVUFRfTUFTS19GUk9NX0lTUiggdWxEdW1teSApOworfQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKIC8qCiAgKiBTZXR1cCB0aGUgc3lzdGljayB0aW1lciB0byBnZW5lcmF0ZSB0aGUgdGljayBpbnRlcnJ1cHRzIGF0IHRoZSByZXF1aXJlZAogICogZnJlcXVlbmN5LgogICovCi0jaWYgY29uZmlnT1ZFUlJJREVfREVGQVVMVF9USUNLX0NPTkZJR1VSQVRJT04gPT0gMAorc3RhdGljIHZvaWQgcHJ2U2V0dXBUaW1lckludGVycnVwdCggdm9pZCApCit7CisgICAgLyogQ2FsY3VsYXRlIHRoZSBjb25zdGFudHMgcmVxdWlyZWQgdG8gY29uZmlndXJlIHRoZSB0aWNrIGludGVycnVwdC4gKi8KKyNpZiggY29uZmlnVVNFX1RJQ0tMRVNTX0lETEUgPT0gMSApCisgICAgdWxUaW1lckNvdW50c0Zvck9uZVRpY2sgPSAoIGNvbmZpZ1NZU1RJQ0tfQ0xPQ0tfSFogLyBjb25maWdUSUNLX1JBVEVfSFogKTsKKyAgICB4TWF4aW11bVBvc3NpYmxlU3VwcHJlc3NlZFRpY2tzID0gcG9ydE1BWF8yNF9CSVRfTlVNQkVSIC8gdWxUaW1lckNvdW50c0Zvck9uZVRpY2s7CisgICAgdWxTdG9wcGVkVGltZXJDb21wZW5zYXRpb24gPSBwb3J0TUlTU0VEX0NPVU5UU19GQUNUT1IgLyAoIGNvbmZpZ0NQVV9DTE9DS19IWiAvIGNvbmZpZ1NZU1RJQ0tfQ0xPQ0tfSFogKTsKKyNlbmRpZiAvKiBjb25maWdVU0VfVElDS0xFU1NfSURMRSAqLwogCi0Jdm9pZCB2UG9ydFNldHVwVGltZXJJbnRlcnJ1cHQoIHZvaWQgKQotCXsKLQkJLyogQ2FsY3VsYXRlIHRoZSBjb25zdGFudHMgcmVxdWlyZWQgdG8gY29uZmlndXJlIHRoZSB0aWNrIGludGVycnVwdC4gKi8KLQkJI2lmIGNvbmZpZ1VTRV9USUNLTEVTU19JRExFID09IDEKLQkJewotCQkJdWxUaW1lckNvdW50c0Zvck9uZVRpY2sgPSAoIGNvbmZpZ0NQVV9DTE9DS19IWiAvIGNvbmZpZ1RJQ0tfUkFURV9IWiApOwotCQkJeE1heGltdW1Qb3NzaWJsZVN1cHByZXNzZWRUaWNrcyA9IHBvcnRNQVhfMjRfQklUX05VTUJFUiAvIHVsVGltZXJDb3VudHNGb3JPbmVUaWNrOwotCQkJdWxTdG9wcGVkVGltZXJDb21wZW5zYXRpb24gPSBwb3J0TUlTU0VEX0NPVU5UU19GQUNUT1IgLyAoIGNvbmZpZ0NQVV9DTE9DS19IWiAvIGNvbmZpZ1NZU1RJQ0tfQ0xPQ0tfSFogKTsKLQkJfQotCQkjZW5kaWYgLyogY29uZmlnVVNFX1RJQ0tMRVNTX0lETEUgKi8KLQkJLyogQ29uZmlndXJlIFN5c1RpY2sgdG8gaW50ZXJydXB0IGF0IHRoZSByZXF1ZXN0ZWQgcmF0ZS4gKi8KLQkJcG9ydE5WSUNfU1lTVElDS19MT0FEX1JFRyA9ICggY29uZmlnQ1BVX0NMT0NLX0haIC8gY29uZmlnVElDS19SQVRFX0haICkgLSAxVUw7Ci0JCXBvcnROVklDX1NZU1RJQ0tfQ1RSTF9SRUcgPSBwb3J0TlZJQ19TWVNUSUNLX0NMSyB8IHBvcnROVklDX1NZU1RJQ0tfSU5UIHwgcG9ydE5WSUNfU1lTVElDS19FTkFCTEU7Ci0JfQotI2VuZGlmIC8qIGNvbmZpZ09WRVJSSURFX0RFRkFVTFRfVElDS19DT05GSUdVUkFUSU9OICovCiAKKwkvKiBSZXNldCB0aGUgU3lzVGljay4gKi8KKwlwb3J0TlZJQ19TWVNUSUNLX0NUUkxfUkVHID0gMFVMOworCXBvcnROVklDX1NZU1RJQ0tfQ1VSUkVOVF9WQUxVRV9SRUcgPSAwVUw7CisKKwkvKiBDb25maWd1cmUgU3lzVGljayB0byBpbnRlcnJ1cHQgYXQgdGhlIHJlcXVlc3RlZCByYXRlLiAqLworCXBvcnROVklDX1NZU1RJQ0tfTE9BRF9SRUcgPSAoIGNvbmZpZ0NQVV9DTE9DS19IWiAvIGNvbmZpZ1RJQ0tfUkFURV9IWiApIC0gMVVMOworCXBvcnROVklDX1NZU1RJQ0tfQ1RSTF9SRUcgPSBwb3J0TlZJQ19TWVNUSUNLX0NMSyB8IHBvcnROVklDX1NZU1RJQ0tfSU5UIHwgcG9ydE5WSUNfU1lTVElDS19FTkFCTEU7Cit9CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogX19hc20gdm9pZCB2UG9ydFN3aXRjaFRvVXNlck1vZGUoIHZvaWQgKQogewogCVBSRVNFUlZFOAotCQorCiAJbXJzIHIwLCBjb250cm9sCiAJb3JyIHIwLCAjMQogCW1zciBjb250cm9sLCByMAogCWJ4IHIxNAogfQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0JCisKIF9fYXNtIHZvaWQgdlBvcnRFbmFibGVWRlAoIHZvaWQgKQogewogCVBSRVNFUlZFOAotCQorCiAJbGRyLncgcjAsID0weEUwMDBFRDg4CQkvKiBUaGUgRlBVIGVuYWJsZSBiaXRzIGFyZSBpbiB0aGUgQ1BBQ1IuICovCiAJbGRyIHIxLCBbcjBdCiAKQEAgLTc0Miw2ICs4MDksOSBAQAogZXh0ZXJuIHVpbnQzMl90IF9fcHJpdmlsZWdlZF9kYXRhX3N0YXJ0X187CiBleHRlcm4gdWludDMyX3QgX19wcml2aWxlZ2VkX2RhdGFfZW5kX187CiAKKwkvKiBDaGVjayB0aGUgZXhwZWN0ZWQgTVBVIGlzIHByZXNlbnQuICovCisJaWYoIHBvcnRNUFVfVFlQRV9SRUcgPT0gcG9ydEVYUEVDVEVEX01QVV9UWVBFX1ZBTFVFICkKKwl7CiAJCS8qIEZpcnN0IHNldHVwIHRoZSBlbnRpcmUgZmxhc2ggZm9yIHVucHJpdmlsZWdlZCByZWFkIG9ubHkgYWNjZXNzLiAqLwogCQlwb3J0TVBVX1JFR0lPTl9CQVNFX0FERFJFU1NfUkVHID0JKCAoIHVpbnQzMl90ICkgX19GTEFTSF9zZWdtZW50X3N0YXJ0X18gKSB8IC8qIEJhc2UgYWRkcmVzcy4gKi8KIAkJCQkJCQkJCQkJKCBwb3J0TVBVX1JFR0lPTl9WQUxJRCApIHwKQEAgLTc5MCw2ICs4NjAsNyBAQAogCiAJCS8qIEVuYWJsZSB0aGUgTVBVIHdpdGggdGhlIGJhY2tncm91bmQgcmVnaW9uIGNvbmZpZ3VyZWQuICovCiAJCXBvcnRNUFVfQ1RSTF9SRUcgfD0gKCBwb3J0TVBVX0VOQUJMRSB8IHBvcnRNUFVfQkFDS0dST1VORF9FTkFCTEUgKTsKKwl9CiB9CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIApAQCAtODE3LDE1ICs4ODgsMjcgQEAKIH0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi1fX2FzbSBCYXNlVHlwZV90IHhQb3J0UmFpc2VQcml2aWxlZ2UoIHZvaWQgKQorX19hc20gQmFzZVR5cGVfdCB4SXNQcml2aWxlZ2VkKCB2b2lkICkKIHsKLQltcnMgcjAsIGNvbnRyb2wKLQl0c3QgcjAsICMxCQkJCQkJLyogSXMgdGhlIHRhc2sgcnVubmluZyBwcml2aWxlZ2VkPyAqLwotCWl0dGUgbmUKLQltb3ZuZSByMCwgIzAJCQkJCS8qIENPTlRST0xbMF0hPTAsIHJldHVybiBmYWxzZS4gKi8KLQlzdmNuZSBwb3J0U1ZDX1JBSVNFX1BSSVZJTEVHRQkvKiBTd2l0Y2ggdG8gcHJpdmlsZWdlZC4gKi8KLQltb3ZlcSByMCwgIzEJCQkJCS8qIENPTlRST0xbMF09PTAsIHJldHVybiB0cnVlLiAqLwotCWJ4IGxyCisJUFJFU0VSVkU4CisKKwltcnMgcjAsIGNvbnRyb2wJCS8qIHIwID0gQ09OVFJPTC4gKi8KKwl0c3QgcjAsICMxCQkJLyogUGVyZm9ybSByMCAmIDEgKGJpdHdpc2UgQU5EKSBhbmQgdXBkYXRlIHRoZSBjb25kaXRpb25zIGZsYWcuICovCisJaXRlIG5lCisJbW92bmUgcjAsICMwCQkvKiBDT05UUk9MWzBdIT0wLiBSZXR1cm4gZmFsc2UgdG8gaW5kaWNhdGUgdGhhdCB0aGUgcHJvY2Vzc29yIGlzIG5vdCBwcml2aWxlZ2VkLiAqLworCW1vdmVxIHIwLCAjMQkJLyogQ09OVFJPTFswXT09MC4gUmV0dXJuIHRydWUgdG8gaW5kaWNhdGUgdGhhdCB0aGUgcHJvY2Vzc29yIGlzIHByaXZpbGVnZWQuICovCisJYnggbHIJCQkJLyogUmV0dXJuLiAqLworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK19fYXNtIHZvaWQgdlJlc2V0UHJpdmlsZWdlKCB2b2lkICkKK3sKKwlQUkVTRVJWRTgKKworCW1ycyByMCwgY29udHJvbAkJLyogcjAgPSBDT05UUk9MLiAqLworCW9ycnMgcjAsICMxCQkJLyogcjAgPSByMCB8IDEuICovCisJbXNyIGNvbnRyb2wsIHIwCQkvKiBDT05UUk9MID0gcjAuICovCisJYnggbHIJCQkJLyogUmV0dXJuLiAqLwogfQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKZGlmZiAtLWdpdCBhL1NvdXJjZS9wb3J0YWJsZS9SVkRTL0FSTV9DTTdfTVBVL3IwcDEvcG9ydG1hY3JvLmggYi9Tb3VyY2UvcG9ydGFibGUvUlZEUy9BUk1fQ003X01QVS9yMHAxL3BvcnRtYWNyby5oCmluZGV4IDQ5NTdkNDMuLjNkYjZjMTYgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9wb3J0YWJsZS9SVkRTL0FSTV9DTTdfTVBVL3IwcDEvcG9ydG1hY3JvLmgKKysrIGIvU291cmNlL3BvcnRhYmxlL1JWRFMvQVJNX0NNN19NUFUvcjBwMS9wb3J0bWFjcm8uaApAQCAtMSw2ICsxLDYgQEAKIC8qCi0gKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjAuMQotICogQ29weXJpZ2h0IChDKSAyMDE3IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRnJlZVJUT1MgS2VybmVsIFYxMC4yLjEKKyAqIENvcHlyaWdodCAoQykgMjAxOSBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCiAgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCiAgKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgpAQCAtODUsNyArODUsNyBAQAogI2RlZmluZSBwb3J0UFJJVklMRUdFRF9SQU1fUkVHSU9OCQkJKCAyVUwgKQogI2RlZmluZSBwb3J0R0VORVJBTF9QRVJJUEhFUkFMU19SRUdJT04JCSggM1VMICkKICNkZWZpbmUgcG9ydFNUQUNLX1JFR0lPTgkJCQkJKCA0VUwgKQotI2RlZmluZSBwb3J0RklSU1RfQ09ORklHVVJBQkxFX1JFR0lPTgkgICAgKCA1VUwgKQorI2RlZmluZSBwb3J0RklSU1RfQ09ORklHVVJBQkxFX1JFR0lPTgkJKCA1VUwgKQogI2RlZmluZSBwb3J0TEFTVF9DT05GSUdVUkFCTEVfUkVHSU9OCQkoIDdVTCApCiAjZGVmaW5lIHBvcnROVU1fQ09ORklHVVJBQkxFX1JFR0lPTlMJCSggKCBwb3J0TEFTVF9DT05GSUdVUkFCTEVfUkVHSU9OIC0gcG9ydEZJUlNUX0NPTkZJR1VSQUJMRV9SRUdJT04gKSArIDEgKQogI2RlZmluZSBwb3J0VE9UQUxfTlVNX1JFR0lPTlMJCQkJKCBwb3J0TlVNX0NPTkZJR1VSQUJMRV9SRUdJT05TICsgMSApIC8qIFBsdXMgb25lIHRvIG1ha2Ugc3BhY2UgZm9yIHRoZSBzdGFjayByZWdpb24uICovCkBAIC0xOTcsNyArMTk3LDI4IEBACiAjaWZuZGVmIHBvcnRGT1JDRV9JTkxJTkUKIAkjZGVmaW5lIHBvcnRGT1JDRV9JTkxJTkUgX19mb3JjZWlubGluZQogI2VuZGlmCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAorZXh0ZXJuIEJhc2VUeXBlX3QgeElzUHJpdmlsZWdlZCggdm9pZCApOworZXh0ZXJuIHZvaWQgdlJlc2V0UHJpdmlsZWdlKCB2b2lkICk7CisKKy8qKgorICogQGJyaWVmIENoZWNrcyB3aGV0aGVyIG9yIG5vdCB0aGUgcHJvY2Vzc29yIGlzIHByaXZpbGVnZWQuCisgKgorICogQHJldHVybiAxIGlmIHRoZSBwcm9jZXNzb3IgaXMgYWxyZWFkeSBwcml2aWxlZ2VkLCAwIG90aGVyd2lzZS4KKyAqLworI2RlZmluZSBwb3J0SVNfUFJJVklMRUdFRCgpCQkJeElzUHJpdmlsZWdlZCgpCisKKy8qKgorICogQGJyaWVmIFJhaXNlIGFuIFNWQyByZXF1ZXN0IHRvIHJhaXNlIHByaXZpbGVnZS4KKyAqLworI2RlZmluZSBwb3J0UkFJU0VfUFJJVklMRUdFKCkJCV9fYXNtIHsgc3ZjIHBvcnRTVkNfUkFJU0VfUFJJVklMRUdFIH0KKworLyoqCisgKiBAYnJpZWYgTG93ZXJzIHRoZSBwcml2aWxlZ2UgbGV2ZWwgYnkgc2V0dGluZyB0aGUgYml0IDAgb2YgdGhlIENPTlRST0wKKyAqIHJlZ2lzdGVyLgorICovCisjZGVmaW5lIHBvcnRSRVNFVF9QUklWSUxFR0UoKQkJdlJlc2V0UHJpdmlsZWdlKCkKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiBzdGF0aWMgcG9ydEZPUkNFX0lOTElORSB2b2lkIHZQb3J0U2V0QkFTRVBSSSggdWludDMyX3QgdWxCQVNFUFJJICkKQEAgLTIzMyw3ICsyNTQsNyBAQAogCV9fYXNtCiAJewogCQkvKiBTZXQgQkFTRVBSSSB0byAwIHNvIG5vIGludGVycnVwdHMgYXJlIG1hc2tlZC4gIFRoaXMgZnVuY3Rpb24gaXMgb25seQotCQl1c2VkIHRvIGxvd2VyIHRoZSBtYXNrIGluIGFuIGludGVycnVwdCwgc28gbWVtb3J5IGJhcnJpZXJzIGFyZSBub3QgCisJCXVzZWQgdG8gbG93ZXIgdGhlIG1hc2sgaW4gYW4gaW50ZXJydXB0LCBzbyBtZW1vcnkgYmFycmllcnMgYXJlIG5vdAogCQl1c2VkLiAqLwogCQltc3IgYmFzZXByaSwgIzAKIAl9CkBAIC0yODQsMjQgKzMwNSw2IEBACiB9CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotLyogU2V0IHRoZSBwcml2aWxlZ2UgbGV2ZWwgdG8gdXNlciBtb2RlIGlmIHhSdW5uaW5nUHJpdmlsZWdlZCBpcyBmYWxzZS4gKi8KLXBvcnRGT1JDRV9JTkxJTkUgc3RhdGljIHZvaWQgdlBvcnRSZXNldFByaXZpbGVnZSggQmFzZVR5cGVfdCB4UnVubmluZ1ByaXZpbGVnZWQgKQotewotdWludDMyX3QgdWxSZWc7Ci0JCi0JaWYoIHhSdW5uaW5nUHJpdmlsZWdlZCAhPSBwZFRSVUUgKSAKLQl7Ci0JCV9fYXNtIAotCQl7Ci0JCQltcnMgdWxSZWcsIGNvbnRyb2wKLQkJCW9yciB1bFJlZywgIzEKLQkJCW1zciBjb250cm9sLCB1bFJlZwotCQl9Ci0JfQotfQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLQogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9wb3J0YWJsZS9UYXNraW5nL0FSTV9DTTRGL3BvcnQuYyBiL1NvdXJjZS9wb3J0YWJsZS9UYXNraW5nL0FSTV9DTTRGL3BvcnQuYwppbmRleCBiYjEyNzQ3Li5hZjc3ZmUzIDEwMDY0NAotLS0gYS9Tb3VyY2UvcG9ydGFibGUvVGFza2luZy9BUk1fQ000Ri9wb3J0LmMKKysrIGIvU291cmNlL3BvcnRhYmxlL1Rhc2tpbmcvQVJNX0NNNEYvcG9ydC5jCkBAIC0xLDYgKzEsNiBAQAogLyoKLSAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMC4xCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjIuMAorICogQ29weXJpZ2h0IChDKSAyMDE5IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKICAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKICAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCmRpZmYgLS1naXQgYS9Tb3VyY2UvcG9ydGFibGUvVGFza2luZy9BUk1fQ000Ri9wb3J0X2FzbS5hc20gYi9Tb3VyY2UvcG9ydGFibGUvVGFza2luZy9BUk1fQ000Ri9wb3J0X2FzbS5hc20KaW5kZXggMmI0ZjcwNy4uMjI5MjhkZSAxMDA2NDQKLS0tIGEvU291cmNlL3BvcnRhYmxlL1Rhc2tpbmcvQVJNX0NNNEYvcG9ydF9hc20uYXNtCisrKyBiL1NvdXJjZS9wb3J0YWJsZS9UYXNraW5nL0FSTV9DTTRGL3BvcnRfYXNtLmFzbQpAQCAtMSw2ICsxLDYgQEAKIDsvKgotOyAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMC4xCi07ICogQ29weXJpZ2h0IChDKSAyMDE3IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorOyAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMi4wCis7ICogQ29weXJpZ2h0IChDKSAyMDE5IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogOyAqCiA7ICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgogOyAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCmRpZmYgLS1naXQgYS9Tb3VyY2UvcG9ydGFibGUvVGFza2luZy9BUk1fQ000Ri9wb3J0bWFjcm8uaCBiL1NvdXJjZS9wb3J0YWJsZS9UYXNraW5nL0FSTV9DTTRGL3BvcnRtYWNyby5oCmluZGV4IGE4YzU2NzAuLmUzZjNjMmMgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9wb3J0YWJsZS9UYXNraW5nL0FSTV9DTTRGL3BvcnRtYWNyby5oCisrKyBiL1NvdXJjZS9wb3J0YWJsZS9UYXNraW5nL0FSTV9DTTRGL3BvcnRtYWNyby5oCkBAIC0xLDYgKzEsNiBAQAogLyoKLSAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMC4xCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjIuMAorICogQ29weXJpZ2h0IChDKSAyMDE5IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKICAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKICAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCmRpZmYgLS1naXQgYS9Tb3VyY2UvcXVldWUuYyBiL1NvdXJjZS9xdWV1ZS5jCmluZGV4IDA3MzA5NTAuLmQ4ODJiZjYgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9xdWV1ZS5jCisrKyBiL1NvdXJjZS9xdWV1ZS5jCkBAIC0xLDYgKzEsNiBAQAogLyoKLSAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMC4xCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjIuMQorICogQ29weXJpZ2h0IChDKSAyMDE5IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKICAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKICAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCkBAIC00MSwxMSArNDEsMTEgQEAKIAkjaW5jbHVkZSAiY3JvdXRpbmUuaCIKICNlbmRpZgogCi0vKiBMaW50IGU5NjEgYW5kIGU3NTAgYXJlIHN1cHByZXNzZWQgYXMgYSBNSVNSQSBleGNlcHRpb24ganVzdGlmaWVkIGJlY2F1c2UgdGhlCi1NUFUgcG9ydHMgcmVxdWlyZSBNUFVfV1JBUFBFUlNfSU5DTFVERURfRlJPTV9BUElfRklMRSB0byBiZSBkZWZpbmVkIGZvciB0aGUKLWhlYWRlciBmaWxlcyBhYm92ZSwgYnV0IG5vdCBpbiB0aGlzIGZpbGUsIGluIG9yZGVyIHRvIGdlbmVyYXRlIHRoZSBjb3JyZWN0Ci1wcml2aWxlZ2VkIFZzIHVucHJpdmlsZWdlZCBsaW5rYWdlIGFuZCBwbGFjZW1lbnQuICovCi0jdW5kZWYgTVBVX1dSQVBQRVJTX0lOQ0xVREVEX0ZST01fQVBJX0ZJTEUgLypsaW50ICFlOTYxICFlNzUwLiAqLworLyogTGludCBlOTAyMSwgZTk2MSBhbmQgZTc1MCBhcmUgc3VwcHJlc3NlZCBhcyBhIE1JU1JBIGV4Y2VwdGlvbiBqdXN0aWZpZWQKK2JlY2F1c2UgdGhlIE1QVSBwb3J0cyByZXF1aXJlIE1QVV9XUkFQUEVSU19JTkNMVURFRF9GUk9NX0FQSV9GSUxFIHRvIGJlIGRlZmluZWQKK2ZvciB0aGUgaGVhZGVyIGZpbGVzIGFib3ZlLCBidXQgbm90IGluIHRoaXMgZmlsZSwgaW4gb3JkZXIgdG8gZ2VuZXJhdGUgdGhlCitjb3JyZWN0IHByaXZpbGVnZWQgVnMgdW5wcml2aWxlZ2VkIGxpbmthZ2UgYW5kIHBsYWNlbWVudC4gKi8KKyN1bmRlZiBNUFVfV1JBUFBFUlNfSU5DTFVERURfRlJPTV9BUElfRklMRSAvKmxpbnQgIWU5NjEgIWU3NTAgIWU5MDIxLiAqLwogCiAKIC8qIENvbnN0YW50cyB1c2VkIHdpdGggdGhlIGNSeExvY2sgYW5kIGNUeExvY2sgc3RydWN0dXJlIG1lbWJlcnMuICovCkBAIC01NiwxNyArNTYsMjYgQEAKIHBjVGFpbCBtZW1iZXJzIGFyZSB1c2VkIGFzIHBvaW50ZXJzIGludG8gdGhlIHF1ZXVlIHN0b3JhZ2UgYXJlYS4gIFdoZW4gdGhlCiBRdWV1ZV90IHN0cnVjdHVyZSBpcyB1c2VkIHRvIHJlcHJlc2VudCBhIG11dGV4IHBjSGVhZCBhbmQgcGNUYWlsIHBvaW50ZXJzIGFyZQogbm90IG5lY2Vzc2FyeSwgYW5kIHRoZSBwY0hlYWQgcG9pbnRlciBpcyBzZXQgdG8gTlVMTCB0byBpbmRpY2F0ZSB0aGF0IHRoZQotcGNUYWlsIHBvaW50ZXIgYWN0dWFsbHkgcG9pbnRzIHRvIHRoZSBtdXRleCBob2xkZXIgKGlmIGFueSkuICBNYXAgYWx0ZXJuYXRpdmUKLW5hbWVzIHRvIHRoZSBwY0hlYWQgYW5kIHBjVGFpbCBzdHJ1Y3R1cmUgbWVtYmVycyB0byBlbnN1cmUgdGhlIHJlYWRhYmlsaXR5IG9mCi10aGUgY29kZSBpcyBtYWludGFpbmVkIGRlc3BpdGUgdGhpcyBkdWFsIHVzZSBvZiB0d28gc3RydWN0dXJlIG1lbWJlcnMuICBBbgotYWx0ZXJuYXRpdmUgaW1wbGVtZW50YXRpb24gd291bGQgYmUgdG8gdXNlIGEgdW5pb24sIGJ1dCB1c2Ugb2YgYSB1bmlvbiBpcwotYWdhaW5zdCB0aGUgY29kaW5nIHN0YW5kYXJkIChhbHRob3VnaCBhbiBleGNlcHRpb24gdG8gdGhlIHN0YW5kYXJkIGhhcyBiZWVuCi1wZXJtaXR0ZWQgd2hlcmUgdGhlIGR1YWwgdXNlIGFsc28gc2lnbmlmaWNhbnRseSBjaGFuZ2VzIHRoZSB0eXBlIG9mIHRoZQotc3RydWN0dXJlIG1lbWJlcikuICovCi0jZGVmaW5lIHB4TXV0ZXhIb2xkZXIJCQkJCXBjVGFpbAorc3RydWN0dXJlIGluc3RlYWQgaG9sZHMgYSBwb2ludGVyIHRvIHRoZSBtdXRleCBob2xkZXIgKGlmIGFueSkuICBNYXAgYWx0ZXJuYXRpdmUKK25hbWVzIHRvIHRoZSBwY0hlYWQgYW5kIHN0cnVjdHVyZSBtZW1iZXIgdG8gZW5zdXJlIHRoZSByZWFkYWJpbGl0eSBvZiB0aGUgY29kZQoraXMgbWFpbnRhaW5lZC4gIFRoZSBRdWV1ZVBvaW50ZXJzX3QgYW5kIFNlbWFwaG9yZURhdGFfdCB0eXBlcyBhcmUgdXNlZCB0byBmb3JtCithIHVuaW9uIGFzIHRoZWlyIHVzYWdlIGlzIG11dHVhbGx5IGV4Y2x1c2l2ZSBkZXBlbmRlbnQgb24gd2hhdCB0aGUgcXVldWUgaXMKK2JlaW5nIHVzZWQgZm9yLiAqLwogI2RlZmluZSB1eFF1ZXVlVHlwZQkJCQkJCXBjSGVhZAogI2RlZmluZSBxdWV1ZVFVRVVFX0lTX01VVEVYCQkJCU5VTEwKIAordHlwZWRlZiBzdHJ1Y3QgUXVldWVQb2ludGVycworeworCWludDhfdCAqcGNUYWlsOwkJCQkJLyo8IFBvaW50cyB0byB0aGUgYnl0ZSBhdCB0aGUgZW5kIG9mIHRoZSBxdWV1ZSBzdG9yYWdlIGFyZWEuICBPbmNlIG1vcmUgYnl0ZSBpcyBhbGxvY2F0ZWQgdGhhbiBuZWNlc3NhcnkgdG8gc3RvcmUgdGhlIHF1ZXVlIGl0ZW1zLCB0aGlzIGlzIHVzZWQgYXMgYSBtYXJrZXIuICovCisJaW50OF90ICpwY1JlYWRGcm9tOwkJCQkvKjwgUG9pbnRzIHRvIHRoZSBsYXN0IHBsYWNlIHRoYXQgYSBxdWV1ZWQgaXRlbSB3YXMgcmVhZCBmcm9tIHdoZW4gdGhlIHN0cnVjdHVyZSBpcyB1c2VkIGFzIGEgcXVldWUuICovCit9IFF1ZXVlUG9pbnRlcnNfdDsKKwordHlwZWRlZiBzdHJ1Y3QgU2VtYXBob3JlRGF0YQoreworCVRhc2tIYW5kbGVfdCB4TXV0ZXhIb2xkZXI7CQkgLyo8IFRoZSBoYW5kbGUgb2YgdGhlIHRhc2sgdGhhdCBob2xkcyB0aGUgbXV0ZXguICovCisJVUJhc2VUeXBlX3QgdXhSZWN1cnNpdmVDYWxsQ291bnQ7Lyo8IE1haW50YWlucyBhIGNvdW50IG9mIHRoZSBudW1iZXIgb2YgdGltZXMgYSByZWN1cnNpdmUgbXV0ZXggaGFzIGJlZW4gcmVjdXJzaXZlbHkgJ3Rha2VuJyB3aGVuIHRoZSBzdHJ1Y3R1cmUgaXMgdXNlZCBhcyBhIG11dGV4LiAqLworfSBTZW1hcGhvcmVEYXRhX3Q7CisKIC8qIFNlbWFwaG9yZXMgZG8gbm90IGFjdHVhbGx5IHN0b3JlIG9yIGNvcHkgZGF0YSwgc28gaGF2ZSBhbiBpdGVtIHNpemUgb2YKIHplcm8uICovCiAjZGVmaW5lIHF1ZXVlU0VNQVBIT1JFX1FVRVVFX0lURU1fTEVOR1RIICggKCBVQmFzZVR5cGVfdCApIDAgKQpAQCAtODMsMTggKzkyLDE3IEBACiAvKgogICogRGVmaW5pdGlvbiBvZiB0aGUgcXVldWUgdXNlZCBieSB0aGUgc2NoZWR1bGVyLgogICogSXRlbXMgYXJlIHF1ZXVlZCBieSBjb3B5LCBub3QgcmVmZXJlbmNlLiAgU2VlIHRoZSBmb2xsb3dpbmcgbGluayBmb3IgdGhlCi0gKiByYXRpb25hbGU6IGh0dHA6Ly93d3cuZnJlZXJ0b3Mub3JnL0VtYmVkZGVkLVJUT1MtUXVldWVzLmh0bWwKKyAqIHJhdGlvbmFsZTogaHR0cHM6Ly93d3cuZnJlZXJ0b3Mub3JnL0VtYmVkZGVkLVJUT1MtUXVldWVzLmh0bWwKICAqLwotdHlwZWRlZiBzdHJ1Y3QgUXVldWVEZWZpbml0aW9uCit0eXBlZGVmIHN0cnVjdCBRdWV1ZURlZmluaXRpb24gCQkvKiBUaGUgb2xkIG5hbWluZyBjb252ZW50aW9uIGlzIHVzZWQgdG8gcHJldmVudCBicmVha2luZyBrZXJuZWwgYXdhcmUgZGVidWdnZXJzLiAqLwogewogCWludDhfdCAqcGNIZWFkOwkJCQkJLyo8IFBvaW50cyB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBxdWV1ZSBzdG9yYWdlIGFyZWEuICovCi0JaW50OF90ICpwY1RhaWw7CQkJCQkvKjwgUG9pbnRzIHRvIHRoZSBieXRlIGF0IHRoZSBlbmQgb2YgdGhlIHF1ZXVlIHN0b3JhZ2UgYXJlYS4gIE9uY2UgbW9yZSBieXRlIGlzIGFsbG9jYXRlZCB0aGFuIG5lY2Vzc2FyeSB0byBzdG9yZSB0aGUgcXVldWUgaXRlbXMsIHRoaXMgaXMgdXNlZCBhcyBhIG1hcmtlci4gKi8KIAlpbnQ4X3QgKnBjV3JpdGVUbzsJCQkJLyo8IFBvaW50cyB0byB0aGUgZnJlZSBuZXh0IHBsYWNlIGluIHRoZSBzdG9yYWdlIGFyZWEuICovCiAKLQl1bmlvbgkJCQkJCQkvKiBVc2Ugb2YgYSB1bmlvbiBpcyBhbiBleGNlcHRpb24gdG8gdGhlIGNvZGluZyBzdGFuZGFyZCB0byBlbnN1cmUgdHdvIG11dHVhbGx5IGV4Y2x1c2l2ZSBzdHJ1Y3R1cmUgbWVtYmVycyBkb24ndCBhcHBlYXIgc2ltdWx0YW5lb3VzbHkgKHdhc3RpbmcgUkFNKS4gKi8KKwl1bmlvbgogCXsKLQkJaW50OF90ICpwY1JlYWRGcm9tOwkJCS8qPCBQb2ludHMgdG8gdGhlIGxhc3QgcGxhY2UgdGhhdCBhIHF1ZXVlZCBpdGVtIHdhcyByZWFkIGZyb20gd2hlbiB0aGUgc3RydWN0dXJlIGlzIHVzZWQgYXMgYSBxdWV1ZS4gKi8KLQkJVUJhc2VUeXBlX3QgdXhSZWN1cnNpdmVDYWxsQ291bnQ7Lyo8IE1haW50YWlucyBhIGNvdW50IG9mIHRoZSBudW1iZXIgb2YgdGltZXMgYSByZWN1cnNpdmUgbXV0ZXggaGFzIGJlZW4gcmVjdXJzaXZlbHkgJ3Rha2VuJyB3aGVuIHRoZSBzdHJ1Y3R1cmUgaXMgdXNlZCBhcyBhIG11dGV4LiAqLworCQlRdWV1ZVBvaW50ZXJzX3QgeFF1ZXVlOwkJLyo8IERhdGEgcmVxdWlyZWQgZXhjbHVzaXZlbHkgd2hlbiB0aGlzIHN0cnVjdHVyZSBpcyB1c2VkIGFzIGEgcXVldWUuICovCisJCVNlbWFwaG9yZURhdGFfdCB4U2VtYXBob3JlOyAvKjwgRGF0YSByZXF1aXJlZCBleGNsdXNpdmVseSB3aGVuIHRoaXMgc3RydWN0dXJlIGlzIHVzZWQgYXMgYSBzZW1hcGhvcmUuICovCiAJfSB1OwogCiAJTGlzdF90IHhUYXNrc1dhaXRpbmdUb1NlbmQ7CQkvKjwgTGlzdCBvZiB0YXNrcyB0aGF0IGFyZSBibG9ja2VkIHdhaXRpbmcgdG8gcG9zdCBvbnRvIHRoaXMgcXVldWUuICBTdG9yZWQgaW4gcHJpb3JpdHkgb3JkZXIuICovCkBAIC0yNDYsMTYgKzI1NCwxNiBAQAogCiBCYXNlVHlwZV90IHhRdWV1ZUdlbmVyaWNSZXNldCggUXVldWVIYW5kbGVfdCB4UXVldWUsIEJhc2VUeXBlX3QgeE5ld1F1ZXVlICkKIHsKLVF1ZXVlX3QgKiBjb25zdCBweFF1ZXVlID0gKCBRdWV1ZV90ICogKSB4UXVldWU7CitRdWV1ZV90ICogY29uc3QgcHhRdWV1ZSA9IHhRdWV1ZTsKIAogCWNvbmZpZ0FTU0VSVCggcHhRdWV1ZSApOwogCiAJdGFza0VOVEVSX0NSSVRJQ0FMKCk7CiAJewotCQlweFF1ZXVlLT5wY1RhaWwgPSBweFF1ZXVlLT5wY0hlYWQgKyAoIHB4UXVldWUtPnV4TGVuZ3RoICogcHhRdWV1ZS0+dXhJdGVtU2l6ZSApOworCQlweFF1ZXVlLT51LnhRdWV1ZS5wY1RhaWwgPSBweFF1ZXVlLT5wY0hlYWQgKyAoIHB4UXVldWUtPnV4TGVuZ3RoICogcHhRdWV1ZS0+dXhJdGVtU2l6ZSApOyAvKmxpbnQgIWU5MDE2IFBvaW50ZXIgYXJpdGhtZXRpYyBhbGxvd2VkIG9uIGNoYXIgdHlwZXMsIGVzcGVjaWFsbHkgd2hlbiBpdCBhc3Npc3RzIGNvbnZleWluZyBpbnRlbnQuICovCiAJCXB4UXVldWUtPnV4TWVzc2FnZXNXYWl0aW5nID0gKCBVQmFzZVR5cGVfdCApIDBVOwogCQlweFF1ZXVlLT5wY1dyaXRlVG8gPSBweFF1ZXVlLT5wY0hlYWQ7Ci0JCXB4UXVldWUtPnUucGNSZWFkRnJvbSA9IHB4UXVldWUtPnBjSGVhZCArICggKCBweFF1ZXVlLT51eExlbmd0aCAtICggVUJhc2VUeXBlX3QgKSAxVSApICogcHhRdWV1ZS0+dXhJdGVtU2l6ZSApOworCQlweFF1ZXVlLT51LnhRdWV1ZS5wY1JlYWRGcm9tID0gcHhRdWV1ZS0+cGNIZWFkICsgKCAoIHB4UXVldWUtPnV4TGVuZ3RoIC0gMVUgKSAqIHB4UXVldWUtPnV4SXRlbVNpemUgKTsgLypsaW50ICFlOTAxNiBQb2ludGVyIGFyaXRobWV0aWMgYWxsb3dlZCBvbiBjaGFyIHR5cGVzLCBlc3BlY2lhbGx5IHdoZW4gaXQgYXNzaXN0cyBjb252ZXlpbmcgaW50ZW50LiAqLwogCQlweFF1ZXVlLT5jUnhMb2NrID0gcXVldWVVTkxPQ0tFRDsKIAkJcHhRdWV1ZS0+Y1R4TG9jayA9IHF1ZXVlVU5MT0NLRUQ7CiAKQEAgLTMyMSwxMyArMzI5LDE0IEBACiAJCQl0aGUgcmVhbCBxdWV1ZSBhbmQgc2VtYXBob3JlIHN0cnVjdHVyZXMuICovCiAJCQl2b2xhdGlsZSBzaXplX3QgeFNpemUgPSBzaXplb2YoIFN0YXRpY1F1ZXVlX3QgKTsKIAkJCWNvbmZpZ0FTU0VSVCggeFNpemUgPT0gc2l6ZW9mKCBRdWV1ZV90ICkgKTsKKwkJCSggdm9pZCApIHhTaXplOyAvKiBLZWVwcyBsaW50IHF1aWV0IHdoZW4gY29uZmlnQVNTRVJUKCkgaXMgbm90IGRlZmluZWQuICovCiAJCX0KIAkJI2VuZGlmIC8qIGNvbmZpZ0FTU0VSVF9ERUZJTkVEICovCiAKIAkJLyogVGhlIGFkZHJlc3Mgb2YgYSBzdGF0aWNhbGx5IGFsbG9jYXRlZCBxdWV1ZSB3YXMgcGFzc2VkIGluLCB1c2UgaXQuCiAJCVRoZSBhZGRyZXNzIG9mIGEgc3RhdGljYWxseSBhbGxvY2F0ZWQgc3RvcmFnZSBhcmVhIHdhcyBhbHNvIHBhc3NlZCBpbgogCQlidXQgaXMgYWxyZWFkeSBzZXQuICovCi0JCXB4TmV3UXVldWUgPSAoIFF1ZXVlX3QgKiApIHB4U3RhdGljUXVldWU7IC8qbGludCAhZTc0MCBVbnVzdWFsIGNhc3QgaXMgb2sgYXMgdGhlIHN0cnVjdHVyZXMgYXJlIGRlc2lnbmVkIHRvIGhhdmUgdGhlIHNhbWUgYWxpZ25tZW50LCBhbmQgdGhlIHNpemUgaXMgY2hlY2tlZCBieSBhbiBhc3NlcnQuICovCisJCXB4TmV3UXVldWUgPSAoIFF1ZXVlX3QgKiApIHB4U3RhdGljUXVldWU7IC8qbGludCAhZTc0MCAhZTkwODcgVW51c3VhbCBjYXN0IGlzIG9rIGFzIHRoZSBzdHJ1Y3R1cmVzIGFyZSBkZXNpZ25lZCB0byBoYXZlIHRoZSBzYW1lIGFsaWdubWVudCwgYW5kIHRoZSBzaXplIGlzIGNoZWNrZWQgYnkgYW4gYXNzZXJ0LiAqLwogCiAJCWlmKCBweE5ld1F1ZXVlICE9IE5VTEwgKQogCQl7CkBAIC0zNDUsNiArMzU0LDcgQEAKIAkJZWxzZQogCQl7CiAJCQl0cmFjZVFVRVVFX0NSRUFURV9GQUlMRUQoIHVjUXVldWVUeXBlICk7CisJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CiAJCX0KIAogCQlyZXR1cm4gcHhOZXdRdWV1ZTsKQEAgLTM3NSwxMyArMzg1LDIzIEBACiAJCQl4UXVldWVTaXplSW5CeXRlcyA9ICggc2l6ZV90ICkgKCB1eFF1ZXVlTGVuZ3RoICogdXhJdGVtU2l6ZSApOyAvKmxpbnQgIWU5NjEgTUlTUkEgZXhjZXB0aW9uIGFzIHRoZSBjYXN0cyBhcmUgb25seSByZWR1bmRhbnQgZm9yIHNvbWUgcG9ydHMuICovCiAJCX0KIAotCQlweE5ld1F1ZXVlID0gKCBRdWV1ZV90ICogKSBwdlBvcnRNYWxsb2MoIHNpemVvZiggUXVldWVfdCApICsgeFF1ZXVlU2l6ZUluQnl0ZXMgKTsKKwkJLyogQWxsb2NhdGUgdGhlIHF1ZXVlIGFuZCBzdG9yYWdlIGFyZWEuICBKdXN0aWZpY2F0aW9uIGZvciBNSVNSQQorCQlkZXZpYXRpb24gYXMgZm9sbG93czogIHB2UG9ydE1hbGxvYygpIGFsd2F5cyBlbnN1cmVzIHJldHVybmVkIG1lbW9yeQorCQlibG9ja3MgYXJlIGFsaWduZWQgcGVyIHRoZSByZXF1aXJlbWVudHMgb2YgdGhlIE1DVSBzdGFjay4gIEluIHRoaXMgY2FzZQorCQlwdlBvcnRNYWxsb2MoKSBtdXN0IHJldHVybiBhIHBvaW50ZXIgdGhhdCBpcyBndWFyYW50ZWVkIHRvIG1lZXQgdGhlCisJCWFsaWdubWVudCByZXF1aXJlbWVudHMgb2YgdGhlIFF1ZXVlX3Qgc3RydWN0dXJlIC0gd2hpY2ggaW4gdGhpcyBjYXNlCisJCWlzIGFuIGludDhfdCAqLiAgVGhlcmVmb3JlLCB3aGVuZXZlciB0aGUgc3RhY2sgYWxpZ25tZW50IHJlcXVpcmVtZW50cworCQlhcmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBwb2ludGVyIHRvIGNoYXIgcmVxdWlyZW1lbnRzIHRoZSBjYXN0CisJCWlzIHNhZmUuICBJbiBvdGhlciBjYXNlcyBhbGlnbm1lbnQgcmVxdWlyZW1lbnRzIGFyZSBub3Qgc3RyaWN0IChvbmUgb3IKKwkJdHdvIGJ5dGVzKS4gKi8KKwkJcHhOZXdRdWV1ZSA9ICggUXVldWVfdCAqICkgcHZQb3J0TWFsbG9jKCBzaXplb2YoIFF1ZXVlX3QgKSArIHhRdWV1ZVNpemVJbkJ5dGVzICk7IC8qbGludCAhZTkwODcgIWU5MDc5IHNlZSBjb21tZW50IGFib3ZlLiAqLwogCiAJCWlmKCBweE5ld1F1ZXVlICE9IE5VTEwgKQogCQl7CiAJCQkvKiBKdW1wIHBhc3QgdGhlIHF1ZXVlIHN0cnVjdHVyZSB0byBmaW5kIHRoZSBsb2NhdGlvbiBvZiB0aGUgcXVldWUKIAkJCXN0b3JhZ2UgYXJlYS4gKi8KLQkJCXB1Y1F1ZXVlU3RvcmFnZSA9ICggKCB1aW50OF90ICogKSBweE5ld1F1ZXVlICkgKyBzaXplb2YoIFF1ZXVlX3QgKTsKKwkJCXB1Y1F1ZXVlU3RvcmFnZSA9ICggdWludDhfdCAqICkgcHhOZXdRdWV1ZTsKKwkJCXB1Y1F1ZXVlU3RvcmFnZSArPSBzaXplb2YoIFF1ZXVlX3QgKTsgLypsaW50ICFlOTAxNiBQb2ludGVyIGFyaXRobWV0aWMgYWxsb3dlZCBvbiBjaGFyIHR5cGVzLCBlc3BlY2lhbGx5IHdoZW4gaXQgYXNzaXN0cyBjb252ZXlpbmcgaW50ZW50LiAqLwogCiAJCQkjaWYoIGNvbmZpZ1NVUFBPUlRfU1RBVElDX0FMTE9DQVRJT04gPT0gMSApCiAJCQl7CkBAIC0zOTcsNiArNDE3LDcgQEAKIAkJZWxzZQogCQl7CiAJCQl0cmFjZVFVRVVFX0NSRUFURV9GQUlMRUQoIHVjUXVldWVUeXBlICk7CisJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CiAJCX0KIAogCQlyZXR1cm4gcHhOZXdRdWV1ZTsKQEAgLTQ1NywxMSArNDc4LDExIEBACiAJCQljb3JyZWN0bHkgZm9yIGEgZ2VuZXJpYyBxdWV1ZSwgYnV0IHRoaXMgZnVuY3Rpb24gaXMgY3JlYXRpbmcgYQogCQkJbXV0ZXguICBPdmVyd3JpdGUgdGhvc2UgbWVtYmVycyB0aGF0IG5lZWQgdG8gYmUgc2V0IGRpZmZlcmVudGx5IC0KIAkJCWluIHBhcnRpY3VsYXIgdGhlIGluZm9ybWF0aW9uIHJlcXVpcmVkIGZvciBwcmlvcml0eSBpbmhlcml0YW5jZS4gKi8KLQkJCXB4TmV3UXVldWUtPnB4TXV0ZXhIb2xkZXIgPSBOVUxMOworCQkJcHhOZXdRdWV1ZS0+dS54U2VtYXBob3JlLnhNdXRleEhvbGRlciA9IE5VTEw7CiAJCQlweE5ld1F1ZXVlLT51eFF1ZXVlVHlwZSA9IHF1ZXVlUVVFVUVfSVNfTVVURVg7CiAKIAkJCS8qIEluIGNhc2UgdGhpcyBpcyBhIHJlY3Vyc2l2ZSBtdXRleC4gKi8KLQkJCXB4TmV3UXVldWUtPnUudXhSZWN1cnNpdmVDYWxsQ291bnQgPSAwOworCQkJcHhOZXdRdWV1ZS0+dS54U2VtYXBob3JlLnV4UmVjdXJzaXZlQ2FsbENvdW50ID0gMDsKIAogCQkJdHJhY2VDUkVBVEVfTVVURVgoIHB4TmV3UXVldWUgKTsKIApAQCAtNDgxLDEzICs1MDIsMTMgQEAKIAogCVF1ZXVlSGFuZGxlX3QgeFF1ZXVlQ3JlYXRlTXV0ZXgoIGNvbnN0IHVpbnQ4X3QgdWNRdWV1ZVR5cGUgKQogCXsKLQlRdWV1ZV90ICpweE5ld1F1ZXVlOworCVF1ZXVlSGFuZGxlX3QgeE5ld1F1ZXVlOwogCWNvbnN0IFVCYXNlVHlwZV90IHV4TXV0ZXhMZW5ndGggPSAoIFVCYXNlVHlwZV90ICkgMSwgdXhNdXRleFNpemUgPSAoIFVCYXNlVHlwZV90ICkgMDsKIAotCQlweE5ld1F1ZXVlID0gKCBRdWV1ZV90ICogKSB4UXVldWVHZW5lcmljQ3JlYXRlKCB1eE11dGV4TGVuZ3RoLCB1eE11dGV4U2l6ZSwgdWNRdWV1ZVR5cGUgKTsKLQkJcHJ2SW5pdGlhbGlzZU11dGV4KCBweE5ld1F1ZXVlICk7CisJCXhOZXdRdWV1ZSA9IHhRdWV1ZUdlbmVyaWNDcmVhdGUoIHV4TXV0ZXhMZW5ndGgsIHV4TXV0ZXhTaXplLCB1Y1F1ZXVlVHlwZSApOworCQlwcnZJbml0aWFsaXNlTXV0ZXgoICggUXVldWVfdCAqICkgeE5ld1F1ZXVlICk7CiAKLQkJcmV0dXJuIHB4TmV3UXVldWU7CisJCXJldHVybiB4TmV3UXVldWU7CiAJfQogCiAjZW5kaWYgLyogY29uZmlnVVNFX01VVEVYRVMgKi8KQEAgLTQ5NywxNyArNTE4LDE3IEBACiAKIAlRdWV1ZUhhbmRsZV90IHhRdWV1ZUNyZWF0ZU11dGV4U3RhdGljKCBjb25zdCB1aW50OF90IHVjUXVldWVUeXBlLCBTdGF0aWNRdWV1ZV90ICpweFN0YXRpY1F1ZXVlICkKIAl7Ci0JUXVldWVfdCAqcHhOZXdRdWV1ZTsKKwlRdWV1ZUhhbmRsZV90IHhOZXdRdWV1ZTsKIAljb25zdCBVQmFzZVR5cGVfdCB1eE11dGV4TGVuZ3RoID0gKCBVQmFzZVR5cGVfdCApIDEsIHV4TXV0ZXhTaXplID0gKCBVQmFzZVR5cGVfdCApIDA7CiAKIAkJLyogUHJldmVudCBjb21waWxlciB3YXJuaW5ncyBhYm91dCB1bnVzZWQgcGFyYW1ldGVycyBpZgogCQljb25maWdVU0VfVFJBQ0VfRkFDSUxJVFkgZG9lcyBub3QgZXF1YWwgMS4gKi8KIAkJKCB2b2lkICkgdWNRdWV1ZVR5cGU7CiAKLQkJcHhOZXdRdWV1ZSA9ICggUXVldWVfdCAqICkgeFF1ZXVlR2VuZXJpY0NyZWF0ZVN0YXRpYyggdXhNdXRleExlbmd0aCwgdXhNdXRleFNpemUsIE5VTEwsIHB4U3RhdGljUXVldWUsIHVjUXVldWVUeXBlICk7Ci0JCXBydkluaXRpYWxpc2VNdXRleCggcHhOZXdRdWV1ZSApOworCQl4TmV3UXVldWUgPSB4UXVldWVHZW5lcmljQ3JlYXRlU3RhdGljKCB1eE11dGV4TGVuZ3RoLCB1eE11dGV4U2l6ZSwgTlVMTCwgcHhTdGF0aWNRdWV1ZSwgdWNRdWV1ZVR5cGUgKTsKKwkJcHJ2SW5pdGlhbGlzZU11dGV4KCAoIFF1ZXVlX3QgKiApIHhOZXdRdWV1ZSApOwogCi0JCXJldHVybiBweE5ld1F1ZXVlOworCQlyZXR1cm4geE5ld1F1ZXVlOwogCX0KIAogI2VuZGlmIC8qIGNvbmZpZ1VTRV9NVVRFWEVTICovCkBAIC01MTUsOSArNTM2LDEwIEBACiAKICNpZiAoICggY29uZmlnVVNFX01VVEVYRVMgPT0gMSApICYmICggSU5DTFVERV94U2VtYXBob3JlR2V0TXV0ZXhIb2xkZXIgPT0gMSApICkKIAotCXZvaWQqIHhRdWV1ZUdldE11dGV4SG9sZGVyKCBRdWV1ZUhhbmRsZV90IHhTZW1hcGhvcmUgKQorCVRhc2tIYW5kbGVfdCB4UXVldWVHZXRNdXRleEhvbGRlciggUXVldWVIYW5kbGVfdCB4U2VtYXBob3JlICkKIAl7Ci0Jdm9pZCAqcHhSZXR1cm47CisJVGFza0hhbmRsZV90IHB4UmV0dXJuOworCVF1ZXVlX3QgKiBjb25zdCBweFNlbWFwaG9yZSA9ICggUXVldWVfdCAqICkgeFNlbWFwaG9yZTsKIAogCQkvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB4U2VtYXBob3JlR2V0TXV0ZXhIb2xkZXIoKSwgYW5kIHNob3VsZCBub3QKIAkJYmUgY2FsbGVkIGRpcmVjdGx5LiAgTm90ZTogIFRoaXMgaXMgYSBnb29kIHdheSBvZiBkZXRlcm1pbmluZyBpZiB0aGUKQEAgLTUyNiw5ICs1NDgsOSBAQAogCQlmb2xsb3dpbmcgY3JpdGljYWwgc2VjdGlvbiBleGl0aW5nIGFuZCB0aGUgZnVuY3Rpb24gcmV0dXJuaW5nLiAqLwogCQl0YXNrRU5URVJfQ1JJVElDQUwoKTsKIAkJewotCQkJaWYoICggKCBRdWV1ZV90ICogKSB4U2VtYXBob3JlICktPnV4UXVldWVUeXBlID09IHF1ZXVlUVVFVUVfSVNfTVVURVggKQorCQkJaWYoIHB4U2VtYXBob3JlLT51eFF1ZXVlVHlwZSA9PSBxdWV1ZVFVRVVFX0lTX01VVEVYICkKIAkJCXsKLQkJCQlweFJldHVybiA9ICggdm9pZCAqICkgKCAoIFF1ZXVlX3QgKiApIHhTZW1hcGhvcmUgKS0+cHhNdXRleEhvbGRlcjsKKwkJCQlweFJldHVybiA9IHB4U2VtYXBob3JlLT51LnhTZW1hcGhvcmUueE11dGV4SG9sZGVyOwogCQkJfQogCQkJZWxzZQogCQkJewpAQCAtNTQ1LDkgKzU2Nyw5IEBACiAKICNpZiAoICggY29uZmlnVVNFX01VVEVYRVMgPT0gMSApICYmICggSU5DTFVERV94U2VtYXBob3JlR2V0TXV0ZXhIb2xkZXIgPT0gMSApICkKIAotCXZvaWQqIHhRdWV1ZUdldE11dGV4SG9sZGVyRnJvbUlTUiggUXVldWVIYW5kbGVfdCB4U2VtYXBob3JlICkKKwlUYXNrSGFuZGxlX3QgeFF1ZXVlR2V0TXV0ZXhIb2xkZXJGcm9tSVNSKCBRdWV1ZUhhbmRsZV90IHhTZW1hcGhvcmUgKQogCXsKLQl2b2lkICpweFJldHVybjsKKwlUYXNrSGFuZGxlX3QgcHhSZXR1cm47CiAKIAkJY29uZmlnQVNTRVJUKCB4U2VtYXBob3JlICk7CiAKQEAgLTU1Niw3ICs1NzgsNyBAQAogCQlub3QgcmVxdWlyZWQgaGVyZS4gKi8KIAkJaWYoICggKCBRdWV1ZV90ICogKSB4U2VtYXBob3JlICktPnV4UXVldWVUeXBlID09IHF1ZXVlUVVFVUVfSVNfTVVURVggKQogCQl7Ci0JCQlweFJldHVybiA9ICggdm9pZCAqICkgKCAoIFF1ZXVlX3QgKiApIHhTZW1hcGhvcmUgKS0+cHhNdXRleEhvbGRlcjsKKwkJCXB4UmV0dXJuID0gKCAoIFF1ZXVlX3QgKiApIHhTZW1hcGhvcmUgKS0+dS54U2VtYXBob3JlLnhNdXRleEhvbGRlcjsKIAkJfQogCQllbHNlCiAJCXsKQEAgLTU3OCwyNSArNjAwLDI1IEBACiAKIAkJY29uZmlnQVNTRVJUKCBweE11dGV4ICk7CiAKLQkJLyogSWYgdGhpcyBpcyB0aGUgdGFzayB0aGF0IGhvbGRzIHRoZSBtdXRleCB0aGVuIHB4TXV0ZXhIb2xkZXIgd2lsbCBub3QKKwkJLyogSWYgdGhpcyBpcyB0aGUgdGFzayB0aGF0IGhvbGRzIHRoZSBtdXRleCB0aGVuIHhNdXRleEhvbGRlciB3aWxsIG5vdAogCQljaGFuZ2Ugb3V0c2lkZSBvZiB0aGlzIHRhc2suICBJZiB0aGlzIHRhc2sgZG9lcyBub3QgaG9sZCB0aGUgbXV0ZXggdGhlbgogCQlweE11dGV4SG9sZGVyIGNhbiBuZXZlciBjb2luY2lkZW50YWxseSBlcXVhbCB0aGUgdGFza3MgaGFuZGxlLCBhbmQgYXMKIAkJdGhpcyBpcyB0aGUgb25seSBjb25kaXRpb24gd2UgYXJlIGludGVyZXN0ZWQgaW4gaXQgZG9lcyBub3QgbWF0dGVyIGlmCiAJCXB4TXV0ZXhIb2xkZXIgaXMgYWNjZXNzZWQgc2ltdWx0YW5lb3VzbHkgYnkgYW5vdGhlciB0YXNrLiAgVGhlcmVmb3JlIG5vCiAJCW11dHVhbCBleGNsdXNpb24gaXMgcmVxdWlyZWQgdG8gdGVzdCB0aGUgcHhNdXRleEhvbGRlciB2YXJpYWJsZS4gKi8KLQkJaWYoIHB4TXV0ZXgtPnB4TXV0ZXhIb2xkZXIgPT0gKCB2b2lkICogKSB4VGFza0dldEN1cnJlbnRUYXNrSGFuZGxlKCkgKSAvKmxpbnQgIWU5NjEgTm90IGEgcmVkdW5kYW50IGNhc3QgYXMgVGFza0hhbmRsZV90IGlzIGEgdHlwZWRlZi4gKi8KKwkJaWYoIHB4TXV0ZXgtPnUueFNlbWFwaG9yZS54TXV0ZXhIb2xkZXIgPT0geFRhc2tHZXRDdXJyZW50VGFza0hhbmRsZSgpICkKIAkJewogCQkJdHJhY2VHSVZFX01VVEVYX1JFQ1VSU0lWRSggcHhNdXRleCApOwogCi0JCQkvKiB1eFJlY3Vyc2l2ZUNhbGxDb3VudCBjYW5ub3QgYmUgemVybyBpZiBweE11dGV4SG9sZGVyIGlzIGVxdWFsIHRvCisJCQkvKiB1eFJlY3Vyc2l2ZUNhbGxDb3VudCBjYW5ub3QgYmUgemVybyBpZiB4TXV0ZXhIb2xkZXIgaXMgZXF1YWwgdG8KIAkJCXRoZSB0YXNrIGhhbmRsZSwgdGhlcmVmb3JlIG5vIHVuZGVyZmxvdyBjaGVjayBpcyByZXF1aXJlZC4gIEFsc28sCiAJCQl1eFJlY3Vyc2l2ZUNhbGxDb3VudCBpcyBvbmx5IG1vZGlmaWVkIGJ5IHRoZSBtdXRleCBob2xkZXIsIGFuZCBhcwogCQkJdGhlcmUgY2FuIG9ubHkgYmUgb25lLCBubyBtdXR1YWwgZXhjbHVzaW9uIGlzIHJlcXVpcmVkIHRvIG1vZGlmeSB0aGUKIAkJCXV4UmVjdXJzaXZlQ2FsbENvdW50IG1lbWJlci4gKi8KLQkJCSggcHhNdXRleC0+dS51eFJlY3Vyc2l2ZUNhbGxDb3VudCApLS07CisJCQkoIHB4TXV0ZXgtPnUueFNlbWFwaG9yZS51eFJlY3Vyc2l2ZUNhbGxDb3VudCApLS07CiAKIAkJCS8qIEhhcyB0aGUgcmVjdXJzaXZlIGNhbGwgY291bnQgdW53b3VuZCB0byAwPyAqLwotCQkJaWYoIHB4TXV0ZXgtPnUudXhSZWN1cnNpdmVDYWxsQ291bnQgPT0gKCBVQmFzZVR5cGVfdCApIDAgKQorCQkJaWYoIHB4TXV0ZXgtPnUueFNlbWFwaG9yZS51eFJlY3Vyc2l2ZUNhbGxDb3VudCA9PSAoIFVCYXNlVHlwZV90ICkgMCApCiAJCQl7CiAJCQkJLyogUmV0dXJuIHRoZSBtdXRleC4gIFRoaXMgd2lsbCBhdXRvbWF0aWNhbGx5IHVuYmxvY2sgYW55IG90aGVyCiAJCQkJdGFzayB0aGF0IG1pZ2h0IGJlIHdhaXRpbmcgdG8gYWNjZXNzIHRoZSBtdXRleC4gKi8KQEAgLTYzOCw5ICs2NjAsOSBAQAogCiAJCXRyYWNlVEFLRV9NVVRFWF9SRUNVUlNJVkUoIHB4TXV0ZXggKTsKIAotCQlpZiggcHhNdXRleC0+cHhNdXRleEhvbGRlciA9PSAoIHZvaWQgKiApIHhUYXNrR2V0Q3VycmVudFRhc2tIYW5kbGUoKSApIC8qbGludCAhZTk2MSBDYXN0IGlzIG5vdCByZWR1bmRhbnQgYXMgVGFza0hhbmRsZV90IGlzIGEgdHlwZWRlZi4gKi8KKwkJaWYoIHB4TXV0ZXgtPnUueFNlbWFwaG9yZS54TXV0ZXhIb2xkZXIgPT0geFRhc2tHZXRDdXJyZW50VGFza0hhbmRsZSgpICkKIAkJewotCQkJKCBweE11dGV4LT51LnV4UmVjdXJzaXZlQ2FsbENvdW50ICkrKzsKKwkJCSggcHhNdXRleC0+dS54U2VtYXBob3JlLnV4UmVjdXJzaXZlQ2FsbENvdW50ICkrKzsKIAkJCXhSZXR1cm4gPSBwZFBBU1M7CiAJCX0KIAkJZWxzZQpAQCAtNjUyLDcgKzY3NCw3IEBACiAJCQliZWZvcmUgcmVhY2hpbmcgaGVyZS4gKi8KIAkJCWlmKCB4UmV0dXJuICE9IHBkRkFJTCApCiAJCQl7Ci0JCQkJKCBweE11dGV4LT51LnV4UmVjdXJzaXZlQ2FsbENvdW50ICkrKzsKKwkJCQkoIHB4TXV0ZXgtPnUueFNlbWFwaG9yZS51eFJlY3Vyc2l2ZUNhbGxDb3VudCApKys7CiAJCQl9CiAJCQllbHNlCiAJCQl7CkBAIC03MjYsNyArNzQ4LDcgQEAKIHsKIEJhc2VUeXBlX3QgeEVudHJ5VGltZVNldCA9IHBkRkFMU0UsIHhZaWVsZFJlcXVpcmVkOwogVGltZU91dF90IHhUaW1lT3V0OwotUXVldWVfdCAqIGNvbnN0IHB4UXVldWUgPSAoIFF1ZXVlX3QgKiApIHhRdWV1ZTsKK1F1ZXVlX3QgKiBjb25zdCBweFF1ZXVlID0geFF1ZXVlOwogCiAJY29uZmlnQVNTRVJUKCBweFF1ZXVlICk7CiAJY29uZmlnQVNTRVJUKCAhKCAoIHB2SXRlbVRvUXVldWUgPT0gTlVMTCApICYmICggcHhRdWV1ZS0+dXhJdGVtU2l6ZSAhPSAoIFVCYXNlVHlwZV90ICkgMFUgKSApICk7CkBAIC03MzgsOSArNzYwLDkgQEAKIAkjZW5kaWYKIAogCi0JLyogVGhpcyBmdW5jdGlvbiByZWxheGVzIHRoZSBjb2Rpbmcgc3RhbmRhcmQgc29tZXdoYXQgdG8gYWxsb3cgcmV0dXJuCi0Jc3RhdGVtZW50cyB3aXRoaW4gdGhlIGZ1bmN0aW9uIGl0c2VsZi4gIFRoaXMgaXMgZG9uZSBpbiB0aGUgaW50ZXJlc3QKLQlvZiBleGVjdXRpb24gdGltZSBlZmZpY2llbmN5LiAqLworCS8qbGludCAtc2F2ZSAtZTkwNCBUaGlzIGZ1bmN0aW9uIHJlbGF4ZXMgdGhlIGNvZGluZyBzdGFuZGFyZCBzb21ld2hhdCB0bworCWFsbG93IHJldHVybiBzdGF0ZW1lbnRzIHdpdGhpbiB0aGUgZnVuY3Rpb24gaXRzZWxmLiAgVGhpcyBpcyBkb25lIGluIHRoZQorCWludGVyZXN0IG9mIGV4ZWN1dGlvbiB0aW1lIGVmZmljaWVuY3kuICovCiAJZm9yKCA7OyApCiAJewogCQl0YXNrRU5URVJfQ1JJVElDQUwoKTsKQEAgLTc1MiwxMyArNzc0LDIzIEBACiAJCQlpZiggKCBweFF1ZXVlLT51eE1lc3NhZ2VzV2FpdGluZyA8IHB4UXVldWUtPnV4TGVuZ3RoICkgfHwgKCB4Q29weVBvc2l0aW9uID09IHF1ZXVlT1ZFUldSSVRFICkgKQogCQkJewogCQkJCXRyYWNlUVVFVUVfU0VORCggcHhRdWV1ZSApOwotCQkJCXhZaWVsZFJlcXVpcmVkID0gcHJ2Q29weURhdGFUb1F1ZXVlKCBweFF1ZXVlLCBwdkl0ZW1Ub1F1ZXVlLCB4Q29weVBvc2l0aW9uICk7CiAKIAkJCQkjaWYgKCBjb25maWdVU0VfUVVFVUVfU0VUUyA9PSAxICkKIAkJCQl7CisJCQkJVUJhc2VUeXBlX3QgdXhQcmV2aW91c01lc3NhZ2VzV2FpdGluZyA9IHB4UXVldWUtPnV4TWVzc2FnZXNXYWl0aW5nOworCisJCQkJCXhZaWVsZFJlcXVpcmVkID0gcHJ2Q29weURhdGFUb1F1ZXVlKCBweFF1ZXVlLCBwdkl0ZW1Ub1F1ZXVlLCB4Q29weVBvc2l0aW9uICk7CisKIAkJCQkJaWYoIHB4UXVldWUtPnB4UXVldWVTZXRDb250YWluZXIgIT0gTlVMTCApCiAJCQkJCXsKLQkJCQkJCWlmKCBwcnZOb3RpZnlRdWV1ZVNldENvbnRhaW5lciggcHhRdWV1ZSwgeENvcHlQb3NpdGlvbiApICE9IHBkRkFMU0UgKQorCQkJCQkJaWYoICggeENvcHlQb3NpdGlvbiA9PSBxdWV1ZU9WRVJXUklURSApICYmICggdXhQcmV2aW91c01lc3NhZ2VzV2FpdGluZyAhPSAoIFVCYXNlVHlwZV90ICkgMCApICkKKwkJCQkJCXsKKwkJCQkJCQkvKiBEbyBub3Qgbm90aWZ5IHRoZSBxdWV1ZSBzZXQgYXMgYW4gZXhpc3RpbmcgaXRlbQorCQkJCQkJCXdhcyBvdmVyd3JpdHRlbiBpbiB0aGUgcXVldWUgc28gdGhlIG51bWJlciBvZiBpdGVtcworCQkJCQkJCWluIHRoZSBxdWV1ZSBoYXMgbm90IGNoYW5nZWQuICovCisJCQkJCQkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOworCQkJCQkJfQorCQkJCQkJZWxzZSBpZiggcHJ2Tm90aWZ5UXVldWVTZXRDb250YWluZXIoIHB4UXVldWUsIHhDb3B5UG9zaXRpb24gKSAhPSBwZEZBTFNFICkKIAkJCQkJCXsKIAkJCQkJCQkvKiBUaGUgcXVldWUgaXMgYSBtZW1iZXIgb2YgYSBxdWV1ZSBzZXQsIGFuZCBwb3N0aW5nCiAJCQkJCQkJdG8gdGhlIHF1ZXVlIHNldCBjYXVzZWQgYSBoaWdoZXIgcHJpb3JpdHkgdGFzayB0bwpAQCAtODA1LDYgKzgzNyw4IEBACiAJCQkJfQogCQkJCSNlbHNlIC8qIGNvbmZpZ1VTRV9RVUVVRV9TRVRTICovCiAJCQkJeworCQkJCQl4WWllbGRSZXF1aXJlZCA9IHBydkNvcHlEYXRhVG9RdWV1ZSggcHhRdWV1ZSwgcHZJdGVtVG9RdWV1ZSwgeENvcHlQb3NpdGlvbiApOworCiAJCQkJCS8qIElmIHRoZXJlIHdhcyBhIHRhc2sgd2FpdGluZyBmb3IgZGF0YSB0byBhcnJpdmUgb24gdGhlCiAJCQkJCXF1ZXVlIHRoZW4gdW5ibG9jayBpdCBub3cuICovCiAJCQkJCWlmKCBsaXN0TElTVF9JU19FTVBUWSggJiggcHhRdWV1ZS0+eFRhc2tzV2FpdGluZ1RvUmVjZWl2ZSApICkgPT0gcGRGQUxTRSApCkBAIC05MTYsNyArOTUwLDcgQEAKIAkJCXRyYWNlUVVFVUVfU0VORF9GQUlMRUQoIHB4UXVldWUgKTsKIAkJCXJldHVybiBlcnJRVUVVRV9GVUxMOwogCQl9Ci0JfQorCX0gLypsaW50IC1yZXN0b3JlICovCiB9CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIApAQCAtOTI0LDcgKzk1OCw3IEBACiB7CiBCYXNlVHlwZV90IHhSZXR1cm47CiBVQmFzZVR5cGVfdCB1eFNhdmVkSW50ZXJydXB0U3RhdHVzOwotUXVldWVfdCAqIGNvbnN0IHB4UXVldWUgPSAoIFF1ZXVlX3QgKiApIHhRdWV1ZTsKK1F1ZXVlX3QgKiBjb25zdCBweFF1ZXVlID0geFF1ZXVlOwogCiAJY29uZmlnQVNTRVJUKCBweFF1ZXVlICk7CiAJY29uZmlnQVNTRVJUKCAhKCAoIHB2SXRlbVRvUXVldWUgPT0gTlVMTCApICYmICggcHhRdWV1ZS0+dXhJdGVtU2l6ZSAhPSAoIFVCYXNlVHlwZV90ICkgMFUgKSApICk7CkBAIC0xMDc1LDcgKzExMDksNyBAQAogewogQmFzZVR5cGVfdCB4UmV0dXJuOwogVUJhc2VUeXBlX3QgdXhTYXZlZEludGVycnVwdFN0YXR1czsKLVF1ZXVlX3QgKiBjb25zdCBweFF1ZXVlID0gKCBRdWV1ZV90ICogKSB4UXVldWU7CitRdWV1ZV90ICogY29uc3QgcHhRdWV1ZSA9IHhRdWV1ZTsKIAogCS8qIFNpbWlsYXIgdG8geFF1ZXVlR2VuZXJpY1NlbmRGcm9tSVNSKCkgYnV0IHVzZWQgd2l0aCBzZW1hcGhvcmVzIHdoZXJlIHRoZQogCWl0ZW0gc2l6ZSBpcyAwLiAgRG9uJ3QgZGlyZWN0bHkgd2FrZSBhIHRhc2sgdGhhdCB3YXMgYmxvY2tlZCBvbiBhIHF1ZXVlCkBAIC0xMDkyLDcgKzExMjYsNyBAQAogCS8qIE5vcm1hbGx5IGEgbXV0ZXggd291bGQgbm90IGJlIGdpdmVuIGZyb20gYW4gaW50ZXJydXB0LCBlc3BlY2lhbGx5IGlmCiAJdGhlcmUgaXMgYSBtdXRleCBob2xkZXIsIGFzIHByaW9yaXR5IGluaGVyaXRhbmNlIG1ha2VzIG5vIHNlbnNlIGZvciBhbgogCWludGVycnVwdHMsIG9ubHkgdGFza3MuICovCi0JY29uZmlnQVNTRVJUKCAhKCAoIHB4UXVldWUtPnV4UXVldWVUeXBlID09IHF1ZXVlUVVFVUVfSVNfTVVURVggKSAmJiAoIHB4UXVldWUtPnB4TXV0ZXhIb2xkZXIgIT0gTlVMTCApICkgKTsKKwljb25maWdBU1NFUlQoICEoICggcHhRdWV1ZS0+dXhRdWV1ZVR5cGUgPT0gcXVldWVRVUVVRV9JU19NVVRFWCApICYmICggcHhRdWV1ZS0+dS54U2VtYXBob3JlLnhNdXRleEhvbGRlciAhPSBOVUxMICkgKSApOwogCiAJLyogUlRPUyBwb3J0cyB0aGF0IHN1cHBvcnQgaW50ZXJydXB0IG5lc3RpbmcgaGF2ZSB0aGUgY29uY2VwdCBvZiBhIG1heGltdW0KIAlzeXN0ZW0gY2FsbCAob3IgbWF4aW11bSBBUEkgY2FsbCkgaW50ZXJydXB0IHByaW9yaXR5LiAgSW50ZXJydXB0cyB0aGF0IGFyZQpAQCAtMTI0MCw3ICsxMjc0LDcgQEAKIHsKIEJhc2VUeXBlX3QgeEVudHJ5VGltZVNldCA9IHBkRkFMU0U7CiBUaW1lT3V0X3QgeFRpbWVPdXQ7Ci1RdWV1ZV90ICogY29uc3QgcHhRdWV1ZSA9ICggUXVldWVfdCAqICkgeFF1ZXVlOworUXVldWVfdCAqIGNvbnN0IHB4UXVldWUgPSB4UXVldWU7CiAKIAkvKiBDaGVjayB0aGUgcG9pbnRlciBpcyBub3QgTlVMTC4gKi8KIAljb25maWdBU1NFUlQoICggcHhRdWV1ZSApICk7CkBAIC0xMjU2LDEwICsxMjkwLDEwIEBACiAJfQogCSNlbmRpZgogCi0JLyogVGhpcyBmdW5jdGlvbiByZWxheGVzIHRoZSBjb2Rpbmcgc3RhbmRhcmQgc29tZXdoYXQgdG8gYWxsb3cgcmV0dXJuCi0Jc3RhdGVtZW50cyB3aXRoaW4gdGhlIGZ1bmN0aW9uIGl0c2VsZi4gIFRoaXMgaXMgZG9uZSBpbiB0aGUgaW50ZXJlc3QKLQlvZiBleGVjdXRpb24gdGltZSBlZmZpY2llbmN5LiAqLwogCisJLypsaW50IC1zYXZlIC1lOTA0ICBUaGlzIGZ1bmN0aW9uIHJlbGF4ZXMgdGhlIGNvZGluZyBzdGFuZGFyZCBzb21ld2hhdCB0bworCWFsbG93IHJldHVybiBzdGF0ZW1lbnRzIHdpdGhpbiB0aGUgZnVuY3Rpb24gaXRzZWxmLiAgVGhpcyBpcyBkb25lIGluIHRoZQorCWludGVyZXN0IG9mIGV4ZWN1dGlvbiB0aW1lIGVmZmljaWVuY3kuICovCiAJZm9yKCA7OyApCiAJewogCQl0YXNrRU5URVJfQ1JJVElDQUwoKTsKQEAgLTEzNzMsNyArMTQwNyw3IEBACiAJCQkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOwogCQkJfQogCQl9Ci0JfQorCX0gLypsaW50IC1yZXN0b3JlICovCiB9CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIApAQCAtMTM4MSw3ICsxNDE1LDcgQEAKIHsKIEJhc2VUeXBlX3QgeEVudHJ5VGltZVNldCA9IHBkRkFMU0U7CiBUaW1lT3V0X3QgeFRpbWVPdXQ7Ci1RdWV1ZV90ICogY29uc3QgcHhRdWV1ZSA9ICggUXVldWVfdCAqICkgeFF1ZXVlOworUXVldWVfdCAqIGNvbnN0IHB4UXVldWUgPSB4UXVldWU7CiAKICNpZiggY29uZmlnVVNFX01VVEVYRVMgPT0gMSApCiAJQmFzZVR5cGVfdCB4SW5oZXJpdGFuY2VPY2N1cnJlZCA9IHBkRkFMU0U7CkBAIC0xNDAyLDEwICsxNDM2LDkgQEAKIAkjZW5kaWYKIAogCi0JLyogVGhpcyBmdW5jdGlvbiByZWxheGVzIHRoZSBjb2Rpbmcgc3RhbmRhcmQgc29tZXdoYXQgdG8gYWxsb3cgcmV0dXJuCisJLypsaW50IC1zYXZlIC1lOTA0IFRoaXMgZnVuY3Rpb24gcmVsYXhlcyB0aGUgY29kaW5nIHN0YW5kYXJkIHNvbWV3aGF0IHRvIGFsbG93IHJldHVybgogCXN0YXRlbWVudHMgd2l0aGluIHRoZSBmdW5jdGlvbiBpdHNlbGYuICBUaGlzIGlzIGRvbmUgaW4gdGhlIGludGVyZXN0CiAJb2YgZXhlY3V0aW9uIHRpbWUgZWZmaWNpZW5jeS4gKi8KLQogCWZvciggOzsgKQogCXsKIAkJdGFza0VOVEVSX0NSSVRJQ0FMKCk7CkBAIC0xNDMwLDcgKzE0NjMsNyBAQAogCQkJCQl7CiAJCQkJCQkvKiBSZWNvcmQgdGhlIGluZm9ybWF0aW9uIHJlcXVpcmVkIHRvIGltcGxlbWVudAogCQkJCQkJcHJpb3JpdHkgaW5oZXJpdGFuY2Ugc2hvdWxkIGl0IGJlY29tZSBuZWNlc3NhcnkuICovCi0JCQkJCQlweFF1ZXVlLT5weE11dGV4SG9sZGVyID0gKCBpbnQ4X3QgKiApIHB2VGFza0luY3JlbWVudE11dGV4SGVsZENvdW50KCk7IC8qbGludCAhZTk2MSBDYXN0IGlzIG5vdCByZWR1bmRhbnQgYXMgVGFza0hhbmRsZV90IGlzIGEgdHlwZWRlZi4gKi8KKwkJCQkJCXB4UXVldWUtPnUueFNlbWFwaG9yZS54TXV0ZXhIb2xkZXIgPSBwdlRhc2tJbmNyZW1lbnRNdXRleEhlbGRDb3VudCgpOwogCQkJCQl9CiAJCQkJCWVsc2UKIAkJCQkJewpAQCAtMTUxOCw3ICsxNTUxLDcgQEAKIAkJCQkJewogCQkJCQkJdGFza0VOVEVSX0NSSVRJQ0FMKCk7CiAJCQkJCQl7Ci0JCQkJCQkJeEluaGVyaXRhbmNlT2NjdXJyZWQgPSB4VGFza1ByaW9yaXR5SW5oZXJpdCggKCB2b2lkICogKSBweFF1ZXVlLT5weE11dGV4SG9sZGVyICk7CisJCQkJCQkJeEluaGVyaXRhbmNlT2NjdXJyZWQgPSB4VGFza1ByaW9yaXR5SW5oZXJpdCggcHhRdWV1ZS0+dS54U2VtYXBob3JlLnhNdXRleEhvbGRlciApOwogCQkJCQkJfQogCQkJCQkJdGFza0VYSVRfQ1JJVElDQUwoKTsKIAkJCQkJfQpAQCAtMTU3Nyw3ICsxNjEwLDcgQEAKIAkJCQkJCQlhZ2FpbiwgYnV0IG9ubHkgYXMgbG93IGFzIHRoZSBuZXh0IGhpZ2hlc3QgcHJpb3JpdHkKIAkJCQkJCQl0YXNrIHRoYXQgaXMgd2FpdGluZyBmb3IgdGhlIHNhbWUgbXV0ZXguICovCiAJCQkJCQkJdXhIaWdoZXN0V2FpdGluZ1ByaW9yaXR5ID0gcHJ2R2V0RGlzaW5oZXJpdFByaW9yaXR5QWZ0ZXJUaW1lb3V0KCBweFF1ZXVlICk7Ci0JCQkJCQkJdlRhc2tQcmlvcml0eURpc2luaGVyaXRBZnRlclRpbWVvdXQoICggdm9pZCAqICkgcHhRdWV1ZS0+cHhNdXRleEhvbGRlciwgdXhIaWdoZXN0V2FpdGluZ1ByaW9yaXR5ICk7CisJCQkJCQkJdlRhc2tQcmlvcml0eURpc2luaGVyaXRBZnRlclRpbWVvdXQoIHB4UXVldWUtPnUueFNlbWFwaG9yZS54TXV0ZXhIb2xkZXIsIHV4SGlnaGVzdFdhaXRpbmdQcmlvcml0eSApOwogCQkJCQkJfQogCQkJCQkJdGFza0VYSVRfQ1JJVElDQUwoKTsKIAkJCQkJfQpAQCAtMTU5Miw3ICsxNjI1LDcgQEAKIAkJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CiAJCQl9CiAJCX0KLQl9CisJfSAvKmxpbnQgLXJlc3RvcmUgKi8KIH0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCkBAIC0xNjAxLDcgKzE2MzQsNyBAQAogQmFzZVR5cGVfdCB4RW50cnlUaW1lU2V0ID0gcGRGQUxTRTsKIFRpbWVPdXRfdCB4VGltZU91dDsKIGludDhfdCAqcGNPcmlnaW5hbFJlYWRQb3NpdGlvbjsKLVF1ZXVlX3QgKiBjb25zdCBweFF1ZXVlID0gKCBRdWV1ZV90ICogKSB4UXVldWU7CitRdWV1ZV90ICogY29uc3QgcHhRdWV1ZSA9IHhRdWV1ZTsKIAogCS8qIENoZWNrIHRoZSBwb2ludGVyIGlzIG5vdCBOVUxMLiAqLwogCWNvbmZpZ0FTU0VSVCggKCBweFF1ZXVlICkgKTsKQEAgLTE2MTgsMTAgKzE2NTEsOSBAQAogCSNlbmRpZgogCiAKLQkvKiBUaGlzIGZ1bmN0aW9uIHJlbGF4ZXMgdGhlIGNvZGluZyBzdGFuZGFyZCBzb21ld2hhdCB0byBhbGxvdyByZXR1cm4KLQlzdGF0ZW1lbnRzIHdpdGhpbiB0aGUgZnVuY3Rpb24gaXRzZWxmLiAgVGhpcyBpcyBkb25lIGluIHRoZSBpbnRlcmVzdAotCW9mIGV4ZWN1dGlvbiB0aW1lIGVmZmljaWVuY3kuICovCi0KKwkvKmxpbnQgLXNhdmUgLWU5MDQgIFRoaXMgZnVuY3Rpb24gcmVsYXhlcyB0aGUgY29kaW5nIHN0YW5kYXJkIHNvbWV3aGF0IHRvCisJYWxsb3cgcmV0dXJuIHN0YXRlbWVudHMgd2l0aGluIHRoZSBmdW5jdGlvbiBpdHNlbGYuICBUaGlzIGlzIGRvbmUgaW4gdGhlCisJaW50ZXJlc3Qgb2YgZXhlY3V0aW9uIHRpbWUgZWZmaWNpZW5jeS4gKi8KIAlmb3IoIDs7ICkKIAl7CiAJCXRhc2tFTlRFUl9DUklUSUNBTCgpOwpAQCAtMTYzNSwxMyArMTY2NywxMyBAQAogCQkJCS8qIFJlbWVtYmVyIHRoZSByZWFkIHBvc2l0aW9uIHNvIGl0IGNhbiBiZSByZXNldCBhZnRlciB0aGUgZGF0YQogCQkJCWlzIHJlYWQgZnJvbSB0aGUgcXVldWUgYXMgdGhpcyBmdW5jdGlvbiBpcyBvbmx5IHBlZWtpbmcgdGhlCiAJCQkJZGF0YSwgbm90IHJlbW92aW5nIGl0LiAqLwotCQkJCXBjT3JpZ2luYWxSZWFkUG9zaXRpb24gPSBweFF1ZXVlLT51LnBjUmVhZEZyb207CisJCQkJcGNPcmlnaW5hbFJlYWRQb3NpdGlvbiA9IHB4UXVldWUtPnUueFF1ZXVlLnBjUmVhZEZyb207CiAKIAkJCQlwcnZDb3B5RGF0YUZyb21RdWV1ZSggcHhRdWV1ZSwgcHZCdWZmZXIgKTsKIAkJCQl0cmFjZVFVRVVFX1BFRUsoIHB4UXVldWUgKTsKIAogCQkJCS8qIFRoZSBkYXRhIGlzIG5vdCBiZWluZyByZW1vdmVkLCBzbyByZXNldCB0aGUgcmVhZCBwb2ludGVyLiAqLwotCQkJCXB4UXVldWUtPnUucGNSZWFkRnJvbSA9IHBjT3JpZ2luYWxSZWFkUG9zaXRpb247CisJCQkJcHhRdWV1ZS0+dS54UXVldWUucGNSZWFkRnJvbSA9IHBjT3JpZ2luYWxSZWFkUG9zaXRpb247CiAKIAkJCQkvKiBUaGUgZGF0YSBpcyBiZWluZyBsZWZ0IGluIHRoZSBxdWV1ZSwgc28gc2VlIGlmIHRoZXJlIGFyZQogCQkJCWFueSBvdGhlciB0YXNrcyB3YWl0aW5nIGZvciB0aGUgZGF0YS4gKi8KQEAgLTE3NDIsNyArMTc3NCw3IEBACiAJCQkJbXRDT1ZFUkFHRV9URVNUX01BUktFUigpOwogCQkJfQogCQl9Ci0JfQorCX0gLypsaW50IC1yZXN0b3JlICovCiB9CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIApAQCAtMTc1MCw3ICsxNzgyLDcgQEAKIHsKIEJhc2VUeXBlX3QgeFJldHVybjsKIFVCYXNlVHlwZV90IHV4U2F2ZWRJbnRlcnJ1cHRTdGF0dXM7Ci1RdWV1ZV90ICogY29uc3QgcHhRdWV1ZSA9ICggUXVldWVfdCAqICkgeFF1ZXVlOworUXVldWVfdCAqIGNvbnN0IHB4UXVldWUgPSB4UXVldWU7CiAKIAljb25maWdBU1NFUlQoIHB4UXVldWUgKTsKIAljb25maWdBU1NFUlQoICEoICggcHZCdWZmZXIgPT0gTlVMTCApICYmICggcHhRdWV1ZS0+dXhJdGVtU2l6ZSAhPSAoIFVCYXNlVHlwZV90ICkgMFUgKSApICk7CkBAIC0xODQyLDcgKzE4NzQsNyBAQAogQmFzZVR5cGVfdCB4UmV0dXJuOwogVUJhc2VUeXBlX3QgdXhTYXZlZEludGVycnVwdFN0YXR1czsKIGludDhfdCAqcGNPcmlnaW5hbFJlYWRQb3NpdGlvbjsKLVF1ZXVlX3QgKiBjb25zdCBweFF1ZXVlID0gKCBRdWV1ZV90ICogKSB4UXVldWU7CitRdWV1ZV90ICogY29uc3QgcHhRdWV1ZSA9IHhRdWV1ZTsKIAogCWNvbmZpZ0FTU0VSVCggcHhRdWV1ZSApOwogCWNvbmZpZ0FTU0VSVCggISggKCBwdkJ1ZmZlciA9PSBOVUxMICkgJiYgKCBweFF1ZXVlLT51eEl0ZW1TaXplICE9ICggVUJhc2VUeXBlX3QgKSAwVSApICkgKTsKQEAgLTE4NzMsOSArMTkwNSw5IEBACiAKIAkJCS8qIFJlbWVtYmVyIHRoZSByZWFkIHBvc2l0aW9uIHNvIGl0IGNhbiBiZSByZXNldCBhcyBub3RoaW5nIGlzCiAJCQlhY3R1YWxseSBiZWluZyByZW1vdmVkIGZyb20gdGhlIHF1ZXVlLiAqLwotCQkJcGNPcmlnaW5hbFJlYWRQb3NpdGlvbiA9IHB4UXVldWUtPnUucGNSZWFkRnJvbTsKKwkJCXBjT3JpZ2luYWxSZWFkUG9zaXRpb24gPSBweFF1ZXVlLT51LnhRdWV1ZS5wY1JlYWRGcm9tOwogCQkJcHJ2Q29weURhdGFGcm9tUXVldWUoIHB4UXVldWUsIHB2QnVmZmVyICk7Ci0JCQlweFF1ZXVlLT51LnBjUmVhZEZyb20gPSBwY09yaWdpbmFsUmVhZFBvc2l0aW9uOworCQkJcHhRdWV1ZS0+dS54UXVldWUucGNSZWFkRnJvbSA9IHBjT3JpZ2luYWxSZWFkUG9zaXRpb247CiAKIAkJCXhSZXR1cm4gPSBwZFBBU1M7CiAJCX0KQEAgLTE5MTAsOSArMTk0Miw4IEBACiBVQmFzZVR5cGVfdCB1eFF1ZXVlU3BhY2VzQXZhaWxhYmxlKCBjb25zdCBRdWV1ZUhhbmRsZV90IHhRdWV1ZSApCiB7CiBVQmFzZVR5cGVfdCB1eFJldHVybjsKLVF1ZXVlX3QgKnB4UXVldWU7CitRdWV1ZV90ICogY29uc3QgcHhRdWV1ZSA9IHhRdWV1ZTsKIAotCXB4UXVldWUgPSAoIFF1ZXVlX3QgKiApIHhRdWV1ZTsKIAljb25maWdBU1NFUlQoIHB4UXVldWUgKTsKIAogCXRhc2tFTlRFUl9DUklUSUNBTCgpOwpAQCAtMTkyOCwxMCArMTk1OSwxMCBAQAogVUJhc2VUeXBlX3QgdXhRdWV1ZU1lc3NhZ2VzV2FpdGluZ0Zyb21JU1IoIGNvbnN0IFF1ZXVlSGFuZGxlX3QgeFF1ZXVlICkKIHsKIFVCYXNlVHlwZV90IHV4UmV0dXJuOworUXVldWVfdCAqIGNvbnN0IHB4UXVldWUgPSB4UXVldWU7CiAKLQljb25maWdBU1NFUlQoIHhRdWV1ZSApOwotCi0JdXhSZXR1cm4gPSAoICggUXVldWVfdCAqICkgeFF1ZXVlICktPnV4TWVzc2FnZXNXYWl0aW5nOworCWNvbmZpZ0FTU0VSVCggcHhRdWV1ZSApOworCXV4UmV0dXJuID0gcHhRdWV1ZS0+dXhNZXNzYWdlc1dhaXRpbmc7CiAKIAlyZXR1cm4gdXhSZXR1cm47CiB9IC8qbGludCAhZTgxOCBQb2ludGVyIGNhbm5vdCBiZSBkZWNsYXJlZCBjb25zdCBhcyB4UXVldWUgaXMgYSB0eXBlZGVmIG5vdCBwb2ludGVyLiAqLwpAQCAtMTkzOSw3ICsxOTcwLDcgQEAKIAogdm9pZCB2UXVldWVEZWxldGUoIFF1ZXVlSGFuZGxlX3QgeFF1ZXVlICkKIHsKLVF1ZXVlX3QgKiBjb25zdCBweFF1ZXVlID0gKCBRdWV1ZV90ICogKSB4UXVldWU7CitRdWV1ZV90ICogY29uc3QgcHhRdWV1ZSA9IHhRdWV1ZTsKIAogCWNvbmZpZ0FTU0VSVCggcHhRdWV1ZSApOwogCXRyYWNlUVVFVUVfREVMRVRFKCBweFF1ZXVlICk7CkBAIC0yMDIxLDkgKzIwNTIsOSBAQAogCQlvdGhlciB0YXNrcyB0aGF0IGFyZSB3YWl0aW5nIGZvciB0aGUgc2FtZSBtdXRleC4gIEZvciB0aGlzIHB1cnBvc2UsCiAJCXJldHVybiB0aGUgcHJpb3JpdHkgb2YgdGhlIGhpZ2hlc3QgcHJpb3JpdHkgdGFzayB0aGF0IGlzIHdhaXRpbmcgZm9yIHRoZQogCQltdXRleC4gKi8KLQkJaWYoIGxpc3RDVVJSRU5UX0xJU1RfTEVOR1RIKCAmKCBweFF1ZXVlLT54VGFza3NXYWl0aW5nVG9SZWNlaXZlICkgKSA+IDAgKQorCQlpZiggbGlzdENVUlJFTlRfTElTVF9MRU5HVEgoICYoIHB4UXVldWUtPnhUYXNrc1dhaXRpbmdUb1JlY2VpdmUgKSApID4gMFUgKQogCQl7Ci0JCQl1eEhpZ2hlc3RQcmlvcml0eU9mV2FpdGluZ1Rhc2tzID0gY29uZmlnTUFYX1BSSU9SSVRJRVMgLSBsaXN0R0VUX0lURU1fVkFMVUVfT0ZfSEVBRF9FTlRSWSggJiggcHhRdWV1ZS0+eFRhc2tzV2FpdGluZ1RvUmVjZWl2ZSApICk7CisJCQl1eEhpZ2hlc3RQcmlvcml0eU9mV2FpdGluZ1Rhc2tzID0gKCBVQmFzZVR5cGVfdCApIGNvbmZpZ01BWF9QUklPUklUSUVTIC0gKCBVQmFzZVR5cGVfdCApIGxpc3RHRVRfSVRFTV9WQUxVRV9PRl9IRUFEX0VOVFJZKCAmKCBweFF1ZXVlLT54VGFza3NXYWl0aW5nVG9SZWNlaXZlICkgKTsKIAkJfQogCQllbHNlCiAJCXsKQEAgLTIwNTIsOCArMjA4Myw4IEBACiAJCQlpZiggcHhRdWV1ZS0+dXhRdWV1ZVR5cGUgPT0gcXVldWVRVUVVRV9JU19NVVRFWCApCiAJCQl7CiAJCQkJLyogVGhlIG11dGV4IGlzIG5vIGxvbmdlciBiZWluZyBoZWxkLiAqLwotCQkJCXhSZXR1cm4gPSB4VGFza1ByaW9yaXR5RGlzaW5oZXJpdCggKCB2b2lkICogKSBweFF1ZXVlLT5weE11dGV4SG9sZGVyICk7Ci0JCQkJcHhRdWV1ZS0+cHhNdXRleEhvbGRlciA9IE5VTEw7CisJCQkJeFJldHVybiA9IHhUYXNrUHJpb3JpdHlEaXNpbmhlcml0KCBweFF1ZXVlLT51LnhTZW1hcGhvcmUueE11dGV4SG9sZGVyICk7CisJCQkJcHhRdWV1ZS0+dS54U2VtYXBob3JlLnhNdXRleEhvbGRlciA9IE5VTEw7CiAJCQl9CiAJCQllbHNlCiAJCQl7CkBAIC0yMDY0LDkgKzIwOTUsOSBAQAogCX0KIAllbHNlIGlmKCB4UG9zaXRpb24gPT0gcXVldWVTRU5EX1RPX0JBQ0sgKQogCXsKLQkJKCB2b2lkICkgbWVtY3B5KCAoIHZvaWQgKiApIHB4UXVldWUtPnBjV3JpdGVUbywgcHZJdGVtVG9RdWV1ZSwgKCBzaXplX3QgKSBweFF1ZXVlLT51eEl0ZW1TaXplICk7IC8qbGludCAhZTk2MSAhZTQxOCBNSVNSQSBleGNlcHRpb24gYXMgdGhlIGNhc3RzIGFyZSBvbmx5IHJlZHVuZGFudCBmb3Igc29tZSBwb3J0cywgcGx1cyBwcmV2aW91cyBsb2dpYyBlbnN1cmVzIGEgbnVsbCBwb2ludGVyIGNhbiBvbmx5IGJlIHBhc3NlZCB0byBtZW1jcHkoKSBpZiB0aGUgY29weSBzaXplIGlzIDAuICovCi0JCXB4UXVldWUtPnBjV3JpdGVUbyArPSBweFF1ZXVlLT51eEl0ZW1TaXplOwotCQlpZiggcHhRdWV1ZS0+cGNXcml0ZVRvID49IHB4UXVldWUtPnBjVGFpbCApIC8qbGludCAhZTk0NiBNSVNSQSBleGNlcHRpb24ganVzdGlmaWVkIGFzIGNvbXBhcmlzb24gb2YgcG9pbnRlcnMgaXMgdGhlIGNsZWFuZXN0IHNvbHV0aW9uLiAqLworCQkoIHZvaWQgKSBtZW1jcHkoICggdm9pZCAqICkgcHhRdWV1ZS0+cGNXcml0ZVRvLCBwdkl0ZW1Ub1F1ZXVlLCAoIHNpemVfdCApIHB4UXVldWUtPnV4SXRlbVNpemUgKTsgLypsaW50ICFlOTYxICFlNDE4ICFlOTA4NyBNSVNSQSBleGNlcHRpb24gYXMgdGhlIGNhc3RzIGFyZSBvbmx5IHJlZHVuZGFudCBmb3Igc29tZSBwb3J0cywgcGx1cyBwcmV2aW91cyBsb2dpYyBlbnN1cmVzIGEgbnVsbCBwb2ludGVyIGNhbiBvbmx5IGJlIHBhc3NlZCB0byBtZW1jcHkoKSBpZiB0aGUgY29weSBzaXplIGlzIDAuICBDYXN0IHRvIHZvaWQgcmVxdWlyZWQgYnkgZnVuY3Rpb24gc2lnbmF0dXJlIGFuZCBzYWZlIGFzIG5vIGFsaWdubWVudCByZXF1aXJlbWVudCBhbmQgY29weSBsZW5ndGggc3BlY2lmaWVkIGluIGJ5dGVzLiAqLworCQlweFF1ZXVlLT5wY1dyaXRlVG8gKz0gcHhRdWV1ZS0+dXhJdGVtU2l6ZTsgLypsaW50ICFlOTAxNiBQb2ludGVyIGFyaXRobWV0aWMgb24gY2hhciB0eXBlcyBvaywgZXNwZWNpYWxseSBpbiB0aGlzIHVzZSBjYXNlIHdoZXJlIGl0IGlzIHRoZSBjbGVhcmVzdCB3YXkgb2YgY29udmV5aW5nIGludGVudC4gKi8KKwkJaWYoIHB4UXVldWUtPnBjV3JpdGVUbyA+PSBweFF1ZXVlLT51LnhRdWV1ZS5wY1RhaWwgKSAvKmxpbnQgIWU5NDYgTUlTUkEgZXhjZXB0aW9uIGp1c3RpZmllZCBhcyBjb21wYXJpc29uIG9mIHBvaW50ZXJzIGlzIHRoZSBjbGVhbmVzdCBzb2x1dGlvbi4gKi8KIAkJewogCQkJcHhRdWV1ZS0+cGNXcml0ZVRvID0gcHhRdWV1ZS0+cGNIZWFkOwogCQl9CkBAIC0yMDc3LDExICsyMTA4LDExIEBACiAJfQogCWVsc2UKIAl7Ci0JCSggdm9pZCApIG1lbWNweSggKCB2b2lkICogKSBweFF1ZXVlLT51LnBjUmVhZEZyb20sIHB2SXRlbVRvUXVldWUsICggc2l6ZV90ICkgcHhRdWV1ZS0+dXhJdGVtU2l6ZSApOyAvKmxpbnQgIWU5NjEgTUlTUkEgZXhjZXB0aW9uIGFzIHRoZSBjYXN0cyBhcmUgb25seSByZWR1bmRhbnQgZm9yIHNvbWUgcG9ydHMuICovCi0JCXB4UXVldWUtPnUucGNSZWFkRnJvbSAtPSBweFF1ZXVlLT51eEl0ZW1TaXplOwotCQlpZiggcHhRdWV1ZS0+dS5wY1JlYWRGcm9tIDwgcHhRdWV1ZS0+cGNIZWFkICkgLypsaW50ICFlOTQ2IE1JU1JBIGV4Y2VwdGlvbiBqdXN0aWZpZWQgYXMgY29tcGFyaXNvbiBvZiBwb2ludGVycyBpcyB0aGUgY2xlYW5lc3Qgc29sdXRpb24uICovCisJCSggdm9pZCApIG1lbWNweSggKCB2b2lkICogKSBweFF1ZXVlLT51LnhRdWV1ZS5wY1JlYWRGcm9tLCBwdkl0ZW1Ub1F1ZXVlLCAoIHNpemVfdCApIHB4UXVldWUtPnV4SXRlbVNpemUgKTsgLypsaW50ICFlOTYxICFlOTA4NyAhZTQxOCBNSVNSQSBleGNlcHRpb24gYXMgdGhlIGNhc3RzIGFyZSBvbmx5IHJlZHVuZGFudCBmb3Igc29tZSBwb3J0cy4gIENhc3QgdG8gdm9pZCByZXF1aXJlZCBieSBmdW5jdGlvbiBzaWduYXR1cmUgYW5kIHNhZmUgYXMgbm8gYWxpZ25tZW50IHJlcXVpcmVtZW50IGFuZCBjb3B5IGxlbmd0aCBzcGVjaWZpZWQgaW4gYnl0ZXMuICBBc3NlcnQgY2hlY2tzIG51bGwgcG9pbnRlciBvbmx5IHVzZWQgd2hlbiBsZW5ndGggaXMgMC4gKi8KKwkJcHhRdWV1ZS0+dS54UXVldWUucGNSZWFkRnJvbSAtPSBweFF1ZXVlLT51eEl0ZW1TaXplOworCQlpZiggcHhRdWV1ZS0+dS54UXVldWUucGNSZWFkRnJvbSA8IHB4UXVldWUtPnBjSGVhZCApIC8qbGludCAhZTk0NiBNSVNSQSBleGNlcHRpb24ganVzdGlmaWVkIGFzIGNvbXBhcmlzb24gb2YgcG9pbnRlcnMgaXMgdGhlIGNsZWFuZXN0IHNvbHV0aW9uLiAqLwogCQl7Ci0JCQlweFF1ZXVlLT51LnBjUmVhZEZyb20gPSAoIHB4UXVldWUtPnBjVGFpbCAtIHB4UXVldWUtPnV4SXRlbVNpemUgKTsKKwkJCXB4UXVldWUtPnUueFF1ZXVlLnBjUmVhZEZyb20gPSAoIHB4UXVldWUtPnUueFF1ZXVlLnBjVGFpbCAtIHB4UXVldWUtPnV4SXRlbVNpemUgKTsKIAkJfQogCQllbHNlCiAJCXsKQEAgLTIxMTksMTYgKzIxNTAsMTYgQEAKIHsKIAlpZiggcHhRdWV1ZS0+dXhJdGVtU2l6ZSAhPSAoIFVCYXNlVHlwZV90ICkgMCApCiAJewotCQlweFF1ZXVlLT51LnBjUmVhZEZyb20gKz0gcHhRdWV1ZS0+dXhJdGVtU2l6ZTsKLQkJaWYoIHB4UXVldWUtPnUucGNSZWFkRnJvbSA+PSBweFF1ZXVlLT5wY1RhaWwgKSAvKmxpbnQgIWU5NDYgTUlTUkEgZXhjZXB0aW9uIGp1c3RpZmllZCBhcyB1c2Ugb2YgdGhlIHJlbGF0aW9uYWwgb3BlcmF0b3IgaXMgdGhlIGNsZWFuZXN0IHNvbHV0aW9ucy4gKi8KKwkJcHhRdWV1ZS0+dS54UXVldWUucGNSZWFkRnJvbSArPSBweFF1ZXVlLT51eEl0ZW1TaXplOyAvKmxpbnQgIWU5MDE2IFBvaW50ZXIgYXJpdGhtZXRpYyBvbiBjaGFyIHR5cGVzIG9rLCBlc3BlY2lhbGx5IGluIHRoaXMgdXNlIGNhc2Ugd2hlcmUgaXQgaXMgdGhlIGNsZWFyZXN0IHdheSBvZiBjb252ZXlpbmcgaW50ZW50LiAqLworCQlpZiggcHhRdWV1ZS0+dS54UXVldWUucGNSZWFkRnJvbSA+PSBweFF1ZXVlLT51LnhRdWV1ZS5wY1RhaWwgKSAvKmxpbnQgIWU5NDYgTUlTUkEgZXhjZXB0aW9uIGp1c3RpZmllZCBhcyB1c2Ugb2YgdGhlIHJlbGF0aW9uYWwgb3BlcmF0b3IgaXMgdGhlIGNsZWFuZXN0IHNvbHV0aW9ucy4gKi8KIAkJewotCQkJcHhRdWV1ZS0+dS5wY1JlYWRGcm9tID0gcHhRdWV1ZS0+cGNIZWFkOworCQkJcHhRdWV1ZS0+dS54UXVldWUucGNSZWFkRnJvbSA9IHB4UXVldWUtPnBjSGVhZDsKIAkJfQogCQllbHNlCiAJCXsKIAkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKIAkJfQotCQkoIHZvaWQgKSBtZW1jcHkoICggdm9pZCAqICkgcHZCdWZmZXIsICggdm9pZCAqICkgcHhRdWV1ZS0+dS5wY1JlYWRGcm9tLCAoIHNpemVfdCApIHB4UXVldWUtPnV4SXRlbVNpemUgKTsgLypsaW50ICFlOTYxICFlNDE4IE1JU1JBIGV4Y2VwdGlvbiBhcyB0aGUgY2FzdHMgYXJlIG9ubHkgcmVkdW5kYW50IGZvciBzb21lIHBvcnRzLiAgQWxzbyBwcmV2aW91cyBsb2dpYyBlbnN1cmVzIGEgbnVsbCBwb2ludGVyIGNhbiBvbmx5IGJlIHBhc3NlZCB0byBtZW1jcHkoKSB3aGVuIHRoZSBjb3VudCBpcyAwLiAqLworCQkoIHZvaWQgKSBtZW1jcHkoICggdm9pZCAqICkgcHZCdWZmZXIsICggdm9pZCAqICkgcHhRdWV1ZS0+dS54UXVldWUucGNSZWFkRnJvbSwgKCBzaXplX3QgKSBweFF1ZXVlLT51eEl0ZW1TaXplICk7IC8qbGludCAhZTk2MSAhZTQxOCAhZTkwODcgTUlTUkEgZXhjZXB0aW9uIGFzIHRoZSBjYXN0cyBhcmUgb25seSByZWR1bmRhbnQgZm9yIHNvbWUgcG9ydHMuICBBbHNvIHByZXZpb3VzIGxvZ2ljIGVuc3VyZXMgYSBudWxsIHBvaW50ZXIgY2FuIG9ubHkgYmUgcGFzc2VkIHRvIG1lbWNweSgpIHdoZW4gdGhlIGNvdW50IGlzIDAuICBDYXN0IHRvIHZvaWQgcmVxdWlyZWQgYnkgZnVuY3Rpb24gc2lnbmF0dXJlIGFuZCBzYWZlIGFzIG5vIGFsaWdubWVudCByZXF1aXJlbWVudCBhbmQgY29weSBsZW5ndGggc3BlY2lmaWVkIGluIGJ5dGVzLiAqLwogCX0KIH0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtMjI3Nyw5ICsyMzA4LDEwIEBACiBCYXNlVHlwZV90IHhRdWV1ZUlzUXVldWVFbXB0eUZyb21JU1IoIGNvbnN0IFF1ZXVlSGFuZGxlX3QgeFF1ZXVlICkKIHsKIEJhc2VUeXBlX3QgeFJldHVybjsKK1F1ZXVlX3QgKiBjb25zdCBweFF1ZXVlID0geFF1ZXVlOwogCi0JY29uZmlnQVNTRVJUKCB4UXVldWUgKTsKLQlpZiggKCAoIFF1ZXVlX3QgKiApIHhRdWV1ZSApLT51eE1lc3NhZ2VzV2FpdGluZyA9PSAoIFVCYXNlVHlwZV90ICkgMCApCisJY29uZmlnQVNTRVJUKCBweFF1ZXVlICk7CisJaWYoIHB4UXVldWUtPnV4TWVzc2FnZXNXYWl0aW5nID09ICggVUJhc2VUeXBlX3QgKSAwICkKIAl7CiAJCXhSZXR1cm4gPSBwZFRSVUU7CiAJfQpAQCAtMjMxNiw5ICsyMzQ4LDEwIEBACiBCYXNlVHlwZV90IHhRdWV1ZUlzUXVldWVGdWxsRnJvbUlTUiggY29uc3QgUXVldWVIYW5kbGVfdCB4UXVldWUgKQogewogQmFzZVR5cGVfdCB4UmV0dXJuOworUXVldWVfdCAqIGNvbnN0IHB4UXVldWUgPSB4UXVldWU7CiAKLQljb25maWdBU1NFUlQoIHhRdWV1ZSApOwotCWlmKCAoICggUXVldWVfdCAqICkgeFF1ZXVlICktPnV4TWVzc2FnZXNXYWl0aW5nID09ICggKCBRdWV1ZV90ICogKSB4UXVldWUgKS0+dXhMZW5ndGggKQorCWNvbmZpZ0FTU0VSVCggcHhRdWV1ZSApOworCWlmKCBweFF1ZXVlLT51eE1lc3NhZ2VzV2FpdGluZyA9PSBweFF1ZXVlLT51eExlbmd0aCApCiAJewogCQl4UmV0dXJuID0gcGRUUlVFOwogCX0KQEAgLTIzMzYsNyArMjM2OSw3IEBACiAJQmFzZVR5cGVfdCB4UXVldWVDUlNlbmQoIFF1ZXVlSGFuZGxlX3QgeFF1ZXVlLCBjb25zdCB2b2lkICpwdkl0ZW1Ub1F1ZXVlLCBUaWNrVHlwZV90IHhUaWNrc1RvV2FpdCApCiAJewogCUJhc2VUeXBlX3QgeFJldHVybjsKLQlRdWV1ZV90ICogY29uc3QgcHhRdWV1ZSA9ICggUXVldWVfdCAqICkgeFF1ZXVlOworCVF1ZXVlX3QgKiBjb25zdCBweFF1ZXVlID0geFF1ZXVlOwogCiAJCS8qIElmIHRoZSBxdWV1ZSBpcyBhbHJlYWR5IGZ1bGwgd2UgbWF5IGhhdmUgdG8gYmxvY2suICBBIGNyaXRpY2FsIHNlY3Rpb24KIAkJaXMgcmVxdWlyZWQgdG8gcHJldmVudCBhbiBpbnRlcnJ1cHQgcmVtb3Zpbmcgc29tZXRoaW5nIGZyb20gdGhlIHF1ZXVlCkBAIC0yNDEzLDcgKzI0NDYsNyBAQAogCUJhc2VUeXBlX3QgeFF1ZXVlQ1JSZWNlaXZlKCBRdWV1ZUhhbmRsZV90IHhRdWV1ZSwgdm9pZCAqcHZCdWZmZXIsIFRpY2tUeXBlX3QgeFRpY2tzVG9XYWl0ICkKIAl7CiAJQmFzZVR5cGVfdCB4UmV0dXJuOwotCVF1ZXVlX3QgKiBjb25zdCBweFF1ZXVlID0gKCBRdWV1ZV90ICogKSB4UXVldWU7CisJUXVldWVfdCAqIGNvbnN0IHB4UXVldWUgPSB4UXVldWU7CiAKIAkJLyogSWYgdGhlIHF1ZXVlIGlzIGFscmVhZHkgZW1wdHkgd2UgbWF5IGhhdmUgdG8gYmxvY2suICBBIGNyaXRpY2FsIHNlY3Rpb24KIAkJaXMgcmVxdWlyZWQgdG8gcHJldmVudCBhbiBpbnRlcnJ1cHQgYWRkaW5nIHNvbWV0aGluZyB0byB0aGUgcXVldWUKQEAgLTI0NTAsMTcgKzI0ODMsMTcgQEAKIAkJCWlmKCBweFF1ZXVlLT51eE1lc3NhZ2VzV2FpdGluZyA+ICggVUJhc2VUeXBlX3QgKSAwICkKIAkJCXsKIAkJCQkvKiBEYXRhIGlzIGF2YWlsYWJsZSBmcm9tIHRoZSBxdWV1ZS4gKi8KLQkJCQlweFF1ZXVlLT51LnBjUmVhZEZyb20gKz0gcHhRdWV1ZS0+dXhJdGVtU2l6ZTsKLQkJCQlpZiggcHhRdWV1ZS0+dS5wY1JlYWRGcm9tID49IHB4UXVldWUtPnBjVGFpbCApCisJCQkJcHhRdWV1ZS0+dS54UXVldWUucGNSZWFkRnJvbSArPSBweFF1ZXVlLT51eEl0ZW1TaXplOworCQkJCWlmKCBweFF1ZXVlLT51LnhRdWV1ZS5wY1JlYWRGcm9tID49IHB4UXVldWUtPnUueFF1ZXVlLnBjVGFpbCApCiAJCQkJewotCQkJCQlweFF1ZXVlLT51LnBjUmVhZEZyb20gPSBweFF1ZXVlLT5wY0hlYWQ7CisJCQkJCXB4UXVldWUtPnUueFF1ZXVlLnBjUmVhZEZyb20gPSBweFF1ZXVlLT5wY0hlYWQ7CiAJCQkJfQogCQkJCWVsc2UKIAkJCQl7CiAJCQkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKIAkJCQl9CiAJCQkJLS0oIHB4UXVldWUtPnV4TWVzc2FnZXNXYWl0aW5nICk7Ci0JCQkJKCB2b2lkICkgbWVtY3B5KCAoIHZvaWQgKiApIHB2QnVmZmVyLCAoIHZvaWQgKiApIHB4UXVldWUtPnUucGNSZWFkRnJvbSwgKCB1bnNpZ25lZCApIHB4UXVldWUtPnV4SXRlbVNpemUgKTsKKwkJCQkoIHZvaWQgKSBtZW1jcHkoICggdm9pZCAqICkgcHZCdWZmZXIsICggdm9pZCAqICkgcHhRdWV1ZS0+dS54UXVldWUucGNSZWFkRnJvbSwgKCB1bnNpZ25lZCApIHB4UXVldWUtPnV4SXRlbVNpemUgKTsKIAogCQkJCXhSZXR1cm4gPSBwZFBBU1M7CiAKQEAgLTI1MDIsNyArMjUzNSw3IEBACiAKIAlCYXNlVHlwZV90IHhRdWV1ZUNSU2VuZEZyb21JU1IoIFF1ZXVlSGFuZGxlX3QgeFF1ZXVlLCBjb25zdCB2b2lkICpwdkl0ZW1Ub1F1ZXVlLCBCYXNlVHlwZV90IHhDb1JvdXRpbmVQcmV2aW91c2x5V29rZW4gKQogCXsKLQlRdWV1ZV90ICogY29uc3QgcHhRdWV1ZSA9ICggUXVldWVfdCAqICkgeFF1ZXVlOworCVF1ZXVlX3QgKiBjb25zdCBweFF1ZXVlID0geFF1ZXVlOwogCiAJCS8qIENhbm5vdCBibG9jayB3aXRoaW4gYW4gSVNSIHNvIGlmIHRoZXJlIGlzIG5vIHNwYWNlIG9uIHRoZSBxdWV1ZSB0aGVuCiAJCWV4aXQgd2l0aG91dCBkb2luZyBhbnl0aGluZy4gKi8KQEAgLTI1NTEsMjQgKzI1ODQsMjQgQEAKIAlCYXNlVHlwZV90IHhRdWV1ZUNSUmVjZWl2ZUZyb21JU1IoIFF1ZXVlSGFuZGxlX3QgeFF1ZXVlLCB2b2lkICpwdkJ1ZmZlciwgQmFzZVR5cGVfdCAqcHhDb1JvdXRpbmVXb2tlbiApCiAJewogCUJhc2VUeXBlX3QgeFJldHVybjsKLQlRdWV1ZV90ICogY29uc3QgcHhRdWV1ZSA9ICggUXVldWVfdCAqICkgeFF1ZXVlOworCVF1ZXVlX3QgKiBjb25zdCBweFF1ZXVlID0geFF1ZXVlOwogCiAJCS8qIFdlIGNhbm5vdCBibG9jayBmcm9tIGFuIElTUiwgc28gY2hlY2sgdGhlcmUgaXMgZGF0YSBhdmFpbGFibGUuIElmCiAJCW5vdCB0aGVuIGp1c3QgbGVhdmUgd2l0aG91dCBkb2luZyBhbnl0aGluZy4gKi8KIAkJaWYoIHB4UXVldWUtPnV4TWVzc2FnZXNXYWl0aW5nID4gKCBVQmFzZVR5cGVfdCApIDAgKQogCQl7CiAJCQkvKiBDb3B5IHRoZSBkYXRhIGZyb20gdGhlIHF1ZXVlLiAqLwotCQkJcHhRdWV1ZS0+dS5wY1JlYWRGcm9tICs9IHB4UXVldWUtPnV4SXRlbVNpemU7Ci0JCQlpZiggcHhRdWV1ZS0+dS5wY1JlYWRGcm9tID49IHB4UXVldWUtPnBjVGFpbCApCisJCQlweFF1ZXVlLT51LnhRdWV1ZS5wY1JlYWRGcm9tICs9IHB4UXVldWUtPnV4SXRlbVNpemU7CisJCQlpZiggcHhRdWV1ZS0+dS54UXVldWUucGNSZWFkRnJvbSA+PSBweFF1ZXVlLT51LnhRdWV1ZS5wY1RhaWwgKQogCQkJewotCQkJCXB4UXVldWUtPnUucGNSZWFkRnJvbSA9IHB4UXVldWUtPnBjSGVhZDsKKwkJCQlweFF1ZXVlLT51LnhRdWV1ZS5wY1JlYWRGcm9tID0gcHhRdWV1ZS0+cGNIZWFkOwogCQkJfQogCQkJZWxzZQogCQkJewogCQkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKIAkJCX0KIAkJCS0tKCBweFF1ZXVlLT51eE1lc3NhZ2VzV2FpdGluZyApOwotCQkJKCB2b2lkICkgbWVtY3B5KCAoIHZvaWQgKiApIHB2QnVmZmVyLCAoIHZvaWQgKiApIHB4UXVldWUtPnUucGNSZWFkRnJvbSwgKCB1bnNpZ25lZCApIHB4UXVldWUtPnV4SXRlbVNpemUgKTsKKwkJCSggdm9pZCApIG1lbWNweSggKCB2b2lkICogKSBwdkJ1ZmZlciwgKCB2b2lkICogKSBweFF1ZXVlLT51LnhRdWV1ZS5wY1JlYWRGcm9tLCAoIHVuc2lnbmVkICkgcHhRdWV1ZS0+dXhJdGVtU2l6ZSApOwogCiAJCQlpZiggKCAqcHhDb1JvdXRpbmVXb2tlbiApID09IHBkRkFMU0UgKQogCQkJewpAQCAtMjY5OSw3ICsyNzMyLDcgQEAKIAogCXZvaWQgdlF1ZXVlV2FpdEZvck1lc3NhZ2VSZXN0cmljdGVkKCBRdWV1ZUhhbmRsZV90IHhRdWV1ZSwgVGlja1R5cGVfdCB4VGlja3NUb1dhaXQsIGNvbnN0IEJhc2VUeXBlX3QgeFdhaXRJbmRlZmluaXRlbHkgKQogCXsKLQlRdWV1ZV90ICogY29uc3QgcHhRdWV1ZSA9ICggUXVldWVfdCAqICkgeFF1ZXVlOworCVF1ZXVlX3QgKiBjb25zdCBweFF1ZXVlID0geFF1ZXVlOwogCiAJCS8qIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBjYWxsZWQgYnkgYXBwbGljYXRpb24gY29kZSBoZW5jZSB0aGUKIAkJJ1Jlc3RyaWN0ZWQnIGluIGl0cyBuYW1lLiAgSXQgaXMgbm90IHBhcnQgb2YgdGhlIHB1YmxpYyBBUEkuICBJdCBpcwpkaWZmIC0tZ2l0IGEvU291cmNlL3N0X3JlYWRtZS50eHQgYi9Tb3VyY2Uvc3RfcmVhZG1lLnR4dAppbmRleCA0ZjEyYzAxLi44ZDRiYzE1IDEwMDY0NAotLS0gYS9Tb3VyY2Uvc3RfcmVhZG1lLnR4dAorKysgYi9Tb3VyY2Uvc3RfcmVhZG1lLnR4dApAQCAtMjUsNiArMjUsNDIgQEAKIAogPT09PT09PQogCisjIyMgMTctSmFudWFyeS0yMDIwICMjIworPT09PT09PT09PT09PT09PT09PT09PT09PQorICArIEZpeCBjb21waWxlIGVycm9yIGluIHRoZSBHQ0MgQ003X01QVSBwb3J0IGNhdXNlZCBieSBhIGR1cGxpY2F0ZWQgdmFyaWFibGUgZGVjbGFyYXRpb24KKyAgICAgIC0gU291cmNlL3BvcnRhYmxlL0dDQy9BUk1fQ003X01QVS9yMHAxL3BvcnQuYworCisjIyMgMTMtRGVjZW1iZXItMjAxOSAjIyMKKz09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgKyBSZW1vdmUgd2FybmluZ3MgdGhyb3duIGJ5IEVXQVJNIGZvciBDTTMzL0NNMjMgcG9ydHMKKyAgICAgIC0gSUFSL0FSTV9DTTIzL25vbl9zZWN1cmUvcG9ydG1hY3JvLmgKKyAgICAgIC0gSUFSL0FSTV9DTTIzX05UWi9ub25fc2VjdXJlL3BvcnRtYWNyby5oCisgICAgICAtIElBUi9BUk1fQ00zMy9ub25fc2VjdXJlL3BvcnRtYWNyby5oCisgICAgICAtIElBUi9BUk1fQ00zM19OVFovbm9uX3NlY3VyZS9wb3J0bWFjcm8uaAorCisjIyMgMTktSnVseS0yMDE5ICMjIworPT09PT09PT09PT09PT09PT09PT09PT09PQorICArIEZpeCBydW50aW1lIGVycm9yIGluIHRoZSAgSUFSL0NNNF9NUFUgcG9ydAorICAgICAgIC0gSUFSL0FSTV9DTTRfTVBVL3BvcnQuYworCisjIyMgMTItSnVseS0yMDE5ICMjIworPT09PT09PT09PT09PT09PT09PT09PT09PQorICArIEZyZWVSVE9TOiBVcGRhdGUgYWdhaW5zdCB0aGUgRnJlZVJUT1MgdjEwLjIuMSByZWxlYXNlCisgICAgLSBzdXBwb3J0IGZvciB0aGUgQ00zMyBhbmQgQ00yMyBjb3JlcworCisgICsgQ01TSVNfUlRPU19WMjogdXBkYXRlIGFnYWluc3QgdGhlIGxhdGVzdCBDTVNJUy1GcmVlUlRPUyB2MTAuMi4wIHJlbGVhc2UKKworICArIEFkZCBNUFUgc3VwcG9ydCBmb3IgdGhlIENNNy9yMHAxOgorICAgICAgIC0gR0NDL0FSTV9DTTdfTVBVL3IwcDEvcG9ydC5jCisgICAgICAgLSBHQ0MvQVJNX0NNN19NUFUvcjBwMS9wb3J0bWFjcm8uaAorICAgICAgIC0gSUFSL0FSTV9DTTdfTVBVL3IwcDEvcG9ydC5jCisgICAgICAgLSBJQVIvQVJNX0NNN19NUFUvcjBwMS9wb3J0YXNtLnMKKyAgICAgICAtIElBUi9BUk1fQ003X01QVS9yMHAxL3BvcnRtYWNyby5oCisgICAgICAgLSBSVkRTL0FSTV9DTTdfTVBVL3IwcDEvcG9ydC5jCisgICAgICAgLSBSVkRTL0FSTV9DTTdfTVBVL3IwcDEvcG9ydG1hY3JvLmgKKworICArIGNtc2lzX29zLmM6IEZpeCBjb21waWxlIGVycm9ycyBieSB1c2luZyB0aGUgY29ycmVjdCBUaW1lckNhbGxiYWNrRnVuY3Rpb25fdCB0eXBlIGZvciB0aW1lciBjcmVhdGlvbgorCiAjIyMgMjktTWFycy0yMDE5ICMjIwogPT09PT09PT09PT09PT09PT09PT09PT09PQogICArIGNtc2lzX29zLmMgOiBGaXggYnVnIGluIG9zUG9vbEFsbG9jKCk6IG1lbW9yeSBibG9ja3MgY2FuJ3QgYmUgcmV1c2VkIGFmdGVyIGJlaW5nIGZyZWUnZApkaWZmIC0tZ2l0IGEvU291cmNlL3N0cmVhbV9idWZmZXIuYyBiL1NvdXJjZS9zdHJlYW1fYnVmZmVyLmMKaW5kZXggYzYwMDQ1Zi4uODU1MTk3MCAxMDA2NDQKLS0tIGEvU291cmNlL3N0cmVhbV9idWZmZXIuYworKysgYi9Tb3VyY2Uvc3RyZWFtX2J1ZmZlci5jCkBAIC0xLDYgKzEsNiBAQAogLyoKLSAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMC4xCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjIuMQorICogQ29weXJpZ2h0IChDKSAyMDE5IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKICAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKICAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCkBAIC00MywxMSArNDMsMTEgQEAKIAkjZXJyb3IgY29uZmlnVVNFX1RBU0tfTk9USUZJQ0FUSU9OUyBtdXN0IGJlIHNldCB0byAxIHRvIGJ1aWxkIHN0cmVhbV9idWZmZXIuYwogI2VuZGlmCiAKLS8qIExpbnQgZTk2MSBhbmQgZTc1MCBhcmUgc3VwcHJlc3NlZCBhcyBhIE1JU1JBIGV4Y2VwdGlvbiBqdXN0aWZpZWQgYmVjYXVzZSB0aGUKLU1QVSBwb3J0cyByZXF1aXJlIE1QVV9XUkFQUEVSU19JTkNMVURFRF9GUk9NX0FQSV9GSUxFIHRvIGJlIGRlZmluZWQgZm9yIHRoZQotaGVhZGVyIGZpbGVzIGFib3ZlLCBidXQgbm90IGluIHRoaXMgZmlsZSwgaW4gb3JkZXIgdG8gZ2VuZXJhdGUgdGhlIGNvcnJlY3QKLXByaXZpbGVnZWQgVnMgdW5wcml2aWxlZ2VkIGxpbmthZ2UgYW5kIHBsYWNlbWVudC4gKi8KLSN1bmRlZiBNUFVfV1JBUFBFUlNfSU5DTFVERURfRlJPTV9BUElfRklMRSAvKmxpbnQgIWU5NjEgIWU3NTAuICovCisvKiBMaW50IGU5NjEsIGU5MDIxIGFuZCBlNzUwIGFyZSBzdXBwcmVzc2VkIGFzIGEgTUlTUkEgZXhjZXB0aW9uIGp1c3RpZmllZAorYmVjYXVzZSB0aGUgTVBVIHBvcnRzIHJlcXVpcmUgTVBVX1dSQVBQRVJTX0lOQ0xVREVEX0ZST01fQVBJX0ZJTEUgdG8gYmUgZGVmaW5lZAorZm9yIHRoZSBoZWFkZXIgZmlsZXMgYWJvdmUsIGJ1dCBub3QgaW4gdGhpcyBmaWxlLCBpbiBvcmRlciB0byBnZW5lcmF0ZSB0aGUKK2NvcnJlY3QgcHJpdmlsZWdlZCBWcyB1bnByaXZpbGVnZWQgbGlua2FnZSBhbmQgcGxhY2VtZW50LiAqLworI3VuZGVmIE1QVV9XUkFQUEVSU19JTkNMVURFRF9GUk9NX0FQSV9GSUxFIC8qbGludCAhZTk2MSAhZTc1MCAhZTkwMjEuICovCiAKIC8qIElmIHRoZSB1c2VyIGhhcyBub3QgcHJvdmlkZWQgYXBwbGljYXRpb24gc3BlY2lmaWMgUnggbm90aWZpY2F0aW9uIG1hY3JvcywKIG9yICNkZWZpbmVkIHRoZSBub3RpZmljYXRpb24gbWFjcm9zIGF3YXksIHRoZW0gcHJvdmlkZSBkZWZhdWx0IGltcGxlbWVudGF0aW9ucwpAQCAtMTI5LDcgKzEyOSw3IEBACiAvKmxpbnQgLXJlc3RvcmUgKDkwMjYpICovCiAKIC8qIFRoZSBudW1iZXIgb2YgYnl0ZXMgdXNlZCB0byBob2xkIHRoZSBsZW5ndGggb2YgYSBtZXNzYWdlIGluIHRoZSBidWZmZXIuICovCi0jZGVmaW5lIHNiQllURVNfVE9fU1RPUkVfTUVTU0FHRV9MRU5HVEggKCBzaXplb2YoIHNpemVfdCApICkKKyNkZWZpbmUgc2JCWVRFU19UT19TVE9SRV9NRVNTQUdFX0xFTkdUSCAoIHNpemVvZiggY29uZmlnTUVTU0FHRV9CVUZGRVJfTEVOR1RIX1RZUEUgKSApCiAKIC8qIEJpdHMgc3RvcmVkIGluIHRoZSB1Y0ZsYWdzIGZpZWxkIG9mIHRoZSBzdHJlYW0gYnVmZmVyLiAqLwogI2RlZmluZSBzYkZMQUdTX0lTX01FU1NBR0VfQlVGRkVSCQkoICggdWludDhfdCApIDEgKSAvKiBTZXQgaWYgdGhlIHN0cmVhbSBidWZmZXIgd2FzIGNyZWF0ZWQgYXMgYSBtZXNzYWdlIGJ1ZmZlciwgaW4gd2hpY2ggY2FzZSBpdCBob2xkcyBkaXNjcmV0ZSBtZXNzYWdlcyByYXRoZXIgdGhhbiBhIHN0cmVhbS4gKi8KQEAgLTEzOCw3ICsxMzgsNyBAQAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKIC8qIFN0cnVjdHVyZSB0aGF0IGhvbGQgc3RhdGUgaW5mb3JtYXRpb24gb24gdGhlIGJ1ZmZlci4gKi8KLXR5cGVkZWYgc3RydWN0IHhTVFJFQU1fQlVGRkVSIC8qbGludCAhZTkwNTggU3R5bGUgY29udmVudGlvbiB1c2VzIHRhZy4gKi8KK3R5cGVkZWYgc3RydWN0IFN0cmVhbUJ1ZmZlckRlZl90IC8qbGludCAhZTkwNTggU3R5bGUgY29udmVudGlvbiB1c2VzIHRhZy4gKi8KIHsKIAl2b2xhdGlsZSBzaXplX3QgeFRhaWw7CQkJCS8qIEluZGV4IHRvIHRoZSBuZXh0IGl0ZW0gdG8gcmVhZCB3aXRoaW4gdGhlIGJ1ZmZlci4gKi8KIAl2b2xhdGlsZSBzaXplX3QgeEhlYWQ7CQkJCS8qIEluZGV4IHRvIHRoZSBuZXh0IGl0ZW0gdG8gd3JpdGUgd2l0aGluIHRoZSBidWZmZXIuICovCkBAIC0yMDAsNyArMjAwLDcgQEAKIHN0YXRpYyBzaXplX3QgcHJ2UmVhZEJ5dGVzRnJvbUJ1ZmZlciggU3RyZWFtQnVmZmVyX3QgKnB4U3RyZWFtQnVmZmVyLAogCQkJCQkJCQkJICB1aW50OF90ICpwdWNEYXRhLAogCQkJCQkJCQkJICBzaXplX3QgeE1heENvdW50LAotCQkJCQkJCQkJICBzaXplX3QgeEJ5dGVzQXZhaWxhYmxlICk7IFBSSVZJTEVHRURfRlVOQ1RJT04KKwkJCQkJCQkJCSAgc2l6ZV90IHhCeXRlc0F2YWlsYWJsZSApIFBSSVZJTEVHRURfRlVOQ1RJT047CiAKIC8qCiAgKiBDYWxsZWQgYnkgYm90aCBweFN0cmVhbUJ1ZmZlckNyZWF0ZSgpIGFuZCBweFN0cmVhbUJ1ZmZlckNyZWF0ZVN0YXRpYygpIHRvCkBAIC0yMTAsNyArMjEwLDcgQEAKIAkJCQkJCQkJCQkgIHVpbnQ4X3QgKiBjb25zdCBwdWNCdWZmZXIsCiAJCQkJCQkJCQkJICBzaXplX3QgeEJ1ZmZlclNpemVCeXRlcywKIAkJCQkJCQkJCQkgIHNpemVfdCB4VHJpZ2dlckxldmVsQnl0ZXMsCi0JCQkJCQkJCQkJICBCYXNlVHlwZV90IHhJc01lc3NhZ2VCdWZmZXIgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOworCQkJCQkJCQkJCSAgdWludDhfdCB1Y0ZsYWdzICkgUFJJVklMRUdFRF9GVU5DVElPTjsKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKQEAgLTIxOSwxOSArMjE5LDMxIEBACiAJU3RyZWFtQnVmZmVySGFuZGxlX3QgeFN0cmVhbUJ1ZmZlckdlbmVyaWNDcmVhdGUoIHNpemVfdCB4QnVmZmVyU2l6ZUJ5dGVzLCBzaXplX3QgeFRyaWdnZXJMZXZlbEJ5dGVzLCBCYXNlVHlwZV90IHhJc01lc3NhZ2VCdWZmZXIgKQogCXsKIAl1aW50OF90ICpwdWNBbGxvY2F0ZWRNZW1vcnk7CisJdWludDhfdCB1Y0ZsYWdzOwogCiAJCS8qIEluIGNhc2UgdGhlIHN0cmVhbSBidWZmZXIgaXMgZ29pbmcgdG8gYmUgdXNlZCBhcyBhIG1lc3NhZ2UgYnVmZmVyCiAJCSh0aGF0IGlzLCBpdCB3aWxsIGhvbGQgZGlzY3JldGUgbWVzc2FnZXMgd2l0aCBhIGxpdHRsZSBtZXRhIGRhdGEgdGhhdAogCQlzYXlzIGhvdyBiaWcgdGhlIG5leHQgbWVzc2FnZSBpcykgY2hlY2sgdGhlIGJ1ZmZlciB3aWxsIGJlIGxhcmdlIGVub3VnaAogCQl0byBob2xkIGF0IGxlYXN0IG9uZSBtZXNzYWdlLiAqLwotCQljb25maWdBU1NFUlQoIHhCdWZmZXJTaXplQnl0ZXMgPiBzYkJZVEVTX1RPX1NUT1JFX01FU1NBR0VfTEVOR1RIICk7CisJCWlmKCB4SXNNZXNzYWdlQnVmZmVyID09IHBkVFJVRSApCisJCXsKKwkJCS8qIElzIGEgbWVzc2FnZSBidWZmZXIgYnV0IG5vdCBzdGF0aWNhbGx5IGFsbG9jYXRlZC4gKi8KKwkJCXVjRmxhZ3MgPSBzYkZMQUdTX0lTX01FU1NBR0VfQlVGRkVSOworCQkJY29uZmlnQVNTRVJUKCB4QnVmZmVyU2l6ZUJ5dGVzID4gc2JCWVRFU19UT19TVE9SRV9NRVNTQUdFX0xFTkdUSCApOworCQl9CisJCWVsc2UKKwkJeworCQkJLyogTm90IGEgbWVzc2FnZSBidWZmZXIgYW5kIG5vdCBzdGF0aWNhbGx5IGFsbG9jYXRlZC4gKi8KKwkJCXVjRmxhZ3MgPSAwOworCQkJY29uZmlnQVNTRVJUKCB4QnVmZmVyU2l6ZUJ5dGVzID4gMCApOworCQl9CiAJCWNvbmZpZ0FTU0VSVCggeFRyaWdnZXJMZXZlbEJ5dGVzIDw9IHhCdWZmZXJTaXplQnl0ZXMgKTsKIAogCQkvKiBBIHRyaWdnZXIgbGV2ZWwgb2YgMCB3b3VsZCBjYXVzZSBhIHdhaXRpbmcgdGFzayB0byB1bmJsb2NrIGV2ZW4gd2hlbgogCQl0aGUgYnVmZmVyIHdhcyBlbXB0eS4gKi8KIAkJaWYoIHhUcmlnZ2VyTGV2ZWxCeXRlcyA9PSAoIHNpemVfdCApIDAgKQogCQl7Ci0JCQl4VHJpZ2dlckxldmVsQnl0ZXMgPSAoIHNpemVfdCApIDE7IC8qbGludCAhZTkwNDQgUGFyYW1ldGVyIG1vZGlmaWVkIHRvIGVuc3VyZSBpdCBkb2Vzbid0IGhhdmUgYSBkYW5nZXJvdXMgdmFsdWUuICovCisJCQl4VHJpZ2dlckxldmVsQnl0ZXMgPSAoIHNpemVfdCApIDE7CiAJCX0KIAogCQkvKiBBIHN0cmVhbSBidWZmZXIgcmVxdWlyZXMgYSBTdHJlYW1CdWZmZXJfdCBzdHJ1Y3R1cmUgYW5kIGEgYnVmZmVyLgpAQCAtMjUxLDcgKzI2Myw3IEBACiAJCQkJCQkJCQkJICAgcHVjQWxsb2NhdGVkTWVtb3J5ICsgc2l6ZW9mKCBTdHJlYW1CdWZmZXJfdCApLCAgLyogU3RvcmFnZSBhcmVhIGZvbGxvd3MuICovIC8qbGludCAhZTkwMTYgSW5kZXhpbmcgcGFzdCBzdHJ1Y3R1cmUgdmFsaWQgZm9yIHVpbnQ4X3QgcG9pbnRlciwgYWxzbyBzdG9yYWdlIGFyZWEgaGFzIG5vIGFsaWdubWVudCByZXF1aXJlbWVudC4gKi8KIAkJCQkJCQkJCQkgICB4QnVmZmVyU2l6ZUJ5dGVzLAogCQkJCQkJCQkJCSAgIHhUcmlnZ2VyTGV2ZWxCeXRlcywKLQkJCQkJCQkJCQkgICB4SXNNZXNzYWdlQnVmZmVyICk7CisJCQkJCQkJCQkJICAgdWNGbGFncyApOwogCiAJCQl0cmFjZVNUUkVBTV9CVUZGRVJfQ1JFQVRFKCAoICggU3RyZWFtQnVmZmVyX3QgKiApIHB1Y0FsbG9jYXRlZE1lbW9yeSApLCB4SXNNZXNzYWdlQnVmZmVyICk7CiAJCX0KQEAgLTI2MCw3ICsyNzIsNyBAQAogCQkJdHJhY2VTVFJFQU1fQlVGRkVSX0NSRUFURV9GQUlMRUQoIHhJc01lc3NhZ2VCdWZmZXIgKTsKIAkJfQogCi0JCXJldHVybiAoIFN0cmVhbUJ1ZmZlckhhbmRsZV90ICogKSBwdWNBbGxvY2F0ZWRNZW1vcnk7IC8qbGludCAhZTkwODcgIWU4MjYgU2FmZSBjYXN0IGFzIGFsbG9jYXRlZCBtZW1vcnkgaXMgYWxpZ25lZC4gKi8KKwkJcmV0dXJuICggU3RyZWFtQnVmZmVySGFuZGxlX3QgKSBwdWNBbGxvY2F0ZWRNZW1vcnk7IC8qbGludCAhZTkwODcgIWU4MjYgU2FmZSBjYXN0IGFzIGFsbG9jYXRlZCBtZW1vcnkgaXMgYWxpZ25lZC4gKi8KIAl9CiAKICNlbmRpZiAvKiBjb25maWdTVVBQT1JUX0RZTkFNSUNfQUxMT0NBVElPTiAqLwpAQCAtMjc2LDYgKzI4OCw3IEBACiAJewogCVN0cmVhbUJ1ZmZlcl90ICogY29uc3QgcHhTdHJlYW1CdWZmZXIgPSAoIFN0cmVhbUJ1ZmZlcl90ICogKSBweFN0YXRpY1N0cmVhbUJ1ZmZlcjsgLypsaW50ICFlNzQwICFlOTA4NyBTYWZlIGNhc3QgYXMgU3RhdGljU3RyZWFtQnVmZmVyX3QgaXMgb3BhcXVlIFN0cmVhbWJ1ZmZlcl90LiAqLwogCVN0cmVhbUJ1ZmZlckhhbmRsZV90IHhSZXR1cm47CisJdWludDhfdCB1Y0ZsYWdzOwogCiAJCWNvbmZpZ0FTU0VSVCggcHVjU3RyZWFtQnVmZmVyU3RvcmFnZUFyZWEgKTsKIAkJY29uZmlnQVNTRVJUKCBweFN0YXRpY1N0cmVhbUJ1ZmZlciApOwpAQCAtMjg1LDcgKzI5OCwxOCBAQAogCQl0aGUgYnVmZmVyIHdhcyBlbXB0eS4gKi8KIAkJaWYoIHhUcmlnZ2VyTGV2ZWxCeXRlcyA9PSAoIHNpemVfdCApIDAgKQogCQl7Ci0JCQl4VHJpZ2dlckxldmVsQnl0ZXMgPSAoIHNpemVfdCApIDE7IC8qbGludCAhZTkwNDQgRnVuY3Rpb24gcGFyYW1ldGVyIGRlbGliZXJhdGVseSBtb2RpZmllZCB0byBlbnN1cmUgaXQgaXMgaW4gcmFuZ2UuICovCisJCQl4VHJpZ2dlckxldmVsQnl0ZXMgPSAoIHNpemVfdCApIDE7CisJCX0KKworCQlpZiggeElzTWVzc2FnZUJ1ZmZlciAhPSBwZEZBTFNFICkKKwkJeworCQkJLyogU3RhdGljYWxseSBhbGxvY2F0ZWQgbWVzc2FnZSBidWZmZXIuICovCisJCQl1Y0ZsYWdzID0gc2JGTEFHU19JU19NRVNTQUdFX0JVRkZFUiB8IHNiRkxBR1NfSVNfU1RBVElDQUxMWV9BTExPQ0FURUQ7CisJCX0KKwkJZWxzZQorCQl7CisJCQkvKiBTdGF0aWNhbGx5IGFsbG9jYXRlZCBzdHJlYW0gYnVmZmVyLiAqLworCQkJdWNGbGFncyA9IHNiRkxBR1NfSVNfU1RBVElDQUxMWV9BTExPQ0FURUQ7CiAJCX0KIAogCQkvKiBJbiBjYXNlIHRoZSBzdHJlYW0gYnVmZmVyIGlzIGdvaW5nIHRvIGJlIHVzZWQgYXMgYSBtZXNzYWdlIGJ1ZmZlcgpAQCAtMzAxLDcgKzMyNSw3IEBACiAJCQltZXNzYWdlIGJ1ZmZlciBzdHJ1Y3R1cmUuICovCiAJCQl2b2xhdGlsZSBzaXplX3QgeFNpemUgPSBzaXplb2YoIFN0YXRpY1N0cmVhbUJ1ZmZlcl90ICk7CiAJCQljb25maWdBU1NFUlQoIHhTaXplID09IHNpemVvZiggU3RyZWFtQnVmZmVyX3QgKSApOwotCQl9CisJCX0gLypsaW50ICFlNTI5IHhTaXplIGlzIHJlZmVyZW5jZWQgaXMgY29uZmlnQVNTRVJUKCkgaXMgZGVmaW5lZC4gKi8KIAkJI2VuZGlmIC8qIGNvbmZpZ0FTU0VSVF9ERUZJTkVEICovCiAKIAkJaWYoICggcHVjU3RyZWFtQnVmZmVyU3RvcmFnZUFyZWEgIT0gTlVMTCApICYmICggcHhTdGF0aWNTdHJlYW1CdWZmZXIgIT0gTlVMTCApICkKQEAgLTMxMCw3ICszMzQsNyBAQAogCQkJCQkJCQkJCSAgcHVjU3RyZWFtQnVmZmVyU3RvcmFnZUFyZWEsCiAJCQkJCQkJCQkJICB4QnVmZmVyU2l6ZUJ5dGVzLAogCQkJCQkJCQkJCSAgeFRyaWdnZXJMZXZlbEJ5dGVzLAotCQkJCQkJCQkJCSAgeElzTWVzc2FnZUJ1ZmZlciApOworCQkJCQkJCQkJCSAgdWNGbGFncyApOwogCiAJCQkvKiBSZW1lbWJlciB0aGlzIHdhcyBzdGF0aWNhbGx5IGFsbG9jYXRlZCBpbiBjYXNlIGl0IGlzIGV2ZXIgZGVsZXRlZAogCQkJYWdhaW4uICovCkBAIC0zMzQsNyArMzU4LDcgQEAKIAogdm9pZCB2U3RyZWFtQnVmZmVyRGVsZXRlKCBTdHJlYW1CdWZmZXJIYW5kbGVfdCB4U3RyZWFtQnVmZmVyICkKIHsKLVN0cmVhbUJ1ZmZlcl90ICogcHhTdHJlYW1CdWZmZXIgPSAoIFN0cmVhbUJ1ZmZlcl90ICogKSB4U3RyZWFtQnVmZmVyOyAvKmxpbnQgIWU5MDg3ICFlOTA3OSBTYWZlIGNhc3QgYXMgU3RyZWFtQnVmZmVySGFuZGxlX3QgaXMgb3BhcXVlIFN0cmVhbWJ1ZmZlcl90LiAqLworU3RyZWFtQnVmZmVyX3QgKiBweFN0cmVhbUJ1ZmZlciA9IHhTdHJlYW1CdWZmZXI7CiAKIAljb25maWdBU1NFUlQoIHB4U3RyZWFtQnVmZmVyICk7CiAKQEAgLTM2MCwxNSArMzg0LDE1IEBACiAJewogCQkvKiBUaGUgc3RydWN0dXJlIGFuZCBidWZmZXIgd2VyZSBub3QgYWxsb2NhdGVkIGR5bmFtaWNhbGx5IGFuZCBjYW5ub3QgYmUKIAkJZnJlZWQgLSBqdXN0IHNjcnViIHRoZSBzdHJ1Y3R1cmUgc28gZnV0dXJlIHVzZSB3aWxsIGFzc2VydC4gKi8KLQkJbWVtc2V0KCBweFN0cmVhbUJ1ZmZlciwgMHgwMCwgc2l6ZW9mKCBTdHJlYW1CdWZmZXJfdCApICk7CisJCSggdm9pZCApIG1lbXNldCggcHhTdHJlYW1CdWZmZXIsIDB4MDAsIHNpemVvZiggU3RyZWFtQnVmZmVyX3QgKSApOwogCX0KIH0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiBCYXNlVHlwZV90IHhTdHJlYW1CdWZmZXJSZXNldCggU3RyZWFtQnVmZmVySGFuZGxlX3QgeFN0cmVhbUJ1ZmZlciApCiB7Ci1TdHJlYW1CdWZmZXJfdCAqIGNvbnN0IHB4U3RyZWFtQnVmZmVyID0gKCBTdHJlYW1CdWZmZXJfdCAqICkgeFN0cmVhbUJ1ZmZlcjsgLypsaW50ICFlOTA4NyAhZTkwNzkgU2FmZSBjYXN0IGFzIFN0cmVhbUJ1ZmZlckhhbmRsZV90IGlzIG9wYXF1ZSBTdHJlYW1idWZmZXJfdC4gKi8KLUJhc2VUeXBlX3QgeFJldHVybiA9IHBkRkFJTCwgeElzTWVzc2FnZUJ1ZmZlcjsKK1N0cmVhbUJ1ZmZlcl90ICogY29uc3QgcHhTdHJlYW1CdWZmZXIgPSB4U3RyZWFtQnVmZmVyOworQmFzZVR5cGVfdCB4UmV0dXJuID0gcGRGQUlMOwogCiAjaWYoIGNvbmZpZ1VTRV9UUkFDRV9GQUNJTElUWSA9PSAxICkKIAlVQmFzZVR5cGVfdCB1eFN0cmVhbUJ1ZmZlck51bWJlcjsKQEAgLTM4NSwzNSArNDA5LDMwIEBACiAJI2VuZGlmCiAKIAkvKiBDYW4gb25seSByZXNldCBhIG1lc3NhZ2UgYnVmZmVyIGlmIHRoZXJlIGFyZSBubyB0YXNrcyBibG9ja2VkIG9uIGl0LiAqLwotCWlmKCBweFN0cmVhbUJ1ZmZlci0+eFRhc2tXYWl0aW5nVG9SZWNlaXZlID09IE5VTEwgKQorCXRhc2tFTlRFUl9DUklUSUNBTCgpOwogCXsKLQkJaWYoIHB4U3RyZWFtQnVmZmVyLT54VGFza1dhaXRpbmdUb1NlbmQgPT0gTlVMTCApCisJCWlmKCBweFN0cmVhbUJ1ZmZlci0+eFRhc2tXYWl0aW5nVG9SZWNlaXZlID09IE5VTEwgKQogCQl7Ci0JCQlpZiggKCBweFN0cmVhbUJ1ZmZlci0+dWNGbGFncyAmIHNiRkxBR1NfSVNfTUVTU0FHRV9CVUZGRVIgKSAhPSAoIHVpbnQ4X3QgKSAwICkKKwkJCWlmKCBweFN0cmVhbUJ1ZmZlci0+eFRhc2tXYWl0aW5nVG9TZW5kID09IE5VTEwgKQogCQkJewotCQkJCXhJc01lc3NhZ2VCdWZmZXIgPSBwZFRSVUU7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJeElzTWVzc2FnZUJ1ZmZlciA9IHBkRkFMU0U7Ci0JCQl9CisJCQkJcHJ2SW5pdGlhbGlzZU5ld1N0cmVhbUJ1ZmZlciggcHhTdHJlYW1CdWZmZXIsCisJCQkJCQkJCQkJCSAgcHhTdHJlYW1CdWZmZXItPnB1Y0J1ZmZlciwKKwkJCQkJCQkJCQkJICBweFN0cmVhbUJ1ZmZlci0+eExlbmd0aCwKKwkJCQkJCQkJCQkJICBweFN0cmVhbUJ1ZmZlci0+eFRyaWdnZXJMZXZlbEJ5dGVzLAorCQkJCQkJCQkJCQkgIHB4U3RyZWFtQnVmZmVyLT51Y0ZsYWdzICk7CisJCQkJeFJldHVybiA9IHBkUEFTUzsKIAotCQkJcHJ2SW5pdGlhbGlzZU5ld1N0cmVhbUJ1ZmZlciggcHhTdHJlYW1CdWZmZXIsCi0JCQkJCQkJCQkJICBweFN0cmVhbUJ1ZmZlci0+cHVjQnVmZmVyLAotCQkJCQkJCQkJCSAgcHhTdHJlYW1CdWZmZXItPnhMZW5ndGgsCi0JCQkJCQkJCQkJICBweFN0cmVhbUJ1ZmZlci0+eFRyaWdnZXJMZXZlbEJ5dGVzLAotCQkJCQkJCQkJCSAgeElzTWVzc2FnZUJ1ZmZlciApOwotCQkJeFJldHVybiA9IHBkUEFTUzsKKwkJCQkjaWYoIGNvbmZpZ1VTRV9UUkFDRV9GQUNJTElUWSA9PSAxICkKKwkJCQl7CisJCQkJCXB4U3RyZWFtQnVmZmVyLT51eFN0cmVhbUJ1ZmZlck51bWJlciA9IHV4U3RyZWFtQnVmZmVyTnVtYmVyOworCQkJCX0KKwkJCQkjZW5kaWYKIAotCQkJI2lmKCBjb25maWdVU0VfVFJBQ0VfRkFDSUxJVFkgPT0gMSApCi0JCQl7Ci0JCQkJcHhTdHJlYW1CdWZmZXItPnV4U3RyZWFtQnVmZmVyTnVtYmVyID0gdXhTdHJlYW1CdWZmZXJOdW1iZXI7CisJCQkJdHJhY2VTVFJFQU1fQlVGRkVSX1JFU0VUKCB4U3RyZWFtQnVmZmVyICk7CiAJCQl9Ci0JCQkjZW5kaWYKLQotCQkJdHJhY2VTVFJFQU1fQlVGRkVSX1JFU0VUKCB4U3RyZWFtQnVmZmVyICk7CiAJCX0KIAl9CisJdGFza0VYSVRfQ1JJVElDQUwoKTsKIAogCXJldHVybiB4UmV0dXJuOwogfQpAQCAtNDIxLDcgKzQ0MCw3IEBACiAKIEJhc2VUeXBlX3QgeFN0cmVhbUJ1ZmZlclNldFRyaWdnZXJMZXZlbCggU3RyZWFtQnVmZmVySGFuZGxlX3QgeFN0cmVhbUJ1ZmZlciwgc2l6ZV90IHhUcmlnZ2VyTGV2ZWwgKQogewotU3RyZWFtQnVmZmVyX3QgKiBjb25zdCBweFN0cmVhbUJ1ZmZlciA9ICggU3RyZWFtQnVmZmVyX3QgKiApIHhTdHJlYW1CdWZmZXI7IC8qbGludCAhZTkwODcgIWU5MDc5IFNhZmUgY2FzdCBhcyBTdHJlYW1CdWZmZXJIYW5kbGVfdCBpcyBvcGFxdWUgU3RyZWFtYnVmZmVyX3QuICovCitTdHJlYW1CdWZmZXJfdCAqIGNvbnN0IHB4U3RyZWFtQnVmZmVyID0geFN0cmVhbUJ1ZmZlcjsKIEJhc2VUeXBlX3QgeFJldHVybjsKIAogCWNvbmZpZ0FTU0VSVCggcHhTdHJlYW1CdWZmZXIgKTsKQEAgLTQyOSw3ICs0NDgsNyBAQAogCS8qIEl0IGlzIG5vdCB2YWxpZCBmb3IgdGhlIHRyaWdnZXIgbGV2ZWwgdG8gYmUgMC4gKi8KIAlpZiggeFRyaWdnZXJMZXZlbCA9PSAoIHNpemVfdCApIDAgKQogCXsKLQkJeFRyaWdnZXJMZXZlbCA9ICggc2l6ZV90ICkgMTsgLypsaW50ICFlOTA0NCBQYXJhbWV0ZXIgbW9kaWZpZWQgdG8gZW5zdXJlIGl0IGRvZXNuJ3QgaGF2ZSBhIGRhbmdlcm91cyB2YWx1ZS4gKi8KKwkJeFRyaWdnZXJMZXZlbCA9ICggc2l6ZV90ICkgMTsKIAl9CiAKIAkvKiBUaGUgdHJpZ2dlciBsZXZlbCBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgbXVzdCBiZSBpbiB0aGUgc3RyZWFtCkBAIC00NTAsNyArNDY5LDcgQEAKIAogc2l6ZV90IHhTdHJlYW1CdWZmZXJTcGFjZXNBdmFpbGFibGUoIFN0cmVhbUJ1ZmZlckhhbmRsZV90IHhTdHJlYW1CdWZmZXIgKQogewotY29uc3QgU3RyZWFtQnVmZmVyX3QgKiBjb25zdCBweFN0cmVhbUJ1ZmZlciA9ICggU3RyZWFtQnVmZmVyX3QgKiApIHhTdHJlYW1CdWZmZXI7IC8qbGludCAhZTkwODcgIWU5MDc5IFNhZmUgY2FzdCBhcyBTdHJlYW1CdWZmZXJIYW5kbGVfdCBpcyBvcGFxdWUgU3RyZWFtYnVmZmVyX3QuICovCitjb25zdCBTdHJlYW1CdWZmZXJfdCAqIGNvbnN0IHB4U3RyZWFtQnVmZmVyID0geFN0cmVhbUJ1ZmZlcjsKIHNpemVfdCB4U3BhY2U7CiAKIAljb25maWdBU1NFUlQoIHB4U3RyZWFtQnVmZmVyICk7CkBAIC00NzQsNyArNDkzLDcgQEAKIAogc2l6ZV90IHhTdHJlYW1CdWZmZXJCeXRlc0F2YWlsYWJsZSggU3RyZWFtQnVmZmVySGFuZGxlX3QgeFN0cmVhbUJ1ZmZlciApCiB7Ci1jb25zdCBTdHJlYW1CdWZmZXJfdCAqIGNvbnN0IHB4U3RyZWFtQnVmZmVyID0gKCBTdHJlYW1CdWZmZXJfdCAqICkgeFN0cmVhbUJ1ZmZlcjsgLypsaW50ICFlOTA4NyAhZTkwNzkgU2FmZSBjYXN0IGFzIFN0cmVhbUJ1ZmZlckhhbmRsZV90IGlzIG9wYXF1ZSBTdHJlYW1idWZmZXJfdC4gKi8KK2NvbnN0IFN0cmVhbUJ1ZmZlcl90ICogY29uc3QgcHhTdHJlYW1CdWZmZXIgPSB4U3RyZWFtQnVmZmVyOwogc2l6ZV90IHhSZXR1cm47CiAKIAljb25maWdBU1NFUlQoIHB4U3RyZWFtQnVmZmVyICk7CkBAIC00ODksNyArNTA4LDcgQEAKIAkJCQkJCSAgc2l6ZV90IHhEYXRhTGVuZ3RoQnl0ZXMsCiAJCQkJCQkgIFRpY2tUeXBlX3QgeFRpY2tzVG9XYWl0ICkKIHsKLVN0cmVhbUJ1ZmZlcl90ICogY29uc3QgcHhTdHJlYW1CdWZmZXIgPSAoIFN0cmVhbUJ1ZmZlcl90ICogKSB4U3RyZWFtQnVmZmVyOyAvKmxpbnQgIWU5MDg3ICFlOTA3OSBTYWZlIGNhc3QgYXMgU3RyZWFtQnVmZmVySGFuZGxlX3QgaXMgb3BhcXVlIFN0cmVhbWJ1ZmZlcl90LiAqLworU3RyZWFtQnVmZmVyX3QgKiBjb25zdCBweFN0cmVhbUJ1ZmZlciA9IHhTdHJlYW1CdWZmZXI7CiBzaXplX3QgeFJldHVybiwgeFNwYWNlID0gMDsKIHNpemVfdCB4UmVxdWlyZWRTcGFjZSA9IHhEYXRhTGVuZ3RoQnl0ZXM7CiBUaW1lT3V0X3QgeFRpbWVPdXQ7CkBAIC01MDQsNiArNTIzLDkgQEAKIAlpZiggKCBweFN0cmVhbUJ1ZmZlci0+dWNGbGFncyAmIHNiRkxBR1NfSVNfTUVTU0FHRV9CVUZGRVIgKSAhPSAoIHVpbnQ4X3QgKSAwICkKIAl7CiAJCXhSZXF1aXJlZFNwYWNlICs9IHNiQllURVNfVE9fU1RPUkVfTUVTU0FHRV9MRU5HVEg7CisKKwkJLyogT3ZlcmZsb3c/ICovCisJCWNvbmZpZ0FTU0VSVCggeFJlcXVpcmVkU3BhY2UgPiB4RGF0YUxlbmd0aEJ5dGVzICk7CiAJfQogCWVsc2UKIAl7CkBAIC01NDAsNyArNTYyLDcgQEAKIAkJCXRhc2tFWElUX0NSSVRJQ0FMKCk7CiAKIAkJCXRyYWNlQkxPQ0tJTkdfT05fU1RSRUFNX0JVRkZFUl9TRU5EKCB4U3RyZWFtQnVmZmVyICk7Ci0JCQkoIHZvaWQgKSB4VGFza05vdGlmeVdhaXQoICggdWludDMyX3QgKSAwLCBVSU5UMzJfTUFYLCBOVUxMLCB4VGlja3NUb1dhaXQgKTsKKwkJCSggdm9pZCApIHhUYXNrTm90aWZ5V2FpdCggKCB1aW50MzJfdCApIDAsICggdWludDMyX3QgKSAwLCBOVUxMLCB4VGlja3NUb1dhaXQgKTsKIAkJCXB4U3RyZWFtQnVmZmVyLT54VGFza1dhaXRpbmdUb1NlbmQgPSBOVUxMOwogCiAJCX0gd2hpbGUoIHhUYXNrQ2hlY2tGb3JUaW1lT3V0KCAmeFRpbWVPdXQsICZ4VGlja3NUb1dhaXQgKSA9PSBwZEZBTFNFICk7CkBAIC01OTAsNyArNjEyLDcgQEAKIAkJCQkJCQkJIHNpemVfdCB4RGF0YUxlbmd0aEJ5dGVzLAogCQkJCQkJCQkgQmFzZVR5cGVfdCAqIGNvbnN0IHB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gKQogewotU3RyZWFtQnVmZmVyX3QgKiBjb25zdCBweFN0cmVhbUJ1ZmZlciA9ICggU3RyZWFtQnVmZmVyX3QgKiApIHhTdHJlYW1CdWZmZXI7IC8qbGludCAhZTkwODcgIWU5MDc5IFNhZmUgY2FzdCBhcyBTdHJlYW1CdWZmZXJIYW5kbGVfdCBpcyBvcGFxdWUgU3RyZWFtYnVmZmVyX3QuICovCitTdHJlYW1CdWZmZXJfdCAqIGNvbnN0IHB4U3RyZWFtQnVmZmVyID0geFN0cmVhbUJ1ZmZlcjsKIHNpemVfdCB4UmV0dXJuLCB4U3BhY2U7CiBzaXplX3QgeFJlcXVpcmVkU3BhY2UgPSB4RGF0YUxlbmd0aEJ5dGVzOwogCkBAIC02NTcsNyArNjc5LDcgQEAKIAkJc3RyZWFtIG9mIGJ5dGVzIHJhdGhlciB0aGFuIGRpc2NyZXRlIG1lc3NhZ2VzLiAgV3JpdGUgYXMgbWFueSBieXRlcyBhcwogCQlwb3NzaWJsZS4gKi8KIAkJeFNob3VsZFdyaXRlID0gcGRUUlVFOwotCQl4RGF0YUxlbmd0aEJ5dGVzID0gY29uZmlnTUlOKCB4RGF0YUxlbmd0aEJ5dGVzLCB4U3BhY2UgKTsgLypsaW50ICFlOTA0NCBGdW5jdGlvbiBwYXJhbWV0ZXIgbW9kaWZpZWQgdG8gZW5zdXJlIGl0IGlzIGNhcHBlZCB0byBhdmFpbGFibGUgc3BhY2UuICovCisJCXhEYXRhTGVuZ3RoQnl0ZXMgPSBjb25maWdNSU4oIHhEYXRhTGVuZ3RoQnl0ZXMsIHhTcGFjZSApOwogCX0KIAllbHNlIGlmKCB4U3BhY2UgPj0geFJlcXVpcmVkU3BhY2UgKQogCXsKQEAgLTY5Myw3ICs3MTUsNyBAQAogCQkJCQkJCSBzaXplX3QgeEJ1ZmZlckxlbmd0aEJ5dGVzLAogCQkJCQkJCSBUaWNrVHlwZV90IHhUaWNrc1RvV2FpdCApCiB7Ci1TdHJlYW1CdWZmZXJfdCAqIGNvbnN0IHB4U3RyZWFtQnVmZmVyID0gKCBTdHJlYW1CdWZmZXJfdCAqICkgeFN0cmVhbUJ1ZmZlcjsgLypsaW50ICFlOTA4NyAhZTkwNzkgU2FmZSBjYXN0IGFzIFN0cmVhbUJ1ZmZlckhhbmRsZV90IGlzIG9wYXF1ZSBTdHJlYW1idWZmZXJfdC4gKi8KK1N0cmVhbUJ1ZmZlcl90ICogY29uc3QgcHhTdHJlYW1CdWZmZXIgPSB4U3RyZWFtQnVmZmVyOwogc2l6ZV90IHhSZWNlaXZlZExlbmd0aCA9IDAsIHhCeXRlc0F2YWlsYWJsZSwgeEJ5dGVzVG9TdG9yZU1lc3NhZ2VMZW5ndGg7CiAKIAljb25maWdBU1NFUlQoIHB2UnhEYXRhICk7CkBAIC03NDYsNyArNzY4LDcgQEAKIAkJewogCQkJLyogV2FpdCBmb3IgZGF0YSB0byBiZSBhdmFpbGFibGUuICovCiAJCQl0cmFjZUJMT0NLSU5HX09OX1NUUkVBTV9CVUZGRVJfUkVDRUlWRSggeFN0cmVhbUJ1ZmZlciApOwotCQkJKCB2b2lkICkgeFRhc2tOb3RpZnlXYWl0KCAoIHVpbnQzMl90ICkgMCwgVUlOVDMyX01BWCwgTlVMTCwgeFRpY2tzVG9XYWl0ICk7CisJCQkoIHZvaWQgKSB4VGFza05vdGlmeVdhaXQoICggdWludDMyX3QgKSAwLCAoIHVpbnQzMl90ICkgMCwgTlVMTCwgeFRpY2tzVG9XYWl0ICk7CiAJCQlweFN0cmVhbUJ1ZmZlci0+eFRhc2tXYWl0aW5nVG9SZWNlaXZlID0gTlVMTDsKIAogCQkJLyogUmVjaGVjayB0aGUgZGF0YSBhdmFpbGFibGUgYWZ0ZXIgYmxvY2tpbmcuICovCkBAIC03OTIsMTIgKzgxNCw1NiBAQAogfQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKK3NpemVfdCB4U3RyZWFtQnVmZmVyTmV4dE1lc3NhZ2VMZW5ndGhCeXRlcyggU3RyZWFtQnVmZmVySGFuZGxlX3QgeFN0cmVhbUJ1ZmZlciApCit7CitTdHJlYW1CdWZmZXJfdCAqIGNvbnN0IHB4U3RyZWFtQnVmZmVyID0geFN0cmVhbUJ1ZmZlcjsKK3NpemVfdCB4UmV0dXJuLCB4Qnl0ZXNBdmFpbGFibGUsIHhPcmlnaW5hbFRhaWw7Citjb25maWdNRVNTQUdFX0JVRkZFUl9MRU5HVEhfVFlQRSB4VGVtcFJldHVybjsKKworCWNvbmZpZ0FTU0VSVCggcHhTdHJlYW1CdWZmZXIgKTsKKworCS8qIEVuc3VyZSB0aGUgc3RyZWFtIGJ1ZmZlciBpcyBiZWluZyB1c2VkIGFzIGEgbWVzc2FnZSBidWZmZXIuICovCisJaWYoICggcHhTdHJlYW1CdWZmZXItPnVjRmxhZ3MgJiBzYkZMQUdTX0lTX01FU1NBR0VfQlVGRkVSICkgIT0gKCB1aW50OF90ICkgMCApCisJeworCQl4Qnl0ZXNBdmFpbGFibGUgPSBwcnZCeXRlc0luQnVmZmVyKCBweFN0cmVhbUJ1ZmZlciApOworCQlpZiggeEJ5dGVzQXZhaWxhYmxlID4gc2JCWVRFU19UT19TVE9SRV9NRVNTQUdFX0xFTkdUSCApCisJCXsKKwkJCS8qIFRoZSBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGJ5dGVzCisJCQlyZXF1aXJlZCB0byBob2xkIHRoZSBsZW5ndGggb2YgdGhlIG5leHQgbWVzc2FnZSwgc28gYW5vdGhlciBtZXNzYWdlCisJCQlpcyBhdmFpbGFibGUuICBSZXR1cm4gaXRzIGxlbmd0aCB3aXRob3V0IHJlbW92aW5nIHRoZSBsZW5ndGggYnl0ZXMKKwkJCWZyb20gdGhlIGJ1ZmZlci4gIEEgY29weSBvZiB0aGUgdGFpbCBpcyBzdG9yZWQgc28gdGhlIGJ1ZmZlciBjYW4gYmUKKwkJCXJldHVybmVkIHRvIGl0cyBwcmlvciBzdGF0ZSBhcyB0aGUgbWVzc2FnZSBpcyBub3QgYWN0dWFsbHkgYmVpbmcKKwkJCXJlbW92ZWQgZnJvbSB0aGUgYnVmZmVyLiAqLworCQkJeE9yaWdpbmFsVGFpbCA9IHB4U3RyZWFtQnVmZmVyLT54VGFpbDsKKwkJCSggdm9pZCApIHBydlJlYWRCeXRlc0Zyb21CdWZmZXIoIHB4U3RyZWFtQnVmZmVyLCAoIHVpbnQ4X3QgKiApICZ4VGVtcFJldHVybiwgc2JCWVRFU19UT19TVE9SRV9NRVNTQUdFX0xFTkdUSCwgeEJ5dGVzQXZhaWxhYmxlICk7CisJCQl4UmV0dXJuID0gKCBzaXplX3QgKSB4VGVtcFJldHVybjsKKwkJCXB4U3RyZWFtQnVmZmVyLT54VGFpbCA9IHhPcmlnaW5hbFRhaWw7CisJCX0KKwkJZWxzZQorCQl7CisJCQkvKiBUaGUgbWluaW11bSBhbW91bnQgb2YgYnl0ZXMgaW4gYSBtZXNzYWdlIGJ1ZmZlciBpcworCQkJKCBzYkJZVEVTX1RPX1NUT1JFX01FU1NBR0VfTEVOR1RIICsgMSApLCBzbyBpZiB4Qnl0ZXNBdmFpbGFibGUgaXMKKwkJCWxlc3MgdGhhbiBzYkJZVEVTX1RPX1NUT1JFX01FU1NBR0VfTEVOR1RIIHRoZSBvbmx5IG90aGVyIHZhbGlkCisJCQl2YWx1ZSBpcyAwLiAqLworCQkJY29uZmlnQVNTRVJUKCB4Qnl0ZXNBdmFpbGFibGUgPT0gMCApOworCQkJeFJldHVybiA9IDA7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJeFJldHVybiA9IDA7CisJfQorCisJcmV0dXJuIHhSZXR1cm47Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwogc2l6ZV90IHhTdHJlYW1CdWZmZXJSZWNlaXZlRnJvbUlTUiggU3RyZWFtQnVmZmVySGFuZGxlX3QgeFN0cmVhbUJ1ZmZlciwKIAkJCQkJCQkJCXZvaWQgKnB2UnhEYXRhLAogCQkJCQkJCQkJc2l6ZV90IHhCdWZmZXJMZW5ndGhCeXRlcywKIAkJCQkJCQkJCUJhc2VUeXBlX3QgKiBjb25zdCBweEhpZ2hlclByaW9yaXR5VGFza1dva2VuICkKIHsKLVN0cmVhbUJ1ZmZlcl90ICogY29uc3QgcHhTdHJlYW1CdWZmZXIgPSAoIFN0cmVhbUJ1ZmZlcl90ICogKSB4U3RyZWFtQnVmZmVyOyAvKmxpbnQgIWU5MDg3ICFlOTA3OSBTYWZlIGNhc3QgYXMgU3RyZWFtQnVmZmVySGFuZGxlX3QgaXMgb3BhcXVlIFN0cmVhbWJ1ZmZlcl90LiAqLworU3RyZWFtQnVmZmVyX3QgKiBjb25zdCBweFN0cmVhbUJ1ZmZlciA9IHhTdHJlYW1CdWZmZXI7CiBzaXplX3QgeFJlY2VpdmVkTGVuZ3RoID0gMCwgeEJ5dGVzQXZhaWxhYmxlLCB4Qnl0ZXNUb1N0b3JlTWVzc2FnZUxlbmd0aDsKIAogCWNvbmZpZ0FTU0VSVCggcHZSeERhdGEgKTsKQEAgLTg1Niw2ICs5MjIsNyBAQAogCQkJCQkJCQkJCXNpemVfdCB4Qnl0ZXNUb1N0b3JlTWVzc2FnZUxlbmd0aCApCiB7CiBzaXplX3QgeE9yaWdpbmFsVGFpbCwgeFJlY2VpdmVkTGVuZ3RoLCB4TmV4dE1lc3NhZ2VMZW5ndGg7Citjb25maWdNRVNTQUdFX0JVRkZFUl9MRU5HVEhfVFlQRSB4VGVtcE5leHRNZXNzYWdlTGVuZ3RoOwogCiAJaWYoIHhCeXRlc1RvU3RvcmVNZXNzYWdlTGVuZ3RoICE9ICggc2l6ZV90ICkgMCApCiAJewpAQCAtODY0LDcgKzkzMSw4IEBACiAJCXJldHVybmVkIHRvIGl0cyBwcmlvciBzdGF0ZSBpZiB0aGUgbGVuZ3RoIG9mIHRoZSBtZXNzYWdlIGlzIHRvbwogCQlsYXJnZSBmb3IgdGhlIHByb3ZpZGVkIGJ1ZmZlci4gKi8KIAkJeE9yaWdpbmFsVGFpbCA9IHB4U3RyZWFtQnVmZmVyLT54VGFpbDsKLQkJKCB2b2lkICkgcHJ2UmVhZEJ5dGVzRnJvbUJ1ZmZlciggcHhTdHJlYW1CdWZmZXIsICggdWludDhfdCAqICkgJnhOZXh0TWVzc2FnZUxlbmd0aCwgeEJ5dGVzVG9TdG9yZU1lc3NhZ2VMZW5ndGgsIHhCeXRlc0F2YWlsYWJsZSApOworCQkoIHZvaWQgKSBwcnZSZWFkQnl0ZXNGcm9tQnVmZmVyKCBweFN0cmVhbUJ1ZmZlciwgKCB1aW50OF90ICogKSAmeFRlbXBOZXh0TWVzc2FnZUxlbmd0aCwgeEJ5dGVzVG9TdG9yZU1lc3NhZ2VMZW5ndGgsIHhCeXRlc0F2YWlsYWJsZSApOworCQl4TmV4dE1lc3NhZ2VMZW5ndGggPSAoIHNpemVfdCApIHhUZW1wTmV4dE1lc3NhZ2VMZW5ndGg7CiAKIAkJLyogUmVkdWNlIHRoZSBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlIGJ5IHRoZSBudW1iZXIgb2YgYnl0ZXMganVzdAogCQlyZWFkIG91dC4gKi8KQEAgLTkwMSw3ICs5NjksNyBAQAogCiBCYXNlVHlwZV90IHhTdHJlYW1CdWZmZXJJc0VtcHR5KCBTdHJlYW1CdWZmZXJIYW5kbGVfdCB4U3RyZWFtQnVmZmVyICkKIHsKLWNvbnN0IFN0cmVhbUJ1ZmZlcl90ICogY29uc3QgcHhTdHJlYW1CdWZmZXIgPSAoIFN0cmVhbUJ1ZmZlcl90ICogKSB4U3RyZWFtQnVmZmVyOyAvKmxpbnQgIWU5MDg3ICFlOTA3OSBTYWZlIGNhc3QgYXMgU3RyZWFtQnVmZmVySGFuZGxlX3QgaXMgb3BhcXVlIFN0cmVhbWJ1ZmZlcl90LiAqLworY29uc3QgU3RyZWFtQnVmZmVyX3QgKiBjb25zdCBweFN0cmVhbUJ1ZmZlciA9IHhTdHJlYW1CdWZmZXI7CiBCYXNlVHlwZV90IHhSZXR1cm47CiBzaXplX3QgeFRhaWw7CiAKQEAgLTkyNiw3ICs5OTQsNyBAQAogewogQmFzZVR5cGVfdCB4UmV0dXJuOwogc2l6ZV90IHhCeXRlc1RvU3RvcmVNZXNzYWdlTGVuZ3RoOwotY29uc3QgU3RyZWFtQnVmZmVyX3QgKiBjb25zdCBweFN0cmVhbUJ1ZmZlciA9ICggU3RyZWFtQnVmZmVyX3QgKiApIHhTdHJlYW1CdWZmZXI7IC8qbGludCAhZTkwODcgIWU5MDc5IFNhZmUgY2FzdCBhcyBTdHJlYW1CdWZmZXJIYW5kbGVfdCBpcyBvcGFxdWUgU3RyZWFtYnVmZmVyX3QuICovCitjb25zdCBTdHJlYW1CdWZmZXJfdCAqIGNvbnN0IHB4U3RyZWFtQnVmZmVyID0geFN0cmVhbUJ1ZmZlcjsKIAogCWNvbmZpZ0FTU0VSVCggcHhTdHJlYW1CdWZmZXIgKTsKIApAQCAtOTU5LDcgKzEwMjcsNyBAQAogCiBCYXNlVHlwZV90IHhTdHJlYW1CdWZmZXJTZW5kQ29tcGxldGVkRnJvbUlTUiggU3RyZWFtQnVmZmVySGFuZGxlX3QgeFN0cmVhbUJ1ZmZlciwgQmFzZVR5cGVfdCAqcHhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbiApCiB7Ci1TdHJlYW1CdWZmZXJfdCAqIGNvbnN0IHB4U3RyZWFtQnVmZmVyID0gKCBTdHJlYW1CdWZmZXJfdCAqICkgeFN0cmVhbUJ1ZmZlcjsgLypsaW50ICFlOTA4NyAhZTkwNzkgU2FmZSBjYXN0IGFzIFN0cmVhbUJ1ZmZlckhhbmRsZV90IGlzIG9wYXF1ZSBTdHJlYW1idWZmZXJfdC4gKi8KK1N0cmVhbUJ1ZmZlcl90ICogY29uc3QgcHhTdHJlYW1CdWZmZXIgPSB4U3RyZWFtQnVmZmVyOwogQmFzZVR5cGVfdCB4UmV0dXJuOwogVUJhc2VUeXBlX3QgdXhTYXZlZEludGVycnVwdFN0YXR1czsKIApAQCAtOTg5LDcgKzEwNTcsNyBAQAogCiBCYXNlVHlwZV90IHhTdHJlYW1CdWZmZXJSZWNlaXZlQ29tcGxldGVkRnJvbUlTUiggU3RyZWFtQnVmZmVySGFuZGxlX3QgeFN0cmVhbUJ1ZmZlciwgQmFzZVR5cGVfdCAqcHhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbiApCiB7Ci1TdHJlYW1CdWZmZXJfdCAqIGNvbnN0IHB4U3RyZWFtQnVmZmVyID0gKCBTdHJlYW1CdWZmZXJfdCAqICkgeFN0cmVhbUJ1ZmZlcjsgLypsaW50ICFlOTA4NyAhZTkwNzkgU2FmZSBjYXN0IGFzIFN0cmVhbUJ1ZmZlckhhbmRsZV90IGlzIG9wYXF1ZSBTdHJlYW1idWZmZXJfdC4gKi8KK1N0cmVhbUJ1ZmZlcl90ICogY29uc3QgcHhTdHJlYW1CdWZmZXIgPSB4U3RyZWFtQnVmZmVyOwogQmFzZVR5cGVfdCB4UmV0dXJuOwogVUJhc2VUeXBlX3QgdXhTYXZlZEludGVycnVwdFN0YXR1czsKIApAQCAtMTAzMiw3ICsxMTAwLDcgQEAKIAogCS8qIFdyaXRlIGFzIG1hbnkgYnl0ZXMgYXMgY2FuIGJlIHdyaXR0ZW4gaW4gdGhlIGZpcnN0IHdyaXRlLiAqLwogCWNvbmZpZ0FTU0VSVCggKCB4TmV4dEhlYWQgKyB4Rmlyc3RMZW5ndGggKSA8PSBweFN0cmVhbUJ1ZmZlci0+eExlbmd0aCApOwotCW1lbWNweSggKCB2b2lkKiApICggJiggcHhTdHJlYW1CdWZmZXItPnB1Y0J1ZmZlclsgeE5leHRIZWFkIF0gKSApLCAoIGNvbnN0IHZvaWQgKiApIHB1Y0RhdGEsIHhGaXJzdExlbmd0aCApOyAvKmxpbnQgIWU5MDg3IG1lbWNweSgpIHJlcXVpcmVzIHZvaWQgKi4gKi8KKwkoIHZvaWQgKSBtZW1jcHkoICggdm9pZCogKSAoICYoIHB4U3RyZWFtQnVmZmVyLT5wdWNCdWZmZXJbIHhOZXh0SGVhZCBdICkgKSwgKCBjb25zdCB2b2lkICogKSBwdWNEYXRhLCB4Rmlyc3RMZW5ndGggKTsgLypsaW50ICFlOTA4NyBtZW1jcHkoKSByZXF1aXJlcyB2b2lkICouICovCiAKIAkvKiBJZiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gd2FzIGxlc3MgdGhhbiB0aGUgbnVtYmVyIHRoYXQgY291bGQgYmUKIAl3cml0dGVuIGluIHRoZSBmaXJzdCB3cml0ZS4uLiAqLwpAQCAtMTA0MCw3ICsxMTA4LDcgQEAKIAl7CiAJCS8qIC4uLnRoZW4gd3JpdGUgdGhlIHJlbWFpbmluZyBieXRlcyB0byB0aGUgc3RhcnQgb2YgdGhlIGJ1ZmZlci4gKi8KIAkJY29uZmlnQVNTRVJUKCAoIHhDb3VudCAtIHhGaXJzdExlbmd0aCApIDw9IHB4U3RyZWFtQnVmZmVyLT54TGVuZ3RoICk7Ci0JCW1lbWNweSggKCB2b2lkICogKSBweFN0cmVhbUJ1ZmZlci0+cHVjQnVmZmVyLCAoIGNvbnN0IHZvaWQgKiApICYoIHB1Y0RhdGFbIHhGaXJzdExlbmd0aCBdICksIHhDb3VudCAtIHhGaXJzdExlbmd0aCApOyAvKmxpbnQgIWU5MDg3IG1lbWNweSgpIHJlcXVpcmVzIHZvaWQgKi4gKi8KKwkJKCB2b2lkICkgbWVtY3B5KCAoIHZvaWQgKiApIHB4U3RyZWFtQnVmZmVyLT5wdWNCdWZmZXIsICggY29uc3Qgdm9pZCAqICkgJiggcHVjRGF0YVsgeEZpcnN0TGVuZ3RoIF0gKSwgeENvdW50IC0geEZpcnN0TGVuZ3RoICk7IC8qbGludCAhZTkwODcgbWVtY3B5KCkgcmVxdWlyZXMgdm9pZCAqLiAqLwogCX0KIAllbHNlCiAJewpAQCAtMTA4Myw3ICsxMTUxLDcgQEAKIAkJcmVhZC4gIEFzc2VydHMgY2hlY2sgYm91bmRzIG9mIHJlYWQgYW5kIHdyaXRlLiAqLwogCQljb25maWdBU1NFUlQoIHhGaXJzdExlbmd0aCA8PSB4TWF4Q291bnQgKTsKIAkJY29uZmlnQVNTRVJUKCAoIHhOZXh0VGFpbCArIHhGaXJzdExlbmd0aCApIDw9IHB4U3RyZWFtQnVmZmVyLT54TGVuZ3RoICk7Ci0JCW1lbWNweSggKCB2b2lkICogKSBwdWNEYXRhLCAoIGNvbnN0IHZvaWQgKiApICYoIHB4U3RyZWFtQnVmZmVyLT5wdWNCdWZmZXJbIHhOZXh0VGFpbCBdICksIHhGaXJzdExlbmd0aCApOyAvKmxpbnQgIWU5MDg3IG1lbWNweSgpIHJlcXVpcmVzIHZvaWQgKi4gKi8KKwkJKCB2b2lkICkgbWVtY3B5KCAoIHZvaWQgKiApIHB1Y0RhdGEsICggY29uc3Qgdm9pZCAqICkgJiggcHhTdHJlYW1CdWZmZXItPnB1Y0J1ZmZlclsgeE5leHRUYWlsIF0gKSwgeEZpcnN0TGVuZ3RoICk7IC8qbGludCAhZTkwODcgbWVtY3B5KCkgcmVxdWlyZXMgdm9pZCAqLiAqLwogCiAJCS8qIElmIHRoZSB0b3RhbCBudW1iZXIgb2Ygd2FudGVkIGJ5dGVzIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbnVtYmVyCiAJCXRoYXQgY291bGQgYmUgcmVhZCBpbiB0aGUgZmlyc3QgcmVhZC4uLiAqLwpAQCAtMTA5MSw3ICsxMTU5LDcgQEAKIAkJewogCQkJLyouLi50aGVuIHJlYWQgdGhlIHJlbWFpbmluZyBieXRlcyBmcm9tIHRoZSBzdGFydCBvZiB0aGUgYnVmZmVyLiAqLwogCQkJY29uZmlnQVNTRVJUKCB4Q291bnQgPD0geE1heENvdW50ICk7Ci0JCQltZW1jcHkoICggdm9pZCAqICkgJiggcHVjRGF0YVsgeEZpcnN0TGVuZ3RoIF0gKSwgKCB2b2lkICogKSAoIHB4U3RyZWFtQnVmZmVyLT5wdWNCdWZmZXIgKSwgeENvdW50IC0geEZpcnN0TGVuZ3RoICk7IC8qbGludCAhZTkwODcgbWVtY3B5KCkgcmVxdWlyZXMgdm9pZCAqLiAqLworCQkJKCB2b2lkICkgbWVtY3B5KCAoIHZvaWQgKiApICYoIHB1Y0RhdGFbIHhGaXJzdExlbmd0aCBdICksICggdm9pZCAqICkgKCBweFN0cmVhbUJ1ZmZlci0+cHVjQnVmZmVyICksIHhDb3VudCAtIHhGaXJzdExlbmd0aCApOyAvKmxpbnQgIWU5MDg3IG1lbWNweSgpIHJlcXVpcmVzIHZvaWQgKi4gKi8KIAkJfQogCQllbHNlCiAJCXsKQEAgLTExNDIsNyArMTIxMCw3IEBACiAJCQkJCQkJCQkJICB1aW50OF90ICogY29uc3QgcHVjQnVmZmVyLAogCQkJCQkJCQkJCSAgc2l6ZV90IHhCdWZmZXJTaXplQnl0ZXMsCiAJCQkJCQkJCQkJICBzaXplX3QgeFRyaWdnZXJMZXZlbEJ5dGVzLAotCQkJCQkJCQkJCSAgQmFzZVR5cGVfdCB4SXNNZXNzYWdlQnVmZmVyICkKKwkJCQkJCQkJCQkgIHVpbnQ4X3QgdWNGbGFncyApCiB7CiAJLyogQXNzZXJ0IGhlcmUgaXMgZGVsaWJlcmF0ZWx5IHdyaXRpbmcgdG8gdGhlIGVudGlyZSBidWZmZXIgdG8gZW5zdXJlIGl0IGNhbgogCWJlIHdyaXR0ZW4gdG8gd2l0aG91dCBnZW5lcmF0aW5nIGV4Y2VwdGlvbnMsIGFuZCBpcyBzZXR0aW5nIHRoZSBidWZmZXIgdG8gYQpAQCAtMTE1NCwyNSArMTIyMiwyMSBAQAogCQlyZXN1bHQgaW4gY29uZnVzaW9uIGFzIHRvIHdoYXQgaXMgYWN0dWFsbHkgYmVpbmcgb2JzZXJ2ZWQuICovCiAJCWNvbnN0IEJhc2VUeXBlX3QgeFdyaXRlVmFsdWUgPSAweDU1OwogCQljb25maWdBU1NFUlQoIG1lbXNldCggcHVjQnVmZmVyLCAoIGludCApIHhXcml0ZVZhbHVlLCB4QnVmZmVyU2l6ZUJ5dGVzICkgPT0gcHVjQnVmZmVyICk7Ci0JfQorCX0gLypsaW50ICFlNTI5ICFlNDM4IHhXcml0ZVZhbHVlIGlzIG9ubHkgdXNlZCBpZiBjb25maWdBU1NFUlQoKSBpcyBkZWZpbmVkLiAqLwogCSNlbmRpZgogCi0JbWVtc2V0KCAoIHZvaWQgKiApIHB4U3RyZWFtQnVmZmVyLCAweDAwLCBzaXplb2YoIFN0cmVhbUJ1ZmZlcl90ICkgKTsgLypsaW50ICFlOTA4NyBtZW1zZXQoKSByZXF1aXJlcyB2b2lkICouICovCisJKCB2b2lkICkgbWVtc2V0KCAoIHZvaWQgKiApIHB4U3RyZWFtQnVmZmVyLCAweDAwLCBzaXplb2YoIFN0cmVhbUJ1ZmZlcl90ICkgKTsgLypsaW50ICFlOTA4NyBtZW1zZXQoKSByZXF1aXJlcyB2b2lkICouICovCiAJcHhTdHJlYW1CdWZmZXItPnB1Y0J1ZmZlciA9IHB1Y0J1ZmZlcjsKIAlweFN0cmVhbUJ1ZmZlci0+eExlbmd0aCA9IHhCdWZmZXJTaXplQnl0ZXM7CiAJcHhTdHJlYW1CdWZmZXItPnhUcmlnZ2VyTGV2ZWxCeXRlcyA9IHhUcmlnZ2VyTGV2ZWxCeXRlczsKLQotCWlmKCB4SXNNZXNzYWdlQnVmZmVyICE9IHBkRkFMU0UgKQotCXsKLQkJcHhTdHJlYW1CdWZmZXItPnVjRmxhZ3MgfD0gc2JGTEFHU19JU19NRVNTQUdFX0JVRkZFUjsKLQl9CisJcHhTdHJlYW1CdWZmZXItPnVjRmxhZ3MgPSB1Y0ZsYWdzOwogfQogCiAjaWYgKCBjb25maWdVU0VfVFJBQ0VfRkFDSUxJVFkgPT0gMSApCiAKIAlVQmFzZVR5cGVfdCB1eFN0cmVhbUJ1ZmZlckdldFN0cmVhbUJ1ZmZlck51bWJlciggU3RyZWFtQnVmZmVySGFuZGxlX3QgeFN0cmVhbUJ1ZmZlciApCiAJewotCQlyZXR1cm4gKCAoIFN0cmVhbUJ1ZmZlcl90ICogKSB4U3RyZWFtQnVmZmVyICktPnV4U3RyZWFtQnVmZmVyTnVtYmVyOworCQlyZXR1cm4geFN0cmVhbUJ1ZmZlci0+dXhTdHJlYW1CdWZmZXJOdW1iZXI7CiAJfQogCiAjZW5kaWYgLyogY29uZmlnVVNFX1RSQUNFX0ZBQ0lMSVRZICovCkBAIC0xMTgyLDcgKzEyNDYsNyBAQAogCiAJdm9pZCB2U3RyZWFtQnVmZmVyU2V0U3RyZWFtQnVmZmVyTnVtYmVyKCBTdHJlYW1CdWZmZXJIYW5kbGVfdCB4U3RyZWFtQnVmZmVyLCBVQmFzZVR5cGVfdCB1eFN0cmVhbUJ1ZmZlck51bWJlciApCiAJewotCQkoICggU3RyZWFtQnVmZmVyX3QgKiApIHhTdHJlYW1CdWZmZXIgKS0+dXhTdHJlYW1CdWZmZXJOdW1iZXIgPSB1eFN0cmVhbUJ1ZmZlck51bWJlcjsKKwkJeFN0cmVhbUJ1ZmZlci0+dXhTdHJlYW1CdWZmZXJOdW1iZXIgPSB1eFN0cmVhbUJ1ZmZlck51bWJlcjsKIAl9CiAKICNlbmRpZiAvKiBjb25maWdVU0VfVFJBQ0VfRkFDSUxJVFkgKi8KQEAgLTExOTIsNyArMTI1Niw3IEBACiAKIAl1aW50OF90IHVjU3RyZWFtQnVmZmVyR2V0U3RyZWFtQnVmZmVyVHlwZSggU3RyZWFtQnVmZmVySGFuZGxlX3QgeFN0cmVhbUJ1ZmZlciApCiAJewotCQlyZXR1cm4gKCAoIFN0cmVhbUJ1ZmZlcl90ICogKXhTdHJlYW1CdWZmZXIgKS0+dWNGbGFncyB8IHNiRkxBR1NfSVNfTUVTU0FHRV9CVUZGRVI7CisJCXJldHVybiAoIHhTdHJlYW1CdWZmZXItPnVjRmxhZ3MgJiBzYkZMQUdTX0lTX01FU1NBR0VfQlVGRkVSICk7CiAJfQogCiAjZW5kaWYgLyogY29uZmlnVVNFX1RSQUNFX0ZBQ0lMSVRZICovCmRpZmYgLS1naXQgYS9Tb3VyY2UvdGFza3MuYyBiL1NvdXJjZS90YXNrcy5jCmluZGV4IGU0MWQ5ZDEuLmRiMDUxNmQgMTAwNjQ0Ci0tLSBhL1NvdXJjZS90YXNrcy5jCisrKyBiL1NvdXJjZS90YXNrcy5jCkBAIC0xLDYgKzEsNiBAQAogLyoKLSAqIEZyZWVSVE9TIEtlcm5lbCBWMTAuMC4xCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjIuMQorICogQ29weXJpZ2h0IChDKSAyMDE5IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKICAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKICAqIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCkBAIC00MCwxMSArNDAsMTEgQEAKICNpbmNsdWRlICJ0aW1lcnMuaCIKICNpbmNsdWRlICJzdGFja19tYWNyb3MuaCIKIAotLyogTGludCBlOTYxIGFuZCBlNzUwIGFyZSBzdXBwcmVzc2VkIGFzIGEgTUlTUkEgZXhjZXB0aW9uIGp1c3RpZmllZCBiZWNhdXNlIHRoZQotTVBVIHBvcnRzIHJlcXVpcmUgTVBVX1dSQVBQRVJTX0lOQ0xVREVEX0ZST01fQVBJX0ZJTEUgdG8gYmUgZGVmaW5lZCBmb3IgdGhlCi1oZWFkZXIgZmlsZXMgYWJvdmUsIGJ1dCBub3QgaW4gdGhpcyBmaWxlLCBpbiBvcmRlciB0byBnZW5lcmF0ZSB0aGUgY29ycmVjdAotcHJpdmlsZWdlZCBWcyB1bnByaXZpbGVnZWQgbGlua2FnZSBhbmQgcGxhY2VtZW50LiAqLwotI3VuZGVmIE1QVV9XUkFQUEVSU19JTkNMVURFRF9GUk9NX0FQSV9GSUxFIC8qbGludCAhZTk2MSAhZTc1MC4gKi8KKy8qIExpbnQgZTkwMjEsIGU5NjEgYW5kIGU3NTAgYXJlIHN1cHByZXNzZWQgYXMgYSBNSVNSQSBleGNlcHRpb24ganVzdGlmaWVkCitiZWNhdXNlIHRoZSBNUFUgcG9ydHMgcmVxdWlyZSBNUFVfV1JBUFBFUlNfSU5DTFVERURfRlJPTV9BUElfRklMRSB0byBiZSBkZWZpbmVkCitmb3IgdGhlIGhlYWRlciBmaWxlcyBhYm92ZSwgYnV0IG5vdCBpbiB0aGlzIGZpbGUsIGluIG9yZGVyIHRvIGdlbmVyYXRlIHRoZQorY29ycmVjdCBwcml2aWxlZ2VkIFZzIHVucHJpdmlsZWdlZCBsaW5rYWdlIGFuZCBwbGFjZW1lbnQuICovCisjdW5kZWYgTVBVX1dSQVBQRVJTX0lOQ0xVREVEX0ZST01fQVBJX0ZJTEUgLypsaW50ICFlOTYxICFlNzUwICFlOTAyMS4gKi8KIAogLyogU2V0IGNvbmZpZ1VTRV9TVEFUU19GT1JNQVRUSU5HX0ZVTkNUSU9OUyB0byAyIHRvIGluY2x1ZGUgdGhlIHN0YXRzIGZvcm1hdHRpbmcKIGZ1bmN0aW9ucyBidXQgd2l0aG91dCBpbmNsdWRpbmcgc3RkaW8uaCBoZXJlLiAqLwpAQCAtNzUsMjQgKzc1LDcgQEAKICAqLwogI2RlZmluZSB0c2tTVEFDS19GSUxMX0JZVEUJKCAweGE1VSApCiAKLS8qIFNvbWV0aW1lcyB0aGUgRnJlZVJUT1NDb25maWcuaCBzZXR0aW5ncyBvbmx5IGFsbG93IGEgdGFzayB0byBiZSBjcmVhdGVkIHVzaW5nCi1keW5hbWljYWxseSBhbGxvY2F0ZWQgUkFNLCBpbiB3aGljaCBjYXNlIHdoZW4gYW55IHRhc2sgaXMgZGVsZXRlZCBpdCBpcyBrbm93bgotdGhhdCBib3RoIHRoZSB0YXNrJ3Mgc3RhY2sgYW5kIFRDQiBuZWVkIHRvIGJlIGZyZWVkLiAgU29tZXRpbWVzIHRoZQotRnJlZVJUT1NDb25maWcuaCBzZXR0aW5ncyBvbmx5IGFsbG93IGEgdGFzayB0byBiZSBjcmVhdGVkIHVzaW5nIHN0YXRpY2FsbHkKLWFsbG9jYXRlZCBSQU0sIGluIHdoaWNoIGNhc2Ugd2hlbiBhbnkgdGFzayBpcyBkZWxldGVkIGl0IGlzIGtub3duIHRoYXQgbmVpdGhlcgotdGhlIHRhc2sncyBzdGFjayBvciBUQ0Igc2hvdWxkIGJlIGZyZWVkLiAgU29tZXRpbWVzIHRoZSBGcmVlUlRPU0NvbmZpZy5oCi1zZXR0aW5ncyBhbGxvdyBhIHRhc2sgdG8gYmUgY3JlYXRlZCB1c2luZyBlaXRoZXIgc3RhdGljYWxseSBvciBkeW5hbWljYWxseQotYWxsb2NhdGVkIFJBTSwgaW4gd2hpY2ggY2FzZSBhIG1lbWJlciBvZiB0aGUgVENCIGlzIHVzZWQgdG8gcmVjb3JkIHdoZXRoZXIgdGhlCi1zdGFjayBhbmQvb3IgVENCIHdlcmUgYWxsb2NhdGVkIHN0YXRpY2FsbHkgb3IgZHluYW1pY2FsbHksIHNvIHdoZW4gYSB0YXNrIGlzCi1kZWxldGVkIHRoZSBSQU0gdGhhdCB3YXMgYWxsb2NhdGVkIGR5bmFtaWNhbGx5IGlzIGZyZWVkIGFnYWluIGFuZCBubyBhdHRlbXB0IGlzCi1tYWRlIHRvIGZyZWUgdGhlIFJBTSB0aGF0IHdhcyBhbGxvY2F0ZWQgc3RhdGljYWxseS4KLXRza1NUQVRJQ19BTkRfRFlOQU1JQ19BTExPQ0FUSU9OX1BPU1NJQkxFIGlzIG9ubHkgdHJ1ZSBpZiBpdCBpcyBwb3NzaWJsZSBmb3IgYQotdGFzayB0byBiZSBjcmVhdGVkIHVzaW5nIGVpdGhlciBzdGF0aWNhbGx5IG9yIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBSQU0uICBOb3RlCi10aGF0IGlmIHBvcnRVU0lOR19NUFVfV1JBUFBFUlMgaXMgMSB0aGVuIGEgcHJvdGVjdGVkIHRhc2sgY2FuIGJlIGNyZWF0ZWQgd2l0aAotYSBzdGF0aWNhbGx5IGFsbG9jYXRlZCBzdGFjayBhbmQgYSBkeW5hbWljYWxseSBhbGxvY2F0ZWQgVENCLgotISEhTk9URSEhISBJZiB0aGUgZGVmaW5pdGlvbiBvZiB0c2tTVEFUSUNfQU5EX0RZTkFNSUNfQUxMT0NBVElPTl9QT1NTSUJMRSBpcwotY2hhbmdlZCB0aGVuIHRoZSBkZWZpbml0aW9uIG9mIFN0YXRpY1Rhc2tfdCBtdXN0IGFsc28gYmUgdXBkYXRlZC4gKi8KLSNkZWZpbmUgdHNrU1RBVElDX0FORF9EWU5BTUlDX0FMTE9DQVRJT05fUE9TU0lCTEUJKCAoIGNvbmZpZ1NVUFBPUlRfU1RBVElDX0FMTE9DQVRJT04gPT0gMSApICYmICggY29uZmlnU1VQUE9SVF9EWU5BTUlDX0FMTE9DQVRJT04gPT0gMSApICkKKy8qIEJpdHMgdXNlZCB0byByZWNvcmVkIGhvdyBhIHRhc2sncyBzdGFjayBhbmQgVENCIHdlcmUgYWxsb2NhdGVkLiAqLwogI2RlZmluZSB0c2tEWU5BTUlDQUxMWV9BTExPQ0FURURfU1RBQ0tfQU5EX1RDQiAJCSggKCB1aW50OF90ICkgMCApCiAjZGVmaW5lIHRza1NUQVRJQ0FMTFlfQUxMT0NBVEVEX1NUQUNLX09OTFkgCQkJKCAoIHVpbnQ4X3QgKSAxICkKICNkZWZpbmUgdHNrU1RBVElDQUxMWV9BTExPQ0FURURfU1RBQ0tfQU5EX1RDQgkJKCAoIHVpbnQ4X3QgKSAyICkKQEAgLTEwMCw3ICs4Myw3IEBACiAvKiBJZiBhbnkgb2YgdGhlIGZvbGxvd2luZyBhcmUgc2V0IHRoZW4gdGFzayBzdGFja3MgYXJlIGZpbGxlZCB3aXRoIGEga25vd24KIHZhbHVlIHNvIHRoZSBoaWdoIHdhdGVyIG1hcmsgY2FuIGJlIGRldGVybWluZWQuICBJZiBub25lIG9mIHRoZSBmb2xsb3dpbmcgYXJlCiBzZXQgdGhlbiBkb24ndCBmaWxsIHRoZSBzdGFjayBzbyB0aGVyZSBpcyBubyB1bm5lY2Vzc2FyeSBkZXBlbmRlbmN5IG9uIG1lbXNldC4gKi8KLSNpZiggKCBjb25maWdDSEVDS19GT1JfU1RBQ0tfT1ZFUkZMT1cgPiAxICkgfHwgKCBjb25maWdVU0VfVFJBQ0VfRkFDSUxJVFkgPT0gMSApIHx8ICggSU5DTFVERV91eFRhc2tHZXRTdGFja0hpZ2hXYXRlck1hcmsgPT0gMSApICkKKyNpZiggKCBjb25maWdDSEVDS19GT1JfU1RBQ0tfT1ZFUkZMT1cgPiAxICkgfHwgKCBjb25maWdVU0VfVFJBQ0VfRkFDSUxJVFkgPT0gMSApIHx8ICggSU5DTFVERV91eFRhc2tHZXRTdGFja0hpZ2hXYXRlck1hcmsgPT0gMSApIHx8ICggSU5DTFVERV91eFRhc2tHZXRTdGFja0hpZ2hXYXRlck1hcmsyID09IDEgKSApCiAJI2RlZmluZSB0c2tTRVRfTkVXX1NUQUNLU19UT19LTk9XTl9WQUxVRQkxCiAjZWxzZQogCSNkZWZpbmUgdHNrU0VUX05FV19TVEFDS1NfVE9fS05PV05fVkFMVUUJMApAQCAtMjQ1LDcgKzIyOCw3IEBACiAgKiB0YXNrIHNob3VsZCBiZSB1c2VkIGluIHBsYWNlIG9mIHRoZSBwYXJhbWV0ZXIuICBUaGlzIG1hY3JvIHNpbXBseSBjaGVja3MgdG8KICAqIHNlZSBpZiB0aGUgcGFyYW1ldGVyIGlzIE5VTEwgYW5kIHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBhcHByb3ByaWF0ZSBUQ0IuCiAgKi8KLSNkZWZpbmUgcHJ2R2V0VENCRnJvbUhhbmRsZSggcHhIYW5kbGUgKSAoICggKCBweEhhbmRsZSApID09IE5VTEwgKSA/ICggVENCX3QgKiApIHB4Q3VycmVudFRDQiA6ICggVENCX3QgKiApICggcHhIYW5kbGUgKSApCisjZGVmaW5lIHBydkdldFRDQkZyb21IYW5kbGUoIHB4SGFuZGxlICkgKCAoICggcHhIYW5kbGUgKSA9PSBOVUxMICkgPyBweEN1cnJlbnRUQ0IgOiAoIHB4SGFuZGxlICkgKQogCiAvKiBUaGUgaXRlbSB2YWx1ZSBvZiB0aGUgZXZlbnQgbGlzdCBpdGVtIGlzIG5vcm1hbGx5IHVzZWQgdG8gaG9sZCB0aGUgcHJpb3JpdHkKIG9mIHRoZSB0YXNrIHRvIHdoaWNoIGl0IGJlbG9uZ3MgKGNvZGVkIHRvIGFsbG93IGl0IHRvIGJlIGhlbGQgaW4gcmV2ZXJzZQpAQCAtMjY2LDcgKzI0OSw3IEBACiAgKiBhbmQgc3RvcmVzIHRhc2sgc3RhdGUgaW5mb3JtYXRpb24sIGluY2x1ZGluZyBhIHBvaW50ZXIgdG8gdGhlIHRhc2sncyBjb250ZXh0CiAgKiAodGhlIHRhc2sncyBydW4gdGltZSBlbnZpcm9ubWVudCwgaW5jbHVkaW5nIHJlZ2lzdGVyIHZhbHVlcykKICAqLwotdHlwZWRlZiBzdHJ1Y3QgdHNrVGFza0NvbnRyb2xCbG9jawordHlwZWRlZiBzdHJ1Y3QgdHNrVGFza0NvbnRyb2xCbG9jayAJCQkvKiBUaGUgb2xkIG5hbWluZyBjb252ZW50aW9uIGlzIHVzZWQgdG8gcHJldmVudCBicmVha2luZyBrZXJuZWwgYXdhcmUgZGVidWdnZXJzLiAqLwogewogCXZvbGF0aWxlIFN0YWNrVHlwZV90CSpweFRvcE9mU3RhY2s7CS8qPCBQb2ludHMgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBsYXN0IGl0ZW0gcGxhY2VkIG9uIHRoZSB0YXNrcyBzdGFjay4gIFRISVMgTVVTVCBCRSBUSEUgRklSU1QgTUVNQkVSIE9GIFRIRSBUQ0IgU1RSVUNULiAqLwogCkBAIC0zMjYsOSArMzA5LDkgQEAKIAkJdm9sYXRpbGUgdWludDhfdCB1Y05vdGlmeVN0YXRlOwogCSNlbmRpZgogCi0JLyogU2VlIHRoZSBjb21tZW50cyBhYm92ZSB0aGUgZGVmaW5pdGlvbiBvZgorCS8qIFNlZSB0aGUgY29tbWVudHMgaW4gRnJlZVJUT1MuaCB3aXRoIHRoZSBkZWZpbml0aW9uIG9mCiAJdHNrU1RBVElDX0FORF9EWU5BTUlDX0FMTE9DQVRJT05fUE9TU0lCTEUuICovCi0JI2lmKCB0c2tTVEFUSUNfQU5EX0RZTkFNSUNfQUxMT0NBVElPTl9QT1NTSUJMRSAhPSAwICkgLypsaW50ICFlNzMxIE1hY3JvIGhhcyBiZWVuIGNvbnNvbGlkYXRlZCBmb3IgcmVhZGFiaWxpdHkgcmVhc29ucy4gKi8KKwkjaWYoIHRza1NUQVRJQ19BTkRfRFlOQU1JQ19BTExPQ0FUSU9OX1BPU1NJQkxFICE9IDAgKSAvKmxpbnQgIWU3MzEgIWU5MDI5IE1hY3JvIGhhcyBiZWVuIGNvbnNvbGlkYXRlZCBmb3IgcmVhZGFiaWxpdHkgcmVhc29ucy4gKi8KIAkJdWludDhfdAl1Y1N0YXRpY2FsbHlBbGxvY2F0ZWQ7IAkJLyo8IFNldCB0byBwZFRSVUUgaWYgdGhlIHRhc2sgaXMgYSBzdGF0aWNhbGx5IGFsbG9jYXRlZCB0byBlbnN1cmUgbm8gYXR0ZW1wdCBpcyBtYWRlIHRvIGZyZWUgdGhlIG1lbW9yeS4gKi8KIAkjZW5kaWYKIApAQCAtMzM2LDYgKzMxOSwxMCBAQAogCQl1aW50OF90IHVjRGVsYXlBYm9ydGVkOwogCSNlbmRpZgogCisJI2lmKCBjb25maWdVU0VfUE9TSVhfRVJSTk8gPT0gMSApCisJCWludCBpVGFza0Vycm5vOworCSNlbmRpZgorCiB9IHRza1RDQjsKIAogLyogVGhlIG9sZCB0c2tUQ0IgbmFtZSBpcyBtYWludGFpbmVkIGFib3ZlIHRoZW4gdHlwZWRlZmVkIHRvIHRoZSBuZXcgVENCX3QgbmFtZQpAQCAtMzQ0LDMwICszMzEsMzggQEAKIAogLypsaW50IC1zYXZlIC1lOTU2IEEgbWFudWFsIGFuYWx5c2lzIGFuZCBpbnNwZWN0aW9uIGhhcyBiZWVuIHVzZWQgdG8gZGV0ZXJtaW5lCiB3aGljaCBzdGF0aWMgdmFyaWFibGVzIG11c3QgYmUgZGVjbGFyZWQgdm9sYXRpbGUuICovCi0KIFBSSVZJTEVHRURfREFUQSBUQ0JfdCAqIHZvbGF0aWxlIHB4Q3VycmVudFRDQiA9IE5VTEw7CiAKLS8qIExpc3RzIGZvciByZWFkeSBhbmQgYmxvY2tlZCB0YXNrcy4gLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotUFJJVklMRUdFRF9EQVRBIHN0YXRpYyBMaXN0X3QgcHhSZWFkeVRhc2tzTGlzdHNbIGNvbmZpZ01BWF9QUklPUklUSUVTIF0gPSB7MH07CS8qPCBQcmlvcml0aXNlZCByZWFkeSB0YXNrcy4gKi8KLVBSSVZJTEVHRURfREFUQSBzdGF0aWMgTGlzdF90IHhEZWxheWVkVGFza0xpc3QxID0gezB9OwkJCQkJCQkJLyo8IERlbGF5ZWQgdGFza3MuICovCi1QUklWSUxFR0VEX0RBVEEgc3RhdGljIExpc3RfdCB4RGVsYXllZFRhc2tMaXN0MiA9IHswfTsJCQkJCQkJCS8qPCBEZWxheWVkIHRhc2tzICh0d28gbGlzdHMgYXJlIHVzZWQgLSBvbmUgZm9yIGRlbGF5cyB0aGF0IGhhdmUgb3ZlcmZsb3dlZCB0aGUgY3VycmVudCB0aWNrIGNvdW50LiAqLwotUFJJVklMRUdFRF9EQVRBIHN0YXRpYyBMaXN0X3QgKiB2b2xhdGlsZSBweERlbGF5ZWRUYXNrTGlzdCA9IE5VTEw7CQkJCQkvKjwgUG9pbnRzIHRvIHRoZSBkZWxheWVkIHRhc2sgbGlzdCBjdXJyZW50bHkgYmVpbmcgdXNlZC4gKi8KLVBSSVZJTEVHRURfREFUQSBzdGF0aWMgTGlzdF90ICogdm9sYXRpbGUgcHhPdmVyZmxvd0RlbGF5ZWRUYXNrTGlzdCA9IE5VTEw7CQkJLyo8IFBvaW50cyB0byB0aGUgZGVsYXllZCB0YXNrIGxpc3QgY3VycmVudGx5IGJlaW5nIHVzZWQgdG8gaG9sZCB0YXNrcyB0aGF0IGhhdmUgb3ZlcmZsb3dlZCB0aGUgY3VycmVudCB0aWNrIGNvdW50LiAqLwotUFJJVklMRUdFRF9EQVRBIHN0YXRpYyBMaXN0X3QgeFBlbmRpbmdSZWFkeUxpc3QgPSB7MH07CQkJCQkJCQkvKjwgVGFza3MgdGhhdCBoYXZlIGJlZW4gcmVhZGllZCB3aGlsZSB0aGUgc2NoZWR1bGVyIHdhcyBzdXNwZW5kZWQuICBUaGV5IHdpbGwgYmUgbW92ZWQgdG8gdGhlIHJlYWR5IGxpc3Qgd2hlbiB0aGUgc2NoZWR1bGVyIGlzIHJlc3VtZWQuICovCisvKiBMaXN0cyBmb3IgcmVhZHkgYW5kIGJsb2NrZWQgdGFza3MuIC0tLS0tLS0tLS0tLS0tLS0tLS0tCit4RGVsYXllZFRhc2tMaXN0MSBhbmQgeERlbGF5ZWRUYXNrTGlzdDIgY291bGQgYmUgbW92ZSB0byBmdW5jdGlvbiBzY29wbGUgYnV0Citkb2luZyBzbyBicmVha3Mgc29tZSBrZXJuZWwgYXdhcmUgZGVidWdnZXJzIGFuZCBkZWJ1Z2dlcnMgdGhhdCByZWx5IG9uIHJlbW92aW5nCit0aGUgc3RhdGljIHF1YWxpZmllci4gKi8KK1BSSVZJTEVHRURfREFUQSBzdGF0aWMgTGlzdF90IHB4UmVhZHlUYXNrc0xpc3RzWyBjb25maWdNQVhfUFJJT1JJVElFUyBdID0geyAwIH07Lyo8IFByaW9yaXRpc2VkIHJlYWR5IHRhc2tzLiAqLworUFJJVklMRUdFRF9EQVRBIHN0YXRpYyBMaXN0X3QgeERlbGF5ZWRUYXNrTGlzdDEgPSB7IDAgfTsJCQkJCQkvKjwgRGVsYXllZCB0YXNrcy4gKi8KK1BSSVZJTEVHRURfREFUQSBzdGF0aWMgTGlzdF90IHhEZWxheWVkVGFza0xpc3QyID0geyAwIH07CQkJCQkJLyo8IERlbGF5ZWQgdGFza3MgKHR3byBsaXN0cyBhcmUgdXNlZCAtIG9uZSBmb3IgZGVsYXlzIHRoYXQgaGF2ZSBvdmVyZmxvd2VkIHRoZSBjdXJyZW50IHRpY2sgY291bnQuICovCitQUklWSUxFR0VEX0RBVEEgc3RhdGljIExpc3RfdCAqIHZvbGF0aWxlIHB4RGVsYXllZFRhc2tMaXN0ID0gTlVMTDsJCQkJLyo8IFBvaW50cyB0byB0aGUgZGVsYXllZCB0YXNrIGxpc3QgY3VycmVudGx5IGJlaW5nIHVzZWQuICovCitQUklWSUxFR0VEX0RBVEEgc3RhdGljIExpc3RfdCAqIHZvbGF0aWxlIHB4T3ZlcmZsb3dEZWxheWVkVGFza0xpc3QgPSBOVUxMOwkJLyo8IFBvaW50cyB0byB0aGUgZGVsYXllZCB0YXNrIGxpc3QgY3VycmVudGx5IGJlaW5nIHVzZWQgdG8gaG9sZCB0YXNrcyB0aGF0IGhhdmUgb3ZlcmZsb3dlZCB0aGUgY3VycmVudCB0aWNrIGNvdW50LiAqLworUFJJVklMRUdFRF9EQVRBIHN0YXRpYyBMaXN0X3QgeFBlbmRpbmdSZWFkeUxpc3QgPSB7IDAgfTsJCQkJCQkvKjwgVGFza3MgdGhhdCBoYXZlIGJlZW4gcmVhZGllZCB3aGlsZSB0aGUgc2NoZWR1bGVyIHdhcyBzdXNwZW5kZWQuICBUaGV5IHdpbGwgYmUgbW92ZWQgdG8gdGhlIHJlYWR5IGxpc3Qgd2hlbiB0aGUgc2NoZWR1bGVyIGlzIHJlc3VtZWQuICovCiAKICNpZiggSU5DTFVERV92VGFza0RlbGV0ZSA9PSAxICkKIAotCVBSSVZJTEVHRURfREFUQSBzdGF0aWMgTGlzdF90IHhUYXNrc1dhaXRpbmdUZXJtaW5hdGlvbiA9IHswfTsJCQkJCS8qPCBUYXNrcyB0aGF0IGhhdmUgYmVlbiBkZWxldGVkIC0gYnV0IHRoZWlyIG1lbW9yeSBub3QgeWV0IGZyZWVkLiAqLworUFJJVklMRUdFRF9EQVRBIHN0YXRpYyBMaXN0X3QgeFRhc2tzV2FpdGluZ1Rlcm1pbmF0aW9uID0geyAwIH07CQkJCS8qPCBUYXNrcyB0aGF0IGhhdmUgYmVlbiBkZWxldGVkIC0gYnV0IHRoZWlyIG1lbW9yeSBub3QgeWV0IGZyZWVkLiAqLwogCVBSSVZJTEVHRURfREFUQSBzdGF0aWMgdm9sYXRpbGUgVUJhc2VUeXBlX3QgdXhEZWxldGVkVGFza3NXYWl0aW5nQ2xlYW5VcCA9ICggVUJhc2VUeXBlX3QgKSAwVTsKIAogI2VuZGlmCiAKICNpZiAoIElOQ0xVREVfdlRhc2tTdXNwZW5kID09IDEgKQogCi0JUFJJVklMRUdFRF9EQVRBIHN0YXRpYyBMaXN0X3QgeFN1c3BlbmRlZFRhc2tMaXN0ID0gezB9OwkJCQkJCS8qPCBUYXNrcyB0aGF0IGFyZSBjdXJyZW50bHkgc3VzcGVuZGVkLiAqLworCVBSSVZJTEVHRURfREFUQSBzdGF0aWMgTGlzdF90IHhTdXNwZW5kZWRUYXNrTGlzdCA9IHsgMCB9OwkJCQkJLyo8IFRhc2tzIHRoYXQgYXJlIGN1cnJlbnRseSBzdXNwZW5kZWQuICovCiAKICNlbmRpZgogCisvKiBHbG9iYWwgUE9TSVggZXJybm8uIEl0cyB2YWx1ZSBpcyBjaGFuZ2VkIHVwb24gY29udGV4dCBzd2l0Y2hpbmcgdG8gbWF0Y2gKK3RoZSBlcnJubyBvZiB0aGUgY3VycmVudGx5IHJ1bm5pbmcgdGFzay4gKi8KKyNpZiAoIGNvbmZpZ1VTRV9QT1NJWF9FUlJOTyA9PSAxICkKKwlpbnQgRnJlZVJUT1NfZXJybm8gPSAwOworI2VuZGlmCisKIC8qIE90aGVyIGZpbGUgcHJpdmF0ZSB2YXJpYWJsZXMuIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIFBSSVZJTEVHRURfREFUQSBzdGF0aWMgdm9sYXRpbGUgVUJhc2VUeXBlX3QgdXhDdXJyZW50TnVtYmVyT2ZUYXNrcyAJPSAoIFVCYXNlVHlwZV90ICkgMFU7CiBQUklWSUxFR0VEX0RBVEEgc3RhdGljIHZvbGF0aWxlIFRpY2tUeXBlX3QgeFRpY2tDb3VudCAJCQkJPSAoIFRpY2tUeXBlX3QgKSBjb25maWdJTklUSUFMX1RJQ0tfQ09VTlQ7CkBAIC0zOTIsNiArMzg3LDggQEAKIAogI2lmICggY29uZmlnR0VORVJBVEVfUlVOX1RJTUVfU1RBVFMgPT0gMSApCiAKKwkvKiBEbyBub3QgbW92ZSB0aGVzZSB2YXJpYWJsZXMgdG8gZnVuY3Rpb24gc2NvcGUgYXMgZG9pbmcgc28gcHJldmVudHMgdGhlCisJY29kZSB3b3JraW5nIHdpdGggZGVidWdnZXJzIHRoYXQgbmVlZCB0byByZW1vdmUgdGhlIHN0YXRpYyBxdWFsaWZpZXIuICovCiAJUFJJVklMRUdFRF9EQVRBIHN0YXRpYyB1aW50MzJfdCB1bFRhc2tTd2l0Y2hlZEluVGltZSA9IDBVTDsJLyo8IEhvbGRzIHRoZSB2YWx1ZSBvZiBhIHRpbWVyL2NvdW50ZXIgdGhlIGxhc3QgdGltZSBhIHRhc2sgd2FzIHN3aXRjaGVkIGluLiAqLwogCVBSSVZJTEVHRURfREFUQSBzdGF0aWMgdWludDMyX3QgdWxUb3RhbFJ1blRpbWUgPSAwVUw7CQkvKjwgSG9sZHMgdGhlIHRvdGFsIGFtb3VudCBvZiBleGVjdXRpb24gdGltZSBhcyBkZWZpbmVkIGJ5IHRoZSBydW4gdGltZSBjb3VudGVyIGNsb2NrLiAqLwogCkBAIC00MDMsMTUgKzQwMCwyMSBAQAogCiAvKiBDYWxsYmFjayBmdW5jdGlvbiBwcm90b3R5cGVzLiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAjaWYoICBjb25maWdDSEVDS19GT1JfU1RBQ0tfT1ZFUkZMT1cgPiAwICkKKwogCWV4dGVybiB2b2lkIHZBcHBsaWNhdGlvblN0YWNrT3ZlcmZsb3dIb29rKCBUYXNrSGFuZGxlX3QgeFRhc2ssIGNoYXIgKnBjVGFza05hbWUgKTsKKwogI2VuZGlmCiAKICNpZiggY29uZmlnVVNFX1RJQ0tfSE9PSyA+IDAgKQotCWV4dGVybiB2b2lkIHZBcHBsaWNhdGlvblRpY2tIb29rKCB2b2lkICk7CisKKwlleHRlcm4gdm9pZCB2QXBwbGljYXRpb25UaWNrSG9vayggdm9pZCApOyAvKmxpbnQgIWU1MjYgU3ltYm9sIG5vdCBkZWZpbmVkIGFzIGl0IGlzIGFuIGFwcGxpY2F0aW9uIGNhbGxiYWNrLiAqLworCiAjZW5kaWYKIAogI2lmKCBjb25maWdTVVBQT1JUX1NUQVRJQ19BTExPQ0FUSU9OID09IDEgKQotCWV4dGVybiB2b2lkIHZBcHBsaWNhdGlvbkdldElkbGVUYXNrTWVtb3J5KCBTdGF0aWNUYXNrX3QgKipwcHhJZGxlVGFza1RDQkJ1ZmZlciwgU3RhY2tUeXBlX3QgKipwcHhJZGxlVGFza1N0YWNrQnVmZmVyLCB1aW50MzJfdCAqcHVsSWRsZVRhc2tTdGFja1NpemUgKTsKKworCWV4dGVybiB2b2lkIHZBcHBsaWNhdGlvbkdldElkbGVUYXNrTWVtb3J5KCBTdGF0aWNUYXNrX3QgKipwcHhJZGxlVGFza1RDQkJ1ZmZlciwgU3RhY2tUeXBlX3QgKipwcHhJZGxlVGFza1N0YWNrQnVmZmVyLCB1aW50MzJfdCAqcHVsSWRsZVRhc2tTdGFja1NpemUgKTsgLypsaW50ICFlNTI2IFN5bWJvbCBub3QgZGVmaW5lZCBhcyBpdCBpcyBhbiBhcHBsaWNhdGlvbiBjYWxsYmFjay4gKi8KKwogI2VuZGlmCiAKIC8qIEZpbGUgcHJpdmF0ZSBmdW5jdGlvbnMuIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTUwMSw5ICs1MDQsOSBAQAogICogVGhpcyBmdW5jdGlvbiBkZXRlcm1pbmVzIHRoZSAnaGlnaCB3YXRlciBtYXJrJyBvZiB0aGUgdGFzayBzdGFjayBieQogICogZGV0ZXJtaW5pbmcgaG93IG11Y2ggb2YgdGhlIHN0YWNrIHJlbWFpbnMgYXQgdGhlIG9yaWdpbmFsIHByZXNldCB2YWx1ZS4KICAqLwotI2lmICggKCBjb25maWdVU0VfVFJBQ0VfRkFDSUxJVFkgPT0gMSApIHx8ICggSU5DTFVERV91eFRhc2tHZXRTdGFja0hpZ2hXYXRlck1hcmsgPT0gMSApICkKKyNpZiAoICggY29uZmlnVVNFX1RSQUNFX0ZBQ0lMSVRZID09IDEgKSB8fCAoIElOQ0xVREVfdXhUYXNrR2V0U3RhY2tIaWdoV2F0ZXJNYXJrID09IDEgKSB8fCAoIElOQ0xVREVfdXhUYXNrR2V0U3RhY2tIaWdoV2F0ZXJNYXJrMiA9PSAxICkgKQogCi0Jc3RhdGljIHVpbnQxNl90IHBydlRhc2tDaGVja0ZyZWVTdGFja1NwYWNlKCBjb25zdCB1aW50OF90ICogcHVjU3RhY2tCeXRlICkgUFJJVklMRUdFRF9GVU5DVElPTjsKKwlzdGF0aWMgY29uZmlnU1RBQ0tfREVQVEhfVFlQRSBwcnZUYXNrQ2hlY2tGcmVlU3RhY2tTcGFjZSggY29uc3QgdWludDhfdCAqIHB1Y1N0YWNrQnl0ZSApIFBSSVZJTEVHRURfRlVOQ1RJT047CiAKICNlbmRpZgogCkBAIC01OTMsNiArNTk2LDcgQEAKIAkJCXN0cnVjdHVyZS4gKi8KIAkJCXZvbGF0aWxlIHNpemVfdCB4U2l6ZSA9IHNpemVvZiggU3RhdGljVGFza190ICk7CiAJCQljb25maWdBU1NFUlQoIHhTaXplID09IHNpemVvZiggVENCX3QgKSApOworCQkJKCB2b2lkICkgeFNpemU7IC8qIFByZXZlbnQgbGludCB3YXJuaW5nIHdoZW4gY29uZmlnQVNTRVJUKCkgaXMgbm90IHVzZWQuICovCiAJCX0KIAkJI2VuZGlmIC8qIGNvbmZpZ0FTU0VSVF9ERUZJTkVEICovCiAKQEAgLTYwMSwxNiArNjA1LDE2IEBACiAJCXsKIAkJCS8qIFRoZSBtZW1vcnkgdXNlZCBmb3IgdGhlIHRhc2sncyBUQ0IgYW5kIHN0YWNrIGFyZSBwYXNzZWQgaW50byB0aGlzCiAJCQlmdW5jdGlvbiAtIHVzZSB0aGVtLiAqLwotCQkJcHhOZXdUQ0IgPSAoIFRDQl90ICogKSBweFRhc2tCdWZmZXI7IC8qbGludCAhZTc0MCBVbnVzdWFsIGNhc3QgaXMgb2sgYXMgdGhlIHN0cnVjdHVyZXMgYXJlIGRlc2lnbmVkIHRvIGhhdmUgdGhlIHNhbWUgYWxpZ25tZW50LCBhbmQgdGhlIHNpemUgaXMgY2hlY2tlZCBieSBhbiBhc3NlcnQuICovCisJCQlweE5ld1RDQiA9ICggVENCX3QgKiApIHB4VGFza0J1ZmZlcjsgLypsaW50ICFlNzQwICFlOTA4NyBVbnVzdWFsIGNhc3QgaXMgb2sgYXMgdGhlIHN0cnVjdHVyZXMgYXJlIGRlc2lnbmVkIHRvIGhhdmUgdGhlIHNhbWUgYWxpZ25tZW50LCBhbmQgdGhlIHNpemUgaXMgY2hlY2tlZCBieSBhbiBhc3NlcnQuICovCiAJCQlweE5ld1RDQi0+cHhTdGFjayA9ICggU3RhY2tUeXBlX3QgKiApIHB1eFN0YWNrQnVmZmVyOwogCi0JCQkjaWYoIHRza1NUQVRJQ19BTkRfRFlOQU1JQ19BTExPQ0FUSU9OX1BPU1NJQkxFICE9IDAgKSAvKmxpbnQgIWU3MzEgTWFjcm8gaGFzIGJlZW4gY29uc29saWRhdGVkIGZvciByZWFkYWJpbGl0eSByZWFzb25zLiAqLworCQkJI2lmKCB0c2tTVEFUSUNfQU5EX0RZTkFNSUNfQUxMT0NBVElPTl9QT1NTSUJMRSAhPSAwICkgLypsaW50ICFlNzMxICFlOTAyOSBNYWNybyBoYXMgYmVlbiBjb25zb2xpZGF0ZWQgZm9yIHJlYWRhYmlsaXR5IHJlYXNvbnMuICovCiAJCQl7CiAJCQkJLyogVGFza3MgY2FuIGJlIGNyZWF0ZWQgc3RhdGljYWxseSBvciBkeW5hbWljYWxseSwgc28gbm90ZSB0aGlzCiAJCQkJdGFzayB3YXMgY3JlYXRlZCBzdGF0aWNhbGx5IGluIGNhc2UgdGhlIHRhc2sgaXMgbGF0ZXIgZGVsZXRlZC4gKi8KIAkJCQlweE5ld1RDQi0+dWNTdGF0aWNhbGx5QWxsb2NhdGVkID0gdHNrU1RBVElDQUxMWV9BTExPQ0FURURfU1RBQ0tfQU5EX1RDQjsKIAkJCX0KLQkJCSNlbmRpZiAvKiBjb25maWdTVVBQT1JUX0RZTkFNSUNfQUxMT0NBVElPTiAqLworCQkJI2VuZGlmIC8qIHRza1NUQVRJQ19BTkRfRFlOQU1JQ19BTExPQ0FUSU9OX1BPU1NJQkxFICovCiAKIAkJCXBydkluaXRpYWxpc2VOZXdUYXNrKCBweFRhc2tDb2RlLCBwY05hbWUsIHVsU3RhY2tEZXB0aCwgcHZQYXJhbWV0ZXJzLCB1eFByaW9yaXR5LCAmeFJldHVybiwgcHhOZXdUQ0IsIE5VTEwgKTsKIAkJCXBydkFkZE5ld1Rhc2tUb1JlYWR5TGlzdCggcHhOZXdUQ0IgKTsKQEAgLTY1Miw3ICs2NTYsNyBAQAogCQkJCXRhc2sgd2FzIGNyZWF0ZWQgc3RhdGljYWxseSBpbiBjYXNlIHRoZSB0YXNrIGlzIGxhdGVyIGRlbGV0ZWQuICovCiAJCQkJcHhOZXdUQ0ItPnVjU3RhdGljYWxseUFsbG9jYXRlZCA9IHRza1NUQVRJQ0FMTFlfQUxMT0NBVEVEX1NUQUNLX0FORF9UQ0I7CiAJCQl9Ci0JCQkjZW5kaWYgLyogY29uZmlnU1VQUE9SVF9EWU5BTUlDX0FMTE9DQVRJT04gKi8KKwkJCSNlbmRpZiAvKiB0c2tTVEFUSUNfQU5EX0RZTkFNSUNfQUxMT0NBVElPTl9QT1NTSUJMRSAqLwogCiAJCQlwcnZJbml0aWFsaXNlTmV3VGFzaygJcHhUYXNrRGVmaW5pdGlvbi0+cHZUYXNrQ29kZSwKIAkJCQkJCQkJCXB4VGFza0RlZmluaXRpb24tPnBjTmFtZSwKQEAgLTY5MywxNCArNjk3LDE0IEBACiAJCQkJLyogU3RvcmUgdGhlIHN0YWNrIGxvY2F0aW9uIGluIHRoZSBUQ0IuICovCiAJCQkJcHhOZXdUQ0ItPnB4U3RhY2sgPSBweFRhc2tEZWZpbml0aW9uLT5wdXhTdGFja0J1ZmZlcjsKIAotCQkJCSNpZiggY29uZmlnU1VQUE9SVF9TVEFUSUNfQUxMT0NBVElPTiA9PSAxICkKKwkJCQkjaWYoIHRza1NUQVRJQ19BTkRfRFlOQU1JQ19BTExPQ0FUSU9OX1BPU1NJQkxFICE9IDAgKQogCQkJCXsKIAkJCQkJLyogVGFza3MgY2FuIGJlIGNyZWF0ZWQgc3RhdGljYWxseSBvciBkeW5hbWljYWxseSwgc28gbm90ZQogCQkJCQl0aGlzIHRhc2sgaGFkIGEgc3RhdGljYWxseSBhbGxvY2F0ZWQgc3RhY2sgaW4gY2FzZSBpdCBpcwogCQkJCQlsYXRlciBkZWxldGVkLiAgVGhlIFRDQiB3YXMgYWxsb2NhdGVkIGR5bmFtaWNhbGx5LiAqLwogCQkJCQlweE5ld1RDQi0+dWNTdGF0aWNhbGx5QWxsb2NhdGVkID0gdHNrU1RBVElDQUxMWV9BTExPQ0FURURfU1RBQ0tfT05MWTsKIAkJCQl9Ci0JCQkJI2VuZGlmCisJCQkJI2VuZGlmIC8qIHRza1NUQVRJQ19BTkRfRFlOQU1JQ19BTExPQ0FUSU9OX1BPU1NJQkxFICovCiAKIAkJCQlwcnZJbml0aWFsaXNlTmV3VGFzaygJcHhUYXNrRGVmaW5pdGlvbi0+cHZUYXNrQ29kZSwKIAkJCQkJCQkJCQlweFRhc2tEZWZpbml0aW9uLT5wY05hbWUsCkBAIC03NjMsMTIgKzc2NywxMiBAQAogCQlTdGFja1R5cGVfdCAqcHhTdGFjazsKIAogCQkJLyogQWxsb2NhdGUgc3BhY2UgZm9yIHRoZSBzdGFjayB1c2VkIGJ5IHRoZSB0YXNrIGJlaW5nIGNyZWF0ZWQuICovCi0JCQlweFN0YWNrID0gKCBTdGFja1R5cGVfdCAqICkgcHZQb3J0TWFsbG9jKCAoICggKCBzaXplX3QgKSB1c1N0YWNrRGVwdGggKSAqIHNpemVvZiggU3RhY2tUeXBlX3QgKSApICk7IC8qbGludCAhZTk2MSBNSVNSQSBleGNlcHRpb24gYXMgdGhlIGNhc3RzIGFyZSBvbmx5IHJlZHVuZGFudCBmb3Igc29tZSBwb3J0cy4gKi8KKwkJCXB4U3RhY2sgPSBwdlBvcnRNYWxsb2MoICggKCAoIHNpemVfdCApIHVzU3RhY2tEZXB0aCApICogc2l6ZW9mKCBTdGFja1R5cGVfdCApICkgKTsgLypsaW50ICFlOTA3OSBBbGwgdmFsdWVzIHJldHVybmVkIGJ5IHB2UG9ydE1hbGxvYygpIGhhdmUgYXQgbGVhc3QgdGhlIGFsaWdubWVudCByZXF1aXJlZCBieSB0aGUgTUNVJ3Mgc3RhY2sgYW5kIHRoaXMgYWxsb2NhdGlvbiBpcyB0aGUgc3RhY2suICovCiAKIAkJCWlmKCBweFN0YWNrICE9IE5VTEwgKQogCQkJewogCQkJCS8qIEFsbG9jYXRlIHNwYWNlIGZvciB0aGUgVENCLiAqLwotCQkJCXB4TmV3VENCID0gKCBUQ0JfdCAqICkgcHZQb3J0TWFsbG9jKCBzaXplb2YoIFRDQl90ICkgKTsgLypsaW50ICFlOTYxIE1JU1JBIGV4Y2VwdGlvbiBhcyB0aGUgY2FzdHMgYXJlIG9ubHkgcmVkdW5kYW50IGZvciBzb21lIHBhdGhzLiAqLworCQkJCXB4TmV3VENCID0gKCBUQ0JfdCAqICkgcHZQb3J0TWFsbG9jKCBzaXplb2YoIFRDQl90ICkgKTsgLypsaW50ICFlOTA4NyAhZTkwNzkgQWxsIHZhbHVlcyByZXR1cm5lZCBieSBwdlBvcnRNYWxsb2MoKSBoYXZlIGF0IGxlYXN0IHRoZSBhbGlnbm1lbnQgcmVxdWlyZWQgYnkgdGhlIE1DVSdzIHN0YWNrLCBhbmQgdGhlIGZpcnN0IG1lbWJlciBvZiBUQ0JfdCBpcyBhbHdheXMgYSBwb2ludGVyIHRvIHRoZSB0YXNrJ3Mgc3RhY2suICovCiAKIAkJCQlpZiggcHhOZXdUQ0IgIT0gTlVMTCApCiAJCQkJewpAQCAtNzkxLDEzICs3OTUsMTMgQEAKIAogCQlpZiggcHhOZXdUQ0IgIT0gTlVMTCApCiAJCXsKLQkJCSNpZiggdHNrU1RBVElDX0FORF9EWU5BTUlDX0FMTE9DQVRJT05fUE9TU0lCTEUgIT0gMCApIC8qbGludCAhZTczMSBNYWNybyBoYXMgYmVlbiBjb25zb2xpZGF0ZWQgZm9yIHJlYWRhYmlsaXR5IHJlYXNvbnMuICovCisJCQkjaWYoIHRza1NUQVRJQ19BTkRfRFlOQU1JQ19BTExPQ0FUSU9OX1BPU1NJQkxFICE9IDAgKSAvKmxpbnQgIWU5MDI5ICFlNzMxIE1hY3JvIGhhcyBiZWVuIGNvbnNvbGlkYXRlZCBmb3IgcmVhZGFiaWxpdHkgcmVhc29ucy4gKi8KIAkJCXsKIAkJCQkvKiBUYXNrcyBjYW4gYmUgY3JlYXRlZCBzdGF0aWNhbGx5IG9yIGR5bmFtaWNhbGx5LCBzbyBub3RlIHRoaXMKIAkJCQl0YXNrIHdhcyBjcmVhdGVkIGR5bmFtaWNhbGx5IGluIGNhc2UgaXQgaXMgbGF0ZXIgZGVsZXRlZC4gKi8KIAkJCQlweE5ld1RDQi0+dWNTdGF0aWNhbGx5QWxsb2NhdGVkID0gdHNrRFlOQU1JQ0FMTFlfQUxMT0NBVEVEX1NUQUNLX0FORF9UQ0I7CiAJCQl9Ci0JCQkjZW5kaWYgLyogY29uZmlnU1VQUE9SVF9TVEFUSUNfQUxMT0NBVElPTiAqLworCQkJI2VuZGlmIC8qIHRza1NUQVRJQ19BTkRfRFlOQU1JQ19BTExPQ0FUSU9OX1BPU1NJQkxFICovCiAKIAkJCXBydkluaXRpYWxpc2VOZXdUYXNrKCBweFRhc2tDb2RlLCBwY05hbWUsICggdWludDMyX3QgKSB1c1N0YWNrRGVwdGgsIHB2UGFyYW1ldGVycywgdXhQcmlvcml0eSwgcHhDcmVhdGVkVGFzaywgcHhOZXdUQ0IsIE5VTEwgKTsKIAkJCXBydkFkZE5ld1Rhc2tUb1JlYWR5TGlzdCggcHhOZXdUQ0IgKTsKQEAgLTg1NCw4ICs4NTgsOCBAQAogCWJ5IHRoZSBwb3J0LiAqLwogCSNpZiggcG9ydFNUQUNLX0dST1dUSCA8IDAgKQogCXsKLQkJcHhUb3BPZlN0YWNrID0gcHhOZXdUQ0ItPnB4U3RhY2sgKyAoIHVsU3RhY2tEZXB0aCAtICggdWludDMyX3QgKSAxICk7Ci0JCXB4VG9wT2ZTdGFjayA9ICggU3RhY2tUeXBlX3QgKiApICggKCAoIHBvcnRQT0lOVEVSX1NJWkVfVFlQRSApIHB4VG9wT2ZTdGFjayApICYgKCB+KCAoIHBvcnRQT0lOVEVSX1NJWkVfVFlQRSApIHBvcnRCWVRFX0FMSUdOTUVOVF9NQVNLICkgKSApOyAvKmxpbnQgIWU5MjMgTUlTUkEgZXhjZXB0aW9uLiAgQXZvaWRpbmcgY2FzdHMgYmV0d2VlbiBwb2ludGVycyBhbmQgaW50ZWdlcnMgaXMgbm90IHByYWN0aWNhbC4gIFNpemUgZGlmZmVyZW5jZXMgYWNjb3VudGVkIGZvciB1c2luZyBwb3J0UE9JTlRFUl9TSVpFX1RZUEUgdHlwZS4gKi8KKwkJcHhUb3BPZlN0YWNrID0gJiggcHhOZXdUQ0ItPnB4U3RhY2tbIHVsU3RhY2tEZXB0aCAtICggdWludDMyX3QgKSAxIF0gKTsKKwkJcHhUb3BPZlN0YWNrID0gKCBTdGFja1R5cGVfdCAqICkgKCAoICggcG9ydFBPSU5URVJfU0laRV9UWVBFICkgcHhUb3BPZlN0YWNrICkgJiAoIH4oICggcG9ydFBPSU5URVJfU0laRV9UWVBFICkgcG9ydEJZVEVfQUxJR05NRU5UX01BU0sgKSApICk7IC8qbGludCAhZTkyMyAhZTkwMzMgIWU5MDc4IE1JU1JBIGV4Y2VwdGlvbi4gIEF2b2lkaW5nIGNhc3RzIGJldHdlZW4gcG9pbnRlcnMgYW5kIGludGVnZXJzIGlzIG5vdCBwcmFjdGljYWwuICBTaXplIGRpZmZlcmVuY2VzIGFjY291bnRlZCBmb3IgdXNpbmcgcG9ydFBPSU5URVJfU0laRV9UWVBFIHR5cGUuICBDaGVja2VkIGJ5IGFzc2VydCgpLiAqLwogCiAJCS8qIENoZWNrIHRoZSBhbGlnbm1lbnQgb2YgdGhlIGNhbGN1bGF0ZWQgdG9wIG9mIHN0YWNrIGlzIGNvcnJlY3QuICovCiAJCWNvbmZpZ0FTU0VSVCggKCAoICggcG9ydFBPSU5URVJfU0laRV9UWVBFICkgcHhUb3BPZlN0YWNrICYgKCBwb3J0UE9JTlRFUl9TSVpFX1RZUEUgKSBwb3J0QllURV9BTElHTk1FTlRfTUFTSyApID09IDBVTCApICk7CkBAIC04ODIsMjYgKzg4NiwzNSBAQAogCSNlbmRpZiAvKiBwb3J0U1RBQ0tfR1JPV1RIICovCiAKIAkvKiBTdG9yZSB0aGUgdGFzayBuYW1lIGluIHRoZSBUQ0IuICovCi0JZm9yKCB4ID0gKCBVQmFzZVR5cGVfdCApIDA7IHggPCAoIFVCYXNlVHlwZV90ICkgY29uZmlnTUFYX1RBU0tfTkFNRV9MRU47IHgrKyApCisJaWYoIHBjTmFtZSAhPSBOVUxMICkKIAl7Ci0JCXB4TmV3VENCLT5wY1Rhc2tOYW1lWyB4IF0gPSBwY05hbWVbIHggXTsKKwkJZm9yKCB4ID0gKCBVQmFzZVR5cGVfdCApIDA7IHggPCAoIFVCYXNlVHlwZV90ICkgY29uZmlnTUFYX1RBU0tfTkFNRV9MRU47IHgrKyApCisJCXsKKwkJCXB4TmV3VENCLT5wY1Rhc2tOYW1lWyB4IF0gPSBwY05hbWVbIHggXTsKIAotCQkvKiBEb24ndCBjb3B5IGFsbCBjb25maWdNQVhfVEFTS19OQU1FX0xFTiBpZiB0aGUgc3RyaW5nIGlzIHNob3J0ZXIgdGhhbgotCQljb25maWdNQVhfVEFTS19OQU1FX0xFTiBjaGFyYWN0ZXJzIGp1c3QgaW4gY2FzZSB0aGUgbWVtb3J5IGFmdGVyIHRoZQotCQlzdHJpbmcgaXMgbm90IGFjY2Vzc2libGUgKGV4dHJlbWVseSB1bmxpa2VseSkuICovCi0JCWlmKCBwY05hbWVbIHggXSA9PSAweDAwICkKLQkJewotCQkJYnJlYWs7CisJCQkvKiBEb24ndCBjb3B5IGFsbCBjb25maWdNQVhfVEFTS19OQU1FX0xFTiBpZiB0aGUgc3RyaW5nIGlzIHNob3J0ZXIgdGhhbgorCQkJY29uZmlnTUFYX1RBU0tfTkFNRV9MRU4gY2hhcmFjdGVycyBqdXN0IGluIGNhc2UgdGhlIG1lbW9yeSBhZnRlciB0aGUKKwkJCXN0cmluZyBpcyBub3QgYWNjZXNzaWJsZSAoZXh0cmVtZWx5IHVubGlrZWx5KS4gKi8KKwkJCWlmKCBwY05hbWVbIHggXSA9PSAoIGNoYXIgKSAweDAwICkKKwkJCXsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCQl9CiAJCX0KLQkJZWxzZQotCQl7Ci0JCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7Ci0JCX0KKworCQkvKiBFbnN1cmUgdGhlIG5hbWUgc3RyaW5nIGlzIHRlcm1pbmF0ZWQgaW4gdGhlIGNhc2UgdGhhdCB0aGUgc3RyaW5nIGxlbmd0aAorCQl3YXMgZ3JlYXRlciBvciBlcXVhbCB0byBjb25maWdNQVhfVEFTS19OQU1FX0xFTi4gKi8KKwkJcHhOZXdUQ0ItPnBjVGFza05hbWVbIGNvbmZpZ01BWF9UQVNLX05BTUVfTEVOIC0gMSBdID0gJ1wwJzsKIAl9Ci0KLQkvKiBFbnN1cmUgdGhlIG5hbWUgc3RyaW5nIGlzIHRlcm1pbmF0ZWQgaW4gdGhlIGNhc2UgdGhhdCB0aGUgc3RyaW5nIGxlbmd0aAotCXdhcyBncmVhdGVyIG9yIGVxdWFsIHRvIGNvbmZpZ01BWF9UQVNLX05BTUVfTEVOLiAqLwotCXB4TmV3VENCLT5wY1Rhc2tOYW1lWyBjb25maWdNQVhfVEFTS19OQU1FX0xFTiAtIDEgXSA9ICdcMCc7CisJZWxzZQorCXsKKwkJLyogVGhlIHRhc2sgaGFzIG5vdCBiZWVuIGdpdmVuIGEgbmFtZSwgc28ganVzdCBlbnN1cmUgdGhlcmUgaXMgYSBOVUxMCisJCXRlcm1pbmF0b3Igd2hlbiBpdCBpcyByZWFkIG91dC4gKi8KKwkJcHhOZXdUQ0ItPnBjVGFza05hbWVbIDAgXSA9IDB4MDA7CisJfQogCiAJLyogVGhpcyBpcyB1c2VkIGFzIGFuIGFycmF5IGluZGV4IHNvIG11c3QgZW5zdXJlIGl0J3Mgbm90IHRvbyBsYXJnZS4gIEZpcnN0CiAJcmVtb3ZlIHRoZSBwcml2aWxlZ2UgYml0IGlmIG9uZSBpcyBwcmVzZW50LiAqLwpAQCAtOTk3LDE1ICsxMDEwLDUzIEBACiAJdGhlIHRvcCBvZiBzdGFjayB2YXJpYWJsZSBpcyB1cGRhdGVkLiAqLwogCSNpZiggcG9ydFVTSU5HX01QVV9XUkFQUEVSUyA9PSAxICkKIAl7Ci0JCXB4TmV3VENCLT5weFRvcE9mU3RhY2sgPSBweFBvcnRJbml0aWFsaXNlU3RhY2soIHB4VG9wT2ZTdGFjaywgcHhUYXNrQ29kZSwgcHZQYXJhbWV0ZXJzLCB4UnVuUHJpdmlsZWdlZCApOworCQkvKiBJZiB0aGUgcG9ydCBoYXMgY2FwYWJpbGl0eSB0byBkZXRlY3Qgc3RhY2sgb3ZlcmZsb3csCisJCXBhc3MgdGhlIHN0YWNrIGVuZCBhZGRyZXNzIHRvIHRoZSBzdGFjayBpbml0aWFsaXphdGlvbgorCQlmdW5jdGlvbiBhcyB3ZWxsLiAqLworCQkjaWYoIHBvcnRIQVNfU1RBQ0tfT1ZFUkZMT1dfQ0hFQ0tJTkcgPT0gMSApCisJCXsKKwkJCSNpZiggcG9ydFNUQUNLX0dST1dUSCA8IDAgKQorCQkJeworCQkJCXB4TmV3VENCLT5weFRvcE9mU3RhY2sgPSBweFBvcnRJbml0aWFsaXNlU3RhY2soIHB4VG9wT2ZTdGFjaywgcHhOZXdUQ0ItPnB4U3RhY2ssIHB4VGFza0NvZGUsIHB2UGFyYW1ldGVycywgeFJ1blByaXZpbGVnZWQgKTsKKwkJCX0KKwkJCSNlbHNlIC8qIHBvcnRTVEFDS19HUk9XVEggKi8KKwkJCXsKKwkJCQlweE5ld1RDQi0+cHhUb3BPZlN0YWNrID0gcHhQb3J0SW5pdGlhbGlzZVN0YWNrKCBweFRvcE9mU3RhY2ssIHB4TmV3VENCLT5weEVuZE9mU3RhY2ssIHB4VGFza0NvZGUsIHB2UGFyYW1ldGVycywgeFJ1blByaXZpbGVnZWQgKTsKKwkJCX0KKwkJCSNlbmRpZiAvKiBwb3J0U1RBQ0tfR1JPV1RIICovCisJCX0KKwkJI2Vsc2UgLyogcG9ydEhBU19TVEFDS19PVkVSRkxPV19DSEVDS0lORyAqLworCQl7CisJCQlweE5ld1RDQi0+cHhUb3BPZlN0YWNrID0gcHhQb3J0SW5pdGlhbGlzZVN0YWNrKCBweFRvcE9mU3RhY2ssIHB4VGFza0NvZGUsIHB2UGFyYW1ldGVycywgeFJ1blByaXZpbGVnZWQgKTsKKwkJfQorCQkjZW5kaWYgLyogcG9ydEhBU19TVEFDS19PVkVSRkxPV19DSEVDS0lORyAqLwogCX0KIAkjZWxzZSAvKiBwb3J0VVNJTkdfTVBVX1dSQVBQRVJTICovCiAJewotCQlweE5ld1RDQi0+cHhUb3BPZlN0YWNrID0gcHhQb3J0SW5pdGlhbGlzZVN0YWNrKCBweFRvcE9mU3RhY2ssIHB4VGFza0NvZGUsIHB2UGFyYW1ldGVycyApOworCQkvKiBJZiB0aGUgcG9ydCBoYXMgY2FwYWJpbGl0eSB0byBkZXRlY3Qgc3RhY2sgb3ZlcmZsb3csCisJCXBhc3MgdGhlIHN0YWNrIGVuZCBhZGRyZXNzIHRvIHRoZSBzdGFjayBpbml0aWFsaXphdGlvbgorCQlmdW5jdGlvbiBhcyB3ZWxsLiAqLworCQkjaWYoIHBvcnRIQVNfU1RBQ0tfT1ZFUkZMT1dfQ0hFQ0tJTkcgPT0gMSApCisJCXsKKwkJCSNpZiggcG9ydFNUQUNLX0dST1dUSCA8IDAgKQorCQkJeworCQkJCXB4TmV3VENCLT5weFRvcE9mU3RhY2sgPSBweFBvcnRJbml0aWFsaXNlU3RhY2soIHB4VG9wT2ZTdGFjaywgcHhOZXdUQ0ItPnB4U3RhY2ssIHB4VGFza0NvZGUsIHB2UGFyYW1ldGVycyApOworCQkJfQorCQkJI2Vsc2UgLyogcG9ydFNUQUNLX0dST1dUSCAqLworCQkJeworCQkJCXB4TmV3VENCLT5weFRvcE9mU3RhY2sgPSBweFBvcnRJbml0aWFsaXNlU3RhY2soIHB4VG9wT2ZTdGFjaywgcHhOZXdUQ0ItPnB4RW5kT2ZTdGFjaywgcHhUYXNrQ29kZSwgcHZQYXJhbWV0ZXJzICk7CisJCQl9CisJCQkjZW5kaWYgLyogcG9ydFNUQUNLX0dST1dUSCAqLworCQl9CisJCSNlbHNlIC8qIHBvcnRIQVNfU1RBQ0tfT1ZFUkZMT1dfQ0hFQ0tJTkcgKi8KKwkJeworCQkJcHhOZXdUQ0ItPnB4VG9wT2ZTdGFjayA9IHB4UG9ydEluaXRpYWxpc2VTdGFjayggcHhUb3BPZlN0YWNrLCBweFRhc2tDb2RlLCBwdlBhcmFtZXRlcnMgKTsKKwkJfQorCQkjZW5kaWYgLyogcG9ydEhBU19TVEFDS19PVkVSRkxPV19DSEVDS0lORyAqLwogCX0KIAkjZW5kaWYgLyogcG9ydFVTSU5HX01QVV9XUkFQUEVSUyAqLwogCi0JaWYoICggdm9pZCAqICkgcHhDcmVhdGVkVGFzayAhPSBOVUxMICkKKwlpZiggcHhDcmVhdGVkVGFzayAhPSBOVUxMICkKIAl7CiAJCS8qIFBhc3MgdGhlIGhhbmRsZSBvdXQgaW4gYW4gYW5vbnltb3VzIHdheS4gIFRoZSBoYW5kbGUgY2FuIGJlIHVzZWQgdG8KIAkJY2hhbmdlIHRoZSBjcmVhdGVkIHRhc2sncyBwcmlvcml0eSwgZGVsZXRlIHRoZSBjcmVhdGVkIHRhc2ssIGV0Yy4qLwpAQCAtMTMyMiwxMyArMTM3MywxMyBAQAogI2VuZGlmIC8qIElOQ0xVREVfdlRhc2tEZWxheSAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLSNpZiggKCBJTkNMVURFX2VUYXNrR2V0U3RhdGUgPT0gMSApIHx8ICggY29uZmlnVVNFX1RSQUNFX0ZBQ0lMSVRZID09IDEgKSApCisjaWYoICggSU5DTFVERV9lVGFza0dldFN0YXRlID09IDEgKSB8fCAoIGNvbmZpZ1VTRV9UUkFDRV9GQUNJTElUWSA9PSAxICkgfHwgKCBJTkNMVURFX3hUYXNrQWJvcnREZWxheSA9PSAxICkgKQogCiAJZVRhc2tTdGF0ZSBlVGFza0dldFN0YXRlKCBUYXNrSGFuZGxlX3QgeFRhc2sgKQogCXsKIAllVGFza1N0YXRlIGVSZXR1cm47Ci0JTGlzdF90ICpweFN0YXRlTGlzdDsKLQljb25zdCBUQ0JfdCAqIGNvbnN0IHB4VENCID0gKCBUQ0JfdCAqICkgeFRhc2s7CisJTGlzdF90IGNvbnN0ICogcHhTdGF0ZUxpc3QsICpweERlbGF5ZWRMaXN0LCAqcHhPdmVyZmxvd2VkRGVsYXllZExpc3Q7CisJY29uc3QgVENCX3QgKiBjb25zdCBweFRDQiA9IHhUYXNrOwogCiAJCWNvbmZpZ0FTU0VSVCggcHhUQ0IgKTsKIApAQCAtMTM0MSwxMSArMTM5MiwxMyBAQAogCQl7CiAJCQl0YXNrRU5URVJfQ1JJVElDQUwoKTsKIAkJCXsKLQkJCQlweFN0YXRlTGlzdCA9ICggTGlzdF90ICogKSBsaXN0TElTVF9JVEVNX0NPTlRBSU5FUiggJiggcHhUQ0ItPnhTdGF0ZUxpc3RJdGVtICkgKTsKKwkJCQlweFN0YXRlTGlzdCA9IGxpc3RMSVNUX0lURU1fQ09OVEFJTkVSKCAmKCBweFRDQi0+eFN0YXRlTGlzdEl0ZW0gKSApOworCQkJCXB4RGVsYXllZExpc3QgPSBweERlbGF5ZWRUYXNrTGlzdDsKKwkJCQlweE92ZXJmbG93ZWREZWxheWVkTGlzdCA9IHB4T3ZlcmZsb3dEZWxheWVkVGFza0xpc3Q7CiAJCQl9CiAJCQl0YXNrRVhJVF9DUklUSUNBTCgpOwogCi0JCQlpZiggKCBweFN0YXRlTGlzdCA9PSBweERlbGF5ZWRUYXNrTGlzdCApIHx8ICggcHhTdGF0ZUxpc3QgPT0gcHhPdmVyZmxvd0RlbGF5ZWRUYXNrTGlzdCApICkKKwkJCWlmKCAoIHB4U3RhdGVMaXN0ID09IHB4RGVsYXllZExpc3QgKSB8fCAoIHB4U3RhdGVMaXN0ID09IHB4T3ZlcmZsb3dlZERlbGF5ZWRMaXN0ICkgKQogCQkJewogCQkJCS8qIFRoZSB0YXNrIGJlaW5nIHF1ZXJpZWQgaXMgcmVmZXJlbmNlZCBmcm9tIG9uZSBvZiB0aGUgQmxvY2tlZAogCQkJCWxpc3RzLiAqLwpAQCAtMTM1NiwxMSArMTQwOSwzMCBAQAogCQkJCWVsc2UgaWYoIHB4U3RhdGVMaXN0ID09ICZ4U3VzcGVuZGVkVGFza0xpc3QgKQogCQkJCXsKIAkJCQkJLyogVGhlIHRhc2sgYmVpbmcgcXVlcmllZCBpcyByZWZlcmVuY2VkIGZyb20gdGhlIHN1c3BlbmRlZAotCQkJCQlsaXN0LiAgSXMgaXQgZ2VudWluZWx5IHN1c3BlbmRlZCBvciBpcyBpdCBibG9jaworCQkJCQlsaXN0LiAgSXMgaXQgZ2VudWluZWx5IHN1c3BlbmRlZCBvciBpcyBpdCBibG9ja2VkCiAJCQkJCWluZGVmaW5pdGVseT8gKi8KIAkJCQkJaWYoIGxpc3RMSVNUX0lURU1fQ09OVEFJTkVSKCAmKCBweFRDQi0+eEV2ZW50TGlzdEl0ZW0gKSApID09IE5VTEwgKQogCQkJCQl7Ci0JCQkJCQllUmV0dXJuID0gZVN1c3BlbmRlZDsKKwkJCQkJCSNpZiggY29uZmlnVVNFX1RBU0tfTk9USUZJQ0FUSU9OUyA9PSAxICkKKwkJCQkJCXsKKwkJCQkJCQkvKiBUaGUgdGFzayBkb2VzIG5vdCBhcHBlYXIgb24gdGhlIGV2ZW50IGxpc3QgaXRlbSBvZgorCQkJCQkJCWFuZCBvZiB0aGUgUlRPUyBvYmplY3RzLCBidXQgY291bGQgc3RpbGwgYmUgaW4gdGhlCisJCQkJCQkJYmxvY2tlZCBzdGF0ZSBpZiBpdCBpcyB3YWl0aW5nIG9uIGl0cyBub3RpZmljYXRpb24KKwkJCQkJCQlyYXRoZXIgdGhhbiB3YWl0aW5nIG9uIGFuIG9iamVjdC4gKi8KKwkJCQkJCQlpZiggcHhUQ0ItPnVjTm90aWZ5U3RhdGUgPT0gdGFza1dBSVRJTkdfTk9USUZJQ0FUSU9OICkKKwkJCQkJCQl7CisJCQkJCQkJCWVSZXR1cm4gPSBlQmxvY2tlZDsKKwkJCQkJCQl9CisJCQkJCQkJZWxzZQorCQkJCQkJCXsKKwkJCQkJCQkJZVJldHVybiA9IGVTdXNwZW5kZWQ7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJI2Vsc2UKKwkJCQkJCXsKKwkJCQkJCQllUmV0dXJuID0gZVN1c3BlbmRlZDsKKwkJCQkJCX0KKwkJCQkJCSNlbmRpZgogCQkJCQl9CiAJCQkJCWVsc2UKIAkJCQkJewpAQCAtMTM5NSwxNSArMTQ2NywxNSBAQAogCiAjaWYgKCBJTkNMVURFX3V4VGFza1ByaW9yaXR5R2V0ID09IDEgKQogCi0JVUJhc2VUeXBlX3QgdXhUYXNrUHJpb3JpdHlHZXQoIFRhc2tIYW5kbGVfdCB4VGFzayApCisJVUJhc2VUeXBlX3QgdXhUYXNrUHJpb3JpdHlHZXQoIGNvbnN0IFRhc2tIYW5kbGVfdCB4VGFzayApCiAJewotCVRDQl90ICpweFRDQjsKKwlUQ0JfdCBjb25zdCAqcHhUQ0I7CiAJVUJhc2VUeXBlX3QgdXhSZXR1cm47CiAKIAkJdGFza0VOVEVSX0NSSVRJQ0FMKCk7CiAJCXsKLQkJCS8qIElmIG51bGwgaXMgcGFzc2VkIGluIGhlcmUgdGhlbiBpdCBpcyB0aGUgcHJpb3JpdHkgb2YgdGhlIHRoYXQKLQkJCWNhbGxlZCB1eFRhc2tQcmlvcml0eUdldCgpIHRoYXQgaXMgYmVpbmcgcXVlcmllZC4gKi8KKwkJCS8qIElmIG51bGwgaXMgcGFzc2VkIGluIGhlcmUgdGhlbiBpdCBpcyB0aGUgcHJpb3JpdHkgb2YgdGhlIHRhc2sKKwkJCXRoYXQgY2FsbGVkIHV4VGFza1ByaW9yaXR5R2V0KCkgdGhhdCBpcyBiZWluZyBxdWVyaWVkLiAqLwogCQkJcHhUQ0IgPSBwcnZHZXRUQ0JGcm9tSGFuZGxlKCB4VGFzayApOwogCQkJdXhSZXR1cm4gPSBweFRDQi0+dXhQcmlvcml0eTsKIAkJfQpAQCAtMTQxNyw5ICsxNDg5LDkgQEAKIAogI2lmICggSU5DTFVERV91eFRhc2tQcmlvcml0eUdldCA9PSAxICkKIAotCVVCYXNlVHlwZV90IHV4VGFza1ByaW9yaXR5R2V0RnJvbUlTUiggVGFza0hhbmRsZV90IHhUYXNrICkKKwlVQmFzZVR5cGVfdCB1eFRhc2tQcmlvcml0eUdldEZyb21JU1IoIGNvbnN0IFRhc2tIYW5kbGVfdCB4VGFzayApCiAJewotCVRDQl90ICpweFRDQjsKKwlUQ0JfdCBjb25zdCAqcHhUQ0I7CiAJVUJhc2VUeXBlX3QgdXhSZXR1cm4sIHV4U2F2ZWRJbnRlcnJ1cHRTdGF0ZTsKIAogCQkvKiBSVE9TIHBvcnRzIHRoYXQgc3VwcG9ydCBpbnRlcnJ1cHQgbmVzdGluZyBoYXZlIHRoZSBjb25jZXB0IG9mIGEKQEAgLTE0MzcsNyArMTUwOSw3IEBACiAJCXNlcGFyYXRlIGludGVycnVwdCBzYWZlIEFQSSB0byBlbnN1cmUgaW50ZXJydXB0IGVudHJ5IGlzIGFzIGZhc3QgYW5kIGFzCiAJCXNpbXBsZSBhcyBwb3NzaWJsZS4gIE1vcmUgaW5mb3JtYXRpb24gKGFsYmVpdCBDb3J0ZXgtTSBzcGVjaWZpYykgaXMKIAkJcHJvdmlkZWQgb24gdGhlIGZvbGxvd2luZyBsaW5rOgotCQlodHRwOi8vd3d3LmZyZWVydG9zLm9yZy9SVE9TLUNvcnRleC1NMy1NNC5odG1sICovCisJCWh0dHBzOi8vd3d3LmZyZWVydG9zLm9yZy9SVE9TLUNvcnRleC1NMy1NNC5odG1sICovCiAJCXBvcnRBU1NFUlRfSUZfSU5URVJSVVBUX1BSSU9SSVRZX0lOVkFMSUQoKTsKIAogCQl1eFNhdmVkSW50ZXJydXB0U3RhdGUgPSBwb3J0U0VUX0lOVEVSUlVQVF9NQVNLX0ZST01fSVNSKCk7CkBAIC0xNjk3LDcgKzE3NjksNyBAQAogCQkJCS8qIFRoZSBzY2hlZHVsZXIgaXMgbm90IHJ1bm5pbmcsIGJ1dCB0aGUgdGFzayB0aGF0IHdhcyBwb2ludGVkCiAJCQkJdG8gYnkgcHhDdXJyZW50VENCIGhhcyBqdXN0IGJlZW4gc3VzcGVuZGVkIGFuZCBweEN1cnJlbnRUQ0IKIAkJCQltdXN0IGJlIGFkanVzdGVkIHRvIHBvaW50IHRvIGEgZGlmZmVyZW50IHRhc2suICovCi0JCQkJaWYoIGxpc3RDVVJSRU5UX0xJU1RfTEVOR1RIKCAmeFN1c3BlbmRlZFRhc2tMaXN0ICkgPT0gdXhDdXJyZW50TnVtYmVyT2ZUYXNrcyApCisJCQkJaWYoIGxpc3RDVVJSRU5UX0xJU1RfTEVOR1RIKCAmeFN1c3BlbmRlZFRhc2tMaXN0ICkgPT0gdXhDdXJyZW50TnVtYmVyT2ZUYXNrcyApIC8qbGludCAhZTkzMSBSaWdodCBoYXMgbm8gc2lkZSBlZmZlY3QsIGp1c3Qgdm9sYXRpbGUuICovCiAJCQkJewogCQkJCQkvKiBObyBvdGhlciB0YXNrcyBhcmUgcmVhZHksIHNvIHNldCBweEN1cnJlbnRUQ0IgYmFjayB0bwogCQkJCQlOVUxMIHNvIHdoZW4gdGhlIG5leHQgdGFzayBpcyBjcmVhdGVkIHB4Q3VycmVudFRDQiB3aWxsCkBAIC0xNzI1LDcgKzE3OTcsNyBAQAogCXN0YXRpYyBCYXNlVHlwZV90IHBydlRhc2tJc1Rhc2tTdXNwZW5kZWQoIGNvbnN0IFRhc2tIYW5kbGVfdCB4VGFzayApCiAJewogCUJhc2VUeXBlX3QgeFJldHVybiA9IHBkRkFMU0U7Ci0JY29uc3QgVENCX3QgKiBjb25zdCBweFRDQiA9ICggVENCX3QgKiApIHhUYXNrOworCWNvbnN0IFRDQl90ICogY29uc3QgcHhUQ0IgPSB4VGFzazsKIAogCQkvKiBBY2Nlc3NlcyB4UGVuZGluZ1JlYWR5TGlzdCBzbyBtdXN0IGJlIGNhbGxlZCBmcm9tIGEgY3JpdGljYWwKIAkJc2VjdGlvbi4gKi8KQEAgLTE3NzAsMTQgKzE4NDIsMTQgQEAKIAogCXZvaWQgdlRhc2tSZXN1bWUoIFRhc2tIYW5kbGVfdCB4VGFza1RvUmVzdW1lICkKIAl7Ci0JVENCX3QgKiBjb25zdCBweFRDQiA9ICggVENCX3QgKiApIHhUYXNrVG9SZXN1bWU7CisJVENCX3QgKiBjb25zdCBweFRDQiA9IHhUYXNrVG9SZXN1bWU7CiAKIAkJLyogSXQgZG9lcyBub3QgbWFrZSBzZW5zZSB0byByZXN1bWUgdGhlIGNhbGxpbmcgdGFzay4gKi8KIAkJY29uZmlnQVNTRVJUKCB4VGFza1RvUmVzdW1lICk7CiAKIAkJLyogVGhlIHBhcmFtZXRlciBjYW5ub3QgYmUgTlVMTCBhcyBpdCBpcyBpbXBvc3NpYmxlIHRvIHJlc3VtZSB0aGUKIAkJY3VycmVudGx5IGV4ZWN1dGluZyB0YXNrLiAqLwotCQlpZiggKCBweFRDQiAhPSBOVUxMICkgJiYgKCBweFRDQiAhPSBweEN1cnJlbnRUQ0IgKSApCisJCWlmKCAoIHB4VENCICE9IHB4Q3VycmVudFRDQiApICYmICggcHhUQ0IgIT0gTlVMTCApICkKIAkJewogCQkJdGFza0VOVEVSX0NSSVRJQ0FMKCk7CiAJCQl7CkBAIC0xODI1LDcgKzE4OTcsNyBAQAogCUJhc2VUeXBlX3QgeFRhc2tSZXN1bWVGcm9tSVNSKCBUYXNrSGFuZGxlX3QgeFRhc2tUb1Jlc3VtZSApCiAJewogCUJhc2VUeXBlX3QgeFlpZWxkUmVxdWlyZWQgPSBwZEZBTFNFOwotCVRDQl90ICogY29uc3QgcHhUQ0IgPSAoIFRDQl90ICogKSB4VGFza1RvUmVzdW1lOworCVRDQl90ICogY29uc3QgcHhUQ0IgPSB4VGFza1RvUmVzdW1lOwogCVVCYXNlVHlwZV90IHV4U2F2ZWRJbnRlcnJ1cHRTdGF0dXM7CiAKIAkJY29uZmlnQVNTRVJUKCB4VGFza1RvUmVzdW1lICk7CkBAIC0xODQ1LDcgKzE5MTcsNyBAQAogCQlzZXBhcmF0ZSBpbnRlcnJ1cHQgc2FmZSBBUEkgdG8gZW5zdXJlIGludGVycnVwdCBlbnRyeSBpcyBhcyBmYXN0IGFuZCBhcwogCQlzaW1wbGUgYXMgcG9zc2libGUuICBNb3JlIGluZm9ybWF0aW9uIChhbGJlaXQgQ29ydGV4LU0gc3BlY2lmaWMpIGlzCiAJCXByb3ZpZGVkIG9uIHRoZSBmb2xsb3dpbmcgbGluazoKLQkJaHR0cDovL3d3dy5mcmVlcnRvcy5vcmcvUlRPUy1Db3J0ZXgtTTMtTTQuaHRtbCAqLworCQlodHRwczovL3d3dy5mcmVlcnRvcy5vcmcvUlRPUy1Db3J0ZXgtTTMtTTQuaHRtbCAqLwogCQlwb3J0QVNTRVJUX0lGX0lOVEVSUlVQVF9QUklPUklUWV9JTlZBTElEKCk7CiAKIAkJdXhTYXZlZEludGVycnVwdFN0YXR1cyA9IHBvcnRTRVRfSU5URVJSVVBUX01BU0tfRlJPTV9JU1IoKTsKQEAgLTE5MTAsNyArMTk4Miw3IEBACiAJCQkJCQkJCQkJCQljb25maWdJRExFX1RBU0tfTkFNRSwKIAkJCQkJCQkJCQkJCXVsSWRsZVRhc2tTdGFja1NpemUsCiAJCQkJCQkJCQkJCQkoIHZvaWQgKiApIE5VTEwsIC8qbGludCAhZTk2MS4gIFRoZSBjYXN0IGlzIG5vdCByZWR1bmRhbnQgZm9yIGFsbCBjb21waWxlcnMuICovCi0JCQkJCQkJCQkJCQkoIHRza0lETEVfUFJJT1JJVFkgfCBwb3J0UFJJVklMRUdFX0JJVCApLAorCQkJCQkJCQkJCQkJcG9ydFBSSVZJTEVHRV9CSVQsIC8qIEluIGVmZmVjdCAoIHRza0lETEVfUFJJT1JJVFkgfCBwb3J0UFJJVklMRUdFX0JJVCApLCBidXQgdHNrSURMRV9QUklPUklUWSBpcyB6ZXJvLiAqLwogCQkJCQkJCQkJCQkJcHhJZGxlVGFza1N0YWNrQnVmZmVyLAogCQkJCQkJCQkJCQkJcHhJZGxlVGFza1RDQkJ1ZmZlciApOyAvKmxpbnQgIWU5NjEgTUlTUkEgZXhjZXB0aW9uLCBqdXN0aWZpZWQgYXMgaXQgaXMgbm90IGEgcmVkdW5kYW50IGV4cGxpY2l0IGNhc3QgdG8gYWxsIHN1cHBvcnRlZCBjb21waWxlcnMuICovCiAKQEAgLTE5MzAsNyArMjAwMiw3IEBACiAJCQkJCQkJCWNvbmZpZ0lETEVfVEFTS19OQU1FLAogCQkJCQkJCQljb25maWdNSU5JTUFMX1NUQUNLX1NJWkUsCiAJCQkJCQkJCSggdm9pZCAqICkgTlVMTCwKLQkJCQkJCQkJKCB0c2tJRExFX1BSSU9SSVRZIHwgcG9ydFBSSVZJTEVHRV9CSVQgKSwKKwkJCQkJCQkJcG9ydFBSSVZJTEVHRV9CSVQsIC8qIEluIGVmZmVjdCAoIHRza0lETEVfUFJJT1JJVFkgfCBwb3J0UFJJVklMRUdFX0JJVCApLCBidXQgdHNrSURMRV9QUklPUklUWSBpcyB6ZXJvLiAqLwogCQkJCQkJCQkmeElkbGVUYXNrSGFuZGxlICk7IC8qbGludCAhZTk2MSBNSVNSQSBleGNlcHRpb24sIGp1c3RpZmllZCBhcyBpdCBpcyBub3QgYSByZWR1bmRhbnQgZXhwbGljaXQgY2FzdCB0byBhbGwgc3VwcG9ydGVkIGNvbXBpbGVycy4gKi8KIAl9CiAJI2VuZGlmIC8qIGNvbmZpZ1NVUFBPUlRfU1RBVElDX0FMTE9DQVRJT04gKi8KQEAgLTE5NzYsNyArMjA0OCw3IEBACiAKIAkJeE5leHRUYXNrVW5ibG9ja1RpbWUgPSBwb3J0TUFYX0RFTEFZOwogCQl4U2NoZWR1bGVyUnVubmluZyA9IHBkVFJVRTsKLQkJeFRpY2tDb3VudCA9ICggVGlja1R5cGVfdCApIDBVOworCQl4VGlja0NvdW50ID0gKCBUaWNrVHlwZV90ICkgY29uZmlnSU5JVElBTF9USUNLX0NPVU5UOwogCiAJCS8qIElmIGNvbmZpZ0dFTkVSQVRFX1JVTl9USU1FX1NUQVRTIGlzIGRlZmluZWQgdGhlbiB0aGUgZm9sbG93aW5nCiAJCW1hY3JvIG11c3QgYmUgZGVmaW5lZCB0byBjb25maWd1cmUgdGhlIHRpbWVyL2NvdW50ZXIgdXNlZCB0byBnZW5lcmF0ZQpAQCAtMTk4Niw2ICsyMDU4LDggQEAKIAkJRnJlZVJUT1NDb25maWcuaCBmaWxlLiAqLwogCQlwb3J0Q09ORklHVVJFX1RJTUVSX0ZPUl9SVU5fVElNRV9TVEFUUygpOwogCisJCXRyYWNlVEFTS19TV0lUQ0hFRF9JTigpOworCiAJCS8qIFNldHRpbmcgdXAgdGhlIHRpbWVyIHRpY2sgaXMgaGFyZHdhcmUgc3BlY2lmaWMgYW5kIHRodXMgaW4gdGhlCiAJCXBvcnRhYmxlIGludGVyZmFjZS4gKi8KIAkJaWYoIHhQb3J0U3RhcnRTY2hlZHVsZXIoKSAhPSBwZEZBTFNFICkKQEAgLTIwMzAsNiArMjEwNCw3IEBACiAJcG9zdCBpbiB0aGUgRnJlZVJUT1Mgc3VwcG9ydCBmb3J1bSBiZWZvcmUgcmVwb3J0aW5nIHRoaXMgYXMgYSBidWchIC0KIAlodHRwOi8vZ29vLmdsL3d1NGFjciAqLwogCSsrdXhTY2hlZHVsZXJTdXNwZW5kZWQ7CisJcG9ydE1FTU9SWV9CQVJSSUVSKCk7CiB9CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCkBAIC0yMTIyLDcgKzIxOTcsNyBAQAogCQkJCWFwcHJvcHJpYXRlIHJlYWR5IGxpc3QuICovCiAJCQkJd2hpbGUoIGxpc3RMSVNUX0lTX0VNUFRZKCAmeFBlbmRpbmdSZWFkeUxpc3QgKSA9PSBwZEZBTFNFICkKIAkJCQl7Ci0JCQkJCXB4VENCID0gKCBUQ0JfdCAqICkgbGlzdEdFVF9PV05FUl9PRl9IRUFEX0VOVFJZKCAoICZ4UGVuZGluZ1JlYWR5TGlzdCApICk7CisJCQkJCXB4VENCID0gbGlzdEdFVF9PV05FUl9PRl9IRUFEX0VOVFJZKCAoICZ4UGVuZGluZ1JlYWR5TGlzdCApICk7IC8qbGludCAhZTkwNzkgdm9pZCAqIGlzIHVzZWQgYXMgdGhpcyBtYWNybyBpcyB1c2VkIHdpdGggdGltZXJzIGFuZCBjby1yb3V0aW5lcyB0b28uICBBbGlnbm1lbnQgaXMga25vd24gdG8gYmUgZmluZSBhcyB0aGUgdHlwZSBvZiB0aGUgcG9pbnRlciBzdG9yZWQgYW5kIHJldHJpZXZlZCBpcyB0aGUgc2FtZS4gKi8KIAkJCQkJKCB2b2lkICkgdXhMaXN0UmVtb3ZlKCAmKCBweFRDQi0+eEV2ZW50TGlzdEl0ZW0gKSApOwogCQkJCQkoIHZvaWQgKSB1eExpc3RSZW1vdmUoICYoIHB4VENCLT54U3RhdGVMaXN0SXRlbSApICk7CiAJCQkJCXBydkFkZFRhc2tUb1JlYWR5TGlzdCggcHhUQ0IgKTsKQEAgLTIyMzksNyArMjMxNCw3IEBACiAJc3lzdGVtIGNhbGwJaW50ZXJydXB0IHByaW9yaXR5LiAgRnJlZVJUT1MgbWFpbnRhaW5zIGEgc2VwYXJhdGUgaW50ZXJydXB0CiAJc2FmZSBBUEkgdG8gZW5zdXJlIGludGVycnVwdCBlbnRyeSBpcyBhcyBmYXN0IGFuZCBhcyBzaW1wbGUgYXMgcG9zc2libGUuCiAJTW9yZSBpbmZvcm1hdGlvbiAoYWxiZWl0IENvcnRleC1NIHNwZWNpZmljKSBpcyBwcm92aWRlZCBvbiB0aGUgZm9sbG93aW5nCi0JbGluazogaHR0cDovL3d3dy5mcmVlcnRvcy5vcmcvUlRPUy1Db3J0ZXgtTTMtTTQuaHRtbCAqLworCWxpbms6IGh0dHBzOi8vd3d3LmZyZWVydG9zLm9yZy9SVE9TLUNvcnRleC1NMy1NNC5odG1sICovCiAJcG9ydEFTU0VSVF9JRl9JTlRFUlJVUFRfUFJJT1JJVFlfSU5WQUxJRCgpOwogCiAJdXhTYXZlZEludGVycnVwdFN0YXR1cyA9IHBvcnRUSUNLX1RZUEVfU0VUX0lOVEVSUlVQVF9NQVNLX0ZST01fSVNSKCk7CkBAIC0yMjc5LDE5ICsyMzU0LDIxIEBACiAJVENCX3QgKnB4TmV4dFRDQiwgKnB4Rmlyc3RUQ0IsICpweFJldHVybiA9IE5VTEw7CiAJVUJhc2VUeXBlX3QgeDsKIAljaGFyIGNOZXh0Q2hhcjsKKwlCYXNlVHlwZV90IHhCcmVha0xvb3A7CiAKIAkJLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCB0aGUgc2NoZWR1bGVyIHN1c3BlbmRlZC4gKi8KIAogCQlpZiggbGlzdENVUlJFTlRfTElTVF9MRU5HVEgoIHB4TGlzdCApID4gKCBVQmFzZVR5cGVfdCApIDAgKQogCQl7Ci0JCQlsaXN0R0VUX09XTkVSX09GX05FWFRfRU5UUlkoIHB4Rmlyc3RUQ0IsIHB4TGlzdCApOworCQkJbGlzdEdFVF9PV05FUl9PRl9ORVhUX0VOVFJZKCBweEZpcnN0VENCLCBweExpc3QgKTsgIC8qbGludCAhZTkwNzkgdm9pZCAqIGlzIHVzZWQgYXMgdGhpcyBtYWNybyBpcyB1c2VkIHdpdGggdGltZXJzIGFuZCBjby1yb3V0aW5lcyB0b28uICBBbGlnbm1lbnQgaXMga25vd24gdG8gYmUgZmluZSBhcyB0aGUgdHlwZSBvZiB0aGUgcG9pbnRlciBzdG9yZWQgYW5kIHJldHJpZXZlZCBpcyB0aGUgc2FtZS4gKi8KIAogCQkJZG8KIAkJCXsKLQkJCQlsaXN0R0VUX09XTkVSX09GX05FWFRfRU5UUlkoIHB4TmV4dFRDQiwgcHhMaXN0ICk7CisJCQkJbGlzdEdFVF9PV05FUl9PRl9ORVhUX0VOVFJZKCBweE5leHRUQ0IsIHB4TGlzdCApOyAvKmxpbnQgIWU5MDc5IHZvaWQgKiBpcyB1c2VkIGFzIHRoaXMgbWFjcm8gaXMgdXNlZCB3aXRoIHRpbWVycyBhbmQgY28tcm91dGluZXMgdG9vLiAgQWxpZ25tZW50IGlzIGtub3duIHRvIGJlIGZpbmUgYXMgdGhlIHR5cGUgb2YgdGhlIHBvaW50ZXIgc3RvcmVkIGFuZCByZXRyaWV2ZWQgaXMgdGhlIHNhbWUuICovCiAKIAkJCQkvKiBDaGVjayBlYWNoIGNoYXJhY3RlciBpbiB0aGUgbmFtZSBsb29raW5nIGZvciBhIG1hdGNoIG9yCiAJCQkJbWlzbWF0Y2guICovCisJCQkJeEJyZWFrTG9vcCA9IHBkRkFMU0U7CiAJCQkJZm9yKCB4ID0gKCBVQmFzZVR5cGVfdCApIDA7IHggPCAoIFVCYXNlVHlwZV90ICkgY29uZmlnTUFYX1RBU0tfTkFNRV9MRU47IHgrKyApCiAJCQkJewogCQkJCQljTmV4dENoYXIgPSBweE5leHRUQ0ItPnBjVGFza05hbWVbIHggXTsKQEAgLTIyOTksMTkgKzIzNzYsMjQgQEAKIAkJCQkJaWYoIGNOZXh0Q2hhciAhPSBwY05hbWVUb1F1ZXJ5WyB4IF0gKQogCQkJCQl7CiAJCQkJCQkvKiBDaGFyYWN0ZXJzIGRpZG4ndCBtYXRjaC4gKi8KLQkJCQkJCWJyZWFrOworCQkJCQkJeEJyZWFrTG9vcCA9IHBkVFJVRTsKIAkJCQkJfQotCQkJCQllbHNlIGlmKCBjTmV4dENoYXIgPT0gMHgwMCApCisJCQkJCWVsc2UgaWYoIGNOZXh0Q2hhciA9PSAoIGNoYXIgKSAweDAwICkKIAkJCQkJewogCQkJCQkJLyogQm90aCBzdHJpbmdzIHRlcm1pbmF0ZWQsIGEgbWF0Y2ggbXVzdCBoYXZlIGJlZW4KIAkJCQkJCWZvdW5kLiAqLwogCQkJCQkJcHhSZXR1cm4gPSBweE5leHRUQ0I7Ci0JCQkJCQlicmVhazsKKwkJCQkJCXhCcmVha0xvb3AgPSBwZFRSVUU7CiAJCQkJCX0KIAkJCQkJZWxzZQogCQkJCQl7CiAJCQkJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CiAJCQkJCX0KKworCQkJCQlpZiggeEJyZWFrTG9vcCAhPSBwZEZBTFNFICkKKwkJCQkJeworCQkJCQkJYnJlYWs7CisJCQkJCX0KIAkJCQl9CiAKIAkJCQlpZiggcHhSZXR1cm4gIT0gTlVMTCApCkBAIC0yMzkyLDcgKzI0NzQsNyBAQAogCQl9CiAJCSggdm9pZCApIHhUYXNrUmVzdW1lQWxsKCk7CiAKLQkJcmV0dXJuICggVGFza0hhbmRsZV90ICkgcHhUQ0I7CisJCXJldHVybiBweFRDQjsKIAl9CiAKICNlbmRpZiAvKiBJTkNMVURFX3hUYXNrR2V0SGFuZGxlICovCkBAIC0yNTA4LDcgKzI1OTAsNyBAQAogCiAJQmFzZVR5cGVfdCB4VGFza0Fib3J0RGVsYXkoIFRhc2tIYW5kbGVfdCB4VGFzayApCiAJewotCVRDQl90ICpweFRDQiA9ICggVENCX3QgKiApIHhUYXNrOworCVRDQl90ICpweFRDQiA9IHhUYXNrOwogCUJhc2VUeXBlX3QgeFJldHVybjsKIAogCQljb25maWdBU1NFUlQoIHB4VENCICk7CkBAIC0yNjMzLDcgKzI3MTUsNyBAQAogCQkJCQlpdGVtIGF0IHRoZSBoZWFkIG9mIHRoZSBkZWxheWVkIGxpc3QuICBUaGlzIGlzIHRoZSB0aW1lCiAJCQkJCWF0IHdoaWNoIHRoZSB0YXNrIGF0IHRoZSBoZWFkIG9mIHRoZSBkZWxheWVkIGxpc3QgbXVzdAogCQkJCQliZSByZW1vdmVkIGZyb20gdGhlIEJsb2NrZWQgc3RhdGUuICovCi0JCQkJCXB4VENCID0gKCBUQ0JfdCAqICkgbGlzdEdFVF9PV05FUl9PRl9IRUFEX0VOVFJZKCBweERlbGF5ZWRUYXNrTGlzdCApOworCQkJCQlweFRDQiA9IGxpc3RHRVRfT1dORVJfT0ZfSEVBRF9FTlRSWSggcHhEZWxheWVkVGFza0xpc3QgKTsgLypsaW50ICFlOTA3OSB2b2lkICogaXMgdXNlZCBhcyB0aGlzIG1hY3JvIGlzIHVzZWQgd2l0aCB0aW1lcnMgYW5kIGNvLXJvdXRpbmVzIHRvby4gIEFsaWdubWVudCBpcyBrbm93biB0byBiZSBmaW5lIGFzIHRoZSB0eXBlIG9mIHRoZSBwb2ludGVyIHN0b3JlZCBhbmQgcmV0cmlldmVkIGlzIHRoZSBzYW1lLiAqLwogCQkJCQl4SXRlbVZhbHVlID0gbGlzdEdFVF9MSVNUX0lURU1fVkFMVUUoICYoIHB4VENCLT54U3RhdGVMaXN0SXRlbSApICk7CiAKIAkJCQkJaWYoIHhDb25zdFRpY2tDb3VudCA8IHhJdGVtVmFsdWUgKQpAQCAtMjY0NCw3ICsyNzI2LDcgQEAKIAkJCQkJCXN0YXRlIC0Jc28gcmVjb3JkIHRoZSBpdGVtIHZhbHVlIGluCiAJCQkJCQl4TmV4dFRhc2tVbmJsb2NrVGltZS4gKi8KIAkJCQkJCXhOZXh0VGFza1VuYmxvY2tUaW1lID0geEl0ZW1WYWx1ZTsKLQkJCQkJCWJyZWFrOworCQkJCQkJYnJlYWs7IC8qbGludCAhZTkwMTEgQ29kZSBzdHJ1Y3R1cmUgaGVyZSBpcyBkZWVkbWVkIGVhc2llciB0byB1bmRlcnN0YW5kIHdpdGggbXVsdGlwbGUgYnJlYWtzLiAqLwogCQkJCQl9CiAJCQkJCWVsc2UKIAkJCQkJewpAQCAtMjc2NiwxMyArMjg0OCwxNSBAQAogCQl9CiAJCWVsc2UKIAkJewotCQkJeFRDQiA9ICggVENCX3QgKiApIHhUYXNrOworCQkJeFRDQiA9IHhUYXNrOwogCQl9CiAKIAkJLyogU2F2ZSB0aGUgaG9vayBmdW5jdGlvbiBpbiB0aGUgVENCLiAgQSBjcml0aWNhbCBzZWN0aW9uIGlzIHJlcXVpcmVkIGFzCiAJCXRoZSB2YWx1ZSBjYW4gYmUgYWNjZXNzZWQgZnJvbSBhbiBpbnRlcnJ1cHQuICovCiAJCXRhc2tFTlRFUl9DUklUSUNBTCgpOworCQl7CiAJCQl4VENCLT5weFRhc2tUYWcgPSBweEhvb2tGdW5jdGlvbjsKKwkJfQogCQl0YXNrRVhJVF9DUklUSUNBTCgpOwogCX0KIApAQCAtMjc4MywyNCArMjg2NywxNyBAQAogCiAJVGFza0hvb2tGdW5jdGlvbl90IHhUYXNrR2V0QXBwbGljYXRpb25UYXNrVGFnKCBUYXNrSGFuZGxlX3QgeFRhc2sgKQogCXsKLQlUQ0JfdCAqeFRDQjsKKwlUQ0JfdCAqcHhUQ0I7CiAJVGFza0hvb2tGdW5jdGlvbl90IHhSZXR1cm47CiAKLQkJLyogSWYgeFRhc2sgaXMgTlVMTCB0aGVuIHdlIGFyZSBzZXR0aW5nIG91ciBvd24gdGFzayBob29rLiAqLwotCQlpZiggeFRhc2sgPT0gTlVMTCApCi0JCXsKLQkJCXhUQ0IgPSAoIFRDQl90ICogKSBweEN1cnJlbnRUQ0I7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQl4VENCID0gKCBUQ0JfdCAqICkgeFRhc2s7Ci0JCX0KKwkJLyogSWYgeFRhc2sgaXMgTlVMTCB0aGVuIHNldCB0aGUgY2FsbGluZyB0YXNrJ3MgaG9vay4gKi8KKwkJcHhUQ0IgPSBwcnZHZXRUQ0JGcm9tSGFuZGxlKCB4VGFzayApOwogCiAJCS8qIFNhdmUgdGhlIGhvb2sgZnVuY3Rpb24gaW4gdGhlIFRDQi4gIEEgY3JpdGljYWwgc2VjdGlvbiBpcyByZXF1aXJlZCBhcwogCQl0aGUgdmFsdWUgY2FuIGJlIGFjY2Vzc2VkIGZyb20gYW4gaW50ZXJydXB0LiAqLwogCQl0YXNrRU5URVJfQ1JJVElDQUwoKTsKIAkJewotCQkJeFJldHVybiA9IHhUQ0ItPnB4VGFza1RhZzsKKwkJCXhSZXR1cm4gPSBweFRDQi0+cHhUYXNrVGFnOwogCQl9CiAJCXRhc2tFWElUX0NSSVRJQ0FMKCk7CiAKQEAgLTI4MTIsNiArMjg4OSwzMSBAQAogCiAjaWYgKCBjb25maWdVU0VfQVBQTElDQVRJT05fVEFTS19UQUcgPT0gMSApCiAKKwlUYXNrSG9va0Z1bmN0aW9uX3QgeFRhc2tHZXRBcHBsaWNhdGlvblRhc2tUYWdGcm9tSVNSKCBUYXNrSGFuZGxlX3QgeFRhc2sgKQorCXsKKwlUQ0JfdCAqcHhUQ0I7CisJVGFza0hvb2tGdW5jdGlvbl90IHhSZXR1cm47CisJVUJhc2VUeXBlX3QgdXhTYXZlZEludGVycnVwdFN0YXR1czsKKworCQkvKiBJZiB4VGFzayBpcyBOVUxMIHRoZW4gc2V0IHRoZSBjYWxsaW5nIHRhc2sncyBob29rLiAqLworCQlweFRDQiA9IHBydkdldFRDQkZyb21IYW5kbGUoIHhUYXNrICk7CisKKwkJLyogU2F2ZSB0aGUgaG9vayBmdW5jdGlvbiBpbiB0aGUgVENCLiAgQSBjcml0aWNhbCBzZWN0aW9uIGlzIHJlcXVpcmVkIGFzCisJCXRoZSB2YWx1ZSBjYW4gYmUgYWNjZXNzZWQgZnJvbSBhbiBpbnRlcnJ1cHQuICovCisJCXV4U2F2ZWRJbnRlcnJ1cHRTdGF0dXMgPSBwb3J0U0VUX0lOVEVSUlVQVF9NQVNLX0ZST01fSVNSKCk7CisJCXsKKwkJCXhSZXR1cm4gPSBweFRDQi0+cHhUYXNrVGFnOworCQl9CisJCXBvcnRDTEVBUl9JTlRFUlJVUFRfTUFTS19GUk9NX0lTUiggdXhTYXZlZEludGVycnVwdFN0YXR1cyApOworCisJCXJldHVybiB4UmV0dXJuOworCX0KKworI2VuZGlmIC8qIGNvbmZpZ1VTRV9BUFBMSUNBVElPTl9UQVNLX1RBRyAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiAoIGNvbmZpZ1VTRV9BUFBMSUNBVElPTl9UQVNLX1RBRyA9PSAxICkKKwogCUJhc2VUeXBlX3QgeFRhc2tDYWxsQXBwbGljYXRpb25UYXNrSG9vayggVGFza0hhbmRsZV90IHhUYXNrLCB2b2lkICpwdlBhcmFtZXRlciApCiAJewogCVRDQl90ICp4VENCOwpAQCAtMjgyMCwxMSArMjkyMiwxMSBAQAogCQkvKiBJZiB4VGFzayBpcyBOVUxMIHRoZW4gd2UgYXJlIGNhbGxpbmcgb3VyIG93biB0YXNrIGhvb2suICovCiAJCWlmKCB4VGFzayA9PSBOVUxMICkKIAkJewotCQkJeFRDQiA9ICggVENCX3QgKiApIHB4Q3VycmVudFRDQjsKKwkJCXhUQ0IgPSBweEN1cnJlbnRUQ0I7CiAJCX0KIAkJZWxzZQogCQl7Ci0JCQl4VENCID0gKCBUQ0JfdCAqICkgeFRhc2s7CisJCQl4VENCID0geFRhc2s7CiAJCX0KIAogCQlpZiggeFRDQi0+cHhUYXNrVGFnICE9IE5VTEwgKQpAQCAtMjg1NywzOSArMjk1OSw1MyBAQAogCiAJCSNpZiAoIGNvbmZpZ0dFTkVSQVRFX1JVTl9USU1FX1NUQVRTID09IDEgKQogCQl7Ci0JCQkJI2lmZGVmIHBvcnRBTFRfR0VUX1JVTl9USU1FX0NPVU5URVJfVkFMVUUKLQkJCQkJcG9ydEFMVF9HRVRfUlVOX1RJTUVfQ09VTlRFUl9WQUxVRSggdWxUb3RhbFJ1blRpbWUgKTsKLQkJCQkjZWxzZQotCQkJCQl1bFRvdGFsUnVuVGltZSA9IHBvcnRHRVRfUlVOX1RJTUVfQ09VTlRFUl9WQUxVRSgpOwotCQkJCSNlbmRpZgorCQkJI2lmZGVmIHBvcnRBTFRfR0VUX1JVTl9USU1FX0NPVU5URVJfVkFMVUUKKwkJCQlwb3J0QUxUX0dFVF9SVU5fVElNRV9DT1VOVEVSX1ZBTFVFKCB1bFRvdGFsUnVuVGltZSApOworCQkJI2Vsc2UKKwkJCQl1bFRvdGFsUnVuVGltZSA9IHBvcnRHRVRfUlVOX1RJTUVfQ09VTlRFUl9WQUxVRSgpOworCQkJI2VuZGlmCiAKLQkJCQkvKiBBZGQgdGhlIGFtb3VudCBvZiB0aW1lIHRoZSB0YXNrIGhhcyBiZWVuIHJ1bm5pbmcgdG8gdGhlCi0JCQkJYWNjdW11bGF0ZWQgdGltZSBzbyBmYXIuICBUaGUgdGltZSB0aGUgdGFzayBzdGFydGVkIHJ1bm5pbmcgd2FzCi0JCQkJc3RvcmVkIGluIHVsVGFza1N3aXRjaGVkSW5UaW1lLiAgTm90ZSB0aGF0IHRoZXJlIGlzIG5vIG92ZXJmbG93Ci0JCQkJcHJvdGVjdGlvbiBoZXJlIHNvIGNvdW50IHZhbHVlcyBhcmUgb25seSB2YWxpZCB1bnRpbCB0aGUgdGltZXIKLQkJCQlvdmVyZmxvd3MuICBUaGUgZ3VhcmQgYWdhaW5zdCBuZWdhdGl2ZSB2YWx1ZXMgaXMgdG8gcHJvdGVjdAotCQkJCWFnYWluc3Qgc3VzcGVjdCBydW4gdGltZSBzdGF0IGNvdW50ZXIgaW1wbGVtZW50YXRpb25zIC0gd2hpY2gKLQkJCQlhcmUgcHJvdmlkZWQgYnkgdGhlIGFwcGxpY2F0aW9uLCBub3QgdGhlIGtlcm5lbC4gKi8KLQkJCQlpZiggdWxUb3RhbFJ1blRpbWUgPiB1bFRhc2tTd2l0Y2hlZEluVGltZSApCi0JCQkJewotCQkJCQlweEN1cnJlbnRUQ0ItPnVsUnVuVGltZUNvdW50ZXIgKz0gKCB1bFRvdGFsUnVuVGltZSAtIHVsVGFza1N3aXRjaGVkSW5UaW1lICk7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKLQkJCQl9Ci0JCQkJdWxUYXNrU3dpdGNoZWRJblRpbWUgPSB1bFRvdGFsUnVuVGltZTsKKwkJCS8qIEFkZCB0aGUgYW1vdW50IG9mIHRpbWUgdGhlIHRhc2sgaGFzIGJlZW4gcnVubmluZyB0byB0aGUKKwkJCWFjY3VtdWxhdGVkIHRpbWUgc28gZmFyLiAgVGhlIHRpbWUgdGhlIHRhc2sgc3RhcnRlZCBydW5uaW5nIHdhcworCQkJc3RvcmVkIGluIHVsVGFza1N3aXRjaGVkSW5UaW1lLiAgTm90ZSB0aGF0IHRoZXJlIGlzIG5vIG92ZXJmbG93CisJCQlwcm90ZWN0aW9uIGhlcmUgc28gY291bnQgdmFsdWVzIGFyZSBvbmx5IHZhbGlkIHVudGlsIHRoZSB0aW1lcgorCQkJb3ZlcmZsb3dzLiAgVGhlIGd1YXJkIGFnYWluc3QgbmVnYXRpdmUgdmFsdWVzIGlzIHRvIHByb3RlY3QKKwkJCWFnYWluc3Qgc3VzcGVjdCBydW4gdGltZSBzdGF0IGNvdW50ZXIgaW1wbGVtZW50YXRpb25zIC0gd2hpY2gKKwkJCWFyZSBwcm92aWRlZCBieSB0aGUgYXBwbGljYXRpb24sIG5vdCB0aGUga2VybmVsLiAqLworCQkJaWYoIHVsVG90YWxSdW5UaW1lID4gdWxUYXNrU3dpdGNoZWRJblRpbWUgKQorCQkJeworCQkJCXB4Q3VycmVudFRDQi0+dWxSdW5UaW1lQ291bnRlciArPSAoIHVsVG90YWxSdW5UaW1lIC0gdWxUYXNrU3dpdGNoZWRJblRpbWUgKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CisJCQl9CisJCQl1bFRhc2tTd2l0Y2hlZEluVGltZSA9IHVsVG90YWxSdW5UaW1lOwogCQl9CiAJCSNlbmRpZiAvKiBjb25maWdHRU5FUkFURV9SVU5fVElNRV9TVEFUUyAqLwogCiAJCS8qIENoZWNrIGZvciBzdGFjayBvdmVyZmxvdywgaWYgY29uZmlndXJlZC4gKi8KIAkJdGFza0NIRUNLX0ZPUl9TVEFDS19PVkVSRkxPVygpOwogCisJCS8qIEJlZm9yZSB0aGUgY3VycmVudGx5IHJ1bm5pbmcgdGFzayBpcyBzd2l0Y2hlZCBvdXQsIHNhdmUgaXRzIGVycm5vLiAqLworCQkjaWYoIGNvbmZpZ1VTRV9QT1NJWF9FUlJOTyA9PSAxICkKKwkJeworCQkJcHhDdXJyZW50VENCLT5pVGFza0Vycm5vID0gRnJlZVJUT1NfZXJybm87CisJCX0KKwkJI2VuZGlmCisKIAkJLyogU2VsZWN0IGEgbmV3IHRhc2sgdG8gcnVuIHVzaW5nIGVpdGhlciB0aGUgZ2VuZXJpYyBDIG9yIHBvcnQKIAkJb3B0aW1pc2VkIGFzbSBjb2RlLiAqLwotCQl0YXNrU0VMRUNUX0hJR0hFU1RfUFJJT1JJVFlfVEFTSygpOworCQl0YXNrU0VMRUNUX0hJR0hFU1RfUFJJT1JJVFlfVEFTSygpOyAvKmxpbnQgIWU5MDc5IHZvaWQgKiBpcyB1c2VkIGFzIHRoaXMgbWFjcm8gaXMgdXNlZCB3aXRoIHRpbWVycyBhbmQgY28tcm91dGluZXMgdG9vLiAgQWxpZ25tZW50IGlzIGtub3duIHRvIGJlIGZpbmUgYXMgdGhlIHR5cGUgb2YgdGhlIHBvaW50ZXIgc3RvcmVkIGFuZCByZXRyaWV2ZWQgaXMgdGhlIHNhbWUuICovCiAJCXRyYWNlVEFTS19TV0lUQ0hFRF9JTigpOwogCisJCS8qIEFmdGVyIHRoZSBuZXcgdGFzayBpcyBzd2l0Y2hlZCBpbiwgdXBkYXRlIHRoZSBnbG9iYWwgZXJybm8uICovCisJCSNpZiggY29uZmlnVVNFX1BPU0lYX0VSUk5PID09IDEgKQorCQl7CisJCQlGcmVlUlRPU19lcnJubyA9IHB4Q3VycmVudFRDQi0+aVRhc2tFcnJubzsKKwkJfQorCQkjZW5kaWYKKwogCQkjaWYgKCBjb25maWdVU0VfTkVXTElCX1JFRU5UUkFOVCA9PSAxICkKIAkJewogCQkJLyogU3dpdGNoIE5ld2xpYidzIF9pbXB1cmVfcHRyIHZhcmlhYmxlIHRvIHBvaW50IHRvIHRoZSBfcmVlbnQKQEAgLTI5OTMsNyArMzEwOSw3IEBACiAKIAlUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCBhIGNoZWNrIGhhcyBhbHJlYWR5IGJlZW4gbWFkZSB0byBlbnN1cmUgdGhhdAogCXB4RXZlbnRMaXN0IGlzIG5vdCBlbXB0eS4gKi8KLQlweFVuYmxvY2tlZFRDQiA9ICggVENCX3QgKiApIGxpc3RHRVRfT1dORVJfT0ZfSEVBRF9FTlRSWSggcHhFdmVudExpc3QgKTsKKwlweFVuYmxvY2tlZFRDQiA9IGxpc3RHRVRfT1dORVJfT0ZfSEVBRF9FTlRSWSggcHhFdmVudExpc3QgKTsgLypsaW50ICFlOTA3OSB2b2lkICogaXMgdXNlZCBhcyB0aGlzIG1hY3JvIGlzIHVzZWQgd2l0aCB0aW1lcnMgYW5kIGNvLXJvdXRpbmVzIHRvby4gIEFsaWdubWVudCBpcyBrbm93biB0byBiZSBmaW5lIGFzIHRoZSB0eXBlIG9mIHRoZSBwb2ludGVyIHN0b3JlZCBhbmQgcmV0cmlldmVkIGlzIHRoZSBzYW1lLiAqLwogCWNvbmZpZ0FTU0VSVCggcHhVbmJsb2NrZWRUQ0IgKTsKIAkoIHZvaWQgKSB1eExpc3RSZW1vdmUoICYoIHB4VW5ibG9ja2VkVENCLT54RXZlbnRMaXN0SXRlbSApICk7CiAKQEAgLTMwMDEsNiArMzExNywyMCBAQAogCXsKIAkJKCB2b2lkICkgdXhMaXN0UmVtb3ZlKCAmKCBweFVuYmxvY2tlZFRDQi0+eFN0YXRlTGlzdEl0ZW0gKSApOwogCQlwcnZBZGRUYXNrVG9SZWFkeUxpc3QoIHB4VW5ibG9ja2VkVENCICk7CisKKwkJI2lmKCBjb25maWdVU0VfVElDS0xFU1NfSURMRSAhPSAwICkKKwkJeworCQkJLyogSWYgYSB0YXNrIGlzIGJsb2NrZWQgb24gYSBrZXJuZWwgb2JqZWN0IHRoZW4geE5leHRUYXNrVW5ibG9ja1RpbWUKKwkJCW1pZ2h0IGJlIHNldCB0byB0aGUgYmxvY2tlZCB0YXNrJ3MgdGltZSBvdXQgdGltZS4gIElmIHRoZSB0YXNrIGlzCisJCQl1bmJsb2NrZWQgZm9yIGEgcmVhc29uIG90aGVyIHRoYW4gYSB0aW1lb3V0IHhOZXh0VGFza1VuYmxvY2tUaW1lIGlzCisJCQlub3JtYWxseSBsZWZ0IHVuY2hhbmdlZCwgYmVjYXVzZSBpdCBpcyBhdXRvbWF0aWNhbGx5IHJlc2V0IHRvIGEgbmV3CisJCQl2YWx1ZSB3aGVuIHRoZSB0aWNrIGNvdW50IGVxdWFscyB4TmV4dFRhc2tVbmJsb2NrVGltZS4gIEhvd2V2ZXIgaWYKKwkJCXRpY2tsZXNzIGlkbGluZyBpcyB1c2VkIGl0IG1pZ2h0IGJlIG1vcmUgaW1wb3J0YW50IHRvIGVudGVyIHNsZWVwIG1vZGUKKwkJCWF0IHRoZSBlYXJsaWVzdCBwb3NzaWJsZSB0aW1lIC0gc28gcmVzZXQgeE5leHRUYXNrVW5ibG9ja1RpbWUgaGVyZSB0bworCQkJZW5zdXJlIGl0IGlzIHVwZGF0ZWQgYXQgdGhlIGVhcmxpZXN0IHBvc3NpYmxlIHRpbWUuICovCisJCQlwcnZSZXNldE5leHRUYXNrVW5ibG9ja1RpbWUoKTsKKwkJfQorCQkjZW5kaWYKIAl9CiAJZWxzZQogCXsKQEAgLTMwMjUsMjAgKzMxNTUsNiBAQAogCQl4UmV0dXJuID0gcGRGQUxTRTsKIAl9CiAKLQkjaWYoIGNvbmZpZ1VTRV9USUNLTEVTU19JRExFICE9IDAgKQotCXsKLQkJLyogSWYgYSB0YXNrIGlzIGJsb2NrZWQgb24gYSBrZXJuZWwgb2JqZWN0IHRoZW4geE5leHRUYXNrVW5ibG9ja1RpbWUKLQkJbWlnaHQgYmUgc2V0IHRvIHRoZSBibG9ja2VkIHRhc2sncyB0aW1lIG91dCB0aW1lLiAgSWYgdGhlIHRhc2sgaXMKLQkJdW5ibG9ja2VkIGZvciBhIHJlYXNvbiBvdGhlciB0aGFuIGEgdGltZW91dCB4TmV4dFRhc2tVbmJsb2NrVGltZSBpcwotCQlub3JtYWxseSBsZWZ0IHVuY2hhbmdlZCwgYmVjYXVzZSBpdCBpcyBhdXRvbWF0aWNhbGx5IHJlc2V0IHRvIGEgbmV3Ci0JCXZhbHVlIHdoZW4gdGhlIHRpY2sgY291bnQgZXF1YWxzIHhOZXh0VGFza1VuYmxvY2tUaW1lLiAgSG93ZXZlciBpZgotCQl0aWNrbGVzcyBpZGxpbmcgaXMgdXNlZCBpdCBtaWdodCBiZSBtb3JlIGltcG9ydGFudCB0byBlbnRlciBzbGVlcCBtb2RlCi0JCWF0IHRoZSBlYXJsaWVzdCBwb3NzaWJsZSB0aW1lIC0gc28gcmVzZXQgeE5leHRUYXNrVW5ibG9ja1RpbWUgaGVyZSB0bwotCQllbnN1cmUgaXQgaXMgdXBkYXRlZCBhdCB0aGUgZWFybGllc3QgcG9zc2libGUgdGltZS4gKi8KLQkJcHJ2UmVzZXROZXh0VGFza1VuYmxvY2tUaW1lKCk7Ci0JfQotCSNlbmRpZgotCiAJcmV0dXJuIHhSZXR1cm47CiB9CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTMwNTYsNyArMzE3Miw3IEBACiAKIAkvKiBSZW1vdmUgdGhlIGV2ZW50IGxpc3QgZm9ybSB0aGUgZXZlbnQgZmxhZy4gIEludGVycnVwdHMgZG8gbm90IGFjY2VzcwogCWV2ZW50IGZsYWdzLiAqLwotCXB4VW5ibG9ja2VkVENCID0gKCBUQ0JfdCAqICkgbGlzdEdFVF9MSVNUX0lURU1fT1dORVIoIHB4RXZlbnRMaXN0SXRlbSApOworCXB4VW5ibG9ja2VkVENCID0gbGlzdEdFVF9MSVNUX0lURU1fT1dORVIoIHB4RXZlbnRMaXN0SXRlbSApOyAvKmxpbnQgIWU5MDc5IHZvaWQgKiBpcyB1c2VkIGFzIHRoaXMgbWFjcm8gaXMgdXNlZCB3aXRoIHRpbWVycyBhbmQgY28tcm91dGluZXMgdG9vLiAgQWxpZ25tZW50IGlzIGtub3duIHRvIGJlIGZpbmUgYXMgdGhlIHR5cGUgb2YgdGhlIHBvaW50ZXIgc3RvcmVkIGFuZCByZXRyaWV2ZWQgaXMgdGhlIHNhbWUuICovCiAJY29uZmlnQVNTRVJUKCBweFVuYmxvY2tlZFRDQiApOwogCSggdm9pZCApIHV4TGlzdFJlbW92ZSggcHhFdmVudExpc3RJdGVtICk7CiAKQEAgLTMxMTEsNyArMzIyNyw3IEBACiAJCWNvbnN0IFRpY2tUeXBlX3QgeEVsYXBzZWRUaW1lID0geENvbnN0VGlja0NvdW50IC0gcHhUaW1lT3V0LT54VGltZU9uRW50ZXJpbmc7CiAKIAkJI2lmKCBJTkNMVURFX3hUYXNrQWJvcnREZWxheSA9PSAxICkKLQkJCWlmKCBweEN1cnJlbnRUQ0ItPnVjRGVsYXlBYm9ydGVkICE9IHBkRkFMU0UgKQorCQkJaWYoIHB4Q3VycmVudFRDQi0+dWNEZWxheUFib3J0ZWQgIT0gKCB1aW50OF90ICkgcGRGQUxTRSApCiAJCQl7CiAJCQkJLyogVGhlIGRlbGF5IHdhcyBhYm9ydGVkLCB3aGljaCBpcyBub3QgdGhlIHNhbWUgYXMgYSB0aW1lIG91dCwKIAkJCQlidXQgaGFzIHRoZSBzYW1lIHJlc3VsdC4gKi8KQEAgLTMxNzEsMTEgKzMyODcsMTEgQEAKIAlVQmFzZVR5cGVfdCB1eFRhc2tHZXRUYXNrTnVtYmVyKCBUYXNrSGFuZGxlX3QgeFRhc2sgKQogCXsKIAlVQmFzZVR5cGVfdCB1eFJldHVybjsKLQlUQ0JfdCAqcHhUQ0I7CisJVENCX3QgY29uc3QgKnB4VENCOwogCiAJCWlmKCB4VGFzayAhPSBOVUxMICkKIAkJewotCQkJcHhUQ0IgPSAoIFRDQl90ICogKSB4VGFzazsKKwkJCXB4VENCID0geFRhc2s7CiAJCQl1eFJldHVybiA9IHB4VENCLT51eFRhc2tOdW1iZXI7CiAJCX0KIAkJZWxzZQpAQCAtMzE5MywxMSArMzMwOSwxMSBAQAogCiAJdm9pZCB2VGFza1NldFRhc2tOdW1iZXIoIFRhc2tIYW5kbGVfdCB4VGFzaywgY29uc3QgVUJhc2VUeXBlX3QgdXhIYW5kbGUgKQogCXsKLQlUQ0JfdCAqcHhUQ0I7CisJVENCX3QgKiBweFRDQjsKIAogCQlpZiggeFRhc2sgIT0gTlVMTCApCiAJCXsKLQkJCXB4VENCID0gKCBUQ0JfdCAqICkgeFRhc2s7CisJCQlweFRDQiA9IHhUYXNrOwogCQkJcHhUQ0ItPnV4VGFza051bWJlciA9IHV4SGFuZGxlOwogCQl9CiAJfQpAQCAtMzIyNiw3ICszMzQyLDcgQEAKIAkvKiBJbiBjYXNlIGEgdGFzayB0aGF0IGhhcyBhIHNlY3VyZSBjb250ZXh0IGRlbGV0ZXMgaXRzZWxmLCBpbiB3aGljaCBjYXNlCiAJdGhlIGlkbGUgdGFzayBpcyByZXNwb25zaWJsZSBmb3IgZGVsZXRpbmcgdGhlIHRhc2sncyBzZWN1cmUgY29udGV4dCwgaWYKIAlhbnkuICovCi0JcG9ydFRBU0tfQ0FMTFNfU0VDVVJFX0ZVTkNUSU9OUygpOworCXBvcnRBTExPQ0FURV9TRUNVUkVfQ09OVEVYVCggY29uZmlnTUlOSU1BTF9TRUNVUkVfU1RBQ0tfU0laRSApOwogCiAJZm9yKCA7OyApCiAJewpAQCAtMzQ2OCwxMyArMzU4NCwxMyBAQAogCXsKIAkJVENCX3QgKnB4VENCOwogCi0JCS8qIHV4RGVsZXRlZFRhc2tzV2FpdGluZ0NsZWFuVXAgaXMgdXNlZCB0byBwcmV2ZW50IHZUYXNrU3VzcGVuZEFsbCgpCisJCS8qIHV4RGVsZXRlZFRhc2tzV2FpdGluZ0NsZWFuVXAgaXMgdXNlZCB0byBwcmV2ZW50IHRhc2tFTlRFUl9DUklUSUNBTCgpCiAJCWJlaW5nIGNhbGxlZCB0b28gb2Z0ZW4gaW4gdGhlIGlkbGUgdGFzay4gKi8KIAkJd2hpbGUoIHV4RGVsZXRlZFRhc2tzV2FpdGluZ0NsZWFuVXAgPiAoIFVCYXNlVHlwZV90ICkgMFUgKQogCQl7CiAJCQl0YXNrRU5URVJfQ1JJVElDQUwoKTsKIAkJCXsKLQkJCQlweFRDQiA9ICggVENCX3QgKiApIGxpc3RHRVRfT1dORVJfT0ZfSEVBRF9FTlRSWSggKCAmeFRhc2tzV2FpdGluZ1Rlcm1pbmF0aW9uICkgKTsKKwkJCQlweFRDQiA9IGxpc3RHRVRfT1dORVJfT0ZfSEVBRF9FTlRSWSggKCAmeFRhc2tzV2FpdGluZ1Rlcm1pbmF0aW9uICkgKTsgLypsaW50ICFlOTA3OSB2b2lkICogaXMgdXNlZCBhcyB0aGlzIG1hY3JvIGlzIHVzZWQgd2l0aCB0aW1lcnMgYW5kIGNvLXJvdXRpbmVzIHRvby4gIEFsaWdubWVudCBpcyBrbm93biB0byBiZSBmaW5lIGFzIHRoZSB0eXBlIG9mIHRoZSBwb2ludGVyIHN0b3JlZCBhbmQgcmV0cmlldmVkIGlzIHRoZSBzYW1lLiAqLwogCQkJCSggdm9pZCApIHV4TGlzdFJlbW92ZSggJiggcHhUQ0ItPnhTdGF0ZUxpc3RJdGVtICkgKTsKIAkJCQktLXV4Q3VycmVudE51bWJlck9mVGFza3M7CiAJCQkJLS11eERlbGV0ZWRUYXNrc1dhaXRpbmdDbGVhblVwOwpAQCAtMzU5Myw3ICszNzA5LDcgQEAKIAogCQlpZiggbGlzdENVUlJFTlRfTElTVF9MRU5HVEgoIHB4TGlzdCApID4gKCBVQmFzZVR5cGVfdCApIDAgKQogCQl7Ci0JCQlsaXN0R0VUX09XTkVSX09GX05FWFRfRU5UUlkoIHB4Rmlyc3RUQ0IsIHB4TGlzdCApOworCQkJbGlzdEdFVF9PV05FUl9PRl9ORVhUX0VOVFJZKCBweEZpcnN0VENCLCBweExpc3QgKTsgLypsaW50ICFlOTA3OSB2b2lkICogaXMgdXNlZCBhcyB0aGlzIG1hY3JvIGlzIHVzZWQgd2l0aCB0aW1lcnMgYW5kIGNvLXJvdXRpbmVzIHRvby4gIEFsaWdubWVudCBpcyBrbm93biB0byBiZSBmaW5lIGFzIHRoZSB0eXBlIG9mIHRoZSBwb2ludGVyIHN0b3JlZCBhbmQgcmV0cmlldmVkIGlzIHRoZSBzYW1lLiAqLwogCiAJCQkvKiBQb3B1bGF0ZSBhbiBUYXNrU3RhdHVzX3Qgc3RydWN0dXJlIHdpdGhpbiB0aGUKIAkJCXB4VGFza1N0YXR1c0FycmF5IGFycmF5IGZvciBlYWNoIHRhc2sgdGhhdCBpcyByZWZlcmVuY2VkIGZyb20KQEAgLTM2MDEsNyArMzcxNyw3IEBACiAJCQltZWFuaW5nIG9mIGVhY2ggVGFza1N0YXR1c190IHN0cnVjdHVyZSBtZW1iZXIuICovCiAJCQlkbwogCQkJewotCQkJCWxpc3RHRVRfT1dORVJfT0ZfTkVYVF9FTlRSWSggcHhOZXh0VENCLCBweExpc3QgKTsKKwkJCQlsaXN0R0VUX09XTkVSX09GX05FWFRfRU5UUlkoIHB4TmV4dFRDQiwgcHhMaXN0ICk7IC8qbGludCAhZTkwNzkgdm9pZCAqIGlzIHVzZWQgYXMgdGhpcyBtYWNybyBpcyB1c2VkIHdpdGggdGltZXJzIGFuZCBjby1yb3V0aW5lcyB0b28uICBBbGlnbm1lbnQgaXMga25vd24gdG8gYmUgZmluZSBhcyB0aGUgdHlwZSBvZiB0aGUgcG9pbnRlciBzdG9yZWQgYW5kIHJldHJpZXZlZCBpcyB0aGUgc2FtZS4gKi8KIAkJCQl2VGFza0dldEluZm8oICggVGFza0hhbmRsZV90ICkgcHhOZXh0VENCLCAmKCBweFRhc2tTdGF0dXNBcnJheVsgdXhUYXNrIF0gKSwgcGRUUlVFLCBlU3RhdGUgKTsKIAkJCQl1eFRhc2srKzsKIAkJCX0gd2hpbGUoIHB4TmV4dFRDQiAhPSBweEZpcnN0VENCICk7CkBAIC0zNjE3LDkgKzM3MzMsOSBAQAogI2VuZGlmIC8qIGNvbmZpZ1VTRV9UUkFDRV9GQUNJTElUWSAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLSNpZiAoICggY29uZmlnVVNFX1RSQUNFX0ZBQ0lMSVRZID09IDEgKSB8fCAoIElOQ0xVREVfdXhUYXNrR2V0U3RhY2tIaWdoV2F0ZXJNYXJrID09IDEgKSApCisjaWYgKCAoIGNvbmZpZ1VTRV9UUkFDRV9GQUNJTElUWSA9PSAxICkgfHwgKCBJTkNMVURFX3V4VGFza0dldFN0YWNrSGlnaFdhdGVyTWFyayA9PSAxICkgfHwgKCBJTkNMVURFX3V4VGFza0dldFN0YWNrSGlnaFdhdGVyTWFyazIgPT0gMSApICkKIAotCXN0YXRpYyB1aW50MTZfdCBwcnZUYXNrQ2hlY2tGcmVlU3RhY2tTcGFjZSggY29uc3QgdWludDhfdCAqIHB1Y1N0YWNrQnl0ZSApCisJc3RhdGljIGNvbmZpZ1NUQUNLX0RFUFRIX1RZUEUgcHJ2VGFza0NoZWNrRnJlZVN0YWNrU3BhY2UoIGNvbnN0IHVpbnQ4X3QgKiBwdWNTdGFja0J5dGUgKQogCXsKIAl1aW50MzJfdCB1bENvdW50ID0gMFU7CiAKQEAgLTM2MzEsMTAgKzM3NDcsNTAgQEAKIAogCQl1bENvdW50IC89ICggdWludDMyX3QgKSBzaXplb2YoIFN0YWNrVHlwZV90ICk7IC8qbGludCAhZTk2MSBDYXN0aW5nIGlzIG5vdCByZWR1bmRhbnQgb24gc21hbGxlciBhcmNoaXRlY3R1cmVzLiAqLwogCi0JCXJldHVybiAoIHVpbnQxNl90ICkgdWxDb3VudDsKKwkJcmV0dXJuICggY29uZmlnU1RBQ0tfREVQVEhfVFlQRSApIHVsQ291bnQ7CiAJfQogCi0jZW5kaWYgLyogKCAoIGNvbmZpZ1VTRV9UUkFDRV9GQUNJTElUWSA9PSAxICkgfHwgKCBJTkNMVURFX3V4VGFza0dldFN0YWNrSGlnaFdhdGVyTWFyayA9PSAxICkgKSAqLworI2VuZGlmIC8qICggKCBjb25maWdVU0VfVFJBQ0VfRkFDSUxJVFkgPT0gMSApIHx8ICggSU5DTFVERV91eFRhc2tHZXRTdGFja0hpZ2hXYXRlck1hcmsgPT0gMSApIHx8ICggSU5DTFVERV91eFRhc2tHZXRTdGFja0hpZ2hXYXRlck1hcmsyID09IDEgKSApICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmICggSU5DTFVERV91eFRhc2tHZXRTdGFja0hpZ2hXYXRlck1hcmsyID09IDEgKQorCisJLyogdXhUYXNrR2V0U3RhY2tIaWdoV2F0ZXJNYXJrKCkgYW5kIHV4VGFza0dldFN0YWNrSGlnaFdhdGVyTWFyazIoKSBhcmUgdGhlCisJc2FtZSBleGNlcHQgZm9yIHRoZWlyIHJldHVybiB0eXBlLiAgVXNpbmcgY29uZmlnU1RBQ0tfREVQVEhfVFlQRSBhbGxvd3MgdGhlCisJdXNlciB0byBkZXRlcm1pbmUgdGhlIHJldHVybiB0eXBlLiAgSXQgZ2V0cyBhcm91bmQgdGhlIHByb2JsZW0gb2YgdGhlIHZhbHVlCisJb3ZlcmZsb3dpbmcgb24gOC1iaXQgdHlwZXMgd2l0aG91dCBicmVha2luZyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGZvcgorCWFwcGxpY2F0aW9ucyB0aGF0IGV4cGVjdCBhbiA4LWJpdCByZXR1cm4gdHlwZS4gKi8KKwljb25maWdTVEFDS19ERVBUSF9UWVBFIHV4VGFza0dldFN0YWNrSGlnaFdhdGVyTWFyazIoIFRhc2tIYW5kbGVfdCB4VGFzayApCisJeworCVRDQl90ICpweFRDQjsKKwl1aW50OF90ICpwdWNFbmRPZlN0YWNrOworCWNvbmZpZ1NUQUNLX0RFUFRIX1RZUEUgdXhSZXR1cm47CisKKwkJLyogdXhUYXNrR2V0U3RhY2tIaWdoV2F0ZXJNYXJrKCkgYW5kIHV4VGFza0dldFN0YWNrSGlnaFdhdGVyTWFyazIoKSBhcmUKKwkJdGhlIHNhbWUgZXhjZXB0IGZvciB0aGVpciByZXR1cm4gdHlwZS4gIFVzaW5nIGNvbmZpZ1NUQUNLX0RFUFRIX1RZUEUKKwkJYWxsb3dzIHRoZSB1c2VyIHRvIGRldGVybWluZSB0aGUgcmV0dXJuIHR5cGUuICBJdCBnZXRzIGFyb3VuZCB0aGUKKwkJcHJvYmxlbSBvZiB0aGUgdmFsdWUgb3ZlcmZsb3dpbmcgb24gOC1iaXQgdHlwZXMgd2l0aG91dCBicmVha2luZworCQliYWNrd2FyZCBjb21wYXRpYmlsaXR5IGZvciBhcHBsaWNhdGlvbnMgdGhhdCBleHBlY3QgYW4gOC1iaXQgcmV0dXJuCisJCXR5cGUuICovCisKKwkJcHhUQ0IgPSBwcnZHZXRUQ0JGcm9tSGFuZGxlKCB4VGFzayApOworCisJCSNpZiBwb3J0U1RBQ0tfR1JPV1RIIDwgMAorCQl7CisJCQlwdWNFbmRPZlN0YWNrID0gKCB1aW50OF90ICogKSBweFRDQi0+cHhTdGFjazsKKwkJfQorCQkjZWxzZQorCQl7CisJCQlwdWNFbmRPZlN0YWNrID0gKCB1aW50OF90ICogKSBweFRDQi0+cHhFbmRPZlN0YWNrOworCQl9CisJCSNlbmRpZgorCisJCXV4UmV0dXJuID0gcHJ2VGFza0NoZWNrRnJlZVN0YWNrU3BhY2UoIHB1Y0VuZE9mU3RhY2sgKTsKKworCQlyZXR1cm4gdXhSZXR1cm47CisJfQorCisjZW5kaWYgLyogSU5DTFVERV91eFRhc2tHZXRTdGFja0hpZ2hXYXRlck1hcmsyICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogI2lmICggSU5DTFVERV91eFRhc2tHZXRTdGFja0hpZ2hXYXRlck1hcmsgPT0gMSApCkBAIC0zNjg5LDcgKzM4NDUsNyBAQAogCQkJdlBvcnRGcmVlKCBweFRDQi0+cHhTdGFjayApOwogCQkJdlBvcnRGcmVlKCBweFRDQiApOwogCQl9Ci0JCSNlbGlmKCB0c2tTVEFUSUNfQU5EX0RZTkFNSUNfQUxMT0NBVElPTl9QT1NTSUJMRSAhPSAwICkgLypsaW50ICFlNzMxIE1hY3JvIGhhcyBiZWVuIGNvbnNvbGlkYXRlZCBmb3IgcmVhZGFiaWxpdHkgcmVhc29ucy4gKi8KKwkJI2VsaWYoIHRza1NUQVRJQ19BTkRfRFlOQU1JQ19BTExPQ0FUSU9OX1BPU1NJQkxFICE9IDAgKSAvKmxpbnQgIWU3MzEgIWU5MDI5IE1hY3JvIGhhcyBiZWVuIGNvbnNvbGlkYXRlZCBmb3IgcmVhZGFiaWxpdHkgcmVhc29ucy4gKi8KIAkJewogCQkJLyogVGhlIHRhc2sgY291bGQgaGF2ZSBiZWVuIGFsbG9jYXRlZCBzdGF0aWNhbGx5IG9yIGR5bmFtaWNhbGx5LCBzbwogCQkJY2hlY2sgd2hhdCB3YXMgc3RhdGljYWxseSBhbGxvY2F0ZWQgYmVmb3JlIHRyeWluZyB0byBmcmVlIHRoZQpAQCAtMzczOSw3ICszODk1LDcgQEAKIAkJdGhlIGl0ZW0gYXQgdGhlIGhlYWQgb2YgdGhlIGRlbGF5ZWQgbGlzdC4gIFRoaXMgaXMgdGhlIHRpbWUgYXQKIAkJd2hpY2ggdGhlIHRhc2sgYXQgdGhlIGhlYWQgb2YgdGhlIGRlbGF5ZWQgbGlzdCBzaG91bGQgYmUgcmVtb3ZlZAogCQlmcm9tIHRoZSBCbG9ja2VkIHN0YXRlLiAqLwotCQkoIHB4VENCICkgPSAoIFRDQl90ICogKSBsaXN0R0VUX09XTkVSX09GX0hFQURfRU5UUlkoIHB4RGVsYXllZFRhc2tMaXN0ICk7CisJCSggcHhUQ0IgKSA9IGxpc3RHRVRfT1dORVJfT0ZfSEVBRF9FTlRSWSggcHhEZWxheWVkVGFza0xpc3QgKTsgLypsaW50ICFlOTA3OSB2b2lkICogaXMgdXNlZCBhcyB0aGlzIG1hY3JvIGlzIHVzZWQgd2l0aCB0aW1lcnMgYW5kIGNvLXJvdXRpbmVzIHRvby4gIEFsaWdubWVudCBpcyBrbm93biB0byBiZSBmaW5lIGFzIHRoZSB0eXBlIG9mIHRoZSBwb2ludGVyIHN0b3JlZCBhbmQgcmV0cmlldmVkIGlzIHRoZSBzYW1lLiAqLwogCQl4TmV4dFRhc2tVbmJsb2NrVGltZSA9IGxpc3RHRVRfTElTVF9JVEVNX1ZBTFVFKCAmKCAoIHB4VENCICktPnhTdGF0ZUxpc3RJdGVtICkgKTsKIAl9CiB9CkBAIC0zNzk0LDcgKzM5NTAsNyBAQAogCiAJQmFzZVR5cGVfdCB4VGFza1ByaW9yaXR5SW5oZXJpdCggVGFza0hhbmRsZV90IGNvbnN0IHB4TXV0ZXhIb2xkZXIgKQogCXsKLQlUQ0JfdCAqIGNvbnN0IHB4TXV0ZXhIb2xkZXJUQ0IgPSAoIFRDQl90ICogKSBweE11dGV4SG9sZGVyOworCVRDQl90ICogY29uc3QgcHhNdXRleEhvbGRlclRDQiA9IHB4TXV0ZXhIb2xkZXI7CiAJQmFzZVR5cGVfdCB4UmV0dXJuID0gcGRGQUxTRTsKIAogCQkvKiBJZiB0aGUgbXV0ZXggd2FzIGdpdmVuIGJhY2sgYnkgYW4gaW50ZXJydXB0IHdoaWxlIHRoZSBxdWV1ZSB3YXMKQEAgLTM4ODEsNyArNDAzNyw3IEBACiAKIAlCYXNlVHlwZV90IHhUYXNrUHJpb3JpdHlEaXNpbmhlcml0KCBUYXNrSGFuZGxlX3QgY29uc3QgcHhNdXRleEhvbGRlciApCiAJewotCVRDQl90ICogY29uc3QgcHhUQ0IgPSAoIFRDQl90ICogKSBweE11dGV4SG9sZGVyOworCVRDQl90ICogY29uc3QgcHhUQ0IgPSBweE11dGV4SG9sZGVyOwogCUJhc2VUeXBlX3QgeFJldHVybiA9IHBkRkFMU0U7CiAKIAkJaWYoIHB4TXV0ZXhIb2xkZXIgIT0gTlVMTCApCkBAIC0zOTYxLDcgKzQxMTcsNyBAQAogCiAJdm9pZCB2VGFza1ByaW9yaXR5RGlzaW5oZXJpdEFmdGVyVGltZW91dCggVGFza0hhbmRsZV90IGNvbnN0IHB4TXV0ZXhIb2xkZXIsIFVCYXNlVHlwZV90IHV4SGlnaGVzdFByaW9yaXR5V2FpdGluZ1Rhc2sgKQogCXsKLQlUQ0JfdCAqIGNvbnN0IHB4VENCID0gKCBUQ0JfdCAqICkgcHhNdXRleEhvbGRlcjsKKwlUQ0JfdCAqIGNvbnN0IHB4VENCID0gcHhNdXRleEhvbGRlcjsKIAlVQmFzZVR5cGVfdCB1eFByaW9yaXR5VXNlZE9uRW50cnksIHV4UHJpb3JpdHlUb1VzZTsKIAljb25zdCBVQmFzZVR5cGVfdCB1eE9ubHlPbmVNdXRleEhlbGQgPSAoIFVCYXNlVHlwZV90ICkgMTsKIApAQCAtNDEzOSw3ICs0Mjk1LDcgQEAKIAkJfQogCiAJCS8qIFRlcm1pbmF0ZS4gKi8KLQkJcGNCdWZmZXJbIHggXSA9IDB4MDA7CisJCXBjQnVmZmVyWyB4IF0gPSAoIGNoYXIgKSAweDAwOwogCiAJCS8qIFJldHVybiB0aGUgbmV3IGVuZCBvZiBzdHJpbmcuICovCiAJCXJldHVybiAmKCBwY0J1ZmZlclsgeCBdICk7CkBAIC00MTUzLDcgKzQzMDksNyBAQAogCXZvaWQgdlRhc2tMaXN0KCBjaGFyICogcGNXcml0ZUJ1ZmZlciApCiAJewogCVRhc2tTdGF0dXNfdCAqcHhUYXNrU3RhdHVzQXJyYXk7Ci0Jdm9sYXRpbGUgVUJhc2VUeXBlX3QgdXhBcnJheVNpemUsIHg7CisJVUJhc2VUeXBlX3QgdXhBcnJheVNpemUsIHg7CiAJY2hhciBjU3RhdHVzOwogCiAJCS8qCkBAIC00MTgyLDcgKzQzMzgsNyBAQAogCiAKIAkJLyogTWFrZSBzdXJlIHRoZSB3cml0ZSBidWZmZXIgZG9lcyBub3QgY29udGFpbiBhIHN0cmluZy4gKi8KLQkJKnBjV3JpdGVCdWZmZXIgPSAweDAwOworCQkqcGNXcml0ZUJ1ZmZlciA9ICggY2hhciApIDB4MDA7CiAKIAkJLyogVGFrZSBhIHNuYXBzaG90IG9mIHRoZSBudW1iZXIgb2YgdGFza3MgaW4gY2FzZSBpdCBjaGFuZ2VzIHdoaWxlIHRoaXMKIAkJZnVuY3Rpb24gaXMgZXhlY3V0aW5nLiAqLwpAQCAtNDE5MSw3ICs0MzQ3LDcgQEAKIAkJLyogQWxsb2NhdGUgYW4gYXJyYXkgaW5kZXggZm9yIGVhY2ggdGFzay4gIE5PVEUhICBpZgogCQljb25maWdTVVBQT1JUX0RZTkFNSUNfQUxMT0NBVElPTiBpcyBzZXQgdG8gMCB0aGVuIHB2UG9ydE1hbGxvYygpIHdpbGwKIAkJZXF1YXRlIHRvIE5VTEwuICovCi0JCXB4VGFza1N0YXR1c0FycmF5ID0gcHZQb3J0TWFsbG9jKCB1eEN1cnJlbnROdW1iZXJPZlRhc2tzICogc2l6ZW9mKCBUYXNrU3RhdHVzX3QgKSApOworCQlweFRhc2tTdGF0dXNBcnJheSA9IHB2UG9ydE1hbGxvYyggdXhDdXJyZW50TnVtYmVyT2ZUYXNrcyAqIHNpemVvZiggVGFza1N0YXR1c190ICkgKTsgLypsaW50ICFlOTA3OSBBbGwgdmFsdWVzIHJldHVybmVkIGJ5IHB2UG9ydE1hbGxvYygpIGhhdmUgYXQgbGVhc3QgdGhlIGFsaWdubWVudCByZXF1aXJlZCBieSB0aGUgTUNVJ3Mgc3RhY2sgYW5kIHRoaXMgYWxsb2NhdGlvbiBhbGxvY2F0ZXMgYSBzdHJ1Y3QgdGhhdCBoYXMgdGhlIGFsaWdubWVudCByZXF1aXJlbWVudHMgb2YgYSBwb2ludGVyLiAqLwogCiAJCWlmKCBweFRhc2tTdGF0dXNBcnJheSAhPSBOVUxMICkKIAkJewpAQCAtNDIxOCw5ICs0Mzc0LDEwIEBACiAJCQkJCWNhc2UgZURlbGV0ZWQ6CQljU3RhdHVzID0gdHNrREVMRVRFRF9DSEFSOwogCQkJCQkJCQkJCWJyZWFrOwogCisJCQkJCWNhc2UgZUludmFsaWQ6CQkvKiBGYWxsIHRocm91Z2guICovCiAJCQkJCWRlZmF1bHQ6CQkJLyogU2hvdWxkIG5vdCBnZXQgaGVyZSwgYnV0IGl0IGlzIGluY2x1ZGVkCiAJCQkJCQkJCQkJdG8gcHJldmVudCBzdGF0aWMgY2hlY2tpbmcgZXJyb3JzLiAqLwotCQkJCQkJCQkJCWNTdGF0dXMgPSAweDAwOworCQkJCQkJCQkJCWNTdGF0dXMgPSAoIGNoYXIgKSAweDAwOwogCQkJCQkJCQkJCWJyZWFrOwogCQkJCX0KIApAQCAtNDIyOSw4ICs0Mzg2LDggQEAKIAkJCQlwY1dyaXRlQnVmZmVyID0gcHJ2V3JpdGVOYW1lVG9CdWZmZXIoIHBjV3JpdGVCdWZmZXIsIHB4VGFza1N0YXR1c0FycmF5WyB4IF0ucGNUYXNrTmFtZSApOwogCiAJCQkJLyogV3JpdGUgdGhlIHJlc3Qgb2YgdGhlIHN0cmluZy4gKi8KLQkJCQlzcHJpbnRmKCBwY1dyaXRlQnVmZmVyLCAiXHQlY1x0JXVcdCV1XHQldVxyXG4iLCBjU3RhdHVzLCAoIHVuc2lnbmVkIGludCApIHB4VGFza1N0YXR1c0FycmF5WyB4IF0udXhDdXJyZW50UHJpb3JpdHksICggdW5zaWduZWQgaW50ICkgcHhUYXNrU3RhdHVzQXJyYXlbIHggXS51c1N0YWNrSGlnaFdhdGVyTWFyaywgKCB1bnNpZ25lZCBpbnQgKSBweFRhc2tTdGF0dXNBcnJheVsgeCBdLnhUYXNrTnVtYmVyICk7Ci0JCQkJcGNXcml0ZUJ1ZmZlciArPSBzdHJsZW4oIHBjV3JpdGVCdWZmZXIgKTsKKwkJCQlzcHJpbnRmKCBwY1dyaXRlQnVmZmVyLCAiXHQlY1x0JXVcdCV1XHQldVxyXG4iLCBjU3RhdHVzLCAoIHVuc2lnbmVkIGludCApIHB4VGFza1N0YXR1c0FycmF5WyB4IF0udXhDdXJyZW50UHJpb3JpdHksICggdW5zaWduZWQgaW50ICkgcHhUYXNrU3RhdHVzQXJyYXlbIHggXS51c1N0YWNrSGlnaFdhdGVyTWFyaywgKCB1bnNpZ25lZCBpbnQgKSBweFRhc2tTdGF0dXNBcnJheVsgeCBdLnhUYXNrTnVtYmVyICk7IC8qbGludCAhZTU4NiBzcHJpbnRmKCkgYWxsb3dlZCBhcyB0aGlzIGlzIGNvbXBpbGVkIHdpdGggbWFueSBjb21waWxlcnMgYW5kIHRoaXMgaXMgYSB1dGlsaXR5IGZ1bmN0aW9uIG9ubHkgLSBub3QgcGFydCBvZiB0aGUgY29yZSBrZXJuZWwgaW1wbGVtZW50YXRpb24uICovCisJCQkJcGNXcml0ZUJ1ZmZlciArPSBzdHJsZW4oIHBjV3JpdGVCdWZmZXIgKTsgLypsaW50ICFlOTAxNiBQb2ludGVyIGFyaXRobWV0aWMgb2sgb24gY2hhciBwb2ludGVycyBlc3BlY2lhbGx5IGFzIGluIHRoaXMgY2FzZSB3aGVyZSBpdCBiZXN0IGRlbm90ZXMgdGhlIGludGVudCBvZiB0aGUgY29kZS4gKi8KIAkJCX0KIAogCQkJLyogRnJlZSB0aGUgYXJyYXkgYWdhaW4uICBOT1RFISAgSWYgY29uZmlnU1VQUE9SVF9EWU5BTUlDX0FMTE9DQVRJT04KQEAgLTQyNTEsNyArNDQwOCw3IEBACiAJdm9pZCB2VGFza0dldFJ1blRpbWVTdGF0cyggY2hhciAqcGNXcml0ZUJ1ZmZlciApCiAJewogCVRhc2tTdGF0dXNfdCAqcHhUYXNrU3RhdHVzQXJyYXk7Ci0Jdm9sYXRpbGUgVUJhc2VUeXBlX3QgdXhBcnJheVNpemUsIHg7CisJVUJhc2VUeXBlX3QgdXhBcnJheVNpemUsIHg7CiAJdWludDMyX3QgdWxUb3RhbFRpbWUsIHVsU3RhdHNBc1BlcmNlbnRhZ2U7CiAKIAkJI2lmKCBjb25maWdVU0VfVFJBQ0VfRkFDSUxJVFkgIT0gMSApCkBAIC00Mjg2LDcgKzQ0NDMsNyBAQAogCQkgKi8KIAogCQkvKiBNYWtlIHN1cmUgdGhlIHdyaXRlIGJ1ZmZlciBkb2VzIG5vdCBjb250YWluIGEgc3RyaW5nLiAqLwotCQkqcGNXcml0ZUJ1ZmZlciA9IDB4MDA7CisJCSpwY1dyaXRlQnVmZmVyID0gKCBjaGFyICkgMHgwMDsKIAogCQkvKiBUYWtlIGEgc25hcHNob3Qgb2YgdGhlIG51bWJlciBvZiB0YXNrcyBpbiBjYXNlIGl0IGNoYW5nZXMgd2hpbGUgdGhpcwogCQlmdW5jdGlvbiBpcyBleGVjdXRpbmcuICovCkBAIC00Mjk1LDcgKzQ0NTIsNyBAQAogCQkvKiBBbGxvY2F0ZSBhbiBhcnJheSBpbmRleCBmb3IgZWFjaCB0YXNrLiAgTk9URSEgIElmCiAJCWNvbmZpZ1NVUFBPUlRfRFlOQU1JQ19BTExPQ0FUSU9OIGlzIHNldCB0byAwIHRoZW4gcHZQb3J0TWFsbG9jKCkgd2lsbAogCQllcXVhdGUgdG8gTlVMTC4gKi8KLQkJcHhUYXNrU3RhdHVzQXJyYXkgPSBwdlBvcnRNYWxsb2MoIHV4Q3VycmVudE51bWJlck9mVGFza3MgKiBzaXplb2YoIFRhc2tTdGF0dXNfdCApICk7CisJCXB4VGFza1N0YXR1c0FycmF5ID0gcHZQb3J0TWFsbG9jKCB1eEN1cnJlbnROdW1iZXJPZlRhc2tzICogc2l6ZW9mKCBUYXNrU3RhdHVzX3QgKSApOyAvKmxpbnQgIWU5MDc5IEFsbCB2YWx1ZXMgcmV0dXJuZWQgYnkgcHZQb3J0TWFsbG9jKCkgaGF2ZSBhdCBsZWFzdCB0aGUgYWxpZ25tZW50IHJlcXVpcmVkIGJ5IHRoZSBNQ1UncyBzdGFjayBhbmQgdGhpcyBhbGxvY2F0aW9uIGFsbG9jYXRlcyBhIHN0cnVjdCB0aGF0IGhhcyB0aGUgYWxpZ25tZW50IHJlcXVpcmVtZW50cyBvZiBhIHBvaW50ZXIuICovCiAKIAkJaWYoIHB4VGFza1N0YXR1c0FycmF5ICE9IE5VTEwgKQogCQl7CkBAIC00MzA2LDcgKzQ0NjMsNyBAQAogCQkJdWxUb3RhbFRpbWUgLz0gMTAwVUw7CiAKIAkJCS8qIEF2b2lkIGRpdmlkZSBieSB6ZXJvIGVycm9ycy4gKi8KLQkJCWlmKCB1bFRvdGFsVGltZSA+IDAgKQorCQkJaWYoIHVsVG90YWxUaW1lID4gMFVMICkKIAkJCXsKIAkJCQkvKiBDcmVhdGUgYSBodW1hbiByZWFkYWJsZSB0YWJsZSBmcm9tIHRoZSBiaW5hcnkgZGF0YS4gKi8KIAkJCQlmb3IoIHggPSAwOyB4IDwgdXhBcnJheVNpemU7IHgrKyApCkBAIC00MzMxLDcgKzQ0ODgsNyBAQAogCQkJCQkJewogCQkJCQkJCS8qIHNpemVvZiggaW50ICkgPT0gc2l6ZW9mKCBsb25nICkgc28gYSBzbWFsbGVyCiAJCQkJCQkJcHJpbnRmKCkgbGlicmFyeSBjYW4gYmUgdXNlZC4gKi8KLQkJCQkJCQlzcHJpbnRmKCBwY1dyaXRlQnVmZmVyLCAiXHQldVx0XHQldSUlXHJcbiIsICggdW5zaWduZWQgaW50ICkgcHhUYXNrU3RhdHVzQXJyYXlbIHggXS51bFJ1blRpbWVDb3VudGVyLCAoIHVuc2lnbmVkIGludCApIHVsU3RhdHNBc1BlcmNlbnRhZ2UgKTsKKwkJCQkJCQlzcHJpbnRmKCBwY1dyaXRlQnVmZmVyLCAiXHQldVx0XHQldSUlXHJcbiIsICggdW5zaWduZWQgaW50ICkgcHhUYXNrU3RhdHVzQXJyYXlbIHggXS51bFJ1blRpbWVDb3VudGVyLCAoIHVuc2lnbmVkIGludCApIHVsU3RhdHNBc1BlcmNlbnRhZ2UgKTsgLypsaW50ICFlNTg2IHNwcmludGYoKSBhbGxvd2VkIGFzIHRoaXMgaXMgY29tcGlsZWQgd2l0aCBtYW55IGNvbXBpbGVycyBhbmQgdGhpcyBpcyBhIHV0aWxpdHkgZnVuY3Rpb24gb25seSAtIG5vdCBwYXJ0IG9mIHRoZSBjb3JlIGtlcm5lbCBpbXBsZW1lbnRhdGlvbi4gKi8KIAkJCQkJCX0KIAkJCQkJCSNlbmRpZgogCQkJCQl9CkBAIC00MzQ3LDEyICs0NTA0LDEyIEBACiAJCQkJCQl7CiAJCQkJCQkJLyogc2l6ZW9mKCBpbnQgKSA9PSBzaXplb2YoIGxvbmcgKSBzbyBhIHNtYWxsZXIKIAkJCQkJCQlwcmludGYoKSBsaWJyYXJ5IGNhbiBiZSB1c2VkLiAqLwotCQkJCQkJCXNwcmludGYoIHBjV3JpdGVCdWZmZXIsICJcdCV1XHRcdDwxJSVcclxuIiwgKCB1bnNpZ25lZCBpbnQgKSBweFRhc2tTdGF0dXNBcnJheVsgeCBdLnVsUnVuVGltZUNvdW50ZXIgKTsKKwkJCQkJCQlzcHJpbnRmKCBwY1dyaXRlQnVmZmVyLCAiXHQldVx0XHQ8MSUlXHJcbiIsICggdW5zaWduZWQgaW50ICkgcHhUYXNrU3RhdHVzQXJyYXlbIHggXS51bFJ1blRpbWVDb3VudGVyICk7IC8qbGludCAhZTU4NiBzcHJpbnRmKCkgYWxsb3dlZCBhcyB0aGlzIGlzIGNvbXBpbGVkIHdpdGggbWFueSBjb21waWxlcnMgYW5kIHRoaXMgaXMgYSB1dGlsaXR5IGZ1bmN0aW9uIG9ubHkgLSBub3QgcGFydCBvZiB0aGUgY29yZSBrZXJuZWwgaW1wbGVtZW50YXRpb24uICovCiAJCQkJCQl9CiAJCQkJCQkjZW5kaWYKIAkJCQkJfQogCi0JCQkJCXBjV3JpdGVCdWZmZXIgKz0gc3RybGVuKCBwY1dyaXRlQnVmZmVyICk7CisJCQkJCXBjV3JpdGVCdWZmZXIgKz0gc3RybGVuKCBwY1dyaXRlQnVmZmVyICk7IC8qbGludCAhZTkwMTYgUG9pbnRlciBhcml0aG1ldGljIG9rIG9uIGNoYXIgcG9pbnRlcnMgZXNwZWNpYWxseSBhcyBpbiB0aGlzIGNhc2Ugd2hlcmUgaXQgYmVzdCBkZW5vdGVzIHRoZSBpbnRlbnQgb2YgdGhlIGNvZGUuICovCiAJCQkJfQogCQkJfQogCQkJZWxzZQpAQCAtNDM4OSw3ICs0NTQ2LDcgQEAKIAogI2lmICggY29uZmlnVVNFX01VVEVYRVMgPT0gMSApCiAKLQl2b2lkICpwdlRhc2tJbmNyZW1lbnRNdXRleEhlbGRDb3VudCggdm9pZCApCisJVGFza0hhbmRsZV90IHB2VGFza0luY3JlbWVudE11dGV4SGVsZENvdW50KCB2b2lkICkKIAl7CiAJCS8qIElmIHhTZW1hcGhvcmVDcmVhdGVNdXRleCgpIGlzIGNhbGxlZCBiZWZvcmUgYW55IHRhc2tzIGhhdmUgYmVlbiBjcmVhdGVkCiAJCXRoZW4gcHhDdXJyZW50VENCIHdpbGwgYmUgTlVMTC4gKi8KQEAgLTQ1NjEsNyArNDcxOCw3IEBACiAJdWludDhfdCB1Y09yaWdpbmFsTm90aWZ5U3RhdGU7CiAKIAkJY29uZmlnQVNTRVJUKCB4VGFza1RvTm90aWZ5ICk7Ci0JCXB4VENCID0gKCBUQ0JfdCAqICkgeFRhc2tUb05vdGlmeTsKKwkJcHhUQ0IgPSB4VGFza1RvTm90aWZ5OwogCiAJCXRhc2tFTlRFUl9DUklUSUNBTCgpOwogCQl7CkBAIC00NjA0LDYgKzQ3NjEsMTQgQEAKIAkJCQkJLyogVGhlIHRhc2sgaXMgYmVpbmcgbm90aWZpZWQgd2l0aG91dCBpdHMgbm90aWZ5IHZhbHVlIGJlaW5nCiAJCQkJCXVwZGF0ZWQuICovCiAJCQkJCWJyZWFrOworCisJCQkJZGVmYXVsdDoKKwkJCQkJLyogU2hvdWxkIG5vdCBnZXQgaGVyZSBpZiBhbGwgZW51bXMgYXJlIGhhbmRsZWQuCisJCQkJCUFydGlmaWNpYWxseSBmb3JjZSBhbiBhc3NlcnQgYnkgdGVzdGluZyBhIHZhbHVlIHRoZQorCQkJCQljb21waWxlciBjYW4ndCBhc3N1bWUgaXMgY29uc3QuICovCisJCQkJCWNvbmZpZ0FTU0VSVCggcHhUQ0ItPnVsTm90aWZpZWRWYWx1ZSA9PSB+MFVMICk7CisKKwkJCQkJYnJlYWs7CiAJCQl9CiAKIAkJCXRyYWNlVEFTS19OT1RJRlkoKTsKQEAgLTQ2ODcsNyArNDg1Miw3IEBACiAJCWh0dHA6Ly93d3cuZnJlZXJ0b3Mub3JnL1JUT1MtQ29ydGV4LU0zLU00Lmh0bWwgKi8KIAkJcG9ydEFTU0VSVF9JRl9JTlRFUlJVUFRfUFJJT1JJVFlfSU5WQUxJRCgpOwogCi0JCXB4VENCID0gKCBUQ0JfdCAqICkgeFRhc2tUb05vdGlmeTsKKwkJcHhUQ0IgPSB4VGFza1RvTm90aWZ5OwogCiAJCXV4U2F2ZWRJbnRlcnJ1cHRTdGF0dXMgPSBwb3J0U0VUX0lOVEVSUlVQVF9NQVNLX0ZST01fSVNSKCk7CiAJCXsKQEAgLTQ3MjksNiArNDg5NCwxMyBAQAogCQkJCQkvKiBUaGUgdGFzayBpcyBiZWluZyBub3RpZmllZCB3aXRob3V0IGl0cyBub3RpZnkgdmFsdWUgYmVpbmcKIAkJCQkJdXBkYXRlZC4gKi8KIAkJCQkJYnJlYWs7CisKKwkJCQlkZWZhdWx0OgorCQkJCQkvKiBTaG91bGQgbm90IGdldCBoZXJlIGlmIGFsbCBlbnVtcyBhcmUgaGFuZGxlZC4KKwkJCQkJQXJ0aWZpY2lhbGx5IGZvcmNlIGFuIGFzc2VydCBieSB0ZXN0aW5nIGEgdmFsdWUgdGhlCisJCQkJCWNvbXBpbGVyIGNhbid0IGFzc3VtZSBpcyBjb25zdC4gKi8KKwkJCQkJY29uZmlnQVNTRVJUKCBweFRDQi0+dWxOb3RpZmllZFZhbHVlID09IH4wVUwgKTsKKwkJCQkJYnJlYWs7CiAJCQl9CiAKIAkJCXRyYWNlVEFTS19OT1RJRllfRlJPTV9JU1IoKTsKQEAgLTQ3NjAsMTMgKzQ5MzIsMTEgQEAKIAkJCQkJewogCQkJCQkJKnB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gPSBwZFRSVUU7CiAJCQkJCX0KLQkJCQkJZWxzZQotCQkJCQl7Ci0JCQkJCQkvKiBNYXJrIHRoYXQgYSB5aWVsZCBpcyBwZW5kaW5nIGluIGNhc2UgdGhlIHVzZXIgaXMgbm90Ci0JCQkJCQl1c2luZyB0aGUgInhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbiIgcGFyYW1ldGVyIHRvIGFuIElTUgotCQkJCQkJc2FmZSBGcmVlUlRPUyBmdW5jdGlvbi4gKi8KLQkJCQkJCXhZaWVsZFBlbmRpbmcgPSBwZFRSVUU7Ci0JCQkJCX0KKworCQkJCQkvKiBNYXJrIHRoYXQgYSB5aWVsZCBpcyBwZW5kaW5nIGluIGNhc2UgdGhlIHVzZXIgaXMgbm90CisJCQkJCXVzaW5nIHRoZSAieEhpZ2hlclByaW9yaXR5VGFza1dva2VuIiBwYXJhbWV0ZXIgdG8gYW4gSVNSCisJCQkJCXNhZmUgRnJlZVJUT1MgZnVuY3Rpb24uICovCisJCQkJCXhZaWVsZFBlbmRpbmcgPSBwZFRSVUU7CiAJCQkJfQogCQkJCWVsc2UKIAkJCQl7CkBAIC00ODEwLDcgKzQ5ODAsNyBAQAogCQlodHRwOi8vd3d3LmZyZWVydG9zLm9yZy9SVE9TLUNvcnRleC1NMy1NNC5odG1sICovCiAJCXBvcnRBU1NFUlRfSUZfSU5URVJSVVBUX1BSSU9SSVRZX0lOVkFMSUQoKTsKIAotCQlweFRDQiA9ICggVENCX3QgKiApIHhUYXNrVG9Ob3RpZnk7CisJCXB4VENCID0geFRhc2tUb05vdGlmeTsKIAogCQl1eFNhdmVkSW50ZXJydXB0U3RhdHVzID0gcG9ydFNFVF9JTlRFUlJVUFRfTUFTS19GUk9NX0lTUigpOwogCQl7CkBAIC00ODUwLDEzICs1MDIwLDExIEBACiAJCQkJCXsKIAkJCQkJCSpweEhpZ2hlclByaW9yaXR5VGFza1dva2VuID0gcGRUUlVFOwogCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJLyogTWFyayB0aGF0IGEgeWllbGQgaXMgcGVuZGluZyBpbiBjYXNlIHRoZSB1c2VyIGlzIG5vdAotCQkJCQkJdXNpbmcgdGhlICJ4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4iIHBhcmFtZXRlciBpbiBhbiBJU1IKLQkJCQkJCXNhZmUgRnJlZVJUT1MgZnVuY3Rpb24uICovCi0JCQkJCQl4WWllbGRQZW5kaW5nID0gcGRUUlVFOwotCQkJCQl9CisKKwkJCQkJLyogTWFyayB0aGF0IGEgeWllbGQgaXMgcGVuZGluZyBpbiBjYXNlIHRoZSB1c2VyIGlzIG5vdAorCQkJCQl1c2luZyB0aGUgInhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbiIgcGFyYW1ldGVyIGluIGFuIElTUgorCQkJCQlzYWZlIEZyZWVSVE9TIGZ1bmN0aW9uLiAqLworCQkJCQl4WWllbGRQZW5kaW5nID0gcGRUUlVFOwogCQkJCX0KIAkJCQllbHNlCiAJCQkJewpAQCAtNDkwMiw2ICs1MDcwLDEzIEBACiAjZW5kaWYgLyogY29uZmlnVVNFX1RBU0tfTk9USUZJQ0FUSU9OUyAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKKyNpZiggKCBjb25maWdHRU5FUkFURV9SVU5fVElNRV9TVEFUUyA9PSAxICkgJiYgKCBJTkNMVURFX3hUYXNrR2V0SWRsZVRhc2tIYW5kbGUgPT0gMSApICkKKwlUaWNrVHlwZV90IHhUYXNrR2V0SWRsZVJ1blRpbWVDb3VudGVyKCB2b2lkICkKKwl7CisJCXJldHVybiB4SWRsZVRhc2tIYW5kbGUtPnVsUnVuVGltZUNvdW50ZXI7CisJfQorI2VuZGlmCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogc3RhdGljIHZvaWQgcHJ2QWRkQ3VycmVudFRhc2tUb0RlbGF5ZWRMaXN0KCBUaWNrVHlwZV90IHhUaWNrc1RvV2FpdCwgY29uc3QgQmFzZVR5cGVfdCB4Q2FuQmxvY2tJbmRlZmluaXRlbHkgKQogewpAQCAtNDkyMyw3ICs1MDk4LDcgQEAKIAl7CiAJCS8qIFRoZSBjdXJyZW50IHRhc2sgbXVzdCBiZSBpbiBhIHJlYWR5IGxpc3QsIHNvIHRoZXJlIGlzIG5vIG5lZWQgdG8KIAkJY2hlY2ssIGFuZCB0aGUgcG9ydCByZXNldCBtYWNybyBjYW4gYmUgY2FsbGVkIGRpcmVjdGx5LiAqLwotCQlwb3J0UkVTRVRfUkVBRFlfUFJJT1JJVFkoIHB4Q3VycmVudFRDQi0+dXhQcmlvcml0eSwgdXhUb3BSZWFkeVByaW9yaXR5ICk7CisJCXBvcnRSRVNFVF9SRUFEWV9QUklPUklUWSggcHhDdXJyZW50VENCLT51eFByaW9yaXR5LCB1eFRvcFJlYWR5UHJpb3JpdHkgKTsgLypsaW50ICFlOTMxIHB4Q3VycmVudFRDQiBjYW5ub3QgY2hhbmdlIGFzIGl0IGlzIHRoZSBjYWxsaW5nIHRhc2suICBweEN1cnJlbnRUQ0ItPnV4UHJpb3JpdHkgYW5kIHV4VG9wUmVhZHlQcmlvcml0eSBjYW5ub3QgY2hhbmdlIGFzIGNhbGxlZCB3aXRoIHNjaGVkdWxlciBzdXNwZW5kZWQgb3IgaW4gYSBjcml0aWNhbCBzZWN0aW9uLiAqLwogCX0KIAllbHNlCiAJewpAQCAtNTAyNywxMiArNTIwMiwxMiBAQAogCiAJI2luY2x1ZGUgImZyZWVydG9zX3Rhc2tzX2NfYWRkaXRpb25zLmgiCiAKLQlzdGF0aWMgdm9pZCBmcmVlcnRvc190YXNrc19jX2FkZGl0aW9uc19pbml0KCB2b2lkICkKLQl7Ci0JCSNpZmRlZiBGUkVFUlRPU19UQVNLU19DX0FERElUSU9OU19JTklUCisJI2lmZGVmIEZSRUVSVE9TX1RBU0tTX0NfQURESVRJT05TX0lOSVQKKwkJc3RhdGljIHZvaWQgZnJlZXJ0b3NfdGFza3NfY19hZGRpdGlvbnNfaW5pdCggdm9pZCApCisJCXsKIAkJCUZSRUVSVE9TX1RBU0tTX0NfQURESVRJT05TX0lOSVQoKTsKLQkJI2VuZGlmCi0JfQorCQl9CisJI2VuZGlmCiAKICNlbmRpZgogCmRpZmYgLS1naXQgYS9Tb3VyY2UvdGltZXJzLmMgYi9Tb3VyY2UvdGltZXJzLmMKaW5kZXggMDAyZGQ4Yi4uNTliMzg0MCAxMDA2NDQKLS0tIGEvU291cmNlL3RpbWVycy5jCisrKyBiL1NvdXJjZS90aW1lcnMuYwpAQCAtMSw2ICsxLDYgQEAKIC8qCi0gKiBGcmVlUlRPUyBLZXJuZWwgVjEwLjAuMQotICogQ29weXJpZ2h0IChDKSAyMDE3IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogRnJlZVJUT1MgS2VybmVsIFYxMC4yLjEKKyAqIENvcHlyaWdodCAoQykgMjAxOSBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCiAgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCiAgKiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgpAQCAtNDIsMTEgKzQyLDExIEBACiAJI2Vycm9yIGNvbmZpZ1VTRV9USU1FUlMgbXVzdCBiZSBzZXQgdG8gMSB0byBtYWtlIHRoZSB4VGltZXJQZW5kRnVuY3Rpb25DYWxsKCkgZnVuY3Rpb24gYXZhaWxhYmxlLgogI2VuZGlmCiAKLS8qIExpbnQgZTk2MSBhbmQgZTc1MCBhcmUgc3VwcHJlc3NlZCBhcyBhIE1JU1JBIGV4Y2VwdGlvbiBqdXN0aWZpZWQgYmVjYXVzZSB0aGUKLU1QVSBwb3J0cyByZXF1aXJlIE1QVV9XUkFQUEVSU19JTkNMVURFRF9GUk9NX0FQSV9GSUxFIHRvIGJlIGRlZmluZWQgZm9yIHRoZQotaGVhZGVyIGZpbGVzIGFib3ZlLCBidXQgbm90IGluIHRoaXMgZmlsZSwgaW4gb3JkZXIgdG8gZ2VuZXJhdGUgdGhlIGNvcnJlY3QKLXByaXZpbGVnZWQgVnMgdW5wcml2aWxlZ2VkIGxpbmthZ2UgYW5kIHBsYWNlbWVudC4gKi8KLSN1bmRlZiBNUFVfV1JBUFBFUlNfSU5DTFVERURfRlJPTV9BUElfRklMRSAvKmxpbnQgIWU5NjEgIWU3NTAuICovCisvKiBMaW50IGU5MDIxLCBlOTYxIGFuZCBlNzUwIGFyZSBzdXBwcmVzc2VkIGFzIGEgTUlTUkEgZXhjZXB0aW9uIGp1c3RpZmllZAorYmVjYXVzZSB0aGUgTVBVIHBvcnRzIHJlcXVpcmUgTVBVX1dSQVBQRVJTX0lOQ0xVREVEX0ZST01fQVBJX0ZJTEUgdG8gYmUgZGVmaW5lZAorZm9yIHRoZSBoZWFkZXIgZmlsZXMgYWJvdmUsIGJ1dCBub3QgaW4gdGhpcyBmaWxlLCBpbiBvcmRlciB0byBnZW5lcmF0ZSB0aGUKK2NvcnJlY3QgcHJpdmlsZWdlZCBWcyB1bnByaXZpbGVnZWQgbGlua2FnZSBhbmQgcGxhY2VtZW50LiAqLworI3VuZGVmIE1QVV9XUkFQUEVSU19JTkNMVURFRF9GUk9NX0FQSV9GSUxFIC8qbGludCAhZTkwMjEgIWU5NjEgIWU3NTAuICovCiAKIAogLyogVGhpcyBlbnRpcmUgc291cmNlIGZpbGUgd2lsbCBiZSBza2lwcGVkIGlmIHRoZSBhcHBsaWNhdGlvbiBpcyBub3QgY29uZmlndXJlZApAQCAtNjQsMjIgKzY0LDIzIEBACiAJI2RlZmluZSBjb25maWdUSU1FUl9TRVJWSUNFX1RBU0tfTkFNRSAiVG1yIFN2YyIKICNlbmRpZgogCisvKiBCaXQgZGVmaW5pdGlvbnMgdXNlZCBpbiB0aGUgdWNTdGF0dXMgbWVtYmVyIG9mIGEgdGltZXIgc3RydWN0dXJlLiAqLworI2RlZmluZSB0bXJTVEFUVVNfSVNfQUNUSVZFCQkJCQkoICggdWludDhfdCApIDB4MDEgKQorI2RlZmluZSB0bXJTVEFUVVNfSVNfU1RBVElDQUxMWV9BTExPQ0FURUQJKCAoIHVpbnQ4X3QgKSAweDAyICkKKyNkZWZpbmUgdG1yU1RBVFVTX0lTX0FVVE9SRUxPQUQJCQkJKCAoIHVpbnQ4X3QgKSAweDA0ICkKKwogLyogVGhlIGRlZmluaXRpb24gb2YgdGhlIHRpbWVycyB0aGVtc2VsdmVzLiAqLwotdHlwZWRlZiBzdHJ1Y3QgdG1yVGltZXJDb250cm9sCit0eXBlZGVmIHN0cnVjdCB0bXJUaW1lckNvbnRyb2wgLyogVGhlIG9sZCBuYW1pbmcgY29udmVudGlvbiBpcyB1c2VkIHRvIHByZXZlbnQgYnJlYWtpbmcga2VybmVsIGF3YXJlIGRlYnVnZ2Vycy4gKi8KIHsKIAljb25zdCBjaGFyCQkJCSpwY1RpbWVyTmFtZTsJCS8qPDwgVGV4dCBuYW1lLiAgVGhpcyBpcyBub3QgdXNlZCBieSB0aGUga2VybmVsLCBpdCBpcyBpbmNsdWRlZCBzaW1wbHkgdG8gbWFrZSBkZWJ1Z2dpbmcgZWFzaWVyLiAqLyAvKmxpbnQgIWU5NzEgVW5xdWFsaWZpZWQgY2hhciB0eXBlcyBhcmUgYWxsb3dlZCBmb3Igc3RyaW5ncyBhbmQgc2luZ2xlIGNoYXJhY3RlcnMgb25seS4gKi8KIAlMaXN0SXRlbV90CQkJCXhUaW1lckxpc3RJdGVtOwkJLyo8PCBTdGFuZGFyZCBsaW5rZWQgbGlzdCBpdGVtIGFzIHVzZWQgYnkgYWxsIGtlcm5lbCBmZWF0dXJlcyBmb3IgZXZlbnQgbWFuYWdlbWVudC4gKi8KIAlUaWNrVHlwZV90CQkJCXhUaW1lclBlcmlvZEluVGlja3M7Lyo8PCBIb3cgcXVpY2tseSBhbmQgb2Z0ZW4gdGhlIHRpbWVyIGV4cGlyZXMuICovCi0JVUJhc2VUeXBlX3QJCQkJdXhBdXRvUmVsb2FkOwkJLyo8PCBTZXQgdG8gcGRUUlVFIGlmIHRoZSB0aW1lciBzaG91bGQgYmUgYXV0b21hdGljYWxseSByZXN0YXJ0ZWQgb25jZSBleHBpcmVkLiAgU2V0IHRvIHBkRkFMU0UgaWYgdGhlIHRpbWVyIGlzLCBpbiBlZmZlY3QsIGEgb25lLXNob3QgdGltZXIuICovCiAJdm9pZCAJCQkJCSpwdlRpbWVySUQ7CQkJLyo8PCBBbiBJRCB0byBpZGVudGlmeSB0aGUgdGltZXIuICBUaGlzIGFsbG93cyB0aGUgdGltZXIgdG8gYmUgaWRlbnRpZmllZCB3aGVuIHRoZSBzYW1lIGNhbGxiYWNrIGlzIHVzZWQgZm9yIG11bHRpcGxlIHRpbWVycy4gKi8KIAlUaW1lckNhbGxiYWNrRnVuY3Rpb25fdAlweENhbGxiYWNrRnVuY3Rpb247CS8qPDwgVGhlIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgdGltZXIgZXhwaXJlcy4gKi8KIAkjaWYoIGNvbmZpZ1VTRV9UUkFDRV9GQUNJTElUWSA9PSAxICkKIAkJVUJhc2VUeXBlX3QJCQl1eFRpbWVyTnVtYmVyOwkJLyo8PCBBbiBJRCBhc3NpZ25lZCBieSB0cmFjZSB0b29scyBzdWNoIGFzIEZyZWVSVE9TK1RyYWNlICovCiAJI2VuZGlmCi0KLQkjaWYoICggY29uZmlnU1VQUE9SVF9TVEFUSUNfQUxMT0NBVElPTiA9PSAxICkgJiYgKCBjb25maWdTVVBQT1JUX0RZTkFNSUNfQUxMT0NBVElPTiA9PSAxICkgKQotCQl1aW50OF90IAkJCXVjU3RhdGljYWxseUFsbG9jYXRlZDsgLyo8PCBTZXQgdG8gcGRUUlVFIGlmIHRoZSB0aW1lciB3YXMgY3JlYXRlZCBzdGF0aWNhbGx5IHNvIG5vIGF0dGVtcHQgaXMgbWFkZSB0byBmcmVlIHRoZSBtZW1vcnkgYWdhaW4gaWYgdGhlIHRpbWVyIGlzIGxhdGVyIGRlbGV0ZWQuICovCi0JI2VuZGlmCisJdWludDhfdCAJCQkJdWNTdGF0dXM7CQkJLyo8PCBIb2xkcyBiaXRzIHRvIHNheSBpZiB0aGUgdGltZXIgd2FzIHN0YXRpY2FsbHkgYWxsb2NhdGVkIG9yIG5vdCwgYW5kIGlmIGl0IGlzIGFjdGl2ZSBvciBub3QuICovCiB9IHhUSU1FUjsKIAogLyogVGhlIG9sZCB4VElNRVIgbmFtZSBpcyBtYWludGFpbmVkIGFib3ZlIHRoZW4gdHlwZWRlZmVkIHRvIHRoZSBuZXcgVGltZXJfdApAQCAtMTI3LDkgKzEyOCwxMiBAQAogCiAvKiBUaGUgbGlzdCBpbiB3aGljaCBhY3RpdmUgdGltZXJzIGFyZSBzdG9yZWQuICBUaW1lcnMgYXJlIHJlZmVyZW5jZWQgaW4gZXhwaXJlCiB0aW1lIG9yZGVyLCB3aXRoIHRoZSBuZWFyZXN0IGV4cGlyeSB0aW1lIGF0IHRoZSBmcm9udCBvZiB0aGUgbGlzdC4gIE9ubHkgdGhlCi10aW1lciBzZXJ2aWNlIHRhc2sgaXMgYWxsb3dlZCB0byBhY2Nlc3MgdGhlc2UgbGlzdHMuICovCi1QUklWSUxFR0VEX0RBVEEgc3RhdGljIExpc3RfdCB4QWN0aXZlVGltZXJMaXN0MSA9IHswfTsKLVBSSVZJTEVHRURfREFUQSBzdGF0aWMgTGlzdF90IHhBY3RpdmVUaW1lckxpc3QyID0gezB9OwordGltZXIgc2VydmljZSB0YXNrIGlzIGFsbG93ZWQgdG8gYWNjZXNzIHRoZXNlIGxpc3RzLgoreEFjdGl2ZVRpbWVyTGlzdDEgYW5kIHhBY3RpdmVUaW1lckxpc3QyIGNvdWxkIGJlIGF0IGZ1bmN0aW9uIHNjb3BlIGJ1dCB0aGF0CiticmVha3Mgc29tZSBrZXJuZWwgYXdhcmUgZGVidWdnZXJzLCBhbmQgZGVidWdnZXJzIHRoYXQgcmVwbHkgb24gcmVtb3ZpbmcgdGhlCitzdGF0aWMgcXVhbGlmaWVyLiAqLworUFJJVklMRUdFRF9EQVRBIHN0YXRpYyBMaXN0X3QgeEFjdGl2ZVRpbWVyTGlzdDEgPSB7IDAgfTsKK1BSSVZJTEVHRURfREFUQSBzdGF0aWMgTGlzdF90IHhBY3RpdmVUaW1lckxpc3QyID0geyAwIH07CiBQUklWSUxFR0VEX0RBVEEgc3RhdGljIExpc3RfdCAqcHhDdXJyZW50VGltZXJMaXN0ID0gTlVMTDsKIFBSSVZJTEVHRURfREFUQSBzdGF0aWMgTGlzdF90ICpweE92ZXJmbG93VGltZXJMaXN0ID0gTlVMTDsKIApAQCAtMTYyLDcgKzE2Niw3IEBACiAgKiB0YXNrLiAgT3RoZXIgdGFza3MgY29tbXVuaWNhdGUgd2l0aCB0aGUgdGltZXIgc2VydmljZSB0YXNrIHVzaW5nIHRoZQogICogeFRpbWVyUXVldWUgcXVldWUuCiAgKi8KLXN0YXRpYyB2b2lkIHBydlRpbWVyVGFzayggdm9pZCAqcHZQYXJhbWV0ZXJzICkgUFJJVklMRUdFRF9GVU5DVElPTjsKK3N0YXRpYyBwb3J0VEFTS19GVU5DVElPTl9QUk9UTyggcHJ2VGltZXJUYXNrLCBwdlBhcmFtZXRlcnMgKSBQUklWSUxFR0VEX0ZVTkNUSU9OOwogCiAvKgogICogQ2FsbGVkIGJ5IHRoZSB0aW1lciBzZXJ2aWNlIHRhc2sgdG8gaW50ZXJwcmV0IGFuZCBwcm9jZXNzIGEgY29tbWFuZCBpdApAQCAtMjgzLDI2ICsyODcsMjEgQEAKIAl7CiAJVGltZXJfdCAqcHhOZXdUaW1lcjsKIAotCQlweE5ld1RpbWVyID0gKCBUaW1lcl90ICogKSBwdlBvcnRNYWxsb2MoIHNpemVvZiggVGltZXJfdCApICk7CisJCXB4TmV3VGltZXIgPSAoIFRpbWVyX3QgKiApIHB2UG9ydE1hbGxvYyggc2l6ZW9mKCBUaW1lcl90ICkgKTsgLypsaW50ICFlOTA4NyAhZTkwNzkgQWxsIHZhbHVlcyByZXR1cm5lZCBieSBwdlBvcnRNYWxsb2MoKSBoYXZlIGF0IGxlYXN0IHRoZSBhbGlnbm1lbnQgcmVxdWlyZWQgYnkgdGhlIE1DVSdzIHN0YWNrLCBhbmQgdGhlIGZpcnN0IG1lbWJlciBvZiBUaW1lcl90IGlzIGFsd2F5cyBhIHBvaW50ZXIgdG8gdGhlIHRpbWVyJ3MgbWFtZS4gKi8KIAogCQlpZiggcHhOZXdUaW1lciAhPSBOVUxMICkKIAkJeworCQkJLyogU3RhdHVzIGlzIHRodXMgZmFyIHplcm8gYXMgdGhlIHRpbWVyIGlzIG5vdCBjcmVhdGVkIHN0YXRpY2FsbHkKKwkJCWFuZCBoYXMgbm90IGJlZW4gc3RhcnRlZC4gIFRoZSBhdXRvcmVsb2FkIGJpdCBtYXkgZ2V0IHNldCBpbgorCQkJcHJ2SW5pdGlhbGlzZU5ld1RpbWVyLiAqLworCQkJcHhOZXdUaW1lci0+dWNTdGF0dXMgPSAweDAwOwogCQkJcHJ2SW5pdGlhbGlzZU5ld1RpbWVyKCBwY1RpbWVyTmFtZSwgeFRpbWVyUGVyaW9kSW5UaWNrcywgdXhBdXRvUmVsb2FkLCBwdlRpbWVySUQsIHB4Q2FsbGJhY2tGdW5jdGlvbiwgcHhOZXdUaW1lciApOwotCi0JCQkjaWYoIGNvbmZpZ1NVUFBPUlRfU1RBVElDX0FMTE9DQVRJT04gPT0gMSApCi0JCQl7Ci0JCQkJLyogVGltZXJzIGNhbiBiZSBjcmVhdGVkIHN0YXRpY2FsbHkgb3IgZHluYW1pY2FsbHksIHNvIG5vdGUgdGhpcwotCQkJCXRpbWVyIHdhcyBjcmVhdGVkIGR5bmFtaWNhbGx5IGluIGNhc2UgdGhlIHRpbWVyIGlzIGxhdGVyCi0JCQkJZGVsZXRlZC4gKi8KLQkJCQlweE5ld1RpbWVyLT51Y1N0YXRpY2FsbHlBbGxvY2F0ZWQgPSBwZEZBTFNFOwotCQkJfQotCQkJI2VuZGlmIC8qIGNvbmZpZ1NVUFBPUlRfU1RBVElDX0FMTE9DQVRJT04gKi8KIAkJfQogCiAJCXJldHVybiBweE5ld1RpbWVyOwogCX0KIAotI2VuZGlmIC8qIGNvbmZpZ1NVUFBPUlRfU1RBVElDX0FMTE9DQVRJT04gKi8KKyNlbmRpZiAvKiBjb25maWdTVVBQT1JUX0RZTkFNSUNfQUxMT0NBVElPTiAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKICNpZiggY29uZmlnU1VQUE9SVF9TVEFUSUNfQUxMT0NBVElPTiA9PSAxICkKQEAgLTMyMywyNCArMzIyLDIyIEBACiAJCQlzdHJ1Y3R1cmUuICovCiAJCQl2b2xhdGlsZSBzaXplX3QgeFNpemUgPSBzaXplb2YoIFN0YXRpY1RpbWVyX3QgKTsKIAkJCWNvbmZpZ0FTU0VSVCggeFNpemUgPT0gc2l6ZW9mKCBUaW1lcl90ICkgKTsKKwkJCSggdm9pZCApIHhTaXplOyAvKiBLZWVwcyBsaW50IHF1aWV0IHdoZW4gY29uZmlnQVNTRVJUKCkgaXMgbm90IGRlZmluZWQuICovCiAJCX0KIAkJI2VuZGlmIC8qIGNvbmZpZ0FTU0VSVF9ERUZJTkVEICovCiAKIAkJLyogQSBwb2ludGVyIHRvIGEgU3RhdGljVGltZXJfdCBzdHJ1Y3R1cmUgTVVTVCBiZSBwcm92aWRlZCwgdXNlIGl0LiAqLwogCQljb25maWdBU1NFUlQoIHB4VGltZXJCdWZmZXIgKTsKLQkJcHhOZXdUaW1lciA9ICggVGltZXJfdCAqICkgcHhUaW1lckJ1ZmZlcjsgLypsaW50ICFlNzQwIFVudXN1YWwgY2FzdCBpcyBvayBhcyB0aGUgc3RydWN0dXJlcyBhcmUgZGVzaWduZWQgdG8gaGF2ZSB0aGUgc2FtZSBhbGlnbm1lbnQsIGFuZCB0aGUgc2l6ZSBpcyBjaGVja2VkIGJ5IGFuIGFzc2VydC4gKi8KKwkJcHhOZXdUaW1lciA9ICggVGltZXJfdCAqICkgcHhUaW1lckJ1ZmZlcjsgLypsaW50ICFlNzQwICFlOTA4NyBTdGF0aWNUaW1lcl90IGlzIGEgcG9pbnRlciB0byBhIFRpbWVyX3QsIHNvIGd1YXJhbnRlZWQgdG8gYmUgYWxpZ25lZCBhbmQgc2l6ZWQgY29ycmVjdGx5IChjaGVja2VkIGJ5IGFuIGFzc2VydCgpKSwgc28gdGhpcyBpcyBzYWZlLiAqLwogCiAJCWlmKCBweE5ld1RpbWVyICE9IE5VTEwgKQogCQl7Ci0JCQlwcnZJbml0aWFsaXNlTmV3VGltZXIoIHBjVGltZXJOYW1lLCB4VGltZXJQZXJpb2RJblRpY2tzLCB1eEF1dG9SZWxvYWQsIHB2VGltZXJJRCwgcHhDYWxsYmFja0Z1bmN0aW9uLCBweE5ld1RpbWVyICk7CisJCQkvKiBUaW1lcnMgY2FuIGJlIGNyZWF0ZWQgc3RhdGljYWxseSBvciBkeW5hbWljYWxseSBzbyBub3RlIHRoaXMKKwkJCXRpbWVyIHdhcyBjcmVhdGVkIHN0YXRpY2FsbHkgaW4gY2FzZSBpdCBpcyBsYXRlciBkZWxldGVkLiAgVGhlCisJCQlhdXRvcmVsb2FkIGJpdCBtYXkgZ2V0IHNldCBpbiBwcnZJbml0aWFsaXNlTmV3VGltZXIoKS4gKi8KKwkJCXB4TmV3VGltZXItPnVjU3RhdHVzID0gdG1yU1RBVFVTX0lTX1NUQVRJQ0FMTFlfQUxMT0NBVEVEOwogCi0JCQkjaWYoIGNvbmZpZ1NVUFBPUlRfRFlOQU1JQ19BTExPQ0FUSU9OID09IDEgKQotCQkJewotCQkJCS8qIFRpbWVycyBjYW4gYmUgY3JlYXRlZCBzdGF0aWNhbGx5IG9yIGR5bmFtaWNhbGx5IHNvIG5vdGUgdGhpcwotCQkJCXRpbWVyIHdhcyBjcmVhdGVkIHN0YXRpY2FsbHkgaW4gY2FzZSBpdCBpcyBsYXRlciBkZWxldGVkLiAqLwotCQkJCXB4TmV3VGltZXItPnVjU3RhdGljYWxseUFsbG9jYXRlZCA9IHBkVFJVRTsKLQkJCX0KLQkJCSNlbmRpZiAvKiBjb25maWdTVVBQT1JUX0RZTkFNSUNfQUxMT0NBVElPTiAqLworCQkJcHJ2SW5pdGlhbGlzZU5ld1RpbWVyKCBwY1RpbWVyTmFtZSwgeFRpbWVyUGVyaW9kSW5UaWNrcywgdXhBdXRvUmVsb2FkLCBwdlRpbWVySUQsIHB4Q2FsbGJhY2tGdW5jdGlvbiwgcHhOZXdUaW1lciApOwogCQl9CiAKIAkJcmV0dXJuIHB4TmV3VGltZXI7CkBAIC0zNjksMTAgKzM2NiwxMyBAQAogCQlwYXJhbWV0ZXJzLiAqLwogCQlweE5ld1RpbWVyLT5wY1RpbWVyTmFtZSA9IHBjVGltZXJOYW1lOwogCQlweE5ld1RpbWVyLT54VGltZXJQZXJpb2RJblRpY2tzID0geFRpbWVyUGVyaW9kSW5UaWNrczsKLQkJcHhOZXdUaW1lci0+dXhBdXRvUmVsb2FkID0gdXhBdXRvUmVsb2FkOwogCQlweE5ld1RpbWVyLT5wdlRpbWVySUQgPSBwdlRpbWVySUQ7CiAJCXB4TmV3VGltZXItPnB4Q2FsbGJhY2tGdW5jdGlvbiA9IHB4Q2FsbGJhY2tGdW5jdGlvbjsKIAkJdkxpc3RJbml0aWFsaXNlSXRlbSggJiggcHhOZXdUaW1lci0+eFRpbWVyTGlzdEl0ZW0gKSApOworCQlpZiggdXhBdXRvUmVsb2FkICE9IHBkRkFMU0UgKQorCQl7CisJCQlweE5ld1RpbWVyLT51Y1N0YXR1cyB8PSB0bXJTVEFUVVNfSVNfQVVUT1JFTE9BRDsKKwkJfQogCQl0cmFjZVRJTUVSX0NSRUFURSggcHhOZXdUaW1lciApOwogCX0KIH0KQEAgLTM5Miw3ICszOTIsNyBAQAogCQkvKiBTZW5kIGEgY29tbWFuZCB0byB0aGUgdGltZXIgc2VydmljZSB0YXNrIHRvIHN0YXJ0IHRoZSB4VGltZXIgdGltZXIuICovCiAJCXhNZXNzYWdlLnhNZXNzYWdlSUQgPSB4Q29tbWFuZElEOwogCQl4TWVzc2FnZS51LnhUaW1lclBhcmFtZXRlcnMueE1lc3NhZ2VWYWx1ZSA9IHhPcHRpb25hbFZhbHVlOwotCQl4TWVzc2FnZS51LnhUaW1lclBhcmFtZXRlcnMucHhUaW1lciA9ICggVGltZXJfdCAqICkgeFRpbWVyOworCQl4TWVzc2FnZS51LnhUaW1lclBhcmFtZXRlcnMucHhUaW1lciA9IHhUaW1lcjsKIAogCQlpZiggeENvbW1hbmRJRCA8IHRtckZJUlNUX0ZST01fSVNSX0NPTU1BTkQgKQogCQl7CkBAIC00MzIsMTYgKzQzMiwzNiBAQAogCiBUaWNrVHlwZV90IHhUaW1lckdldFBlcmlvZCggVGltZXJIYW5kbGVfdCB4VGltZXIgKQogewotVGltZXJfdCAqcHhUaW1lciA9ICggVGltZXJfdCAqICkgeFRpbWVyOworVGltZXJfdCAqcHhUaW1lciA9IHhUaW1lcjsKIAogCWNvbmZpZ0FTU0VSVCggeFRpbWVyICk7CiAJcmV0dXJuIHB4VGltZXItPnhUaW1lclBlcmlvZEluVGlja3M7CiB9CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAordm9pZCB2VGltZXJTZXRSZWxvYWRNb2RlKCBUaW1lckhhbmRsZV90IHhUaW1lciwgY29uc3QgVUJhc2VUeXBlX3QgdXhBdXRvUmVsb2FkICkKK3sKK1RpbWVyX3QgKiBweFRpbWVyID0gIHhUaW1lcjsKKworCWNvbmZpZ0FTU0VSVCggeFRpbWVyICk7CisJdGFza0VOVEVSX0NSSVRJQ0FMKCk7CisJeworCQlpZiggdXhBdXRvUmVsb2FkICE9IHBkRkFMU0UgKQorCQl7CisJCQlweFRpbWVyLT51Y1N0YXR1cyB8PSB0bXJTVEFUVVNfSVNfQVVUT1JFTE9BRDsKKwkJfQorCQllbHNlCisJCXsKKwkJCXB4VGltZXItPnVjU3RhdHVzICY9IH50bXJTVEFUVVNfSVNfQVVUT1JFTE9BRDsKKwkJfQorCX0KKwl0YXNrRVhJVF9DUklUSUNBTCgpOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKIFRpY2tUeXBlX3QgeFRpbWVyR2V0RXhwaXJ5VGltZSggVGltZXJIYW5kbGVfdCB4VGltZXIgKQogewotVGltZXJfdCAqIHB4VGltZXIgPSAoIFRpbWVyX3QgKiApIHhUaW1lcjsKK1RpbWVyX3QgKiBweFRpbWVyID0gIHhUaW1lcjsKIFRpY2tUeXBlX3QgeFJldHVybjsKIAogCWNvbmZpZ0FTU0VSVCggeFRpbWVyICk7CkBAIC00NTIsNyArNDcyLDcgQEAKIAogY29uc3QgY2hhciAqIHBjVGltZXJHZXROYW1lKCBUaW1lckhhbmRsZV90IHhUaW1lciApIC8qbGludCAhZTk3MSBVbnF1YWxpZmllZCBjaGFyIHR5cGVzIGFyZSBhbGxvd2VkIGZvciBzdHJpbmdzIGFuZCBzaW5nbGUgY2hhcmFjdGVycyBvbmx5LiAqLwogewotVGltZXJfdCAqcHhUaW1lciA9ICggVGltZXJfdCAqICkgeFRpbWVyOworVGltZXJfdCAqcHhUaW1lciA9IHhUaW1lcjsKIAogCWNvbmZpZ0FTU0VSVCggeFRpbWVyICk7CiAJcmV0dXJuIHB4VGltZXItPnBjVGltZXJOYW1lOwpAQCAtNDYyLDcgKzQ4Miw3IEBACiBzdGF0aWMgdm9pZCBwcnZQcm9jZXNzRXhwaXJlZFRpbWVyKCBjb25zdCBUaWNrVHlwZV90IHhOZXh0RXhwaXJlVGltZSwgY29uc3QgVGlja1R5cGVfdCB4VGltZU5vdyApCiB7CiBCYXNlVHlwZV90IHhSZXN1bHQ7Ci1UaW1lcl90ICogY29uc3QgcHhUaW1lciA9ICggVGltZXJfdCAqICkgbGlzdEdFVF9PV05FUl9PRl9IRUFEX0VOVFJZKCBweEN1cnJlbnRUaW1lckxpc3QgKTsKK1RpbWVyX3QgKiBjb25zdCBweFRpbWVyID0gKCBUaW1lcl90ICogKSBsaXN0R0VUX09XTkVSX09GX0hFQURfRU5UUlkoIHB4Q3VycmVudFRpbWVyTGlzdCApOyAvKmxpbnQgIWU5MDg3ICFlOTA3OSB2b2lkICogaXMgdXNlZCBhcyB0aGlzIG1hY3JvIGlzIHVzZWQgd2l0aCB0YXNrcyBhbmQgY28tcm91dGluZXMgdG9vLiAgQWxpZ25tZW50IGlzIGtub3duIHRvIGJlIGZpbmUgYXMgdGhlIHR5cGUgb2YgdGhlIHBvaW50ZXIgc3RvcmVkIGFuZCByZXRyaWV2ZWQgaXMgdGhlIHNhbWUuICovCiAKIAkvKiBSZW1vdmUgdGhlIHRpbWVyIGZyb20gdGhlIGxpc3Qgb2YgYWN0aXZlIHRpbWVycy4gIEEgY2hlY2sgaGFzIGFscmVhZHkKIAliZWVuIHBlcmZvcm1lZCB0byBlbnN1cmUgdGhlIGxpc3QgaXMgbm90IGVtcHR5LiAqLwpAQCAtNDcxLDcgKzQ5MSw3IEBACiAKIAkvKiBJZiB0aGUgdGltZXIgaXMgYW4gYXV0byByZWxvYWQgdGltZXIgdGhlbiBjYWxjdWxhdGUgdGhlIG5leHQKIAlleHBpcnkgdGltZSBhbmQgcmUtaW5zZXJ0IHRoZSB0aW1lciBpbiB0aGUgbGlzdCBvZiBhY3RpdmUgdGltZXJzLiAqLwotCWlmKCBweFRpbWVyLT51eEF1dG9SZWxvYWQgPT0gKCBVQmFzZVR5cGVfdCApIHBkVFJVRSApCisJaWYoICggcHhUaW1lci0+dWNTdGF0dXMgJiB0bXJTVEFUVVNfSVNfQVVUT1JFTE9BRCApICE9IDAgKQogCXsKIAkJLyogVGhlIHRpbWVyIGlzIGluc2VydGVkIGludG8gYSBsaXN0IHVzaW5nIGEgdGltZSByZWxhdGl2ZSB0byBhbnl0aGluZwogCQlvdGhlciB0aGFuIHRoZSBjdXJyZW50IHRpbWUuICBJdCB3aWxsIHRoZXJlZm9yZSBiZSBpbnNlcnRlZCBpbnRvIHRoZQpAQCAtNDkxLDYgKzUxMSw3IEBACiAJfQogCWVsc2UKIAl7CisJCXB4VGltZXItPnVjU3RhdHVzICY9IH50bXJTVEFUVVNfSVNfQUNUSVZFOwogCQltdENPVkVSQUdFX1RFU1RfTUFSS0VSKCk7CiAJfQogCkBAIC00OTksNyArNTIwLDcgQEAKIH0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi1zdGF0aWMgdm9pZCBwcnZUaW1lclRhc2soIHZvaWQgKnB2UGFyYW1ldGVycyApCitzdGF0aWMgcG9ydFRBU0tfRlVOQ1RJT04oIHBydlRpbWVyVGFzaywgcHZQYXJhbWV0ZXJzICkKIHsKIFRpY2tUeXBlX3QgeE5leHRFeHBpcmVUaW1lOwogQmFzZVR5cGVfdCB4TGlzdFdhc0VtcHR5OwpAQCAtNzQ3LDExICs3NjgsMTIgQEAKIAkJCXN3aXRjaCggeE1lc3NhZ2UueE1lc3NhZ2VJRCApCiAJCQl7CiAJCQkJY2FzZSB0bXJDT01NQU5EX1NUQVJUIDoKLQkJCSAgICBjYXNlIHRtckNPTU1BTkRfU1RBUlRfRlJPTV9JU1IgOgotCQkJICAgIGNhc2UgdG1yQ09NTUFORF9SRVNFVCA6Ci0JCQkgICAgY2FzZSB0bXJDT01NQU5EX1JFU0VUX0ZST01fSVNSIDoKKwkJCQljYXNlIHRtckNPTU1BTkRfU1RBUlRfRlJPTV9JU1IgOgorCQkJCWNhc2UgdG1yQ09NTUFORF9SRVNFVCA6CisJCQkJY2FzZSB0bXJDT01NQU5EX1JFU0VUX0ZST01fSVNSIDoKIAkJCQljYXNlIHRtckNPTU1BTkRfU1RBUlRfRE9OVF9UUkFDRSA6CiAJCQkJCS8qIFN0YXJ0IG9yIHJlc3RhcnQgYSB0aW1lci4gKi8KKwkJCQkJcHhUaW1lci0+dWNTdGF0dXMgfD0gdG1yU1RBVFVTX0lTX0FDVElWRTsKIAkJCQkJaWYoIHBydkluc2VydFRpbWVySW5BY3RpdmVMaXN0KCBweFRpbWVyLCAgeE1lc3NhZ2UudS54VGltZXJQYXJhbWV0ZXJzLnhNZXNzYWdlVmFsdWUgKyBweFRpbWVyLT54VGltZXJQZXJpb2RJblRpY2tzLCB4VGltZU5vdywgeE1lc3NhZ2UudS54VGltZXJQYXJhbWV0ZXJzLnhNZXNzYWdlVmFsdWUgKSAhPSBwZEZBTFNFICkKIAkJCQkJewogCQkJCQkJLyogVGhlIHRpbWVyIGV4cGlyZWQgYmVmb3JlIGl0IHdhcyBhZGRlZCB0byB0aGUgYWN0aXZlCkBAIC03NTksNyArNzgxLDcgQEAKIAkJCQkJCXB4VGltZXItPnB4Q2FsbGJhY2tGdW5jdGlvbiggKCBUaW1lckhhbmRsZV90ICkgcHhUaW1lciApOwogCQkJCQkJdHJhY2VUSU1FUl9FWFBJUkVEKCBweFRpbWVyICk7CiAKLQkJCQkJCWlmKCBweFRpbWVyLT51eEF1dG9SZWxvYWQgPT0gKCBVQmFzZVR5cGVfdCApIHBkVFJVRSApCisJCQkJCQlpZiggKCBweFRpbWVyLT51Y1N0YXR1cyAmIHRtclNUQVRVU19JU19BVVRPUkVMT0FEICkgIT0gMCApCiAJCQkJCQl7CiAJCQkJCQkJeFJlc3VsdCA9IHhUaW1lckdlbmVyaWNDb21tYW5kKCBweFRpbWVyLCB0bXJDT01NQU5EX1NUQVJUX0RPTlRfVFJBQ0UsIHhNZXNzYWdlLnUueFRpbWVyUGFyYW1ldGVycy54TWVzc2FnZVZhbHVlICsgcHhUaW1lci0+eFRpbWVyUGVyaW9kSW5UaWNrcywgTlVMTCwgdG1yTk9fREVMQVkgKTsKIAkJCQkJCQljb25maWdBU1NFUlQoIHhSZXN1bHQgKTsKQEAgLTc3OCwxMiArODAwLDEzIEBACiAKIAkJCQljYXNlIHRtckNPTU1BTkRfU1RPUCA6CiAJCQkJY2FzZSB0bXJDT01NQU5EX1NUT1BfRlJPTV9JU1IgOgotCQkJCQkvKiBUaGUgdGltZXIgaGFzIGFscmVhZHkgYmVlbiByZW1vdmVkIGZyb20gdGhlIGFjdGl2ZSBsaXN0LgotCQkJCQlUaGVyZSBpcyBub3RoaW5nIHRvIGRvIGhlcmUuICovCisJCQkJCS8qIFRoZSB0aW1lciBoYXMgYWxyZWFkeSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgYWN0aXZlIGxpc3QuICovCisJCQkJCXB4VGltZXItPnVjU3RhdHVzICY9IH50bXJTVEFUVVNfSVNfQUNUSVZFOwogCQkJCQlicmVhazsKIAogCQkJCWNhc2UgdG1yQ09NTUFORF9DSEFOR0VfUEVSSU9EIDoKIAkJCQljYXNlIHRtckNPTU1BTkRfQ0hBTkdFX1BFUklPRF9GUk9NX0lTUiA6CisJCQkJCXB4VGltZXItPnVjU3RhdHVzIHw9IHRtclNUQVRVU19JU19BQ1RJVkU7CiAJCQkJCXB4VGltZXItPnhUaW1lclBlcmlvZEluVGlja3MgPSB4TWVzc2FnZS51LnhUaW1lclBhcmFtZXRlcnMueE1lc3NhZ2VWYWx1ZTsKIAkJCQkJY29uZmlnQVNTRVJUKCAoIHB4VGltZXItPnhUaW1lclBlcmlvZEluVGlja3MgPiAwICkgKTsKIApAQCAtNzk3LDI5ICs4MjAsMjggQEAKIAkJCQkJYnJlYWs7CiAKIAkJCQljYXNlIHRtckNPTU1BTkRfREVMRVRFIDoKLQkJCQkJLyogVGhlIHRpbWVyIGhhcyBhbHJlYWR5IGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBhY3RpdmUgbGlzdCwKLQkJCQkJanVzdCBmcmVlIHVwIHRoZSBtZW1vcnkgaWYgdGhlIG1lbW9yeSB3YXMgZHluYW1pY2FsbHkKLQkJCQkJYWxsb2NhdGVkLiAqLwotCQkJCQkjaWYoICggY29uZmlnU1VQUE9SVF9EWU5BTUlDX0FMTE9DQVRJT04gPT0gMSApICYmICggY29uZmlnU1VQUE9SVF9TVEFUSUNfQUxMT0NBVElPTiA9PSAwICkgKQorCQkJCQkjaWYgKCBjb25maWdTVVBQT1JUX0RZTkFNSUNfQUxMT0NBVElPTiA9PSAxICkKIAkJCQkJewotCQkJCQkJLyogVGhlIHRpbWVyIGNhbiBvbmx5IGhhdmUgYmVlbiBhbGxvY2F0ZWQgZHluYW1pY2FsbHkgLQotCQkJCQkJZnJlZSBpdCBhZ2Fpbi4gKi8KLQkJCQkJCXZQb3J0RnJlZSggcHhUaW1lciApOwotCQkJCQl9Ci0JCQkJCSNlbGlmKCAoIGNvbmZpZ1NVUFBPUlRfRFlOQU1JQ19BTExPQ0FUSU9OID09IDEgKSAmJiAoIGNvbmZpZ1NVUFBPUlRfU1RBVElDX0FMTE9DQVRJT04gPT0gMSApICkKLQkJCQkJewotCQkJCQkJLyogVGhlIHRpbWVyIGNvdWxkIGhhdmUgYmVlbiBhbGxvY2F0ZWQgc3RhdGljYWxseSBvcgotCQkJCQkJZHluYW1pY2FsbHksIHNvIGNoZWNrIGJlZm9yZSBhdHRlbXB0aW5nIHRvIGZyZWUgdGhlCi0JCQkJCQltZW1vcnkuICovCi0JCQkJCQlpZiggcHhUaW1lci0+dWNTdGF0aWNhbGx5QWxsb2NhdGVkID09ICggdWludDhfdCApIHBkRkFMU0UgKQorCQkJCQkJLyogVGhlIHRpbWVyIGhhcyBhbHJlYWR5IGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBhY3RpdmUgbGlzdCwKKwkJCQkJCWp1c3QgZnJlZSB1cCB0aGUgbWVtb3J5IGlmIHRoZSBtZW1vcnkgd2FzIGR5bmFtaWNhbGx5CisJCQkJCQlhbGxvY2F0ZWQuICovCisJCQkJCQlpZiggKCBweFRpbWVyLT51Y1N0YXR1cyAmIHRtclNUQVRVU19JU19TVEFUSUNBTExZX0FMTE9DQVRFRCApID09ICggdWludDhfdCApIDAgKQogCQkJCQkJewogCQkJCQkJCXZQb3J0RnJlZSggcHhUaW1lciApOwogCQkJCQkJfQogCQkJCQkJZWxzZQogCQkJCQkJewotCQkJCQkJCW10Q09WRVJBR0VfVEVTVF9NQVJLRVIoKTsKKwkJCQkJCQlweFRpbWVyLT51Y1N0YXR1cyAmPSB+dG1yU1RBVFVTX0lTX0FDVElWRTsKIAkJCQkJCX0KIAkJCQkJfQorCQkJCQkjZWxzZQorCQkJCQl7CisJCQkJCQkvKiBJZiBkeW5hbWljIGFsbG9jYXRpb24gaXMgbm90IGVuYWJsZWQsIHRoZSBtZW1vcnkKKwkJCQkJCWNvdWxkIG5vdCBoYXZlIGJlZW4gZHluYW1pY2FsbHkgYWxsb2NhdGVkLiBTbyB0aGVyZSBpcworCQkJCQkJbm8gbmVlZCB0byBmcmVlIHRoZSBtZW1vcnkgLSBqdXN0IG1hcmsgdGhlIHRpbWVyIGFzCisJCQkJCQkibm90IGFjdGl2ZSIuICovCisJCQkJCQlweFRpbWVyLT51Y1N0YXR1cyAmPSB+dG1yU1RBVFVTX0lTX0FDVElWRTsKKwkJCQkJfQogCQkJCQkjZW5kaWYgLyogY29uZmlnU1VQUE9SVF9EWU5BTUlDX0FMTE9DQVRJT04gKi8KIAkJCQkJYnJlYWs7CiAKQEAgLTg0OCw3ICs4NzAsNyBAQAogCQl4TmV4dEV4cGlyZVRpbWUgPSBsaXN0R0VUX0lURU1fVkFMVUVfT0ZfSEVBRF9FTlRSWSggcHhDdXJyZW50VGltZXJMaXN0ICk7CiAKIAkJLyogUmVtb3ZlIHRoZSB0aW1lciBmcm9tIHRoZSBsaXN0LiAqLwotCQlweFRpbWVyID0gKCBUaW1lcl90ICogKSBsaXN0R0VUX09XTkVSX09GX0hFQURfRU5UUlkoIHB4Q3VycmVudFRpbWVyTGlzdCApOworCQlweFRpbWVyID0gKCBUaW1lcl90ICogKSBsaXN0R0VUX09XTkVSX09GX0hFQURfRU5UUlkoIHB4Q3VycmVudFRpbWVyTGlzdCApOyAvKmxpbnQgIWU5MDg3ICFlOTA3OSB2b2lkICogaXMgdXNlZCBhcyB0aGlzIG1hY3JvIGlzIHVzZWQgd2l0aCB0YXNrcyBhbmQgY28tcm91dGluZXMgdG9vLiAgQWxpZ25tZW50IGlzIGtub3duIHRvIGJlIGZpbmUgYXMgdGhlIHR5cGUgb2YgdGhlIHBvaW50ZXIgc3RvcmVkIGFuZCByZXRyaWV2ZWQgaXMgdGhlIHNhbWUuICovCiAJCSggdm9pZCApIHV4TGlzdFJlbW92ZSggJiggcHhUaW1lci0+eFRpbWVyTGlzdEl0ZW0gKSApOwogCQl0cmFjZVRJTUVSX0VYUElSRUQoIHB4VGltZXIgKTsKIApAQCAtODU3LDcgKzg3OSw3IEBACiAJCWhhdmUgbm90IHlldCBiZWVuIHN3aXRjaGVkLiAqLwogCQlweFRpbWVyLT5weENhbGxiYWNrRnVuY3Rpb24oICggVGltZXJIYW5kbGVfdCApIHB4VGltZXIgKTsKIAotCQlpZiggcHhUaW1lci0+dXhBdXRvUmVsb2FkID09ICggVUJhc2VUeXBlX3QgKSBwZFRSVUUgKQorCQlpZiggKCBweFRpbWVyLT51Y1N0YXR1cyAmIHRtclNUQVRVU19JU19BVVRPUkVMT0FEICkgIT0gMCApCiAJCXsKIAkJCS8qIENhbGN1bGF0ZSB0aGUgcmVsb2FkIHZhbHVlLCBhbmQgaWYgdGhlIHJlbG9hZCB2YWx1ZSByZXN1bHRzIGluCiAJCQl0aGUgdGltZXIgZ29pbmcgaW50byB0aGUgc2FtZSB0aW1lciBsaXN0IHRoZW4gaXQgaGFzIGFscmVhZHkgZXhwaXJlZApAQCAtOTQ0LDI4ICs5NjYsMzIgQEAKIAogQmFzZVR5cGVfdCB4VGltZXJJc1RpbWVyQWN0aXZlKCBUaW1lckhhbmRsZV90IHhUaW1lciApCiB7Ci1CYXNlVHlwZV90IHhUaW1lcklzSW5BY3RpdmVMaXN0OwotVGltZXJfdCAqcHhUaW1lciA9ICggVGltZXJfdCAqICkgeFRpbWVyOworQmFzZVR5cGVfdCB4UmV0dXJuOworVGltZXJfdCAqcHhUaW1lciA9IHhUaW1lcjsKIAogCWNvbmZpZ0FTU0VSVCggeFRpbWVyICk7CiAKIAkvKiBJcyB0aGUgdGltZXIgaW4gdGhlIGxpc3Qgb2YgYWN0aXZlIHRpbWVycz8gKi8KIAl0YXNrRU5URVJfQ1JJVElDQUwoKTsKIAl7Ci0JCS8qIENoZWNraW5nIHRvIHNlZSBpZiBpdCBpcyBpbiB0aGUgTlVMTCBsaXN0IGluIGVmZmVjdCBjaGVja3MgdG8gc2VlIGlmCi0JCWl0IGlzIHJlZmVyZW5jZWQgZnJvbSBlaXRoZXIgdGhlIGN1cnJlbnQgb3IgdGhlIG92ZXJmbG93IHRpbWVyIGxpc3RzIGluCi0JCW9uZSBnbywgYnV0IHRoZSBsb2dpYyBoYXMgdG8gYmUgcmV2ZXJzZWQsIGhlbmNlIHRoZSAnIScuICovCi0JCXhUaW1lcklzSW5BY3RpdmVMaXN0ID0gKCBCYXNlVHlwZV90ICkgISggbGlzdElTX0NPTlRBSU5FRF9XSVRISU4oIE5VTEwsICYoIHB4VGltZXItPnhUaW1lckxpc3RJdGVtICkgKSApOyAvKmxpbnQgIWU5NjEuIENhc3QgaXMgb25seSByZWR1bmRhbnQgd2hlbiBOVUxMIGlzIHBhc3NlZCBpbnRvIHRoZSBtYWNyby4gKi8KKwkJaWYoICggcHhUaW1lci0+dWNTdGF0dXMgJiB0bXJTVEFUVVNfSVNfQUNUSVZFICkgPT0gMCApCisJCXsKKwkJCXhSZXR1cm4gPSBwZEZBTFNFOworCQl9CisJCWVsc2UKKwkJeworCQkJeFJldHVybiA9IHBkVFJVRTsKKwkJfQogCX0KIAl0YXNrRVhJVF9DUklUSUNBTCgpOwogCi0JcmV0dXJuIHhUaW1lcklzSW5BY3RpdmVMaXN0OworCXJldHVybiB4UmV0dXJuOwogfSAvKmxpbnQgIWU4MTggQ2FuJ3QgYmUgcG9pbnRlciB0byBjb25zdCBkdWUgdG8gdGhlIHR5cGVkZWYuICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogdm9pZCAqcHZUaW1lckdldFRpbWVySUQoIGNvbnN0IFRpbWVySGFuZGxlX3QgeFRpbWVyICkKIHsKLVRpbWVyX3QgKiBjb25zdCBweFRpbWVyID0gKCBUaW1lcl90ICogKSB4VGltZXI7CitUaW1lcl90ICogY29uc3QgcHhUaW1lciA9IHhUaW1lcjsKIHZvaWQgKnB2UmV0dXJuOwogCiAJY29uZmlnQVNTRVJUKCB4VGltZXIgKTsKQEAgLTk4Miw3ICsxMDA4LDcgQEAKIAogdm9pZCB2VGltZXJTZXRUaW1lcklEKCBUaW1lckhhbmRsZV90IHhUaW1lciwgdm9pZCAqcHZOZXdJRCApCiB7Ci1UaW1lcl90ICogY29uc3QgcHhUaW1lciA9ICggVGltZXJfdCAqICkgeFRpbWVyOworVGltZXJfdCAqIGNvbnN0IHB4VGltZXIgPSB4VGltZXI7CiAKIAljb25maWdBU1NFUlQoIHhUaW1lciApOwogCmRpZmYgLS1naXQgYS9saW5rc190b19kb2NfcGFnZXNfZm9yX3RoZV9kZW1vX3Byb2plY3RzLnVybCBiL2xpbmtzX3RvX2RvY19wYWdlc19mb3JfdGhlX2RlbW9fcHJvamVjdHMudXJsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmQ1NTI2Li4wMDAwMDAwCi0tLSBhL2xpbmtzX3RvX2RvY19wYWdlc19mb3JfdGhlX2RlbW9fcHJvamVjdHMudXJsCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1bezAwMDIxNEEwLTAwMDAtMDAwMC1DMDAwLTAwMDAwMDAwMDA0Nn1dCi1Qcm9wMz0xOSwyCi1bSW50ZXJuZXRTaG9ydGN1dF0KLVVSTD1odHRwOi8vd3d3LmZyZWVydG9zLm9yZy9hMDAwOTAuaHRtbAotSURMaXN0PQpkaWZmIC0tZ2l0IGEvcmVhZG1lLnR4dCBiL3JlYWRtZS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvcmVhZG1lLnR4dAorKysgL2Rldi9udWxsCg==