ZGlmZiAtLWdpdCBhL3N0ZC9wbGF5ZXIvY29tYmF0LmMgYi9zdGQvcGxheWVyL2NvbWJhdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiYjVhMWIKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvcGxheWVyL2NvbWJhdC5jCkBAIC0wLDAgKzEsMjE3IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gcGxheWVyL2NvbWJhdC5jIC0tIGNvbWJhdCBzdGF0aXN0aWNzCisvLworLy8gJElkOiBjb21iYXQuYyA5MDA4IDIwMTUtMDEtMDYgMTc6MjA6MTdaIFplc3N0cmEgJAorI3ByYWdtYSBzdHJvbmdfdHlwZXMKKyNwcmFnbWEgc2F2ZV90eXBlcworI3ByYWdtYSByYW5nZV9jaGVjaworI3ByYWdtYSBub19jbG9uZQorI3ByYWdtYSBwZWRhbnRpYworCitpbmhlcml0ICIvc3RkL2xpdmluZy9jb21iYXQiOworaW5oZXJpdCAiL3N0ZC9wbGF5ZXIvcGtsb2ciOworCisjaW5jbHVkZSA8dGhpbmcvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKyNpbmNsdWRlIDxjb21iYXQuaD4KKyNpbmNsdWRlIDxuZXdfc2tpbGxzLmg+CisKKyNkZWZpbmUgTUUgdGhpc19vYmplY3QoKQorI2RlZmluZSBTVEFUTUFTVEVSICIvcC9zZXJ2aWNlL3JvY2h1cy9ndWlsZHN0YXQvbWFzdGVyIgorCitwcml2YXRlIG5vc2F2ZSBjbG9zdXJlIG1vZF9kZWZfc3RhdDsKK3ByaXZhdGUgbm9zYXZlIHN0cmluZyAqcGxBdHRhY2tlZCA9ICh7fSk7CisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZSgpIHsKKyAgY29tYmF0OjpjcmVhdGUoKTsKKyAgLy8gUF9OT19BVFRBQ0sgaXN0IG5pY2h0IGZ1ZXIgU3BpZWxlciBnZWRhY2h0LiBBdXNuYWhtZTogU3BpZWxlciBpc3QKKyAgLy8gR2Vpc3QsIGRhbm4gc2V0enQgZGFzIFNwaWVsZXJvYmpla3QgYWJlciBzZWxiZXIuCisgIFNldChQX05PX0FUVEFDSywgU0VDVVJFRHxOT1NFVE1FVEhPRCwgRl9NT0RFX0FTKTsKKyAgCisgIFNldChQX0hFTFBFUl9OUEMsIFBST1RFQ1RFRCwgRl9NT0RFKTsKKyAgU2V0UHJvcChQX0hFTFBFUl9OUEMsIChbXSkgKTsKK30KKworLy8gTWFza2UgZnVlciBhbGxlIG1vZWdsaWNoZW4gS2xhc3NlbiB2b24gSGVsZmVyLU5QQworI2RlZmluZSBDTEFTU19NQVNLIDB4MWZmZmZmZmYKKy8qKiByZWdpc3RyaWVydCBkZW4gTlBDIGFscyBIZWxmZXIgdm9uIGRpZXNlbSBTcGllbGVyLgorICBAcGFyYW1baW5dIG5wYyBvYmplY3QgSGVsZmVyLU5QQworICBAcGFyYW1baW5dIGZsYWdzIGludCBCaXRmZWxkIHZvbiBGbGFncworICBAcmV0dXJuIGludCAxLCBmYWxscyBkZXIgSGVsZmVyLU5QQyByZWdpc3RyaWVydCB3dXJkZSB1bmQgbm9jaCBuaWNodAorICByZWdpc3RyaWVydCB3YXIuCisgIEBhdHRlbnRpb24gTnV0enQgYXVzLCBkYXNzIFF1ZXJ5UHJvcChQX0hFTFBFUl9OUEMpIF9rZWluZV8gS29waWUgZGVzCisgIE1hcHBpbmdzIGluIGRlciBQcm9wIGxpZWZlcnQuCisgICovCitwdWJsaWMgaW50IFJlZ2lzdGVySGVscGVyTlBDKG9iamVjdCBucGMsIGludCBmbGFncykgeworICBpZiAoIW9iamVjdHAobnBjKSkKKyAgICByYWlzZV9lcnJvcihzcHJpbnRmKCAiV3JvbmcgYXJndW1lbnQgMSBpbiBSZWdpc3RlckhlbHBlck5QQygpLiAiCisgICAgICAgICAgIkV4cGVjdGVkIDxvYmplY3Q+LCBnb3QgJS4xMDBPXG4iLCBucGMpKTsKKyAgaWYgKCFpbnRwKGZsYWdzKSB8fCBmbGFncyA8IDEpCisgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoICJXcm9uZyBhcmd1bWVudCAyIGluIFJlZ2lzdGVySGVscGVyTlBDKCkuICIKKyAgICAgICAgICAiRXhwZWN0ZWQgcG9zaXRpdmUgPGludD4sIGdvdCAlT1xuIiwgZmxhZ3MpKTsKKyAgCisgIG1hcHBpbmcgaGVscGVycyA9IFF1ZXJ5UHJvcChQX0hFTFBFUl9OUEMpOworICAKKyAgLy8gc2Nob24gcmVnaXN0cmllcnRlIHNpbmQgd2l0emxvcy4KKyAgaWYgKG1lbWJlcihoZWxwZXJzLCBucGMpKQorICAgIHJldHVybiAwOworICAKKyAgLy8gYXVmIGV4a2x1c2l2ZSBIZWxmZXIgcHJ1ZWZlbi4KKyAgZm9yZWFjaChvYmplY3QgaGVscGVyLCBpbnQgZmw6IGhlbHBlcnMpIHsKKyAgICAvLyBmbGFncyBpZGVudGlzY2g/IERhbm4gS2xhc3NlIHVuZCBFeGtsdXNpdml0YWV0IGlkZW50aXNjaAorICAgIGlmIChmbCA9PSBmbGFncykKKyAgICAgIHJldHVybiAwOworICAgIC8vIG9kZXIgZWluZXIgdm9uIGJlaWRlbiBleGtsdXNpdiB1bmQgYmVpZGUgaW4gZGVyIGdsZWljaGVuIEtsYXNzZT8KKyAgICBlbHNlIGlmICggKChmbCAmIEVYQ0xVU0lWRV9IRUxQRVIpIHx8IChmbGFncyAmIEVYQ0xVU0lWRV9IRUxQRVIpKQorICAgICAgICAgICAgICAmJiAoKGZsICYgQ0xBU1NfTUFTSykgPT0gKGZsYWdzICYgQ0xBU1NfTUFTSykpICkKKyAgICAgIHJldHVybiAwOworICB9CisgIC8vIHNjaGVpbnQgd29obCBvayB6dSBzZWluLiBSZWdpc3RyaWVyZW4gdW5kIFByb3AgaW0gTlBDIHNldHplbi4KKyAgaGVscGVycyArPSAoWyBucGM6IGZsYWdzIF0pOworICBucGMtPlNldFByb3AoUF9IRUxQRVJfTlBDLCAoeyB0aGlzX29iamVjdCgpLCBmbGFncyB9KSApOworICAvLyBtb21lbnRhbiB1bm5vZXRpZywgZGEgaGVscGVycyBrZWluZSBLb3BpZSBpc3QuCisgIC8vIFNldFByb3AoUF9IRUxQRVJfTlBDLCBoZWxwZXJzKTsKKworICByZXR1cm4gMTsKK30KKyN1bmRlZiBDTEFTU19NQVNLCisKKy8qKiBkZS1yZWdpc3RyaWVydCBkZW4gTlBDIGFscyBIZWxmZXIgdm9uIGRpZXNlbSBTcGllbGVyLgorICBAcGFyYW1baW5dIG5wYyBvYmplY3QgSGVsZmVyLU5QQworICBAcmV0dXJuIGludCAxLCBmYWxscyBkZXIgSGVsZmVyLU5QQyByZWdpc3RyaWVydCB3YXIgdW5kIGVudGZlcm50IHd1cmRlLgorICBAYXR0ZW50aW9uIE51dHp0IGF1cywgZGFzcyBRdWVyeVByb3AoUF9IRUxQRVJfTlBDKSBfa2VpbmVfIEtvcGllIGRlcworICBNYXBwaW5ncyBpbiBkZXIgUHJvcCBsaWVmZXJ0LgorICovCitwdWJsaWMgaW50IFVucmVnaXN0ZXJIZWxwZXJOUEMob2JqZWN0IG5wYykgeworICBpZiAoIW9iamVjdHAobnBjKSkKKyAgICByYWlzZV9lcnJvcihzcHJpbnRmKCJXcm9uZyBhcmd1bWVudCBpbiBVbnJlZ2lzdGVySGVscGVybk5QQygpLiAiCisgICAgICAgICAgIkV4cGVjdGVkIDxvYmplY3Q+LCBnb3QgJS4xMDBPXG4iLCBucGMpKTsKKworICBtYXBwaW5nIGhlbHBlcnMgPSBRdWVyeVByb3AoUF9IRUxQRVJfTlBDKTsKKyAgaWYgKG1lbWJlcihoZWxwZXJzLCBucGMpKSB7CisgICAgbV9kZWxldGUoaGVscGVycywgbnBjKTsKKyAgICAvLyBtb21lbnRhbiB1bm5vZXRpZywgZGEgaGVscGVycyBrZWluZSBLb3BpZSBpc3QuCisgICAgLy8gU2V0UHJvcChQX0hFTFBFUl9OUEMsIGhlbHBlcnMpOworICAgIG5wYy0+U2V0UHJvcChQX0hFTFBFUl9OUEMsIDApOworICAgIHJldHVybiAxOworICB9CisgIHJldHVybiAwOworfQorCisvKiogRmVpbmQgZWludHJhZ2VuLgorICAqIFRyYWVndCBvYiBhbHMgRmVpbmQgZWluLiBEaWVzIGFsbGVyZGluZ3MgbnVyLCB3ZW5uIG9iIGtlaW4gU3BpZWxlciBpc3QKKyAgKiBvZGVyIGJlaWRlIFNwaWVsZXIgKGRpZXNlcyBPYmpla3QgdW5kIG9iKSBpbiBkZXIgU2NoYXR0ZW53ZWx0IHNpbmQgb2RlcgorICAqIGJlaWRlIFNwaWVsZXIgVGVzdHNwaWVsZXIgc2luZC4KKyAgIEBwYXJhbVtpbl0gb2IgcG90ZW50aWVsbGVyIEZlaW5kLgorICAgQHJldHVybiBpbnQgMSwgZmFsbHMgb2IgYWxzIF9uZXVlcl8gRmVpbmQgZWluZ2V0cmFnZW4gd3VyZGUuCisgICAqLworcHVibGljIGludCBJbnNlcnRFbmVteShvYmplY3Qgb2IpIHsKKyAgLy8gd2VubiBvYiBlaW4gU3BpZWxlciBpc3QgdW5kIG5pY2h0IHNvd29obCBpY2ggYWxzIGF1Y2ggb2IgaW4gZGVyCisgIC8vIFNjaGF0dGVud2VsdCBzaW5kLCB3aXJkIG9iIG5pY2h0IGFscyBGZWluZCBlaW5nZXRyYWdlbi4KKyAgaWYgKHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUob2IpCisgICAgICAmJiAoc3Ryc3RyKG9iamVjdF9uYW1lKGVudmlyb25tZW50KG9iKSksIi9kL3NjaGF0dGVud2VsdC8iKSE9MAorICAgICAgICAgIHx8IHN0cnN0cihvYmplY3RfbmFtZShlbnZpcm9ubWVudChNRSkpLCIvZC9zY2hhdHRlbndlbHQvIikhPTApCisgICAgICAmJiAoIVF1ZXJ5UHJvcChQX1RFU1RQTEFZRVIpIHx8ICFvYi0+UXVlcnlQcm9wKFBfVEVTVFBMQVlFUikpCisgICAgICkKKyAgeworICAgIHJldHVybiAwOworICB9CisgIHJldHVybiA6Okluc2VydEVuZW15KG9iKTsKK30KKworLyoqIEhhdCBkaWVzZXIgU3BpZWxlciBkZW4gU3BpZWxlciBwbCBhbmdlZ3JpZmZlbj8uCisgIEBwYXJhbVtpbl0gcGwgb2JqZWN0IHp1IHBydWVmZW5kZXIgU3BpZWxlcgorICBAcmV0dXJuIGludCAxLCBmYWxscyBkaWVzZXIgU3BpZWxlciBwbCBhbmdlZ3JpZmZlbiBoYXQuCisgIEBhdHRlbnRpb24gTmViZW5lZmZla3Q6IGJlcmVpbmlndCBkZW4gaW50ZXJuZW4gU3BlaWNoZXIgdm9uIFVJRHMgdm9uCisgIHplcnN0b2VydGVuIFNwaWVsZXJuIHVuZCBzb2xjaGVuLCBkaWUga2VpbmUgRmVpbmRlIG1laHIgc2luZC4KKyAgKi8KK3B1YmxpYyBpbnQgUXVlcnlQbEF0dGFja2VkKG9iamVjdCBwbCkgeworICBvYmplY3Qgb2I7CisKKyAgaWYgKCAhb2JqZWN0cChwbCkgKQorICAgIHJldHVybiAwOworCisgIGZvcmVhY2goc3RyaW5nIHBsbmFtZTogcGxBdHRhY2tlZCkgeworICAgIGlmICggISggb2I9KGZpbmRfcGxheWVyKHBsbmFtZSl8fGZpbmRfbmV0ZGVhZChwbG5hbWUpKSApCisgICAgICAgIHx8ICggIUlzRW5lbXkob2IpICYmICEob2ItPklzRW5lbXkoTUUpKSApICkKKyAgICAgIHBsQXR0YWNrZWQgLT0gKHtwbG5hbWV9KTsgLy8gamEsIGRhcyBnZWh0LiA7LSkKKyAgfQorICByZXR1cm4gKG1lbWJlciggcGxBdHRhY2tlZCwgZ2V0dWlkKHBsKSApID49IDApOworfQorCisvKioga2lsbCAtIEthbXBmIHN0YXJ0ZW4uCisgKiBGdWVndCBvYiBkZXIgRmVpbmRlc2xpc3RlIGhpbnp1LgorICovCitwdWJsaWMgaW50IEtpbGwob2JqZWN0IG9iKSB7CisKKyAgaWYgKCFvYmplY3RwKG9iKSkgcmV0dXJuIDA7CisKKyAgLy8gZGllcyBkaWVudCBudXIgZGF6dSwgZGFzIHBsQXR0YWNrZWQgbWFwcGluZyB6dSBiZXJlaW5pZ2VuLgorICAvLyBUT0RPOiBiZXNzZXIgbWFjaGVuLiA7LSkKKyAgaWYgKCBxdWVyeV9vbmNlX2ludGVyYWN0aXZlKG9iKSAmJiAhSXNFbmVteShvYikpIHsKKyAgICBRdWVyeVBsQXR0YWNrZWQoTUUpOworICAgIG9iLT5RdWVyeVBsQXR0YWNrZWQob2IpOyAvLyBha3R1YWxpc2llcmVuIC4uLgorICB9CisKKyAgaW50IHJlcyA9IGNvbWJhdDo6S2lsbChvYik7CisKKyAgLy8gZmFsbHMgb2IgbmVuIFNwaWVsZXIgaXN0LCBwcnVlZmVuLCBvYiBlcyBlaW4gU3BpZWxlci1TcGllbGVyLUFuZ3JpZmYKKyAgLy8gaXN0LgorICAvLyBEYWJlaSBnZ2YuIGxvZ2dlbiB1bmQgTWFnaWVyIHZlcnN0YWVuZGlnZW4uCisgIGlmIChxdWVyeV9vbmNlX2ludGVyYWN0aXZlKG9iKSAmJiBDaGVja1BsYXllckF0dGFjayhNRSwgb2IsIDApKQorICB7CisgICAgaWYgKHJlcyA9PSAtNCkgLy8gZmVpbmQgd3VyZGUgbmljaHQgZWluZ2V0cmFnZW4KKyAgICAgIHRlbGxfb2JqZWN0KE1FLCAiRWluIGdvZXR0bGljaGVyIEJlZmVobCBoaW5kZXJ0IERpY2ggYW0gS2FtcGYuXG4iKTsKKyAgICBlbHNlCisgICAgICBwbEF0dGFja2VkICs9ICh7IGdldHVpZChvYikgfSk7CisgIH0KKworICByZXR1cm4gcmVzOworfQorCitwdWJsaWMgaW50IERlZmVuZChpbnQgZGFtLCBzdHJpbmd8c3RyaW5nKiBkYW1fdHlwZSwgaW50fG1hcHBpbmcgc3BlbGwsIG9iamVjdCBlbmVteSkgeworICBpbnQgZGVsdGFfaHAscmVzOworCisgIGlmIChxdWVyeV9vbmNlX2ludGVyYWN0aXZlKE1FKQorICAgICAgJiYgIUlTX0xFQVJORVIoTUUpCisgICAgICAmJiAhb2JqZWN0cChnZXRfdHlwZV9pbmZvKG1vZF9kZWZfc3RhdCwyKSkpIHsKKyAgICBvYmplY3QgbWE7CisgICAgaWYgKCFvYmplY3RwKG1hPWZpbmRfb2JqZWN0KFNUQVRNQVNURVIpKSkKKyAgICAgIHJldHVybiA6OkRlZmVuZChkYW0sZGFtX3R5cGUsc3BlbGwsZW5lbXkpOworICAgIC8vIFN0YXRpc3RpayBudXIgYXVmcnVmZW4gZmFsbHMgTWFzdGVyIGdlbGFkZW4KKyAgICBtb2RfZGVmX3N0YXQ9c3ltYm9sX2Z1bmN0aW9uKCJNb2RpZnlEZWZlbmRTdGF0IixtYSk7CisgIH0KKworICBpZiAoY2xvc3VyZXAobW9kX2RlZl9zdGF0KSkKKyAgICBkZWx0YV9ocD1RdWVyeVByb3AoUF9IUCk7CisKKyAgcmVzPTo6RGVmZW5kKGRhbSxkYW1fdHlwZSxzcGVsbCxlbmVteSk7CisKKyAgaWYgKGNsb3N1cmVwKG1vZF9kZWZfc3RhdCkpIHsKKyAgICBkZWx0YV9ocC09UXVlcnlQcm9wKFBfSFApOworICAgIGlmIChkZWx0YV9ocDwwKQorICAgICAgZGVsdGFfaHA9MDsKKyAgICBmdW5jYWxsKG1vZF9kZWZfc3RhdCwKKyAgICAgICAgICAgIFF1ZXJ5UHJvcChQX0dVSUxEKSwKKyAgICAgICAgICAgIFF1ZXJ5UHJvcChQX0dVSUxEX0xFVkVMKSwKKyAgICAgICAgICAgIGRhbS0xMCpkZWx0YV9ocCwKKyAgICAgICAgICAgIGRhbV90eXBlLAorICAgICAgICAgICAgc3BlbGwpOworICB9CisKKyAgcmV0dXJuIHJlczsKK30KKworLy8gU3BpZWxlciBrb2VubmVuIGFscyBHZWlzdCBuaWNodCBr5G1wZmVuCisvLyBUT0RPOiBwcnVlZmVuLCBvYiBkYXMgU2V0emVuIHVuZCBMb2VzY2hlbiBkZXIgUHJvcCBpbiBzZXRfZ2hvc3QoKSBuaWNodAorLy8gYXVjaCBhdXNyZWljaGVuIHd1ZXJkZS4gSW4gZGVtIEZhbGwgbXVlc3N0ZSBtYW4gYWJlciBQX05PX0FUVEFDSyBhdWNoCisvLyBzcGVpY2hlcm4sIGRhIFBfR0hPU1QgZ2VzcGVpY2hlcnQgd2lyZC4uLgorc3RhdGljIG1peGVkIF9xdWVyeV9ub19hdHRhY2soKQoreworICAgIGlmICggUXVlcnlQcm9wKFBfR0hPU1QpICkKKyAgICAgICAgcmV0dXJuIDE7CisKKyAgICByZXR1cm4gUXVlcnkoUF9OT19BVFRBQ0spOworfQo=