LyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiAkRGF0ZTogICAgICAgIDUuIEZlYnJ1YXJ5IDIwMTMKICogJFJldmlzaW9uOiAgICBWMS4wMgogKgogKiBQcm9qZWN0OiAgICAgIENNU0lTLVJUT1MgQVBJCiAqIFRpdGxlOiAgICAgICAgY21zaXNfb3MuaCBoZWFkZXIgZmlsZQogKgogKiBWZXJzaW9uIDAuMDIKICogICAgSW5pdGlhbCBQcm9wb3NhbCBQaGFzZQogKiBWZXJzaW9uIDAuMDMKICogICAgb3NLZXJuZWxTdGFydCBhZGRlZCwgb3B0aW9uYWwgZmVhdHVyZTogbWFpbiBzdGFydGVkIGFzIHRocmVhZAogKiAgICBvc1NlbWFwaG9yZXMgaGF2ZSBzdGFuZGFyZCBiZWhhdmlvcgogKiAgICBvc1RpbWVyQ3JlYXRlIGRvZXMgbm90IHN0YXJ0IHRoZSB0aW1lciwgYWRkZWQgb3NUaW1lclN0YXJ0CiAqICAgIG9zVGhyZWFkUGFzcyBpcyByZW5hbWVkIHRvIG9zVGhyZWFkWWllbGQKICogVmVyc2lvbiAxLjAxCiAqICAgIFN1cHBvcnQgZm9yIEMrKyBpbnRlcmZhY2UKICogICAgIC0gY29uc3QgYXR0cmlidXRlIHJlbW92ZWQgZnJvbSB0aGUgb3NYeHh4RGVmX3QgdHlwZWRlZidzCiAqICAgICAtIGNvbnN0IGF0dHJpYnV0ZSBhZGRlZCB0byB0aGUgb3NYeHh4RGVmIG1hY3JvcwogKiAgICBBZGRlZDogb3NUaW1lckRlbGV0ZSwgb3NNdXRleERlbGV0ZSwgb3NTZW1hcGhvcmVEZWxldGUKICogICAgQWRkZWQ6IG9zS2VybmVsSW5pdGlhbGl6ZQogKiBWZXJzaW9uIDEuMDIKICogICAgQ29udHJvbCBmdW5jdGlvbnMgZm9yIHNob3J0IHRpbWVvdXRzIGluIG1pY3Jvc2Vjb25kIHJlc29sdXRpb246CiAqICAgIEFkZGVkOiBvc0tlcm5lbFN5c1RpY2ssIG9zS2VybmVsU3lzVGlja0ZyZXF1ZW5jeSwgb3NLZXJuZWxTeXNUaWNrTWljcm9TZWMKICogICAgUmVtb3ZlZDogb3NTaWduYWxHZXQgCiAqICAgIAogKiAgCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKgogKiBQb3J0aW9ucyBDb3B5cmlnaHQgqSAyMDE2IFNUTWljcm9lbGVjdHJvbmljcyBJbnRlcm5hdGlvbmFsIE4uVi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICogUG9ydGlvbnMgQ29weXJpZ2h0IChjKSAyMDEzIEFSTSBMSU1JVEVECiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKICogIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgogKiAgLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAogKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCiAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCiAqICAtIE5laXRoZXIgdGhlIG5hbWUgb2YgQVJNICBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQKICogICAgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKICogICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogKgogKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQogKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQogKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBCRQogKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCiAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCiAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwogKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgogKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQogKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQogKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKI2luY2x1ZGUgIkZyZWVSVE9TLmgiCiNpbmNsdWRlICJ0YXNrLmgiCiNpbmNsdWRlICJ0aW1lcnMuaCIKI2luY2x1ZGUgInF1ZXVlLmgiCiNpbmNsdWRlICJzZW1waHIuaCIKI2luY2x1ZGUgImV2ZW50X2dyb3Vwcy5oIgoKLyoqClxwYWdlIGNtc2lzX29zX2ggSGVhZGVyIEZpbGUgVGVtcGxhdGU6IGNtc2lzX29zLmgKClRoZSBmaWxlIFxiIGNtc2lzX29zLmggaXMgYSB0ZW1wbGF0ZSBoZWFkZXIgZmlsZSBmb3IgYSBDTVNJUy1SVE9TIGNvbXBsaWFudCBSZWFsLVRpbWUgT3BlcmF0aW5nIFN5c3RlbSAoUlRPUykuCkVhY2ggUlRPUyB0aGF0IGlzIGNvbXBsaWFudCB3aXRoIENNU0lTLVJUT1Mgc2hhbGwgcHJvdmlkZSBhIHNwZWNpZmljIFxiIGNtc2lzX29zLmggaGVhZGVyIGZpbGUgdGhhdCByZXByZXNlbnRzCml0cyBpbXBsZW1lbnRhdGlvbi4KClRoZSBmaWxlIGNtc2lzX29zLmggY29udGFpbnM6CiAtIENNU0lTLVJUT1MgQVBJIGZ1bmN0aW9uIGRlZmluaXRpb25zCiAtIHN0cnVjdCBkZWZpbml0aW9ucyBmb3IgcGFyYW1ldGVycyBhbmQgcmV0dXJuIHR5cGVzCiAtIHN0YXR1cyBhbmQgcHJpb3JpdHkgdmFsdWVzIHVzZWQgYnkgQ01TSVMtUlRPUyBBUEkgZnVuY3Rpb25zCiAtIG1hY3JvcyBmb3IgZGVmaW5pbmcgdGhyZWFkcyBhbmQgb3RoZXIga2VybmVsIG9iamVjdHMKCgo8Yj5OYW1lIGNvbnZlbnRpb25zIGFuZCBoZWFkZXIgZmlsZSBtb2RpZmljYXRpb25zPC9iPgoKQWxsIGRlZmluaXRpb25zIGFyZSBwcmVmaXhlZCB3aXRoIFxiIG9zIHRvIGdpdmUgYW4gdW5pcXVlIG5hbWUgc3BhY2UgZm9yIENNU0lTLVJUT1MgZnVuY3Rpb25zLgpEZWZpbml0aW9ucyB0aGF0IGFyZSBwcmVmaXhlZCBcYiBvc18gYXJlIG5vdCB1c2VkIGluIHRoZSBhcHBsaWNhdGlvbiBjb2RlIGJ1dCBsb2NhbCB0byB0aGlzIGhlYWRlciBmaWxlLgpBbGwgZGVmaW5pdGlvbnMgYW5kIGZ1bmN0aW9ucyB0aGF0IGJlbG9uZyB0byBhIG1vZHVsZSBhcmUgZ3JvdXBlZCBhbmQgaGF2ZSBhIGNvbW1vbiBwcmVmaXgsIGkuZS4gXGIgb3NUaHJlYWQuCgpEZWZpbml0aW9ucyB0aGF0IGFyZSBtYXJrZWQgd2l0aCA8Yj5DQU4gQkUgQ0hBTkdFRDwvYj4gY2FuIGJlIGFkYXB0ZWQgdG93YXJkcyB0aGUgbmVlZHMgb2YgdGhlIGFjdHVhbCBDTVNJUy1SVE9TIGltcGxlbWVudGF0aW9uLgpUaGVzZSBkZWZpbml0aW9ucyBjYW4gYmUgc3BlY2lmaWMgdG8gdGhlIHVuZGVybHlpbmcgUlRPUyBrZXJuZWwuCgpEZWZpbml0aW9ucyB0aGF0IGFyZSBtYXJrZWQgd2l0aCA8Yj5NVVNUIFJFTUFJTiBVTkNIQU5HRUQ8L2I+IGNhbm5vdCBiZSBhbHRlcmVkLiBPdGhlcndpc2UgdGhlIENNU0lTLVJUT1MgaW1wbGVtZW50YXRpb24gaXMgbm8gbG9uZ2VyCmNvbXBsaWFudCB0byB0aGUgc3RhbmRhcmQuIE5vdGUgdGhhdCBzb21lIGZ1bmN0aW9ucyBhcmUgb3B0aW9uYWwgYW5kIG5lZWQgbm90IHRvIGJlIHByb3ZpZGVkIGJ5IGV2ZXJ5IENNU0lTLVJUT1MgaW1wbGVtZW50YXRpb24uCgoKPGI+RnVuY3Rpb24gY2FsbHMgZnJvbSBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lczwvYj4KClRoZSBmb2xsb3dpbmcgQ01TSVMtUlRPUyBmdW5jdGlvbnMgY2FuIGJlIGNhbGxlZCBmcm9tIHRocmVhZHMgYW5kIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmVzIChJU1IpOgogIC0gXHJlZiBvc1NpZ25hbFNldAogIC0gXHJlZiBvc1NlbWFwaG9yZVJlbGVhc2UKICAtIFxyZWYgb3NQb29sQWxsb2MsIFxyZWYgb3NQb29sQ0FsbG9jLCBccmVmIG9zUG9vbEZyZWUKICAtIFxyZWYgb3NNZXNzYWdlUHV0LCBccmVmIG9zTWVzc2FnZUdldAogIC0gXHJlZiBvc01haWxBbGxvYywgXHJlZiBvc01haWxDQWxsb2MsIFxyZWYgb3NNYWlsR2V0LCBccmVmIG9zTWFpbFB1dCwgXHJlZiBvc01haWxGcmVlCgpGdW5jdGlvbnMgdGhhdCBjYW5ub3QgYmUgY2FsbGVkIGZyb20gYW4gSVNSIGFyZSB2ZXJpZnlpbmcgdGhlIGludGVycnVwdCBzdGF0dXMgYW5kIHJldHVybiBpbiBjYXNlIHRoYXQgdGhleSBhcmUgY2FsbGVkCmZyb20gYW4gSVNSIGNvbnRleHQgdGhlIHN0YXR1cyBjb2RlIFxiIG9zRXJyb3JJU1IuIEluIHNvbWUgaW1wbGVtZW50YXRpb25zIHRoaXMgY29uZGl0aW9uIG1pZ2h0IGJlIGNhdWdodCB1c2luZyB0aGUgSEFSRCBGQVVMVCB2ZWN0b3IuCgpTb21lIENNU0lTLVJUT1MgaW1wbGVtZW50YXRpb25zIHN1cHBvcnQgQ01TSVMtUlRPUyBmdW5jdGlvbiBjYWxscyBmcm9tIG11bHRpcGxlIElTUiBhdCB0aGUgc2FtZSB0aW1lLgpJZiB0aGlzIGlzIGltcG9zc2libGUsIHRoZSBDTVNJUy1SVE9TIHJlamVjdHMgY2FsbHMgYnkgbmVzdGVkIElTUiBmdW5jdGlvbnMgd2l0aCB0aGUgc3RhdHVzIGNvZGUgXGIgb3NFcnJvcklTUlJlY3Vyc2l2ZS4KCgo8Yj5EZWZpbmUgYW5kIHJlZmVyZW5jZSBvYmplY3QgZGVmaW5pdGlvbnM8L2I+CgpXaXRoIDxiPlwjZGVmaW5lIG9zT2JqZWN0c0V4dGVybmFsPC9iPiBvYmplY3RzIGFyZSBkZWZpbmVkIGFzIGV4dGVybmFsIHN5bWJvbHMuIFRoaXMgYWxsb3dzIHRvIGNyZWF0ZSBhIGNvbnNpc3RlbnQgaGVhZGVyIGZpbGUKdGhhdCBpcyB1c2VkIHRocm91Z2hvdXQgYSBwcm9qZWN0IGFzIHNob3duIGJlbG93OgoKPGk+SGVhZGVyIEZpbGU8L2k+Clxjb2RlCiNpbmNsdWRlIDxjbXNpc19vcy5oPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ01TSVMgUlRPUyBoZWFkZXIgZmlsZQoKLy8gVGhyZWFkIGRlZmluaXRpb24KZXh0ZXJuIHZvaWQgdGhyZWFkX3NhbXBsZSAodm9pZCBjb25zdCAqYXJndW1lbnQpOyAgICAgICAgICAgICAvLyBmdW5jdGlvbiBwcm90b3R5cGUKb3NUaHJlYWREZWYgKHRocmVhZF9zYW1wbGUsIG9zUHJpb3JpdHlCZWxvd05vcm1hbCwgMSwgMTAwKTsKCi8vIFBvb2wgZGVmaW5pdGlvbgpvc1Bvb2xEZWYoTXlQb29sLCAxMCwgbG9uZyk7ClxlbmRjb2RlCgoKVGhpcyBoZWFkZXIgZmlsZSBkZWZpbmVzIGFsbCBvYmplY3RzIHdoZW4gaW5jbHVkZWQgaW4gYSBDL0MrKyBzb3VyY2UgZmlsZS4gV2hlbiA8Yj5cI2RlZmluZSBvc09iamVjdHNFeHRlcm5hbDwvYj4gaXMKcHJlc2VudCBiZWZvcmUgdGhlIGhlYWRlciBmaWxlLCB0aGUgb2JqZWN0cyBhcmUgZGVmaW5lZCBhcyBleHRlcm5hbCBzeW1ib2xzLiBBIHNpbmdsZSBjb25zaXN0ZW50IGhlYWRlciBmaWxlIGNhbiB0aGVyZWZvcmUgYmUKdXNlZCB0aHJvdWdob3V0IHRoZSB3aG9sZSBwcm9qZWN0LgoKPGk+RXhhbXBsZTwvaT4KXGNvZGUKI2luY2x1ZGUgIm9zT2JqZWN0cy5oIiAgICAgLy8gRGVmaW5pdGlvbiBvZiB0aGUgQ01TSVMtUlRPUyBvYmplY3RzClxlbmRjb2RlCgpcY29kZQojZGVmaW5lIG9zT2JqZWN0RXh0ZXJuYWwgICAvLyBPYmplY3RzIHdpbGwgYmUgZGVmaW5lZCBhcyBleHRlcm5hbCBzeW1ib2xzCiNpbmNsdWRlICJvc09iamVjdHMuaCIgICAgIC8vIFJlZmVyZW5jZSB0byB0aGUgQ01TSVMtUlRPUyBvYmplY3RzClxlbmRjb2RlCgoqLwoKI2lmbmRlZiBfQ01TSVNfT1NfSAojZGVmaW5lIF9DTVNJU19PU19ICgovLy8gXG5vdGUgTVVTVCBSRU1BSU4gVU5DSEFOR0VEOiBcYiBvc0NNU0lTIGlkZW50aWZpZXMgdGhlIENNU0lTLVJUT1MgQVBJIHZlcnNpb24uCiNkZWZpbmUgb3NDTVNJUyAgICAgICAgICAgMHgxMDAwMiAgICAgIC8vLzwgQVBJIHZlcnNpb24gKG1haW4gWzMxOjE2XSAuc3ViIFsxNTowXSkKCi8vLyBcbm90ZSBDQU4gQkUgQ0hBTkdFRDogXGIgb3NDTVNJU19LRVJORUwgaWRlbnRpZmllcyB0aGUgdW5kZXJseWluZyBSVE9TIGtlcm5lbCBhbmQgdmVyc2lvbiBudW1iZXIuCiNkZWZpbmUgb3NDTVNJU19LRVJORUwgICAgMHgxMDAwMAkgICAvLy88IFJUT1MgaWRlbnRpZmljYXRpb24gYW5kIHZlcnNpb24gKG1haW4gWzMxOjE2XSAuc3ViIFsxNTowXSkKCi8vLyBcbm90ZSBNVVNUIFJFTUFJTiBVTkNIQU5HRUQ6IFxiIG9zS2VybmVsU3lzdGVtSWQgc2hhbGwgYmUgY29uc2lzdGVudCBpbiBldmVyeSBDTVNJUy1SVE9TLgojZGVmaW5lIG9zS2VybmVsU3lzdGVtSWQgIktFUk5FTCBWMS4wMCIgICAvLy88IFJUT1MgaWRlbnRpZmljYXRpb24gc3RyaW5nCgovLy8gXG5vdGUgTVVTVCBSRU1BSU4gVU5DSEFOR0VEOiBcYiBvc0ZlYXR1cmVfeHh4IHNoYWxsIGJlIGNvbnNpc3RlbnQgaW4gZXZlcnkgQ01TSVMtUlRPUy4KI2RlZmluZSBvc0ZlYXR1cmVfTWFpblRocmVhZCAgIDEgICAgICAgLy8vPCBtYWluIHRocmVhZCAgICAgIDE9bWFpbiBjYW4gYmUgdGhyZWFkLCAwPW5vdCBhdmFpbGFibGUKI2RlZmluZSBvc0ZlYXR1cmVfUG9vbCAgICAgICAgIDEgICAgICAgLy8vPCBNZW1vcnkgUG9vbHM6ICAgIDE9YXZhaWxhYmxlLCAwPW5vdCBhdmFpbGFibGUKI2RlZmluZSBvc0ZlYXR1cmVfTWFpbFEgICAgICAgIDEgICAgICAgLy8vPCBNYWlsIFF1ZXVlczogICAgIDE9YXZhaWxhYmxlLCAwPW5vdCBhdmFpbGFibGUKI2RlZmluZSBvc0ZlYXR1cmVfTWVzc2FnZVEgICAgIDEgICAgICAgLy8vPCBNZXNzYWdlIFF1ZXVlczogIDE9YXZhaWxhYmxlLCAwPW5vdCBhdmFpbGFibGUKI2RlZmluZSBvc0ZlYXR1cmVfU2lnbmFscyAgICAgIDggICAgICAgLy8vPCBtYXhpbXVtIG51bWJlciBvZiBTaWduYWwgRmxhZ3MgYXZhaWxhYmxlIHBlciB0aHJlYWQKI2RlZmluZSBvc0ZlYXR1cmVfU2VtYXBob3JlICAgIDEgICAgICAvLy88IG9zRmVhdHVyZV9TZW1hcGhvcmUgZnVuY3Rpb246IDE9YXZhaWxhYmxlLCAwPW5vdCBhdmFpbGFibGUKI2RlZmluZSBvc0ZlYXR1cmVfV2FpdCAgICAgICAgIDAgICAgICAgLy8vPCBvc1dhaXQgZnVuY3Rpb246IDE9YXZhaWxhYmxlLCAwPW5vdCBhdmFpbGFibGUKI2RlZmluZSBvc0ZlYXR1cmVfU3lzVGljayAgICAgIDEgICAgICAgLy8vPCBvc0tlcm5lbFN5c1RpY2sgZnVuY3Rpb25zOiAxPWF2YWlsYWJsZSwgMD1ub3QgYXZhaWxhYmxlCgojaWZkZWYgIF9fY3BsdXNwbHVzCmV4dGVybiAiQyIKewojZW5kaWYKCgovLyA9PT09IEVudW1lcmF0aW9uLCBzdHJ1Y3R1cmVzLCBkZWZpbmVzID09PT0KCi8vLyBQcmlvcml0eSB1c2VkIGZvciB0aHJlYWQgY29udHJvbC4KLy8vIFxub3RlIE1VU1QgUkVNQUlOIFVOQ0hBTkdFRDogXGIgb3NQcmlvcml0eSBzaGFsbCBiZSBjb25zaXN0ZW50IGluIGV2ZXJ5IENNU0lTLVJUT1MuCnR5cGVkZWYgZW51bSAgewogIG9zUHJpb3JpdHlJZGxlICAgICAgICAgID0gLTMsICAgICAgICAgIC8vLzwgcHJpb3JpdHk6IGlkbGUgKGxvd2VzdCkKICBvc1ByaW9yaXR5TG93ICAgICAgICAgICA9IC0yLCAgICAgICAgICAvLy88IHByaW9yaXR5OiBsb3cKICBvc1ByaW9yaXR5QmVsb3dOb3JtYWwgICA9IC0xLCAgICAgICAgICAvLy88IHByaW9yaXR5OiBiZWxvdyBub3JtYWwKICBvc1ByaW9yaXR5Tm9ybWFsICAgICAgICA9ICAwLCAgICAgICAgICAvLy88IHByaW9yaXR5OiBub3JtYWwgKGRlZmF1bHQpCiAgb3NQcmlvcml0eUFib3ZlTm9ybWFsICAgPSArMSwgICAgICAgICAgLy8vPCBwcmlvcml0eTogYWJvdmUgbm9ybWFsCiAgb3NQcmlvcml0eUhpZ2ggICAgICAgICAgPSArMiwgICAgICAgICAgLy8vPCBwcmlvcml0eTogaGlnaAogIG9zUHJpb3JpdHlSZWFsdGltZSAgICAgID0gKzMsICAgICAgICAgIC8vLzwgcHJpb3JpdHk6IHJlYWx0aW1lIChoaWdoZXN0KQogIG9zUHJpb3JpdHlFcnJvciAgICAgICAgID0gIDB4ODQgICAgICAgIC8vLzwgc3lzdGVtIGNhbm5vdCBkZXRlcm1pbmUgcHJpb3JpdHkgb3IgdGhyZWFkIGhhcyBpbGxlZ2FsIHByaW9yaXR5Cn0gb3NQcmlvcml0eTsKCi8vLyBUaW1lb3V0IHZhbHVlLgovLy8gXG5vdGUgTVVTVCBSRU1BSU4gVU5DSEFOR0VEOiBcYiBvc1dhaXRGb3JldmVyIHNoYWxsIGJlIGNvbnNpc3RlbnQgaW4gZXZlcnkgQ01TSVMtUlRPUy4KI2RlZmluZSBvc1dhaXRGb3JldmVyICAgICAweEZGRkZGRkZGICAgICAvLy88IHdhaXQgZm9yZXZlciB0aW1lb3V0IHZhbHVlCgovLy8gU3RhdHVzIGNvZGUgdmFsdWVzIHJldHVybmVkIGJ5IENNU0lTLVJUT1MgZnVuY3Rpb25zLgovLy8gXG5vdGUgTVVTVCBSRU1BSU4gVU5DSEFOR0VEOiBcYiBvc1N0YXR1cyBzaGFsbCBiZSBjb25zaXN0ZW50IGluIGV2ZXJ5IENNU0lTLVJUT1MuCnR5cGVkZWYgZW51bSAgewogIG9zT0sgICAgICAgICAgICAgICAgICAgID0gICAgIDAsICAgICAgIC8vLzwgZnVuY3Rpb24gY29tcGxldGVkOyBubyBlcnJvciBvciBldmVudCBvY2N1cnJlZC4KICBvc0V2ZW50U2lnbmFsICAgICAgICAgICA9ICAweDA4LCAgICAgICAvLy88IGZ1bmN0aW9uIGNvbXBsZXRlZDsgc2lnbmFsIGV2ZW50IG9jY3VycmVkLgogIG9zRXZlbnRNZXNzYWdlICAgICAgICAgID0gIDB4MTAsICAgICAgIC8vLzwgZnVuY3Rpb24gY29tcGxldGVkOyBtZXNzYWdlIGV2ZW50IG9jY3VycmVkLgogIG9zRXZlbnRNYWlsICAgICAgICAgICAgID0gIDB4MjAsICAgICAgIC8vLzwgZnVuY3Rpb24gY29tcGxldGVkOyBtYWlsIGV2ZW50IG9jY3VycmVkLgogIG9zRXZlbnRUaW1lb3V0ICAgICAgICAgID0gIDB4NDAsICAgICAgIC8vLzwgZnVuY3Rpb24gY29tcGxldGVkOyB0aW1lb3V0IG9jY3VycmVkLgogIG9zRXJyb3JQYXJhbWV0ZXIgICAgICAgID0gIDB4ODAsICAgICAgIC8vLzwgcGFyYW1ldGVyIGVycm9yOiBhIG1hbmRhdG9yeSBwYXJhbWV0ZXIgd2FzIG1pc3Npbmcgb3Igc3BlY2lmaWVkIGFuIGluY29ycmVjdCBvYmplY3QuCiAgb3NFcnJvclJlc291cmNlICAgICAgICAgPSAgMHg4MSwgICAgICAgLy8vPCByZXNvdXJjZSBub3QgYXZhaWxhYmxlOiBhIHNwZWNpZmllZCByZXNvdXJjZSB3YXMgbm90IGF2YWlsYWJsZS4KICBvc0Vycm9yVGltZW91dFJlc291cmNlICA9ICAweEMxLCAgICAgICAvLy88IHJlc291cmNlIG5vdCBhdmFpbGFibGUgd2l0aGluIGdpdmVuIHRpbWU6IGEgc3BlY2lmaWVkIHJlc291cmNlIHdhcyBub3QgYXZhaWxhYmxlIHdpdGhpbiB0aGUgdGltZW91dCBwZXJpb2QuCiAgb3NFcnJvcklTUiAgICAgICAgICAgICAgPSAgMHg4MiwgICAgICAgLy8vPCBub3QgYWxsb3dlZCBpbiBJU1IgY29udGV4dDogdGhlIGZ1bmN0aW9uIGNhbm5vdCBiZSBjYWxsZWQgZnJvbSBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lcy4KICBvc0Vycm9ySVNSUmVjdXJzaXZlICAgICA9ICAweDgzLCAgICAgICAvLy88IGZ1bmN0aW9uIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBmcm9tIElTUiB3aXRoIHNhbWUgb2JqZWN0LgogIG9zRXJyb3JQcmlvcml0eSAgICAgICAgID0gIDB4ODQsICAgICAgIC8vLzwgc3lzdGVtIGNhbm5vdCBkZXRlcm1pbmUgcHJpb3JpdHkgb3IgdGhyZWFkIGhhcyBpbGxlZ2FsIHByaW9yaXR5LgogIG9zRXJyb3JOb01lbW9yeSAgICAgICAgID0gIDB4ODUsICAgICAgIC8vLzwgc3lzdGVtIGlzIG91dCBvZiBtZW1vcnk6IGl0IHdhcyBpbXBvc3NpYmxlIHRvIGFsbG9jYXRlIG9yIHJlc2VydmUgbWVtb3J5IGZvciB0aGUgb3BlcmF0aW9uLgogIG9zRXJyb3JWYWx1ZSAgICAgICAgICAgID0gIDB4ODYsICAgICAgIC8vLzwgdmFsdWUgb2YgYSBwYXJhbWV0ZXIgaXMgb3V0IG9mIHJhbmdlLgogIG9zRXJyb3JPUyAgICAgICAgICAgICAgID0gIDB4RkYsICAgICAgIC8vLzwgdW5zcGVjaWZpZWQgUlRPUyBlcnJvcjogcnVuLXRpbWUgZXJyb3IgYnV0IG5vIG90aGVyIGVycm9yIG1lc3NhZ2UgZml0cy4KICBvc19zdGF0dXNfcmVzZXJ2ZWQgICAgICA9ICAweDdGRkZGRkZGICAvLy88IHByZXZlbnQgZnJvbSBlbnVtIGRvd24tc2l6ZSBjb21waWxlciBvcHRpbWl6YXRpb24uCn0gb3NTdGF0dXM7CgojaWYgKCBJTkNMVURFX2VUYXNrR2V0U3RhdGUgPT0gMSApCi8qIFRocmVhZCBzdGF0ZSByZXR1cm5lZCBieSBvc1RocmVhZEdldFN0YXRlICovCnR5cGVkZWYgZW51bSB7Cglvc1RocmVhZFJ1bm5pbmcgICA9IDB4MCwJICAgICAgLyogQSB0aHJlYWQgaXMgcXVlcnlpbmcgdGhlIHN0YXRlIG9mIGl0c2VsZiwgc28gbXVzdCBiZSBydW5uaW5nLiAqLwoJb3NUaHJlYWRSZWFkeSAgICAgPSAweDEgLAkJCSAgICAgICAgLyogVGhlIHRocmVhZCBiZWluZyBxdWVyaWVkIGlzIGluIGEgcmVhZCBvciBwZW5kaW5nIHJlYWR5IGxpc3QuICovCglvc1RocmVhZEJsb2NrZWQgICA9IDB4MiwJCSAgICAgICAgLyogVGhlIHRocmVhZCBiZWluZyBxdWVyaWVkIGlzIGluIHRoZSBCbG9ja2VkIHN0YXRlLiAqLwoJb3NUaHJlYWRTdXNwZW5kZWQgPSAweDMsCSAgICAgIC8qIFRoZSB0aHJlYWQgYmVpbmcgcXVlcmllZCBpcyBpbiB0aGUgU3VzcGVuZGVkIHN0YXRlLCBvciBpcyBpbiB0aGUgQmxvY2tlZCBzdGF0ZSB3aXRoIGFuIGluZmluaXRlIHRpbWUgb3V0LiAqLwoJb3NUaHJlYWREZWxldGVkICAgPSAweDQsCQkgICAgICAgICAgLyogVGhlIHRocmVhZCBiZWluZyBxdWVyaWVkIGhhcyBiZWVuIGRlbGV0ZWQsIGJ1dCBpdHMgVENCIGhhcyBub3QgeWV0IGJlZW4gZnJlZWQuICovICAgCiAgb3NUaHJlYWRFcnJvciAgICAgPSAweDdGRkZGRkZGCn0gb3NUaHJlYWRTdGF0ZTsKI2VuZGlmIC8qIElOQ0xVREVfZVRhc2tHZXRTdGF0ZSAqLwoKLy8vIFRpbWVyIHR5cGUgdmFsdWUgZm9yIHRoZSB0aW1lciBkZWZpbml0aW9uLgovLy8gXG5vdGUgTVVTVCBSRU1BSU4gVU5DSEFOR0VEOiBcYiBvc190aW1lcl90eXBlIHNoYWxsIGJlIGNvbnNpc3RlbnQgaW4gZXZlcnkgQ01TSVMtUlRPUy4KdHlwZWRlZiBlbnVtICB7CiAgb3NUaW1lck9uY2UgICAgICAgICAgICAgPSAgICAgMCwgICAgICAgLy8vPCBvbmUtc2hvdCB0aW1lcgogIG9zVGltZXJQZXJpb2RpYyAgICAgICAgID0gICAgIDEgICAgICAgIC8vLzwgcmVwZWF0aW5nIHRpbWVyCn0gb3NfdGltZXJfdHlwZTsKCi8vLyBFbnRyeSBwb2ludCBvZiBhIHRocmVhZC4KLy8vIFxub3RlIE1VU1QgUkVNQUlOIFVOQ0hBTkdFRDogXGIgb3NfcHRocmVhZCBzaGFsbCBiZSBjb25zaXN0ZW50IGluIGV2ZXJ5IENNU0lTLVJUT1MuCnR5cGVkZWYgdm9pZCAoKm9zX3B0aHJlYWQpICh2b2lkIGNvbnN0ICphcmd1bWVudCk7CgovLy8gRW50cnkgcG9pbnQgb2YgYSB0aW1lciBjYWxsIGJhY2sgZnVuY3Rpb24uCi8vLyBcbm90ZSBNVVNUIFJFTUFJTiBVTkNIQU5HRUQ6IFxiIG9zX3B0aW1lciBzaGFsbCBiZSBjb25zaXN0ZW50IGluIGV2ZXJ5IENNU0lTLVJUT1MuCnR5cGVkZWYgdm9pZCAoKm9zX3B0aW1lcikgKHZvaWQgY29uc3QgKmFyZ3VtZW50KTsKCi8vID4+PiB0aGUgZm9sbG93aW5nIGRhdGEgdHlwZSBkZWZpbml0aW9ucyBtYXkgc2hhbGwgYWRhcHRlZCB0b3dhcmRzIGEgc3BlY2lmaWMgUlRPUwoKLy8vIFRocmVhZCBJRCBpZGVudGlmaWVzIHRoZSB0aHJlYWQgKHBvaW50ZXIgdG8gYSB0aHJlYWQgY29udHJvbCBibG9jaykuCi8vLyBcbm90ZSBDQU4gQkUgQ0hBTkdFRDogXGIgb3NfdGhyZWFkX2NiIGlzIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIGluIGV2ZXJ5IENNU0lTLVJUT1MuCnR5cGVkZWYgVGFza0hhbmRsZV90IG9zVGhyZWFkSWQ7CgovLy8gVGltZXIgSUQgaWRlbnRpZmllcyB0aGUgdGltZXIgKHBvaW50ZXIgdG8gYSB0aW1lciBjb250cm9sIGJsb2NrKS4KLy8vIFxub3RlIENBTiBCRSBDSEFOR0VEOiBcYiBvc190aW1lcl9jYiBpcyBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBpbiBldmVyeSBDTVNJUy1SVE9TLgp0eXBlZGVmIFRpbWVySGFuZGxlX3Qgb3NUaW1lcklkOwoKLy8vIE11dGV4IElEIGlkZW50aWZpZXMgdGhlIG11dGV4IChwb2ludGVyIHRvIGEgbXV0ZXggY29udHJvbCBibG9jaykuCi8vLyBcbm90ZSBDQU4gQkUgQ0hBTkdFRDogXGIgb3NfbXV0ZXhfY2IgaXMgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgaW4gZXZlcnkgQ01TSVMtUlRPUy4KdHlwZWRlZiBTZW1hcGhvcmVIYW5kbGVfdCBvc011dGV4SWQ7CgovLy8gU2VtYXBob3JlIElEIGlkZW50aWZpZXMgdGhlIHNlbWFwaG9yZSAocG9pbnRlciB0byBhIHNlbWFwaG9yZSBjb250cm9sIGJsb2NrKS4KLy8vIFxub3RlIENBTiBCRSBDSEFOR0VEOiBcYiBvc19zZW1hcGhvcmVfY2IgaXMgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgaW4gZXZlcnkgQ01TSVMtUlRPUy4KdHlwZWRlZiBTZW1hcGhvcmVIYW5kbGVfdCBvc1NlbWFwaG9yZUlkOwoKLy8vIFBvb2wgSUQgaWRlbnRpZmllcyB0aGUgbWVtb3J5IHBvb2wgKHBvaW50ZXIgdG8gYSBtZW1vcnkgcG9vbCBjb250cm9sIGJsb2NrKS4KLy8vIFxub3RlIENBTiBCRSBDSEFOR0VEOiBcYiBvc19wb29sX2NiIGlzIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIGluIGV2ZXJ5IENNU0lTLVJUT1MuCnR5cGVkZWYgc3RydWN0IG9zX3Bvb2xfY2IgKm9zUG9vbElkOwoKLy8vIE1lc3NhZ2UgSUQgaWRlbnRpZmllcyB0aGUgbWVzc2FnZSBxdWV1ZSAocG9pbnRlciB0byBhIG1lc3NhZ2UgcXVldWUgY29udHJvbCBibG9jaykuCi8vLyBcbm90ZSBDQU4gQkUgQ0hBTkdFRDogXGIgb3NfbWVzc2FnZVFfY2IgaXMgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgaW4gZXZlcnkgQ01TSVMtUlRPUy4KdHlwZWRlZiBRdWV1ZUhhbmRsZV90IG9zTWVzc2FnZVFJZDsKCi8vLyBNYWlsIElEIGlkZW50aWZpZXMgdGhlIG1haWwgcXVldWUgKHBvaW50ZXIgdG8gYSBtYWlsIHF1ZXVlIGNvbnRyb2wgYmxvY2spLgovLy8gXG5vdGUgQ0FOIEJFIENIQU5HRUQ6IFxiIG9zX21haWxRX2NiIGlzIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIGluIGV2ZXJ5IENNU0lTLVJUT1MuCnR5cGVkZWYgc3RydWN0IG9zX21haWxRX2NiICpvc01haWxRSWQ7CgoKI2lmKCBjb25maWdTVVBQT1JUX1NUQVRJQ19BTExPQ0FUSU9OID09IDEgKQoKdHlwZWRlZiBTdGF0aWNUYXNrX3QgICAgICAgICAgICAgICBvc1N0YXRpY1RocmVhZERlZl90Owp0eXBlZGVmIFN0YXRpY1RpbWVyX3QgICAgICAgICAgICAgIG9zU3RhdGljVGltZXJEZWZfdDsKdHlwZWRlZiBTdGF0aWNTZW1hcGhvcmVfdCAgICAgICAgICBvc1N0YXRpY011dGV4RGVmX3Q7ICAgICAgICAgCnR5cGVkZWYgU3RhdGljU2VtYXBob3JlX3QgICAgICAgICAgb3NTdGF0aWNTZW1hcGhvcmVEZWZfdDsKdHlwZWRlZiBTdGF0aWNRdWV1ZV90ICAgICAgICAgICAgICBvc1N0YXRpY01lc3NhZ2VRRGVmX3Q7CgojZW5kaWYKCgoKCi8vLyBUaHJlYWQgRGVmaW5pdGlvbiBzdHJ1Y3R1cmUgY29udGFpbnMgc3RhcnR1cCBpbmZvcm1hdGlvbiBvZiBhIHRocmVhZC4KLy8vIFxub3RlIENBTiBCRSBDSEFOR0VEOiBcYiBvc190aHJlYWRfZGVmIGlzIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIGluIGV2ZXJ5IENNU0lTLVJUT1MuCnR5cGVkZWYgc3RydWN0IG9zX3RocmVhZF9kZWYgIHsKICBjaGFyICAgICAgICAgICAgICAgICAgICpuYW1lOyAgICAgICAgLy8vPCBUaHJlYWQgbmFtZSAKICBvc19wdGhyZWFkICAgICAgICAgICAgIHB0aHJlYWQ7ICAgICAgLy8vPCBzdGFydCBhZGRyZXNzIG9mIHRocmVhZCBmdW5jdGlvbgogIG9zUHJpb3JpdHkgICAgICAgICAgICAgdHByaW9yaXR5OyAgICAvLy88IGluaXRpYWwgdGhyZWFkIHByaW9yaXR5CiAgdWludDMyX3QgICAgICAgICAgICAgICBpbnN0YW5jZXM7ICAgIC8vLzwgbWF4aW11bSBudW1iZXIgb2YgaW5zdGFuY2VzIG9mIHRoYXQgdGhyZWFkIGZ1bmN0aW9uCiAgdWludDMyX3QgICAgICAgICAgICAgICBzdGFja3NpemU7ICAgIC8vLzwgc3RhY2sgc2l6ZSByZXF1aXJlbWVudHMgaW4gYnl0ZXM7IDAgaXMgZGVmYXVsdCBzdGFjayBzaXplCiNpZiggY29uZmlnU1VQUE9SVF9TVEFUSUNfQUxMT0NBVElPTiA9PSAxICkKICB1aW50MzJfdCAgICAgICAgICAgICAgICpidWZmZXI7ICAgICAgLy8vPCBzdGFjayBidWZmZXIgZm9yIHN0YXRpYyBhbGxvY2F0aW9uOyBOVUxMIGZvciBkeW5hbWljIGFsbG9jYXRpb24KICBvc1N0YXRpY1RocmVhZERlZl90ICAgICpjb250cm9sYmxvY2s7ICAgICAvLy88IGNvbnRyb2wgYmxvY2sgdG8gaG9sZCB0aHJlYWQncyBkYXRhIGZvciBzdGF0aWMgYWxsb2NhdGlvbjsgTlVMTCBmb3IgZHluYW1pYyBhbGxvY2F0aW9uCiNlbmRpZgp9IG9zVGhyZWFkRGVmX3Q7CgovLy8gVGltZXIgRGVmaW5pdGlvbiBzdHJ1Y3R1cmUgY29udGFpbnMgdGltZXIgcGFyYW1ldGVycy4KLy8vIFxub3RlIENBTiBCRSBDSEFOR0VEOiBcYiBvc190aW1lcl9kZWYgaXMgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgaW4gZXZlcnkgQ01TSVMtUlRPUy4KdHlwZWRlZiBzdHJ1Y3Qgb3NfdGltZXJfZGVmICB7CiAgb3NfcHRpbWVyICAgICAgICAgICAgICAgICBwdGltZXI7ICAgIC8vLzwgc3RhcnQgYWRkcmVzcyBvZiBhIHRpbWVyIGZ1bmN0aW9uCiNpZiggY29uZmlnU1VQUE9SVF9TVEFUSUNfQUxMT0NBVElPTiA9PSAxICkKICBvc1N0YXRpY1RpbWVyRGVmX3QgICAgICAgICpjb250cm9sYmxvY2s7ICAgICAgLy8vPCBjb250cm9sIGJsb2NrIHRvIGhvbGQgdGltZXIncyBkYXRhIGZvciBzdGF0aWMgYWxsb2NhdGlvbjsgTlVMTCBmb3IgZHluYW1pYyBhbGxvY2F0aW9uCiNlbmRpZgp9IG9zVGltZXJEZWZfdDsKCi8vLyBNdXRleCBEZWZpbml0aW9uIHN0cnVjdHVyZSBjb250YWlucyBzZXR1cCBpbmZvcm1hdGlvbiBmb3IgYSBtdXRleC4KLy8vIFxub3RlIENBTiBCRSBDSEFOR0VEOiBcYiBvc19tdXRleF9kZWYgaXMgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgaW4gZXZlcnkgQ01TSVMtUlRPUy4KdHlwZWRlZiBzdHJ1Y3Qgb3NfbXV0ZXhfZGVmICB7CiAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgZHVtbXk7ICAgIC8vLzwgZHVtbXkgdmFsdWUuCiNpZiggY29uZmlnU1VQUE9SVF9TVEFUSUNfQUxMT0NBVElPTiA9PSAxICkKICBvc1N0YXRpY011dGV4RGVmX3QgICAgICAgICAqY29udHJvbGJsb2NrOyAgICAgIC8vLzwgY29udHJvbCBibG9jayBmb3Igc3RhdGljIGFsbG9jYXRpb247IE5VTEwgZm9yIGR5bmFtaWMgYWxsb2NhdGlvbgojZW5kaWYKfSBvc011dGV4RGVmX3Q7CgovLy8gU2VtYXBob3JlIERlZmluaXRpb24gc3RydWN0dXJlIGNvbnRhaW5zIHNldHVwIGluZm9ybWF0aW9uIGZvciBhIHNlbWFwaG9yZS4KLy8vIFxub3RlIENBTiBCRSBDSEFOR0VEOiBcYiBvc19zZW1hcGhvcmVfZGVmIGlzIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIGluIGV2ZXJ5IENNU0lTLVJUT1MuCnR5cGVkZWYgc3RydWN0IG9zX3NlbWFwaG9yZV9kZWYgIHsKICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICBkdW1teTsgICAgLy8vPCBkdW1teSB2YWx1ZS4KI2lmKCBjb25maWdTVVBQT1JUX1NUQVRJQ19BTExPQ0FUSU9OID09IDEgKQogIG9zU3RhdGljU2VtYXBob3JlRGVmX3QgICAgICpjb250cm9sYmxvY2s7ICAgICAgLy8vPCBjb250cm9sIGJsb2NrIGZvciBzdGF0aWMgYWxsb2NhdGlvbjsgTlVMTCBmb3IgZHluYW1pYyBhbGxvY2F0aW9uCiNlbmRpZgp9IG9zU2VtYXBob3JlRGVmX3Q7CgovLy8gRGVmaW5pdGlvbiBzdHJ1Y3R1cmUgZm9yIG1lbW9yeSBibG9jayBhbGxvY2F0aW9uLgovLy8gXG5vdGUgQ0FOIEJFIENIQU5HRUQ6IFxiIG9zX3Bvb2xfZGVmIGlzIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIGluIGV2ZXJ5IENNU0lTLVJUT1MuCnR5cGVkZWYgc3RydWN0IG9zX3Bvb2xfZGVmICB7CiAgdWludDMyX3QgICAgICAgICAgICAgICAgIHBvb2xfc3o7ICAgIC8vLzwgbnVtYmVyIG9mIGl0ZW1zIChlbGVtZW50cykgaW4gdGhlIHBvb2wKICB1aW50MzJfdCAgICAgICAgICAgICAgICAgaXRlbV9zejsgICAgLy8vPCBzaXplIG9mIGFuIGl0ZW0KICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAqcG9vbDsgICAgLy8vPCBwb2ludGVyIHRvIG1lbW9yeSBmb3IgcG9vbAp9IG9zUG9vbERlZl90OwoKLy8vIERlZmluaXRpb24gc3RydWN0dXJlIGZvciBtZXNzYWdlIHF1ZXVlLgovLy8gXG5vdGUgQ0FOIEJFIENIQU5HRUQ6IFxiIG9zX21lc3NhZ2VRX2RlZiBpcyBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBpbiBldmVyeSBDTVNJUy1SVE9TLgp0eXBlZGVmIHN0cnVjdCBvc19tZXNzYWdlUV9kZWYgIHsKICB1aW50MzJfdCAgICAgICAgICAgICAgICBxdWV1ZV9zejsgICAgLy8vPCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHF1ZXVlCiAgdWludDMyX3QgICAgICAgICAgICAgICAgaXRlbV9zejsgICAgLy8vPCBzaXplIG9mIGFuIGl0ZW0KI2lmKCBjb25maWdTVVBQT1JUX1NUQVRJQ19BTExPQ0FUSU9OID09IDEgKQogIHVpbnQ4X3QgICAgICAgICAgICAgICAgICpidWZmZXI7ICAgICAgLy8vPCBidWZmZXIgZm9yIHN0YXRpYyBhbGxvY2F0aW9uOyBOVUxMIGZvciBkeW5hbWljIGFsbG9jYXRpb24KICBvc1N0YXRpY01lc3NhZ2VRRGVmX3QgICAqY29udHJvbGJsb2NrOyAgICAgLy8vPCBjb250cm9sIGJsb2NrIHRvIGhvbGQgcXVldWUncyBkYXRhIGZvciBzdGF0aWMgYWxsb2NhdGlvbjsgTlVMTCBmb3IgZHluYW1pYyBhbGxvY2F0aW9uCiNlbmRpZgogIC8vdm9pZCAgICAgICAgICAgICAgICAgICAgICAgKnBvb2w7ICAgIC8vLzwgbWVtb3J5IGFycmF5IGZvciBtZXNzYWdlcwp9IG9zTWVzc2FnZVFEZWZfdDsKCi8vLyBEZWZpbml0aW9uIHN0cnVjdHVyZSBmb3IgbWFpbCBxdWV1ZS4KLy8vIFxub3RlIENBTiBCRSBDSEFOR0VEOiBcYiBvc19tYWlsUV9kZWYgaXMgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgaW4gZXZlcnkgQ01TSVMtUlRPUy4KdHlwZWRlZiBzdHJ1Y3Qgb3NfbWFpbFFfZGVmICB7CiAgdWludDMyX3QgICAgICAgICAgICAgICAgcXVldWVfc3o7ICAgIC8vLzwgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBxdWV1ZQogIHVpbnQzMl90ICAgICAgICAgICAgICAgICBpdGVtX3N6OyAgICAvLy88IHNpemUgb2YgYW4gaXRlbQogIHN0cnVjdCBvc19tYWlsUV9jYiAqKmNiOwp9IG9zTWFpbFFEZWZfdDsKCi8vLyBFdmVudCBzdHJ1Y3R1cmUgY29udGFpbnMgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgYW4gZXZlbnQuCi8vLyBcbm90ZSBNVVNUIFJFTUFJTiBVTkNIQU5HRUQ6IFxiIG9zX2V2ZW50IHNoYWxsIGJlIGNvbnNpc3RlbnQgaW4gZXZlcnkgQ01TSVMtUlRPUy4KLy8vICAgICAgIEhvd2V2ZXIgdGhlIHN0cnVjdCBtYXkgYmUgZXh0ZW5kZWQgYXQgdGhlIGVuZC4KdHlwZWRlZiBzdHJ1Y3QgIHsKICBvc1N0YXR1cyAgICAgICAgICAgICAgICAgc3RhdHVzOyAgICAgLy8vPCBzdGF0dXMgY29kZTogZXZlbnQgb3IgZXJyb3IgaW5mb3JtYXRpb24KICB1bmlvbiAgewogICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgIHY7ICAgICAvLy88IG1lc3NhZ2UgYXMgMzItYml0IHZhbHVlCiAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAqcDsgICAgIC8vLzwgbWVzc2FnZSBvciBtYWlsIGFzIHZvaWQgcG9pbnRlcgogICAgaW50MzJfdCAgICAgICAgICAgICAgIHNpZ25hbHM7ICAgICAvLy88IHNpZ25hbCBmbGFncwogIH0gdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IGV2ZW50IHZhbHVlCiAgdW5pb24gIHsKICAgIG9zTWFpbFFJZCAgICAgICAgICAgICBtYWlsX2lkOyAgICAgLy8vPCBtYWlsIGlkIG9idGFpbmVkIGJ5IFxyZWYgb3NNYWlsQ3JlYXRlCiAgICBvc01lc3NhZ2VRSWQgICAgICAgbWVzc2FnZV9pZDsgICAgIC8vLzwgbWVzc2FnZSBpZCBvYnRhaW5lZCBieSBccmVmIG9zTWVzc2FnZUNyZWF0ZQogIH0gZGVmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IGV2ZW50IGRlZmluaXRpb24KfSBvc0V2ZW50OwoKCi8vICA9PT09IEtlcm5lbCBDb250cm9sIEZ1bmN0aW9ucyA9PT09CgovLy8gSW5pdGlhbGl6ZSB0aGUgUlRPUyBLZXJuZWwgZm9yIGNyZWF0aW5nIG9iamVjdHMuCi8vLyBccmV0dXJuIHN0YXR1cyBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBleGVjdXRpb24gc3RhdHVzIG9mIHRoZSBmdW5jdGlvbi4KLy8vIFxub3RlIE1VU1QgUkVNQUlOIFVOQ0hBTkdFRDogXGIgb3NLZXJuZWxJbml0aWFsaXplIHNoYWxsIGJlIGNvbnNpc3RlbnQgaW4gZXZlcnkgQ01TSVMtUlRPUy4Kb3NTdGF0dXMgb3NLZXJuZWxJbml0aWFsaXplICh2b2lkKTsKCi8vLyBTdGFydCB0aGUgUlRPUyBLZXJuZWwuCi8vLyBccmV0dXJuIHN0YXR1cyBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBleGVjdXRpb24gc3RhdHVzIG9mIHRoZSBmdW5jdGlvbi4KLy8vIFxub3RlIE1VU1QgUkVNQUlOIFVOQ0hBTkdFRDogXGIgb3NLZXJuZWxTdGFydCBzaGFsbCBiZSBjb25zaXN0ZW50IGluIGV2ZXJ5IENNU0lTLVJUT1MuCm9zU3RhdHVzIG9zS2VybmVsU3RhcnQgKHZvaWQpOwoKLy8vIENoZWNrIGlmIHRoZSBSVE9TIGtlcm5lbCBpcyBhbHJlYWR5IHN0YXJ0ZWQuCi8vLyBcbm90ZSBNVVNUIFJFTUFJTiBVTkNIQU5HRUQ6IFxiIG9zS2VybmVsUnVubmluZyBzaGFsbCBiZSBjb25zaXN0ZW50IGluIGV2ZXJ5IENNU0lTLVJUT1MuCi8vLyBccmV0dXJuIDAgUlRPUyBpcyBub3Qgc3RhcnRlZCwgMSBSVE9TIGlzIHN0YXJ0ZWQuCmludDMyX3Qgb3NLZXJuZWxSdW5uaW5nKHZvaWQpOwoKI2lmIChkZWZpbmVkIChvc0ZlYXR1cmVfU3lzVGljaykgICYmICAob3NGZWF0dXJlX1N5c1RpY2sgIT0gMCkpICAgICAvLyBTeXN0ZW0gVGltZXIgYXZhaWxhYmxlCgovLy8gR2V0IHRoZSBSVE9TIGtlcm5lbCBzeXN0ZW0gdGltZXIgY291bnRlciAKLy8vIFxub3RlIE1VU1QgUkVNQUlOIFVOQ0hBTkdFRDogXGIgb3NLZXJuZWxTeXNUaWNrIHNoYWxsIGJlIGNvbnNpc3RlbnQgaW4gZXZlcnkgQ01TSVMtUlRPUy4KLy8vIFxyZXR1cm4gUlRPUyBrZXJuZWwgc3lzdGVtIHRpbWVyIGFzIDMyLWJpdCB2YWx1ZSAKdWludDMyX3Qgb3NLZXJuZWxTeXNUaWNrICh2b2lkKTsKCi8vLyBUaGUgUlRPUyBrZXJuZWwgc3lzdGVtIHRpbWVyIGZyZXF1ZW5jeSBpbiBIegovLy8gXG5vdGUgUmVmbGVjdHMgdGhlIHN5c3RlbSB0aW1lciBzZXR0aW5nIGFuZCBpcyB0eXBpY2FsbHkgZGVmaW5lZCBpbiBhIGNvbmZpZ3VyYXRpb24gZmlsZS4KI2RlZmluZSBvc0tlcm5lbFN5c1RpY2tGcmVxdWVuY3kgICAgICAoY29uZmlnVElDS19SQVRFX0haKQoKLy8vIENvbnZlcnQgYSBtaWNyb3NlY29uZHMgdmFsdWUgdG8gYSBSVE9TIGtlcm5lbCBzeXN0ZW0gdGltZXIgdmFsdWUuCi8vLyBccGFyYW0gICAgICAgICBtaWNyb3NlYyAgICAgdGltZSB2YWx1ZSBpbiBtaWNyb3NlY29uZHMuCi8vLyBccmV0dXJuIHRpbWUgdmFsdWUgbm9ybWFsaXplZCB0byB0aGUgXHJlZiBvc0tlcm5lbFN5c1RpY2tGcmVxdWVuY3kKI2RlZmluZSBvc0tlcm5lbFN5c1RpY2tNaWNyb1NlYyhtaWNyb3NlYykgKCgodWludDY0X3QpbWljcm9zZWMgKiAob3NLZXJuZWxTeXNUaWNrRnJlcXVlbmN5KSkgLyAxMDAwMDAwKQoKI2VuZGlmICAgIC8vIFN5c3RlbSBUaW1lciBhdmFpbGFibGUKCi8vICA9PT09IFRocmVhZCBNYW5hZ2VtZW50ID09PT0KCi8vLyBDcmVhdGUgYSBUaHJlYWQgRGVmaW5pdGlvbiB3aXRoIGZ1bmN0aW9uLCBwcmlvcml0eSwgYW5kIHN0YWNrIHJlcXVpcmVtZW50cy4KLy8vIFxwYXJhbSAgICAgICAgIG5hbWUgICAgICAgICBuYW1lIG9mIHRoZSB0aHJlYWQgZnVuY3Rpb24uCi8vLyBccGFyYW0gICAgICAgICBwcmlvcml0eSAgICAgaW5pdGlhbCBwcmlvcml0eSBvZiB0aGUgdGhyZWFkIGZ1bmN0aW9uLgovLy8gXHBhcmFtICAgICAgICAgaW5zdGFuY2VzICAgIG51bWJlciBvZiBwb3NzaWJsZSB0aHJlYWQgaW5zdGFuY2VzLgovLy8gXHBhcmFtICAgICAgICAgc3RhY2tzeiAgICAgIHN0YWNrIHNpemUgKGluIGJ5dGVzKSByZXF1aXJlbWVudHMgZm9yIHRoZSB0aHJlYWQgZnVuY3Rpb24uCi8vLyBcbm90ZSBDQU4gQkUgQ0hBTkdFRDogVGhlIHBhcmFtZXRlcnMgdG8gXGIgb3NUaHJlYWREZWYgc2hhbGwgYmUgY29uc2lzdGVudCBidXQgdGhlCi8vLyAgICAgICBtYWNybyBib2R5IGlzIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIGluIGV2ZXJ5IENNU0lTLVJUT1MuCiNpZiBkZWZpbmVkIChvc09iamVjdHNFeHRlcm5hbCkgIC8vIG9iamVjdCBpcyBleHRlcm5hbAojZGVmaW5lIG9zVGhyZWFkRGVmKG5hbWUsIHRocmVhZCwgcHJpb3JpdHksIGluc3RhbmNlcywgc3RhY2tzeikgIFwKZXh0ZXJuIGNvbnN0IG9zVGhyZWFkRGVmX3Qgb3NfdGhyZWFkX2RlZl8jI25hbWUKI2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVmaW5lIHRoZSBvYmplY3QKCiNpZiggY29uZmlnU1VQUE9SVF9TVEFUSUNfQUxMT0NBVElPTiA9PSAxICkKI2RlZmluZSBvc1RocmVhZERlZihuYW1lLCB0aHJlYWQsIHByaW9yaXR5LCBpbnN0YW5jZXMsIHN0YWNrc3opICBcCmNvbnN0IG9zVGhyZWFkRGVmX3Qgb3NfdGhyZWFkX2RlZl8jI25hbWUgPSBcCnsgI25hbWUsICh0aHJlYWQpLCAocHJpb3JpdHkpLCAoaW5zdGFuY2VzKSwgKHN0YWNrc3opLCBOVUxMLCBOVUxMIH0KCiNkZWZpbmUgb3NUaHJlYWRTdGF0aWNEZWYobmFtZSwgdGhyZWFkLCBwcmlvcml0eSwgaW5zdGFuY2VzLCBzdGFja3N6LCBidWZmZXIsIGNvbnRyb2wpICBcCmNvbnN0IG9zVGhyZWFkRGVmX3Qgb3NfdGhyZWFkX2RlZl8jI25hbWUgPSBcCnsgI25hbWUsICh0aHJlYWQpLCAocHJpb3JpdHkpLCAoaW5zdGFuY2VzKSwgKHN0YWNrc3opLCAoYnVmZmVyKSwgKGNvbnRyb2wpIH0KI2Vsc2UgLy9jb25maWdTVVBQT1JUX1NUQVRJQ19BTExPQ0FUSU9OID09IDAKCiNkZWZpbmUgb3NUaHJlYWREZWYobmFtZSwgdGhyZWFkLCBwcmlvcml0eSwgaW5zdGFuY2VzLCBzdGFja3N6KSAgXApjb25zdCBvc1RocmVhZERlZl90IG9zX3RocmVhZF9kZWZfIyNuYW1lID0gXAp7ICNuYW1lLCAodGhyZWFkKSwgKHByaW9yaXR5KSwgKGluc3RhbmNlcyksIChzdGFja3N6KX0KI2VuZGlmCiNlbmRpZgoKLy8vIEFjY2VzcyBhIFRocmVhZCBkZWZpbml0aW9uLgovLy8gXHBhcmFtICAgICAgICAgbmFtZSAgICAgICAgICBuYW1lIG9mIHRoZSB0aHJlYWQgZGVmaW5pdGlvbiBvYmplY3QuCi8vLyBcbm90ZSBDQU4gQkUgQ0hBTkdFRDogVGhlIHBhcmFtZXRlciB0byBcYiBvc1RocmVhZCBzaGFsbCBiZSBjb25zaXN0ZW50IGJ1dCB0aGUKLy8vICAgICAgIG1hY3JvIGJvZHkgaXMgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgaW4gZXZlcnkgQ01TSVMtUlRPUy4KI2RlZmluZSBvc1RocmVhZChuYW1lKSAgXAomb3NfdGhyZWFkX2RlZl8jI25hbWUKCi8vLyBDcmVhdGUgYSB0aHJlYWQgYW5kIGFkZCBpdCB0byBBY3RpdmUgVGhyZWFkcyBhbmQgc2V0IGl0IHRvIHN0YXRlIFJFQURZLgovLy8gXHBhcmFtW2luXSAgICAgdGhyZWFkX2RlZiAgICB0aHJlYWQgZGVmaW5pdGlvbiByZWZlcmVuY2VkIHdpdGggXHJlZiBvc1RocmVhZC4KLy8vIFxwYXJhbVtpbl0gICAgIGFyZ3VtZW50ICAgICAgcG9pbnRlciB0aGF0IGlzIHBhc3NlZCB0byB0aGUgdGhyZWFkIGZ1bmN0aW9uIGFzIHN0YXJ0IGFyZ3VtZW50LgovLy8gXHJldHVybiB0aHJlYWQgSUQgZm9yIHJlZmVyZW5jZSBieSBvdGhlciBmdW5jdGlvbnMgb3IgTlVMTCBpbiBjYXNlIG9mIGVycm9yLgovLy8gXG5vdGUgTVVTVCBSRU1BSU4gVU5DSEFOR0VEOiBcYiBvc1RocmVhZENyZWF0ZSBzaGFsbCBiZSBjb25zaXN0ZW50IGluIGV2ZXJ5IENNU0lTLVJUT1MuCm9zVGhyZWFkSWQgb3NUaHJlYWRDcmVhdGUgKGNvbnN0IG9zVGhyZWFkRGVmX3QgKnRocmVhZF9kZWYsIHZvaWQgKmFyZ3VtZW50KTsKCi8vLyBSZXR1cm4gdGhlIHRocmVhZCBJRCBvZiB0aGUgY3VycmVudCBydW5uaW5nIHRocmVhZC4KLy8vIFxyZXR1cm4gdGhyZWFkIElEIGZvciByZWZlcmVuY2UgYnkgb3RoZXIgZnVuY3Rpb25zIG9yIE5VTEwgaW4gY2FzZSBvZiBlcnJvci4KLy8vIFxub3RlIE1VU1QgUkVNQUlOIFVOQ0hBTkdFRDogXGIgb3NUaHJlYWRHZXRJZCBzaGFsbCBiZSBjb25zaXN0ZW50IGluIGV2ZXJ5IENNU0lTLVJUT1MuCm9zVGhyZWFkSWQgb3NUaHJlYWRHZXRJZCAodm9pZCk7CgovLy8gVGVybWluYXRlIGV4ZWN1dGlvbiBvZiBhIHRocmVhZCBhbmQgcmVtb3ZlIGl0IGZyb20gQWN0aXZlIFRocmVhZHMuCi8vLyBccGFyYW1baW5dICAgICB0aHJlYWRfaWQgICB0aHJlYWQgSUQgb2J0YWluZWQgYnkgXHJlZiBvc1RocmVhZENyZWF0ZSBvciBccmVmIG9zVGhyZWFkR2V0SWQuCi8vLyBccmV0dXJuIHN0YXR1cyBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBleGVjdXRpb24gc3RhdHVzIG9mIHRoZSBmdW5jdGlvbi4KLy8vIFxub3RlIE1VU1QgUkVNQUlOIFVOQ0hBTkdFRDogXGIgb3NUaHJlYWRUZXJtaW5hdGUgc2hhbGwgYmUgY29uc2lzdGVudCBpbiBldmVyeSBDTVNJUy1SVE9TLgpvc1N0YXR1cyBvc1RocmVhZFRlcm1pbmF0ZSAob3NUaHJlYWRJZCB0aHJlYWRfaWQpOwoKLy8vIFBhc3MgY29udHJvbCB0byBuZXh0IHRocmVhZCB0aGF0IGlzIGluIHN0YXRlIFxiIFJFQURZLgovLy8gXHJldHVybiBzdGF0dXMgY29kZSB0aGF0IGluZGljYXRlcyB0aGUgZXhlY3V0aW9uIHN0YXR1cyBvZiB0aGUgZnVuY3Rpb24uCi8vLyBcbm90ZSBNVVNUIFJFTUFJTiBVTkNIQU5HRUQ6IFxiIG9zVGhyZWFkWWllbGQgc2hhbGwgYmUgY29uc2lzdGVudCBpbiBldmVyeSBDTVNJUy1SVE9TLgpvc1N0YXR1cyBvc1RocmVhZFlpZWxkICh2b2lkKTsKCi8vLyBDaGFuZ2UgcHJpb3JpdHkgb2YgYW4gYWN0aXZlIHRocmVhZC4KLy8vIFxwYXJhbVtpbl0gICAgIHRocmVhZF9pZCAgICAgdGhyZWFkIElEIG9idGFpbmVkIGJ5IFxyZWYgb3NUaHJlYWRDcmVhdGUgb3IgXHJlZiBvc1RocmVhZEdldElkLgovLy8gXHBhcmFtW2luXSAgICAgcHJpb3JpdHkgICAgICBuZXcgcHJpb3JpdHkgdmFsdWUgZm9yIHRoZSB0aHJlYWQgZnVuY3Rpb24uCi8vLyBccmV0dXJuIHN0YXR1cyBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBleGVjdXRpb24gc3RhdHVzIG9mIHRoZSBmdW5jdGlvbi4KLy8vIFxub3RlIE1VU1QgUkVNQUlOIFVOQ0hBTkdFRDogXGIgb3NUaHJlYWRTZXRQcmlvcml0eSBzaGFsbCBiZSBjb25zaXN0ZW50IGluIGV2ZXJ5IENNU0lTLVJUT1MuCm9zU3RhdHVzIG9zVGhyZWFkU2V0UHJpb3JpdHkgKG9zVGhyZWFkSWQgdGhyZWFkX2lkLCBvc1ByaW9yaXR5IHByaW9yaXR5KTsKCi8vLyBHZXQgY3VycmVudCBwcmlvcml0eSBvZiBhbiBhY3RpdmUgdGhyZWFkLgovLy8gXHBhcmFtW2luXSAgICAgdGhyZWFkX2lkICAgICB0aHJlYWQgSUQgb2J0YWluZWQgYnkgXHJlZiBvc1RocmVhZENyZWF0ZSBvciBccmVmIG9zVGhyZWFkR2V0SWQuCi8vLyBccmV0dXJuIGN1cnJlbnQgcHJpb3JpdHkgdmFsdWUgb2YgdGhlIHRocmVhZCBmdW5jdGlvbi4KLy8vIFxub3RlIE1VU1QgUkVNQUlOIFVOQ0hBTkdFRDogXGIgb3NUaHJlYWRHZXRQcmlvcml0eSBzaGFsbCBiZSBjb25zaXN0ZW50IGluIGV2ZXJ5IENNU0lTLVJUT1MuCm9zUHJpb3JpdHkgb3NUaHJlYWRHZXRQcmlvcml0eSAob3NUaHJlYWRJZCB0aHJlYWRfaWQpOwoKCi8vICA9PT09IEdlbmVyaWMgV2FpdCBGdW5jdGlvbnMgPT09PQoKLy8vIFdhaXQgZm9yIFRpbWVvdXQgKFRpbWUgRGVsYXkpLgovLy8gXHBhcmFtW2luXSAgICAgbWlsbGlzZWMgICAgICB0aW1lIGRlbGF5IHZhbHVlCi8vLyBccmV0dXJuIHN0YXR1cyBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBleGVjdXRpb24gc3RhdHVzIG9mIHRoZSBmdW5jdGlvbi4Kb3NTdGF0dXMgb3NEZWxheSAodWludDMyX3QgbWlsbGlzZWMpOwoKI2lmIChkZWZpbmVkIChvc0ZlYXR1cmVfV2FpdCkgICYmICAob3NGZWF0dXJlX1dhaXQgIT0gMCkpICAgICAvLyBHZW5lcmljIFdhaXQgYXZhaWxhYmxlCgovLy8gV2FpdCBmb3IgU2lnbmFsLCBNZXNzYWdlLCBNYWlsLCBvciBUaW1lb3V0LgovLy8gXHBhcmFtW2luXSBtaWxsaXNlYyAgICAgICAgICB0aW1lb3V0IHZhbHVlIG9yIDAgaW4gY2FzZSBvZiBubyB0aW1lLW91dAovLy8gXHJldHVybiBldmVudCB0aGF0IGNvbnRhaW5zIHNpZ25hbCwgbWVzc2FnZSwgb3IgbWFpbCBpbmZvcm1hdGlvbiBvciBlcnJvciBjb2RlLgovLy8gXG5vdGUgTVVTVCBSRU1BSU4gVU5DSEFOR0VEOiBcYiBvc1dhaXQgc2hhbGwgYmUgY29uc2lzdGVudCBpbiBldmVyeSBDTVNJUy1SVE9TLgpvc0V2ZW50IG9zV2FpdCAodWludDMyX3QgbWlsbGlzZWMpOwoKI2VuZGlmICAvLyBHZW5lcmljIFdhaXQgYXZhaWxhYmxlCgoKLy8gID09PT0gVGltZXIgTWFuYWdlbWVudCBGdW5jdGlvbnMgPT09PQovLy8gRGVmaW5lIGEgVGltZXIgb2JqZWN0LgovLy8gXHBhcmFtICAgICAgICAgbmFtZSAgICAgICAgICBuYW1lIG9mIHRoZSB0aW1lciBvYmplY3QuCi8vLyBccGFyYW0gICAgICAgICBmdW5jdGlvbiAgICAgIG5hbWUgb2YgdGhlIHRpbWVyIGNhbGwgYmFjayBmdW5jdGlvbi4KLy8vIFxub3RlIENBTiBCRSBDSEFOR0VEOiBUaGUgcGFyYW1ldGVyIHRvIFxiIG9zVGltZXJEZWYgc2hhbGwgYmUgY29uc2lzdGVudCBidXQgdGhlCi8vLyAgICAgICBtYWNybyBib2R5IGlzIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIGluIGV2ZXJ5IENNU0lTLVJUT1MuCiNpZiBkZWZpbmVkIChvc09iamVjdHNFeHRlcm5hbCkgIC8vIG9iamVjdCBpcyBleHRlcm5hbAojZGVmaW5lIG9zVGltZXJEZWYobmFtZSwgZnVuY3Rpb24pICBcCmV4dGVybiBjb25zdCBvc1RpbWVyRGVmX3Qgb3NfdGltZXJfZGVmXyMjbmFtZQojZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWZpbmUgdGhlIG9iamVjdAoKI2lmKCBjb25maWdTVVBQT1JUX1NUQVRJQ19BTExPQ0FUSU9OID09IDEgKSAKI2RlZmluZSBvc1RpbWVyRGVmKG5hbWUsIGZ1bmN0aW9uKSAgXApjb25zdCBvc1RpbWVyRGVmX3Qgb3NfdGltZXJfZGVmXyMjbmFtZSA9IFwKeyAoZnVuY3Rpb24pLCBOVUxMIH0KCiNkZWZpbmUgb3NUaW1lclN0YXRpY0RlZihuYW1lLCBmdW5jdGlvbiwgY29udHJvbCkgIFwKY29uc3Qgb3NUaW1lckRlZl90IG9zX3RpbWVyX2RlZl8jI25hbWUgPSBcCnsgKGZ1bmN0aW9uKSwgKGNvbnRyb2wpIH0KI2Vsc2UgLy9jb25maWdTVVBQT1JUX1NUQVRJQ19BTExPQ0FUSU9OID09IDAKI2RlZmluZSBvc1RpbWVyRGVmKG5hbWUsIGZ1bmN0aW9uKSAgXApjb25zdCBvc1RpbWVyRGVmX3Qgb3NfdGltZXJfZGVmXyMjbmFtZSA9IFwKeyAoZnVuY3Rpb24pIH0KI2VuZGlmCiNlbmRpZgoKLy8vIEFjY2VzcyBhIFRpbWVyIGRlZmluaXRpb24uCi8vLyBccGFyYW0gICAgICAgICBuYW1lICAgICAgICAgIG5hbWUgb2YgdGhlIHRpbWVyIG9iamVjdC4KLy8vIFxub3RlIENBTiBCRSBDSEFOR0VEOiBUaGUgcGFyYW1ldGVyIHRvIFxiIG9zVGltZXIgc2hhbGwgYmUgY29uc2lzdGVudCBidXQgdGhlCi8vLyAgICAgICBtYWNybyBib2R5IGlzIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIGluIGV2ZXJ5IENNU0lTLVJUT1MuCiNkZWZpbmUgb3NUaW1lcihuYW1lKSBcCiZvc190aW1lcl9kZWZfIyNuYW1lCgovLy8gQ3JlYXRlIGEgdGltZXIuCi8vLyBccGFyYW1baW5dICAgICB0aW1lcl9kZWYgICAgIHRpbWVyIG9iamVjdCByZWZlcmVuY2VkIHdpdGggXHJlZiBvc1RpbWVyLgovLy8gXHBhcmFtW2luXSAgICAgdHlwZSAgICAgICAgICBvc1RpbWVyT25jZSBmb3Igb25lLXNob3Qgb3Igb3NUaW1lclBlcmlvZGljIGZvciBwZXJpb2RpYyBiZWhhdmlvci4KLy8vIFxwYXJhbVtpbl0gICAgIGFyZ3VtZW50ICAgICAgYXJndW1lbnQgdG8gdGhlIHRpbWVyIGNhbGwgYmFjayBmdW5jdGlvbi4KLy8vIFxyZXR1cm4gdGltZXIgSUQgZm9yIHJlZmVyZW5jZSBieSBvdGhlciBmdW5jdGlvbnMgb3IgTlVMTCBpbiBjYXNlIG9mIGVycm9yLgovLy8gXG5vdGUgTVVTVCBSRU1BSU4gVU5DSEFOR0VEOiBcYiBvc1RpbWVyQ3JlYXRlIHNoYWxsIGJlIGNvbnNpc3RlbnQgaW4gZXZlcnkgQ01TSVMtUlRPUy4Kb3NUaW1lcklkIG9zVGltZXJDcmVhdGUgKGNvbnN0IG9zVGltZXJEZWZfdCAqdGltZXJfZGVmLCBvc190aW1lcl90eXBlIHR5cGUsIHZvaWQgKmFyZ3VtZW50KTsKCi8vLyBTdGFydCBvciByZXN0YXJ0IGEgdGltZXIuCi8vLyBccGFyYW1baW5dICAgICB0aW1lcl9pZCAgICAgIHRpbWVyIElEIG9idGFpbmVkIGJ5IFxyZWYgb3NUaW1lckNyZWF0ZS4KLy8vIFxwYXJhbVtpbl0gICAgIG1pbGxpc2VjICAgICAgdGltZSBkZWxheSB2YWx1ZSBvZiB0aGUgdGltZXIuCi8vLyBccmV0dXJuIHN0YXR1cyBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBleGVjdXRpb24gc3RhdHVzIG9mIHRoZSBmdW5jdGlvbi4KLy8vIFxub3RlIE1VU1QgUkVNQUlOIFVOQ0hBTkdFRDogXGIgb3NUaW1lclN0YXJ0IHNoYWxsIGJlIGNvbnNpc3RlbnQgaW4gZXZlcnkgQ01TSVMtUlRPUy4Kb3NTdGF0dXMgb3NUaW1lclN0YXJ0IChvc1RpbWVySWQgdGltZXJfaWQsIHVpbnQzMl90IG1pbGxpc2VjKTsKCi8vLyBTdG9wIHRoZSB0aW1lci4KLy8vIFxwYXJhbVtpbl0gICAgIHRpbWVyX2lkICAgICAgdGltZXIgSUQgb2J0YWluZWQgYnkgXHJlZiBvc1RpbWVyQ3JlYXRlLgovLy8gXHJldHVybiBzdGF0dXMgY29kZSB0aGF0IGluZGljYXRlcyB0aGUgZXhlY3V0aW9uIHN0YXR1cyBvZiB0aGUgZnVuY3Rpb24uCi8vLyBcbm90ZSBNVVNUIFJFTUFJTiBVTkNIQU5HRUQ6IFxiIG9zVGltZXJTdG9wIHNoYWxsIGJlIGNvbnNpc3RlbnQgaW4gZXZlcnkgQ01TSVMtUlRPUy4Kb3NTdGF0dXMgb3NUaW1lclN0b3AgKG9zVGltZXJJZCB0aW1lcl9pZCk7CgovLy8gRGVsZXRlIGEgdGltZXIgdGhhdCB3YXMgY3JlYXRlZCBieSBccmVmIG9zVGltZXJDcmVhdGUuCi8vLyBccGFyYW1baW5dICAgICB0aW1lcl9pZCAgICAgIHRpbWVyIElEIG9idGFpbmVkIGJ5IFxyZWYgb3NUaW1lckNyZWF0ZS4KLy8vIFxyZXR1cm4gc3RhdHVzIGNvZGUgdGhhdCBpbmRpY2F0ZXMgdGhlIGV4ZWN1dGlvbiBzdGF0dXMgb2YgdGhlIGZ1bmN0aW9uLgovLy8gXG5vdGUgTVVTVCBSRU1BSU4gVU5DSEFOR0VEOiBcYiBvc1RpbWVyRGVsZXRlIHNoYWxsIGJlIGNvbnNpc3RlbnQgaW4gZXZlcnkgQ01TSVMtUlRPUy4Kb3NTdGF0dXMgb3NUaW1lckRlbGV0ZSAob3NUaW1lcklkIHRpbWVyX2lkKTsKCgovLyAgPT09PSBTaWduYWwgTWFuYWdlbWVudCA9PT09CgovLy8gU2V0IHRoZSBzcGVjaWZpZWQgU2lnbmFsIEZsYWdzIG9mIGFuIGFjdGl2ZSB0aHJlYWQuCi8vLyBccGFyYW1baW5dICAgICB0aHJlYWRfaWQgICAgIHRocmVhZCBJRCBvYnRhaW5lZCBieSBccmVmIG9zVGhyZWFkQ3JlYXRlIG9yIFxyZWYgb3NUaHJlYWRHZXRJZC4KLy8vIFxwYXJhbVtpbl0gICAgIHNpZ25hbHMgICAgICAgc3BlY2lmaWVzIHRoZSBzaWduYWwgZmxhZ3Mgb2YgdGhlIHRocmVhZCB0aGF0IHNob3VsZCBiZSBzZXQuCi8vLyBccmV0dXJuIG9zT0sgaWYgc3VjY2Vzc2Z1bCwgb3NFcnJvck9TIGlmIGZhaWxlZC4KLy8vIFxub3RlIE1VU1QgUkVNQUlOIFVOQ0hBTkdFRDogXGIgb3NTaWduYWxTZXQgc2hhbGwgYmUgY29uc2lzdGVudCBpbiBldmVyeSBDTVNJUy1SVE9TLgppbnQzMl90IG9zU2lnbmFsU2V0IChvc1RocmVhZElkIHRocmVhZF9pZCwgaW50MzJfdCBzaWduYWxzKTsKCi8vLyBDbGVhciB0aGUgc3BlY2lmaWVkIFNpZ25hbCBGbGFncyBvZiBhbiBhY3RpdmUgdGhyZWFkLgovLy8gXHBhcmFtW2luXSAgICAgdGhyZWFkX2lkICAgICB0aHJlYWQgSUQgb2J0YWluZWQgYnkgXHJlZiBvc1RocmVhZENyZWF0ZSBvciBccmVmIG9zVGhyZWFkR2V0SWQuCi8vLyBccGFyYW1baW5dICAgICBzaWduYWxzICAgICAgIHNwZWNpZmllcyB0aGUgc2lnbmFsIGZsYWdzIG9mIHRoZSB0aHJlYWQgdGhhdCBzaGFsbCBiZSBjbGVhcmVkLgovLy8gXHJldHVybiBwcmV2aW91cyBzaWduYWwgZmxhZ3Mgb2YgdGhlIHNwZWNpZmllZCB0aHJlYWQgb3IgMHg4MDAwMDAwMCBpbiBjYXNlIG9mIGluY29ycmVjdCBwYXJhbWV0ZXJzLgovLy8gXG5vdGUgTVVTVCBSRU1BSU4gVU5DSEFOR0VEOiBcYiBvc1NpZ25hbENsZWFyIHNoYWxsIGJlIGNvbnNpc3RlbnQgaW4gZXZlcnkgQ01TSVMtUlRPUy4KaW50MzJfdCBvc1NpZ25hbENsZWFyIChvc1RocmVhZElkIHRocmVhZF9pZCwgaW50MzJfdCBzaWduYWxzKTsKCi8vLyBXYWl0IGZvciBvbmUgb3IgbW9yZSBTaWduYWwgRmxhZ3MgdG8gYmVjb21lIHNpZ25hbGVkIGZvciB0aGUgY3VycmVudCBcYiBSVU5OSU5HIHRocmVhZC4KLy8vIFxwYXJhbVtpbl0gICAgIHNpZ25hbHMgICAgICAgd2FpdCB1bnRpbCBhbGwgc3BlY2lmaWVkIHNpZ25hbCBmbGFncyBzZXQgb3IgMCBmb3IgYW55IHNpbmdsZSBzaWduYWwgZmxhZy4KLy8vIFxwYXJhbVtpbl0gICAgIG1pbGxpc2VjICAgICAgdGltZW91dCB2YWx1ZSBvciAwIGluIGNhc2Ugb2Ygbm8gdGltZS1vdXQuCi8vLyBccmV0dXJuIGV2ZW50IGZsYWcgaW5mb3JtYXRpb24gb3IgZXJyb3IgY29kZS4KLy8vIFxub3RlIE1VU1QgUkVNQUlOIFVOQ0hBTkdFRDogXGIgb3NTaWduYWxXYWl0IHNoYWxsIGJlIGNvbnNpc3RlbnQgaW4gZXZlcnkgQ01TSVMtUlRPUy4Kb3NFdmVudCBvc1NpZ25hbFdhaXQgKGludDMyX3Qgc2lnbmFscywgdWludDMyX3QgbWlsbGlzZWMpOwoKCi8vICA9PT09IE11dGV4IE1hbmFnZW1lbnQgPT09PQoKLy8vIERlZmluZSBhIE11dGV4LgovLy8gXHBhcmFtICAgICAgICAgbmFtZSAgICAgICAgICBuYW1lIG9mIHRoZSBtdXRleCBvYmplY3QuCi8vLyBcbm90ZSBDQU4gQkUgQ0hBTkdFRDogVGhlIHBhcmFtZXRlciB0byBcYiBvc011dGV4RGVmIHNoYWxsIGJlIGNvbnNpc3RlbnQgYnV0IHRoZQovLy8gICAgICAgbWFjcm8gYm9keSBpcyBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBpbiBldmVyeSBDTVNJUy1SVE9TLgojaWYgZGVmaW5lZCAob3NPYmplY3RzRXh0ZXJuYWwpICAvLyBvYmplY3QgaXMgZXh0ZXJuYWwKI2RlZmluZSBvc011dGV4RGVmKG5hbWUpICBcCmV4dGVybiBjb25zdCBvc011dGV4RGVmX3Qgb3NfbXV0ZXhfZGVmXyMjbmFtZQojZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWZpbmUgdGhlIG9iamVjdAoKI2lmKCBjb25maWdTVVBQT1JUX1NUQVRJQ19BTExPQ0FUSU9OID09IDEgKQojZGVmaW5lIG9zTXV0ZXhEZWYobmFtZSkgIFwKY29uc3Qgb3NNdXRleERlZl90IG9zX211dGV4X2RlZl8jI25hbWUgPSB7IDAsIE5VTEwgfQoKI2RlZmluZSBvc011dGV4U3RhdGljRGVmKG5hbWUsIGNvbnRyb2wpICBcCmNvbnN0IG9zTXV0ZXhEZWZfdCBvc19tdXRleF9kZWZfIyNuYW1lID0geyAwLCAoY29udHJvbCkgfQojZWxzZSAvL2NvbmZpZ1NVUFBPUlRfU1RBVElDX0FMTE9DQVRJT04gPT0gMAojZGVmaW5lIG9zTXV0ZXhEZWYobmFtZSkgIFwKY29uc3Qgb3NNdXRleERlZl90IG9zX211dGV4X2RlZl8jI25hbWUgPSB7IDAgfQoKI2VuZGlmCgojZW5kaWYKCi8vLyBBY2Nlc3MgYSBNdXRleCBkZWZpbml0aW9uLgovLy8gXHBhcmFtICAgICAgICAgbmFtZSAgICAgICAgICBuYW1lIG9mIHRoZSBtdXRleCBvYmplY3QuCi8vLyBcbm90ZSBDQU4gQkUgQ0hBTkdFRDogVGhlIHBhcmFtZXRlciB0byBcYiBvc011dGV4IHNoYWxsIGJlIGNvbnNpc3RlbnQgYnV0IHRoZQovLy8gICAgICAgbWFjcm8gYm9keSBpcyBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBpbiBldmVyeSBDTVNJUy1SVE9TLgojZGVmaW5lIG9zTXV0ZXgobmFtZSkgIFwKJm9zX211dGV4X2RlZl8jI25hbWUKCi8vLyBDcmVhdGUgYW5kIEluaXRpYWxpemUgYSBNdXRleCBvYmplY3QuCi8vLyBccGFyYW1baW5dICAgICBtdXRleF9kZWYgICAgIG11dGV4IGRlZmluaXRpb24gcmVmZXJlbmNlZCB3aXRoIFxyZWYgb3NNdXRleC4KLy8vIFxyZXR1cm4gbXV0ZXggSUQgZm9yIHJlZmVyZW5jZSBieSBvdGhlciBmdW5jdGlvbnMgb3IgTlVMTCBpbiBjYXNlIG9mIGVycm9yLgovLy8gXG5vdGUgTVVTVCBSRU1BSU4gVU5DSEFOR0VEOiBcYiBvc011dGV4Q3JlYXRlIHNoYWxsIGJlIGNvbnNpc3RlbnQgaW4gZXZlcnkgQ01TSVMtUlRPUy4Kb3NNdXRleElkIG9zTXV0ZXhDcmVhdGUgKGNvbnN0IG9zTXV0ZXhEZWZfdCAqbXV0ZXhfZGVmKTsKCi8vLyBXYWl0IHVudGlsIGEgTXV0ZXggYmVjb21lcyBhdmFpbGFibGUuCi8vLyBccGFyYW1baW5dICAgICBtdXRleF9pZCAgICAgIG11dGV4IElEIG9idGFpbmVkIGJ5IFxyZWYgb3NNdXRleENyZWF0ZS4KLy8vIFxwYXJhbVtpbl0gICAgIG1pbGxpc2VjICAgICAgdGltZW91dCB2YWx1ZSBvciAwIGluIGNhc2Ugb2Ygbm8gdGltZS1vdXQuCi8vLyBccmV0dXJuIHN0YXR1cyBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBleGVjdXRpb24gc3RhdHVzIG9mIHRoZSBmdW5jdGlvbi4KLy8vIFxub3RlIE1VU1QgUkVNQUlOIFVOQ0hBTkdFRDogXGIgb3NNdXRleFdhaXQgc2hhbGwgYmUgY29uc2lzdGVudCBpbiBldmVyeSBDTVNJUy1SVE9TLgpvc1N0YXR1cyBvc011dGV4V2FpdCAob3NNdXRleElkIG11dGV4X2lkLCB1aW50MzJfdCBtaWxsaXNlYyk7CgovLy8gUmVsZWFzZSBhIE11dGV4IHRoYXQgd2FzIG9idGFpbmVkIGJ5IFxyZWYgb3NNdXRleFdhaXQuCi8vLyBccGFyYW1baW5dICAgICBtdXRleF9pZCAgICAgIG11dGV4IElEIG9idGFpbmVkIGJ5IFxyZWYgb3NNdXRleENyZWF0ZS4KLy8vIFxyZXR1cm4gc3RhdHVzIGNvZGUgdGhhdCBpbmRpY2F0ZXMgdGhlIGV4ZWN1dGlvbiBzdGF0dXMgb2YgdGhlIGZ1bmN0aW9uLgovLy8gXG5vdGUgTVVTVCBSRU1BSU4gVU5DSEFOR0VEOiBcYiBvc011dGV4UmVsZWFzZSBzaGFsbCBiZSBjb25zaXN0ZW50IGluIGV2ZXJ5IENNU0lTLVJUT1MuCm9zU3RhdHVzIG9zTXV0ZXhSZWxlYXNlIChvc011dGV4SWQgbXV0ZXhfaWQpOwoKLy8vIERlbGV0ZSBhIE11dGV4IHRoYXQgd2FzIGNyZWF0ZWQgYnkgXHJlZiBvc011dGV4Q3JlYXRlLgovLy8gXHBhcmFtW2luXSAgICAgbXV0ZXhfaWQgICAgICBtdXRleCBJRCBvYnRhaW5lZCBieSBccmVmIG9zTXV0ZXhDcmVhdGUuCi8vLyBccmV0dXJuIHN0YXR1cyBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBleGVjdXRpb24gc3RhdHVzIG9mIHRoZSBmdW5jdGlvbi4KLy8vIFxub3RlIE1VU1QgUkVNQUlOIFVOQ0hBTkdFRDogXGIgb3NNdXRleERlbGV0ZSBzaGFsbCBiZSBjb25zaXN0ZW50IGluIGV2ZXJ5IENNU0lTLVJUT1MuCm9zU3RhdHVzIG9zTXV0ZXhEZWxldGUgKG9zTXV0ZXhJZCBtdXRleF9pZCk7CgoKLy8gID09PT0gU2VtYXBob3JlIE1hbmFnZW1lbnQgRnVuY3Rpb25zID09PT0KCiNpZiAoZGVmaW5lZCAob3NGZWF0dXJlX1NlbWFwaG9yZSkgICYmICAob3NGZWF0dXJlX1NlbWFwaG9yZSAhPSAwKSkgICAgIC8vIFNlbWFwaG9yZSBhdmFpbGFibGUKCi8vLyBEZWZpbmUgYSBTZW1hcGhvcmUgb2JqZWN0LgovLy8gXHBhcmFtICAgICAgICAgbmFtZSAgICAgICAgICBuYW1lIG9mIHRoZSBzZW1hcGhvcmUgb2JqZWN0LgovLy8gXG5vdGUgQ0FOIEJFIENIQU5HRUQ6IFRoZSBwYXJhbWV0ZXIgdG8gXGIgb3NTZW1hcGhvcmVEZWYgc2hhbGwgYmUgY29uc2lzdGVudCBidXQgdGhlCi8vLyAgICAgICBtYWNybyBib2R5IGlzIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIGluIGV2ZXJ5IENNU0lTLVJUT1MuCiNpZiBkZWZpbmVkIChvc09iamVjdHNFeHRlcm5hbCkgIC8vIG9iamVjdCBpcyBleHRlcm5hbAojZGVmaW5lIG9zU2VtYXBob3JlRGVmKG5hbWUpICBcCmV4dGVybiBjb25zdCBvc1NlbWFwaG9yZURlZl90IG9zX3NlbWFwaG9yZV9kZWZfIyNuYW1lCiNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlZmluZSB0aGUgb2JqZWN0CgojaWYoIGNvbmZpZ1NVUFBPUlRfU1RBVElDX0FMTE9DQVRJT04gPT0gMSApCiNkZWZpbmUgb3NTZW1hcGhvcmVEZWYobmFtZSkgIFwKY29uc3Qgb3NTZW1hcGhvcmVEZWZfdCBvc19zZW1hcGhvcmVfZGVmXyMjbmFtZSA9IHsgMCwgTlVMTCB9CgojZGVmaW5lIG9zU2VtYXBob3JlU3RhdGljRGVmKG5hbWUsIGNvbnRyb2wpICBcCmNvbnN0IG9zU2VtYXBob3JlRGVmX3Qgb3Nfc2VtYXBob3JlX2RlZl8jI25hbWUgPSB7IDAsIChjb250cm9sKSB9CgojZWxzZSAvL2NvbmZpZ1NVUFBPUlRfU1RBVElDX0FMTE9DQVRJT04gPT0gMAojZGVmaW5lIG9zU2VtYXBob3JlRGVmKG5hbWUpICBcCmNvbnN0IG9zU2VtYXBob3JlRGVmX3Qgb3Nfc2VtYXBob3JlX2RlZl8jI25hbWUgPSB7IDAgfQojZW5kaWYKI2VuZGlmCgovLy8gQWNjZXNzIGEgU2VtYXBob3JlIGRlZmluaXRpb24uCi8vLyBccGFyYW0gICAgICAgICBuYW1lICAgICAgICAgIG5hbWUgb2YgdGhlIHNlbWFwaG9yZSBvYmplY3QuCi8vLyBcbm90ZSBDQU4gQkUgQ0hBTkdFRDogVGhlIHBhcmFtZXRlciB0byBcYiBvc1NlbWFwaG9yZSBzaGFsbCBiZSBjb25zaXN0ZW50IGJ1dCB0aGUKLy8vICAgICAgIG1hY3JvIGJvZHkgaXMgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgaW4gZXZlcnkgQ01TSVMtUlRPUy4KI2RlZmluZSBvc1NlbWFwaG9yZShuYW1lKSAgXAomb3Nfc2VtYXBob3JlX2RlZl8jI25hbWUKCi8vLyBDcmVhdGUgYW5kIEluaXRpYWxpemUgYSBTZW1hcGhvcmUgb2JqZWN0IHVzZWQgZm9yIG1hbmFnaW5nIHJlc291cmNlcy4KLy8vIFxwYXJhbVtpbl0gICAgIHNlbWFwaG9yZV9kZWYgc2VtYXBob3JlIGRlZmluaXRpb24gcmVmZXJlbmNlZCB3aXRoIFxyZWYgb3NTZW1hcGhvcmUuCi8vLyBccGFyYW1baW5dICAgICBjb3VudCAgICAgICAgIG51bWJlciBvZiBhdmFpbGFibGUgcmVzb3VyY2VzLgovLy8gXHJldHVybiBzZW1hcGhvcmUgSUQgZm9yIHJlZmVyZW5jZSBieSBvdGhlciBmdW5jdGlvbnMgb3IgTlVMTCBpbiBjYXNlIG9mIGVycm9yLgovLy8gXG5vdGUgTVVTVCBSRU1BSU4gVU5DSEFOR0VEOiBcYiBvc1NlbWFwaG9yZUNyZWF0ZSBzaGFsbCBiZSBjb25zaXN0ZW50IGluIGV2ZXJ5IENNU0lTLVJUT1MuCm9zU2VtYXBob3JlSWQgb3NTZW1hcGhvcmVDcmVhdGUgKGNvbnN0IG9zU2VtYXBob3JlRGVmX3QgKnNlbWFwaG9yZV9kZWYsIGludDMyX3QgY291bnQpOwoKLy8vIFdhaXQgdW50aWwgYSBTZW1hcGhvcmUgdG9rZW4gYmVjb21lcyBhdmFpbGFibGUuCi8vLyBccGFyYW1baW5dICAgICBzZW1hcGhvcmVfaWQgIHNlbWFwaG9yZSBvYmplY3QgcmVmZXJlbmNlZCB3aXRoIFxyZWYgb3NTZW1hcGhvcmVDcmVhdGUuCi8vLyBccGFyYW1baW5dICAgICBtaWxsaXNlYyAgICAgIHRpbWVvdXQgdmFsdWUgb3IgMCBpbiBjYXNlIG9mIG5vIHRpbWUtb3V0LgovLy8gXHJldHVybiBudW1iZXIgb2YgYXZhaWxhYmxlIHRva2Vucywgb3IgLTEgaW4gY2FzZSBvZiBpbmNvcnJlY3QgcGFyYW1ldGVycy4KLy8vIFxub3RlIE1VU1QgUkVNQUlOIFVOQ0hBTkdFRDogXGIgb3NTZW1hcGhvcmVXYWl0IHNoYWxsIGJlIGNvbnNpc3RlbnQgaW4gZXZlcnkgQ01TSVMtUlRPUy4KaW50MzJfdCBvc1NlbWFwaG9yZVdhaXQgKG9zU2VtYXBob3JlSWQgc2VtYXBob3JlX2lkLCB1aW50MzJfdCBtaWxsaXNlYyk7CgovLy8gUmVsZWFzZSBhIFNlbWFwaG9yZSB0b2tlbi4KLy8vIFxwYXJhbVtpbl0gICAgIHNlbWFwaG9yZV9pZCAgc2VtYXBob3JlIG9iamVjdCByZWZlcmVuY2VkIHdpdGggXHJlZiBvc1NlbWFwaG9yZUNyZWF0ZS4KLy8vIFxyZXR1cm4gc3RhdHVzIGNvZGUgdGhhdCBpbmRpY2F0ZXMgdGhlIGV4ZWN1dGlvbiBzdGF0dXMgb2YgdGhlIGZ1bmN0aW9uLgovLy8gXG5vdGUgTVVTVCBSRU1BSU4gVU5DSEFOR0VEOiBcYiBvc1NlbWFwaG9yZVJlbGVhc2Ugc2hhbGwgYmUgY29uc2lzdGVudCBpbiBldmVyeSBDTVNJUy1SVE9TLgpvc1N0YXR1cyBvc1NlbWFwaG9yZVJlbGVhc2UgKG9zU2VtYXBob3JlSWQgc2VtYXBob3JlX2lkKTsKCi8vLyBEZWxldGUgYSBTZW1hcGhvcmUgdGhhdCB3YXMgY3JlYXRlZCBieSBccmVmIG9zU2VtYXBob3JlQ3JlYXRlLgovLy8gXHBhcmFtW2luXSAgICAgc2VtYXBob3JlX2lkICBzZW1hcGhvcmUgb2JqZWN0IHJlZmVyZW5jZWQgd2l0aCBccmVmIG9zU2VtYXBob3JlQ3JlYXRlLgovLy8gXHJldHVybiBzdGF0dXMgY29kZSB0aGF0IGluZGljYXRlcyB0aGUgZXhlY3V0aW9uIHN0YXR1cyBvZiB0aGUgZnVuY3Rpb24uCi8vLyBcbm90ZSBNVVNUIFJFTUFJTiBVTkNIQU5HRUQ6IFxiIG9zU2VtYXBob3JlRGVsZXRlIHNoYWxsIGJlIGNvbnNpc3RlbnQgaW4gZXZlcnkgQ01TSVMtUlRPUy4Kb3NTdGF0dXMgb3NTZW1hcGhvcmVEZWxldGUgKG9zU2VtYXBob3JlSWQgc2VtYXBob3JlX2lkKTsKCiNlbmRpZiAgICAgLy8gU2VtYXBob3JlIGF2YWlsYWJsZQoKCi8vICA9PT09IE1lbW9yeSBQb29sIE1hbmFnZW1lbnQgRnVuY3Rpb25zID09PT0KCiNpZiAoZGVmaW5lZCAob3NGZWF0dXJlX1Bvb2wpICAmJiAgKG9zRmVhdHVyZV9Qb29sICE9IDApKSAgLy8gTWVtb3J5IFBvb2wgTWFuYWdlbWVudCBhdmFpbGFibGUKCi8vLyBcYnJpZWYgRGVmaW5lIGEgTWVtb3J5IFBvb2wuCi8vLyBccGFyYW0gICAgICAgICBuYW1lICAgICAgICAgIG5hbWUgb2YgdGhlIG1lbW9yeSBwb29sLgovLy8gXHBhcmFtICAgICAgICAgbm8gICAgICAgICAgICBtYXhpbXVtIG51bWJlciBvZiBibG9ja3MgKG9iamVjdHMpIGluIHRoZSBtZW1vcnkgcG9vbC4KLy8vIFxwYXJhbSAgICAgICAgIHR5cGUgICAgICAgICAgZGF0YSB0eXBlIG9mIGEgc2luZ2xlIGJsb2NrIChvYmplY3QpLgovLy8gXG5vdGUgQ0FOIEJFIENIQU5HRUQ6IFRoZSBwYXJhbWV0ZXIgdG8gXGIgb3NQb29sRGVmIHNoYWxsIGJlIGNvbnNpc3RlbnQgYnV0IHRoZQovLy8gICAgICAgbWFjcm8gYm9keSBpcyBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBpbiBldmVyeSBDTVNJUy1SVE9TLgojaWYgZGVmaW5lZCAob3NPYmplY3RzRXh0ZXJuYWwpICAvLyBvYmplY3QgaXMgZXh0ZXJuYWwKI2RlZmluZSBvc1Bvb2xEZWYobmFtZSwgbm8sIHR5cGUpICAgXApleHRlcm4gY29uc3Qgb3NQb29sRGVmX3Qgb3NfcG9vbF9kZWZfIyNuYW1lCiNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlZmluZSB0aGUgb2JqZWN0CiNkZWZpbmUgb3NQb29sRGVmKG5hbWUsIG5vLCB0eXBlKSAgIFwKY29uc3Qgb3NQb29sRGVmX3Qgb3NfcG9vbF9kZWZfIyNuYW1lID0gXAp7IChubyksIHNpemVvZih0eXBlKSwgTlVMTCB9CiNlbmRpZgoKLy8vIFxicmllZiBBY2Nlc3MgYSBNZW1vcnkgUG9vbCBkZWZpbml0aW9uLgovLy8gXHBhcmFtICAgICAgICAgbmFtZSAgICAgICAgICBuYW1lIG9mIHRoZSBtZW1vcnkgcG9vbAovLy8gXG5vdGUgQ0FOIEJFIENIQU5HRUQ6IFRoZSBwYXJhbWV0ZXIgdG8gXGIgb3NQb29sIHNoYWxsIGJlIGNvbnNpc3RlbnQgYnV0IHRoZQovLy8gICAgICAgbWFjcm8gYm9keSBpcyBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBpbiBldmVyeSBDTVNJUy1SVE9TLgojZGVmaW5lIG9zUG9vbChuYW1lKSBcCiZvc19wb29sX2RlZl8jI25hbWUKCi8vLyBDcmVhdGUgYW5kIEluaXRpYWxpemUgYSBtZW1vcnkgcG9vbC4KLy8vIFxwYXJhbVtpbl0gICAgIHBvb2xfZGVmICAgICAgbWVtb3J5IHBvb2wgZGVmaW5pdGlvbiByZWZlcmVuY2VkIHdpdGggXHJlZiBvc1Bvb2wuCi8vLyBccmV0dXJuIG1lbW9yeSBwb29sIElEIGZvciByZWZlcmVuY2UgYnkgb3RoZXIgZnVuY3Rpb25zIG9yIE5VTEwgaW4gY2FzZSBvZiBlcnJvci4KLy8vIFxub3RlIE1VU1QgUkVNQUlOIFVOQ0hBTkdFRDogXGIgb3NQb29sQ3JlYXRlIHNoYWxsIGJlIGNvbnNpc3RlbnQgaW4gZXZlcnkgQ01TSVMtUlRPUy4Kb3NQb29sSWQgb3NQb29sQ3JlYXRlIChjb25zdCBvc1Bvb2xEZWZfdCAqcG9vbF9kZWYpOwoKLy8vIEFsbG9jYXRlIGEgbWVtb3J5IGJsb2NrIGZyb20gYSBtZW1vcnkgcG9vbC4KLy8vIFxwYXJhbVtpbl0gICAgIHBvb2xfaWQgICAgICAgbWVtb3J5IHBvb2wgSUQgb2J0YWluIHJlZmVyZW5jZWQgd2l0aCBccmVmIG9zUG9vbENyZWF0ZS4KLy8vIFxyZXR1cm4gYWRkcmVzcyBvZiB0aGUgYWxsb2NhdGVkIG1lbW9yeSBibG9jayBvciBOVUxMIGluIGNhc2Ugb2Ygbm8gbWVtb3J5IGF2YWlsYWJsZS4KLy8vIFxub3RlIE1VU1QgUkVNQUlOIFVOQ0hBTkdFRDogXGIgb3NQb29sQWxsb2Mgc2hhbGwgYmUgY29uc2lzdGVudCBpbiBldmVyeSBDTVNJUy1SVE9TLgp2b2lkICpvc1Bvb2xBbGxvYyAob3NQb29sSWQgcG9vbF9pZCk7CgovLy8gQWxsb2NhdGUgYSBtZW1vcnkgYmxvY2sgZnJvbSBhIG1lbW9yeSBwb29sIGFuZCBzZXQgbWVtb3J5IGJsb2NrIHRvIHplcm8uCi8vLyBccGFyYW1baW5dICAgICBwb29sX2lkICAgICAgIG1lbW9yeSBwb29sIElEIG9idGFpbiByZWZlcmVuY2VkIHdpdGggXHJlZiBvc1Bvb2xDcmVhdGUuCi8vLyBccmV0dXJuIGFkZHJlc3Mgb2YgdGhlIGFsbG9jYXRlZCBtZW1vcnkgYmxvY2sgb3IgTlVMTCBpbiBjYXNlIG9mIG5vIG1lbW9yeSBhdmFpbGFibGUuCi8vLyBcbm90ZSBNVVNUIFJFTUFJTiBVTkNIQU5HRUQ6IFxiIG9zUG9vbENBbGxvYyBzaGFsbCBiZSBjb25zaXN0ZW50IGluIGV2ZXJ5IENNU0lTLVJUT1MuCnZvaWQgKm9zUG9vbENBbGxvYyAob3NQb29sSWQgcG9vbF9pZCk7CgovLy8gUmV0dXJuIGFuIGFsbG9jYXRlZCBtZW1vcnkgYmxvY2sgYmFjayB0byBhIHNwZWNpZmljIG1lbW9yeSBwb29sLgovLy8gXHBhcmFtW2luXSAgICAgcG9vbF9pZCAgICAgICBtZW1vcnkgcG9vbCBJRCBvYnRhaW4gcmVmZXJlbmNlZCB3aXRoIFxyZWYgb3NQb29sQ3JlYXRlLgovLy8gXHBhcmFtW2luXSAgICAgYmxvY2sgICAgICAgICBhZGRyZXNzIG9mIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IGJsb2NrIHRoYXQgaXMgcmV0dXJuZWQgdG8gdGhlIG1lbW9yeSBwb29sLgovLy8gXHJldHVybiBzdGF0dXMgY29kZSB0aGF0IGluZGljYXRlcyB0aGUgZXhlY3V0aW9uIHN0YXR1cyBvZiB0aGUgZnVuY3Rpb24uCi8vLyBcbm90ZSBNVVNUIFJFTUFJTiBVTkNIQU5HRUQ6IFxiIG9zUG9vbEZyZWUgc2hhbGwgYmUgY29uc2lzdGVudCBpbiBldmVyeSBDTVNJUy1SVE9TLgpvc1N0YXR1cyBvc1Bvb2xGcmVlIChvc1Bvb2xJZCBwb29sX2lkLCB2b2lkICpibG9jayk7CgojZW5kaWYgICAvLyBNZW1vcnkgUG9vbCBNYW5hZ2VtZW50IGF2YWlsYWJsZQoKCi8vICA9PT09IE1lc3NhZ2UgUXVldWUgTWFuYWdlbWVudCBGdW5jdGlvbnMgPT09PQoKI2lmIChkZWZpbmVkIChvc0ZlYXR1cmVfTWVzc2FnZVEpICAmJiAgKG9zRmVhdHVyZV9NZXNzYWdlUSAhPSAwKSkgICAgIC8vIE1lc3NhZ2UgUXVldWVzIGF2YWlsYWJsZQoKLy8vIFxicmllZiBDcmVhdGUgYSBNZXNzYWdlIFF1ZXVlIERlZmluaXRpb24uCi8vLyBccGFyYW0gICAgICAgICBuYW1lICAgICAgICAgIG5hbWUgb2YgdGhlIHF1ZXVlLgovLy8gXHBhcmFtICAgICAgICAgcXVldWVfc3ogICAgICBtYXhpbXVtIG51bWJlciBvZiBtZXNzYWdlcyBpbiB0aGUgcXVldWUuCi8vLyBccGFyYW0gICAgICAgICB0eXBlICAgICAgICAgIGRhdGEgdHlwZSBvZiBhIHNpbmdsZSBtZXNzYWdlIGVsZW1lbnQgKGZvciBkZWJ1Z2dlcikuCi8vLyBcbm90ZSBDQU4gQkUgQ0hBTkdFRDogVGhlIHBhcmFtZXRlciB0byBcYiBvc01lc3NhZ2VRRGVmIHNoYWxsIGJlIGNvbnNpc3RlbnQgYnV0IHRoZQovLy8gICAgICAgbWFjcm8gYm9keSBpcyBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBpbiBldmVyeSBDTVNJUy1SVE9TLgojaWYgZGVmaW5lZCAob3NPYmplY3RzRXh0ZXJuYWwpICAvLyBvYmplY3QgaXMgZXh0ZXJuYWwKI2RlZmluZSBvc01lc3NhZ2VRRGVmKG5hbWUsIHF1ZXVlX3N6LCB0eXBlKSAgIFwKZXh0ZXJuIGNvbnN0IG9zTWVzc2FnZVFEZWZfdCBvc19tZXNzYWdlUV9kZWZfIyNuYW1lCiNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlZmluZSB0aGUgb2JqZWN0CiNpZiggY29uZmlnU1VQUE9SVF9TVEFUSUNfQUxMT0NBVElPTiA9PSAxICkKI2RlZmluZSBvc01lc3NhZ2VRRGVmKG5hbWUsIHF1ZXVlX3N6LCB0eXBlKSAgIFwKY29uc3Qgb3NNZXNzYWdlUURlZl90IG9zX21lc3NhZ2VRX2RlZl8jI25hbWUgPSBcCnsgKHF1ZXVlX3N6KSwgc2l6ZW9mICh0eXBlKSwgTlVMTCwgTlVMTCAgfQoKI2RlZmluZSBvc01lc3NhZ2VRU3RhdGljRGVmKG5hbWUsIHF1ZXVlX3N6LCB0eXBlLCBidWZmZXIsIGNvbnRyb2wpICAgXApjb25zdCBvc01lc3NhZ2VRRGVmX3Qgb3NfbWVzc2FnZVFfZGVmXyMjbmFtZSA9IFwKeyAocXVldWVfc3opLCBzaXplb2YgKHR5cGUpICwgKGJ1ZmZlciksIChjb250cm9sKX0KI2Vsc2UgLy9jb25maWdTVVBQT1JUX1NUQVRJQ19BTExPQ0FUSU9OID09IDEKI2RlZmluZSBvc01lc3NhZ2VRRGVmKG5hbWUsIHF1ZXVlX3N6LCB0eXBlKSAgIFwKY29uc3Qgb3NNZXNzYWdlUURlZl90IG9zX21lc3NhZ2VRX2RlZl8jI25hbWUgPSBcCnsgKHF1ZXVlX3N6KSwgc2l6ZW9mICh0eXBlKSB9CgojZW5kaWYKI2VuZGlmCgovLy8gXGJyaWVmIEFjY2VzcyBhIE1lc3NhZ2UgUXVldWUgRGVmaW5pdGlvbi4KLy8vIFxwYXJhbSAgICAgICAgIG5hbWUgICAgICAgICAgbmFtZSBvZiB0aGUgcXVldWUKLy8vIFxub3RlIENBTiBCRSBDSEFOR0VEOiBUaGUgcGFyYW1ldGVyIHRvIFxiIG9zTWVzc2FnZVEgc2hhbGwgYmUgY29uc2lzdGVudCBidXQgdGhlCi8vLyAgICAgICBtYWNybyBib2R5IGlzIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIGluIGV2ZXJ5IENNU0lTLVJUT1MuCiNkZWZpbmUgb3NNZXNzYWdlUShuYW1lKSBcCiZvc19tZXNzYWdlUV9kZWZfIyNuYW1lCgovLy8gQ3JlYXRlIGFuZCBJbml0aWFsaXplIGEgTWVzc2FnZSBRdWV1ZS4KLy8vIFxwYXJhbVtpbl0gICAgIHF1ZXVlX2RlZiAgICAgcXVldWUgZGVmaW5pdGlvbiByZWZlcmVuY2VkIHdpdGggXHJlZiBvc01lc3NhZ2VRLgovLy8gXHBhcmFtW2luXSAgICAgdGhyZWFkX2lkICAgICB0aHJlYWQgSUQgKG9idGFpbmVkIGJ5IFxyZWYgb3NUaHJlYWRDcmVhdGUgb3IgXHJlZiBvc1RocmVhZEdldElkKSBvciBOVUxMLgovLy8gXHJldHVybiBtZXNzYWdlIHF1ZXVlIElEIGZvciByZWZlcmVuY2UgYnkgb3RoZXIgZnVuY3Rpb25zIG9yIE5VTEwgaW4gY2FzZSBvZiBlcnJvci4KLy8vIFxub3RlIE1VU1QgUkVNQUlOIFVOQ0hBTkdFRDogXGIgb3NNZXNzYWdlQ3JlYXRlIHNoYWxsIGJlIGNvbnNpc3RlbnQgaW4gZXZlcnkgQ01TSVMtUlRPUy4Kb3NNZXNzYWdlUUlkIG9zTWVzc2FnZUNyZWF0ZSAoY29uc3Qgb3NNZXNzYWdlUURlZl90ICpxdWV1ZV9kZWYsIG9zVGhyZWFkSWQgdGhyZWFkX2lkKTsKCi8vLyBQdXQgYSBNZXNzYWdlIHRvIGEgUXVldWUuCi8vLyBccGFyYW1baW5dICAgICBxdWV1ZV9pZCAgICAgIG1lc3NhZ2UgcXVldWUgSUQgb2J0YWluZWQgd2l0aCBccmVmIG9zTWVzc2FnZUNyZWF0ZS4KLy8vIFxwYXJhbVtpbl0gICAgIGluZm8gICAgICAgICAgbWVzc2FnZSBpbmZvcm1hdGlvbi4KLy8vIFxwYXJhbVtpbl0gICAgIG1pbGxpc2VjICAgICAgdGltZW91dCB2YWx1ZSBvciAwIGluIGNhc2Ugb2Ygbm8gdGltZS1vdXQuCi8vLyBccmV0dXJuIHN0YXR1cyBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBleGVjdXRpb24gc3RhdHVzIG9mIHRoZSBmdW5jdGlvbi4KLy8vIFxub3RlIE1VU1QgUkVNQUlOIFVOQ0hBTkdFRDogXGIgb3NNZXNzYWdlUHV0IHNoYWxsIGJlIGNvbnNpc3RlbnQgaW4gZXZlcnkgQ01TSVMtUlRPUy4Kb3NTdGF0dXMgb3NNZXNzYWdlUHV0IChvc01lc3NhZ2VRSWQgcXVldWVfaWQsIHVpbnQzMl90IGluZm8sIHVpbnQzMl90IG1pbGxpc2VjKTsKCi8vLyBHZXQgYSBNZXNzYWdlIG9yIFdhaXQgZm9yIGEgTWVzc2FnZSBmcm9tIGEgUXVldWUuCi8vLyBccGFyYW1baW5dICAgICBxdWV1ZV9pZCAgICAgIG1lc3NhZ2UgcXVldWUgSUQgb2J0YWluZWQgd2l0aCBccmVmIG9zTWVzc2FnZUNyZWF0ZS4KLy8vIFxwYXJhbVtpbl0gICAgIG1pbGxpc2VjICAgICAgdGltZW91dCB2YWx1ZSBvciAwIGluIGNhc2Ugb2Ygbm8gdGltZS1vdXQuCi8vLyBccmV0dXJuIGV2ZW50IGluZm9ybWF0aW9uIHRoYXQgaW5jbHVkZXMgc3RhdHVzIGNvZGUuCi8vLyBcbm90ZSBNVVNUIFJFTUFJTiBVTkNIQU5HRUQ6IFxiIG9zTWVzc2FnZUdldCBzaGFsbCBiZSBjb25zaXN0ZW50IGluIGV2ZXJ5IENNU0lTLVJUT1MuCm9zRXZlbnQgb3NNZXNzYWdlR2V0IChvc01lc3NhZ2VRSWQgcXVldWVfaWQsIHVpbnQzMl90IG1pbGxpc2VjKTsKCiNlbmRpZiAgICAgLy8gTWVzc2FnZSBRdWV1ZXMgYXZhaWxhYmxlCgoKLy8gID09PT0gTWFpbCBRdWV1ZSBNYW5hZ2VtZW50IEZ1bmN0aW9ucyA9PT09CgojaWYgKGRlZmluZWQgKG9zRmVhdHVyZV9NYWlsUSkgICYmICAob3NGZWF0dXJlX01haWxRICE9IDApKSAgICAgLy8gTWFpbCBRdWV1ZXMgYXZhaWxhYmxlCgovLy8gXGJyaWVmIENyZWF0ZSBhIE1haWwgUXVldWUgRGVmaW5pdGlvbi4KLy8vIFxwYXJhbSAgICAgICAgIG5hbWUgICAgICAgICAgbmFtZSBvZiB0aGUgcXVldWUKLy8vIFxwYXJhbSAgICAgICAgIHF1ZXVlX3N6ICAgICAgbWF4aW11bSBudW1iZXIgb2YgbWVzc2FnZXMgaW4gcXVldWUKLy8vIFxwYXJhbSAgICAgICAgIHR5cGUgICAgICAgICAgZGF0YSB0eXBlIG9mIGEgc2luZ2xlIG1lc3NhZ2UgZWxlbWVudAovLy8gXG5vdGUgQ0FOIEJFIENIQU5HRUQ6IFRoZSBwYXJhbWV0ZXIgdG8gXGIgb3NNYWlsUURlZiBzaGFsbCBiZSBjb25zaXN0ZW50IGJ1dCB0aGUKLy8vICAgICAgIG1hY3JvIGJvZHkgaXMgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgaW4gZXZlcnkgQ01TSVMtUlRPUy4KI2lmIGRlZmluZWQgKG9zT2JqZWN0c0V4dGVybmFsKSAgLy8gb2JqZWN0IGlzIGV4dGVybmFsCiNkZWZpbmUgb3NNYWlsUURlZihuYW1lLCBxdWV1ZV9zeiwgdHlwZSkgXApleHRlcm4gc3RydWN0IG9zX21haWxRX2NiICpvc19tYWlsUV9jYl8jI25hbWUgXApleHRlcm4gb3NNYWlsUURlZl90IG9zX21haWxRX2RlZl8jI25hbWUKI2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVmaW5lIHRoZSBvYmplY3QKI2RlZmluZSBvc01haWxRRGVmKG5hbWUsIHF1ZXVlX3N6LCB0eXBlKSBcCnN0cnVjdCBvc19tYWlsUV9jYiAqb3NfbWFpbFFfY2JfIyNuYW1lOyBcCmNvbnN0IG9zTWFpbFFEZWZfdCBvc19tYWlsUV9kZWZfIyNuYW1lID0gIFwKeyAocXVldWVfc3opLCBzaXplb2YgKHR5cGUpLCAoJm9zX21haWxRX2NiXyMjbmFtZSkgfQojZW5kaWYKCi8vLyBcYnJpZWYgQWNjZXNzIGEgTWFpbCBRdWV1ZSBEZWZpbml0aW9uLgovLy8gXHBhcmFtICAgICAgICAgbmFtZSAgICAgICAgICBuYW1lIG9mIHRoZSBxdWV1ZQovLy8gXG5vdGUgQ0FOIEJFIENIQU5HRUQ6IFRoZSBwYXJhbWV0ZXIgdG8gXGIgb3NNYWlsUSBzaGFsbCBiZSBjb25zaXN0ZW50IGJ1dCB0aGUKLy8vICAgICAgIG1hY3JvIGJvZHkgaXMgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgaW4gZXZlcnkgQ01TSVMtUlRPUy4KI2RlZmluZSBvc01haWxRKG5hbWUpICBcCiZvc19tYWlsUV9kZWZfIyNuYW1lCgovLy8gQ3JlYXRlIGFuZCBJbml0aWFsaXplIG1haWwgcXVldWUuCi8vLyBccGFyYW1baW5dICAgICBxdWV1ZV9kZWYgICAgIHJlZmVyZW5jZSB0byB0aGUgbWFpbCBxdWV1ZSBkZWZpbml0aW9uIG9idGFpbiB3aXRoIFxyZWYgb3NNYWlsUQovLy8gXHBhcmFtW2luXSAgICAgdGhyZWFkX2lkICAgICB0aHJlYWQgSUQgKG9idGFpbmVkIGJ5IFxyZWYgb3NUaHJlYWRDcmVhdGUgb3IgXHJlZiBvc1RocmVhZEdldElkKSBvciBOVUxMLgovLy8gXHJldHVybiBtYWlsIHF1ZXVlIElEIGZvciByZWZlcmVuY2UgYnkgb3RoZXIgZnVuY3Rpb25zIG9yIE5VTEwgaW4gY2FzZSBvZiBlcnJvci4KLy8vIFxub3RlIE1VU1QgUkVNQUlOIFVOQ0hBTkdFRDogXGIgb3NNYWlsQ3JlYXRlIHNoYWxsIGJlIGNvbnNpc3RlbnQgaW4gZXZlcnkgQ01TSVMtUlRPUy4Kb3NNYWlsUUlkIG9zTWFpbENyZWF0ZSAoY29uc3Qgb3NNYWlsUURlZl90ICpxdWV1ZV9kZWYsIG9zVGhyZWFkSWQgdGhyZWFkX2lkKTsKCi8vLyBBbGxvY2F0ZSBhIG1lbW9yeSBibG9jayBmcm9tIGEgbWFpbC4KLy8vIFxwYXJhbVtpbl0gICAgIHF1ZXVlX2lkICAgICAgbWFpbCBxdWV1ZSBJRCBvYnRhaW5lZCB3aXRoIFxyZWYgb3NNYWlsQ3JlYXRlLgovLy8gXHBhcmFtW2luXSAgICAgbWlsbGlzZWMgICAgICB0aW1lb3V0IHZhbHVlIG9yIDAgaW4gY2FzZSBvZiBubyB0aW1lLW91dAovLy8gXHJldHVybiBwb2ludGVyIHRvIG1lbW9yeSBibG9jayB0aGF0IGNhbiBiZSBmaWxsZWQgd2l0aCBtYWlsIG9yIE5VTEwgaW4gY2FzZSBvZiBlcnJvci4KLy8vIFxub3RlIE1VU1QgUkVNQUlOIFVOQ0hBTkdFRDogXGIgb3NNYWlsQWxsb2Mgc2hhbGwgYmUgY29uc2lzdGVudCBpbiBldmVyeSBDTVNJUy1SVE9TLgp2b2lkICpvc01haWxBbGxvYyAob3NNYWlsUUlkIHF1ZXVlX2lkLCB1aW50MzJfdCBtaWxsaXNlYyk7CgovLy8gQWxsb2NhdGUgYSBtZW1vcnkgYmxvY2sgZnJvbSBhIG1haWwgYW5kIHNldCBtZW1vcnkgYmxvY2sgdG8gemVyby4KLy8vIFxwYXJhbVtpbl0gICAgIHF1ZXVlX2lkICAgICAgbWFpbCBxdWV1ZSBJRCBvYnRhaW5lZCB3aXRoIFxyZWYgb3NNYWlsQ3JlYXRlLgovLy8gXHBhcmFtW2luXSAgICAgbWlsbGlzZWMgICAgICB0aW1lb3V0IHZhbHVlIG9yIDAgaW4gY2FzZSBvZiBubyB0aW1lLW91dAovLy8gXHJldHVybiBwb2ludGVyIHRvIG1lbW9yeSBibG9jayB0aGF0IGNhbiBiZSBmaWxsZWQgd2l0aCBtYWlsIG9yIE5VTEwgaW4gY2FzZSBvZiBlcnJvci4KLy8vIFxub3RlIE1VU1QgUkVNQUlOIFVOQ0hBTkdFRDogXGIgb3NNYWlsQ0FsbG9jIHNoYWxsIGJlIGNvbnNpc3RlbnQgaW4gZXZlcnkgQ01TSVMtUlRPUy4Kdm9pZCAqb3NNYWlsQ0FsbG9jIChvc01haWxRSWQgcXVldWVfaWQsIHVpbnQzMl90IG1pbGxpc2VjKTsKCi8vLyBQdXQgYSBtYWlsIHRvIGEgcXVldWUuCi8vLyBccGFyYW1baW5dICAgICBxdWV1ZV9pZCAgICAgIG1haWwgcXVldWUgSUQgb2J0YWluZWQgd2l0aCBccmVmIG9zTWFpbENyZWF0ZS4KLy8vIFxwYXJhbVtpbl0gICAgIG1haWwgICAgICAgICAgbWVtb3J5IGJsb2NrIHByZXZpb3VzbHkgYWxsb2NhdGVkIHdpdGggXHJlZiBvc01haWxBbGxvYyBvciBccmVmIG9zTWFpbENBbGxvYy4KLy8vIFxyZXR1cm4gc3RhdHVzIGNvZGUgdGhhdCBpbmRpY2F0ZXMgdGhlIGV4ZWN1dGlvbiBzdGF0dXMgb2YgdGhlIGZ1bmN0aW9uLgovLy8gXG5vdGUgTVVTVCBSRU1BSU4gVU5DSEFOR0VEOiBcYiBvc01haWxQdXQgc2hhbGwgYmUgY29uc2lzdGVudCBpbiBldmVyeSBDTVNJUy1SVE9TLgpvc1N0YXR1cyBvc01haWxQdXQgKG9zTWFpbFFJZCBxdWV1ZV9pZCwgdm9pZCAqbWFpbCk7CgovLy8gR2V0IGEgbWFpbCBmcm9tIGEgcXVldWUuCi8vLyBccGFyYW1baW5dICAgICBxdWV1ZV9pZCAgICAgIG1haWwgcXVldWUgSUQgb2J0YWluZWQgd2l0aCBccmVmIG9zTWFpbENyZWF0ZS4KLy8vIFxwYXJhbVtpbl0gICAgIG1pbGxpc2VjICAgICAgdGltZW91dCB2YWx1ZSBvciAwIGluIGNhc2Ugb2Ygbm8gdGltZS1vdXQKLy8vIFxyZXR1cm4gZXZlbnQgdGhhdCBjb250YWlucyBtYWlsIGluZm9ybWF0aW9uIG9yIGVycm9yIGNvZGUuCi8vLyBcbm90ZSBNVVNUIFJFTUFJTiBVTkNIQU5HRUQ6IFxiIG9zTWFpbEdldCBzaGFsbCBiZSBjb25zaXN0ZW50IGluIGV2ZXJ5IENNU0lTLVJUT1MuCm9zRXZlbnQgb3NNYWlsR2V0IChvc01haWxRSWQgcXVldWVfaWQsIHVpbnQzMl90IG1pbGxpc2VjKTsKCi8vLyBGcmVlIGEgbWVtb3J5IGJsb2NrIGZyb20gYSBtYWlsLgovLy8gXHBhcmFtW2luXSAgICAgcXVldWVfaWQgICAgICBtYWlsIHF1ZXVlIElEIG9idGFpbmVkIHdpdGggXHJlZiBvc01haWxDcmVhdGUuCi8vLyBccGFyYW1baW5dICAgICBtYWlsICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIG1lbW9yeSBibG9jayB0aGF0IHdhcyBvYnRhaW5lZCB3aXRoIFxyZWYgb3NNYWlsR2V0LgovLy8gXHJldHVybiBzdGF0dXMgY29kZSB0aGF0IGluZGljYXRlcyB0aGUgZXhlY3V0aW9uIHN0YXR1cyBvZiB0aGUgZnVuY3Rpb24uCi8vLyBcbm90ZSBNVVNUIFJFTUFJTiBVTkNIQU5HRUQ6IFxiIG9zTWFpbEZyZWUgc2hhbGwgYmUgY29uc2lzdGVudCBpbiBldmVyeSBDTVNJUy1SVE9TLgpvc1N0YXR1cyBvc01haWxGcmVlIChvc01haWxRSWQgcXVldWVfaWQsIHZvaWQgKm1haWwpOwoKI2VuZGlmICAvLyBNYWlsIFF1ZXVlcyBhdmFpbGFibGUKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKiogQWRkaXRpb25hbCBzcGVjaWZpYyBBUElzIHRvIEZyZWUgUlRPUyAqKioqKioqKioqKiovCi8qKgoqIEBicmllZiAgSGFuZGxlcyB0aGUgdGljayBpbmNyZW1lbnQKKiBAcGFyYW0gIG5vbmUuCiogQHJldHZhbCBub25lLgoqLwp2b2lkIG9zU3lzdGlja0hhbmRsZXIodm9pZCk7CgojaWYgKCBJTkNMVURFX2VUYXNrR2V0U3RhdGUgPT0gMSApCi8qKgoqIEBicmllZiAgT2J0YWluIHRoZSBzdGF0ZSBvZiBhbnkgdGhyZWFkLgoqIEBwYXJhbSAgIHRocmVhZF9pZCAgIHRocmVhZCBJRCBvYnRhaW5lZCBieSBccmVmIG9zVGhyZWFkQ3JlYXRlIG9yIFxyZWYgb3NUaHJlYWRHZXRJZC4KKiBAcmV0dmFsICB0aGUgc3RhZSBvZiB0aGUgdGhyZWFkLCBzdGF0ZXMgYXJlIGVuY29kZWQgYnkgdGhlIG9zVGhyZWFkU3RhdGUgZW51bWVyYXRlZCB0eXBlLgoqLwpvc1RocmVhZFN0YXRlIG9zVGhyZWFkR2V0U3RhdGUob3NUaHJlYWRJZCB0aHJlYWRfaWQpOwojZW5kaWYgLyogSU5DTFVERV9lVGFza0dldFN0YXRlICovCgojaWYgKCBJTkNMVURFX2VUYXNrR2V0U3RhdGUgPT0gMSApCi8qKgoqIEBicmllZiBDaGVjayBpZiBhIHRocmVhZCBpcyBhbHJlYWR5IHN1c3BlbmRlZCBvciBub3QuCiogQHBhcmFtIHRocmVhZF9pZCB0aHJlYWQgSUQgb2J0YWluZWQgYnkgXHJlZiBvc1RocmVhZENyZWF0ZSBvciBccmVmIG9zVGhyZWFkR2V0SWQuCiogQHJldHZhbCBzdGF0dXMgY29kZSB0aGF0IGluZGljYXRlcyB0aGUgZXhlY3V0aW9uIHN0YXR1cyBvZiB0aGUgZnVuY3Rpb24uCiovCgpvc1N0YXR1cyBvc1RocmVhZElzU3VzcGVuZGVkKG9zVGhyZWFkSWQgdGhyZWFkX2lkKTsKCiNlbmRpZiAvKiBJTkNMVURFX2VUYXNrR2V0U3RhdGUgKi8KCi8qKgoqIEBicmllZiAgU3VzcGVuZCBleGVjdXRpb24gb2YgYSB0aHJlYWQuCiogQHBhcmFtICAgdGhyZWFkX2lkICAgdGhyZWFkIElEIG9idGFpbmVkIGJ5IFxyZWYgb3NUaHJlYWRDcmVhdGUgb3IgXHJlZiBvc1RocmVhZEdldElkLgoqIEByZXR2YWwgIHN0YXR1cyBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBleGVjdXRpb24gc3RhdHVzIG9mIHRoZSBmdW5jdGlvbi4KKi8Kb3NTdGF0dXMgb3NUaHJlYWRTdXNwZW5kIChvc1RocmVhZElkIHRocmVhZF9pZCk7CgovKioKKiBAYnJpZWYgIFJlc3VtZSBleGVjdXRpb24gb2YgYSBzdXNwZW5kZWQgdGhyZWFkLgoqIEBwYXJhbSAgIHRocmVhZF9pZCAgIHRocmVhZCBJRCBvYnRhaW5lZCBieSBccmVmIG9zVGhyZWFkQ3JlYXRlIG9yIFxyZWYgb3NUaHJlYWRHZXRJZC4KKiBAcmV0dmFsICBzdGF0dXMgY29kZSB0aGF0IGluZGljYXRlcyB0aGUgZXhlY3V0aW9uIHN0YXR1cyBvZiB0aGUgZnVuY3Rpb24uCiovCm9zU3RhdHVzIG9zVGhyZWFkUmVzdW1lIChvc1RocmVhZElkIHRocmVhZF9pZCk7CgovKioKKiBAYnJpZWYgIFN1c3BlbmQgZXhlY3V0aW9uIG9mIGEgYWxsIGFjdGl2ZSB0aHJlYWRzLgoqIEByZXR2YWwgIHN0YXR1cyBjb2RlIHRoYXQgaW5kaWNhdGVzIHRoZSBleGVjdXRpb24gc3RhdHVzIG9mIHRoZSBmdW5jdGlvbi4KKi8Kb3NTdGF0dXMgb3NUaHJlYWRTdXNwZW5kQWxsICh2b2lkKTsKCi8qKgoqIEBicmllZiAgUmVzdW1lIGV4ZWN1dGlvbiBvZiBhIGFsbCBzdXNwZW5kZWQgdGhyZWFkcy4KKiBAcmV0dmFsICBzdGF0dXMgY29kZSB0aGF0IGluZGljYXRlcyB0aGUgZXhlY3V0aW9uIHN0YXR1cyBvZiB0aGUgZnVuY3Rpb24uCiovCm9zU3RhdHVzIG9zVGhyZWFkUmVzdW1lQWxsICh2b2lkKTsKCi8qKgoqIEBicmllZiAgRGVsYXkgYSB0YXNrIHVudGlsIGEgc3BlY2lmaWVkIHRpbWUKKiBAcGFyYW0gICBQcmV2aW91c1dha2VUaW1lICAgUG9pbnRlciB0byBhIHZhcmlhYmxlIHRoYXQgaG9sZHMgdGhlIHRpbWUgYXQgd2hpY2ggdGhlIAoqICAgICAgICAgIHRhc2sgd2FzIGxhc3QgdW5ibG9ja2VkLiBQcmV2aW91c1dha2VUaW1lIG11c3QgYmUgaW5pdGlhbGlzZWQgd2l0aCB0aGUgY3VycmVudCB0aW1lCiogICAgICAgICAgcHJpb3IgdG8gaXRzIGZpcnN0IHVzZSAoUHJldmlvdXNXYWtlVGltZSA9IG9zS2VybmVsU3lzVGljaygpICkKKiBAcGFyYW0gICBtaWxsaXNlYyAgICB0aW1lIGRlbGF5IHZhbHVlCiogQHJldHZhbCAgc3RhdHVzIGNvZGUgdGhhdCBpbmRpY2F0ZXMgdGhlIGV4ZWN1dGlvbiBzdGF0dXMgb2YgdGhlIGZ1bmN0aW9uLgoqLwpvc1N0YXR1cyBvc0RlbGF5VW50aWwgKHVpbnQzMl90ICpQcmV2aW91c1dha2VUaW1lLCB1aW50MzJfdCBtaWxsaXNlYyk7CgovKioKKiBAYnJpZWYgICBBYm9ydCB0aGUgZGVsYXkgZm9yIGEgc3BlY2lmaWMgdGhyZWFkCiogQHBhcmFtICAgdGhyZWFkX2lkICAgdGhyZWFkIElEIG9idGFpbmVkIGJ5IFxyZWYgb3NUaHJlYWRDcmVhdGUgb3IgXHJlZiBvc1RocmVhZEdldElkICAgCiogQHJldHZhbCAgc3RhdHVzIGNvZGUgdGhhdCBpbmRpY2F0ZXMgdGhlIGV4ZWN1dGlvbiBzdGF0dXMgb2YgdGhlIGZ1bmN0aW9uLgoqLwpvc1N0YXR1cyBvc0Fib3J0RGVsYXkob3NUaHJlYWRJZCB0aHJlYWRfaWQpOwoKLyoqCiogQGJyaWVmICAgTGlzdHMgYWxsIHRoZSBjdXJyZW50IHRocmVhZHMsIGFsb25nIHdpdGggdGhlaXIgY3VycmVudCBzdGF0ZSAKKiAgICAgICAgICBhbmQgc3RhY2sgdXNhZ2UgaGlnaCB3YXRlciBtYXJrLgoqIEBwYXJhbSAgIGJ1ZmZlciAgIEEgYnVmZmVyIGludG8gd2hpY2ggdGhlIGFib3ZlIG1lbnRpb25lZCBkZXRhaWxzCiogICAgICAgICAgd2lsbCBiZSB3cml0dGVuCiogQHJldHZhbCAgc3RhdHVzIGNvZGUgdGhhdCBpbmRpY2F0ZXMgdGhlIGV4ZWN1dGlvbiBzdGF0dXMgb2YgdGhlIGZ1bmN0aW9uLgoqLwpvc1N0YXR1cyBvc1RocmVhZExpc3QgKHVpbnQ4X3QgKmJ1ZmZlcik7CgovKioKKiBAYnJpZWYgIFJlY2VpdmUgYW4gaXRlbSBmcm9tIGEgcXVldWUgd2l0aG91dCByZW1vdmluZyB0aGUgaXRlbSBmcm9tIHRoZSBxdWV1ZS4KKiBAcGFyYW0gIHF1ZXVlX2lkICBtZXNzYWdlIHF1ZXVlIElEIG9idGFpbmVkIHdpdGggXHJlZiBvc01lc3NhZ2VDcmVhdGUuCiogQHBhcmFtICBtaWxsaXNlYyAgdGltZW91dCB2YWx1ZSBvciAwIGluIGNhc2Ugb2Ygbm8gdGltZS1vdXQuCiogQHJldHZhbCBldmVudCBpbmZvcm1hdGlvbiB0aGF0IGluY2x1ZGVzIHN0YXR1cyBjb2RlLgoqLwpvc0V2ZW50IG9zTWVzc2FnZVBlZWsgKG9zTWVzc2FnZVFJZCBxdWV1ZV9pZCwgdWludDMyX3QgbWlsbGlzZWMpOwoKLyoqCiogQGJyaWVmICBHZXQgdGhlIG51bWJlciBvZiBtZXNzYWdlZCBzdG9yZWQgaW4gYSBxdWV1ZS4KKiBAcGFyYW0gIHF1ZXVlX2lkICBtZXNzYWdlIHF1ZXVlIElEIG9idGFpbmVkIHdpdGggXHJlZiBvc01lc3NhZ2VDcmVhdGUuCiogQHJldHZhbCBudW1iZXIgb2YgbWVzc2FnZXMgc3RvcmVkIGluIGEgcXVldWUuCiovCnVpbnQzMl90IG9zTWVzc2FnZVdhaXRpbmcob3NNZXNzYWdlUUlkIHF1ZXVlX2lkKTsKCi8qKgoqIEBicmllZiAgR2V0IHRoZSBhdmFpbGFibGUgc3BhY2UgaW4gYSBtZXNzYWdlIHF1ZXVlLgoqIEBwYXJhbSAgcXVldWVfaWQgIG1lc3NhZ2UgcXVldWUgSUQgb2J0YWluZWQgd2l0aCBccmVmIG9zTWVzc2FnZUNyZWF0ZS4KKiBAcmV0dmFsIGF2YWlsYWJsZSBzcGFjZSBpbiBhIG1lc3NhZ2UgcXVldWUuCiovCnVpbnQzMl90IG9zTWVzc2FnZUF2YWlsYWJsZVNwYWNlKG9zTWVzc2FnZVFJZCBxdWV1ZV9pZCk7CgovKioKKiBAYnJpZWYgRGVsZXRlIGEgTWVzc2FnZSBRdWV1ZQoqIEBwYXJhbSAgcXVldWVfaWQgIG1lc3NhZ2UgcXVldWUgSUQgb2J0YWluZWQgd2l0aCBccmVmIG9zTWVzc2FnZUNyZWF0ZS4KKiBAcmV0dmFsICBzdGF0dXMgY29kZSB0aGF0IGluZGljYXRlcyB0aGUgZXhlY3V0aW9uIHN0YXR1cyBvZiB0aGUgZnVuY3Rpb24uCiovCm9zU3RhdHVzIG9zTWVzc2FnZURlbGV0ZSAob3NNZXNzYWdlUUlkIHF1ZXVlX2lkKTsKCi8qKgoqIEBicmllZiAgQ3JlYXRlIGFuZCBJbml0aWFsaXplIGEgUmVjdXJzaXZlIE11dGV4CiogQHBhcmFtICBtdXRleF9kZWYgICAgIG11dGV4IGRlZmluaXRpb24gcmVmZXJlbmNlZCB3aXRoIFxyZWYgb3NNdXRleC4KKiBAcmV0dmFsICBtdXRleCBJRCBmb3IgcmVmZXJlbmNlIGJ5IG90aGVyIGZ1bmN0aW9ucyBvciBOVUxMIGluIGNhc2Ugb2YgZXJyb3IuLgoqLwpvc011dGV4SWQgb3NSZWN1cnNpdmVNdXRleENyZWF0ZSAoY29uc3Qgb3NNdXRleERlZl90ICptdXRleF9kZWYpOwoKLyoqCiogQGJyaWVmICBSZWxlYXNlIGEgUmVjdXJzaXZlIE11dGV4CiogQHBhcmFtICAgbXV0ZXhfaWQgICAgICBtdXRleCBJRCBvYnRhaW5lZCBieSBccmVmIG9zUmVjdXJzaXZlTXV0ZXhDcmVhdGUuCiogQHJldHZhbCAgc3RhdHVzIGNvZGUgdGhhdCBpbmRpY2F0ZXMgdGhlIGV4ZWN1dGlvbiBzdGF0dXMgb2YgdGhlIGZ1bmN0aW9uLgoqLwpvc1N0YXR1cyBvc1JlY3Vyc2l2ZU11dGV4UmVsZWFzZSAob3NNdXRleElkIG11dGV4X2lkKTsKCi8qKgoqIEBicmllZiAgUmVsZWFzZSBhIFJlY3Vyc2l2ZSBNdXRleAoqIEBwYXJhbSAgIG11dGV4X2lkICAgIG11dGV4IElEIG9idGFpbmVkIGJ5IFxyZWYgb3NSZWN1cnNpdmVNdXRleENyZWF0ZS4KKiBAcGFyYW0gbWlsbGlzZWMgICAgICB0aW1lb3V0IHZhbHVlIG9yIDAgaW4gY2FzZSBvZiBubyB0aW1lLW91dC4KKiBAcmV0dmFsICBzdGF0dXMgY29kZSB0aGF0IGluZGljYXRlcyB0aGUgZXhlY3V0aW9uIHN0YXR1cyBvZiB0aGUgZnVuY3Rpb24uCiovCm9zU3RhdHVzIG9zUmVjdXJzaXZlTXV0ZXhXYWl0IChvc011dGV4SWQgbXV0ZXhfaWQsIHVpbnQzMl90IG1pbGxpc2VjKTsKCi8qKgoqIEBicmllZiAgUmV0dXJucyB0aGUgY3VycmVudCBjb3VudCB2YWx1ZSBvZiBhIGNvdW50aW5nIHNlbWFwaG9yZQoqIEBwYXJhbSAgIHNlbWFwaG9yZV9pZCAgc2VtYXBob3JlX2lkIElEIG9idGFpbmVkIGJ5IFxyZWYgb3NTZW1hcGhvcmVDcmVhdGUuCiogQHJldHZhbCAgY291bnQgdmFsdWUKKi8KdWludDMyX3Qgb3NTZW1hcGhvcmVHZXRDb3VudChvc1NlbWFwaG9yZUlkIHNlbWFwaG9yZV9pZCk7CgojaWZkZWYgIF9fY3BsdXNwbHVzCn0KI2VuZGlmCgojZW5kaWYgIC8vIF9DTVNJU19PU19ICg==