LyoKCUZpbGU6CQlDRk1MYXRlSW1wb3J0LmgKCglDb250YWluczoJSW50ZXJmYWNlIHRvIENGTSBsYXRlIGltcG9ydCBsaWJyYXJ5LgoKCVdyaXR0ZW4gYnk6CVF1aW5uCgoJQ29weXJpZ2h0OglDb3B5cmlnaHQgqSAxOTk5IGJ5IEFwcGxlIENvbXB1dGVyLCBJbmMuLCBhbGwgcmlnaHRzIHJlc2VydmVkLgoKCQkJCVlvdSBtYXkgaW5jb3Jwb3JhdGUgdGhpcyBBcHBsZSBzYW1wbGUgc291cmNlIGNvZGUgaW50byB5b3VyIHByb2dyYW0ocykgd2l0aG91dAoJCQkJcmVzdHJpY3Rpb24uIFRoaXMgQXBwbGUgc2FtcGxlIHNvdXJjZSBjb2RlIGhhcyBiZWVuIHByb3ZpZGVkICJBUyBJUyIgYW5kIHRoZQoJCQkJcmVzcG9uc2liaWxpdHkgZm9yIGl0cyBvcGVyYXRpb24gaXMgeW91cnMuIFlvdSBhcmUgbm90IHBlcm1pdHRlZCB0byByZWRpc3RyaWJ1dGUKCQkJCXRoaXMgQXBwbGUgc2FtcGxlIHNvdXJjZSBjb2RlIGFzICJBcHBsZSBzYW1wbGUgc291cmNlIGNvZGUiIGFmdGVyIGhhdmluZyBtYWRlCgkJCQljaGFuZ2VzLiBJZiB5b3UncmUgZ29pbmcgdG8gcmUtZGlzdHJpYnV0ZSB0aGUgc291cmNlLCB3ZSByZXF1aXJlIHRoYXQgeW91IG1ha2UKCQkJCWl0IGNsZWFyIGluIHRoZSBzb3VyY2UgdGhhdCB0aGUgY29kZSB3YXMgZGVzY2VuZGVkIGZyb20gQXBwbGUgc2FtcGxlIHNvdXJjZQoJCQkJY29kZSwgYnV0IHRoYXQgeW91J3ZlIG1hZGUgY2hhbmdlcy4KCglDaGFuZ2UgSGlzdG9yeSAobW9zdCByZWNlbnQgZmlyc3QpOgoKICAgICAgICAgPDY+ICAgICAyMS85LzAxICAgIFF1aW5uICAgQ2hhbmdlcyBmb3IgQ1dQcm83IE1hY2gtTyBidWlsZC4KICAgICAgICAgPDU+ICAgICAxOS85LzAxICAgIFF1aW5uICAgQ2hhbmdlIGNvbW1lbnRzIHRvIHJlZmxlY3QgdGhlIGZhY3QgdGhhdCBhbiB1bnBhY2tlZCBkYXRhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb24gaXMgbm8gbG9uZ2VyIHJlcXVpcmVkLgogICAgICAgICA8ND4gICAgIDE5LzkvMDEgICAgUXVpbm4gICBTaW1wbGlmaWVkIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gYWZ0ZXIgYSBzdWdnZXN0aW9uIGJ5IEVyaWMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhbnQuIFlvdSBubyBsb25nZXIgaGF2ZSB0byBDRk0gZXhwb3J0IGEgZHVtbXkgZnVuY3Rpb247IHlvdQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW4ganVzdCBwYXNzIGluIHRoZSBhZGRyZXNzIG9mIHlvdXIgZnJhZ21lbnQncyBpbml0IHJvdXRpbmUuCiAgICAgICAgIDwzPiAgICAxNi8xMS8wMCAgICBRdWlubiAgIEFsbG93IHN5bWJvbCBmaW5kaW5nIHZpYSBhIGNhbGxiYWNrIGFuZCB1c2UgdGhhdCB0byBpbXBsZW1lbnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZCdW5kbGUgc3VwcG9ydC4KICAgICAgICAgPDI+ICAgIDE4LzEwLzk5ICAgIFF1aW5uICAgUmVuYW1lZCBDRk1MYXRlSW1wb3J0IHRvIENGTUxhdGVJbXBvcnRMaWJyYXJ5IHRvIGFsbG93IGZvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NzaWJsZSBmdXR1cmUgQVBJIGV4cGFuc2lvbi4KICAgICAgICAgPDE+ICAgICAxNS82Lzk5ICAgIFF1aW5uICAgRmlyc3QgY2hlY2tlZCBpbi4KKi8KCiNwcmFnbWEgb25jZQoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCi8vIE1vcmVJc0JldHRlciBTZXR1cAoKLy8jaW5jbHVkZSAiTW9yZVNldHVwLmgiCgovLyBNYWMgT1MgSW50ZXJmYWNlcwoKI2lmICEgTU9SRV9GUkFNRVdPUktfSU5DTFVERVMKCSNpbmNsdWRlIDxNYWNUeXBlcy5oPgoJI2luY2x1ZGUgPENvZGVGcmFnbWVudHMuaD4KCSNpbmNsdWRlIDxEZXZpY2VzLmg+CgkjaW5jbHVkZSA8Q0ZCdW5kbGUuaD4KI2VuZGlmCgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKI2lmZGVmIF9fY3BsdXNwbHVzCmV4dGVybiAiQyIgewojZW5kaWYKCi8qCUZBUQoJLS0tCgkKCVE6CVdoYXQgZG9lcyB0aGlzIGxpYnJhcnkgZG8/CglBOglJdCBhbGxvd3MgeW91IHRvIHJlc29sdmUgYSB3ZWFrIGxpbmtlZCBsaWJyYXJ5IGF0IHJ1bnRpbWUsCgkgICAJYnkgc3VwcGx5IGEgQ0ZNIGNvbm5lY3Rpb24gdG8gdGhlIGxpYnJhcnkgdGhhdCBzaG91bGQgc3Vic3RpdHV0ZQoJICAgCWZvciB0aGUgd2VhayBsaW5rZWQgb25lLgoJCglROglEb2VzIHRoZSBzdWJzdGl0dXRlZCBsaWJyYXJ5IGhhdmUgdG8gaGF2ZSB0aGUgc2FtZSBuYW1lIGFzIHRoZQoJCXdlYWsgbGlua2VkIGxpYnJhcnkuCglBOglOby4KCQoJUToJV2hhdCdzIHRoaXMgdXNlZnVsIGZvcj8KCUE6CVRoZSBtb3N0IG9idmlvdXMgZXhhbXBsZSBvZiB3aGVyZSB0aGlzIGlzIHVzZWZ1bCBpcyB3aGVuCgkJeW91IHJlbHkgb24gc2hhcmVkIGxpYnJhcmllcyB0aGF0IHRoZSB1c2VyIG1pZ2h0IGRlbGV0ZQoJCW9yIG1vdmUuICBUbyBjYW4gZmluZCB0aGUgc2hhcmVkIGxpYnJhcnkgKHBvc3NpYmx5IGV2ZW4KCQl1c2luZyBDYXRTZWFyY2gpLCBjYWxsIEdldERpc2tGcmFnbWVudCB0byBvcGVuIGEgY29ubmVjdGlvbgoJCXRvIGl0LCBsYXRlIGltcG9ydCBpdCB1c2luZyB0aGlzIGxpYnJhcnksIGFuZCB0aGVuIHRoZQoJCXJlc3Qgb2YgeW91ciBjb2RlIGNhbiBjb250aW51ZSB0byB1c2UgdGhlIHNoYXJlZCBsaWJyYXJ5CgkJYXMgaWYgbm90aGluZyBoYWQgaGFwcGVuZWQuICBObyBtb3JlIGRlZmluaW5nIHRob3VzYW5kcwoJCW9mIHN0dWIgcm91dGluZXMgd2hpY2ggY2FsbCB0aHJvdWdoIHJvdXRpbmUgcG9pbnRlcnMuCgkJCgkJVGhlcmUgYXJlLCBob3dldmVyLCBudW1lcm91cyBsZXNzIG9idmlvdXMgdXNlcy4gIFlvdSBjYW4KCQl1c2UgdGhpcyBjb2RlIHRvIG1ha2UgYSAnc2VsZiByZXBhaXJpbmcnIGFwcGxpY2F0aW9uLiAgSWYKCQl0aGUgdXNlciByZW1vdmVzIHlvdXIgc2hhcmVkIGxpYnJhcnkgZnJvbSB0aGUgRXh0ZW5zaW9ucwoJCWZvbGRlciwgdGhlIHN0YXJ0dXAgY29kZSBmb3IgeW91ciBhcHBsaWNhdGlvbiBjYW4gb2ZmZXIKCQl0b3IgcmUtaW5zdGFsbCBpdC4gIElmIHRoZSB1c2VyIGFncmVlcywgeW91IGNhbiB0aGVuCgkJcmUtaW5zdGFsbCB5b3VyIHNoYXJlZCBsaWJyYXJ5LCBsYXRlIGltcG9ydCBpdCwgYW5kIHRoZW4KCQljb250aW51ZSBydW5uaW5nIHlvdXIgYXBwbGljYXRpb24gaWYgbm90aGluZyBoYXBwZW5lZC4KCQkKCQlZb3UgY2FuIGV2ZW4gdXNlIHRoaXMgY29kZSB0byBmcmVlIHlvdXJzZWxmIGZyb20gdGhlCgkJRXh0ZW5zaW9ucyBmb2xkZXIgZW50aXJlbHkuICBTYXkgeW91IGhhdmUgYSBzdWl0ZSBvZgoJCWFwcGxpY2F0aW9ucyB0aGF0IGN1cnJlbnRseSBpbnN0YWxscyBhIGRvemVuIHNoYXJlZCAKCQlsaWJyYXJpZXMgaW4gdGhlIEV4dGVuc2lvbnMgZm9sZGVyLiAgWW91IGNhbiBtb3ZlIHRob3NlCgkJbGlicmFyaWVzIHRvIGFub3RoZXIgZm9sZGVyIGVudGlyZWx5IGFuZCBlYWNoIGFwcGxpY2F0aW9uJ3MKCQlzdGFydHVwIGNvZGUgY2FuIHRyYWNrIGRvd24gdGhlIGxpYnJhcnkgKHVzaW5nIGFuIGFsaWFzCgkJaW4gdGhlIFByZWZlcmVuY2VzIGZpbGUpIGFuZCBsYXRlIGltcG9ydCBpdC4KCQkKCQlBbiBldmVuIGNvb2xlciB1c2UgaXMgdG8gcHJvdmlkZSBlYXN5IGFic3RyYWN0aW9uIGxheWVycy4KCQlTYXkgeW91IGhhdmUgYSBuZXR3b3JrIGNvZGUgZm9yIGJvdGggdGhlIE1hY1RDUAoJCUFQSSBhbmQgdGhlIE9wZW4gVHJhbnNwb3J0IEFQSS4gIFR5cGljYWxseSwgeW91IHdvdWxkIGJlCgkJZm9yY2UgdG8gZG8gdGhpcyBieSBoYXZpbmcgYW4gYWJzdHJhY3Rpb24gbGF5ZXIgd2hlcmUgZXZlcnkKCQlyb3V0aW5lIGNvbnRhaW5zIGEgc3dpdGNoIGJldHdlZW4gTWFjVENQIGFuZCBPVC4gIFlvdXIKCQlPcGVuU29ja2V0IHJvdXRpbmUgbWlnaHQgbG9vayBsaWtlOgoKCQkJc3RhdGljIGludCBPcGVuU29ja2V0KHZvaWQpCgkJCXsKCQkJICAgIGlmIChnT1RBdmFpbGFibGUpIHsKCQkJICAgICAgICByZXR1cm4gT3BlblNvY2tldE9UKCk7CgkJCSAgICB9IGVsc2UgewoJCQkgICAgICAgIHJldHVybiBPcGVuU29ja2V0TWFjVENQKCk7CgkJCSAgICB9CgkJCX0KCQkKCQlXaXRoIHRoaXMgY29kZSwgeW91IGNhbiBhdm9pZCB0aGF0IGVudGlyZWx5LiAgU2ltcGx5CgkJd2VhayBsaW5rIHRvIGEgc2hhcmVkIGxpYnJhcnkgdGhhdCB5b3Uga25vdyBpcyBuZXZlcgoJCWdvaW5nIHRvIGJlIGltcGxlbWVudGVkICgiY3JlYTtNeVNvY2tldHNEdW1teSIpIGFuZCB0aGVuLCAKCQlhdCBydW50aW1lLCBkZWNpZGUgd2hldGhlciB0aGUgc3lzdGVtIGhhcyBNYWNUQ1Agb3IgT1QKCQlhbmQgbGF0ZSBpbXBvcnQgdGhlIHJlbGV2YW50IHJlYWwgaW1wbGVtZW50YXRpb24KCQkoImNyZWE7TXlTb2NrZXRzTWFjVENQIiBvciAiY3JlYTtNeVNvY2tldHNPVCIpLgoJCU9uZSBiZW5lZml0IG9mIHRoaXMgYXBwcm9hY2ggaXMgdGhhdCBvbmx5IHRoZSBNYWNUQ1Agb3IKCQl0aGUgT1QgY29kZSBpcyByZXNpZGVudCBpbiBtZW1vcnkgb24gYW55IGdpdmVuIHN5c3RlbS4KKi8KCnR5cGVkZWYgcGFzY2FsIE9TU3RhdHVzICgqQ0ZNTGF0ZUltcG9ydExvb2t1cFByb2MpKENvbnN0U3RyMjU1UGFyYW0gc3ltTmFtZSwgQ0ZyYWdTeW1ib2xDbGFzcyBzeW1DbGFzcywKCQkJCQkJCQkJCQkJCXZvaWQgKipzeW1BZGRyLCB2b2lkICpyZWZDb24pOwoJLy8gQ0ZNTGF0ZUltcG9ydExvb2t1cFByb2MgZGVmaW5lcyBhIGNhbGxiYWNrIGZvciBDRk1MYXRlSW1wb3J0Q29yZS4KCS8vIFRoZSByb3V0aW5lIGlzIGV4cGVjdGVkIHRvIGxvb2sgdXAgdGhlIGFkZHJlc3Mgb2YgdGhlIHN5bWJvbCBuYW1lZCAKCS8vIHN5bU5hbWUgYW5kIHJldHVybiBpdCBpbiAqc3ltQWRkci4gIFRoZSBzeW1ib2wgc2hvdWxkIGJlIG9mIGNsYXNzIAoJLy8gc3ltQ2xhc3MsIGFsdGhvdWdoIHRoZSBjYWxsYmFjayBkZWNpZGVzIHdoZXRoZXIgYSBjbGFzcyBtaXNtYXRjaCBpcyAKCS8vIGFuIGVycm9yLiAgcmVmQ29uIGlzIGFuIGFwcGxpY2F0aW9uIGRlZmluZWQgdmFsdWUgdGhhdCB3YXMgb3JpZ2luYWxseSAKCS8vIHBhc3NlZCBpbiB0byBDRk1MYXRlSW1wb3J0Q29yZS4KCS8vCgkvLyBJZiB0aGlzIHJvdXRpbmUgcmV0dXJucyBhbiBlcnJvciwgYSBzeW1ib2wgYWRkcmVzcyBvZiAwIGlzIGFzc3VtZWQuIAoJLy8gSWYgdGhlIHN5bWJvbCBpcyBtYXJrZWQgYXMgYSB3ZWFrIGltcG9ydCwgdGhlIENGTUxhdGVJbXBvcnRDb3JlIHdpbGwgCgkvLyBjb250aW51ZSwgb3RoZXJ3aXNlIHRoZSBDRk1MYXRlSW1wb3J0Q29yZSByb3V0aW5lIHdpbGwgZmFpbCB3aXRoIHRoZSAKCS8vIGVycm9yLgoJCmV4dGVybiBwYXNjYWwgT1NTdGF0dXMgQ0ZNTGF0ZUltcG9ydENvcmUoY29uc3QgQ0ZyYWdTeXN0ZW03RGlza0ZsYXRMb2NhdG9yICpmcmFnVG9GaXhMb2NhdG9yLAoJCQkJCQkJCQkJQ0ZyYWdDb25uZWN0aW9uSUQgZnJhZ1RvRml4Q29ubklELAoJCQkJCQkJCQkJQ0ZyYWdJbml0RnVuY3Rpb24gZnJhZ1RvRml4SW5pdFJvdXRpbmUsCgkJCQkJCQkJCQlDb25zdFN0cjI1NVBhcmFtIHdlYWtMaW5rZWRMaWJyYXJ5TmFtZSwKCQkJCQkJCQkJCUNGTUxhdGVJbXBvcnRMb29rdXBQcm9jIGxvb2t1cCwKCQkJCQkJCQkJCXZvaWQgKnJlZkNvbik7CgkvLyBUaGlzIHJvdXRpbmUgd2lsbCBsaW5rIHlvdSwgYXQgcnVudGltZSwgdG8gc29tZSBsaWJyYXJ5IAoJLy8gdGhhdCB5b3Ugd2VyZSB3ZWFrIGxpbmtlZCB0byBhbmQgd2Fzbid0IHByZXNlbnQgd2hlbiB5b3VyCgkvLyBmcmFnbWVudCB3YXMgcHJlcGFyZWQuICBBcyB3ZWxsIGFzIHRoZSBvYnZpb3VzIGZ1bmN0aW9uYWxpdHkKCS8vIG9mIGJlaW5nIGFibGUgdG8gcmVzb2x2ZSB3ZWFrIGxpbmtzIGFmdGVyIHByZXBhcmUgdGltZSwKCS8vIHRoaXMgZnVuY3Rpb25hbGl0eSBjYW4gYmUgcHV0IHRvIGEgbnVtYmVyIG9mIGxlc3Mgb2J2aW91cyB1c2VzLAoJLy8gc29tZSBvZiB3aGljaCBhcmUgZGlzY3Vzc2VkIGF0IHRoZSB0b3Agb2YgdGhpcyBoZWFkZXIgZmlsZS4KCS8vCgkvLyBUbyBjYWxsIHRoaXMgcm91dGluZSwgeW91IG5lZWQgYSBudW1iZXIgb2YgcGllY2VzIG9mIGluZm9ybWF0aW9uOgoJLy8KCS8vIDEuIGZyYWdUb0ZpeExvY2F0b3IsIGZyYWdUb0ZpeENvbm5JRDogIFRoZSBsb2NhdGlvbiBvZiB5b3VyIG93bgoJLy8gICAgY29kZSBmcmFnbWVudCBvbiBkaXNrIGFuZCB0aGUgQ0ZNIGNvbm5lY3Rpb24gSUQgdG8geW91ciBvd24KCS8vICAgIGNvZGUgZnJhZ21lbnQuICBUeXBpY2FsbHkgeW91IGdldCB0aGlzIGluZm9ybWF0aW9uIGZyb20geW91ciAKCS8vICAgIGZyYWdtZW50J3MgQ0ZNIGluaXQgcm91dGluZS4gIFlvdSBtdXN0IGVuc3VyZSB0aGF0CgkvLyAgICBmcmFnVG9GaXhMb2NhdG9yLT5maWxlU3BlYyBwb2ludHMgdG8gYW4gRlNTcGVjIG9mIHRoZQoJLy8gICAgZmlsZSB3aGljaCBob2xkcyB5b3VyIGNvZGUgZnJhZ21lbnQuCgkvLwoJLy8gICAgSU1QT1JUQU5UOgoJLy8gICAgVGhlIGZhY3QgdGhhdCB5b3UgcGFzcyBpbiBhIENGcmFnU3lzdGVtN0Rpc2tGbGF0TG9jYXRvciBhcyB0aGUKCS8vICAgIGZyYWdUb0ZpeExvY2F0b3IgaW1wbGllcyB0aGF0IHRoZSBmcmFnbWVudCB0byBiZSBmaXhlZCB1cCBtdXN0CgkvLyAgICBiZSBpbiB0aGUgZGF0YSBmb3JrIG9mIGEgZmlsZS4gIFRoZSBjb2RlIGNvdWxkIGJlIG1vZGlmaWVkCgkvLyAgICB0byByZW1vdmUgdGhpcyByZXF1aXJlbWVudCwgYnV0IG9uIGRpc2sgY29kZSBmcmFnbWVudHMgYXJlIHRoZSBtb3N0CgkvLyAgICBjb21tb24gY2FzZS4KCS8vCgkvLyAgICBJTVBPUlRBTlQ6CgkvLyAgICBUaGUgZnJhZ21lbnQgdG8gZml4IG1heSBoYXZlIGEgcGFja2VkIGRhdGEgc2VjdGlvbi4gIFBhY2tpbmcgdGhlIAoJLy8gICAgZGF0YSBzZWN0aW9uIHdpbGwgcmVkdWNlIHRoZSBzaXplIG9mIHlvdXIgZnJhZ21lbnQgb24gZGlzaywgYnV0IGl0IAoJLy8gICAgd2lsbCBzaWduaWZpY2FudGx5IGluY3JlYXNlIHRoZSBtZW1vcnkgbmVlZGVkIGJ5IHRoaXMgcm91dGluZSAKCS8vICAgIChpdCBpbmNyZWFzZXMgbWVtb3J5IHVzYWdlIGJ5IHRoZSBzdW0gb2YgdGhlIHNpemVzIG9mIHRoZSBwYWNrZWQgCgkvLyAgICBhbmQgdW5wYWNrZWQgZGF0YSBzZWN0aW9uKS4gIFNlZSBiZWxvdyBmb3IgaW5zdHJ1Y3Rpb25zIG9uIGhvdyB0byAKCS8vICAgIGNyZWF0ZSBhbiB1bnBhY2tlZCBkYXRhIHNlY3Rpb24uCgkvLwoJLy8gMi4gZnJhZ1RvRml4SW5pdFJvdXRpbmU6ICBBIHBvaW50ZXIgdG8geW91ciBvd24gY29kZSBmcmFnbWVudCdzCgkvLyAgICBmcmFnbWVudCBpbml0aWFsaXNlciByb3V0aW5lLiAgWW91IG5lY2Vzc2FyaWx5IGhhdmUgb25lIG9mIHRoZXNlIAoJLy8gICAgYmVjYXVzZSB5b3UgbmVlZCBpdCB0byBnZXQgdmFsdWVzIGZvciB0aGUgZnJhZ1RvRml4TG9jYXRvciBhbmQgCgkvLyAgICBmcmFnVG9GaXhDb25uSUQgcGFyYW1ldGVycy4gIEp1c3QgcGFzcyBpdHMgYWRkcmVzcyBpbiBhcyBhIHBhcmFtZXRlciAKCS8vICAgIGFzIHdlbGwuIAoJLy8KCS8vIDMuIHdlYWtMaW5rZWRMaWJyYXJ5TmFtZTogIFRoZSBuYW1lIG9mIHRoZSB3ZWFrIGxpbmtlZCBsaWJyYXJ5IHdoaWNoCgkvLyAgICBmYWlsZWQgdG8gbGluay4gIFlvdSBtdXN0IGhhdmUgd2VhayBsaW5rZWQgdG8gdGhpcyBsaWJyYXJ5LgoJLy8gICAgSXQgaXMgb3h5bW9yaWMgZm9yIHlvdSB0byBwYXNzIGEgc3Ryb25nIGxpbmtlZCBsaWJyYXJ5IGhlcmUsCgkvLyAgICBiZWNhdXNlIHlvdXIgY29kZSB3b3VsZCBub3QgaGF2ZSBwcmVwYXJlZCBpZiBhIHN0cm9uZyBsaW5rZWQKCS8vICAgIGxpYnJhcnkgZmFpbGVkIHRvIHByZXBhcmUsIGFuZCBzbyB5b3UgY291bGRuJ3Qgc3VwcGx5IGEgdmFsaWQKCS8vLyAgIGZyYWdUb0ZpeC4KCS8vCgkvLyA0LiBsb29rdXAsIHJlZkNvbjogIEEgcG9pbnRlciB0byBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgdGhlIAoJLy8JICByb3V0aW5lIGNhbGxzIHRvIGxvb2sgdXAgdGhlIGFkZHJlc3Mgb2YgYSBzeW1ib2wsIGFuZCBhIHJlZkNvbiAKCS8vICAgIGZvciB0aGF0IGNhbGxiYWNrIHJvdXRpbmUuCgkvLwoJLy8gTm90ZToKCS8vIFRoZSBmcmFnVG9GaXhMb2NhdG9yIGFuZCBmcmFnVG9GaXhJbml0Um91dGluZSBwYXJhbWV0ZXJzCgkvLyBhcmUgYXJ0aWZhY3RzIG9mIHRoZSB3YXkgaW4gd2hpY2ggdGhpcyBmdW5jdGlvbmFsaXR5IGlzIGltcGxlbWVudGVkLgoJLy8gSW4gYW4gaWRlYWwgd29ybGQsIHdoZXJlIENGTSBleHBvcnRlZCBkZWNlbnQgaW50cm9zcGVjdGlvbiBBUElzCgkvLyB0byB0aGlyZCBwYXJ0eSBkZXZlbG9wZXJzLCB0aGVzZSBwYXJhbWV0ZXJzIHdvdWxkIG5vdCBiZSBuZWNlc3NhcnkuCgkvLyBJZiB5b3UncmUgdXNpbmcgdGhpcyBjb2RlIGluc2lkZSBBcHBsZSwgeW91IHByb2JhYmx5IHNob3VsZCBpbnZlc3RpZ2F0ZQoJLy8gdXNpbmcgdGhlIENGTSBwcml2YXRlIEFQSXMgZm9yIGdldHRpbmcgYXQgdGhlIGluZm9ybWF0aW9uIHRoZXNlCgkvLyBwYXJhbWV0ZXJzIGFyZSBuZWVkZWQgZm9yLiAgU2VlIHRoZSBjb21tZW50cyBpbnNpZGUgdGhlIGltcGxlbWVudGF0aW9uCgkvLyBmb3IgbW9yZSBkZXRhaWxzLgoJLy8KCS8vIE5vdGU6CgkvLyBUaGUgZXh0cmEgbWVtb3J5IHRha2VuIHdoZW4geW91IHVzZSBhIHBhY2tlZCBkYXRhIHNlY3Rpb24gaXMgYWxzbyBhbiAKCS8vIGFydGlmYWN0IG9mIG15IHdvcmthcm91bmQgZm9yIHRoZSBsYWNrIG9mIENGTSBpbnRyb3NwZWN0aW9uIEFQSXMuICBJbiAKCS8vIG15IG9waW5pb24gaXQncyBiZXR0ZXIgdG8gdXNlIGFuIHVucGFja2VkIGRhdGEgc2VjdGlvbiBhbmQgY29uc3VtZSBtb3JlIAoJLy8gc3BhY2Ugb24gZGlzayB3aGlsZSBzYXZpbmcgbWVtb3J5LiAgSW4gQ29kZVdhcnJpb3IgeW91IGNhbiBzd2l0Y2ggdG8gYW4gCgkvLyB1bnBhY2tlZCBkYXRhIHNlY3Rpb24gYnkgY2hlY2tpbmcgdGhlICJFeHBhbmQgVW5pbml0aWFsaXplZCBEYXRhIiAKCS8vIGNoZWNrYm94IGluIHRoZSAiUFBDIFBFRiIgc2V0dGluZ3MgcGFuZWwuICBJbiBNUFcsIHNwZWNpZmllZCB0aGUKCS8vICItcGFja2RhdGEgb2ZmIiBvcHRpb24gdG8gUFBDTGluay4KCS8vCgkvLyBXaGVuIHRoZSByb3V0aW5lIHJldHVybnMsIGFueSBzeW1ib2xzIHRoYXQgeW91IGltcG9ydGVkIGZyb20gdGhlCgkvLyBsaWJyYXJ5IG5hbWVkIHdlYWtMaW5rZWRMaWJyYXJ5TmFtZSB3aWxsIGJlIHJlc29sdmVkIHRvIHRoZSBhZGRyZXNzCgkvLyBvZiB0aGUgc3ltYm9sIHByb3ZpZGVkIGJ5IHRoZSAibG9va3VwIiBjYWxsYmFjayByb3V0aW5lLgoJLy8KCS8vIEl0IGlzIHBvc3NpYmxlIGZvciBhbiB1bnJlc29sdmVkIGltcG9ydCB0byByZW1haW4gdW5yZXNvbHZlZCBhZnRlcgoJLy8gdGhpcyByb3V0aW5lIHJldHVybnMuICBJZiB0aGUgc3ltYm9sIGltcG9ydCBpcyBtYXJrZWQgYXMgd2VhayAoYXMKCS8vIG9wcG9zZWQgdG8gdGhlIGxpYnJhcnksIHdoaWNoICptdXN0KiBiZSBtYXJrZWQgYXMgd2VhaykgYW5kIHRoZSBzeW1ib2wKCS8vIGlzIG5vdCBmb3VuZCBieSB0aGUgImxvb2t1cCIgY2FsbGJhY2ssIHRoZSByb3V0aW5lIHdpbGwgc2ltcGxlIHNraXAgCgkvLyB0aGF0IHN5bWJvbC4gIElmIHRoZSBzeW1ib2wgaXNuJ3QgbWFya2VkIGFzIHdlYWssIHRoZSByb3V0aW5lIHdpbGwgZmFpbCAKCS8vIGluIHRoYXQgY2FzZS4KCS8vCgkvLyBNb3N0IG9mIHRoZSBwb3NzaWJsZSBlcnJvciByZXN1bHRzIGFyZSBjby1vcHRlZCBDRk0gZXJyb3JzLiAgVGhlc2UKCS8vIGluY2x1ZGU6CgkvLwoJLy8gY2ZyYWdGcmFnbWVudEZvcm1hdEVyciAgLS0gVGhlIGZyYWdtZW50IHRvIGZpeCBpcyBpcyBhbiB1bmtub3duIGZvcm1hdC4KCS8vIGNmcmFnTm9TZWN0aW9uRXJyICAgICAgIC0tIENvdWxkIG5vdCBmaW5kIHRoZSBsb2FkZXIgc2VjdGlvbiBpbiB0aGUgZnJhZ21lbnQgdG8gZml4LgoJLy8gY2ZyYWdOb0xpYnJhcnlFcnIgICAgICAgLS0gVGhlIGZyYWdtZW50IHRvIGZpeCBpcyBub3Qgd2VhayBsaW5rZWQgdG8gd2Vha0xpbmtlZExpYnJhcnlOYW1lLgoJLy8gY2ZyYWdGcmFnbWVudFVzYWdlRXJyICAgLS0gVGhlIGZyYWdtZW50IHRvIGZpeCBkb2Vzbid0IGhhdmUgYSBkYXRhIHNlY3Rpb24uCgkvLyAgICAgICAgICAgICAgICAgICAgICAgICAtLSBUaGUgZnJhZ21lbnQgdG8gZml4IGlzIHN0cm9uZyBsaW5rZWQgdG8gd2Vha0xpbmtlZExpYnJhcnlOYW1lLgoJLy8gICAgICAgICAgICAgICAgICAgICAgICAgLS0gVGhlIGZyYWdtZW50IGRvZXNuJ3QgaGF2ZSBhbiBpbml0IHJvdXRpbmUuCgkvLyBjZnJhZ0ZyYWdtZW50Q29ycnVwdEVyciAtLSBFbmNvdW50ZXJlZCBhbiB1bmRlZmluZWQgcmVsb2NhdGlvbiBvcGNvZGUuCgkvLyB1bmltcEVyciAgICAgICAgICAgICAgICAtLSBFbmNvdW50ZXJlZCBhbiB1bmltcGxlbWVudCByZWxvY2F0aW9uIG9wY29kZS4gIFRoZQoJLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsb2NhdGlvbiBlbmdpbmUgb25seSBpbXBsZW1lbnRzIGEgc3Vic2V0IG9mIHRoZSBDRk0KCS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbG9jYXRpb24gb3Bjb2RlcywgdGhlIHN1YnNldCBtb3N0IGNvbW1vbmx5IHVzZWQgYnkKCS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QVyBhbmQgQ29kZVdhcnJpb3IgUEVGIGNvbnRhaW5lcnMuICBJZiB5b3UgZW5jb3VudGVyCgkvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGVycm9yLCB5b3UnbGwgcHJvYmFibHkgaGF2ZSB0byBhZGQgdGhlIHdlaXJkCgkvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxvY2F0aW9uIG9wY29kZSB0byB0aGUgZW5naW5lLCB3aGljaCBzaG91bGRuJ3QgYmUKCS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHRvbyBoYXJkLgoJLy8gbWVtRnVsbEVycgkJCSAgIC0tIEl0J3MgbGlrZWx5IHRoYXQgdGhpcyBlcnJvciBpcyB0cmlnZ2VyZWQgYnkgdGhlIG1lbW9yeSAKCS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZCB0byB1bnBhY2sgeW91ciBkYXRhIHNlY3Rpb24uICBFaXRoZXIgbWFrZSB5b3VyIAoJLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSBzZWN0aW9uIHNtYWxsZXIsIG9yIHVucGFjayBpdCAoc2VlIGFib3ZlKS4KCS8vIGVycm9ycyByZXR1cm5lZCBieSBGaW5kU3ltYm9sCgkvLyBlcnJvcnMgcmV0dXJuZWQgYnkgTWVtb3J5IE1hbmFnZXIKCS8vCgkvLyBUaGUgcm91dGluZSBuZWVkcyBlbm91Z2ggbWVtb3J5IHRvIGhvbGQgdGhlIGxvYWRlciBzZWN0aW9uIG9mIHRoZSBmcmFnbWVudAoJLy8gdG8gZml4IGluIG1lbW9yeS4gIEl0IGFsbG9jYXRlcyB0aGF0IG1lbW9yeSB1c2luZyBOZXdQdHIgYW5kIGRpc3Bzb3NlcyBvZiAKCS8vIGl0IGJlZm9yZSBpdCByZXR1cm5zLiAgWW91IG1heSB3YW50IHRvIGNoYW5nZSB0aGUgbWVtb3J5IGFsbG9jYXRvciwgd2hpY2gKCS8vIGlzIHZlcnkgc2ltcGxlLgoKZXh0ZXJuIHBhc2NhbCBPU1N0YXR1cyBDRk1MYXRlSW1wb3J0TGlicmFyeShjb25zdCBDRnJhZ1N5c3RlbTdEaXNrRmxhdExvY2F0b3IgKmZyYWdUb0ZpeExvY2F0b3IsCgkJCQkJCQkJCQlDRnJhZ0Nvbm5lY3Rpb25JRCBmcmFnVG9GaXhDb25uSUQsCgkJCQkJCQkJCQlDRnJhZ0luaXRGdW5jdGlvbiBmcmFnVG9GaXhJbml0Um91dGluZSwKCQkJCQkJCQkJCUNvbnN0U3RyMjU1UGFyYW0gd2Vha0xpbmtlZExpYnJhcnlOYW1lLAoJCQkJCQkJCQkJQ0ZyYWdDb25uZWN0aW9uSUQgY29ubklEVG9JbXBvcnQpOwoJLy8gQSB3cmFwcGVyIGFyb3VuZCBDRk1MYXRlSW1wb3J0Q29yZSB0aGF0IGxvb2tzIHVwIHN5bWJvbHMgYnkgY2FsbGluZyAKCS8vIEZpbmRTeW1ib2wgb24gYSBjb25uZWN0aW9uIHRvIGEgQ0ZNIGxpYnJhcnkgKGNvbm5JRFRvSW1wb3J0KS4KCS8vIFlvdSBjYW4gZ2V0IHRoaXMgY29ubmVjdGlvbiBJRCB0aHJvdWdoIGFueSBzdGFuZGFyZCBDRk0gQVBJLCBmb3IgZXhhbXBsZQoJLy8gR2V0U2hhcmVkTGlicmFyeSwgR2V0RGlza0ZyYWdtZW50LCBvciBHZXRNZW1GcmFnbWVudC4KCS8vCgkvLyBJTVBPUlRBTlQ6CgkvLyBUaGUgZnJhZ21lbnQgbmFtZSBmb3IgY29ubklEVG9JbXBvcnQgKmRvZXMgbm90KiBoYXZlIHRvIG1hdGNoCgkvLyB3ZWFrTGlua2VkTGlicmFyeU5hbWUuICBUaGlzIGlzIHBhcnQgb2YgdGhlIHBvd2VyIG9mIHRoaXMgbGlicmFyeS4KCmV4dGVybiBwYXNjYWwgT1NTdGF0dXMgQ0ZNTGF0ZUltcG9ydEJ1bmRsZShjb25zdCBDRnJhZ1N5c3RlbTdEaXNrRmxhdExvY2F0b3IgKmZyYWdUb0ZpeExvY2F0b3IsCgkJCQkJCQkJCQlDRnJhZ0Nvbm5lY3Rpb25JRCBmcmFnVG9GaXhDb25uSUQsCgkJCQkJCQkJCQlDRnJhZ0luaXRGdW5jdGlvbiBmcmFnVG9GaXhJbml0Um91dGluZSwKCQkJCQkJCQkJCUNvbnN0U3RyMjU1UGFyYW0gd2Vha0xpbmtlZExpYnJhcnlOYW1lLAoJCQkJCQkJCQkJQ0ZCdW5kbGVSZWYgYnVuZGxlVG9JbXBvcnQpOwoJLy8gQSB3cmFwcGVyIGFyb3VuZCBDRk1MYXRlSW1wb3J0Q29yZSB0aGF0IGxvb2tzIHVwIHN5bWJvbHMgYnkgY2FsbGluZyAKCS8vIENGQnVuZGxlR2V0RnVuY3Rpb25Qb2ludGVyRm9yTmFtZSBvbiBhIHJlZmVyZW5jZSB0byBhIENvcmUgRm91bmRhdGlvbiAKCS8vIGJ1bmRsZSAoYnVuZGxlVG9JbXBvcnQpLiAgWW91IGNhbiBnZXQgdGhpcyByZWZlcmVuY2UgdGhyb3VnaCBhbnkgCgkvLyBDb3JlIEZvdW5kYXRpb24gYnVuZGxlIEFQSSwgZm9yIGV4YW1wbGUgQ0ZCdW5kbGVDcmVhdGUuCgojaWZkZWYgX19jcGx1c3BsdXMKfQojZW5kaWYK