ZGlmZiAtLWdpdCBhL3NlY3VyZS9QbGF5ZXJEZWxldGVyLmMgYi9zZWN1cmUvUGxheWVyRGVsZXRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiMWNlMmUKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvUGxheWVyRGVsZXRlci5jCkBAIC0wLDAgKzEsODcgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBtYXN0ZXIuYyAtLSBtYXN0ZXIgb2JqZWN0CisvLworLy8gJElkOiBtYXN0ZXIuYyA3MzM2IDIwMDktMTEtMTkgMjA6Mzc6MzFaIFplc3N0cmEgJAorI3ByYWdtYSBzdHJvbmdfdHlwZXMKKyNwcmFnbWEgbm9fY2xvbmUKKyNwcmFnbWEgbm9fc2hhZG93CisjcHJhZ21hIG5vX2luaGVyaXQKKyNwcmFnbWEgdmVyYm9zZV9lcnJvcnMKKyNwcmFnbWEgY29tYmluZV9zdHJpbmdzCisjcHJhZ21hIHBlZGFudGljCisjcHJhZ21hIHJhbmdlX2NoZWNrCisjcHJhZ21hIHdhcm5fZGVwcmVjYXRlZAorCisjaW5jbHVkZSA8ZmlsZXMuaD4KKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKyNpbmNsdWRlIDxldmVudHMuaD4KKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZSgpIHsKKyAgc2V0ZXVpZChnZXR1aWQodGhpc19vYmplY3QoKSkpOworfQorCitwdWJsaWMgdmFyYXJncyBpbnQgRGVsZXRlKHN0cmluZyBwbG5hbWUsIGludCBub2JhbmlzaCwgaW50IG5vY2xvbmUpIHsKKyAgLy8gZGVmaW5pdGl2IG51ciBmdWVyIEVNKyB1bmQgbnVyIE9iamVrdCBtaXQgTGV2ZWwgNjYrIGluIGRlciBDYWxsY2hhaW4uCisgIGlmICghQVJDSF9TRUNVUklUWSB8fCBwcm9jZXNzX2NhbGwoKSkKKyAgICByZXR1cm4gLTE7CisKKyAgLy8gZXhpc3RpZXJ0IGRlciBTcGllbGVyPworICBpZiAoIXN0cmluZ3AocGxuYW1lKQorICAgICAgfHwgIW1hc3RlcigpLT5maW5kX3VzZXJpbmZvKHBsbmFtZSkpCisgICAgcmV0dXJuIC0yOworICAvLyBnaWJ0IGVzIGRhcyBTcGllbGVyb2JqZWt0PworICBvYmplY3QgcGxvYiA9IGZpbmRfcGxheWVyKHBsbmFtZSkgfHwgZmluZF9uZXRkZWFkKHBsbmFtZSk7CisgIC8vIHdlbm4ga2VpbiBPYmpla3Q6IER1bW15b2JqZWt0IGVyemV1Z2VuCisgIGlmICghb2JqZWN0cChwbG9iKSAmJiAhbm9jbG9uZSkgeworICAgIGNhdGNoKHBsb2IgPSBfX2NyZWF0ZV9wbGF5ZXJfZHVtbXkocGxuYW1lKSk7CisgIH0KKworICBpbnQgd2xldmVsID0gcXVlcnlfd2l6X2xldmVsKHBsbmFtZSk7CisgIHN0cmluZyBwYXJ0X2ZpbGVuYW1lPSIvIitwbG5hbWVbMC4uMF0rIi8iK3BsbmFtZSsiLm8iOworCisgIC8vIGdnZi4gYmFuaXNoZW4KKyAgaWYgKCFub2JhbmlzaCAmJiB3bGV2ZWwgPj0gTEVBUk5FUl9MVkwpCisgICAgbWFzdGVyKCktPkJhbmlzaE5hbWUocGxuYW1lLCAiU28gaGllc3MgbWFsIGVpbiBNYWdpZXIgaGllciIsIDEpOworICBlbHNlIGlmICghbm9iYW5pc2ggJiYgd2xldmVsID49IFNFRVJfTFZMKQorICAgIG1hc3RlcigpLT5CYW5pc2hOYW1lKHBsbmFtZSwgIlNvIGhpZXNzIG1hbCBlaW4gU2VoZXIgaGllciIsIDEpOworCisgIC8vIFNwaWVscGF1c2VuIGF1ZmhlYmVuCisgIG1hc3RlcigpLT5UQmFuaXNoTmFtZShwbG5hbWUsIDApOworCisgIC8vIGxvZ2dlbgorICBsb2dfZmlsZSgiQVJDSC9BRE1JTl9VU0VSREVMRVRFIiwKKyAgICAgIHNwcmludGYoIiVzOiAlcyBnZWxvZXNjaHQgZHVyY2ggJXMgKCVzKVxuIiwKKyAgICAgICAgICAgICBzdHJmdGltZSgiJXklbSVkLSVIJU0lUyIpLAorICAgICAgICAgICAgIHBsbmFtZSwKKyAgICAgICAgICAgICBzZWN1cmVfZXVpZCgpLAorICAgICAgICAgICAgIHRvX3N0cmluZyhxdWVyeV9pcF9udW1iZXIodGhpc19pbnRlcmFjdGl2ZSgpKSkgKSk7CisKKworICAvLyBMb2VzY2gtRXZlbnQgYXVzbG9lc2VuCisgIGlmIChwbG9iKSB7CisgICAgRVZFTlRELT5UcmlnZ2VyRXZlbnQoRVZUX0xJQl9QTEFZRVJfREVMRVRJT04sIChbCisgICAgICAgICAgICBFX1BMTkFNRTogcGxuYW1lLAorICAgICAgICAgICAgRV9FTlZJUk9OTUVOVDogZW52aXJvbm1lbnQocGxvYiksCisgICAgICAgICAgICBFX0dVSUxETkFNRTogcGxvYi0+UXVlcnlQcm9wKFBfR1VJTEQpIF0pICk7CisKKyAgICAvLyBTcGllbGVyb2JqZWt0IHplcnN0b2VyZW4KKyAgICBwbG9iLT5tb3ZlKCIvcm9vbS92b2lkIiwgTV9OT0NIRUNLKTsKKyAgICBwbG9iLT5yZW1vdmUoMSk7CisgIH0KKworICAvLyBGaWxlcyBsb2VzY2hlbgorICBpZiAoZmlsZV9zaXplKCIvIlNFQ1VSRURJUiIvc2F2ZSIrcGFydF9maWxlbmFtZSkgPiBGU0laRV9OT0ZJTEUpCisgICAgcm0oIi8iU0VDVVJFRElSIi9zYXZlIitwYXJ0X2ZpbGVuYW1lKTsKKyAgaWYgKGZpbGVfc2l6ZSgiLyJMSUJTQVZFRElSICsgcGFydF9maWxlbmFtZSkgPiBGU0laRV9OT0ZJTEUpCisgICAgcm0oIi8iTElCU0FWRURJUiArIHBhcnRfZmlsZW5hbWUpOworICBpZiAoZmlsZV9zaXplKCIvIk1BSUxESVIgKyBwYXJ0X2ZpbGVuYW1lKSA+IEZTSVpFX05PRklMRSkKKyAgICBybSgiLyJNQUlMRElSICsgcGFydF9maWxlbmFtZSk7CisKKyAgbWFzdGVyKCktPlJlbW92ZUZyb21DYWNoZShwbG5hbWUpOworCisgIHJldHVybiAxOworfQorCmRpZmYgLS1naXQgYS9zZWN1cmUvYXdtYXN0ZXIuYyBiL3NlY3VyZS9hd21hc3Rlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjY2RiMWQKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvYXdtYXN0ZXIuYwpAQCAtMCwwICsxLDQzMyBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIGF3bWFzdGVyLmMgLS0gQXJtb3Vycy0gYW5kIFdlYXBvbnMtTWFzdGVyCisvLworI3ByYWdtYSBzdHJpY3RfdHlwZXMKKyNwcmFnbWEgbm9fY2xvbmUKKyNwcmFnbWEgbm9fc2hhZG93CisjcHJhZ21hIG5vX2luaGVyaXQKKyNwcmFnbWEgdmVyYm9zZV9lcnJvcnMKKyNwcmFnbWEgY29tYmluZV9zdHJpbmdzCisjcHJhZ21hIHBlZGFudGljCisjcHJhZ21hIHJhbmdlX2NoZWNrCisjcHJhZ21hIHdhcm5fZGVwcmVjYXRlZAorCisjaW5jbHVkZSA8Y29tYmF0Lmg+CisjaW5jbHVkZSA8bGFuZ3VhZ2UuaD4KKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisKKyNkZWZpbmUgU0FWRUZJTEUgICIvc2VjdXJlL0FSQ0gvYXdtYXN0ZXIiCisjZGVmaW5lIEFEVU1QRklMRSAiL2xvZy9BUkNIL1JVRVNUVU5HRU4iCisjZGVmaW5lIEREVU1QRklMRSAiL2xvZy9BUkNIL0RBTUFHRVJTIgorI2RlZmluZSBXRFVNUEZJTEUgIi9sb2cvQVJDSC9XQUZGRU4iCisKKyNkZWZpbmUgQVdGX1BVVE9OICAxCisjZGVmaW5lIEFXRl9QVVRPRkYgMgorI2RlZmluZSBBV0ZfQk9PU1QgIDQKKyNkZWZpbmUgQVdGX1pBVUJFUiA4CisjZGVmaW5lIEFXRl9SRVNJU1QgMTYKKworI2RlZmluZSBBV01fVFlQRSAgICAgIDAKKyNkZWZpbmUgQVdNX0NMQVNTICAgICAxCisjZGVmaW5lIEFXTV9FRkZfQ0xBU1MgMgorI2RlZmluZSBBV01fRkxBR1MgICAgIDMKKyNkZWZpbmUgQVdNX1dFSUdIVCAgICA0CisjZGVmaW5lIEFXTV9WQUxVRSAgICAgNQorI2RlZmluZSBBV01fSEFORFMgICAgIDYKKyNkZWZpbmUgQVdNX0RfVFlQRSAgICA3CisjZGVmaW5lIEFXTV9YX0NMQVNTICAgOAorI2RlZmluZSBBV01fVElNRSAgICAgIDkKKworbWFwcGluZyBhcm1vdXJzLHdlYXBvbnMsZGFtYWdlcnM7Citwcml2YXRlIGludCBzYXZlX21lX3Nvb247CisKK3ByaXZhdGUgaW50IGFsbG93ZWQoKQoreworICBpZiAocHJldmlvdXNfb2JqZWN0KCkgJiYgZ2V0ZXVpZChwcmV2aW91c19vYmplY3QoKSk9PVJPT1RJRCkKKyAgICByZXR1cm4gMTsKKyAgaWYgKCFwcm9jZXNzX2NhbGwoKSAmJiBwcmV2aW91c19vYmplY3QoKSAmJiB0aGlzX2ludGVyYWN0aXZlKCkgJiYgQVJDSF9TRUNVUklUWSkKKyAgICByZXR1cm4gMTsKKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgY3JlYXRlKCkKK3sKKyAgICBzZXRldWlkKGdldHVpZCh0aGlzX29iamVjdCgpKSk7CisKKyAgICBpZiAoIXJlc3RvcmVfb2JqZWN0KFNBVkVGSUxFKSkKKyAgICB7CisgICAgICAgIGFybW91cnMgPSAoW10pOworICAgICAgICB3ZWFwb25zID0gKFtdKTsKKyAgICAgICAgZGFtYWdlcnMgPSAoW10pOworICAgIH0KKyAgICBpZiAod2lkdGhvZihkYW1hZ2VycykgPT0gMSkgeworICAgICAgbWFwcGluZyB0bXAgPSBkYW1hZ2VyczsKKyAgICAgIGRhbWFnZXJzID0gbV9hbGxvY2F0ZShzaXplb2YodG1wKSwyKTsKKyAgICAgIGZvcmVhY2goc3RyaW5nIHIsIGludCBmbGFnOiB0bXApIHsKKyAgICAgICAgZGFtYWdlcnNbciwwXT1mbGFnOworICAgICAgfQorICAgIH0KK30KKwordm9pZCBzYXZlX21lKGludCBub3cpCit7CisgIGlmIChub3cpCisgICAgc2F2ZV9vYmplY3QoU0FWRUZJTEUpOworICBlbHNlCisgICAgc2F2ZV9tZV9zb29uPTE7Cit9CisKK3ZvaWQgcmVzZXQoKSB7CisgIGlmIChzYXZlX21lX3Nvb24pCisgIHsKKyAgICBzYXZlX21lX3Nvb249MDsKKyAgICBzYXZlX21lKDEpOworICB9Cit9CisKK3B1YmxpYyB2YXJhcmdzIGludCByZW1vdmUoaW50IHNpbGVudCkgeworICBzYXZlX21lKDEpOworICBkZXN0cnVjdCh0aGlzX29iamVjdCgpKTsKKyAgcmV0dXJuIDE7Cit9CisKK2ludCB4ZmxhZ3Mob2JqZWN0IG9iKXsKKyAgICBpbnQgcmU7CisgICAgbWFwcGluZyBtOworICAgIGlmICghb2IgfHwgIW9iamVjdHAob2IpKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZT0wOworICAgIGlmICgoKG9iamVjdClvYi0+UXVlcnlQcm9wKFBfV0VBUl9GVU5DKSk9PW9iICB8fAorICAgICAgICAoKG9iamVjdClvYi0+UXVlcnlQcm9wKFBfV0lFTERfRlVOQykpPT1vYiApCisgICAgICAgIHJlICs9IEFXRl9QVVRPTjsKKyAgICBpZiAoKChvYmplY3Qpb2ItPlF1ZXJ5UHJvcChQX1JFTU9WRV9GVU5DKSk9PW9iICB8fAorICAgICAgICAoKG9iamVjdClvYi0+UXVlcnlQcm9wKFBfVU5XSUVMRF9GVU5DKSk9PW9iICkKKyAgICAgICAgcmUgKz0gQVdGX1BVVE9GRjsKKyAgICBpZiAoKChvYmplY3Qpb2ItPlF1ZXJ5UHJvcChQX0RFRkVORF9GVU5DKSk9PW9iIHx8CisgICAgICAgICgob2JqZWN0KW9iLT5RdWVyeVByb3AoUF9ISVRfRlVOQykpPT1vYiAgICApCisgICAgICAgIHJlICs9IEFXRl9CT09TVDsKKyAgICAvLyBpc3RzIG5lbiBNYXBwaW5nIHVuZCBuaWNodCBsZWVyPworICAgIGlmIChtYXBwaW5ncChtPShtYXBwaW5nKW9iLT5RdWVyeVByb3AoUF9SRVNJU1RBTkNFX1NUUkVOR1RIUykpCisgICAgICAgICYmIHNpemVvZihtKSkKKyAgICAgICAgcmUgKz0gQVdGX1JFU0lTVDsKKyAgICByZXR1cm4gcmU7Cit9CisKK3ZvaWQgUmVnaXN0ZXJBcm1vdXIoKQoreyAgIG9iamVjdCAgb2I7CisgICAgc3RyaW5nICBpZDsKKyAgICBpbnQgICAgIGZsYWcsaDsKKworICAgIGlmICghb2JqZWN0cChvYj1wcmV2aW91c19vYmplY3QoKSkgfHwgCisgICAgICBtZW1iZXIoaW5oZXJpdF9saXN0KG9iKSwiL3N0ZC9hcm1vdXIuYyIpPT0tMSkKKyAgICAgIHJldHVybjsKKyAgICBpZCA9IGV4cGxvZGUob2JqZWN0X25hbWUob2IpLCIjIilbMF07CisgICAgaWYgKG1lbWJlcihhcm1vdXJzLGlkKSkKKyAgICB7CisgICAgICAgIGFybW91cnNbaWRdW0FXTV9USU1FXT10aW1lKCk7CisgICAgICAgIGZsYWc9MDsKKyAgICAgICAgaWYgKChoPShpbnQpb2ItPlF1ZXJ5UHJvcChQX0FDKSkgPiBhcm1vdXJzW2lkXVtBV01fQ0xBU1NdKQorICAgICAgICB7CisgICAgICAgICAgICBhcm1vdXJzW2lkXVtBV01fQ0xBU1NdPWg7CisgICAgICAgICAgICBmbGFnPTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChoPShpbnQpb2ItPlF1ZXJ5UHJvcChQX0VGRkVDVElWRV9BQykpID4gYXJtb3Vyc1tpZF1bQVdNX0VGRl9DTEFTU10pCisgICAgICAgIHsKKyAgICAgICAgICAgIGFybW91cnNbaWRdW0FXTV9FRkZfQ0xBU1NdPWg7CisgICAgICAgICAgICBmbGFnPTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChoPShpbnQpb2ItPlF1ZXJ5UHJvcChQX05SX0hBTkRTKSkgPCBhcm1vdXJzW2lkXVtBV01fSEFORFNdKQorICAgICAgICB7CisgICAgICAgICAgICBhcm1vdXJzW2lkXVtBV01fSEFORFNdPWg7CisgICAgICAgICAgICBmbGFnPTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChoPXhmbGFncyhvYikpICE9IGFybW91cnNbaWRdW0FXTV9GTEFHU10pCisgICAgICAgIHsKKyAgICAgICAgICAgIGFybW91cnNbaWRdW0FXTV9GTEFHU109aDsKKyAgICAgICAgICAgIGZsYWc9MTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgYXJtb3VycyArPSAoWyBpZCA6IAorICAgICAgICAoWworICAgICAgICAgICAgQVdNX1RZUEUgICAgICA6IG9iLT5RdWVyeVByb3AoUF9BUk1PVVJfVFlQRSkgLAorICAgICAgICAgICAgQVdNX0NMQVNTICAgICA6IG9iLT5RdWVyeVByb3AoUF9BQykgLAorICAgICAgICAgICAgQVdNX0VGRl9DTEFTUyA6IG9iLT5RdWVyeVByb3AoUF9FRkZFQ1RJVkVfQUMpICwKKyAgICAgICAgICAgIEFXTV9GTEFHUyAgICAgOiB4ZmxhZ3Mob2IpLAorICAgICAgICAgICAgQVdNX1dFSUdIVCAgICA6IG9iLT5RdWVyeVByb3AoUF9XRUlHSFQpICwKKyAgICAgICAgICAgIEFXTV9WQUxVRSAgICAgOiBvYi0+UXVlcnlQcm9wKFBfVkFMVUUpICwKKyAgICAgICAgICAgIEFXTV9IQU5EUyAgICAgOiBvYi0+UXVlcnlQcm9wKFBfTlJfSEFORFMpICwgLy8gRnVlciBTY2hpbGRlCisgICAgICAgICAgICBBV01fRF9UWVBFICAgIDogb2ItPlF1ZXJ5UHJvcChQX0RBTV9UWVBFKSAsCisgICAgICAgICAgICBBV01fWF9DTEFTUyAgIDogb2ItPlF1ZXJ5UHJvcChQX0VGRkVDVElWRV9XQykgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYi0+UXVlcnlQcm9wKFBfV0MpLAorICAgICAgICAgICAgQVdNX1RJTUUgICAgICA6IHRpbWUoKQorICAgICAgICBdKSBdKTsKKyAgICB9CisgICAgc2F2ZV9tZSgwKTsKK30KKwordm9pZCBSZWdpc3RlcldlYXBvbigpCit7ICAgb2JqZWN0ICBvYjsKKyAgICBzdHJpbmcgIGlkOworICAgIGludCAgICAgZmxhZyxoOworCisgICAgaWYgKCFvYmplY3RwKG9iPXByZXZpb3VzX29iamVjdCgpKSB8fAorICAgICAgbWVtYmVyKGluaGVyaXRfbGlzdChvYiksIi9zdGQvd2VhcG9uLmMiKT09LTEpCisgICAgICByZXR1cm47CisgICAgaWQgPSBleHBsb2RlKG9iamVjdF9uYW1lKG9iKSwiIyIpWzBdOworICAgIGlmIChtZW1iZXIod2VhcG9ucyxpZCkpCisgICAgeworICAgICAgICB3ZWFwb25zW2lkXVtBV01fVElNRV0gPSB0aW1lKCk7CisgICAgICAgIGZsYWc9MDsKKyAgICAgICAgaWYgKChoPShpbnQpb2ItPlF1ZXJ5UHJvcChQX1dDKSkgPiB3ZWFwb25zW2lkXVtBV01fQ0xBU1NdKQorICAgICAgICB7CisgICAgICAgICAgICB3ZWFwb25zW2lkXVtBV01fQ0xBU1NdPWg7CisgICAgICAgICAgICBmbGFnPTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChoPShpbnQpb2ItPlF1ZXJ5UHJvcChQX0VGRkVDVElWRV9XQykpID4gd2VhcG9uc1tpZF1bQVdNX0VGRl9DTEFTU10pCisgICAgICAgIHsKKyAgICAgICAgICAgIHdlYXBvbnNbaWRdW0FXTV9FRkZfQ0xBU1NdPWg7CisgICAgICAgICAgICBmbGFnPTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChoPShpbnQpb2ItPlF1ZXJ5UHJvcChQX05SX0hBTkRTKSkgPCB3ZWFwb25zW2lkXVtBV01fSEFORFNdKQorICAgICAgICB7CisgICAgICAgICAgICB3ZWFwb25zW2lkXVtBV01fSEFORFNdPWg7CisgICAgICAgICAgICBmbGFnPTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChoPXhmbGFncyhvYikpICE9IHdlYXBvbnNbaWRdW0FXTV9GTEFHU10pCisgICAgICAgIHsKKyAgICAgICAgICAgIHdlYXBvbnNbaWRdW0FXTV9GTEFHU109aDsKKyAgICAgICAgICAgIGZsYWc9MTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgd2VhcG9ucyArPSAoWyBpZCA6CisgICAgICAgIChbCisgICAgICAgICAgICBBV01fVFlQRSAgICAgIDogb2ItPlF1ZXJ5UHJvcChQX1dFQVBPTl9UWVBFKSAsCisgICAgICAgICAgICBBV01fQ0xBU1MgICAgIDogb2ItPlF1ZXJ5UHJvcChQX1dDKSAsCisgICAgICAgICAgICBBV01fRUZGX0NMQVNTIDogb2ItPlF1ZXJ5UHJvcChQX0VGRkVDVElWRV9XQykgLAorICAgICAgICAgICAgQVdNX0ZMQUdTICAgICA6IHhmbGFncyhvYiksCisgICAgICAgICAgICBBV01fV0VJR0hUICAgIDogb2ItPlF1ZXJ5UHJvcChQX1dFSUdIVCkgLAorICAgICAgICAgICAgQVdNX1ZBTFVFICAgICA6IG9iLT5RdWVyeVByb3AoUF9WQUxVRSkgLAorICAgICAgICAgICAgQVdNX0hBTkRTICAgICA6IG9iLT5RdWVyeVByb3AoUF9OUl9IQU5EUykgLAorICAgICAgICAgICAgQVdNX0RfVFlQRSAgICA6IG9iLT5RdWVyeVByb3AoUF9EQU1fVFlQRSkgLAorICAgICAgICAgICAgQVdNX1hfQ0xBU1MgICA6IG9iLT5RdWVyeVByb3AoUF9FRkZFQ1RJVkVfQUMpIHx8IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iLT5RdWVyeVByb3AoUF9BQyksCisgICAgICAgICAgICBBV01fVElNRSAgICAgIDogdGltZSgpCisgICAgICAgIF0pIF0pOworICAgIH0KKyAgICBzYXZlX21lKDApOworfQorCit2b2lkIFJlZ2lzdGVyRGFtYWdlcihvYmplY3QgZGFtX29iLGludCBvbGRfZGFtLCBpbnQgbmV3X2RhbSkKK3sgICBvYmplY3Qgb2I7CisgICAgaW50IGZsYWc7CisgICAgc3RyaW5nIGZuOworCisgICAgaWYgKCFvYmplY3RwKG9iPXByZXZpb3VzX29iamVjdCgpKSB8fAorICAgICAgKG1lbWJlcihpbmhlcml0X2xpc3Qob2IpLCIvc3RkL3dlYXBvbi5jIik9PS0xICYmCisgICAgICAgbWVtYmVyKGluaGVyaXRfbGlzdChvYiksIi9zdGQvYXJtb3VyLmMiKT09LTEgKSkKKyAgICAgIHJldHVybjsKKyAgICBpZiAob2xkX2RhbT5uZXdfZGFtKSAvLyBSZXBhaXIKKyAgICAgICAgZmxhZz0yOworICAgIGVsc2UgaWYgKG5ld19kYW0+b2xkX2RhbSkgLy8gRGFtYWdlCisgICAgICAgIGZsYWc9MTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybjsKKyAgICBpZiAoIW9iamVjdHAoZGFtX29iKSkKKyAgICAgICAgcmV0dXJuOworICAgIGlmICghKGZuPW9sZF9leHBsb2RlKG9iamVjdF9uYW1lKGRhbV9vYiksIiMiKVswXSkgfHwgIXN0cmluZ3AoZm4pKQorICAgICAgICByZXR1cm47CisgICAgZGFtYWdlcnNbZm4sMF09ZGFtYWdlcnNbZm4sMF18ZmxhZzsKKyAgICBkYW1hZ2Vyc1tmbiwxXT10aW1lKCk7IAorICAgIHNhdmVfbWUoMCk7Cit9CisKK3N0cmluZyBkdGR1bXAobWl4ZWQgYXJnKQoreyAgIHN0cmluZyByZTsKKyAgICBpbnQgaSx3OworCisgICAgaWYgKHN0cmluZ3AoYXJnKSkKKyAgICAgICAgcmV0dXJuIGNhcGl0YWxpemUoYXJnKTsKKyAgICBpZiAoIXBvaW50ZXJwKGFyZykgfHwgIXN0cmluZ3AoYXJnWzBdKSkKKyAgICAgICAgcmV0dXJuICI8Tk9ORT4iOworICAgIGlmICgoaT1zaXplb2YoYXJnKSk9PTEpCisgICAgICAgIHJldHVybiBjYXBpdGFsaXplKGFyZ1swXSk7CisgICAgdyA9ICgzMS1pKS9pOworICAgIGlmICh3LS08MSkKKyAgICAgICAgcmV0dXJuICI8TUFOWT4iOworICAgIGZvciAocmU9IiIsLS1pO2k+PTA7aS0tKQorICAgIHsKKyAgICAgICAgaWYgKCFzdHJpbmdwKGFyZ1tpXSkpCisgICAgICAgICAgICByZSArPSAiLSI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJlICs9IGNhcGl0YWxpemUoYXJnW2ldWzAuLnddKTsKKyAgICAgICAgaWYgKGkpCisgICAgICAgICAgICByZSArPSAifCI7CisgICAgfQorICAgIHJldHVybiByZTsKK30KKworaW50IER1bXAobWl4ZWQgd2hhdCwgaW50IHNvcnRpZHgpCit7ICAgc3RyaW5nICBmaWxlLCppbmQ7CisgICAgbWFwcGluZyBkdW1wOworCisgICAgaWYgKCFhbGxvd2VkKCkpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGlmICghd2hhdCkKKyAgICB7CisgICAgICAgIHdyaXRlKCJOaW1tIGRvY2ggbWFsIGVpbmVuIHJpY2h0aWdlbiBQYXJhbWV0ZXIhXG4iKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChzdHJpbmdwKHdoYXQpICYmIHNpemVvZih3aGF0KT4wKQorICAgIHsKKyAgICAgICAgd2hhdD09d2hhdFswLi4wXTsKKyAgICAgICAgaWYgKHdoYXQ9PSJhIikKKyAgICAgICAgICAgIHdoYXQ9MTsKKyAgICAgICAgZWxzZSBpZiAod2hhdD09InciKQorICAgICAgICAgICAgd2hhdD0yOworICAgICAgICBlbHNlIGlmICh3aGF0PT0iZCIpCisgICAgICAgICAgICB3aGF0PTM7CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgd3JpdGUoIk5pbW0gZG9jaCBtYWwgZWluZW4gcmljaHRpZ2VuIFBhcmFtZXRlciFcbiIpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCFpbnRwKHdoYXQpIHx8IHdoYXQ8MSB8fCB3aGF0PjMpCisgICAgeworICAgICAgICB3cml0ZSgiTmltbSBkb2NoIG1hbCBlaW5lbiByaWNodGlnZW4gUGFyYW1ldGVyIVxuIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAod2hhdD09MykgLy8gRGllICdkYW1hZ2VycycgaGFiZW4gZWluIGFuZGVyZXMgQXVzZ2FiZWZvcm1hdAorICAgIHsKKyAgICAgICAgcHJpbnRmKCJBV006IER1bXBpbmcgJ2RhbWFnZXJzJyB0byAnJXMnXG4iLEREVU1QRklMRSk7CisgICAgICAgIGlmIChzaXplb2YoZGFtYWdlcnMpIDwgMSkgeworICAgICAgICAgICAgd3JpdGUoIkFXTTogRHVtcCBhYm9ydGVkLCBtYXBwaW5nIGVtcHR5LlxuIik7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZmlsZV9zaXplKEREVU1QRklMRSk+MSkKKyAgICAgICAgICAgIHJtKEREVU1QRklMRSk7CisgICAgICAgIAorICAgICAgICAvLyBuYWNoIGxldHp0ZXIgQWt0dWFsaXNpZXJ1bmcgc29ydGllcmVuLgorICAgICAgICBtaXhlZCBzb3J0ZWQgPSBzb3J0X2FycmF5KG1faW5kaWNlcyhkYW1hZ2VycyksCisgICAgICAgICAgICBmdW5jdGlvbiBpbnQgKHN0cmluZyBhLCBzdHJpbmcgYikgeworICAgICAgICAgICAgICAgIHJldHVybiBkYW1hZ2Vyc1thLDFdIDwgZGFtYWdlcnNbYiwxXTsKKyAgICAgICAgICAgIH0gKTsKKworICAgICAgICBzdHJpbmcgYXVzZ2FiZSA9IHNwcmludGYoCisgICAgICAgICAgICAiLS0tIERhbWFnZXJzLUR1bXAgLS0tICVzIC0tLSAlcyAtLS1cblxuIisKKyAgICAgICAgICAgICIlOjE1cyBEIFIgW0ZpbGVuYW1lXVxuIiwKKyAgICAgICAgICAgIGR0aW1lKHRpbWUoKSksY2FwaXRhbGl6ZShnZXR1aWQodGhpc19pbnRlcmFjdGl2ZSgpKSksCisgICAgICAgICAgICAiRGF0dW0vWmVpdCIpOworICAgICAgICBmb3JlYWNoKHN0cmluZyBydWUgOiBzb3J0ZWQpIHsKKyAgICAgICAgICAgIGF1c2dhYmUgKz0gc3ByaW50ZigiJToxNXMgJTFzICUxcyAlc1xuIiwKKyAgICAgICAgICAgICAgICBzdHJmdGltZSgiJXklbSVkLSVIOiVNOiVTIixkYW1hZ2Vyc1tydWUsMV0pLAorICAgICAgICAgICAgICAgIChkYW1hZ2Vyc1tydWUsMF0mMT8iKyI6Ii0iKSwKKyAgICAgICAgICAgICAgICAoZGFtYWdlcnNbcnVlLDBdJjI/IisiOiItIiksCisgICAgICAgICAgICAgICAgcnVlKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgd3JpdGVfZmlsZShERFVNUEZJTEUsIGF1c2dhYmUpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgaWYgKHdoYXQ9PTIpCisgICAgICAgIHdoYXQ9MDsKKyAgICBmaWxlPSh3aGF0P0FEVU1QRklMRTpXRFVNUEZJTEUpOworCisgICAgcHJpbnRmKCJBV006IER1bXBpbmcgJyVzJyB0byAnJXMnXG4iLAorICAgICAgICAod2hhdD8iYXJtb3VycyI6IndlYXBvbnMiKSxmaWxlKTsKKyAgICAKKyAgICBkdW1wPSh3aGF0P2FybW91cnM6d2VhcG9ucyk7CisgICAgCisgICAgaWYgKHNvcnRpZHgpIHsKKyAgICAgIGluZCA9IHNvcnRfYXJyYXkobV9pbmRpY2VzKGR1bXApLAorICAgICAgICAgIGZ1bmN0aW9uIGludCAoc3RyaW5nIGEsIHN0cmluZyBiKQorICAgICAgICAgIHtyZXR1cm4gZHVtcFthXVtzb3J0aWR4XSA8IGR1bXBbYl1bc29ydGlkeF07fSApOworICAgIH0KKyAgICBlbHNlCisgICAgICBpbmQgPSBzb3J0X2FycmF5KG1faW5kaWNlcyhkdW1wKSwjJz4pOworICAgIAorICAgIGlmIChzaXplb2YoaW5kKSA8IDEpCisgICAgeworICAgICAgICB3cml0ZSgiQVdNOiBEdW1wIGFib3J0ZWQsIG1hcHBpbmcgZW1wdHkuXG4iKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgaWYgKGZpbGVfc2l6ZShmaWxlKT4xKQorICAgICAgICBybShmaWxlKTsKKyAgICAKKyAgICBzdHJpbmcgYXVzZ2FiZSA9IHNwcmludGYoCisgICAgICAgICItLS0gJXMtRHVtcCAtLS0gJXMgLS0tICVzIC0tLVxuXG4iKworICAgICAgICAiW0ZpbGVuYW1lXSwgRGF0dW0vWmVpdFxuIisKKyAgICAgICAgIiAgICBfX19fVHlwX19fIENMUyBFQ0wgWENMIE5GQlIgV0dIVC4gVkFMVUUgSCAlMzAuMzAnXyd8c1xuIiwKKyAgICAgICAgKHdoYXQ/IlJ1ZXN0dW5ncyI6IldhZmZlbiIpLGR0aW1lKHRpbWUoKSksCisgICAgICAgIGNhcGl0YWxpemUoZ2V0dWlkKHRoaXNfaW50ZXJhY3RpdmUoKSkpLCJEYW1UeXBlKHMpIik7CisKKyAgICBmb3JlYWNoKHN0cmluZyBpbmRleCA6IGluZCkKKyAgICB7CisgICAgICAgIGF1c2dhYmUgKz0gc3ByaW50ZigKKyAgICAgICAgICAgICJbJXNdICVzXG4gICAgJTEwcyAlM2QgJTNkICUzZCAlMXMlMXMlMXMlMXMgJTVkICU1ZCAlMWQgJS0zMC4zMHNcbiIsCisgICAgICAgICAgICBpbmRleCwgc3RyZnRpbWUoIiV5JW0lZC0lSDolTTolUyIsZHVtcFtpbmRleF1bQVdNX1RJTUVdKSwKKyAgICAgICAgICAgIGR1bXBbaW5kZXhdW0FXTV9UWVBFXSwKKyAgICAgICAgICAgIGR1bXBbaW5kZXhdW0FXTV9DTEFTU10sCisgICAgICAgICAgICBkdW1wW2luZGV4XVtBV01fRUZGX0NMQVNTXSwKKyAgICAgICAgICAgIGR1bXBbaW5kZXhdW0FXTV9YX0NMQVNTXSwKKyAgICAgICAgICAgKGR1bXBbaW5kZXhdW0FXTV9GTEFHU10mQVdGX1BVVE9OPyIrIjoiLSIpLAorICAgICAgICAgICAoZHVtcFtpbmRleF1bQVdNX0ZMQUdTXSZBV0ZfUFVUT0ZGPyIrIjoiLSIpLAorICAgICAgICAgICAoZHVtcFtpbmRleF1bQVdNX0ZMQUdTXSZBV0ZfQk9PU1Q/IisiOiItIiksCisgICAgICAgICAgIChkdW1wW2luZGV4XVtBV01fRkxBR1NdJkFXRl9SRVNJU1Q/IisiOiItIiksCisgICAgICAgICAgICBkdW1wW2luZGV4XVtBV01fV0VJR0hUXSwKKyAgICAgICAgICAgIGR1bXBbaW5kZXhdW0FXTV9WQUxVRV0sCisgICAgICAgICAgICBkdW1wW2luZGV4XVtBV01fSEFORFNdLAorICAgICAgICAgICAgZHRkdW1wKGR1bXBbaW5kZXhdW0FXTV9EX1RZUEVdKSApOworICAgIH0KKyAgICB3cml0ZV9maWxlKGZpbGUsYXVzZ2FiZSk7CisgICAgd3JpdGUoIkFXTTogRG9uZS5cbiIpOworICAgIHJldHVybiAxOworfQorCitpbnQgVW5yZWdpc3RlcihzdHJpbmcgd2hhdCkKK3sKKyAgICBpZiAoIWFsbG93ZWQoKSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmICghd2hhdCkKKyAgICB7CisgICAgICAgIHdyaXRlKCJEdSBzb2xsdGVzdCBzY2hvbiBlaW5lbiBGaWxlbmFtZW4gYW5nZWJlbiFcbiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9IAorICAgIGlmIChtZW1iZXIoYXJtb3Vycyx3aGF0KSkKKyAgICB7CisgICAgICAgIG1fZGVsZXRlKGFybW91cnMsd2hhdCk7CisgICAgICAgIHdyaXRlKCJVbnJlZ2lzdGVyZWQgIit3aGF0KyIgZnJvbSAnYXJtb3VycycuXG4iKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmIChtZW1iZXIod2VhcG9ucyx3aGF0KSkKKyAgICB7CisgICAgICAgIG1fZGVsZXRlKHdlYXBvbnMsd2hhdCk7CisgICAgICAgIHdyaXRlKCJVbnJlZ2lzdGVyZWQgIit3aGF0KyIgZnJvbSAnd2VhcG9ucycuXG4iKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmIChtZW1iZXIoZGFtYWdlcnMsd2hhdCkpCisgICAgeworICAgICAgICBtX2RlbGV0ZShkYW1hZ2Vycyx3aGF0KTsKKyAgICAgICAgd3JpdGUoIlVucmVnaXN0ZXJlZCAiK3doYXQrIiBmcm9tICdkYW1hZ2VycycuXG4iKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHNhdmVfbWUoMCk7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBSZXNldERhbWFnZXJzKCkKK3sKKyAgICBpZiAoIWFsbG93ZWQoKSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGRhbWFnZXJzID0gbV9hbGxvY2F0ZSgwLDIpOworICAgIHNhdmVfbWUoMSk7CisgICAgcmV0dXJuIDE7Cit9CisKZGlmZiAtLWdpdCBhL3NlY3VyZS9iYm1hc3Rlci5jIGIvc2VjdXJlL2JibWFzdGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY3N2Y3ZgotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9iYm1hc3Rlci5jCkBAIC0wLDAgKzEsMzkzIEBACisjcHJhZ21hIHN0cmljdF90eXBlcworI3ByYWdtYSBub19jbG9uZQorI3ByYWdtYSBub19zaGFkb3cKKyNwcmFnbWEgbm9faW5oZXJpdAorLy8jcHJhZ21hIHBlZGFudGljCisvLyNwcmFnbWEgcmFuZ2VfY2hlY2sKKyNwcmFnbWEgd2Fybl9kZXByZWNhdGVkCisKKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKyNpbmNsdWRlIDxkYWVtb24uaD4KKyNpbmNsdWRlIDxldmVudHMuaD4KKyNpbmNsdWRlIDxzdHJpbmdzLmg+CisjaW5jbHVkZSA8ZmlsZXMuaD4KKworI2RlZmluZSBGVFBTQVZFICIvc2VjdXJlL0FSQ0gvZnRwZCIKKworI2RlZmluZSBNQVhMT0dTSVpFIDIwMDAwMDAKKyNkZWZpbmUgU01BTExMT0dTSVpFIDIwMDAwMAorI2RlZmluZSBMT0dUSU1FIDEyMAorI2RlZmluZSBNQVhCVUZGU0laRSAyMDAwCisKKyNkZWZpbmUgREVCVUcoeCkgIGlmIChmaW5kX3BsYXllcigiemVzc3RyYSIpKVwKKyAgICAgICAgICAgIHRlbGxfb2JqZWN0KGZpbmRfcGxheWVyKCJ6ZXNzdHJhIiksXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRURCRzogIit4KyJcbiIpCisKKy8vIGZ1ZXIgRlRQLgorcHJpdmF0ZSBtYXBwaW5nIG1vbml0b3JlZDsKKworCisjZGVmaW5lIERfTE9HVElNRSAgICAwICAvLyBMb2dlbmRlemVpdCwgPGludD4KKyNkZWZpbmUgRF9GTEFHUyAgICAgIDEgIC8vIEZsYWdzCisjZGVmaW5lIERfRVJTVElFICAgICAyICAvLyBOYW1lIGRlcyBFcnN0aWVzLgorI2RlZmluZSBEX0lQU1RSSU5HICAgMworI2RlZmluZSBEX0lOREVYICAgICAgNCAgLy8gSW5kZXggZnVlciBEX0xPRywgbmFlY2hzdGVyIGZyZWllciBpbmRleC4KKyNkZWZpbmUgRF9MT0cgICAgICAgIDUgIC8vIExvZ2RhdGVuLCA8bWl4ZWQ+IChBcnJheSkKKy8qIERhdGVuc3RydWt0dXIgdm9uIERfTE9HOgorICAgKHsgKHs8emVpdD4sIDxrb21tYW5kbz4sIDxlbnZpcm9ubWVudD59KSwgLi4uLiB9KQorICAgKi8KKyNkZWZpbmUgRExfVElNRSAgMCAgLy8gaW50CisjZGVmaW5lIERMX0NNRCAgIDEgIC8vIHN0cmluZworI2RlZmluZSBETF9FTlYgICAyICAvLyBzdHJpbmcKK3ByaXZhdGUgbm9zYXZlIG1hcHBpbmcgbGRhdGEgPSBtX2FsbG9jYXRlKDAsRF9MT0cpOworCisvLyBGbGFnczoKKyNkZWZpbmUgRkxfUEVSTUFORU5UICAgIDEgLy8gJ3Blcm1hbmVudCcsIGQuaC4gbmljaHQgbnVyIGt1cnogbmFjaCBFaW5sb2dnZW4KKyNkZWZpbmUgRkxfU1lOQyAgICAgICAgIDIgLy8gbmljaHQgcHVmZmVybiwgc3luY2hyb24gYXVmIFBsYXR0ZSBzY2hyZWliZW4uCisKKy8vIEphLiBNYWNodCBkYXMgYmxvc3MgbmljaHQgbmFjaC4KKyNkZWZpbmUgUF9TRUNPTkQgInNlY29uZCIKKworcHVibGljIGludCBxdWVyeV9iYigpOworcHVibGljIHZvaWQgd3JpdGViYiggc3RyaW5nIG1zZyApOworcHVibGljIHZhcmFyZ3Mgdm9pZCBCQldyaXRlKHN0cmluZyBtc2csIGludCBjYXRtb2RlKTsKKworcHVibGljIGludCBhZGQoIHN0cmluZyB1c2VyLCBpbnQgdGltZW91dCApOworcHVibGljIGludCBzdWIoIHN0cmluZyB1c2VyICk7CitwdWJsaWMgdm9pZCBmdHBiYiggc3RyaW5nIHVzZXIsIHN0cmluZyBtc2cgKTsKKworcHJpdmF0ZSB2b2lkIHNjYW5fYmJfb3BmZXIoKTsKK3ByaXZhdGUgdm9pZCBEdW1wRGF0YShzdHJpbmcgdWlkLCBzdHJpbmcgZXJzdGllLCBzdHJpbmcgaXAsIGludCBmbGFncywgbWl4ZWQgbG9nZGF0YSk7Citwcml2YXRlIHZvaWQgUHJvY2Vzc0J1ZmZlcihzdHJpbmcgdWlkKTsKK3ByaXZhdGUgdm9pZCBSZW1vdmVUZW1wb3JhcnlQbGF5ZXIoc3RyaW5nIHVpZCk7CisKK3B1YmxpYyB2b2lkIGNyZWF0ZSgpCit7CisgICAgc2V0ZXVpZCggZ2V0dWlkKHRoaXNfb2JqZWN0KCkpICk7CisgICAgcmVzdG9yZV9vYmplY3QoIEZUUFNBVkUgKTsKKyAgICBzY2FuX2JiX29wZmVyKCk7CisgICAgRVZFTlRELT5SZWdpc3RlckV2ZW50KEVWVF9MSUJfTE9HSU4sICJFdmVudGhhbmRsZXIiLCB0aGlzX29iamVjdCgpKTsKKyAgICBFVkVOVEQtPlJlZ2lzdGVyRXZlbnQoRVZUX0xJQl9MT0dPVVQsICJFdmVudGhhbmRsZXIiLCB0aGlzX29iamVjdCgpKTsKKyAgICBsb2dfZmlsZSgiQVJDSC9iYm1hc3Rlci5sb2ciLCBzdHJmdGltZSgiJWM6IGJibWFzdGVyIHd1cmRlIGdlbGFkZW4uXG4iKSk7Cit9CisKKy8vIEF1ZiBkZW4gYXN5bmNocm9uZW4gTG9nb3V0LWV2ZW50IHp1IHdhcnRlbiBlcm1vZWdsaWNodCBlcyB0aGVvcmV0aXNjaCwgMS0ycworLy8gZGFzIExvZyB6dSB1bWdlaGVuLiBBbmRlcmVyc2VpdHMgZ2VodCBkYXMgb2huZWhpbiBudXIgZGFubiwgd2VubiBkaWUKKy8vIExvZ3plaXQgZWggYWJnZWxhdWZlbiBpc3QuCitwdWJsaWMgdm9pZCBFdmVudGhhbmRsZXIoc3RyaW5nIGVpZCwgb2JqZWN0IHRyaWdvYiwgbWl4ZWQgZGF0YSkgeworICBpZiAocHJldmlvdXNfb2JqZWN0KCkgPT0gZmluZF9vYmplY3QoRVZFTlREKSkgeworICAgIHN0cmluZyB1aWQ7CisgICAgaWYgKG9iamVjdHAodHJpZ29iKQorICAgICAgICAmJiBzdHJzdHIobG9hZF9uYW1lKHRyaWdvYiksIi9zdGQvc2hlbGxzLyIpID09IDAKKyAgICAgICAgJiYgIXRyaWdvYi0+UXVlcnlHdWVzdCgpKSB7CisgICAgICAvLyBCZWkgTG9naW4gdW5kIExvZ291dCBkZW4gQkJNb2RlIGVpbnNjaGFsdGVuICh3ZWlsIGRlciBMb2dpbmV2ZW50IGphCisgICAgICAvLyBlcnN0IDEtMnMgbmFjaCBFaW5sb2dnZW4gYWJnZWFyYmVpdGV0IHdpcmQuCisgICAgICB0cmlnb2ItPl9fc2V0X2JiKDEpOworICAgICAgdWlkPWdldHVpZCh0cmlnb2IpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIC8vIGtlaW4gT2JqZWt0IG1laHIgZGEuIFZlcm11dGxpY2ggaGF0IGVpbiBTcGllbGVyICdlbmRlJyBnZW1hY2h0LCBhYmVyCisgICAgICAvLyBlcyBrb2VubnRlIGF1Y2ggc2VpbiwgZGFzcyBqZW1hbmQgbWl0IG5lbSBTZWxic3R6ZXJzdG9lcmVyIGRlbiBFdmVudAorICAgICAgLy8gZ2VmYWt0IGhhdC4gQWJlciBzZWxic3Qgd2VubiwgdmllbCBrYW5uIG1hbiBkYW1pdCBuaWNodCBlcnJlaWNoZW4uCisgICAgICB1aWQgPSBkYXRhW0VfUExOQU1FXTsKKyAgICAgIGlmICghc3RyaW5ncCh1aWQpKSByZXR1cm47CisgICAgICAvLyBQcnVlZnVuZyBhdWYgbmljaHQtQW53ZXNlbmhlaXQgdm9uIHVpZCB3YWVyZSBub2NoIG1vZWdsaWNoLCBoYXQgYWJlcgorICAgICAgLy8gUHJvYmxlbWUsIHdlbm4gZWluIFNwaWVsZXIgc2VociBzY2huZWxsIHdpZWRlciBlaW5sb2dndC4KKyAgICB9CisKKyAgICBpZiAoZWlkID09IEVWVF9MSUJfTE9HT1VUICYmIG1lbWJlcihsZGF0YSx1aWQpKSB7CisgICAgICAvLyBXZW5uIExvZ291dCB1bmQgZXMgZ2lidCBEYXRlbiBpbSBQdWZmZXIsIGtvZW5udGUgbWFuIGRpZSBldnRsLgorICAgICAgLy8gd2Vnc2NocmVpYmVuIG9kZXIgbG9lc2NoZW4uCisgICAgICBQcm9jZXNzQnVmZmVyKHVpZCk7CisgICAgICAvLyBhdWYgamVkZW4gRmFsbCB0ZW1wb3JhZXJlIFNwaWVsZXIgZW50ZmVybmVuLiAoV2ljaHRpZyEpCisgICAgICBSZW1vdmVUZW1wb3JhcnlQbGF5ZXIodWlkKTsKKyAgICB9CisgIH0KK30KKworLy8gc2NocmVpYnQgYWxsZSBQdWZmZXIgc3luY2hyb24sIG9obmUgQ2FsbG91dC4uLiBLYW5uIGxhZ2dlbi4KK3B1YmxpYyBpbnQgUHJvY2Vzc0FsbEJ1ZmZlcnMoKSB7CisgIAorICAgIGlmIChleHRlcm5fY2FsbCgpICYmICFBUkNIX1NFQ1VSSVRZKQorICAgIHJldHVybiAtMTsKKworICBmb3JlYWNoKHN0cmluZyB1aWQsIGludCBsb2d0aW1lLCBpbnQgZmxhZ3MsIHN0cmluZyBlcnN0aWUsIHN0cmluZyBpcCwKKyAgICAgICAgICBpbnQgaW5kZXgsIG1peGVkIGRhdGE6IGxkYXRhKSB7CisgICAgaWYgKGluZGV4KSB7CisgICAgICBEdW1wRGF0YSh1aWQsIGVyc3RpZSwgaXAsIGZsYWdzLCBkYXRhKTsKKyAgICAgIGxkYXRhW3VpZCxEX0xPR109KHt9KTsKKyAgICAgIGxkYXRhW3VpZCxEX0lOREVYXT0wOworICAgIH0KKyAgfQorICByZXR1cm4gMTsKK30KKworcHJpdmF0ZSB2b2lkIFByb2Nlc3NCdWZmZXIoc3RyaW5nIHVpZCkgeworICAgIAorICBpZiAodGltZSgpIDw9IGxkYXRhW3VpZCxEX0xPR1RJTUVdCisgICAgICAmJiBsZGF0YVt1aWQsRF9JTkRFWF0pIHsKKyAgICAvLyBEYXRlbiB3ZWdzY2hyZWliZW4sIHdlbm4gTG9nemVpdCBuaWNodCBhYmdlbGF1ZmVuLiBTb25zdCBuaWNodC4KKyAgICBjYWxsX291dCgjJ0R1bXBEYXRhLCAyLCB1aWQsIGxkYXRhW3VpZCxEX0VSU1RJRV0sIGxkYXRhW3VpZCxEX0lQU1RSSU5HXSwKKwkgICAgICAgICAgICAgICAgICAgIGxkYXRhW3VpZCxEX0ZMQUdTXSwgbGRhdGFbdWlkLERfTE9HXSk7CisgIH0KKyAgbGRhdGFbdWlkLERfTE9HXSA9ICh7fSk7CisgIGxkYXRhW3VpZCxEX0lOREVYXSA9IDA7Cit9CisKK3ByaXZhdGUgdm9pZCBEdW1wRGF0YShzdHJpbmcgdWlkLCBzdHJpbmcgZXJzdGllLCBzdHJpbmcgaXAsIGludCBmbGFncywgbWl4ZWQgbG9nZGF0YSkgeworICBzdHJpbmcgcmVzID0gc3ByaW50ZigiXG4lcyVzLCBJUDogJXNcbiIsIGNhcGl0YWxpemUodWlkKSwKKyAgICAgICAgICAgICAgICAgICAgICAoc3RyaW5ncChlcnN0aWUpID8gIiAoIitjYXBpdGFsaXplKGVyc3RpZSkrIikiIDogIiIpLAorCQkgICAgICAoc3RyaW5ncChpcCkgPyBpcCA6ICJVbmJla2FubnQiKSk7CisgIGxvZ2RhdGEtPSh7MH0pOworICBmb3JlYWNoKG1peGVkIGFyciA6IGxvZ2RhdGEpIHsKKyAgICByZXMrPXNwcmludGYoIiVPOiAlTyBbJXNdXG4iLCAKKyAgICAgICAgc3RyZnRpbWUoIiV5JW0lZC0lSCVNJVMiLGFycltETF9USU1FXSksCisgICAgICAgIGFycltETF9DTURdLCBhcnJbRExfRU5WXSB8fCAiPHVuYmVrYW5udD4iKTsKKyAgfQorCisgIC8vREVCVUcoIkR1bXBEYXRhOiAiK3Jlcyk7CisgIGlmIChmbGFncyAmIEZMX1BFUk1BTkVOVCkKKyAgICBjYXRjaChsb2dfZmlsZSgiQVJDSC9iYi4iK3VpZCwgcmVzLCBNQVhMT0dTSVpFKSk7CisgIGVsc2UgaWYgKGZpbGVfc2l6ZShMSUJMT0dESVIiL0FSQ0gvYmJtYXN0ZXIiKSA9PSBGU0laRV9ESVIpCisgICAgY2F0Y2gobG9nX2ZpbGUoIkFSQ0gvYmJtYXN0ZXIvIit1aWQsIHJlcywgU01BTExMT0dTSVpFKSk7CisgIC8vIGtlaW4gZWxzZSwgaW4gYW5kZXJlbiBGYWVsbGVuIHdlcmRlbiBkaWUgRGF0ZW4gdmVyd29yZmVuLgorfQorCitwcml2YXRlIHZvaWQgQWRkVGVtcG9yYXJ5UGxheWVyKHN0cmluZyB1aWQpIHsKKyAgICAvLyBuYXR1ZXJsaWNoIG51ciwgd2VubiBub2NoIG5peCBlaW5nZXRyYWdlbi4KKyAgICBpZiAoIW1lbWJlcihsZGF0YSwgdWlkKSkgeworICAgICAgb2JqZWN0IG9iID0gZmluZF9wbGF5ZXIodWlkKSB8fCBmaW5kX25ldGRlYWQodWlkKTsKKyAgICAgIAorICAgICAgbWl4ZWQgZXJzdGllOworICAgICAgaWYgKG9iKQorICAgICAgICBlcnN0aWUgPSAoc3RyaW5nKW9iLT5RdWVyeVByb3AoUF9TRUNPTkQpOworCisgICAgICBsZGF0YSArPSAoW3VpZDogdGltZSgpICsgTE9HVElNRSArIHJhbmRvbShMT0dUSU1FLzIpOyAKKwkgICAgICAgICAgICAgIDA7CisJCSAgICAgIChzdHJpbmdwKGVyc3RpZSkgPyBlcnN0aWUgOiAwKTsKKwkJICAgICAgcXVlcnlfaXBfbnVtYmVyKG9iKTsKKwkJICAgICAgMDsgKHt9KQorCSAgICAgICAgXSk7CisgICAgfQorfQorCitwcml2YXRlIHZvaWQgUmVtb3ZlVGVtcG9yYXJ5UGxheWVyKHN0cmluZyB1aWQpIHsgCisgIGlmICghKGxkYXRhW3VpZCxEX0ZMQUdTXSAmIEZMX1BFUk1BTkVOVCkpIHsKKyAgICBtX2RlbGV0ZShsZGF0YSwgdWlkKTsKKyAgfQorfQorCisKKy8vIFZvbSBTcGllbGVyZXJvYmpla3QgYmVpIEVyc2NoYWZmdW5nIGluIEluaXRQbGF5ZXIoKSBnZXJ1ZmVuLgorcHVibGljIGludCBxdWVyeV9iYigpCit7CisgICAgCisgICAgaWYgKGxvYWRfbmFtZShwcmV2aW91c19vYmplY3QoKSlbMC4uMTFdICE9ICIvc3RkL3NoZWxscy8iKQorICAgICAgICByZXR1cm4gMDsKKworICAgIC8vIGluIGplZGVtIEZhbGwgd2lyZCBudW4gKHRlbXBvcmFlcikgZGVyIEJCLU1vZHVzIGFrdGl2aWVydC4KKyAgICBpZiAoIXByZXZpb3VzX29iamVjdCgpLT5RdWVyeUd1ZXN0KCkpCisgICAgICBwcmV2aW91c19vYmplY3QoKS0+X19zZXRfYmIoMSk7CisKKyAgICAvLyBudXIgZnVlciAncGVybWFuZW50ZScgYXVjaCAxIHp1cnVlY2tnZWJlbi4KKyAgICByZXR1cm4gbGRhdGFbZ2V0dWlkKHByZXZpb3VzX29iamVjdCgpKSxEX0ZMQUdTXSAmIEZMX1BFUk1BTkVOVDsKK30KKworCisKKy8vIG5ldWUgRnVua3Rpb24uIEtyaWVndCBudXIgS29tbWFuZG9zc3RyaW5nIHVlYmVyZ2VnZW4sIHdlcmRlbiBnZ2YuIGdlcHVmZmVydAorLy8gdW5kIGRhbm4gd2VnZ2VzY2hyaWViZW4uCitwdWJsaWMgdmFyYXJncyB2b2lkIEJCV3JpdGUoc3RyaW5nIG1zZywgaW50IGNhdG1vZGUpIHsKKyAgCisgIGlmICggIXRoaXNfaW50ZXJhY3RpdmUoKSB8fAorICAgICAgKGV4dGVybl9jYWxsKCkgJiYgCisgICAgICAgc3Ryc3RyKGxvYWRfbmFtZShwcmV2aW91c19vYmplY3QoKSksICIvc3RkL3NoZWxscy8iKSAhPSAwICkgKQorICAgIHJldHVybjsKKworICBzdHJpbmcgdWlkID0gZ2V0dWlkKHRoaXNfaW50ZXJhY3RpdmUoKSk7CisKKyAgaWYgKCFtZW1iZXIobGRhdGEsIHVpZCkpCisgICAgQWRkVGVtcG9yYXJ5UGxheWVyKHVpZCk7ICAKKyAgZWxzZSBpZiAobGRhdGFbdWlkLERfTE9HVElNRV0gPCB0aW1lKCkpIHsKKyAgICAvLyBMb2d6ZWl0IGFiZ2VsYXVmZW4uIC0+IEVOREUuCisgICAgaWYgKGxkYXRhW3VpZCxEX0lOREVYXSkgeworICAgICAgdGhpc19pbnRlcmFjdGl2ZSgpLT5fX3NldF9iYigwKTsKKyAgICAgIC8vIGVzIGthbm4gdm9ya29tbWVuLCBkYXNzIGhpZXIgbmVuIFByb2Nlc3NCdWZmZXIgbWl0IGFuZGVyZXIgdWlkCisgICAgICAvLyBkcmluaGFlbmd0LiBJc3QgYWJlciBlZ2FsLCBkYW5uIHdpcmQgZGVyIFB1ZmZlciBoYWx0IG5hZWNoc3Rlc21hbAorICAgICAgLy8gZ2VzY2hyaWViZW4uCisgICAgICBpZiAoZmluZF9jYWxsX291dCgjJ1Byb2Nlc3NCdWZmZXIpID09IC0xKQorICAgICAgICAgIGNhbGxfb3V0KCMnUHJvY2Vzc0J1ZmZlciwgMiwgdWlkKTsKKyAgICB9CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gaW0gc3luY2hyb25lbiBNb2R1cyBkaXJla3QgYXVmIFBsYXR0ZSBzY2hyZWliZW4uCisgIC8vREVCVUcoIkJCV3JpdGU6IEZsYWdzIHZvbiArIit1aWQrIjogIit0b19zdHJpbmcobGRhdGFbdWlkLERfRkxBR1NdKQorICAvLyAgICArIlxuIik7CisgIGlmIChsZGF0YVt1aWQsRF9GTEFHU10gJiBGTF9TWU5DKSB7CisgICAgLy9ERUJVRygiQkJXcml0ZTogU3luY21vZHVzXG4iKTsKKyAgICBpZiAoIWNhdG1vZGUpIHsKKyAgICAgIG1zZyA9IHNwcmludGYoIiVzOiAlcyBbJU9dXG4iLCBzdHJmdGltZSgiJXklbSVkLSVIJU0lUyIpLAorCSAgbXNnLCBlbnZpcm9ubWVudCh0aGlzX2ludGVyYWN0aXZlKCkpKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgbXNnID0gbXNnICsgIlxuIjsKKyAgICBsb2dfZmlsZSggIkFSQ0gvYmIuIit1aWQsIG1zZywgTUFYTE9HU0laRSApOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIGFsbGUgYW5kZXJlbiB3ZXJkZW4gZXJzdG1hbCBnZXB1ZmZlcnQuIAorCisgIC8vIHdlbm4gY2F0bW9kZSB1bmQgbmVuIEluZGV4ID4gMCB3aXJkIGRlciBLcmFtIGFuIGRlbiB2b3JoZXJpZ2VuIEVpbnRyYWdlbgorICAvLyBhbmdlaGFlbmd0LgorICBpbnQgaW5kZXggPSBsZGF0YVt1aWQsRF9JTkRFWF07CisgIGlmIChjYXRtb2RlICYmIGluZGV4ID4gMCkgeworICAgIC0taW5kZXg7CisgICAgbGRhdGFbdWlkLERfTE9HXVtpbmRleF1bRExfQ01EXSArPSBtc2c7CisgIH0KKyAgZWxzZSB7CisgICAgLy8gUHVmZmVyIHZlcmdyb2Vzc2Vybj8KKyAgICBpZiAoaW5kZXggPj0gc2l6ZW9mKGxkYXRhW3VpZCxEX0xPR10pKQorICAgICAgbGRhdGFbdWlkLERfTE9HXSs9YWxsb2NhdGUoMTAwKTsKKyAgICBsZGF0YVt1aWQsRF9MT0ddW2luZGV4XSA9ICh7IHRpbWUoKSwgbXNnLCAKKwkgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0X25hbWUoZW52aXJvbm1lbnQodGhpc19pbnRlcmFjdGl2ZSgpKSkgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgbGRhdGFbdWlkLERfSU5ERVhdKys7CisgICAgLy8gZXMga2FubiB2b3Jrb21tZW4sIGRhc3MgaGllciBuZW4gUHJvY2Vzc0J1ZmZlciBtaXQgYW5kZXJlciB1aWQKKyAgICAvLyBkcmluaGFlbmd0LiBJc3QgYWJlciBlZ2FsLCBkYW5uIHdpcmQgZGVyIFB1ZmZlciBoYWx0IG5hZWNoc3Rlc21hbAorICAgIC8vIGdlc2NocmllYmVuLgorICAgIGlmIChpbmRleCA+IE1BWEJVRkZTSVpFIAorICAgICAgICAmJiBmaW5kX2NhbGxfb3V0KCMnUHJvY2Vzc0J1ZmZlcikgPT0gLTEpCisgICAgICBjYWxsX291dCgjJ1Byb2Nlc3NCdWZmZXIsIDIsIHVpZCk7CisgIH0KK30KKworLy8gQWx0ZSBGdW5rdGlvbiwga3JpZWd0IFN0cmluZ3MsIHRlaWx3ZWlzZSBtaXQgRGF0dW0sIHRlaWx3ZWlzZSBvaG5lLAorLy8gc2NocmllYiBmcnVlaGVyIG51ciB3ZWcuIG1zZyBmYWVuZ3QgZW50d2VkZXIgbWl0IGVpbmVtIERhdHVtL1plaXQtU3RyaW5nCisvLyBvZGVyIG1pdCBlaW5lbSAiLT4iIGFuLgorcHVibGljIHZvaWQgd3JpdGViYiggc3RyaW5nIG1zZyApCit7CisgIGludCBjYXRtb2RlOyAKKyAKKyAgaWYgKCAhdGhpc19pbnRlcmFjdGl2ZSgpIHx8CisgICAgICAoZXh0ZXJuX2NhbGwoKSAmJiAKKyAgICAgICBzdHJzdHIobG9hZF9uYW1lKHByZXZpb3VzX29iamVjdCgpKSwgIi9zdGQvc2hlbGxzLyIpICE9IDAgKSApCisgICAgcmV0dXJuOworIAorICAvLyBlcnN0bWFsIFN0cmluZyBiZXJlaW5pZ2VuLgorICBtc2cgPSB0cmltKG1zZyxUUklNX1JJR0hULCJcbiIpOworICBpZiAoc3Ryc3RyKG1zZywiLT4iKSA9PSAwKSB7CisgICAgY2F0bW9kZT0xOworICAgIG1zZz0gIiAtPiAiICsgbXNnWzIuLl07CisgIH0KKyAgZWxzZSB7CisgICAgLy8gZmFlbmd0IG1pdCBEYXR1bXNzdHJpbmcgYW4sIGVyc3RlcyBMZWVyemVpY2hlbiBhYiBkZW0gemVobnRlbiBaZWljaGVuCisgICAgLy8gc3VjaGVuIHVuZCB2b24gZG9ydCBhYnNjaG5laWRlbi4KKyAgICBtc2cgPSBtc2dbc3Ryc3RyKG1zZywiICIsMTApKzEgLi5dOworICB9CisKKyAgLy8gRGFubiB3ZWl0ZXJnZWJlbgorICBCQldyaXRlKG1zZywgY2F0bW9kZSk7Cit9CisKK3ByaXZhdGUgdm9pZCBzY2FuX2JiX29wZmVyKCkKK3sKKyAgICBzdHJpbmcqIGxpbmVzOworICAgIG9iamVjdCBwbDsKKyAgICBzdHJpbmcgdWlkOworCisgICAgLy8gZGllc2UgdXNlciB3ZXJkZW4gJ3Blcm1hbmVudCcgdWViZXJ3YWNodCwgbmljaHQgbnVyIGRpcmVrdCBuYWNoIGRlbQorICAgIC8vIEVpbmxvZ2dlbi4KKyAgICBsaW5lcyA9IGV4cGxvZGUoIGxvd2VyX2Nhc2UoIHJlYWRfZmlsZSgiL3NlY3VyZS9BUkNIL0JCX09QRkVSLmR1bXAiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgIiIgKSwgIlxuIiApWzIuLl07CisgICAgCisgICAgZm9yZWFjaChzdHJpbmcgbGluZSA6IGxpbmVzKSB7CisgICAgICAgIGlmKCBzaXplb2YobGluZSkgJiYgbGluZVswXSAhPSAnIycgKSB7CisJICAgIHVpZD1saW5lWzAgLi4gbWVtYmVyKGxpbmUsJyAnKS0xXTsKKwkgICAgQWRkVGVtcG9yYXJ5UGxheWVyKHVpZCk7CisJICAgIGxkYXRhW3VpZCxEX0xPR1RJTUVdID0gX19JTlRfTUFYX187CisJICAgIGxkYXRhW3VpZCxEX0ZMQUdTXSA9IEZMX1BFUk1BTkVOVDsKKwkgICAgcGwgPSBmaW5kX3BsYXllcih1aWQpIHx8IGZpbmRfbmV0ZGVhZCh1aWQpOworCSAgICBpZiAocGwpCisJICAgICAgcGwtPl9fc2V0X2JiKDEpOworCX0KKyAgICB9Cit9CisKKy8vIE5ldWxhZGVuIGlzdCBrZWluIGdyb3NzZXMgUHJvYmxlbSwgd2VpbCBkZXIgYmJtYXN0ZXIgamEgYXV0b21hdGlzY2gKKy8vIG5ldWdlbGFkZW4gd2lyZC4gTmViZW5lZmZla3QgaXN0IGxlZGlnbGljaCwgZGFzcyBmdWVyIGFsbGUgbGF1ZmVuZGVuIExvZ3MKKy8vIGRpZSBMb2d6ZWl0IHdpZWRlciB2b24gdm9ybmUgYW5mYWVuZ3QuIERhIGRhcyBTY2hyZWliZW4gZGVyIFB1ZmZlciBhYmVyIExhZworLy8gdmVydXJzYWNoZW4ga2FubiwgZHVlcmZlbiBlcyBudXIgRU0rLgorcHVibGljIHZhcmFyZ3MgaW50IHJlbW92ZShpbnQgc2lsZW50KSB7CisgCisgIGlmICghQVJDSF9TRUNVUklUWSkKKyAgICByZXR1cm4gMDsKKworICBsb2dfZmlsZSgiQVJDSC9iYm1hc3Rlci5sb2ciLCBzdHJmdGltZSgiJWM6IHJlbW92ZSgpIGNhbGxlZC5cbiIpKTsKKworICAvLyBhbGxlIFB1ZmZlciBsZWVyZW4uLi4KKyAgLy8gUHJvY2Vzc0FsbEJ1ZmZlcnMoKSB3aXJkIGhpZXJiZWkgX29obmVfIExpbWl0cyBhdWZnZXJ1ZmVuISBLYW5uIGZpZXNlcworICAvLyBMYWcgZXJ6ZXVnZW4sIGFiZXIgc29uc3Qgd3VyZGUgZGVyIEtyYW0gZXZ0bC4gbmljaHQgb3JkZW50bGljaAorICAvLyBnZXNjaHJpZWJlbi4KKyAgbGltaXRlZCgjJ1Byb2Nlc3NBbGxCdWZmZXJzKTsKKyAgZGVzdHJ1Y3QodGhpc19vYmplY3QoKSk7CisgIHJldHVybiAxOworfQorCisKKy8vIEFsbGVzIGFiIGhpZXIgbnVyIHp1bSBVZWJlcndhY2hlbiB2b24gRlRQLUFrdGl2aXRhZXRlbi4KK3ByaXZhdGUgaW50IHBsYXllcl9leGlzdHMoIHN0cmluZyB1c2VyICkKK3sKKyAgICBpZiAoICFzdHJpbmdwKCB1c2VyICkgfHwgc2l6ZW9mKCB1c2VyICkgPCAyICkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgCisgIHJldHVybiBmaWxlX3NpemUoICIvc2F2ZS8iICsgdXNlclswLi4wXSArICIvIiArIHVzZXIgKyAiLm8iICkgPiAwOworfQorCitwdWJsaWMgaW50IGFkZCggc3RyaW5nIHVzZXIsIGludCB0aW1lb3V0ICkKK3sKKyAgICBpZiAoICFBUkNIX1NFQ1VSSVRZIHx8IHByb2Nlc3NfY2FsbCgpICkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIAorICAgIGlmKCAhc3RyaW5ncCh1c2VyKSB8fCAhcGxheWVyX2V4aXN0cyhsb3dlcl9jYXNlKHVzZXIpKSB8fCAhaW50cCh0aW1lb3V0KSB8fAorICAgICAgICAhdGltZW91dCApCisgICAgICAgIHJldHVybiAtMjsKKyAgICAKKyAgICBtb25pdG9yZWRbbG93ZXJfY2FzZSh1c2VyKV0gPSB0aW1lb3V0OworICAgIHNhdmVfb2JqZWN0KCBGVFBTQVZFICk7CisgICAgCisgICAgcmV0dXJuIDE7Cit9CisKKworcHVibGljIGludCBzdWIoIHN0cmluZyB1c2VyICkKK3sKKyAgICBpZiAoICFBUkNIX1NFQ1VSSVRZIHx8IHByb2Nlc3NfY2FsbCgpICkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIAorICAgIGlmKCAhc3RyaW5ncCh1c2VyKSB8fCAhbWVtYmVyKCBtb25pdG9yZWQsIGxvd2VyX2Nhc2UodXNlcikgKSApCisgICAgICAgIHJldHVybiAtMjsKKyAgICAKKyAgICBtX2RlbGV0ZSggbW9uaXRvcmVkLCBsb3dlcl9jYXNlKHVzZXIpICk7CisgICAgc2F2ZV9vYmplY3QoIEZUUFNBVkUgKTsKKyAgICAKKyAgICByZXR1cm4gMTsKK30KKworCitwdWJsaWMgdm9pZCBmdHBiYiggc3RyaW5nIHVzZXIsIHN0cmluZyBtc2cgKQoreworICAgIGlmKCBnZXR1aWQocHJldmlvdXNfb2JqZWN0KCkpICE9IFJPT1RJRCApCisgICAgICAgIHJldHVybjsKKworICAgIGlmICggbGRhdGFbdXNlcixEX0ZMQUdTXSAmIEZMX1BFUk1BTkVOVCApCisgICAgICAgIGxvZ19maWxlKCAiQVJDSC9iYi4iK3VzZXIsIG1zZywgMjAwMDAwMCApOworCisgICAgaWYgKCBtb25pdG9yZWRbdXNlcl0gKXsKKyAgICAgICAgaWYgKCBtb25pdG9yZWRbdXNlcl0gPiAwICYmIG1vbml0b3JlZFt1c2VyXSA8IHRpbWUoKSApCisgICAgICAgICAgICBzdWIoIHVzZXIgKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgQ0hNQVNURVItPnNlbmQoICJGVFAiLCBjYXBpdGFsaXplKHVzZXIpLCBtc2cgKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3NlY3VyZS9jb21iYXQuYyBiL3NlY3VyZS9jb21iYXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjAzMWE0Ci0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL2NvbWJhdC5jCkBAIC0wLDAgKzEsODcgQEAKKy8qCisgKiBzZWN1cmUvY29tYmF0LmMKKyAqCisgKiB0aGUgY29tYmF0IG1hc3RlciBvYmplY3QuIEl0IGRlZmluZXMgc29tZSB1c2VmdWwgZnVuY3Rpb25zIHRvIGJlCisgKiB1c2VkIGJ5IHdlYXBvbnMsIGFybW91ciBhbmQgbGl2aW5ncy4KKyAqLworI3ByYWdtYSBzdHJpY3RfdHlwZXMKKyNwcmFnbWEgbm9fY2xvbmUKKyNwcmFnbWEgbm9fc2hhZG93CisvLyNwcmFnbWEgbm9faW5oZXJpdAorI3ByYWdtYSB2ZXJib3NlX2Vycm9ycworI3ByYWdtYSBjb21iaW5lX3N0cmluZ3MKKy8vI3ByYWdtYSBwZWRhbnRpYworLy8jcHJhZ21hIHJhbmdlX2NoZWNrCisjcHJhZ21hIHdhcm5fZGVwcmVjYXRlZAorCisjaW5jbHVkZSA8Y29tYmF0Lmg+CisKK2ludCBkZWZhdWx0X3dlYXBvbl9jbGFzcyhzdHJpbmcgdHlwZSkgeworCXN3aXRjaCh0eXBlKSB7CisJCWNhc2UgImtuaWZlIjoKKwkJCXJldHVybiA1MDsKKwkJY2FzZSAiY2x1YiI6CisJCQlyZXR1cm4gNzA7CisJCWNhc2UgInN3b3JkIjoKKwkJCXJldHVybiAxMDA7CisJCWNhc2UgImF4ZSI6CisJCQlyZXR1cm4gOTA7CisJfQorCXJldHVybiAzMDsKK30KKworaW50IGRlZmF1bHRfd2VhcG9uX3dlaWdodChzdHJpbmcgdHlwZSkgeworCXN3aXRjaCh0eXBlKSB7CisJCWNhc2UgImtuaWZlIjoKKwkJCXJldHVybiAxMDA7CisJCWNhc2UgImNsdWIiOgorCQkJcmV0dXJuIDE1MDA7CisJCWNhc2UgInN3b3JkIjoKKwkJCXJldHVybiAyMDAwOworCQljYXNlICJheGUiOgorCQkJcmV0dXJuIDE1MDA7CisJfQorCXJldHVybiAxMDAwOworfQorCitpbnQgZGVmYXVsdF93ZWFwb25fdmFsdWUoc3RyaW5nIHR5cGUpIHsKKwlzd2l0Y2godHlwZSkgeworCQljYXNlICJrbmlmZSI6CisJCQlyZXR1cm4gMTA7CisJCWNhc2UgImNsdWIiOgorCQkJcmV0dXJuIDUwOworCQljYXNlICJzd29yZCI6CisJCQlyZXR1cm4gNTAwOworCQljYXNlICJheGUiOgorCQkJcmV0dXJuIDMwMDsKKwl9CisJcmV0dXJuKDApOworfQorCitpbnQgdmFsaWRfd2VhcG9uX3R5cGUobWl4ZWQgdCkgeworCWlmIChtZW1iZXIoKHtXVF9TV09SRCwgV1RfQVhFLCBXVF9DTFVCLCBXVF9TUEVBUiwgV1RfU1RBRkYsCisgICAgICAgICAgICAgICBXVF9LTklGRX0pLCB0ICkgIT0gLTEpIHsKKwkJIHJldHVybiAxOworCX0KKwllbHNlIHsKKwkJbG9nX2ZpbGUoIkNPTUJBVCIsIkludmFsaWQgd2VhcG9uIHR5cGU6ICIrdCsiLCBvYmplY3Q6ICIrCisJCQkJb2JqZWN0X25hbWUocHJldmlvdXNfb2JqZWN0KCkpKyJcbiIpOworCQlyZXR1cm4gMDsKKwl9Cit9CisKKworaW50IHZhbGlkX2FybW91cl90eXBlKG1peGVkIHQpIHsKKwlpZiAoVkFMSURfQVJNT1VSX1RZUEUodCkpIHsKKwkJIHJldHVybiAxOworCX0KKwllbHNlIHsKKwkJbG9nX2ZpbGUoIkNPTUJBVCIsIkludmFsaWQgYXJtb3VyIHR5cGU6ICIrdCsiLCBvYmplY3Q6ICIrCisJCQkJb2JqZWN0X25hbWUocHJldmlvdXNfb2JqZWN0KCkpKyJcbiIpOworCQlyZXR1cm4gMDsKKwl9Cit9CisKKworaW50IHF1ZXJ5X3ByZXZlbnRfc2hhZG93KCkgeyByZXR1cm4gMTsgfQorCmRpZmYgLS1naXQgYS9zZWN1cmUvY29uZmlnLmggYi9zZWN1cmUvY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTcwYzhkYQotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9jb25maWcuaApAQCAtMCwwICsxLDE1MSBAQAorI2lmbmRlZiBfQ09ORklHXworI2RlZmluZSBfQ09ORklHXworCisvKgorICogY29uZmlnLmgKKyAqCisgKiBnZW5lcmFsIGNvbmZpZ3VyYXRpb24gaXMgZG9uZSBoZXJlLCB0aGUgc2VsZWN0aW9uIG9mIGdhbWVkcml2ZXIgbW9kZQorICogYW5kIHRoZSBsYW5ndWFnZSB0byB1c2UuCisgKi8KKworI2RlZmluZSBNVURIT1NUICJtZyIKKyNkZWZpbmUgRlRQRF9JUCAiODcuNzkuMjQuNjAiCisjZGVmaW5lIFVEUFNFUlYgIjg3Ljc5LjI0LjYwIgorCisvLyBHdWVzcyBhIE1VRE5BTUUgaWYgbm9uZSBpcyBzZXQuCisjaWZuZGVmIE1VRE5BTUUKKy8vIHNldCBtdWRuYW1lIHRvIE1vcmdlbkdyYXVlbiBpZiBNdWQgc3RhcnRlZCBvbiB0aGUgTUcgc2VydmVyCisjICBpZiBNVURIT1NUID09IF9fSE9TVF9OQU1FX18gJiYgIWRlZmluZWQoX19URVNUTVVEX18pCisjICAgIGRlZmluZSBNVUROQU1FICJNb3JnZW5HcmF1ZW4iCisjICBlbHNlCisjICAgIGRlZmluZSBNVUROQU1FICJNRy1Ib21lbXVkIgorIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgTVVETkFNRSA9PSAiTW9yZ2VuR3JhdWVuIgorIyAgZGVmaW5lIFNTTFBPUlQgNDcxMgorI2Vsc2UKKyMgIGRlZmluZSBTU0xQT1JUIDQ3MTQKKyNlbmRpZgorCisvLyB1bmRlZiB0byBkaXNhYmxlIE1TU1Agc3VwcG9ydC4KKyNkZWZpbmUgTVNTUF9TVVBQT1JUICJNU1NQLVBsYWludGV4dCIKKworLy8gdW5kZWYgdG8gZGlzYWJsZSBzdXBwb3J0IGZvciBwdXJlLWZ0cGQgdmlydHVhbCB1c2VycworI2RlZmluZSBfUFVSRUZUUERfCisKKyNkZWZpbmUgX01VRExJQl9OQU1FXyAiTW9yZ2VuR3JhdWVuIgorI2RlZmluZSBfTVVETElCX1ZFUlNJT05fICIzLjMuNSIKKworLyogZGVmaW5lIGdlbmVyYWwgcGF0aG5hbWVzICovCisjZGVmaW5lIE1BU1RFUiAgICAgICAgICAic2VjdXJlL21hc3RlciIKKyNkZWZpbmUgTUFJTFBBVEggICAgICAgICJtYWlsLyIKKyNkZWZpbmUgU0FWRVBBVEggICAgICAgICJzYXZlLyIKKyNkZWZpbmUgTkVXU1BBVEggICAgICAgICJuZXdzLyIKKyNkZWZpbmUgTkVXU1NFUlZFUiAgICAgICJzZWN1cmUvbmV3cyIKKyNkZWZpbmUgU0VDVVJFU0FWRVBBVEggICJzZWN1cmUvc2F2ZS8iCisjZGVmaW5lIENPTUJBVF9NQVNURVIgICAic2VjdXJlL2NvbWJhdCIKKworI2RlZmluZSBXSVpBUkRESVIgICAgICAgInBsYXllcnMiCisjZGVmaW5lIERPTUFJTkRJUiAgICAgICAiZCIKKyNkZWZpbmUgUFJPSkVDVERJUiAgICAgICJwIgorI2RlZmluZSBET0NESVIgICAgICAgICAgImRvYyIKKyNkZWZpbmUgR1VJTERESVIgICAgICAgICJnaWxkZW4iCisjZGVmaW5lIFNQRUxMQk9PS0RJUiAgICAic3BlbGxib29rcyIKKyNkZWZpbmUgTUFJTERJUiAgICAgICAgICJtYWlsIgorI2RlZmluZSBMSUJTQVZFRElSICAgICAgInNhdmUiCisjZGVmaW5lIEZUUERJUiAgICAgICAgICAib3BlbiIKKyNkZWZpbmUgVE1QRElSICAgICAgICAgICJ0bXAiCisjZGVmaW5lIFNURERJUiAgICAgICAgICAic3RkIgorI2RlZmluZSBTWVNESVIgICAgICAgICAgInN5cyIKKyNkZWZpbmUgTElCT0JKRElSICAgICAgICJvYmoiCisjZGVmaW5lIExJQlJPT01ESVIgICAgICAicm9vbSIKKyNkZWZpbmUgRVRDRElSICAgICAgICAgICJldGMiCisjZGVmaW5lIExJQkxPR0RJUiAgICAgICAibG9nIgorI2RlZmluZSBORVdTRElSICAgICAgICAgIm5ld3MiCisjZGVmaW5lIFNFQ1VSRURJUiAgICAgICAic2VjdXJlIgorI2RlZmluZSBMSUJEQVRBRElSICAgICAgImRhdGEiCisjZGVmaW5lIExJQklURU1ESVIgICAgICAiaXRlbXMiCisKKyNkZWZpbmUgTkVUREVBRF9ST09NICIvcm9vbS9uZXR6dG90IgorI2RlZmluZSBORVRERUFEX0NIRUNLX1RJTUUgNQorCisvKiBkZWZpbmUgc3BlY2lhbCB1c2VyaWRzICovIAorI2RlZmluZSBCQUNLQk9ORUlEICIgUyBUIEQgIgorI2RlZmluZSBST09USUQgICAgICIgUiBPIE8gVCAiCQkJLyogdXBwZXJjYXNlICEhICovCisjZGVmaW5lIE1BSUxJRCAgICAgIiBNIEEgSSBMICIKKyNkZWZpbmUgTkVXU0lEICAgICAiIE4gRSBXIFMgIgorI2RlZmluZSBOT0JPRFkgICAgICJOT0JPRFkiCisjZGVmaW5lIFJPT01JRCAgICAgInJvb20iCisjZGVmaW5lIFBPTElaRUlJRCAgInBvbGl6ZWkiCisjZGVmaW5lIERPQ0lEICAgICAgIkRPQyIKKyNkZWZpbmUgR1VJTERJRCAgICAiR1VJTEQiCisjZGVmaW5lIElURU1JRCAgICAgIklURU1TIgorCisvLyAiQmVzb25kZXJlIiBNYWdpZXJsZXZlbAorI2RlZmluZSBXSVpMVkxTIChbIFJPT1RJRDogMTAwLFwKKyAgICAgICAgICAgICAgICAgICBST09NSUQ6IDIxLFwKKyAgICAgICAgICAgICAgICAgICBQT0xJWkVJSUQ6IDIxLFwKKyAgICAgICAgICAgICAgICAgICAiYWxsZSI6IDI1LFwKKyAgICAgICAgICAgICAgICAgICBOT0JPRFk6IDAsXAorICAgICAgICAgICAgICAgICAgIERPQ0lEOiAwLFwKKyAgICAgICAgICAgICAgICAgICBHVUlMRElEOiAzMCxcCisgICAgICAgICAgICAgICAgICAgSVRFTUlEOiAwLFwKKyAgICAgICAgICAgICAgICAgXSkKKworI2RlZmluZSBNQVhfTE9HX1NJWkUgNTAwMDAKKworI2lmbmRlZiBURVNUTVVECisjICBkZWZpbmUgQ0FMTF9PVVRfSEFSRCAxMjAwCisjICBkZWZpbmUgQ0FMTF9PVVRfU09GVCAxMDAwCisjZWxzZSAvLyAhVEVTVE1VRAorIyAgaWZkZWYgTUlOX0NBTExfT1VUCisjICAgIGRlZmluZSBDQUxMX09VVF9IQVJEIDEyMAorIyAgICBkZWZpbmUgQ0FMTF9PVVRfU09GVCAxMDAKKyMgIGVsc2UKKyMgICAgZGVmaW5lIENBTExfT1VUX0hBUkQgMTIwMDAwCisjICAgIGRlZmluZSBDQUxMX09VVF9TT0ZUIDEwMDAwMAorIyAgZW5kaWYKKyNlbmRpZiAvLyBURVNUTVVECisKKyNkZWZpbmUgQkFDS0JPTkVfV0laSU5GT19TSVpFIDgKKyNkZWZpbmUgTElWSU5HX05BTUUgMworI2RlZmluZSBOQU1FX0xJVklORyA0CisjZGVmaW5lIE1FTU9SWV9CVUZGIDUKKyNkZWZpbmUgTkVUREVBRF9NQVAgNgorI2RlZmluZSBJUF9OQU1FUyAgICA3CisKKworI2lmbmRlZiBTSU1VTF9FRlVOX0ZJTEUKKyNkZWZpbmUgU0lNVUxfRUZVTl9GSUxFICAgICAgICJzZWN1cmUvc2ltdWxfZWZ1bi9zaW11bF9lZnVuIgorI2VuZGlmCisjaWZuZGVmIFNQQVJFX1NJTVVMX0VGVU5fRklMRQorI2RlZmluZSBTUEFSRV9TSU1VTF9FRlVOX0ZJTEUgInNlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NpbXVsX2VmdW4iCisjZW5kaWYKKworI2RlZmluZSBNQVhfTUFJTFNfUEVSX0hPVVIgMjAwCisKKy8vbWF4LiBncm9lc3NlIHZvbiBNYXBwaW5ncyB1bmQgQXJyYXlzIHNvbGx0ZW4gdm9tIERyaXZlciBvZGVyIGRlcgorLy9Lb21tYW5kb3plaWxlIHZvcmRlZmluaWVydCBzZWluLiBXZW5uIG5pY2h0OgorI2lmbmRlZiBfX01BWF9NQVBQSU5HX0tFWVNfXworI2RlZmluZSBfX01BWF9NQVBQSU5HX0tFWVNfXyAzMDAwMAorI2VuZGlmCisjaWZuZGVmIF9fTUFYX01BUFBJTkdfU0laRV9fCisjZGVmaW5lIF9fTUFYX01BUFBJTkdfU0laRV9fIDYwMDAwCisjZW5kaWYKKyNpZm5kZWYgX19NQVhfQVJSQVlfU0laRV9fCisjZGVmaW5lIF9fTUFYX0FSUkFZX1NJWkVfXyAxMDAwMAorI2VuZGlmCisKKy8vIEhhYmVuIHdpciBlaW5lbiBGZWhsZXJkYWVtb25lbiB6dSBTcGVpY2hlciBkZXIgRGF0ZW4/IFdlbm4gamEsIHdlbGNoZW4/CisvLyBEZXIgbm9ybWFsZSBicmF1Y2h0IFN1cHBvcnQgZnVlciBzcWxpdGUuIFdlbm4gZGVyIG5pY2h0IGV4aXN0aWVydCwgbGFzc2VuCisvLyB3aXIgZGFzIG1pdCBkZW0gRXJyb3JkIHNlaW4uCisjaWZkZWYgX19TUUxJVEVfXworI2RlZmluZSBFUlJPUkQgIi9zZWN1cmUvZXJyb3JkLmMiCisjZW5kaWYKKworLy8gU2F2ZWZpbGUtVmVyc2lvbgorI2RlZmluZSBfX0xJQl9fU0FWRV9GT1JNQVRfVkVSU0lPTl9fIDEKKworI2VuZGlmIC8vIF9DT05GSUdfCisKZGlmZiAtLWdpdCBhL3NlY3VyZS9kZWJ1Zy5jIGIvc2VjdXJlL2RlYnVnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVhMDdlYwotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9kZWJ1Zy5jCkBAIC0wLDAgKzEsODYgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8qKiBcZmlsZSAvZmlsZS5jCisqIEt1cnpiZXNjaHJlaWJ1bmcuCisqIExhbmdiZXNjaHJlaWJ1bmcuLi4KKyogXGF1dGhvciA8QXV0b3I+CisqIFxkYXRlIDxkYXRlPgorKiBcdmVyc2lvbiAkSWQkCisqLworLyogQ2hhbmdlbG9nOgorKi8KKyNwcmFnbWEgc3RyaWN0X3R5cGVzLHNhdmVfdHlwZXMscnR0X2NoZWNrcworI3ByYWdtYSBub19jbG9uZQorI3ByYWdtYSBub19pbmhlcml0CisjcHJhZ21hIG5vX3NoYWRvdworI3ByYWdtYSBwZWRhbnRpYworI3ByYWdtYSByYW5nZV9jaGVjaworCisjaW5jbHVkZSA8ZnVuY3Rpb25saXN0Lmg+CisjaW5jbHVkZSA8bHBjdHlwZXMuaD4KKworI2luY2x1ZGUgPGRlZmluZXMuaD4KKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKworLyoqIFxkZWYgREVCVUcKKyAgT3V0cHV0cyBkZWJ1ZyBtZXNzYWdlIHRvIE1haW50YWluZXIsIGlmIE1haW50ZWluZXIgaXMgbG9nZ2VkIGluLiAKKyovCisjaWZuZGVmIERFQlVHCisjZGVmaW5lIERFQlVHKHgpICBpZiAoZmluZF9wbGF5ZXIoInplc3N0cmEiKSlcCisgICAgICAgICAgICB0ZWxsX29iamVjdChmaW5kX3BsYXllcigiemVzc3RyYSIpLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkREQkc6ICIreCsiXG4iKQorI2VuZGlmCisKKy8qKiBcZm4gc2V0X29iamVjdF9uZXh0X3Jlc2V0KG9iLHplaXQpCisgIFxicmllZiBzZXR6dCBkZW4gbmFlY2hzdGVuIFJlc2V0IGF1ZiAnemVpdCcKKyAgXGRldGFpbHMgc2V0enQgaW4gT2JqZWt0ZW4gZGVuIG5hZWNoc3RlbiBSZXNldCAtIG51ciBmdWVyIEVNKworICBccGFyYW1baW5dIG9iCisgIChvYmplY3QpIE9iamVrdCBkZXMgUmVzZXQgZ2VhZW5kZXJ0IHdpcmQuCisgIFxwYXJhbVtpbl0gemVpdAorICAoaW50KSBaZWl0IGJpcyB6dW0gbmFlY2hzdGVuIFJlc2V0LgorICBccmV0dXJuIChzdHJpbmcpIEdpYnQgZGllIHVlYmVyZ2ViZW5lIFplaXQgYmlzIHp1bSBiaXNoZXJpZ2VuIFJlc2V0LgorICBcYXV0aG9yIFplc3N0cmEKKyAgXGRhdGUgMDYuMTAuMjAwNworICBcc2Egc2V0X29iamVjdF9oZWFydF9iZWF0KCkKKyovCisvLyAqIFJlc2V0IGVpbmVzIE9iamVrdGVzIGVpbi9hdXNzY2hhbHRlbgoraW50IHNldF9vYmplY3RfbmV4dF9yZXNldChtaXhlZCBvYiwgaW50IHplaXQpIHsKKworICBpZiAoc3RyaW5ncChvYikpCisgICAgb2I9ZmluZF9vYmplY3Qob2IpOworCisgIGlmIChvYmplY3RwKG9iKSAmJiBFTERFUl9TRUNVUklUWSkKKyAgLy9pZiAob2JqZWN0cChvYikgJiYgU1BFQ0lBTF9TRUNVUklUWSAmJiAhY2xvbmVwKG9iKSkKKyAgICAgIHJldHVybiBmdW5jYWxsKGJpbmRfbGFtYmRhKCMnZWZ1bjo6c2V0X25leHRfcmVzZXQsb2IpLHplaXQpOworCisgIHJldHVybiAtMjsKK30KKworbWl4ZWQgcXVlcnlfdmFyaWFibGUob2JqZWN0IG9iLCBzdHJpbmcgdmFyKQoreworICBpZiAoIXByZXZpb3VzX29iamVjdCgpIHx8ICFJU19BUkNIKGdldGV1aWQocHJldmlvdXNfb2JqZWN0KCkpKSAKKyAgICAgIHx8ICF0aGlzX2ludGVyYWN0aXZlKCkgfHwgIUlTX0FSQ0godGhpc19pbnRlcmFjdGl2ZSgpKQorICAgICAgfHwgZ2V0dWlkKG9iKT09Uk9PVElEICkKKyAgeworICAgIHdyaXRlKCJEdSBiaXN0IGtlaW4gRU0gb2RlciBHb3R0IVxuIik7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBsb2dfZmlsZSgiQVJDSC9RViIsIHNwcmludGYoIiVzOiAlTyBpbnF1aXJlcyB2YXIgJXMgaW4gJU9cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdGltZSh0aW1lKCkpLHRoaXNfaW50ZXJhY3RpdmUoKSx2YXIsb2IpKTsKKyAgCisgIG1peGVkIHJlcyA9IHZhcmlhYmxlX2xpc3Qob2IsIFJFVFVSTl9GVU5DVElPTl9OQU1FfFJFVFVSTl9GVU5DVElPTl9GTEFHU3wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVUVVJOX0ZVTkNUSU9OX1RZUEV8UkVUVVJOX1ZBUklBQkxFX1ZBTFVFKTsKKyAgaW50IGluZGV4ID0gbWVtYmVyKHJlcyx2YXIpOworICBpZiAoaW5kZXggPiAtMSkKKyAgeworICAgIHJldHVybiAoe3Jlc1tpbmRleF0scmVzW2luZGV4KzFdLHJlc1tpbmRleCsyXSxyZXNbaW5kZXgrM119KTsKKyAgfQorCisgIHJldHVybiAwOworfQorCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKSB7CisgIC8vIHNlY3VyZV9sZXZlbCgpIGluICpfU0VDVVJJVFkoKSBwcnVlZnQgYXVmIGRpZSBFVUlECisgIHNldGV1aWQoZ2V0dWlkKE1FKSk7Cit9CisKZGlmZiAtLWdpdCBhL3NlY3VyZS9kcm9wbWFzdGVyLmMgYi9zZWN1cmUvZHJvcG1hc3Rlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjZDA5YzEKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvZHJvcG1hc3Rlci5jCkBAIC0wLDAgKzEsMjAyIEBACisjcHJhZ21hIHN0cmljdF90eXBlcyxzYXZlX3R5cGVzLHJ0dF9jaGVja3MKKyNwcmFnbWEgcGVkYW50aWMscmFuZ2VfY2hlY2sKKyNwcmFnbWEgbm9faW5oZXJpdCxub19jbG9uZQorI3ByYWdtYSBub19zaGFkb3cKKworI2RlZmluZSBfTkVFRF9EUk9QTUFTVEVSX0lNUExFTUVOVEFUSU9OXworI2luY2x1ZGUgPGRyb3BtYXN0ZXIuaD4KKyNpbmNsdWRlIDxkZWZpbmVzLmg+CisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisKK3N0cnVjdCByYW5kb21fZXZlbnRfcyB7CisgIHN0cmluZyAqbmFtZXM7CisgIGludCByZWR1Y3Rpb247CisgIGludCAqcm5kX3ZhbHVlczsKKyAgaW50ICpkZWZhdWx0X3JuZF92YWx1ZXM7CisgIHN0cmluZyBjcmVhdG9yOworfTsKKworLy8gTWFwcGluZyBtaXQgZWluZW0gcmFuZG9tX2V2ZW50X3MgYWxzIFdlcnQgcHJvIFNjaGx1ZXNzZWwKKy8vIFNjaGx1ZXNzZWw6IDA6IGdsb2JhbGVyIEVpbnRyYWcsIGFuc29uc3RlbiBCUC1OYW1lbiBvZGVyIFRlaWxlIHZvbiBQZmFkZW4KKy8vICgvZC88ZWJlbj4vPG1hZ2llcj4vPGdlYmlldD4vKQorcHJpdmF0ZSBtYXBwaW5nIHJhbmRvbUV2ZW50czsKKworcHJpdmF0ZSBzdHJ1Y3QgcmFuZG9tX2V2ZW50X3MgU2FuaXRpemVSRShzdHJ1Y3QgcmFuZG9tX2V2ZW50X3MgcmUpCit7CisgICAgLy8gcm5kX3ZhbHVlcywgZGVmYXVsdF9ybmRfdmFsdWVzIHVuZCBuYW1lcyBtdWVzc2VuIGdsZWljaCBsYW5nIHNlaW4gLT4gYXVmCisgICAgLy8gZGFzIGt1ZXJ6ZXN0ZSBrdWVyemVuLiBBY2h0dW5nOiBtYWNodCBpbXBsaXppdCBlaW5lIEtvcGllIC0gV0lDSFRJRyEKKyAgICBpbnQgc2l6ZSA9IHNpemVvZihyZS0+cm5kX3ZhbHVlcyk7CisgICAgaWYgKHBvaW50ZXJwKHJlLT5uYW1lcykpCisgICAgICAgIHNpemUgPSBtaW4oc2l6ZSwgc2l6ZW9mKHJlLT5uYW1lcykpOworICAgIGlmIChwb2ludGVycChyZS0+ZGVmYXVsdF9ybmRfdmFsdWVzKSkgeworICAgICAgc2l6ZSA9IG1pbihzaXplLCBzaXplb2YocmUtPmRlZmF1bHRfcm5kX3ZhbHVlcykpOworICAgICAgcmUtPmRlZmF1bHRfcm5kX3ZhbHVlcyA9IHJlLT5kZWZhdWx0X3JuZF92YWx1ZXNbMC4uc2l6ZS0xXTsKKyAgICB9CisgICAgaWYgKHBvaW50ZXJwKHJlLT5uYW1lcykpCisgICAgICByZS0+bmFtZXMgPSByZS0+bmFtZXNbMC4uc2l6ZS0xXTsKKworICAgIHJlLT5ybmRfdmFsdWVzID0gcmUtPnJuZF92YWx1ZXNbMC4uc2l6ZS0xXTsKKworICAgIHJldHVybiByZTsKK30KKworLy8ga2V5PT0wIHNpZ25pZmllcyB0aGUgZ2xvYmFsIGtleQorcHVibGljIHZhcmFyZ3Mgdm9pZCBDcmVhdGVSYW5kb21FdmVudChzdHJpbmcga2V5LCBpbnQgKnJuZF92YWwsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgKnJuZF9uYW1lcywgaW50IHJlZCkKK3sKKyAgc3RydWN0IHJhbmRvbV9ldmVudF9zIHJlID0gKDxyYW5kb21fZXZlbnRfcz4pOworICAKKyAgaWYgKCFtZW1iZXIocmFuZG9tRXZlbnRzLGtleSkpIHsKKyAgICByZS0+cm5kX3ZhbHVlcyA9IGNvcHkocm5kX3ZhbCkgfHwgREZMVF9STkRfVkFMVUVTOworICAgIC8vIHdlbm4gcm5kX3ZhbCA9PSAwIGlzdCwgaXN0IGRhcyBPSywgZGFubiB3aXJkIHNwYWV0ZXIgaW1tZXIKKyAgICAvLyBERkxUX1JORF9WQUxVRVMgZ2Vub21tZW4uCisgICAgcmUtPmRlZmF1bHRfcm5kX3ZhbHVlcyA9IGNvcHkocm5kX3ZhbCk7CisgICAgLy8gbmFtZXMgZGFyZiBhdWNoIDAgc2Vpbiwgd2VubiBEZWZhdWx0d2VydGUgZ2Vub21tZW4gd2VyZGVuIHNvbGxlbi4KKyAgICByZS0+bmFtZXMgPSBjb3B5KHJuZF9uYW1lcyk7CisgICAgcmUtPnJlZHVjdGlvbiA9IHJlZCB8fCBSTkRfUkVEVUNUSU9OOworICAgIHJlLT5jcmVhdG9yID0gb2JqZWN0X25hbWUoZXh0ZXJuX2NhbGwoKSA/IHByZXZpb3VzX29iamVjdCgpIDogdGhpc19vYmplY3QoKSk7CisKKyAgICByYW5kb21FdmVudHNba2V5XSA9IFNhbml0aXplUkUocmUpOworICB9Cit9CisKK3B1YmxpYyB2YXJhcmdzIGludCBDaGFuZ2VSYW5kb21FdmVudChzdHJpbmcga2V5LCBpbnQgKnJuZF92YWwsIGludCAqcm5kX3ZhbF9kZmx0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nICpybmRfbmFtZXMsIGludCByZWQpCit7CisgIGlmIChwcm9jZXNzX2NhbGwoKSkgcmV0dXJuIC0xOworICBpZiAoIW1lbWJlcihyYW5kb21FdmVudHMsIGtleSkpIHJldHVybiAtMjsKKyAgc3RydWN0IHJhbmRvbV9ldmVudF9zIHJlID0gcmFuZG9tRXZlbnRzW2tleV07CisgIC8vIFNjaHJlaWJ6dWdyaWZmIGVybGF1YmVuPyBOdXIgZnVlciBFcnNjaGFmZmVyb2JqZWt0ZSB1bmQgRU0uCisgIC8vIEJlbWVya3VuZzogUk0rIGhhYmVuIFp1Z3JpZmYsIHdlaWwgc2llIFNjaHJlaWJ6dWdyaWZmIGF1ZiBkYXMKKyAgLy8gRXJzY2hhZmZlcm9iamVrdCBoYWJlbi4KKyAgaWYgKGV4dGVybl9jYWxsKCkKKyAgICAgICYmIHJlLT5jcmVhdG9yICE9IG9iamVjdF9uYW1lKHByZXZpb3VzX29iamVjdCgpKQorICAgICAgJiYgIUFSQ0hfU0VDVVJJVFkpCisgICAgcmV0dXJuIC0xOworCisgIGlmIChwb2ludGVycChybmRfdmFsKSkKKyAgICByZS0+cm5kX3ZhbHVlcyA9IHJuZF92YWw7CisgIGlmIChwb2ludGVycChybmRfdmFsX2RmbHQpKQorICAgIHJlLT5kZWZhdWx0X3JuZF92YWx1ZXMgPSBybmRfdmFsX2RmbHQ7CisgIGlmIChwb2ludGVycChybmRfbmFtZXMpKQorICAgIHJlLT5uYW1lcyA9IHJuZF9uYW1lczsKKyAgaWYgKHJlZCkKKyAgICByZS0+cmVkdWN0aW9uID0gcmVkOworCisgIFNhbml0aXplUkUocmUpOworCisgIHJldHVybiAxOworfQorCitwdWJsaWMgaW50IERlbGV0ZVJhbmRvbUV2ZW50KHN0cmluZyBrZXkpCit7CisgIGlmIChwcm9jZXNzX2NhbGwoKSkgcmV0dXJuIC0xOworICBpZiAoIW1lbWJlcihyYW5kb21FdmVudHMsIGtleSkpIHJldHVybiAtMjsKKyAgc3RydWN0IHJhbmRvbV9ldmVudF9zIHJlID0gcmFuZG9tRXZlbnRzW2tleV07CisgIC8vIFNjaHJlaWJ6dWdyaWZmIGVybGF1YmVuPyBOdXIgZnVlciBFcnNjaGFmZmVyb2JqZWt0ZSB1bmQgRU0uCisgIC8vIEJlbWVya3VuZzogUk1zIGhhYmVuIFp1Z3JpZmYsIHdlaWwgc2llIFNjaHJlaWJ6dWdyaWZmIGF1ZiBkYXMKKyAgLy8gRXJzY2hhZmZlcm9iamVrdCBoYWJlbi4KKyAgaWYgKGV4dGVybl9jYWxsKCkKKyAgICAgICYmIHJlLT5jcmVhdG9yICE9IG9iamVjdF9uYW1lKHByZXZpb3VzX29iamVjdCgpKQorICAgICAgJiYgIUFSQ0hfU0VDVVJJVFkpCisgICAgcmV0dXJuIC0xOworCisgIG1fZGVsZXRlKHJhbmRvbUV2ZW50cywga2V5KTsKKyAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgY3JlYXRlKCkKK3sKKyAgc2V0ZXVpZChnZXR1aWQodGhpc19vYmplY3QoKSkpOworICByZXN0b3JlX29iamVjdChEUk9QU0FWRSk7CisgIGlmKCFyYW5kb21FdmVudHMgfHwgIW1hcHBpbmdwKHJhbmRvbUV2ZW50cykpCisgIHsKKyAgICByYW5kb21FdmVudHMgPSAoW10pOworICB9CisgIGlmICghbWVtYmVyKHJhbmRvbUV2ZW50cywgR0xPQkFMX0tFWSkpCisgICAgQ3JlYXRlUmFuZG9tRXZlbnQoR0xPQkFMX0tFWSwgREZMVF9STkRfVkFMVUVTLCBERkxUX1JORF9OQU1FUywgUk5EX1JFRFVDVElPTik7CisgIHNldF9uZXh0X3Jlc2V0KDM2MDAgKyByYW5kb20oMTA4MDApKTsKK30KKwordm9pZCBzYXZlbWUoKXsKKyAgc2F2ZV9vYmplY3QoRFJPUFNBVkUpOworfQorCit2YXJhcmdzIGludCByZW1vdmUoKQoreworICBzYXZlbWUoKTsKKyAgZGVzdHJ1Y3QoTUUpOworICByZXR1cm4gMTsKK30KKworcHVibGljIHZhcmFyZ3MgaW50IGRyb3BSYXJlKGludCByYXJlbGV2ZWwsIHN0cmluZyBrZXkpIHsKKyAgaWYgKCFtZW1iZXIocmFuZG9tRXZlbnRzLCBrZXkpKQorICAgIHJldHVybiAwOworICAKKyAgc3RydWN0IHJhbmRvbV9ldmVudF9zIHJlID0gcmFuZG9tRXZlbnRzW2tleV07CisgIGlmIChyYXJlbGV2ZWwgPCAwIHx8IHJhcmVsZXZlbCA+PSBzaXplb2YocmUtPnJuZF92YWx1ZXMpKQorICAgIHJldHVybiAwOworICBpZiAocmFuZG9tKHJlLT5ybmRfdmFsdWVzW3JhcmVsZXZlbF0pID09IDApCisgIHsKKyAgICAvLyBEZWZhdWx0d2VydCB3aWVkZXJoZXJzdGVsbGVuLgorICAgIGlmIChwb2ludGVycChyZS0+ZGVmYXVsdF9ybmRfdmFsdWVzKSkKKyAgICAgIHJlLT5ybmRfdmFsdWVzW3JhcmVsZXZlbF0gPSByZS0+ZGVmYXVsdF9ybmRfdmFsdWVzW3JhcmVsZXZlbF07CisgICAgZWxzZQorICAgICAgcmUtPnJuZF92YWx1ZXNbcmFyZWxldmVsXSA9IERGTFRfUk5EX1ZBTFVFU1tyYXJlbGV2ZWxdOworICAgIC8vIHVuZCBkcm9wcGVuLgorICAgIHJldHVybiAxOworICB9CisgIGVsc2UKKyAgeworICAgIC8vIFdhaHJzY2hlaW5saWNoa2VpdCBlcmhvZWhlbiwgaW5kZW0gcm5kX3ZhbHVlcyByZWR1emllcnQgd2lyZC4KKyAgICByZS0+cm5kX3ZhbHVlc1tyYXJlbGV2ZWxdIC09IHJlLT5yZWR1Y3Rpb247CisgICAgLy8gbmVnYXRpdmUgcm5kX3ZhbHVlcyBzaW5kIG9rLCByYW5kb20oKSBpc3QgZGFubiBpbW1lciAwLgorICB9CisgIC8vIGZhbGwtdGhyb3VnaAorICByZXR1cm4gMDsKK30KKworLy8gRHJvcHB0IGdlbmF1IDEgb2RlciAwIEl0ZW1zIGF1cyBkZW0gZ2VnZWJlbmVuIFNldC4gQmVudXR6dCBoaWVyYmVpIGRhcworLy8gbWl0dGVscyA8a2V5PiBkZWZpbmllcnRlIFJhbmRvbWV2ZW50IHVuZCBkZW4genVyIGpld2VpbGlnZW4gSUQgZ2VnZWJlbmVuCisvLyA8cmFyZWxldmVsPi4KKy8vIDxzZXQ+IG11c3MgaW4gZGVyIEZvcm0KKy8vIHsge0lELFJBUkVMRVZFTH0sIHtJRCxSQVJFTEVWRUx9LCAuLi4gfQorLy8gZ2VnZWJlbiB3ZXJkZW4uIDxJRD4gbXVzcyBkYWJlaSAhPSAwIHNlaW4gdW5kIHdpcmQgaW0gRXJmb2xnc2ZhbGwKKy8vIHp1cnVlY2tnZWJlbi4KK21peGVkIGRyb3BTZXRJdGVtKG1peGVkIHNldCwgc3RyaW5nIGtleSkgeworICAKKyAgaWYgKHBvaW50ZXJwKHNldCkpCisgIHsKKyAgICBzZXQ9ZmlsdGVyKHNldCwgZnVuY3Rpb24gaW50IChtaXhlZCBlbCkgeworICAgICAgcmV0dXJuIHBvaW50ZXJwKGVsKSAmJiBzaXplb2YoZWwpPj0yICYmIGludHAoZWxbMV0pOworICAgIH0gKTsKKyAgICBzZXQ9c29ydF9hcnJheShzZXQsIGZ1bmN0aW9uIGludCAobWl4ZWQgYSwgbWl4ZWQgYikgeworICAgICAgcmV0dXJuIGFbMV0+YlsxXTsKKyAgICB9KTsKKyAgICAKKyAgICBmb3JlYWNoKG1peGVkIGVsOiBzZXQpIHsKKyAgICAgIGlmKGRyb3BSYXJlKGVsWzFdLCBrZXkpKXsKKyAgICAgICAgcmV0dXJuIGVsWzBdOworICAgICAgfQorICAgIH0gICAgICAKKyAgfQorICAKKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgcmVzZXQoKQoreworICBzZXRfbmV4dF9yZXNldCgzNjAwKjcyKTsKKyAgLy8gZWluIHdlbmlnIGF1ZnJhZXVtZW4KKworICAvLyBBbGxlIEV2ZW50cyByYXVzd2VyZmVuLCBkZXJlbiBFcnNjaGFmZmVyb2JqZWt0IG5pY2h0IG1laHIgZXhpc2llcnQKKyAgLy8gKE5hY2h0ZWlsOiBuaWNodC1nZWxhZGVuZSBWQy1PYmpla3RlIHdlcmRlbiBuaWNodCBiZXJ1ZWNrc2ljaHRpZ3QpLgorICBmb3JlYWNoKHN0cmluZyBrZXksIHN0cnVjdCByYW5kb21fZXZlbnRfcyByZTogcmFuZG9tRXZlbnRzKSB7CisgICAgaWYgKCFmaW5kX29iamVjdChyZS0+Y3JlYXRvcikKKyAgICAgICAgJiYgZmlsZV9zaXplKHJlLT5jcmVhdG9yICsgIi5jIikgPD0gMCkKKyAgICAgIG1fZGVsZXRlKHJhbmRvbUV2ZW50cywga2V5KTsKKyAgfQorCisgIHNhdmVtZSgpOworfQorCmRpZmYgLS1naXQgYS9zZWN1cmUvZHJvcG1hc3Rlci5oIGIvc2VjdXJlL2Ryb3BtYXN0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWIyYmZmCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL2Ryb3BtYXN0ZXIuaApAQCAtMCwwICsxLDI4IEBACisjaWZuZGVmIF9EUk9QTUFTVEVSXworI2RlZmluZSBfRFJPUE1BU1RFUl8KKworLy8gcGF0aCB0byBkcm9wbWFzdGVyCisjZGVmaW5lIERST1BNQVNURVIgIi9zZWN1cmUvZHJvcG1hc3RlciIKKyNkZWZpbmUgRFJPUFNBVkUgIi9zZWN1cmUvQVJDSC9EUk9QTUFTVEVSIgorCisvLyByYXJlbGV2ZWxzCisjZGVmaW5lIENPTU1PTgkJCQkJICAgICAgMAorI2RlZmluZSBVTkNPTU1PTgkJCQkgICAgICAxCisjZGVmaW5lIFJBUkUJCQkJCSAgICAgICAgMgorI2RlZmluZSBWRVJZX1JBUkUJCQkJICAgICAgMworI2RlZmluZSBVTFRSQV9SQVJFCQkJCSAgICA0CisjZGVmaW5lIFJBVEhFUl9OT1RfUFJPQkFCTEUJCTUKKyNkZWZpbmUgREZMVF9STkRfTkFNRVMJKHsiZ2V3b2VobmxpY2giLCJ1bmdld29laG5saWNoIixcCisgICAgICAgICAgICAgICAgICAgICAgICAgICJzZWx0ZW4iLCJzZWhyIHNlbHRlbiIsImF1c3Nlcmdld29laG5saWNoIHNlbHRlbiIsXAorICAgICAgICAgICAgICAgICAgICAgICAgICAicHJha3Rpc2NoIG5pZSJ9KQorCisjaWYgZGVmaW5lZChfTkVFRF9EUk9QTUFTVEVSX0lNUExFTUVOVEFUSU9OXykgJiYgIWRlZmluZWQoX0RST1BNQVNURVJfSU1QTEVNRU5UQVRJT05fKQorI2RlZmluZSBfRFJPUE1BU1RFUl9JTVBMRU1FTlRBVElPTl8KKy8vIHJhbmRvbSBoZWxwZXIKKyNkZWZpbmUgR0xPQkFMX0tFWQkwCisjZGVmaW5lIERGTFRfUk5EX1ZBTFVFUyAgKHsxMDAsMTAwMCwxMDAwMCwxMDAwMDAsMjAwMDAwLDEwMDAwMDB9KQorI2RlZmluZSBSTkRfUkVEVUNUSU9OCTEwCisKKyNlbmRpZiAvLyBfRFJPUE1BU1RFUl9JTVBMRU1FTlRBVElPTl8KKworI2VuZGlmIC8vIF9EUk9QTUFTVEVSXwpkaWZmIC0tZ2l0IGEvc2VjdXJlL2Vycm9yZC1zdHJ1Y3RzLmMgYi9zZWN1cmUvZXJyb3JkLXN0cnVjdHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODVkYTk5Ci0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL2Vycm9yZC1zdHJ1Y3RzLmMKQEAgLTAsMCArMSw2MiBAQAorI3ByYWdtYSBzdHJvbmdfdHlwZXMscnR0X2NoZWNrcyxzYXZlX3R5cGVzCisKK3N0cnVjdCBmcmFtZV9zIHsKKyAgaW50ICAgIGlkOworICBpbnQgICAgdHlwZTsKKyAgc3RyaW5nIG5hbWU7CisgIHN0cmluZyBwcm9nOworICBzdHJpbmcgb2JqOworICBpbnQgICAgbG9jOworICBpbnQgICAgdGlja3M7Cit9OworCitzdHJ1Y3Qgbm90ZV9zIHsKKyAgaW50ICAgIGlkOworICBpbnQgICAgdGltZTsKKyAgc3RyaW5nIHVzZXI7CisgIHN0cmluZyB0eHQ7Cit9OworCitzdHJ1Y3QgYmFzZV9pc3N1ZV9zIHsKKyAgaW50ICAgIGlkOworICBzdHJpbmcgaGFzaGtleTsKKyAgc3RyaW5nIHVpZDsKKyAgaW50ICAgIHR5cGU7CisgIGludCAgICBtdGltZTsKKyAgaW50ICAgIGN0aW1lOworICBpbnQgICAgYXRpbWU7CisgIGludCAgICBjb3VudDsKKyAgaW50ICAgIGRlbGV0ZWQ7CisgIGludCAgICByZXNvbHZlZDsKKyAgaW50ICAgIGxvY2tlZDsKKyAgc3RyaW5nIGxvY2tlZF9ieTsKKyAgaW50ICAgIGxvY2tlZF90aW1lOworICBzdHJpbmcgcmVzb2x2ZXI7CisgIHN0cmluZyBtZXNzYWdlOworICBzdHJpbmcgbG9hZG5hbWU7Cit9OworCitzdHJ1Y3QgY3Rpc3N1ZV9zIChiYXNlX2lzc3VlX3MpIHsKK307CisKK3N0cnVjdCB1c2VyaXNzdWVfcyAoY3Rpc3N1ZV9zKSB7CisgIHN0cmluZyBvYmo7CisgIHN0cmluZyBwcm9nOworICBpbnQgICAgbG9jOworICBzdHJpbmcgdGl0cDsKKyAgc3RyaW5nIHRpZW52OworfTsKKworc3RydWN0IHJ0aXNzdWVfcyAodXNlcmlzc3VlX3MpIHsKKyAgc3RyaW5nIGhib2JqOworICBpbnQgICAgY2F1Z2h0OworICBzdHJpbmcgY29tbWFuZDsKKyAgc3RyaW5nIHZlcmI7Cit9OworCisvLyBhbGwgcG9zc2libGUgZGF0YSBpbmNsdWRpbmcgc3RhY2sgdHJhY2UgYW5kIG5vdGVzLgorc3RydWN0IGZ1bGxpc3N1ZV9zIChydGlzc3VlX3MpIHsKKyAgbWl4ZWQgKiBub3RlczsgLy9zdHJ1Y3Qgbm90ZV9zICoKKyAgbWl4ZWQgKiBzdGFjazsgLy9zdHJ1Y3QgZnJhbWVfcyAqCit9OworCmRpZmYgLS1naXQgYS9zZWN1cmUvZXJyb3JkLmMgYi9zZWN1cmUvZXJyb3JkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM5YzRlOAotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9lcnJvcmQuYwpAQCAtMCwwICsxLDE0ODIgQEAKKy8qICBNb3JnZW5HcmF1ZW4gTVVEbGliCisgICAgL3AvZGFlbW9uL2Vycm9yZC5jCisgICAgc3BlaWNoZXJ0IEZlaGxlciB1bmQgV2FybnVuZ2VuCisgICAgQXV0b3I6IFplc3N0cmEKKyAgICAkSWQ6IGVycm9yZC5jIDk0MzkgMjAxNi0wMS0yMCAwOTo0ODoyOFogWmVzc3RyYSAkCisgICAgZ2dmLiBDaGFuZ2Vsb2c6CisqLworCisjcHJhZ21hIHN0cmljdF90eXBlcyxzYXZlX3R5cGVzLHJ0dF9jaGVja3MKKyNwcmFnbWEgbm9fY2xvbmUKKyNwcmFnbWEgbm9fc2hhZG93CisjcHJhZ21hIG5vX2luaGVyaXQKKyNwcmFnbWEgcGVkYW50aWMKKyNwcmFnbWEgcmFuZ2VfY2hlY2sKKyNwcmFnbWEgd2Fybl9kZXByZWNhdGVkCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKyNpbmNsdWRlIDxkZWZpbmVzLmg+CisjaW5jbHVkZSA8ZGVidWdfaW5mby5oPgorI2luY2x1ZGUgPGNvbW1hbmRzLmg+CisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisjaW5jbHVkZSA8bWFpbC5oPgorI2luY2x1ZGUgPHRscy5oPgorI2luY2x1ZGUgPGV2ZW50cy5oPgorCitpbmhlcml0ICIvc2VjdXJlL2Vycm9yZC1zdHJ1Y3RzIjsKKworI2RlZmluZSBfX05FRURfSU1QTEVNRU5UQVRJT05fXworI2luY2x1ZGUgImVycm9yZC5oIgorI3VuZGVmIF9fTkVFRF9JTVBMRU1FTlRBVElPTl9fCisKKyNkZWZpbmUgU0FWRUZJTEUgIChfX0RJUl9fKyJBUkNIL2Vycm9yZCIpCisKKyNkZWZpbmUgVEkgdGhpc19pbnRlcmFjdGl2ZSgpCisKK3ByaXZhdGUgaW50ICAgICAgIGFjY2Vzc19jaGVjayhzdHJpbmcgdWlkLGludCBtb2RlKTsKK3ByaXZhdGUgdmFyYXJncyBpbnQgc2V0X2xvY2soaW50IGlzc3VlaWQsIGludCBsb2NrLCBzdHJpbmcgbm90ZSk7Citwcml2YXRlIHZhcmFyZ3MgaW50IHNldF9yZXNvbHV0aW9uKGludCBpc3N1ZWlkLCBpbnQgcmVzb2x1dGlvbiwgc3RyaW5nIG5vdGUpOworCitwcml2YXRlIGludCB2ZXJzZW5kZV9tYWlsKHN0cnVjdCBmdWxsaXNzdWVfcyBmZWhsZXIpOworCitub3NhdmUgbWFwcGluZyBsYXN0ZXJyb3I7ICAgLy8gZGllIGxldHplbiA1IGplZGVyIEFydC4KKworCisvKiAqKioqKioqKioqKioqKioqKioqIEhlbGZlciAqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK3B1YmxpYyBpbnQgZ2V0RXJyb3JJRChzdHJpbmcgaGFzaGtleSkKK3sKKyAgaW50Kiogcm93PXNsX2V4ZWMoIlNFTEVDVCBpZCBmcm9tIGlzc3VlcyBXSEVSRSBoYXNoa2V5PT8xOyIsCisgICAgICAgICAgICAgICAgICAgIGhhc2hrZXkpOworICAvL0RFQlVHKHNwcmludGYoImdldEVJRDogJXM6ICVPXG4iLGhhc2hrZXkscm93KSk7CisgIGlmIChwb2ludGVycChyb3cpKQorICB7CisgICAgcmV0dXJuIHJvd1swXVswXTsKKyAgfQorICByZXR1cm4gLTE7Cit9CisKKy8vIG5vdGUtPmlkIG11c3MgYXVmIGVpbmVuIEVpbnRyYWcgaW4gaXNzdWVzIHZlcndlaXNlbiwgZXMgZXJmb2xndCBrZWluZQorLy8gUHJ1ZWZ1bmcuCitpbnQgZGJfYWRkX25vdGUoc3RydWN0IG5vdGVfcyBub3RlKQoreworICBzbF9leGVjKCJJTlNFUlQgSU5UTyBub3Rlcyhpc3N1ZWlkLHRpbWUsdXNlcix0eHQpICIKKyAgICAgICAgICAiVkFMVUVTKD8xLD8yLD8zLD80KTsiLAorICAgICAgICAgIHRvX2FycmF5KG5vdGUpLi4uKTsKKyAgcmV0dXJuIHNsX2luc2VydF9pZCgpOworfQorCitwcml2YXRlIHN0cnVjdCBmcmFtZV9zKiBkYl9nZXRfc3RhY2soaW50IGlzc3VlaWQpCit7CisgIG1peGVkIHJvd3MgPSBzbF9leGVjKCJTRUxFQ1QgKiBGUk9NIHN0YWNrdHJhY2VzIFdIRVJFIGlzc3VlaWQ9PzEgIgorICAgICAgICAgICAgICAgICAgICAgICAiT1JERVIgQlkgcm93aWQ7IiwgaXNzdWVpZCk7CisgIGlmIChwb2ludGVycChyb3dzKSkKKyAgeworICAgIHN0cnVjdCBmcmFtZV9zKiBzdGFjayA9IGFsbG9jYXRlKHNpemVvZihyb3dzKSk7CisgICAgaW50IGk7CisgICAgZm9yZWFjaChtaXhlZCByb3cgOiByb3dzKQorICAgIHsKKyAgICAgIHN0YWNrW2ldID0gdG9fc3RydWN0KHJvdywgKDxmcmFtZV9zPikpOworICAgICAgKytpOworICAgIH0KKyAgICByZXR1cm4gc3RhY2s7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK3ByaXZhdGUgc3RydWN0IG5vdGVfcyogZGJfZ2V0X25vdGVzKGludCBpc3N1ZWlkKQoreworICBtaXhlZCByb3dzID0gc2xfZXhlYygiU0VMRUNUICogRlJPTSBub3RlcyBXSEVSRSBpc3N1ZWlkPT8xICIKKyAgICAgICAgICAgICAgICAgICAgICAgIk9SREVSIEJZIHJvd2lkOyIsIGlzc3VlaWQpOworICBpZiAocG9pbnRlcnAocm93cykpCisgIHsKKyAgICBzdHJ1Y3Qgbm90ZV9zKiBub3RlcyA9IGFsbG9jYXRlKHNpemVvZihyb3dzKSk7CisgICAgaW50IGk7CisgICAgZm9yZWFjaChtaXhlZCByb3cgOiByb3dzKQorICAgIHsKKyAgICAgIG5vdGVzW2ldID0gdG9fc3RydWN0KHJvdywgKDxub3RlX3M+KSk7CisgICAgICArK2k7CisgICAgfQorICAgIHJldHVybiBub3RlczsKKyAgfQorICByZXR1cm4gMDsKK30KKworLy8gZWluZW4gZHVyY2ggaWQgb2RlciBoYXNoa2V5IGJlemVpY2huZXRlbiBFaW50cmFnIGFscyBmdWxsaXNzdWVfcyBsaWVmZXJuLgorcHJpdmF0ZSBzdHJ1Y3QgZnVsbGlzc3VlX3MgZGJfZ2V0X2lzc3VlKGludCBpc3N1ZWlkLCBzdHJpbmcgaGFzaGtleSkKK3sKKyAgbWl4ZWQgcm93cyA9IHNsX2V4ZWMoIlNFTEVDVCAqIEZST00gaXNzdWVzIFdIRVJFIGlkPT8xIE9SIGhhc2hrZXk9PzI7IiwKKyAgICAgICAgICAgICAgICAgICAgICAgaXNzdWVpZCwgaGFzaGtleSk7CisgIGlmIChwb2ludGVycChyb3dzKSkKKyAgeworICAgIC8vIEVpbmZhY2hzdGVyIFdlZyAtIGZ1bmt0aW9uaWVydCBhYmVyIG51ciwgc29sYW5nZSBkaWUgRmVsZGVyIGluIGRlciBEQgorICAgIC8vIGRpZSBnbGVpY2hlIFJlaWhlbmZvbGdlIHdpZSBpbiBkZXIgc3RydWN0IGhhYmVuISBFbnR3ZWRlciBpbW1lcgorICAgIC8vIHNpY2hlcnN0ZWxsZW4gb2RlciBFcmdlYm5pc3JlaWhlbmZvbGdlIG9iZW4gaW0gc2VsZWN0IGZlc3RsZWdlbiEKKyAgICBzdHJ1Y3QgZnVsbGlzc3VlX3MgaXNzdWUgPSB0b19zdHJ1Y3QoIHJvd3NbMF0sICg8ZnVsbGlzc3VlX3M+KSApOworICAgIGlmIChpc3N1ZS0+dHlwZSA9PSBUX1JURVJST1IpCisgICAgICAgIGlzc3VlLT5zdGFjayA9IGRiX2dldF9zdGFjayhpc3N1ZS0+aWQpOworICAgIGlzc3VlLT5ub3RlcyA9IGRiX2dldF9ub3Rlcyhpc3N1ZS0+aWQpOworICAgIHJldHVybiBpc3N1ZTsKKyAgfQorICByZXR1cm4gMDsKK30KKworcHJpdmF0ZSBzdHJ1Y3QgZnVsbGlzc3VlX3MgZmlsdGVyX3ByaXZhdGUoc3RydWN0IGZ1bGxpc3N1ZV9zIGlzc3VlKQoreworICAgIC8vbW9tZW50YW4gd2lyZCBGX0NMSSwgYWxzbyBkaWUgU3BpZWxlcmVpbmdhYmUgdm9yIGRlbSBGZWhsZXIKKyAgICAvL2F1c2dlZmlsdGVydCwgd2VubiBUSSBrZWluIEVNIG9kZXIgbWFuIGluIHByb2Nlc3Nfc3RyaW5nKCkgaXN0LgorCisgICAgLy9XZW5uIEVNIHVuZCBuaWNodCBpbiBwcm9jZXNzX3N0cmluZygpIG9kZXIgZGllIFNwaWVsZXJlaW5nYWJlIGdhciBuaWNodAorICAgIC8vaW0gRmVobGVyZWludHJhZyBkcmluc3RlaHQ6IHVuZ2VmaWx0ZXJ0IHp1cnVlY2sKKyAgICBpZiAoIWlzc3VlLT5jb21tYW5kIHx8CisgICAgICAgICghcHJvY2Vzc19jYWxsKCkgJiYgQVJDSF9TRUNVUklUWSkgKQorICAgICAgICByZXR1cm4gaXNzdWU7CisKKyAgICAvL3NvbnN0IEZfQ0xJIHJhdXNmaWx0ZXJuLCBhbHNvIEtvcGllIHVuZCBpbiBkZXIgS29waWUgYWVuZGVybi4KKyAgICBpc3N1ZS0+Y29tbWFuZD0iQml0dGUgRU0gZnJhZ2VuIjsKKyAgICByZXR1cm4gaXNzdWU7Cit9CisKKy8vIHNldHp0IG9kZXIgbG9lc2NodCBkaWUgTG9lc2Noc3BlcnJlLgorLy8gUHJ1ZWZ0LCBvYiA8aXNzdWVpZD4gZXhpc3RpZXJ0IHVuZCBhZW5kZXJ0IGRlbiBadXN0YW5kIG51ciwgd2VubiBub2V0aWcuCisvLyBSdWVja2dhYmU6IC0xLCB3ZW5uIElzc3VlIG5pY2h0IGV4aXN0aWVydCwgLTIgd2VubiBiZXJlaXRzIHJlc29sdmVkLCAtMworLy8gICAgICAgICAgICB3ZW5uIGtlaW5lIEFlbmRlcnVuZyBub2V0aWcsIHNvbnN0IGRlbiBuZXVlbiBTcGVycnp1c3RhbmQKK2ludCBkYl9zZXRfbG9jayhpbnQgaXNzdWVpZCwgaW50IGxvY2tzdGF0ZSwgc3RyaW5nIG5vdGUpCit7CisgIGludCoqIHJvd3MgPSBzbF9leGVjKCJTRUxFQ1QgbG9ja2VkLHJlc29sdmVkIEZST00gaXNzdWVzIFdIRVJFIGlkPT8xOyIsCisgICAgICAgICAgICAgICAgICAgICAgIGlzc3VlaWQpOworICBpZiAoIXJvd3MpCisgICAgcmV0dXJuIC0xOyAgLy8gbmljaHQgdm9yaGFuZGVuLgorCisgIGlmIChyb3dzWzBdWzFdKQorICAgICAgcmV0dXJuIC0yOyAvLyBiZXJlaXRzIHJlc29sdmVkIC0+IFNwZXJyZSBuaWNodCBtb2VnbGljaC4KKworCisgIGlmIChsb2Nrc3RhdGUgJiYgIXJvd3NbMF1bMF0pCisgIHsKKyAgICAvLyBTcGVycmVuCisvLyAgICBzbF9leGVjKCJCRUdJTiBUUkFOU0FDVElPTjsiKTsKKyAgICBzbF9leGVjKCJVUERBVEUgaXNzdWVzIFNFVCBsb2NrZWQ9MSxsb2NrZWRfYnk9PzIsbG9ja2VkX3RpbWU9PzMsbXRpbWU9PzMgIgorICAgICAgICAgICAgIldIRVJFIGlkPT8xOyIsCisgICAgICAgICAgICBpc3N1ZWlkLCBnZXR1aWQoVEkpLCB0aW1lKCkpOworICAgIGRiX2FkZF9ub3RlKCAoPG5vdGVfcz4gaWQ6IGlzc3VlaWQsIHRpbWU6IHRpbWUoKSwgdXNlcjogZ2V0dWlkKFRJKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHR4dDogc3ByaW50ZigiTG9jayBnZXNldHp0OiAlcyIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGUgPyBub3RlIDogIjxrZWluIEtvbW1lbnRhcj4iKSkgKTsKKy8vICAgIHNsX2V4ZWMoIkNPTU1JVDsiKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBlbHNlIGlmICghbG9ja3N0YXRlICYmIHJvd3NbMF1bMF0pCisgIHsKKyAgICAvLyBlbnRzcGVycmVuCisvLyAgICBzbF9leGVjKCJCRUdJTiBUUkFOU0FDVElPTjsiKTsKKyAgICBzbF9leGVjKCJVUERBVEUgaXNzdWVzIFNFVCBsb2NrZWQ9MCxsb2NrZWRfYnk9MCxsb2NrZWRfdGltZT0wLG10aW1lPT8yICIKKyAgICAgICAgICAgICJXSEVSRSBpZD0/MTsiLCBpc3N1ZWlkLCB0aW1lKCkpOworICAgIGRiX2FkZF9ub3RlKCAoPG5vdGVfcz4gaWQ6IGlzc3VlaWQsIHRpbWU6IHRpbWUoKSwgdXNlcjogZ2V0dWlkKFRJKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHR4dDogc3ByaW50ZigiTG9jayBnZWxvZXNjaHQ6ICVzIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90ZSA/IG5vdGUgOiAiPGtlaW4gS29tbWVudGFyPiIpKSApOworLy8gICAgc2xfZXhlYygiQ09NTUlUOyIpOworICAgIHJldHVybiAwOworICB9CisgIC8vIG5peCBhZW5kZXJuLgorICByZXR1cm4gLTM7Cit9CisKKy8vIG1hcmtpZXJ0IGVpbiBJc3N1ZSBhbHMgZ2VmaXh0IG9kZXIgbmljaHQgZ2VmaXh0LgorLy8gUHJ1ZWZ0LCBvYiA8aXNzdWVpZD4gZXhpc3RpZXJ0IHVuZCBhZW5kZXJ0IGRlbiBadXN0YW5kIG51ciwgd2VubiBub2V0aWcuCisvLyBSdWVja2dhYmU6IC0xLCB3ZW5uIElzc3VlIG5pY2h0IGV4aXN0aWVydCwgLTMgd2VubiBrZWluZSBBZW5kZXJ1bmcgbm9ldGlnLAorLy8gICAgICAgICAgICBzb25zdCBkZW4gbmV1ZW4gU3BlcnJ6dXN0YW5kCitpbnQgZGJfc2V0X3Jlc29sdXRpb24oaW50IGlzc3VlaWQsIGludCByZXNvbHZlZCwgc3RyaW5nIG5vdGUpCit7CisgIGludCoqIHJvd3MgPSBzbF9leGVjKCJTRUxFQ1QgcmVzb2x2ZWQgRlJPTSBpc3N1ZXMgV0hFUkUgaWQ9PzE7IiwKKyAgICAgICAgICAgICAgICAgICAgICAgaXNzdWVpZCk7CisgIGlmICghcm93cykKKyAgICByZXR1cm4gLTE7ICAvLyBuaWNodCB2b3JoYW5kZW4uCisKKyAgaWYgKHJlc29sdmVkICYmICFyb3dzWzBdWzBdKQorICB7CisgICAgLy8gQWxzIGdlZml4dCBtYXJraWVyZW4uCisvLyAgICBzbF9leGVjKCJCRUdJTiBUUkFOU0FDVElPTjsiKTsKKyAgICBzbF9leGVjKCJVUERBVEUgaXNzdWVzIFNFVCByZXNvbHZlZD0xLHJlc29sdmVyPT8yLG10aW1lPT8zICIKKyAgICAgICAgICAgICJXSEVSRSBpZD0/MTsiLAorICAgICAgICAgICAgaXNzdWVpZCwgZ2V0dWlkKFRJKSx0aW1lKCkpOworICAgIGRiX2FkZF9ub3RlKCAoPG5vdGVfcz4gaWQ6IGlzc3VlaWQsIHRpbWU6IHRpbWUoKSwgdXNlcjogZ2V0dWlkKFRJKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHR4dDogc3ByaW50ZigiRmVobGVyIGdlZml4dDogJXMiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RlID8gbm90ZSA6ICI8a2VpbiBLb21tZW50YXI+IikpICk7CisvLyAgICBzbF9leGVjKCJDT01NSVQ7Iik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgZWxzZSBpZiAoIXJlc29sdmVkICYmIHJvd3NbMF1bMF0pCisgIHsKKyAgICAvLyBhbHMgbmljaHQgZ2VmaXh0IG1hcmtpZXJlbi4KKy8vICAgIHNsX2V4ZWMoIkJFR0lOIFRSQU5TQUNUSU9OOyIpOworICAgIHNsX2V4ZWMoIlVQREFURSBpc3N1ZXMgU0VUIHJlc29sdmVkPTAscmVzb2x2ZXI9MCxtdGltZT0/MiAiCisgICAgICAgICAgICAiV0hFUkUgaWQ9PzE7IiwgaXNzdWVpZCwgdGltZSgpKTsKKyAgICBkYl9hZGRfbm90ZSggKDxub3RlX3M+IGlkOiBpc3N1ZWlkLCB0aW1lOiB0aW1lKCksIHVzZXI6IGdldHVpZChUSSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0eHQ6IHNwcmludGYoIkZpeCB6dXJ1ZWNrZ2V6b2dlbjogJXMiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RlID8gbm90ZSA6ICI8a2VpbiBLb21tZW50YXI+IikpICk7CisvLyAgICBzbF9leGVjKCJDT01NSVQ7Iik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgLy8gbml4IGFlbmRlcm4uCisgIHJldHVybiAtMzsKKworfQorCisvLyBUcmFuc2ZlcmllcnQgZWluIElzc3VlIHp1IGVpbmVyIG5ldWVuIHp1c3RhZW5kaWdlbiBVSUQKKy8vIFBydWVmdCwgb2IgPGlzc3VlaWQ+IGV4aXN0aWVydCB1bmQgYWVuZGVydCBkZW4gWnVzdGFuZCBudXIsIHdlbm4gbm9ldGlnLgorLy8gUnVlY2tnYWJlOiAtMSwgd2VubiBJc3N1ZSBuaWNodCBleGlzdGllcnQsIC0zIHdlbm4ga2VpbmUgQWVuZGVydW5nIG5vZXRpZywKKy8vICAgICAgICAgICAgMSwgd2VubiBlcmZvbGdyZWljaCBuZXUgenVnZXdpZXNlbgoraW50IGRiX3JlYXNzaWduX2lzc3VlKGludCBpc3N1ZWlkLCBzdHJpbmcgbmV3dWlkLCBzdHJpbmcgbm90ZSkKK3sKKyAgc3RyaW5nKiogcm93cyA9IHNsX2V4ZWMoIlNFTEVDVCB1aWQgRlJPTSBpc3N1ZXMgV0hFUkUgaWQ9PzE7IiwKKyAgICAgICAgICAgICAgICAgICAgICAgaXNzdWVpZCk7CisgIGlmICghcm93cykKKyAgICByZXR1cm4gLTE7ICAvLyBuaWNodCB2b3JoYW5kZW4uCisKKyAgaWYgKCFzdHJpbmdwKG5ld3VpZCkpCisgICAgcmV0dXJuKC0yKTsKKworICBpZiAobmV3dWlkICE9IHJvd3NbMF1bMF0pCisgIHsKKy8vICAgIHNsX2V4ZWMoIkJFR0lOIFRSQU5TQUNUSU9OOyIpOworICAgIHNsX2V4ZWMoIlVQREFURSBpc3N1ZXMgU0VUIHVpZD0/MixtdGltZT0/MyBXSEVSRSBpZD0/MTsiLAorICAgICAgICAgICAgaXNzdWVpZCwgbmV3dWlkLHRpbWUoKSk7CisgICAgZGJfYWRkX25vdGUoICg8bm90ZV9zPiBpZDogaXNzdWVpZCwgdGltZTogdGltZSgpLCB1c2VyOiBnZXR1aWQoVEkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdHh0OiBzcHJpbnRmKCJGZWhsZXIgdm9uICVzIGFuICVzIHVlYmVydHJhZ2VuLiAoJXMpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dzWzBdWzBdLCBuZXd1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90ZSA/IG5vdGUgOiAiPGtlaW4gS29tbWVudGFyPiIpKSApOworLy8gICAgc2xfZXhlYygiQ09NTUlUOyIpOworICAgIHJldHVybiAxOworICB9CisKKyAgcmV0dXJuIC0zOworfQorCisvLyBpbmtyZW1lbnRpZXJ0IGNvdW50IHVuZCBha3R1YWxpc2llcnQgbXRpbWUsIGF0aW1lLgorLy8gQXVzc2VyZGVtIHdpcmQgZ2dmLiBkYXMgTG9lc2NoZmxhZyBnZW51bGx0IC0gZWluIGVybmV1dCBhdWZnZXRyZXRlbmVyCisvLyBGZWhsZXIgc29sbHRlIGFuc2NobGllc3NlbmQgbmljaHQgbWVociBnZWxvZXNjaHQgc2Vpbi4gR2Vsb2VzdGUKKy8vIChyZXNvbHZlZCkgRWludHJhZWdlIHdlcmRlbiBOSUNIVCBhdWYgdW5nZWxvZXN0IGdlc2V0enQuIFZlcm11dGxpY2ggdHJhdAorLy8gZGVyIEZlaGxlciBpbiBlaW5lbSBhbHRlbiBPYmpla3RlIGF1Zi4uLgorLy8gSXNzdWUgbXVzcyBpbiBkZXIgREIgZXhpc3RpZXJlbi4KK2ludCBkYl9jb3VudHVwX2lzc3VlKGludCBpc3N1ZWlkKQoreworICBzbF9leGVjKCJVUERBVEUgaXNzdWVzIFNFVCBjb3VudD1jb3VudCsxLG10aW1lPT8yLGF0aW1lPT8yLGRlbGV0ZWQ9MCBXSEVSRSBpZD0/MTsiLAorICAgICAgICAgIGlzc3VlaWQsdGltZSgpKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vIERhcyBJc3N1ZSB3aXJkIGdnZi4gZW50LWxvZXNjaHQgdW5kIGFscyBuaWNodCByZXN2b2x2ZWQgbWFya2llcnQuCisvLyBTaW5kIHBsIHVuZCBtc2cgIT0gMCwgd2lyZCBlaW5lIE5vdGl6IGFuZ2VoYWVuZ3QuCisvLyBha3R1YWxpc2llcnQgbXRpbWUsIGF0aW1lLgorLy8gSXNzdWUgbXVzcyBpbiBkZXIgREIgZXhpc3RpZXJlbi4KK2ludCBkYl9yZW9wZW5faXNzdWUoaW50IGlzc3VlaWQsIHN0cmluZyBwbCwgc3RyaW5nIG1zZykKK3sKKyAgaW50Kiogcm93PXNsX2V4ZWMoIlNFTEVDVCBkZWxldGVkLHJlc29sdmVkIGZyb20gaXNzdWVzIFdIRVJFIGlkPT8xOyIsCisgICAgICAgICAgICAgICAgICAgIGlzc3VlaWQpOworICBpZiAocG9pbnRlcnAocm93KQorICAgICAgJiYgKHJvd1swXVswXSB8fCByb3dbMF1bMV0pICkKKyAgeworLy8gICAgc2xfZXhlYygiQkVHSU4gVFJBTlNBQ1RJT047Iik7CisgICAgaWYgKHBsICYmIG1zZykKKyAgICB7CisgICAgICBkYl9hZGRfbm90ZSggKDxub3RlX3M+IGlkOiBpc3N1ZWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lOiB0aW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXI6IHBsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eHQ6IG1zZykgKTsKKyAgICB9CisgICAgc2xfZXhlYygiVVBEQVRFIGlzc3VlcyBTRVQgIgorICAgICAgICAiZGVsZXRlZD0wLHJlc29sdmVkPTAscmVzb2x2ZXI9MCxtdGltZT0/MixhdGltZT0/MiBXSEVSRSBpZD0/MTsiLAorICAgICAgICBpc3N1ZWlkLHRpbWUoKSk7CisvLyAgICBzbF9leGVjKCJDT01NSVQ7Iik7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK2ludCBkYl9pbnNlcnRfaXNzdWUoc3RydWN0IGZ1bGxpc3N1ZV9zIGlzc3VlKQoreworICAvL0RFQlVHKHNwcmludGYoImRiX2luc2VydDogJU9cbiIsIGlzc3VlKSk7CisKKyAgbWl4ZWQgcm93PXNsX2V4ZWMoIlNFTEVDVCBpZCBmcm9tIGlzc3VlcyBXSEVSRSBoYXNoa2V5PT8xOyIsCisgICAgICAgICAgICAgICAgICAgIGlzc3VlLT5oYXNoa2V5KTsKKyAgLy9ERUJVRyhzcHJpbnRmKCJpbnNlcnQ6ICVzOiAlT1xuIixpc3N1ZS0+aGFzaGtleSxyb3cpKTsKKyAgaWYgKHBvaW50ZXJwKHJvdykpCisgIHsKKyAgICBpc3N1ZS0+aWQ9cm93WzBdWzBdOworICAgIHJldHVybiBkYl9jb3VudHVwX2lzc3VlKGlzc3VlLT5pZCk7CisgIH0KKy8vICBzbF9leGVjKCJCRUdJTiBUUkFOU0FDVElPTjsiKTsKKyAgc2xfZXhlYygiSU5TRVJUIElOVE8gaXNzdWVzKGhhc2hrZXksdWlkLHR5cGUsbXRpbWUsY3RpbWUsYXRpbWUsY291bnQsIgorICAgICAgICAgICJkZWxldGVkLHJlc29sdmVkLGxvY2tlZCxsb2NrZWRfYnksbG9ja2VkX3RpbWUscmVzb2x2ZXIsbWVzc2FnZSwiCisgICAgICAgICAgImxvYWRuYW1lLG9iaixwcm9nLGxvYyx0aXRwLHRpZW52LGhib2JqLGNhdWdodCxjb21tYW5kLHZlcmIpICIKKyAgICAgICAgICAiVkFMVUVTKD8xLD8yLD8zLD80LD81LD82LD83LD84LD85LD8xMCw/MTEsPzEyLD8xMyw/MTQsPzE1LCIKKyAgICAgICAgICAiPzE2LD8xNyw/MTgsPzE5LD8yMCw/MjEsPzIyLD8yMyw/MjQpOyIsCisgICAgICAgICAgKHRvX2FycmF5KGlzc3VlKVsxLi4yNF0pLi4uKTsgCisgIGlzc3VlLT5pZD1zbF9pbnNlcnRfaWQoKTsKKworICBpZiAocG9pbnRlcnAoaXNzdWUtPnN0YWNrKSkKKyAgeworICAgIGZvcmVhY2goc3RydWN0IGZyYW1lX3MgZW50cnkgOiBpc3N1ZS0+c3RhY2spCisgICAgeworICAgICAgZW50cnktPmlkID0gaXNzdWUtPmlkOworICAgICAgc2xfZXhlYygiSU5TRVJUIElOVE8gc3RhY2t0cmFjZXMoaXNzdWVpZCx0eXBlLG5hbWUscHJvZyxvYmosbG9jLHRpY2tzKSAiCisgICAgICAgICAgICAgICJWQUxVRVMoPzEsPzIsPzMsPzQsPzUsPzYsPzcpOyIsCisgICAgICAgICAgICAgIHRvX2FycmF5KGVudHJ5KS4uLik7CisgICAgfQorICB9CisgIGlmIChwb2ludGVycChpc3N1ZS0+bm90ZXMpKQorICB7CisgICAgZm9yZWFjaChzdHJ1Y3Qgbm90ZV9zIGVudHJ5IDogaXNzdWUtPm5vdGVzKQorICAgIHsKKyAgICAgIGVudHJ5LT5pZCA9IGlzc3VlLT5pZDsKKyAgICAgIHNsX2V4ZWMoIklOU0VSVCBJTlRPIG5vdGVzKGlzc3VlaWQsdGltZSx1c2VyLHR4dCkgIgorICAgICAgICAgICAgICAiVkFMVUVTKD8xLD8yLD8zLD80KTsiLAorICAgICAgICAgICAgICB0b19hcnJheShlbnRyeSkuLi4pOworICAgIH0KKyAgfQorLy8gIHNsX2V4ZWMoIkNPTU1JVDsiKTsKKworICByZXR1cm4gaXNzdWUtPmlkOworfQorCisKKy8vIGxvZ2d0IGVpbmVuIFRfUkVQT1JURURfRVJSLCBUX1JFUE9SVEVEX0lERUEsIFRfUkVQT1JURURfVFlQTywgVF9SRVBPUlRFRF9NRAorcHVibGljIHN0cmluZyBMb2dSZXBvcnRlZEVycm9yKG1hcHBpbmcgZXJyKQoreworICAgIC8vZGFyZiBudXIgdm9uIFNwaWVsZXJzaGVsbHMgb2RlciBGZWhsZXJ0ZXVmZWwgZ2VydWZlbiB3ZXJkZW4uCisgICAgaWYgKGV4dGVybl9jYWxsKCkgJiYgIXByZXZpb3VzX29iamVjdCgpCisgICAgICAgIHx8IChzdHJzdHIobG9hZF9uYW1lKHByZXZpb3VzX29iamVjdCgpKSwiL3N0ZC9zaGVsbHMvIikgPT0gLTEKKyAgICAgICAgICAgJiYgbG9hZF9uYW1lKHByZXZpb3VzX29iamVjdCgpKSAhPSAiL29iai90b29scy9mZWhsZXJ0ZXVmZWwiKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAvL0RFQlVHKCJMb2dSZXBvcnRlZEVycm9yXG4iKTsKKyAgICAvLyBERUJVRyhzcHJpbnRmKCIlT1xuIixlcnIpKTsKKyAgICBzdHJpbmcgdWlkID0gKHN0cmluZyltYXN0ZXIoKS0+Y3JlYXRvcl9maWxlKGVycltGX09CSl0pOworCisgICAgLy8gZGVmYXVsdC1UeXAKKyAgICBpZiAoIW1lbWJlcihlcnIsIEZfVFlQRSkpIGVycltGX1RZUEVdID0gVF9SRVBPUlRFRF9FUlI7CisKKyAgICAvLyBkaXYuIEtleXMgZHVlcmZlbiBuaWNodCBnZXNldHp0IHNlaW4uCisgICAgZXJyIC09IChbRl9TVEFURSwgRl9SRUFEU1RBTVAsIEZfQ0FVR0hULCBGX1NUQUNLLCBGX0NMSSwgRl9WRVJCLAorICAgICAgICAgICAgIEZfTE9DSywgRl9SRVNPTFZFUiwgRl9OT1RFU10pOworCisgICAgLy8gRXJyb3JtYXBwaW5nIGluIGlzc3VlLXN0cnVjdCB1bXdhbmRlbG4gdW5kIGJlZnVlbGxlbi4KKyAgICBzdHJ1Y3QgZnVsbGlzc3VlX3MgaXNzdWUgPSAoPGZ1bGxpc3N1ZV9zPik7CisgICAgaXNzdWUtPnR5cGUgPSBlcnJbRl9UWVBFXTsKKyAgICBpc3N1ZS0+dWlkID0gdWlkOworICAgIGlzc3VlLT5tdGltZSA9IGlzc3VlLT5jdGltZSA9IGlzc3VlLT5hdGltZSA9IHRpbWUoKTsKKyAgICBpc3N1ZS0+Y291bnQ9MTsKKyAgICBpc3N1ZS0+bG9hZG5hbWUgPSBsb2FkX25hbWUoZXJyW0ZfT0JKXSk7CisgICAgaXNzdWUtPm1lc3NhZ2UgPSBlcnJbRl9NU0ddOworICAgIGlzc3VlLT5vYmogPSBvYmplY3RfbmFtZShlcnJbRl9PQkpdKTsKKyAgICAvLyBOb3JtYWxpc2llcmVuIGF1ZiBmdWVocmVuZGVuIC8gdW5kIGtlaW4gLmMKKyAgICBpZiAoZXJyW0ZfUFJPR10hPSJ1bmJla2FubnQiKQorICAgICAgICBpc3N1ZS0+cHJvZyA9IGxvYWRfbmFtZShlcnJbRl9QUk9HXSk7CisgICAgZWxzZQorICAgICAgICBpc3N1ZS0+cHJvZyA9ICJ1bmJla2FubnQiOworICAgIGlzc3VlLT50aXRwID0gZ2V0dWlkKHRoaXNfaW50ZXJhY3RpdmUoKSB8fCB0aGlzX3BsYXllcigpKTsKKyAgICBpZiAob2JqZWN0cChlcnJbRl9PQkpdKSkKKyAgICAgIGlzc3VlLT50aWVudiA9IG9iamVjdF9uYW1lKGVudmlyb25tZW50KGVycltGX09CSl0pKTsKKworICAgIC8vREVCVUcoc3ByaW50ZigiJU9cbiIsaXNzdWUpKTsKKyAgICBpc3N1ZS0+aGFzaGtleSA9IGhhc2goVExTX0hBU0hfTUQ1LAorICAgICAgICBzcHJpbnRmKCIlZCVzJXMiLCBpc3N1ZS0+dHlwZSwgaXNzdWUtPmxvYWRuYW1lLCBpc3N1ZS0+bWVzc2FnZSkpOworCisgICAgLy8gZ2dmLiB2b3JoYW5kZW5lbiBGZWhsZXIgc3VjaGVuIC0genVnZWdlYmVuOiBzb2xsdGUgYmVpIHZvbiBTcGllbGVybgorICAgIC8vIGdlbWVsZGV0ZW4gRGluZ2VuIHZlcm11dGxpY2ggbmllIHZvcmtvbW1lbi4uLgorICAgIGludCBvbGRpZCA9IGdldEVycm9ySUQoaXNzdWUtPmhhc2hrZXkpOworICAgIGlmIChvbGRpZCA+PSAwKQorICAgIHsKKyAgICAgIC8vIGdnZi4gc2ljaGVyc3RlbGxlbiwgZGFzcyBlciB3aWVkZXIgZXJvZWZmbmV0IHdpcmQuCisgICAgICBkYl9yZW9wZW5faXNzdWUob2xkaWQsICI8RXJyb3JEPiIsCisgICAgICAgICAgICAgICAgICAgICAgIkF1dG9tYXRpc2NoIHdpZWRlcmVyb2VmZm5ldCB3ZWdlbiBlcm5ldXRlbSBBdWZ0cmV0ZW4uIik7CisgICAgICBkYl9jb3VudHVwX2lzc3VlKG9sZGlkKTsKKyAgICAgIHJldHVybiBpc3N1ZS0+aGFzaGtleTsKKyAgICB9CisKKyAgICAvLyBzb25zdCBmdWVnZW4gd2lyIGVpbmVuIG5ldWVuIEVpbnRyYWcgaGluenUKKyAgICAvLyBTcGllbGVyZ2VtZWxkZXRlIEJ1Z3Mgd2VyZGVuIGVyc3RtYWwgdm9yIGF1dG9tYXRpc2NoZW0gTG9lc2NoZW4KKyAgICAvLyBnZXNjaHVldHp0LCBiaXMgZWluIHp1c3RhZW5kaWdlciBNYWdpZXIgaWhuIHp1ciBLZW5udG5pcyBuaW1tdCB1bmQKKyAgICAvLyBlbnRzcGVycnQuCisgICAgaXNzdWUtPmxvY2tlZCA9IDE7CisgICAgaXNzdWUtPmxvY2tlZF9ieSA9IGdldHVpZChUSSB8fCBQTCk7CisgICAgaXNzdWUtPmxvY2tlZF90aW1lID0gdGltZSgpOworCisgICAgLy8gSW4gREIgZWludHJhZ2VuLgorICAgIGlzc3VlLT5pZCA9IGRiX2luc2VydF9pc3N1ZShpc3N1ZSk7CisKKyAgICBsYXN0ZXJyb3JbaXNzdWUtPnR5cGVdPWlzc3VlLT5pZDsKKworICAgIC8vIEV2ZW50IHRyaWdnZXJuLCBhYmVyIG51ciBlaW5lIFRlaWxtZW5nZSBkZXIgRGF0ZW4gZGlyZWt0IG1pdGxpZWZlcm4uCisgICAgRVZFTlRELT5UcmlnZ2VyRXZlbnQoRVZUX0xJQl9ORVdfRVJST1IsCisgICAgICAgICAgICAgIChbRl9UWVBFOiBpc3N1ZS0+dHlwZSwgRl9IQVNIS0VZOmlzc3VlLT5oYXNoa2V5LAorICAgICAgICAgICAgICAgRl9VSUQ6aXNzdWUtPnVpZCwgRl9JRDogaXNzdWUtPmlkXSkpOworCisgICAgREVCVUcoc3ByaW50ZigiTG9nUmVwb3J0ZWRFcnJvcjogJXNcbiIsaXNzdWUtPmhhc2hrZXkpKTsKKworICAgIHJldHVybiBpc3N1ZS0+aGFzaGtleTsKK30KKworLy9GZWhsZXIgcmVnaXN0cmllcmVuCisvL0RpZXNlIEZ1bmt0aW9uIGRhcmYgbmljaHQgbWVociBhbHMgMjAwayBUaWNrcyB2ZXJicmF1Y2hlbiB1bmQgd2lyZCBudXIgdm9tCisvL01hc3RlciBnZXJ1ZmVuIQorcHVibGljIGludCBMb2dFcnJvcihzdHJpbmcgbXNnLHN0cmluZyBwcmcsc3RyaW5nIGN1cm9iaixpbnQgbGluZSxtaXhlZCBjdWxwcml0LAorICAgIGludCBjYXVnaHQpCit7CisgICAgLy9ERUJVRyhzcHJpbnRmKCJMb2dFcnJvcjogUHJvZzogJU8sIE9iajogJU8sXG4iLHByZyxjdXJvYmopKTsKKworICAgIC8vZGFyZiBudXIgdm9tIE1hc3RlciBnZXJ1ZmVuIHdlcmRlbgorICAgIGlmICghZXh0ZXJuX2NhbGwoKSB8fCAKKyAgICAgICAgKHByZXZpb3VzX29iamVjdCgpICYmIHByZXZpb3VzX29iamVjdCgpICE9IG1hc3RlcigpKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBzdHJ1Y3QgZnVsbGlzc3VlX3MgaXNzdWUgPSAoPGZ1bGxpc3N1ZV9zPik7CisKKyAgICAvL1VJRCBiZXN0aW1tZW4KKyAgICBpc3N1ZS0+dWlkPShzdHJpbmcpbWFzdGVyKCktPmNyZWF0b3JfZmlsZShjdXJvYmopOworICAgIC8vREVCVUcoc3ByaW50ZigiTG9nRXJyb3I6IFVJRDogJXNcbiIsdWlkKSk7CisKKyAgICAvL0xvYWRuYW1lIChiZXNzZXIgYWxzIEJQLCBmYWxscyByZW5hbWVfb2JqZWN0KCkgYmVudXR6dCB3dXJkZSkgYmVzdGltbWVuCisgICAgaWYgKCFzdHJpbmdwKGN1cm9iaikgfHwgIXNpemVvZihjdXJvYmopKQorICAgICAgICBpc3N1ZS0+bG9hZG5hbWUgPSBjdXJvYmogPSAiPFVuYmVrYW5udD4iOworICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8vbG9hZF9uYW1lIG5pbW10IFN0cmluZ3MgdW5kIE9iamVjdHMgdW5kIGtvbnN0cnVpZXJ0IGRlbiBsb2FkbmFtZSwKKyAgICAgICAgLy93aWUgZXIgc2VpbiBzb2xsdGUsIHdlbm4gZGFzIE9iamVrdCBuaWNodCBtZWhyIGV4aXN0aWVydC4KKyAgICAgICAgaXNzdWUtPmxvYWRuYW1lPWxvYWRfbmFtZShjdXJvYmopOworICAgIH0KKyAgICBpZiAoIXN0cmluZ3AoaXNzdWUtPmxvYWRuYW1lKSkKKyAgICB7CisgICAgICAgIC8vaGllciBrb21tdCBtYW4gcmVpbiwgZmFsbHMgY3Vyb2JqIGVpbiAna2FwdXR0ZXInIE5hbWUgaXN0LAorICAgICAgICAvL2QuaC4gbG9hZF9uYW1lKCkgMCBsaWVmZXJ0LgorICAgICAgICBpc3N1ZS0+bG9hZG5hbWU9IjxJbGxlZ2FsIG9iamVjdCBuYW1lPiI7CisgICAgfQorCisgICAgLy8gV2VubiBjdXJvYmogaW4gL3BsYXllcnMvIGxpZWd0LCBlcyBlaW5lbiBUSSBnaWJ0LCB3ZWxjaGVyIGVpbiBNYWdpZXIKKyAgICAvLyBpc3QgdW5kIGRpZXNlciBkaWUgUHJvcCBQX0RPTlRfTE9HX0VSUk9SUyBnZXNldHp0IGhhdCwgd2lyZCBkZXIgRkVobGVyCisgICAgLy8gbmljaHQgZ2VzcGVpY2hlcnQuCisgICAgaWYgKHRoaXNfaW50ZXJhY3RpdmUoKSAmJiBJU19MRUFSTkVSKHRoaXNfaW50ZXJhY3RpdmUoKSkKKyAgICAgICAgJiYgc3Ryc3RyKGlzc3VlLT5sb2FkbmFtZSxXSVpBUkRESVIpPT0wCisgICAgICAgICYmIHRoaXNfaW50ZXJhY3RpdmUoKS0+UXVlcnlQcm9wKFBfRE9OVF9MT0dfRVJST1JTKSkKKyAgICB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8vIHByZyB1bmQgY3Vyb2JqIGF1ZiBmdWVocmVuZGVuIC8gdW5kIG9obmUgLmMgYW0gRW5kZSBub3JtaWVyZW4uCisgICAgaWYgKHN0cmluZ3AocHJnKSkKKyAgICAgICAgaXNzdWUtPnByb2cgPSBsb2FkX25hbWUocHJnKTsKKyAgICBpZiAoc3RyaW5ncChjdXJvYmopICYmIGN1cm9ialswXSE9Jy8nKQorICAgIHsKKyAgICAgIGN1cm9iaj0iLyIrY3Vyb2JqOworICAgIH0KKworICAgIGlzc3VlLT5vYmogPSBjdXJvYmo7CisgICAgaXNzdWUtPmxvYyA9IGxpbmU7CisgICAgaXNzdWUtPm1lc3NhZ2UgPSBtc2c7CisgICAgaXNzdWUtPmN0aW1lID0gaXNzdWUtPm10aW1lID0gaXNzdWUtPmF0aW1lID0gdGltZSgpOworICAgIGlzc3VlLT50eXBlID0gVF9SVEVSUk9SOworICAgIGlzc3VlLT5jb3VudCA9IDE7CisgICAgaXNzdWUtPmNhdWdodCA9IGNhdWdodDsKKworICAgIC8vSGFzaGtleSBiZXN0aW1tZW46IFR5cCwgTmFtZSBkZXIgQmx1ZXByaW50IGRlcyBidWdnZW5kZW4gT2JqZWt0cywKKyAgICAvL1Byb2dyYW1tbmFtZSwgWmVpbGVubnIuLCBGZWhsZXJtZWxkdW5nCisgICAgLy9UT0RPOiBldnRsLiBzaGExKCkgc3RhdHQgbWQ1KCk/CisgICAgaXNzdWUtPmhhc2hrZXk9aGFzaChUTFNfSEFTSF9NRDUsCisgICAgICAgIHNwcmludGYoIiVkJXMlcyVkJXMiLCBUX1JURVJST1IsIGlzc3VlLT5sb2FkbmFtZXx8IiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNzdWUtPnByb2cgfHwgIiIsIGlzc3VlLT5sb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNzdWUtPm1lc3NhZ2V8fCI8Tm8gZXJyb3IgbWVzc2FnZSBnaXZlbi4+IikpOworICAgIERFQlVHKHNwcmludGYoIkxvZ0Vycm9yOiBIYXNoa2V5OiAlcyIsIGlzc3VlLT5oYXNoa2V5KSk7CisKKyAgICAvLyBnZ2YuIHZvcmhhbmRlbmVuIEZlaGxlciBzdWNoZW4KKyAgICBpbnQgb2xkaWQgPSBnZXRFcnJvcklEKGlzc3VlLT5oYXNoa2V5KTsKKyAgICBpZiAob2xkaWQgPj0gMCkKKyAgICB7CisgICAgICBkYl9yZW9wZW5faXNzdWUob2xkaWQsICI8RXJyb3JEPiIsCisgICAgICAgICAgICAgICAgICAgICAgIkF1dG9tYXRpc2NoIHdpZWRlcmVyb2VmZm5ldCB3ZWdlbiBlcm5ldXRlbSBBdWZ0cmV0ZW4uIik7CisgICAgICBkYl9jb3VudHVwX2lzc3VlKG9sZGlkKTsKKyAgICAgIHJldHVybiBvbGRpZDsKKyAgICB9CisKKyAgICAvL3NvbnN0IGZ1ZWdlbiB3aXIgZWluZW4gbmV1ZW4gRWludHJhZyBoaW56dQorICAgIC8vREVCVUcoc3ByaW50ZigiTG9nRXJyb3I6IE9CSjogJXMsIEJQOiAlcyIsY3Vyb2JqLGxvYWRuYW1lKSk7CisgICAgLy8gV2VubiBGZWhsZXIgaW0gSEIsIE9iamVrdG5hbWVuIGVybWl0dGVsbgorICAgIGlmIChvYmplY3RwKGN1bHByaXQpKQorICAgICAgICBpc3N1ZS0+aGJvYmogPSBvYmplY3RfbmFtZShjdWxwcml0KTsKKworICAgIC8vZ2lidCBlcyBlaW5lbiBUSS9UUD8gTmFtZSBtaXQgZXJmYXNzZW4KKyAgICBtaXhlZCB0aWVudjsKKyAgICBpZihvYmplY3RwKHRoaXNfaW50ZXJhY3RpdmUoKSkpCisgICAgeworICAgICAgICBpc3N1ZS0+dGl0cD1nZXR1aWQodGhpc19pbnRlcmFjdGl2ZSgpKTsKKyAgICAgICAgdGllbnY9ZW52aXJvbm1lbnQodGhpc19pbnRlcmFjdGl2ZSgpKTsKKyAgICB9CisgICAgZWxzZSBpZiAob2JqZWN0cChQTCkgJiYgcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShQTCkpCisgICAgeworICAgICAgICBpc3N1ZS0+dGl0cD1nZXR1aWQoUEwpOworICAgICAgICB0aWVudj1lbnZpcm9ubWVudChQTCk7CisgICAgfQorICAgIGVsc2UgaWYgKG9iamVjdHAoUEwpKQorICAgIHsKKyAgICAgICAgaXNzdWUtPnRpdHA9b2JqZWN0X25hbWUoUEwpOworICAgICAgICB0aWVudj1lbnZpcm9ubWVudChQTCk7CisgICAgfQorICAgIGlmIChvYmplY3RwKHRpZW52KSkKKyAgICAgICAgaXNzdWUtPnRpZW52PW9iamVjdF9uYW1lKHRpZW52KTsKKworICAgIC8vIE1hbCBzY2hhdWVuLCBvYiBkZXIgQ29tbWFuZHN0YWNrIGF1Y2ggd2FzIGZ1ZXIgdW5zIGhhdC4gOy0pCisgICAgbWl4ZWQgY2xpOworICAgIGlmIChwb2ludGVycChjbGk9Y29tbWFuZF9zdGFjaygpKSAmJiBzaXplb2YoY2xpKSkKKyAgICB7CisgICAgICAgIGlzc3VlLT52ZXJiPWNsaVswXVtDTURfVkVSQl07CisgICAgICAgIGlzc3VlLT5jb21tYW5kPWNsaVswXVtDTURfVEVYVF07CisgICAgfQorCisgICAgLy9zdGFja3RyYWNlIGhvbGVuCisgICAgbWl4ZWQgc3RhY2t0cmFjZTsKKyAgICBpZiAoY2F1Z2h0KQorICAgICAgICBzdGFja3RyYWNlPWRlYnVnX2luZm8oRElORk9fVFJBQ0UsRElUX0VSUk9SKTsKKyAgICBlbHNlCisgICAgICAgIHN0YWNrdHJhY2U9ZGVidWdfaW5mbyhESU5GT19UUkFDRSxESVRfVU5DQVVHSFRfRVJST1IpOworICAgIC8vIGd1ZWx0aWdlIFN0YWNrdHJhY2VzIGhhYmVuIG1pbi4gMiBFbGVtZW50ZS4KKyAgICAvLyAobGVlcmVyIFRyYWNlOiAoeyJObyB0cmFjZS4ifSkpCisgICAgaWYgKHNpemVvZihzdGFja3RyYWNlKSA+IDEpCisgICAgeworICAgICAgaW50IGk7CisgICAgICBpc3N1ZS0+c3RhY2sgPSBhbGxvY2F0ZShzaXplb2Yoc3RhY2t0cmFjZSktMSk7CisgICAgICAvLyBlcnN0ZXMgRWxlbWVudCBpc3QgMCBvZGVyIEhCLU9iamVrdDoga2VpbiBmcmFtZSwgZGFoZXIgdWViZXJzcHJpbmdlbgorICAgICAgZm9yZWFjaChtaXhlZCBlbnRyeSA6IHN0YWNrdHJhY2VbMS4uXSkKKyAgICAgIHsKKyAgICAgICAgLy8gZnJhbWUtPmlkIHdpbGwgYmUgc2V0IGxhdGVyIGJ5IGRiX2luc2VydF9pc3N1ZSgpLgorICAgICAgICBzdHJ1Y3QgZnJhbWVfcyBmcmFtZSA9ICg8ZnJhbWVfcz4gdHlwZSA6IGVudHJ5W1RSQUNFX1RZUEVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogIGVudHJ5W1RSQUNFX05BTUVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZzogIGVudHJ5W1RSQUNFX1BST0dSQU1dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqOiAgIGVudHJ5W1RSQUNFX09CSkVDVF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2M6ICAgZW50cnlbVFJBQ0VfTE9DXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpY2tzOiBlbnRyeVtUUkFDRV9FVkFMQ09TVF0pOworICAgICAgICBpc3N1ZS0+c3RhY2tbaV0gPSBmcmFtZTsKKyAgICAgICAgKytpOworICAgICAgfQorICAgIH0KKworICAgIGlzc3VlLT5pZCA9IGRiX2luc2VydF9pc3N1ZShpc3N1ZSk7CisKKyAgICBsYXN0ZXJyb3JbVF9SVEVSUk9SXT1pc3N1ZS0+aWQ7CisKKyAgICAvLyBFdmVudCB0cmlnZ2VybiwgYWJlciBudXIgZWluZSBUZWlsbWVuZ2UgZGVyIERhdGVuIGRpcmVrdCBtaXRsaWVmZXJuLgorICAgIEVWRU5URC0+VHJpZ2dlckV2ZW50KEVWVF9MSUJfTkVXX0VSUk9SLAorICAgICAgICAgICAgICAoWyBGX1RZUEU6IFRfUlRFUlJPUiwgRl9IQVNIS0VZOiBpc3N1ZS0+aGFzaGtleSwgRl9VSUQ6CisgICAgICAgICAgICAgICBpc3N1ZS0+dWlkLCBGX0lEOiBpc3N1ZS0+aWQgXSkpOworCisvLyAgICBERUJVRyhzcHJpbnRmKCJMb2dFcnJvcjogRmVobGVyZWludHJhZzpcbiVPXG4iLAorLy8gICAgICAgICAgZXJyb3JzW3VpZF1baGFzaGtleV0pKTsKKy8vICAgIERFQlVHKHNwcmludGYoIkxvZ0Vycm9yOiBWZXJicmF1Y2h0ZSBUaWNrczogJWRcbiIsCisvLyAgICAgICAgICAyMDAwMDAtZ2V0X2V2YWxfY29zdCgpKSk7CisgICAgcmV0dXJuIGlzc3VlLT5pZDsKK30KKworLy9XYXJudW5nZW4gcmVnaXN0cmllcmVuCisvL0RpZXNlIEZ1bmt0aW9uIGRhcmYgbmljaHQgbWVociBhbHMgMjAwayBUaWNrcyB2ZXJicmF1Y2hlbiB1bmQgd2lyZCBudXIgdm9tCisvL01hc3RlciBnZXJ1ZmVuIQorcHVibGljIGludCBMb2dXYXJuaW5nKHN0cmluZyBtc2csc3RyaW5nIHByZyxzdHJpbmcgY3Vyb2JqLGludCBsaW5lLCBpbnQgaW5fY2F0Y2gpCit7CisgICAgLy9ERUJVRyhzcHJpbnRmKCJMb2dXYXJuaW5nOiBQcm9nOiAlTywgT2JqOiAlTyxcbiIscHJnLGN1cm9iaikpOworCisgICAgLy9kYXJmIG51ciB2b20gTWFzdGVyIGdlcnVmZW4gd2VyZGVuCisgICAgaWYgKCFleHRlcm5fY2FsbCgpIHx8IAorICAgICAgICAocHJldmlvdXNfb2JqZWN0KCkgJiYgcHJldmlvdXNfb2JqZWN0KCkgIT0gbWFzdGVyKCkpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHN0cnVjdCBmdWxsaXNzdWVfcyBpc3N1ZSA9ICg8ZnVsbGlzc3VlX3M+KTsKKworICAgIC8vVUlEIGJlc3RpbW1lbgorICAgIGlzc3VlLT51aWQ9KHN0cmluZyltYXN0ZXIoKS0+Y3JlYXRvcl9maWxlKGN1cm9iaik7CisgICAgLy9ERUJVRyhzcHJpbnRmKCJMb2dXYXJuaW5nIFVJRDogJXNcbiIsdWlkKSk7CisKKyAgICAvL0xvYWRuYW1lIChiZXNzZXIgYWxzIEJQLCBmYWxscyByZW5hbWVfb2JqZWN0KCkgYmVudXR6dCB3dXJkZSkgYmVzdGltbWVuCisgICAgaWYgKCFzdHJpbmdwKGN1cm9iaikgfHwgIXNpemVvZihjdXJvYmopKQorICAgICAgICBpc3N1ZS0+bG9hZG5hbWUgPSBjdXJvYmogPSAiPFVuYmVrYW5udD4iOworICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8vbG9hZF9uYW1lIG5pbW10IFN0cmluZ3MgdW5kIE9iamVjdHMgdW5kIGtvbnN0cnVpZXJ0IGRlbiBsb2FkbmFtZSwKKyAgICAgICAgLy93aWUgZXIgc2VpbiBzb2xsdGUsIHdlbm4gZGFzIE9iamVrdCBuaWNodCBtZWhyIGV4aXN0aWVydC4KKyAgICAgICAgaXNzdWUtPmxvYWRuYW1lPWxvYWRfbmFtZShjdXJvYmopOworICAgIH0KKworICAgIGlmICghc3RyaW5ncChpc3N1ZS0+bG9hZG5hbWUpKQorICAgICAgICAvL2hpZXIgc29sbHRlIG1hbiByZWlua29tbWVuLCBmYWxscyBjdXJvYmogZWluICdrYXB1dHRlcicgTmFtZSBpc3QsCisgICAgICAgIC8vZC5oLiBsb2FkX25hbWUoKSAwIGxpZWZlcnQuCisgICAgICAgIGlzc3VlLT5sb2FkbmFtZT0iPElsbGVnYWwgb2JqZWN0IG5hbWU+IjsKKworICAgIC8vIHByZyB1bmQgY3Vyb2JqIGF1ZiBhYnMuIFBmYWRlIG5vcm1hbGlzaWVyZW4uCisgICAgaWYgKHN0cmluZ3AocHJnKSkKKyAgICAgICAgaXNzdWUtPnByb2c9bG9hZF9uYW1lKHByZyk7CisgICAgaWYgKHN0cmluZ3AoY3Vyb2JqKSAmJiBjdXJvYmpbMF0hPScvJykKKyAgICB7CisgICAgICBjdXJvYmo9Ii8iK2N1cm9iajsKKyAgICB9CisKKyAgICAvL0RFQlVHKHNwcmludGYoIkxvZ1dhcm5pbmc6IE9CSjogJXMsIEJQOiAlc1xuIixjdXJvYmosYmx1ZSkpOworCisgICAgLy8gV2VubiBjdXJvYmogaW4gL3BsYXllcnMvIGxpZWd0LCBlcyBlaW5lbiBUSSBnaWJ0LCB3ZWxjaGVyIGVpbiBNYWdpZXIKKyAgICAvLyBpc3QgdW5kIGRpZXNlciBkaWUgUHJvcCBQX0RPTlRfTE9HX0VSUk9SUyBnZXNldHp0IGhhdCwgd2lyZCBkZXIgRkVobGVyCisgICAgLy8gbmljaHQgZ2VzcGVpY2hlcnQuCisgICAgaWYgKHRoaXNfaW50ZXJhY3RpdmUoKSAmJiBJU19MRUFSTkVSKHRoaXNfaW50ZXJhY3RpdmUoKSkKKyAgICAgICAgJiYgc3Ryc3RyKGlzc3VlLT5sb2FkbmFtZSxXSVpBUkRESVIpPT0wCisgICAgICAgICYmIHRoaXNfaW50ZXJhY3RpdmUoKS0+UXVlcnlQcm9wKFBfRE9OVF9MT0dfRVJST1JTKSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvL0hhc2hrZXkgYmVzdGltbWVuLCBUeXAsIE5hbWUgZGVyIEJsdWVwcmludCBkZXMgYnVnZ2VuZGVuIE9iamVrdHMsIFByb2dyYW1tCisgICAgLy9aZWlsZW5uci4sIFdhcm51bmdzbWVsZHVuZworICAgIGlzc3VlLT5oYXNoa2V5PWhhc2goVExTX0hBU0hfTUQ1LAorICAgICAgICBzcHJpbnRmKCIlZCVzJXMlZCVzIiwgVF9SVFdBUk4sIGlzc3VlLT5sb2FkbmFtZSwgaXNzdWUtPnByb2csIGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cpKTsKKyAgICAvL0RFQlVHKHNwcmludGYoIkxvZ1dhcm5pbmc6IEhhc2hrZXk6ICVzIixoYXNoa2V5KSk7CisKKworICAgIC8vIGdnZi4gdm9yaGFuZGVuZW4gRmVobGVyIHN1Y2hlbgorICAgIGludCBvbGRpZCA9IGdldEVycm9ySUQoaXNzdWUtPmhhc2hrZXkpOworICAgIGlmIChvbGRpZCA+PSAwKQorICAgIHsKKyAgICAgIGRiX3Jlb3Blbl9pc3N1ZShvbGRpZCwgIjxFcnJvckQ+IiwKKyAgICAgICAgICAgICAgICAgICAgICAiQXV0b21hdGlzY2ggd2llZGVyZXJvZWZmbmV0IHdlZ2VuIGVybmV1dGVtIEF1ZnRyZXRlbi4iKTsKKyAgICAgIGRiX2NvdW50dXBfaXNzdWUob2xkaWQpOworICAgICAgcmV0dXJuIG9sZGlkOworICAgIH0KKworICAgIC8vc29uc3QgZnVlZ2VuIHdpciBlaW5lbiBuZXVlbiBFaW50cmFnIGhpbnp1CisgICAgLy8gZXJzdG1hbCB2ZXJ2b2xsc3RhZW5kaWdlbgorICAgIGlzc3VlLT5vYmogPSBjdXJvYmo7CisgICAgaXNzdWUtPm1lc3NhZ2UgPSBtc2c7CisgICAgaXNzdWUtPmN0aW1lID0gaXNzdWUtPm10aW1lID0gaXNzdWUtPmF0aW1lID0gdGltZSgpOworICAgIGlzc3VlLT5sb2MgPSBsaW5lOworICAgIGlzc3VlLT5jb3VudCA9IDE7CisgICAgaXNzdWUtPnR5cGUgPSBUX1JUV0FSTjsKKyAgICBpc3N1ZS0+Y2F1Z2h0ID0gaW5fY2F0Y2g7CisKKyAgICAvL2dpYnQgZXMgZWluZW4gVEkvVFA/IE5hbWUgbWl0IGVyZmFzc2VuCisgICAgbWl4ZWQgdGllbnY7CisgICAgaWYob2JqZWN0cCh0aGlzX2ludGVyYWN0aXZlKCkpKQorICAgIHsKKyAgICAgICAgaXNzdWUtPnRpdHA9Z2V0dWlkKHRoaXNfaW50ZXJhY3RpdmUoKSk7CisgICAgICAgIHRpZW52PWVudmlyb25tZW50KHRoaXNfaW50ZXJhY3RpdmUoKSk7CisgICAgfQorICAgIGVsc2UgaWYgKG9iamVjdHAoUEwpICYmIHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUoUEwpKQorICAgIHsKKyAgICAgICAgaXNzdWUtPnRpdHA9Z2V0dWlkKFBMKTsKKyAgICAgICAgdGllbnY9ZW52aXJvbm1lbnQoUEwpOworICAgIH0KKyAgICBlbHNlIGlmIChvYmplY3RwKFBMKSkKKyAgICB7CisgICAgICAgIGlzc3VlLT50aXRwPW9iamVjdF9uYW1lKFBMKTsKKyAgICAgICAgdGllbnY9ZW52aXJvbm1lbnQoUEwpOworICAgIH0KKyAgICBpZiAob2JqZWN0cCh0aWVudikpCisgICAgICAgIGlzc3VlLT50aWVudj1vYmplY3RfbmFtZSh0aWVudik7CisKKyAgICAvLyBNYWwgc2NoYXVlbiwgb2IgZGVyIENvbW1hbmRzdGFjayBhdWNoIHdhcyBmdWVyIHVucyBoYXQuIDstKQorICAgIG1peGVkIGNsaTsKKyAgICBpZiAocG9pbnRlcnAoY2xpPWNvbW1hbmRfc3RhY2soKSkgJiYgc2l6ZW9mKGNsaSkpCisgICAgeworICAgICAgICBpc3N1ZS0+dmVyYj1jbGlbMF1bQ01EX1ZFUkJdOworICAgICAgICBpc3N1ZS0+Y29tbWFuZD1jbGlbMF1bQ01EX1RFWFRdOworICAgIH0KKworICAgIGlzc3VlLT5pZCA9IGRiX2luc2VydF9pc3N1ZShpc3N1ZSk7CisKKyAgICBsYXN0ZXJyb3JbVF9SVFdBUk5dPWlzc3VlLT5pZDsKKyAgICAvLyBFdmVudCB0cmlnZ2VybiwgYWJlciBudXIgZWluZSBUZWlsbWVuZ2UgZGVyIERhdGVuIGRpcmVrdCBtaXRsaWVmZXJuLgorICAgIEVWRU5URC0+VHJpZ2dlckV2ZW50KEVWVF9MSUJfTkVXX0VSUk9SLAorICAgICAgICAoW0ZfVFlQRTogaXNzdWUtPnR5cGUsIEZfSUQ6IGlzc3VlLT5pZCwKKyAgICAgICAgICBGX1VJRDogaXNzdWUtPnVpZCwgRl9IQVNIS0VZOiBpc3N1ZS0+aGFzaGtleV0pICk7CisKKy8vICAgIERFQlVHKHNwcmludGYoIkxvZ1dhcm5pbmc6IFdhcm51bmdzZWludHJhZzpcbiVPXG4iLAorLy8gICAgICAgICAgd2FybmluZ3NbdWlkXVtoYXNoa2V5XSkpOworLy8gICAgREVCVUcoc3ByaW50ZigiTG9nV2FybmluZzogVmVyYnJhdWNodGUgVGlja3M6ICVkXG4iLAorLy8gICAgICAgICAgMjAwMDAwLWdldF9ldmFsX2Nvc3QoKSkpOworICAgIHJldHVybiBpc3N1ZS0+aWQ7Cit9CisKKy8vV2FybnVuZ2VuIHVuZCBGZWhsZXIgYmVpbSBLb21waWxpZXJlbiAgcmVnaXN0cmllcmVuCisvL0RpZXNlIEZ1bmt0aW9uIGRhcmYgbmljaHQgbWVociBhbHMgMjAwayBUaWNrcyB2ZXJicmF1Y2hlbiB1bmQgd2lyZCBudXIgdm9tCisvL01hc3RlciBnZXJ1ZmVuIQorcHVibGljIGludCBMb2dDb21waWxlUHJvYmxlbShzdHJpbmcgZmlsZSxzdHJpbmcgbXNnLGludCB3YXJuKSB7CisKKyAgICAvL0RFQlVHKHNwcmludGYoIkxvZ0NvbXBpbGVQcm9ibGVtOiBQcm9nOiAlTywgT2JqOiAlTyxcbiIsZmlsZSxtc2cpKTsKKworICAgIC8vZGFyZiBudXIgdm9tIE1hc3RlciBnZXJ1ZmVuIHdlcmRlbgorICAgIGlmICghZXh0ZXJuX2NhbGwoKSB8fCAKKyAgICAgICAgKHByZXZpb3VzX29iamVjdCgpICYmIHByZXZpb3VzX29iamVjdCgpICE9IG1hc3RlcigpKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBzdHJ1Y3QgZnVsbGlzc3VlX3MgaXNzdWUgPSAoPGZ1bGxpc3N1ZV9zPik7CisKKyAgICAvL1VJRCBiZXN0aW1tZW4KKyAgICBpc3N1ZS0+dWlkPShzdHJpbmcpbWFzdGVyKCktPmNyZWF0b3JfZmlsZShmaWxlKTsKKyAgICAvL0RFQlVHKHNwcmludGYoIkxvZ0NvbXBpbGVQcm9ibGVtIFVJRDogJXNcbiIsdWlkKSk7CisKKyAgICAvLyBBbiBGaWxlIGEpIGZ1ZWhyZW5kZW4gLyBhbmhhZW5nZW4gdW5kIGIpIGVuZGVuZGVzIC5jIGFic2NobmVpZGVuLiBNYWNodAorICAgIC8vIGJlaWRlcyBuZXR0ZXJ3ZWlzZSBsb2FkX25hbWUoKS4KKyAgICBpc3N1ZS0+bG9hZG5hbWUgPSBsb2FkX25hbWUoZmlsZSk7CisgICAgaXNzdWUtPnR5cGUgPSB3YXJuID8gVF9DVFdBUk4gOiBUX0NURVJST1I7CisKKyAgICAvL2xvZ2dlbiB3aXIgZnVlciBkYXMgRmlsZSB1ZWJlcmhhdXB0PworICAgIGlmIChtZW1iZXIoQkxBQ0tMSVNULGV4cGxvZGUoaXNzdWUtPmxvYWRuYW1lLCIvIilbPDFdKT49MCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAvL0hhc2hrZXkgYmVzdGltbWVuLCBpbiBkaWVzZW0gRmFsbCBlaW5mYWNoLCB3aXIga29lbm5lbiBkaWUKKyAgICAvL0ZlaGxlcm1lbGR1bmdlIHNlbGJlciBuZWhtZW4uCisgICAgaXNzdWUtPmhhc2hrZXk9aGFzaChUTFNfSEFTSF9NRDUsc3ByaW50ZigKKyAgICAgICAgICAiJWQlcyVzIixpc3N1ZS0+dHlwZSxpc3N1ZS0+bG9hZG5hbWUsIG1zZykpOworICAgIC8vREVCVUcoc3ByaW50ZigiTG9nQ29tcGlsZVByb2JsZW06IEhhc2hrZXk6ICVzIixoYXNoa2V5KSk7CisKKyAgICAvLyBnZ2YuIHZvcmhhbmRlbmVuIEZlaGxlciBzdWNoZW4KKyAgICBpbnQgb2xkaWQgPSBnZXRFcnJvcklEKGlzc3VlLT5oYXNoa2V5KTsKKyAgICBpZiAob2xkaWQgPj0gMCkKKyAgICB7CisgICAgICBkYl9yZW9wZW5faXNzdWUob2xkaWQsICI8RXJyb3JEPiIsCisgICAgICAgICAgICAgICAgICAgICAgIkF1dG9tYXRpc2NoIHdpZWRlcmVyb2VmZm5ldCB3ZWdlbiBlcm5ldXRlbSBBdWZ0cmV0ZW4uIik7CisgICAgICBkYl9jb3VudHVwX2lzc3VlKG9sZGlkKTsKKyAgICAgIHJldHVybiBvbGRpZDsKKyAgICB9CisKKyAgICAvLyBuZXVlbiBFaW50cmFnCisgICAgaXNzdWUtPm1lc3NhZ2UgPSBtc2c7CisgICAgaXNzdWUtPmNvdW50ID0gMTsKKyAgICBpc3N1ZS0+Y3RpbWUgPSBpc3N1ZS0+bXRpbWUgPSBpc3N1ZS0+YXRpbWUgPSB0aW1lKCk7CisKKyAgICBpc3N1ZS0+aWQgPSBkYl9pbnNlcnRfaXNzdWUoaXNzdWUpOworCisgICAgaWYgKHdhcm4pIGxhc3RlcnJvcltUX0NUV0FSTl09aXNzdWUtPmlkOworICAgIGVsc2UgbGFzdGVycm9yW1RfQ1RFUlJPUl09aXNzdWUtPmlkOworCisvLyAgICBERUJVRyhzcHJpbnRmKCJMb2dDb21waWxlUHJvYmxlbTogRWludHJhZzpcbiVPXG4iLAorLy8gICAgICAgICAgKHdhcm4gPyBjdHdhcm5pbmdzW3VpZF1baGFzaGtleV0gOiBjdGVycm9yc1t1aWRdW2hhc2hrZXldKSkpOworLy8gICBERUJVRyhzcHJpbnRmKCJMb2dDb21waWxlUHJvYmxlbTogVmVyYnJhdWNodGUgVGlja3M6ICVkXG4iLAorLy8gICAgICAgICAgMjAwMDAwLWdldF9ldmFsX2Nvc3QoKSkpOworICAgcmV0dXJuIGlzc3VlLT5pZDsKK30KKworLyogKioqKioqKioqKioqKioqKiAgUHVibGljIEludGVyZmFjZSAqKioqKioqKioqKioqKioqKiogKi8KKworLy9FaW5lbiBiZXN0aW1tdGVuIEZlaGxlciBuYWNoIEhhc2hrZXkgc3VjaGVuIHVuZCBhbHMgZnVsbGlzc3VlX3MgaW5rbC4gTm90ZXMKKy8vdW5kIFN0YWNrdHJhY2UgbGllZmVybi4KK3N0cnVjdCBmdWxsaXNzdWVfcyBRdWVyeUlzc3VlQnlIYXNoKHN0cmluZyBoYXNoa2V5KQoreworICBzdHJ1Y3QgZnVsbGlzc3VlX3MgaXNzdWUgPSBkYl9nZXRfaXNzdWUoMCwgaGFzaGtleSk7CisgIGlmIChzdHJ1Y3RwKGlzc3VlKSkKKyAgICByZXR1cm4gZmlsdGVyX3ByaXZhdGUoaXNzdWUpOworICByZXR1cm4gMDsKK30KKy8vRWluZW4gYmVzdGltbXRlbiBGZWhsZXIgbmFjaCBJRCBzdWNoZW4gdW5kIGFscyBmdWxsaXNzdWVfcyBpbmtsLiBOb3RlcworLy91bmQgU3RhY2t0cmFjZSBsaWVmZXJuLgorc3RydWN0IGZ1bGxpc3N1ZV9zIFF1ZXJ5SXNzdWVCeUlEKGludCBpc3N1ZWlkKQoreworICBzdHJ1Y3QgZnVsbGlzc3VlX3MgaXNzdWUgPSBkYl9nZXRfaXNzdWUoaXNzdWVpZCwgMCk7CisgIGlmIChzdHJ1Y3RwKGlzc3VlKSkKKyAgICByZXR1cm4gZmlsdGVyX3ByaXZhdGUoaXNzdWUpOworICByZXR1cm4gMDsKK30KKworLy8gZGVuIGxldHp0ZW4gRWludHJhZyBkZW4gamV3ZWlsaWdlbiBUeXAgbGllZmVybi4KK3N0cnVjdCBmdWxsaXNzdWVfcyBRdWVyeUxhc3RJc3N1ZShpbnQgdHlwZSkKK3sKKyAgICBpZiAoIW1lbWJlcihsYXN0ZXJyb3IsdHlwZSkpCisgICAgICAgIHJldHVybiAwOworICAgIC8vZWluZmFjaCBkZW4ga29tcGxldHRlbiBsZXR6dGVuIEVpbnRyYWcgenVydWVja2xpZWZlcm4KKyAgICByZXR1cm4oUXVlcnlJc3N1ZUJ5SUQobGFzdGVycm9yW3R5cGVdKSk7Cit9CisKKy8vIExpZWZlcnQgYWxsZSBJc3N1ZXMsIGRlcmVuIG9iaixwcm9nIG9kZXIgbG9hZG5hbWUgZ2xlaWNoIDxmaWxlPiBpc3QuCitwdWJsaWMgc3RydWN0IGZ1bGxpc3N1ZV9zKiBRdWVyeUlzc3Vlc0J5RmlsZShzdHJpbmcgZmlsZSwgaW50IHR5cGUpCit7CisgIG1peGVkIHJvd3MgPSBzbF9leGVjKCJTRUxFQ1QgKiBGUk9NIGlzc3VlcyAiCisgICAgICAgICAgICAgICAgICAgICAgICJXSEVSRSAobG9hZG5hbWU9PzEgT1IgcHJvZz0/MSBPUiBvYmo9PzEpICIKKyAgICAgICAgICAgICAgICAgICAgICAgIkFORCBkZWxldGVkPTAgQU5EIHJlc29sdmVkPTAgQU5EIHR5cGU9PzIiCisgICAgICAgICAgICAgICAgICAgICAgICJPUkRFUiBCWSB0eXBlLG10aW1lOyIsIGZpbGUsIHR5cGUpOworICBpZiAocG9pbnRlcnAocm93cykpCisgIHsKKyAgICBzdHJ1Y3QgZnVsbGlzc3VlX3MqIGlsaXN0ID0gYWxsb2NhdGUoc2l6ZW9mKHJvd3MpKTsKKyAgICBpbnQgaTsKKyAgICBmb3JlYWNoKG1peGVkIHJvdyA6IHJvd3MpCisgICAgeworICAgICAgLy8gRWluZmFjaHN0ZXIgV2VnIC0gZnVua3Rpb25pZXJ0IGFiZXIgbnVyLCBzb2xhbmdlIGRpZSBGZWxkZXIgaW4gZGVyIERCCisgICAgICAvLyBkaWUgZ2xlaWNoZSBSZWloZW5mb2xnZSB3aWUgaW4gZGVyIHN0cnVjdCBoYWJlbiEgRW50d2VkZXIgaW1tZXIKKyAgICAgIC8vIHNpY2hlcnN0ZWxsZW4gb2RlciBFcmdlYm5pc3JlaWhlbmZvbGdlIG9iZW4gaW0gc2VsZWN0IGZlc3RsZWdlbiEKKyAgICAgIHN0cnVjdCBmdWxsaXNzdWVfcyBpc3N1ZSA9IHRvX3N0cnVjdCggcm93LCAoPGZ1bGxpc3N1ZV9zPikgKTsKKyAgICAgIGlmIChpc3N1ZS0+dHlwZSA9PSBUX1JURVJST1IpCisgICAgICAgICAgaXNzdWUtPnN0YWNrID0gZGJfZ2V0X3N0YWNrKGlzc3VlLT5pZCk7CisgICAgICBpc3N1ZS0+bm90ZXMgPSBkYl9nZXRfbm90ZXMoaXNzdWUtPmlkKTsKKyAgICAgIGlsaXN0W2ldID0gZmlsdGVyX3ByaXZhdGUoaXNzdWUpOworICAgICAgKytpOworICAgIH0KKyAgICByZXR1cm4gaWxpc3Q7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8vIExpZWZlcnQgZWluZSBMaXN0ZSB2b24gYWxsZW4gSURzLCBMb2FkbmFtZXMsIFVJRHMgdW5kIFR5cGVuIGZ1ZXIgZGllCisvLyBhbmdlYmVuZW4gPHR5cGU+IHVuZCA8dWlkPi4KK3ZhcmFyZ3MgPCA8aW50fHN0cmluZz4qID4qIFF1ZXJ5SXNzdWVMaXN0QnlGaWxlKHN0cmluZyBmaWxlKQoreworICBtaXhlZCByb3dzID0gc2xfZXhlYygiU0VMRUNUIGlkLGxvYWRuYW1lLG9iaixwcm9nLGxvYyBGUk9NIGlzc3VlcyAiCisgICAgICAgICAgICAgICAgICAgICAgICJXSEVSRSAobG9hZG5hbWU9PzEgT1IgcHJvZz0/MSBPUiBvYmo9PzEpICIKKyAgICAgICAgICAgICAgICAgICAgICAgIkFORCBkZWxldGVkPTAgQU5EIHJlc29sdmVkPTAgIgorICAgICAgICAgICAgICAgICAgICAgICAiT1JERVIgQlkgdHlwZSxtdGltZTsiLCBmaWxlKTsKKyAgcmV0dXJuIHJvd3M7Cit9CisKKy8vIExpZWZlcnQgZWluZSBMaXN0ZSB2b24gYWxsZW4gSURzLCBMb2FkbmFtZXMsIFVJRHMgdW5kIFR5cGVuIGZ1ZXIgZGllCisvLyBhbmdlYmVuZW4gPHR5cGU+IHVuZCA8dWlkPi4KK3ZhcmFyZ3MgPCA8aW50fHN0cmluZz4qID4qIFF1ZXJ5SXNzdWVMaXN0QnlMb2FkbmFtZShzdHJpbmcgZmlsZSwgaW50IHR5cGUpCit7CisgIG1peGVkIHJvd3M7CisgIGlmICh0eXBlICYmIGZpbGUpCisgIHsKKyAgICAgcm93cyA9IHNsX2V4ZWMoIlNFTEVDVCBpZCxsb2FkbmFtZSx1aWQsdHlwZSBGUk9NIGlzc3VlcyAiCisgICAgICAgICAgICAgICAgICAgICAgICJXSEVSRSBsb2FkbmFtZT0/MSBBTkQgdHlwZT0/MiBBTkQgZGVsZXRlZD0wICIKKyAgICAgICAgICAgICAgICAgICAgICAgIkFORCByZXNvbHZlZD0wICIKKyAgICAgICAgICAgICAgICAgICAgICAgIk9SREVSIEJZIHR5cGUsbXRpbWU7IiwgZmlsZSwgdHlwZSk7CisgIH0KKyAgZWxzZSBpZiAodHlwZSkKKyAgeworICAgICByb3dzID0gc2xfZXhlYygiU0VMRUNUIGlkLGxvYWRuYW1lLHVpZCx0eXBlIEZST00gaXNzdWVzICIKKyAgICAgICAgICAgICAgICAgICAgICAgIldIRVJFIHR5cGU9PzEgQU5EIGRlbGV0ZWQ9MCBBTkQgcmVzb2x2ZWQ9MCAiCisgICAgICAgICAgICAgICAgICAgICAgICJPUkRFUiBCWSB0eXBlLG10aW1lOyIsIHR5cGUpOworICB9CisgIGVsc2UgaWYgKGZpbGUpCisgIHsKKyAgICByb3dzID0gc2xfZXhlYygiU0VMRUNUIGlkLGxvYWRuYW1lLHVpZCx0eXBlIEZST00gaXNzdWVzICIKKyAgICAgICAgICAgICAgICAgICAgICAgIldIRVJFIGxvYWRuYW1lPT8xIEFORCBkZWxldGVkPTAgQU5EIHJlc29sdmVkPTAgIgorICAgICAgICAgICAgICAgICAgICAgICAiT1JERVIgQlkgdHlwZSxtdGltZTsiLCBmaWxlKTsKKyAgfQorICByZXR1cm4gcm93czsKK30KKworCisvLyBMaWVmZXJ0IGVpbmUgTGlzdGUgdm9uIGFsbGVuIElEcywgTG9hZG5hbWVzLCBVSURzIHVuZCBUeXBlbiBmdWVyIGRpZQorLy8gYW5nZWJlbmVuIDx0eXBlPiB1bmQgPHVpZD4uCit2YXJhcmdzIDwgPGludHxzdHJpbmc+KiA+KiBRdWVyeUlzc3VlTGlzdChpbnQgdHlwZSwgc3RyaW5nIHVpZCkKK3sKKyAgbWl4ZWQgcm93czsKKyAgaWYgKHR5cGUgJiYgdWlkKQorICB7CisgICAgcm93cyA9IHNsX2V4ZWMoIlNFTEVDVCBpZCxsb2FkbmFtZSx1aWQsdHlwZSBGUk9NIGlzc3VlcyAiCisgICAgICAgICAgICAgICAgICAgIldIRVJFIHR5cGU9PzEgQU5EIHVpZD0/MiBBTkQgZGVsZXRlZD0wICIKKyAgICAgICAgICAgICAgICAgICAiQU5EIHJlc29sdmVkPTAgIgorICAgICAgICAgICAgICAgICAgICJPUkRFUiBCWSB0eXBlLHJvd2lkOyIsIHR5cGUsdWlkKTsKKyAgfQorICBlbHNlIGlmICh0eXBlKQorICB7CisgICAgcm93cyA9IHNsX2V4ZWMoIlNFTEVDVCBpZCxsb2FkbmFtZSx1aWQsdHlwZSBGUk9NIGlzc3VlcyAiCisgICAgICAgICAgICAgICAgICAgIldIRVJFIHR5cGU9PzEgQU5EIGRlbGV0ZWQ9MCBBTkQgcmVzb2x2ZWQ9MCAiCisgICAgICAgICAgICAgICAgICAgIk9SREVSIEJZIHR5cGUscm93aWQ7IiwgdHlwZSk7CisgIH0KKyAgZWxzZSBpZiAodWlkKQorICB7CisgICAgcm93cyA9IHNsX2V4ZWMoIlNFTEVDVCBpZCxsb2FkbmFtZSx1aWQsdHlwZSBGUk9NIGlzc3VlcyAiCisgICAgICAgICAgICAgICAgICAgIldIRVJFIHVpZD0/MSBBTkQgZGVsZXRlZD0wIEFORCByZXNvbHZlZD0wICIKKyAgICAgICAgICAgICAgICAgICAiT1JERVIgQlkgdHlwZSxyb3dpZDsiLCB1aWQpOworICB9CisgIHJldHVybiByb3dzOworfQorCit2YXJhcmdzIHN0cmluZyogUXVlcnlVSURzRm9yVHlwZShpbnQgdHlwZSkgeworICAgIC8vbGllZmVydCBhbGxlIFVJRHMgZnVlciBlaW5lbiBGZWhsZXJ0eXAgb2RlciBmdWVyIGFsbGUgRmVobGVydHlwZW4KKyAgICBzdHJpbmcqKiByb3dzOworCisgICAgaWYgKHR5cGUpCisgICAgeworICAgICAgcm93cyA9IHNsX2V4ZWMoIlNFTEVDVCB1aWQgRlJPTSBpc3N1ZXMgIgorICAgICAgICAgICAgICAgICAgICAgIldIRVJFIHR5cGU9PzEgQU5EIGRlbGV0ZWQ9MCBBTkQgcmVzdm9sZWQ9MDsiLCB0eXBlKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgcm93cyA9IHNsX2V4ZWMoIlNFTEVDVCB1aWQgRlJPTSBpc3N1ZXMgV0hFUkUgZGVsZXRlZD0wICIKKyAgICAgICAgICAgICAgICAgICAgICJBTkQgcmVzb2x2ZWQ9MDsiKTsKKworICAgIHJldHVybiBtYXAocm93cywgZnVuY3Rpb24gc3RyaW5nIChzdHJpbmcqIGl0ZW0pCisgICAgICAgICAgICAgICAgICAgICB7cmV0dXJuIGl0ZW1bMF07fSApOworfQorCisvL1dpZXZpZWxlIHVudGVyc2NoaWVkbGljaGUgRmVobGVyIGluIGRpZXNlbSBUeXA/Cit2YXJhcmdzIGludCBRdWVyeVVuaXF1ZUlzc3VlQ291bnQoaW50IHR5cGUsIHN0cmluZyB1aWQpCit7CisgIGludCoqIHJvd3M7CisKKyAgaWYgKHR5cGUgJiYgdWlkKQorICB7CisgICAgcm93cyA9IHNsX2V4ZWMoIlNFTEVDVCBjb3VudCgqKSBGUk9NIGlzc3VlcyAiCisgICAgICAgICAgICAgICAgICAgIldIRVJFIHR5cGU9PzEgQU5EIHVpZD0/MiBBTkQgZGVsZXRlZD0wIEFORCByZXNvbHZlZD0wOyIsCisgICAgICAgICAgICAgICAgICAgdHlwZSwgdWlkKTsKKyAgfQorICBlbHNlIGlmICh0eXBlKQorICB7CisgICAgcm93cyA9IHNsX2V4ZWMoIlNFTEVDVCBjb3VudCgqKSBGUk9NIGlzc3VlcyAiCisgICAgICAgICAgICAgICAgICAgIldIRVJFIHR5cGU9PzEgQU5EIGRlbGV0ZWQ9MCBBTkQgcmVzb2x2ZWQ9MDsiLAorICAgICAgICAgICAgICAgICAgIHR5cGUpOworICB9CisgIGVsc2UgaWYgKHVpZCkKKyAgeworICAgIHJvd3MgPSBzbF9leGVjKCJTRUxFQ1QgY291bnQoKikgRlJPTSBpc3N1ZXMgIgorICAgICAgICAgICAgICAgICAgICJXSEVSRSB1aWQ9PzEgQU5EIGRlbGV0ZWQ9MCBBTkQgcmVzb2x2ZWQ9MDsiLAorICAgICAgICAgICAgICAgICAgIHVpZCk7CisgIH0KKyAgZWxzZQorICAgIHJvd3MgPSBzbF9leGVjKCJTRUxFQ1QgY291bnQoKikgRlJPTSBpc3N1ZXMgIgorICAgICAgICAgICAgICAgICAgICJXSEVSRSBkZWxldGVkPTAgQU5EIHJlc29sdmVkPTA7Iik7CisKKyAgcmV0dXJuIHJvd3NbMF1bMF07Cit9CisKKy8vRWluZW4gYmVzdGltbXRlbiBGZWhsZXIgbG9lc2NoZW4KK3ZhcmFyZ3MgaW50IFRvZ2dsZURlbGV0ZUVycm9yKGludCBpc3N1ZWlkLCBzdHJpbmcgbm90ZSkKK3sKKyAgbWl4ZWQgcm93cyA9IHNsX2V4ZWMoIlNFTEVDVCB1aWQsZGVsZXRlZCBmcm9tIGlzc3VlcyBXSEVSRSBpZD0/MTsiLAorICAgICAgICAgICAgICAgICAgICAgICBpc3N1ZWlkKTsKKyAgaWYgKCFwb2ludGVycChyb3dzKSkKKyAgICByZXR1cm4gLTE7CisgIAorICBpZiAoIWFjY2Vzc19jaGVjayhyb3dzWzBdWzBdLCBNX0RFTEVURSkpCisgICAgLy96dWdyaWZmIHp1bSBTY2hyZWliZW4gbmljaHQgZ2VzdGF0dGV0CisgICAgcmV0dXJuIC0xMDsKKworLy8gIHNsX2V4ZWMoIkJFR0lOIFRSQU5TQUNUSU9OOyIpOworICBpZiAocm93c1swXVsxXSkKKyAgeworICAgIC8vIHdhcyBkZWxldGVkIC0+IHVuZGVsZXRlIGl0CisgICAgc2xfZXhlYygiVVBEQVRFIGlzc3VlcyBTRVQgZGVsZXRlZD0wLG10aW1lPT8yIFdIRVJFIGlkPT8xOyIsCisgICAgICAgICAgICBpc3N1ZWlkLHRpbWUoKSk7CisgICAgZGJfYWRkX25vdGUoKDxub3RlX3M+IGlkOiBpc3N1ZWlkLCB0aW1lOiB0aW1lKCksIHVzZXI6IGdldHVpZChUSSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHR4dDogc3ByaW50ZigiTG9lc2NobWFya2llcnVuZyBlbnRmZXJudC4gKCVzKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RlID8gbm90ZTogIjxrZWluIEtvbW1lbnRhcj4iKQorICAgICAgICAgICAgICAgICkpOworICB9CisgIGVsc2UKKyAgeworICAgIC8vIHdhcyBub3QgZGVsZXRlZCAtPiBkZWxldGUgaXQuCisgICAgc2xfZXhlYygiVVBEQVRFIGlzc3VlcyBTRVQgZGVsZXRlZD0xLG10aW1lPT8yIFdIRVJFIGlkPT8xOyIsCisgICAgICAgICAgICBpc3N1ZWlkLCB0aW1lKCkpOworICAgIGRiX2FkZF9ub3RlKCg8bm90ZV9zPiBpZDogaXNzdWVpZCwgdGltZTogdGltZSgpLCB1c2VyOiBnZXR1aWQoVEkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0eHQ6IHNwcmludGYoIkxvZXNjaG1hcmtpZXJ1bmcgZ2VzZXR6dC4gKCVzKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RlID8gbm90ZTogIjxrZWluIEtvbW1lbnRhcj4iKQorICAgICAgICAgICAgICAgICkpOworICB9CisvLyAgc2xfZXhlYygiQ09NTUlUOyIpOworICByZXR1cm4gIXJvd3NbMF1bMV07Cit9CisKKworLy8gc3BlcnJ0IGRlbiBFaW50cmFnIG9kZXIgZW50c3BlcnJ0IGlobi4KKy8vIFNwZXJyZSBoZWlzc3QgaGllciwgZGFzcyBkZXIgRmVobGVyIHZvbSBFeHBpcmUgbmljaHQgYXV0b21hdGlzY2ggZ2Vsb2VzY2h0CisvLyB3aXJkLgordmFyYXJncyBpbnQgTG9ja0lzc3VlKGludCBpc3N1ZWlkLCBzdHJpbmcgbm90ZSkgeworICAgIHJldHVybiBzZXRfbG9jayhpc3N1ZWlkLCAxLCBub3RlKTsKK30KKwordmFyYXJncyBpbnQgVW5sb2NrSXNzdWUoaW50IGlzc3VlaWQsIHN0cmluZyBub3RlKSB7CisgICAgcmV0dXJuIHNldF9sb2NrKGlzc3VlaWQsIDAsIG5vdGUpOworfQorCisvLyBlaW5lbiBGZWhsZXIgYWxzIGdlZml4dCBtYXJraWVyZW4KK3ZhcmFyZ3MgaW50IFJlc29sdmVJc3N1ZShpbnQgaXNzdWVpZCwgc3RyaW5nIG5vdGUpIHsKKyAgICByZXR1cm4gc2V0X3Jlc29sdXRpb24oaXNzdWVpZCwgMSwgbm90ZSk7Cit9CisvLyBlaW5lbiBGZWhsZXIgYWxzIG5pY2h0IGdlZml4dCBtYXJraWVyZW4KK3ZhcmFyZ3MgaW50IFJlT3Blbklzc3VlKGludCBpc3N1ZWlkLCBzdHJpbmcgbm90ZSkgeworICAgIHJldHVybiBzZXRfcmVzb2x1dGlvbihpc3N1ZWlkLCAwLCBub3RlKTsKK30KKwordmFyYXJncyBpbnQgQWRkTm90ZShpbnQgaXNzdWVpZCwgc3RyaW5nIG5vdGUpCit7CisKKyAgICBpZiAoIXN0cmluZ3Aobm90ZSkgfHwgIXNpemVvZihub3RlKSkKKyAgICAgIHJldHVybigtMyk7CisKKyAgICAvLyBleGlzdGllcnQgZGllIElEIGluIGRlciBEQj8KKyAgICBzdHJ1Y3QgZnVsbGlzc3VlX3MgaXNzdWUgPSBkYl9nZXRfaXNzdWUoaXNzdWVpZCwwKTsKKyAgICBpZiAoIWlzc3VlKQorICAgICAgcmV0dXJuIC0xOworCisgICAgaWYgKCFhY2Nlc3NfY2hlY2soaXNzdWUtPnVpZCwgTV9XUklURSkpCisgICAgICAgIC8venVncmlmZiB6dW0gU2NocmVpYmVuIG5pY2h0IGdlc3RhdHRldAorICAgICAgICByZXR1cm4oLTEwKTsKKworICAgIHJldHVybiBkYl9hZGRfbm90ZSgoPG5vdGVfcz4gaWQ6IGlzc3VlaWQsIHRpbWU6IHRpbWUoKSwgdXNlcjogZ2V0dWlkKFRJKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR4dDogbm90ZSkpOworfQorCisvL0VpbmVuIGJlc3RpbW10ZW4gRmVobGVyIGVpbmVyIGFuZGVyZW4gVUlEIHp1d2Vpc2VuLgorLy9IYXNoa2V5IGlzdCB6d2FyIGVpbmRldXRpZywgYWJlciBBbmdhYmUgZGVyCisvL2RlciBVSUQgaXN0IGRldXRsaWNoIHNjaG5lbGxlci4gV2VnbGFzc2VuIGRlcyBUeXBzIG5vY2htYWwgbGFuZ3NhbWVyLiA7LSkKKy8vUG90ZW50aWVsbCBhbHNvIHNlaHIgdGV1ZXIsIHdlbm4gbWFuIFVJRCBvZGVyIFVJRCtUeXAgd2VnbGFlc3N0LgordmFyYXJncyBpbnQgUmVhc3NpZ25Jc3N1ZShpbnQgaXNzdWVpZCwgc3RyaW5nIG5ld3VpZCwgc3RyaW5nIG5vdGUpCit7CisgICAgc3RydWN0IGZ1bGxpc3N1ZV9zIGlzc3VlID0gZGJfZ2V0X2lzc3VlKGlzc3VlaWQsMCk7CisgICAgaWYgKCFpc3N1ZSkKKyAgICAgIHJldHVybiAtMTsKKworICAgIGlmICghYWNjZXNzX2NoZWNrKGlzc3VlLT51aWQsIE1fUkVBU1NJR04pKQorICAgICAgICAvL3p1Z3JpZmYgenVtIFNjaHJlaWJlbiBuaWNodCBnZXN0YXR0ZXQKKyAgICAgICAgcmV0dXJuKC0xMCk7CisKKyAgICByZXR1cm4gZGJfcmVhc3NpZ25faXNzdWUoaXNzdWVpZCwgbmV3dWlkLCBub3RlKTsKK30KKworLyogKioqKioqKioqKiogRWhlciBmdWVyIERlYnVnLVp3ZWNrZSAqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyoKK21peGVkIFF1ZXJ5QWxsKGludCB0eXBlKSB7CisgICAgLy9kYXMga29lbm50ZSBlaW4gc2VociBzZWhyIGdyb3NzZXMgTWFwcGluZyBzZWluLCBhdXNzZXJkZW0gd2lyZCBrZWluZQorICAgIC8vS29waWUgenVydWVja2dlZ2ViZW4sIGRhaGVyIGVyc3RtYWwgbnVyIGljaC4uLgorICAgIGlmICghdGhpc19pbnRlcmFjdGl2ZSgpIHx8IAorICAgICAgICBtZW1iZXIoTUFJTlRBSU5FUixnZXR1aWQodGhpc19pbnRlcmFjdGl2ZSgpKSk8MCkKKyAgICAgICAgcmV0dXJuKC0xKTsKKyAgICBpZiAocHJvY2Vzc19jYWxsKCkpIHJldHVybigtMik7CisgICAgaWYgKCF0eXBlKSByZXR1cm4oLTMpOworICAgIHJldHVybihlcnJvcnNbdHlwZV0pOworfQorCittaXhlZCBRdWVyeVJlc29sdmVkKCkKK3sKKyAgICAvL2RhcyBrb2VubnRlIGVpbiBzZWhyIHNlaHIgZ3Jvc3NlcyBNYXBwaW5nIHNlaW4sIGF1c3NlcmRlbSB3aXJkIGtlaW5lCisgICAgLy9Lb3BpZSB6dXJ1ZWNrZ2VnZWJlbiwgZGFoZXIgZXJzdG1hbCBudXIgaWNoLi4uCisgICAgaWYgKCF0aGlzX2ludGVyYWN0aXZlKCkgfHwgCisgICAgICAgIG1lbWJlcihNQUlOVEFJTkVSLGdldHVpZCh0aGlzX2ludGVyYWN0aXZlKCkpKTwwKQorICAgICAgICByZXR1cm4oLTEpOworICAgIGlmIChwcm9jZXNzX2NhbGwoKSkgcmV0dXJuKC0yKTsKKyAgICByZXR1cm4ocmVzb2x2ZWQpOworfQorKi8KKworLyogKioqKioqKioqKioqKioqKiogIEludGVybmFsIFN0dWZmICAgKioqKioqKioqKioqKioqKioqKiogKi8KK3ZvaWQgY3JlYXRlKCkgeworICAgIHNldGV1aWQoZ2V0dWlkKE1FKSk7CisKKyAgICBpZiAoc2xfb3BlbigiL3NlY3VyZS9BUkNIL2Vycm9yZC5zcWxpdGUiKSAhPSAxKQorICAgIC8vaWYgKHNsX29wZW4oIi9lcnJvcmQuc3FsaXRlIikgIT0gMSkKKyAgICB7CisgICAgICByYWlzZV9lcnJvcigiRGF0ZW5iYW5rIGtvbm50ZSBuaWNodCBnZW9lZmZuZXQgd2VyZGVuLlxuIik7CisgICAgfQorICAgIHNsX2V4ZWMoIlBSQUdNQSBmb3JlaWduX2tleXMgPSBPTjsgUFJBR01BIHRlbXBfc3RvcmUgPSAyOyAiKTsKKyAgICAvL3N0cmluZyogcmVzPXNsX2V4ZWMoIlBSQUdNQSBxdWlja19jaGVjayhOKTsiKTsKKyAgICAvL2lmIChwb2ludGVycChyZXMpKQorICAgIC8veworICAgIC8vICByYWlzZV9lcnJvcigiIik7CisgICAgLy99CisgICAgLy9zbF9leGVjKCJDUkVBVEUgVEFCTEUgaXNzdWUoaWQgSU5URUdFUixoYXNrZXkgVEVYVCk7Iik7CisgICAgZm9yZWFjaCAoc3RyaW5nIGNtZCA6CisgICAgICAgIGV4cGxvZGUocmVhZF9maWxlKCIvc2VjdXJlL0FSQ0gvZXJyb3JkLnNxbC5pbml0IiksIjtcbiIpKQorICAgIHsKKyAgICAgIGlmIChzaXplb2YoY21kKSAmJiBjbWQgIT0gIlxuIikKKyAgICAgIHsKKyAgICAgICAgc2xfZXhlYyhjbWQpOworICAgICAgfQorICAgIH0KKyAgICBzbF9leGVjKCJBTkFMWVpFIG1haW47Iik7CisKKyAgICBsYXN0ZXJyb3I9KFtdKTsKK30KKworc3RyaW5nIG5hbWUoKSB7cmV0dXJuKCI8RXJyb3ItRGFlbW9uPiIpO30KKwordm9pZCBzYXZlX21lKGludCBub3cpIHsKKyAgaWYgKG5vdykKKyAgICBzYXZlX29iamVjdChTQVZFRklMRSk7CisgIGVsc2UgaWYgKGZpbmRfY2FsbF9vdXQoIydzYXZlX29iamVjdCk9PS0xKSB7CisgICAgY2FsbF9vdXQoIydzYXZlX29iamVjdCwgMzAsIFNBVkVGSUxFKTsKKyAgfQorfQorCit2YXJhcmdzIGludCByZW1vdmUoaW50IHNpbGVudCkgeworICAgIHNhdmVfbWUoMSk7CisgICAgZGVzdHJ1Y3QoTUUpOworICAgIHJldHVybigxKTsKK30KKworCisvLyBzcGVycnQgZGVuIEVpbnRyYWcgKGxvY2shPTApIG9kZXIgZW50c3BlcnJ0IGlobiAobG9jaz09MCkuIAorLy8gU3BlcnJlIGhlaXNzdCBoaWVyLCBkYXNzIGRlciBGZWhsZXIgdm9tIEV4cGlyZSBuaWNodCBhdXRvbWF0aXNjaCBnZWxvZXNjaHQKKy8vIHdpcmQuCisvLyBsaWVmZXJ0IDwwIGltIEZlaGxlcmZhbGwsIHNvbnN0IEFycmF5IG1pdCBMb2NrZGF0ZW4KK3ByaXZhdGUgdmFyYXJncyBpbnQgc2V0X2xvY2soaW50IGlzc3VlaWQsIGludCBsb2NrLCBzdHJpbmcgbm90ZSkKK3sKKyAgICBzdHJ1Y3QgZnVsbGlzc3VlX3MgaXNzdWUgPSBkYl9nZXRfaXNzdWUoaXNzdWVpZCwwKTsKKyAgICBpZiAoIWlzc3VlKQorICAgICAgcmV0dXJuIC0xOworCisgICAgaWYgKCFhY2Nlc3NfY2hlY2soaXNzdWUtPnVpZCwgTV9XUklURSkpCisgICAgICAgIC8venVncmlmZiB6dW0gU2NocmVpYmVuIG5pY2h0IGdlc3RhdHRldAorICAgICAgICByZXR1cm4oLTEwKTsKKworICAgIHJldHVybiBkYl9zZXRfbG9jayhpc3N1ZWlkLCBsb2NrLCBub3RlKTsKK30KKworLy9tYXJraWVydCBlaW5lbiBGZWhsZXIgYWxzIGdlZml4dCwgbWl0ICdub3RlJyBhbHMgQmVtZXJrdW5nIChyZXMhPTApIG9kZXIKKy8vbWFya2llcnQgZWluZW4gRmVobGVyIHdpZWRlciBhbHMgbmljaHQtZ2VmaXh0IChyZXNvbHV0aW9uPT0wKQorLy9saWVmZXJ0IDwgMCBpbSBGZWhsZXJmYWxsLCBzb25zdCBkZW4gbmV1ZW4gWnVzdGFuZC4KK3ByaXZhdGUgdmFyYXJncyBpbnQgc2V0X3Jlc29sdXRpb24oaW50IGlzc3VlaWQsIGludCByZXNvbHV0aW9uLCBzdHJpbmcgbm90ZSkKK3sKKyAgICBzdHJ1Y3QgZnVsbGlzc3VlX3MgaXNzdWUgPSBkYl9nZXRfaXNzdWUoaXNzdWVpZCwwKTsKKyAgICBpZiAoIWlzc3VlKQorICAgICAgcmV0dXJuIC0xOworCisgICAgLy8gRml4ZW4gZHVlcmZlbiBudXIgenVzdGFlbmRpZ2UKKyAgICBpZiAocmVzb2x1dGlvbgorICAgICAgICAmJiAhYWNjZXNzX2NoZWNrKGlzc3VlLT51aWQsIE1fRklYKSkKKyAgICAgIHJldHVybiAtMTA7CisgICAgLy8gZ2dmLiBGaXggenVydWVja3ppZWhlbiBkYXJmIGplZGVyIG1pdCBNX1dSSVRFCisgICAgaWYgKCFyZXNvbHV0aW9uICYmCisgICAgICAgICFhY2Nlc3NfY2hlY2soaXNzdWUtPnVpZCwgTV9XUklURSkpCisgICAgICByZXR1cm4gLTEwOworCisgICAgaW50IHJlcyA9IGRiX3NldF9yZXNvbHV0aW9uKGlzc3VlaWQsIHJlc29sdXRpb24sIG5vdGUpOworCisgICAgaWYgKHJlcyA9PSAxKQorICAgIHsKKyAgICAgIC8vIEZlaGxlciBqZXR6dCBnZWZpeHQuCisgICAgICB2ZXJzZW5kZV9tYWlsKGRiX2dldF9pc3N1ZShpc3N1ZWlkLDApKTsgIC8vIHBlciBNYWlsIHZlcnNjaGlja2VuCisgICAgfQorCisgICAgcmV0dXJuIHJlczsKK30KKworLy9pc3QgZGVyIFp1Z3JpZmYgYXVmIHVpZCBlcmxhdWJ0PyBHZXBydWVmdCB3aXJkIFRJICh3ZW5uIGtlaW4gVEksIGF1Y2gga2VpbgorLy9TY2hyZWlienVncmlmZikKKy8vbW9kZSBnaWJ0IGFuLCBvYiBsZXNlbmQgb2RlciBzY2hyZWliZW5kCitwcml2YXRlIGludCBhY2Nlc3NfY2hlY2soc3RyaW5nIHVpZCwgaW50IG1vZGUpIHsKKworICAgIGlmIChtb2RlPT1NX1JFQUQpCisgICAgICAgIHJldHVybiBMRUFSTkVSX1NFQ1VSSVRZOyAgLy9sZXNlbiBkYXJmIGplZGVyIE1hZ2llcgorCisgICAgLy8gSW4gcHJvY2Vzc19zdHJpbmcoKSBzY2hvbm1hbCBnYXIgbmljaHQuCisgICAgaWYgKHByb2Nlc3NfY2FsbCgpKSByZXR1cm4oMCk7CisgICAgLy8gRU0rIGR1ZXJmZW4gYWxsZXMgbG9lc2NoZW4uCisgICAgaWYgKEFSQ0hfU0VDVVJJVFkpIHJldHVybigxKTsKKyAgICAvLyBlaWdlbmUgVUlEcyBkYXJmIG1hbiBhdWNoIHZvbGx1bWZhZW5nbGljaCBiZWFyYmVpdGVuLgorICAgIGlmIChzZWN1cmVfZXVpZCgpPT11aWQpIHJldHVybigxKTsKKworICAgIC8vIGFsbGVzIGFuZGVyZSB3aXJkIHNwZXppZWxsIGdlcHJ1ZWZ0CisgICAgc3dpdGNoKG1vZGUpCisgICAgeworICAgICAgLy8gTV9XUklURSBpc3QgenVyIHplaXQgZWlnZW50bGljaCBpbW1lciBuZW4gQXBwZW5kIC0gZGFzIGR1ZXJmZW4genVyCisgICAgICAvLyBaZWl0IGFsbGUgYWIgVm9sbG1hZ2llcgorICAgICAgY2FzZSBNX1dSSVRFOgorICAgICAgICByZXR1cm4gTEVBUk5FUl9TRUNVUklUWTsKKyAgICAgICAgYnJlYWs7CisgICAgICAvLyBMb2VzY2hlbiB1bmQgRml4ZW4gZHVlcmZlbiB6dXIgWmVpdCBudXIgWnVzdGFlbmRpZ2UuCisgICAgICBjYXNlIE1fREVMRVRFOgorICAgICAgY2FzZSBNX1JFQVNTSUdOOgorICAgICAgY2FzZSBNX0ZJWDoKKyAgICAgICAgLy8gTWFzdGVyIG5hY2ggVUlEcyBmcmFnZW4sIGZ1ZXIgZGllIGRlciBqZXcuIE1hZ2llcgorICAgICAgICAvLyB6dXN0YWVuZGlnIGlzdC4KKyAgICAgICAgaWYgKG1lbWJlcigoc3RyaW5nICopbWFzdGVyKCktPlF1ZXJ5VUlEc0ZvcldpemFyZChzZWN1cmVfZXVpZCgpKSx1aWQpID49IDApCisgICAgICAgICAgcmV0dXJuIDE7CisKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuKDApOyAgICAgICAgLy9GYWxsLXRocm91Z2gsIG5laW5STkVSX1NFQ1VSSVRZCit9CisKK3B1YmxpYyBzdHJpbmcgZm9ybWF0X3N0YWNrdHJhY2Uoc3RydWN0IGZyYW1lX3MqIHN0YWNrdHJhY2UpIHsKKyAgICBzdHJpbmcgKmxpbmVzOworCisgICAgaWYgKCFwb2ludGVycChzdGFja3RyYWNlKSB8fCAhc2l6ZW9mKHN0YWNrdHJhY2UpKQorICAgICAgICByZXR1cm4oIiIpOworCisgICAgbGluZXM9YWxsb2NhdGUoc2l6ZW9mKHN0YWNrdHJhY2UpKTsKKyAgICBpbnQgaTsKKyAgICBmb3JlYWNoKHN0cnVjdCBmcmFtZV9zIGZyYW1lOiBzdGFja3RyYWNlKQorICAgIHsKKyAgICAgIGxpbmVzW2ldPXNwcmludGYoIkZ1bjogJS4yME8gaW4gUHJvZzogJS40MHNcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgIiAgIFplaWxlOiAlLjhkIFslLjUwc11cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgIiAgIEV2YWxjb3N0czogJWQiLAorICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS0+bmFtZSxmcmFtZS0+cHJvZywKKyAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUtPmxvYyxmcmFtZS0+b2JqLGZyYW1lLT50aWNrcyk7CisgICAgICArK2k7CisgICAgfQorICAgIHJldHVybihpbXBsb2RlKGxpbmVzLCJcbiIpKTsKK30KKworcHVibGljIHN0cmluZyBmb3JtYXRfbm90ZXMoc3RydWN0IG5vdGVfcyogbm90ZXMpCit7CisgIGludCBpOworICBzdHJpbmcgdGV4dD0iIjsKKyAgZm9yZWFjaChzdHJ1Y3Qgbm90ZV9zIG5vdGU6IG5vdGVzKQorICB7CisgICAgdGV4dCs9c3ByaW50ZigiTm90aXogJWQgdm9uICUuMTBzIGFtICUuMzBzXG4lcyIsCisgICAgICAgICsraSxjYXBpdGFsaXplKG5vdGUtPnVzZXIpLGR0aW1lKG5vdGUtPnRpbWUpLAorICAgICAgICBicmVha19zdHJpbmcobm90ZS0+dHh0LCA3OCwiICAiKSk7CisgIH0KKyAgcmV0dXJuIHRleHQ7Cit9CisKK3B1YmxpYyBzdHJpbmcgZm9ybWF0X2Vycm9yX3NwaWVsZXIoc3RydWN0IGZ1bGxpc3N1ZV9zIGlzc3VlKQoreworICBzdHJpbmcgdHh0OworICBzdHJpbmcgKmxhYmVsOworCisgIGlmICghaXNzdWUpCisgICAgcmV0dXJuIDA7CisKKyAgc3dpdGNoKGlzc3VlLT50eXBlKQorICB7CisgICAgY2FzZSBUX1JURVJST1I6CisgICAgICBsYWJlbD0oeyJMYXVmemVpdGZlaGxlciIsIkRpZXNlciBMYXVmemVpdGZlaGxlciJ9KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVF9SRVBPUlRFRF9FUlI6CisgICAgICBsYWJlbD0oeyJGZWhsZXJoaW53ZWlzIiwiRGllc2VyIEZlaGxlcmhpbndlaXMifSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRfUkVQT1JURURfVFlQTzoKKyAgICAgIGxhYmVsPSh7IlR5cG8iLCJEaWVzZXIgVHlwbyJ9KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVF9SRVBPUlRFRF9JREVBOgorICAgICAgbGFiZWw9KHsiSWRlZSIsIkRpZXNlIElkZWUifSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRfUkVQT1JURURfTUQ6CisgICAgICBsYWJlbD0oeyJGZWhsZW5kZXMgRGV0YWlsIiwiRGllc2VzIGZlaGxlbmRlIERldGFpbCJ9KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVF9SVFdBUk46CisgICAgICBsYWJlbD0oeyJMYXVmemVpdHdhcm51bmciLCJEaWVzZSBMYXVmemVpdHdhcm51bmcifSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRfQ1RXQVJOOgorICAgICAgbGFiZWw9KHsiTGFkZXplaXR3YXJudW5nIiwiRGllc2UgTGFkZXplaXR3YXJudW5nIn0pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUX0NURVJST1I6CisgICAgICBsYWJlbD0oeyJMYWRlemVpdGZlaGxlciIsIkRpZXNlciBMYWRlemVpdGZlaGxlciJ9KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6IHJldHVybiAwOworICB9CisKKyAgdHh0PXNwcmludGYoICJcbkRhdGVuIGZ1ZXIgJXMgbWl0IElEICclcyc6XG4iCisgICAgICAgICAgICAgICAiWmVpdDogJTI1c1xuIiwKKyAgICAgICAgICAgICAgIGxhYmVsWzBdLCBpc3N1ZS0+aGFzaGtleSwKKyAgICAgICAgICAgICAgIGR0aW1lKGlzc3VlLT5jdGltZSkKKyAgICAgICAgICAgICAgKTsKKworICB0eHQrPXNwcmludGYoIiVzIixicmVha19zdHJpbmcoaXNzdWUtPm1lc3NhZ2UsNzgsCisgICAgICAgICAgICAgICAgICAiTWVsZHVuZzogICAgIixCU19JTkRFTlRfT05DRSkpOworCisgIGlmIChwb2ludGVycChpc3N1ZS0+bm90ZXMpKQorICAgICAgdHh0Kz0iQmVtZXJrdW5nZW46XG4iK2Zvcm1hdF9ub3Rlcyhpc3N1ZS0+bm90ZXMpKyJcbiI7CisKKyAgcmV0dXJuIHR4dDsKK30KKworcHVibGljIHN0cmluZyBmb3JtYXRfZXJyb3Ioc3RydWN0IGZ1bGxpc3N1ZV9zIGlzc3VlLCBpbnQgb25seV9lc3NlbnRpYWwpCit7CisgIHN0cmluZyB0eHQ7CisgIHN0cmluZyAqbGFiZWw7CisKKyAgaWYgKCFpc3N1ZSkKKyAgICByZXR1cm4gMDsKKworICBzd2l0Y2goaXNzdWUtPnR5cGUpCisgIHsKKyAgICBjYXNlIFRfUlRFUlJPUjoKKyAgICAgIGxhYmVsPSh7IkxhdWZ6ZWl0ZmVobGVyIiwiRGllc2VyIExhdWZ6ZWl0ZmVobGVyIn0pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUX1JFUE9SVEVEX0VSUjoKKyAgICAgIGxhYmVsPSh7IkZlaGxlcmhpbndlaXMiLCJEaWVzZXIgRmVobGVyaGlud2VpcyJ9KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVF9SRVBPUlRFRF9UWVBPOgorICAgICAgbGFiZWw9KHsiVHlwbyIsIkRpZXNlciBUeXBvIn0pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUX1JFUE9SVEVEX0lERUE6CisgICAgICBsYWJlbD0oeyJJZGVlIiwiRGllc2UgSWRlZSJ9KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVF9SRVBPUlRFRF9NRDoKKyAgICAgIGxhYmVsPSh7IkZlaGxlbmRlcyBEZXRhaWwiLCJEaWVzZXMgZmVobGVuZGUgRGV0YWlsIn0pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUX1JUV0FSTjoKKyAgICAgIGxhYmVsPSh7IkxhdWZ6ZWl0d2FybnVuZyIsIkRpZXNlIExhdWZ6ZWl0d2FybnVuZyJ9KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVF9DVFdBUk46CisgICAgICBsYWJlbD0oeyJMYWRlemVpdHdhcm51bmciLCJEaWVzZSBMYWRlemVpdHdhcm51bmcifSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRfQ1RFUlJPUjoKKyAgICAgIGxhYmVsPSh7IkxhZGV6ZWl0ZmVobGVyIiwiRGllc2VyIExhZGV6ZWl0ZmVobGVyIn0pOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDogcmV0dXJuIDA7CisgIH0KKworICB0eHQ9c3ByaW50ZiggIlxuRGF0ZW4gZnVlciAlcyBtaXQgSUQgJWQ6XG4iCisgICAgICAgICAgICAgICAiSGFzaGtleTogJXNcbiIKKyAgICAgICAgICAgICAgICJaZWl0OiAlMjVzIChFcnN0bWFsaWc6ICUyNXMpXG4iLAorICAgICAgICAgICAgICAgbGFiZWxbMF0sIGlzc3VlLT5pZCwgaXNzdWUtPmhhc2hrZXksCisgICAgICAgICAgICAgICBkdGltZShhYnMoaXNzdWUtPm10aW1lKSksZHRpbWUoaXNzdWUtPmN0aW1lKQorICAgICAgICAgICAgICApOworCisgIGlmIChzdHJpbmdwKGlzc3VlLT5wcm9nKSkKKyAgICAgIHR4dCArPSBzcHJpbnRmKAorICAgICAgICAgICAgICAgIlByb2dyYW1tOiAgICUuNjBzXG4iCisgICAgICAgICAgICAgICAiWmVpbGU6ICAgICAgJS42MGRcbiIsCisgICAgICAgICAgICAgICBpc3N1ZS0+cHJvZywgaXNzdWUtPmxvYworICAgICAgICAgICAgICAgKTsKKworICBpZiAoc3RyaW5ncChpc3N1ZS0+b2JqKSkKKyAgICAgIHR4dCs9c3ByaW50ZigiT2JqZWt0OiAgICAgJS42MHNcbiIsCisgICAgICAgICAgICAgICBpc3N1ZS0+b2JqKTsKKworICB0eHQgKz0gc3ByaW50ZigiTG9hZG5hbWU6ICAgJS42MHNcbiIKKyAgICAgICAgICAgICAgICAgIlVJRDogICAgICAgICUuNjBzXG4iLAorICAgICAgICAgICAgICAgICBpc3N1ZS0+bG9hZG5hbWUsIGlzc3VlLT51aWQpOworCisgIHR4dCs9c3ByaW50ZigiJXMiLGJyZWFrX3N0cmluZyhpc3N1ZS0+bWVzc2FnZSw3OCwKKyAgICAgICAgICAgICAgICAgICJNZWxkdW5nOiAgICAiLEJTX0lOREVOVF9PTkNFKSk7CisgIGlmIChzdHJpbmdwKGlzc3VlLT5oYm9iaikpCisgICAgICB0eHQrPXNwcmludGYoCisgICAgICAgICAgICAgICAiSEItT2JqOiAgICAgJS42MHNcbiIsaXNzdWUtPmhib2JqKTsKKworICBpZiAoc3RyaW5ncChpc3N1ZS0+dGl0cCkpIHsKKyAgICAgIHR4dCs9c3ByaW50ZigKKyAgICAgICAgICAgICAgICJUSS9UUDogICAgICAlLjYwc1xuIixpc3N1ZS0+dGl0cCk7CisgICAgICBpZiAoc3RyaW5ncChpc3N1ZS0+dGllbnYpKQorICAgICAgICAgIHR4dCs9c3ByaW50ZigKKyAgICAgICAgICAgICAgICJFbnZpcm9ubS46ICAlLjYwc1xuIixpc3N1ZS0+dGllbnYpOworICB9CisKKyAgaWYgKCFzdHJpbmdwKGlzc3VlLT5jb21tYW5kKSB8fAorICAgICAgIUFSQ0hfU0VDVVJJVFkgfHwgcHJvY2Vzc19jYWxsKCkpCisgIHsKKyAgICAgIC8vIEtvbW1hbmRvZWluZ2FiZSBpc3QgUHJpdmF0c3BoYWVyZSB1bmQgZGFyZiBuaWNodCB2b24gamVkZW0gZWluc2VoYmFyCisgICAgICAvLyBzZWluLgorICAgICAgLy8gaW4gZGllc2VtIEZhbGwgYWJlciB6dW1pbmRlc3QgZGFzIFZlcmIgYXVzZ2ViZW4sIHNvIHZvcmhhbmRlbgorICAgICAgaWYgKGlzc3VlLT52ZXJiKQorICAgICAgICAgIHR4dCs9c3ByaW50ZigKKyAgICAgICAgICAgICAgIlZlcmI6ICAgICAgICAlLjYwc1xuIixpc3N1ZS0+dmVyYik7CisgIH0KKyAgLy8gIXByb2Nlc3NfY2FsbCgpICYmIEFSQ0hfU0VDVVJJVFkgZXJmdWVsbHQuLi4KKyAgZWxzZSBpZiAoc3RyaW5ncChpc3N1ZS0+Y29tbWFuZCkpCisgICAgICB0eHQrPXNwcmludGYoCisgICAgICAgICAgIkJlZmVobDogICAgICUuNjBzXG4iLGlzc3VlLT5jb21tYW5kKTsKKworICBpZiAoaXNzdWUtPmNhdWdodCkKKyAgICAgIHR4dCs9bGFiZWxbMV0rIiB0cmF0IGluIGVpbmVtICdjYXRjaCgpJyBhdWYuXG4iOworCisgIGlmICghb25seV9lc3NlbnRpYWwpCisgIHsKKyAgICBpZiAoaXNzdWUtPmRlbGV0ZWQpCisgICAgICAgIHR4dCs9bGFiZWxbMV0rIiB3dXJkZSBhbHMgZ2Vsb2VzY2h0IG1hcmtpZXJ0LlxuIjsKKworICAgIGlmIChpc3N1ZS0+bG9ja2VkKQorICAgICAgICB0eHQrPWJyZWFrX3N0cmluZygKKyAgICAgICAgICAgIHNwcmludGYoIiVzIHd1cmRlIHZvbiAlcyBhbSAlcyB2b3IgYXV0b21hdGlzY2hlbSBMb2VzY2hlbiAiCisgICAgICAgICAgICAiZ2VzY2h1ZXR6dCAobG9ja2VkKS5cbiIsCisgICAgICAgICAgICBsYWJlbFsxXSxpc3N1ZS0+bG9ja2VkX2J5LCBkdGltZShpc3N1ZS0+bG9ja2VkX3RpbWUpKSw3OCk7CisgICAgaWYgKGlzc3VlLT5yZXNvbHZlZCkKKyAgICAgICAgdHh0Kz1sYWJlbFsxXSsiIHd1cmRlIGFscyBlcmxlZGlndCBtYXJraWVydC5cbiI7CisgIH0KKworICB0eHQrPXNwcmludGYoIiVzIHRyYXQgYmlzaGVyICVkIE1hbCBhdWYuXG4iLAorICAgICAgICAgICAgICAgbGFiZWxbMV0saXNzdWUtPmNvdW50KTsKKworICBpZiAocG9pbnRlcnAoaXNzdWUtPnN0YWNrKSkKKyAgICAgIHR4dCs9IlN0YWNrdHJhY2U6XG4iK2Zvcm1hdF9zdGFja3RyYWNlKGlzc3VlLT5zdGFjaykrIlxuIjsKKworICBpZiAocG9pbnRlcnAoaXNzdWUtPm5vdGVzKSkKKyAgICAgIHR4dCs9IkJlbWVya3VuZ2VuOlxuIitmb3JtYXRfbm90ZXMoaXNzdWUtPm5vdGVzKSsiXG4iOworCisgIHJldHVybiB0eHQ7Cit9CisKKy8vIGxldHp0ZXIgQWVuZGVydW5nIGVpbmVzIFNwaWVsZXItL01hZ2llcnNhdmVmaWxlcy4gTmFlaGVydW5nIGZ1ZXIgbGV0enRlbgorLy8gTG9nb3V0IG9obmUgZGFzIFNhdmVmaWxlIGVpbnp1bGVzZW4gdW5kIFBfTEFTVF9MT0dPVVQgenUgcHJ1ZWZlbi4KK3ByaXZhdGUgaW50IHJlY2VudF9sYXN0bG9nb3V0KHN0cmluZyBuYW0sIGludCB2YWxpZHRpbWUpCit7CisgIGlmICghbmFtIHx8IHNpemVvZihuYW0pPDIpIHJldHVybiAwOworICByZXR1cm4gZmlsZV90aW1lKCIvIkxJQlNBVkVESVIiLyIgKyBuYW1bMC4uMF0gKyAiLyIgKyBuYW0gKyAiLm8iKSA+PSB2YWxpZHRpbWU7Cit9CisKKy8vIFZlcnNlbmRldCBNYWlsIGFuIHp1c3RhZW5kaWdlbiBNYWdpZXIgdW5kIGdnZi4gU3BpZWxlciwgZGVyIGRlbiBFaW50cmFnCisvLyBlcnN0ZWxsdCBoYXQuCisvLyBBQ0hUVU5HOiBsb2VzY2h0IGlzc3VlLT5jb21tYW5kLgorcHJpdmF0ZSBpbnQgdmVyc2VuZGVfbWFpbChzdHJ1Y3QgZnVsbGlzc3VlX3MgaXNzdWUpCit7CisgIC8vIFZlcnNlbmRldCBlaW5lIG1haWwgbWl0IGRlbSBnZWZpeHRlbiBGZWhsZXIuCisgIG1peGVkICptYWlsOworICBzdHJpbmcgdGV4dCwgKmVtcGY7CisgIGludCByZXMgPSAtMTsKKworICBtYWlsID0gYWxsb2NhdGUoOSk7CisgIG1haWxbTVNHX0ZST01dID0gIjxGZWhsZXItRGFlbW9uPiI7CisgIG1haWxbTVNHX1NFTkRFUl0gPSBnZXR1aWQoVEkpOworICBtYWlsW01TR19CQ0NdID0gMDsKKyAgbWFpbFtNU0dfU1VCSkVDVF0gPSBzcHJpbnRmKCJGZWhsZXIvV2FybnVuZyBpbiAlcyBiZWhvYmVuIiwgaXNzdWUtPmxvYWRuYW1lKTsKKyAgbWFpbFtNU0dfREFURV0gPSBkdGltZSh0aW1lKCkpOworCisgIC8vIGF1Y2ggd2VubiBlaW4gRU0gZml4dCwgc29sbGVuIGRpZSBFbXBmYWVuZ2VyIG5pY2h0IGF1dG9tYXRpc2NoIGRpZQorICAvLyBTcGllbGVyZWluZ2FiZSBlcmhhbHRlbiwgYWxzbyBjb21tYW5kIGxvZXNjaGVuLgorICBpc3N1ZS0+Y29tbWFuZCA9IDA7CisKKyAgLy8gZXJzdG1hbCBlaW5lIE1haWwgYW4genVzdGFlbmRpZ2UgTWFnaWVyLgorICBlbXBmID0gKHN0cmluZyopbWFzdGVyKCktPlF1ZXJ5V2l6YXJkc0ZvclVJRChpc3N1ZS0+dWlkKTsKKyAgLy8gbGFuZyAoMTgwIFRhZ2UpIG5pY2h0IGVpbmdlbG9nZ3RlIE1hZ2llciBhdXNmaWx0ZXJuCisgIGVtcGYgPSBmaWx0ZXIoZW1wZiwgIydyZWNlbnRfbGFzdGxvZ291dCwgdGltZSgpIC0gMTU1NTIwMDApOworICBpZiAoc2l6ZW9mKGVtcGYpKQorICB7CisKKyAgICB0ZXh0ID0gYnJlYWtfc3RyaW5nKAorICAgICAgc3ByaW50ZihTVEFOREFSRE1BSUxURVhULGNhcGl0YWxpemUoZ2V0dWlkKFRJKSkpCisgICAgICArZm9ybWF0X2Vycm9yKGlzc3VlLCAxKSw3OCwiIixCU19MRUFWRV9NWV9MRlMpOworCisgICAgbWFpbFtNU0dfUkVDSVBJRU5UXSA9IGVtcGZbMF07CisgICAgaWYgKHNpemVvZihlbXBmKT4xKQorICAgICAgbWFpbFtNU0dfQ0NdID0gZW1wZlsxLi5dOworICAgIGVsc2UKKyAgICAgIG1haWxbTVNHX0NDXSA9IDA7CisgICAgbWFpbFtNU0dfQk9EWV09dGV4dDsKKyAgICBtYWlsW01TR19JRF09c3ByaW50ZihNVUROQU1FIjogJWQuJWQiLHRpbWUoKSxyYW5kb20oX19JTlRfTUFYX18pKTsKKworICAgIGlmICghc2l6ZW9mKCIvc2VjdXJlL21haWxlciItPkRlbGl2ZXJNYWlsKG1haWwsMCkpKQorICAgICAgcmVzID0gLTE7IC8vIGFuIG5pZW1hbmRlbiBlcmZvbGdyZWljaCB6dWdlc3RlbGx0LiA6LSgKKyAgICBlbHNlCisgICAgICByZXMgPSAxOworICB9CisKKyAgLy8gQmVpIHZvbiBTcGllbGVybiBnZW1lbGRldGVuIEZlaGxlciB3ZXJkZW4gU3BpZWxlciBiZWkKKyAgLy8gRXJsZWRpZ3VuZyBpbmZvcm1pZXJ0LCB3ZW5uIGRlcmVuIGxldHp0ZXIgTG9nb3V0IHdlbmlnZXIgYWxzIDE4MCBUYWdlIGhlcgorICAvLyBpc3QuCisgIGlmICggKGlzc3VlLT50eXBlICYKKyAgICAgICAgKFRfUkVQT1JURURfRVJSfFRfUkVQT1JURURfVFlQT3xUX1JFUE9SVEVEX0lERUF8VF9SRVBPUlRFRF9NRCkpCisgICAgICAmJiBpc3N1ZS0+dGl0cAorICAgICAgJiYgcmVjZW50X2xhc3Rsb2dvdXQoaXNzdWUtPnRpdHAsIHRpbWUoKSAtIDE1NTUyMDAwKSApCisgIHsKKyAgICB0ZXh0ID0gYnJlYWtfc3RyaW5nKAorICAgICAgc3ByaW50ZihTVEFOREFSRE1BSUxURVhUX0VSUk9SSElOVCwKKyAgICAgICAgY2FwaXRhbGl6ZShpc3N1ZS0+dGl0cCksIGNhcGl0YWxpemUoZ2V0dWlkKFRJKSkpCisgICAgICArZm9ybWF0X2Vycm9yX3NwaWVsZXIoaXNzdWUpLCA3OCwiIixCU19MRUFWRV9NWV9MRlMpOworCisgICAgbWFpbFtNU0dfSURdPXNwcmludGYoTVVETkFNRSI6ICVkLiVkIix0aW1lKCkscmFuZG9tKF9fSU5UX01BWF9fKSk7CisgICAgbWFpbFtNU0dfUkVDSVBJRU5UXSA9IGlzc3VlLT50aXRwOworICAgIG1haWxbTVNHX0NDXSA9IDA7CisgICAgbWFpbFtNU0dfU1VCSkVDVF0gPSBzcHJpbnRmKCJGZWhsZXIvSWRlZS9UeXBvIHd1cmRlIHZvbiAlcyBiZWhvYmVuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0dWlkKFRJKSk7CisgICAgbWFpbFtNU0dfQk9EWV0gPSB0ZXh0OworCisgICAgaWYgKCFzaXplb2YoIi9zZWN1cmUvbWFpbGVyIi0+RGVsaXZlck1haWwobWFpbCwwKSkpCisgICAgICByZXMgfD0gLTE7CisgICAgZWxzZQorICAgICAgcmVzIHw9IDE7CisgIH0KKworICByZXR1cm4gcmVzOworfQorCit2b2lkIHJlc2V0KCkKK3sKKyAgLy8gZ2Vsb2VzY2h0ZSBJc3N1ZXMgc29mb3J0LCBnZWZpeHRlIDMwIFRhZ2UgbmFjaCBsZXR6dGVyIEFlbmRlcnVuZworICAvLyBsb2VzY2hlbi4KKyAgc2xfZXhlYygiREVMRVRFIEZST00gaXNzdWVzIFdIRVJFIGRlbGV0ZWQ9MTsiKTsKKyAgc2xfZXhlYygiREVMRVRFIEZST00gaXNzdWVzIFdIRVJFIHJlc29sdmVkPTEgQU5EIG10aW1lPD8xOyIsCisgICAgICAgICAgdGltZSgpLTMwKjI0KjM2MDApOworICBzZXRfbmV4dF9yZXNldCgzNjAwKjI0KTsKK30KKworLy8gTmljaHQgamVkZXIgTWFnaWVyIG11c3MgZGVuIEVycm9yRCBkaXJla3QgemVyc3RvZXJlbiBrb2VubmVuLgorcHVibGljIHN0cmluZyBOb3RpZnlEZXN0cnVjdChvYmplY3QgY2FsbGVyKSB7CisgIGlmKCAoY2FsbGVyIT10aGlzX29iamVjdCgpICYmICFBUkNIX1NFQ1VSSVRZKSB8fCBwcm9jZXNzX2NhbGwoKSApIHsKKyAgICByZXR1cm4gIkR1IGRhcmZzdCBkZW4gRXJyb3ItRGFlbW9uIG5pY2h0IHplcnN0b2VyZW4hXG4iOworICB9CisgIHJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9zZWN1cmUvZXJyb3JkLmggYi9zZWN1cmUvZXJyb3JkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ4MjMwMQotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9lcnJvcmQuaApAQCAtMCwwICsxLDExMiBAQAorLyogIE1vcmdlbkdyYXVlbiBNVURsaWIKKyAgICAvc3lzL2Vycm9yZC5oCisgICAgSGVhZGVyZmlsZSBmdWVyIGRlbiBFcnJvci1EYWVtb25lbgorICAgIEF1dG9yOiBaZXNzdHJhCisgICAgJElkOiBlcnJvcmQuaCA5NDM5IDIwMTYtMDEtMjAgMDk6NDg6MjhaIFplc3N0cmEgJAorICAgIGdnZi4gQ2hhbmdlbG9nOgorKi8KKworI2lmbmRlZiBfX0VSUk9SRF9IX18KKyNkZWZpbmUgX19FUlJPUkRfSF9fCisKKy8vIFR5cGVuCisjZGVmaW5lIFRfUlRFUlJPUiAgIDEJICAgLy9SdW50aW1lIEVycm9yIC8gTGF1ZnplaXRmZWhsZXIKKyNkZWZpbmUgVF9SVFdBUk4gICAgMiAgICAvL1J1bnRpbWUgV2FybmluZyAvIExhdWZ6ZWl0d2FybnVuZworI2RlZmluZSBUX0NURVJST1IgICA0ICAgIC8vQ29tcGlsZXRpbWUgRXJyb3IgLyBGZWhsZXIgYmVpbSBVZWJlcnNldHplbgorI2RlZmluZSBUX0NUV0FSTiAgICA4ICAgIC8vQ29tcGlsZXRpbWUgV2FybmluZyAvIFdhcm51bmcgYmVpbSBVZWJlcnNldHplbgorI2RlZmluZSBUX1JFUE9SVEVEX0VSUiAgIDE2ICAgLy8gdm9uIFNwaWVsZXJuIGdlbWVsZGV0ZSBCdWdzCisjZGVmaW5lIFRfUkVQT1JURURfVFlQTyAgMzIgICAvLyB2b24gU3BpZWxlcm4gZ2VtZWxkZXRlIFR5cG9zCisjZGVmaW5lIFRfUkVQT1JURURfSURFQSAgNjQgICAvLyB2b24gU3BpZWxlcm4gZ2VtZWxkZXRlIElkZWVuIAorI2RlZmluZSBUX1JFUE9SVEVEX01EICAgIDEyOCAgLy8gdm9uIFNwaWVsZXJuIGdlbWVsZGV0ZSBmZWhsZW5kZSBEZXRhaWxzCisjZGVmaW5lIEFMTF9FUlJfVFlQRVMgKHtUX1JURVJST1IsIFRfUlRXQVJOLCBUX0NURVJST1IsIFRfQ1RXQVJOLCBcCisgICAgICAgICAgICAgICAgICAgICAgICBUX1JFUE9SVEVEX0VSUiwgVF9SRVBPUlRFRF9UWVBPLCBUX1JFUE9SVEVEX0lERUEsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRfUkVQT1JURURfTUQgfSkKKworLy8gU3RhdHVzCisjZGVmaW5lIFNUQVRfREVMRVRFRCAgMHgxCisjZGVmaW5lIFNUQVRfTE9DS0VEICAgMHgyCisjZGVmaW5lIFNUQVRfUkVTT0xWRUQgMHg0CisKKy8vIEFjaHR1bmc6IHZpZWxlIEtleXMga29lbm5lbiBuaWNodCB2b3JoYW5kZW4gb2RlciBXZXJ0ZSAwIHNlaW4hCisjZGVmaW5lIEZfSUQgICAgICAgICAgImlkIiAgICAgICAgICAvL2ludDogKHJvdykgSUQgaW4gZGVyIERCCisjZGVmaW5lIEZfVFlQRSAgICAgICAgInR5cGUiICAgICAgICAvL2ludDogVHlwLVdlcnRlLCBzLm8uCisjZGVmaW5lIEZfSEFTSEtFWSAgICAgImhhc2hrZXkiICAgICAvL3N0cmluZzogSGFzaGtleSBkZXMgRmVobGVycworI2RlZmluZSBGX1VJRCAgICAgICAgICJ1aWQiICAgICAgICAgLy9zdHJpbmc6ICJVSUQgZGVzIEZlaGxlcnMiCisjZGVmaW5lIEZfU1RBVEUgICAgICAgInN0YXRlIiAgICAgICAvL2ludDogU3RhdHVzLVdlcnRlLCBzLm8uCisjZGVmaW5lIEZfTU9EU1RBTVAgICAgIm10aW1lIiAgICAgICAvL2ludAorI2RlZmluZSBGX0NSRUFURVNUQU1QICJjdGltZSIgICAgICAgLy9pbnQKKyNkZWZpbmUgRl9SRUFEU1RBTVAgICAiYXRpbWUiICAgICAgIC8vaW50IAorI2RlZmluZSBGX1BST0cgICAgICAgICJwcm9nIiAgICAgICAgLy9zdHJpbmcgPT0gQmx1ZW5hbWUsIGZhbGxzIGtlaW4gcmVwbGFjZV9wcm9ncmFtKCkKKyNkZWZpbmUgRl9PQkogICAgICAgICAib2JqIiAgICAgICAgIC8vc3RyaW5nCisjZGVmaW5lIEZfTE9BRE5BTUUgICAgImxvYWRuYW1lIiAgICAvL3N0cmluZyA9PSBCbHVlbmFtZSwgZmFsbHMga2VpbiByZW5hbWVfb2JqZWN0KCkKKyNkZWZpbmUgRl9MSU5FICAgICAgICAibG9jIiAgICAgICAgIC8vaW50CisjZGVmaW5lIEZfTVNHICAgICAgICAgIm1lc3NhZ2UiICAgICAvL3N0cmluZworI2RlZmluZSBGX0hCX09CSiAgICAgICJoYm9iaiIgICAgICAgLy9zdHJpbmcKKyNkZWZpbmUgRl9DQVVHSFQgICAgICAiY2F1Z2h0IiAgICAgIC8vaW50CisjZGVmaW5lIEZfVElUUCAgICAgICAgInRpdHAiICAgICAgICAvL3N0cmluZworI2RlZmluZSBGX1NUQUNLICAgICAgICJzdGFjayIgICAgICAgLy9BcnJheSB2b24gbWl4ZWQgKG1peGVkKQorI2RlZmluZSBGX0NMSSAgICAgICAgICJjb21tYW5kIiAgICAgLy9zdHJpbmcgKFNwaWVsZXJlaW5nYWJlKQorI2RlZmluZSBGX1ZFUkIgICAgICAgICJ2ZXJiIiAgICAgICAgLy9zdHJpbmcgKEtvbW1hbmRvdmVyYikKKyNkZWZpbmUgRl9DT1VOVCAgICAgICAiY291bnQiICAgICAgIC8vaW50CisjZGVmaW5lIEZfVElFTlYgICAgICAgInRpZW52IiAgICAgICAvL3N0cmluZywgb2JqZWN0X25hbWUoKSB2b20gRW52IHZvbiBUSS9UUAorI2RlZmluZSBGX0xPQ0sgICAgICAgICJsb2NrZWQiICAgICAgLy9taXhlZCAoQXJyYXkgdm9uIDIgRWxlbWVudGVuKQorI2RlZmluZSBGX1JFU09MVkVSICAgICJyZXNvbHZlciIgICAgLy9zdHJpbmcgKHdlciBoYXQgZ2VmaXh0PykKKyNkZWZpbmUgRl9OT1RFUyAgICAgICAibm90ZXMiICAgICAgIC8vQmVtZXJrdW5nZW4sIEFycmF5IHZvbiAzLWVsZW1lbnRpZ2VuIEFycmF5cworCisvLyBQcm9wLCB3ZWxjaGUgaW4gL3BsYXllcnMvIGRhcyBMb2dnZW4gdm9uIEZlaGxlcm4gaW0gZXJyb3JkIHVudGVyYmluZGV0LgorI2RlZmluZSBQX0RPTlRfTE9HX0VSUk9SUyAgICAicF9saWJfZXJyb3JkX2RvbnRfbG9nIgorCisjaWZkZWYgX19ORUVEX0lNUExFTUVOVEFUSU9OX18KKworI2lmZGVmIERFQlVHCisjdW5kZWYgREVCVUcKKyNlbmRpZgorLy8jZGVmaW5lIERFQlVHKHgpCisjZGVmaW5lIERFQlVHKHgpICBpZiAoZnVuY2FsbChzeW1ib2xfZnVuY3Rpb24oJ2ZpbmRfcGxheWVyKSwiemVzc3RyYSIpKVwKKyAgICAgICAgdGVsbF9vYmplY3QoZnVuY2FsbChzeW1ib2xfZnVuY3Rpb24oJ2ZpbmRfcGxheWVyKSwiemVzc3RyYSIpLFwKKyAgICAgICAgIkVEQkc6ICIreCsiXG4iKQorCisvL1dlciBwZmxlZ3QgZGFzIERpbmcgaGllciBnZXJhZGU/CisjZGVmaW5lIE1BSU5UQUlORVIgKHsiemVzc3RyYSJ9KQorCisvL1N0YW5hcmQtRXhwaXJlCisjZGVmaW5lIFNUREVYUElSRSAyNjc4NDAwIC8vMzEgVGFnZQorCisvL0JsYWNrbGlzdCBmdWVyIEZpbGVzLCBkaWUgbmljaHQgZXJmYXNzdCB3ZXJkZW4gc29sbGVuIChudXIKKy8vVWViZXJzZXR6dW5nc3Byb2JsZW1lIG1vbWVudGFuKQorI2RlZmluZSBCTEFDS0xJU1QgKHsiLnRvb2wubHBjIiwiLnh0b29sLmgifSkKKworLy9adWdyaWZmc2FydGVuCisjZGVmaW5lIE1fUkVBRCAgIDEKKyNkZWZpbmUgTV9XUklURSAgMiAgLy8gYWN0dWFsbHk6IGFwcGVuZC1vbmx5CisjZGVmaW5lIE1fRklYICAgIDQKKyNkZWZpbmUgTV9SRUFTU0lHTiA4CisjZGVmaW5lIE1fREVMRVRFIDE2CisKKy8vIENoYW5nZWxvZworI2RlZmluZSBDSEFOR0VMT0cgIi9sb2cvQ0hBTkdFTE9HIgorCisvLyBMb2cKKy8vI2RlZmluZSBNQUlMTE9HICAgICAgICJzZW50LmxvZyIKKworLy8gU3RhbmRhcmRtYWlsdGV4dDogVE9ETyAKKy8vI2RlZmluZSBTVEFOREFSRFRFWFQgIEhPTUUoIm1haWx0ZXh0LnR4dCIpCisKKyNkZWZpbmUgU1RBTkRBUkRNQUlMVEVYVCAiSHVodSBsaWViZXIgTWl0bWFnaWVyLFxuXG4iIFwKKyAgICAiZGVyIHVudGVuIGFuZ2VnZWJlbmUgRmVobGVyIGluIGVpbmVtIE9iamVrdCwgZnVlciB3ZWxjaGVzIER1ICIgXAorICAgICIoYWxzIHByb2dyYW1taWVyZW5kZXIgTWFnaWVyIG9kZXIgUk0pIHp1c3RhZW5kaWcgYmlzdCwgd3VyZGUgc29lYmVuICIgXAorICAgICJ2b24gJXMgYWxzIGdlZml4dCBtYXJraWVydC4gQml0dGUgYmVhY2h0ZSBnZ2YuIGRpZSB1bnRlbiBhbmdlYmVuZW4gIiBcCisgICAgIkJlbWVya3VuZ2VuIHp1bSBGaXguXG5cbi0tLSBGZWhsZXItRGF0ZW4gLS0tXG4iCisKKyNkZWZpbmUgU1RBTkRBUkRNQUlMVEVYVF9FUlJPUkhJTlQgIkh1aHUgJXMsXG5cbiIgXAorICAgICJlaW4gdm9uIERpciBhYmdlc2V0enRlciBGZWhsZXIgKHMudS4pIHd1cmRlIHZvbiAlcyBiZWFyYmVpdGV0IHVuZCBhbHMgIiBcCisgICAgImVybGVkaWd0IG1hcmtpZXJ0LiBCZWkgRnJhZ2VuIHdlbmRlIERpY2ggRGljaCBiaXR0ZSBhbiBkZW4gIiBcCisgICAgImJlYXJiZWl0ZW5kZW4gTWFnaWVyLlxuIiBcCisgICAgIlZpZWxlbiBEYW5rIGZ1ZXIgRGVpbmUgTWl0aGlsZmUhXG5cbiIgXAorICAgICItLS0gRmVobGVyLURhdGVuIC0tLVxuIgorCisKKyNlbmRpZiAvLyBfX05FRURfSU1QTEVNRU5UQVRJT05fXworCisjZW5kaWYgLy8gX19FUlJPUkRfSF9fCisKZGlmZiAtLWdpdCBhL3NlY3VyZS9leHBsb3JhdGlvbi5oIGIvc2VjdXJlL2V4cGxvcmF0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdhZmI0MAotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9leHBsb3JhdGlvbi5oCkBAIC0wLDAgKzEsNzUgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBleHBsb3JhdGlvbi5oIC0tIERlZmluaXRpb25lbiBmdWVyIGRlbiBleHBsb3JhdGlvbm1hc3RlcgorLy8KKy8vICRJZDogZXhwbG9yYXRpb24uaCA4ODM1IDIwMTQtMDYtMDkgMjA6MjQ6MDBaIFplc3N0cmEgJAorCisjaWZuZGVmIF9fRVhQTE9SQVRJT05fSF9fCisjZGVmaW5lIF9fRVhQTE9SQVRJT05fSF9fCisKKy8qIERhdGVpbmFtZW4gKi8KKyNkZWZpbmUgRVBNQVNURVIgICAgIi9zZWN1cmUvZXhwbG9yYXRpb25tYXN0ZXIiCisjZGVmaW5lIEVQU0FWRUZJTEUgICIvc2VjdXJlL0FSQ0gvZXhwbG9yYXRpb24iCisjZGVmaW5lIERVTVBGSUxFICAgICIvc2VjdXJlL0FSQ0gvRVBST09NUy5kdW1wIgorI2RlZmluZSBNQUtFX0VQU1RBVCAiL3NlY3VyZS9BUkNIL2Vwc3RhdCIKKyNkZWZpbmUgRVBTVEFUX0lORk8gIi9zZWN1cmUvQVJDSC9lcHN0YXQubyIKKworLyogWmllbGUgdm9uIENoYW5nZUVQT2JqZWN0KCkgKi8KKyNkZWZpbmUgQ0hBTkdFX09CICAgMCAvLyBkYXMgT2JqZWt0IHNlbGJzdAorI2RlZmluZSBDSEFOR0VfS0VZICAxIC8vIFNjaGx1ZXNzZWwKKyNkZWZpbmUgQ0hBTkdFX1RZUEUgMiAvLyBkZXIgVHlwCisjZGVmaW5lIENIQU5HRV9CT05VUyAzIC8vIGlzdCBlcyBlaW4gQm9udXMtRVA/CisKKy8qIFBvc2l0aW9uZW4gaW0gTWFwcGluZyAqLworI2RlZmluZSBNUE9TX0tFWSAgMCAgIC8vIERpZSBTY2hsdWVzc2VsCisjZGVmaW5lIE1QT1NfTlVNICAxICAgLy8gTnVtbWVyIGRlcyBFUAorI2RlZmluZSBNUE9TX1RZUEUgMiAgIC8vIFR5cCAocy51LikKKworLyogVHlwZW4gdm9uIEVQLVNwZW5kZXJuICovCisjZGVmaW5lIEVQX0RFVEFJTCAwICAgLy8gRGV0YWlscywgU3BlY2lhbERldGFpbHMKKyNkZWZpbmUgRVBfRVhJVCAgIDEgICAvLyBFeGl0cyB1bmQgU3BlY2lhbEV4aXRzCisjZGVmaW5lIEVQX0NNRAkgIDIgICAvLyBBZGRDbWQoKS1Lb21tYW5kb3MKKyNkZWZpbmUgRVBfSU5GTyAgIDMgICAvLyBJbmZvcyB2b24gTlBDcworI2RlZmluZSBFUF9NSVNDICAgNCAgIC8vIGVpZ2VuZSBHaXZlRXhwbG9yYXRpb25Qb2ludCgpLUF1ZnJ1ZmUKKyNkZWZpbmUgRVBfUkRFVCAgIDUgICAvLyBSZWFkRGV0YWlscworI2RlZmluZSBFUF9QVUIgICAgNiAgIC8vIFNwZWlzZW4gdW5kIEdldHJhZW5rZSBpbiBLbmVpcGVuCisjZGVmaW5lIEVQX1NNRUxMICA3ICAgLy8gR2VydWVjaGUKKyNkZWZpbmUgRVBfU09VTkQgIDggICAvLyBHZXJhZXVzY2hlCisjZGVmaW5lIEVQX1RPVUNIICA5ICAgLy8gZXJ0YXN0YmFyZSBEZXRhaWxzCisjZGVmaW5lIEVQX01BWCAgICA5ICAgLy8gbWF4LiBBbnphaGwgdm9uIFR5cGVuCisKKyNkZWZpbmUgRVBfVFlQRVMgKHsgImRldCAiLCAiZXhpdCIsICJjbWQgIiwgImluZm8iLCAibWlzYyIsXAorICAgICAgICAgICAgICAgICAgICAicmRldCIsICJwdWIgIiwgInNtZSAiLCAic29uZCIsICJ0YXN0ZGV0IiB9KQorCisvKiBGZWhsZXIgYmVpIEZ1bmt0aW9uc2F1ZnJ1ZmVuICovCisjZGVmaW5lIEVQRVJSX05PVF9BUkNICSAgLTEgIC8vIHRoaXNfaW50ZXJhY3RpdmUoKSB3YXIga2VpbiBFcnptYWdpZXIKKyNkZWZpbmUgRVBFUlJfSU5WQUxJRF9PQiAgLTIgIC8vIHVuZ3VlbHRpZ2VzIE9iamVrdCAoekIuIFZDLVJhdW0pCisjZGVmaW5lIEVQRVJSX05PX0VOVFJZCSAgLTMgIC8vIEVpbnRyYWcgbmljaHQgZ2VmdW5kZW4KKyNkZWZpbmUgRVBFUlJfSU5WQUxJRF9BUkcgLTQgIC8vIFVuZ3VlbHRpZ2VzIEFyZ3VtZW50CisKKy8qIHVuZCBoaWVyIHdhcyBmdWVyIGRpZSBTdGF0aXN0aWsuLi4gKi8KKyNkZWZpbmUgTUlOX0VQICAxMAorCisvKiBGUC1TY3JpcHRlLi4uICovCisjZGVmaW5lIExGX0xPRyAiQVJDSC9GUFNfVE9PX0ZBU1QiCisjZGVmaW5lIExGX1RJTUUgOTAwCisjZGVmaW5lIExGX1dBUk4gMworCisvKiBGUC1Mb2dmaWxlICovCisjZGVmaW5lIEZQX0xPRyAiQVJDSC9GUFNfRk9VTkQiCisKKyNlbmRpZgorCisKKyNpZmRlZiBORUVEX1BST1RPVFlQRVMKKworI2lmbmRlZiBfX0VYUExPUkFUSU9OX0hfUFJPVE9fXworI2RlZmluZSBfX0VYUExPUkFUSU9OX0hfUFJPVE9fXworCisvKiBwcm90b3R5cGVzICovCitzdGF0aWMgdm9pZCBHaXZlRVAoaW50IHR5cGUsIHN0cmluZyBrZXkpOyAvLyBpbiAvc3RkL3RoaW5nL2Rlc2NyaXB0aW9uLmMKKworI2VuZGlmIC8vIF9fRVhQTE9SQVRJT05fSF9QUk9UT19fCisKKyNlbmRpZgkvLyBORUVEX1BST1RPWVBFUworCmRpZmYgLS1naXQgYS9zZWN1cmUvZXhwbG9yYXRpb25tYXN0ZXIuYyBiL3NlY3VyZS9leHBsb3JhdGlvbm1hc3Rlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkNjA5ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvZXhwbG9yYXRpb25tYXN0ZXIuYwpAQCAtMCwwICsxLDEwMjQgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBleHBsb3JhdGlvbm1hc3Rlci5jIC0tIFZlcndhbHR1bmcgZGVyIEV4cGxvcmF0aW9uUG9pbnRzIChGUCkKKy8vCisvLyAkSWQ6IGV4cGxvcmF0aW9ubWFzdGVyLmMgOTU2OSAyMDE2LTA2LTA1IDIxOjI4OjIzWiBaZXNzdHJhICQKKy8vCisjcHJhZ21hIHN0cmljdF90eXBlcyxydHRfY2hlY2tzCisjcHJhZ21hIG5vX2Nsb25lLG5vX3NoYWRvdyxub19pbmhlcml0CisvLyNwcmFnbWEgcGVkYW50aWMKKy8vI3ByYWdtYSByYW5nZV9jaGVjaworI3ByYWdtYSB3YXJuX2RlcHJlY2F0ZWQKKworI2RlZmluZSBCWV9FUCAiL3NlY3VyZS9BUkNIL0VQU1RBVF9CWV9FUCIKKyNkZWZpbmUgQllfUEwgIi9zZWN1cmUvQVJDSC9FUFNUQVRfQllfUEwiCisjZGVmaW5lIEJZX1BOICIvc2VjdXJlL0FSQ0gvRVBTVEFUX0JZX1BOIgorI2RlZmluZSBBVkdMT0cgIi9zZWN1cmUvQVJDSC9FUFNUQVRfQVZHIgorCitpbmhlcml0ICIvc3RkL3V0aWwvcGxfaXRlcmF0b3IiOworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisjaW5jbHVkZSA8dXNlcmluZm8uaD4KKyNpbmNsdWRlIDxleHBsb3JhdGlvbi5oPgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxuZXdfc2tpbGxzLmg+CisKKyNkZWZpbmUgRE9NQUlOX0lORk8gMQorCisjaW5jbHVkZSA8bGl2aW5nL2NvbW0uaD4KKyNkZWZpbmUgWkRFQlVHKHgpIGlmIChmaW5kX3BsYXllcigiemVzc3RyYSIpKSBcCisgIGZpbmRfcGxheWVyKCJ6ZXNzdHJhIiktPlJlY2VpdmVNc2coeCxNVF9ERUJVRywwLG9iamVjdF9uYW1lKCkrIjoiLHRoaXNfb2JqZWN0KCkpCisvLyNkZWZpbmUgWkRFQlVHKHgpCisKKy8vIFN0cnVrdHVyOiAoWyBzdHJpbmcgZmlsZW5hbWUgOiBzdHJpbmcqIGFjdGlvbiwgaW50IG51bWJlciwgaW50IHR5cGUgXSkgCitwcml2YXRlIG1hcHBpbmcgb2JzOworcHJpdmF0ZSBpbnQgZXBjb3VudDsgIC8vIEFuemFobCBGUAorcHJpdmF0ZSBpbnQgZXBhdmc7ICAgIC8vIER1cmNoc2Nobml0dGxpY2hlIEZQL1NwaWVsZXIKKy8vIEJpdHN0cmluZ3MgZnVlciBub3JtYWxlIChhbGxvYykgdW5kIEJvbnVzLUZQIChib251cykKK3ByaXZhdGUgc3RyaW5nIGFsbG9jLGJvbnVzOworCitwcml2YXRlIG5vc2F2ZSBzdHJpbmcgdmNfb2I7Citwcml2YXRlIG5vc2F2ZSBzdHJpbmcgb3V0cHV0OworCitwcml2YXRlIG5vc2F2ZSBpbnQgY2hhbmdlZDsKK3ByaXZhdGUgbm9zYXZlIGludCBkdW1waW5nOworcHJpdmF0ZSBub3NhdmUgbWFwcGluZyBkdW1wTWFwLCBsYXN0Zm91bmQsIHF1ZXJ5dGltZTsKKworcHJpdmF0ZSBub3NhdmUgaW50IHN0YXRfZG9uZTsKKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkKK3sKKyAgc2V0ZXVpZChnZXR1aWQodGhpc19vYmplY3QoKSkpOworICBpZiAoIXJlc3RvcmVfb2JqZWN0KEVQU0FWRUZJTEUpKSB7CisgICAgb2JzID0gKFtdKTsKKyAgICBlcGNvdW50ID0gZXBhdmcgPSAwOworICAgIGFsbG9jID0gIiAiOworICAgIGJvbnVzID0gIiAiOworICAgIHNhdmVfb2JqZWN0KEVQU0FWRUZJTEUpOworICB9CisgIGlmICghYm9udXMpIGJvbnVzPSIgIjsKKyAgbGFzdGZvdW5kPShbXSk7CisgIHF1ZXJ5dGltZT0oW10pOworfQorCitwdWJsaWMgdmFyYXJncyBpbnQgcmVtb3ZlKGludCBzaWxlbnQpCit7CisgIHNhdmVfb2JqZWN0KEVQU0FWRUZJTEUpOworICBkZXN0cnVjdCh0aGlzX29iamVjdCgpKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vIFN0YXRpc3RpayBlcnN0ZWxsZW4KK3ByaXZhdGUgaW50IFNldEF2ZXJhZ2UoaW50IG5ld2F2ZykKK3sKKyAgaWYgKGVwYXZnICE9IG5ld2F2ZykKKyAgeworICAgIGVwYXZnID0gbmV3YXZnOworICAgIHdyaXRlX2ZpbGUoQVZHTE9HLCBzcHJpbnRmKCIlcyA6ICVkXG4iLGR0aW1lKHRpbWUoKSksbmV3YXZnKSk7CisgICAgc2F2ZV9vYmplY3QoRVBTQVZFRklMRSk7CisgIH0KKyAgcmV0dXJuIGVwYXZnOworfQorCitwcml2YXRlIHZvaWQgY2hlY2tfcGxheWVyKHN0cmluZyBwbCwgbWl4ZWQgZXh0cmEpCit7CisgIGludCAqZnBfZm91bmQgPSBleHRyYVswXTsKKyAgbWFwcGluZyBwbHN0YXQgPSBleHRyYVsxXTsKKyAgbWFwcGluZyBwbnN0YXQgPSBleHRyYVsyXTsKKyAgb2JqZWN0IHBsZGF0YSA9IGV4dHJhWzNdOworICBpZiAoIXBsZGF0YSkKKyAgeworICAgIHBsZGF0YT1jbG9uZV9vYmplY3QoIi9vYmovcGxheWVyZGF0YSIpOworICAgIGV4dHJhWzNdPXBsZGF0YTsKKyAgfQorICAvLyBMZXR6dGUgTG9naW56ZWl0IGVybWl0dGVsbiwgd2VubiBsYWVuZ2VyIGFscyA5MCBUYWdlIGhlciB1bmQgbmljaHQKKyAgLy8gZWluZ2Vsb2dndCwgd2lyZCBkZXIgU3BpZWxlciB1ZWJlcnNwcnVuZ2VuLgorICAvLyBEZXIgcGxheWVyZGF0YSBicmF1Y2h0IGVpbmUgVUlELCBtaXQgZGVyIGVyIGRhcyBTcGllbGVyc2F2ZWZpbGUgbGFkZW4KKyAgLy8ga2Fubi4gSGllcnp1IHNldHplbiB3aXIgaWhtIGRpZSBkZXMgenUgbGFkZW5kZW4gU3BpZWxlcnMuLi4KKyAgcGxkYXRhLT5SZWxlYXNlUGxheWVyKCk7CisgIHNldGV1aWQocGwpOworICBlZnVuOjpleHBvcnRfdWlkKHBsZGF0YSk7CisgIHNldGV1aWQoZ2V0dWlkKHRoaXNfb2JqZWN0KCkpKTsKKyAgKGludClwbGRhdGEtPkxvYWRQbGF5ZXIocGwpOworICAvLyBUZXN0c3BpZWxlciBhdXNuZWhtZW4sIFNwaWVsZXIsIGRpZSA5MCBUYWdlIG5pY2h0IGRhIHdhcmVuLgorICBpZiAoICgoaW50KXBsZGF0YS0+UXVlcnlQcm9wKFBfTEFTVF9MT0dJTikgPCB0aW1lKCkgLSA3Nzc2MDAwCisgICAgICAgICYmICFmaW5kX3BsYXllcihwbCkpCisgICAgICB8fCAobWl4ZWQpcGxkYXRhLT5RdWVyeVByb3AoUF9URVNUUExBWUVSKSkKKyAgICByZXR1cm47CisgIC8vIFdlbm4ga2VpbiBTUGllbGVyL1NlaGVyLCBzb25kZXJuIE1hZ2llcjogYXVjaCB1ZWJlcnNwcmluZ2VuCisgIG1peGVkKiB1aW5mbyA9IChtaXhlZCopbWFzdGVyKCktPmdldF91c2VyaW5mbyhwbCk7CisgIGlmICh1aW5mb1tVU0VSX0xFVkVMKzFdID49IExFQVJORVJfTFZMKQorICAgIHJldHVybjsKKworICBzdHJpbmcgZXBzPShzdHJpbmcpbWFzdGVyKCktPnF1ZXJ5X2VwKHBsKSB8fCAiIjsKKyAgaW50IHA9LTE7CisgIGludCBjb3VudCwgYXZnY291bnQ7CisgIHdoaWxlICgocD1uZXh0X2JpdChlcHMscCkpICE9IC0xKQorICB7CisgICAgaWYgKHA8c2l6ZW9mKGZwX2ZvdW5kKSkKKyAgICB7CisgICAgICArK2NvdW50OworICAgICAgKytmcF9mb3VuZFtwXTsKKyAgICAgIC8vIGVzIHRyYWdlbiBudXIgbm9ybWFsZSBFUHMgenVtIER1cmNoc2Nobml0dCBiZWkKKyAgICAgIGlmICghdGVzdF9iaXQoYm9udXMscCkpCisgICAgICAgICsrYXZnY291bnQ7CisgICAgfQorICB9CisKKyAgLy8gU3BpZWxlciBtaXQgd2VuaWdlciBhbHMgTUlOX0VQIGlnbm9yaWVyZW4uCisgIGlmIChhdmdjb3VudCA+PSBNSU5fRVApCisgIHsKKyAgICBleHRyYVs0XSArPSBhdmdjb3VudDsgICAvLyBTdW1tZSBkZXIgZ2VmdW5kZW5lbiBGUAorICAgICsrZXh0cmFbNV07ICAgICAgICAgIC8vIEFuemFobCBiZXJ1ZWNrc2ljaHRpZ3RlciBTcGllbGVyCisgIH0KKyAgcGxzdGF0ICs9IChbIHBsIDogY291bnQgXSk7CisgIGlmICghbWVtYmVyKHBuc3RhdCwgY291bnQpKQorICAgIHBuc3RhdCArPSAoWyBjb3VudCA6ICh7IHBsIH0pIF0pOworICBlbHNlCisgICAgcG5zdGF0W2NvdW50XSA9ICh7IHBsIH0pK3Buc3RhdFtjb3VudF07Cit9CisKKy8vIE1pdCBhbGxlbiBTcGllbGVybiBmZXJ0aWcsIGF1ZnJhZXVtZW4uCisjZGVmaW5lIEJBUiAiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIgorcHJpdmF0ZSB2b2lkIHBsY2hlY2tfZmluaXNoZWQobWl4ZWQgZXh0cmEpCit7CisgIFpERUJVRygicGxjaGVja19maW5pc2hlZCBlbnRyeVxuIik7CisgIGlmIChnZXRfZXZhbF9jb3N0KCkgPCAxMDAwMDAwKQorICB7CisgICAgY2FsbF9vdXQoIydwbGNoZWNrX2ZpbmlzaGVkLCA0K3JhbmRvbSg2KSwgZXh0cmEpOworICAgIHJldHVybjsKKyAgfQorCisgIGludCAqZnBfZm91bmQgPSBleHRyYVswXTsKKyAgbWFwcGluZyBwbHN0YXQgPSBleHRyYVsxXTsKKyAgbWFwcGluZyBwbnN0YXQgPSBleHRyYVsyXTsKKyAgb2JqZWN0IHBsZGF0YSA9IGV4dHJhWzNdOworICBpbnQgYXZnY291bnQgPSBleHRyYVs0XTsKKyAgaW50IGF2Z3NwaWVsZXIgPSBleHRyYVs1XTsKKworICBpZiAob2JqZWN0cChwbGRhdGEpKQorICAgIHBsZGF0YS0+cmVtb3ZlKDEpOworCisgIGlmIChmaWxlX3NpemUoQllfRVApID49IDApCisgICAgcm0oQllfRVApOworICBpZiAoZmlsZV9zaXplKEJZX1BMKSA+PSAwKQorICAgIHJtKEJZX1BMKTsKKyAgaWYgKGZpbGVfc2l6ZShCWV9QTikgPj0gMCkKKyAgICBybShCWV9QTik7CisKKyAgLy8gTmV1ZW4gRHVyY2hzY2huaXR0c3dlcnQgZnVlciBnZWZ1bmRlbmUgRlAgc2V0emVuLgorICBpZiAoYXZnc3BpZWxlcikKKyAgeworICAgIFNldEF2ZXJhZ2UodG9faW50KGF2Z2NvdW50L2F2Z3NwaWVsZXIpKTsKKyAgfQorCisgIC8vIEhpc3RvZ3JhbW0gdWViZXIgYWxsZSBGUCBzY2hyZWliZW46IHdpZSBvZnQgd3VyZGUgamVkZXIgZ2VmdW5kZW4/CisgIGludCBtYXh2YWwgPSBtYXgoZnBfZm91bmQpOworICBpbnQgZnBfaW5kZXg7CisgIGZvcmVhY2goaW50IGZvdW5kIDogZnBfZm91bmQpCisgIHsKKyAgICB3cml0ZV9maWxlKEJZX0VQLCBzcHJpbnRmKCIlNWQ6JTVkICVzXG4iLCBmcF9pbmRleCwgZm91bmQsCisgICAgICAgICAgICAgICBCQVJbMC4uKDYwKmZvdW5kKS9tYXh2YWxdKSk7CisgICAgKytmcF9pbmRleDsKKyAgfQorICAvLyBzb3J0aWVydGUgTGlzdGUgZGVyIFNwaWVsZXIgKHNvcnRpZXJ0IG5hY2ggZ2VmdW5kZW5lbiBGUCkgZXJ6ZXVnZW4KKyAgZm9yZWFjaChpbnQgZnAgOiBzb3J0X2FycmF5KG1faW5kaWNlcyhwbnN0YXQpLCMnPCkgKQorICB7CisgICAgZm9yZWFjaChzdHJpbmcgcGwgOiBwbnN0YXRbZnBdKQorICAgICAgd3JpdGVfZmlsZShCWV9QTiwgc3ByaW50ZigiJS0xNHM6ICU1ZFxuIiwgcGwsIGZwKSk7CisgIH0KKyAgLy8gYWxwaGFiZXRpc2NoIHNvcnRpZXJ0ZSBMaXN0ZSBkZXIgU3BpZWxlciBlcnpldWdlbgorICBmb3JlYWNoKHN0cmluZyBwbCA6IHNvcnRfYXJyYXkobV9pbmRpY2VzKHBsc3RhdCksIyc+KSApCisgIHsKKyAgICB3cml0ZV9maWxlKEJZX1BMLCBzcHJpbnRmKCIlLTE0czogJTVkXG4iLCBwbCwgcGxzdGF0W3BsXSkpOworICB9Cit9CisjdW5kZWYgQkFSCisKK3ByaXZhdGUgdm9pZCBtYWtlX3N0YXQoKQoreworICBzdGF0X2RvbmUgPSB0aW1lKCk7CisgIC8vIExlaWRlciBsYWVzc3Qgc2ljaCBlcGNvdW50IG5pY2h0IG51dHplbiBCZWltIExvZXNjaGVuIHZvbiBGUCB3aXJkCisgIC8vIDxlcGNvdW50PiBkZWtyZW1lbnRpZXJ0LCBzbyBkYXNzIGhpZXIgbmljaHQgbWVociBhbGxlIEZQcyBhdXNnZXdlcnRldAorICAvLyB3ZXJkZW4uIERhaGVyIG11c3Mgc3RhdHRkZXNzZW4gYmlzIHp1ciBHZXNhbXRncm9lc3NlIHZvbiA8b2JzPiBnZXphZWhsdAorICAvLyB3ZXJkZW4uCisgIGludCogZnBfZm91bmQgPSBhbGxvY2F0ZShzaXplb2Yob2JzKSk7CisgIG1hcHBpbmcgcGxzdGF0ID0gbV9hbGxvY2F0ZSg1MDApOworICBtYXBwaW5nIHBuc3RhdCA9IG1fYWxsb2NhdGUoNTAwKTsKKyAgc3RhcnRfcGxheWVyX2NoZWNrKCMnY2hlY2tfcGxheWVyLCAjJ3BsY2hlY2tfZmluaXNoZWQsIDEyMDAwMDAsCisgICAgICAgICAgICAgICAgICAgICAoe2ZwX2ZvdW5kLHBsc3RhdCxwbnN0YXQsCisgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDB9KSApOworfQorCit2b2lkIHJlc2V0KCkKK3sKKyAgaWYgKGNoYW5nZWQgJiYgIWR1bXBpbmcpCisgIHsKKyAgICBjYXRjaChybShEVU1QRklMRSk7cHVibGlzaCk7CisgICAgZHVtcGluZyA9IDE7CisgICAgY2FsbF9vdXQoImR1bXBFUE9iamVjdHMiLCAwLCBzb3J0X2FycmF5KG1faW5kaWNlcyhvYnMpLCMnPiAvKicqLykpOworICAgIGNoYW5nZWQgPSAwOworICB9CisgIC8vIG51ciBlaW5tYWwgYW0gdGFnIHN0YXRpc3Rpa2VuIGVyc3RlbGxlbgorICBpZiAodGltZSgpJTg2NDAwIDwgNDAwMAorICAgICAgJiYgc3RhdF9kb25lIDwgdGltZSgpLTgwMDAwKQorICAgIG1ha2Vfc3RhdCgpOworfQorCitwcml2YXRlIHN0cmluZyBzdHJBcnIoc3RyaW5nICpzKQoreworICBzdHJpbmcgcmV0OworICBpbnQgaTsKKworICByZXQgPSAoIlwiIitzWzwxXSsiXCIiKTsKKyAgZm9yIChpPXNpemVvZihzKS0yOyBpPj0wOyBpLS0pCisgICAgcmV0ICs9ICgiLCBcIiIrc1tpXSsiXCIiKTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBkdW1wRVBPYmplY3RzKHN0cmluZyAqZG9pdCkKK3sKKyAgc3RyaW5nICp0b0dvLCBpZDsKKyAgaW50IGksajsKKworICBpZiAoIW1hcHBpbmdwKGR1bXBNYXApKQorICAgIGR1bXBNYXAgPSAoW10pOworCisgIHRvR28gPSAwOworICBpZiAoc2l6ZW9mKGRvaXQpID4gMjAwKSB7CisgICAgdG9HbyA9IGRvaXRbMjAwLi5dOworICAgIGRvaXQgPSBkb2l0WzAuLjE5OV07CisgIH0KKworICBqID0gc2l6ZW9mKGRvaXQpOworCisgIGZvciAoaT0wOyBpPGo7IGkrKykgeworICAgIGlkID0gKHN0cmluZyltYXN0ZXIoKS0+Y3JlYXRvcl9maWxlKGRvaXRbaV0pOworICAgIGlmIChtZW1iZXIoZHVtcE1hcCwgaWQpKQorICAgICAgZHVtcE1hcFtpZF0gKz0gKHsgZG9pdFtpXSB9KTsKKyAgICBlbHNlCisgICAgICBkdW1wTWFwICs9IChbIGlkIDogKHsgZG9pdFtpXSB9KSBdKTsKKyAgfQorICBpZiAodG9HbykKKyAgICBjYWxsX291dCgiZHVtcEVQT2JqZWN0cyIsIDEsIHRvR28pOworICBlbHNlIHsKKyAgICBpbnQgc3RlcDsKKworICAgIHN0ZXAgPSAwOworICAgIGlkID0gIiI7CisgICAgdG9HbyA9IHNvcnRfYXJyYXkobV9pbmRpY2VzKGR1bXBNYXApLCMnPiAvKicqLyApOworICAgIGZvciAoaT0wLCBqPXNpemVvZih0b0dvKTsgaTxqOyBpKyspIHsKKyAgICAgIGludCBrLGw7CisgICAgICBkb2l0ID0gZHVtcE1hcFt0b0dvW2ldXTsKKyAgICAgIGlkICs9IHNwcmludGYoIiMjIyAlcyAlc1xuIiwgdG9Hb1tpXSwgIiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMiW3NpemVvZih0b0dvW2ldKS4uXSk7CisgICAgICBmb3IgKGs9MCwgbD1zaXplb2YoZG9pdCk7IGs8bDsgaysrKSB7CisgICAgICAgIGlkICs9IHNwcmludGYoIiVzICU0ZCAlcyAlcy5jICh7ICVzIH0pXG4iLAorICAgICAgICAgICAgICAgICAgICAgIEVQX1RZUEVTW29ic1tkb2l0W2tdLCBNUE9TX1RZUEVdXSwKKyAgICAgICAgICAgICAgICAgICAgICBvYnNbZG9pdFtrXSwgTVBPU19OVU1dLAorICAgICAgICAgICAgICAgICAgICAgIHRlc3RfYml0KGJvbnVzLG9ic1tkb2l0W2tdLCBNUE9TX05VTV0pPyJiIjoibiIsCisgICAgICAgICAgICAgICAgICAgICAgZG9pdFtrXSwKKyAgICAgICAgICAgICAgICAgICAgICBzdHJBcnIob2JzW2RvaXRba11dKSk7CisgICAgICAgIGlmICghKCsrc3RlcCAlIDUwKSkgeworICAgICAgICAgIHdyaXRlX2ZpbGUoRFVNUEZJTEUsIGlkKTsKKyAgICAgICAgICBpZCA9ICIiOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZCArPSAiXG4iOworICAgIH0KKyAgICB3cml0ZV9maWxlKERVTVBGSUxFLGlkKTsKKyAgICBpZiAoZHVtcGluZyA9PSAyKQorICAgICAgd3JpdGUoIkZlcnRpZyEgQW5mcmFnZSBiaXR0ZSB3aWVkZXJob2xlbi5cbiIpOworICAgIGR1bXBpbmcgPSAwOworICAgIGNoYW5nZWQgPSAwOworICAgIGR1bXBNYXAgPSAwOworICB9Cit9CisKK3ByaXZhdGUgc3RyaW5nIHZhbGlkT2IobWl4ZWQgb2IpCit7CisgIHN0cmluZyBmbiwgZnBhcnQ7CisKKyAgaWYgKCFvYmplY3RwKG9iKSkKKyAgICByZXR1cm4gMDsKKworICBmbiA9IG9sZF9leHBsb2RlKG9iamVjdF9uYW1lKG9iKSwiIyIpWzBdOworICBmcGFydCA9IG9sZF9leHBsb2RlKGZuLCIvIilbPDFdOworIC8qCisgIGlmIChxdWVyeV9vbmNlX2ludGVyYWN0aXZlKG9iKSkKKyAgICByZXR1cm4gMDsKKworICBpZiAoKGZpbGVfc2l6ZShmbisiLmMiKSA8PSAwKSAmJgorICAgICAgdGhpc19wbGF5ZXIoKSAmJgorICAgICAgKHN0cnN0cihmcGFydCwgZ2V0dWlkKHRoaXNfcGxheWVyKCkpKSA+PSAwKSkKKyAgICByZXR1cm4gMDsKKyAqLworICByZXR1cm4gZm47Cit9CisKK3ByaXZhdGUgaW50IGFsbG93ZWQoKQoreworICBpZiAocHJldmlvdXNfb2JqZWN0KCkgJiYgZ2V0ZXVpZChwcmV2aW91c19vYmplY3QoKSk9PVJPT1RJRCkKKyAgICByZXR1cm4gMTsKKyAgaWYgKCAhcHJvY2Vzc19jYWxsKCkgJiYgcHJldmlvdXNfb2JqZWN0KCkgJiYgdGhpc19pbnRlcmFjdGl2ZSgpCisgICAgICAgICYmIEFSQ0hfU0VDVVJJVFkgKQorICAgIHJldHVybiAxOworCisgIHJldHVybiAwOworfQorCitub21hc2sgdmFyYXJncyBpbnQgQWRkRVBPYmplY3Qob2JqZWN0IG9iLCBtaXhlZCBrZXlzLCBpbnQgdHlwZSwgaW50IGJvbnVzZmxhZykKK3sKKyAgc3RyaW5nIGZuOworCisgIGlmICghYWxsb3dlZCgpKQorICAgIHJldHVybiBFUEVSUl9OT1RfQVJDSDsKKworICBpZiAoIShmbiA9IHZhbGlkT2Iob2IpKSkKKyAgICByZXR1cm4gRVBFUlJfSU5WQUxJRF9PQjsKKworICBpZiAoc3RyaW5ncChrZXlzKSkKKyAgICBrZXlzID0gKHsga2V5cyB9KTsKKworICBpZiAobWVtYmVyKG9icywgZm4pKSB7CisgICAgaWYgKHR5cGUgPT0gb2JzW2ZuLCBNUE9TX1RZUEVdKQorICAgICAgb2JzW2ZuXSA9IGtleXM7CisgICAgZWxzZQorICAgICAgb2JzICs9IChbIGZuIDoga2V5czsgb2JzW2ZuLCBNUE9TX05VTV07IHR5cGUgXSk7CisgICAgaWYgKGJvbnVzZmxhZykgYm9udXMgPSBzZXRfYml0KGJvbnVzLCBvYnNbZm4sIE1QT1NfTlVNXSk7CisgICAgICAgZWxzZSBib251cyA9IGNsZWFyX2JpdChib251cywgb2JzW2ZuLCBNUE9TX05VTV0pOworICB9CisgIGVsc2UgeworICAgIGludCBuciwgaTsKKworICAgIG5yID0gMDsKKyAgICB3aGlsZSAodGVzdF9iaXQoYWxsb2MsbnIpKQorICAgICAgbnIrKzsKKworICAgIG9icyArPSAoWyBmbiA6IGtleXM7IG5yOyB0eXBlIF0pOworICAgICsrZXBjb3VudDsKKyAgICBhbGxvYyA9IHNldF9iaXQoYWxsb2MsbnIpOworICAgIGlmIChib251c2ZsYWcpIGJvbnVzID0gc2V0X2JpdChib251cyxucik7CisgICAgICAgZWxzZSBib251cyA9IGNsZWFyX2JpdChib251cyxucik7CisgIH0KKworICBjaGFuZ2VkID0gMTsKKyAgc2F2ZV9vYmplY3QoRVBTQVZFRklMRSk7CisgIHJldHVybiBlcGNvdW50OworfQorCitub21hc2sgaW50IFJlbW92ZUVQT2JqZWN0KHN0cmluZ3xvYmplY3Qgb2IpCit7CisgIHN0cmluZyBmbjsKKworICBpZiAoIWFsbG93ZWQoKSkKKyAgICByZXR1cm4gRVBFUlJfTk9UX0FSQ0g7CisgIAorICBpZiAob2JqZWN0cChvYikpCisgICAgb2I9b2JqZWN0X25hbWUob2IpOworCisgIGZuID0gZXhwbG9kZShvYiwiIyIpWzBdOworICBpZiAoIW1lbWJlcihvYnMsZm4pKQorICAgIHJldHVybiBFUEVSUl9OT19FTlRSWTsKKworICBhbGxvYyA9IGNsZWFyX2JpdChhbGxvYywgb2JzW2ZuLCBNUE9TX05VTV0pOworICBib251cyA9IGNsZWFyX2JpdChib251cywgb2JzW2ZuLCBNUE9TX05VTV0pOworCisgIG1fZGVsZXRlKG9icywgZm4pOworCisgIGNoYW5nZWQgPSAxOworICAtLWVwY291bnQ7CisgIHNhdmVfb2JqZWN0KEVQU0FWRUZJTEUpOworICByZXR1cm4gZXBjb3VudDsKK30KKworbm9tYXNrIGludCBDaGFuZ2VFUE9iamVjdChvYmplY3Qgb2IsIGludCB3aGF0LCBtaXhlZCBuZXcpCit7CisgIHN0cmluZyBmbiwgZm4yOworICBtYXBwaW5nIGVudHJ5OworCisgIGlmICghYWxsb3dlZCgpKQorICAgIHJldHVybiBFUEVSUl9OT1RfQVJDSDsKKworICBpZiAoIShmbiA9IHZhbGlkT2Iob2IpKSkKKyAgICByZXR1cm4gRVBFUlJfSU5WQUxJRF9PQjsKKworICBpZiAoIW1lbWJlcihvYnMsZm4pKQorICAgIHJldHVybiBFUEVSUl9OT19FTlRSWTsKKworICBzd2l0Y2god2hhdCkgeworICBjYXNlIENIQU5HRV9PQjoKKyAgICBpZiAoIShmbjIgPSB2YWxpZE9iKG5ldykpKQorICAgICAgcmV0dXJuIEVQRVJSX0lOVkFMSURfQVJHOworICAgIGVudHJ5ID0gKFsgZm4yOiBvYnNbZm5dOyBvYnNbZm4sTVBPU19OVU1dOyBvYnNbZm4sTVBPU19UWVBFXSBdKTsKKyAgICBvYnMgPSBtX2NvcHlfZGVsZXRlKG9icywgZm4pOworICAgIG9icyArPSBlbnRyeTsKKyAgICBicmVhazsKKyAgY2FzZSBDSEFOR0VfQk9OVVM6CisgICAgaWYgKCEoaW50cChuZXcpKSkKKyAgICAgIHJldHVybiBFUEVSUl9JTlZBTElEX0FSRzsKKyAgICBpZiAobmV3KSBib251cz1zZXRfYml0KGJvbnVzLG9ic1tmbixNUE9TX05VTV0pOworICAgICAgIGVsc2UgYm9udXM9Y2xlYXJfYml0KGJvbnVzLG9ic1tmbixNUE9TX05VTV0pOworICAgIGJyZWFrOworICBjYXNlIENIQU5HRV9LRVk6CisgICAgaWYgKCFzdHJpbmdwKG5ldykgJiYgIXBvaW50ZXJwKG5ldykpCisgICAgICByZXR1cm4gRVBFUlJfSU5WQUxJRF9BUkc7CisgICAgICAgCisgICAgaWYgKHN0cmluZ3AobmV3KSkKKyAgICAgIG5ldyA9ICh7IG5ldyB9KTsKKworICAgIG9ic1tmbl0gPSBuZXc7CisgICAgYnJlYWs7CisgIGNhc2UgQ0hBTkdFX1RZUEU6CisgICAgaWYgKCFpbnRwKG5ldykgfHwgbmV3IDwgMCB8fCBuZXcgPiBFUF9NQVgpCisgICAgICByZXR1cm4gRVBFUlJfSU5WQUxJRF9BUkc7CisKKyAgICBvYnNbZm4sIE1QT1NfVFlQRV0gPSBuZXc7CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgcmV0dXJuIEVQRVJSX0lOVkFMSURfQVJHOworICB9CisgIGNoYW5nZWQgPSAxOworICBzYXZlX29iamVjdChFUFNBVkVGSUxFKTsKKyAgcmV0dXJuIDE7Cit9CisKK25vbWFzayBtaXhlZCBRdWVyeUVQT2JqZWN0KG9iamVjdCBvYikKK3sKKyAgc3RyaW5nIGZuOworCisgIGlmICghYWxsb3dlZCgpKQorICAgIHJldHVybiBFUEVSUl9OT1RfQVJDSDsKKworICBpZiAoIShmbiA9IHZhbGlkT2Iob2IpKSkKKyAgICByZXR1cm4gRVBFUlJfSU5WQUxJRF9PQjsKKworICBpZiAoIW1lbWJlcihvYnMsIGZuKSkKKyAgICByZXR1cm4gMDsKKworICByZXR1cm4gKHsgb2JzW2ZuXSwgb2JzW2ZuLE1QT1NfTlVNXSwgb2JzW2ZuLCBNUE9TX1RZUEVdLCB0ZXN0X2JpdChib251cyxvYnNbZm4sIE1QT1NfTlVNXSkgfSk7Cit9CisKK3ByaXZhdGUgc3RyaW5nIGdldE1hdGNoKHN0cmluZyBtKQoreworICBzdHJpbmcgKnJlczsKKyAgaW50IGk7CisKKyAgcmVzID0gcmVnZXhwKHNvcnRfYXJyYXkobV9pbmRpY2VzKG9icyksICMnPiAvKicqLyksIG0pOworICBmb3IgKGk9c2l6ZW9mKHJlcyktMTsgaT49MDsgaS0tKQorICAgIHJlc1tpXSA9IHNwcmludGYoIiVzICVzICVzLmMgKHsgJXMgfSkiLAorICAgICAgICAgICAgICAgICAgICAgRVBfVFlQRVNbb2JzW3Jlc1tpXSwgTVBPU19UWVBFXV0sCisgICAgICAgICAgICAgICAgICAgICB0ZXN0X2JpdChib251cyxvYnNbcmVzW2ldLCBNUE9TX05VTV0pPyJiIjoibiIsCisgICAgICAgICAgICAgICAgICAgICByZXNbaV0sCisgICAgICAgICAgICAgICAgICAgICBzdHJBcnIob2JzW3Jlc1tpXV0pKTsKKyAgcmV0dXJuIGltcGxvZGUocmVzLCAiXG4iKTsKK30KKworcHJpdmF0ZSBzdHJpbmcgZ2V0TWF0Y2hBcmNoKHN0cmluZyBtKQoreworICBzdHJpbmcgKnJlczsKKyAgaW50IGk7CisKKyAgcmVzID0gcmVnZXhwKHNvcnRfYXJyYXkobV9pbmRpY2VzKG9icyksICMnPiAvKicqLyksIG0pOworICBmb3IgKGk9c2l6ZW9mKHJlcyktMTsgaT49MDsgaS0tKQorICAgIHJlc1tpXSA9IHNwcmludGYoIiVzICU0ZCAlcyAlcy5jICh7ICVzIH0pIiwKKyAgICAgICAgICAgICAgICAgICAgIEVQX1RZUEVTW29ic1tyZXNbaV0sIE1QT1NfVFlQRV1dLAorICAgICAgICAgICAgICAgICAgICAgb2JzW3Jlc1tpXSwgTVBPU19OVU1dLAorICAgICAgICAgICAgICAgICAgICAgdGVzdF9iaXQoYm9udXMsb2JzW3Jlc1tpXSwgTVBPU19OVU1dKT8iYiI6Im4iLAorICAgICAgICAgICAgICAgICAgICAgcmVzW2ldLAorICAgICAgICAgICAgICAgICAgICAgc3RyQXJyKG9ic1tyZXNbaV1dKSk7CisgIHJldHVybiBpbXBsb2RlKHJlcywgIlxuIik7Cit9CisKKy8qCisgKiAgQW5sZWl0dW5nIGZ1ZXIgPj1FTXM6CisgKiAgICBTaG93RVBPYmplY3RzKCkgemVpZ3QgZGFzIGdlc2FtdGUgRHVtcGZpbGUgYW4KKyAqICAgIFNob3dFUE9iamVjdHMoImR1bXAiKSBlcnpldWd0IGVpbiBuZXVlcyBEdW1wZmlsZQorICogICAgU2hvd0VQT2JqZWN0cygic3RyaW5nIikgbGllZmVydCBhbGxlIEVQcywgZGllICIvc3RyaW5nLyIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltIEZpbGVuYW1lbiBlbnRoYWx0ZW4KKyAqICAgIFNob3dFUE9iamVjdHMoInN0cmluZzEiLCJzdHJpbmcyIikgbGllZmVydCBhbGxlIEVQcywgZGllCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiL3N0cmluZzEvc3RyaW5nMi8iIGltIEZpbGVuYW1lbiBlbnRoYWx0ZW4KKyAqICBBbmxlaXR1bmcgZnVlciBSTXM6CisgKiAgICBTaG93RVBPYmplY3RzKCkgbGllZmVydCBhbGwgRGVpbmUgRVBzCisgKiAgICBTaG93RVBPYmplY3RzKCJkb21haW5uYW1lIikgbGllZmVydCBEZWluZSBFUHMgaW4gRGVpbmVyIERvbWFuaW4KKyAqICAgIFNob3dFUE9iamVjdHMoImRvbWFpbm5hbWUiLCJtYWdpZXJuYW1lIikgbGllZmVydCBkaWUgRVBzIGRlcworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1pdGFyYmVpdGVycyBpbiBEZWluZXIgUmVnaW9uCisgKgorICogIEFubGVpdHVuZyBmdWVyIDxSTXM6CisgKiAgICBTaG93RVBPYmplY3RzKCkgbGllZmVydCBEZWluZSBFUHMKKyAqCisgKiAgQWxsZSBFUE9iamVjdHMgZWluZXIgZ2FuemVuIERvbWFpbiBrYW5uIG1hbiBuaWNodCBtZWhyIGF1ZiBlaW5tYWwKKyAqICB6aWVoZW4gdW5kIHNvbGx0ZSBtYW4gYXVjaCBuaWNodC4gQWxsZSBadWdyaWZmZSBhdWYgZGllc2UgRnVua3Rpb24KKyAqICB3ZXJkZW4gZ2Vsb2dndC4gQXVjaCBkaWUgZGVyIEVNcyEKKyAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJpa3VzCisgKi8KKworbm9tYXNrIHZhcmFyZ3Mgdm9pZCBTaG93RVBPYmplY3RzKHN0cmluZyB3aGF0LCBzdHJpbmcgbWFnbmFtZSkKK3sKKyAgaWYgKGFsbG93ZWQoKSkgeworICAgIGlmICh3aGF0ID09ICJkdW1wIikgeworICAgICAgaWYgKCFkdW1waW5nKSB7CisgICAgICAgIGR1bXBpbmcgPSAyOworICAgICAgICBjYXRjaChybShEVU1QRklMRSk7cHVibGlzaCk7CisgICAgICAgIGNhbGxfb3V0KCJkdW1wRVBPYmplY3RzIiwgMCwgc29ydF9hcnJheShtX2luZGljZXMob2JzKSwjJz4vKicqLykpOworICAgICAgfQorICAgICAgcHJpbnRmKCJMaXN0ZSB3aXJkIGVyc3RlbGx0IHVuZCBpbiAnJXMnIGFiZ2VsZWd0IVxuIiwgRFVNUEZJTEUpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoIXdoYXQgfHwgd2hhdCA9PSAiIikgeworICAgICAgdGhpc19pbnRlcmFjdGl2ZSgpLT5Nb3JlKERVTVBGSUxFLCAxKTsKKyAgICAgIGxvZ19maWxlKCJBUkNIL0VQWnVncmlmZmUiLCBjdGltZSh0aW1lKCkpKyI6ICIrCisgICAgICAgIGNhcGl0YWxpemUoZ2V0dWlkKHRoaXNfaW50ZXJhY3RpdmUoKSkpKyIgc2NoYXV0ZSBzaWNoIGRhcyBEVU1QRklMRSBhbi5cbiIpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICB3aGF0PSIvIit3aGF0KyIvIjsKKyAgICBpZiAobWFnbmFtZSkgd2hhdCs9bWFnbmFtZSsiLyI7CisgIH0KKyAgZWxzZQorI2lmZGVmIERPTUFJTl9JTkZPCisgICAgaWYgKElTX0xPUkQodGhpc19pbnRlcmFjdGl2ZSgpKSkgeworICAgICAgaWYgKCF3aGF0IHx8IHdoYXQgPT0gIiIpCisgICAgICAgd2hhdCA9ICIvIitnZXR1aWQodGhpc19pbnRlcmFjdGl2ZSgpKSsiLyI7CisgICAgICBlbHNlIHsKKyAgICAgICBpZiAoIW1hc3RlcigpLT5kb21haW5fbWFzdGVyKGdldHVpZCh0aGlzX2ludGVyYWN0aXZlKCkpLCB3aGF0KSkgeworICAgICAgICAgd3JpdGUoIlNvcnJ5LCBEdSBrYW5uc3QgbnVyIE9iamVrdGUgaW4gRGVpbmVyIGVpZ2VuZW4gUmVnaW9uIGFiZnJhZ2VuIVxuIik7CisgICAgICAgICByZXR1cm47CisgICAgICAgfQorICAgICAgIGlmICghbWFnbmFtZSB8fCBtYWduYW1lPT0iIikKKyAgICAgICAgIG1hZ25hbWUgPSBnZXR1aWQodGhpc19pbnRlcmFjdGl2ZSgpKTsKKy8vICAgICAgICBpZiAoIW1hc3RlcigpLT5kb21haW5fbWVtYmVyKG1hZ25hbWUsIHdoYXQpKSB7CisvLyAgICAgICAgIHdyaXRlKGNhcGl0YWxpemUobWFnbmFtZSkrIiBpc3QgZ2FyIGtlaW4gTWl0YXJiZWl0ZXIgaW4gRGVpbmVyIFJlZ2lvbiFcbiIpOworLy8gICAgICAgICAgcmV0dXJuOworLy8gICAgICAgfQorICAgICAgIHdoYXQgPSAiL2QvIit3aGF0KyIvIittYWduYW1lKyIvIjsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorI2VuZGlmCisgICAgICB7CisgICAgICAgaWYgKCF3aGF0IHx8IHdoYXQgPT0gIiIpCisgICAgICAgICB3aGF0ID0gZ2V0dWlkKHRoaXNfaW50ZXJhY3RpdmUoKSk7CisgICAgICAgZWxzZSBpZiAod2hhdCAhPSBnZXR1aWQodGhpc19pbnRlcmFjdGl2ZSgpKSkgeworICAgICAgICAgd3JpdGUoIlNvcnJ5LCBEdSBrYW5uc3QgbnVyIERlaW5lIGVpZ2VuZW4gT2JqZWt0ZSBhYmZyYWdlbiFcbiIpOworICAgICAgICAgcmV0dXJuOworICAgICAgIH0KKyAgICAgICB3aGF0PSIvIit3aGF0KyIvIjsKKyAgICAgIH0KKyAgaWYgKGFsbG93ZWQoKSkKKyAgICB0aGlzX2ludGVyYWN0aXZlKCktPk1vcmUoZ2V0TWF0Y2hBcmNoKHdoYXQpKTsKKyAgZWxzZQorICAgIHRoaXNfaW50ZXJhY3RpdmUoKS0+TW9yZShnZXRNYXRjaCh3aGF0KSk7CisgIGxvZ19maWxlKCJBUkNIL0VQWnVncmlmZmUiLCBjdGltZSh0aW1lKCkpKyI6ICIrCisgICAgY2FwaXRhbGl6ZShnZXR1aWQodGhpc19pbnRlcmFjdGl2ZSgpKSkrIiBzY2hhdXRlIHNpY2ggIit3aGF0KyIgYW4uXG4iKTsKKyAgcmV0dXJuOworfQorCitub21hc2sgdm9pZCBQcmVwYXJlVkNRdWVyeShzdHJpbmcgZmlsZSkKK3sKKyAgc3RyaW5nIHBhdGgsICpwYXJ0czsKKworICB2Y19vYiA9IDA7CisKKyAgaWYgKCFwcmV2aW91c19vYmplY3QoKSB8fCAhc3RyaW5ncChmaWxlKSkKKyAgICByZXR1cm47CisKKyAgcGFydHMgPSBleHBsb2RlKG9iamVjdF9uYW1lKHByZXZpb3VzX29iamVjdCgpKSwiLyIpOworCisgIGlmIChwYXJ0c1s8MV0gPT0gInZpcnR1YWxfY29tcGlsZXIiKSB7CisgICAgcGF0aCA9IGltcGxvZGUocGFydHNbMC4uPDJdKyh7IGZpbGUgfSksICIvIik7CisgICAgaWYgKGZpbGVfc2l6ZShwYXRoKyIuYyIpIDwgMCkKKyAgICAgIHZjX29iID0gcGF0aDsKKyAgfQorfQorCitub21hc2sgbWl4ZWQgKlF1ZXJ5RXhwbG9yZSgpCit7CisgIHN0cmluZyBmbjsKKworICBpZiAoIXByZXZpb3VzX29iamVjdCgpKQorICAgIHJldHVybiAwOworCisgIGlmICghbWVtYmVyKG9icywgZm4gPSBvbGRfZXhwbG9kZShvYmplY3RfbmFtZShwcmV2aW91c19vYmplY3QoKSksIiMiKVswXSkpCisgICAgaWYgKCF2Y19vYiB8fCAhbWVtYmVyKG9icywgZm4gPSB2Y19vYikpIHsKKyAgICAgIHZjX29iID0gMDsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICB2Y19vYiA9IDA7CisgIHJldHVybiAoeyBvYnNbZm4sIE1QT1NfVFlQRV0sIG9ic1tmbl0gfSk7Cit9CisKK25vbWFzayBpbnQgUXVlcnlNYXhFUCgpCit7CisgIHJldHVybiAoZXBjb3VudHx8MSk7Cit9CisKK25vbWFzayBpbnQgUXVlcnlBdmVyYWdlKCkKK3sKKyAgcmV0dXJuIChlcGF2Z3x8MSk7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfYXJjaChvYmplY3QgdSkKK3sKKyAgIHJldHVybiBxdWVyeV93aXpfbGV2ZWwodSk+PUFSQ0hfTFZMOworfQorCitwcml2YXRlIGludCBjaGVja190b19mYXN0KHN0cmluZyBuYW1lLCBzdHJpbmcgZm4sIGludCBnZXNldHp0KQoreworICAgIGlmIChnZXNldHp0KSByZXR1cm4gMTsgLy8gUmlrdXMsIHNvbnN0IGFyZ2VyIHNjcm9sbCA6KQorCisgICAgbG9nX2ZpbGUoRlBfTE9HLHNwcmludGYoIiVzIDogJXMgOiAlc1xuIixuYW1lLGZuLGR0aW1lKHRpbWUoKSkpLDUwMDAwMCk7CisKKyAgICBpZiAoICFtZW1iZXIoIGxhc3Rmb3VuZCwgbmFtZSApICkKKyAgICAgICAgbGFzdGZvdW5kICs9IChbIG5hbWU6IHRpbWUoKTsgMTsgKHsgZm4gKyAiIyojIiArIGR0aW1lKHRpbWUoKSkgKyAiIyojIiArZ2VzZXR6dCB9KSBdKTsKKyAgICBlbHNlIGlmICggdGltZSgpIDw9IGxhc3Rmb3VuZFtuYW1lLCAwXSArIExGX1RJTUUgKXsKKyAgICAgICAgbGFzdGZvdW5kW25hbWUsIDFdKys7CisgICAgICAgIGxhc3Rmb3VuZFtuYW1lLCAyXSA9ICh7IGZuICsgIiMqIyIgKyBkdGltZSh0aW1lKCkpICsgIiMqIyIgK2dlc2V0enQgfSkKKyAgICAgICAgICAgICsgbGFzdGZvdW5kW25hbWUsMl07CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBsYXN0Zm91bmRbbmFtZSwgMV0gPSAxOworICAgICAgICBsYXN0Zm91bmRbbmFtZSwgMl0gPSAoeyBmbiArICIjKiMiICsgZHRpbWUodGltZSgpKSArICIjKiMiICtnZXNldHp0IH0pOworICAgIH0KKworICAgIGxhc3Rmb3VuZFtuYW1lLCAwXSA9IHRpbWUoKTsKKworICAgIGlmICggbGFzdGZvdW5kW25hbWUsIDFdID49IExGX1dBUk4gKXsKKyAgICAgICAgb2JqZWN0ICp1OworICAgICAgICBpbnQgaTsKKyAgICAgICAgc3RyaW5nICp0bXA7CisKKy8vICAgICAgICB1ID0gZmlsdGVyKCB1c2VycygpLCAiY2hlY2tfYXJjaCIgKTsKKy8vICAgICAgICBtYXAoIHUsICMndGVsbF9vYmplY3QvKicqLywgIioqKiogRlAtTGlzdGUvU2NyaXB0ICIgKworLy8gICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShuYW1lKSArICIgKCIgKyBkdGltZSh0aW1lKCkpICsgIikgKioqKlxuIiApOworCisgICAgICAgIGZvciAoIGkgPSBzaXplb2YobGFzdGZvdW5kW25hbWUsIDJdKTsgaS0tOyApeworICAgICAgICAgICAgdG1wID0gZXhwbG9kZSggbGFzdGZvdW5kW25hbWUsIDJdW2ldLCAiIyojIiApOworICAgICAgICAgICAgbG9nX2ZpbGUoIExGX0xPRywgc3ByaW50ZiggIiVzIDogJXMgOiAlcyA6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBbMV0sIG5hbWUsIHRtcFsyXSwgdG1wWzBdICksIDUwMDAwMCApOworICAgICAgICB9CisKKyAgICAgICAgbGFzdGZvdW5kW25hbWUsIDJdID0gKHt9KTsKKyAgICB9CisgICAgcmV0dXJuIDE7Cit9CisKK25vbWFzayBpbnQgR2l2ZUV4cGxvcmF0aW9uUG9pbnQoc3RyaW5nIGtleSkKK3sKKyAgc3RyaW5nIGZuOworICBzdHJpbmcgZXA7CisgIGludCBnZXNldHp0OworCisgIGlmICghcHJldmlvdXNfb2JqZWN0KCkgfHwgIXRoaXNfaW50ZXJhY3RpdmUoKSB8fCAhdGhpc19wbGF5ZXIoKSB8fAorICAgICAgIHRoaXNfcGxheWVyKCkgIT0gdGhpc19pbnRlcmFjdGl2ZSgpIHx8CisgICAgICAgdGhpc19wbGF5ZXIoKS0+UXVlcnlQcm9wKFBfS0lMTFMpIHx8CisgICAgICAgdGhpc19wbGF5ZXIoKS0+UXVlcnlHdWVzdCgpICAgICAgICkKKyAgICByZXR1cm4gMDsKKworICBmbiA9IG9sZF9leHBsb2RlKG9iamVjdF9uYW1lKHByZXZpb3VzX29iamVjdCgpKSwgIiMiKVswXTsKKworICBpZiAoIW1lbWJlcihvYnMsIGZuKSkKKyAgICByZXR1cm4gMDsKKworICBpZiAobWVtYmVyKG9ic1tmbl0sa2V5KSA8IDApCisgICAgcmV0dXJuIDA7CisKKyAgZXAgPSAoTUFTVEVSLT5xdWVyeV9lcChnZXR1aWQodGhpc19pbnRlcmFjdGl2ZSgpKSkgfHwgIiIpOworCisgIGdlc2V0enQ9dGVzdF9iaXQoZXAsb2JzW2ZuLDFdKTsKKyAgY2hlY2tfdG9fZmFzdChnZXR1aWQodGhpc19wbGF5ZXIoKSksZm4sZ2VzZXR6dCk7CisgIGlmIChnZXNldHp0KSByZXR1cm4gMDsKKyAgCisgIGNhdGNoKGVwID0gc2V0X2JpdChlcCwgb2JzW2ZuLDFdKSk7CisKKyAgcmV0dXJuIChpbnQpTUFTVEVSLT51cGRhdGVfZXAoZ2V0dWlkKHRoaXNfaW50ZXJhY3RpdmUoKSksZXApOworfQorCitub21hc2sgaW50IEdpdmVFeHBsb3JhdGlvblBvaW50T2JqZWN0KHN0cmluZyBrZXksIG9iamVjdCBvYikKK3sKKyAgc3RyaW5nIGZuOworICBzdHJpbmcgZXA7CisgIGludCBnZXNldHp0OworICAKKyAgaWYgKCFvYmplY3RwKG9iKSB8fCBvYi0+UXVlcnlQcm9wKFBfS0lMTFMgKSkKKyAgICByZXR1cm4gMDsKKworICBmbiA9IG9sZF9leHBsb2RlKG9iamVjdF9uYW1lKHByZXZpb3VzX29iamVjdCgpKSwgIiMiKVswXTsKKworICBpZiAoIW1lbWJlcihvYnMsIGZuKSkKKyAgICByZXR1cm4gMDsKKworICBpZiAobWVtYmVyKG9ic1tmbl0sa2V5KSA8IDApCisgICAgcmV0dXJuIDA7CisKKyAgZXAgPSAoTUFTVEVSLT5xdWVyeV9lcChnZXR1aWQob2IpKSB8fCAiIik7CisKKyAgZ2VzZXR6dD10ZXN0X2JpdChlcCxvYnNbZm4sMV0pOworICBjaGVja190b19mYXN0KGdldHVpZCh0aGlzX3BsYXllcigpKSxmbixnZXNldHp0KTsKKyAgaWYgKGdlc2V0enQpIHJldHVybiAwOworCisgIGNhdGNoKGVwID0gc2V0X2JpdChlcCwgb2JzW2ZuLDFdKSk7CisKKyAgcmV0dXJuIChpbnQpTUFTVEVSLT51cGRhdGVfZXAoZ2V0dWlkKG9iKSxlcCk7Cit9CisKKworcHJpdmF0ZSBpbnQgUXVlcnlSZWFsRXhwbG9yYXRpb25Qb2ludHMoc3RyaW5nIHBsKQoreworICByZXR1cm4gY291bnRfYml0cyhNQVNURVItPnF1ZXJ5X2VwKHBsKSB8fCAiICIpOworfQorCitub21hc2sgaW50IFF1ZXJ5RXhwbG9yYXRpb25Qb2ludHMobWl4ZWQgcGwpCit7CisgIG1peGVkIHZhbDsKKyAgaW50IGVwOworCisgIGlmICghc3RyaW5ncChwbCkpIHBsPWdldHVpZChwbCk7CisgIGVwPVF1ZXJ5UmVhbEV4cGxvcmF0aW9uUG9pbnRzKHBsKTsKKworICBpZiAoYWxsb3dlZCgpIHx8ICFlcCkgcmV0dXJuIGVwOworCisgIHZhbD1xdWVyeXRpbWVbcGxdOworCisgIGlmICghcG9pbnRlcnAodmFsKSB8fCBzaXplb2YodmFsKTwyKQorICAgIHZhbD0oezAsdGltZSgpfSk7CisKKyAgaWYgKHRpbWUoKT49dmFsWzFdKSB7CisgICAgdmFsID0gKHsgZXAgKyByYW5kb20oNiktMywgdGltZSgpKzMwMCtyYW5kb20oMzAwKSB9KTsKKyAgICBpZiAodmFsWzBdPDApIHZhbFswXT0wOworICAgIHF1ZXJ5dGltZSs9KFtwbDp2YWxdKTsKKyAgfQorICByZXR1cm4gdmFsWzBdOworfQorCitwcml2YXRlIGludCByZW1vdmVfZnAoaW50IG51bSwgc3RyaW5nIHBsKQoreworICBpbnQgaSxqLGssdCxtYXhFUDsKKyAgc3RyaW5nIGVwOworICBlcCA9IChNQVNURVItPnF1ZXJ5X2VwKHBsKSB8fCAiIik7CisKKyAgbWF4RVAgPSBRdWVyeU1heEVQKCk7CisgIGZvciggaT0wOyBpPG51bTsgaSsrKQorICB7CisgICAgdCA9IHJhbmRvbShtYXhFUCk7CisgICAgZm9yKCBqPTA7IGo8bWF4RVA7IGorKyApIHsKKyAgICAgIGlmKCB0ZXN0X2JpdChlcCwgaz0odCtqKSVtYXhFUCApICkgYnJlYWs7CisgICAgfQorICAgIGlmKCBqPT1tYXhFUCApIGJyZWFrOworICAgIGVwID0gY2xlYXJfYml0KGVwLCBrKTsKKyAgfQorICBNQVNURVItPnVwZGF0ZV9lcChwbCxlcCk7CisgIHJldHVybiBpOworfQorCisvKiAqLworCisvLyBxdW90ZWQgZnJvbSAvc3lzL21haWwuaAorI2RlZmluZSBNU0dfRlJPTSAwCisjZGVmaW5lIE1TR19TRU5ERVIgMQorI2RlZmluZSBNU0dfUkVDSVBJRU5UIDIKKyNkZWZpbmUgTVNHX0NDIDMKKyNkZWZpbmUgTVNHX0JDQyA0CisjZGVmaW5lIE1TR19TVUJKRUNUIDUKKyNkZWZpbmUgTVNHX0RBVEUgNgorI2RlZmluZSBNU0dfSUQgNworI2RlZmluZSBNU0dfQk9EWSA4CisKK25vbWFzayBpbnQgUmVtb3ZlRlAoaW50IG51bSwgc3RyaW5nIHBsLCBzdHJpbmcgZ3J1bmQpCit7CisgIGludCBpOworICBzdHJpbmcgdGV4dDsKKyAgbWl4ZWQqIG1haWw7CisKKyAgaWYgKCFhbGxvd2VkKCkpIHJldHVybiAtMTsKKyAgaWYoIG51bTwwICkgcmV0dXJuIC0zOworICBpZiAoIWdydW5kIHx8IGdydW5kPT0iIikgZ3J1bmQ9Ijx1bmJla2FubnQ+IjsKKyAgaWYgKCFwbCkgcmV0dXJuIC0yOworICBpPXJlbW92ZV9mcChudW0sIHBsKTsKKyAgbG9nX2ZpbGUoIkFSQ0gvZnBfc3RyYWZlbiIsIGN0aW1lKHRpbWUoKSkrIjogIgorICAgICt0aGlzX2ludGVyYWN0aXZlKCktPk5hbWUoV0VSKSsiIGxvZXNjaHQgIitwbCsiICIraQorICAgICsiIEZQc1xuR3J1bmQ6IitncnVuZCsiXG4iKTsKKyAgaWYoIGk+MCApIHsKKyAgICAgdGV4dCA9CisgICAgICJIYWxsbyAiK2NhcGl0YWxpemUocGwpKyIsXG5cbiIrCisgICAgIGJyZWFrX3N0cmluZygKKyAgICAgIHRoaXNfaW50ZXJhY3RpdmUoKS0+TmFtZShXRVIpKyIgaGF0IHNvZWJlbiB2ZXJhbmxhc3N0LCBkYXNzIERpciAiK2kKKyAgICAgICsiIEZQcyBhYmdlem9nZW4gd3VyZGVuLlxuR3J1bmQ6IitncnVuZCsiXG4iLCA3OCApOworCisgICAgIG1haWwgPSBhbGxvY2F0ZSg5KTsKKyAgICAgbWFpbFtNU0dfRlJPTV0gPSBnZXR1aWQodGhpc19pbnRlcmFjdGl2ZSgpKTsKKyAgICAgbWFpbFtNU0dfU0VOREVSXSA9IE1VRE5BTUU7CisgICAgIG1haWxbTVNHX1JFQ0lQSUVOVF0gPSBwbDsKKyAgICAgbWFpbFtNU0dfQ0NdPTA7CisgICAgIG1haWxbTVNHX0JDQ109MDsKKyAgICAgbWFpbFtNU0dfU1VCSkVDVF09IkZQLVJlZHVrdGlvbiI7CisgICAgIG1haWxbTVNHX0RBVEVdPWR0aW1lKHRpbWUoKSk7CisgICAgIG1haWxbTVNHX0lEXT1NVUROQU1FIjoiK3RpbWUoKTsKKyAgICAgbWFpbFtNU0dfQk9EWV09dGV4dDsKKworICAgICAiL3NlY3VyZS9tYWlsZXIiLT5EZWxpdmVyTWFpbChtYWlsLDEpOworICB9CisgIHJldHVybiBpOworfQorLyogKi8KKworcHJpdmF0ZSBpbnQgYWRkX2ZwKGludCBudW0sIHN0cmluZyBwbCkKK3sKKyAgaW50IGksaixrLHQsbWF4RVA7CisgIHN0cmluZyBlcDsKKyAgZXAgPSAoTUFTVEVSLT5xdWVyeV9lcChwbCkgfHwgIiIpOworCisgIG1heEVQID0gUXVlcnlNYXhFUCgpOworICBmb3IoIGk9MDsgaTxudW07IGkrKykKKyAgeworICAgIHQgPSByYW5kb20obWF4RVApOworICAgIGZvciggaj0wOyBqPG1heEVQOyBqKysgKSB7CisgICAgICBpZiggIXRlc3RfYml0KGVwLCBrPSh0K2opJW1heEVQICkgKSBicmVhazsKKyAgICB9CisgICAgaWYoIGo9PW1heEVQICkgYnJlYWs7CisgICAgZXAgPSBzZXRfYml0KGVwLCBrKTsKKyAgfQorICBNQVNURVItPnVwZGF0ZV9lcChwbCxlcCk7CisgIHJldHVybiBpOworfQorCitub21hc2sgaW50IEFkZEZQKGludCBudW0sIHN0cmluZyBwbCkKK3sKKyAgaW50IGk7CisgIGlmICghYWxsb3dlZCgpKSByZXR1cm4gLTE7CisgIGlmICggbnVtPDAgKSByZXR1cm4gLTM7CisgIGlmICghcGwpIHJldHVybiAtMjsKKyAgaT1hZGRfZnAobnVtLCBwbCk7CisgIGxvZ19maWxlKCJBUkNIL2ZwX3N0cmFmZW4iLCBjdGltZSh0aW1lKCkpKyI6ICIKKyAgICArdGhpc19pbnRlcmFjdGl2ZSgpLT5OYW1lKFdFUikrIiBnaWJ0ICIrcGwrIiAiK2kKKyAgICArIiBGUHNcbiIpOworCisgIHJldHVybiBpOworfQorCitub21hc2sgaW50IFNldEZQKGludCBudW0sIHN0cmluZyBwbCkKK3sKKyAgaW50IG1heEVQOworICBzdHJpbmcgZXA7CisgIGlmICghYWxsb3dlZCgpKSByZXR1cm4gLTE7CisgIGlmICggbnVtPDAgKSByZXR1cm4gLTM7CisgIGlmICghcGwpIHJldHVybiAtMjsKKyAgZXAgPSAoTUFTVEVSLT5xdWVyeV9lcChwbCkgfHwgIiIpOworCisgIG1heEVQID0gUXVlcnlNYXhFUCgpOworICBpZiAobnVtPDAgfHwgbnVtPj1tYXhFUCkgcmV0dXJuIC00OworICBlcCA9IHNldF9iaXQoZXAsIG51bSk7CisgIE1BU1RFUi0+dXBkYXRlX2VwKHBsLGVwKTsKKyAgcmV0dXJuIG51bTsKK30KKworbm9tYXNrIGludCBDbGVhckZQKGludCBudW0sIHN0cmluZyBwbCkKK3sKKyAgaW50IG1heEVQOworICBzdHJpbmcgZXA7CisgIGlmICghYWxsb3dlZCgpKSByZXR1cm4gLTE7CisgIGlmICggbnVtPDAgKSByZXR1cm4gLTM7CisgIGlmICghcGwpIHJldHVybiAtMjsKKyAgZXAgPSAoTUFTVEVSLT5xdWVyeV9lcChwbCkgfHwgIiIpOworCisgIG1heEVQID0gUXVlcnlNYXhFUCgpOworICBpZiAobnVtPDAgfHwgbnVtPj1tYXhFUCkgcmV0dXJuIC00OworICBlcCA9IGNsZWFyX2JpdChlcCwgbnVtKTsKKyAgTUFTVEVSLT51cGRhdGVfZXAocGwsZXApOworICByZXR1cm4gbnVtOworfQorCitwcml2YXRlIHZvaWQgcHJpbnRlcCggaW50IG5yLCBzdHJpbmcga2V5LCBpbnQga2luZCwgc3RyaW5nKiBkZXQgKQoreworICBvdXRwdXQrPXNwcmludGYoIiU0ZCAlcyAlcy5jICVzICh7ICVzIH0pXG4iLG5yLHRlc3RfYml0KGJvbnVzLG5yKT8iYiI6Im4iLGtleSxFUF9UWVBFU1traW5kXSwKKyAgICAgICAgICAgICAgICBzdHJBcnIoZGV0KSk7Cit9CisKK25vbWFzayB2YXJhcmdzIGludCBTaG93UGxheWVyRVBzKHN0cmluZyBwbCxzdHJpbmcgcGF0dGVybikKK3sKKyAgc3RyaW5nIGVwLHRlc3RzdHJpbmc7CisgIGlmICghYWxsb3dlZCgpKSByZXR1cm4gLTE7CisgIGVwID0gKE1BU1RFUi0+cXVlcnlfZXAocGwpIHx8ICIiKTsKKworICBvdXRwdXQ9IiI7CisgIGlmICghcGF0dGVybiB8fCBwYXR0ZXJuPT0iIikKKyAgICB0ZXN0c3RyaW5nPSIlcyI7CisgIGVsc2UgdGVzdHN0cmluZz0iJXMiK3BhdHRlcm4rIiVzIjsKKyAgd2Fsa19tYXBwaW5nKCBvYnMsIGxhbWJkYSggKHsgJ2tleSwgJ3YxLCAndjIsICd2MyB9KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdjEgLS0gZGV0YWlscywgdjIgLS0gTnVtbWVyLCB2MyAtLSBhcnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8ga2V5IC0tIEZpbGVuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICh7ICMnaWYsICh7ICMndGVzdF9iaXQsIGVwLCAndjIgfSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICh7IydpZiwoeyMnc3NjYW5mLCdrZXksdGVzdHN0cmluZywndjQsJ3Y1fSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICh7ICMncHJpbnRlcCwgJ3YyLCAna2V5LCAndjMsICd2MSB9KQorICAgICAgICAgICAgICAgICAgICAgICAgICB9KSB9KSApKTsKKyAgdGhpc19pbnRlcmFjdGl2ZSgpLT5Nb3JlKG91dHB1dCk7CisgIHJldHVybiAxOworfQorCisvLyBIaWVyIGtvbW1lbiBGdW5rdGlvbmVuIGZ1ZXIgZGllIExldmVscHVua3RlCisvLyBGdW5rdGlvbiBmdWVyIExldmVscHVua3RlIHN0ZWh0IGltIExFUE1BU1RFUiEKKworbm9tYXNrIGludCBRdWVyeUxFUChpbnQgbGVwKSB7CisgICAgcmFpc2VfZXJyb3IoIkJpdHRlIFF1ZXJ5TEVQKCkgaW0gTEVQTUFTVEVSIGFiZnJhZ2VuLCBuaWNodCBpbSAiCisgICAgICAgIkVQTUFTVEVSISIpOworICAgIHJldHVybigtMSk7IC8vbmV2ZXIgcmVhY2hlZAorfQorCitzdHJpbmcgUXVlcnlGb3JzY2h1bmcoKQoreworICBpbnQgbXk7CisgIHN0cmluZyByZXQ7CisKKyAgaWYgKChteT1RdWVyeVJlYWxFeHBsb3JhdGlvblBvaW50cyhnZXR1aWQocHJldmlvdXNfb2JqZWN0KCkpKSkgPCBNSU5fRVApCisgICAgcmV0dXJuICJEdSBrZW5uc3QgRGljaCBpbSAiTVVETkFNRSIgc28gZ3V0IHdpZSBnYXIgbmljaHQgYXVzLlxuIjsKKworICBteSAqPSAxMDA7CisgIGludCBhYnNvbHV0ZSA9IG15L1F1ZXJ5TWF4RVAoKTsKKyAgaW50IHJlbGF0aXZlID0gbXkvUXVlcnlBdmVyYWdlKCk7CisKKyAgcmV0ID0gIlZlcmdsaWNoZW4gbWl0IERlaW5lbiBNaXRzcGllbGVybiwga2VubnN0IER1IERpY2ggaW0gIk1VRE5BTUUiICI7CisgIHN3aXRjaChyZWxhdGl2ZSkgeworICBjYXNlIDAuLjEwOgorICAgIHJldCArPSAia2F1bSI7CisgICAgYnJlYWs7CisgIGNhc2UgMTEuLjQwOgorICAgIHJldCArPSAiYWV1c3NlcnN0IHNjaGxlY2h0IjsKKyAgICBicmVhazsKKyAgY2FzZSA0MS4uNTY6CisgICAgcmV0ICs9ICJzZWhyIHNjaGxlY2h0IjsKKyAgICBicmVhazsKKyAgY2FzZSA1Ny4uNzI6CisgICAgcmV0ICs9ICJzY2hsZWNodCI7CisgICAgYnJlYWs7CisgIGNhc2UgNzMuLjkzOgorICAgIHJldCArPSAidW50ZXJkdXJjaHNjaG5pdHRsaWNoIjsKKyAgICBicmVhazsKKyAgY2FzZSA5NC4uMTA5OgorICAgIHJldCArPSAiZHVyY2hzY2huaXR0bGljaCBndXQiOworICAgIGJyZWFrOworICBjYXNlIDExMC4uMTI1OgorICAgIHJldCArPSAiYmVzc2VyIGFscyBkZXIgRHVyY2hzY2huaXR0IjsKKyAgICBicmVhazsKKyAgY2FzZSAxMjYuLjE0NToKKyAgICByZXQgKz0gInJlY2h0IGd1dCI7CisgICAgYnJlYWs7CisgIGNhc2UgMTQ2Li4xNzA6CisgICAgcmV0ICs9ICJ6aWVtbGljaCBndXQiOworICAgIGJyZWFrOworICBjYXNlIDE3MS4uMjEwOgorICAgIHJldCArPSAiZ3V0IjsKKyAgICBicmVhazsKKyAgY2FzZSAyMTEuLjMwMDoKKyAgICByZXQgKz0gInNlaHIgZ3V0IjsKKyAgICBicmVhazsKKyAgY2FzZSAzMDEuLjQwMDoKKyAgICByZXQgKz0gImF1c3Nlcm9yZGVudGxpY2ggZ3V0IjsKKyAgICBicmVhazsKKyAgY2FzZSA0MDEuLjUwMDoKKyAgICByZXQgKz0gInVuaGVpbWxpY2ggZ3V0IjsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICByZXQgKz0gImVpbmZhY2ggaGVydm9ycmFnZW5kIjsKKyAgICBicmVhazsKKyAgfQorICByZXQgKz0gIiBhdXMuXG5BYnNvbHV0IGdlc2VoZW4gIjsKKworICBzd2l0Y2goYWJzb2x1dGUpIHsKKyAgY2FzZSAwLi41OgorICAgIHJldCArPSAia2VubnN0IER1IG51ciB3ZW5pZyB2b20gIk1VRE5BTUUiLiI7CisgICAgYnJlYWs7CisgIGNhc2UgNi4uMTA6CisgICAgcmV0ICs9ICJzb2xsdGVzdCBEdSBEaWNoIHZpZWxsZWljaHQgbm9jaCBnZW5hdWVyIHVtc2VoZW4uIjsKKyAgICBicmVhazsKKyAgY2FzZSAxMS4uMTc6CisgICAgcmV0ICs9ICJiaXN0IER1IGR1cmNoYXVzIHNjaG9uIGhlcnVtZ2Vrb21tZW4uIjsKKyAgICBicmVhazsKKyAgY2FzZSAxOC4uMjU6CisgICAgcmV0ICs9ICJoYXN0IER1IHNjaG9uIGVpbmlnZXMgZ2VzZWhlbi4iOworICAgIGJyZWFrOworICBjYXNlIDI2Li4zNToKKyAgICByZXQgKz0gImJpc3QgRHUgc2Nob24gd2VpdCBoZXJ1bWdla29tbWVuLiI7CisgICAgYnJlYWs7CisgIGNhc2UgMzYuLjUwOgorICAgIHJldCArPSAia29lbm50ZXN0IER1IGVpZ2VudGxpY2ggZWluZW4gUmVpc2VmdWVocmVyIGhlcmF1c2JyaW5nZW4uIjsKKyAgICBicmVhazsKKyAgY2FzZSA1MS4uNzU6CisgICAgcmV0ICs9ICJoYXN0IER1IHNjaG9uIHNlaHIgdmllbCBnZXNlaGVuLiI7CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgcmV0ICs9ICJiZXNpdHp0IER1IGVpbmUgaGVydm9ycmFnZW5kZSBPcnRza2VubnRuaXMuIjsKKyAgfQorICByZXR1cm4gYnJlYWtfc3RyaW5nKHJldCwgNzgsIDAsIDEpOworfQorCisvLyBOaWNodCBqZWRlciBNYWdpZXIgbXVzcyBkZW4gRVBNQVNURVIgZW50c29yZ2VuIGtvZW5uZW4uCitzdHJpbmcgTm90aWZ5RGVzdHJ1Y3Qob2JqZWN0IGNhbGxlcikgeworICBpZiggKGNhbGxlciE9dGhpc19vYmplY3QoKSAmJiAhQVJDSF9TRUNVUklUWSkgfHwgcHJvY2Vzc19jYWxsKCkgKQorICB7CisgICAgcmV0dXJuICJEdSBkYXJmc3QgZGVuIEV4cGxvcmF0aW9uIE1hc3RlciBuaWNodCB6ZXJzdG9lcmVuIVxuIjsKKyAgfQorICByZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvc2VjdXJlL2Z0cGQuYyBiL3NlY3VyZS9mdHBkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ5Y2YwMwotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9mdHBkLmMKQEAgLTAsMCArMSwxNzggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiogZnRwZC5jCisqKiBSdW1hdGFAbWcKKyoqIDEzLjYuMTk5OQorKioKKyoqIEVybWl0dGx1bmcgZGVyIFp1Z3JpZmZzcmVjaHRlIGF1cyBkZW4gVXNlcmRhdGVuLgorKioKKyoqIERpZXNlcyBPYmpla3Qgd2lyZCB2b20gZnRwaW1wIGF1cyBhdWZnZXJ1ZmVuLCBkZXIgd2llZGVydW0gdm9tIG1hc3RlcgorKiogYXVmZ2VydWZlbiB3aXJkLCB1bSBkaWUgWnVncmlmZnNyZWNodGUgenUgcHJ1ZWZlbi4KKyoqCisqKiBGdWt0aW9uc3dlaXNlOgorKiogKyBJbSBNYXN0ZXIgd2lyZCB2b20gVU5JWC1mdHBkIGF1cyBGdHBBY2Nlc3MgKC9zZWN1cmUvbWFzdGVyL25ldHdvcmspCisqKiAgIGF1ZmdlcnVmZW4uCisqKiArIERpZXNlcyBydWZ0IGRhbm4sIHNvYmFsZCBlaW4gWnVncmlmZiBlcmthbm50IHdpcmQKKyoqICAgUXVlcnlSZWFkLCBRdWVyeVdyaXRlIG9kZXIgUXVlcnlEaXIgYXVmLgorKiogKyBEaWVzZSBmcmFnZW4gZGVuIE1hc3Rlciwgb2IgZGVyIFp1Z3JpZmYgbGVnYWwgaXN0LgorKiogKyBRdWVyeURpciBsaWVmZXJ0IGF1Y2ggZ2xlaWNoIGRhcyBFcmdlYm5pcyBtaXQuCisqKgorKiogVW0gZnRwLXp1Z3JpZmZlIPxiZXJ3YWNoZW4genUga/ZubmVuLCBrYW5uIGRlciBmdHBkIGVpbmUgbGlzdGUgZGVyCisqKiB1ZWJlcndhY2h0ZW4gc3BpZWxlciBsaWVmZXJuIHVuZCBkZXJlbiBadWdyaWZmZSBhdWYgZGVtIEZUUCBLYW5hbCBhdXNnZWJlbi4KKyoqCisqKiBhZGQoIG5hbWUsIHplaXQgKSAtIEZUUCBadWdyaWZmZSBkZXMgU3BpZWxlcnMgJ25hbWUnIHdlcmRlbiBwcm90b2tvbGxpZXJ0LgorKiogICAgICAgICAgICAgICAgICAgICBOYWNoICd6ZWl0JyB3aXJkIGRpZXNlciBadWdyaWZmIGF1dG9tYXRpc2NoIGJlZW5kZXQuCisqKiAgICAgICAgICAgICAgICAgICAgIElzdCAnemVpdCcgPD0gMCwgd2lyIGF1ZiBld2lnIHVlYmVyd2FjaHQuIAorKiogc3ViKCBuYW1lICkgICAgICAgLSBGVFAgU25vb3AgZnVlciBTcGllbGVyICduYW1lJyBkaXJla3QgYXVmaGViZW4uCisqKiBsaXN0KCkgICAgICAgICAgICAtIE1hcHBpbmcgZGVyIHVlYmVyd2FjaHRlbiBTcGllbGVyIHp1cnVlY2tnZWJlbi4KKyoqCisqKiBGSUxFUzoKKyoqICAgL3NlY3VyZS9tYXN0ZXIvbmV0d29yay5jCisqKiAgIC9zZWN1cmUvZnRwZC5jCisqKiAgIC9zdGQvc2hlbGxzL2ZpbGVzeXMvZnRwaW1wLmMKKyoqICAgL3NlY3VyZS9BUkNIL2Z0cGQubworKiogICAvcC9kYWVtb24vY2hhbm5lbGQuaW5pdAorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIi9zZWN1cmUvd2l6bGV2ZWxzLmgiCisjaW5jbHVkZSAiL3N5cy9kYWVtb24uaCIKKworI2RlZmluZSBGVFBEU0FWRSAiL3NlY3VyZS9BUkNIL2Z0cGQiCisjZGVmaW5lIEZUUERfQ0ggIkZUUCIKKyNkZWZpbmUgQkJNQVNURVIgIi9zZWN1cmUvYmJtYXN0ZXIiCisKK21hcHBpbmcgbW9uaXRvcmVkOworLy8gWnUgamVkZW0gU3BpZWxlcm5hbWVuIHdpcmQgdmVybWVya3QsIHdpZSBsYW5nZSBkaWUgVWViZXJ3YWNodW5nIGRhdWVybiBzb2xsLgorLy8gWmFobGVuIDw9IDAgYmVkZXV0ZW4gZnVlciBpbW1lci4KKworbm9tYXNrIHZvaWQgY3JlYXRlKCkgeworICBpZiggY2xvbmVwKHRoaXNfb2JqZWN0KCkpICkgeworICAgIGRlc3RydWN0KCB0aGlzX29iamVjdCgpICk7CisgICAgcmV0dXJuOworICB9CisgIHNldGV1aWQoIGdldHVpZCgpICk7CisgIGlmKCAhcmVzdG9yZV9vYmplY3QoRlRQRFNBVkUpICkKKyAgICBtb25pdG9yZWQgPSAoW10pOworfQorCitub21hc2sgaW50IHBsYXllcl9leGlzdHMoIHN0cmluZyB1c2VyICkgeworICB1c2VyID0gbG93ZXJfY2FzZSh1c2VyKTsKKyAgaWYoICFzdHJpbmdwKCB1c2VyICkgfHwgc2l6ZW9mKCB1c2VyICkgPCAxICkgcmV0dXJuIDA7CisgIHJldHVybiBmaWxlX3NpemUoICIvc2F2ZS8iK3VzZXJbMC4uMF0rIi8iK3VzZXIrIi5vIiApID4gMDsKK30KKworbm9tYXNrIHZhcmFyZ3MgaW50IGFkZCggc3RyaW5nIHVzZXIsIGludCB0aW1lb3V0ICkgeworICBpZiggIUFSQ0hfU0VDVVJJVFkgKSByZXR1cm4gLTE7CisgIGlmKCAhcGxheWVyX2V4aXN0cyh1c2VyKSApIHJldHVybiAtMjsKKyAgbW9uaXRvcmVkW3VzZXJdID0gdGltZW91dDsKKyAgc2F2ZV9vYmplY3QoIEZUUERTQVZFICk7CisgIHJldHVybiAwOworfQorCitub21hc2sgaW50IHN1Yiggc3RyaW5nIHVzZXIgKSB7CisgIGlmKCAhQVJDSF9TRUNVUklUWSApIHJldHVybiAtMTsKKyAgaWYoICFwbGF5ZXJfZXhpc3RzKHVzZXIpICkgcmV0dXJuIC0yOworICBtb25pdG9yZWQgLT0gKFsgdXNlciBdKTsKKyAgc2F2ZV9vYmplY3QoIEZUUERTQVZFICk7CisgIHJldHVybiAwOworfQorCitub21hc2sgbWl4ZWQgbGlzdCgpIHsKKyAgaWYoICFBUkNIX1NFQ1VSSVRZICkgcmV0dXJuIC0xOworICByZXR1cm4gZGVlcF9jb3B5KG1vbml0b3JlZCk7Cit9CisKKyNkZWZpbmUgTkVXSU1QICJ5ZXMiCisKK3ByaXZhdGUgb2JqZWN0IGZpbmRGdHBJbXBGb3IoIHN0cmluZyB1c2VyICkgeworI2lmZGVmIE5FV0lNUAorICByZXR1cm4gIi9zZWN1cmUvaW1wZmV0Y2giLT5pbXBGb3IoIGxvd2VyX2Nhc2UodXNlcikgKTsKKyNlbHNlCisgIG9iamVjdCBpbXA7CisgIHN0cmluZyBmbmFtZTsKKworICB1c2VyID0gbG93ZXJfY2FzZSggdXNlciApOworICBmbmFtZSA9ICIvZnRwaW1wOiIgKyB1c2VyOworICBpbXAgPSBmaW5kX29iamVjdCggZm5hbWUgKTsKKyAgaWYoICFvYmplY3RwKGltcCkgKSB7CisgICAgaW1wID0gY2xvbmVfb2JqZWN0KCAic2VjdXJlL2Z0cGltcCIgKTsKKyAgICBpbXAtPlNldFVzZXIodXNlcik7CisgICAgcmVuYW1lX29iamVjdCggaW1wLCBmbmFtZSApOworICB9CisgIHJldHVybiBpbXA7CisjZW5kaWYKK30KKworcHJpdmF0ZSBub21hc2sgdm9pZCBtc2coIHN0cmluZyB1c2VyLCBzdHJpbmcgbSApIHsKKyAgaW50IHRpbWVvdXQ7CisgIG9iamVjdCByOworCisgIGlmKCAhc3RyaW5ncCh1c2VyKSApIHJldHVybjsKKyAgbSArPSAiXG4iOworICBpZiggKHI9ZmluZF9wbGF5ZXIoInJ1bWF0YSIpKSAmJiB1c2VyPT0iYXRhbXVyIiApIHsKKyAgICAgdGltZW91dCA9IENITUFTVEVSLT5zZW5kKEZUUERfQ0gsZmluZEZ0cEltcEZvcih1c2VyKSwgbSApOworICAgICB0ZWxsX29iamVjdCggciwgc3ByaW50ZigiJU9cbiIsIGZpbmRGdHBJbXBGb3IodXNlcikgKSApOworICB9CisgIEJCTUFTVEVSLT5mdHBiYih1c2VyLG0pOworICBpZiggIW1lbWJlcihtb25pdG9yZWQsdXNlcikgKSByZXR1cm47CisgIHRpbWVvdXQgPSBtb25pdG9yZWRbdXNlcl07CisgIGlmKCB0aW1lb3V0ID4gMCAmJiB0aW1lb3V0IDwgdGltZSgpICkgeworICAgIHN1YiggdXNlciApOworICAgIHJldHVybjsKKyAgfQorICBDSE1BU1RFUi0+c2VuZChGVFBEX0NILGZpbmRGdHBJbXBGb3IodXNlciksIG0gKTsKK30KKworbm9tYXNrIGludCBzZWN1cmUoKSB7CisgIHJldHVybiBwcmV2aW91c19vYmplY3QoKT09ZmluZF9vYmplY3QoTUFTVEVSKTsKK30KKworbm9tYXNrIG1peGVkIFF1ZXJ5UmVhZCggc3RyaW5nIHVzZXIsIHN0cmluZyBmaWxlICkgeworICBpZiggIXNlY3VyZSgpICkgcmV0dXJuIC0xOworICBpZiggKElTX1dJWkFSRCh1c2VyKSB8fCBmaWxlWzAuLjRdPT0iL29wZW4iKQorICAgICAgJiYgZmlsZVswXSA9PSAnLycKKyAgICAgICYmIE1BU1RFUi0+dmFsaWRfcmVhZChmaWxlLCB1c2VyLCAicmVhZF9maWxlIiwgMCkKKyAgICAgICkgeworICAgIG1zZyggdXNlciwgInJlYWQgIiArIGZpbGUgKTsKKyAgICByZXR1cm4gIk9LIjsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gIkZBSUwiOworICB9Cit9CisKK25vbWFzayBtaXhlZCBRdWVyeVdyaXRlKCBzdHJpbmcgdXNlciwgc3RyaW5nIGZpbGUgKSB7CisgIGlmKCAhc2VjdXJlKCkgKSByZXR1cm4gLTE7CisgIGlmKCBmaWxlWzBdID09ICcvJworICAgICAgJiYgTUFTVEVSLT52YWxpZF93cml0ZSggZmlsZSwgdXNlciwgIndyaXRlX2ZpbGUiLCAwKQorICAgICAgKSB7CisgICAgbXNnKCB1c2VyLCAid3JpdGUgIiArIGZpbGUgKTsKKyAgICByZXR1cm4gIk9LIjsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gIkZBSUwiOworICB9Cit9CisKKyNkZWZpbmUgREJHKHgpIGlmKGZpbmRfcGxheWVyKCJydW1hdGEiKSl7dGVsbF9vYmplY3QoZmluZF9wbGF5ZXIoInJ1bWF0YSIpLCJGVFBEOiIreCsiXG4iKTt9CisKKy8vbm9tYXNrIG1peGVkIFF1ZXJ5RGlyKCBzdHJpbmcgdXNlciwgc3RyaW5nIGZpbGUgKSB7CisvLyAgc3RyaW5nIHJlcGx5OworLy8gIG9iamVjdCBpbXA7CisvLworLy8gIGlmKCAhc2VjdXJlKCkgKSByZXR1cm4gLTE7CisvLyAgcmVwbHkgPSBRdWVyeVJlYWQoIHVzZXIsIGZpbGUgKTsKKy8vICBpZiggcmVwbHk9PSJGQUlMIiApIHJldHVybiAtMTsKKy8vCisvLyAgaW1wID0gZmluZEZ0cEltcEZvciggdXNlciApOworLy8gIGlmKCAhb2JqZWN0cChpbXApICkgcmV0dXJuIC0xOyAvLyBzaG91bGQgbmV2ZXIgaGFwcGVuCisvLworLy8gIHJldHVybiBpbXAtPkdldERpciggZmlsZSApOworLy99CisKK25vbWFzayBtaXhlZCBRdWVyeURpciggc3RyaW5nIHVzZXIsIHN0cmluZyBmaWxlICkgeworICBpZiggIXNlY3VyZSgpICkgcmV0dXJuIC0xOworICBpZiggZmlsZVswXSA9PSAnLycKKyAgICAgICYmIE1BU1RFUi0+dmFsaWRfcmVhZCggZmlsZSsiLyoiLCB1c2VyLCAiZ2V0X2RpciIsIDApKQorICAgICAgcmV0dXJuICJPSyI7CisgIGVsc2UgCisgICAgcmV0dXJuICJGQUlMIjsKK30KZGlmZiAtLWdpdCBhL3NlY3VyZS9mdHBpbXAuYyBiL3NlY3VyZS9mdHBpbXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWVlMzRjCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL2Z0cGltcC5jCkBAIC0wLDAgKzEsNzUgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBtYXN0ZXIvZnRwaW1wLmMgLS0gRlRQIEF2YXRhcgorLy8KKy8vICRJZDogZnRwaW1wLmMgNjQ0MCAyMDA3LTA4LTE4IDIzOjAwOjQ5WiBaZXNzdHJhICQKKy8vCisvLyBzaWVoZSAvc2VjdXJlL2Z0cGQKKworI3ByYWdtYSBzdHJvbmdfdHlwZXMKKworI2luY2x1ZGUgIi9zZWN1cmUvbWFzdGVyLmgiCisjZGVmaW5lIEZUUEQgIi9zZWN1cmUvZnRwZCIKKworLy9wcml2YXRlIGluaGVyaXQgIi9zdGQvc2hlbGxzL2ZpbGVzeXMvZmlsZXN5cyI7Citwcml2YXRlIGluaGVyaXQgIi9zZWN1cmUvbWlzYy9maWxlc3lzL2ZpbGVzeXMiOworCitzdGF0aWMgc3RyaW5nIHVzZXI7IC8vIE5hbWUgZGVzIHp1Z2Vob2VyaWdlbiBVc2VycworCitub21hc2sgcHJpdmF0ZSBpbnQgc2VjdXJlX2ltcGNhbGwoKSB7CisgIHJldHVybgorICAgIGdldHVpZChwcmV2aW91c19vYmplY3QoKSkgPT0gUk9PVElEICYmCisgICAgZ2V0ZXVpZChwcmV2aW91c19vYmplY3QoKSkgPT0gUk9PVElEOworCit9CisKKy8vIE5hY2ggZGVtIEF1ZnJ1ZiB2b24gU2V0VXNlciB3aXJkIGRlciBGaWxlbmFtZSBnZWFlZG5lcnQsIHNvZGFzcworLy8gZGFzIG5vcm1hbGUgY2xvbmVwIGluIGdldF9kaXIgbmljaHQgbWVociBnZWh0LiBIaWVyIGVpbiBlcnNhdHouCitwcml2YXRlIG5vbWFzayBpbnQgbXlfaXNfY2xvbmUoKSB7CisgIHJldHVybiBtZW1iZXIob2JqZWN0X25hbWUodGhpc19vYmplY3QoKSksJzonKT49MDsKK30KKworbm9tYXNrIHZvaWQgY3JlYXRlKCkgeworICBpZiggIWNsb25lcCh0aGlzX29iamVjdCgpKSApIHsKKyAgICBzZXRfbmV4dF9yZXNldCggLTEgKTsgLy8gYmx1ZXByaW50IHNvbGwgbmljaHQgc3RlcmJlbgorICAgIHJldHVybjsKKyAgfQorICAvL2lmKCBzZWN1cmVfaW1wY2FsbCgpICkgOjpjcmVhdGUoKTsKK30KKworbm9tYXNrIGludCBTZXRVc2VyKCBzdHJpbmcgbmFtZSApIHsKKyAgaWYoICFzZWN1cmVfaW1wY2FsbCgpIHx8ICFjbG9uZXAodGhpc19vYmplY3QoKSkgKSByZXR1cm4gLTI7CisgIGlmKCBzdHJpbmdwKHVzZXIpICYmIHVzZXIgIT0gIiIgKSB7CisgICAgLy93cml0ZSggIlVzZXI9Iit1c2VyKyJcbiIgKTsKKyAgICByZXR1cm4gLTE7IC8vIHNjaG9uIGVpbiBuYW1lIGRhIQorICB9CisgIHVzZXIgPSBsb3dlcl9jYXNlKG5hbWUpOworICBzZXRldWlkKCB1c2VyICk7CisgIHNldF9uZXh0X3Jlc2V0KCAxODAwICk7Cit9CisKKy8vIEdpYnQgZWluZW4gbmVnYXRpdmVuIFdlcnQgenVy/GNrLCB3ZW5uIGRpZSBEYXRlaSBuaWNodCBnZWxlc2VuIHdlcmRlbgorLy8ga2FubiBvZGVyIGVpbmVuIHN0cmluZywgZGVyIGRpZSBnZXNhbXRlbiBEYXRlbiBkZXMgVmVyemVpY2huaXNzZXMKKy8vIGVudGjkbHQuCitub21hc2sgbWl4ZWQgR2V0RGlyKHN0cmluZyBkaXIpCit7CisgIG1peGVkIHJldDsgcmV0ID0gIiI7CisgIGlmKCAhc2VjdXJlX2ltcGNhbGwoKSB8fCAhbXlfaXNfY2xvbmUoKSkgcmV0dXJuIC0yOworICBpZiggIXN0cmluZ3AodXNlcikgfHwgdXNlcj09IiIgKSByZXR1cm4gLTE7CisgIF9sc19vdXRwdXQoIGRpciwgJnJldCwgdXNlciwgMHg4MyApOworICBzZXRfbmV4dF9yZXNldCggMTgwMCApOworICByZXR1cm4gcmV0OworfQorCitub21hc2sgdm9pZCByZXNldCgpIHsKKyAgZGVzdHJ1Y3QodGhpc19vYmplY3QoKSk7Cit9CisKK3ZhcmFyZ3MgbWl4ZWQgbW92ZSgpIHsKKyAgcmV0dXJuIC0xOworfQorCisvLyBGdWVyIGRpZSBNZWxkdW5nIGF1ZiBGVFAKK25vbWFzayBzdHJpbmcgbmFtZSgpIHsKKyAgcmV0dXJuIGNhcGl0YWxpemUodXNlcik7Cit9CmRpZmYgLS1naXQgYS9zZWN1cmUvZ2lsZGVubWFzdGVyLmMgYi9zZWN1cmUvZ2lsZGVubWFzdGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZjNWUzZAotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9naWxkZW5tYXN0ZXIuYwpAQCAtMCwwICsxLDE2NSBAQAorI3ByYWdtYSBzdHJpY3RfdHlwZXMKKyNwcmFnbWEgbm9fY2xvbmUKKyNwcmFnbWEgbm9fc2hhZG93CisjcHJhZ21hIG5vX2luaGVyaXQKKyNwcmFnbWEgdmVyYm9zZV9lcnJvcnMKKyNwcmFnbWEgY29tYmluZV9zdHJpbmdzCisvLyNwcmFnbWEgcGVkYW50aWMKKy8vI3ByYWdtYSByYW5nZV9jaGVjaworI3ByYWdtYSB3YXJuX2RlcHJlY2F0ZWQKKworI2RlZmluZSBORUVEX1BST1RPVFlQRVMKKyNpbmNsdWRlIDx0aGluZy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHdpemxldmVscy5oPgorI2luY2x1ZGUgPG5ld19za2lsbHMuaD4KKyNpbmNsdWRlIDxldmVudHMuaD4KKworc3RyaW5nICp2YWxpZF9ndWlsZHMgPSAoe30pOworCit2b2lkIGNyZWF0ZSgpIHsKKyAgc2V0ZXVpZChnZXR1aWQodGhpc19vYmplY3QoKSkpOworICByZXN0b3JlX29iamVjdChHVUlMRF9TQVZFRklMRSk7CisgIGlmICghcG9pbnRlcnAodmFsaWRfZ3VpbGRzKSkgCisgICAgdmFsaWRfZ3VpbGRzPSh7fSk7Cit9CisKKy8vbm9ldGlnLCBkYSBudW4gdmFsaWRfZ3VpbGRzIGVpbmUgVmFyaWFibGUgaXN0CitwdWJsaWMgbWl4ZWQgUXVlcnlQcm9wKCBzdHJpbmcgbmFtZSApCit7CisgIGlmIChuYW1lPT1QX1ZBTElEX0dVSUxEUykgCisgICAgICByZXR1cm4gY29weSh2YWxpZF9ndWlsZHMpOworICByZXR1cm4gMDsKK30KKworbm9tYXNrIGludCBiZWl0cmV0ZW4oKSB7CisgIG9iamVjdCBwbCxnaWxkZTsKKyAgc3RyaW5nIGduYW1lLG9nbmFtZTsKKworICBpZiAoIShwbD10aGlzX3BsYXllcigpKSB8fCAhKGdpbGRlPXByZXZpb3VzX29iamVjdCgpKSkKKyAgICAgIHJldHVybiAwOworICAvLyBHaWxkZW4gc2luZCBCbHVlcHJpbnRzLgorICBnbmFtZT1vYmplY3RfbmFtZShnaWxkZSk7CisKKyAgaWYgKChHVUlMRF9ESVIrb2duYW1lKT09Z25hbWUpIHsKKyAgICB3cml0ZSgiRHUgYmlzdCBzY2hvbiBpbiBkaWVzZXIgR2lsZGUuXG4iKTsKKyAgICByZXR1cm4gLTQ7CisgIH0KKworICBpZiAoKG9nbmFtZT0oc3RyaW5nKXBsLT5RdWVyeVByb3AoUF9HVUlMRCkpICYmIAorICAgICAgKG9nbmFtZSE9KCgoc3RyaW5nKXBsLT5RdWVyeVByb3AoUF9ERUZBVUxUX0dVSUxEKSkgfHwgREVGQVVMVF9HVUlMRCkpKSB7CisgICAgd3JpdGUoIkR1IGJpc3Qgbm9jaCBpbiBlaW5lciBhbmRlcmVuIEdpbGRlLlxuIik7CisgICAgcmV0dXJuIC0xOworICB9CisgIGlmIChnbmFtZVswLi43XSE9R1VJTERfRElSIHx8CisgICAgICAgIG1lbWJlcih2YWxpZF9ndWlsZHMsKGduYW1lPWduYW1lWzguLl0pKTwwKSB7CisgICAgICB3cml0ZSgiRGllc2UgR2lsZGUgaXN0IGxlaWRlciBuaWNodCB6dWdlbGFzc2VuLlxuIisKKyAgICAgICAgICAgICAgIkJpdHRlIHZlcnN0YWVuZGlnZSBlaW5lbiBFcnptYWdpZXIuXG4iKTsKKyAgICAgIHJldHVybiAtMjsKKyAgfQorICBwbC0+U2V0UHJvcChQX0dVSUxELGduYW1lKTsKKyAgLy8gRXZlbnQgR2lsZGVud2VjaHNlbCB0cmlnZ2VybgorICBFVkVOVEQtPlRyaWdnZXJFdmVudChFVlRfR1VJTERfQ0hBTkdFLCAoWworICAgICAgRV9PQkpFQ1Q6IHBsLCBFX1BMTkFNRTogZ2V0dWlkKHBsKSwKKyAgICAgIEVfRU5WSVJPTk1FTlQ6IGVudmlyb25tZW50KHBsKSwKKyAgICAgIEVfR1VJTEROQU1FOiBnbmFtZSwKKyAgICAgIEVfTEFTVF9HVUlMRE5BTUU6IG9nbmFtZSBdKSApOworCisgIHJldHVybiAxOworfQorCitzdGF0aWMgbm9tYXNrIHZvaWQgbG9vc2VfYWJpbGl0eShtaXhlZCBrZXksIG1peGVkIGRhdCwgaW50IGxvc3MpIHsKKyAgbWl4ZWQgdmFsOworCisgIHZhbD1tYXBwaW5ncChkYXQpP2RhdFtTSV9TS0lMTEFCSUxJVFldOmRhdDsKKyAgaWYgKCFpbnRwKHZhbCkgfHwgdmFsPD0wKSByZXR1cm47CisgIHZhbC09KHZhbCpsb3NzKS8xMDA7aWYgKHZhbDw9MCkgdmFsPTE7CisgIGlmIChtYXBwaW5ncChkYXQpKQorICAgICAgZGF0W1NJX1NLSUxMQUJJTElUWV09dmFsOworICBlbHNlCisgICAgICBkYXQ9dmFsOworfQorCit2YXJhcmdzIG5vbWFzayBpbnQgYXVzdHJldGVuKGludCBsb3NzKSB7CisgIG9iamVjdCBwbCxnaWxkZTsKKyAgc3RyaW5nIGduYW1lOworICBtYXBwaW5nIHNraWxsczsKKworICBpZiAoIShwbD10aGlzX3BsYXllcigpKSB8fCAhKGdpbGRlPXByZXZpb3VzX29iamVjdCgpKSkKKyAgICAgIHJldHVybiAwOworICAvLyBHaWxkZW4gbXVlc3NlbiBCbHVlcHJpbnRzIHNlaW4sIHNvLiA7LSkKKyAgZ25hbWU9b2JqZWN0X25hbWUoZ2lsZGUpOworICBpZiAoZ25hbWVbMC4uN10hPUdVSUxEX0RJUiB8fAorICAgICAgKChzdHJpbmcpcGwtPlF1ZXJ5UHJvcChQX0dVSUxEKSkhPWduYW1lWzguLl0pIHsKKyAgICAgIHdyaXRlKCJEdSBrYW5uc3QgaGllciBuaWNodCBhdXMgZWluZXIgYW5kZXJlbiBHaWxkZSBhdXN0cmV0ZW4uXG4iKTsKKyAgICAgIHJldHVybiAtMTsKKyAgfQorICBpZiAoZ25hbWVbOC4uXT09KHBsLT5RdWVyeVByb3AoUF9ERUZBVUxUX0dVSUxEKXx8REVGQVVMVF9HVUlMRCkpCisgIHsKKyAgICAgICAgd3JpdGUoIkF1cyBkaWVzZXIgR2lsZGUga2FubnN0IER1IG5pY2h0IGF1c3RyZXRlbi5cbiIpOworICAgICAgICByZXR1cm4gLTE7CisgIH0KKyAgaWYgKGxvc3M8PTApIGxvc3M9MjA7CisgIHNraWxscz0obWFwcGluZylwbC0+UXVlcnlQcm9wKFBfTkVXU0tJTExTKTsKKyAgd2Fsa19tYXBwaW5nKHNraWxscywibG9vc2VfYWJpbGl0eSIsdGhpc19vYmplY3QoKSxsb3NzKTsKKyAgcGwtPlNldFByb3AoUF9ORVdTS0lMTFMsc2tpbGxzKTsKKyAgcGwtPlNldFByb3AoUF9HVUlMRCwwKTsKKyAgLy8gRXZlbnQgR2lsZGVud2VjaHNlbCB0cmlnZ2VybgorICBFVkVOVEQtPlRyaWdnZXJFdmVudChFVlRfR1VJTERfQ0hBTkdFLCAoWworICAgICAgRV9PQkpFQ1Q6IHBsLCBFX1BMTkFNRTogZ2V0dWlkKHBsKSwKKyAgICAgIEVfRU5WSVJPTk1FTlQ6IGVudmlyb25tZW50KHBsKSwKKyAgICAgIEVfR1VJTEROQU1FOiBwbC0+UXVlcnlQcm9wKFBfR1VJTEQpLAorICAgICAgRV9MQVNUX0dVSUxETkFNRTogZ25hbWUgXSkgKTsKKworICAvLyBEZWZhdWx0Z2lsZGUgZ2dmLiBuZXVlbiBUaXRlbCBzZXR6ZW4gbGFzc2VuLgorICBnbmFtZSA9IChzdHJpbmcpcGwtPlF1ZXJ5UHJvcChQX0dVSUxEKTsKKyAgKEdVSUxEX0RJUisiLyIrZ25hbWUpLT5hZGp1c3RfdGl0bGUocGwpOworCisgIHJldHVybiAxOworfQorCitub21hc2sgc3RhdGljIGludCBzZWN1cml0eV9jaGVjaygpCit7CisgIGlmIChwcmV2aW91c19vYmplY3QoKSAmJiBnZXRldWlkKHByZXZpb3VzX29iamVjdCgpKT09Uk9PVElEKQorICAgIHJldHVybiAxOworICBpZiAoIXByb2Nlc3NfY2FsbCgpICYmIHByZXZpb3VzX29iamVjdCgpICYmIEFSQ0hfU0VDVVJJVFkpCisgICAgcmV0dXJuIDE7CisgIHJldHVybiAwOworfQorCitub21hc2sgaW50IEFkZEd1aWxkKHN0cmluZyBnaWxkb2IpIHsKKyAgb2JqZWN0IHRwOworCisgIGlmICghc3RyaW5ncChnaWxkb2IpIHx8ICFzaXplb2YoZ2lsZG9iKSB8fCAhc2VjdXJpdHlfY2hlY2soKSAKKyAgICAgIHx8IGZpbGVfc2l6ZShHVUlMRF9ESVIrZ2lsZG9iKyIuYyIpPDApCisgICAgICByZXR1cm4gMDsKKyAgaWYgKG1lbWJlcih2YWxpZF9ndWlsZHMsIGdpbGRvYikgIT0gLTEpCisgICAgICByZXR1cm4gMDsKKyAgdmFsaWRfZ3VpbGRzKz0oe2dpbGRvYn0pOworICBzYXZlX29iamVjdChHVUlMRF9TQVZFRklMRSk7CisgIHJldHVybiAxOworfQorCitub21hc2sgaW50IFJlbW92ZUd1aWxkKHN0cmluZyBnaWxkb2IpIHsKKyAgb2JqZWN0IHRwOworCisgIGlmICghc3RyaW5ncChnaWxkb2IpIHx8ICFzaXplb2YoZ2lsZG9iKSAKKyAgICAgIHx8ICFzZWN1cml0eV9jaGVjaygpKQorICAgICAgcmV0dXJuIDA7CisgIGlmIChtZW1iZXIodmFsaWRfZ3VpbGRzLCBnaWxkb2IpID09IC0xKQorICAgICAgcmV0dXJuIDA7CisgIHZhbGlkX2d1aWxkcy09KHtnaWxkb2J9KTsKKyAgCisgIHNhdmVfb2JqZWN0KEdVSUxEX1NBVkVGSUxFKTsKKyAgcmV0dXJuIDE7Cit9CisKK25vbWFzayBpbnQgVmFsaWRHdWlsZChzdHJpbmcgZ2lsZGVub2IpIHsKKyAgaWYgKCFzdHJpbmdwKGdpbGRlbm9iKSkgCisgICAgICByZXR1cm4gMDsKKworICByZXR1cm4gKG1lbWJlcih2YWxpZF9ndWlsZHMsZ2lsZGVub2IpPj0wKTsKK30KKworbm9tYXNrIHN0cmluZyAqX3F1ZXJ5X3ZhbGlkX2d1aWxkcygpIHtyZXR1cm4gY29weSh2YWxpZF9ndWlsZHMpOyB9CisKZGlmZiAtLWdpdCBhL3NlY3VyZS9ndWVzdG1hc3Rlci5jIGIvc2VjdXJlL2d1ZXN0bWFzdGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDMwNGQ4ZAotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9ndWVzdG1hc3Rlci5jCkBAIC0wLDAgKzEsNjAgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBndWVzdG1hc3Rlci5jIC0tIFZlcndhbHRlciB2b24gR2FzdC1Mb2dpbnMKKy8vCisvLyAkSWQ6IGd1ZXN0bWFzdGVyLmMgODkwOSAyMDE0LTA4LTIwIDIxOjMzOjU1WiBaZXNzdHJhICQKKyNwcmFnbWEgbm9fY2xvbmUsbm9faW5oZXJpdCxub19zaGFkb3cKKyNwcmFnbWEgc3RyaWN0X3R5cGVzLHNhdmVfdHlwZXMscnR0X2NoZWNrcworCisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisKK25vc2F2ZSBpbnQgbWF4X2d1ZXN0cyA9IDEwOyAvKiBNYXggbm8uIG9mIGd1ZXN0cy4gLTEgaXMgJ3VubGltaXRlZCcgKi8KK25vc2F2ZSBvYmplY3QgKmd1ZXN0cyA9ICh7fSk7Citub3NhdmUgaW50ICAgICpsdGltZSA9ICh7fSk7CisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZSgpCit7CisgIHNldGV1aWQoZ2V0dWlkKCkpOworfQorCitub21hc2sgaW50IG5ld19ndWVzdCAoKSB7CisgIGludCBpeDsKKworICBpZiAoIW1heF9ndWVzdHMpIHJldHVybiAwOworICBpZiAobG9hZF9uYW1lKHByZXZpb3VzX29iamVjdCgpKSAhPSAiL3NlY3VyZS9sb2dpbiIpCisgICAgcmV0dXJuIDA7CisgCisgIGlmICgoaXggPSBtZW1iZXIoZ3Vlc3RzLDApKSA9PSAtMSkgeworICAgIGl4ID0gc2l6ZW9mKGd1ZXN0cyk7CisgICAgaWYgKG1heF9ndWVzdHMgPCAwIHx8IGl4IDwgbWF4X2d1ZXN0cykgCisgICAgeworICAgICAgZ3Vlc3RzICs9ICh7IDAgfSksIGx0aW1lICs9ICh7IDAgfSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgaW50IG1pbnRpbWUsIG1pbml4OworICAgICAgbWludGltZSA9IHRpbWUoKTsKKyAgICAgIGZvciAoaXggPSAwOyBpeCA8IHNpemVvZihndWVzdHMpOyBpeCsrKSB7CisgICAgICAgIGlmIChndWVzdHNbaXhdICYmIGx0aW1lW2l4XSA8IG1pbnRpbWUpIHsKKyAgICAgICAgICBtaW50aW1lPWx0aW1lW2l4XTsKKyAgICAgICAgICBtaW5peD1peDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaXggPSBtaW5peDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGl4KzE7Cit9CisKK25vbWFzayB2b2lkIHNldF9ndWVzdCAoaW50IGl4LCBvYmplY3QgcGwpIHsKKyAgaWYgKGxvYWRfbmFtZShwcmV2aW91c19vYmplY3QoKSkgIT0gIi9zZWN1cmUvbG9naW4iKSByZXR1cm47CisgIGd1ZXN0c1tpeC0xXSA9IHBsOworICBsdGltZVtpeC0xXSA9IHRpbWUoKTsKK30KKworbm9tYXNrIGludCBxdWVyeV9tYXhfZ3Vlc3RzKCkgeyByZXR1cm4gbWF4X2d1ZXN0czsgfQorbm9tYXNrIGludCBzZXRfbWF4X2d1ZXN0cyhpbnQgdikgeworICBpZiAoIXByb2Nlc3NfY2FsbCgpICYmIExPUkRfU0VDVVJJVFkpCisgICAgbWF4X2d1ZXN0cyA9IHY7CisgIHJldHVybiBtYXhfZ3Vlc3RzOworfQorCmRpZmYgLS1naXQgYS9zZWN1cmUvaW1wZmV0Y2guYyBiL3NlY3VyZS9pbXBmZXRjaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3NTU2YmYKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvaW1wZmV0Y2guYwpAQCAtMCwwICsxLDI0IEBACisvLyBJbXAgRmV0Y2hlcgorCisjZGVmaW5lIEZUUEQgInNlY3VyZS9mdHBkIgorI2RlZmluZSBGVFBJTVAgInN0ZC9zaGVsbHMvZmlsZXN5cy9mdHBpbXAiCisKKyNkZWZpbmUgRChtc2cpIGlmKGZpbmRfcGxheWVyKCJydW1hdGEiKSl0ZWxsX29iamVjdChmaW5kX3BsYXllcigicnVtYXRhIiksbXNnKQorCit2b2lkIGNyZWF0ZSgpIHt9CisKK25vbWFzayBtaXhlZCBpbXBGb3IoIHN0cmluZyBuYW1lICkgeworICAgIG9iamVjdCBpbXA7CisgICAgc3RyaW5nIGZuYW1lOworCisgICAgZm5hbWUgPSAiL2Z0cGltcDoiICsgbmFtZTsKKyAgICBpbXAgPSBmaW5kX29iamVjdCggZm5hbWUgKTsKKyAgICBpZiggIW9iamVjdHAoaW1wKSApIHsKKwlzZXRldWlkKCBuYW1lICk7CisJaW1wID0gY2xvbmVfb2JqZWN0KCBGVFBJTVAgKTsKKwlpbXAtPlNldFVzZXIoIG5hbWUgKTsKKwlyZW5hbWVfb2JqZWN0KCBpbXAsIGZuYW1lICk7CisgICAgICAgIGRlc3RydWN0KCB0aGlzX29iamVjdCgpICk7IC8vIG5leHQgaW1wIG11c3QgaGF2ZSByb290aWQgYWdhaW4KKyAgICB9CisgICAgcmV0dXJuIGltcDsKK30KZGlmZiAtLWdpdCBhL3NlY3VyZS9pbmV0ZC5jIGIvc2VjdXJlL2luZXRkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNiOTE0NQotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9pbmV0ZC5jCkBAIC0wLDAgKzEsODA4IEBACisvKgorICogVURQIHBvcnQgaGFuZGxpbmcgY29kZS4gVmVyc2lvbiAwLjdhCisgKiBXcml0dGVuIGJ5IE5vc3RyYWRhbXVzIGZvciBaZWJlZGVlLgorICogRGV2ZWxvcGVkIGZyb20gYW4gb3JpZ2luYWwgY29uY2VwdCBieSBBbHZpbkBTdXNoaS4KKyAqLworCisjcHJhZ21hIHN0cmljdF90eXBlcworI3ByYWdtYSBub19jbG9uZQorI3ByYWdtYSBub19zaGFkb3cKKyNwcmFnbWEgbm9faW5oZXJpdAorI3ByYWdtYSB2ZXJib3NlX2Vycm9ycworLy8jcHJhZ21hIHBlZGFudGljCisjcHJhZ21hIG5vX3JhbmdlX2NoZWNrCisjcHJhZ21hIG5vX3dhcm5fZGVwcmVjYXRlZAorCisKKyNpbmNsdWRlIDxsaXZpbmcvY29tbS5oPgorI2RlZmluZSBaREVCVUcoeCkgICAgICAgIGlmIChmaW5kX3BsYXllcigiemVzc3RyYSIpKVwKKyAgICAgICAgICAgIGZpbmRfcGxheWVyKCJ6ZXNzdHJhIiktPlJlY2VpdmVNc2coeCwgXAorICAgICAgICAgICAgICAgIE1UX0RFQlVHfE1TR19ET05UX1NUT1JFLDAsIklNOiAiLHRoaXNfb2JqZWN0KCkpCisKKy8vI2RlZmluZSBaREVCVUcoeCkKKworI2luY2x1ZGUgPHVkcC5oPgorCisvKiAtLS0gQ29uZmlndXJhYmxlIGRlZmluaXRpb25zLiAtLS0gKi8KKworLyogQ0QgbXVkcyB3aWxsIHByb2JhYmx5IG5lZWQgdGhlc2UgaW5jbHVkZSBmaWxlLiAqLworLyogI2luY2x1ZGUgPHN0ZC5oPiAqLworLyogI2luY2x1ZGUgIi9jb25maWcvc3lzL2xvY2FsLmgiICovCisKKy8qIFB1YmxpYyBjb21tYW5kcyB3aGljaCB3aWxsIGJlIGFjY2Vzc2libGUgdG8gYW55IHVubGlzdGVkIG11ZHMuCisgKiBQSU5HLCBRVUVSWSBhbmQgUkVQTFkgYXJlIGluY2x1ZGVkIGJ5IGRlZmF1bHQuICovCisjZGVmaW5lIENPTU1BTkRTIFwKKyh7ICJjaGFubmVsIiwgImZpbmdlciIsICJ0ZWxsIiwgIndobyIsICJtYWlsIiwgInd3dyIsICJodG1sd2hvIiwgImxvY2F0ZSIgfSkKKworLy8oeyAiY2hhbm5lbCIsICJmaW5nZXIiLCAiZnRwIiwgImxvY2F0ZSIsICJtYW4iLCAidGVsbCIsICJ3aG8iIH0pCisKKy8qIERlZmluZSB0aGlzIHRvIHRoZSBvYmplY3QgdGhhdCByZWNlaXZlcyBpbmNvbWluZyBwYWNrZXRzIGFuZCBwYXNzZXMKKyAqIHRoZW0gdG8gdGhlIGluZXRkLiBVbmRlZmluZSBmb3Igbm8gX3JlY2VpdmVfdWRwKCkgc2VjdXJpdHkuCisgKiBOT1RFOiBUaGUgc3RyaW5nIG11c3QgYmUgb2YgdGhlIGZvcm1hdCB0aGF0IG9iamVjdF9uYW1lKCkgcmV0dXJucy4gKi8KKyNkZWZpbmUgVURQX01BU1RFUiAgICAgICAgICAgICAgICBfX01BU1RFUl9PQkpFQ1RfXworCisvKiBIb3cgdG8gc2V0IHRoZSBldWlkIGZvciB0aGlzIG9iamVjdCBpZiB1c2luZyBuYXRpdmUgbW9kZS4KKyAqIEVuc3VyZSB0aGF0IGl0IGNhbiByZWFkIHRoZSBJTkVURF9IT1NUUyBmaWxlLiAqLworI2RlZmluZSBTRVRfRVVJRCAgICAgICAgICAgICAgICBzZXRldWlkKGdldHVpZCgpKQorCisvKiBEZWZpbmUgdGhpcyBpZiB5b3UgYXJlIHJ1bm5pbmcgYW5vdGhlciBpbnRlcm11ZCBwYWNrYWdlIGNvbmN1cnJlbnRseS4gKi8KKy8qICNkZWZpbmUgUkVDRUlWRV9VRFBfQ09NUEFUKHNlbmRlciwgcGFja2V0KSBcCisgICAgICAgICAgICAgICAgVURQX01BTkFHRVItPmluY29taW5nX3VkcChzZW5kZXIsIHBhY2tldCkgICAgICAgIC8vIENEICovCisKKy8qIERlZmluZSB0aGlzIGlmIHlvdSBhcmUgcnVubmluZyBhbm90aGVyIGludGVybXVkIHBhY2thZ2UgY29uY3VycmVudGx5IGFuZAorICogaGF2ZSBhIGNvbXBhdGFiaWxpdHkgbW9kdWxlIGZvciBpdC4gKi8KKy8qICNkZWZpbmUgU0VORF9VRFBfQ09NUEFUKG11ZG5hbWUsIGRhdGEsIGV4cGVjdF9yZXBseSkgXAorICAgICAgICAgICAgICAgICIvc2VjdXJlL3VkcF9jb21wYXQiLT5fc2VuZF91ZHAobXVkbmFtZSwgZGF0YSwgZXhwZWN0X3JlcGx5KSAqLworCisvKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyB3ZSBjYW4gc2VuZCBpbiBvbmUgcGFja2V0LgorICogWW91IG1heSBuZWVkIHRvIHJlZHVjZSB0aGlzLCBidXQgNTEyIHNob3VsZCBiZSBzYWZlLiAqLworI2RlZmluZSBNQVhfUEFDS0VUX0xFTiAgICAgICAgMTAyNAorCisvKiBZb3Ugc2hvdWxkbid0IG5lZWQgdG8gY2hhbmdlIGFueXRoaW5nIGJlbG93LiAqLworCisjZGVmaW5lIFVTRV9PTERfREVMSU1JVEVSCisvLyNkZWZpbmUgREVMSU1JVEVSX0NPTVBBVAorI2RlZmluZSBVU0VfT0xEX0RBVEFfRk9STUFUCisKKyNpZmRlZiBaRUJFREVFCisjaW5jbHVkZSA8ZGVmcy5oPgorI2VuZGlmCisKKyNpZm5kZWYgREFURQorI2RlZmluZSBEQVRFICAgICAgICAgICAgICAgIGN0aW1lKHRpbWUoKSlbNC4uMTVdCisjZW5kaWYKKworLyogLS0tIEVuZCBvZiBDb25maWcuIERvIG5vdCBhbHRlciBhbnl0aGluZyBiZWxvdy4gLS0tICovCisKKyNkZWZpbmUgVU5LTk9XTiAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFVQICAgICAgICAgICAgICAgIHRpbWUoKQorI2RlZmluZSBET1dOICAgICAgICAgICAgICAgICgtdGltZSgpKQorCisjZGVmaW5lIE5FV19ERUxJTUlURVIgICAgICAgICJcbiIKKyNpZmRlZiBVU0VfT0xEX0RFTElNSVRFUgorI2RlZmluZSBERUxJTUlURVIgICAgICAgICJ8IgorI2Vsc2UKKyNkZWZpbmUgREVMSU1JVEVSICAgICAgICAiXG4iCisjZW5kaWYKKyNkZWZpbmUgT0xEX0RFTElNSVRFUiAgICAgICAgInwiCisjZGVmaW5lIEhPU1RGSUxFX0RFTCAgICAgICAgIjoiCisjZGVmaW5lIEhPU1RGSUxFX0RFTDIgICAgICAgICIsIgorI2RlZmluZSBSRVRSWSAgICAgICAgICAgICAgICAiX1JFVFJZIgorCitwcml2YXRlIG5vc2F2ZSBtYXBwaW5nIGhvc3RzLCBwZW5kaW5nX2RhdGEsIGluY29taW5nX3BhY2tldHM7Citwcml2YXRlIG5vc2F2ZSBtYXBwaW5nIHN0YXRpY19ob3N0X2xpc3Q7Citwcml2YXRlIG5vc2F2ZSBzdHJpbmcgKnJlY2VpdmVkX2lkczsKK3ByaXZhdGUgbm9zYXZlIGludCBwYWNrZXRfaWQ7CisKK3ZvaWQgc2V0X2hvc3RfbGlzdCgpOwordmFyYXJncyBzdHJpbmcgX3NlbmRfdWRwKHN0cmluZyBtdWRuYW1lLCBtYXBwaW5nIGRhdGEsIGludCBleHBlY3RfcmVwbHkpOworCisjZGVmaW5lIERFQlVHKG1zZykKKwordm9pZCBteV9jcmVhdGUoKSB7CisjaWZuZGVmIENPTVBBVF9GTEFHCisgICAgU0VUX0VVSUQ7CisjZW5kaWYKKyAgICBwYWNrZXRfaWQgPSAwOworICAgIHBlbmRpbmdfZGF0YSA9IChbIF0pOworICAgIGluY29taW5nX3BhY2tldHMgPSAoWyBdKTsKKyAgICBob3N0cyA9IChbIF0pOworICAgIHJlY2VpdmVkX2lkcyA9ICh7IH0pOworICAgIHNldF9ob3N0X2xpc3QoKTsKKyAgICBpZiAoIXRoaXNfcGxheWVyKCkpCisgICAgICAgIGNhbGxfb3V0KCJzdGFydHVwIiwgMSwgMCk7Cit9CisKKyNpZmRlZiBDUkVBVEVfRlVOCitDUkVBVEVfRlVOKCkgeworI2VsaWYgIWRlZmluZWQoQ09NUEFUX0ZMQUcpIHx8IGRlZmluZWQoWkVCRURFRSkKK3ZvaWQgY3JlYXRlKCkgeworI2Vsc2UKK3ZvaWQgcmVzZXQoYXJnKSB7CisgICAgaWYgKGFyZykKKyAgICAgICAgcmV0dXJuOworI2VuZGlmCisgICAgbXlfY3JlYXRlKCk7Cit9CisKK3N0YXR1cyBjaGVja19zeXN0ZW1fZmllbGQobWFwcGluZyBkYXRhLCBzdHJpbmcgZmllbGQpIHsKKyAgICByZXR1cm4gZGF0YVtTWVNURU1dICYmIG1lbWJlcihkYXRhW1NZU1RFTV0sIGZpZWxkKSAhPSAtMTsKK30KKworbWFwcGluZyBhZGRfc3lzdGVtX2ZpZWxkKG1hcHBpbmcgZGF0YSwgc3RyaW5nIGZpZWxkKSB7CisgICAgaWYgKGRhdGFbU1lTVEVNXSkgeworICAgICAgICBpZiAoIWNoZWNrX3N5c3RlbV9maWVsZChkYXRhLCBmaWVsZCkpCisgICAgICAgICAgICBkYXRhW1NZU1RFTV0gKz0gKHsgZmllbGQgfSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgZGF0YVtTWVNURU1dID0gKHsgZmllbGQgfSk7CisgICAgcmV0dXJuIGRhdGE7Cit9CisKK3ByaXZhdGUgbWFwcGluZyByZWFkX2hvc3RfbGlzdChzdHJpbmcgZmlsZSkgeworCisgIG1peGVkIGRhdGEgPSAocmVhZF9maWxlKGZpbGUpKTsKKyAgaWYgKCFkYXRhKSB7CisgICAgbG9nX2ZpbGUoSU5FVERfTE9HX0ZJTEUsICIqRXJyb3IgaW4gcmVhZGluZyBob3N0IGZpbGU6ICIKKyAgICAgICAgKyBmaWxlICsiXG5cbiIpOworICAgIHJldHVybiAwOworICB9CisKKyAgZGF0YSA9IG9sZF9leHBsb2RlKGRhdGEsICJcbiIpOworICBtYXBwaW5nIG5ld19ob3N0cyA9IG1fYWxsb2NhdGUoc2l6ZW9mKGRhdGEpLDEpOworCisgIGZvcmVhY2goc3RyaW5nIGxpbmU6IGRhdGEpIHsKKyAgICBpZiAobGluZSA9PSAiIiB8fCBsaW5lWzBdID09ICcjJykKKyAgICAgIGNvbnRpbnVlOworICAgIG1peGVkIGZpZWxkcyA9IG9sZF9leHBsb2RlKGxpbmUsIEhPU1RGSUxFX0RFTCk7CisgICAgaWYgKHNpemVvZihmaWVsZHMpIDwgNSkgeworICAgICAgbG9nX2ZpbGUoSU5FVERfTE9HX0ZJTEUsIHNwcmludGYoCisgICAgICAgICAgICAiKlBhcnNlIGVycm9yIGluIGhvc3RzIGZpbGU6ICVzLCBMaW5lOiAlc1xuIiwgZmlsZSwgbGluZSkpOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgc3RyaW5nIG5hbWUgPSBsb3dlcl9jYXNlKGZpZWxkc1tIT1NUX05BTUVdKTsKKyAgICBpZiAobWVtYmVyKG5ld19ob3N0cywgbmFtZSkpCisgICAgICBjb250aW51ZTsgLy8gbXVkIGFscmVhZHkgaW4gbGlzdAorCisgICAgc3RyaW5nICpsb2NhbF9jbWRzID0gb2xkX2V4cGxvZGUoZmllbGRzW0xPQ0FMX0NPTU1BTkRTXSxIT1NURklMRV9ERUwyKTsKKyAgICBpZiAobWVtYmVyKGxvY2FsX2NtZHMsIioiKSAhPSAtMSkKKyAgICAgICAgbG9jYWxfY21kcyA9IGxvY2FsX2NtZHMgLSAoeyAiKiIgfSkgKyBDT01NQU5EUzsKKyAgICAKKyAgICBuZXdfaG9zdHNbbmFtZV0gPSAoeyBjYXBpdGFsaXplKGZpZWxkc1tIT1NUX05BTUVdKSwKKyAgICAgICAgICAgICAgICAgICAgIGZpZWxkc1tIT1NUX0lQXSwKKyAgICAgICAgICAgICAgICAgICAgIHRvX2ludChmaWVsZHNbSE9TVF9VRFBfUE9SVF0pLAorICAgICAgICAgICAgICAgICAgICAgbG9jYWxfY21kcywKKyAgICAgICAgICAgICAgICAgICAgIG9sZF9leHBsb2RlKGZpZWxkc1tIT1NUX0NPTU1BTkRTXSwgSE9TVEZJTEVfREVMMiksCisgICAgICAgICAgICAgICAgICAgICBVTktOT1dOCisgICAgICAgICAgICAgICAgICAgfSk7CisgICAgLyoKKyAgICAgKiBHZXQgZXhpc3RpbmcgaG9zdCBzdGF0dXMgZnJvbSBjdXJyZW50IGFjdGl2ZSBob3N0IGxvc3QgYXMgbG9uZyBhcyB0aGUKKyAgICAgKiBJUCBhbmQgVURQIHBvcnRzIGFyZSB0aGUgc2FtZS4KKyAgICAgKi8KKyAgICBpZiAoaG9zdHNbbmFtZV0gJiYKKyAgICAgICAgaG9zdHNbbmFtZV1bSE9TVF9JUF0gPT0gbmV3X2hvc3RzW25hbWVdW0hPU1RfSVBdICYmCisgICAgICAgIGhvc3RzW25hbWVdW0hPU1RfVURQX1BPUlRdID09IG5ld19ob3N0c1tuYW1lXVtIT1NUX1VEUF9QT1JUXSkKKyAgICAgICAgbmV3X2hvc3RzW25hbWVdW0hPU1RfU1RBVFVTXSA9IGhvc3RzW25hbWVdW0hPU1RfU1RBVFVTXTsKKyAgfQorICByZXR1cm4gbmV3X2hvc3RzOworfQorCisvKgorICogUmVhZCB0aGUgSU5FVERfSE9TVFMgZmlsZSBhbmQgc2V0IHRoZSAiaG9zdHMiIG1hcHBpbmcgZnJvbSBpdC4KKyAqIFJldGFpbiBleGlzdGluZyBIT1NUX1NUQVRVUyBmaWVsZHMuCisgKiBSZWFkcyBJTkVURF9IT1NUU1MgYW5kIElORVREX0hPU1RTLmR1bXAKKyAqIEhvc3RzIGZyb20gSU5FVERfSE9TVFMgYXJlIGluY2x1ZGVkIGluIHRoZSBzdGF0aWMgaG9zdCBsaXN0LgorICovCit2b2lkIHNldF9ob3N0X2xpc3QoKSB7CisKKyAgLy8gcmVhZCB0aGUgc3RhdGljIGhvc3QgZmlsZSBhbmQgdGhlIGxhc3QgaG9zdCBmaWxlIGR1bXAuCisgIG1hcHBpbmcgc3RhdGljX2hvc3RzID0gcmVhZF9ob3N0X2xpc3QoSE9TVF9GSUxFKTsKKyAgaWYgKCFzdGF0aWNfaG9zdHMpCisgICAgICByZXR1cm47IC8vIHJldGFpbiB0aGUgb2xkIGxpc3QocykKKworICAvLyByZW1lbWJlciB0aGUgc3RhdGljIGhvc3RzCisgIHN0YXRpY19ob3N0X2xpc3QgPSBtX3JlYWxsb2NhdGUoc3RhdGljX2hvc3RzLDApOworICAKKyAgLy8gcmVhZCB0aGUgbGFzdCBob3N0IGZpbGUgZHVtcCBhbmQgYWRkIHRoZSBzdGF0aWMgaG9zdHMuIFRoZW4gdGhlIHN0YXRpYworICAvLyBob3N0cyBoYXZlIHByZWNlZGVuY2Ugb3ZlciB0aGUgb25lcyBmcm9tIHRoZSBkdW1wLgorICBob3N0cyA9IChyZWFkX2hvc3RfbGlzdChIT1NUX0ZJTEUiLmR1bXAiKSB8fCAoW10pKSArIHN0YXRpY19ob3N0czsKKworfQorCittaXhlZCBnZXRfaG9zdHMoKSB7cmV0dXJuIGNvcHkoaG9zdHMpO30KKworaW50ICBkdW1wX2hvc3RzX2xpc3QoKSB7CisgIAorICB3cml0ZV9maWxlKEhPU1RfRklMRSsiLmR1bXAiLCBzcHJpbnRmKAorICAgICIjSG9zdGxpc3QgZHVtcCBmcm9tICJNVUROQU1FIiwgY3JlYXRlZCAlc1xuIiwgc3RyZnRpbWUoKSksIDEpOworCisgIGZvcmVhY2goc3RyaW5nIG11ZG5hbWUsIG1peGVkIHRtcCA6IGhvc3RzKSB7CisgICAgLy8gc2tpcCBtdWRzIHdlIGRpZCBub3QgaGVhciBmcm9tIGZvciAyIGRheXMuCisvLyAgICBpZiAodG1wW0hPU1RfU1RBVFVTXSArIDE3MjgwMCA8IHRpbWUoKSkKKy8vICAgICAgY29udGludWU7CisgICAgd3JpdGVfZmlsZShIT1NUX0ZJTEUrIi5kdW1wIiwKKyAgICAgICAgc3ByaW50ZigiJXM6JXM6JWQ6JXM6JXNcbiIsdG1wWzBdLHRtcFsxXSx0bXBbMl0saW1wbG9kZSh0bXBbM10sIiwiKSwKKyAgICAgICAgICBpbXBsb2RlKHRtcFs0XSwiLCIpKSk7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKKy8qCisgKiBNYWtlIGEgUElORyByZXF1ZXN0IHRvIGFsbCBtdWRzIGluIHRoZSAiaG9zdHMiIG1hcHBpbmcgdG8gc2V0CisgKiBIT1NUX1NUQVRVUyBpbmZvcm1hdGlvbi4KKyAqIEJ1dCBkb24ndCBwaW5nIGFsbCBtdWRzIGF0IG9uY2UsIGJlY2F1c2UgdGhhdCBtYXkgb3ZlcmZsb3cgdGhlIGNhbGxvdXQKKyAqIHRhYmxlIGR1cmluZyBtdWQgc3RhcnR1cCwgd2hlbiBodW5kcmVkcyBvZiBvYmplY3RzIG1ha2UgY2FsbG91dHMuCisgKi8KK3ZvaWQgc3RhcnR1cChzdHJpbmcgKm11ZHMpIHsKKworICAgIGlmICghcG9pbnRlcnAobXVkcykpCisgICAgICBtdWRzPW1faW5kaWNlcyhob3N0cyk7CisgICAgaWYgKCFzaXplb2YobXVkcykpCisgICAgICByZXR1cm47CisgICAgc3RyaW5nICpwYXJ0OworICAgIGlmIChzaXplb2YobXVkcykgPiA5KQorICAgICAgcGFydD1tdWRzWzAuLjldOworICAgIGVsc2UKKyAgICAgIHBhcnQ9bXVkczsKKyAgICBmb3JlYWNoKHN0cmluZyBtdWQ6IHBhcnQpIAorICAgICAgX3NlbmRfdWRwKG11ZCwgKFsgUkVRVUVTVDogUElORyBdKSwgMSk7CisgICAgbXVkcyAtPSBwYXJ0OworICAgIGlmIChzaXplb2YobXVkcykpCisgICAgICBjYWxsX291dCgjJ3N0YXJ0dXAsIDQsIG11ZHMpOworfQorCisvKgorICogUmVtb3ZlIGEgYnVmZmVyZWQgcGFja2V0IGZyb20gdGhlICJpbmNvbWluZ19wYWNrZXRzIiBtYXBwaW5nLgorICovCit2b2lkIHJlbW92ZV9pbmNvbWluZyhzdHJpbmcgaWQpIHsKKyAgICBtX2RlbGV0ZShpbmNvbWluZ19wYWNrZXRzLCBpZCk7Cit9CisKKy8qCisgKiBEZWNvZGUgYSBzdHJpbmcgZnJvbSBhIFVEUCBwYWNrZXQuCisgKiBSZXR1cm5zOiAgIFRoZSBhY3R1YWwgdmFsdWUgb2YgdGhlIGFyZ3VtZW50IChlaXRoZXIgaW50IG9yIHN0cmluZykKKyAqLworbWl4ZWQgZGVjb2RlKHN0cmluZyBhcmcpIHsKKworICAgIGlmIChzaXplb2YoYXJnKSAmJiBhcmdbMF0gPT0gJyQnKQorICAgICAgICByZXR1cm4gYXJnWzEuLl07CisjaWZkZWYgUkVTVFJJQ1RFRF9DQVNUUworICAgIGlmICh0b19zdHJpbmcodG9faW50KGFyZykpID09IGFyZykKKyAgICAgICAgcmV0dXJuIHRvX2ludChhcmcpOworI2Vsc2UKKyAgICBpZiAoKHN0cmluZykoKGludClhcmcpID09IGFyZykKKyAgICAgICAgcmV0dXJuIChpbnQpYXJnOworI2VuZGlmCisgICAgcmV0dXJuIGFyZzsKK30KKworLyoKKyAqIERlY29kZSBhIFVEUCBwYWNrZXQuCisgKiBBcmd1bWVudHM6IFVEUCBwYWNrZXQgYXMgYSBzdHJpbmcuCisgKiBSZXR1cm5zOiAgIFRoZSBkZWNvZGVkIGluZm9ybWF0aW9uIGFzIGEgbWFwcGluZywgMSBmb3Igc3VjY2VzIGJ1dCBubworICogICAgICAgICAgICBvdXRwdXQgKGJ1ZmZlcmVkIHBhY2tldCksIG9yIDAgb24gZXJyb3IuCisgKi8KK21peGVkIGRlY29kZV9wYWNrZXQoc3RyaW5nIHBhY2tldCwgc3RyaW5nIGRlbGltaXRlcikgeworICAgIHN0cmluZyAqZGF0YTsKKyAgICBtYXBwaW5nIHJldDsKKyAgICBzdHJpbmcgaW5mbywgdG1wOworICAgIG1peGVkIGNsYXNzOworICAgIGludCBpLCBpZCwgbjsKKworICAgIC8qIElmIHRoaXMgcGFja2V0IGhhcyBiZWVuIHNwbGl0LCBoYW5kbGUgYnVmZmVyaW5nLiAqLworICAgIGlmIChwYWNrZXRbMC4uc2l6ZW9mKFBBQ0tFVCldID09IFBBQ0tFVCArICI6IikgeworICAgICAgICBpZiAoc3NjYW5mKHBhY2tldCwgUEFDS0VUICsgIjolczolZDolZC8lZCIgKyBkZWxpbWl0ZXIgKyAiJXMiLAorICAgICAgICBjbGFzcywgaWQsIGksIG4sIHRtcCkgIT0gNSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBjbGFzcyA9IGxvd2VyX2Nhc2UoY2xhc3MpICsgIjoiICsgaWQ7CisgICAgICAgIGlmIChwb2ludGVycChpbmNvbWluZ19wYWNrZXRzW2NsYXNzXSkpIHsKKyAgICAgICAgICAgIGluY29taW5nX3BhY2tldHNbY2xhc3NdW2ktMV0gPSB0bXA7CisgICAgICAgICAgICBpZiAobWVtYmVyKGluY29taW5nX3BhY2tldHNbY2xhc3NdLCAwKSA9PSAtMSkgeworICAgICAgICAgICAgICAgIHJldCA9CisgICAgICAgICAgICAgICAgZGVjb2RlX3BhY2tldChpbXBsb2RlKGluY29taW5nX3BhY2tldHNbY2xhc3NdLCAiIiksIGRlbGltaXRlcik7CisgICAgICAgICAgICAgICAgcmVtb3ZlX2luY29taW5nKGNsYXNzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW5jb21pbmdfcGFja2V0c1tjbGFzc10gPSBhbGxvY2F0ZShuKTsKKyAgICAgICAgICAgIGluY29taW5nX3BhY2tldHNbY2xhc3NdW2ktMV0gPSB0bXA7CisvKiBJcyBpdCBwb3NzaWJsZSB0byBhbHJlYWR5IGhhdmUgYSB0aW1lb3V0IHJ1bm5pbmcgaGVyZSA/IT8gKi8KKyAgICAgICAgICAgIC8qIElmIG5vIHRpbWVvdXQgaXMgcnVubmluZyB0aGVuIHN0YXJ0IG9uZS4gKi8KKyAgICAgICAgICAgIGlmICghcGVuZGluZ19kYXRhW2NsYXNzXSkgeworICAgICAgICAgICAgICAgIGNhbGxfb3V0KCJyZW1vdmVfaW5jb21pbmciLAorICAgICAgICAgICAgICAgIFJFUExZX1RJTUVfT1VUICsgUkVQTFlfVElNRV9PVVQgKiBSRVRSSUVTLCBjbGFzcyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIERFQlVHKCJcbklORVREOiAqKiogQnVmZmVyZWQgcGFja2V0IFRpbWVvdXQgYWxyZWFkeSBydW5uaW5nISAqKipcbiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICByZXQgPSAoWyBdKTsKKyAgICBmb3IoaSA9IDAsIG4gPSBzaXplb2YoZGF0YSA9IG9sZF9leHBsb2RlKHBhY2tldCwgZGVsaW1pdGVyKSk7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgLyogREFUQSBmaWVsZHMgY2FuIGJlIGRlbm90ZWQgYnkgYSBwcmVjZWVkaW5nIGJsYW5rIGZpZWxkLiAqLworICAgICAgICBpZiAoZGF0YVtpXSA9PSAiIikgeworICAgICAgICAgICAgdG1wID0gREFUQTsKKyAgICAgICAgICAgIC8qIFRlc3QgZm9yIGlsbGVnYWwgcGFja2V0IGxlbmd0aCAobm8gREFUQSkgKi8KKyAgICAgICAgICAgIGlmICgrK2kgPj0gbikKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIGluZm8gPSBkYXRhW2ldOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHNzY2FuZihkYXRhW2ldLCAiJXM6JXMiLCB0bXAsIGluZm8pICE9IDIpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgc3dpdGNoKChzdHJpbmcpKGNsYXNzID0gZGVjb2RlKHRtcCkpKSB7CisgICAgICAgICAgICBjYXNlIERBVEE6CisjaWZkZWYgVVNFX0VYVFJBQ1QKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0ICsgKFsgREFUQTogZGVjb2RlKGltcGxvZGUoCisgICAgICAgICAgICAgICAgICAgICh7IGluZm8gfSkgKyBleHRyYWN0KGRhdGEsIGkrMSksIGRlbGltaXRlcikpIF0pOworI2Vsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0ICsgKFsgREFUQTogZGVjb2RlKGltcGxvZGUoCisgICAgICAgICAgICAgICAgICAgICh7IGluZm8gfSkgKyBkYXRhW2krMS4uXSwgZGVsaW1pdGVyKSkgXSk7CisjZW5kaWYKKyAgICAgICAgICAgIGNhc2UgU1lTVEVNOgorICAgICAgICAgICAgICAgIHJldFtjbGFzc10gPSBvbGRfZXhwbG9kZShpbmZvLCAiOiIpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXRbY2xhc3NdID0gZGVjb2RlKGluZm8pOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKKy8qIENoZWNrIHdldGhlciBhIFVEUCBwYWNrZXQgd2FzIHZhbGlkLgorICogTG9ncyBhcmUgbWFkZSBhbmQgImhvc3QiIGluZm9ybWF0aW9uIGlzIHVwZGF0ZWQgYXMgYXBwcm9wcmlhdGUuCisgKiBBcmd1bWVudHM6IERlY29kZWQgVURQIHBhY2tldCAobWFwcGluZykKKyAqIFJldHVybnM6ICAgMCBmb3IgdmFsaWQgcGFja2V0cywgYW4gZXJyb3Igc3RyaW5nIG90aGVyd2lzZS4KKyAqLworc3RyaW5nIHZhbGlkX3JlcXVlc3QobWFwcGluZyBkYXRhKSB7CisgICAgbWl4ZWQgaG9zdF9kYXRhOworICAgIHN0cmluZyAqbXVkczsKKyAgICBzdHJpbmcgcmVxOworICAgIGludCBpOworICAgIAorICAgIGlmICghZGF0YVtOQU1FXSB8fCAhZGF0YVtVRFBfUE9SVF0pCisgICAgICAgIHJldHVybiBEQVRFICsgIjogSWxsZWdhbCBwYWNrZXQuXG4iOworICAgIGlmIChob3N0X2RhdGEgPSBob3N0c1tsb3dlcl9jYXNlKGRhdGFbTkFNRV0pXSkgeworICAgICAgICBpZiAoZGF0YVtIT1NUXSAhPSBob3N0X2RhdGFbSE9TVF9JUF0pIHsKKyAgICAgICAgICAgIGlmIChkYXRhW05BTUVdID09IExPQ0FMX05BTUUpCisgICAgICAgICAgICAgICAgcmV0dXJuIERBVEUgKyAiOiAqKiogRkFLRSBNVUQgKioqXG4iOworICAgICAgICAgICAgbG9nX2ZpbGUoSU5FVERfTE9HX0ZJTEUsIERBVEUgKyAiOiBIb3N0IGNoYW5nZTpcbiIgKworICAgICAgICAgICAgaG9zdF9kYXRhW0hPU1RfTkFNRV0gKyAiOiAiICsgaG9zdF9kYXRhW0hPU1RfSVBdICsgIiAtPiAiICsKKyAgICAgICAgICAgIGRhdGFbSE9TVF0gKyAiXG5cbiIpOworICAgICAgICAgICAgaG9zdF9kYXRhW0hPU1RfSVBdID0gZGF0YVtIT1NUXTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGF0YVtVRFBfUE9SVF0gIT0gaG9zdF9kYXRhW0hPU1RfVURQX1BPUlRdKSB7CisgICAgICAgICAgICBpZiAoZGF0YVtOQU1FXSA9PSBMT0NBTF9OQU1FKQorICAgICAgICAgICAgICAgIHJldHVybiBEQVRFICsgIjogKioqIEZBS0UgTVVEICoqKlxuIjsKKyAgICAgICAgICAgIGxvZ19maWxlKElORVREX0xPR19GSUxFLCBEQVRFICsgIjogUG9ydCBjaGFuZ2U6XG4iICsKKyAgICAgICAgICAgICAgICBob3N0X2RhdGFbSE9TVF9OQU1FXSArICIgKCIgKyBob3N0X2RhdGFbSE9TVF9JUF0gKyAiKTogIiArCisgICAgICAgICAgICAgICAgaG9zdF9kYXRhW0hPU1RfVURQX1BPUlRdICsgIiAtPiAiICsgZGF0YVtVRFBfUE9SVF0gKyAiXG5cbiIpOworICAgICAgICAgICAgaG9zdF9kYXRhW0hPU1RfVURQX1BPUlRdID0gZGF0YVtVRFBfUE9SVF07CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAobG93ZXJfY2FzZShkYXRhW05BTUVdKSA9PSBsb3dlcl9jYXNlKExPQ0FMX05BTUUpKQorICAgICAgICAgICAgcmV0dXJuIERBVEUgKyAiOiAqKiogRkFLRSBNVUQgKioqXG4iOworICAgICAgICBmb3IoaSA9IHNpemVvZihtdWRzID0gbV9pbmRpY2VzKGhvc3RzKSk7IGktLTsgKSB7CisgICAgICAgICAgICBob3N0X2RhdGEgPSBob3N0c1ttdWRzW2ldXTsKKyAgICAgICAgICAgIGlmIChkYXRhW0hPU1RdID09IGhvc3RfZGF0YVtIT1NUX0lQXSAmJgorICAgICAgICAgICAgZGF0YVtVRFBfUE9SVF0gPT0gaG9zdF9kYXRhW0hPU1RfVURQX1BPUlRdKSB7CisgICAgICAgICAgICAgICAgbG9nX2ZpbGUoSU5FVERfTE9HX0ZJTEUsIERBVEUgKyAiOiBOYW1lIGNoYW5nZTpcbiIgKworICAgICAgICAgICAgICAgICAgICBob3N0X2RhdGFbSE9TVF9OQU1FXSArICIgKCIgKyBob3N0X2RhdGFbSE9TVF9JUF0gKworICAgICAgICAgICAgICAgICAgICAiKSAtPiAiICsgZGF0YVtOQU1FXSArICJcblxuIik7CisgICAgICAgICAgICAgICAgaG9zdF9kYXRhW0hPU1RfTkFNRV0gPSBkYXRhW05BTUVdOworICAgICAgICAgICAgICAgIGhvc3RzW2xvd2VyX2Nhc2UoZGF0YVtOQU1FXSldID0gaG9zdF9kYXRhOworICAgICAgICAgICAgICAgIG1fZGVsZXRlKGhvc3RzLCBtdWRzW2ldKTsKKyAgICAgICAgICAgICAgICBpID0gLTI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGkgIT0gLTIpIHsKKyAgICAgICAgICAgIGhvc3RfZGF0YSA9IGhvc3RzW2xvd2VyX2Nhc2UoZGF0YVtOQU1FXSldID0gKHsKKyAgICAgICAgICAgICAgICBkYXRhW05BTUVdLAorICAgICAgICAgICAgICAgIGRhdGFbSE9TVF0sCisgICAgICAgICAgICAgICAgZGF0YVtVRFBfUE9SVF0sCisgICAgICAgICAgICAgICAgQ09NTUFORFMsCisgICAgICAgICAgICAgICAgKHsgIioiIH0pLAorICAgICAgICAgICAgICAgIFVQCisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIGxvZ19maWxlKElORVREX0xPR19GSUxFLCBEQVRFICsgIjogTmV3IG11ZC5cbiIgKyBkYXRhW05BTUVdICsgIjoiICsKKyAgICAgICAgICAgIGRhdGFbSE9TVF0gKyAiOiIgKyBkYXRhW1VEUF9QT1JUXSArICJcblxuIik7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCEocmVxID0gZGF0YVtSRVFVRVNUXSkpCisgICAgICAgIHJldHVybiBEQVRFICsgIjogU3lzdGVtIG1lc3NhZ2UuXG4iOworICAgIGlmIChyZXEgIT0gUElORyAmJgorICAgICAgICByZXEgIT0gUVVFUlkgJiYKKyAgICAgICAgcmVxICE9IFJFUExZICYmCisgICAgICAgIG1lbWJlcihob3N0X2RhdGFbTE9DQUxfQ09NTUFORFNdLCByZXEpID09IC0xKQorICAgIHsKKyAgICAgICAgLyogVGhpcyBzaG91bGQgcHJvYmFibHkgc2VuZCBhIHN5c3RlbSBtZXNzYWdlIHRvby4gKi8KKyAgICAgICAgX3NlbmRfdWRwKGhvc3RfZGF0YVtIT1NUX05BTUVdLCAoWworICAgICAgICAgICAgUkVRVUVTVDogUkVQTFksCisgICAgICAgICAgICBSRUNJUElFTlQ6IGRhdGFbU0VOREVSXSwKKyAgICAgICAgICAgIElEOiBkYXRhW0lEXSwKKyAgICAgICAgICAgIERBVEE6ICJJbnZhbGlkIHJlcXVlc3QgQCIgKyBMT0NBTF9OQU1FICsgIjogIiArCisgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShkYXRhW1JFUVVFU1RdKSArICJcbiIKKyAgICAgICAgXSkgKTsKKyAgICAgICAgcmV0dXJuIERBVEUgKyAiOiBJbnZhbGlkIHJlcXVlc3QuXG4iOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyoKKyAqIEluY29taW5nIFVEUCBwYWNrZXRzIGFyZSBzZW50IHRvIHRoaXMgZnVuY3Rpb24gdG8gYmUgaW50ZXJwcmV0dGVkLgorICogVGhlIHBhY2tldCBpcyBkZWNvZGVkLCBjaGVja2VkIGZvciB2YWxpZGl0eSwgSE9TVF9TVEFUVVMgaXMgdXBkYXRlZAorICogYW5kIHRoZSBhcHByb3ByaWF0ZSB1ZHAgbW9kdWxlIGNhbGxlZC4KKyAqIEFyZ3VtZW50czogU2VuZGVycyBJUCBhZGRyZXNzIChzdHJpbmcpCisgKiAgICAgICAgICAgIFVEUCBwYWNrZXQgKHN0cmluZykKKyAqLwordm9pZCBfcmVjZWl2ZV91ZHAoc3RyaW5nIHNlbmRlciwgc3RyaW5nIHBhY2tldCkgeworICAgIG1hcHBpbmcgZGF0YTsKKyAgICBzdHJpbmcgcmVxLCBlcnIsIGlkOworCisjaWZkZWYgVURQX01BU1RFUgorICAgIGlmICghcHJldmlvdXNfb2JqZWN0KCkgfHwKKyAgICBvYmplY3RfbmFtZShwcmV2aW91c19vYmplY3QoKSkgIT0gVURQX01BU1RFUikgeworICAgICAgICBsb2dfZmlsZShJTkVURF9MT0dfRklMRSwgREFURSArICI6IElsbGVnYWwgY2FsbCBvZiBfcmVjZWl2ZV91ZHAoKSBieSAiICsKKyAgICAgICAgb2JqZWN0X25hbWUocHJldmlvdXNfb2JqZWN0KCkpICsgIlxuXG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyNlbmRpZgorCisgICAgWkRFQlVHKHNwcmludGYoIiVPIC0+ICUuNTAwT1xuIixzZW5kZXIsIHBhY2tldCkpOworICAgIGlmICgKKyNpZmRlZiBERUxJTUlURVJfQ09NUEFUCisjaWZkZWYgVVNFX0VYVFJBQ1QKKyAgICAgICAgKCEoZGF0YSA9IGRlY29kZV9wYWNrZXQocGFja2V0LCBORVdfREVMSU1JVEVSKSkKKyNlbHNlCisgICAgICAgICghKGRhdGEgPSBkZWNvZGVfcGFja2V0KHBhY2tldCwgTkVXX0RFTElNSVRFUikpCisjZW5kaWYKKyAgICAgICAgfHwgKGRhdGFbSE9TVF0gPSBzZW5kZXIpICYmIChlcnIgPSB2YWxpZF9yZXF1ZXN0KGRhdGEpKSkgJiYKKyAgICAgICAgKCEoZGF0YSA9IGRlY29kZV9wYWNrZXQocGFja2V0LCBPTERfREVMSU1JVEVSKSkgfHwKKyAgICAgICAgKGRhdGFbSE9TVF0gPSBzZW5kZXIpICYmIChlcnIgPSB2YWxpZF9yZXF1ZXN0KGRhdGEpKSkKKyNlbHNlCisjaWZkZWYgVVNFX0VYVFJBQ1QKKyAgICAgICAgIShkYXRhID0gZGVjb2RlX3BhY2tldChwYWNrZXQsIERFTElNSVRFUikpCisjZWxzZQorICAgICAgICAhKGRhdGEgPSBkZWNvZGVfcGFja2V0KHBhY2tldCwgREVMSU1JVEVSKSkKKyNlbmRpZgorI2VuZGlmCisgICAgKSB7CisgICAgICAgIGlmICghZGF0YSkKKyNpZmRlZiBSRUNFSVZFX1VEUF9DT01QQVQKKyAgICAgICAgICAgIFJFQ0VJVkVfVURQX0NPTVBBVChzZW5kZXIsIHBhY2tldCk7CisjZWxzZQorICAgICAgICAgICAgbG9nX2ZpbGUoSU5FVERfTE9HX0ZJTEUsIERBVEUgKyAiOiBSZWNlaXZlZCBpbnZhbGlkIHBhY2tldC5cblNlbmRlcjogIiArCisgICAgICAgICAgICBzZW5kZXIgKyAiXG5QYWNrZXQ6XG4iICsgcGFja2V0ICsgIlxuXG4iKTsKKyNlbmRpZgorICAgICAgICByZXR1cm47CisgICAgfQorI2lmZGVmIERFTElNSVRFUl9DT01QQVQKKyAgICBpZiAoIW1hcHBpbmdwKGRhdGEpKQorICAgICAgICByZXR1cm47CisgICAgaWYgKGVycikKKyNlbHNlCisgICAgICAgICAgaWYgKCFtYXBwaW5ncChkYXRhKSkKKyAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICBkYXRhW0hPU1RdID0gc2VuZGVyOworICAgIGlmIChlcnIgPSB2YWxpZF9yZXF1ZXN0KGRhdGEpKQorI2VuZGlmCisgICAgeworICAgICAgICBsb2dfZmlsZShJTkVURF9MT0dfRklMRSwgZXJyICsgIlNlbmRlcjogIiArIHNlbmRlciArICJcblBhY2tldDpcbiIgKworICAgICAgICBwYWNrZXQgKyAiXG5cbiIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGhvc3RzW2xvd2VyX2Nhc2UoZGF0YVtOQU1FXSldW0hPU1RfU1RBVFVTXSA9IFVQOworICAgIGlmICgocmVxID0gZGF0YVtSRVFVRVNUXSkgPT0gUkVQTFkpIHsKKyAgICAgICAgICAgIG1hcHBpbmcgcGVuZGluZzsKKworICAgICAgICAvKiBJZiB3ZSBjYW4ndCBmaW5kIHRoZSByZXBseSBpbiB0aGUgcGVuZGluZyBsaXN0IHRoZW4gYmluIGl0LiAqLworICAgICAgICBpZiAoIShwZW5kaW5nID0gcGVuZGluZ19kYXRhW2xvd2VyX2Nhc2UoZGF0YVtOQU1FXSkgKyAiOiIgKyBkYXRhW0lEXV0pKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAvKiBTZXQgZGF0YVtSRVFVRVNUXSBjb3JyZWN0bHksIGJ1dCBzdGlsbCBzZW5kIHRvIChyZXEgPSBSRVBMWSkgKi8KKyAgICAgICAgZGF0YVtSRVFVRVNUXSA9IHBlbmRpbmdbUkVRVUVTVF07CisjaWZkZWYgSU5FVERfRElBR05PU1RJQ1MKKyAgICAgICAgZGF0YVtQQUNLRVRfTE9TU10gPSBwZW5kaW5nW1BBQ0tFVF9MT1NTXTsKKyAgICAgICAgZGF0YVtSRVNQT05TRV9USU1FXSA9IHRpbWUoKSAtIHBlbmRpbmdbUkVTUE9OU0VfVElNRV0gKyAxOworI2VuZGlmCisjaWYgMAorLyogY2hhbm5lbCByZXBsaWVzIG1heSBub3QgaW5jbHVkZSBhIHJlY2lwaWVudCwgYW5kIHNob3VsZG4ndCBoYXZlIG9uZSBzZXQgKi8KKyAgICAgICAgLyogUmVzdG9yZSB0aGUgUkVDSVBJRU5UIGluIHJlcGxpZXMgaWYgbm9uZSBnaXZlbiBhbmQgaXQgaXMga25vd24uICovCisgICAgICAgIGlmICghZGF0YVtSRUNJUElFTlRdICYmIHBlbmRpbmdbU0VOREVSXSkKKyAgICAgICAgICAgIGRhdGFbUkVDSVBJRU5UXSA9IHBlbmRpbmdbU0VOREVSXTsKKyNlbmRpZgorICAgICAgICBtX2RlbGV0ZShwZW5kaW5nX2RhdGEsIGxvd2VyX2Nhc2UoZGF0YVtOQU1FXSkgKyAiOiIgKyBkYXRhW0lEXSk7CisgICAgfQorICAgIGVsc2UgaWYgKGRhdGFbSURdKSB7CisgICAgICBpZCA9IGxvd2VyX2Nhc2UoZGF0YVtOQU1FXSkgKyAiOiIgKyBkYXRhW0lEXTsKKyAgICAgIGlmIChtZW1iZXIocmVjZWl2ZWRfaWRzLCBpZCkgPT0gLTEpCisgICAgICB7CisgICAgICAgIHJlY2VpdmVkX2lkcyArPSAoeyBpZCB9KTsKKyAgICAgICAgY2FsbF9vdXQoInJlbW92ZV9yZWNlaXZlZF9pZCIsCisgICAgICAgICAgICAgIFJFUExZX1RJTUVfT1VUICsgUkVQTFlfVElNRV9PVVQgKiAoUkVUUklFUyArIDEpLCBpZCk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgICAgICBhZGRfc3lzdGVtX2ZpZWxkKGRhdGEsIFJFUEVBVCk7CisgICAgfQorICAgIGlmIChlcnIgPSBjYXRjaCgKKyAgICAgICAgY2FsbF9vdGhlcihVRFBfQ01EX0RJUiArIHJlcSwgInVkcF8iICsgcmVxLCBkZWVwX2NvcHkoZGF0YSkpO3B1Ymxpc2gpKQorICAgIHsKKyAgICAgICAgX3NlbmRfdWRwKGRhdGFbTkFNRV0sIChbCisgICAgICAgICAgICBSRVFVRVNUOiBSRVBMWSwKKyAgICAgICAgICAgIFJFQ0lQSUVOVDogZGF0YVtTRU5ERVJdLAorICAgICAgICAgICAgSUQ6IGRhdGFbSURdLAorICAgICAgICAgICAgREFUQTogY2FwaXRhbGl6ZShyZXEpKyAiIHJlcXVlc3QgZmFpbGVkIEAiICsgTE9DQUxfTkFNRSArICIuXG4iCisgICAgICAgIF0pICk7CisgICAgICAgIGxvZ19maWxlKElORVREX0xPR19GSUxFLCBEQVRFICsgIjogIiArIGRhdGFbUkVRVUVTVF0gKyAiIGZyb20gIiArCisgICAgICAgIGRhdGFbTkFNRV0gKyAiIGZhaWxlZC5cbiIgKyBlcnIgKyBwYWNrZXQgKyAiXG5cbiIpOworICAgIH0KK30KKworaW50IGRvX21hdGNoKHN0cmluZyBtdWRuYW1lLCBzdHJpbmcgbWF0Y2hfc3RyKSB7CisgICAgcmV0dXJuIG11ZG5hbWVbMC4uc2l6ZW9mKG1hdGNoX3N0ciktMV0gPT0gbWF0Y2hfc3RyOworfQorCisjaWZkZWYgTk9fQ0xPU1VSRVMKKworc3RhdHVzIGdyZWF0ZXIobWl4ZWQgYSwgbWl4ZWQgYikgeworICAgIHJldHVybiBhID4gYjsKK30KKworc3RyaW5nICpleHBhbmRfbXVkX25hbWUoc3RyaW5nIG5hbWUpIHsKKyAgICByZXR1cm4gc29ydF9hcnJheSgKKyAgICAgICAgZmlsdGVyKG1faW5kaWNlcyhob3N0cyksICJkb19tYXRjaCIsIHRoaXNfb2JqZWN0KCksIG5hbWUpLAorICAgICAgICAiZ3JlYXRlciIsCisgICAgICAgIHRoaXNfb2JqZWN0KCkKKyAgICApOworfQorCisjZWxzZQorCitzdHJpbmcgKmV4cGFuZF9tdWRfbmFtZShzdHJpbmcgbmFtZSkgeworICAgIHJldHVybiBzb3J0X2FycmF5KAorICAgICAgICBmaWx0ZXIobV9pbmRpY2VzKGhvc3RzKSwgIydkb19tYXRjaCwgbmFtZSksCisgICAgICAgICMnPgorICAgICk7Cit9CisKKyNlbmRpZgorCitzdHJpbmcgZW5jb2RlKG1peGVkIGFyZykgeworICAgIGlmIChvYmplY3RwKGFyZykpCisgICAgICAgIHJldHVybiBvYmplY3RfbmFtZShhcmcpOworICAgIGlmIChzdHJpbmdwKGFyZykgJiYgc2l6ZW9mKGFyZykgJiYKKyAgICAgICAgKGFyZ1swXSA9PSAnJCcgfHwKKyNpZmRlZiBSRVNUUklDVEVEX0NBU1RTCisgICAgdG9fc3RyaW5nKHRvX2ludChhcmcpKSA9PSAoc3RyaW5nKWFyZykpCisjZWxzZQorICAgIChzdHJpbmcpdG9faW50KGFyZykgPT0gKHN0cmluZylhcmcpKQorI2VuZGlmCisgICAgICAgIHJldHVybiAiJCIgKyBhcmc7CisgICAgcmV0dXJuIHRvX3N0cmluZyhhcmcpOworfQorCitzdHJpbmcgZW5jb2RlX3BhY2tldChtYXBwaW5nIGRhdGEpIHsKKyAgICBpbnQgaTsKKyAgICBtaXhlZCBpbmRpY2VzOworICAgIHN0cmluZyBoZWFkZXIsIGJvZHksIHQxLCB0MjsKKyAgICBzdHJpbmcgKnJldDsKKyAgICBzdGF0dXMgZGF0YV9mbGFnOworCisgICAgZm9yKHJldCA9ICh7IH0pLCBpID0gc2l6ZW9mKGluZGljZXMgPSBtX2luZGljZXMoZGF0YSkpOyBpLS07ICkgeworICAgICAgICBpZiAoaW5kaWNlc1tpXSA9PSBEQVRBKSB7CisgICAgICAgICAgICBkYXRhX2ZsYWcgPSAxOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaGVhZGVyID0gZW5jb2RlKGluZGljZXNbaV0pOworICAgICAgICBib2R5ID0gZW5jb2RlKGRhdGFbaW5kaWNlc1tpXV0pOworICAgICAgICBpZiAoc3NjYW5mKGhlYWRlciwgIiVzOiVzIiwgdDEsIHQyKSB8fAorICAgICAgICAgICAgc3NjYW5mKGhlYWRlciArIGJvZHksICIlcyIgKyBERUxJTUlURVIgKyAiJXMiLCB0MSwgdDIpCisgICAgICAgICkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAKKyAgICAgICAgcmV0ICs9ICh7IGhlYWRlciArICI6IiArIGJvZHkgfSk7CisgICAgfQorICAgIGlmIChkYXRhX2ZsYWcpCisjaWZkZWYgVVNFX09MRF9EQVRBX0ZPUk1BVAorICAgICAgICByZXQgKz0gKHsgREFUQSArICI6IiArIGVuY29kZShkYXRhW0RBVEFdKSB9KTsKKyNlbHNlCisgICAgICAgIHJldCArPSAoeyAiIiwgZW5jb2RlKGRhdGFbREFUQV0pIH0pOworI2VuZGlmCisgICAgcmV0dXJuIGltcGxvZGUocmV0LCBERUxJTUlURVIpOworfQorCisvLyBGdW5rdGlvbiBleHBsb2RlXworLy8gRGllIEZ1bmt0aW9uIHplcmxlZ3QgZGVuIFN0cmluZyBwYWNrZXQgaW4gZ2xlaWNoIGxhbmdlIFRlaWxzdHJpbmdzCisvLyBkZXIgTGFlbmdlIGxlbiB1bmQgZ2lidCBkaWUgVGVpbHN0cmluZ3MgYWxzIEFycmF5IHp1cnVlY2suIERlciBsZXR6dGUKKy8vIFRlaWxzdHJpbmcga2FubiBrdWVyemVyIHNlaW4gYWxzIGRpZSBhbmRlcmVuLgorc3RyaW5nICpleHBsb2RlX3BhY2tldChzdHJpbmcgcGFja2V0LCBpbnQgbGVuKSB7CisKKyAgaW50IHB0ciwgbV9wdHIsc2l6ZTsKKyAgc3RyaW5nICpyZXN1bHQ7CisKKyAgLy8gVmFyaWFibGVuIGluaXRpYWxpc2llcmVuCisgIG1fcHRyPXB0cj0wOworICBzaXplPXNpemVvZihwYWNrZXQpOworICByZXN1bHQ9KHt9KTsKKworICAvLyBVbSBBcnJheWFkZGl0aW9uZW4genUgdmVybWVpZGVuIHdpcmQgdm9yaGVyIGFsbG9raWVydC4gRGllIERpdmlzaW9uIAorICAvLyBkdXJjaCAwIGlzdCBuaWNodCBhYmdlZmFuZ2VuLCBkYSBiZWkgbGVuPTAgd2FzIGltIEF1ZnJ1ZiBmYWxjaCBpc3QuCisgIHJlc3VsdD1hbGxvY2F0ZSgoc2l6ZS9sZW4rMSkpOworCisgIHdoaWxlIChwdHI8c2l6ZSkgeworICAgIHJlc3VsdFttX3B0cl0gPSAvLyBBa3R1ZWxsZW4gVGVpbHN0cmluZyBzcGVpY2hlcm4KKyNpZmRlZiBVU0VfRVhUUkFDVAorICAgICAgICAgICAgZXh0cmFjdChwYWNrZXQscHRyLHB0citsZW4tMSk7CisjZWxzZQorICAgICAgICAgICAgcGFja2V0W3B0ci4ucHRyK2xlbi0xXTsgCisjZW5kaWYKKyAgICBwdHIrPWxlbjsvLyBOZXVlbiBQb2ludGVyIGltIFN0cmluZyBiZXJlY2huZW4KKyAgICBtX3B0cisrOyAvLyBOZXVlbiBQb2ludGVyIGltIE1hcHBpbmcgYmVyZWNobmVuLiBIaWVyIG51dHplIGljaCBlaW5lCisgICAgICAgICAgICAgLy8gVmFyaWFibGUgbWVociBhbHMgbm9ldGlnLCB3ZWlsIGRhcyBiaWxsaWdlciBpc3QsIGFscyBqZWRlcworICAgICAgICAgICAgIC8vIG1hbCBwdHI9bV9wdHIqbGVuIGF1c3p1cmVjaG5lbi4gTGllYmVyIHp3ZWkgQWRkaXRpb25lbiBhbHMgCisgICAgICAgICAgICAgLy8gZWluZSBNdWx0aXBsaWthdGlvbiB1bmQgZWluZSBBZGR0aW9uLgorICB9CisKKyAgLy8gV2VubiBzaXplL2xlbiBhdWZnZWh0LCBpc3QgZGFzIFJlc3VsdC1GZWxkIHp1IGdyb3NzLiBEYW5uIGJsZWlidCAKKyAgLy8gZWluIEVsZW1lbnQgbGVlciwgZGFzIHdpcmQgaGllciBnZXN0cmlwcHQuIERhcyBpc3QgYmlsbGlnZXIgYWxzCisgIC8vIGplZGVzbWFsIGF1c3p1cmVjaG5lbiwgb2Igc2l6ZS9sZW4gYXVmZ2VodC4KKyAgcmV0dXJuIHJlc3VsdC0oezB9KTsKKyAKK30KKwordmFyYXJncyBzdHJpbmcgX3NlbmRfdWRwKHN0cmluZyBtdWRuYW1lLCBtYXBwaW5nIGRhdGEsIGludCBleHBlY3RfcmVwbHkpIHsKKyAgICBtaXhlZCBob3N0X2RhdGE7CisgICAgc3RyaW5nICpwYWNrZXRfYXJyOworICAgIHN0cmluZyBwYWNrZXQ7CisgICAgaW50IGk7CisKKyAgICBtdWRuYW1lID0gbG93ZXJfY2FzZShtdWRuYW1lKTsKKyAgICBpZiAoIShob3N0X2RhdGEgPSBob3N0c1ttdWRuYW1lXSkpIHsKKyAgICAgICAgc3RyaW5nICpuYW1lczsKKworICAgICAgICBpZiAoc2l6ZW9mKG5hbWVzID0gZXhwYW5kX211ZF9uYW1lKG11ZG5hbWUpKSA9PSAxKQorICAgICAgICAgICAgaG9zdF9kYXRhID0gaG9zdHNbbXVkbmFtZSA9IG5hbWVzWzBdXTsKKyAgICAgICAgZWxzZQorI2lmZGVmIFNFTkRfVURQX0NPTVBBVAorICAgICAgICAgICAgcmV0dXJuIChzdHJpbmcpU0VORF9VRFBfQ09NUEFUKG11ZG5hbWUsIGRhdGEsIGV4cGVjdF9yZXBseSk7CisjZWxzZQorICAgICAgICBpZiAoIXNpemVvZihuYW1lcykpCisgICAgICAgICAgICByZXR1cm4gIlVuYmVrYW5udGVyIE11ZG5hbWU6ICIgKyBjYXBpdGFsaXplKG11ZG5hbWUpICsgIlxuIjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIGJyZWFrX3N0cmluZygiTXVkbmFtZSAoIitjYXBpdGFsaXplKG11ZG5hbWUpKworICAgICAgICAgICAgIikgbmljaHQgZWluZGV1dGlnLCBlcyBwYXNzZW46ICIraW1wbG9kZShtYXAobmFtZXMsIydjYXBpdGFsaXplKSwiLCAiKSsKKyAgICAgICAgICAgICIuXG4iLDc4KTsKKyNlbmRpZgorICAgIH0KKyAgICAKKyAgICBpZiAoZGF0YVtSRVFVRVNUXSAhPSBQSU5HICYmCisgICAgICAgIGRhdGFbUkVRVUVTVF0gIT0gUVVFUlkgJiYKKyAgICAgICAgZGF0YVtSRVFVRVNUXSAhPSBSRVBMWSAmJgorICAgICAgICBtZW1iZXIoaG9zdF9kYXRhW0hPU1RfQ09NTUFORFNdLCAiKiIpID09IC0xICYmCisgICAgICAgIG1lbWJlcihob3N0X2RhdGFbSE9TVF9DT01NQU5EU10sIGRhdGFbUkVRVUVTVF0pID09IC0xKQorICAgICAgICByZXR1cm4gY2FwaXRhbGl6ZShkYXRhW1JFUVVFU1RdKSArICI6IENvbW1hbmQgdW5hdmFpbGFibGUgQCIgKworICAgICAgICAgICAgICAgICAgIGhvc3RfZGF0YVtIT1NUX05BTUVdICsgIlxuIjsKKyAgICAKKyAgICBkYXRhW05BTUVdID0gTE9DQUxfTkFNRTsKKyAgICBkYXRhW1VEUF9QT1JUXSA9IExPQ0FMX1VEUF9QT1JUOworICAgIAorICAgIGlmIChleHBlY3RfcmVwbHkpIHsKKyAgICAgICAgLyogRG9uJ3QgdXNlIHplcm8uICovCisgICAgICAgIGRhdGFbSURdID0gKytwYWNrZXRfaWQ7CisgICAgICAgIC8qIERvbid0IG5lZWQgZGVlcF9jb3B5KCkgYXMgd2UgYXJlIGNoYW5naW5nIHRoZSBtYXBwaW5nIHNpemUuICovCisgICAgICAgIHBlbmRpbmdfZGF0YVttdWRuYW1lICsgIjoiICsgcGFja2V0X2lkXSA9CisjaWZkZWYgSU5FVERfRElBR05PU1RJQ1MKKyAgICAgICAgZGF0YSArIChbIE5BTUU6IGhvc3RfZGF0YVtIT1NUX05BTUVdLCBSRVNQT05TRV9USU1FOiB0aW1lKCkgXSk7CisjZWxzZQorICAgICAgICBkYXRhICsgKFsgTkFNRTogaG9zdF9kYXRhW0hPU1RfTkFNRV0gXSk7CisjZW5kaWYKKyAgICB9CisgICAgaWYgKCEocGFja2V0ID0gZW5jb2RlX3BhY2tldChkYXRhKSkpIHsKKyAgICAgICAgaWYgKGV4cGVjdF9yZXBseSkKKyAgICAgICAgICAgIHBlbmRpbmdfZGF0YSA9IG1fY29weV9kZWxldGUocGVuZGluZ19kYXRhLCBtdWRuYW1lICsgIjoiICsgcGFja2V0X2lkKTsKKyAgICAgICAgbG9nX2ZpbGUoSU5FVERfTE9HX0ZJTEUsIERBVEUgKyAiOiBJbGxlZ2FsIHBhY2tldCBzZW50IGJ5ICIgKworICAgICAgICBvYmplY3RfbmFtZShwcmV2aW91c19vYmplY3QoKSkgKyAiXG5cbiIpOworICAgICAgICByZXR1cm4gImluZXRkOiBJbGxlZ2FsIHBhY2tldC5cbiI7CisgICAgfQorICAgIGlmIChleHBlY3RfcmVwbHkpCisgICAgICAgIGNhbGxfb3V0KCJyZXBseV90aW1lX291dCIsIFJFUExZX1RJTUVfT1VULCBtdWRuYW1lICsgIjoiICsgcGFja2V0X2lkKTsKKworICAgIGlmIChzaXplb2YocGFja2V0KSA8PSBNQVhfUEFDS0VUX0xFTikKKyAgICAgICAgcGFja2V0X2FyciA9ICh7IHBhY2tldCB9KTsKKyAgICBlbHNlIHsKKyAgICAgICAgc3RyaW5nIGhlYWRlcjsKKyAgICAgICAgaW50IG1heDsKKworICAgICAgICAvKiBCZSBjYXJlZnVsIHdpdGggdGhlIElELiAgZGF0YVtJRF0gY291bGQgaGF2ZSBiZWVuIHNldCB1cCBieSBSRVRSWSAqLworICAgICAgICBoZWFkZXIgPQorICAgICAgICAgICAgUEFDS0VUICsgIjoiICsgbG93ZXJfY2FzZShMT0NBTF9OQU1FKSArICI6IiArCisgICAgICAgICAgICAoKGV4cGVjdF9yZXBseSB8fCBkYXRhW1JFUVVFU1RdICE9IFJFUExZKSYmIGRhdGFbSURdID8KKyAgICAgICAgICAgIGRhdGFbSURdIDogKytwYWNrZXRfaWQpICsgIjoiOworICAgICAgICAKKyAgICAgICAgLyogQWxsb3cgOCBleHRyYSBjaGFyczogMyBkaWdpdHMgKyAiLyIgKyAzIGRpZ2l0cyArIERFTElNSVRFUiAqLworICAgICAgICBwYWNrZXRfYXJyID0gZXhwbG9kZV9wYWNrZXQocGFja2V0LAorICAgICAgICAgICAgTUFYX1BBQ0tFVF9MRU4gLSAoc2l6ZW9mKGhlYWRlcikgKyA4KSk7CisKKyAgICAgICAgZm9yKGkgPSBtYXggPSBzaXplb2YocGFja2V0X2Fycik7IGktLTsgKQorICAgICAgICAgICAgcGFja2V0X2FycltpXSA9CisgICAgICAgICAgICBoZWFkZXIgKyAoaSsxKSArICIvIiArIG1heCArIERFTElNSVRFUiArIHBhY2tldF9hcnJbaV07CisgICAgfQorICAgIAorICAgIGZvcihpID0gc2l6ZW9mKHBhY2tldF9hcnIpOyBpLS07ICkKKyAgICB7CisgICAgICBaREVCVUcoc3ByaW50ZigiJU8gPC0gJS41MDBPXG4iLGhvc3RfZGF0YVtIT1NUX0lQXSwgcGFja2V0X2FycltpXSkpOworICAgICAgaWYgKCFzZW5kX3VkcCgKKyAgICAgICAgaG9zdF9kYXRhW0hPU1RfSVBdLCBob3N0X2RhdGFbSE9TVF9VRFBfUE9SVF0sIHBhY2tldF9hcnJbaV0pKQorICAgICAgICAgICAgcmV0dXJuICJpbmV0ZDogRXJyb3IgaW4gc2VuZGluZyBwYWNrZXQuXG4iOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKwordm9pZCByZXBseV90aW1lX291dChzdHJpbmcgaWQpIHsKKyAgICBtYXBwaW5nIGRhdGE7CisKKyAgICBpZiAoZGF0YSA9IHBlbmRpbmdfZGF0YVtpZF0pIHsKKyAgICAgICAgb2JqZWN0IG9iOworCisjaWZkZWYgSU5FVERfRElBR05PU1RJQ1MKKyAgICAgICAgZGF0YVtQQUNLRVRfTE9TU10rKzsKKyNlbmRpZgorICAgICAgICBpZiAoZGF0YVtSRVRSWV0gPCBSRVRSSUVTKSB7CisgICAgICAgICAgICBtYXBwaW5nIHNlbmQ7CisKKyAgICAgICAgICAgIGRhdGFbUkVUUlldKys7CisgICAgICAgICAgICAvKiBXZSBtdXN0IHVzZSBhIGNvcHkgc28gdGhlIE5BTUUgZmllbGQgaW4gcGVuZGluZ19kYXRhW2lkXQorICAgICAgICAgICAgICogaXNuJ3QgY29ycnVwdGVkIGJ5IF9zZW5kX3VkcCgpLiAqLworICAgICAgICAgICAgc2VuZCA9IGRlZXBfY29weShkYXRhKTsKKyAgICAgICAgICAgIHNlbmQgPSBtX2NvcHlfZGVsZXRlKHNlbmQsIFJFVFJZKTsKKyNpZmRlZiBJTkVURF9ESUFHTk9TVElDUworICAgICAgICAgICAgc2VuZCA9IG1fY29weV9kZWxldGUoc2VuZCwgUEFDS0VUX0xPU1MpOworICAgICAgICAgICAgc2VuZCA9IG1fY29weV9kZWxldGUoc2VuZCwgUkVTUE9OU0VfVElNRSk7CisjZW5kaWYKKyAgICAgICAgICAgIGNhbGxfb3V0KCJyZXBseV90aW1lX291dCIsIFJFUExZX1RJTUVfT1VULCBpZCk7CisgICAgICAgICAgICBfc2VuZF91ZHAoZGF0YVtOQU1FXSwgc2VuZCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZGF0YSA9IG1fY29weV9kZWxldGUoZGF0YSwgUkVUUlkpOworI2lmZGVmIElORVREX0RJQUdOT1NUSUNTCisgICAgICAgIGRhdGEgPSBtX2NvcHlfZGVsZXRlKGRhdGEsIFJFU1BPTlNFX1RJTUUpOworI2VuZGlmCisgICAgICAgIGNhdGNoKGNhbGxfb3RoZXIoVURQX0NNRF9ESVIgKyBSRVBMWSwgInVkcF8iICsgUkVQTFksCisgICAgICAgIGFkZF9zeXN0ZW1fZmllbGQoZGF0YSwgVElNRV9PVVQpKTtwdWJsaXNoKTsKKyAgICAgICAgLyogSXQncyBqdXN0IHBvc3NpYmxlIHRoaXMgd2FzIHJlbW92ZWQgZnJvbSB0aGUgaG9zdCBsaXN0LiAqLworICAgICAgICBpZiAoaG9zdHNbbG93ZXJfY2FzZShkYXRhW05BTUVdKV0pCisgICAgICAgICAgICBob3N0c1tsb3dlcl9jYXNlKGRhdGFbTkFNRV0pXVtIT1NUX1NUQVRVU10gPSBET1dOOworICAgICAgICByZW1vdmVfaW5jb21pbmcobG93ZXJfY2FzZShkYXRhW05BTUVdKSArICI6IiArIGlkKTsKKyAgICB9CisgICAgcGVuZGluZ19kYXRhID0gbV9jb3B5X2RlbGV0ZShwZW5kaW5nX2RhdGEsIGlkKTsKK30KKwordm9pZCByZW1vdmVfcmVjZWl2ZWRfaWQoc3RyaW5nIGlkKSB7CisgICAgcmVjZWl2ZWRfaWRzIC09ICh7IGlkIH0pOworfQorCit2YXJhcmdzIG1peGVkIHF1ZXJ5KHN0cmluZyB3aGF0LCBtaXhlZCBleHRyYTEsIG1peGVkIGV4dHJhMikgeworICAgIG1peGVkIGRhdGE7CisKKyAgICBzd2l0Y2god2hhdCkgeworICAgICAgICBjYXNlICJjb21tYW5kcyI6CisgICAgICAgICAgICByZXR1cm4gQ09NTUFORFM7CisgICAgICAgIGNhc2UgImhvc3RzIjoKKyAgICAgICAgICAgIHJldHVybiBkZWVwX2NvcHkoaG9zdHMpOworICAgICAgICBjYXNlICJwZW5kaW5nIjoKKyAgICAgICAgICAgIHJldHVybiBkZWVwX2NvcHkocGVuZGluZ19kYXRhKTsKKyAgICAgICAgY2FzZSAiaW5jb21pbmciOgorICAgICAgICAgICAgcmV0dXJuIGRlZXBfY29weShpbmNvbWluZ19wYWNrZXRzKTsKKyAgICAgICAgY2FzZSAicmVjZWl2ZWQiOgorICAgICAgICAgICAgcmV0dXJuICh7IH0pICsgcmVjZWl2ZWRfaWRzOworICAgICAgICAvKiBhcmdzOiAidmFsaWRfcmVxdWVzdCIsIHJlcXVlc3QsIG11ZG5hbWUgKi8KKyAgICAgICAgY2FzZSAidmFsaWRfcmVxdWVzdCI6CisgICAgICAgICAgICBpZiAoZGF0YSA9IGhvc3RzW2V4dHJhMl0pCisgICAgICAgICAgICAgICAgcmV0dXJuIG1lbWJlcihkYXRhW0hPU1RfQ09NTUFORFNdLCAiKiIpICE9IC0xIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBtZW1iZXIoZGF0YVtIT1NUX0NPTU1BTkRTXSwgZXh0cmExKSAhPSAtMTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4oMCk7Cit9CisKZGlmZiAtLWdpdCBhL3NlY3VyZS9rcmF1dG1hc3Rlci5jIGIvc2VjdXJlL2tyYXV0bWFzdGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQwYWIwNgotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9rcmF1dG1hc3Rlci5jCkBAIC0wLDAgKzEsMTI4OSBAQAorI3ByYWdtYSBzdHJvbmdfdHlwZXMsIHNhdmVfdHlwZXMsIHJ0dF9jaGVja3MKKyNwcmFnbWEgbm9faW5oZXJpdCwgbm9fY2xvbmUsIG5vX3NoYWRvdworCisjaW5jbHVkZSA8ZGVmaW5lcy5oPgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKyNpbmNsdWRlIDxpdGVtcy9rcmFldXRlci9rcmFldXRlci5oPgorI2luY2x1ZGUgPGl0ZW1zL2tyYWV1dGVyL3RyYW5rYXR0cmlidXRlLmg+CisjaW5jbHVkZSA8bGl2aW5nL2NvbW0uaD4KKworCisjaWZuZGVmIEJTCisjZGVmaW5lIEJTKHgpICAgICAgICAgICAgIGJyZWFrX3N0cmluZyh4LCA3OCkKKyNlbmRpZgorCisvLyBXZWl0ZXIgdW50ZW4gYmVpbSBQYXJzZW4gZGVzIERhdGVuZmlsZXMgd2VyZGVuIFNldFByb3AoKSB1bmQgTmFtZSgpCisvLyB2ZXJ3ZW5kZXQsIGRhaGVyIGVyYmVuIHdpciB0aGluZy4KK2luaGVyaXQgIi9zdGQvc2VjdXJlX3RoaW5nIjsKKworLy8gTGlzdGUgYWxsZXIgbW9lZ2xpY2hlbiBadXRhdGVuLCBnZW1hcHB0IHVlYmVyIGVpbmVuIGtleQorLy8gQU46IGlycml0aWVyZW5kZXIgTmFtZSwgZGVubiBlcyBzaW5kIG5pY2h0IGRpcmVrdCBkaWUgWnV0YXRlbiBlbnRoYWx0ZW4KKy8vIHNvbmRlcm4gZGllIHVlYmVyIGVpbmVuIEtleSBpZGVudGlmaXppZXJ0ZW4gS3JhZXV0ZXJncnVwcGVuLCBkaWUgZGllCisvLyBXaXJrdW5nZW4vRnVua3Rpb25lbiBmZXN0bGVnZW4uCisvLyBGb3JtYXQ6CisvLyAoWyBrZXkgOiAoeyBhdHRyX3BvcywgYXR0cl9uZWcxLCBhdHRyX25lZzIsIEhhbHRiYXJrLiwgV2lya2RhdWVyLCAKKy8vICAgICAgICAgICAgIFVudGVyc3R1ZXR6dW5nLCBTdG9lcnVuZywgSGFldWZpZ2tlaXQgIH0pIF0pCisvLyBCZWlzcGllbDogWyggImE3Ijooeyh7Miw0MDB9KSwoezExLDE1MH0pLDAsMTcyODAwLDAsKHsibioifSksMCwxfSkgXSkKKy8vIEhVOiBXYXIgZWluIE1hcHBpbmcsIGJsZWlidCBlaW4gTWFwcGluZywgdW5kIG5ldTogRGllIEVpbnRyYWVnZSB3ZXJkZW4gCisvLyBhdWNoIE1hcHBpbmdzIQorcHJpdmF0ZSBtYXBwaW5nIGluZ3JlZGllbnRzOworCisvLyBNYXBwaW5nIHZvbiBpZCB6dW0gS2V5IGRlciBadXRhdGVuIGltIGluZ3JlZGllbnRzLW1hcHBpbmc6IGlkMmtleVtpZF09a2V5CisvLyBEaWUgYmVpZGVuIExpc3RlbiB3ZXJkZW4gYmVub2V0aWd0LCB1bSB6dSBkZW4gS3JhdXQtSURzIGRpZSBqZXdlaWxpZ2VuCisvLyBLZXlzIHp1IGZpbmRlbi4KKy8vIEhVOiBLRUlOIE1BUFBJTkcuIEVpbiBBcnJheSB2b24gU3RyaW5ncy4gQWJlciBkYXMgZ2VodCBuYXR1ZXJsaWNoLgorcHJpdmF0ZSBzdHJpbmcgKmlkMmtleTsKKworLy8gTWFwcGluZyB2b24ga2V5IHp1IEtyYWV1dGVyLUlEIGRlciBadXRhdGVuLgorcHJpdmF0ZSBtYXBwaW5nIGtleTJpZDsKKworLy8gRWlnZW5zY2hhZnRlbiBkZXIgS3JhZXV0ZXI6CisvLyBrcmF1dHByb3BzW2lkXT0oe0lELCBEZW1vbiwgR2VuZGVyLCBOYW1lLCBBZGpla3RpdihlKSwgUF9MT05HLCBSYXVtZGV0YWlsfSkKKy8vIGtyYXV0cHJvcHNbMF0gPSAwOyBJRCAwIGRhcmYgbmljaHQgZXhpc3RpZXJlbgorcHJpdmF0ZSBtaXhlZCAqa3JhdXRwcm9wczsKKworLy8gaGllciB3aXJkIGdlc3BlaWNoZXJ0IHdlbGNoZSBWZXJzaW9uIGVpbmVyIFp1dGF0IGZ1ZXIgZWluZW4gU3BpZWxlciBpc3QuCisvLyBBTi9UT0RPOiBXZW5uIGRhcyBmdWVyIE5pY2h0c2VoZXIgbnV0emJhciBzZWluIHNvbGwsIHNvbGx0ZSBoaWVyIGJlc3NlcgorLy8gbWl0IGdldHV1aWQoKSBnZWFyYmVpdGV0IHdlcmRlbiwgc3RhdHQgZ2V0dWlkKCkgenUgdmVyd2VuZGVuLgorLy8gcGxheWVyIGVudGhhZWx0IGZ1ZXIgamVkZSBTcGllbGVyLVVJRCBlaW5lbiBCaXRzdHJpbmcuIEdlc2V0enRlcyBCaXQKKy8vIGJlZGV1dGV0LCBkYXNzIGRlciBTcGllbGVyIHVlYmVyIGRhcyBLcmF1dCBtaXQgZGllc2VyIElEIGV0d2FzIHVlYmVyCisvLyBkaWUgVmVyd2VuZHVuZyB1bmQgV2lya3VuZyB3ZWlzcy4gRXMgZ2lidCBqZWRvY2ggbm9jaCBrZWluZSBMZXJubW9lZ2xpY2gtCisvLyBrZWl0IHVuZCBJTlNCRVNPTkRFUkUga2VpbmUgRnVua3Rpb25hbGl0YWV0IGltIE1hc3RlciwgdWViZXIgZGllIG1hbiAKKy8vIGRpZSBCaXRzIHNldHplbiBrb2VubnRlLgorcHJpdmF0ZSBtYXBwaW5nIHBsYXllcjsKKworLy8gdmVyc3R1ZW1tZWx0ZXMgbWFwcGluZyBmdWVyIGRlbiBWQyBpbiBzZXJ2aWNlIChTYXZlLUR1bW15KQorcHJpdmF0ZSBtYXBwaW5nIG1hcF9sZGZpZWQ7CisKKy8vIHJvb21zIGVudGhhZWx0IGRpZSBUZWlsZWludHJhZWdlIGRlcyBtYXBfbGRmaWVkIG1hcHBpbmcgdm9tIFZDCitwcml2YXRlIG1hcHBpbmcgcm9vbXM7CisKKy8vIEVudGhhZWx0IERhdGVuIHp1IGRlbiBSYWV1bWVuLCBpbiBkZW5lbiBkYXMgVHJvY2tuZW4gdm9uIEtyYWV1dGVybgorLy8gbW9lZ2xpY2ggaXN0LgorcHJpdmF0ZSBtYXBwaW5nIGRyeWluZ19kYXRhID0gKFs6NF0pOworCitzdHJpbmcgYnVpbGRfcGxhbnRuYW1lKG1peGVkICpwcm9wcyk7CisKKy8vIHN0cnVjdC1UZW1wbGF0IGZ1ZXIgVHJhbmthdHRyaWJ1dGUKKy8vIEZ1ZXIgZGFzIFNRTC1Mb2cgTVVTUyBkaWUgUmVpaGVuZm9sZ2UgZGVyIFRyYW5rYXR0cmlidXRlIGhpZXIgZ2VuYXUgZGllCisvLyBzZWluLCB3aWUgZGllIFNwYWx0ZW4gaW4gZGVyIFRhYmVsbGUuCisvKiBDdXJyZW50bHkgbm90IHVzZWQuCitzdHJ1Y3QgdHJhbmtfYXR0cmliX3MgeworICAgIGludCBjYXI7CisgICAgaW50IGRhOworICAgIGludCBkbTsKKyAgICBpbnQgZHU7CisgICAgaW50IGRuOworICAgIGludCBmbHQ7CisgICAgaW50IGZybzsKKyAgICBpbnQgaEk7CisgICAgaW50IGhQOworICAgIGludCBoSzsKKyAgICBpbnQgaEw7CisgICAgaW50IHBhOworICAgIGludCBwbTsKKyAgICBpbnQgcHU7CisgICAgaW50IHNzOworICAgIGludCBzcDsKKyAgICBpbnQgc2Q7Cit9OworKi8KKworI2RlZmluZSBhbGxvd2VkKCkgKCFwcm9jZXNzX2NhbGwoKSAmJiBcCisgICAgICAgIElTX0FSQ0goUlBMKSAmJiBJU19BUkNIKHRoaXNfaW50ZXJhY3RpdmUoKSkgKQorCisjZGVmaW5lIFBPVElPTkZJTEVTICh7IFRSQU5LSVRFTSB9KQorCisvLyBlaWdlbnNjaGFmdGVuIGltIGtyYXV0cHJvcHMtYXJyYXkKKyNkZWZpbmUgUFJPUF9JRCAgICAgICAgICAgSU5HUkVESUVOVF9JRAorI2RlZmluZSBQUk9QX0RFTU9OICAgICAgICBJTkdSRURJRU5UX0RFTU9OCisjZGVmaW5lIFBST1BfR0VOREVSICAgICAgIElOR1JFRElFTlRfR0VOREVSCisjZGVmaW5lIFBST1BfTkFNRSAgICAgICAgIElOR1JFRElFTlRfTkFNRQorI2RlZmluZSBQUk9QX0FESiAgICAgICAgICBJTkdSRURJRU5UX0FESgorI2RlZmluZSBQUk9QX0xPTkcgICAgICAgICBJTkdSRURJRU5UX0xPTkcKKyNkZWZpbmUgUFJPUF9ST09NREVUQUlMICAgSU5HUkVESUVOVF9ST09NREVUQUlMCisKKy8vIEFUVFJfIGlzIGltbWVyIGVpbiBhcnJheSAoeyBhdHRyaWJ1dCwgYWJpbGl0eSB9KQorI2RlZmluZSBBVFRSX0FSUl9BVFRSSUIgICAgICAwCisjZGVmaW5lIEFUVFJfQVJSX0FCSUxJVFkgICAgIDEKKworLy8gbWF4aW1hbCBlcmxhdWJ0ZXIgV2VydCBmdWVyIGVpbmUgRWlnZW5zY2hhZnQKKyNkZWZpbmUgTUFYX0FUVFJfQUJJTElUWSAgICAgIDk5OQorCit2b2lkIGRlYnVnKHN0cmluZyBzdHIpCit7CisgIC8vd3JpdGUoImRlYnVnOiAiK3N0cisiXG4iKTsKKyAgaWYgKHRoaXNfcGxheWVyKCkgJiYgSVNfQVJDSCh0aGlzX3BsYXllcigpKSkKKyAgICB0aGlzX3BsYXllcigpLT5SZWNlaXZlTXNnKHN0ciw1MzY4NzA5MTIpOworfQorCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKQoreworICAgc2V0ZXVpZChnZXR1aWQoKSk7CisgICAvLyBBTi9UT0RPOiBWYXJpYWJsZW4gb2JlbiBkaXJla3QgaW5pdGlhbGlzaWVyZW4uIFBydWVmZW4sIG9iIGRhdm9uCisgICAvLyBpcmdlbmR3YXMgbm9zYXZlIHNlaW4ga2Fubi4KKyAgIGlmICghcmVzdG9yZV9vYmplY3QoX19ESVJfXyIvQVJDSC9rcmF1dG1hc3RlciIpKQorICAgeworICAgICAgaW5ncmVkaWVudHM9KFtdKTsKKyAgICAgIGlkMmtleT0oe30pOworICAgICAga2V5MmlkPShbXSk7CisgICAgICBrcmF1dHByb3BzPSh7fSk7CisgICAgICBwbGF5ZXI9KFtdKTsKKyAgICAgIG1hcF9sZGZpZWQ9KFtdKTsKKyAgICAgIHJvb21zPShbXSk7CisgICB9CisgICBpZiAoc2xfb3BlbigiL2xvZy9BUkNIL2tyYXV0dHJhbmsuc3FsaXRlIikgIT0gMSkKKyAgIHsKKyAgICAgcmFpc2VfZXJyb3IoIkRhdGVuYmFuayBrb25udGUgbmljaHQgZ2VvZWZmbmV0IHdlcmRlbi5cbiIpOworICAgfQorICAgc2xfZXhlYygiQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgdHJhZW5rZShpZCBJTlRFR0VSIFBSSU1BUlkgS0VZLCAiCisgICAgICAgICAgICJ1aWQgVEVYVCBOT1QgTlVMTCwgcm5kIElOVEVHRVIsICIKKyAgICAgICAgICAgInRpbWUgSU5URUdFUiBERUZBVUxUIENVUlJFTlRfVElNRVNUQU1QLCAiCisgICAgICAgICAgICJyZWNlaXBlIFRFWFQgTk9UIE5VTEwsICIKKyAgICAgICAgICAgInF1YWxpdHkgVEVYVCBOT1QgTlVMTCwgIgorICAgICAgICAgICAiY2FyIElOVEVHRVIsICIKKyAgICAgICAgICAgImRhIElOVEVHRVIsICIKKyAgICAgICAgICAgImRtIElOVEVHRVIsICIKKyAgICAgICAgICAgImR1IElOVEVHRVIsICIKKyAgICAgICAgICAgImRuIElOVEVHRVIsICIKKyAgICAgICAgICAgImZsdCBJTlRFR0VSLCAiCisgICAgICAgICAgICJmcm8gSU5URUdFUiwgIgorICAgICAgICAgICAiaEkgSU5URUdFUiwgIgorICAgICAgICAgICAiaFAgSU5URUdFUiwgIgorICAgICAgICAgICAiaEsgSU5URUdFUiwgIgorICAgICAgICAgICAiaEwgSU5URUdFUiwgIgorICAgICAgICAgICAicGEgSU5URUdFUiwgIgorICAgICAgICAgICAicG0gSU5URUdFUiwgIgorICAgICAgICAgICAicHUgSU5URUdFUiwgIgorICAgICAgICAgICAic3MgSU5URUdFUiwgIgorICAgICAgICAgICAic3AgSU5URUdFUiwgIgorICAgICAgICAgICAic2QgSU5URUdFUik7IgorICAgICAgICAgICApOworICAgc2xfZXhlYygiQ1JFQVRFIElOREVYIElGIE5PVCBFWElTVFMgaWR4X3VpZCBPTiB0cmFlbmtlKHVpZCk7Iik7CisgICBzbF9leGVjKCJDUkVBVEUgSU5ERVggSUYgTk9UIEVYSVNUUyBpZHhfcmVjZWlwZSBPTiB0cmFlbmtlKHJlY2VpcGUpOyIpOworICAgc2xfZXhlYygiQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgcm9oZGF0ZW4oaWQgSU5URUdFUiBQUklNQVJZIEtFWSwgIgorICAgICAgICAgICAidWlkIFRFWFQgTk9UIE5VTEwsIHJuZCBJTlRFR0VSLCAiCisgICAgICAgICAgICJ0aW1lIElOVEVHRVIgREVGQVVMVCBDVVJSRU5UX1RJTUVTVEFNUCwgIgorICAgICAgICAgICAicmVjZWlwZSBURVhUIE5PVCBOVUxMLCAiCisgICAgICAgICAgICJxdWFsaXR5IFRFWFQgTk9UIE5VTEwsICIKKyAgICAgICAgICAgImNhciBJTlRFR0VSLCAiCisgICAgICAgICAgICJkYSBJTlRFR0VSLCAiCisgICAgICAgICAgICJkbSBJTlRFR0VSLCAiCisgICAgICAgICAgICJkdSBJTlRFR0VSLCAiCisgICAgICAgICAgICJkbiBJTlRFR0VSLCAiCisgICAgICAgICAgICJmbHQgSU5URUdFUiwgIgorICAgICAgICAgICAiZnJvIElOVEVHRVIsICIKKyAgICAgICAgICAgImhJIElOVEVHRVIsICIKKyAgICAgICAgICAgImhQIElOVEVHRVIsICIKKyAgICAgICAgICAgImhLIElOVEVHRVIsICIKKyAgICAgICAgICAgImhMIElOVEVHRVIsICIKKyAgICAgICAgICAgInBhIElOVEVHRVIsICIKKyAgICAgICAgICAgInBtIElOVEVHRVIsICIKKyAgICAgICAgICAgInB1IElOVEVHRVIsICIKKyAgICAgICAgICAgInNzIElOVEVHRVIsICIKKyAgICAgICAgICAgInNwIElOVEVHRVIsICIKKyAgICAgICAgICAgInNkIElOVEVHRVIpOyIKKyAgICAgICAgICAgKTsKKyAgIHNsX2V4ZWMoIkNSRUFURSBJTkRFWCBJRiBOT1QgRVhJU1RTIGlkeF91aWRfciBPTiByb2hkYXRlbih1aWQpOyIpOworfQorCitwdWJsaWMgc3RyaW5nIFF1ZXJ5UGxhbnRGaWxlKGludCBpZCkKK3sKKyAgaWYgKG1lbWJlcihrcmF1dHByb3BzLCBpZCkpCisgICAgcmV0dXJuIGJ1aWxkX3BsYW50bmFtZShrcmF1dHByb3BzW2lkXSk7CisgIHJldHVybiAwOworfQorCisvLyBBTjogRnVua3Rpb24gZXJtaXR0ZWx0LCBvYiBlaW4gU3BpZWxlciBwbCBkYXMgS3JhdXQgbWl0IGRlciBJRCBpZAorLy8gdmVyd2VuZGVuIGthbm4uIExhdXQgS29tbWVudGFyIHVudGVuIG11c3MgbWFuIGRhZnVlciB3b2hsIHdhcyB1ZWJlciBkYXMKKy8vIEtyYXV0IGdlbGVybnQgaGFiZW4sIHZvbiB3ZW0gaXN0IG1pciBnZXJhZGUgbm9jaCBuaWNodCBrbGFyLgorLy8gQU4vVE9ETzogRXMgaXN0IGJpc2hlciBrZWluZSBGdW5rdGlvbmFsaXRhZXQgdm9yaGFuZGVuLCB1bSBkaWUgSURzIGZ1ZXIKKy8vIGRlbiBTcGllbGVyIGZyZWl6dXNjaGFsdGVuLiBEaWUgRnVua3Rpb25zd2Vpc2UgbXVzcyBhdXMgZGVtIEJlaXNwaWVsY29kZQorLy8gdW50ZW4gZnVlciBkYXMgTGVhcm4tT24tRGVtYW5kIGFiZ2VsZXNlbiB3ZXJkZW4uCitub21hc2sgaW50IENhblVzZUluZ3JlZGllbnQob2JqZWN0IHBsLCBpbnQgaWQpCit7CisgIC8vIEljaCBtYWNoIG1hbCBkZW4gaGFydGVuIFdlZy4gLS0gSHVtbmkKKyAgcmV0dXJuIDE7CisgIC8vIEJpdHN0cmluZyBkZXMgU3BpZWxlcnMgYXVzIGRlciBMaXN0ZSBhdXNsZXNlbi4KKyAgIHN0cmluZyBzdHI9cGxheWVyW2dldHVpZChwbCldOworICAgaWYgKCFzdHJpbmdwKHN0cikpIHN0cj0iIjsKKyAgIGlmICh0ZXN0X2JpdChzdHIsIGlkKSkKKyAgICAgIHJldHVybiAxOyAvLyBtYWtlIHRoZSBjb21tb24gY2FzZSBmYXN0CisgICBlbHNlIHsKKyAgICAgLy8gbGV0enRlbmVuZGVzIGhhYmUgaWNoIG1pY2ggZW50c2NobG9zc2VuIGVpbnp1YmF1ZW4sIGRhcyBtYW4gbnVyIGRpZQorICAgICAvLyBLcmFldXRlciB2ZXJ3ZW5kZW4ga2FubiwgdWViZXIgZGllIG1hbiBzY2hvbm1hbCBldHdhcyBnZWxlc2VuL2dlbGVybnQKKyAgICAgLy8gaGF0LCBhdXMgZGllc2VtIEdydW5kLCBpc3QgZm9sZ2VuZGVyIEJsb2NrIGF1c2tvbW1lbnRpZXJ0LgorICAgICAvLyBEaWVzZXIgQmxvY2sgYmVkZXV0ZXQgcXVhc2kgZWluICJhdXRvIGxlYXJuaW5nIG9uIGRlbWFuZCIgZC5oLgorICAgICAvLyB3aXJkIGVpbiBLcmF1dCB2ZXJ3ZW5kZXQgd2lyZCBnZXBydWVmdCBvYiBmdWVyIGRpZXNlIEdydXBwZSBiZXJlaXRzCisgICAgIC8vIGVpbmUgSUQgZnJlaWdlc2NoYWx0ZXQgd3VyZGUgLSBhbnNvbnN0ZW4gd2lyZCBlaW5lIGZyZWlnZXNjaGFsdGV0LgorICAgICAvKgorICAgICAgICAgLy8gcHJ1ZWZlbiBvYiBmdWVyIGRlbiBLZXkgYmVyZWl0cyBlaW4gQml0IGdlc2V0enQgaXN0LCBnZ2YuIHNldHplbgorICAgICAgICAgaWYgKGlkPj1zaXplb2YoaWQya2V5KSkgcmV0dXJuIDA7IC8vIGlsbGVnYWxlIElkCisgICAgICAgICBpbnQgaWRsaXN0PWtleTJpZFtpZDJrZXlbaWRdXTsKKyAgICAgICAgIGludCBpOworICAgICAgICAgZm9yIChpPXNpemVvZihpZGxpc3QpLTE7IGk+PTA7IGktLSkgeworICAgICAgICAgICBpZiAodGVzdF9iaXQoc3RyLCBpZGxpc3RbaV0pKSByZXR1cm4gMDsgLy8gS2V5IGJlcmVpdHMgdm9yaGFuZGVuCisgICAgICAgICB9CisgICAgICAgICAvLyBadWZhZWxsaWcgZWluIEJpdCBmdWVyIGRlbiBLZXkgc2V0emVuCisgICAgICAgICBpPXJhbmRvbShzaXplb2YoaWRsaXN0KSk7CisgICAgICAgICBwbGF5ZXJbZ2V0dWlkKHBsKV09c2V0X2JpdChzdHIsIGlkbGlzdFtpXSk7CisgICAgICAgICBzYXZlX29iamVjdChvYmplY3RfbmFtZSgpKTsKKyAgICAgICAgIHJldHVybiAoaT09aWQpOworICAgICAqLworICAgICByZXR1cm4gMDsKKyAgIH0KK30KKworLy8gRGllc2UgRnVua3Rpb24gd2lyZCB2b20gTWV0emVsb3Jha2VsIGF1ZmdlcnVmZW4sIHVtIGRpZSBCZWxvaG51bmdlbiB6dQorLy8gZXJ6ZXVnZW4sIGRpZSBtYW4gZG9ydCBmdWVyIGVyZm9sZ3JlaWNoIGFic29sdmllcnRlIE1ldHplbGF1ZnRyYWVnZSBlcmhhZWx0CisjZGVmaW5lIEFMTE9XRURfQ0FMTEVSICh7ICIvZC9lYmVuZS9hcmF0aG9ybi9vcmFrZWwvc2VjdXJlL3NjaGFtYW5lIiB9KQorb2JqZWN0IGdldF9wbGFudF9ieV9jYXRlZ29yeShpbnQgbnBjX2NsYXNzKQoreworICBpZiAoIG1lbWJlcihBTExPV0VEX0NBTExFUiwgbG9hZF9uYW1lKHByZXZpb3VzX29iamVjdCgpKSk8MCApCisgICAgcmFpc2VfZXJyb3IoInVuYXV0aG9yaXNlZCBjYWxsIHRvIGdldF9wbGFudF9ieV9jYXRlZ29yeSgpXG4iKTsKKworICAvLyBVZWJlcmdlYmVuZSBOUEMtS2xhc3NlIGluIEtyYXV0LUthdGVnb3JpZSB1bXNldHplbi4KKyAgLy8gS2F0ZWdvcmllIDcgd2lyZCBhbHMgNy05IGludGVycHJldGllcnQgKHNpZWhlIHVudGVuKS4KKyAgaW50IGNhdGVnb3J5OworICBzd2l0Y2gobnBjX2NsYXNzKSB7CisgICAgY2FzZSAxOiBjYXNlIDI6ICAgICAgICAgY2F0ZWdvcnk9NDsgYnJlYWs7CisgICAgY2FzZSAzOiBjYXNlIDQ6ICAgICAgICAgY2F0ZWdvcnk9NTsgYnJlYWs7CisgICAgY2FzZSA1OiBjYXNlIDY6IGNhc2UgNzogY2F0ZWdvcnk9NjsgYnJlYWs7CisgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgY2F0ZWdvcnk9NzsgYnJlYWs7CisgIH0KKworICAvLyBBbGxlIEtyYWV1dGVyIGRlciBlcm1pdHRlbHRlbiBLYXRlZ29yaWUgcmF1c3N1Y2hlbi4gQmVpIEthdGVnb3JpZSA3CisgIC8vIHdlcmRlbiBhdWNoIGFsbGUgYXVzIDggdW5kIDkgZGF6dWdlbm9tbWVuLgorICBpbnQgKmVsaWdpYmxlX3BsYW50X2lkcz0oe30pOworICBmb3JlYWNoKCBzdHJpbmcgZ3JwLCBtYXBwaW5nIGdycGRhdGEgOiBpbmdyZWRpZW50cyApIHsKKyAgICBpZiAoIGNhdGVnb3J5ID09IDcgJiYgZ3JwZGF0YVtUX0FCVU5EQU5DRV0+PTcgfHwgCisgICAgICAgICAgY2F0ZWdvcnkgPT0gZ3JwZGF0YVtUX0FCVU5EQU5DRV0gKQorICAgICAgZWxpZ2libGVfcGxhbnRfaWRzICs9IGtleTJpZFtncnBdOworICB9CisKKyAgLy8gS3JhdXRuYW1lbiB6dSBkZW4gS3JhdXQtSURzIGVybWl0dGVsbi4KKyAgc3RyaW5nICpwbGFudGZpbGVzPW1hcChlbGlnaWJsZV9wbGFudF9pZHMsIGZ1bmN0aW9uIHN0cmluZyAoaW50IHBsYW50aWQpIHsKKyAgICByZXR1cm4gYnVpbGRfcGxhbnRuYW1lKGtyYXV0cHJvcHNbcGxhbnRpZF0pO30pOworCisgIC8vIEVpbiBLcmF1dCB6dWZhZWxsaWcgYXVzd2FlaGxlbiwgY2xvbmVuIHVuZCBkYXMgT2JqZWt0IHp1cnVlY2tnZWJlbi4KKyAgb2JqZWN0IHBsYW50PWNsb25lX29iamVjdChQTEFOVERJUitwbGFudGZpbGVzW3JhbmRvbShzaXplb2YocGxhbnRmaWxlcykpXSk7CisgIHBsYW50LT5EcnlQbGFudCg4MCtyYW5kb20oMTEpKTsKKyAgLy8gQXVmc2NocmVpYmVuLCB3ZXIgd2VsY2hlcyBLcmF1dCBtaXQgd2VsY2hlciBRdWFsaXRhZXQgcmF1c2Jla29tbXQuCisgIGxvZ19maWxlKCJBUkNIL3BsYW50X2J5X2NhdGVnb3J5IiwKKyAgICBzcHJpbnRmKCIlcyAlLTEycyAlLXMgUXVhbCAlZCBLYXQgJWQgQ2xhc3MgJWRcbiIsIAorICAgICAgc3RyZnRpbWUoIiV4ICVYIix0aW1lKCkpLCBnZXR1aWQoUEwpLAorICAgICAgb2JqZWN0X25hbWUocGxhbnQpW3NpemVvZihQTEFOVERJUikuLl0sCisgICAgICBwbGFudC0+UXVlcnlQcm9wKFBfUVVBTElUWSksIGNhdGVnb3J5LCBucGNfY2xhc3MpKTsKKy8vIHNwcmludGYoIiUyNHM6IGNhbGwgZnJvbSAlTywgcGxheWVyOiAlcyAoUEw6ICVPKSwga2F0ZWdvcnk6ICVkXG4iLCBjdGltZSgpLAorLy8gcHJldmlvdXNfb2JqZWN0KCksIGdldHVpZChwbGF5ZXIpLCBQTCwga2F0ZWdvcnkpKQorICByZXR1cm4gcGxhbnQ7Cit9CisKK3ByaXZhdGUgbm9zYXZlIG9iamVjdCBzaW11bF9lZnVuLCBwbGFudHZjOworCisvLyBmdWVyIFNJTVVMX0VGVU5fRklMRQorI2luY2x1ZGUgPGNvbmZpZy5oPgorCisvLyBBTi9UT0RPOiBLbGFlcmVuLCB3YXJ1bSBoaWVyIGVpbmUgZWlnZW5lIEZ1bmt0aW9uIGdldF9jbG9uZXIoKSBleGlzdGllcnQsCisvLyB3byBkb2NoIGRlciBLcmFldXRlci1WQyBzY2hvbiBlaW5lIGhhdC4KK25vbWFzayBwcml2YXRlIHN0cmluZyBnZXRfY2xvbmVyKCkKK3sKKyAgIGludCBpOworICAgb2JqZWN0IHBvOworICAgaWYgKCFzaW11bF9lZnVuKSB7CisgICAgICBpZiAoIShzaW11bF9lZnVuPWZpbmRfb2JqZWN0KFNJTVVMX0VGVU5fRklMRSkpKQorICAgICAgICAgc2ltdWxfZWZ1bj1maW5kX29iamVjdChTUEFSRV9TSU1VTF9FRlVOX0ZJTEUpOworICAgfQorICAgLy8gd2VubiBzaWUgamV0enQgbmljaHQgZXhpc3RpZXJ0IC0gYXVjaCBndXQsIGRhbm4gZ2lidCBlcyBoYWx0IGtlaW5lCisgICAvLyBzZWZ1bnMuCisKKyAgIGlmICghcGxhbnR2YykgcGxhbnR2Yz1maW5kX29iamVjdChLUkFFVVRFUlZDKTsKKyAgIAorICAgZm9yIChpPTA7IHBvPXByZXZpb3VzX29iamVjdChpKTsgaSsrKSB7CisgICAgICBpZiAocG89PW1hc3RlcigpIHx8IHBvPT1zaW11bF9lZnVuIHx8IHBvPT1NRSB8fAorICAgICAgICAgIHBvPT1wcmV2aW91c19vYmplY3QoKSB8fCBwbz09cGxhbnR2YykKKyAgICAgICAgIGNvbnRpbnVlOworICAgICAgZWxzZSByZXR1cm4gb2JqZWN0X25hbWUocG8pOworICAgfQorICAgcmV0dXJuIDA7Cit9CisKKy8vIEFOOiAKK25vbWFzayBzdHJpbmcgQ2hlY2tQbGFudChpbnQgaWQpCit7CisgICBpZiAoaWQ8PTAgfHwgaWQ+PXNpemVvZihpZDJrZXkpKSByZXR1cm4gMDsKKyAgIGlmICghc3RyaW5ncChpZDJrZXlbaWRdKSkgcmV0dXJuIDA7CisgICByZXR1cm4gZ2V0X2Nsb25lcigpOworfQorCisvLyB1ZWJlciBkaWVzZSBGdW5rdGlvbiBrYW5uIGRpZSBMaXN0ZSBkZXIgSWQncyB1cGRhdGV0IHdlcmRlbgorLy8gZXMgd2lyZCA8ZmlsZW5hbWU+IGVpbmdlbGVzZW4gdW5kIGR1cmNoZ2VwYXJzdC4KKy8vIERpZXNlIERhdGVpIG11c3MgaW4gamVkZXIgWmVpbGUgZm9sZ2VuZGVzIEZvcm1hdCBlaW5oYWx0ZW4gdW5kIGRhcmYga2VpbmUKKy8vIGxlZXJ6ZWlsZW4gZW50aGFsdGVuISA+IElkLGtleSxHZW5kZXIsTmFtZSxBZGpla3RpdgorLy8gQU46IERhcyBpc3QgUXVhdHNjaC4gRGFzIEZvcm1hdCBtdXNzIHNvIGF1c3NlaGVuOgorLy8gU3RyaW5nLUlEO0tyYXV0LUlEO2RlbW9uO2dlbmRlcjtQX05BTUU7YWRqZWt0aXY7UF9MT05HO3Jvb21kZXRhaWw7CisvLyBIVTogRGllc2UgRnVua3Rpb24gbGFzcyBpY2ggc28uIEhhcmhhci4KKy8vIFVwZGF0ZTogTmEgZ3V0LiBGYXN0Lgorbm9tYXNrIHByaXZhdGUgaW50IExvYWRJZExpc3Qoc3RyaW5nIGZpbGVuYW1lKQoreworICAgaW50IGksIGlkLCBzaSwgZGVtb247CisgICBzdHJpbmcgKmxpbmVzLCBmaWxlOworICAgbWl4ZWQgKmRhdGE7CisgICBmaWxlPXJlYWRfZmlsZShmaWxlbmFtZSk7CisgICBpZiAoIXN0cmluZ3AoZmlsZSkpIHJhaXNlX2Vycm9yKCJNaXNzaW5nIEZpbGU6ICIrZmlsZW5hbWUrIlxuIik7CisgICBsaW5lcz1leHBsb2RlKHJlYWRfZmlsZShmaWxlbmFtZSksICJcbiIpOworICAgc2k9c2l6ZW9mKGxpbmVzKS0xOworICAgLy8gQU4vVE9ETzogV2FydW0gdmVyd2VuZGV0IG1hbiBoaWVyIG5pY2h0IGF1Y2ggZWluZmFjaCBleHBsb2RlKCk/CisgICAvLyBXZW5uICIjI2VuZGUjIyIgYWxzIFRyZW5uemVpY2hlbiBlbnRoYWx0ZW4gaXN0LCBsaWVmZXJ0IGV4cGxvZGUoKQorICAgLy8gYWxzIGxldHp0ZW4gRWludHJhZyBlaW5lbiBMZWVyc3RyaW5nLCBkYXJhdWYga2FubiBtYW4gcHJ1ZWZlbi4KKyAgIC8vIEFsbGVyZGluZ3MgbXVlc3N0ZSBkYXMgdm9yIGRlbSBleHBsb2RlKCkgenVyIFplaWxlbnRyZW5udW5nIHBhc3NpZXJlbi4KKyAgIGZvciAoIDtzaT49MDsgc2ktLSkgCisgICB7CisgICAgIHN0cmluZyBsaWxpPWxpbmVzW3NpXTsKKyAgICAgaWYgKHN0cnN0cihsaW5lc1tzaV0sIiMjZW5kZSMjIik+PTApIGJyZWFrOworICAgfQorICAgc2ktLTsKKyAgIGlmIChzaTwwKSByYWlzZV9lcnJvcigiIyNlbmRlIyMgbm90IGZvdW5kIGluIGlkLWxpc3QuXG4iKTsKKyAgIGlkMmtleT1hbGxvY2F0ZShzaSsyKTsKKyAgIGtyYXV0cHJvcHM9YWxsb2NhdGUoc2krMik7CisgICAvLyBBTjogRnVlciBkYXMgQXVzbGVzZW4gZGVyIFdlcnRlIGF1cyBkZW0gQXJyYXkgImRhdGEiIG11ZXNzZW4gZGllIAorICAgLy8gSW5kaXppZXJ1bmdzLURlZmluZXMgamV3ZWlscyArMSB2ZXJ3ZW5kZXQgd2VyZGVuLCB3ZWlsIGltIERhdGVuZmlsZQorICAgLy8gc2NobGF1ZXJ3ZWlzZSBlaW4gRGF0ZW5mZWxkICp2b3JuZSogYW5nZWZ1ZWd0IHd1cmRlLgorICAgLy8gQU4vVE9ETzogdmllbGxlaWNodCBzb2xsdGUgbWFuIGJlc3NlciBFbGVtZW50IDAgenVlcnN0IGF1c2xlc2VuIHVuZAorICAgLy8gZGFubiBkYXMgQXJyYXkgYXJyIHVtIGVpbiBFbGVtZW50IGt1ZXJ6ZW46IGFyciA9IGFyclsxLi5dOworICAgZm9yIChpPXNpOyBpPj0wOyBpLS0pIHsKKyAgICAgIGRhdGE9ZXhwbG9kZShsaW5lc1tpXSwgIjsiKTsKKyAgICAgIGlmIChzaXplb2YoZGF0YSkhPTgpIHJhaXNlX2Vycm9yKCJXcm9uZyBpZC1saXN0IGZvcm1hdCBpbiBsaW5lICIrKGkrMSkrIlxuIik7CisgICAgICBpZD10b19pbnQoZGF0YVtQUk9QX0lEKzFdKTsKKyAgICAgIGRhdGFbUFJPUF9JRCsxXT1pZDsKKyAgICAgIGlmIChpZD5zaSsxKSByYWlzZV9lcnJvcihzcHJpbnRmKCJMaW5lICVkOiBpZCAlZCBncmVhdGVyIHRoYW4gYXJyYXkgc2l6ZSAlZC5cbiIsIGksIGlkLCBzaSkpOworICAgICAgaWQya2V5W2lkXT1kYXRhWzBdOworICAgICAgLy8gQU46IEljaCBzZWhlIG5vY2ggbmljaHQgc28gZ2Fueiwgd2FydW0gbWFuIHZvbiBkZW0gRGF0ZW5mZWxkCisgICAgICAvLyBQUk9QX0RFTU9OIG51ciBkYXMgbGV0enRlIFplaWNoZW4gYWxzIExpdGVyYWwgcHJ1ZWZlbiBzb2xsdGUuCisgICAgICAvLyBLb21wbGV0dCBnZWh0IGRvY2ggZ2VuYXVzb2d1dD8KKyAgICAgIHN3aXRjaChkYXRhW1BST1BfREVNT04rMV1bPDFdKSB7CisgICAgICAgIGNhc2UgJ1InOiBkYXRhW1BST1BfREVNT04rMV09UkFXOyBicmVhazsKKyAgICAgICAgY2FzZSAnMCc6IGRhdGFbUFJPUF9ERU1PTisxXT0wOyAgIGJyZWFrOworICAgICAgICBjYXNlICcxJzogZGF0YVtQUk9QX0RFTU9OKzFdPTE7ICAgYnJlYWs7CisgICAgICAgIGNhc2UgJzInOiBkYXRhW1BST1BfREVNT04rMV09MjsgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDogcmFpc2VfZXJyb3IoIlVua25vd24gZGVtb25mb3JtYXQgJyIrZGF0YVtQUk9QX0RFTU9OKzFdKworICAgICAgICAgICAgICAgICAgICInIGluIGlkbGlzdCBsaW5lICIrKGkrMSkrIlxuIik7CisgICAgICB9CisgICAgICBzd2l0Y2goZGF0YVtQUk9QX0dFTkRFUisxXVs8MV0pIHsKKyAgICAgICAgY2FzZSAnTic6IGRhdGFbUFJPUF9HRU5ERVIrMV09TkVVVEVSOyBicmVhazsKKyAgICAgICAgY2FzZSAnRic6IGRhdGFbUFJPUF9HRU5ERVIrMV09RkVNQUxFOyBicmVhazsKKyAgICAgICAgY2FzZSAnTSc6IGRhdGFbUFJPUF9HRU5ERVIrMV09TUFMRTsgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDogcmFpc2VfZXJyb3IoIlVua25vd24gZ2VuZGVyZm9ybWF0ICciK2RhdGFbUFJPUF9HRU5ERVIrMV0rCisgICAgICAgICAgICAgICAgICAgIicgaW4gaWRsaXN0IGxpbmUgIisoaSsxKSsiXG4iKTsKKyAgICAgIH0KKyAgICAgIFNldFByb3AoUF9HRU5ERVIsIGRhdGFbUFJPUF9HRU5ERVIrMV0pOworICAgICAgU2V0UHJvcChQX05BTUUsIGRhdGFbUFJPUF9OQU1FKzFdKTsKKyAgICAgIC8vIEFOL1RPRE86IGRhdGFbUFJPUF9BREpdIG11c3MgbWFuIG5pY2h0IHVuYmVkaW5ndCB2b3JoZXIgYXVmIDAgc2V0emVuCisgICAgICBpZiAoIXNpemVvZihkYXRhW1BST1BfQURKKzFdKSkgZGF0YVtQUk9QX0FESisxXT0wOworICAgICAgaWYgKGRhdGFbUFJPUF9BREorMV0pCisgICAgICAgICBTZXRQcm9wKFBfTkFNRV9BREosICh7Imdhbnogbm9ybWFsIiwgZGF0YVtQUk9QX0FESisxXX0pKTsKKyAgICAgIGVsc2UgU2V0UHJvcChQX05BTUVfQURKLCAiZ2FueiBub3JtYWwiKTsKKyAgICAgIFNldFByb3AoUF9BUlRJQ0xFLCBkYXRhW1BST1BfREVNT04rMV0hPVJBVyk7CisgICAgICBkZW1vbj0oZGF0YVtQUk9QX0RFTU9OKzFdPT1SQVcgPyAwIDogZGF0YVtQUk9QX0RFTU9OKzFdKTsKKyAgICAgIC8vIEFOOiBXZW5uIGtlaW5lIExhbmdiZXNjaHJlaWJ1bmcgaGludGVybGVndCB3dXJkZSwgd2lyZCBkZXIgTmFtZQorICAgICAgLy8gZGVzIEtyYXV0ZXMgYWxzIHNvbGNoZSB2ZXJ3ZW5kZXQuIEViZW5zbyBmdWVyIGRhcyBSYXVtZGV0YWlsLCBkYXMKKyAgICAgIC8vIGJlaW0gQmV0cmFjaHRlbiBkZXMgS3JhdXRlcyBpbSBSYXVtIGF1c2dlZ2ViZW4gd2lyZC4KKyAgICAgIGlmICghc2l6ZW9mKGRhdGFbUFJPUF9MT05HKzFdKSkgeworICAgICAgICAgZGF0YVtQUk9QX0xPTkcrMV0gPSBOYW1lKFdFUiwgZGVtb24pKyIuXG4iOworICAgICAgfQorICAgICAgZWxzZSBkYXRhW1BST1BfTE9ORysxXSA9IEJTKGRhdGFbUFJPUF9MT05HKzFdKTsKKy8vIEh1bW5pOiBPZmZlbmJhciBrb21tZW4gYW0gWmVpbGVuZW5kZSBtYW5jaG1hbCBaZWljaGVuIGRhenUuIEljaCBnZWhlIGRhdm9uCisvLyBhdXMsIGRhc3Mga2VpbmUgQmVzY2hyZWlidW5nIGt1ZXJ6ZXIgYWxzIDIgWmVpY2hlbiBpc3QuCisgICAgICBpZiAoc2l6ZW9mKGRhdGFbUFJPUF9ST09NREVUQUlMKzFdKTwyKSB7CisgICAgICAgICBkYXRhW1BST1BfUk9PTURFVEFJTCsxXSA9IE5hbWUoV0VSLCBkZW1vbikrIi5cbiI7CisgICAgICB9CisgICAgICBlbHNlIGRhdGFbUFJPUF9ST09NREVUQUlMKzFdID0gQlMoZGF0YVtQUk9QX1JPT01ERVRBSUwrMV0pOworICAgICAga3JhdXRwcm9wc1tpZF09ZGF0YVsxLi5dOworICAgfQorICAgU2V0UHJvcChQX05BTUUsIDApOworICAgU2V0UHJvcChQX05BTUVfQURKLCAiIik7CisgICAKKyAgIC8vIGtleTJpZC1DYWNoZSBuZXUgYXVmYmF1ZW4uCisgICBrZXkyaWQ9KFtdKTsKKyAgIGZvciAoaT1zaXplb2YoaWQya2V5KS0xOyBpPj0wOyBpLS0pIHsKKyAgICAgIGlmIChtZW1iZXIoa2V5MmlkLCBpZDJrZXlbaV0pKQorICAgICAgICAga2V5MmlkW2lkMmtleVtpXV0rPSh7IGkgfSk7CisgICAgICBlbHNlIGtleTJpZFtpZDJrZXlbaV1dPSh7IGkgfSk7CisgICB9CisgICByZXR1cm4gMTsKK30KKworLy8gSGlsZnNmdW5rdGlvbiB3aXJkIHp1bSBlaW5wYXJzZW4gYmVu9nRpZ3QKKy8vIHdhbmRlbHQgei5CLiBkZW4gc3RyaW5nIHZvbiAiaCA1MDAiIGluICh7IDMsIDUwMCB9KSB1bQorcHJpdmF0ZSBub21hc2sgPHN0cmluZ3xpbnQ+KiBidWlsZEF0dHJBcnIoc3RyaW5nIGF0dHIpCit7CisgICBpZiAoIWF0dHIpIHJldHVybiAwOworICAgYXR0cj10cmltKGF0dHIpOworICAgPHN0cmluZ3xpbnQ+KiByZXM9ZXhwbG9kZShhdHRyLCAiICIpLSh7IiJ9KTsKKyAgIC8vZGVidWcoc3ByaW50ZigiIGJ1aWxkIEF0dHIgJU8iLHJlcykpOworICAgaWYgKHNpemVvZihyZXMpIT0yKSByYWlzZV9lcnJvcigiV3JvbmcgYXR0cmliIGZvcm1hdCFcbiIpOworICAgLy9kZWJ1ZyhzcHJpbnRmKCIlTyIsVF9LUkFVVF9NQVApKTsKKyAgIHJldHVybiAoe1RfS1JBVVRfTUFQW3Jlc1swXV0sKGludClyZXNbMV19KTsKK30KKworLy8gQU46IEhpbGZzZnVua3Rpb24genVtIEVpbmxlc2VuIGRlciBUcmFlbmtlbGlzdGUuCitub21hc2sgcHJpdmF0ZSB2b2lkIExvYWRJbmRleChzdHJpbmcgZmlsZW5hbWUpCit7CisgICBpbnQgaSwgaiwgc2k7CisgICBzdHJpbmcgKmxpbmVzLCBmaWxlOworICAgbWl4ZWQgICpkYXRhOworCisgICBmaWxlPXJlYWRfZmlsZShmaWxlbmFtZSk7CisgICBpZiAoIXN0cmluZ3AoZmlsZSkpIHJhaXNlX2Vycm9yKCJNaXNzaW5nIEZpbGU6ICIrZmlsZW5hbWUrIlxuIik7CisgICAKKyAgIC8vIEFOL1RPRE86IEF1Y2ggaGllciB3YWVyZSB3aWVkZXIgZGllIFZlcndlbmR1bmcgdm9uIGV4cGxvZGUoKSB6dQorICAgLy8gZXJ3YWVnZW4uCisgICBsaW5lcz1leHBsb2RlKGZpbGUsICJcbiIpLSh7IiJ9KTsKKyAgIHNpPXNpemVvZihsaW5lcyk7CisgICBmb3IgKGk9MDsgaTxzaTsgaSsrKSBpZiAobGluZXNbaV09PSIjI3N0YXJ0IyMiKSBicmVhazsKKyAgIGkrKzsKKyAgIGlmIChpPj1zaSkgcmFpc2VfZXJyb3IoIm1pc3NpbmcgIyNzdGFydCMjIGluIEluZGV4LlxuIik7CisgICBpbmdyZWRpZW50cz0oW10pOworICAgZm9yICg7IGk8c2k7IGkrKykgeyAvLyBhbGxlIHplaWxlbiBkdXJjaGxhdWZlbi4uLgorICAgICAvLyBBTi9UT0RPOiBUYWJ1bGF0b3JlbiBhbHMgVHJlbm56ZWljaGVuIGZpbmRlIGljaCBpcmdlbmR3aWUgYmxvZWQuCisgICAgIC8vIEhVOiBEYXJ1bSBudW4gU2VtaWtvbG9ucworICAgICAvLyBkZWJ1ZygiWmVpbGUgIitsaW5lc1tpXSk7CisgICAgIGRhdGE9b2xkX2V4cGxvZGUobGluZXNbaV0sICI7Iik7IC8vIGFuIFNlbWlrb2xvbnMgdHJlbm5lbi4uLgorICAgICAvLyBkZWJ1ZyhzcHJpbnRmKCIlTyIsZGF0YSkpOworICAgICBpZiAoc2l6ZW9mKGRhdGEpIT05KSAKKyAgICAgICB7CisgICAgICAgICAvL2RlYnVnKHNwcmludGYoIiVPIixkYXRhKSk7CisgICAgICAgICByYWlzZV9lcnJvcigiV3JvbmcgaW5kZXhsaXN0IGZvcm1hdCBpbiBsaW5lICIrKGkrMSkrIlxuIik7CisgICAgICAgfQorICAgICBmb3IgKGo9ODsgaj49MDsgai0tKSB7CisgICAgICAgLy8gQU4vVE9ETzogaWYoZGF0YVtqXT09IiIgfHwgZGF0YVtqXT09Ii0iKSBkYXRhW2pdPTA7CisgICAgICAgLy8gZXMgc2luZCBvaG5laGluIHVlYmVyYWxsIFN0cmluZ3MgZW50aGFsdGVuLgorICAgICAgIC8vIFdpciBtYWNoZW4gYXVzICItIiBvZGVyICIwIiBlaW5lIGVjaHRlIGludC1OdWxsLgorICAgICAgIGlmIChzaXplb2YoZGF0YVtqXSk9PTAgfHwgZGF0YVtqXVswXT09Jy0nKSBkYXRhW2pdPTA7CisgICAgIH0KKyAgICAgLy8gSFU6IEFiIGhpZXIgYmF1IGljaCBtYWwgbmV1LiBEZW4gUmVzdCBwYWNrIGljaCBhdXNrb21tZW50aWVydCBkYXJ1bnRlciwgd2VubiBqZW1hbmQgZGVuIGFsdGVuIENvZGUKKyAgICAgLy8gbmFjaHNjaGF1ZW4gd2lsbC4KKyAgICAgLy8gSWNoIHdpbGwgZWluIE1hcHBpbmcgdm9uIGRpZXNlciBLcmFldXRlcmdydXBwZS4KKyAgICAgbWFwcGluZyBtaz0oW10pOworICAgICAvLyBEaWVzZXMgTWFwcGluZyBzb2xsIGRpZSBFaW50cmFlZ2UgbnVuIGVudGhhbHRlbi4KKyAgICAgbWtbVF9FRkZFQ1RfRFVSQVRJT05dPXRvX2ludChkYXRhWzVdKTsKKyAgICAgbWtbVF9BQlVOREFOQ0VdPXRvX2ludChkYXRhWzhdKTsKKyAgICAgLy8gcG9zaXRpdmUgRWZmZWt0ZSBhdWZ0ZWlsZW4KKyAgICAgLy9kZWJ1ZyhzcHJpbnRmKCJWb3Jwb3NpcyAlTyAtICVPIixtayxkYXRhKSk7CisgICAgIGlmIChzdHJpbmdwKGRhdGFbMV0pKQorICAgICAgIHsKKyAgICAgICAgIHN0cmluZyogcG9zaXM9ZXhwbG9kZShkYXRhWzFdLCIsIik7CisgICAgICAgICAvL2RlYnVnKHNwcmludGYoIiVPIC0gJU8iLG1rLHBvc2lzKSk7CisgICAgICAgICBmb3JlYWNoIChzdHJpbmcgcTpwb3NpcykgeworICAgICAgICAgICAvL2RlYnVnKHEpOworICAgICAgICAgICA8c3RyaW5nfGludD4qIGFycj1idWlsZEF0dHJBcnIocSk7CisgICAgICAgICAgIC8vZGVidWcoc3ByaW50ZigiJU8iLGFycikpOworICAgICAgICAgICBta1thcnJbMF1dPW1rW2FyclswXV0rYXJyWzFdOworICAgICAgICAgfQorICAgICAgIH0KKyAgICAgLy9kZWJ1ZyhzcHJpbnRmKCIlTyIsbWspKTsKKyAgICAgLy8gRXJzdGVyIE5lZ2F0aXZlciBFZmZla3QKKyAgICAgaWYgKGRhdGFbMl0hPTApCisgICAgICAgeworICAgICAgICAgPHN0cmluZ3xpbnQ+KiBhcnI9YnVpbGRBdHRyQXJyKGRhdGFbMl0pOworICAgICAgICAgbWtbYXJyWzBdXT1ta1thcnJbMF1dLWFyclsxXTsKKyAgICAgICB9CisgICAgIC8vZGVidWcoc3ByaW50Zigidm9ybmVnICVPIixtaykpOworICAgICAvLyBaZWl0ZXIgbmVnYXRpdmVyIEVmZmVrdAorICAgICBpZiAoZGF0YVszXSE9MCkKKyAgICAgICB7CisgICAgICAgICA8c3RyaW5nfGludD4qIGFycj1idWlsZEF0dHJBcnIoZGF0YVszXSk7CisgICAgICAgICBta1thcnJbMF1dPW1rW2FyclswXV0tYXJyWzFdOworICAgICAgIH0KKyAgICAgLy8gSGFsdGJhcmtlaXQgd2lyZCB1bWdlcmVjaG5ldAorICAgICBzdHJpbmcqIHN0aT1leHBsb2RlKGRhdGFbNF0sIiAiKS0oeyIifSk7CisgICAgIC8vZGVidWcoImhhbHRiYXIgIitzdGlbMF0pOworICAgICBzdHJpbmcgc3R0PXRyaW0oc3RpWzBdKTsKKyAgICAgaW50IGR1cjsKKyAgICAgaWYgKHN0dFs8MS4uXT09ImQiKSAvLyBUYWdlCisgICAgICAgeworICAgICAgICAgLy9kZWJ1ZygiVGFnZSIpOworICAgICAgICAgLy8gRGVyIGVyc3RlIFRlaWwgaXN0IGRpZSBEYXVlciBpbiBUYWdlbi4KKyAgICAgICAgIGR1cj10b19pbnQoc3RpWzBdWy4uPDJdKTsKKyAgICAgICAgIGR1cj1kdXIqMjQqNjAqNjA7IC8vIFNla3VuZGVuCisgICAgICAgICBta1tUX0VYUElSRV09ZHVyOworICAgICAgIH0KKyAgICAgaWYgKHN0dFs8MS4uXT09ImgiKSAvLyBTdHVuZGVuCisgICAgICAgeworICAgICAgICAgLy9kZWJ1ZygiU3R1bmRlbiIpOworICAgICAgICAgLy8gU29uc3QgaXN0IGVzIGhhbHQgZGllIERhdWVyIGluIFN0dW5kZW4uCisgICAgICAgICBkdXI9dG9faW50KHN0aVswXVsuLjwyXSk7CisgICAgICAgICBkdXI9ZHVyKjYwKjYwOworICAgICAgICAgbWtbVF9FWFBJUkVdPWR1cjsKKyAgICAgICB9CisgICAgIC8vZGVidWcoImVyZ2lidCAiK2R1cik7CisgICAgIC8vIE51biBkaWUgbHVzdGlnZW4gVW50ZXJzdHVldHp1bmdlbi4gRGF6dSBiZW51dHplbiB3aXIgdW5zZXJlbiBsdXN0aWdlbiBHbHVlY2tzaGFzZW4uCisgICAgIC8vIFVuZCBlaW4gUmVoLgorICAgICBzdHJpbmcqIGdsdWVja3NoYXNlOworICAgICBzdHJpbmcgcmVoOworICAgICAvLyBBbGxlIExlZXJ6ZWljaGVuIHJhdXMhCisgICAgIC8vZGVidWcoIlJlaGUiKTsKKyAgICAgLy9kZWJ1ZyhzcHJpbnRmKCJEYXRhOiAlTyIsZGF0YSkpOworICAgICBpZiAoc3RyaW5ncChkYXRhWzZdKSkKKyAgICAgICB7CisgICAgICAgICByZWg9KGV4cGxvZGUoZGF0YVs2XSwiICIpLSh7IiJ9KSlbMF07CisgICAgIAorICAgICAgICAgZ2x1ZWNrc2hhc2U9ZXhwbG9kZShyZWgsIiwiKS0oe30pOworICAgICAgICAgbWtbVF9TVVBQT1JURVJdPWdsdWVja3NoYXNlOworICAgICAgIH0KKyAgICAgZWxzZQorICAgICAgIHsKKyAgICAgICAgIG1rW1RfU1VQUE9SVEVSXT0wOworICAgICAgIH0KKyAgICAgLy8gTnVuIG1hY2hlbiB3aXIgZ2VuYXVzbyBkaWUgQmxvY2thZGVuLgorICAgICAvLyBEYXMgdG9sbGUgaXN0OiBSZWggdW5kIEdsdWVja3NoYXNlIGtvZW5uZW4gd2lyIHdpZWRlcnZlcndlbmRlbiEgRGFzIGZyZXV0LgorICAgICBpZiAoc3RyaW5ncChkYXRhWzddKSkKKyAgICAgICB7CisgICAgICAgICByZWg9KGV4cGxvZGUoZGF0YVs3XSwiICIpLSh7IiJ9KSlbMF07CisgICAgICAgICBnbHVlY2tzaGFzZT1leHBsb2RlKHJlaCwiLCIpLSh7fSk7CisgICAgICAgICBta1tUX0JMT0NLSU5HXT1nbHVlY2tzaGFzZTsKKyAgICAgICB9CisgICAgIGVsc2UKKyAgICAgICB7CisgICAgICAgICBta1tUX0JMT0NLSU5HXT0wOworICAgICAgIH0KKyAgICAgaW5ncmVkaWVudHNbdHJpbShkYXRhWzBdKV09bWs7CisgICB9CisgICAvL2RlYnVnKCJXdWZmIik7CisgICAvL2RlYnVnKHNwcmludGYoIiVPIixpbmdyZWRpZW50cykpOworfQorCitub21hc2sgcHJpdmF0ZSB2b2lkIHNhdmUoKQoreworICBzYXZlX29iamVjdChfX0RJUl9fIi9BUkNIL2tyYXV0bWFzdGVyIik7Cit9CisKKy8vIEFOOiBlcnpldWd0IGF1cyBOYW1lbiArIEFkamVrdGl2IGRlciBQZmxhbnplbmRhdGVuIGRlbiBPYmpla3RuYW1lbiwKKy8vIHouQi4gd2FsZHJlYmVfZ2VtZWluIG9kZXIgYWNrZXJrbGVlX2dlbGIsIHdvYmVpIEJpbmRlc3RyaWNoZSBhdWNoCisvLyBkdXJjaCBVbnRlcnN0cmljaGUgZXJzZXR6dCB3ZXJkZW4gKGFja2VyX3JldHRpY2gpLgorc3RyaW5nIGJ1aWxkX3BsYW50bmFtZShtaXhlZCAqcHJvcHMpCit7CisgICBzdHJpbmcga2V5OworICAgLy8gQU4vVE9ETzogZXJzdCBQUk9QX05BTUUgaW4ga2V5IHNjaHJlaWJlbiwgZGFubiBnZ2YuIFBST1BfQURKIGRhenUKKyAgIGlmIChzaXplb2YocHJvcHNbUFJPUF9BREpdKT4wKQorICAgICAga2V5PWxvd2Vyc3RyaW5nKHByb3BzW1BST1BfTkFNRV0rIl8iK3Byb3BzW1BST1BfQURKXSk7CisgICBlbHNlIGtleT1sb3dlcnN0cmluZyhwcm9wc1tQUk9QX05BTUVdKTsKKyAgIC8vIEFOL1RPRE86IGVyc2V0emVuIGR1cmNoIHJlZ3JlcGxhY2UoKTsKKyAgIGtleT1pbXBsb2RlKG9sZF9leHBsb2RlKGtleSwgIiAiKSwgIl8iKTsKKyAgIGtleT1pbXBsb2RlKG9sZF9leHBsb2RlKGtleSwgIi0iKSwgIl8iKTsKKyAgIHJldHVybiBrZXk7Cit9CisKK3B1YmxpYyB2b2lkIFVwZGF0ZVZDKCkKK3sKKyAgS1JBRVVURVJWQy0+dXBkYXRlKG1hcF9sZGZpZWQpOworfQorCisvLyBBTjogRGF0ZW4gbmV1IHBhcnNlbgorLy8gTmFjaCBkZW0gU2NocmVpYmVuIGRlcyBTYXZlZmlsZXMgbWl0dGVscyBzYXZlKCkgd2lyZCBhdWNoIGRhcworLy8gS3JhZXV0ZXItSGVhZGVyZmlsZSB2b20gS3JhZXV0ZXItVkMgbmV1IGdlc2NocmllYmVuLgoraW50IF9yZWZyZXNoKCkKK3sKKyAgIGludCBpOworICAgc3RyaW5nIGtleTsKKyAgIGlmIChleHRlcm5fY2FsbCgpICYmICFhbGxvd2VkKCkpCisgICAgIHJldHVybiAwOworICAgCisgICBMb2FkSWRMaXN0KF9fRElSX18iQVJDSC9rcmFldXRlcmxpc3RlLmR1bXAiKTsKKyAgIExvYWRJbmRleChfX0RJUl9fIkFSQ0gva3JhZXV0ZXJpbmRleC5kdW1wIik7CisgICBtYXBfbGRmaWVkPShbXSk7CisgICBmb3IgKGk9c2l6ZW9mKGtyYXV0cHJvcHMpLTE7IGk+PTA7IGktLSkKKyAgIHsKKyAgICAgIGlmIChzaXplb2Yoa3JhdXRwcm9wc1tpXSk8PVBST1BfUk9PTURFVEFJTCkgY29udGludWU7CisgICAgICBrZXkgPSBidWlsZF9wbGFudG5hbWUoa3JhdXRwcm9wc1tpXSk7CisgICAgICBtYXBfbGRmaWVkW2tleV09KHsga3JhdXRwcm9wc1tpXSwgcm9vbXNba2V5XXx8KFtdKSB9KTsKKyAgIH0KKyAgIHNhdmUoKTsKKyAgIFVwZGF0ZVZDKCk7CisgICAKKyAgIC8vIFVwZGF0ZSBIZWFkZXJmaWxlIG1pdCBLcmFldXRlcmxpc3RlCisgICBzdHJpbmcgKmtleXMgPSBzb3J0X2FycmF5KG1faW5kaWNlcyhtYXBfbGRmaWVkKSwgIyc8KTsKKyAgIHN0cmluZyBoZWFkZXJmaWxlID0KKyAgICAgIi8vIEF1dG9tYXRpc2NoIGdlbmVyaWVydGVzIEZpbGUsIG5pY2h0IHZvbiBIYW5kIGVkaXRpZXJlbiFcbiIKKyAgICAgIi8vIEVyemV1Z2VuZGVzIEZpbGU6ICIrb2JqZWN0X25hbWUoKSsiXG5cbiIKKyAgICAgIiNkZWZpbmUgUExBTlRDT1VOVCAiK3RvX3N0cmluZyhzaXplb2Yoa2V5cykpKyJcblxuIgorICAgICArIiNkZWZpbmUgUExBTlQoeCkgXCIvaXRlbXMva3JhZXV0ZXIvXCIreFxuXG4iOworICAgZm9yZWFjaChrZXk6IGtleXMpCisgICB7CisgICAgIGhlYWRlcmZpbGUgKz0gc3ByaW50ZigiI2RlZmluZSAlLTMwcyBQTEFOVChcIiVzXCIpXG4iLAorICAgICAgICAgICAgICAgICAgICAgdXBwZXJzdHJpbmcoa2V5KSwga2V5KTsKKyAgIH0KKyAgIHdyaXRlX2ZpbGUoS1JBRVVURVJMSVNURSwgaGVhZGVyZmlsZSwgMSk7CisKKyAgIHdyaXRlKCJJbnB1dGZpbGVzIHBhcnNlZC4gU2F2ZSAmIEhlYWRlcmZpbGVzIHVwZGF0ZWQhXG4iKTsKKyAgIHJldHVybiAxOworfQorCitpbnQgX2Nsb25lcGxhbnQoc3RyaW5nIHN0cikKK3sKKyAgaWYgKGFsbG93ZWQoKSkKKyAgeworICAgIGlmICh0b19zdHJpbmcodG9faW50KHN0cikpID09IHN0cikKKyAgICAgIHN0ciA9IFF1ZXJ5UGxhbnRGaWxlKHRvX2ludChzdHIpKTsKKyAgICBjbG9uZV9vYmplY3QoUExBTlRESVIrc3RyKS0+bW92ZSh0aGlzX3BsYXllcigpLCBNX05PQ0hFQ0spOworICAgIHdyaXRlKCJLcmF1dCAiICsgc3RyICsgIiBnZWNsb250LlxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgTUFYX1JPT01TIDEwICAvKiBrZWluIEtyYXV0IGlzdCBpbiBtZWhyIGFscyAxMCBSYWV1bWVuICovCisvLyBBTjogQXVzZ2FiZSBkZXIgS2F0ZWdvcmllbmxpc3RlIHVlYmVyIGRhcyBQbGFudHRvb2wuCitpbnQgX3Nob3dwbGFudChzdHJpbmcgc3RyKQoreworICAgaW50IGksIHNpLCBrYXQsIHNlY3VyZTsKKyAgIHN0cmluZyAqbGlzdCwga2V5OworICAgbWl4ZWQgKnJlcywgKmFycjsKKyAgIG1hcHBpbmcgcHJvcHM7CisKKyAgIHNlY3VyZT1hbGxvd2VkKCk7CisgICBub3RpZnlfZmFpbCgiRXMgZ2lidCBmb2xnZW5kZSBLcmFldXRlcmthdGVnb3JpZW46XG4iCisgICAgKyIgMCAtIGhhZXVmaWcgdW5kIGFuIHZpZWxlbiBTdGVsbGVuIGltIE11ZCBhbnp1ZmluZGVuXG4iCisgICAgKyIgMSAtIGV0d2FzIHNlbHRlbmVyIHp1IGZpbmRlbiwgYWJlciBpbW1lciBub2NoIGxlaWNodFxuIgorICAgICsiIDIgLSBhbiB3ZW5pZ2VuIGd1dCB2ZXJzdGVja3RlbiBTdGVsbGVuIGluIGFiZ2VsZWdlbmVuIEdlYmlldGVuXG4iCisgICAgKyIgMyAtIGRpdG8sIGplZG9jaCBtdXNzIGRhcyBLcmF1dCBkdXJjaCBlaW5lbiBOUEMgKFhQID49IDUwMDAwMCkgYmV3YWNodCBzZWluLlxuIgorICAgICsiIDQgLSBhZXVzc2Vyc3Qgc2VsdGVuIHVuZCBYUCA+PSAxIG1pb1xuIgorICAgICsiIDUgLSBhZXVzc2Vyc3Qgc2VsdGVuIHVuZCBYUCA+PSAyIG1pb1xuIgorICAgICsiIDYgLSBhZXVzc2Vyc3Qgc2VsdGVuIHVuZCBOUEMgYnJpbmd0ID49IDUgIFN0dXBzZVxuIgorICAgICsiIDcgLSBhZXVzc2Vyc3Qgc2VsdGVuIHVuZCBOUEMgYnJpbmd0ID49IDEwIFN0dXBzZVxuIgorICAgICsiIDggLSBhZXVzc2Vyc3Qgc2VsdGVuIHVuZCBOUEMgYnJpbmd0ID49IDIwIFN0dXBzZVxuIgorICAgICsiIDkgLSBhZXVzc2Vyc3Qgc2VsdGVuIHVuZCBOUEMgYnJpbmd0ID49IDUwIFN0dXBzZVxuIgorICAgICsiXG5TeW50YXg6IHNob3dwbGFudCA8a2F0ZWdvcmllPi5cbiIpOworICAga2F0PXRvX2ludChzdHIpOworICAgaWYgKGthdDwwIHx8IGthdD45KSByZXR1cm4gMDsKKyAgIGlmICh0b19zdHJpbmcoa2F0KSE9c3RyKSByZXR1cm4gMDsKKyAgIGxpc3Q9bV9pbmRpY2VzKG1hcF9sZGZpZWQpOworICAgLy8gQU46ICpncnVtbWVsKgorICAgLy8gcmVzID0gYWxsb2NhdGUoTUFYX1JPT01TLCAoe30pKTsKKyAgIHJlcz1tYXAoYWxsb2NhdGUoTUFYX1JPT01TKSwgIydhbGxvY2F0ZSk7IC8vICh7ICh7fSkgLi4uICh7fSkgfSkKKyAgIGZvciAoaT1zaXplb2YobGlzdCktMTsgaT49MDsgaS0tKSB7CisgICAgICBhcnI9bWFwX2xkZmllZFtsaXN0W2ldXTsKKyAgICAgIGlmIChzaXplb2YoYXJyKSE9MikgcmFpc2VfZXJyb3IoIldyb25nIG1hcF9sZGZpZWQtRm9ybWF0IGJ5ICIrbGlzdFtpXSsiXG4iKTsKKyAgICAgIGtleT1pZDJrZXlbYXJyWzBdW1BST1BfSURdXTsKKyAgICAgIGlmICgha2V5KSByYWlzZV9lcnJvcigiTWlzc2luZyBLZXkgZm9yIGlkICIrYXJyWzBdW1BST1BfSURdKyJcbiIpOworICAgICAgcHJvcHM9aW5ncmVkaWVudHNba2V5XTsKKyAgICAgIC8vaWYgKCFwb2ludGVycChwcm9wcykpIGNvbnRpbnVlOyAvLyBub2NoIG5pY2h0IGVpbmdldHJhZ2VuCisgICAgICAvL2lmIChzaXplb2YocHJvcHMpIT04KQorICAgICAgLy8gcHJpbnRmKCJXYXJuaW5nOiBXcm9uZyBpbmdyZWRpZW50LWNvbnRlbnQgYnkgIitrZXkrIlxuIik7CisgICAgICAvL2RlYnVnKHNwcmludGYoIiVPIixwcm9wcykpOworICAgICAgaWYgKHByb3BzPT0wKQorICAgICAgeworICAgICAgICBkZWJ1ZygiRmFsc2NoZXIgS2V5OiAiK2tleSk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGlmIChwcm9wc1tUX0FCVU5EQU5DRV09PWthdCkKKyAgICAgICAgeworICAgICAgICAgIHNpPXNpemVvZihhcnJbMV0pOworICAgICAgICAgIGlmIChzaTxNQVhfUk9PTVMpIHsKKyAgICAgICAgICAgIGlmIChzdHJpbmdwKGFyclswXVtQUk9QX0FESl0pKSB7CisgICAgICAgICAgICAgIFNldFByb3AoUF9BUlRJQ0xFLCAwKTsKKyAgICAgICAgICAgICAgU2V0UHJvcChQX05BTUUsIGFyclswXVtQUk9QX05BTUVdKTsKKyAgICAgICAgICAgICAgU2V0UHJvcChQX05BTUVfQURKLCBhcnJbMF1bUFJPUF9BREpdKTsKKyAgICAgICAgICAgICAgU2V0UHJvcChQX0dFTkRFUiwgYXJyWzBdW1BST1BfR0VOREVSXSk7CisgICAgICAgICAgICAgIGtleT1OYW1lKFdFUik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGtleT1hcnJbMF1bUFJPUF9OQU1FXTsKKyAgICAgICAgICAgIGlmIChzZWN1cmUpCisgICAgICAgICAgICAgIHJlc1tzaV0rPSh7IHNwcmludGYoIiUzZCAlLTQwczogJWRcbiIsIGFyclswXVtQUk9QX0lEXSwga2V5LCBzaSkgfSk7CisgICAgICAgICAgICBlbHNlIHJlc1tzaV0rPSh7IHNwcmludGYoIiUtNDBzOiAlZFxuIiwga2V5LCBzaSkgfSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICB9CisgICBmb3IgKGk9MDsgaTxNQVhfUk9PTVM7IGkrKykgeworICAgICAgc29ydF9hcnJheShyZXNbaV0sICMnPik7CisgICAgICBmaWx0ZXIocmVzW2ldLCAjJ3dyaXRlKTsKKyAgIH0KKyAgIHJldHVybiAxOworfQorCisvLyBBTjogQXVzZ2FiZSBkZXIgUmFldW1lLCBpbiBkZW5lbiBkaWUgS3JhZXV0ZXIgenUgZmluZGVuIHNpbmQuCisvLyBhbmdlc3RldWVydCB1ZWJlciBkYXMgUGxhbnR0b29sLgoraW50IF9zaG93cm9vbXMoc3RyaW5nIHN0cikKK3sKKyAgIGludCBpLCBqLCBpZDsKKyAgIHN0cmluZyAqbGlzdCwgZHVtbXk7CisgICBtaXhlZCAqYXJyOworICAgaWYgKCFhbGxvd2VkKCkpIHJldHVybiAwOworICAgbm90aWZ5X2ZhaWwoIlN5bnRheDogc2hvd3Jvb21zIDxpZD4gb2RlciBzaG93cm9vbXMgYWxsXG4iKTsKKyAgIGlmIChzdHIhPSJhbGwiKSB7CisgICAgIGlkPXRvX2ludChzdHIpOworICAgICBpZiAodG9fc3RyaW5nKGlkKSE9c3RyKSByZXR1cm4gMDsKKyAgIH0KKyAgIGVsc2UgaWQ9LTE7CisgICBsaXN0PW1faW5kaWNlcyhtYXBfbGRmaWVkKTsKKyAgIGZvciAoaT1zaXplb2YobGlzdCktMTsgaT49MDsgaS0tKSB7CisgICAgICBhcnI9bWFwX2xkZmllZFtsaXN0W2ldXTsKKyAgICAgIGlmIChzaXplb2YoYXJyKSE9MikgcmFpc2VfZXJyb3IoIldyb25nIG1hcF9sZGZpZWQtRm9ybWF0IGJ5ICIrbGlzdFtpXSsiXG4iKTsKKyAgICAgIGlmIChhcnJbMF1bUFJPUF9JRF09PWlkIHx8IGlkPDApIHsKKyAgICAgICAgIGlmICghc2l6ZW9mKG1faW5kaWNlcyhhcnJbMV0pKSkgeworICAgICAgICAgICAgaWYgKGlkPj0wKSB3cml0ZSgiRnVlciBkaWVzZSBJZCBzaW5kIGtlaW5lIFJhZXVtZSBlaW5nZXRyYWdlbi5cbiIpOworICAgICAgICAgfQorICAgICAgICAgZWxzZSBpZiAoaWQ+PTApIHsKKyAgICAgICAgICAgIHdyaXRlKCJGb2xnZW5kZSBSYWV1bWUgc2luZCBmdWVyICIrYXJyWzBdW1BST1BfSURdKyIgZWluZ2V0cmFnZW4uXG4iKTsKKyAgICAgICAgICAgIGZpbHRlcihtYXAobV9pbmRpY2VzKGFyclsxXSksICMnKywgIlxuIiksICMnd3JpdGUpOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICB9CisgICAgICAgICBlbHNlIGZpbHRlcihtYXAobV9pbmRpY2VzKGFyclsxXSksICMnKywgIjogIithcnJbMF1bUFJPUF9JRF0rIiwgIithcnJbMF1bUFJPUF9OQU1FXSsiXG4iKSwgIyd3cml0ZSk7CisgICAgICAgICBpZiAoaWQ+PTApIHJldHVybiAxOworICAgICAgfQorICAgfQorICAgd3JpdGUoIkZ1ZXIgZGllc2UgSWQgc2luZCBiaXNoZXIga2VpbmUgS3JhZXV0ZXIgZWluZ2V0cmFnZW4uXG4iKTsKKyAgIHJldHVybiAxOworfQorCisvLyBOdXR6dW5nIGRlciBLcmFldXRlciBpbiAgR2ViaWV0ZW4gbGllZmVydCBudXIgZGFubiBndWVsdGlnZSBLcmFldXRlciwKKy8vIHdlbm4gZGVyIFJhdW0gZWluZ2V0cmFnZW4gaXN0LgoraW50IF9hZGRyb29tKHN0cmluZyBzdHIpCit7CisgICBpbnQgaWQsIGk7CisgICBzdHJpbmcgKmxpc3QsIHZjOworCisgICBpZiAoIWFsbG93ZWQoKSkgeworICAgICAgd3JpdGUoIkZ1ZXIgZGFzIEVpbnRyYWdlbiBkZXIgUmFldW1lIHdlbmRlIERpY2ggZG9jaCBiaXR0ZSAiCisgICAgICAgICAgICAiYW4gZWluZW4gRU0uXG4iKTsKKyAgICAgIHJldHVybiAxOworICAgfQorICAgbm90aWZ5X2ZhaWwoIlN5bnRheDogYWRkcm9vbSA8a3JhdXRudW1tZXI+IDxmaWxlbmFtZT5cbiIpOworICAgc3RyPVBMLT5fdW5wYXJzZWRfYXJncygpOworICAgaWYgKCFzdHIgfHwgc3NjYW5mKHN0ciwgIiVkICVzIiwgaWQsIHN0cikhPTIpIHJldHVybiAwOworICAgaWYgKHN0cj09ImhpZXIiIHx8IHN0cj09ImhlcmUiKQorICAgeworICAgICBpZiAoIXRoaXNfcGxheWVyKCkpCisgICAgIHsKKyAgICAgICBub3RpZnlfZmFpbCgiS2VpbiBTcGllbGVyb2JqZWt0LCBrYW5uICIKKyAgICAgICAgICAgIlJhdW0gbmljaHQgaWRlbnRpZml6aWVyZW4uXG4iKTsKKyAgICAgICByZXR1cm4gMDsKKyAgICAgfQorICAgICBzdHI9dG9fc3RyaW5nKGVudmlyb25tZW50KHRoaXNfcGxheWVyKCkpKTsKKyAgIH0KKyAgIGlmIChzdHJbPDIuLl09PSIuYyIpIHN0cj1zdHJbMC4uPDNdOyAvLyAuYyBhYnNjaG5laWRlbgorICAgaWYgKGZpbGVfc2l6ZShzdHIrIi5jIik8PTApIHsKKyAgICAgIGxpc3Q9ZXhwbG9kZShzdHIsICIvIik7CisgICAgICB2Yz1pbXBsb2RlKGxpc3RbMC4uPDJdLCAiLyIpKyIvdmlydHVhbF9jb21waWxlci5jIjsKKyAgICAgIGlmIChmaWxlX3NpemUodmMpPD0wIHx8ICFjYWxsX290aGVyKHZjLCAiVmFsaWRhdGUiLCBsaXN0WzwxXSkpIHsKKyAgICAgICAgIHdyaXRlKCJObyBzdWNoIGZpbGUgXCIiK3N0cisiXCIuXG4iKTsKKyAgICAgICAgIHJldHVybiAxOworICAgICAgfQorICAgfQorICAgaWYgKGlkPD0wIHx8IGlkPj1zaXplb2YoaWQya2V5KSkgeworICAgICAgd3JpdGUoIklsbGVnYWwgcGxhbnRpZCAiK2lkKyIuXG4iKTsKKyAgICAgIHJldHVybiAxOworICAgfQorICAgbGlzdD1tX2luZGljZXMobWFwX2xkZmllZCk7CisgICBmb3IgKGk9c2l6ZW9mKGxpc3QpLTE7IGk+PTA7IGktLSkgeworICAgICAgaWYgKG1hcF9sZGZpZWRbbGlzdFtpXV1bMF1bUFJPUF9JRF09PWlkKSB7CisgICAgICAgICBpZiAoIW1lbWJlcihtYXBfbGRmaWVkW2xpc3RbaV1dWzFdLCBzdHIpKSB7CisgICAgICAgICAgICBtYXBfbGRmaWVkW2xpc3RbaV1dWzFdKz0oWyBzdHIgXSk7CisgICAgICAgICAgICByb29tc1tsaXN0W2ldXT0ocm9vbXNbbGlzdFtpXV18fChbXSkpKyhbIHN0ciBdKTsKKyAgICAgICAgICAgIHdyaXRlKCJSYXVtIEVyZm9sZ3JlaWNoIGVpbmdldHJhZ2VuIVxuIik7CisgICAgICAgICB9CisgICAgICAgICBlbHNlIHdyaXRlKCJSYXVtIGJlcmVpdHMgZWluZ2V0cmFnZW4uXG4iKTsKKyAgICAgICAgIHNhdmUoKTsKKyAgICAgICAgIF9yZWZyZXNoKCk7CisgICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0KKyAgIH0KKyAgIHdyaXRlKCJLcmF1dCBtaXQgaWQgIitpZCsiIG5pY2h0IGdlZnVuZGVuLlxuIik7CisgICByZXR1cm4gMTsKK30KKworaW50IF9kZWxyb29tKHN0cmluZyBzdHIpCit7CisgICBpbnQgaSwgZG9uZTsKKyAgIHN0cmluZyAqbGlzdDsKKworICAgaWYgKCFhbGxvd2VkKCkpIHsKKyAgICAgIHdyaXRlKCJGdWVyIGRhcyBMb2VzY2hlbiB2b24gUmFldW1lbiB3ZW5kZSBEaWNoIGRvY2ggYml0dGUgIgorICAgICAgICAgICAgImFuIGVpbmVuIEVNLlxuIik7CisgICAgICByZXR1cm4gMTsKKyAgIH0KKyAgIG5vdGlmeV9mYWlsKCJTeW50YXg6IGRlbHJvb20gPGZpbGVuYW1lPi5cbiIpOworICAgc3RyPVBMLT5fdW5wYXJzZWRfYXJncygpOworICAgaWYgKCFzdHIpIHJldHVybiAwOworICAgaWYgKHN0cls8Mi4uXT09Ii5jIikgc3RyPXN0clswLi48M107CisgICBsaXN0PW1faW5kaWNlcyhtYXBfbGRmaWVkKTsgZG9uZT0wOworICAgZm9yIChpPXNpemVvZihsaXN0KS0xOyBpPj0wOyBpLS0pCisgICB7CisgICAgICBpZiAobWVtYmVyKG1hcF9sZGZpZWRbbGlzdFtpXV1bMV0sIHN0cikpIHsKKyAgICAgICAgIG1fZGVsZXRlKG1hcF9sZGZpZWRbbGlzdFtpXV1bMV0sIHN0cik7CisgICAgICAgICBtX2RlbGV0ZShyb29tc1tsaXN0W2ldXSwgc3RyKTsKKyAgICAgICAgIHdyaXRlKCJSYXVtIGJlaSBpZCAiK21hcF9sZGZpZWRbbGlzdFtpXV1bMF1bUFJPUF9JRF0KKyAgICAgICAgICAgICAgICsiIGF1c2dldHJhZ2VuLlxuIik7CisgICAgICAgICBkb25lPTE7CisgICAgICB9CisgICB9CisgICBpZiAoIWRvbmUpIHsKKyAgICAgIGlmIChmaWxlX3NpemUoc3RyKyIuYyIpPDApCisgICAgICAgICB3cml0ZSgiTm8gc3VjaCBmaWxlIFwiIitzdHIrIlwiLlxuIik7CisgICAgICBlbHNlIHdyaXRlKCJGdWVyICIrc3RyKyIgc2luZCBrZWluZSBLcmFldXRlciBlaW5nZXRyYWdlbiFcbiIpOworICAgfQorICAgZWxzZSB7CisgICAgICBzYXZlKCk7CisgICAgICBfcmVmcmVzaCgpOworICAgfQorICAgcmV0dXJuIDE7Cit9CisKKy8vIFZlcmFubGFzc3QgZGVuIEtyYWV1dGVyLVZDLCBlaW5lIHBoeXMuIERhdGVpIGF1cyBkZW4gS3JhZXV0ZXJkYXRlbiBlaW5lcworLy8gS3JhdXRlcyB6dSBlcnpldWdlbiwgZmFsbHMgbWFuIGRpZXNlIGF1c2Jlc2NocmVpYmVuIHdpbGwuCitpbnQgX2NyZWF0ZWZpbGUoc3RyaW5nIHN0cikKK3sKKyAgaW50IGlkOworICBpZiAoIWFsbG93ZWQoKSkgeworICAgIHdyaXRlKCJEaWVzZSBGdW5rdGlvbiB3dXJkZSBmdWVyIERpY2ggbmljaHQgZnJlaWdlZ2ViZW4hXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBpZD10b19pbnQoc3RyKTsKKyAgaWYgKHRvX3N0cmluZyhpZCkhPXN0ciB8fCBpZDw9MCB8fCBpZD49c2l6ZW9mKGlkMmtleSkpIHsKKyAgICB3cml0ZSgiSWxsZWdhbCBwbGFudGlkICciK3N0cisiJy5cbiIpOworICAgIHJldHVybiAxOworICB9CisgIG5vdGlmeV9mYWlsKCJVbmtub3duIEZ1bmN0aW9uIGltIGtyYWV1dGVyVkM6IF9jcmVhdGVmaWxlKClcbiIpOworICByZXR1cm4gY2FsbF9vdGhlcihLUkFFVVRFUlZDLCAiX2NyZWF0ZWZpbGUiLCBidWlsZF9wbGFudG5hbWUoa3JhdXRwcm9wc1tpZF0pKTsKK30KKworLy8gQU46IEhpbGZzZnVua3Rpb25lbiwgZGVyemVpdCBlYmVuZmFsbHMgZGVha3RpdmllcnQuCisvLyBpID0gMC4uNywgUG9zaXRpb24gZGVzIEtyYXV0ZXMsIGZ1ZXIgZGFzIGRlciBBdWZydWYgZXJmb2xndCwgaW4gZGVyIAorLy8gTGlzdGUgZGVyIGluIGRlbiBLZXNzZWwgZWluZnVlbGx0ZW4gS3JhZXV0ZXIuCisvLyBrZXlMc3QgaXN0IGRpZSBMaXN0ZSBkZXIgS3JhZXV0ZXJncnVwcGVuLCBkZXIgZGllIEtyYWV1dGVyIHp1Z2VvcmRuZXQKKy8vIHNpbmQuCisvLyBBbiBkaWVzZXIgU3RlbGxlIGthbm4gYWxzbyBkaWUgV2lya3VuZyB2b24gS3JhZXV0ZXJncnVwcGVuIGFiZ2VoYWVuZ3QKKy8vIHdlcmRlbi4gVW5rbGFyIGlzdCBtaXIgYWt0dWVsbCBudXIsIHdhcnVtIGRpZXNlIEZ1bmt0aW9uIGRlbiBQYXJhbWV0ZXIKKy8vICJpIiBiZW5vZXRpZ2VuIHd1ZXJkZS4KKy8vIElkZWU6IEVzIHNvbGwgZGllIEVudHNjaGVpZHVuZyBkYXZvbiBhYmhhZW5naWcgZ2VtYWNodCB3ZXJkZW4ga29lbm5lbiwKKy8vIHdpZSBkaWUgR2VzYW10a29tYmluYXRpb24gYXVzc2llaHQsIHVuZCB6dXNhZXR6bGljaCBkYXZvbiwgYXVzIHdlbGNoZXIKKy8vIEdydXBwZSBkYXMgZWluemVsbmUgS3JhdXQgc3RhbW10Lgorbm9tYXNrIHByaXZhdGUgaW50IElzQmxvY2tlZChpbnQgaSwgc3RyaW5nICprZXlMc3QpCit7CisgIHJldHVybiAwOworfQorCisvLyBBTjogRGllc2UgRnVua3Rpb24gbXVlc3N0ZSBuYWNoIGRlbSBDb2RlIGluIG1ha2VfcG90aW9uKCkgenUgdXJ0ZWlsZW4KKy8vIDAgb2RlciAxIHp1cnVlY2tnZWJlbiwgZGFubiB3aXJkIGRlciBFaWdlbnNjaGFmdHN3ZXJ0IGRlciBLcmFldXRlcmdydXBwZQorLy8gdW0gZGVuIEZha3RvciAxLjUgdmVyc3RhZXJrdC4KK25vbWFzayBwcml2YXRlIGludCBJc0Jvb3N0ZWQoaW50IGksIHN0cmluZyAqa2V5THN0KQoreworICByZXR1cm4gMDsKK30KKworI2RlZmluZSBQUk5HICIvc3RkL3V0aWwvcmFuZC1nbGZzciIKKy8vIEluZGl2aWR1ZWxsZSBCb25pL01hbGkgZnVlciBTcGllbGVyLiBwbG9mZnNldCBzb2xsIHZpYSBSZWZlcmVueiB1ZWJlcmdlYmVuCisvLyB3ZXJkZW4gdW5kIHdpcmQgdm9uIGRlciBGdW5rdGlvbiBnZXNldHp0LgoraW50IGNhbGN1bGF0ZV9tb2QoaW50IGtyYXV0aW5kZXgsIHN0cmluZyBwbG5hbWUsIGludCBwbG9mZnNldCkKK3sKKyAgLy8gU3RhcnRvZmZzZXQgenVmYWVsbGlnIGVybWl0dGVsdCwgYWJlciBpbW1lciBnbGVpY2gKKyAgLy8gZnVlciBqZWRlbiBTcGllbGVybmFtZW4KKyAgUFJORy0+SW5pdFdpdGhVVUlEKHBsbmFtZSk7CisgIHBsb2Zmc2V0ID0gUFJORy0+cmFuZG9tKDE2KTsKKyAgLy8gSmVkZXMgS3JhdXQgaGF0IGF1Y2ggZWluZW4gaU9mZnNldCAoZGVyIGtvbnN0YW50IGJsZWlidCB1bmQgc2ljaCBuaWNodAorICAvLyBhZW5kZXJ0KS4gRGVyIHdpcmQgYXVjaCBhZGRpZXJ0LiBCZWkgVWViZXJzY2hyZWl0ZW4gdm9uIDMwIHdpcmQgbmFjaCAwCisgIC8vIGdld3JhcHB0LgorICAvLyBEZXIgT2Zmc2V0IGlzdCBkYW5uIChzcGllbGVyb2Zmc2V0ICsga3JhdXRpbmRleCkgJSAxNiwgZC5oLiBhbGxlIE1vZGlmaWthdG9yZW4gd2VyZGVuCisgIC8vIGRlciBSZWloZSBuYWNoIGR1cmNobGF1ZmVuLiBTbyBrcmllZ3QgamVkZXIgU3BpZWxlciAtIGZhc3QgZWdhbCwgYmVpIHdlbGNoZW0KKyAgLy8gT2Zmc2V0IGVyIHN0YXJ0ZXQgLSBhdWNoIGRlciBSZWloZSBuYWNoIGFsbGUgQm9uaStNYWxpLgorICBpbnQgb2Zmc2V0ID0gKChwbG9mZnNldCArIGtyYXV0aW5kZXgpICUgMTYpICogMjsKKyAgLy8gQW0gRW5kZSB3aXJkIGRhcyBnYW56ZSBub2NoIG5hY2ggODUgYmlzIDExNSB2ZXJsZWd0LgorICByZXR1cm4gb2Zmc2V0ICsgODU7Cit9CisKKyNkZWZpbmUgWldFSVRJRVMgIi9zZWN1cmUvendlaXRpZXMiCisKK21hcHBpbmcgY2FsY3VsYXRlX3BvdGlvbihpbnQqIHBsYW50aWRzLCBpbnQqIHF1YWxpdGllcywgc3RyaW5nIGZhbWlsaWUpCit7CisgIC8vIE1hbiBzb2xsdGUgb2huZSBkaWUgS3JhZXV0ZXIgbmljaHQgc28gZWluZmFjaCBXaXJrdW5nZW4gYmVsaWViaWcKKyAgLy8gYmVyZWNobmVuIGtvZW5uZW4uCisgIGlmIChleHRlcm5fY2FsbCgpICYmICFBUkNIX1NFQ1VSSVRZKQorICAgIHJldHVybiAwOworCisgIC8vIEhpZXIgc3BlaWNoZXJuIHdpciB1bnNlciBFcmdlYm5pcyBiencuIHVuc2VyIFp3aXNjaGVuZXJnZWJuaXMuCisgIG1hcHBpbmcgYXR0cmliOworICAvLyBIaWVyIHNwZWljaGVybiB3aXIgZGllIFdpcmtncnVwcGVuLCBkaWUgYXVzIGRlbiBQbGFudHMgZ2V6b2dlbiB3ZXJkZW4uCisgIG1hcHBpbmcqIHdpcmt1bmdlbj0oe30pOworICAvLyBIaWVyIHNwZWljaGVybiB3aXIgZ2xlaWNoIHNjaG9uIGJlaW0gRXJ6ZXVnZW4gZGllIHdpY2h0aWdzdGVuIEJsb2NrYWRlbi4KKyAgc3RyaW5nKiB1bnRlcnN0dWV0enVuZ2VuPSh7fSk7CisgIHN0cmluZyogYmxvY2thZGVuPSh7fSk7CisgIGludCB6dWZhbGw7CisgIC8vIERpZSBTb3J0aWVydW5nIG5hY2ggUGxhbnRJRCBpc3QgbnVyIGZ1ZXIgZGFzIFRyYW5rbG9nIHdpY2h0aWcuCisgIHBsYW50aWRzID0gc29ydF9hcnJheShwbGFudGlkcywgIyc8PSk7CisKKyAgLy8gUEFTUyAxOiBQZmxhbnplbiBkdXJjaCBXaXJrdW5nZW4gZXJzZXR6ZW4sIGRhYmVpIFVudGVyc3R1ZXR6ZXIKKyAgLy8gdW5kIEJsb2NrZXIgbWVya2VuLgorICBmb3JlYWNoIChpbnQgaWQsIGludCBxdWFsIDogbWttYXBwaW5nKHBsYW50aWRzLHF1YWxpdGllcykpCisgICAgeworICAgICAgLy9kZWJ1ZyhzcHJpbnRmKCJHZWhlIGR1cmNoIFBsYW50OiAlZCIsaWQpKTsKKyAgICAgIHN0cmluZyBrZXk9aWQya2V5W2lkXTsKKyAgICAgIC8vIFdpcmt1bmdlbiBkaWVzZXMgS3JhdXRzIGtvcGllcmVuCisgICAgICBtYXBwaW5nIGluZz1jb3B5KGluZ3JlZGllbnRzW2tleV0pOworICAgICAgLy9kZWJ1ZyhzcHJpbnRmKCIlTyIsaW5nKSk7CisgICAgICAvLyBadSBkZW4gV2lya3VuZ2VuIG5vY2ggZGVuIEtleSBoaW56dWZ1ZWdlbi4KKyAgICAgIGluZ1sia2V5Il09a2V5OworICAgICAgLy8gRGllIFF1YWxpdGFldCBkZXMgS3JhdXRlcyB3aXJkIG5vY2ggbWl0IGRlbSBzcGllbGVyaW5kaXZpZHVlbGxlbgorICAgICAgLy8gTW9kaWZpa2F0b3Igc2thbGllcnQuCisgICAgICBpbmdbInF1YWxpdHkiXT0ocXVhbCAqIGNhbGN1bGF0ZV9tb2QoaWQsIGZhbWlsaWUsICZ6dWZhbGwpKSAvIDEwMDsKKyAgICAgIHdpcmt1bmdlbis9KHtpbmd9KTsKKyAgICAgIGlmIChwb2ludGVycChpbmdbVF9TVVBQT1JURVJdKSkKKyAgICAgICAgeworICAgICAgICAgIGZvcmVhY2ggKHN0cmluZyBwaTppbmdbVF9TVVBQT1JURVJdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICB1bnRlcnN0dWV0enVuZ2VuKz0oe3BpfSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIGlmIChwb2ludGVycChpbmdbVF9CTE9DS0lOR10pKQorICAgICAgICB7CisgICAgICAgICAgZm9yZWFjaCAoc3RyaW5nIHBpOmluZ1tUX0JMT0NLSU5HXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgYmxvY2thZGVuKz0oe3BpfSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIGRlYnVnKHNwcmludGYoIktyYXV0ICVzIGVyZ2lidCBXZXJ0ZSAlTy4iLGtleSx3aXJrdW5nZW4pKTsKKyAgICB9CisgIC8vIFBBU1MgMjogSmV0enQgZGllIFVudGVyc3R1ZXR6dW5nZW4gYXVzd2VydGVuCisgIGZvcmVhY2ggKG1hcHBpbmcgbWFyOndpcmt1bmdlbikKKyAgICB7CisgICAgICBmb3JlYWNoIChzdHJpbmcgcGk6dW50ZXJzdHVldHp1bmdlbikKKyAgICAgICAgeworICAgICAgICAgIC8vIEhhYmVuIHdpciBlaW5lIFVudGVyc3R1ZXR6dW5nPworICAgICAgICAgIGlmIChtYXJbImtleSJdPT1waSB8fCAoKHBpWzFdPT0nKicpICYmIChwaVswXT09bWFyWyJrZXkiXVswXSkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBkZWJ1ZyAoc3ByaW50ZigibWFyPSVPLCBwaT0lTyIsbWFyLHBpKSk7CisgICAgICAgICAgICAgIC8vIEFMTEUgWkFITEVOIG1hbCAxLjUgbmVobWVuLiBNaXIgaXN0IGtsYXIsIGRhc3MgZGFzIG51biBhdWNoCisgICAgICAgICAgICAgIC8vIG1pdCBpcmdlbmR3ZWxjaGVuIEhhZXVmaWdrZWl0ZW4gcGFzc2llcnQsIGFiZXIgbWFsIGVocmxpY2gsCisgICAgICAgICAgICAgIC8vIGRhcyBpc3QgenVyIEJlcmVjaG51bmcgZWdhbC4KKyAgICAgICAgICAgICAgZm9yZWFjaCAoc3RyaW5nIGtrLCBtaXhlZCB2YWwgOiAmbWFyKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGlmIChpbnRwKHZhbCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICB2YWw9MTUqdmFsLzEwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAvLyBQQVNTIDM6IEpldHp0IGRpZSBCbG9ja2FkZW4gYXVzd2VydGVuCisgIGZvcmVhY2ggKG1hcHBpbmcgbWFyOndpcmt1bmdlbikKKyAgICB7CisgICAgICBmb3JlYWNoIChzdHJpbmcgcGk6YmxvY2thZGVuKQorICAgICAgICB7CisgICAgICAgICAgLy8gSGFiZW4gd2lyIGVpbmUgQmxvY2thZGU/CisgICAgICAgICAgaWYgKG1hclsia2V5Il09PXBpIHx8ICgocGlbMV09PScqJykgJiYgKHBpWzBdPT1tYXJbImtleSJdWzBdKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGRlYnVnIChzcHJpbnRmKCJtYXI9JU8sIHBpPSVPIixtYXIscGkpKTsKKyAgICAgICAgICAgICAgLy8gSGllciB3ZXJkZW4gYWxsZSBaYWhsZW4gYXVmIE51bGwgZ2VzZXR6dC4KKyAgICAgICAgICAgICAgZm9yZWFjaCAoc3RyaW5nIGtrLCBtaXhlZCB2YWwgOiAmbWFyKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGlmIChpbnRwKHZhbCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICB2YWw9MDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAvLyBQQVNTIDMuNTogUXVhbGl0YWV0IGRlciBLcmFldXRlciBza2FsaWVyZW4uCisgIGZvcmVhY2ggKG1hcHBpbmcgbWFyOndpcmt1bmdlbikKKyAgICB7CisgICAgICBmb3JlYWNoIChzdHJpbmcga2ssIG1peGVkIHZhbCA6ICZtYXIpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoaW50cCh2YWwpICYmIGtrIT0icXVhbGl0eSIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHZhbD12YWwqbWFyWyJxdWFsaXR5Il0vMTAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgIC8vIFBBU1MgNDogTnVuIGFkZGllcmVuIHdpciBhbGxlcyBhdWYgaW4gZGFzIE1hcHBpbmcgYXR0cmliLgorICBhdHRyaWI9KFtdKTsKKyAgZm9yZWFjaCAobWFwcGluZyBtYXI6d2lya3VuZ2VuKQorICAgIHsKKyAgICAgIGZvcmVhY2ggKHN0cmluZyBrazptYXIpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoaW50cChtYXJba2tdKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgYXR0cmliW2trXT1hdHRyaWJba2tdK21hcltra107CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgLy8gRGllIFdpcmt1bmdzZGF1ZXIgaXN0IGRlciBEdXJjaHNjaG5pdHQgZGVyIFdpcmt1bmdzZGF1ZXJuCisgIGF0dHJpYltUX0VGRkVDVF9EVVJBVElPTl0gLz0gc2l6ZW9mKHBsYW50aWRzKTsKKyAgZGVidWcoc3ByaW50ZigiRHVyYXRpb246ICVkXG4iLGF0dHJpYltUX0VGRkVDVF9EVVJBVElPTl0pKTsKKworICAvLyBEaWUgSGFsdGJhcmtlaXQgZGVzIFRyYW5rcyBpc3QgZGllIEhhbHRiYXJrZWl0IGRlcyBrbGVpbnN0ZW4gS3JhdXRlcy4KKyAgaW50IGR1cj0xMDAwMDAwMDsKKyAgZm9yZWFjaCAobWFwcGluZyBtYXI6d2lya3VuZ2VuKQorICAgIHsKKyAgICAgIGlmIChtYXJbVF9FWFBJUkVdPjAgJiYgZHVyPm1hcltUX0VYUElSRV0pCisgICAgICAgIHsKKyAgICAgICAgICBkdXI9bWFyW1RfRVhQSVJFXTsKKyAgICAgICAgfQorICAgIH0KKyAgaWYgKGR1cj09MTAwMDAwMDApCisgICAgeworICAgICAgZHVyPTA7CisgICAgfQorICBhdHRyaWJbVF9FWFBJUkVdPWR1cjsKKyAgZGVidWcoc3ByaW50ZigiRXhwaXJlOiAlZFxuIixkdXIpKTsKKworICBpbnQgbWF4aW11bT0wOworICAvLyBFZmZla3RlIHJhdXNyZWNobmVuLCBkaWUgbmljaHQgbWF4aW1hbCBzaW5kCisgIGZvcmVhY2ggKHN0cmluZyBraywgbWl4ZWQgdmFsOmF0dHJpYikKKyAgeworICAgIGlmIChtZW1iZXIoVF9LUkFVVF9FRkZFQ1RTLGtrKT49MCkKKyAgICB7CisgICAgICBpZiAodmFsPjAgJiYgbWF4aW11bTx2YWwpCisgICAgICB7CisgICAgICAgIG1heGltdW09dmFsOworICAgICAgfQorICAgIH0KKyAgfQorICAvLyBMb2dlaW50cmFnIGVyc3RlbGxlbi4KKyAgc2xfZXhlYygiSU5TRVJUIElOVE8gcm9oZGF0ZW4odWlkLCBybmQsIHJlY2VpcGUsIHF1YWxpdHksIGNhciwgZGEsIGRtLCBkdSwgIgorICAgICAgICAgICJkbiwgZmx0LCBmcm8sIGhJLCBoUCwgaEssIGhMLCBwYSwgcG0sIHB1LCBzcywgc3AsIHNkKSAiCisgICAgICAgICAgIlZBTFVFUyg/MSw/Miw/Myw/NCw/NSw/Niw/Nyw/OCw/OSw/MTAsPzExLCA/MTIsID8xMywgPzE0LCAiCisgICAgICAgICAgIj8xNSwgPzE2LCA/MTcsID8xOCwgPzE5LCA/MjAsID8yMSk7IiwKKyAgICAgICAgICB0aGlzX3BsYXllcigpID8gZ2V0dWlkKHRoaXNfcGxheWVyKCkpIDogIjx1bmtub3duPiIsCisgICAgICAgICAgenVmYWxsLAorICAgICAgICAgIGltcGxvZGUobWFwKHBsYW50aWRzLCAjJ3RvX3N0cmluZyksICIsICIpLAorICAgICAgICAgIGltcGxvZGUobWFwKHF1YWxpdGllcywgIyd0b19zdHJpbmcpLCAiLCAiKSwKKyAgICAgICAgICBhdHRyaWJbVF9DQVJSWV0sIGF0dHJpYltUX0RBTUFHRV9BTklNQUxTXSwKKyAgICAgICAgICBhdHRyaWJbVF9EQU1BR0VfTUFHSUNdLCBhdHRyaWJbVF9EQU1BR0VfVU5ERUFEXSwKKyAgICAgICAgICBhdHRyaWJbVF9FRkZFQ1RfRFVSQVRJT05dLCBhdHRyaWJbVF9GTEVFX1RQT1JUXSwKKyAgICAgICAgICBhdHRyaWJbVF9GUk9HXSwgYXR0cmliW1RfSEVBTF9ESVNFQVNFXSwKKyAgICAgICAgICBhdHRyaWJbVF9IRUFMX1BPSVNPTl0sIGF0dHJpYltUX0hFQUxfU1BdLAorICAgICAgICAgIGF0dHJpYltUX0hFQUxfTFBdLCBhdHRyaWJbVF9QUk9URUNUSU9OX0FOSU1BTFNdLAorICAgICAgICAgIGF0dHJpYltUX1BST1RFQ1RJT05fTUFHSUNdLCBhdHRyaWJbVF9QUk9URUNUSU9OX1VOREVBRF0sCisgICAgICAgICAgYXR0cmliW1RfU0FfU1BFRURdLCBhdHRyaWJbVF9TQV9TUEVMTF9QRU5FVFJBVElPTl0sCisgICAgICAgICAgYXR0cmliW1RfU0FfRFVSQVRJT05dKTsKKworICAvLyBNYXhpbWFsIHp3ZWkgcG9zaXRpdmUgRWZmZWt0ZS4KKyAgaW50IGN0ZWZmPTA7CisgIGZvcmVhY2ggKHN0cmluZyBraywgbWl4ZWQgdmFsIDogJmF0dHJpYikKKyAgeworICAgICAgaWYgKG1lbWJlcihUX0tSQVVUX0VGRkVDVFMsa2spPj0wKQorICAgICAgeworICAgICAgICAvLyBOdXIgZGllIDIgc3RhZXJrc3RlbiBwb3NpdGl2ZW4gV2lya3VuZ2VuIGJsZWliZW4gdWViZXIgKGRhenUKKyAgICAgICAgLy8gbXVlc3NlbiBzaWUgd2lya2xpY2ggZGVuIGdsZWljaGVuIFphaGxlbndlcnQgaGFiZW4sIGthbm4gYmVpCisgICAgICAgIC8vIEhlaWx1bmdlbiB2b3Jrb21tZW4sIHNvbnN0IGVoZXIgdW53YWhyc2NoZWlubGljaCkuCisgICAgICAgIGlmICh2YWw+MCAmJiBtYXhpbXVtPnZhbCkKKyAgICAgICAgeworICAgICAgICAgIHZhbD0wOworICAgICAgICB9CisgICAgICAgIC8vIFRocmVzaG9sZHMuIFp1IHp1IGdyb3NzZSBXaXJrdW5nZW4gaGFiZW4gZGllIEdyZW56ZSBhbHMKKyAgICAgICAgLy8gQXVzd2lya3VuZy4gTmVnYXRpdmUgV2lya3VuZ2VuLCBkaWUgLVRfTUlOSU1VTV9USFJFU0hPTEQgbmljaHQKKyAgICAgICAgLy8gdWViZXJzY2hyZWliZW4sIGZhbGxlbiB3ZWcuIEJlaSBkZW4gcG9zaXRpdmVuIGJsZWlidCBqYSBvaG5laGluIG51cgorICAgICAgICAvLyBkaWUgc3RhZXJrc3RlIFdpcmt1bmcgdWViZXIsIGRhIGdpYnQgZXMgZXJzdG1hbCBrZWluZQorICAgICAgICAvLyBNaW5kZXN0Z3JvZXNzZSBtZWhyLgorICAgICAgICBpZiAodmFsPlRfTUFYSU1VTV9USFJFU0hPTEQpCisgICAgICAgIHsKKyAgICAgICAgICB2YWw9VF9NQVhJTVVNX1RIUkVTSE9MRDsKKyAgICAgICAgfQorICAgICAgICBpZiAodmFsIDwgMCAmJiB2YWwgPiAtVF9NSU5JTVVNX1RIUkVTSE9MRCkKKyAgICAgICAgeworICAgICAgICAgIHZhbD0wOworICAgICAgICB9CisgICAgICAgIGlmIChtYXhpbXVtPT12YWwgJiYgdmFsPjApCisgICAgICAgIHsKKyAgICAgICAgICBjdGVmZisrOworICAgICAgICAgIC8vIFZvZWxsaWcgd2lsbGt1ZXJsaWNoLCB3YXMgaGllciBnZXRyb2ZmZW4gd2lyZC4gT2IgcmVwcm9kdXppZXJiYXIsCisgICAgICAgICAgLy8gdmVybXV0bGljaCBqYSwgYWJlciBoYWVuZ3QgbWl0IGRlciBNYXBwaW5nc3RydWt0dXIgenVzYW1tZW4uCisgICAgICAgICAgLy8gSGFyaGFyLgorICAgICAgICAgIGlmIChjdGVmZj4yKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHZhbD0wOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICB9CisgIGRlYnVnKHNwcmludGYoIiBUUkFOS0VSR0VCTklTOiAlTyIsYXR0cmliKSk7CisgIC8vIExvZ2VpbnRyYWcgZXJzdGVsbGVuLgorICBzbF9leGVjKCJJTlNFUlQgSU5UTyB0cmFlbmtlKHVpZCwgcm5kLCByZWNlaXBlLCBxdWFsaXR5LCBjYXIsIGRhLCBkbSwgZHUsICIKKyAgICAgICAgICAiZG4sIGZsdCwgZnJvLCBoSSwgaFAsIGhLLCBoTCwgcGEsIHBtLCBwdSwgc3MsIHNwLCBzZCkgIgorICAgICAgICAgICJWQUxVRVMoPzEsPzIsPzMsPzQsPzUsPzYsPzcsPzgsPzksPzEwLD8xMSwgPzEyLCA/MTMsID8xNCwgIgorICAgICAgICAgICI/MTUsID8xNiwgPzE3LCA/MTgsID8xOSwgPzIwLCA/MjEpOyIsCisgICAgICAgICAgdGhpc19wbGF5ZXIoKSA/IGdldHVpZCh0aGlzX3BsYXllcigpKSA6ICI8dW5rbm93bj4iLAorICAgICAgICAgIHp1ZmFsbCwKKyAgICAgICAgICBpbXBsb2RlKG1hcChwbGFudGlkcywgIyd0b19zdHJpbmcpLCAiLCAiKSwKKyAgICAgICAgICBpbXBsb2RlKG1hcChxdWFsaXRpZXMsICMndG9fc3RyaW5nKSwgIiwgIiksCisgICAgICAgICAgYXR0cmliW1RfQ0FSUlldLCBhdHRyaWJbVF9EQU1BR0VfQU5JTUFMU10sCisgICAgICAgICAgYXR0cmliW1RfREFNQUdFX01BR0lDXSwgYXR0cmliW1RfREFNQUdFX1VOREVBRF0sCisgICAgICAgICAgYXR0cmliW1RfRUZGRUNUX0RVUkFUSU9OXSwgYXR0cmliW1RfRkxFRV9UUE9SVF0sCisgICAgICAgICAgYXR0cmliW1RfRlJPR10sIGF0dHJpYltUX0hFQUxfRElTRUFTRV0sCisgICAgICAgICAgYXR0cmliW1RfSEVBTF9QT0lTT05dLCBhdHRyaWJbVF9IRUFMX1NQXSwKKyAgICAgICAgICBhdHRyaWJbVF9IRUFMX0xQXSwgYXR0cmliW1RfUFJPVEVDVElPTl9BTklNQUxTXSwKKyAgICAgICAgICBhdHRyaWJbVF9QUk9URUNUSU9OX01BR0lDXSwgYXR0cmliW1RfUFJPVEVDVElPTl9VTkRFQURdLAorICAgICAgICAgIGF0dHJpYltUX1NBX1NQRUVEXSwgYXR0cmliW1RfU0FfU1BFTExfUEVORVRSQVRJT05dLAorICAgICAgICAgIGF0dHJpYltUX1NBX0RVUkFUSU9OXSk7CisKKyAgcmV0dXJuIGF0dHJpYjsKK30KKworbWFwcGluZyBtYWtlX3BvdGlvbihvYmplY3QqIHBsYW50cykKK3sKKyAgLy8gLT4gbWFwcHQgbmljaHQtT2JqZWt0IHp1IDAsIGFiZXIgMCBpc3QgYXVjaCBuZSBndWVsdGlnZSBQbGFudElELiBEYWhlcgorICAvLyBt/HNzZW4gemVyc3RvZXJ0ZW4gT2JqZWt0ZSB2b3JoZXIgcmF1cy4KKyAgLy8gVE9ETzogZHJhdWYgdmVybGFzc2VuLCBkYXNzIG51ciBpbnRha3RlIE9iamVrdCBlbnRoYWx0ZW4gc2luZD8KKyAgaWYgKG1lbWJlcihwbGFudHMsIDApID49IDApCisgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigibWFrZV9wb3Rpb24oKSBnb3QgaW52YWxpZCBvYmplY3QgaW4gcGxhbnQgYXJyYXkgIgorICAgICAgICAgICAgICAgICAgICAgICAgIiUuNTBPXG4iLHBsYW50cykpOworCisgIGludCogcGxhbnRpZHMgPSAoaW50KilwbGFudHMtPlF1ZXJ5UGxhbnRJZCgpOworICBpbnQqIHF1YWxpdGllcyA9IChpbnQqKXBsYW50cy0+UXVlcnlQcm9wKFBfUVVBTElUWSk7CisKKyAgcmV0dXJuIGNhbGN1bGF0ZV9wb3Rpb24ocGxhbnRpZHMsIHF1YWxpdGllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWldFSVRJRVMtPlF1ZXJ5RmFtaWxpZSh0aGlzX3BsYXllcigpKSk7Cit9CisKKy8vIEFOOiBTdWNodCBhbGxlIFBmbGFuemVuIHJhdXMsIGluIGRlcmVuIE5hbWVuIGRlciBTdWNoYmVncmlmZiAic3RyIgorLy8gdm9ya29tbXQgdW5kIGxpc3RldCBkaWVzZSBhdWYuIExhZXVmdCBhbGxlcmRpbmdzIG1vbWVudGFuIG5vY2ggaW4gZWluZW4KKy8vIEZlaGxlciAiaW5kZXggb3V0IG9mIGJvdW5kcyIsIGFiZXIgbWFuIG11ZXNzdGUgaGllciAoVE9ETykgc293aWVzbyBtYWwKKy8vIHZvbiBleHBsb2RlKCkgYXVmIHN0cnN0cigpIHVtYmF1ZW4sIGRlbmtlIGljaC4KK3N0cmluZyBfZmluZHBsYW50KHN0cmluZyBzdHIpIHsKKyAgaW50IGksIGs7CisgIHN0cmluZyAqaW5kLCAqdG1wOworCisgIGlmKCFzdHIpIHJldHVybiAiIjsKKyAgd3JpdGUoIlN1Y2hlIG5hY2ggJyIrc3RyKyInOlxuXG4iKTsKKyAgaW5kID0gbV9pbmRpY2VzKG1hcF9sZGZpZWQpOworICBmb3IoaT0wO2k8c2l6ZW9mKGluZCk7aSsrKSB7CisgICAgdG1wID0gbWFwX2xkZmllZFtpbmRbaV1dWzBdOworICAgIGlmKCBzdHJpbmdwKHRtcFszXSkgJiYgCisgICAgICAgIG9sZF9leHBsb2RlKGxvd2VyX2Nhc2UodG1wWzNdKSxzdHIpWzBdICE9IGxvd2VyX2Nhc2UodG1wWzNdKSAKKyAgICAgICAgfHwKKyAgICAgICAgc3RyaW5ncCh0bXBbNF0pICYmIAorICAgICAgICBvbGRfZXhwbG9kZShsb3dlcl9jYXNlKHRtcFs0XSksc3RyKVswXSAhPSBsb3dlcl9jYXNlKHRtcFs0XSkpCisgICAgICB3cml0ZSgiIC0gICIrdG1wWzNdKworICAgICAgICAgIChzdHJpbmdwKHRtcFs0XSk/IiAoIit0bXBbNF0rIikiOiIiKSsiICAgICAgIC0gIit0bXBbMF0rIlxuIik7CisgIH0KKworICByZXR1cm4gIiI7Cit9CisKKy8vIEFOOiBGdW5rdGlvbiBsaWVmZXJ0IGRhcyBFcmdlYm5pc2FycmF5IGF1cyBtYWtlX3BvdGlvbigpIGZ1ZXIgZWluZSBMaXN0ZQorLy8gdm9uIEtyYWV1dGVybiwgZGllIGFscyAiLCAiLWdldHJlbm50ZSBLcmF1dC1JRHMgdWViZXJnZWJlbiB3ZXJkZW4gbXVlc3Nlbi4KK21peGVkIF9jaGVja1RyYW5rKHN0cmluZyBzdHIpCit7CisgIGlmIChleHRlcm5fY2FsbCgpICYmICFhbGxvd2VkKCkpCisgICAgcmV0dXJuIDA7CisKKyAgc3RyaW5nICppbmQsICphcmdzLCBuYW1lOworICBvYmplY3QgKm9ianM7CisgIGludCBrLCBsOworCisgIG9ianMgPSAoe30pOworICBpZighc3RyKSByZXR1cm4gIktlaW5lIEtyYWV1dGVyIHVlYmVyZ2ViZW4hIjsKKyAgaW5kID0gb2xkX2V4cGxvZGUoc3RyLCIsIik7CisvLyAgaW5kID0gKHsiMTgwIiwiMTEiLCI1MyJ9KTsKKyAgZm9yKGludCBpPTA7aTxzaXplb2YoaW5kKTtpKyspCisgIHsKKyAgICBuYW1lID0gYnVpbGRfcGxhbnRuYW1lKGtyYXV0cHJvcHNbdG9faW50KGluZFtpXSldKTsKKyAgICB3cml0ZSgiSW5wdXQ6ICciK25hbWUrIicgKCIraW5kW2ldKyIpXG4iKTsKKyAgICBvYmpzICs9ICh7Y2xvbmVfb2JqZWN0KFBMQU5URElSK25hbWUpfSk7CisgIH0KKyAgbWFwcGluZyByYWd0ZXN0ID0gbWFrZV9wb3Rpb24ob2Jqcyk7CisgIG9ianMtPnJlbW92ZSgpOworLyogIG5hbWU9IiI7CisgIGZvcihpbnQgaT0wO2k8c2l6ZW9mKHJhZ3Rlc3QpO2krKykKKyAgICAgICBuYW1lID0gbmFtZSArIHJhZ3Rlc3RbaV0rIiwiOworICB3cml0ZSgiUmVzdWx0OiAoeyAiK25hbWUrIiB9KVxuIik7Ki8KKyAgcmV0dXJuIHNwcmludGYoIiVPXG4iLHJhZ3Rlc3QpOworfQorCisjZGVmaW5lIFFVQUxfQkFTRSAgMAorI2RlZmluZSBRVUFMX1JORCAgIDEKKyNkZWZpbmUgREVMQVlfQkFTRSAyCisjZGVmaW5lIERFTEFZX1JORCAgMworCisjZGVmaW5lIEFMTE9XRURfRFJJRVIgIi9pdGVtcy9rcmFldXRlci90cm9ja25lciIKKworLy8gTGllZmVydCBkaWUgVHJvY2tudW5nc2RhdGVuIGVpbmVzIFJhdW1lcyBhdXMsIG1pdCBkZW5lbiBkZXIgS3JhZXV0ZXItCisvLyB0cm9ja25lciBkYW5uIGRhcyBLcmF1dCBiZWFyYmVpdGVuIGthbm4uCitpbnQgKlF1ZXJ5RHJ5aW5nRGF0YSgpIHsKKyAgLy8gRXMgbXVzcyBhbGxlcmRpbmdzIGRhcyBhdWZydWZlbmRlIE9iamVrdCBlaW4gVHJvY2tuZXItQ2xvbmUgc2VpbiwgCisgIC8vIGRlciBpbiBlaW5lbSBkZXIgenVnZWxhc3NlbmVuIFJhZXVtZSBzdGVoZW4gbXVzcy4KKyAgLy8gV2VubiBkYXMgbmljaHQgZGVyIEZhbGwgaXN0LCB3aXJkIGRlciBUcm9ja25lciBkYXMgbGVlcmUgQXJyYXksIGRhcyAKKyAgLy8genVydWVja2dlZ2ViZW4gd2lyZCwgYWxzIEluZGl6IHdlcnRlbiwgZGFzcyBlciBpbSBmYWxzY2hlbiBSYXVtIHN0ZWh0LgorICBpZiAoIG9iamVjdHAocHJldmlvdXNfb2JqZWN0KCkpICYmCisgICAgICAgbG9hZF9uYW1lKHByZXZpb3VzX29iamVjdCgpKSA9PSBBTExPV0VEX0RSSUVSICYmCisgICAgICAgbWVtYmVyKGRyeWluZ19kYXRhLCBsb2FkX25hbWUoZW52aXJvbm1lbnQocHJldmlvdXNfb2JqZWN0KCkpKSkgJiYKKyAgICAgICBjbG9uZXAocHJldmlvdXNfb2JqZWN0KCkpICkKKyAgeworICAgIC8vIFJhdW0gZXJtaXR0ZWxuLCBEZWxheS9RdWFsaSBlcnJlY2huZW4sIEVyZ2VibmlzYXJyYXkgenVydWVja2dlYmVuLgorICAgIHN0cmluZyB3aGVyZSA9IGxvYWRfbmFtZShlbnZpcm9ubWVudChwcmV2aW91c19vYmplY3QoKSkpOworICAgIGludCBkZWxheSA9IGRyeWluZ19kYXRhW3doZXJlLERFTEFZX0JBU0VdKworICAgICAgICAgICAgICAgIHJhbmRvbShkcnlpbmdfZGF0YVt3aGVyZSxERUxBWV9STkRdKTsKKyAgICBpbnQgcXVhbCAgPSBkcnlpbmdfZGF0YVt3aGVyZSxRVUFMX0JBU0VdKworICAgICAgICAgICAgICAgIHJhbmRvbShkcnlpbmdfZGF0YVt3aGVyZSxRVUFMX1JORF0pOworICAgIHJldHVybiAoeyBkZWxheSwgcXVhbCB9KTsKKyAgfQorICByZXR1cm4gKHt9KTsKK30KKworLy8gTW9kaWZpemllcmVuIGRlciBUcm9ja251bmdzZGF0ZW4uCisvLyA8cm9vbT4gbXVzcyBkZXIgdm9sbGUgRGF0ZWluYW1lIGRlcyBSYXVtZXMgc2Vpbiwgb2huZSAuYyBhbSBFbmRlLgorLy8gPHZhbHVlcz4gZW50aGFlbHQgZGllIHZpZXIgUGFyYW1ldGVyIHp1IGRlbSBSYXVtIGluIGZvbGdlbmRlciBSZWloZW5mb2xnZToKKy8vICh7IFF1YWxpLUJhc2lzLCBRdWFsaS1adWZhbGxzYW50ZWlsLCBEZWxheS1CYXNpcywgRGVsYXktWnVmYWxsc2FudGVpbCB9KQorLy8gV2VubiA8dmFsdWVzPiBuaWNodCBhbmdlYmVuIHdpcmQgb2RlciAwIGlzdCwgd2VyZGVuIGRpZSBEYXRlbiB6dSA8cm9vbT4KKy8vIGdlbG9lc2NodC4KK2ludHxtYXBwaW5nIFNldERyeWluZ0RhdGEoc3RyaW5nIHJvb20sIGludCogdmFsdWVzKSAKK3sKKyAgLy8ga2VpbmUgWnVncmlmZnNyZWNodGUKKyAgaWYgKCAhYWxsb3dlZCgpICkKKyAgICByZXR1cm4gLTE7CisgIAorICAvLyA8dmFsdWVzPiB3dXJkZSBuaWNodCB1ZWJlcmdlYmVuPyBEYW5uIERhdGVuIGxvZXNjaGVuLgorICBpZiAoICF2YWx1ZXMgKSAKKyAgeworICAgIG1fZGVsZXRlKGRyeWluZ19kYXRhLCByb29tKTsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIC8vIEFuc29uc3RlbiBtdWVzc2VuIDQgSW50ZWdlci1XZXJ0ZSBhbHMgPHZhbHVlcz4gdWViZXJnZWJlbiB3ZXJkZW4uCisgIGlmICggc2l6ZW9mKHZhbHVlcykgIT0gNCApIAorICAgIHJldHVybiAtMjsKKworICBpZiAoIHJvb21bPDIuLjwxXSA9PSAiLmMiICkKKyAgICByb29tID0gcm9vbVsuLjwzXTsKKworICAvLyBVZWJlcmdlYmVuZSBEYXRlbiBhZW5kZXJuIGRpcmVrdCBkYXMgTWFwcGluZyBkZXIgVHJvY2tudW5nc2RhdGVuLgorICBtX2FkZChkcnlpbmdfZGF0YSwgcm9vbSwgdmFsdWVzLi4uKTsKKyAgc2F2ZSgpOworICByZXR1cm4gKFsgcm9vbSA6IGRyeWluZ19kYXRhW3Jvb20sMF07IGRyeWluZ19kYXRhW3Jvb20sMV07IAorICAgICAgICAgICAgICAgICAgIGRyeWluZ19kYXRhW3Jvb20sMl07IGRyeWluZ19kYXRhW3Jvb20sM11dKTsKK30KKwordmFyYXJncyBtYXBwaW5nIFF1ZXJ5RHJ5aW5nKCkKK3sKKyAgcmV0dXJuIChhbGxvd2VkKCkgPyBkcnlpbmdfZGF0YSA6IChbXSkgKTsKK30KKwordmFyYXJncyBpbnQgcmVtb3ZlKGludCBzaWxlbnQpIAoreworICBzYXZlKCk7CisgIHJldHVybiA6OnJlbW92ZShzaWxlbnQpOworfQorCisvKgorI2RlZmluZSBEUllJTkdEQVRBICIvc2VjdXJlL0FSQ0gva3JhZXV0ZXJ0cm9ja251bmdzZGF0ZW4iCisKK3ByaXZhdGUgdm9pZCBSZWFkRHJ5aW5nRGF0YSgpIAoreworICBtaXhlZCBkYXRhID0gZXhwbG9kZShyZWFkX2ZpbGUoRFJZSU5HREFUQSksICJcbiIpLSh7IiJ9KTsKKyAgZm9yZWFjaChzdHJpbmcgbGluZSA6IGRhdGEpIAorICB7CisgICAgaWYgKCBsaW5lWzBdID09ICcjJyApCisgICAgICBjb250aW51ZTsKKyAgICBzdHJpbmcgKmZpZWxkcyA9IGV4cGxvZGUobGluZSwiOyIpOworICAgIGZpZWxkc1sxLi5dID0gbWFwKGZpZWxkc1sxLi5dLCAjJ3RvX2ludCk7CisgICAgbV9hZGQodG1wX2RyeWluZ19kYXRhLCBmaWVsZHMuLi4pOworICB9Cit9Ki8KKwpkaWZmIC0tZ2l0IGEvc2VjdXJlL2xlcG1hc3Rlci5jIGIvc2VjdXJlL2xlcG1hc3Rlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkN2NiNzkKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvbGVwbWFzdGVyLmMKQEAgLTAsMCArMSw0MDggQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBsZXBtYXN0ZXIuYyAtLSBNYXN0ZXIsIHdlbGNoZXIgYXVzIHNjb3JlbWFzdGVyLCBleHBsb3JhdGlvbm1hc3RlciwKKy8vICAgICAgICAgICAgICAgIHF1ZXN0bWFzdGVyIHVuZCBkZW0gU3BpZWxlcm9iamVrdCBJbmZvcm1hdGlvbmVuCisvLyAgICAgICAgICAgICAgICBhdXNsaWVzdCB1bmQgYXVzIGRpZXNlbiBkaWUgTGV2ZWxwdW5rdGUgZGVzIFNwaWVsZXIKKy8vICAgICAgICAgICAgICAgIGJlcmVjaG5ldAorLy8gICAgICAgICAgICAgICAgV2VpdGVycyBkZXJqZW5pZ2UsIGRlciBkaWUgU2VoZXJhbmZvcmRlcnVuZ2VuIAorLy8gICAgICAgICAgICAgICAgcHJ1ZWZ0LiAKKy8vCisvLyAkSWQ6IGxlcG1hc3Rlci5jIDkxNjggMjAxNS0wMy0wNSAwMDowNDoyMlogWmVzc3RyYSAkCisKKy8vIEhpZXIga29tbWVuIEZ1bmt0aW9uZW4gZnVlciBkaWUgTGV2ZWxwdW5rdGUKKyNwcmFnbWEgc3RyaWN0X3R5cGVzCisjcHJhZ21hIG5vX2Nsb25lCisjcHJhZ21hIG5vX3NoYWRvdworI3ByYWdtYSBub19pbmhlcml0CisjcHJhZ21hIHZlcmJvc2VfZXJyb3JzCisjcHJhZ21hIGNvbWJpbmVfc3RyaW5ncworLy8jcHJhZ21hIHBlZGFudGljCisvLyNwcmFnbWEgcmFuZ2VfY2hlY2sKKyNwcmFnbWEgd2Fybl9kZXByZWNhdGVkCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bmV3X3NraWxscy5oPgorI2luY2x1ZGUgPGV4cGxvcmF0aW9uLmg+CisjaW5jbHVkZSA8cXVlc3RtYXN0ZXIuaD4KKyNpbmNsdWRlIDxzY29yZW1hc3Rlci5oPgorI2luY2x1ZGUgPHdpemxldmVscy5oPgorCisjaW5jbHVkZSAibGVwbWFzdGVyLmgiCisKKy8vIERhcyBQcm9ncmFtbSB6dXIgRm9lcmRlcnVuZyBkZXIga2xlaW5lbiBMZXZlbCBha3RpdmllcmVuLiA7LSkKKyNkZWZpbmUgX19QRk9FUktMX18gMQorCisvLyBkaWUgZXJzdGVuIDggTGV2ZWwsIGQuaC4gTGV2ZWwgMSBiaXMgOCBlbnRzcHJlY2hlbiBkaWVzZW4gTEVQcy4KK2ludCAqTE9XX0xFVkVMX0xFUF9MSVNUID0gKHsxMDAsMTIwLDE0MCwxODAsMjIwLDMwMCwzNjAsNDIwfSk7IC8vIDkuIExldmVsOiA1MDAgTEVQCisKKyNkZWZpbmUgUkVRX1RFWFQxICAoWzA6InVuZ2xhdWJsaWNoIHZpZWwiLCBcCisgICAgICAgICAgICAgICAgICAxOiJ1bmdsYXVibGljaCB2aWVsIiwgXAorCQkgIDI6ImVub3JtIHZpZWwiLCBcCisJCSAgMzoic2VociB2aWVsIiwgXAorCQkgIDQ6InZpZWwiLCBcCisJCSAgNToiZWluaWdlcyIsIFwKKwkJICA2OiJldHdhcyIsIFwKKwkJICA3OiJ3ZW5pZyIsIFwKKyAgICAgICAgICAgICAgICAgIDg6InNlaHIgd2VuaWciLCBcCisgICAgICAgICAgICAgICAgICA5OiJrYXVtIGV0d2FzIiBdKQorCisjZGVmaW5lIFJFUV9URVhUMiAgKFswOiJ1bmdsYXVibGljaCB2aWVsZSIsIFwKKyAgICAgICAgICAgICAgICAgIDE6InVuZ2xhdWJsaWNoIHZpZWxlIiwgXAorCQkgIDI6ImVub3JtIHZpZWxlIiwgXAorCQkgIDM6InNlaHIgdmllbGUiLCBcCisJCSAgNDoidmllbGUiLCBcCisJCSAgNToiZWluaWdlIiwgXAorCQkgIDY6ImVpbiBwYWFyIiwgXAorCQkgIDc6IndlbmlnZSIsIFwKKyAgICAgICAgICAgICAgICAgIDg6InNlaHIgd2VuaWdlIiwgXAorICAgICAgICAgICAgICAgICAgOToia2F1bSIgXSkKKworI2RlZmluZSBERUJVRyh4LHkpCisvLyNkZWZpbmUgREVCVUcoeCx5KSBpZiAoZmluZF9wbGF5ZXIoInpvb2siKSkgdGVsbF9vYmplY3QoZmluZF9wbGF5ZXIoInpvb2siKSxzcHJpbnRmKHgseSkpCisKKwordm9pZCBjcmVhdGUoKQoreworICBzZXRldWlkKGdldHVpZCgpKTsKK30KKworaW50IFF1ZXJ5TEVQRm9yUGxheWVyKG9iamVjdCBwbCkKK3sKKyAgaW50IHJldCwgdmFsLCBpLCBsOworCisgIGlmIChleHRlcm5fY2FsbCgpICYmICFJU19BUkNIKGdldGV1aWQocHJldmlvdXNfb2JqZWN0KCkpKSkKKyAgICByZXR1cm4gLTE7CisgIGlmICghcGwgfHwgIXF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUocGwpKQorICAgIHJldHVybiAtMjsKKworICAvLyAgR3J1bmRvZmZzZXQgMTAwLCBkYSBtYW4gbWl0IExldmVsIDEgc3RhdHQgMCBzdGFydGV0CisgIHJldCA9IDEwMDsKKworICAvLyBCZWl0cmFnIEE6IFN0dXBzZSB2b24gTlBDLUVyc3RraWxscworICByZXQgKz0gKGludClTQ09SRU1BU1RFUi0+UXVlcnlLaWxsUG9pbnRzKHBsKTsKKworICBERUJVRygiTmFjaCBLUDogcmV0ID0gJWRcbiIsIHJldCk7CisKKyAgLy8gQmVpdHJhZyBCOiBTdHVwc2Ugdm9uIGdlbG9lc3RlbiBNaW5pcXVlc3RzCisgIHJldCArPSAoaW50KVFNLT5RdWVyeU1pbmlRdWVzdFBvaW50cyhwbCk7CisKKyAgREVCVUcoIk5hY2ggTVFQOiByZXQgPSAlZFxuIiwgcmV0KTsKKworICAvLyBCZWl0cmFnIEM6IFF1ZXN0cHVua3RlCisgIC8vICB3ZXJkZW4gMToxIHVlYmVybm9tbWVuOworICByZXQgKz0gKGludClwbC0+UXVlcnlQcm9wKFBfUVApOworCisgIERFQlVHKCJOYWNoIFFQOiByZXQgPSAlZFxuIiwgcmV0KTsKKworICAvLyBCZWl0cmFnIEQ6IEVyZmFocnVuZ3NwdW5rdGUKKyAgLy8gIFN0dXBzZSA9IFhQcyBeIDAuMzIKKyAgdmFsID0gKGludClwbC0+UXVlcnlQcm9wKFBfWFApOworCisgIGlmICh2YWw8MSkgbD0wOworICBlbHNlIGw9dG9faW50KGV4cChsb2codG9fZmxvYXQodmFsKSkqMC4zMikpOworCisgIHJldCArPSBsOworCisgIERFQlVHKCJOYWNoIFhQOiByZXQgPSAlZFxuIiwgcmV0KTsKKworICAvLyBCZWl0cmFnIEU6IFphdWJlcnRyYWVua2UKKyAgLy8gIEdlZnVuZGVuZSBUcmFlbmtlIGdlYmVuIDUgTEVQCisgIC8vICBEaWUgSGVpbHRyYWVua2UgZ2ViZW4genVzYWV0emxpY2ggMTArMjArMzArNDAgTEVQCisgIGkgPSA4MCAtICh2YWwgPSBzaXplb2YoKGludCAqKXBsLT5RdWVyeVByb3AoUF9QT1RJT05ST09NUykpKTsKKworICByZXQgKz0gNSppICsgKFsgMDogMTAwLCAxOiA2MCwgMjogMzAsIDM6IDEwXSlbdmFsXTsKKworICAvLyBCZWl0cmFnIEY6IEZvcnNjaGVycHVua3RlCisgIC8vICBQcm8gRlAgZ2lidCBlcyA2IFN0dWZlbnB1bmt0ZQorICByZXQgKz0gNiAqIChpbnQpRVBNQVNURVItPlF1ZXJ5RXhwbG9yYXRpb25Qb2ludHMocGwpOworCisgIERFQlVHKCJOYWNoIEZQOiByZXQgPSAlZFxuIiwgcmV0KTsKKworICAvLyBCZWl0cmFnIEc6IEdpbGRlbmVpbnN0dWZ1bmcKKyAgLy8gIE1heGltYWxlIEdpbGRlbmVpbnN0dWZ1bmcgKDEwMDAwKSBlbnRzcHJpY2h0IHZpZXIgTGV2ZWxuCisgIHJldCArPSAoKGludClwbC0+UXVlcnlQcm9wKFBfR1VJTERfUkFUSU5HKSkvMjU7CisKKyAgREVCVUcoIk5hY2ggR1I6IHJldCA9ICVkXG4iLCByZXQpOworCisgIC8vIEF1c2dhYmUgZ2lidCBlcyBudXIgaW4gMjBlci1TY2hyaXR0ZW4KKyAgcmV0IC09IHJldCUyMDsKKworICByZXR1cm4gKHJldCA+IDEwMCkgPyByZXQgOiAxMDA7CisKK30KKworbm9tYXNrIGludCBRdWVyeUxFUCgpCit7CisgIGlmICghcHJldmlvdXNfb2JqZWN0KCkpCisgICAgcmV0dXJuIDA7CisgIHJldHVybiBRdWVyeUxFUEZvclBsYXllcihwcmV2aW91c19vYmplY3QoKSk7Cit9CisKK25vbWFzayBpbnQgUXVlcnlMZXZlbChpbnQgbGVwKSB7CisgIGlmIChsZXA8PTApCisgICAgbGVwPVF1ZXJ5TEVQKCk7CisKKyAgaWYgKGxlcDw9MCkKKyAgICByZXR1cm4gMDsKKworI2lmZGVmIF9fUEZPRVJLTF9fCisgIC8vIG5vcm1hbGUgTGV2ZWwgYWxsZSAxMDAgTEVQCisgIGlmIChsZXAgPj0gNTAwKQorICAgIHJldHVybiBsZXAvMTAwICsgNDsKKyAgZWxzZSB7CisgICAgLy8gbGV2ZWwgbWl0IHdlbmlnZXIgTEVQIGFtIEFuZmFuZyAoMS04KQorICAgIC8vIExldmVsIGF1cyBkZXIgTE9XX0xFVkVMX0xFUF9MSVNUIHJhdXNzdWNoZW4uCisgICAgaW50IGxldiA9IHNpemVvZihMT1dfTEVWRUxfTEVQX0xJU1QpIC0gMTsKKyAgICBmb3IgKCA7IGxldiA+PSAwOyAtLWxldikgeworICAgICAgaWYgKExPV19MRVZFTF9MRVBfTElTVFtsZXZdIDw9IGxlcCkKKyAgICAgICAgYnJlYWs7ICAvLyBnZWZ1bmRlbgorICAgIH0KKyAgICByZXR1cm4gbGV2KzE7CisgIH0KKyNlbHNlCisgIHJldHVybiBsZXAvMTAwOworI2VuZGlmIC8vIF9fUEZPRVJLTF9fCisgIHJldHVybiAwOworfQorCisvLyBXaWV2aWVsZSBMRVAgZmVobGVuIHp1bSBuYWVjaHN0ZW4gTGV2ZWw/Citub21hc2sgaW50IFF1ZXJ5TmV4dExldmVsTEVQKGludCBsdmwsIGludCBsZXApIHsKKyAgaW50IG5lZWRlZDsKKworICBpZiAoUXVlcnlMZXZlbChsZXApID4gbHZsKQorICAgIHJldHVybiAwOworCisjaWZkZWYgX19QRk9FUktMX18KKyAgaWYgKGx2bCA8IHNpemVvZihMT1dfTEVWRUxfTEVQX0xJU1QpKQorICAgIG5lZWRlZCA9IExPV19MRVZFTF9MRVBfTElTVFtsdmxdOworICBlbHNlCisgICAgbmVlZGVkID0gKGx2bC0zKSAqIDEwMDsgLy8gKGx2bCArIDEgLSA0KSAqIDEwMAorI2Vsc2UKKyAgbmVlZGVkID0gKGx2bCsxKSAqIDEwMDsKKyNlbmRpZiAvLyBfX1BGT0VSS0xfXworCisgIC8vIG5lZWRlZCBzaW5kIGpldHp0IGRpZSBpbnNnZXNhbXQgYmVub2V0aWd0ZW4gTEVQLiBWb3JoYW5kZW5lIGFiemllaGVuLgorICBuZWVkZWQgLT0gbGVwOworICAvLyBuaXggPCAwIHp1cnVlY2tsaWVmZXJuCisgIHJldHVybiBtYXgobmVlZGVkLDApOworfQorCitzdHJpbmcgUXVlcnlGb3JzY2h1bmcoKQoreworICBpbnQgbWF4LCBteSwgYXZnOworICBzdHJpbmcgcmV0OworCisgIGlmICgobXk9KGludClFUE1BU1RFUi0+UXVlcnlFeHBsb3JhdGlvblBvaW50cyhnZXR1aWQocHJldmlvdXNfb2JqZWN0KCkpKSkgPCBNSU5fRVApCisgICAgcmV0dXJuICJEdSBrZW5uc3QgRGljaCBpbSAiTVVETkFNRSIgc28gZ3V0IHdpZSBnYXIgbmljaHQgYXVzLlxuIjsKKworICBteSAqPSAxMDA7CisgIG1heCA9IG15LyhpbnQpRVBNQVNURVItPlF1ZXJ5TWF4RVAoKTsKKyAgYXZnID0gbXkvKGludClFUE1BU1RFUi0+UXVlcnlBdmVyYWdlKCk7CisKKyAgcmV0ID0gIlZlcmdsaWNoZW4gbWl0IERlaW5lbiBNaXRzcGllbGVybiwga2VubnN0IER1IERpY2ggaW0gIk1VRE5BTUUiICI7CisgIHN3aXRjaChhdmcpIHsKKyAgY2FzZSAwLi4xMDoKKyAgICByZXQgKz0gImthdW0iOworICAgIGJyZWFrOworICBjYXNlIDExLi40MDoKKyAgICByZXQgKz0gImFldXNzZXJzdCBzY2hsZWNodCI7CisgICAgYnJlYWs7CisgIGNhc2UgNDEuLjU2OgorICAgIHJldCArPSAic2VociBzY2hsZWNodCI7CisgICAgYnJlYWs7CisgIGNhc2UgNTcuLjcyOgorICAgIHJldCArPSAic2NobGVjaHQiOworICAgIGJyZWFrOworICBjYXNlIDczLi45MzoKKyAgICByZXQgKz0gInVudGVyZHVyY2hzY2huaXR0bGljaCI7CisgICAgYnJlYWs7CisgIGNhc2UgOTQuLjEwOToKKyAgICByZXQgKz0gImR1cmNoc2Nobml0dGxpY2ggZ3V0IjsKKyAgICBicmVhazsKKyAgY2FzZSAxMTAuLjEyNToKKyAgICByZXQgKz0gImJlc3NlciBhbHMgZGVyIER1cmNoc2Nobml0dCI7CisgICAgYnJlYWs7CisgIGNhc2UgMTI2Li4xNDU6CisgICAgcmV0ICs9ICJyZWNodCBndXQiOworICAgIGJyZWFrOworICBjYXNlIDE0Ni4uMTcwOgorICAgIHJldCArPSAiemllbWxpY2ggZ3V0IjsKKyAgICBicmVhazsKKyAgY2FzZSAxNzEuLjIxMDoKKyAgICByZXQgKz0gImd1dCI7CisgICAgYnJlYWs7CisgIGNhc2UgMjExLi4zMDA6CisgICAgcmV0ICs9ICJzZWhyIGd1dCI7CisgICAgYnJlYWs7CisgIGNhc2UgMzAxLi40MDA6CisgICAgcmV0ICs9ICJhdXNzZXJvcmRlbnRsaWNoIGd1dCI7CisgICAgYnJlYWs7CisgIGNhc2UgNDAxLi41MDA6CisgICAgcmV0ICs9ICJ1bmhlaW1saWNoIGd1dCI7CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgcmV0ICs9ICJlaW5mYWNoIGhlcnZvcnJhZ2VuZCI7CisgICAgYnJlYWs7CisgIH0KKyAgcmV0ICs9ICIgYXVzLlxuQWJzb2x1dCBnZXNlaGVuICI7CisKKyAgc3dpdGNoKG1heCkgeworICBjYXNlIDAuLjU6CisgICAgcmV0ICs9ICJrZW5uc3QgRHUgbnVyIHdlbmlnIHZvbSAiTVVETkFNRSIuIjsKKyAgICBicmVhazsKKyAgY2FzZSA2Li4xMDoKKyAgICByZXQgKz0gInNvbGx0ZXN0IER1IERpY2ggdmllbGxlaWNodCBub2NoIGdlbmF1ZXIgdW1zZWhlbi4iOworICAgIGJyZWFrOworICBjYXNlIDExLi4xNzoKKyAgICByZXQgKz0gImJpc3QgRHUgZHVyY2hhdXMgc2Nob24gaGVydW1nZWtvbW1lbi4iOworICAgIGJyZWFrOworICBjYXNlIDE4Li4yNToKKyAgICByZXQgKz0gImhhc3QgRHUgc2Nob24gZWluaWdlcyBnZXNlaGVuLiI7CisgICAgYnJlYWs7CisgIGNhc2UgMjYuLjM1OgorICAgIHJldCArPSAiYmlzdCBEdSBzY2hvbiB3ZWl0IGhlcnVtZ2Vrb21tZW4uIjsKKyAgICBicmVhazsKKyAgY2FzZSAzNi4uNTA6CisgICAgcmV0ICs9ICJrb2VubnRlc3QgRHUgZWlnZW50bGljaCBlaW5lbiBSZWlzZWZ1ZWhyZXIgaGVyYXVzYnJpbmdlbi4iOworICAgIGJyZWFrOworICBjYXNlIDUxLi43NToKKyAgICByZXQgKz0gImhhc3QgRHUgc2Nob24gc2VociB2aWVsIGdlc2VoZW4uIjsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICByZXQgKz0gImJlc2l0enQgRHUgZWluZSBoZXJ2b3JyYWdlbmRlIE9ydHNrZW5udG5pcy4iOworICB9CisgIHJldHVybiBicmVha19zdHJpbmcocmV0LCA3OCwgMCwgMSk7Cit9CisKKworbm9tYXNrIG1peGVkIFF1ZXJ5V2l6YXJkUmVxdWlyZW1lbnRzKG9iamVjdCBwbGF5ZXIpCit7CisgIC8vIERpZXNlIEZ1bmt0aW9uIGdpYnQgZWluIDItZWxlbWVudGlnZXMgQXJyYXkgenVydWVjaywgaW4gZGVtIGltIGVyc3RlbgorICAvLyBFbGVtZW50IHN0ZWh0LCBvYiBkZXIgU3BpZWxlciBTZWhlciB3ZXJkZW4ga2FubiAoMSkgb2RlcgorICAvLyBuaWNodCAoMCkgdW5kIGltIHp3ZWl0ZW4gRWxlbWVudCBzdGVodCwgd2FzIGdlbmF1IGlobSBub2NoIAorICAvLyBmZWhsdC4gCisgIC8vIEZlaGxlcmNvZGUgaXN0ICh7LTEsICIifSkKKworICAvLyBEaWUgVW1yZWNobnVuZ3NmYWt0b3JlbiB3dXJkZW4gZWluZmFjaCBhdXMgUXVlcnlMRVAgdWViZXJub21tZW47IGdnZi4KKyAgLy8ga2FubiBtYW4gZGFzIGVpbm1hbCBpbiBVbnRlcmZ1bmt0aW9uZW4gYXVzbGFnZXJuLiAKKworICBtaXhlZCByZXQ7CisgIHN0cmluZyBzOyAKKyAgaW50IGkseix2YWw7IAorCisgIHJldCA9ICh7LTEsICJIaWVyIGlzdCBldHdhcyBzY2hpZWYgZ2VsYXVmZW4uIEJpdHRlIGVpbmVuIEVyem1hZ2llclxuIgorCSAgICArImJlbmFjaHJpY2h0aWdlbi5cbiJ9KTsKKyAgcyA9ICIiOworICBpID0gMDsgCisKKyAgaWYoIXBsYXllciB8fCAhb2JqZWN0cChwbGF5ZXIpKQorICAgIHBsYXllcj0odGhpc19wbGF5ZXIoKT90aGlzX3BsYXllcigpOnRoaXNfaW50ZXJhY3RpdmUoKSk7CisKKyAgaWYoIXBsYXllcikKKyAgICByZXR1cm4gKHstMSwiIn0pOworCisgIERFQlVHKCJFcyBnZWh0IHVtOiAlT1xuIiwgcGxheWVyKTsKKworICAvLyBBYmVudGV1ZXJwdW5rdGUKKyAgREVCVUcoIkFiZW50ZXVlcnB1bmt0ZTogJWQgKCIrUkVRX1FQKyIpXG4iLCBwbGF5ZXItPlF1ZXJ5UHJvcChQX1FQKSk7CisgIGlmIChwbGF5ZXItPlF1ZXJ5UHJvcChQX1FQKSA8IFJFUV9RUCkgeworICAgIHMgKz0gc3ByaW50ZigiICogRGlyIGZlaGxlbiBub2NoIG1pbmRlc3RlbnMgJWQgQWJlbnRldWVycHVua3RlLlxuIiwgCisJCSBSRVFfUVAgLSAoaW50KXBsYXllci0+UXVlcnlQcm9wKFBfUVApKTsKKyAgICBpLS07CisgIH0KKworICAvLyBGb3JzY2hlcnB1bmt0ZQorICB6ID0gNiAqIChpbnQpRVBNQVNURVItPlF1ZXJ5RXhwbG9yYXRpb25Qb2ludHMocGxheWVyKTsKKyAgREVCVUcoIkZvcnNjaGVycHVua3RlOiAlZCAoIitSRVFfRVArIilcbiIsIHopOworICBpZiAoeiA8IFJFUV9FUCkgeworICAgIHMgKz0gc3ByaW50ZigiICogRHUga2VubnN0IERpY2ggaW0gIk1VRE5BTUUiIG5vY2ggbmljaHQgZ2VudWcgYXVzLCAiCisJCSArImdlbmF1IGdlbm9tbWVuXG4gICBtdXNzdCBEdSBEaXIgbm9jaCAlcyBhbnNlaGVuLlxuIiwgCisJCSBSRVFfVEVYVDFbKHoqMTAvUkVRX0VQKV0gKTsKKyAgICBpLS07CisgIH0KKworICAvLyBaYXViZXJ0cmFlbmtlCisgIHogPSA4MCAtICh2YWwgPSBzaXplb2YoKGludCopcGxheWVyLT5RdWVyeVByb3AoUF9QT1RJT05ST09NUykpKTsKKyAgeiA9IHoqNSArIChbMDoxMDAsIDE6NjAsIDI6MzAsIDM6MTBdKVt2YWxdOworICBERUJVRygiWmF1YmVydHJhZW5rZTogJWQgKCIrUkVRX1ArIilcbiIsIHopOworICBpZiAoeiA8IFJFUV9QKSB7CisgICAgcyArPSBzcHJpbnRmKCIgKiBEdSBtdXNzdCBub2NoIGVpbmlnZSBaYXViZXJ0cmFlbmtlIChjYS4gJWQpIHN1Y2hlbi5cbiIsCisJCSAoUkVRX1AgLSB6KS81ICk7CisgICAgaS0tOworICB9CisKKyAgLy8gRXJzdGtpbGxzCisgIHogPSAoaW50KVNDT1JFTUFTVEVSLT5RdWVyeUtpbGxQb2ludHMocGxheWVyKTsKKyAgREVCVUcoIkVyc3RraWxsczogJWQgKCIrUkVRX0srIilcbiIsIHopOworICBpZiAoeiA8IFJFUV9LKSB7CisgICAgICAgIHMgKz0gc3ByaW50ZigiICogRHUgaGFzdCBub2NoIG5pY2h0IGdlbnVlZ2VuZCB3dWVyZGlnZSBHZWduZXIgZXJsZWd0LCBnZW5hdSAiCisgICAgCSArImdlbm9tbWVuXG4gICBtdXNzdCBEdSBub2NoICVzIHd1ZXJkaWdlIE1vbnN0ZXIgdG9ldGVuLlxuIiwKKyAgICAJIFJFUV9URVhUMlsoeioxMC9SRVFfSyldICk7OworICAgIGktLTsKKyAgfQorCisgIGludCBtaW5sZXZlbCA9IFF1ZXJ5TGV2ZWwoUkVRX0xFUCk7CisKKyAgLy8gUmVzdGxpY2hlIFN0dWZlbnB1bmt0ZSAKKyAgREVCVUcoIlN0dWZlbnB1bmt0ZTogJWQgKCIrUkVRX0xFUCsiKVxuIiwgcGxheWVyLT5RdWVyeVByb3AoUF9MRVApKTsKKyAgaWYgKChpbnQpKHBsYXllci0+UXVlcnlQcm9wKFBfTEVQKSkgPCBSRVFfTEVQKSB7CisgICAgcyArPSBzcHJpbnRmKCIgKiBEdSBtdXNzdCBtaW5kZXN0ZW5zICVkIFN0dWZlbnB1bmt0ZSwgZW50c3ByaWNodCBTdHVmZSAlZCwgIgorICAgICAgICAiZXJyZWljaGVuLlxuIiwgUkVRX0xFUCwgbWlubGV2ZWwpOworICAgIGktLTsKKyAgfQorICAKKyAgLy8gRGVtbmFjaCBtaW5kZXN0ZW5zIFJFUS8xMDAtTGV2ZWwgCisgIERFQlVHKCJMZXZlbDogJWQgKCIrUkVRX0xFUC8xMDArIilcbiIsIHBsYXllci0+UXVlcnlQcm9wKFBfTEVWRUwpKTsKKyAgaWYgKChpbnQpcGxheWVyLT5RdWVyeVByb3AoUF9MRVZFTCkgPCBtaW5sZXZlbCkgeworICAgIHMgKz0gc3ByaW50ZigiICogRHUgbXVzc3QgbWluZGVzdGVucyBTdHVmZSAlZCBlcnJlaWNoZW4uXG4iLCBtaW5sZXZlbCk7CisgICAgaS0tOworICB9CisgIAorICBpZihpPDApIHsKKyAgICByZXQgPSAoey0xLCAKKwkgc3ByaW50ZigiRHUgaGFzdCBub2NoIG5pY2h0IGFsbGUgU2VoZXItQW5mb3JkZXJ1bmdlbiBlcmZ1ZWxsdC5cbiIKKwkJKyJJbSBlaW56ZWxuZW4gZmVobHQgRGlyIGZvbGdlbmRlczpcblxuJXNcbiIKKwkJICticmVha19zdHJpbmcoIkZhbGxzIER1IERpciBudW4gZGVubm9jaCB1bnNpY2hlciBiaXN0LCAiCisgICsid2VsY2hlIEFuZm9yZGVydW5nZW4gRHUgZXJmdWVsbGVuIG11c3N0LCBkYW5uICIKKyAgKyJzY2hhdWUgYmVpICdoaWxmZSBzZWhlcicgdW5kICdoaWxmZSBzdHVmZW5wdW5rdGUnIGRvY2ggZWluZmFjaCBub2NoICIKKyAgKyJlaW5tYWwgbmFjaC4gU2luZCBkYW5uICIKKyAgKyJpbW1lciBub2NoIERpbmdlIG9mZmVuIG9kZXIgdW5rbGFyLCBzbyBzcHJpY2ggZWluZmFjaCBlaW5lbiAiCisJCQkJICArImRlciBFcnptYWdpZXIgYW4uIiwgNzgsMCwxKSxzKSB9KTsKKyAgfSAKKyAgICAKKyAgaWYgKGk9PTApIHsKKyAgICByZXQgPSAoezEsIGJyZWFrX3N0cmluZygKKwkgICAgICAgIkR1IGhhc3QgYWxsZSBTZWhlci1BbmZvcmRlcnVuZ2VuIGVyZnVlbGx0LiBXZW5kZSBEaWNoIGRvY2ggIgorCSAgICAgICArImVpbm1hbCBhbiBNZXJsaW4gdW5kIGZyYWdlIGlobiwgb2IgZXIgRGljaCBiZWZvZXJkZXJ0LiIsIAorCSAgICAgICA3OCwwLDEpIH0pOworICB9CisKKyAgcmV0dXJuIHJldDsgCit9CisKK25vbWFzayBpbnQgUXVlcnlSZWFkeUZvcldpeihvYmplY3QgcGxheWVyKQoreworICBtaXhlZCByOworICAKKyAgciA9IFF1ZXJ5V2l6YXJkUmVxdWlyZW1lbnRzKHBsYXllcik7CisgIAorICBpZiAoIXBvaW50ZXJwKHIpICYmIHNpemVvZihyKSE9MiAmJiAhaW50cChyWzBdKSkKKyAgICByZXR1cm4gLTE7CisKKyAgcmV0dXJuIHJbMF07Cit9CisKK25vbWFzayBzdHJpbmcgUXVlcnlSZWFkeUZvcldpelRleHQob2JqZWN0IHBsYXllcikKK3sKKyAgbWl4ZWQgcjsKKworICByID0gUXVlcnlXaXphcmRSZXF1aXJlbWVudHMocGxheWVyKTsKKworICBpZiAoIXBvaW50ZXJwKHIpICYmIHNpemVvZihyKSE9MiAmJiAhc3RyaW5ncChyWzFdKSkKKyAgICByZXR1cm4gIkhpZXIgaXN0IGV0d2FzIHNjaGllZiBnZWdhbmdlbiwgYml0dGUgdmVyc3RhZW5kaWdlIGVpbmVuICIKKyAgICAgICsiRXJ6bWFnaWVyLiI7CisKKyAgcmV0dXJuIHJbMV07Cit9CisKZGlmZiAtLWdpdCBhL3NlY3VyZS9sZXBtYXN0ZXIuaCBiL3NlY3VyZS9sZXBtYXN0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWU3MjQ3Ci0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL2xlcG1hc3Rlci5oCkBAIC0wLDAgKzEsMjIgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBsZXBtYXN0ZXIuaCAtLSBEZWZpbml0aW9uZW4gZnVlciBkZW4gbGVwbWFzdGVyCisvLworLy8gJElkOiBsZXBtYXN0ZXIuaCx2IDEuMyAyMDA2LzAyLzIyIDA4OjU3OjQ4IFpvb2sgRXhwICQKKworI2lmbmRlZiBfX0xFUE1BU1RFUl9IX18KKyNkZWZpbmUgX19MRVBNQVNURVJfSF9fCisKKy8qIERhdGVpbmFtZW4gKi8KKworLy8gdG8gY2hhbmdlOgorI2RlZmluZSBMRVBNQVNURVIgICAiL3NlY3VyZS9sZXBtYXN0ZXIiCisKKy8vIEFuZm9yZGVydW5nZW46IAorI2RlZmluZSBSRVFfUVAgIDE2MTAgICAgIC8vIFN0dXBzZSBhdXMgUXVlc3RzCisjZGVmaW5lIFJFUV9FUCAgIDYwMCAgICAgLy8gU3R1cHNlIGF1cyBGb3JzY2hlcnB1bmt0ZW4KKyNkZWZpbmUgUkVRX1AgICAgMjAwICAgICAvLyBTdHVwc2UgYXVzIFphdWJlcnRyYWVua2VuCisjZGVmaW5lIFJFUV9LICAgIDE1MCAgICAgLy8gU3R1cHNlIGF1cyBFcnN0a2lsbHMKKyNkZWZpbmUgUkVRX0xFUCAzODAwICAgICAvLyBNaW5kZXN0ZW5zIDM4MDAgU3R1cHNlIHVuZCBMdmwuIDM4CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VjdXJlL2xvZ2luLmMgYi9zZWN1cmUvbG9naW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTE0NjQ2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL2xvZ2luLmMKQEAgLTAsMCArMSwxMTM4IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gbG9naW4uYyAtLSBPYmplY3QgZm9yIHBsYXllcnMganVzdCBsb2dnaW5nIGluCisvLworLy8gJElkOiBsb2dpbi5jIDkyNDUgMjAxNS0wNi0wNCAxMzowNDozOVogQXJhdGhvcm4gJAorCisgLyoKKyAqIHNlY3VyZS9sb2dpbi5jCisgKgorICogVGhpcyBvYmplY3QgaXMgY2xvbmVkIGZvciBldmVyeSB1c2VyIHRyeWluZyB0byBsb2cgaW4KKyAqIFdlIGFyZSBzdGlsbCBydW5uaW5nIHJvb3QuCisgKgorICogbG9naW4uYyBsb29rcyB1cCB0aGUgdXNlcm5hbWUgaW4gdGhlIHNlY3VyZS9QQVNTV0QgZmlsZS4gSWYgaXQgaXMKKyAqIGZvdW5kLCB0aGUgcGFzc3dvcmQgaXMgY2hlY2tlZC4gSWYgdGhlIHVzZXIgaXMgYWxyZWFkeSBsb2dnZWQgaW4sCisgKiBoZSB3aWxsIGJlIHJlY29ubmVjdGVkIHRvIHRoZSBydW5uaW5nIG9iamVjdC4gSWYgdGhlIG90aGVyIG9iamVjdAorICogaXMgc3RpbGwgaW50ZXJhY3RpdmUsIHRoYXQgd2lsbCBiZSBkaXNjb25uZWN0ZWQgYmVmb3JlIHRoZSB1c2VyIGlzCisgKiByZWNvbm5lY3RlZCB0byB0aGF0IG9iamVjdC4KKyAqCisgKiBJZiB0aGUgdXNlciBpcyBub3QgaW4gUEFTU1dELCBhIG5ldyBlbnRyeSB3aXRoIGxldmVsIDAgaXMgY3JlYXRlZC4KKyAqIEFsbCBQQVNTV0Qgd3JpdGluZyBpcyBkb25lIGluIHNlY3VyZS9tYXN0ZXIuYy4KKyAqCisgKi8KKyNwcmFnbWEgc3RyaWN0X3R5cGVzCisjcHJhZ21hIG5vX3NoYWRvdworI3ByYWdtYSBub19pbmhlcml0CisjcHJhZ21hIHZlcmJvc2VfZXJyb3JzCisjcHJhZ21hIGNvbWJpbmVfc3RyaW5ncworLy8jcHJhZ21hIHBlZGFudGljCisvLyNwcmFnbWEgcmFuZ2VfY2hlY2sKKyNwcmFnbWEgd2Fybl9kZXByZWNhdGVkCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bW92aW5nLmg+CisjaW5jbHVkZSAiL3NlY3VyZS93aXpsZXZlbHMuaCIKKyNpbmNsdWRlIDx0ZWxuZXQuaD4KKyNpbmNsdWRlIDxkZWZpbmVzLmg+CisjaW5jbHVkZSA8aW5wdXRfdG8uaD4KKworaW5oZXJpdCAiL3NlY3VyZS9taW5pX3Byb3BzLmMiOworaW5oZXJpdCAiL3NlY3VyZS90ZWxuZXRuZWcuYyI7CisKKyNkZWZpbmUgU1NMX0dSUkVUSU5HICJSRU1PVEVfSE9TVD0iCisjZGVmaW5lIFBST1hJRVMgKHsiMTI3LjAuMC4xIiwiODcuNzkuMjQuNjAifSkKKyNkZWZpbmUgR1VFU1RNQVNURVIgIi9zZWN1cmUvZ3Vlc3RtYXN0ZXIiCisKKyNpZm5kZWYgREVCVUcKKyNkZWZpbmUgREVCVUcoeCkgaWYoZmluZF9wbGF5ZXIoInRpYW1hayIpKSB0ZWxsX29iamVjdChmaW5kX3BsYXllcigidGlhbWFrIikseCkKKyNkZWZpbmUgREVCVUdNKHgpIGlmKGZpbmRfcGxheWVyKCJtdWFkaWIiKSkgdGVsbF9vYmplY3QoZmluZF9wbGF5ZXIoIm11YWRpYiIpLHgpCisjZW5kaWYKKworLyogVmFyaWFibGVzIG9mIHRoZSBzZWN1cmUgc2F2ZSBmaWxlICovCitpbnQgbGV2ZWwsIGxvZ2luZmFpbHMsIGNyZWF0aW9uX2RhdGU7CitzdHJpbmcgcGFzc3dvcmQsIG5hbWUsIHNoZWxsLCBlcCwgZWssIG1xOworc3RyaW5nIGVrdGlwczsKK3N0cmluZyBmcHRpcHM7CitzdHJpbmcgKmRvbWFpbnMsICpndWlsZHMsICp1aWRzdG90YWtlY2FyZTsKKworc3RhdGljIGludCBpbnZpcywgbmV1Oworc3RhdGljIHN0cmluZyBsb2dpbm5hbWU7CitzdGF0aWMgc3RyaW5nIGNhcF9uYW1lOworc3RhdGljIHN0cmluZyAqdXNlcmVudHJ5Oworc3RhdGljIHN0cmluZyBiYW5pc2g7CitzdGF0aWMgbWl4ZWQgKnJhY2VzOworc3RhdGljIGludCBuZXdiaWU7CitzdGF0aWMgc3RyaW5nIHJlYWxpcDsKKworLy8gUHJvdG90eXBlcworc3RhdGljIHZvaWQgU2VuZFRlbG9wdHMoKTsKK3B1YmxpYyBub21hc2sgc3RyaW5nIGxvZ2lubmFtZSgpOworLy8gdGhlIGZvbGxvd2luZyA0IGxmdW5zIGRlYWwgd2l0aCByZWFsIGxvZ2lucworcHVibGljIG5vbWFzayBpbnQgbG9nb24oKTsKK3N0YXRpYyBpbnQgbG9nb24yKCBzdHJpbmcgc3RyICk7CitzdGF0aWMgaW50IGxvYWRfcGxheWVyX29iamVjdCggaW50IGd1ZXN0ZmxhZyApOworc3RhdGljIHZvaWQgbG9hZF9wbGF5ZXJfb2JfMiggc3RyaW5nIG9ibmFtZSwgaW50IGd1ZXN0ZmxhZyApOworc3RhdGljIGludCBjaGVja19pbGxlZ2FsKCBzdHJpbmcgc3RyICk7CitzdGF0aWMgaW50IHZhbGlkX25hbWUoIHN0cmluZyBzdHIgKTsKK3N0YXRpYyBpbnQgbmV3X3Bhc3N3b3JkKCBzdHJpbmcgc3RyICk7CitzdGF0aWMgaW50IGFnYWluX3Bhc3N3b3JkKCBzdHJpbmcgc3RyICk7CitzdGF0aWMgaW50IGNoZWNrX3Bhc3N3b3JkKCBzdHJpbmcgc3RyICk7CitzdGF0aWMgdm9pZCBzZWxlY3RfcmFjZSgpOworc3RhdGljIHZvaWQgYXNrX3JhY2VfcXVlc3Rpb24oKTsKK3N0YXRpYyB2b2lkIGdldF9yYWNlX2Fuc3dlciggc3RyaW5nIHN0ciApOworCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKTsKK3B1YmxpYyBzdHJpbmcgc2hvcnQoKTsKK3B1YmxpYyBzdHJpbmcgcXVlcnlfcmVhbF9uYW1lKCk7CitwdWJsaWMgbm9tYXNrIGludCBxdWVyeV9wcmV2ZW50X3NoYWRvdygpOworc3RhdGljIHZvaWQgdGltZV9vdXQoKTsKK3B1YmxpYyBpbnQgcmVtb3ZlKCk7CisvLyB0aGUgZm9sbG93aW5nIDMgbGZ1bnMgZGVhbCB3aXRoIGR1bW15IHBsYXllciBjcmVhdGlvbgorcHVibGljIG1peGVkIG5ld19sb2dvbiggc3RyaW5nIHN0cik7CitzdGF0aWMgbWl4ZWQgbmV3X2xvYWRfcGxheWVyX29iamVjdCgpOworc3RhdGljIG1peGVkIG5ld19sb2FkX3BsYXllcl9vYl8yKCBzdHJpbmcgb2JuYW1lICk7CitzdGF0aWMgdm9pZCBhc2tfbXVkX3BsYXllZF9xdWVzdGlvbigpOworc3RhdGljIHZvaWQgZ2V0X211ZF9wbGF5ZWRfYW5zd2VyKHN0cmluZyBzdHIpOworCisKK3B1YmxpYyBub21hc2sgc3RyaW5nIGxvZ2lubmFtZSgpCit7CisgICAgcmV0dXJuIGxvZ2lubmFtZSA/IGxvZ2lubmFtZSA6ICIiOworfQorCisKK3B1YmxpYyBpbnQgcmVtb3ZlKCkKK3sKKyAgICBkZXN0cnVjdCggdGhpc19vYmplY3QoKSApOworICAgIHJldHVybiAxOworfQorCisKK3N0YXRpYyBpbnQgY2hlY2tfdG9vX21hbnlfbG9nb25zKCkKK3sKKyAgICBvYmplY3QgKnU7CisgICAgc3RyaW5nIGlwOworCisgICAgaXAgPSBxdWVyeV9pcF9udW1iZXIodGhpc19vYmplY3QoKSk7CisgICAgLy8gdXNlcnMoKSBuZWhtZW4sIGZhbGxzIG5pY2h0LWludGVyYWt0aXZlIENsb25lcyB2b24gbG9naW4uYyBleGlzdGllcmVuLgorICAgIHUgPSBmaWx0ZXIoIHVzZXJzKCksIGZ1bmN0aW9uIHN0YXR1cyAob2JqZWN0IG9iLCBzdHJpbmcgYWRkcikgeworICAgICAgICByZXR1cm4gb2JqZWN0X25hbWUob2IpID09ICIvc2VjdXJlL2xvZ2luIgorICAgICAgICAgICAgICAgJiYgcXVlcnlfaXBfbnVtYmVyKG9iKSA9PSBhZGRyOworICAgIH0sIGlwICk7CisKKyAgICBpZiAoIHNpemVvZih1KSA+IDUgKXsKKyAgICAgICAgd3JpdGUoICJcbkVzIGxhdWZlbiBzY2hvbiB6dSB2aWVsZSBBbm1lbGR1bmdlbiB2b24gRGVpbmVyIEFkcmVzc2UgIgorICAgICAgICAgICAgICAgImF1cy5cblByb2JpZXIgZXMgYml0dGUgaW4gZWluIGJpcyB6d2VpIE1pbnV0ZW4gbm9jaCAiCisgICAgICAgICAgICAgICAiZWlubWFsLlxuIiApOworCisgICAgICAgIGxvZ19maWxlKCAiTE9HSU5fREVOWSIsIHNwcmludGYoICIlczogPjUgTG9nb25zIHZvbiAlLTE1cyAoJXMpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdGltZSh0aW1lKCkpWzQuLjE1XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlfaXBfbnVtYmVyKHRoaXNfb2JqZWN0KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeV9pcF9uYW1lKHRoaXNfb2JqZWN0KCkpICkgKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIFRoaXMgaXMgdGhlIGZ1bmN0aW9uIHRoYXQgZ2V0cyBjYWxsZWQgYnkgL3NlY3VyZS9tYXN0ZXIgZm9yIGV2ZXJ5IHVzZXIKKyAqLworcHVibGljIG5vbWFzayBpbnQgbG9nb24oKQoreworICAgIGxvZ2lubmFtZSA9ICJsb2dvbiI7CisgICAgbmV3YmllPTA7CisgICAgcmVhbGlwPSIiOworCisgICAgLy8gYWxzIGVyc3RlcyB3aXJkIGVpbiBMb29rdXAgZ2VtYWNodCwgb2IgZGllIFF1ZWxsYWRyZXNzZSBlaW4KKyAgICAvLyBUb3ItRXhpdG5vZGUgaXN0LCBkZXIgZXJsYXVidCwgenUgdW5zIHp1IGtvbW11bml6aWVyZW4uIERhcyBMb29rdXAgaXN0CisgICAgLy8gYXN5bmNocm9uIHVuZCBicmF1Y2h0IGVpbmUgV2VpbGUsIHdlbm4gZGFzIEVyZ2VibmlzIG5vY2ggbmljaHQgZ2VjYWNodAorICAgIC8vIGlzdC4gQW4gZGllc2VyIFN0ZWxsZSB3aXJkIGRhcyBFcmdlYm5pcyBuaWNodCBhdXNnZXdlcnRldC4gQWNoamEsIHdpZQorICAgIC8vIG1hY2hlbiBkYXMgbmF0dWVybGljaCBuaWNodCBmdWVyIGRpZSBJUCB2b20gTXVkcmVjaG5lci4uLgorICAgIGlmIChxdWVyeV9pcF9udW1iZXIodGhpc19vYmplY3QoKSkgIT0gIjg3Ljc5LjI0LjYwIikKKyAgICB7CisgICAgICAiL3AvZGFlbW9uL2Ruc2xvb2t1cCItPmNoZWNrX3RvcihxdWVyeV9pcF9udW1iZXIodGhpc19vYmplY3QoKSkscXVlcnlfbXVkX3BvcnQoKSk7CisgICAgICAiL3AvZGFlbW9uL2Ruc2xvb2t1cCItPmNoZWNrX2Ruc2JsKHF1ZXJ5X2lwX251bWJlcih0aGlzX29iamVjdCgpKSk7CisgICAgfQorICAgIHByaW50ZigiSFRUUC8xLjAgMzAyIEZvdW5kXG4iCisgICAgICAgICAiTG9jYXRpb246IGh0dHA6Ly9tZy5tdWQuZGUvXG5cbiIKKyAgICAgICAgICJOZXRDb2xvZ25lLCBLb2VsbiwgR2VybWFueS4gTG9jYWwgdGltZTogJXNcblxuIgorICAgICAgICAgTVVETkFNRSIgTERtdWQsIE5BVElWRSBtb2RlLCBkcml2ZXIgdmVyc2lvbiAlc1xuXG4iLAorICAgICAgICAgc3RyZnRpbWUoIiVjIiksIF9fVkVSU0lPTl9fKTsKKworICAgIFNlbmRUZWxvcHRzKCk7CisKKyAgICBpZiAoIGNoZWNrX3Rvb19tYW55X2xvZ29ucygpICl7CisgICAgICAgIGRlc3RydWN0KHRoaXNfb2JqZWN0KCkpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvLyBpc3QgZGllIFZlcmJpbmR1bmcgc2Nob24gd2llZGVyIHdlZz8KKyAgICBpZiAob2JqZWN0cCh0aGlzX29iamVjdCgpKSAmJiBpbnRlcmFjdGl2ZSh0aGlzX29iamVjdCgpKSkgeworICAgICAgY2F0KCAiL2V0Yy9XRUxDT01FIiApOworICAgIH0KKworICAgIGlucHV0X3RvKCAibG9nb24yIiwgSU5QVVRfUFJPTVBULAorICAgICAgICAiV2llIGhlaXNzdCBEdSBkZW5uIChcIm5ldVwiIGZ1ZXIgbmV1ZW4gU3BpZWxlcik/ICIpOworICAgIGNhbGxfb3V0KCAidGltZV9vdXQiLCAzMDAgKTsKKyAgICByZXR1cm4gMTsKK30KKworCitzdGF0aWMgaW50IGNoZWNrX3Rvb19tYW55X2Zyb21fc2FtZV9pcCgpCit7CisgICAgb2JqZWN0ICp1OworICAgIHN0cmluZyBpcDsKKworICAgIGlwID0gcXVlcnlfaXBfbnVtYmVyKHRoaXNfb2JqZWN0KCkpOworICAgIHUgPSBmaWx0ZXIodXNlcnMoKSwgZnVuY3Rpb24gc3RhdHVzIChvYmplY3Qgb2IsIHN0cmluZyBhZGRyLCBpbnQgYSkgeworICAgICAgICByZXR1cm4gcXVlcnlfaXBfbnVtYmVyKG9iKSA9PSBhZGRyCisgICAgICAgICAgICAgICAmJiBvYi0+UXVlcnlQcm9wKFBfQUdFKSA8IGE7CisgICAgfSwgaXAsIDEyKjYwKjYwKTsgLy8gMjRoIGluIGhlYXJ0X2JlYXRzCisKKyAgICBpZiAoIHNpemVvZih1KSA+IDI1ICl7CisgICAgICAgIHdyaXRlKCAiXG5EYSBhbnNjaGVpbmVuZCBnZXJhZGUgamVtYW5kIHZvbiBEZWluZXIgQWRyZXNzZSBhdXMgIgorICAgICAgICAgICAgICAgInZlcnN1Y2h0LCBkYXMgXG4iTVVETkFNRSIgbWl0IG5ldWVuIENoYXJha3RlcmVuIHp1ICIKKyAgICAgICAgICAgICAgICJ1ZWJlcnNjaHdlbW1lbiwgd2VyZGVuIG1vbWVudGFuIFxubnVyIGFlbHRlcmUgQ2hhcmFrdGVyZSAiCisgICAgICAgICAgICAgICAidm9uIGRpZXNlciBBZHJlc3NlIHp1Z2VsYXNzZW4uXG5XZW5uIER1IG1laW5zdCwgZGFzcyBlcyAiCisgICAgICAgICAgICAgICAic2ljaCB1bSBlaW5lbiBGZWhsZXIgaGFuZGVsdCwgbG9nZyBEaWNoIGJpdHRlIGFscyBcbiIKKyAgICAgICAgICAgICAgICJHYXN0IGVpbiB1bmQgc3ByaWNoIGVpbmVuIEVyem1hZ2llciBvZGVyIEdvdHQgYW4uXG4iICk7CisgICAgICAgIAorICAgICAgICBsb2dfZmlsZSggIkxPR0lOX0RFTlkiLCBzcHJpbnRmKCAiJXM6ID4xMCBTcGllbGVyIHZvbiAlLTE1cyAoJXMpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdGltZSh0aW1lKCkpWzQuLjE1XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlfaXBfbnVtYmVyKHRoaXNfb2JqZWN0KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeV9pcF9uYW1lKHRoaXNfb2JqZWN0KCkpICkgKTsKKyAgICAgICAgCisgICAgICAgIGRlc3RydWN0KHRoaXNfb2JqZWN0KCkpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGNoZWNrX2lsbGVnYWwoIHN0cmluZyBzdHIgKQoreworICAgIHN0cmluZyByZXM7CisKKyAgICByZXMgPSAoc3RyaW5nKW1hc3RlcigpLT5RdWVyeVNCYW5pc2hlZChxdWVyeV9pcF9udW1iZXIodGhpc19vYmplY3QoKSkpOworICAgIGlmICghcmVzKQorICAgIHsKKyAgICAgIC8vIGNoZWNrIGNvbm5lY3Rpb24gZnJvbSBUb3IgZXhpdCBub2RlCisgICAgICBzdHJpbmcgZWZmX2lwID0gKHJlYWxpcCE9IiIgPyByZWFsaXAgOiBxdWVyeV9pcF9udW1iZXIodGhpc19vYmplY3QoKSkpOworICAgICAgaWYgKCIvcC9kYWVtb24vZG5zbG9va3VwIi0+Y2hlY2tfdG9yKGVmZl9pcCwgcXVlcnlfbXVkX3BvcnQoKSkKKyAgICAgICAgICB8fCAiL3AvZGFlbW9uL2Ruc2xvb2t1cCItPmNoZWNrX2Ruc2JsKGVmZl9pcCkpCisgICAgICAgIHJlcyA9IAorICAgICAgICAgICAgIlxuU29ycnksIHZvbiBEZWluZXIgQWRyZXNzZSBrYW1lbiBlaW4gcGFhciBJZGlvdGVuLCBkaWUgIgorICAgICAgICAgICAgImF1c3NjaGxpZXNzbGljaFxuQWVyZ2VyIG1hY2hlbiB3b2xsdGVuLiBEZXNoYWxiIGhhYmVuIHdpciAiCisgICAgICAgICAgICAiZGllIE1vZWdsaWNoa2VpdCxcbmVpbmZhY2ggbmV1ZSBDaGFyYWt0ZXJlICIKKyAgICAgICAgICAgICJhbnp1bGVnZW4sIGZ1ZXIgZGllc2UgQWRyZXNzZSBnZXNwZXJydC5cblxuIgorICAgICAgICAgICAgIkZhbGxzIER1IGJlaSB1bnMgc3BpZWxlbiBtb2VjaHRlc3QsIHNjaGlja2UgYml0dGUgZWluZSBFbWFpbCAiCisgICAgICAgICAgICAiYW5cblxuICAgICAgICAgICAgICAgICAgICAgICAgIG11ZEBtZy5tdWQuZGVcblxuIgorICAgICAgICAgICAgIm1pdCBkZXIgQml0dGUsIGVpbmVuIENoYXJha3RlciBmdWVyIERpY2ggYW56dWxlZ2VuLlxuIiA7CisgICAgfQorCisgICAgaWYgKCByZXMgKQorICAgIHsKKyAgICAgICAgd3JpdGUoIHJlcyApOworICAgICAgICBsb2dfZmlsZSggIkxPR0lOX0RFTlkiLCBzcHJpbnRmKCAiJXM6ICUtMTFzICUtMTVzICglcylcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0aW1lKHRpbWUoKSlbNC4uMTVdLCBzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5X2lwX251bWJlcih0aGlzX29iamVjdCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlfaXBfbmFtZSh0aGlzX29iamVjdCgpKSApICk7CisgICAgICAgIHJlbW92ZSgpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworCisvKgorICogQ2hlY2sgdGhhdCBhIHBsYXllciBuYW1lIGlzIHZhbGlkLiBPbmx5IGFsbG93CisgKiBsb3dlcmNhc2UgbGV0dGVycy4KKyAqLworc3RhdGljIGludCB2YWxpZF9uYW1lKCBzdHJpbmcgc3RyICkKK3sKKyAgICBpbnQgaTsKKworICAgIGlmICggc3RyID09ICJsb2dvbiIgKXsKKyAgICAgICAgd3JpdGUoICJEZXIgTmFtZSB3dWVyZGUgbnVyIFZlcndpcnJ1bmcgc3RpZnRlbi5cbiIgKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaSA9IHNpemVvZihzdHIpOworCisgICAgaWYgKCBpID4gMTEgKXsKKyAgICAgICAgd3JpdGUoICJEZWluIE5hbWUgaXN0IHp1IGxhbmcsIG5pbW0gYml0dGUgZWluZW4gYW5kZXJlbi5cbiIgKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgZm9yICggOyBpLS07ICkKKyAgICAgICAgaWYgKCBzdHJbaV0gPCAnYScgfHwgc3RyW2ldID4gJ3onICkgeworICAgICAgICAgICAgd3JpdGUoICJVbmVybGF1YnRlcyBaZWljaGVuICciICsgc3RyW2kuLmldICsgIicgaW0gTmFtZW46ICIgKyBzdHIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJcbiIgKTsKKyAgICAgICAgICAgIHdyaXRlKCAiQmVudXR6ZSBiaXR0ZSBudXIgQnVjaHN0YWJlbiBvaG5lIFVtbGF1dGUuXG4iICk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgcmV0dXJuIDE7Cit9CisKKworc3RhdGljIGludCBsb2dvbjIoIHN0cmluZyBzdHIgKQoreworICAgIGludCBpLCBhcmc7CisgICAgbWl4ZWQgdHh0OworCisgICAgaWYgKCAhc3RyIHx8IHN0ciA9PSAiIiApeworICAgICAgICB3cml0ZSggIkFiYnJ1Y2ghXG4iICk7CisgICAgICAgIGRlc3RydWN0KCB0aGlzX29iamVjdCgpICk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8vIFVudGVyc3R1ZXR6dW5nIGZ1ZXIgZGFzIE11ZCBTZXJ2ZXIgU3RhdHVzIFByb3RvY29sCisgICAgLy8gKGh0dHA6Ly90aW50aW4uc291cmNlZm9yZ2UubmV0L21zc3AvKQorI2lmZGVmIE1TU1BfU1VQUE9SVAorICAgIGlmIChzdHIgPT0gIk1TU1AtUkVRVUVTVCIpIHsKKyAgICAgICIvc2VjdXJlL21pc2MvbXNzcCItPnByaW50X21zc3BfcmVzcG9uc2UoKTsKKyAgICAgIGxvZ19maWxlKCAiTVNTUC5sb2ciLCBzcHJpbnRmKCAiJXM6ICUtMTVzICglcylcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmZ0aW1lKCIlYyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeV9pcF9udW1iZXIodGhpc19vYmplY3QoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5X2lwX25hbWUodGhpc19vYmplY3QoKSl8fCJOL0EiICkgKTsKKyAgICAgIGlucHV0X3RvKCJsb2dvbjIiLCBJTlBVVF9QUk9NUFQsCisgICAgICAgICAgIldpZSBoZWlzc3QgRHUgZGVubiAoXCJuZXVcIiBmdWVyIG5ldWVuIFNwaWVsZXIpPyAiKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyNlbmRpZgorCisgICAgaWYoc3Ryc3RyKHN0cixTU0xfR1JSRVRJTkcpPT0wKQorICAgIHsKKyAgICAgIGlmKCBtZW1iZXIoUFJPWElFUyxxdWVyeV9pcF9udW1iZXIodGhpc19vYmplY3QoKSkpPi0xICkKKyAgICAgIHsKKyAgICAgICAgcmVhbGlwPXN0cltzaXplb2YoU1NMX0dSUkVUSU5HKS4uXTsKKyAgICAgIH0gLy8gYW5kZXJlIElQcyB3ZXJkZW4gZWluZmFjaCBpZ25vcmllcnQuIC0+IGxvZy9QUk9YWS5SRVEgPworICAgICAgLy8gZ2dmLiBMb29rdXAgZnVlciBUb3JleGl0cyBhbnN0b3NzZW4uCisgICAgICAiL3AvZGFlbW9uL2Ruc2xvb2t1cCItPmNoZWNrX3RvcihyZWFsaXAscXVlcnlfbXVkX3BvcnQoKSk7CisgICAgICAiL3AvZGFlbW9uL2Ruc2xvb2t1cCItPmNoZWNrX2Ruc2JsKHJlYWxpcCk7CisKKyAgICAgIGlucHV0X3RvKCAibG9nb24yIiwgSU5QVVRfUFJPTVBULAorICAgICAgICAgICJXaWUgaGVpc3N0IER1IGRlbm4gKFwibmV1XCIgZnVlciBuZXVlbiBTcGllbGVyKT8gIik7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgCisgICAgaWYgKCBsb2dpbm5hbWUgIT0gImxvZ29uIiApIHsKKyAgICAgICAgbG9nX2ZpbGUoICJJTExFR0FMIiwgc3ByaW50ZiggIiVzIElsbGVnYWwgcGF0Y2ggb2YgbG9naW46ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxvZ2lubmFtZSA9ICVPXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdGltZSh0aW1lKCkpLCBsb2dpbm5hbWUgKSApOworICAgICAgICBkZXN0cnVjdCggdGhpc19vYmplY3QoKSApOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBzdHIgPSBsb3dlcl9jYXNlKHN0cik7CisgICAgY2FwX25hbWUgPSBjYXBpdGFsaXplKHN0cik7CisKKyAgICBpZiAoIHN0ciA9PSAibmV1IiAmJiAhbmV1ICl7CisgICAgICAgIGNhdCggIi9ldGMvV0VMQ09NRV9ORVciICk7CisgICAgICAgIG5ldSA9IDE7CisgICAgICAgIGlucHV0X3RvKCAibG9nb24yIiwgSU5QVVRfUFJPTVBULCAiTmFtZTogIik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIGlmICggIXZhbGlkX25hbWUoc3RyKSApeworICAgICAgICBzdHJpbmcgcHI7CisgICAgICAgIGlmICggIW5ldSApCisgICAgICAgICAgICBwcj0gIldpZSBoZWlzc3QgRHUgZGVubiAoXCJuZXVcIiBmdWVyIG5ldWVuIFNwaWVsZXIpPyAiOworICAgICAgICBlbHNlCisgICAgICAgICAgICBwcj0gIkJpdHRlIGdpYiBEaXIgZWluZW4gYW5kZXJlbiBOYW1lbjogIjsKKworICAgICAgICBpbnB1dF90byggImxvZ29uMiIsIElOUFVUX1BST01QVCwgcHIgKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgaWYgKCBzc2NhbmYoIHN0ciwgImdhc3QlZCIsIGFyZyApID09IDEgKXsKKyAgICAgICAgd3JpdGUoICJEdSBtZWluc3Qgd29obCAnR2FzdCcgLi4uXG4iICk7CisgICAgICAgIHN0ciA9ICJnYXN0IjsKKyAgICB9CisKKyAgICBsb2dpbm5hbWUgPSBzdHI7CisKKyAgICAvKiByZWFkIHRoZSBzZWN1cmUgc2F2ZSBmaWxlIHRvIHNlZSBpZiBjaGFyYWN0ZXIgYWxyZWFkeSBleGlzdHMgKi8KKyAgICBpZiAoIGxvZ2lubmFtZSAhPSAiZ2FzdCIgJiYKKyAgICAgICAgICFyZXN0b3JlX29iamVjdCggbWFzdGVyKCktPnNlY3VyZV9zYXZlZmlsZShsb2dpbm5hbWUpICkgKXsKKyAgICAgICAgb2JqZWN0ICp1c2VyOworCisgICAgICAgIGlmICggIW5ldSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHdyaXRlKCAiRXMgZXhpc3RpZXJ0IGtlaW4gQ2hhcmFrdGVyIG1pdCBkaWVzZW0gTmFtZW4uXG4iICk7CisgICAgICAgICAgICB3cml0ZSggIkZhbGxzIER1IGVpbmVuIG5ldWVuIENoYXJha3RlciBlcnNjaGFmZmVuIG1vZWNodGVzdCwgIgorICAgICAgICAgICAgICAgICAgICJ0aXBwZSBiaXR0ZSBcIm5ldVwiIGVpbi5cbiIgKTsKKworICAgICAgICAgICAgbG9naW5uYW1lID0gImxvZ29uIjsKKyAgICAgICAgICAgIGlucHV0X3RvKCAibG9nb24yIiwgSU5QVVRfUFJPTVBULAorICAgICAgICAgICAgICAgICJXaWUgaGVpc3N0IER1IGRlbm4gKFwibmV1XCIgZnVlciBuZXVlbiBTcGllbGVyKT8gIik7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoIGkgPSBzaXplb2YodXNlciA9IHVzZXJzKCkgLSAoeyAwLCB0aGlzX29iamVjdCgpIH0pKTsgaS0tOyApCisgICAgICAgICAgICBpZiAoIG9iamVjdF9uYW1lKHVzZXJbaV0pWzAuLjEyXSA9PSAiL3NlY3VyZS9sb2dpbiIgJiYKKyAgICAgICAgICAgICAgICAgKChzdHJpbmcpdXNlcltpXS0+bG9naW5uYW1lKCkpID09IGxvZ2lubmFtZSApeworICAgICAgICAgICAgICAgIHdyaXRlKCAiRWluZSBBbm1lbGR1bmcgZnVlciBkaWVzZW4gTmFtZW4gbGFldWZ0IGJlcmVpdHMuXG4iICk7CisgICAgICAgICAgICAgICAgZGVzdHJ1Y3QoIHRoaXNfb2JqZWN0KCkgKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAvLyBTaXRlLUJhbmlzaCBjaGVja2VuCisgICAgICAgIGlmICggY2hlY2tfaWxsZWdhbChsb2dpbm5hbWUpKQorICAgICAgICAgICAgcmV0dXJuIDE7CisKKyAgICAgICAgaWYgKCBjaGVja190b29fbWFueV9mcm9tX3NhbWVfaXAoKSApCisgICAgICAgICAgICByZXR1cm4gMTsKKworICAgICAgICAvKiBuZXcgY2hhcmFjdGVyICovCisgICAgICAgIGlmICggc2l6ZW9mKGxvZ2lubmFtZSkgPCAzICl7CisgICAgICAgICAgICB3cml0ZSggIkRlciBOYW1lIGlzdCB6dSBrdXJ6LlxuIiApOworICAgICAgICAgICAgbG9naW5uYW1lID0gImxvZ29uIjsKKyAgICAgICAgICAgIGlucHV0X3RvKCAibG9nb24yIiwgSU5QVVRfUFJPTVBULAorICAgICAgICAgICAgICAgICJWZXJzdWNoIGVpbmVuIGFuZGVyZW4gTmFtZW46ICIpOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKworICAgICAgICAKKyAgICAgICAgaWYgKCAodHh0ID0gKHN0cmluZyltYXN0ZXIoKS0+UXVlcnlCYW5pc2hlZChsb2dpbm5hbWUpKSApeworICAgICAgICAgICAgaWYgKCB0eHQgIT0gIkRpZXNlciBOYW1lIGlzdCBnZXNwZXJydC4iICkKKyAgICAgICAgICAgICAgICB0eHQgPSBzcHJpbnRmKCJIb3BwbGEgLSBkaWVzZXIgTmFtZSBpc3QgcmVzZXJ2aWVydCBvZGVyIGdlc3BlcnJ0ICIKKyAgICAgICAgICAgICAgICAgICAgIihcImdlYmFuaXNodFwiKSFcbkdydW5kOiAlc1xuIix0eHQpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHR4dCA9ICJIb3BwbGEgLSBkaWVzZXIgTmFtZSBpc3QgcmVzZXJ2aWVydCBvZGVyIGdlc3BlcnJ0ICIKKyAgICAgICAgICAgICAgICAgICAgIihcImdlYmFuaXNodFwiKSFcbiI7CisgICAgICAgICAgICB3cml0ZSh0eHQpOworICAgICAgICAgICAgbG9naW5uYW1lID0gImxvZ29uIjsKKyAgICAgICAgICAgIGlucHV0X3RvKCAibG9nb24yIiwgSU5QVVRfUFJPTVBULAorICAgICAgICAgICAgICAgICJCaXR0ZSBnaWIgRGlyIGVpbmVuIGFuZGVyZW4gTmFtZW46ICIpOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKworICAgICAgICAvKiBJbml0aWFsaXplIHRoZSBuZXcgc2VjdXJlIHNhdmVmaWxlICovCisgICAgICAgIG5hbWUgPSBsb2dpbm5hbWU7CisgICAgICAgIHBhc3N3b3JkID0gIiI7CisgICAgICAgIGxldmVsID0gMDsKKyAgICAgICAgZG9tYWlucyA9ICh7IH0pOworICAgICAgICBndWlsZHMgPSAoeyB9KTsgCisgICAgICAgIHNoZWxsID0gIiI7CisgICAgICAgIGVwID0gIiI7CisgICAgICAgIGVrID0gIiI7CisgICAgICAgIG1xID0gIiI7CisgICAgICAgIGVrdGlwcz0iIjsKKyAgICAgICAgZnB0aXBzPSIiOworICAgICAgICBjcmVhdGlvbl9kYXRlID0gdGltZSgpOworCisgICAgICAgIGlucHV0X3RvKCAibmV3X3Bhc3N3b3JkIiwgSU5QVVRfTk9FQ0hPfElOUFVUX1BST01QVCwKKyAgICAgICAgICAgICJXYWVobGUgZWluIFBhc3N3b3J0OiAiKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZiAoIGxvZ2lubmFtZSA9PSAiZ2FzdCIgKXsKKyAgICAgICAgICAgIGlmICggY2hlY2tfaWxsZWdhbChsb2dpbm5hbWUpICkKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKworICAgICAgICAgICAgbG9hZF9wbGF5ZXJfb2JqZWN0KDEpOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIG5ldSApeworICAgICAgICAgICAgd3JpdGUoICJFcyBleGlzdGllcnQgYmVyZWl0cyBlaW4gQ2hhcmFrdGVyIGRpZXNlcyBOYW1lbnMuXG4iICk7CisgICAgICAgICAgICBsb2dpbm5hbWUgPSAibG9nb24iOworICAgICAgICAgICAgaW5wdXRfdG8oICJsb2dvbjIiLCBJTlBVVF9QUk9NUFQsCisgICAgICAgICAgICAgICAgIkdpYiBEaXIgZWluZW4gYW5kZXJlbiBOYW1lbjogIik7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggKGludCltYXN0ZXIoKS0+Y2hlY2tfbGF0ZV9wbGF5ZXIobG9naW5uYW1lKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHdyaXRlKCAiRGllc2VyIFNwaWVsZXIgaGF0IHVucyBsZWlkZXIgZnVlciBpbW1lciB2ZXJsYXNzZW4uXG4iICk7CisgICAgICAgICAgICBsb2dpbm5hbWUgPSAibG9nb24iOworICAgICAgICAgICAgaW5wdXRfdG8oICJsb2dvbjIiLCBJTlBVVF9QUk9NUFQsCisgICAgICAgICAgICAgICAgIldpZSBoZWlzc3QgRHUgZGVubiAoXCJuZXVcIiBmdWVyIG5ldWVuIFNwaWVsZXIpPyAiKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCB0eHQgPSAoc3RyaW5nKW1hc3RlcigpLT5RdWVyeVRCYW5pc2hlZChsb2dpbm5hbWUpICl7CisgICAgICAgICAgICB3cml0ZSggdHh0ICk7CisgICAgICAgICAgICBsb2dpbm5hbWUgPSAibG9nb24iOworICAgICAgICAgICAgaW5wdXRfdG8oICJsb2dvbjIiLCBJTlBVVF9QUk9NUFQsCisgICAgICAgICAgICAgICAgIldpZSBoZWlzc3QgRHUgZGVubiAoXCJuZXVcIiBmdWVyIG5ldWVuIFNwaWVsZXIpPyAiKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCBjcmVhdGlvbl9kYXRlID4gKHRpbWUoKSAtIDMwKjI0KjYwKjYwKQorICAgICAgICAgICAgICYmIGNoZWNrX3Rvb19tYW55X2Zyb21fc2FtZV9pcCgpICkKKyAgICAgICAgICAgIHJldHVybiAxOworCisgICAgICAgIHdyaXRlKCAiU2Nob2VuLCBkYXNzIER1IHdpZWRlciBkYSBiaXN0LCAiK2NhcGl0YWxpemUobG9naW5uYW1lKSsiIVxuIiApOworCisgICAgICAgIGlmICggIXN0cmluZ3AocGFzc3dvcmQpIHx8IHBhc3N3b3JkID09ICIiICkgeworICAgICAgICAgICAgd3JpdGUoICJEdSBoYXN0IEtFSU4gUEFTU1dPUkQhXG4iICk7CisgICAgICAgICAgICB3cml0ZSggIkJlbnV0emUgZGVuIFwicGFzc3dvcmRcIi1CZWZlaGwsIHVtIGRhcyB6dSBhZW5kZXJuICFcbiIgKTsKKyAgICAgICAgICAgIGxvYWRfcGxheWVyX29iamVjdCgwKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisKKyAgICAgICAgaW5wdXRfdG8oICJjaGVja19wYXNzd29yZCIsIElOUFVUX05PRUNIT3xJTlBVVF9QUk9NUFQsCisgICAgICAgICAgICAiUGFzc3dvcnQ6ICIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9Cit9CisKKworc3RhdGljIGludCBuZXdfcGFzc3dvcmQoIHN0cmluZyBzdHIgKQoreworICAgIHdyaXRlKCAiXG4iICk7CisKKyAgICBpZiAoICFzdHIgfHwgc3RyID09ICIiICkKKyAgICAgICAgcmV0dXJuIHJlbW92ZSgpOworCisgICAgcGFzc3dvcmQgPSBzdHI7CisKKyAgICBpZiAoICFtYXN0ZXIoKS0+Z29vZF9wYXNzd29yZCggc3RyLCBsb2dpbm5hbWUgKSApIHsKKyAgICAgICAgaW5wdXRfdG8oICJuZXdfcGFzc3dvcmQiLCBJTlBVVF9OT0VDSE98SU5QVVRfUFJPTVBULAorICAgICAgICAgICAgIkJpdHRlIGdpYiBlaW4gUGFzc3dvcnQgYW46ICIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICB3cml0ZSggIlxuWnVyIEVyaW5uZXJ1bmc6IEVzIGlzdCAgdiBlIHIgYiBvIHQgZSBuLCBhbmRlcmUgU3BpZWxlciAiCisgICAgICAgICAgICJhbnp1Z3JlaWZlbiFcbiIgKTsKKyAgICB3cml0ZSggIkRhcyBnaWx0IGF1Y2ggZnVlciBGcm9lc2NoZSwgYmVpIGRlbmVuIFwiRWluIEZyb3NjaCBuYW1lbnMgIgorICAgICAgICAgICAiWFhYWFhcIiBzdGVodC5cblxuIiApOworICAgIGlucHV0X3RvKCAiYWdhaW5fcGFzc3dvcmQiLCBJTlBVVF9OT0VDSE98SU5QVVRfUFJPTVBULAorICAgICAgICAiUGFzc3dvcnQgYml0dGUgbm9jaG1hbCBlaW5nZWJlbjogIik7CisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgYWdhaW5fcGFzc3dvcmQoIHN0cmluZyBzdHIgKQoreworICAgIHdyaXRlKCAiXG4iICk7CisKKyAgICBpZiAoIHN0ciAhPSBwYXNzd29yZCApeworICAgICAgICB3cml0ZSggIkRpZSBQYXNzd29lcnRlciBzdGltbXRlbiBuaWNodCB1ZWJlcmVpbiFcbiIgKTsKKyAgICAgICAgZGVzdHJ1Y3QoIHRoaXNfb2JqZWN0KCkgKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgd2hpbGUgKCByZW1vdmVfY2FsbF9vdXQoICJ0aW1lX291dCIgKSAhPSAtMSApCisgICAgICAgIDsKKyAgICBjYWxsX291dCggInRpbWVfb3V0IiwgNjAwICk7CisKKyAgICBwYXNzd29yZCA9IG1kNV9jcnlwdCggcGFzc3dvcmQsIDAgKTsKKyAgICBzYXZlX29iamVjdCggU0VDVVJFU0FWRVBBVEggKyBsb2dpbm5hbWVbMC4uMF0gKyAiLyIgKyBsb2dpbm5hbWUgKTsKKyAgICBtYXN0ZXIoKS0+UmVtb3ZlRnJvbUNhY2hlKCBsb2dpbm5hbWUgKTsKKworICAgIGxvYWRfcGxheWVyX29iamVjdCgwKTsKKyAgICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBjaGVja19wYXNzd29yZCggc3RyaW5nIHN0ciApCit7CisgICAgd3JpdGUoICJcbiIgKTsKKworICAgIC8vIEludmlzIGVpbmxvZ2dlbj8KKyAgICBpZiAoc2l6ZW9mKHN0cikgPiAxICYmIHN0clswXSA9PSAnLScpIHsKKyAgICAgICAgaW52aXMgPSAxOworICAgICAgICBzdHIgPSBzdHJbMS4uXTsKKyAgICB9CisKKyAgICAvLyB3ZWxjaGVyIEhhc2ggaXN0cyBkZW5uPworICAgIGlmIChzaXplb2YocGFzc3dvcmQpID4gMTMpIHsKKyAgICAgICAgLy8gTUQ1LUhhc2gKKyAgICAgICAgc3RyID0gbWQ1X2NyeXB0KHN0ciwgcGFzc3dvcmQpOworICAgIH0KKyAgICBlbHNlIGlmIChzaXplb2YocGFzc3dvcmQpID4gMikgeworICAgICAgICAvLyBDcnlwdC1IYXNoCisgICAgICAgIHN0ciA9IGNyeXB0KHN0ciwgcGFzc3dvcmRbMC4uMV0pOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLy8ga2VpbmVyIHZvbiBiZWlkZW4gSGFzaGVzIC0+IHVuZ3VlbHRpZ2VzIFBXCisgICAgICAgIHN0ciA9IDA7CisgICAgfQorCisgICAgaWYgKCAhc3RyaW5ncChzdHIpIHx8IHN0ciAhPSBwYXNzd29yZCApIHsKKyAgICAgIC8vIEhhc2hlcyBzdGltbWVuIG5pY2h0IHVlYmVyZWluIC0+IHVuZCBzY2hsdXNzLi4uCisgICAgICB3cml0ZSggIkZhbHNjaGVzIFBhc3N3b3J0IVxuIik7CisgICAgICBpZiAoIGxvZ2luZmFpbHMgPiAyICkKKyAgICAgICAgd3JpdGUoYnJlYWtfc3RyaW5nKAorICAgICAgICAgICJTb2xsdGVzdCBEdSB3ZWl0ZXJoaW4gUHJvYmxlbWUgbWl0IGRlbSBFaW5sb2dnZW4gaGFiZW4sIGthbm5zdCAiCisgICAgICAgICAgIkR1IERlaW4gUGFzc3dvcnQgenVydWVja3NldHplbiBsYXNzZW4sIGluZGVtIER1IERpY2ggYWxzIEdhc3QgIgorICAgICAgICAgICJhbm1lbGRlc3QgdW5kIGVpbmVuIEVyem1hZ2llciBhbnNwcmljaHN0LCBvZGVyIGluZGVtIER1IERpY2ggIgorICAgICAgICAgICJtaXR0ZWxzIGVpbmVyIEUtTWFpbCBhbiBtdWRAbWQubXVkLmRlIG1pdCB1bnMgaW4gVmVyYmluZHVuZyAiCisgICAgICAgICAgInNldHp0LiIsNzgpKTsKKyAgICAKKyAgICAgIGxvZ19maWxlKCAobGV2ZWwgPCA2MCA/ICJMT0dJTkZBSUwiIDogIkFSQ0gvTE9HSU5GQUlMIiksCisgICAgICAgIHNwcmludGYoICJQQVNTV09SRDogJS0xMXMgJXMsICUtMTVzICglcylcbiIsICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgIGxvZ2lubmFtZSwgY3RpbWUodGltZSgpKVs0Li4xNV0sCisgICAgICAgICAgICAgICAgICBxdWVyeV9pcF9udW1iZXIodGhpc19vYmplY3QoKSksICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgIHF1ZXJ5X2lwX25hbWUodGhpc19vYmplY3QoKSkgKSwgMjAwMDAwICk7CisgICAgICAKKyAgICAgIGxvZ2luZmFpbHMrKzsKKyAgICAgIHNhdmVfb2JqZWN0KCBTRUNVUkVTQVZFUEFUSCArIGxvZ2lubmFtZVswLi4wXSArICIvIiArIGxvZ2lubmFtZSApOworICAgICAgbWFzdGVyKCktPlJlbW92ZUZyb21DYWNoZSggbG9naW5uYW1lICk7CisgICAgICBkZXN0cnVjdCggdGhpc19vYmplY3QoKSApOworICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgaWYgKCBsb2dpbmZhaWxzICkgeworICAgICAgICB3cml0ZSggbG9naW5mYWlscyArICIgZmVobGdlc2NobGFnZW5lIiArIChsb2dpbmZhaWxzID09IDEgPyAiciIgOiAiIikgKworICAgICAgICAgICAgICAgIiBMb2dpbi1WZXJzdWNoIiArIChsb2dpbmZhaWxzID09IDEgPyAiIiA6ICJlIikgKworICAgICAgICAgICAgICAgIiBzZWl0IGRlbSBsZXR6dGVuIGVyZm9sZ3JlaWNoZW4gTG9naW4uXG4iICk7CisgICAgICAgIGxvZ2luZmFpbHMgPSAwOworICAgIH0KKworICAgIHNhdmVfb2JqZWN0KCBTRUNVUkVTQVZFUEFUSCArIGxvZ2lubmFtZVswLi4wXSArICIvIiArIGxvZ2lubmFtZSApOworICAgIG1hc3RlcigpLT5SZW1vdmVGcm9tQ2FjaGUoIGxvZ2lubmFtZSApOworCisgICAgbG9hZF9wbGF5ZXJfb2JqZWN0KDApOworICAgIHJldHVybiAxOworfQorCisKK3N0YXRpYyB2b2lkIHNlbGVjdF9yYWNlKCkKK3sKKyAgICBpbnQgaTsKKyAgICBzdHJpbmcgczsKKworICAgIHJhY2VzID0gZ2V0X2RpciggIi9zdGQvc2hlbGxzLyouYyIgKTsKKworICAgIC8vIE1lbnNjaCBzb2xsIGltbWVyIGFscyBlcnN0ZXMgaW4gZGVyIEF1c3dhaGxsaXN0ZSBzdGVoZW4uCisgICAgaWYgKG1lbWJlcihyYWNlcywiaHVtYW4uYyIpIT0tMSkKKyAgICAgICAgICAgIHJhY2VzPSh7Imh1bWFuLmMifSkrKHJhY2VzLSh7Imh1bWFuLmMifSkpOworICAgIAorICAgIGZvciAoIGkgPSBzaXplb2YocmFjZXMpOyBpLS07ICl7CisgICAgICAgIHJhY2VzW2ldID0gIi9zdGQvc2hlbGxzLyIgKyByYWNlc1tpXVswLi48M107CisgICAgICAgIHMgPSAwOworCisgICAgICAgIGlmICggY2F0Y2gocyA9IChzdHJpbmcpY2FsbF9vdGhlciggcmFjZXNbaV0sICJRdWVyeUFsbG93U2VsZWN0IiApOyBwdWJsaXNoKSAKKyAgICAgICAgICAgIHx8ICFzKQorICAgICAgICAgICAgcyA9IDA7CisgICAgICAgIGVsc2UgaWYgKCBjYXRjaChzID0gKHN0cmluZyljYWxsX290aGVyKCByYWNlc1tpXSwgIlF1ZXJ5UHJvcCIsIFBfUkFDRSApO3B1Ymxpc2gpICkKKyAgICAgICAgICAgIHMgPSAwOworCisgICAgICAgIGlmICggIXNpemVvZihzKSApCisgICAgICAgICAgICByYWNlc1tpLi5pXSA9ICh7fSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJhY2VzW2ldID0gKHsgcmFjZXNbaV0sIHMgfSk7CisgICAgfQorCisgICAgaWYgKCBzaXplb2YocmFjZXMpID09IDEgKXsKKyAgICAgICAgd3JpdGUoICJFcyBnaWJ0IG51ciBlaW5lIFJhc3NlLCBEdSBoYXN0IGFsc28ga2VpbmUgV2FobC5cbiIgKTsKKworICAgICAgICBzaGVsbCA9IHJhY2VzWzBdWzBdOworICAgICAgICBtYXN0ZXIoKS0+c2V0X3BsYXllcl9vYmplY3QoIGxvZ2lubmFtZSwgc2hlbGwgKTsKKworICAgICAgICByZXR1cm4gbG9hZF9wbGF5ZXJfb2JfMiggc2hlbGwsIDAgKTsKKyAgICB9CisKKyAgICByZXR1cm4gYXNrX211ZF9wbGF5ZWRfcXVlc3Rpb24oKTsKK30KKworc3RhdGljIHZvaWQgYXNrX211ZF9wbGF5ZWRfcXVlc3Rpb24oKQoreworICAgICAgICB3cml0ZShicmVha19zdHJpbmcoCisgICAgICAgICAgICAgICAgIlxuV2VubiBEdSBlaW4gYWJzb2x1dGVyIE5ldWxpbmcgaW4gZGllc2VtIFNwaWVsIGJpc3QgbW9lY2h0ZW4gIgorICAgICAgICAgICAgICAgICJ3aXIgRGlyIG1pdCBlaW5pZ2VuIFRpcHMgenUgQmVnaW5uIGJlaXNlaXRlIHN0ZWhlbi5cblxuIiw3OCwKKyAgICAgICAgICAgICAgICAwLEJTX0xFQVZFX01ZX0xGUykpOworICAgICAgICBpbnB1dF90byggImdldF9tdWRfcGxheWVkX2Fuc3dlciIsIElOUFVUX1BST01QVCwKKyAgICAgICAgICAgICJIYXN0IER1IHNjaG9uIGVpbm1hbCBpbiBlaW5lbSBNVUQgZ2VzcGllbHQ/IChqYSxuZWluKTogIik7CisgICAgICAgIHJldHVybjsKK30KKworc3RhdGljIHZvaWQgYXNrX3JhY2VfcXVlc3Rpb24oKQoreworICAgIGludCBpLCBqOworCisgICAgd3JpdGUoIGJyZWFrX3N0cmluZyggIkR1IG11c3N0IERpY2ggamV0enQgZW50c2NoZWlkZW4sIHdlbGNoZXIgUmFzc2UgRHUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJpbiBkaWVzZXIgV2VsdCBhbmdlaG9lcmVuIG1vZWNodGVzdC4gQWxsZSBSYXNzZW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICJoYWJlbiB2ZXJzY2hpZWRlbmUgVm9yLSB1bmQgTmFjaHRlaWxlLCBpbnNnZXNhbXQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJhYmVyIGdsZWljaCBndXRlIENoYW5jZW4uIEF1Y2ggZGFzIFN0YXJ0Z2ViaWV0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiaGFlbmd0IHZvbiBkZXIgYXVzZ2V3YWVobHRlbiBSYXNzZSBhYi4gSW0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICJOb3JtYWxmYWxsIGthbm4gZGllIFJhc3NlIG5pY2h0IG1laHIgZ2V3ZWNoc2VsdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIndlcmRlbiwgbmFjaGRlbSBzaWUgZWlubWFsIGF1c2dld2FlaGx0IHd1cmRlLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIlVlYmVybGVnZSBEaXIgRGVpbmUgRW50c2NoZWlkdW5nIGFsc28gZ3V0LiBEZXJ6ZWl0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAic3RlaGVuIGZvbGdlbmRlIFJhc3NlbiB6dXIgQXVzd2FobDpcblxuIiwgNzggKSApOworCisgICAgZm9yICggaSA9IDAsIGogPSBzaXplb2YocmFjZXMpOyBpIDwgajsgaSsrICkKKyAgICAgICAgcHJpbnRmKCAiJSAyZC4gJS0zMHMgICAlcyIsIGkrMSwgY2FwaXRhbGl6ZShyYWNlc1tpXVsxXSksCisgICAgICAgICAgICAgICAgKGkgJSAyID8gIlxuIiA6ICJ8ICIpICk7CisKKyAgICBpZiAoIHNpemVvZihyYWNlcykgJSAyICkKKyAgICAgICAgd3JpdGUoICJcbiIgKTsKKworICAgIHdyaXRlKCBicmVha19zdHJpbmcoICJcbkR1cmNoIEVpbmdhYmUgZWluZXIgWmlmZmVyIHdhZWhsc3QgRHUgZGllIFJhc3NlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiYXVzLCBkdXJjaCBFaW5nYWJlIGVpbmVzIFwiXD9cIiBnZWZvbGd0IHZvbiBlaW5lciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIlppZmZlciBlcmhhZWx0c3QgRHUgbmFlaGVyZSBJbmZvcm1hdGlvbmVuIHVlYmVyICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiZWluZSBSYXNzZS4gRWluIFwiXD9cIiBhbGxlaW4gd2llZGVyaG9sdCBkaWVzZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIkxpc3RlLiIsIDc4LCAwLCAxICkgKTsKKworICAgIGlmIChuZXdiaWUpCisgICAgeworICAgICAgICAgICAgd3JpdGUoYnJlYWtfc3RyaW5nKCJcbkFscyBOZXVsaW5nIHNvbGx0ZXN0IER1IERpY2ggTklDSFQgZnVlciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGllIER1bmtlbGVsZmVuIGVudHNjaGVpZGVuLiBEaWVzZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmFzc2UgaGF0IGVpbmlnZSBQcm9ibGVtZSBpbSBVbWdhbmcgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1pdCBkZW4gYW5kZXJlbiBSYXNzZW4gdW5kIG1pdCBkZW0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNvbm5lbmxpY2h0LiIsNzgsMCxCU19MRUFWRV9NWV9MRlMpKTsKKyAgICB9CisKKyAgICBpbnB1dF90byggImdldF9yYWNlX2Fuc3dlciIsIElOUFVUX1BST01QVCwKKyAgICAgICAgIlxuV2FzIHdpbGxzdCBEdSB0dW46ICIpOworICAgIHJldHVybjsKK30KKworCitzdGF0aWMgdm9pZCBnZXRfcmFjZV9hbnN3ZXIoIHN0cmluZyBzdHIgKQoreworICAgIGludCBudW07CisKKyAgICBpZiAoIHN0ciA9PSAiPyIgKQorICAgICAgICByZXR1cm4gYXNrX3JhY2VfcXVlc3Rpb24oKTsKKworICAgIGlmICggc3NjYW5mKCBzdHIsICI/JWQiLCBudW0gKSApeworICAgICAgICBpZiAoIG51bSA8IDEgfHwgbnVtID4gc2l6ZW9mKHJhY2VzKSApeworICAgICAgICAgICAgd3JpdGUoICJEYXMgZ2VodCBuaWNodC5cblxuIik7CisgICAgICAgICAgICBpbnB1dF90byggImdldF9yYWNlX2Fuc3dlciIsIElOUFVUX1BST01QVCwKKyAgICAgICAgICAgICAgICAiV2FzIHdpbGxzdCBEdSB0dW46ICIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgd3JpdGUoIGNhbGxfb3RoZXIoIHJhY2VzW251bSAtIDFdWzBdLCAiUXVlcnlQcm9wIiwgUF9SQUNFX0RFU0NSSVBUSU9OICkpOworICAgICAgICBpbnB1dF90byggImdldF9yYWNlX2Fuc3dlciIsIElOUFVUX1BST01QVCwKKyAgICAgICAgICAgICJcbldhcyB3aWxsc3QgRHUgdHVuOiAiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICggc3NjYW5mKCBzdHIsICIlZCIsIG51bSApICYmIG51bSA+PSAxICYmIG51bSA8PSBzaXplb2YocmFjZXMpICl7CisgICAgICAgIHdyaXRlKCAiT2ssIER1IGJpc3QgamV0enQgZWluICIKKyAgICAgICAgICAgICsgY2FwaXRhbGl6ZShyYWNlc1tudW0tMV1bMV0pICsgIi5cbiIgKTsKKworICAgICAgICBzaGVsbCA9IHJhY2VzW251bS0xXVswXTsKKyAgICAgICAgbWFzdGVyKCktPnNldF9wbGF5ZXJfb2JqZWN0KCBsb2dpbm5hbWUsIHNoZWxsICk7CisgICAgICAgIHJldHVybiBsb2FkX3BsYXllcl9vYl8yKCBzaGVsbCwgMCApOworICAgIH0KKworICAgIHdyaXRlKCJXaWUgYml0dGU/XG5cbiIgKTsKKyAgICBpbnB1dF90byggImdldF9yYWNlX2Fuc3dlciIsIElOUFVUX1BST01QVCwKKyAgICAgICAgIldhcyB3aWxsc3QgRHUgdHVuOiAiKTsKK30KKworc3RhdGljIHZvaWQgZ2V0X211ZF9wbGF5ZWRfYW5zd2VyIChzdHJpbmcgc3RyKQoreworICAgICAgICBpZiAoIHN0ciA9PSAiamEiIHx8IHN0cj09ImoiKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBuZXdiaWU9MDsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXNrX3JhY2VfcXVlc3Rpb24oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIGlmICggc3RyICE9ICJuZWluIiAmJiBzdHIhPSJuIikKKyAgICAgICAgeworICAgICAgICAgICAgICAgIHdyaXRlKCJcblxuQW50d29ydGUgYml0dGUgbWl0IGphIG9kZXIgbmVpbi5cblxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHJldHVybiBhc2tfbXVkX3BsYXllZF9xdWVzdGlvbigpOworICAgICAgICB9CisgICAgICAgIG5ld2JpZT0xOworICAgICAgICB3cml0ZSgiXG5cbkVpbmUga2xlaW5lIEVpbmZ1ZWhydW5nIGluIGRhcyAiTVVETkFNRSIgYmVrb21tc3QgIgorICAgICAgICAgICAgICAgICAgICAgICAgIkR1IGF1Y2ggaGllcjpcblxuIgorICAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly9tZy5tdWQuZGUvbmV3d2ViL2hpbGZlL3R1dG9yaWFsL2luaGFsdC5zaHRtbFxuXG4iKTsKKyAgICAgICAgcmV0dXJuIGFza19yYWNlX3F1ZXN0aW9uKCk7CisgICAgICAgIAorfQorCitzdGF0aWMgaW50IGxvYWRfcGxheWVyX29iamVjdCggaW50IGd1ZXN0ZmxhZyApCit7CisgICAgb2JqZWN0IG9iOworICAgIHN0cmluZyBmbmFtZTsKKyAgICBpbnQgd2FzX2ludGVyYWN0aXZlOworCisgICAgaWYgKCBzaXplb2YodXNlcnMoKSkgPj0gMTk1ICYmICFJU19XSVpBUkQobG9naW5uYW1lKSApeworICAgICAgICB3cml0ZSggIkRpZSBtYXhpbWFsZSBTcGllbGVyemFobCB3dXJkZSBiZXJlaXRzIGVycmVpY2h0ISEhXG4iCisgICAgICAgICAgICAgICAiQXVzIHRlY2huaXNjaGVuIEdydWVuZGVuIGR1ZXJmZW4gc2ljaCBudXIgbm9jaCBNYWdpZXIgIgorICAgICAgICAgICAgICAgImVpbmxvZ2dlbi5cblZlcnN1Y2ggZXMgc3BhZXRlciBub2NoIGVpbm1hbCAuLi5cbiIgKTsKKyAgICAgICAgZGVzdHJ1Y3QoIHRoaXNfb2JqZWN0KCkgKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGVsc2UgaWYgKCBzaXplb2YodXNlcnMoKSkgPj0gMTk4ICYmICFJU19BUkNIKGxvZ2lubmFtZSkgKXsKKyAgICAgICAgd3JpdGUoICJEaWUgbWF4aW1hbGUgU3BpZWxlci0gdW5kIE1hZ2llcnphaGwgd3VyZGUgYmVyZWl0cyBlcnJlaWNodCEhISIKKyAgICAgICAgICAgICAgICJcbkF1cyB0ZWNobmlzY2hlbiBHcnVlbmRlbiBkdWVyZmVuIHNpY2ggbnVyIG5vY2ggRXJ6bWFnaWVyICIKKyAgICAgICAgICAgICAgICJlaW5sb2dnZW4uXG5WZXJzdWNoIGVzIHNwYWV0ZXIgbm9jaCBlaW5tYWwgLi4uXG4iICk7CisgICAgICAgIGRlc3RydWN0KCB0aGlzX29iamVjdCgpICk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIGlmICggZmlsZV9zaXplKCIvZXRjL05PTE9HSU4iKT49MCApCisgICAgeworICAgICAgaWYgKGZpbGVfc2l6ZSgiL2V0Yy9OT0xPR0lOLmluZm8iKT4wKSB7CisgICAgICAgIC8vTk9MT0dJTi5pbmZvIGVudGhhZWx0IGV2dGwuIHdlaXRlcmdlaGVuZGUgSW5mb3JtYXRpb25lbiBmdWVyIAorICAgICAgICAvL1NwaWVsZXIsIHouQi4gdm9ycmF1c3MuIFdpZWRlcnZlcmZ1ZWdiYXJrZWl0LgorICAgICAgICB3cml0ZShicmVha19zdHJpbmcocmVhZF9maWxlKCIvZXRjL05PTE9HSU4uaW5mbyIpLDc4LCIiLAorICAgICAgICAgICAgICBCU19MRUFWRV9NWV9MRlN8QlNfU0lOR0xFX1NQQUNFKSk7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgLy9zb25zdCBTdGFuZGFyZG1lbGR1bmcgYXVzZ2ViZW4uCisgICAgICAgIHdyaXRlICgiXG5BdWZncnVuZCB2b24gdGVjaG5pc2NoZW4gUHJvYmxlbWVuIGlzdCBkYXMgRWlubG9nZ2VuIGlucyAiCisgICAgICAgICAgICAgICAgTVVETkFNRSIgenVyIFxuWmVpdCBuaWNodCBtb2VnbGljaC4gQml0dGUgdmVyc3VjaCBlcyAiCisgICAgICAgICAgICAgICAgICAgICAgInNwYWV0ZXIgbm9jaCBlaW5tYWwuXG5cbiIpOworICAgICAgfQorICAgICAgaWYgKCBJU19BUkNIKGxvZ2lubmFtZSkgfHwgCisgICAgICAgICAgIG1lbWJlcihleHBsb2RlKHJlYWRfZmlsZSgiL2V0Yy9OT0xPR0lOIil8fCIiLCJcbiIpLAorICAgICAgICAgICAgICAgICAgbG9naW5uYW1lKSE9LTEgKQorICAgICAgeworICAgICAgICB3cml0ZSgiSW0gTW9tZW50IGtvZW5uZW4gbnVyIEVyem1hZ2llciBlaW5sb2dnZW4uIFVtIFNwaWVsZXIgIgorICAgICAgICAgICAgICAid2llZGVyIGlucyBTcGllbCB6dSBsYXNzZW4sIG11c3MgZGllIERhdGVpICcvZXRjL05PTE9HSU4nICIKKyAgICAgICAgICAgICAgImdlbG9lc2NodCB3ZXJkZW4uXG5cbiAiKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGRlc3RydWN0KCB0aGlzX29iamVjdCgpICk7CisgICAgICAgIHJldHVybiAxOyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgfQorICAgIH0KKworICAgIGlmICggZ3Vlc3RmbGFnICl7CisgICAgICAgIGlmICggY2F0Y2goZ3Vlc3RmbGFnID0gKGludClHVUVTVE1BU1RFUi0+bmV3X2d1ZXN0KCk7cHVibGlzaCkgCisgICAgICAgICAgICAgfHwgIWd1ZXN0ZmxhZyApeworICAgICAgICAgICAgd3JpdGUoICJEZXJ6ZWl0IGlzdCBrZWluIEdhc3Rsb2dpbiBtb2VnbGljaCFcbiIgKTsKKyAgICAgICAgICAgIGRlc3RydWN0KCB0aGlzX29iamVjdCgpICk7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorCisgICAgICAgIGxvZ2lubmFtZSA9ICJnYXN0IiArIGd1ZXN0ZmxhZzsKKyAgICAgICAgY2FwX25hbWUgPSBjYXBpdGFsaXplKGxvZ2lubmFtZSk7CisgICAgICAgIG5hbWUgPSBjYXBfbmFtZTsKKworICAgICAgICBpZiAoICEob2IgPSBmaW5kX3BsYXllcihsb2dpbm5hbWUpIHx8IGZpbmRfbmV0ZGVhZChsb2dpbm5hbWUpKSApeworICAgICAgICAgICAgb2JqZWN0ICp1c2VyOworICAgICAgICAgICAgaW50IGk7CisKKyAgICAgICAgICAgIC8vIGdlZ2VuIEhvcmRlbiB2b24gR2FzdDEgLSB3ZW5uIGVpbiBHYXN0IG5vY2ggYW0gUHJvbXB0IGZ1ZXIKKyAgICAgICAgICAgIC8vIGRhcyBHZXNjaGxlY2h0IGhhZW5ndCwgaXN0IGVyIHVlYmVyIGZpbmRfcGxheWVyKCkgbm9jaCBuaWNodAorICAgICAgICAgICAgLy8genUgZmluZGVuIC4uLgorICAgICAgICAgICAgZm9yICggaSA9IHNpemVvZih1c2VyID0gdXNlcnMoKSAtICh7IDAsIHRoaXNfb2JqZWN0KCkgfSkpOyBpLS07ICkKKyAgICAgICAgICAgICAgICBpZiAoIG9iamVjdF9uYW1lKHVzZXJbaV0pWzAuLjExXSA9PSAiL3N0ZC9zaGVsbHMvIiAmJgorICAgICAgICAgICAgICAgICAgICAgZ2V0dWlkKHVzZXJbaV0pID09IGxvZ2lubmFtZSApeworICAgICAgICAgICAgICAgICAgICBvYiA9IHVzZXJbaV07CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICggb2IgKXsKKyAgICAgICAgICAgIHRlbGxfb2JqZWN0KCBvYiwgIkVpbiBhbmRlcmVyIFNwaWVsZXIgbW9lY2h0ZSBkaWVzZW4gR2FzdHp1Z2FuZyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgImpldHp0IGJlbnV0emVuLiBXZW5uIGVzIERpciBoaWVyXG5nZWZhbGxlbiBoYXQsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAidWViZXJsZWcgRGlyIGRvY2ggZWluZW4gQ2hhcmFrdGVybmFtZW4gdW5kIGtvbW0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICJ1bnRlciBkaWVzZW1cbk5hbWVuIHdpZWRlciFcbiIgKTsKKyAgICAgICAgICAgIGRlc3RydWN0KG9iKTsKKyAgICAgICAgfQorCisgICAgICAgIGxvYWRfcGxheWVyX29iXzIoICJzdGQvc2hlbGxzL2h1bWFuIiwgZ3Vlc3RmbGFnICk7CisKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiBUZXN0IGlmIHdlIGFyZSBhbHJlYWR5IHBsYXlpbmcgKi8KKyAgICAgICAgd2FzX2ludGVyYWN0aXZlID0gMDsKKyAgICAgICAgb2IgPSBmaW5kX3BsYXllcihsb2dpbm5hbWUpIHx8IGZpbmRfbmV0ZGVhZChsb2dpbm5hbWUpOworCisgICAgICAgIGlmIChvYikgeworICAgICAgICAgICAgd3JpdGUoICJEdSBuaW1tc3Qgc2Nob24gYW0gU3BpZWwgdGVpbCFcbiIgKTsKKyAgICAgICAgICAgIHdyaXRlKCAiVmVyd2VuZGUgRGVpbmUgYWx0ZSBzdGVyYmxpY2hlIEh1ZWxsZSAuLi5cbiIgKTsKKworICAgICAgICAgICAgaWYgKCBpbnRlcmFjdGl2ZShvYikgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIFRoZSBvdGhlciBvYmplY3QgaXMgc3RpbGwgaW50ZXJhY3RpdmU7IHJlY29ubmVjdCB0aGF0ICJzb3VsIgorICAgICAgICAgICAgICAgICAgIHRvIGEgZHVtbXkgb2JqZWN0IGFuZCBkZXN0cnVjdCB0aGF0LCB0aHVzIGRpc2Nvbm5lY3RpbmcgdGhlCisgICAgICAgICAgICAgICAgICAgb3RoZXIgcHJvYmFibHkgbGlua2RlYWQgdXNlci4gVGhlIHJlYWwgImJvZHkiIGlzIHN0aWxsCisgICAgICAgICAgICAgICAgICAgdGhlcmUgZm9yIHJlY29ubmVjdGluZyBieSBsb2dpbi5jICovCisgICAgICAgICAgICAgICAgcmVtb3ZlX2ludGVyYWN0aXZlKG9iKTsKKyAgICAgICAgICAgICAgICB3YXNfaW50ZXJhY3RpdmUgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gV2VubiBJbnZpc2xvZ2luLCBQX0lOVklTIHNldHplbi4KKyAgICAgICAgICAgIGlmICggaW52aXMgJiYgSVNfV0laQVJEKG9iKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb2ItPlNldFByb3AoIFBfSU5WSVMsIG9iLT5RdWVyeVByb3AoUF9BR0UpICk7CisgICAgICAgICAgICAgICAgdGVsbF9vYmplY3QoIG9iLCAiRFUgQklTVCBVTlNJQ0hUQkFSIVxuIiApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogTm93IHJlY29ubmVjdCB0byB0aGUgb2xkIGJvZHkgKi8KKyAgICAgICAgICAgIGV4ZWMoIG9iLCB0aGlzX29iamVjdCgpICk7CisgICAgICAgICAgICBvYi0+c2V0X3JlYWxpcChyZWFsaXApOworICAgICAgICAgICAgaWYgKCAoKGludClvYi0+UXVlcnlQcm9wKFBfTEVWRUwpKSA9PSAtMSApCisgICAgICAgICAgICAgICAgb2ItPnN0YXJ0X3BsYXllciggY2FwX25hbWUgKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBvYi0+UmVjb25uZWN0KCB3YXNfaW50ZXJhY3RpdmUgKTsKKworICAgICAgICAgICAgY2FsbF9vdXQoICJyZW1vdmUiLCAyICk7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIHJlYWQgcGxheWVyIG9iamVjdCBmcm9tIHBhc3N3ZCBmaWxlICovCisgICAgaWYgKCBzdHJpbmdwKHNoZWxsKSAmJiBzaGVsbCAhPSAiIiApCisgICAgICAgIGxvYWRfcGxheWVyX29iXzIgKCBzaGVsbCwgMCApOworICAgIGVsc2UKKyAgICAgICAgc2VsZWN0X3JhY2UoKTsKKworICAgIHJldHVybiAxOworfQorCisKK3N0YXRpYyB2b2lkIGxvYWRfcGxheWVyX29iXzIoIHN0cmluZyBvYm5hbWUsIGludCBndWVzdGZsYWcgKQoreworICAgIG9iamVjdCBibHVlcHJpbnQ7CisgICAgc3RyaW5nIGVyciwgb2JfbmFtZTsKKyAgICBvYmplY3Qgb2IsIG9sZF9vYjsKKworICAgIGlmICghaW50ZXJhY3RpdmUoKSkgeworICAgICAgZGVzdHJ1Y3QodGhpc19vYmplY3QoKSk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIC8qIHN0YXJ0IHBsYXllciBhY3Rpdml0eSAqLworICAgIGxvZ19maWxlKCAiRU5URVIiLCBzcHJpbnRmKCAiJS0xMXMgJXMsICUtMTVzICglcykuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBpdGFsaXplKG5hbWUpLCBjdGltZSh0aW1lKCkpWzQuLjE1XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlfaXBfbnVtYmVyKHRoaXNfb2JqZWN0KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeV9pcF9uYW1lKHRoaXNfb2JqZWN0KCkpICksIDIwMDAwMCApOworCisgICAgc2V0ZXVpZChsb2dpbm5hbWUpOworCisgICAgLyogbG9hZCB0aGUgInJlYWwiIHBsYXllciBvYmplY3QgKi8KKyAgICAvKiBJZiBzb21lIGFzc2hvbGUgaGFzIG1vdmVkIHRoZSBibHVlcHJpbnQgKi8KKyAgICBpZiAoIG9iamVjdHAoYmx1ZXByaW50ID0gZmluZF9vYmplY3Qob2JuYW1lKSkgICYmIGVudmlyb25tZW50KGJsdWVwcmludCkgKQorICAgICAgICBkZXN0cnVjdChibHVlcHJpbnQpOworCisgICAgaWYgKCBlcnIgPSBjYXRjaChvYiA9IGNsb25lX29iamVjdChvYm5hbWUpO3B1Ymxpc2gpICl7CisgICAgICAgIGxvZ19maWxlKCAiU0hFTExTIiwgIkZhaWxlZCB0byBsb2FkIHNoZWxsICIgKyBvYm5hbWUgKyAiLCAiICsKKyAgICAgICAgICAgICAgICAgIGR0aW1lKHRpbWUoKSkgKyAiLCAiICsgbG9naW5uYW1lICsgIlxuIiArIGVyciArICJcblxuIiApOworCisgICAgICAgIHdyaXRlKCAiS29ubnRlIGRhcyBwYXNzZW5kZSBQbGF5ZXJvYmpla3QgbmljaHQgbGFkZW4uIExhZGUgIgorICAgICAgICAgICAgICAgInN0YXR0ZGVzc2VuXG5kYXMgT2JqZWt0IE1lbnNjaC4gQklUVEUgRVJaTUFHSUVSICIKKyAgICAgICAgICAgICAgICJCRU5BQ0hSSUNIVElHRU4gIVxuIiApOworICAgICAgICBlcnIgPSBjYXRjaChvYiA9IGNsb25lX29iamVjdCgiL3N0ZC9zaGVsbHMvaHVtYW4iKTtwdWJsaXNoKTsKKyAgICB9CisKKyAgICBpZiAoICFvYiB8fCBlcnIgKSB7CisgICAgICAgIHdyaXRlKCAiRXJyb3Igb24gbG9hZGluZyAiICsgc2hlbGwgKyAiXG5FcnJvciA9ICIgKyBlcnIgKyAiXG4iICk7CisgICAgICAgIGRlc3RydWN0KCB0aGlzX29iamVjdCgpICk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIGd1ZXN0ZmxhZyApCisgICAgICAgIGNhdGNoKCBHVUVTVE1BU1RFUi0+c2V0X2d1ZXN0KCBndWVzdGZsYWcsIG9iICk7cHVibGlzaCApOworCisgICAgb2JfbmFtZSA9IGV4cGxvZGUoIG9iamVjdF9uYW1lKG9iKSwgIiMiIClbMF07CisKKyAgICBpZiAoIHNpemVvZihvYl9uYW1lKSA+IDExICYmIG9iX25hbWVbMC4uMTFdID09ICIvc3RkL3NoZWxscy8iICkKKyAgICAgICAgb2JfbmFtZSA9IG9iX25hbWVbMTEuLl07CisKKyAgICBvYl9uYW1lID0gb2JfbmFtZSArICI6IiArIGxvZ2lubmFtZTsKKworICBpZiggIWd1ZXN0ZmxhZyApCisgIHsKKyAgICAgIGlmICggb2xkX29iID0gZmluZF9vYmplY3Qob2JfbmFtZSkgKQorICAgICAgeworICAgICAgICAgIGNhdGNoKG9sZF9vYi0+cmVtb3ZlKCk7cHVibGlzaCk7CisKKyAgICAgICAgICBpZiAoIG9sZF9vYiApCisgICAgICAgICAgICAgIGRlc3RydWN0KCBvbGRfb2IgKTsKKyAgICAgIH0KKyAgICAgIHJlbmFtZV9vYmplY3QoIG9iLCBvYl9uYW1lICk7CisgICAgICBvYi0+X19yZWxvYWRfZXhwbG9yZSgpOworICB9CisgIGV4ZWMoIG9iLCB0aGlzX29iamVjdCgpICk7CisgIG9iLT5zZXRfcmVhbGlwKHJlYWxpcCk7CisgIG9iLT5zdGFydF9wbGF5ZXIoIGNhcF9uYW1lICk7CisgIC8vSGlud2VpczogRGFzIFNwaWVsZXJvYmpla3QgaG9sdCBzaWNoIGluIHVwZGF0ZXNfYWZ0ZXJfcmVzdG9yZSgpIHZvbiBoaWVyCisgIC8vZGVuIFN0YXR1cyB2b24gaW52aXMgdW5kIHNldHp0IGdnZi4gUF9JTlZJUworCisgIC8vIFRPRE86IFByb3AgcmF1c3dlcmZlbiB1bmQgaW4gU3BpZWxlcm4gU0FWRSBlbnRmZXJuZW4sIHdlbm4gZGllIGZvbGdlbmRlbgorICAvLyBWZXJ3ZW5kdW5nZW4gZW50c29yZ3Qgc2luZDoKKyAgLy8gL2Qvd3Vlc3RlL2hpcnVkby9nb2xkc3RyYW5kL3Jvb21zL2dlZmFlbmduaXMuYworICAvLyAvZC9pbnNlbG4vdGlsbHkvZmV1ZXJpbnNlbC9vYmovZm9ybXVsYXIuYworICAvLyAvZC9wb2xhci9maWxlcy5jaGFvcy90aWxseS9vYmovZG9zZV9vYmouYworICBvYi0+U2V0UHJvcCggImNyZWF0aW9uX2RhdGUiLCBjcmVhdGlvbl9kYXRlICk7CisgIG9iLT5TZXQoICJjcmVhdGlvbl9kYXRlIiwgU0FWRXxTRUNVUkVEfFBST1RFQ1RFRCwgRl9NT0RFX0FTICk7CisgIC8vIHdlbm4gZGVyIFNwaWVsZXIgbm9jaCBuaWNodCBpbSBNdWQgZ2VzcGllbHQgaGF0LCB3aXJkIGRpZSBha3R1ZWxsZSBaZWl0CisgIC8vIGluIGRpZSBlbnRzcHJlY2hlbmRlIFByb3AgZ2VzY2hyaWViZW4uIERpZSBQcm9wIGlzdCB0cmFuc2llbnQgdW5kIHdpcmQKKyAgLy8gYWJzaWNodGxpY2ggbmljaHQgZ2VzcGVpY2hlcnQuCisgIGlmIChuZXdiaWUpCisgICAgb2ItPlNldFByb3AoIl9saWJfbXVkX25ld2JpZSIsIGNyZWF0aW9uX2RhdGUpOworCisgIGRlc3RydWN0KCB0aGlzX29iamVjdCgpICk7Cit9CisKKworLyoKKyAqICAgV2l0aCBhcmcgPSAwIHRoaXMgZnVuY3Rpb24gc2hvdWxkIG9ubHkgYmUgZW50ZXJlZCBvbmNlIQorICovCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKQoreworICAgIGxvZ2lubmFtZSA9ICJsb2dvbiI7CisgICAgY3JlYXRpb25fZGF0ZSA9IC0xOworICAgIGNhdGNoKCBsb2FkX29iamVjdCggIi9zZWN1cmUvbWVybGluIik7cHVibGlzaCApOworICAgIGxvZ2luZmFpbHMgPSAwOworICAgIHJlYWxpcD0iIjsKKyAgICBpZiAoY2xvbmVwKCkpCisgICAgICBzZXRfbmV4dF9yZXNldCg5MDApOworICAgIGVsc2UKKyAgICAgIHNldF9uZXh0X3Jlc2V0KC0xKTsKK30KKwordm9pZCByZXNldCgpCit7CisgIGlmIChjbG9uZXAoKSkKKyAgICByZW1vdmUoKTsKK30KKworcHVibGljIHN0cmluZyBzaG9ydCgpCit7CisgICAgcmV0dXJuICI8RWlubG9nZ2VuZGVyIFRlaWxuZWhtZXI+LlxuIjsKK30KKworCitwdWJsaWMgc3RyaW5nIHF1ZXJ5X3JlYWxfbmFtZSgpCit7CisgICAgcmV0dXJuICI8bG9nb24+IjsKK30KKworCitwdWJsaWMgbm9tYXNrIGludCBxdWVyeV9wcmV2ZW50X3NoYWRvdygpCit7CisgICAgcmV0dXJuIDE7Cit9CisKKworc3RhdGljIHZvaWQgdGltZV9vdXQoKQoreworICAgIGlmICh0aGlzX3BsYXllcigpKQorICAgICAgdGVsbF9vYmplY3QodGhpc19wbGF5ZXIoKSwiVGltZSBvdXQhIik7CisgICAgZGVzdHJ1Y3QoIHRoaXNfb2JqZWN0KCkgKTsKK30KKworCisvLyBXaXJkIHZvbiBzaW11bF9lZnVucyBiZW51dHp0LCB1bSBuZW4gZHVtbXktU3BpZWxlcm9iamVrdCB6dSBlcnpldWdlbi4gTmljaHQKKy8vIGltIExvZ2lucHJvemVzcyBpbnZvbHZpZXJ0LgorcHVibGljIG1peGVkIG5ld19sb2dvbiggc3RyaW5nIHN0cikKK3sKKyAgICBzZXRldWlkKGdldHVpZCgpKTsgLy8gc29uc3QgZnVua3QgQVJDSF9TRUNVUklUWSBuaWNodAorCisgICAgaWYgKCAhQVJDSF9TRUNVUklUWSB8fCBwcm9jZXNzX2NhbGwoKSApeworICAgICAgICB3cml0ZSggIk51ciBmdWVyIEVyem1hZ2llciBlcmxhdWJ0IVxuIiApOworICAgICAgICBkZXN0cnVjdCggdGhpc19vYmplY3QoKSApOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKCAhc3RyIHx8IHN0ciA9PSAiIiApeworICAgICAgICB3cml0ZSggIktlaW4gTmFtZSBhbmdlZ2ViZW4hXG4iICk7CisgICAgICAgIGRlc3RydWN0KCB0aGlzX29iamVjdCgpICk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHN0ciA9IGxvd2VyX2Nhc2Uoc3RyKTsKKyAgICBjYXBfbmFtZSA9IGNhcGl0YWxpemUoc3RyKTsKKworICAgIGxvZ2lubmFtZSA9IHN0cjsKKyAgICBzZXRldWlkKFJPT1RJRCk7CisKKyAgICAvKiByZWFkIHRoZSBzZWN1cmUgc2F2ZSBmaWxlIHRvIHNlZSBpZiBjaGFyYWN0ZXIgYWxyZWFkeSBleGlzdHMgKi8KKyAgICBpZiAoICFyZXN0b3JlX29iamVjdCggbWFzdGVyKCktPnNlY3VyZV9zYXZlZmlsZShsb2dpbm5hbWUpICkgKXsKKyAgICAgICAgd3JpdGUoICJLZWluIHNvbGNoZXIgU3BpZWxlciFcbiIgKTsKKyAgICAgICAgZGVzdHJ1Y3QoIHRoaXNfb2JqZWN0KCkgKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICB3cml0ZSggIk9rLCBkZXIgU3BpZWxlciAiICsgY2FwaXRhbGl6ZShzdHIpICsgIiBleGlzdGllcnQhXG4iICk7CisgICAgICAgIHJldHVybiBuZXdfbG9hZF9wbGF5ZXJfb2JqZWN0KCk7CisgICAgfQorfQorCisvLyBXaXJkIHZvbiBzaW11bF9lZnVucyBiZW51dHp0LCB1bSBuZW4gZHVtbXktU3BpZWxlcm9iamVrdCB6dSBlcnpldWdlbi4gTmljaHQKKy8vIGltIExvZ2lucHJvemVzcyBpbnZvbHZpZXJ0Lgorc3RhdGljIG1peGVkIG5ld19sb2FkX3BsYXllcl9vYmplY3QoKQoreworICAgIGlmICggZmluZF9wbGF5ZXIobG9naW5uYW1lKSB8fCBmaW5kX25ldGRlYWQobG9naW5uYW1lKSApeworICAgICAgICB3cml0ZSggIkRlciBTcGllbGVyIGlzdCBiZXJlaXRzIG9ubGluZSBvZGVyIG5ldHp0b3QhXG4iICk7CisgICAgICAgIGRlc3RydWN0KCB0aGlzX29iamVjdCgpICk7CisgICAgICAgIHJldHVybiAyOworICAgIH0KKworICAgIC8qIHJlYWQgcGxheWVyIG9iamVjdCBmcm9tIHBhc3N3ZCBmaWxlICovCisgICAgaWYgKCBzdHJpbmdwKHNoZWxsKSAmJiBzaGVsbCAhPSAiIiApCisgICAgICAgIHJldHVybiBuZXdfbG9hZF9wbGF5ZXJfb2JfMiggc2hlbGwgKTsKKyAgICBlbHNlIHsKKyAgICAgICAgd3JpdGUoICJLZWluZSBTaGVsbCBhbmdlZ2ViZW4hXG4iICk7CisgICAgICAgIGRlc3RydWN0KCB0aGlzX29iamVjdCgpICk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KK30KKworLy8gV2lyZCB2b24gc2ltdWxfZWZ1bnMgYmVudXR6dCwgdW0gbmVuIGR1bW15LVNwaWVsZXJvYmpla3QgenUgZXJ6ZXVnZW4uIE5pY2h0CisvLyBpbSBMb2dpbnByb3plc3MgaW52b2x2aWVydC4KK3N0YXRpYyBtaXhlZCBuZXdfbG9hZF9wbGF5ZXJfb2JfMiggc3RyaW5nIG9ibmFtZSApCit7CisgICAgb2JqZWN0IGJsdWVwcmludDsKKyAgICBzdHJpbmcgZXJyLCBvYl9uYW1lOworICAgIG9iamVjdCBvYiwgb2xkX29iOworCisgICAgc2V0ZXVpZChsb2dpbm5hbWUpOworCisgICAgLyogbG9hZCB0aGUgInJlYWwiIHBsYXllciBvYmplY3QgKi8KKyAgICAvKiBJZiBzb21lIGFzc2hvbGUgaGFzIG1vdmVkIHRoZSBibHVlcHJpbnQgKi8KKyAgICBpZiAoIG9iamVjdHAoYmx1ZXByaW50ID0gZmluZF9vYmplY3Qob2JuYW1lKSkgJiYgZW52aXJvbm1lbnQoYmx1ZXByaW50KSApCisgICAgICAgIGRlc3RydWN0KCBibHVlcHJpbnQgKTsKKworICAgIGVyciA9IGNhdGNoKG9iID0gY2xvbmVfb2JqZWN0KG9ibmFtZSk7cHVibGlzaCk7CisKKyAgICBpZiAoIGVyciApeworICAgICAgICBsb2dfZmlsZSggIlNIRUxMUyIsICJGYWlsZWQgdG8gbG9hZCBzaGVsbCAiICsgb2JuYW1lICsgIiwgIiArCisgICAgICAgICAgICAgICAgICBkdGltZSh0aW1lKCkpICsgIiwgIiArIGxvZ2lubmFtZSArICJcbiIgKyBlcnIgKyAiXG5cbiIgKTsKKworICAgICAgICB3cml0ZSggIktvbm50ZSBkYXMgcGFzc2VuZGUgUGxheWVyb2JqZWt0IG5pY2h0IGxhZGVuLiAiCisgICAgICAgICAgICAgICAiTGFkZSBzdGF0dGRlc3NlblxuZGFzIE9iamVrdCBNZW5zY2ghXG4iICk7CisKKyAgICAgICAgZXJyID0gY2F0Y2gob2IgPSBjbG9uZV9vYmplY3QoICJzdGQvc2hlbGxzL2h1bWFuIiApO3B1Ymxpc2ggKTsKKyAgICB9CisKKyAgICBpZiAoICFvYiB8fCBlcnIgKXsKKyAgICAgICAgd3JpdGUoICJFcnJvciBvbiBsb2FkaW5nICIgKyBzaGVsbCArICJcbkVycm9yID0gIiArIGVyciArICJcbiIgKTsKKyAgICAgICAgZGVzdHJ1Y3QoIHRoaXNfb2JqZWN0KCkgKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgb2JfbmFtZSA9IGV4cGxvZGUoIG9iamVjdF9uYW1lKG9iKSwgIiMiIClbMF07CisKKyAgICBpZiAoIHNpemVvZihvYl9uYW1lKSA+IDExICYmIG9iX25hbWVbMC4uMTFdID09ICIvc3RkL3NoZWxscy8iICkKKyAgICAgICAgb2JfbmFtZSA9IG9iX25hbWVbMTEuLl07CisKKyAgICBvYl9uYW1lID0gb2JfbmFtZSArICI6IiArIGxvZ2lubmFtZTsKKworICAgIGlmICggb2xkX29iID0gZmluZF9vYmplY3Qob2JfbmFtZSkgKXsKKyAgICAgICAgY2F0Y2goIG9sZF9vYi0+cmVtb3ZlKCk7IHB1Ymxpc2ggKTsKKworICAgICAgICBpZiAoIG9sZF9vYiApCisgICAgICAgICAgICBkZXN0cnVjdCggb2xkX29iICk7CisgICAgfQorCisgICAgcmVuYW1lX29iamVjdCggb2IsIG9iX25hbWUgKTsKKyAgICBvYi0+X19yZWxvYWRfZXhwbG9yZSgpOworICAgIG9iLT5zZXRfcmVhbGlwKHJlYWxpcCk7CisgICAgb2ItPnN0YXJ0X3BsYXllcihjYXBfbmFtZSk7CisgICAgb2ItPlNldFByb3AoICJjcmVhdGlvbl9kYXRlIiwgY3JlYXRpb25fZGF0ZSApOworICAgIG9iLT5TZXQoICJjcmVhdGlvbl9kYXRlIiwgU0FWRXxTRUNVUkVEfFBST1RFQ1RFRCwgRl9NT0RFX0FTICk7CisKKyAgICBvYi0+bW92ZSggIi9yb29tL25vd2hlcmUiLCBNX05PQ0hFQ0sgKTsKKyAgICBzZXRfb2JqZWN0X2hlYXJ0X2JlYXQoIG9iLCAwICk7CisgICAgZGVzdHJ1Y3QoIHRoaXNfb2JqZWN0KCkgKTsKKworICAgIHJldHVybiBvYjsKK30KKworc3RyaW5nIHF1ZXJ5X3JlYWxpcCgpCit7CisgIHJldHVybiByZWFsaXAgPyByZWFsaXAgOiAiIjsKK30KKworaW50IHF1ZXJ5X2ludmlzKCkKK3sKKyAgcmV0dXJuIGludmlzOworfQorCmRpZmYgLS1naXQgYS9zZWN1cmUvbWFpbGVyLmMgYi9zZWN1cmUvbWFpbGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTkwMWZhYwotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9tYWlsZXIuYwpAQCAtMCwwICsxLDYzMiBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIG1haWxlci5jCisvLworLy8gJElkOiBtYWlsZXIuYyA5NTQ3IDIwMTYtMDQtMTcgMTk6Mjc6NDdaIFplc3N0cmEgJAorCisvKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFRoZSBtYWlsIGRlbW9uLiBSZWNlaXZlcyBtYWlsIGZyb20gdXNlcnMgYW5kIGRlbGl2ZXJzIGl0IGludG8KKyAqIHRoZSBtYWlsIGRpcmVjdG9yeS4KKyAqCisgKiBEZWVwdGhvdWdodCwgTmlnaHRmYWxsLCAyNS1NYXktOTIKKyAqIFJlbW92ZS1GdW5jdGlvbnMgOiBKb2YsIDI5LUp1bmUtOTIKKyAqIENhY2hpbmcsIERlbGV0ZVVucmVhZEZvbGRlciwgc21hbGwgY2hhbmdlczogTG9jbywgMDgtRmViLTk3CisgKiBHZW5lcmFsIGNsZWFuLXVwIGFuZCBzcGVlZC11cDogVGlhbWFrLCAxOC1KYW4tMjAwMAorICogICBET04nVCBVU0UgcmVzdG9yZV9vYmplY3QgYW55IG1vcmUsIHVzZSBHZXRGb2xkZXJzIGluc3RlYWQhCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqICAgICBTYXZlIGZpbGUgZm9ybWF0IChzb3J0IG9mIGZvcm1hbCBub3RhdGlvbik6CisgKgorICogICAgIG1peGVkICpmb2xkZXJzID0gKHsKKyAqICAgICAgICAoeyBzdHJpbmcgbmFtZTE7IHN0cmluZyBuYW1lMjsgLi4uIHN0cmluZyBuYW1lTjsgfSkKKyAqICAgICAgICAoeyBtaXhlZCAqbXNnczE7IG1peGVkICptc2dzMjsgLi4uIG1peGVkICptc2dzTjsgfSkKKyAqICAgICB9KQorICoKKyAqICAgICBFYWNoIG1zZ3MgZmllbGQgaXMgYW4gYXJyYXkgb2YgbWVzc2FnZXM6CisgKgorICogICAgIG1peGVkICptc2dzID0gKHsgbWl4ZWQgKm1lc3NhZ2UxOyAuLi4gbWl4ZWQgKm1lc3NhZ2VNIH0pCisgKgorICogICAgIEEgbWVzc2FnZSBpcyByZXByZXNlbnRlZCBhcyBhbiBhcnJheSB3aXRoIHRoZSBmb2xsb3dpbmcgZmllbGRzOgorICoKKyAqICAgICBtaXhlZCAqbWVzc2FnZSA9ICh7CisgKiAgICAgICAgc3RyaW5nIGZyb207CisgKiAgICAgICAgc3RyaW5nIHNlbmRlcjsKKyAqICAgICAgICBzdHJpbmcgcmVjaXBpZW50OworICogICAgICAgIHN0cmluZyAqY2M7CisgKiAgICAgICAgc3RyaW5nICpiY2M7CisgKiAgICAgICAgc3RyaW5nIHN1YmplY3Q7CisgKiAgICAgICAgc3RyaW5nIGRhdGU7CisgKiAgICAgICAgc3RyaW5nIGlkOworICogICAgICAgIHN0cmluZyBib2R5OworICogICAgIH0pCisgKgorICogICAgIFRoZSBtYWlsZXIgZGVtb24gKC9zZWN1cmUvbWFpbGVyKSBwcm92aWRlcyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uczoKKyAqCisgKiAgICAgc3RyaW5nICpEZWxpdmVyTWFpbChtaXhlZCAqbWVzc2FnZSkKKyAqICAgICAgIEhhbmQgYSBtYWlsIG1lc3NhZ2Ugb3ZlciB0byB0aGUgbWFpbGVyIGRlbW9uLiBUaGUgbWFpbGVyCisgKiAgICAgICBkZW1vbiBleHRyYWN0cyByZWNpcGllbnRzIGZyb20gdGhlIHJlY2lwaWVudCwgY2MgYW5kIGJjYworICogICAgICAgZmllbGRzIGFuZCByZW1vdmVzIHRoZSBiY2MgaW5mb3JtYXRpb24uIEl0IHRoZW4gZGVwb3NpdHMKKyAqICAgICAgIHRoZSBtZXNzYWdlIHRvIHRoZSBtYWlsIGZpbGVzIG9mIGFsbCByZWNpcGllbnRzLiBBIHZhbGlkCisgKiAgICAgICBtZXNzYWdlIGlzIHNob3duIGFib3ZlLiBSZXR1cm5zIGEgbGlzdCBvZiBzdWNjZXNzZnVsbHkKKyAqICAgICAgIGRlbGl2ZXJlZCByZWNpcGllbnRzLgorICoKKyAqICAgICBpbnQgRmluZ2VyTWFpbChzdHJpbmcgdXNlcikKKyAqICAgICAgIEdpdmVzIHRoZSBudW1iZXIgb2YgdW5yZWFkIG1lc3NhZ2VzIGEgdXNlciBoYXMuCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisjcHJhZ21hIHN0cmljdF90eXBlcworI3ByYWdtYSBub19jbG9uZQorI3ByYWdtYSBub19zaGFkb3cKKyNwcmFnbWEgbm9faW5oZXJpdAorI3ByYWdtYSB2ZXJib3NlX2Vycm9ycworI3ByYWdtYSBwZWRhbnRpYworI3ByYWdtYSB3YXJuX2RlcHJlY2F0ZWQKKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPG1haWwuaD4KKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKworLy8gZGVidWdnaW5nCisjZGVmaW5lIERFQlVHKG1zZykgaWYgKCBmaW5kX3BsYXllcigiemVzc3RyYSIpICkgXAorICAgICAgICAgICAgICAgICAgICAgIHRlbGxfb2JqZWN0KCBmaW5kX3BsYXllcigiemVzc3RyYSIpLCAiTUFJTEVSOiAiK21zZyApCisjdW5kZWYgREVCVUcKKyNkZWZpbmUgREVCVUcoeCkKKworLy8gd3JpdGUgb3V0IGEgbWVzc2FnZSB0byB0aGUgcmVjaXBpZW50CisjZGVmaW5lIE5PVElGWV9SRUNJUElFTlQKKy8vIHdobyBnZXRzIHVuZGVsaXZlcmFibGUgbWFpbD8KKyNkZWZpbmUgQk9VTkNFX0FERFIgICAibXVkQG1nLm11ZC5kZSIKKyNkZWZpbmUgU0VDVVJJVFkoeCkgICAoZ2V0ZXVpZCh4KSA9PSBST09USUQgfHwgZ2V0ZXVpZCh4KSA9PSBNQUlMSUQpCisvLyBmbGFnIGZvciBfRGVsaXZlck1haWwKKyNkZWZpbmUgTUFJTF9ERUxBWUVEICAgNDA5NgorCisvLyBwcm90b3R5cGVzCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKTsKK3N0YXRpYyBpbnQgR2V0Rm9sZGVycyggc3RyaW5nIHVzZXIgKTsKK3N0YXRpYyBzdHJpbmcgX3VuaWZ5KCBzdHJpbmcgc3RyICk7CitzdGF0aWMgc3RyaW5nICp1bmlmeSggc3RyaW5nICpzdHIgKTsKK3N0YXRpYyBzdHJpbmcgKmV4cGFuZCggc3RyaW5nICphZGRyLCBpbnQgZXhwYSApOworc3RhdGljIHN0cmluZyBfZmlsdGVyX2FkZHIoIHN0cmluZyBhZGRyICk7CitwdWJsaWMgc3RyaW5nICpEZWxpdmVyTWFpbCggbWl4ZWQgbXNnLCBpbnQgZXhwYSApOworcHVibGljIGludCBGaW5nZXJNYWlsKCBzdHJpbmcgdXNlciApOworc3RhdGljIHZvaWQgc2F2ZV9tc2coIG1peGVkIG1zZywgc3RyaW5nIHVzZXIgKTsKK3B1YmxpYyBpbnQgUmVtb3ZlTXNnKCBpbnQgbXNnLCBpbnQgZm9sZGVyLCBzdHJpbmcgdXNlciApOworcHVibGljIGludCBNb3ZlTXNnKCBpbnQgbXNnLCBpbnQgZm9sZGVyLCBzdHJpbmcgbmV3Zm9sZGVyLCBzdHJpbmcgdXNlciApOworcHVibGljIGludCBEZWxldGVVbnJlYWRGb2xkZXIoIHN0cmluZyB1c2VyICk7CitwdWJsaWMgaW50IFJlbW92ZUZvbGRlciggc3RyaW5nIGZvbGRlciwgc3RyaW5nIHVzZXIgKTsKK3B1YmxpYyBpbnQgTWFrZUZvbGRlciggc3RyaW5nIGZvbGRlciwgc3RyaW5nIHVzZXIgKTsKK3B1YmxpYyBpbnQgcXVlcnlfcmVjaXBpZW50X29rKCBzdHJpbmcgbmFtZSApOworcHVibGljIHZvaWQgZGVsaXZlcl9tYWlsKCBzdHJpbmcgcmVjaXBpZW50LCBzdHJpbmcgZnJvbSwgc3RyaW5nIHN1YmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBtYWlsX2JvZHkgKTsKKworCittaXhlZCAqZm9sZGVyczsgICAgICAgICAgICAgICAgLyogdXNlZCBmb3Igc2F2ZSBhbmQgcmVzdG9yZSBvZiBtYWlsIGZpbGVzICovCitzdGF0aWMgbWFwcGluZyBhbGlhczsKK3N0YXRpYyBzdHJpbmcgY2FjaGVkbmFtZTsgLyogd2hvc2UgZm9sZGVyIGlzIHN0aWxsIGluIG1lbW9yeT8gKi8KKworCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKQoreworICAgIG1peGVkIHRtcDsKKyAgICBpbnQgaTsKKyAgICBzdHJpbmcgczEsIHMyOworICAKKyAgICBzZXRldWlkKFJPT1RJRCk7CisgICAgYWxpYXM9KFtdKTsKKyAgICAKKyAgICBpZiAoIHRtcCA9IHJlYWRfZmlsZSgiL21haWwvc3lzdGVtLm1haWxyYyIpICl7CisgICAgICAgIHRtcCA9IGV4cGxvZGUoIHRtcCwgIlxuIiApOworICAgICAgICAKKyAgICAgICAgZm9yICggaSA9IHNpemVvZih0bXApOyBpLS07ICkKKyAgICAgICAgICAgIGlmICggc3NjYW5mKCB0bXBbaV0sICIlcyAlcyIsIHMxLCBzMiApID09IDIgKQorICAgICAgICAgICAgICAgIGFsaWFzW3MxXSA9IHMyOworICAgIH0KK30KKworCisvLyBHZXRGb2xkZXJzIGxhZWR0IGVpbmVuIGZvbGRlciwgd2VubiBlciBuaWNodCBpbSBjYWNoZSBpc3QsIHVuZCBnaWJ0CisvLyAwIHp1cnVlY2ssIHdlbm4gZGVyIGZvbGRlciBuaWNodCB2b3JoYW5kZW4gb2RlciBldnRsIGF1Y2ggbGVlciBpc3QuCisvLyBTaW5uOiBWb3IgYWxsZW0gYmVpIExpc3RlbmFyZ3VtZW50ZW4gaW0gbWFpbGVyIGthbm4gZXMgbGVpY2h0IHZvcmtvbW1lbiwKKy8vIGRhc3MgZGFzc2VsYmUgbWFpbGZpbGUgZWluaWdlIE1hbGUgaGludGVyZWluYW5kZXIgZ2VicmF1Y2h0IHdpcmQuCisKK3N0YXRpYyBpbnQgR2V0Rm9sZGVycyggc3RyaW5nIHVzZXIgKQoreworICAgIGlmICggdXNlciA9PSBjYWNoZWRuYW1lICl7CisgICAgICAgIERFQlVHKCAiVXNpbmcgY2FjaGVkIGZvbGRlciBmb3IgIiArIHVzZXIgKyAiXG4iICk7CisgICAgICAgIHJldHVybiBzaXplb2YoZm9sZGVyc1sxXSk7CisgICAgfQorICAgIAorICAgIGNhY2hlZG5hbWUgPSB1c2VyOworICAgIAorICAgIGlmICggIXJlc3RvcmVfb2JqZWN0KCBNQUlMUEFUSCArICIvIiArIHVzZXJbMC4uMF0gKyAiLyIgKyB1c2VyICkgKXsKKyAgICAgICAgREVCVUcoICJMb2FkaW5nIGZvbGRlcjogIiArIHVzZXIgKyAiIChlbXB0eSlcbiIgKTsKKyAgICAgICAgZm9sZGVycyA9ICh7ICh7fSksICh7fSkgfSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAKKyAgICBERUJVRyggIkxvYWRpbmcgZm9sZGVyOiIgKyB1c2VyICsgIlxuIiApOworICAgIHJldHVybiAxOworfQorCisKK3N0YXRpYyBzdHJpbmcgX3VuaWZ5KCBzdHJpbmcgc3RyICkKK3sKKyAgICByZXR1cm4gc3RyWzBdID09ICdcXCcgPyBzdHJbMS4uXSA6IHN0cjsKK30KKworCitzdGF0aWMgc3RyaW5nICp1bmlmeSggc3RyaW5nICpzdHIgKQoreworICAgIGlmICggIXBvaW50ZXJwKHN0cikgKQorICAgICAgICByZXR1cm4gKHt9KTsKKyAgICAKKyAgICBzdHIgPSBtYXAoIGZpbHRlciggc3RyLCAjJ3N0cmluZ3AvKicqLyApLCAjJ2xvd2VyX2Nhc2UvKicqLyApOworICAgIHN0ciA9IG1hcCggc3RyLCAiX3VuaWZ5IiwgdGhpc19vYmplY3QoKSApOworCisgICAgcmV0dXJuIG1faW5kaWNlcyggbWttYXBwaW5nKHN0cikgKTsKK30KKworCisjZGVmaW5lIE1HX05BTUVTICh7IE1VRE5BTUUsICJtZyIsICJtb3JnZW5ncmF1ZW4iLCAibXVkIiwgIm1nLm11ZC5kZSIgfSkKKworc3RyaW5nIGV4cGFuZFN5c3RlbVJlY3Vyc2l2ZShzdHJpbmcgYWRkcixpbnQgbWF4cmVjKXsKKyAgc3RyaW5nICpsaXN0LCp0bGlzdDsKKyAgc3RyaW5nIHJldCx0bXA7CisgIGludCBpLHNpemU7CisgIAorICBpZihtYXhyZWM+OCB8fCAhYWRkcil7CisgICAgcmV0dXJuIGFkZHI7CisgIH0KKyAgbWF4cmVjKys7CisgIAorICB0bGlzdD0oe30pOworICByZXQ9IiI7CisKKyAgbGlzdD1leHBsb2RlKGFkZHIsIiwiKTsKKyAgbGlzdC09KHsiIn0pOworICBzaXplPXNpemVvZihsaXN0KTsKKyAgZm9yKGk9MDtpPHNpemU7aSsrKXsKKyAgICBpZih0bXA9YWxpYXNbbGlzdFtpXV0peworICAgICAgdGxpc3QrPWV4cGxvZGUodG1wLCIsIik7CisgICAgfQorICAgIGVsc2V7CisgICAgICB0bGlzdCs9KHtsaXN0W2ldfSk7CisgICAgfQorICB9CisgIHRsaXN0LT0oeyIifSk7ICAKKyAgcmV0PWltcGxvZGUodGxpc3QsIiwiKTsKKworICBpZigocmV0IT1hZGRyKSE9MCl7CisgICAgcmV0PWV4cGFuZFN5c3RlbVJlY3Vyc2l2ZShyZXQsbWF4cmVjKTsKKyAgfQorICByZXR1cm4gcmV0OworfQorCisvLyBleHBhOiBhbHNvIGRvIGFsaWFzIGFuZCBmb3J3YXJkLWV4cGFuc2lvbj8gKGZvciBpbmJvdW5kIGV4dGVybmFsIG1haWwpCisvLyBleHBhID09IDAgbWVhbnMgZnVsbCBleHBhbnNpb24sIGtub3duIGZsYWdzIGFyZSBOT19TWVNURU1fQUxJQVNFUworLy8gYW5kIE5PX1VTRVJfQUxJQVNFUworc3RhdGljIHN0cmluZyAqZXhwYW5kKCBzdHJpbmcgKmFkZHIsIGludCBleHBhICkKK3sKKyAgICBzdHJpbmcgdG1wLCAqbmV3LCAqcmV0OworICAgIGludCBpOworICAgIGNsb3N1cmUgcWY7CisKKyAgICByZXQgPSAoe30pOworICAgIGFkZHIgLT0gKHsiIn0pOworICAgIHFmID0gc3ltYm9sX2Z1bmN0aW9uKCAiUXVlcnlGb3J3YXJkIiwgRldTRVJWICk7CisKKyAgICBmb3IgKCBpID0gc2l6ZW9mKGFkZHIpOyBpLS07ICl7CisgICAgICAgIGFkZHJbaV0gPSBsb3dlcl9jYXNlKCBhZGRyW2ldICk7CisgICAgICAgIC8vIEBtb3JnZW5ncmF1ZW4tbmFtZW4gd2VyZGVuIGxva2FsIHp1Z2VzdGVsbHQuCisgICAgICAgIGlmICggc2l6ZW9mKG5ldyA9IGV4cGxvZGUoIGFkZHJbaV0sICJAIiApKSA9PSAyICAmJgorICAgICAgICAgICAgIG1lbWJlciggTUdfTkFNRVMsIG5ld1sxXSApICE9IC0xICkKKyAgICAgICAgICAgIGFkZHJbaV0gPSBuZXdbMF07CisKKyAgICAgICAgaWYgKCAhKGV4cGEgJiBOT19TWVNURU1fQUxJQVNFUykgJiYgdG1wID0gZXhwYW5kU3lzdGVtUmVjdXJzaXZlKGFkZHJbaV0sMCkgKXsKKyAgICAgICAgICAgIHJldCArPSBleHBsb2RlKCB0bXAsICIsIiApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldCArPSAoeyBhZGRyW2ldIH0pOworICAgIH0KKyAgICAKKyAgICBmb3IgKCBpID0gc2l6ZW9mKHJldCk7IGktLTsgKXsKKyAgICAgICAgaWYgKCByZXRbaV1bMF0gPT0gJ1xcJyApCisgICAgICAgICAgICByZXRbaV0gPSByZXRbaV1bMS4uXTsKKyAgICAgICAgZWxzZSBpZiAoICEoZXhwYSAmIE5PX1VTRVJfQUxJQVNFUykgKQorICAgICAgICAgICAgcmV0ID0gcmV0IC0gKHsgcmV0W2ldIH0pICsKKyAgICAgICAgICAgICAgICBleHBsb2RlKCBmdW5jYWxsKCBxZiwgcmV0W2ldICksICIsIiApOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBzdHJpbmcgX2ZpbHRlcl9hZGRyKCBzdHJpbmcgYWRkciApCit7CisgICAgYWRkciA9IHJlZ3JlcGxhY2UoIGFkZHIsICJbXjxdKjwoLiopPltePl0qIiwgIlxcMSIsIDApOworICAgIHJldHVybiByZWdyZXBsYWNlKCBhZGRyLCAiICooW14gXVteIF0qKS4qIiwgIlxcMSIsIDApOworfQorCisjaWZkZWYgSU5URVJORVRfTUFJTF9FTkFCTEVECisjZGVmaW5lIEZPT1RFUiBcCisgICAgIlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiIgXAorICAgICIqIE1vcmdlbkdyYXVlbiBNYWlsUmVsYXkgdjEuMCAtIFByb2Nlc3NlZCAlcywgJXMgKlxuIiBcCisgICAgIiogTW9yZ2VuR3JhdWVuIC0gbWcubXVkLmRlIDIzIC0gICAgICAgICAgICAgICAgICA4Ny43OS4yNC42MCAyMyAqXG4iIFwKKyAgICAiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiCisjZW5kaWYKKworcHVibGljIHN0cmluZyAqRGVsaXZlck1haWwoIG1peGVkIG1zZywgaW50IGV4cGEgKQoreworICAgIHN0cmluZyBzZW5kZXIsICpyZWNpcGllbnRzLCAqcmVjb2ssIHQsICp0bXA7CisgICAgbWl4ZWQgKm5ld21zZzsKKyAgICBpbnQgaTsKKyNpZmRlZiBJTlRFUk5FVF9NQUlMX0VOQUJMRUQKKyAgICBpbnQgZXh0OworI2VuZGlmCisKKyAgICBpZiAoICFwb2ludGVycChtc2cpIHx8IHNpemVvZihtc2cpICE9IDkgKQorICAgICAgICByZXR1cm4gMDsKKworICAgIERFQlVHKCBzcHJpbnRmKCAiRGVsaXZlck1haWw6ICVPICVPXG4iLCBtc2dbMC4uNF0gKyh7MH0pKyBtc2dbNi4uN10sIGV4cGEgKSApOworICAgIHQgPSBjdGltZSh0aW1lKCkpOworCisgICAgLy8gT2huZSBFbXBmYWVuZ2VyIHdpcmQgYWJnZWJyb2NoZW4KKyAgICBpZiAoIXN0cmluZ3AobXNnW01TR19SRUNJUElFTlRdKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAoICEoZXhwYSAmIE1BSUxfREVMQVlFRCkgKXsKKyAgICAgICAgLyogZGV0ZXJtaW5lIHRoZSByZWFsIHNlbmRlciAqLworICAgICAgICBpZiAoIGV4dGVybl9jYWxsKCkgJiYgb2JqZWN0X25hbWUocHJldmlvdXNfb2JqZWN0KCkpWzAuLjddICE9ICIvc2VjdXJlLyIgKQorICAgICAgICAgICAgc2VuZGVyID0gZ2V0dWlkKCB0aGlzX2ludGVyYWN0aXZlKCkgfHwgcHJldmlvdXNfb2JqZWN0KCkgKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc2VuZGVyID0gbXNnW01TR19TRU5ERVJdOyAgICAgICAgCisKKyAgICAgICAgLyogbWFrZSBhIGxpc3Qgb2YgYWxsIHJlY2lwaWVudHMgKi8KKyAgICAgICAgcmVjaXBpZW50cyA9ICh7IG1zZ1tNU0dfUkVDSVBJRU5UXSB9KTsKKyAgICAgICAgCisgICAgICAgIGlmICggIShleHBhICYgTk9fQ0FSQk9OX0NPUElFUykgKXsKKyAgICAgICAgICAgIGlmICggcG9pbnRlcnAobXNnW01TR19DQ10pICkKKyAgICAgICAgICAgICAgICByZWNpcGllbnRzICs9IG1zZ1tNU0dfQ0NdOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoIHBvaW50ZXJwKG1zZ1tNU0dfQkNDXSkgKQorICAgICAgICAgICAgICAgIHJlY2lwaWVudHMgKz0gbXNnW01TR19CQ0NdOworICAgICAgICB9CisKKyAgICAgICAgLy8gTWFpbC1BbGlhc2UgZXJzZXR6ZW4KKyAgICAgICAgcmVjaXBpZW50cyA9IGV4cGFuZCggcmVjaXBpZW50cywgZXhwYSApOworICAgIAorICAgICAgICAvLyBkb3BwZWx0ZSBBZHJlc3NlbiBsb2VzY2hlbiAobmViZW5iZWk6IGF1ZiBLbGVpbnNjaHJlaWJ1bmcgd2FuZGVsbikKKyAgICAgICAgcmVjaXBpZW50cyA9IHVuaWZ5KCByZWNpcGllbnRzICk7CisgICAgCisgICAgICAgIC8vIFJlYWxuYW1lbiB1bmQgS29tbWVudGFyZSBlbnRmZXJuZW4KKyAgICAgICAgcmVjaXBpZW50cyA9IG1hcCggcmVjaXBpZW50cywgIl9maWx0ZXJfYWRkciIsIHRoaXNfb2JqZWN0KCkgKTsKKyAgICAKKyAgICAgICAgLy8gYXVmIHVuZ3VlbHRpZ2UgWmVpY2hlbiBjaGVja2VuCisgICAgICAgIGlmICggc2l6ZW9mKHRtcCA9IHJlZ2V4cCggcmVjaXBpZW50cywgIl5bLV8uQGEtejAtOV0qJCIgKSkKKyAgICAgICAgICAgICAhPSBzaXplb2YocmVjaXBpZW50cykgKXsKKyAgICAgICAgICAgIHRtcCA9IHJlY2lwaWVudHMgLSB0bXA7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGZvciAoIGkgPSBzaXplb2YodG1wKTsgaS0tOyApCisgICAgICAgICAgICAgICAgbG9nX2ZpbGUoICJNQUlMX0lOVkFMSUQiLCBzcHJpbnRmKCAiJXM6IE1haWwgdm9uICVPICglTykgYW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiclTycuXG4iLCBkdGltZSh0aW1lKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnW01TR19GUk9NXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRlciwgdG1wW2ldICkgKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgcmVjaXBpZW50cyAtPSB0bXA7CisgICAgICAgIH0KKworICAgICAvLyBjaGVjayBmb3IgdmFsaWQgU3ViamVjdCBhbmQgQm9keQorICAgICBpZiAoIXN0cmluZ3AobXNnW01TR19TVUJKRUNUXSkpCisgICAgICAgICBtc2dbTVNHX1NVQkpFQ1RdID0gIihubyBzdWJqZWN0IGdpdmVuKSI7CisgICAgIGlmICghc3RyaW5ncChtc2dbTVNHX0JPRFldKSkKKyAgICAgICAgIG1zZ1tNU0dfQk9EWV0gPQorICAgICAgICAgICAiXG5cblNvcnJ5IC0gVGhpcyBtYWlsIHdhcyBkZWxpdmVyZWQgd2l0aG91dCBhIG1haWwgYm9keVxuXG4iOworCisgICAgICAgIERFQlVHKCBzcHJpbnRmKCAiTkVFRCBUTyBERUxJVkVSIFRPICVPXG4iLCByZWNpcGllbnRzICkgKTsKKworICAgICAgICAvKiBidWlsZCB0aGUgbmV3IG1lc3NhZ2UgKi8KKyAgICAgICAgbmV3bXNnID0gKHsgbXNnW01TR19GUk9NXSwgc2VuZGVyLCBtc2dbTVNHX1JFQ0lQSUVOVF0sCisgICAgICAgICAgICAgICAgICAgICAgICBtc2dbTVNHX0NDXSwgIiIsIG1zZ1tNU0dfU1VCSkVDVF0sCisgICAgICAgICAgICAgICAgICAgICAgICBkdGltZSh0aW1lKCkpLCBNVUROQU1FICsgIjoiICsgdGltZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgbXNnW01TR19CT0RZXSB9KTsKKyAgICB9CisgICAgCisgICAgLyogU2VuZCBpdCBvZmYgLi4uICovCisgICAgcmVjb2sgPSAoeyB9KTsKKworICAgIC8vIEFDSFRVTkc6IGR1cmNoIGV4cGFuZCgpIGdlYWVuZGVydGUgQWRyZXNzZW4gd2VyZGVuIHp1Z2VzdGVsbHQsCisgICAgLy8gYWJlciBkdXJjaCAvbWFpbC9tYWlsZXIuYyB6dXNhZXR6bGljaCBhbHMgdW56dXN0ZWxsYmFyIGdlbmFubnQhCisgICAgCisgICAgZm9yICggaSA9IHNpemVvZihyZWNpcGllbnRzKTsgaS0tIC8qJiYgZ2V0X2V2YWxfY29zdCgpID4gNTAwMDAwKi87ICl7CisgICAgICAgIERFQlVHKCBzcHJpbnRmKCAiQmVnaW4gZGVsaXZlcmluZyB0byAlcy4gRXZhbGNvc3RzIGxlZnQ6ICVkLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlY2lwaWVudHNbaV0sIGdldF9ldmFsX2Nvc3QoKSApICk7CisgICAgICAgIGlmICggbWVtYmVyKCByZWNpcGllbnRzW2ldLCAnQCcgKSA+IDAgJiYKKyAgICAgICAgICAgICBzdHJzdHIoIHJlY2lwaWVudHNbaV0sICJkYWVtb24iICkgPCAwICkgeworICAgICAgICAgICAgc3RyaW5nIHJlYywgbXVkOworICAgICAgICAgICAgCisgICAgICAgICAgICB0bXAgPSBleHBsb2RlKCByZWNpcGllbnRzW2ldLCAiQCIgKTsKKyAgICAgICAgICAgIG11ZCA9IHRtcFsxXTsKKyAgICAgICAgICAgIHJlYyA9IHRtcFswXTsKKyAgICAgICAgICAgIHNlbmRlciA9IHJlZ3JlcGxhY2UoIHNlbmRlciwgIkAiLCAiJSIsIDEgKTsKKyAgICAgICAgICAgIC8vIFp1c3RlbGx1bmcgdmlhIEludGVybXVkLU1haWwgYW4gYW5kZXJlIE11ZHMuCisgICAgICAgICAgICBpZiAoIG1lbWJlciggbXVkLCAnLicgKSA9PSAtMSApIHsKKyAgICAgICAgICAgICAgICAiL3NlY3VyZS91ZHBfbWFpbCItPmRlbGl2ZXJfbWFpbCggcmVjLCBtdWQsIHNlbmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnW01TR19TVUJKRUNUXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnW01TR19CT0RZXSApOworICAgICAgICAgICAgICAgIHJlY29rICs9ICh7IHJlY2lwaWVudHNbaV0gfSk7CisgICAgICAgICAgICB9CisjaWZkZWYgSU5URVJORVRfTUFJTF9FTkFCTEVECisgICAgICAgICAgICAvLyBadXN0ZWxsdW5nIGluIGRlbiBSZXN0IGRlcyBJbnRlcm5ldHMuCisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBleHQgPSAxOworICAgICAgICAgICAgICAgIHNlbmRlciA9IGV4cGxvZGUoIHNlbmRlciwgIiUiIClbMF07CisgICAgICAgICAgICAgICAgcmVjID0gZXhwbG9kZSggcmVncmVwbGFjZSggcmVjLCAiQCIsICIlIiwgMSApLCAiJSIgKVswXTsKKyAgICAgICAgICAgICAgICBtdWQgPSBleHBsb2RlKCByZWdyZXBsYWNlKCBtdWQsICJAIiwgIiUiLCAxICksICIlIiApWzBdOworCisgICAgICAgICAgICAgICAgd3JpdGVfZmlsZSggc3ByaW50ZiggIi9tYWlsL291dGJvdW5kLyVzLiVkLSVkLSVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kZXIsIHRpbWUoKSwgaSwgcmFuZG9tKDEyMzQ1NikgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCAiJXNcbiVzQCVzXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN1YmplY3Q6ICVzXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgIlgtTVVELUZyb206ICVzXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgIlgtTVVELVRvOiAlc1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICJYLU1VRC1DYzogJXNcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiWC1NVS1TdWJqZWN0OiAlc1xuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRlciwgcmVjLCBtdWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnW01TR19TVUJKRUNUXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kZXIsIHJlY2lwaWVudHNbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlcnAobXNnW01TR19DQ10pID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsb2RlKCBtc2dbTVNHX0NDXSwgIiwiICkgOiAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2dbTVNHX1NVQkpFQ1RdICkgKyBtc2dbTVNHX0JPRFldICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCBGT09URVIsIHRbNC4uMTBdICsgdFsyMC4uXSwgdFsxMS4uMThdICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJcbiIgKTsKKyAgICAgICAgICAgICAgICByZWNvayArPSAoeyByZWNpcGllbnRzW2ldIH0pOworICAgICAgICAgICAgfQorI2VuZGlmIC8vIElOVEVSTkVUX01BSUxfRU5BQkxFRAorCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaWYgKCBmaWxlX3NpemUoIFNBVkVQQVRIICsgcmVjaXBpZW50c1tpXVswLi4wXSArICIvIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjaXBpZW50c1tpXSArICIubyIgKSA+PTAgKXsKKyAgICAgICAgICAgICAgICBzYXZlX21zZyggbmV3bXNnLCByZWNpcGllbnRzW2ldICk7CisgICAgICAgICAgICAgICAgcmVjb2sgKz0gKHsgcmVjaXBpZW50c1tpXSB9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHN0cmluZyAqdG1wbXNnID0gY29weShuZXdtc2cpOworICAgICAgICAgICAgICAgIHRtcG1zZ1tNU0dfQk9EWV0gPSAiLS0tIFRleHQgZGVyIE1haWwgZ2Vsb2VzY2h0LiAtLS1cbiI7CisgICAgICAgICAgICAgICAgd3JpdGVfZmlsZSggc3ByaW50ZiggIi9tYWlsL291dGJvdW5kL3Bvc3RtYXN0ZXIuJWQtJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUoKSwgcmFuZG9tKHRpbWUoKSkgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCAicG9zdG1hc3RlclxuIiArIEJPVU5DRV9BRERSICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuU3ViamVjdDogVW5kZWxpdmVyYWJsZSBNYWlsXG4lT1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBtc2cpICk7CisgICAgICAgICAgICB9CisgICAgICAgIERFQlVHKCBzcHJpbnRmKCAiRW5kIGRlbGl2ZXJpbmcgdG8gJXMuIEV2YWxjb3N0cyBsZWZ0OiAlZC5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICByZWNpcGllbnRzW2ldLCBnZXRfZXZhbF9jb3N0KCkgKSApOworICAgIH0KKyNpZmRlZiBJTlRFUk5FVF9NQUlMX0VOQUJMRUQKKyAgICBpZiAoIGV4dCApCisgICAgICAgIHNlbmRfdWRwKCBVRFBTRVJWLCA0MTIzLCAiREVMSVZFUk1BSUwiICk7CisjZW5kaWYKKyAgICByZXR1cm4gcmVjb2s7Cit9CisKKworcHVibGljIGludCBGaW5nZXJNYWlsKCBzdHJpbmcgdXNlciApCit7CisgICAgaW50IG5ld2ZvbGRlciwgaTsKKworICAgIC8vWnVncmlmZiBiZXNjaHJhZW5rZW4sIFphaGwgZGVyIGdlbGVzZW5lbiBNYWlscyBpc3QgUHJpdmF0c3BoYWVyZQorICAgIGlmICghb2JqZWN0cCh0aGlzX2ludGVyYWN0aXZlKCkpIHx8ICFzdHJpbmdwKHVzZXIpIHx8ICFzaXplb2YodXNlcikpIAorICAgICByZXR1cm4oLTEpOworICAgIGlmICgoZ2V0dWlkKHRoaXNfaW50ZXJhY3RpdmUoKSkhPXVzZXIpICYmCisgICAgIChwcm9jZXNzX2NhbGwoKSB8fCAhQVJDSF9TRUNVUklUWSkpIHJldHVybigtMSk7CisKKyAgICBpZiAoICFHZXRGb2xkZXJzKHVzZXIpICkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAoIChuZXdmb2xkZXIgPSBtZW1iZXIoZm9sZGVyc1swXSwidW5yZWFkIikpICE9IC0xICkKKyAgICAgICAgcmV0dXJuIHNpemVvZihmb2xkZXJzWzFdW25ld2ZvbGRlcl0pOworCisgICAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgc2F2ZV9tc2coIG1peGVkIG1zZywgc3RyaW5nIHVzZXIgKQoreworICAgIGludCBuZXdmb2xkZXI7CisgICAgb2JqZWN0IHA7CisgIAorICAgIEdldEZvbGRlcnMoIHVzZXIgKTsKKworICAgIC8qIGlmIGZvbGRlciAndW5yZWFkJyBkb2Vzbid0IGV4aXN0LCBjcmVhdGUgaXQgKi8KKyAgICBuZXdmb2xkZXIgPSBtZW1iZXIoIGZvbGRlcnNbMF0sICJ1bnJlYWQiKTsKKyAgICAKKyAgICBpZiAoIG5ld2ZvbGRlciA9PSAtMSApeworICAgICAgICBmb2xkZXJzWzBdICs9ICh7ICJ1bnJlYWQiIH0pOworICAgICAgICBmb2xkZXJzWzFdICs9ICh7ICh7IH0pIH0pOworICAgICAgICBuZXdmb2xkZXIgPSBtZW1iZXIoIGZvbGRlcnNbMF0sICJ1bnJlYWQiKTsKKyAgICB9CisgICAgCisgICAgZm9sZGVyc1sxXVtuZXdmb2xkZXJdICs9ICh7IG1zZyB9KTsKKyAgICBzYXZlX29iamVjdCggTUFJTFBBVEggKyB1c2VyWzAuLjBdICsgIi8iICsgdXNlciApOworI2lmZGVmIE5PVElGWV9SRUNJUElFTlQKKyAgICBpZiAoIHAgPSBmaW5kX3BsYXllcih1c2VyKSApCisgICAgICAgIHRlbGxfb2JqZWN0KCBwLCAiRWluIFBvc3RyZWl0ZXIgcnVmdCBEaXIgYXVzIGVpbmlnZXIgRW50ZmVybnVuZyB6dSwgIgorICAgICAgICAgICAgICAgICAgICAgImRhc3MgRHUgbmV1ZSBQb3N0IGhhc3QhXG4iICk7CisjZW5kaWYKK30KKworCisvKiBSZW1vdmUgYSBtZXNzYWdlIGZyb20gYSBmb2xkZXIgKi8KK3B1YmxpYyBpbnQgUmVtb3ZlTXNnKCBpbnQgbXNnLCBpbnQgZm9sZGVyLCBzdHJpbmcgdXNlciApCit7CisgICAgaWYgKCAhU0VDVVJJVFkocHJldmlvdXNfb2JqZWN0KCkpICkKKyAgICAgICAgcmV0dXJuIC0yOworCisgICAgaWYgKCAhR2V0Rm9sZGVycyh1c2VyKSApIAorICAgICAgICByZXR1cm4gLTE7IC8qIE5vIHN1Y2ggZm9sZGVyICovCisKKyAgICBpZiAoICFwb2ludGVycChmb2xkZXJzKSB8fCAhcG9pbnRlcnAoZm9sZGVyc1swXSkgfHwgCisgICAgICAgICBmb2xkZXIgPj0gc2l6ZW9mKGZvbGRlcnNbMF0pICkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgaWYgKCBtc2cgPCAwIHx8IHNpemVvZihmb2xkZXJzWzFdW2ZvbGRlcl0pIDw9IG1zZyApCisgICAgICAgIHJldHVybiAwOyAvKiBObyBzdWNoIG1zZyAqLworCisgICAgZm9sZGVyc1sxXVtmb2xkZXJdW21zZy4ubXNnXSA9ICh7fSk7CisgICAgCisgICAgc2F2ZV9vYmplY3QoIE1BSUxQQVRIICsgdXNlclswLi4wXSArICIvIiArIHVzZXIgKTsKKyAgICByZXR1cm4gMTsgLyogU3VjY2VzcyAqLworfQorCisKKy8qIE1vdmUgbWVzc2FnZSBpbnRvIGFub3RoZXIgZm9sZGVyICovCitwdWJsaWMgaW50IE1vdmVNc2coIGludCBtc2csIGludCBmb2xkZXIsIHN0cmluZyBuZXdmb2xkZXIsIHN0cmluZyB1c2VyICkKK3sKKyAgICBpbnQgdGFyZ2V0OworCisgICAgaWYgKCAhU0VDVVJJVFkocHJldmlvdXNfb2JqZWN0KCkpICkKKyAgICAgICAgcmV0dXJuIC0yOworCisgICAgaWYgKCAhR2V0Rm9sZGVycyh1c2VyKSApCisgICAgICAgIHJldHVybiAtMTsgLyogU291cmNlIGZvbGRlciBub3QgZm91bmQgKi8KKworICAgIGlmICggIXBvaW50ZXJwKGZvbGRlcnMpIHx8ICFwb2ludGVycChmb2xkZXJzWzBdKSB8fCAKKyAgICAgICAgIGZvbGRlciA+PSBzaXplb2YoZm9sZGVyc1swXSkgKQorICAgICAgICByZXR1cm4gLTE7CisgIAorICAgIGlmICggbXNnIDwgMCB8fCBzaXplb2YoZm9sZGVyc1sxXVtmb2xkZXJdKSA8PSBtc2cgKQorICAgICAgICByZXR1cm4gMDsgLyogTm8gc3VjaCBtc2cgKi8KKworICAgIGlmICggKHRhcmdldCA9IG1lbWJlcihmb2xkZXJzWzBdLCBuZXdmb2xkZXIpKSA9PSAtMSApCisgICAgICAgIHJldHVybiAtMzsKKworICAgIGlmICggdGFyZ2V0ID09IGZvbGRlciApCisgICAgICAgIHJldHVybiAxOworCisgICAgaWYgKCAhcG9pbnRlcnAoZm9sZGVyc1sxXVt0YXJnZXRdKSApIAorICAgICAgICBmb2xkZXJzWzFdW3RhcmdldF0gPSAoeyBmb2xkZXJzWzFdW2ZvbGRlcl1bbXNnXSB9KTsKKyAgICBlbHNlIAorICAgICAgICBmb2xkZXJzWzFdW3RhcmdldF0gKz0gKHsgZm9sZGVyc1sxXVtmb2xkZXJdW21zZ10gfSk7CisKKyAgICByZXR1cm4gUmVtb3ZlTXNnKCBtc2csIGZvbGRlciwgdXNlciApOworfQorCisKK3B1YmxpYyBpbnQgRGVsZXRlVW5yZWFkRm9sZGVyKCBzdHJpbmcgdXNlciApCit7CisgICAgaW50IHVucmVhZCwgbmV3bWFpbDsKKworICAgIGlmICggIVNFQ1VSSVRZKHByZXZpb3VzX29iamVjdCgpKSApCisgICAgICAgIHJldHVybiAtMjsKKworICAgIGlmICggIUdldEZvbGRlcnModXNlcikgKQorICAgICAgICByZXR1cm4gLTE7IC8qIFNvdXJjZSBmb2xkZXIgbm90IGZvdW5kICovCisKKyAgICBpZiAoICh1bnJlYWQgPSBtZW1iZXIoIGZvbGRlcnNbMF0sICJ1bnJlYWQiKSkgPT0gLTEgKQorICAgICAgICByZXR1cm4gMDsKKyAgICAKKyAgICBpZiAoIChuZXdtYWlsID0gbWVtYmVyKCBmb2xkZXJzWzBdLCAibmV3bWFpbCIpKSA9PSAtMSApeworICAgICAgICBmb2xkZXJzWzBdICs9ICh7ICJuZXdtYWlsIiB9KTsKKyAgICAgICAgZm9sZGVyc1sxXSArPSAoeyh7fSl9KTsgCisgICAgICAgIG5ld21haWwgPSBzaXplb2YoZm9sZGVyc1sxXSkgLSAxOworICAgIH0KKyAgICAKKyAgICBpZiAoICFwb2ludGVycChmb2xkZXJzWzFdW25ld21haWxdKSApCisgICAgICAgIGZvbGRlcnNbMV1bbmV3bWFpbF0gPSAoe30pOworICAgIAorICAgIGlmICggcG9pbnRlcnAoZm9sZGVyc1sxXVt1bnJlYWRdKSApCisgICAgICAgIGZvbGRlcnNbMV1bbmV3bWFpbF0gKz0gZm9sZGVyc1sxXVt1bnJlYWRdOworICAgIAorICAgIGZvbGRlcnNbMF1bdW5yZWFkLi51bnJlYWRdID0gKHt9KTsKKyAgICBmb2xkZXJzWzFdW3VucmVhZC4udW5yZWFkXSA9ICh7fSk7CisKKyAgICBzYXZlX29iamVjdCggTUFJTFBBVEggKyB1c2VyWzAuLjBdICsgIi8iICsgdXNlciApOworICAgIHJldHVybiAwOworfQorCisKK3B1YmxpYyBpbnQgUmVtb3ZlRm9sZGVyKCBzdHJpbmcgZm9sZGVyLCBzdHJpbmcgdXNlciApCit7CisgICAgaW50IGk7CisKKyAgICBpZiAoICFTRUNVUklUWShwcmV2aW91c19vYmplY3QoKSkgKQorICAgICAgICByZXR1cm4gLTI7CisKKyAgICBpZiAoICFHZXRGb2xkZXJzKHVzZXIpICkKKyAgICAgICAgcmV0dXJuIC0xOyAvKiBObyBzdWNoIGZvbGRlciAqLworCisgICAgaWYgKCAoaSA9IG1lbWJlciggZm9sZGVyc1swXSwgZm9sZGVyKSkgPT0gLTEgKQorICAgICAgICByZXR1cm4gLTE7IC8qIE5vIHN1Y2ggZm9sZGVyICovCisKKyAgICBpZiAoIHNpemVvZihmb2xkZXJzWzFdW2ldKSA+IDAgKQorICAgICAgICByZXR1cm4gMDsgLyogRm9sZGVyIG5vdCBlbXB0eSAqLworCisgICAgZm9sZGVyc1swXVtpLi5pXSA9ICh7fSk7CisgICAgZm9sZGVyc1sxXVtpLi5pXSA9ICh7fSk7CisKKyAgICBzYXZlX29iamVjdCggTUFJTFBBVEggKyB1c2VyWzAuLjBdICsgIi8iICsgdXNlciApOworICAgIHJldHVybiAxOworfQorCisKK3B1YmxpYyBpbnQgTWFrZUZvbGRlciggc3RyaW5nIGZvbGRlciwgc3RyaW5nIHVzZXIgKQoreworICAgIGlmICggIVNFQ1VSSVRZKHByZXZpb3VzX29iamVjdCgpKSApCisgICAgICAgIHJldHVybiAtMjsKKyAgICAKKyAgICBpZiAoICFmb2xkZXIgfHwgIXN0cmluZ3AoZm9sZGVyKSApCisgICAgICAgIHJldHVybiAtMTsgLyogSHVoID8gKi8KKworICAgIGlmICggZm9sZGVyID09ICJ1bnJlYWQiICkKKyAgICAgICAgcmV0dXJuIDA7IC8qIEZvbGRlciBleGlzdHMgdmlydHVhbGx5IDopICovCisKKyAgICBHZXRGb2xkZXJzKCB1c2VyICk7CisKKyAgICBpZiAoIG1lbWJlciggZm9sZGVyc1swXSwgZm9sZGVyKSAhPSAtMSApCisgICAgICAgIHJldHVybiAwOyAvKiBGb2xkZXIgZXhpc3RzICovCisKKyAgICBmb2xkZXJzWzBdID0gZm9sZGVyc1swXSArICh7IGZvbGRlciB9KTsKKyAgICBmb2xkZXJzWzFdID0gZm9sZGVyc1sxXSArICh7ICh7fSkgfSk7CisgICAgCisgICAgc2F2ZV9vYmplY3QoIE1BSUxQQVRIICsgdXNlclswLi4wXSArICIvIiArIHVzZXIgKTsKKyAgICByZXR1cm4gMTsKK30KKworCitwdWJsaWMgaW50IHF1ZXJ5X3JlY2lwaWVudF9vayggc3RyaW5nIG5hbWUgKQoreworI2lmIElOVEVSTkVUX01BSUxfRU5BQkxFRAorICAgIHJldHVybiAgKGZpbGVfc2l6ZSggInNlY3VyZS9zYXZlLyIgKyBuYW1lWzAuLjBdICsgIi8iICsgbmFtZSArICIubyIgKSA+IDAKKyAgICAgICAgfHwgbWVtYmVyKCBuYW1lLCAnJScgKSA+IDAgfHwgbWVtYmVyKCBuYW1lLCAnQCcgKSA+IDAgKTsKKyNlbHNlCisgICAgLy8gZXMgZGFyZiB6d2FyIGVpbiBAIGluIGRlciBBZHJlc3NlIHZvcmtvbW1lbiwgZGFoaW50ZXIgYWJlciBrZWluIC4gbWVocgorICAgIC8vIChkYW5uIGlzdCBlcyBuZSBNYWlsIHZpYSBJbnRlcm11ZC1NYWlsLCBuaWNodCBpbnMgSW50ZXJuZXQpLgorICAgIHN0cmluZyAqdG1wOworICAgIHJldHVybiAgKGZpbGVfc2l6ZSggInNlY3VyZS9zYXZlLyIgKyBuYW1lWzAuLjBdICsgIi8iICsgbmFtZSArICIubyIgKSA+IDAKKyAgICAgICAgfHwgbWVtYmVyKCBuYW1lLCAnJScgKSA+IDAKKyAgICAgICAgfHwgKHNpemVvZih0bXA9ZXhwbG9kZShuYW1lLCJAIikpID09IDIgJiYgc3Ryc3RyKHRtcFsxXSwiLiIpID09IC0xKSk7CisjZW5kaWYKK30KKworCitwdWJsaWMgdm9pZCBkZWxpdmVyX21haWwoCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHJlY2lwaWVudCwgLyogdGhlIGxvY2FsIHBsYXllcnMgcmVhbCBuYW1lKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZnJvbSwgICAgICAvKiBBIHN0cmluZyBkZXBpY3RpbmcgdGhlIHNlbmRlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBzdWJqZWN0LCAgIC8qIFRoZSBtYWlsIHN1YmplY3QvaGVhZGVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG1haWxfYm9keSAgLyogVGhlIGFjdHVhbCBtYWlsIG1lc3NhZ2UgKi8gKQoreworICAgIERFQlVHKCBzcHJpbnRmKCJERUxJVkVSICVPXG4iLAorICAgICAgICAgICAgICAgICAgICh7IGZyb20sIGZyb20sIHJlY2lwaWVudCwgKHt9KSwgKHt9KSwgc3ViamVjdCwgdGltZSgpIH0pKSApOworCisgICAgLy8gR2Vsb2dndCB3aXJkLCB3ZW5uIGVpbiBhdWZydWZlbmRlcyBPYmpla3QgbmljaHQgc2ljaGVyIGlzdC4KKyAgICBpZiAob2JqZWN0X25hbWUocHJldmlvdXNfb2JqZWN0KCkpWzAuLjddIT0iL3NlY3VyZS8iKQorICAgICAgd3JpdGVfZmlsZSgiL3NlY3VyZS9BUkNIL0RFTElWRVJfTUFJTCIsCisgICAgIHNwcmludGYoIiVzIDogQXVmcnVmIHZvbiAvc2VjdXJlL21haWxlci0+ZGVsaXZlcl9tYWlsKClcbiIKKyAgICAgICAgICAiICBTZW5kZXI6ICVPIEVtcGZhZW5nZXI6ICVPXG4gIFBPOiAlTyBUSTogJU8gVFA6JU9cblxuIiwKKyAgICAgICAgICBjdGltZSh0aW1lKCkpLGZyb20sIHJlY2lwaWVudCwKKyAgICAgICAgICBwcmV2aW91c19vYmplY3QoKSwgdGhpc19pbnRlcmFjdGl2ZSgpLCB0aGlzX3BsYXllcigpKSk7CisgICAgCisgICAgRGVsaXZlck1haWwoICh7IGZyb20sIGZyb20sIHJlY2lwaWVudCwgKHt9KSwgKHt9KSwgc3ViamVjdCwgdGltZSgpLAorICAgICAgICAgICAgICAgICAgICAiRVhURVJOQUwiLCBtYWlsX2JvZHkgfSksIDAgKTsKK30KZGlmZiAtLWdpdCBhL3NlY3VyZS9tYXN0ZXIuYyBiL3NlY3VyZS9tYXN0ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTc0Y2RmCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL21hc3Rlci5jCkBAIC0wLDAgKzEsMTI1NCBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIG1hc3Rlci5jIC0tIG1hc3RlciBvYmplY3QKKy8vCisvLyAkSWQ6IG1hc3Rlci5jIDk1MzAgMjAxNi0wMy0xNyAxOTo1OTowMVogWmVzc3RyYSAkCisjcHJhZ21hIHN0cmljdF90eXBlcworI3ByYWdtYSBub19jbG9uZQorI3ByYWdtYSBub19zaGFkb3cKKyNwcmFnbWEgbm9faW5oZXJpdAorI3ByYWdtYSB2ZXJib3NlX2Vycm9ycworI3ByYWdtYSBjb21iaW5lX3N0cmluZ3MKKyNwcmFnbWEgcGVkYW50aWMKKyNwcmFnbWEgcmFuZ2VfY2hlY2sKKyNwcmFnbWEgd2Fybl9kZXByZWNhdGVkCisKKyNpbmNsdWRlICIvc3lzL2ZpbGVzLmgiCisjaW5jbHVkZSAiL3N5cy9pbnRlcmFjdGl2ZV9pbmZvLmgiCisjaW5jbHVkZSAiL3N5cy9kcml2ZXJfaW5mby5oIgorCitpbmhlcml0ICIvc2VjdXJlL21hc3Rlci9taXNjIjsKK2luaGVyaXQgIi9zZWN1cmUvbWFzdGVyL3VzZXJpbmZvIjsKK2luaGVyaXQgIi9zZWN1cmUvbWFzdGVyL25ldHdvcmsiOworaW5oZXJpdCAiL3NlY3VyZS9tYXN0ZXIvZG9tYWluIjsKK2luaGVyaXQgIi9zZWN1cmUvbWFzdGVyL2d1aWxkIjsKK2luaGVyaXQgIi9zZWN1cmUvbWFzdGVyL2ZpbGVfYWNjZXNzIjsKK2luaGVyaXQgIi9zZWN1cmUvbWFzdGVyL3BsYXllcnNfZGVueSI7CisKKyNpbmNsdWRlICIvc2VjdXJlL21hc3Rlci5oIgorCisvL2ZvciBsaW1pdGVkLCBzZXRfbGltaXQoKSwgZXRjLiBBYnMuIFBmYWQgbm9ldGlnLCBkYSBub2NoIGtlaW4gSW5jbHVkZS1Ib29rCisjaW5jbHVkZSAiL3N5cy9ydGxpbWl0cy5oIgorI2luY2x1ZGUgIi9zeXMvZGVidWdfaW5mby5oIgorI2luY2x1ZGUgIi9zeXMvZGVidWdfbWVzc2FnZS5oIgorI2luY2x1ZGUgIi9zeXMvY29uZmlndXJhdGlvbi5oIgorI2luY2x1ZGUgIi9zeXMvcmVnZXhwLmgiCisKKy8vIE1vZHVsZSBkZXMgTWFzdGVyIGVpbmZ1ZWdlbi4gUGVyICNpbmNsdWRlLCBkYW1pdHMgZ2VyaW5nZnVlZ2lnIHNjaG5lbGxlci4KKy8vIERhIGRpZSBNb2R1bGUgamEgbmlyZ2VuZHdvIHNvbnN0IGdlZXJidCB3ZXJkZW4ga29lbm50ZW4sIGlzdCBkaWVzCisvLyBhdXNuYWhtc3dlaXNlIE9LLiA7KQorI2luY2x1ZGUgIi9zZWN1cmUvbWFzdGVyL2Rlc3RydWN0LmMiCisjaW5jbHVkZSAiL3NlY3VyZS9tYXN0ZXIvYXV0b2luY2x1ZGUuYyIKKworLy8gRnVlciBMb2dmaWxlKC1Sb3RhdGlvbikKKyNkZWZpbmUgUkVTRVRJTlQgICAzNjAwICAgICAgICAgICAgICAgICAgICAgIC8vIGplZGUgU3R1bmRlCisjZGVmaW5lIExPR1JPVEFURSAgKDI0KjIpICAgICAgICAgICAgICAgICAgICAvLyBhbGxlIDQ4aAorI2RlZmluZSBMT0dGSUxFQUdFIChSRVNFVElOVCpMT0dST1RBVEUpICAgICAgLy8gYWxsZSAyIHRhZ2Ugd2VjaHNlbG4KKyNkZWZpbmUgTE9HTlVNICAgICAzICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFuemFobCBkZXIgTG9nZmlsZXMKKworcHJpdmF0ZSBub3NhdmUgaW50IGxvZ3JvdGF0ZV9jb3VudGVyOyAvL1JFQURfRklMRSBhbGxlIExPR1JPVEFURSBSZXNldHMgcm90aWVyZW4KKy8vIFdpcmQgZ2VyYWRlIHZlcnN1Y2h0LCBkaWUgc2ltdWxfZWZ1bnMgenUgbGFkZW4/IFdlbm4gamEsIGR1ZXJmZW4ga2VpbmUKKy8vIHNlZnVucyBnZXJ1ZmVuIHdlcmRlbi4KK3ByaXZhdGUgbm9zYXZlIGludCBsb2FkaW5nX3NpbXVsX2VmdW5zOworLy8gd2lyZCBnZXJhZGUgZWluIEZlaGxlciBiZWFyYmVpdGV0PyBEaWVudCB6dXIgRXJrZW5udW5nIHZvbiBSZWt1cnNpb25lbiBpbgorLy8gZGVyIEZlaGxlcmJlaGFuZGx1bmcKK3ByaXZhdGUgbm9zYXZlIGludCBoYW5kbGluZ19lcnJvcjsKKworLy8gICAgICAgICAgICAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIworLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgU3RhcnQgZGVzIE1hc3RlcnMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworLy8gICAgICAgICAgICAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisvLyBJbml0aWFsaXNpZXJ1bmcgZGVzIE1hc3RlcnMKKy8vYXJnPT0wOiBNdWQgc3RhcnRldCBnZXJhZGUsIGFyZz09MTogTWFzdGVyIHd1cmRlIHJlYWt0aXZpZXJ0LAorLy9hcmc9PTI6IE1hc3RlciByZWFrdGl2aWVydCAoVmFyaWFibGVuIHdlZyksIGFyZz09MzogTWFzdGVyIHd1cmRlCisvL25ldWdlbGFkZW4uCitwcm90ZWN0ZWQgdm9pZCBpbmF1Z3VyYXRlX21hc3RlcihpbnQgYXJnKSB7CisKKyAgc2V0X2RyaXZlcl9ob29rKEhfUkVHRVhQX1BBQ0tBR0UsIFJFX1RSQURJVElPTkFMKTsKKyAgCisgIHNldGV1aWQoUk9PVElEKTsKKyAgdXNlcmluZm86OmNyZWF0ZSgpOworICBMb2FkUExEZW55bGlzdHMoKTsKKworICAvLyBXYXMgc29sbCB2b3IgamVkZSBEYXRlaSBnZXNjaHJpZWJlbiB3ZXJkZW4/CisgIHNldF9kcml2ZXJfaG9vayhIX0FVVE9fSU5DTFVERSwgIydhdXRvaW5jbHVkZWhvb2spOworCisgIC8vZGl2LiBMaXN0ZW4gZWlubGVzZW4KKyAgUmVsb2FkQmFuaXNoRmlsZSgpOworICBSZWxvYWREZXB1dHlGaWxlKCk7CisgIFJlbG9hZEluc2VjdXJlRmlsZSgpOworIAorICAvLyBCZWkgTmV1c3RhcnQgd2l6aW5mbyBpbml0aWFsaXNpZXJlbgorICBpZiAoIWFyZykKKyAgICBzZXRfZXh0cmFfd2l6aW5mbygwLCBhbGxvY2F0ZShCQUNLQk9ORV9XSVpJTkZPX1NJWkUpKTsKKyAgCisgIC8vc2ltdWxfZWZ1bi5jIG5hY2ggaW5hdWd1cmF0ZV9tYXN0ZXIoKSBzdGFydGVuIHVuZCBpbml0aWFsaXNpZXJlbiwgCisgIC8vKHNvIHJpY2h0aWcgc2VoIGljaCBkZW4gU2lubiBoaWVyIG1vbWVudGFuIG5pY2h0IGVpbi4uLgorICAvL2NhbGxfb3V0KCJzdGFydF9zaW11bF9lZnVuIiwwKTsKKworICAvLyBSZXNldCBmZXN0c2V0emVuICgxaCkKKyAgc2V0X25leHRfcmVzZXQoUkVTRVRJTlQpOworCisgIC8vIERyaXZlciBrb25maWd1cmllcmVuCisgIC8vIExhZ2Vya2VubnVuZyBlcnN0IG5lIE1pbnV0ZSBzcGFldGVyLCB3YWVocmVuZCBwcmVsb2FkIGRhcmZzIG1vbWVudGFuCisgIC8vIHJ1aGlnIGxhZ2dlbiAoWmVpdDogdm9ybGFldWZpZyAxbWluKQorICBjYWxsX291dCgjJ2NvbmZpZ3VyZV9kcml2ZXIsIDYwLCBEQ19MT05HX0VYRUNfVElNRSwgMTAwMDAwKTsKKyAgCisgIC8vIEhvb2tzIHNldHplbiAKKyAgCisgIC8vIFN0YW5kYXJkaW5jbHVkZXZlcnplaWNobmlzc2UgZnVlciAjaW5jbHVkZSA8PgorICBzZXRfZHJpdmVyX2hvb2soSF9JTkNMVURFX0RJUlMsICh7Ii9zZWN1cmUvIiwiL3N5cy8ifSkgKTsKKyAgCisgIC8vTmFjaCBkZW0gTGFkZW4vQ2xvbmVuIGNyZWF0ZSgpIGltIE9iamVrdCBydWZlbgorICBzZXRfZHJpdmVyX2hvb2soSF9DUkVBVEVfQ0xPTkUsICAgICAgICJjcmVhdGUiKTsKKyAgc2V0X2RyaXZlcl9ob29rKEhfQ1JFQVRFX09CLCAgICAgICAgICAiY3JlYXRlIik7CisgIHNldF9kcml2ZXJfaG9vayhIX0NSRUFURV9TVVBFUiwgICAgICAgImNyZWF0ZV9zdXBlciIpOworCisgIC8vIEJlaSBSZXNldCByZXNldCgpIGltIE9iamVrdCBhdWZydWZlbgorICBzZXRfZHJpdmVyX2hvb2soSF9SRVNFVCwgICAgICAgICAgICAgICJyZXNldCIpOworICAKKyAgLy8gWnVtIEF1ZnJhZXVtZW4gY2xlYW5fdXAoKSBpbSBPYmpla3QgYXVmcnVmZW4gIAorICBzZXRfZHJpdmVyX2hvb2soSF9DTEVBTl9VUCwgICAgICAgICAgICJjbGVhbl91cCIpOworCisgIC8vIEplZGUgRWluZ2FiZSB3aXJkIHVlYmVyIG1vZGlmeV9jb21tYW5kIGdlbGVua3QKKyAgc2V0X2RyaXZlcl9ob29rKEhfTU9ESUZZX0NPTU1BTkQsICAgICAgICJtb2RpZnlfY29tbWFuZCIpOworICAvLyBEaWVzZXIgSG9vayBpc3QgbWFuZGF0b3J5LCBhYmVyIHdpcmQgbnVyIGJlbnV0enQsIHdlbm4gdmlhCisgIC8vIHNldF9tb2RpZnlfY29tbWFuZCgpIGFrdGl2aWVydCAtIHdhcyB3aXIgbmljaHQgKG1laHIpIHR1bi4gSW5zb2Zlcm4gaXN0CisgIC8vIGRhcyBSZWxpa3QgYXVzIGFsdGVuIFplaXRlbi4KKyAgLy9zZXRfZHJpdmVyX2hvb2soSF9NT0RJRllfQ09NTUFORF9GTkFNRSwgIm1vZGlmeV9jb21tYW5kIik7CisKKyAgLy8gU3RhbmRhcmQtRmVobGVybWVsZHVuZworICAvL3NldF9kcml2ZXJfaG9vayhIX05PVElGWV9GQUlMLCAgICAgICAgIldpZSBiaXR0ZT9cbiIpOworICBzZXRfZHJpdmVyX2hvb2soSF9OT1RJRllfRkFJTCwgZnVuY3Rpb24gc3RyaW5nIChzdHJpbmcgY21kLCBvYmplY3QgdHApCisgICAgICB7aWYgKHN0cmluZ3AoY21kPShzdHJpbmcpdHAtPlF1ZXJ5UHJvcChQX0RFRkFVTFRfTk9USUZZX0ZBSUwpKSkKKyAgICAgICAgIHJldHVybihjbWQpOworICAgICAgIHJldHVybigiV2llIGJpdHRlP1xuIik7fSk7CisKKyAgLy8gV2FzIG1hY2hlbiBiZWkgdGVsbmV0X25lZworICBzZXRfZHJpdmVyX2hvb2soSF9URUxORVRfTkVHLCJ0ZWxuZXRfbmVnIik7CisgIC8vICBzZXRfZHJpdmVyX2hvb2soSF9URUxORVRfTkVHLDApOworCisgIC8vIFByb21wdGJlaGFuZGx1bmc6IERlZmF1bHRwcm9tcHQgc2V0emVuIHVuZCBkYWZ1ZXIgc29yZ2VuLCBkYXNzIGFsbGUKKyAgLy8gUHJvbXB0YXVzZ2FiZW4gZHVyY2ggcHJpbnRfcHJvbXB0IGltIEludGVyYWN0aXZlIGxhdWZlbiwgZGFtaXQgZGFzIEVPUgorICAvLyBhbmdlaGFlbmd0IHdpcmQuCisgIHNldF9kcml2ZXJfaG9vayhIX1BSSU5UX1BST01QVCwgInByaW50X3Byb21wdCIpOworICBzZXRfZHJpdmVyX2hvb2soSF9ERUZBVUxUX1BST01QVCwgIj4gIik7CisKKyAgLy8gRVVJRCB1bmQgVUlEIG11ZXNzZW4gbmV1ZSBPYmpla3RlIGF1Y2ggbm9jaCBrcmllZ2VuLCBIb29rcyBkYWZ1ZXIgc2V0emVuCisgIHNldF9kcml2ZXJfaG9vayhIX0xPQURfVUlEUywgIydsb2FkX3VpZF9ob29rKTsKKyAgc2V0X2RyaXZlcl9ob29rKEhfQ0xPTkVfVUlEUywgIydjbG9uZV91aWRfaG9vayk7CisKKyAgLy8gTWVsZHVuZyBiZWkgdm9sbGVtIE11ZAorICBzZXRfZHJpdmVyX2hvb2soSF9OT19JUENfU0xPVCwgIk1vbWVudGFuIHNpbmQgbGVpZGVyIHp1dmllbGUgU3BpZWxlciBpbSAiCisgICAgICArTVVETkFNRSsiIGVpbmdlbG9nZ3QuXG5CaXR0ZSBrb21tIGRvY2ggZXR3YXMgc3BhZXRlciBub2NobWFsICIKKyAgICAgICJ2b3JiZWkhXG4iKTsKKworICAvLyBOdW4gZGVyIGJlcnVlY2h0aWd0ZSBNb3ZlLUhvb2sgLi4uCisgIC8vIChiZXdlZ3Qgb2JqZWt0IHVuZCBydWZ0IGFsbGUgbm90d2VuZGlnZW4gaW5pdHMgYXVmKQorICAvLyBIaWVyIHdpcmQgSF9NT1ZFX09CSkVDVDAgYmVudXR6dCwgZC5oLiBkaWUgbGFtYmRhIHdpcmQgYW4gZGFzIGFrdHVlbGxlCisgIC8vIE9iamVrdCB2b3IgQXVzZnVlaHJ1bmcgZ2VidW5kZW4sIG5pY2h0IGFuICdpdGVtJywgd2FzIG1vdmVfb2JqZXQoKQorICAvLyB1ZWJlcmdlYmVuIHd1cmRlLgorICBzZXRfZHJpdmVyX2hvb2soSF9NT1ZFX09CSkVDVDAsCisgICAgIHVuYm91bmRfbGFtYmRhKCh7J2l0ZW0sJ2Rlc3R9KSwKKyAgICAgICAoeyMnLCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGl0ZW0hPXRoaXNfb2JqZWN0PworICAgICAgICAgKHsjJz8sKHsjJyE9LCdpdGVtLCh7Iyd0aGlzX29iamVjdH0pfSksCisgICAgICAgICAgICh7IydyYWlzZV9lcnJvciwgICAgICAgICAgICAgICAgICAgICAgICAvLyAtPkZlaGxlciEKKyAgICAgICAgICAgICAiSWxsZWdhbCB0byBtb3ZlIG90aGVyIG9iamVjdCB0aGFuIHRoaXNfb2JqZWN0KClcbiJ9KSB9KSwKKyAgICAgICAgICh7IydlZnVuOjpzZXRfZW52aXJvbm1lbnQsJ2l0ZW0sJ2Rlc3R9KSwgIC8vIGl0ZW0gbmFjaCBkZXN0IGJld2VnZW4KKyAgICAgICAgICh7Iyc/LAorICAgICAgICAgICAoeyMnbGl2aW5nLCdpdGVtfSksICAgICAgICAgICAgICAgICAgICAgLy8gbGl2aW5nKGl0ZW0pPworICAgICAgICAgICAoeyMnLCwKKyAgICAgICAgICAgICAoeyMnZWZ1bjo6c2V0X3RoaXNfcGxheWVyLCdpdGVtfSksICAgIC8vIHNldF90aGlzX3BsYXllcihpdGVtKQorICAgICAgICAgICAgICh7IydjYWxsX290aGVyLCdkZXN0LCJpbml0In0pLCAgICAgICAgLy8gZGVzdC0+aW5pdCgpCisgICAgICAgICAgICAgKHsjJz8hLCAKKyAgICAgICAgICAgICAgICh7IycmJiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICFvYmplY3RwKGl0ZW0pfHwKKyAgICAgICAgICAgICAgICAgKHsjJ29iamVjdHAsICdpdGVtfSksICAgICAgICAgICAgIC8vIGVudihpdGVtKSE9ZGVzdD8KKyAgICAgICAgICAgICAgICAgKHsjJz09LCh7IydlbnZpcm9ubWVudCwgJ2l0ZW19KSwnZGVzdH0pfSksCisgICAgICAgICAgICAgICAoeyMncmV0dXJufSl9KX0pfSksICAgICAgICAgICAgICAgICAvLyAtPiBmZXJ0aWcKKyAgICAgICAgICh7Iyc9LCdvdGhlcnMsKHsjJy0sKHsjJ2FsbF9pbnZlbnRvcnksJ2Rlc3R9KSwoeyMnKHssJ2l0ZW19KX0pfSksCisjaWZkZWYgRU1BQ1NfTkVSViAKKyAgICAgICAgIH0pICAgLy8gRW1hY3Mga2FubiAoeyMnKHsgbmljaHQgcGFyc2VuICAgIC8vIG90aGVycz1hbGxfaW52KGRlc3QpLQorI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICh7aXRlbX0pCisgICAgICAgICAoeyMnZmlsdGVyLCdvdGhlcnMsbGFtYmRhKCh7J29iLCdpdGVtfSksCisgICAgICAgICAgICAoeyMnPywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICh7IycmJiwKKyAgICAgICAgICAgICAgICAoeyMnb2JqZWN0cCwnaXRlbX0pLCAgICAgICAgICAgICAgIC8vIG9iamVjdHAoaXRlbSkmJgorICAgICAgICAgICAgICAgICh7IydsaXZpbmcsJ29ifSksICAgICAgICAgICAgICAgICAgLy8gbGl2aW5nKG9iKSYmCisgICAgICAgICAgICAgICAgKHsjJz09LCh7IydlbnZpcm9ubWVudCwnaXRlbX0pLCh7IydlbnZpcm9ubWVudCwnb2J9KX0pfSksCisgICAgICAgICAgICAgICh7IycsLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlbnYoaXRlbSk9PWVudihvYik/CisgICAgICAgICAgICAgICAgKHsjJ2VmdW46OnNldF90aGlzX3BsYXllciwgJ29ifSksICAvLyBzZXRfdGhpc19wbGF5ZXIob2IpCisgICAgICAgICAgICAgICAgKHsjJ2NhbGxfb3RoZXIsJ2l0ZW0sICJpbml0In0pICAgICAvLyBpdGVtLT5pbml0KCkKKyAgICAgICAgICAgICAgfSl9KSksJ2l0ZW19KSwKKyAgICAgICAgICh7Iyc/LAorICAgICAgICAgICAoeyMnbGl2aW5nLCdpdGVtfSksICAgICAgICAgICAgICAgICAgICAgLy8gbGl2aW5nKGl0ZW0pPworICAgICAgICAgICAgICAoeyMnLCwKKyAgICAgICAgICAgICAgICAoeyMnZWZ1bjo6c2V0X3RoaXNfcGxheWVyLCdpdGVtfSksIC8vIHNldF90aGlzX3BsYXllcihpdGVtKQorICAgICAgICAgICAgICAgICh7IydmaWx0ZXIsJ290aGVycyxsYW1iZGEoKHsnb2IsJ2l0ZW19KSwKKyAgICAgICAgICAgICAgICAgICAgKHsjJz8sICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAoeyMnJiYsICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICh7IydvYmplY3RwLCdpdGVtfSksICAgICAgIC8vIG9iamVjdHAoaXRlbSkmJgorICAgICAgICAgICAgICAgICAgICAgICAgKHsjJ29iamVjdHAsJ29ifSksICAgICAgICAgLy8gb2JqZWN0cChvYikmJgorICAgICAgICAgICAgICAgICAgICAgICAgKHsjJz09LCh7IydlbnZpcm9ubWVudCwnaXRlbX0pLCh7IydlbnZpcm9ubWVudCwnb2J9KX0pCisgICAgICAgICAgICAgICAgICAgICAgfSksICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlbnYoaXRlbSk9PWVudihvYik/CisgICAgICAgICAgICAgICAgICAgICAgKHsjJ2NhbGxfb3RoZXIsJ29iLCJpbml0In0pICAvLyBvYi0+aW5pdCgpCisgICAgICAgICAgICAgICAgICAgIH0pKSwnaXRlbX0pfSl9KSwKKyAgICAgICAgICh7Iyc/LAorICAgICAgICAgICAoeyMnJiYsCisgICAgICAgICAgICAgKHsjJ29iamVjdHAsJ2l0ZW19KSwgICAgICAgICAgICAgICAgICAvLyBvYmplY3RwKGl0ZW0pJiYKKyAgICAgICAgICAgICAoeyMnbGl2aW5nLCdkZXN0fSksICAgICAgICAgICAgICAgICAgIC8vIGxpdmluZyhkZXN0KSYmCisgICAgICAgICAgICAgKHsjJz09LCh7IydlbnZpcm9ubWVudCwnaXRlbX0pLCdkZXN0fSkvLyBlbnYoaXRlbSk9PWRlc3Q/CisgICAgICAgICAgIH0pLAorICAgICAgICAgICAoeyMnLCwKKyAgICAgICAgICAgICAoeyMnZWZ1bjo6c2V0X3RoaXNfcGxheWVyLCdkZXN0fSksICAgIC8vIHNldF90aGlzX3BsYXllcihkZXN0KQorICAgICAgICAgICAgICh7IydjYWxsX290aGVyLCdpdGVtLCJpbml0In0pfSl9KX0pKSk7Ly8gaXRlbS0+aW5pdCgpCisgIERFQlVHKCJNYXN0ZXIgaW5hdWd1cmF0ZWQiKTsKKyAgcmV0dXJuOworfQorCisvLyBlcGlsb2coKSBnaWJ0IGRpZSBEYXRlaWVuIHp1cnVlY2ssIGRpZSB2b3JnZWxhZGVuIHdlcmRlbiBtdWVzc2VuCitwcm90ZWN0ZWQgc3RyaW5nICplcGlsb2coaW50IGVmbGFnKSB7CisgIHN0cmluZyAqZmlsZXMsICpkb21haW5zOworICBpbnQgaTsKKworICBzZXRldWlkKFJPT1RJRCk7CisgIFJlbG9hZEJhbmlzaEZpbGUoKTsKKyAgUmVsb2FkRGVwdXR5RmlsZSgpOworICBSZWxvYWRJbnNlY3VyZUZpbGUoKTsKKworICBpZiAoZWZsYWcpIHsKKyAgICB3cml0ZSgiLWUgYW5nZWdlYmVuIC0+IFByZWxvYWRpbmcgdW50ZXJkcnVlY2t0IC4uLlxuIik7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBwcmludGYoIlByZWxvYWRpbmcgZ2VzdGFydGV0OiAlc1xuXG4iLGN0aW1lKHRpbWUoKSkpOworCisgIC8vRmlsZXMgZnVlcnMgUHJlbG9hZGluZyB1bmQgUmVnaW9uZW4gaG9sZW4KKyAgZmlsZXM9ZXhwbG9kZV9maWxlcygiL3N0ZC9wcmVsb2FkX2ZpbGUiKSArIGV4cGxvZGVfZmlsZXMoIi9kL3ByZWxvYWRfZmlsZSIpOworICBkb21haW5zPWdldF9kb21haW5zKCkgKyAoeyJlcnptYWdpZXIifSk7IC8vIEVNIGhhYmVuIGF1Y2ggZWluIFByZWxvYWQgRmlsZQorCisgIGZvciAoaT1zaXplb2YoZG9tYWlucyk7aS0tOykKKyAgICBmaWxlcys9ZXhwbG9kZV9maWxlcygiL2QvIitkb21haW5zW2ldKyIvcHJlbG9hZF9maWxlIik7CisgIAorICB3cml0ZSgiXG4iKTsKKyAKKyAgcmV0dXJuIGZpbGVzOworfQorCisvLyBwcmVsb2FkKCkgd2lyZCBmdWVyIGplZGVyIERhdGVpIGltIFByZWxvYWQgZWlubWFsIGR1cmNobGF1ZmVuCitwcm90ZWN0ZWQgdm9pZCBwcmVsb2FkKHN0cmluZyBmaWxlKSB7CisgIHN0cmluZyBlcnI7CisgIHN0cmluZyBuYW1lOworICBpbnQgKnJlcywgemVpdDsKKworICAvLyBLZWluIHJpY2h0aWdlciBEYXRlaW5hbWU6IGZlcnRpZworICBpZighZmlsZSB8fCAhZmlsZVswXSB8fCBmaWxlWzBdID09ICc7JyB8fCBmaWxlX3NpemUoZmlsZSsiLmMiKSA8IDApIHJldHVybjsKKworICAvLyBLZWluIEJlc2l0emVyIC0+IE1lbGR1bmcgYXVzZ2ViZW4sIGZlcnRpZworICBpZiAoIShuYW1lPWNyZWF0b3JfZmlsZShmaWxlKSkpCisgIHsKKyAgICBwcmludGYoIktlaW4gQmVzaXR6ZXIgZ2VmdW5kZW4gZnVlciBEYXRlaSAlcy5cbiIsZmlsZSk7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gRGF0ZWkgdW5kIEJlc2l0emVyIGF1c2dlYmVuCisgIHByaW50ZigiJS01MHMlLTE1cyIsZmlsZSxuYW1lKTsKKworICAvLyBFdWlkIGthbm4gbmljaHQgZ2VhZW5kZXJ0IHdlcmRlbiAtPiBNZWxkdW5nLCBmZXJ0aWcKKyAgaWYgKCFzZXRldWlkKG5hbWUpKQorICB7CisgICAgcHJpbnRmKCJcbkV1aWQga29ubnRlIG5pY2h0IGF1ZiAlcyBnZXNldHp0IHdlcmRlblxuIisKKyAgICAgICAgICAgICAiU2llIGlzdCBudW4gJXMuXG4iLG5hbWUsZ2V0ZXVpZChUTykpOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIERhbm4gbWFsIGxhZGVuIC4uIGRhYmVpIFplaXQgbWVzc2VuCisgIHplaXQgPSBhcHBseSgjJysscnVzYWdlKClbMC4uMV0pOworCisgIC8vIFdhZWhyZW5kIGRlcyBQcmVsb2FkcyBzaW5kIDEuNU1UaWNrcyBsZWlkZXIgbmljaHQgc292aWVsLCBpbnNiLiB3ZW5uCisgIC8vIHNvd2FzIHdpZSBkZXIgY2hhbm5lbGQgamVkZSBtZW5nZSBPYmpla3RlIGxhZGVuIG11c3MsIGRpZSB3aWVkZXJ1bSBlcnN0CisgIC8vIGRhcyBnYW56ZSBHZXJhZmZlbCBhdXMgL3N0ZC8gbGFkZW4uIERhaGVyIGhpZXIgZWluZmFjaCBtYWwgZnVlcnMgUHJlbG9hZAorICAvLyBkaWUgR3JlbnplIGhvY2guCisgIGVyciA9IGNhdGNoKGxpbWl0ZWQoIydsb2FkX29iamVjdCwoezUwMDAwMDB9KSxmaWxlKSk7CisKKyAgaWYgKGVyciAhPSAwKQorICAgIHByaW50ZigiXG5GZWhsZXIgYmVpbSBMYWRlbiB2b24gJXM6XG4lc1xuIixmaWxlLGVycik7CisgIGVsc2UKKyAgeworICAgIHplaXQ9YXBwbHkoIycrLHJ1c2FnZSgpWzAuLjFdKS16ZWl0OworICAgIHByaW50ZigiKCUyZC4lOjAyZCBzKVxuIix6ZWl0LzEwMDAsemVpdCUxMDAwKTsKKyAgfQorCisgIC8vIE5vY2ggRVVJRCB6dXJ1ZWNrc2V0emVuCisgIHNldGV1aWQoUk9PVElEKTsKKworICByZXR1cm47Cit9CisKKy8vc2ltdWxfZWZ1bi5jIGxhZGVuIG9kZXIgZGllIHNwYXJlX3NpbXVsX2VmdW4uYyBhbHMgRmFsbGJhY2sKKy8vZXMgaXN0IG1vZWdsaWNoLCBoaWVyIGVpbiBBcnJheSB2b24gc3RyaW5ncyB6dXJ1ZWNrenVnZWJlbi4gRGllCisvL25hY2hmb2xnZW5kZW4gZ2VsdGVuIGFscyBCYWNrdXAtT2JqZWt0ZSwgZmFsbHMgZWluZSBzZWZ1biBpbSBIYXVwdG9iamVrdAorLy9uaWNodCBnZWZ1bmRlbiB3aXJkLgorcHJvdGVjdGVkIHN0cmluZyAqZ2V0X3NpbXVsX2VmdW4oKSB7CisgIHN0cmluZyBlcnI7CisKKyAgKytsb2FkaW5nX3NpbXVsX2VmdW5zOworCisgIGlmICghKGVycj1jYXRjaChTSU1VTF9FRlVOX0ZJTEUtPnN0YXJ0X3NpbXVsX2VmdW4oKSkpICkgeworICAgIC0tbG9hZGluZ19zaW11bF9lZnVuczsKKyAgICByZXR1cm4gKHtTSU1VTF9FRlVOX0ZJTEV9KTsKKyAgfQorICAKKyAgd3JpdGUoIkZhaWxlZCB0byBsb2FkIHNpbXVsIGVmdW4gIiArIFNJTVVMX0VGVU5fRklMRSArICJcbiIpOworICBkZWJ1Z19tZXNzYWdlKCJGYWlsZWQgdG8gbG9hZCBzaW11bCBlZnVuICIgKyBTSU1VTF9FRlVOX0ZJTEUgKworICAgICAgIiAiICsgZXJyLCBETVNHX1NURE9VVCB8IERNU0dfTE9HRklMRSk7CisKKyAgaWYgKCEoZXJyPWNhdGNoKFNQQVJFX1NJTVVMX0VGVU5fRklMRS0+c3RhcnRfc2ltdWxfZWZ1bigpKSkgKSB7CisgICAgLS1sb2FkaW5nX3NpbXVsX2VmdW5zOworICAgIHJldHVybiAoe1NQQVJFX1NJTVVMX0VGVU5fRklMRX0pOworICB9CisgIAorICB3cml0ZSgiRmFpbGVkIHRvIGxvYWQgc3BhcmUgc2ltdWwgZWZ1biIgKyBTUEFSRV9TSU1VTF9FRlVOX0ZJTEUgKyAiXG4iKTsKKyAgZGVidWdfbWVzc2FnZSgiRmFpbGVkIHRvIGxvYWQgc3BhcmUgc2ltdWwgZWZ1biAiICsgU1BBUkVfU0lNVUxfRUZVTl9GSUxFICsKKyAgICAgICIgIiArIGVyciwgRE1TR19TVERPVVQgfCBETVNHX0xPR0ZJTEUpOworCisgCisgIGVmdW46OnNodXRkb3duKCk7CisgIAorICByZXR1cm4gMDsKK30KKworcHJvdGVjdGVkIG1peGVkIGNhbGxfc2VmdW4oc3RyaW5nIHNlZnVuLCB2YXJhcmdzIG1peGVkIGFyZ3MpIHsKKyAgaWYgKCFsb2FkaW5nX3NpbXVsX2VmdW5zKQorICAgIHJldHVybiBhcHBseShzeW1ib2xfZnVuY3Rpb24oc2VmdW4pLCBhcmdzKTsKKyAgZWxzZSB7CisgICAgc3dpdGNoKHNlZnVuKSB7CisgICAgICBjYXNlICJsb2dfZmlsZSI6CisgICAgICBjYXNlICJzZWN1cmVfbGV2ZWwiOgorICAgICAgY2FzZSAic2VjdXJlX2V1aWQiOgorICAgICAgY2FzZSAiZmluZF9wbGF5ZXIiOgorICAgICAgY2FzZSAiZmluZF9uZXRkZWFkIjoKKyAgICAgIGNhc2UgImZpbmRfbGl2aW5nIjoKKyAgICAgIGNhc2UgInByb2Nlc3NfY2FsbCI6CisgICAgICBjYXNlICJyZXBsYWNlX3BlcnNvbmFsIjoKKyAgICAgIGNhc2UgImZpbGVfdGltZSI6CisgICAgICAgIHJldHVybiAwOworICAgICAgY2FzZSAiZHRpbWUiOgorICAgICAgICBpZiAocG9pbnRlcnAoYXJncykgJiYgc2l6ZW9mKGFyZ3MpKQorICAgICAgICAgIHJldHVybiBzdHJmdGltZSgiJWEgJWQuICViICVZLCAlSDolTTolUyIsYXJnc1swXSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICByZXR1cm4gc3RyZnRpbWUoIiVhICVkLiAlYiAlWSwgJUg6JU06JVMiKTsKKyAgICAgIGNhc2UgInVwdGltZSI6CisgICAgICAgIHJldHVybiB0b19zdHJpbmcodGltZSgpLV9fQk9PVF9USU1FX18pICsgIiBTZWt1bmRlbiI7CisgICAgfQorICB9CisgIHJldHVybiAwOworfQorCisKKy8vIFByZWxvYWQgbWFudWVsbCB3aWVkZXJob2xlbjsgS2VpbmUgR0QtRnVua3Rpb24KK3ZvaWQgcmVkb19wcmVsb2FkKCkKK3sKKyAgc3RyaW5nICp0b19wcmVsb2FkOworICBpbnQgaSxqOworCisgIHRvX3ByZWxvYWQ9ZXBpbG9nKDApOworICBqPXNpemVvZih0b19wcmVsb2FkKTsKKyAgZm9yIChpPTA7aTxqO2krKykgCisgICAgICBjYXRjaChwcmVsb2FkKHRvX3ByZWxvYWRbaV0pKTsKKyAgcmV0dXJuOworfQorCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMKKy8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgU3RhbmRhcmQtTGZ1bnMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIworCisvLyBLZWluZSBHRC1GdW5rdGlvbiwgYWJlciBzaW5udm9sbC4KK3B1YmxpYyB2YXJhcmdzIGludCByZW1vdmUoaW50IHNpbGVudCkKK3sKKyAgd3JpdGUoIkRlciBNYXN0ZXIgd2lsbCBhYmVyIG5pY2h0IHplcnN0b2VydCB3ZXJkZW4hXG4iKTsKKyAgcmV0dXJuIDA7Cit9CisKKy8vIEVpbmlnZSByZXBldGl0aXZlbiBUYWV0aWdrZWl0ZW4ga2FubiBkZXIgUmVzZXQgZXJsZWRpZ2VuCitwcm90ZWN0ZWQgdm9pZCByZXNldCgpCit7CisgIGludCBpLCAqZGF0ZTsKKyAgbWl4ZWQgKndsOworCisgIC8vRGFyZiBuaWNodCB2b24gSGFuZCBhdWZnZXJ1ZmVuIHdlcmRlbiEKKyAgaWYgKFRJfHxUUCkgcmV0dXJuOworICAKKyAgLy8gTmFlY2hzdGVuIFJlc2V0IHNldHplbgorICBzZXRfbmV4dF9yZXNldChSRVNFVElOVCk7CisKKyAgLy8gVXNlcmluZm8gYXVmcmFldW1lbgorICBfY2xlYW51cF91aW5mbygpOworCisgIC8vIFByb2pla3QtQ2FjaGUgbG9lc2NoZW4KKyAgX2NsZWFudXBfcHJvamVjdHMoKTsKKworICAvLyBXZW5uIFplaXQgYWJnZWxhdWZlbiwgZGFubiBSRUFEX0ZJTEUtTG9nIHJvdGllcmVuCisgIGlmICghbG9ncm90YXRlX2NvdW50ZXItLSkKKyAgeworICAgIGk9dGltZSgpL0xPR0ZJTEVBR0U7CisgICAgZGF0ZT1nZXRfZGlyKHNwcmludGYoIiVzLiVkIiwgUkVBRF9GSUxFLGklTE9HTlVNKSwgR0VURElSX0RBVEVTKTsKKyAgICBpZiAocG9pbnRlcnAoZGF0ZSkmJnNpemVvZihkYXRlKSYmCisgICAgICAgIChkYXRlWzBdL0xPR0ZJTEVBR0UpPT1pKSByZXR1cm47CisgICAgaWYgKGZpbGVfc2l6ZShSRUFEX0ZJTEUpPjApCisgICAgICByZW5hbWUoUkVBRF9GSUxFLCBzcHJpbnRmKCIlcy4lZCIsIFJFQURfRklMRSxpJUxPR05VTSkpOworICAgIGxvZ3JvdGF0ZV9jb3VudGVyPUxPR1JPVEFURTsKKyAgfQorICAvLyBlaW5tYWwgYW0gVGFnIGRpZSBVSURBbGlhc2UgcmVzZXR0ZW4uIEhpZXJ6dSB3aXJkIGRlciBsb2dyb3RhdGVfY291bnRlcgorICAvLyBtaXNzYnJhdWNodC4KKyAgaWYgKCEobG9ncm90YXRlX2NvdW50ZXIlMjQpKSB7CisgICAgUmVzZXRVSURBbGlhc2UoKTsKKyNpZmRlZiBfUFVSRUZUUERfCisgICAgZXhwaXJlX2Z0cF91c2VyKCk7CisjZW5kaWYKKyAgfQorCisgIC8vIFdpemxpc3QgYWx0ZXJ0CisgIHdsID0gd2l6bGlzdF9pbmZvKCk7CisgIGZvciAoaT1zaXplb2Yod2wpOyBpLS07ICkKKyAgICBzZXRfZXh0cmFfd2l6aW5mbyh3bFtpXVtXTF9OQU1FXSwgd2xbaV1bV0xfRVhUUkFdICogOTkgLyAxMDApOworCisgIC8vIERhbm4gbm9jaCBNYWlscyBiZWFyYmVpdGVuCisgIG1haWxzX2xhc3RfaG91cj0wOworICBtYWlscmVhZCgpOworCisgIHJldHVybjsKK30KKworCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIworLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBJRC1NYW5hZ2VtZW50ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworLy8gICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMKKworLy8gTWFnaWVyLUlEIGZ1ZXIgRGF0ZWkgc3RyIChhbHMgT2JqZWt0IG9kZXIgYWxzIFN0cmluZykgZXJtaXR0ZWxuCitzdHJpbmcgY3JlYXRvcl9maWxlKG1peGVkIHN0cikgeworICBzdHJpbmcgKnN0cnMsdG1wOworICBpbnQgczsKKworICAvLyBmdWxsX3BhdGhfYXJyYXkgbmFjaCBzdHJzCisgIC8vIFRPRE86IHdhcyBpc3QgbWl0IGNsb25lcz8KKyAgaWYob2JqZWN0cChzdHIpKQorICAgIHN0cnM9ZnVsbF9wYXRoX2FycmF5KG9iamVjdF9uYW1lKHN0ciksIDApOworICBlbHNlIGlmKHN0cmluZ3Aoc3RyKSkKKyAgICBzdHJzPWZ1bGxfcGF0aF9hcnJheShzdHIsIDApOworICBlbHNlIHJldHVybiBOT0JPRFk7CisKKyAgLy8gYWJzb2x1dGUgUGZhZGUgaW50ZXJlc3NpZXJlbiBoaWVyIGdlcmFkZSBuaWNodC4KKyAgc3RycyAtPSAoeyIifSk7CisKKyAgcz1zaXplb2Yoc3Rycyk7CisgIGlmKHM8MikgcmV0dXJuIE5PQk9EWTsKKworICBzd2l0Y2goc3Ryc1swXSkgeworICAgIGNhc2UgRE9NQUlORElSOgorICAgICAgLy8gRnVlciBOaWNodC1NYWdpZXIgYnp3LiAiUHNldWRvLSJNYWdpZXIgZGllIFJlZ2lvbnNrZW5udW5nCisgICAgICBpZiggcz09MiB8fCBXSVpMVkxTW3N0cnNbMl1dIHx8ICFJU19MRUFSTkVSKHN0cnNbMl0pICkKKyAgICAgICAgcmV0dXJuIHN0cnNbMV07CisKKyAgICAgIC8vIGluIC9kL2Vyem1hZ2llciBnaWJ0IGVzIE1hZ2llci1JRHMKKyAgICAgIGlmIChzdHJzWzFdPT0iZXJ6bWFnaWVyIikgcmV0dXJuIHN0cnNbMl07CisKKyAgICAgIC8vIEFuc29uc3RlbiBkLnJlZ2lvbi5tYWdpZXJuYW1lCisgICAgICByZXR1cm4gc3ByaW50ZigiZC4lcy4lcyIsIHN0cnNbMV0sIHN0cnNbMl0pOworIAorICAgIGNhc2UgUFJPSkVDVERJUjoKKyAgICAgIC8vIEluIHAuc2VydmljZSBnaWJ0IGVzIGlkcyBtaXQgdWlkCisgICAgICBpZiAocz4yICYmIHN0cnNbMV09PSJzZXJ2aWNlIikgcmV0dXJuICJwLnNlcnZpY2UuIitzdHJzWzJdOworCisgICAgICAvLyBBbnNvbnN0ZW4gbnVyIHAucHJvamVrdCAocC5zZXJ2aWNlIGlzdCBhdWNoIGhpZXIgZHJpbikKKyAgICAgIHJldHVybiAicC4iK3N0cnNbMV07CisKKyAgICBjYXNlIFdJWkFSRERJUjoKKyAgICAgIGlmIChzPjIpCisgICAgICAgIHJldHVybiBzdHJzWzFdOworICAgICAgaWYgKHM9PTIgJiYgZmlsZV9zaXplKHN0cnNbMF0rIi8iK3N0cnNbMV0pPT1GU0laRV9ESVIpCisgICAgICAgIHJldHVybiBzdHJzWzFdOworICAgICAgcmV0dXJuIE5PQk9EWTsKKworICAgIGNhc2UgU0VDVVJFRElSOgorICAgICAgcmV0dXJuIFJPT1RJRDsKKworICAgIGNhc2UgR1VJTERESVI6CisgICAgY2FzZSBTUEVMTEJPT0tESVI6CisgICAgICB0bXA9c3Ryc1sxXTsKKyAgICAgIGlmICh0bXBbPDIuLjwyXT09Ii4iKSB0bXA9dG1wWzAuLjwzXTsKKyAgICAgIGlmICgocz1tZW1iZXIodG1wLCcuJykpPjApIHRtcD10bXBbcysxLi5dOworICAgICAgcmV0dXJuICJHVUlMRC4iK3RtcDsKKworICAgIGNhc2UgTElCUk9PTURJUjoKKyAgICAgIHJldHVybiBST09NSUQ7CisKKyAgICBjYXNlIFNURERJUjoKKyAgICBjYXNlIExJQk9CSkRJUjoKKyAgICAgIHJldHVybiBCQUNLQk9ORUlEOworCisgICAgY2FzZSBET0NESVI6CisgICAgICByZXR1cm4gRE9DSUQ7CisKKyAgICBjYXNlIE1BSUxESVI6CisgICAgICByZXR1cm4gTUFJTElEOworICAgIGNhc2UgTkVXU0RJUjoKKyAgICAgIHJldHVybiBORVdTSUQ7CisKKyAgICBjYXNlIExJQklURU1ESVI6CisgICAgICByZXR1cm4gSVRFTUlEOworCisgICAgLyogRmFsbC1UaHJvdWdoICovCisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBOT0JPRFk7CisKKyB9CisgcmV0dXJuIE5PQk9EWTsgIC8vc2hvdWxkIG5ldmVyIGJlIHJlYWNoZWQuCit9CisKKy8vIFVJRCB1bmQgRVVJRCBhbiBPYmpla3QgZ2ViZW4gKG9kZXIgZWJlbiBuaWNodCkKKy8vIEtlaW5lIEdELUZ1bmt0aW9uLCBhYmVyIHZvbiBIb29rcyBhdWZnZXJ1ZmVuCitwcm90ZWN0ZWQgbWl4ZWQgZ2l2ZV91aWRfdG9fb2JqZWN0KHN0cmluZyBkYXRlaSxvYmplY3QgcG8pCit7CisgIHN0cmluZyBjcmVhdG9yLHBvdWlkOworCisgIC8vIFBhcmFtZXRlciB0ZXN0ZW4KKyAgaWYgKCFzdHJpbmdwKGRhdGVpKXx8IW9iamVjdHAocG8pKSAgcmV0dXJuIDE7CisKKyAgLy8gS2VpbmUgT2JqZWt0ZSBpbiAvbG9nLCAvb3BlbiBvZGVyIC9kYXRhCisgIGlmIChzdHJzdHIoZGF0ZWksICIvIkxJQkRBVEFESVIiLyIpID09IDAKKyAgICAgIHx8IHN0cnN0cihkYXRlaSwgIi8iTElCTE9HRElSIi8iKSA9PSAwCisgICAgICB8fCBzdHJzdHIoZGF0ZWksICIvIkZUUERJUiIvIikgPT0gMAorICAgICAgKQorICAgICAgcmV0dXJuIDE7CisKKyAgLy8gRGF0ZWkgbXVzcyBCZXNpdHplciBoYWJlbgorICBpZiAoIShjcmVhdG9yPWNyZWF0b3JfZmlsZShkYXRlaSkpKSByZXR1cm4gMTsKKworICAvLyBIYWNrLCBkYW1pdCBzaW11bF9lZnVuIGdlbGFkZW4gd2VyZGVuIGthbm4KKyAgaWYgKGNyZWF0b3I9PVJPT1RJRCAmJiBwbz09VE8pIHJldHVybiBST09USUQ7CisKKyAgLy8gS2VpbmUgZXVpZCwga2VpbiBMYWRlbiAuLi4KKyAgaWYgKCEocG91aWQ9Z2V0ZXVpZChwbykpKSByZXR1cm4gMTsgLy8gRGlzYWxsb3cgaWYgbm8gZXVpZCBpbiBwbworCisgIC8vIFJvb3QgZ2VuZXJpZXJ0IGtlaW5lIFJvb3QtT2JqZWt0ZSA7LSkKKyAgLy8gTnVyIFVJRCBzZXR6ZW4KKyAgaWYgKHBvdWlkPT1ST09USUQpCisgICAgcmV0dXJuICh7Y3JlYXRvcixOT0JPRFl9KTsgLy8gcm9vdCBkb2VzIG5vdCBjcmVhdGUgcm9vdCBvYmplY3RzIQorCisgIC8vIEVVSUQgbWl0c2V0emVuLCB3ZW5uIFBPPT1jcmVhdG9yIG9kZXIgY3JlYXRvcj09QkFDS0JPTkVJRAorICBpZiAoY3JlYXRvcj09cG91aWQgfHwgY3JlYXRvcj09QkFDS0JPTkVJRCkKKyAgICByZXR1cm4gcG91aWQ7CisKKyAgcmV0dXJuICh7Y3JlYXRvcixOT0JPRFl9KTsKK30KKworLy8gRGllIFN5c3RlbS1JRHMgbXVlc3NlbiBiZWthbm50IHNlaW4KK3N0cmluZyBnZXRfbWFzdGVyX3VpZCgpICAgICAgICAgIHsgcmV0dXJuIFJPT1RJRDt9CitzdHJpbmcgZ2V0X2JiX3VpZCgpICAgICAgICAgICAgICB7IHJldHVybiBCQUNLQk9ORUlEOyB9CisvLyBUT0RPOiBCZWkgZ2V0X3dpel9uYW1lIGtvZW5udGUgbWFuIC0gc28gbW9lZ2xpY2ggLSBhdWYgJ3dpcmtsaWNoZScKKy8vICAgICAgIE1hZ2llcm5hbWVuIGdlaGVuIChJZGVlIHZvbiBtYW5kcmFnb24pCitzdHJpbmcgZ2V0X3dpel9uYW1lKHN0cmluZyBmaWxlKSB7IHJldHVybiBjcmVhdG9yX2ZpbGUoZmlsZSk7fQorCisvLyAgICAgICAgICAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgU29uc3RpZ2UgR0QtRnVua3Rpb25lbiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisvLyAgICAgICAgICAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKy8vIFNwaWVsZXIgaGF0IHNpY2ggZWluZ2Vsb2dndAorcHJvdGVjdGVkIG9iamVjdCBjb25uZWN0KCkKK3sKKyAgc3RyaW5nIGVycjsKKyAgaW50IGVycm5vOworICBvYmplY3Qgb2IsYnA7CisKKyNpZiBkZWZpbmVkKFNTTFBPUlQpICYmIF9fRUZVTl9ERUZJTkVEX18odGxzX2F2YWlsYWJsZSkKKyAgaWYgKGVmdW46OmludGVyYWN0aXZlX2luZm8odGhpc19wbGF5ZXIoKSwgSUlfTVVEX1BPUlQpID09IFNTTFBPUlQpIHsKKyAgICAvLyByZWplY3QgY29ubmVjdGlvbiBvZiBUTFMgaXMgbm90IGF2YWlsYWJsZQorICAgIGlmICghdGxzX2F2YWlsYWJsZSgpKQorICAgICAgcmV0dXJuIDA7CisgICAgLy8gZXN0YWJsaXNoIFRMUworICAgIGVycm5vPXRsc19pbml0X2Nvbm5lY3Rpb24oKTsKKyAgICBpZiAoZXJybm8gPCAwKSB7CisgICAgICAvLyBGZWhsZXIgaW0gVmViaW5kdW5nc2F1ZmJhdQorICAgICAgcHJpbnRmKCJDYW4ndCBlc3RhYmxpc2ggYSBUTFMvU1NMIGVuY3J5cHRlZCBjb25uZWN0aW9uOiAlc1xuIiwKKyAgICAgICAgICB0bHNfZXJyb3IoZXJybm8pKTsKKyAgICAgIHJldHVybiAwOyAvLyB0aGlzIHdpbGwgY2xvc2UgdGhlIGNvbm5lY3Rpb24gdG8gdGhlIGNsaWVudC4KKyAgICB9CisgIH0KKyNlbmRpZgorCisgIC8vIEJsdWVwcmludCBpbSBFbnZpcm9ubWVudD8gRGFzIGdlaHQgbnVuIHdpcmtsaWNoIG5pY2h0IC4uLgorICBpZiAoKGJwPWZpbmRfb2JqZWN0KCIvc2VjdXJlL2xvZ2luIikpICYmIGVudmlyb25tZW50KGJwKSkgCisgICAgICBjYXRjaChkZXN0cnVjdChicCk7cHVibGlzaCk7CisKKyAgLy8gTG9naW4tU2hlbGwgY2xvbmVuCisgIGVyciA9IGNhdGNoKG9iID0gY2xvbmVfb2JqZWN0KCJzZWN1cmUvbG9naW4iKTsgcHVibGlzaCk7CisKKyAgaWYgKGVycm5vID09IDAgJiYgZXJyKQorICAgICAgd3JpdGUoIkZlaGxlciBiZWltIExhZGVuIHZvbiAvc2VjdXJlL2xvZ2luLmNcbiIrZXJyKyJcbiIpOworCisgIHJldHVybiBvYjsKK30KKworLy8gV2FzIG1hY2hlbiBiZWkgZGlzY29ubmVjdD8KK3Byb3RlY3RlZCB2b2lkIGRpc2Nvbm5lY3Qob2JqZWN0IHdobywgc3RyaW5nIHJlbWFpbmluZykgeworICAgIHdoby0+TmV0RGVhZCgpOyByZXR1cm47Cit9CisKKy8vIEVzIGdpYnQga2VpbiBGaWxlICdmaWxlbmFtZScuIFZDIGFrdGl2aWVyZW4gc28gdm9yaGFuZGVuIC4uLgorcHJvdGVjdGVkIG9iamVjdCBjb21waWxlX29iamVjdChzdHJpbmcgZmlsZW5hbWUpCit7CisgIG9iamVjdCByZXQ7CisgIHN0cmluZyAqc3RyOworICBzdHJpbmcgY29tcGlsZXI7CisKKyAgaWYgKCFzaXplb2YoZmlsZW5hbWUpKSByZXR1cm4gMDsKKyAgc3RyPWVmdW46OmV4cGxvZGUoZmlsZW5hbWUsIi8iKTsKKworICBpZihzaXplb2Yoc3RyKTwyKSByZXR1cm4gMDsKKyAgY29tcGlsZXI9aW1wbG9kZShzdHJbMC4uPDJdLCIvIikrIi92aXJ0dWFsX2NvbXBpbGVyIjsKKyAKKyAgaWYgKGZpbmRfb2JqZWN0KGNvbXBpbGVyKQorICAgICAgfHwgZmlsZV9zaXplKGNvbXBpbGVyKyIuYyIpPjApCisgIHsKKyAgICBpZihjYXRjaCgKKyAgICAgICAgICByZXQ9KG9iamVjdCljYWxsX290aGVyKGNvbXBpbGVyLCJjb21waWxlX29iamVjdCIsc3RyWzwxXSk7IHB1Ymxpc2gpKQorICAgICAgcmV0dXJuIDA7CisgIH0KKyAgZWxzZQorICAgICAgcmV0dXJuKDApOworCisgIGlmICggb2JqZWN0cChyZXQpICYmIGVmdW46OmV4cGxvZGUoY3JlYXRvcl9maWxlKGZpbGVuYW1lKSwgIi4iKVs8MV0gIT0KKyAgICAgICBSRUFMX0VVSUQocmV0KSApeworICAgICAgZnVuY2FsbCggc3ltYm9sX2Z1bmN0aW9uKCdsb2dfZmlsZS8qJyovKSwgIkFSQ0gvVkNfTUlTU0JSQVVDSCIsCisgICAgICAgICAgICAgICBzcHJpbnRmKCAiJXM6ICVzIHZlcnN1Y2h0IHBlciBWQyAlcyB6dSAlcyB1bXp1YmVuZW5uZW4hXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZnVuY2FsbCggc3ltYm9sX2Z1bmN0aW9uKCdkdGltZS8qJyovKSwgdGltZSgpICksCisgICAgICAgICAgICAgICAgICAgICAgICAodGhpc19pbnRlcmFjdGl2ZSgpID8gZ2V0dWlkKHRoaXNfaW50ZXJhY3RpdmUoKSk6CisgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0X25hbWUocHJldmlvdXNfb2JqZWN0KCkpKSwgb2JqZWN0X25hbWUocmV0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSkgKTsKKworICAgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjIyMjIyMKKy8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBTaHV0ZG93biAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMjIyMjIyMjCisKKy8vIFNwaWVsZXIgYmVpIFNodXRkb3duIGVudGZlcm5lbgorcHJvdGVjdGVkIHZvaWQgcmVtb3ZlX3BsYXllcihvYmplY3QgdmljdGltKQoreworICBjYXRjaCh2aWN0aW0tPnF1aXQoKSk7CisgIGlmICh2aWN0aW0pIGNhdGNoKHZpY3RpbS0+cmVtb3ZlKCkpOworICBpZiAodmljdGltKSBkZXN0cnVjdCh2aWN0aW0pOworICByZXR1cm47Cit9CisKKy8vIExhbmdzYW1lciBTaHV0ZG93biAKK3Byb3RlY3RlZCB2b2lkIHNsb3dfc2h1dF9kb3duKGludCBtaW51dGVzKQoreworICAvL3NvbGx0ZSBudXIgdm9tIEdEIGdlcnVmZW4gd2VyZGVuLiBPZGVyIGFsbGVuZmFsbHMgTWFzdGVyIHNlbGJzdAorICBmaWx0ZXIodXNlcnMoKSwjJ3RlbGxfb2JqZWN0LAorICAiRGVyIEdhbWVkcml2ZXIgcnVmdDogRGVyIFNwZWljaGVyIHdpcmQga25hcHAgISBCZXJlaXRldCBldWNoIGF1ZiBkYXMgRW5kZSB2b3IgIVxuIik7CisgICIvb2JqL3NodXQiLT5zaHV0KG1pbnV0ZXMpOworICByZXR1cm47Cit9CisKKworLy8gSW4gTEQgdmFyYXJncyB2b2lkIG5vdGlmeV9zaHV0ZG93bihzdHJpbmcgY3Jhc2hfcmVhc29uKQorcHJvdGVjdGVkIHZhcmFyZ3Mgdm9pZCBub3RpZnlfc2h1dGRvd24gKHN0cmluZyBjcmFzaF9yZWFzb24pIHsKKworICBpZiAoUE8gJiYgUE8gIT0gVE8pCisgICAgcmV0dXJuOworICBpZiAoY3Jhc2hfcmVhc29uKSB7CisgICAgICAvL1Vob2guLi4gVmVyZGFtbXRlciBDcmFzaC4gOi0oIFp1bWluZGVzdCBtYWwgbWl0bG9nZ2VuLAorICAgICAgLy93YXMgZGVyIERyaXZlciBzYWd0Li4uCisgICAgICB3cml0ZV9maWxlKENSQVNIX0xPRyxzcHJpbnRmKAorICAgICAgICAgICAgIlxuJXM6IFRoZSBkcml2ZXIgY3Jhc2hlZCEgUmVhc29uOiAlc1xuIiwKKyAgICAgICAgICAgIGN0aW1lKHRpbWUoKSksY3Jhc2hfcmVhc29uKSk7CisgIH0KKworICBmaWx0ZXIodXNlcnMoKSwgIyd0ZWxsX29iamVjdCwKKyAgICAgICAgICAgICAgICJHYW1lIGRyaXZlciBzaG91dHM6IExEbXVkIHNodXR0aW5nIGRvd24gaW1tZWRpYXRlbHkuXG4iKTsKKyAgc2F2ZV93aXpfZmlsZSgpOworICByZXR1cm47Cit9CisKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIworLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBCZXJlY2h0aWd1bmdlbiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworLy8gICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjCisKKy8vIERhcmYgVmVyYmluZHVuZyBkdXJjaCBuYW1lIHZvbiBvYmZyb20gbmFjaCBvYiBnZWxlZ3Qgd2VyZGVuPworCisvL2ludCB2YWxpZF9leGVjKHN0cmluZyBuYW1lKSB7cmV0dXJuIDE7fQorCitpbnQgdmFsaWRfZXhlYyhzdHJpbmcgbmFtZSwgb2JqZWN0IG9iLCBvYmplY3Qgb2Jmcm9tKQoreworICAvLyBVbmd1ZWx0aWdlIFBhcmFtZXRlciBvZGVyIEF1ZnJ1ZiBkdXJjaCBwcm9jZXNzX3N0cmluZyAtPiBBYmJydWNoCisgIGlmICghb2JqZWN0cChvYikgfHwgIW9iamVjdHAob2Jmcm9tKSAKKyAgICAgIHx8ICFzdHJpbmdwKG5hbWUpIHx8ICFzaXplb2YobmFtZSkKKyAgICAgIHx8IGZ1bmNhbGwoc3ltYm9sX2Z1bmN0aW9uKCdwcm9jZXNzX2NhbGwpKSApCisgICAgcmV0dXJuIDA7CisKKyAgLy8gcmVuZXdfcGxheWVyX29iamVjdCgpIGRhcmYgLi4uCisgIGlmIChuYW1lPT0iL3NlY3VyZS9tYXN0ZXIvbWlzYy5jIgorICAgICAgfHwgbmFtZT09InNlY3VyZS9tYXN0ZXIvbWlzYy5jIikKKyAgICByZXR1cm4gMTsKKworICAvLyBBbnNvbnN0ZW4gZGFyZiBzaWNoIG51ciBkaWUgU2hlbGwgc2VsYmVyIGFlbmRlcm4gLi4uCisgIGlmIChwcmV2aW91c19vYmplY3QoKSAhPSBvYmZyb20pIHJldHVybiAwOworCisgIC8vIERpZSBMb2dpbi1TaGVsbCB6dSBqZWRlbSBPYmpla3QgLi4uCisgIGlmIChuYW1lPT0iL3NlY3VyZS9sb2dpbi5jIgorICAgICAgfHwgbmFtZT09InNlY3VyZS9sb2dpbi5jIikKKyAgICByZXR1cm4gMTsKKworICAvLyBNYWdpZXIgcGVyIGV4ZWMgbnVyLCB3ZW5uIHNpZSBkYW1pdCBrZWluZSBGcmVtZGUgdWlkL2V1aWQgYmVrb21tZW4KKyAgaWYgKHRoaXNfaW50ZXJhY3RpdmUoKSA9PSBvYmZyb20gJiYgZ2V0dWlkKG9iZnJvbSkgPT0gZ2V0dWlkKG9iKSAKKyAgICAgICYmIGdldGV1aWQob2Jmcm9tKSA9PSBnZXRldWlkKG9iKSkgCisgICAgICByZXR1cm4gMTsKKworICAvLyBTb25zdCBkYXJmIG5pZW1hbmQgd2FzCisgIHJldHVybiAwOworfQorCisKKy8vIERhcmYgbWUgeW91IHNub29wZW4/CitpbnQgdmFsaWRfc25vb3Aob2JqZWN0IG1lLCBvYmplY3QgeW91KSB7IAorICAgIHJldHVybiBnZXR1aWQoUE8pID09IFJPT1RJRDsgCit9CisKKy8vIERhcmYgd2l6IHdpc3Nlbiwgb2IgZXIgZ2Vzbm9vcHQgd2lyZD8KK2ludCB2YWxpZF9xdWVyeV9zbm9vcChvYmplY3Qgd2l6KSB7CisgICAgcmV0dXJuIGdldHVpZChQTykgPT0gUk9PVElEOyAKK30KKworLy8gRGFyZiBvYiBzZWluZSBFVUlEIGF1ZiBuZXdldWlkIHNldHplbj8KK2ludCB2YWxpZF9zZXRldWlkKG9iamVjdCBvYiwgc3RyaW5nIG5ld2V1aWQpCit7CisgIHJldHVybiAob2I9PXRoaXNfb2JqZWN0KCkgfHwKKyAgICAgICAgICBnZXR1aWQob2IpID09IFJPT1RJRCB8fAorICAgICAgICAgIGdldHVpZChvYikgPT0gbmV3ZXVpZCB8fAorICAgICAgICAgIGNyZWF0b3JfZmlsZShvYmplY3RfbmFtZShvYikpID09IG5ld2V1aWQpOworfQorCisvLyBEYXJmIGdldHJhY2VkIHdlcmRlbj8KK2ludCB2YWxpZF90cmFjZShzdHJpbmcgd2hhdCwgbWl4ZWQgYXJnKSB7IAorICAgIHJldHVybiBJU19BUkNIKFRJKTsKK30KKworCisvLyB2YWxpZF93cml0ZSgpIHVuZAorLy8gdmFsaWRfcmVhZCgpIGJlZmluZGVuIHNpY2ggaW4gZmlsZV9hY2Nlc3MuYworCisKKy8vIERhcmYgUE8gb2Igc2hhZG93ZW4/CitpbnQgcXVlcnlfYWxsb3dfc2hhZG93KG9iamVjdCBvYikKK3sKKyAgLy8gUk9PVCBkYXJmIG5pY2h0IGdlc2hhZG93ZWQgd2VyZGVuCisgIGlmKGdldHVpZChvYikgPT0gUk9PVElEKQorICAgIHJldHVybiAwOworICAKKyAgLy8gQWNjZXNzLVJpZ2h0cyBhdWNoIG5pY2h0CisgIGlmIChlZnVuOjpleHBsb2RlKG9iamVjdF9uYW1lKG9iKSwiIyIpWzBdWzwxNC4uXT09Ii9hY2Nlc3NfcmlnaHRzIikKKyAgICByZXR1cm4gMDsKKyAgCisgIC8vIEFuc29uc3RlbiBxdWVyeV9wcmV2ZW50X3NoYWRvdyBmcmFnZW4gLi4uCisgIHJldHVybiAhKGludClvYi0+cXVlcnlfcHJldmVudF9zaGFkb3coUE8pOworfQorCisKKy8qIHByaXZpbGVnZV92aW9sYXRpb24gaXMgY2FsbGVkIHdoZW4gb2JqZWN0cyB0cnkgdG8gZG8gaWxsZWdhbCB0aGluZ3MsCisgKiBvciBmaWxlcyBiZWluZyBjb21waWxlZCByZXF1ZXN0IGEgcHJpdmlsZWdlZCBlZnVuLgorICoKKyAqIHJldHVybiB2YWx1ZXM6CisgKiAgIDE6IFRoZSBjYWxsZXIvZmlsZSBpcyBhbGxvd2VkIHRvIHVzZSB0aGUgcHJpdmlsZWdlLgorICogICAwOiBUaGUgY2FsbGVyIHdhcyBwcm9iYWJseSBtaXNsZWFkZWQ7IHRyeSB0byBmaXggdGhlIGVycm9yLgorICogIC0xOiBBIHJlYWwgcHJpdmlsZWdlIHZpb2xhdGlvbi4gSGFuZGxlIGl0IGFzIGVycm9yLgorICovCitpbnQgcHJpdmlsZWdlX3Zpb2xhdGlvbihzdHJpbmcgb3AsIG1peGVkIHdobywgbWl4ZWQgYXJnMSwgbWl4ZWQgYXJnMikKK3sKKworICBpZiAob2JqZWN0cCh3aG8pICYmIAorICAgICAgKHdobz09dGhpc19vYmplY3QoKSB8fCBnZXRldWlkKHdobyk9PVJPT1RJRCkpCisgICAgcmV0dXJuIDE7IAorCisgIHN3aXRjaChvcCkKKyAgeworICAgIGNhc2UgImNhbGxfb3V0X2luZm8iOgorICAgICAgcmV0dXJuIC0xOworICAgIGNhc2UgInNlbmRfdWRwIjoKKyAgICAgIHJldHVybiAxOworCisgICAgY2FzZSAibm9tYXNrIHNpbXVsX2VmdW4iOgorICAgICAgLy8gPHdobz4gaXN0IGluIGRpZXNlbSBGYWxsIGVpbiBzdHJpbmcgKEZpbGVuYW1lKSB1bmQgZGFtaXQgdm9uIGRlbQorICAgICAgLy8gQ2hlY2sgZGEgb2JlbiBuaWNodCBhYmdlZGVja3QuIERhaGVyIGV4cGxpeml0ZSBCZWhhbmRsdW5nIGhpZXIuCisgICAgICAvLyBBdXNzZXJkZW0gaGF0IGRlciBQZmFkICh6dXIgWmVpdCBub2NoKSBrZWluZW4gZnVlaHJlbmRlbiAnLycuCisgICAgICAvLyBGYWxscyBkYXMgamVtYW5kIGVpbnNjaHJhZW5rZW4gd2lsbDogZGVyIEtyYW0gZnVlciBkaWUgc2ltdWxfZWZ1bnMKKyAgICAgIC8vIG11c3MgZGFzIGR1ZXJmZW4hCisgICAgICBpZiAoc3RyaW5ncCh3aG8pCisgICAgICAgICAgJiYgc3Ryc3RyKHdobywic2VjdXJlLyIpID09IDApCisgICAgICAgIHJldHVybiAxOworICAgICAgcmV0dXJuIDA7IC8vIGFsbGUgYW5kZXJlIG5pY2h0LgorCisgICAgY2FzZSAiZ2V0X2V4dHJhX3dpemluZm8iOgorICAgICAgLy8gYmVudXR6dCB2b24gL3NlY3VyZS9tZW1vcnkuYyB1bmQgL3NlY3VyZS9zaW11bF9lZnVuLmMKKyAgICBjYXNlICJzZXRfZXh0cmFfd2l6aW5mbyI6CisgICAgICAvLyB3aXJkIGJlbnV0enQgdm9uIHNpbXVsX2VmdW4uYywgd2VsY2hlIGFiZXIgYWxzIFJPT1QtT2JqZWt0IGltcGxpeml0CisgICAgICAvLyBlcmxhdWJ0IGlzdCAocy5vLikKKyAgICAgIHJldHVybiAtMTsgLy8gZnVlciBhbGxlbiBuaWNodCBlcmxhdWJ0LgorCisgICAgY2FzZSAicmVuYW1lX29iamVjdCI6CisgICAgICBpZiAob2JqZWN0X25hbWUod2hvKT09Ii9zZWN1cmUvaW1wZmV0Y2giIHx8CisgICAgICAgICAgQkxVRV9OQU1FKHdobyk9PSIvc2VjdXJlL2xvZ2luIikKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICByZXR1cm4oLTEpOworCisgICAgY2FzZSAiY29uZmlndXJlX2RyaXZlciI6IAorICAgICAgcmV0dXJuIGNhbGxfc2VmdW4oInNlY3VyZV9sZXZlbCIpID49IEFSQ0hfTFZMOworCisgICAgY2FzZSAibGltaXRlZCI6CisgICAgICAvLyBTcGllbGVyc2hlbGxzIGR1ZXJmZW4gc2ljaCB6dXNhZXR6bGljaGUgVGlja3MgZnVlciBkZW4gQXVmcnVmIHZvbgorICAgICAgLy8gOjpkaWUoKSBiZXNjaGFmZmVuLCBkYW1pdCBkZXIgVG9kIG5pY2h0IHdlZ2VuIHdlbmlnIFRpY2tzIGJ1Z2d0LgorICAgICAgaWYgKHN0cnN0cihsb2FkX25hbWUod2hvKSwgIi9zdGQvc2hlbGxzLyIpID09IDAKKyAgICAgICAgICAmJiBnZXRfdHlwZV9pbmZvKGFyZzEsIDIpID09IHdobworICAgICAgICAgICYmIGdldF90eXBlX2luZm8oYXJnMSwgMykgPT0gIi9zdGQvbGl2aW5nL2xpZmUiCisvLyAgICAgICAgICAmJiBnZXRfdHlwZV9pbmZvKGFyZzEsIDQpID09ICJkaWUiCisgICAgICAgICAgJiYgYXJnMltMSU1JVF9FVkFMXSA8PSAxMDAwMDAwMCApIHsKKyAgICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0KKyAgICAgIC8vREVCVUcoc3ByaW50ZigiJU8sICVPLCAlTyIsIHdobywgYXJnMSwgYXJnMikpOworICAgICAgaW50ICpsaW1pdHM9ZWZ1bjo6ZHJpdmVyX2luZm8oRElfQ1VSUkVOVF9SVU5USU1FX0xJTUlUUyk7CisgICAgICAvLyBMSU1JVF9FVkFMIGRhcmYgdmVycmluZ2VydCB3ZXJkZW4uIEFsbGUgYW5kZXJlbiBMaW1pdHMgZHVlcmZlbiBuaWNodAorICAgICAgLy8gZ2VhZW5kZXJ0IHdlcmRlbi4gQWNoamEsIExJTUlUX0VWQUwgZGFyZiBuaWNodCAwIChMSU1JVF9VTkxJTUlURUQpCisgICAgICAvLyBzZWluLiAqZyoKKyAgICAgIC8vIExJTUlUX0NPU1QgZGFyZiBlbnR3ZWRlciAwIG9kZXIgLTEwMCBzZWluLgorICAgICAgaWYgKGFyZzJbTElNSVRfRVZBTF0+MTAwMCAmJiAoYXJnMltMSU1JVF9FVkFMXSA8IGdldF9ldmFsX2Nvc3QoKSktNTAwCisgICAgICAgICAgJiYgYXJnMltMSU1JVF9BUlJBWV0gPT0gbGltaXRzW0xJTUlUX0FSUkFZXQorICAgICAgICAgICYmIGFyZzJbTElNSVRfTUFQUElOR19LRVlTXSA9PSBsaW1pdHNbTElNSVRfTUFQUElOR19LRVlTXQorICAgICAgICAgICYmIGFyZzJbTElNSVRfTUFQUElOR19TSVpFXSA9PSBsaW1pdHNbTElNSVRfTUFQUElOR19TSVpFXQorICAgICAgICAgICYmIGFyZzJbTElNSVRfQllURV0gPT0gbGltaXRzW0xJTUlUX0JZVEVdCisgICAgICAgICAgJiYgYXJnMltMSU1JVF9GSUxFXSA9PSBsaW1pdHNbTElNSVRfRklMRV0KKyAgICAgICAgICAmJiBhcmcyW0xJTUlUX0NBTExPVVRTXSA9PSBsaW1pdHNbTElNSVRfQ0FMTE9VVFNdCisgICAgICAgICAgJiYgKGFyZzJbTElNSVRfQ09TVF0gPT0gMCB8fCBhcmcyW0xJTUlUX0NPU1RdID09IC0xMDApICkKKyAgICAgICAgICAgIHJldHVybigxKTsKKyAgICAgIC8vc29uc3QgdmVyd2VpZ2Vybi4KKyAgICAgIHJldHVybigtMSk7CisKKyAgICBjYXNlICJzcWxpdGVfcHJhZ21hIjoKKyAgICAgIHJldHVybiAxOworICAgIGNhc2UgImF0dGFjaF9lcnFfZGVtb24iOgorICAgIGNhc2UgImJpbmRfbGFtYmRhIjogCisgICAgY2FzZSAiY29uZmlndXJlX2ludGVyYWN0aXZlIjoKKyAgICBjYXNlICJjb25maWd1cmVfb2JqZWN0IjoKKyAgICBjYXNlICJleGVjdXRlX2NvbW1hbmQiOgorICAgIGNhc2UgImVycSI6IAorICAgIGNhc2UgImlucHV0X3RvIjoKKyAgICBjYXNlICJteXNxbCI6CisgICAgY2FzZSAibmV0X2Nvbm5lY3QiOgorICAgIGNhc2UgInBnc3FsIjoKKyAgICBjYXNlICJzZXRfZHJpdmVyX2hvb2siOgorICAgIGNhc2UgInNldF90aGlzX29iamVjdCI6CisgICAgY2FzZSAic2hhZG93X2FkZF9hY3Rpb24iOgorICAgIGNhc2UgInN5bWJvbF92YXJpYWJsZSI6CisgICAgY2FzZSAidmFyaWFibGVfbGlzdCI6CisgICAgY2FzZSAid2l6bGlzdF9pbmZvIjoKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuKC0xKTsKKyAgfQorICByZXR1cm4gLTE7Cit9CisKKy8vICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIworLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRmVobGVyYmVoYW5kbHVuZyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworLy8gICAgICAgICAgICAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKy8vIEJlaGFuZGx1bmcgdm9uIEZlaGxlciBpbSBIZWFydF9CZWF0Citwcm90ZWN0ZWQgaW50IGhlYXJ0X2JlYXRfZXJyb3IoIG9iamVjdCBjdWxwcml0LCBzdHJpbmcgZXJyb3IsIHN0cmluZyBwcm9ncmFtLAorICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGN1cnJlbnRfb2JqZWN0LCBpbnQgbGluZSwgaW50IGNhdWdodCkKK3sKKyAgaWYgKCFvYmplY3RwKGN1bHByaXQpKSByZXR1cm4gMDsKKyAgaWYgKGludGVyYWN0aXZlKGN1bHByaXQpKQorICB7CisgICAgdGVsbF9vYmplY3QoY3VscHJpdCwiRGVyIEdhbWVEcml2ZXIgdGVpbHQgRGlyIG1pdDogIgorICAgICAgICAgICAgICAgICJEZWluIEhlcnpzY2hsYWcgaGF0IGF1c2dlc2V0enQhXG4iKTsKKyAgICBpZiAoSVNfTEVBUk5FUihjdWxwcml0KSkKKyAgICAgIHRlbGxfb2JqZWN0KGN1bHByaXQsCisgICAgICAgICAgICAgICAgICBzcHJpbnRmKCJGZWhsZXI6ICVzUHJvZ2FtbTogJXMsIEN1cnJPYmo6ICVzLCBaZWlsZTogJWQsICIKKyAgICAgICAgICAgICAgICAgICAgInRoZSBlcnJvciB3YXMgJXNjYXVnaHQgYXQgaGlnaGVyIGxldmVsLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgZXJyb3IscHJvZ3JhbSxjdXJyZW50X29iamVjdCxsaW5lLAorICAgICAgICAgICAgICAgICAgICBjYXVnaHQgPyAiIiA6ICJub3QiKSk7CisgIH0KKworICBpZiAoZWZ1bjo6b2JqZWN0X2luZm8oY3VscHJpdCwgT0lfT05DRV9JTlRFUkFDVElWRSkpCisgICAgY2FsbF9vdXQoInJlc3RhcnRfaGVhcnRfYmVhdCIsIDUsIGN1bHByaXQpOworICBlbHNlCisgICAgY2F0Y2goY3VscHJpdC0+bWFrZV9pbW1vcnRhbCgpOyBwdWJsaXNoKTsKKyAgcmV0dXJuIDA7Cit9CisKKy8vIEF1c2dhYmUgZWluZXIgTWVsZHVuZyBhbiBTcGllbGVyIG1pdCBMZXZlbCA+PSBtaW5sZXZlbC4gV2lyZCBnZW51dHp0LCB1bQorLy8gTWFnaWVyIHVlYmVyIEZlaGxlciB6dSBpbmZvcm1pZXJlbiwgZGllIG5pY2h0IG5vcm1hbCBiZWhhbmRlbHQgd2VyZGVuCisvLyAoei5CLiByZWt1cnNpdmUgRmVobGVyLCBkLmguIEZlaGxlciBpbiBkZXIgRmVobGVyYmVoYW5kbHVuZykKK3ByaXZhdGUgdm9pZCB0ZWxsX3BsYXllcnMoc3RyaW5nIG1zZywgaW50IG1pbmxldmVsKSB7CisgIG1zZyA9IGVmdW46OnNwcmludGYoIiU9LTc4cyIsIk1hc3RlcjogIiArIG1zZyk7IC8vIHVtYnJlY2hlbgorICBlZnVuOjpmaWx0ZXIoZWZ1bjo6dXNlcnMoKSwgZnVuY3Rpb24gaW50IChvYmplY3QgcGwpCisgICAgICB7CisgICAgICAgIGlmIChxdWVyeV93aXpfbGV2ZWwocGwpID49IG1pbmxldmVsKQorICAgICAgICAgIGVmdW46OnRlbGxfb2JqZWN0KHBsLCBtc2cpOworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0gKTsKK30KKworLyoqCisgKiBcYnJpZWYgRXJyb3IgaGFuZGxpbmcgZnVlciBGZWhsZXIgYmVpbSBDb21waWxpZXJlbi4KKyAqCisgKiBsb2dfZXJyb3IoKSB3aXJkIHZvbSBHYW1lRHJpdmVyIGF1ZmdlcnVmZW4sIHdlbm4genVyIENvbXBpbGUtWmVpdCBlaW4KKyAqIEZlaGxlciBhdWZ0cmF0LiBEaWUgRmVobGVybWVsZHVuZyB3aXJkIHVudGVyIC9sb2cvZXJyb3IgZ2Vsb2dndC4KKyAqIEZhbGxzIHRoaXNfaW50ZXJhY3RpdmUoKSBlaW4gTWFnaWVyIGlzdCwgYmVrb21tdCBlciBkaWUgRmVobGVybWVsZHVuZworICogZGlyZWt0IGFuZ2V6ZWlndC4KKyAqIFNvbGx0ZSBkYXMgTG9nZmlsZSA1MGtCIHVlYmVyc2NocmVpdGVuLCB3aXJkIGVzIHJvdGllcnQuIEF1ZiBbRW50d2lja2x1bmddCisgKiB3aXJkIGRhbm4gZWluZSBGZWhsZXJtZWxkdW5nIGFiZ2VzZXR6dC4KKyAqCisgKiBAcGFyYW0gZmlsZSBEaWUgRGF0ZWksIGluIGRlciBkZXIgRmVobGVyIGF1ZnRyYXQuCisgKiBAcGFyYW0gbWVzc2FnZSBEaWUgRmVobGVybWVsZHVuZy4KKyAqIEBwYXJhbSB3YXJuIFdhcm51bmcgKHdhcm4hPTApIG9kZXIgRmVobGVyICh3YXJuPT0wKT8KKyAqICovCisKK3Byb3RlY3RlZCB2b2lkIGxvZ19lcnJvcihzdHJpbmcgZmlsZSwgc3RyaW5nIG1lc3NhZ2UsIGludCB3YXJuKSB7CisgIHN0cmluZyBsZmlsZTsKKyAgc3RyaW5nIGNyOworICBtaXhlZCAqbGZpbGVfc2l6ZTsKKworICBpZiAoaGFuZGxpbmdfZXJyb3IgPT0gZWZ1bjo6dGltZSgpKSB7CisgICAgLy8gRmVobGVyIGltIFZlcmxhdWYgZWluZXIgRmVobGVyYmVoYW5kbHVuZzogRmVobGVyYmVoYW5kbHVuZyBtaW5pbWllcmVuLAorICAgIC8vIG51ciBNZWxkdW5nIGFuIGVpbmdlbG9nZ3RlIEVyem1hZ2llci4KKyAgICB0ZWxsX3BsYXllcnMoImxvZ19lcnJvcigpOiBSZWt1cnNpdmVyIEZlaGxlciBpbiBGZWhsZXJiZWhhbmRsdW5nLiAiCisgICAgICAgICJCaXR0ZSBEZWJ1Z2xvZyBiZWFjaHRlbi4gQWt0dWVsbGVyIEZlaGxlciBpbiAiICsgZmlsZSArICI6ICIKKyAgICAgICAgKyBtZXNzYWdlLCBBUkNIX0xWTCk7CisgICAgcmV0dXJuOworICB9CisgIGhhbmRsaW5nX2Vycm9yID0gZWZ1bjo6dGltZSgpOworCisgLy9GZWhsZXJkYXRlbiBhbiBkZW4gRXJyb3JkIHp1ciBTcGVpY2hlcnVuZyB3ZWl0ZXJnZWJlbiwgZmFsbHMgd2lyIHNvd2FzCisgLy9oYWJlbi4KKyNpZmRlZiBFUlJPUkQKKyAgLy8gT25seSBjYWxsIHRoZSBlcnJvcmQgaWYgd2UgYXJlIF9ub3RfIGNvbXBpbGluZyB0aGUgc2VmdW5zLiBJdCB1c2VzIHNlZnVucworICAvLyBhbmQgaXQgd2lsbCBjYXVzZSBhIHJlY3Vyc2luZyBjYWxsIHRvIGdldF9zaW11bF9lZnVucygpIHdoaWNoIGlzIGJvdW5kIHRvCisgIC8vIGZhaWwuCisgIGlmICghbG9hZGluZ19zaW11bF9lZnVucykgeworICAgIGNhdGNoKGxpbWl0ZWQoIydjYWxsX290aGVyLCh7MjAwMDAwfSksRVJST1JELCJMb2dDb21waWxlUHJvYmxlbSIsCisgICAgICAgICAgZmlsZSxtZXNzYWdlLHdhcm4pO3B1Ymxpc2ggKTsKKyAgfQorI2VuZGlmIC8vIEVSUk9SRAorCisgLy8gTG9nZmlsZSBiZXN0aW1tZW4KKyAgY3I9Y3JlYXRvcl9maWxlKGZpbGUpOworICBpZiAoIWNyKSAgICAgICAgICAgICAgICAgICAgIGxmaWxlPSJOT0JPRFkuZXJyIjsKKyAgZWxzZSBpZiAoY3I9PVJPT1RJRCkgICAgICAgICBsZmlsZT0iUk9PVCI7CisgIGVsc2UgaWYgKGVmdW46Om1lbWJlcihjciwnICcpIT0tMSkgbGZpbGU9IlNURCI7CisgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgbGZpbGU9Y3I7CisgIC8vamUgbmFjaCBXYXJudW5nIG9kZXIgRmVobGVyIFZlcnplaWNobmlzIHVuZCBTdWZmaXggYmVzdGltbWVuCisgIGlmICh3YXJuKSB7CisgICAgICBsZmlsZT0iL2xvZy93YXJuaW5nLyIgKyBsZmlsZSArICIud2FybiI7CisgIH0KKyAgZWxzZSB7CisgICAgICBsZmlsZT0iL2xvZy9lcnJvci8iICsgbGZpbGUgKyAiLmVyciI7CisgIH0KKworICAvLyBCZWkgQmVkYXJmIFJvdGllcmVuIGRlcyBMb2dmaWxlcworICBpZiAoICFsb2FkaW5nX3NpbXVsX2VmdW5zCisgICAgICAmJiBzaXplb2YobGZpbGVfc2l6ZSA9IGdldF9kaXIobGZpbGUsMikpCisgICAgICAmJiBsZmlsZV9zaXplWzBdID49IE1BWF9FUlJMT0dfU0laRSApCisgIHsKKyAgICBjYXRjaChyZW5hbWUobGZpbGUsIGxmaWxlICsgIi5vbGQiKTsgcHVibGlzaCk7IC8qIE5vIHBhbmljIGlmIGZhaWx1cmUgKi8KKyAgICBpZiAoIWxvYWRpbmdfc2ltdWxfZWZ1bnMpCisgICAgeworICAgICAgY2F0Y2goc2VuZF9jaGFubmVsX21zZygiRW50d2lja2x1bmciLCI8TWFzdGVSPiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTG9nZmlsZSByb3RpZXJ0OiAiK2xmaWxlKyIuIikpOworICAgIH0KKyAgfQorCisgIGVmdW46OndyaXRlX2ZpbGUobGZpbGUsbWVzc2FnZSk7CisKKyAgLy8gTWFnaWVyIGJla29tbWVuIGRpZSBGZWhsZXJtZWxkdW5nIGFuZ2V6ZWlndAorICBpZiAoSVNfTEVBUk5FUihUSSkpIGVmdW46OnRlbGxfb2JqZWN0KFRJLCBtZXNzYWdlKTsKKworICBoYW5kbGluZ19lcnJvciA9IDA7Cit9CisKKy8qIEdlZ2VubWFzc25haG1lIGdlZ2VuICd0b28gbG9uZyBldmFsJyBpbSBIYW5kbGVyIHZvbSBydW50aW1lIGVycm9yOgorICAgQXVmc3BsaXR0ZW4gZGVzIEhhbmRsZXJzIHVuZCBOdXR6dW5nIHZvbiBsaW1pdGVkKCkgKi8KKy8va2VpbmUgR0QtRnVua3Rpb24KK3ByaXZhdGUgdm9pZCBoYW5kbGVfcnVudGltZV9lcnJvcihzdHJpbmcgZXJyLCBzdHJpbmcgcHJnLCBzdHJpbmcgY3Vyb2JqLAorICAgIGludCBsaW5lLCBtaXhlZCBjdWxwcml0LCBpbnQgY2F1Z2h0LCBvYmplY3QgcG8sIGludCBpc3N1ZWlkKQoreworICBzdHJpbmcgY29kZTsKKyAgc3RyaW5nIGRlYnVnX3R4dDsKKyAgb2JqZWN0IG9iLCB0aXRwOyAKKworICAvL0RFQlVHKHNwcmludGYoIkNhbGxlcnN0YWNrOiAoaGFuZGxlX3J1bnRpbWVfZXJyb3IoKSk6ICVPXG4iLAorICAvLyAgICAgICAgY2FsbGVyX3N0YWNrKDEpKSk7CisgIC8vIEZlaGxlcm1lbGR1bmcgYmF1ZW4KKyAgaWYgKCFzdHJpbmdwKGVycikpICAgIGVycj0iPE5VTEw+IjsKKyAgaWYgKCFzdHJpbmdwKHByZykpICAgIHByZz0iPE5VTEw+IjsKKyAgaWYgKCFzdHJpbmdwKGN1cm9iaikpIGN1cm9iaj0iPE5VTEw+IjsKKyAgZGVidWdfdHh0PWVmdW46OnNwcmludGYoIkZlaGxlcjogJU8sIE9iamVrdDogJXMsIFByb2dyYW1tOiAlTywgWmVpbGUgJU8gKCVzKSwgIgorICAgICAgICAgICAgICAgICAgICAiSUQ6ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgZXJyWzAuLjwyXSwgY3Vyb2JqLCAocHJnWzBdIT0nPCc/Ii8iOiIiKStwcmcsIGxpbmUsCisgICAgICAgICAgICAgICAgICAgIChUST9lZnVuOjpjYXBpdGFsaXplKGVmdW46OmdldHVpZChUSSkpOiI8VW5iZWthbm50PiIpLAorICAgICAgICAgICAgICAgICAgICBpc3N1ZWlkKTsKKworICB0aXRwID0gVEkgfHwgVFA7CisgIC8vIEZlaGxlcm1lbGR1bmcgYW4gS2FuYWVsZSBzY2hpY2tlbiwgYWJlciBudXIgd2VubiBkZXIgYWt0dWVsbGUgRmVobGVyCisgIC8vIG5pY2h0IHdhZWhyZW5kIGRlcyBsYWRlbnMgZGVyIHNpbXVsZWZ1bnMgYXVmdHJhdCwgYmVpIGRlciBBdXNnYWJlIGRlcgorICAvLyBNZWxkdW5nIHVlYmVyIGRpZSBLYWVuYWVsZSB3aWVkZXIgc2VmdW5zIGdlbnV0enQgd2VyZGVuLgorICBpZiAoIWxvYWRpbmdfc2ltdWxfZWZ1bnMpIHsKKyAgICBpZiAodGl0cCAmJiAoSVNfTEVBUk5FUih0aXRwKSB8fCAodGl0cC0+UXVlcnlQcm9wKFBfVEVTVFBMQVlFUikpKSkKKyAgICB7CisgICAgICBjYXRjaChzZW5kX2NoYW5uZWxfbXNnKCJFbnR3aWNrbHVuZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUob2JqZWN0cChwbykgPyBSRUFMX1VJRChwbykgOiAiIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnX3R4dCkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgY2F0Y2goc2VuZF9jaGFubmVsX21zZygiRGVidWciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBpdGFsaXplKG9iamVjdHAocG8pID8gUkVBTF9VSUQocG8pIDogIiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Z190eHQpKTsKKyAgICB9CisgIH0KKworICBpZiAoIXRpdHApIHJldHVybjsKKworICAvLyBGZWhsZXJtZWxkdW5nIGFuIEJlbnV0emVyCisgIGlmIChJU19MRUFSTkVSKHRpdHApKQorICAgIGVmdW46OnRlbGxfb2JqZWN0KHRpdHAsCisgICAgICAgICAgICAgICAgZWZ1bjo6c3ByaW50ZigiJSctJzc4Ljc4c1xuZmlsZTogJXMgbGluZTogJWQgb2JqZWN0OiAlc1xuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAiJXNlcnJvcjogJXMlJy0nNzguNzhzXG4iLCIiLHByZyxsaW5lLGN1cm9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgIChwcmcmJihjb2RlPWVmdW46OnJlYWRfZmlsZSgiLyIrcHJnLGxpbmUsMSkpPworICAgICAgICAgICAgICAgICAgICAgICAgICJcbiIrY29kZSsiXG4iOiIiKSxlcnIsIiIpKTsKKyAgZWxzZQorICAgIGVmdW46OnRlbGxfb2JqZWN0KHRpdHAsICJEdSBzaWVoc3QgZWluZW4gRmVobGVyIGltIFJhdW0tWmVpdC1HZWZ1ZWdlLlxuIik7Cit9CisKKy8vS2VpbmUgR0QtRnVua3Rpb24sIGxpbWl0aWVydCBkaWUgS29zdGVuIGZ1ZXIgZGVuIGhhbmRsZXIKK3ByaXZhdGUgdm9pZCBjYWxsX3J1bnRpbWVfZXJyb3Ioc3RyaW5nIGVyciwgc3RyaW5nIHByZywgc3RyaW5nIGN1cm9iaiwKKyAgICBpbnQgbGluZSwgbWl4ZWQgY3VscHJpdCwgaW50IGNhdWdodCwgb2JqZWN0IHBvKQoreworICBpZiAoaGFuZGxpbmdfZXJyb3IgPT0gZWZ1bjo6dGltZSgpKQorICB7CisgICAgLy8gRmVobGVyIGltIFZlcmxhdWYgZWluZXIgRmVobGVyYmVoYW5kbHVuZzogRmVobGVyYmVoYW5kbHVuZyBtaW5pbWllcmVuLAorICAgIC8vIG51ciBNZWxkdW5nIGFuIGVpbmdlbG9nZ3RlIFJlZ2lvbnNtYWdpZXIuCisgICAgdGVsbF9wbGF5ZXJzKCJjYWxsX3J1bnRpbWVfZXJyb3IoKTogUmVrdXJzaXZlciBGZWhsZXIgaW4gIgorICAgICAgICAiRmVobGVyYmVoYW5kbHVuZy4gQml0dGUgRGVidWdsb2cgYmVhY2h0ZW4uIEFrdHVlbGxlciBGZWhsZXIgaW4gIgorICAgICAgICArIGN1cm9iaiArICI6ICIgKyBlcnIsIExPUkRfTFZMKTsKKyAgICByZXR1cm47CisgIH0KKyAgaGFuZGxpbmdfZXJyb3IgPSBlZnVuOjp0aW1lKCk7CisKKyAgLy9GZWhsZXJkYXRlbiBhbiBkZW4gRXJyb3JkIHp1ciBTcGVpY2hlcnVuZyB3ZWl0ZXJnZWJlbiwgZmFsbHMgd2lyIHNvd2FzCisgIC8vaGFiZW4uCisjaWZkZWYgRVJST1JECisgIGludCBpc3N1ZWlkOworICAvLyBXZW5uIGRpZSBzZWZ1bnMgZ2VyYWRlIGdlbGFkZW4gd2VyZGVuLCBlcmZvbGd0IGtlaW5lIFdlaXRlcmdhYmUgYW4gZGVuCisgIC8vIEVycm9yRCwgZGEgZGFiZWkgd2llZGVyIHNlZnVucyBnZXJ1ZmVuIHdlcmRlbiwgd2FzIHp1IGVpbmVyIFJla3Vyc2lvbgorICAvLyBmdWVocnQuCisgIGlmICghbG9hZGluZ19zaW11bF9lZnVucykgeworICAgIGNhdGNoKGlzc3VlaWQ9ZWZ1bjo6bGltaXRlZCgjJ2NhbGxfb3RoZXIsKHsyMDAwMDB9KSxFUlJPUkQsIkxvZ0Vycm9yIiwKKyAgICAgICAgICBlcnIscHJnLGN1cm9iaixsaW5lLGN1bHByaXQsY2F1Z2h0KTtwdWJsaXNoKTsKKyAgfQorI2VuZGlmIC8vIEVSUk9SRAorCisgIC8vZWlnZW5lbiBFcnJvcmhhbmRsZXIgbGF1ZnplaXRiZWdyZW56dCBydWZlbgorICBlZnVuOjpsaW1pdGVkKCMnaGFuZGxlX3J1bnRpbWVfZXJyb3IsICh7IDIwMDAwMCB9KSwgZXJyLCBwcmcsIGN1cm9iaiwKKyAgICAgICAgbGluZSxjdWxwcml0LGNhdWdodCwgcG8sIGlzc3VlaWQpOworCisgIGhhbmRsaW5nX2Vycm9yID0gMDsKK30KKworLy8gTGF1ZnplaXRmZWhsZXJiZWhhbmRsdW5nLCBoZWJ0IEV2YWxjb3N0LUJlc2NocmFlbmt1bmcgYXVmIHVuZCByZWljaHQgd2VpdGVyCisvLyBhbiBjYWxsX3J1bnRpbWVfZXJyb3IsIGRpZSBkaWUgR3JlbnplIHdpZWRlciBhdWYgZWluZW4gYmVzdGltbXRlbiBXZXJ0CisvLyBmZXN0bGVndC4KK3Byb3RlY3RlZCB2b2lkIHJ1bnRpbWVfZXJyb3Ioc3RyaW5nIGVyciAsc3RyaW5nIHByZywgc3RyaW5nIGN1cm9iaiwgaW50IGxpbmUsCisgICAgIG1peGVkIGN1bHByaXQsIGludCBjYXVnaHQpIHsKKworICAgIC8vREVCVUcoc3ByaW50ZigiQ2FsbGVyc3RhY2s6IChydW50aW1lX2Vycm9yKCkpOiAlT1xuUE86ICVPXG5QTygwKTogJU9cbiIsCisgICAgLy8gICAgICAgICAgY2FsbGVyX3N0YWNrKDEpLHByZXZpb3VzX29iamVjdCgpLHByZXZpb3VzX29iamVjdCgwKSkpOworCisgICAgbGltaXRlZCgjJ2NhbGxfcnVudGltZV9lcnJvciwgKHsgTElNSVRfVU5MSU1JVEVEIH0pLAorICAgICAgICBlcnIscHJnLGN1cm9iaixsaW5lLGN1bHByaXQsY2F1Z2h0LHByZXZpb3VzX29iamVjdCgpKTsKK30KKworLy9XYXJudW5nZW4gbWl0bG9nZ2VuCitwcm90ZWN0ZWQgdm9pZCBydW50aW1lX3dhcm5pbmcoIHN0cmluZyBtc2csIHN0cmluZyBjdXJvYmosIHN0cmluZyBwcm9nLCBpbnQgbGluZSwKKyAgICBpbnQgaW5zaWRlX2NhdGNoKQoreworICBzdHJpbmcgY29kZTsKKyAgc3RyaW5nIGRlYnVnX3R4dDsKKyAgb2JqZWN0IHRpdHA7CisKKyAgLy9ERUJVRyhzcHJpbnRmKCJDYWxsZXJzdGFjazogaW4gcnVudGltZV93YXJuaW5nKCk6ICVPXG5QTygwKTogJU9cbiIsCisgIC8vICAgICAgICBjYWxsZXJfc3RhY2soMSkscHJldmlvdXNfb2JqZWN0KDApKSk7CisKKyAgLy9EYXRlbiBkZXIgV2FybnVuZyBhbiBkZW4gRXJyb3JkIHp1ciBTcGVpY2hlcnVuZyB3ZWl0ZXJnZWJlbiwgZmFsbHMgd2lyIAorICAvL3Nvd2FzIGhhYmVuLgorICBpbnQgaXNzdWVpZDsKKyNpZmRlZiBFUlJPUkQKKyAgY2F0Y2goaXNzdWVpZD1saW1pdGVkKCMnY2FsbF9vdGhlciwoezIwMDAwMH0pLEVSUk9SRCwiTG9nV2FybmluZyIsCisgICAgICAgIG1zZyxwcm9nLGN1cm9iaixsaW5lLGluc2lkZV9jYXRjaCk7IHB1Ymxpc2gpOworI2VuZGlmIC8vIEVSUk9SRAorCisgIC8vIEZlaGxlcm1lbGR1bmcgYmF1ZW4KKyAgaWYgKCFzdHJpbmdwKG1zZykpICAgIG1zZz0iPE5VTEw+IjsKKyAgaWYgKCFzdHJpbmdwKHByb2cpKSAgICBwcm9nPSI8TlVMTD4iOworICBpZiAoIXN0cmluZ3AoY3Vyb2JqKSkgY3Vyb2JqPSI8TlVMTD4iOworICBkZWJ1Z190eHQ9c3ByaW50ZigiV2FybnVuZzogJU8sIE9iamVrdDogJXMsIFByb2dyYW1tOiAlTywgWmVpbGUgJU8gKCVzKSAiCisgICAgICAgICAgICAgICAgICAgICJJRDogJWQiLAorICAgICAgICAgICAgICAgICAgICBtc2dbMC4uPDJdLCBjdXJvYmosIChwcm9nWzBdIT0nPCc/Ii8iOiIiKStwcm9nLCBsaW5lLAorICAgICAgICAgICAgICAgICAgICAoVEk/Y2FwaXRhbGl6ZShnZXR1aWQoVEkpKToiPFVuYmVrYW5udD4iKSwKKyAgICAgICAgICAgICAgICAgICAgaXNzdWVpZCk7CisKKyAgLy9GZWhsZXJtZWxkdW5nZW4gYW4gLXdhcm51bmdlbiBzY2hpY2tlbgorICBjYXRjaChzZW5kX2NoYW5uZWxfbXNnKCJXYXJudW5nZW4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUob2JqZWN0cChwcmV2aW91c19vYmplY3QoKSkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVBTF9VSUQocHJldmlvdXNfb2JqZWN0KCkpIDogIiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnX3R4dCkpOworCisgIHRpdHAgPSBUSSB8fCBUUDsKKworICBpZiAoIXRpdHApIHJldHVybjsKKworICAvLyBGZWhsZXJtZWxkdW5nIGFuIEJlbnV0emVyCisgIGlmIChJU19MRUFSTkVSKHRpdHApKQorICAgIHRlbGxfb2JqZWN0KHRpdHAsCisgICAgICAgICAgICAgICAgc3ByaW50ZigiJSctJzc4Ljc4c1xuZmlsZTogJXMgbGluZTogJWQgb2JqZWN0OiAlc1xuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAiJXNXYXJudW5nOiAlcyUnLSc3OC43OHNcbiIsIiIscHJvZyxsaW5lLGN1cm9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgIChwcm9nJiYoY29kZT1yZWFkX2ZpbGUoIi8iK3Byb2csbGluZSwxKSk/CisgICAgICAgICAgICAgICAgICAgICAgICAgIlxuIitjb2RlKyJcbiI6IiIpLG1zZywiIikpOworICByZXR1cm47Cit9CisKKworLy8gICAgICAgICAgICAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIworLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRWlucmljaHRlbiBkZXMgRUQgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworLy8gICAgICAgICAgICAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisvLyBTZXR1cCBzcGVpY2hlcm4KK3Byb3RlY3RlZCBpbnQgc2F2ZV9lZF9zZXR1cChvYmplY3Qgd2hvLCBpbnQgY29kZSkKK3sKKyAgc3RyaW5nIGZpbGU7CisKKyAgaWYgKCFpbnRwKGNvZGUpKSByZXR1cm4gMDsKKyAgZmlsZSA9IHNwcmludGYoIi9wbGF5ZXJzLyVzLy5lZHJjIixnZXRldWlkKHdobykpOworICBybShmaWxlKTsKKyAgcmV0dXJuIHdyaXRlX2ZpbGUoZmlsZSwoc3RyaW5nKWNvZGUpOworfQorCisvLyBTZXR1cCBlaW5sYWRlbgorcHJvdGVjdGVkIGludCByZXRyaWV2ZV9lZF9zZXR1cChvYmplY3Qgd2hvKQoreworICBzdHJpbmcgZmlsZTsKKworICBmaWxlID0gc3ByaW50ZigiL3BsYXllcnMvJXMvLmVkcmMiLGdldHVpZCh3aG8pKTsKKyAgaWYgKGZpbGVfc2l6ZShmaWxlKTwxKSByZXR1cm4gMDsKKyAgcmV0dXJuIChpbnQpcmVhZF9maWxlKGZpbGUpOworfQorCisvLyBXbyB3ZXJkZW4gRGF0ZWllbiBnZXNwZWljaGVydD8KK3N0cmluZyBnZXRfZWRfYnVmZmVyX3NhdmVfZmlsZV9uYW1lKHN0cmluZyBmaWxlKQoreworICByZXR1cm4gc3ByaW50ZigiL3BsYXllcnMvJXMvLmRlYWRfZWRfZmlsZXMvJXMiLAorICAgICAgICAgICAgICAgICBnZXR1aWQodGhpc19wbGF5ZXIoKSksZWZ1bjo6ZXhwbG9kZShmaWxlLCAiLyIpWzwxXSk7ICAKK30KKworLy8gICAgICAgICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworLy8jIyMjIyMjIyMjIyMjIyMjIyMjIFVuZ2VudXR6dGUgUGZsaWNodGZ1bmt0aW9uZW4gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworLy8gICAgICAgICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisvLyBOaWNodHMgenUgdHVuIGJlaW0gTWFzdGVyLU5ldXN0YXJ0Citwcm90ZWN0ZWQgdm9pZCBleHRlcm5hbF9tYXN0ZXJfcmVsb2FkKCkgIHsgcmV0dXJuOyB9CisKKy8vIEtlaW5lIGV4dGVybmVuIE1hc3Rlci1GbGFncworcHJvdGVjdGVkIHZvaWQgZmxhZyhzdHJpbmcgc3RyKSB7IHJldHVybjsgfQorCisvLyBXaXJkIGJlbm9ldGlndCwgZmFsbHMgRVJRIGFuZ2VzY2hsb3NzZW4gaXN0Citwcm90ZWN0ZWQgdm9pZCBzdGFsZV9lcnEoY2xvc3VyZSBjYWxsYmFjaykgeyByZXR1cm47IH0KKworLy8gWmVyc3RvZXJ0ZW4gTWFzdGVyIHdpZWRlcmJlbGViZW4gLi4uCisvLyBuaWNodCB2aWVsIHp1IHR1biwgd2VubiBmbGFnIGdlc2V0enQgaXN0LiBXZW5uIGFiZXIgbmljaHQsIHNpbmQgYWxsZQorLy8gVmFyaWFibGVuIGF1ZiAwLiBOYWNoIGRpZXNlciBGdW5rdGlvbiB3aXJkIHdpZWRlciBpbmF1Z3VyYXRlX21hc3RlcigpCisvLyBnZXJ1ZmVuLgorcHJvdGVjdGVkIHZvaWQgcmVhY3RpdmF0ZV9kZXN0cnVjdGVkX21hc3RlcihpbnQgZmxhZykgeworICAgIGlmIChmbGFnKSB7CisgICAgICAgIC8vcmUtaW5pdAorICAgICAgICAvL3dhcyBtYWNoZW4/IFRPRE8KKyAgICB9CisgICAgcmV0dXJuOworfQorCisvLyBLZWluIFF1b3RhLURlbW9uIChwb3RlbnRpZWxsZXMgVE9ETykKKy8vSGFuZGxlIHF1b3RhcyBpbiB0aW1lcyBvZiBtZW1vcnkgc2hvcnRhZ2UuCisvL2lzIGNhbGxlZCBkdXJpbmcgdGhlIGZpbmFsIHBoYXNlIG9mIGEgZ2FyYmFnZSBjb2xsZWN0aW9uLCBpZiB0aGUgdXNlcgorLy9yZXNlcnZlIGNvdWxkIG5vdCBiZSByZS1hbGxvY2F0ZWQuIExhc3QgKCEpIENoYW5jZSB0byBmcmVlIChhY3RpdmUpIG9iamVjdHMgCisvL2Zyb20gdGhlIHN5c3RlbSBhbmQgcHJldmVudCBjYWxsIHRvIHNsb3dfc2h1dF9kb3duKCkhCitwcm90ZWN0ZWQgdm9pZCBxdW90YV9kZW1vbigpIHsKKyAgICAvL3dhcyBrYW5uIG1hbiBtYWNoZW4/CisgICAgLy91ZWJlcnZvbGxlIFNlaGVyaGFldXNlciBsZWVyZW4/IAorICAgIHJldHVybjsKK30KKworLy8gS2VpbmUgUHJlcG9zaXRpb25lbiBpbiBwYXJzZV9jb21tYW5kCisvL3N0cmluZyAqcGFyc2VfY29tbWFuZF9wcmVwb3NfbGlzdCgpIHsgcmV0dXJuICh7fSk7IH0KKworLy8gV2llIGxhdXRldCBkYXMgV29ydCBmdWVyICdhbGxlJyA/CisvL3N0cmluZyAqcGFyc2VfY29tbWFuZF9hbGxfd29yZCgpIHsgcmV0dXJuICh7fSk7IH0KKworCisvLyBLZWluZSBCZXNvbmRlcmVuIE9iamVrdG5hbWVuCitzdHJpbmcgcHJpbnRmX29ial9uYW1lKG9iamVjdCBvYikgeyByZXR1cm4gMDsgfQorCisvLyAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMKKy8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBTb25zdGlnZXMvSG9va3MgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKy8vICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIworCisvL1RPRE86IHNhdmVfd2l6X2ZpbGUgaW4gc2h1dGRvd24oKSBpbnRlZ3JpZXJlbj8KKy8vIFdpemxpc3RlIHNwZWljaGVybjogWmVpbGUgZ2VuZXJpZXJlbgorc3RhdGljIHN0cmluZyBfc2F2ZV93aXpfZmlsZV9sb29wKG1peGVkICphKQoreworICByZXR1cm4gc3ByaW50ZigiJXMgJWQgJWRcbiIsYVtXTF9OQU1FXSxhW1dMX0NPTU1BTkRTXSxhW1dMX0VYVFJBXSk7Cit9CisKKy8vIFdpemxpc3RlIHNwZWljaGVybgorcHJvdGVjdGVkIHZvaWQgc2F2ZV93aXpfZmlsZSgpCit7CisgIHJtKCIvV0laTElTVCIpOworICB3cml0ZV9maWxlKCIvV0laTElTVCIsaW1wbG9kZSgKKyAgICAgbWFwKHdpemxpc3RfaW5mbygpLCMnX3NhdmVfd2l6X2ZpbGVfbG9vcCksIiIpKTsKK30KKworLy8gVE9ETzogbWFjaHQgZGVyIHRlbG5ldF9uZWctaG9vayB1ZWJlcmhhdXB0IHdhcz8KK3ZvaWQgdGVsbmV0X25lZyhtaXhlZCBjbWQsbWl4ZWQgb3B0LG1peGVkIGFyZ3MpCit7CisgIGlmIChvcHQ9PTM0ICYmIGNtZD09MjUxKQorICAgICAgICBiaW5hcnlfbWVzc2FnZSgoezI1NSwyNTAsMzQsMSwxLDI1NSwyNDB9KSk7Cit9CisgIAorLy8gRVVJRCB1bmQgVUlEIHdlcmRlbiB2b24gZ2l2ZV91aWRfdG9fb2JqZWN0KCkgdmVyZ2ViZW4sIGRpZXNlIHNpbmQgaW4KKy8vIGluYXVndXJhdGVfbWFzdGVyKCkgYWxzIGRyaXZlciBob29rcyBhbmdlbWVsZGV0LgorCisvKmxvYWRfdWlkX2hvb2soKSBzb2xsdGUgbWFjaGVuLCB3YXMgZGllc2UgTGFtYmRhIG1hY2h0ZS4uLgorICB1bmJvdW5kX2xhbWJkYSggKHsncHJpbnRmX29ial9uYW1lfSksCisgICAgICAgICAgICAgICAoeyMnZ2l2ZV91aWRfdG9fb2JqZWN0LCdwcmludGZfb2JqX25hbWUsCisgICAgICAgICAgICAgICAgICAgKHsjJ3ByZXZpb3VzX29iamVjdH0pLDB9KSkpOyAgICovCitwcm90ZWN0ZWQgbWl4ZWQgbG9hZF91aWRfaG9vayhzdHJpbmcgZGF0ZWkpIHsKKyAgICByZXR1cm4oZ2l2ZV91aWRfdG9fb2JqZWN0KGRhdGVpLHByZXZpb3VzX29iamVjdCgpKSk7Cit9CisKKy8qIGNsb25lX3VpZF9ob29rIHNvbGx0ZSBtYWNoZW4sIHdhcyBkaWVzZSBMYW1iZGEgbWFjaHRlLi4uCisgICAgICAgICAgICB1bmJvdW5kX2xhbWJkYSggKHsnYmx1ZXByaW50LCAnbmV3X25hbWV9KSwgCisgICAgICAgICAgICAgICh7IydnaXZlX3VpZF90b19vYmplY3QsJ25ld19uYW1lLAorICAgICAgICAgICAgICAgICAgKHsjJ3ByZXZpb3VzX29iamVjdH0pLDF9KSkpOyAgICAgICovCitwcm90ZWN0ZWQgbWl4ZWQgY2xvbmVfdWlkX2hvb2soc3RyaW5nIGJsdWVwcmludCxzdHJpbmcgbmV3X25hbWUpIHsKKyAgICByZXR1cm4oZ2l2ZV91aWRfdG9fb2JqZWN0KG5ld19uYW1lLHByZXZpb3VzX29iamVjdCgpKSk7Cit9CisKZGlmZiAtLWdpdCBhL3NlY3VyZS9tYXN0ZXIuaCBiL3NlY3VyZS9tYXN0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTdiMGQwCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL21hc3Rlci5oCkBAIC0wLDAgKzEsMTI2IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gbWFzdGVyLmggLS0gZGVmaW5pdGlvbnMgZm9yIHRoZSBtYXN0ZXIgb2JqZWN0CisvLworLy8gJElkOiBtYXN0ZXIuaCA4ODA5IDIwMTQtMDUtMDggMTk6NTI6NDhaIFplc3N0cmEgJAorCisjaWZuZGVmIF9fTUFTVEVSX0hfXworI2RlZmluZSBfX01BU1RFUl9IX18KKworCisjaWZkZWYgUF9BUk1PVVJTCisjdW5kZWYgUF9BUk1PVVJTCisjZW5kaWYKKyNkZWZpbmUgUF9BUk1PVVJTICJhcm1vdXJzIgorCisjaWZkZWYgUF9XRUFQT04KKyN1bmRlZiBQX1dFQVBPTgorI2VuZGlmCisjZGVmaW5lIFBfV0VBUE9OICJ3ZWFwb24iCisKKy8vZnVlciBkZW4gbm90aWZ5X2ZhaWwtSG9vaworI2lmbmRlZiBQX0RFRkFVTFRfTk9USUZZX0ZBSUwKKyNkZWZpbmUgUF9ERUZBVUxUX05PVElGWV9GQUlMICJkZWZhdWx0X25vdGlmeV9mYWlsIgorI2VuZGlmCisKKyNpbmNsdWRlICIvc2VjdXJlL2NvbmZpZy5oIgorCisjaW5jbHVkZSAiL3N5cy91c2VyaW5mby5oIgorI2luY2x1ZGUgIi9zeXMvc2hlbGxzLmgiCisjaW5jbHVkZSAiL3N5cy9wbGF5ZXIvYmFzZS5oIgorI2luY2x1ZGUgIi9zeXMvbW92aW5nLmgiCisjaW5jbHVkZSAiL3N5cy9kZWZpbmVzLmgiCisjaW5jbHVkZSAiL3N5cy93aXpsaXN0LmgiCisjaW5jbHVkZSAiL3N5cy9kYWVtb24uaCIKKyNpbmNsdWRlICIvc3lzL21haWwuaCIKKyNpbmNsdWRlICIvc3lzL2RyaXZlcl9ob29rLmgiCisjaW5jbHVkZSAiL3N5cy9mdW5jdGlvbmxpc3QuaCIKKworI2luY2x1ZGUgIi9zZWN1cmUvd2l6bGV2ZWxzLmgiCisKKy8vI2RlZmluZSBERUJVRyh4KQorI2lmbmRlZiBERUJVRworI2RlZmluZSBERUJVRyh4KQlpZiAoZnVuY2FsbChzeW1ib2xfZnVuY3Rpb24oJ2ZpbmRfcGxheWVyKSwiemVzc3RyYSIpKVwKKyAgICAgICAgdGVsbF9vYmplY3QoZnVuY2FsbChzeW1ib2xfZnVuY3Rpb24oJ2ZpbmRfcGxheWVyKSwiemVzc3RyYSIpLFwKKyAgICAgICAgIk1EQkc6ICIreCsiXG4iKQorI2VuZGlmCisKKy8vTG9nZmlsZSBmdWVyIExlc2V6dWdyaWZmZQorI2RlZmluZSBSRUFEX0ZJTEUgICIvbG9nL0FSQ0gvUkVBRF9GSUxFIgorCisvL0xvZ2ZpbGUgZnVlciBDcmFzaGVzCisjZGVmaW5lIENSQVNIX0xPRyAgIi9sb2cvQ1JBU0hfTE9HIgorCisvLyBNQVhfRVJSTE9HX1NJWkUgZGVmaW5pZXJ0LCBhYiB3ZWxjaGVyIEdyb2Vzc2UgZWluIExvZyBpbgorLy8gL2xvZy9lcnJvciByb3RpZXJ0LgorI2RlZmluZSBNQVhfRVJSTE9HX1NJWkUgNTEyMDAgCisKKyNkZWZpbmUgbG9nX2ZpbGUoZmlsZSxzdHIpIHdyaXRlX2ZpbGUoIi9sb2cvIitmaWxlLCBzdHIpCisjZGVmaW5lIE5BTUUoeCkgICAgICAgICAgICBnZXR1aWQoeCkKKyNkZWZpbmUgQ0FQX05BTUUoeCkgICAgICAgIGNhcGl0YWxpemUoTkFNRSh4KSkKKyNkZWZpbmUgVFAgICAgICAgICAgICAgICAgIGVmdW46OnRoaXNfcGxheWVyKCkKKyNkZWZpbmUgVEkgICAgICAgICAgICAgICAgIGVmdW46OnRoaXNfaW50ZXJhY3RpdmUoKQorI2RlZmluZSBQTyAgICAgICAgICAgICAgICAgZWZ1bjo6cHJldmlvdXNfb2JqZWN0KCkKKyNkZWZpbmUgVE8gICAgICAgICAgICAgICAgIGVmdW46OnRoaXNfb2JqZWN0KCkKKworLy8gVmVyemVpY2huaXMgbWl0IEluZm9tYWlscyBmdWVyIE1hZ2llcmJlZm9lcmRlcnVuZ2VuCisjZGVmaW5lIFdJWl9IRUxQX01BSUxfRElSICIvZG9jL2luZm9tYWlscy8iCisKKy8vIGF1cyBtYXN0ZXIuYworc3RyaW5nICAgICAgICBjcmVhdG9yX2ZpbGUobWl4ZWQgc3RyKTsKK21peGVkICAgICAgICAgZ2l2ZV91aWRfdG9fb2JqZWN0KHN0cmluZyBkYXRlaSxvYmplY3QgcG8pOwordm9pZCAgICAgICAgICBzYXZlX3dpel9maWxlKCk7CittaXhlZCAgICAgICAgIGxvYWRfdWlkX2hvb2soc3RyaW5nIGRhdGVpKTsKK21peGVkICAgICAgICAgY2xvbmVfdWlkX2hvb2soc3RyaW5nIGJsdWVwcmludCxzdHJpbmcgbmV3X25hbWUpOworcHJvdGVjdGVkIG1peGVkIGNhbGxfc2VmdW4oc3RyaW5nIHNlZnVuLCB2YXJhcmdzIG1peGVkIGFyZ3MpOworCisvLyBhdXMgZG9tYWlucy5jCitpbnQgICAgICAgICAgICBkb21haW5fbWFzdGVyKHN0cmluZyB1c2VyLCBzdHJpbmcgZG9tYWluKTsKK2ludCAgICAgICAgICAgIGRvbWFpbl9tZW1iZXIoc3RyaW5nIHVzZXIsIHN0cmluZyBkb21haW4pOworc3RyaW5nICAgICAgICAgKmdldF9kb21haW5faG9tZXMoc3RyaW5nIHdpeik7CisKKy8vIGF1cyBndWlsZC5jCitpbnQgICAgICAgICAgIGd1aWxkX21hc3RlcihzdHJpbmcgdXNlciwgc3RyaW5nIGd1aWxkKTsKKworLy8gYXVzIGZpbGVfYWNjZXNzLmMKK3ZvaWQgICAgICAgICAgTG9hZERlcHV0eUZpbGVMaXN0KCk7CittaXhlZCAgICAgICAgIHZhbGlkX3JlYWQoc3RyaW5nIHBhdGgsIHN0cmluZyBldWlkLCBzdHJpbmcgZnVuLCBvYmplY3Qgb2JqKTsKK21peGVkICAgICAgICAgdmFsaWRfd3JpdGUoc3RyaW5nIHBhdGgsIHN0cmluZyBldWlkLCBzdHJpbmcgZnVuLCBvYmplY3Qgb2JqKTsKKworLy8gYXVzIG1pc2MuYworc3RyaW5nICAgICAgICAgX2dldF9wYXRoKHN0cmluZyBwYXRoLCBzdHJpbmcgdXNlcik7CittaXhlZCAgICAgICAgICBRdWVyeUJhbmlzaGVkKHN0cmluZyBzdHIpOworaW50ICAgICAgICAgICAgVEJhbmlzaE5hbWUoc3RyaW5nIG5hbWUsIGludCBkYXlzKTsKKworLy8gc2VuZGV0IGJlaSBCZWZvZXJkZXJ1bmdlbiBJbmZvbWFpbCBhbiBNYWdpZXIKK3Byb3RlY3RlZCB2b2lkIFNlbmRXaXphcmRIZWxwTWFpbChzdHJpbmcgbmFtZSwgaW50IGxldmVsKTsKKworLy8gYXVzIHVzZXJpbmZvLmMKK3B1YmxpYyBpbnQgICAgICAgZmluZF91c2VyaW5mbyhzdHJpbmcgdXNlcik7Citwcm90ZWN0ZWQgbWl4ZWQgKmdldF9mdWxsX3VzZXJpbmZvKHN0cmluZyB1c2VyKTsKK3B1YmxpYyBtaXhlZCAgICAqZ2V0X3VzZXJpbmZvKHN0cmluZyB1c2VyKTsKK3B1YmxpYyBpbnQgICAgICAgZ2V0X3dpel9sZXZlbChzdHJpbmcgdXNlcik7CitwdWJsaWMgc3RyaW5nICAgIHF1ZXJ5X3BsYXllcl9vYmplY3QoIHN0cmluZyBuYW1lICk7CitwdWJsaWMgaW50ICAgICAgIHF1ZXJ5X3dpel9sZXZlbChtaXhlZCBwbGF5ZXIpOworaW50ICAgICAgICAgICAgICB1cGRhdGVfd2l6X2xldmVsKHN0cmluZyB1c2VyLGludCBsZXYpOworcHJvdGVjdGVkIHZvaWQgICBzZXRfZ3VpbGRzKHN0cmluZyBwbGF5ZXIsIHN0cmluZyAqZ3VpbGRzKTsKK3Byb3RlY3RlZCB2b2lkICAgc2V0X2RvbWFpbnMoc3RyaW5nIHBsYXllciwgc3RyaW5nICpkb21haW5zKTsKK3ZvaWQgICAgICAgICAgICAgdXBkYXRlX2xhdGVfcGxheWVycygpOworcHVibGljIHN0cmluZyAgICBzZWN1cmVfc2F2ZWZpbGUoc3RyaW5nIG5hbWUpOworcHJvdGVjdGVkIHZvaWQgICBzYXZlX3VzZXJpbmZvKHN0cmluZyB1c2VyKTsKK3Byb3RlY3RlZCBzdHJpbmcgcXVlcnlfc2VjdXJlX2V1aWQoKTsKK3Byb3RlY3RlZCBpbnQgICAgcXVlcnlfc2VjdXJlX2xldmVsKCk7CitwdWJsaWMgdmFyYXJncyBzdHJpbmcqIFF1ZXJ5VUlEQWxpYXMoc3RyaW5nIGFsaWFzLCBpbnQgcmVjKTsKKworLy9FaW5lbiBNYWdpZXIgYWxzIHZlcmFudHdvcnRsaWNoIGZ1ZXIgZWluZSBiZXN0aW1tdGUgVUlEIGVpbnRyYWdlbgorcHVibGljIHN0cmluZyogICBBZGRXaXphcmRGb3JVSUQoc3RyaW5nIHVpZCwgc3RyaW5nIHdpenVpZCk7CisvL0VpbmVuIE1hZ2llciB3aWVkZXIgYXVzdHJhZ2VuLCB3ZW5uIGVyIG5pY2h0IG1laHIgenVzdGFlbmRpZyBpc3QuCitwdWJsaWMgc3RyaW5nKiAgIFJlbW92ZVdpemFyZEZyb21VSUQoc3RyaW5nIHVpZCwgc3RyaW5nIHdpenVpZCk7CisvL1ZlcmFudHdvcnRsaWNoZSBNYWdpZXIgZnVlciBlaW5lIFVJRCBhdXNnZWJlbgorcHVibGljIHZhcmFyZ3Mgc3RyaW5nKiBRdWVyeVdpemFyZHNGb3JVSUQoc3RyaW5nIHVpZCwgaW50IHJlY3Vyc2l2ZSk7CisvL1dlbGNoZSBVSURzIGlzdCBlaW4gTWFnaWVyIGltcGxpeml0IHZlcmFudHdvcnRsaWNoPyAoSXN0IGVyIFJNLAorLy9HaWxkZW5tYWdpZXIsIGluIHdlbGNoZW4gUmVnaW9uZW4gaGF0IGVyIGVpbiBWZXJ6ZWljaG5pcywgZXRjLikKK3B1YmxpYyB2YXJhcmdzIHN0cmluZyogUXVlcnlVSURzRm9yV2l6YXJkKHN0cmluZyB3aXp1aWQsIGludCByZWN1cnNpdmUpOworCisKKyNlbmRpZiAvL19fTUFTVEVSX0hfXwpkaWZmIC0tZ2l0IGEvc2VjdXJlL21hc3Rlci9hdXRvaW5jbHVkZS5jIGIvc2VjdXJlL21hc3Rlci9hdXRvaW5jbHVkZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwMDAyZmEKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvbWFzdGVyL2F1dG9pbmNsdWRlLmMKQEAgLTAsMCArMSwxMDEgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBzZWN1cmUvbWFzdGVyL2F1dG9pbmNsdWRlLmMgLS0gbW9kdWxlIG9mIHRoZSBtYXN0ZXIgb2JqZWN0OiBBdXRvaW5jbHVkZXMKKy8vCisvLyAkSWQ6IG1hc3Rlci5jIDcwNDEgMjAwOC0xMC0xMyAxODoxODoyN1ogWmVzc3RyYSAkCisKKyNkZWZpbmUgUFJBR01BKHgpICIjcHJhZ21hICJ4IlxuIgorCisvLyBmdWVyIGFsdGUgSG9tZW11ZHMuLi4KKyNpZiBfX1ZFUlNJT05fXyA+PSAiMy41LjAiCisjZGVmaW5lIFJUVENIRUNLUyBQUkFHTUEoInJ0dF9jaGVja3MiKQorI2RlZmluZSBERUZBVUxUUyBQUkFHTUEoInNhdmVfdHlwZXMiKQorI2Vsc2UKKyNkZWZpbmUgUlRUQ0hFQ0tTICIiCisjZGVmaW5lIERFRkFVTFRTIFBSQUdNQSgiY29tYmluZV9zdHJpbmdzLCB2ZXJib3NlX2Vycm9ycywgd2Fybl9kZXByZWNhdGVkIikKKyNlbmRpZgorCisvLyBnZXNjaGFjaHRlbHRlcyBNYXBwaW5nIGluIHRvcGxldmVsLnJlZ2lvbi5tYWdpZXIgSGllcmFyY2hpZS4KKy8vIFdpY2h0aWc6IGplZGUgSGllcmFyY2hpZWJlbmUgX211c3NfIGVpbiBNYXBwaW5nIHNlaW4sIHdlbGNoZXMgZWluZW4gRWludHJhZworLy8gICAgICAgICAgMCBhbHMgRGVmYXVsdCBlbnRoYWVsdCwgd2VsY2hlciBlaW5lbiBTdHJpbmdzIGFscyBXZXJ0IGhhdC4KKy8vICAgICAgICAgIEF1c25haG1lOiBkaWUgbGV0enRlIEViZW5lIChNYWdpZXJlYmVuZSksIGRpZSBtdXNzIGVpbiBTdHJpbmcgZWluLgorcHJpdmF0ZSBub3NhdmUgbWFwcGluZyBhdXRvaW5jbHVkZXMgPSAoWworICAgICJkIjogICAgICAoWworICAgICAgICAgICAgICAgICAiaW5zZWxuIjogKFsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDogIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ6ZXNzdHJhIjogUFJBR01BKCJzdHJvbmdfdHlwZXMiKSBSVFRDSEVDS1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSksCisgICAgICAgICAgICAgICAgIDA6ICIiLAorICAgICAgICAgICAgICAgXSksCisgICAgInN0ZCI6ICAgIChbCisgICAgICAgICAgICAgICAgIDA6IFBSQUdNQSgic3Ryb25nX3R5cGVzLHBlZGFudGljIikgUlRUQ0hFQ0tTLAorICAgICAgICAgICAgICAgXSksCisgICAgIml0ZW1zIjogICAgKFsKKyAgICAgICAgICAgICAgICAgMDogUFJBR01BKCJzdHJvbmdfdHlwZXMscGVkYW50aWMiKSBSVFRDSEVDS1MsCisgICAgICAgICAgICAgICBdKSwKKyAgICAic2VjdXJlIjogKFsKKyAgICAgICAgICAgICAgICAgMDogUFJBR01BKCJzdHJvbmdfdHlwZXMscmFuZ2VfY2hlY2sscGVkYW50aWMiKSBSVFRDSEVDS1MsCisgICAgICAgICAgICAgICBdKSwKKyAgICAicCI6ICAgICAgKFsKKyAgICAgICAgICAgICAgICAgMDogIiIsCisgICAgICAgICAgICAgICAgICJkYWVtb24iOiAoWworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwOiBQUkFHTUEoInN0cm9uZ190eXBlcyIpIFJUVENIRUNLUworICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pLAorICAgICAgICAgICAgICAgICAic2VydmljZSI6IChbCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwOiAiIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pLAorICAgICAgICAgICAgICAgXSksCisgICAgMDogREVGQVVMVFMsCitdKTsKKworc3RyaW5nIGF1dG9pbmNsdWRlaG9vayhzdHJpbmcgYmFzZV9maWxlLCBzdHJpbmcgY3VycmVudF9maWxlLCBpbnQgc3lzX2luY2x1ZGUpCit7CisgIG1hcHBpbmcgdG9wbGV2ZWxkaXIsIHJlZ2lvbjsgLy8gbWFwcGluZ3MgZm9yIHNwZXppYWxpc2llcnRlcmUgUGZhZGUKKyAgc3RyaW5nIGFpbmNfc3RyaW5nOworCisgIC8vIFdlbm4gY3VycmVudF9maWxlICE9IDAgaXN0LCB3aXJkIGdlcmFkZSB2b20ga29tcGlsaWVydGVuIE9iamVrdAorICAvLyA8YmFzZV9maWxlPiBldHdhcyAoaW5kaXJla3QpIGlua2x1ZGllcnQuIERvcnQgZHVlcmZlbiBkaWUgUHJhZ21hcworICAvLyBrZWluZXNmYWxscyByZWluZ2VzY2hyaWViZW4gd2VyZGVuLgorICBpZiAoY3VycmVudF9maWxlKQorICAgIHJldHVybiAwOworCisgIHN0cmluZyByZXM9YXV0b2luY2x1ZGVzWzBdOyAvLyBnbG9iYWwgZGVmYXVsdC4KKworICBzdHJpbmcgKnBfYXJyID0gZXhwbG9kZShiYXNlX2ZpbGUsIi8iKS0oeyIifSk7CisgIC8vREVCVUcoc3ByaW50ZigiQUlOQzogRmlsZTogJU8sIFBmYWQ6ICVPXG4iLGJhc2VfZmlsZSwgcF9hcnIpKTsKKworICBpZiAoc2l6ZW9mKHBfYXJyKSAmJiBtX2NvbnRhaW5zKCZ0b3BsZXZlbGRpciwgYXV0b2luY2x1ZGVzLCBwX2FyclswXSkpIHsKKyAgICAvLyBwX2FyclswXTogZCwgcCwgc3RkLCBldGMuIAorICAgIC8vIGVyc3Qgd2lyZCBkZXIgRGVmYXVsdGVpbnRyYWcgMCBnZW5vbW1lbgorICAgIHJlcyArPSB0b3BsZXZlbGRpclswXTsKKyAgICBpZiAoc2l6ZW9mKHBfYXJyKSA+IDEgJiYgbV9jb250YWlucygmcmVnaW9uLCB0b3BsZXZlbGRpciwgcF9hcnJbMV0pKSB7CisgICAgICAvLyBwX2FyclsxXSBlYmVuZSwgcG9sYXIsIHVudGVyd2VsdCwgc2VydmljZSwgLi4uCisgICAgICAvLyBlcnN0IGRlbiBEZWZhdWx0ZWludHJhZyBkZXIgUmVnaW9uIG5laG1lbgorICAgICAgcmVzICs9IHJlZ2lvblswXTsKKyAgICAgIGlmIChzaXplb2YocF9hcnIpID4gMiAmJiBtX2NvbnRhaW5zKCZhaW5jX3N0cmluZywgcmVnaW9uLCBwX2FyclsyXSkpIHsKKyAgICAgICAgLy8gcF9hcnJbMl06IG1hZ2llcm5hbWUuIEZ1ZXIgZGVuIE1hZ2llciB3YXMgaGludGVybGVndC4KKyAgICAgICAgcmVzICs9IGFpbmNfc3RyaW5nOworICAgICAgfQorICAgIH0KKyAgfQorICAvLyBGdWVyIGFlbHRlcmUgRmlsZXMgc2NoYWx0ZW4gd2lyIGVpbmlnZSBXYXJudW5nZW4gZXhwbGl6aXQgYXVzLiA6LSgKKyAgLy8gKDE0MDcxNzk2ODAgPT0gIk1vbiwgIDQuIEF1ZyAyMDE0LCAyMToxNDo0MCIpCisjaWYgTVVESE9TVCA9PSBfX0hPU1RfTkFNRV9fCisgIGlmIChjYWxsX3NlZnVuKCJmaWxlX3RpbWUiLCBiYXNlX2ZpbGUpIDwgMTQwNzE3OTY4MCkgeworICAgICAgcmVzICs9IFBSQUdNQSgibm9fd2Fybl9taXNzaW5nX3JldHVybiIpOworICB9CisjZWxzZQorICAvLyBBdWYgYW5kZXJlbiBSZWNobmVybiBhbHMgZGVtIE11ZHJlY2huZXIgd2VyZGVuIGRpZSBXYXJudW5nZW4gdW5hYmhhZW5naWcKKyAgLy8gdm9tIFplaXRwdW50IGRlciBsZXR6dGVzIEFlbmRlcnVuZyBhYmdlc2NoYWx0ZXQsIHdlaWwgYmVpIGtvcGllcnRlbgorICAvLyBNdWRsaWJzIG9mdCBkaWUgbXRpbWVzIGdlYWVuZGVydCB3ZXJkZW4gdW5kIGRhbm4gYXVmIGVpbm1hbCBhbGxlcyBzY3JvbGx0LgorICByZXMgKz0gUFJBR01BKCJub193YXJuX21pc3NpbmdfcmV0dXJuIik7CisKKyNlbmRpZgorICAvL0RFQlVHKHJlcyk7CisgIHJldHVybiByZXM7Cit9CisjdW5kZWYgUlRUQ0hFQ0tTCisjdW5kZWYgREVGQVVMVFMKKyN1bmRlZiBQUkFHTUEKKworCmRpZmYgLS1naXQgYS9zZWN1cmUvbWFzdGVyL2NpZHIuYyBiL3NlY3VyZS9tYXN0ZXIvY2lkci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzNWJhMjEKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvbWFzdGVyL2NpZHIuYwpAQCAtMCwwICsxLDExMSBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLyoqIFxmaWxlIC9zZWN1cmUvbWFzdGVyL2NpZHIuYworKiBGdW5rdGlvbmVuIHp1ciBJbnRlcnByZXRhdGlvbiB1bmQgVW1yZWNobnVuZyB2b24gSVAtQWRyZXNzZW4gaW4gQ0lEUi1Ob3RhdGlvbi4KKyogXGF1dGhvciBaZXNzdHJhCisqIFxkYXRlIDA1LjAyLjIwMTAKKyogXHZlcnNpb24gJElkJAorKi8KKy8qIENoYW5nZWxvZzoKKyovCisKK3ByaXZhdGUgaW50IElQdjRfYWRkcjJpbnQoc3RyaW5nIGFkZHIpIHsKKyAgICBpbnQgbWFzazsKKworICAgIGlmICghc3RyaW5ncChhZGRyKSB8fCAhc2l6ZW9mKGFkZHIpKQorICAgICAgcmV0dXJuIDA7CisgICAgLy8gaXJnZW5kd2VsY2hlIFplaWNoZW4gYXVzc2VyIDAtOSwgLiB1bmQgLyBkcmluPworICAgIGlmIChzaXplb2YoYWRkci0iMDEyMzQ1Njc4OS4vIikpCisgICAgICByZXR1cm4gMDsKKworICAgIHN0cmluZyAqcGFydHMgPSBleHBsb2RlKGFkZHIsICIvIikgLSAoeyIifSk7CisgICAgLy8gTmV0em1hc2tlIGdlZ2ViZW4/IC0+IE5ldHp3ZXJrYWRyZXNzZSBiZXN0aW1tZW4KKyAgICBpZiAoc2l6ZW9mKHBhcnRzKSA9PSAyKSB7CisgICAgICAgIC8vIGEuYi5jLmQveCBvZGVyIGEuYi5jLmQvdy54LnkuegorICAgICAgICBpbnQgcmVzID0gSVB2NF9hZGRyMmludChwYXJ0c1swXSk7IC8vIGVyc3RtYWwgV2VydCB2b24gYS5iLmMuZC4uLgorICAgICAgICBpZiAoc3Ryc3RyKHBhcnRzWzFdLCAiLiIpID4gLTEKKyAgICAgICAgICAgICYmIHNpemVvZihleHBsb2RlKHBhcnRzWzFdLCIuIikpID09IDQpCisgICAgICAgICAgICAvLyBhLmIuYy5kL3cueC55LnogLT4gV2VydCB2b24gdy54LnkueiBiZXN0aW1tZW4KKyAgICAgICAgICBtYXNrID0gSVB2NF9hZGRyMmludChwYXJ0c1sxXSk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgIG1hc2sgPSB0b19pbnQocGFydHNbMV0pOworICAgICAgICAgIC8vIFdlcnQgdm9uIC94CisgICAgICAgICAgbWFzayA9IDB4ZmZmZmZmZmYgLSAodG9faW50KHBvdygyLCAzMi1tYXNrKSktMSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gdmVydW5kZW4gdW5kIEVuZGUuCisgICAgICAgIHJldHVybiByZXMgJiBtYXNrOworICAgIH0KKworICAgIHBhcnRzID0gZXhwbG9kZShwYXJ0c1swXSwgIi4iKTsKKyAgICAvLyBBYmdyZWt1ZXJ6dGUgQWRyZXNzZSBhIGxhIGEuYi4/IFJlc3QgbWl0IDAgZXJnYWVuemVuLgorICAgIHN3aXRjaChzaXplb2YocGFydHMgLSAoeyIifSkpICkgeworICAgICAgY2FzZSAxOgorICAgICAgICBwYXJ0cyArPSAoeyIwIiwiMCIsIjAifSk7CisgICAgICBjYXNlIDI6CisgICAgICAgIHBhcnRzICs9ICh7IjAiLCIwIn0pOworICAgICAgY2FzZSAzOgorICAgICAgICBwYXJ0cyArPSAoeyIwIn0pOworICAgICAgY2FzZSA0OgorICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgcmV0dXJuKCB0b19pbnQocGFydHNbMF0pIDw8IDI0KQorICAgICAgICAgKyAoIHRvX2ludChwYXJ0c1sxXSkgPDwgMTYpCisgICAgICAgICArICggdG9faW50KHBhcnRzWzJdKSA8PCA4ICkKKyAgICAgICAgICsgdG9faW50KHBhcnRzWzNdKTsKK30KKworcHJpdmF0ZSBpbnQgSVB2NF9uZXRfc2l6ZShzdHJpbmcgYWRkcikgeworICAgIGlmICghc3RyaW5ncChhZGRyKSB8fCAhc2l6ZW9mKGFkZHIpKQorICAgICAgcmV0dXJuIDA7CisgICAgLy8gaXJnZW5kd2VsY2hlIFplaWNoZW4gYXVzc2VyIDAtOSwgLiB1bmQgLyBkcmluPworICAgIGlmIChzaXplb2YoYWRkci0iMDEyMzQ1Njc4OS4vIikpCisgICAgICByZXR1cm4gMDsKKworICAgIHN0cmluZyAqcGFydHMgPSBleHBsb2RlKGFkZHIsICIvIikgLSAoeyIifSk7CisgICAgLy8gTmV0em1hc2tlIGdlZ2ViZW4/IC0+IE5ldHp3ZXJrYWRyZXNzZSBiZXN0aW1tZW4KKyAgICBpZiAoc2l6ZW9mKHBhcnRzKSA9PSAyKSB7CisgICAgICAgIC8vIGEuYi5jLmQveCBvZGVyIGEuYi5jLmQvdy54LnkuegorICAgICAgICBpZiAoc3Ryc3RyKHBhcnRzWzFdLCAiLiIpID4gLTEKKyAgICAgICAgICAgICYmIHNpemVvZihleHBsb2RlKHBhcnRzWzFdLCIuIikpID09IDQpCisgICAgICAgICAgICAvLyBhLmIuYy5kL3cueC55LnogCisgICAgICAgICAgcmV0dXJuIDB4ZmZmZmZmZmYgLSAoSVB2NF9hZGRyMmludChwYXJ0c1sxXSkgfHwgMSkgKyAxOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAvLyBFaW5mYWNoIDJeKDMyLW1hc2spIEFkcmVzc2VuLgorICAgICAgICAgIHJldHVybiB0b19pbnQocG93KDIsIDMyIC0gdG9faW50KHBhcnRzWzFdKSApICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwYXJ0cyA9IGV4cGxvZGUocGFydHNbMF0sICIuIik7CisgICAgc3dpdGNoKHNpemVvZihwYXJ0cyAtICh7IiJ9KSkgKSB7CisgICAgICBjYXNlIDE6IC8vIENsYXNzIEEKKyAgICAgICAgcmV0dXJuIDI1NioyNTYqMjU2OworICAgICAgY2FzZSAyOiAvLyBDbGFzcyBCCisgICAgICAgIHJldHVybiAyNTYqMjU2OworICAgICAgY2FzZSAzOiAvLyBDbGFzcyBDCisgICAgICAgIHJldHVybiAyNTY7CisgICAgICBjYXNlIDQ6IC8vIGVpbnplbG5lIEFkcmVzc2UKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICBkZWZhdWx0OiAvLyB1bmd1ZWx0aWdlIEFkcmVzc2UKKyAgICAgICAgcmV0dXJuIF9fSU5UX01BWF9fOworICAgIH0KKworICAgIC8vIGhpZXIgc29sbHRlIG1hbiBnYXIgbmljaHQgYW5rb21tZW4uCisgICAgcmV0dXJuIF9fSU5UX01BWF9fOworfQorCitzdHJpbmcgSVB2NF9pbnQyYWRkcihpbnQgaXApIHsKKyAgICBpbnQgKnBhcnRzPWFsbG9jYXRlKDQpOworICAgIHBhcnRzWzBdID0gKGlwICYgMHhmZjAwMDAwMCkgPj4gMjQ7CisgICAgcGFydHNbMV0gPSAoaXAgJiAweDAwZmYwMDAwKSA+PiAxNjsKKyAgICBwYXJ0c1syXSA9IChpcCAmIDB4MDAwMGZmMDApID4+IDg7CisgICAgcGFydHNbM10gPSAoaXAgJiAweDAwMDAwMGZmKTsKKyAgICAvLyBpbnQgaXMgc2lnbmVkLiBBbnl0aGluZyA+IDEyNyB3b3VsZCB3cmFwIGFyb3VuZCB0byAtMTI4IGlmIHdlIGFyZSBvbiBhCisgICAgLy8gbWFjaGluZSB3aXRoIDMyLWJpdCB3aWRlIGludHMuCisgICAgaWYgKHBhcnRzWzBdIDwgMCkKKyAgICAgICAgcGFydHNbMF0gPSAxMjggKyAoMTI4LWFicyhwYXJ0c1swXSkpOworCisgICAgcmV0dXJuIGltcGxvZGUobWFwKHBhcnRzLCMndG9fc3RyaW5nKSwgIi4iKTsKK30KKwpkaWZmIC0tZ2l0IGEvc2VjdXJlL21hc3Rlci9kZXN0cnVjdC5jIGIvc2VjdXJlL21hc3Rlci9kZXN0cnVjdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlNzZhMTEKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvbWFzdGVyL2Rlc3RydWN0LmMKQEAgLTAsMCArMSwxMDUgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBzZWN1cmUvbWFzdGVyL2Rlc3RydWN0LmluYyAtLSBtb2R1bGUgb2YgdGhlIG1hc3RlciBvYmplY3Q6IHN0dWZmIGZvciBkZXN0cnVjdC4KKy8vCisvLyAkSWQ6IG1hc3Rlci5jIDcwNDEgMjAwOC0xMC0xMyAxODoxODoyN1ogWmVzc3RyYSAkCisKKyNpbmNsdWRlICIvc3lzL29iamVjdF9pbmZvLmgiCisKKy8vIHByaXZpbGVnaWVydGUgT2JqZWt0ZSwgZGllIGRhcyBkZXN0cnVjdCgpIGFiYnJlY2hlbiBkdWVyZmVuIChyb290IG9iamVrdGUKKy8vIGR1ZXJmZW4gYXVjaCBvaG5lLCBkYXNzIHNpZSBpbiBkaWVzZXIgTGlzdGUgZXJmYXNzdCBzaW5kKToKK3ByaXZhdGUgbm9zYXZlIHN0cmluZyAqZGVueV9kZXN0cnVjdF9saXN0ID0gKHsKKyAgICAiL29iai9zaHV0IiwgIi9yb29tL3ZvaWQiLCAiL3Jvb20vbmV0enRvdCIsICIvcm9vbS9qYWlsIiB9KTsKKworLy8gSGVsZmVyZnVua3Rpb24gZnVlciBwcmVwYXJlX2Rlc3RydWN0KCkKK3ByaXZhdGUgdm9pZCByZWN1cnNpdmVfcmVtb3ZlKG9iamVjdCBvYiwgaW50IGltbWVkaWF0ZV9kZXN0cnVjdCkgeworCisgIGlmIChlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfT05DRV9JTlRFUkFDVElWRSkpIHsKKyAgICAvLyBTcGllbGVyIHdlcmRlbiBpbnMgVm9pZCBiZXdlZ3QuCisgICAgaW50IHJlczsKKyAgICB0ZWxsX29iamVjdChvYiwgIlBsb2V0emxpY2ggbG9lc3Qgc2ljaCBkZWluZSBXZWx0IGluIGlocmUgIiArCisgICAgICAgICAgICAgICAgICAiQmVzdGFuZHRlaWxlIGF1Zi4gWnVtIEdsdWVjayB3aXJzdFxuRHUgaXJnZW5kd28gIiArCisgICAgICAgICAgICAgICAgICAiaGluIGdlc2NobGV1ZGVydCAuLi5cbiIpOworICAgIC8vIHdlbm4gQmV3ZWd1bmcgYnVnZ3Qgb2RlciBuaWNodCBmdW5rdGlvbmllcnQgdW5kIG9iIG5vY2ggZXhpc3RpZXJ0LAorICAgIC8vIHJla3Vyc2l2IHplcnN0b2VyZW4uCisgICAgb2JqZWN0IG9sZGVudj1lbnZpcm9ubWVudChvYik7CisgICAgaWYgKCAoY2F0Y2gocmVzPShpbnQpb2ItPm1vdmUoIi9yb29tL3ZvaWQiLE1fVFBPUlR8TV9OT0NIRUNLLDAsImZhZWxsdCIpOworICAgICAgICAgICBwdWJsaXNoKSB8fCAob2IgJiYgZW52aXJvbm1lbnQob2IpID09IG9sZGVudikgKQorICAgICAgICAgICYmIG9iKSB7CisgICAgICAgICAgICAvLyBTcGllbGVyIHNwZWljaGVybiwgZGFubiBlcnN0IEludmVudGFyIGVudGxlZXJlbiwgZGFubiByZW1vdmUoKSB1bmQKKyAgICAgICAgLy8gdW5kIGRlc3RydWN0KCkgYW53ZW5kZW4uCisgICAgICAgIGNhdGNoKG9iLT5zYXZlX21lKDEpOyBwdWJsaXNoKTsKKyAgICAgICAgZmlsdGVyKGFsbF9pbnZlbnRvcnkob2IpLCAjJ3JlY3Vyc2l2ZV9yZW1vdmUsIGltbWVkaWF0ZV9kZXN0cnVjdCk7CisgICAgICAgIGlmICghaW1tZWRpYXRlX2Rlc3RydWN0KSAKKyAgICAgICAgICBjYXRjaChvYi0+cmVtb3ZlKDApO3B1Ymxpc2gpOworICAgICAgICBpZiAob2IpIAorICAgICAgICAgIGRlc3RydWN0KG9iKTsKKyAgICB9CisgIH0KKyAgZWxzZSB7CisgICAgLy8ga2VpbiBTcGllbGVyLiBSZWt1cnNpdiBlbnRmZXJuZW4uIEhpZXJiZWkgX3p1ZXJzdF8gcmVrdXJzaXYgZGFzCisgICAgLy8gSW52ZW50YXIgZW50ZmVybmVuIHVuZCBkYW5uIG9iIHNlbGJlciwgZGFtaXQgbmljaHQgZXJzdCBkYXMgSW52ZW50YXIgaW4KKyAgICAvLyBkYXMgRW52aXJvbm1lbnQgYmV3ZWd0IHdpcmQgKHNvbGwgamEgZWggemVyc3RvZXJ0IHdlcmRlbikuCisgICAgZmlsdGVyKGFsbF9pbnZlbnRvcnkob2IpLCAjJ3JlY3Vyc2l2ZV9yZW1vdmUsIGltbWVkaWF0ZV9kZXN0cnVjdCk7CisgICAgLy8gZ2dmLiB6dWVyc3QgcmVtb3ZlIHZlcnN1Y2hlbgorICAgIGlmICghaW1tZWRpYXRlX2Rlc3RydWN0KQorICAgICAgY2F0Y2gob2ItPnJlbW92ZSgxKTtwdWJsaXNoKTsKKyAgICBpZiAob2IpCisgICAgICBkZXN0cnVjdChvYik7CisgIH0KK30KKworLy8gWmVyc3RvZXJ1bmcgdm9uIG9iIHZvcmJlcmVpdGVuCitwcm90ZWN0ZWQgbWl4ZWQgcHJlcGFyZV9kZXN0cnVjdChvYmplY3Qgb2IpCit7CisgIG9iamVjdCBvbGRfZW52LGVudixpdGVtOworICBtaXhlZCByZXM7CisKKyAgLy8genVlcnN0IGRhcyBub3RpZnlfZGVzdHJ1Y3QoKSBydWZlbiB1bmQgZ2dmLiBhYmJyZWNoZW4sIGZhbGxzIG9iCisgIC8vIHByaXZpbGVnaWVydCBpc3QuCisgIGNhdGNoKHJlcyA9IChtaXhlZClvYi0+Tm90aWZ5RGVzdHJ1Y3QocHJldmlvdXNfb2JqZWN0KCkpOyBwdWJsaXNoKTsKKyAgaWYgKHJlcyAmJgorICAgICAgKGdldHVpZChvYikgPT0gUk9PVElEIHx8CisgICAgICAgKElTX0FSQ0gob2IpKSB8fAorICAgICAgIG1lbWJlcihkZW55X2Rlc3RydWN0X2xpc3QsIG9iamVjdF9uYW1lKG9iKSkgPj0gMCkpIHsKKyAgICBpZiAoc3RyaW5ncChyZXMpICYmIHNpemVvZihyZXMpKQorICAgICAgcmV0dXJuIHJlczsKKyAgICBlbHNlCisgICAgICByZXR1cm4gc3ByaW50ZigiJU8gdmVyd2VpZ2VydCBkaWUgWmVyc3RvZXJ1bmcgbWl0dGVscyBkZXN0cnVjdCgpLiAiCisgICAgICAgICAgIkZlaGxlbmRlIFJlY2h0ZSB2b24gJU8/XG4iLG9iLCBwcmV2aW91c19vYmplY3QoKSk7CisgIH0KKyAgCisgIGVudiA9IGVudmlyb25tZW50KG9iKTsKKworICAvLyBPYmpla3QgaGF0IGtlaW4gRW52OiBBbGxlcyB6ZXJzdG9lcmVuLCBTcGllbGVyIGlucyBWb2lkCisgIGlmICghZW52KSB7CisgICAgZmlsdGVyKGFsbF9pbnZlbnRvcnkob2IpLCAjJ3JlY3Vyc2l2ZV9yZW1vdmUsIDEpOworICB9CisgIGVsc2UgeworICAgIC8vIEFuc29uc3RlbiBhbGxlcyBpbnMgRW52aXJvbm1lbnQgCisgICAgZm9yZWFjaChpdGVtIDogYWxsX2ludmVudG9yeShvYikpCisgICAgeworICAgICAgb2xkX2Vudj1lbnZpcm9ubWVudChpdGVtKTsKKyAgICAgIC8vIE1fTU9WRV9BTEwsIGZhbGxzIGl0ZW0gbmVuIFVuaXRvYmpla3QgaXN0LiBTb25zdCBjbG9uZW4gZGllIHUuVS4gbm9jaAorICAgICAgLy8gd2llZGVyIG5lbiBuZXVlcyBPYmpla3QgaW0gYWx0ZW4gRW52LgorICAgICAgaWYoY2F0Y2goaXRlbS0+bW92ZShlbnYsIE1fTk9DSEVDS3xNX01PVkVfQUxMKTtwdWJsaXNoKSkKKyAgICAgICAgcmVjdXJzaXZlX3JlbW92ZShpdGVtLCAxKTsKKyAgICAgIGVsc2UgaWYgKGl0ZW0gJiYgZW52aXJvbm1lbnQoaXRlbSkgPT0gb2xkX2VudikKKyAgICAgICAgcmVjdXJzaXZlX3JlbW92ZShpdGVtLCAxKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gMDsgLy8gRXJmb2xnCit9CisKKy8vIEFubWVya3VuZzogbGllZmVydCAwIHp1cnVlY2ssIHdlbm4gZGllIHNlZnVucyBnZXJhZGUgZ2VsYWRlbiB3ZXJkZW4uCitzdHJpbmcgTm90aWZ5RGVzdHJ1Y3Qob2JqZWN0IGNhbGxlcikgeworICAvLyBOaWNodCBqZWRlciBNYWdpZXIgbXVzcyBkZW4gTWFzdGVyIGVudHNvcmdlbiBrb2VubmVuLgorICBpZiAoKGNhbGxlciAhPSB0aGlzX29iamVjdCgpICYmIAorICAgICAgICBjYWxsX3NlZnVuKCJzZWN1cmVfbGV2ZWwiKSA8IEFSQ0hfTFZMKQorICAgICAgfHwgY2FsbF9zZWZ1bigicHJvY2Vzc19jYWxsIikgKSB7CisgICAgcmV0dXJuICJEdSBkYXJmc3QgZGVuIE11ZGxpYi1NYXN0ZXIgbmljaHQgemVyc3RvZXJlbiFcbiI7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL3NlY3VyZS9tYXN0ZXIvZG9tYWluLmMgYi9zZWN1cmUvbWFzdGVyL2RvbWFpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5ZWM2ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvbWFzdGVyL2RvbWFpbi5jCkBAIC0wLDAgKzEsOTUgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBtYXN0ZXIvZG9tYWluLmMgLS0gUmVnaW9uZW4gdW5kIFJlZ2lvbnNtYWdpZXIKKy8vCisvLyAkSWQ6IGRvbWFpbi5jIDcxNjIgMjAwOS0wMi0yNiAyMToxNDo0M1ogWmVzc3RyYSAkCisKKyNwcmFnbWEgc3RyaWN0X3R5cGVzCisKKyNpbmNsdWRlICIvc2VjdXJlL21hc3Rlci5oIgorI2luY2x1ZGUgIi9zeXMvZmlsZXMuaCIKKworaW50IGRvbWFpbl9tYXN0ZXIoc3RyaW5nIHVzZXIsIHN0cmluZyBkb21haW4pCit7CisgIHN0cmluZyAqZG9tYWluczsKKyAgaW50IGk7CisgIAorICBpZiAoIWZpbmRfdXNlcmluZm8odXNlcil8fAorICAgICAgIXBvaW50ZXJwKGRvbWFpbnM9Z2V0X3VzZXJpbmZvKHVzZXIpW1VTRVJfRE9NQUlOKzFdKSkKKyAgICByZXR1cm4gMDsKKyAgcmV0dXJuIChtZW1iZXIoZG9tYWlucyxkb21haW4pICE9IC0xKTsKK30KKworaW50IGRvbWFpbl9tZW1iZXIoc3RyaW5nIHVzZXIsIHN0cmluZyBkb21haW4pCit7CisgIGlmIChkb21haW49PSJlcnptYWdpZXIiKSByZXR1cm4gMDsKKyAgcmV0dXJuIChJU19ET01BSU5NRU1CRVIodXNlcikmJmZpbGVfc2l6ZSgiL2QvIitkb21haW4rIi8iK3VzZXIpPT0tMik7Cit9CisKK2ludCBhZGRfZG9tYWluX21hc3RlcihzdHJpbmcgdXNlcixzdHJpbmcgZG9tKQoreworICBzdHJpbmcgKmRvbWFpbnM7CisgIAorICBpZiAoKGNhbGxfb3RoZXIoU0lNVUxfRUZVTl9GSUxFLCAicHJvY2Vzc19jYWxsIikgfHwKKyAgICAgICAgY2FsbF9vdGhlcihTSU1VTF9FRlVOX0ZJTEUsICJzZWN1cmVfbGV2ZWwiKSA8IEdPRF9MVkwpIHx8CisgICAgICAgICFmaW5kX3VzZXJpbmZvKHVzZXIpKQorICAgIHJldHVybiAwOworICBkb21haW5zPWdldF91c2VyaW5mbyh1c2VyKVtVU0VSX0RPTUFJTisxXTsKKyAgaWYgKCFkb21haW5zKSAKKyAgICBzZXRfZG9tYWlucyh1c2VyLCh7ZG9tfSkpOworICBlbHNlCisgIHsKKyAgICAvLyBEb3BwZWx0ZSBFaW50cmFlZ2UgdmVybWVpZGVuCisgICAgZG9tYWlucz1kb21haW5zLSh7ZG9tfSkrKHtkb219KTsKKyAgICBzZXRfZG9tYWlucyh1c2VyLCBkb21haW5zKTsKKyAgfQorICBpZiAoZ2V0X3dpel9sZXZlbCh1c2VyKSA8IExPUkRfTFZMKzUpIHsKKyAgICB1cGRhdGVfd2l6X2xldmVsKHVzZXIsTE9SRF9MVkwrNSk7CisgICAgU2VuZFdpemFyZEhlbHBNYWlsKHVzZXIsIExPUkRfTFZMKzUpOworICB9CisgIHJldHVybiAxOworfQorCitpbnQgcmVtb3ZlX2RvbWFpbl9tYXN0ZXIoc3RyaW5nIHVzZXIsc3RyaW5nIGRvbSkKK3sKKyAgc3RyaW5nICpkb21haW5zOworCisgIGlmICghSVNfR09EKGdldGV1aWQocHJldmlvdXNfb2JqZWN0KCkpKQorICAgICAgfHwhZmluZF91c2VyaW5mbyh1c2VyKQorICAgICAgfHwhKGRvbWFpbnM9Z2V0X3VzZXJpbmZvKHVzZXIpW1VTRVJfRE9NQUlOKzFdKQorICAgICAgfHwgbWVtYmVyKGRvbWFpbnMsZG9tKT09LTEpCisgICAgcmV0dXJuIDA7CisgIGRvbWFpbnMtPSh7ZG9tfSk7CisgIHNldF9kb21haW5zKHVzZXIsZG9tYWlucyk7CisgIHJldHVybiAxOworfQorCitzdHJpbmcgKmdldF9kb21haW5zKCkgeworICBzdHJpbmcgKnJlZ2lvbnM9KHt9KTsKKyAgLy8gYWxsZSBWZXJ6ZWljaG5pc3NlIGluIC9kLyBlcm1pdHRlbG4KKyAgZm9yZWFjaChzdHJpbmcgcmVnaW9uOiAoZ2V0X2RpcigiLyJET01BSU5ESVIiLyoiKSAKKyAgICAgICAgfHwgKHt9KSktKHsiLiIsIi4uIiwiZXJ6bWFnaWVyIn0pKSB7CisgICAgaWYgKHJlZ2lvblswXSE9Jy4nICYmIGZpbGVfc2l6ZSgiL2QvIityZWdpb24pID09IEZTSVpFX0RJUikKKyAgICAgICAgLy9WZXJ6ZWljaG5pcywga2VpbiBGaWxlIHVuZCBmYWVuZ3QgbmljaHQgbWl0ICIuIiBhbjogYXVmbmVobWVuLgorICAgICAgICByZWdpb25zKz0oe3JlZ2lvbn0pOworICB9CisgIHJldHVybiByZWdpb25zOworfQorCisvLyBpbiB3ZWxjaGVuIFJlZ2lvbmVuIGhhdCAnd2l6JyBlaW4gVmVyemVpY2huaXM/CitzdHJpbmcgKmdldF9kb21haW5faG9tZXMoc3RyaW5nIHdpeikKK3sKKyAgc3RyaW5nICpob21lcz0oe30pOworICBzdHJpbmcgdG1wOworICAKKyAgaWYgKHF1ZXJ5X3dpel9sZXZlbCh3aXopPD1XSVpBUkRfTFZMKSByZXR1cm4gKHt9KTsKKworICB0bXAgPSAiL2QvJXMvIit3aXo7CisgIGZvcmVhY2goc3RyaW5nIGRpcjogZ2V0X2RvbWFpbnMoKSkgeworICAgICAgaWYgKGRpclswXSE9Jy4nICYmIGZpbGVfc2l6ZShzcHJpbnRmKHRtcCxkaXIpKSA9PSBGU0laRV9ESVIpCisgICAgICAgICAgLy9NYWdpZXJ2ZXJ6ZWljaG5pcyBkYSB1bmQgZmFlbmd0IG5pY2h0IG1pdCAiLiIgYW46IGF1Zm5laG1lbi4KKyAgICAgICAgICBob21lcys9KHtkaXJ9KTsKKyAgfQorICByZXR1cm4gaG9tZXM7Cit9CisKZGlmZiAtLWdpdCBhL3NlY3VyZS9tYXN0ZXIvZmlsZV9hY2Nlc3MuYyBiL3NlY3VyZS9tYXN0ZXIvZmlsZV9hY2Nlc3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjdlM2U0Ci0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL21hc3Rlci9maWxlX2FjY2Vzcy5jCkBAIC0wLDAgKzEsNjE3IEBACisjcHJhZ21hIHN0cmljdF90eXBlcywgbm9fd2Fybl9kZXByZWNhdGVkCisKKyNpbmNsdWRlICIvc2VjdXJlL21hc3Rlci5oIgorCitzdGF0aWMgbWFwcGluZyBwcm9qZWN0cz0oW10pOworc3RhdGljIHN0cmluZyAqaW5zZWN1cmUsKmRlcHV0eV9maWxlczsKKworaW50IFJlbG9hZEluc2VjdXJlRmlsZSgpCit7CisgICAgaW5zZWN1cmUgPSBlZnVuOjpleHBsb2RlKCByZWFkX2ZpbGUoIi9zZWN1cmUvSU5TRUNVUkUiKSB8fCAiIiwgIlxuIiApOworICAgIGluc2VjdXJlIC09ICh7IiJ9KTsKKyAgICBpbnNlY3VyZSA9IG1hcCggaW5zZWN1cmUsICMnbG93ZXJfY2FzZS8qJyovICk7CisgICAgcmV0dXJuKDEpOworfQorCit2b2lkIExvYWREZXB1dHlGaWxlTGlzdCgpCit7CisgIC8vIExlc2ViZXJlY2h0aWd1bmdlbiBmdWVyIC9sb2cvQVJDSC8qIHNldHplbgorICBkZXB1dHlfZmlsZXMgPSBlZnVuOjpleHBsb2RlKCByZWFkX2ZpbGUoIi9sb2cvQVJDSC9ERVBVVFlfRklMRUxJU1QiKSB8fCAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuIiApIC0gKHsiIn0pOworICByZXR1cm47Cit9CisKKyNkZWZpbmUgUEFUSF9BUlJBWSh4KSAoZXhwbG9kZSh4LCAiLyIpLSh7Ii4ifSkpCitzdHJpbmcgKmZ1bGxfcGF0aF9hcnJheShzdHJpbmcgcGF0aCwgc3RyaW5nIHVzZXIpIHsKKyAgc3RyaW5nICpzdHJzOworICBzdHJpbmcgY3dkOworCisgIGlmKCFwYXRoKQorICAgIHJldHVybiAoeyIiLCIifSk7IC8vIGFkZGl0aW9uYWwgIiIgdG8geWllbGQgIi8iIGxhdGVyLgorCisgIC8vIHJlbW92ZSBtdWx0aXBsZSAnLycKKyAgcGF0aCA9IHJlZ3JlcGxhY2UocGF0aCwgIi8rIiwgIi8iLCAxKTsKKworICBzd2l0Y2gocGF0aFswXSkgeworICAgIGNhc2UgJy8nOgorICAgICAgaWYoIXBhdGhbMV0pIHJldHVybiAoeyIiLCIifSk7IC8vYWRkaXRpb25hbCAiIiB0byB5aWVsZCAiLyIgbGF0ZXIKKyAgICAgIHN0cnM9UEFUSF9BUlJBWShwYXRoKTsKKyAgICAgIGlmICghc2l6ZW9mKHN0cnMpKQorICAgICAgICAgIHN0cnMgPSAoeyIiLCIifSk7CisgICAgICBicmVhazsKKyAgICBjYXNlICcrJzoKKyAgICAgIGlmKCFwYXRoWzFdKSByZXR1cm4gKHsiIiwiZCJ9KTsKKyAgICAgIHN0cnM9KHsiIiwiZCJ9KStQQVRIX0FSUkFZKHBhdGhbMS4uPDFdKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ34nOgorICAgICAgaWYodXNlciAmJiAhcGF0aFsxXSkKKyAgICAgICAgcmV0dXJuICh7IiIsInBsYXllcnMiLHVzZXJ9KTsKKyAgICAgIGlmKHVzZXIgJiYgcGF0aFsxXT09Jy8nKQorICAgICAgICBzdHJzPSh7IiIsInBsYXllcnMiLHVzZXJ9KStQQVRIX0FSUkFZKHBhdGhbMi4uPDFdKTsKKyAgICAgIGVsc2UKKyAgICAgICAgc3Rycz0oeyIiLCJwbGF5ZXJzIn0pK1BBVEhfQVJSQVkocGF0aFsxLi48MV0pOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGlmKHVzZXIgJiYgVFAgJiYgZ2V0dWlkKFRQKSA9PSB1c2VyCisgICAgICAgICAgJiYgKGN3ZD0oc3RyaW5nKVRQLT5RdWVyeVByb3AoUF9DVVJSRU5URElSKSkpCisgICAgICAgIHN0cnM9UEFUSF9BUlJBWShjd2QgKyAiLyIgKyBwYXRoKTsKKyAgICAgIGVsc2UKKyAgICAgICAgc3Rycz1QQVRIX0FSUkFZKHBhdGgpOworICB9CisgIC8vIC8uLi8gYmVoYW5kZWxuLiBFaW5zY2hyYWVua3VuZ2VuIGRlciBSZWdFeHA6CisgIC8vIC9hL2IvLi4vLi4vZCB3dWVyZGUgbnVyIGR1cmNoIFdpZWRlcmhvbHVuZyBhdWZnZWxvZXN0LgorICAvLyAvLi4vZCB3aXJkIG5pY2h0IHJpY2h0aWcgYXVmZ2Vsb2VzdC4KKyAgLy9yZWdyZXBsYWNlKCIvZC9pbnNlbG4vdG9ldGVyL3Jvb20vaG9laGxlLy4uL3dhbGQvYmxhLmMiLCIoLiopXC9bXi9dKy9cLlwuCisgIC8vICAgIC8oLiopIiwgIlxcMVwvXFwyIiwgUkVfR0xPQkFMKQorICAKKyAgLy8gZGllcyBzaWVodCBzY2hsaW1tZXIgYXVzIGFscyBlcyBpc3QgKG1lbWJlciBpc3QgTyhuKSksIHNvbGFuZ2UgZGFzIEFycmF5CisgIC8vIG5pY2h0IGdyb3NzIHdpcmQuCisgIGludCBwOworICB3aGlsZSgocD1tZW1iZXIoc3RycywgIi4uIikpICE9IC0xKQorICAgICAgc3RycyA9IHN0cnNbMC4ucC0yXStzdHJzW3ArMS4uXTsKKworICByZXR1cm4gc3RyczsKK30KKyN1bmRlZiBQQVRIX0FSUkFZCisKK3N0cmluZyBfZ2V0X3BhdGgoc3RyaW5nIHBhdGgsIHN0cmluZyB1c2VyKSB7CisgIHN0cmluZyAqcF9hcnIgPSBmdWxsX3BhdGhfYXJyYXkocGF0aCwgdXNlcik7CisgIC8vIG1ha2UgcGF0aCBhYnNvbHV0ZQorICBpZiAocF9hcnJbMF0gIT0gIiIpCisgICAgICBwX2FyciA9ICh7IiJ9KSArIHBfYXJyOworCisgIHJldHVybiBpbXBsb2RlKHBfYXJyLCIvIik7Cit9CisKK3N0YXRpYyBpbnQgcHJvamVjdF9hY2Nlc3Moc3RyaW5nIHVzZXIsIHN0cmluZyBwcm9qZWN0KQoreworICBtaXhlZCAqbGluZXM7CisgIHN0cmluZyBzOworICBtYXBwaW5nIHRtcDsKKworICBpZiAoIW1lbWJlcihwcm9qZWN0cyxwcm9qZWN0KSkKKyAgeworICAgIHM9cmVhZF9maWxlKFBST0pFQ1RESVIrIi8iK3Byb2plY3QrIi9BQ0NFU1NfUklHSFRTIik7CisgICAgaWYoIXN8fHM9PSIiKQorICAgICAgcmV0dXJuIDA7CisgICAgdG1wPShbXSk7CisgICAgZm9yIChsaW5lcz1leHBsb2RlKHMsIlxuIiktKHsiIn0pO3NpemVvZihsaW5lcyk7bGluZXM9bGluZXNbMS4uXSkKKyAgICB7CisgICAgICBpZiAobGluZXNbMF1bMF09PScqJykKKyAgICAgICAgdG1wW2xpbmVzWzBdWzEuLl1dPTI7CisgICAgICBlbHNlCisgICAgICAgIHRtcFtsaW5lc1swXV09MTsKKyAgICB9CisgICAgcHJvamVjdHNbcHJvamVjdF09KHt0bXAsdGltZSgpfSk7CisgICAgcmV0dXJuIHRtcFt1c2VyXTsKKyAgfQorICBwcm9qZWN0c1twcm9qZWN0XVsxXT10aW1lKCk7CisgIHJldHVybiBwcm9qZWN0c1twcm9qZWN0XVswXVt1c2VyXTsKK30KKwordm9pZCBPdXRkYXRlUHJvamVjdENhY2hlKHN0cmluZyBwcm9qZWN0KQoreworICBtX2RlbGV0ZShwcm9qZWN0cyxwcm9qZWN0KTsKK30KKworc3RhdGljIHZvaWQgX2NsZWFudXBfcHJvamVjdHMoKSB7CisgIGludCBpOworICBtaXhlZCAqdXNlcnM7CisKKyAgZm9yICh1c2Vycz1tX2luZGljZXMocHJvamVjdHMpLGk9c2l6ZW9mKHVzZXJzKS0xO2k+PTA7aS0tKQorICAgIGlmKCh0aW1lKCktcHJvamVjdHNbdXNlcnNbaV1dWzFdKT4xODAwKQorICAgICAgbV9kZWxldGUocHJvamVjdHMsdXNlcnNbaV0pOworfQorCitpbnQgYWNjZXNzX3JpZ2h0cyhzdHJpbmcgKnBfYXJyLCBzdHJpbmcgZXVpZCkKK3sKKyAgaW50IGk7CisKKyAgaSA9IHNpemVvZihwX2FycikgLSAyOworCisgIHdoaWxlICggaSA+PSAwICYmCisgICAgICAgICAgZmlsZV9zaXplKCBpbXBsb2RlKHBfYXJyWzAuLmldLCAiLyIpICsgIi9hY2Nlc3NfcmlnaHRzLmMiICkgPCAwICkKKyAgICAgIGktLTsKKworICBpZiAoIGkgPCAwICkKKyAgICAgIHJldHVybiAwOworCisgIGlmICggIWNhdGNoKGkgPSAoaW50KWNhbGxfb3RoZXIoIAorICAgICAgICAgIGltcGxvZGUocF9hcnJbMC4uaV0sICIvIikgKyAiL2FjY2Vzc19yaWdodHMiLAorICAgICAgICAgICJhY2Nlc3NfcmlnaHRzIiwgZXVpZCwKKyAgICAgICAgICBpbXBsb2RlKHBfYXJyW2krMS4uXSwgIi8iKSApOyBwdWJsaXNoKSApCisgICAgICByZXR1cm4gaTsKKworICByZXR1cm4gMDsKK30KKworc3RyaW5nIG1ha2VfcGF0aF9hYnNvbHV0ZShzdHJpbmcgc3RyKSB7CisgIHJldHVybiBfZ2V0X3BhdGgoc3RyLCBnZXR1aWQoVFApKTsKK30KKworCittaXhlZCB2YWxpZF93cml0ZShzdHJpbmcgcGF0aCwgc3RyaW5nIGV1aWQsIHN0cmluZyBmdW4sIG9iamVjdCBvYmopCit7CisgIGludCBzLGx2bDsKKyAgc3RyaW5nICpzdHJzOworICBpbnQgKmRhdGU7CisKKyAgaWYgKG1lbWJlcihwYXRoLCcgJykhPS0xKSByZXR1cm4gMDsKKworICAvLyBVbnRlciBMSUJEQVRBRElSICgvZGF0YSkgc29sbGVuIGtvbXBsZXR0IGlkZW50aXNjaGUgU2NocmVpYnJlY2h0ZQorICAvLyB2ZXJnZWJlbiB3ZXJkZW4uCisgIGlmIChzaXplb2YocGF0aCkgPiA2CisgICAgICAmJiBwYXRoWzAuLjVdID09ICIvIkxJQkRBVEFESVIiLyIpCisgICAgcmV0dXJuIHZhbGlkX3dyaXRlKHBhdGhbNS4uXSwgZXVpZCwgZnVuLCBvYmopICE9IDA7CisKKyAgc3dpdGNoKGZ1bikgeworICAgIGNhc2UgImxvZ19maWxlIjoKKyAgICAgIHN0cnM9ZnVsbF9wYXRoX2FycmF5KCIvIitwYXRoLCAwKTsKKyAgICAgIHBhdGggPSBpbXBsb2RlKHN0cnMsICIvIik7CisgICAgICBzdHJzIC09ICh7IiJ9KTsgLy8gcmVtb3ZlIHRyYWlsaW5nIGFuZCBsZWFkaW5nICIvIi4KKyAgICAgIGlmIChzaXplb2Yoc3Rycyk+MSAmJiBzdHJzWzBdPT0ibG9nIikgcmV0dXJuIHBhdGg7CisgICAgICByZXR1cm4gMDsKKyAgICBjYXNlICJzYXZlX29iamVjdCI6CisgICAgICBpZiAoIXBhdGgpIHJldHVybiAwOworICAgICAgc3Rycz1mdWxsX3BhdGhfYXJyYXkoIi8iK3BhdGgsIDApOworICAgICAgYnJlYWs7CisgICAgY2FzZSAiZWRfc3RhcnQiOgorICAgICAgaWYgKHBhdGggJiYgcGF0aFswXSkKKyAgICAgICAgc3Rycz1mdWxsX3BhdGhfYXJyYXkocGF0aCwgZXVpZCk7CisgICAgICBlbHNlIHN0cnM9KHsicGxheWVycyIsZXVpZCwiLmVyciJ9KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBzdHJzPWZ1bGxfcGF0aF9hcnJheShwYXRoLCBldWlkKTsKKyAgfQorCisgIGlmICghZXVpZCB8fCBldWlkPT0iTk9CT0RZIiB8fCBldWlkPT0iZnRwIiB8fCBldWlkPT0iYW5vbnltb3VzIikgcmV0dXJuIDA7CisKKyAgLy8gUGZhZCBzb2xsIGFiIGpldHp0IGF1ZiBqZWRlbiBGYWxsIGFic29sdXQgc2Vpbi4KKyAgaWYgKHN0cnNbMF0gIT0gIiIpCisgICAgICBwYXRoID0gIi8iICsgaW1wbG9kZShzdHJzLCAiLyIpOworICBlbHNlCisgICAgICBwYXRoPWltcGxvZGUoc3RycywgIi8iKTsKKworICAvLyBmdWVyIGRpZSBSZWNodGViZXN0aW1tdW5nICIvIiBhbiBBbmZhbmcgdW5kIEVuZGUgZW50ZmVybmVuCisgIHN0cnMgLT0gKHsiIn0pOworCisgIC8vUm9vdC1PYmpla3RlIHVuZCBNYXN0ZXIgZHVlcmZlbiBpbW1lci4KKyAgaWYgKGV1aWQgPT0gUk9PVElEIHx8IG9iaj09VE8pIHJldHVybiBwYXRoOworCisgIGx2bD1xdWVyeV93aXpfbGV2ZWwoZXVpZCk7CisKKyAgLy9Ub3BsZXZlbDogbnVyIEVNKworICBpZiAoKHM9c2l6ZW9mKHN0cnMpKTw9MSkgcmV0dXJuIGx2bD49QVJDSF9MVkw7CisKKyAgc3dpdGNoKHN0cnNbMF0pIHsKKyAgICBjYXNlIFRNUERJUjoKKyAgICAgIHJldHVybiAxOworCisgICAgY2FzZSBTVERESVI6CisgICAgY2FzZSBTWVNESVI6CisgICAgY2FzZSBMSUJPQkpESVI6CisgICAgY2FzZSBFVENESVI6CisgICAgY2FzZSBMSUJST09NRElSOgorICAgICAgcmV0dXJuIGx2bD49QVJDSF9MVkw7CisgICAgCisgICAgY2FzZSBMSUJJVEVNRElSOgorICAgICAgcmV0dXJuIGx2bD49RUxERVJfTFZMOworCisgICAgY2FzZSBTUEVMTEJPT0tESVI6CisgICAgICAvLyB3ZW5uIHVudGVyaGFsYiBlaW5lcyB1bnRlcnZlcnplaWNobmlzc2VzIGRlcyBTdGlscyAiZ2lsZGUiLCBkYW5uIGlzdHMKKyAgICAgIC8vIGVpbmZhY2gKKyAgICAgIGlmIChzaXplb2Yoc3RycykgPiAyCisgICAgICAgICAgJiYgZ3VpbGRfbWFzdGVyKGV1aWQsIHN0cnNbMV0pKQorICAgICAgICByZXR1cm4gMTsKKworICAgICAgLy8gc29uc3QgbnVyIEVNcyBiencuIGFjY2Vzc19yaWdodHMuYyBmcmFnZW4uCisgICAgICByZXR1cm4gKChsdmw+PUFSQ0hfTFZMKSB8fCBhY2Nlc3NfcmlnaHRzKHN0cnMsZXVpZCkpOworCisgICAgY2FzZSBHVUlMRERJUjoKKyAgICAgIC8vIHdlbm4gdW50ZXJoYWxiIGVpbmVzIHVudGVydmVyemVpY2huaXNzZXMgZGVzIFN0aWxzICJmaWxkZS5naWxkZSIsCisgICAgICAvLyBkYW5uIGlzdHMgZWluZmFjaAorICAgICAgaWYgKHNpemVvZihzdHJzKSA+IDIpIHsKKyAgICAgICAgc3RyaW5nICp0bXAgPSBleHBsb2RlKHN0cnNbMV0sImZpbGVzLiIpOworICAgICAgICBpZiAoc2l6ZW9mKHRtcCkgPT0gMikgeworICAgICAgICAgIGlmIChndWlsZF9tYXN0ZXIoZXVpZCwgdG1wWzFdKSkKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAvLyBPYmpla3RlIGRvcnQgc29sbGVuIGF1Y2ggc2NocmVpYmVuIGR1ZXJmZW4uCisgICAgICAgICAgaWYgKGV1aWQgPT0gKCJHVUlMRC4iK3RtcFsxXSkpCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgLy8gc29uc3QgbnVyIEVNcyBiencuIGFjY2Vzc19yaWdodHMuYyBmcmFnZW4uCisgICAgICByZXR1cm4gKChsdmw+PUFSQ0hfTFZMKSB8fCBhY2Nlc3NfcmlnaHRzKHN0cnMsZXVpZCkpOworCisgICAgY2FzZSBET0NESVI6CisgICAgICBpZiAoIHMgPiAxICYmIChzdHJzWzFdID09ICJiYWxhbmNlIikgKQorICAgICAgICByZXR1cm4gKChsdmw+PUFSQ0hfTFZMKSB8fCBhY2Nlc3NfcmlnaHRzKHN0cnMsZXVpZCkpOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gKChsdmw+PVNQRUNJQUxfTFZMKSB8fCBhY2Nlc3NfcmlnaHRzKHN0cnMsZXVpZCkpOworCisgICAgY2FzZSBGVFBESVI6CisgICAgICAgIGlmICggcyA+IDEgJiYgKHN0cnNbMV0gPT0gImluY29taW5nIiB8fCBzdHJzWzFdID09ICJ0bXAiIHx8CisgICAgICAgICAgICAgICAgICAgICAgIHMgPT0gMyAmJiBzdHJzWzFdID09ICJOZXdzIiAmJiBzdHJzWzJdID09IGV1aWQrIi5uZXdzIikgKQorICAgICAgICAgICAgcmV0dXJuIDE7CisKKyAgICAgICAgaWYgKGx2bD49RUxERVJfTFZMKQorICAgICAgICAgICAgcmV0dXJuIDE7CisKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBjYXNlIE1BSUxESVI6CisgICAgICBpZiAoZXVpZD09TUFJTElEIHx8IHN0cnNbMV09PSJzcG9vbCIpIGJyZWFrOworICAgICAgcmV0dXJuIDA7CisKKyAgICBjYXNlIExJQlNBVkVESVI6CisgICAgICBpZiAobHZsPj1BUkNIX0xWTCkgcmV0dXJuIDE7CisgICAgICBpZiAocz09MyAmJiBzdHJzWzFdID09IGV1aWRbMC4uMF0gJiYKKyAgICAgICAgICAoc3Ryc1syXT09ZXVpZCsiLm8iIHx8IHN0cnNbMl09PWV1aWQpKSBicmVhazsKKyAgICAgIHJldHVybiAwOworCisgICAgY2FzZSBMSUJMT0dESVI6CisgICAgICAvKiBhdWYgL2xvZy9BUkNILyBoYWJlbiB3aXJrbGljaCBudXIgRU1zIFp1Z3JpZmYgKi8KKyAgICAgIGlmIChzdHJzWzFdPT0iQVJDSCIgJiYgbHZsPEFSQ0hfTFZMKSByZXR1cm4gMDsKKworICAgICAgLyogYWxsZXMgYW5kZXJlIGR1ZXJmZW4gYXVjaCBXZWlzZS4uLiAqLworICAgICAgaWYgKGx2bD49RUxERVJfTFZMKSByZXR1cm4gMTsKKworICAgICAgLyogQWxsZ2VtZWluZSBsb2dmaWxlcyBpbiAvbG9nIGR1ZXJmZW4gd2lya2xpY2ggbnVyIGdlc2NocmllYmVuIHdlcmRlbiAqLworICAgICAgaWYgKHM9PTIgJiYgc3Ryc1sxXVswXT49J0EnICYmIHN0cnNbMV1bMF08PSdaJyAmJiBmdW4gIT0gIndyaXRlX2ZpbGUiKQorICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgIC8qIFVudGVyaGFsYiB2b24gL2xvZy9zeXNsb2cgZGFyZiBudXIgZ2VzY2hyaWViZW4gd2VyZGVuICovCisgICAgICBpZiAocz4xICYmIHN0cnNbMV09PSJzeXNsb2ciICYmIGZ1biAhPSAid3JpdGVfZmlsZSIpCisgICAgICAgICByZXR1cm4gMDsKKworICAgICAgLyogbG9nZ2VuIGlucyBlaWdlbmUgcmVwZmlsZSBpbW1lciBlcmxhdWJlbiAqLworICAgICAgaWYgKHM9PTMgJiYgc3Ryc1sxXT09InJlcG9ydCIgJiYKKyAgICAgICAgICBzdHJzWzJdPT1leHBsb2RlKGV1aWQsICIuIilbPDFdKyIucmVwIikgYnJlYWs7CisKKyAgICAgIC8qIGluIGZyZW1kZW4gVmVyemVpY2huaXNzZW4gaGF0IG5pZW1hbmQgd2FzIHp1IGxvZ2dlbiAqLworICAgICAgaWYgKGdldF93aXpfbGV2ZWwoc3Ryc1sxXSkgPj0gV0laQVJEX0xWTCAmJgorICAgICAgICAgIHN0cnNbMV0gIT0gZWZ1bjo6ZXhwbG9kZShldWlkLCAiLiIpWzwxXSkKKyAgICAgICAgIHJldHVybiAwOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFdJWkFSRERJUjoKKyAgICAgIC8qIGtlaW4gWnVncmlmZiBhdWYgT2JqZWt0ZSBtaXQgaG9laGVyZW4gUmVjaHRlbiAqLworICAgICAgaWYgKHF1ZXJ5X3dpel9sZXZlbChzdHJzWzFdKSA+IGx2bCkgcmV0dXJuIDA7CisKKyAgICAgIC8qIE1hZ2llciBzZWxic3Qgb2RlciBXZWlzZSBkdWVyZmVuIGhpZXIgc2NocmVpYmVuICovCisgICAgICBpZiAoKElTX1dJWkFSRChldWlkKSAmJiBldWlkPT1zdHJzWzFdKXx8KGx2bD49RUxERVJfTFZMKSkgYnJlYWs7CisKKyAgICAgIC8qIEVzIHN0ZWh0IGplZG9jaCBmcmVpLCBhdWNoIGFuZGVyZW4gU2NocmVpYnJlY2h0ZSB6dSBnZWJlbi4uLiAqLworICAgICAgcmV0dXJuIGFjY2Vzc19yaWdodHMoc3RycyxldWlkKTsKKyAgICAgIAorICAgIGNhc2UgRE9NQUlORElSOgorICAgICAgLyogbmV1ZSBSZWdpb25lbiBkdWVyZmVuIG51ciBFcnptYWdpZXIgYW5sZWdlbiAqLworICAgICAgaWYgKHM8MiAmJiBsdmw8QVJDSF9MVkwpIHJldHVybiAwOworCisgICAgICAvKiBrZWluIFp1Z3JpZmYgYXVmIE9iamVrdGUgbWl0IGhvZWhlcmVuIFJlY2h0ZW4gKi8KKyAgICAgIGlmIChzPjIgJiYgcXVlcnlfd2l6X2xldmVsKGNyZWF0b3JfZmlsZShwYXRoKSkgPiBsdmwpCisgICAgICAgICByZXR1cm4gMDsKKworICAgICAgLyogQXVmIFJlZ2lvbmZpbGVzIHZvbiBlcnptYWdpZXIgaGFiZW4gbnVyIEVNcyBadWdyaWZmICovCisgICAgICBpZiAoY3JlYXRvcl9maWxlKHBhdGgpPT0iZXJ6bWFnaWVyIiAmJiBsdmw8QVJDSF9MVkwpIHJldHVybiAwOworCisgICAgICAvKiBpbm5lcmhhbGIgZGVyIFJlZ2lvbiBoYWJlbiBSTXMgdW5kIFdlaXNlIHZvbGxlIFNjaHJlaWJyZWNodGUgKi8KKyAgICAgIGlmIChsdmw+PUVMREVSX0xWTCB8fCBkb21haW5fbWFzdGVyKGV1aWQsc3Ryc1sxXSkpIGJyZWFrOworCisgICAgICAvKiBuZXVlIFZlcnplaWNobmlzc2UgaW4gZGVyIFJlZ2lvbiBrYW5uIG51ciBSTSsgYW5sZWdlbiAqLworICAgICAgaWYgKHM8PTMgJiYgKGZ1bj09Im1rZGlyIiB8fCBmdW49PSJybWRpciIpKSByZXR1cm4gMDsKKworICAgICAgLyogTWFnaWVyIGF1ZiBpaHJlIGVpZ2VuZW4gRmlsZXMuLi4gKi8KKyAgICAgIGlmIChzPjIgJiYgc3Ryc1syXT09ZXVpZCkgYnJlYWs7CisKKyAgICAgIC8qIEZpbGVzIGRlciBNYWdpZXIgaW4gZGVyIFJlZ2lvbiBpbiBpaHJlIGVpZ2VuZW4gVmVyemVpY2huaXNzZS4uLiAqLworICAgICAgaWYgKHM+MiAmJiBldWlkPT1zcHJpbnRmKCJkLiVzLiVzIiwgc3Ryc1sxXSwgc3Ryc1syXSkpIGJyZWFrOworCisgICAgICAvKiBGaWxlcyBtaXQgUmVnaW9uc3VpZCAqLworICAgICAgaWYgKGV1aWQ9PXN0cnNbMV0pIGJyZWFrOworCisgICAgICAvKiBFcyBpc3QgbW9lZ2xpY2ggYW5kZXJlbiBNYWdpZXJuIFJlY2h0ZSBiZWkgc2ljaCBlaW56dXJhZXVtZW4uICovCisgICAgICBpZiAoYWNjZXNzX3JpZ2h0cyhzdHJzLGV1aWQpPjApIGJyZWFrOworCisgICAgICAvKiBBdWYgZGFzIFZlcnplaWNobmlzcyAnYWxsZScgaGFiZW4gYWxsZSBSZWdpb25zbWl0Z2xpZWRlciBadWdyaWZmLgorICAgICAgICAgQXVzc2VyLCB3ZW5uIHNpZSB1ZWJlciBhY2Nlc3NfcmlnaHRzLmMgZXhwbGl6aXQgYXVzZ2VzY2hsb3NzZW4KKyAgICAgICAgIHdlcmRlbiAoUmV0dXJuY29kZSA8IDApLiAqLworICAgICAgaWYgKHM+MiAmJiBzdHJzWzJdPT0iYWxsZSIgJiYgZG9tYWluX21lbWJlcihldWlkLCBzdHJzWzFdKSAmJgorICAgICAgICAgIGFjY2Vzc19yaWdodHMoc3RycyxldWlkKT49MCkgYnJlYWs7CisgICAgICByZXR1cm4gMDsKKworICAgIGNhc2UgUFJPSkVDVERJUjoKKyAgICAgIC8qIE51ciBFcnptYWdpZXIgZHVlcmZlbiBuZXVlIFByb2pla3R2ZXJ6ZWljaG5pc3NlIGFubGVnZW4uLi4gKi8KKyAgICAgIGlmIChzPDMgJiYgbHZsPEFSQ0hfTFZMKSByZXR1cm4gMDsKKworICAgICAgLyogYWxsZXMgd2VpdGVyZSBkdWVyZmVuIGF1Y2ggV2Vpc2UgdHVuICovCisgICAgICBpZiAobHZsPj1FTERFUl9MVkwpIGJyZWFrOworCisgICAgICAvKiBpbiBkZW4gU2VydmljZXZlcnplaWNobmlzc2VuIG11c3MgbGVkaWdsaWNoIGRlciBOYW1lIHN0aW1tZW4gKi8KKyAgICAgIGlmIChzPjMgJiYgc3Ryc1sxXT09InNlcnZpY2UiICYmIGV1aWQ9PXN0cnNbMl0pIGJyZWFrOworCisgICAgICAvKiBPYmpla3RlIGVpbmVzIFByb2pla3RlcyBoYWJlbiBTY2hyZWlienVncmlmZmUgYXVmIGlociBQcm9qZWt0ICovCisgICAgICBpZiAocz4zICYmIChpbXBsb2RlKHN0cnNbMC4uMV0sICIuIikgPT0gZXVpZAorICAgICAgICAgICAgICAgICAgfHwgaW1wbG9kZShzdHJzWzAuLjJdLCAiLiIpID09IGV1aWQpICkgcmV0dXJuIDE7CisKKyAgICAgIC8qIFNjaHJlaWJyZWNodGUga29lbm5lbiBuYXR1ZXJsaWNoIGF1Y2ggdmVyZ2ViZW4gd2VyZGVuLi4uICovCisgICAgICBpZiAocHJvamVjdF9hY2Nlc3MoZXVpZCxzdHJzWzFdKSkgYnJlYWs7CisgICAgICAvLyBBbHRlcm5hdGl2IGJlc3RlaHQgbmViZW4gZGVtIEFDQ0VTU19SSUdIVFMgYXVjaCBub2NoIGRpZQorICAgICAgLy8gTW9lZ2xpY2hrZWl0LCBwZXIgYWNjZXNzX3JpZ2h0cy5jIFJlY2h0ZSBlaW56dXJhZXVtZW4uCisgICAgICBpZiAoYWNjZXNzX3JpZ2h0cyhzdHJzLGV1aWQpPjApIGJyZWFrOworCisgICAgIHJldHVybiAwOworCisgICAgZGVmYXVsdDogcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIHBhdGg7Cit9CisKK21peGVkIHZhbGlkX3JlYWQoc3RyaW5nIHBhdGgsIHN0cmluZyBldWlkLCBzdHJpbmcgZnVuLCBvYmplY3Qgb2JqKQoreworICBpbnQgcywgbGV2OworICBzdHJpbmcgKnN0cnMsIHN1ZjsKKworICBpZiAobWVtYmVyKHBhdGgsJyAnKSE9LTEpIHJldHVybiAwOworCisgIC8vIFVudGVyIExJQkRBVEFESVIgKC9kYXRhKSBzb2xsZW4ga29tcGxldHQgaWRlbnRpc2NoZSBMZXNlcmVjaHRlCisgIC8vIHZlcmdlYmVuIHdlcmRlbi4KKyAgaWYgKHNpemVvZihwYXRoKSA+IDYKKyAgICAgICYmIHBhdGhbMC4uNV0gPT0gIi8iTElCREFUQURJUiIvIikKKyAgICByZXR1cm4gdmFsaWRfcmVhZChwYXRoWzUuLl0sIGV1aWQsIGZ1biwgb2JqKSAhPSAwOworCisgIGlmICghZXVpZCkgZXVpZD0iLSI7CisKKyAgc3Rycz1mdWxsX3BhdGhfYXJyYXkocGF0aCwgZXVpZCk7CisgIC8vIFBmYWQgc29sbCBhYiBqZXR6dCBhdWYgamVkZW4gRmFsbCBhYnNvbHV0IHNlaW4uCisgIGlmIChzdHJzWzBdICE9ICIiKQorICAgICAgcGF0aCA9ICIvIiArIGltcGxvZGUoc3RycywgIi8iKTsKKyAgZWxzZQorICAgICAgcGF0aD1pbXBsb2RlKHN0cnMsICIvIik7CisKKyAgLy8gZnVlciBkaWUgUmVjaHRlYmVzdGltbXVuZyAiLyIgYW4gQW5mYW5nIHVuZCBFbmRlIGVudGZlcm5lbgorICBzdHJzIC09ICh7IiJ9KTsKKworICBpZiAoIXNpemVvZihzdHJzKSB8fCAhc2l6ZW9mKHBhdGgpIHx8IGV1aWQgPT0gUk9PVElEIHx8IG9iaj09VE8pIHJldHVybiBwYXRoOworCisgIGlmICgocz1zaXplb2Yoc3RycykpIDw9IDEpIHJldHVybiBwYXRoOworCisgIGxldj1xdWVyeV93aXpfbGV2ZWwoZXVpZCk7CisKKyAgc3dpdGNoKHN0cnNbMF0pIHsKKyAgICBjYXNlICJjb3JlIjoKKyAgICBjYXNlICJ3YWhsIjoKKyAgICAgIHJldHVybiAwOworCisgICAgY2FzZSBORVdTRElSOgorICAgICAgaWYgKHN0cnNbMV0gPT0gImFyY2hpdi5wdWIiKSAvLyBvZWZmZW50bGljaGVzIGFyY2hpdgorICAgICAgICByZXR1cm4gcGF0aDsKKyAgICAgIGVsc2UgaWYgKHN0cnNbMV0gPT0gImFyY2hpdi5tYWdpZXIiIC8vIE1hZ2llci1BcmNoaXYKKyAgICAgICAgICAgICAgICYmIGxldiA+PSBXSVpBUkRfTFZMKQorICAgICAgICByZXR1cm4gcGF0aDsKKworICAgICAgcmV0dXJuIDA7IC8vIGtlaW4gWnVncmlmZiBhdWYgL25ld3MvIG9kZXIgYWxsZXMgYW5kZXJlLgorCisgICAgY2FzZSAibWFwcyI6CisgICAgICBpZiAobGV2PD1XSVpBUkRfTFZMKSByZXR1cm4gMDsKKworICAgIGNhc2UgIiI6CisgICAgY2FzZSBFVENESVI6CisgICAgY2FzZSBTVERESVI6CisgICAgY2FzZSBTWVNESVI6CisgICAgY2FzZSBET0NESVI6CisgICAgY2FzZSBMSUJPQkpESVI6CisgICAgY2FzZSBMSUJST09NRElSOgorICAgIGNhc2UgTElCSVRFTURJUjoKKyAgICBjYXNlIEZUUERJUjoKKyAgICAgIHJldHVybiBwYXRoOworCisgICAgY2FzZSBNQUlMRElSOgorICAgICAgcmV0dXJuIChldWlkPT1NQUlMSUQpOworCisgICAgY2FzZSBTRUNVUkVESVI6CisgICAgICBpZiAoc3Ryc1sxXT09InNhdmUiKSByZXR1cm4gMDsKKyAgICAgIGlmIChwYXRoWzwyLi5dPT0iLm8iIHx8IHBhdGhbPDUuLl09PSIuZHVtcCIpIHJldHVybiAwOworICAgICAgaWYgKHN0cnNbMV0hPSJBUkNIIiB8fCBsZXY+PUFSQ0hfTFZMKSByZXR1cm4gcGF0aDsKKworICAgIGNhc2UgTElCTE9HRElSOgorICAgICAgaWYgKCBzdHJzWzFdID09ICJBUkNIIiAmJiAhSVNfREVQVVRZKGV1aWQpICkKKyAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgaWYgKCBzdHJzWzFdID09ICJBUkNIIiAmJiBsZXYgPCBBUkNIX0xWTCAmJiBzID09IDMgJiYKKyAgICAgICAgICAgc3Ryc1syXSAhPSAiKiIgJiYgc3Ryc1syXVswLi4yXSAhPSAiYmIuIiAmJgorICAgICAgICAgICBtZW1iZXIoIGRlcHV0eV9maWxlcywgc3Ryc1syXSApIDwgMCApCisgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgIGlmICggbGV2ID4gV0laQVJEX0xWTCApCisgICAgICAgICAgcmV0dXJuIHBhdGg7CisKKyAgICAgIGlmICggcyA9PSAyICYmIChzdHJzWzFdID09ICJyZXBvcnQiIHx8IHN0cnNbMV0gPT0gImVycm9yIikgKQorICAgICAgICAgIHJldHVybiBwYXRoOyAvLyBmdWVyICdjZCcKKworICAgICAgLy8gL2xvZyBzb2xsdGUgamVkZXIgYXVmbGlzdGVuIGtvZW5uZW4KKyAgICAgIGlmICggcyA9PSAyICYmIHN0cnNbMV09PSIqIiAmJiBmdW49PSJnZXRfZGlyIikKKyAgICAgICAgICByZXR1cm4gcGF0aDsKKworICAgICAgLy8gdW50ZXIgL2xvZy9yZXBvcnQvLCAvbG9nL2Vycm9yIHVuZCAvbG9nL3dhcm5pbmcvIGR1ZXJmZW4gYWxsZSBsZXNlbgorICAgICAgaWYgKCBzPT0zICYmIAorICAgICAgICAgIChzdHJzWzFdID09ICJyZXBvcnQiIHx8IHN0cnNbMV0gPT0gImVycm9yIiAgCisgICAgICAgICAgIHx8IHN0cnNbMV0gPT0id2FybmluZyIpKQorICAgICAgICAgIHJldHVybiBwYXRoOworCisgICAgICAvLyAvbG9nLzxNYWdpZXJuYW1lPiBkYXJmIHZvbiA8TWFnaWVybmFtZT4gbmF0dWVybGljaCBhdWNoCisgICAgICAvLyBnZWxlc2VuIHdlcmRlbgorICAgICAgaWYgKCBzID49IDIgJiYgc3Ryc1sxXSA9PSBldWlkICkKKyAgICAgICAgICByZXR1cm4gcGF0aDsKKworICAgICAgcmV0dXJuIDA7CisKKyAgICBjYXNlICJiYWNrdXAiOgorICAgIGNhc2UgTElCU0FWRURJUjoKKyAgICAgIGlmIChsZXY+V0laQVJEX0xWTCkgcmV0dXJuIHBhdGg7CisKKyAgICAgIC8qIE9iamVrdGUgaW4gL3AvKiBoYWJlbiBiaXNoZXIgbGVpZGVyIHdpemxldmVsIDAgKi8KKyAgICAgIC8vaWYgKGxldj09MCkgcmV0dXJuIHBhdGg7CisKKyAgICAgIGlmIChmdW49PSJmaWxlX3NpemUiKSByZXR1cm4gcGF0aDsKKworICAgICAgLy8gZGFzIGVpZ2VuZSBTYXZlZmlsZSBkYXJmIG1hbiBuYXR1ZXJsaWNoIGltbWVyLiA7LSkKKyAgICAgIGlmIChzPT0zICYmIChzdHJzWzJdPT1ldWlkKyIubyIgfHwgc3Ryc1syXT09ZXVpZCkpCisgICAgICAgIHJldHVybiBwYXRoOworICAgICAgcmV0dXJuIDA7CisKKyAgICBjYXNlIFBST0pFQ1RESVI6CisgICAgICAvKiBQcnVlZmVuIG9iIGVpbiBGaWxlIGV4aXN0aWVydCBkYXJmIGplZGVyLi4uICovCisgICAgICBpZiAoZnVuPT0iZmlsZV9zaXplIikgcmV0dXJuIHBhdGg7CisKKyAgICAgIC8qIERpZSBTZXJ2aWNlLVZlcnplaWNobmlzc2UgZGFyZiBqZWRlciBsZXNlbiAqLworICAgICAgaWYgKHM+MyAmJiBzdHJzWzFdPT0ic2VydmljZSIpIHJldHVybiBwYXRoOworCisgICAgICAvL1dlaXNlIGR1ZXJmZW4gaW4gL3AvIHNjaHJlaWJlbiwgYWxzbyBhdWNoIGxlc2VuLiAoWmVzc3RyYSwgMDQuMTEuMDYpCisgICAgICBpZiAobGV2Pj1FTERFUl9MVkwpIHJldHVybiBwYXRoOworCisgICAgICAvKiB3ZXIgaGllciBzY2hyZWliZW4gZGFyZiwgZGFyZiBuYXR1ZXJsaWNoIGF1ZiBqZWRlbiBGYWxsIGxlc2VuICovCisgICAgICAvL0FubWVya3VuZyB2LiBaZXNzdHJhOiBkYXMgcHJ1ZWZ0IG51ciwgb2IgamVtYW5kIGluIEFDQ0VTU19SSUdIVFMKKyAgICAgIC8vc3RlaHQsIG5pY2h0IG9iIGplbWFuZCAoZ2dmLiBhdXMgYW5kZXJlbiBHcnVlbmRlbiBzY2hyZWliZW4gZGFyZikKKyAgICAgIGlmIChwcm9qZWN0X2FjY2VzcyhldWlkLHN0cnNbMV0pKSByZXR1cm4gcGF0aDsKKyAgICAgIC8vQWx0ZXJuYXRpdiBrYW5uIG1hbiBleHBsaXppdGUgU2NocmVpYnJlY2h0ZSBhdWNoIHZpYSBhY2Nlc3NfcmlnaHRzLmMKKyAgICAgIC8vdmVyZ2ViZW4uICh1bmQgZGFtaXQgbmF0dWVybGljaCBhdWNoIExlc2VyZWNodGUpCisgICAgICBpZiAoYWNjZXNzX3JpZ2h0cyhzdHJzLGV1aWQpPjApIHJldHVybiBwYXRoOworCisgICAgICAvKiBPYmpla3RlIGVpbmVzIFByb2pla3RlcyBoYWJlbiBMZXNlenVncmlmZiBhdWYgaWhyIFByb2pla3QgKi8KKyAgICAgIGlmIChzPjMgJiYgKGltcGxvZGUoc3Ryc1swLi4xXSwgIi4iKSA9PSBldWlkCisgICAgICAgICAgICAgICAgICB8fCBpbXBsb2RlKHN0cnNbMC4uMl0sICIuIikgPT0gZXVpZCkgKSByZXR1cm4gcGF0aDsKKworICAgICAgLyogRmFsbC1UaHJvdWdoICovCisKKyAgICBjYXNlIEdVSUxERElSOgorICAgICAgLyogInNlY3VyZSItVmVyemVpY2huaXNzZSBkYXJmIG51ciBsZXNlbiwgd2VyIGRhIGF1Y2ggc2NocmVpYmVuIGRhcmYgKi8KKyAgICAgIGlmICggcyA+IDMgJiYgc3Ryc1s8Ml0gPT0gInNlY3VyZSIgJiYgbWVtYmVyKCBpbnNlY3VyZSwgc3Ryc1sxXSApIDwgMAorICAgICAgICAgICAmJiBsZXYgPCBBUkNIX0xWTCAmJiAhYWNjZXNzX3JpZ2h0cyhzdHJzLCBldWlkKSApCisgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgIC8qIFBydWVmZW4gb2IgZWluIEZpbGUgZXhpc3RpZXJ0IGRhcmYgamVkZXIuLi4gKi8KKyAgICAgIGlmIChmdW49PSJmaWxlX3NpemUiKSByZXR1cm4gcGF0aDsKKworICAgICAgLyogRmFsbC1UaHJvdWdoICovCisKKyAgICBjYXNlIFNQRUxMQk9PS0RJUjoKKyAgICAgIC8vIEdpbGRlbnBiamVrdGUga29lbm5lbiBoaWVyIGxlc2VuCisgICAgICBpZiAobGV2PT0wICYmIGV1aWRbMC4uNF09PSJHVUlMRCIpIHJldHVybiBwYXRoOworCisgICAgICAvLyBNaXQgTGV2ZWwgPD0gMjAgZGFyZiBtYW4gaGllciBuaWNodHMgbGVzZW4KKyAgICAgIGlmICggbGV2PD1XSVpBUkRfTFZMICYmIHNpemVvZihyZWdleHAoICh7c3Ryc1s8MV19KSwgIlxcLltvY2hdIiApKSApCisgICAgICAgIHJldHVybiAwOworCisgICAgICByZXR1cm4gcGF0aDsKKworICAgIGNhc2UgV0laQVJERElSOgorICAgICAgaWYgKHM9PTIpIHJldHVybiBwYXRoOworICAgICAgLyogZGFzIGVpZ2VuZSBWZXJ6ZWljaG5pc3MgZGFyZiBtYW4gbmF0dWVybGljaCBpbW1lciBsZXNlbi4uLiAqLworICAgICAgaWYgKHN0cnNbMV09PWV1aWQgJiYgbGV2Pj1XSVpBUkRfTFZMKSByZXR1cm4gcGF0aDsKKworICAgICAgLyogUHJ1ZWZlbiBvYiBlaW4gRmlsZSBleGlzdGllcnQgZGFyZiBqZWRlci4uLiAqLworICAgICAgaWYgKGZ1bj09ImZpbGVfc2l6ZSIpIHJldHVybiBwYXRoOworCisgICAgICAvKiBmcmVtZGUgVmVyemVpY2huaXNzZSBtaXQgPD0gTGV2ZWwgMjAgbm9jaCBuaWNodCAqLworICAgICAgaWYgKGxldjw9V0laQVJEX0xWTCkgcmV0dXJuIDA7CisKKyAgICAgIC8qIHdvIG1hbiBzY2hyZWliZW4gZGFyZiwgZGFyZiBtYW4gbmF0dWVybGljaCBhdWNoIGxlc2VuLi4uICovCisgICAgICBpZiAobGV2Pj1FTERFUl9MVkwpIHJldHVybiBwYXRoOworCisgICAgICAvLyBrZWluIFp1Z3JpZmYgYXVmIGFyY2hpdmllcnRlbiBDb2RlICh3byB6LkIuIHNlY3VyZS8gZHJpbiBzZWluCisgICAgICAvLyBrb2VubmVuKQorICAgICAgaWYgKG1lbWJlcigoeyJiejIiLCJneiIsInppcCJ9KSwgZXhwbG9kZShzdHJzWzwxXSwiLiIpWzwxXSkgPiAtMSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgIC8qIEZpbGVzIG9obmUgQ29kZSBzaW5kIG5pY2h0IHdlaXRlciBpbnRlcmVzc2FudC4uLiAqLworICAgICAgaWYgKCAhc2l6ZW9mKHJlZ2V4cCggKHtzdHJzWzwxXX0pLCAiXFwuW29jaF0iICkpICkKKyAgICAgICAgICByZXR1cm4gcGF0aDsKKworICAgICAgLyogZm9sZ2VuZGUgRnVua3Rpb25lbiBzaW5kIG5hdHVlcmxpY2ggdm9lbGxpZyB1bmludGVyZXNzYW50ICovCisgICAgICBpZiAobWVtYmVyKCh7ImdldF9kaXIiLCAicmVzdG9yZV9vYmplY3QifSksIGZ1bikhPS0xKQorICAgICAgICAgIHJldHVybiBwYXRoOworCisgICAgICAvKiBadWdyaWZmIGVybGF1YnQsIGFiZXIgbWl0bG9nZ2VuICovCisgICAgICB3cml0ZV9maWxlKCBSRUFEX0ZJTEUsIHNwcmludGYoIiVPICVzICVzOiAlc1xuIiwgZnVuLCBjdGltZSgpWzQuLl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXVpZCwgcGF0aCkgKTsKKyAgICAgIHJldHVybiBwYXRoOworCisgICAgY2FzZSBET01BSU5ESVI6CisgICAgICAvKiBNaXQgTGV2ZWwgMTUgZGFyZiBtYW4gaGllciBfbmljaHRzXyBsZXNlbiAqLworICAgICAgaWYgKCBmdW4hPSJmaWxlX3NpemUiICYmIGxldjxXSVpBUkRfTFZMICYmCisgICAgICAgICAgIHNpemVvZihyZWdleHAoICh7c3Ryc1s8MV19KSwgIlxcLltvY2hdIiApKSApIHJldHVybiAwOworCisgICAgICAvKiBkZW4gVmVyemVpY2huaXNiYXVtIHZvbiAvZC8gZGFyZiBtYW4gbmF0dWVybGljaCBzb25zdCBsZXNlbiAqLworICAgICAgaWYgKHM8PTIpIHJldHVybiBwYXRoOworCisgICAgICAvKiBlaWdlbmVuIENvZGUgZGFyZiBtYW4gbmF0dWVybGljaCBhdWNoIGxlc2VuICovCisgICAgICBpZiAoZXVpZD09c3Ryc1syXSB8fCBldWlkPT1zcHJpbnRmKCJkLiVzLiVzIiwgc3Ryc1sxXSwgc3Ryc1syXSkpCisgICAgICAgICByZXR1cm4gcGF0aDsKKworICAgICAgLyogRGVwdXRpZXMgaGFiZW4gZWluIGdlbWVpbnNhbWVzIFZlcnplaWNobmlzIHVudGVyIC9kL2Vyem1hZ2llciAqLworICAgICAgaWYgKHN0cnNbMV09PSJlcnptYWdpZXIiICYmIHN0cnNbMl09PSJwb2xpemVpIiAmJiBJU19ERVBVVFkoZXVpZCkpCisgICAgICAgICAgcmV0dXJuIHBhdGg7CisKKyAgICAgIC8qIGQvZXJ6bWFnaWVyIGRhcmYgbWFuIG51ciBhbHMgRXJ6bWFnaWVyIGxlc2VuICovCisgICAgICBpZiAoc3Ryc1sxXT09ImVyem1hZ2llciIgJiYgbGV2PEFSQ0hfTFZMKSByZXR1cm4gMDsKKworICAgICAgLyogZWluaWdlIFJlZ2lvbmVuIGhhYmVuIHN0ZC12ZXJ6ZWljaG5pc3NlLCBkaWUgZGFyZiBtYW4gbmF0dWVybGljaAorICAgICAgICAgYXVjaCBtaXQgTGV2ZWwgMjAgYmVyZWl0cyBrb21wbGV0dCBsZXNlbiEgKi8KKyAgICAgIGlmIChzdHJzWzJdPT0ic3RkIikgcmV0dXJuIHBhdGg7CisKKyAgICAgIC8qICJzZWN1cmUiLVZlcnplaWNobmlzc2UgZGFyZiBudXIgbGVzZW4sIHdlciBkYSBhdWNoIHNjaHJlaWJlbiBkYXJmICovCisgICAgICBpZiAoIHMgPiA0ICYmIHN0cnNbPDJdID09ICJzZWN1cmUiICYmIG1lbWJlciggaW5zZWN1cmUsIHN0cnNbMl0gKSA8IDAgKXsKKyAgICAgICAgICBpZiAoIGxldiA8IEVMREVSX0xWTCAmJiAhZG9tYWluX21hc3RlcihldWlkLCBzdHJzWzFdKQorICAgICAgICAgICAgICAgJiYgIWFjY2Vzc19yaWdodHMoc3RycywgZXVpZCkgKQorICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHJldHVybiBwYXRoOworICAgICAgfQorCisgICAgICAvKiBEb2t1cywgSW5mb3MgdW5kIC5yZWFkbWUgZGFyZiBtYW4gaW1tZXIgbGVzZW4uLi4gKi8KKyAgICAgIGlmICggZnVuPT0iZmlsZV9zaXplIiB8fCAhc2l6ZW9mKHJlZ2V4cCggKHtzdHJzWzwxXX0pLCAiXFwuW29jaF0iICkpICkKKyAgICAgICAgICByZXR1cm4gcGF0aDsKKworICAgICAgLyogTWl0IExldmVsIDIwIGRhcmYgbWFuIG5vY2gga2VpbmVuIGZyZW1kZW4gQ29kZSBsZXNlbiEgKi8KKyAgICAgIGlmIChsZXY8PVdJWkFSRF9MVkwpIHJldHVybiAwOworCisgICAgICAvKiBXZWlzZSBkdWVyZmVuIG5hdHVlcmxpY2ggYWxsZXMgd2VpdGVyZSBsZXNlbiAqLworICAgICAgaWYgKGxldj49RUxERVJfTFZMKSByZXR1cm4gcGF0aDsKKworICAgICAgLyogUmVnaW9uc21hZ2llciBpbiBpaHJlbiBSZWdpb25lbiBuYXR1ZXJsaWNoIGF1Y2ggKi8KKyAgICAgIGlmIChsZXY+PUxPUkRfTFZMICYmIGRvbWFpbl9tYXN0ZXIoZXVpZCwgc3Ryc1sxXSkpIHJldHVybiBwYXRoOworCisgICAgICAvKiBmb2xnZW5kZSBGdW5rdGlvbmVuIHNpbmQgbmF0dWVybGljaCB2b2VsbGlnIHVuaW50ZXJlc3NhbnQgKi8KKyAgICAgIGlmIChtZW1iZXIoKHsiZ2V0X2RpciIsICJyZXN0b3JlX29iamVjdCJ9KSwgZnVuKSE9LTEpCisgICAgICAgICAgcmV0dXJuIHBhdGg7CisKKyAgICAgIC8qIFp1Z3JpZmYgZXJsYXVidCwgYWJlciBtaXRsb2dnZW4gKi8KKyAgICAgIHdyaXRlX2ZpbGUoIFJFQURfRklMRSwgc3ByaW50ZigiJU8gJXMgJXM6ICVzXG4iLCBmdW4sIGN0aW1lKClbNC4uXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldWlkLCBwYXRoKSApOworICAgICAgcmV0dXJuIHBhdGg7CisgIH0KKyAgaWYgKGxldjxBUkNIX0xWTCkgcmV0dXJuIDA7CisgIHJldHVybiBwYXRoOworfQorCmRpZmYgLS1naXQgYS9zZWN1cmUvbWFzdGVyL2d1aWxkLmMgYi9zZWN1cmUvbWFzdGVyL2d1aWxkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVhYWE4YgotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9tYXN0ZXIvZ3VpbGQuYwpAQCAtMCwwICsxLDYyIEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gbWFzdGVyL2d1aWxkLmMgLS0gR2lsZGVuIHVuZCBHaWxkZW5tYWdpZXIKKy8vCisvLyAkSWQ6IGd1aWxkLmMgNjE0MiAyMDA3LTAxLTMxIDIwOjM0OjM5WiBaZXNzdHJhICQKKworLyoKKyAqIERpZXMga2FubiBpcmdlbmR3YW5uIGF1Y2ggaGluc2ljaHRsaWNoIGVpbmVyIGF1dG9tYXRpc2NoZW4gCisgKiBSZWNodGV2ZXJnYWJlIGF1ZiBHaWxkZW4tVmVyemVpY2huaXNzZSBlcndlaXRlcnQgd2VyZGVuLgorICogQmlzaGVyIHdlcmRlbiBudXIgR2lsZGVubWFnaWVyIHZlcndhbHRldC4KKyAqLworCisjcHJhZ21hIHN0cmljdF90eXBlcworCisjaW5jbHVkZSAiL3NlY3VyZS9tYXN0ZXIuaCIKKworCitpbnQgZ3VpbGRfbWFzdGVyKHN0cmluZyB1c2VyLCBzdHJpbmcgZ3VpbGQpCit7CisgIHN0cmluZyAqZ3VpbGRzOworICBpbnQgaTsKKworICBpZiAoIWZpbmRfdXNlcmluZm8odXNlcil8fAorICAgICAgIXBvaW50ZXJwKGd1aWxkcz1nZXRfdXNlcmluZm8odXNlcilbVVNFUl9HVUlMRC0xXSkpCisgICAgcmV0dXJuIDA7CisgIAorICByZXR1cm4gKG1lbWJlcihndWlsZHMsZ3VpbGQpICE9IC0xKTsKK30KKworaW50IGFkZF9ndWlsZF9tYXN0ZXIoc3RyaW5nIHVzZXIsIHN0cmluZyBndWlsZCkKK3sKKyAgc3RyaW5nICpndWlsZHM7CisgIAorICBpZiAoKGNhbGxfb3RoZXIoU0lNVUxfRUZVTl9GSUxFLCAicHJvY2Vzc19jYWxsIikgfHwKKyAgICAgICBjYWxsX290aGVyKFNJTVVMX0VGVU5fRklMRSwgInNlY3VyZV9sZXZlbCIpIDwgR09EX0xWTCkgfHwKKyAgICAgICFmaW5kX3VzZXJpbmZvKHVzZXIpKQorICAgIHJldHVybiAwOworCisgIGd1aWxkcz1nZXRfdXNlcmluZm8odXNlcilbVVNFUl9HVUlMRC0xXTsKKyAgaWYgKCFndWlsZHMpCisgICAgc2V0X2d1aWxkcyh1c2VyLCAoeyBndWlsZCB9KSApOworICBlbHNlIHsKKyAgICBndWlsZHMgPSBndWlsZHMgLSAoe2d1aWxkfSkgKyAoe2d1aWxkfSk7CisgICAgc2V0X2d1aWxkcyh1c2VyLCBndWlsZHMpOworICB9CisgIHJldHVybiAxOworfQorCitpbnQgcmVtb3ZlX2d1aWxkX21hc3RlcihzdHJpbmcgdXNlciwgc3RyaW5nIGd1aWxkKQoreworICBzdHJpbmcgKmd1aWxkczsKKworICBpZiAoIUlTX0dPRChnZXRldWlkKHByZXZpb3VzX29iamVjdCgpKSkKKyAgICAgIHx8IWZpbmRfdXNlcmluZm8odXNlcikKKyAgICAgIHx8IShndWlsZHM9Z2V0X3VzZXJpbmZvKHVzZXIpW1VTRVJfR1VJTEQtMV0pCisgICAgICB8fCBtZW1iZXIoZ3VpbGRzLGd1aWxkKT09LTEpCisgICAgcmV0dXJuIDA7CisgIGd1aWxkcyAtPSAoeyBndWlsZCB9KTsKKyAgc2V0X2d1aWxkcyh1c2VyLCBndWlsZHMpOworICByZXR1cm4gMTsKK30KKwpkaWZmIC0tZ2l0IGEvc2VjdXJlL21hc3Rlci9taXNjLmMgYi9zZWN1cmUvbWFzdGVyL21pc2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmIwZmNjCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL21hc3Rlci9taXNjLmMKQEAgLTAsMCArMSw3NzIgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBtYXN0ZXIvbWlzYy5jIC0tIERpdmVyc2VzOiAoVClCYW5pc2gsIFByb2pla3R2ZXJ3YWx0dW5nLCBMZXZlbGF1ZnN0aWVnLCAuLi4KKy8vCisvLyAkSWQ6IG1pc2MuYyA5NDY3IDIwMTYtMDItMTkgMTk6NDg6MjRaIFplc3N0cmEgJAorCisjcHJhZ21hIHN0cmljdF90eXBlcyxydHRfY2hlY2tzCisKKyNpbmNsdWRlICIvc3lzL2Z1bmN0aW9ubGlzdC5oIgorI2luY2x1ZGUgIi9zeXMvbHBjdHlwZXMuaCIKKyNpbmNsdWRlICIvc3lzL29iamVjdF9pbmZvLmgiCisjaW5jbHVkZSAiL3N5cy9pbnRlcmFjdGl2ZV9pbmZvLmgiCisKKyNpbmNsdWRlICIvc2VjdXJlL21hc3Rlci5oIgorI2luY2x1ZGUgIi9tYWlsL3Bvc3QuaCIKKyNpbmNsdWRlICIvc3lzL3RoaW5nL2xhbmd1YWdlLmgiCisjaW5jbHVkZSAiL3N5cy90aGluZy9kZXNjcmlwdGlvbi5oIgorCisvLyBGdWVyIENJRFItTm90YXRpbyBpbSBzYmFuaXNoCisjaW5jbHVkZSAiL3NlY3VyZS9tYXN0ZXIvY2lkci5jIgorCitzdGF0aWMgbWl4ZWQgKmJhbmlzaGVkOworc3RhdGljIG1hcHBpbmcgdGJhbmlzaGVkLCBzYmFuaXNoZWQ7CitzdGF0aWMgc3RyaW5nICpkZXB1dGllczsKKworLy8gVE9ETzogbXVzcyBnZ2YuIEZha2VvYmpla3QgZXJ6ZXVnZW4rdWViZXJnZWJlbiwgd2VubiBzZW5kZXIga2VpbiBvYmplY3QKK3Byb3RlY3RlZCB2b2lkIHNlbmRfY2hhbm5lbF9tc2coc3RyaW5nIGNoYW5uZWwsbWl4ZWQgc2VuZGVybmFtZSxzdHJpbmcgbXNnKQoreworICBvYmplY3Qgc2VuZGVyOworICBpZiAob2JqZWN0cChzZW5kZXJuYW1lKSkKKyAgICBzZW5kZXI9c2VuZGVybmFtZTsKKyAgZWxzZQorICB7CisgICAgLy8gd2VubiBrZWluIE9iamVrdCB1ZWJlcmdlYmVuLCBlcnN0bWFsIHNjaGF1ZW4sIG9iIGVpbiBTcGllbGVyb2JqZWN0CisgICAgLy8gZXhpc3RpZXJ0Li4uIFdlbm4gamEsIGRhcyBuZWhtZW4uCisgICAgc2VuZGVyID0gY2FsbF9zZWZ1bigiZmluZF9wbGF5ZXIiLCBzZW5kZXJuYW1lKQorICAgICAgICAgICAgIHx8IGNhbGxfc2VmdW4oImZpbmRfbmV0ZGVhZCIsIHNlbmRlcm5hbWUpOworICAgIGlmICghb2JqZWN0cChzZW5kZXIpKQorICAgIHsKKyAgICAgIC8vIHNvbnN0IGZha2VuIHdpciBlaW5zLiAqc2V1ZnoqCisgICAgICBzZW5kZXI9Y2xvbmVfb2JqZWN0KCIvcC9kYWVtb24vbmFtZWZha2UiKTsKKyAgICAgIHNlbmRlci0+U2V0UHJvcChQX05BTUUsIHNlbmRlcm5hbWUpOyAKKyAgICAgIHNlbmRlci0+U2V0UHJvcChQX0FSVElDTEUsMCk7CisgICAgICAvLyBEaWVzZXMgT2JqZWt0IHplcnN0b2VydCBzaWNoIG5hY2ggM3MgYXV0b21hdGlzY2guCisgICAgfQorICB9CisgIENITUFTVEVSLT5zZW5kKGNoYW5uZWwsIHNlbmRlciwgbXNnKTsKK30KKworc3RhdGljIHN0cmluZyAqZXhwbG9kZV9maWxlcyhzdHJpbmcgZmlsZSkgeworICBzdHJpbmcgZGF0YTsKKyAgbWl4ZWQgKmV4cGxvZGVkOworICBpbnQgaTsKKworICBkYXRhPXJlYWRfZmlsZShmaWxlKTsKKyAgaWYgKCFkYXRhIHx8ICFzdHJpbmdwKGRhdGEpIHx8IGRhdGEgPT0gIiIpIHJldHVybiAoe30pOworICBleHBsb2RlZCA9IGVmdW46OmV4cGxvZGUoZGF0YSwiXG4iKTsKKyAgZm9yIChpPXNpemVvZihleHBsb2RlZCk7aS0tOykKKyAgICBpZiAoIXN0cmluZ3AoZXhwbG9kZWRbaV0pIHx8IGV4cGxvZGVkW2ldPT0iIiB8fCBleHBsb2RlZFtpXVswXT09JyMnKQorICAgICAgZXhwbG9kZWRbaV09MDsKKyAgZXhwbG9kZWQtPSh7MH0pOworICBwcmludGYoIiUtMzBzOiAlM2QgT2JqZWt0JXNcbiIsZmlsZSxpPXNpemVvZihleHBsb2RlZCksKGk9PTE/IiI6ImUiKSk7CisgIHJldHVybiBleHBsb2RlZDsKK30KKwordm9pZCBVcGRhdGVUQmFuaXNoKCk7CisKK21peGVkIFF1ZXJ5QmFuaXNoZWQoc3RyaW5nIHN0cil7CisgIGludCBpOworCisgIGlmICghc3RyKSByZXR1cm4gMDsKKyAgaWYgKCFwb2ludGVycChiYW5pc2hlZCkpIHJldHVybiAwOworICBmb3IgKGk9c2l6ZW9mKGJhbmlzaGVkKS0xO2k+PTA7aS0tKQorICAgIGlmIChzaXplb2YocmVnZXhwKCh7c3RyfSksIl4iK2JhbmlzaGVkW2ldWzBdKyIkIikpKQorICAgIHsKKyAgICAgIGlmICghYmFuaXNoZWRbaV1bMV0gfHwgYmFuaXNoZWRbaV1bMV09PSIiKQorICAgICAgICByZXR1cm4gIkRpZXNlciBOYW1lIGlzdCBnZXNwZXJydC4iOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gYmFuaXNoZWRbaV1bMV07CisgICAgfQorICByZXR1cm4gMDsKK30KKworbWl4ZWQgUXVlcnlUQmFuaXNoZWQoc3RyaW5nIHN0cikgeworICBpbnQgaTsKKworICBpZiAoIXN0ciB8fCAhbWFwcGluZ3AodGJhbmlzaGVkKSB8fCAhKGk9dGJhbmlzaGVkW3N0cl0pKQorICAgIHJldHVybiAwOworCisgIGlmIChpID09IC0xIHx8IGkgPiB0aW1lKCkpCisgICAgcmV0dXJuIHNwcmludGYoIkVzIGdpYnQgc2Nob24gZWluZW4gU3BpZWxlciBkaWVzZW4gTmFtZW5zLlxuIgorICAgICAgICArIkFsbGVyZGluZ3Mga2FubiBlci9zaWUgZXJzdCBhbSAlcyB3aWVkZXIgaW5zIE11ZCBrb21tZW4uXG4iLAorICAgICAgICAgIChpID09IC0xID8gIlN0LiBOaW1tZXJsZWluc3RhZyIgOgorICAgICAgICAgICBjYWxsX3NlZnVuKCJkdGltZSIsaSlbMC4uMTZdKSk7CisKKy8vIEFuc29uc3RlbjogZGllIFplaXQgaXN0IGFiZ2VsYXVmZW4sIFNwaWVsZXIgZGFyZiB3aWVkZXIuLi4KKyAgbV9kZWxldGUodGJhbmlzaGVkLCBzdHIpOworICBVcGRhdGVUQmFuaXNoKCk7CisgIHJldHVybiAwOworfQorCit2b2lkIFJlbG9hZEJhbmlzaEZpbGUoKXsKKyAgICBpbnQgaSwgdDsKKyAgICBzdHJpbmcgczEsIHMyLCAqczsKKworICAgIGJhbmlzaGVkID0gZWZ1bjo6ZXhwbG9kZSggcmVhZF9maWxlKCIvc2VjdXJlL0JBTklTSCIpIHx8ICIiLCAiXG4iICk7CisgICAgYmFuaXNoZWQgPSBiYW5pc2hlZCAtICh7IiJ9KTsKKyAgICBmb3IgKCBpID0gc2l6ZW9mKGJhbmlzaGVkKTsgaS0tOyApeworICAgICAgICBzID0gZWZ1bjo6ZXhwbG9kZSggYmFuaXNoZWRbaV0sICIgIiApOworICAgICAgICBzMSA9IHNbMF07CisgICAgICAgIHMyID0gaW1wbG9kZSggc1sxLi5dLCAiICIgKTsKKyAgICAgICAgYmFuaXNoZWRbaV0gPSAoeyBzMSwgczIgfSk7CisgICAgfQorCisgICAgaWYgKCAhbWFwcGluZ3AodGJhbmlzaGVkKSApeworICAgICAgICB0YmFuaXNoZWQgPSAoW10pOworCisgICAgICAgIHMgPSBlZnVuOjpleHBsb2RlKCByZWFkX2ZpbGUoIi9zZWN1cmUvVEJBTklTSCIpIHx8ICIiLCAiXG4iICk7CisgICAgICAgIHMgLT0gKHsiIn0pOworCisgICAgICAgIGZvciAoIGkgPSBzaXplb2Yocyk7IGktLTsgKXsKKyAgICAgICAgICAgIHNzY2FuZiggc1tpXSwgIiVzOiVkIiwgczEsIHQgKTsKKyAgICAgICAgICAgIHRiYW5pc2hlZCArPSAoWyBzMSA6IHQgXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoICFtYXBwaW5ncChzYmFuaXNoZWQpICl7CisgICAgICAgIHNiYW5pc2hlZCA9IG1fYWxsb2NhdGUoMywgMik7CisKKyAgICAgICAgcyA9IGVmdW46OmV4cGxvZGUoIHJlYWRfZmlsZSgiL3NlY3VyZS9TSVRFQkFOSVNIIikgfHwgIiIsICJcbiIgKTsKKyAgICAgICAgcyAtPSAoeyIifSk7CisKKyAgICAgICAgZm9yICggaSA9IHNpemVvZihzKTsgaS0tOyApIHsKKyAgICAgICAgICAgIGludCBpbnRfaXA7CisgICAgICAgICAgICBzc2NhbmYoIHNbaV0sICIlczolZDolcyIsIHMxLCB0LCBzMiApOworICAgICAgICAgICAgaW50X2lwID0gSVB2NF9hZGRyMmludChzMSk7CisgICAgICAgICAgICBtX2FkZChzYmFuaXNoZWQsIGludF9pcCwgdCwgczIpOworICAgICAgICB9CisgICAgfQorfQorCitpbnQgSXNEZXB1dHkobWl4ZWQgbmFtZSkKK3sKKyAgICBpZiAoIElTX0FSQ0gobmFtZSkgKQorICAgICAgICByZXR1cm4gMTsKKworICAgIGlmICggb2JqZWN0cChuYW1lKSApCisgICAgICAgIG5hbWUgPSBnZXR1aWQobmFtZSk7CisKKyAgICBpZiAoIG1lbWJlciggZGVwdXRpZXMgfHwgKHt9KSwgbmFtZSApID49IDAgKQorICAgICAgICByZXR1cm4gMTsKKworICAgIHJldHVybiAwOworfQorCisKK3ZhcmFyZ3Mgdm9pZCBCYW5pc2hOYW1lKCBzdHJpbmcgbmFtZSwgc3RyaW5nIHJlYXNvbiwgaW50IGZvcmNlICkKK3sKKyAgc3RyaW5nICpuYW1lczsKKyAgaW50IGk7CisKKyAgaWYgKCBQTyAhPSBUTyAmJiBjYWxsX3NlZnVuKCJzZWN1cmVfbGV2ZWwiKSA8IExPUkRfTFZMCisgICAgICAgICAgICYmICFJc0RlcHV0eSggY2FsbF9zZWZ1bigic2VjdXJlX2V1aWQiKSApICkKKyAgICAgIHJldHVybjsKKworICBpZiAoICFzdHJpbmdwKG5hbWUpIHx8ICFzaXplb2YobmFtZSkgKQorICAgICAgcmV0dXJuOworCisgIG5hbWUgPSBsb3dlcl9jYXNlKG5hbWUpOworCisgIGlmICggIXJlYXNvbiB8fCAhc3RyaW5ncChyZWFzb24pICkKKyAgICAgIHJlYXNvbiA9ICIiOworCisgIGlmICggUXVlcnlCYW5pc2hlZChuYW1lKSAmJiBsb3dlcl9jYXNlKHJlYXNvbikgIT0gImxvZXNjaGVuIiApeworICAgICAgd3JpdGUoIkRlciBOYW1lIGlzdCBzY2hvbiBnZWJhbm50LlxuIik7CisgICAgICByZXR1cm47CisgIH0KKworICBpZiAoICFmb3JjZSAmJiBmaWxlX3NpemUoU0FWRVBBVEgrbmFtZVswLi4wXSsiLyIrbmFtZSsiLm8iKSA+IDAgKXsKKyAgICAgIHdyaXRlKCJFcyBleGlzdGllcnQgYmVyZWl0cyBlaW4gU3BpZWxlciBkaWVzZXMgTmFtZW5zLlxuIik7CisgICAgICByZXR1cm47CisgIH0KKworLyogIGlmICghKCIvc2VjdXJlL2xvZ2luIi0+dmFsaWRfbmFtZShuYW1lKSkpIHJldHVybjsqLworICBpZiAoIGxvd2VyX2Nhc2UocmVhc29uKSAhPSAibG9lc2NoZW4iICl7CisgICAgICBuYW1lcyA9ICh7IG5hbWUgKyAiICIgKyByZWFzb24gfSk7CisKKyAgICAgIGZvciAoIGkgPSBzaXplb2YoYmFuaXNoZWQpOyBpLS07ICkKKyAgICAgICAgICBuYW1lcyArPSAoeyBiYW5pc2hlZFtpXVswXSArICIgIiArIGJhbmlzaGVkW2ldWzFdIH0pOworICB9CisgIGVsc2V7CisgICAgICBuYW1lcyA9ICh7fSk7CisKKyAgICAgIGZvciAoIGkgPSBzaXplb2YoYmFuaXNoZWQpOyBpLS07ICkKKyAgICAgICAgICBpZiAoIGJhbmlzaGVkW2ldWzBdICE9IG5hbWUgKQorICAgICAgICAgICAgICBuYW1lcyArPSAoeyBiYW5pc2hlZFtpXVswXSArICIgIiArIGJhbmlzaGVkW2ldWzFdIH0pOworICB9CisKKyAgbmFtZXMgPSBzb3J0X2FycmF5KCBuYW1lcywgIyc+ICk7CisgIHJtKCIvc2VjdXJlL0JBTklTSCIpOworICB3cml0ZV9maWxlKCAiL3NlY3VyZS9CQU5JU0giLCBpbXBsb2RlKG5hbWVzLCAiXG4iKSApOworICB3cml0ZSggIk9rYXksICciK2NhcGl0YWxpemUobmFtZSkrIicgaXN0IGpldHp0ICIrCisgICAgICAobG93ZXJfY2FzZShyZWFzb24pID09ICJsb2VzY2hlbiIgPyAibmljaHQgbWVociAiIDogIiIpKyJnZWJhbmlzaHQuXG4iICk7CisgIFJlbG9hZEJhbmlzaEZpbGUoKTsKK30KKwordm9pZCBVcGRhdGVUQmFuaXNoKCkKK3sKKyAgaW50IGk7CisgIHN0cmluZyAqbmFtZXM7CisKKyAgZm9yIChpPXNpemVvZihuYW1lcyA9IHNvcnRfYXJyYXkobV9pbmRpY2VzKHRiYW5pc2hlZCksICMnPC8qJyovKSktMTtpPj0wO2ktLSkKKyAgICBuYW1lc1tpXSA9IHNwcmludGYoIiVzOiVkIiwgbmFtZXNbaV0sIHRiYW5pc2hlZFtuYW1lc1tpXV0pOworCisgIHJtKCIvc2VjdXJlL1RCQU5JU0giKTsKKyAgd3JpdGVfZmlsZSgiL3NlY3VyZS9UQkFOSVNIIiwgaW1wbG9kZShuYW1lcywgIlxuIikpOworfQorCit2b2lkIFVwZGF0ZVNCYW5pc2goKQoreworICAgIGludCBpOworICAgIG1hcHBpbmcgbGluZXMgPSBtX2FsbG9jYXRlKHNpemVvZihzYmFuaXNoZWQpLDApOworCisgICAgZm9yZWFjaChpbnQgaXAsIGludCB0c3RhbXAsIHN0cmluZyB1c2VyIDogc2JhbmlzaGVkKSB7CisgICAgICBtX2FkZChsaW5lcywgc3ByaW50ZigiJXM6JWQ6JXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSVB2NF9pbnQyYWRkcihpcCksIHRzdGFtcCwgdXNlcikpOworICAgIH0KKworICAgIHdyaXRlX2ZpbGUoICIvc2VjdXJlL1NJVEVCQU5JU0giLCAKKyAgICAgICAgaW1wbG9kZSggc29ydF9hcnJheSAobV9pbmRpY2VzKGxpbmVzKSwgIyc8KSwgIlxuIiApLCAxKTsKK30KKworaW50IFRCYW5pc2hOYW1lKHN0cmluZyBuYW1lLCBpbnQgZGF5cykKK3sKKyAgaW50IHQ7CisKKyAgaWYgKCAoZ2V0dWlkKFRJKSAhPSBuYW1lKSAmJgorICAgICAgICFJc0RlcHV0eSggY2FsbF9zZWZ1bigic2VjdXJlX2V1aWQiKSApICkKKyAgICByZXR1cm4gMDsKKworICBpZiAoZGF5cyAmJiBRdWVyeVRCYW5pc2hlZChuYW1lKSl7CisgICAgd3JpdGUoIkRlciBOYW1lIGlzdCBzY2hvbiBnZWJhbm50LlxuIik7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBpZiAoZmlsZV9zaXplKFNBVkVQQVRIK25hbWVbMC4uMF0rIi8iK25hbWUrIi5vIik8PTApeworICAgIHdyaXRlKCJFcyBleGlzdGllcnQga2VpbiBTcGllbGVyIGRpZXNlcyBOYW1lbnMhXG4iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGlmICghZGF5cyAmJiBtZW1iZXIodGJhbmlzaGVkLCBuYW1lKSkKKyAgICBtX2RlbGV0ZSh0YmFuaXNoZWQsIG5hbWUpOworICBlbHNlIHsKKyAgICBpZiAoIW1hcHBpbmdwKHRiYW5pc2hlZCkpCisgICAgICB0YmFuaXNoZWQgPSAoW10pOworICAgIGlmIChkYXlzIDw9IC0xKQorICAgICAgdCA9IC0xOworICAgIGVsc2UKKyAgICAgIHQgPSAodGltZSgpLzg2NDAwKSo4NjQwMCArIGRheXMqODY0MDA7CisgICAgdGJhbmlzaGVkICs9IChbIG5hbWUgOiB0IF0pOworICB9CisKKyAgVXBkYXRlVEJhbmlzaCgpOworICByZXR1cm4gMTsKK30KKworCittaXhlZCBRdWVyeVNCYW5pc2hlZCggc3RyaW5nIGlwICkKK3sKKyAgICBpbnQgc2F2ZV9tZSwgc2l0ZTsKKyAgICBzdHJpbmcgYmFuaXNoZWRfbWVsZHVuZyA9CisgICAgICAiXG5Tb3JyeSwgdm9uIERlaW5lciBBZHJlc3NlIGthbWVuIGVpbiBwYWFyIElkaW90ZW4sIGRpZSAiCisgICAgICAgICAgICAiYXVzc2NobGllc3NsaWNoXG5BZXJnZXIgbWFjaGVuIHdvbGx0ZW4uIERlc2hhbGIgaGFiZW4gd2lyICIKKyAgICAgICAgICAgICJkaWUgTW9lZ2xpY2hrZWl0LFxuZWluZmFjaCBuZXVlIENoYXJha3RlcmUgIgorICAgICAgICAgICAgImFuenVsZWdlbiwga3VyenplaXRpZyBmdWVyIGRpZXNlIEFkcmVzc2UgZ2VzcGVycnQuXG5cbiIKKyAgICAgICAgICAgICJGYWxscyBEdSBiZWkgdW5zIHNwaWVsZW4gbW9lY2h0ZXN0LCBzY2hpY2tlIGJpdHRlIGVpbmUgRW1haWwgIgorICAgICAgICAgICAgImFuXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICBtdWRAbWcubXVkLmRlXG5cbiIKKyAgICAgICAgICAgICJtaXQgZGVyIEJpdHRlLCBlaW5lbiBDaGFyYWt0ZXIgZnVlciBEaWNoIGFuenVsZWdlbi5cbiIgOworCisgICAgaWYgKCAhaXAgfHwgIXN0cmluZ3AoaXApIHx8ICFtYXBwaW5ncChzYmFuaXNoZWQpIHx8ICFzaXplb2Yoc2JhbmlzaGVkKSApCisgICAgICAgIHJldHVybiAwOworCisgICAgZm9yZWFjaChzaXRlLCBpbnQgdHN0YW1wOiBzYmFuaXNoZWQpIHsKKyAgICAgICAgaWYgKCB0c3RhbXAgPiAwICYmIHRzdGFtcCA8IHRpbWUoKSApIHsKKyAgICAgICAgICAgIG1fZGVsZXRlKCBzYmFuaXNoZWQsIHNpdGUgKTsKKyAgICAgICAgICAgIHNhdmVfbWU9MTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoc2F2ZV9tZSkKKyAgICAgICAgVXBkYXRlU0JhbmlzaCgpOworCisgICAgaWYgKCAhc2l6ZW9mKHNiYW5pc2hlZCkgKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHNpdGUgPSBJUHY0X2FkZHIyaW50KGlwKTsKKyAgICBpZiAoIXNpdGUpCisgICAgICAgIHJldHVybiAwOworICAgIC8vIGRpcmVrdCBkcmluPworICAgIGlmIChtZW1iZXIoc2JhbmlzaGVkLCBzaXRlKSkKKyAgICAgICAgcmV0dXJuIGJhbmlzaGVkX21lbGR1bmc7CisgICAgLy8gb2RlciBOZXR6IGRpZXNlciBJUCBnZXNwZXJydD8KKyAgICBmb3JlYWNoKGludCBsb2NrZWRfc2l0ZSA6IHNiYW5pc2hlZCkgeworICAgICAgICBpZiAoKGxvY2tlZF9zaXRlICYgc2l0ZSkgPT0gbG9ja2VkX3NpdGUpCisgICAgICAgICAgICByZXR1cm4gYmFuaXNoZWRfbWVsZHVuZzsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworCitwcml2YXRlIGludCBfc2JhbmlzaGVkX2J5KCBpbnQga2V5LCBzdHJpbmcgbmFtZSApCit7CisgICAgcmV0dXJuIHNiYW5pc2hlZFtrZXksIDFdID09IG5hbWU7Cit9CisKKworbWl4ZWQgU2l0ZUJhbmlzaCggc3RyaW5nIGlwLCBpbnQgZGF5cyApCit7CisgICAgc3RyaW5nICpzLCB0bXAsIGV1aWQ7CisgICAgaW50IHQsIGxldmVsOworCisgICAgZXVpZCA9IGNhbGxfc2VmdW4oInNlY3VyZV9ldWlkIik7CisgICAgbGV2ZWwgPSBjYWxsX3NlZnVuKCJzZWN1cmVfbGV2ZWwiKTsKKworICAgIC8vIFVudGVyIEwyNiBnaWJ0J3MgZ2FyIG5peC4KKyAgICBpZiAoIGxldmVsIDw9IERPTUFJTk1FTUJFUl9MVkwgKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICAvLyBEaWUgTGlzdGUgZGVyIGdlc3BlcnJ0ZW4gSVBzIGFuc2NoYXVlbiBkYXJmIGplZGVyIGFiIEwyNi4KKyAgICBpZiAoICFpcCAmJiAhZGF5cyApCisgICAgICAgIHJldHVybiBjb3B5KHNiYW5pc2hlZCk7CisKKworICAgIGlmICggIXN0cmluZ3AoaXApIHx8ICFpbnRwKGRheXMpICkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAoIGRheXMgJiYgUXVlcnlTQmFuaXNoZWQoaXApICl7CisgICAgICAgIHdyaXRlKCAiRGllc2UgQWRyZXNzZSBpc3Qgc2Nob24gZ2ViYW5udC5cbiIgKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKCAhZGF5cyApIHsKKyAgICAgICAgaW50IGludF9pcCA9IElQdjRfYWRkcjJpbnQoaXApOworCisgICAgICAgIGlmKCBtZW1iZXIoc2JhbmlzaGVkLCBpbnRfaXApICl7CisgICAgICAgICAgICAvLyBGcmVtZGUgU2l0ZWJhbmlzaHMgZHVlcmZlbiBudXIgRGVwdXRpZXMgbG9lc2NoZW4uCisgICAgICAgICAgICBpZiAoIHNiYW5pc2hlZFtpbnRfaXAsIDFdICE9IGV1aWQgJiYgIUlzRGVwdXR5KGV1aWQpICkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisKKyAgICAgICAgICAgIGNhbGxfc2VmdW4oImxvZ19maWxlIiwgIkFSQ0gvU0JBTklTSCIsCisgICAgICAgICAgICAgICAgICAgIHNwcmludGYoICIlczogJXMgaGVidCBkaWUgU3BlcnJ1bmcgZGVyIEFkcmVzc2UgJXMgdm9uICVzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiYXVmLlxuIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0aW1lKHRpbWUoKSksIGNhcGl0YWxpemUoZXVpZCksIGlwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBpdGFsaXplKHNiYW5pc2hlZFtpbnRfaXAsIDFdKSApICk7CisKKyAgICAgICAgICAgIG1fZGVsZXRlKCBzYmFuaXNoZWQsIGludF9pcCApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLy8gQWxsZXMsIHdhcyBuaWNodCBEZXB1dHkgaXN0LCBkYXJmIG51ciBmdWVyIGVpbmVuIFRhZyBzYmFuaXNoZW4uCisgICAgICAgIGlmICggZGF5cyAhPSAxICYmICFJc0RlcHV0eShldWlkKSApCisgICAgICAgICAgICByZXR1cm4gLTE7CisKKyAgICAgICAgLy8gTnVyIERlcHV0aWVzIGR1ZXJmZW4gbWVociBhbHMgMTAgU3BlcnJ1bmdlbiB2b3JuZWhtZW4uCisgICAgICAgIGlmICggc2l6ZW9mKGZpbHRlcl9pbmRpY2VzKHNiYW5pc2hlZCwgIydfc2JhbmlzaGVkX2J5LCBldWlkKSkgPj0gMTAKKyAgICAgICAgICAgICAmJiAhSXNEZXB1dHkoZXVpZCkgKQorICAgICAgICAgICAgcmV0dXJuIC0yOworCisgICAgICAgIGludCBpbnRfaXAgPSBJUHY0X2FkZHIyaW50KGlwKTsKKworICAgICAgICBpZighaW50X2lwKSB7CisgICAgICAgICAgICB3cml0ZSggIlVuZ3VlbHRpZ2UgQWRyZXNzZSFcbiIgKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgLy8gTDI2IGR1ZXJmZW4gZXhha3QgZWluZSBJUCBzcGVycmVuLCBSTXMgZ2FuemUgQ2xhc3MgQy1TdWJuZXR6ZQorICAgICAgICAvLyB1bmQgRGVwdXRpZXMgYXVjaCBDbGFzcyBCLVN1Ym5ldHplLgorICAgICAgICBpbnQgbnNpemU9SVB2NF9uZXRfc2l6ZShpcCk7CisgICAgICAgIGlmICggbnNpemUgPiAxICYmIGxldmVsIDwgTE9SRF9MVkwKKyAgICAgICAgICAgICB8fCBuc2l6ZSA+IDI1NSAmJiAhSXNEZXB1dHkoZXVpZCkgKQorICAgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgIGlmICggIW1hcHBpbmdwKHNiYW5pc2hlZCkgKQorICAgICAgICAgICAgc2JhbmlzaGVkID0gbV9hbGxvY2F0ZSgxLCAyKTsKKworICAgICAgICBpZiAoIGRheXMgPCAwICkKKyAgICAgICAgICAgIHQgPSAtMTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdCA9ICh0aW1lKCkgLyA4NjQwMCkgKiA4NjQwMCArIGRheXMgKiA4NjQwMDsKKworICAgICAgICBtX2FkZChzYmFuaXNoZWQsIGludF9pcCwgdCwgZXVpZCk7CisKKyAgICAgICAgY2FsbF9zZWZ1bigibG9nX2ZpbGUiLCAiQVJDSC9TQkFOSVNIIiwKKyAgICAgICAgICAgICAgICBzcHJpbnRmKCAiJXM6ICVzIHNwZXJydCBkaWUgQWRyZXNzZSAlcyAlcy5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY3RpbWUodGltZSgpKSwgY2FwaXRhbGl6ZShldWlkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkYXlzID4gMCA/IChkYXlzID4gMSA/ICJmdWVyICIgKyBkYXlzICsgIiBUYWdlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogImZ1ZXIgZWluZW4gVGFnIikKKyAgICAgICAgICAgICAgICAgICAgICAgICA6ICJiaXMgenVtIFN0LiBOaW1tZXJsZWluc3RhZyIgKSApOworICAgIH0KKworICAgIFVwZGF0ZVNCYW5pc2goKTsKKyAgICByZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgQ2hlY2tEZXB1dHlSaWdodHMoKQoreworICAgIG9iamVjdCBvYjsKKyAgICBtaXhlZCAqZ2luZm87CisKKyAgICAvLyBMZXNlLSB1bmQgU2NocmVpYmJlcmVjaHRpZ3VuZ2VuIGZ1ZXIgZGllIFJ1YnJpayAncG9saXplaScgc2V0emVuCisgICAgY2FsbF9vdGhlciggIi9zZWN1cmUvbmV3cyIsICI/Pz8iICk7CisgICAgb2IgPSBmaW5kX29iamVjdCgic2VjdXJlL25ld3MiKTsKKyAgICBnaW5mbyA9ICgobWl4ZWQpb2ItPkdldEdyb3VwKCJwb2xpemVpIikpWzUuLjZdOworICAgIG9iLT5SZW1vdmVBbGxvd2VkKCAicG9saXplaSIsIDAsIGdpbmZvWzBdLCBnaW5mb1sxXSApOworICAgIG9iLT5BZGRBbGxvd2VkKCAicG9saXplaSIsIDAsIGRlcHV0aWVzLCBkZXB1dGllcyApOworICAgIExvYWREZXB1dHlGaWxlTGlzdCgpOworfQorCitpbnQgUmVsb2FkRGVwdXR5RmlsZSgpCit7CisgICAgZGVwdXRpZXMgPSBlZnVuOjpleHBsb2RlKCByZWFkX2ZpbGUoIi9zZWN1cmUvREVQVVRJRVMiKSB8fCAiIiwgIlxuIiApOworICAgIGRlcHV0aWVzIC09ICh7IiJ9KTsKKyAgICBkZXB1dGllcyA9IG1hcCggZGVwdXRpZXMsICMnbG93ZXJfY2FzZS8qJyovICk7CisgICAgY2FsbF9vdXQoICJDaGVja0RlcHV0eVJpZ2h0cyIsIDIgKTsKKyAgICByZXR1cm4oMSk7Cit9CisKKworc3RhdGljIGludCBjcmVhdGVfaG9tZShzdHJpbmcgb3duZXIsIGludCBsZXZlbCkKK3sKKyAgc3RyaW5nIGRlZl9jYXN0bGU7CisgIHN0cmluZyBkZXN0LCBjYXN0bGUsIHdpemFyZDsKKyAgb2JqZWN0IHBsYXllcjsKKyAgc3RyaW5nICpkb21haW5zOworICBpbnQgaTsKKworICBwbGF5ZXIgPSBjYWxsX3NlZnVuKCJmaW5kX3BsYXllciIsb3duZXIpOworICBpZiAoIXBsYXllcikKKyAgICByZXR1cm4gLTU7CisgIGRvbWFpbnM9Z2V0X2RvbWFpbl9ob21lcyhvd25lcik7CisgIGlmICghc2l6ZW9mKGRvbWFpbnMpICYmIGxldmVsID49IERPTUFJTk1FTUJFUl9MVkwpCisgIHsKKyAgICB0ZWxsX29iamVjdChwbGF5ZXIsIkR1IGdlaG9lcnN0IG5vY2gga2VpbmVyIFJlZ2lvbiBhbiAhXG4iKTsKKyAgICByZXR1cm4gLTY7CisgIH0KKyAgdGVsbF9vYmplY3QocGxheWVyLCJEdSBiaXN0IE1pdGFyYmVpdGVyIGRlciBmb2xnZW5kZW4gUmVnaW9uZW46XG4iKTsKKyAgZm9yIChpPTA7aTxzaXplb2YoZG9tYWlucyk7aSsrKQorICB7CisgICAgaWYgKGkpIHRlbGxfb2JqZWN0KHBsYXllciwiLCAiKTsKKyAgICB0ZWxsX29iamVjdChwbGF5ZXIsZG9tYWluc1tpXSk7CisgIH0KKyAgdGVsbF9vYmplY3QocGxheWVyLCIuXG4iKTsKKyAgdXBkYXRlX3dpel9sZXZlbChvd25lciwgbGV2ZWwpOworICB3aXphcmQgPSAiL3BsYXllcnMvIiArIG93bmVyOworICBjYXN0bGUgPSAiL3BsYXllcnMvIiArIG93bmVyICsgIi93b3Jrcm9vbS5jIjsKKyAgaWYgKGZpbGVfc2l6ZSh3aXphcmQpID09IC0xKSB7CisgICAgdGVsbF9vYmplY3QocGxheWVyLCAiVmVyemVpY2huaXMgIiArIHdpemFyZCArICIgYW5nZWxlZ3RcbiIpOworICAgIG1rZGlyKHdpemFyZCk7CisgIH0KKyAgZGVzdCA9IG9iamVjdF9uYW1lKGVudmlyb25tZW50KHBsYXllcikpOworICBkZWZfY2FzdGxlID0gcmVhZF9maWxlKCIvc3RkL2RlZl93b3Jrcm9vbS5jIik7CisgIGlmIChmaWxlX3NpemUoY2FzdGxlKSA+IDApIHsKKyAgICB0ZWxsX29iamVjdChwbGF5ZXIsICJEdSBIQVRURVNUIGphIHNjaG9uIGVpbiBBcmJlaXRzemltbWVyICFcbiIpOworICB9IGVsc2UgeworICAgIGlmICh3cml0ZV9maWxlKGNhc3RsZSwgZGVmX2Nhc3RsZSkpCisgICAgeworICAgICAgdGVsbF9vYmplY3QocGxheWVyLCAiQXJiZWl0c3ppbW1lciAiICsgY2FzdGxlICsgIiBlcnpldWd0LlxuIik7CisgICAgICAvLyBBcmJlaXRzemltbWVyIGFscyBIb21lIHNldHplbgorICAgICAgcGxheWVyLT5TZXRQcm9wKFBfU1RBUlRfSE9NRSxjYXN0bGVbMC4uPDNdKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgdGVsbF9vYmplY3QocGxheWVyLCAiQXJiZWl0c3ppbW1lciBrb25udGUgbmljaHQgZXJ6ZXVndCB3ZXJkZW4gIVxuIik7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKKy8vIFNlbmRldCBkZW0gYmVmb2VyZGVydGVuIE1hZ2llciBlaW5lIEhpbGZlbWFpbCB6dS4KK3Byb3RlY3RlZCB2b2lkIFNlbmRXaXphcmRIZWxwTWFpbChzdHJpbmcgbmFtZSwgaW50IGxldmVsKSB7CisgIAorICBvYmplY3QgcGw9Y2FsbF9zZWZ1bigiZmluZF9wbGF5ZXIiLG5hbWUpOworICBpZiAoIW9iamVjdHAocGwpKSByZXR1cm47CisKKyAgc3RyaW5nIGZpbGU9c3ByaW50ZigiJXNpbmZvX21sJWQiLCBXSVpfSEVMUF9NQUlMX0RJUiwgbGV2ZWwpOworICAvLyB3ZW5uIGtlaW4gSGlsZmV0ZXh0IGZ1ZXIgZGVuIExldmVsIGRhIGlzdDogcmF1cworICBpZiAoZmlsZV9zaXplKGZpbGUpIDw9IDApCisgICAgcmV0dXJuOworCisgIHN0cmluZyBzdWJqZWN0ID0gcmVhZF9maWxlKGZpbGUsMSwxKTsKKyAgc3RyaW5nIHRleHQgPSBjYWxsX3NlZnVuKCJyZXBsYWNlX3BlcnNvbmFsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZWFkX2ZpbGUoZmlsZSwyKSwgKHtwbH0pKTsKKworICBtaXhlZCBtYWlsID0gKHsiTWVybGluIiwgIjxNYXN0ZXI+IiwgbmFtZSwgMCwgMCwgc3ViamVjdCwKKyAgICAgICAgICAgICAgICAgY2FsbF9zZWZ1bigiZHRpbWUiLHRpbWUoKSksCisgICAgICAgICAgICAgICAgIE1VRE5BTUUrdGltZSgpLCB0ZXh0IH0pOworICBNQUlMREVNT04tPkRlbGl2ZXJNYWlsKG1haWwsIDApOworfQorCitpbnQgYWxsb3dlZF9hZHZhbmNlX3dpemxldmVsKG1peGVkIG9iKQoreworICBzdHJpbmcgd2hhdDsKKworICBpZiAob2JqZWN0cChvYikgJiYgZ2V0ZXVpZChvYik9PVJPT1RJRCkgcmV0dXJuIDE7CisKKyAgaWYgKCFzdHJpbmdwKG9iKSkKKyAgICB3aGF0PWVmdW46OmV4cGxvZGUob2JqZWN0X25hbWUob2IpLCIjIilbMF07CisgIGVsc2UKKyAgICB3aGF0PW9iOworCisgIGlmICh3aGF0PT0iL3NlY3VyZS9tZXJsaW4iKSByZXR1cm4gMTsKKworICByZXR1cm4gMDsKK30KKworaW50IGFkdmFuY2Vfd2l6bGV2ZWwoc3RyaW5nIG5hbWUsIGludCBsZXZlbCkKK3sKKyAgaW50IGFuc3dlcjsKKyAgbWl4ZWQgKnVzZXI7CisKKyAgaWYgKCFhbGxvd2VkX2FkdmFuY2Vfd2l6bGV2ZWwoUE8pKQorICAgIHJldHVybiAtMTsKKworICBpZiAobGV2ZWw+ODApIHJldHVybiAtMjsKKworICBpZiAoIWZpbmRfdXNlcmluZm8obmFtZSkpIHJldHVybiAtMzsKKworICB1c2VyPWdldF9mdWxsX3VzZXJpbmZvKG5hbWUpOworCisgIGlmICh1c2VyW1VTRVJfTEVWRUwrMV0+bGV2ZWwpIHJldHVybiAtNDsKKworICBpZiAodXNlcltVU0VSX0xFVkVMKzFdPT1sZXZlbCkgcmV0dXJuIDE7CisKKyAgaWYgKGxldmVsPj0xMCAmJiBsZXZlbDwyMCkKKyAgeworICAgIHVwZGF0ZV93aXpfbGV2ZWwobmFtZSwgbGV2ZWwpOworICAgIFNlbmRXaXphcmRIZWxwTWFpbChuYW1lLCBsZXZlbCk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgaWYgKGxldmVsPj0yMCAmJiB1c2VyW1VTRVJfTEVWRUwrMV08MjEpCisgIHsKKyAgICBhbnN3ZXIgPSBjcmVhdGVfaG9tZShuYW1lLCBsZXZlbCk7CisgICAgaWYgKCBhbnN3ZXIgPiAwICkgeworICAgICAgYW5zd2VyID0gdXBkYXRlX3dpel9sZXZlbChuYW1lLCBsZXZlbCk7CisgICAgICBTZW5kV2l6YXJkSGVscE1haWwobmFtZSwgbGV2ZWwpOworICAgIH0KKyAgICByZXR1cm4gYW5zd2VyOworICB9CisKKyAgdXBkYXRlX3dpel9sZXZlbChuYW1lLCBsZXZlbCk7CisgIFNlbmRXaXphcmRIZWxwTWFpbChuYW1lLCBsZXZlbCk7CisKKyAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgcmVzdGFydF9oZWFydF9iZWF0KG9iamVjdCBoZWFydF9iZWF0KQoreworICBpZiAoaGVhcnRfYmVhdCkgaGVhcnRfYmVhdC0+X3Jlc3RhcnRfYmVhdCgpOworfQorCitpbnQgcmVuZXdfcGxheWVyX29iamVjdChtaXhlZCB3aG8pCit7CisgIG9iamVjdCBuZXdvYjsKKyAgb2JqZWN0ICpvYnMsICpvYnMyOworICBtaXhlZCBlcnI7CisgIHN0cmluZyBvYl9uYW1lOworICBvYmplY3QgKmFybW91cnMsIHdlYXBvbjsKKyAgb2JqZWN0IHRwOworICBpbnQgaSxhY3RpdmUsajsKKworICBpZiAoc3RyaW5ncCh3aG8pKQorICB7CisgICAgd2hvPWNhbGxfc2VmdW4oImZpbmRfcGxheWVyIix3aG8pOworICAgIGlmICghd2hvKQorICAgIHsKKyAgICAgIHdobz1jYWxsX3NlZnVuKCJmaW5kX25ldGRlYWQiLHdobyk7CisgICAgICBpZiAoIXdobykKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgfQorICBpZiAoIW9iamVjdHAod2hvKSkKKyAgICByZXR1cm4gLTI7CisgIGlmICghb2JqZWN0X2luZm8od2hvLCBPSV9PTkNFX0lOVEVSQUNUSVZFKSkKKyAgICByZXR1cm4gLTM7CisgIGlmICh3aG8tPlF1ZXJ5R3Vlc3QoKSkKKyAgeworICAgIHByaW50ZigiQ2FuJ3QgcmVuZXcgZ3Vlc3RzIVxuIik7CisgICAgcmV0dXJuIC02OworICB9CisgIGFjdGl2ZT1pbnRlcmFjdGl2ZSh3aG8pOworICBwcmludGYoIk9LLCByZW5ld2luZyAlT1xuIix3aG8pOworICBzZXRldWlkKGdldGV1aWQod2hvKSk7CisgIGVycj1jYXRjaChuZXdvYj1jbG9uZV9vYmplY3QocXVlcnlfcGxheWVyX29iamVjdChnZXR1aWQod2hvKSkpOyBwdWJsaXNoKTsKKyAgc2V0ZXVpZChnZXR1aWQoVE8pKTsKKyAgaWYgKGVycikKKyAgeworICAgIHByaW50ZigiJU9cbiIsZXJyKTsKKyAgICByZXR1cm4gLTQ7CisgIH0KKyAgaWYgKCFuZXdvYikKKyAgICByZXR1cm4gLTU7CisgIC8qIE9rLCB0aGUgb2JqZWN0IGlzIGhlcmUgbm93IC4uLiBsZXRzIGdvIGZvciBpdCAuLi4gKi8KKyAgd2hvLT5zYXZlX21lKDApOworICAvKiBTU0wgaXAgd2VpdGVycmVpY2hlbiAqLworICBpZiggY2FsbF9zZWZ1bigicXVlcnlfaXBfbnVtYmVyIiwgd2hvKSAhPSBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKHdobyxJSV9JUF9OVU1CRVIpICkKKyAgeworICAgIG5ld29iLT5zZXRfcmVhbGlwKCBjYWxsX3NlZnVuKCJxdWVyeV9pcF9udW1iZXIiLHdobykgKTsKKyAgfQorICBlZnVuOjpjb25maWd1cmVfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpLCBPQ19DT01NQU5EU19FTkFCTEVELCAwKTsKKyAgZWZ1bjo6c2V0X3RoaXNfcGxheWVyKDApOworICBhcm1vdXJzPShvYmplY3QgKil3aG8tPlF1ZXJ5UHJvcChQX0FSTU9VUlMpOworICB3ZWFwb249KG9iamVjdCl3aG8tPlF1ZXJ5UHJvcChQX1dFQVBPTik7CisKKyAgaWYgKCBwcmV2aW91c19vYmplY3QoKSAmJiBvYmplY3RfbmFtZShwcmV2aW91c19vYmplY3QoKSkgPT0gIi9zZWN1cmUvbWVybGluIiApCisgICAgICBzZW5kX2NoYW5uZWxfbXNnKCJEZWJ1ZyIsCisgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzX29iamVjdCgpLAorICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCJSRU5FV0lORzogJU8gJU9cbiIsbmV3b2Isd2hvKSk7CisgIGVsc2UKKyAgICAgIHNlbmRfY2hhbm5lbF9tc2coIkVudHdpY2tsdW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNfb2JqZWN0KCksCisgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoIlJFTkVXSU5HOiAlTyAlT1xuIixuZXdvYix3aG8pKTsKKworICBvYl9uYW1lPWV4cGxvZGUob2JqZWN0X25hbWUobmV3b2IpLCIjIilbMF07CisgIGlmIChzaXplb2Yob2JfbmFtZSk+MTEgJiYgb2JfbmFtZVswLi4xMV09PSIvc3RkL3NoZWxscy8iKQorICAgIG9iX25hbWU9b2JfbmFtZVsxMS4uXTsKKyAgb2JfbmFtZT1vYl9uYW1lKyI6IitnZXR1aWQoKG9iamVjdCl3aG8pOworICBpZiAoYWN0aXZlKQorICAgIGV4ZWMobmV3b2Isd2hvKTsKKyAgaWYgKGFjdGl2ZSAmJiAoaW50ZXJhY3RpdmUod2hvKXx8IWludGVyYWN0aXZlKG5ld29iKSkpCisgIHsKKyAgICBzZW5kX2NoYW5uZWxfbXNnKCJEZWJ1ZyIscHJldmlvdXNfb2JqZWN0KCksCisgICAgICAgICAgICAgICAgICAgICAiRVJST1I6IHN0aWxsIGFjdGl2ZSAhXG4iKTsKKyAgICBuZXdvYi0+cmVtb3ZlKCk7CisgICAgcmV0dXJuIDA7CisgIH0KKy8vICAgbmV3b2ItPnN0YXJ0X3BsYXllcihjYXBpdGFsaXplKGdldHVpZCh3aG8pKSx3aG8tPl9xdWVyeV9teV9pcCgpKTsKKyAgZnVuY2FsbCgKKyAgICAgICAgICBiaW5kX2xhbWJkYSgKKyAgICAgICAgICAgICAgICAgICAgICB1bmJvdW5kX2xhbWJkYSggKHsneCwgJ3l9KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHsjJ2NhbGxfb3RoZXIvKicqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld29iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN0YXJ0X3BsYXllciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneCwgJ3kKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksIHdobworICAgICAgICAgICAgICAgICAgICAgICksCisgICAgICAgICAgY2FwaXRhbGl6ZShnZXR1aWQod2hvKSksIHdoby0+X3F1ZXJ5X215X2lwKCkgKTsKKworICBuZXdvYi0+bW92ZShlbnZpcm9ubWVudCh3aG8pLE1fVFBPUlR8TV9OT0NIRUNLfE1fTk9fU0hPV3xNX1NJTEVOVAorICAgICAgICAgICAgICB8TV9OT19BVFRBQ0spOworICBvYnM9YWxsX2ludmVudG9yeSh3aG8pOworICBmb3JlYWNoKG9iamVjdCB0b2I6IGFsbF9pbnZlbnRvcnkod2hvKSkgeworICAgIGlmICghdG9iLT5RdWVyeVByb3AoUF9BVVRPTE9BRE9CSikpCisgICAgeworICAgICAgLy8ga2VpbiBBdXRvbG9hZGVyLi4uCisgICAgICBmb3JlYWNoKG9iamVjdCBvYjogZGVlcF9pbnZlbnRvcnkodG9iKSkKKyAgICAgIHsKKyAgICAgICAgLy8gYWJlciBlbnRoYWx0ZW5lIEF1dG9sb2FkZXIgZW50c29yZ2VuLi4uCisgICAgICAgIGlmIChvYi0+UXVlcnlQcm9wKFBfQVVUT0xPQURPQkopKQorICAgICAgICB7CisgICAgICAgICAgY2F0Y2gob2ItPnJlbW92ZSgpO3B1Ymxpc2gpOworICAgICAgICAgIGlmIChvYikgZGVzdHJ1Y3Qob2IpOworICAgICAgICB9CisgICAgICB9CisgICAgICAvLyBvYmpla3Qgb2huZSBkaWUgQUwgYmV3ZWdlbi4KKyAgICAgIGNhdGNoKHRvYi0+bW92ZShuZXdvYixNX05PQ0hFQ0spO3B1Ymxpc2gpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIC8vIEluaGFsdCB2b24gQXV0b2xvYWRlcm4gcmV0dGVuLgorICAgICAgLy8gbmV1ZSBpbnN0YW56IGRlcyBBTHMgaW0gbmV1ZW4gT2JqZWt0LgorICAgICAgb2JqZWN0IG5ld19hbF9pbnN0YW5jZSA9IHByZXNlbnRfY2xvbmUodG9iLCBuZXdvYik7CisgICAgICBmb3JlYWNoKG9iamVjdCBvYjogZGVlcF9pbnZlbnRvcnkodG9iKSkgeworICAgICAgICBpZiAob2ItPlF1ZXJ5UHJvcChQX0FVVE9MT0FET0JKKSkgeworICAgICAgICAgICAgLy8gYXV0b2xvYWRlciBpbiBBdXRvbG9hZGVybiB6ZXJzdG9lcmVuLi4uCisgICAgICAgICAgICBjYXRjaChvYi0+cmVtb3ZlKDEpO3B1Ymxpc2gpOworICAgICAgICAgICAgaWYgKG9iKSBkZXN0cnVjdChvYik7CisgICAgICAgIH0KKyAgICAgICAgLy8gYWxsZSBuaWNodCBhdXRvbG9hZGVyIGluIGRpZSBBTC1JbnN0YW56IGltIG5ldWVuIE9iamVrdCBvZGVyCisgICAgICAgIC8vIG5vdGZhbGxzIGlucyBJbnYuCisgICAgICAgIGVsc2UgeworICAgICAgICAgIGlmIChvYmplY3RwKG5ld19hbF9pbnN0YW5jZSkpCisgICAgICAgICAgICBjYXRjaChvYi0+bW92ZShuZXdfYWxfaW5zdGFuY2UsIE1fTk9DSEVDSyk7cHVibGlzaCk7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgY2F0Y2gob2ItPm1vdmUobmV3b2IsIE1fTk9DSEVDSyk7cHVibGlzaCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8vIEF1dG9sb2FkZXIgemVyc3RvZXJlbi4gV2lyZCBuaWNodCB2b20gU3BpZWxlcm9iamVrdCBpbSByZW1vdmUoKQorICAgICAgLy8gZ2VtYWNodCwgd2VubiBuaWNodCBOT0RST1AuCisgICAgICBjYXRjaCh0b2ItPnJlbW92ZSgxKTtwdWJsaXNoKTsKKyAgICAgIGlmICh0b2IpIGRlc3RydWN0KHRvYik7CisgICAgfQorICB9CisgIHdoby0+cmVtb3ZlKCk7CisgIGlmICggb2JqZWN0cCh3aG8pICkKKyAgICAgIGRlc3RydWN0KHdobyk7CisgIHJlbmFtZV9vYmplY3QobmV3b2Isb2JfbmFtZSk7CisgIG5ld29iLT5fX3JlbG9hZF9leHBsb3JlKCk7CisgIHRwPXRoaXNfcGxheWVyKCk7CisgIGVmdW46OnNldF90aGlzX3BsYXllcihuZXdvYik7CisgIGlmIChvYmplY3RwKHdlYXBvbikpCisgICAgd2VhcG9uLT5Eb1dpZWxkKCk7CisgIGlmIChwb2ludGVycChhcm1vdXJzKSkKKyAgICBmb3IgKGk9c2l6ZW9mKGFybW91cnMpLTE7aT49MDtpLS0pCisgICAgICBpZiAob2JqZWN0cChhcm1vdXJzW2ldKSkKKyAgICAgICAgYXJtb3Vyc1tpXS0+ZG9fd2VhcigiYWxsZXMiKTsKKyAgZWZ1bjo6c2V0X3RoaXNfcGxheWVyKHRwKTsKKyAgLy9SdWVja2dhYmV3ZXJ0IG5vZXRpZywgd2VpbCBGdW5rdGlvbiB2b20gVHlwICdpbnQnCisgIHJldHVybigxKTsKK30KKworbWl4ZWQgX19xdWVyeV92YXJpYWJsZShvYmplY3Qgb2IsIHN0cmluZyB2YXIpCit7CisgIGlmICghUE8gfHwgIUlTX0FSQ0goZ2V0ZXVpZChQTykpIHx8ICF0aGlzX2ludGVyYWN0aXZlKCkgfHwKKyAgICAgICFJU19BUkNIKHRoaXNfaW50ZXJhY3RpdmUoKSkgfHwgZ2V0dWlkKG9iKT09Uk9PVElEICkKKyAgeworICAgIHdyaXRlKCJEdSBiaXN0IGtlaW4gRU0gb2RlciBHb3R0IVxuIik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9PTkNFX0lOVEVSQUNUSVZFKSAmJiAoUE8hPW9iKSAmJgorICAgICAodmFyPT0iaGlzdG9yeSIgfHwgdmFyPT0iaGlzdDIiKSkKKyAgICAgc2VuZF9jaGFubmVsX21zZygiU25vb3AiLCBwcmV2aW91c19vYmplY3QoKSwKKyAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCIlcyAtPiAlcyAoaGlzdG9yeSkuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUoZ2V0dWlkKFBPKSksY2FwaXRhbGl6ZShnZXR1aWQob2IpKSkpOworCisgIGNhbGxfc2VmdW4oImxvZ19maWxlIiwgIkFSQ0gvUVYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCIlczogJU8gaW5xdWlyZXMgdmFyICVzIGluICVPXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0aW1lKHRpbWUoKSksdGhpc19pbnRlcmFjdGl2ZSgpLHZhcixvYikgKTsKKyAgbWl4ZWQgcmVzID0gdmFyaWFibGVfbGlzdChvYiwgUkVUVVJOX0ZVTkNUSU9OX05BTUV8UkVUVVJOX0ZVTkNUSU9OX0ZMQUdTfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRVRVUk5fRlVOQ1RJT05fVFlQRXxSRVRVUk5fVkFSSUFCTEVfVkFMVUUpOworICBpbnQgaW5kZXggPSBtZW1iZXIocmVzLHZhcik7CisgIGlmIChpbmRleCA+IC0xKQorICB7CisgICAgcmV0dXJuICh7cmVzW2luZGV4XSxyZXNbaW5kZXgrMV0scmVzW2luZGV4KzJdLHJlc1tpbmRleCszXX0pOworICB9CisgIHJldHVybiAwOworfQorCit2b2lkIFJlc3RhcnRCZWF0cygpCit7CisgIGludCBpLHNpemUsY291bnRlcjsKKyAgb2JqZWN0IG9iOworICBtaXhlZCAqbGlzdDsKKyAgc3RyaW5nIGZpbGUsb2JuYW1lLGZ1bjsKKworICAiL3NlY3VyZS9zaW11bF9lZnVuIi0+U3RvcENhbGxPdXQoMCk7CisgIHdyaXRlKCJDQUxMX09VVC1SZXN0YXJ0IGluIHByb2dyZXNzICFcbiIpOworICBmaWx0ZXIodXNlcnMoKSwjJ3RlbGxfb2JqZWN0LCJDQUxMX09VVC1SZXN0YXJ0IGluIHByb2dyZXNzICFcbiIpOworICBzaXplPWZpbGVfc2l6ZSgibG9nL2NhbGxfb3V0X3N0b3AiKTsKKyAgaWYgKHNpemU8PTApCisgICAgcmV0dXJuOworICBmaWxlPSIiOworICBjb3VudGVyPTA7CisgIHdoaWxlIChjb3VudGVyPHNpemUpCisgIHsKKyAgICBmaWxlKz1yZWFkX2J5dGVzKCJsb2cvY2FsbF9vdXRfc3RvcCIsY291bnRlciwKKyAgICAgICAgICAgICAgICAgICAgIChzaXplLShjb3VudGVyKz00MDAwMCk+MD9jb3VudGVyOnNpemUpKTsKKyAgfQorICBsaXN0PWV4cGxvZGUoZmlsZSwiX18oQ1VUIEhFUkUpX19cbiIpOworICBsaXN0PWxpc3RbPDEuLl07CisgIGxpc3Q9ZXhwbG9kZShsaXN0WzBdLCJcbiIpLSh7IiJ9KTsKKyAgZm9yIChpPXNpemVvZihsaXN0KS0xO2k+PTA7aS0tKQorICAgIGlmIChzc2NhbmYobGlzdFtpXSwiJXMgXCIlc1wiIixvYm5hbWUsZnVuKT09MiAmJiBvYj1maW5kX29iamVjdChvYm5hbWUpKQorICAgIHsKKyAgICAgIHdyaXRlKHNwcmludGYoIiVPIC0+ICVzXG4iLG9iLGZ1bikpOworICAgICAgY2F0Y2gob2ItPl9fcmVzdGFydChmdW4pO3B1Ymxpc2gpOworICAgIH0KKyAgd3JpdGUoIkNBTExfT1VULVJlc3RhcnQgY29tcGxldGVkICFcbiIpOworICBmaWx0ZXIodXNlcnMoKSwjJ3RlbGxfb2JqZWN0LCJDQUxMX09VVC1SZXN0YXJ0IGNvbXBsZXRlZCAhXG4iKTsKKyAgcmVuYW1lKCJsb2cvY2FsbF9vdXRfc3RvcCIsImxvZy9jYWxsX291dF9zdG9wLm9sZCIpOworfQorCmRpZmYgLS1naXQgYS9zZWN1cmUvbWFzdGVyL25ldHdvcmsuYyBiL3NlY3VyZS9tYXN0ZXIvbmV0d29yay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2ODFmODIKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvbWFzdGVyL25ldHdvcmsuYwpAQCAtMCwwICsxLDQzMSBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIG1hc3Rlci9uZXR3b3JrLmMgLSBVRFAtSGFuZGxpbmcKKy8vCisvLyAkSWQ6IG5ldHdvcmsuYyA4OTM0IDIwMTQtMDktMTAgMjE6NTc6MTJaIFplc3N0cmEgJAorCisjcHJhZ21hIHN0cmljdF90eXBlcworCisjaW5jbHVkZSAiL3NlY3VyZS9tYXN0ZXIuaCIKKyNkZWZpbmUgQkJNQVNURVIgIi9zZWN1cmUvYmJtYXN0ZXIiCisKKy8qCisjdW5kZWYgREVCVUcKKyNkZWZpbmUgREVCVUcoeCkgaWYgKGNhbGxfc2VmdW4oImZpbmRfcGxheWVyIiwiemVzc3RyYSIpKSBcCisgICAgICAgICAgICAgICAgIHRlbGxfb2JqZWN0KGNhbGxfc2VmdW4oImZpbmRfcGxheWVyIiwiemVzc3RyYSIpLHgpOworKi8KKworLy9pY2ggd2lsbCBoaWVyYXVzIG1vbWVudGFuIGtlaW4gRGVidWcsIGlzdCB6dXZpZWwuIFplc3N0cmEKKworI2lmZGVmIERFQlVHCisjdW5kZWYgREVCVUcKKyNlbmRpZgorI2RlZmluZSBERUJVRyh4KQorCitub3NhdmUgaW50IG1haWxzX2xhc3RfaG91cjsKKworc3RhdGljIHN0cmluZyBtYWlsX25vcm1hbGl6ZSggc3RyaW5nIHN0ciApCit7CisgICAgc3RyID0gcmVncmVwbGFjZSggc3RyLCAiW148XSo8KC4qKT5bXj5dKiIsICJcXDEiLCAwKTsKKyAgICByZXR1cm4gcmVncmVwbGFjZSggc3RyLCAiICooW14gXVteIF0qKS4qIiwgIlxcMSIsIDApOworfQorCisKK3N0YXRpYyBzdHJpbmcgKm1rX3JlY19saXN0KCBzdHJpbmcgc3RyICkKK3sKKyAgICByZXR1cm4gbWFwKCBleHBsb2RlKCBsb3dlcl9jYXNlKHN0ciksICIsIiApIC0gKHsiIn0pLAorICAgICAgICAgICAgICAgICAgICAgICJtYWlsX25vcm1hbGl6ZSIsIHRoaXNfb2JqZWN0KCkgKTsKK30KKworCitzdGF0aWMgaW50IENoZWNrUGFzc3dkKCBzdHJpbmcgbmFtZSwgc3RyaW5nIHBhc3N3ZCApIHsKKyAgICBtaXhlZCAqdWluZjsKKworICAgIGlmICghc3RyaW5ncChwYXNzd2QpIHx8ICFzaXplb2YocGFzc3dkKSkKKyByZXR1cm4gMDsKKyAgICBpZiAoIHNpemVvZih1aW5mID0gZ2V0X2Z1bGxfdXNlcmluZm8obmFtZSkpIDwgMiApCisgICAgICAgIHJldHVybiAwOworCisgICAgc3RyaW5nIHB3aGFzaCA9IHVpbmZbVVNFUl9QQVNTV09SRCsxXTsKKyAgICBpZiAoc2l6ZW9mKHB3aGFzaCkgPiAxMykgeworIC8vIE1ENS1IYXNoCisgcGFzc3dkID0gbWQ1X2NyeXB0KHBhc3N3ZCwgcHdoYXNoKTsKKyAgICB9CisgICAgZWxzZSBpZiAoc2l6ZW9mKHB3aGFzaCkgPiAyKSB7CisgLy8gQ3J5cHQtSGFzaAorIHBhc3N3ZCA9IGNyeXB0KHBhc3N3ZCwgcHdoYXNoWzAuLjFdKTsKKyAgICB9CisgICAgZWxzZSByZXR1cm4gMDsKKworICAgIHJldHVybiAocGFzc3dkID09IHB3aGFzaCk7Cit9CisKKworc3RhdGljIHZvaWQgRnRwQWNjZXNzKCBzdHJpbmcgaG9zdCwgc3RyaW5nIG1lc3NhZ2UsIGludCBwb3J0ICkKK3sKKyAgICBzdHJpbmcgKmNvbXAsIHJlcGx5LCBoZWFkOworI2lmIF9fRUZVTl9ERUZJTkVEX18oc2VuZF91ZHApCisgICAgY29tcCA9IGVmdW46OmV4cGxvZGUoIG1lc3NhZ2UsICJcdCIgKTsKKyNkZWZpbmUgRlRQX0lEICAgMAorI2RlZmluZSBGVFBfU0VRICAxCisjZGVmaW5lIEZUUF9UQUcgIDIKKyNkZWZpbmUgRlRQX0NNRCAgMworI2RlZmluZSBGVFBfQVJHMSA0CisjZGVmaW5lIEZUUF9BUkcyIDUKKyNkZWZpbmUgRlRQX0FSRzMgNgorCisgIGlmICggc2l6ZW9mKGNvbXApIDw9IEZUUF9DTUQgfHwgbG93ZXJfY2FzZShjb21wW0ZUUF9UQUddKSAhPSAicmVxIiApeworICAgICAgbG9nX2ZpbGUoICJJTVBfTVNHUyIsICJIb3N0OiAiICsgaG9zdCArICI6IiArIHBvcnQgKyAiIC0gJyIgKworICAgICAgICAgICAgICAgIG1lc3NhZ2UgKyAiJ1xuIiApOworICAgICAgcmV0dXJuOworICB9CisKKyAgcmVwbHkgPSAiSU5WQUxJRCI7CisKKyAgaGVhZCA9IHNwcmludGYoICIlc1x0JXNcdFJQTFlcdCVzXHQiLAorICAgICAgICAgICAgICAgICAgY29tcFtGVFBfSURdLCBjb21wW0ZUUF9TRVFdLCBjb21wW0ZUUF9DTURdICk7CisKKyAgc3dpdGNoICggbG93ZXJfY2FzZShjb21wW0ZUUF9DTURdKSApeworICBjYXNlICJ1c2VyIjoKKyAgICAgIGlmICggc2l6ZW9mKGNvbXApIDw9IEZUUF9BUkcxICkKKyAgICAgICAgICBicmVhazsKKworICAgICAgaWYgKCBJU19MRUFSTkVSKGxvd2VyX2Nhc2UoY29tcFtGVFBfQVJHMV0pKSApCisgICAgICAgICAgcmVwbHkgPSAiL3BsYXllcnMvIiArIGxvd2VyX2Nhc2UoY29tcFtGVFBfQVJHMV0pOworICAgICAgZWxzZQorICAgICAgICAgIHJlcGx5ID0gIk5PTkUiOworICAgICAgYnJlYWs7CisKKyAgY2FzZSAicGFzcyI6CisgICAgICBpZiAoIHNpemVvZihjb21wKSA8PSBGVFBfQVJHMiApCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgIGNvbXBbRlRQX0FSRzFdID0gbG93ZXJfY2FzZShjb21wW0ZUUF9BUkcxXSk7CisKKyAgICAgIGlmICggSVNfTEVBUk5FUihjb21wW0ZUUF9BUkcxXSkgJiYKKyAgICAgICAgICAgISIvc2VjdXJlL21hc3RlciItPlF1ZXJ5VEJhbmlzaGVkKGNvbXBbRlRQX0FSRzFdKSApeworICAgICAgICAgIGlmICggQ2hlY2tQYXNzd2QoIGNvbXBbRlRQX0FSRzFdLCBjb21wW0ZUUF9BUkcyXSApICkKKyAgICAgICAgICAgICAgcmVwbHkgPSAiT0siOworICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICBpZiAoIGdldF93aXpfbGV2ZWwoIGNvbXBbRlRQX0FSRzFdICkgPCBBUkNIX0xWTCApCisgICAgICAgICAgICAgICAgICBsb2dfZmlsZSggIkxPR0lORkFJTCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZiggIlBBU1NXT1JEOiAgICAgIChGVFApICAgICAlcyAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wW0ZUUF9BUkcxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdGltZSh0aW1lKCkpICkgKTsKKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgbG9nX2ZpbGUoICJBUkNIL0xPR0lORkFJTCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZiggIlBBU1NXT1JEOiAgICAgIChGVFApICAgICAlcyAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wW0ZUUF9BUkcxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdGltZSh0aW1lKCkpICkgKTsKKyAgICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgICAgcmVwbHkgPSAiRkFJTCI7CisgICAgICBicmVhazsKKworICBjYXNlICJyZWFkIjoKK0RFQlVHKCItRnRwQWNjZXNzLS0tLVxuSG9zdDoiK2hvc3QrIk1lc3NhZ2U6XG4iK21lc3NhZ2UrIlxuLS0tLS0tLS0tLS0tLS1cbiIpOworICAgICAgaWYgKCBzaXplb2YoY29tcCkgPD0gRlRQX0FSRzIgKQorICAgICAgICAgIGJyZWFrOworCisgICAgICBpZiAoIGNvbXBbRlRQX0FSRzJdWzBdID09ICcvJyAmJgorICAgICAgICAgICB2YWxpZF9yZWFkKCBjb21wW0ZUUF9BUkcyXSwgbG93ZXJfY2FzZShjb21wW0ZUUF9BUkcxXSksCisgICAgICAgICAgICAgICAgICAgICAgICJyZWFkX2ZpbGUiLCAwICkgKXsKKworICAgICAgICAgIEJCTUFTVEVSLT5mdHBiYiggbG93ZXJfY2FzZShjb21wW0ZUUF9BUkcxXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVhZCAiICsgY29tcFtGVFBfQVJHMl0gKyAiXG4iICk7CisgICAgICAgICAgcmVwbHkgPSAiT0siOworICAgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgICByZXBseSA9ICJGQUlMIjsKKyAgICAgIGJyZWFrOworCisgIGNhc2UgIndyaXQiOgorREVCVUcoIi1GdHBBY2Nlc3MtLS0tXG5Ib3N0OiIraG9zdCsiTWVzc2FnZTpcbiIrbWVzc2FnZSsiXG4tLS0tLS0tLS0tLS0tLVxuIik7CisgICAgICBpZiAoIHNpemVvZihjb21wKSA8PSBGVFBfQVJHMiApCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgIGlmICggY29tcFtGVFBfQVJHMl1bMF0gPT0gJy8nICYmCisgICAgICAgICAgIHZhbGlkX3dyaXRlKCBjb21wW0ZUUF9BUkcyXSwgbG93ZXJfY2FzZShjb21wW0ZUUF9BUkcxXSksCisgICAgICAgICAgICAgICAgICAgICAgICJ3cml0ZV9maWxlIiwgMCApICl7CisKKyAgICAgICAgICBCQk1BU1RFUi0+ZnRwYmIoIGxvd2VyX2Nhc2UoY29tcFtGVFBfQVJHMV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIndyaXRlICIgKyBjb21wW0ZUUF9BUkcyXSArICJcbiIgKTsKKyAgICAgICAgICByZXBseSA9ICJPSyI7CisgICAgICAgICAgfQorICAgICAgIGVsc2UKKyAgICAgICAgICByZXBseSA9ICJGQUlMIjsKKyAgICAgIGJyZWFrOworCisgIGNhc2UgImxpc3QiOgorREVCVUcoIi1GdHBBY2Nlc3MtLS0tXG5Ib3N0OiIraG9zdCsiTWVzc2FnZTpcbiIrbWVzc2FnZSsiXG4tLS0tLS0tLS0tLS0tLVxuIik7CisgICAgICBpZiAoIHNpemVvZihjb21wKSA8PSBGVFBfQVJHMiApCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgIGlmICggY29tcFtGVFBfQVJHMl1bMF0gPT0gJy8nICYmCisgICAgICAgICAgIHZhbGlkX3JlYWQoIGNvbXBbRlRQX0FSRzJdLCBsb3dlcl9jYXNlKGNvbXBbRlRQX0FSRzFdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgInJlYWRfZmlsZSIsIDAgKSApCisgICAgICAgICAgcmVwbHkgPSAiT0siOworICAgICAgZWxzZQorICAgICAgICAgIHJlcGx5ID0gIkZBSUwiOworICAgICAgYnJlYWs7CisKKyAgZGVmYXVsdDoKK0RFQlVHKCItRnRwQWNjZXNzLS0tLVxuSG9zdDoiK2hvc3QrIk1lc3NhZ2U6XG4iK21lc3NhZ2UrIlxuLS0tLS0tLS0tLS0tLS1cbiIpOworICAgICAgbG9nX2ZpbGUoICJJTVBfTVNHUyIsICJIb3N0OiAiICsgaG9zdCArICI6IiArIHBvcnQgKyAiIC0gJyIgKworICAgICAgICAgICAgICAgIG1lc3NhZ2UgKyAiJ1xuIiApOworICAgICAgYnJlYWs7CisgIH0KKworICBzZW5kX3VkcCggaG9zdCwgcG9ydCwgaGVhZCtyZXBseSApOworI2VuZGlmCit9CisKKworc3RhdGljIGludCBkb1JlYWRNYWlsKCBzdHJpbmcgZmlsZSApCit7CisgICAgc3RyaW5nIHN0ciwgKmxpbmVzLCAqcGFydHMsICp0bXA7CisgICAgbWl4ZWQgKm1lc3NhZ2U7CisgICAgaW50IGksIGo7CisKKyAgICBpZiAoIChpID0gZmlsZV9zaXplKGZpbGUpKSA+IDUwMDAwIHx8IGkgPCA1ICl7CisgICAgICAgIHJtKGZpbGUpOworICAgICAgICBERUJVRyggIk1haWwgc2l6ZSBpbnZhbGlkXG4iICk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAoICEoc3RyID0gcmVhZF9ieXRlcyggZmlsZSwgMCwgNTAwMDAgKSkgKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBpZiAoICEoaiA9IHNpemVvZihsaW5lcyA9IGV4cGxvZGUoIHN0ciwgIlxuIiApKSkgKQorICAgICAgICByZXR1cm4gLTI7CisKKyAgICBpID0gMDsKKworICAgIHdoaWxlICggaSA8IGogJiYgbGluZXNbaV0gIT0gIiIgKQorICAgICAgICBpKys7CisKKyAgICBpZiAoIGkgPT0gaiApCisgICAgICAgIHJldHVybiAtMjsKKworIERFQlVHKCBzcHJpbnRmKCAiSGF2ZSAlZCBoZWFkZXJsaW5lczpcbiIsIGkgKSApOworCisgICAgbWVzc2FnZT0gYWxsb2NhdGUoOSk7CisgICAgbWVzc2FnZVtNU0dfQ0NdID0gKHt9KTsKKyAgICBtZXNzYWdlW01TR19CQ0NdID0gKHt9KTsKKyAgICBtZXNzYWdlW01TR19CT0RZXSA9IGltcGxvZGUoIGxpbmVzW2kuLl0sICJcbiIgKTsKKworICAgIGZvciAoIGogPSAwOyBqIDwgaTsgaisrICl7CisgICAgICAgIHBhcnRzID0gZXhwbG9kZSggbGluZXNbal0sICI6IiApOworCisgICAgICAgIGlmICggc2l6ZW9mKHBhcnRzKSA+IDEgKXsKKyAgICAgICAgICAgIHN0ciA9IGxvd2VyX2Nhc2UocGFydHNbMF0pOworICAgICAgICAgICAgcGFydHNbMF0gPSBpbXBsb2RlKCBwYXJ0c1sxLi5dLCAiOiIgKTsKKworICAgICAgICAgICAgc3dpdGNoIChzdHIpeworICAgICAgICAgICAgY2FzZSAic3ViamVjdCI6CisgICAgICAgICAgICAgICAgbWVzc2FnZVtNU0dfU1VCSkVDVF0gPSBwYXJ0c1swXTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAiZnJvbSI6CisgICAgICAgICAgICAgICAgREVCVUcoICJGb3VuZCBmcm9tXG4iICk7CisgICAgICAgICAgICAgICAgREVCVUcoIHNwcmludGYoICJQQVJUU1swXT0lc1xuIiwgcGFydHNbMF0gKSApOworICAgICAgICAgICAgICAgIG1lc3NhZ2VbTVNHX0ZST01dID0gbWFpbF9ub3JtYWxpemUocGFydHNbMF0pOworICAgICAgICAgICAgICAgIG1lc3NhZ2VbTVNHX1NFTkRFUl0gPSBwYXJ0c1swXTsKKyAgICAgICAgICAgICAgICBERUJVRyggc3ByaW50ZiggIkZST006ICVzXG5TRU5ERVI6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlW01TR19GUk9NXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVtNU0dfU0VOREVSXSApICk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgImNjIjoKKyAgICAgICAgICAgICAgICBERUJVRyggc3ByaW50ZigiRk9VTkQgQ0M6ICVPXG4iLCBwYXJ0c1swXSkgKTsKKyAgICAgICAgICAgICAgICBtZXNzYWdlW01TR19DQ10gKz0gbWtfcmVjX2xpc3QocGFydHNbMF0pOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlICJiY2MiOgorICAgICAgICAgICAgICAgIERFQlVHKCBzcHJpbnRmKCJGT1VORCBCQ0M6ICVPXG4iLCBwYXJ0c1swXSkgKTsKKyAgICAgICAgICAgICAgICBtZXNzYWdlW01TR19CQ0NdICs9IG1rX3JlY19saXN0KHBhcnRzWzBdKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAidG8iOgorICAgICAgICAgICAgICAgIERFQlVHKCBzcHJpbnRmKCJGT1VORCBUTzogJU9cbiIsIHBhcnRzWzBdKSApOworICAgICAgICAgICAgICAgIHRtcCA9IG1rX3JlY19saXN0KHBhcnRzWzBdKTsKKworICAgICAgICAgICAgICAgIGlmICggIW1lc3NhZ2VbTVNHX1JFQ0lQSUVOVF0gKQorICAgICAgICAgICAgICAgICAgICBtZXNzYWdlW01TR19SRUNJUElFTlRdID0gdG1wWzBdOworCisgICAgICAgICAgICAgICAgbWVzc2FnZVtNU0dfQ0NdICs9IHRtcDsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgLy8gRGFzIE1VRC1UTzogd2lyZCB2b20gUGVybHNrcmlwdCBhbHMgZXJzdGUgSGVhZGVyemVpbGUgZWluZ2VmdWVndAorICAgICAgICAgICAgY2FzZSAibXVkLXRvIjoKKyAgICAgICAgICAgICAgICBERUJVRyggc3ByaW50ZigiRk9VTkQgTVVELVRPOiAlT1xuIiwgcGFydHNbMF0pICk7CisgICAgICAgICAgICAgICAgbWVzc2FnZVtNU0dfUkVDSVBJRU5UXSA9IG1haWxfbm9ybWFsaXplKGxvd2VyX2Nhc2UocGFydHNbMF0pKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEVpZ2VudGxpY2hlbiBFbXBmYWVuZ2VyIGF1cyBDQzogbG9lc2NoZW4KKyAgICBtZXNzYWdlW01TR19DQ10gLT0gKHsgbWVzc2FnZVtNU0dfUkVDSVBJRU5UXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVtNU0dfUkVDSVBJRU5UXSsiQG1nLm11ZC5kZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VbTVNHX1JFQ0lQSUVOVF0rIkBtb3JnZW5ncmF1ZW4ubXVkLmRlIiB9KTsKKworCisgREVCVUcoIHNwcmludGYoICJUTzogJU9cbiIsIG1lc3NhZ2VbTVNHX1JFQ0lQSUVOVF0gKSApOworICAgIERFQlVHKCBzcHJpbnRmKCAiQ0M6ICVPXG4iLCBtZXNzYWdlW01TR19DQ10gKSApOworICAgIERFQlVHKCBzcHJpbnRmKCAiQkNDOiAlT1xuIiwgbWVzc2FnZVtNU0dfQkNDXSApICk7CisKKyAgICBpZiAoICFzdHJpbmdwKG1lc3NhZ2VbTVNHX0ZST01dKSApCisgICAgICAgIHJldHVybiAtMjsKKworICAgIGlmICggIXN0cmluZ3AobWVzc2FnZVtNU0dfUkVDSVBJRU5UXSkgKXsKKyAgICAgICAgc3RyID0gZXhwbG9kZSggZmlsZSwgIi8iIClbPDFdOworICAgICAgICBpID0gMDsKKyAgICAgICAgaiA9IHNpemVvZihzdHIpOworCisgICAgICAgIHdoaWxlICggaSA8IGogJiYgc3RyW2ldIDw9ICc5JyAmJiBzdHJbaV0gPj0gJzAnICkKKyAgICAgICAgICAgIGkrKzsKKworICAgICAgICBpZiAoIGkgPj0gaiApCisgICAgICAgICAgICByZXR1cm4gLTI7CisgICAgICAgIAorICAgICAgICBtZXNzYWdlW01TR19SRUNJUElFTlRdID0gc3RyW2kuLl07CisgIERFQlVHKCBzcHJpbnRmKCAiRU1FUkdFTkNZIFJFQ0lQSUVOVD0lc1xuIiwgc3RyW2kuLl0gKSApOworICAgIH0KKworICAgIHJtKGZpbGUpOworCisgICAgLy8gRGEgdm9tIE1hc3RlciBiZXNzZXIgbmljaHRzIHZvbiBhdXNzZXJoYWxiIC9zZWN1cmUgI2luY2x1ZGUndCB3aXJkLAorICAgIC8vIGRpcmVrdCBkaWUgJzUnLiBOb3JtYWxlcndlaXNlIGhpZXNzZSBkZXIgQXVmcnVmOgorICAgIC8vIERlbGl2ZXJNYWlsKCBtZXNzYWdlLCBOT19VU0VSX0FMSUFTRVN8Tk9fQ0FSQk9OX0NPUElFUyApOworICAgICIvc2VjdXJlL21haWxlciItPkRlbGl2ZXJNYWlsKCBtZXNzYWdlLCA1ICk7CisgICAgcmV0dXJuIDE7Cit9CisKKworcHVibGljIHZvaWQgbWFpbHJlYWQoKQoreworICAgIHN0cmluZyAqZmlsZXM7CisgICAgaW50IGk7CisKKyAgICBERUJVRyggIm1haWxyZWFkIGNhbGxlZFxuIiApOworCisgICAgaWYgKCBtYWlsc19sYXN0X2hvdXIgPj0gTUFYX01BSUxTX1BFUl9IT1VSICkKKyAgICAgICAgcmV0dXJuOworCisgICAgZmlsZXMgPSAoZ2V0X2RpciggIi9tYWlsL2luYm91bmQvKiIgKXx8KHt9KSkgLSAoeyAiLi4iLCAiLiIgfSk7CisgICAgaSA9IHNpemVvZihmaWxlcyk7CisKKyAgICB3aGlsZSAoIGktLSAmJiBtYWlsc19sYXN0X2hvdXIgPCBNQVhfTUFJTFNfUEVSX0hPVVIgKXsKKyAgICAgICAgREVCVUcoICJGT1VORCBGSUxFIFwiIiArIGZpbGVzW2ldICsgIlwiIC4uLlxuIiApOworICAgICAgICBtYWlsc19sYXN0X2hvdXIrKzsKKworICAgICAgICBpZiAoIGRvUmVhZE1haWwoICIvbWFpbC9pbmJvdW5kLyIgKyBmaWxlc1tpXSkgPCAtMSApeworICAgICAgICAgICAgbWl4ZWQgbWVzc2FnZTsKKworICAgICAgICAgICAgbWVzc2FnZSA9IGFsbG9jYXRlKDkpOworICAgICAgICAgICAgbWFpbHNfbGFzdF9ob3VyKys7CisgICAgICAgICAgICByZW5hbWUoICIvbWFpbC9pbmJvdW5kLyIgKyBmaWxlc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgIi9zZWN1cmUvQVJDSC9NQUlMLyIgKyBmaWxlc1tpXSApOworICAgICAgICAgICAgbWVzc2FnZVtNU0dfU0VOREVSXSA9IGdldGV1aWQoKTsKKyAgICAgICAgICAgIG1lc3NhZ2VbTVNHX0ZST01dID0gZ2V0dWlkKCk7CisgICAgICAgICAgICBtZXNzYWdlW01TR19TVUJKRUNUXSA9ICJGZWhsZXJoYWZ0ZSBNYWlsOiAvc2VjdXJlL0FSQ0gvTUFJTC8iICsKKyAgICAgICAgICAgICAgICBmaWxlc1tpXTsKKyAgICAgICAgICAgIG1lc3NhZ2VbTVNHX1JFQ0lQSUVOVF0gPSAibXVkQG1nLm11ZC5kZSI7CisgICAgICAgICAgICBtZXNzYWdlW01TR19CT0RZXSA9ICJCaXR0ZSBVZWJlcnBydWVmZW4hXG4iOworICAgICAgICAgICAgLy8gTk9fU1lTVEVNX0FMSUFTRVN8Tk9fVVNFUl9BTElBU0VTID09IDMKKyAgICAgICAgICAgICIvc2VjdXJlL21haWxlciItPkRlbGl2ZXJNYWlsKCBtZXNzYWdlLCAzICk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKworc3RhdGljIHZvaWQgdWRwX3F1ZXJ5KCBzdHJpbmcgcXVlcnksIHN0cmluZyBob3N0LCBpbnQgcG9ydCApCit7CisjaWYgX19FRlVOX0RFRklORURfXyhzZW5kX3VkcCkKKyAgICBzdHJpbmcgKm1lc3M7CisgICAgbWl4ZWQgKmRhdGE7CisgICAgaW50IGksIGo7CisKKyAgICBtZXNzID0gZXhwbG9kZSggcXVlcnksICIgIiApOworICAgIAorICAgIHN3aXRjaCAoIG1lc3NbMV0gKXsKKyAgICBjYXNlICJ3aG9saXN0IjoKKyAgICBjYXNlICJ3aG8iOgorICAgICAgICBkYXRhID0gKHN0cmluZyAqKSIvb2JqL3dlcmxpc3RlIi0+UXVlcnlXaG9MaXN0ZSgpOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgInVwdGltZSI6CisgICAgICAgIGRhdGEgPSAoeyBjYWxsX3NlZnVuKCJ1cHRpbWUiKSB9KTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlICJmaW5nZXIiOgorICAgICAgICBpZiAoIHNpemVvZihtZXNzKSA8IDMgKQorICAgICAgICAgICAgZGF0YSA9ICh7ICJFcnJvcjogV2VuIHNvbGwgaWNoIGZpbmdlcm4gPyIgfSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGRhdGEgPSBleHBsb2RlKCAoc3RyaW5nKSJwL2RhZW1vbi9maW5nZXIiLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5nZXJfc2luZ2xlKCBsb3dlcl9jYXNlKG1lc3NbMl0pLCAwICksICJcbiIgKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlICJtYWlscmVhZCI6CisgICAgICAgIGRhdGEgPSAoeyAiT2theSIgfSk7CisgICAgICAgIG1haWxyZWFkKCk7CisgICAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgICAgZGF0YSA9ICh7ICJFcnJvcjogdW5rbm93biByZXF1ZXN0ICIgKyBtZXNzWzFdICsgIlxuIiB9KTsKKyAgICB9CisKKworICAgIHNlbmRfdWRwKCBob3N0LCBwb3J0LCBzcHJpbnRmKCAiJXMgMCAlZCIsIG1lc3NbMF0sIHNpemVvZihkYXRhKSApICk7CisKKyAgICBmb3IgKCBpID0gMCwgaiA9IHNpemVvZihkYXRhKTsgaSA8IGo7IGkrKyApCisgICAgICAgIHNlbmRfdWRwKCBob3N0LCBwb3J0LCBzcHJpbnRmKCAiJXMgJWQgJXMiLCBtZXNzWzBdLCBpKzEsIGRhdGFbaV0gKSApOworI2VuZGlmCit9CisKKyNkZWZpbmUgVURQX0RFQlVHKHgpIAorLy8jZGVmaW5lIFVEUF9ERUJVRyh4KSAod3JpdGVfZmlsZSgiL2xvZy9BUkNIL3VkcC5sb2ciLCh4KSkpCisKK3ZvaWQgcmVjZWl2ZV91ZHAoc3RyaW5nIGhvc3QsIHN0cmluZyBtZXNzYWdlLCBpbnQgcG9ydCkKK3sKKyAgbWl4ZWQgKnRtcDsKKyAgVURQX0RFQlVHKHNwcmludGYoIiVzICVzOiVkOiAlc1xuIixzdHJmdGltZSgpLGhvc3QscG9ydCxtZXNzYWdlKSk7CisKKyAgaWYgKG1lc3NhZ2VbMC4uNl09PSJFWFRSRVE6IgorICAJfHwgbWVzc2FnZVswLi41XT09IklQTkFNRSIKKyAgCXx8IG1lc3NhZ2VbMC4uM109PSJBVVRIIgorICApIHsJCisgICAgcmV0dXJuOworICB9CisKKyAgaWYoIG1lc3NhZ2VbMC4uOF09PSJJUExPT0tVUFxuIiApIHsKKyAgICAiL3AvZGFlbW9uL2lwbG9va3VwIi0+dXBkYXRlKCBtZXNzYWdlICk7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYoIG1lc3NhZ2VbMC4uOV09PSJETlNMT09LVVBcbiIgKSB7CisgICAgIi9wL2RhZW1vbi9kbnNsb29rdXAiLT51cGRhdGUoIG1lc3NhZ2UgKTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAobWVzc2FnZVswLi40XT09Ik5GVFBEIikgeworI2lmIF9fSE9TVF9OQU1FX189PU1VREhPU1QKKyAgICBpZiAoaG9zdCE9RlRQRF9JUCkgeworICAgICAgREVCVUcoc3ByaW50ZigiSU5WQUxJRCBIT1NUOiAlc1xuIixob3N0KSk7CisgICAgICByZXR1cm47CisgICAgfQorI2VuZGlmCisgICAgRnRwQWNjZXNzKGhvc3QsbWVzc2FnZSxwb3J0KTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAobWVzc2FnZVswLi45XT09InVkcF9xdWVyeToiKSB7CisgICAgcmV0dXJuIHVkcF9xdWVyeShtZXNzYWdlWzEwLi5dLGhvc3QscG9ydCk7CisgIH0KKworICAic2VjdXJlL2luZXRkIi0+X3JlY2VpdmVfdWRwKGhvc3QsIG1lc3NhZ2UpOworfQorCisKZGlmZiAtLWdpdCBhL3NlY3VyZS9tYXN0ZXIvcGxheWVyc19kZW55LmMgYi9zZWN1cmUvbWFzdGVyL3BsYXllcnNfZGVueS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwNTcwNGMKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvbWFzdGVyL3BsYXllcnNfZGVueS5jCkBAIC0wLDAgKzEsMTUxIEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gbWFzdGVyLmMgLS0gbWFzdGVyIG9iamVjdAorLy8KKy8vICRJZDogbWFzdGVyLmMgNzA0MSAyMDA4LTEwLTEzIDE4OjE4OjI3WiBaZXNzdHJhICQKKyNwcmFnbWEgc3RyaWN0X3R5cGVzCisjcHJhZ21hIG5vX2Nsb25lCisjcHJhZ21hIG5vX3NoYWRvdworI3ByYWdtYSB2ZXJib3NlX2Vycm9ycworI3ByYWdtYSBjb21iaW5lX3N0cmluZ3MKKyNwcmFnbWEgcGVkYW50aWMKKyNwcmFnbWEgcmFuZ2VfY2hlY2sKKyNwcmFnbWEgd2Fybl9kZXByZWNhdGVkCisKKyNkZWZpbmUgV0hJVEVMSVNUICIvc2VjdXJlL0FSQ0gvcGxheWVyc19kZW55X3doaXRlbGlzdC5vIgorI2RlZmluZSBUQVJHRVRMSVNUICIvc2VjdXJlL0FSQ0gvcGxheWVyc19kZW55X3RhcmdldHMubyIKKyNkZWZpbmUgV0hJVEVMSVNURFVNUCAiL3NlY3VyZS9BUkNIL3BsYXllcnNfZGVueV93aGl0ZWxpc3QuZHVtcCIKKyNkZWZpbmUgVEFSR0VUTElTVERVTVAgIi9zZWN1cmUvQVJDSC9wbGF5ZXJzX2RlbnlfdGFyZ2V0cy5kdW1wIgorCisvLyNkZWZpbmUgUExERU5ZX0xFQVJOTU9ERQorCisjaW5jbHVkZSAiL3NlY3VyZS93aXpsZXZlbHMuaCIKKyNpbmNsdWRlICIvc2VjdXJlL21hc3Rlci5oIgorCisvKiBEaWVzZSBPYmpla3RlIGR1ZXJmZW4gYXVzIC9wbGF5ZXJzLyBpbmNsdWRpZXJlbi9lcmJlbiAqLworbm9zYXZlIHByaXZhdGUgbWFwcGluZyB3aGl0ZWxpc3Q7CisvKiBEaWVzZSBEaW5nZSB3ZXJkZW4gdm9uIE9iamVrdG4gaW4gd2hpdGVsaXN0IGF1cyAvcGxheWVycy8gaW5rbHVkaWVydC9nZWVyYnQuICovCitub3NhdmUgcHJpdmF0ZSBtYXBwaW5nIHRhcmdldHM7CisKK3ByaXZhdGUgbWFwcGluZyBQYXJzZUxpc3Qoc3RyaW5nIGxpc3QpIHsKKyAgbWl4ZWQgZGF0YTsKKworICBpZiAoIXN0cmluZ3AobGlzdCkpIHJldHVybiAoWzowIF0pOworICBpZiAoIXN0cmluZ3AoZGF0YSA9IHJlYWRfZmlsZShsaXN0KSkpIHJldHVybiAoWzowIF0pOworICBkYXRhID0gZXhwbG9kZShkYXRhLCAiXG4iKSB8fCAoe30pOworCisgIHJldHVybiBta21hcHBpbmcoZGF0YSk7Cit9CisKK3ByaXZhdGUgdm9pZCBQYXJzZVdoaXRlTGlzdCgpIHsKKyAgREVCVUcoIlBhcnNpbmcgV2hpdGVsaXN0XG4iKTsKKyAgd2hpdGVsaXN0PVBhcnNlTGlzdChXSElURUxJU1REVU1QKTsKK30KK3ByaXZhdGUgdm9pZCBQYXJzZVRhcmdldExpc3QoKSB7CisgIERFQlVHKCJQYXJzaW5nIFRhcmdldGxpc3RcbiIpOworICB0YXJnZXRzPVBhcnNlTGlzdChUQVJHRVRMSVNURFVNUCk7Cit9CisKK3ByaXZhdGUgdm9pZCBEdW1wTGlzdChtYXBwaW5nIGxpc3QsIHN0cmluZyBmaWxlKSB7CisgIGlmICghc3RyaW5ncChmaWxlKSB8fCAhbWFwcGluZ3AobGlzdCkKKyAgICAgIHx8ICFzaXplb2YoZmlsZSkgfHwgIXNpemVvZihsaXN0KSkKKyAgICByZXR1cm47CisgIAorICB3cml0ZV9maWxlKGZpbGUsIGltcGxvZGUobV9pbmRpY2VzKGxpc3QpLCJcbiIpLCAxKTsKK30KKworcHJpdmF0ZSB2b2lkIER1bXBXaGl0ZUxpc3QoKSB7CisgIERFQlVHKCJEdW1waW5nIFdoaXRlbGlzdFxuIik7CisgIER1bXBMaXN0KHdoaXRlbGlzdCwgV0hJVEVMSVNURFVNUCk7Cit9Citwcml2YXRlIHZvaWQgRHVtcFRhcmdldExpc3QoKSB7CisgIERFQlVHKCJEdW1waW5nIFRhcmdldGxpc3RcbiIpOworICBEdW1wTGlzdCh0YXJnZXRzLCBUQVJHRVRMSVNURFVNUCk7Cit9CisKK3B1YmxpYyB2b2lkIER1bXBQTERlbnlMaXN0cygpIHsKKyAgaWYgKCBleHRlcm5fY2FsbCgpICYmIGNhbGxfc2VmdW4oInNlY3VyZV9sZXZlbCIpIDwgQVJDSF9MVkwgKQorICAgIHJldHVybjsKKyAgREVCVUcoIkR1bXBpbmcgUExEZW55bGlzdHNcbiIpOworICBsaW1pdGVkKCMnRHVtcFdoaXRlTGlzdCk7CisgIGxpbWl0ZWQoIydEdW1wVGFyZ2V0TGlzdCk7Cit9CisKK3B1YmxpYyB2b2lkIFNhdmVQTERlbnlMaXN0cygpIHsKKyAgaWYgKCBleHRlcm5fY2FsbCgpICYmIGNhbGxfc2VmdW4oInNlY3VyZV9sZXZlbCIpIDwgQVJDSF9MVkwgKQorICAgIHJldHVybjsKKyAgREVCVUcoIlNhdmluZyBQTERlbnlMaXN0c1xuIik7CisgIHdyaXRlX2ZpbGUoV0hJVEVMSVNULAorICAgICAgc2F2ZV92YWx1ZSh3aGl0ZWxpc3QpLCAxKTsKKyAgd3JpdGVfZmlsZShUQVJHRVRMSVNULAorICAgICAgc2F2ZV92YWx1ZSh0YXJnZXRzKSwgMSk7Cit9CisKK3B1YmxpYyB2b2lkIExvYWRQTERlbnlsaXN0cygpIHsKKyAgbWl4ZWQgdG1wOworCisgIGlmICggZXh0ZXJuX2NhbGwoKSAmJiBjYWxsX3NlZnVuKCJzZWN1cmVfbGV2ZWwiKSA8IEFSQ0hfTFZMICkKKyAgICByZXR1cm47CisKKyAgd3JpdGUoIkxvYWRpbmcgUExEZW55bGlzdHNcbiIpOworCisgIGlmIChzdHJpbmdwKHRtcD1yZWFkX2ZpbGUoV0hJVEVMSVNUKSkpIHsKKyAgICAvLyBzYXZlZmlsZSBleGlzdHMKKyAgICB3aGl0ZWxpc3QgPSByZXN0b3JlX3ZhbHVlKHRtcCk7CisgIH0KKyAgZWxzZSB7CisgICAgICBsaW1pdGVkKCMnUGFyc2VXaGl0ZUxpc3QpOworICB9CisgIGlmIChzdHJpbmdwKHRtcD1yZWFkX2ZpbGUoVEFSR0VUTElTVCkpKSB7CisgICAgdGFyZ2V0cyA9IHJlc3RvcmVfdmFsdWUodG1wKTsKKyAgfQorICBlbHNlIHsKKyAgICAgIGxpbWl0ZWQoIydQYXJzZVRhcmdldExpc3QpOworICB9Cit9CisKK21peGVkIGluY2x1ZGVfZmlsZShzdHJpbmcgZmlsZSwgc3RyaW5nIGNvbXBpbGVkX2ZpbGUsIGludCBzeXNfaW5jbHVkZSkgeworICAKKyAgaWYgKHN5c19pbmNsdWRlKSByZXR1cm4gMDsKKyAgLy8gTG9nZ2VuLCB3ZW5uIEZpbGVzIGF1c3NlcmhhbGIgL3BsYXllcnMvIEtyYW0gYXVzIC9wbGF5ZXJzLworICAvLyBpbmtsdWRpZXJlbi9lcmJlbi4KKyAgaWYgKHN0cnN0cihmaWxlLCAiL3BsYXllcnMvIikgPT0gMAorICAgICAgJiYgKHN0cnN0cihjb21waWxlZF9maWxlLCIvcGxheWVycy8iKSA9PSAtMQorICAgICAgJiYgIW1lbWJlcih3aGl0ZWxpc3QsIGNvbXBpbGVkX2ZpbGUpICkpIHsKKyNpZmRlZiBQTERFTllfTEVBUk5NT0RFCisgICAgREVCVUcoImluY2x1ZGVfZmlsZSgpOiBXaGl0ZWxpc3Rpbmc6ICIrY29tcGlsZWRfZmlsZSsiXG4iKTsKKyAgICBtX2FkZCh3aGl0ZWxpc3QsIGNvbXBpbGVkX2ZpbGUpOworICAgIG1fYWRkKHRhcmdldHMsIGZpbGUpOworICAgIGNhbGxfc2VmdW4oImxvZ19maWxlIiwgIlBMQVlFUlNXSElURUxJU1QiLAorICAgICAgICBzcHJpbnRmKCIlcyAoaW5rbHVkaWVydCAlcylcbiIsY29tcGlsZWRfZmlsZSwgZmlsZSksCisgICAgICAgIDEwMDAwMDApOworI2Vsc2UKKyAgICAvLyB2ZXJ3ZWlnZXJuLgorICAgIHJldHVybiAtMTsKKyNlbmRpZgorICB9CisgIHJldHVybiAwOworfQorCittaXhlZCBpbmhlcml0X2ZpbGUoc3RyaW5nIGZpbGUsIHN0cmluZyBjb21waWxlZF9maWxlKSB7CisKKyAgLy8gTG9nZ2VuLCB3ZW5uIEZpbGVzIGF1c3NlcmhhbGIgL3BsYXllcnMvIEtyYW0gYXVzIC9wbGF5ZXJzLworICAvLyBpbmtsdWRpZXJlbi9lcmJlbi4KKyAgaWYgKHN0cnN0cihmaWxlLCAiL3BsYXllcnMvIikgPT0gMAorICAgICAgJiYgKHN0cnN0cihjb21waWxlZF9maWxlLCIvcGxheWVycy8iKSA9PSAtMQorICAgICAgJiYgIW1lbWJlcih3aGl0ZWxpc3QsIGNvbXBpbGVkX2ZpbGUpICkpIHsKKyNpZmRlZiBQTERFTllfTEVBUk5NT0RFCisgICAgREVCVUcoImluY2x1ZGVfZmlsZSgpOiBXaGl0ZWxpc3Rpbmc6ICIrY29tcGlsZWRfZmlsZSsiXG4iKTsKKyAgICBtX2FkZCh3aGl0ZWxpc3QsIGNvbXBpbGVkX2ZpbGUpOworICAgIG1fYWRkKHRhcmdldHMsIGZpbGUpOworICAgIGNhbGxfc2VmdW4oImxvZ19maWxlIiwgIlBMQVlFUlNXSElURUxJU1QiLCAKKyAgICAgICAgc3ByaW50ZigiJXMgKGVyYnQgJXMpXG4iLGNvbXBpbGVkX2ZpbGUsIGZpbGUpLAorICAgICAgICAxMDAwMDAwKTsKKyNlbHNlCisgICAgLy8gdmVyd2VpZ2Vybi4KKyAgICByZXR1cm4gLTE7CisjZW5kaWYKKyAgfQorICByZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvc2VjdXJlL21hc3Rlci91c2VyaW5mby5jIGIvc2VjdXJlL21hc3Rlci91c2VyaW5mby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkOGY0ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvbWFzdGVyL3VzZXJpbmZvLmMKQEAgLTAsMCArMSwxMTE5IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gbWFzdGVyL3VzZXJpbmZvLmMgLS0gQ2FjaGUgbWl0IFNwaWVsZXJpbmZvcworLy8KKy8vICRJZDogdXNlcmluZm8uYyA5NDY3IDIwMTYtMDItMTkgMTk6NDg6MjRaIFplc3N0cmEgJAorCisjcHJhZ21hIHN0cmljdF90eXBlcworCisjaW5jbHVkZSAiL3NlY3VyZS9tYXN0ZXIuaCIKKyNpbmNsdWRlICIvc3lzL2ZpbGVzLmgiCisjaW5jbHVkZSAiL3N5cy9vYmplY3RfaW5mby5oIgorCisvLyBNYWtybyBhdXMgd2l6bGV2ZWxzLmggZXJzZXR6ZW4sIGRhIHNlY3VyZV9sZXZlbCBuZSBzZWZ1biBpc3QuICpzZXVmeioKKyN1bmRlZiBBUkNIX1NFQ1VSSVRZCisjZGVmaW5lIEFSQ0hfU0VDVVJJVFkgKGNhbGxfc2VmdW4oInNlY3VyZV9sZXZlbCIpID49IEFSQ0hfTFZMKQorCitwcml2YXRlIHN0cmluZyogIEV4cGFuZFVJREFsaWFzKHN0cmluZyBhbGlhcywgaW50IHJlYyk7CisKK25vc2F2ZSBtYXBwaW5nIHVzZXJsaXN0Oworc3RyaW5nIG5hbWUsIHBhc3N3b3JkOworc3RyaW5nIGVrdGlwczsKK3N0cmluZyBmcHRpcHM7CitpbnQgbGV2ZWw7CitzdHJpbmcgc2hlbGw7CitpbnQgY3JlYXRpb25fZGF0ZTsKK3N0cmluZyBlcCwgZWssIG1xOworc3RyaW5nICpkb21haW5zLCpndWlsZHMsICp1aWRzdG90YWtlY2FyZTsKK25vc2F2ZSBzdHJpbmcqIGxhdGVwbGF5ZXJzOworLy8gaGllciB3aXJkIGVpbiBNYXBwaW5nIHZvbiBVSUQtenUtTWFnaWVyLVp1b3JkbnVuZ2VuIGdlc3BlaWNoZXJ0LiBBbHMgS2V5cworLy8gd2VyZGVuIFVJRHMgdmVyd2VuZGV0LCBkZXIgVmFsdWUgaXN0IGpld2VpbHMgZWluIEFycmF5IG1pdCBkZW4gbWFnaWVybiwgZGllCisvLyBkYWZ1ZXIgenVzdGFlbmRpZyBzaW5kLgorbm9zYXZlIHByaXZhdGUgbWFwcGluZyB1c2VyaWRzID0gKFtdKTsKKy8vIEVpbiBDYWNoZSBmdWVyIFVJRC1BbGlhc2UsIGRhbWl0IEV4cGFuZFVJREFsaWFzKCkgbmljaHQgc3RhZW5kaWcgZ2FuemUKKy8vIFZlcnplaWNobmlzc2UgZWlubGVzZW4gbXVzcywgc29uZGVybiBkZXIgTWFzdGVyIGRhcyBudXIgaW0gUmVzZXQgbWFjaGVuCisvLyBtdXNzLgorbm9zYXZlIHByaXZhdGUgbWFwcGluZyB1aWRhbGlhc2UgPSAoW10pOworCisjaWZkZWYgX1BVUkVGVFBEXworLy8gTGlzdGUgdm9uIEZUUC1iZXJlY2h0aWd0ZW4gVXNlcm4KK25vc2F2ZSBwcml2YXRlIG1hcHBpbmcgZnRwdXNlciA9IChbXSk7CisKK3B1YmxpYyB2b2lkIHJlYWRfZnRwX3VzZXJzKCkgeworICBzdHJpbmcgc3RyID0gcmVhZF9maWxlKCIvIlNFQ1VSRURJUiIvQVJDSC9wdXJlZnRwZC5wYXNzd2QiKSB8fCAiIjsKKyAgc3RyaW5nICpkYXRhID0gZXhwbG9kZShzdHIsICJcbiIpOworICBpZiAoIXNpemVvZihkYXRhKSkgcmV0dXJuOworICBmdHB1c2VyID0gbV9hbGxvY2F0ZShzaXplb2YoZGF0YSksIDEpOworICBmb3JlYWNoKHN0ciA6IGRhdGEpIHsKKyAgICBzdHJpbmcgKnRtcD1leHBsb2RlKHN0ciwgIjoiKTsKKyAgICBpZihzaXplb2YodG1wKSA+PSAyKQorICAgICAgbV9hZGQoZnRwdXNlciwgdG1wWzBdLCB0bXBbMV0pOworICB9Cit9CisKK3B1YmxpYyBpbnQgd3JpdGVfZnRwX3VzZXJzKCkgeworICBzdHJpbmcgKnJlY29yZCA9IGFsbG9jYXRlKDE4LCIiKTsKKyAgbWFwcGluZyB0bXAgPSBtX2FsbG9jYXRlKHNpemVvZihmdHB1c2VyKSk7CisgIC8vIHNldCBVSUQvR0lEIG9mIHN5c3RlbSB1c2VyCisgIHJlY29yZFsyXSA9ICIxMDAwIjsKKyAgcmVjb3JkWzNdID0gIjEwMDAiOworICBmb3JlYWNoKHN0cmluZyB1LCBzdHJpbmcgcHdoYXNoIDogZnRwdXNlcikgeworICAgIHJlY29yZFswXSA9IHU7ICAvLyBVSUQKKyAgICByZWNvcmRbMV0gPSBwd2hhc2g7CisgICAgcmVjb3JkWzVdID0gIi9ob21lL211ZC9tdWRsaWIvIldJWkFSRERJUiIvIiArIHUgKyAiLy4vIjsKKyAgICBtX2FkZCh0bXAsIGltcGxvZGUocmVjb3JkLCAiOiIpKTsKKyAgfQorICB3cml0ZV9maWxlKCIvIlNFQ1VSRURJUiIvQVJDSC9wdXJlZnRwZC5wYXNzd2QiLCBpbXBsb2RlKG1faW5kaWNlcyh0bXApLCJcbiIpLDEpOworICByZXR1cm4gc2l6ZW9mKHRtcCk7Cit9CisKKy8vIGdlbG9lc2NodGUgTWFnaWVyIG9kZXIgTWFnaWVyLCBkaWUgMiBXb2NoZW4gbmljaHQgZGEgd2FyZW4sIGV4cGlyZW4KK3B1YmxpYyB2b2lkIGV4cGlyZV9mdHBfdXNlcigpIHsKKyAgZm9yZWFjaChzdHJpbmcgdSA6IGZ0cHVzZXIpIHsKKyAgICBtaXhlZCB1aW5mbyA9IGdldF9mdWxsX3VzZXJpbmZvKHUpOworICAgIGlmICghdWluZm8pIHsKKyAgICAgIG1fZGVsZXRlKGZ0cHVzZXIsdSk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaW50IHplaXQgPSBjYWxsX3NlZnVuKCJmaWxlX3RpbWUiLAorICAgICAgICAgICAgICAgICAgICAgIi8iU0VDVVJFU0FWRVBBVEggKyB1WzAuLjBdICsgIi8iICsgdSArICIubyIpOworICAgIGlmICh6ZWl0IDwgdGltZSgpLTEyMDk2MDApIHsKKyAgICAgIG1fZGVsZXRlKGZ0cHVzZXIsdSk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgIH0KKyAgY2FsbF9vdXQoIyd3cml0ZV9mdHBfdXNlcnMsIDIpOworfQorCisjZW5kaWYgLy8gX1BVUkVGVFBEXworCisvLyAqKioqKioqKioqIG9lZmZlbnRsaWNoZSBGdW5rdGlvbmVuICoqKioqKioqKioqKioqKioqKioqKioqCisKKy8vVmVyYW50d29ydGxpY2hlIE1hZ2llciBmdWVyIGVpbmUgVUlEIGF1c2dlYmVuCitwdWJsaWMgdmFyYXJncyBzdHJpbmcqIFF1ZXJ5V2l6YXJkc0ZvclVJRChzdHJpbmcgdWlkLCBpbnQgcmVjdXJzaXZlKSB7CisKKyAgICBpZiAoIXN0cmluZ3AodWlkKSB8fCAhc2l6ZW9mKHVpZCkpCisgICAgICAgIHJldHVybigoe30pKTsKKworICAgIHN0cmluZyAqdG9sb29rdXA9KHt1aWR9KTsgLy9kaWVzZSBzcGFldGVyIGluIHVzZXJpZHMgbmFjaGd1Y2tlbi4KKyAgICBzdHJpbmcgKndpemFyZHM9KHt9KTsKKyAgICAvLyBTY2hhdWVuLCB3YXMgYXV0b21hdGlzY2ggZXJtaXR0ZWx0IHdlcmRlbiBrYW5uLgorICAgIHN0cmluZyAqcGFydHM9ZXhwbG9kZSh1aWQsIi4iKTsKKyAgICBzd2l0Y2goc2l6ZW9mKHBhcnRzKSkgeworICAgICAgICAgY2FzZSAzOgorICAgICAgICAgIC8vIHouQi4gZC5yZWdpb24ubWFnaWVyIHVuZCBwLnNlcnZpY2UubWFnaWVyCisgICAgICAgICAgaWYgKGZpbmRfdXNlcmluZm8ocGFydHNbMl0pKQorICAgICAgICAgICAgICAvL01hZ2llciBleGlzdGllcnQsIHJlaW5zY2hyZWliZW4uCisgICAgICAgICAgICAgIHdpemFyZHMrPSh7cGFydHNbMl19KTsKKyAgICAgICAgICBpZiAocGFydHNbMF09PSJkIikKKyAgICAgICAgICAgICAgLy8gZC5yZWdpb24gbm9jaCBuYWNoZ3Vja2VuIChSTXMpCisgICAgICAgICAgICAgIHRvbG9va3VwPSh7aW1wbG9kZShwYXJ0c1swLi4xXSwiLiIpfSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIC8vY2FzZSAyOgorICAgICAgICAgIC8vIEdVSUxELmdpbGRlLCBwLnByb2plY3QsIGQucmVnaW9uCisgICAgICAgICAgLy8ga29lbm5lbiBudXIgaW4gdXNlcmlkcyBuYWNoZ2VndWNrdCB3ZXJkZW4gKHMudS4gdG9sb29rdXApCisgICAgICAgICAgLy8gbXVlc3NlbiBkYSBhbHMgR1VJTEQuKiwgZC4qIHVuZCBwLiogZHJpbnN0ZWhlbiEKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgIC8vIGtlaW4gUHVua3QgZHJpbi4gRW50d2VkZXIgTWFnaWVyLUlEIG9kZXIgc3BlemllbGxlIElECisgICAgICAgICAgLy8gKGxldHp0ZXJlIHdpcmQgdW50ZW4gbm9jaCBwZXIgdG9sb29rdXAgbmFjaGdlZ3Vja3QpCisgICAgICAgICAgaWYgKGZpbmRfdXNlcmluZm8ocGFydHNbMF0pKQorICAgICAgICAgICAgICB3aXphcmRzKz0oe3BhcnRzWzBdfSk7CisgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIC8vIGpldHp0IGluIHVzZXJpZHMgbmFjaHNjaGxhZ2VuCisgICAgZm9yZWFjaCh1aWQ6IHRvbG9va3VwKSB7CisgICAgICAgIGlmIChtZW1iZXIodXNlcmlkcyx1aWQpKQorICAgICAgICAgICAgd2l6YXJkcys9dXNlcmlkc1t1aWRdOworICAgIH0KKyAgICAvLyBzby4gTnVuIGthbm4gZXMgYWJlciBub2NoIHNlaW4sIGRhc3MgaW4gdXNlcmlkcyBzb3dhcyB3aWUKKyAgICAvLyAiZC53YWxkLmF0YW11ciI6KHthdGFtdXJ9KSB1bmQgImF0YW11ciI6KHsicnVtYXRhIn0pIGRyaW5zdGVodCwgYWxzbworICAgIC8vIGVpbiBNYWdpZXIgc296dXNhZ2VuIGZ1ZXIgS3JhbSBlaW5lcyBhbmRlcmVuIHZlcmFudHdvcnRsaWNoIGlzdC4gRC5oLgorICAgIC8vIG5vY2htYWwgZHVyY2ggUXVlcnlXaXphcmRzRm9yVUlEKCkgc2NoaWNrZW4gKGRhcyBpc3QgZGFubiBhbGxlcmRpbmdzIG5pY2h0CisgICAgLy8gd2VpdGVyIHJla3Vyc2l2KS4KKyAgICBpZiAoIXJlY3Vyc2l2ZSkgeworICAgICAgZm9yZWFjaCh1aWQ6IHdpemFyZHMpIHsKKyAgICAgICAgLy9lcyBpc3QgbW9lZ2xpY2gsIGluIGRlciBTY2hsZWlmZSB3aXphcmRzIHp1IHZlcmdyb2Vzc2Vybiwgb2huZSBkYXNzCisgICAgICAgIC8vZXMgRWluZmx1c3MgYXVmIGRpZSBTY2hsZWlmZSBoYXQuICAgICAgICAKKyAgICAgICAgd2l6YXJkcyArPSBRdWVyeVdpemFyZHNGb3JVSUQodWlkLCAxKSAtICh7dWlkfSk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybihtX2luZGljZXMobWttYXBwaW5nKHdpemFyZHMpKSk7Cit9CisKKy8vZGFzIERlZmluZSBpc3QgbmljaHQgc29uZGVybGljaCBlbGVnYW50LCBhYmVyIGljaCBrYW5uIGhpZXIgbmljaHQgZGFzCisvL25ld3NraWxscy5oIGhpZXIgaW5jbHVkZW4gKDEuIHp1IHZpZWwsIDIuIGlzdHMgbmVuIFNpY2hlcmhlaXRzcHJvYmxlbSkKKyNkZWZpbmUgUF9HVUlMRF9ERUZBVUxUX1NQRUxMQk9PSyAgICAgICAiZ3VpbGRfc2IiCisvLyBkaXRvIGZ1ZXIgZGVuIEdpbGRlbm1hc3RlcgorI2RlZmluZSBHVUlMRE1BU1RFUiAgICAgICAgICAgICAgICAgIi9zZWN1cmUvZ2lsZGVubWFzdGVyIgorCisvLyBEZW4gQWxpYXMtQ2FjaGUgbG9lc2NoZW4gKG5vcm1hbGVyd2Vpc2UgZWlubWFsIGFtIFRhZykKK3B1YmxpYyB2b2lkIFJlc2V0VUlEQWxpYXNlKCkgeworICAvLyBSTSsgZHVlcmZlbiBkZW4gQ2FjaGUgbG9lc2NoZW4gKHdlbm4gc2llIHouQi4gbmVuIG5ldWVzIFZlcnplaWNobmlzCisgIC8vIGFuZ2VsZWd0IGhhYmVuLikKKyAgaWYgKGV4dGVybl9jYWxsKCkgCisgICAgICAmJiBjYWxsX3NlZnVuKCJzZWN1cmVfbGV2ZWwiKSA8IExPUkRfTFZMKQorICAgICAgcmV0dXJuOworCisgIHVpZGFsaWFzZT0oW10pOworfQorCisvLyBleHBhbmRpZXJ0IGVpbmlnZSAnQWxpYXNlJyBpbiBlaW4gQXJyYXkgdm9uIGFsbGVuIFVJRHMsIGZ1ZXIgZGllIHNpZQorLy8gc3RlaGVuLiBCc3A6ICJyZWdpb24iIC0+IGQucmVnaW9uLiogKyByZWdpb24gKyBkLnJlZ2lvbiwKKy8vICJ6YXViZXJlciIgLT4gR1VJTEQuemF1YmVyZXIsICJwLnNlcnZpY2UiIC0+IHAuc2VydmljZS4qCisvLyBOdXR6dCBFaW50cmFnIGF1cyBkZW0gdWlkYWxpYXMtQ2FjaGUsIHNvZmVybiB2b3JoYW5kZW4uIAorcHVibGljIHZhcmFyZ3Mgc3RyaW5nKiBRdWVyeVVJREFsaWFzKHN0cmluZyBhbGlhcywgaW50IHJlYykgeworICBzdHJpbmcgKnVpZHM7CisgIGlmICghc3RyaW5ncChhbGlhcykgfHwgIXNpemVvZihhbGlhcykpCisgICAgICByZXR1cm4gKHt9KTsKKyAgLy8gV2VuIGltIGNhY2hlLCBnZWh0cyBzY2huZWxsLgorICBpZiAobWVtYmVyKHVpZGFsaWFzZSwgYWxpYXMpKQorICAgICAgdWlkcyA9IHVpZGFsaWFzZVthbGlhc107CisgIGVsc2UKKyAgICAgIHVpZHMgPSBFeHBhbmRVSURBbGlhcyhhbGlhcywgcmVjKTsKKworICBpZiAoZXh0ZXJuX2NhbGwoKSkKKyAgICByZXR1cm4gY29weSh1aWRzKTsKKyAgCisgIHJldHVybih1aWRzKTsKK30KKworLy8gRnVlciB3ZWxjaGUgVUlEcyBpc3QgZWluIE1hZ2llciB2ZXJhbnR3b3J0bGljaD8gKElzdCBlciBSTSwKKy8vIEdpbGRlbm1hZ2llciwgaW4gd2VsY2hlbiBSZWdpb25lbiBoYXQgZXIgZWluIFZlcnplaWNobmlzLCBldGMuKQorLy8gcmVjdXJzaXZlICE9IDAgYmVkZXV0ZXQsIGRhc3MgZGVyIEF1ZnJ1ZiBpbmRpcmVrdCBhdXMgZWluZW0gbGF1ZmVuZGVuCisvLyBRdWVyeVVJRHNGb3JXaXphcmQoKSBlcmZvbGd0LiBJbiBkZW0gRmFsbCBzb2xsIFF1ZXJ5VUlEQWxpYXMoKSBrZWluZQorLy8gd2VpdGVyZSBSZWt1cnNpb24gZHVyY2hmdWVocmVuLiBXaXJkIGVpbmZhY2ggZHVyY2hnZXJlaWNodC4KK3B1YmxpYyB2YXJhcmdzIHN0cmluZyogUXVlcnlVSURzRm9yV2l6YXJkKHN0cmluZyB3aXp1aWQsIGludCByZWN1cnNpdmUpIHsKKyAgICBzdHJpbmcgKnVpZHMsICp0bXAsICp1aWRzdG9hZGQ7CisgICAgaW50IGk7CisKKyAgICBpZiAoIXN0cmluZ3Aod2l6dWlkKSB8fCAhc2l6ZW9mKHdpenVpZCkgfHwgIUlTX0xFQVJORVIod2l6dWlkKSkKKyAgICAgICAgcmV0dXJuKCh7fSkpOworCisgICAgaWYgKCFmaW5kX3VzZXJpbmZvKHdpenVpZCkpCisgICAgICAgIHJldHVybigoe30pKTsKKworICAgIHVpZHN0b2FkZD0oe30pOyAvL2RpZXNlIHdlcmRlbiBoaW50ZXJoZXIgaW4gdXNlcmlkcyBnZXNwZWljaGVydC4KKworICAgIC8vIGFscyBlcnN0ZXMgZGllIHJhdGViYXJlbiBVSURzLiA7LSkKKyAgICB1aWRzPSh7d2l6dWlkfSk7CisgICAgLy8gUmVnaW9uZW4gZXJtaXR0ZWxuLCB3byB3aXp1aWQgZWluIFZlcnplaWNobmlzIGhhdCB1bmQgZW50c3ByZWNoZW5kZQorICAgIC8vIFVJRHMgYW5oYWVuZ2VuOgorICAgIGZvcmVhY2goc3RyaW5nIHJlZ2lvbjogZ2V0X2RvbWFpbl9ob21lcyh3aXp1aWQpKSB7CisgICAgICAgIHVpZHMrPSh7IHNwcmludGYoRE9NQUlORElSIi4lcy4lcyIscmVnaW9uLHdpenVpZCkgfSk7CisgICAgfQorICAgIC8vIFZlcnplaWNobmlzIGluIC9wL3NlcnZpY2U/CisgICAgaWYgKGZpbGVfc2l6ZShQUk9KRUNURElSIi9zZXJ2aWNlLyIrd2l6dWlkKSA9PSBGU0laRV9ESVIpCisgICAgICAgIHVpZHMrPSh7UFJPSkVDVERJUiIuc2VydmljZS4iK3dpenVpZH0pOworCisgICAgLy8gR2lsZGVuY2hlZj8KKyAgICBpZiAocG9pbnRlcnAodXNlcmxpc3Rbd2l6dWlkLFVTRVJfR1VJTERdKSkgeworICAgICAgICBmb3JlYWNoKHN0cmluZyBnaWxkZTogdXNlcmxpc3Rbd2l6dWlkLFVTRVJfR1VJTERdKSB7CisgICAgICAgICAgdWlkc3RvYWRkICs9IFF1ZXJ5VUlEQWxpYXMoZ2lsZGUpOworICAgICAgICB9CisgICAgfQorICAgIC8vIFJlZ2lvbnNtYWdpZXI/CisgICAgaWYgKHBvaW50ZXJwKHVzZXJsaXN0W3dpenVpZCxVU0VSX0RPTUFJTl0pKSB7CisgICAgICAgIGZvcmVhY2goc3RyaW5nIGRvbWFpbjogdXNlcmxpc3Rbd2l6dWlkLFVTRVJfRE9NQUlOXSkgeworICAgICAgICAgICAgLy9nZW5lcmVsbGUgUHNldWRvLVVJRCAnZC5yZWdpb24nIHVuZCAncmVnaW9uJyBmdWVyIGdlbG9lc2NodGUKKyAgICAgICAgICAgIC8vTWFnaWVyIGRpZXNlciBSZWdpb24gdm9ybWVya2VuLCB1bSBzaWUgaGludGVyaGVyIGZ1ZXJzCisgICAgICAgICAgICAvL1JldmVyc2UtTG9va3VwIGlucyB1aWQtTWFwcGluZyB6dSBzY2hyZWliZW4uCisgICAgICAgICAgICBzdHJpbmcgKnBzZXVkbz0oe0RPTUFJTkRJUiIuIitkb21haW4sIGRvbWFpbn0pOworICAgICAgICAgICAgdWlkc3RvYWRkICs9IHBzZXVkbzsKKyAgICAgICAgICAgIC8vIFJlc3QgbWFjaHQgUXVlcnlVSURBbGlhcywgZGFiZWkgYWJlciBkaWUgdm9uIGRlciBGdW5rdGlvbgorICAgICAgICAgICAgLy8gZWJlbmZhbGxzIGdlbGllZmVydGVuIFBzZXVkby1VSURzIHdpZWRlciBhYnppZWhlbi4KKyAgICAgICAgICAgIHVpZHMgKz0gUXVlcnlVSURBbGlhcyhkb21haW4pIC0gcHNldWRvOworICAgICAgICB9CisgICAgfQorICAgIC8vIGpldHp0IG5vY2ggbmFjaGd1Y2tlbiwgZnVlciB3ZWxjaGUgVUlEcyBkaWVzZXIgTWFnaWVyIGV4cGxpeml0IG5vY2gKKyAgICAvLyB6dXN0YWVuZGlnIGlzdC4KKyAgICBpZiAocG9pbnRlcnAodXNlcmxpc3Rbd2l6dWlkLFVTRVJfVUlEU19UT19UQUtFX0NBUkVdKSkgeworICAgIC8vIGRpZXMga29lbm50ZSBldHdhcyBhIGxhICJyZWdpb24iIG9kZXIgImFuZGVyZXJtYWdpZXIiIHNlaW4sIGQuaC4gZGllc2VyCisgICAgLy8gTWFnaWVyIGlzdCBmdWVyIGFsbGUgVUlEcyB2b24gJ2FuZGVybWFnaWVyJyBhdWNoIHp1c3RhZW5kaWcuIERhaGVyIG11c3MKKyAgICAvLyBqZWRlcyBkYXZvbiBkdXJjaCBRdWVyeVVJREFsaWFzKCkgKHdhcyBpbSBGYWxsZSB2b24gU3BpZWxlcm4gd2llZGVydW0KKyAgICAvLyBRdWVyeVVJRHNGb3JXaXphcmQoKSBydWZ0LCBhYmVyIGRpZSBSZWt1cnNpb24gaW0gRmFsbGUgdm9uIFNwaWVsZXJuIGlzdAorICAgIC8vIGF1ZiAxIGJlZ3Jlbnp0KS4KKyAgICAgICAgZm9yZWFjaChzdHJpbmcgdWlkMjogdXNlcmxpc3Rbd2l6dWlkLFVTRVJfVUlEU19UT19UQUtFX0NBUkVdKSB7ICAgICAgICAKKyAgICAgICAgICAgIHVpZHN0b2FkZCArPSBRdWVyeVVJREFsaWFzKHVpZDIsIHJlY3Vyc2l2ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBzbywgaW4gdWlkc3RvYWRkIHN0ZWhlbiBVSURzIGRyaW4sIGRpZSBuaWNodCBNYWdpZXJuYW1lIHNlbGJlciwKKyAgICAvLyBkLnJlZ2lvbi5tYWdpZXIgb2RlciBwLnNlcnZpY2UubWFnaWVyIHNpbmQgdW5kIGJlaSB3ZWxjaGVuIGZvbGdsaWNoIGRhcworICAgIC8vIE1hcHBpbmcgVUlEcy1uYWNoLU1hZ2llciBudXIgbWl0IGVpbmVyIExpc3RlIG1vZWdsaWNoIGlzdC4gSW4gZGllCisgICAgLy8gd2VyZGVuIGRpZSB1aWRzIG51biBlaW5nZXRyYWdlbi4gKHouQi4gZC5yZWdpb24pCisgICAgaWYgKHNpemVvZih1aWRzdG9hZGQpKSB7CisgICAgICAgIC8vIGdlbnVnIFBsYXR6IGluIHVzZXJpZHM/IFNvbnN0IHdlbGNoZSByYXVzd2VyZmVuLiA6LS8gCisgICAgICAgIC8vIChiZXNzZXIgYWxzIGJ1ZykgVE9ETzogQXVmIDEwayBiZWdyZW56ZW4gLT4gbWF4IEFycmF5Z3JvZXNzZSEKKyAgICAgICAgaWYgKCBzaXplb2YodXNlcmlkcykrKGk9c2l6ZW9mKHVpZHN0b2FkZCkpICAgICAgICAgICAgICAgCisgICAgICAgICAgICA+PSBfX01BWF9NQVBQSU5HX0tFWVNfXykgeworICAgICAgICAgICAgZm9yZWFjaChzdHJpbmcgdG1wdWlkOiBtX2luZGljZXModXNlcmlkcylbMC4uaV0pICAgICAgICAKKyAgICAgICAgICAgICAgbV9kZWxldGUodXNlcmlkcyx0bXB1aWQpOyAgCisgICAgICAgIH0KKyAgICAgICAgZm9yZWFjaChzdHJpbmcgdG1wdWlkOiB1aWRzdG9hZGQpIHsgIAorICAgICAgICAgICAgaWYgKG1lbWJlcih1c2VyaWRzLHRtcHVpZCkpIHsgIAorICAgICAgICAgICAgICAgIC8vVXNlciBkZW0gQXJyYXkgaGluenVmdWVnZW4sIHdlbm4gbm9jaCBuaWNodCBkcmluLgorICAgICAgICAgICAgICAgIGlmIChtZW1iZXIodXNlcmlkc1t0bXB1aWRdLHdpenVpZCk9PS0xKQorICAgICAgICAgICAgICAgICAgICB1c2VyaWRzW3RtcHVpZF09dXNlcmlkc1t0bXB1aWRdKyh7d2l6dWlkfSk7ICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vc29uc3QgbmV1ZW4gRWludHJhZ2VuIGhpbnp1ZnVlZ2VuICAgICAgICAgICAgCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbV9hZGQodXNlcmlkcyx0bXB1aWQsKHt3aXp1aWR9KSk7ICAgICAgICAgIAorICAgICAgICB9CisgICAgfSAvLyBFbmRlIHNwZXouIHVpZHMgc3BlaWNoZXJuCisgICAgCisgICAgcmV0dXJuKHVpZHMrdWlkc3RvYWRkKTsKK30KKworLy9FaW5lbiBNYWdpZXIgYWxzIHZlcmFudHdvcnRsaWNoIGZ1ZXIgZWluZSBiZXN0aW1tdGUgVUlEIGVpbnRyYWdlbgorcHVibGljIHN0cmluZyogQWRkV2l6YXJkRm9yVUlEKHN0cmluZyB1aWQsIHN0cmluZyB3aXp1aWQpIHsKKyAgICBpZiAoIXN0cmluZ3Aod2l6dWlkKSB8fCAhc2l6ZW9mKHdpenVpZCkKKyAgICAgICAgfHwgIUlTX0xFQVJORVIod2l6dWlkKSkKKyAgICAgICAgcmV0dXJuKCh7fSkpOworCisgICAgLy9adWdyaWZmIG51ciBhbHMgRU0gb2RlciBqZW1hbmQsIGRlciBmdWVyIGRpZSBVSUQgenVzdGFlbmRpZyBpc3QuCisgICAgaWYgKCAhQVJDSF9TRUNVUklUWQorICAgICAgICAmJiBtZW1iZXIoCisgICAgICAgICAgICBRdWVyeVVJRHNGb3JXaXphcmQoY2FsbF9zZWZ1bigic2VjdXJlX2V1aWQiKSksCisgICAgICAgICAgICB1aWQpID09IC0xKQorICAgICAgICByZXR1cm4odXNlcmxpc3Rbd2l6dWlkLFVTRVJfVUlEU19UT19UQUtFX0NBUkVdKTsKKworICAgIGlmICghcG9pbnRlcnAodXNlcmxpc3Rbd2l6dWlkLFVTRVJfVUlEU19UT19UQUtFX0NBUkVdKSkKKyAgICAgICAgLy9BcnJheSBuZXUgYW5sZWdlbgorICAgICAgICB1c2VybGlzdFt3aXp1aWQsVVNFUl9VSURTX1RPX1RBS0VfQ0FSRV09KHt1aWR9KTsKKyAgICBlbHNlIHsKKyAgICAgICAgLy9FaW4gQXJyYXkgc2Nob24gdm9yaGFuZGVuCisgICAgICAgIGlmIChtZW1iZXIodXNlcmxpc3Rbd2l6dWlkLFVTRVJfVUlEU19UT19UQUtFX0NBUkVdLHVpZCk9PS0xKQorICAgICAgICAgICAgLy91aWQgbmljaHQgZHJpbgorICAgICAgICAgICAgdXNlcmxpc3Rbd2l6dWlkLFVTRVJfVUlEU19UT19UQUtFX0NBUkVdPQorICAgICAgICAgICAgICB1c2VybGlzdFt3aXp1aWQsVVNFUl9VSURTX1RPX1RBS0VfQ0FSRV0rKHt1aWR9KTsKKyAgICB9CisgICAgc2F2ZV91c2VyaW5mbyh3aXp1aWQpOworICAgIC8vIGF1cyBkZW0gVUlELUFsaWFzLUNhY2hlIHdlcmZlbgorICAgIG1fZGVsZXRlKHVpZGFsaWFzZSwgd2l6dWlkKTsKKyAgICAvLyBBdWZydWYsIHVtIHVzZXJpZHMgdW5kIHVpZGFsaWFzZSB6dSBha3R1YWxpc2llcmVuCisgICAgUXVlcnlVSURzRm9yV2l6YXJkKHdpenVpZCk7CisgICAgcmV0dXJuKHVzZXJsaXN0W3dpenVpZCxVU0VSX1VJRFNfVE9fVEFLRV9DQVJFXSk7Cit9CisKKy8vIEVpbmVuIE1hZ2llciB3aWVkZXIgYXVzdHJhZ2VuLCB3ZW5uIGVyIG5pY2h0IG1laHIgenVzdGFlbmRpZyBpc3QuCitwdWJsaWMgc3RyaW5nKiBSZW1vdmVXaXphcmRGcm9tVUlEKHN0cmluZyB1aWQsIHN0cmluZyB3aXp1aWQpIHsKKyAgICBpZiAoIXN0cmluZ3Aod2l6dWlkKSB8fCAhc2l6ZW9mKHdpenVpZCkKKyAgICAgICAgfHwgIWZpbmRfdXNlcmluZm8od2l6dWlkKSkKKyAgICAgICAgcmV0dXJuKCh7fSkpOworCisgICAgLy9adWdyaWZmIG51ciBhbHMgRU0gb2RlciBqZW1hbmQsIGRlciBmdWVyIGRpZSBVSUQgenVzdGFlbmRpZyBpc3QuCisgICAgaWYgKCAhQVJDSF9TRUNVUklUWQorICAgICAgICAmJiBtZW1iZXIoCisgICAgICAgICAgICBRdWVyeVVJRHNGb3JXaXphcmQoY2FsbF9zZWZ1bigic2VjdXJlX2V1aWQiKSksCisgICAgICAgICAgICB1aWQpPT0tMSkKKyAgICAgICAgcmV0dXJuIGNvcHkodXNlcmxpc3Rbd2l6dWlkLFVTRVJfVUlEU19UT19UQUtFX0NBUkVdKTsKKworICAgIC8vIGpldHp0IG11c3MgZGllc2Ugd2l6dWlkIGF1cyBhbGxlbiBVSURzIGluIHVzZXJpZHMgZ2Vsb2VzY2h0IHdlcmRlbiwgZGllCisgICAgLy8gc2llIGJpc2hlciBlbnRoYWx0ZW4uIEhpZXJ6dSBzb2xsdGUgUXVlcnlVSURBbGlhcyBkaWUgcG90ZW50aWVsbAorICAgIC8vIGRyaW5zdGVoZW5kZW4gVUlEcyBsaWVmZXJuLgorICAgIGZvcmVhY2goc3RyaW5nIHR1aWQ6IFF1ZXJ5VUlEQWxpYXMod2l6dWlkLDApKSB7CisgICAgICAgIGlmIChtZW1iZXIodXNlcmlkcywgdHVpZCkgJiYKKyAgICAgICAgICAgIG1lbWJlcih1c2VyaWRzW3R1aWRdLHdpenVpZCkhPS0xICkKKyAgICAgICAgICAgIHVzZXJpZHNbdHVpZF0gLT0gKHt3aXp1aWR9KTsKKyAgICB9CisgICAgLy8gd2VubiBlcyBlaW5lIFVJRCB3YXIsIGZ1ZXIgZGllIGRlciBNYWdpZXIgZXhwbGl6aXQgenVzdGFlbmRpZyB3YXIsCisgICAgLy8gZW50c3ByZWNoZW5kIGxvZXNjaGVuLiBTb25zdCBpc3QgaGllciBFbmRlLgorICAgIGlmICghcG9pbnRlcnAodXNlcmxpc3Rbd2l6dWlkLFVTRVJfVUlEU19UT19UQUtFX0NBUkVdKSkKKyAgICAgICAgcmV0dXJuICh7fSk7CisgICAgaWYgKG1lbWJlcih1c2VybGlzdFt3aXp1aWQsVVNFUl9VSURTX1RPX1RBS0VfQ0FSRV0sdWlkKT09LTEpCisgICAgICAgIHJldHVybiBjb3B5KHVzZXJsaXN0W3dpenVpZCxVU0VSX1VJRFNfVE9fVEFLRV9DQVJFXSk7CisKKyAgICAvLyBKZXR6dCBhdXMgdXNlcmxpc3QgbG9lc2NoZW4uCisgICAgdXNlcmxpc3Rbd2l6dWlkLFVTRVJfVUlEU19UT19UQUtFX0NBUkVdIC09ICh7dWlkfSk7CisgICAgc2F2ZV91c2VyaW5mbyh3aXp1aWQpOworICAgIC8vIHVuZCB1c2VyaWRzL3VpZGFsaWFzZSBha3R1YWxpc2llcmVuLgorICAgIFF1ZXJ5VUlEc0ZvcldpemFyZCh3aXp1aWQpOworICAgIHJldHVybiBjb3B5KHVzZXJsaXN0W3dpenVpZCxVU0VSX1VJRFNfVE9fVEFLRV9DQVJFXSk7Cit9CisKKy8vZW50ZmVybnQgZWluZW4gdXNlciBhdXMgZGVtIHVzZXJjYWNoZQordm9pZCBSZW1vdmVGcm9tQ2FjaGUoc3RyaW5nIHVzZXIpIHsKKyAgbV9kZWxldGUodXNlcmxpc3QsdXNlcik7Cit9CisKKy8vbG9lc2NodCBkZW4gZ2VzYW10ZW4gVXNlcmNhY2hlCitpbnQgY2xlYXJfY2FjaGUoKSB7CisgIHVzZXJsaXN0PW1fYWxsb2NhdGUoMCx3aWR0aG9mKHVzZXJsaXN0KSk7CisgIHVwZGF0ZV9sYXRlX3BsYXllcnMoKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vIExvZXNjaHQgVUlELT5NYWdpZXIgTG9va3VwdGFiZWxsZS4gU29sbHRlIG5pY2h0IGdlcnVmZW4gd2VyZGVuLCB3ZW5uIG1hbiAKKy8vIG5pY2h0IGdlbmF1IHdlaXNzLCB3YXMgbWFuIGRhbWl0IGthcHV0dG1hY2h0LgorLy8gYWxzIE5lYmVuZWZmZWt0IHdpcmQgY2xlYXJfY2FjaGUoKSBnZXJ1ZmVuLgoraW50IFJlc2V0VUlEQ2FjaGUoKSB7CisgIC8vIGRhIGRpZXNlIEZ1bmt0aW9uIGF1Y2ggZGFzIFVJRDwtPk1hZ2llci1Mb29rdXAgbG9lc2NodCwgZGFyZiBkYXMgbmljaHQKKyAgLy8gamVkZXIgcnVmZW4uCisgIGlmIChleHRlcm5fY2FsbCgpICYmCisgICAgICBjYWxsX3NlZnVuKCJzZWN1cmVfbGV2ZWwiKSA8IEVMREVSX0xWTCkKKyAgICAgIHJldHVybiAtMTsKKyAgdXNlcmlkcz0oW10pOworICBjbGVhcl9jYWNoZSgpOworICByZXR1cm4gMTsKK30KKworLy92ZXJzdG9yYmVuZSBTcGllbGVyIGF1Zmxpc3Rlbgorc3RyaW5nIGxpc3RfbGF0ZV9wbGF5ZXJzKCkKK3sKKyAgc3RyaW5nIHJldDsKKyAgaW50IHNpemUsaTsKKyAgCisgIHJldD0gIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuIjsKKyAgcmV0Kz0iKiAgICAgICBWZXJzdG9yYmVuZSBTcGllbGVyICAgICAgICAqXG4iOworICByZXQrPSIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiI7CisgIAorICBpZighbGF0ZXBsYXllcnMgfHwgKHNpemU9c2l6ZW9mKGxhdGVwbGF5ZXJzKSk9PTApCisgIHsKKyAgICByZXR1cm4gcmV0OworICB9CisgIAorICBmb3IoaT0wO2k8c2l6ZTtpKyspCisgIHsKKyAgICByZXQrPWxhdGVwbGF5ZXJzW2ldKyJcbiI7CisgIH0KKyAgCisgIHJldHVybiByZXQ7Cit9CisKKy8vIGlzdCBkZXIgU3BpZWxlciBnZXN0b3JiZW4/CitpbnQgY2hlY2tfbGF0ZV9wbGF5ZXIoc3RyaW5nIHN0cikKK3sKKyAgaWYoIWxhdGVwbGF5ZXJzIHx8ICFzdHIgfHwgc3RyPT0iIikKKyAgeworICAgIHJldHVybiAwOworICB9CisgIAorICBpZihtZW1iZXIobGF0ZXBsYXllcnMsc3RyKSE9LTEpCisgIHsKKyAgICByZXR1cm4gMTsKKyAgfQorICAKKyAgcmV0dXJuIDA7Cit9CisKKy8vIGFsbGUgRWludHJhZWdlIGltIHVzZXJjYWNoZSBhdXNnZWJlbgorcHVibGljIG1peGVkICpzaG93X2NhY2hlKCkgeworICAgIHJldHVybiBtX2luZGljZXModXNlcmxpc3QpOworfQorCisvLyBnaWJ0IGVzIHNvIGVpbmVuIFVzZXI/IEFuZnJhZ2UgYXVzc2VyZGVtIGltbWVyIGluIGRlbiBDYWNoZSBlaW50cmFnZW4KK3B1YmxpYyBpbnQgZmluZF91c2VyaW5mbyhzdHJpbmcgdXNlcikgeworICBzdHJpbmcgZmlsZTsKKyAgaW50IGk7CisgIGlmICghc3RyaW5ncCh1c2VyKSB8fCAhc2l6ZW9mKHVzZXIpIAorICAgICAgfHwgbWVtYmVyKHVzZXIsJyAnKSE9LTEgfHwgbWVtYmVyKHVzZXIsJzonKSE9LTEpCisgICAgcmV0dXJuIDA7CisgIGlmICghbWVtYmVyKHVzZXJsaXN0LHVzZXIpKSB7CisgICAgICAvL2Vyc3RtYWwgc2NoYXVlbiwgb2Igd2lyIG1pdCBlaW5lbSBuZXVlbiBFaW50cmFnIG5pY2h0IGRpZSBtYXguCisgICAgICAvL01hcHBpbmctR3JvZXNzZW4gdWViZXJzY2hyZWl0ZW4sIHdlbm4gamEsIGVpbmVuIEVpbnRyYWcgbG9lc2NoZW4KKyAgICAgIC8vQlRXOiB3aWR0aG9mKCkrMSBpc3QgcmljaHRpZyBzby4KKyAgICAgIC8vQlRXMjogSWNoIGhvZmZlLCBkaWUgbWF4LiBBcnJheWdyb2Vzc2UgaXN0IGltbWVyIGdyb3NzIGdlbnVnLCBzb2xsdGUgCisgICAgICAvL3NpZSBhYmVyIHNlaW4gYmVpIG5lciBNYXBwaW5nYnJlaXRlIHZvbiAxMC4KKyAgICAgIC8vIEJUVzM6IERpZXNlcyBSYXVzbG9lc2NoZW4gdm9uIGVpbmVtIEVpbnRyYWcgYmVpIEVycmVpY2hlbiBkZXIgR3JlbnplCisgICAgICAvLyBlcmhvZWh0IGRpZSBiZW5vZXRpZ3RlbiBUaWNrcyBmdWVyIGRpZXNlIEZ1bmt0aW9uIHVtIGRhcyA1LTZmYWNoZSB1bmQKKyAgICAgIC8vIGRpZSBub2V0aWdlIFplaXQgdW0gZGFzIDcwZmFjaGUuIERhaGVyIHdpcmQgZGVyIENhY2hlIGJlaSBFcnJlaWNoZW4KKyAgICAgIC8vIGRlciBHcmVuemUgamV0enQgZWluZmFjaCBnZWxvZXNjaHQuCisgICAgICBpZiAoICggKGk9c2l6ZW9mKHVzZXJsaXN0KSsxKSA+PSBfX01BWF9NQVBQSU5HX0tFWVNfXykgCisgICAgICAgICAgfHwgKCggaSAqICh3aWR0aG9mKHVzZXJsaXN0KSsxKSkgPgorICAgICAgICAgICAgICAgICBfX01BWF9NQVBQSU5HX1NJWkVfXykpICAgIAorICAgICAgICAgIC8vbV9kZWxldGUodXNlcmxpc3QsbV9pbmRpY2VzKHVzZXJsaXN0KVswXSk7CisgICAgICAgICAgdXNlcmxpc3Q9bV9hbGxvY2F0ZSgxLHdpZHRob2YodXNlcmxpc3QpKTsKKworICAgICAgLy8gVXNlcnNhdmVmaWxlIGZpbmRlbgorICAgICAgaWYgKChmaWxlPXNlY3VyZV9zYXZlZmlsZSh1c2VyKSk9PSIiKSB7CisgICAgICAgIC8vIFVzZXIgZ2lidCBlcyBuaWNodCwgYWJlciBBbmZyYWdlIGNhY2hlbgorICAgICAgICAgIHVzZXJsaXN0Kz0oW3VzZXI6ICJOUCI7IC0xOyAoe30pOyAiTE9DS0VEIjsgLTE7IHRpbWUoKTsgIiI7ICIiOyAiIjsKKyAgICAgICAgICAoe30pOyIiOyIiOyAwIF0pOworICAgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgICAgcGFzc3dvcmQ9IiI7CisgICAgICBlcD0iIjsKKyAgICAgIGVrPSIiOworICAgICAgbXE9IiI7CisgICAgICBndWlsZHM9KHt9KTsKKyAgICAgIGVrdGlwcz0iIjsKKyAgICAgIGZwdGlwcz0iIjsKKyAgICAgIHVpZHN0b3Rha2VjYXJlPTA7CisgICAgICBpZiAoIXJlc3RvcmVfb2JqZWN0KGZpbGUpKSByZXR1cm4gMDsKKyAgICAgIHVzZXJsaXN0Kz0oW3VzZXI6IHBhc3N3b3JkOyBsZXZlbDsgZG9tYWluczsgc2hlbGw7IGNyZWF0aW9uX2RhdGU7IAorICAgICAgICAgIHRpbWUoKTtlcDsgZWs7IG1xOyBndWlsZHM7IGVrdGlwczsgZnB0aXBzOyB1aWRzdG90YWtlY2FyZV0pOworICAgICAgLy8gZGllIHNwZXppZWxsZW4gVUlEcywgZnVlciBkaWUgZGllc2VyIE1hZ2llciB6dXN0YWVuZGlnIGlzdCwgZXJtaXR0ZW4KKyAgICAgIC8vIHVuZCBnbGVpY2h6ZWl0aWcgaW0gZW50c3ByZWNoZW5kZW4gTWFwcGluZyBmdWVycyBSZXZlcnNlLUxvb3B1cAorICAgICAgLy8gc3BlaWNoZXJuLgorICAgICAgaWYgKGxldmVsID49IExFQVJORVJfTFZMKQorICAgICAgICBRdWVyeVVJRHNGb3JXaXphcmQodXNlcik7CisgIH0KKyAgdXNlcmxpc3RbdXNlcixVU0VSX1RPVUNIXT10aW1lKCk7CisgIGlmICh1c2VybGlzdFt1c2VyLFVTRVJfTEVWRUxdPT0tMSkgcmV0dXJuIDA7CisgIHJldHVybiAxOworfQorCisvLyBEYXRlbiBhdXMgZGVyIFVzZXJsaXN0IGZ1ZXIgZGllc2VuIFVzZXIgbGllZmVybi4gTWFjaHQgZ2dmLiBmaW5kX3VzZXJpbmZvKCkKK3B1YmxpYyBtaXhlZCAqZ2V0X3VzZXJpbmZvKHN0cmluZyB1c2VyKSB7CisgIGlmKCF1c2VyfHx1c2VyPT0iIikKKyAgICByZXR1cm4gMDsKKyAgdXNlcj1leHBsb2RlKHVzZXIsIi4iKVswXTsKKyAgaWYgKCFtZW1iZXIodXNlcmxpc3QsdXNlcikgJiYgIWZpbmRfdXNlcmluZm8odXNlcikpCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKHVzZXJsaXN0W3VzZXIsVVNFUl9MRVZFTF09PS0xKSByZXR1cm4gMDsKKworICByZXR1cm4oe3VzZXIsIiMjIit1c2VyLHVzZXJsaXN0W3VzZXIsVVNFUl9MRVZFTF0sCisgICAgICB1c2VybGlzdFt1c2VyLFVTRVJfRE9NQUlOXSwgdXNlcmxpc3RbdXNlcixVU0VSX09CSkVDVF0sCisgICAgICB1c2VybGlzdFt1c2VyLFVTRVJfQ1JFQVRJT05fREFURV0sIDAsIDAsCisgICAgICB1c2VybGlzdFt1c2VyLFVTRVJfR1VJTERdLAorICAgICAgdXNlcmxpc3RbdXNlcixVU0VSX0VLVElQU10sdXNlcmxpc3RbdXNlcixVU0VSX0ZQVElQU10sCisgICAgICB1c2VybGlzdFt1c2VyLFVTRVJfVUlEU19UT19UQUtFX0NBUkVdfSk7Cit9CisKKy8vIGxpZWZlcnQgZGFzIE9iamVrdCBkZXMgdXNlcnMgYXVzIGRlciBVc2VybGlzdCB6dXJ1ZWNrLgorcHVibGljIHN0cmluZyBxdWVyeV9wbGF5ZXJfb2JqZWN0KCBzdHJpbmcgbmFtZSApCit7CisgIG1peGVkICp1c2VyZW50cnk7CisgIGlmKCAhZmluZF91c2VyaW5mbyhuYW1lKSApIHJldHVybiAiIjsKKyAgcmV0dXJuIHVzZXJsaXN0W25hbWUsVVNFUl9PQkpFQ1RdOworfQorCisvLyBQYXNzd29ydCBvaz8KK3B1YmxpYyBpbnQgZ29vZF9wYXNzd29yZCggc3RyaW5nIHN0ciwgc3RyaW5nIG5hbWUgKQoreworICAgIHN0cmluZyBydHM7CisgICAgaW50IGksIG47CisKKyAgICBpZiAoIHN0clswXSA9PSAnIScgKXsKKyAgICAgICAgdGVsbF9vYmplY3QoIHRoaXNfcGxheWVyKCkgfHwgdGhpc19vYmplY3QoKSwgIkVpbiBBdXNydWZ1bmdzemVpY2hlbiAiCisgICAgICAgICAgICAgICAgICAgICAiKCchJykgYWxzIGVyc3RlciBCdWNoc3RhYmUgZGVzIFBhc3N3b3J0ZXMgd3VlcmRlIHp1XG4iCisgICAgICAgICAgICAgICAgICAgICAiUHJvYmxlbWVuIGZ1ZWhyZW4uIFN1Y2ggRGlyIGJpdHRlIGVpbiBhbmRlcmVzIFBhc3N3b3J0ICIKKyAgICAgICAgICAgICAgICAgICAgICJhdXMuXG4iICk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmICggc2l6ZW9mKHN0cikgPCA2ICl7CisgICAgICAgIHRlbGxfb2JqZWN0KCB0aGlzX3BsYXllcigpIHx8IHRoaXNfb2JqZWN0KCksCisgICAgICAgICAgICAgICAgICAgICAiRGFzIFBhc3N3b3J0IG11c3Mgd2VuaWdzdGVucyA2IFplaWNoZW4gbGFuZyBzZWluLlxuIiApOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBzdHIgPSBsb3dlcl9jYXNlKHN0cik7CisgICAgcnRzID0gIiI7CisKKyAgICAvLyBaYWhsZW4vU29uZGVyemVpY2hlbiBhbSBBbmZhbmcgb2RlciBFbmRlIGRlcyBQYXNzd29ydGVzCisgICAgLy8gKHouQi4gIm1lcmxpbjk5Iikgc2luZCBuaWNodCB3aXJrbGljaCBlaW5mYWxsc3JlaWNoLgorICAgIHdoaWxlICggc2l6ZW9mKHN0cikgJiYgKHN0clswXSA+ICd6JyB8fCBzdHJbMF0gPCAnYScpICl7CisgICAgICAgIHJ0cyArPSBzdHJbMC4uMF07CisgICAgICAgIHN0ciA9IHN0clsxLi5dOworICAgIH0KKworICAgIHdoaWxlICggc2l6ZW9mKHN0cikgJiYgKHN0cls8MV0gPiAneicgfHwgc3RyWzwxXSA8ICdhJykgKXsKKyAgICAgICAgcnRzICs9IHN0cls8MS4uXTsKKyAgICAgICAgc3RyID0gc3RyWzAuLjwyXTsKKyAgICB9CisKKyAgICAvLyBBbnphaGwgdW50ZXJzY2hpZWRsaWNoZXIgWmVpY2hlbiBtZXJrZW4sIGRpZSBoZXJhdXNnZXNjaG5pdHRlbiB3dXJkZW4KKyAgICBuID0gc2l6ZW9mKCBta21hcHBpbmcoZWZ1bjo6ZXhwbG9kZSggcnRzLCAiIiApKSApOworICAgIHJ0cyA9ICIiOworCisgICAgZm9yICggaSA9IHNpemVvZihzdHIpOyBpLS07ICkKKyAgICAgICAgcnRzICs9IHN0cltpLi5pXTsKKworICAgIC8vIEVpZ2VuZXIgTmFtZSBhbHMgUGFzc3dvcnQgYnp3LiBlaWdlbmVyIE5hbWUgcnVlY2t3YWVydHMKKyAgICBpZiAoIHN0ciA9PSBsb3dlcl9jYXNlKG5hbWUpIHx8IHJ0cyA9PSBsb3dlcl9jYXNlKG5hbWUpIHx8CisgICAgICAgICAvLyBOYW1lIGVpbmVzIGFuZGVyZW4gTXVkZGVycyAoRXJzdGllPykKKyAgICAgICAgIHNlY3VyZV9zYXZlZmlsZShzdHIpICE9ICIiIHx8IHNlY3VyZV9zYXZlZmlsZShydHMpICE9ICIiIHx8CisgICAgICAgICAvLyBOYW1lIHZvbiBkZXIgQmFuaXNoLUxpc3RlCisgICAgICAgICBRdWVyeUJhbmlzaGVkKHN0cikgfHwgUXVlcnlCYW5pc2hlZChydHMpIHx8CisgICAgICAgICAvLyBOYW1lIGVpbmVzIHZvcmhhbmRlbmVuIE5QQyBvLmFlLgorICAgICAgICAgY2FsbF9zZWZ1bigiZmluZF9saXZpbmciLCBzdHIgKSB8fAorICAgICAgICAgY2FsbF9zZWZ1bigiZmluZF9saXZpbmciLCBydHMgKSB8fAorICAgICAgICAgLy8gWnV3ZW5pZyB2ZXJzY2hpZWRlbmUgWmVpY2hlbgorICAgICAgICAgc2l6ZW9mKCBta21hcHBpbmcoZWZ1bjo6ZXhwbG9kZSggc3RyLCAiIiApKSApICsgbiA8IDQgKXsKKyAgICAgICAgdGVsbF9vYmplY3QoIHRoaXNfcGxheWVyKCkgfHwgdGhpc19vYmplY3QoKSwKKyAgICAgICAgICAgICAgICAgICAgICJEYXMgUGFzc3dvcnQgd2FlcmUgenUgZWluZmFjaCB6dSBlcnJhdGVuLiBOaW1tIGJpdHRlICIKKyAgICAgICAgICAgICAgICAgICAgICJlaW4gYW5kZXJlcy5cbiIgKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcmV0dXJuIDE7Cit9CisKKy8vIFVzZXItSUQgZnVlciBlaW4gRmlsZSBlcm1pdHRlbG4uCitwdWJsaWMgc3RyaW5nIGdldF93aXpfbmFtZShzdHJpbmcgZmlsZSkgeworICAgIHJldHVybiBjcmVhdG9yX2ZpbGUoZmlsZSk7Cit9CisKKy8vIFdpemxldmVsIGF1cyBkZW0gVXNlcmluZm8tQ2FjaGUgaG9sZW4KK3B1YmxpYyBpbnQgZ2V0X3dpel9sZXZlbChzdHJpbmcgdXNlcikgeworICBpZiAodXNlciAmJiBmaW5kX3VzZXJpbmZvKHVzZXIpKSAKKyAgICByZXR1cm4gdXNlcmxpc3RbdXNlcixVU0VSX0xFVkVMXTsKKyAgLy9yZXR1cm4gMCBpZiBubyB1c2VyIGdpdmVuIChyZXR1cm4gdHlwZSBuZWVkZWQpCisgIHJldHVybigwKTsKK30KKworLy8gV2l6bGV2ZWwgZnVlciBlaW5lIFVJRCBlcm1pdHRlbG4uCitwdWJsaWMgaW50IHF1ZXJ5X3dpel9sZXZlbCggbWl4ZWQgcGxheWVyICkKK3sKKyAgICBpZiAoIG9iamVjdHAocGxheWVyKSAmJiBlZnVuOjpvYmplY3RfaW5mbyhwbGF5ZXIsIE9JX09OQ0VfSU5URVJBQ1RJVkUpICkKKyAgICAgICAgcmV0dXJuIGdldF93aXpfbGV2ZWwoIGdldHVpZChwbGF5ZXIpICk7CisgICAgZWxzZSB7CisgICAgICAgIC8vIGVyc3RtYWwgVUlEIGVybWl0dGVsbiwgZmFsbHMgT2JqZWt0CisgICAgICAgIC8vaWYgKG9iamVjdHAocGxheWVyKSkKKyAgICAgICAgLy8gICAgcGxheWVyPWdldHVpZChwbGF5ZXIpOworICAgICAgICBpZiAoIHN0cmluZ3AocGxheWVyKSApIHsKKyAgICAgICAgICAgIGlmKCBwbGF5ZXJbMC4uMV09PURPTUFJTkRJUiIuIiApIHJldHVybiAyNTsKKyAgICAgICAgICAgIGlmKCBwbGF5ZXJbMC4uNV09PUdVSUxESUQiLiIgKSAKKyAgICAgICAgICAgICAgICByZXR1cm4gV0laTFZMU1tHVUlMRElEXTsKKyAgICAgICAgICAgIGlmKCBwbGF5ZXJbMC4uMV09PVBST0pFQ1RESVIiLiIgKSByZXR1cm4gMjE7CisgICAgICAgICAgICAvLyBkaWUgYWx0ZSBMb2VzdW5nIG1pdCB8fCB2ZXJoYWVsdCBzaWNoIGZhbHNjaCwgd2VubiBlaW4gVUlEIG5lCisgICAgICAgICAgICAvLyBzcGV6aWVsbGUgaXN0LCBkZXIgTGV2ZWwgMCB6dWdlb3JkbmV0IHd1cmRlIHVuZCBlcyBlaW5lbgorICAgICAgICAgICAgLy8gU3BpZWxlciBtaXQgZGllc2VtIG5hbWVuIGdpYnQuCisgICAgICAgICAgICBpZiAobWVtYmVyKFdJWkxWTFMscGxheWVyKSkgCisgICAgICAgICAgICAgICAgcmV0dXJuKFdJWkxWTFNbcGxheWVyXSk7CisgICAgICAgICAgICByZXR1cm4gZ2V0X3dpel9sZXZlbChwbGF5ZXIpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvLyBTYXZlZmlsZSBhdXMgL3NlY3VyZS9zYXZlKiB6dXJ1ZWNrbGllZmVybgorcHVibGljIHN0cmluZyBzZWN1cmVfc2F2ZWZpbGUoc3RyaW5nIG5hbWUpCit7CisgIGlmKCFuYW1lfHxuYW1lPT0iIikKKyAgICByZXR1cm4gIiI7CisgIG5hbWU9ZXhwbG9kZShuYW1lLCIuIilbMF07CisgIGlmIChmaWxlX3NpemUoU0VDVVJFU0FWRVBBVEgrbmFtZVswLi4wXSsiLyIrbmFtZSsiLm8iKT49MCkKKyAgICByZXR1cm4gU0VDVVJFU0FWRVBBVEgrbmFtZVswLi4wXSsiLyIrbmFtZTsKKworICByZXR1cm4gIiI7Cit9CisKKy8vICoqKioqKioqKioqKioqKiAnaGFsYi1vZWZmZW50bGljaGUgRnVua3Rpb25lbiAqKioqKioqKioqKioqKioqKioqKioKKyNpZmRlZiBfUFVSRUZUUERfCisvLyBGVFAtQmVyZWNodGlndW5nIGZ1ZXIgTWFnaWVyCitpbnQgdXBkYXRlX2Z0cF9hY2Nlc3Moc3RyaW5nIHVzZXIsIGludCBzdGF0ZSkgeworICAvLyB3ZW5uIG5pY2h0IEVNKyBvZGVyIFJPT1QsIGRhcmYgbnVyIGZ1ZXIgdGhpc19pbnRlcmFjdGl2ZSBnZWFlbmRlcnQKKyAgLy8gd2VyZGVuLgorICBpZiAoZ2V0dWlkKFBPKSAhPSBST09USUQgJiYgZXh0ZXJuX2NhbGwoKQorICAgICAgJiYgIUFSQ0hfU0VDVVJJVFkpIHsKKyAgICBpZiAodGhpc19pbnRlcmFjdGl2ZSgpKQorICAgICAgdXNlciA9IGdldHVpZCh0aGlzX2ludGVyYWN0aXZlKCkpOworICAgIGVsc2UKKyAgICAgIHVzZXIgPSAwOworICB9CisgIGlmICghdXNlciB8fCAhc2l6ZW9mKHVzZXIpKQorICAgIHJldHVybiAtMTsKKworICBpZiAoIWZpbmRfdXNlcmluZm8odXNlcikpCisgICAgcmV0dXJuIDA7CisKKyAgLy8gUGFzc3dvcnQgbXVzcyBtYW51ZWxsIHZvbSBNYWdpZXIgbmV1IGdlc2V0enQgd2VyZGVuLCBkYSBlcyBrZWluZQorICAvLyBNb2VnbGljaGtlaXQgZ2lidCwgYW4gZGFzIGFrdHVlbGxlIGltIEtsYXJ0ZXh0IGhlcmFuenVrb21tZW4uCisgIGlmIChzdGF0ZSkgeworICAgIGlmICghbWVtYmVyKGZ0cHVzZXIsdXNlcikpCisgICAgICBtX2FkZChmdHB1c2VyLCB1c2VyLCAiKiIpOworICB9CisgIGVsc2UKKyAgICBtX2RlbGV0ZShmdHB1c2VyLCB1c2VyKTsKKyAgCisgIGNhbGxfb3V0KCMnd3JpdGVfZnRwX3VzZXJzLCA0KTsKKyAgcmV0dXJuIHN0YXRlOworfQorI2VuZGlmCisKKy8vIFNwaWVsZXIgZWluIG5ldWVzIFdpemxldmVsIHZlcnBhc3Nlbi4KK2ludCB1cGRhdGVfd2l6X2xldmVsKHN0cmluZyB1c2VyLGludCBsZXYpIHsKKyAgb2JqZWN0IG9iOworCisgIGlmIChnZXR1aWQoUE8pICE9IFJPT1RJRCAmJiBleHRlcm5fY2FsbCgpKSByZXR1cm4gMDsKKyAgaWYgKCFmaW5kX3VzZXJpbmZvKHVzZXIpKSByZXR1cm4gMDsKKyAgdXNlcmxpc3RbdXNlcixVU0VSX0xFVkVMXSA9IGxldjsKKyAgc2F2ZV91c2VyaW5mbyh1c2VyKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vIG5ldWUgRm9yc2NoZXJwdW5rdGUgZnVlciBkZW4gVXNlciBhYnNwZWljaGVybi4KK2ludCB1cGRhdGVfZXAoc3RyaW5nIHVzZXIsc3RyaW5nIGVwX25ldSkgeworICBpZiAoZ2V0dWlkKFBPKSAhPSBST09USUQpIHJldHVybiAwOworICBpZiAoIWZpbmRfdXNlcmluZm8odXNlcikpIHJldHVybiAwOworICB1c2VybGlzdFt1c2VyLFVTRVJfRVBdID0gZXBfbmV1OworICBzYXZlX3VzZXJpbmZvKHVzZXIpOworICByZXR1cm4gMTsKK30KKworLy8gbmV1ZSBFcnN0a2lsbHMgZnVlciBkZW4gVXNlciBhYnNwZWljaGVybi4KK2ludCB1cGRhdGVfZWsoc3RyaW5nIHVzZXIsc3RyaW5nIGVrX25ldSkgeworICBpZiAoZ2V0dWlkKFBPKSAhPSBST09USUQpIHJldHVybiAwOworICBpZiAoIWZpbmRfdXNlcmluZm8odXNlcikpIHJldHVybiAwOworICB1c2VybGlzdFt1c2VyLFVTRVJfRUtdID0gZWtfbmV1OworICBzYXZlX3VzZXJpbmZvKHVzZXIpOworICByZXR1cm4gMTsKK30KKworLy8gTWluaXF1ZXN0ZGF0ZW4gc3BlaWNoZXJuLgoraW50IHVwZGF0ZV9tcShzdHJpbmcgdXNlcixzdHJpbmcgbXFfbmV1KSB7CisgIGlmIChnZXR1aWQoUE8pICE9IFJPT1RJRCkgcmV0dXJuIDA7CisgIGlmICghZmluZF91c2VyaW5mbyh1c2VyKSkgcmV0dXJuIDA7CisgIHVzZXJsaXN0W3VzZXIsVVNFUl9NUV0gPSBtcV9uZXU7CisgIHNhdmVfdXNlcmluZm8odXNlcik7CisgIHJldHVybiAxOworfQorCisvLyBFcnN0a2lsbHB1bmt0LVRpcHMgc3BlaWNoZXJuLgoraW50IHVwZGF0ZV9la3RpcHMoc3RyaW5nIHVzZXIsc3RyaW5nIGVrX25ldSkgeworICBpZiAoZ2V0dWlkKFBPKSAhPSBST09USUQpIHJldHVybiAwOworICBpZiAoIWZpbmRfdXNlcmluZm8odXNlcikpIHJldHVybiAwOworICB1c2VybGlzdFt1c2VyLFVTRVJfRUtUSVBTXSA9IGVrX25ldTsKKyAgc2F2ZV91c2VyaW5mbyh1c2VyKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vIEZvcnNjaGVycHVua3R0aXBzIGFic3BlaWNoZXJuLgoraW50IHVwZGF0ZV9mcHRpcHMoc3RyaW5nIHVzZXIsc3RyaW5nIGZwX25ldSkgeworICBpZiAoZ2V0dWlkKFBPKSAhPSBST09USUQpIHJldHVybiAwOworICBpZiAoIWZpbmRfdXNlcmluZm8odXNlcikpIHJldHVybiAwOworICB1c2VybGlzdFt1c2VyLFVTRVJfRlBUSVBTXSA9IGZwX25ldTsKKyAgc2F2ZV91c2VyaW5mbyh1c2VyKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vIGZvcnNjaGVycHVua3RlIGFiZnJhZ2VuLgorc3RyaW5nIHF1ZXJ5X2VwKHN0cmluZyB1c2VyKSB7CisgIGlmIChnZXR1aWQoUE8pICE9IFJPT1RJRCkgcmV0dXJuIDA7CisgIGlmICghZmluZF91c2VyaW5mbyh1c2VyKSkgcmV0dXJuIDA7CisgIHJldHVybiB1c2VybGlzdFt1c2VyLFVTRVJfRVBdOworfQorCisvLyBFcnN0a2lsbHMgYWJmcmFnZW4KK3N0cmluZyBxdWVyeV9layhzdHJpbmcgdXNlcikgeworICBpZiAoZ2V0dWlkKFBPKSAhPSBST09USUQpIHJldHVybiAwOworICBpZiAoIWZpbmRfdXNlcmluZm8odXNlcikpIHJldHVybiAwOworICByZXR1cm4gdXNlcmxpc3RbdXNlcixVU0VSX0VLXTsKK30KKworLy8gTWluaXF1ZXN0cyBhYmZyYWdlbi4KK3N0cmluZyBxdWVyeV9tcShzdHJpbmcgdXNlcikgeworICBpZiAoZ2V0dWlkKFBPKSAhPSBST09USUQpIHJldHVybiAwOworICBpZiAoIWZpbmRfdXNlcmluZm8odXNlcikpIHJldHVybiAwOworICByZXR1cm4gdXNlcmxpc3RbdXNlcixVU0VSX01RXTsKK30KKworLy8gRUstVGlwcyBhYmZyYWdlbi4KK3N0cmluZyBxdWVyeV9la3RpcHMoc3RyaW5nIHVzZXIpIHsKKyAgaWYgKGdldHVpZChQTykgIT0gUk9PVElEKSByZXR1cm4gMDsKKyAgaWYgKCFmaW5kX3VzZXJpbmZvKHVzZXIpKSByZXR1cm4gMDsKKyAgcmV0dXJuIHVzZXJsaXN0W3VzZXIsVVNFUl9FS1RJUFNdOworfQorCisvLyBGUC1UaXBzIGFiZnJhZ2VuLgorc3RyaW5nIHF1ZXJ5X2ZwdGlwcyhzdHJpbmcgdXNlcikgeworICBpZiAoZ2V0dWlkKFBPKSAhPSBST09USUQpIHJldHVybiAwOworICBpZiAoIWZpbmRfdXNlcmluZm8odXNlcikpIHJldHVybiAwOworICByZXR1cm4gdXNlcmxpc3RbdXNlcixVU0VSX0ZQVElQU107Cit9CisKKyNkZWZpbmUgUExBWUVSU0hFTExTICh7Ii9zdGQvc2hlbGxzL2RhcmtlbGYiLCAiL3N0ZC9zaGVsbHMvZHdhcmYiLCBcCisgICAgIi9zdGQvc2hlbGxzL2VsZiIsICIvc3RkL3NoZWxscy9mZWxpbmUiLCAiL3N0ZC9zaGVsbHMvaG9iYml0IiwgXAorICAgICIvc3RkL3NoZWxscy9odW1hbiIgfSkKKworLy8gQWVuZGVydCBkaWUgU2hlbGxzIGVpbmVzIFVzZXJzLgoraW50IHNldF9wbGF5ZXJfb2JqZWN0KCBzdHJpbmcgdXNlciwgc3RyaW5nIG9iamVjdG5hbWUgKQoreworICAgIG1peGVkICpwYXRoOworICAgIHN0cmluZyBwcmV2OworCisgICAgLy8gbnVyIEVNIHVuZCBST09UIGR1ZXJmZW4gZGllIFNoZWxsIGVpbmVzIENoYXJha3RlcnMgYWVuZGVybgorICAgIGlmICggIUFSQ0hfU0VDVVJJVFkgJiYKKyAgICAgICAgICghcHJldmlvdXNfb2JqZWN0KCkgfHwgZ2V0dWlkKHByZXZpb3VzX29iamVjdCgpKSAhPSBST09USUQpICkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKCBvYmplY3RuYW1lID09ICIiICkKKyAgICAgICAgb2JqZWN0bmFtZSA9IDA7CisKKyAgICBpZiAoICFzdHJpbmdwKHVzZXIpIHx8IHVzZXIgPT0gIiIgKQorICAgICAgICByZXR1cm4gLTY7CisKKyAgICBpZiAoICFzdHJpbmdwKG9iamVjdG5hbWUpICl7CisgICAgICAgIGlmICggIWZpbmRfdXNlcmluZm8odXNlcikgKQorICAgICAgICAgICAgcmV0dXJuIC00OworCisgICAgICAgIHVzZXJsaXN0W3VzZXIsIFVTRVJfT0JKRUNUXSA9IDA7CisgICAgICAgIHNhdmVfdXNlcmluZm8odXNlcik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIGlmICggY2F0Y2gobG9hZF9vYmplY3Qob2JqZWN0bmFtZSk7cHVibGlzaCkgKSB7CisgICAgICAgIHdyaXRlKCAiRmVobGVyIGluICIgKyBvYmplY3RuYW1lICsgIiFcbiIgKTsKKyAgICAgICAgcmV0dXJuIC0yOworICAgIH0KKworICAgIG9iamVjdG5hbWUgPSBfZ2V0X3BhdGgoIG9iamVjdG5hbWUsIDAgKTsKKyAgICBwYXRoID0gKGVmdW46OmV4cGxvZGUoIG9iamVjdG5hbWUsICIvIiApIC0gKHsgIiIsIDAgfSkpOworCisgICAgaWYgKCBzaXplb2YocGF0aCkgPCAzIHx8IHBhdGhbMF0gIT0gInN0ZCIgfHwgcGF0aFsxXSAhPSAic2hlbGxzIiApCisgICAgICAgIHJldHVybiAtMzsKKworICAgIGlmICggIWZpbmRfdXNlcmluZm8odXNlcikgKQorICAgICAgICByZXR1cm4gLTQ7CisKKyAgICBwcmV2ID0gdXNlcmxpc3RbdXNlciwgVVNFUl9PQkpFQ1RdOworICAgIHVzZXJsaXN0W3VzZXIsIFVTRVJfT0JKRUNUXSA9IG9iamVjdG5hbWU7CisgICAgc2F2ZV91c2VyaW5mbyh1c2VyKTsKKworICAgIC8vIExvZ2dlbiwgZmFsbHMgZGllIEFlbmRlcnVuZyBuaWNodCB2b24gTG9naW4gYmVpbSBBbmxlZ2VuIGRlcyBDaGFycworICAgIC8vIGVyZm9sZ3QuCisgICAgaWYgKGxvYWRfbmFtZSh0aGlzX2ludGVyYWN0aXZlKCkpICE9ICIvc2VjdXJlL2xvZ2luIgorICAgICAgICB8fCBwcmV2ICE9ICIiKSB7CisgICAgICBpZiAocHJldiA9PSAiIikgcHJldiA9IjxrZWluZT4iOworICAgICAgY2FsbF9zZWZ1bigibG9nX2ZpbGUiLCAiQVJDSC9TSEVMTF9BRU5ERVJVTkdFTiIsCisgICAgICAgIHNwcmludGYoICIlczogJU8gYWVuZGVydCBkaWUgU2hlbGwgdm9uICVzIHZvbiAlcyBhdWYgJXMgKFBPOiAlTylcbiIsCisgICAgICAgICAgc3RyZnRpbWUoIiVZJW0lZC0lSCVNJVMiKSwgCisgICAgICAgICAgdGhpc19pbnRlcmFjdGl2ZSgpLCBjYXBpdGFsaXplKHVzZXIpLCBwcmV2LCBvYmplY3RuYW1lLAorICAgICAgICAgIHByZXZpb3VzX29iamVjdCgpKSApOworICAgIH0KKworICAgIHJldHVybiAxOworfQorCisvLyBQYXNzd29ydCBha3R1YWxpc2llcmVuLgoraW50IHVwZGF0ZV9wYXNzd29yZCggc3RyaW5nIG9sZCwgc3RyaW5nIG5ldyApCit7CisgICAgc3RyaW5nIHVzZXI7CisKKyAgICAvLyBuYW51LCBrZWluIHVzZXI/CisgICAgaWYgKCAhZmluZF91c2VyaW5mbyh1c2VyID0gZ2V0dWlkKFBPKSkgKQorICAgICAgICByZXR1cm4gMDsKKworICAgIC8vIHdlbm4gZGFzIG5ldWUgUFcgdW50ZXJzY2hpZWRsaWNoIGlzdCwgc2NoYXVlbiwgb2IgZGFzIG5ldWUgUFcgb2sgaXN0LgorICAgIGlmICggb2xkICE9IG5ldyAmJiAhZ29vZF9wYXNzd29yZCggbmV3LCB1c2VyICkgKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHN0cmluZyBwd2hhc2ggPSB1c2VybGlzdFt1c2VyLCBVU0VSX1BBU1NXT1JEXTsKKyAgICBzdHJpbmcgb2xkcHdoYXNoOworICAgIGlmIChzaXplb2YocHdoYXNoKSA+IDEzKSB7CisgICAgICAgIC8vIE1ENS1IYXNoCisgICAgICAgIG9sZHB3aGFzaCA9IG1kNV9jcnlwdChvbGQsIHB3aGFzaCk7CisgICAgfQorICAgIGVsc2UgaWYgKHNpemVvZihwd2hhc2gpID4gMikgeworICAgICAgICAvLyBDcnlwdC1IYXNoCisgICAgICAgIG9sZHB3aGFzaCA9IGNyeXB0KG9sZCwgcHdoYXNoWzAuLjFdKTsKKyAgICB9CisKKyAgICAvLyB3ZW5uIGVzIGVpbmVuIFBXLWhhc2ggZ2lidCwgYWxzbyBlaW4gUFcgZ2VzZXR6dCB3aXJkLCBtdXNzIGRlciBIYXNoIHZvbgorICAgIC8vIG9sZCBtaXQgZGVtIHB3aGFzaCB1ZWJlcmVpbnN0aW1tZW4uIExlZXJlciBIYXNoIG9kZXIgZ2FyIGtlaW4gSGFzaAorICAgIC8vIGVybGF1YnQgamVkZXMgYmVsaWViaWdlIFBXLgorICAgIGlmICggc3RyaW5ncChwd2hhc2gpICYmIHNpemVvZihwd2hhc2gpICYmIHB3aGFzaCAhPSBvbGRwd2hhc2gpCisgICAgICAgIHJldHVybiAwOworICAgIC8vIGFuIGRpZXNlciBTdGVsbGUgc3RpbW10ICdvbGQnIHdvaGwgbWl0IGRlbSBnZXNldHp0ZW4gUGFzc3dvcnQgdWViZXJlaW4uCisgICAgLy8gV2VubiBhbGxlcmRpbmdzIGRpZSBGdW5rdGlvbiBtaXQgb2xkPT1uZXcgYXVmZ2VydWZlbiB3dXJkZSwgd2lyZCBoaWVyCisgICAgLy8gbnVyIDEgenVydWVja2dlYmVuIHVuZCBzb25zdCBhbiBzaWNoIG5peCBnZW1hY2h0LiBLYW5uIG5pY2h0IHdlaXRlcgorICAgIC8vIG9iZW4gc2Nob24gZ2VtYWNodCB3ZXJkZW4sIGRpZSBTaGVsbHMgZGllcyBhbHMgUFctUHJ1ZWZ1bmcgbnV0emVuLgorICAgIC8vICpzZXVmeioKKyAgICBpZiAob2xkID09IG5ldykgcmV0dXJuIDE7CisKKyAgICAvLyBkYW5uIG1hbCBuZXUgc2V0emVuCisgICAgdXNlcmxpc3RbIHVzZXIsIFVTRVJfUEFTU1dPUkQgXSA9IG1kNV9jcnlwdCggbmV3LCAwICk7CisgICAgc2F2ZV91c2VyaW5mbyh1c2VyKTsKKyNpZmRlZiBfUFVSRUZUUERfCisgICAgLy8gQmVkYXVlcmxpY2hlcndlaXNlIHZlcnN0ZWh0IHB1cmVmdHBkIHVuc2VyIG1kNV9jcnlwdCBuaWNodC4gOi0oCisgICAgaWYgKG1lbWJlcihmdHB1c2VyLHVzZXIpKSB7CisgICAgICBmdHB1c2VyW3VzZXJdID0gY3J5cHQobmV3KTsKKyAgICAgIGlmIChmaW5kX2NhbGxfb3V0KCMnd3JpdGVfZnRwX3VzZXJzKSA9PSAtMSkKKyAgICAgICAgY2FsbF9vdXQoIyd3cml0ZV9mdHBfdXNlcnMsNCk7CisgICAgfQorI2VuZGlmCisgICAgcmV0dXJuIDE7Cit9CisKKy8vIFNwaWVsZXIgbG9lc2NoZW4uCitpbnQgZGVsZXRlX3BsYXllcihzdHJpbmcgcGFzc3dkLCBzdHJpbmcgcmVhbF9uYW1lKQoreworICBpbnQgd2xldmVsOworICBzdHJpbmcgcGFydF9maWxlbmFtZTsKKworICBpZiAoIVBPIHx8IFBPIT1UUCB8fCBQTyE9VEkgfHwgcmVhbF9uYW1lICE9IGdldHVpZChQTykgfHwKKyAgICAgICFmaW5kX3VzZXJpbmZvKHJlYWxfbmFtZSkpCisgICAgcmV0dXJuIDA7CisgIG1peGVkIGVyc3RpZT0obWl4ZWQpdGhpc19pbnRlcmFjdGl2ZSgpLT5RdWVyeVByb3AoUF9TRUNPTkQpOworICBwYXNzd29yZCA9IHVzZXJsaXN0W3JlYWxfbmFtZSxVU0VSX1BBU1NXT1JEXTsKKyAgd2xldmVsID0gZ2V0X3dpel9sZXZlbChyZWFsX25hbWUpOworICBpZiAoIXVwZGF0ZV9wYXNzd29yZChwYXNzd2QsIHBhc3N3ZCkpIHJldHVybiAwOworCisgIC8vIFNwaWVscGF1c2VuIGF1ZmhlYmVuIChzb25zdCBrYW5uIG1hbiBhbHMgU3BpZWxlciBuZW4gTmFtZW4gc3BlcnJlbikuCisgIFRCYW5pc2hOYW1lKHJlYWxfbmFtZSwgMCk7CisKKyAgcGFydF9maWxlbmFtZT0iLyIrcmVhbF9uYW1lWzAuLjBdKyIvIityZWFsX25hbWUrIi5vIjsKKyAgcm0oIi8iU0VDVVJFRElSIi9zYXZlIitwYXJ0X2ZpbGVuYW1lKTsKKyAgcm0oIi8iTElCU0FWRURJUiIvIitwYXJ0X2ZpbGVuYW1lKTsKKyAgcm0oIi8iTUFJTERJUiIvIitwYXJ0X2ZpbGVuYW1lKTsKKyAgCisgIG1fZGVsZXRlKHVzZXJsaXN0LHJlYWxfbmFtZSk7CisgIAorICBpZiAod2xldmVsID49IExFQVJORVJfTFZMKQorICAgIFRPLT5CYW5pc2hOYW1lKHJlYWxfbmFtZSwgIlNvIGhpZXNzIG1hbCBlaW4gTWFnaWVyIGhpZXIiKTsKKyAgZWxzZSBpZiAod2xldmVsID49IFNFRVJfTFZMKQorICAgIFRPLT5CYW5pc2hOYW1lKHJlYWxfbmFtZSwgIlNvIGhpZXNzIG1hbCBlaW4gU2VoZXIgaGllciIpOworCisjaWZkZWYgX1BVUkVGVFBEXworICAgIGlmIChtZW1iZXIoZnRwdXNlcixyZWFsX25hbWUpKSB7CisgICAgICBtX2RlbGV0ZShmdHB1c2VyLHJlYWxfbmFtZSk7CisgICAgICBjYWxsX291dCgjJ3dyaXRlX2Z0cF91c2Vycyw0KTsKKyAgICB9CisjZW5kaWYKKworICBjYWxsX3NlZnVuKCJsb2dfZmlsZSIsICJVU0VSREVMRVRFIiwKKyAgICAgICAgICAgc3ByaW50ZigiJXM6ICVzICVzKCVzKVxuIiwKKyAgICAgICAgICAgICAgICAgICBjdGltZSh0aW1lKCkpLHJlYWxfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAoc3RyaW5ncChlcnN0aWUpP3NwcmludGYoIltFcnN0aWU6ICVzXSAiLGVyc3RpZSk6IiIpLAorICAgICAgICAgICAgICAgICAgIGNhbGxfc2VmdW4oInF1ZXJ5X2lwX251bWJlciIsVEkpKSk7CisKKyAgcmV0dXJuIDE7Cit9CisKKy8vIGVybWl0dGVsdCBhbGxlIGV4aXN0aWVyZW5kZW4gU3BpZWxlciwgZGllIGVpbiBTYXZlZmlsZSBpbiAvc2VjdXJlL3NhdmUKKy8vIGhhYmVuLgorLy8gKFsgImEiOiAoey4uLm5hbWVuLi4ufSksICJiIjogKHsuLi5uYW1lbi4uLn0pLCAuLi4gXSkgCitwdWJsaWMgbWFwcGluZyBnZXRfYWxsX3BsYXllcnMoKSB7CisgIHN0cmluZyAqZGlycz0oeyJhIiwiYiIsImMiLCJkIiwiZSIsImYiLCJnIiwiaCIsImkiLCJqIiwiayIsImwiLCJtIiwibiIsIm8iLAorICAgICAgInAiLCJxIiwiciIsInMiLCJ0IiwidSIsInYiLCJ3IiwieCIsInkiLCJ6In0pOworICBtYXBwaW5nIGFsbHBsYXllcj0oW10pOworICBzdHJpbmcgKnRtcDsKKyAgZm9yZWFjaChzdHJpbmcgZGlyOiBkaXJzKSB7CisgICAgdG1wPWdldF9kaXIoIi9zZWN1cmUvc2F2ZS8iK2RpcisiLyoiKQorICAgICAgLSAoeyIuIiwiLi4iLCIuS0VFUCIsIi5zdm4ifSk7CisgICAgYWxscGxheWVyW2Rpcl0gPSBtYXAodG1wLGZ1bmN0aW9uIHN0cmluZyAoc3RyaW5nIGZuKSAKKyAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIGV4cGxvZGUoZm4sIi4iKVswXTsgfSApOworICB9CisgIHJldHVybiBhbGxwbGF5ZXI7Cit9CisKKy8vICoqKioqKioqKioqKioqKiBpbnRlcm5lIEZ1bmt0aW9uZW4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZSgpCit7CisgIHVzZXJsaXN0PW1fYWxsb2NhdGUoMCwxMik7CisgIHVwZGF0ZV9sYXRlX3BsYXllcnMoKTsKKyNpZmRlZiBfUFVSRUZUUERfCisgIHJlYWRfZnRwX3VzZXJzKCk7CisjZW5kaWYKK30KKworLy92ZXJzdG9yYmVuZSBTcGllbGVyIGVpbmxlc2VuCit2b2lkIHVwZGF0ZV9sYXRlX3BsYXllcnMoKSB7CisgIHN0cmluZyByZWFkOworICBzdHJpbmcgKnRtcDsKKyAgCisgIGxhdGVwbGF5ZXJzPTA7CisgIAorICByZWFkPXJlYWRfZmlsZSgiLyJTRUNVUkVESVIiL0xBVEVfUExBWUVSUyIpOworICBpZighcmVhZCB8fCByZWFkPT0iIikKKyAgeworICAgIHJldHVybjsKKyAgfQorICAKKyAgdG1wPWV4cGxvZGUocmVhZCwiXG4iKTsKKyAgaWYoIXNpemVvZih0bXApKQorICB7CisgICAgcmV0dXJuOworICB9ICAgICAgICAgCisgIAorICBsYXRlcGxheWVycz10bXA7IAorfQorCisKKy8vIERhdGVuIGF1cyBkZXIgVXNlcmxpc3QgaW5rbC4gUGFzc3dvcnRoYXNoIHp1cnVlY2tsaWVmZXJuLiBNYWNodCBnZ2YuCisvLyBmaW5kX3VzZXJpbmZvKCkuIE51ciBtYXN0ZXJpbnRlcm4gYXVmcnVmYmFyLgorcHJvdGVjdGVkIG1peGVkICpnZXRfZnVsbF91c2VyaW5mbyhzdHJpbmcgdXNlcikgeworICBpZighdXNlcnx8dXNlcj09IiIpCisgICAgcmV0dXJuIDA7CisgIHVzZXI9ZXhwbG9kZSh1c2VyLCIuIilbMF07CisgIGlmICghbWVtYmVyKHVzZXJsaXN0LHVzZXIpICYmICFmaW5kX3VzZXJpbmZvKHVzZXIpKQorICAgIHJldHVybiAwOworCisgIHJldHVybih7dXNlcix1c2VybGlzdFt1c2VyLFVTRVJfUEFTU1dPUkRdLHVzZXJsaXN0W3VzZXIsVVNFUl9MRVZFTF0sCisgICAgICB1c2VybGlzdFt1c2VyLFVTRVJfRE9NQUlOXSwgdXNlcmxpc3RbdXNlcixVU0VSX09CSkVDVF0sCisgICAgICB1c2VybGlzdFt1c2VyLFVTRVJfQ1JFQVRJT05fREFURV0sIDAsIDAsIHVzZXJsaXN0W3VzZXIsVVNFUl9HVUlMRF0sCisgICAgICB1c2VybGlzdFt1c2VyLFVTRVJfRUtUSVBTXSx1c2VybGlzdFt1c2VyLFVTRVJfRlBUSVBTXSwKKyAgICAgIHVzZXJsaXN0W3VzZXIsVVNFUl9VSURTX1RPX1RBS0VfQ0FSRV19KTsKK30KKworLy8gVXNlcmRhdGVuIGF1cyBkZXIgVXNlcmxpc3QgaW0gU2F2ZWZpbGUgaW4gL3NlY3VyZS9zYXZlLyBzcGVpY2hlcm4uCitwcm90ZWN0ZWQgdm9pZCBzYXZlX3VzZXJpbmZvKHN0cmluZyB1c2VyKSB7CisgIGlmKCF1c2VyfHx1c2VyPT0iIikKKyAgICByZXR1cm47CisgIHVzZXI9ZXhwbG9kZSh1c2VyLCIuIilbMF07CisgIGlmICghbWVtYmVyKHVzZXJsaXN0LHVzZXIpKSByZXR1cm47CisgIG5hbWUgPSB1c2VyOworICBsZXZlbCA9IHVzZXJsaXN0W25hbWUsVVNFUl9MRVZFTF07CisgIGRvbWFpbnMgPSB1c2VybGlzdFtuYW1lLFVTRVJfRE9NQUlOXTsKKyAgc2hlbGwgPSB1c2VybGlzdFtuYW1lLFVTRVJfT0JKRUNUXTsKKyAgcGFzc3dvcmQgPSB1c2VybGlzdFtuYW1lLFVTRVJfUEFTU1dPUkRdOworICBjcmVhdGlvbl9kYXRlID0gdXNlcmxpc3RbbmFtZSxVU0VSX0NSRUFUSU9OX0RBVEVdOworICBpZiAoIWNyZWF0aW9uX2RhdGUpIGNyZWF0aW9uX2RhdGUgPSAtMTsKKyAgZXAgPSB1c2VybGlzdFtuYW1lLFVTRVJfRVBdOworICBpZiAoIWVwKSBlcD0iIjsKKyAgZWsgPSB1c2VybGlzdFtuYW1lLFVTRVJfRUtdOworICBpZiAoIWVrKSBlaz0iIjsKKyAgbXEgPSB1c2VybGlzdFtuYW1lLFVTRVJfTVFdOworICBpZiAoIW1xKSBtcT0iIjsKKyAgZ3VpbGRzID0gdXNlcmxpc3RbbmFtZSxVU0VSX0dVSUxEXTsKKyAgZWt0aXBzPXVzZXJsaXN0W25hbWUsVVNFUl9FS1RJUFNdOworICBpZighZWt0aXBzKSBla3RpcHM9IiI7CisgIGZwdGlwcz11c2VybGlzdFtuYW1lLFVTRVJfRlBUSVBTXTsKKyAgaWYoIWZwdGlwcykgZnB0aXBzPSIiOworICB1aWRzdG90YWtlY2FyZT11c2VybGlzdFtuYW1lLFVTRVJfVUlEU19UT19UQUtFX0NBUkVdOworCisgIGlmIChzYXZlX29iamVjdChTRUNVUkVTQVZFUEFUSCtuYW1lWzAuLjBdKyIvIituYW1lKSAhPSAwKSB7CisgICAgLy8gYXV0c2NoLiBCdWdnZW4gZGFtaXQgZGllc2VyIG1vZWdsaWNoc3Qgc2NobmVsbCBhdWZmYWVsbHQsIGRhc3MgaGllcgorICAgIC8vIFNhdmVmaWxlcyBpbiAvc2VjdXJlL3NhdmUvIG5pY2h0IGdlc2NocmllYmVuIHd1cmRlbi4KKyAgICByYWlzZV9lcnJvcihzcHJpbnRmKAorICAgICAgICAgICJTYXZlZmlsZSAlTyBrb25udGUgbmljaHQgZXJzdGVsbHQgd2VyZGVuIVxuIiwKKyAgICAgICAgICBTRUNVUkVTQVZFUEFUSCtuYW1lWzAuLjBdKyIvIituYW1lKSk7CisgIH0KK30KKworLy8gSW4gd2VsY2hlbiBSZWdpb25lbiBpc3QgZGVyIFNwaWVsZXIgUmVnaW9uc21hZ2llcj8KK3Byb3RlY3RlZCB2b2lkIHNldF9kb21haW5zKHN0cmluZyBwbGF5ZXIsIHN0cmluZyAqZG9tYWlucykKK3sKKyAgLy8gd2VubiBkZXIgTWFnaWVyIGpldHp0IERvbWFpbnMgbmljaHQgbWVociBoYXQsIG11ZXNzZW4gZGllIGF1cyAndXNlcmlkcycKKyAgLy8gZW50ZmVybnQgd2VyZGVuLCBkYXMgdWViZXJuaW1tdCBSZW1vdmVXaXphcmRGcm9tVUlEKCkuCisgIGlmIChwb2ludGVycCh1c2VybGlzdFtwbGF5ZXIsIFVTRVJfRE9NQUlOXSkpIHsKKyAgICBzdHJpbmcgKnJlbW92ZWR1aWRzPQorICAgICAgKChzdHJpbmcqKXVzZXJsaXN0W3BsYXllciwgVVNFUl9ET01BSU5dIHwgZG9tYWlucykgLSBkb21haW5zOworICAgIGZvcmVhY2goc3RyaW5nIHVpZDogcmVtb3ZlZHVpZHMpCisgICAgICBSZW1vdmVXaXphcmRGcm9tVUlEKHVpZCwgcGxheWVyKTsKKyAgfQorICAvLyBnZWNhY2h0ZXMgQWxpYXMgZnVlciBwbGF5ZXIgbG9lc2NoZW4KKyAgbV9kZWxldGUodWlkYWxpYXNlLHBsYXllcik7CisgIHVzZXJsaXN0W3BsYXllciwgVVNFUl9ET01BSU5dPWRvbWFpbnM7CisgIHNhdmVfdXNlcmluZm8ocGxheWVyKTsKKyAgLy8gVUlELXp1LU1hZ2llci1NYXBwaW5nIGFrdHVhbGlzaWVyZW4KKyAgUXVlcnlVSURzRm9yV2l6YXJkKHBsYXllcik7Cit9CisKKy8vIEluIHdlbGNoZSBHaWxkZW4gaXN0IGRlciBTcGllbGVyIEdpbGRlbm1hZ2llcj8KK3Byb3RlY3RlZCB2b2lkIHNldF9ndWlsZHMoc3RyaW5nIHBsYXllciwgc3RyaW5nICpndWlsZHMpCit7CisgIC8vIHdlbm4gZGVyIE1hZ2llciBqZXR6dCBHaWxkZW4gbmljaHQgbWVociBoYXQsIG11ZXNzZW4gZGllIGF1cyAndXNlcmlkcycKKyAgLy8gZW50ZmVybnQgd2VyZGVuLCBkYXMgdWViZXJuaW1tdCBSZW1vdmVXaXphcmRGcm9tVUlEKCkuCisgIGlmIChwb2ludGVycCh1c2VybGlzdFtwbGF5ZXIsIFVTRVJfR1VJTERdKSkgeworICAgIHN0cmluZyAqcmVtb3ZlZHVpZHM9CisgICAgICAoKHN0cmluZyopdXNlcmxpc3RbcGxheWVyLCBVU0VSX0dVSUxEXSB8IGd1aWxkcykgLSBndWlsZHM7CisgICAgZm9yZWFjaChzdHJpbmcgdWlkOiByZW1vdmVkdWlkcykKKyAgICAgIFJlbW92ZVdpemFyZEZyb21VSUQodWlkLCBwbGF5ZXIpOworICB9CisgIC8vIGdlY2FjaHRlcyBBbGlhcyBmdWVyIHBsYXllciBsb2VzY2hlbgorICBtX2RlbGV0ZSh1aWRhbGlhc2UscGxheWVyKTsKKyAgdXNlcmxpc3RbcGxheWVyLCBVU0VSX0dVSUxEXT1ndWlsZHM7CisgIHNhdmVfdXNlcmluZm8ocGxheWVyKTsKKyAgLy8gVUlELXp1LU1hZ2llci1NYXBwaW5nIGFrdHVhbGlzaWVyZW4KKyAgUXVlcnlVSURzRm9yV2l6YXJkKHBsYXllcik7Cit9CisKKy8vIFVzZXJpbmZvLUNhY2hlIGV4cGlyZW4uLi4KK3Byb3RlY3RlZCB2b2lkIF9jbGVhbnVwX3VpbmZvKCkKK3sKKyAgICBmb3JlYWNoKHN0cmluZyB1c2VyOiB1c2VybGlzdCkgeworICAgICAgICBpZiAoKHRpbWUoKSAtIHVzZXJsaXN0W3VzZXIsVVNFUl9UT1VDSF0pID4gMTgwMAorICAgICAgICAgICAgJiYgIWNhbGxfc2VmdW4oImZpbmRfcGxheWVyIix1c2VyKSkKKyAgICAgICAgICBtX2RlbGV0ZSh1c2VybGlzdCx1c2VyKTsKKyAgICB9Cit9CisKKy8vIGV4cGFuZGllcnQgZWluaWdlICdBbGlhc2UnIGluIGVpbiBBcnJheSB2b24gYWxsZW4gVUlEcywgZnVlciBkaWUgc2llCisvLyBzdGVoZW4uIEJzcDogInJlZ2lvbiIgLT4gZC5yZWdpb24uKiArIHJlZ2lvbiArIGQucmVnaW9uLAorLy8gInphdWJlcmVyIiAtPiBHVUlMRC56YXViZXJlciwgInAuc2VydmljZSIgLT4gcC5zZXJ2aWNlLiogb2RlciBhdWNoCisvLyAibWFnaWVyIiAtPiBRdWVyeVVJRHNGb3JXaXphcmQoKS4KKy8vIERhcyBlcmZvbGd0IHVlYmVyIExvb2t1cCBkZXIgZW50c3ByZWNoZW5kZW4gVmVyemVpY2huaXNzZSBhdWYgZGVyIFBMYXR0ZS4KKy8vIERhIHp1c2FldHpsaWNoIGF1Y2ggbm9jaCBqZWRlIE1lbmdlIGZpbmRfdXNlcmluZm8oKSBkYXp1IGtvbW1lbiwgaXN0IGRhcworLy8gcmVjaHQgYXVmd2FlbmRpZy4gRGFtaXQgZGFzIGdhbnplIG5pY2h0IGplZGVzbWFsIGVyZm9sZ2VuIG11c3MsIHdpcmQgZGFzCisvLyBFcmdlYm5pcyBnZWNhY2h0IHVuZCBRdWVyeVVJREFsaWFzKCkgbnV0enQgZGVuIENhY2hlLgorcHJpdmF0ZSBzdHJpbmcqIEV4cGFuZFVJREFsaWFzKHN0cmluZyBhbGlhcywgaW50IHJlYykgeworCisgIHN0cmluZyAqdWlkcz0oe30pOworCisgIC8vIFJlZ2lvbnNuYW1lPworICBpZiAoZmlsZV9zaXplKCIvIkRPTUFJTkRJUiIvIithbGlhcykgPT0gRlNJWkVfRElSKSB7CisgICAgLy9nZW5lcmVsbGUgUHNldWRvLVVJRCAnZC5yZWdpb24nIHVuZCAncmVnaW9uJyBmdWVyIGdlbG9lc2NodGUKKyAgICAvL01hZ2llciBkaWVzZXIgUmVnaW9uCisgICAgdWlkcyArPSAoe0RPTUFJTkRJUiIuIithbGlhcywgYWxpYXN9KTsKKyAgICAvL2FsbGUgTWFnaWVyLVZlcnplaWNobmlzc2UgZXJtaXR0ZWxuOgorICAgIHN0cmluZyB0bXBkaXI9Ii8iRE9NQUlORElSIi8iK2FsaWFzKyIvIjsKKyAgICBmb3JlYWNoKHN0cmluZyBkaXI6IChnZXRfZGlyKHRtcGRpcisiKiIpIHx8ICh7fSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgIC0gKHsiLiIsIi4uIiwiLnN2biJ9KSkgeworICAgICAgLy8gc2NoYXVlbiwgb2JzIG5lbiAoc2ljaHRiYXJlcykgVmVyemVpY2huaXMgaXN0IHVuZCBvYiBkZXIgTWFnaWVyCisgICAgICAvLyBleGlzdGllcnQuIExldHp0ZXJlcyBhYmVyIG51ciwgZmFsbHMgZGllIFJla3Vyc2lvbnN0aWVmZSBtaW4uIDEwMAorICAgICAgLy8gaXN0LCBkYSBiZWltIE5hY2hzY2hhdWVuIGVpbmVzIE1hZ2llcnMgbWl0IChtZWhyZXJlbikKKyAgICAgIC8vIFJNLVBvc3RlbiwgZGVyIGluIGRlciBSZWdpb24gUk1zIGF1cyBhbmRlcmVuIFJlZ2lvbmVuIGhhdCwgbGVpY2h0CisgICAgICAvLyBSZWt1cnNpb25zdGllZmVuIHZvbiAyMCAoKjQpIGF1ZnRyZXRlbiBrb2VubmVuLCB3ZW5uIG5vY2ggZ2FyCisgICAgICAvLyBrZWluZSBVSURzIGltIENhY2hlIHNpbmQgKGZpbmRfdXNlcmluZm8oKSBydWZ0IGluZGlyZWt0IGRpZXNlCisgICAgICAvLyBGdW5rdGlvbikuCisgICAgICBpZiAoZGlyWzBdIT0nLicgCisgICAgICAgICAgJiYgZmlsZV9zaXplKHRtcGRpcitkaXIpID09IEZTSVpFX0RJUgorI2lmIF9fTUFYX1JFQ1VSU0lPTl9fID4gOTkKKyAgICAgICAgICAmJiBmaW5kX3VzZXJpbmZvKGRpcikKKyNlbmRpZgorICAgICAgICAgICkKKyAgICAgICAgICB1aWRzICs9ICh7RE9NQUlORElSIi4iK2FsaWFzKyIuIitkaXJ9KTsKKyAgICB9CisgIH0KKyAgLy8gR2lsZGVubmFtZT8KKyAgZWxzZSBpZiAoR1VJTERNQVNURVItPlZhbGlkR3VpbGQoYWxpYXMpKSB7CisgICAgICB1aWRzICs9ICh7R1VJTERJRCIuIithbGlhc30pOworICAgICAgLy9oYXQgZGllIEdpbGRlIGVpbiBQcm9qZWt0dmVyemVpY2huaXM/CisgICAgICBpZiAoZmlsZV9zaXplKCIvIlBST0pFQ1RESVIiLyIrYWxpYXMpID09IEZTSVpFX0RJUikgeworICAgICAgICAgIHVpZHMgKz0gKHtQUk9KRUNURElSIi4iK2FsaWFzfSk7CisgICAgICB9CisgICAgICAvLyBqZXR6dCBoYWJlbiBkdW1tZXJ3ZWlzZSBkaWUgU3BlbGxib29rcyBtZWlzdCBuaWNodCBkZW4gZ2xlaWNoZW4KKyAgICAgIC8vIE5hbWVuIHdpZSBkaWUgR2lsZGUuIEQuaC4gZGllIEdpbGRlIG11c3MgbnVuIG5vY2ggbmFjaCBkZW0KKyAgICAgIC8vIE5hbWVuIGRlcyBTcGVsbGJvb2tzIGdlZnJhZ3Qgd2VyZGVuLCB3ZWlsIGRlc3NlbiBVSUQgbmljaHQKKyAgICAgIC8vIHVuYmVkaW5ndCBnbGVpY2ggZGVtIGRlciBHaWxkZSBpc3QuICpzZXVmeioKKyAgICAgIHN0cmluZyBzcGJvb2s7CisgICAgICBvYmplY3QgZ3VpbGQ7CisgICAgICBjYXRjaChndWlsZD1sb2FkX29iamVjdChHVUlMRERJUiIvIithbGlhcykpOworICAgICAgaWYgKG9iamVjdHAoZ3VpbGQpIAorICAgICAgICAgICYmIChzaXplb2Yoc3Bib29rPShzdHJpbmcpCisgICAgICAgICAgICAgICAgIGd1aWxkLT5RdWVyeVByb3AoUF9HVUlMRF9ERUZBVUxUX1NQRUxMQk9PSykpKQorICAgICAgICAgICAgICAgICYmIHNwYm9vayE9YWxpYXMpCisgICAgICAgICAgdWlkcyArPSAoe0dVSUxESUQiLiIrc3Bib29rfSk7CisgIH0KKyAgLy8gU3BpZWxlci9NYWdpZXItVUlEPworICBlbHNlIGlmIChmaW5kX3VzZXJpbmZvKGFsaWFzKSkgeworICAgIC8vIHdlbm4gcmVjID4gMCwgd2lyZCBlaW5lIFNwaWVsZXItVUlEIGFscyBBbGlhcyBhdWZnZWZhc3N0IHVuZCB6dSBzZWluZW4KKyAgICAvLyBVSURzIGV4cGFuZGllcnQuIEhpZXJiZWkgZXJmb2xndCBhYmVyIG51ciBlaW5lIFJla3Vyc2lvbi4KKyAgICBpZiAoIXJlYykgdWlkcyA9IFF1ZXJ5VUlEc0ZvcldpemFyZChhbGlhcywgMSk7CisgICAgZWxzZSB1aWRzID0gKHthbGlhc30pOworICB9CisgIC8vIFByb2pla3RrcmFtcz8gLT4gYWxsZSBTdWJkaXJzIHZvbiAvcC8gYXVzc2VyIC9wL3NlcnZpY2Ugc2VsYmVyLgorICBlbHNlIGlmIChhbGlhcz09UFJPSkVDVERJUikgeworICAgIGZvcmVhY2goc3RyaW5nIGRpcjogKGdldF9kaXIoIi8iUFJPSkVDVERJUiIvKiIpIHx8ICh7fSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgLSAoeyIuIiwiLi4iLCIuc3ZuIiwic2VydmljZSJ9KSkgeworICAgICAgaWYgKGRpclswXSE9Jy4nICYmCisgICAgICAgICAgZmlsZV9zaXplKCIvIlBST0pFQ1RESVIiLyIrZGlyKSA9PSBGU0laRV9ESVIpCisgICAgICAgICAgdWlkcyArPSAoe1BST0pFQ1RESVIiLiIrZGlyfSk7CisgICAgfQorICB9CisgIC8vIHAuc2VydmljZT8gLT4gQWxsZSBTdWJkaXJzIHZvbiAvcC9zZXJ2aWNlLgorICBlbHNlIGlmIChhbGlhcz09UFJPSkVDVERJUiIuc2VydmljZSIpIHsKKyAgICBmb3JlYWNoKHN0cmluZyBkaXI6IChnZXRfZGlyKCIvIlBST0pFQ1RESVIiL3NlcnZpY2UvKiIpIHx8ICh7fSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgLSAoeyIuIiwiLi4iLCIuc3ZuIn0pKSB7CisgICAgICBpZiAoZGlyWzBdIT0nLicgJiYKKyAgICAgICAgICBmaWxlX3NpemUoIi8iUFJPSkVDVERJUiIvc2VydmljZS8iK2RpcikgPT0gRlNJWkVfRElSKQorICAgICAgICAgIHVpZHMgKz0gKHtQUk9KRUNURElSIi5zZXJ2aWNlLiIrZGlyfSk7CisgICAgfQorICB9CisgIC8vIHdlbm4gbml4IHp1dHJpZmZ0IC0+IHVuZXhwYW5kaWVydCB6dXJ1ZWNrZ2ViZW4KKyAgZWxzZQorICAgIHVpZHMgPSAoe2FsaWFzfSk7CisKKyAgLy8gaW0gQ2FjaGUgdmVybWVya2VuCisgIGlmIChzaXplb2YodWlkYWxpYXNlKSA+PSBfX01BWF9NQVBQSU5HX0tFWVNfXykKKyAgICAgIHVpZGFsaWFzZT1tX2FsbG9jYXRlKDEpOworICAvLyBhdWNoIHZlcm1lcmtlbiwgd2VubiBrZWluZSBVSURzIGVybWl0dGVsdCB3dXJkZW4uCisgIHVpZGFsaWFzZSArPSAoW2FsaWFzOiB1aWRzXSk7CisgIHJldHVybiB1aWRzOworfQorCmRpZmYgLS1naXQgYS9zZWN1cmUvbWF0ZXJpYWxkYi5jIGIvc2VjdXJlL21hdGVyaWFsZGIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjcxYmM0Ci0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL21hdGVyaWFsZGIuYwpAQCAtMCwwICsxLDkzNiBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIC0gUHJvdG90eXBlbiB1bmQgUHJvcGVydGllcyBpbiB0aGluZy9tYXRlcmlhbC5oCisvLyAtIExpc3RlIGluIG1hdGVyaWFscy5oCisvLworLy8gVE9ETzogcHJvcGVydGllcy5oIHVtIG1hdGVyaWFscy5oIGVyd2VpdGVybgorLy8KKy8vIC0gaW1wbGl6aXRlIEdydXBwZW56dW9yZG51bmcgZW50ZmVybmVuLCBkYSBqZXR6dCBleHBsaXppdCBpbgorLy8gICBEZWZpbml0aW9uc2RhdGVpZW4gdm9yaGFuZGVuCisvLyAtIE1hdGVyaWFsZG9rdSB1ZWJlcmFyYmVpdGVuLCBkYWJlaSBIaW53ZWlzIGF1ZiBuaWNodCBtZWhyIGltcGxpeml0ZQorLy8gICBHcnVwcGVuenVvcmRudW5nCisvLyAvcC9kYWVtb24vbWF0ZXJpYWxkYi5jIC0tIE1hdGVyaWFsZGF0ZW5iYW5rCisvLworLy8gJElkOiBtYXRlcmlhbGRiLmMgODc1NSAyMDE0LTA0LTI2IDEzOjEzOjQwWiBaZXNzdHJhICQKKworI3ByYWdtYSBzdHJvbmdfdHlwZXMKKyNwcmFnbWEgbm9fY2xvbmUKKyNwcmFnbWEgbm9faW5oZXJpdAorI3ByYWdtYSBub19zaGFkb3cKKyNwcmFnbWEgcGVkYW50aWMKKworLy8gRGllIFByb3BlcnR5ZGVmaW5pdGlvbiByZWluaG9sZW4KKyNpbmNsdWRlIDxsYW5ndWFnZS5oPgorI2luY2x1ZGUgPHRoaW5nL2Rlc2NyaXB0aW9uLmg+CisvLyBNYXRlcmlhbGxpc3RlIG5pY2h0IG1pdCByZWluemllaGVuCisjZGVmaW5lIF9TS0lQX01BVEVSSUFMU18KKyNpbmNsdWRlIDx0aGluZy9tYXRlcmlhbC5oPgorI2luY2x1ZGUgPHBsYXllci9kZXNjcmlwdGlvbi5oPgorI2luY2x1ZGUgPHJ0bGltaXRzLmg+CisKKy8vIEJhc2lzdmVyemVpY2huaXMgZGVyIE1hdGVyaWFsaWVuCisjZGVmaW5lIE1BVF9ESVIgIi9kb2MvbWF0ZXJpYWxzIgorCisvLyBBdXNnYWJldmVyemVpY2huaXMgZnVlciBEb2t1CisjZGVmaW5lIERPQ19ESVIoeCkgKCIvZG9jL21hdGVyaWFscy8iK3gpCisKKy8vIERhdGVpbmFtZSBkZXMgSGVhZGVycyBtaXQgTWF0ZXJpYWxkZWZpbml0aW9uZW4KKyNkZWZpbmUgSEVBREVSRklMRSAiL3N5cy9tYXRlcmlhbHMuaCIKKworLy8gU2F2ZWZpbGUuCisjZGVmaW5lIFNBVkVGSUxFIERPQ19ESVIoIm1hdGVyaWFsZGIiKQorCisvLyBSZWluIGludGVybiB2ZXJ3ZW5kZXRlIE5hbWVuCisjZGVmaW5lIFBfUkVDT0MgInJlY29nbml6YWJpbGl0eSIKKyNkZWZpbmUgUF9JRCAgICAiaWQiCisjZGVmaW5lIFBfREVGU1RSICJkZWZzdHIiCisjZGVmaW5lIFBfTUVNQkVSUyAibWVtYmVycyIKKyNkZWZpbmUgUF9NR19GUkFDVElPTlMgIm1nX2ZyYWN0aW9ucyIKKworI2RlZmluZSBMT0dfRVJST1IoeCkgaWYoZmluZF9wbGF5ZXIoInJhc2NoYXVhIikmJmZpbmRfcGxheWVyKCJyYXNjaGF1YSIpLT5RdWVyeVByb3AoIm1kYi1kZWJ1ZyIpKXRlbGxfb2JqZWN0KGZpbmRfcGxheWVyKCJyYXNjaGF1YSIpLCJNREItRXJyb3I6Iit4KQorI2RlZmluZSBMT0dfV0FSTih4KSBpZihmaW5kX3BsYXllcigicmFzY2hhdWEiKSYmZmluZF9wbGF5ZXIoInJhc2NoYXVhIiktPlF1ZXJ5UHJvcCgibWRiLWRlYnVnIikpdGVsbF9vYmplY3QoZmluZF9wbGF5ZXIoInJhc2NoYXVhIiksIk1EQi1XYXJuOiIreCkKKworLy8gUHJvdG90eXBlczoKKy8vIChMaWVmZXJ0IGRlbiBBbnRlaWwgZGVyIE1hdGVyaWFsZ3J1cHBlIGdycCBhbiBtYXRzKQoraW50IE1hdGVyaWFsR3JvdXAobWFwcGluZyBtYXRzLCBzdHJpbmcgZ3JwKTsKKy8vIEtvbnZlcnRpZXJ0IGVpbmUgTGlzdGUgdm9uIE1hdGVyaWFsaWVuIHp1IGlocmVuIE5hbWVuLCBkYWJlaSB3aXJkIGRpZQorLy8gRXJrZW5udW5nc2ZhZWhpZ2tlaXQgYmVydWVja3NpY2h0aWd0IHVuZCBldnRsLiBmYWxzY2ggZXJrYW5udAordmFyYXJncyBzdHJpbmcgQ29udk1hdGVyaWFsTGlzdChtaXhlZCBtYXRzLCBpbnQgY2FzdXMsIG1peGVkIGlkaW5mKTsKK3ZhcmFyZ3Mgc3RyaW5nIE1hdGVyaWFsTmFtZShzdHJpbmcgbWF0LCBpbnQgY2FzdXMsIG1peGVkIGlkaW5mKTsKKy8vIEdpYnQgZGVuIE5hbWVuIGVpbmVyIE1hdGVyaWFsZ3J1cHBlIHp1cnVlY2sKK3N0cmluZyBHcm91cE5hbWUoc3RyaW5nIGdycCk7CisvLyBHaWJ0IGFsbGUgTWF0ZXJpYWxpZW4genVydWVjaworc3RyaW5nICpBbGxNYXRlcmlhbHMoKTsKKy8vIEdpYnQgYWxsZSBHcnVwcGVuIHp1cnVlY2sKK3N0cmluZyAqQWxsR3JvdXBzKCk7CisvLyBHaWJ0IGFsbGUgR3J1cHBlbiB6dXJ1ZWNrLCBpbiBkZW5lbiBtYXQgZW50aGFsdGVuIGlzdAorc3RyaW5nICpHZXRNYXRNZW1iZXJzaGlwKHN0cmluZyBtYXQpOworLy8gR2lidCBhbGxlIE1hdGVyaWFsaWVuIHp1cnVlY2ssIGRpZSBpbiBncnAgZW50aGFsdGVuIHNpbmQKK3N0cmluZyAqR2V0R3JvdXBNZW1iZXJzKHN0cmluZyBncnApOworLy8gRXJuZXVlcnQgZGllIE1hdGVyaWFsaWVuIGR1cmNoIFNjYW5uZW4gZGVzIE1hdGVyaWFsdmVyemVpY2huaXNzZXMKK3ZvaWQgVXBkYXRlKCk7CisvLyBnZW5lcmllcnQgSGVhZGVyZmlsZSBhdXMgZGVuIERhdGVuCit2YXJhcmdzIHZvaWQgR2VuSGVhZGVyRmlsZShzdHJpbmcgZm4pOworCittYXBwaW5nIG1hdGVyaWFsczsKK21hcHBpbmcgbWF0ZXJpYWxfZ3JvdXBzOworcHJpdmF0ZSBzdGF0dXMgaW5pdGlhbGl6ZWQ7CittYXBwaW5nIG9sZF9tYXRfa2V5czsgICAgIC8vIEFsdGVyIE1hdGVyaWFsa2V5IC0+IG5ldWVyIEtleSAoS29tcGF0aWJpbGl0YWV0KQorbm9zYXZlIG1hcHBpbmcgbmV3X21hdGVyaWFsczsgICAgICAgLy8gTWF0ZXJpYWxpZW4gd2FlaHJlbmQgZGVzIFNjYW5uZW5zCitub3NhdmUgbWFwcGluZyBuZXdfbWF0ZXJpYWxfZ3JvdXBzOyAvLyBNYXRlcmlhbGdydXBwZW4gd2FlaHJlbmQgZGVzIFNjYW5uZW5zCitwcml2YXRlIG5vc2F2ZSBzdGF0dXMgaXNTY2FubmluZzsKK3ByaXZhdGUgbm9zYXZlIGludCB1cGRhdGVUaWNrczsKKwordm9pZCBjcmVhdGUoKSB7CisgIHNldGV1aWQoZ2V0dWlkKCkpOworICAvLyBTYXZlZmlsZSBlaW5sZXNlbiwgZmFsbHMgbW9lZ2xpY2gsIGRhbWl0IGRpZSBEQiBkaXJla3QgaW5pdGlhbGlzZXJ0IGlzdCwKKyAgLy8gd2VubiBhdWNoIGdnZi4gbWl0IGFsdGVuIERhdGVuLgorICByZXN0b3JlX29iamVjdChTQVZFRklMRSk7CisgIGlmIChpbml0aWFsaXplZCkgeworICAgIC8vIGZhbGxzIGVyZm9sZ3JlaWNoLCBkaXJla3QgSGVhZGVyIGZ1ZXIgZGllIE11ZGxpYiBzY2hyZWliZW4KKyAgICBHZW5IZWFkZXJGaWxlKCk7CisgIH0KKyAgLy8gamV0enQgVXBkYXRlIGRlciBEYXRlbiBkdXJjaGZ1ZWhyZW4uCisgIFVwZGF0ZSgpOworfQorCisvLz09PT09PT09PT09PT09PT09PT09IFVtd2FuZGVsbiBkZXIgU3RyaW5ncyBhdXMgZGVyIHRoaW5nL21hdGVyaWFsLmgKK3ByaXZhdGUgc3RyaW5nIGdldE1hdElkKHN0cmluZyBrZXkpIHsKKyAgLy8gQWx0ZSBCZXplaWNobmVyIHVtd2FuZGVsbgorICBpZiAoIW1lbWJlcihtYXRlcmlhbHMsIGtleSkpCisgICAga2V5ID0gb2xkX21hdF9rZXlzW2tleV07CisgIHJldHVybiBrZXk7Cit9Citwcml2YXRlIHN0cmluZyBnZXRNYXRHcm91cElkKHN0cmluZyBrZXkpIHsKKyAgLy8gQWx0ZSBCZXplaWNobmVyIHVtd2FuZGVsbgorICBpZiAoIW1lbWJlcihtYXRlcmlhbF9ncm91cHMsIGtleSkpCisgICAga2V5ID0gIk1BVEdST1VQXyIrdXBwZXJzdHJpbmcoa2V5WzMuLl0pOworICByZXR1cm4ga2V5OworfQorcHJpdmF0ZSBzdHJpbmcgbWF0S2V5MkRlZnN0cihzdHJpbmcga2V5LCBtYXBwaW5nIG1hdHMpIHsKKyAgc3RyaW5nIGlkOworICBpZiAobWVtYmVyKG1hdHNba2V5XSwgUF9ERUZTVFIpKQorICAgIGlkID0gbWF0c1trZXldW1BfREVGU1RSXTsKKyAgZWxzZQorICAgIGlkID0ga2V5OworICByZXR1cm4gaWQ7Cit9Citwcml2YXRlIHN0cmluZyBncm91cEtleTJEZWZzdHIoc3RyaW5nIGtleSkgeworICBpZiAoc2l6ZW9mKGtleSkgPiA5KQorICAgIGtleSA9ICJtZ18iK2xvd2Vyc3RyaW5nKGtleVs5Li5dKTsKKyAgZWxzZQorICAgIGtleSA9ICIiOworICByZXR1cm4ga2V5OworfQorCisvLz09PT09PT09PT09PT09PT09PT09IFNjaG5pdHRzdGVsbGVuZnVua3Rpb25lbiB6dXIgVmVyd2VuZHVuZyBkZXIgREIKK3ZhcmFyZ3Mgc3RyaW5nIE1hdGVyaWFsTmFtZShzdHJpbmcgbWF0LCBpbnQgY2FzdXMsIG1peGVkIGlkaW5mKSB7CisgIGlmIChpbml0aWFsaXplZCkgeworICAgIHN0cmluZyAqbmFtZXM7CisgICAgbWFwcGluZyBwcm9wczsKKyAgICBtaXhlZCAqZGlmOworICAgIC8vIEFucGFzc2VuIGRlciBNYXRlcmlhbGlkCisgICAgbWF0ID0gZ2V0TWF0SWQobWF0KTsKKworICAgIGlmICghbWFwcGluZ3AocHJvcHM9bWF0ZXJpYWxzW21hdF0pKQorICAgICAgcHJvcHM9KFtdKTsKKworICAgIC8vIEplIG5hY2ggS29lbm5lbiBkZXMgU3BpZWxlcnMga2FubiBtYW4gZGFzIGV4YWt0ZSBNYXRlcmlhbAorICAgIC8vIG1laHIgb2RlciB3ZW5pZ2VyIGd1dCBlcmtlbm5lbjoKKyAgICBpZiAocG9pbnRlcnAoZGlmPXByb3BzW1BfUkVDT0NdKQorJiYgKCFpbnRwKGlkaW5mKXx8aWRpbmY8MTAwKSApIHsgLy8gMTAwPWV4YWt0ZSBFcmtlbm51bmcKKyAgICAgIGludCBpLCBuLCByZWN2YWw7CisgICAgICBtaXhlZCAqZ3JwcywgdG1wLCB4OworCisgICAgICByZWN2YWw9MDsKKyAgICAgIGdycHM9cHJvcHNbUF9NR19GUkFDVElPTlNdOworICAgICAgaWYgKCFwb2ludGVycChpZGluZikpCisgICAgICAgIGlkaW5mPSh7aWRpbmZ9KTsKKworICAgICAgLy8gWnVuYWVjaHN0IGRpZSBGYWVoaWdrZWl0IGRlcyBTcGllbGVycyAoZGEga29lbm5lbiBub2NoCisgICAgICAvLyBHaWxkZW5mYWVoaWdrZWl0ZW4gaGluenUga29tbWVuKSBlcm1pdHRlbG4sIGRpZXNlcworICAgICAgLy8gTWF0ZXJpYWwgenUgZXJrZW5uZW46CisgICAgICBpPXNpemVvZihpZGluZik7CisgICAgICB3aGlsZShpLS0pIHsKKyAgICAgICAgdG1wPWlkaW5mW2ldOworICAgICAgICBpZiAob2JqZWN0cCh0bXApKSAvLyBEaWVzZSBQcm9wZXJ0eSBpc3QgaGF1cHRzYWVjaGxpY2ggZnVlciBSYXNzZW46CisgICAgICAgICAgdG1wPXRtcC0+UXVlcnlQcm9wKFBfTUFURVJJQUxfS05PV0xFREdFKTsKKyAgICAgICAgaWYgKGludHAodG1wKSkgeworICAgICAgICAgIHJlY3ZhbCs9dG1wOyAvLyBBbGxnZW1laW5lIEVya2VubnVuZ3NmYWVoaWdrZWl0CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNsb3N1cmVwKHRtcCkgJiYgaW50cCh4PWZ1bmNhbGwodG1wLG1hdCxncnBzKSkpIHsKKyAgICAgICAgICByZWN2YWwrPXg7CisgICAgICAgICAgYnJlYWs7IC8vIENsb3N1cmVzIGtvZW5uZW4gaW1tZXIgbnVldHpsaWNoIHNlaW4gOikKKyAgICAgICAgfQorICAgICAgICBpZiAobWFwcGluZ3AodG1wKSkgeworICAgICAgICAgIGludCBqOworICAgICAgICAgIGlmICgoeD10bXBbbWF0XSkgJiYgaW50cCh4KSl7CisgICAgICAgICAgICAvLyBFcmtlbm51bmcgdm9uIHNwZXppZWxsIGRpZXNlbSBNYXRlcmlhbAorICAgICAgICAgICAgcmVjdmFsKz14OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIC8vIEVya2VubnVuZyB2b24gR3J1cHBlbgorICAgICAgICAgIGo9c2l6ZW9mKGdycHMpOworICAgICAgICAgIHdoaWxlKGotLSkKKyAgICAgICAgICAgIGlmKCh4PXRtcFtncnBzW2pdXSkgJiYgaW50cCh4KSkKKyAgICAgICAgICAgICAgcmVjdmFsKz14OworICAgICAgICAgIGlmIChwb2ludGVycCh0bXA9dG1wW01BVEVSSUFMX1NZTU1FVFJJQ19SRUNPR05JWkFCSUxJVFldKSkgeworICAgICAgICAgICAgZm9yIChqPXNpemVvZih0bXApLTI7aj49MDtqLT0yKSB7CisgICAgICAgICAgICAgIGlmICghaW50cCh4PXRtcFtqKzFdKSkKKyAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigibWF0ZXJpYWxkYjogaWxsZWdhbCBzeW0ucmVjb2MuIGZvcm1hdFxuIik7CisgICAgICAgICAgICAgIGlmIChwcm9wc1t0bXBbal1dKQorICAgICAgICAgICAgICAgIHJlY3ZhbCs9eDsKKyAgICAgICAgICAgICAgZWxzZSAvLyBiZWkgcGFzc2VuZGVuIEdydXBwZW4gKywgYmVpIGFuZGVyZW4gLQorICAgICAgICAgICAgICAgIHJlY3ZhbC09eDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLy8gSmV0enQgd2lyZCBlcm1pdHRlbHQsIG9iIHZpZWxsZWljaHQgZWluZSB1bmdlbmF1ZXJlCisgICAgICAvLyBCZXNjaHJlaWJ1bmcgZ2VnZWJlbiB3ZXJkZW4gc29sbDoKKyAgICAgIHg9ZGlmWzBdOworICAgICAgbiA9IHNpemVvZihkaWYpLTE7CisgICAgICBmb3IgKGk9MjtpPD1uO2krPTIpIHsKKyAgICAgICAgaWYgKHJlY3ZhbD49ZGlmW2ktMV0pCisgICAgICAgICAgeD1kaWZbaV07CisgICAgICB9CisgICAgICAvLyBXZW5uIGRpZSBGYWVoaWdrZWl0ZW4gZGVzIFNwaWVsZXJzIG5pY2h0IGZ1ZXIgZGVuIGVjaHRlbiBLbGFybmFtZW4KKyAgICAgIC8vIGF1c3JlaWNoZW4sIGdpYiBkaWUgQWx0ZXJuYXRpdmUgenVydWVjazoKKyAgICAgIGlmICh4IT1tYXQpCisgICAgICAgIHJldHVybiBNYXRlcmlhbE5hbWUoeCwgY2FzdXMsIDEwMCk7CisgICAgfQorCisgICAgaWYgKCFwb2ludGVycChuYW1lcz1wcm9wc1tQX05BTUVdKSB8fCBzaXplb2YobmFtZXMpPDQpCisgICAgICBuYW1lcz0oeyJ1bmJla2FubnRlcyBNYXRlcmlhbCIsICJ1bmJla2FubnRlbiBNYXRlcmlhbHMiLAorICAgICAgICAgICAgICAidW5iZWthbm50ZW0gTWF0ZXJpYWwiLCAidW5iZWthbm50ZW4gTWF0ZXJpYWwifSk7CisgICAgaWYgKGNhc3VzPDAgfHwgY2FzdXM+MykKKyAgICAgIGNhc3VzPTA7CisgICAgcmV0dXJuIG5hbWVzW2Nhc3VzXTsKKyAgfQorfQorCit2YXJhcmdzIHN0cmluZyBDb252TWF0ZXJpYWxMaXN0KG1peGVkIG1hdHMsIGludCBjYXN1cywgbWl4ZWQgaWRpbmYpIHsKKyAgaWYgKGluaXRpYWxpemVkKSB7CisgICAgc3RyaW5nICptcyxtbDsKKyAgICBpbnQgaTsKKworICAgIG1sPSIiOworICAgIGlmIChtYXBwaW5ncChtYXRzKSkKKyAgICAgIG1zPW1faW5kaWNlcyhtYXRzKTsKKyAgICBlbHNlIGlmIChzdHJpbmdwKG1hdHMpKQorICAgICAgbXM9KHttYXRzfSk7CisgICAgZWxzZSBpZiAocG9pbnRlcnAobWF0cykpCisgICAgICBtcz1tYXRzOworICAgIGVsc2UKKyAgICAgIG1zPSh7fSk7CisgICAgaT1zaXplb2YobXMpOworICAgIHdoaWxlKGkpIHsKKyAgICAgIG1sKz1NYXRlcmlhbE5hbWUobXNbLS1pXSxjYXN1cyxpZGluZik7CisgICAgICBpZiAoaSkKKyAgICAgICAgbWwrPSgoaT4xKT8iLCAiOiIgdW5kICIpOworICAgIH0KKyAgICByZXR1cm4gbWw7CisgIH0KK30KKworaW50IE1hdGVyaWFsR3JvdXAobWFwcGluZyBtYXRzLCBzdHJpbmcgZ3JwKSB7CisgICBpZiAoaW5pdGlhbGl6ZWQpIHsKKyAgICAgc3RyaW5nICptczsKKyAgICAgaW50IGkscmVzOworCisgICAgIHJlcz0wOworICAgICBpZiAoIW1hcHBpbmdwKG1hdHMpIHx8ICFzdHJpbmdwKGdycCkpCisgICAgICAgcmV0dXJuIHJlczsKKyAgICAgbXM9bV9pbmRpY2VzKG1hdHMpOworICAgICBpPXNpemVvZihtcyk7CisgICAgIHdoaWxlKGktLSkgeworICAgICAgIHN0cmluZyBtYXQ7CisgICAgICAgbWFwcGluZyBwcm9wczsKKyAgICAgICBtYXQ9bXNbaV07CisgICAgICAgaWYgKG1hcHBpbmdwKHByb3BzPW1hdGVyaWFsc1tnZXRNYXRJZChtYXQpXSkpCisgICAgICAgICByZXMrPShtYXRzW21hdF0qcHJvcHNbUF9NR19GUkFDVElPTlNdW2dldE1hdEdyb3VwSWQoZ3JwKV0pLzEwMDsKKyAgICAgfQorICAgICBpZiAocmVzPC0xMDApIC8vIFZpZWxsZWljaHQgbm9jaCBBbnRpbWF0ZXJpZSB6dWxhc3NlbgorICAgICAgIHJlcz0tMTAwOyAgIC8vIChub2NoIG5pY2h0IHNpY2hlciBvYiBkYXMgc28gYmxlaWJlbiB3aXJkIG9kZXIgMCBzZWluIHdpcmQpCisgICAgIGlmIChyZXM+MTAwKQorICAgICAgIHJlcz0xMDA7CisgICAgIHJldHVybiByZXM7CisgICB9Cit9CisKK3N0cmluZyAqQWxsTWF0ZXJpYWxzKCkgeworICBpZiAoaW5pdGlhbGl6ZWQpIHsKKyAgICAvLyBBdXMgS29tcGF0aWJpbGl0YWV0c2dydWVuZGVuIGRpZSBhbHRlbiBTY2hsdWVzc2VsICgjZGVmaW5lLVN0cmluZykKKyAgICAvLyB6dXJ1ZWNrZ2ViZW4KKyAgICByZXR1cm4gbV9pbmRpY2VzKG9sZF9tYXRfa2V5cyk7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK3N0cmluZyAqQWxsR3JvdXBzKCkgeworICBpZiAoaW5pdGlhbGl6ZWQpIHsKKyAgICAvLyBBdXMgS29tcGF0aWJpbGl0YWV0c2dydWVuZGVuIGRpZSBhbHRlbiBTY2hsdWVzc2VsICgjZGVmaW5lLVN0cmluZykKKyAgICAvLyB6dXJ1ZWNrZ2ViZW4KKyAgICByZXR1cm4gbWFwKG1faW5kaWNlcyhtYXRlcmlhbF9ncm91cHMpLCAjJ2dyb3VwS2V5MkRlZnN0cik7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK3N0cmluZyAqR2V0TWF0TWVtYmVyc2hpcChzdHJpbmcgbWF0KSB7CisgIGlmIChpbml0aWFsaXplZCkgeworICAgIG1hcHBpbmcgcHJvcHM7CisgICAgLy8gQW5wYXNzZW4gZGVyIE1hdGVyaWFsaWQKKyAgICBtYXQgPSBnZXRNYXRJZChtYXQpOworCisgICAgaWYgKCFtYXBwaW5ncChwcm9wcz1tYXRlcmlhbHNbbWF0XSkpCisgICAgICByZXR1cm4gKHt9KTsKKyAgICByZXR1cm4gbWFwKG1faW5kaWNlcyhwcm9wc1tQX01HX0ZSQUNUSU9OU10pLCAjJ2dyb3VwS2V5MkRlZnN0cik7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK3N0cmluZyAqR2V0R3JvdXBNZW1iZXJzKHN0cmluZyBncnApIHsKKyAgaWYgKGluaXRpYWxpemVkKSB7CisgICAgc3RyaW5nICptYXRzOworICAgIC8vIEFucGFzc2VuIGRlciBNYXRlcmlhbGlkCisgICAgZ3JwID0gZ2V0TWF0R3JvdXBJZChncnApOworICAgIGlmICghbWVtYmVyKG1hdGVyaWFsX2dyb3VwcywgZ3JwKSB8fAorCSFwb2ludGVycChtYXRzPW1hdGVyaWFsX2dyb3Vwc1tncnBdW1BfTUVNQkVSU10pKQorICAgICAgcmV0dXJuICh7fSk7CisgICAgcmV0dXJuIG1hcChtYXRzLCAjJ21hdEtleTJEZWZzdHIsIG1hdGVyaWFscyk7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK3N0cmluZyBHcm91cE5hbWUoc3RyaW5nIGdycCkgeworICBpZiAoaW5pdGlhbGl6ZWQpIHsKKyAgICBpZiAobWVtYmVyKG1hdGVyaWFsX2dyb3VwcywgZ2V0TWF0R3JvdXBJZChncnApKSkKKyAgICAgIHJldHVybiBtYXRlcmlhbF9ncm91cHNbZ2V0TWF0R3JvdXBJZChncnApXVtQX05BTUVdOworICAgIGVsc2UKKyAgICAgIHJldHVybiAiVW5iZWthbm50ZXMiOworICB9Cit9CisKK3N0cmluZyBHcm91cERlc2NyaXB0aW9uKHN0cmluZyBncnApIHsKKyAgaWYgKGluaXRpYWxpemVkKSB7CisgICAgaWYgKG1lbWJlcihtYXRlcmlhbF9ncm91cHMsIGdldE1hdEdyb3VwSWQoZ3JwKSkpCisgICAgICByZXR1cm4gbWF0ZXJpYWxfZ3JvdXBzW2dldE1hdEdyb3VwSWQoZ3JwKV1bUF9ERVNDUklQVElPTl07CisgICAgZWxzZQorICAgICAgcmV0dXJuICJHcnVwcGUgdW5iZWthbm50IjsKKyAgfQorfQorCisvLz09PT09PT09PT09PT09PT09PT09IEdlbmVyaWVyZW4gdm9uIEhlYWRlcmZpbGUgdW5kIE1hbnBhZ2VzCitwcml2YXRlIHN0cmluZyAqZ2V0X29yZGVyZWRfZ3JvdXBzKCkKK3sKKyAgcmV0dXJuICh7Ik1BVEdST1VQX1dPT0QiLCAiTUFUR1JPVVBfSkVXRUwiLCAiTUFUR1JPVVBfU1RPTkUiLCAiTUFUR1JPVVBfTUFHTkVUSUMiLAorICAgICAgICAgICAiTUFUR1JPVVBfTUVUQUwiLCAiTUFUR1JPVVBfRFJVRyIsICJNQVRHUk9VUF9IRVJCQUwiLCAiTUFUR1JPVVBfRkxFWElCTEUiLAorICAgICAgICAgICAiTUFUR1JPVVBfQklPIiwgIk1BVEdST1VQX0FDSURJQyIsICJNQVRHUk9VUF9CQVNJQyIsICJNQVRHUk9VUF9QT0lTT05PVVMiLAorICAgICAgICAgICAiTUFUR1JPVVBfRVhQTE9TSVZFIiwgIk1BVEdST1VQX0lORkxBTU1BQkxFIiwKKyAgICAgICAgICAgIk1BVEdST1VQX0VMRU1FTlRBTCIsICJNQVRHUk9VUF9FTEVDVFJJQ0FMIiwgIk1BVEdST1VQX01BR0lDIiwKKyAgICAgICAgICAgIk1BVEdST1VQX0hPTFkiLCAiTUFUR1JPVVBfVU5IT0xZIiwgIk1BVEdST1VQX0lOVklTIiwKKyAgICAgICAgICAgIk1BVEdST1VQX1NPTElEIiwgIk1BVEdST1VQX0ZMVUlEIiwgIk1BVEdST1VQX0dBUyJ9KTsKK30KK3ByaXZhdGUgc3RyaW5nIGdlbl9tYXRlcmlhbF9oX2hlYWQoKQoreworICByZXR1cm4KKyAgICAiLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYlxuLy9cbiIKKyAgICAiLy8gbWF0ZXJpYWxzLmggLS0gbWF0ZXJpYWwgZGVmaW5pdGlvbnNcbi8vXG4iCisgICAgIi8vIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgYnkgL3NlY3VyZS9tYXRlcmlhbGRiLmNcbi8vXG4iCisgICAgIi8vIERPIE5PVCBFRElUIVxuLy9cbiIKKyAgICAiLy8gJElkOiBtYXRlcmlhbGRiLmMgODc1NSAyMDE0LTA0LTI2IDEzOjEzOjQwWiBaZXNzdHJhICRcblxuIgorICAgICIjaWZuZGVmIF9fTUFURVJJQUxTX0hfX1xuIgorICAgICIjZGVmaW5lIF9fTUFURVJJQUxTX0hfX1xuXG4iOworfQorcHJpdmF0ZSBzdHJpbmcgZ2VuX21hdGVyaWFsX2hfbWF0ZXJpYWwoc3RyaW5nIG1hdCwgc3RyaW5nIGxhc3RfZ3JwKQoreworICBtYXQgPSBvbGRfbWF0X2tleXNbbWF0XTsKKyAgcmV0dXJuIHNwcmludGYoIiNkZWZpbmUgJS0yNHNcIiUtMjBzIC8vICVzXG4iLCBtYXQsCisgICAgICAgICAgICAgICAgKG1lbWJlcihtYXRlcmlhbHNbbWF0XSwgUF9ERUZTVFIpP21hdGVyaWFsc1ttYXRdW1BfREVGU1RSXTptYXQpKyJcIiIsCisgICAgICAgICAgICAgICAgbWF0ZXJpYWxzW21hdF1bUF9ERVNDUklQVElPTl18fG1hdGVyaWFsc1ttYXRdW1BfTkFNRV1bV0VSXSk7Cit9Citwcml2YXRlIHN0cmluZyBnZW5fbWF0ZXJpYWxfaF9tYXRlcmlhbHNfZ3JwKHN0cmluZyBncnAsIHN0cmluZyAqbGVmdCkKK3sKKyAgc3RyaW5nIHR4dCwgKm1hdHM7CisgIHR4dCA9IHNwcmludGYoIlxuLy8gR3J1cHBlOiAlc1xuIiwgR3JvdXBOYW1lKGdycCkpOworICBtYXRzID0gR2V0R3JvdXBNZW1iZXJzKGdycCkgLSAoR2V0R3JvdXBNZW1iZXJzKGdycCkgLSBsZWZ0KTsKKyAgdHh0ICs9IHNwcmludGYoIiVAcyIsIG1hcChzb3J0X2FycmF5KG1hdHMsICMnPiksICMnZ2VuX21hdGVyaWFsX2hfbWF0ZXJpYWwpKTsKKyAgbGVmdCAtPSBHZXRHcm91cE1lbWJlcnMoZ3JwKTsKKyAgcmV0dXJuIHR4dDsKK30KK3ByaXZhdGUgc3RyaW5nIGdlbl9tYXRlcmlhbF9oX21hdGVyaWFscygpCit7CisgIHN0cmluZyB0eHQsIGxhc3RfZ3JwOworICBzdHJpbmcgKmdycHMsICptYXRzOworICB0eHQgPSAiLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIE1hdGVyaWFsaWVuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuIjsKKyAgLy8gR3J1cHBlbndlaXNlIG9yZG5lbgorICBncnBzID0gZ2V0X29yZGVyZWRfZ3JvdXBzKCk7CisgIG1hdHMgPSBBbGxNYXRlcmlhbHMoKTsKKyAgdHh0ICs9IHNwcmludGYoIiVAcyIsIG1hcChncnBzLCAjJ2dlbl9tYXRlcmlhbF9oX21hdGVyaWFsc19ncnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1hdHMpKTsKKyAgLy8g3GJyaWdnZWJsaWVuZSBNYXRlcmlhbGllbiBhdXNnZWJlbgorICB0eHQgKz0gIi8vIHNvbnN0aWdlIE1hdGVyaWFsaWVuOlxuIjsKKyAgdHh0ICs9IHNwcmludGYoIiVAcyIsIG1hcChtYXRzLCAjJ2dlbl9tYXRlcmlhbF9oX21hdGVyaWFsKSk7CisgIHJldHVybiB0eHQ7Cit9Citwcml2YXRlIHN0cmluZyBnZW5fbWF0ZXJpYWxfaF9ncm91cChzdHJpbmcgZ3JwKQoreworICByZXR1cm4gc3ByaW50ZigiI2RlZmluZSAlLTI3c1wiJS0xOHMgLy8gJXNcbiIsCisgICAgICAgICAgICAgICAgIGdycCwgZ3JvdXBLZXkyRGVmc3RyKGdycCkrIlwiIiwgR3JvdXBOYW1lKGdycCkpOworfQorcHJpdmF0ZSBzdHJpbmcgZ2VuX21hdGVyaWFsX2hfZ3JvdXBzKCkKK3sKKyAgc3RyaW5nIHR4dDsKKyAgdHh0ID0gIlxuLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBNYXRlcmlhbGdydXBwZW4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG4iCisgICAgIiNpZm5kZWYgX0lTX01BVEVSSUFMREJfXG4iOworICB0eHQgKz0gc3ByaW50ZigiJUBzXG4iLCBtYXAoc29ydF9hcnJheShtX2luZGljZXMobWF0ZXJpYWxfZ3JvdXBzKSwgIyc+KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMnZ2VuX21hdGVyaWFsX2hfZ3JvdXApKTsKKyAgdHh0ICs9ICJcbiNlbmRpZiAvLyBfSVNfTUFURVJJQUxEQl9cbiI7CisgIHJldHVybiB0eHQ7Cit9Citwcml2YXRlIHN0cmluZyBnZW5fbWF0ZXJpYWxfaF9mb290KCkKK3sKKyAgcmV0dXJuCisgICAgIiNlbmRpZiAvLyBfX1RISU5HX01BVEVSSUFMX0hfX1xuIjsKK30KK3ByaXZhdGUgaW50IGR1bXBfbWF0ZXJpYWxfaChzdHJpbmcgZm4pCit7CisgIHJldHVybiAod3JpdGVfZmlsZShmbiwgZ2VuX21hdGVyaWFsX2hfaGVhZCgpKSAmJgorICAgICAgICAgIHdyaXRlX2ZpbGUoZm4sIGdlbl9tYXRlcmlhbF9oX21hdGVyaWFscygpKSAmJgorICAgICAgICAgIHdyaXRlX2ZpbGUoZm4sIGdlbl9tYXRlcmlhbF9oX2dyb3VwcygpKSAmJgorICAgICAgICAgIHdyaXRlX2ZpbGUoZm4sIGdlbl9tYXRlcmlhbF9oX2Zvb3QoKSkpOworfQorcHJpdmF0ZSBzdHJpbmcgZ2VuX21hdGVyaWFsX2xpc3RfbWF0ZXJpYWwoc3RyaW5nIG1hdCkKK3sKKyAgbWF0ID0gb2xkX21hdF9rZXlzW21hdF07CisgIHJldHVybiBzcHJpbnRmKCIgICUtMjhzJT0tNDVzXG4iLCBtYXQsCisgICAgICAgICAgICAgICAgIG1hdGVyaWFsc1ttYXRdW1BfREVTQ1JJUFRJT05dfHxtYXRlcmlhbHNbbWF0XVtQX05BTUVdW1dFUl0pOworfQorcHJpdmF0ZSBzdHJpbmcgZ2VuX21hdGVyaWFsX2xpc3RfbWF0ZXJpYWxzX2dycChzdHJpbmcgZ3JwLCBzdHJpbmcgKmxlZnQpCit7CisgIHN0cmluZyB0eHQsICptYXRzOworICB0eHQgPSBzcHJpbnRmKCIlczpcbiIsIGNhcGl0YWxpemUoR3JvdXBOYW1lKGdycCkpKTsKKyAgbWF0cyA9IHNvcnRfYXJyYXkoR2V0R3JvdXBNZW1iZXJzKGdycCkgLSAoR2V0R3JvdXBNZW1iZXJzKGdycCkgLSBsZWZ0KSwgIyc+KTsKKyAgdHh0ICs9IHNwcmludGYoIiVAc1xuIiwgbWFwKG1hdHMsICMnZ2VuX21hdGVyaWFsX2xpc3RfbWF0ZXJpYWwpKTsKKyAgbGVmdCAtPSBHZXRHcm91cE1lbWJlcnMoZ3JwKTsKKyAgcmV0dXJuIHR4dDsKK30KK3ByaXZhdGUgdm9pZCBkdW1wX21hdGVyaWFsKHN0cmluZyBmbikKK3sKKyAgc3RyaW5nIHR4dDsKKyAgc3RyaW5nICpncnBzLCAqbWF0czsKKyAgLy8gR3J1cHBlbndlaXNlIG9yZG5lbgorICBncnBzID0gZ2V0X29yZGVyZWRfZ3JvdXBzKCk7CisgIG1hdHMgPSBBbGxNYXRlcmlhbHMoKTsKKyAgdHh0ID0gc3ByaW50ZigiJUBzIiwgbWFwKGdycHMsICMnZ2VuX21hdGVyaWFsX2xpc3RfbWF0ZXJpYWxzX2dycCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXRzKSk7CisgIC8vINxicmlnZ2VibGllbmUgTWF0ZXJpYWxpZW4gYXVzZ2ViZW4KKyAgdHh0ICs9ICJzb25zdGlnZSBNYXRlcmlhbGllbjpcbiI7CisgIHR4dCArPSBzcHJpbnRmKCIlQHMiLCBtYXAobWF0cywgIydnZW5fbWF0ZXJpYWxfbGlzdF9tYXRlcmlhbCkpOworICB3cml0ZV9maWxlKGZuLCB0eHQpIHx8CisgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigiS29ubnRlIExpc3RlIG5pY2h0IHdlaXRlciBpbiBEYXRlaSAlcyBzY2hyZWliZW4sIgorICAgICAgICAgICAgICAgICAgICAgICAgIiBBYmJydWNoXG4iLCBmbikpOworfQorcHJpdmF0ZSB2b2lkIGR1bXBfZ3JvdXAoc3RyaW5nIGdycCwgc3RyaW5nIGZuKQoreworICAvLyB1cHBlcnN0cmluZyBsYW5nc2FtZSBzaW11bF9lZnVuLCB3YXJ1bT8KKyAgd3JpdGVfZmlsZShmbiwgc3ByaW50ZigiICAlLTI4cyU9LTQ4c1xuIiwgKGdycCksCisgICAgICAgICAgICAgICAgICAgICAgICAgR3JvdXBOYW1lKGdycCkpKSB8fAorICAgIHJhaXNlX2Vycm9yKHNwcmludGYoIktvbm50ZSBMaXN0ZSBuaWNodCB3ZWl0ZXIgaW4gRGF0ZWkgJXMgc2NocmVpYmVuLCIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgQWJicnVjaFxuIiwgZm4pKTsKK30KK3ByaXZhdGUgc3RyaW5nIGdlbl9kb2NfZm9vdChzdHJpbmcgb3RoZXIpCit7CisgIHJldHVybiBzcHJpbnRmKCJcblNJRUhFIEFVQ0g6XG4iCisgICAgICAgICAgICAgICAgICIgICAgIEtvbnplcHRlOiAgICBtYXRlcmlhbCwgbWF0ZXJpYWxlcmtlbm51bmdcbiIKKyAgICAgICAgICAgICAgICAgIiAgICAgR3J1bmRsZWdlbmQ6IFBfTUFURVJJQUwsIC9zeXMvbWF0ZXJpYWxzLmgsIC9zeXMvdGhpbmcvbWF0ZXJpYWwuaFxuIgorICAgICAgICAgICAgICAgICAiICAgICBNZXRob2RlbjogICAgUXVlcnlNYXRlcmlhbCgpLCBRdWVyeU1hdGVyaWFsR3JvdXAoKSwgTWF0ZXJpYWxMaXN0KCksXG4iCisgICAgICAgICAgICAgICAgICIgICAgIExpc3RlbjogICAgICBBbGxNYXRlcmlhbHMoKSwgQWxsR3JvdXBzKClcbiIKKyAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICVzXG4iCisgICAgICAgICAgICAgICAgICIgICAgIE1hc3RlcjogICAgICBDb252TWF0ZXJpYWxMaXN0KCksIE1hdGVyaWFsR3JvdXAoKSxcbiIKKyAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgIEdyb3VwTmFtZSgpLCBNYXRlcmlhbE5hbWUoKSxcbiIKKyAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgIEdldEdyb3VwTWVtYmVycygpLCBHZXRNYXRNZW1iZXJzaGlwKClcbiIKKyAgICAgICAgICAgICAgICAgIiAgICAgU29uc3RpZ2VzOiAgIFBfTUFURVJJQUxfS05PV0xFREdFXG5cbiIKKyAgICAgICAgICAgICAgICAgIiVzIGdlbmVyaWVydCBhdXMgL3NlY3VyZS9tYXRlcmlhbGRiXG4iLCBvdGhlciwgZHRpbWUodGltZSgpKSk7Cit9CisKKy8qIEdlbk1hdExpc3QKKyAqCisgKiBHZW5lcmllcnQgRGF0ZWkgbWl0IHJlZ2lzdHJpZXJ0ZW4gTWF0ZXJpYWxpZW4gZnVlciBkaWUgRG9rdW1lbnRhdGlvbiwKKyAqLwordmFyYXJncyB2b2lkIEdlbk1hdExpc3Qoc3RyaW5nIGZuKQoreworICBpZiAoaW5pdGlhbGl6ZWQpIHsKKyAgICBzdHJpbmcgdHh0OworICAgIGlmICghc3RyaW5ncChmbikgfHwgIXNpemVvZihmbikpCisgICAgICBmbiA9IERPQ19ESVIoIm1hdGVyaWFsbGlzdGUiKTsKKyAgICBpZiAoZmlsZV9zaXplKGZuKSA+PSAwKSB7CisgICAgICBwcmludGYoIkRhdGVpICVzIGV4aXN0aWVydCBiZXJlaXRzLCBsb2VzY2hlIHNpZVxuIiwgZm4pOworICAgICAgcm0oZm4pOworICAgIH0KKyAgICBpZiAod3JpdGVfZmlsZShmbiwgIk1hdGVyaWFsIExpc3RlXG49PT09PT09PT09PT09PVxuXG4iKSkgeworICAgICAgZHVtcF9tYXRlcmlhbChmbik7CisgICAgICB3cml0ZV9maWxlKGZuLCBnZW5fZG9jX2Zvb3QoIm1hdGVyaWFsZ3J1cHBlbiIpKTsKKyAgICAgIHByaW50ZigiTWF0ZXJpYWxsaXN0ZSBlcmZvbGdyZWljaCBpbiBEYXRlaSAlcyBnZXNjaHJpZWJlblxuIiwgZm4pOworICAgIH0gZWxzZQorICAgICAgcHJpbnRmKCJLb25udGUgTGlzdGUgbmljaHQgaW4gRGF0ZWkgJXMgc2NocmVpYmVuLCBBYmJydWNoXG4iLCBmbik7CisgIH0KK30KKworLyogR2VuTWF0R3JvdXBMaXN0CisgKgorICogR2VuZXJpZXJ0IERhdGVpIG1pdCByZWdpc3RyaWVydGVuIE1hdGVyaWFsZ3J1cHBlbiBmdWVyIGRpZSBEb2t1bWVudGF0aW9uLAorICovCit2YXJhcmdzIHZvaWQgR2VuTWF0R3JvdXBMaXN0KHN0cmluZyBmbikKK3sKKyAgaWYgKGluaXRpYWxpemVkKSB7CisgICAgc3RyaW5nIHR4dDsKKyAgICBpZiAoIXN0cmluZ3AoZm4pIHx8ICFzaXplb2YoZm4pKQorICAgICAgZm4gPSBET0NfRElSKCJtYXRlcmlhbGdydXBwZW4iKTsKKyAgICBpZiAoZmlsZV9zaXplKGZuKSA+PSAwKSB7CisgICAgICBwcmludGYoIkRhdGVpICVzIGV4aXN0aWVydCBiZXJlaXRzLCBsb2VzY2hlIHNpZVxuIiwgZm4pOworICAgICAgcm0oZm4pOworICAgIH0KKyAgICBpZiAod3JpdGVfZmlsZShmbiwgIk1hdGVyaWFsZ3J1cHBlblxuPT09PT09PT09PT09PT09XG4iKSkgeworICAgICAgbWFwKHNvcnRfYXJyYXkobV9pbmRpY2VzKG1hdGVyaWFsX2dyb3VwcyksICMnPiksICMnZHVtcF9ncm91cCwgZm4pOworICAgICAgd3JpdGVfZmlsZShmbiwgZ2VuX2RvY19mb290KCJtYXRlcmlhbGxpc3RlIikpOworICAgICAgcHJpbnRmKCJNYXRlcmlhbGxpc3RlIGVyZm9sZ3JlaWNoIGluIERhdGVpICVzIGdlc2NocmllYmVuXG4iLCBmbik7CisgICAgfSBlbHNlCisgICAgICBwcmludGYoIktvbm50ZSBMaXN0ZSBuaWNodCBpbiBEYXRlaSAlcyBzY2hyZWliZW4sIEFiYnJ1Y2hcbiIsIGZuKTsKKyAgfQorfQorCisvKiBHZW5IZWFkZXJGaWxlCisgKgorICogR2VuZXJpZXJ0IEhlYWRlcmZpbGUgbWl0IERlZmluaXRpb25lbiBkZXIgbW9lZ2xpY2hlbiBNYXRlcmlhbGllbiB1bmQKKyAqIEdydXBwZW4KKyAqLwordmFyYXJncyB2b2lkIEdlbkhlYWRlckZpbGUoc3RyaW5nIGZuKQoreworICBpZiAoaW5pdGlhbGl6ZWQpIHsKKyAgICBzdHJpbmcgdHh0OworICAgIGlmICghc3RyaW5ncChmbikgfHwgIXNpemVvZihmbikpCisgICAgICBmbiA9IEhFQURFUkZJTEU7CisgICAgaWYgKGZpbGVfc2l6ZShmbikgPj0gMCkgeworICAgICAgcHJpbnRmKCJEYXRlaSAlcyBleGlzdGllcnQgYmVyZWl0cywgbG9lc2NoZSBzaWVcbiIsIGZuKTsKKyAgICAgIHJtKGZuKTsKKyAgICB9CisgICAgaWYgKGR1bXBfbWF0ZXJpYWxfaChmbikpCisgICAgICBwcmludGYoIkhlYWRlcmRhdGVpIGVyZm9sZ3JlaWNoIGluICVzIGdlc2NocmllYmVuXG4iLCBmbik7CisgICAgZWxzZQorICAgICAgcHJpbnRmKCJLb25udGUgSGVhZGVyZGF0ZWkgbmljaHQgaW4gRGF0ZWkgJXMgc2NocmVpYmVuLCBBYmJydWNoXG4iLCBmbik7CisgIH0KK30KKworLy89PT09PT09PT09PT09PT09PT09PSBQcnVlZi0gdW5kIEhpbGZzZnVua3Rpb25lbiBmdWVyIE1hdGVyaWFsaWVuCitwcml2YXRlIHZvaWQgdXBkYXRlR3JvdXBNZW1iZXJzKG1hcHBpbmcgZ3JvdXBzLCBzdHJpbmcgbWF0X2lkLCBtYXBwaW5nIG1hdCkgeworICBtaXhlZCAqYWRkZ3JwczsgLy8gQXJyYXkgenVtIEFibGVpdGVuIHZvbiBHcnVwcGVuenVnZWhvZXJpZ2tlaXRlbgorICBzdHJpbmcgKmg7CisgIGludCBpLCB2YWw7CisgIG1hcHBpbmcgZnJhY3Rpb25zOyAvLyBNYXBwaW5nIG1pdCBBbnRlaWxlbiBhbiBHcnVwcGVuCisgIGZyYWN0aW9ucyA9IG1hdFtQX01HX0ZSQUNUSU9OU107CisgIGlmICghbWFwcGluZ3AoZnJhY3Rpb25zKSkKKyAgICBmcmFjdGlvbnMgPSAoW10pOworICBhZGRncnBzPSh7IC8vIFJlaWhlbmZvbGdlIHdpcmQgcnVlY2t3YWVydHMgYWJnZWFyYmVpdGV0CisgICAgLy8gQWJsZWl0dW5nZW4gc2luZCB6LlQuIGFiZW50ZXVlcmxpY2ggZ2V3ZXNlbiwgbWFsIG9yZGVudGxpY2gKKyAgICAvLyBhdXNtaXN0ZW4uIERpZSBadWdlaG9lcmlna2VpdCBnZWhvZXJ0IGV4cGxpeml0IGluIGRpZQorICAgIC8vIE1hdGVyaWFsZGVmaW5pdGlvbgorICAgIC8vIEdhc2Ugc2llaHQgbWFuIG5vcm1hbGVyd2Vpc2UgbmljaHQ6CisgICAgKHsiTUFUR1JPVVBfSU5WSVMiLCAiTUFUR1JPVVBfR0FTIn0pLAorICAgIC8vIE1pbmVyYWxpZW4gc2luZCBhdWNoIFN0ZWluZQorICAgICh7Ik1BVEdST1VQX1NUT05FIiwiTUFUR1JPVVBfTUlORVJBTCJ9KSwKKyAgICAvLyBFZGVsbWV0YWxsZSBzaW5kIE1ldGFsbGU6CisgICAgKHsiTUFUR1JPVVBfTUVUQUwiLCJNQVRHUk9VUF9QUkVDSU9VU19NRVRBTCJ9KSwKKyAgICAvLyBMZWJld2VzZW4gdW5kIGRlcmVuIFVlYmVycmVzdGUsIFBhaWVyZSB1bmQgU3RvZmZlIHNpbmQgYmlvbG9naXNjaAorICAgICh7Ik1BVEdST1VQX0JJTyIsIk1BVEdST1VQX0xJVklORyIsIk1BVEdST1VQX0RFQUQiLAorICAgICAgIk1BVEdST1VQX1BBUEVSIn0pLAorICAgIC8vIEhvbHogaXN0IHBmbGFuemxpY2g6CisgICAgKHsiTUFUR1JPVVBfSEVSQkFMIiwgIk1BVEdST1VQX1dPT0QifSksCisgICAgLy8gSG9seiBpc3QgbWVpc3RlbnMgdG90OgorICAgICh7Ik1BVEdST1VQX0RFQUQiLCJNQVRHUk9VUF9XT09EIn0pLAorICAgIC8vIEhvbHosIFBhcGllciB1bmQgU3RvZmZlIGJyZW5uZW46CisgICAgKHsiTUFUR1JPVVBfSU5GTEFNTUFCTEUiLCJNQVRHUk9VUF9XT09EIiwiTUFUR1JPVVBfUEFQRVIifSksCisgICAgLy8gTGF1YmhvZWx6ZXIsIE5hZGVsaG9lbHplciB1bmQgVHJvcGVuaG9lbHplciBzaW5kIEhvbHoKKyAgICAoeyJNQVRHUk9VUF9XT09EIiwiTUFUR1JPVVBfVFJPUElDQUxfV09PRCIsIk1BVEdST1VQX0RFQ0lEVU9VU19XT09EIiwKKyAgICAgICJNQVRHUk9VUF9DT05JRkVSX1dPT0QifSksCisgICAgLy8gRXhwbG9zaXZlIERpbmdlIHNpbmQgaW1tZXIgZW50enVlbmRsaWNoOgorICAgICh7Ik1BVEdST1VQX0lORkxBTU1BQkxFIiwiTUFUR1JPVVBfRVhQTE9TSVZFIn0pCisgIH0pOworICBpPXNpemVvZihhZGRncnBzKTsKKyAgd2hpbGUoaS0tKSB7CisgICAgaW50IGo7CisgICAgaD1hZGRncnBzW2ldOworICAgIGlmIChtZW1iZXIoZnJhY3Rpb25zLGhbMF0pKSAvLyBFeGlzdGllcnQgc2Nob24gZWlnZW5lciBFaW50cmFnPworICAgICAgY29udGludWU7IC8vIEF1dG9tYXRpc2NoZSBFaW50cmFndW5nIHVubm9ldGlnCisgICAgdmFsPTA7CisgICAgZm9yIChqPXNpemVvZihoKS0xO2o+PTE7ai0tKQorICAgICAgdmFsKz1mcmFjdGlvbnNbaFtqXV07CisgICAgaWYgKCF2YWwpCisgICAgICBjb250aW51ZTsKKyAgICBpZiAodmFsPjEwMCkKKyAgICAgIHZhbD0xMDA7CisgICAgZWxzZSBpZiAodmFsPC0xMDApCisgICAgICB2YWw9LTEwMDsKKyAgICBmcmFjdGlvbnNbaFswXV09dmFsOworICB9CisgIGlmIChmcmFjdGlvbnNbIk1BVEdST1VQX0xJVklORyJdKSAvLyBJbSBGYWxsZSB2b24gbGViZW5kZW0gSG9seiwgdG90IGxvZXNjaGVuCisgICAgbV9kZWxldGUoZnJhY3Rpb25zLCJNQVRHUk9VUF9ERUFEIik7CisgIC8vIEFsbGVzLCB3YXMgbmljaHQgYWxzIGdhc2ZvZXJtaW5nLCBmbHVlc3NpZyBvZGVyIGZlc3QgZWluZ2VvcmRuZXQgaXN0LCBpc3QKKyAgLy8gc29uc3R3YXM6CisgIGlmICghbWVtYmVyKGZyYWN0aW9ucywgIk1BVEdST1VQX0ZMVUlEIikKKyAgICAgICYmICFtZW1iZXIoZnJhY3Rpb25zLCAiTUFUR1JPVVBfR0FTIikKKyAgICAgICYmICFtZW1iZXIoZnJhY3Rpb25zLCAiTUFUR1JPVVBfU09MSUQiKSkKKyAgICBmcmFjdGlvbnNbIk1BVEdST1VQX01JU0MiXT0xMDA7CisgIC8vIE1hdGVyaWFsaWVuIGFscyBNaXRnbGllZGVyIGluIGRpZSBHcnVwcGVuIGVpbnRyYWdlbgorICBhZGRncnBzPW1faW5kaWNlcyhmcmFjdGlvbnMpOworICBpPXNpemVvZihhZGRncnBzKTsKKyAgd2hpbGUoaS0tKSB7CisgICAgbWl4ZWQgaW5kOworICAgIGluZD1hZGRncnBzW2ldOworICAgIGlmICghZnJhY3Rpb25zW2luZF0gfHwgIW1lbWJlcihncm91cHMsIGluZCkpIHsKKyAgICAgIC8vIFVuYmVrYW5udGUgR3J1cHBlIHVuZCBHcnVwcGUgb2huZSBBbnRlaWwgYXVzIE1hcHBpbmcgbG9lc2NoZW4KKyAgICAgIG1fZGVsZXRlKGZyYWN0aW9ucyxpbmQpOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmICghcG9pbnRlcnAoaD1ncm91cHNbaW5kXVtQX01FTUJFUlNdKSkKKyAgICAgIGg9KHt9KTsKKyAgICBoKz0oe21hdF9pZH0pOworICAgIGdyb3Vwc1tpbmRdW1BfTUVNQkVSU109aDsKKyAgfQorICBtYXRbUF9NR19GUkFDVElPTlNdID0gZnJhY3Rpb25zOworfQorCisvLz09PT09PT09PT09PT09PT09PT09IEVpbmxlc2VuIGRlciBNYXBwaW5ncyBhdXMgRGF0ZWllbgorCisjZGVmaW5lIE1ERVNDX0VSUk9SKHgsIHkpIExPR19FUlJPUihzcHJpbnRmKCJNYXRlcmlhbGJlc2NocmVpYnVuZyAnJXMnOiAlc1xuIiwgeCwgeSkpCisjZGVmaW5lIE1ERVNDX1dBUk4oeCwgeSkgLy9MT0dfV0FSTihzcHJpbnRmKCJNYXRlcmlhbGJlc2NocmVpYnVuZyAnJXMnOiAlc1xuIiwgeCwgeSkpCisKK3ByaXZhdGUgbWFwcGluZyBnZXREZXNjUGFydHMoc3RyaW5nIHMpIHsKKyAgc3RyaW5nKiBsaW5lczsKKyAgc3RyaW5nIGtleSwgdmFsOworICBpbnQgaSwgbjsKKyAgbWFwcGluZyBtOworICBtID0gKFtdKTsKKyAgdmFsID0gIiI7CisgIGxpbmVzID0gZXhwbG9kZShzLCAiXG4iKTsKKyAgbiA9IHNpemVvZihsaW5lcyk7CisgIGlmIChuID4gMCkgeworICAgIHdoaWxlIChpIDwgbikgeworICAgICAgaWYgKHNzY2FuZihsaW5lc1tpXSwgIiVzOiIsIGtleSkpIHsKKyAgICAgICAgc3RhdHVzIG11bHRpbGluZTsKKyAgICAgICAgbXVsdGlsaW5lID0gMDsKKyAgICAgICAgLy8gU2NobHVlc3NlbCBnZWZ1bmRlbiwgV2VydCBhdXNsZXNlbgorICAgICAgICB3aGlsZSAoICgrK2kgPCBuKSAmJiBzaXplb2YobGluZXNbaV0pKSB7CisgICAgICAgICAgLy8gTWVocnplaWxpZ2UgV2VydGUgbWl0IG5ld2xpbmUgdmVya2V0dGVuCisgICAgICAgICAgaWYgKG11bHRpbGluZSkgeworICAgICAgICAgICAgdmFsICs9ICJcbiI7CisgICAgICAgICAgfQorICAgICAgICAgIHZhbCArPSBsaW5lc1tpXTsKKyAgICAgICAgICBtdWx0aWxpbmUgPSAxOworICAgICAgICB9CisgICAgICAgIG0gKz0gKFtrZXk6dmFsXSk7CisgICAgICAgIHZhbCA9ICIiOworICAgICAgfQorICAgICAgaSsrOworICAgIH0KKyAgfQorICByZXR1cm4gbTsKK30KK3ByaXZhdGUgdmFyYXJncyBpbnQgaXNGaWxlKHN0cmluZyBmbiwgc3RyaW5nIHBhdGgpIHsKKyAgaWYgKHN0cmluZ3AocGF0aCkgJiYgc2l6ZW9mKHBhdGgpKQorICAgIGZuID0gcGF0aCsiLyIrZm47CisgIHJldHVybiAoZmlsZV9zaXplKGZuKSA+PSAwKTsKK30KKworcHJpdmF0ZSB2YXJhcmdzIG1peGVkIHJlYWRHcm91cERlc2Moc3RyaW5nIGlkKSB7CisgIG1peGVkIG07CisgIHN0cmluZyBmbjsKKyAgZm4gPSBNQVRfRElSKyIvZ3JvdXBzLyIraWQ7CisgIGlmIChmaWxlX3NpemUoZm4pID4gMCkgeworICAgIG1hcHBpbmcgcGFydHM7CisgICAgc3RyaW5nIGRlc2M7CisgICAgcGFydHMgPSBnZXREZXNjUGFydHMocmVhZF9maWxlKGZuKSk7CisgICAgbSA9IChbUF9OQU1FOnBhcnRzWyJOYW1lIl0sCisgICAgICAgICAgUF9NRU1CRVJTOih7fSldKTsKKyAgICBpZiAobWVtYmVyKHBhcnRzLCJCZXNjaHJlaWJ1bmciKSkKKyAgICAgIG0gKz0gKFtQX0RFU0NSSVBUSU9OOnBhcnRzWyJCZXNjaHJlaWJ1bmciXV0pOworICAgIGlmIChwYXJ0c1siR3J1cHBlbmlkIl0gIT0gaWQpCisgICAgICBMT0dfV0FSTihzcHJpbnRmKCJVbnN0aW1taWdrZWl0IEdydXBwZW5pZCBiZWkgJyVzJ1xuIiwgaWQpKTsKKyAgfSBlbHNlIHsKKyAgICBMT0dfRVJST1Ioc3ByaW50ZigiS2FubiBHcnVwcGVuYmVzY2hyZWlidW5nICVzIG5pY2h0IGxhZGVuXG4iLCBmbikpOworICB9CisgIHJldHVybiBtOworfQorCitwcml2YXRlIG1hcHBpbmcgY29udk1hdElkKHN0cmluZyBzKSB7CisgIG1hcHBpbmcgbTsKKyAgc3RyaW5nKiBwYXJ0czsKKyAgcGFydHMgPSBleHBsb2RlKHMsICJcIiIpOworICBpZiAoc2l6ZW9mKHBhcnRzKSkgeworICAgIGludCBlbmRlOworICAgIGVuZGUgPSBzdHJzdHIocGFydHNbMF0sIiAiKS0xOworICAgIGlmIChlbmRlIDwgMCkKKyAgICAgIGVuZGUgPSBzaXplb2YocGFydHNbMF0pOworICAgIG0gPSAoW1BfSUQ6cGFydHNbMF1bMC4uZW5kZV1dKTsKKyAgICBpZiAoc2l6ZW9mKHBhcnRzKSA+IDEpCisgICAgICBtICs9IChbUF9ERUZTVFI6cGFydHNbMV1dKTsKKyAgfQorICByZXR1cm4gbTsKK30KK3ByaXZhdGUgc3RyaW5nKiBjb252TWF0TmFtZXMoc3RyaW5nIHMpIHsKKyAgc3RyaW5nKiBuYW1lczsKKyAgbmFtZXMgPSBmaWx0ZXIoZXhwbG9kZShzLCAiXCIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgbGFtYmRhKCAoeyd4fSksICh7Iyc+LCAoeyMnc2l6ZW9mLCAneH0pLCAxfSkgKSk7CisgIGlmIChzaXplb2YobmFtZXMpPDEpCisgICAgbmFtZXM9MDsKKyAgZWxzZSB7CisgICAgaWYgKHNpemVvZihuYW1lcyk8MikKKyAgICAgIG5hbWVzKz0oe25hbWVzWzBdKyJzIn0pOworICAgIGlmIChzaXplb2YobmFtZXMpPDMpCisgICAgICBuYW1lcys9KHtuYW1lc1swXX0pOworICAgIGlmIChzaXplb2YobmFtZXMpPDQpCisgICAgICBuYW1lcys9KHtuYW1lc1swXX0pOworICB9CisgIHJldHVybiBuYW1lczsKK30KK3ByaXZhdGUgaW50IGNvbnZNYXRHZW5kZXIoc3RyaW5nIHMpIHsKKyAgaW50IGdlbmRlcjsKKyAgcyA9IGxvd2Vyc3RyaW5nKHMpOworICAvLyBFaW4gQnVjaHN0YWJlIHJlaWNodCB6dXIgQmVzdGltbXVuZy4gV2VubiBudXIgd2VpYmxpY2h8ZmVtYWxlCisgIC8vIGJ6dy4gbWFlbm5saWNofG1hbGUgdmVyd2VuZGV0IHdpcmQuIERhYmVpIGlzdCBkYW5uIGFsbGVyZGluZ3MgZGllCisgIC8vIFJlaWhlbmZvbGdlIGRlciBBdXN3ZXJ0dW5nIHdpY2h0aWcsIGRhbWl0IGRhcyBtIGJlaSBNQUxFIG5pY2h0IG1laHIgYmVpCisgIC8vIGZlbWFsZSBwYXNzdC4KKyAgaWYgKHNpemVvZihyZWdleHAoICh7c30pLCAiZnx3IikpKSB7CisgICAgZ2VuZGVyID0gRkVNQUxFOworICB9IGVsc2UgaWYgKHNpemVvZihyZWdleHAoICh7c30pLCAibSIpKSkgeworICAgIGdlbmRlciA9IE1BTEU7CisgIH0gZWxzZSB7CisgICAgZ2VuZGVyID0gTkVVVEVSOworICB9CisgIHJldHVybiBnZW5kZXI7Cit9Citwcml2YXRlIHN0cmluZyBjb252TWF0RGVzYyhzdHJpbmcgcykgeworICBpZiAoc2l6ZW9mKHJlZ2V4cCggKHtzfSksICItIG5pY2h0IHZvcmhhbmRlbiAtIikpKSB7CisgICAgcyA9IDA7CisgIH0gZWxzZSB7CisgICAgLy8gTWVocnplaWxpZ2UgQmVzY2hyZWlidW5nZW4genUgZWluZXIgWmVpbGUgenVzYW1tZW5mYXNzZW4KKyAgICBzID0gaW1wbG9kZShleHBsb2RlKHMsICJcbiIpLCAiICIpOworICB9CisgIHJldHVybiBzOworfQorcHJpdmF0ZSB2b2lkIGFkZFJlY29jTGluZShzdHJpbmcgcywgbWl4ZWQqIHIpIHsKKyAgLy8gRGllIHdlaXRlcmUgQmV3ZXJ0dW5nIGRlciBTY2h3aWVyaWdrZWl0IGthbm4gZXJzdCB2b3JnZW5vbW1lbiB3ZXJkZW4sCisgIC8vIHdlbm4gYWxsZSBNYXRlcmlhbGllbiBiZWthbm50IHNpbmQgdW5kIHBhc3NpZXJ0IHNwYWV0ZXIuIFp1ZXJzdCB3ZXJkZW4KKyAgLy8gbnVyIGRpZSBFbGVtZW50ZSBkZXMgQXJyYXlzIGtvbnZlcnRpZXJ0IHVuZCBlaW5nZXRyYWdlbgorICBzdHJpbmcgbWF0OworICBpbnQgdmFsOworICBpZiAoc3NjYW5mKHMsICIlczolZCIsIG1hdCwgdmFsKSkgeworICAgIHIgKz0gKHttYXQsdmFsfSk7CisgIH0gZWxzZSBpZiAoc3NjYW5mKHMsICIlZCIsIHZhbCkpIHsKKyAgICByICs9ICh7dmFsfSk7CisgIH0gZWxzZSB7CisgICAgciArPSAoe3N9KTsKKyAgfQorfQorcHJpdmF0ZSBtaXhlZCBjb252TWF0UmVjKHN0cmluZyBzKSB7CisgIG1peGVkIGRpZmZpY3VsdGllczsKKyAgaWYgKHNpemVvZihyZWdleHAoICh7c30pLCAiLSBrZWluZSBFaW5zY2hyYWVua3VuZyAtIikpKSB7CisgICAgZGlmZmljdWx0aWVzID0gMDsKKyAgfSBlbHNlIHsKKyAgICBkaWZmaWN1bHRpZXMgPSAoe30pOworICAgIC8vIEplZGUgWmVpbGUgZW50aGFlbHQgZWluZSBCZWRpbmd1bmcKKyAgICBtYXAoZXhwbG9kZShzLCAiXG4iKSwgIydhZGRSZWNvY0xpbmUsICZkaWZmaWN1bHRpZXMpOworICB9CisgIHJldHVybiBkaWZmaWN1bHRpZXM7Cit9Citwcml2YXRlIHZvaWQgYWRkR3JvdXBMaW5lKHN0cmluZyBzLCBtYXBwaW5nIGcpIHsKKyAgLy8gRGllIHdlaXRlcmUgQmV3ZXJ0dW5nIGRlciBadWdlaG9lcmlna2VpdCBwYXNzaWVydCBzcGFldGVyLgorICBzdHJpbmcgZ3JwOworICBpbnQgdmFsOworICBpZiAoc3NjYW5mKHMsICIlczolZCIsIGdycCwgdmFsKSkgeworICAgIGcgKz0gKFtncnA6dmFsXSk7CisgIH0gZWxzZSB7CisgICAgZyArPSAoW2dycDoxMDBdKTsKKyAgfQorfQorcHJpdmF0ZSBtYXBwaW5nIGNvbnZNYXRHcm91cHMoc3RyaW5nIHMpIHsKKyAgbWFwcGluZyBncm91cHM7CisgIGlmICghc2l6ZW9mKHJlZ2V4cCggKHtzfSksICItIGtlaW5lIC0iKSkpIHsKKyAgICBncm91cHMgPSAoW10pOworICAgIC8vIEplZGUgWmVpbGUgZW50aGFlbHQgZWluZSBCZWRpbmd1bmcKKyAgICBtYXAoZXhwbG9kZShzLCAiXG4iKSwgIydhZGRHcm91cExpbmUsIGdyb3Vwcyk7CisgIH0KKyAgcmV0dXJuIGdyb3VwczsKK30KK3ByaXZhdGUgbWFwcGluZyBjb252TWF0ZXJpYWxEZXNjKHN0cmluZyBpZCwgbWFwcGluZyBkZXNjKSB7CisgIC8qIFN0cnVrdHVyIE1hdGVyaWFsbWFwcGluZzoKKyAgICAgUF9HRU5ERVIsCisgICAgIFBfTkFNRTooe25hbWVfbm9tLCBuYW1lX2dlbiwgbmFtZV9kYXRpdiwgbmFtZV9ha2t1c2F0aXZ9KSwKKyAgICAgKFBfUkVDT0M6KHttYXQxLGZhZWhpZ2tlaXQxLG1hdDIsZmFlaGlna2VpdDIsLi4ufSksKQorICAgICAoUF9ERUZTVFI6IGJlaSBiZWRhcmYpLAorICAgICBQX0RFU0NSSVBUSU9OLAorICAgICAoZ3J1cHAxOmFudGVpbDEsCisgICAgIGdydXBwZTI6YW50ZWlsMiwKKyAgICAgLi4uKQorICAqLworICBtYXBwaW5nIG07CisgIG1peGVkIHZhbCwgdmFsMjsKKyAgbSA9IChbXSk7CisgIC8vIERlciBzdHJpbmcgZnVlciBkYXMgI2RlZmluZSB6dWVyc3Q6CisgIHZhbCA9IGNvbnZNYXRJZChkZXNjWyJNYXRlcmlhbGlkIl0pOworICBpZiAobWFwcGluZ3AodmFsKSkgeworICAgIGlmICh2YWxbUF9JRF0gIT0gaWQpCisgICAgICBMT0dfV0FSTihzcHJpbnRmKCJVbnN0aW1taWdrZWl0IE1hdGVyaWFsaWQgYmVpICclcyc6JU9cbiIsIGlkLCB2YWxbUF9JRF0pKTsKKyAgICBpZiAobWVtYmVyKHZhbCwgUF9ERUZTVFIpKSB7CisgICAgICBtICs9IChbUF9ERUZTVFI6dmFsW1BfREVGU1RSXV0pOworICAgIH0gZWxzZSB7CisgICAgICAvLyBXZW5uIGtlaW4gU3RyaW5nIGZ1ZXJzICNkZWZpbmUgYW5nZWdlYmVuIHd1cmRlLCBkYW5uIGRpcmVrdCBJRCB2ZXJ3ZW5kZW4KKyAgICAgIC8vbSArPSAoW1BfREVGU1RSOmxvd2Vyc3RyaW5nKGlkKVs0Li5dXSk7CisgICAgfQorICB9CisgIC8vIERpZSBOYW1lbgorICBpZiAodmFsID0gY29udk1hdE5hbWVzKGRlc2NbIk5hbWUiXSkpIHsKKyAgICBtICs9IChbUF9OQU1FOnZhbF0pOworICB9IGVsc2UgeworICAgIE1ERVNDX1dBUk4oaWQsICJrZWluZSBOYW1lbiIpOworICAgIG0gKz0gKFtQX05BTUU6KHsiIiwgIiIsICIiLCAiIn0pXSk7CisgIH0KKyAgLy8gRGFzIEdlc2NobGVjaHQsIHN0YW5kYXJkIGlzdCBORVVURVIKKyAgbSArPSAoW1BfR0VOREVSOmNvbnZNYXRHZW5kZXIoZGVzY1siR2VzY2hsZWNodCJdKSBdKTsKKyAgLy8gRGllIEJlc2NocmVpYnVuZworICB2YWwgPSBjb252TWF0RGVzYyhkZXNjWyJCZXNjaHJlaWJ1bmciXSk7CisgIGlmIChzaXplb2YodmFsKSkgeworICAgIG0gKz0gKFtQX0RFU0NSSVBUSU9OOnZhbF0pOworICB9IGVsc2UgeworICAgIE1ERVNDX1dBUk4oaWQsICJrZWluZSBCZXNjaHJlaWJ1bmciKTsKKyAgfQorICAvLyBEaWUgRXJrZW5uYmFya2VpdAorICB2YWwgPSBjb252TWF0UmVjKGRlc2NbIkVya2VubmJhcmtlaXQiXSk7CisgIGlmIChzaXplb2YodmFsKSkgeworICAgIG0gKz0gKFtQX1JFQ09DOnZhbF0pOworICB9CisgIC8vIHVuZCB6dW0gU2NobHVzcyBkaWUgR3J1cHBlbnp1Z2Vob2VyaWdrZWl0CisgIHZhbCA9IGNvbnZNYXRHcm91cHMoZGVzY1siR3J1cHBlbnp1Z2Vob2VyaWdrZWl0Il0pOworICBpZiAobWFwcGluZ3AodmFsKSAmJiBzaXplb2YodmFsKSkgeworICAgIG0gKz0gKFtQX01HX0ZSQUNUSU9OUzp2YWxdKTsKKyAgfQorICByZXR1cm4gbTsKK30KK3ByaXZhdGUgdmFyYXJncyBtaXhlZCByZWFkTWF0ZXJpYWxEZXNjKHN0cmluZyBpZCkgeworICBtaXhlZCBtOworICBzdHJpbmcgZm47CisgIGZuID0gTUFUX0RJUisiL21hdGVyaWFscy8iK2lkOworICBpZiAoZmlsZV9zaXplKGZuKSA+IDApIHsKKyAgICBtYXBwaW5nIHBhcnRzOworICAgIHN0cmluZyBkZXNjOworICAgIHBhcnRzID0gZ2V0RGVzY1BhcnRzKHJlYWRfZmlsZShmbikpOworICAgIG0gPSBjb252TWF0ZXJpYWxEZXNjKGlkLCBwYXJ0cyk7CisgIH0gZWxzZSB7CisgICAgTE9HX0VSUk9SKHNwcmludGYoIk1EQjpLYW5uIE1hdGVyaWFsYmVzY2hyZWlidW5nICVzIG5pY2h0IGxhZGVuXG4iLCBmbikpOworICB9CisgIHJldHVybiBtOworfQorCitwdWJsaWMgaW50IEdldFVwZGF0ZVRpY2tzKCkgeworICByZXR1cm4gdXBkYXRlVGlja3M7Cit9CisKK3ByaXZhdGUgdm9pZCBzY2FuRmluaXNoZWQoKSB7CisgIGlzU2Nhbm5pbmcgPSAwOworICBpbml0aWFsaXplZCA9IDE7CisgIC8vIE1hcHBpbmdzIHVta29waWVyZW4KKyAgbWF0ZXJpYWxzID0gbmV3X21hdGVyaWFsczsKKyAgbWF0ZXJpYWxfZ3JvdXBzID0gbmV3X21hdGVyaWFsX2dyb3VwczsKKyAgLy8gTGV0enRlciBTY2hyaXR0OiBNYXBwaW5nIG1pdCBhbHRlbiBTY2hsdWVzc2VsbiBhbmxlZ2VuCisgIG9sZF9tYXRfa2V5cyA9IG1rbWFwcGluZyhtYXAobV9pbmRpY2VzKG1hdGVyaWFscyksICMnbWF0S2V5MkRlZnN0ciwgbWF0ZXJpYWxzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faW5kaWNlcyhtYXRlcmlhbHMpKTsKKyAgLy8gR2VuZXJpZXJlbiBkZXIgRG9rdSB1bmQgZGVzIE1hdGVyaWFsaGVhZGVycworICBHZW5IZWFkZXJGaWxlKCk7CisgIEdlbk1hdExpc3QoKTsKKyAgR2VuTWF0R3JvdXBMaXN0KCk7CisgIC8vIFNhdmVmaWxlIHNjaHJlaWJlbgorICBzYXZlX29iamVjdChTQVZFRklMRSk7Cit9CisKK3B1YmxpYyBpbnQgSXNTY2FubmluZygpIHsKKyAgcmV0dXJuIGlzU2Nhbm5pbmc7Cit9CisKK3ByaXZhdGUgdmFyYXJncyB2b2lkIGRvU2Nhbk1hdGVyaWFscyhzdHJpbmcqIG1hdHMsIGludCBpLCBpbnQgc3RlcCkgeworICBpbnQgdGlja3MsIHN0YXJ0OworICBzdHJpbmcgbWF0aWQ7CisgIHN0YXJ0ID0gZ2V0X2V2YWxfY29zdCgpOworICBpZiAoc3RlcCA8IDIpIHsKKyAgICB3aGlsZSAoIChpIDwgc2l6ZW9mKG1hdHMpKSAmJgorICAgICAgICAgICAgKChzdGFydCAtIGdldF9ldmFsX2Nvc3QoKSkgPCBxdWVyeV9saW1pdHMoKVtMSU1JVF9FVkFMXS8zICkgKSB7CisgICAgICBtYXRpZCA9IG1hdHNbaV07CisgICAgICBzd2l0Y2ggKHN0ZXApIHsKKyAgICAgIGNhc2UgMDoKKyAgICAgICAgLy8gRXJzdGVyIFNjaHJpdHQ6IEVpbmxlc2VuIGRlciBEYXRlaWVuCisgICAgICAgIG5ld19tYXRlcmlhbHNbbWF0aWRdID0gcmVhZE1hdGVyaWFsRGVzYyhtYXRpZCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxOgorICAgICAgICAvLyBad2VpdGVyIFNjaHJpdHQ6IEJlYXJiZWl0ZW4gZGVyIEVya2VubnVuZyB1bmQgR3J1cHBlbnp1Z2Vob2VyaWdrZWl0CisgICAgICAgIHVwZGF0ZUdyb3VwTWVtYmVycyhuZXdfbWF0ZXJpYWxfZ3JvdXBzLCBtYXRpZCwgbmV3X21hdGVyaWFsc1ttYXRpZF0pOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaSsrOworICAgIH0KKyAgfQorICBpZiAoaSA8IHNpemVvZihtYXRzKSkgeworICAgIGNhdGNoKHJhaXNlX2Vycm9yKHNwcmludGYoIk1hdGVyaWFsREI6IEluaXRpYWxpc2llcnVuZyBub2NoIG5pY2h0IGJlZW5kZXQsIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBmZWhsZW5kZSBNYXRlcmlhbGJlc2NocmVpYnVuZ2VuIG1vZWdsaWNoIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAoUGhhc2UgJWQ6JWQvJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcCwgaSwgc2l6ZW9mKG1hdHMpKSk7cHVibGlzaCk7CisgICAgY2FsbF9vdXQoIydkb1NjYW5NYXRlcmlhbHMsIDIsIG1hdHMsIGksIHN0ZXApOworICB9IGVsc2UgeworICAgIC8vIFp3ZWl0ZSBTdHVmZSBhdXNsb2VzZW4gb2RlciBiZWVuZGVuCisgICAgaWYgKHN0ZXAgPCAxKSB7CisgICAgICBpZiAoKHN0YXJ0IC0gZ2V0X2V2YWxfY29zdCgpKSA8IHF1ZXJ5X2xpbWl0cygpW0xJTUlUX0VWQUxdLzIgKQorICAgICAgICAgIGRvU2Nhbk1hdGVyaWFscyhtYXRzLCAwLCBzdGVwKzEpOworICAgICAgZWxzZQorICAgICAgICAgIGNhbGxfb3V0KCMnZG9TY2FuTWF0ZXJpYWxzLCAyLCBtYXRzLCAwLCBzdGVwKzEpOworICAgIH0KKyAgICBlbHNlCisgICAgICBzY2FuRmluaXNoZWQoKTsKKyAgfQorICB1cGRhdGVUaWNrcyArPSBzdGFydCAtIGdldF9ldmFsX2Nvc3QoKTsKK30KKworcHJpdmF0ZSBtYXBwaW5nIFNjYW5Hcm91cHMoKSB7CisgIG1hcHBpbmcgZ3JvdXBzOworICBzdHJpbmcqIGdycGZpbGVzOworICBncm91cHMgPSAoW10pOworICBncnBmaWxlcyA9IGZpbHRlcihnZXRfZGlyKE1BVF9ESVIrIi9ncm91cHMvTUFUR1JPVVBfKiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAjJ2lzRmlsZSwgTUFUX0RJUisiL2dyb3VwcyIpOworICBncm91cHMgPSBta21hcHBpbmcoZ3JwZmlsZXMsIG1hcChncnBmaWxlcywgIydyZWFkR3JvdXBEZXNjLCAxKSk7CisgIHJldHVybiBncm91cHM7Cit9CisKK3ByaXZhdGUgdm9pZCBTY2FuTWF0ZXJpYWxzKCkgeworICBzdHJpbmcgKm1hdGZpbGVzOworICBtYXRmaWxlcyA9IGZpbHRlcihnZXRfZGlyKE1BVF9ESVIrIi9tYXRlcmlhbHMvTUFUXyoiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIydpc0ZpbGUsIE1BVF9ESVIrIi9tYXRlcmlhbHMiKTsKKyAgZG9TY2FuTWF0ZXJpYWxzKG1hdGZpbGVzKTsKK30KKwordm9pZCBVcGRhdGUoKSB7CisgIGludCBzdGFydDsKKyAgdXBkYXRlVGlja3MgPSAwOworICBzdGFydCA9IGdldF9ldmFsX2Nvc3QoKTsKKyAgaWYgKCFpc1NjYW5uaW5nKSB7CisgICAgaWYgKHNpemVvZihnZXRfZGlyKE1BVF9ESVIpKSkgeworICAgICAgaXNTY2FubmluZyA9IDE7CisgICAgICBuZXdfbWF0ZXJpYWxfZ3JvdXBzID0gU2Nhbkdyb3VwcygpOworICAgICAgbmV3X21hdGVyaWFscyA9IChbXSk7CisgICAgICB1cGRhdGVUaWNrcyA9IHN0YXJ0IC0gZ2V0X2V2YWxfY29zdCgpOworICAgICAgU2Nhbk1hdGVyaWFscygpOworICAgIH0gZWxzZSB7CisgICAgICBMT0dfRVJST1IoIkthbm4gTWF0ZXJpYWx2ZXJ6ZWljaG5pcyBuaWNodCBmaW5kZW4sIGtlaW5lIE1hdGVyaWFsaWVuIGFuZ2VsZWd0IVxuIik7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9zZWN1cmUvbWVtb3J5LmMgYi9zZWN1cmUvbWVtb3J5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk3YWQxYwotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9tZW1vcnkuYwpAQCAtMCwwICsxLDI5OSBAQAorLyohCisvLyBNb3JnZW5HcmF1ZW4gTXVkbGliCisvLworLy8gc2VjdXJlL21lbW9yeS5jICAtLSB6dW0gU3BlaWNoZXJuIHZvbiBEYXRlbiB1ZWJlciBkaWUgZ2VzYW10ZSBNdWQtVXB0aW1lCisvLworLy8gTWVtb3J5IHNwZWljaGVydCBzZWluZSBEYXRlbiBhbHMgUG9pbnRlciBpbiBkZXIgZXh0cmEtd2l6aW5mby4gQW5kZXJlIAorLy8gUHJvZ3JhbW1lIGtvZW5uZW4gSWhyZSBEYXRlbiBpbSBNZW1vcnkgYWJsZWdlbi4gRGllIERhdGVuIGJsZWliZW4gZGFkdXJjaCAKKy8vIGF1Y2ggdWViZXIgZWluIFVwZGF0ZS9SZWxvYWQgZGVyIEJsdWVwcmludCBlcmhhbHRlbi4KKy8vCisvLyBEaWUgRGF0ZW4gd2VyZGVuIGF1ZiBLbGFzc2VuZWJlbmUgYmVoYW5kZWx0LiBKZWRlciBDbG9uZSBlaW5lcyBQcm9ncmFtbXMKKy8vIChCbHVlcHJpbnQpIGRhcmYgYXVmIGRpZSBnZXNwZWljaGVydGVuIERhdGVuIGRlcyBQcm9ncmFtbXMgc2NocmVpYmVuZCB1bmQKKy8vIGxlc2VuZCB6dWdyZWlmZW4uIEFuZGVyZSBQcm9ncmFtbWUgaGFiZW4ga2VpbmVuIFp1Z3JpZmYgYXVmIGRpZXNlIERhdGVuLgorLy8KKy8vIE51ciBPYmpla3RlIGluIC9zZWN1cmUvbWVtb3J5X2xpYiBiencuIC9zZWN1cmUvbWVtb3J5X25vbGliIGVpbmdldHJhZ2VuIAorLy8gc2luZCwgaGFiZW4gUmVjaHRlIGRlbiBNZW1vcnkgenUgbnV0emVuLgorLy8KKy8vIERpZSBJZGVlLCBzZW5zaWJsZSBEYXRlbiBpbiBkZXIgZXh0cmFfd2l6aW5mbyBhYnp1c3BlaWNoZXJuIGVudHN0YW1tdCAKKy8vIC9zZWN1cmUvbWVtb3J5LmMgYXVzIGRlciBXdW5kZXJsYW5kIE11ZGxpYiB2b24gSG9sZ2VyQFd1bmRlcmxhbmQKKyovCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisjaW5jbHVkZSA8ZmlsZXMuaD4KKworI3ByYWdtYSBzdHJpY3RfdHlwZXMKKyNwcmFnbWEgbm9fY2xvbmUKKyNwcmFnbWEgbm9fc2hhZG93CisjcHJhZ21hIG5vX2luaGVyaXQKKyNwcmFnbWEgdmVyYm9zZV9lcnJvcnMKKyNwcmFnbWEgY29tYmluZV9zdHJpbmdzCisjcHJhZ21hIHBlZGFudGljCisvLyNwcmFnbWEgcmFuZ2VfY2hlY2sKKyNwcmFnbWEgd2Fybl9kZXByZWNhdGVkCisKKworLyogR2xvYmFsIHZhcmlhYmxlIGRlY2xhcmF0aW9uICovCisvKiEgXGJyaWVmIExpc3RlIG1pdCBQcm9ncmFtbWVuLCBkaWUgZGVuIE1lbW9yeSBudXR6ZW4gZHVlcmZlbiAKKyBEaWUgVmFyaWFibGUgd2lyZCBlbnR3ZWRlciBpbSBjcmVhdGUoKSBvZGVyIGR1cmNoIG1hbnVlbGxlbiBBdWZydWYgCisgdm9uIFJlcmVhZFByb2dyYW1MaXN0cygpIGF1cyAvc2VjdXJlL21lbW9yeV9saWIgdW5kIC9zZWN1cmUvbWVtb3J5X25vbGliCisgYmVmdWVsbHQuCisgKi8KK3N0cmluZyAqa25vd25fcHJvZ3JhbXM7CisKKy8qIEZ1bmN0aW9uIGRlY2xhcmF0aW9uIC0gcHVibGljIGludGVyZmFjZSAqLwordm9pZCBjcmVhdGUoKTsKKworLy8gUGF5bG9hZCBJbnRlcmZhY2UKK2ludCAgIFNhdmUgIChzdHJpbmcga2V5LCBtaXhlZCBkYXRhKTsKK21peGVkIExvYWQgIChzdHJpbmcga2V5KTsKK2ludCAgIFJlbW92ZShzdHJpbmcga2V5KTsKK2ludCAgIEhhdmVSaWdodHMoKTsKKworLy8gQWRtaW5pc3RyYXRpdmUgSW50ZXJmYWNlCit2YXJhcmdzIGludCBSZXJlYWRQcm9ncmFtTGlzdHMoaW50IHNpbGVudCk7CisKKy8vIERlYnVnZ2luZyBJbnRlcmZhY2UKK3ZhcmFyZ3Mgdm9pZCBTaG93RGF0YShzdHJpbmcgdXNlciwgc3RyaW5nIGtleSk7CisKKy8qIEZ1bmN0aW9uIGRlZmluaXRpb24gKi8gCisvKiEgT2JqZWt0IGluaXRpYWxpc2llcmVuICovCit2b2lkIGNyZWF0ZSgpIHsKKyAgbWFwcGluZyBpbmZvOworICBzZXRldWlkKGdldHVpZCh0aGlzX29iamVjdCgpKSk7CisKKyAgLy8gV2l6aW5mby1Qb2ludGVyIGhvbGVuCisgIGlmKCFwb2ludGVycChpbmZvPWdldF9leHRyYV93aXppbmZvKDApKSkKKyAgICByYWlzZV9lcnJvcigiV0laSU5GTyBuaWNodCBsZXNiYXIuIHNlY3VyZS9zaW11bF9lZnVuIG11c3MgbmV1IGdlbGFkZW4gd2VyZGVuLiFcbiIpOworCisgIC8vIE1laW4gRmVsZCBkZXIgV2l6aW5mbyBiZWkgQmVkYXJmIGluaXRpYWxpc2llcmVuCisgIGlmKCFtYXBwaW5ncChpbmZvW01FTU9SWV9CVUZGXSkpCisgICAgaW5mb1tNRU1PUllfQlVGRl09KFtdKTsKKworICBSZXJlYWRQcm9ncmFtTGlzdHMoMSk7Cit9CisKKy8qIQorIFdlbm4gZGFzIGF1ZnJ1ZmVuZGUgUHJvZ3JhbW0gZnVlciBkaWUgU3BlaWNoZXJudXR6dW5nIHp1Z2VsYXNzZW4gaXN0LAorIHdpcmQgaGllciBkZXIgSGFzaCB6dXJ1ZWNrZ2VnZWJlbiB1bnRlciBkZW0gc2VpbmUgRGF0ZW4gYWJnZXNwZWljaGVydAorIHNpbmQuIERlciBIYXNoIGlzdCBkZXJ6ZWl0IGRlciBGaWxlbmFtZSBkZXMgQmx1ZXByaW50LgorKi8KK3ByaXZhdGUgc3RyaW5nIGdldF9jYWxsZXJfaGFzaCgpIHsKKyAgaWYgKG1lbWJlcihrbm93bl9wcm9ncmFtcywgcHJvZ3JhbV9uYW1lKHByZXZpb3VzX29iamVjdCgpKVsuLjwzXSkgIT0gLTEpIAorICAgIHJldHVybiBwcm9ncmFtX25hbWUocHJldmlvdXNfb2JqZWN0KCkpWy4uPDNdOworICBlbHNlIAorICAgIHJldHVybiAwOworfQorCisvKiEgCisgRGllIEhpbGZzZnVua3Rpb24gbGllc3QgZWluZSBMaXN0ZSBtaXQgRGF0ZWluYW1lbiB1bmQgZ2lidCBkaWUgUHJvZ3JhbW1lIAorIGFscyBBcnJheSBvZiBTdHJpbmdzIHp1cnVlY2suIEFsbGUgWmVpbGVuIGRpZSBuaWNodCBtaXQgZWluZW0gU2xhc2ggCisgYW5mYW5nZW4sIHdlcmRlbiBkYWJlaSBpZ25vcmllcnQuCisgXHBhcmFtIGZpbGUgRGllIGF1c3p1bGVzZW5kZSBEYXRlaS4KKyovCitwcml2YXRlIG1peGVkIHJlYWRfbGlzdChzdHJpbmcgZmlsZSkKK3sKKyAgbWl4ZWQgZGF0YTsKKyAgaWYgKCFzdHJpbmdwKGZpbGUpIHx8IGZpbGVfc2l6ZShmaWxlKSA9PSBGU0laRV9OT0ZJTEUgKQorICAgIHJldHVybiAoe30pOworCisgIC8vIERhdGVuIGxhZGVuCisgIGRhdGEgPSBleHBsb2RlKHJlYWRfZmlsZShmaWxlKXx8IiIsICJcbiIpOworCisgIC8vIEFsbGUgWmVpbGVuIGRpZSBuaWNodCBtaXQgLyBiZWdpbm5lbiBlbnRmZXJuZW4gLi4uCisgIGRhdGE9cmVnZXhwKGRhdGEsIl4vLisiKTsKKworICAvLyAiLmMiIHVuZCBldmVudHVlbGxlIExlZXJ6ZWljaGVuIGluIGplZGVyIFplaWxlIHdlcmRlbiBlbnRmZXJudAorICBkYXRhPSBtYXAoZGF0YSwgCisgICAgIGZ1bmN0aW9uIHN0cmluZyAoc3RyaW5nIHgpIHtyZXR1cm4gcmVncmVwbGFjZSh4LCIoLmMpKiAqJCIsIiIsMSk7fSk7CisgIHJldHVybiBkYXRhOworfQorCisvKiEgCisgV2VubiBkaWUgTGlzdGUgbWl0IFByb2dyYW1tZW4gZ2VhZW5kZXJ0IHd1cmRlLCBrYW5uIHNpZSBoaWVyIHBlciBIYW5kCisgbmV1IGVpbmdlbGVzZW4gd2VyZGVuLgorIFxwYXJhbSBzaWxlbnQgVmFyYXJncyBGbGFnLCB1bSBCaWxkc2NoaXJtYXVzZ2FiZSB6dSB1bnRlcmRydWVja2VuCisqLwordmFyYXJncyBpbnQgUmVyZWFkUHJvZ3JhbUxpc3RzKGludCBzaWxlbnQpCit7CisgIC8vIE9iamVrdGUgbGFkZW4sIGRpZSB6dXIgTXVkbGliIGdlaG9lcmVuCisgIGtub3duX3Byb2dyYW1zID0gcmVhZF9saXN0KCIvc2VjdXJlL21lbW9yeV9saWIiKTsKKworICAvLyBPYmpla3RlIGxhZGVuLCBkaWUgbmljaHQgenVyIE11ZGxpYiBnZWhvZXJlbgorICBrbm93bl9wcm9ncmFtcys9cmVhZF9saXN0KCIvc2VjdXJlL21lbW9yeV9ub2xpYiIpOworCisgIGlmKCFzaWxlbnQpIHByaW50ZiAoIiVPXG4iLCBrbm93bl9wcm9ncmFtcyk7CisKKyAgcmV0dXJuIHNpemVvZihrbm93bl9wcm9ncmFtcyk7Cit9CisKKy8qISBaZWlnZXIgYXVmIGRlbiBTcGVpY2hlciBob2xlbiAqLworcHJpdmF0ZSBtYXBwaW5nIGdldF9tZW1vcnlfcG9pbnRlcigpeworICBtaXhlZCBpbmZvOworCisgIC8vIERpZSBGZWhsZXJtZWxkdW5nZW4gc2luZCBldHdhcyBhdXNmdWVocmxpY2hlciwgdW0gZGVtIERlYnVnZ2VyCisgIC8vIGVpbmVuIEhpbndlaXMgYXVmIFJlcGFyYXR1cm1vZWdsaWNoa2VpdGVuIHp1IGdlYmVuCisgIGlmKCFwb2ludGVycChpbmZvPWdldF9leHRyYV93aXppbmZvKDApKSkKKyAgICByYWlzZV9lcnJvcigiV2l6aW5mbyBuaWNodCBsYWRiYXIuIEVudHdlZGVyIGljaCBoYWIga2VpbmUgUmVjaHRlICIKKyAgICAgICAgICAgICAgICAib2RlciBkYXMgTXVkIGhhdCBlaW4gZWNodGVzIFByb2JsZW0hXG4iKTsKKworICBpZighbWFwcGluZ3AoaW5mb1tNRU1PUllfQlVGRl0pKQorICAgIHJhaXNlX2Vycm9yKCJJY2ggZmluZGUgbWVpbmUgRGF0ZW4gaW4gZGVyIFdpemluZm8gbmljaHQuIEVpbiBFTSBrYW5uICIKKyAgICAgICAgICAgICAgICAidmVyc3VjaGVuLCBtaWNoIG5ldSB6dSBsYWRlbiwgYWJlciB3YXMgZGllIGFsdGVuIERhdGVuICIKKyAgICAgICAgICAgICAgICAiYmV0cmlmZnQsIGZyZWkgbmFjaCBDYXR0eTogS2VpbmUgQXJtZSwga2VpbmUgS2Vrc2UhXG4iKTsKKyAgLy8gRGEgaW5mb1tNRU1PUllfQlVGRl0gaW1tZXIgZWluIE1hcHBpbmcgaXN0IChzaWVoZSBDcmVhdGUpLCB3aXJkIGhpZXIgZWluIAorICAvLyBQb2ludGVyIHVlYmVyZ2ViZW4uIERhZHVyY2ggd2VyZGVuIERldGFpbHMgenVtIEF1ZmJhdSBkZXIgZXh0cmFfd2l6aW5mbworICAvLyBudXIgaW4gZGllc2VyIEZ1bmt0aW9uIGJlbm9ldGlndC4KKyAgcmV0dXJuIGluZm9bTUVNT1JZX0JVRkZdOyAKK30KKworLyohCisgIFBydWVmZW4sIG9iIHByZXZpb3VzX29iamVjdCgpIE51dHp1bmdzcmVjaHRlIGZ1ZXIgZGVuIE1lbW9yeSBoYXQuCisgIFxyZXR1cm4gR2lidCAxIHp1cnVlY2ssIHdlbm4gZGVyIEF1ZnJ1ZmVuZGUgYmVyZWNodGlndCBpc3QsIGRhcyAKKyAgICAgICAgICBPYmpla3QgenUgbnV0emVuLCBzb25zdCAwCisqLworaW50IEhhdmVSaWdodHMoKXsKKyAgcmV0dXJuIHN0cmluZ3AoZ2V0X2NhbGxlcl9oYXNoKCkpOworfQorCisvKiEKKyBEYXRlbiBpbSBNZW1vcnkgYWJsZWdlbgorIFxwYXJhbSBrZXkgSUQgdW50ZXIgZGVyIGRpZSBEYXRlbiBnZXNwZWljaGVydCB3ZXJkZW4KKyBccGFyYW0gdmFyIFp1IHNwZWljaGVybmRlcyBEYXR1bQorKi8KK2ludCBTYXZlKHN0cmluZyBrZXksIG1peGVkIHZhcikgeworICBzdHJpbmcgd2hvOworICBtYXBwaW5nIG1lbW9yeTsKKworICAvLyBIYXNoIGRlcyBBdWZydWZlcnMgaG9sZW4uIEhhdCBkZXIga2VpbmVuLCBpc3QgZXIgbmljaHQgYmVmdWd0LAorICAvLyBkZW4gTWVtb3J5IHp1IG51dHplbi4KKyAgaWYoIXN0cmluZ3Aod2hvPWdldF9jYWxsZXJfaGFzaCgpKSkgcmV0dXJuIDA7CisKKyAgLy8gV2VubiBrZWluIEtleSB1ZWJlcmdlYmVuIHdpcmQsIGthbm4gYXVjaCBuaWNodHMgZ2VzcGVpY2hlcnQgd2VyZGVuLgorICBpZighc3RyaW5ncChrZXkpKSByZXR1cm4gMDsKKworICAvLyAoaG9mZmVudGxpY2gpIGdsb2JhbGVuIG1lbW9yeV9wb2ludGVyIGhvbGVuCisgIG1lbW9yeSA9IGdldF9tZW1vcnlfcG9pbnRlcigpOworCisgIC8vIFdlbm4ga2VpbmUgRGF0ZW4gZGEgc2luZCwgbXVzcyBtYW4gYXVjaCBuaWNodHMgYW5sZWdlbi4gUnVlY2tnYWJld2VydAorICAvLyBpc3QgZGVubm9jaCAxLCB3ZWlsIExvYWQgYmVpIHVuYmVrYW5udGVuIEtleXMgYXVjaCAwIGxpZWZlcnQsIGRpZSAKKyAgLy8gTnVsbCB3aXJkIGFsc28ga29ycmVrdCBnZXNwZWljaGVydCwgaXJnZW5kd2llLiBEYXMgbXVzcyBhYmVyIG5hY2ggZGVtCisgIC8vIGdldF9tZW1vcnlfcG9pbnRlcigpIHBhc3NpZXJlbiwgZGEgc29uc3QgZGFzIEtvcnJla3RlIEZ1bmt0aW9uaWVyZW4gdm9uCisgIC8vIExvYWQgbmljaHQgc2ljaGVyZ2VzdGVsbHQgaXN0LgorICBpZih2YXI9PTApIHJldHVybiAxOworCisgIC8vIEVyc3RlciBBdWZydWYgZHVyY2ggUE8/IERhbm4gbXVzcyBzZWluIFNwZWljaGVyYmVyZWljaCBpbml0aWFsaXNpZXJ0IAorICAvLyB3ZXJkZW4KKyAgaWYoIW1lbWJlcihtZW1vcnksd2hvKSkKKyAgICBtZW1vcnlbd2hvXT0oW10pOworCisgIC8vIEVuZGxpY2ghIERhdGVuIGtvZW5uZW4gZ2VzcGVpY2hlcnQgd2VyZGVuLgorICBtZW1vcnlbd2hvXVtrZXldPXZhcjsKKworICByZXR1cm4gMTsKK30KKworLyohCisgRGF0ZW4gYXVzZ2ViZW4vcmVmZXJlbnppZXJlbgorIFxwYXJhbSBrZXkgSWQgdW50ZXIgZGVyIGRpZSBEYXRlbiBnZXNwZWljaGVydCBzaW5kLgorKi8KK21peGVkIExvYWQoc3RyaW5nIGtleSkgeworICBzdHJpbmcgd2hvOworICBtYXBwaW5nIG1lbW9yeTsKKworICAvLyBIYXNoIGRlcyBBdWZydWZlcnMgaG9sZW4uIEhhdCBkZXIga2VpbmVuLCBpc3QgZXIgbmljaHQgYmVmdWd0LAorICAvLyBkZW4gTWVtb3J5IHp1IG51dHplbi4KKyAgaWYoIXN0cmluZ3Aod2hvPWdldF9jYWxsZXJfaGFzaCgpKSkgcmV0dXJuIDA7CisKKyAgLy8gV2VubiBrZWluIEtleSB1ZWJlcmdlYmVuIHdpcmQsIGthbm4gYXVjaCBuaWNodHMgZ2VzcGVpY2hlcnQgd2VyZGVuLgorICBpZighc3RyaW5ncChrZXkpKSByZXR1cm4gMDsKKworICAvLyAoaG9mZmVudGxpY2gpIGdsb2JhbGVuIG1lbW9yeV9wb2ludGVyIGhvbGVuCisgIG1lbW9yeSA9IGdldF9tZW1vcnlfcG9pbnRlcigpOworCisgIC8vIERhcyBPYmpla3QgaGF0IG5vY2ggbmllIFNhdmUoKSBhdWZnZXJ1ZmVuLgorICBpZighbWVtYmVyKG1lbW9yeSx3aG8pKQorICAgIHJldHVybiAwOworCisgIC8vIFVudGVyIGRpZXNlbSBLZXkgaXN0IG5vY2ggbmljaHRzIGdlc3BlaWNoZXJ0LgorICBpZighbWVtYmVyKG1lbW9yeVt3aG9dLGtleSkpCisgICAgcmV0dXJuIDA7CisKKyAgLy8gR2VzcGVpY2hlcnRlbiBXZXJ0IHp1cnVlY2tnZWJlbgorICByZXR1cm4gbWVtb3J5W3dob11ba2V5XTsKK30KKworLyohIAorIEVpbiBFaW50cmFnIG9kZXIgYWxsZSBFaW50cmFlZ2Ugd2VyZGVuIGdlbG9lc2NodAorIFxwYXJhbSBrZXkgSWQgdW50ZXIgZGVyIGRpZSBEYXRlbiBnZXNwZWljaGVydCBzaW5kLiAKKyAgICAgICAgICAgIFdpcmQga2VpbiBLZXkgdWViZXJnZWJlbiwgd2VyZGVuIGFsbGUgRGF0ZW4gZGVzIE9iamVrdHMgCisgICAgICAgICAgICBnZWxvZXNjaHQuCisqLwordmFyYXJncyBpbnQgUmVtb3ZlKHN0cmluZyBrZXkpIHsKKyAgc3RyaW5nIHdobzsKKyAgbWFwcGluZyBtZW1vcnk7CisKKyAgLy8gSGFzaCBkZXMgQXVmcnVmZXJzIGhvbGVuLiBIYXQgZGVyIGtlaW5lbiwgaXN0IGVyIG5pY2h0IGJlZnVndCwKKyAgLy8gZGVuIE1lbW9yeSB6dSBudXR6ZW4uCisgIGlmKCFzdHJpbmdwKHdobz1nZXRfY2FsbGVyX2hhc2goKSkpIHJldHVybiAwOworCisgIC8vIChob2ZmZW50bGljaCkgZ2xvYmFsZW4gbWVtb3J5X3BvaW50ZXIgaG9sZW4KKyAgbWVtb3J5ID0gZ2V0X21lbW9yeV9wb2ludGVyKCk7CisKKyAgLy8gRGFzIE9iamVrdCBoYXQgbm9jaCBuaWUgU2F2ZSgpIGF1ZmdlcnVmZW4uCisgIGlmKCFtZW1iZXIobWVtb3J5LHdobykpIHJldHVybiAwOworCisgIC8vIFdlbm4ga2VpbiBLZXkgdWViZXJnZWJlbiB3aXJkLCB3aXJkIGFsbGVzIHp1bSBPYmpla3QgZ2Vob2VyZW5kZSBnZWxvZXNjaHQuCisgIGlmKHN0cmluZ3Aoa2V5KSl7CisgICAgLy8gVW50ZXIgZGllc2VtIEtleSBpc3QgbmljaHRzIGdlc3BlaWNoZXJ0LgorICAgIGlmKCFtZW1iZXIobWVtb3J5W3dob10sa2V5KSkgcmV0dXJuIDA7CisKKyAgICAvLyBXZXJ0IHVudGVyIEtleSBmdWVyIGRhcyBGaWxlIGxvZXNjaGVuCisgICAgbV9kZWxldGUobWVtb3J5W3dob10sIGtleSk7CisKKyAgfSBlbHNlIHsKKyAgICAvLyBBbGxlcyBmdWVyIGRhcyBGaWxlIGxvZXNjaGVuCisgICAgbV9kZWxldGUobWVtb3J5LCB3aG8pOworICB9CisKKyAgcmV0dXJuIDE7IAorfQorCit2YXJhcmdzIHZvaWQgU2hvd0RhdGEoc3RyaW5nIHVzZXIsIHN0cmluZyBrZXkpCit7CisgIC8vIEJla2FubnRlIE9iamVrdGUKKyAgaWYgKCFFTERFUl9TRUNVUklUWSApCisgICAgcHJpbnRmKCJJJ20gZmluZS4gVGhhbmtzIGZvciBhc2tpbmcuXG4iKTsKKyAgZWxzZSB7CisgICAgcHJpbnRmKCJrbm93bl9wcm9ncmFtczpcbiVPXG5cbiIsIGtub3duX3Byb2dyYW1zKTsKKyAgICAvLyBFTSBkdWVyZmVuIHNpY2ggYXVjaCBub2NoIHp1c2Nyb2xsZW4gbGFzc2VuLCB3ZW5uIHNpZSB3b2xsZW4KKyAgICBpZiAoQVJDSF9TRUNVUklUWSAmJiB1c2VyKQorICAgIHsKKyAgICAgIG1hcHBpbmcgZGF0YSA9IGdldF9tZW1vcnlfcG9pbnRlcigpOworICAgICAgaWYgKCFtZW1iZXIoZGF0YSx1c2VyKSkKKyAgICAgICAgcHJpbnRmKCJtZW1vcnk6IEtlaW5lIERhdGVuIGZ1ZXIgJXMgdm9yaGFuZGVuLlxuIix1c2VyKTsKKyAgICAgIGVsc2UgaWYgKHVzZXIgJiYga2V5KQorICAgICAgICBwcmludGYoIm1lbW9yeTogRGF0ZW4gZnVlciBVc2VyICVzLCBLZXkgJXM6XG4lT1xuIix1c2VyLCBrZXksCisgICAgICAgICAgICAgICAgICBkYXRhW3VzZXJdW2tleV0pOworICAgICAgZWxzZQorICAgICAgICBwcmludGYoIm1lbW9yeTogRGF0ZW4gZnVlciBVc2VyICVzOlxuJU9cbiIsdXNlcixkYXRhW3VzZXJdKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIG1hcHBpbmcgbWVtb3J5OworICAgICAgbWVtb3J5ID0gZ2V0X21lbW9yeV9wb2ludGVyKCk7CisgICAgICAvLyBBbmRlcmUgYmVrb21tZW4gZWluZSBhbm9ueW1pc2llcnRlIFZlcnNpb24KKyAgICAgIHByaW50ZigibWVtb3J5OiAoTnVyIEZlbGRuYW1lbiwga2VpbmUgRGF0ZW4pXG4iKTsKKyAgICAgIGZvcmVhY2ggKHN0cmluZyBwcm9ncmFtLCBtYXBwaW5nIGRhdGE6IG1lbW9yeSApIHsKKyAgICAgICAgaWYgKCBtYXBwaW5ncChkYXRhKSAmJiBzaXplb2YoZGF0YSkgKXsKKyAgICAgICAgICBwcmludGYoYnJlYWtfc3RyaW5nKAorICAgICAgICAgICAgICAgICAgIGltcGxvZGUobV9pbmRpY2VzKGRhdGEpLCI7XG4iKSwgNzgsICAKKyAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCIgICUtNTBzOiAiLHByb2dyYW0pKSwxKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHByaW50ZigiICAlLTUwczogLSBsZWVyIC1cbiIsIHByb2dyYW0pOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm47Cit9CisKZGlmZiAtLWdpdCBhL3NlY3VyZS9tZW1vcnlfbGliIGIvc2VjdXJlL21lbW9yeV9saWIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY1MzliMQotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9tZW1vcnlfbGliCkBAIC0wLDAgKzEsOSBAQAorIyBPYmpla3RlIGRpZSBpbiBkaWVzZXIgRGF0ZWkgc3RlaGVuLCBoYWJlbiBkaWUgQmVyZWNodGlndW5nIAorIyAvc2VjdXJlL21lbW9yeS5jIHp1IG51dHplbi4KKyMKKyMgRGllc2UgRGF0ZWkgd2lyZCBtaXQgZGVtIE11ZGxpYi1SZWxlYXNlIHZlcnRlaWx0LCBkYWhlciBkdWVyZmVuCisjIGhpZXIgbnVyIE9iamVrdGUgYXVmZ2Vub21tZW4gd2VyZGVuIGRpZSB6dXIgU3RhbmRhcmQtTXVkbGliCisjIGdlaG9lcmVuCisvcC9kYWVtb24vY2hhbm5lbGQKKy9wL2RhZW1vbi90cmF2ZWxkCisvc2VjdXJlL3NoYWRvd21hc3RlcgpkaWZmIC0tZ2l0IGEvc2VjdXJlL21lcmxpbi5jIGIvc2VjdXJlL21lcmxpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwNzViZWMKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvbWVybGluLmMKQEAgLTAsMCArMSwxMzQ1IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gbWVybGluLmMgLS0gVW5zZXIgZ2VsaWVidGVyIE1lcmxpbgorLy8KKy8vICRJZDogbWVybGluLmMgOTQwNSAyMDE1LTEyLTEzIDAwOjIyOjAxWiBaZXNzdHJhICQKKyNwcmFnbWEgc3RyaWN0X3R5cGVzCisjcHJhZ21hIG5vX2Nsb25lCisjcHJhZ21hIG5vX3NoYWRvdworI3ByYWdtYSBub19pbmhlcml0CisjcHJhZ21hIHZlcmJvc2VfZXJyb3JzCisjcHJhZ21hIGNvbWJpbmVfc3RyaW5ncworLy8jcHJhZ21hIHBlZGFudGljCisvLyNwcmFnbWEgcmFuZ2VfY2hlY2sKKyNwcmFnbWEgd2Fybl9kZXByZWNhdGVkCisKKy8vIDIwMTQtTWFpLTEwLCBBcmF0aG9ybjogRXIgc29sbCBqYSB3ZWl0ZXJoaW4gYXVmIHRtIHJlYWdpZXJlbi4KK2luaGVyaXQgInN0ZC9ucGMvY29tbS5jIjsKKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxsYW5ndWFnZS5oPgorI2luY2x1ZGUgPG1vdmluZy5oPgorI2luY2x1ZGUgPGRlZmluZXMuaD4KKyNpbmNsdWRlIDxleHBsb3JhdGlvbi5oPgorI2luY2x1ZGUgPG5ld3MuaD4KKyNpbmNsdWRlIDxleHBsb3JhdGlvbi5oPgorI2luY2x1ZGUgPGV2ZW50cy5oPgorI2luY2x1ZGUgPGRhZW1vbi9jaGFubmVsLmg+CisjaW5jbHVkZSAiL3NlY3VyZS93aXpsZXZlbHMuaCIKKyNpbmNsdWRlICIvc2VjdXJlL2NvbmZpZy5oIgorI2luY2x1ZGUgIi9zZWN1cmUvcXVlc3RtYXN0ZXIuaCIKKyNpbmNsdWRlICIvc2VjdXJlL2xlcG1hc3Rlci5oIgorCisjaWZuZGVmIERFQlVHCisjZGVmaW5lIERFQlVHKHgpIGlmIChmaW5kX3BsYXllcigiem9vayIpKSB0ZWxsX29iamVjdChmaW5kX3BsYXllcigiem9vayIpLHgpCisjZW5kaWYKKworI2RlZmluZSBTQVZFRklMRSAiL3NlY3VyZS9BUkNIL21lcmxpbiIKKyNkZWZpbmUgQlMoeCkgYnJlYWtfc3RyaW5nKCh4KSw3OCkKKyNkZWZpbmUgRkVITEVSVEVVRkVMICIvb2JqL3Rvb2xzL2ZlaGxlcnRldWZlbCIKKworbWl4ZWQgUXVlcnlQcm9wKHN0cmluZyBwcm9wKTsKK2ludCBtb3ZlKG1peGVkIGRlc3QsIGludCBtZXRob2QpOworc3RyaW5nIHF1ZXJ5X2dfc3VmZml4KGludCBnZW4sIGludCBjYXN1cywgaW50IGFuemFobCk7CitzdHJpbmcgbWFrZV9pbnZsaXN0KG9iamVjdCB2aWV3ZXIsb2JqZWN0ICppbnYpOworc3RhdGljIGludCBkZXRlcm1pbmVfYWN0aW9uKHN0cmluZyBtZXNzLCBzdHJpbmcgbmFtZSk7CitzdGF0aWMgaW50IGNyZWF0ZV93aXphcmQobWl4ZWQgd2hvLCBtaXhlZCBwcm9tb3Rlcik7CitzdGF0aWMgaW50IGNyZWF0ZV9zZWVyKG1peGVkIHdobyk7CitzdGF0aWMgdm9pZCBnaXZlX2hlbHAobWl4ZWQgd2hvKTsKK2ludCBnb3RvKG1peGVkIGRlc3QpOworCitub3NhdmUgc3RyaW5nICp3aGl0ZXNwYWNlcz0oeyIsIiwiLiIsIj8iLCI7IiwiOiIsIi0iLCIhIiwiXG4iLCJcdCJ9KTsKK25vc2F2ZSBvYmplY3QgcHJldl9yb29tOworbm9zYXZlIGludCBkZWxheSxtYXh1c2VycyxidXN5Oworbm9zYXZlIHN0cmluZyBmbGFnOworCittYXBwaW5nIE1CYW5pc2hMaXN0ZTsKKwordm9pZCBjcmVhdGUoKQoreworICBzdHJpbmcgczsKKyAgc2V0ZXVpZChST09USUQpOworICBpZiAoZmlsZV9zaXplKCIvZXRjL21heHVzZXJzIik8PTApCisgICAgbWF4dXNlcnM9MDsKKyAgZWxzZQorICB7CisgICAgcz1yZWFkX2ZpbGUoIi9ldGMvbWF4dXNlcnMiLDAsMSk7CisgICAgc3NjYW5mKHMsIiVkIixtYXh1c2Vycyk7CisgIH0KKyAgc2V0X2xpdmluZ19uYW1lKCJtZXJsaW4iKTsKKyAgZW5hYmxlX2NvbW1hbmRzKCk7CisgIGNhbGxfb3V0KCJ3YW5kZXJuIiwyNSk7CisgIG1vdmUoIi9naWxkZW4vYWJlbnRldXJlciIsMCk7CisgIE1CYW5pc2hMaXN0ZSA9IG1fYWxsb2NhdGUoMCwyKTsKKyAgcmVzdG9yZV9vYmplY3QoU0FWRUZJTEUpOworICBFVkVOVEQtPlJlZ2lzdGVyRXZlbnQoRVZUX0xJQl9QTEFZRVJfQ1JFQVRJT04sICJwbGF5ZXJfY2hhbmdlIiwgTUUpOworICBFVkVOVEQtPlJlZ2lzdGVyRXZlbnQoRVZUX0xJQl9MT0dJTiwgInBsYXllcl9jaGFuZ2UiLCBNRSk7CisgIC8vIGFic2ljaHRsaWNoIGtlaW4gRVZUX0xJQl9MT0dPVVQsIHMuIEtvbW1lbnRhciB6dSBub3RpZnlfcGxheWVyX2xlYXZlKCkuCit9CisKK3N0cmluZyBfcXVlcnlfa2lsbF9uYW1lKCkKK3sKKyAgcmV0dXJuICJFaW4gZ2VuZXJ2dGVyIE1lcmxpbiI7Cit9CisKK2ludCBtb3ZlKG1peGVkIG9iLGludCBtZXRob2RzKQoreworICBvYmplY3QgdG1wOworCisgIGlmIChtZXRob2RzJk1fR0VUKQorICAgIHJldHVybiBNRV9DQU5UX0JFX1RBS0VOOworCisgIGlmIChzdHJpbmdwKG9iKSkKKyAgeworICAgIGlmICghKHRtcD1maW5kX29iamVjdChvYikpKQorICAgIHsKKyAgICAgIGNhbGxfb3RoZXIob2IsIj8iKTsKKyAgICAgIHRtcD1maW5kX29iamVjdChvYik7CisgICAgfQorICAgIG9iPXRtcDsKKyAgfQorICBpZiAoIW9iamVjdHAob2IpKQorICAgIHJldHVybiAwOworICBpZiAoZW52aXJvbm1lbnQoKSkKKyAgICB0ZWxsX3Jvb20oZW52aXJvbm1lbnQoKSwiTWVybGluIHppZWh0IHdlaXRlci5cbiIpOworICB0ZWxsX3Jvb20ob2IsIk1lcmxpbiBrb21tdCBhbi5cbiIpOworICBtb3ZlX29iamVjdChvYik7CisgIHJldHVybiAxOworfQorCittaXhlZCBRdWVyeVByb3Aoc3RyaW5nIHN0cikKK3sKKyAgaWYgKCFzdHJpbmdwKHN0cil8fHN0cj09IiIpCisgICAgcmV0dXJuIDA7CisgIHJldHVybiBjYWxsX290aGVyKHRoaXNfb2JqZWN0KCksIl9xdWVyeV8iK3N0cik7Cit9CisKK3ZhcmFyZ3MgaW50IGlkKHN0cmluZyBzdHIpCit7CisgIHJldHVybiAoc3RyPT0ibWVybGluIik7Cit9CisKK3ZhcmFyZ3Mgc3RyaW5nIG5hbWUoaW50IGNhc3VzLCBpbnQgZGVtb24pCit7CisgIGlmIChjYXN1cyE9V0VTU0VOKQorICAgIHJldHVybiAiTWVybGluIjsKKyAgcmV0dXJuICJNZXJsaW5zIjsKK30KKwordmFyYXJncyBzdHJpbmcgTmFtZShpbnQgY2FzdXMsIGludCBkYWVtb24pCit7CisgIHJldHVybiBuYW1lKGNhc3VzLGRhZW1vbik7Cit9CisKK3N0cmluZyBRdWVyeUR1KGludCBjYXN1cywgaW50IGdlbmRlciwgaW50IHphaGwpCit7CisgIHJldHVybgorICAgICh7ICh7ICh7ICJkdSIsICJpaHIifSksICh7ICJkdSIsICJpaHIifSksICh7ICJkdSIsICJpaHIifSkgfSksCisgICAgICAgICAoeyh7ImRlaW5lcyIsImRlaW5lciJ9KSwoeyJkZWluZXMiLCJkZWluZXIifSksKHsiZGVpbmVyIiwiZGVpbmVyIn0pfSksCisgICAgICAgICAoeyh7ImRpciIsImV1Y2gifSksKHsiZGlyIiwiZXVjaCJ9KSwoeyJkaXIiLCJldWNoIn0pfSksCisgICAgICAgICAoeyh7ImRpY2giLCJldWNoIn0pLCh7ImRpY2giLCJldWNoIn0pLCh7ImRpY2giLCJldWNoIn0pfSkKKyAgICAgICB9KVtjYXN1c11bZ2VuZGVyXVt6YWhsXTsKK30KKworc3RyaW5nIGxvbmcoKQoreworICBFUE1BU1RFUi0+R2l2ZUV4cGxvcmF0aW9uUG9pbnQoIm1lcmxpbiIpOworICByZXR1cm4gYnJlYWtfc3RyaW5nKAorICAgICAgIk1lcmxpbiAtIGRlciBtYWVjaHRpZ2UgVXJ2YXRlciBhbGxlciBNYWdpZXIgLSBpc3QgZWluIGhhZ2VyZXIgIgorICAgICAgIk1hbm4sIGRlciBlaW5lbiBibGF1ZW4sIG1pdCBNb25kZW4gdW5kIFN0ZXJuZW4gdWViZXJzYWV0ZW4gVW1oYW5nICIKKyAgICAgICJ0cmFlZ3QgdW5kIHNpY2ggYXVmIGVpbmVuIGtub3JyaWdlbiBTdG9jayBzdHVldHp0LiBTZWluIGxhbmdlciB3ZWlzc2VyICIKKyAgICAgICJCYXJ0IHJlaWNodCBpaG0gZmFzdCBiaXMgenVyIEd1ZXJ0ZWxzY2huYWxsZSwgc2VpbiBIYXVwdGhhYXIgaXN0IGZhc3QgIgorICAgICAgImViZW5zbyBsYW5nLiBBdWYgc2VpbmVtIEtvcGYgdHJhZWd0IGVyIGVpbmVuIHNwaXR6ZW4gSHV0LCBkZXIgaWhuIG5vY2ggIgorICAgICAgImdyb2Vzc2VyIG1hY2h0LCBhbHMgZXIgb2huZWhpbiBzY2hvbiBpc3QuXG5FciBpc3QgdW5hbmdyZWlmYmFyLCBkZW5uICIKKyAgICAgICJlciBzdGVodCB1ZWJlciBzb2xjaGVuIERpbmdlbi4iLDc4LEJTX0xFQVZFX01ZX0xGUyk7Cit9CisKK3N0cmluZyBHZXREZXRhaWwoc3RyaW5nIGtleSxtaXhlZCByYWNlLGludCBzZW5zZSkgeworICBzd2l0Y2goIHNlbnNlICkgeworICBjYXNlIFNFTlNFX1NNRUxMOiByZXR1cm4gMDsKKyAgY2FzZSBTRU5TRV9TT1VORDogcmV0dXJuIDA7CisgIH0KKyAgc3dpdGNoKCBrZXkgKSB7CisgIGNhc2UgIm5hc2UiOiBjYXNlICJuYXNlbmhhYXJlIjogY2FzZSAiaGFrZW5uYXNlIjoKKyAgICAgICAgICByZXR1cm4gQlMoIk1lcmxpbiBoYXQgZWluZSBsYW5nZSwga3J1bW1lIEhha2VubmFzZSwgYXVzIGRlcmVuIE5hc2VubG9lY2hlcm4gd2Vpc3NlIEhhYXJlIHNwcmllc3Nlbi4gQXVmIHNlaW5lciBOYXNlIHNpdHp0IGVpbmUgQnJpbGxlIG1pdCBHbGFlc2VybiBpbiBGb3JtIGVpbmVzIEhhbGJtb25kZXMuIik7CisgIGNhc2UgImJyaWxsZSI6IGNhc2UgImdsYWVzZXIiOiBjYXNlICJmb3JtIjogY2FzZSAiaGFsYm1vbmQiOgorICAgICAgICAgIHJldHVybiAiTWVybGlucyBCcmlsbGUgYmVzaXR6dCBHbGFlc2VyIGluIEZvcm0gZWluZXMgSGFsYm1vbmRlcy5cbiI7CisgIGNhc2UgImJhcnQiOgorICAgICAgICAgIHJldHVybiAiTWVybGlucyBCYXJ0IGlzdCBzZWhyIGxhbmcgLSBFciByZWljaHQgZmFzdCBiaXMgdWViZXIgZGllIEd1ZXJ0ZWxzY2huYWxsZS5cbiI7CisgIGNhc2UgImhhYXJlIiA6CisgICAgICAgICAgcmV0dXJuICJTaWUgcmVpY2hlbiBpaG0gYmlzIHp3aXNjaGVuIGRpZSBTY2h1bHRlcmJsYWV0dGVyLlxuIjsKKyAgY2FzZSAic2NodWx0ZXJibGFldHRlciI6IGNhc2UgInNjaHVsdGVyYmxhdHQiOgorICAgICAgICAgIHJldHVybiAiU2VpbmUgbGFuZ2VuIEhhYXJlIGJlZGVja2VuIGRpZSBTY2h1bHRlcmJsYWV0dGVyLlxuIjsKKyAgY2FzZSAiZ2V3YW5kIjogY2FzZSAicm9iZSI6CisgICAgICAgICAgcmV0dXJuIEJTKCJEYXMgR2V3YW5kIGlzdCBibGF1IHVuZCBtaXQgc2lsYmVybmVuIE1vbmRlbiB1bmQgU3Rlcm5lbiBiZXN0aWNrdC4gRXMgaXN0IHVyYWx0IHVuZCBzY2hvbiBldHdhcyBhYmdldHJhZ2VuLCBhYmVyIGVzIGVyZnVlbGx0IGltbWVyIG5vY2ggc2VpbmVuIFp3ZWNrLiIpOworICBjYXNlICJ6d2VjayI6CisgICAgICAgICAgcmV0dXJuIEJTKCJEZXIgWndlY2sgZGVzIEdld2FuZGVzIGJlc3RlaHQgZGFybiwgTWVybGluIHN0YW5kZXNnZW1hZXNzIHp1IGJla2xlaWRlbi4gRGllc2VtIFp3ZWNrIGtvbW10IGRhcyBHZXdhbmQgaW4gVm9sbGVuZHVuZyBuYWNoLiIpOworICBjYXNlICJ2b2xsZW5kdW5nIjoKKyAgICAgICAgICByZXR1cm4gIk5pY2h0cyBpc3Qgdm9sbGtvbW1lbi5cbiI7CisgIGNhc2UgImh1dCI6CisgICAgICAgICAgcmV0dXJuIEJTKCJFaW4gbGFuZ2VyLCBzcGl0emVyIEh1dCwgZGVyIGluIGRlciBnbGVpY2hlbiBXZWlzZSB3aWUgc2VpbmUgUm9iZSBtaXQgTW9uZGVuIHVuZCBTdGVybmVuIGJlc3RpY2t0IGlzdC4iKTsKKyAgY2FzZSAibW9uZCI6IGNhc2UgIm1vbmRlIjogY2FzZSAic3Rlcm4iOiBjYXNlICJzdGVybmUiOgorICAgICAgICAgIHJldHVybiBCUygiRGllIE1vbmRlIHVuZCBkaWUgU3Rlcm5lIHNpbmQgbWl0IHNpbGJyaWdlbiBGYWVkZW4gZ2VzdGlja3QsIGRpZSBkYXMgTGljaHQgZnVua2VsbmQgenVydWVja3dlcmZlbi4iKTsKKyAgY2FzZSAiZmFkZW4iOiBjYXNlICJmYWVkZW4iOgorICAgICAgICAgIHJldHVybiBCUygiU2Nod2VyIHp1IHNhZ2VuLCB3b3JhdXMgZGllIEZhZWRlbiBzaW5kLiBNaXRocmlsPyAiCisgICAgICAgICAgICAgICJNb25kc2lsYmVyPyIpOworICBjYXNlICJsaWNodCI6IGNhc2UgIm1vbmRzaWxiZXIiOiBjYXNlICJtaXRocmlsIjoKKyAgICAgICAgICByZXR1cm4gQlMoIkR1IHN0cmVja3Qgc2Nob24gRGVpbmUgSGFuZCBhdXMsIHVtIE1lcmxpbnMgR2V3YW5kIG5hZWhlciB6dSB1bnRlcnN1Y2hlbiwgYWJlciBkYSB0cmlmZnQgRGljaCBzZWluIHN0cmVuZ2VyIEJsaWNrLiBTY2h1ZWNodGVybiBuaW1tc3QgRHUgdm9uIERlaW5lbSBWb3JoYWJlbiBBYnN0YW5kLiIpOworICBjYXNlICJhYnN0YW5kIjoKKyAgICAgICAgICByZXR1cm4gQlMoIlZvbiBzbyBlaW5lbSBNYWdpZXIgc29sbHRlIG1hbiBhdXMgUmVzcGVrdCBlaW5lbiBTY2hyaXR0IEFic3RhbmQgaGFsdGVuLiIpOworICBjYXNlICJyZXNwZWt0IjoKKyAgICAgICAgICByZXR1cm4gIkR1IGhhc3Qgc2ljaGVyIG1laHIgUmVzcGVrdCB2b3IgTWVybGluLCBhbHMgZXIgdm9yIERpci5cbiI7CisgIGNhc2UgInNjaHJpdHQiOgorICAgICAgICAgIHJldHVybiAiV2Vzc2VuIFNjaHJpdHQ/P1xuIjsKKyAgY2FzZSAiaGFuZCI6IGNhc2UgImhhZW5kZSI6CisgICAgICAgICAgcmV0dXJuIEJTKCJNZXJsaW5zIEhhZW5kZSBoYWJlbiBsYW5nZSwgZ2ljaHRnZXBsYWd0ZSBGaW5nZXIgdW5kIGdlbGJlIGxhbmdlIEZpbmdlcm5hZWdlbC4gU2VpbmUgbGlua2UgSGFuZCBzdHVldHp0IHNpY2ggYXVmIHNlaW5lbiBrbm9ycmlnZW4gR2Voc3RvY2suIERpZSByZWNodGUgSGFuZCBpc3QgdW50ZXIgc2VpbmVtIEdld2FuZCB2ZXJib3JnZW4uIik7CisgIGNhc2UgImdpY2h0a25vdGVuIjogY2FzZSAiZ2ljaHQiOgorICAgICAgICAgIHJldHVybiBCUygiRHVyY2ggZGllIEdpY2h0a25vdGVuIHNlaGVuIHNlaW5lIEhhZW5kZSBmYXN0IHNvIGtub3JyaWcgd2llIHNlaW4gR2Voc3RvY2sgYXVzLiIpOworICBjYXNlICJmaW5nZXIiOiBjYXNlICJmaW5nZXJuYWVnZWwiOiBjYXNlICJmaW5nZXJuYWdlbCI6CisgICAgICAgICAgcmV0dXJuIEJTKCJTZWluZSBGaW5nZXIgc2luZCB2b2xsZXIgR2ljaHRrbm90ZW4gdW5kIHNlaW5lIGdlbGJlbiBGaW5nZXJuYWVnZWwga29lbm50ZSBNZXJsaW4gYXVjaCBtYWwgd2llZGVyIHNjaG5laWRlbi4iKTsKKyAgY2FzZSAiZ2Voc3RvY2siOiBjYXNlICJzdG9jayI6CisgICAgICAgICAgcmV0dXJuIEJTKCJNZXJsaW4gc3R1ZXR6dCBzaWNoIGF1ZiBlaW5lbiBHZWhzdG9jay4gRGVyIGtub3JyaWdlIFN0b2NrIHNjaGVpbnQgc2Nob24gZmFzdCBFaW5zIG1pdCBzZWluZXIgZ2ljaHRrbm90aWdlbiBIYW5kIGdld29yZGVuIHp1IHNlaW4uIE9iIGVzIHNpY2ggYmVpIGRlbSBTdG9jayB1bSBlaW5lbiBNYWdpZXJzdGFiIGhhbmRlbHQ/Iik7CisgIGNhc2UgInphdWJlcnN0YWIiOiBjYXNlICJtYWdpZXJzdGFiIjoKKyAgICAgICAgICByZXR1cm4gQlMoIk1lcmxpbiBzdHVldHp0IHNpY2ggYXVmIGVpbmVuIGtub3JyaWdlbiBHZWhzdG9jay4gRGFzIGtvZW5udGUgc2VpbiBaYXViZXJzdGFiIHNlaW4gLSBhYmVyIHZpZWxsZWljaHQgaXN0IGVzIGF1Y2ggbnVyIGVpbiBHZWhzdG9jay4iKTsKKyAgY2FzZSAiZ3VlcnRlbCI6IGNhc2UgImd1ZXJ0ZWxzY2huYWxsZSI6CisgICAgICAgICAgcmV0dXJuIEJTKCJTZWluIEdld2FuZCB3aXJkIHZvbiBlaW5lbSB3ZWlzc2VuIEd1ZXJ0ZWwgZ2VoYWx0ZW4uIFZvcm5lLCB1bnRlciBzZWluZW0gQmFydCwga2FubnN0IER1IGRpZSBHdWVydGVsc2NobmFsbGUgc2VoZW4uIEF1ZiBkZXIgR3VlcnRlbHNjaG5hbGxlIHN0ZWh0OiAnSWNoIGtvZW5udGUgamVkZXJ6ZWl0IGF1ZmhvZXJlbi4nIik7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKworc3RyaW5nIHNob3J0KCkKK3sKKyAgcmV0dXJuICJNZXJsaW4sIGRlciBVcnZhdGVyIGFsbGVyIE1hZ2llci5cbiI7Cit9CisKK3N0cmluZyBfcXVlcnlfcmFjZSgpCit7CisgIHJldHVybiAiTWFnaWVyIjsKK30KKworaW50IF9xdWVyeV9nZW5kZXIoKQoreworICByZXR1cm4gMTsKK30KKworc3RyaW5nIFF1ZXJ5UG9zc1Byb25vdW4oIG1peGVkIHdoYXQsIGludCBjYXN1cywgaW50IG51bWJlciApCit7CisgIGludCBnZW4yOworICBnZW4yID0gKCBpbnRwKCB3aGF0ICkgKSA/IHdoYXQgOiB3aGF0LT5RdWVyeVByb3AoUF9HRU5ERVIpOworICByZXR1cm4gInNlaW4iICsgcXVlcnlfZ19zdWZmaXgoIGdlbjIsIGNhc3VzLCBudW1iZXIgKTsKK30KKworc3RyaW5nIHF1ZXJ5X2dfc3VmZml4KCBpbnQgZ2VuLCBpbnQgY2FzdXMsIGludCBhbnphaGwgKQoreworICByZXR1cm4gKHsgKHsgKHsiIiwiZSJ9KSwgKHsiZXMiLCJlciJ9KSwgKHsiZW0iLCJlbiJ9KSwgKHsiIiwiZSJ9KSB9KSwKKyAgICAgICAgICAgICAgKHsgKHsiIiwiZSJ9KSwgKHsiZXMiLCJlciJ9KSwgKHsiZW0iLCJlbiJ9KSwgKHsiZW4iLCJlIn0pIH0pLAorICAgICAgICAgICAgICAoeyAoeyJlIiwiZSJ9KSwgKHsiZXIiLCJlciJ9KSwgKHsiZXIiLCJlbiJ9KSwgKHsiZSIsImUifSkgfSkgfSkKKyAgICBbZ2VuXVtjYXN1c11bYW56YWhsXTsKK30KKworc3RyaW5nIFF1ZXJ5UHJvbm91bihpbnQgY2FzdXMpCit7CisgIHN3aXRjaChjYXN1cykgeworICAgIGNhc2UgV0VSOiByZXR1cm4gImVyIjsgIGJyZWFrOworICAgIGNhc2UgV0VNOiByZXR1cm4gImlobSI7CisgIH0KKyAgcmV0dXJuICJpaG4iOworfQorCitzdHJpbmcgX3F1ZXJ5X3Nob3J0KCkKK3sKKyAgcmV0dXJuIHNob3J0KCk7Cit9CisKK3N0cmluZyBfcXVlcnlfbG9uZygpCit7CisgIHJldHVybiBsb25nKCk7Cit9CisKK3N0cmluZyBfcXVlcnlfbmFtZSgpCit7CisgIHJldHVybiAiTWVybGluIjsKK30KKworaW50IF9xdWVyeV93ZWlnaHQoKQoreworICByZXR1cm4gNzUwMDA7Cit9CisKK3N0YXRpYyB2b2lkIFBvc3RTZWhlcihzdHJpbmcgd2hvLCBpbnQgZykKK3sKKyAgbWl4ZWQgKmFydDsKKworICBhcnQ9KHsic3R1ZmVuIiwiTWVybGluIiwwLDAsc3ByaW50ZigiJXMgaXN0IGpldHp0IGVpbiVzIFNlaGVyJXMhIix3aG8sKGc9PTI/ImUiOiIiKSwoZz09Mj8iaW4iOiIiKSksc3ByaW50ZigiXG5BbSAlcyBoYXQgJXMgZGllIG5vZXRpZ2VuIEJlZGluZ3VuZ2VuXG5lcmZ1ZWxsdCB1bmQgaXN0IHZvbSBTcGllbGVyc3RhdHVzIHp1bSBTZWhlcnN0YXR1cyBhdWZnZXN0aWVnZW4uIFxuXG4gSGVyemxpY2hlbiBHbHVlY2t3dW5zY2gsICVzIVxuIixkdGltZSh0aW1lKCkpLHdobyx3aG8pfSk7CisgICIvc2VjdXJlL25ld3MiLT5Xcml0ZU5vdGUoYXJ0LDEpOworfQorCitzdGF0aWMgdm9pZCBQb3N0TWFnaWVyKHN0cmluZyB3aG8sIHN0cmluZyBwcm9tLCBpbnQgZ2VuZGVyKQoreworICBtaXhlZCAqYXJ0OworCisgIGFydD0oeyJzdHVmZW4iLCJNZXJsaW4iLDAsMCxzcHJpbnRmKCIlcyBpc3QgamV0enQgZWluJXMgTWFnaWVyJXMhIix3aG8sKGdlbmRlcj09Mj8iZSI6IiIpLChnZW5kZXI9PTI/ImluIjoiIikpLHNwcmludGYoIlxuQW0gJXMgaGF0ICVzICVzIHp1JXMgTWFnaWVyJXNcbmJlcnVmZW4uIEhlcnpsaWNoZW4gR2x1ZWNrd3Vuc2NoLCAlcy4gR2x1ZWNrd3VlbnNjaGUgYXVjaCBhbiBEaWNoLFxuICVzLCB6dSBEZWluZSVzIG5ldWVuICVzIVxuIixkdGltZSh0aW1lKCkpLHByb20sd2hvLChnZW5kZXI9PTI/InIiOiJtIiksKGdlbmRlcj09Mj8iaW4iOiIiKSx3aG8scHJvbSwKKyhnZW5kZXI9PTI/InIiOiJtIiksKGdlbmRlcj09Mj8iVG9jaHRlciI6IlNvaG4iKSl9KTsKKyAgIi9zZWN1cmUvbmV3cyItPldyaXRlTm90ZShhcnQsMSk7Cit9CisKKworcHJpdmF0ZSB2b2lkIEdpYkZlaGxlcnRldWZlbChvYmplY3Qgd2l6KSB7CisgIGlmICghb2JqZWN0cCh3aXopKQorICAgICAgcmV0dXJuOworCisgIGNsb25lX29iamVjdChGRUhMRVJURVVGRUwpLT5tb3ZlKHdpeiwgTV9OT0NIRUNLfE1fR0VUKTsKKyAgdGVsbF9vYmplY3Qod2l6LCBicmVha19zdHJpbmcoCisgICAgIkh1aHUgIit3aXotPk5hbWUoV0VSKSArICIhIEljaCBoYWJlIGdlc2VoZW4sIGRhc3MgRHUga2VpbmVuICIKKyAgICAiRmVobGVydGV1ZmVsIGhhc3QuIERpZXNlcyBUb29sIGlzdCB6dW0gRGVidWdnZW4gdm9uIEZlaGxlcm4gaW0gIgorICAgICJNdWQgc2VociBwcmFrdGlzY2guIEJpdHRlIHNjaGF1IGlobiBEaXIgbWFsIGFuLiA6LSkgRGllIEhpbGZlIHp1bSAiCisgICAgIkZlaGxlcnRldWZlbCBrYW5uc3QgRHUgbWl0ICdtYW4gZmVobGVydGV1ZmVsJyBsZXNlbi4gQlRXOiBXZW5uICIKKyAgICAiRHUgZGVuIEZlaGxlcnRldWZlbCBuaWNodCB3aWxsc3QsIGthbm5zdCBEdSBpaG4gemVyc3RvZXJlbiwgaWNoICIKKyAgICAid2VyZGUgRGljaCBrZWluIHp3ZWl0ZXMgTWFsIGRhbWl0IGJlbGFlc3RpZ2VuLiIsNzgsCisgICAgIk1lcmxpbiB0ZWlsdCBEaXIgbWl0OiAiKQorICAgICsgIk1lcmxpbiB1ZWJlcnJlaWNodCBEaXIgYXVzIGRlciBGZXJuZSBlaW5lbiBrbnVzcHJpZyBnZWJyYXRlbmVuICIKKyAgICAiRmVobGVydGV1ZmVsLlxuXG4iKTsKK30KKworcHJpdmF0ZSB2b2lkIG5vdGlmeV9wbGF5ZXJfY2hhbmdlKHN0cmluZyB3aG8saW50IHJlaW4pCit7CisgIGlmICghc3RyaW5ncCh3aG8pKQorICAgIHJldHVybjsKKworICAvLyBNYXgtdXNlciBmZXN0aGFsdGVuCisgIGlmIChmaWxlX3NpemUoIi9ldGMvbWF4dXNlcnMiKTw9MCkKKyAgICBtYXh1c2Vycz0wOworICBpZiAoc2l6ZW9mKHVzZXJzKCkpPj1tYXh1c2VycykKKyAgeworICAgIG1heHVzZXJzPXNpemVvZih1c2VycygpKTsKKyAgICB3cml0ZV9maWxlKCJldGMvbWF4dXNlcnMiLHNwcmludGYoIiVkIHVzZXI6ICVzICglcylcbiIsCisgICAgICAgICAgbWF4dXNlcnMsZHRpbWUodGltZSgpKSxxdWVyeV9sb2FkX2F2ZXJhZ2UoKSksMSk7CisgIH0KKworICAvLyBhbGxlbiBNYWdpZXJuIGFiIExldmVsIDIwLCBkaWUga2VpbmVuIEZlaGxlcnRldWZlbCBoYWJlbiB1bmQgZGVyZW4KKyAgLy8gbGV0enRlciBMb2dvdXQgdm9yICJEaWUsIDE3LiBNYXIgMjAwOSwgMjM6NDA6MDQiID0+IDEyMzczMjk2MDQgd2FyLAorICAvLyBlaW5lbiBGZWhsZXJ0ZXVmZWwgY2xvbmVuIHVuZCBuZW4gSGl3bmVpcyBtaXR0ZWlsZW4uCisgIG9iamVjdCBvYiA9IGZpbmRfcGxheWVyKHdobyk7CisgIGlmIChvYiAmJiByZWluICYmIElTX1dJWkFSRChvYikKKyAgICAgICYmICFwcmVzZW50X2Nsb25lKEZFSExFUlRFVUZFTCxvYikKKyAgICAgICYmIG9iLT5RdWVyeVByb3AoUF9MQVNUX0xPR09VVCkgPCAxMjM3MzI5NjA0ICkKKyAgICBHaWJGZWhsZXJ0ZXVmZWwob2IpOworfQorCitwcml2YXRlIHZvaWQgQW5ub3VuY2VOZXdQbGF5ZXIob2JqZWN0IHBsKSB7CisKKyAgaWYgKCFwbCB8fCAhaW50ZXJhY3RpdmUocGwpKQorICAgIHJldHVybjsKKworICAvLyB2ZXJ6b2VnZXJuLCBiaXMgZGVyIFNwaWVsZXIgd2lya2xpY2ggZmVydGlnIGlzdC4KKyAgaWYgKHBsLT5RdWVyeVByb3AoUF9MRVZFTCkgPCAwKSB7CisgICAgY2FsbF9vdXQoIydBbm5vdW5jZU5ld1BsYXllciwxMCxwbCk7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKCEoaW50KXBsLT5RdWVyeUd1ZXN0KCkpIHsKKyAgc3RyaW5nIHBsbmFtZSA9IChzdHJpbmcpcGwtPk5hbWUoV0VSKTsKKyAgICBDSE1BU1RFUi0+c2VuZCgiQW5mYWVuZ2VyIiwgdGhpc19vYmplY3QoKSwKKyAgICAgIHNwcmludGYoIiVzIG1hY2h0IG51biBlYmVuZmFsbHMgZGFzIE1vcmdlbmdyYXVlbiB1bnNpY2hlci4gIgorICAgICAgICAgICAgICAiSGVyemxpY2ggV2lsbGtvbW1lbiAlcyEiLCBwbG5hbWUsIHBsbmFtZSkKKyAgICAgICk7CisgIH0KK30KKworLy8gS2FubiBiZWkgcmVib290IHdpZWRlciByYXVzLi4uIHplc3N0cmEsIDE2LjAzLjIwMDcKKyNpZiBfX0JPT1RfVElNRV9fIDwgMTMxODExMDcyMworI2RlZmluZSBCVUdUSU1FIDEzMTgwMDMyMDAgCisjZGVmaW5lIEJVR0ZJWFRJTUUgMTMxODEwOTQyMQordm9pZCByZW5ld19wbGF5ZXIoc3RyaW5nIHBsbmFtZSwgaW50IGZvcmNlKSB7CisgICAgb2JqZWN0IHBsOworICAgIG1peGVkIGVycjsKKworICAgIHBsID0gZmluZF9wbGF5ZXIocGxuYW1lKTsKKyAgICBpZiAoIW9iamVjdHAocGwpIHx8ICFxdWVyeV9vbmNlX2ludGVyYWN0aXZlKHBsKSkgcmV0dXJuOworCisgICAgLy8ganVuZyBvZGVyIGFsdCBnZW51ZywgQWJicnVjaC4gOy0pCisgICAgaWYgKChvYmplY3RfdGltZShwbCkgPiBCVUdGSVhUSU1FKQorICAgICAgICB8fCBvYmplY3RfdGltZShwbCkgPCBCVUdUSU1FKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoZ2V0X2V2YWxfY29zdCgpIDwgMTAwMDAwMCB8fCAhZm9yY2UgKSB7CisgICAgICAgIGNhbGxfb3V0KCJyZW5ld19wbGF5ZXIiLDgscGxuYW1lLDEpOworICAgICAgICB0ZWxsX29iamVjdChwbCxicmVha19zdHJpbmcoc3ByaW50ZigiSHVodSAlcywgdW0gZWluZW4gQnVnIGluICIKKyAgICAgICAgICAgICAgICAiRGVpbmVtIFNwaWVsZXJvYmpla3QgenUgYmVoZWJlbiwgd2lyc3QgRHUgaW4gY2EuIDhzICIKKyAgICAgICAgICAgICAgICAibmV1Z2VsYWRlbi4gQml0dGUgd2FydGUgYmlzIGRhaGluIGFiIHVuZCBibGVpYmUsIHdvICIKKyAgICAgICAgICAgICAgICAiRHUgZ2VyYWRlIGJpc3QuIixwbC0+TmFtZSgpKSw3OCwiTWVybGluIHRlaWx0IERpciBtaXQ6ICIpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHBsbmFtZT1nZXR1aWQocGwpOworICAgIHRlbGxfb2JqZWN0KHBsLGJyZWFrX3N0cmluZyhzcHJpbnRmKCJIdWh1ICVzLCB1bSBlaW5lbiBCdWcgaW4gIgorICAgICAgICAgICAgIkRlaW5lbSBTcGllbGVyb2JqZWt0IHp1IGJlaGViZW4sIHdpcnN0IER1IGpldHp0ICIKKyAgICAgICAgICAgICJuZXVnZWxhZGVuLiIscGwtPk5hbWUoKSksNzgsIk1lcmxpbiB0ZWlsdCBEaXIgbWl0OiAiKSk7CisKKyAgICBpZiAoZXJyPWNhdGNoKG1hc3RlcigpLT5yZW5ld19wbGF5ZXJfb2JqZWN0KHBsKTtwdWJsaXNoKSkgeworICAgICAgICBsb2dfZmlsZSgiemVzc3RyYS9mYWlsZWRfcmV3ZXcubG9nIixzcHJpbnRmKCIlczogRmVobGVyICVPIGJlaW0gIgorICAgICAgICAgICAgICAiUmVuZXcgdm9uICVzXG4iLGR0aW1lKHRpbWUoKSksZXJyLHBsbmFtZSkpOworICAgICAgICB0ZWxsX29iamVjdChwbCxicmVha19zdHJpbmcoIkJlaW0gTmV1bGFkZW4gRGVpbmVzIFNwaWVsZXJvYmpla3RzICIKKyAgICAgICAgICAgICAgImdhYiBlcyBlaW5lbiBGZWhsZXIuIEJpdHRlIHdlbmRlIERpY2ggYW4gZWluZW4gRU0uIiw3OCwKKyAgICAgICAgICAiTWVybGluIHRlaWx0IERpciBtaXQ6ICIpKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBsb2dfZmlsZSgiemVzc3RyYS9yZW5ld2VkLmxvZyIsc3ByaW50ZigiJXM6ICVzIHd1cmRlIHJlbmV3ZWQuXG4iLAorICAgICAgICAgICAgZHRpbWUodGltZSgpKSxwbG5hbWUpKTsKKyAgICAgIGlmIChvYmplY3RwKGZpbmRfcGxheWVyKHBsbmFtZSkpKQorICAgICAgICAgIHRlbGxfb2JqZWN0KGZpbmRfcGxheWVyKHBsbmFtZSksCisgICAgICAgICAgICBicmVha19zdHJpbmcoIkRlaW4gU3BpZWxlcm9iamVrdCB3dXJkZSBuZXVnZWxhZGVuLiBEdSAiCisgICAgICAgICAgImthbm5zdCBqZXR6dCBub3JtYWwgd2VpdGVyc3BpZWxlbi4gRmFsbHMgRHUgZXR3YXMgdW5nZXdvZWhubGljaGVzICIKKyAgICAgICAgICAiYmVtZXJrc3QsIG1lbGRlIERpY2ggYml0dGUgYmVpIGVpbmVtIEVyem1hZ2llci4gVmllbCBTcGFzcyBpbSAiCisgICAgICAgICAgIlNwaWVsISIsNzgsICJNZXJsaW4gdGVpbHQgRGlyIG1pdDogIikpOworICAgIH0KK30KKyNlbmRpZgorCit2b2lkIHBsYXllcl9jaGFuZ2Uoc3RyaW5nIGVpZCwgb2JqZWN0IHRyaWdvYiwgbWl4ZWQgZGF0YSkgeworCisgIGlmICghdHJpZ29iIHx8ICFpbnRlcmFjdGl2ZSh0cmlnb2IpKQorICAgIHJldHVybjsKKworICBzd2l0Y2goZWlkKSB7CisgICAgY2FzZSBFVlRfTElCX1BMQVlFUl9DUkVBVElPTjoKKyAgICAgIGNhbGxfb3V0KCMnQW5ub3VuY2VOZXdQbGF5ZXIsIDUsIHRyaWdvYik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEVWVF9MSUJfTE9HSU46CisgICAgICBub3RpZnlfcGxheWVyX2NoYW5nZShkYXRhW0VfUExOQU1FXSwxKTsKKyNpZiBfX0JPT1RfVElNRV9fIDwgMTMxODExMDcyMworICAgICAgLy8gU3BpZWxlciBldnRsLiByZW5ld2VuPyBCZWkgcmVib290IHJhdXMgKDA4LjEwLjIwMTEpCisgICAgICByZW5ld19wbGF5ZXIoZGF0YVtFX1BMTkFNRV0sMCk7CisjZW5kaWYKKyAgICAgIGJyZWFrOworICB9Cit9CisKKworLy9iZXNzZXIgUF9OT19BVFRBQ0sgYWxzIERlZmVuZCgpLi4uCittaXhlZCBfcXVlcnlfbm9fYXR0YWNrKCkgeworICBpZiAoIWxpdmluZyhQTCkgfHwgIW9iamVjdHAoZW52aXJvbm1lbnQoUEwpKSApIHJldHVybigxKTsKKworICB0ZWxsX3Jvb20oZW52aXJvbm1lbnQoKSwgIk1lcmxpbiBzY2hpbXBmdDogTGFzcyBkYXMhISFcbiIsKHtQTH0pKTsKKyAgdGVsbF9yb29tKGVudmlyb25tZW50KCksc3ByaW50ZigKKyAgICAgICAgIk1lcmxpbiBnaWJ0ICVzIGVpbmUgc2NoYWxsZW5kZSBPaHJmZWlnZS5cbiIsICAgICAgCisgICAgICAgIGNhcGl0YWxpemUoKHN0cmluZyl0aGlzX3BsYXllcigpLT5uYW1lKFdFTSkpKSwgKHt0aGlzX3BsYXllcigpfSkpOworICByZXR1cm4oIk1lcmxpbiBzY2hpbXBmdDogTGFzcyBkYXMhISFcbiIKKyAgICAgICJNZXJsaW4gZ2lidCBEaXIgZWluZSBzY2hhbGxlbmRlIE9ocmZlaWdlLlxuIik7Cit9CisKKy8qCitpbnQgRGVmZW5kKGludCBkYW0sIHN0cmluZyBkYW1fdHlwZSwgaW50IHNwZWxsLCBvYmplY3QgZW5lbXkpCit7CisgIG9iamVjdCBlbjsKKyAgaWYgKCFlbj1wcmV2aW91c19vYmplY3QoKSB8fCAhbGl2aW5nKGVuKSkKKyAgICBlbiA9IHRoaXNfcGxheWVyKCk7CisgIHRlbGxfcm9vbShlbnZpcm9ubWVudCgpLCAiTWVybGluIHNjaGltcGZ0OiBMYXNzIGRhcyEhIVxuIik7CisgIHdyaXRlKCJNZXJsaW4gZ2lidCBEaXIgZWluZSBzY2hhbGxlbmRlIE9ocmZlaWdlLlxuIik7CisgIHNheShzcHJpbnRmKCJNZXJsaW4gZ2lidCAlcyBlaW5lIHNjaGFsbGVuZGUgT2hyZmVpZ2UuXG4iLAorICAgICAgICAgICAgICBjYXBpdGFsaXplKChzdHJpbmcpdGhpc19wbGF5ZXIoKS0+bmFtZShXRU0pKSksIHRoaXNfcGxheWVyKCkpOworICBlbi0+U3RvcEh1bnRGb3IodGhpc19vYmplY3QoKSwgMSk7Cit9CisqLwordm9pZCBzaG91dGFuc3coKQoreworICBvYmplY3QgZW52LHRpOworICBzdHJpbmcgKnBhdGg7CisgIHN0cmluZyBhbnM7CisKKyAgaWYgKCEoZW52PWVudmlyb25tZW50KCkpKQorICAgIHJldHVybjsKKyAgaWYgKCEodGk9dGhpc19pbnRlcmFjdGl2ZSgpKXx8KGludCl0aS0+UXVlcnlQcm9wKFBfTEVWRUwpPDE5fHx0aS0+UXVlcnlQcm9wKFBfR0hPU1QpKQorICAgIHJldHVybjsKKyAgdGVsbF9vYmplY3QodGksIkR1IHNwdWVyc3QgZWluZW4gc2VuZ2VuZGVuIFNjaG1lcnouXG4iKTsKKyAgdGktPmRvX2RhbWFnZSggKChpbnQpdGktPlF1ZXJ5UHJvcChQX0hQKSkgLyAyICsgNSk7CisgIGlmKChpbnQpdGktPlF1ZXJ5UHJvcChQX0dIT1NUKSkgcmV0dXJuOworICBhbnM9ImljaCBoYWIgbmljaHQgZGllIGxlaXNlc3RlIElkZWUsIHdvIGljaCBoaWVyIGJpbiAuLi5cbiI7CisgIHBhdGg9b2xkX2V4cGxvZGUob2JqZWN0X25hbWUoZW52KSwiLyIpOworICBpZiAocGF0aFswXT09ImQiKQorICB7CisgICAgYW5zPSJ3ZXJ3ZWlzc3dvIC4uIjsKKyAgICBzd2l0Y2gocGF0aFsxXSkKKyAgICB7CisgICAgICBjYXNlICJnZWJpcmdlIjoKKyAgICAgIGNhc2UgIndhbGQiOgorICAgICAgY2FzZSAiZHNjaHVuZ2VsIjoKKyAgICAgIGFucz0iaW0gIitjYXBpdGFsaXplKHBhdGhbMV0pOworICAgICAgYnJlYWs7CisgICAgICBjYXNlICJpbnNlbG4iOgorICAgICAgYW5zPSJhdWYgZGVuIEluc2VsbiI7CisgICAgICBicmVhazsKKyAgICAgIGNhc2UgInBvbGFyIjoKKyAgICAgIGFucz0iaW0gUG9sYXJnZWJpZXQiOworICAgICAgYnJlYWs7CisgICAgICBjYXNlICJ1bnRlcndlbHQiOgorICAgICAgY2FzZSAiZWJlbmUiOgorICAgICAgY2FzZSAid3Vlc3RlIjoKKyAgICAgIGFucz0iaW4gZGVyICIrY2FwaXRhbGl6ZShwYXRoWzFdKTsKKyAgICAgIGJyZWFrOworICAgICAgY2FzZSAidmxhbmQiOgorICAgICAgYW5zPSJpbSBWZXJsb3JlbmVuIExhbmQiOworICAgICAgYnJlYWs7CisgICAgICBjYXNlICJmZXJud2VzdCI6CisgICAgICBhbnM9ImluIEZlcm53ZXN0IjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBhbnM9ImljaCBiaW4gIithbnMrIi5cbiI7CisgIH0KKyAgaWYgKHBhdGhbMF09PSJwbGF5ZXJzIikKKyAgICBhbnM9ImljaCBoYWIgbWljaCB2ZXJsYXVmZW4gLSBpY2ggc2NoYWV0emUsICIrY2FwaXRhbGl6ZShwYXRoWzFdKSsKKyAgICAgICIgaGF0IHdhcyBkYW1pdCB6dSB0dW4uLi5cbiI7CisgIGlmIChwYXRoWzBdPT0iZ2lsZGVuIikgeworICAgIHN3aXRjaChwYXRoWzFdKSB7CisgICAgICBjYXNlICJhYmVudGV1cmVyIjoKKyAgICAgIGFucz0iZGVyIEFiZW50ZXVyZXJnaWxkZSI7CisgICAgICBicmVhazsKKyAgICAgIGNhc2UgImJpZXJzY2h1ZXR0bGVyIjoKKyAgICAgIGFucz0iZGVyIEJpZXJzY2h1ZXR0bGVyZ2lsZGUiOworICAgICAgYnJlYWs7CisgICAgICBjYXNlICJjaGFvcyI6CisgICAgICBhbnM9ImRlciBHaWxkZSBkZXIgQ2hhb3RlbiI7CisgICAgICBicmVhazsKKyAgICAgIGNhc2UgImthZW1wZmVyIjoKKyAgICAgIGFucz0iZGVyIEthZW1wZmVyZ2lsZGUiOworICAgICAgYnJlYWs7CisgICAgICBjYXNlICJrYXJhdGUiOgorICAgICAgYW5zPSJlaW5lbSBLYXJhdGVkb2pvIjsKKyAgICAgIGJyZWFrOworICAgICAgY2FzZSAia2xlcnVzIjoKKyAgICAgIGFucz0iZWluZW0gVGVtcGVsIGRlciBLbGVyaWtlciI7CisgICAgICBicmVhazsKKyAgICAgIGNhc2UgInphdWJlcmVyIjoKKyAgICAgIGFucz0iZGVyIEFrYWRlbWllIGRlciBaYXViZXJlciI7CisgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICBhbnM9ImlyZ2VuZGVpbmVyIEdpbGRlIjsKKyAgICB9CisgICAgYW5zPSJpY2ggc3RlaGUgaW4gIithbnMrIi5cbiI7CisgIH0KKyAgICAgICAgICAgICAgICBpZiggcGF0aFswXT09InAiICYmIHBhdGhbMV09PSJ2ZXJlaW4iICkgeworICAgICAgICAgICAgICAgICAgICAgICAgYW5zPSJpY2ggc3RlaGUgaW4gUG9ydCBWYWluLiI7CisgICAgICAgICAgICAgICAgfQorICBpZiAoIXRoaXNfaW50ZXJhY3RpdmUoKS0+UXVlcnlQcm9wKFBfSU5WSVMpKQorICAgIGFucz10aGlzX2ludGVyYWN0aXZlKCktPk5hbWUoV0VSKSsiLCAiK2FuczsKKyAgZWxzZSBhbnM9Y2FwaXRhbGl6ZShhbnMpOworICBjYWxsX291dCgibXlzaG91dCIsMCxicmVha19zdHJpbmcoYW5zLCA3OCwgIk1lcmxpbiBydWZ0OiAiKSk7Cit9CisKK3ZvaWQgbXlzaG91dChzdHJpbmcgcykKK3sKKyAgd3JpdGUocyk7CisgIHNob3V0KHMpOworfQorCit2b2lkIGNhdGNoX3RlbGwoc3RyaW5nIHN0cikKK3sKKyAgc3RyaW5nIG5hbWUsIGR1bW15OyBtaXhlZCBtZXNzYWdlOworICBpbnQgaSxzOworCisgIGlmICghdGhpc19wbGF5ZXIoKSkKKyAgICByZXR1cm47CisKKyAgaWYgKGVudmlyb25tZW50KCk9PWVudmlyb25tZW50KHRoaXNfcGxheWVyKCkpICYmIHByZXZpb3VzX29iamVjdCgpIT1NRSkKKyAgICB0ZWxsX3Jvb20odGhpc19vYmplY3QoKSwiKiIrc3RyKTsKKworICBpZiAodGhpc19wbGF5ZXIoKSAhPSB0aGlzX2ludGVyYWN0aXZlKCkpCisgICAgcmV0dXJuOworCisgIGlmIChidXN5KSB7CisgICAgdGVsbF9vYmplY3QodGhpc19wbGF5ZXIoKSwgCisgICAgICAgIk1lcmxpbiB0ZWlsdCBEaXIgbWl0OiBJY2ggYmluIGJlc2NoYWVmdGlndC5cbiIpOworICAgIHJldHVybjsKKyAgfQorICAgIAorICBzdHI9bG93ZXJfY2FzZShzdHIpOworCisgIGlmICgoc3Ryc3RyKHN0ciwgInRlaWx0IGRpciBtaXQ6IikgIT0gLTEpIAorICAgICAgJiYgKHN0cnN0cihzdHIsICJ3byBiaXN0IGR1IikgIT0tMSkpIHsKKyAgICBzaG91dGFuc3coKTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoKHN0cnN0cihzdHIsICJ0ZWlsdCBkaXIgbWl0OiIpICE9IC0xKSAmJiAKKyAgICAgICgoc3Ryc3RyKHN0ciwgInNlaGVyIikgIT0gLTEgfHwgc3Ryc3RyKHN0ciwgInNlaGVyaW4iKSAhPSAtMSkpKQorICAgIHsKKyAgICAgIGNyZWF0ZV9zZWVyKHRoaXNfcGxheWVyKCkpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAoc3NjYW5mKHN0ciwiJXMgJXMgc2FndDogJXMiLGR1bW15LG5hbWUsbWVzc2FnZSkhPTMpCisgICAgaWYgKHNzY2FuZihzdHIsIiVzIHNhZ3Q6ICVzIixuYW1lLG1lc3NhZ2UpIT0yKQorICAgICAgcmV0dXJuOworCisgIGlmICghbmFtZSB8fCBuYW1lPT0iIiB8fCAgICAgICAgICAgIAorICAgICAgY2F0Y2gocz1maWxlX3NpemUoInNhdmUvIituYW1lWzAuLjBdKyIvIituYW1lKyIubyIpO3B1Ymxpc2gpICAgICAgICAgICAgCisgICAgICB8fCBzPD0wICkKKyAgICByZXR1cm47CisKKyAgaWYgKG5hbWUhPWdldHVpZCh0aGlzX2ludGVyYWN0aXZlKCkpICYmICFBUkNIX1NFQ1VSSVRZKQorICB7CisgICAgaWYgKGZsYWc9PWdldHVpZCh0aGlzX2ludGVyYWN0aXZlKCkpKyIjIyIrbmFtZSkKKyAgICAgIHJldHVybjsKKyAgICBjYWxsX291dCgiZG9fc2F5IiwwLCJNZXJsaW4gc2FndDogIitjYXBpdGFsaXplKGdldHVpZCh0aGlzX2ludGVyYWN0aXZlKCkpKSsiIGhhdCBnZXJhZGUgc28gZ2V0YW4sIGFscyB3dWVyZGUgIitjYXBpdGFsaXplKG5hbWUpKyIgZXR3YXMgc2FnZW4hXG4iKTsKKyAgICBmbGFnPWdldHVpZCh0aGlzX2ludGVyYWN0aXZlKCkpKyIjIyIrbmFtZTsKKyAgICBjYWxsX291dCgiY2xlYXJfZmxhZyIsMCk7CisgICAgcmV0dXJuOworICB9CisgIGZsYWc9MDsKKyAgZm9yIChpPTA7aTxzaXplb2Yod2hpdGVzcGFjZXMpO2krKykKKyAgeworICAgIG1lc3NhZ2U9b2xkX2V4cGxvZGUobWVzc2FnZSx3aGl0ZXNwYWNlc1tpXSk7CisgICAgaWYgKCFwb2ludGVycChtZXNzYWdlKXx8c2l6ZW9mKG1lc3NhZ2UpPT0wKQorICAgICAgcmV0dXJuOworICAgIG1lc3NhZ2U9aW1wbG9kZShtZXNzYWdlLCIgIik7CisgIH0KKworICBtZXNzYWdlPW9sZF9leHBsb2RlKG1lc3NhZ2UsIiAiKTsKKworICBpZiAoIXBvaW50ZXJwKG1lc3NhZ2UpIHx8ICFzaXplb2YobWVzc2FnZSkpCisgICAgcmV0dXJuOworCisgIG1lc3NhZ2UtPSh7MH0pLSh7IiJ9KTsKKworICBpZiAoIW1lc3NhZ2UgfHwgc2l6ZW9mKG1lc3NhZ2UpPT0wKQorICAgIHJldHVybjsKKworICBpZiAobWVtYmVyKG1lc3NhZ2UsICJtZXJsaW4iKT09LTEpCisgICAgcmV0dXJuOworCisgIG1lc3NhZ2UtPSh7Im1lcmxpbiJ9KTsKKworICBtZXNzYWdlPWltcGxvZGUobWVzc2FnZSwiICIpOworCisgIGlmICghbWVzc2FnZSB8fCBtZXNzYWdlPT0iIikKKyAgICByZXR1cm47CisKKyAgZGV0ZXJtaW5lX2FjdGlvbihtZXNzYWdlLCBuYW1lKTsKK30KKworc3RhdGljIGludCBkZXRlcm1pbmVfYWN0aW9uKHN0cmluZyBtZXNzLCBzdHJpbmcgbmFtZSkKK3sKKyAgc3RyaW5nIHN0cjsKKworICBpZiAobWVzcz09Im1hY2ggbWljaCB6dW0gbWFnaWVyIiB8fCBtZXNzPT0ibWFjaCBtaWNoIHp1ciBtYWdpZXJpbiIpCisgICAgcmV0dXJuIGNyZWF0ZV93aXphcmQobmFtZSxuYW1lKTsKKworICBpZiAoc3NjYW5mKG1lc3MsIm1hY2ggJXMgenVtIG1hZ2llciIsc3RyKT09MXx8c3NjYW5mKG1lc3MsIm1hY2ggJXMgenVyIG1hZ2llcmluIixzdHIpPT0xKQorICAgIHJldHVybiBjcmVhdGVfd2l6YXJkKGxvd2VyX2Nhc2Uoc3RyKSxuYW1lKTsKKworICBnaXZlX2hlbHAobmFtZSk7CisgIHJldHVybiAwOworfQorCisjZGVmaW5lIFNheShzdHIpIHNheShzdHIsd2hvKQorI2RlZmluZSBXcml0ZShzdHIpIHRlbGxfb2JqZWN0KHdobyxzdHIpCisKK2ludCBRdWVyeUJlZGluZ3VuZ2VuKG9iamVjdCBwbCxzdHJpbmcgd2FzKQoreworICBpbnQgcmV0LGksZ2VuOworICBzdHJpbmcgczsKKworICBpZiAoSVNfU0VFUihwbCkpCisgICAgcmV0dXJuIDE7CisgIAorICBpZiAoKGludClMRVBNQVNURVItPlF1ZXJ5UmVhZHlGb3JXaXoocGwpPT0xKQorICAgIHJldHVybiAxOworCisgIHM9KHN0cmluZylMRVBNQVNURVItPlF1ZXJ5UmVhZHlGb3JXaXpUZXh0KHBsKTsgCisKKyAgdGVsbF9vYmplY3QocGwsIGJyZWFrX3N0cmluZygiTWVybGluIGdydWViZWx0IGVpbiB3ZW5pZyB1bmQgdGVpbHQgRGlyICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFjaCBlaW5pZ2VtIFVlYmVybGVnZW4gbWl0OlxuXG4iLCA3OCwwLDEpKTsKKyAgCisgIHRlbGxfb2JqZWN0KHBsLCBzKyJcbiIpOworCisgIHRlbGxfb2JqZWN0KHBsLCBicmVha19zdHJpbmcoIkRhIGlzdCB3b2hsIGZ1ZXIgRGljaCBub2NoIGV0d2FzIHp1IHR1bi4uLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzgsICJNZXJsaW4gdGVpbHQgRGlyIG1pdDogIikpOworCisgIGlmIChlbnZpcm9ubWVudCgpID09IGVudmlyb25tZW50KHBsKSkKKyAgICBzYXkoKHN0cmluZylwbC0+bmFtZShXRVIpCisgICAgICAgICsiIGVyZnVlbGx0IG5vY2ggbmljaHQgYWxsZSBBbmZvcmRlcnVuZ2VuIGZ1ZXIgZGVuICIrd2FzKyJzdGF0dXMuXG4iLHBsKTsKKyAgCisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNyZWF0ZV93aXphcmQobWl4ZWQgd2hvLCBtaXhlZCBwcm9tb3RlcikKK3sKKyAgbWl4ZWQgKmRvbWFpbnM7CisgIG9iamVjdCB2ZXJ0cmFnOworICBpbnQgcmV0OworICBzdHJpbmcgZ2VuOworCisgIHdobz1maW5kX3BsYXllcih3aG8pOworICBwcm9tb3Rlcj1maW5kX3BsYXllcihwcm9tb3Rlcik7CisgIGlmICghd2hvIHx8ICFwcm9tb3RlcikKKyAgICByZXR1cm4gMDsKKyAgLy8KKyAgLy8gcGxheWVyIG5vdCBpbnRlcmFjdGl2ZT8KKyAgLy8KKyAgaWYgKCFpbnRlcmFjdGl2ZSh3aG8pKQorICB7CisgICAgd3JpdGUoY2FwaXRhbGl6ZShnZXR1aWQod2hvKSkrIiBpc3QgbmljaHQgYWt0aXYuXG4iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICAvLworICAvLyBwbGF5ZXIgaXMgc2Vjb25kPworICAvLworICBpZiAod2hvLT5RdWVyeVByb3AoUF9TRUNPTkQpKQorICB7CisgICAgIHRlbGxfb2JqZWN0KHdobywiRHUgYmlzdCBlaW4gWndlaXRzcGllbGVyIHVuZCBrYW5uc3QgYWxzIHNvbGNoZXIga2VpbiBNYWdpZXIgd2VyZGVuLlxuIgorICAgICAgICAgICsiVmVyc3VjaHMgRG9jaCBtYWwgbWl0IERlaW5lbSBFcnN0aWUuXG4iKTsKKyAgICAgd3JpdGUoIkR1IGthbm5zdCAiK3doby0+bmFtZSgpKyIgbmljaHQgenVtIE1hZ2llciBtYWNoZW4uIERhcyBnZWh0IGJlaSAiCisgICAgICAgICAgKyJad2VpdGllc1xubGVpZGVyIG5pY2h0LiBGcmFnIGRvY2ggbWFsIG5hY2ggZGVtIEVyc3RpZS5cbiIpOworICAgICByZXR1cm4gMTsKKyAgfQorICAvLworICAvLyB3YW50cyB0byBhZHZhbmNlIGhpbXNlbGY/CisgIC8vCisgIGlmICh3aG89PXByb21vdGVyKQorICB7CisgICAgd3JpdGUoIkR1IGthbm5zdCBEaWNoIG5pY2h0IHNlbGJlciBiZWZvZXJkZXJuLiBTdWNoIERpciBkYXp1IGJpdHRlIGVpbmVuICIrCisgICAgICAgICAgICAgICJWb2xsbWFnaWVyLFxuZGVyIERpciBlaW5lbiBWZXJ0cmFnIGdpYnQuXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICAvLworICAvLyBiYW5pc2hlZD8KKyAgLy8KKyAgaWYgKE1CYW5pc2hMaXN0ZVt3aG8sMV0pCisgIHsKKyAgICB0ZWxsX29iamVjdChwcm9tb3RlcixjYXBpdGFsaXplKHdobykrIiBkYXJmIG51ciB2b24gZWluZW0gRXJ6bWFnaWVyIHp1bSAiKworICAgICAgICAgICAgICAgICAgICAiTWFnaWVyIGdlbWFjaHQgd2VyZGVuLlxuIik7CisgICAgc2F5KHByb21vdGVyLT5uYW1lKFdFUikrIiBpc3Qga2VpbiBFcnptYWdpZXIgdW5kIGRhcmYgIitjYXBpdGFsaXplKHdobykrCisgICAgICAgICAgICAiIG5pY2h0IHp1bSBNYWdpZXIgbWFjaGVuLlxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgLy8KKyAgLy8gcGxheWVyIGhhcyBQSz8KKyAgLy8KKyAgaWYgKHdoby0+UXVlcnlQcm9wKCJwbGF5ZXJraWxscyIpKSB7CisgICAgIHRlbGxfcm9vbShlbnZpcm9ubWVudCh3aG8pLHdoby0+bmFtZSgpKyIgaGF0IG5vY2ggZWluZW4gUGxheWVya2lsbCB1bmQga2FubiBzb21pdCBrZWluIE1hZ2llciB3ZXJkZW4uXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiQW0gYmVzdGVuIGRlbiBTaGVyaWZmIG9kZXIgZWluZW4gRXJ6bWFnaWVyIHZlcnN0YWVuZGlnZW4uXG4iKTsKKyAgICAgICAgIHJldHVybiAxOworICB9CisgIC8vCisgIC8vIGFscmVhZHkgZG9tX21lbWJlcj8KKyAgLy8KKyAgaWYgKElTX0RPTUFJTk1FTUJFUih3aG8pKQorICB7CisgICAgV3JpdGUoIkZ1ZXIgRGljaCBrYW5uIGljaCBuaWNodHMgbWVociB0dW4uIER1IGJpc3QgZG9jaCBzY2hvbiBNYWdpZXIhXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIC8vCisgIC8vICJhZHZhbmNlZCBsZWFybmVyIj8KKyAgLy8KKyAgaWYgKHF1ZXJ5X3dpel9sZXZlbCh3aG8pID09IDIwKQorICB7CisgICAgaWYgKCFBUkNIX1NFQ1VSSVRZKSB7CisgICAgICBXcml0ZSgiRGljaCBrYW5uIG51ciBlaW4gRXJ6bWFnaWVyIHp1bSBcInJpY2h0aWdlblwiIE1hZ2llciBtYWNoZW4hXG4iKTsKKyAgICAgIFNheSgiTnVyIGVpbiBFcnptYWdpZXIga2FubiAiK3doby0+bmFtZShXRU4pKyIgenVtIFwicmljaHRpZ2VuXCIgTWFnaWVyIG1hY2hlbiFcbiIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldD0oaW50KSJzZWN1cmUvbWFzdGVyIi0+YWR2YW5jZV93aXpsZXZlbChnZXRldWlkKHdobyksMjEpOworICAgIGlmIChyZXQ8PTApCisgICAgeworICAgICAgc2F5KCJNZXJsaW46IGVycm9yICIrcmV0KyJcbiIpOworICAgICAgd3JpdGUoIk1lcmxpbjogZXJyb3IgIityZXQrIlxuIik7CisgICAgfQorICAgIHdyaXRlKCJNZXJsaW4gcnVmdDogIisoc3RyaW5nKXdoby0+bmFtZShXRVIpKyIgaXN0IGluIGRlbiBLcmVpcyBkZXIgTWFnaWVyICIrCisgICAgICAgICAgICAgICJhdWZnZW5vbW1lbiB3b3JkZW4hXG4iKTsKKyAgICBzaG91dCgiTWVybGluIHJ1ZnQ6ICIrKHN0cmluZyl3aG8tPm5hbWUoV0VSKSsiIGlzdCBpbiBkZW4gS3JlaXMgZGVyIE1hZ2llciAiKworICAgICAgICAgICAgICAiYXVmZ2Vub21tZW4gd29yZGVuIVxuIik7CisgICAgInNlY3VyZS9tYXN0ZXIiLT5yZW5ld19wbGF5ZXJfb2JqZWN0KHdobyk7CisgICAgcmV0dXJuIDE7CisgIH0KKworICAvLworICAvLyBhbHJlYWR5IHdpemFyZD8KKyAgLy8KKyAgaWYgKElTX1dJWkFSRCh3aG8pKQorICB7CisgICAgZG9tYWlucz0oc3RyaW5nKikic2VjdXJlL21hc3RlciItPmdldF9kb21haW5faG9tZXMoZ2V0dWlkKHdobykpOworICAgIGlmICghZG9tYWlucyB8fCAhcG9pbnRlcnAoZG9tYWlucykgfHwgIXNpemVvZihkb21haW5zKSkKKyAgICB7CisgICAgICBTYXkod2hvLT5uYW1lKFdFUikrIiBnZWhvZXJ0IG5vY2gga2VpbmVyIFJlZ2lvbiBhbiB1bmQga2FubiBkYWhlciBub2NoICIrCisgICAgICAgICAgICAgICJrZWluIFZvbGwtXG5tYWdpZXIgd2VyZGVuLlxuIik7CisgICAgICBXcml0ZSgiRHUgZ2Vob2Vyc3Qgbm9jaCBrZWluZXIgUmVnaW9uIGFuLiBTY2hsaWVzcyBEaWNoIHp1bmFlY2hzdCBlaW5lciAiKworICAgICAgICAgICAgICAgICJhbiB1bmQga29tbVxuZGFubiB3aWVkZXIhXG4iKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXQ9KGludCkic2VjdXJlL21hc3RlciItPmFkdmFuY2Vfd2l6bGV2ZWwoZ2V0ZXVpZCh3aG8pLDI1KTsKKyAgICBpZihyZXQ+MCkKKyAgICB7CisgICAgICBzaG91dCh3aG8tPm5hbWUoV0VSKSsiIGFyYmVpdGV0IGpldHp0IGFuIGVpbmVyIFJlZ2lvbiBtaXQhXG4iKTsKKyAgICAgICJzZWN1cmUvbWFzdGVyIi0+cmVuZXdfcGxheWVyX29iamVjdCh3aG8pOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHdyaXRlKCJSRVRVUk5WQUxVRSAiK3JldCsiXG4iKTsKKyAgICBzYXkoIlJFVFVSTlZBTFVFICIrcmV0KyJcbiIpOworICAgIHJldHVybiAwOworICB9CisKKyAgLy8KKyAgLy8gc3RpbGwgbGVhcm5lcj8KKyAgLy8KKyAgaWYgKElTX0xFQVJORVIod2hvKSkKKyAgeworICAgIGlmICghQVJDSF9TRUNVUklUWSkgeworICAgICAgV3JpdGUoIkRpY2gga2FubiBudXIgZWluIEVyem1hZ2llciB6dW0gXCJyaWNodGlnZW5cIiBNYWdpZXIgbWFjaGVuIVxuIik7CisgICAgICBTYXkoIk51ciBlaW4gRXJ6bWFnaWVyIGthbm4gIit3aG8tPm5hbWUoV0VOKSsiIHp1bSBcInJpY2h0aWdlblwiIE1hZ2llciBtYWNoZW4hXG4iKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXQ9KGludCkic2VjdXJlL21hc3RlciItPmFkdmFuY2Vfd2l6bGV2ZWwoZ2V0ZXVpZCh3aG8pLDIwKTsKKyAgICBpZiAocmV0PD0wKQorICAgIHsKKyAgICAgIHNheSgiTWVybGluOiBlcnJvciAiK3JldCsiXG4iKTsKKyAgICAgIHdyaXRlKCJNZXJsaW46IGVycm9yICIrcmV0KyJcbiIpOworICAgIH0KKyAgICBzdHJpbmcgd2l6bmFtZSA9IChzdHJpbmcpd2hvLT5xdWVyeV9yZWFsX25hbWUoKTsKKyAgICAic2VjdXJlL21hc3RlciItPnJlbmV3X3BsYXllcl9vYmplY3Qod2hvKTsKKyAgICAvLyBGZWhsZXJ0ZXVmZWwgZ2ViZW4KKyAgICBjYWxsX291dCgjJ0dpYkZlaGxlcnRldWZlbCw0LGZpbmRfcGxheWVyKHdpem5hbWUpKTsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIC8vCisgIC8vIHByb21vdGVyJ3MgbGV2ZWwgaXMgbm90ID5ET01BSU5NRU1CRVJfTFZMKzEKKyAgLy8KKyAgaWYgKHNlY3VyZV9sZXZlbCgpPD1ET01BSU5NRU1CRVJfTFZMKQorICB7CisgICAgdGVsbF9vYmplY3QocHJvbW90ZXIsIkR1IG11c3N0IGRlcnplaXQgbWluZGVzdGVucyBMZXZlbCAiKworICAgICAgICAgICAgICAgICAgICAoRE9NQUlOTUVNQkVSX0xWTCsxKSsiIGhhYmVuLCB1bSBqZW1hbmRlbiBiZWZvZXJkZW4genUgIisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImtvZW5uZW4uXG4iKTsKKyAgICBzYXkocHJvbW90ZXItPm5hbWUoV0VSKSsiIGlzdCBrZWluIFZvbGxtYWdpZXIgdW5kIGRhcmYgZGFoZXIgbmllbWFuZGVuICIrCisgICAgICAgICAgICAienVtIFZvbGxtYWdpZXIgbWFjaGVuLlxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKworICAvLyBkZXIgQ2hlY2sgYXVmIGRlbiBCbHV0cHJpbnRuYW1lbiBpc3QgZmFzdCB1ZWJlcmZsdWVzc2lnLCBhYmVyIG51ciBmYXN0LgorICAvLyBFciBzY2hsYWVndCBmZWhsLCB3ZW5uIGRlciBWZXJ0cmFnIGRlciBDbG9uZSBlaW5lciBhbHRlbiBCUCBpc3QuCisgIGlmICghKHZlcnRyYWc9cHJlc2VudF9jbG9uZSgiL29iai92ZXJ0cmFnIix3aG8pKSB8fAorICAgICAgb2JqZWN0X25hbWUoYmx1ZXByaW50KHZlcnRyYWcpKSE9Ii9vYmovdmVydHJhZyIgfHwKKyAgICAgICEoKGludCl2ZXJ0cmFnLT5pc191bnRlcnNjaHJpZWJlbigpKSApCisgIHsKKyAgICBXcml0ZSgiRHUgaGFzdCBqYSBnYXIga2VpbmVuIHVudGVyc2NocmllYmVuZW4gVmVydHJhZyBiZWkgRGlyLiBCZXNvcmcgRGlyICIrCisgICAgICAgICAgICAgICJlaW5lbiBWZXItXG50cmFnLCB1bnRlcnNjaHJlaWJlIGlobiB1bmQga29tbSBkYW5uIHdpZWRlciFcbiIpOworICAgIFNheSh3aG8tPm5hbWUoV0VSKSsiIGhhdCBrZWluZW4gdW50ZXJzY2hyaWViZW5lbiBWZXJ0cmFnLlxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgaWYgKGdldGV1aWQodmVydHJhZykhPXNlY3VyZV9ldWlkKCkpCisgIHsKKyAgICB0ZWxsX29iamVjdChwcm9tb3RlciwiRGFzIGdlaHQgbmljaHQsIGVyIGhhdCBlaW5lbiBWZXJ0cmFnIHZvbiAiKworICAgICAgICAgICAgICAgICAgICBjYXBpdGFsaXplKGdldGV1aWQodmVydHJhZykpKyIgYmVpIHNpY2guXG4iKTsKKyAgICBzYXkocHJvbW90ZXItPm5hbWUoV0VSKSsiIHZlcnN1Y2h0LCAiK3doby0+bmFtZShXRVIpKyIgenVtIE1hZ2llciB6dSAiKworICAgICAgICAgICAgIm1hY2hlbiwgZG9jaCAiK3doby0+bmFtZShXRVIpKyIgaGF0IGVpbmVuIFZlcnRyYWdcbnZvbiAiKworICAgICAgICAgICAgICAgIGNhcGl0YWxpemUoZ2V0ZXVpZCh2ZXJ0cmFnKSkrIiBiZWkgc2ljaC5cbiIscHJvbW90ZXIpOworICAgIHJldHVybiAwOworICB9CisgIGlmICghUXVlcnlCZWRpbmd1bmdlbih3aG8sIk1hZ2llciIpKQorICAgIHJldHVybiAwOworICByZXQ9KGludCkic2VjdXJlL21hc3RlciItPmFkdmFuY2Vfd2l6bGV2ZWwoZ2V0ZXVpZCh3aG8pLDE1KTsKKyAgaWYgKHJldD4wKQorICB7CisgICAgUG9zdE1hZ2llcihjYXBpdGFsaXplKGdldHVpZCh3aG8pKSwKKyAgICAgICAgY2FwaXRhbGl6ZShzZWN1cmVfZXVpZCgpKSwoaW50KXdoby0+UXVlcnlQcm9wKFBfR0VOREVSKSk7CisgICAgd3JpdGVfZmlsZSgiL2xvZy9TUE9OU09SIixkdGltZSh0aW1lKCkpKyI6ICIrY2FwaXRhbGl6ZShnZXR1aWQocHJvbW90ZXIpKSsiIG1hY2h0ICIrCisgICAgICAgICAgICAgd2hvLT5uYW1lKFdFUikrIiB6dW0gTGVhcm5lci5cbiIpOworICAgIHdyaXRlKHdoby0+bmFtZShXRVIpKyIgaXN0IGluIGRlbiBLcmVpcyBkZXIgTWFnaWVyIGF1Zmdlbm9tbWVuIHdvcmRlbiFcbiIpOworICAgIHNob3V0KHdoby0+bmFtZShXRVIpKyIgaXN0IGluIGRlbiBLcmVpcyBkZXIgTWFnaWVyIGF1Zmdlbm9tbWVuIHdvcmRlbiFcbiIpOworICAgIGlmICgic2VjdXJlL21hc3RlciItPnNldF9wbGF5ZXJfb2JqZWN0KGdldGV1aWQod2hvKSwiL3N0ZC9zaGVsbHMvbWFnaWVyIikKKyAgICAgICAgICAgIDw9MCkKKyAgICB7CisgICAgICBzYXkoIk1FUkxJTjoga29ubnRlIE1hZ2llcnNoZWxsIG5pY2h0IGVpbnN0ZWxsZW4uXG4iKTsKKyAgICAgIHdyaXRlKCJNRVJMSU46IGtvbm50ZSBNYWdpZXJzaGVsbCBuaWNodCBlaW5zdGVsbGVuLlxuIik7CisgICAgfQorICAgICJzZWN1cmUvbWFzdGVyIi0+cmVuZXdfcGxheWVyX29iamVjdCh3aG8pOworICAgIHJldHVybiAxOworICB9CisgIHdyaXRlKCIgLS1SRVRVUk5WQUxVRSBJUyAiK3JldCsiXG4iKTsKKyAgc2F5KCIgLS1SRVRVUk5WQUxVRSBJUyAiK3JldCsiXG4iKTsKKworICByZXR1cm4ocmV0KTsgLy9ub24tdm9pZCBmdW5rdGlvbgorfQorCit2b2lkIGNsZWFyX2ZsYWcoKQoreworICBmbGFnPTA7Cit9CisKK3ZvaWQgZG9fc2F5KHN0cmluZyBzdHIpCit7CisgIHNheShzdHIpOworfQorCisKKwordm9pZCBzZWVyX3NlcXVlbnozKG1peGVkIHBsYXllciwgc3RyaW5nIHBsbmFtZSkKK3sKKyAgc3RyaW5nIHBsYXllcm5hbWU7IAorICBvYmplY3QgZmFxOworICBzdHJpbmcgdGV4dDsKKworICBpZiAoIW9iamVjdHAocGxheWVyKSkgeworICAgIHRlbGxfcm9vbShlbnZpcm9ubWVudCgpLCBzcHJpbnRmKCJNZXJsaW4gc2FndDogTmEsIHdvIGlzdCBkZW5uICVzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGluP1xuIiwgcGxuYW1lKSk7CisgICAgYnVzeSA9IDA7CisgICAgcmV0dXJuOworICB9CisgIGlmIChlbnZpcm9ubWVudCgpICE9IGVudmlyb25tZW50KHBsYXllcikpCisgICAgbW92ZShlbnZpcm9ubWVudChwbGF5ZXIpLCBNX1RQT1JUKTsKKyAgCisgIHRlbGxfb2JqZWN0KHBsYXllcixicmVha19zdHJpbmcoIlxuXG5FcyBtYWNodCAqUFVGRiogdW5kIGVpbmUgU2Nod2VmZWx3b2xrZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyJzdGVpZ3QgdW0gRGljaCBoZXJ1bSBhdWYuXG5cbkRpZSBBdXJhICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArInZlcnNjaHdpbmRldCBsYW5nc2FtIHVuZCBEdSBmdWVobHN0IERpY2ggIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsibnVuIHZpZWwgZXJmYWhyZW5lci4iLCA3OCwwLDEpKTsKKyAgdGVsbF9yb29tKGVudmlyb25tZW50KCksCisgICAgICAgICAgIGJyZWFrX3N0cmluZyhzcHJpbnRmKAorICAgICAgICAgICAgICAgICAgICAgICAiXG5cbkVzIG1hY2h0ICpQVUZGKiB1bmQgZWluZSBTY2h3ZWZlbHdvbGtlIHN0ZWlndCAiCisgICAgICAgICAgICAgICAgICAgICAgICsidW0gJXMgaGVydW0gYXVmLlxuXG5EaWUgQXVyYSB2ZXJzY2h3aW5kZXQgbGFuZ3NhbS5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgIHBsbmFtZSksNzgsMCwxKSwgKHtwbGF5ZXJ9KSk7CisgCisgIGlmICgic2VjdXJlL21hc3RlciItPmFkdmFuY2Vfd2l6bGV2ZWwoZ2V0ZXVpZChwbGF5ZXIpLDEpPD0wKQorICB7CisgICAgd3JpdGUoIk1lcmxpbiBzYWd0OiBEYSBnZWh0IHdhcyBzY2hpZWYgLi4uIHNhZyBtYWwgWm9vayBCZXNjaGVpZC5cbiIpOworICAgIHNheSgiTWVybGluIHNhZ3Q6IERhIGdlaHQgd2FzIHNjaGllZiAuLi4gc2FnIG1hbCBab29rIEJlc2NoZWlkLlxuIik7CisgICAgYnVzeSA9IDA7CisgICAgcmV0dXJuOworICB9CisgIHBsYXllcm5hbWUgPSBnZXRldWlkKHBsYXllcik7CisgICJzZWN1cmUvbWFzdGVyIi0+cmVuZXdfcGxheWVyX29iamVjdChwbGF5ZXIpOworICBwbGF5ZXIgPSBmaW5kX3BsYXllcihwbGF5ZXJuYW1lKTsKKyAgdGV4dCA9IHNwcmludGYoIiBpc3QgamV0enQgZWluJXMgU2VoZXIlcyFcbiIsCisgICAgKCgoaW50KXBsYXllci0+UXVlcnlQcm9wKFBfR0VOREVSKSk9PTI/ImUiOiIiKSwKKyAgICAoKChpbnQpcGxheWVyLT5RdWVyeVByb3AoUF9HRU5ERVIpKT09Mj8iaW4iOiIiKSk7CisgIHdyaXRlKCJNZXJsaW4gcnVmdDogIitjYXBpdGFsaXplKHBsYXllcm5hbWUpK3RleHQpOworICBzaG91dCgiTWVybGluIHJ1ZnQ6ICIrY2FwaXRhbGl6ZShwbGF5ZXJuYW1lKSt0ZXh0KTsKKyAgUG9zdFNlaGVyKGNhcGl0YWxpemUocGxheWVybmFtZSksKGludClwbGF5ZXItPlF1ZXJ5UHJvcChQX0dFTkRFUikpOworICBpZighY2F0Y2goCisgICAgICAgIGZhcT1jbG9uZV9vYmplY3QoIi9kL3NlaGVyL2hhZXVzZXIvc3BlY2lhbC9zZWhlcmZhcW1vYmlsIikgO3B1Ymxpc2gpKQorICB7CisgICAgZmFxLT5tb3ZlKHBsYXllcixNX05PQ0hFQ0spOworICAgIHRlbGxfb2JqZWN0KHBsYXllciwgIkF1cyBkZW0gTmljaHRzIGVyc2NoZWludCBlaW5lIGtsZWluZSBCZWxvaG51bmcgZnVlciBEaWNoLlxuIik7CisgIH0KKyAgCisgIHRlbGxfb2JqZWN0KHBsYXllciwgIlxuXG5EdSBsYWVjaGVsc3QgZ2x1ZWNrbGljaCBpbiBkaWUgUnVuZGUuXG5cbiIpOworICB0ZWxsX3Jvb20oZW52aXJvbm1lbnQoKSwgc3ByaW50ZigiXG5cbiVzIGxhZWNoZWx0IGdsdWVja2xpY2ggaW4gZGllIFJ1bmRlLlxuXG4iLCBwbG5hbWUpLCAoe3BsYXllcn0pKTsKKworIGJ1c3k9MDsKK30KKwordm9pZCBzZWVyX3NlcXVlbnoyKG1peGVkIHBsYXllciwgc3RyaW5nIHBsbmFtZSkKK3sKKyAgaWYgKCFvYmplY3RwKHBsYXllcikpIHsKKyAgICB0ZWxsX3Jvb20oZW52aXJvbm1lbnQoKSwgc3ByaW50ZigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWVybGluIHNhZ3Q6IE5hLCB3byBpc3QgZGVubiAlcyBoaW4/XG4iLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbG5hbWUpKTsKKyAgICBidXN5ID0gMDsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKGVudmlyb25tZW50KCkgIT0gZW52aXJvbm1lbnQocGxheWVyKSkKKyAgICBtb3ZlKGVudmlyb25tZW50KHBsYXllciksIE1fVFBPUlQpOworCisgIHRlbGxfb2JqZWN0KHBsYXllciwgYnJlYWtfc3RyaW5nKCJcbk1lcmxpbiBoZWJ0IGRpZSBBcm1lIHVuZCAiCisgICAgICAgKyJ1bmQgbWFjaHQgZWluaWdlIGJlc2Nod29lcmVuZGUgR2VzdGVuLiBVbSBEaWNoIGhlcnVtIGVyc2NoZWludCAiCisgICAgICAgKyJlaW5lIGdlbGJsaWNoZSBBdXJhLCBkaWUgaW1tZXIgaGVsbGVyIHdpcmQsIGJpcyBEdSBEZWluZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsiVW13ZWx0IGthdW0gbWVociBlcmtlbm5lbiBrYW5uc3QuXG5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDc4LDAsMSkpOworICB0ZWxsX3Jvb20oZW52aXJvbm1lbnQoKSwKKyAgICAgICAgICAgIGJyZWFrX3N0cmluZyhzcHJpbnRmKCJcbk1lcmxpbiBoZWJ0IGRpZSBBcm1lIHVuZCBtYWNodCBlaW5pZ2UgIgorICAgICAgICAgICAgICAgICAgICAgICAgICsiYmVzY2h3b2VyZW5kZSBHZXN0ZW4uIFVtICVzIGVyc2NoZWludCBlaW5lICIKKyAgICAgICAgICAgICAgICAgICAgICAgICArImdlbGJsaWNoZSBBdXJhLCBkaWUgaW1tZXIgaGVsbGVyIHdpcmQsIGJpcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIm1hbiAlcyBrYXVtIG1laHIgZXJrZW5uZW4ga2Fubi5cblxuIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbG5hbWUsIHBsbmFtZSksNzgsMCwxKSwgKHtwbGF5ZXJ9KSk7CisKKyAgY2FsbF9vdXQoInNlZXJfc2VxdWVuejMiLCA3LCBwbGF5ZXIsIHBsbmFtZSk7Cit9CisKK3ZvaWQgc2Vlcl9zZXF1ZW56MShtaXhlZCBwbGF5ZXIsIHN0cmluZyBwbG5hbWUpCit7CisgIGlmICghb2JqZWN0cChwbGF5ZXIpKQorICAgIHJldHVybjsKKworICBtb3ZlKGVudmlyb25tZW50KHBsYXllciksIE1fVFBPUlQpOworCisgIHRlbGxfcm9vbShlbnZpcm9ubWVudCgpLAorICAgICAgICAgICAgYnJlYWtfc3RyaW5nKHNwcmludGYoIkRhcyBpc3QgZWluZSBncm9zc2UgRnJldWRlLiAlcyBoYXQgc2ljaCAiCisgICAgICJ0YXBmZXIgZHVyY2ggZGFzICJNVUROQU1FIiBnZXNjaGxhZ2VuIHVuZCBtaXR0bGVyd2VpbGUgYWxsZSAiCisgICAgICJBbmZvcmRlcnVuZ2VuIGVyZnVlbGx0LCB1bSAlcyB6dSB3ZXJkZW4uIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgIHBsbmFtZSwgKChpbnQpcGxheWVyLT5RdWVyeVByb3AoUF9HRU5ERVIpKT09MT8iU2VoZXIiOiJTZWhlcmluIiksCisgICAgICAgICAgICAgIDc4LCAiTWVybGluIHNhZ3Q6ICIpKTsKKworICBjYWxsX291dCgic2Vlcl9zZXF1ZW56MiIsIDQsIHBsYXllciwgcGxuYW1lKTsKK30KKworICAKK3N0YXRpYyBpbnQgY3JlYXRlX3NlZXIobWl4ZWQgcGxheWVyKQoreworICBpZiAoIW9iamVjdHAocGxheWVyKSkKKyAgICByZXR1cm4gMDsKKyAgaWYgKElTX1NFRVIocGxheWVyKSkKKyAgeworICAgIHdyaXRlKGJyZWFrX3N0cmluZygiRHUgYmlzdCBkb2NoIHNjaG9uIGtlaW4gbm9ybWFsZXIgU3BpZWxlciBtZWhyLCAiCisgICAgICAgICAgICAgICAgICAgICAgICsid2FzIHNvbGwgZXMgYWxzbz8iLCA3OCwgIk1lcmxpbiB0ZWlsdCBEaXIgbWl0OiAiKSk7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBpZiAoIVF1ZXJ5QmVkaW5ndW5nZW4ocGxheWVyLCJTZWhlciIpKQorICAgIHJldHVybiAtMTsKKworCisgIHdyaXRlKGJyZWFrX3N0cmluZygiR3Jvc3NlIEZyZXVkZSEgRHUgaGFzdCBhbGxlIEFuZm9yZGVydW5nZW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXJmdWVsbHQuIFdhcnRlIGVpbmVuIE1vbWVudC4uLiIsIDc4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWVybGluIHRlaWx0IERpciBtaXQ6ICIpKTsKKyAgYnVzeT0xOworICBjYWxsX291dCgic2Vlcl9zZXF1ZW56MSIsNCxwbGF5ZXIsIHBsYXllci0+TmFtZSgpKTsKKyAgcmV0dXJuKDApOyAvL25vbi12b2lkIGZ1bmt0aW9uCit9CisKK3N0YXRpYyB2b2lkIGdpdmVfaGVscChtaXhlZCBwbGF5ZXIpCit7CisgIGlmICghb2JqZWN0cChwbGF5ZXIpKQorICAgIHJldHVybjsKKworICB0ZWxsX29iamVjdChwbGF5ZXIsCisgICAgICAgICAgICAgIGJyZWFrX3N0cmluZygiSWNoIHdlaXNzIG5pY2h0LCB3YXMgaWNoIGZ1ZXIgRGljaCB0dW4ga2Fubi4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgKyJJY2gga2FubiBEaWNoIHp1bSBTZWhlciBvZGVyIHp1bSBNYWdpZXIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgKyJtYWNoZW4sIHdlbm4gRHUgbWljaCBkYXJ1bSBiaXR0ZXN0LiIsIDc4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1lcmxpbiB0ZWlsdCBEaXIgbWl0OiAiKSk7Cit9CisgICAgICAgICAgICAgIAorCit2b2lkIHJlc2V0KCkKK3sKK30KKworcHVibGljIGludCByZW1vdmUoaW50IHNpbGVudCkgeworICBFVkVOVEQtPlVucmVnaXN0ZXJFdmVudChFVlRfTElCX0xPR0lOLCBNRSk7CisgIEVWRU5URC0+VW5yZWdpc3RlckV2ZW50KEVWVF9MSUJfUExBWUVSX0NSRUFUSU9OLCBNRSk7CisgIGRlc3RydWN0KHRoaXNfb2JqZWN0KCkpOworICByZXR1cm4gMTsKK30KKwordm9pZCB3YW5kZXJuKCkKK3sKKyAgbWFwcGluZyBleCxyb29tczsKKyAgbWl4ZWQgemllbDsKKyAgb2JqZWN0ICpyYWV1bWUsKmxhZWRlbixlbnYsb2I7CisgIHN0cmluZyAqaW5kLGZuOworICBpbnQgaTsKKworICB3aGlsZSAocmVtb3ZlX2NhbGxfb3V0KCJ3YW5kZXJuIik+PTApOworICBjYWxsX291dCgid2FuZGVybiIsNDUrcmFuZG9tKDEwMCkpOworICBpZiAoYnVzeSkgcmV0dXJuOworICBpZiAoZGVsYXkpCisgIHsKKyAgICBkZWxheT0wOworICAgIHJldHVybjsKKyAgfQorICBpZiAoIShlbnY9ZW52aXJvbm1lbnQoKSkpCisgIHsKKyAgICBtb3ZlKCIvZ2lsZGVuL2FiZW50ZXVyZXIiLDApOworICAgICAgICBlbnY9ZW52aXJvbm1lbnQoKTsKKyAgfQorICAvL3VlYmVyIEludiBpdGVyaWVyZW4sIG9iIGRhIGVpbiBuaWNodC1pZGVsbmRlciBTcGllbGVyIG1pdCBnZW51ZyBYUAorICAvL3J1bWhhZW5ndC4KKyAgcmFldW1lPWFsbF9pbnZlbnRvcnkoZW52KTsKKyAgZm9yKGk9c2l6ZW9mKHJhZXVtZSk7IGktLSA7ICkgeworICAgIGlmIChpbnRlcmFjdGl2ZShyYWV1bWVbaV0pICYmIHF1ZXJ5X2lkbGUocmFldW1lW2ldKTwxODAgJiYKKyAgICAgICAgcmFldW1lW2ldLT5RdWVyeVByb3AoUF9YUCk+OTk5OTk5KQorICAgICAgcmV0dXJuOworICB9CisgIGV4PShtYXBwaW5nKWVudi0+UXVlcnlQcm9wKFBfRVhJVFMpOworICBpZiAoIW1hcHBpbmdwKGV4KSkKKyAgICByZXR1cm47CisgIGluZD1tX2luZGljZXMoZXgpO3Jvb21zPShbXSk7bGFlZGVuPSh7fSk7CisgIGZvciAoaT1zaXplb2YoaW5kKS0xO2k+PTA7aS0tKQorICB7CisgICAgaWYgKCFzdHJpbmdwKHppZWw9ZXhbaW5kW2ldXSkpCisgICAgICBjb250aW51ZTsKKyAgICBpZiAoIW9iPWZpbmRfb2JqZWN0KHppZWwpKQorICAgICAgY29udGludWU7CisgICAgcm9vbXMrPShbb2JdKTsKKyAgfQorICByb29tcy09KFtlbnZdKTsKKyAgaWYgKHByZXZfcm9vbSAmJiBzaXplb2YobV9pbmRpY2VzKHJvb21zKSk+MSkKKyAgICByb29tcy09KFtwcmV2X3Jvb21dKTsKKyAgcHJldl9yb29tPWVudjsKKyAgcmFldW1lPW1faW5kaWNlcyhyb29tcyk7CisgIGlmICghaT1zaXplb2YocmFldW1lKSkKKyAgICByZXR1cm47CisgIG9iPXJhZXVtZVtyYW5kb20oaSldOworICBtb3ZlKG9iLDApOworfQorCitzdHJpbmcgaW50X3Nob3J0KCkKK3sKKyAgcmV0dXJuICJEdSBiaXN0IGltIGFsbHNlaXRzIGJlbGllYnRlbiBXaXpjbHViIFwiWnVtIGx1c3RpZ2VuIE1lcmxpblwiLlxuIjsKK30KKworc3RyaW5nIGludF9sb25nKG9iamVjdCB3aG8sbWl4ZWQgd2hlcmUpCit7CisgIHN0cmluZyBkZXNjcjsKKworICBpZiggSVNfTEVBUk5FUih3aG8pICYmIHdoby0+UXVlcnlQcm9wKCBQX1dBTlRTX1RPX0xFQVJOICkgKQorICAgIGRlc2NyID0gIlsiICsgb2JqZWN0X25hbWUoTUUpICsgIl1cbiI7CisgIGVsc2UKKyAgICBkZXNjciA9ICIiOworICBkZXNjcis9IkR1IGJpc3QgaW0gV2l6Y2x1YiAnWnVtIGx1c3RpZ2VuIE1lcmxpbicuIERpZXNlciBXaXpjbHViIGlzdCBldHdhcyBiZXNvbmRlcmVzIC1cbmVyIGhhdCBrZWluZW4gZmVzdGVuIFN0YW5kb3J0LCBzb25kZXJuIHdhbmRlcnQgaW0gTXVkIGhlcnVtLiBBdXNzZXJkZW0ga2FubiBlclxuU3BpZWxlciB6dSBNYWdpZXJuIG1hY2hlbiAtIGFiZXIgbnVyLCB3ZW5uIG1hbiBpaG4gdm9uIGF1c3NlbiBhdXMgZGFyYXVmXG5hbnNwcmljaHQuXG4iOworICBpZiAoIHdoby0+UXVlcnlQcm9wKFBfU0hPV19FWElUUykgKQorICAgIGRlc2NyICs9ICJFcyBnaWJ0IDIgc2ljaHRiYXJlIEF1c2dhZW5nZTogcmF1cyB1bmQgZ2lsZGUuXG4iOworICBkZXNjciArPSBtYWtlX2ludmxpc3Qod2hvLCBhbGxfaW52ZW50b3J5KE1FKSAtICh7IHdobyB9KSk7CisgIGlmKCBlbnZpcm9ubWVudCgpKQorICAgIGRlc2NyICs9ICJcbkF1c3NlcmhhbGIgc2llaHN0IER1OlxuIgorICAgICAgKyBlbnZpcm9ubWVudCgpLT5pbnRfc2hvcnQod2hvLE1FKTsKKyAgcmV0dXJuIGRlc2NyOworfQorCitzdHJpbmcgbWFrZV9pbnZsaXN0KG9iamVjdCB2aWV3ZXIsb2JqZWN0ICppbnYpCit7CisgIGludCBpLCBpc3dpejsKKyAgc3RyaW5nIGRlc2NyOworCisgIGRlc2NyID0gIiI7CisgIGlzd2l6ID0gSVNfTEVBUk5FUiggdmlld2VyICkgJiYgdmlld2VyLT5RdWVyeVByb3AoUF9XQU5UU19UT19MRUFSTik7CisKKyAgZm9yIChpID0gMDsgaSA8IHNpemVvZihpbnYpOyBpKyspCisgIHsKKyAgICBzdHJpbmcgc2g7CisgICAgc2ggPSAoc3RyaW5nKWludltpXS0+c2hvcnQoKTsKKyAgICBpZiAoaXN3aXopCisgICAgeworICAgICAgaWYgKHNoKSBzaCA9IHNoWzAuLjwyXSArICIgWyIrb2JqZWN0X25hbWUoaW52W2ldKSsiXVxuIjsKKyAgICAgIGVsc2Ugc2ggPSAiWyIrb2JqZWN0X25hbWUoaW52W2ldKSsiXVxuIjsKKyAgICB9CisgICAgaWYgKHNoKSBkZXNjciArPSBzaDsKKyAgfQorICByZXR1cm4gZGVzY3I7Cit9CisKK3ZvaWQgaW5pdCgpCit7CisgIGlmIChpbnRlcmFjdGl2ZSh0aGlzX3BsYXllcigpKSAmJiBlbnZpcm9ubWVudCh0aGlzX3BsYXllcigpKT09TUUpCisgICAgYWRkX2FjdGlvbigiZ2VoZW4iLCIiLDEpOworICBhZGRfYWN0aW9uKCJiZWZvZXJkZXJlIiwiYmVmb2VyZGVyIiwxKTsKK30KKworaW50IGJlZm9lcmRlcmUoc3RyaW5nIHN0cikKK3sKKyAgc3RyaW5nIHdlbjsKKyAgaW50IHJldCxzdHVmZSxsOworCisgIGlmICghTE9SRF9TRUNVUklUWSkgcmV0dXJuIDA7CisgIGlmICghc3RyfHxzc2NhbmYoc3RyLCIlcyBhdWYgc3R1ZmUgJWQiLHdlbixzdHVmZSk8MikKKyAgeworICAgIG5vdGlmeV9mYWlsKCJTeW50YXg6IGJlZm9lcmRlcmUgPG5hbWU+IGF1ZiBzdHVmZSA8c3R1ZmU+XG4iKTsKKyAgICAgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKHN0dWZlPjI5KQorICB7CisgICAgd3JpdGUoIk1heGltdW0gaXN0IFN0dWZlIDI5IVxuIik7CisgICAgICAgIHJldHVybiAxOworICB9CisgIGw9cXVlcnlfd2l6X2xldmVsKHdlbik7CisgIGlmIChsPDI1KQorICB7CisgICAgcHJpbnRmKCIlcyBtdXNzIG1pbmRlc3RlbnMgendlY2tzIFdlaXRlcmJlZm9lcmRlcnVuZyBtaW5kZXN0ZW5zIFN0dWZlIDI1IGhhYmVuLlxuIiwKKyAgICAgICAgY2FwaXRhbGl6ZSh3ZW4pKTsgICAgICAgIAorICAgIHJldHVybiAxOworICB9CisgIGlmIChsPj1zdHVmZSkKKyAgeworICAgIHByaW50ZigiJXMgaXN0IHNjaG9uIFN0dWZlICVkLlxuIixjYXBpdGFsaXplKHdlbiksbCk7CisgICAgICAgIHJldHVybiAxOworICB9CisgIHJldD0oaW50KSJzZWN1cmUvbWFzdGVyIi0+YWR2YW5jZV93aXpsZXZlbCh3ZW4sc3R1ZmUpOworICBpZiAocmV0PD0wKQorICAgIHByaW50ZigiRXJyb3Jjb2RlICVkXG4iLHJldCk7CisgIGVsc2UKKyAgICB3cml0ZSgib2tcbiIpOworICByZXR1cm4gMTsKK30KKworaW50IHNhZyhtaXhlZCBzdHIpCit7CisgIGludCBpOworCisgIGlmIChzdHI9PTApCisgICAgc3RyPSIiOworICBzdHIgPSBvbGRfZXhwbG9kZShicmVha19zdHJpbmcoc3RyLCA2MCApLCAiXG4iKTsKKyAgaWYgKGJ1c3kpIHsKKyAgICB0ZWxsX3Jvb20oTUUsICJNZXJsaW4gbWF1bHQ6IEljaCBiaW4gYmVzY2hhZWZ0aWd0LlxuIik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgZm9yIChpID0gMDsgaSA8IHNpemVvZihzdHIpOyBpKyspCisgIHsKKyAgICBpZiAoIXN0cltpXSkKKyAgICAgIHN0cltpXT0iIjsKKyAgICB0ZWxsX3Jvb20oZW52aXJvbm1lbnQoKSwiTWVybGluIHNhZ3Q6ICIrc3RyW2ldKyJcbiIpOworICAgIHRlbGxfcm9vbShNRSwiKk1lcmxpbiBzYWd0OiAiK3N0cltpXSsiXG4iKTsKKyAgfQorICByZXR1cm4gMTsKK30KKwordm9pZCBzaG93X2V4aXRzKCkKK3sKKyAgcHJpbnRmKCIlcyIsZW52aXJvbm1lbnQoKS0+R2V0RXhpdHMoKSk7Cit9CisKK2ludCBnZWhlbihzdHJpbmcgc3RyKQoreworICBzdHJpbmcgdmVyYjsKKyAgaW50IGk7CisgIG1hcHBpbmcgZXhpdHM7CisgIHN0cmluZyAqZXg7CisKKyAgaWYgKGJ1c3kpIHsKKyAgICB3cml0ZSgiTWVybGluIG1hdWx0OiBJY2ggYmluIGJlc2NoYWVmdGlndC5cbiIpOworICAgIHJldHVybiAwOworICB9CisKKyAgdmVyYj1xdWVyeV92ZXJiKCk7CisgIHN0cj0oc3RyaW5nKXRoaXNfaW50ZXJhY3RpdmUoKS0+X3VucGFyc2VkX2FyZ3MoKTsKKyAgc3dpdGNoICh2ZXJiKQorICB7CisgICAgY2FzZSAiZ2lsZGUiOgorICAgICAgdGhpc19wbGF5ZXIoKS0+bW92ZSgiL2dpbGRlbi9hYmVudGV1cmVyIixNX0dPLCJpbiBkaWUgR2lsZGUiKTsKKyAgICAgIHJldHVybiAxOworICAgIGNhc2UgInJhdXMiOgorICAgICAgdGhpc19wbGF5ZXIoKS0+bW92ZShlbnZpcm9ubWVudCgpLE1fR08sInJhdXMiKTsKKyAgICAgIHJldHVybiAxOworICB9CisgIGlmICghSVNfV0laQVJEKHRoaXNfaW50ZXJhY3RpdmUoKSkpCisgICAgcmV0dXJuIDA7CisgIGlmICh2ZXJiIT0ibWVybGluIikKKyAgICByZXR1cm4gMDsKKyAgZGVsYXk9MTsKKyAgZXhpdHM9KG1hcHBpbmcpZW52aXJvbm1lbnQoKS0+UXVlcnlQcm9wKFBfRVhJVFMpOworICBpZiAoIXN0cnx8c3RyPT0iIikKKyAgeworICAgIGV4PW1faW5kaWNlcyhleGl0cyk7CisgICAgcHJpbnRmKGVudmlyb25tZW50KCktPmludF9zaG9ydChNRSxNRSkpOworICAgIHNob3dfZXhpdHMoKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBpZiAob2xkX2V4cGxvZGUoc3RyLCIgIilbMF09PSJzYWciKQorICAgIHJldHVybiBzYWcoaW1wbG9kZShvbGRfZXhwbG9kZShzdHIsIiAiKVsxLi5dLCIgIikpOworICBpZiAoc3RyWzBdPT0nOycpCisgIHsKKyAgICB0ZWxsX3Jvb20oZW52aXJvbm1lbnQoTUUpLCJNZXJsaW5zICIrc3RyWzEuLl0rIlxuIik7CisgICAgdGVsbF9yb29tKE1FLCIqTWVybGlucyAiK3N0clsxLi5dKyJcbiIpOworICAgIHJldHVybiAxOworICB9CisgIGlmIChzdHJbMF09PSc6JykKKyAgeworICAgIHRlbGxfcm9vbShlbnZpcm9ubWVudChNRSksIk1lcmxpbiAiK3N0clsxLi5dKyJcbiIpOworICAgIHRlbGxfcm9vbShNRSwiKk1lcmxpbiAiK3N0clsxLi5dKyJcbiIpOworICAgIHJldHVybiAxOworICB9CisgIGlmIChzdHJbMF09PScqJykKKyAgeworICAgIGdvdG8oc3RyWzEuLl0pOworICAgIHByaW50ZihlbnZpcm9ubWVudCgpLT5pbnRfc2hvcnQoTUUsTUUpKTsKKyAgICBzaG93X2V4aXRzKCk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgaWYgKCFleGl0c1tzdHJdKQorICAgIHJldHVybiAwOworICBtb3ZlKGV4aXRzW3N0cl0sMCk7CisgIHdyaXRlKCJNZXJsaW4gc2FndDogSmF3b2xsLCBDaGVmLlxuIik7CisgIHByaW50ZihlbnZpcm9ubWVudCgpLT5pbnRfc2hvcnQoTUUsTUUpKTsKKyAgc2hvd19leGl0cygpOworICByZXR1cm4gMTsKK30KKworaW50IGdvdG8obWl4ZWQgZGVzdCkKK3sKKyAgb2JqZWN0IG9iOworICBzdHJpbmcgcGF0aDsKKyAgbWl4ZWQgcmV0OworCisgIGlmIChidXN5KSB7CisgICAgd3JpdGUoIk1lcmxpbiBtYXVsdDogSWNoIGJpbiBiZXNjaGFlZnRpZ3QuXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIGlmICghZGVzdCkgeworICAgIHdyaXRlKCJXb2hpbiBtb2VjaHRlc3QgRHUgTWVybGluIGJyaW5nZW4gP1xuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgb2IgPSBmaW5kX2xpdmluZyhkZXN0KTsKKyAgaWYgKG9iKSB7CisgICAgb2IgPSBlbnZpcm9ubWVudChvYik7CisgICAgbW92ZShvYmplY3RfbmFtZShvYiksMCk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgcGF0aD0obWl4ZWQpInNlY3VyZS9tYXN0ZXIiLT5fZ2V0X3BhdGgoZGVzdCxnZXR1aWQodGhpc19wbGF5ZXIoKSkpOworICByZXQ9Y2F0Y2gobG9hZF9vYmplY3QocGF0aCk7cHVibGlzaCk7CisgIGlmIChyZXQgJiYgZmlsZV9zaXplKHBhdGgpPDApCisgIHsKKyAgICBkZXN0PW1hdGNoX2xpdmluZyhkZXN0LDEpOworICAgIGlmIChzdHJpbmdwKGRlc3QpKQorICAgIHsKKyAgICAgIG9iID0gZW52aXJvbm1lbnQoZmluZF9saXZpbmcoZGVzdCkpOworICAgICAgbW92ZShvYmplY3RfbmFtZShvYiksTV9UUE9SVHxNX05PQ0hFQ0spOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHByaW50ZigiRmVobGVyIGJlaW0gVGVsZXBvcnQgbmFjaCAlTzogTm8gc3VjaCBmaWxlLlxuIixwYXRoKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBpZiAocmV0KQorICAgIHByaW50ZigiRmVobGVyIGJlaW0gVGVsZXBvcnQgbmFjaCAlTzogJU9cbiIsZGVzdCxyZXQpOworICByZXQ9Y2F0Y2gobW92ZShwYXRoLE1fVFBPUlR8TV9OT0NIRUNLKTtwdWJsaXNoKTsKKyAgaWYgKHN0cmluZ3AocmV0KSkKKyAgICByZXQ9aW1wbG9kZShvbGRfZXhwbG9kZShyZXQsIlxuIiksIiIpOworICBpZiAocmV0KQorICAgIHByaW50ZigiRmVobGVyIGJlaW0gVGVsZXBvcnQgbmFjaCAlTzogJU9cbiIsZGVzdCxyZXQpOworICByZXR1cm4gMTsKK30KKworbWl4ZWQgbG9jYXRlX29iamVjdHMoc3RyaW5nIGNvbXBsZXhfZGVzYykKK3sKKyAgb2JqZWN0IG9iOworCisgIGlmIChjb21wbGV4X2Rlc2M9PSJhbGxlcyIgfHwgY29tcGxleF9kZXNjPT0iYWxsZSIpCisgICAgcmV0dXJuIGZpbHRlcl9vYmplY3RzKGFsbF9pbnZlbnRvcnkodGhpc19vYmplY3QoKSksInNob3J0Iik7CisgIGlmIChvYiA9IHByZXNlbnQoY29tcGxleF9kZXNjLHRoaXNfb2JqZWN0KCkpICkKKyAgICByZXR1cm4gKHsgb2IgfSk7CisgIHJldHVybiAoe30pIDsKK30KKwordm9pZCBNQmFuaXNoSW5zZXJ0KHN0cmluZyBuYW1lLCBzdHJpbmcgZ3J1bmQsIG9iamVjdCB3ZXIpCit7CisgIGlmICggIW5hbWUgfHwgIXN0cmluZ3AobmFtZSkgfHwgIXNpemVvZihuYW1lKSB8fAorICAgICAgICFncnVuZCB8fCAhc3RyaW5ncChncnVuZCkgfHwgIXNpemVvZihncnVuZCkgfHwKKyAgICAgICAhd2VyIHx8ICFvYmplY3RwKHdlcikgfHwgZ2V0dWlkKHdlcikgIT0gc2VjdXJlX2V1aWQoKSB8fAorICAgICAgICFJU19ERVBVVFkod2VyKSApCisgICAgcmV0dXJuOworCisgIE1CYW5pc2hMaXN0ZSArPSAoW25hbWU6Z3J1bmQ7Z2V0dWlkKHdlcildKTsKKyAgc2F2ZV9vYmplY3QoU0FWRUZJTEUpOworfQorCittYXBwaW5nIE1CYW5pc2hMaXN0KCkKK3sKKyAgICBpZiAoICFJU19ERVBVVFkoc2VjdXJlX2V1aWQoKSkgKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiBkZWVwX2NvcHkoTUJhbmlzaExpc3RlKTsKK30KKwordm9pZCBNQmFuaXNoRGVsZXRlKHN0cmluZyBuYW1lKQoreworICBpZiAoICFuYW1lIHx8ICFzdHJpbmdwKG5hbWUpIHx8ICFzaXplb2YobmFtZSkgfHwgIUFSQ0hfU0VDVVJJVFkgKQorICAgIHJldHVybiAwOworCisgIE1CYW5pc2hMaXN0ZSA9IG1fY29weV9kZWxldGUoIE1CYW5pc2hMaXN0ZSwgbmFtZSApOworICBzYXZlX29iamVjdChTQVZFRklMRSk7Cit9CisKK3N0cmluZyBfcXVlcnlfbm9nZXQoKQoreworICByZXR1cm4gIk1lcmxpbiBtYWcgZGFzIG5pY2h0IVxuIjsKK30KKwpkaWZmIC0tZ2l0IGEvc2VjdXJlL21pbmlfcHJvcHMuYyBiL3NlY3VyZS9taW5pX3Byb3BzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDIzNDVhNAotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9taW5pX3Byb3BzLmMKQEAgLTAsMCArMSw0MCBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIG1pbmlfcHJvcHMuYyAtLSBBYmdlc3BlY2t0ZSBWZXJ3YWx0dW5nIHZvbiBQcm9wcworLy8gICAgICAgICAgICAgICAgIEF1cyBTaWNoZXJoZWl0c2dydWVuZGVuIGRhcmYgaGllciBuaWNodCBkaWUgIlZvbGx2ZXJzaW9uIgorLy8gICAgICAgICAgICAgICAgIG1pdCBlY2h0ZW4gUHJvcGVydGllcyBzdGVoZW4KKy8vCisvLyAkSWQkCisjcHJhZ21hIHN0cmljdF90eXBlcyxzYXZlX3R5cGVzCisjcHJhZ21hIG5vX2Nsb25lCisjcHJhZ21hIG5vX3NoYWRvdworI3ByYWdtYSBwZWRhbnRpYyxyYW5nZV9jaGVjayx3YXJuX2RlcHJlY2F0ZWQKKworI2RlZmluZSBORUVEX1BST1RPVFlQRVMKKyNpbmNsdWRlIDx0aGluZy9wcm9wZXJ0aWVzLmg+CisjdW5kZWYgTkVFRF9QUk9UT1RZUEVTCisKK25vc2F2ZSBtYXBwaW5nIHByb3A7CisKK3ByaXZhdGUgdm9pZCBJbml0UHJvcHMoKQoreworICAgIHByb3AgPSBtX2FsbG9jYXRlKDIsMSk7Cit9CisKKworcHVibGljIHZhcmFyZ3MgbWl4ZWQgUXVlcnkoIHN0cmluZyBzdHIsIGludCB0eXBlICkKK3sKKyAgICBpZiAoICFtYXBwaW5ncChwcm9wKSApCisgICAgICAgIEluaXRQcm9wcygpOworCisgICAgcmV0dXJuIHByb3Bbc3RyXTsKK30KKworcHVibGljIHZhcmFyZ3MgbWl4ZWQgU2V0KHN0cmluZyBuYW1lLCBtaXhlZCB2YWx1ZSwgaW50IHR5cGUsIGludCBleHRlcm4pCit7CisgICAgaWYgKCAhbWFwcGluZ3AocHJvcCkgKQorICAgICAgICBJbml0UHJvcHMoKTsKKworICAgIHJldHVybiBwcm9wW25hbWVdID0gdmFsdWU7Cit9CisKZGlmZiAtLWdpdCBhL3NlY3VyZS9taXNjL21zc3AuYyBiL3NlY3VyZS9taXNjL21zc3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzQ1Mzg4Ci0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL21pc2MvbXNzcC5jCkBAIC0wLDAgKzEsMjE0IEBACisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8dGhpbmcvZGVzY3JpcHRpb24uaD4KKyNpbmNsdWRlIDxzdHJpbmdzLmg+CisKKy8vIGhvc3RzIHdobyBhc2tlZCB1cyBpbiB0aGUgcGFzdCBhbmQgdGltZXN0YW1wIG9mIGxhc3QgY29ubmVjdGlvbiB3aGljaCBnb3QKKy8vIHRoZSBmdWxsIGRhdGF0c2V0LgorcHJpdmF0ZSBub3NhdmUgbWFwcGluZyBwZWVycyA9IChbOjFdKTsKKworLyogRm9yIGEgbGlzdCBvZiBvZmZpY2lhbCBhbmQgZXh0ZW5kZWQgZmllbGRzOgorICAgaHR0cDovL3d3dy5tdWRieXRlcy5uZXQvaW5kZXgucGhwP2E9YXJ0aWNsZXMmcz1NU1NQX0ZpZWxkcworICAgRm9yIGEgcHJvdG9jYWwgZGVzY3JpcHRpb246CisgICBodHRwOi8vdGludGluLnNvdXJjZWZvcmdlLm5ldC9tc3NwLworICAgKi8KKworI2RlZmluZSBNU1NQX1ZBUiAxCisjZGVmaW5lIE1TU1BfVkFMIDIKKworcHVibGljIHN0cmluZyBjb252ZXJ0X3RuKG1hcHBpbmcgbGRhdGEpOworCitwcm90ZWN0ZWQgc3RyaW5nIGxpc3RfcG9ydHMoKSB7CisgIGludCBwb3J0cyA9IHF1ZXJ5X211ZF9wb3J0KC0xKSAtIDE7CisgIHN0cmluZyByZXM9IjIzIjsKKyAgZm9yKDsgcG9ydHM+PTAgOyAtLXBvcnRzKQorICAgIHJlcyArPSAiXHQiICsgdG9fc3RyaW5nKHF1ZXJ5X211ZF9wb3J0KHBvcnRzKSk7CisKKyAgcmV0dXJuIHJlczsKK30KKworI2RlZmluZSBERVNDUklQVElPTiBcCisgICAgTVVETkFNRSIgaXMgYSBuYXRpdmUgR2VybWFuIExQbXVkLiBJdCB3YXMgZm91bmRlZCBpbiAxOTkyIGFuZCBoYXMgIlwKKyAgICAiYmVlbiBwcm9zcGVyaW5nIHNpbmNlLiBUaGUgd29ybGQgZmVhdHVyZXMgYW4gb3JpZ2luYWwgZmFudGFzeSBzZXR0aW5nICJcCisgICAgIndpdGggbWFueSBmYWNldHMuIFRoZSAxMyBkb21haW5zIGZvcm0gYSBiaWcgd29ybGQgd2l0aCAxODAwMCByb29tcyB0byAiXAorICAgICJleHBsb3JlIGFuZCBzZXZlcmFsIHRob3VzYW5kIE5QQ3MuIFlvdSBjYW4gY2hvb3NlIGJldHdlZW4gNyByYWNlcyBhbmQgIlwKKyAgICAiMTAgY2xhc3NlcyAoZ3VpbGRzKS4gQWR2YW5jaW5nIGlzIGRvbmUgdGhyb3VnaCBhIGNvbWJpbmF0aW9uIG9mICJcCisgICAgImV4cGxvcmF0aW9uIHBvaW50cywgZXhwZXJpZW5jZSBwb2ludHMsIGNsYXNzIHNraWxscywgZmluaXNoZWQgIlwKKyAgICAiYWR2ZW50dXJlcyBhbmQgc29tZSBtb3JlLiBUaGUgbGV2ZWxzIGFyZSBub3QgbGltaXRlZCwgY3VycmVudCBtYXhpbXVtICJcCisgICAgImlzIGFib3V0IDIwMC4gQWZ0ZXIgYmVjb21pbmcgYSBoaWdoIGxldmVsIHBsYXllciBpdCdzIHBvc3NpYmxlIHRvICJcCisgICAgImJlY29tZSBhIHdpemFyZCBhbmQgYWRkIHlvdXIgb3duIGltYWdpbmF0aW9uIHRvIHRoZSBnYW1lLiBXZSBhcmUgIlwKKyAgICAiZXNwZWNpYWxseSBwcm91ZCBvZiBhdHRyYWN0aW5nIGEgbnVtYmVyIG9mIHZpc3VhbGx5IGltcGFpcmVkIHBsYXllcnMgIlwKKyAgICAid2hvIHZlcnkgbXVjaCBlbmpveSBwbGF5aW5nIGEgdGV4dCBiYXNlZCBvbmxpbmUgUlBHLiBUaGF0cyB3aHkgd2UgaGF2ZSAiXAorICAgICJhbiBvcHRpb24gdG8gdHVybiBhc2NpaS1ncmFwaGljcyBvZmYuIE11bHRpcGxheWluZyBpcyBhIGJpdCByZXN0cmljdGVkICJcCisgICAgImFuZCBzY3JpcHRpbmcgaXMgZGlzY291cmFnZWQuIgorCitwcml2YXRlIG5vc2F2ZSBtYXBwaW5nIG1pbmRhdGEgPSAoWworICAgICJOQU1FIiAgICAgICAgICAgICA6IE1VRE5BTUUsCisgICAgIlVQVElNRSIgICAgICAgICAgIDogdG9fc3RyaW5nKF9fQk9PVF9USU1FX18pLAorICAgIF0pOworCitwcml2YXRlIG5vc2F2ZSBtYXBwaW5nIGRhdGEgPSBtaW5kYXRhICsgKFsKKyAgICAiUE9SVCIgICAgICAgICAgICAgOiBsaXN0X3BvcnRzKCksCisgICAgIkNPREVCQVNFIiAgICAgICAgIDogX01VRExJQl9OQU1FXysiLSIrX01VRExJQl9WRVJTSU9OXywKKyAgICAiSE9TVE5BTUUiICAgICAgICAgOiBfX0hPU1RfTkFNRV9fICsgIi4iICsgX19ET01BSU5fTkFNRV9fLAorI2lmIE1VREhPU1QgPT0gX19IT1NUX05BTUVfXworLy8gZGllc2UgQW5nYWJlbiBzb2xsZW4gbnVyIGdlc2VuZGV0IHdlcmRlbiwgd2VubiBkYXMgTXVkIHdpcmtsaWNoIGF1ZiBkZW0KKy8vIE1HLVJlY2huZXIgbGFldWZ0IHVuZCBrZWluIEhvbWVtdWQgaXN0LgorICAgICJDUkFXTCBERUxBWSIgICAgICA6ICIxIiwKKyAgICAiREVTQ1JJUFRJT04iICAgICAgOiBERVNDUklQVElPTiwKKyAgICAiQ1JFQVRFRCIgICAgICAgICAgOiAiMTk5MiIsCisgICAgIklDT04iICAgICAgICAgICAgIDogImh0dHA6Ly9tZy5tdWQuZGUvbmV3d2ViL2ltZy9pY29uLmdpZiIsCisgICAgIklQIiAgICAgICAgICAgICAgIDogIjg3Ljc5LjI0LjYwIiwKKyAgICAiQ09OVEFDVCIgICAgICAgICAgOiAibXVkQG1nLm11ZC5kZSIsCisgICAgIldFQlNJVEUiICAgICAgICAgIDogImh0dHA6Ly9tZy5tdWQuZGUvIiwKKyAgICAiQVJFQVMiICAgICAgICAgICAgOiAiMTMiLAorICAgICJNT0JJTEVTIiAgICAgICAgICA6ICIyNjAwIiwKKyAgICAiT0JKRUNUUyIgICAgICAgICAgOiAiNDAwMCIsCisgICAgIlJPT01TIiAgICAgICAgICAgIDogIjE4MDAwIiwKKyAgICAiQ0xBU1NFUyIgICAgICAgICAgOiAiMTAiLAorICAgICJMRVZFTFMiICAgICAgICAgICA6ICIyMDAiLAorICAgICJSQUNFUyIgICAgICAgICAgICA6ICI3IiwKKyAgICAiU0tJTExTIiAgICAgICAgICAgOiAiMTQwIiwKKyAgICAiTVVMVElDTEFTU0lORyIgICAgOiAiMCIsCisgICAgIlBMQVlFUktJTExJTkciICAgIDogIlJlc3RyaWN0ZWQiLAorICAgICJORVdCSUUgRlJJRU5ETFkiICA6ICIxIiwKKyAgICAiUk9MRVBMQVlJTkciICAgICAgOiAiQWNjZXB0ZWQiLAorICAgICJXT1JMRCBPUklHSU5BTElUWSI6ICJNb3N0bHkgT3JpZ2luYWwiLAorICAgICJNSU5JTVVNIEFHRSIgICAgICA6ICI2IiwKKyAgICAiU1NMIiAgICAgICAgICAgICAgOiAiNDcxMiIsCisgICAgIlNUQVRVUyIgICAgICAgICAgIDogIkxpdmUiLAorICAgICJTVEFUVVMtTk9URVMiICAgICA6ICJsaXZlIGFuZCBydW5uaW5nIiwKKyAgICAiUE9SVC1OT1RFUyIgICAgICAgOiAicGxheWVyIHBvcnRzIGFyZSAyMyBhbmQgNDcxMSwgU1NMIHBvcnQgaXMgNDcxMiIsCisgICAgIlFVRVNULU5PVEVTIiAgICAgIDogIldlIGhhdmUgYWJvdXQgMjAwIFF1ZXN0cyBhbmQgTWluaVF1ZXN0cyBhbmQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGV5IHBsYXkgYW4gaW1wb3J0YW50IHJvbGUgaW4gZ2FpbmluZyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgImxldmVscyBhbmQgc2tpbGxzLiIsCisgICAgIk1VTFRJUExBWUlORy1OT1RFUyIgICAgIDogImZvciBjb21iYXQgYW5kIHF1ZXN0cyBvbmx5IDIgY2hhcmFjdGVycyBtYXkgYmUgYWN0aXZlIiwKKyNlbHNlCisgICAgIlNUQVRVUyIgICAgICAgICAgIDogIkFscGhhIiwKKyAgICAiU1RBVFVTLU5PVEVTIiAgICAgOiAiSG9tZW11ZCBmb3IgdGVzdGluZyBwdXBvc2VzIiwKKyNlbmRpZgorICAgICJMQU5HVUFHRSIgICAgICAgICA6ICJHZXJtYW4iLAorICAgICJMT0NBVElPTiIgICAgICAgICA6ICJHZXJtYW55IiwKKyAgICAiRkFNSUxZIiAgICAgICAgICAgOiAiTFBNdWQiLAorICAgICJHRU5SRSIgICAgICAgICAgICA6ICJGYW50YXN5IiwKKyAgICAiU1VCR0VOUkUiICAgICAgICAgOiAiTm9uZSIsCisgICAgIkdBTUVQTEFZIiAgICAgICAgIDogIkFkdmVudHVyZSIsCisgICAgIkdBTUVTWVNURU0iICAgICAgIDogIkN1c3RvbSIsCisgICAgIklOVEVSTVVEIiAgICAgICAgIDogIklNMi1aZWJlZGVlIiwKKyAgICAiSEVMUEZJTEVTIiAgICAgICAgOiAiTi9BIiwKKyAgICAiTVVMVElQTEFZSU5HIiAgICAgOiAiUmVzdHJpY3RlZCIsCisgICAgIkVRVUlQTUVOVCBTWVNURU0iIDogIkJvdGgiLAorICAgICJUUkFJTklORyBTWVNURU0iICA6ICJCb3RoIiwKKyAgICAiUVVFU1QgU1lTVEVNIiAgICAgOiAiSW50ZWdyYXRlZCIsCisgICAgIlpNUCIgICAgICAgICAgICAgIDogIjAiLAorICAgICJBTlNJIiAgICAgICAgICAgICA6ICIxIiwKKyAgICAiR01DUCIgICAgICAgICAgICAgOiAiMSIsCisgICAgIk1DQ1AiICAgICAgICAgICAgIDogIjAiLAorICAgICJNQ1AiICAgICAgICAgICAgICA6ICIwIiwKKyAgICAiTVNQIiAgICAgICAgICAgICAgOiAiMCIsCisgICAgIk1YUCIgICAgICAgICAgICAgIDogIjAiLAorICAgICJQVUVCTE8iICAgICAgICAgICA6ICIwIiwKKyAgICAiVlQxMDAiICAgICAgICAgICAgOiAiMSIsCisgICAgIlhURVJNIDI1NiBDT0xPUlMiIDogIjAiLAorICAgICJQQVkgVE8gUExBWSIgICAgICA6ICIwIiwKKyAgICAiUEFZIEZPUiBQRVJLUyIgICAgOiAiMCIsCisgICAgIkhJUklORyBCVUlMREVSUyIgIDogIjEiLAorICAgICJISVJJTkcgQ09ERVJTIiAgICA6ICIxIiwKKyAgICAiQ09ERUJBU0UtTk9URVMiICAgICAgICAgOiAiZG93bmxvYWQgZGFpbHkgc25hcHNob3Qgb2Ygb3VyIHB1YmxpYyBiYXNlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXVkbGliIGF0IGZ0cDovL21nLm11ZC5kZS9Tb2Z0d2FyZS9NdWRMaWIvLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdldCBvdXIgZHJpdmVyIGF0IGh0dHA6Ly93d3cubGRtdWQuZXUvIiwKKyAgICAiRkFNSUxZLU5PVEVTIiAgICAgICAgICAgOiAiRGVzY2VuZGFudCBvZiBOaWdodGZhbGwsIGJhc2UgZm9yIHNldmVyYWwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnZXJtYW4gTVVEcywgdXNlcyBMRE11ZC0zLjUueCIsIAorICAgICJIRUxQRklMRVMtTk9URVMiICAgICAgICA6ICJlYWNoIGJhc2ljIGNvbW1hbmQsIGFuZCBodW5kcmVkcyBvZiBvdGhlciBkb2NzIiwKKyAgICAiTU9CSUxFUy1OT1RFUyIgICAgICAgICAgOiAibnBjJ3MgY2FuIGJlIGNsb25lZCwgc28gdGhlcmUgY2FuIGJlIHRob3VzYW5kcyIsCisgICAgIk9CSkVDVFMtTk9URVMiICAgICAgICAgIDogIm9iamVjdHMgY2FuIGJlIGNsb25lZCwgc28gdGhlcmUgY2FuIGJlIHRob3VzYW5kcyIsCisgICAgIlJFU0VUUy1OT1RFUyIgICAgICAgICAgIDogImRvZXNuJ3QgYXBwbHksIExQTXVkIiwKKyAgICAiTVVEUFJPR1MtTk9URVMiICAgICAgICAgOiAiZG9lc24ndCBhcHBseSwgTFBNdWQiLAorICAgICJNVURUUklHUy1OT1RFUyIgICAgICAgICA6ICJkb2Vzbid0IGFwcGx5LCBMUE11ZCIsCisgICAgIlJBQ0VTLU5PVEVTIiAgICAgICAgICAgIDogInNvbWUgYWRkaXRpb25hbCBmb3Igbm9uIHBsYXllciBjaGFyYWN0ZXJzIiwKKyAgICAiU0tJTExTLU5PVEVTIiAgICAgICAgICAgOiAiZWFjaCBjbGFzcy9ndWlsZCBhbmQgcmFjZSBoYXMgaXRzIG93biBzZXQgb2Ygc2tpbGxzIiwKKyAgICAiUExBWUVSS0lMTElORy1OT1RFUyIgICAgOiAicGxheWVya2lsbGluZyBpcyBsaW1pdGVkIHRvIHNwZWNpZmljIHJvb21zIiwKKy8qCisgICAgIkFEVUxUIE1BVEVSSUFMIiAgIDogIjAiLAorICAgICJQTEFZRVIgQ0lUSUVTIiAgICA6ICIwIiwKKyAgICAiUExBWUVSIENMQU5TIiAgICAgOiAiMCIsCisgICAgIlBMQVlFUiBDUkFGVElORyIgIDogIjAiLAorICAgICJQTEFZRVIgR1VJTERTIiAgICA6ICIwIiwKKyAgICAiUk9PTVMtTk9URVMiICAgICAgICAgICAgOiAiYXJlYXMgaGF2ZSBnZW5lcmF0ZWQgcm9vbXMsIGNvdWxkIGJlIG1pbGxpb25zIiwKKyAqLworICAgIF0pOworCisKKy8vIGNhY2hlIGZ1ZXIgZGllIHRlbG5ldG5lZy1iYXNpZXJ0ZSB2YXJpYW50ZQorcHJpdmF0ZSBub3NhdmUgc3RyaW5nIHRuX3Jlc3VsdF9taW4gPSBjb252ZXJ0X3RuKG1pbmRhdGEpOworcHJpdmF0ZSBub3NhdmUgc3RyaW5nIHRuX3Jlc3VsdCA9IGNvbnZlcnRfdG4oZGF0YSk7CisKKworLy8gY29udmVydHMgaW50byB0aGUgYXJyYXkgdG8gYmUgc2VudCB2aWEgdGVsbmV0IHN1Ym9wdGlvbiBuZWdvdGlhdGlvbi4KK3B1YmxpYyBzdHJpbmcgY29udmVydF90bihtYXBwaW5nIGxkYXRhKSB7CisgIHN0cmluZyByZXM9IiI7CisgIGZvcmVhY2goc3RyaW5nIGtleSwgc3RyaW5nIHZhbHVlOiBsZGF0YSkgeworICAgIHJlcyArPSBzcHJpbnRmKCIlYyVzJWMlcyIsIE1TU1BfVkFSLCBrZXksIE1TU1BfVkFMLCB2YWx1ZSk7CisgIH0KKyAgcmV0dXJuIHJlczsKK30KKworCitwdWJsaWMgdm9pZCBwcmludF9tc3NwX3Jlc3BvbnNlKCkgeworIHN0cmluZyBpcCA9IHF1ZXJ5X2lwX251bWJlcihwcmV2aW91c19vYmplY3QoKSk7CisgbWFwcGluZyBsZGF0YTsKKyBpZiAoc3RyaW5ncChpcCkpIHsKKyAgICAgLy8gVm9sbGVuIERhdGVuc2F0eiBhbGxlICgiQ1JBV0wgREVMQVkiIC8gMikgaCwgZGFoZXIgKiAxODAwLgorICAgaWYgKHBlZXJzW2lwXSA+ICh0aW1lKCkgLSAodG9faW50KGRhdGFbIkNSQVdMIERFTEFZIl0pIHx8IDEpICogMTgwMCkpIHsKKyAgICAgICAvLyB0aGlzIHBlZXJzIGFza3MgdG8gb2Z0ZW4gYW5kIGdldHMgb25seSB0aGUgbWluaW1hbCBkYXRhc2V0CisgICAgICAgbGRhdGEgPSBtaW5kYXRhOworICAgfQorICAgZWxzZSB7CisgICAgICAgbGRhdGEgPSBkYXRhOworICAgICAgIHBlZXJzW2lwXSA9IHRpbWUoKTsgLy8gcmVjb3JkIHRpbWVzdGFtcAorICAgfQorIH0KKyBlbHNlCisgICAgIGxkYXRhID0gZGF0YTsKKworIC8qIGRhdGFbIldITyJdID0gaW1wbG9kZShtYXAoZmlsdGVyKHVzZXJzKCksIAorICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHN0YXR1cyAob2JqZWN0IG8pCisgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gIW8tPlF1ZXJ5UHJvcChQX0lOVklTKTsgfSApLAorICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBzdHJpbmcgKG9iamVjdCBvKQorICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBjYXBpdGFsaXplKG8tPnF1ZXJ5X3JlYWxfbmFtZSgpKTsgfSApLAorICAgICAgICAgICAgICAgICAgIlx0IiApOworICAqLworICBsZGF0YVsiUExBWUVSUyJdID0gdG9fc3RyaW5nKHNpemVvZih1c2VycygpKS0xKTsKKworICBzdHJpbmcgcmVwbHkgPSAiXHJcbk1TU1AtUkVQTFktU1RBUlRcclxuIjsKKworICBmb3JlYWNoKHN0cmluZyBrZXksIHN0cmluZyB2YWx1ZTogbGRhdGEpIHsKKyAgICByZXBseSArPSBrZXkgKyAiXHQiICsgdmFsdWUgKyAiXHJcbiI7CisgIH0KKworICByZXBseSArPSAiTVNTUC1SRVBMWS1FTkRcclxuIjsKKyAgd3JpdGUocmVwbHkpOworfQorCitwdWJsaWMgc3RyaW5nIGdldF90ZWxuZWdzX3N0cigpIHsKKyAgc3RyaW5nIGlwID0gcXVlcnlfaXBfbnVtYmVyKHByZXZpb3VzX29iamVjdCgpKTsKKyAgc3RyaW5nIHJlczsKKworICBpZiAoc3RyaW5ncChpcCkpIHsKKyAgICAvLyBWb2xsZW4gRGF0ZW5zYXR6IGFsbGUgKCJDUkFXTCBERUxBWSIgLyAyKSBoLCBkYWhlciAqIDE4MDAuCisgICAgaWYgKHBlZXJzW2lwXSA+ICh0aW1lKCkgLSAodG9faW50KGRhdGFbIkNSQVdMIERFTEFZIl0pIHx8IDEpICogMTgwMCkpIHsKKyAgICAgICAvLyB0aGlzIHBlZXJzIGFza3MgdG8gb2Z0ZW4gYW5kIGdldHMgb25seSB0aGUgbWluaW1hbCBkYXRhc2V0CisgICAgICAgcmVzID0gdG5fcmVzdWx0X21pbjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJlcyA9IHRuX3Jlc3VsdDsKKyAgICAgICAgcGVlcnNbaXBdID0gdGltZSgpOyAvLyByZWNvcmQgdGltZXN0YW1wCisgICAgfQorICB9CisgIGVsc2UKKyAgICByZXMgPSB0bl9yZXN1bHQ7CisKKyAgcmVzICs9IGNvbnZlcnRfdG4oIChbIlBMQVlFUlMiOiB0b19zdHJpbmcoc2l6ZW9mKHVzZXJzKCkpLTEpIF0pICk7CisgICAKKyAgcmV0dXJuIHJlczsKK30KKwpkaWZmIC0tZ2l0IGEvc2VjdXJlL21pc2MvdHdpdHRlci5jIGIvc2VjdXJlL21pc2MvdHdpdHRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzNDUxOWUKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvbWlzYy90d2l0dGVyLmMKQEAgLTAsMCArMSwxMzEgQEAKKy8qIHJ1bWF0YXMgdHdpdHRlciBjbGllbnQsIHNlbmRldCB0ZXh0CisgKiBhbiBlaW5lbiB0d2l0dGVycHJveHlwcm96ZXNzLCBkZXIgc2llIGRhbm4gYW4gdHdpdHRlcgorICogd2VpdGVyc2NoaWNrdC4KKyAqCisgKiB2ZXJzaW9uIDIKKyAqIG1pdCBwZXJzaXN0ZW50ZXIgdmVyYmluZHVuZyB6dW0gcHJveHkgdW5kIGlucHV0LWNoYW5uZWwKKyAqCisgKiAyNS41LjIwMTYgcnVtYXRhQG1nLm11ZC5kZQorICovCisKKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKyNpbmNsdWRlIDxkYWVtb24vY2hhbm5lbC5oPgorCisjZGVmaW5lIEhPU1QgIjEyNy4wLjAuMSIKKyNkZWZpbmUgUE9SVCA0OTExCisKKyNkZWZpbmUgREVCVUcoeCkgdGVsbF9vYmplY3QoZmluZF9wbGF5ZXIoInJ1bWF0YSIpLHgrIlxuIikKKwordm9pZCBjcmVhdGUoKSB7CisJaWYoIGNsb25lcCgpICkgcmV0dXJuOworCXNldGV1aWQoZ2V0dWlkKCkpOworfQorCitvYmplY3QgY2FsbGVyOworc3RyaW5nIG1zZ2J1ZjsKKworbWFwcGluZyByZWdpc3RlcmVkID0gKFsKKwkicnVtYXRhIjogInJ1IiwKKwkiYXJhdGhvcm4iOiAiYXJhIiwKKwkiYXJrIjogImFyayIsCisJInplc3N0cmEiOiAiemUiLAorCSJ6b29rIjogInpvIiwKKwkiaHVtbmkiOiAiaHUiLAorCSJtaXJpbCI6ICJtaSIsCisJImdsb2luc29uIjogImdsIgorXSk7CisKK2ludCBhbGxvd2VkKCkgeworCXJldHVybiBJU19BUkNIKHRoaXNfcGxheWVyKCkpIHx8IGdldHVpZCh0aGlzX3BsYXllcigpKT09Imdsb2luc29uIjsKK30KKworc3RyaW5nIHNpZyggb2JqZWN0IHBsICkgeworCXN0cmluZyB1aWQgPSBnZXR1aWQocGwpOworCWlmKCAhdWlkICkgcmV0dXJuICI/PyI7CisJc3RyaW5nIGFiYnIgPSByZWdpc3RlcmVkW3VpZF07CisJaWYoICFhYmJyICkgcmV0dXJuIHVpZDsKKwlyZXR1cm4gYWJicjsKK30KKwordm9pZCBlbWl0KCBzdHJpbmcgbXNnICkgeworCUNITUFTVEVSLT5zZW5kKCJ0d2l0dGVyIix0aGlzX29iamVjdCgpLG1zZyxNU0dfU0FZKTsKKwkvKgorCWZvcmVhY2goIHN0cmluZyB1aWQ6IG1faW5kaWNlcyhyZWdpc3RlcmVkKSApIHsKKwkJb2JqZWN0IHBsID0gZmluZF9wbGF5ZXIodWlkKTsKKwkJaWYoIHBsICkgdGVsbF9vYmplY3QocGwsbXNnKTsKKwl9Ki8KK30KKworLyogT2ZmaXppZWxsZSBBUEkgZnVua3Rpb24KKyAqIHhldmFsICIvc2VjdXJlL21pc2MvdHdpdHRlciItPnR3aXR0ZXIoIkBfemVzc3RyYV8gd2VsY29tZSBiYWNrIikKKyAqLwordm9pZCB0d2l0dGVyKHN0cmluZyBtc2cpIHsKKwlpbnQgZXJyID0gMDsKKwlpZiggIWFsbG93ZWQoKSApIHsKKwkJd3JpdGUoICJUd2l0dGVyIGlzdCBBUkNIK0dsb2luc29uIG9ubHkuXG4iICk7CisJCXJldHVybjsKKwl9CisJbXNnID0gbXNnICsgIl4iICsgc2lnKHRoaXNfcGxheWVyKCkpICsgIlxuIjsKKwlpZihpbnRlcmFjdGl2ZSh0aGlzX29iamVjdCgpKSkgeworCQl0ZWxsX29iamVjdCh0aGlzX29iamVjdCgpLG1zZyk7CisJfSBlbHNlIHsKKwkJbXNnYnVmID0gbXNnOworCQljYWxsZXIgPSB0aGlzX3BsYXllcigpOworCQlpZiggKGVycj1uZXRfY29ubmVjdChIT1NULFBPUlQpKSE9MCApIHsKKwkJCXdyaXRlKCAiS29ubnRlIFR3ZWV0IG5pY2h0IHNlbmRlbi4gZXJyPSIrZXJyKyJcbiIgKTsKKwkJfQorCX0KK30KKworLy8gc29uZGVyZnVua3Rpb24gZnVlciBkZW4gZmFsbCwgZGFzcyBtYW4gZGllIHZlcmJpbmR1bmcKKy8vIGF1ZmJhdWVuIHdpbGwsIG9obmUgZGFzcyBldHdhcyBhdWYgdHdpdHRlciBlcnNjaGVpbnQKK3ZvaWQgY29ubmVjdCgpIHsKKwlpbnQgZXJyID0gMDsKKwlpZiggaW50ZXJhY3RpdmUodGhpc19vYmplY3QoKSkgKSByZXR1cm47CisJbXNnYnVmID0gIiI7CisJY2FsbGVyID0gdGhpc19wbGF5ZXIoKTsKKwlpZiggKGVycj1uZXRfY29ubmVjdChIT1NULFBPUlQpKSE9MCApIHsKKwkJd3JpdGUoICJLb25udGUgVHdlZXQgbmljaHQgY29ubmVjdGVkLiBlcnI9IitlcnIrIlxuIiApOworCX0KK30KKwordmFyYXJncyB2b2lkIGxvZ29uKGludCBmbGFnKSB7CisJaWYoIGZsYWc8MCApIHsKKwkJdGVsbF9vYmplY3QoY2FsbGVyLCJUd2l0dGVycHJveHkgYW50d29ydGV0IG5pY2h0P1xuIik7CisgIH0gZWxzZSB7CisJCWVuYWJsZV9jb21tYW5kcygpOworCQlhZGRfYWN0aW9uKCJpbnB1dCIsIiIsMSk7CisJCXdyaXRlKG1zZ2J1Zik7CisJCWlmKCBtc2didWYhPSIiICkgZW1pdCggbXNnYnVmICk7CisJCS8vIi9zZWN1cmUvbWFzdGVyIi0+ZGlzY29ubmVjdCh0aGlzX29iamVjdCgpKTsKKwl9Cit9CisKK3ZvaWQgTmV0RGVhZCgpIHsKKwlkaXNhYmxlX2NvbW1hbmRzKCk7Cit9CisKK3N0cmluZyBxdWVyeV9yZWFsX25hbWUoKSB7CisJcmV0dXJuICIoVHdpdHRlcikiOworfQorCit2YXJhcmdzIHN0cmluZyBOYW1lKCBpbnQgY2FzdXMsIGludCBkZW1vbiApIHsKKwlyZXR1cm4gIlR3aXR0ZXIiOworfQorCisvLyBkYXRlbiB3ZXJkZW4gdmlhIHRlbGxfb2JqZWN0IGFuIGRpZXNlcyBvYmpla3QgZ2VzZW5kZXQKKy8vIHVuZCBkYW5uIG5hY2ggYXVzc2VuIHdlaXRlcmdlYmVuCit2b2lkIGNhdGNoX3RlbGwoIHN0cmluZyBtc2cgKSB7CisJaWYoIGFsbG93ZWQoKSAmJiBpbnRlcmFjdGl2ZSh0aGlzX29iamVjdCgpKSApIHsKKwkJd3JpdGUoIG1zZyApOworCX0KK30KKworLy8gaGllciBsYW5kZW4gZGF0ZW4gdm9uIGF1c3NlbgoraW50IGlucHV0KCBzdHJpbmcgcyApIHsKKwlzdHJpbmcgbXNnID0gcXVlcnlfdmVyYigpOworCWlmKCBzICkgbXNnID0gbXNnICsgIiAiICsgczsKKwllbWl0KCBtc2cgKTsgLy8iVHdpdHRlciB0ZWlsdCBkaXIgbWl0OiAiK21zZysiXG4iICk7CisJcmV0dXJuIDE7Cit9CisKZGlmZiAtLWdpdCBhL3NlY3VyZS9uZXdzLmMgYi9zZWN1cmUvbmV3cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1MWM4ODcKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvbmV3cy5jCkBAIC0wLDAgKzEsNTY2IEBACisvLyAxOC5EZXogIDE5OTYgLSBMb2NvQE1vcmdlbmdyYXVlbgorLy8gOC4gRmViICAxOTk1IC0gSm9mQE1vcmdlbkdyYXVlbgorLy8gNS4gSnVsaSAxOTkyIC0gSm9mQE1vcmdlbkdyYXVlbgorLy8gNi4gSnVsaSAxOTkyIC0gSm9mQE1vcmdlbkdyYXVlbgorLy8gQ2xlYXItR3JvdXBzLU1lY2hhbmlzbXVzIGVpbmdlYmF1dC4gRGllIDIgS29uc3RhbnRlbiBUSU1FX1RPX0NMRUFSIHVuZAorLy8gTUlOX1RPVUNIRUQgbXVlc3NlbiBkZWYuIHNlaW4uIEFsbGUgVElNRV9UT19DTEVBUiBTZWt1bmRlbiB3ZXJkZW4gZGllCisvLyBOZXdzZ3JvdXBzLCBkaWUgc2VpdCBkZW0gbGV0enRlbiBDbGVhciBzZWx0ZW5lciBhbHMgTUlOX1RPVUNIRUQgU2VrdW5kZW4KKy8vIGJlcnVlaHJ0IHd1cmRlbiwgYXVzIGRlbSBDYWNoZSBnZW5vbW1lbgorCisvLyAxLiBGZWJydWFyIDE5OTUgLSBKb2ZATW9yZ2VuR3JhdWVuCisvLyBSZXdyaXRlIChNYXBwaW5ncyBiZW51dHplbiwgQWNjZXNzaW5mb3MgaW0gU3BlaWNoZXIgaGFsdGVuKQorCisKKy8vIERhdGVuc3RydWt0dXJlbjoKKworLy8gTmV3c2dyb3VwczogIGdyb3VwbGlzdCBpc3QgZWluIE1hcHBpbmcgbWl0IGVpbmVtIEVpbnRyYWcgcHJvIE5ld3Nncm91cC4KKy8vICAgICAgICAgICAgICBEaWUgS2V5cyBzaW5kIGRpZSBHcnVwcGVubmFtZW4sIERhdGVuOgorLy8gICAgICAgICAgICAgIDAgWmVpdCBkZXMgbGV0emVuIEFydGlrZWxzCisvLyAgICAgICAgICAgICAgMSBCZXNpdHplciBkZXIgR3J1cHBlCisvLyAgICAgICAgICAgICAgMiBTYXZlZmlsbGUtTmFtZQorLy8gICAgICAgICAgICAgIDMgRXhwaXJlLVplaXQKKy8vICAgICAgICAgICAgICA0IEFycmF5IG1pdCBMb2VzY2gtQmVyZWNodGlndGVuCisvLyAgICAgICAgICAgICAgNSBBcnJheSBtaXQgU2NoZWliLUJlcmVjaHRpZ3RlbgorLy8gICAgICAgICAgICAgIDYgQXJyYXkgbWl0IExlc2ViZXJlY2h0aWd0ZW4KKy8vICAgICAgICAgICAgICA3IE1pbmRlc3QtTGV2ZWwsIHVtIEFydGlrZWwgenUgbG9lc2NoZW4KKy8vICAgICAgICAgICAgICA4IE1pbmRlc3QtTGV2ZWwsIHVtIEFydGlrZWwgenUgcG9zdGVuCisvLyAgICAgICAgICAgICAgOSBNaW5kZXN0LUxldmVsLCB1bSBBcnRpa2VsIHp1IGxlc2VuCisvLyAgICAgICAgICAgICAxMCBNYXguIEFuemFobCBOYWNocmljaHRlbiBpbiBkZXIgR3J1cHBlCisKKy8vIERpZSBOYWNocmljaHRlbiBzZWxiZXIgc3RlaGVuIGluIGVpbmVtIEFycmF5LgorCisvLyBFaW5lIG5hY2hyaWNodCBpc3QgZWluIEFycmF5IG1pdCBkZW4gZm9sZ2VuZGVuIEVsZW1lbnRlbjoKKy8vIDAgICAgICAgICAoKikgc3RyaW5nIHdyaXRlcjsKKy8vIDEgICAgICAgICAoKikgc3RyaW5nIGlkOyAgICBNdWRuYW1lKyI6Iit0aW1lKCkrIjoiK2dyb3VwIHp1ciBaZWl0CisvLyAyICAgICAgICAgKCopIHN0cmluZyB0aW1lOworLy8gMyAgICAgICAgICAgICBzdHJpbmcgdGl0bGU7CisvLyA0ICAgICAgICAgICAgIHN0cmluZyBtZXNzYWdlOworCisvLyBEaWUgbWl0ICgqKSBnZWtlbm56ZWljaG5ldGVuIEVpbnRyYWVnZSBzZXR6dCBkZXIgRGFlbW9uIHNlbGJlcgorCisvLyBGdW5rdGlvbmVuOgorLy8gICAgUmV0dXJudmFsdWVzOiAgMCA9IFBhcmFtZXRlciBlcnJvcgorLy8gICAgICAgICAgICAgICAgICAgMSA9IE9rLgorLy8gICAgICAgICAgICAgICAgICAtMSA9IG5vIHBlcm1pc3Npb24KKy8vICAgICAgICAgICAgICAgICAgLTIgPSBubyBzdWNoIGdyb3VwL2dyb3VwIGFscmVhZHkgZXhpc3RpbmcKKy8vCisvLyAgICBEaWVzZSBSZXR1cm52YWx1ZXMgc3RlaGVuIGZ1ZXIgYWxsZSBGdW5rdGlvbmVuCisKKy8vICBBZGRHcm91cChncm91cG5hbWUsIG93bmVyLCBzYXZlZmlsZSk7CisvLyAgIEZ1bmt0aW9uIGtsYXIsIGthbm4gbnVyIHZvbiBFcnptYWdpZXJuIGF1ZmdlcnVmZW4gd2VyZGVuCisvLyAgICAtMyA9IG5vIG93bmVyLCAtNCA9IHNhdmVmaWxlIGFscmVhZHkgaW4gdXNlCisvLworLy8gIFJlbW92ZUdyb3VwKGdyb3VwbmFtZSk7CisvLyAgIEViZW5mYWxscyBudXIgZnVlciBFcnptYWdpZXIKKy8vCisvLyAgU2V0R3JvdXAoZ3JvdXBuYW1lLCBkbGV2ZWwsIHdsZXZlbCwgcmxldmVsLCBtYXhtZXNzYWdlcywgZXhwaXJlKTsKKy8vICAgRXJ6bWFnaWVyIHVuZCBkZXIgR3JvdXBvd25lciBrb2VubmVuIGRpZSBudXR6ZW4uIExlZ3QgTGV2ZWwsIGFiIGRlbSBqZS0KKy8vICAgbWFuZCBhdXMgZGVyIEdydXBwZSBsb2VzY2hlbiBrYW5uIChkbGV2ZWwpLCBpbiBkaWUgR3J1cHBlIHNjaHJlaWJlbgorLy8gICBrYW5uICh3bGV2ZWwpLCBkaWUgR3J1cHBlIGxlc2VuIGthbm4gKHJsZXZlbCkgdW5kIGRpZSBtYXguIEFuemFobCBOYWNoLQorLy8gICByaWNodGVuIGluIGRlciBHcnVwcGUgZmVzdC4KKy8vCisvLyAgQWRkQWxsb3dlZChncm91cG5hbWUsIGRlbGV0ZXJzLCB3cml0ZXJzLCByZWFkZXJzKTsKKy8vICAgRXJ6bWFnaWVyL093bmVyIGtvZW5uZW4gQXJyYXlzIG1pdCBOYW1lbiB2b24gZnVlciBkaWUgR3J1cHBlIGxvZXNjaC8KKy8vICAgc2NocmVpYi9sZXNlLUJlcmVjaHRpZ3RlbiBmdWVyIGRpZSBHcnVwcGUgYW5nZWJlbi4KKy8vCisvLyAgUmVtb3ZlQWxsb3dlZChncm91cG5hbWUsIGRlbGV0ZXJzLCB3cml0ZXJzLCByZWFkZXJzKTsgIGFuYWxvZworLy8KKy8vICBXcml0ZU5vdGUobWVzc2FnZSk7IGtsYXIKKy8vICAgLTMgPSBNYXggbnVtYmVyIG9mIG1zZ3MgZXhjZWVkZWQKKy8vCisvLyAgUmVtb3ZlTm90ZShib2FyZG5hbWUsIG5vdGVudW1tZXIpOyBub3RlbnVtbWVyPj0wOworLy8gICAtMyA9IE5vIHN1Y2ggbm90ZQorLy8KKy8vICBHZXROb3Rlcyhib2FyZG5hbWUpOyBnaWJ0IGVpbmVuIEFycmF5IG1pdCBkZW4gTm90ZXMgenVydWVjay4KKy8vCisvLyAgQXNrQWxsb3dlZFdyaXRlKCk7IHJldHVybiB3aWUgYmVpIFdyaXRlTm90ZSwgc3RlbGx0IGZlc3QsIG9iIGVpbiBQbGF5ZXIKKy8vICBlaW5lIE5vdGUgYXVmaGFlbmdlbiBkYXJmIG9kZXIgbmljaHQKKy8vCisvLyAgR2V0TmV3c1RpbWUoW2JvYXJkbmFtZV0pOyBnaWJ0IHp1cnVlY2ssIHdhbm4gYW0gZW50c3ByZWNoZW5kZW4gQnJldHQgenVtCisvLyAgbGV0enRlbiBNYWwgZWluZSBOb3RlIGJlZmVzdGlndCB3dXJkZS4gRmFsbHMga2VpbiBib2FyZG5hbWUgYW5nZWdlYmVuCisvLyAgd2lyZCwgbGllZmVydCBHZXROZXdzVGltZSgpIGRlbiBaZWl0cHVua3QsIHp1IGRlbSB1ZWJlcmhhdXB0IGVpbmUgbmV1ZQorLy8gIE5vdGUgYXVmZ2VoYWVuZ3Qgd3VyZGUuCisvLworI3ByYWdtYSBzdHJpY3RfdHlwZXMKKyNwcmFnbWEgbm9fY2xvbmUKKyNwcmFnbWEgbm9fc2hhZG93CisjcHJhZ21hIG5vX2luaGVyaXQKKyNwcmFnbWEgdmVyYm9zZV9lcnJvcnMKKyNwcmFnbWEgY29tYmluZV9zdHJpbmdzCisvLyNwcmFnbWEgcGVkYW50aWMKKy8vI3ByYWdtYSByYW5nZV9jaGVjaworI3ByYWdtYSB3YXJuX2RlcHJlY2F0ZWQKKworI2luY2x1ZGUgIi9zZWN1cmUvd2l6bGV2ZWxzLmgiCisjaW5jbHVkZSA8ZGVmaW5lcy5oPgorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPG5ld3MuaD4KKworI2RlZmluZSBXVElNRSAwCisKK3ByaXZhdGUgaW50IHNlY3VyaXR5KCBzdHJpbmcgbmFtZSApOworCittaXhlZCBzYXZlbG9hZDsgLy8gRGllc2UgVmFyaWFibGUgaXN0IGFscyBlaW56aWdlIG5pY2h0IG5vc2F2ZSBpc3QgdW5kIGRpZW50CisgICAgICAgICAgICAgICAgIC8vIFVlYmVydHJhZ2VuIHZvbiBEYXRlbiBpbi9hdXMgc2F2ZWZpbGVzCisKK25vc2F2ZSBtYXBwaW5nIGdyb3VwbGlzdDsgLy8gR3JvdXBzIHVuZCBpaHJlIHNhdmUtRmlsZXMsIHp1ZGVtIExhc3RUaW1lCitub3NhdmUgaW50IGxhc3R0aW1lOyAvLyBVbSB6dSB2ZXJtZWlkZW4sIGRhc3MgMiBOb3RlcyBpZGVudGlzY2hlIFVocnplaXQ9PWlkCisgICAgICAgICAgICAgICAgICAgICAvLyBoYWJlbiwgd2lyZCBkaWUgamV3ZWlscyBsZXR6dGUgWmVpdCBnZXNwZWljaGVydC4KKworbm9zYXZlIG1hcHBpbmcgY2FjaGUgPSAoW10pOyAvLyBjYWNoZSBmdWVyIGRpZSBHcnVwcGVuaW5oYWx0ZQorCit2b2lkIGNyZWF0ZSgpIHsKKyAgc2V0ZXVpZChnZXR1aWQodGhpc19vYmplY3QoKSkpOworICBpZiAoIXJlc3RvcmVfb2JqZWN0KE5FV1NQQVRIKyJHcm91cExpc3QiKSkKKyAgICBncm91cGxpc3Q9bV9hbGxvY2F0ZSgwLEdfTUVTU0FHRVMpOworICBlbHNlCisgICAgZ3JvdXBsaXN0PXNhdmVsb2FkOworICAvLyBlcnN0ZW4gcmVzZXQgc29iYWxkIHdpZSBtb2VnbGljaC4gOy0pCisgIHNldF9uZXh0X3Jlc2V0KDEpOworfQorCitpbnQgQWRkR3JvdXAoc3RyaW5nIG5hbWUsIHN0cmluZyBvd25lcikKK3sKKyAgbWl4ZWQgKmdyb3VwOworICBzdHJpbmcgc2F2ZWZpbGUsICpzYXZlZmlsZWE7CisgIGludCBpOworCisgIGlmICghbmFtZSB8fCAhb3duZXIpIHJldHVybiAwOworICAKKyAgaWYgKCFBUkNIX1NFQ1VSSVRZIHx8IHByb2Nlc3NfY2FsbCgpKSByZXR1cm4gLTE7IC8vIERhcmYgbmljaHQKKworICBpZiAobWVtYmVyKGdyb3VwbGlzdCwgbmFtZSkpIHJldHVybiAtMjsgLy8gR2lidCBlcyBzY2hvbgorCisgIGlmIChmaWxlX3NpemUoIi8iK1NBVkVQQVRIK293bmVyWzAuLjBdKyIvIitvd25lcisiLm8iKTwwKSByZXR1cm4gLTM7CisKKyAgc2F2ZWZpbGVhID0gb2xkX2V4cGxvZGUobmFtZSwiLiIpOworICBzYXZlZmlsZSA9IGltcGxvZGUoc2F2ZWZpbGVhLCIvIik7CisgIGlmIChmaWxlX3NpemUoTkVXU1BBVEgrc2F2ZWZpbGUrIi5vIik+PTApIHJldHVybiAtNDsKKworICAvLyBOb3R3ZW5kaWdlIERpcmVjdG9yaWVzIGFubGVnZW4KKyAgZm9yIChpID0gMDsgaSA8IHNpemVvZihzYXZlZmlsZWEpLTE7IGkrKykgeworICAgIG1rZGlyKE5FV1NQQVRIK2ltcGxvZGUoc2F2ZWZpbGVhWzAuLmldLCIvIikpOworICB9CisKKyAgZ3JvdXA9KHt9KTsKKyAgZ3JvdXBsaXN0Kz0oW25hbWU6MDtvd25lcjtzYXZlZmlsZTstMTsoe30pOyh7fSk7KHt9KTsyMDswOzA7ODBdKTsKKyAgc2F2ZV9ncm91cF9saXN0KCk7CisgIHNhdmVfZ3JvdXAobmFtZSxncm91cCk7CisgIHJldHVybiAxOworfQorCitpbnQgUmVtb3ZlR3JvdXAoc3RyaW5nIG5hbWUpCit7CisgIGludCBudW07CisKKyAgaWYgKCFuYW1lKSByZXR1cm4gMDsKKworICBpZiAoIXNlY3VyaXR5KG5hbWUpIHx8IHByb2Nlc3NfY2FsbCgpKSByZXR1cm4gLTE7IC8vIERhcmYgbmljaHQKKworICBpZiAoIW1hcHBpbmdwKGdyb3VwbGlzdCkgfHwgIW1lbWJlcihncm91cGxpc3QsbmFtZSkpCisgICAgcmV0dXJuIC0yOyAvLyAtMiBubyBzdWNoIGdyb3VwCisKKyAgY2F0Y2gocm0oTkVXU1BBVEgrZ3JvdXBsaXN0W25hbWUsR19TQVZFRklMRV0rIi5vIik7cHVibGlzaCk7CisgIG1fZGVsZXRlKGdyb3VwbGlzdCxuYW1lKTsKKworICBzYXZlX2dyb3VwX2xpc3QoKTsKKworICByZXR1cm4gMTsKK30KKworaW50IFNldEdyb3VwKHN0cmluZyBuYW1lLGludCBkbGV2ZWwsaW50ICAgICAgICB3bGV2ZWwsaW50IHJsZXZlbCxpbnQgbWF4bWVzc2FnZXMsaW50IGV4cGlyZSkKK3sKKyAgbWl4ZWQgKmdyb3VwOworICAKKyAgaWYgKCFtZW1iZXIoZ3JvdXBsaXN0LG5hbWUpKSByZXR1cm4gLTI7CisgIGlmIChncm91cGxpc3RbbmFtZSxHX09XTkVSXSE9dXNlcl9ldWlkKCkgJiYKKyAgICAgICghc2VjdXJpdHkobmFtZSkgfHwgcHJvY2Vzc19jYWxsKCkpKSByZXR1cm4gLTE7CisgIAorICBncm91cGxpc3RbbmFtZSxHX0RMRVZFTF09ZGxldmVsOworICBncm91cGxpc3RbbmFtZSxHX1dMRVZFTF09d2xldmVsOworICBncm91cGxpc3RbbmFtZSxHX1JMRVZFTF09cmxldmVsOworICBncm91cGxpc3RbbmFtZSxHX01BWF9NU0ddPW1heG1lc3NhZ2VzOworICBncm91cGxpc3RbbmFtZSxHX0VYUElSRV09ZXhwaXJlOworICAKKyAgc2F2ZV9ncm91cF9saXN0KCk7CisgIHJldHVybiAxOworfQorCitpbnQgQWRkQWxsb3dlZChzdHJpbmcgbmFtZSxtaXhlZCBkZWxldGVycyxtaXhlZCB3cml0ZXJzLG1peGVkIHJlYWRlcnMpCit7CisgIG1peGVkICpncm91cDsKKworICBpZiAoIW1lbWJlcihncm91cGxpc3QsbmFtZSkpIHJldHVybiAtMjsKKworICBpZiAoIGdyb3VwbGlzdFtuYW1lLEdfT1dORVJdIT11c2VyX2V1aWQoKSAmJgorICAgICAgICghc2VjdXJpdHkobmFtZSkgfHwgcHJvY2Vzc19jYWxsKCkpICYmIHVzZXJfZXVpZCgpICE9IFJPT1RJRCApCisgICAgICByZXR1cm4gLTE7CisKKyAgaWYgKHN0cmluZ3AoZGVsZXRlcnMpKSBkZWxldGVycz0oe2RlbGV0ZXJzfSk7CisgIGlmIChzdHJpbmdwKHdyaXRlcnMpKSB3cml0ZXJzPSh7d3JpdGVyc30pOworICBpZiAoc3RyaW5ncChyZWFkZXJzKSkgcmVhZGVycz0oe3JlYWRlcnN9KTsKKworICBpZiAoIWRlbGV0ZXJzKSBkZWxldGVycz0oe30pOworICBpZiAoIXdyaXRlcnMpIHdyaXRlcnM9KHt9KTsKKyAgaWYgKCFyZWFkZXJzKSByZWFkZXJzPSh7fSk7CisKKyAgZ3JvdXBsaXN0W25hbWUsR19ERUxFVEVSU10rPWRlbGV0ZXJzOworICBncm91cGxpc3RbbmFtZSxHX1dSSVRFUlNdKz13cml0ZXJzOworICBncm91cGxpc3RbbmFtZSxHX1JFQURFUlNdKz1yZWFkZXJzOworICAgICAgICAKKyAgc2F2ZV9ncm91cF9saXN0KCk7CisgIHJldHVybiAxOworfQorCitpbnQgUmVtb3ZlQWxsb3dlZChzdHJpbmcgbmFtZSxtaXhlZCBkZWxldGVycyxtaXhlZCB3cml0ZXJzLG1peGVkIHJlYWRlcnMpCit7CisgIG1peGVkICpncm91cDsKKworICBpZiAoIW1lbWJlcihncm91cGxpc3QsbmFtZSkpIHJldHVybiAtMjsKKworICBpZiAoZ3JvdXBsaXN0W25hbWUsR19PV05FUl0hPXVzZXJfZXVpZCgpICYmCisgICAgICAoIXNlY3VyaXR5KG5hbWUpIHx8IHByb2Nlc3NfY2FsbCgpKSAmJiB1c2VyX2V1aWQoKSAhPSBST09USUQgKQorICAgICAgcmV0dXJuIC0xOworCisgIGlmIChzdHJpbmdwKGRlbGV0ZXJzKSkgZGVsZXRlcnM9KHtkZWxldGVyc30pOworICBpZiAoc3RyaW5ncCh3cml0ZXJzKSkgd3JpdGVycz0oe3dyaXRlcnN9KTsKKyAgaWYgKHN0cmluZ3AocmVhZGVycykpIHJlYWRlcnM9KHtyZWFkZXJzfSk7CisKKyAgaWYgKCFkZWxldGVycykgZGVsZXRlcnM9KHt9KTsKKyAgaWYgKCF3cml0ZXJzKSB3cml0ZXJzPSh7fSk7CisgIGlmICghcmVhZGVycykgcmVhZGVycz0oe30pOworCisgIGdyb3VwbGlzdFtuYW1lLEdfREVMRVRFUlNdLT1kZWxldGVyczsKKyAgZ3JvdXBsaXN0W25hbWUsR19XUklURVJTXS09d3JpdGVyczsKKyAgZ3JvdXBsaXN0W25hbWUsR19SRUFERVJTXS09cmVhZGVyczsKKworICBzYXZlX2dyb3VwX2xpc3QoKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJpbmcgdXNlcl9ldWlkKCkKK3sKKyAgaWYgKHByZXZpb3VzX29iamVjdCgpKSB7CisgICAgIGlmIChnZXRldWlkKHByZXZpb3VzX29iamVjdCgpKT09Uk9PVElEKSAgICAgICByZXR1cm4gUk9PVElEOworICAgICBpZiAoZ2V0ZXVpZChwcmV2aW91c19vYmplY3QoKSk9PSJwLmRhZW1vbiIpICAgcmV0dXJuICJwLmRhZW1vbiI7CisgICAgIGlmIChsb2FkX25hbWUocHJldmlvdXNfb2JqZWN0KCkpPT0iL29iai9tcGEiKSByZXR1cm4gZ2V0ZXVpZChSUEwpOworICB9CisgIHJldHVybiBzZWN1cmVfZXVpZCgpOworfQorCisjZGVmaW5lIEZfREVMRVRFICAgIDAKKyNkZWZpbmUgRl9SRUFEICAgICAgMQorI2RlZmluZSBGX1dSSVRFICAgICAyCisjZGVmaW5lIEZfQURNSU4gICAgIDMKKyNkZWZpbmUgRl9LRUVQTkFNRSAgNAorCitwcml2YXRlIGludCBzZWN1cml0eSggc3RyaW5nIG5hbWUgKQoreworICAgIGlmICggZ3JvdXBsaXN0W25hbWUsR19ETEVWRUxdID49IEFSQ0hfTFZMCisgICAgICAgICB8fCBncm91cGxpc3RbbmFtZSxHX1dMRVZFTF0gPj0gQVJDSF9MVkwKKyAgICAgICAgIHx8IGdyb3VwbGlzdFtuYW1lLEdfUkxFVkVMXSA+PSBBUkNIX0xWTCApCisgICAgICAgIHJldHVybiBBUkNIX1NFQ1VSSVRZOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIEVMREVSX1NFQ1VSSVRZOworfQorCitzdGF0aWMgaW50IGFsbG93ZWQoc3RyaW5nIG5hbWUsIGludCBtb2RlKQoreworICBzdHJpbmcgZXVpZDsKKyAgbWl4ZWQgZ19sZXZlbCwgZ19tb2RlOworICAKKyAgaWYgKHByb2Nlc3NfY2FsbCgpKSByZXR1cm4gMDsKKworICBldWlkPXVzZXJfZXVpZCgpOworCisgIGlmIChldWlkPT1ST09USUQpIHJldHVybiAxOworCisgIHN3aXRjaChtb2RlKSB7CisgICAgY2FzZSBGX0tFRVBOQU1FOiByZXR1cm4gKGV1aWQ9PSJwLmRhZW1vbiIpOworICAgIGNhc2UgRl9XUklURTogICAgaWYgKGV1aWQ9PSJwLmRhZW1vbiIpIHJldHVybiAxOworICAgICAgICAgICAgICAgICAgICAgZ19sZXZlbD1HX1dMRVZFTDsgZ19tb2RlPUdfV1JJVEVSUzsgIGJyZWFrOworICAgIGNhc2UgRl9BRE1JTjogICAgaWYgKCEoc2VjdXJpdHkobmFtZSl8fGdyb3VwbGlzdFtuYW1lLEdfT1dORVJdPT1ldWlkKSkgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgICAgICAgZ19sZXZlbD1HX0RMRVZFTDsgZ19tb2RlPUdfREVMRVRFUlM7IGJyZWFrOworICAgIGNhc2UgRl9ERUxFVEU6ICAgaWYgKGV1aWQ9PSJwLmRhZW1vbiIpIHJldHVybiAxOworICAgICAgICAgICAgICAgICAgICAgZ19sZXZlbD1HX0RMRVZFTDsgZ19tb2RlPUdfREVMRVRFUlM7IGJyZWFrOworICAgIGNhc2UgRl9SRUFEOiAgICAgZ19sZXZlbD1HX1JMRVZFTDsgZ19tb2RlPUdfUkVBREVSUzsgIGJyZWFrOworICAgIGRlZmF1bHQ6ICAgICAgICAgcmV0dXJuIDA7CisgIH0KKworICBpZiAoZ3JvdXBsaXN0W25hbWUsR19PV05FUl0gIT0gZXVpZCAmJiAhQVJDSF9TRUNVUklUWSAmJgorICAgICAgZ3JvdXBsaXN0W25hbWUsZ19sZXZlbF0gPiBxdWVyeV93aXpfbGV2ZWwoZXVpZCkgJiYKKyAgICAgIG1lbWJlcihncm91cGxpc3RbbmFtZSwgZ19tb2RlXSwgZXVpZCk9PS0xKQorICAgIHJldHVybiAwOyAvLyBObyBzdWNoIGdyb3VwIGZvciB0aGUgcmVxdWVzdG9yIDopCisgIHJldHVybiAxOworfQorCitpbnQgV3JpdGVOb3RlKG1peGVkIG1lc3NhZ2UsbWl4ZWQga2VlcG5hbWUpCit7CisgIG1peGVkICpncm91cDsKKyAgaW50IHVpZG9rLHRtcDsKKyAgc3RyaW5nIG5hbWU7CisKKyAgaWYgKCFwb2ludGVycChtZXNzYWdlKSB8fCBzaXplb2YobWVzc2FnZSkhPTYpIHJldHVybiAwOworCisgIGlmICghcG9pbnRlcnAoZ3JvdXA9bG9hZF9ncm91cChuYW1lPW1lc3NhZ2VbTV9CT0FSRF0pKSkgcmV0dXJuIC0yOworCisgIGlmICghYWxsb3dlZChuYW1lLCBGX1dSSVRFKSkgcmV0dXJuIC0xOworCisgIGlmIChzaXplb2YoZ3JvdXApPj1ncm91cGxpc3RbbmFtZSxHX01BWF9NU0ddKSByZXR1cm4gLTM7CisKKyAgaWYgKCFrZWVwbmFtZSB8fCAhYWxsb3dlZChuYW1lLCBGX0tFRVBOQU1FKSkKKyAgICAgbWVzc2FnZVtNX1dSSVRFUl09Y2FwaXRhbGl6ZShnZXRldWlkKHRoaXNfaW50ZXJhY3RpdmUoKXx8cHJldmlvdXNfb2JqZWN0KCkpKTsKKworICBpZiAobGFzdHRpbWU+PXRpbWUoKSkgbGFzdHRpbWUrKzsKKyAgICBlbHNlIGxhc3R0aW1lPXRpbWUoKTsKKyAgbWVzc2FnZVtNX1RJTUVdPWxhc3R0aW1lOworICBtZXNzYWdlW01fSURdPU1VRE5BTUUrIjoiK2xhc3R0aW1lOworICBncm91cCs9KHttZXNzYWdlfSk7CisgIGdyb3VwbGlzdFtuYW1lLFdUSU1FXT1sYXN0dGltZTsKKyAgc2F2ZV9ncm91cChuYW1lLGdyb3VwKTsKKyAgc2F2ZV9ncm91cF9saXN0KCk7CisgIHJldHVybiAxOworfQorCitpbnQgUmVtb3ZlTm90ZShzdHJpbmcgbmFtZSwgaW50IG5vdGUpCit7CisgIGludCBudW07CisgIG1peGVkICpncm91cDsKKworICBpZiAoKG5vdGU8MCkgJiYgKG5hbWU9PSJkd25ld3MiKSkKKyAgeworICAgIGdyb3VwPSh7fSk7CisgICAgZ3JvdXBsaXN0W25hbWUsV1RJTUVdPTA7CisgICAgc2F2ZV9ncm91cChuYW1lLGdyb3VwKTsKKyAgICBzYXZlX2dyb3VwX2xpc3QoKTsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIGlmIChub3RlPDApIHJldHVybiAwOworCisgIGlmICghcG9pbnRlcnAoZ3JvdXA9bG9hZF9ncm91cChuYW1lKSkpIHJldHVybiAtMjsKKworICBpbnQgY291bnQ9c2l6ZW9mKGdyb3VwKTsKKyAgaWYgKGNvdW50PD1ub3RlKQorICAgIHJldHVybiAtMzsKKworICBpZiAoIWFsbG93ZWQobmFtZSwgRl9ERUxFVEUpICYmCisgICAgICBsb3dlcl9jYXNlKGdyb3VwW25vdGVdW01fV1JJVEVSXSkhPXVzZXJfZXVpZCgpKSByZXR1cm4gLTE7CisKKyAgaWYgKGNvdW50PT0xKQorICAgIGdyb3VwPSh7fSk7CisgIGVsc2UgaWYgKCFub3RlKQorICAgIGdyb3VwID0gZ3JvdXBbMS4uXTsKKyAgZWxzZSBpZiAobm90ZSA9PSBjb3VudC0xKQorICAgIGdyb3VwID0gZ3JvdXBbMC4uPDJdOworICBlbHNlCisgICAgZ3JvdXA9Z3JvdXBbMC4ubm90ZS0xXStncm91cFtub3RlKzEuLl07CisgIAorICBpZiAoc2l6ZW9mKGdyb3VwKSkKKyAgICBncm91cGxpc3RbbmFtZSxXVElNRV09Z3JvdXBbPDFdW01fVElNRV07CisgIGVsc2UKKyAgICBncm91cGxpc3RbbmFtZSxXVElNRV09MDsKKyAgc2F2ZV9ncm91cChuYW1lLGdyb3VwKTsKKyAgc2F2ZV9ncm91cF9saXN0KCk7CisgIHJldHVybiAxOworfQorCittaXhlZCBHZXROb3RlcyhzdHJpbmcgbmFtZSkKK3sKKyAgbWl4ZWQgKmdyb3VwOworICAKKyAgaWYgKCFwb2ludGVycChncm91cD1sb2FkX2dyb3VwKG5hbWUpKSkgcmV0dXJuIC0yOworICBpZiAoIWFsbG93ZWQobmFtZSwgRl9SRUFEKSkgcmV0dXJuIC0yOworICByZXR1cm4oZGVlcF9jb3B5KGdyb3VwKSk7IC8vIENPUFkgaXQKK30KKworc3RhdGljIHZvaWQgZHVtcF9maWxlKHN0cmluZyBmaWxlbmFtZSxtaXhlZCBuZXdzKQoreworICBpbnQgaTsKKyAgCisgIGZvciAoaT0wO2k8c2l6ZW9mKG5ld3MpO2krKykKKyAgICB3cml0ZV9maWxlKGZpbGVuYW1lLG5ld3NbaV1bTV9USVRMRV0rIiAoIituZXdzW2ldW01fV1JJVEVSXSsiLCAiKworICAgICAgICAgICAgICAgZHRpbWUobmV3c1tpXVtNX1RJTUVdKVs1Li4yNl0rIik6XG4iKworICAgICAgICAgICAgICAgbmV3c1tpXVtNX01FU1NBR0VdKyJcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblxuXG4iKTsKK30KKworcHJvdGVjdGVkIHZhcmFyZ3Mgdm9pZCBleHBpcmUoc3RyaW5nIGdycCxpbnQgZXRpbWUpCisvLyBldGltZSBpc3QgYW5mYW5ncyBpbiBUYWdlbiB1bmQgYmV6ZWljaG5ldCBkYXMgbWF4LiBBbHRlciwgd2FzIEFydGlrZWwgaW4KKy8vIGRlciBHcnVwcGUgaGFiZW4gZHVlcmZlbi4KK3sKKyAgbWl4ZWQgKmdyb3VwOworCisgIGlmICghcG9pbnRlcnAoZ3JvdXA9bG9hZF9ncm91cChncnApKSkgcmV0dXJuOworICBpZiAoZXRpbWUpCisgIHsKKyAgICBpZiAoZXRpbWU+MCkKKyAgICAgIGV0aW1lPWV0aW1lKjYwKjYwKjI0OworICB9CisgIGVsc2UKKyAgICBldGltZT1ncm91cGxpc3RbZ3JwLEdfRVhQSVJFXTsgCisgIGlmIChldGltZTw9MCkKKyAgICByZXR1cm47CisKKyAgaW50IHRvX2V4cGlyZT10aW1lKCktZXRpbWU7CisgIGludCBzaXplPXNpemVvZihncm91cCk7CisgIGlmICghc2l6ZSkgcmV0dXJuOworCisgIGludCBmaXJzdF90b19rZWVwID0gc2l6ZTsgIC8vIGphLCBpc3Qgbm9jaCBlaW5zIHp1IGhvY2gKKyAgLy8gc29sYW5nZSBydW50ZXJsYXVmZW4gYmlzIG1hbiBlaW4gZWxlbWVudCBmaW5kZXQsIHdlbGNoZXMgZ2Vsb2VzY2h0IHdlcmRlbgorICAvLyBzb2xsLiBmaXJzdF90b19rZWVwIGJsZWlidCBkYW5uIGVpbnMgaG9laGVyIGFscyBkYXMuCisgIHdoaWxlICggZmlyc3RfdG9fa2VlcCAmJiBncm91cFtmaXJzdF90b19rZWVwLTFdW01fVElNRV0+dG9fZXhwaXJlKQorICAgIC0tZmlyc3RfdG9fa2VlcDsKKyAgLy8gZmlyc3RfdG9fa2VlcCBrYW5uIGpldHp0IGF1ZiBlaW5zIGhpbnRlciBkZW0gbGV0enRlbiBFbGVtZW50IHplaWdlbiAoPT0KKyAgLy8gc2l6ZSkuIERhcyB3aXJkIHVudGVuIGJlcnVlY2tzaWNodGlndC4KKworICBpZiAoIWZpcnN0X3RvX2tlZXApIC8vIGFsbGUgYmVoYWx0ZW4/CisgICAgcmV0dXJuOworICAvLyBadSBsb2VzY2hlbmRlIEFydGlrZWwgd2Vnc2NocmVpYmVuLgorICBkdW1wX2ZpbGUoIm5ld3MvT0xELiIrZ3JwLGdyb3VwWzAuLmZpcnN0X3RvX2tlZXAtMV0pOworICAvLyBkYW5uIGxvZXNjaGVuCisgIGlmIChmaXJzdF90b19rZWVwID09IHNpemUpIC8vIGFsbGUgd2Vnd2VyZmVuPworICAgIGdyb3VwPSh7fSk7CisgIGVsc2UKKyAgICBncm91cD1ncm91cFtmaXJzdF90b19rZWVwLi5zaXplLTFdOworICAKKyAgc2F2ZV9ncm91cChncnAsZ3JvdXApOworfQorCit2b2lkIGR1bXBfZ3JvdXAoc3RyaW5nIGdycCkKK3sKKyAgaW50IHRvX2V4cGlyZSxzaXplLGxhc3Q7CisgIG1peGVkICpncm91cDsKKworICBpZiAoIUFSQ0hfU0VDVVJJVFkgfHwgcHJvY2Vzc19jYWxsKCkpIHJldHVybjsKKyAgaWYgKCFwb2ludGVycChncm91cD1sb2FkX2dyb3VwKGdycCkpKSByZXR1cm47CisgIHNpemU9c2l6ZW9mKGdyb3VwKTsKKyAgbGFzdD1zaXplOworICBpZiAoIWxhc3QpIHJldHVybjsKKyAgZHVtcF9maWxlKCJuZXdzL0RVTVAuIitncnAsZ3JvdXBbMC4ubGFzdC0xXSk7Cit9CisKK3Byb3RlY3RlZCB2b2lkIGV4cGlyZV9hbGwoc3RyaW5nICprZXlzKSB7CisgIC8vIG5ldWVuIGNhbGxfb3V0IGZ1ZXIgZGVuIFJlc3Qgc2V0emVuCisgIGlmIChzaXplb2Yoa2V5cykgPiAxKQorICAgIGNhbGxfb3V0KCMnZXhwaXJlX2FsbCwxNSxrZXlzWzEuLl0pOworICAvLyB1bmQgZXJzdGUgR3J1cHBlIGV4cGlyZW4KKyAgZXhwaXJlKGtleXNbMF0pOworfQorCit2b2lkIHJlc2V0KCkgeworICAvLyBuYWVjaHN0ZXMgRXhwaXJlIHVuZCBkYW1pdCBSZXNldCBpbiBlaW5lbSB0YWcKKyAgc2V0X25leHRfcmVzZXQoODY0MDApOworICAvLyBhbHRlIGNhbGxfb3V0cyBnZ2YuIGVudGZlcm5lbi4KKyAgd2hpbGUocmVtb3ZlX2NhbGxfb3V0KCMnZXhwaXJlX2FsbCk+PTApOworICAvLyBncnVwcGVubGlzdGUgaG9sZW4gdW5kIGNhbGxvdXQgYXVmIGV4cGlyZV9hbGwgc3RhcnRlbgorICBpZiAoc2l6ZW9mKGdyb3VwbGlzdCkpIHsKKyAgICBjYWxsX291dCgjJ2V4cGlyZV9hbGwsMTAsbV9pbmRpY2VzKGdyb3VwbGlzdCkpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIHNhdmVfZ3JvdXAoc3RyaW5nIGdycCxtaXhlZCBncm91cCkKK3sKKyAgc2F2ZWxvYWQ9Z3JvdXA7IC8vIERvIE5PVCBzYXZlIHRoZSBhY2Nlc3NlZC1JbmZvCisgIGNhY2hlW2dycF0gPSBncm91cDsKKyAgc2F2ZV9vYmplY3QoTkVXU1BBVEgrZ3JvdXBsaXN0W2dycCxHX1NBVkVGSUxFXSk7CisgIHNhdmVsb2FkPTA7Cit9CisKK3N0YXRpYyB2b2lkIHNhdmVfZ3JvdXBfbGlzdCgpCit7CisgIHNhdmVsb2FkPWdyb3VwbGlzdDsKKyAgc2F2ZV9vYmplY3QoTkVXU1BBVEgrIkdyb3VwTGlzdCIpOworICBzYXZlbG9hZD0wOworfQorCitzdGF0aWMgbWl4ZWQgbG9hZF9ncm91cChzdHJpbmcgbmFtZSkKK3sKKyAgaW50IG51bTsKKyAgbWl4ZWQgKnJldDsKKworICBpZighbWVtYmVyKGdyb3VwbGlzdCxuYW1lKSkgcmV0dXJuIC0xOworCisgIGlmIChtZW1iZXIoY2FjaGUsIG5hbWUpKSB7CisgICAgcmV0ID0gY2FjaGVbbmFtZV07CisgIH0KKyAgZWxzZSB7CisgICAgcmVzdG9yZV9vYmplY3QoTkVXU1BBVEgrZ3JvdXBsaXN0W25hbWUsR19TQVZFRklMRV0pOworICAgIGlmICghcG9pbnRlcnAoc2F2ZWxvYWQpKQorICAgICAgc2F2ZWxvYWQ9KHt9KTsKKyAgICByZXQ9c2F2ZWxvYWQ7CisgICAgY2FjaGVbbmFtZV0gPSBzYXZlbG9hZDsKKyAgICBzYXZlbG9hZD0wOworICB9CisgIHJldHVybiByZXQ7Cit9CisKK21peGVkIEdldEdyb3VwcygpCit7CisgIG1peGVkICpyZXR1cm5saXN0OworICBpbnQgaSxncm91cCxzbGV2ZWw7CisgIHN0cmluZyBzZXVpZDsKKworICByZXR1cm5saXN0PXNvcnRfYXJyYXkobV9pbmRpY2VzKGdyb3VwbGlzdCksIyc+KTsgLy8nKTsKKyAgaWYgKEFSQ0hfU0VDVVJJVFkgJiYgIXByb2Nlc3NfY2FsbCgpKQorICAgIHJldHVybiByZXR1cm5saXN0OworCisgIHNldWlkID0gdXNlcl9ldWlkKCk7CisgIHNsZXZlbCA9IHNlY3VyZV9sZXZlbCgpOworCisgIGZvciAoaT1zaXplb2YocmV0dXJubGlzdCktMTtpPj0wO2ktLSkKKyAgICBpZiAoIShncm91cGxpc3RbcmV0dXJubGlzdFtpXSxHX1JMRVZFTF08PXNsZXZlbCB8fAorICAgICAgICAgIGdyb3VwbGlzdFtyZXR1cm5saXN0W2ldLEdfT1dORVJdPT1zZXVpZCB8fAorICAgICAgICAgIG1lbWJlcihncm91cGxpc3RbcmV0dXJubGlzdFtpXSxHX1JFQURFUlNdLCBzZXVpZCkhPS0xKSkKKyAgICAgIHJldHVybmxpc3Q9cmV0dXJubGlzdFswLi5pLTFdK3JldHVybmxpc3RbaSsxLi5dOworICByZXR1cm4gcmV0dXJubGlzdDsKK30KKworaW50IEFza0FsbG93ZWRXcml0ZShzdHJpbmcgbikKK3sKKyAgbWl4ZWQgKmdyb3VwOworCisgIGlmICghbWVtYmVyKGdyb3VwbGlzdCxuKSkgcmV0dXJuIC0yOworICBpZiAoIXBvaW50ZXJwKGdyb3VwPWxvYWRfZ3JvdXAobikpKSByZXR1cm4gLTI7CisKKyAgaWYgKGdyb3VwbGlzdFtuLEdfT1dORVJdICE9IHVzZXJfZXVpZCgpICYmCisgICAgICAhQVJDSF9TRUNVUklUWSAmJgorICAgICAgZ3JvdXBsaXN0W24sR19XTEVWRUxdPnNlY3VyZV9sZXZlbCgpICYmCisgICAgICBtZW1iZXIoZ3JvdXBsaXN0W24sR19XUklURVJTXSx1c2VyX2V1aWQoKSk9PS0xKQorICAgIHJldHVybiAtMTsKKworICBpZiAoc2l6ZW9mKGdyb3VwKT49Z3JvdXBsaXN0W24sR19NQVhfTVNHXSkgcmV0dXJuIC0zOworICByZXR1cm4gMTsKK30KKworLy8gV2ljaHRpZyAuLi4KKworaW50IHF1ZXJ5X3ByZXZlbnRfc2hhZG93KCkKK3sKKyAgcmV0dXJuIDE7Cit9CisKK21peGVkIEdldE5ld3NUaW1lKHN0cmluZyBib2FyZG5hbWUpCisKK3sKKyAgaW50IGksIGx0aW1lLCBqOworICBtaXhlZCAqa2V5czsKKworICBpZiAoIWJvYXJkbmFtZSkKKyAgeworICAgIGx0aW1lPS0xOworICAgIGZvciAoaT1zaXplb2Yoa2V5cz1tX2luZGljZXMoZ3JvdXBsaXN0KSktMTtpPj0wO2ktLSkKKyAgICAgIGlmIChsdGltZTwoaj1ncm91cGxpc3Rba2V5c1tpXSxXVElNRV0pKSBsdGltZT1qOworICAgIHJldHVybiBsdGltZTsKKyAgfQorICBpZiAoIW1lbWJlcihncm91cGxpc3QsYm9hcmRuYW1lKSkgcmV0dXJuIC0xOworICByZXR1cm4gZ3JvdXBsaXN0W2JvYXJkbmFtZSxXVElNRV07Cit9CisKK21peGVkKiBHZXRHcm91cChzdHJpbmcgbmFtZSkKK3sKKyAgaWYgKHByb2Nlc3NfY2FsbCgpKSByZXR1cm4gMDsKKyAgaWYgKGV4dGVybl9jYWxsKCkgJiYgIWFsbG93ZWQobmFtZSwgRl9BRE1JTikpIHJldHVybiAwOworI2RlZmluZSBnbCh4KSBncm91cGxpc3RbbmFtZSx4XQorICByZXR1cm4gKHtuYW1lLGdsKDEpLGdsKDIpLGdsKDMpLGdsKDQpLGdsKDUpLGdsKDYpLGdsKDcpLGdsKDgpLGdsKDkpLGdsKDEwKSxsb2FkX2dyb3VwKG5hbWUpfSk7Cit9CmRpZmYgLS1naXQgYS9zZWN1cmUvbnBjbWFzdGVyLmMgYi9zZWN1cmUvbnBjbWFzdGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNkOGJkYwotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9ucGNtYXN0ZXIuYwpAQCAtMCwwICsxLDEyNCBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIG5wY21hc3Rlci5jIC0gVmVyd2FsdHVuZyBkZXIgZWluZGV1dGlnZW4gTnVtbWVybnZlcmdhYmUgZnVlciBOUENzIHVuZAorLy8gICAgICAgICAgICAgICBkZXIgU3R1ZmVucHVua3RlLCBkaWUgc2llIGdlYmVuCisvLworLy8gJElkOiBucGNtYXN0ZXIuYyA5MTQyIDIwMTUtMDItMDQgMjI6MTc6MjlaIFplc3N0cmEgJAorLy8KKy8qCisgKiAkTG9nOiBucGNtYXN0ZXIuYyx2ICQKKyAqIFJldmlzaW9uIDEuNiAgMTk5Ni8wOS8xOCAwODo1OTo0OSAgV2FyZ29uCisgKiBHbG9iYWxlIFZhcmlhYmxlbiBwcml2YXRlIGdlbWFjaHQuLi4KKyAqCisgKiBSZXZpc2lvbiAxLjUgIDE5OTYvMDQvMTAgMTc6NDg6MzcgIEpvZgorICogRHVtcC1GdW5rdGlvbiBlaW5nZWJhdXQsIGRhbWl0IG1hbiBhdWNoIHdhcyB6dSBsZXNlbiBoYXQgOikKKyAqICwKKyAqCisgKiBSZXZpc2lvbiAxLjQgIDE5OTYvMDQvMTAgMTQ6MzI6MjQgIFdhcmdvbgorICogUXVlcnlOUEMoKTogaW50ICogLT4gbWl4ZWQKKyAqCisgKiBSZXZpc2lvbiAxLjMgIDE5OTYvMDQvMDQgMTI6MzM6MDYgIFdhcmdvbgorICogUXVlcnlOUENieU51bWJlcigpIGdpYnQgamV0enQgd2lya2xpY2ggTnVtbWVyIHVuZCBTY29yZSB6dXJ1ZWNrLi4uCisgKgorICogUmV2aXNpb24gMS4yICAxOTk2LzAzLzA2IDE0OjM0OjUxICBKb2YKKyAqIFF1ZXJ5TlBDYnlOdW1iZXIgZWluZ2ViYXV0LCBUeXBvcyBnZWZpeGVkCisgKgorICogUmV2aXNpb24gMS4xICAxOTk2LzAzLzA2IDEzOjQ1OjM2ICBKb2YKKyAqIEluaXRpYWwgcmV2aXNpb24KKyAqCisgKi8KKworI2luY2x1ZGUgIi9zZWN1cmUvbnBjbWFzdGVyLmgiCisjaW5jbHVkZSAiL3NlY3VyZS93aXpsZXZlbHMuaCIKKworcHJpdmF0ZSBpbnQgbGFzdE51bTsKK3ByaXZhdGUgbWFwcGluZyBucGNzOworcHJpdmF0ZSBub3NhdmUgbWFwcGluZyBieV9udW07CisKK3ZvaWQgbWFrZV9udW0oc3RyaW5nIGtleSkgeworICBieV9udW0gKz0gKFsgbnBjc1trZXksTlBDX05VTUJFUl0gOiBrZXk7IG5wY3Nba2V5LE5QQ19TQ09SRV0gXSk7Cit9CisKK3ZvaWQgY3JlYXRlKCkKK3sKKyAgc2V0ZXVpZChnZXR1aWQoKSk7CisgIGlmICghcmVzdG9yZV9vYmplY3QoTlBDU0FWRUZJTEUpKQorICB7CisgICAgbGFzdE51bT0wOworICAgIG5wY3M9bV9hbGxvY2F0ZSgwLDIpOworICB9CisgIGJ5X251bSA9IG1fYWxsb2NhdGUoMCwyKTsKKyAgZmlsdGVyX2luZGljZXMobnBjcywgIydtYWtlX251bS8qJyovKTsKK30KKworc3RhdGljIGludCBEdW1wTlBDcygpOworCit2YXJhcmdzIG1peGVkIFF1ZXJ5TlBDKGludCBzY29yZSkKK3sKKyAgc3RyaW5nIGtleSwgdmFsOworICAKKyAgaWYgKCFwcmV2aW91c19vYmplY3QoKSkKKyAgICByZXR1cm4gTlBDX0lOVkFMSURfQVJHOworICBrZXk9b2xkX2V4cGxvZGUob2JqZWN0X25hbWUocHJldmlvdXNfb2JqZWN0KCkpLCIjIilbMF07CisgIGlmICh2YWw9bnBjc1trZXksTlBDX05VTUJFUl0pCisgICAgcmV0dXJuICh7dmFsLG5wY3Nba2V5LE5QQ19TQ09SRV19KTsKKyAgaWYgKHNjb3JlPD0wIHx8IG1lbWJlcihpbmhlcml0X2xpc3QocHJldmlvdXNfb2JqZWN0KCkpLCIvc3RkL2xpdmluZy9saWZlLmMiKSA8IDApCisgICAgcmV0dXJuIE5QQ19JTlZBTElEX0FSRzsKKyAgbnBjc1trZXksTlBDX1NDT1JFXT1zY29yZTsKKyAgbnBjc1trZXksTlBDX05VTUJFUl09KytsYXN0TnVtOworICBieV9udW0gKz0gKFtsYXN0TnVtOmtleTtzY29yZV0pOworICAgc2F2ZV9vYmplY3QoTlBDU0FWRUZJTEUpOworICBjYWxsX291dCgiRHVtcE5QQ3MiLDApOworICByZXR1cm4gKHtsYXN0TnVtLHNjb3JlfSk7Cit9CisKK2ludCBTZXRTY29yZShzdHJpbmcga2V5LGludCBzY29yZSkKK3sKKyAgaWYgKCFJU19BUkNIKHRoaXNfaW50ZXJhY3RpdmUoKSl8fCFJU19BUkNIKGdldGV1aWQocHJldmlvdXNfb2JqZWN0KCkpKSkKKyAgICByZXR1cm4gTlBDX05PX1BFUk1JU1NJT047CisgIGlmICghbnBjc1trZXksTlBDX05VTUJFUl0pCisgICAgcmV0dXJuIE5QQ19JTlZBTElEX0FSRzsKKyAgbnBjc1trZXksTlBDX1NDT1JFXT1zY29yZTsKKyAgYnlfbnVtICs9IChbbnBjc1trZXksTlBDX05VTUJFUl06a2V5O3Njb3JlXSk7CisgIHNhdmVfb2JqZWN0KE5QQ1NBVkVGSUxFKTsKKyAgRHVtcE5QQ3MoKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgRHVtcE5QQ3MoKQoreworICBtaXhlZCAqa2V5czsKKyAgaW50IGksIG1heDsKKworICBrZXlzPW1faW5kaWNlcyhucGNzKTsKKyAgcm0oTlBDRFVNUEZJTEUpOworICBmb3IgKGk9c2l6ZW9mKGtleXMpLTEsIG1heD0wO2k+PTA7aS0tKSB7CisgICAgd3JpdGVfZmlsZShOUENEVU1QRklMRSxzcHJpbnRmKCIlNWQgJTRkICVzXG4iLG5wY3Nba2V5c1tpXSxOUENfTlVNQkVSXSwKKwkgICBucGNzW2tleXNbaV0sTlBDX1NDT1JFXSxrZXlzW2ldKSk7CisgICAgbWF4ICs9IG5wY3Nba2V5c1tpXSxOUENfU0NPUkVdOworICB9IAorICB3cml0ZV9maWxlKE5QQ0RVTVBGSUxFLHNwcmludGYoIj09PT09PT09PT09PT09PT09PT09XG5HZXNhbXQ6ICVkIFB1bmt0ZVxuIixtYXgpKTsgCisgIHJldHVybiAxOworfQorCittaXhlZCAqUXVlcnlOUENieU51bWJlcihpbnQgbnVtKQoreworICBpZiAoYnlfbnVtW251bV0pCisgICAgcmV0dXJuICh7bnVtLGJ5X251bVtudW0sTlBDX1NDT1JFXSxieV9udW1bbnVtLE5QQ19OVU1CRVJdfSk7CisKKyAgcmV0dXJuIDA7Cit9CisKK2ludCBSZWNhbGN1bGF0ZShzdHJpbmcgcykKK3sKKyAgaW50IGksIGo7CisKKyAgaWYgKCFzIHx8ICFzaXplb2YocykpCisgICAgcmV0dXJuIDA7CisKKyAgZm9yIChqPTAsIGk9NipzaXplb2YocyktMTsgaT4wOyBpLS0pIHsKKyAgICBpZiAodGVzdF9iaXQocyxpKSkKKyAgICAgIGorPWJ5X251bVtpLE5QQ19TQ09SRV07CisgIH0KKyAgcmV0dXJuIGo7Cit9CmRpZmYgLS1naXQgYS9zZWN1cmUvbnBjbWFzdGVyLmggYi9zZWN1cmUvbnBjbWFzdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFmN2Y0MQotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9ucGNtYXN0ZXIuaApAQCAtMCwwICsxLDI0IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gRmlsZU5hbWUuYyAtLSBCZXNjaHJlaWJ1bmcKKy8vICRJZDogbnBjbWFzdGVyLmggMjYzNCAyMDA2LTA5LTIzIDA5OjQzOjA3WiByb290ICQKKy8vCisvKgorICogJExvZzogbnBjbWFzdGVyLmgsdiAkCisgKiBSZXZpc2lvbiAxLjEgIDE5OTYvMDMvMDYgMTM6NDU6MTEgIEpvZgorICogSW5pdGlhbCByZXZpc2lvbgorICoKKyAqLworCisjaWZuZGVmIF9OUENNQVNURVJfSF8KKyNkZWZpbmUgX05QQ01BU1RFUl9IXyAxCisKKyNkZWZpbmUgTlBDU0FWRUZJTEUgIi9ldGMvbnBjbWFzdGVyIgorCisjZGVmaW5lIE5QQ19OVU1CRVIJMAorI2RlZmluZSBOUENfU0NPUkUJMQorCisjZGVmaW5lIE5QQ19JTlZBTElEX0FSRyAtMQorI2RlZmluZSBOUENfTk9fUEVSTUlTU0lPTiAtMgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NlY3VyZS9wb3Rpb25tYXN0ZXIuYyBiL3NlY3VyZS9wb3Rpb25tYXN0ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGEwNTY1Ci0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3BvdGlvbm1hc3Rlci5jCkBAIC0wLDAgKzEsNTE1IEBACisjcHJhZ21hIHN0cmljdF90eXBlcworI3ByYWdtYSBub19jbG9uZQorI3ByYWdtYSBub19zaGFkb3cKKyNwcmFnbWEgbm9faW5oZXJpdAorI3ByYWdtYSB2ZXJib3NlX2Vycm9ycworI3ByYWdtYSBjb21iaW5lX3N0cmluZ3MKKyNwcmFnbWEgcnR0X2NoZWNrcworI3ByYWdtYSBwZWRhbnRpYworI3ByYWdtYSB3YXJuX2RlcHJlY2F0ZWQKKworI2luY2x1ZGUgIi9zZWN1cmUvY29uZmlnLmgiCisjaW5jbHVkZSAiL3NlY3VyZS93aXpsZXZlbHMuaCIKKworI2RlZmluZSBNQVhfUk9PTVNfUEVSX0xJU1QgMTAKKworLy8gZGllIGRpdi4gU3BlaWNoZXJvcnRlIHVuZCBQZmFkZQorI2RlZmluZSBTQVZFRklMRSAgICAiL3NlY3VyZS9BUkNIL3BvdGlvbnMiCisjZGVmaW5lIFRJUFMoeCkgICAgICIvc2VjdXJlL0FSQ0gvWlQvIit4CisjZGVmaW5lIE9SQUtFTCAgICAgICIvcm9vbS9vcmFrZWwiCisjZGVmaW5lIFBPVElPTlRPT0wgICIvb2JqL3Rvb2xzL3B0b29sIgorCisvLyBGdWVyIGRpZSBEdW1wLUZ1bmt0aW9uCisjZGVmaW5lIFBPVElPTkRVTVAgIi9zZWN1cmUvQVJDSC9QT1RJT05TLmR1bXAiCisjZGVmaW5lIERVTVAoc3RyKSAgIHdyaXRlX2ZpbGUoUE9USU9ORFVNUCwgc3RyKQorCisvLyBNb2RpZmlrYXRpb25lbiBsb2dnZW4uICJldmVudCIgaXN0IGVpbnMgZGVyIEV2ZW50cyBhdXMgZGVyIExpc3RlOgorLy8gQUREX1BPVElPTiwgQUNUSVZBVEUsIERFQUNUSVZBVEUsIE1PRElGWV9QQVRILCBNT0RJRllfTElTVE5PCisjZGVmaW5lIExPR0ZJTEVfTU9EICAgICAiL2xvZy9BUkNIL1BPVElPTlNfTU9ELmxvZyIKKyNkZWZpbmUgTU9ETE9HKGV2ZW50LG51bSxkYXRhKSB3cml0ZV9maWxlKExPR0ZJTEVfTU9ELCBcCisgIHNwcmludGYoIiUxN3MgJS0xNHMgJS0zZCBzRVVJRCAlcyAlc1xuIiwgXAorICAgIHN0cmZ0aW1lKCIlWS0lYi0lZCAlUiIpLCBldmVudCwgbnVtLCBzZWN1cmVfZXVpZCgpLCBkYXRhKSApCisKKy8vIEluZGl6aWVydW5ncy1Lb25zdGFudGVuIGZ1ZXIgZGFzIHBvdGlvbnMtTWFwcGluZworI2RlZmluZSBQT1RfUk9PTU5BTUUgMAorI2RlZmluZSBQT1RfTElTVE5PICAgMQorCisvLyBLb25zdGFudGVuIGZ1ZXIgZGl2LiBSdWVja2dhYmV3ZXJ0ZS4gS2VpbmUgMCwgZGEgZGFzIGVpbmUgZ3VlbHRpZ2UgWlQtSUQKKy8vIHNlaW4ga2FubiB1bmQgYWJmcmFnZW5kZSBPYmpla3RlIHZlcndpcnJlbiBrb2VubnRlLgorI2RlZmluZSBQT1RfSVNfQUNUSVZFICAgICAgICAgICAgMQorI2RlZmluZSBQT1RfQUNDRVNTX0RFTklFRCAgICAgICAtMQorI2RlZmluZSBQT1RfV1JPTkdfREFUQVRZUEUgICAgICAtMgorI2RlZmluZSBQT1RfTk9fU1VDSF9ST09NICAgICAgICAtMworI2RlZmluZSBQT1RfQUxSRUFEWV9SRUdJU1RFUkVEICAtNAorI2RlZmluZSBQT1RfSU5WQUxJRF9QT1RJT04gICAgICAtNQorI2RlZmluZSBQT1RfTk9fU1VDSF9GSUxFICAgICAgICAtNgorI2RlZmluZSBQT1RfSU5WQUxJRF9MSVNUX05VTUJFUiAtNworI2RlZmluZSBQT1RfQUxSRUFEWV9BQ1RJVkUgICAgICAtOAorI2RlZmluZSBQT1RfQUxSRUFEWV9JTkFDVElWRSAgICAtOQorI2RlZmluZSBQT1RfTk9UX0lOQUNUSVZFICAgICAgIC0xMAorI2RlZmluZSBQT1RfTk9UX0FDVElWRSAgICAgICAgIC0xMQorCisvLyBaYWVobGVyIGZ1ZXIgZGVuIGFscyBuYWVjaHN0ZW4gYW56dWxlZ2VuZGVuIFpUCitwcml2YXRlIGludCBuZXh0cm9vbTsKKworLy8gTGlzdGUgYWxsZXIgWlRzIGVpbnNjaGwuIGluYWt0aXZlLCAoWyBpbnQgbnVtIDogc3RyaW5nIHJvb207IGludCBsaXN0IF0pCitwcml2YXRlIG1hcHBpbmcgcG90aW9ucyA9IChbXSk7CisKKy8vIExpc3RlIGRlciBpbmFrdGl2ZW4gWlRzLCAoeyBpbnQgbnVtIH0pCitwcml2YXRlIGludCAqaW5hY3RpdmUgPSAoe30pOworCisvLyBDYWNoZSBtaXQgZGVuIGVpbnplbG5lbiBMaXN0ZW4sIChbIGludCBsaXN0IDogaW50ICpwb3Rpb25saXN0IF0pCitwcml2YXRlIG5vc2F2ZSBtYXBwaW5nIGxpc3RzOworCisvLyByZXZlcnNlX3RhYmxlIExvb2t1cCBDYWNoZSwgKFtzdHJpbmcgcm9vbTogaW50IG51bWJlcl0pCitwcml2YXRlIG5vc2F2ZSBtYXBwaW5nIHJldmVyc2VfdGFibGUgPSAoW10pOworCisvLyBDYWNoZSBmdWVyIGRpZSBiZXJlaXRzIHZvbiBkZXIgUGxhdHRlIGVpbmdlbGVzZW5lbiBaVHMsIHVtIFBsYXR0ZW56dWdyaWZmZQorLy8gaW5zYmVzb25kZXJlIGJlaW0gRXJ6ZXVnZW4gZGVyIFRpcGxpc3RlIGR1cmNoIGRhcyBPcmFrZWwgenUgcmVkdXppZXJlbi4KK3ByaXZhdGUgbm9zYXZlIG1hcHBpbmcgdGlwbWFwID0gKFtdKTsKKworaW50IEFjdGl2YXRlUm9vbShzdHJpbmcgcm9vbSk7CisKK3ByaXZhdGUgaW50IHNlY3VyZSgpIHsKKyAgcmV0dXJuICghcHJvY2Vzc19jYWxsKCkgJiYgQVJDSF9TRUNVUklUWSk7Cit9CisKK21peGVkIFF1ZXJ5UG90aW9uRGF0YShpbnQgbnVtKSB7CisgIGlmICggIXNlY3VyZSgpICkKKyAgICByZXR1cm4gUE9UX0FDQ0VTU19ERU5JRUQ7CisgIHJldHVybiAoW251bSA6IHBvdGlvbnNbbnVtLDBdOyBwb3Rpb25zW251bSwxXSBdKTsKK30KKworaW50ICpRdWVyeUluYWN0aXZlUG90aW9ucygpIHsKKyAgcmV0dXJuIGNvcHkoaW5hY3RpdmUpOworfQorCitwcml2YXRlIHZvaWQgUmVidWlsZENhY2hlKCkgeworICAvLyBDYWNoZSBpbnZhbGlkaWVyZW47IHZvci1pbml0aWFsaXNpZXJ0IHp1ciBCZXNjaGxldW5pZ3VuZyBkZXMgUmVidWlsZHMuCisgIGxpc3RzID0gKFswOih7fSksMTooe30pLDI6KHt9KSwzOih7fSksNDooe30pLDU6KHt9KSw2Oih7fSksNzooe30pXSk7CisgIGZvcmVhY2ggKGludCBudW0sIHN0cmluZyByb29tLCBpbnQgbGlzdCA6IHBvdGlvbnMpIHsKKyAgICByZXZlcnNlX3RhYmxlICs9IChbcm9vbTpudW1dKTsKKyAgICBsaXN0c1tsaXN0XSArPSAoe251bX0pOworICB9CisgIHJldHVybjsKK30KKworaW50IFF1ZXJ5QWN0aXZlKG1peGVkIHBvdGlvbikgeworICBpZiAoIGV4dGVybl9jYWxsKCkgJiYgIXNlY3VyZSgpICkKKyAgICByZXR1cm4gUE9UX0FDQ0VTU19ERU5JRUQ7CisgIGludCByZXQ7CisgIC8vIFdlbm4gbmFjaCBkZW0gUGZhZCBkZXMgWlRzIGdlZnJhZ3Qgd2lyZCwgZGllc2VuIHp1ZXJzdCBpbiBkaWUgTnVtbWVyCisgIC8vIHVtd2FuZGVsbiBkdXJjaCBMb29rdXAgaW0gcmV2ZXJzZV90YWJsZSBDYWNoZQorICBpZiAoIHN0cmluZ3AocG90aW9uKSApIHsKKyAgICBwb3Rpb24gPSByZXZlcnNlX3RhYmxlW3BvdGlvbl07CisgIH0KKyAgLy8gRWluIFpUIGlzdCBha3Rpdiwgd2VubiBlciBpbiBkZXIgTGlzdGUgcG90aW9ucyBzdGVodCB1bmQgbmljaHQgaW4gZGVyCisgIC8vIExpc3RlIGRlciBpbmFrdGl2ZW4gWlRzIChpbmFjdGl2ZSkgc3RlaHQuIERhbm4gZGVzc2VuIE51bW1lcgorICAvLyB6dXJ1ZWNrZ2ViZW47IGluYWt0aXZlIHp1ZXJzdCBwcnVlZmVuLCB3ZWlsIGRpZSBpbmFrdGl2ZW4gYXVjaCBpbiAKKyAgLy8gInBvdGlvbnMiIGVudGhhbHRlbiBzaW5kIHVuZCBzb21pdCBhbGxlIFpUcyBhdXNzZXIgZGVuIHVuZ3VlbHRpZ2VuCisgIC8vIGFscyBha3RpdiBnZW1lbGRldCB3dWVyZGVuLgorICBpZiAoIG1lbWJlcihpbmFjdGl2ZSxwb3Rpb24pPi0xICkKKyAgICByZXQgPSBQT1RfTk9UX0FDVElWRTsKKyAgZWxzZSBpZiAoIG1lbWJlcihwb3Rpb25zLHBvdGlvbikgJiYgcG90aW9uc1twb3Rpb24sUE9UX0xJU1ROT10hPS0xICkKKyAgICByZXQgPSBwb3Rpb247CisgIC8vIGFuc29uc3RlbiBpc3QgZGFzIGtlaW4gZ3VlbHRpZ2VyIFpUCisgIGVsc2UKKyAgICByZXQgPSBQT1RfSU5WQUxJRF9QT1RJT047CisgIHJldHVybiByZXQ7Cit9CisKK3ByaXZhdGUgdm9pZCBzYXZlX2luZm8oKSB7CisgIHNhdmVfb2JqZWN0KFNBVkVGSUxFKTsKK30KKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkgeworICBzZXRldWlkKGdldHVpZCh0aGlzX29iamVjdCgpKSk7CisgIGlmICggIXJlc3RvcmVfb2JqZWN0KFNBVkVGSUxFKSApIHsKKyAgICAvLyBGZWhsZXIgYXVzZ2ViZW4sIGRhbWl0IGVzIGplbWFuZCBtZXJrdC4gRGVubm9jaCB3aXJkIGpldHp0IGltIEFuc2NobHVzcworICAgIC8vIGRlciBDYWNoZSBuZXUgYXVmZ2ViYXV0IChkYW1pdCBkaWUgRGF0ZW5zdHJ1a3R1cmVuIGd1ZWx0aWcgc2luZCkuCisgICAgY2F0Y2gocmFpc2VfZXJyb3IoIlBvdGlvbm1hc3Rlcjogbm8vY29ycnVwdCBzYXZlZmlsZSEgUmVpbml0aWFsaXppbmcuXG4iKTsgcHVibGlzaCk7CisgIH0KKyAgUmVidWlsZENhY2hlKCk7Cit9CisKK2ludCBBZGRQb3Rpb25Sb29tKHN0cmluZyByb29tLCBpbnQgbGlzdCkgeworICBpZiAoICFzZWN1cmUoKSApCisgICAgcmV0dXJuIFBPVF9BQ0NFU1NfREVOSUVEOworICAvLyBOZXVlciBSYXVtIG11c3MgZWluIGd1ZWx0aWdlciBTdHJpbmcgc2Vpbi4KKyAgaWYgKCAhc3RyaW5ncChyb29tKSApCisgICAgcmV0dXJuIFBPVF9XUk9OR19EQVRBVFlQRTsKKyAgaWYgKCAhaW50cChsaXN0KSB8fCBsaXN0PDAgfHwgbGlzdD43ICkKKyAgICByZXR1cm4gUE9UX1dST05HX0RBVEFUWVBFOworCisgIC8vIFBmYWQgbWl0IEhpbGZlIGRlcyBNYXN0ZXJzIHZlcnZvbGxzdGFlbmRpZ2VuICgrLCB+IGV0Yy4gZXJzZXR6ZW4pCisgIHJvb209KHN0cmluZyltYXN0ZXIoKS0+X2dldF9wYXRoKHJvb20sMCk7CisKKyAgLy8gRGF0ZWkgbWl0IGRlbSBaVC1TcHJ1Y2ggbXVzcyBleGlzdGllcmVuLgorICBpZiAoIGZpbGVfc2l6ZSggVElQUyh0b19zdHJpbmcobmV4dHJvb20pKyIuenQiKSApIDwgMCApIHsKKyAgICByYWlzZV9lcnJvcigiUG90aW9ubWFzdGVyOiBUaXBmaWxlIG1pc3NpbmcsIHBsZWFzZSBjcmVhdGUgIisKKyAgICAgIHRvX3N0cmluZyhuZXh0cm9vbSkrIi56dCIpOworICAgIHJldHVybiBQT1RfTk9fU1VDSF9GSUxFOworICB9CisgIC8vIE5ldWVyIFJhdW0gZGFyZiBub2NoIG5pY2h0IGluIGRlciBMaXN0ZSBlbnRoYWx0ZW4gc2Vpbi4KKyAgaWYgKCBtZW1iZXIobV92YWx1ZXMocG90aW9ucyxQT1RfUk9PTU5BTUUpLCByb29tKSE9LTEpCisgICAgcmV0dXJuIFBPVF9BTFJFQURZX1JFR0lTVEVSRUQ7CisgIC8vIE5ldWVyIFJhdW0gbXVzcyBsYWRiYXIgc2Vpbi4KKyAgaWYgKCBjYXRjaChsb2FkX29iamVjdChyb29tKTsgcHVibGlzaCkgKQorICAgIHJldHVybiBQT1RfTk9fU1VDSF9ST09NOworCisgIC8vIEpldHp0IGthbm4ncyBlbmRsaWNoIGxvc2dlaGVuLCBSYXVtIGVpbnRyYWdlbiwgbmV4dHJvb20gaG9jaHphZWhsZW4KKyAgcG90aW9ucyArPSAoW25leHRyb29tIDogcm9vbTsgbGlzdF0pOworICBNT0RMT0coIkFERF9QT1RJT04iLCBuZXh0cm9vbSwgcm9vbSk7CisgIC8vIE5ldSBlaW5nZXRyYWdlbmUgWlRzIHdlcmRlbiBhdWNoIGdsZWljaCBha3RpdmllcnQ7IEFjdGl2YXRlUm9vbSgpCisgIC8vIGJhdXQgZGVuIENhY2hlIHNlbGJzdCBuZXUgYXVmLCBkYWhlciBrYW5uIGRhcyBoaWVyIGVudGZhbGxlbi4KKyAgQWN0aXZhdGVSb29tKHJvb20pOworICBuZXh0cm9vbSsrOworICBzYXZlX2luZm8oKTsKKyAgcmV0dXJuIG5leHRyb29tOworfQorCitpbnQgQ2hhbmdlUm9vbVBhdGgoc3RyaW5nIG9sZCwgc3RyaW5nIG5ldykgeworICBpZiAoICFzZWN1cmUoKSApCisgICAgcmV0dXJuIFBPVF9BQ0NFU1NfREVOSUVEOworCisgIC8vIGJlaWRlIFBmYWRlIG11ZXNzZW4gZ3VlbHRpZ2UgU3RyaW5ncyBzZWluCisgIGlmICggIXN0cmluZ3Aob2xkKSB8fCAhc3RyaW5ncChuZXcpICkKKyAgICByZXR1cm4gUE9UX1dST05HX0RBVEFUWVBFOworCisgIC8vIFBmYWQgbWl0IEhpbGZlIGRlcyBNYXN0ZXJzIHZlcnZvbGxzdGFlbmRpZ2VuICgrLCB+IGV0Yy4gZXJzZXR6ZW4pCisgIG9sZD0oc3RyaW5nKW1hc3RlcigpLT5fZ2V0X3BhdGgob2xkLDApOworICBuZXc9KHN0cmluZyltYXN0ZXIoKS0+X2dldF9wYXRoKG5ldywwKTsKKworICAvLyBEZXIgbmV1ZSBSYXVtIGRhcmYgbmljaHQgYmVyZWl0cyBlaW5nZXRyYWdlbiBzZWluLCAuLi4KKyAgaWYgKCBtZW1iZXIocmV2ZXJzZV90YWJsZSxuZXcpICkKKyAgICByZXR1cm4gUE9UX0FMUkVBRFlfUkVHSVNURVJFRDsKKyAgLy8gLi4uIHVuZCBkZXIgYWx0ZSBSYXVtIG11c3Mgbm9jaCBlaW5nZXRyYWdlbiBzZWluLgorICBpZiAoICFtZW1iZXIocmV2ZXJzZV90YWJsZSxvbGQpICkKKyAgICByZXR1cm4gUE9UX05PX1NVQ0hfUk9PTTsKKyAgLy8gTmV1ZXIgUmF1bSBtdXNzIGxhZGJhciBzZWluLgorICBpZiAoY2F0Y2gobG9hZF9vYmplY3QobmV3KTtwdWJsaXNoKSkKKyAgICByZXR1cm4gUE9UX05PX1NVQ0hfUk9PTTsKKworICAvLyBBa3R1ZWxsZSBaVC1OdW1tZXIgZGVzIGFsdGVuIFBmYWRlcyBlcm1pdHRlbG4KKyAgaW50IG51bSA9IHJldmVyc2VfdGFibGVbb2xkXTsKKyAgLy8gUGZhZCBhZW5kZXJuLCBDYWNoZSBuZXViYXVlbiB1bmQgU2F2ZWZpbGUgc3BlaWNoZXJuCisgIHBvdGlvbnNbbnVtLFBPVF9ST09NTkFNRV0gPSBuZXc7CisgIFJlYnVpbGRDYWNoZSgpOworICBzYXZlX2luZm8oKTsKKyAgTU9ETE9HKCJNT0RJRllfUEFUSCIsIG51bSwgb2xkKyIgPT4gIituZXcpOworICByZXR1cm4gbnVtOworfQorCitpbnQgQWN0aXZhdGVSb29tKHN0cmluZyByb29tKSB7CisgIGlmICggIXNlY3VyZSgpICkKKyAgICByZXR1cm4gUE9UX0FDQ0VTU19ERU5JRUQ7CisgIC8vIEFrdHVlbGxlIFpULU51bW1lciBlcm1pdHRlbG4uIEV0d2FzIHVtc3RhZW5kbGljaCwgZGEgaW0gRmVobGVyZmFsbCAtMQorICAvLyBiZW5vZXRpZ3Qgd2lyZC4KKyAgaW50IG51bSA9IG1lbWJlcihyZXZlcnNlX3RhYmxlLHJvb20pID8gcmV2ZXJzZV90YWJsZVtyb29tXSA6IC0xOworICAvLyBOdW1tZXIgbXVzcyBleGlzdGllcmVuCisgIGlmICggbnVtID09IC0xICkKKyAgICByZXR1cm4gUE9UX0lOVkFMSURfUE9USU9OOworICAvLyBaVCBpc3QgbmljaHQgaW5ha3RpdiwgZGFubiBrYW5uIG1hbiBpaG4gYXVjaCBuaWNodCBha3RpdmllcmVuLgorICBpZiAoIG1lbWJlcihpbmFjdGl2ZSwgbnVtKT09LTEgKQorICAgIHJldHVybiBQT1RfQUxSRUFEWV9BQ1RJVkU7CisgIGluYWN0aXZlIC09ICh7bnVtfSk7CisgIFJlYnVpbGRDYWNoZSgpOworICBzYXZlX2luZm8oKTsKKyAgTU9ETE9HKCJBQ1RJVkFURSIsIG51bSwgcm9vbSk7CisgIHJldHVybiBudW07Cit9CisKK2ludCBTZXRMaXN0TnIoc3RyaW5nIHJvb20sIGludCBsaXN0KSB7CisgIGlmICggIXNlY3VyZSgpICkKKyAgICByZXR1cm4gUE9UX0FDQ0VTU19ERU5JRUQ7CisgIC8vIEFrdHVlbGxlIFpULU51bW1lciBlcm1pdHRlbG4uIEV0d2EgdW1zdGFlbmRsaWNoLCBkYSBpbSBGZWhsZXJmYWxsIC0xCisgIC8vIGJlbm9ldGlndCB3aXJkLgorICBpbnQgbnVtID0gbWVtYmVyKHJldmVyc2VfdGFibGUscm9vbSkgPyByZXZlcnNlX3RhYmxlW3Jvb21dIDogLTE7CisgIC8vIE51bW1lciBtdXNzIGV4aXN0aWVyZW4KKyAgaWYgKCBudW0gPT0gLTEgKQorICAgIHJldHVybiBQT1RfSU5WQUxJRF9QT1RJT047CisgIC8vIExpc3Rlbm51bW1lciBtdXNzIHp3aXNjaGVuIDAgdW5kIDcgbGllZ2VuLgorICBpZiAoIGxpc3QgPCAwIHx8IGxpc3QgPiA3ICkKKyAgICByZXR1cm4gUE9UX0lOVkFMSURfTElTVF9OVU1CRVI7CisKKyAgLy8gYWx0ZSBOdW1tZXIgYXVmc2NocmVpYmVuIHp1bSBMb2dnZW4uCisgIGludCBvbGRsaXN0ID0gcG90aW9uc1tudW0sUE9UX0xJU1ROT107CisgIC8vIExpc3Rlbm51bW1lciBpbiBkZXIgWlQtTGlzdGUgYWt0dWFsaXNpZXJlbi4KKyAgcG90aW9uc1tudW0sUE9UX0xJU1ROT10gPSBsaXN0OworICBSZWJ1aWxkQ2FjaGUoKTsKKyAgc2F2ZV9pbmZvKCk7CisgIE1PRExPRygiTU9ESUZZX0xJU1ROTyIsIG51bSwgb2xkbGlzdCsiIC0+ICIrbGlzdCk7CisgIHJldHVybiBudW07Cit9CisKK2ludCBEZWFjdGl2YXRlUm9vbShzdHJpbmcgcm9vbSkgeworICBpZiAoICFzZWN1cmUoKSApCisgICAgcmV0dXJuIFBPVF9BQ0NFU1NfREVOSUVEOworICAvLyBBa3R1ZWxsZSBaVC1OdW1tZXIgZXJtaXR0ZWxuLiBFdHdhIHVtc3RhZW5kbGljaCwgZGEgaW0gRmVobGVyZmFsbCAtMQorICAvLyBiZW5vZXRpZ3Qgd2lyZC4KKyAgaW50IG51bSA9IG1lbWJlcihyZXZlcnNlX3RhYmxlLHJvb20pID8gcmV2ZXJzZV90YWJsZVtyb29tXSA6IC0xOworICAvLyBOdW1tZXIgbXVzcyBleGlzdGllcmVuCisgIGlmICggbnVtID09IC0xICkKKyAgICByZXR1cm4gUE9UX0lOVkFMSURfUE9USU9OOworICAvLyBaVCBkYXJmIG5pY2h0IGJlcmVpdHMgaW5ha3RpdiBzZWluCisgIGlmICggbWVtYmVyKGluYWN0aXZlLG51bSk+LTEgKQorICAgIHJldHVybiBQT1RfQUxSRUFEWV9JTkFDVElWRTsKKyAgaW5hY3RpdmUgKz0gKHtudW19KTsKKyAgUmVidWlsZENhY2hlKCk7CisgIHNhdmVfaW5mbygpOworICBNT0RMT0coIkRFQUNUSVZBVEUiLCBudW0sIHJvb20pOworICByZXR1cm4gbnVtOworfQorCitwcml2YXRlIGludCAqX2NyZWF0ZV9saXN0KGludCBsaXN0bm8sIGludCBhbnopIHsKKyAgaW50ICpsaXN0ID0gKHt9KTsKKyAgLy8gTGlzdGVuZXJ6ZXVndW5nIGxvaG50IG51ciBkYW5uLCB3ZW5uIG1pbmQuIDEgRWludHJhZyBnZWZvcmRlcnQgd2lyZCB1bmQKKyAgLy8gZGllIExpc3Rlbm51bW1lciBpbSBndWVsdGlnZW4gQmVyZWljaCB6d2lzY2hlbiAwIHVuZCA3IGlzdC4KKyAgaWYgKCBhbno+MCAmJiBsaXN0bm8+PTAgJiYgbGlzdG5vPD03ICkgeworICAgIGludCAqdG1wID0gbGlzdHNbbGlzdG5vXSAtIGluYWN0aXZlOworICAgIC8vIFdlbm4gZGllIExpc3Rlbmdyb2Vzc2UgbWF4aW1hbCBnZW5hdXNvIGdyb3NzIGlzdCB3aWUgZGllIGFuZ2Vmb3JkZXJ0ZQorICAgIC8vIEFuemFobCwga2FubiBkaWVzZSB2b2xsc3RhZW5kaWcgdWViZXJub21tZW4gd2VyZGVuLgorICAgIGlmICggc2l6ZW9mKHRtcCkgPD0gYW56ICkgeworICAgICAgbGlzdCA9IHRtcDsKKyAgICB9IGVsc2UgeyAvLyBhbnNvbnN0ZW4gc292aWVsZSBFaW50cmFlZ2UgZXJ6ZXVnZW4gd2llIGFuZ2Vmb3JkZXJ0CisgICAgICBmb3JlYWNoKGludCBpOiBhbnopIHsKKyAgICAgICAgaW50IGo9cmFuZG9tKHNpemVvZih0bXApKTsKKyAgICAgICAgbGlzdCArPSAoe3RtcFtqXX0pOworICAgICAgICB0bXAgLT0gKHt0bXBbal19KTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIGxpc3Q7Cit9CisKK21peGVkICpJbml0aWFsTGlzdCgpIHsKKyAgbWl4ZWQgKmxpc3Q9KHt9KTsKKyAgZm9yZWFjaChpbnQgaSA6IDgpCisgICAgbGlzdCs9X2NyZWF0ZV9saXN0KGksTUFYX1JPT01TX1BFUl9MSVNUKTsKKyAgcmV0dXJuIGxpc3Q7Cit9CisKKy8vIEF1ZnJ1ZmUgYXVzIGRlbiBTcGllbGVyc2hlbGxzIHVuZCBkZW0gUG90aW9udG9vbCBzaW5kIGVybGF1YnQKK2ludCBIYXNQb3Rpb24ob2JqZWN0IHJvb20pIHsKKyAgaWYgKCAhcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShwcmV2aW91c19vYmplY3QoKSkgJiYgCisgICAgICAgbG9hZF9uYW1lKHByZXZpb3VzX29iamVjdCgpKSAhPSBQT1RJT05UT09MICkKKyAgICByZXR1cm4gUE9UX0FDQ0VTU19ERU5JRUQ7CisgIHJldHVybiBvYmplY3RwKHJvb20pID8gcmV2ZXJzZV90YWJsZVtvYmplY3RfbmFtZShyb29tKV0gOiBQT1RfTk9fU1VDSF9ST09NOworfQorCisvLyBMaXN0ZW5udW1tZXIgZXJtaXR0ZWxuLCBpbiBkZXIgZGVyIFpUIG51bSBlbnRoYWx0ZW4gaXN0LgorLy8gQXVjaCBpbmFrdGl2ZSBaVHMgd2VyZGVuIGFscyB6dSBlaW5lciBMaXN0ZSBnZWhvZXJpZyBnZW1lbGRldC4KK2ludCBHZXRMaXN0QnlOdW1iZXIoaW50IG51bSkgeworICByZXR1cm4gbWVtYmVyKHBvdGlvbnMsbnVtKSA/IHBvdGlvbnNbbnVtLFBPVF9MSVNUTk9dIDogUE9UX0lOVkFMSURfUE9USU9OOworfQorCisvLyBMaXN0ZW5udW1tZXIgZXJtaXR0ZWxuLCBpbiBkZXIgZGVyIGluYWt0aXZlIFpUIG51bSBlbnRoYWx0ZW4gaXN0LgorLy8gRGEgYWxsZSBaYXViZXJ0cmFlbmtlIGluIGVpbmVyIEdlc2FtdGxpc3RlIGVudGhhbHRlbiBzaW5kLCBrYW5uIGRpcmVrdCBkYXMKKy8vIFJlc3VsdGF0IHZvbiBHZXRMaXN0QnlOdW1iZXIoKSB6dXJ1ZWNrZ2VnZWJlbiB3ZXJkZW4uCitpbnQgR2V0SW5hY3RMaXN0QnlOdW1iZXIoaW50IG51bSkgeworICBpZiAoIG1lbWJlcihpbmFjdGl2ZSxudW0pID4gLTEgKQorICAgIHJldHVybiBHZXRMaXN0QnlOdW1iZXIobnVtKTsKKyAgZWxzZQorICAgIHJldHVybiBQT1RfTk9UX0lOQUNUSVZFOworfQorCisvLyBXaXJkIG51ciB2b24gL29iai90b29scy9wdG9vbCBhdWZnZXJ1ZmVuLiBXZW5uIGRlciBBdWZydWYgenVnZWxhc3NlbiB3aXJkLAorLy8gZXJmb2xndCB2b24gZG9ydCBhdXMgZWluIENoYW5nZVJvb21QYXRoKCksIHVuZCBkb3J0IHdpcmQgYmVyZWl0cyBnZWxvZ2d0LgorLy8gRXJ6bWFnaWVyIGR1ZXJmZW4gYXVjaCBhdWZydWZlbi4KK21peGVkIEdldEZpbGVuYW1lQnlOdW1iZXIoaW50IG51bSkgeworICBpZiAoIGV4dGVybl9jYWxsKCkgJiYgCisgICAgICAgb2JqZWN0X25hbWUocHJldmlvdXNfb2JqZWN0KCkpICE9IFBPVElPTlRPT0wgJiYKKyAgICAgICAhQVJDSF9TRUNVUklUWSApCisgICAgcmV0dXJuIFBPVF9BQ0NFU1NfREVOSUVEOworICBpZiAoICFtZW1iZXIocG90aW9ucywgbnVtKSApCisgICAgcmV0dXJuIFBPVF9JTlZBTElEX1BPVElPTjsKKyAgcmV0dXJuIHBvdGlvbnNbbnVtLFBPVF9ST09NTkFNRV07Cit9CisKKy8vIFdpcmQgdm9tIFNwaWVsZXJvYmpla3QgZ2VydWZlbjsgdWViZXJnZWJlbiB3ZXJkZW4gZGVyIFJhdW0sIGRlciBpbml0aWFsCisvLyBGaW5kUG90aW9uKCkgYXVmcmllZiwgZGllIFpULUxpc3RlIGRlcyBTcGllbGVycyBzb3dpZSBkaWUgTGlzdGUgYmVyZWl0cworLy8gZ2VmdW5kZW5lciBaVHMuCisvLworLy8gSW4gc3RkL3BsYXllci9wb3Rpb24uYyBpc3Qgc2ljaGVyZ2VzdGVsbHQsIGRhc3Mgcm9vbSBlaW4gT2JqZWt0IGlzdCB1bmQKKy8vIGRhc3MgZGllIExpc3RlbiBhbHMgSW50LUFycmF5cyB1ZWJlcmdlYmVuIHdlcmRlbi4KKy8vCisvLyBFcyB3ZXJkZW4gYXVzIGhpc3RvcmlzY2hlbiBHcnVlbmRlbiAobm9jaCkgYmVpZGUgWlQtTGlzdGVuIHVlYmVyZ2ViZW4sCisvLyBhYmVyIGVzIG11c3MgbnVyIGtub3dubGlzdCB1ZWJlcnBydWVmdCB3ZXJkZW4sIGRhIGRpZXNlIGVpbmUgVGVpbG1lbmdlCisvLyB2b24gcG90aW9ubGlzdCBpc3QgdW5kIHNvbWl0IGplZGVyIFpUIGluIGVyc3RlcmVyIGF1ZiBqZWRlbiBGYWxsIGF1Y2gKKy8vIGluIGxldHp0ZXJlciBlbnRoYWx0ZW4gc2VpbiBfbXVzc18uCitpbnQgSW5MaXN0KG9iamVjdCByb29tLCBpbnQgKnBvdGlvbmxpc3QsIGludCAqa25vd25saXN0KSB7CisgIGlmICggIXF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUocHJldmlvdXNfb2JqZWN0KCkpICYmICFzZWN1cmUoKSApCisgICAgcmV0dXJuIDA7IC8vUE9UX0FDQ0VTU19ERU5JRUQ7CisgIGludCBudW0gPSBRdWVyeUFjdGl2ZShvYmplY3RfbmFtZShyb29tKSk7CisgIAorICAvLyBadW5hZWNoc3Qga2VpbmVuIEZlaGxlcmNvZGUgenVydWVja2dlYmVuLCB3ZWlsIGRhcyBTcGllbGVyb2JqZWt0CisgIC8vIGRhbWl0IGltIE1vbWVudCBub2NoIG5pY2h0IHVtZ2VoZW4ga2Fubi4KKyAgaWYgKCBudW0gPCAwICkKKyAgICByZXR1cm4gMDsgLy9QT1RfSU5WQUxJRF9QT1RJT047CisKKyAgcmV0dXJuIChtZW1iZXIoa25vd25saXN0LG51bSk+LTEpOworfQorCisvLyBXaXJkIHZvbSBTcGllbGVyb2JqZWt0IGdlcnVmZW4sIHVtIGVpbmVuIGdlZnVuZGVuZW4gWlQgYXVzIGRlc3NlbiBaVC0KKy8vIExpc3RlbiBhdXN0cmFnZW4genUgbGFzc2VuLiBEYXMgU3BpZWxlcm9iamVrdCBzdGVsbHQgc2ljaGVyLCBkYXNzIHJvb20KKy8vIGVpbiBPYmpla3QgaXN0LCB1bmQgZGFzcyBba25vd25fXXBvdGlvbnJvb21zIEFycmF5cyBzaW5kLgorLy8KKy8vIEFDSFRVTkchIFNvd29obCBwb3Rpb25yb29tcywgYWxzIGF1Y2gga25vd25fcG90aW9ucm9vbXMgc2luZCBkaWUKKy8vICAgICAgICAgIE9yaWdpbmFsZGF0ZW4gYXVzIGRlbSBTcGllbGVyb2JqZWt0LCBkaWUgaGllciBBTFMgUkVGRVJFTloKKy8vICAgICAgICAgIHVlYmVyZ2ViZW4gd2VyZGVuISBWb3JzaWNodCBiZWkgQWVuZGVydW5nZW4gYW4gZGVyIEZ1bmt0aW9uIQorLy8KKy8vIFdlbm4gc3RkL3BsYXllci9wb3Rpb25zLmMgZ2VhZW5kZXJ0IHdpcmQsIGlzdCBkaWVzZSBGdW5rdGlvbiBvYnNvbGV0CisvLyA9PiBnZ2YuIGtvbXBsZXR0IHJhdXN3ZXJmZW4uIERhbm4ga2FubiBhdWNoIGRlciBGZWhsZXJjb2RlIGluIEluTGlzdCgpCisvLyByZWFrdGl2aWVydCB1bmQgZGVyZW4gUGFyYW1ldGVyIGtvcnJpZ2llcnQgd2VyZGVuCit2b2lkIFJlbW92ZUxpc3Qob2JqZWN0IHJvb20sIGludCogcG90aW9ucm9vbXMsIGludCoga25vd25fcG90aW9ucm9vbXMpIHsKKyAgLy8gWlQgaXN0IGFrdGl2LCBkYXMgd3VyZGUgYmVyZWl0cyBpbiBJbkxpc3QoKSBnZXBydWVmdCwgZGFzIHZvciBkZW0KKyAgLy8gQXVmcnVmIHZvbiBSZW1vdmVMaXN0KCkgYXVzIGRlbSBTcGllbGVyb2JqZWt0IGdlcnVmZW4gd2lyZC4gRGFoZXIgcmVpY2h0CisgIC8vIGVzIGF1cywgZGllIFpULU51bW1lciBhdXMgZGVtIHJldmVyc2VfdGFibGUgTG9va3VwIHp1IGhvbGVuLgorICBpbnQgbnVtID0gcmV2ZXJzZV90YWJsZVtvYmplY3RfbmFtZShyb29tKV07CisgIGludCB0bXAgPSBtZW1iZXIocG90aW9ucm9vbXMsIG51bSk7CisgIHBvdGlvbnJvb21zW3RtcF0gPSAtMTsKKyAgdG1wID0gbWVtYmVyKGtub3duX3BvdGlvbnJvb21zLCBudW0pOworICBrbm93bl9wb3Rpb25yb29tc1t0bXBdID0gLTE7CisgIHJldHVybjsKK30KKworI2RlZmluZSBMSVNUSEVBREVSICIjIyMjIyMjIyMjIyMjIyMjIyMgTGlzdGUgJWQgIyMjIyMjIyMjIyMjIyMjIyMjICglZClcblxuIgorI2RlZmluZSBJTkFDVF9IRUFERVIgIiMjIyMjIyMjIyMjIyMjIyMjIyBJbmFrdGl2ICMjIyMjIyMjIyMjIyMjIyMjIyAoJWQpXG5cbiIKKworaW50IER1bXBMaXN0KCkgeworICBpZiAoICFzZWN1cmUoKSApCisgICAgcmV0dXJuIFBPVF9BQ0NFU1NfREVOSUVEOworICAvLyBadWVyc3QgZGllIENhY2hlcyBuZXUgYXVmYmF1ZW4sIHVtIHNpY2hlcnp1c3RlbGxlbiwgZGFzcyBkaWUgTGlzdGVuCisgIC8vIGFrdHVlbGwgc2luZC4KKyAgUmVidWlsZENhY2hlKCk7CisgIC8vIER1bXBmaWxlIGxvZXNjaGVuCisgIHJtKFBPVElPTkRVTVApOworICAvLyBBbGxlIExpc3RlbiBkZXIgUmVpaGUgbmFjaCBhYmxhdWZlbi4gRXMgd2lyZCBpbiBqZWRlbSBTY2hsZWlmZW5kdXJjaGxhdWYKKyAgLy8gZWlubWFsIGF1ZiBkaWUgUGxhdHRlIGdlc2NocmllYmVuLiBEYXMgaXN0IEFic2ljaHQsIHdlaWwgZXMgc3BlaWNoZXItCisgIC8vIHRlY2huaXNjaCBzZWhyIGF1ZndlbmRpZyB3YWVyZSwgZGllIEF1c2dhYmVkYXRlbiBzdGF0dGRlc3NlbiBlcnN0IGluCisgIC8vIGVpbmVyIFZhcmlhYmxlbiB6dSBzYW1tZWxuIHVuZCBkYW5uIHdlZ3p1c2NocmVpYmVuLgorICBmb3JlYWNoKGludCAqbGlzdG5vIDogc29ydF9hcnJheShtX2luZGljZXMobGlzdHMpLCMnPikpIHsKKyAgICAvLyBadWVyc3QgZGVuIEhlYWRlciBkZXIgZW5zcHJlY2hlbmRlbiBMaXN0ZSBzY2hyZWliZW4uCisgICAgRFVNUChzcHJpbnRmKExJU1RIRUFERVIsIGxpc3Rubywgc2l6ZW9mKGxpc3RzW2xpc3Rub10pKSk7CisgICAgLy8gRGFubiBhbGxlIFBvdGlvbnMgZGVyIExpc3RlIGR1cmNoZ2VoZW4KKyAgICBmb3JlYWNoKGludCBwb3Rpb24gOiBsaXN0c1tsaXN0bm9dKSB7CisgICAgICAvLyBXZW5uIGRlciBaVCBpbmFrdGl2IGlzdCwgdWViZXJzcHJpbmdlbiB3aXIgZGVuLgorICAgICAgaWYgKCBtZW1iZXIoaW5hY3RpdmUscG90aW9uKT4tMSApCisgICAgICAgIGNvbnRpbnVlOworICAgICAgLy8gUmF1bXBmYWQgYXVzIGRlciBHZXNhbXRsaXN0ZSBob2xlbi4KKyAgICAgIHN0cmluZyBzdHIgPSBwb3Rpb25zW3BvdGlvbixQT1RfUk9PTU5BTUVdOworICAgICAgLy8gV2VubiBkZXIgbmljaHQgZXhpc3RpZXJ0LCBlbnRzcHJlY2hlbmRlbiBIaW53ZWlzIGR1bXBlbiwgYW5zb25zdGVuCisgICAgICAvLyBkZW4gUmF1bW5hbWVuLgorICAgICAgLy9aWjogaWNoIGZpbmRlIGphLCB3aXIgc29sbHRlbiBzaWNoZXJzdGVsbGVuLCBkYXNzIGRhcyBuaWNodCBtZWhyCisgICAgICAvL3Bhc3NpZXJ0LiBJc3QgZGFzIG1pdCBkZW0gQWRkUG90aW9uUm9vbSBvYmVuIG5pY2h0IHNjaG9uIHNvPworICAgICAgaWYgKCAhc3RyaW5ncChzdHIpIHx8ICFzaXplb2Yoc3RyKSApCisgICAgICAgIHN0cj0iS0VJTiBSQVVNIFpVR0VPUkRORVQhISEiOworICAgICAgRFVNUChzcHJpbnRmKCIlM2QuICVzXG4iLCBwb3Rpb24sIHN0cikpOworICAgIH0KKyAgICAvLyAyIExlZXJ6ZWlsZW4gendpc2NoZW4gamVkZXIgR3J1cHBlIGVpbmZ1ZWdlbgorICAgIERVTVAoIlxuXG4iKTsKKyAgfQorICAvLyBadW0gU2NobHVzcyBkZW4gSGVhZGVyIGRlciBJbmFrdGl2LUxpc3RlIHNjaHJlaWJlbi4KKyAgRFVNUChzcHJpbnRmKElOQUNUX0hFQURFUiwgc2l6ZW9mKGluYWN0aXZlKSkpOworICAvLyBEYW5uIGFsbGUgaW5ha3RpdmVuIFBvdGlvbnMgYWJsYXVmZW4KKyAgZm9yZWFjaChpbnQgaSA6IGluYWN0aXZlKSB7CisgICAgLy9aWjogc29uc3QgbXVlc3N0ZSBtYW4gaGllciB3b2hsIGF1Y2ggYXVmIGRlbiBmZWhsZW5kZW4gUmF1bSBwcnVlZmVuLgorICAgIERVTVAoc3ByaW50ZigiJTNkLiAoTGlzdGUgJWQpICVzXG4iLCBpLCBHZXRMaXN0QnlOdW1iZXIoaSksCisgICAgICBwb3Rpb25zW2ksUE9UX1JPT01OQU1FXSkpOworICB9CisgIHJldHVybiAxOworfQorCisvL09SQUtFTC1Sb3V0aW5lbgorCisvKiBBdWZiYXUgZWluZXMgVGlwczoKKworICAgVHJhbGFsYSwgbGFsYWxhCisgICBEaWRlbGRhZGVsZHVtCisgICBIdXBwc2Rpd3VwcHMKKyAgIFhYWFhYCisgICBOb2NoIGVpbiB6d2VpdGVyIFRpcAorICAgRGluZ2VsZG9uZworICAgJSUlJSUKKworICAgRGllIFByb3plbnR6ZWljaGVuIHNpbmQgZGFzIEVuZGV6ZWljaGVuLCBhYiBoaWVyIGtvZW5uZW4gZXZlbnR1ZWxsZQorICAgS29tbWVudGFyZSBzdGVoZW4uIERpZSA1IFggc2luZCBkYXMgVHJlbm56ZWljaGVuIHp3aXNjaGVuIHp3ZWkgVGlwcworICAgenVtIHNlbGJlbiBaVC4KKyovCisKKy8vIFRJUExPRygpIGRlcnplaXQgdW5iZW51dHp0CisvLyNkZWZpbmUgTE9HRklMRV9SRUFEICAgICJBUkNIL1BPVElPTlNfVElQX1JFQUQubG9nIgorLy8jZGVmaW5lIFRJUExPRyh4KSAgICAgIGxvZ19maWxlKExPR0ZJTEVfUkVBRCwgeCkKKworbWl4ZWQgVGlwTGVzZW4oaW50IG51bSkgeworICBzdHJpbmcgKnJldCA9IHRpcG1hcFtudW1dOworICAvL0Z1bmt0aW9uIGRhcmYgbnVyIHZvbSBPcmFrZWwgdW5kIEVNKyBnZXJ1ZmVuIHdlcmRlbi4KKyAgaWYgKCBwcmV2aW91c19vYmplY3QoKSAhPSBmaW5kX29iamVjdChPUkFLRUwpICYmICFzZWN1cmUoKSApCisgICAgcmV0dXJuIFBPVF9BQ0NFU1NfREVOSUVEOworICAvLyBEZXJ6ZWl0IGtlaW4gTG9nLCBkYSBkaWVzZSBJbmZvcm1hdGlvbmVuIHRlbmRlbnRpZWxsIGVoZXIgCisgIC8vIHVuaW50ZXJlc3NhbnQgc2luZC4KKyAgLy8gVGltZXN0YW1wIGlzdCB2b20gRm9ybWF0ICIyMDEyLU9rdC0wMyAxNDoxOCIKKyAgLypUSVBMT0coc3ByaW50ZigiJXMgWlQtVGlwIGdlbGVzZW46ICVkIHZvbiBUUDogJU8sIFBPOiAlTywgVEk6ICVPXG4iLAorICAgIHN0cmZ0aW1lKCIlWS0lYi0lZCAlUiIpLCBudW0sIHRoaXNfcGxheWVyKCksIHByZXZpb3VzX29iamVjdCgpLAorICAgIHRoaXNfaW50ZXJhY3RpdmUoKSkpOyovCisKKyAgLy8gWlQtU3BydWNoIGlzdCBiZXJlaXRzIGltIFRpcC1DYWNoZSBlbnRoYWx0ZW4sIGRhbm4gZGlyZWt0IGF1c2dlYmVuLgorICBpZiAoIHBvaW50ZXJwKHJldCkgKQorICAgIHJldHVybiByZXQ7CisgIAorICAvLyBaVC1TcHJ1Y2ggYXVmIGdydW5kbGVnZW5kZSBzeW50YWt0aXNjaGUgS29ycmVrdGhlaXQgcHJ1ZWZlbjoKKyAgLy8gZXhwbG9kZSgpIGxpZWZlcnQgZWluIEFycmF5IG1pdCAyIEVsZW1lbnRlbiwgd2VubiBkaWUgRW5kZS1NYXJraWVydW5nCisgIC8vIHZvcmhhbmRlbiB1bmQgc29taXQgZGFzIEZpbGUgZGllc2JlenVlZ2xpY2gga29ycmVrdCBhdWZnZWJhdXQgaXN0LgorICBzdHJpbmcgKnRpcD1leHBsb2RlKCByZWFkX2ZpbGUoVElQUyhudW0rIi56dCIpKXx8IiIsICIlJSUlJSIgKTsKKyAgaWYgKHNpemVvZih0aXApID49IDIpIHsKKyAgICAvLyBEZXIgZXJzdGUgRWludHJhZyBpbiBkZW0gQXJyYXkgaXN0IGRhbm4gZGVyIFNwcnVjaC4gV2VubiBkaWVzZXIKKyAgICAvLyBkaWUgVHJlbm4tTWFya2llcnVuZyBlbnRoYWVsdCwgZW50c3RlaGVuIGhpZXIgMiBIaW53ZWlzZSwgYW5zb25zdGVuCisgICAgLy8gYmxlaWJ0IGVzIGJlaSBlaW5lbS4KKyAgICB0aXBtYXBbbnVtXSA9IGV4cGxvZGUodGlwWzBdLCAiWFhYWFhcbiIpOworICAgIHJldHVybiB0aXBtYXBbbnVtXTsKKyAgfQorICByZXR1cm4gUE9UX05PX1NVQ0hfRklMRTsKK30KKworLy8gRGF0ZW5rb252ZXJ0aWVydW5nIGFsdGUgQWxpc3RzID0+IE1hcHBpbmdzCisvKm1hcHBpbmcgQ29udmVydERhdGEoKSB7CisgIC8vaWYgKCAhc2VjdXJlKCkpICkgcmV0dXJuOworICAvLyBhbGxfcm9vbXMgaXN0IGVpbmUgQWxpc3QgZGVyIEZvcm0gKHsgc3RyaW5nICpyb29tLCBpbnQgKm51bWJlciB9KQorICAvLyBhbHMgMy4gRWludHJhZyBzY2hyZWliZW4gd2lyIHVlYmVyYWxsIC0xIHJlaW4sIGRhcyB3aXJkIHNwYWV0ZXIgZHVyY2ggZGllCisgIC8vIExpc3Rlbm51bW1lciBkZXMgYmV0cmVmZmVuZGVuIFpUcyBlcnNldHp0IHVuZCBlcmxhdWJ0IGVpbmVuIGVpbmZhY2hlbgorICAvLyBDaGVjayBhdWYgRGF0ZW5rb25zaXN0ZW56LgorICBwb3Rpb25zID0gbWttYXBwaW5nKCBhbGxfcm9vbXNbMV0sCisgICAgICAgICAgICAgICAgICAgICAgIGFsbF9yb29tc1swXSwKKyAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdGUoc2l6ZW9mKGFsbF9yb29tc1swXSksIC0xKSApOworICAvLyBBbGxlIExpc3RlbiBhYmxhdWZlbgorICBmb3JlYWNoKGludCAqbGlzdDogYWN0aXZlX3Jvb21zICkgeworICAgIC8vIEFsbGUgWlRzIGRpZXNlciBMaXN0ZSBhYmxhdWZlbiB1bmQgZGllIGVudHNwcmVjaGVuZGUgTGlzdGVubnVtbWVyIGluCisgICAgLy8gZGVyIG5ldWVuIERhdGVuc3RydWt0dXIgc2V0emVuLgorICAgIGZvcmVhY2goaW50IG51bTogbGlzdCkgeworICAgICAgcG90aW9uc1tudW0sUE9UX0xJU1ROT10gPSBtZW1iZXIoYWN0aXZlX3Jvb21zLGxpc3QpOworICAgIH0KKyAgfQorICAvLyBpbmFjdGl2ZV9yb29tcyBpc3QgZWluZSBBbGlzdCBkZXIgZ2xlaWNoZW4gRm9ybS4gRGllIFNjaGxlaWZlIGFkZGllcnQKKyAgLy8gZWluZmFjaCBhbGxlIEVpbnRyYWVnZSBkYXJpbiBhdWYsIHNvIGRhc3MgZWluIEludC1BcnJheSBlbnRzdGVodCwgZGFzCisgIC8vIGFsbGUgaW5ha3RpdmVuIFpULU51bW1lcm4gZW50aGFlbHQ7IGRhcyBhbGxlcmRpbmdzIG51ciBmdWVyIExpc3RlbiBtaXQKKyAgLy8gbWluZGVzdGVucyBlaW5lbSBFbGVtZW50LgorICBmb3JlYWNoKGludCAqbGlzdCA6IGluYWN0aXZlX3Jvb21zICkgeworICAgIGlmICggc2l6ZW9mKGxpc3QpICkgeworICAgICAgaW5hY3RpdmUgKz0gbGlzdDsKKyAgICAgIC8vIEFsbGUgWlRzIGRpZXNlciBMaXN0ZSBhYmxhdWZlbiB1bmQgZGllIGVudHNwcmVjaGVuZGUgTGlzdGVubnVtbWVyIGluCisgICAgICAvLyBkZXIgbmV1ZW4gRGF0ZW5zdHJ1a3R1ciBzZXR6ZW4uCisgICAgICBmb3JlYWNoKGludCBudW0gOiBsaXN0KSB7CisgICAgICAgIHBvdGlvbnNbbnVtLFBPVF9MSVNUTk9dID0gbWVtYmVyKGluYWN0aXZlX3Jvb21zLGxpc3QpOworICAgICAgfQorICAgIH0KKyAgICAvLyB1bmlmeSBhcnJheQorICAgIGluYWN0aXZlID0gbV9pbmRpY2VzKG1rbWFwcGluZyhpbmFjdGl2ZSkpOworICB9CisgIG1hcHBpbmcgaW52YWxpZCA9IChbIFBPVF9JTlZBTElEX0xJU1RfTlVNQkVSIDogKHt9KSBdKTsKKyAgd2Fsa19tYXBwaW5nKHBvdGlvbnMsIGZ1bmN0aW9uIHZvaWQgKGludCBwbnVtLCBzdHJpbmcgcGF0aCwgaW50IGxpc3RubykgeworICAgIGlmICggbGlzdG5vID09IC0xICkKKyAgICAgIGludmFsaWRbUE9UX0lOVkFMSURfTElTVF9OVU1CRVJdICs9ICh7cG51bX0pOworICB9KTsKKyAgcmV0dXJuIHNpemVvZihpbnZhbGlkW1BPVF9JTlZBTElEX0xJU1RfTlVNQkVSXSkgPyBpbnZhbGlkIDogcG90aW9uczsKK30qLworCmRpZmYgLS1naXQgYS9zZWN1cmUvcHVibWFzdGVyLmMgYi9zZWN1cmUvcHVibWFzdGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTEyNDg4OQotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9wdWJtYXN0ZXIuYwpAQCAtMCwwICsxLDMwNyBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIFB1Ym1hc3Rlci5jIC0tIFJlZ2lzdHJhdGluZyB0aGUgaGVhbC12YWx1ZXMgb2YgcHVicworLy8KKy8vICRJZDogcHVibWFzdGVyLmMgOTM3MyAyMDE1LTEwLTIyIDE5OjAyOjQyWiBaZXNzdHJhICQKKworI2luY2x1ZGUgPHB1Yi5oPgorCisjZGVmaW5lIFNBVkVGSUxFICIvc2VjdXJlL0FSQ0gvcHViIgorI2RlZmluZSBDTE9HRklMRSAiL2xvZy9BUkNIL3B1YmNoYW5nZSIKKyNkZWZpbmUgRFVNUEZJTEUgIi9sb2cvQVJDSC9QVUJTIgorI2RlZmluZSBEVU1QTElTVCAiL2xvZy9BUkNIL1BVQkxJU1QiCisKKyNkZWZpbmUgRFVNUEYoc3RyKSB3cml0ZV9maWxlKERVTVBGSUxFLHN0cikKKyNkZWZpbmUgRFVNUEwoc3RyKSB3cml0ZV9maWxlKERVTVBMSVNULHN0cikKKworI3ByYWdtYSBzdHJvbmdfdHlwZXMKKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKyNpbmNsdWRlIDxoZWFsdGguaD4KKworbWFwcGluZyBwdWJzOworbm9zYXZlIHN0cmluZyAgKndhdGNocHJvcHM7Citub3NhdmUgaW50ICAgICB3YXRjaHNpemU7CisKK3ZvaWQgY3JlYXRlKCkKK3sKKyAgICBzZXRldWlkKGdldHVpZCh0aGlzX29iamVjdCgpKSk7CisgICAgaWYgKGNsb25lcCh0aGlzX29iamVjdCgpKSkKKyAgICB7CisgICAgICAgIGRlc3RydWN0KHRoaXNfb2JqZWN0KCkpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICghcmVzdG9yZV9vYmplY3QoU0FWRUZJTEUpKQorICAgICAgICBwdWJzID0gKFtdKTsKKworICAgIHdhdGNocHJvcHMgPSAoeyBQX0hQLCBQX1NQLCBQX0FMQ09IT0wsIFBfRFJJTkssIFBfRk9PRCwgUF9WQUxVRSwKKyAgICAgICAgICAgICAgICAgICAgInJhdGUiLCAiZGVsYXkiIH0pOworICAgIHdhdGNoc2l6ZSAgPSBzaXplb2Yod2F0Y2hwcm9wcyk7Cit9CisKK3ZvaWQgc2F2ZV9kYXRhKCkKK3sKKyAgICBzYXZlX29iamVjdChTQVZFRklMRSk7Cit9CisKK2ludCBDYWxjTWF4KG1hcHBpbmcgaW5mbywgc3RyaW5nIGZuKQoreyAgIGZsb2F0IGhlYWwsZGVsYXksZmFjdG9yOworCisgICAgaWYgKCFpbmZvIHx8ICFtYXBwaW5ncChpbmZvKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKCAoaW5mb1tQX0FMQ09IT0xdK2luZm9bUF9EUklOS10raW5mb1tQX0ZPT0RdKTw9MCAgICAgfHwKKyAgICAgICAgIChpbmZvW1BfQUxDT0hPTF0gJiYgIShpbmZvW1BfRFJJTktdfHxpbmZvW1BfRk9PRF0pKSApCisgICAgICAgIHJldHVybiAwOworCisgICAgZGVsYXkgPSB0b19mbG9hdChpbmZvWyJkZWxheSJdKTsKKyAgICBpZiAoZGVsYXk+UFVCX01BWERFTEFZKQorICAgICAgICBkZWxheT1QVUJfTUFYREVMQVk7CisKKyAgICBpZiAoIXN0cmluZ3AoZm4pIHx8ICFtZW1iZXIocHVicyxmbikpIC8vIEV4dGVybmFsIHF1ZXJ5PworICAgICAgICBmYWN0b3I9MS4wOworICAgIGVsc2UKKyAgICAgICAgZmFjdG9yPXB1YnNbZm4sMV07CisKKyAgICBoZWFsID0gdG9fZmxvYXQoIGluZm9bUF9BTENPSE9MXSpBTENPSE9MX0RFTEFZICsKKyAgICAgICAgICAgICAgICAgICAgIGluZm9bUF9EUklOS10gICpEUklOS19ERUxBWSAgICsKKyAgICAgICAgICAgICAgICAgICAgIGluZm9bUF9GT09EXSAgICpGT09EX0RFTEFZICAgICkgCisgICAgICAgICAgICogUFVCX1NPQUtNVUxUCisgICAgICAgICAgIC8gdG9fZmxvYXQoIEFMQ09IT0xfREVMQVkgKyBEUklOS19ERUxBWSArIEZPT0RfREVMQVkgKTsKKyAgICBoZWFsID0gaGVhbCArIAorICAgICAgICAgICB0b19mbG9hdChpbmZvW1BfVkFMVUVdKS8oUFVCX1ZBTFVFRElWK3RvX2Zsb2F0KGluZm9bInJhdGUiXSkpIC0KKyAgICAgICAgICAgZXhwKHRvX2Zsb2F0KGluZm9bInJhdGUiXSkvUFVCX1JBVEVESVYxKS9QVUJfUkFURURJVjI7CisgICAgaGVhbCA9IGhlYWwgKiBmYWN0b3IgKgorICAgICAgICAgICAoUFVCX1dBSVRPRkZTICsgKGV4cChkZWxheS9QVUJfV0FJVERJVjEpL1BVQl9XQUlURElWMikpOworCisgICAgcmV0dXJuIHRvX2ludChoZWFsKTsKK30KKworaW50IFJlZ2lzdGVySXRlbShzdHJpbmcgaXRlbSwgbWFwcGluZyBpbmZvKQoreyAgIG9iamVjdCBwdWI7CisgICAgc3RyaW5nIGZuOworICAgIGludCAgICBpLGMsY21heCxtYXgsaGVhbDsKKworICAgIGlmICghb2JqZWN0cChwdWI9cHJldmlvdXNfb2JqZWN0KCkpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKG1lbWJlcihpbmhlcml0X2xpc3QocHViKSwgIi9zdGQvcm9vbS9wdWIuYyIpID09IC0xKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKCFpdGVtIHx8ICFzdHJpbmdwKGl0ZW0pIHx8ICFpbmZvIHx8ICFtYXBwaW5ncChpbmZvKSkKKyAgICAgICAgcmV0dXJuIC0yOworCisgICAgaWYgKGluZm9bInJhdGUiXTwxKQorICAgICAgICBpbmZvWyJyYXRlIl09MTsKKyAgICBpZiAoaW5mb1siZGVsYXkiXTwwKQorICAgICAgICBpbmZvWyJkZWxheSJdPTA7CisKKyAgICAvLyBMb2FkbmFtZSwgd2VpbCBWQ3MgYWxzIGVpbiBQdWIgemFlaGxlbiBzb2xsZW4gKGRhcyBUdXRvcmlhbCBoYXQgZWluCisgICAgLy8gVkMtUHViIGZ1ZXIgamVkZW4gU3BpZWxlci4gRGllIHNvbGxlbiBuaWNodCBhbGxlIGVpbnplbG4gaGllciBlcmZhc3N0CisgICAgLy8gd2VyZGVuLgorICAgIGZuID0gbG9hZF9uYW1lKHB1Yik7CisgICAgYyA9IDA7CisKKyAgICBoZWFsPWluZm9bUF9IUF0raW5mb1tQX1NQXTsKKworICAgIGlmICghbWVtYmVyKHB1YnMsZm4pKQorICAgICAgICBwdWJzICs9IChbIGZuIDogKFtdKTsgMS4wIF0pOworCisgICAgaWYgKCFtZW1iZXIocHVic1tmbl0saXRlbSkpCisgICAgeworICAgICAgICBtYXg9Q2FsY01heChpbmZvLGZuKTsKKyAgICAgICAgcHVic1tmbl0gKz0gKFsgCisgICAgICAgICAgICBpdGVtIDogKFsKKyAgICAgICAgICAgICAgICBQX0hQICAgICAgICAgICAgOiBpbmZvW1BfSFBdLAorICAgICAgICAgICAgICAgIFBfU1AgICAgICAgICAgICA6IGluZm9bUF9TUF0sCisgICAgICAgICAgICAgICAgUF9WQUxVRSAgICAgICAgIDogaW5mb1tQX1ZBTFVFXSwKKyAgICAgICAgICAgICAgICBQX0RSSU5LICAgICAgICAgOiBpbmZvW1BfRFJJTktdLAorICAgICAgICAgICAgICAgIFBfQUxDT0hPTCAgICAgICA6IGluZm9bUF9BTENPSE9MXSwKKyAgICAgICAgICAgICAgICBQX0ZPT0QgICAgICAgICAgOiBpbmZvW1BfRk9PRF0sCisgICAgICAgICAgICAgICAgInJhdGUiICAgICAgICAgIDogaW5mb1sicmF0ZSJdLAorICAgICAgICAgICAgICAgICJkZWxheSIgICAgICAgICA6IGluZm9bImRlbGF5Il0sCisgICAgICAgICAgICAgICAgIm1heGhlYWwiICAgICAgIDogaGVhbCwKKyAgICAgICAgICAgICAgICAibWF4cmF0ZSIgICAgICAgOiAxMAorICAgICAgICAgICAgICAgIF0pCisgICAgICAgICAgICBdKTsKKyAgICAgICAgYz0xOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBmb3IgKGk9d2F0Y2hzaXplLTE7aT49MDtpLS0pCisgICAgICAgICAgICBpZiAoaW5mb1t3YXRjaHByb3BzW2ldXSE9cHVic1tmbl1baXRlbV1bd2F0Y2hwcm9wc1tpXV0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHVic1tmbl1baXRlbV1bd2F0Y2hwcm9wc1tpXV09aW5mb1t3YXRjaHByb3BzW2ldXTsKKyAgICAgICAgICAgICAgICBjPTE7CisgICAgICAgICAgICB9CisgICAgICAgIGlmIChoZWFsPnB1YnNbZm5dW2l0ZW1dWyJtYXhoZWFsIl0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YnNbZm5dW2l0ZW1dWyJtYXhoZWFsIl09aGVhbDsKKyAgICAgICAgICAgIGM9MTsKKyAgICAgICAgfQorICAgICAgICBtYXg9cHVic1tmbl1baXRlbV1bIm1heHNldCJdOworICAgICAgICBjbWF4PUNhbGNNYXgoaW5mbyxmbik7CisgICAgICAgIGlmIChjbWF4Pm1heCkKKyAgICAgICAgICAgIG1heD1jbWF4OworICAgIH0KKworICAgIGlmIChjKQorICAgICAgICBzYXZlX2RhdGEoKTsKKworICAgIGlmICggaGVhbD5tYXggfHwgaW5mb1sicmF0ZSJdPnB1YnNbZm5dW2l0ZW1dWyJtYXhyYXRlIl0gKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiAxOworfQorCitwcml2YXRlIGludCBhbGxvd2VkKCkKK3sKKyAgaWYgKHByZXZpb3VzX29iamVjdCgpICYmIGdldGV1aWQocHJldmlvdXNfb2JqZWN0KCkpPT1ST09USUQpCisgICAgcmV0dXJuIDE7CisgIGlmICghcHJvY2Vzc19jYWxsKCkgJiYgcHJldmlvdXNfb2JqZWN0KCkgJiYgQVJDSF9TRUNVUklUWSkKKyAgICByZXR1cm4gMTsKKyAgcmV0dXJuIDA7Cit9CisKKworCitpbnQgU2V0TWF4SGVhbChzdHJpbmcgcHViLCBzdHJpbmcgaXRlbSwgaW50IG5ldykKK3sgICBpbnQgb2xkOworCisgICAgaWYgKCFhbGxvd2VkKCkpCisgICAgICAgIHJldHVybiAtMjsKKyAgICBpZiAoIXB1YiB8fCAhc3RyaW5ncChwdWIpIHx8ICFpdGVtIHx8ICFzdHJpbmdwKGl0ZW0pIHx8ICFuZXcpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAoIW1lbWJlcihwdWJzLHB1YikgfHwgIW1lbWJlcihwdWJzW3B1Yl0saXRlbSkpCisgICAgICAgIHJldHVybiAwOworICAgIG9sZD1wdWJzW3B1Yl1baXRlbV1bIm1heHNldCJdOworICAgIHB1YnNbcHViXVtpdGVtXVsibWF4c2V0Il09bmV3OworICAgIHdyaXRlX2ZpbGUoQ0xPR0ZJTEUsCisgICAgICAgIHNwcmludGYoIiVzIC0gJXNcbiVzOiVzIEhFQUwgJWQgPiAlZFxuIiwKKyAgICAgICAgICAgIGR0aW1lKHRpbWUoKSksCisgICAgICAgICAgICAodGhpc19pbnRlcmFjdGl2ZSgpID8gZ2V0dWlkKHRoaXNfaW50ZXJhY3RpdmUoKSkgOiAiPz8/IiksCisgICAgICAgICAgICBwdWIsaXRlbSxvbGQsbmV3KSk7CisgICAgc2F2ZV9kYXRhKCk7CisgICAgcmV0dXJuIDE7Cit9CisKK2ludCBTZXRNYXhSYXRlKHN0cmluZyBwdWIsIHN0cmluZyBpdGVtLCBpbnQgbmV3KQoreyAgIGludCBvbGQ7CisKKyAgICBpZiAoIWFsbG93ZWQoKSkKKyAgICAgICAgcmV0dXJuIC0yOworICAgIGlmICghcHViIHx8ICFzdHJpbmdwKHB1YikgfHwgIWl0ZW0gfHwgIXN0cmluZ3AoaXRlbSkgfHwgIW5ldykKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmICghbWVtYmVyKHB1YnMscHViKSB8fCAhbWVtYmVyKHB1YnNbcHViXSxpdGVtKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgb2xkPXB1YnNbcHViXVtpdGVtXVsibWF4cmF0ZSJdOworICAgIHB1YnNbcHViXVtpdGVtXVsibWF4cmF0ZSJdPW5ldzsKKyAgICB3cml0ZV9maWxlKENMT0dGSUxFLAorICAgICAgICBzcHJpbnRmKCIlcyAtICVzXG4lczolcyBSQVRFICVkID4gJWRcbiIsCisgICAgICAgICAgICBkdGltZSh0aW1lKCkpLAorICAgICAgICAgICAgKHRoaXNfaW50ZXJhY3RpdmUoKSA/IGdldHVpZCh0aGlzX2ludGVyYWN0aXZlKCkpIDogIj8/PyIpLAorICAgICAgICAgICAgcHViLGl0ZW0sb2xkLG5ldykpOworICAgIHNhdmVfZGF0YSgpOworICAgIHJldHVybiAxOworfQorCitpbnQgU2V0UHViRmFjdG9yKHN0cmluZyBwdWIsIGZsb2F0IG5ldykKK3sgICBmbG9hdCBvbGQ7CisKKyAgICBpZiAoIWFsbG93ZWQoKSkKKyAgICAgICAgcmV0dXJuIC0yOworICAgIGlmICghcHViIHx8ICFzdHJpbmdwKHB1YikgfHwgIW5ldyB8fCAhZmxvYXRwKG5ldykgfHwgbmV3PDEuMCB8fCBuZXc+MS41KQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKCFtZW1iZXIocHVicyxwdWIpKQorICAgICAgICByZXR1cm4gMDsKKyAgICBvbGQ9cHVic1twdWIsMV07CisgICAgcHVic1twdWIsMV09bmV3OworICAgIHdyaXRlX2ZpbGUoQ0xPR0ZJTEUsCisgICAgICAgIHNwcmludGYoIiVzIC0gJXNcbiVzIEZBQ1QgJTYuNGYgPiAlNi40ZlxuIiwKKyAgICAgICAgICAgIGR0aW1lKHRpbWUoKSksCisgICAgICAgICAgICAodGhpc19pbnRlcmFjdGl2ZSgpID8gZ2V0dWlkKHRoaXNfaW50ZXJhY3RpdmUoKSkgOiAiPz8/IiksCisgICAgICAgICAgICBwdWIsb2xkLG5ldykpOworICAgIHNhdmVfZGF0YSgpOworICAgIHJldHVybiAxOworfQorCit2YXJhcmdzIGludCBDbGVhclB1YihzdHJpbmcgcHViLCBzdHJpbmcgaXRlbSkKK3sKKyAgICBpZiAoIWFsbG93ZWQoKSkKKyAgICAgICAgcmV0dXJuIC0yOworICAgIGlmICghcHViIHx8ICFzdHJpbmdwKHB1YikgfHwgKGl0ZW0gJiYgIXN0cmluZ3AoaXRlbSkpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKCFtZW1iZXIocHVicyxwdWIpKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoIWl0ZW0pCisgICAgICAgIG1fZGVsZXRlKHB1YnMscHViKTsKKyAgICBlbHNlIGlmICghbWVtYmVyKHB1YnNbcHViXSxpdGVtKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgZWxzZQorICAgICAgbV9kZWxldGUocHVic1twdWJdLGl0ZW0pOworICAgIHNhdmVfZGF0YSgpOworICAgIHJldHVybiAxOworfQorCitpbnQgRHVtcFB1YnMoKQoreyAgIHN0cmluZyAqcHVibGlzdCwqaXRlbWxpc3Q7CisgICAgaW50ICAgIHB1YmksaXRlbWk7CisKKyAgICBpZiAoIWFsbG93ZWQoKSkKKyAgICAgICAgcmV0dXJuIC0yOworICAgIGlmIChmaWxlX3NpemUoRFVNUEZJTEUpPjEpCisgICAgICAgIHJtKERVTVBGSUxFKTsKKyAgICBpZiAoZmlsZV9zaXplKERVTVBMSVNUKT4xKQorICAgICAgICBybShEVU1QTElTVCk7CisgICAgRFVNUEYoc3ByaW50ZigiS25laXBlbi1NZW51LUxpc3RlIHZvbSAlczpcblxuIixkdGltZSh0aW1lKCkpKSk7CisgICAgRFVNUEwoc3ByaW50ZigiS25laXBlbmxpc3RlIHZvbSAlczpcblxuIixkdGltZSh0aW1lKCkpKSk7CisgICAgcHVibGlzdD1zb3J0X2FycmF5KG1faW5kaWNlcyhwdWJzKSwjJzwvKicqLyk7CisgICAgaWYgKChwdWJpPXNpemVvZihwdWJsaXN0KSk8MSkKKyAgICB7CisgICAgICAgIERVTVBGKCJObyBwdWJzIGluIExpc3RcbiIpOworICAgICAgICBEVU1QTCgiTm8gcHVicyBpbiBMaXN0XG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBmb3IgKC0tcHViaTtwdWJpPj0wO3B1YmktLSkKKyAgICB7CisgICAgICAgIERVTVBMKHNwcmludGYoIiUtJy4nNzBzICU2LjRmXG4iLAorICAgICAgICAgICAgcHVibGlzdFtwdWJpXSxwdWJzW3B1Ymxpc3RbcHViaV0sMV0pKTsKKyAgICAgICAgRFVNUEYoc3ByaW50ZigiUFVCOiAlc1xuRkFDOiAlNi40ZlxuXG4iLAorICAgICAgICAgICAgcHVibGlzdFtwdWJpXSxwdWJzW3B1Ymxpc3RbcHViaV0sMV0pKTsKKyAgICAgICAgaXRlbWxpc3Q9c29ydF9hcnJheShtX2luZGljZXMocHVic1twdWJsaXN0W3B1YmldXSksIyc8LyonKi8pOworICAgICAgICBpZiAoKGl0ZW1pPXNpemVvZihpdGVtbGlzdCkpPDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIERVTVBGKCIgIE5vIGl0ZW1zIGluIGxpc3RcblxuIik7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBEVU1QRihzcHJpbnRmKAorICAgICAgICAgICAgIiAgJXwnXyczMC4zMHMgJTVzICUzcyAlM3MgJTNzICUzcyAlM3MgJTJzICUycyAlM3MgJTNzXG4iLAorICAgICAgICAgICAgIklURU0iLCJWQUxVRSIsIkhQSCIsIlNQSCIsIkRSSSIsIkFMQyIsIkZPTyIsIlJBIiwiTVIiLCJNQVgiLAorICAgICAgICAgICAgIkZORCIpKTsKKyAgICAgICAgZm9yICgtLWl0ZW1pO2l0ZW1pPj0wO2l0ZW1pLS0pCisgICAgICAgICAgICBEVU1QRihzcHJpbnRmKAorICAgICAgICAgICAgICAgICIgICUtJy4nMzAuMzBzICU1ZCAlM2QgJTNkICUzZCAlM2QgJTNkICUyZCAlMmQgJTNkICUzZFxuIiwKKyAgICAgICAgICAgICAgICBpdGVtbGlzdFtpdGVtaV0sCisgICAgICAgICAgICAgICAgKGludClwdWJzW3B1Ymxpc3RbcHViaV1dW2l0ZW1saXN0W2l0ZW1pXV1bUF9WQUxVRV0sCisgICAgICAgICAgICAgICAgKGludClwdWJzW3B1Ymxpc3RbcHViaV1dW2l0ZW1saXN0W2l0ZW1pXV1bUF9IUF0sCisgICAgICAgICAgICAgICAgKGludClwdWJzW3B1Ymxpc3RbcHViaV1dW2l0ZW1saXN0W2l0ZW1pXV1bUF9TUF0sCisgICAgICAgICAgICAgICAgKGludClwdWJzW3B1Ymxpc3RbcHViaV1dW2l0ZW1saXN0W2l0ZW1pXV1bUF9EUklOS10sCisgICAgICAgICAgICAgICAgKGludClwdWJzW3B1Ymxpc3RbcHViaV1dW2l0ZW1saXN0W2l0ZW1pXV1bUF9BTENPSE9MXSwKKyAgICAgICAgICAgICAgICAoaW50KXB1YnNbcHVibGlzdFtwdWJpXV1baXRlbWxpc3RbaXRlbWldXVtQX0ZPT0RdLAorICAgICAgICAgICAgICAgIChpbnQpcHVic1twdWJsaXN0W3B1YmldXVtpdGVtbGlzdFtpdGVtaV1dWyJyYXRlIl0sCisgICAgICAgICAgICAgICAgKGludClwdWJzW3B1Ymxpc3RbcHViaV1dW2l0ZW1saXN0W2l0ZW1pXV1bIm1heHJhdGUiXSwKKyAgICAgICAgICAgICAgICAoaW50KXB1YnNbcHVibGlzdFtwdWJpXV1baXRlbWxpc3RbaXRlbWldXVsibWF4c2V0Il0sCisgICAgICAgICAgICAgICAgKGludClwdWJzW3B1Ymxpc3RbcHViaV1dW2l0ZW1saXN0W2l0ZW1pXV1bIm1heGhlYWwiXSApKTsKKyAgICAgICAgRFVNUEYoIlxuIik7CisgICAgfQorICAgIHJldHVybiBzaXplb2YocHVibGlzdCk7Cit9CisKKy8vIGJlcmVpbmlndCBkaWUgS25laXBlbmxpc3RlIHZvbiBhbGxlbiBLbmVpcGVuLCBkaWUgYXVmIGRlciBQbGF0dGUgbmljaHQgbWVocgorLy8gZXhpc3RpZXJlbi4KK3B1YmxpYyB2b2lkIENsZWFuUHVibGlzdCgpIHsKKyAgZm9yZWFjaChzdHJpbmcgcHViOiBwdWJzKSB7CisgICAgaWYgKGZpbGVfc2l6ZShwdWIrIi5jIikgPD0gMCkKKyAgICAgIG1fZGVsZXRlKHB1YnMscHViKTsKKyAgfQorICBzYXZlX2RhdGEoKTsKK30KKwpkaWZmIC0tZ2l0IGEvc2VjdXJlL3F1ZXN0bWFzdGVyLmMgYi9zZWN1cmUvcXVlc3RtYXN0ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTRhOTdiCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3F1ZXN0bWFzdGVyLmMKQEAgLTAsMCArMSwxMTc0IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gcXVlc3RtYXN0ZXIuYyAtLSBRdWVzdG1hc3RlciwgdmVyd2FsdGV0IGRpZSBub3JtYWxlbiBRdWVzdHMgdW5kCisvLyAgICAgICAgICAgICAgICAgIGRpZSBNaW5pUXVlc3RzCisvLworLy8gJElkOiBxdWVzdG1hc3Rlci5jIDkxMzYgMjAxNS0wMi0wMyAyMTozOToxMFogWmVzc3RyYSAkCisvLworI3ByYWdtYSBzdHJpY3RfdHlwZXMKKyNwcmFnbWEgbm9fY2xvbmUKKyNwcmFnbWEgbm9fc2hhZG93CisjcHJhZ21hIG5vX2luaGVyaXQKKyNwcmFnbWEgdmVyYm9zZV9lcnJvcnMKKyNwcmFnbWEgY29tYmluZV9zdHJpbmdzCisvLyNwcmFnbWEgcGVkYW50aWMKKy8vI3ByYWdtYSByYW5nZV9jaGVjaworI3ByYWdtYSB3YXJuX2RlcHJlY2F0ZWQKKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgIi9zZWN1cmUvd2l6bGV2ZWxzLmgiCisjaW5jbHVkZSAiL3NlY3VyZS9xdWVzdG1hc3Rlci5oIgorI2luY2x1ZGUgIi9zZWN1cmUvbGVwbWFzdGVyLmgiCisjaW5jbHVkZSAiL3NlY3VyZS90ZWxuZXRuZWcuaCIgLy8gUF9UVFkKKyNpbmNsdWRlIDxsaXZpbmcvZGVzY3JpcHRpb24uaD4gLy8gUF9MRVZFTAorI2luY2x1ZGUgPHBsYXllci9iYXNlLmg+IC8vIFBfVEVTVFBMQVlFUgorI2luY2x1ZGUgPGRhZW1vbi5oPgorI2luY2x1ZGUgPGFuc2kuaD4KKyNpbmNsdWRlIDxldmVudHMuaD4KKworI2RlZmluZSBERUJVRyh4KSBpZiAoZnVuY2FsbChzeW1ib2xfZnVuY3Rpb24oJ2ZpbmRfcGxheWVyKSwiYXJhdGhvcm4iKSlcCisgICAgICAgICAgdGVsbF9vYmplY3QoZnVuY2FsbChzeW1ib2xfZnVuY3Rpb24oJ2ZpbmRfcGxheWVyKSwiYXJhdGhvcm4iKSxcCisgICAgICAgICAgICAgICAgICAgICAgIlFNOiAiK3grIlxuIikKKworI2RlZmluZSBNRSB0aGlzX29iamVjdCgpCisjZGVmaW5lIFBMIHRoaXNfcGxheWVyKCkKKworI2RlZmluZSBNUV9EQVRBX1BPSU5UUyAwCisjZGVmaW5lIE1RX0RBVEFfUVVFU1ROTyAxCisjZGVmaW5lIE1RX0RBVEFfVEFTS0RFU0MgMgorI2RlZmluZSBNUV9EQVRBX1ZJU0lCTEUgMworI2RlZmluZSBNUV9EQVRBX0FDVElWRSA0CisjZGVmaW5lIE1RX0RBVEFfVElUTEUgNQorI2RlZmluZSBNUV9EQVRBX0RJQVJZVEVYVCA2CisjZGVmaW5lIE1RX0RBVEFfUkVTVFJJQ1RJT05TIDcKKyNkZWZpbmUgTVFfREFUQV9BU1NJR05FRF9ET01BSU4gOAorI2RlZmluZSBNUV9EQVRBX1FVRVJZX1BFUk1JVFRFRCA5CisKK3ByaXZhdGUgaW50IG1heF9RUCA9IDA7Citwcml2YXRlIGludCBvcHRfUVAgPSAwOworLy8gRGllIFF1ZXN0bGlzdGUgbWl0IGFsbGVuIERhdGVuCitwcml2YXRlIG1hcHBpbmcgcXVlc3RzID0gKFtdKTsKKworLy8gRGFzIE1hcHBpbmcgbWl0IGRlciBNUS1MaXN0ZSBhbiBzaWNoIHVuZCBhbGxlIHp1Z2Vob2VyaWdlbiBEYXRlbgorcHJpdmF0ZSBtYXBwaW5nIG1pbmlxdWVzdHMgPSAoW10pOworLy8gTmFjaCBNUS1OdW1tZXJuIGluZGl6aWVydGVyIENhY2hlOgorLy8gU3RydWt0dXIgKFtpbnQgbnVtIDogKHsgaW50IHN0dXBzZSwgc3RyaW5nIG1xLW9iamVjdCB9KSBdKQorcHJpdmF0ZSBub3NhdmUgbWFwcGluZyBieV9udW0gPSAoW10pOworLy8gQ2FjaGUgZGVyIE9iamVrdGUsIGRpZSBkaWUgTVEtTGlzdGVuIGRlciBSZWdpb25lbiBhYmZyYWdlbiBkdWVyZmVuCisvLyBTdHJ1a3R1ciAoW3N0cmluZyBwYXRoIDogKHsgc3RyaW5nIG1xX29iamVjdCB9KSBdKQorcHJpdmF0ZSBub3NhdmUgbWFwcGluZyBtcV9xdWVyeV9wZXJtaXR0ZWQgPSAoW10pOworLy8gQ2FjaGUgZnVlciBkaWUgTVEtUHVua3RlIHZvbiBTcGllbGVybiwgd2lyZCBmdWVyIGRlbiBqZXdlaWxpZ2VuIFNwaWVsZXIKKy8vIGJlaW0gQWJmcmFnZW4gdm9uIGRlc3NlbiBNUS1QdW5rdGVuIGdlZnVlbGx0LiBTcGllbGVybmFtZSB3aXJkIGJlaQorLy8gQWVuZGVydW5nZW4gYW4gc2VpbmVuIE1RLVB1bmt0ZW4gKEJlc3RlaGVuIGVpbmVyIE1RLCBtYW51ZWxsZXMgU2V0emVuCisvLyBvZGVyIExvZXNjaGVuIGVpbmVyIHNlaW5lciBNUXMpIGF1cyBkZW0gQ2FjaGUgYXVzZ2V0cmFnZW4KK3ByaXZhdGUgbm9zYXZlIG1hcHBpbmcgdXNlcnNfbXEgPSAoW10pOworLy8gbGV0enRlIHZlcmdlYmVuZSBNUS1JbmRleG51bW1lci4gRXMgZGFyZiBuaWVtYWxzIGVpbmUgTVEgZWluZSBJbmRleG51bW1lcgorLy8ga3JpZWdlbiwgZGllIGVpbmUgYW5kZXJlIE1RIHNjaG9ubWFsIGhhdHRlLCBhdWNoIHdlbm4gZGllIGdlbG9lc2NodCB3dXJkZS4KKy8vIChadW1pbmRlc3QgbmljaHQsIG9obmUgZGllIGVudHNwcmVjaGVuZGVuIEJpdHMgaW0gU3BpZWxlciB6dSBsb2VzY2hlbiwgd2FzCisvLyB6WiBuaWNodCBwYXNzaWVydC4KK3ByaXZhdGUgaW50IGxhc3RfbnVtID0gMDsKKworCit2b2lkIHNhdmVfaW5mbygpIHsKKyAgc2F2ZV9vYmplY3QoUVVFU1RTKTsKK30KKworLy8gQ2FjaGVzIGF1ZmJhdWVuLgorc3RhdGljIHZvaWQgbWFrZV9udW0oc3RyaW5nIG1xb2JfbmFtZSwgaW50IHN0dXBzZSwgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHRhc2tkZXNjLCBpbnQgdmlzLCBpbnQgYWN0aXZlLCBzdHJpbmcgdGl0bGUsCisgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZG9uZWRlc2MsIG1hcHBpbmcgcmVzdHIsIHN0cmluZyBkb21haW4sIAorICAgICAgICAgICAgICAgICAgICAgc3RyaW5nICpwZXJtaXR0ZWRfb2JqcykgeworICBieV9udW0gKz0gKFsgaW5kZXggOiAoe3N0dXBzZSwgbXFvYl9uYW1lfSldKTsKKyAgZm9yZWFjaCAoIHN0cmluZyBvYmo6IHBlcm1pdHRlZF9vYmpzICkgeworICAgIGlmICggbWVtYmVyKG1xX3F1ZXJ5X3Blcm1pdHRlZCwgb2JqKSApCisgICAgICBtcV9xdWVyeV9wZXJtaXR0ZWRbb2JqXSArPSAoe21xb2JfbmFtZX0pOworICAgIGVsc2UKKyAgICAgIG1xX3F1ZXJ5X3Blcm1pdHRlZFtvYmpdID0gKHttcW9iX25hbWV9KTsKKyAgfQorfQorCit2b2lkIGNyZWF0ZSgpIHsKKyAgc2V0ZXVpZChnZXR1aWQoTUUpKTsKKyAgaWYgKCFyZXN0b3JlX29iamVjdChRVUVTVFMpKSB7CisgICAgc2F2ZV9pbmZvKCk7CisgIH0KKworICB3YWxrX21hcHBpbmcobWluaXF1ZXN0cywgIydtYWtlX251bSAvKicqLyApOworICBzZXRfbmV4dF9yZXNldCg0MzIwMCk7IC8vIFJlc2V0IGFsbGUgMTIgU3R1bmRlbi4KKyAgRVZFTlRELT5SZWdpc3RlckV2ZW50KEVWVF9MSUJfUVVFU1RfU09MVkVELCJIYW5kbGVRdWVzdFNvbHZlZCIsCisgICAgICBNRSk7Cit9CisKK3B1YmxpYyBpbnQgcmVtb3ZlKGludCBzaWxlbnQpIHsKKyAgc2F2ZV9pbmZvKCk7CisgIEVWRU5URC0+VW5yZWdpc3RlckV2ZW50KEVWVF9MSUJfUVVFU1RfU09MVkVELCBNRSk7CisgIGRlc3RydWN0KE1FKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vIFNjaHJlaWJ6dWdyaWZmIG51ciBmdWVyIGludGVyYWt0aXZlIEVNcyB1bmQgQVJDSF9TRUNVUklUWS4KK3ByaXZhdGUgaW50IGFsbG93ZWRfd3JpdGVfYWNjZXNzKCkgeworICBpZiAocHJvY2Vzc19jYWxsKCkpCisgICAgcmV0dXJuIDA7CisgIGlmIChBUkNIX1NFQ1VSSVRZKSAgLy8gcHJ1ZWZ0IGF1Y2ggdGhpc19pbnRlcmFjdGl2ZSgpIG1pdC4KKyAgICByZXR1cm4gMTsKKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgcmVzZXQoKSB7CisgIGJ5X251bSA9IChbXSk7CisgIG1xX3F1ZXJ5X3Blcm1pdHRlZCA9IChbXSk7CisgIHdhbGtfbWFwcGluZyhtaW5pcXVlc3RzLCAjJ21ha2VfbnVtIC8qJyovICk7CisgIHNldF9uZXh0X3Jlc2V0KDQzMjAwKTsKK30KKworLyoKKyAqICgxKSBBQlNDSE5JVFQgIk5PUk1BTEUgUVVFU1RTIgorICovCisKKy8qIERpZSBRdWVzdHMgd2VyZGVuIGluIGVpbmVtIE1hcHBpbmcgZ2VzcGVpY2hlcnQuIERlciBTY2hsdWVzc2VsIGlzdCBkYWJlaSBkZXIKKyAgIFF1ZXN0LU5hbWUsIGRpZSBFaW50cmFlZ2Ugc2luZCBBcnJheXMgZGVyIGZvbGdlbmRlbiBGb3JtOgorCisgICAxLiBFbGVtZW50IGlzdCBkaWUgWmFobCBkZXIgZHVyY2ggZGllc2UgUXVlc3QgenUgZXJ3ZXJiZW5kZW4gUXVlc3RwdW5rdGUuCisgICAyLiBFbGVtZW50IGlzdCBkaWUgWmFobCBkZXIgRXJmYWhydW5nc3B1bmt0ZSwgZGllIGRlciBTcGllbGVyIGJla29tbXQsCisgICAgICB3ZW5uIGVyIGRpZXNlIFF1ZXN0IGxvZXN0LgorICAgMy4gRWxlbWVudCBpc3QgZWluIEFycmF5IG1pdCBkZW4gRmlsZW5hbWVuIGRlciBPYmpla3RlLCBkZW5lbiBlcyBnZXN0YXR0ZXQKKyAgICAgIGlzdCwgZGllc2UgUXVlc3QgYmVpbSBQbGF5ZXIgYWxzIGdlbG9lc3QgenUgbWFya2llcmVuIChFcnptYWdpZXIgZHVlcmZlbgorICAgICAgZGFzIGFiZXIgc293aWVzbyBpbW1lcikuCisgICA0LiBFbGVtZW50IGlzdCBlaW4gU3RyaW5nLCBkZXIgZGllIFF1ZXN0IGt1cnogYmVzY2hyZWlidC4gRGllc2VyIFN0cmluZyB3aXJkCisgICAgICBkZW0gU3BpZWxlciB2b20gT3Jha2VsIGFscyBIaW53ZWlzIGdlZ2ViZW4uCisgICA1LiBFbGVtZW50IGlzdCBlaW5lIFphaGwgendpc2NoZW4gLTEgdW5kIDEwMCwgZGllIGRlbiBTY2h3aWVyaWdrZWl0c2dyYWQgZGVyCisgICAgICBRdWVzdCBhbmdpYnQsIG5hY2ggRWluc2NoYWV0enVuZyBkZXMgRU0gZnVlciBRdWVzdHMuIERhcyBPcmFrZWwga2FubiBkYW5uCisgICAgICBldnRsLiBzaW5uaWdlIFNhZXR6ZSB3aWUgIkRpZXNlIFF1ZXN0IGVyc2NoZWludCBtaXIgYWJlciBub2NoIHJlY2h0CisgICAgICBzY2h3ZXIgZnVlciBEaWNoLiIsIG9kZXIgIkhtLCBkaWUgaGFldHRlc3QgRHUgamEgc2Nob24gdmllbCBlaGVyIGxvZXNlbgorICAgICAga29lbm5lbi4iIGFic29uZGVybi4gOikKKworICAgICAgRWluIFdlcnQgdm9uIC0xIGJlZGV1dGV0IGVpbmUgU2VoZXJxdWVzdC4gRGllc2UgemFlaGx0IG5pY2h0IHp1IGRlbgorICAgICAgTWF4aW1hbGVuIFF1ZXN0cHVua3Rlbiwgc29uZGVybiB6YWVobHQgYWxzIG9wdGlvbmFsZSBRdWVzdAorICAgNi4gRWxlbWVudCBpc3QgZWluIEludGVnZXIgdm9uIDAgYmlzIDUgdW5kIGdpYnQgZGllICJLbGFzc2UiIGFuOworICAgICAgYXVzZ2VnZWJlbiB3ZXJkZW4gZG9ydCBTdGVybmNoZW4KKyAgIDcuIEVsZW1lbnQgaXN0IGVpbiBJbnRlZ2VyLCAwIG9kZXIgMS4KKyAgICAgIDA6IFF1ZXN0IHZvcnVlYmVyZ2VoZW5kIGRlYWt0aXZpZXJ0IChzdXNwZW5kaWVydCkKKyAgICAgIDE6IFF1ZXN0IGFrdGl2aWVydAorICAgOC4gRWxlbWVudCBpc3QgZWluIFN0cmluZyB1bmQgZW50aGFlbHQgZGVuIE5hbWVuIGRlcyBNYWdpZXJzLCBkZXIgZGllCisgICAgICBRdWVzdCAidmVyYnJvY2hlbiIgaGF0LgorICAgOS4gRWxlbWVudCBpc3QgZWluIFN0cmluZywgZGVyIGRlbiBOYW1lbiBlaW5lcyBNYWdpZXJzIGVudGhhZWx0LCBkZXIKKyAgICAgIGV2dGwuIGZ1ZXIgZGllIFdhcnR1bmcgZGVyIFF1ZXN0IHp1c3RhZW5kaWcgaXN0LgorICAxMC4gRWxlbWVudCBpc3QgZWluZSBaYWhsIHZvbiAwIGJpcyA0LCBkaWUgZGVyIFF1ZXN0IGVpbiBBdHRyaWJ1dAorICAgICAgZ2lidCAoMCBmdWVyIGtlaW5lcykKKyovCisKKy8vIGdlYWVuZGVydDoKKy8vIDUgID09IGRpZmYgZ2VodCBudW4gdm9uIC0xIGJpcyAxMDAKKy8vIDYgID09IGtsYXNzZSBnZWh0IG51biB2b24gMCBiaXMgNQorLy8gMTAgPT0gYXR0cmlidXQgZ2VodCBudW4gdm9uIDAgYmlzIDQKKworcHJpdmF0ZSBpbnQgUmVjYWxjdWxhdGVRUCgpIHsKKyAgaW50IGk7CisgIG1peGVkIHEsbjsKKworICBpZiAoIWFsbG93ZWRfd3JpdGVfYWNjZXNzKCkpCisgICAgcmV0dXJuIC0xOworCisgIG1heF9RUD0wOworICBvcHRfUVA9MDsKKworICBuPW1faW5kaWNlcyhxdWVzdHMpOworICBxPW1fdmFsdWVzKHF1ZXN0cyk7CisgICAgZm9yIChpPXNpemVvZihxKS0xO2k+PTA7aS0tKQorICAgICAgaWYgKHFbaV1bUV9BQ1RJVkVdKSB7CisgICAgICAgIGlmIChxW2ldW1FfRElGRl0+PTApCisgICAgICAgICAgbWF4X1FQKz1xW2ldW1FfUVBdOworICAgICAgICBpZiAocVtpXVtRX0RJRkZdPT0tMSkKKyAgICAgICAgICBvcHRfUVArPXFbaV1bUV9RUF07CisgICAgICB9CisKKyAgcmV0dXJuIG1heF9RUCtvcHRfUVA7Cit9CisKK2ludCBBZGRRdWVzdChzdHJpbmcgbmFtZSwgaW50IHF1ZXN0cG9pbnRzLCBpbnQgZXhwZXJpZW5jZSwKKyAgICAgIHN0cmluZyAqYWxsb3dlZG9iaiwgc3RyaW5nIGhpbnQsIGludCBkaWZmaWN1bHR5LCBpbnQgcXVlc3RjbGFzcywKKyAgICAgIGludCBhY3RpdmUsIHN0cmluZyB3aXosIHN0cmluZyBzY25kd2l6LCBpbnQgcXVlc3RhdHRyaWJ1dGUpCit7CisgIG1peGVkICpxdWVzdDsKKyAgaW50IGk7CisKKyAgaWYgKCFhbGxvd2VkX3dyaXRlX2FjY2VzcygpKSByZXR1cm4gMDsKKyAgaWYgKCFzdHJpbmdwKG5hbWUpIHx8IHNpemVvZihuYW1lKTw1KSByZXR1cm4gLTE7CisgIGlmIChxdWVzdHBvaW50czwxKSByZXR1cm4gLTI7CisgIGlmICghaW50cChleHBlcmllbmNlKSkgcmV0dXJuIC0zOworICBpZiAoIXBvaW50ZXJwKGFsbG93ZWRvYmopKSByZXR1cm4gLTQ7CisgIGZvciAoaT1zaXplb2YoYWxsb3dlZG9iaiktMTtpPj0wO2ktLSkKKyAgICB7CisgICAgICBpZiAoIXN0cmluZ3AoYWxsb3dlZG9ialtpXSkgfHwgYWxsb3dlZG9ialtpXT09IiIpIHJldHVybiAtNDsKKyAgICAgIGFsbG93ZWRvYmpbaV09KHN0cmluZykiL3NlY3VyZS9tYXN0ZXIiLT5fZ2V0X3BhdGgoYWxsb3dlZG9ialtpXSwwKTsKKyAgICB9CisgIGlmICghc3RyaW5ncChoaW50KSB8fCBoaW50PT0iIikgcmV0dXJuIC01OworICBpZiAoZGlmZmljdWx0eTwtMSB8fCBkaWZmaWN1bHR5PjEwMCkgcmV0dXJuIC02OworICBpZiAocXVlc3RjbGFzczwwIHx8IHF1ZXN0Y2xhc3M+NSkgcmV0dXJuIC0xMTsKKyAgaWYgKGFjdGl2ZTwwIHx8IGFjdGl2ZT4xKSByZXR1cm4gLTc7CisgIGlmICghc3RyaW5ncCh3aXopIHx8IHdpej09IiIgfHwKKyAgICAgIGZpbGVfc2l6ZSgiL3BsYXllcnMvIisod2l6PWxvd2VyX2Nhc2Uod2l6KSkpICE9IC0yKSByZXR1cm4gLTg7CisgIGlmICghc3RyaW5ncChzY25kd2l6KSkKKyAgICBzY25kd2l6PSIiOworICBlbHNlIGlmIChmaWxlX3NpemUoIi9wbGF5ZXJzLyIrKHNjbmR3aXo9bG93ZXJfY2FzZShzY25kd2l6KSkpICE9IC0yKQorICAgIHJldHVybiAtOTsKKyAgaWYgKHF1ZXN0YXR0cmlidXRlPDAgfHwgcXVlc3RhdHRyaWJ1dGU+NCkKKyAgICByZXR1cm4gLTEwOworCisgIGlmKHF1ZXN0c1tuYW1lXSYmKHF1ZXN0c1tuYW1lXVs1XT09MHx8cXVlc3RzW25hbWVdWzVdPT0xKSYmcXVlc3RzW25hbWVdWzZdKQorICAgIG1heF9RUC09cXVlc3RzW25hbWVdWzBdOworCisgIHF1ZXN0cys9KFtuYW1lOiAoe3F1ZXN0cG9pbnRzLGV4cGVyaWVuY2UsYWxsb3dlZG9iaixoaW50LGRpZmZpY3VsdHksCisgICAgICAgICAgICAgICAgICAgIHF1ZXN0Y2xhc3MsYWN0aXZlLHdpeiwgc2NuZHdpeixxdWVzdGF0dHJpYnV0ZSwKKyAgICAgICAgICAgICAgICAgICAgKHswLjAsMH0pIH0pIF0pOworICBSZWNhbGN1bGF0ZVFQKCk7CisgIHNhdmVfaW5mbygpOworICBRTUxPRyhzcHJpbnRmKCJhZGQ6ICVzICVPICglcykiLG5hbWUscXVlc3RzW25hbWVdLAorICAgICAgICAgICAgICAgIGdldHVpZCh0aGlzX2ludGVyYWN0aXZlKCkpKSk7CisgIHJldHVybiAxOworfQorCitpbnQgUmVtb3ZlUXVlc3Qoc3RyaW5nIG5hbWUpIHsKKyAgbWl4ZWQgKnF1ZXN0OworCisgIGlmICghYWxsb3dlZF93cml0ZV9hY2Nlc3MoKSkgcmV0dXJuIDA7CisgIGlmICghcXVlc3RzW25hbWVdKSByZXR1cm4gLTE7CisgIFFNTE9HKHNwcmludGYoInJlbW92ZTogJXMgJU8gKCVzKSIsbmFtZSxxdWVzdHNbbmFtZV0sCisgICAgICAgICAgICAgICAgZ2V0dWlkKHRoaXNfaW50ZXJhY3RpdmUoKSkpKTsKKyAgbV9kZWxldGUocXVlc3RzLG5hbWUpOworICBSZWNhbGN1bGF0ZVFQKCk7CisgIHNhdmVfaW5mbygpOworICByZXR1cm4gMTsKK30KKworaW50IFF1ZXJ5TmVlZGVkUVAoKSB7CisgIHJldHVybiBSRVFfUVA7Cit9CisKK2ludCBRdWVyeU1heFFQKCkgeworICByZXR1cm4gbWF4X1FQOworfQorCitpbnQgUXVlcnlPcHRRUCgpIHsKKyAgcmV0dXJuIG9wdF9RUDsKK30KKworaW50IFF1ZXJ5VG90YWxRUCgpIHsKKyAgcmV0dXJuIG1heF9RUCtvcHRfUVA7Cit9CisKK21peGVkICpRdWVyeUdyb3VwZWRLZXlzKCkgeworICBzdHJpbmcgKnFsaXN0ZTsKKyAgbWl4ZWQgICpxZ2xpc3RlOworICBpbnQgaSwgajsKKworICBxZ2xpc3RlID0gYWxsb2NhdGUoc2l6ZW9mKFFHUk9VUFMpKzEpOyAvLyBsZXR6dGUgR3J1cHBlIHNpbmQgZGllIFNlaGVycXVlc3RzCisgIHFsaXN0ZSA9IG1faW5kaWNlcyhxdWVzdHMpOworCisgIGZvciAoaT1zaXplb2YocWdsaXN0ZSktMTtpPj0wO2ktLSkKKyAgICBxZ2xpc3RlW2ldPSh7fSk7CisKKyAgZm9yIChpPXNpemVvZihxbGlzdGUpLTE7aT49MDtpLS0pCisgICAgeworICAgICAgLy8gaW5ha3RpdmUgcXVlc3Q/CisgICAgICBpZiAoIXF1ZXN0c1txbGlzdGVbaV1dW1FfQUNUSVZFXSkKKyAgICAgICAgY29udGludWU7CisgICAgICAvLyBvcHRpb25hbGUgcXVlc3Q/IGFsc28gU2VoZXJxdWVzdAorICAgICAgICBpZiAocXVlc3RzW3FsaXN0ZVtpXV1bUV9ESUZGXT09LTEpCisgICAgICAgICAgcWdsaXN0ZVtzaXplb2YoUUdST1VQUyldICs9ICh7cWxpc3RlW2ldfSk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgIC8vIGRhbm4gaGFiZW4gd2lyIGFsc28gZWluZSBub3JtYWxlIFF1ZXN0IHVuZCBkYWhlciBFaW5vcmRudW5nCisgICAgICAgICAgLy8gbmFjaCBkZW0gU2Nod2llcmlna2VpdHN3ZXJ0CisgICAgICAgICAgZm9yIChqPXNpemVvZihRR1JPVVBTKS0xOworICAgICAgICAgICAgICAgaj49MCAmJiBRR1JPVVBTW2pdPj1xdWVzdHNbcWxpc3RlW2ldXVtRX0RJRkZdO2otLSkKKyAgICAgICAgICAgIDsKKyAgICAgICAgICBxZ2xpc3RlW2pdICs9ICh7cWxpc3RlW2ldfSk7CisgICAgICAgIH0KKyAgICB9CisgIHJldHVybiBxZ2xpc3RlOworfQorCisKKy8vIGZvbGdlbmRlIGZ1bmsgYnJhdWNoIGljaCBnbGF1YmUgaWNoIG5pY2h0IG1laHI6CitpbnQgUXVlcnlEb250bmVlZChvYmplY3QgcGwpIHsKKyAgcmFpc2VfZXJyb3IoIkljaCBnbGF1YiwgZGllIEZ1bmMgUXVlcnlEb250bmVlZCgpIGJyYXVjaHQga2VpbiBNZW5zY2ggbWVoci4gIgorICAiKFpvb2spIik7Cit9CisKKy8vIERpZSBmb2xnZW5kZSBGdW5jIGJyYXVjaHQgbWFuIG5pY2h0IG1laHIKK2ludCBRdWVyeVJlYWR5Rm9yV2l6KG9iamVjdCBwbGF5ZXIpIHsKKyAgcmFpc2VfZXJyb3IoIkRpZSBGdW5jIFF1ZXJ5UmVhZHlGb3JXaXooKSBicmF1Y2h0IGtlaW5lciBtZWhyLiAoWm9vaykiKTsKK30KKworbWl4ZWQgKlF1ZXJ5UXVlc3Qoc3RyaW5nIG5hbWUpIHsKKyAgaWYoIXF1ZXN0c1tuYW1lXSkKKyAgICByZXR1cm4gKHt9KTsKKyAgaWYoIGV4dGVybl9jYWxsKCkgKQorICAgIHJldHVybiBkZWVwX2NvcHkoIHF1ZXN0c1tuYW1lXSApOworICByZXR1cm4gcXVlc3RzW25hbWVdOworfQorCitpbnQgUXVlcnlRdWVzdFBvaW50cyhzdHJpbmcgbmFtZSkgeworICBpZiggIXF1ZXN0c1tuYW1lXSApCisgICAgcmV0dXJuIC0xOworCisgIHJldHVybiBxdWVzdHNbbmFtZV1bUV9RUF07Cit9CisKK21peGVkICpRdWVyeVF1ZXN0cygpIHsKKyAgaWYoIGV4dGVybl9jYWxsKCkgKQorICAgIHJldHVybiAoe21faW5kaWNlcyhxdWVzdHMpLG1hcChtX3ZhbHVlcyhxdWVzdHMpLCMnZGVlcF9jb3B5IC8qJyovKX0pOworICByZXR1cm4gKHsgbV9pbmRpY2VzKHF1ZXN0cyksIG1fdmFsdWVzKHF1ZXN0cykgfSk7Cit9CisKK3N0cmluZyAqUXVlcnlBbGxLZXlzKCkgeworICByZXR1cm4gbV9pbmRpY2VzKHF1ZXN0cyk7Cit9CisKK2ludCBTZXRBY3RpdmUoc3RyaW5nIG5hbWUsIGludCBmbGFnKSB7CisgIG1peGVkICpxdWVzdDsKKworICBpZiAoIWFsbG93ZWRfd3JpdGVfYWNjZXNzKCkpIHJldHVybiAwOworICBpZiAoIShxdWVzdD1xdWVzdHNbbmFtZV0pKSByZXR1cm4gLTE7CisgIHN3aXRjaChmbGFnKQorICAgIHsKKyAgICBjYXNlIDA6CisgICAgICBpZiAocXVlc3RbUV9BQ1RJVkVdID09IGZsYWcpCisgICAgICAgIHJldHVybiAtMjsKKyAgICAgIHF1ZXN0W1FfQUNUSVZFXSA9IGZsYWc7CisgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICBpZiAocXVlc3RbUV9BQ1RJVkVdID09IGZsYWcpCisgICAgICAgIHJldHVybiAtMjsKKyAgICAgIHF1ZXN0W1FfQUNUSVZFXSA9IGZsYWc7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIC0zOworICAgIH0KKyAgcXVlc3RzW25hbWVdPXF1ZXN0OworICBSZWNhbGN1bGF0ZVFQKCk7CisgIHNhdmVfaW5mbygpOworICBRTUxPRyhzcHJpbnRmKCIlczogJXMgKCVzKSIsKGZsYWc/ImFjdGl2YXRlIjoiZGVhY3RpdmF0ZSIpLG5hbWUsCisgICAgICAgICAgICAgICAgZ2V0dWlkKHRoaXNfaW50ZXJhY3RpdmUoKSkpKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0cmluZyBuYW1lKCkgeworICByZXR1cm4gIjxRdWVzdD4iOworfQorc3RyaW5nIE5hbWUoKSB7CisgIHJldHVybiAiPFF1ZXN0PiI7Cit9CisKK3ZvaWQgQ2hhbm5lbChzdHJpbmcgbXNnKSB7CisgIGlmKCFpbnRlcmFjdGl2ZShwcmV2aW91c19vYmplY3QoKSkpCisgICAgcmV0dXJuOworICBjYXRjaChDSE1BU1RFUi0+c2VuZCgiQWJlbnRldWVyIiwgTUUsIG1zZyk7cHVibGlzaCk7Cit9CisKKyAvKiBxdW90ZWQgZnJvbSAvc3lzL21haWwuaDogKi8KKyNkZWZpbmUgTVNHX0ZST00gMAorI2RlZmluZSBNU0dfU0VOREVSIDEKKyNkZWZpbmUgTVNHX1JFQ0lQSUVOVCAyCisjZGVmaW5lIE1TR19DQyAzCisjZGVmaW5lIE1TR19CQ0MgNAorI2RlZmluZSBNU0dfU1VCSkVDVCA1CisjZGVmaW5lIE1TR19EQVRFIDYKKyNkZWZpbmUgTVNHX0lEIDcKKyNkZWZpbmUgTVNHX0JPRFkgOAorCit2b2lkIFNlbmRNYWlsKHN0cmluZyBxdWVzdG5hbWUsIG1peGVkICpxdWVzdCwgb2JqZWN0IHBsYXllcikgeworICBtaXhlZCogbWFpbDsKKyAgc3RyaW5nIHRleHQ7CisKKyAgbWFpbCA9IGFsbG9jYXRlKDkpOworCisgIHRleHQgPQorICAgICJIYWxsbyAiK2NhcGl0YWxpemUoZ2V0dWlkKHBsYXllcikpKyIsXG5cbiIrCisgICAgYnJlYWtfc3RyaW5nKCJOYWNoZGVtIER1IGdlcmFkZSBlYmVuIGRhcyBBYmVudGV1ZXIgJyIrCisgICAgICAgICAgICAgICAgIHF1ZXN0bmFtZSArIicgKCIrcXVlc3RbUV9RUF0rIiBQdW5rdGUpLCBkYXMgIisKKyAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShxdWVzdFtRX1dJWl0pKyIgZnVlciBkYXMgIk1VRE5BTUUiIGVudHdvcmZlbiBoYXQsICIKKyAgICAgICAgICAgICAgICAgIm1pdCBFcmZvbGcgYmVzdGFuZGVuIGhhc3QsIHNpbmQgIgorICAgICAgICAgICAgICAgICAid2lyIG51biBhbiBEZWluZXIgTWVpbnVuZyBkYXp1IGludGVyZXNzaWVydDoiLCA3OCkrCisgICAgIlxuICBIYXQgRGlyIGRhcyBBYmVudGV1ZXIgZ2VmYWxsZW4gdW5kIHdpZXNvIGJ6dy4gd2llc28gbmljaHQ/XG4iCisgICAgIiAgSXN0IGRpZSBFaW5zdHVmdW5nIERlaW5lciBNZWludW5nIG5hY2ggcmljaHRpZz8gKEFQIHVuZCBTdHVmZSlcbiIKKyAgICAiICBHYWIgZXMgUHJvYmxlbWUgb2RlciBnYXIgRmVobGVyP1xuIgorICAgICIgIEhhc3QgRHUgVmVyYmVzc2VydW5nc3ZvcnNjaGxhZWdlP1xuXG4iOworCisgIHRleHQgKz0gYnJlYWtfc3RyaW5nKCJEaWVzZSBOYWNocmljaHQgd3VyZGUgYXV0b21hdGlzY2ggdmVyc2NoaWNrdCwgIgorICAgICAgICAid2VubiBEdSBtaXQgZGVtICdyJyBLb21tYW5kbyBkYXJhdWYgYW50d29ydGVzdCwgZ2VodCBkaWUgQW50d29ydCAiCisgICAgICAgICJkaXJla3QgYW4gQXJrIGFscyB6dXN0YWVuZGlnZW0gRXJ6bWFnaWVyIGZ1ZXIgQWJlbnRldWVyLlxuIiw3OCk7CisKKyAgaWYgKHF1ZXN0W1FfU0NORFdJWl0hPSIiKSB7CisgICAgdGV4dCArPSBicmVha19zdHJpbmcoCisgICAgICAgICJGYWxscyBEdSBtaXQgZGVtIE1hZ2llciBzcHJlY2hlbiB3aWxsc3QsIGRlciB6dXIgWmVpdCBkYXMgIgorICAgICAgICAiQWJlbnRldWVyIHRlY2huaXNjaCBiZXRyZXV0LCBrYW5uc3QgRHUgRGljaCBhbiAiCisgICAgICAgICtjYXBpdGFsaXplKHF1ZXN0W1FfU0NORFdJWl0pKyAiIHdlbmRlbi4iLDc4KTsKKyAgfQorCisgIG1haWxbTVNHX0ZST01dID0gIkFyayI7CisgIG1haWxbTVNHX1NFTkRFUl0gPSAiQXJrIjsKKyAgbWFpbFtNU0dfUkVDSVBJRU5UXSA9IGdldHVpZChwbGF5ZXIpOworICBtYWlsW01TR19DQ109MDsKKyAgbWFpbFtNU0dfQkNDXT0wOworICBtYWlsW01TR19TVUJKRUNUXT0iRGFzIEFiZW50ZXVlcjogIitxdWVzdG5hbWU7CisgIG1haWxbTVNHX0RBVEVdPWR0aW1lKHRpbWUoKSk7CisgIG1haWxbTVNHX0lEXT1NVUROQU1FIjoiK3RpbWUoKTsKKyAgbWFpbFtNU0dfQk9EWV09dGV4dDsKKworICAiL3NlY3VyZS9tYWlsZXIiLT5EZWxpdmVyTWFpbChtYWlsLDApOworICByZXR1cm47Cit9CisKK3N0YXRpYyBpbnQgY29tcGFyZSAobWl4ZWQgKmksIG1peGVkICpqKSB7CisgIGlmIChpWzRdID09IGpbNF0pCisgICAgcmV0dXJuIGlbMV0gPiBqWzFdOworICBlbHNlCisgICAgcmV0dXJuIGlbNF0gPiBqWzRdOworfQorCit2YXJhcmdzIHN0cmluZyBsaXN0ZShtaXhlZCBwbCkgeworICBpbnQgcWdyb3VwcywgaSwgaiwgcXJmdzsKKyAgbWl4ZWQgKnFsaXN0cywgKnFncm91cGVkLCAqcXRtcDsKKyAgc3RyaW5nIHN0cjsKKyAgc3RyaW5nIGphLCBuZWluLCBmb3JtYXQsIHVlYmVyc2NocmlmdDsKKworICBpZighb2JqZWN0cChwbCkpCisgICAgaWYoc3RyaW5ncChwbCkpCisgICAgICBwbD1maW5kX3BsYXllcihwbCkgfHwgZmluZF9uZXRkZWFkKHBsKTsKKyAgaWYoIW9iamVjdHAocGwpKQorICAgIHBsPVBMOworICBpZighb2JqZWN0cChwbCkpCisgICAgcmV0dXJuICJPaG5lIFNwaWVsZXJuYW1lbi9TcGllbGVyb2JqZWt0IGdpYnQgZXMgYXVjaCBrZWluZSBMaXN0ZS5cbiI7CisKKyAgaWYgKCAoKHN0cmluZylwbC0+UXVlcnlQcm9wKFBfVFRZKSkgPT0gImFuc2kiKQorICB7CisgICAgICBqYSA9IEFOU0lfR1JFRU4gKyAiamEiICsgQU5TSV9OT1JNQUw7CisgICAgICBuZWluID0gQU5TSV9SRUQgKyAibmVpbiIgKyBBTlNJX05PUk1BTDsKKyAgfQorICBlbHNlCisgIHsKKyAgICAgIGphID0gImphIjsKKyAgICAgIG5laW4gPSAibmVpbiI7CisgIH0KKworICBzdHIgPSAiIjsKKyAgLy8gRmVzdGxlZ2VuIGRlcyBBdXNnYWJlZm9ybWF0ZXMKKyAgZm9ybWF0ID0gIiU9LTozMHMgJTozZCAlLTo2cyAgJS06OXMgJToycy8lLTozcyAgJS06MTJzICUtc1xuIjsKKyAgdWViZXJzY2hyaWZ0ID0gc3ByaW50ZigiJS06MzBzICU6M3MgJS06NnMgICUtOjlzICUtOjZzICAlLToxMnMgJS06NHNcbiIsCisgICAgICAgICAgICAgICAgICJBYmVudGV1ZXIiLCAiQVAiLCAiS2xhc3NlIiwgIkF0dHJpYnV0IiwKKyAgICAgICAgICAgICAgICAgIlN0dWZlIiwgIkF1dG9yIiwgIkdlbD8iKTsKKworICBxZ3JvdXBzID0gc2l6ZW9mKFFHUk9VUFMpOworICBxbGlzdHMgPSBhbGxvY2F0ZSggcWdyb3VwcysxICk7CisgIGZvciggaT1xZ3JvdXBzOyBpPj0wOyBpLS0gKQorICAgIHFsaXN0c1tpXSA9ICh7fSk7CisKKyAgcWdyb3VwZWQgPSBRdWVyeUdyb3VwZWRLZXlzKCk7CisKKyAgZm9yIChpPXNpemVvZihxZ3JvdXBlZCktMTtpPj0wOyBpLS0pCisgICAgZm9yIChqPXNpemVvZihxZ3JvdXBlZFtpXSktMTtqPj0wOyBqLS0pIHsKKyAgICAgIHF0bXAgPSBRdWVyeVF1ZXN0KHFncm91cGVkW2ldW2pdKTsKKyAgICAgIHFsaXN0c1tpXSArPSAoeyAoeworICAgICAgICBxZ3JvdXBlZFtpXVtqXSwKKyAgICAgICAgcXRtcFtRX1FQXSwKKyAgICAgICAgUUNMQVNTX1NUQVJTKHF0bXBbUV9DTEFTU10pLAorICAgICAgICBjYXBpdGFsaXplKFFBVFRSX1NUUklOR1NbcXRtcFtRX0FUVFJdXSksCisgICAgICAgIHF0bXBbUV9ESUZGXSwKKyAgICAgICAgKHF0bXBbUV9BVkVSQUdFXVsxXT4xMCAvKiYmIElTX0FSQ0godGhpc19wbGF5ZXIoKSkqLworICAgICAgICAgICAgICAgICAgPyB0b19zdHJpbmcodG9faW50KHF0bXBbUV9BVkVSQUdFXVswXSkpCisgICAgICAgICAgICAgICAgICA6ICItIiksCisgICAgICAgIGNhcGl0YWxpemUocXRtcFtRX1dJWl0pLAorICAgICAgICAoaW50KXBsLT5RdWVyeVF1ZXN0KHFncm91cGVkW2ldW2pdKSA9PSBPSyA/IGphIDogbmVpbgorICAgICAgfSkgfSk7CisgICAgfQorCisgIGZvciggaT0wOyBpPHFncm91cHM7IGkrKyApCisgIHsKKyAgICBpZiAoc2l6ZW9mKHFsaXN0c1tpXSkpIHsKKyAgICAgIHN0ciArPSAiXG4iICsgdWViZXJzY2hyaWZ0OworICAgICAgc3RyICs9IHNwcmludGYoIlN0dWZlbiAlZCVzOlxuIiwKKyAgICAgICAgICAgICAgICAgICAgIFFHUk9VUFNbaV0rMSwKKyAgICAgICAgICAgICAgICAgICAgIGk9PXFncm91cHMtMT8iKyI6c3ByaW50ZigiLSVkIiwgUUdST1VQU1tpKzFdKSk7CisgICAgICBxbGlzdHNbaV0gPSBzb3J0X2FycmF5KCBxbGlzdHNbaV0sICJjb21wYXJlIiwgTUUgKTsKKyAgICAgIGZvciggaj0wOyBqPHNpemVvZihxbGlzdHNbaV0pOyBqKysgKSB7CisgICAgICAgIGlmKHFsaXN0c1tpXVtqXVtRX0RJRkZdPj0wKQorICAgICAgICAgIHN0ciArPSBzcHJpbnRmKCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHFsaXN0c1tpXVtqXVswXSwgcWxpc3RzW2ldW2pdWzFdLCBxbGlzdHNbaV1bal1bMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHFsaXN0c1tpXVtqXVszXSwgc3ByaW50ZigiJWQiLHFsaXN0c1tpXVtqXVs0XSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHFsaXN0c1tpXVtqXVs1XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcWxpc3RzW2ldW2pdWzZdLCBxbGlzdHNbaV1bal1bN10pOworICAgICAgfQorICAgICAgc3RyICs9ICJcblxuIjsKKyAgICB9CisgIH0KKworICBxbGlzdHNbcWdyb3Vwc10gPSBzb3J0X2FycmF5KHFsaXN0c1txZ3JvdXBzXSwgImNvbXBhcmUiLCBNRSk7CisgIGkgPSBxZ3JvdXBzOworICBpZiAoc2l6ZW9mKHFsaXN0c1tpXSkpIHsKKyAgICBzdHIgKz0gIlxuIiArIHVlYmVyc2NocmlmdDsKKyAgICBzdHIgKz0gIk51ciBmdWVyIFNlaGVyOlxuIjsKKyAgICBmb3IoIGo9MDsgajxzaXplb2YocWxpc3RzW3Fncm91cHNdKTsgaisrICkgIHsKKyAgICAgIGlmKHFsaXN0c1tpXVtqXVtRX0RJRkZdPT0tMSkKKyAgICAgICAgc3RyICs9IHNwcmludGYoIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHFsaXN0c1tpXVtqXVswXSwgcWxpc3RzW2ldW2pdWzFdLCBxbGlzdHNbaV1bal1bMl0sCisgICAgICAgICAgICAgICAgICAgICAgICBxbGlzdHNbaV1bal1bM10sICJTIiwgcWxpc3RzW2ldW2pdWzVdLAorICAgICAgICAgICAgICAgICAgICAgICAgcWxpc3RzW2ldW2pdWzZdLAorICAgICAgICAgICAgICAgICAgICAgICAgcWxpc3RzW2ldW2pdWzddKTsKKyAgICB9CisgIH0KKworICBzdHIgKz0KKyAgICAiXG5FaW5lIEVya2xhZXJ1bmcgZGVyIGVpbnplbG5lbiBTcGFsdGVuIGZpbmRlc3QgRHUgdW50ZXIgIgorICAgICJcImhpbGZlIGFiZW50ZXVlcmxpc3RlXCIuXG4iOworCisgIHJldHVybiBzdHI7Cit9CisKKworLy8gbWl0bG9nZ2VuLCBtaXQgd2VsY2hlbiBkdXJjaHNjaG5pdHRsaWNoZW4gTGV2ZWxuIFF1ZXN0cyBzbyBnZWxvZXN0CisvLyB3ZXJkZW4uLi4KK3ZvaWQgSGFuZGxlUXVlc3RTb2x2ZWQoc3RyaW5nIGVpZCwgb2JqZWN0IHRyaWdvYiwgbWl4ZWQgZGF0YSkgeworICBzdHJpbmcgcW5hbWUgPSBkYXRhW0VfUVVFU1ROQU1FXTsKKworICBpZiAoIXF1ZXN0c1txbmFtZV0gfHwgIW9iamVjdHAodHJpZ29iKQorICAgICAgfHwgdHJpZ29iLT5RdWVyeVByb3AoUF9URVNUUExBWUVSKSB8fCBJU19MRUFSTkVSKHRyaWdvYikpCisgICAgcmV0dXJuOworCisgIGludCBsdmwgPSAoaW50KXRyaWdvYi0+UXVlcnlQcm9wKFBfTEVWRUwpOworCisgIGlmIChsdmwgPD0gMCkKKyAgICByZXR1cm47CisKKyAgLy8gbmV1ZW4gRHVyY2hzY2huaXR0IGJlcmVjaGVuLgorICBtaXhlZCB0bXAgPSBxdWVzdHNbcW5hbWVdW1FfQVZFUkFHRV07CisgIGZsb2F0IGF2ZyA9IHRtcFswXTsKKyAgaW50IGNvdW50ID0gdG1wWzFdOworICBhdmcgKj0gY291bnQ7CisgIGF2ZyArPSB0b19mbG9hdChsdmwpOworICB0bXBbMV0gPSArK2NvdW50OworICB0bXBbMF0gPSBhdmcgLyBjb3VudDsKKworICBERUJVRyhzcHJpbnRmKCIlczogJWYgKCVkKVxuIixxbmFtZSwKKyAgICAgICAgcXVlc3RzW3FuYW1lXVtRX0FWRVJBR0VdWzBdLAorICAgICAgICBxdWVzdHNbcW5hbWVdW1FfQVZFUkFHRV1bMV0pKTsKK30KKworLyoKKyAqICgyKSBBQlNDSE5JVFQgIk1JTkkiIFFVRVNUUworICovCisKK2ludCBDbGVhclVzZXJzTVFDYWNoZSgpIHsKKyAgaWYgKCFhbGxvd2VkX3dyaXRlX2FjY2VzcygpKQorICAgIHJldHVybiAwOworCisgIHVzZXJzX21xID0gKFtdKTsKKworICByZXR1cm4gMTsKK30KKworbWl4ZWQgUXVlcnlVc2Vyc01RQ2FjaGUoKSB7CisgIGlmICghYWxsb3dlZF93cml0ZV9hY2Nlc3MoKSkKKyAgICByZXR1cm4gMDsKKworICByZXR1cm4gdXNlcnNfbXE7Cit9CisKKy8qIEJlc2NocmVpYnVuZworICoKKyAqIERpZSBNaW5pUXVlc3RzIHdlcmRlbiBpbiBlaW5lbSBNYXBwaW5nIGdlc3BlaWNoZXJ0LgorICoKKyAqIERlciBLZXkgaXN0IGRhYmVpIGRlciBOYW1lIGRlcyBPYmpla3RlcywgZGFzIGRpZSBRdWVzdCBpbSBTcGllbGVyCisgKiBtYXJraWVyZW4gZGFyZi4gRGllIERhdGVuIHp1IGRlbiBNaW5pcXVlc3RzIHN0ZWhlbiBpbiBkZW4gVmFsdWUtU3BhbHRlbgorICogZGVzIE1hcHBpbmdzLgorICoKKyAqIDEuIFNwYWx0ZSBpc3QgZGllIFphaGwgZGVyIGR1cmNoIGRpZXNlIFF1ZXN0IHp1IGVyd2VyYmVuZGVuIFN0dWZlbnB1bmt0ZQorICogMi4gU3BhbHRlIGlzdCBkaWUgTnVtbWVyIHVudGVyIGRlciBkaWUgTWluaVF1ZXN0IGdlZnVlaHJ0IHdpcmQuCisgKiAzLiBTcGFsdGUgaXN0IGVpbiBTdHJpbmcsIGRlciBkaWUgUXVlc3QoYXVmZ2FiZSkga3VyeiBiZXNjaHJlaWJ0LgorICogNC4gU3BhbHRlIGlzdCBlaW4gSW50ZWdlciwgMCBvZGVyIDE6CisgKiAgICAgMCA6IFF1ZXN0IGlzdCBmdWVyIFNwaWVsZXIgbmljaHQgc2ljaHRiYXIKKyAqICAgICAxIDogUXVlc3QgaXN0IGZ1ZXIgU3BpZWxlciB6LkIuIGJlaSBlaW5lciBBbnNjaGxhZ3RhZmVsIHNpY2h0YmFyCisgKiAgICAgRnVlciBTcGllbGVyIHVuc2ljaHRiYXJlIE1RcyBzb2xsdGUgZXMgYWJlciBuaWNodCBtZWhyIGdlYmVuIQorICogNS4gU3BhbHRlIGlzdCBlaW4gSW50ZWdlciwgMCBvZGVyIDE6CisgKiAgICAgMCA6IFF1ZXN0IHZvcnVlYmVyZ2VoZW5kIGRlYWt0aXZpZXJ0CisgKiAgICAgMSA6IFF1ZXN0IGFrdGl2aWVydAorICogNi4gU3BhbHRlIGlzdCBlaW4gU3RyaW5nLCBkZXIgZGVuIEt1cnp0aXRlbCBkZXIgTWluaXF1ZXN0IGVudGhhZWx0CisgKiA3LiBTcGFsdGUgaXN0IGVpbiBTdHJpbmcsIGRlciBlaW5lIGt1cnplIEJlc2NocmVpYnVuZyBkZXNzZW4gZW50aGFlbHQsCisgKiAgICAgd2FzIGRlciBTcGllbGVyIGltIFZlcmxhdWYgZGVyIE1pbmlxdWVzdCBlcmxlYnQgaGF0LgorICogOC4gU3BhbHRlIGlzdCBlaW4gTWFwcGluZywgZGVzc2VuIEVpbnRyYWVnZSBhbmFsb2cgenUgUF9SRVNUUklDVElPTlMKKyAqICAgICBnZXNldHp0IHdlcmRlbiBrb2VubmVuLCB1bSBhbnp1Z2ViZW4sIHdlbGNoZSBWb3JhdXNzZXR6dW5nZW4gZXJmdWVsbHQKKyAqICAgICBzZWluIG11ZXNzZW4sIGJldm9yIGVpbiBTcGllbGVyIGRpZXNlIFF1ZXN0IGJlZ2lubmVuIGthbm4uCisgKiA5LiBTcGFsdGUgaXN0IGRpZSBadW9yZG51bmcgZGVyIE1RIHp1IGRlbiBSZWdpb25lbgorICoxMC4gU3BhbHRlIGlzdCBlaW4gQXJyYXkgYXVzIFN0cmluZ3MsIGRhcyBkaWUgT2JqZWt0ZSBlbnRoYWVsdCwgZGllCisgKiAgICBkaWUgRGF0ZW4gZGllc2VyIFF1ZXN0IGFiZnJhZ2VuIGR1ZXJmZW4sIHVtIHNpZSBhbiBTcGllbGVyIGF1c3p1Z2ViZW4uCisgKi8KKworaW50IER1bXBNaW5pUXVlc3RzKG9iamVjdCB3aG8pIHsKKyAgaW50IHN1bV9wb2ludHM7CisKKyAgaWYgKGV4dGVybl9jYWxsKCkgJiYgIWFsbG93ZWRfd3JpdGVfYWNjZXNzKCkpCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKCAhb2JqZWN0cCh3aG8pIHx8ICFxdWVyeV9vbmNlX2ludGVyYWN0aXZlKHdobykpCisgICAgd2hvID0gdGhpc19pbnRlcmFjdGl2ZSgpOworCisgIE1RTUxPRyhzcHJpbnRmKCJEdW1wTWluaVF1ZXN0czogUE86ICVPLCBUSTogJU8iLCBwcmV2aW91c19vYmplY3QoKSwgd2hvKSk7CisgIHJtKE1RX0RVTVBfRklMRSk7CisKKyAgd3JpdGVfZmlsZShNUV9EVU1QX0ZJTEUsICJNSU5JUVVFU1RTOiAoIitkdGltZSh0aW1lKCkpKyIpXG5cbiIrCisgICAgIiAgTnIgIFBrdCAgdmlzIGFrdCB2ZXJnZWJlbmRlcyBPYmpla3RcbiIpOworICBzdHJpbmcgKm1zZyA9ICh7fSk7CisKKyAgZm9yZWFjaChzdHJpbmcgb2JuYW1lLCBpbnQgc3R1cHNlLCBpbnQgbnVtbWVyLCBtaXhlZCBkZXNjciwgaW50IHZpcywKKyAgICAgIGludCBhY3RpdmUgLyosIHN0cmluZyB0aXRsZSwgc3RyaW5nIGRvbmVkZXNjLCBtYXBwaW5nIHJlc3RyaWN0aW9ucywKKyAgICAgIHN0cmluZyBkb21haW4sIHN0cmluZyAqcGVybWl0dGVkX29ianMqLzogbWluaXF1ZXN0cykKKyAgeworICAgIG1zZyArPSAoeyBzcHJpbnRmKCIlNGQgJTRkICU0ZCAlNGQgJXMiLAorICAgICAgbnVtbWVyLCBzdHVwc2UsIHZpcywgYWN0aXZlLCBvYm5hbWUpfSk7CisgICAgc3VtX3BvaW50cyArPSBzdHVwc2U7CisgIH0KKworICB3cml0ZV9maWxlKE1RX0RVTVBfRklMRSwgaW1wbG9kZShzb3J0X2FycmF5KG1zZywgIyc+IC8qJyovKSwgIlxuIikpOworICB3cml0ZV9maWxlKE1RX0RVTVBfRklMRSwgc3ByaW50ZigiXG5cbiIKKyAgICAgICAgICAgICAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iCisgICAgICAgICAgICAgKyJNaW5pUXVlc3RzOiAlZCBNaW5pcXVlc3RzIG1pdCAlZCBQdW5rdGVuLlxuXG4iLAorICAgICAgICAgICAgICBzaXplb2YobWluaXF1ZXN0cyksIHN1bV9wb2ludHMpKTsKKyAgcmV0dXJuIDE7Cit9CisKK3B1YmxpYyBpbnQgQWRkTWluaVF1ZXN0KGludCBtcXVlc3Rwb2ludHMsIHN0cmluZyBhbGxvd2Vkb2JqLCBzdHJpbmcgZGVzY3IsCisgICAgICAgICAgICBpbnQgYWN0aXZlLCBzdHJpbmcgdGl0bGUsIHN0cmluZyBkb25lZGVzYywgbWFwcGluZyByZXN0cmljdGlvbnMsCisgICAgICAgICAgICBzdHJpbmcgZG9tYWluLCBzdHJpbmcgKnBlcm1pdHRlZF9vYmpzKSB7CisKKyAgaWYgKCFhbGxvd2VkX3dyaXRlX2FjY2VzcygpKQorICAgIHJldHVybiAwOworCisgIC8vIFBhcmFtZXRlcnBydWVmdW5nOiBRdWVzdGdlYmVyLCBSZXN0cmljdGlvbnMsIFJlZ2lvbiwgVGl0ZWwgdW5kCisgIC8vIHp1Z2VsYXNzZW5lIEFiZnJhZ2VvYmpla3RlIG11ZXNzZW4gZ3VlbHRpZyBhbmdlZ2ViZW4gd2VyZGVuLCBhbGxlcworICAvLyB3ZWl0ZXJlIHdpcmQgdW50ZW4gZ2dmLiBhdXNnZW51bGx0L2tvcnJpZ2llcnQuCisgIGlmICghc3RyaW5ncChhbGxvd2Vkb2JqKSB8fCAhc2l6ZW9mKGFsbG93ZWRvYmopIHx8ICFtYXBwaW5ncChyZXN0cmljdGlvbnMpCisgICAgICB8fCAhc3RyaW5ncChkb21haW4pIHx8ICFzdHJpbmdwKHRpdGxlKSB8fCAhcG9pbnRlcnAocGVybWl0dGVkX29ianMpKQorICAgIHJldHVybiAtMTsKKworICAvLyBNaW5pcXVlc3QgbWl0IHdlbmlnZXIgYWxzIDEgU3R1cHMgZWluenV0cmFnZW4gaXN0IHdvaGwgdW5zaW5uaWcuCisgIGlmIChtcXVlc3Rwb2ludHM8MSkKKyAgICByZXR1cm4gLTI7CisKKyAgLy8gTWluZGVzdGVucyBlaW4gT2JqZWt0IG11c3MgZWluZ2V0cmFnZW4gd2VyZGVuLCBkYXMgU3BpZWxlcm4gSW5mb3JtYXRpb25lbgorICAvLyB1ZWJlciBkaWUgQXVmZ2FiZW5zdGVsbHVuZyBkZXIgTVEgZ2ViZW4gZGFyZi4KKyAgaWYgKCAhc2l6ZW9mKHBlcm1pdHRlZF9vYmpzKSApCisgICAgcmV0dXJuIC0zOworCisgIC8vIFBydWVmZW4sIG9iIGRpZSBhbHMgUXVlc3RnZWJlciBhbmdlZ2ViZW5lIERhdGVpIGV4aXN0aWVydC4KKyAgaWYgKGFsbG93ZWRvYmpbPDIuLl0gPT0gIi5jIikKKyAgICBhbGxvd2Vkb2JqID0gYWxsb3dlZG9ialswLi48M107CisgIGFsbG93ZWRvYmogPSBleHBsb2RlKGFsbG93ZWRvYmosICIjIilbMF07CisgIGFsbG93ZWRvYmogPSAoc3RyaW5nKU1BU1RFUi0+X2dldF9wYXRoKGFsbG93ZWRvYmosMCk7CisgIGlmIChmaWxlX3NpemUoYWxsb3dlZG9iaisiLmMiKSA8PTApCisgICAgcmV0dXJuIC0zOworCisgIC8vIFZlcmdpYnQgZGFzIGFuZ2VnZWJlbmUgT2JqZWt0IHNjaG9uIGVpbmUgTVE/IERhbm4gYWJicmVjaGVuLgorICBpZiAobWVtYmVyKG1pbmlxdWVzdHMsYWxsb3dlZG9iaikpCisgICAgcmV0dXJuIC00OworCisgIGlmICghc3RyaW5ncChkZXNjcikgfHwgIXNpemVvZihkZXNjcikpCisgICAgZGVzY3IgPSAwOworICBpZiAoIXN0cmluZ3AoZG9uZWRlc2MpIHx8ICFzaXplb2YoZG9uZWRlc2MpKQorICAgIGRvbmVkZXNjID0gMDsKKworICAvLyBFaW50cmFnIGhpbnp1ZnVlZ2VuLCB2aXNpYmxlIGlzdCBwZXIgRGVmYXVsdCBpbW1lciAxLgorICAvLyBNUS1OdW1tZXIgaG9jaHphZWhsZW4KKyAgaW50IG51bW1lciA9IGxhc3RfbnVtICsgMTsKKyAgbV9hZGQobWluaXF1ZXN0cywgYWxsb3dlZG9iaiwgbXF1ZXN0cG9pbnRzLCBudW1tZXIsIGRlc2NyLCAxLCBhY3RpdmUsCisgICAgdGl0bGUsIGRvbmVkZXNjLCByZXN0cmljdGlvbnMsIGRvbWFpbiwgcGVybWl0dGVkX29ianMpOworICAvLyB1bmQgbnVtbWVyIGFscyBsYXN0X251bSBtZXJrZW4uCisgIGxhc3RfbnVtID0gbnVtbWVyOworICBzYXZlX2luZm8oKTsKKyAgbV9hZGQoYnlfbnVtLCBudW1tZXIsICh7bXF1ZXN0cG9pbnRzLCBhbGxvd2Vkb2JqfSkpOworICBNUU1MT0coc3ByaW50ZigiQWRkTWluaVF1ZXN0OiAlcyAlTyAoJXMpIiwgYWxsb3dlZG9iaiwgbWluaXF1ZXN0c1thbGxvd2Vkb2JqXSwKKyAgICAgICAgICAgICAgICAgZ2V0dWlkKHRoaXNfaW50ZXJhY3RpdmUoKSkpKTsKKworICBDbGVhclVzZXJzTVFDYWNoZSgpOworICBpZiAoZmluZF9jYWxsX291dCgjJ0R1bXBNaW5pUXVlc3RzKSA9PSAtMSkKKyAgICBjYWxsX291dCgjJ0R1bXBNaW5pUXVlc3RzLCA2MCwgdGhpc19pbnRlcmFjdGl2ZSgpKTsKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBSZW1vdmVNaW5pUXVlc3Qoc3RyaW5nIG5hbWUpIHsKKyAgaWYgKCFhbGxvd2VkX3dyaXRlX2FjY2VzcygpKQorICAgIHJldHVybiAwOworICAvLyBHaWJ0IGVzIGVpbmVuIHNvbGNoZW4gRWludHJhZyB1ZWJlcmhhdXB0PworICBpZiAoIW1lbWJlcihtaW5pcXVlc3RzLG5hbWUpKQorICAgIHJldHVybiAtMTsKKworICBNUU1MT0coc3ByaW50ZigiUmVtb3ZlTWluaVF1ZXN0OiAlcyAlTyAoJXMpIiwKKyAgICBuYW1lLCBtX2VudHJ5KG1pbmlxdWVzdHMsIG5hbWUpLCBnZXR1aWQodGhpc19pbnRlcmFjdGl2ZSgpKSkpOworCisgIC8vIE1RIGF1cyBkZW0gTVEtSW5kZXhudW1tZXJuLUNhY2hlIGxvZXNjaGVuLgorICBtX2RlbGV0ZShieV9udW0sIG1pbmlxdWVzdHNbbmFtZSxNUV9EQVRBX1FVRVNUTk9dKTsKKyAgLy8gTVEgYXVzIGRlciBNaW5pcXVlc3RsaXN0ZSBhdXN0cmFnZW4uCisgIG1fZGVsZXRlKG1pbmlxdWVzdHMsIG5hbWUpOworICBzYXZlX2luZm8oKTsKKworICAvLyBNUS1QdW5rdGUtQ2FjaGUgbG9lc2NoZW4sIGRhIG5pY2h0IGZlc3RzdGVsbGJhciBpc3QsIHdlbGNoZXIgZGVyCisgIC8vIGRvcnQgZWluZ2V0cmFnZW5lbiBTcGllbGVyIGRpZSBnZXJhZGUgYXVzZ2V0cmFnZW5lIE1RIGdlbG9lc3QgaGF0dGUuCisgIENsZWFyVXNlcnNNUUNhY2hlKCk7CisgIGlmIChmaW5kX2NhbGxfb3V0KCMnRHVtcE1pbmlRdWVzdHMpID09IC0xKQorICAgIGNhbGxfb3V0KCMnRHVtcE1pbmlRdWVzdHMsIDYwLCB0aGlzX2ludGVyYWN0aXZlKCkpOworICByZXR1cm4gMTsKK30KKworaW50IENoYW5nZU1pbmlRdWVzdChtaXhlZCBtcV9vYmosIGludCBwYXJhbSwgbWl4ZWQgbmV3dmFsdWUpIHsKKyAgaWYgKCFhbGxvd2VkX3dyaXRlX2FjY2VzcygpKQorICAgIHJldHVybiAwOworCisgIC8vIE1RIHdlZGVyIGFscyBQZmFkLCBub2NoIGFscyBJbmRleG51bW1lciBhbmdlZ2ViZW4/CisgIGlmICggIXN0cmluZ3AobXFfb2JqKSAmJiAhaW50cChtcV9vYmopICYmICFpbnRwKHBhcmFtKSkKKyAgICByZXR1cm4gTVFfS0VZX0lOVkFMSUQ7CisKKyAgLy8gZ2V3YWVobHRlciBQYXJhbWV0ZXIgdW5ndWVsdGlnPworICBpZiAoIHBhcmFtIDwgTVFfREFUQV9QT0lOVFMgfHwgcGFyYW0gPiBNUV9EQVRBX1FVRVJZX1BFUk1JVFRFRCApCisgICAgcmV0dXJuIE1RX0tFWV9JTlZBTElEOworCisgIC8vIEluZGV4bnVtbWVyIGRlciBNUSBpbiBkZW4gUGZhZCB1bXdhbmRlbG4KKyAgaWYgKCBpbnRwKG1xX29iaikgKQorICAgIG1xX29iaiA9IGJ5X251bVttcV9vYmpdWzFdOworCisgIC8vIFZlcmdlYmVuZGVzIE9iamVrdCBuaWNodCBnZWZ1bmRlbj8gQmxvZWQsIGRhcyBicmF1Y2hlbiB3aXIgbmFlbWxpY2guCisgIGlmICghc3RyaW5ncChtcV9vYmopKQorICAgIHJldHVybiBNUV9LRVlfSU5WQUxJRDsKKworICBpZiAoICFtZW1iZXIobWluaXF1ZXN0cywgbXFfb2JqKSApCisgICAgcmV0dXJuIE1RX0lMTEVHQUxfT0JKOworCisgIHN3aXRjaChwYXJhbSkgeworICAgIC8vIE1RX0RBVEFfUVVFU1ROTyBpc3QgbmljaHQgYWVuZGVyYmFyLCBkYWhlciBoaWVyIG5pY2h0IGJlaGFuZGVsdCwgc28KKyAgICAvLyBkYXNzIEZhbGxiYWNrIGF1ZiBkZWZhdWx0IGVyZm9sZ3QuCisgICAgLy8gU3R1ZmVucHVua3RlIG11ZXNzZW4gSW50ZWdlcnMgc2Vpbi4KKyAgICBjYXNlIE1RX0RBVEFfUE9JTlRTOgorICAgICAgaWYgKCAhaW50cChuZXd2YWx1ZSkgfHwgbmV3dmFsdWUgPCAxICkKKyAgICAgICAgcmV0dXJuIE1RX0tFWV9JTlZBTElEOworICAgICAgYnJlYWs7CisgICAgLy8gQXVmZ2FiZW5iZXNjaHJlaWJ1bmcsIFRpdGVsLCAiZ2VzY2hhZmZ0Ii1UZXh0IHVuZCB6dWdlb3JkbmV0ZSBSZWdpb24KKyAgICAvLyBtdWVzc2VuIFN0cmluZ3Mgc2VpbgorICAgIGNhc2UgTVFfREFUQV9UQVNLREVTQzoKKyAgICBjYXNlIE1RX0RBVEFfVElUTEU6CisgICAgY2FzZSBNUV9EQVRBX0RJQVJZVEVYVDoKKyAgICBjYXNlIE1RX0RBVEFfQVNTSUdORURfRE9NQUlOOgorICAgICAgaWYgKCAhc3RyaW5ncChuZXd2YWx1ZSkgfHwgIXNpemVvZihuZXd2YWx1ZSkgKSAKKyAgICAgICAgcmV0dXJuIE1RX0tFWV9JTlZBTElEOworICAgICAgYnJlYWs7CisgICAgLy8gZGFzIFNpY2h0YmFya2VpdHMtIHVuZCBkYXMgYWt0aXYvaW5ha3Rpdi1GbGFnIG11ZXNzZW4gMC8xIHNlaW4uCisgICAgY2FzZSBNUV9EQVRBX1ZJU0lCTEU6CisgICAgY2FzZSBNUV9EQVRBX0FDVElWRToKKyAgICAgIGlmICggIWludHAobmV3dmFsdWUpIHx8IG5ld3ZhbHVlIDwgMCB8fCBuZXd2YWx1ZSA+IDEgKQorICAgICAgICByZXR1cm4gTVFfS0VZX0lOVkFMSUQ7CisgICAgICBicmVhazsKKyAgICAvLyBEaWUgVm9yYXVzc2V0enVuZ2VuIG11ZXNzZW4gYWxzIE1hcHBpbmcgZWluZ2V0cmFnZW4gd2VyZGVuLCBkYXMgYWJlcgorICAgIC8vIGxlZXIgb2RlciBOdWxsIHNlaW4ga2Fubiwgd2VubiBlcyBrZWluZSBSZXN0cmlrdGlvbmVuIGdpYnQuCisgICAgY2FzZSBNUV9EQVRBX1JFU1RSSUNUSU9OUzoKKyAgICAgIGlmICggIW1hcHBpbmdwKG5ld3ZhbHVlKSAmJiBuZXd2YWx1ZSAhPSAwICkKKyAgICAgICAgcmV0dXJuIE1RX0tFWV9JTlZBTElEOworICAgICAgYnJlYWs7CisgICAgLy8gUmVnaW9uc3p1b3JkbnVuZyBtdXNzIGVpbiBuaWNodC1sZWVyZXMgQXJyYXkgc2VpbiwgZGFzIG51ciBhdXMgU3RyaW5ncworICAgIC8vIGJlc3RlaGVuIGRhcmYsIGRpZSBuaWNodCBsZWVyIHNlaW4gZHVlcmZlbi4KKyAgICBjYXNlIE1RX0RBVEFfUVVFUllfUEVSTUlUVEVEOgorICAgICAgaWYgKCBwb2ludGVycChuZXd2YWx1ZSkgKSB7CisgICAgICAgIG5ld3ZhbHVlID0gZmlsdGVyKGZpbHRlcihuZXd2YWx1ZSwgIydzdHJpbmdwKSwgIydzaXplb2YpOworICAgICAgICBpZiAoIXNpemVvZihuZXd2YWx1ZSkpCisgICAgICAgICAgcmV0dXJuIE1RX0tFWV9JTlZBTElEOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICByZXR1cm4gTVFfS0VZX0lOVkFMSUQ7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIE1RX0tFWV9JTlZBTElEOworICB9CisKKyAgbWl4ZWQgKmFsdGVtcSA9IG1fZW50cnkobWluaXF1ZXN0cywgbXFfb2JqKTsKKyAgaW50IG51bW1lciA9IG1pbmlxdWVzdHNbbXFfb2JqLE1RX0RBVEFfUVVFU1ROT107CisgIG1pbmlxdWVzdHNbbXFfb2JqLCBwYXJhbV0gPSBuZXd2YWx1ZTsKKyAgYnlfbnVtW251bW1lcl0gPSAoe21pbmlxdWVzdHNbbXFfb2JqLE1RX0RBVEFfUE9JTlRTXSwgbXFfb2JqfSk7CisgIHNhdmVfaW5mbygpOworCisgIE1RTUxPRyhzcHJpbnRmKCJDaGFuZ2VNaW5pUXVlc3Q6ICVzIGZyb20gJU8gdG8gJU8gKCVzKSIsIG1xX29iaiwKKyAgICBhbHRlbXEsIG1fZW50cnkobWluaXF1ZXN0cywgbXFfb2JqKSwgZ2V0dWlkKHRoaXNfaW50ZXJhY3RpdmUoKSkpKTsKKworICBDbGVhclVzZXJzTVFDYWNoZSgpOworICBpZiAoZmluZF9jYWxsX291dCgjJ0R1bXBNaW5pUXVlc3RzKSA9PSAtMSkKKyAgICBjYWxsX291dCgjJ0R1bXBNaW5pUXVlc3RzLCA2MCwgdGhpc19pbnRlcmFjdGl2ZSgpKTsKKyAgcmV0dXJuIDE7Cit9CisKK21peGVkIFF1ZXJ5TWluaVF1ZXN0QnlOYW1lKHN0cmluZyBuYW1lKSB7CisgIGlmICghYWxsb3dlZF93cml0ZV9hY2Nlc3MoKSkKKyAgICByZXR1cm4gMDsKKyAgcmV0dXJuIGRlZXBfY29weShtaW5pcXVlc3RzICYgKHtuYW1lfSkpOworfQorCittaXhlZCBRdWVyeU1pbmlRdWVzdEJ5TnVtYmVyKGludCBudW1tZXIpIHsKKyAgLy8gWnVncmlmZnNhYnNpY2hlcnVuZyBlcmZvbGd0IGRvcnQgYXVjaCwgZGFoZXIgaGllciB1bm5vZXRpZworICByZXR1cm4gKGJ5X251bVtudW1tZXJdP1F1ZXJ5TWluaVF1ZXN0QnlOYW1lKGJ5X251bVtudW1tZXJdWzFdKTowKTsKK30KKworLy8gRGFzIHZvbGxzdGFlbmRpZ2UgTVEtTWFwcGluZyBudXIgYWxzIEtvcGllIGF1c2xpZWZlcm4uCittaXhlZCBRdWVyeU1pbmlRdWVzdHMoKSB7CisgIHJldHVybiBhbGxvd2VkX3dyaXRlX2FjY2VzcygpID8gZGVlcF9jb3B5KG1pbmlxdWVzdHMpIDogMDsKK30KKworLy8gRGUtL0FrdGl2aWVyZW4gZWluZXIgTWluaXF1ZXN0LCB3aXJrdCBhbHMgVW1zY2hhbHRlciwgZC5oLiBlaW5lIGFrdGl2ZQorLy8gTVEgd2lyZCBkdXJjaCBBdWZydWYgZGllc2VyIEZ1bmt0aW9uIGFscyBpbmFrdGl2IG1hcmtpZXJ0IHVuZCB1bWdla2VocnQuCitpbnQgU3dpdGNoTWluaVF1ZXN0QWN0aXZlKHN0cmluZyBuYW1lKSB7CisgIGlmICghYWxsb3dlZF93cml0ZV9hY2Nlc3MoKSkKKyAgICByZXR1cm4gLTE7CisgIC8vIEhhYmVuIHdpciBlaW5lIHNvbGNoZSBNUSB1ZWJlcmhhdXB0PworICBpZiAoIW1lbWJlcihtaW5pcXVlc3RzLCBuYW1lKSkKKyAgICByZXR1cm4gLTI7CisKKyAgLy8gYWN0aXZlLUZsYWcgaW52ZXJ0aWVyZW4KKyAgbWluaXF1ZXN0c1tuYW1lLCBNUV9EQVRBX0FDVElWRV0gPSAhbWluaXF1ZXN0c1tuYW1lLCBNUV9EQVRBX0FDVElWRV07CisgIHNhdmVfaW5mbygpOworCisgIE1RTUxPRyhzcHJpbnRmKCIlczogJXMgKCVzKSIsCisgICAgKG1pbmlxdWVzdHNbbmFtZSxNUV9EQVRBX0FDVElWRV0/IkFjdGl2YXRlIjoiRGVhY3RpdmF0ZSIpLCBuYW1lLAorICAgIGdldHVpZCh0aGlzX2ludGVyYWN0aXZlKCkpKQorICApOworICByZXR1cm4gbWluaXF1ZXN0c1tuYW1lLE1RX0RBVEFfQUNUSVZFXTsKK30KKworaW50IEdpdmVNaW5pUXVlc3Qob2JqZWN0IHdpbm5lcikgeworICAvLyBTcGllbGVyIG11c3MgZXhpc3RpZXJlbiB1bmQgaW50ZXJhY3RpdmUgc2Vpbi4KKyAgaWYgKCF3aW5uZXIgfHwKKyAgICAgICh0aGlzX2ludGVyYWN0aXZlKCkgJiYgKHRoaXNfaW50ZXJhY3RpdmUoKSAhPSB3aW5uZXIpKSB8fAorICAgICAgKCh0aGlzX3BsYXllcigpID09IHdpbm5lcikgJiYgIXF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUod2lubmVyKSkpCisgICAgcmV0dXJuIE1RX0lMTEVHQUxfT0JKOworICAvLyBHYWVzdGUga29lbm5lbiBrZWluZSBNaW5pcXVlc3RzIGJlc3RlaGVuLgorICBpZiAod2lubmVyLT5RdWVyeUd1ZXN0KCkpCisgICAgcmV0dXJuIE1RX0dVRVNUOworICAvLyBBdWZydWZlbmRlcyBPYmpla3QgZXhpc3RpZXJ0IGdhciBuaWNodD8KKyAgaWYgKCFwcmV2aW91c19vYmplY3QoKSkKKyAgICByZXR1cm4gTVFfSUxMRUdBTF9PQko7CisKKyAgc3RyaW5nIG9iam5hbWUgPSBsb2FkX25hbWUocHJldmlvdXNfb2JqZWN0KCkpOworICAvLyBNaW5pcXVlc3QgbXVzcyBleGlzdGllcmVuCisgIGlmICghbWVtYmVyKG1pbmlxdWVzdHMsb2JqbmFtZSkpCisgICAgcmV0dXJuIE1RX0tFWV9JTlZBTElEOworICAvLyBJbmFrdGl2ZSBNaW5pcXVlc3RzIGtvZW5uZW4gbmljaHQgdmVyZ2ViZW4gd2VyZGVuLgorICBpZiAoIW1pbmlxdWVzdHNbb2JqbmFtZSwgTVFfREFUQV9BQ1RJVkVdKQorICAgIHJldHVybiBNUV9JU19JTkFDVElWRTsKKworICBzdHJpbmcgbXEgPSAoTUFTVEVSLT5xdWVyeV9tcShnZXR1aWQod2lubmVyKSkgfHwgIiIpOworCisgIC8vIFNwaWVsZXIgaGF0IGRpZSBNUSBzY2hvbm1hbCBiZXN0YW5kZW4/IERhbm4ga2VpbmUgd2VpdGVyZW4gQWt0aXZpdGFldAorICAvLyBub2V0aWcKKyAgaWYgKHRlc3RfYml0KG1xLCBtaW5pcXVlc3RzW29iam5hbWUsIE1RX0RBVEFfUVVFU1ROT10pKQorICAgIHJldHVybiBNUV9BTFJFQURZX1NFVDsKKworICBjYXRjaChtcSA9IHNldF9iaXQobXEsIG1pbmlxdWVzdHNbb2JqbmFtZSxNUV9EQVRBX1FVRVNUTk9dKTtwdWJsaXNoKTsKKyAgTUFTVEVSLT51cGRhdGVfbXEoZ2V0dWlkKHdpbm5lciksIG1xKTsKKworICBNUVNPTFZFRExPRyhzcHJpbnRmKCIlczogJXMsICgjJWQpLCAoU3R1cHNlICVkKSIsCisgICAgb2JqbmFtZSwgZ2V0ZXVpZCh3aW5uZXIpLCBtaW5pcXVlc3RzW29iam5hbWUsIE1RX0RBVEFfUVVFU1ROT10sCisgICAgbWluaXF1ZXN0c1tvYmpuYW1lLCBNUV9EQVRBX1BPSU5UU10pKTsKKworICAvLyBNaW5pcXVlc3QtRXZlbnQgYXVzbG9lc2VuCisgIEVWRU5URC0+VHJpZ2dlckV2ZW50KCBFVlRfTElCX01JTklRVUVTVF9TT0xWRUQsIChbCisgICAgICAgICAgICBFX09CSkVDVDogcHJldmlvdXNfb2JqZWN0KCksCisgICAgICAgICAgICBFX09CTkFNRTogb2JqbmFtZSwKKyAgICAgICAgICAgIEVfUExOQU1FOiBnZXR1aWQod2lubmVyKSwKKyAgICAgICAgICAgIEVfTUlOSVFVRVNUTkFNRTogbWluaXF1ZXN0c1tvYmpuYW1lLCBNUV9EQVRBX1RJVExFXSBdKSApOworCisgIC8vIFNwaWVsZXJlaW50cmFnIGF1cyBkZW0gTVEtUHVua3RlLUNhY2hlIGxvZXNjaGVuCisgIG1fZGVsZXRlKHVzZXJzX21xLCBnZXR1aWQod2lubmVyKSk7CisKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBRdWVyeU1pbmlRdWVzdFBvaW50cyhtaXhlZCBwbCkgeworICBzdHJpbmcgc3BpZWxlcjsKKworICAvL2lmICghYWxsb3dlZF93cml0ZV9hY2Nlc3MoKSkKKyAgLy8gIHJldHVybiAwOworCisgIGlmICghcGwpCisgICAgcmV0dXJuIC0xOworCisgIGlmICghb2JqZWN0cChwbCkgJiYgIXN0cmluZ3AocGwpKQorICAgIHJldHVybiAtMjsKKworICBpZiAob2JqZWN0cChwbCkgJiYgIXF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUocGwpKQorICAgIHJldHVybiAtMzsKKworICBpZiAob2JqZWN0cChwbCkpCisgICAgc3BpZWxlciA9IGdldHVpZChwbCk7CisgIGVsc2UKKyAgICBzcGllbGVyID0gcGw7CisKKyAgaWYgKCFtZW1iZXIodXNlcnNfbXEsIHNwaWVsZXIpKSB7CisgICAgaW50IG1xcG9pbnRzOworICAgIGludCBwPS0xOworICAgIHN0cmluZyBzID0gKE1BU1RFUi0+cXVlcnlfbXEoc3BpZWxlcikgfHwgIiIpOworICAgIHdoaWxlKCAocD1uZXh0X2JpdChzLCBwKSkgIT0gLTEpIHsKKyAgICAgIG1xcG9pbnRzKz1ieV9udW1bcF1bMF07CisgICAgfQorICAgIHVzZXJzX21xW3NwaWVsZXJdID0gbXFwb2ludHM7CisgIH0KKyAgcmV0dXJuIHVzZXJzX21xW3NwaWVsZXJdOworfQorCitpbnQgSGFzTWluaVF1ZXN0KG1peGVkIHBsLCBtaXhlZCBuYW1lKSB7CisgIHN0cmluZyBtcSwgc3BpZWxlcjsKKworICBpZiAoIXBsIHx8ICFuYW1lKQorICAgIHJldHVybiBNUV9JTExFR0FMX09CSjsKKworICBpZiAoIW9iamVjdHAocGwpICYmICFzdHJpbmdwKHBsKSkKKyAgICByZXR1cm4gTVFfSUxMRUdBTF9PQko7CisKKyAgaWYgKG9iamVjdHAocGwpICYmICFxdWVyeV9vbmNlX2ludGVyYWN0aXZlKHBsKSkKKyAgICByZXR1cm4gTVFfSUxMRUdBTF9PQko7CisKKyAgaWYgKCFvYmplY3RwKG5hbWUpICYmICFzdHJpbmdwKG5hbWUpICYmICFpbnRwKG5hbWUpKQorICAgIHJldHVybiBNUV9JTExFR0FMX09CSjsKKworICBpZiAob2JqZWN0cChuYW1lKSkKKyAgICBuYW1lID0gZXhwbG9kZShvYmplY3RfbmFtZShuYW1lKSwgIiMiKVswXTsKKworICBpZiAoIGludHAobmFtZSkgKQorICAgIG5hbWUgPSBieV9udW1bbmFtZV1bMV07CisKKyAgaWYgKG9iamVjdHAocGwpKQorICAgIHNwaWVsZXIgPSBnZXR1aWQocGwpOworICBlbHNlCisgICAgc3BpZWxlciA9IHBsOworCisgIGlmICghbWVtYmVyKG1pbmlxdWVzdHMsbmFtZSkpCisgICAgcmV0dXJuIE1RX0tFWV9JTlZBTElEOworCisgIG1xID0gKE1BU1RFUi0+cXVlcnlfbXEoc3BpZWxlcikgfHwgIiIpOworCisgIHJldHVybiB0ZXN0X2JpdChtcSwgbWluaXF1ZXN0c1tuYW1lLCBNUV9EQVRBX1FVRVNUTk9dKTsKK30KKworLy8gWnVtIFZvbi1IYW5kLVNldHplbiBkZXIgTWluaVF1ZXN0cworaW50IFNldFBsYXllck1pbmlRdWVzdChzdHJpbmcgcGwsIHN0cmluZyBuYW1lKSB7CisgIGlmKCFhbGxvd2VkX3dyaXRlX2FjY2VzcygpKQorICAgIHJldHVybiAwOworICBpZighcGwpCisgICAgcmV0dXJuIE1RX0lMTEVHQUxfT0JKOworICBpZighcHJldmlvdXNfb2JqZWN0KCkpCisgICAgcmV0dXJuIE1RX0lMTEVHQUxfT0JKOworCisgIGlmICghbWVtYmVyKG1pbmlxdWVzdHMsbmFtZSkpCisgICAgcmV0dXJuIE1RX0tFWV9JTlZBTElEOworCisgIHN0cmluZyBtcSA9IChNQVNURVItPnF1ZXJ5X21xKHBsKSB8fCAiIik7CisKKyAgaWYgKHRlc3RfYml0KG1xLCBtaW5pcXVlc3RzW25hbWUsTVFfREFUQV9RVUVTVE5PXSkpCisgICAgcmV0dXJuIE1RX0FMUkVBRFlfU0VUOworCisgIGNhdGNoIChtcSA9IHNldF9iaXQobXEsIG1pbmlxdWVzdHNbbmFtZSwgTVFfREFUQV9RVUVTVE5PXSk7cHVibGlzaCk7CisgIE1BU1RFUi0+dXBkYXRlX21xKHBsLCBtcSk7CisKKyAgTVFNTE9HKHNwcmludGYoIlNldFBsYXllck1pbmlRdWVzdDogJXMgJXMgKCVzKSIsCisgICAgICAgICAgICAgICAgIHBsLCBuYW1lLCBnZXR1aWQodGhpc19pbnRlcmFjdGl2ZSgpKSkpOworICAvLyBTcGllbGVyZWludHJhZyBhdXMgZGVtIE1RLVB1bmt0ZS1DYWNoZSBsb2VzY2hlbgorICBtX2RlbGV0ZSh1c2Vyc19tcSwgcGwpOworICByZXR1cm4gMTsKK30KKworaW50IENsZWFyUGxheWVyTWluaVF1ZXN0KHN0cmluZyBwbCwgc3RyaW5nIG5hbWUpIHsKKyAgaWYgKCFhbGxvd2VkX3dyaXRlX2FjY2VzcygpKQorICAgIHJldHVybiAwOworICBpZiAoIXBsKQorICAgIHJldHVybiBNUV9JTExFR0FMX09CSjsKKyAgaWYgKCFwcmV2aW91c19vYmplY3QoKSkKKyAgICByZXR1cm4gTVFfSUxMRUdBTF9PQko7CisKKyAgaWYgKCFtZW1iZXIobWluaXF1ZXN0cyxuYW1lKSkKKyAgICByZXR1cm4gTVFfS0VZX0lOVkFMSUQ7CisKKyAgc3RyaW5nIG1xID0gKE1BU1RFUi0+cXVlcnlfbXEocGwpIHx8ICIiKTsKKworICBpZiAoIXRlc3RfYml0KG1xLCBtaW5pcXVlc3RzW25hbWUsIE1RX0RBVEFfUVVFU1ROT10pKQorICAgIHJldHVybiBNUV9BTFJFQURZX1NFVDsKKworICBjYXRjaCAobXEgPSBjbGVhcl9iaXQobXEsIG1pbmlxdWVzdHNbbmFtZSwgTVFfREFUQV9RVUVTVE5PXSk7cHVibGlzaCk7CisgIE1BU1RFUi0+dXBkYXRlX21xKHBsLCBtcSk7CisKKyAgTVFNTE9HKHNwcmludGYoIkNsZWFyUGxheWVyTWluaVF1ZXN0OiAlcyAlcyAoJXMpIiwKKyAgICAgICAgICAgICAgICAgcGwsIG5hbWUsIGdldHVpZCh0aGlzX2ludGVyYWN0aXZlKCkpKSk7CisgIC8vIFNwaWVsZXJlaW50cmFnIGF1cyBkZW0gTVEtUHVua3RlLUNhY2hlIGxvZXNjaGVuCisgIG1fZGVsZXRlKHVzZXJzX21xLCBwbCk7CisgIHJldHVybiAxOworfQorCisvLyBVbXRyYWdlbiB2b24gTWluaXF1ZXN0cyB2b24gT2JqZWt0IDxvbGQ+IGF1ZiBPYmpla3QgPG5ldz4KK2ludCBNb3ZlTWluaVF1ZXN0KHN0cmluZyBvbGRfbXFvYiwgc3RyaW5nIG5ld19tcW9iKSB7CisgIGlmICggIWFsbG93ZWRfd3JpdGVfYWNjZXNzKCkgKQorICAgIHJldHVybiAtMTsKKworICAvLyBIYWJlbiB3aXIgdWViZXJoYXVwdCBlaW5lbiBzb2xjaGVuIEVpbnRyYWc/CisgIGlmICggIW1lbWJlcihtaW5pcXVlc3RzLCBvbGRfbXFvYikgKQorICAgIHJldHVybiAtMjsKKworICAvLyBQcnVlZmVuLCBvYiBkaWUgYWxzIDxuZXdfbXFvYj4gYW5nZWdlYmVuZSBEYXRlaSBleGlzdGllcnQuCisgIGlmIChuZXdfbXFvYls8Mi4uXSA9PSAiLmMiKQorICAgIG5ld19tcW9iID0gbmV3X21xb2JbMC4uPDNdOworICBuZXdfbXFvYiA9IGV4cGxvZGUobmV3X21xb2IsICIjIilbMF07CisgIG5ld19tcW9iID0gKHN0cmluZykiL3NlY3VyZS9tYXN0ZXIiLT5fZ2V0X3BhdGgobmV3X21xb2IsMCk7CisgIGlmIChmaWxlX3NpemUobmV3X21xb2IrIi5jIikgPD0gMCkKKyAgICByZXR1cm4gLTM7CisgIC8vIFdlbm4gZGFzIG5ldWUgT2JqZWt0IHNjaG9uIGVpbmUgTVEgdmVyZ2lidCwga2FubiBlcyBrZWluZSB3ZWl0ZXJlCisgIC8vIGFubmVobWVuLgorICBpZiAoIG1lbWJlcihtaW5pcXVlc3RzLCBuZXdfbXFvYikgKQorICAgIHJldHVybiAtNDsKKworICAvLyBEZXIgTWluaXF1ZXN0bGlzdGUgZWluZW4gbmV1ZW4gS2V5ICJuZXciIG1pdCBkZW4gRGF0ZW4gZGVzIGFsdGVuIEtleXMKKyAgLy8gaGluenVmdWVnZW4uIG1fZW50cnkoKSBsaWVmZXJ0IGFsbGUgVmFsdWVzIGRhenUgYWxzIEFycmF5LCB1bmQgZGVyCisgIC8vIGZsYXR0ZW4tT3BlcmF0b3IgIi4uLiIgdWViZXJnaWJ0IGRlc3NlbiBFbGVtZW50ZSBhbHMgZWluemVsbmUgUGFyYW1ldGVyLgorICBtX2FkZChtaW5pcXVlc3RzLCBuZXdfbXFvYiwgbV9lbnRyeShtaW5pcXVlc3RzLCBvbGRfbXFvYikuLi4pOworICBtX2RlbGV0ZShtaW5pcXVlc3RzLCBvbGRfbXFvYik7CisgIC8vIE51bW1lcm4tSW5kZXggYXVjaCB1bXRyYWdlbiwgc29uc3Qga29lbm5lbiBGdW5rdGlvbmVuIHdpZSB6QgorICAvLyBRdWVyeU1pbmlRdWVzdEJ5TnVtYmVyKCkgZGllIG5ldWUgbmljaHQgZmluZGVuLgorICBieV9udW1bbWluaXF1ZXN0c1tuZXdfbXFvYixNUV9EQVRBX1FVRVNUTk9dXVsxXSA9IG5ld19tcW9iOworICByZXR1cm4gMTsKK30KKworI2RlZmluZSBGUkFfQklCICIvZC9lYmVuZS9taXJpbC9mcmF0ZXJuaXRhcy9yb29tL2JpYmxpb3RoZWsiCisKKy8vIEVybGF1YnQgZGllIEFiZnJhZ2UgYWxsZXIgTVFzIGVpbmVyIGJlc3RpbW10ZW4gUmVnaW9uIGZ1ZXIgZGllIEJpYmxpb3RoZWsKKy8vIGRlciBrbGVpbmVuIHVuZCBncm9zc2VuIEhlbGRlbnRhdGVuIGluIGRlciBGcmF0ZXJuaXRhcy4KKy8vIEdpYnQgZWluIE1hcHBpbmcgZGVyIEZvcm0gKFsgaW5kZXhudW1tZXIgOiB0aXRlbDsgZXJsZWRpZ3RfQmVzY2hyZWlidW5nIF0pCisvLyB6dXJ1ZWNrLgorbWFwcGluZyBRdWVyeVNvbHZlZE1Rc0J5RG9tYWluKG1peGVkIHBsLCBzdHJpbmcgcmVnaW9uKSB7CisgIGlmICggIW9iamVjdHAocGwpICYmICFzdHJpbmdwKHBsKSAmJiAKKyAgICAgICBsb2FkX25hbWUocHJldmlvdXNfb2JqZWN0KCkpIT1GUkFfQklCKSAvKnx8ICFhbGxvd2VkX3dyaXRlX2FjY2VzcygpKSovCisgICAgcmV0dXJuIChbOjJdKTsKKworICBtYXBwaW5nIHJlcyA9IG1fYWxsb2NhdGUoMzAsMik7ICAgLy8gcmVpY2h0IHZlcm11dGxpY2gKKyAgLy8gRGllIGFuZ2VnZWJlbmUgUmVnaW9uIG11c3MgaW4gZGVyIFNwYWx0ZSBNUV9EQVRBX0FTU0lHTkVEX0RPTUFJTgorICAvLyBlbnRoYWx0ZW4gc2VpbiwgdW5kIGRhcyBhYmZyYWdlbmRlIE9iamVrdCBtdXNzIGRpZSBGcmF0ZXJuaXRhcy1CaWIgc2VpbgorICBmb3JlYWNoKHN0cmluZyBtcW9iaiwgaW50IG1xcCwgaW50IGluZGV4LCBzdHJpbmcgdGFzaywgaW50IHZpcywgaW50IGFjdCwKKyAgICBzdHJpbmcgdGl0bGUsIHN0cmluZyBkb25lZGVzYywgbWFwcGluZyByZXN0ciwgc3RyaW5nIGRvbWFpbjoKKyAgICBtaW5pcXVlc3RzKSB7CisgICAgICAvLyBha3RpdmUgTVFzIGRlciBhbmdlZm9yZGVydGVuIFJlZ2lvbiB6dXNhbW1lbnRyYWdlbiwgZGllIGRlciBTcGllbGVyCisgICAgICAvLyBiZXN0YW5kZW4gaGF0LgorICAgICAgaWYgKCBkb21haW4gPT0gcmVnaW9uICYmIGFjdCAmJiBIYXNNaW5pUXVlc3QocGwsIG1xb2JqKSApCisgICAgICAgIG1fYWRkKHJlcywgaW5kZXgsIHRpdGxlLCBkb25lZGVzYyk7CisgIH0KKyAgLy9ERUJVRyhzcHJpbnRmKCIlT1xuIixyZXMpKTsKKyAgcmV0dXJuIHJlczsKK30KKyN1bmRlZiBGUkFfQklCCisKKy8vIEFiZnJhZ2UgZGVyIG5vY2ggb2ZmZW5lbiBNUXMgZGVzIGFuZ2VnZWJlbmVuIFNwaWVsZXJzLgorLy8gWnVydWVja2dlZ2ViZW4gd2lyZCBlaW4gTWFwcGluZyBtaXQgZGVuIE1pbmlxdWVzdC1OdW1tZXJuIGFscyBLZXlzIHVuZAorLy8gZGVuIEF1ZmdhYmVuYmVzY2hyZWlidW5nZW4gYWxzIFZhbHVlcywgb2RlciBlaW4gbGVlcmVzIE1hcHBpbmcsIGZhbGxzCisvLyBkYXMgYWJmcmFnZW5kZSBPYmpla3Qga2VpbmUgWnVncmlmZnNiZXJlY2h0aWd1bmcgaGF0LCBvZGVyIGRhcyAKKy8vIHVlYmVyZ2ViZW5lIFNwaWVsZXJvYmpla3Qga2VpbmUgb2ZmZW5lbiBNaW5pcXVlc3RzIG1laHIgaGF0LgorbWFwcGluZyBRdWVyeU9wZW5NaW5pUXVlc3RzRm9yUGxheWVyKG9iamVjdCBzcGllbGVyKSB7CisgIC8vIG1hcCgpIGV0d2FzIGJlc2NobGV1bmlnZW4KKyAgY2xvc3VyZSBjaGtfcmVzdHIgPSBzeW1ib2xfZnVuY3Rpb24oImNoZWNrX3Jlc3RyaWN0aW9ucyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvc3RkL3Jlc3RyaWN0aW9uX2NoZWNrZXIiKTsKKyAgLy8gQ2FjaGUtRWludHJhZyBmdWVyIGRhcyBhYmZyYWdlbmRlIE9iamVrdCBob2xlbgorICBzdHJpbmcgKmxpc3QgPSBtcV9xdWVyeV9wZXJtaXR0ZWRbbG9hZF9uYW1lKHByZXZpb3VzX29iamVjdCgpKV07CisgIG1hcHBpbmcgcmVzID0gKFs6Ml0pOyAKKyAgCisgIGlmICghcG9pbnRlcnAobGlzdCkgfHwgIXNpemVvZihsaXN0KSkKKyAgICByZXR1cm4gcmVzOworICAvLyBMaXN0ZSBkZXIgTVEtT2JqZWt0ZSB1bXdhbmRlbG4gaW4gZGVyZW4gTVEtTnVtbWVyIHBsdXMgCisgIC8vIEF1ZmdhYmVuYmVzY2hyZWlidW5nLCBzb2Zlcm4gZGVyIFNwaWVsZXIgZGllIE1RIG5vY2ggbmljaHQgYmVzdGFuZGVuCisgIC8vIGhhdCwgYWJlciBkaWUgVm9yYXVzc2V0enVuZ2VuIGVyZnVlbGx0LgorICBmb3JlYWNoICggc3RyaW5nIG1xX29iaiA6IGxpc3QgKSAKKyAgeworICAgIC8vIE51ciB3ZW5uIGRlciBTcGllbGVyIGRpZSBNUSBub2NoIG5pY2h0IGhhdCwga2FubiBlciB1ZWJlcmhhdXB0IGVpbmVuCisgICAgLy8gVGlwIGRhenUgYmVrb21tZW4uCisgICAgaWYgKCAhSGFzTWluaVF1ZXN0KHNwaWVsZXIsIG1xX29iaikgKSB7CisgICAgICAvLyBSZXN0cmljdGlvbiBDaGVja2VyIGZyYWdlbiwgb2IgZGVyIFNwaWVsZXIgc3RhdHQgZGVzIEhpbndlaXNlcworICAgICAgLy8gZWluZSBJbmZvIGJla29tbWVuIG11c3MsIGRhc3MgZXIgZWluZSBWb3JiZWRpbmd1bmcgbmljaHQgZXJmdWVsbHQuCisgICAgICBzdHJpbmcgcmVzdHJfcmVzdWx0ID0gZnVuY2FsbChjaGtfcmVzdHIsIHNwaWVsZXIsIG1pbmlxdWVzdHNbbXFfb2JqLAorICAgICAgICBNUV9EQVRBX1JFU1RSSUNUSU9OU10pOworICAgICAgLy8gV2VubiBzbyBlaW5lIEluZm8gZGFiZWkgcmF1c2tvbW10LCB3aXJkIGRpZXNlIGluIGRpZSBFcmdlYm5pc2xpc3RlCisgICAgICAvLyB1ZWJlcm5vbW1lbi4gSW4gZGllc2VtIEZhbGwgd2lyZCBLRUlOIE1RLUhpbndlaXN0ZXh0IGF1c2dlbGllZmVydC4KKyAgICAgIGlmICggc3RyaW5ncChyZXN0cl9yZXN1bHQpICkKKyAgICAgIHsKKyAgICAgICAgbV9hZGQocmVzLCBtaW5pcXVlc3RzW21xX29iaixNUV9EQVRBX1FVRVNUTk9dLCAwLCByZXN0cl9yZXN1bHQpOworICAgICAgfQorICAgICAgLy8gQW5kZXJlbmZhbGxzIHdpcmQgZGVyIEhpbndlaXN0ZXh0IHVlYmVybm9tbWVuOyBlaW5lbiBFaW50cmFnIAorICAgICAgLy8gYnpnbC4gZWluZXMgZXZlbnR1ZWxsZW4gSGluZGVydW5nc2dydW5kZXMgZ2lidCdzIGRhbm4gbmljaHQuCisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIG1fYWRkKHJlcywgbWluaXF1ZXN0c1ttcV9vYmosTVFfREFUQV9RVUVTVE5PXSwgCisgICAgICAgICAgbWluaXF1ZXN0c1ttcV9vYmosTVFfREFUQV9UQVNLREVTQ10sIDApOworICAgICAgfQorICAgIH0KKyAgfQorICAvLyBFcmdlYm5pc2xpc3RlIHp1cnVlY2tnZWJlbi4KKyAgcmV0dXJuIHJlczsKK30KKworLy8gRGF0ZW5rb252ZXJ0ZXIgZnVlciBkYXMgYmlzaGVyaWdlIE1RLU1hcHBpbmcgdm9uCisvLyAoWyBvYmogOiAoe2RhdGVuMS4uZGF0ZW41fSkgXSkgbmFjaAorLy8gKFsgb2JqIDogZGF0ZW4xOyBkYXRlbjI7IC4uLjsgZGF0ZW45IF0pLCB3b2JlaSBkYXRlbjYuLjkgYWxzIExlZXJzcGFsdGVuCisvLyBlcnpldWd0IHdlcmRlbi4KKy8qdm9pZCBDb252ZXJ0TVFEYXRhKCkgeworICBpZiAoICFhbGxvd2VkX3dyaXRlX2FjY2VzcygpICkKKyAgICByZXR1cm47CisKKyAgYnlfbnVtPShbXSk7CisgIC8vIHNwYWx0ZW53ZWlzZSBhdXMgZGVtIG1pbmlxdWVzdHMtTWFwcGluZyBlaW4gQXJyYXkgYXVzIEFycmF5cyBlcnpldWdlbgorICAvLyBadW5hZWNoc3QgZGllIEtleXMgZGVzIE1hcHBpbmdzIGF1Zm5laG1lbi4KKyAgbWl4ZWQgKm1xZGF0YSA9ICh7bV9pbmRpY2VzKG1pbmlxdWVzdHMpfSk7CisKKyAgLy8gRGFubiBkYXMgRGF0ZW5hcnJheSBzcGFsdGVud2Vpc2UgZGF6dSAoamVkZXMgQXJyYXkgaXN0IGVpbmUgU3BhbHRlKS4KKyAgbXFkYXRhICs9IHRyYW5zcG9zZV9hcnJheShtX3ZhbHVlcyhtaW5pcXVlc3RzKSk7CisgIC8vIDEuIEFycmF5OiBLZXlzLCBhbGxlIHdlaXRlcmVuIGpld2VpbHMgZWluZSBXZXJ0ZXNwYWx0ZQorCisgIC8vIEFycmF5IGVyemV1Z2VuIGFscyBBcnJheSBhdXMgNSBBcnJheS1FbGVtZW50ZW4sIGRpZSBhbGxlIHNvdmllbGUKKyAgLy8gTnVsbGVuIGVudGhhbHRlbiwgd2llIGVzIE1pbmlxdWVzdHMgZ2lidCwKKyAgLy8gKHsgKHswLDAsLi4ufSksICh7MCwwLC4uLn0pLCAoezAsMCwuLi59KSwgKHswLDAsLi4ufSksICh7MCwwLC4uLn0pIH0pCisgIC8vIGRpZXNlcyBoaW56dWZ1ZWdlbi4gU2luZCBkaWUgaGluenVrb21tZW5kZW4gNSBTcGFsdGVuLgorICBtcWRhdGEgKz0gYWxsb2NhdGUoNSwgYWxsb2NhdGUoc2l6ZW9mKG1pbmlxdWVzdHMpLDApKTsKKworICAvLyBNYXBwaW5nIGVyemV1Z2VuLCBpbmRlbSBtaXQgZGVtIGZsYXR0ZW4tT3BlcmF0b3IgIi4uLiIgZGllIEVpbnplbC0KKyAgLy8gQXJyYXlzIGRlcyBEYXRlbnBha2V0cyB1ZWJlcmdlYmVuIHdlcmRlbi4gRXJ6ZXVndCBhdWYgZGllc2UgV2Vpc2UKKyAgLy8gKFsga2V5cyA6IGRhdGVuMTsgZGF0ZW4yOyBkYXRlbjM7IGRhdGVuNDsgZGF0ZW41OyAwOyAwOyAwOyAwOyAwLF0pCisgIG1pbmlxdWVzdHM9bWttYXBwaW5nKG1xZGF0YS4uLik7Cit9CisKKy8vIE5ldWUgRGF0ZW4gZWlubGVzZW4sIFZpc2libGUtRmxhZyBiZWkgYWxsZW4gTVFzIHBlciBEZWZhdWx0IGF1ZiAxIHNldHplbi4KKy8vIEVzIGdpYnQga2VpbmUgd2lya2xpY2ggdW5zaWNodGJhcmVuIE1RcyBtZWhyLgordm9pZCBSZWFkTmV3RGF0YSgpIHsKKyAgaWYgKCAhYWxsb3dlZF93cml0ZV9hY2Nlc3MoKSApCisgICAgcmV0dXJuOworCisgIHN0cmluZyAqaW1wb3J0ID0gZXhwbG9kZShyZWFkX2ZpbGUoIi9wbGF5ZXJzL2FyYXRob3JuL21xZGF0YSIpLCJcbiIpLSh7IiJ9KTsKKyAgc3RyaW5nICpmaWVsZHM7CisgIGZvcmVhY2goc3RyaW5nIG1xZGF0YSA6IGltcG9ydCkgeworICAgIGZpZWxkcyA9IGV4cGxvZGUobXFkYXRhLCAiIyIpLSh7IiJ9KTsKKyAgICBERUJVRyhzcHJpbnRmKCIlT1xuIiwgZmllbGRzWzBdKSk7CisgICAgaWYgKCBtaW5pcXVlc3RzW2ZpZWxkc1s0XSwgTVFfREFUQV9RVUVTVE5PXSAhPSB0b19pbnQoZmllbGRzWzBdKSApIHsKKyAgICAgIHJhaXNlX2Vycm9yKCJNUS1OdW1tZXJuIHN0aW1tZW4gbmljaHQgdWViZXJlaW4hXG4iKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy8gZmllbGRzWzRdIGlzdCBkZXIgTVEtT2JqZWt0cGZhZAorICAgIG1pbmlxdWVzdHNbZmllbGRzWzRdLCBNUV9EQVRBX1RJVExFXSA9IGZpZWxkc1s3XTsKKyAgICBtaW5pcXVlc3RzW2ZpZWxkc1s0XSwgTVFfREFUQV9ESUFSWVRFWFRdID0gZmllbGRzWzZdOworICAgIG1pbmlxdWVzdHNbZmllbGRzWzRdLCBNUV9EQVRBX1RBU0tERVNDXSA9IGZpZWxkc1s1XTsKKyAgICBtaW5pcXVlc3RzW2ZpZWxkc1s0XSwgTVFfREFUQV9WSVNJQkxFXSA9IDE7IC8vIERlZmF1bHQ6IHZpc2libGUKKyAgICBtaW5pcXVlc3RzW2ZpZWxkc1s0XSwgTVFfREFUQV9BU1NJR05FRF9ET01BSU5dID0gZmllbGRzWzhdOworICAgIG1pbmlxdWVzdHNbZmllbGRzWzRdLCBNUV9EQVRBX1FVRVJZX1BFUk1JVFRFRF0gPSBmaWVsZHNbOV07CisgICAgaWYgKCBmaWVsZHNbM10gIT0gIjAiICkgeworICAgICAgbWluaXF1ZXN0c1tmaWVsZHNbNF0sIE1RX0RBVEFfUkVTVFJJQ1RJT05TXSA9CisgICAgICAgIHJlc3RvcmVfdmFsdWUoZmllbGRzWzNdKyJcbiIpOworICAgIH0KKyAgICBlbHNlIG1pbmlxdWVzdHNbZmllbGRzWzRdLCBNUV9EQVRBX1JFU1RSSUNUSU9OU10gPSAwOworICAgIGlmICggZmllbGRzWzldICE9ICIwIiApCisgICAgICBtaW5pcXVlc3RzW2ZpZWxkc1s0XSwgTVFfREFUQV9RVUVSWV9QRVJNSVRURURdID0KKyAgICAgICAgcmVzdG9yZV92YWx1ZShmaWVsZHNbOV0rIlxuIik7CisgICAgZWxzZSBtaW5pcXVlc3RzW2ZpZWxkc1s0XSwgTVFfREFUQV9RVUVSWV9QRVJNSVRURURdID0gMDsKKyAgfQorfQorKi8KZGlmZiAtLWdpdCBhL3NlY3VyZS9xdWVzdG1hc3Rlci5oIGIvc2VjdXJlL3F1ZXN0bWFzdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNmNjFhYQotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9xdWVzdG1hc3Rlci5oCkBAIC0wLDAgKzEsMTMyIEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gcXVlc3RtYXN0ZXIuaCAtLSBoZWFkZXIgZmlsZSBmb3IgcXVlc3RtYXN0ZXIgb2JqZWN0CisvLworLy8gJElkOiBxdWVzdG1hc3Rlci5oIDgyNjEgMjAxMi0xMi0wNCAyMjo1NjoyOVogWmVzc3RyYSAkCisKKyNpZm5kZWYgX19RVUVTVE1BU1RFUl9IX18KKyNkZWZpbmUgX19RVUVTVE1BU1RFUl9IX18KKworLy9YUCB0aHJlc2hvbGQgIAorCisjZGVmaW5lIFhQX05FRURFRF9GT1JfV0laIDEwMDAwMDAKKworLy8gdGhlIHF1ZXN0bWFzdGVyCisjZGVmaW5lIFFNICAgICAgICAgIi9zZWN1cmUvcXVlc3RtYXN0ZXIiCisKKy8vIHRoZSBxdWVzdHMgZmlsZQorI2RlZmluZSBRVUVTVFMgICAgICAgICIvc2VjdXJlL0FSQ0gvcXVlc3RtYXN0ZXIiCisKKy8vIER1bXBmaWxlIGZvciBNaW5pUXVlc3RzCisjZGVmaW5lIE1RX0RVTVBfRklMRSAgIi9zZWN1cmUvQVJDSC9NSU5JUVVFU1RTLmR1bXAiCisKKy8vIHBlcmNlbnRhZ2Ugb2YgbWF4X1FQIHdoaWNoIGlzIG5lZWRlZCB0byBiZWNvbWUgd2l6YXJkCisjZGVmaW5lIFFQX1BFUkNFTlQgODAKKworCisvLyBtaW5pbXVtIG9mIFFQIHRvIGJlY29tZSBTZWVyIG9yIFdpenphcmQKKyNkZWZpbmUgUVBfTUlOIDExOTYKKworCisvLyBsb2cgdG8gZmlsZQorCisjZGVmaW5lIFFNTE9HKHgpIHdyaXRlX2ZpbGUoIi9sb2cvUVVFU1RNQVNURVIiLGR0aW1lKHRpbWUoKSkrIjogIitcCisgICAgICAgIGdldGV1aWQodGhpc19pbnRlcmFjdGl2ZSgpKSsiIC0+ICIrIHggKyJcbiIpCisKKyNkZWZpbmUgTVFNTE9HKHgpIHdyaXRlX2ZpbGUoIi9sb2cvQVJDSC9NUVVFU1RNQVNURVIiLCBcCisgICAgICAgIGR0aW1lKHRpbWUoKSkrIjogIisodGhpc19pbnRlcmFjdGl2ZSgpP2dldGV1aWQodGhpc19pbnRlcmFjdGl2ZSgpKToiVU5LTk9XTiIpK1wKKwkiIC0+ICIrIHggKyJcbiIpCisKKyNkZWZpbmUgTVFTT0xWRURMT0coeCkgd3JpdGVfZmlsZSgiL2xvZy9BUkNIL01RX1NPTFZFRCIsIFwKKyAgICAgICAgZHRpbWUodGltZSgpKSsiICIreCsiXG4iKQorCisvLyBxdWVzdCBncm91cHMKKworI2RlZmluZSBRR1JPVVBfMSA4CisjZGVmaW5lIFFHUk9VUF8yIDE4CisjZGVmaW5lIFFHUk9VUF8zIDI5CisjZGVmaW5lIFFHUk9VUF9TIC0xCisKKyNkZWZpbmUgUUdST1VQUyAoezAsUUdST1VQXzEsUUdST1VQXzIsIFFHUk9VUF8zfSkKKworCisvLyBXZWxjaGVyIEVpbnRyYWcgaW0gQXJyYXkgc3RlaHQgZnVlciB3YXM/CisjZGVmaW5lIFFfUVAgICAgICAwCisjZGVmaW5lIFFfWFAgICAgICAxCisjZGVmaW5lIFFfQUxMT1dFRCAyCisjZGVmaW5lIFFfSElOVCAgICAzCisjZGVmaW5lIFFfRElGRiAgICA0CisjZGVmaW5lIFFfQ0xBU1MgICA1CisjZGVmaW5lIFFfQUNUSVZFICA2CisjZGVmaW5lIFFfV0laICAgICA3CisjZGVmaW5lIFFfU0NORFdJWiA4CisjZGVmaW5lIFFfQVRUUiAgICA5CisjZGVmaW5lIFFfQVZFUkFHRSAxMAorCisvLyBTdGVybmNoZW4gZnVlciBkaWUgS2xhc3NlCisKKyNkZWZpbmUgUUNMQVNTX1NUQVJTKG4pIGZ1bmNhbGwobGFtYmRhKCAgKHsgJ3gsICdzIH0pLCAgXAorICAoeyMnd2hpbGUsICh7Iyc+LCAneCwgMH0pLCBcCisgICAgICAgICAgICAgJ3MsICh7IycsICwoeyMnPSwgJ3gsICh7IyctLCAneCwgMX0pIH0pLCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgKHsjJz0sICdzLCAoeyMnKywgJ3MsICIqIiB9KSB9KSBcCisgICAgIH0pIH0pICksIG4sICIiKSAvKiAnICovIAorCisKKy8vIEF0dHJpYnV0ZSBkZXIgUXVlc3RzCisjZGVmaW5lIFFBVFRSX0ZMRUlTU0lHICAxCisjZGVmaW5lIFFBVFRSX0hFUk9JU0NIICAyCisjZGVmaW5lIFFBVFRSX0VQSVNDSCAgICAzCisjZGVmaW5lIFFBVFRSX0xFR0VOREFFUiA0CisKKyNkZWZpbmUgUUFUVFJfU1RSSU5HUyAoWzA6ICIiLCBcCisgICAgICAgICAgICAgICAgICAgICAgICBRQVRUUl9GTEVJU1NJRzogImZsZWlzc2lnIiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgUUFUVFJfSEVST0lTQ0g6ICAiaGVyb2lzY2giLCBcCisgICAgICAgICAgICAgICAgICAgICAgICBRQVRUUl9FUElTQ0g6ICJlcGlzY2giLCBcCisgICAgICAgICAgICAgICAgICAgICAgICBRQVRUUl9MRUdFTkRBRVI6ICJsZWdlbmRhZXIiXSkKKworCisKKy8vIFJ1ZWNrZ2FiZXdlcnRlIFF1ZXN0cworCisjZGVmaW5lIE9LICAgICAgICAgICAgICAxCisKKyNkZWZpbmUgR1FfQUxSRUFEWV9TRVQgLTEKKyNkZWZpbmUgR1FfS0VZX0lOVkFMSUQgLTIKKyNkZWZpbmUgR1FfSUxMRUdBTF9PQkogLTMKKyNkZWZpbmUgR1FfSVNfSU5BQ1RJVkUgLTQKKworI2RlZmluZSBEUV9OT1RfU0VUICAgICAtMQorI2RlZmluZSBEUV9LRVlfSU5WQUxJRCAtMgorI2RlZmluZSBEUV9JTExFR0FMX09CSiAtMworCisjZGVmaW5lIFFRX0dVRVNUICAgICAgIDIKKyNkZWZpbmUgUVFfS0VZX0lOVkFMSUQgMAorCisjZGVmaW5lIEVSUk5PXzJfU1RSSU5HKHgseSkgKFsiR1ExIiA6ICJPay4iLFwKKwkJCSAgICAgICJHUS0xIjogIkRpZSBRdWVzdCBpc3QgYmVyZWl0cyBnZWxvZXN0IHdvcmRlbi4iLFwKKwkJCSAgICAgICJHUS0yIjogIlVuZ3VlbHRpZ2VyIFF1ZXN0bmFtZS4iLFwKKwkJCSAgICAgICJHUS0zIjogIlVuYmVmdWd0ZXIgWnVncmlmZi4iLFwKKwkJCSAgICAgICJHUS00IjogIkRpZSBRdWVzdCBpc3QgZGVyemVpdCBpbmFrdGl2LiIsXAorCQkJICAgICAgIkRRMSIgOiAiT2suIixcCisJCQkgICAgICAiRFEtMSI6ICJEaWUgUXVlc3Qgd2FyIG5pY2h0IGdlc2V0enQuIixcCisJCQkgICAgICAiRFEtMiI6ICJVbmd1ZWx0aWdlciBRdWVzdG5hbWUuIixcCisJCQkgICAgICAiRFEtMyI6ICJVbmJlZnVndGVyIFp1Z3JpZmYuIixcCisJCQkgICAgICAiUVExIiA6ICJPay4iLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJRUTIiIDogIkdhZXN0ZSBrb2VubmVuIGtlaW5lIFF1ZXN0IGxvZXNlbi4iLFwKKwkJCSAgICAgICJRUTAiIDogIlVuZ3VlbHRpZ2VyIFF1ZXN0bmFtZS4iLFwKKwkJCSAgICAgIF0pW3greV0KKworCisvLyBNaW5pcXVlc3RzCisKKyNkZWZpbmUgTVFfQUxSRUFEWV9TRVQgICAtMQorI2RlZmluZSBNUV9LRVlfSU5WQUxJRCAgIC0yCisjZGVmaW5lIE1RX0lMTEVHQUxfT0JKICAgLTMKKyNkZWZpbmUgTVFfSVNfSU5BQ1RJVkUgICAtNAorI2RlZmluZSBNUV9HVUVTVCAgICAgICAgIC01CisKKworI2VuZGlmIC8qIF9fUVVFU1RNQVNURVJfSF9fICovCisKKworCmRpZmYgLS1naXQgYS9zZWN1cmUvcmVwbWFzdGVyLmMgYi9zZWN1cmUvcmVwbWFzdGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFjODE3ZAotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9yZXBtYXN0ZXIuYwpAQCAtMCwwICsxLDMyOSBAQAorI3ByYWdtYSBzdHJpY3RfdHlwZXMKKyNwcmFnbWEgbm9fY2xvbmUKKyNwcmFnbWEgbm9fc2hhZG93CisjcHJhZ21hIG5vX2luaGVyaXQKKyNwcmFnbWEgdmVyYm9zZV9lcnJvcnMKKyNwcmFnbWEgd2Fybl9kZXByZWNhdGVkCisKKyNpbmNsdWRlIDxyZXB1dGF0aW9uLmg+CisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisKKy8qIERhdGVuc3RydWt0dXIgcmVwdXRhdGlvbnM6CisgKiAoWyJpZCI6IChbInVpZHMiOiAoeyAidWlkMSIsICJ1aWQyIiB9KSwgIm5hbWUiOiIiLCAiY2hhbmdlbXNnIjoiIiwgIAorICogICAgICAgICAgICJmbGFncyI6eHx4fHgKKyAqICAgICAgICAgXSkgCisgKiBdKQorICogQnNwOgorICogKFsic2NoYWVkbHNwYWx0YSI6IChbInVpZHMiOiAoeyJkLndhbGQubmliZWwiLCAiZC53YWxkLmtlc3NhIn0pLAorICogICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiU2NoYWVkbHNwYWx0YS1LbGFuIiwgImFjdGl2ZSI6IDEsCisgKiAgICAgICAgICAgICAgICAgICAgICAiY2hhbmdlbXNnIjoiYmVpbSBTY2hhZWRsc3BhbHRhLUtsYW4iIAorICogICAgICAgICAgICAgICAgICAgIF0pCisgKiBdKQorICovCisKK3ByaXZhdGUgbWFwcGluZyByZXB1dGF0aW9uczsKKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkgeworICBzZXRldWlkKGdldHVpZCh0aGlzX29iamVjdCgpKSk7CisKKyAgaWYoIXJlc3RvcmVfb2JqZWN0KFJFUF9TQVZFRklMRSkgfHwgIW1hcHBpbmdwKHJlcHV0YXRpb25zKSkgCisgICAgcmVwdXRhdGlvbnMgPSAoWyBdKTsKK30KKworLy8gWnVncmlmZiBhdWYgSGFuZGxpbmdtZXRob2RlbiBmdWVyIFJPT1QsIEVNcysKK3ByaXZhdGUgaW50IFNlYygpIHsKKyAgaWYocHJvY2Vzc19jYWxsKCkpIHJldHVybiAwOworICBpZihwcmV2aW91c19vYmplY3QoKSAmJiBnZXRldWlkKHByZXZpb3VzX29iamVjdCgpKSA9PSBST09USUQpIHJldHVybiAxOworICByZXR1cm4gb2JqZWN0cChwcmV2aW91c19vYmplY3QoKSkgJiYgQVJDSF9TRUNVUklUWTsKK30KKworCisvKiBBcmd1bWVudGU6CisgKiByZXBpZCA9IGlkIGltIG1hcHBpbmcgcmVwdXRhdGlvbnMKKyAqIHZhbGlkdWlkcyA9IFVJRHMgd2VsY2hlIGRpZSBSZXB1dGF0aW9uIHZlcmFlbmRlcm4gZHVlcmZlbiwgU3RyaW5nCisgKiAgICAgICAgICAgICBvZGVyIFN0cmluZy1BcnJheQorICogbmFtZSA9IE5hbWUgZGVyIFJlcHV0YXRpb25zZnJha3Rpb24gCisgKiBjaGFuZ2Vtc2cgPSBUZXh0IGRlciBpbiBkaWUgRGVmYXVsdC1DaGFuZ2Vtc2cgZWluZ2VmdWVndCB3aXJkCisgKiAgICAgICAgICAgICAoRGVpbiBBbnNlaGVuICVzIGhhdCBzaWNoIC4uLiB2ZXJiZXNzZXJ0LikKKyAqCisgKiBSZXR1cm5zOgorICogIDEgPSBSZXB1dGF0aW9uIGVyZm9sZ3JlaWNoIGhpbnp1Z2VmdWVndAorICogLTEgPSBLZWluZSBadWdyaWZmc3JlY2h0ZQorICogLTIgPSBGYWxzY2hlIEFyZ3VtZW50ZQorICogLTMgPSBSZXB1dGF0aW9uIGJlcmVpdHMgdm9yaGFuZGVuCisgKi8KK3B1YmxpYyBpbnQgQWRkUmVwdXRhdGlvbihzdHJpbmcgcmVwaWQsIG1peGVkIHZhbGlkdWlkcywgc3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGNoYW5nZW1zZykgeworICBpZighU2VjKCkpIAorICAgIHJldHVybiAtMTsKKyAgaWYoc3RyaW5ncCh2YWxpZHVpZHMpKSB2YWxpZHVpZHMgPSAoeyB2YWxpZHVpZHMgfSk7CisgIGlmKCFwb2ludGVycCh2YWxpZHVpZHMpKSB2YWxpZHVpZHMgPSAoeyB9KTsKKyAgLy8gdmFsaWR1aWRzICsgY2hhbmdlbXNncyBrYW5uIGF1Y2ggZXJzdG1hbCBsZWVyIGJsZWliZW4KKyAgaWYoIXN0cmluZ3AocmVwaWQpIHx8ICFzaXplb2YocmVwaWQpIHx8ICFzdHJpbmdwKG5hbWUpIHx8ICFzaXplb2YobmFtZSkpCisgICAgcmV0dXJuIC0yOworICBpZihtZW1iZXIocmVwdXRhdGlvbnMsIHJlcGlkKSkKKyAgICByZXR1cm4gLTM7CisgIHJlcHV0YXRpb25zICs9IChbIHJlcGlkIDogKFsgCisgICAgInVpZHMiOiB2YWxpZHVpZHMsCisgICAgIm5hbWUiOiBuYW1lLAorICAgICJmbGFncyI6IFJFUF9GTEFHX0FDVElWRSwKKyAgICAiY2hhbmdlbXNnIjogY2hhbmdlbXNnCisgIF0pIF0pOworICBzYXZlX29iamVjdChSRVBfU0FWRUZJTEUpOworICB0ZWxsX29iamVjdCh0aGlzX2ludGVyYWN0aXZlKCksIHNwcmludGYoIlJlcHV0YXRpb24gZWluZ2V0cmFnZW46XG4iCisgICAgIk5hbWU6ICVzXG5WYWxpZCBVSURzOiAlT1xuRmxhZ3M6IFJFUF9GTEFHX0FDVElWRVxuQ2hhbmdlbXNnOiAlc1xuIiwKKyAgICByZXB1dGF0aW9uc1tyZXBpZF1bIm5hbWUiXSwgcmVwdXRhdGlvbnNbcmVwaWRdWyJ1aWRzIl0sCisgICAgcmVwdXRhdGlvbnNbcmVwaWRdWyJjaGFuZ2Vtc2ciXSkpOworICByZXR1cm4gMTsKK30KKworLyogQXJndW1lbnRlOgorICogcmVwaWQgPSBpZCBpbSBtYXBwaW5nIHJlcHV0YXRpb25zCisgKgorICogUmV0dXJuczoKKyAqICAxID0gd3VyZGUgZXJmb2xncmVpY2ggZGVha3RpdmllcnQKKyAqIC0xID0gS2VpbmUgWnVncmlmZnNyZWNodGUKKyAqIC0yID0gRmFsc2NoZSBBcmd1bWVudGUKKyAqIC0zID0gUmVwIG5pY2h0IHZvcmhhbmRlbgorICogLTQgPSBJc3QgYmVyZWl0cyBkZWFrdGl2aWVydAorICovCitwdWJsaWMgaW50IERlYWN0aXZhdGVSZXB1dGF0aW9uKHN0cmluZyByZXBpZCkgeworICBpZighU2VjKCkpCisgICAgcmV0dXJuIC0xOworICBpZighc3RyaW5ncChyZXBpZCkgfHwgIXNpemVvZihyZXBpZCkpCisgICAgcmV0dXJuIC0yOworICBpZighbWVtYmVyKHJlcHV0YXRpb25zLCByZXBpZCkpCisgICAgcmV0dXJuIC0zOworICBpZighKHJlcHV0YXRpb25zW3JlcGlkXVsiZmxhZ3MiXSAmIFJFUF9GTEFHX0FDVElWRSkpIAorICAgIHJldHVybiAtNDsKKyAgcmVwdXRhdGlvbnNbcmVwaWRdWyJmbGFncyJdIHw9IFJFUF9GTEFHX0FDVElWRTsKKyAgc2F2ZV9vYmplY3QoUkVQX1NBVkVGSUxFKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8qIEFyZ3VtZW50ZToKKyAqIHJlcGlkID0gaWQgaW0gbWFwcGluZyByZXB1dGF0aW9ucworICoKKyAqIFJldHVybnM6CisgKiAgMSA9IHd1cmRlIGVyZm9sZ3JlaWNoIGFrdGl2aWVydAorICogLTEgPSBLZWluZSBadWdyaWZmc3JlY2h0ZQorICogLTIgPSBGYWxzY2hlIEFyZ3VtZW50ZQorICogLTMgPSBSZXAgbmljaHQgdm9yaGFuZGVuCisgKiAtNCA9IElzdCBiZXJlaXRzIGFrdGl2aWVydAorICovCitwdWJsaWMgaW50IEFjdGl2YXRlUmVwdXRhdGlvbihzdHJpbmcgcmVwaWQpIHsKKyAgaWYoIVNlYygpKQorICAgIHJldHVybiAtMTsKKyAgaWYoIXN0cmluZ3AocmVwaWQpIHx8ICFzaXplb2YocmVwaWQpKQorICAgIHJldHVybiAtMjsKKyAgaWYoIW1lbWJlcihyZXB1dGF0aW9ucywgcmVwaWQpKQorICAgIHJldHVybiAtMzsKKyAgaWYocmVwdXRhdGlvbnNbcmVwaWRdWyJmbGFncyJdICYgUkVQX0ZMQUdfQUNUSVZFKSAKKyAgICByZXR1cm4gLTQ7CisgIHJlcHV0YXRpb25zW3JlcGlkXVsiZmxhZ3MiXSBePSBSRVBfRkxBR19BQ1RJVkU7CisgIHNhdmVfb2JqZWN0KFJFUF9TQVZFRklMRSk7CisgIHJldHVybiAxOworfQorCisvKiBBcmd1bWVudGU6CisgKiByZXBpZCA9IGlkIGltIG1hcHBpbmcgcmVwdXRhdGlvbnMKKyAqIHVpZCA9IFVJRCB3ZWxjaGUgZGllIFJlcHV0YXRpb24gdmVyYWVuZGVybiBkYXJmCisgKgorICogUmV0dXJuczoKKyAqICAxID0gVUlEIGVyZm9sZ3JlaWNoIGhpbnp1Z2VmdWVndAorICogLTEgPSBLZWluZSBadWdyaWZmc3JlY2h0ZQorICogLTIgPSBGYWxzY2hlIEFyZ3VtZW50ZQorICogLTMgPSBSZXAgbmljaHQgdm9yaGFuZGVuCisgKiAtNCA9IFVJRCBpc3QgYmVyZWl0cyB2b3JoYW5kZW4KKyAqLworcHVibGljIGludCBBZGRSZXB1dGF0aW9uVWlkKHN0cmluZyByZXBpZCwgc3RyaW5nIHVpZCkgeworICBpZighU2VjKCkpCisgICAgcmV0dXJuIC0xOworICBpZighc3RyaW5ncChyZXBpZCkgfHwgIXNpemVvZihyZXBpZCkgfHwgIXN0cmluZ3AodWlkKSB8fCAhc2l6ZW9mKHVpZCkpCisgICAgcmV0dXJuIC0yOworICBpZighbWVtYmVyKHJlcHV0YXRpb25zLCByZXBpZCkpCisgICAgcmV0dXJuIC0zOworICBpZihtZW1iZXIocmVwdXRhdGlvbnNbcmVwaWRdWyJ1aWRzIl0sIHVpZCkgIT0gLTEpIAorICAgIHJldHVybiAtNDsKKyAgcmVwdXRhdGlvbnNbcmVwaWRdWyJ1aWRzIl0gKz0gKHsgdWlkIH0pOworICBzYXZlX29iamVjdChSRVBfU0FWRUZJTEUpOworICByZXR1cm4gMTsKK30KKworLyogQXJndW1lbnRlOgorICogcmVwaWQgPSBpZCBpbSBtYXBwaW5nIHJlcHV0YXRpb25zCisgKiB1aWQgPSBVSUQgd2VsY2hlIGRpZSBSZXB1dGF0aW9uIG5pY2h0IG1laHIgdmVyYWVuZGVybiBkYXJmCisgKgorICogUmV0dXJuczoKKyAqICAxID0gVUlEIGVyZm9sZ3JlaWNoIGdlbG9lc2NodAorICogLTEgPSBLZWluZSBadWdyaWZmc3JlY2h0ZQorICogLTIgPSBGYWxzY2hlIEFyZ3VtZW50ZQorICogLTMgPSBSZXAgbmljaHQgdm9yaGFuZGVuCisgKiAtNCA9IFVJRCBuaWNodCB2b3JoYW5kZW4KKyAqLworcHVibGljIGludCBSZW1vdmVSZXB1dGF0aW9uVWlkKHN0cmluZyByZXBpZCwgc3RyaW5nIHVpZCkgeworICBpZighU2VjKCkpCisgICAgcmV0dXJuIC0xOworICBpZighc3RyaW5ncChyZXBpZCkgfHwgIXNpemVvZihyZXBpZCkgfHwgIXN0cmluZ3AodWlkKSB8fCAhc2l6ZW9mKHVpZCkpCisgICAgcmV0dXJuIC0yOworICBpZighbWVtYmVyKHJlcHV0YXRpb25zLCByZXBpZCkpCisgICAgcmV0dXJuIC0zOworICBpZihtZW1iZXIocmVwdXRhdGlvbnNbcmVwaWRdWyJ1aWRzIl0sIHVpZCkgPT0gLTEpIAorICAgIHJldHVybiAtNDsKKyAgcmVwdXRhdGlvbnNbcmVwaWRdWyJ1aWRzIl0gLT0gKHsgdWlkIH0pOworICBzYXZlX29iamVjdChSRVBfU0FWRUZJTEUpOworICByZXR1cm4gMTsKK30KKworLyogQXJndW1lbnRlOgorICogcmVwaWQgPSBpZCBpbSBtYXBwaW5nIHJlcHV0YXRpb25zCisgKiBuYW1lID0gTmV1ZXIgTmFtZSBkZXIgUmVwCisgKgorICogUmV0dXJuczoKKyAqICAxID0gTmV1ZXIgTmFtZSBlcmZvbGdyZWljaCBnZXNldHp0CisgKiAtMSA9IEtlaW5lIFp1Z3JpZmZzcmVjaHRlCisgKiAtMiA9IEZhbHNjaGUgQXJndW1lbnRlCisgKiAtMyA9IFJlcCBuaWNodCB2b3JoYW5kZW4KKyAqIC00ID0gTmFtZSBlbnRzcHJpY2h0IGRlbSBkZXJ6ZWl0aWdlbgorICovCitwdWJsaWMgaW50IENoYW5nZVJlcHV0YXRpb25OYW1lKHN0cmluZyByZXBpZCwgc3RyaW5nIG5hbWUpIHsKKyAgaWYoIVNlYygpKQorICAgIHJldHVybiAtMTsKKyAgaWYoIXN0cmluZ3AocmVwaWQpIHx8ICFzaXplb2YocmVwaWQpIHx8ICFzdHJpbmdwKG5hbWUpIHx8ICFzaXplb2YobmFtZSkpCisgICAgcmV0dXJuIC0yOworICBpZighbWVtYmVyKHJlcHV0YXRpb25zLCByZXBpZCkpCisgICAgcmV0dXJuIC0zOworICBpZihyZXB1dGF0aW9uc1tyZXBpZF1bIm5hbWUiXSA9PSBuYW1lKSAKKyAgICByZXR1cm4gLTQ7CisgIHJlcHV0YXRpb25zW3JlcGlkXVsibmFtZSJdID0gbmFtZTsKKyAgc2F2ZV9vYmplY3QoUkVQX1NBVkVGSUxFKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8qIEFyZ3VtZW50ZToKKyAqIHJlcGlkID0gaWQgaW0gbWFwcGluZyByZXB1dGF0aW9ucworICogbXNnID0gTmV1ZXIgU3RyaW5nIGluIGRlciBEZWZhdWx0LUNoYW5nZW1zZworICoKKyAqIFJldHVybnM6CisgKiAgMSA9IE5ldWUgTXNnIGVyZm9sZ3JlaWNoIGdlc2V0enQKKyAqIC0xID0gS2VpbmUgWnVncmlmZnNyZWNodGUKKyAqIC0yID0gRmFsc2NoZSBBcmd1bWVudGUKKyAqIC0zID0gUmVwIG5pY2h0IHZvcmhhbmRlbgorICogLTQgPSBNc2cgZW50c3ByaWNodCBkZXIgZGVyemVpdGlnZW4KKyAqLworcHVibGljIGludCBDaGFuZ2VSZXB1dGF0aW9uTXNnKHN0cmluZyByZXBpZCwgc3RyaW5nIG1zZykgeworICBpZighU2VjKCkpCisgICAgcmV0dXJuIC0xOworICBpZighc3RyaW5ncChyZXBpZCkgfHwgIXNpemVvZihyZXBpZCkgfHwgIXN0cmluZ3AobXNnKSB8fCAhc2l6ZW9mKG1zZykpCisgICAgcmV0dXJuIC0yOworICBpZighbWVtYmVyKHJlcHV0YXRpb25zLCByZXBpZCkpCisgICAgcmV0dXJuIC0zOworICBpZihyZXB1dGF0aW9uc1tyZXBpZF1bImNoYW5nZW1zZyJdID09IG1zZykgCisgICAgcmV0dXJuIC00OworICByZXB1dGF0aW9uc1tyZXBpZF1bImNoYW5nZW1zZyJdID0gbXNnOworICBzYXZlX29iamVjdChSRVBfU0FWRUZJTEUpOworICByZXR1cm4gMTsKK30KKworLyogQXJndW1lbnRlOgorICogcmVwaWQgPSBpZChzKSBpbSBtYXBwaW5nIHJlcHV0YXRpb25zLCBvaG5lIEFyZ3VtZW50IHdlcmRlbiBhbGxlIGF1ZmdlbGlzdGV0LAorICogICAgICAgICBTdHJpbmcgb2RlciBTdHJpbmctYXJyYXkKKyAqCisgKiBSZXR1cm5zOgorICogIDEgPSBMaXN0ZSBhdXNnZWdlYmVuCisgKiAtMSA9IEZhbHNjaGUgQXJndW1lbnRlCisgKiAtMiA9IFJlcCBuaWNodCB2b3JoYW5kZW4KKyAqLworcHVibGljIHZhcmFyZ3MgaW50IFZpZXdSZXB1dGF0aW9uRGF0YShtaXhlZCByZXBpZHMpIHsKKyAgLy8gRnVlciBhbGxlIHNpY2h0YmFyLCBkYW1pdCBtYW4gZ2dmLiB3ZWlzcywgd28gbWFuIG5hY2hmcmFnZW4gbXVzcworICBpZighcmVwaWRzKSByZXBpZHMgPSBtX2luZGljZXMocmVwdXRhdGlvbnMpOworICBlbHNlIGlmKHN0cmluZ3AocmVwaWRzKSkgcmVwaWRzID0gKHsgcmVwaWRzIH0pOworICBpZighcG9pbnRlcnAocmVwaWRzKSB8fCAhc2l6ZW9mKHJlcGlkcykpCisgICAgcmV0dXJuIC0xOworICAvLyBUZXh0YXVzZ2FiZSBmdWVyIGFsbGUgcmljaHRpZ2VuIElEcworICBmb3JlYWNoKHN0cmluZyByZXBpZCA6IHJlcGlkcykgeworICAgIGlmKCFtZW1iZXIocmVwdXRhdGlvbnMsIHJlcGlkKSkgY29udGludWU7CisgICAgdGVsbF9vYmplY3QodGhpc19pbnRlcmFjdGl2ZSgpLCBzcHJpbnRmKCIlcyAlc1xuICBOYW1lOiAlc1xuICBDaGFuZ2Vtc2c6ICIKKyAgICAgICIlc1xuICBWYWxpZFVJRFM6ICVPXG5cbiIsIHJlcGlkLCAKKyAgICAgIChyZXB1dGF0aW9uc1tyZXBpZF1bImZsYWdzIl0gJiBSRVBfRkxBR19BQ1RJVkUgPyAiIiA6CisgICAgICAiKEluYWt0aXYpIiksIHJlcHV0YXRpb25zW3JlcGlkXVsibmFtZSJdLCAKKyAgICAgIHJlcHV0YXRpb25zW3JlcGlkXVsiY2hhbmdlbXNnIl0sIHJlcHV0YXRpb25zW3JlcGlkXVsidWlkcyJdKSk7CisgIH0KKyAgLy8gTWluLiAxIG5pY2h0IHZvcmhhbmRlbjogcmV0dXJuIC0yLCBzb25zdCAxCisgIHJldHVybiAoc2l6ZW9mKHJlcGlkcyAtIG1faW5kaWNlcyhyZXB1dGF0aW9ucykpID8gLTIgOiAxKTsKK30KKworLyogQXJndW1lbnRlOgorICogcmVwaWQgPSBpZCBpbSBtYXBwaW5nIHJlcHV0YXRpb25zCisgKgorICogUmV0dXJuczoKKyAqIG1hcHBpbmcgPSBEYXRlbiBkZXIgUmVwdXRhdGlvbgorICogMCA9IEZhbHNjaGVzIEFyZ3VtZW50IC8gUmVwdXRhdGlvbiBuaWNodCB2b3JoYW5kZW4KKyAqLworcHVibGljIG1hcHBpbmcgR2V0UmVwdXRhdGlvbkRhdGEoc3RyaW5nIHJlcGlkKSB7CisgIGlmKCFzdHJpbmdwKHJlcGlkKSB8fCAhc2l6ZW9mKHJlcGlkKSB8fCAhbWVtYmVyKHJlcHV0YXRpb25zLCByZXBpZCkpCisgICAgcmV0dXJuIDA7CisgIHJldHVybiBkZWVwX2NvcHkocmVwdXRhdGlvbnNbcmVwaWRdKTsKK30KKworLyogQXJndW1lbnRlOgorICogcmVwaWQgPSBpZCBpbSBtYXBwaW5nIHJlcHV0YXRpb25zCisgKiB2YWx1ZSA9IFdlcnQgdW0gZGVuIGRpZSBSZXAgdmVyYWVuZGVydCB3aXJkICgrIC8gLSkKKyAqCisgKiBSZXR1cm5zOgorICogc3RyaW5nID0gIkRlaW4gQW5zZWhlbiAlcyBoYXQgc2ljaCAuLi4gLlxuIgorICogMCA9IEZhbHNjaGUgQXJndW1lbnRlIC8gUmVwIG5pY2h0IHZvcmhhbmRlbgorICovCitwdWJsaWMgc3RyaW5nIEdldERlZmF1bHRDaGFuZ2VNc2coc3RyaW5nIHJlcGlkLCBpbnQgdmFsdWUpIHsKKyAgc3RyaW5nIHN0cmVuZ3RoOworICBpZighc3RyaW5ncChyZXBpZCkgfHwgIXNpemVvZihyZXBpZCkgfHwgIWludHAodmFsdWUpIHx8ICF2YWx1ZSB8fAorICAgICAhbWVtYmVyKHJlcHV0YXRpb25zLCByZXBpZCkpCisgICAgcmV0dXJuIDA7CisgIHN3aXRjaChhYnModmFsdWUpKSB7CisgICAgY2FzZSAgICAwLi4yNSAgOiBzdHJlbmd0aCA9ICJrYXVtIG1lcmtsaWNoIjsgYnJlYWs7CisgICAgY2FzZSAgIDI2Li41MCAgOiBzdHJlbmd0aCA9ICJsZWljaHQiOyBicmVhazsKKyAgICBjYXNlICAgNTEuLjEwMCA6IHN0cmVuZ3RoID0gImRldXRsaWNoIjsgYnJlYWs7CisgICAgY2FzZSAgMTAxLi4yNTAgOiBzdHJlbmd0aCA9ICJlcmhlYmxpY2giOyBicmVhazsKKyAgICBjYXNlICAyNTEuLjEwMDA6IHN0cmVuZ3RoID0gInNlaHIgc3RhcmsiOyBicmVhazsKKyAgICBkZWZhdWx0OiAgICAgICAgIHN0cmVuZ3RoID0gImF1c3Nlcm9yZGVudGxpY2ggc3RhcmsiOyBicmVhazsKKyAgfQorICByZXR1cm4gc3ByaW50ZigiRGVpbiBBbnNlaGVuICVzIGhhdCBzaWNoJXMlcy5cbiIsIAorICAgIHJlcHV0YXRpb25zW3JlcGlkXVsiY2hhbmdlbXNnIl0sICghc3RyZW5ndGggPyAiICIgOiAiICIrIHN0cmVuZ3RoICsiICIpLAorICAgICh2YWx1ZSA8IDAgPyAidmVyc2NobGVjaHRlcnQiIDogInZlcmJlc3NlcnQiKSk7Cit9CisKKy8qIEFyZ3VtZW50ZToKKyAqIHJlcGlkID0gaWQgaW0gbWFwcGluZyByZXB1dGF0aW9ucworICogb2IgPSBPYmpla3QsIGRlc3NlbiBVSUQgZ2VwcnVlZnQgd2lyZCwgb2huZSBBcmd1bWVudCAtPiBwcmV2X29iKCkKKyAqCisgKiBSZXR1cm5zOgorICogMSA9IFVJRCB2YWxpZAorICogMCA9IFVJRCBpbnZhbGlkCisgKiAtMSA9IEZhbHNjaGUgQXJndW1lbnRlIAorICogLTIgPSBSZXAgbmljaHQgdm9yaGFuZGVuIAorICovCitwdWJsaWMgaW50IENoZWNrVmFsaWRVaWQoc3RyaW5nIHJlcGlkLCBvYmplY3Qgb2IpIHsKKyAgaWYoIXN0cmluZ3AocmVwaWQpIHx8ICFzaXplb2YocmVwaWQpIHx8ICFvYmplY3RwKG9iKSkKKyAgICByZXR1cm4gLTE7CisgIGlmKCFtZW1iZXIocmVwdXRhdGlvbnMsIHJlcGlkKSkKKyAgICByZXR1cm4gLTI7CisgIHJldHVybiAobWVtYmVyKHJlcHV0YXRpb25zW3JlcGlkXVsidWlkcyJdLCBnZXR1aWQob2IpKSAhPSAtMSk7Cit9CisKKy8qIEFyZ3VtZW50ZToKKyAqIHJlcGlkID0gaWQgaW0gbWFwcGluZyByZXB1dGF0aW9ucworICoKKyAqIFJldHVybnM6CisgKiAxID0gUmVwIGFrdGl2CisgKiAwID0gUmVwIGluYWt0aXYKKyAqIC0xID0gRmFsc2NoZSBBcmd1bWVudGUgCisgKiAtMiA9IFJlcCBuaWNodCB2b3JoYW5kZW4gCisgKi8KK3B1YmxpYyBpbnQgQ2hlY2tSZXBBY3RpdmUoc3RyaW5nIHJlcGlkKSB7CisgIGlmKCFzdHJpbmdwKHJlcGlkKSB8fCAhc2l6ZW9mKHJlcGlkKSkKKyAgICByZXR1cm4gLTE7CisgIGlmKCFtZW1iZXIocmVwdXRhdGlvbnMsIHJlcGlkKSkKKyAgICByZXR1cm4gLTI7CisgIC8vIFZlcmJvb2x1bmcKKyAgcmV0dXJuICEhKHJlcHV0YXRpb25zW3JlcGlkXVsiZmxhZ3MiXSAmIFJFUF9GTEFHX0FDVElWRSk7Cit9CmRpZmYgLS1naXQgYS9zZWN1cmUvc2NvcmVtYXN0ZXIuYyBiL3NlY3VyZS9zY29yZW1hc3Rlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3NmE0YjkKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2NvcmVtYXN0ZXIuYwpAQCAtMCwwICsxLDE0NjUgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBzY29yZW1hc3Rlci5jIC0gVmVyd2FsdHVuZyBkZXIgZWluZGV1dGlnZW4gTnVtbWVybnZlcmdhYmUgZnVlciBOUENzIHVuZAorLy8gICAgICAgTWluaVF1ZXN0cyBzb3dpZSBkZXIgU3R1ZmVucHVua3RlLCBkaWUgc2llIGdlYmVuICAKKy8vCisvLyAkSWQ6IHNjb3JlbWFzdGVyLmMgOTE3MCAyMDE1LTAzLTA1IDIwOjE4OjU0WiBaZXNzdHJhICQKKyNwcmFnbWEgc3RyaWN0X3R5cGVzCisjcHJhZ21hIG5vX2Nsb25lCisjcHJhZ21hIG5vX3NoYWRvdworI3ByYWdtYSBub19pbmhlcml0CisjcHJhZ21hIHZlcmJvc2VfZXJyb3JzCisjcHJhZ21hIGNvbWJpbmVfc3RyaW5ncworI3ByYWdtYSBwZWRhbnRpYworLy8jcHJhZ21hIHJhbmdlX2NoZWNrCisjcHJhZ21hIHdhcm5fZGVwcmVjYXRlZAorCisjaW5jbHVkZSAiL3NlY3VyZS9zY29yZW1hc3Rlci5oIgorI2luY2x1ZGUgIi9zZWN1cmUvd2l6bGV2ZWxzLmgiCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGZpbGVzLmg+CisKKyNkZWZpbmUgWkRFQlVHKHgpIGlmIChmaW5kX3BsYXllcigiemVzc3RyYSIpKSBcCisgIHRlbGxfb2JqZWN0KGZpbmRfcGxheWVyKCJ6ZXNzdHJhIiksc3ByaW50ZigiU0NNOiAlc1xuIix4KSkKKworLy8gaG9lY2hzdGUgdmVyZ2ViZW5lIE5yLgorcHJpdmF0ZSBpbnQgbGFzdE51bTsKKworLy8gTGlzdGUgYWxsZSBFS3M6IChbb2JuYW1lOiBudW07IHNjb3JlOyBraWxsY291bnRdKQorcHJpdmF0ZSBtYXBwaW5nIG5wY3MgPSBtX2FsbG9jYXRlKDAsMyk7CisKKy8vIExpc3RlIHZvbiBTcGllbGVybmFtZW4tV2VydC1QYWFyZW4sIGRpZSBpbSBSZXNldCBhYmdlYXJiZWl0ZXQgd2lyZDoKKy8vIChbcGxuYW1lOiAoe3dlcnQxLCB3ZXJ0Miwgd2VydDMsIC4uLn0pIF0pIAorLy8gd2VydCA+IDAgYmVkZXV0ZXQgc2V0emVuIGRlcyBlbnRzcHJlY2hlbmRlbiBFS3MsIDwgMCBiZWRldXRldCBsb2VzY2hlbi4KK3ByaXZhdGUgbWFwcGluZyB0b19jaGFuZ2UgPSAoW10pOworCisvLyBMaXN0ZSBkZXIgRUstVGlwczogKFtvYm5hbWU6IFNwcnVjaF0pCitwcml2YXRlIG1hcHBpbmcgdGlwTGlzdCA9IChbXSk7CisKKy8vIEJpdC1Oci4sIGRpZSAod2llZGVyKSB2ZXJnZWJlbiB3ZXJkZW4gZHVlcmZlbi4KK3ByaXZhdGUgaW50ICpmcmVlX251bSA9ICh7fSk7CisKKy8vIHp1IGVudGZlcm5lbmRlIEVLcywgTGlzdGUgQml0bnVtbWVybiwgYWxzbyBpbnRzCitwcml2YXRlIGludCAqdG9fYmVfcmVtb3ZlZCA9ICh7fSk7CisKKy8vIExpc3RlIHZvbiB0ZW1wb3JhZXJlbiBFS3MsIGRpZSBub2NoIG5pY2h0IGJlc3RhZXRpZ3Qgd3VyZGVuOgorLy8gKFtvYm5hbWU6ICh7cGxuYW1lMSwgcGxuYW1lMn0pIF0pCitwcml2YXRlIG1hcHBpbmcgdW5jb25maXJtZWRfc2NvcmVzID0gKFtdKTsKKworLy8gYWxsZSBTcGllbGVyIGtyaWVnZW4gZGllc2VuIAorLy8gTmFjaCBOci4gc29ydGllcnRlIE5QQy1MaXN0ZTogKFtudW06IGtleTsgc2NvcmVdKQorcHJpdmF0ZSBub3NhdmUgbWFwcGluZyBieV9udW0gPSBtX2FsbG9jYXRlKDAsMik7CisKKy8vIENhY2hlIGZ1ZXIgRUtzIHZvbiBTcGllbGVybjogKFtwbG5hbWU6IHNjb3Jlc3VtbWVdKQorcHJpdmF0ZSBub3NhdmUgbWFwcGluZyB1c2Vyc19layA9IChbXSk7CisKKy8vIGJpdHN0cmluZywgZGVyIGFsbGUgYWt0aXZlbiBFS3MgYWxzIGdlc2V0enRlcyBCaXQgZW50aGFlbHQuCitwcml2YXRlIG5vc2F2ZSBzdHJpbmcgYWN0aXZlX2Vrcz0iIjsKKworLy8gUHJvdG90eXBlbgorcHVibGljIG1hcHBpbmcgZ2V0RnJlZUVLc0ZvclBsYXllcihvYmplY3QgcGxheWVyKTsKK3B1YmxpYyBpbnQgYWRkVGlwKG1peGVkIGtleSxzdHJpbmcgdGlwKTsKK3B1YmxpYyBpbnQgY2hhbmdlVGlwKG1peGVkIGtleSxzdHJpbmcgdGlwKTsKK3B1YmxpYyBpbnQgcmVtb3ZlVGlwKG1peGVkIGtleSk7Citwcml2YXRlIHN0cmluZyBnZXRUaXBGcm9tTGlzdChtaXhlZCBrZXkpOworcHVibGljIHN0cmluZyBnZXRUaXAobWl4ZWQga2V5KTsKKworcHVibGljIHZvaWQgQ2hlY2tOUENzKGludCBudW0pOworcHVibGljIHZvaWQgY2hlY2tfYWxsX3BsYXllcihtYXBwaW5nIGFsbHBsYXllcik7CitwdWJsaWMgdmFyYXJncyBpbnQgRHVtcE5QQ3MoaW50IHNvcnRrZXkpOworCitwcml2YXRlIHZvaWQgbWFrZV9udW0oc3RyaW5nIGtleSwgaW50IG51bSwgaW50IHNjb3JlKSB7CisgIGJ5X251bSArPSAoWyBudW0gOiBrZXk7IHNjb3JlIF0pOworICAvLyBmdWVyIGFrdGl2ZSBFS3MsIGRpZSBhbHNvIGVpbmVuIFNjb3Jld2VydCA+IDAgaGFiZW4sIHdpcmQgZGFzIGpld2VpbGlnZQorICAvLyBCaXQgZ2VzZXR6dC4gV2lyZCBzcGFldGVyIHp1bSBBdXNmaWx0ZXJuIGluYWt0aXZlciBFS3MgYXVzIGRlbiBCaXRzdHJpbmdzCisgIC8vIGluIGRlbiBTcGllbGVyIGdlYnJhdWNodC4KKyAgaWYgKHNjb3JlPjAgJiYgIW1lbWJlcih1bmNvbmZpcm1lZF9zY29yZXMsbnVtKSkKKyAgICBhY3RpdmVfZWtzID0gc2V0X2JpdChhY3RpdmVfZWtzLCBudW0pOworfQorCitwcml2YXRlIGludCBhbGxvd2VkKCkKK3sKKyAgaWYgKHByZXZpb3VzX29iamVjdCgpICYmIGdldGV1aWQocHJldmlvdXNfb2JqZWN0KCkpPT1ST09USUQpCisgICAgcmV0dXJuIDE7CisgIGlmICghcHJvY2Vzc19jYWxsKCkgJiYgcHJldmlvdXNfb2JqZWN0KCkgJiYgdGhpc19pbnRlcmFjdGl2ZSgpICYmIEFSQ0hfU0VDVVJJVFkpCisgICAgcmV0dXJuIDE7CisgIHJldHVybiAwOworfQorCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKQoreworICBzZXRldWlkKGdldHVpZCgpKTsKKyAgaWYgKCFyZXN0b3JlX29iamVjdChTQ09SRVNBVkVGSUxFKSkKKyAgeworICAgIGxhc3ROdW09MDsKKyAgICBucGNzPW1fYWxsb2NhdGUoMCwzKTsKKyAgICB0b19jaGFuZ2U9bV9hbGxvY2F0ZSgwLDEpOworICAgIHRpcExpc3Q9KFtdKTsKKyAgfQorICBucGNzLT0oWzBdKTsKKyAgd2Fsa19tYXBwaW5nKG5wY3MsICMnbWFrZV9udW0pOworfQorCitwdWJsaWMgaW50IENsZWFyVXNlcnNFS0NhY2hlKCkKK3sKKyAgaWYgKCFhbGxvd2VkKCkpCisgICAgcmV0dXJuIFNDT1JFX05PX1BFUk1JU1NJT047CisgIHVzZXJzX2VrID0gKFtdKTsKKyAgcmV0dXJuIDE7Cit9CisKK3B1YmxpYyBtaXhlZCBRdWVyeVVzZXJzRUtDYWNoZSgpCit7CisgIGlmICghYWxsb3dlZCgpKQorICAgIHJldHVybiBTQ09SRV9OT19QRVJNSVNTSU9OOworICByZXR1cm4gdXNlcnNfZWs7Cit9CisKK3B1YmxpYyBtaXhlZCBRdWVyeV9mcmVlX251bSgpCit7CisgIGlmICghYWxsb3dlZCgpKQorICAgIHJldHVybiBTQ09SRV9OT19QRVJNSVNTSU9OOworICByZXR1cm4gZnJlZV9udW07Cit9CisKK3B1YmxpYyBtaXhlZCBBZGRfZnJlZV9udW0oaW50IHdoYXQpCit7CisgIGlmICghYWxsb3dlZCgpKQorICAgIHJldHVybiBTQ09SRV9OT19QRVJNSVNTSU9OOworICBpZiAoIXdoYXQgfHwgIWludHAod2hhdCkgfHwgYnlfbnVtW3doYXRdKQorICAgIHJldHVybiBTQ09SRV9JTlZBTElEX0FSRzsKKyAgaWYgKG1lbWJlcihmcmVlX251bSx3aGF0KT09LTEpCisgICAgZnJlZV9udW0rPSh7d2hhdH0pOworICBzYXZlX29iamVjdChTQ09SRVNBVkVGSUxFKTsKKyAgd3JpdGVfZmlsZShTQ09SRUxPR0ZJTEUsc3ByaW50ZigiQURERlJFRU5VTTogJXMgJTVkICglcywgJU8pXG4iLCAgICAgCisgIHN0cmZ0aW1lKCIlZCVtJVktJVQiLHRpbWUoKSksd2hhdCwKKyAgZ2V0ZXVpZChwcmV2aW91c19vYmplY3QoKSksIHRoaXNfaW50ZXJhY3RpdmUoKSkpOworCisgIHJldHVybiBmcmVlX251bTsKK30KKworcHVibGljIG1peGVkIFJlbW92ZV9mcmVlX251bShpbnQgd2hhdCkKK3sKKyAgaWYgKCFhbGxvd2VkKCkpCisgICAgcmV0dXJuIFNDT1JFX05PX1BFUk1JU1NJT047CisgIGlmICghd2hhdCB8fCAhaW50cCh3aGF0KSkKKyAgICByZXR1cm4gU0NPUkVfSU5WQUxJRF9BUkc7CisgIGZyZWVfbnVtLT0oe3doYXR9KTsKKyAgc2F2ZV9vYmplY3QoU0NPUkVTQVZFRklMRSk7CisgIHdyaXRlX2ZpbGUoU0NPUkVMT0dGSUxFLHNwcmludGYoIlJFTU9WRUZSRUVOVU06ICVzICU1ZCAoJXMsICVPKVxuIiwgICAgIAorICBzdHJmdGltZSgiJWQlbSVZLSVUIix0aW1lKCkpLHdoYXQsCisgIGdldGV1aWQocHJldmlvdXNfb2JqZWN0KCkpLHRoaXNfaW50ZXJhY3RpdmUoKSkpOworICByZXR1cm4gZnJlZV9udW07Cit9CisKK3B1YmxpYyBtaXhlZCBRdWVyeV90b19jaGFuZ2Uoc3RyaW5nIHdobykKK3sKKyAgaWYgKCFhbGxvd2VkKCkpCisgICAgcmV0dXJuIFNDT1JFX05PX1BFUk1JU1NJT047CisgIGlmICghd2hvKQorICAgIHJldHVybiB0b19jaGFuZ2U7CisgIGlmICh3aG89PSIiKQorICAgIHJldHVybiBtX2luZGljZXModG9fY2hhbmdlKTsKKyAgcmV0dXJuIHRvX2NoYW5nZVt3aG9dOworfQorCitwdWJsaWMgbWl4ZWQgQWRkX3RvX2NoYW5nZShzdHJpbmcgd2hvLCBpbnQgd2hhdCkKK3sKKyAgaWYgKCFhbGxvd2VkKCkpCisgICAgcmV0dXJuIFNDT1JFX05PX1BFUk1JU1NJT047CisgIGlmICghd2hvIHx8ICFzdHJpbmdwKHdobykgfHwgIXdoYXQgfHwgIWludHAod2hhdCkpCisgICAgcmV0dXJuIFNDT1JFX0lOVkFMSURfQVJHOworICBpZiAobWVtYmVyKHRvX2NoYW5nZSx3aG8pKQorICB7CisgICAgdG9fY2hhbmdlW3dob10tPSh7LXdoYXR9KTsKKyAgICBpZiAobWVtYmVyKHRvX2NoYW5nZVt3aG9dLHdoYXQpPT0tMSkKKyAgICAgIHRvX2NoYW5nZVt3aG9dKz0oe3doYXR9KTsKKyAgfQorICBlbHNlCisgICAgIHRvX2NoYW5nZVt3aG9dPSh7d2hhdH0pOworICBzYXZlX29iamVjdChTQ09SRVNBVkVGSUxFKTsKKyAgd3JpdGVfZmlsZShTQ09SRUxPR0ZJTEUsc3ByaW50ZigiQUREVE9DSEFOR0U6ICVzICVzICU1ZCAoJXMsICVPKVxuIiwKKyAgICAgICAgIHN0cmZ0aW1lKCIlZCVtJVktJVQiLHRpbWUoKSksd2hvLHdoYXQsCisgICAgICAgICBnZXRldWlkKHByZXZpb3VzX29iamVjdCgpKSwgdGhpc19pbnRlcmFjdGl2ZSgpKSk7CisgIHJldHVybiB0b19jaGFuZ2Vbd2hvXTsKK30KKworcHVibGljIG1peGVkIFJlbW92ZV90b19jaGFuZ2Uoc3RyaW5nIHdobywgaW50IHdoYXQpCit7CisgIGlmICghYWxsb3dlZCgpKQorICAgIHJldHVybiBTQ09SRV9OT19QRVJNSVNTSU9OOworICBpZiAoIXdobyB8fCAhc3RyaW5ncCh3aG8pIHx8ICF3aGF0IHx8ICFpbnRwKHdoYXQpKQorICAgIHJldHVybiBTQ09SRV9JTlZBTElEX0FSRzsKKyAgaWYgKG1lbWJlcih0b19jaGFuZ2Usd2hvKSkKKyAgeworICAgICB0b19jaGFuZ2Vbd2hvXS09KHt3aGF0fSk7CisgICAgIGlmICghc2l6ZW9mKHRvX2NoYW5nZVt3aG9dKSkKKyAgICAgICAgbV9kZWxldGUodG9fY2hhbmdlLHdobyk7CisgIH0KKyAgc2F2ZV9vYmplY3QoU0NPUkVTQVZFRklMRSk7CisgIHdyaXRlX2ZpbGUoU0NPUkVMT0dGSUxFLHNwcmludGYoIlJFTU9WRVRPQ0hBTkdFOiAlcyAlcyAlNWQgKCVzLCAlTylcbiIsCisgICAgICAgICBzdHJmdGltZSgiJWQlbSVZLSVUIix0aW1lKCkpLHdobyx3aGF0LAorICAgICAgICAgZ2V0ZXVpZChwcmV2aW91c19vYmplY3QoKSksIHRoaXNfaW50ZXJhY3RpdmUoKSkpOworICByZXR1cm4gdG9fY2hhbmdlW3dob107Cit9CisKK3ZvaWQgcmVzZXQoKQoreworICBzdHJpbmcgKndob3Asd2hvLGVrOworICBtaXhlZCB3aGF0OworICBpbnQgaSxqLHZhbHVlLGNoYW5nZWQ7CisKKyAgLy8gZmFsbHMgRUtzIGdsb2JhbCBlbnRmZXJudCB3ZXJkZW4gc29sbGVuLCBzY2hvbm1hbCBkZW4gbm9ldGlnZW4gQ2FsbG91dAorICAvLyBzdGFydGVuLgorICBpZiAoc2l6ZW9mKHRvX2JlX3JlbW92ZWQpICYmIGZpbmRfY2FsbF9vdXQoIydjaGVja19hbGxfcGxheWVyKSA9PSAtMSkKKyAgICAgIGNhbGxfb3V0KCMnY2hlY2tfYWxsX3BsYXllciwgMTAsIDApOworICAvLyBFSy1NYWludGVpbmVyIHVlYmVyIHVuYmVzdGFldGlndGUgRUtzIGluZm9ybWllcmVuCisgIGlmIChzaXplb2YodW5jb25maXJtZWRfc2NvcmVzKSkgeworICAgIGZvcmVhY2goc3RyaW5nIG46IFNDT1JFTUFJTlRBSU5FUlMpIHsKKyAgICAgIGlmIChvYmplY3RwKGZpbmRfcGxheWVyKG4pKSkKKyAgICAgICAgICB0ZWxsX29iamVjdChmaW5kX3BsYXllcihuKSxicmVha19zdHJpbmcoCisgICAgICAiRXMgZ2lidCB1bmJlc3RhZXRpZ3RlIEVLcyBpbSBTY29yZW1hc3Rlci4gU2NoYXUgRGlyIGRpZSBkb2NoICIKKyAgICAgICJtYWwgYW4uIDstKSIsNzgsICJEZXIgU2NvcmVtYXN0ZXIgdGVpbHQgRGlyIG1pdDogIikpOworICAgIH0KKyAgfQorCisgIGk9c2l6ZW9mKHdob3A9bV9pbmRpY2VzKHRvX2NoYW5nZSkpLTE7CisgIHdoaWxlIChpPj0wICYmIGdldF9ldmFsX2Nvc3QoKT4xMDAwMDApCisgIHsKKyAgICBlayA9IChzdHJpbmcpKE1BU1RFUi0+cXVlcnlfZWsod2hvPXdob3BbaV0pIHx8ICIiKTsKKyAgICBmb3IgKGo9c2l6ZW9mKHdoYXQ9dG9fY2hhbmdlW3dob10pLTE7aj49MDtqLS0pIHsKKyAgICAgIGlmICgodmFsdWU9d2hhdFtqXSk+MCkgeworICAgIC8vIFZlcmdhYmVzdGF0aXN0aWsgaG9jaHphZWhsZW4uCisgICAgbnBjc1tieV9udW1bdmFsdWUsQllOVU1fS0VZXSxOUENfQ09VTlRdKys7CisgICAgZWs9c2V0X2JpdChlayx2YWx1ZSk7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAvLyBWZXJnYWJlc3RhdGlzdGlrIGhvY2h6YWVobGVuLgorICAgIG5wY3NbYnlfbnVtWy12YWx1ZSxCWU5VTV9LRVldLE5QQ19DT1VOVF0rKzsKKyAgICBlaz1jbGVhcl9iaXQoZWssLXZhbHVlKTsKKyAgICAgIH0KKyAgICAgIC8vIGlmIChmaW5kX3BsYXllcigicmlrdXMiKSkgCisgICAgICAvL3RlbGxfb2JqZWN0KGZpbmRfcGxheWVyKCJyaWt1cyIpLCJTQ09SRU1BU1RFUiAiK3dobysiICIrZXJnKyJcbiIpOworCisgICAgICB3cml0ZV9maWxlKFNDT1JFQVVUT0xPRywKKyAgc3ByaW50ZigiU0VUX0NMRUFSX0JJVCAocmVzZXQpOiAlcyAlNGQgJXNcbiIsCisgICAgd2hvLCBqLCBzdHJmdGltZSgiJWQlbSVZLSVUIix0aW1lKCkpICkpOworICAgIH0KKyAgICBNQVNURVItPnVwZGF0ZV9layh3aG8sIGVrKTsKKworICAgIGlmIChtZW1iZXIodXNlcnNfZWssIHdobykpCisgICAgICBtX2RlbGV0ZSh1c2Vyc19laywgd2hvKTsKKyAgICAKKyAgICBtX2RlbGV0ZSh0b19jaGFuZ2Usd2hvKTsKKyAgICBjaGFuZ2VkPTE7CisgICAgaS0tOworICB9CisgIGlmIChjaGFuZ2VkKSBzYXZlX29iamVjdChTQ09SRVNBVkVGSUxFKTsKK30KKworcHVibGljIHZhcmFyZ3MgbWl4ZWQgUXVlcnlOUEMoaW50IHNjb3JlKQoreworICBzdHJpbmcga2V5OworICBpbnQgdmFsOworCisgIGlmICghcHJldmlvdXNfb2JqZWN0KCkpCisgICAgcmV0dXJuIFNDT1JFX0lOVkFMSURfQVJHOworICAKKyAga2V5ID0gbG9hZF9uYW1lKHByZXZpb3VzX29iamVjdCgpKTsKKworICAvLyBzY2hvbiBiZWthbm50ZXIgRUs/CisgIGlmIChtZW1iZXIobnBjcyxrZXkpKQorICAgIHJldHVybiAoe25wY3Nba2V5LE5QQ19OVU1CRVJdLG5wY3Nba2V5LE5QQ19TQ09SRV19KTsKKworICBpZiAoc2NvcmU8PTAgfHwgCisgICAgICBtZW1iZXIoaW5oZXJpdF9saXN0KHByZXZpb3VzX29iamVjdCgpKSwiL3N0ZC9saXZpbmcvbGlmZS5jIikgPCAwKQorICAgIHJldHVybiBTQ09SRV9JTlZBTElEX0FSRzsKKworICBpZiAoa2V5WzAuLjhdPT0iL3BsYXllcnMvIikgcmV0dXJuIFNDT1JFX0lOVkFMSURfQVJHOworCisgIGlmIChzY29yZT4yKSBzY29yZT0yOworCisgIGlmIChzaXplb2YoZnJlZV9udW0pKSB7CisgICAgICB2YWwgPSBmcmVlX251bVswXTsKKyAgICAgIGZyZWVfbnVtIC09ICh7dmFsfSk7CisgIH0KKyAgZWxzZSB2YWw9KytsYXN0TnVtOworCisgIG5wY3Nba2V5LE5QQ19TQ09SRV0gPSBzY29yZTsKKyAgbnBjc1trZXksTlBDX05VTUJFUl0gPSB2YWw7CisgIG5wY3Nba2V5LE5QQ19DT1VOVF0gPSAwOworICBieV9udW0gKz0gKFt2YWw6IGtleTsgc2NvcmVdKTsKKyAgLy8gd2VyZGVuIG5vY2ggbmljaHQgYWxzIGFrdGl2ZSBFS3MgZ2V3ZXJ0ZXQsIGRhbWl0IHNpZSBuaWNodCBhbHMgRWstVGlwcworICAvLyB2ZXJnYmVuIHdlcmRlbi4KKyAgLy9hY3RpdmVfZWtzID0gc2V0X2JpdChhY3RpdmVfZWtzLCB2YWwpOworCisgIHVuY29uZmlybWVkX3Njb3JlcyArPSAoWyB2YWw6ICh7fSkgXSk7CisKKyAgQ2xlYXJVc2Vyc0VLQ2FjaGUoKTsKKyAgc2F2ZV9vYmplY3QoU0NPUkVTQVZFRklMRSk7CisgIHdyaXRlX2ZpbGUoU0NPUkVBVVRPTE9HLHNwcmludGYoCisgICJBREROUEM6ICVzICU1ZCAlNGQgJXMgKFVJRDogJXMsIFRJOiAlTywgVFA6ICVPKVxuIiwKKyAgc3RyZnRpbWUoIiVkJW0lWS0lVCIsdGltZSgpKSx2YWwsc2NvcmUsa2V5LAorICBnZXR1aWQocHJldmlvdXNfb2JqZWN0KCkpLCB0aGlzX2ludGVyYWN0aXZlKCksIHRoaXNfcGxheWVyKCkpKTsKKworICB3aGlsZShyZW1vdmVfY2FsbF9vdXQoIkR1bXBOUENzIikgIT0gLTEpIDsKKyAgY2FsbF9vdXQoIkR1bXBOUENzIiw2MCk7CisgIHJldHVybiAoe3ZhbCxzY29yZX0pOworfQorCitwdWJsaWMgdmFyYXJncyBtaXhlZCBOZXdOUEMoc3RyaW5nIGtleSxpbnQgc2NvcmUpCit7CisgIGludCB2YWw7CisKKyAgaWYgKCFhbGxvd2VkKCkpCisgICAgcmV0dXJuIFNDT1JFX05PX1BFUk1JU1NJT047CisgIGlmICgha2V5IHx8ICFzdHJpbmdwKGtleSkpCisgICAgcmV0dXJuIFNDT1JFX0lOVkFMSURfQVJHOworICAKKyAga2V5ID0gbG9hZF9uYW1lKGtleSk7CisgIGlmICh2YWw9bnBjc1trZXksTlBDX05VTUJFUl0pCisgICAgcmV0dXJuICh7dmFsLG5wY3Nba2V5LE5QQ19TQ09SRV19KTsKKyAgaWYgKHNjb3JlPD0wKQorICAgIHJldHVybiBTQ09SRV9JTlZBTElEX0FSRzsKKworICBpZiAoc2l6ZW9mKGZyZWVfbnVtKSkgeworICAgICAgdmFsPWZyZWVfbnVtWzBdOworICAgICAgZnJlZV9udW09ZnJlZV9udW1bMS4uXTsKKyAgfQorICBlbHNlIHZhbD0rK2xhc3ROdW07CisKKyAgbnBjc1trZXksTlBDX1NDT1JFXSA9IHNjb3JlOworICBucGNzW2tleSxOUENfTlVNQkVSXSA9IHZhbDsKKyAgbnBjc1trZXksTlBDX0NPVU5UXSA9IDA7CisgIGJ5X251bSArPSAoW3ZhbDoga2V5OyBzY29yZV0pOworICBhY3RpdmVfZWtzID0gc2V0X2JpdChhY3RpdmVfZWtzLCB2YWwpOworCisgIENsZWFyVXNlcnNFS0NhY2hlKCk7CisgIHNhdmVfb2JqZWN0KFNDT1JFU0FWRUZJTEUpOworICB3cml0ZV9maWxlKFNDT1JFTE9HRklMRSxzcHJpbnRmKCJORVdOUEM6ICVzICU1ZCAlNGQgJXMgKCVzLCAlTylcbiIsCisgICAgICAgICBzdHJmdGltZSgiJWQlbSVZLSVUIix0aW1lKCkpLHZhbCxzY29yZSxrZXksCisgICAgICAgICBnZXRldWlkKHByZXZpb3VzX29iamVjdCgpKSwgdGhpc19pbnRlcmFjdGl2ZSgpKSk7Cisgd2hpbGUocmVtb3ZlX2NhbGxfb3V0KCJEdW1wTlBDcyIpICE9IC0xKSA7IAorICBjYWxsX291dCgiRHVtcE5QQ3MiLDYwKTsKKyAgcmV0dXJuICh7dmFsLHNjb3JlfSk7Cit9CisKK3B1YmxpYyB2YXJhcmdzIG1peGVkIEFkZE5QQyhzdHJpbmcga2V5LGludCBzY29yZSkgeyByZXR1cm4gTmV3TlBDKGtleSxzY29yZSk7IH0KKworLy8gcmVzdGF1cmllcnQgZGllIERhdGVuIGVpbmVzIGZydWVoZXIgZ2Vsb2VzY2h0ZW4sIGluIGRlbiBTcGllbGVybiBub2NoCisvLyBlbnRoYWx0ZW5lbiBFS3MuIE1vZWdsaWNoLCB3ZW5uIG1hbiBQZmFkLCBOci4gdW5kIFB1bmt0ZSBub2NoIGtlbm50LgorcHVibGljIGludCBSZXN0b3JlRUsoc3RyaW5nIGtleSwgaW50IGJpdCwgaW50IHNjb3JlKSB7CisgIGlmICghYWxsb3dlZCgpKQorICAgIHJldHVybiBTQ09SRV9OT19QRVJNSVNTSU9OOworICBpZiAoIXN0cmluZ3Aoa2V5KSB8fCAhc2l6ZW9mKGtleSkgCisgICAgICB8fCAhaW50cChiaXQpIHx8IGJpdCA8IDAKKyAgICAgIHx8ICFpbnRwKHNjb3JlKSB8fCBzY29yZSA8IDApCisgICAgICByZXR1cm4gU0NPUkVfSU5WQUxJRF9BUkc7CisKKyAgaWYgKG1lbWJlcihucGNzLGtleSkgfHwgbWVtYmVyKGJ5X251bSxiaXQpKQorICAgICAgcmV0dXJuIFNDT1JFX0lOVkFMSURfQVJHOworCisgIG5wY3MgKz0gKFtrZXk6IGJpdDtzY29yZTswIF0pOworICBieV9udW0gKz0gKFtiaXQ6IGtleTtzY29yZSBdKTsKKworICBDbGVhclVzZXJzRUtDYWNoZSgpOworICBzYXZlX29iamVjdChTQ09SRVNBVkVGSUxFKTsKKyAgd3JpdGVfZmlsZShTQ09SRUxPR0ZJTEUsc3ByaW50ZigiUkVTVE9SRUVLOiAlcyAlNWQgJTRkICVzICglcywgJU8pXG4iLAorICAgICAgICAgc3RyZnRpbWUoIiVkJW0lWS0lVCIsdGltZSgpKSwgYml0LCBzY29yZSwga2V5LAorICAgICAgICAgZ2V0ZXVpZChwcmV2aW91c19vYmplY3QoKSksIHRoaXNfaW50ZXJhY3RpdmUoKSkpOworICB3aGlsZShyZW1vdmVfY2FsbF9vdXQoIkR1bXBOUENzIikgIT0gLTEpIDsKKyAgY2FsbF9vdXQoIkR1bXBOUENzIiw2MCk7CisgIHJldHVybiAxOworCit9CisKK3B1YmxpYyBpbnQgQ29uZmlybVNjb3JlKG1peGVkIGtleSkgeworICAvLyBCaXRzIGluIGRlbiBTcGllbGVybiBpbiB1bmNvbmZpcm1lZF9zY29yZXMgc2V0emVuIHVuZCBTdGF0aXN0aWsKKyAgLy8gaG9jaHphZWhsZW4KKyAgLy8gQml0IGluIGFjdGl2ZV9la3Mgc2V0emVuCisgIC8vIEVpbnRyYWcgYXVzIHVuY29uZmlybWVkX3Njb3JlcyBsb2VzY2hlbgorICBpbnQgYml0OworCisgIGlmICghYWxsb3dlZCgpKSByZXR1cm4gU0NPUkVfTk9fUEVSTUlTU0lPTjsKKyAgaWYgKHN0cmluZ3Aoa2V5KSAmJiBtZW1iZXIobnBjcyxrZXkpKSB7CisgICAgICBiaXQgPSBucGNzW2tleSwgTlBDX05VTUJFUl07CisgIH0KKyAgZWxzZSBpZiAoaW50cChrZXkpICYmIG1lbWJlcihieV9udW0sa2V5KSkgeworICAgICAgYml0ID0ga2V5OworICB9CisgIGVsc2UKKyAgICAgIHJldHVybiBTQ09SRV9JTlZBTElEX0FSRzsKKworICBpZiAoIW1lbWJlcih1bmNvbmZpcm1lZF9zY29yZXMsIGJpdCkpIAorICAgICAgcmV0dXJuIFNDT1JFX0lOVkFMSURfQVJHOworCisgIHN0cmluZyBvYm5hbWUgPSBieV9udW1bYml0LCBCWU5VTV9LRVldOworICBpbnQgc2NvcmUgPSBieV9udW1bYml0LEJZTlVNX1NDT1JFXTsKKyAgCisgIGZvcmVhY2goc3RyaW5nIHBsOiB1bmNvbmZpcm1lZF9zY29yZXNbYml0XSkgeworICAgICAgc3RyaW5nIGVrcyA9IChzdHJpbmcpbWFzdGVyKCktPnF1ZXJ5X2VrKHBsKTsKKyAgICAgIGVrcyA9IHNldF9iaXQoZWtzLCBiaXQpOworICAgICAgbWFzdGVyKCktPnVwZGF0ZV9layhwbCwgZWtzKTsKKyAgICAgIHdyaXRlX2ZpbGUoU0NPUkVBVVRPTE9HLCBzcHJpbnRmKAorICAgICJTRVRCSVQ6ICVzICU1ZCAlc1xuIiwKKyAgICBzdHJmdGltZSgiJWQlbSVZLSVUIix0aW1lKCkpLCBiaXQsIHBsKSk7CisgIH0KKyAgLy9WZXJnYWJlc3RhdGlzdGlrIGhvY2h6YWVobGVuLi4uCisgIG5wY3Nbb2JuYW1lLE5QQ19DT1VOVF0rPXNpemVvZih1bmNvbmZpcm1lZF9zY29yZXNbYml0XSk7CisKKyAgbV9kZWxldGUodW5jb25maXJtZWRfc2NvcmVzLCBiaXQpOworICBhY3RpdmVfZWtzID0gc2V0X2JpdChhY3RpdmVfZWtzLCBiaXQpOworICBzYXZlX29iamVjdChTQ09SRVNBVkVGSUxFKTsKKworICB3cml0ZV9maWxlKFNDT1JFTE9HRklMRSxzcHJpbnRmKAorICAgICAgIkNPTkZJUk1OUEM6ICVzICU1ZCBTY29yZSAlM2QgJXMgWyVzLCAlT11cbiIsCisgICAgICAgc3RyZnRpbWUoIiVkJW0lWS0lVCIsdGltZSgpKSwgYml0LCBzY29yZSwgb2JuYW1lLAorICAgICAgIGdldHVpZChwcmV2aW91c19vYmplY3QoKSksdGhpc19pbnRlcmFjdGl2ZSgpKSk7CisKKyAgcmV0dXJuIDE7Cit9CisKK3B1YmxpYyBpbnQgUmVqZWN0U2NvcmUobWl4ZWQga2V5KSB7CisgIC8vIEVpbnRyYWcgYXVzIHVuY29uZmlybWVkX3Njb3JlcywgbnBjcywgYnlfbnVtIGxvZXNjaGVuCisgIC8vIEJpdC1Oci4gaW4gZnJlZV9udW0gZWludHJhZ2VuCisgIC8vIGV2dGwuIEVLLVNwcnVjaCBlbnRmZXJuZW4/CisgIGludCBiaXQ7CisKKyAgaWYgKCFhbGxvd2VkKCkpIHJldHVybiBTQ09SRV9OT19QRVJNSVNTSU9OOworICBpZiAoc3RyaW5ncChrZXkpICYmIG1lbWJlcihucGNzLGtleSkpIHsKKyAgICAgIGJpdCA9IG5wY3Nba2V5LCBOUENfTlVNQkVSXTsKKyAgfQorICBlbHNlIGlmIChpbnRwKGtleSkgJiYgbWVtYmVyKGJ5X251bSxrZXkpKSB7CisgICAgICBiaXQgPSBrZXk7CisgIH0KKyAgZWxzZQorICAgICAgcmV0dXJuIFNDT1JFX0lOVkFMSURfQVJHOworCisgIGlmICghbWVtYmVyKHVuY29uZmlybWVkX3Njb3JlcywgYml0KSkgCisgICAgICByZXR1cm4gU0NPUkVfSU5WQUxJRF9BUkc7CisKKyAgc3RyaW5nIG9ibmFtZSA9IGJ5X251bVtiaXQsIEJZTlVNX0tFWV07CisgIGludCBzY29yZSA9IGJ5X251bVtiaXQsQllOVU1fU0NPUkVdOworCisgIG1fZGVsZXRlKGJ5X251bSwgYml0KTsKKyAgbV9kZWxldGUobnBjcywgb2JuYW1lKTsKKyAgbV9kZWxldGUodW5jb25maXJtZWRfc2NvcmVzLGJpdCk7CisgIHJlbW92ZVRpcChvYm5hbWUpOworICBmcmVlX251bSArPSAoe2JpdH0pOworCisgIHNhdmVfb2JqZWN0KFNDT1JFU0FWRUZJTEUpOworCisgIHdyaXRlX2ZpbGUoU0NPUkVMT0dGSUxFLHNwcmludGYoCisgICAgICAiUkVKRUNUTlBDOiAlcyAlNWQgU2NvcmUgJTNkICVzIFslcywgJU9dXG4iLAorICAgICAgIHN0cmZ0aW1lKCIlZCVtJVktJVQiLHRpbWUoKSksIGJpdCwgc2NvcmUsIG9ibmFtZSwKKyAgICAgICBnZXR1aWQocHJldmlvdXNfb2JqZWN0KCkpLHRoaXNfaW50ZXJhY3RpdmUoKSkpOworICByZXR1cm4gMTsKK30KKworLy8gdW5iZXN0YWV0aWd0ZSBOUENzIGluIGVpbiBGaWxlIGF1c2dlYmVuCitwdWJsaWMgdm9pZCBEdW1wVW5jb25maXJtZWRTY29yZXMoKSB7CisgIGlmICghb2JqZWN0cCh0aGlzX3BsYXllcigpKSkgcmV0dXJuOworIAorICB3cml0ZShzcHJpbnRmKCIlNXMgICU1cyAgJTRzICAgJXNcbiIsCisgICJOci4iLCAiQ250IiwgIlNjIiwgIk9iamVrdCIpKTsKKyAgZm9yZWFjaChpbnQgYml0LCBzdHJpbmcgKnBsczogdW5jb25maXJtZWRfc2NvcmVzKSB7CisgICAgd3JpdGUoc3ByaW50ZigiJTVkICAlNWQgICU0ZCAgICVzXG4iLAorICBiaXQsIHNpemVvZihwbHMpLCBieV9udW1bYml0LEJZTlVNX1NDT1JFXSwgYnlfbnVtW2JpdCxCWU5VTV9LRVldKSk7CisgIH0KK30KKworcHVibGljIG1hcHBpbmcgX3F1ZXJ5X3VuY29uZmlybWVkKCkgeworICBpZiAoYWxsb3dlZCgpKSByZXR1cm4gdW5jb25maXJtZWRfc2NvcmVzOworICByZXR1cm4gMDsKK30KKworcHVibGljIHZhcmFyZ3MgaW50IFNldFNjb3JlKG1peGVkIGtleSxpbnQgc2NvcmUpCit7CisgIGludCBudW07CisgIHN0cmluZyBvYjsKKyAgaW50IG9sZHNjb3JlOworCisgIGlmICghYWxsb3dlZCgpKQorICAgIHJldHVybiBTQ09SRV9OT19QRVJNSVNTSU9OOworICBpZiAoIWtleSkgcmV0dXJuIFNDT1JFX0lOVkFMSURfQVJHOworCisgIGlmIChzdHJpbmdwKGtleSkgJiYgc2l6ZW9mKGtleSkpIHsKKyAgICBvYiA9IGxvYWRfbmFtZShrZXkpOworICAgIGlmICghbWVtYmVyKG5wY3MsIG9iKSkgcmV0dXJuIFNDT1JFX0lOVkFMSURfQVJHOworICAgIG51bSA9IG5wY3Nbb2IsIE5QQ19OVU1CRVJdOworICAgIGlmIChvYiAhPSBieV9udW1bbnVtLCBCWU5VTV9LRVldKQorICByZXR1cm4gU0NPUkVfSU5WQUxJRF9BUkc7CisgIH0KKyAgZWxzZSBpZiAoaW50cChrZXkpICYmIG1lbWJlcihieV9udW0sa2V5KSApIHsKKyAgICBudW0gPSBrZXk7CisgICAgb2IgPSBieV9udW1bbnVtLCBCWU5VTV9LRVldOworICAgIGlmICghbWVtYmVyKG5wY3MsIG9iKSB8fCAobnBjc1tvYiwgTlBDX05VTUJFUl0gIT0gbnVtKSkKKyAgcmV0dXJuIFNDT1JFX0lOVkFMSURfQVJHOworICB9CisgIGVsc2UKKyAgICByZXR1cm4gU0NPUkVfSU5WQUxJRF9BUkc7CisKKyAgb2xkc2NvcmUgPSBieV9udW1bbnVtLEJZTlVNX1NDT1JFXTsKKyAgYnlfbnVtW251bSxCWU5VTV9TQ09SRV0gPSBzY29yZTsKKyAgbnBjc1tvYiwgTlBDX1NDT1JFXSA9IHNjb3JlOworCisgIGlmIChzY29yZSA+IDApCisgICAgICBhY3RpdmVfZWtzID0gc2V0X2JpdChhY3RpdmVfZWtzLCBudW0pOworICBlbHNlCisgICAgICBhY3RpdmVfZWtzID0gY2xlYXJfYml0KGFjdGl2ZV9la3MsIG51bSk7CisKKyAgQ2xlYXJVc2Vyc0VLQ2FjaGUoKTsKKyAgc2F2ZV9vYmplY3QoU0NPUkVTQVZFRklMRSk7CisgIHdyaXRlX2ZpbGUoU0NPUkVMT0dGSUxFLHNwcmludGYoCisgICJTRVRTQ09SRTogJXMgJTVkICUuM2QgT1NjOiAlLjNkICVzICglcywgJU8pXG4iLAorICAgICAgICAgc3RyZnRpbWUoIiVkJW0lWS0lVCIsdGltZSgpKSxudW0sc2NvcmUsb2xkc2NvcmUsIG9iLAorICAgICAgICAgZ2V0ZXVpZChwcmV2aW91c19vYmplY3QoKSksIHRoaXNfaW50ZXJhY3RpdmUoKSkpOworIHdoaWxlKHJlbW92ZV9jYWxsX291dCgiRHVtcE5QQ3MiKSAhPSAtMSkgOyAKKyAgY2FsbF9vdXQoIkR1bXBOUENzIiw2MCk7CisgIHJldHVybiAxOworfQorCisvLyBlbnRmZXJudCBlaW5lbiBFSyBlbmRndWVsdGlnIHVuZCB1bndpZGVycnVmbGljaCB1bmQgZ2lidCBkaWUgTnIuIHdpZWRlcgorLy8gZnJlaS4KKy8vIFRlY2huaXNjaCB3aXJkIGRlciBFSyBlcnN0bWFsIGluIGVpbmUgTGlzdGUgZWluZ2V0cmFnZW4uIEltIFJlc2V0IGl0ZXJpZXJ0CisvLyBkZXIgTWFzdGVyIHVlYmVyIGFsbGUgU1BpZWxlci1TYXZlZmlsZXMgdW5kIGxvZXNjaHQgZGVuIEVrIGF1cyBhbGxlCisvLyBTcGllbGVybi4gTmFjaCBBYnNjaGx1c3Mgd2lyZCBkZXIgRWludHJhZyBpbiBucGNzIGdlbG9lc2NodCB1bmQgc2VpbmUgTnIuCisvLyBpbiBkaWUgTGlzdGUgZnJlaWVyIE51bW1lcm4gZWluZ2V0cmFnZW4uCitwdWJsaWMgaW50KiBNYXJrRUtGb3JMaXF1aWRhdGlvbihtaXhlZCBrZXkpIHsKKyAgaW50IGJpdDsKKyAgaWYgKCFhbGxvd2VkKCkpCisgICAgICByZXR1cm4gMDsKKyAgLy8gbmljaHQgaW4gdG9fYmVfcmVtb3ZlZCBhZW5kZXJuLCB3ZW5uIGNoZWNrX2FsbF9wbGF5ZXIoKSBsYWV1ZnQuCisgIGlmIChmaW5kX2NhbGxfb3V0KCMnY2hlY2tfYWxsX3BsYXllcikgIT0gLTEpCisgICAgICByZXR1cm4gMDsKKworICBpZiAoc3RyaW5ncChrZXkpICYmIHNpemVvZihrZXkpKSB7CisgICAgaWYgKCFtZW1iZXIobnBjcyxrZXkpKSByZXR1cm4gMDsKKyAgICBiaXQgPSBucGNzW2tleSxOUENfTlVNQkVSXTsKKyAgfQorICBlbHNlIGlmIChpbnRwKGtleSkgJiYga2V5Pj0wKSB7CisgICAgYml0ID0ga2V5OworICB9CisgIGVsc2UKKyAgICByZXR1cm4gMDsKKworICBpZiAobWVtYmVyKHRvX2JlX3JlbW92ZWQsYml0KSA9PSAtMSkKKyAgICB0b19iZV9yZW1vdmVkICs9ICh7Yml0fSk7CisgIHdyaXRlX2ZpbGUoU0NPUkVMT0dGSUxFLHNwcmludGYoIkRFTEVURUZMQUc6ICVzICU1ZCAlcyAoJXMsICVPKVxuIiwKKyAgc3RyZnRpbWUoIiVkJW0lWS0lVCIsdGltZSgpKSwgYml0LCBieV9udW1bYml0LEJZTlVNX0tFWV0gfHwgIk5vTmFtZSIsCisgIGdldGV1aWQocHJldmlvdXNfb2JqZWN0KCkpLCB0aGlzX2ludGVyYWN0aXZlKCkpKTsKKyAgCisgIHNhdmVfb2JqZWN0KFNDT1JFU0FWRUZJTEUpOworICAKKyAgcmV0dXJuIHRvX2JlX3JlbW92ZWQ7Cit9CisKKy8vIGdlaHQgbnVyLCBzb2xhbmdlIG5hY2ggZWluZW0gUmVtb3ZlRUsoKSBub2NoIGtlaW4gcmVzZXQoKSBnZWxhdWZlbiBpc3QhCitwdWJsaWMgaW50KiBVbm1hcmtFS0ZvckxpcXVpZGF0aW9uKG1peGVkIGtleSkgeworICBpbnQgYml0OworICBpZiAoIWFsbG93ZWQoKSkKKyAgICAgIHJldHVybiAwOworICAvLyBuaWNodCBpbiB0b19iZV9yZW1vdmVkIGFlbmRlcm4sIHdlbm4gY2hlY2tfYWxsX3BsYXllcigpIGxhZXVmdC4KKyAgaWYgKGZpbmRfY2FsbF9vdXQoIydjaGVja19hbGxfcGxheWVyKSAhPSAtMSkKKyAgICAgIHJldHVybiAwOworCisgIGlmIChzdHJpbmdwKGtleSkgJiYgc2l6ZW9mKGtleSkpIHsKKyAgICBpZiAoIW1lbWJlcihucGNzLGtleSkpIHJldHVybiAwOworICAgIGJpdCA9IG5wY3Nba2V5LE5QQ19OVU1CRVJdOworICB9CisgIGVsc2UgaWYgKGludHAoa2V5KSAmJiBrZXk+PTApIHsKKyAgICBiaXQgPSBrZXk7CisgIH0KKyAgZWxzZQorICAgIHJldHVybiAwOworIAorICB0b19iZV9yZW1vdmVkIC09ICh7Yml0fSk7CisgIHdyaXRlX2ZpbGUoU0NPUkVMT0dGSUxFLHNwcmludGYoIlVOREVMRVRFRkxBRzogJXMgJTVkICVzICglcywgJU9cbiIsCisgIHN0cmZ0aW1lKCIlZCVtJVktJVQiLHRpbWUoKSksYml0LCBieV9udW1bYml0LCBCWU5VTV9LRVldIHx8ICJOb05hbWUiLAorICBnZXRldWlkKHByZXZpb3VzX29iamVjdCgpKSwgdGhpc19pbnRlcmFjdGl2ZSgpKSk7CisgIAorICBzYXZlX29iamVjdChTQ09SRVNBVkVGSUxFKTsKKworICByZXR1cm4gdG9fYmVfcmVtb3ZlZDsKK30KKworcHVibGljIGludCogUXVlcnlMaXF1aWRhdGlvbk1hcmtzKCkgeworICBpZiAoYWxsb3dlZCgpKQorICAgICAgcmV0dXJuIHRvX2JlX3JlbW92ZWQ7CisgIGVsc2UKKyAgICAgIHJldHVybiAwOzsKK30KKworLy8gc2V0enQgbnVyIGRlbiBTY29yZXdlcnQgYXVmIDAsIHNvbnN0IG5peC4gU29sY2hlIEVLcyBrb2VubmVuIGRhbm4gc3BhZXRlcgorLy8gZHVyY2ggQW5nYWJlIGVpbmVzIG5ldWVzIFNjb3Jld2VydGVzIHJlYWt0aXZpZXJ0IHdlcmRlbi4KK3B1YmxpYyBpbnQgUmVtb3ZlU2NvcmUobWl4ZWQga2V5KSB7CisgIGludCBjaGFuZ2VkOworICBpbnQgb2xkc2NvcmU7CisKKyAgaWYgKCFhbGxvd2VkKCkpCisgICAgcmV0dXJuIFNDT1JFX05PX1BFUk1JU1NJT047CisKKyAgaWYgKHN0cmluZ3Aoa2V5KSAmJiBtZW1iZXIobnBjcyxrZXkpKSB7CisgICAgaW50IG51bSA9IG5wY3Nba2V5LCBOUENfTlVNQkVSXTsKKyAgICBpZiAoIGtleSA9PSBieV9udW1bbnVtLCBCWU5VTV9LRVldKSB7CisgICAgICBvbGRzY29yZSA9IGJ5X251bVtudW0sIEJZTlVNX1NDT1JFXTsKKyAgICAgIG5wY3Nba2V5LCBOUENfU0NPUkVdID0gMDsKKyAgICAgIGJ5X251bVtudW0sIEJZTlVNX1NDT1JFXSA9IDA7CisgICAgICBhY3RpdmVfZWtzID0gY2xlYXJfYml0KGFjdGl2ZV9la3MsbnVtKTsgCisgICAgICB3cml0ZV9maWxlKFNDT1JFTE9HRklMRSxzcHJpbnRmKAorICAgICAgIlJFTU9WRVNDT1JFOiAlcyAlNWQgT1NjOiAlLjNkICVzICglcywgJU8pXG4iLAorICAgICAgICBzdHJmdGltZSgiJWQlbSVZLSVUIix0aW1lKCkpLCBudW0sIG9sZHNjb3JlLCBrZXksIAorICAgICAgICBnZXRldWlkKHByZXZpb3VzX29iamVjdCgpKSwgdGhpc19pbnRlcmFjdGl2ZSgpKSk7CisgICAgICBjaGFuZ2VkID0gMTsKKyAgICB9CisgIH0KKyAgZWxzZSBpZiAoaW50cChrZXkpICYmIG1lbWJlcihieV9udW0sIGtleSkpIHsKKyAgICBzdHJpbmcgb2JuYW1lID0gYnlfbnVtW2tleSwgQllOVU1fS0VZXTsKKyAgICBpZiAoa2V5ID09IG5wY3Nbb2JuYW1lLCBOUENfTlVNQkVSXSkgeworICAgICAgb2xkc2NvcmUgPSBieV9udW1ba2V5LCBCWU5VTV9TQ09SRV07CisgICAgICBucGNzW29ibmFtZSwgTlBDX1NDT1JFXSA9IDA7CisgICAgICBieV9udW1ba2V5LCBCWU5VTV9TQ09SRV0gPSAwOworICAgICAgYWN0aXZlX2VrcyA9IGNsZWFyX2JpdChhY3RpdmVfZWtzLGtleSk7IAorICAgICAgd3JpdGVfZmlsZShTQ09SRUxPR0ZJTEUsc3ByaW50ZigKKyAgICAgICJSRU1PVkVTQ09SRTogJXMgJTVkIE9TYzogJS4zZCAlcyAoJXMsICVPKVxuIiwKKyAgICAgICAgc3RyZnRpbWUoIiVkJW0lWS0lVCIsdGltZSgpKSxrZXksIG9sZHNjb3JlLCBvYm5hbWUsCisgICAgICAgIGdldGV1aWQocHJldmlvdXNfb2JqZWN0KCkpLCB0aGlzX2ludGVyYWN0aXZlKCkpKTsKKyAgICAgIGNoYW5nZWQgPSAxOworICAgIH0KKyAgfQorCisgIGlmIChjaGFuZ2VkKSB7CisgICAgQ2xlYXJVc2Vyc0VLQ2FjaGUoKTsKKyAgICBzYXZlX29iamVjdChTQ09SRVNBVkVGSUxFKTsKKyAgICB3aGlsZShyZW1vdmVfY2FsbF9vdXQoIkR1bXBOUENzIikgIT0gLTEpIDsKKyAgICBjYWxsX291dCgiRHVtcE5QQ3MiLDYwKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICByZXR1cm4gU0NPUkVfSU5WQUxJRF9BUkc7Cit9CisKK3B1YmxpYyB2YXJhcmdzIGludCBNb3ZlU2NvcmUobWl4ZWQgb2xka2V5LCBzdHJpbmcgbmV3cGF0aCkKK3sKKyAgaW50IG51bSxzY29yZTsKKyAgc3RyaW5nIG9sZHBhdGg7CisgIHN0cmluZyB0aXA7CisgIAorICBpZiAoIWFsbG93ZWQoKSkKKyAgICByZXR1cm4gU0NPUkVfTk9fUEVSTUlTU0lPTjsKKyAgaWYgKCFzdHJpbmdwKG5ld3BhdGgpKQorICAgIHJldHVybiBTQ09SRV9JTlZBTElEX0FSRzsKKworICBpZiAoc3RyaW5ncChvbGRrZXkpKSB7CisgICAgb2xka2V5ID0gbG9hZF9uYW1lKG9sZGtleSk7IAorICAgIG51bT1ucGNzW29sZGtleSxOUENfTlVNQkVSXTsKKyAgfQorICBlbHNlIGlmIChpbnRwKG9sZGtleSkpIG51bT1vbGRrZXk7CisgIGVsc2UgcmV0dXJuIFNDT1JFX0lOVkFMSURfQVJHOworCisgIGlmICghbWVtYmVyKGJ5X251bSxudW0pKSByZXR1cm4gU0NPUkVfSU5WQUxJRF9BUkc7CisgIAorICB0aXA9Z2V0VGlwRnJvbUxpc3Qob2xka2V5KTsKKyAgb2xkcGF0aCA9IGJ5X251bVtudW0sIEJZTlVNX0tFWV07CisgIHNjb3JlID0gYnlfbnVtW251bSwgQllOVU1fU0NPUkVdOworCisgIGlmIChtZW1iZXIobnBjcywgb2xkcGF0aCkpIHsKKyAgICBtX2RlbGV0ZShucGNzLCBvbGRwYXRoKTsKKyAgICByZW1vdmVUaXAob2xka2V5KTsKKyAgICBpZih0aXAhPSIiKSBhZGRUaXAobmV3cGF0aCx0aXApOworICAgIG5wY3NbbmV3cGF0aCwgTlBDX1NDT1JFXSA9IHNjb3JlOworICAgIG5wY3NbbmV3cGF0aCwgTlBDX05VTUJFUl0gPSBudW07CisgIH0KKyAgZWxzZSByZXR1cm4gU0NPUkVfSU5WQUxJRF9BUkc7CisKKyAgYnlfbnVtICs9IChbbnVtOiBuZXdwYXRoOyBzY29yZV0pOworCisgIENsZWFyVXNlcnNFS0NhY2hlKCk7CisgIHNhdmVfb2JqZWN0KFNDT1JFU0FWRUZJTEUpOworICB3cml0ZV9maWxlKFNDT1JFTE9HRklMRSxzcHJpbnRmKCJNT1ZFU0NPUkU6ICVzICVzICVzICglcywgJU8pXG4iLAorICBzdHJmdGltZSgiJWQlbSVZLSVUIix0aW1lKCkpLG9sZHBhdGgsbmV3cGF0aCwKKyAgZ2V0ZXVpZChwcmV2aW91c19vYmplY3QoKSksdGhpc19pbnRlcmFjdGl2ZSgpKSk7CisKKyAgd2hpbGUocmVtb3ZlX2NhbGxfb3V0KCJEdW1wTlBDcyIpICE9IC0xKSA7CisgIGNhbGxfb3V0KCJEdW1wTlBDcyIsNjApOworICByZXR1cm4gMTsKK30KKworLy8gbGllZmVydCBhbGxlIEtpbGxzIGRlcyBTcGllbGVycyB6dXJ1ZWNrLCBhdWNoIHNvbGNoZSwgZGllIG1vbWVudGFuCisvLyBhdXNnZXRyYWdlbi9kZWFrdGl2aWV0IHNpbmQuCitwdWJsaWMgc3RyaW5nIFF1ZXJ5QWxsS2lsbHMoc3RyaW5nIHBsKQoreworICByZXR1cm4gKE1BU1RFUi0+cXVlcnlfZWsocGwpIHx8ICIiKTsKK30KKworLy8gZmlsdGVydCBhbGxlIEVpbnRyYWVnZSBhdXMgZGVtIEJpdHN0cmluZyBoZXJhdXMsIGRpZSBmdWVyCisvLyBhdXNnZXRyYWdlbmUvaW5ha3RpdmUgRUtzIHN0ZWhlbi4KK3B1YmxpYyBzdHJpbmcgUXVlcnlLaWxscyhzdHJpbmcgcGwpIHsKKyAgc3RyaW5nIHJlcyA9IChzdHJpbmcpTUFTVEVSLT5xdWVyeV9layhwbCkgfHwgIiI7CisgIC8vIHZlcmdsZWljaGVuIG1pdCBkZW4gYWt0aXZlbiBFS3MgYXVzIGFjdGl2ZV9la3MgdW5kIG51ciBqZW5lIEJpdHMKKyAgLy8genVydWVja2xpZWZlcm4sIGRpZSBpbiBiZWlkZW4gU3RyaW5ncyBnZXNldHp0IHNpbmQuCisgIHJldHVybiBhbmRfYml0cyhyZXMsYWN0aXZlX2Vrcyk7Cit9CisKK3B1YmxpYyBpbnQgUXVlcnlLaWxsUG9pbnRzKG1peGVkIHBsKSB7CisgIAorICBpZiAoIWFsbG93ZWQoKSAmJgorICAgICAgKCFwcmV2aW91c19vYmplY3QoKSAKKyAgICAgICB8fCBzdHJzdHIob2JqZWN0X25hbWUocHJldmlvdXNfb2JqZWN0KCkpLCAiL2dpbGRlbi8iKSAhPSAwKSApCisgICAgIHJldHVybiAwOworCisgIGlmICghc3RyaW5ncChwbCkpIHBsPWdldHVpZChwbCk7CisKKyAgaWYgKG1lbWJlcih1c2Vyc19layxwbCkpIHJldHVybiB1c2Vyc19la1twbF07CisKKyAgc3RyaW5nIHMgPSAoTUFTVEVSLT5xdWVyeV9layhwbCkgfHwgIiIpOworICAKKyAgaW50IHA9LTE7CisgIGludCBzdW1tZTsKKyAgd2hpbGUgKChwPW5leHRfYml0KHMscCkpICE9IC0xKSB7CisgICAgICBzdW1tZSs9YnlfbnVtW3AsQllOVU1fU0NPUkVdOworICB9CisKKyAgdXNlcnNfZWsgKz0gKFtwbDpzdW1tZV0pOworICByZXR1cm4gc3VtbWU7Cit9CisKK3B1YmxpYyBtaXhlZCAqUXVlcnlOUENieU51bWJlcihpbnQgbnVtKQoreworICBpZiAoIWFsbG93ZWQoKSkKKyAgICByZXR1cm4gMDsKKworICBpZiAobWVtYmVyKGJ5X251bSwgbnVtKSkKKyAgICByZXR1cm4gKHtudW0sIGJ5X251bVtudW0sIEJZTlVNX1NDT1JFXSwgYnlfbnVtW251bSwgQllOVU1fS0VZXX0pOworCisgIHJldHVybiAwOworfQorCitwcm90ZWN0ZWQgbWl4ZWQgKlN0YXRpY1F1ZXJ5TlBDYnlOdW1iZXIoaW50IG51bSkKK3sKKyAgaWYgKG1lbWJlcihieV9udW0sIG51bSkpCisgICAgcmV0dXJuICh7bnVtLCBieV9udW1bbnVtLCBCWU5VTV9TQ09SRV0sIGJ5X251bVtudW0sIEJZTlVNX0tFWV19KTsKKworICByZXR1cm4gMDsKK30KKworcHVibGljIG1peGVkICpRdWVyeU5QQ2J5T2JqZWN0KG9iamVjdCBvKQoreworICBzdHJpbmcga2V5OworICBpbnQgdmFsOworCisgIGtleT1sb2FkX25hbWUobyk7CisgIGlmIChtZW1iZXIobnBjcyxrZXkpKSB7CisgICAgdmFsID0gbnBjc1trZXksTlBDX05VTUJFUl07CisgICAgcmV0dXJuICh7dmFsLCBieV9udW1bdmFsLCBCWU5VTV9TQ09SRV0sIGJ5X251bVt2YWwsIEJZTlVNX0tFWV19KTsKKyAgfQorICByZXR1cm4gMDsKK30KKworcHVibGljIGludCBHaXZlS2lsbChvYmplY3QgcGwsIGludCBiaXQpCit7CisgIG1peGVkIGluZm87CisgIG9iamVjdCBwbzsKKyAgaW50IGRyaW47CisgIHN0cmluZyBwbHMsIGVrOworCisKKyAgaWYgKCFwb2ludGVycChpbmZvID0gU3RhdGljUXVlcnlOUENieU51bWJlcihiaXQpKSkKKyAgICByZXR1cm4gLTE7CisKKyAgaWYgKCghcG89cHJldmlvdXNfb2JqZWN0KCkpIAorICAgICAgfHwgbG9hZF9uYW1lKHBvKSAhPSBpbmZvW1NDT1JFX0tFWV0pCisgICAgcmV0dXJuIC0yOworCisgIHBscz1nZXR1aWQocGwpOworCisgIC8vIHdlbm4gdW5iZXN0YWV0aWd0LCBTcGllbGVyIGZ1ZXIgc3BhZXRlciBtZXJrZW4KKyAgaWYgKG1lbWJlcih1bmNvbmZpcm1lZF9zY29yZXMsIGJpdCkpIHsKKyAgICBpZiAobWVtYmVyKHVuY29uZmlybWVkX3Njb3Jlc1tiaXRdLCBwbHMpID09IC0xKQorICB1bmNvbmZpcm1lZF9zY29yZXNbYml0XSArPSAoe3Bsc30pOworICB9CisgIGVsc2UgeworICAgIC8vIHNvbnN0IHdpcmQgZGFzIEJpdCBkaXJla3QgaW0gU3BpZWxlciBnZXNldHp0LgorICAgIGVrID0gKE1BU1RFUi0+cXVlcnlfZWsocGxzKSB8fCAiIik7CisgICAgaWYgKHRlc3RfYml0KGVrLCBiaXQpKQorICAgICAgcmV0dXJuIC0zOworICAgIGVrID0gc2V0X2JpdChlaywgYml0KTsKKyAgICBNQVNURVItPnVwZGF0ZV9layhwbHMsIGVrKTsKKyAgICAvLyBWZXJnYWJlc3RhdGlzdGlrIGhvY2h6YWVobGVuLgorICAgIG5wY3NbYnlfbnVtW2JpdCxCWU5VTV9LRVldLE5QQ19DT1VOVF0rKzsKKyAgfQorCisgIGlmIChtZW1iZXIodXNlcnNfZWssIHBscykpCisgICAgbV9kZWxldGUodXNlcnNfZWssIHBscyk7CisKKyAgRUtfR0lWRU5MT0coc3ByaW50ZigiJXM6ICVzIiwgaW5mb1tTQ09SRV9LRVldLCBwbHMpKTsgCisKKyAgcmV0dXJuIGluZm9bU0NPUkVfU0NPUkVdOworfQorCitwdWJsaWMgaW50IEhhc0tpbGwobWl4ZWQgcGwsIG1peGVkIG5wYykKK3sKKyAgc3RyaW5nIGZuLCAqcGxzOworCisgIGlmICghb2JqZWN0cChwbCkgJiYgIXN0cmluZ3AocGwpICYmIAorICAgICAgIW9iamVjdHAobnBjKSAmJiAhc3RyaW5ncChucGMpICYmICFpbnRwKG5wYykpCisgICAgcmV0dXJuIDA7CisgIGlmICghc3RyaW5ncChwbCkpIAorICAgIHBsPWdldHVpZChwbCk7CisKKyAgaWYgKGludHAobnBjKSkKKyAgICBucGM9YnlfbnVtW25wYyxCWU5VTV9LRVldOworICBmbj1sb2FkX25hbWUobnBjKTsKKworICBpZiAoIW1lbWJlcihucGNzLCBmbikpIHJldHVybiAwOworICAKKyAgaW50IGJpdCA9IG5wY3NbZm4sIE5QQ19OVU1CRVJdOworICAKKyAgaWYgKHBvaW50ZXJwKHBscz11bmNvbmZpcm1lZF9zY29yZXNbYml0XSkgJiYKKyAgICAgIG1lbWJlcihwbHMscGwpICE9IC0xKQorICAgIHJldHVybiAxOworCisgIHN0cmluZyBla3MgPSAoTUFTVEVSLT5xdWVyeV9layhwbCkgfHwgIiIpOworCisgIHJldHVybiB0ZXN0X2JpdChla3MsIGJpdCk7Cit9CisKK3ByaXZhdGUgdm9pZCBXcml0ZUR1bXBGaWxlKHN0cmluZyAqa2V5cykgeworICBpbnQgbWF4bjsKKworICBpZiAoIXBvaW50ZXJwKGtleXMpKSByZXR1cm47CisKKyAgcm0oU0NPUkVEVU1QRklMRSk7CisKKyAgd3JpdGVfZmlsZShTQ09SRURVTVBGSUxFLHNwcmludGYoIiU1cyAgJTVzICAlNHMgICAlc1xuIiwKKyAgIk5yLiIsICJDbnQiLCAiU2MiLCAiT2JqZWt0IikpOworICBmb3JlYWNoKHN0cmluZyBrZXk6IGtleXMpIHsKKyAgICB3cml0ZV9maWxlKFNDT1JFRFVNUEZJTEUsc3ByaW50ZigiJTVkICAlNWQgICU0ZCAgICVPXG4iLAorICAgIG5wY3Nba2V5LE5QQ19OVU1CRVJdLCBucGNzW2tleSxOUENfQ09VTlRdLAorICAgIG5wY3Nba2V5LE5QQ19TQ09SRV0sIGtleSkpOworICAgIG1heG4gKz0gbnBjc1trZXksTlBDX1NDT1JFXTsKKyAgfQorICB3cml0ZV9maWxlKFNDT1JFRFVNUEZJTEUsc3ByaW50ZigKKyAgIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iCisgICJOUENzIGdlc2FtdDogJWQgUHVua3RlXG5cbiIsbWF4bikpOworfQorCitwdWJsaWMgdmFyYXJncyBpbnQgRHVtcE5QQ3MoaW50IHNvcnRrZXkpIHsKKworICBpZiAoZXh0ZXJuX2NhbGwoKSAmJiAhYWxsb3dlZCgpKSByZXR1cm4gU0NPUkVfTk9fUEVSTUlTU0lPTjsKKyAgaWYgKCFpbnRwKHNvcnRrZXkpKSByZXR1cm4gU0NPUkVfSU5WQUxJRF9BUkc7CisKKyAgcm0oU0NPUkVEVU1QRklMRSk7CisKKyAgLy8gc29ydGllcmVuCisgIHN0cmluZyAqa2V5cz1zb3J0X2FycmF5KG1faW5kaWNlcyhucGNzKSwgZnVuY3Rpb24gaW50IChzdHJpbmcgYSwgc3RyaW5nIGIpIHsKKyAgICAgICAgcmV0dXJuKG5wY3NbYSxzb3J0a2V5XSA8IG5wY3NbYixzb3J0a2V5XSk7IH0gKTsKKyAgY2FsbF9vdXQoIydXcml0ZUR1bXBGaWxlLCAyLCBrZXlzKTsKKworICByZXR1cm4gMTsKK30KKworcHVibGljIGludCBTZXRTY29yZUJpdChzdHJpbmcgcGwsIGludCBiaXQpCit7CisgIHN0cmluZyBlazsKKworICBpZiAoIWFsbG93ZWQoKSkKKyAgICByZXR1cm4gU0NPUkVfTk9fUEVSTUlTU0lPTjsKKworICBlayA9IChNQVNURVItPnF1ZXJ5X2VrKHBsKSB8fCAiIik7CisgIGVrID0gc2V0X2JpdChlaywgYml0KTsKKyAgTUFTVEVSLT51cGRhdGVfZWsocGwsIGVrKTsKKworICAvLyBWZXJnYWJlc3RhdGlzdGlrIGhvY2h6YWVobGVuLgorICBucGNzW2J5X251bVtiaXQsQllOVU1fS0VZXSxOUENfQ09VTlRdKys7CisKKyAgaWYgKG1lbWJlcih1c2Vyc19laywgcGwpKQorICAgIG1fZGVsZXRlKHVzZXJzX2VrLCBwbCk7CisKKyAgd3JpdGVfZmlsZShTQ09SRUxPR0ZJTEUsc3ByaW50ZigiU0VUQklUOiAlcyAlcyAlNWQgU2M6ICUuM2QgJXMgKCVzLCAlTylcbiIsCisgICAgICAgICBzdHJmdGltZSgiJWQlbSVZLSVUIix0aW1lKCkpLHBsLCBiaXQsCisgICAgICAgICBieV9udW1bYml0LEJZTlVNX1NDT1JFXSwgYnlfbnVtW2JpdCxCWU5VTV9LRVldLAorICAgICAgICAgZ2V0ZXVpZChwcmV2aW91c19vYmplY3QoKSksIHRoaXNfaW50ZXJhY3RpdmUoKSkpOworICByZXR1cm4gMTsKK30KKworcHVibGljIGludCBDbGVhclNjb3JlQml0KHN0cmluZyBwbCwgaW50IGJpdCkKK3sKKyAgc3RyaW5nIGVrOworCisgIGlmICghYWxsb3dlZCgpKQorICAgIHJldHVybiBTQ09SRV9OT19QRVJNSVNTSU9OOworCisgIGVrID0gKE1BU1RFUi0+cXVlcnlfZWsocGwpIHx8ICIiKTsKKyAgZWsgPSBjbGVhcl9iaXQoZWssIGJpdCk7CisgIE1BU1RFUi0+dXBkYXRlX2VrKHBsLCBlayk7CisKKyAgLy8gVmVyZ2FiZXN0YXRpc3RpayBydW50ZXJ6YWVobGVuLgorICBucGNzW2J5X251bVtiaXQsQllOVU1fS0VZXSxOUENfQ09VTlRdLS07CisKKyAgaWYgKG1lbWJlcih1c2Vyc19laywgcGwpKQorICAgIG1fZGVsZXRlKHVzZXJzX2VrLCBwbCk7CisKKyAgd3JpdGVfZmlsZShTQ09SRUxPR0ZJTEUsc3ByaW50ZigKKyAgIkNMRUFSQklUOiAlcyAlcyAlNWQgU2M6ICUuM2QgJXMgKCVzLCAlTylcbiIsICAgICAgIAorICBzdHJmdGltZSgiJWQlbSVZLSVUIix0aW1lKCkpLHBsLGJpdCwKKyAgYnlfbnVtW2JpdCxCWU5VTV9TQ09SRV0sYnlfbnVtW2JpdCxCWU5VTV9LRVldLAorICBnZXRldWlkKHByZXZpb3VzX29iamVjdCgpKSwgdGhpc19pbnRlcmFjdGl2ZSgpKSk7CisgIHJldHVybiAxOworfQorCitwcml2YXRlIHN0YXR1cyBla3RpcEFsbG93ZWQoKQoreyAKKyAgc3RhdHVzIHBvT0s7CisgIHN0cmluZyBwb05hbWU7CisgIHN0YXR1cyByZXQ7CisgICAgICAgICAgICAgICAgCisgIHBvTmFtZT1sb2FkX25hbWUocHJldmlvdXNfb2JqZWN0KCkpOyAgICAgICAgCisgIHBvT0s9cHJldmlvdXNfb2JqZWN0KCkgJiYgICAgIAorICAgICgocHJldmlvdXNfb2JqZWN0KCk9PWZpbmRfb2JqZWN0KEVLVElQR0lWRVIpKSB8fCAocG9OYW1lPT1FS1RJUExJU1QpICk7CisKKyAgcmV0PWFsbG93ZWQoKSB8fCAKKyAgICAodGhpc19wbGF5ZXIoKSAmJiB0aGlzX2ludGVyYWN0aXZlKCkgJiYgcHJldmlvdXNfb2JqZWN0KCkgJiYgCisgICAgIHRoaXNfaW50ZXJhY3RpdmUoKT09dGhpc19wbGF5ZXIoKSAmJiBwb09LKTsKKyAgcmV0dXJuIHJldDsKK30KKworLy8gbGllZmVydCBhbGxlIEVLcywgZGllIGFrdGl2IHNpbmQgdW5kIGRpZSBkZXIgU3BpZWxlciBub2NoIG5pY2h0IGhhdCBpbgorLy8gZWluZW0gTWFwcGluZyBlbnRzcHJlY2hlbmQgbnBjcyB6dXJ1ZWNrLgorcHVibGljIG1hcHBpbmcgZ2V0RnJlZUVLc0ZvclBsYXllcihvYmplY3QgcGxheWVyKQoreworICBpZighZWt0aXBBbGxvd2VkKCkgfHwgIW9iamVjdHAocGxheWVyKSB8fCAhcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShwbGF5ZXIpKXsKKyAgICAgIHJldHVybiAoW10pOworICB9CisgIC8vIGFsbGUgRUtzLCBkaWUgZGVyIFNwaWVsZXIgaGF0CisgIHN0cmluZyBla3MgPSAoc3RyaW5nKW1hc3RlcigpLT5xdWVyeV9layhnZXR1aWQocGxheWVyKSk7CisgIC8vIGFscyBUaXBzIGtvbW1lbiBhbGxlIGluIEZyYWdlLCBkaWUgZXIgbmljaHQgaGF0LCB2b3IgZGVtIEludmVydGllcmVuIG11c3MKKyAgLy8gYWJlciBzaWNoZXJnZXN0ZWxsdCB3ZXJkZW4sIGRhc3MgZWtzIG1pbi4gc28gbGFuZyBpc3Qgd2llIGFjdGl2ZV9la3MsIGRhCisgIC8vIGRpZSBJbnZlcnRpZXJ1bmcgamEgei5CLiBudXIgRUtzIDAtMTcwMCBiZXJ1ZWNrc2ljaHRpZ3QsIHdlbm4gMTcwMCBkZXIKKyAgLy8gaG9lY2hzdGUgRUsgaW0gU3BpZWxlciBpc3QgdW5kIGRhbm4gYWxzIFRpcHMgYWxsZSBFS3MgdWViZXIKKyAgLy8gMTcwMCB2ZXJsb3Jlbmdpbmdlbi4KKyAgLy8gaGllciB3aXJkIGRhcyBsZXR6dGUgQml0IHZvbiBhY3RpdmVfZWtzIGVybWl0dGVsdCB1bmQgZGFzIGRhcmF1ZiBmb2xnZW5kZQorICAvLyBCaXQgaW0gU3BpZWxlci1FSy1TdHJpbmcgZ2VzZXR6dCB1bmQgd2llZGVyIGdlbG9lc2NodCwgd29yYXVmaGluIGRlcgorICAvLyBFSy1TdHJpbmcgbWluLiBzbyBsYW5nIHdpZSBhY3RpdmVfZWtzIGlzdC4gKGVzIGlzdCBlZ2FsLCB3ZW5uIGVyCisgIC8vIGxhZW5nZXIgaXN0LCBhdWNoIGVnYWwsIHdlbm4gbWFuIGVpbiBCaXQgdWViZXJzY2hyZWlidCwgZGFzIGZhZWxsdCBhbGxlcworICAvLyBnbGVpY2ggYmVpbSBhbmRfYml0cygpIHJhdXMuCisgIGludCBsYiA9IGxhc3RfYml0KGFjdGl2ZV9la3MpICsgMTsKKyAgZWtzID0gY2xlYXJfYml0KHNldF9iaXQoZWtzLCBsYiksIGxiKTsKKyAgLy8gamV0enQgaW52ZXJ0aWVyZW4KKyAgc3RyaW5nIG5vbl9la3MgPSBpbnZlcnRfYml0cyhla3MpOworICAvLyBqZXR6dCB2b3JoYW5kZSBFSy1UaXBzIGF1c2ZpbHRlcm4uIEltIFByaW56aXAgZ2xlaWNoZXMgU3BpZWwgd2llIG9iZW4uCisgIHN0cmluZyBla3RpcHMgPSAoc3RyaW5nKW1hc3RlcigpLT5xdWVyeV9la3RpcHMoZ2V0dWlkKHBsYXllcikpOworICAvLyBqZXR6dCBhbGxlIG5pY2h0IGFscyBUaXAgdmVyZ2ViZW5lbiBOUEMgZXJtaXR0ZWxuLCB2b3IgZGVtIEludmVydGllcmVuCisgIC8vIHdpZWRlciBMYWVuZ2UgYW5nbGVpY2hlbi4uLgorICBla3RpcHMgPSBpbnZlcnRfYml0cyhjbGVhcl9iaXQoc2V0X2JpdChla3RpcHMsIGxiKSwgbGIpKTsKKyAgLy8gdmVydW5kZW4gbGllZmVydCBFS3MsIGRpZSBkZXIgU3BpZWxlciBuaWNodCBoYXQgdW5kIG5pY2h0IGFscyBUaXAgaGF0CisgIGVrdGlwcyA9IGFuZF9iaXRzKGVrdGlwcywgbm9uX2Vrcyk7CisKKyAgLy8gdW5kIG51biBkaWUgaW5ha3RpdmUgRUtzIGF1c2ZpbHRlcm4sIG5vY2htYWwgdmVydW5kZW4KKyAgZWt0aXBzID0gYW5kX2JpdHMoZWt0aXBzLCBhY3RpdmVfZWtzKTsKKworICAvLyBtYWwgUGxhdHogcmVzZXJ2aWVyZW4sIGVudHNwcmVjaGVuZCBkZXIgTWVuZ2UgYW4gQml0cworICBtYXBwaW5nIGZyZWVLaWxscyA9IG1fYWxsb2NhdGUoIGNvdW50X2JpdHMoZWt0aXBzKSwgMik7CisgIC8vIGR1cmNoIGFsbGUgamV0enQgZ2VzZXR6dGVuIEJpdHMgbGF1ZmVuLCBkLmguIGFsbGUgRUtzLCBkaWUgZGVyIFNwaWVsZXIKKyAgLy8gbmljaHQgaGF0IHVuZCBlaW4gTWFwcGluZyBhIGxhIG5wY3MgZXJzdGVsbGVuLgorICBpbnQgcD0tMTsKKyAgd2hpbGUgKCAocD1uZXh0X2JpdChla3RpcHMsIHApKSAhPSAtMSkgeworICAgIGZyZWVLaWxscyArPSAoWyBieV9udW1bcCwwXTogcDsgYnlfbnVtW3AsMV0gXSk7CisgIH0KKworICByZXR1cm4gZnJlZUtpbGxzOworfQorCitwdWJsaWMgaW50IGFkZFRpcChtaXhlZCBrZXksc3RyaW5nIHRpcCkKK3sKKyAgc3RyaW5nIGZuOworICAKKyAgaWYgKCFhbGxvd2VkKCkpCisgICAgcmV0dXJuIFNDT1JFX05PX1BFUk1JU1NJT047CisKKyAgaWYgKCF0aXAgfHwgKCFvYmplY3RwKGtleSkgJiYgIXN0cmluZ3Aoa2V5KSkpCisgICAgcmV0dXJuIFNDT1JFX0lOVkFMSURfQVJHOworCisgIGZuPWxvYWRfbmFtZShrZXkpOworCisgIGlmICghbWVtYmVyKG5wY3MsIGZuKSkgcmV0dXJuIFNDT1JFX0lOVkFMSURfQVJHOworICB0aXBMaXN0Kz0oW2ZuOnRpcF0pOworICBzYXZlX29iamVjdChTQ09SRVNBVkVGSUxFKTsKKyAgICAKKyAgcmV0dXJuIDE7Cit9CisKK3B1YmxpYyBpbnQgY2hhbmdlVGlwKG1peGVkIGtleSxzdHJpbmcgdGlwKQoreworICAgIHJldHVybiBhZGRUaXAoa2V5LHRpcCk7Cit9CisKK3B1YmxpYyBpbnQgcmVtb3ZlVGlwKG1peGVkIGtleSkKK3sKKyAgc3RyaW5nIGZuOworICAKKyAgaWYgKCFhbGxvd2VkKCkpCisgICAgcmV0dXJuIFNDT1JFX05PX1BFUk1JU1NJT047CisgIAorICBpZiAoKCFvYmplY3RwKGtleSkgJiYgIXN0cmluZ3Aoa2V5KSkpCisgICAgcmV0dXJuIFNDT1JFX0lOVkFMSURfQVJHOworCisgIGZuPWxvYWRfbmFtZShrZXkpOworICAKKyAgaWYgKCFtZW1iZXIodGlwTGlzdCwgZm4pKSByZXR1cm4gU0NPUkVfSU5WQUxJRF9BUkc7CisgICAgCisgIG1fZGVsZXRlKHRpcExpc3QsZm4pOworICBzYXZlX29iamVjdChTQ09SRVNBVkVGSUxFKTsKKyAgICAKKyAgcmV0dXJuIDE7ICAKK30KKworcHJpdmF0ZSBzdHJpbmcgZ2V0VGlwRnJvbUxpc3QobWl4ZWQga2V5KQoreworICBzdHJpbmcgZm47CisgIAorICBpZiAoIWVrdGlwQWxsb3dlZCgpKQorICAgIHJldHVybiAiIjsKKyAgCisgIGlmICgoIW9iamVjdHAoa2V5KSAmJiAhc3RyaW5ncChrZXkpKSkKKyAgICByZXR1cm4gIiI7CisKKyAgZm49bG9hZF9uYW1lKGtleSk7CisgIAorICBpZiAoIW1lbWJlcih0aXBMaXN0LCBmbikpIHJldHVybiAiIjsKKyAgICAgICAgCisgIHJldHVybiB0aXBMaXN0W2ZuXTsgIAorfQorCitwcml2YXRlIHN0cmluZyBfZ2V0VGlwKG1peGVkIGtleSkKK3sKKyAgc3RyaW5nIGZuOworICBzdHJpbmcgdGlwOworICBzdHJpbmcqIHBhdGg7CisgICAgCisgIGlmICgoIW9iamVjdHAoa2V5KSAmJiAhc3RyaW5ncChrZXkpKSkKKyAgICByZXR1cm4gIiI7CisKKyAgZm49bG9hZF9uYW1lKGtleSk7CisgIAorICBpZighbWVtYmVyKG5wY3MsZm4pKSByZXR1cm4gIiI7CisgIAorICB0aXA9Z2V0VGlwRnJvbUxpc3QoZm4pOworICBpZighdGlwIHx8IHRpcD09IiIpeworICAgIHBhdGg9ZXhwbG9kZShmbiwiLyIpLSh7IiJ9KTsKKyAgICBpZihzaXplb2YocGF0aCk8MykgcmV0dXJuICIiOworICAgIGlmKHBhdGhbMF09PSJwbGF5ZXJzIikgeworICAgICAgc3RyaW5nIHRpcHRleHQ7CisgICAgICBpZiAoIHBhdGhbMV0gPT0gImtldG9zIiApCisgICAgICAgIHRpcHRleHQgPSAiS2V0b3MgaW0gR2ViaXJnZSI7CisgICAgICBlbHNlIGlmICggcGF0aFsxXSA9PSAiYm9pbmciICYmIHBhdGhbMl0gPT0gImZyaWVkaG9mIiApCisgICAgICAgIHRpcHRleHQgPSAiQm9pbmcgaW0gZWlzaWdlbiBQb2xhciI7CisgICAgICBlbHNlCisgICAgICAgIHRpcHRleHQgPSBjYXBpdGFsaXplKHBhdGhbMV0pOworICAgICAgcmV0dXJuICJTY2hhdSBEaWNoIGRvY2ggbWFsIGJlaSAiK3RpcHRleHQrIiB1bS4iOworICAgIH0KKyAgICAKKyAgICBpZihwYXRoWzBdPT0iZCIpCisgICAgeworICAgICAgdGlwKz0iU2NoYXUgRGljaCBkb2NoIG1hbCAiOworICAgIAorICAgICAgaWYoZmlsZV9zaXplKCIvcGxheWVycy8iK3BhdGhbMl0pPT0tMikKKyAgICAgIHsKKyAgICAgICAgdGlwKz0iYmVpICIrY2FwaXRhbGl6ZShwYXRoWzJdKyIgIik7CisgICAgICB9CisgICAgICBpZiAoIHBhdGhbMV09PSJwb2xhciIgJiYgZmlsZV9zaXplKCIvcGxheWVycy8iK3BhdGhbM10pPT0tMiApCisgICAgICB7CisgICAgICAgIHRpcCs9ImJlaSAiK2NhcGl0YWxpemUocGF0aFszXSkrIiAiOworICAgICAgfQorCisgICAgICBpZihwYXRoWzFdPT0iYW5mYWVuZ2VyIikKKyAgICAgICAgdGlwKz0iaW4gZGVuIEFuZmFlbmdlcmdlYmlldGVuICI7CisgICAgICBpZihwYXRoWzFdPT0iZmVybndlc3QiKQorICAgICAgICB0aXArPSJpbiBGZXJud2VzdCAiOworICAgICAgaWYocGF0aFsxXT09ImRzY2h1bmdlbCIpCisgICAgICAgIHRpcCs9ImltIERzY2h1bmdlbCAiOworICAgICAgaWYocGF0aFsxXT09InNjaGF0dGVud2VsdCIpCisgICAgICAgIHRpcCs9ImluIGRlciBXZWx0IGRlciBTY2hhdHRlbiAiOworICAgICAgaWYocGF0aFsxXT09InVudGVyd2VsdCIpCisgICAgICAgIHRpcCs9ImluIGRlciBVbnRlcndlbHQgIjsKKyAgICAgIGlmKHBhdGhbMV09PSJnZWJpcmdlIikKKyAgICAgICAgdGlwKz0iaW0gR2ViaXJnZSAiOworICAgICAgaWYocGF0aFsxXT09InNlaGVyIikKKyAgICAgICAgdGlwKz0iYmVpIGRlbiBTZWhlcmdlYmlldGVuICI7CisgICAgICBpZihwYXRoWzFdPT0idmxhbmQiKQorICAgICAgICB0aXArPSJhdWYgZGVtIFZlcmxvcmVuZW4gTGFuZCAiOworICAgICAgaWYocGF0aFsxXT09ImViZW5lIikKKyAgICAgICAgdGlwKz0iaW4gZGVyIEViZW5lICI7CisgICAgICBpZihwYXRoWzFdPT0iaW5zZWxuIikKKyAgICAgICAgdGlwKz0iYXVmIGRlbiBJbnNlbG4gIjsKKyAgICAgIGlmKHBhdGhbMV09PSJ3YWxkIikKKyAgICAgICAgdGlwKz0iaW0gV2FsZCAiOworICAgICAgaWYocGF0aFsxXT09ImVyem1hZ2llciIpCisgICAgICAgIHRpcCs9ImJlaSBkZW4gRXJ6bWFnaWVybiAiOworICAgICAgaWYocGF0aFsxXT09InBvbGFyIikKKyAgICAgIHsKKyAgICAgICAgaWYgKHBhdGhbMl09PSJmaWxlcy5jaGFvcyIpCisgICAgICAgICAgdGlwKz0iaW4gZGVuIFJhZXVtZW4gZGVyIENoYW9zZ2lsZGUgIjsKKyAgICAgICAgdGlwKz0iaW0gZWlzaWdlbiBQb2xhciAiOworICAgICAgfQorICAgICAgaWYocGF0aFsxXT09Ind1ZXN0ZSIpCisgICAgICAgIHRpcCs9ImluIGRlciBXdWVzdGUgIjsKKyAgICAgIHRpcCs9InVtLiI7CisgICAgfQorICAgIGVsc2UgaWYgKCBwYXRoWzBdPT0iZ2lsZGVuIiApCisgICAgeworICAgICAgdGlwKz0iU2NoYXUgRGljaCBkb2NoIG1hbCI7CisgICAgICBzd2l0Y2goIHBhdGhbMV0gKQorICAgICAgeworICAgICAgICBjYXNlICJtb24uZWxlbWVudGFyIjogCisgICAgICAgICAgdGlwKz0iIHVudGVyIGRlbiBBbmZ1ZWhyZXJuIGRlciBFbGVtZW50YXJnaWxkZSI7IAorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICJmaWxlcy5kdW5rZWxlbGZlbiI6CisgICAgICAgICAgdGlwKz0iIHVudGVyIGRlbiBBbmZ1ZWhyZXJuIGRlciBEdW5rZWxlbGZlbmdpbGRlIjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAiZmlsZXMua2xlcnVzIjoKKyAgICAgICAgICB0aXArPSIgYmVpbSBLbGVydXMiOyAKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAiZmlsZXMud2Vyd29lbGZlIjogCisgICAgICAgICAgdGlwKz0iIHVudGVyIGRlbiBBbmZ1ZWhyZXJuIGRlciBXZXJ3b2VsZmUiOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICJmaWxlcy5jaGFvcyI6IAorICAgICAgICAgIHRpcCs9IiB1bnRlciBkZW4gQW5mdWVocmVybiBkZXIgQ2hhb3NnaWxkZSI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IAorICAgICAgICAgIHRpcCs9IiBpbiBlaW5lciBkZXIgR2lsZGVuIjsgCisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICB0aXArPSIgdW0uIjsKKyAgICB9CisgICAgZWxzZSBpZiAoIHBhdGhbMF0gPT0gInAiICkgCisgICAgeworICAgICAgdGlwKz0iU2NoYXUgRGljaCBkb2NoIG1hbCAiOworICAgICAgc3dpdGNoKCBwYXRoWzFdICkgCisgICAgICB7CisgICAgICAgIGNhc2UgInphdWJlcmVyIjoKKyAgICAgICAgICB0aXArPSJpbiBkZXIgWmF1YmVyZXJnaWxkZSB6dSBUYXJhbWlzIjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAia2FlbXBmZXIiOgorICAgICAgICAgIHRpcCs9ImJlaSBkZW4gQW5nZWhvZXJpZ2VuIGRlcyBLb3J1LVRzY2hha2FyLVN0cnV2cyI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgImthdHplbmtyaWVnZXIiOgorICAgICAgICAgIHRpcCs9ImJlaSBkZXIgR2lsZGUgZGVyIEthdHplbmtyaWVnZXIiOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICJ0YW5qaWFuIjoKKyAgICAgICAgICB0aXArPSJ1bnRlciBkZW4gTWVpc3Rlcm4gZGVyIFRhbmppYW5naWxkZSI7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICB0aXArPSIgdW0uIjsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHRpcDsKK30KKworLy8gcmV0dXJuIHZhbGlkIHRpcHMgZnJvbSBkYXRhYmFzZSBvciBleGlzdGluZyAKK3B1YmxpYyBzdHJpbmcgZ2V0VGlwKG1peGVkIGtleSkKK3sKKyAgc3RyaW5nIGZuOworICBzdHJpbmcgdGlwOworICBzdHJpbmcqIHBhdGg7CisgIAorICBpZiAoIWVrdGlwQWxsb3dlZCgpKQorICAgIHJldHVybiAiIjsKKyAgCisgIHJldHVybiBfZ2V0VGlwKGtleSk7Cit9CisKKy8vIGxpZWZlcnQgZWluIEFycmF5IG1pdCBhbGxlbiBPYmpla3RlbiB6dXJ1ZWNrLCBhdWYgZGllIGJpdHN0ciB2ZXJ3ZWlzdCwgYWxzbworLy8gZWluZSBMaXN0ZSBhbGxlciBPYmpla3RlLCBkaWUgYWxzIFRpcCB2ZXJnZWJlbiB3dXJkZW4uCitwcml2YXRlIHN0cmluZyogbWFrZVRpcGxpc3RGcm9tQml0U3RyaW5nKHN0cmluZyBiaXRzdHIpCit7IAorICBzdHJpbmcgKiByZXQ9IGFsbG9jYXRlKGNvdW50X2JpdHMoYml0c3RyKSk7CisgIC8vIHVlYmVyIGFsbGUgZ2VzZXR6dGVuIGJpdHMgbGF1ZmVuIHVuZCBBcnJheSB6dXNhbW1lbnNhbW1lbG4KKyAgaW50IGk7CisgIGludCBwPS0xOworICB3aGlsZSAoKHA9bmV4dF9iaXQoYml0c3RyLHApKSAhPSAtMSkgeworICAgIHJldFtpXSA9IGJ5X251bVtwLCAwXTsKKyAgICBpKys7CisgIH0KKyAgLy8genVyIFNpY2hlcmhlaXQKKyAgcmV0IC09ICh7MH0pOworCisgIHJldHVybiByZXQ7Cit9CisKKy8vIGdpYnQgZGllIE9iamVrdG5hbWVuIGRlciBFSy1UaXBzIHZvbSBqZXdlaWxpZ2VuIFNwaWVsZXIgenVydWVjay4KK3B1YmxpYyBzdHJpbmcgKlF1ZXJ5VGlwT2JqZWN0cyhtaXhlZCBwbGF5ZXIpIHsKKyAgCisgIGlmIChleHRlcm5fY2FsbCgpICYmICFhbGxvd2VkKCkpCisgICAgICByZXR1cm4gMDsKKyAgaWYgKG9iamVjdHAocGxheWVyKSAmJiBxdWVyeV9vbmNlX2ludGVyYWN0aXZlKHBsYXllcikpCisgICAgICBwbGF5ZXI9Z2V0dWlkKHBsYXllcik7CisgIGlmICghc3RyaW5ncChwbGF5ZXIpKQorICAgIHJldHVybiAwOworCisgIHN0cmluZyB0aXBzdHI9KHN0cmluZyltYXN0ZXIoKS0+cXVlcnlfZWt0aXBzKHBsYXllcik7CisgIC8vIGpldHp0IEVLLVRpcHMgYXVzZmlsdGVybiwgZGllIGVybGVkaWd0IHNpbmQuIERhenUgRUstTGlzdGUgaG9sZW4uLi4KKyAgc3RyaW5nIGVrcz0oc3RyaW5nKW1hc3RlcigpLT5xdWVyeV9layhwbGF5ZXIpOworICAvLyBhbHMgVGlwcyBrb21tZW4gYWxsZSBpbiBGcmFnZSwgZGllIGVyIG5pY2h0IGhhdCwgdm9yIGRlbSBJbnZlcnRpZXJlbiBtdXNzCisgIC8vIGFiZXIgc2ljaGVyZ2VzdGVsbHQgd2VyZGVuLCBkYXNzIGVrcyBtaW4uIHNvIGxhbmcgaXN0IHdpZSB0aXBzdHIsIGRhCisgIC8vIGRpZSBJbnZlcnRpZXJ1bmcgamEgei5CLiBudXIgRUtzIDAtMTcwMCBiZXJ1ZWNrc2ljaHRpZ3QsIHdlbm4gMTcwMCBkZXIKKyAgLy8gaG9lY2hzdGUgRUsgaW0gU3BpZWxlciBpc3QgdW5kIGRhbm4gYWxsZSBUaXBzIHVlYmVyCisgIC8vIDE3MDAgdmVybG9yZW5naW5nZW4uCisgIC8vIGhpZXIgd2lyZCBkYXMgbGV0enRlIEJpdCB2b24gdGlwc3RyIGVybWl0dGVsdCB1bmQgZGFzIGRhcmF1ZiBmb2xnZW5kZQorICAvLyBCaXQgaW0gU3BpZWxlci1FSy1TdHJpbmcgZ2VzZXR6dCB1bmQgd2llZGVyIGdlbG9lc2NodCwgd29yYXVmaGluIGRlcgorICAvLyBFSy1TdHJpbmcgbWluLiBzbyBsYW5nIHdpZSBkZXIgVGlwc3RyaW5nIGlzdC4gKGVzIGlzdCBlZ2FsLCB3ZW5uIGVyCisgIC8vIGxhZW5nZXIgaXN0LCBhdWNoIGVnYWwsIHdlbm4gbWFuIGVpbiBCaXQgdWViZXJzY2hyZWlidCwgZGFzIGZhZWxsdCBhbGxlcworICAvLyBnbGVpY2ggYmVpbSBhbmRfYml0cygpIHJhdXMuCisgIGludCBsYiA9IGxhc3RfYml0KHRpcHN0cikgKyAxOworICBla3MgPSBjbGVhcl9iaXQoc2V0X2JpdChla3MsIGxiKSwgbGIpOworICAvLyBqZXR6dCBpbnZlcnRpZXJlbgorICBzdHJpbmcgbm9uX2VrcyA9IGludmVydF9iaXRzKGVrcyk7CisgIC8vIGpldHp0IHZlcnVuZGVuIHVuZCBtYW4gaGF0IGRpZSBUaXBzLCBkaWUgbm9jaCBuaWNodCBnZWhhdWVuIHd1cmRlbi4KKyAgdGlwc3RyID0gYW5kX2JpdHModGlwc3RyLCBub25fZWtzKTsKKyAgLy8gbm9jaCBpbmFrdGl2ZSBFS3MgYXVzZmlsdGVybi4uLgorICB0aXBzdHIgPSBhbmRfYml0cyh0aXBzdHIsIGFjdGl2ZV9la3MpOworCisgIHJldHVybiBtYWtlVGlwbGlzdEZyb21CaXRTdHJpbmcodGlwc3RyKTsKK30KKworcHVibGljIHN0cmluZyBhbGxUaXBzRm9yUGxheWVyKG9iamVjdCBwbGF5ZXIpCit7CisKKyAgaWYoIXBsYXllciB8fCAhdGhpc19pbnRlcmFjdGl2ZSgpIHx8IAorICAgICAgKHRoaXNfaW50ZXJhY3RpdmUoKSE9cGxheWVyICYmICFJU19BUkNIKHRoaXNfaW50ZXJhY3RpdmUoKSkpICkKKyAgICByZXR1cm4gIiI7ICAgIAorIAorICBzdHJpbmcgKnRpcHMgPSBRdWVyeVRpcE9iamVjdHMocGxheWVyKTsKKworICB0aXBzID0gbWFwKHRpcHMsICMnX2dldFRpcCk7CisgIHRpcHMgLT0gKHswLCIifSk7CisKKyAgcmV0dXJuIGltcGxvZGUodGlwcywgIlxuIik7Cit9CisKK3B1YmxpYyBzdGF0dXMgcGxheWVyTWF5R2V0VGlwKG9iamVjdCBwbGF5ZXIpCit7CisgIGludCBudW1FbGVnaWJsZTsKKyAgaW50IG51bVJlY2VpdmVkOworICBpbnQgbHZsOworICBpbnQgaTsKKyAgc3RyaW5nIHRpcHM7CisgIAorICBpZighZWt0aXBBbGxvd2VkKCkgfHwgIXBsYXllciB8fCAhcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShwbGF5ZXIpKSAgICAgIAorICAgICAgcmV0dXJuIDA7CisKKyAgaWYoIXBsYXllciB8fCAhcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShwbGF5ZXIpKSAgICAKKyAgICAgIHJldHVybiAwOworICAKKyAgbHZsPShpbnQpcGxheWVyLT5RdWVyeVByb3AoUF9MRVZFTCk7CisgIG51bUVsZWdpYmxlPTA7CisgIGk9c2l6ZW9mKEVLVElQU19MRVZFTF9MSU1JVFMpLTE7CisKKyAgaWYobHZsPkVLVElQU19MRVZFTF9MSU1JVFNbaV0pICAgIAorICAgICAgbnVtRWxlZ2libGUrPShsdmwtRUtUSVBTX0xFVkVMX0xJTUlUU1tpXSk7CisKKyAgZm9yKGk7aT49MDtpLS0peworICAgICAgaWYobHZsPj1FS1RJUFNfTEVWRUxfTElNSVRTW2ldKSBudW1FbGVnaWJsZSsrOworICB9CisKKyAgdGlwcz0oc3RyaW5nKU1BU1RFUi0+cXVlcnlfZWt0aXBzKGdldHVpZChwbGF5ZXIpKSB8fCAiIjsKKyAgLy8gaW5ha3RpdmUgRUtzIGF1c2ZpbHRlcm4uCisgIHRpcHMgPSBhbmRfYml0cyh0aXBzLCBhY3RpdmVfZWtzKTsKKyAgLy8gdW5kIEdlc2FtdHphaGwgYW4gVGlwcyB6YWVobGVuLiBIaWVyIHdlcmRlbiBlcmxlZGlndGUgVGlwcyBleHBsaXppdCBuaWNodAorICAvLyBhdXNnZWZpbHRlcnQhCisgIG51bVJlY2VpdmVkPWNvdW50X2JpdHModGlwcyk7CisKKyAgcmV0dXJuIG51bUVsZWdpYmxlPm51bVJlY2VpdmVkOworfQorCitwdWJsaWMgc3RyaW5nIGdpdmVUaXBGb3JQbGF5ZXIob2JqZWN0IHBsYXllcikKK3sKKyAgc3RyaW5nKiB0bXA7CisgIG1hcHBpbmcgZnJlZTsKKyAgc3RyaW5nIHRpcCxwbCxla3RpcDsKKyAgaW50IGluZGV4OworICAKKyAgaWYoIWVrdGlwQWxsb3dlZCgpIHx8ICFwbGF5ZXIgfHwgCisgICAgICAhcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShwbGF5ZXIpIHx8ICFwbGF5ZXJNYXlHZXRUaXAocGxheWVyKSkgIAorICAgIHJldHVybiAiIjsKKyAgCisgIHBsPWdldHVpZChwbGF5ZXIpOworICBmcmVlPWdldEZyZWVFS3NGb3JQbGF5ZXIocGxheWVyKTsKKworICBpZighbWFwcGluZ3AoZnJlZSkgfHwgc2l6ZW9mKGZyZWUpPT0wKQorICAgIHJldHVybiAiIjsKKworICB0bXA9bV9pbmRpY2VzKGZyZWUpOworCisgIGVrdGlwPShzdHJpbmcpTUFTVEVSLT5xdWVyeV9la3RpcHMocGwpIHx8ICIiOworIAorICBmb3JlYWNoKGludCBpOiBFS1RJUFNfTUFYX1JFVFJZKSB7CisgICAgICBpbmRleD1yYW5kb20oc2l6ZW9mKHRtcCkpOworICAgICAgdGlwPWdldFRpcCh0bXBbaW5kZXhdKTsKKyAgICAgIGlmIChzdHJpbmdwKHRpcCkgJiYgc2l6ZW9mKHRpcCkpIHsKKyAgICBla3RpcD1zZXRfYml0KGVrdGlwLG5wY3NbdG1wW2luZGV4XSxOUENfTlVNQkVSXSk7CisgICAgTUFTVEVSLT51cGRhdGVfZWt0aXBzKHBsLGVrdGlwKTsKKyAgICBicmVhazsgLy9mZXJ0aWcKKyAgICAgIH0KKyAgfQorCisgIHJldHVybiB0aXA7ICAKK30KKworLy8gY2hlY2t0IE5QQ3MgYXVmIEV4aXN0ZW56IHVuZCBMYWRiYXJrZWl0CitwdWJsaWMgdm9pZCBDaGVja05QQ3MoaW50IG51bSkgeworICBzdHJpbmcgZm47CisgIG9iamVjdCBla29iOworICBpZiAoIW51bSkgcm0oU0NPUkVDSEVDS0ZJTEUpOworICB3aGlsZSAobnVtIDw9IGxhc3ROdW0gJiYgZ2V0X2V2YWxfY29zdCgpID4gMTQ4MDAwMCkgeworICAgIGlmICghYnlfbnVtW251bSwxXSB8fCAhYnlfbnVtW251bSwwXSkgeworICAgICAgbnVtKys7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgZm4gPSBieV9udW1bbnVtLDBdICsgIi5jIjsKKyAgICBpZiAoZmlsZV9zaXplKGZuKSA8PSAwKSB7CisgICAgICAvLyBGaWxlIG5pY2h0IGV4aXN0ZW50CisgICAgICB3cml0ZV9maWxlKFNDT1JFQ0hFQ0tGSUxFLCBzcHJpbnRmKAorICAgICJFSyAlLjRkIGlzdCBuaWNodCBleGlzdGVudCAoJXMpXG4iLG51bSxmbikpOworICAgIH0KKyAgICBlbHNlIGlmIChjYXRjaChla29iPWxvYWRfb2JqZWN0KGZuKSkgfHwgIW9iamVjdHAoZWtvYikgKSB7CisgICAgICAvLyBOUEMgb2ZmZW5iYXIgbmljaHQgbGFkYmFyLgorICAgICAgd3JpdGVfZmlsZShTQ09SRUNIRUNLRklMRSwgc3ByaW50ZigKKyAgICAiRUsgJS40ZCBpc3QgbmljaHQgbGFkYmFyICglcylcbiIsbnVtLGZuKSk7CisgICAgfQorICAgIG51bSsrOworICB9CisgIFpERUJVRyhzcHJpbnRmKCIlZCBOUEMgY2hlY2tlZCIsbnVtKSk7CisgIGlmIChudW0gPD0gbGFzdE51bSkKKyAgICBjYWxsX291dCgjJ0NoZWNrTlBDcyw0LG51bSk7CisgIGVsc2UKKyAgICBaREVCVUcoIkZpbmlzaGVkISIpOworfQorCisvLyBsaXF1aWRpZXJ0IGVpbmVuIEVLIGVuZGd1ZWx0aWcuIEFuIGRpZXNlbSBQdW5rdCB3aXJkIGRhdm9uIGF1Z2VnYW5nZW4sIGRhc3MKKy8vIGtlaW4gU3BpZWxlciBkZW4gRUsgbWVociBnZXNldHp0IGhhdCEKK3ByaXZhdGUgdm9pZCBMaXF1aWRhdGVFSyhpbnQgYml0KSB7CisKKyAgaWYgKCFpbnRwKGJpdCkgfHwgYml0IDwgMCkgcmV0dXJuOworCisgIHN0cmluZyBvYm5hbWUgPSBieV9udW1bYml0LCBCWU5VTV9LRVldOworICBpbnQgc2NvcmUgPSBieV9udW1bYml0LCBCWU5VTV9TQ09SRV07CisKKyAgaWYgKG1lbWJlcihucGNzLCBvYm5hbWUpICYmIChucGNzW29ibmFtZSwgTlBDX05VTUJFUl0gPT0gYml0KSkgeworICAgIG1fZGVsZXRlKGJ5X251bSwgYml0KTsKKyAgICBtX2RlbGV0ZShucGNzLCBvYm5hbWUpOworICAgIGlmIChtZW1iZXIodW5jb25maXJtZWRfc2NvcmVzLGJpdCkpCisgICAgICBtX2RlbGV0ZSh1bmNvbmZpcm1lZF9zY29yZXMsYml0KTsKKyAgICBhY3RpdmVfZWtzID0gY2xlYXJfYml0KGFjdGl2ZV9la3MsYml0KTsKKyAgICByZW1vdmVUaXAob2JuYW1lKTsKKyAgICBmcmVlX251bSArPSAoe2JpdH0pOworICAgIHdyaXRlX2ZpbGUoU0NPUkVBVVRPTE9HLHNwcmludGYoCisgICAgIkxJUVVJREFURUVLOiAlcyAlNWQgU2NvcmUgJTNkICVzXG4iLAorICAgIHN0cmZ0aW1lKCIlZCVtJVktJVQiLHRpbWUoKSksIGJpdCwgc2NvcmUsIG9ibmFtZSkpOworICB9Cit9CisKK3ByaXZhdGUgdm9pZCBjaGVja19wbGF5ZXIoc3RyaW5nIHBsKSB7CisgIGludCBjaGFuZ2VkLCBjaGFuZ2VkMjsgCisgIAorICAvLyBFS3MgcHJ1ZWZlbgorICBzdHJpbmcgZWtzPShzdHJpbmcpbWFzdGVyKCktPnF1ZXJ5X2VrKHBsKSB8fCAiIjsKKyAgc3RyaW5nICpvcGZlcj1hbGxvY2F0ZSggKHNpemVvZihla3MpKjYpKzEsICIiKTsKKyAgaW50IHA9LTE7CisgIHdoaWxlICgocD1uZXh0X2JpdChla3MscCkpICE9IC0xKSB7CisgICAgaWYgKCFtZW1iZXIoYnlfbnVtLCBwKSkgeworICB3cml0ZV9maWxlKFNDT1JFQ0hFQ0tGSUxFLCBzcHJpbnRmKAorICAgIlVOS05PV05FSyAlcyAlNWQgaW4gJXMgZ2VmdW5kZW4uXG4iLCAKKyAgICBzdHJmdGltZSgiJWQlbSVZLSVUIix0aW1lKCkpLCBwLCBwbCkpOworICAgIH0KKyAgICAvLyB3ZW5uIGRhcyBha3R1ZWxsZSBCaXQgZ2Vsb2VzY2h0IHdlcmRlbiBzb2xsLCBhbHNvIGluIHRvX2JlX3JlbW92ZWQKKyAgICAvLyBzdGVodC4uLgorICAgIGlmIChtZW1iZXIodG9fYmVfcmVtb3ZlZCxwKSAhPSAtMSkgeworICBla3MgPSBjbGVhcl9iaXQoZWtzLHApOworICBjaGFuZ2VkPTE7CisgIHdyaXRlX2ZpbGUoRUtDTEVBTkxPRyxzcHJpbnRmKAorICAgICAgICAiQ0xFQVJCSVQ6ICVzICVPICU1ZCAlc1xuIiwKKyAgICAgICAgc3RyZnRpbWUoIiVkJW0lWS0lVCIsdGltZSgpKSwgcGwsIHAsIAorICAgICAgICBieV9udW1bcCxCWU5VTV9LRVldIHx8ICJOb05hbWUiKSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgLy8gc29uc3Qgc3RhdGlzdGlrcGZsZWdlCisgICAgICBucGNzW2J5X251bVtwLEJZTlVNX0tFWV0sTlBDX0NPVU5UXSsrOworICAgICAgLy8gbG9nZ2VuLCB3ZWxjaGUgTlBDIGRlciBTcGllbGVyIGhhdAorICAgICAgb3BmZXJbcF09dG9fc3RyaW5nKHApOworICAgIH0KKyAgfQorICAvLyB1bmQgbm9jaCBkaWUgRWstVGlwcy4uLgorICBzdHJpbmcgZWt0aXBzID0gKHN0cmluZyltYXN0ZXIoKS0+cXVlcnlfZWt0aXBzKHBsKSB8fCAiIjsKKyAgcCA9IC0xOworICB3aGlsZSAoKHA9bmV4dF9iaXQoZWt0aXBzLHApKSAhPSAtMSkgeworICAgIGlmICghbWVtYmVyKGJ5X251bSwgcCkpIHsKKyAgd3JpdGVfZmlsZShFS0NMRUFOTE9HLCBzcHJpbnRmKAorICAgICJVTktOT1dORUsgJXMgJTVkIGluICVzIChFS1RpcHMpIGdlZnVuZGVuIC0gY2xlYXJpbmcuXG4iLCAKKyAgICBzdHJmdGltZSgiJWQlbSVZLSVUIix0aW1lKCkpLCBwLCBwbCkpOworICBla3RpcHMgPSBjbGVhcl9iaXQoZWt0aXBzLCBwKTsgLy8gaGllciBkaXJla3QgbG9lc2NoZW4uCisgIGNoYW5nZWQyID0gMTsKKyAgICB9CisgICAgLy8gd2VubiBkYXMgYWt0dWVsbGUgQml0IGdlbG9lc2NodCB3ZXJkZW4gc29sbCwgYWxzbyBpbiB0b19iZV9yZW1vdmVkCisgICAgLy8gc3RlaHQuLi4KKyAgICBlbHNlIGlmIChtZW1iZXIodG9fYmVfcmVtb3ZlZCxwKSAhPSAtMSkgeworICBla3RpcHMgPSBjbGVhcl9iaXQoZWt0aXBzLHApOworICBjaGFuZ2VkMj0xOworICB3cml0ZV9maWxlKEVLQ0xFQU5MT0csc3ByaW50ZigKKyAgICAgICAgIkNMRUFSRUtUSVA6ICVzICVPICU1ZCAlc1xuIiwKKyAgICAgICAgc3RyZnRpbWUoIiVkJW0lWS0lVCIsdGltZSgpKSwgcGwsIHAsIAorICAgICAgICBieV9udW1bcCxCWU5VTV9LRVldIHx8ICJOb05hbWUiKSk7CisgICAgfQorICB9CisKKyAgaWYgKGNoYW5nZWQpIHsKKyAgICAgIG1hc3RlcigpLT51cGRhdGVfZWsocGwsIGVrcyk7CisgIH0KKyAgaWYgKGNoYW5nZWQyKSB7CisgICAgICBtYXN0ZXIoKS0+dXBkYXRlX2VrdGlwcyhwbCwgZWt0aXBzKTsKKyAgfQorICBvcGZlci09KHsiIn0pOworICB3cml0ZV9maWxlKFdFUktJTExUV0VOLHNwcmludGYoIiVzXG4lPS03OHNcblxuIixwbCxDb3VudFVwKG9wZmVyKXx8IiIpKTsKK30KKworcHVibGljIHZvaWQgY2hlY2tfYWxsX3BsYXllcihtYXBwaW5nIGFsbHBsYXllcikgeworIAorICBpZiAoZXh0ZXJuX2NhbGwoKSAmJiAhYWxsb3dlZCgpKQorICAgICAgcmV0dXJuOworCisgIGlmICghbWFwcGluZ3AoYWxscGxheWVyKSkgeworICAgICAgZm9yZWFjaChzdHJpbmcga2V5OiBucGNzKSB7CisgIG5wY3Nba2V5LE5QQ19DT1VOVF09MDsKKyAgICAgIH0KKyAgICAgIGFsbHBsYXllcj0obWFwcGluZyltYXN0ZXIoKS0+Z2V0X2FsbF9wbGF5ZXJzKCk7CisgICAgICBybShXRVJLSUxMVFdFTik7CisgICAgICBjYWxsX291dCgjJ2NoZWNrX2FsbF9wbGF5ZXIsMixhbGxwbGF5ZXIpOworICAgICAgcmV0dXJuOworICB9CisKKyAgLy8gb2ZmZW5iYXIgZmVydGlnIG1pdCBhbGxlbiBTcGllbGVybiwgamV0enQgbm9jaCBkZW4gUmVzdCBlcmxlZGlnZW4uCisgIGlmICghc2l6ZW9mKGFsbHBsYXllcikpIHsKKyAgICBmb3JlYWNoKGludCBiaXQ6IHRvX2JlX3JlbW92ZWQpIHsKKyAgICAgIExpcXVpZGF0ZUVLKGJpdCk7CisgICAgfQorICAgIHRvX2JlX3JlbW92ZWQ9KHt9KTsKKyAgICBzYXZlX29iamVjdChTQ09SRVNBVkVGSUxFKTsgCisgICAgWkRFQlVHKCJTcGllbGVyY2hlY2tzIHVuZCBFSy1MaXF1aWRhdGlvbiBmZXJ0aWcuXG4iKTsKKyAgICByZXR1cm47CisgIH0KKworICBzdHJpbmcgZGlyPW1faW5kaWNlcyhhbGxwbGF5ZXIpWzBdOworICBzdHJpbmcgKnBscz1hbGxwbGF5ZXJbZGlyXTsKKyAgZm9yZWFjaChzdHJpbmcgcGw6IHBscykgeworICAgIGlmIChnZXRfZXZhbF9jb3N0KCkgPCAxMjUwMDAwKQorICAgICAgYnJlYWs7IC8vIHNwYWV0ZXIgd2VpdGVybWFjaGVuLgorICAgIGNhdGNoKGNoZWNrX3BsYXllcihwbCkgOyBwdWJsaXNoKTsKKyAgICBwbHMtPSh7cGx9KTsKKyAgfQorICBhbGxwbGF5ZXJbZGlyXSA9IHBsczsgCisgCisgIGlmICghc2l6ZW9mKGFsbHBsYXllcltkaXJdKSkKKyAgICBtX2RlbGV0ZShhbGxwbGF5ZXIsZGlyKTsKKyAKKyAgY2FsbF9vdXQoIydjaGVja19hbGxfcGxheWVyLDIsYWxscGxheWVyKTsKK30KKwpkaWZmIC0tZ2l0IGEvc2VjdXJlL3Njb3JlbWFzdGVyLmggYi9zZWN1cmUvc2NvcmVtYXN0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDBjZjVmCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3Njb3JlbWFzdGVyLmgKQEAgLTAsMCArMSw1OCBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIHNjb3JlbWFzdGVyLmggLS0gRGVmaW5pdGlvbmVuIGZ1ZXIgZGVuIFNjb3JlTWFzdGVyCisvLworLy8gJElkOiBzY29yZW1hc3Rlci5oIDY2MzMgMjAwNy0xMi0wNiAyMTo0OTowMlogWmVzc3RyYSAkCisKKyNpZm5kZWYgX1NDT1JFTUFTVEVSX0hfCisjZGVmaW5lIF9TQ09SRU1BU1RFUl9IXyAxCisKKyNkZWZpbmUgU0NPUkVNQVNURVIgIi9zZWN1cmUvc2NvcmVtYXN0ZXIiCisKKyNkZWZpbmUgU0NPUkVTQVZFRklMRSAgICAiL3NlY3VyZS9BUkNIL25wY21hc3RlciIKKyNkZWZpbmUgU0NPUkVEVU1QRklMRSAgICAiL3NlY3VyZS9BUkNIL1NDT1JFUy5kdW1wIgorI2RlZmluZSBTQ09SRUxPR0ZJTEUgICAgICIvc2VjdXJlL0FSQ0gvU0NPUkVTLkxPRyIKKyNkZWZpbmUgU0NPUkVBVVRPTE9HICAgICAiL3NlY3VyZS9BUkNIL1NDT1JFU19BVVRPLkxPRyIKKyNkZWZpbmUgU0NPUkVDSEVDS0ZJTEUgICAiL3NlY3VyZS9BUkNIL1NDT1JFUy5rYXB1dHQiCisjZGVmaW5lIEVLQ0xFQU5MT0cgICAgICAgIi9zZWN1cmUvQVJDSC9FS0NMRUFORVIuTE9HIgorI2RlZmluZSBXRVJLSUxMVFdFTiAgICAgICIvc2VjdXJlL0FSQ0gvV0VSS0lMTFRXRU4uTE9HIgorCisvLyB3ZXIgaXN0IGZ1ZXIgZGllIEVLcyBha3R1ZWxsIHp1c3RhZW5kaWc/CisjZGVmaW5lIFNDT1JFTUFJTlRBSU5FUlMgKHsiYXJhdGhvcm4iLCAiemVzc3RyYSJ9KQorCisvLyBFbGVtZW50ZSBkZXMgdm9uIFF1ZXJ5U2NvcmUoKSB6dXJ1ZWNrZ2VnZWJlbmVuIEFycmF5cworI2RlZmluZSBTQ09SRV9OVU1CRVIJMCAgIC8vIChCaXQtKU51bW1lciBkZXMgT2JqZWt0cworI2RlZmluZSBTQ09SRV9TQ09SRQkxICAgLy8gWmFobCBkZXIgU3R1ZmVucHVua3RlCisjZGVmaW5lIFNDT1JFX0tFWQkyICAgLy8gRmlsZW5hbWUgZGVzIE9ia2VrdHMKKworLy8gSW5kaXplcyBmdWVyIGRhcyBNYXBwaW5nIG5wY3MKKyNkZWZpbmUgTlBDX05VTUJFUiAgICAgIDAgICAvLyAoQml0LSlOdW1tZXIgZGVzIEVLcworI2RlZmluZSBOUENfU0NPUkUgICAgICAgMSAgIC8vIFphaGwgZGVyIFN0dWZlbnB1bmt0ZQorI2RlZmluZSBOUENfQ09VTlQgICAgICAgMiAgIC8vIHdpZSBvZnQgZGVyIEVLIHZlcmdlYmVuIHd1cmRlCisvLyBJbmRpemVzIGZ1ZXIgZGFzIE1hcHBpbmcgYnlfbnVtCisjZGVmaW5lIEJZTlVNX0tFWSAgICAgICAwICAgLy8gRmlsZW5hbWUgZGVzIE9iamVrdHMKKyNkZWZpbmUgQllOVU1fU0NPUkUgICAgIDEgICAvLyBaYWhsIGRlciBTdHVmZW5wdW5rdGUKKworI2RlZmluZSBTQ09SRV9JTlZBTElEX0FSRyAgIC0xCisjZGVmaW5lIFNDT1JFX05PX1BFUk1JU1NJT04gLTIKKworI2RlZmluZSBTQ09SRV9MT1dfTUFSSwkyMDAwMDAKKyNkZWZpbmUgU0NPUkVfSElHSF9NQVJLIDYwMDAwMAorCisjZGVmaW5lIFBfTk9fU0NPUkUgIm5vX3Njb3JlIgorCisvLyBtb2VnbGljaGUgV2VydGUgZnVlciAnZmxhZycgYmVpIFRlc3RTY29yZSgpCisjZGVmaW5lIFNDT1JFX0tJTEwgIDB4MDEKKyNkZWZpbmUgU0NPUkVfUVVFU1QgMHgwMgorCisjZGVmaW5lIEVLX0dJVkVOTE9HKHgpIGxvZ19maWxlKCJBUkNIL0VLX0dJVkVOIiwgXAorICAgICAgICBkdGltZSh0aW1lKCkpKyIgIit4KyJcbiIsMTAwMDAwKQorCisvLyBlaW4gcGFhciBkZWZpbmVzIGZ1ZXIgZWt0aXBzCisjZGVmaW5lIEVLVElQU19NQVhfUkVUUlkJCTEwCisvLyBvbmUgdGlwIHBlciBsZXZlbCBpbiBsaXN0LCBhYm92ZSB0b3AgZW50cnkgb25lIHRpcCBldmVyeSBsZXZlbAorI2RlZmluZSBFS1RJUFNfTEVWRUxfTElNSVRTIAkoezYwLDY1LDcwLDc0LDc4LDgyLDg1LDg4LDkxLDkzLDk1LDk3fSkKKyNkZWZpbmUgRUtUSVBHSVZFUiAiL2QvZWJlbmUvbXVhZGliL2RyYWdvbi9ucGMvYnJ1bW5pIgorI2RlZmluZSBFS1RJUExJU1QgICIvZC9lYmVuZS9tdWFkaWIvZHJhZ29uL29iai9la2xpc3QiCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NoYWRvd21hc3Rlci5jIGIvc2VjdXJlL3NoYWRvd21hc3Rlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxZmQ1MWQKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2hhZG93bWFzdGVyLmMKQEAgLTAsMCArMSwyNjIgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8qKiBcZmlsZSAvc2VjdXJlL3NoYWRvd21hc3Rlci5jCisqIE9iamVrdCwgd2VsY2hlcyBlaW5lIExpc3RlIG1pdCBha3RpdmVuIFNoYWRvd3MgaGF0LgorKiBEaWUgc2ltdWxfZWZ1biBzaGFkb3coKSBtZWxkZXQgZGFzIGJlc2NoYXR0ZW5kZSBPYmpla3QgaGllciBhbi4gTnVldHpsaWNoLAorKiBkYW1pdCBtYW4gYWxzIE1hZ2llciBlbmRsaWNoIG1hbCByYXVza3JpZWdlbiBrYW5uLCB3ZWxjaGUgU2hhZG93cyBlcworKiBlaWdlbnRsaWNoIGdpYnQuCisqIFxhdXRob3IgWmVzc3RyYQorKiBcZGF0ZSAwNy4wOC4yMDA5CisqIFx2ZXJzaW9uICRJZCQKKyovCisvKiBDaGFuZ2Vsb2c6CisqLworI3ByYWdtYSBzdHJvbmdfdHlwZXMKKyNwcmFnbWEgbm9fY2xvbmUKKyNwcmFnbWEgbm9faW5oZXJpdAorI3ByYWdtYSBub19zaGFkb3cKKyNwcmFnbWEgcGVkYW50aWMKKworI2luY2x1ZGUgPGRlZmluZXMuaD4KKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKworI2RlZmluZSBIT01FKHgpIChfX1BBVEhfXygwKSt4KQorCisvKiogc2hhZG93cyBpc3QgZWluIG1hcHBpbmcsIHdlbGNoZXMgYWxsZSBTY2hhdHRlbiB1bmQgaWhyZSBPcGZlciBlbnRoYWVsdC4KKyAqCisgKiBTdHJ1a3R1cjogU2NoYXR0ZW4gYWxzIFNjaGx1ZXNzZWwgKG9iamVjdCkgdW5kIEJlc2NoYXR0ZXRlciAob2JqZWN0KSBhbHMKKyAqIFdlcnQuCisqLworcHJpdmF0ZSBtYXBwaW5nIHNoYWRvd3MgPSAoW10pOworCisjaWZuZGVmIERFQlVHCisjZGVmaW5lIERFQlVHKHgpICBpZiAoZmluZF9wbGF5ZXIoInplc3N0cmEiKSlcCisgICAgICAgICAgICB0ZWxsX29iamVjdChmaW5kX3BsYXllcigiemVzc3RyYSIpLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNNREJHOiAiK3grIlxuIikKKyNlbmRpZgorCisjZGVmaW5lIE1FTU9SWSAiL3NlY3VyZS9tZW1vcnkiCisKKyNkZWZpbmUgU0hBRE9XX09LICAgICAgICAgICAgIDEKKyNkZWZpbmUgU0hBRE9XX0FDQ0VTU19ERU5JRUQgLTEKKyNkZWZpbmUgU0hBRE9XX0VYSVNUUyAgICAgICAgLTIKKyNkZWZpbmUgU0hBRE9XX1VOS05PV04gICAgICAgLTMKKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkgeworICBtaXhlZCB0bXA7CisgIHNldGV1aWQoZ2V0dWlkKCkpOworICBpZiAobWFwcGluZ3AodG1wPU1FTU9SWS0+TG9hZCgiU2NoYXR0ZW4iKSkpIHsKKyAgICBzaGFkb3dzID0gdG1wOworICAgIERFQlVHKCJEYXRlbiBhdXMgTUVNT1JZIGdlbGFkZW4uXG4iKTsKKyAgfQorICBlbHNlIHsKKyAgICBERUJVRygiS2VpbmUgRGF0ZW4gaW4gTUVNT1JZIHZvcmhhbmRlbiAtIHJlaW5pdGlhbGlzaWVyZS5cbiIpOworICAgIGlmIChNRU1PUlktPlNhdmUoIlNjaGF0dGVuIiwgc2hhZG93cykgIT0gMSkKKyAgICAgIHJhaXNlX2Vycm9yKCJLb25udGUgRGF0ZW4gbmljaHQgaW0gTWVtb3J5IGFibGVnZW4uXG4iKTsKKyAgfQorfQorCisvKiogTGllZmVydCBlaW5lbiBTdHJpbmcgbWl0IGFsbGVuIFNjaGF0dGVuIHVuZCBiZXNjaGF0dGV0ZW4gT2JqZWt0ZW4genVydWVjay4KKyAgKiBAcmV0dXJuIHN0cmluZyAtIExpc3RlIHZvbiBTY2hhdHRlbiB1bmQgT3BmZXJuCisgICovCitwdWJsaWMgdm9pZCBEdW1wU2hhZG93cygpIHsKKyAgaWYgKGV4dGVybl9jYWxsKCkgJiYgIUVMREVSX1NFQ1VSSVRZICkgcmV0dXJuIDA7CisKKyAgc3RyaW5nIHJlcyA9ICIiOworICBmb3JlYWNoKG9iamVjdCBzY2hhdHRlbiwgb2JqZWN0IG9wZmVyOiBzaGFkb3dzKQorICAgIGlmIChzY2hhdHRlbiAmJiBvcGZlcikKKyAgICAgIHJlcyArPSBzcHJpbnRmKCIlTyAtPiAlT1xuIixzY2hhdHRlbixvcGZlcik7CisKKyAgcHJpbnRmKCJGb2xnZW5kZSBTaGFkb3dzIHNpbmQgYmVrYW5udDogXG5cbiVzXG4iLCByZXMpOworfQorCisvKiogRmluZGV0IHp1IGVpbmVtIGJlc2NoYXR0ZXRlbiBPYmpla3QgZGVuIHp1Z2Vob2VyaWdlbiBTY2hhdHRlbi4KKyAgQHBhcmFtW2luXSBvYmplY3QgLSBlaW4gYmVzY2hhdHRldGVzIE9iamVrdC4KKyAgQHJldHVybiBvYmplY3QgLSBEZW4gU2NoYXR0ZW4gb2RlciAwLgorICBAc2EgRmluZFNoYWRvd3NPYmplY3QoKSwgUXVlcnlPYmplY3QoKSwgUXVlcnlJbmZvKCkKKyovCitwdWJsaWMgb2JqZWN0IEZpbmRTaGFkb3cob2JqZWN0IG9wZmVyKSB7CisgIGlmICghb2JqZWN0cChvcGZlcikpCisgICAgcmV0dXJuIDA7CisKKyAgZm9yZWFjaChvYmplY3Qgc2NoYXR0ZW4sIG9iamVjdCB2aWN0aW06IHNoYWRvd3MpIHsKKyAgICBpZiAob3BmZXIgPT0gdmljdGltKQorICAgICAgLy8gU2NoYXR0ZW4gZ2VmdW5kZW4uCisgICAgICByZXR1cm4gc2NoYXR0ZW47CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8qKiBGaW5kZXQgenUgZWluZW0gU2NoYXR0ZW4gZGFzIGJlc2NoYXR0ZXRlIE9iamVrdC4KKyAgQHBhcmFtW2luXSBvYmplY3QgLSBlaW4gYmVzY2hhdHRlbmRlcyBPYmpla3QuCisgIEByZXR1cm4gb2JqZWN0IC0gRGFzIGJlc2NoYXR0ZXRlIE9iamVrdCBvZGVyIDAuCisgIEBzYSBGaW5kU2hhZG93KCksIFF1ZXJ5T2JqZWN0KCksIFF1ZXJ5SW5mbygpCisqLworcHVibGljIG9iamVjdCBGaW5kU2hhZG93ZWRPYmplY3Qob2JqZWN0IHNjaGF0dGVuKSB7CisgIHJldHVybiBzaGFkb3dzW3NjaGF0dGVuXTsKK30KKworLyoqIEdpYnQgU2NoYXR0ZW4gdW5kIEJlc2NoYXR0ZXRlbiB6dXJ1ZWNrLCBmYWxscyBvYiBlaW5lcyB2b24gYmVpZGVuIGlzdC4KKyAgSXN0IG9iIGVpbiBTY2hhdHRlbiBvZGVyIGVpbiBiZXNjaGF0dGV0ZXMgT2JqZWt0LCB3aXJkIGVpbiBBcnJheSBhdXMKKyAgT2JqZWt0ZW4gZ2VsaWVmZXJ0LiBIaWVyYmVpIHdlcmRlbiBnZ2YuIGFsbGUgT2JqZWt0ZSBpbiBkZXIKKyAgQmVzY2hhdHR1bmdzaGllcmFyY2hpZSBnZWxpZWZlcnQsIHZvbiBkZXIgb2IgQmVzdGFuZHRlaWwgaXN0LgorICBAcGFyYW1baW5dIG9iamVjdCAtIGVpbiBPYmpla3QuCisgIEByZXR1cm4gb2JqZWN0KiAtICh7YSwgYiwgYywgZH0pIG9kZXIgMC4KKyAgQHNhIEZpbmRTaGFkb3coKSwgRmluZFNoYWRvd2VkT2JqZWN0LCBRdWVyeUluZm8oKQorKi8KK3B1YmxpYyBvYmplY3QqIFF1ZXJ5T2JqZWN0KG9iamVjdCBvYikgeworCisgIGlmICghb2JqZWN0cChvYikpIHJldHVybiAwOworIAorICBvYmplY3QgKnJlcyA9ICh7b2J9KTsKKyAgb2JqZWN0IHNoID0gRmluZFNoYWRvdyhvYik7CisKKyAgd2hpbGUoc2gpIHsKKyAgICAvLyBlcyBnaWJ0IGVpbmVuIFNjaGF0dGVuLCBhbHNvIEtldHRlIG5hY2ggb2JlbiB2ZXJmb2xnZW4uCisgICAgcmVzID0gKHtzaH0pICsgcmVzOworICAgIHNoID0gRmluZFNoYWRvdyhzaCk7CisgIH0KKworICBvYmplY3QgdmljID0gRmluZFNoYWRvd2VkT2JqZWN0KG9iKTsKKyAgd2hpbGUodmljKSB7CisgICAgLy8gZXMgZ2lidCBlaW4gYmVzY2hhdHRldGVzIE9iamVrdCwgS2V0dGUgbmFjaCB1bnRlbiB2ZXJmb2xnZW4uCisgICAgcmVzID0gcmVzICsgKHt2aWN9KTsKKyAgICB2aWMgPSBGaW5kU2hhZG93ZWRPYmplY3QodmljKTsKKyAgfQorCisgIGlmIChzaXplb2YocmVzKSA8IDIpIHsKKyAgICAvLyBPZmZlbmJhciB3aXJkIG9iIHdlZGVyIGJlc2NoYXR0ZXQgbm9jaCBiZXNjaGF0dGV0IHNlbGJlci4KKyAgICAvLyBNb2VnbGljaGVyd2Vpc2Ugd3VyZGUgamVkb2NoIGR1cmNoIHdpbGRlIFplcnN0b2VydW5nIGRpZSBIaWVyYXJjaGllCisgICAgLy8gZ2V0cmVubnQuIEZhbGxzIG9iIG5lbiBTY2hhdHRlbiBpc3QsIGxhZXNzdCBzaWNoIGRhcyByZXBhcmllcmVuLiBGYWxscworICAgIC8vIG9iIGJlc2NoYXR0ZXQgd2lyZCwgaGlsZnQgZWlnZW50bGljaCBudXIgZWluIHJlc2V0KCkuIERlbiBtb2VjaHRlIGljaAorICAgIC8vIGhpZXIgYWJlciBuaWNodCBtYWNoZW4sIHdlaWxzIHUuVS4gdGV1ZXIgc2VpbiBrb2VubnRlLgorICAgIGlmIChxdWVyeV9zaGFkb3dpbmcob2IpKSB7CisgICAgICBzaGFkb3dzW29iXSA9IHF1ZXJ5X3NoYWRvd2luZyhvYik7CisgICAgICAvLyBub2NobWFsLgorICAgICAgcmV0dXJuIFF1ZXJ5T2JqZWN0KG9iKTsKKyAgICB9CisgICAgLy8gc2NoZWluYmFyIG5pY2h0LgorICAgIHJldHVybiAwOworICB9CisKKyAgcmV0dXJuIHJlczsKK30KKworLyoqIEdpYnQgZWluZW4gU3RyaW5nIG1pdCBJbmZvcyB1ZWJlciBvYiB6dXJ1ZWNrLgorICBJc3Qgb2IgZWluIGJlc2NoYXR0ZXRlcyBPYmpla3Qgb2RlciBlaW4gU2NoYXR0ZW4sIHdpcmQgZWluIGJlc2NocmVpYmVuZGVyCisgIFN0cmluZyB6dXJ1ZWNrZ2VsaWVmZXJ0IChzY2hhdHRlbiAtPiBiZXNjaGF0dGV0ZXMgT2JqZWt0KS4gSGllcmJlaSB3aXJkIGdnZi4KKyAgZGllIGdlc2FtdGUgQmVzY2hhdHR1bmdzaGllcmFyY2hpZSBhbmdlZ2ViZW4gKGEgLT4gYiAtPiBjIC0+IGQpLgorICBAcGFyYW1baW5dIG9iamVjdCAtIGVpbiBPYmpla3QuCisgIEByZXR1cm4gc3RyaW5nIC0gU3RyaW5nIG1pdCBJbmZvcyB1ZWJlciBvYi4KKyAgQHNhIEZpbmRTaGFkb3coKSwgRmluZFNoYWRvd2VkT2JqZWN0KCksIFF1ZXJ5T2JqZWN0KCkKKyovCitwdWJsaWMgc3RyaW5nIFF1ZXJ5SW5mbyhvYmplY3Qgb2IpIHsKKyAgb2JqZWN0ICpzaHMgPSBRdWVyeU9iamVjdChvYik7CisgIGlmICghc2hzKSByZXR1cm4gMDsKKworICByZXR1cm4gQ291bnRVcChtYXAoc2hzLCAjJ29iamVjdF9uYW1lKSwgIiAtPiAiLCAiIC0+ICIpOworfQorCisvKiogUmVnaXN0cmllcnQgZWluZW4gU2NoYXR0ZW4gdW5kIHNlaW4gT3BmZXIuCisgIFJlZ2lzdHJpZXJ0IGRlbiBTY2hhdHRlbiB1bmQgc2VpbiBPcGZlci4gU29sbHRlIGF1c3NjaGxpZXNzbGljaCBkdXJjaCBkaWUKKyAgc2ltdWxfZWZ1biBvZGVyIHNwYXJlX3NpbXVsX2Z1biBnZXJ1ZmVuIHdlcmRlbi4KKyAgQHNhIFVucmVnaXN0ZXJTaGFkb3coKQorKi8KK3B1YmxpYyBpbnQgUmVnaXN0ZXJTaGFkb3cob2JqZWN0IHNjaGF0dGVuKSB7CisgIG9iamVjdCBvcGZlcjsKKworICAvL0RFQlVHKHNwcmludGYoIlslT10gJU9cbiIsIHNjaGF0dGVuLCBjYWxsZXJfc3RhY2soKSkpOworCisgIC8vIElyZ2VuZGVpbiBTaWNoZXJoZWl0c2NoZWNrIGlzdCBlaWdlbnRsaWNoIG5pY2h0IG5vZXRpZyBoaWVyLCBkYSBkYXMgT3BmZXIKKyAgLy8gb2huZWhpbiBwZXIgZWZ1biBlcm1pdHRlbHQgd2lyZCB1bmQga2VpbiBFaW50cmFnIGVyZm9sZ3QsIHdlbm4ga2VpbgorICAvLyBiZXNjaGF0dGV0ZXMgT2JqZWt0IHp1IGZpbmRlbiBpc3QuCisKKyAgLy8gZGFzIHZvbiBzY2hhdHRlbiBiZXNjaGF0dGV0ZSBPYmpla3QgZXJtaXR0ZWxuIAorICBpZiAob2JqZWN0cChvcGZlcj1xdWVyeV9zaGFkb3dpbmcoc2NoYXR0ZW4pKSkgeworICAgIGlmIChzaGFkb3dzW3NjaGF0dGVuXSA9PSBvcGZlcikKKyAgICAgIHJldHVybiBTSEFET1dfRVhJU1RTOworCisgICAgLy8gTmV1ZWludHJhZyBvZGVyIGdnZi4gYXVjaCBBZW5kZXJuLgorICAgIHNoYWRvd3Nbc2NoYXR0ZW5dID0gb3BmZXI7CisgICAgLy9ERUJVRyhEdW1wU2hhZG93cygpKTsKKyAgICByZXR1cm4gU0hBRE9XX09LOworICB9CisgIHJldHVybiBTSEFET1dfQUNDRVNTX0RFTklFRDsKK30KKworLyoqIFRyYWVndCBlaW5lbiBTY2hhdHRlbiB3aWVkZXIgYXVzLgorICBEZXIgU2NoYXR0ZW4gd2lyZCB3aWVkZXIgYXVzZ2V0cmFnZW4uIFNvbGx0ZSBhdXNzY2hsaWVzc2xpY2ggZHVyY2ggZGllCisgIHNpbXVsX2VmdW4gb2RlciBzcGFyZV9zaW11bF9mdW4gZ2VydWZlbiB3ZXJkZW4uCisgIFdlcmRlbiBTY2hhdHRlbiBvZGVyIGJlc2NoYXR0ZXRlIE9iamVrdGUgemVyc3RvZXJ0IG9obmUgdm9yaGVyIGRpZQorICBTY2hhdHRpZXJ1bmcgenUgYmVlbmRlbiwgZnVlaHJ0IGRpZXMgenUgSW5rb25zaXN0ZW56ZW4gdW5kIHplcmJyb2NoZW5lbgorICBCZXNjaGF0dHVuZ3NoaWVyYXJjaGllbi4KKyAgQHNhIFJlZ2lzdGVyU2hhZG93KCksIFVucmVnaXN0ZXJPcGZlcigpCisqLworcHVibGljIGludCBVbnJlZ2lzdGVyU2hhZG93KG9iamVjdCBjYWxsZXIpIHsKKyAgb2JqZWN0IHNjaGF0dGVuLCBvcGZlcjsKKworICAvLyBFaW4gU2ljaGVyaGVpdHNjaGVjayBmdWVyIGRlbiBBdWZydWYgaXN0IGVpZ2VudGxpY2ggbmljaHQgbm9ldGlnLCBkYSBlaW4KKyAgLy8gRWludHJhZyBudXIgZW50ZmVybnQgd2lyZCwgd2VubiBkaWUgQmVzY2hhdHR1bmcgbmFjaHdlaXNsaWNoIGJlZW5kZXQKKyAgLy8gd3VyZGUuCisKKyAgLy9ERUJVRyhzcHJpbnRmKCJbJU9dICVPXG4iLCBjYWxsZXIsIGNhbGxlcl9zdGFjaygpKSk7CisgIGlmICghb2JqZWN0cChjYWxsZXIpKSByZXR1cm4gU0hBRE9XX1VOS05PV047CisKKyAgLy8gU2NoYXR0ZW4gdW5kIGJlc2NoYXR0ZXRlbiBhdXMgZGVuIGxva2FsZW4gRGF0ZW4gZXJtaXR0ZWxuLgorICBpZiAobWVtYmVyKHNoYWRvd3MsIGNhbGxlcikpIHsKKyAgICBzY2hhdHRlbiA9IGNhbGxlcjsKKyAgICBvcGZlciA9IHNoYWRvd3Nbc2NoYXR0ZW5dOworICB9CisgIGVsc2UgaWYgKG9iamVjdHAoc2NoYXR0ZW4gPSBGaW5kU2hhZG93KGNhbGxlcikpKSB7CisgICAgb3BmZXIgPSBjYWxsZXI7CisgIH0KKyAgLy8gd2VubiBuaWNodCBiZWthbm50LCBpc3QgamV0enQgZWggRW5kZS4KKyAgaWYgKCFzY2hhdHRlbikgcmV0dXJuIFNIQURPV19VTktOT1dOOworCisgIC8vREVCVUcoc3ByaW50ZigiJU8gLT4gJU8gKCVPLCAlTylcbiIsCisgIC8vICAgICAgc2NoYXR0ZW4sIG9wZmVyLCBjYWxsZXIsIHF1ZXJ5X3NoYWRvd2luZyhzY2hhdHRlbikpKTsKKworICAvLyBTY2hhdHRpZXJ1bmcgd2lya2xpY2ggYmVlbmRldD8gV2VubiBuaWNodCAtPiBFbmRlCisgIGlmIChvcGZlciAmJiBxdWVyeV9zaGFkb3dpbmcoc2NoYXR0ZW4pID09IG9wZmVyKQorICAgIHJldHVybiBTSEFET1dfQUNDRVNTX0RFTklFRDsKKworICAvLyB3YXIgc2NoYXR0ZW4gaW4gZWluZXIgQmVzY2hhdHR1bmdzaGllcmFyY2hpZT8KKyAgb2JqZWN0IHVwID0gRmluZFNoYWRvdyhzY2hhdHRlbik7CisgIGlmICh1cCAmJiBxdWVyeV9zaGFkb3dpbmcodXApID09IG9wZmVyKSB7CisgICAgc2hhZG93c1t1cF0gPSBvcGZlcjsgLy8gS2V0dGUgbmV1IHZlcmxpbmtlbgorICB9CisKKyAgLy8gamV0enQga2FubiBnZWxvZXNjaHQgd2VyZGVuLgorICBtX2RlbGV0ZShzaGFkb3dzLHNjaGF0dGVuKTsKKyAgcmV0dXJuIFNIQURPV19PSzsKK30KKworcHVibGljIGludCBSZXNldEFsbCgpIHsKKyAgaWYgKCFBUkNIX1NFQ1VSSVRZKSByZXR1cm4gU0hBRE9XX0FDQ0VTU19ERU5JRUQ7CisKKyAgREVCVUcoIlJlc2V0QWxsKCkgY2FsbGVkLlxuIik7CisKKyAgc2hhZG93cyA9IChbXSk7CisKKyAgaWYgKE1FTU9SWS0+U2F2ZSgiU2NoYXR0ZW4iLCBzaGFkb3dzKSAhPSAxKQorICAgIHJhaXNlX2Vycm9yKCJLb25udGUgRGF0ZW4gbmljaHQgaW0gTWVtb3J5IGFibGVnZW4uXG4iKTsKKworICByZXR1cm4gU0hBRE9XX09LOworfQorCisvKiogUmFldW10IGRpZSBEYXRlbiB1ZWJlciBkaWUgU2NoYXR0ZW4gYXVmLgorICAgIFplcnN0b2VyZW4gc2ljaCBiZXNjaGF0dGV0ZSBPYmpla3RlLCB3ZXJkZW4gZGllIFNjaGF0dGVuIG5pY2h0CisgICAgYXVzZ2V0cmFnZW4sIGRhaGVyIHdpcmQgZGFzIHZvbiB6ZWl0IHp1IHplaXQgaGllciBnZW1hY2h0LgorKi8KK3B1YmxpYyB2b2lkIHJlc2V0KCkgeworICBmb3JlYWNoKG9iamVjdCBzY2hhdHRlbiwgb2JqZWN0IG9wZmVyOiBzaGFkb3dzKSB7CisgICAgaWYgKCFvYmplY3RwKG9wZmVyKSkgeworICAgICAgLy8gd2FyIHNjaGF0dGVuIGV2dGwuIGluIGVpbmVyIEhpZXJhcmNoaWUgdW5kIGJlc2NoYXR0ZXQgamV0enQgd2FzCisgICAgICAvLyBhbmRlcmVzPworICAgICAgaWYgKHF1ZXJ5X3NoYWRvd2luZyhzY2hhdHRlbikpCisgICAgICAgIHNoYWRvd3Nbc2NoYXR0ZW5dID0gcXVlcnlfc2hhZG93aW5nKHNjaGF0dGVuKTsKKyAgICAgIGVsc2UKKyAgICAgICAgbV9kZWxldGUoc2hhZG93cywgc2NoYXR0ZW4pOworICAgIH0KKyAgfQorfQorCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9SRUFETUUgYi9zZWN1cmUvc2ltdWxfZWZ1bi9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAzNDI5YQotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL1JFQURNRQpAQCAtMCwwICsxLDIwIEBACitzaW11bF9lZnVuIAorLS0tLS0tLS0tLSAKK0RhcyBzaW11bF9lZnVuIE9iamVrdCAvc2VjdXJlL3NpbXVsX2VmdW4vc2ltdWxfZWZ1biBiZW51dHp0IGRpZSBEYXRlaWVuCitpbiAvc2VjdXJlL3NpbXVsX2VmdW4uCitJbSBWZXJ6ZWljaG5pcyAvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUgaXN0IGVpbmUgU2ljaGVyaGVpdHNrb3BpZSB2b24gYWxsZW4gCitEYXRlaWVuIGluIC9zZWN1cmUvc2ltdWxfZWZ1bi4KKworRmFsbHMgL3NlY3VyZS9zaW11bF9lZnVuL3NpbXVsX2VmdW4uYyBuaWNodCBsYWRiYXIgaXN0LCB3aXJkIAorL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NpbXVsX2VmdW4uYyBhbHMgRXJzYXR6IHZlcnN1Y2h0LiBXZW5uIGF1Y2ggZGFzCituaWNodCBsYWRiYXIgaXN0LCBlcmZvbGd0IGVpbiBTaHV0ZG93biBkZXMgTXVkcy4KKworQmVpIEFlbmRlcnVuZ2VuIHNvbGx0ZSBfenVlcnN0XyBkaWUgbm9ybWFsZSBzaW11bCBlZnVuIGVkaXRpZXJ0IHVuZAorYW5zY2hsaWVzc2VuZCB6ZXJzdG9lcnQvZW50bGFkZW4gd2VyZGVuLCB3b3JhdWZoaW4gc2llIGltcGxpeml0IGR1cmNoIGRlbgorRHJpdmVyIHVuZCBNYXN0ZXIgbmV1Z2VsYWRlbiB3aXJkLiBJc3QgZGllcyBlcmZvbGdyZWljaCB1bmQgZGllIG5ldWUKK3NpbXVsX2VmdW4gbGFldWZ0IChlcnN0IGRhbm4hKSBrb3BpZXJ0IG1hbiBkaWUgRGF0ZWllbiBhdXMgCisvc2VjdXJlL3NpbXVsX2VmdW4gbmFjaCAvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUuCisKK0RpZSBEYXRlaWVuIGhpZXIgc2luZCBtaXQgQXVzbmFobWUgZGVyIHNpbXVsX2VmdW4uYyBzZWxic3QgX25pY2h0XyBkYXp1IAorZ2VkYWNodCwgZ2VsYWRlbiB6dSB3ZXJkZW4uCisKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL2NvbW0uYyBiL3NlY3VyZS9zaW11bF9lZnVuL2NvbW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTViODUyCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vY29tbS5jCkBAIC0wLDAgKzEsMTI0IEBACisjaW5jbHVkZSA8bGl2aW5nL2NvbW0uaD4KKworLy8gU2VuZGV0IGFuIGFsbGUgT2JqZWt0ZSBpbiByb29tIHVuZCByb29tIHNlbGJlciBkdXJjaCBBdWZydWYgdm9uCisvLyBSZWNlaXZlTXNnKCkuCit2YXJhcmdzIHZvaWQgc2VuZF9yb29tKG9iamVjdHxzdHJpbmcgcm9vbSwgc3RyaW5nIG1zZywgaW50IG1zZ190eXBlLAorICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbXNnX2FjdGlvbiwgc3RyaW5nIG1zZ19wcmVmaXgsIG9iamVjdCAqZXhjbHVkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0IG9yaWdpbikKK3sKKyAgaWYgKHN0cmluZ3Aocm9vbSkpCisgICAgcm9vbT1sb2FkX29iamVjdChyb29tKTsKKworICBvcmlnaW4gfHw9IHByZXZpb3VzX29iamVjdCgpOworICBvYmplY3QgKmRlc3QgPSBleGNsdWRlID8gYWxsX2ludmVudG9yeShyb29tKSAtIGV4Y2x1ZGUgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsX2ludmVudG9yeShyb29tKTsKKworICBkZXN0LT5SZWNlaXZlTXNnKG1zZywgbXNnX3R5cGUsIG1zZ19hY3Rpb24sIG1zZ19wcmVmaXgsIG9yaWdpbik7Cit9CisKK3N0YXRpYyBpbnQgX3Nob3V0X2ZpbHRlciggb2JqZWN0IG9iLCBzdHJpbmcgcGF0ICkKK3sKKyAgICBzdHJpbmcgKmlnbm9yZTsKKworICAgIGlmICggIWVudmlyb25tZW50KG9iKSApCisgICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gc2l6ZW9mKCByZWdleHAoICh7IG9iamVjdF9uYW1lKCBlbnZpcm9ubWVudChvYikgKSB9KSwgcGF0ICkgKTsKK30KKwordmFyYXJncyB2b2lkIHNob3V0KCBzdHJpbmcgcywgbWl4ZWQgd2hlcmUgKXsKKyAgICBvYmplY3QgKnU7CisgICAgc3RyaW5nICpwZmFkZTsKKworICAgIGlmICggIXNpemVvZiggdSA9IHVzZXJzKCkgLSAoeyB0aGlzX3BsYXllcigpIH0pICkgKQorICAgICAgIHJldHVybjsKKworICAgIGlmICggIXdoZXJlICkKKyAgICAgICBwZmFkZSA9ICh7ICIvIiB9KTsKKyAgICBlbHNlIGlmICggaW50cCh3aGVyZSkgKQorICAgICAgIHBmYWRlID0KKyAgICAgICAgICAgKHsgaW1wbG9kZSggZWZ1bjo6ZXhwbG9kZSggb2JqZWN0X25hbWUoIGVudmlyb25tZW50KHRoaXNfcGxheWVyKCkpICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvIiApWzAuLjJdLCAiLyIgKSArICIvIiB9KTsKKyAgICBlbHNlIGlmICggc3RyaW5ncCh3aGVyZSkgKQorICAgICAgIHBmYWRlID0gKHsgd2hlcmUgfSk7CisgICAgZWxzZQorICAgICAgIHBmYWRlID0gd2hlcmU7CisKKyAgICB1ID0gZmlsdGVyKCB1LCAiX3Nob3V0X2ZpbHRlciIsIE1FLCBpbXBsb2RlKCBwZmFkZSwgInwiICkgKTsKKyAgICB1LT5SZWNlaXZlTXNnKHMsIE1UX0NPTU18TVRfRkFSfE1TR19ET05UX1dSQVB8TVNHX0RPTlRfU1RPUkUsCisgICAgICAgICAgICAgICAgICBNQV9TSE9VVF9TRUZVTiwgMCwgcHJldmlvdXNfb2JqZWN0KCkpOworfQorCisKKyNpZiBfX1ZFUlNJT05fXyA+ICIzLjMuNzE4IgorLy8gVGhpcyBzZWZ1biByZXBsYWNlcyB0aGUgZGVwcmVjYXRlZCBlZnVuIGNhdCgpLgorI2RlZmluZSBDQVRfTUFYX0xJTkVTIDUwCit2YXJhcmdzIGludCBjYXQoc3RyaW5nIGZpbGUsIGludCBzdGFydCwgaW50IG51bSkKK3sKKyAgICBpZiAoZXh0ZXJuX2NhbGwoKSkKKyAgICAgICAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKKworICAgIGludCBtb3JlOworCisgICAgaWYgKG51bSA8IDAgfHwgIXRoaXNfcGxheWVyKCkpCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKCFzdGFydCkKKyAgICAgICAgc3RhcnQgPSAxOworCisgICAgaWYgKCFudW0gfHwgbnVtID4gQ0FUX01BWF9MSU5FUykgeworICAgICAgICBudW0gPSBDQVRfTUFYX0xJTkVTOworICAgICAgICBtb3JlID0gc2l6ZW9mKHJlYWRfZmlsZShmaWxlLCBzdGFydCtudW0sIDEpKTsKKyAgICB9CisKKyAgICBzdHJpbmcgdHh0ID0gcmVhZF9maWxlKGZpbGUsIHN0YXJ0LCBudW0pOworICAgIGlmICghdHh0KQorICAgICAgICByZXR1cm4gMDsKKworICAgIGVmdW46OnRlbGxfb2JqZWN0KHRoaXNfcGxheWVyKCksIHR4dCk7CisKKyAgICBpZiAobW9yZSkKKyAgICAgICAgZWZ1bjo6dGVsbF9vYmplY3QodGhpc19wbGF5ZXIoKSwgIioqKioqVFJVTkNBVEVEKioqKlxuIik7CisKKyAgICByZXR1cm4gc2l6ZW9mKHR4dCAmICJcbiIpOworfQorI3VuZGVmIENBVF9NQVhfTElORVMKKyNlbmRpZiAvLyBfX1ZFUlNJT05fXyA+ICIzLjMuNzE4IgorCisjaWYgX19WRVJTSU9OX18gPiAiMy4zLjcxOSIKKy8vIFRoaXMgc2VmdW4gcmVwbGFjZXMgdGhlIGRlcHJlY2F0ZWQgZWZ1biB0YWlsKCkuCisjZGVmaW5lIFRBSUxfTUFYX0JZVEVTIDEwMDAKK3ZhcmFyZ3MgaW50IHRhaWwoc3RyaW5nIGZpbGUpCit7CisgICAgaWYgKGV4dGVybl9jYWxsKCkpCisgICAgICAgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CisKKyAgICBpZiAoIXN0cmluZ3AoZmlsZSkgfHwgIXRoaXNfcGxheWVyKCkpCisgICAgICAgIHJldHVybiAwOworCisgICAgc3RyaW5nIHR4dCA9IHJlYWRfYnl0ZXMoZmlsZSwgLShUQUlMX01BWF9CWVRFUyArIDgwKSwgKFRBSUxfTUFYX0JZVEVTICsgODApKTsKKyAgICAvLyByZWFkX2J5dGVzKCkgcmV0dXJucyAwIGlmIHRoZSBzdGFydCBvZiB0aGUgc2VjdGlvbiBnaXZlbiBieQorICAgIC8vIHBhcmFtZXRlciAjMiBsaWVzIGJleW9uZCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlLgorICAgIC8vIEluIHRoaXMgY2FzZSB3ZSBzaW1wbHkgdHJ5IGFuZCByZWFkIHRoZSBlbnRpcmUgZmlsZS4KKyAgICBpZiAoIXN0cmluZ3AodHh0KSAmJiBmaWxlX3NpemUoZmlsZSkgPCBUQUlMX01BWF9CWVRFUys4MCkKKyAgICAgIHR4dCA9IHJlYWRfZmlsZShmaWxlKTsKKyAgICAvLyBFeGl0IGlmIHN0aWxsIG5vdGhpbmcgY291bGQgYmUgcmVhZC4KKyAgICBpZiAoIXN0cmluZ3AodHh0KSkKKyAgICAgIHJldHVybiAwOworCisgICAgLy8gY3V0IG9mZiBmaXJzdCAoaW5jb21wbGV0ZSkgbGluZQorICAgIGludCBpbmRleCA9IHN0cnN0cih0eHQsICJcbiIpOworICAgIGlmIChpbmRleCA+IC0xKSB7CisgICAgICAgIGlmIChpbmRleCArIDEgPCBzaXplb2YodHh0KSkKKyAgICAgICAgICAgIHR4dCA9IHR4dFtpbmRleCsxLi5dOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0eHQgPSAiIjsKKyAgICB9CisKKyAgICBlZnVuOjp0ZWxsX29iamVjdCh0aGlzX3BsYXllcigpLCB0eHQpOworCisgICAgcmV0dXJuIDE7Cit9CisjdW5kZWYgVEFJTF9NQVhfQllURVMKKyNlbmRpZiAvLyBfX1ZFUlNJT05fXyA+ICIzLjMuNzE5IgorCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9kZWJ1Z19pbmZvLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9kZWJ1Z19pbmZvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDYwN2MyZgotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL2RlYnVnX2luZm8uYwpAQCAtMCwwICsxLDQzNCBAQAorLyogVGhpcyBzZWZ1biBpcyB0byBwcm92aWRlIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBlZnVuIGRlYnVnX2luZm8oKS4KKyAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgorICovCisKKyNpZiAhIF9fRUZVTl9ERUZJTkVEX18oZGVidWdfaW5mbykKKworI2luY2x1ZGUgPGRyaXZlcl9pbmZvLmg+CisjaW5jbHVkZSA8ZGVidWdfaW5mby5oPgorCittaXhlZCBkZWJ1Z19pbmZvKGludCB3aGF0LCB2YXJhcmdzIG1peGVkKiBhcmdzKQoreworICAgIGlmIChzaXplb2YoYXJncykgPiAyKQorICAgICAgICByYWlzZV9lcnJvcigiVG9vIG1hbnkgYXJndW1lbnRzIHRvIGRlYnVnX2luZm9cbiIpOworCisgICAgc3dpdGNoKHdoYXQpCisgICAgeworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigiSWxsZWdhbCB2YWx1ZSAlZCBmb3IgZGVidWdfaW5mbygpLlxuIiwgd2hhdCkpOworCisgICAgICAgIGNhc2UgRElORk9fT0JKRUNUOgorICAgICAgICB7CisgICAgICAgICAgICBvYmplY3Qgb2I7CisKKyAgICAgICAgICAgIGlmIChzaXplb2YoYXJncykgIT0gMSkKKyAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFkIG51bWJlciBvZiBhcmd1bWVudHMgdG8gZGVidWdfaW5mb1xuIik7CisgICAgICAgICAgICBpZiAoIW9iamVjdHAoYXJnc1swXSkpCisgICAgICAgICAgICAgICAgcmFpc2VfZXJyb3IoImJhZyBhcmcgMiB0byBkZWJ1Z19pbmZvKCkuXG4iKTsKKworICAgICAgICAgICAgb2IgPSBhcmdzWzBdOworICAgICAgICAgICAgcHJpbnRmKCJPX0hFQVJUX0JFQVQgICAgICA6ICVzXG4iLCBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0NfSEVBUlRfQkVBVCkgICAgICAgPyAiVFJVRSIgOiAiRkFMU0UiKTsKKyAgICAgICAgICAgIHByaW50ZigiT19FTkFCTEVfQ09NTUFORFMgOiAlc1xuIiwgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9DX0NPTU1BTkRTX0VOQUJMRUQpID8gIlRSVUUiIDogIkZBTFNFIik7CisgICAgICAgICAgICBwcmludGYoIk9fQ0xPTkUgICAgICAgICAgIDogJXNcbiIsIGVmdW46OmNsb25lcChvYikgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICJUUlVFIiA6ICJGQUxTRSIpOworICAgICAgICAgICAgcHJpbnRmKCJPX0RFU1RSVUNURUQgICAgICA6IEZBTFNFXG4iKTsKKyAgICAgICAgICAgIHByaW50ZigiT19TV0FQUEVEICAgICAgICAgOiAlc1xuIiwgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NXQVBQRUQpICAgICAgICAgID8gIlRSVUUiIDogIkZBTFNFIik7CisgICAgICAgICAgICBwcmludGYoIk9fT05DRV9JTlRFUkFDVElWRTogJXNcbiIsIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9PTkNFX0lOVEVSQUNUSVZFKSA/ICJUUlVFIiA6ICJGQUxTRSIpOworICAgICAgICAgICAgcHJpbnRmKCJPX1JFU0VUX1NUQVRFICAgICA6ICVzXG4iLCBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfUkVTRVRfU1RBVEUpICAgICAgPyAiVFJVRSIgOiAiRkFMU0UiKTsKKyAgICAgICAgICAgIHByaW50ZigiT19XSUxMX0NMRUFOX1VQICAgOiAlc1xuIiwgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1dJTExfQ0xFQU5fVVApICAgID8gIlRSVUUiIDogIkZBTFNFIik7CisgICAgICAgICAgICBwcmludGYoIk9fUkVQTEFDRUQgICAgICAgIDogJXNcbiIsIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9SRVBMQUNFRCkgICAgICAgICA/ICJUUlVFIiA6ICJGQUxTRSIpOworICAgICAgICAgICAgcHJpbnRmKCJ0aW1lX3Jlc2V0ICA6ICVkXG4iLCAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTkVYVF9SRVNFVF9USU1FKSk7CisgICAgICAgICAgICBwcmludGYoInRpbWVfb2ZfcmVmIDogJWRcbiIsICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9MQVNUX1JFRl9USU1FKSk7CisgICAgICAgICAgICBwcmludGYoInJlZiAgICAgICAgIDogJWRcbiIsICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9PQkpFQ1RfUkVGUykpOworCisgICAgICAgICAgICBpbnQgZ3RpY2tzID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX0dJR0FUSUNLUyk7CisgICAgICAgICAgICBpZihndGlja3MpCisgICAgICAgICAgICAgICAgcHJpbnRmKCJldmFsY29zdCAgIDogICVkJTA5ZFxuIiwgZ3RpY2tzLCBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfVElDS1MpKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBwcmludGYoImV2YWxjb3N0ICAgOiAgJWRcbiIsICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1RJQ0tTKSk7CisKKyAgICAgICAgICAgIHByaW50Zigic3dhcF9udW0gICAgOiAlZFxuIiwgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NXQVBfTlVNKSk7CisgICAgICAgICAgICBwcmludGYoIm5hbWUgICAgICAgIDogJyVzJ1xuIiwgICAgIGVmdW46Om9iamVjdF9uYW1lKG9iKSk7CisgICAgICAgICAgICBwcmludGYoImxvYWRfbmFtZSAgIDogJyVzJ1xuIiwgICAgIGVmdW46OmxvYWRfbmFtZShvYikpOworCisgICAgICAgICAgICBvYmplY3QgbmV4dF9vYiA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9PQkpFQ1RfTkVYVCk7CisgICAgICAgICAgICBpZiAobmV4dF9vYikKKyAgICAgICAgICAgICAgICBwcmludGYoIm5leHRfYWxsICAgIDogT0JKKCVzKVxuIiwgZWZ1bjo6b2JqZWN0X25hbWUobmV4dF9vYikpOworCisgICAgICAgICAgICBvYmplY3QgcHJldl9vYiA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9PQkpFQ1RfUFJFVik7CisgICAgICAgICAgICBpZiAocHJldl9vYikKKyAgICAgICAgICAgICAgICBwcmludGYoIlByZXZpb3VzIG9iamVjdCBpbiBvYmplY3QgbGlzdDogT0JKKCVzKVxuIiwgZWZ1bjo6b2JqZWN0X25hbWUocHJldl9vYikpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHByaW50ZigiVGhpcyBvYmplY3QgaXMgdGhlIGhlYWQgb2YgdGhlIG9iamVjdCBsaXN0LlxuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgRElORk9fTUVNT1JZOgorICAgICAgICB7CisgICAgICAgICAgICBvYmplY3Qgb2I7CisKKyAgICAgICAgICAgIGlmIChzaXplb2YoYXJncykgIT0gMSkKKyAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFkIG51bWJlciBvZiBhcmd1bWVudHMgdG8gZGVidWdfaW5mb1xuIik7CisgICAgICAgICAgICBpZiAoIW9iamVjdHAoYXJnc1swXSkpCisgICAgICAgICAgICAgICAgcmFpc2VfZXJyb3IoImJhZyBhcmcgMiB0byBkZWJ1Z19pbmZvKCkuXG4iKTsKKworICAgICAgICAgICAgb2IgPSBhcmdzWzBdOworCisgICAgICAgICAgICBwcmludGYoInByb2dyYW0gcmVmJ3MgJTNkXG4iLCAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9QUk9HX1JFRlMpKTsKKyAgICAgICAgICAgIHByaW50ZigiTmFtZTogJyVzJ1xuIiwgICAgICAgICAgZWZ1bjo6cHJvZ3JhbV9uYW1lKG9iKSk7CisgICAgICAgICAgICBwcmludGYoInByb2dyYW0gc2l6ZSAgICAlNmRcbiIsIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9QUk9HX1NJWkUpKTsKKyAgICAgICAgICAgIHByaW50ZigibnVtIGZ1bmMnczogICUzZCAoJTRkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05VTV9GVU5DVElPTlMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0laRV9GVU5DVElPTlMpKTsKKyAgICAgICAgICAgIHByaW50ZigibnVtIHZhcnM6ICAgICUzZCAoJTRkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05VTV9WQVJJQUJMRVMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0laRV9WQVJJQUJMRVMpKTsKKworICAgICAgICAgICAgcHJpbnRmKCJudW0gc3RyaW5nczogJTNkICglNGQpIDogb3ZlcmhlYWQgJWQgKyBkYXRhICVkICglZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9OVU1fU1RSSU5HUyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSVpFX1NUUklOR1MpICsgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NJWkVfU1RSSU5HU19EQVRBKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NJWkVfU1RSSU5HUyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSVpFX1NUUklOR1NfREFUQSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSVpFX1NUUklOR1NfREFUQV9UT1RBTCkpOworCisgICAgICAgICAgICBwcmludGYoIm51bSBpbmhlcml0cyAlM2QgKCU0ZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9OVU1fSU5IRVJJVEVEKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NJWkVfSU5IRVJJVEVEKSk7CisKKyAgICAgICAgICAgIHByaW50ZigidG90YWwgc2l6ZSAgICAgICU2ZFxuIiwgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1BST0dfU0laRV9UT1RBTCkpOworCisgICAgICAgICAgICBwcmludGYoImRhdGEgc2l6ZSAgICAgICAlNmQgKCU2ZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX0RBVEFfU0laRSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9EQVRBX1NJWkVfVE9UQUwpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBESU5GT19PQkpMSVNUOgorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc2l6ZW9mKGFyZ3MpID09IDApCisgICAgICAgICAgICAgICAgcmFpc2VfZXJyb3IoImJhZCBudW1iZXIgb2YgYXJndW1lbnRzIHRvIGRlYnVnX2luZm9cbiIpOworCisgICAgICAgICAgICBpZiAoc2l6ZW9mKGFyZ3MpID09IDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb2JqZWN0ICogb2JzID0gZWZ1bjo6b2JqZWN0cyhhcmdzWzBdLCAxKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gb2JzWzBdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBlZnVuOjpvYmplY3RzKGFyZ3NbMF0sIGFyZ3NbMV0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIERJTkZPX01BTExPQzoKKyAgICAgICAgICAgIHdyaXRlKGRlYnVnX2luZm8oRElORk9fU1RBVFVTLCAibWFsbG9jIikpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBESU5GT19TVEFUVVM6CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZyB3aGljaDsKKyAgICAgICAgICAgIGludCBvcHQ7CisKKyAgICAgICAgICAgIGlmIChzaXplb2YoYXJncykgPiAxKQorICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKCJiYWQgbnVtYmVyIG9mIGFyZ3VtZW50cyB0byBkZWJ1Z19pbmZvXG4iKTsKKworICAgICAgICAgICAgaWYgKCFzaXplb2YoYXJncykgfHwgIWFyZ3NbMF0pCisgICAgICAgICAgICAgICAgd2hpY2ggPSAiIjsKKyAgICAgICAgICAgIGVsc2UgaWYoc3RyaW5ncChhcmdzWzBdKSkKKyAgICAgICAgICAgICAgICB3aGljaCA9IGFyZ3NbMF07CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmFpc2VfZXJyb3IoImJhZyBhcmcgMiB0byBkZWJ1Z19pbmZvKCkuXG4iKTsKKworICAgICAgICAgICAgc3dpdGNoKHdoaWNoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgIiI6CisgICAgICAgICAgICAgICAgICAgIG9wdCA9IERJX1NUQVRVU19URVhUX01FTU9SWTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlICJ0YWJsZXMiOgorICAgICAgICAgICAgICAgICAgICBvcHQgPSBESV9TVEFUVVNfVEVYVF9UQUJMRVM7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAic3dhcCI6CisgICAgICAgICAgICAgICAgICAgIG9wdCA9IERJX1NUQVRVU19URVhUX1NXQVA7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAibWFsbG9jIjoKKyAgICAgICAgICAgICAgICAgICAgb3B0ID0gRElfU1RBVFVTX1RFWFRfTUFMTE9DOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgIm1hbGxvYyBleHRzdGF0cyI6CisgICAgICAgICAgICAgICAgICAgIG9wdCA9IERJX1NUQVRVU19URVhUX01BTExPQ19FWFRFTkRFRDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGVmdW46OmRyaXZlcl9pbmZvKG9wdCk7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIERJTkZPX0RVTVA6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBvcHQ7CisKKyAgICAgICAgICAgIGlmICghc2l6ZW9mKGFyZ3MpKQorICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKCJiYWQgbnVtYmVyIG9mIGFyZ3VtZW50cyB0byBkZWJ1Z19pbmZvXG4iKTsKKworICAgICAgICAgICAgaWYoIXN0cmluZ3AoYXJnc1swXSkpCisgICAgICAgICAgICAgICAgcmFpc2VfZXJyb3IoImJhZyBhcmcgMiB0byBkZWJ1Z19pbmZvKCkuXG4iKTsKKworICAgICAgICAgICAgc3dpdGNoKGFyZ3NbMF0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAib2JqZWN0cyI6CisgICAgICAgICAgICAgICAgICAgIG9wdCA9IERESV9PQkpFQ1RTOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgImRlc3RydWN0ZWQiOgorICAgICAgICAgICAgICAgICAgICBvcHQgPSBERElfT0JKRUNUU19ERVNUUlVDVEVEOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgIm9wY29kZXMiOgorICAgICAgICAgICAgICAgICAgICBvcHQgPSBERElfT1BDT0RFUzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlICJtZW1vcnkiOgorICAgICAgICAgICAgICAgICAgICBvcHQgPSBERElfTUVNT1JZOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoIkJhZCBhcmd1bWVudCAnJXMnIHRvIGRlYnVnX2luZm8oRElORk9fRFVNUCkuXG4iLCBhcmdzWzBdKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gZWZ1bjo6ZHVtcF9kcml2ZXJfaW5mbyhvcHQsIGFyZ3NbMS4uMV0uLi4pOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBESU5GT19EQVRBOgorICAgICAgICB7CisgICAgICAgICAgICBtaXhlZCAqIHJlc3VsdDsKKworICAgICAgICAgICAgaWYgKCFzaXplb2YoYXJncykpCisgICAgICAgICAgICAgICAgcmFpc2VfZXJyb3IoImJhZCBudW1iZXIgb2YgYXJndW1lbnRzIHRvIGRlYnVnX2luZm9cbiIpOworCisgICAgICAgICAgICBpZiAoIWludHAoYXJnc1swXSkpCisgICAgICAgICAgICAgICAgcmFpc2VfZXJyb3IoImJhZyBhcmcgMiB0byBkZWJ1Z19pbmZvKCkuXG4iKTsKKworICAgICAgICAgICAgaWYgKHNpemVvZihhcmdzKSA9PSAyICYmICFpbnRwKGFyZ3NbMV0pKQorICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKCJiYWcgYXJnIDMgdG8gZGVidWdfaW5mbygpLlxuIik7CisKKyAgICAgICAgICAgIHN3aXRjaChhcmdzWzBdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgRElEX1NUQVRVUzoKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gYWxsb2NhdGUoRElEX1NUQVRVU19NQVgpOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfQUNUSU9OU10gICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9BQ1RJT05TKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9BQ1RJT05TX1NJWkVdICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9BQ1RJT05TKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TSEFET1dTXSAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NIQURPV1MpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NIQURPV1NfU0laRV0gICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NIQURPV1MpOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfT0JKRUNUU10gICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9PQkpFQ1RTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9PQkpFQ1RTX1NJWkVdICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9PQkpFQ1RTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9PQkpFQ1RTX1NXQVBQRURdICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX09CSkVDVFNfU1dBUFBFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfT0JKRUNUU19TV0FQX1NJWkVdICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfT0JKRUNUU19TV0FQUEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9PQkpFQ1RTX0xJU1RdICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX09CSkVDVFNfSU5fTElTVCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfT0JKRUNUU19ORVdMWV9ERVNUXSAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9PQkpFQ1RTX05FV0xZX0RFU1RSVUNURUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX09CSkVDVFNfREVTVFJVQ1RFRF0gICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fT0JKRUNUU19ERVNUUlVDVEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9PQkpFQ1RTX1BST0NFU1NFRF0gICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX09CSkVDVFNfTEFTVF9QUk9DRVNTRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX09CSkVDVFNfQVZHX1BST0NdICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9MT0FEX0FWRVJBR0VfUFJPQ0VTU0VEX09CSkVDVFNfUkVMQVRJVkUpOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfT1RBQkxFXSAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9PQkpFQ1RTX0lOX1RBQkxFKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9PVEFCTEVfU0xPVFNdICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX09CSkVDVF9UQUJMRV9TTE9UUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfT1RBQkxFX1NJWkVdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfT0JKRUNUX1RBQkxFKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0hCRUFUX09CSlNdICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fSEVBUlRCRUFUUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfSEJFQVRfQ0FMTFNdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9IRUFSVEJFQVRfQUNUSVZFX0NZQ0xFUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfSEJFQVRfQ0FMTFNfVE9UQUxdICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9IRUFSVEJFQVRfVE9UQUxfQ1lDTEVTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9IQkVBVF9TTE9UU10gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0hFQVJUQkVBVFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0hCRUFUX1NJWkVdICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX0hFQVJUQkVBVFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0hCRUFUX1BST0NFU1NFRF0gICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fSEVBUlRCRUFUU19MQVNUX1BST0NFU1NFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfSEJFQVRfQVZHX1BST0NdICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX0xPQURfQVZFUkFHRV9QUk9DRVNTRURfSEVBUlRCRUFUU19SRUxBVElWRSk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9DQUxMT1VUU10gICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0NBTExPVVRTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9DQUxMT1VUX1NJWkVdICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9DQUxMT1VUUyk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9BUlJBWVNdICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0FSUkFZUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfQVJSQVlTX1NJWkVdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfQVJSQVlTKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX01BUFBJTkdTXSAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fTUFQUElOR1MpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX01BUFBJTkdTX1NJWkVdICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX01BUFBJTkdTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9IWUJSSURfTUFQUElOR1NdICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX01BUFBJTkdTX0hZQlJJRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfSEFTSF9NQVBQSU5HU10gICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9NQVBQSU5HU19IQVNIKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUlVDVFNdICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1RSVUNUUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSVUNUU19TSVpFXSAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU1RSVUNUUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSVUNUX1RZUEVTXSAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TVFJVQ1RfVFlQRVMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUlVDVF9UWVBFU19TSVpFXSAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NUUlVDVF9UWVBFUyk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9QUk9HU10gICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1BST0dTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9QUk9HU19TSVpFXSAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9QUk9HUyk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9QUk9HU19TV0FQUEVEXSAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1BST0dTX1NXQVBQRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1BST0dTX1NXQVBfU0laRV0gICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1BST0dTX1NXQVBQRUQpOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfVVNFUl9SRVNFUlZFXSAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX01FTU9SWV9SRVNFUlZFX1VTRVIpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX01BU1RFUl9SRVNFUlZFXSAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9NRU1PUllfUkVTRVJWRV9NQVNURVIpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NZU1RFTV9SRVNFUlZFXSAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9NRU1PUllfUkVTRVJWRV9TWVNURU0pOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfQUREX01FU1NBR0VdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9NRVNTQUdFU19PVVQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1BBQ0tFVFNdICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fUEFDS0VUU19PVVQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1BBQ0tFVF9TSVpFXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1BBQ0tFVFNfT1VUKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9QQUNLRVRTX0lOXSAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1BBQ0tFVFNfSU4pOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1BBQ0tFVF9TSVpFX0lOXSAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1BBQ0tFVFNfSU4pOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfQVBQTFldICAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9GVU5DVElPTl9OQU1FX0NBTExTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9BUFBMWV9ISVRTXSAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0ZVTkNUSU9OX05BTUVfQ0FMTF9ISVRTKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUklOR1NdICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fVklSVFVBTF9TVFJJTkdTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJJTkdfU0laRV0gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TVFJJTkdTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJfVEFCTEVfU0laRV0gICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TVFJJTkdfVEFCTEUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUl9PVkVSSEVBRF0gICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NUUklOR19PVkVSSEVBRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfVU5UQUJMRURdICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TVFJJTkdTX1VOVEFCTEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9VTlRBQkxFRF9TSVpFXSAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TVFJJTkdTX1VOVEFCTEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9UQUJMRURdICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NUUklOR1NfVEFCTEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9UQUJMRURfU0laRV0gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TVFJJTkdTX1RBQkxFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSX1NFQVJDSEVTXSAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TVFJJTkdfVEFCTEVfTE9PS1VQU19CWV9JTkRFWCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSX1NFQVJDSExFTl0gICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TVFJJTkdfVEFCTEVfTE9PS1VQX1NURVBTX0JZX0lOREVYKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJfU0VBUkNIRVNfQllWQUxVRV0gID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NUUklOR19UQUJMRV9MT09LVVBTX0JZX1ZBTFVFKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJfU0VBUkNITEVOX0JZVkFMVUVdID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NUUklOR19UQUJMRV9MT09LVVBfU1RFUFNfQllfVkFMVUUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUl9DSEFJTlNdICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1RSSU5HX1RBQkxFX1NMT1RTX1VTRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUl9BRERFRF0gICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1RSSU5HX1RBQkxFX1NUUklOR1NfQURERUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUl9ERUxFVEVEXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1RSSU5HX1RBQkxFX1NUUklOR1NfUkVNT1ZFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSX0NPTExJU0lPTlNdICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TVFJJTkdfVEFCTEVfQ09MTElTSU9OUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSX0ZPVU5EXSAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TVFJJTkdfVEFCTEVfSElUU19CWV9JTkRFWCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSX0ZPVU5EX0JZVkFMVUVdICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TVFJJTkdfVEFCTEVfSElUU19CWV9WQUxVRSk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9SWF9DQUNIRURdICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1JFR0VYKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9SWF9UQUJMRV0gICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1JFR0VYX1RBQkxFX1NMT1RTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9SWF9UQUJMRV9TSVpFXSAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9SRUdFWCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfUlhfUkVRVUVTVFNdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9SRUdFWF9MT09LVVBTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9SWF9SRVFfRk9VTkRdICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1JFR0VYX0xPT0tVUF9ISVRTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9SWF9SRVFfQ09MTF0gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1JFR0VYX0xPT0tVUF9DT0xMSVNJT05TKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX01CX0ZJTEVdICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX0JVRkZFUl9GSUxFKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9NQl9TV0FQXSAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9CVUZGRVJfU1dBUCk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9CT09UX1RJTUVdICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfQk9PVF9USU1FKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIERJRF9TV0FQOgorICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBhbGxvY2F0ZShESURfU1dBUF9NQVgpOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfUFJPR1NdICAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9QUk9HU19TV0FQUEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19QUk9HX1NJWkVdICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9QUk9HU19TV0FQUEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19QUk9HX1VOU1dBUFBFRF0gICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1BST0dTX1VOU1dBUFBFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfUFJPR19VX1NJWkVdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfUFJPR1NfVU5TV0FQUEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19WQVJTXSAgICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX09CSkVDVFNfU1dBUFBFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfVkFSX1NJWkVdICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfT0JKRUNUU19TV0FQUEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19GUkVFXSAgICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NXQVBfQkxPQ0tTX0ZSRUUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX0ZSRUVfU0laRV0gICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NXQVBfQkxPQ0tTX0ZSRUUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX0ZJTEVfU0laRV0gICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NXQVBfQkxPQ0tTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19SRVVTRURdICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TV0FQX0JMT0NLU19SRVVTRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX1NFQVJDSEVTXSAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1dBUF9CTE9DS1NfUkVVU0VfTE9PS1VQUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfU0VBUkNIX0xFTl0gICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TV0FQX0JMT0NLU19SRVVTRV9MT09LVVBfU1RFUFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX0ZfU0VBUkNIRVNdICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1dBUF9CTE9DS1NfRlJFRV9MT09LVVBTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19GX1NFQVJDSF9MRU5dICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NXQVBfQkxPQ0tTX0ZSRUVfTE9PS1VQX1NURVBTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19DT01QQUNUXSAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRENfU1dBUF9DT01QQUNUX01PREUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX1JFQ1lDTEVfRlJFRV0gICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TV0FQX1JFQ1lDTEVfUEhBU0UpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgRElEX01FTU9SWToKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gYWxsb2NhdGUoRElEX01FTU9SWV9NQVgpOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX05BTUVdICAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX01FTU9SWV9BTExPQ0FUT1JfTkFNRSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX1NCUktdICAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TWVNfQUxMT0NBVEVEX0JMT0NLUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX1NCUktfU0laRV0gICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU1lTX0FMTE9DQVRFRF9CTE9DS1MpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9MQVJHRV0gICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fTEFSR0VfQkxPQ0tTX0FMTE9DQVRFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0xBUkdFX1NJWkVdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfTEFSR0VfQkxPQ0tTX0FMTE9DQVRFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0xGUkVFXSAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9MQVJHRV9CTE9DS1NfRlJFRSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0xGUkVFX1NJWkVdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfTEFSR0VfQkxPQ0tTX0ZSRUUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9MV0FTVEVEXSAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fTEFSR0VfQkxPQ0tTX1dBU1RFKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fTFdBU1RFRF9TSVpFXSAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9MQVJHRV9CTE9DS1NfV0FTVEUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9DSFVOS10gICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU01BTExfQkxPQ0tfQ0hVTktTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fQ0hVTktfU0laRV0gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TTUFMTF9CTE9DS19DSFVOS1MpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9TTUFMTF0gICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU01BTExfQkxPQ0tTX0FMTE9DQVRFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX1NNQUxMX1NJWkVdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU01BTExfQkxPQ0tTX0FMTE9DQVRFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX1NGUkVFXSAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TTUFMTF9CTE9DS1NfRlJFRSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX1NGUkVFX1NJWkVdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU01BTExfQkxPQ0tTX0ZSRUUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9TV0FTVEVEXSAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU01BTExfQkxPQ0tTX1dBU1RFKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fU1dBU1RFRF9TSVpFXSAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TTUFMTF9CTE9DS1NfV0FTVEUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9NSU5DX0NBTExTXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fSU5DUkVNRU5UX1NJWkVfQ0FMTFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9NSU5DX1NVQ0NFU1NdICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fSU5DUkVNRU5UX1NJWkVfQ0FMTF9TVUNDRVNTRVMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9NSU5DX1NJWkVdICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX0lOQ1JFTUVOVF9TSVpFX0NBTExfRElGRlMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9QRVJNXSAgICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fVU5NQU5BR0VEX0JMT0NLUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX1BFUk1fU0laRV0gICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfVU5NQU5BR0VEX0JMT0NLUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0NMSUJdICAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9SRVBMQUNFTUVOVF9NQUxMT0NfQ0FMTFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9DTElCX1NJWkVdICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1JFUExBQ0VNRU5UX01BTExPQ19DQUxMUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX09WRVJIRUFEXSAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU01BTExfQkxPQ0tfT1ZFUkhFQUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9BTExPQ0FURURdICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX01FTU9SWV9VU0VEKSArIGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfTUVNT1JZX09WRVJIRUFEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fVVNFRF0gICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9NRU1PUllfVVNFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX1RPVEFMX1VOVVNFRF0gICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfTUVNT1JZX1VOVVNFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0RFRlJBR19DQUxMU10gICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9NRU1PUllfREVGUkFHTUVOVEFUSU9OX0NBTExTX0ZVTEwpICsgZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX01FTU9SWV9ERUZSQUdNRU5UQVRJT05fQ0FMTFNfVEFSR0VURUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9ERUZSQUdfQ0FMTFNfUkVRXSAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fTUVNT1JZX0RFRlJBR01FTlRBVElPTl9DQUxMU19UQVJHRVRFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0RFRlJBR19SRVFfU1VDQ0VTU10gICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9NRU1PUllfREVGUkFHTUVOVEFUSU9OX0NBTExfVEFSR0VUX0hJVFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9ERUZSQUdfQkxPQ0tTX0lOU1BFQ1RFRF0gPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fTUVNT1JZX0RFRlJBR01FTlRBVElPTl9CTE9DS1NfSU5TUEVDVEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fREVGUkFHX0JMT0NLU19NRVJHRURdID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX01FTU9SWV9ERUZSQUdNRU5UQVRJT05fQkxPQ0tTX01FUkdFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0RFRlJBR19CTE9DS1NfUkVTVUxUXSA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9NRU1PUllfREVGUkFHTUVOVEFUSU9OX0JMT0NLU19SRVNVTFRJTkcpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9BVkxfTk9ERVNdICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fRlJFRV9CTE9DS1NfQVZMX05PREVTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fRVhUX1NUQVRJU1RJQ1NdICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTUVNT1JZX0VYVEVOREVEX1NUQVRJU1RJQ1MpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHNpemVvZihhcmdzKSA9PSAyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBpZHggPSBhcmdzWzBdOworICAgICAgICAgICAgICAgIGlmIChpZHggPCAwIHx8IGlkeCA+PSBzaXplb2YocmVzdWx0KSkKKyAgICAgICAgICAgICAgICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigiSWxsZWdhbCBpbmRleCBmb3IgZGVidWdfaW5mbygpOiAlZCwgZXhwZWN0ZWQgMC4uJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBpZHgsIHNpemVvZihyZXN1bHQpLTEpKTsKKworICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRbaWR4XTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBESU5GT19UUkFDRToKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHdoaWNoID0gRElUX0NVUlJFTlQ7CisKKyAgICAgICAgICAgIGlmIChzaXplb2YoYXJncykgPiAxKQorICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKCJiYWQgbnVtYmVyIG9mIGFyZ3VtZW50cyB0byBkZWJ1Z19pbmZvXG4iKTsKKyAgICAgICAgICAgIGlmIChzaXplb2YoYXJncykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFpbnRwKGFyZ3NbMF0pKQorICAgICAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFnIGFyZyAyIHRvIGRlYnVnX2luZm8oKS5cbiIpOworICAgICAgICAgICAgICAgIHdoaWNoID0gYXJnc1swXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoICh3aGljaCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIERJVF9DVVJSRU5UOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWZ1bjo6ZHJpdmVyX2luZm8oRElfVFJBQ0VfQ1VSUkVOVCk7CisKKyAgICAgICAgICAgICAgICBjYXNlIERJVF9FUlJPUjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVmdW46OmRyaXZlcl9pbmZvKERJX1RSQUNFX0xBU1RfRVJST1IpIHx8ICh7ICJObyB0cmFjZS4iIH0pOworCisgICAgICAgICAgICAgICAgY2FzZSBESVRfVU5DQVVHSFRfRVJST1I6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlZnVuOjpkcml2ZXJfaW5mbyhESV9UUkFDRV9MQVNUX1VOQ0FVR0hUX0VSUk9SKSB8fCAoeyAiTm8gdHJhY2UuIiB9KTsKKworICAgICAgICAgICAgICAgIGNhc2UgRElUX1NUUl9DVVJSRU5UOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWZ1bjo6ZHJpdmVyX2luZm8oRElfVFJBQ0VfQ1VSUkVOVF9BU19TVFJJTkcpOworCisgICAgICAgICAgICAgICAgY2FzZSBESVRfQ1VSUkVOVF9ERVBUSDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVmdW46OmRyaXZlcl9pbmZvKERJX1RSQUNFX0NVUlJFTlRfREVQVEgpOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2VfZXJyb3IoImJhZCBhcmcgMiB0byBkZWJ1Z19pbmZvKCkuXG4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBESU5GT19FVkFMX05VTUJFUjoKKyAgICAgICAgICAgIHJldHVybiBlZnVuOjpkcml2ZXJfaW5mbyhESV9FVkFMX05VTUJFUik7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL2VuYWJsZV9jb21tYW5kcy5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vZW5hYmxlX2NvbW1hbmRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQxYzk2MwotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL2VuYWJsZV9jb21tYW5kcy5jCkBAIC0wLDAgKzEsMzAgQEAKKy8qIFRoZXNlIHNlZnVucyBhcmUgdG8gcHJvdmlkZSBhIHJlcGxhY2VtZW50IGZvciB0aGUgZWZ1bnMgZW5hYmxlX2NvbW1hbmRzKCkKKyAqIGFuZCBkaXNhYmxlX2NvbW1hbmRzKCkuCisgKiBGZWVsIGZyZWUgdG8gYWRkIGl0IHRvIHlvdXIgbXVkbGlicywgaWYgeW91IGhhdmUgbXVjaCBjb2RlIHJlbHlpbmcgb24gdGhhdC4KKyAqLworCisjaW5jbHVkZSA8Y29uZmlndXJhdGlvbi5oPgorCisjaWYgISBfX0VGVU5fREVGSU5FRF9fKGVuYWJsZV9jb21tYW5kcykKKwordm9pZCBlbmFibGVfY29tbWFuZHMoKQoreworICAgIG9iamVjdCBvYiA9IGVmdW46OnByZXZpb3VzX29iamVjdCgpOworCisgICAgZWZ1bjo6Y29uZmlndXJlX29iamVjdChvYiwgT0NfQ09NTUFORFNfRU5BQkxFRCwgMSk7CisgICAgZWZ1bjo6c2V0X3RoaXNfcGxheWVyKG9iKTsKK30KKworI2VuZGlmCisKKyNpZiAhIF9fRUZVTl9ERUZJTkVEX18oZGlzYWJsZV9jb21tYW5kcykKKwordm9pZCBkaXNhYmxlX2NvbW1hbmRzKCkKK3sKKyAgICBvYmplY3Qgb2IgPSBlZnVuOjpwcmV2aW91c19vYmplY3QoKTsKKworICAgIGVmdW46OmNvbmZpZ3VyZV9vYmplY3Qob2IsIE9DX0NPTU1BTkRTX0VOQUJMRUQsIDApOworICAgIGVmdW46OnNldF90aGlzX3BsYXllcigwKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9oYXNoLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9oYXNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFiYmY2MAotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL2hhc2guYwpAQCAtMCwwICsxLDE3IEBACisjaW5jbHVkZSAiL3N5cy90bHMuaCIKKworZGVwcmVjYXRlZCBzdHJpbmcgbWQ1KG1peGVkIGFyZywgdmFyYXJncyBtaXhlZCogaXRlcmF0aW9ucykKK3sKKyAgICBpZiAoZXh0ZXJuX2NhbGwoKSkKKyAgICAgICAgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CisKKyAgICByZXR1cm4gaGFzaChUTFNfSEFTSF9NRDUsIGFyZywgaXRlcmF0aW9ucy4uLik7Cit9CisKK2RlcHJlY2F0ZWQgc3RyaW5nIHNoYTEobWl4ZWQgYXJnLCB2YXJhcmdzIG1peGVkKiBpdGVyYXRpb25zKQoreworICAgIGlmIChleHRlcm5fY2FsbCgpKQorICAgICAgICAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKKworICAgIHJldHVybiBoYXNoKFRMU19IQVNIX1NIQTEsIGFyZywgaXRlcmF0aW9ucy4uLik7Cit9CmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9saXZpbmdzLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9saXZpbmdzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYwZmNlZQotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL2xpdmluZ3MuYwpAQCAtMCwwICsxLDM0OCBAQAorLy8gKiBsaXZpbmdfbmFtZS1CZWhhbmRsdW5nCisKKyNkZWZpbmUgY2xlYW5fbG9nKHMpCisvLyNkZWZpbmUgY2xlYW5fbG9nKHMpIGxvZ19maWxlKCJDTEVBTl9TSU0iLGN0aW1lKHRpbWUoKSlbNC4uMThdKyI6ICIrKHMpKTsKKworcHJpdmF0ZSBub3NhdmUgbWFwcGluZyBsaXZpbmdfbmFtZV9tLCBuYW1lX2xpdmluZ19tLCBuZXRkZWFkOworCitwcml2YXRlIHZvaWQgSW5pdExpdmluZ0RhdGEobWl4ZWQgd2l6aW5mbykgeworICAvLyBsaXZpbmdfbmFtZSBpc3QgZWluIFBvaW50ZXIgZGVyIGF1Y2ggaW4gZGVyIGV4dHJhX3dpemluZm8gZ2VoYWx0ZW4gCisgIC8vIHdpcmQsIHNvIGthbm4gZGllIHNpbXVsX2VmdW4gbmV1IGdlbGFkZW4gd2VyZGVuLCBvaG5lIGRhc3MgZGllc2VzCisgIC8vIE1hcHBpbmcgdmVybG9yZW4gZ2VodAorICBpZiAoIW1hcHBpbmdwKGxpdmluZ19uYW1lX20gPSB3aXppbmZvW0xJVklOR19OQU1FXSkpCisgICAgbGl2aW5nX25hbWVfbSA9IHdpemluZm9bTElWSU5HX05BTUVdID0gbV9hbGxvY2F0ZSgwLCAxKTsKKworICAvLyBHbGVpY2hlcyBnaWx0IGZ1ZXIgZGFzIE1hcHBpbmcgTmFtZS1MaXZpbmcKKyAgaWYgKCFtYXBwaW5ncChuYW1lX2xpdmluZ19tID0gd2l6aW5mb1tOQU1FX0xJVklOR10pKQorICAgIG5hbWVfbGl2aW5nX20gPSB3aXppbmZvW05BTUVfTElWSU5HXSA9IG1fYWxsb2NhdGUoMCwgMSk7CisKKyAgLy8gTmV0enRvdGUgc2luZCBlYmVuZmFsbHMgaW4gZGVyIGV4dHJhX3dpemluZm8KKyAgaWYgKCFtYXBwaW5ncChuZXRkZWFkID0gd2l6aW5mb1tORVRERUFEX01BUF0pKQorICAgIG5ldGRlYWQgPSB3aXppbmZvW05FVERFQURfTUFQXSA9IChbXSk7Cit9CisKK3B1YmxpYyB2YXJhcmdzIHN0cmluZyBnZXR1dWlkKCBvYmplY3Qgb2IgKQoreworICAgIG1peGVkICpyZXQ7CisKKyAgICBpZiAoICFvYmplY3RwKG9iKSApCisgICAgICAgb2IgPSBwcmV2aW91c19vYmplY3QoKTsKKworICAgIGlmICggIXF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUob2IpICkKKyAgICAgICByZXR1cm4gZ2V0dWlkKG9iKTsKKworICAgIHJldCA9IChtaXhlZCltYXN0ZXIoKS0+Z2V0X3VzZXJpbmZvKCBnZXR1aWQob2IpICk7CisKKyAgICBpZiAoICFwb2ludGVycChyZXQpIHx8IHNpemVvZihyZXQpIDwgNSApCisgICAgICAgcmV0dXJuIGdldHVpZChvYik7CisKKyAgICAvLyBVc2VybmFtZSArICJfIiArIENyZWF0aW9uRGF0ZQorICAgIHJldHVybiByZXRbMF0gKyAiXyIgKyByZXRbNV07Cit9CisKK3ZvaWQgc2V0X29iamVjdF9saXZpbmdfbmFtZShzdHJpbmcgbGl2bmFtZSwgb2JqZWN0IG9iaikKK3sKKyAgc3RyaW5nIG9sZDsKKyAgbWl4ZWQgYTsKKyAgaW50IGk7CisKKyAgaWYgKHByZXZpb3VzX29iamVjdCgpPT1vYmogfHwgcHJldmlvdXNfb2JqZWN0KCk9PXRoaXNfb2JqZWN0KCkgfHwKKyAgICAgIHByZXZpb3VzX29iamVjdCgpPT1tYXN0ZXIoKSkKKyAgeworICAgIGlmKCFsaXZuYW1lIHx8ICFzdHJpbmdwKGxpdm5hbWUpKSB7CisgICAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOworICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigiJU86IGlsbGVnYWwgbGl2aW5nIG5hbWU6ICVPXG4iLCBvYmosIGxpdm5hbWUpKTsKKyAgICB9CisgICAgaWYgKG9sZCA9IGxpdmluZ19uYW1lX21bb2JqXSkgeworICAgICAgaWYgKHBvaW50ZXJwKGEgPSBuYW1lX2xpdmluZ19tW29sZF0pKSB7CisgICAgICAgYVttZW1iZXIoYSwgb2JqKV0gPSAwOworICAgICAgfSBlbHNlIHsKKyAgICAgICBtX2RlbGV0ZShuYW1lX2xpdmluZ19tLCBvbGQpOworICAgICAgfQorICAgIH0KKyAgICBsaXZpbmdfbmFtZV9tW29ial0gPSBsaXZuYW1lOworICAgIGlmIChhID0gbmFtZV9saXZpbmdfbVtsaXZuYW1lXSkgeworICAgICAgaWYgKCFwb2ludGVycChhKSkgeworICAgICAgIG5hbWVfbGl2aW5nX21bbGl2bmFtZV0gPSAoe2EsIG9ian0pOworICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIC8qIFRyeSB0byByZWFsbG9jYXRlIGVudHJ5IGZyb20gZGVzdHJ1Y3RlZCBvYmplY3QgKi8KKyAgICAgIGlmICgoaSA9IG1lbWJlcihhLCAwKSkgPj0gMCkgeworICAgICAgIGFbaV0gPSBvYmo7CisgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgbmFtZV9saXZpbmdfbVtsaXZuYW1lXSA9IGEgKyAoe29ian0pOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBuYW1lX2xpdmluZ19tW2xpdm5hbWVdID0gb2JqOworICB9Cit9CisKK3ZvaWQgc2V0X2xpdmluZ19uYW1lKHN0cmluZyBsaXZuYW1lKQoreworICBzZXRfb2JqZWN0X2xpdmluZ19uYW1lKGxpdm5hbWUscHJldmlvdXNfb2JqZWN0KCkpOworfQorCit2b2lkIHJlbW92ZV9saXZpbmdfbmFtZSgpCit7CisgIHN0cmluZyBsaXZuYW1lOworCisgIGlmICghcHJldmlvdXNfb2JqZWN0KCkpCisgICAgcmV0dXJuOworICBpZiAobGl2bmFtZT1saXZpbmdfbmFtZV9tW3ByZXZpb3VzX29iamVjdCgpXSkKKyAgeworICAgIG1fZGVsZXRlKGxpdmluZ19uYW1lX20scHJldmlvdXNfb2JqZWN0KCkpOworICAgIGlmIChvYmplY3RwKG5hbWVfbGl2aW5nX21bbGl2bmFtZV0pKQorICAgIHsKKyAgICAgIGlmIChuYW1lX2xpdmluZ19tW2xpdm5hbWVdPT1wcmV2aW91c19vYmplY3QoKSkKKyAgICAgICBtX2RlbGV0ZShuYW1lX2xpdmluZ19tLGxpdm5hbWUpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAocG9pbnRlcnAobmFtZV9saXZpbmdfbVtsaXZuYW1lXSkpCisgICAgeworICAgICAgbmFtZV9saXZpbmdfbVtsaXZuYW1lXS09KHtwcmV2aW91c19vYmplY3QoKX0pOworICAgICAgaWYgKCFzaXplb2YobmFtZV9saXZpbmdfbVtsaXZuYW1lXSkpCisgICAgICAgbV9kZWxldGUobmFtZV9saXZpbmdfbSxsaXZuYW1lKTsKKyAgICB9CisgIH0KK30KKwordm9pZCBfc2V0X25ldGRlYWQoKQoreworICBpZiAocXVlcnlfb25jZV9pbnRlcmFjdGl2ZShwcmV2aW91c19vYmplY3QoKSkpCisgICAgbmV0ZGVhZFtnZXR1aWQocHJldmlvdXNfb2JqZWN0KCkpXT1wcmV2aW91c19vYmplY3QoKTsKK30KKwordm9pZCBfcmVtb3ZlX25ldGRlYWQoKQoreworICBtX2RlbGV0ZShuZXRkZWFkLGdldHVpZChwcmV2aW91c19vYmplY3QoKSkpOworfQorCitvYmplY3QgZmluZF9uZXRkZWFkKHN0cmluZyB1dWlkKQoreworICBpbnQgaTsKKyAgc3RyaW5nIHVpZDsKKyAgLy8gV2VubiBzc2NhbmYoKSAyIGxpZWZlcnQsIGlzdCB1dWlkIGF1Y2ggbmUgdXVpZC4KKyAgaW50IGlzX3V1aWQgPSBzc2NhbmYodXVpZCwgIiVzXyVkIiwgdWlkLCBpKSA9PSAyOworICBpZiAoIWlzX3V1aWQpCisgICAgdWlkID0gdXVpZDsKKyAKKyAgaWYgKGlzX3V1aWQgJiYgZ2V0dXVpZChuZXRkZWFkW3VpZF0pICE9IHV1aWQpCisgICAgICByZXR1cm4gMDsKKworICByZXR1cm4gbmV0ZGVhZFt1aWRdOworfQorCitzdHJpbmcgKmR1bXBfbmV0ZGVhZCgpCit7CisgIHJldHVybiBtX2luZGljZXMobmV0ZGVhZCk7Cit9CisKK29iamVjdCBmaW5kX2xpdmluZyhzdHJpbmcgbGl2bmFtZSkgeworICBtaXhlZCAqYSwgcjsKKyAgaW50IGk7CisKKyAgaWYgKHBvaW50ZXJwKHIgPSBuYW1lX2xpdmluZ19tW2xpdm5hbWVdKSkgeworICAgIGlmIChtZW1iZXIociwwKT49MCkKKyAgICAgIHItPSh7MH0pOworICAgIGlmICghc2l6ZW9mKHIpKXsKKyAgICAgIG1fZGVsZXRlKG5hbWVfbGl2aW5nX20sbGl2bmFtZSk7CisgICAgICBjbGVhbl9sb2coc3ByaW50ZigiZmluZF9saXZpbmcgbG9lc2NodCAlc1xuIixsaXZuYW1lKSk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKCAhbGl2aW5nKHIgPSAoYSA9IHIpWzBdKSkgeworICAgICAgZm9yIChpID0gc2l6ZW9mKGEpOyAtLWk7KSB7CisgICAgICAgaWYgKGxpdmluZyhhWzxpXSkpIHsKKyAgICAgICAgIHIgPSBhWzxpXTsKKyAgICAgICAgIGFbPGldID0gYVswXTsKKyAgICAgICAgIHJldHVybiBhWzBdID0gcjsKKyAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHJldHVybiByOworICB9CisgIHJldHVybiBsaXZpbmcocikgJiYgcjsKK30KKworb2JqZWN0ICpmaW5kX2xpdmluZ3Moc3RyaW5nIGxpdm5hbWUpCit7CisgIG1peGVkIHI7CisKKyAgaWYgKHBvaW50ZXJwKHI9bmFtZV9saXZpbmdfbVtsaXZuYW1lXSkpCisgICAgci09KHswfSk7CisgIGVsc2UKKyAgICBpZiAob2JqZWN0cChyKSkKKyAgICAgIHI9KHtyfSk7CisgIGlmICghcG9pbnRlcnAocil8fCFzaXplb2YocikpCisgICAgcmV0dXJuIDA7CisgIHJldHVybiByOworfQorCitvYmplY3QgZmluZF9wbGF5ZXIoc3RyaW5nIHV1aWQpIHsKKyAgb2JqZWN0ICpvYmpzOworICBtaXhlZCByZXM7CisgIGludCBpOworICBzdHJpbmcgdWlkOworCisgIGlmICghc3RyaW5ncCh1dWlkKSkKKyAgICByZXR1cm4gMDsKKyAgLy8gV2VubiBzc2NhbmYoKSAyIGxpZWZlcnQsIGlzdCB1dWlkIGF1Y2ggbmUgdXVpZC4KKyAgaW50IGlzX3V1aWQgPSBzc2NhbmYodXVpZCwgIiVzXyVkIiwgdWlkLCBpKSA9PSAyOworICBpZiAoIWlzX3V1aWQpCisgICAgdWlkID0gdXVpZDsKKworICBpZiAocG9pbnRlcnAocmVzID0gbmFtZV9saXZpbmdfbVt1aWRdKSkgeworICAgIC8vIHplcnN0b2VydGUgT2JqZWt0ZSBnZ2YuIGVudGZlcm5lbgorICAgIGlmIChtZW1iZXIocmVzLDApPj0wKSB7CisgICAgICByZXMtPSh7MH0pOworICAgICAgbmFtZV9saXZpbmdfbVt1aWRdID0gcmVzOworICAgIH0KKyAgICAvLyBnZ2YuIE5hbWVuIG9obmUgT2JqZWt0ZSBlbnRmZXJuZW4uCisgICAgaWYgKCFzaXplb2YocmVzKSl7CisgICAgICBtX2RlbGV0ZShuYW1lX2xpdmluZ19tLHVpZCk7CisgICAgICBjbGVhbl9sb2coc3ByaW50ZigiZmluZF9wbGF5ZXIgbG9lc2NodCAlc1xuIix1aWQpKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBvYmpzID0gcmVzOworICAgIHJlcyA9IG9ianNbMF07CisgICAgLy8gV2VubiBkYXMgMC4gRWxlbWVudCBkZXIgU3BpZWxlciBpc3QsIHNpbmQgd2lyIGZlcnRpZy4gQW5zb25zdGVuIHN1Y2hlbgorICAgIC8vIHdpciBkZW4gU3BpZWxlciB1bmQgc2NoaWViZW4gaWhuIGFuIGRpZSAwLiBTdGVsbGUgaW0gQXJyYXkuCisgICAgaWYgKCAhcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShyZXMpKSB7CisgICAgICBmb3IgKGkgPSBzaXplb2Yob2Jqcyk7IC0taTspIHsKKyAgICAgICBpZiAob2Jqc1s8aV0gJiYgcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShvYmpzWzxpXSkpIHsKKyAgICAgICAgIHJlcyA9IG9ianNbPGldOworICAgICAgICAgb2Jqc1s8aV0gPSBvYmpzWzBdOworICAgICAgICAgb2Jqc1swXSA9IHJlczsKKyAgICAgICAgIGJyZWFrOworICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJlcyA9IChvYmplY3RwKHJlcykgJiYgcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShyZXMpKSA/IHJlcyA6IDA7CisgICAgfQorICAgIC8vIGVsc2U6IGluIHJlcyBzdGVodCBkZXIgU3BpZWxlciBzY2hvbi4KKyAgfQorICBlbHNlIGlmIChvYmplY3RwKHJlcykpIC8vIHIgaXN0IG5lbiBFaW56ZWxvYmpla3QKKyAgICByZXMgPSBxdWVyeV9vbmNlX2ludGVyYWN0aXZlKHJlcykgPyByZXMgOiAwOworCisgIC8vIHJlcyBpc3QgamV0enQgZ2dmLiBkZXIgU3BpZWxlci4gQWJlciB3ZW5uIGRlciBuZSBhbmRlcmUgYWxzIGRpZSBnZXN1Y2h0ZQorICAvLyBVVUlEIGhhdCwgaXN0IGRhcyBFcmdlYm5pcyB0cm90emRlbSAwLgorICBpZiAoaXNfdXVpZCAmJiBnZXR1dWlkKHJlcykhPXV1aWQpCisgICAgICByZXR1cm4gMDsKKworICAvLyBlbmRsaWNoIGdlZnVuZGVuCisgIHJldHVybiByZXM7Cit9CisKK3ByaXZhdGUgaW50IGNoZWNrX21hdGNoKCBzdHJpbmcgc3RyLCBpbnQgcGxheWVyc19vbmx5ICkKK3sKKyAgICBtaXhlZCBtYXRjaDsKKworICAgIGlmICggIShtYXRjaCA9IG5hbWVfbGl2aW5nX21bc3RyXSkgKQorICAgICAgIHJldHVybiAwOworCisgICAgaWYgKCAhcG9pbnRlcnAobWF0Y2gpICkKKyAgICAgICBtYXRjaCA9ICh7IG1hdGNoIH0pOworCisgICAgbWF0Y2ggLT0gKHswfSk7CisKKyAgICBpZiAoIHNpemVvZihtYXRjaCkgKXsKKyAgICAgICBpZiAoIHBsYXllcnNfb25seSApCisgICAgICAgICAgIHJldHVybiBzaXplb2YoZmlsdGVyKCBtYXRjaCwgIydxdWVyeV9vbmNlX2ludGVyYWN0aXZlLyonKi8gKSkKKyAgICAgICAgICAgICAgPiAwOworICAgICAgIGVsc2UKKyAgICAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgbV9kZWxldGUoIG5hbWVfbGl2aW5nX20sIHN0ciApOworICAgIGNsZWFuX2xvZyggc3ByaW50ZigiY2hlY2tfbWF0Y2ggbG9lc2NodCAlc1xuIiwgc3RyKSApOworICAgIHJldHVybiAwOworfQorCisvL1RPRE86OiBzdHJpbmd8c3RyaW5nKiBleGNsdWRlCit2YXJhcmdzIG1peGVkIG1hdGNoX2xpdmluZyggc3RyaW5nIHN0ciwgaW50IHBsYXllcnNfb25seSwgbWl4ZWQgZXhjbHVkZSApCit7CisgICAgaW50IGksIHM7CisgICAgbWl4ZWQgbWF0Y2gsICp1c2VyOworCisgICAgaWYgKCAhc3RyIHx8IHN0ciA9PSAiIiApCisgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAoICFwb2ludGVycChleGNsdWRlKSApCisgICAgICAgZXhjbHVkZSA9ICh7IGV4Y2x1ZGUgfSk7CisKKyAgICBpZiAoIG1lbWJlcihleGNsdWRlLCBzdHIpIDwgMCAmJiBjaGVja19tYXRjaChzdHIsIHBsYXllcnNfb25seSkgKQorICAgICAgIHJldHVybiBzdHI7CisKKyAgICB1c2VyID0gbV9pbmRpY2VzKG5hbWVfbGl2aW5nX20pOworICAgIHMgPSBzaXplb2Yoc3RyKTsKKyAgICBtYXRjaCA9IDA7CisKKyAgICBmb3IgKCBpID0gc2l6ZW9mKHVzZXIpOyBpLS07ICkKKyAgICAgICBpZiAoIHN0ciA9PSB1c2VyW2ldWzAuLnMtMV0gJiYgbWVtYmVyKCBleGNsdWRlLCB1c2VyW2ldICkgPCAwICkKKyAgICAgICAgICAgaWYgKCBtYXRjaCApCisgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBpZiAoIGNoZWNrX21hdGNoKHVzZXJbaV0sIHBsYXllcnNfb25seSkgKQorICAgICAgICAgICAgICAgICAgbWF0Y2ggPSB1c2VyW2ldOworCisgICAgaWYgKCAhbWF0Y2ggKQorICAgICAgIHJldHVybiAtMjsKKworICAgIHJldHVybiBtYXRjaDsKK30KKworbWl4ZWQgKmR1bXBfbGl2aW5ncygpCit7CisgIHJldHVybiBzb3J0X2FycmF5KG1faW5kaWNlcyhuYW1lX2xpdmluZ19tKSwjJz4pOworfQorCisvLyAqIHJlZ2VsbWFlc3NpZyBMaXN0ZW4gdm9uIEJhbGxhc3QgYmVmcmVpZW4KK3ByaXZhdGUgdm9pZCBjbGVhbl9uYW1lX2xpdmluZ19tKHN0cmluZyAqa2V5cywgaW50IGxlZnQsIGludCBudW0pCit7CisgIGludCBpLCBqOworICBtaXhlZCBhOworCisgIHdoaWxlIChsZWZ0ICYmIG51bS0tKQorICB7CisgICAgaWYgKHBvaW50ZXJwKGEgPSBuYW1lX2xpdmluZ19tW2tleXNbLS1sZWZ0XV0pICYmIG1lbWJlcihhLCAwKT49MCkKKyAgICB7CisgICAgICBhLT0oezB9KTsKKyAgICAgIG5hbWVfbGl2aW5nX21ba2V5c1tsZWZ0XV0gPSBhOworICAgIH0KKyAgICBpZiAoIWEgfHwgKHBvaW50ZXJwKGEpICYmICFzaXplb2YoYSkpKQorICAgIHsKKyAgICAgIGNsZWFuX2xvZygiVG9hc3RpbmcgIitrZXlzW2xlZnRdKyJcbiIpOworICAgICAgbV9kZWxldGUobmFtZV9saXZpbmdfbSwga2V5c1tsZWZ0XSk7CisgICAgfSBlbHNlIGNsZWFuX2xvZyhzcHJpbnRmKCJLRUVQSU5HICVzICglTylcbiIsa2V5c1tsZWZ0XSxwb2ludGVycChhKT9zaXplb2YoYSk6YSkpOworICB9CisgIGlmIChsZWZ0KQorICAgIGVmdW46OmNhbGxfb3V0KCMnY2xlYW5fbmFtZV9saXZpbmdfbSwgMSwga2V5cywgbGVmdCwgODApOworICBlbHNlCisgICAgY2xlYW5fbG9nKCJDbGVhbiBwcm9jZXNzIGZpbmlzaGVkXG4iKTsKK30KKworcHJpdmF0ZSB2b2lkIGNsZWFuX25ldGRlYWQoKSB7CisgIGludCBpOworICBzdHJpbmcgKnM7CisgIG9iamVjdCBvYjsKKworICBzPW1faW5kaWNlcyhuZXRkZWFkKTsKKyAgZm9yIChpPXNpemVvZihzKS0xO2k+PTA7aS0tKQorICAgIGlmICghb2JqZWN0cChvYj1uZXRkZWFkW3NbaV1dKSB8fCBpbnRlcmFjdGl2ZShvYikpCisgICAgICBtX2RlbGV0ZShuZXRkZWFkLHNbaV0pOworfQorCitwcml2YXRlIHZvaWQgQ2xlYW5MaXZpbmdEYXRhKCkgeworICBpZiAoZmluZF9jYWxsX291dCgjJ2NsZWFuX25hbWVfbGl2aW5nX20pIDwgMCkgeworICAgIGNsZWFuX2xvZygiU3RhcnRpbmcgY2xlYW4gcHJvY2Vzc1xuIik7CisgICAgZWZ1bjo6Y2FsbF9vdXQoIydjbGVhbl9uYW1lX2xpdmluZ19tLAorICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICBtX2luZGljZXMobmFtZV9saXZpbmdfbSksCisgICAgICAgICAgICAgICAgIHNpemVvZihuYW1lX2xpdmluZ19tKSwKKyAgICAgICAgICAgICAgICAgODAKKyAgICAgICAgICAgICAgICAgKTsKKyAgfQorICBlZnVuOjpjYWxsX291dCgjJ2NsZWFuX25ldGRlYWQsMik7Cit9CisKKyN1bmRlZiBjbGVhbl9sb2cKKwpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vb2JqZWN0X2luZm8uYyBiL3NlY3VyZS9zaW11bF9lZnVuL29iamVjdF9pbmZvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ3YzAwOQotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL29iamVjdF9pbmZvLmMKQEAgLTAsMCArMSwxMDYgQEAKKy8qIFRoaXMgc2VmdW4gaXMgdG8gcHJvdmlkZSB0aGUgb2xkIHNlbWFudGljcyBvZiB0aGUgZWZ1biBvYmplY3RfaW5mbygpLgorICogRmVlbCBmcmVlIHRvIGFkZCBpdCB0byB5b3VyIG11ZGxpYnMsIGlmIHlvdSBoYXZlIG11Y2ggY29kZSByZWx5aW5nIG9uIHRoYXQuCisgKi8KKworI2lmIF9fRUZVTl9ERUZJTkVEX18oZHJpdmVyX2luZm8pIC8qIE5ld2VyIHZlcnNpb24gaXMgdGhlcmUgKi8KKworI2luY2x1ZGUgPG9iamVjdGluZm8uaD4KKyNpbmNsdWRlIDxvYmplY3RfaW5mby5oPgorCittaXhlZCBvYmplY3RfaW5mbyhvYmplY3Qgb2IsIGludCB3aGF0LCB2YXJhcmdzIGludCogaW5kZXgpCit7CisgICAgbWl4ZWQgKiByZXN1bHQ7CisKKyAgICBpZiAoc2l6ZW9mKGluZGV4KSA+IDEpCisgICAgICAgIHJhaXNlX2Vycm9yKCJUb28gbWFueSBhcmd1bWVudHMgdG8gb2JqZWN0X2luZm9cbiIpOworCisgICAgc3dpdGNoKHdoYXQpCisgICAgeworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigiSWxsZWdhbCB2YWx1ZSAlZCBmb3Igb2JqZWN0X2luZm8oKS5cbiIsIHdoYXQpKTsKKworICAgICAgICBjYXNlIE9JTkZPX0JBU0lDOgorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgPSBhbGxvY2F0ZShPSUJfTUFYKTsKKworICAgICAgICAgICAgcmVzdWx0W09JQl9IRUFSVF9CRUFUXSAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0NfSEVBUlRfQkVBVCk7CisgICAgICAgICAgICByZXN1bHRbT0lCX0lTX1dJWkFSRF0gICAgICAgICA9IDA7ICAgLyogTm90IHN1cHBvcnRlZCBhbnltb3JlLiAqLworICAgICAgICAgICAgcmVzdWx0W09JQl9FTkFCTEVfQ09NTUFORFNdICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0NfQ09NTUFORFNfRU5BQkxFRCk7CisgICAgICAgICAgICByZXN1bHRbT0lCX0NMT05FXSAgICAgICAgICAgICA9IGVmdW46OmNsb25lcChvYik7CisgICAgICAgICAgICByZXN1bHRbT0lCX0RFU1RSVUNURURdICAgICAgICA9IDA7ICAgLyogTm90IHBvc3NpYmxlIGFueW1vcmUuICovCisgICAgICAgICAgICByZXN1bHRbT0lCX1NXQVBQRURdICAgICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TV0FQUEVEKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfT05DRV9JTlRFUkFDVElWRV0gID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX09OQ0VfSU5URVJBQ1RJVkUpOworICAgICAgICAgICAgcmVzdWx0W09JQl9SRVNFVF9TVEFURV0gICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfUkVTRVRfU1RBVEUpOworICAgICAgICAgICAgcmVzdWx0W09JQl9XSUxMX0NMRUFOX1VQXSAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfV0lMTF9DTEVBTl9VUCk7CisgICAgICAgICAgICByZXN1bHRbT0lCX0xBTUJEQV9SRUZFUkVOQ0VEXSA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9MQU1CREFfUkVGRVJFTkNFRCk7CisgICAgICAgICAgICByZXN1bHRbT0lCX1NIQURPV10gICAgICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSEFET1dfUFJFVikgJiYgMTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfUkVQTEFDRURdICAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1JFUExBQ0VEKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfTkVYVF9SRVNFVF0gICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05FWFRfUkVTRVRfVElNRSk7CisgICAgICAgICAgICByZXN1bHRbT0lCX1RJTUVfT0ZfUkVGXSAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9MQVNUX1JFRl9USU1FKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfUkVGXSAgICAgICAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX09CSkVDVF9SRUZTKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfR0lHQVRJQ0tTXSAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX0dJR0FUSUNLUyk7CisgICAgICAgICAgICByZXN1bHRbT0lCX1RJQ0tTXSAgICAgICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9USUNLUyk7CisgICAgICAgICAgICByZXN1bHRbT0lCX1NXQVBfTlVNXSAgICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TV0FQX05VTSk7CisgICAgICAgICAgICByZXN1bHRbT0lCX1BST0dfU1dBUFBFRF0gICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9QUk9HX1NXQVBQRUQpOworICAgICAgICAgICAgcmVzdWx0W09JQl9WQVJfU1dBUFBFRF0gICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfVkFSX1NXQVBQRUQpOworICAgICAgICAgICAgcmVzdWx0W09JQl9OQU1FXSAgICAgICAgICAgICAgPSBlZnVuOjpvYmplY3RfbmFtZShvYik7CisgICAgICAgICAgICByZXN1bHRbT0lCX0xPQURfTkFNRV0gICAgICAgICA9IGVmdW46OmxvYWRfbmFtZShvYik7CisgICAgICAgICAgICByZXN1bHRbT0lCX05FWFRfQUxMXSAgICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9PQkpFQ1RfTkVYVCk7CisgICAgICAgICAgICByZXN1bHRbT0lCX1BSRVZfQUxMXSAgICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9PQkpFQ1RfUFJFVik7CisgICAgICAgICAgICByZXN1bHRbT0lCX05FWFRfQ0xFQU5VUF0gICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9ORVhUX0NMRUFOVVBfVElNRSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgT0lORk9fUE9TSVRJT046CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IGFsbG9jYXRlKE9JUF9NQVgpOworCisgICAgICAgICAgICByZXN1bHRbT0lQX05FWFRdID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX09CSkVDVF9ORVhUKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSVBfUFJFVl0gPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfT0JKRUNUX1BSRVYpOworICAgICAgICAgICAgcmVzdWx0W09JUF9QT1NdICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9PQkpFQ1RfUE9TKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBPSU5GT19NRU1PUlk6CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IGFsbG9jYXRlKE9JTV9NQVgpOworCisgICAgICAgICAgICByZXN1bHRbT0lNX1JFRl0gICAgICAgICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfUFJPR19SRUZTKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fTkFNRV0gICAgICAgICAgICAgICA9IGVmdW46OnByb2dyYW1fbmFtZShvYik7CisgICAgICAgICAgICByZXN1bHRbT0lNX1BST0dfU0laRV0gICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfUFJPR19TSVpFKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fTlVNX0ZVTkNUSU9OU10gICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9OVU1fRlVOQ1RJT05TKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fU0laRV9GVU5DVElPTlNdICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSVpFX0ZVTkNUSU9OUyk7CisgICAgICAgICAgICByZXN1bHRbT0lNX05VTV9WQVJJQUJMRVNdICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTlVNX1ZBUklBQkxFUyk7CisgICAgICAgICAgICByZXN1bHRbT0lNX1NJWkVfVkFSSUFCTEVTXSAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0laRV9WQVJJQUJMRVMpOworICAgICAgICAgICAgcmVzdWx0W09JTV9OVU1fU1RSSU5HU10gICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05VTV9TVFJJTkdTKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fU0laRV9TVFJJTkdTXSAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSVpFX1NUUklOR1MpOworICAgICAgICAgICAgcmVzdWx0W09JTV9TSVpFX1NUUklOR1NfREFUQV0gID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NJWkVfU1RSSU5HU19EQVRBKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fU0laRV9TVFJJTkdTX1RPVEFMXSA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSVpFX1NUUklOR1NfREFUQV9UT1RBTCk7CisgICAgICAgICAgICByZXN1bHRbT0lNX05VTV9JTkhFUklURURdICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTlVNX0lOSEVSSVRFRCk7CisgICAgICAgICAgICByZXN1bHRbT0lNX1NJWkVfSU5IRVJJVEVEXSAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0laRV9JTkhFUklURUQpOworICAgICAgICAgICAgcmVzdWx0W09JTV9UT1RBTF9TSVpFXSAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1BST0dfU0laRV9UT1RBTCk7CisgICAgICAgICAgICByZXN1bHRbT0lNX0RBVEFfU0laRV0gICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfREFUQV9TSVpFKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fVE9UQUxfREFUQV9TSVpFXSAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9EQVRBX1NJWkVfVE9UQUwpOworICAgICAgICAgICAgcmVzdWx0W09JTV9OT19JTkhFUklUXSAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05PX0lOSEVSSVQpOworICAgICAgICAgICAgcmVzdWx0W09JTV9OT19DTE9ORV0gICAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05PX0NMT05FKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fTk9fU0hBRE9XXSAgICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9OT19TSEFET1cpOworICAgICAgICAgICAgcmVzdWx0W09JTV9OVU1fSU5DTFVERVNdICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05VTV9JTkNMVURFRCk7CisgICAgICAgICAgICByZXN1bHRbT0lNX1NIQVJFX1ZBUklBQkxFU10gICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0hBUkVfVkFSSUFCTEVTKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHNpemVvZihpbmRleCkpCisgICAgeworICAgICAgICBpbnQgaWR4ID0gaW5kZXhbMF07CisgICAgICAgIGlmIChpZHggPCAwIHx8IGlkeCA+PSBzaXplb2YocmVzdWx0KSkKKyAgICAgICAgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoIklsbGVnYWwgaW5kZXggZm9yIG9iamVjdF9pbmZvKCk6ICVkLCBleHBlY3RlZCAwLi4lZFxuIiwKKyAgICAgICAgICAgICAgICBpZHgsIHNpemVvZihyZXN1bHQpLTEpKTsKKworICAgICAgICByZXR1cm4gcmVzdWx0W2lkeF07CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9xdWVyeV9lZGl0aW5nLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9xdWVyeV9lZGl0aW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE0NmRjZAotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3F1ZXJ5X2VkaXRpbmcuYwpAQCAtMCwwICsxLDE3IEBACisvKiBUaGlzIHNlZnVuIGlzIHRvIHByb3ZpZGUgYSByZXBsYWNlbWVudCBmb3IgdGhlIGVmdW4gcXVlcnlfZWRpdGluZygpLgorICogRmVlbCBmcmVlIHRvIGFkZCBpdCB0byB5b3VyIG11ZGxpYnMsIGlmIHlvdSBoYXZlIG11Y2ggY29kZSByZWx5aW5nIG9uIHRoYXQuCisgKi8KKworI2lmICEgX19FRlVOX0RFRklORURfXyhxdWVyeV9lZGl0aW5nKQorCisjaW5jbHVkZSA8aW50ZXJhY3RpdmVfaW5mby5oPgorCitpbnR8b2JqZWN0IHF1ZXJ5X2VkaXRpbmcob2JqZWN0IG9iKQoreworICAgIGlmKCFlZnVuOjppbnRlcmFjdGl2ZShvYikpCisgICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIGVmdW46OmludGVyYWN0aXZlX2luZm8ob2IsIElJX0VESVRJTkcpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3F1ZXJ5X2lkbGUuYyBiL3NlY3VyZS9zaW11bF9lZnVuL3F1ZXJ5X2lkbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2EzMmFlCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vcXVlcnlfaWRsZS5jCkBAIC0wLDAgKzEsMTQgQEAKKy8qIFRoaXMgc2VmdW4gaXMgdG8gcHJvdmlkZSBhIHJlcGxhY2VtZW50IGZvciB0aGUgZWZ1biBxdWVyeV9pZGxlKCkuCisgKiBGZWVsIGZyZWUgdG8gYWRkIGl0IHRvIHlvdXIgbXVkbGlicywgaWYgeW91IGhhdmUgbXVjaCBjb2RlIHJlbHlpbmcgb24gdGhhdC4KKyAqLworCisjaWYgISBfX0VGVU5fREVGSU5FRF9fKHF1ZXJ5X2lkbGUpCisKKyNpbmNsdWRlIDxpbnRlcmFjdGl2ZV9pbmZvLmg+CisKK2ludCBxdWVyeV9pZGxlKG9iamVjdCBvYikKK3sKKyAgICByZXR1cm4gZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyhvYiwgSUlfSURMRSk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vcXVlcnlfaW5wdXRfcGVuZGluZy5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vcXVlcnlfaW5wdXRfcGVuZGluZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkOGMzMTEKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9xdWVyeV9pbnB1dF9wZW5kaW5nLmMKQEAgLTAsMCArMSwxNyBAQAorLyogVGhpcyBzZWZ1biBpcyB0byBwcm92aWRlIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBlZnVuIHF1ZXJ5X2lucHV0X3BlbmRpbmcoKS4KKyAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgorICovCisKKyNpZiAhIF9fRUZVTl9ERUZJTkVEX18ocXVlcnlfaW5wdXRfcGVuZGluZykKKworI2luY2x1ZGUgPGludGVyYWN0aXZlX2luZm8uaD4KKworb2JqZWN0IHF1ZXJ5X2lucHV0X3BlbmRpbmcob2JqZWN0IG9iKQoreworICAgIGlmKCFlZnVuOjppbnRlcmFjdGl2ZShvYikpCisgICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIGVmdW46OmludGVyYWN0aXZlX2luZm8ob2IsIElJX0lOUFVUX1BFTkRJTkcpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3F1ZXJ5X2lwX25hbWUuYyBiL3NlY3VyZS9zaW11bF9lZnVuL3F1ZXJ5X2lwX25hbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGE2ZTA3Ci0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vcXVlcnlfaXBfbmFtZS5jCkBAIC0wLDAgKzEsNDggQEAKKy8qIFRoaXMgc2VmdW4gaXMgdG8gcHJvdmlkZSBhIHJlcGxhY2VtZW50IGZvciB0aGUgZWZ1bnMgcXVlcnlfaXBfbmFtZSgpIGFuZAorICogcXVlcnlfaXBfbnVtYmVyKCkuCisgKiBGZWVsIGZyZWUgdG8gYWRkIGl0IHRvIHlvdXIgbXVkbGlicywgaWYgeW91IGhhdmUgbXVjaCBjb2RlIHJlbHlpbmcgb24gdGhhdC4KKyAqLworCisjaWYgISBfX0VGVU5fREVGSU5FRF9fKHF1ZXJ5X2lwX25hbWUpCisKKyNpbmNsdWRlIDxpbnRlcmFjdGl2ZV9pbmZvLmg+CisKK3ByaXZhdGUgdmFyYXJncyBzdHJpbmcgX3F1ZXJ5X2lwX25hbWUob2JqZWN0IHBsYXllcikKK3sKKyAgICBvYmplY3Qgb2IgPSBwbGF5ZXI7CisgICAgb2IgfHw9IGVmdW46OnRoaXNfcGxheWVyKCk7CisKKyAgICBwbGF5ZXIgPSBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKG9iLCBJSV9JUF9BRERSRVNTKTsKKyAgICByZXR1cm4gZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyhvYiwgSUlfSVBfTkFNRSk7Cit9CisKK3ByaXZhdGUgdmFyYXJncyBzdHJpbmcgX3F1ZXJ5X2lwX251bWJlcihvYmplY3QgcGxheWVyKQoreworICAgIG9iamVjdCBvYiA9IHBsYXllcjsKKyAgICBvYiB8fD0gZWZ1bjo6dGhpc19wbGF5ZXIoKTsKKworICAgIHBsYXllciA9IGVmdW46OmludGVyYWN0aXZlX2luZm8ob2IsIElJX0lQX0FERFJFU1MpOworICAgIHJldHVybiBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKG9iLCBJSV9JUF9OVU1CRVIpOworfQorCisvLyAqIEhlcmt1bmZ0cy1Fcm1pdHRsdW5nCitzdHJpbmcgcXVlcnlfaXBfbnVtYmVyKG9iamVjdCBvYikKK3sKKyAgb2I9IG9iIHx8IHRoaXNfcGxheWVyKCk7CisgIGlmICghb2JqZWN0cChvYikgfHwgIWludGVyYWN0aXZlKG9iKSkgcmV0dXJuIDA7CisgIGlmKG9iLT5xdWVyeV9yZWFsaXAoKSAmJiAoc3RyaW5nKW9iLT5xdWVyeV9yZWFsaXAoKSE9IiIpCisgIHsKKyAgICByZXR1cm4gKHN0cmluZylvYi0+cXVlcnlfcmVhbGlwKCk7CisgIH0KKyAgcmV0dXJuIF9xdWVyeV9pcF9udW1iZXIob2IpOworfQorCitzdHJpbmcgcXVlcnlfaXBfbmFtZShtaXhlZCBvYikKK3sKKyAgaWYgKCAhb2IgfHwgb2JqZWN0cChvYikgKQorICAgICAgb2I9cXVlcnlfaXBfbnVtYmVyKG9iKTsKKyAgcmV0dXJuIChzdHJpbmcpIi9wL2RhZW1vbi9pcGxvb2t1cCItPmhvc3Qob2IpOworfQorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vcXVlcnlfbGltaXRzLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9xdWVyeV9saW1pdHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2JmMzkwCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vcXVlcnlfbGltaXRzLmMKQEAgLTAsMCArMSwxNCBAQAorLyogVGhpcyBzZWZ1biBpcyB0byBwcm92aWRlIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBlZnVuIHF1ZXJ5X2xpbWl0cygpLgorICogRmVlbCBmcmVlIHRvIGFkZCBpdCB0byB5b3VyIG11ZGxpYnMsIGlmIHlvdSBoYXZlIG11Y2ggY29kZSByZWx5aW5nIG9uIHRoYXQuCisgKi8KKworI2lmICEgX19FRlVOX0RFRklORURfXyhxdWVyeV9saW1pdHMpCisKKyNpbmNsdWRlIDxkcml2ZXJfaW5mby5oPgorCit2YXJhcmdzIGludCogcXVlcnlfbGltaXRzKGludCBkZWYpCit7CisgICAgcmV0dXJuIGVmdW46OmRyaXZlcl9pbmZvKGRlZiA/IERDX0RFRkFVTFRfUlVOVElNRV9MSU1JVFMgOiBESV9DVVJSRU5UX1JVTlRJTUVfTElNSVRTKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9xdWVyeV9sb2FkX2F2ZXJhZ2UuYyBiL3NlY3VyZS9zaW11bF9lZnVuL3F1ZXJ5X2xvYWRfYXZlcmFnZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiMzZmMGUKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9xdWVyeV9sb2FkX2F2ZXJhZ2UuYwpAQCAtMCwwICsxLDE2IEBACisvKiBUaGlzIHNlZnVuIGlzIHRvIHByb3ZpZGUgYSByZXBsYWNlbWVudCBmb3IgdGhlIGVmdW4gcXVlcnlfbG9hZF9hdmVyYWdlKCkuCisgKiBGZWVsIGZyZWUgdG8gYWRkIGl0IHRvIHlvdXIgbXVkbGlicywgaWYgeW91IGhhdmUgbXVjaCBjb2RlIHJlbHlpbmcgb24gdGhhdC4KKyAqLworCisjaWYgISBfX0VGVU5fREVGSU5FRF9fKHF1ZXJ5X2xvYWRfYXZlcmFnZSkKKworI2luY2x1ZGUgPGRyaXZlcl9pbmZvLmg+CisKK3N0cmluZyBxdWVyeV9sb2FkX2F2ZXJhZ2UoKQoreworICAgIHJldHVybiBlZnVuOjpzcHJpbnRmKCIlLjJmIGNtZHMvcywgJS4yZiBjb21wIGxpbmVzL3MiLAorICAgICAgICBlZnVuOjpkcml2ZXJfaW5mbyhESV9MT0FEX0FWRVJBR0VfQ09NTUFORFMpLAorICAgICAgICBlZnVuOjpkcml2ZXJfaW5mbyhESV9MT0FEX0FWRVJBR0VfTElORVMpKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9xdWVyeV9tdWRfcG9ydC5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vcXVlcnlfbXVkX3BvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmYwMDlkCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vcXVlcnlfbXVkX3BvcnQuYwpAQCAtMCwwICsxLDM1IEBACisvKiBUaGlzIHNlZnVuIGlzIHRvIHByb3ZpZGUgYSByZXBsYWNlbWVudCBmb3IgdGhlIGVmdW4gcXVlcnlfbXVkX3BvcnQoKS4KKyAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgorICovCisKKyNpZiAhIF9fRUZVTl9ERUZJTkVEX18ocXVlcnlfbXVkX3BvcnQpCisKKyNpbmNsdWRlIDxpbnRlcmFjdGl2ZV9pbmZvLmg+CisjaW5jbHVkZSA8ZHJpdmVyX2luZm8uaD4KKworaW50IHF1ZXJ5X211ZF9wb3J0KHZhcmFyZ3MgaW50KnxvYmplY3QqIGFyZ3MpCit7CisgICAgaWYoIXNpemVvZihhcmdzKSAmJiBlZnVuOjp0aGlzX3BsYXllcigpICYmIGVmdW46OmludGVyYWN0aXZlKHRoaXNfcGxheWVyKCkpKQorICAgICAgICByZXR1cm4gZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyh0aGlzX3BsYXllcigpLCBJSV9NVURfUE9SVCk7CisKKyAgICBpZihzaXplb2YoYXJncykgPiAxKQorICAgICAgICByYWlzZV9lcnJvcigiVG9vIG1hbnkgYXJndW1lbnRzIHRvIHF1ZXJ5X211ZF9wb3J0XG4iKTsKKworICAgIGlmKHNpemVvZihhcmdzKSAmJiBlZnVuOjpvYmplY3RwKGFyZ3NbMF0pICYmIGVmdW46OmludGVyYWN0aXZlKGFyZ3NbMF0pKQorICAgICAgICByZXR1cm4gZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyhhcmdzWzBdLCBJSV9NVURfUE9SVCk7CisKKyAgICBpZihzaXplb2YoYXJncykgJiYgaW50cChhcmdzWzBdKSkKKyAgICB7CisgICAgICAgIGludCogcG9ydHMgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9NVURfUE9SVFMpOworICAgICAgICBpZihhcmdzWzBdIDwgLTEgfHwgYXJnc1swXSA+PSBzaXplb2YocG9ydHMpKQorICAgICAgICAgICAgcmFpc2VfZXJyb3IoZWZ1bjo6c3ByaW50ZigiQmFkIGFyZyAxIHRvIHF1ZXJ5X211ZF9wb3J0KCk6IHZhbHVlICVkIG91dCBvZiByYW5nZS5cbiIsIGFyZ3NbMF0pKTsKKyAgICAgICAgZWxzZSBpZihhcmdzWzBdID09IC0xKQorICAgICAgICAgICAgcmV0dXJuIHNpemVvZihwb3J0cyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBwb3J0c1thcmdzWzBdXTsKKyAgICB9CisKKyAgICByZXR1cm4gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTVVEX1BPUlRTKVswXTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9xdWVyeV9vbmNlX2ludGVyYWN0aXZlLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9xdWVyeV9vbmNlX2ludGVyYWN0aXZlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM3ODI5ZgotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3F1ZXJ5X29uY2VfaW50ZXJhY3RpdmUuYwpAQCAtMCwwICsxLDE0IEBACisvKiBUaGlzIHNlZnVuIGlzIHRvIHByb3ZpZGUgYSByZXBsYWNlbWVudCBmb3IgdGhlIGVmdW4gcXVlcnlfb25jZV9pbnRlcmFjdGl2ZSgpLgorICogRmVlbCBmcmVlIHRvIGFkZCBpdCB0byB5b3VyIG11ZGxpYnMsIGlmIHlvdSBoYXZlIG11Y2ggY29kZSByZWx5aW5nIG9uIHRoYXQuCisgKi8KKworI2lmICEgX19FRlVOX0RFRklORURfXyhxdWVyeV9vbmNlX2ludGVyYWN0aXZlKQorCisjaW5jbHVkZSA8b2JqZWN0X2luZm8uaD4KKworaW50IHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUob2JqZWN0IG9iKQoreworICAgIHJldHVybiBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfT05DRV9JTlRFUkFDVElWRSk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vcXVlcnlfc25vb3AuYyBiL3NlY3VyZS9zaW11bF9lZnVuL3F1ZXJ5X3Nub29wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZhNjljMAotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3F1ZXJ5X3Nub29wLmMKQEAgLTAsMCArMSwzMCBAQAorLyogVGhpcyBzZWZ1biBpcyB0byBwcm92aWRlIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBlZnVuIHF1ZXJ5X3Nub29wKCkuCisgKiBGZWVsIGZyZWUgdG8gYWRkIGl0IHRvIHlvdXIgbXVkbGlicywgaWYgeW91IGhhdmUgbXVjaCBjb2RlIHJlbHlpbmcgb24gdGhhdC4KKyAqLworCisKKyNpbmNsdWRlIDxpbnRlcmFjdGl2ZV9pbmZvLmg+CisKK3ByaXZhdGUgb2JqZWN0IF9xdWVyeV9zbm9vcChvYmplY3Qgb2IpCit7CisgICAgaWYoIWVmdW46OmludGVyYWN0aXZlKG9iKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBvYmplY3QgcHJldiA9IGVmdW46OnByZXZpb3VzX29iamVjdCgpOworICAgIGVmdW46OnNldF90aGlzX29iamVjdChwcmV2KTsKKyNpZiAhIF9fRUZVTl9ERUZJTkVEX18ocXVlcnlfc25vb3ApCisgICAgcmV0dXJuIGVmdW46OmludGVyYWN0aXZlX2luZm8ob2IsIElJX1NOT09QX05FWFQpOworI2Vsc2UKKyAgICByZXR1cm4gZWZ1bjo6cXVlcnlfc25vb3Aob2IpOworI2VuZGlmCit9CisKK25vbWFzayBvYmplY3QgcXVlcnlfc25vb3Aob2JqZWN0IHdobykgeworICBvYmplY3Qgc25vb3BlcjsKKworICBzbm9vcGVyPV9xdWVyeV9zbm9vcCh3aG8pOworICBpZiAoIXNub29wZXIpIHJldHVybiAwOworICBpZiAocXVlcnlfd2l6X2dycChzbm9vcGVyKT5xdWVyeV93aXpfZ3JwKGdldHVpZChwcmV2aW91c19vYmplY3QoKSkpICYmCisgICAgICBJU19BUkNIKHNub29wZXIpKSByZXR1cm4gMDsKKyAgcmV0dXJuIHNub29wZXI7Cit9CmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zZXRfaGVhcnRfYmVhdC5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc2V0X2hlYXJ0X2JlYXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzk5NWViCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc2V0X2hlYXJ0X2JlYXQuYwpAQCAtMCwwICsxLDI0IEBACisvKiBUaGlzIHNlZnVuIGlzIHRvIHByb3ZpZGUgYSByZXBsYWNlbWVudCBmb3IgdGhlIGVmdW4gc2V0X2hlYXJ0X2JlYXQoKS4KKyAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgorICovCisKKyNpZiAhIF9fRUZVTl9ERUZJTkVEX18oc2V0X2hlYXJ0X2JlYXQpCisKKyNpbmNsdWRlIDxjb25maWd1cmF0aW9uLmg+CisKK2ludCBzZXRfaGVhcnRfYmVhdChpbnQgZmxhZykKK3sKKyAgICBvYmplY3Qgb2IgPSBlZnVuOjpwcmV2aW91c19vYmplY3QoKTsKKyAgICBpbnQgaGIgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0NfSEVBUlRfQkVBVCk7CisKKyAgICBpZiAoIWZsYWcgPT0gIWhiKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGVmdW46OmNvbmZpZ3VyZV9vYmplY3Qob2IsIE9DX0hFQVJUX0JFQVQsIGZsYWcpOworCisgICAgcmV0dXJuIDE7Cit9CisKKyNlbmRpZgorCisKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NldF9pc193aXphcmQuYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NldF9pc193aXphcmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDFjY2RiCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc2V0X2lzX3dpemFyZC5jCkBAIC0wLDAgKzEsMTM3IEBACisvKiBUaGVzZSBhcmUgdGhlIHNwZWNpYWwgY29tbWFuZHMgZnJvbSB0aGUgZHJpdmVyIHRoYXQgYXJlIGFjdGl2YXRlZCB3aXRoCisgKiBzZXRfaXNfd2l6YXJkKCkuIFRoZXNlIGZ1bmN0aW9ucyBtdXN0IGJlIGFkZGVkIHRvIHRoZSBwbGF5ZXIgb2JqZWN0LgorICogQWxzbyBzZXRfaXNfd2l6YXJkKCkgbXVzdCBiZSBjYWxsZWQgaW4gdGhlIGNvcnJlc3BvbmRpbmcgcGxheWVyIG9iamVjdCwKKyAqIG5vdCBhcyBhbiAoc2ltdWwtKWVmdW4uCisgKi8KKworI2luY2x1ZGUgPGNvbW1hbmRzLmg+CisjaW5jbHVkZSA8ZHJpdmVyX2luZm8uaD4KKworLyogaXNfd2l6YXJkOgorICogIDE6IGhhcyBhY3Rpb25zLAorICogIDA6IG5ldmVyIGhhZCBhY3Rpb25zLAorICogLTE6IGhhZCBhY3Rpb25zIG9uY2UuCisgKi8KK3ByaXZhdGUgbm9zYXZlIGludCBpc193aXphcmQ7CisKK3ByaXZhdGUgaW50IGRyaXZlcl9tYWxsb2Moc3RyaW5nIHN0cikKK3sKKyAgICBpZihpc193aXphcmQgPD0gMCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZighc2l6ZW9mKHN0cikpCisgICAgeworICAgICAgICB3cml0ZShlZnVuOjpkcml2ZXJfaW5mbyhESV9TVEFUVVNfVEVYVF9NQUxMT0MpKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgaWYoc3RyID09ICJleHRzdGF0cyIpCisgICAgeworICAgICAgICB3cml0ZShlZnVuOjpkcml2ZXJfaW5mbyhESV9TVEFUVVNfVEVYVF9NQUxMT0NfRVhURU5ERUQpKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3ByaXZhdGUgaW50IGRyaXZlcl9kdW1wYWxsb2JqKHN0cmluZyBzdHIpCit7CisgICAgaWYoaXNfd2l6YXJkIDw9IDAgfHwgc2l6ZW9mKHN0cikpCisgICAgICAgIHJldHVybiAwOworCisgICAgd3JpdGUoIkR1bXBpbmcgdG8gL09CSl9EVU1QIC4uLiAiKTsKKyAgICBlZnVuOjpkdW1wX2RyaXZlcl9pbmZvKERESV9PQkpFQ1RTKTsKKyAgICBlZnVuOjpkdW1wX2RyaXZlcl9pbmZvKERESV9PQkpFQ1RTX0RFU1RSVUNURUQpOworICAgIHdyaXRlKCJkb25lXG4iKTsKKyAgICByZXR1cm4gMTsKK30KKworcHJpdmF0ZSBpbnQgZHJpdmVyX29wY2R1bXAoc3RyaW5nIHN0cikKK3sKKyAgICBpZihpc193aXphcmQgPD0gMCB8fCBzaXplb2Yoc3RyKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBlZnVuOjpkdW1wX2RyaXZlcl9pbmZvKERESV9PUENPREVTKTsKKyAgICByZXR1cm4gMTsKK30KKworcHJpdmF0ZSBpbnQgZHJpdmVyX3N0YXR1cyhzdHJpbmcgc3RyKQoreworICAgIGludCBvcHQ7CisgICAgaWYoaXNfd2l6YXJkIDw9IDApCisgICAgICAgIHJldHVybiAwOworCisgICAgc3dpdGNoKHN0ciB8fCAiIikKKyAgICB7CisgICAgICAgIGNhc2UgIiI6CisgICAgICAgICAgICBvcHQgPSBESV9TVEFUVVNfVEVYVF9NRU1PUlk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICJ0YWJsZXMiOgorICAgICAgICBjYXNlICIgdGFibGVzIjoKKyAgICAgICAgICAgIG9wdCA9IERJX1NUQVRVU19URVhUX1RBQkxFUzsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgInN3YXAiOgorICAgICAgICBjYXNlICIgc3dhcCI6CisgICAgICAgICAgICBvcHQgPSBESV9TVEFUVVNfVEVYVF9TV0FQOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAibWFsbG9jIjoKKyAgICAgICAgY2FzZSAiIG1hbGxvYyI6CisgICAgICAgICAgICBvcHQgPSBESV9TVEFUVVNfVEVYVF9NQUxMT0M7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICJtYWxsb2MgZXh0c3RhdHMiOgorICAgICAgICBjYXNlICIgbWFsbG9jIGV4dHN0YXRzIjoKKyAgICAgICAgICAgIG9wdCA9IERJX1NUQVRVU19URVhUX01BTExPQ19FWFRFTkRFRDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICB3cml0ZShlZnVuOjpkcml2ZXJfaW5mbyhvcHQpKTsKKyAgICByZXR1cm4gMTsKK30KKworaW50IHNldF9pc193aXphcmQodmFyYXJncyA8b2JqZWN0fGludD4qIGFyZ3MpCit7CisgICAgaW50IG9sZHZhbCA9IGlzX3dpemFyZDsKKworICAgIGlmKCFzaXplb2YoYXJncykpCisgICAgICAgIHJhaXNlX2Vycm9yKCJUb28gZmV3IGFyZ3VtZW50cyB0byBzZXRfaXNfd2l6YXJkXG4iKTsKKyAgICBpZihzaXplb2YoYXJncykgPiAyKQorICAgICAgICByYWlzZV9lcnJvcigiVG9vIG1hbnkgYXJndW1lbnRzIHRvIHNldF9pc193aXphcmRcbiIpOworICAgIGlmKCFvYmplY3RwKGFyZ3NbMF0pKQorICAgICAgICByYWlzZV9lcnJvcigiQmFkIGFyZyAxIHRvIHNldF9pc193aXphcmQoKVxuIik7CisgICAgaWYoYXJnc1swXSAhPSB0aGlzX29iamVjdCgpKQorICAgICAgICByYWlzZV9lcnJvcigiT25seSBzZXRfaXNfd2l6YXJkIGZvciB0aGUgY3VycmVudCBvYmplY3Qgc3VwcG9ydGVkXG4iKTsKKyAgICBpZih0aGlzX3BsYXllcigpICE9IHRoaXNfb2JqZWN0KCkpCisgICAgICAgIHJhaXNlX2Vycm9yKCJUaGUgY3VycmVudCBvYmplY3QgbXVzdCBiZSB0aGlzX3BsYXllcigpIGZvciBzZXRfaXNfd2l6YXJkKClcbiIpOworICAgIGlmKHNpemVvZihhcmdzKSA9PSAyICYmICFpbnRwKGFyZ3NbMV0pKQorICAgICAgICByYWlzZV9lcnJvcigiQmFkIGFyZyAyIHRvIHNldF9pc193aXphcmQoKVxuIik7CisKKyAgICBpZihzaXplb2YoYXJncykgPT0gMiAmJiAhYXJnc1sxXSkKKyAgICB7CisgICAgICAgIGlmKGlzX3dpemFyZCA+IDApCisgICAgICAgICAgICBpc193aXphcmQgPSAtMTsKKyAgICB9CisgICAgZWxzZSBpZihzaXplb2YoYXJncykgPT0gMiAmJiBhcmdzWzFdPDApCisgICAgeworICAgICAgICAgLy8gSnVzdCByZXR1cm4gdGhlIG9sZCB2YWx1ZS4KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYoIWlzX3dpemFyZCkKKyAgICAgICAgeworICAgICAgICAgICAgYWRkX2FjdGlvbigjJ2RyaXZlcl9tYWxsb2MsICJtYWxsb2MiKTsKKyAgICAgICAgICAgIGFkZF9hY3Rpb24oIydkcml2ZXJfZHVtcGFsbG9iaiwgImR1bXBhbGxvYmoiKTsKKyAgICAgICAgICAgIGFkZF9hY3Rpb24oIydkcml2ZXJfb3BjZHVtcCwgIm9wY2R1bXAiKTsKKyAgICAgICAgICAgIGFkZF9hY3Rpb24oIydkcml2ZXJfc3RhdHVzLCAic3RhdHVzIiwgQUFfTk9TUEFDRSk7CisgICAgICAgIH0KKyAgICAgICAgaXNfd2l6YXJkID0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gb2xkdmFsID4gMDsKK30KZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NldF9wcm9tcHQuYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NldF9wcm9tcHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjU5NjkyCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc2V0X3Byb21wdC5jCkBAIC0wLDAgKzEsMjEgQEAKKy8qIFRoaXMgc2VmdW4gaXMgdG8gcHJvdmlkZSBhIHJlcGxhY2VtZW50IGZvciB0aGUgZWZ1biBzZXRfcHJvbXB0KCkuCisgKiBGZWVsIGZyZWUgdG8gYWRkIGl0IHRvIHlvdXIgbXVkbGlicywgaWYgeW91IGhhdmUgbXVjaCBjb2RlIHJlbHlpbmcgb24gdGhhdC4KKyAqLworCisjaWYgISBfX0VGVU5fREVGSU5FRF9fKHNldF9wcm9tcHQpCisKKyNpbmNsdWRlIDxjb25maWd1cmF0aW9uLmg+CisKK3ZhcmFyZ3Mgc3RyaW5nfGNsb3N1cmUgc2V0X3Byb21wdChzdHJpbmd8Y2xvc3VyZXxpbnQgcHJvbXB0LCBvYmplY3Qgb2IpCit7CisgICAgb2IgfHw9IGVmdW46OnRoaXNfcGxheWVyKCk7CisKKyAgICBtaXhlZCBvbGRwcm9tcHQgPSBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKG9iLCBJQ19QUk9NUFQpOworCisgICAgaWYoIWludHAocHJvbXB0KSkKKyAgICAgICAgZWZ1bjo6Y29uZmlndXJlX2ludGVyYWN0aXZlKG9iLCBJQ19QUk9NUFQsIHByb21wdCk7CisKKyAgICByZXR1cm4gb2xkcHJvbXB0OworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NoYWRvdy5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc2hhZG93LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYwOGM3MwotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3NoYWRvdy5jCkBAIC0wLDAgKzEsNTUgQEAKKy8qIFRoZXNlIHNlZnVucyBhcmUgdG8gcHJvdmlkZSBhIHJlcGxhY2VtZW50IGZvciB0aGUgZWZ1biBxdWVyeV9zaGFkb3dpbmcoKQorICogYW5kIHRoZSBvbGQgc2VtYW50aWNzIG9mIHRoZSBlZnVuIHNoYWRvdygpLgorICogRmVlbCBmcmVlIHRvIGFkZCBpdCB0byB5b3VyIG11ZGxpYnMsIGlmIHlvdSBoYXZlIG11Y2ggY29kZSByZWx5aW5nIG9uIHRoYXQuCisgKi8KKworI2lmICEgX19FRlVOX0RFRklORURfXyhxdWVyeV9zaGFkb3dpbmcpCisKKyNpbmNsdWRlIDxvYmplY3RfaW5mby5oPgorCitvYmplY3QgcXVlcnlfc2hhZG93aW5nKG9iamVjdCBvYikKK3sKKyAgICByZXR1cm4gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NIQURPV19QUkVWKTsKK30KKworcHJpdmF0ZSBvYmplY3QgX3NoYWRvdyhvYmplY3Qgb2IsIGludCBmbGFnKQoreworICAgIGlmKGZsYWcpCisgICAgeworICAgICAgICBvYmplY3Qgc2hhZG93ZXIgPSBlZnVuOjpwcmV2aW91c19vYmplY3QoMSk7CisgICAgICAgIGVmdW46OnNldF90aGlzX29iamVjdChzaGFkb3dlcik7CisKKyAgICAgICAgaWYgKGVmdW46OnNoYWRvdyhvYikpCisgICAgICAgICAgICByZXR1cm4gZWZ1bjo6b2JqZWN0X2luZm8oc2hhZG93ZXIsIE9JX1NIQURPV19QUkVWKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSEFET1dfTkVYVCk7Cit9CisjZWxzZQorcHJpdmF0ZSBvYmplY3QgX3NoYWRvdyhvYmplY3Qgb2IsIGludCBmbGFnKQoreworICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KDEpKTsKKyAgcmV0dXJuIGVmdW46OnNoYWRvdyhvYiwgZmxhZyk7Cit9CisjZW5kaWYKKworCitwdWJsaWMgb2JqZWN0IHNoYWRvdyhvYmplY3Qgb2IsIGludCBmbGFnKQoreworICBvYmplY3QgcmVzID0gZnVuY2FsbCgjJ19zaGFkb3csb2IsIGZsYWcpOworICBpZiAoZmxhZykKKyAgICAiL3NlY3VyZS9zaGFkb3dtYXN0ZXIiLT5SZWdpc3RlclNoYWRvdyhwcmV2aW91c19vYmplY3QoKSk7CisgIHJldHVybiByZXM7Cit9CisKK3ByaXZhdGUgdm9pZCBfdW5zaGFkb3coKSB7CisgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoMSkpOworICBlZnVuOjp1bnNoYWRvdygpOworfQorCitwdWJsaWMgdm9pZCB1bnNoYWRvdygpIHsKKyAgZnVuY2FsbCgjJ191bnNoYWRvdyk7CisgICIvc2VjdXJlL3NoYWRvd21hc3RlciItPlVucmVnaXN0ZXJTaGFkb3cocHJldmlvdXNfb2JqZWN0KCkpOworfQpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc2ltdWxfZWZ1bi5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc2ltdWxfZWZ1bi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0ZTBiNzgKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zaW11bF9lZnVuLmMKQEAgLTAsMCArMSwyMDE2IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gc2ltdWxfZWZ1bi5jIC0tIHNpbXVsIGVmdW4ncworLy8KKy8vICRJZDogc2ltdWxfZWZ1bi5jIDc0MDggMjAxMC0wMi0wNiAwMDoyNzoyNVogWmVzc3RyYSAkCisjcHJhZ21hIHN0cmljdF90eXBlcyxzYXZlX3R5cGVzLHJ0dF9jaGVja3MKKyNwcmFnbWEgbm9fY2xvbmUsbm9fc2hhZG93LG5vX2luaGVyaXQKKyNwcmFnbWEgcGVkYW50aWMscmFuZ2VfY2hlY2ssd2Fybl9kZXByZWNhdGVkCisjcHJhZ21hIHdhcm5fZW1wdHlfY2FzdHMsd2Fybl9taXNzaW5nX3JldHVybix3YXJuX2Z1bmN0aW9uX2luY29uc2lzdGVudAorCisvLyBBYnNvbHV0ZSBQZmFkZSBlcmZvcmRlcmxpY2ggLSB6dW0gWmVpdHB1bmt0LCB3byBkZXIgTWFzdGVyIGdlbGFkZW4KKy8vIHdpcmQsIHNpbmQgbm9jaCBrZWluZSBJbmNsdWRlLVBmYWRlIGRhIC4uLgorCisjZGVmaW5lIFNOT09QTE9HRklMRSAiU05PT1AiCisjZGVmaW5lIEFTTk9PUExPR0ZJTEUgIkFSQ0gvU05PT1AiCisKKyNpbmNsdWRlICIvc2VjdXJlL2NvbmZpZy5oIgorI2luY2x1ZGUgIi9zZWN1cmUvd2l6bGV2ZWxzLmgiCisjaW5jbHVkZSAiL3N5cy9zbm9vcGluZy5oIgorI2luY2x1ZGUgIi9zeXMvbGFuZ3VhZ2UuaCIKKyNpbmNsdWRlICIvc3lzL3RoaW5nL3Byb3BlcnRpZXMuaCIKKyNpbmNsdWRlICIvc3lzL3dpemxpc3QuaCIKKyNpbmNsdWRlICIvc3lzL2VycS5oIgorI2luY2x1ZGUgIi9zeXMvbHBjdHlwZXMuaCIKKyNpbmNsdWRlICIvc3lzL2RhZW1vbi5oIgorI2luY2x1ZGUgIi9zeXMvcGxheWVyL2Jhc2UuaCIKKyNpbmNsdWRlICIvc3lzL3RoaW5nL2Rlc2NyaXB0aW9uLmgiCisjaW5jbHVkZSAiL3N5cy9jb250YWluZXIuaCIKKyNpbmNsdWRlICIvc3lzL2RlZmluZXMuaCIKKyNpbmNsdWRlICIvc3lzL3RlbG5ldC5oIgorI2luY2x1ZGUgIi9zeXMvb2JqZWN0aW5mby5oIgorI2luY2x1ZGUgIi9zeXMvZmlsZXMuaCIKKyNpbmNsdWRlICIvc3lzL3N0cmluZ3MuaCIKKyNpbmNsdWRlICIvc3lzL3RpbWUuaCIKKyNpbmNsdWRlICIvc3lzL2xwY3R5cGVzLmgiCisjaW5jbHVkZSAiL3N5cy9ub3RpZnlfZmFpbC5oIgorI2luY2x1ZGUgIi9zeXMvdGxzLmgiCisjaW5jbHVkZSAiL3N5cy9pbnB1dF90by5oIgorI2luY2x1ZGUgIi9zeXMvb2JqZWN0X2luZm8uaCIKKworLyogZnVuY3Rpb24gcHJvdG90eXBlcworICovCitzdHJpbmcgZHRpbWUoaW50IHdhbm4pOwordmFyYXJncyBpbnQgbG9nX2ZpbGUoc3RyaW5nIGZpbGUsIHN0cmluZyB0eHQsIGludCBzaXplX3RvX2JyZWFrKTsKK2ludCBxdWVyeV93aXpfbGV2ZWwobWl4ZWQgcGxheWVyKTsKK25vbWFzayB2YXJhcmdzIGludCBzbm9vcChvYmplY3QgbWUsIG9iamVjdCB5b3UpOwordmFyYXJncyBzdHJpbmcgY291bnRyeShtaXhlZCBpcCwgc3RyaW5nIG51bSk7CitpbnQgcXVlcnlfd2l6X2dycChtaXhlZCB3aXopOworcHVibGljIHZhcmFyZ3Mgb2JqZWN0IGRlZXBfcHJlc2VudChtaXhlZCB3aGF0LCBvYmplY3Qgb2IpOworbm9tYXNrIGludCBzZWN1cmVfbGV2ZWwoKTsKK25vbWFzayBzdHJpbmcgc2VjdXJlX2V1aWQoKTsKK3B1YmxpYyBub21hc2sgaW50IHByb2Nlc3NfY2FsbCgpOworbm9tYXNrIG1peGVkIF9fY3JlYXRlX3BsYXllcl9kdW1teShzdHJpbmcgbmFtZSk7Cit2YXJhcmdzIHN0cmluZyByZXBsYWNlX3BlcnNvbmFsKHN0cmluZyBzdHIsIG1peGVkICpvYnMsIGludCBjYXBzKTsKKworCisvL3JlcGxhY2VtZW50cyBmb3IgZHJvcHBlZCBlZnVucyBpbiBMRAorI2lmICFfX0VGVU5fREVGSU5FRF9fKGV4dHJhY3QpCit2YXJhcmdzIHN0cmluZyBleHRyYWN0KHN0cmluZyBzdHIsIGludCBmcm9tLCBpbnQgdG8pOworI2VuZGlmCisjaWYgIV9fRUZVTl9ERUZJTkVEX18oc2xpY2VfYXJyYXkpCit2YXJhcmdzIG1peGVkIHNsaWNlX2FycmF5KG1peGVkIGFycmF5LCBpbnQgZnJvbSwgaW50IHRvKTsKKyNlbmRpZgorI2lmICFfX0VGVU5fREVGSU5FRF9fKG1lbWJlcl9hcnJheSkKK2ludCBtZW1iZXJfYXJyYXkobWl4ZWQgaXRlbSwgbWl4ZWQgYXJyYXlzdHJpbmcpOworI2VuZGlmCisKKy8vIEluY2x1ZGUgdGhlIGRpZmZlcmVudCBzdWIgJ21vZHVsZXMnIG9mIHRoZSBzaW11bF9lZnVuCisjaW5jbHVkZSBfX0RJUl9fImRlYnVnX2luZm8uYyIKKyNpbmNsdWRlIF9fRElSX18iZW5hYmxlX2NvbW1hbmRzLmMiCisjaW5jbHVkZSBfX0RJUl9fImhhc2guYyIKKyNpbmNsdWRlIF9fRElSX18ib2JqZWN0X2luZm8uYyIKKyNpbmNsdWRlIF9fRElSX18icXVlcnlfZWRpdGluZy5jIgorI2luY2x1ZGUgX19ESVJfXyJxdWVyeV9pZGxlLmMiCisjaW5jbHVkZSBfX0RJUl9fInF1ZXJ5X2lucHV0X3BlbmRpbmcuYyIKKyNpbmNsdWRlIF9fRElSX18icXVlcnlfaXBfbmFtZS5jIgorI2luY2x1ZGUgX19ESVJfXyJxdWVyeV9saW1pdHMuYyIKKyNpbmNsdWRlIF9fRElSX18icXVlcnlfbG9hZF9hdmVyYWdlLmMiCisjaW5jbHVkZSBfX0RJUl9fInF1ZXJ5X211ZF9wb3J0LmMiCisjaW5jbHVkZSBfX0RJUl9fInF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUuYyIKKyNpbmNsdWRlIF9fRElSX18icXVlcnlfc25vb3AuYyIKKyNpbmNsdWRlIF9fRElSX18ic2V0X2hlYXJ0X2JlYXQuYyIKKyNpZiBfX0JPT1RfVElNRV9fIDwgMTQ1NjI2MTg1OQorI2luY2x1ZGUgX19ESVJfXyJzZXRfcHJvbXB0LmMiCisjZW5kaWYKKyNpbmNsdWRlIF9fRElSX18ic2hhZG93LmMiCisjaW5jbHVkZSBfX0RJUl9fImxpdmluZ3MuYyIKKyNpbmNsdWRlIF9fRElSX18iY29tbS5jIgorCisjZGVmaW5lIFRPICAgICAgICBlZnVuOjp0aGlzX29iamVjdCgpCisjZGVmaW5lIFRJICAgICAgICBlZnVuOjp0aGlzX2ludGVyYWN0aXZlKCkKKyNkZWZpbmUgVFAgICAgICAgIGVmdW46OnRoaXNfcGxheWVyKCkKKyNkZWZpbmUgUE8gICAgICAgIGVmdW46OnByZXZpb3VzX29iamVjdCgwKQorI2RlZmluZSBMRVZFTCh4KSBxdWVyeV93aXpfbGV2ZWwoeCkKKyNkZWZpbmUgTkFNRSh4KSAgY2FwaXRhbGl6ZShnZXR1aWQoeCkpCisKKyNkZWZpbmUgREVCVUcoeCkgaWYgKGZpbmRfcGxheWVyKCJ6ZXNzdHJhIikpIFwKKyAgdGVsbF9vYmplY3QoZmluZF9wbGF5ZXIoInplc3N0cmEiKSx4KQorCittaXhlZCBkdGltZV9jYWNoZSA9ICh7LTEsIiJ9KTsKKworI2lmZGVmIElPU1RBVFMKK3N0cnVjdCBpb3N0YXRfcyB7CisgIHN0cmluZyBvbmFtZTsKKyAgaW50IHRpbWU7CisgIGludCBzaXplOworfTsKK21peGVkIHNhdmVvX3N0YXQgPSAoeyAwLGFsbG9jYXRlKDIwMCwgMCkgfSk7CittaXhlZCByZXN0b3Jlb19zdGF0ID0gKHsgMCxhbGxvY2F0ZSgyMDAsMCkgfSk7CisvL21peGVkIHdyaXRlZmlsZV9zdGF0ID0gKHsgMCxhbGxvY2F0ZSgxMDAsKDxpb3N0YXRfcz4pKSB9KTsKKy8vbWl4ZWQgcmVhZGZpbGVfc3RhdCA9ICh7IDAsYWxsb2NhdGUoMTAwLCg8aW9zdGF0X3M+KSkgfSk7CisvL21peGVkIGxvZ19zdGF0ID0gKHsgMCxhbGxvY2F0ZSgxMDAsKDxpb3N0YXRfcz4pKSB9KTsKKworbWl4ZWQgX19faW9zdGF0cyhpbnQgdHlwZSkgeworICBzd2l0Y2godHlwZSkgeworICAgIGNhc2UgMToKKyAgICAgIHJldHVybiBzYXZlb19zdGF0OworICAgIGNhc2UgMjoKKyAgICAgIHJldHVybiByZXN0b3Jlb19zdGF0OworLyogICAgY2FzZSAzOgorICAgICAgcmV0dXJuIHdyaXRlZmlsZV9zdGF0OworICAgIGNhc2UgNDoKKyAgICAgIHJldHVybiByZWFkZmlsZV9zdGF0OworICAgIGNhc2UgNToKKyAgICAgIHJldHVybiBsb2dfc3RhdDsKKyAgICAgICovCisgIH0KKyAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKworLy8gTmljaHQgamVkZXIgTWFnaWVyIG11c3MgZGllIHNpbXVsX2VmdW4gZW50c29yZ2VuIGtvZW5uZW4uCitzdHJpbmcgTm90aWZ5RGVzdHJ1Y3Qob2JqZWN0IGNhbGxlcikgeworICAgIGlmKCAoY2FsbGVyIT10aGlzX29iamVjdCgpICYmICFBUkNIX1NFQ1VSSVRZKSB8fCBwcm9jZXNzX2NhbGwoKSApIHsKKyAgICAgIHJldHVybiAiRHUgZGFyZnN0IGRhcyBzaW11bF9lZnVuIE9iamVrdCBuaWNodCB6ZXJzdG9lcmVuIVxuIjsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3B1YmxpYyBub21hc2sgdm9pZCByZW1vdmVfaW50ZXJhY3RpdmUoIG9iamVjdCBvYiApCit7CisgICAgaWYgKCBvYmplY3RwKG9iKSAmJiBwcmV2aW91c19vYmplY3QoKQorICAgICAgICAmJiBvYmplY3RfbmFtZShwcmV2aW91c19vYmplY3QoKSlbMC4uN10gIT0gIi9zZWN1cmUvIgorICAgICAgICAmJiAoKHByZXZpb3VzX29iamVjdCgpICE9IG9iCisgICAgICAgICAgICAgJiYgKG9iICE9IHRoaXNfcGxheWVyKCkgfHwgb2IgIT0gdGhpc19pbnRlcmFjdGl2ZSgpKSkKKyAgICAgICAgICAgIHx8IChwcmV2aW91c19vYmplY3QoKSA9PSBvYgorICAgICAgICAgICAgICAgJiYgKHRoaXNfcGxheWVyKCkgJiYgdGhpc19wbGF5ZXIoKSAhPSBvYgorICAgICAgICAgICAgICAgICAgIHx8IHRoaXNfaW50ZXJhY3RpdmUoKSAmJiB0aGlzX2ludGVyYWN0aXZlKCkgIT0gb2IpKSApICkKKworICAgICAgIGxvZ19maWxlKCAiUExBWUVSREVTVCIsCisgICAgICAgICAgICAgICAgc3ByaW50ZiggIiVzOiAlTyBhdXNnZWxvZ2d0IHZvbiBQTyAlTywgVEkgJU8sIFRQICVPXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZHRpbWUodGltZSgpKSwgb2IsIHByZXZpb3VzX29iamVjdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgdGhpc19pbnRlcmFjdGl2ZSgpLCB0aGlzX3BsYXllcigpICkgKTsKKworICAgIGVmdW46OnJlbW92ZV9pbnRlcmFjdGl2ZShvYik7Cit9CisKKwordm9pZCBfX191cGRtYXN0ZXIoKQoreworICAgIG9iamVjdCBvYjsKKworICAgIC8vc29sbHRlIG5pY2h0IGplZGVyIGR1ZXJmZW4uCisgICAgaWYgKHByb2Nlc3NfY2FsbCgpIHx8ICFBUkNIX1NFQ1VSSVRZKQorICAgICAgcmFpc2VfZXJyb3IoIklsbGVnYWwgdXNlIG9mIF9fX3VwZG1hc3RlcigpISIpOworCisgICAgd3JpdGUoIlJlbW92aW5nIG9sZCBtYXN0ZXIgLi4uICIpOworICAgIGZvcmVhY2goc3RyaW5nIGZpbGU6IAorICAgICAgICBnZXRfZGlyKCIvc2VjdXJlL21hc3Rlci8qLmMiLEdFVERJUl9OQU1FU3xHRVRESVJfVU5TT1JURUR8R0VURElSX1BBVEgpKSB7CisgICAgICBpZiAob2IgPSBmaW5kX29iamVjdChmaWxlKSkKKyAgICAgICBlZnVuOjpkZXN0cnVjdChvYik7CisgICAgfQorICAgIGVmdW46OmRlc3RydWN0KGVmdW46OmZpbmRfb2JqZWN0KCIvc2VjdXJlL21hc3RlciIpKTsKKyAgICB3cml0ZSgiZG9uZS5cbkxvYWRpbmcgYWdhaW4gLi4uICIpOworICAgIGxvYWRfb2JqZWN0KCIvc2VjdXJlL21hc3RlciIpOworCisgICAgd3JpdGUoImRvbmUuXG4iKTsKK30KKwordmFyYXJncyBzdHJpbmcgY291bnRyeShtaXhlZCBpcCwgc3RyaW5nIG51bSkgeworICBtaXhlZCByZXQ7CisKKyAgaWYocmV0ID0gKHN0cmluZykiL3AvZGFlbW9uL2lwbG9va3VwIi0+Y291bnRyeShudW0gfHwgaXApKSB7CisgICAgcmV0dXJuIHJldDsKKyAgfSBlbHNlIHJldHVybiAiPz8/IjsKK30KKworCisvLyAqIFNub29wZW4gdW5kIHdhcyBkYXp1Z2Vob2VydAorc3RhdGljIG9iamVjdCBmaW5kX3Nub29wZWQob2JqZWN0IHdobykKK3sKKyAgb2JqZWN0ICp1OworICBpbnQgaTsKKworICBmb3IgKGk9c2l6ZW9mKHU9dXNlcnMoKSktMTtpPj0wO2ktLSkKKyAgICBpZiAod2hvPT1lZnVuOjppbnRlcmFjdGl2ZV9pbmZvKHVbaV0sIElJX1NOT09QX05FWFQpKQorICAgICAgcmV0dXJuIHVbaV07CisgIHJldHVybiAwOworfQorCitwcml2YXRlIHN0cmluZyBMY3V0KHN0cmluZyBzdHIpIHsKKyAgcmV0dXJuIHN0cls1Li4xMV0rc3RyWzE4Li5dOworfQorCitub21hc2sgdmFyYXJncyBpbnQgc25vb3AoIG9iamVjdCBtZSwgb2JqZWN0IHlvdSApCit7CisgICAgaW50IHJldDsKKyAgICBvYmplY3Qgc25vb3BlcjAsIHNub29wZXIsIHNub29wZXIyLCBzbm9vcGVyMzsKKworICAgIGlmKCAhb2JqZWN0cChtZSkgfHwgbWUgPT0geW91IHx8ICFQTyApCisgICAgICAgcmV0dXJuIDA7CisKKyAgICBzbm9vcGVyMCA9IGZpbmRfc25vb3BlZChtZSk7CisKKyAgICAgaWYoeW91KXsKKyAgICAgICAgaWYgKCBQTyAhPSBtZSAmJiBxdWVyeV93aXpfZ3JwKG1lKSA+PSBxdWVyeV93aXpfZ3JwKGdldGV1aWQoUE8pKSApCisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBpZiAoIHF1ZXJ5X3dpel9ncnAobWUpIDw9IHF1ZXJ5X3dpel9ncnAoeW91KSAmJgorICAgICAgICAgICAgICEoeW91LT5RdWVyeUFsbG93U25vb3AobWUpKSApCisgICAgICAgICAgICBpZiAoICFJU19ERVBVVFkobWUpIHx8IElTX0FSQ0goeW91KSApCisgICAgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBpZiAoIChzbm9vcGVyID0gZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyh5b3UsIElJX1NOT09QX05FWFQpKSAmJgorICAgICAgICAgICAgIHF1ZXJ5X3dpel9ncnAoc25vb3BlcikgPj0gcXVlcnlfd2l6X2dycChtZSkgKXsKKyAgICAgICAgICAgIGlmICggKGludClzbm9vcGVyLT5RdWVyeVByb3AoUF9TTk9PUEZMQUdTKSAmIFNGX0xPQ0tFRCApCisgICAgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICAgICAgdGVsbF9vYmplY3QoIHNub29wZXIsIHNwcmludGYoICIlcyBzbm9vcGVkIGpldHp0ICVzLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lLT5uYW1lKFdFUiksIHlvdS0+bmFtZShXRVIpICkgKTsKKworICAgICAgICAgICAgc25vb3BlcjIgPSBtZTsKKworICAgICAgICAgICAgd2hpbGUgKCBzbm9vcGVyMyA9IGludGVyYWN0aXZlX2luZm8oc25vb3BlcjIsIElJX1NOT09QX05FWFQpICl7CisgICAgICAgICAgICAgICB0ZWxsX29iamVjdCggc25vb3BlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoICIlcyB3aXJkIHNlaW5lcnNlaXRzIHZvbiAlcyBnZXNub29wZWQuXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxzbm9vcGVyMi0+bmFtZShXRVIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbm9vcGVyMy0+bmFtZShXRU0pICkgKTsKKyAgICAgICAgICAgICAgIHNub29wZXIyID0gc25vb3BlcjM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGVmdW46OnNub29wKCBzbm9vcGVyLCBzbm9vcGVyMiApOworCisgICAgICAgICAgICBpZiAoIGVmdW46OmludGVyYWN0aXZlX2luZm8oc25vb3BlcjIsIElJX1NOT09QX05FWFQpICE9IHNub29wZXIgKQorICAgICAgICAgICAgICAgdGVsbF9vYmplY3QoIHNub29wZXIsIHNwcmludGYoICJEdSBrYW5uc3QgJXMgbmljaHQgc25vb3Blbi5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbm9vcGVyMi0+bmFtZShXRU4pICkgKTsKKyAgICAgICAgICAgIGVsc2V7CisgICAgICAgICAgICAgICB0ZWxsX29iamVjdCggc25vb3Blciwgc3ByaW50ZiggIkR1IHNub29wc3QgamV0enQgJXMuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25vb3BlcjItPm5hbWUoV0VOKSApICk7CisgICAgICAgICAgICAgICBpZiAoICFJU19ERVBVVFkoc25vb3BlcikgKXsKKyAgICAgICAgICAgICAgICAgICBsb2dfZmlsZSggU05PT1BMT0dGSUxFLCBzcHJpbnRmKCIlczogJU8gJU8gJU9cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0aW1lKHRpbWUoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNub29wZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNub29wZXIyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudChzbm9vcGVyMikgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAwMDAgKTsKKyAgICAgICAgICAgICAgICAgICBpZiAoc25vb3BlcjApCisgICAgICAgICAgICAgICAgICAgICAgQ0hNQVNURVItPnNlbmQoICJTbm9vcCIsIHNub29wZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCAiJXMgKk9GRiogJXMgKCVPKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUoZ2V0dWlkKHNub29wZXIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShnZXR1aWQoc25vb3BlcjApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQoc25vb3BlcjApICkgKTsKKworICAgICAgICAgICAgICAgICAgIENITUFTVEVSLT5zZW5kKCAiU25vb3AiLCBzbm9vcGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZigiJXMgLT4gJXMgKCVPKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShnZXR1aWQoc25vb3BlcikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUoZ2V0dWlkKHNub29wZXIyKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQoc25vb3BlcjIpKSk7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICBlbHNleworICAgICAgICAgICAgICAgICAgIGxvZ19maWxlKCBBU05PT1BMT0dGSUxFLCBzcHJpbnRmKCAiJXM6ICVPICVPICVPXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0aW1lKHRpbWUoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25vb3BlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbm9vcGVyMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudChzbm9vcGVyMikgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICwxMDAwMDAgKTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBpZiAoc25vb3BlcikKKyAgICAgICAgICAgICAgIGlmICggIW1lLT5RdWVyeVByb3AoUF9TTk9PUEZMQUdTKSAmIFNGX0xPQ0tFRCApeworICAgICAgICAgICAgICAgICAgIHByaW50ZiggIiVzIHdpcmQgYmVyZWl0cyB2b24gJXMgZ2Vzbm9vcGVkLiBCZW51dHplIGRhcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJcImZcIi1GbGFnLCB3ZW5uIGR1IGRlbm5vY2ggc25vb3BlbiB3aWxsc3QuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICB5b3UtPm5hbWUoV0VSKSwgc25vb3Blci0+bmFtZShXRU0pICk7CisgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICB9CisKKyAgICAgICAgcmV0ID0gZWZ1bjo6c25vb3AoIG1lLCB5b3UgKTsKKworICAgICAgICBpZiAoICFJU19ERVBVVFkobWUpICYmIGVmdW46OmludGVyYWN0aXZlX2luZm8oeW91LCBJSV9TTk9PUF9ORVhUKSA9PSBtZSl7CisgICAgICAgICAgICBsb2dfZmlsZSggU05PT1BMT0dGSUxFLCBzcHJpbnRmKCAiJXM6ICVPICVPICVPXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMY3V0KGR0aW1lKHRpbWUoKSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZSwgeW91LCBlbnZpcm9ubWVudCh5b3UpICksCisgICAgICAgICAgICAgICAgICAgICAxMDAwMDAgKTsKKworICAgICAgICAgICAgaWYgKHNub29wZXIwKQorICAgICAgICAgICAgICAgQ0hNQVNURVItPnNlbmQoICJTbm9vcCIsIG1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCAiJXMgKk9GRiogJXMgKCVPKS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUoZ2V0dWlkKG1lKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShnZXR1aWQoc25vb3BlcjApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudChzbm9vcGVyMCkgKSApOworCisgICAgICAgICAgICBDSE1BU1RFUi0+c2VuZCggIlNub29wIiwgbWUsIHNwcmludGYoICIlcyAtPiAlcyAoJU8pLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBpdGFsaXplKGdldHVpZChtZSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShnZXR1aWQoeW91KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudCh5b3UpICkgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNleworICAgICAgICAgICAgaWYgKCBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKHlvdSwgSUlfU05PT1BfTkVYVCkgPT0gbWUgKXsKKyAgICAgICAgICAgICAgIGxvZ19maWxlKCBBU05PT1BMT0dGSUxFLCBzcHJpbnRmKCAiJXM6ICVPICVPICVPXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGN1dChkdGltZSh0aW1lKCkpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lLCB5b3UsIGVudmlyb25tZW50KHlvdSkgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAwMCApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCByZXQgJiYgcXVlcnlfd2l6X2dycChtZSkgPD0gcXVlcnlfd2l6X2dycCh5b3UpICYmCisgICAgICAgICAgICAgIUlTX0RFUFVUWShtZSkgKQorICAgICAgICAgICAgdGVsbF9vYmplY3QoIHlvdSwgIioqKiAiICsgTkFNRShtZSkgKyAiIHNub29wdCBEaWNoIVxuIiApOworCisgICAgICAgIHJldHVybiByZXQ7CisgICAgIH0KKyAgICAgZWxzZSB7CisgICAgICAgIGlmICggKG1lID09IFBPIHx8CisgICAgICAgICAgICAgIHF1ZXJ5X3dpel9ncnAoZ2V0ZXVpZChQTykpID4gcXVlcnlfd2l6X2dycChtZSkgfHwKKyAgICAgICAgICAgICAgKHF1ZXJ5X3dpel9ncnAoZ2V0ZXVpZChQTykpID09IHF1ZXJ5X3dpel9ncnAobWUpICYmCisgICAgICAgICAgICAgIGVmdW46OmludGVyYWN0aXZlX2luZm8oUE8sIElJX1NOT09QX05FWFQpID09IG1lKSkgJiYgc25vb3BlcjAgKXsKKyAgICAgICAgICAgIGlmICggIUlTX0RFUFVUWShtZSkgKXsKKyAgICAgICAgICAgICAgIGxvZ19maWxlKCBTTk9PUExPR0ZJTEUsIHNwcmludGYoICIlczogJU8gJU8gJU8gKk9GRipcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExjdXQoZHRpbWUodGltZSgpKSksIG1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbm9vcGVyMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQoc25vb3BlcjApICksCisgICAgICAgICAgICAgICAgICAgICAgICAxMDAwMDAgKTsKKworICAgICAgICAgICAgICAgIENITUFTVEVSLT5zZW5kKCAiU25vb3AiLCBtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoICIlcyAqT0ZGKiAlcyAoJU8pLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUoZ2V0dWlkKG1lKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUoZ2V0dWlkKHNub29wZXIwKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50KHNub29wZXIwKSApICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNleworICAgICAgICAgICAgICAgbG9nX2ZpbGUoIEFTTk9PUExPR0ZJTEUsIHNwcmludGYoICIlczogJU8gJU8gJU8gKk9GRipcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMY3V0KGR0aW1lKHRpbWUoKSkpLCBtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNub29wZXIwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQoc25vb3BlcjApICksCisgICAgICAgICAgICAgICAgICAgICAgICAxMDAwMDAgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGVmdW46OnNub29wKG1lKTsKKyAgICAgICAgfQorICAgICB9CisgICAgIHJldHVybiAwOworfQorCisKKworLy8gKiBFbXVsYXRpb24gZGVzICdhbHRlbicgZXhwbG9kZSBkdXJjaCBkYXMgbmV1ZQorc3RyaW5nICpvbGRfZXhwbG9kZShzdHJpbmcgc3RyLCBzdHJpbmcgZGVsKSB7CisgIGludCBzLCB0OworICBzdHJpbmcgKnN0cnM7CisKKyAgaWYgKCFzdHJpbmdwKHN0cikpIHsKKyAgICAgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CisgICAgICByYWlzZV9lcnJvcihzcHJpbnRmKAorICAgICAgICAgIkludmFsaWQgYXJndW1lbnQgMSB0byBvbGRfZXhwbG9kZSgpISBFeHBlY3RlZCA8c3RyaW5nPiwgZ290OiAiCisgICAgICAgICAiJS4zME9cbiIsc3RyKSk7CisgIH0KKyAgaWYgKCFzdHJpbmdwKGRlbCkpIHsKKyAgICAgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CisgICAgICByYWlzZV9lcnJvcihzcHJpbnRmKAorICAgICAgICAgIkludmFsaWQgYXJndW1lbnQgMiB0byBvbGRfZXhwbG9kZSgpISBFeHBlY3RlZCA8c3RyaW5nPiwgZ290OiAiCisgICAgICAgICAiJS4zME9cbiIsZGVsKSk7CisgIH0KKyAgaWYoZGVsID09ICIiKQorICAgIHJldHVybiAoe3N0cn0pOworICBzdHJzPWVmdW46OmV4cGxvZGUoc3RyLCBkZWwpOworICB0PXNpemVvZihzdHJzKS0xOworICB3aGlsZShzPD10ICYmIHN0cnNbcysrXSA9PSAiIik7cy0tOworICB3aGlsZSh0Pj0wICYmIHN0cnNbdC0tXSA9PSAiIik7dCsrOworICBpZihzPD10KQorICAgIHJldHVybiBzdHJzW3MuLnRdOworICByZXR1cm4gKHt9KTsKK30KKworaW50IGZpbGVfdGltZShzdHJpbmcgcGF0aCkgeworICBtaXhlZCAqdjsKKworICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOworICBpZiAoc2l6ZW9mKHY9Z2V0X2RpcihwYXRoLEdFVERJUl9EQVRFUykpKSByZXR1cm4gdlswXTsKKyAgcmV0dXJuKDApOyAvL3NvbnN0Cit9CisKKy8vICogQmVpIDUwayBHcm9lc3NlIExvZy1GaWxlIHJvdGllcmVuCit2YXJhcmdzIGludCBsb2dfZmlsZShzdHJpbmcgZmlsZSwgc3RyaW5nIHR4dCwgaW50IHNpemVfdG9fYnJlYWspIHsKKyAgbWl4ZWQgKnN0OworCisgIGZpbGU9Ii9sb2cvIitmaWxlOworICBmaWxlPWltcGxvZGUoKGVmdW46OmV4cGxvZGUoZmlsZSwiLyIpLSh7Ii4uIn0pKSwiLyIpOworLy8gIHRlbGxfb2JqZWN0KGZpbmRfcGxheWVyKCJqb2YiKSxzcHJpbnRmKCJMT0cgRklMRTogJU8gLT4gJU9cbiIscHJldmlvdXNfb2JqZWN0KCksZmlsZSkpOworICBpZiAoIWZ1bmNhbGwoYmluZF9sYW1iZGEoIydlZnVuOjpjYWxsX290aGVyLFBPKSwic2VjdXJlL21hc3RlciIsLy8nKQorICAgICAgICAgICAgICAidmFsaWRfd3JpdGUiLGZpbGUsZ2V0ZXVpZChQTyksImxvZ19maWxlIixQTykpCisgICAgICByZXR1cm4gMDsKKyAgaWYgKCBzaXplX3RvX2JyZWFrID49IDAgJiAoCisgICAgICBzaXplb2Yoc3QgPSBnZXRfZGlyKGZpbGUsMikgKSAmJiBzdFswXSA+PSAoc2l6ZV90b19icmVha3xNQVhfTE9HX1NJWkUpKSkKKyAgICAgIGNhdGNoKHJlbmFtZShmaWxlLCBmaWxlICsgIi5vbGQiKTtwdWJsaXNoKTsgLyogTm8gcGFuaWMgaWYgZmFpbHVyZSAqLworICByZXR1cm4od3JpdGVfZmlsZShmaWxlLHR4dCkpOworfQorCisvLyAqIE1hZ2llci1MZXZlbCBhYmZyYWdlbgoraW50IHF1ZXJ5X3dpel9sZXZlbChtaXhlZCBwbGF5ZXIpIHsKKyAgcmV0dXJuIChpbnQpIi9zZWN1cmUvbWFzdGVyIi0+cXVlcnlfd2l6X2xldmVsKHBsYXllcik7Cit9CisKKyNpZmRlZiBfX0FMSVNUU19fCisvLyAqIEVsZW1lbnQgYXVzIEFsaXN0IGxvZXNjaGVuIChieSBrZXkpCittaXhlZCAqcmVtb3ZlX2FsaXN0KG1peGVkIGtleSxtaXhlZCAqYWxpc3QpCit7CisgIGludCBpLGo7CisKKyAgaWYgKCFwb2ludGVycChhbGlzdCkgfHwgIXNpemVvZihhbGlzdCkpCisgICAgcmV0dXJuIGFsaXN0OworICBpZiAoIXBvaW50ZXJwKGFsaXN0WzBdKSkKKyAgeworICAgIGlmICgoaT1hc3NvYyhrZXksYWxpc3QpKTwwKQorICAgICAgcmV0dXJuIGFsaXN0OworICAgIHJldHVybiBhbGlzdFswLi5pLTFdK2FsaXN0W2krMS4uXTsKKyAgfQorICBpID0gYXNzb2Moa2V5LGFsaXN0WzBdKTsKKyAgaWYgKChpPWFzc29jKGtleSxhbGlzdFswXSkpPDApCisgICAgcmV0dXJuIGFsaXN0OworICBhbGlzdD1hbGlzdFswLi5dOworICBmb3IgKGo9c2l6ZW9mKGFsaXN0KS0xO2o+PTA7ai0tKQorICAgIGFsaXN0W2pdPWFsaXN0W2pdWzAuLmktMV0rYWxpc3Rbal1baSsxLi5dOworICByZXR1cm4gYWxpc3Q7Cit9CisKKy8vICogRWxlbWVudCBhdXMgQWxpc3QgbG9lc2NoZW4gKGJ5IHBvcykKK21peGVkICpleGNsdWRlX2FsaXN0KGludCBpLG1peGVkICphbGlzdCkKK3sKKyAgaW50IGo7CisgIGlmICghcG9pbnRlcnAoYWxpc3QpIHx8ICFzaXplb2YoYWxpc3QpIHx8IGk8MCkKKyAgICByZXR1cm4gYWxpc3Q7CisgIGlmICghcG9pbnRlcnAoYWxpc3RbMF0pKQorICAgIHJldHVybiBhbGlzdFswLi5pLTFdK2FsaXN0W2krMS4uXTsKKyAgYWxpc3Q9YWxpc3RbMC4uXTsgLyogQ3JlYXRlIFBIWVNJQ0FMIGNvcHkgb2YgYWxpc3QgKi8KKyAgZm9yIChqPXNpemVvZihhbGlzdCktMTtqPj0wO2otLSkKKyAgICBhbGlzdFtqXT1hbGlzdFtqXVswLi5pLTFdK2FsaXN0W2pdW2krMS4uXTsKKyAgcmV0dXJuIGFsaXN0OyAvKiBvcmRlcl9hbGlzdCBpcyBOT1QgbmVjZXNzYXJ5IC0gc2VlIC9kb2MvTFBDL2FsaXN0ICovCit9CisjZW5kaWYgLy8gX19BTElTVFNfXworCisvLyAqIEdlcm1hbiB2ZXJzaW9uIG9mIGN0aW1lKCkKKyNkZWZpbmUgVEFHRSAoeyJTb24iLCJNb24iLCJEaWUiLCJNaXQiLCJEb24iLCJGcmUiLCJTYW0ifSkKKyNkZWZpbmUgTU9OQVRFICh7IkphbiIsIkZlYiIsIk1hciIsIkFwciIsIk1haSIsIkp1biIsIkp1bCIsIkF1ZyIsXAorICAgICAgICAgICAgICAgICAiU2VwIiwiT2t0IiwiTm92IiwiRGV6In0pCitzdHJpbmcgZHRpbWUoaW50IHdhbm4pIHsKKyAgCisgIGlmICh3YW5uID09IGR0aW1lX2NhY2hlWzBdKQorICAgIHJldHVybihkdGltZV9jYWNoZVsxXSk7CisKKyAgaW50ICpsdCA9IGxvY2FsdGltZSh3YW5uKTsKKyAgcmV0dXJuIHNwcmludGYoIiVzLCAlMmQuICVzICVkLCAlMDJkOiUwMmQ6JTAyZCIsCisgICAgICBUQUdFW2x0W1RNX1dEQVldXSwgbHRbVE1fTURBWV0sIE1PTkFURVtsdFtUTV9NT05dXSwgCisgICAgICBsdFtUTV9ZRUFSXSxsdFtUTV9IT1VSXSwgbHRbVE1fTUlOXSwgbHRbVE1fU0VDXSk7Cit9CisKKy8vIHdlbm4gc3RyZnRpbWUgaW0gRHJpdmVyIG5pY2h0IGV4aXN0aWVydCwgaXN0IGRpZXMgaGllciBlaW4gQWxpYXMgYXVmIGR0aW1lKCksCisvLyB6d2FyIHN0aW1tdCBkYXMgRm9ybWF0IGRhbm4gbmljaHQsIGFiZXIgZGllIE11ZGxpYiBidWdndCBuaWNodCB1bmQgc2NocmVpYnQKKy8vIGVpbiBvcmRlbnRsaWNoZXMgRGF0dW0vVWhyemVpdC4KKyNpZiAhX19FRlVOX0RFRklORURfXyhzdHJmdGltZSkKK3ZhcmFyZ3Mgc3RyaW5nIHN0cmZ0aW1lKG1peGVkIGZtdCwgaW50IGNsb2NrLCBpbnQgbG9jYWxpemVkKSB7CisgIGlmIChpbnRwKGNsb2NrKSAmJiBjbG9jayA+PSAwKQorICAgIHJldHVybiBkdGltZShjbG9jayk7CisgIGVsc2UgaWYgKGludHAoZm10KSAmJiBmbXQgPj0gMCkKKyAgICByZXR1cm4gZHRpbWUoZm10KTsKKyAgCisgIHJldHVybiBkdGltZSh0aW1lKCkpOworfQorI2VuZGlmIC8vIV9fRUZVTl9ERUZJTkVEX18oc3RyZnRpbWUpCisKKy8vICogU2h1dGRvd24gbWl0IHp1c2FldHpsaWNoZW0gbG9nZ2luZworbm9tYXNrIGludCBzaHV0ZG93bihzdHJpbmcgcmVhc29uKQoreworICBzdHJpbmcgbmFtZTsKKyAgc3RyaW5nIG9ibmFtZTsKKyAgc3RyaW5nIG91dHB1dDsKKworICBpZiAoIXJlYXNvbikKKyAgICByZXR1cm4gMDsKKyAgaWYgKCAhQVJDSF9TRUNVUklUWSAmJiBnZXR1aWQocHJldmlvdXNfb2JqZWN0KCkpIT1ST09USUQgJiYKKyAgICAgICAgICBvYmplY3RfbmFtZShwcmV2aW91c19vYmplY3QoKSkhPSIvb2JqL3NodXQiICkKKyAgeworICAgIHdyaXRlKCJZb3UgaGF2ZSBubyBwZXJtaXNzaW9uIHRvIHNodXQgZG93biB0aGUgZ2FtZWRyaXZlciFcbiIpOworICAgIHJldHVybiAwOworICB9CisgIGlmICgodGhpc19pbnRlcmFjdGl2ZSgpKSYmKG5hbWU9Z2V0dWlkKHRoaXNfaW50ZXJhY3RpdmUoKSkpKQorICB7CisgICAgbmFtZT1jYXBpdGFsaXplKG5hbWUpOworICAgIGZpbHRlcih1c2VycygpLCMndGVsbF9vYmplY3QsLy8nCisgICAgICAgICAgICAgICBjYXBpdGFsaXplKG5hbWUpKyIgZmFlaHJ0IGRhcyBTcGllbCBoZXJ1bnRlciFcbiIpOworICB9CisgIGVsc2UKKyAgICBuYW1lPSJBTk9OWU1PVVMiOworICBpZiAocHJldmlvdXNfb2JqZWN0KCkpIG9ibmFtZT1jYXBpdGFsaXplKGdldHVpZChwcmV2aW91c19vYmplY3QoKSkpOworICBvdXRwdXQ9bmFtZTsKKyAgaWYgKG9ibmFtZSAmJiBuYW1lIT1vYm5hbWUpIG91dHB1dD1vdXRwdXQrIiAoIitvYm5hbWUrIikiOworICBpZiAocHJldmlvdXNfb2JqZWN0KCkmJm9iamVjdF9uYW1lKHByZXZpb3VzX29iamVjdCgpKT09Ii9vYmovc2h1dCIpeworICAgIG91dHB1dCs9IiBmYWVocnQgZGFzIFNwaWVsIHZpYSBBcm1hZ2VkZG9uIGhlcnVudGVyLlxuIjsKKyAgICBvdXRwdXQ9ZHRpbWUodGltZSgpKSsiOiAiK291dHB1dDsKKyAgICBsb2dfZmlsZSgiR0FNRV9MT0ciLG91dHB1dCsiXG4iLC0xKTsKKyAgICBlZnVuOjpzaHV0ZG93bigpOworICAgIHJldHVybiAxOworICB9CisgIG91dHB1dD1jdGltZSh0aW1lKCkpKyI6ICIrb3V0cHV0KyIgZmFlaHJ0IGRhcyBTcGllbCBoZXJ1bnRlci5cbiI7CisgIG91dHB1dCs9IiAgICBHcnVuZDogIityZWFzb247CisgIGxvZ19maWxlKCJHQU1FX0xPRyIsb3V0cHV0KyJcbiIsLTEpOworICBlZnVuOjpzaHV0ZG93bigpOworICByZXR1cm4gMTsKK30KKworLy8gKiBsb3dlcmNoYXIKKworaW50IGxvd2VyY2hhcihpbnQgY2hhcikgeworICBpZiAoY2hhcjwnQScgfHwgY2hhcj4nWicpIHJldHVybiBjaGFyOworICByZXR1cm4gY2hhciszMjsKK30KKworLy8gKiB1cHBlcnN0cmluZworCitzdHJpbmcgdXBwZXJzdHJpbmcoc3RyaW5nIHMpCit7CisjaWYgX19FRlVOX0RFRklORURfXyh1cHBlcl9jYXNlKQorICByZXR1cm4odXBwZXJfY2FzZShzKSk7CisjZWxzZQorICBpbnQgaTsKKyAgaWYgKCFzdHJpbmdwKHMpKSByZXR1cm4gMDsKKyAgZm9yIChpPXNpemVvZihzKS0xO2k+PTA7aS0tKSBzW2ldPSgoc1tpXTwnYSd8fHNbaV0+J3onKT9zW2ldOnNbaV0tMzIpOworICByZXR1cm4gczsKKyNlbmRpZgorfQorCisvLyAqIGxvd2Vyc3RyaW5nCisKK3N0cmluZyBsb3dlcnN0cmluZyhzdHJpbmcgcykKK3sKKyAgaWYgKCFzdHJpbmdwKHMpKSByZXR1cm4gMDsKKyAgcmV0dXJuIGxvd2VyX2Nhc2Uocyk7Cit9CisKKworLy8gKiBHRCB2ZXJzaW9uCitzdHJpbmcgdmVyc2lvbigpCit7CisgIHJldHVybiBfX1ZFUlNJT05fXzsKK30KKworLy8gKiBicmVha19zdHJpbmcKKy8vIHN0cmV0Y2goKSAtLSBzdHJldGNoIGEgbGluZSB0byBmaWxsIGEgZ2l2ZW4gd2lkdGggCitwcml2YXRlIHN0cmluZyBzdHJldGNoKHN0cmluZyBzLCBpbnQgd2lkdGgpIHsKKyAgaW50IGxlbj1zaXplb2Yocyk7CisgIGlmIChsZW49PXdpZHRoKSByZXR1cm4gczsKKworICAvLyByZWluZSBMZWVyemVpbGVuLCBkaXJla3QgenVydWVja2dlYmVuCisgIHN0cmluZyB0cmltbWVkPXRyaW0ocyxUUklNX0xFRlQsIiAiKTsKKyAgaWYgKHRyaW1tZWQ9PSIiKSByZXR1cm4gczsgCisgIGludCBzdGFydF9zcGFjZXMgPSBsZW4gLSBzaXplb2YodHJpbW1lZCk7CisKKyAgc3RyaW5nKiB3b3JkcyA9IGV4cGxvZGUodHJpbW1lZCwgIiAiKTsKKyAgLy8gZGVyIGxldHp0ZSBrcmllZ3Qga2VpbmUgU3BhY2VzCisgIGludCB3b3JkX2NvdW50PXNpemVvZih3b3JkcykgLSAxOworICAvLyB3ZW5uIFplaWxlIG51ciBhdXMgZWluZW0gV29ydCwgd2lyZCBkYXMgV29ydCB6dXJ1ZWNrZ2VnZWJlbgorICBpZiAoIXdvcmRfY291bnQpCisgICAgcmV0dXJuICIgIipzdGFydF9zcGFjZXMgKyB3b3Jkc1swXTsKKworICBpbnQgc3BhY2VfY291bnQgPSB3aWR0aCAtIGxlbjsKKworICBpbnQgc3BhY2VfcGVyX3dvcmQ9KHdvcmRfY291bnQrc3BhY2VfY291bnQpIC8gd29yZF9jb3VudDsKKyAgLy8gQW56LldvZXJ0ZXIgbWl0IFp1c2F0ei1TcGFjZQorICBpbnQgcmVzdD0od29yZF9jb3VudCtzcGFjZV9jb3VudCkgJSB3b3JkX2NvdW50OyAKKyAgLy8gUmVzdC1TcGFjZXMgVmVydGVpbGVuCisgIGZvcmVhY2ggKGludCBwb3MgOiByZXN0KSB3b3Jkc1twb3NdKz0iICI7CisgIHJldHVybiAoIiAiKnN0YXJ0X3NwYWNlcykgKyBpbXBsb2RlKCB3b3JkcywgIiAiKnNwYWNlX3Blcl93b3JkICk7Cit9CisKKy8vIGF1cyBHZXNjaHdpbmRpZ2tlaXRzZ3J1ZW5kZW4gaGF0IGRlciBCbG9ja3NhdHogZnVlciBicmVha19zdHJpbmcgZWluZQorLy8gZWlnZW5lIEZ1bmt0aW9uIGJla29tbWVuOgorcHJpdmF0ZSB2YXJhcmdzIHN0cmluZyBibG9ja19zdHJpbmcoc3RyaW5nIHMsIGludCB3aWR0aCwgaW50IGZsYWdzKSB7CisgIC8vIHdlbm4gQlNfTEVBVkVfTVlfTEZTLCBhYmVyIGtlaW4gQlNfTk9fUEFSSU5ERU5ULCBkYW5uIHdlcmRlbiBaZWlsZW4gbWl0CisgIC8vIGVpbmVtIExlZXJ6ZWljaGVuIGJlZ29ubmVuLgorICAvLyBCVFc6IFdlbm4gIUJTX0xFQVZFX01ZX0xGUywgaGF0IGRlciBBdWZydWZlciBiZXJlaXRzIGFsbGUgXG4gZHVyY2ggIiAiCisgIC8vIGVyc2V0enQuCisgIGlmICggKGZsYWdzICYgQlNfTEVBVkVfTVlfTEZTKQorICAgICAgJiYgIShmbGFncyAmIEJTX05PX1BBUklOREVOVCkpCisgIHsKKyAgICAgIHMgPSAiICIrcmVncmVwbGFjZShzLCJcbiIsIlxuICIsMSk7CisgIH0KKworICAvLyBzcHJpbnRmIGZ1ZWxsdCBkaWUgbGV0enRlIFplaWxlIGF1ZiBkaWUgRmVsZGJyZWl0ZSAoaGllciBhbHNvCisgIC8vIFplaWxlbmJyZWl0ZSkgbWl0IEZ1ZWxsemVpY2hlbiBhdWYsIHdlbm4gc2llIE5JQ0hUIG1pdCBcbiB1bWdlYnJvY2hlbgorICAvLyBpc3QuIEVzIHdpcmQgYW4gZGllIGxldHp0ZSBaZWlsZSBhYmVyIGtlaW4gWmVpbGVudW1icnVjaCBhbmdlaGFlbmd0LgorICAvLyBFaWdlbnRsaWNoIGlzdCBkYXMgQXVmZnVlbGxlbiBkb29mLCBhYmVyIHZlcm11dGxpY2ggaXN0IGVzIHVubm9ldGlnLCBlcworICAvLyB3aWVkZXIgcnVlY2tnYWVuZ2lnIHp1IG1hY2hlbi4KKyAgcyA9IHNwcmludGYoICIlLSo9cyIsIHdpZHRoLCBzKTsKKworICBzdHJpbmcgKnRtcD1leHBsb2RlKHMsICJcbiIpOworICAvLyBOdXIgd2VubiBzIG1laHJ6ZWlsaWcgaXN0LCBCbG9ja3NhdHogZHJhdXMgbWFjaGVuLiBEaWUgbGV0enRlIFplaWxlIHdpcmQKKyAgLy8gbmF0dWVybGljaCBuaWNodCBnZWRlaG50LiBTaWUgaXN0IGRhZnVlciBzY2hvbiB2b24gc3ByaW50ZigpIGF1ZmdlZnVlbGx0CisgIC8vIHdvcmRlbi4gQlRXOiBEaWUgbGV0enRlIFplaWxlIGVuZGV0IHUuVS4gbm9jaCBuaWNodCBtaXQgZWluZW0gXG4gKGJ6dy4KKyAgLy8gbnVyIGRhbm4sIHdlbm4gQlNfTEVBVkVfTVlfTEZTIHVuZCBkZXIgdWViZXJnZWJlbmUgVGV4dCBzY2hvbiBuZW4gXG4gYW0KKyAgLy8gRW5kZSBkZXIgbGV0enRlbiBaZWlsZSBoYXQpLCBkYXMgbWFjaHQgZGVyIEF1ZnJ1ZmVyLi4uCisgIGlmIChzaXplb2YodG1wKSA+IDEpCisgICAgcmV0dXJuIGltcGxvZGUoIG1hcCggdG1wWzAuLjwyXSwgIydzdHJldGNoLyonKi8sIHdpZHRoICksICJcbiIgKSAKKyAgICAgICsgIlxuIiArIHRtcFs8MV07CisKKyAgcmV0dXJuIHM7Cit9CisKK3B1YmxpYyB2YXJhcmdzIHN0cmluZyBicmVha19zdHJpbmcoc3RyaW5nIHMsIGludCB3LCBtaXhlZCBpbmRlbnQsIGludCBmbGFncykKK3sKKyAgICBpZiAoICFzIHx8IHMgPT0gIiIgKSByZXR1cm4gIiI7CisKKyAgICBpZiAoICF3ICkgdz03ODsKKworICAgIGlmKCBpbnRwKGluZGVudCkgKQorICAgICAgIGluZGVudCA9IGluZGVudCA/ICIgIippbmRlbnQgOiAiIjsKKworICAgIGludCBpbmRlbnRsZW49c3RyaW5ncChpbmRlbnQpID8gc2l6ZW9mKGluZGVudCkgOiAwOworCisgICAgaWYgKGluZGVudGxlbj53KSB7CisgICAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOworICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigiYnJlYWtfc3RyaW5nOiBpbmRlbnQgbG9uZ2VyICVkIHRoYW4gd2lkdGggJWRcbiIsCisgICAgICAgICAgICAgICAgICBpbmRlbnRsZW4sdykpOworICAgICAgLy8gdz0oKGluZGVudGxlbi93KSsxKSp3OworICAgIH0KKworICAgIGlmICghKGZsYWdzICYgQlNfTEVBVkVfTVlfTEZTKSkgCisgICAgICBzPXJlZ3JlcGxhY2UoIHMsICJcbiIsICIgIiwgMSApOworCisgICAgaWYgKCBmbGFncyAmIEJTX1NJTkdMRV9TUEFDRSApCisgICAgICAgcyA9IHJlZ3JlcGxhY2UoIHMsICIoXnxcbnwgKSAgKiIsICJcXDEiLCAxICk7CisgCisgICAgc3RyaW5nIHByZWZpeD0iIjsKKyAgICBpZiAoaW5kZW50bGVuICYmIGZsYWdzICYgQlNfUFJFUEVORF9JTkRFTlQpIHsKKyAgICAgIGlmIChpbmRlbnRsZW4rc2l6ZW9mKHMpID4gdyB8fCAKKyAgICAgICAgIChmbGFncyAmIEJTX0xFQVZFX01ZX0xGUykgJiYgc3Ryc3RyKHMsIlxuIik+LTEpIHsKKyAgICAgICBwcmVmaXg9aW5kZW50KyJcbiI7CisgICAgICAgaW5kZW50PShmbGFncyAmIEJTX05PX1BBUklOREVOVCkgPyAiIiA6ICIgIjsKKyAgICAgICBpbmRlbnRsZW49c2l6ZW9mKGluZGVudCk7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKCBmbGFncyAmIEJTX0JMT0NLICkgeworICAgICAgLyoKKyAgICAgICAgICAgcyA9IGltcGxvZGUoIG1hcCggZXhwbG9kZSggcywgIlxuIiApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMnYmxvY2tfc3RyaW5nLCB3LCBpbmRlbnRsZW4sIGZsYWdzKSwKKyAgICAgICAgICAgICAgICAgICAgICAiIiApOworICAgICAgKi8KKyAgICAgIHMgPSBibG9ja19zdHJpbmcoIHMgLCB3IC0gaW5kZW50bGVuLCBmbGFncyApOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIHMgPSBzcHJpbnRmKCIlLTEuKj1zIix3LWluZGVudGxlbixzKTsKKyAgICB9CisgICAgaWYgKCBzWzwxXSAhPSAnXG4nICkgcyArPSAiXG4iOworCisgICAgaWYgKCAhaW5kZW50bGVuICkgcmV0dXJuIHByZWZpeCArIHM7CisgICAgCisgICAgc3RyaW5nIGluZGVudDIgPSAoIGZsYWdzICYgQlNfSU5ERU5UX09OQ0UgKSA/ICgiICIqaW5kZW50bGVuKSA6aW5kZW50OworICAgICAgCisgICAgcmV0dXJuIHByZWZpeCArIGluZGVudCArIAorICAgICAgcmVncmVwbGFjZSggc1swLi48Ml0sICJcbiIsICJcbiIraW5kZW50MiwgMSApICsgIlxuIjsKKyAgICAgIC8qCisgICAgICAgc3RyaW5nICpidWY7CisKKyAgICAgICBidWYgPSBleHBsb2RlKCBzLCAiXG4iICk7CisgICAgICAgcmV0dXJuIHByZWZpeCArIGluZGVudCArIGltcGxvZGUoIGJ1ZlswLi48Ml0sICJcbiIraW5kZW50MiApICsgYnVmWzwxXSArICJcbiI7CisgICAgICAqLworfQorCisvLyAqIEVsZW1lbnRlIGF1cyBtYXBwaW5nIGxvZXNjaGVuIC0gbWFwcGluZyB2b3JoZXIga29waWVyZW4KKworbWFwcGluZyBtX2NvcHlfZGVsZXRlKG1hcHBpbmcgbSwgbWl4ZWQga2V5KSB7CisgIHJldHVybiBtX2RlbGV0ZShjb3B5KG0pLCBrZXkpOworfQorCisvLyAqIHRpbWVzCitpbnQgbGFzdF9yZWJvb3RfdGltZSgpCit7CisgIHJldHVybiBfX0JPT1RfVElNRV9fOworfQorCitpbnQgZmlyc3RfYm9vdF90aW1lKCkKK3sKKyAgcmV0dXJuIDcwMTUxNzYwMDsKK30KKworaW50IGV4aXN0X2RheXMoKQoreworICByZXR1cm4gKCgodGltZSgpLWZpcnN0X2Jvb3RfdGltZSgpKS84NjQwKSs1KS8xMDsKK30KKworLy8gKiB1cHRpbWUgOikKK3N0cmluZyB1cHRpbWUoKQoreworICBpbnQgdDsKKyAgaW50IHRtcDsKKyAgc3RyaW5nIHM7CisKKyAgdD10aW1lKCktX19CT09UX1RJTUVfXzsKKyAgcz0iIjsKKyAgaWYgKHQ+PTg2NDAwKQorICAgIHMrPXNwcmludGYoIiVkIFRhZyVzLCAiLHRtcD10Lzg2NDAwLCh0bXA9PTE/IiI6ImUiKSk7CisgIGlmICh0Pj0zNjAwKQorICAgIHMrPXNwcmludGYoIiVkIFN0dW5kZSVzLCAiLHRtcD0odD10JTg2NDAwKS8zNjAwLCh0bXA9PTE/IiI6Im4iKSk7CisgIGlmICh0PjYwKQorICAgIHMrPXNwcmludGYoIiVkIE1pbnV0ZSVzIHVuZCAiLHRtcD0odD10JTM2MDApLzYwLCh0bXA9PTE/IiI6Im4iKSk7CisgIHJldHVybiBzK3NwcmludGYoIiVkIFNla3VuZGUlcyIsdD10JTYwLCh0PT0xPyIiOiJuIikpOworfQorCisvLyAqIFdhcyB0dW4gYmVpICdkYW5nbGluZycgbGZ1bi1jbG9zdXJlcyA/Cit2b2lkIGRhbmdsaW5nX2xmdW5fY2xvc3VyZSgpIHsKKyAgcmFpc2VfZXJyb3IoImRhbmdsaW5nIGxmdW4gY2xvc3VyZVxuIik7Cit9CisKKy8vICogU3BlcnJlbiBhdXNzZXIgZnVlciBtYXN0ZXIvc2ltdWxfZWZ1bgorCisjaWYgX19FRlVOX0RFRklORURfXyhzZXRfZW52aXJvbm1lbnQpCitub21hc2sgdm9pZCBzZXRfZW52aXJvbm1lbnQob2JqZWN0IG8xLCBvYmplY3QgbzIpIHsKKyAgcmFpc2VfZXJyb3IoIkF2YWlsYWJsZSBvbmx5IGZvciByb290XG4iKTsKK30KKyNlbmRpZgorCitub21hc2sgdm9pZCBzZXRfdGhpc19wbGF5ZXIob2JqZWN0IHBsKSB7CisgIHJhaXNlX2Vycm9yKCJBdmFpbGFibGUgb25seSBmb3Igcm9vdFxuIik7Cit9CisKKyNpZiBfX0VGVU5fREVGSU5FRF9fKGV4cG9ydF91aWQpCitub21hc2sgdm9pZCBleHBvcnRfdWlkKG9iamVjdCBvYikgeworICByYWlzZV9lcnJvcigiQXZhaWxhYmxlIG9ubHkgZm9yIHJvb3RcbiIpOworfQorI2VuZGlmCisKKy8vICogSmV0enQgYXVjaCBjbG9zdXJlcworaW50IHByb2Nlc3NfZmxhZzsKKworcHVibGljIG5vbWFzayBpbnQgcHJvY2Vzc19jYWxsKCkKK3sKKyAgaWYgKHByb2Nlc3NfZmxhZz4wKQorICAgIHJldHVybiBwcm9jZXNzX2ZsYWc7CisgIGVsc2UgcmV0dXJuKDApOworfQorCitwcml2YXRlIG5vbWFzayBzdHJpbmcgX3Byb2Nlc3Nfc3RyaW5nKHN0cmluZyBzdHIsb2JqZWN0IHBvKSB7CisgICAgICAgICAgICAgIHNldF90aGlzX29iamVjdChwbyk7CisgICAgICAgICAgICAgIHJldHVybihlZnVuOjpwcm9jZXNzX3N0cmluZyhzdHIpKTsKK30KKworbm9tYXNrIHN0cmluZyBwcm9jZXNzX3N0cmluZyggbWl4ZWQgc3RyICkKK3sKKyAgc3RyaW5nIHRtcCwgZXJyOworICBpbnQgZmxhZzsgCisKKyAgaWYgKCBjbG9zdXJlcChzdHIpICkgeworICAgICAgc2V0X3RoaXNfb2JqZWN0KCBwcmV2aW91c19vYmplY3QoKSApOworICAgICAgcmV0dXJuIGZ1bmNhbGwoc3RyKTsKKyAgfQorICBlbHNlIGlmIChzdHI9PTApCisgICAgICByZXR1cm4oKHN0cmluZylzdHIpOworICBlbHNlIGlmICggIXN0cmluZ3Aoc3RyKSApIHsKKyAgICAgIHJldHVybiB0b19zdHJpbmcoc3RyKTsKKyAgfQorCisgIGlmICggIShmbGFnID0gcHJvY2Vzc19mbGFnID4gdGltZSgpIC0gNjApKSAgICAgICAgICAgICAgICAgICAgIAorICAgICAgcHJvY2Vzc19mbGFnPXRpbWUoKTsKKworICBlcnIgPSBjYXRjaCh0bXAgPSBmdW5jYWxsKCMnX3Byb2Nlc3Nfc3RyaW5nLHN0cixwcmV2aW91c19vYmplY3QoKSk7IHB1Ymxpc2gpOworCisgIGlmICggIWZsYWcgKQorICAgIHByb2Nlc3NfZmxhZz0wOworCisgIGlmIChlcnIpIHsKKyAgICAvLyBWZXJhcmJlaXR1bmcgYWJicmVjaGVuCisgICAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKKyAgICByYWlzZV9lcnJvcihlcnIpOworICB9CisgIHJldHVybiB0bXA7Cit9CisKKy8vICdta2RpciAtcCcgLSBlcnpldWd0IGVpbmUga29tcGxldHRlIEhpZXJhcmNoaWUgdm9uIFZlcnplaWNobmlzc2VuLgorLy8gd2VubiBkYXMgVmVyemVpY2huaXMgYW5nZWxlZ3Qgd3VyZGUgb2RlciBzY2hvbiBleGlzdGllcnQsIHdpcmQgMQorLy8genVydWVja2dlbGllZmVydCwgc29uc3QgMC4KKy8vIFdpcmZ0IGVpbmVuIEZlaGxlciwgd2VubiBkYXMgYW5nZWJlbmUgVmVyemVpY2huaXMgbmljaHQgYWJzb2x1dCBpc3QhCitwdWJsaWMgaW50IG1rZGlycChzdHJpbmcgZGlyKSB7CisgIC8vIHdlbm4gZXMgbnVyIGtlaW5lbiBmdWVocmVuZGVuIC8gZ2lidCwgaXN0IGRhcyBlaW4gRmVobGVyLgorICBpZiAoc3Ryc3RyKGRpciwgIi8iKSAhPSAwKQorICAgIHJhaXNlX2Vycm9yKCJta2RpcnAoKTogUGZhZCBpc3QgbmljaHQgYWJzb2x1dGUuXG4iKTsKKyAgLy8gY3V0IG9mZiB0cmFpbGluZyAvLi4uCisgIGlmIChkaXJbPDFdPT0nLycpCisgICAgICBkaXIgPSBkaXJbMC4uPDJdOworCisgIGludCBmc3RhdCA9IGZpbGVfc2l6ZShkaXIpOworICAvLyB3ZW5uIGVzIHNjaG9uIGV4aXN0aWVydCwgdHVuIHdpciBlaW5mYWNoIHNvLCBhbHMgaGFldHRlbiB3aXIgZXMgYW5nZWxlZ3QuCisgIGlmIChmc3RhdCA9PSBGU0laRV9ESVIpCisgICAgcmV0dXJuIDE7CisgIC8vIHdlbm4gc2Nob24gbmUgRGF0ZWkgZXhpc3RpZXJ0LCBnZWh0IGVzIG5pY2h0LgorICBpZiAoZnN0YXQgIT0gRlNJWkVfTk9GSUxFKQorICAgIHJldHVybiAwOworICAvLyB3ZW5uIGVzIG51ciBlaW5lbiAvIGdpYnQgKGRlbiBmdWVocmVuZGVuKSwgZGFubiBpc3QgZXMgZWluCisgIC8vIHRvcGxldmVsLXZlcnplaWNobmlzLCB3YXMgZGlyZWt0IGFuZ2VsZWd0IHdpcmQuCisgIGlmIChzdHJyc3RyKGRpciwiLyIpPT0wKSB7CisgICAgcmV0dXJuIGZ1bmNhbGwoYmluZF9sYW1iZGEoIydlZnVuOjpta2RpciwgcHJldmlvdXNfb2JqZWN0KCkpLCBkaXIpOworICB9CisKKyAgLy8gbWtkaXIoKSBuaWNodCBkaXJla3QgcnVmZW4sIHNvbmRlcm4gdm9yaGVyIGFscyBjbG9zdXJlIGFucyBhdWZydWZlbmRlCisgIC8vIE9iamVrdCBiaW5kZW4uIFNvbnN0IGxhZXVmdCBkaWUgUmVjaHRlcHJ1ZWZ1bmcgaW4gdmFsaWRfd3JpdGUoKSBpbSBNYXN0ZXIKKyAgLy8gdW50ZXIgZGVyIEFubmFobWUsIGRhc3MgZGllIHNpbXVsX2VmdW4uYyBtaXQgaWhyZXIgcm9vdCBpZCB3YXMgd2lsbC4KKworICAvLyBqZXR6dCByZWt1cnNpdiBkaWUgVmVyemVpY2huaXNoaWVyYXJjaGllIGFubGVnZW4uIFdlbm4gZGFzIGVyZm9sZ3JlaWNoCisgIC8vIGlzdCwgZGFubiBrb2VubmVuIHdpciBqZXR6dCBtaXQgbWtkaXIgZGFzIHRpZWZzdGUgVmVyemVpY2huaXMgYW5sZWdlbgorICBpZiAobWtkaXJwKGRpclswLi5zdHJyc3RyKGRpciwiLyIpLTFdKSA9PSAxKQorICAgIHJldHVybiBmdW5jYWxsKGJpbmRfbGFtYmRhKCMnZWZ1bjo6bWtkaXIsIHByZXZpb3VzX29iamVjdCgpKSwgZGlyKTsKK30KKworCisvLyAqIFByb3BlcnRpZXMgZ2dmcy4gbWl0c3BlaWNoZXJuCittaXhlZCBzYXZlX29iamVjdChtaXhlZCBuYW1lKQoreworICBtYXBwaW5nIHByb3BlcnRpZXM7CisgIG1hcHBpbmcgc2F2ZTsKKyAgbWl4ZWQgaW5kZXgsIHJlczsKKyAgaW50IGk7CisKKyAgLy8gbnVyIFN0cmluZ3MgdW5kIDAgenVsYXNzZW4KKyAgaWYgKCghc3RyaW5ncChuYW1lKSB8fCAhc2l6ZW9mKG5hbWUpKSAmJiAKKyAgICAgICghaW50cChuYW1lKSB8fCBuYW1lIT0wKSkgeworICAgICAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKKyAgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoCisgICAgICAgICAiT25seSBub24tZW1wdHkgc3RyaW5ncyBhbmQgMCBtYXkgYmUgdXNlZCBhcyBmaWxlbmFtZSBpbiAiCisgICAgICAgICAic2VmdW46OnNhdmVfb2JqZWN0KCkhIEFyZ3VtZW50IHdhcyAlT1xuIixuYW1lKSk7CisgIH0KKworICBzYXZlID0gbV9hbGxvY2F0ZSgwLCAyKTsKKyAgcHJvcGVydGllcyA9IChtYXBwaW5nKXByZXZpb3VzX29iamVjdCgpLT5RdWVyeVByb3BlcnRpZXMoKTsKKworICBpZihtYXBwaW5ncChwcm9wZXJ0aWVzKSkKKyAgeworICAgIC8vIGRlbGV0ZSBhbGwgZW50cmllcyBpbiBtYXBwaW5nIHByb3BlcnRpZXMgd2l0aG91dCBTQVZFIGZsYWchCisgICAgaW5kZXggPSBtX2luZGljZXMocHJvcGVydGllcyk7CisgICAgZm9yKGkgPSBzaXplb2YoaW5kZXgpLTE7IGk+PTA7aS0tKQorICAgIHsKKyAgICAgIGlmKHByb3BlcnRpZXNbaW5kZXhbaV0sIEZfTU9ERV0gJiBTQVZFKQorICAgICAgeworICAgICAgIHNhdmVbaW5kZXhbaV1dID0gcHJvcGVydGllc1tpbmRleFtpXV07CisgICAgICAgc2F2ZVtpbmRleFtpXSwgRl9NT0RFXSA9CisgICAgICAgcHJvcGVydGllc1tpbmRleFtpXSwgRl9NT0RFXSAmCisgICAgICAgICAgICAgICAgICAgICh+KFNFVE1OT1RGT1VORHxRVUVSWU1OT1RGT1VORHxRVUVSWUNBQ0hFRHxTRVRDQUNIRUQpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZWxzZSBzYXZlID0gKFtdKTsKKworICAvLyBzYXZlIG9iamVjdCEKKyAgcHJldmlvdXNfb2JqZWN0KCktPl9zZXRfc2F2ZV9kYXRhKHNhdmUpOworICAvLyBmb3JtYXQ6IHdpZSBkZWZpbmllcnQgaW4gY29uZmlnLmgKKyAgaWYgKHN0cmluZ3AobmFtZSkpCisgICAgcmVzID0gZnVuY2FsbChiaW5kX2xhbWJkYSgjJ2VmdW46OnNhdmVfb2JqZWN0LCBwcmV2aW91c19vYmplY3QoKSksIG5hbWUsCisgICAgICAgX19MSUJfX1NBVkVfRk9STUFUX1ZFUlNJT05fXyk7CisgIGVsc2UKKyAgICByZXMgPSBmdW5jYWxsKGJpbmRfbGFtYmRhKCMnZWZ1bjo6c2F2ZV9vYmplY3QsIHByZXZpb3VzX29iamVjdCgpKSwKKyAgICAgICBfX0xJQl9fU0FWRV9GT1JNQVRfVkVSU0lPTl9fKTsKKyAgcHJldmlvdXNfb2JqZWN0KCktPl9zZXRfc2F2ZV9kYXRhKDApOworCisjaWZkZWYgSU9TVEFUUworICAvLyBTdGF0cy4uLgorICBzdHJ1Y3QgaW9zdGF0X3Mgc3RhdCA9ICg8aW9zdGF0X3M+KTsKKyAgc3RhdC0+b25hbWUgPSBvYmplY3RfbmFtZShwcmV2aW91c19vYmplY3QoKSk7CisgIHN0YXQtPnRpbWUgPSB0aW1lKCk7CisgIC8vc3RhdC0+c2l6ZSA9IChpbnQpb2JqZWN0X2luZm8ocHJldmlvdXNfb2JqZWN0KCksT0lORk9fTUVNT1JZLAorICAvLyAgICBPSU1fVE9UQUxfREFUQV9TSVpFKTsKKyAgaWYgKHN0cmluZ3AobmFtZSkpCisgICAgICBzdGF0LT5zaXplID0gZmlsZV9zaXplKG5hbWUgKyAiLm8iKTsKKyAgZWxzZQorICAgICAgc3RhdC0+c2l6ZW9mKHJlcyk7CisgIC8vZGVidWdfbWVzc2FnZSgic2F2ZW86ICIrc2F2ZW9fc3RhdFswXSsiXG4iKTsKKyAgc2F2ZW9fc3RhdFsxXVtzYXZlb19zdGF0WzBdXSA9IHN0YXQ7CisgIHNhdmVvX3N0YXRbMF0gPSAoc2F2ZW9fc3RhdFswXSArIDEpICUgc2l6ZW9mKHNhdmVvX3N0YXRbMV0pOworICAvL2RlYnVnX21lc3NhZ2UoInNhdmVvIDI6ICIrc2F2ZW9fc3RhdFswXSsiXG4iKTsKKyNlbmRpZgorCisgIHJldHVybiByZXM7Cit9CisKKy8vICogQXVjaCBQcm9wZXJ0aWVzIGxhZGVuCitpbnQgcmVzdG9yZV9vYmplY3Qoc3RyaW5nIG5hbWUpCit7CisgIGludCByZXN1bHQ7CisgIG1peGVkIGluZGV4OworICBtaXhlZCBzYXZlOworICBtYXBwaW5nIHByb3BlcnRpZXM7CisgIGludCBpOworICBjbG9zdXJlIGNsOworCisgIC8vIGdldCBhY3R1YWwgcHJvcGVydHkgc2V0dGluZ3MgKGJ5IGNyZWF0ZSgpKQorICBwcm9wZXJ0aWVzID0gKG1hcHBpbmcpcHJldmlvdXNfb2JqZWN0KCktPlF1ZXJ5UHJvcGVydGllcygpOworCisvLyAgREVCVUcoc3ByaW50ZigiUkVTVE9SRSAlT1xuIixuYW1lKSk7CisgIC8vIHJlc3RvcmUgb2JqZWN0CisgIHJlc3VsdD1mdW5jYWxsKGJpbmRfbGFtYmRhKCMnZWZ1bjo6cmVzdG9yZV9vYmplY3QsIHByZXZpb3VzX29iamVjdCgpKSwgbmFtZSk7CisgIC8vJykpCisgIC8vX2dldF9zYXZlX2RhdGEgbGllZmVydCB0YXRzYWVjaGxpY2ggbWl4ZWQgenVydWVjaywgd2VubiBkYXMgYXVjaCBpbW1lciBlaW4gCisgIC8vbWFwcGluZyBzZWluIHNvbGx0ZS4KKyAgc2F2ZSA9IChtaXhlZClwcmV2aW91c19vYmplY3QoKS0+X2dldF9zYXZlX2RhdGEoKTsKKyAgaWYobWFwcGluZ3Aoc2F2ZSkpCisgIHsKKyAgICBpbmRleCA9IG1faW5kaWNlcyhzYXZlKTsKKyAgICBmb3IoaSA9IHNpemVvZihpbmRleCktMTsgaT49MDsgaS0tKQorICAgIHsKKyAgICAgIHByb3BlcnRpZXNbaW5kZXhbaV1dID0gc2F2ZVtpbmRleFtpXV07CisgICAgICBwcm9wZXJ0aWVzW2luZGV4W2ldLCBGX01PREVdID0gc2F2ZVtpbmRleFtpXSwgRl9NT0RFXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ+KFNFVENBQ0hFRHxRVUVSWUNBQ0hFRCk7CisgICAgfQorICB9CisgIGVsc2UgcHJvcGVydGllcyA9IChbXSk7CisKKyAgLy8gcmVzdG9yZSBwcm9wZXJ0aWVzCisgIGZ1bmNhbGwoCisgICAgICAgICAgYmluZF9sYW1iZGEoCisgICAgICAgICAgICAgICAgICAgICB1bmJvdW5kX2xhbWJkYSgoeydhcmd9KSwgLy8nfSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoeyMnY2FsbF9vdGhlciwoeyMndGhpc19vYmplY3R9KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2V0UHJvcGVydGllcyIsJ2FyZ30pKSwvLycpCisgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c19vYmplY3QoKSkscHJvcGVydGllcyk7CisgIHByZXZpb3VzX29iamVjdCgpLT5fc2V0X3NhdmVfZGF0YSgwKTsKKworI2lmZGVmIElPU1RBVFMKKyAgLy8gU3RhdHMuLi4KKyAgLy9kZWJ1Z19tZXNzYWdlKCJyZXN0b3JlbzogIityZXN0b3Jlb19zdGF0WzBdKyJcbiIpOworICBzdHJ1Y3QgaW9zdGF0X3Mgc3RhdCA9ICg8aW9zdGF0X3M+KTsKKyAgc3RhdC0+b25hbWUgPSBvYmplY3RfbmFtZShwcmV2aW91c19vYmplY3QoKSk7CisgIHN0YXQtPnRpbWUgPSB0aW1lKCk7CisgIC8vc3RhdC0+c2l6ZSA9IChpbnQpb2JqZWN0X2luZm8ocHJldmlvdXNfb2JqZWN0KCksT0lORk9fTUVNT1JZLAorICAvLyAgICBPSU1fVE9UQUxfREFUQV9TSVpFKTsKKyAgc3RhdC0+c2l6ZSA9IGZpbGVfc2l6ZShuYW1lICsgIi5vIik7CisgIHJlc3RvcmVvX3N0YXRbMV1bcmVzdG9yZW9fc3RhdFswXV0gPSBzdGF0OworCisgIHJlc3RvcmVvX3N0YXRbMF0gPSAocmVzdG9yZW9fc3RhdFswXSArIDEpICUgc2l6ZW9mKHJlc3RvcmVvX3N0YXRbMV0pOworI2VuZGlmCisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gKiBIQiBlaW5lcyBPYmpla3RlcyBlaW4vYXVzc2NoYWx0ZW4KK2ludCBzZXRfb2JqZWN0X2hlYXJ0X2JlYXQob2JqZWN0IG9iLCBpbnQgZmxhZykKK3sKKyAgaWYgKG9iamVjdHAob2IpKQorICAgIHJldHVybiBmdW5jYWxsKGJpbmRfbGFtYmRhKCMnZWZ1bjo6Y29uZmlndXJlX29iamVjdCxvYiksIG9iLCBPQ19IRUFSVF9CRUFULCBmbGFnKTsKK30KKworLy8gKiBNYWdpZXJsZXZlbGdydXBwZW4gZXJtaXR0ZWxuCitpbnQgcXVlcnlfd2l6X2dycChtaXhlZCB3aXopCit7CisgIGludCBsZXY7CisKKyAgbGV2PXF1ZXJ5X3dpel9sZXZlbCh3aXopOworICBpZiAobGV2PFNFRVJfTFZMKSByZXR1cm4gMDsKKyAgaWYgKGxldj49R09EX0xWTCkgcmV0dXJuIGxldjsKKyAgaWYgKGxldj49QVJDSF9MVkwpIHJldHVybiBBUkNIX0dSUDsKKyAgaWYgKGxldj49RUxERVJfTFZMKSByZXR1cm4gRUxERVJfR1JQOworICBpZiAobGV2Pj1MT1JEX0xWTCkgcmV0dXJuIExPUkRfR1JQOworICBpZiAobGV2Pj1TUEVDSUFMX0xWTCkgcmV0dXJuIFNQRUNJQUxfR1JQOworICBpZiAobGV2Pj1ET01BSU5NRU1CRVJfTFZMKSByZXR1cm4gRE9NQUlOTUVNQkVSX0dSUDsKKyAgaWYgKGxldj49V0laQVJEX0xWTCkgcmV0dXJuIFdJWkFSRF9HUlA7CisgIGlmIChsZXY+PUxFQVJORVJfTFZMKSByZXR1cm4gTEVBUk5FUl9HUlA7CisgIHJldHVybiBTRUVSX0dSUDsKK30KKworbWl4ZWQgKndpemxpc3RfaW5mbygpCit7CisgIGlmIChBUkNIX1NFQ1VSSVRZIHx8ICFleHRlcm5fY2FsbCgpKQorICAgICAgICAgICAgcmV0dXJuIGVmdW46Ondpemxpc3RfaW5mbygpOworICByZXR1cm4gMDsKK30KKworLy8gKiB3aXpsaXN0IGF1c2dlYmVuCit2YXJhcmdzIHZvaWQgd2l6bGlzdChzdHJpbmcgbmFtZSwgaW50IHNvcnRrZXkgKSB7CisKKyAgaWYgKCFuYW1lKQorICB7CisgICAgaWYgKHRoaXNfcGxheWVyKCkpCisgICAgICBuYW1lID0gZ2V0dWlkKHRoaXNfcGxheWVyKCkpOworICAgIGlmICghbmFtZSkKKyAgICAgIHJldHVybjsKKyAgfQorCisgIC8vIFNjaGx1ZXNzZWwgZGFyZiBudXIgaW4gZWluZW0gZ3VlbHRpZ2VuIEJlcmVpY2ggc2VpbgorICBpZiAoc29ydGtleTxXTF9OQU1FIHx8IHNvcnRrZXk+PVdMX1NJWkUpIHNvcnRrZXk9V0xfQ09TVDsKKworICBtaXhlZCoqIHdsID0gZWZ1bjo6d2l6bGlzdF9pbmZvKCk7CisgIC8vIG5hY2ggPHNvcnRrZXk+IHNvcnRpZXJlbgorICB3bCA9IHNvcnRfYXJyYXkod2wsIGZ1bmN0aW9uIGludCAobWl4ZWQgYSwgbWl4ZWQgYikKKyAgICAgIHtyZXR1cm4gYVtzb3J0a2V5XSA8IGJbc29ydGtleV07IH0gKTsKKworICAvLyBTdW1tZSB1ZWJlciBhbGxlIEtvbW1hbmRvcyBlcm1pdHRlbG4uCisgIGludCB0b3RhbF9jbWQsIGk7CisgIGludCBwb3M9LTE7CisgIGZvcmVhY2gobWl4ZWQgZW50cnkgOiB3bCkKKyAgeworICAgIHRvdGFsX2NtZCArPSBlbnRyeVtXTF9DT01NQU5EU107CisgICAgaWYgKGVudHJ5W1dMX05BTUVdID09IG5hbWUpCisgICAgICBwb3MgPSBpOworICAgICsraTsKKyAgfQorCisgIGlmIChwb3MgPCAwICYmIG5hbWUgIT0gIkFMTCIgJiYgbmFtZSAhPSAiVE9QMTAwIikKKyAgICByZXR1cm47CisKKyAgaWYgKG5hbWUgPT0gIlRPUDEwMCIpCisgIHsKKyAgICBpZiAoc2l6ZW9mKHdsKSA+IDEwMCkKKyAgICAgIHdsID0gd2xbMC4uMTAwXTsKKyAgICBlbHNlCisgICAgICB3bCA9IHdsOworICB9CisgIC8vIHVtIG5hbWUgaGVydW0gc2NobmVpZGVuCisgIGVsc2UgaWYgKG5hbWUgIT0gIkFMTCIpCisgIHsKKyAgICBpZiAoc2l6ZW9mKHdsKSA8PSAyMSkKKyAgICAgIHdsID0gd2w7CisgICAgZWxzZSBpZiAocG9zICsgMTAgPCBzaXplb2Yod2wpICYmIHBvcyAtIDEwID4gMCkKKyAgICAgIHdsID0gd2xbcG9zLTEwLi5wb3MrMTBdOworICAgIGVsc2UgaWYgKHBvcyA8PTIxKQorICAgICAgd2wgPSB3bFswLi4yMF07CisgICAgZWxzZSBpZiAocG9zID49IHNpemVvZih3bCkgLSAyMSkKKyAgICAgIHdsID0gd2xbPDIxLi5dOworICAgIGVsc2UKKyAgICAgIHdsID0gd2w7CisgIH0KKworICB3cml0ZSgiXG5XaXphcmQgdG9wIHNjb3JlIGxpc3RcblxuIik7CisgIGlmICh0b3RhbF9jbWQgPT0gMCkKKyAgICB0b3RhbF9jbWQgPSAxOworICBwcmludGYoIiUtMjBzICUtNnMgJS0zcyAlLTE3cyAlLTZzICUtNnMgJS02c1xuIiwKKyAgICAgICAgICJFVUlEIiwgImNtZHMiLCAiJSIsICJDb3N0cyIsICJIQiIsICJBcnJheXMiLCJNYXBwLiIpOworICBmb3JlYWNoKG1peGVkIGU6IHdsKQorICB7CisgICAgcHJpbnRmKCIlLToyMHMgJTo2ZCAlOjJkJSUgWyU6NmRrLCU6NmRHXSAlOjZkICU6NmQgJTo2ZFxuIiwKKyAgICAgICAgICBlW1dMX05BTUVdLCBlW1dMX0NPTU1BTkRTXSwgZVtXTF9DT01NQU5EU10gKiAxMDAgLyB0b3RhbF9jbWQsCisgICAgICAgICAgZVtXTF9DT1NUXSAvIDEwMDAsIGVbV0xfVE9UQUxfR0lHQUNPU1RdLAorICAgICAgICAgIGVbV0xfSEVBUlRfQkVBVFNdLCBlW1dMX0FSUkFZX1RPVEFMXSwgZVtXTF9NQVBQSU5HX1RPVEFMXQorICAgICAgICAgICk7CisgIH0KKyAgcHJpbnRmKCJcblRvdGFsICAgICAgICAgJTdkICAgICAgICAgKCVkKVxuXG4iLCB0b3RhbF9jbWQsIHNpemVvZih3bCkpOworfQorCisKKy8vIEFiIGhpZXIgZm9sZ2VuIEhpbGZzZnVua3Rpb25lbiBmdWVyIGNhbGxfb3V0KCkgYnp3LiBmdWVyIGRlcmVuIEJlZ3Jlbnp1bmcKKworLy8gZXJtaXR0ZWx0IGRhcyBPYmpla3QgZGVzIENhbGxvdXRzLgorcHJpdmF0ZSBvYmplY3QgX2NhbGxfb3V0X29iaiggbWl4ZWQgY2FsbF9vdXQgKSB7CisgICAgcmV0dXJuIHBvaW50ZXJwKGNhbGxfb3V0KSA/IGNhbGxfb3V0WzBdIDogMDsKK30KKworcHJpdmF0ZSB2b2lkIF9zYW1lX29iamVjdCggb2JqZWN0IG9iLCBtYXBwaW5nIG0gKSB7CisgIC8vIGlzdCBuaWNodCBzbyBibG9lZCwgd2llIGVzIGF1c3NpZWh0LCBzLiBuYWNoZm9sZ2VkZSBWZXJ3ZW5kdW5nIHZvbiBtCisgIGlmICggbVtvYl0gKQorICAgIG1bb2JdICs9ICh7IG9iIH0pOworICBlbHNlCisgICAgbVtvYl0gPSAoeyBvYiB9KTsgCit9CisKKy8vIGFsbGUgT2JqZWt0ZSBpbSBNYXBwaW5nIG0genVzYW1tZW5mYXNzZW4sIGRpZSBkZW4gZ2xlaWNoZW4gTG9hZG5hbWUgKE5hbWUgZGVyCisvLyBCbHVlcHJpbnQpIGhhYmVuLCBhbHNvIGFsbGUgQ2xvbmVzIGRlciBCUCwgZGllIENhbGxvdXRzIGxhdWZlbiBoYWJlbi4KKy8vIE9iamVrdGUgd2VyZGVuIGF1Y2ggbWVocmZhY2ggZXJmYXNzdCwgamUgbmFjaCBBbnphaGwgaWhyZXIgQ2FsbG91dHMuCitwcml2YXRlIHZvaWQgX3NhbWVfcGF0aCggb2JqZWN0IGtleSwgb2JqZWN0ICpvYnMsIG1hcHBpbmcgbSApIHsKKyAgc3RyaW5nIHBhdGg7CisgIGlmICghb2JqZWN0cChrZXkpIHx8ICFwb2ludGVycChvYnMpKSByZXR1cm47CisKKyAgcGF0aCA9IGxvYWRfbmFtZShrZXkpOworCisgIGlmICggbVtwYXRoXSApCisgICAgbVtwYXRoXSArPSBvYnM7CisgIGVsc2UKKyAgICBtW3BhdGhdID0gb2JzOworfQorCisvLyBrZXkga2FubiBvYmplY3Qgb2RlciBzdHJpbmcgc2Vpbi4KK3ByaXZhdGUgaW50IF90b29fbWFueSggbWl4ZWQga2V5LCBtYXBwaW5nIG0sIGludCBpICkgeworICAgIHJldHVybiBzaXplb2YobVtrZXldKSA+PSBpOworfQorCisvLyBhbGxlIE9iamVrdGUgaW4gb2JzIHplcnN0b2VyZW4gdW5kIEZlaGxlcm1lbGR1bmcgYXVzZ2ViZW4uIEFDSFRVTkc6IERpZQorLy8gT2JqZWt0ZSB3ZXJkZW4gaWRSIHp1IGVpbmVyIEJQIGdlaG9lcmVuLCBtdWVzc2VuIGFiZXIgbmljaHQhIEluIGRlbSBGYWxsCisvLyB3aXJkIGF1ZiBkZXIgRWJlbmUgYWJlciBudXIgZWluIE9iamVrdCBpbiBkZXIgRmVobGVybWVsZHVuZyBlcndhZWhudC4KK3ByaXZhdGUgdm9pZCBfZGVzdHJveSggbWl4ZWQga2V5LCBvYmplY3QgKm9icywgc3RyaW5nIHRleHQsIGludCB1aWQgKSB7CisgICAgaWYgKCFwb2ludGVycChvYnMpKSByZXR1cm47CisgICAgLy8gQXJyYXkgbWl0IHVuaXF1ZSBFaW50cmFlZ2UgZXJ6ZXVnZW4uCisgICAgb2JzID0gbV9pbmRpY2VzKCBta21hcHBpbmcob2JzKSApOworICAgIC8vIEZlaGxlcm1lbGR1bmcgYXVmIGRlciBFYmVuZSBhdXNnZWJlbiwgaW0gY2F0Y2goKSBtaXQgcHVibGlzaCwgZGFtaXQgZXMKKyAgICAvLyBhdWYgZGVyIEViZW5lIGRpcmVrdCBzY3JvbGx0LCBkZXIgYmFja3RyYWNlIHZlcmZ1ZWdiYXIgaXN0IChpbQorICAgIC8vIGdlZ2Vuc2F0eiB6dXIgTG9lc3VuZyBtaXR0ZWxzIENhbGxvdXQpLCBkaWUgQXVzZnVlaHJ1bmcgYWJlciB3ZWl0ZXIKKyAgICAvLyBsYWV1ZnQuCisgICAgY2F0Y2goIGVmdW46OnJhaXNlX2Vycm9yKCAgICAgICAgICAgCisgICAgICAgICBzcHJpbnRmKCB0ZXh0LCAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgdWlkID8gKHN0cmluZyltYXN0ZXIoKS0+Y3JlYXRvcl9maWxlKGtleSkgOiBrZXksICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICBzaXplb2Yob2JzKSwgb2JqZWN0X25hbWUob2JzWzwxXSkgKSApO3B1Ymxpc2gpOworICAgIC8vIFVuZCB3ZWcgbWl0IGRlbSBLcmFtLi4uCisgICAgZmlsdGVyKCBvYnMsICMnZWZ1bjo6ZGVzdHJ1Y3QvKicqLyApOworfQorCisvLyBBbGxlIE9iamVrdCBlaW5lciBVSUQgaW0gTWFwcGluZyBtIG1pdCBVSUQgYWxzIEtFeXMgenVzYW1tZW5mYXNzZW4uIE9iamVrdAorLy8gc2luZCBkYWJlaSBuaWNodCB1bmlxdWUuCitwcml2YXRlIHZvaWQgX3NhbWVfdWlkKCBzdHJpbmcga2V5LCBvYmplY3QgKm9icywgbWFwcGluZyBtLCBjbG9zdXJlIGNmICkgeworICBzdHJpbmcgdWlkOworCisgIGlmICggIXBvaW50ZXJwKG9icykgfHwgIXNpemVvZihvYnMpICkKKyAgICByZXR1cm47CisKKyAgdWlkID0gZnVuY2FsbCggY2YsIGtleSApOworCisgIGlmICggbVt1aWRdICkKKyAgICBtW3VpZF0gKz0gb2JzOyAvLyBvYnMgaXN0IG5lbiBBcnJheQorICBlbHNlCisgICAgbVt1aWRdID0gb2JzOworfQorCitwcml2YXRlIGludCBfbG9nX2NhbGxfb3V0KG1peGVkIGNvKQoreworICBsb2dfZmlsZSgiVE9PX01BTllfQ0FMTE9VVFMiLAorICAgICAgc3ByaW50ZigiJXM6OiVPICglZClcbiIsb2JqZWN0X25hbWUoY29bMF0pLGNvWzFdLGNvWzJdKSwKKyAgICAgIDIwMDAwMCk7CisgIHJldHVybiAwOworfQorCitwcml2YXRlIGludCBsYXN0X2NhbGxvdXRfbG9nPTA7CisKK25vbWFzayB2YXJhcmdzIHZvaWQgY2FsbF9vdXQoIHZhcmFyZ3MgbWl4ZWQgKmFyZ3MgKQoreworICAgIG1peGVkIHRtcCwgKmNhbGxfb3V0czsKKworICAgIC8vIEJlaSA+NjAwIENhbGxvdXRzIGFsbGUgT2JqZWt0ZSBraWxsZW4sIGRpZSBtZWhyIGFscyAzMCBDYWxsb3V0cyBsYXVmZW4KKyAgICAvLyBoYWJlbi4KKyAgICBpZiAoIGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9DQUxMT1VUUykgPiA2MDAKKyAgICAgICAgJiYgZ2V0ZXVpZChwcmV2aW91c19vYmplY3QoKSkgIT0gUk9PVElEICkKKyAgICB7CisgICAgICAgLy8gTG9nIGVyemV1Z2VuLi4uCisgICAgICAgaWYgKGxhc3RfY2FsbG91dF9sb2cgPAorICAgICAgICAgICBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fSEVBUlRCRUFUX1RPVEFMX0NZQ0xFUykgLSAxMAorICAgICAgICAgICAmJiBnZXRfZXZhbF9jb3N0KCkgPiAyMDAwMDApCisgICAgICAgeworICAgICAgICAgbGFzdF9jYWxsb3V0X2xvZyA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9IRUFSVEJFQVRfVE9UQUxfQ1lDTEVTKTsKKyAgICAgICAgIGxvZ19maWxlKCJUT09fTUFOWV9DQUxMT1VUUyIsCisgICAgICAgICAgICAgc3ByaW50ZigiXG4lczogIyMjIyMjIyMjIyMjIFRvbyBtYW55IGNhbGxvdXRzOiAlZCAjIyMjIyMjIyMjIyMjI1xuIiwKKyAgICAgICAgICAgICAgICAgICAgIHN0cmZ0aW1lKCIleSVtJWQtJUglTSVTIiksCisgICAgICAgICAgICAgICAgICAgICBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fQ0FMTE9VVFMpKSk7CisgICAgICAgICBmaWx0ZXIoZWZ1bjo6Y2FsbF9vdXRfaW5mbygpLCAjJ19sb2dfY2FsbF9vdXQpOworICAgICAgIH0KKyAgICAgICAvLyBPYmpla3RlIGFsbGVyIENhbGxvdXRzIGVybWl0dGVsbgorICAgICAgIGNhbGxfb3V0cyA9IG1hcCggZWZ1bjo6Y2FsbF9vdXRfaW5mbygpLCAjJ19jYWxsX291dF9vYmogKTsKKyAgICAgICBtYXBwaW5nIG9iamVjdG1hcCA9IChbXSk7CisgICAgICAgZmlsdGVyKCBjYWxsX291dHMsICMnX3NhbWVfb2JqZWN0LCAmb2JqZWN0bWFwICk7CisgICAgICAgLy8gTWFzdGVyIG5pY2h0IGdyaWxsZW4uLi4KKyAgICAgICBlZnVuOjptX2RlbGV0ZSggb2JqZWN0bWFwLCBtYXN0ZXIoMSkgKTsKKyAgICAgICAvLyBhbGxlIE9iamVrdGUgcmF1c3N1Y2hlbiwgZGllIHp1dmllbGUgaGFiZW4uLi4KKyAgICAgICBtYXBwaW5nIHJlcyA9IGZpbHRlcl9pbmRpY2VzKCBvYmplY3RtYXAsICMnX3Rvb19tYW55LCBvYmplY3RtYXAsIDI5ICk7CisgICAgICAgLy8gdW5kIHVlYmVyIGFsbGUgS2V5cyBnZWhlbiwgYW4gX2Rlc3Ryb3koKSB3ZXJkZW4gS2V5IHVuZCBBcnJheSBtaXQKKyAgICAgICAvLyBPYmpla3RlbiB1ZWJlcmdlYmVuIChpbiBkaWVzZW0gRmFsbCBzaW5kIEtleXMgdW5kIEFycmF5IG1pdAorICAgICAgIC8vIE9iamVrdGVuIGpld2VpbHMgZGFzIGdsZWljaGUgT2JqZWt0KS4KKyAgICAgICBpZiAoIHNpemVvZihyZXMpICkgICAgICAgCisgICAgICAgICAgIHdhbGtfbWFwcGluZyhyZXMsICMnX2Rlc3Ryb3ksICJDQUxMX09VVCBvdmVyZmxvdyBieSBzaW5nbGUgIiAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgIm9iamVjdCBbJU9dLiBEZXN0cnVjdGVkICVkIG9iamVjdHMuIFslc11cbiIsIDAgKTsKKworICAgICAgIC8vIEJlaSAoYXVjaCBuYWNoIGRlbSBlcnN0ZW4gQXVmcmFldW1lbiBub2NoKSA+ODAwIENhbGxvdXRzIGFsbGUKKyAgICAgICAvLyBPYmpla3RlIGtpbGxlbiwgZGllIG1laHIgYWxzIDUwIENhbGxvdXRzIGxhdWZlbiBoYWJlbiAtIHVuZAorICAgICAgIC8vIGRpZXNtYWwgemFlaGxlbiBDbG9uZXMgbmljaHQgZWlnZW5zdGFlbmRpZyEgRC5oLiBlcyB3ZXJkZW4gYWxsZQorICAgICAgIC8vIENsb25lcyBlaW5lciBCUCBnZWtpbGx0LCBkaWUgQ2FsbG91dHMgbGF1ZmVuIGhhYmVuLCBmYWxscyBhbGxlCisgICAgICAgLy8gZGllc2UgT2JqZWt0ZSBfenVzYW1tZW5fIG1laHIgYWxzIDUwIENhbGxvdXRzIGhhYmVuIQorICAgICAgIGlmICggZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0NBTExPVVRTKSA+IDgwMCApIHsKKyAgICAgICAgICAgLy8gemVyc3RvZXJ0ZSBPYmpla3RlIHZvbiBkZXIgbGV0enRlbiBBa3Rpb24gc2luZCBpbiBvYmplY3RtYXAgbmljaHQKKyAgICAgICAgICAgLy8gbWVociBkcmluLCBkYSBzaWUgZG9ydCBhbHMgS2V5cyB2ZXJ3ZW5kZXQgd3VyZGVuLgorICAgICAgICAgICBtYXBwaW5nIHBhdGhtYXA9KFtdKTsKKyAgICAgICAgICAgLy8gYWxsZSBPYmpla3QgZWluZXIgQlAgaW4gcmVzIHNvcnRpZXJlbiwgQlAtTmFtZSBhbHMgS2V5LCBBcnJheXMKKyAgICAgICAgICAgLy8gdm9uIE9iamVrdGVuIGFscyBXZXJ0ZS4KKyAgICAgICAgICAgd2Fsa19tYXBwaW5nKCBvYmplY3RtYXAsICMnX3NhbWVfcGF0aCwgJnBhdGhtYXApOworICAgICAgICAgICAvLyBhbGxlIEJQcyAodW5kIGlocmUgT2JqZWt0ZSkgcmF1c3N1Y2hlbiwgZGllIHp1dmllbGUgaGFiZW4uLi4KKyAgICAgICAgICAgcmVzID0gZmlsdGVyX2luZGljZXMoIHBhdGhtYXAsICMnX3Rvb19tYW55LyonKi8sIHBhdGhtYXAsIDUwICk7CisgICAgICAgICAgIC8vIHVuZCB1ZWJlciBhbGxlIEtleXMgZ2VoZW4sIGFuIF9kZXN0cm95KCkgd2VyZGVuIGRpZSBDbG9uZXMKKyAgICAgICAgICAgLy8gdWViZXJnZWJlbiwgZGllIENhbGxvdXRzIGhhYmVuLgorICAgICAgICAgICBpZiAoIHNpemVvZihyZXMpICkKKyAgICAgICAgICAgICAgd2Fsa19tYXBwaW5nKCByZXMsICMnX2Rlc3Ryb3kvKicqLywgIkNBTExfT1VUIG92ZXJmbG93IGJ5IGZpbGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiclcycuIERlc3RydWN0ZWQgJWQgb2JqZWN0cy4gWyVzXVxuIiwgMCApOworCisgICAgICAgICAgIC8vIFdlbm4gYmVpZGUgQXVmcmFldW1hcmJlaXRlbiBuaWNodHMgZ2VicmFjaHQgaGFiZW4gdW5kIGltbWVyCisgICAgICAgICAgIC8vIG5vY2ggPjEwMDAgQ2FsbG91dHMgbGF1ZmVuLCB3ZXJkZW4gZGllc21hbCBhbGxlIENhbGxvdXRzCisgICAgICAgICAgIC8vIGVpbmVyIFVJRCB6dXNhbW1lbmdlemFlaGx0LgorICAgICAgICAgICAvLyBBbGxlIE9iamVrdGUgZWluZXIgVUlELCBkaWUgZXMgaW4gU3VtbWUgYWxsZXIgaWhyZXIgT2JqZWt0IG1pdAorICAgICAgICAgICAvLyBDYWxsb3V0cyBhdWYgbWVociBhbHMgMTAwIENhbGxvdXRzIGJyaW5ndCwgd2VyZGVuIGdlcm9lc3RldC4KKyAgICAgICAgICAgaWYgKGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9DQUxMT1VUUykgPiAxMDAwKQorICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8vIGRhcyBuYWNoIEJQLU5hbWVuIHZvcmdlZmlsdGVydGUgTWFwcGluZyBqZXR6dCBuYWNoIFVJRHMKKyAgICAgICAgICAgICAgLy8genVzYW1tZW5zb3J0aWVyZW4uIFplcnN0b2VydGUgQ2xvbmVzIGZpbHRlciBfc2FtZV91aWQoKQorICAgICAgICAgICAgICAvLyByYXVzLgorICAgICAgICAgICAgICBtYXBwaW5nIHVpZG1hcD0oW10pOworICAgICAgICAgICAgICB3YWxrX21hcHBpbmcoIHBhdGhtYXAsICMnX3NhbWVfdWlkLCAmdWlkbWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltYm9sX2Z1bmN0aW9uKCAiY3JlYXRvcl9maWxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvc2VjdXJlL21hc3RlciIgKSApOworICAgICAgICAgICAgICAvLyBJbiByZXMgbnVuIFVJRHMgYWxzIEtleXMgdW5kIEFycmF5cyB2b24gT2JqZWt0ZW4gYWxzIFdlcnRlLgorICAgICAgICAgICAgICAvLyBEaWUgcmF1c2ZpbHRlcm4sIGRpZSBtZWhyIGFscyAxMDAgT2JqZWt0ZSAobm9uLXVuaXF1ZSwgZC5oLgorICAgICAgICAgICAgICAvLyAxMDAgQ2FsbG91dHMhKSBoYWJlbi4KKyAgICAgICAgICAgICAgcmVzID0gZmlsdGVyX2luZGljZXMoIHVpZG1hcCwgIydfdG9vX21hbnksIHVpZG1hcCwgMTAwICk7CisgICAgICAgICAgICAgIC8vIHVuZCBlcm5ldXQgdWViZXIgZGllIEtleXMgbGF1ZmVuIHVuZCBqZXdlaWxzIGRpZSBBcnJheXMgbWl0CisgICAgICAgICAgICAgIC8vIGRlbiBPYmpla3RlbiB6dXIgWmVyc3RvZXJ1bmcgYW4gX2Rlc3Ryb3koKS4uLgorICAgICAgICAgICAgICBpZiAoIHNpemVvZihyZXMpICkKKyAgICAgICAgICAgICAgICAgIHdhbGtfbWFwcGluZyggcmVzLCAjJ19kZXN0cm95LCAiQ0FMTF9PVVQgb3ZlcmZsb3cgYnkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVJRCAnJXMnLiBEZXN0cnVjdGVkICVkIG9iamVjdHMuIFslc11cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICk7CisgICAgICAgICAgIH0KKyAgICAgICB9CisgICAgfQorCisgICAgLy8gRmFsbHMgZGFzIGF1ZnJ1ZmVuZGUgT2JqZWt0IHplcnN0b2VydCB3dXJkZSBiZWltIEF1ZnJhZXVtZW4KKyAgICBpZiAoICFwcmV2aW91c19vYmplY3QoKSApCisgICAgICAgcmV0dXJuOworCisgICAgc2V0X3RoaXNfb2JqZWN0KCBwcmV2aW91c19vYmplY3QoKSApOworICAgIGFwcGx5KCAjJ2VmdW46OmNhbGxfb3V0LCBhcmdzICk7CisgICAgcmV0dXJuOworfQorCittaXhlZCBjYWxsX291dF9pbmZvKCkgeworICAKKyAgb2JqZWN0IHBvID0gcHJldmlvdXNfb2JqZWN0KCk7CisgIG1peGVkIGNvaSA9IGVmdW46OmNhbGxfb3V0X2luZm8oKTsKKworICAvLyB1bmdlZmlsdGVydGVuIE91dHB1dCBudXIgZnVlciBiZXN0aW1tdGUgT2JqZWt0ZSwgT2JqZWt0ZSBpbiAvc3RkIG9kZXIKKyAgLy8gL29iaiBoYWJlbiBkaWUgQmFja2JvbmVJRC4KKyAgaWYgKHF1ZXJ5X3dpel9sZXZlbChnZXR1aWQocG8pKSA+PSBBUkNIX0xWTAorICAgICAgIHx8IChzdHJpbmcpbWFzdGVyKCktPmNyZWF0b3JfZmlsZShsb2FkX25hbWUocG8pKSA9PSBCQUNLQk9ORUlEICkgeworICAgICAgcmV0dXJuIGNvaTsKKyAgfQorICBlbHNlIHsKKyAgICAgIHJldHVybiBmaWx0ZXIoY29pLCBmdW5jdGlvbiBtaXhlZCAobWl4ZWQgYXJyKSB7CisgICAgICAgICAgICAgIGlmIChwb2ludGVycChhcnIpICYmIGFyclswXT09cG8pCisgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICBlbHNlIHJldHVybiAwOyB9KTsKKyAgfQorfQorCisvLyAqIFp1IGVpbmVyIGNsb3N1cmUgZGFzIE9iamVrdCwgYW4gZGFzIHNpZSBnZWJ1bmRlbiBpc3QsIHN1Y2hlbgorLy8gTklDSFQgZGFzIE9iamVrdCwgd2FzIGdnZi4gZGllIGxmdW4gZGVmaW5pZXJ0IQorbWl4ZWQgcXVlcnlfY2xvc3VyZV9vYmplY3QoY2xvc3VyZSBjKSB7CisgIHJldHVybgorICAgIENMT1NVUkVfSVNfVU5CT1VORF9MQU1CREEoZ2V0X3R5cGVfaW5mbyhjLCAxKSkgPworICAgICAgMCA6CisgICh0b19vYmplY3QoYykgfHwgLTEpOworfQorCisvLyAqIFdpciB3b2xsZW4gbnVyIEVJTiBBcmd1bWVudCAuLi4gYXVzc2VyZGVtIGNoZWNrcyBmdWVyIGRlbiBOZXR6dG90ZW5yYXVtCit2YXJhcmdzIHZvaWQgbW92ZV9vYmplY3QobWl4ZWQgd2hhdCwgbWl4ZWQgd2hlcmUpCit7CisgIG9iamVjdCBwbyx0bXA7CisKKyAgcG89cHJldmlvdXNfb2JqZWN0KCk7CisgIGlmICghd2hlcmUpCisgIHsKKyAgICB3aGVyZT13aGF0OworICAgIHdoYXQ9cG87CisgIH0KKyAgaWYgKCgoc3RyaW5ncCh3aGVyZSkgJiYgd2hlcmU9PU5FVERFQURfUk9PTSApIHx8CisgICAgICAgKG9iamVjdHAod2hlcmUpICYmIHdoZXJlPT1maW5kX29iamVjdChORVRERUFEX1JPT00pKSkgJiYKKyAgICAgICBvYmplY3RwKHdoYXQpICYmIG9iamVjdF9uYW1lKHdoYXQpIT0iL29iai9zcGVycmVyIikKKyAgeworICAgIGlmICghcXVlcnlfb25jZV9pbnRlcmFjdGl2ZSh3aGF0KSkKKyAgICB7CisgICAgICB3aGF0LT5yZW1vdmUoKTsKKyAgICAgIGlmICh3aGF0KSBkZXN0cnVjdCh3aGF0KTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKGxpdmluZyh3aGF0KSB8fCBpbnRlcmFjdGl2ZSh3aGF0KSkKKyAgICB7CisgICAgICBsb2dfZmlsZSgiTkRFQUQyIixzcHJpbnRmKCJUUllFRCBUTyBNT1ZFIFRPIE5FVERFQUQ6ICVPXG4iLHdoYXQpKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgc2V0X29iamVjdF9oZWFydF9iZWF0KHdoYXQsMCk7CisgIH0KKyAgdG1wPXdoYXQ7CisgIHdoaWxlICh0bXA9ZW52aXJvbm1lbnQodG1wKSkKKyAgICAgIC8vIEphLiBNYW4gcnVmdCBkaWUgX3NldF94eHgoKS1GdW5rdGlvbmVuIGVpZ2VudGxpY2ggbmljaHQgZGlyZWt0IGF1Zi4KKyAgICAgIC8vIEFiZXIgZGFzIExpY2h0c3lzdGVtIGlzdCBzY2hvbiAqc28qIHJlY2hlbmludGVuc2l2IHVuZCBnZXJhZGUgZGVyCisgICAgICAvLyBQX0xBU1RfQ09OVEVOVF9DSEFOR0UtQ2FjaGUgd2lyZCAqc28qIG9mdCBiZW5vZXRpZ3QsIGRhc3MgZXMgbWlyCisgICAgICAvLyBkYSB1bSBqZWRlcyBiaXNzY2hlbiBSZWNoZW56ZWl0IGdlaHQuCisgICAgICAvLyBEZXIgWndlY2sgaGVpbGlndCBqYSBiZWthbm50bGljaCBkaWUgTWl0dGVsLiA7LSkKKyAgICAgIC8vCisgICAgICAvLyBUaWFtYWsKKyAgICB0bXAtPl9zZXRfbGFzdF9jb250ZW50X2NoYW5nZSgpOworICBmdW5jYWxsKGJpbmRfbGFtYmRhKCMnZWZ1bjo6bW92ZV9vYmplY3QscG8pLHdoYXQsd2hlcmUpOworICBpZiAodG1wPXdoYXQpCisgICAgd2hpbGUgKHRtcD1lbnZpcm9ubWVudCh0bXApKQorICAgICAgdG1wLT5fc2V0X2xhc3RfY29udGVudF9jaGFuZ2UoKTsKK30KKworCit2b2lkIHN0YXJ0X3NpbXVsX2VmdW4oKSB7CisgIG1peGVkICppbmZvOworCisgIC8vIEZhbGxzIG5vY2ggbmljaHQgZ2V0YW4sIGV4dHJhX3dpemluZm8gaW5pdGlhbGlzaWVyZW4KKyAgaWYgKCAhcG9pbnRlcnAoaW5mbyA9IGdldF9leHRyYV93aXppbmZvKDApKSApCisgICAgc2V0X2V4dHJhX3dpemluZm8oMCwgaW5mbyA9IGFsbG9jYXRlKEJBQ0tCT05FX1dJWklORk9fU0laRSkpOworCisgIEluaXRMaXZpbmdEYXRhKGluZm8pOworCisgIHNldF9uZXh0X3Jlc2V0KDEwKTsgLy8gZGlyZWt0IG1hbCBhdWZyYWV1bWVuCit9CisKK3Byb3RlY3RlZCB2b2lkIHJlc2V0KCkgeworICBzZXRfbmV4dF9yZXNldCg3MjAwKTsKKyAgQ2xlYW5MaXZpbmdEYXRhKCk7Cit9CisKKyNpZiAhX19FRlVOX0RFRklORURfXyhhYnNvbHV0ZV9oYl9jb3VudCkKK2ludCBhYnNvbHV0ZV9oYl9jb3VudCgpIHsKKyAgcmV0dXJuIGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9IRUFSVEJFQVRfVE9UQUxfQ1lDTEVTKTsKK30KKyNlbmRpZgorCit2b2lkIF9fc2V0X2Vudmlyb25tZW50KG9iamVjdCBvYiwgbWl4ZWQgdGFyZ2V0KQoreworICBzdHJpbmcgcGF0aDsKKyAgb2JqZWN0IG9iajsKKworICBpZiAoIW9iamVjdHAob2IpKQorICAgIHJldHVybjsKKyAgaWYgKCFJU19BUkNIKGdldGV1aWQocHJldmlvdXNfb2JqZWN0KCkpKSB8fCAhQVJDSF9TRUNVUklUWSApCisgICAgcmV0dXJuOworICBpZiAob2JqZWN0cCh0YXJnZXQpKQorICB7CisgICAgZWZ1bjo6c2V0X2Vudmlyb25tZW50KG9iLHRhcmdldCk7CisgICAgcmV0dXJuOworICB9CisgIHBhdGg9KHN0cmluZylNQVNURVItPl9nZXRfcGF0aCh0YXJnZXQsdGhpc19pbnRlcmFjdGl2ZSgpKTsKKyAgaWYgKHN0cmluZ3AocGF0aCkgJiYgZmlsZV9zaXplKHBhdGgrIi5jIik+PTAgJiYKKyAgICAgICFjYXRjaChsb2FkX29iamVjdChwYXRoKTtwdWJsaXNoKSApCisgIHsKKyAgICBvYmo9ZmluZF9vYmplY3QocGF0aCk7CisgICAgZWZ1bjo6c2V0X2Vudmlyb25tZW50KG9iLG9iaik7CisgICAgcmV0dXJuOworICB9Cit9CisKK3ZvaWQgX2R1bXBfd2l6bGlzdChzdHJpbmcgZmlsZSwgaW50IHNvcnRieSkgeworICBpbnQgaTsKKyAgbWl4ZWQgKmE7CisKKyAgaWYgKCFMT1JEX1NFQ1VSSVRZKQorICAgIHJldHVybjsKKyAgaWYgKCFtYXN0ZXIoKS0+dmFsaWRfd3JpdGUoZmlsZSxnZXRldWlkKHByZXZpb3VzX29iamVjdCgpKSwid3JpdGVfZmlsZSIpKQorICB7CisgICAgd3JpdGUoIk5PIFdSSVRFIFBFUk1JU1NJT05cbiIpOworICAgIHJldHVybjsKKyAgfQorICBhID0gd2l6bGlzdF9pbmZvKCk7CisgIGEgPSBzb3J0X2FycmF5KGEsIGxhbWJkYSggKHsnYSwnYn0pLAorICAgICAgICAgICAgICAgICAgICAgICAgKHsjJzwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICh7IydbLCdhLHNvcnRieX0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoeyMnWywnYixzb3J0Ynl9KQorICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSk7CisgIHJtKGZpbGUpOworICBmb3IgKGk9c2l6ZW9mKGEpLTE7aT49MDtpLS0pCisgICAgd3JpdGVfZmlsZShmaWxlLHNwcmludGYoIiUtMTFzOiBldmFsPSUtOGQgY21kcz0lLTZkIEhCcz0lLTVkIGFycmF5PSUtNWQgbWFwcGluZz0lLTdkXG4iLAorICAgICAgYVtpXVtXTF9OQU1FXSxhW2ldW1dMX1RPVEFMX0NPU1RdLGFbaV1bV0xfQ09NTUFORFNdLGFbaV1bV0xfSEVBUlRfQkVBVFNdLAorICAgICAgYVtpXVtXTF9BUlJBWV9UT1RBTF0sYVtpXVtXTF9DQUxMX09VVF0pKTsKK30KKworcHVibGljIHZhcmFyZ3Mgb2JqZWN0IGRlZXBfcHJlc2VudChtaXhlZCB3aGF0LCBvYmplY3Qgb2IpIHsKKworICBpZighb2JqZWN0cChvYikpCisgICAgb2I9cHJldmlvdXNfb2JqZWN0KCk7CisgIC8vIFdlbm4gZWluIE9iamVrdCBnZXN1Y2h0IHdpcmQ6IEFsbGUgRW52cyBkaWVzZXMgT2JqZWt0cyBlcm1pdHRlbG4gdW5kCisgIC8vIHNjaGF1ZW4sIG9iIGluIGRpZXNlbiBvYiB2b3Jrb21tdC4gRGFubiBpc3Qgd2hhdCBpbiBvYiBlbnRoYWx0ZW4uCisgIGlmKG9iamVjdHAod2hhdCkpIHsKKyAgICBvYmplY3QgKmVudnM9YWxsX2Vudmlyb25tZW50KHdoYXQpOworICAgIC8vIHdlbm4gb2Iga2VpbiBFbnZpcm9ubWVudCBoYXQsIGlzdCBlcyBvZmZlbnNpY2h0bGljaCBuaWNodCBpbiB3aGF0CisgICAgLy8gZW50aGFsdGVuLgorICAgIGlmICghcG9pbnRlcnAoZW52cykpIHJldHVybiAwOworICAgIGlmIChtZW1iZXIoZW52cywgb2IpICE9IC0xKSByZXR1cm4gd2hhdDsKKyAgfQorICAvLyBzb25zdCB3aXJkcyB0ZXVyZXIsIHVlYmVyIGFsbGUgT2JqZWt0ZSBpbSAoZGVlcCkgSW52IGxhdWZlbiB1bmQgcGVyIGlkKCkKKyAgLy8gdGVzdGVuLiBEYWJlaSBtdXNzIGFiZXIgZGllIGdld3VlbnNjaHRlIE5yLiAoImZsYXNjaGUgMyIpIGFiZ2VzY2huaXR0ZW4KKyAgLy8gd2VyZGVuIHVuZCBzZWxiZXIgZ2V6YWVobHQgd2VyZGVuLCB3ZWxjaGUgZGFzIGVudHNwcmVjaGVuZGUgT2JqZWt0IGlzdC4KKyAgZWxzZSBpZiAoc3RyaW5ncCh3aGF0KSkgeworICAgICAgaW50IGNudDsKKyAgICAgIHN0cmluZyBuZXd3aGF0OworICAgICAgaWYoc3NjYW5mKHdoYXQsIiVzICVkIixuZXd3aGF0LGNudCkhPTIpCisgICAgICAgY250PTE7CisgICAgICBlbHNlCisgICAgICAgd2hhdD1uZXd3aGF0OworICAgICAgZm9yZWFjaChvYmplY3QgaW52b2I6IGRlZXBfaW52ZW50b3J5KG9iKSkgeworICAgICAgIGlmIChpbnZvYi0+aWQod2hhdCkgJiYgIS0tY250KQorICAgICAgICAgICByZXR1cm4gaW52b2I7CisgICAgICB9CisgIH0KKyAgZWxzZSB7CisgICAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKKyAgICByYWlzZV9lcnJvcihzcHJpbnRmKCJXcm9uZyBhcmd1bWVudCAxIHRvIGRlZXBfcHJlc2VudCgpLiAiCisgICAgICAgICAiRXhwZWN0ZWQgXCJvYmplY3RcIiBvciBcInN0cmluZ1wiLCBnb3QgJS41ME8uXG4iLAorICAgICAgICAgd2hhdCkpOworICB9CisgIHJldHVybiAwOworfQorCittYXBwaW5nIGR1bXBfaXBfbWFwcGluZygpCit7CisgIHJldHVybiAwOworfQorCitub21hc2sgdm9pZCBzd2FwKG9iamVjdCBvYmopCit7CisgIHdyaXRlKCJZb3VyIGFyZSBub3QgYWxsb3dlZCB0byBzd2FwIG9iamVjdHMgYnkgaGFuZCFcbiIpOworICByZXR1cm47Cit9CisKK25vbWFzayB2YXJhcmdzIHZvaWQgZ2FyYmFnZV9jb2xsZWN0aW9uKHN0cmluZyBzdHIpCit7CisgIGlmKHByZXZpb3VzX29iamVjdCgpPT0wIHx8ICFJU19BUkNIKGdldGV1aWQocHJldmlvdXNfb2JqZWN0KCkpKSAKKyAgICAgIHx8ICFBUkNIX1NFQ1VSSVRZKQorICB7CisgICAgd3JpdGUoIkNhbGwgR0Mgbm93IGFuZCB0aGUgbXVkIHdpbGwgY3Jhc2ggaW4gNS02IGhvdXJzLiBET05UIERPIElUIVxuIik7CisgICAgcmV0dXJuOworICB9CisgIGVsc2UgaWYgKHN0cmluZ3Aoc3RyKSkKKyAgeworICAgIHJldHVybiBlZnVuOjpnYXJiYWdlX2NvbGxlY3Rpb24oc3RyKTsKKyAgfQorICBlbHNlIAorICAgIHJldHVybiBlZnVuOjpnYXJiYWdlX2NvbGxlY3Rpb24oKTsKK30KKwordmFyYXJncyB2b2lkIG5vdGlmeV9mYWlsKG1peGVkIG5mLCBpbnQgcHJpbykgeworICBvYmplY3QgcG8sb2xkbzsKKyAgaW50IG9sZHByaW87CisgIAorICBpZiAoIVBMIHx8ICFvYmplY3RwKHBvPXByZXZpb3VzX29iamVjdCgpKSkgcmV0dXJuOworICBpZiAoIXN0cmluZ3AobmYpICYmICFjbG9zdXJlcChuZikpIHsKKyAgICAgIHNldF90aGlzX29iamVjdChwbyk7CisgICAgICByYWlzZV9lcnJvcihzcHJpbnRmKAorICAgICAgICAgIk9ubHkgc3RyaW5ncyBhbmQgY2xvc3VyZXMgYWxsb3dlZCBmb3Igbm90aWZ5X2ZhaWwhICIKKyAgICAgICAgICJBcmd1bWVudCB3YXM6ICUuNTBPLi4uXG4iLG5mKSk7CisgIH0KKworICAvLyBmYWxscyBlaW4gT2JqZWt0IGJlcmVpdHMgbmVuIG5vdGlmeV9mYWlsKCkgc2V0enRlLCBQcmlvcml0YWV0ZW4gYWJzY2hhZXR6ZW4KKyAgLy8gdW5kIHZlcmdsZWljaGVuLgorICBpZiAob2JqZWN0cChvbGRvPXF1ZXJ5X25vdGlmeV9mYWlsKDEpKSAmJiBwbyE9b2xkbykgeworICAgIGlmICghcHJpbykgeyAgICAgICAKKyAgICAgIC8vUHJpb3JpdGFldCBkaWVzZXMgbm90aWZ5X2ZhaWwoKSAnYWJzY2hhZXR6ZW4nCisgICAgICBpZiAocG89PVBMKSAvLyBTcGllbGVyLWludGVybmUgKHNvdWwtY21kcykKKyAgICAgICAgcHJpbz1ORl9OTF9PV047CisgICAgICBlbHNlIGlmIChsaXZpbmcocG8pKQorICAgICAgICBwcmlvPU5GX05MX0xJVklORzsKKyAgICAgIGVsc2UgaWYgKChpbnQpcG8tPklzUm9vbSgpKQorICAgICAgICBwcmlvPU5GX05MX1JPT007CisgICAgICBlbHNlCisgICAgICAgIHByaW89TkZfTkxfVEhJTkc7CisgICAgfQorICAgIC8vUHJpb3JpdGFldCBkZXMgYWx0ZW4gU2V0emVycyBhYnNjaGFldHplbgorICAgIGlmIChvbGRvPT1QTCkKKyAgICAgIG9sZHByaW89TkZfTkxfT1dOOworICAgIGVsc2UgaWYgKGxpdmluZyhvbGRvKSkKKyAgICAgIG9sZHByaW89TkZfTkxfTElWSU5HOworICAgIGVsc2UgaWYgKChpbnQpb2xkby0+SXNSb29tKCkpCisgICAgICBvbGRwcmlvPU5GX05MX1JPT007CisgICAgZWxzZQorICAgICAgb2xkcHJpbz1ORl9OTF9USElORzsKKyAgfQorICBlbHNlIC8vIHdlbm4gZXMgbm9jaCBrZWluIE5vdGlmeV9mYWlsIGdpYnQ6CisgICAgb2xkcHJpbz1ORl9OTF9OT05FOworCisgIC8vdmVyZ2xlaWNoZW4gdW5kIGdnZi4gc2V0emVuCisgIGlmIChwcmlvID49IG9sZHByaW8pIHsgCisgICAgc2V0X3RoaXNfb2JqZWN0KHBvKTsKKyAgICBlZnVuOjpub3RpZnlfZmFpbChuZik7CisgIH0KKworICByZXR1cm47Cit9CisKK3ZvaWQgX25vdGlmeV9mYWlsKHN0cmluZyBzdHIpCit7CisgIC8vcXVlcnlfbm90aWZ5X2ZhaWwoKSBiZW51dHplbiwgdW0gZGFzIE9iamVrdAorICAvL2RlcyBsZXR6dGVuIG5vdGlmeV9mYWlsKCkgenUgZXJtaXR0ZWxuCisgIG9iamVjdCBvOworICBpZiAoKG89cXVlcnlfbm90aWZ5X2ZhaWwoMSkpICYmIG8hPXByZXZpb3VzX29iamVjdCgpKQorICAgIHJldHVybjsKKyAgLy9ub2NoIGtlaW4gbm90aWZ5X2ZhaWwoKSBmdWVyIGRpZXNlcyBLb21tYW5kbyBnZXNldHp0LCBhdWYgZ2VodHMuCisgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CisgIGVmdW46Om5vdGlmeV9mYWlsKHN0cik7CisgIHJldHVybjsKK30KKworc3RyaW5nIHRpbWUyc3RyaW5nKCBzdHJpbmcgZm9ybWF0LCBpbnQgemVpdCApCit7CisgIGludCBpLGNoLG1heHVuaXQsZHVtbXk7CisgIHN0cmluZyAqcGFydHMsIGZtdDsKKworICBpbnQgc2VjcyA9IHplaXQ7CisgIGludCBtaW5zID0gKHplaXQvNjApOworICBpbnQgaG91cnMgPSAoemVpdC8zNjAwKTsKKyAgaW50IGRheXMgPSAoemVpdC84NjQwMCk7CisgIGludCB3ZWVrcyA9ICAoemVpdC82MDQ4MDApOworICBpbnQgbW9udGhzID0gKHplaXQvMjQxOTIwMCk7CisgIGludCBhYmJyID0gMDsKKworICBwYXJ0cyA9IHJlZ2V4cGxvZGUoIGZvcm1hdCwgIlwoJVwoLXxcKVswLTldKltud2RobXN4TldESE1TWF1cKXxcKCUlXCkiICk7CisKKyAgZm9yKCBpPTE7IGk8c2l6ZW9mKHBhcnRzKTsgaSs9MiApCisgIHsKKyAgICBjaCA9IHBhcnRzW2ldWzwxXTsKKyAgICBzd2l0Y2goIHBhcnRzW2ldWzwxXSApCisgICAgeworICAgIGNhc2UgJ3gnOiBjYXNlICdYJzoKKyAgICAgICBhYmJyID0gc3NjYW5mKCBwYXJ0c1tpXSwgIiUlJWQiLCBkdW1teSApICYmIGR1bW15PT0wOworICAgICAgIC8vIE5PIGJyZWFrICEKKyAgICBjYXNlICduJzogY2FzZSAnTic6CisgICAgICAgbWF4dW5pdCB8PSAzMTsKKyAgICAgICBicmVhazsKKyAgICBjYXNlICd3JzogY2FzZSAnVyc6CisgICAgICAgbWF4dW5pdCB8PSAxNTsKKyAgICAgICBicmVhazsKKyAgICBjYXNlICdkJzogY2FzZSAnRCc6CisgICAgICAgbWF4dW5pdCB8PSA3OworICAgICAgIGJyZWFrOworICAgIGNhc2UgJ2gnOiBjYXNlICdIJzoKKyAgICAgICBtYXh1bml0IHw9IDM7CisgICAgICAgYnJlYWs7CisgICAgY2FzZSAnbSc6IGNhc2UgJ00nOgorICAgICAgIG1heHVuaXQgfD0gMTsKKyAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgaWYoIG1heHVuaXQgJiAxNiApIHdlZWtzICU9IDQ7CisgIGlmKCBtYXh1bml0ICYgOCApIGRheXMgJT0gNzsKKyAgaWYoIG1heHVuaXQgJiA0ICkgaG91cnMgJT0gMjQ7CisgIGlmKCBtYXh1bml0ICYgMiApIG1pbnMgJT0gNjA7CisgIGlmKCBtYXh1bml0ICkgc2VjcyAlPSA2MDsKKworICBmb3IoIGk9MTsgaTxzaXplb2YocGFydHMpOyBpKz0yICkKKyAgeworICAgIGZtdCA9IHBhcnRzW2ldWzAuLjwyXTsKKyAgICBjaCA9IHBhcnRzW2ldWzwxXTsKKyAgICBpZiggY2g9PSd4JyApCisgICAgeworICAgICAgaWYgKG1vbnRocyA+IDApIGNoPSduJzsKKyAgICAgIGVsc2UgaWYoIHdlZWtzPjAgKSBjaD0ndyc7CisgICAgICBlbHNlIGlmKCBkYXlzPjAgKSBjaD0nZCc7CisgICAgICBlbHNlIGlmKCBob3Vycz4wICkgY2g9J2gnOyAKKyAgICAgIGVsc2UgaWYobWlucyA+IDApIGNoID0gJ20nOworICAgICAgZWxzZSBjaCA9ICdzJzsKKyAgICB9CisgICAgZWxzZSBpZiggY2g9PSdYJyApCisgICAgeworICAgICAgaWYgKG1vbnRocyA+IDApIGNoPSdOJzsKKyAgICAgIGVsc2UgaWYoIHdlZWtzPjAgKSBjaD0nVyc7CisgICAgICBlbHNlIGlmKCBkYXlzPjAgKSBjaD0nRCc7CisgICAgICBlbHNlIGlmKCBob3Vycz4wICkgY2g9J0gnOyAKKyAgICAgIGVsc2UgaWYobWlucyA+IDApIGNoID0gJ00nOworICAgICAgZWxzZSBjaCA9ICdTJzsKKyAgICB9CisgICAgCisgICAgc3dpdGNoKCBjaCApCisgICAgeworICAgICAgY2FzZSAnbic6IHBhcnRzW2ldID0gc3ByaW50ZiggZm10KyJkIiwgbW9udGhzICk7IGJyZWFrOworICAgICAgY2FzZSAndyc6IHBhcnRzW2ldID0gc3ByaW50ZiggZm10KyJkIiwgd2Vla3MgKTsgYnJlYWs7CisgICAgICBjYXNlICdkJzogcGFydHNbaV0gPSBzcHJpbnRmKCBmbXQrImQiLCBkYXlzICk7IGJyZWFrOworICAgICAgY2FzZSAnaCc6IHBhcnRzW2ldID0gc3ByaW50ZiggZm10KyJkIiwgaG91cnMgKTsgYnJlYWs7CisgICAgICBjYXNlICdtJzogcGFydHNbaV0gPSBzcHJpbnRmKCBmbXQrImQiLCBtaW5zICk7IGJyZWFrOworICAgICAgY2FzZSAncyc6IHBhcnRzW2ldID0gc3ByaW50ZiggZm10KyJkIiwgc2VjcyApOyBicmVhazsKKyAgICAgIGNhc2UgJ04nOgorICAgICAgIGlmKGFiYnIpIHBhcnRzW2ldID0gIk0iOworICAgICAgIGVsc2UgcGFydHNbaV0gPSBzcHJpbnRmKCBmbXQrInMiLCAobW9udGhzPT0xKSA/ICJNb25hdCIgOiAiTW9uYXRlIiApOworICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnVyc6CisgICAgICAgaWYoYWJicikgcGFydHNbaV0gPSAidyI7IGVsc2UKKyAgICAgICBwYXJ0c1tpXSA9IHNwcmludGYoIGZtdCsicyIsICh3ZWVrcz09MSkgPyAiV29jaGUiIDogIldvY2hlbiIgKTsKKyAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ0QnOgorICAgICAgIGlmKGFiYnIpIHBhcnRzW2ldID0gImQiOyBlbHNlCisgICAgICAgcGFydHNbaV0gPSBzcHJpbnRmKCBmbXQrInMiLCAoZGF5cz09MSkgPyAiVGFnIiA6ICJUYWdlIiApOworICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnSCc6CisgICAgICAgaWYoYWJicikgcGFydHNbaV0gPSAiaCI7IGVsc2UKKyAgICAgICBwYXJ0c1tpXSA9IHNwcmludGYoIGZtdCsicyIsIChob3Vycz09MSkgPyAiU3R1bmRlIiA6ICJTdHVuZGVuIiApOworICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnTSc6CisgICAgICAgaWYoYWJicikgcGFydHNbaV0gPSAibSI7IGVsc2UKKyAgICAgICBwYXJ0c1tpXSA9IHNwcmludGYoIGZtdCsicyIsIChtaW5zPT0xKSA/ICJNaW51dGUiIDogIk1pbnV0ZW4iICk7CisgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdTJzoKKyAgICAgICBpZihhYmJyKSBwYXJ0c1tpXSA9ICJzIjsgZWxzZQorICAgICAgIHBhcnRzW2ldID0gc3ByaW50ZiggZm10KyJzIiwgKHNlY3M9PTEpID8gIlNla3VuZGUiIDogIlNla3VuZGVuIiApOworICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnJSc6CisgICAgICAgcGFydHNbaV0gPSAiJSI7CisgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBpbXBsb2RlKCBwYXJ0cywgIiIgKTsKK30KKworbm9tYXNrIG1peGVkIF9fY3JlYXRlX3BsYXllcl9kdW1teShzdHJpbmcgbmFtZSkKK3sKKyAgc3RyaW5nIGVycjsKKyAgb2JqZWN0IG9iOworICBtaXhlZCBtOworICAvL2hhdCBuZW4gU2NoZXJ6a2VrcyBkaWUgQmx1ZXByaW50IGJld2VndD8KKyAgaWYgKChvYj1maW5kX29iamVjdCgiL3NlY3VyZS9sb2dpbiIpKSAmJiBlbnZpcm9ubWVudChvYikpCisgICAgICBjYXRjaChkZXN0cnVjdChvYik7cHVibGlzaCk7CisgIGVyciA9IGNhdGNoKG9iID0gY2xvbmVfb2JqZWN0KCJzZWN1cmUvbG9naW4iKTtwdWJsaXNoKTsKKyAgaWYgKGVycikKKyAgeworICAgIHdyaXRlKCJGZWhsZXIgYmVpbSBMYWRlbiB2b24gL3NlY3VyZS9sb2dpbi5jXG4iK2VycisiXG4iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAob2JqZWN0cChtPShtaXhlZClvYi0+bmV3X2xvZ29uKG5hbWUpKSkgbmV0ZGVhZFtuYW1lXT1tOworICByZXR1cm4gbTsKK30KKworbm9tYXNrIGludCBzZWN1cmVfbGV2ZWwoKQoreworICBpbnQgKmxldmVsOworICAvL2tldHRlIGRlciBDYWxsZXIgZHVyY2hsYXVmZW4sIGRlbiBuaWVkcmlnc3RlbiBMZXZlbCBpbiBkZXIgS2V0dGUKKyAgLy96dXJ1ZWNrZ2ViZW4uIFplcnN0b2VydGUgT2JqZWt0ZSAoU2VsYnN0emVyc3RvZXJlcikgZnVlaHJlbiB6dXIgUnVlY2tnYWJlCisgIC8vdm9uIDAuCisgIC8vY2FsbGVyX3N0YWNrKDEpIGZ1ZWd0IGRlbSBSdWVja2dhYmVhcnJheSB0aGlzX2ludGVyYWN0aXZlKCkgaGluenUgYnp3LiAwLAorICAvL3dlbm4gZXMga2VpbmVuIEludGVyYWN0aXZlIGdpYnQuIERpZSAwIGZ1ZWhydCBkYW5uIHdpZSBiZWkgemVyc3RvZXJ0ZW4KKyAgLy9PYmpla3RlbiB6dXIgUnVlY2tnYWJlIHZvbiAwLCB3YXMgZ2V3dWVuc2NodCBpc3QsIGRhIGVzIGhpZXIgZWluZW4KKyAgLy9JTnRlcmFjdGl2ZSBnZWJlbiBtdXNzLgorICBsZXZlbD1tYXAoY2FsbGVyX3N0YWNrKDEpLGZ1bmN0aW9uIGludCAob2JqZWN0IGNhbGxlcikKKyAgICAgIHtpZiAob2JqZWN0cChjYWxsZXIpKQorICAgICAgIHJldHVybihxdWVyeV93aXpfbGV2ZWwoZ2V0ZXVpZChjYWxsZXIpKSk7CisgICAgICAgcmV0dXJuKDApOyAvLyBrZWluIE9iamVrdCBkYSwgMC4KKyAgICAgIH0gKTsKKyAgcmV0dXJuKG1pbihsZXZlbCkpOyAvL2RlbiBrbGVpbnN0ZW4gV2VydCBpbSBBcnJheSB6dXJ1ZWNrZ2ViZW4gKGdnZi4gMCkKK30KKworbm9tYXNrIHN0cmluZyBzZWN1cmVfZXVpZCgpCit7CisgIHN0cmluZyBldWlkOworCisgIGlmICghdGhpc19pbnRlcmFjdGl2ZSgpKSAvLyBFcyBtdXNzIGVpbmVuIGludGVyYWN0aXZlIGdlYmVuCisgICAgIHJldHVybiAwOworICBldWlkPWdldGV1aWQodGhpc19pbnRlcmFjdGl2ZSgpKTsKKyAgLy8gdWViZXIgYWxsZSBDYWxsZXIgaXRlcmllcmVuLiBXZW5uIGVpbmVzIGRhdm9uIGVpbmUgYW5kZXJlIGV1aWQgaGF0IGFscworICAvLyBkZXIgSW50ZXJhY3RpdmUgdW5kIGRpZXNlIG5pY2h0IGRpZSBST09USUQgaXN0LCB3aXJkIDAgenVydWVja2dlYmVuLgorICAvLyBFYmVuc28sIGZhbGxzIGVpbiBTZWxic3R6ZXJzdG9lcmVyIGlyZ2VuZHdvIGluIGRlciBLZXR0ZSBpc3QuCisgIGZvcmVhY2gob2JqZWN0IGNhbGxlcjogY2FsbGVyX3N0YWNrKCkpIHsKKyAgICAgIGlmICghb2JqZWN0cChjYWxsZXIpIHx8CisgICAgICAgKGdldGV1aWQoY2FsbGVyKSE9ZXVpZCAmJiBnZXRldWlkKGNhbGxlcikhPVJPT1RJRCkpCisgICAgICAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gZXVpZDsgLy8gJ3NpY2hlcmUnIGV1aWQgenVydWVja2dlYmVuCit9CisKKy8vIElOUFVUX1BST01QVCB1bmQgbmVuIExlZXJwcm9tcHQgaGluenVmdWVnZW4sIHdlbm4ga2VpbnMgdWViZXJnZWJlbiB3aXJkLgorLy8gRGFzIHNvbGwgZGF6dSBkaWVuZW4sIGRhc3MgYWxsZSBnZ2YuIGVpbiBFT1IgYW0gUHJvbXB0ZW5kZSBrcmllZ2VuLi4uCisvLyNpZiBfX0JPT1RfVElNRV9fIDwgMTM2MDAxNzIxMwordmFyYXJncyB2b2lkIGlucHV0X3RvKCBtaXhlZCBmdW4sIGludCBmbGFncywgdmFyYXJncyBtaXhlZCAqYXJncyApCit7CisgICAgbWl4ZWQgKmFycjsKKyAgICBpbnQgaTsKKworICAgIGlmICggIXRoaXNfcGxheWVyKCkgfHwgIXByZXZpb3VzX29iamVjdCgpICkKKyAgICAgICByZXR1cm47CisKKyAgICAvLyBUT0RPOiBpbnB1dF90byguLi4sSU5QVVRfUFJPTVBULCAiIiwgLi4uKSwgd2VubiBrZWluIElOUFVUX1BST01QVAorICAgIC8vIHZvcmtvbW10Li4uCisgICAgaWYgKCBmbGFncyZJTlBVVF9QUk9NUFQgKSB7ICAgIAorICAgICAgICBhcnIgPSAoeyBmdW4sIGZsYWdzIH0pICsgYXJnczsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8vIGdnZi4gZWluIElOUFVUX1BST01QVCBoaW56dWZ1ZWdlbiB1bmQgbmVuIExlZXJzdHJpbmcgYWxzIFByb21wdC4KKyAgICAgICAgZmxhZ3MgfD0gSU5QVVRfUFJPTVBUOworICAgICAgICBhcnIgPSAoeyBmdW4sIGZsYWdzLCAiIiB9KSArIGFyZ3M7CisgICAgfQorCisgICAgLy8gQXJyYXlzIGdlZ2VuIGZsYXR0ZW4gcXVvdGVuLgorICAgIGZvciAoIGkgPSBzaXplb2YoYXJyKSAtIDE7IGkgPiAxOyBpLS0gKQorICAgICAgIGlmICggcG9pbnRlcnAoYXJyW2ldKSApCisgICAgICAgICAgIGFycltpXSA9IHF1b3RlKGFycltpXSk7CisKKyAgICBhcHBseSggYmluZF9sYW1iZGEoIHVuYm91bmRfbGFtYmRhKCAoe30pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh7ICMnZWZ1bjo6aW5wdXRfdG8vKicqLyB9KSArIGFyciApLAorICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c19vYmplY3QoKSApICk7Cit9CisvLyNlbmRpZgorCitub21hc2sgaW50IHNldF9saWdodChpbnQgaSkKKy8vIGVyaG9laHQgZGFzIExpY2h0bGV2ZWwgZWluZXMgT2JqZWt0cyB1bSBpCisvLyByZXN1bHQ6IGRhcyBMaWNodGxldmVsIGlubmVyaGFsYiBkZXMgT2JqZWt0cworeworICAgIG9iamVjdCBvYiwgKmludjsKKyAgICBpbnQgbGFsbCwgbGlnaHQsIGRhcmssIHRtcDsKKworICAgIGlmICghKG9iPXByZXZpb3VzX29iamVjdCgpKSkgcmV0dXJuIDA7IC8vIG9obmUgZGFzIGdlaHRzIG5pY2h0LgorCisgICAgLy8gYXVzIGtvbXBhdGliaWxpdGFldHNncnVlbmRlbiBrYW5uIG1hbiBhdWNoIGRlbiBMaWNodGxldmVsIG5vY2ggc2V0emVuCisgICAgaWYgKGkhPTApIG9iLT5TZXRQcm9wKFBfTElHSFQsIG9iLT5RdWVyeVByb3AoUF9MSUdIVCkraSk7CisKKyAgICAvLyBMaWNodGJlcmVjaG51bmcgZmluZGV0IGVpZ2VudGxpY2ggaW4gZGVyIE11ZGxpYiBzdGF0dC4KKyAgICByZXR1cm4gKGludClvYi0+UXVlcnlQcm9wKFBfSU5UX0xJR0hUKTsKK30KKworCitwdWJsaWMgc3RyaW5nIGlzbzJhc2NpaSggc3RyaW5nIHN0ciApCit7CisgICAgaWYgKCAhc3RyaW5ncChzdHIpIHx8ICFzaXplb2Yoc3RyKSApCisgICAgICAgcmV0dXJuICIiOworCisgICAgc3RyID0gcmVncmVwbGFjZSggc3RyLCAi5CIsICJhZSIsIDEgKTsKKyAgICBzdHIgPSByZWdyZXBsYWNlKCBzdHIsICL2IiwgIm9lIiwgMSApOworICAgIHN0ciA9IHJlZ3JlcGxhY2UoIHN0ciwgIvwiLCAidWUiLCAxICk7CisgICAgc3RyID0gcmVncmVwbGFjZSggc3RyLCAixCIsICJBZSIsIDEgKTsKKyAgICBzdHIgPSByZWdyZXBsYWNlKCBzdHIsICLWIiwgIk9lIiwgMSApOworICAgIHN0ciA9IHJlZ3JlcGxhY2UoIHN0ciwgItwiLCAiVWUiLCAxICk7CisgICAgc3RyID0gcmVncmVwbGFjZSggc3RyLCAi3yIsICJzcyIsIDEgKTsKKyAgICBzdHIgPSByZWdyZXBsYWNlKCBzdHIsICJbXiAtfl0iLCAiPyIsIDEgKTsKKworICAgIHJldHVybiBzdHI7Cit9CisKKworcHVibGljIHZhcmFyZ3Mgc3RyaW5nIENvdW50VXAoIHN0cmluZyAqcywgc3RyaW5nIHNlcCwgc3RyaW5nIGxhc3RzZXAgKQoreworICAgIHN0cmluZyByZXQ7CisKKyAgICBpZiAoICFwb2ludGVycChzKSApCisgICAgICAgcmV0dXJuICIiOworICAgIAorICAgIGlmICghc2VwKSBzZXAgPSAiLCAiOworICAgIGlmICghbGFzdHNlcCkgbGFzdHNlcCA9ICIgdW5kICI7CisKKyAgICBzd2l0Y2ggKHNpemVvZihzKSkgIHsKKyAgICAgICBjYXNlIDA6IHJldD0iIjsgYnJlYWs7CisgICAgICAgY2FzZSAxOiByZXQ9c1swXTsgYnJlYWs7CisgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgcmV0ID0gaW1wbG9kZShzWzAuLjwyXSwgc2VwKTsKKyAgICAgICAgICAgICAgcmV0ICs9IGxhc3RzZXAgKyBzWzwxXTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworbm9tYXNrIHZhcmFyZ3MgaW50IHF1ZXJ5X25leHRfcmVzZXQob2JqZWN0IG9iKSB7CisKKyAgICAvLyBUeXBwcnVlZnVuZzogZXR3YXMgYW5kZXJlcyBhbHMgT2JqZWt0ZSBvZGVyIDAgc29sbGVuIEZlaGxlciBzZWluLgorICAgIGlmIChvYiAmJiAhb2JqZWN0cChvYikpCisgICAgICByYWlzZV9lcnJvcihzcHJpbnRmKCJCYWQgYXJnIDEgdG8gcXVlcnlfbmV4dF9yZXNldCgpOiBnb3QgJS4yME8sICIKKyAgICAgICAgICAgImV4cGVjdGVkIG9iamVjdC5cbiIsb2IpKTsKKworICAgIC8vIERlZmF1bHRvYmpla3QgUE8sIHdlbm4gMCB1ZWJlcmdlYmVuLgorICAgIGlmICggIW9iamVjdHAob2IpICkKKyAgICAgIG9iID0gcHJldmlvdXNfb2JqZWN0KCk7CisKKyAgICByZXR1cm4gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05FWFRfUkVTRVRfVElNRSk7Cit9CisKKworI2lmICFfX0VGVU5fREVGSU5FRF9fKGNvcHlfZmlsZSkKKyNkZWZpbmUgTUFYTEVOIDUwMDAwCitub21hc2sgaW50IGNvcHlfZmlsZShzdHJpbmcgc291cmNlLCBzdHJpbmcgZGVzdCkKK3sKKworICBpbnQgcHRyOworICBzdHJpbmcgYnl0ZXM7CisKKyAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKKyAgaWYgKCFzaXplb2Yoc291cmNlKXx8IXNpemVvZihkZXN0KXx8c291cmNlPT1kZXN0fHwoZmlsZV9zaXplKHNvdXJjZSk9PS0xKXx8CisgICAgICAoIWNhbGxfb3RoZXIobWFzdGVyKCksInZhbGlkX3JlYWQiLHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICBnZXR1aWQodGhpc19pbnRlcmFjdGl2ZSgpfHwKKyAgICAgICAgICAgICAgICAgcHJldmlvdXNfb2JqZWN0KCkpLCJyZWFkX2ZpbGUiLHByZXZpb3VzX29iamVjdCgpKSl8fAorICAgICAgKCFjYWxsX290aGVyKG1hc3RlcigpLCJ2YWxpZF9yZWFkIixzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgZ2V0dWlkKHRoaXNfaW50ZXJhY3RpdmUoKXx8CisgICAgICAgICAgICAgICAgIHByZXZpb3VzX29iamVjdCgpKSwid3JpdGVfZmlsZSIscHJldmlvdXNfb2JqZWN0KCkpKSkKKyAgICByZXR1cm4gMTsKKyAgc3dpdGNoIChmaWxlX3NpemUoZGVzdCkpCisgIHsKKyAgY2FzZSAtMToKKyAgICBicmVhazsKKyAgY2FzZSAtMjoKKyAgICBpZiAoZGVzdFs8MV0hPScvJykgZGVzdCs9Ii8iOworICAgIGRlc3QrPWVmdW46OmV4cGxvZGUoc291cmNlLCIvIilbPDFdOworICAgIGlmIChmaWxlX3NpemUoZGVzdCk9PS0yKSByZXR1cm4gMTsKKyAgICBpZiAoZmlsZV9zaXplKGRlc3QpIT0tMSkgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgaWYgKCFybShkZXN0KSkgcmV0dXJuIDE7CisgICAgYnJlYWs7CisgIH0KKyAgZG8KKyAgeworICAgIGJ5dGVzID0gcmVhZF9ieXRlcyhzb3VyY2UsIHB0ciwgTUFYTEVOKTsgcHRyICs9IE1BWExFTjsKKyAgICBpZiAoIWJ5dGVzKSBieXRlcz0iIjsKKyAgICB3cml0ZV9maWxlKGRlc3QsIGJ5dGVzKTsKKyAgfQorICB3aGlsZShzaXplb2YoYnl0ZXMpID09IE1BWExFTik7CisgIHJldHVybiAwOworfQorI2VuZGlmIC8vIV9fRUZVTl9ERUZJTkVEX18oY29weV9maWxlKQorCisKKy8vICMjIyBFcnNhdHphdWZsb2VzdW5nIGluIFN0cmluZ3MgIyMjCit2YXJhcmdzIHN0cmluZyByZXBsYWNlX3BlcnNvbmFsKHN0cmluZyBzdHIsIG1peGVkICpvYnMsIGludCBjYXBzKSB7CisgIGludCBpOworICBzdHJpbmcgKnBhcnRzOworCisgIHBhcnRzID0gcmVnZXhwbG9kZShzdHIsICJAV0VbQS1TVV0qWzAtOV0iKTsKKyAgaSA9IHNpemVvZihwYXJ0cyk7CisKKyAgaWYgKGk+MSkgeworICAgIGludCBqLCB0OworICAgIGNsb3N1cmUgKm5hbWVfY2xzOworCisgICAgdCA9IGogPSBzaXplb2Yob2JzKTsKKworICAgIG5hbWVfY2xzICA9ICBhbGxvY2F0ZShqKTsKKyAgICB3aGlsZSAoai0tKQorICAgICAgaWYgKG9iamVjdHAob2JzW2pdKSkKKyAgICAgICAgbmFtZV9jbHNbal0gPSBzeW1ib2xfZnVuY3Rpb24oIm5hbWUiLCBvYnNbal0pOworICAgICAgZWxzZSBpZiAoc3RyaW5ncChvYnNbal0pKQorICAgICAgICBuYW1lX2Nsc1tqXSA9IG9ic1tqXTsKKworICAgIHdoaWxlICgoaS09IDIpPjApIHsKKyAgICAgIGludCBvYl9ucjsKKyAgICAgIC8vIHp1IGVyc2V0emVuZGVzIFRva2VuIGluIEZhbGwgdW5kIE9iamVrdGluZGV4IGF1ZnNwYWx0ZW4KKyAgICAgIG9iX25yID0gcGFydHNbaV1bPDFdLScxJzsKKyAgICAgIGlmIChvYl9ucjwwIHx8IG9iX25yPj10KSB7CisgICAgICAgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CisgICAgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoInJlcGxhY2VfcGVyc29uYWw6IHVzaW5nIHdyb25nIG9iamVjdCBpbmRleCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgb2JfbnIpKTsKKyAgICAgICAgcmV0dXJuIGltcGxvZGUocGFydHMsICIiKTsKKyAgICAgIH0KKworICAgICAgLy8gY2FzdXMga2FubiBtYW4gc2Nob24gaGllciBlbnRzY2hlaWRlbgorICAgICAgaW50IGNhc3VzOworICAgICAgc3RyaW5nIHBhcnQgPSBwYXJ0c1tpXTsKKyAgICAgIHN3aXRjaCAocGFydFszXSkgeworICAgICAgICBjYXNlICdSJzogY2FzdXMgPSBXRVI7ICAgIGJyZWFrOworICAgICAgICBjYXNlICdTJzogY2FzdXMgPSBXRVNTRU47IGJyZWFrOworICAgICAgICBjYXNlICdNJzogY2FzdXMgPSBXRU07ICAgIGJyZWFrOworICAgICAgICBjYXNlICdOJzogY2FzdXMgPSBXRU47ICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OiAgY29udGludWU7IC8vIHBhc3N0IHNjaG9uIGpldHp0IG5pY2h0IGluIGRhcyBIYXVwdG11c3RlcgorICAgICAgfQorCisgICAgICAvLyB1bmQgamV0enQgZGllIGVpbnplbG5lbiBLZXl3b3JkcyBvaG5lIGZ1ZWhyZW5kZXMgIkBXRSIsIGJlZW5kZW5kZSBJZAorICAgICAgbWl4ZWQgdG1wOworICAgICAgc3dpdGNoIChwYXJ0WzMuLjwyXSkgeworICAgICAgICBjYXNlICJSIjogY2FzZSAiU1NFTiI6IGNhc2UgIk0iOiBjYXNlICJOIjogICAgICAgICAgICAgICAvLyBOYW1lCisgICAgICAgICAgcGFydHNbaV0gPSBmdW5jYWxsKG5hbWVfY2xzW29iX25yXSwgY2FzdXMsIDEpOyAgYnJlYWs7CisgICAgICAgIGNhc2UgIlJVIjogY2FzZSAiU1NFTlUiOiBjYXNlICJNVSI6IGNhc2UgIk5VIjogICAgICAgICAgIC8vIHVuYmVzdGltbXQKKyAgICAgICAgICBwYXJ0c1tpXSA9IGZ1bmNhbGwobmFtZV9jbHNbb2JfbnJdLCBjYXN1cyk7ICAgICBicmVhazsKKyAgICAgICAgY2FzZSAiUlFQIjogY2FzZSAiU1NFTlFQIjogY2FzZSAiTVFQIjogY2FzZSAiTlFQIjogICAgICAgLy8gUHJvbm91bgorICAgICAgICAgIGlmIChvYmplY3RwKHRtcCA9IG9ic1tvYl9ucl0pKQorICAgICAgICAgICAgcGFydHNbaV0gPSAoc3RyaW5nKXRtcC0+UXVlcnlQcm9ub3VuKGNhc3VzKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAiUlFBIjogY2FzZSAiU1NFTlFBIjogY2FzZSAiTVFBIjogY2FzZSAiTlFBIjogICAgICAgLy8gQXJ0aWNsZQorICAgICAgICAgIGlmIChvYmplY3RwKHRtcCA9IG9ic1tvYl9ucl0pKQorICAgICAgICAgICAgdG1wID0gKHN0cmluZyl0bXAtPlF1ZXJ5QXJ0aWNsZShjYXN1cywgMSwgMSk7CisgICAgICAgICAgaWYgKHN0cmluZ3AodG1wKSAmJiAhKHRtcFs8MV1eJyAnKSkgCisgICAgICAgICAgICB0bXAgPSB0bXBbMC4uPDJdOyAgICAgICAgICAgICAgICAvLyBFeHRyYS1TcGFjZSB3aWVkZXIgbG9lc2NoZW4KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAiUlFQUE1TIjogY2FzZSAiU1NFTlFQUE1TIjogY2FzZSAiTVFQUE1TIjogY2FzZSAiTlFQUE1TIjoKKyAgICAgICAgICBpZiAob2JqZWN0cCh0bXAgPSBvYnNbb2JfbnJdKSkKKyAgICAgICAgICAgIHBhcnRzW2ldID0gKHN0cmluZyl0bXAtPlF1ZXJ5UG9zc1Byb25vdW4oTUFMRSwgY2FzdXMsIFNJTkdVTEFSKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAiUlFQUEZTIjogY2FzZSAiU1NFTlFQUEZTIjogY2FzZSAiTVFQUEZTIjogY2FzZSAiTlFQUEZTIjoKKyAgICAgICAgICBpZiAob2JqZWN0cCh0bXAgPSBvYnNbb2JfbnJdKSkKKyAgICAgICAgICAgIHBhcnRzW2ldID0gKHN0cmluZyl0bXAtPlF1ZXJ5UG9zc1Byb25vdW4oRkVNQUxFLCBjYXN1cywgU0lOR1VMQVIpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICJSUVBQTlMiOiBjYXNlICJTU0VOUVBQTlMiOiBjYXNlICJNUVBQTlMiOiBjYXNlICJOUVBQTlMiOgorICAgICAgICAgIGlmIChvYmplY3RwKHRtcCA9IG9ic1tvYl9ucl0pKQorICAgICAgICAgICAgcGFydHNbaV0gPSAoc3RyaW5nKXRtcC0+UXVlcnlQb3NzUHJvbm91bihORVVURVIsIGNhc3VzLCBTSU5HVUxBUik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgIlJRUFBNUCI6IGNhc2UgIlNTRU5RUFBNUCI6IGNhc2UgIk1RUFBNUCI6IGNhc2UgIk5RUFBNUCI6CisgICAgICAgICAgaWYgKG9iamVjdHAodG1wID0gb2JzW29iX25yXSkpCisgICAgICAgICAgICBwYXJ0c1tpXSA9IChzdHJpbmcpdG1wLT5RdWVyeVBvc3NQcm9ub3VuKE1BTEUsIGNhc3VzLCBQTFVSQUwpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICJSUVBQRlAiOiBjYXNlICJTU0VOUVBQRlAiOiBjYXNlICJNUVBQRlAiOiBjYXNlICJOUVBQRlAiOgorICAgICAgICAgIGlmIChvYmplY3RwKHRtcCA9IG9ic1tvYl9ucl0pKQorICAgICAgICAgICAgcGFydHNbaV0gPSAoc3RyaW5nKXRtcC0+UXVlcnlQb3NzUHJvbm91bihGRU1BTEUsIGNhc3VzLCBQTFVSQUwpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICJSUVBQTlAiOiBjYXNlICJTU0VOUVBQTlAiOiBjYXNlICJNUVBQTlAiOiBjYXNlICJOUVBQTlAiOgorICAgICAgICAgIGlmIChvYmplY3RwKHRtcCA9IG9ic1tvYl9ucl0pKQorICAgICAgICAgICAgcGFydHNbaV0gPSAoc3RyaW5nKXRtcC0+UXVlcnlQb3NzUHJvbm91bihORVVURVIsIGNhc3VzLCBQTFVSQUwpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgCisgICAgICAvLyB3ZW5uIHRtcCBlaW4gU3RyaW5nIHdhciwgd2Vpc2VuIHdpciBlcyBoaWVyIHBhdXNjaGFsIHp1CisgICAgICBpZiAoc3RyaW5ncCh0bXApKQorICAgICAgICBwYXJ0c1tpXSA9IHRtcDsKKworICAgICAgLy8gYXVmIFd1bnNjaCB3aXJkIG5hY2ggU2F0emVuZGVuIGdyb3NzIGdlc2NocmllYmVuCisgICAgICBpZiAoY2FwcykKKyAgICAgICAgc3dpdGNoIChwYXJ0c1tpLTFdWzwyLi5dKSB7CisgICAgICAgICAgY2FzZSAiLiAiOiAgY2FzZSAiISAiOiAgY2FzZSAiPyAiOgorICAgICAgICAgIGNhc2UgIi4iOiAgIGNhc2UgIiEiOiAgIGNhc2UgIj8iOgorICAgICAgICAgIGNhc2UgIi5cbiI6IGNhc2UgIiFcbiI6IGNhc2UgIj9cbiI6CisgICAgICAgICAgY2FzZSAiXCIgIjogY2FzZSAiXCJcbiI6CisgICAgICAgICAgICBwYXJ0c1tpXSA9IGNhcGl0YWxpemUocGFydHNbaV0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGltcGxvZGUocGFydHMsICIiKTsKKyAgfQorICByZXR1cm4gc3RyOworfQorCisKKy8vcmVwbGFjZW1lbnRzIGZvciBkcm9wcGVkIGVmdW5zIGluIExECisjaWYgIV9fRUZVTl9ERUZJTkVEX18oZXh0cmFjdCkKK2RlcHJlY2F0ZWQgdmFyYXJncyBzdHJpbmcgZXh0cmFjdChzdHJpbmcgc3RyLCBpbnQgZnJvbSwgaW50IHRvKSB7CisKKyAgaWYoIXN0cmluZ3Aoc3RyKSkgeworICAgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CisgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigiQmFkIGFyZ3VtZW50IDEgdG8gZXh0cmFjdCgpOiAlTyIsc3RyKSk7CisgIH0KKyAgaWYgKGludHAoZnJvbSkgJiYgaW50cCh0bykpIHsKKyAgICBpZiAoZnJvbT49MCAmJiB0bz49MCkKKyAgICAgIHJldHVybihzdHJbZnJvbSAuLiB0b10pOworICAgIGVsc2UgaWYgKGZyb20+PTAgJiYgdG88MCkKKyAgICAgIHJldHVybihzdHJbZnJvbSAuLiA8YWJzKHRvKV0pOworICAgIGVsc2UgaWYgKGZyb208MCAmJiB0bz49MCkKKyAgICAgIHJldHVybihzdHJbPGFicyhmcm9tKSAuLiB0b10pOworICAgIGVsc2UKKyAgICAgIHJldHVybihzdHJbPGFicyhmcm9tKSAuLiA8YWJzKHRvKV0pOworICB9CisgIGVsc2UgaWYgKGludHAoZnJvbSkpIHsKKyAgICBpZiAoZnJvbT49MCkKKyAgICAgIHJldHVybihzdHJbZnJvbSAuLiBdKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4oc3RyWzxhYnMoZnJvbSkgLi4gXSk7CisgIH0KKyAgZWxzZSB7CisgICAgcmV0dXJuKHN0cik7CisgIH0KK30KKyNlbmRpZiAvLyAhX19FRlVOX0RFRklORURfXyhleHRyYWN0KQorCisjaWYgIV9fRUZVTl9ERUZJTkVEX18oc2xpY2VfYXJyYXkpCitkZXByZWNhdGVkIHZhcmFyZ3MgbWl4ZWQgc2xpY2VfYXJyYXkobWl4ZWQgYXJyYXksIGludCBmcm9tLCBpbnQgdG8pIHsKKworICBpZighcG9pbnRlcnAoYXJyYXkpKSB7CisgICAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKKyAgICByYWlzZV9lcnJvcihzcHJpbnRmKCJCYWQgYXJndW1lbnQgMSB0byBzbGljZV9hcnJheSgpOiAlTyIsYXJyYXkpKTsKKyAgfQorICBpZiAoaW50cChmcm9tKSAmJiBpbnRwKHRvKSkgeworICAgIGlmIChmcm9tPj0wICYmIHRvPj0wKQorICAgICAgcmV0dXJuKGFycmF5W2Zyb20gLi4gdG9dKTsKKyAgICBlbHNlIGlmIChmcm9tPj0wICYmIHRvPDApCisgICAgICByZXR1cm4oYXJyYXlbZnJvbSAuLiA8YWJzKHRvKV0pOworICAgIGVsc2UgaWYgKGZyb208MCAmJiB0bz49MCkKKyAgICAgIHJldHVybihhcnJheVs8YWJzKGZyb20pIC4uIHRvXSk7CisgICAgZWxzZQorICAgICAgcmV0dXJuKGFycmF5WzxhYnMoZnJvbSkgLi4gPGFicyh0byldKTsKKyAgfQorICBlbHNlIGlmIChpbnRwKGZyb20pKSB7CisgICAgaWYgKGZyb20+PTApCisgICAgICByZXR1cm4oYXJyYXlbZnJvbSAuLiBdKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4oYXJyYXlbPGFicyhmcm9tKSAuLiBdKTsKKyAgfQorICBlbHNlIHsKKyAgICByZXR1cm4oYXJyYXkpOworICB9Cit9CisjZW5kaWYgLy8gIV9fRUZVTl9ERUZJTkVEX18oc2xpY2VfYXJyYXkpCisKKyNpZiAhX19FRlVOX0RFRklORURfXyhtZW1iZXJfYXJyYXkpCitkZXByZWNhdGVkIGludCBtZW1iZXJfYXJyYXkobWl4ZWQgaXRlbSwgbWl4ZWQgYXJyYXlzdHJpbmcpIHsKKworICBpZiAocG9pbnRlcnAoYXJyYXlzdHJpbmcpKSB7CisgICAgcmV0dXJuKGVmdW46Om1lbWJlcihhcnJheXN0cmluZyxpdGVtKSk7CisgIH0KKyAgZWxzZSBpZiAoc3RyaW5ncChhcnJheXN0cmluZykpIHsKKyAgICByZXR1cm4oZWZ1bjo6bWVtYmVyKGFycmF5c3RyaW5nLHRvX2ludChpdGVtKSkpOworICB9CisgIGVsc2UgeworICAgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CisgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigiQmFkIGFyZ3VtZW50IDEgdG8gbWVtYmVyX2FycmF5KCk6ICVPIixhcnJheXN0cmluZykpOworICB9Cit9CisjZW5kaWYgLy8gIV9fRUZVTl9ERUZJTkVEX18obWVtYmVyX2FycmF5KQorCisvLyBUaGUgZGlnaXQgYXQgdGhlIGkndGggcG9zaXRpb24gaXMgdGhlIG51bWJlciBvZiBiaXRzIHNldCBpbiAnaScuCitzdHJpbmcgY291bnRfdGFibGUgPQorICAgICIwMTEyMTIyMzEyMjMyMzM0MTIyMzIzMzQyMzM0MzQ0NTEyMjMyMzM0MjMzNDM0NDUyMzM0MzQ0NTM0NDU0NTU2IjsKK2ludCBicm9rZW5fY291bnRfYml0cyggc3RyaW5nIHMgKSB7CisgICAgaW50IGksIHJlczsKKyAgICBpZiggIXN0cmluZ3AocykgfHwgIShpPXNpemVvZihzKSkgKSByZXR1cm4gMDsKKyAgICBmb3IoIDsgaS0tPjA7ICkgeworICAgICAgICAvLyBXZSBhcmUgY291bnRpbmcgNiBiaXRzIGF0IGEgdGltZSB1c2luZyBhIHByZWNvbXBpbGVkIHRhYmxlLgorICAgICAgICByZXMgKz0gY291bnRfdGFibGVbKHNbaV0tJyAnKSY2M10tJzAnOworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCisjaWYgIV9fRUZVTl9ERUZJTkVEX18oY291bnRfYml0cykKK2ludCBjb3VudF9iaXRzKCBzdHJpbmcgcyApIHsKKyAgICByZXR1cm4oYnJva2VuX2NvdW50X2JpdHMocykpOworfQorI2VuZGlmCisKKworLy8gKiBUZWlsZSBhdXMgZWluZW0gQXJyYXkgZW50ZmVybmVuICoqKiBPQlNPTEVURQorZGVwcmVjYXRlZCBtaXhlZCAqZXhjbHVkZV9hcnJheShtaXhlZCAqYXJyLGludCBmcm9tLGludCB0bykKK3sKKyAgaWYgKHRvPGZyb20pCisgICAgdG8gPSBmcm9tOworICByZXR1cm4gYXJyWzAuLmZyb20tMV0rYXJyW3RvKzEuLl07Cit9CisKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL1JFQURNRSBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDM0MjlhCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvUkVBRE1FCkBAIC0wLDAgKzEsMjAgQEAKK3NpbXVsX2VmdW4gCistLS0tLS0tLS0tIAorRGFzIHNpbXVsX2VmdW4gT2JqZWt0IC9zZWN1cmUvc2ltdWxfZWZ1bi9zaW11bF9lZnVuIGJlbnV0enQgZGllIERhdGVpZW4KK2luIC9zZWN1cmUvc2ltdWxfZWZ1bi4KK0ltIFZlcnplaWNobmlzIC9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZSBpc3QgZWluZSBTaWNoZXJoZWl0c2tvcGllIHZvbiBhbGxlbiAKK0RhdGVpZW4gaW4gL3NlY3VyZS9zaW11bF9lZnVuLgorCitGYWxscyAvc2VjdXJlL3NpbXVsX2VmdW4vc2ltdWxfZWZ1bi5jIG5pY2h0IGxhZGJhciBpc3QsIHdpcmQgCisvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc2ltdWxfZWZ1bi5jIGFscyBFcnNhdHogdmVyc3VjaHQuIFdlbm4gYXVjaCBkYXMKK25pY2h0IGxhZGJhciBpc3QsIGVyZm9sZ3QgZWluIFNodXRkb3duIGRlcyBNdWRzLgorCitCZWkgQWVuZGVydW5nZW4gc29sbHRlIF96dWVyc3RfIGRpZSBub3JtYWxlIHNpbXVsIGVmdW4gZWRpdGllcnQgdW5kCithbnNjaGxpZXNzZW5kIHplcnN0b2VydC9lbnRsYWRlbiB3ZXJkZW4sIHdvcmF1ZmhpbiBzaWUgaW1wbGl6aXQgZHVyY2ggZGVuCitEcml2ZXIgdW5kIE1hc3RlciBuZXVnZWxhZGVuIHdpcmQuIElzdCBkaWVzIGVyZm9sZ3JlaWNoIHVuZCBkaWUgbmV1ZQorc2ltdWxfZWZ1biBsYWV1ZnQgKGVyc3QgZGFubiEpIGtvcGllcnQgbWFuIGRpZSBEYXRlaWVuIGF1cyAKKy9zZWN1cmUvc2ltdWxfZWZ1biBuYWNoIC9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS4KKworRGllIERhdGVpZW4gaGllciBzaW5kIG1pdCBBdXNuYWhtZSBkZXIgc2ltdWxfZWZ1bi5jIHNlbGJzdCBfbmljaHRfIGRhenUgCitnZWRhY2h0LCBnZWxhZGVuIHp1IHdlcmRlbi4KKwpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvY29tbS5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvY29tbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5NWI4NTIKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9jb21tLmMKQEAgLTAsMCArMSwxMjQgQEAKKyNpbmNsdWRlIDxsaXZpbmcvY29tbS5oPgorCisvLyBTZW5kZXQgYW4gYWxsZSBPYmpla3RlIGluIHJvb20gdW5kIHJvb20gc2VsYmVyIGR1cmNoIEF1ZnJ1ZiB2b24KKy8vIFJlY2VpdmVNc2coKS4KK3ZhcmFyZ3Mgdm9pZCBzZW5kX3Jvb20ob2JqZWN0fHN0cmluZyByb29tLCBzdHJpbmcgbXNnLCBpbnQgbXNnX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBtc2dfYWN0aW9uLCBzdHJpbmcgbXNnX3ByZWZpeCwgb2JqZWN0ICpleGNsdWRlLAorICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Qgb3JpZ2luKQoreworICBpZiAoc3RyaW5ncChyb29tKSkKKyAgICByb29tPWxvYWRfb2JqZWN0KHJvb20pOworCisgIG9yaWdpbiB8fD0gcHJldmlvdXNfb2JqZWN0KCk7CisgIG9iamVjdCAqZGVzdCA9IGV4Y2x1ZGUgPyBhbGxfaW52ZW50b3J5KHJvb20pIC0gZXhjbHVkZSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxfaW52ZW50b3J5KHJvb20pOworCisgIGRlc3QtPlJlY2VpdmVNc2cobXNnLCBtc2dfdHlwZSwgbXNnX2FjdGlvbiwgbXNnX3ByZWZpeCwgb3JpZ2luKTsKK30KKworc3RhdGljIGludCBfc2hvdXRfZmlsdGVyKCBvYmplY3Qgb2IsIHN0cmluZyBwYXQgKQoreworICAgIHN0cmluZyAqaWdub3JlOworCisgICAgaWYgKCAhZW52aXJvbm1lbnQob2IpICkKKyAgICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiBzaXplb2YoIHJlZ2V4cCggKHsgb2JqZWN0X25hbWUoIGVudmlyb25tZW50KG9iKSApIH0pLCBwYXQgKSApOworfQorCit2YXJhcmdzIHZvaWQgc2hvdXQoIHN0cmluZyBzLCBtaXhlZCB3aGVyZSApeworICAgIG9iamVjdCAqdTsKKyAgICBzdHJpbmcgKnBmYWRlOworCisgICAgaWYgKCAhc2l6ZW9mKCB1ID0gdXNlcnMoKSAtICh7IHRoaXNfcGxheWVyKCkgfSkgKSApCisgICAgICAgcmV0dXJuOworCisgICAgaWYgKCAhd2hlcmUgKQorICAgICAgIHBmYWRlID0gKHsgIi8iIH0pOworICAgIGVsc2UgaWYgKCBpbnRwKHdoZXJlKSApCisgICAgICAgcGZhZGUgPQorICAgICAgICAgICAoeyBpbXBsb2RlKCBlZnVuOjpleHBsb2RlKCBvYmplY3RfbmFtZSggZW52aXJvbm1lbnQodGhpc19wbGF5ZXIoKSkgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8iIClbMC4uMl0sICIvIiApICsgIi8iIH0pOworICAgIGVsc2UgaWYgKCBzdHJpbmdwKHdoZXJlKSApCisgICAgICAgcGZhZGUgPSAoeyB3aGVyZSB9KTsKKyAgICBlbHNlCisgICAgICAgcGZhZGUgPSB3aGVyZTsKKworICAgIHUgPSBmaWx0ZXIoIHUsICJfc2hvdXRfZmlsdGVyIiwgTUUsIGltcGxvZGUoIHBmYWRlLCAifCIgKSApOworICAgIHUtPlJlY2VpdmVNc2cocywgTVRfQ09NTXxNVF9GQVJ8TVNHX0RPTlRfV1JBUHxNU0dfRE9OVF9TVE9SRSwKKyAgICAgICAgICAgICAgICAgIE1BX1NIT1VUX1NFRlVOLCAwLCBwcmV2aW91c19vYmplY3QoKSk7Cit9CisKKworI2lmIF9fVkVSU0lPTl9fID4gIjMuMy43MTgiCisvLyBUaGlzIHNlZnVuIHJlcGxhY2VzIHRoZSBkZXByZWNhdGVkIGVmdW4gY2F0KCkuCisjZGVmaW5lIENBVF9NQVhfTElORVMgNTAKK3ZhcmFyZ3MgaW50IGNhdChzdHJpbmcgZmlsZSwgaW50IHN0YXJ0LCBpbnQgbnVtKQoreworICAgIGlmIChleHRlcm5fY2FsbCgpKQorICAgICAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOworCisgICAgaW50IG1vcmU7CisKKyAgICBpZiAobnVtIDwgMCB8fCAhdGhpc19wbGF5ZXIoKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAoIXN0YXJ0KQorICAgICAgICBzdGFydCA9IDE7CisKKyAgICBpZiAoIW51bSB8fCBudW0gPiBDQVRfTUFYX0xJTkVTKSB7CisgICAgICAgIG51bSA9IENBVF9NQVhfTElORVM7CisgICAgICAgIG1vcmUgPSBzaXplb2YocmVhZF9maWxlKGZpbGUsIHN0YXJ0K251bSwgMSkpOworICAgIH0KKworICAgIHN0cmluZyB0eHQgPSByZWFkX2ZpbGUoZmlsZSwgc3RhcnQsIG51bSk7CisgICAgaWYgKCF0eHQpCisgICAgICAgIHJldHVybiAwOworCisgICAgZWZ1bjo6dGVsbF9vYmplY3QodGhpc19wbGF5ZXIoKSwgdHh0KTsKKworICAgIGlmIChtb3JlKQorICAgICAgICBlZnVuOjp0ZWxsX29iamVjdCh0aGlzX3BsYXllcigpLCAiKioqKipUUlVOQ0FURUQqKioqXG4iKTsKKworICAgIHJldHVybiBzaXplb2YodHh0ICYgIlxuIik7Cit9CisjdW5kZWYgQ0FUX01BWF9MSU5FUworI2VuZGlmIC8vIF9fVkVSU0lPTl9fID4gIjMuMy43MTgiCisKKyNpZiBfX1ZFUlNJT05fXyA+ICIzLjMuNzE5IgorLy8gVGhpcyBzZWZ1biByZXBsYWNlcyB0aGUgZGVwcmVjYXRlZCBlZnVuIHRhaWwoKS4KKyNkZWZpbmUgVEFJTF9NQVhfQllURVMgMTAwMAordmFyYXJncyBpbnQgdGFpbChzdHJpbmcgZmlsZSkKK3sKKyAgICBpZiAoZXh0ZXJuX2NhbGwoKSkKKyAgICAgICAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKKworICAgIGlmICghc3RyaW5ncChmaWxlKSB8fCAhdGhpc19wbGF5ZXIoKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBzdHJpbmcgdHh0ID0gcmVhZF9ieXRlcyhmaWxlLCAtKFRBSUxfTUFYX0JZVEVTICsgODApLCAoVEFJTF9NQVhfQllURVMgKyA4MCkpOworICAgIC8vIHJlYWRfYnl0ZXMoKSByZXR1cm5zIDAgaWYgdGhlIHN0YXJ0IG9mIHRoZSBzZWN0aW9uIGdpdmVuIGJ5CisgICAgLy8gcGFyYW1ldGVyICMyIGxpZXMgYmV5b25kIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUuCisgICAgLy8gSW4gdGhpcyBjYXNlIHdlIHNpbXBseSB0cnkgYW5kIHJlYWQgdGhlIGVudGlyZSBmaWxlLgorICAgIGlmICghc3RyaW5ncCh0eHQpICYmIGZpbGVfc2l6ZShmaWxlKSA8IFRBSUxfTUFYX0JZVEVTKzgwKQorICAgICAgdHh0ID0gcmVhZF9maWxlKGZpbGUpOworICAgIC8vIEV4aXQgaWYgc3RpbGwgbm90aGluZyBjb3VsZCBiZSByZWFkLgorICAgIGlmICghc3RyaW5ncCh0eHQpKQorICAgICAgcmV0dXJuIDA7CisKKyAgICAvLyBjdXQgb2ZmIGZpcnN0IChpbmNvbXBsZXRlKSBsaW5lCisgICAgaW50IGluZGV4ID0gc3Ryc3RyKHR4dCwgIlxuIik7CisgICAgaWYgKGluZGV4ID4gLTEpIHsKKyAgICAgICAgaWYgKGluZGV4ICsgMSA8IHNpemVvZih0eHQpKQorICAgICAgICAgICAgdHh0ID0gdHh0W2luZGV4KzEuLl07CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHR4dCA9ICIiOworICAgIH0KKworICAgIGVmdW46OnRlbGxfb2JqZWN0KHRoaXNfcGxheWVyKCksIHR4dCk7CisKKyAgICByZXR1cm4gMTsKK30KKyN1bmRlZiBUQUlMX01BWF9CWVRFUworI2VuZGlmIC8vIF9fVkVSU0lPTl9fID4gIjMuMy43MTkiCisKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL2RlYnVnX2luZm8uYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL2RlYnVnX2luZm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjA3YzJmCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvZGVidWdfaW5mby5jCkBAIC0wLDAgKzEsNDM0IEBACisvKiBUaGlzIHNlZnVuIGlzIHRvIHByb3ZpZGUgYSByZXBsYWNlbWVudCBmb3IgdGhlIGVmdW4gZGVidWdfaW5mbygpLgorICogRmVlbCBmcmVlIHRvIGFkZCBpdCB0byB5b3VyIG11ZGxpYnMsIGlmIHlvdSBoYXZlIG11Y2ggY29kZSByZWx5aW5nIG9uIHRoYXQuCisgKi8KKworI2lmICEgX19FRlVOX0RFRklORURfXyhkZWJ1Z19pbmZvKQorCisjaW5jbHVkZSA8ZHJpdmVyX2luZm8uaD4KKyNpbmNsdWRlIDxkZWJ1Z19pbmZvLmg+CisKK21peGVkIGRlYnVnX2luZm8oaW50IHdoYXQsIHZhcmFyZ3MgbWl4ZWQqIGFyZ3MpCit7CisgICAgaWYgKHNpemVvZihhcmdzKSA+IDIpCisgICAgICAgIHJhaXNlX2Vycm9yKCJUb28gbWFueSBhcmd1bWVudHMgdG8gZGVidWdfaW5mb1xuIik7CisKKyAgICBzd2l0Y2god2hhdCkKKyAgICB7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByYWlzZV9lcnJvcihzcHJpbnRmKCJJbGxlZ2FsIHZhbHVlICVkIGZvciBkZWJ1Z19pbmZvKCkuXG4iLCB3aGF0KSk7CisKKyAgICAgICAgY2FzZSBESU5GT19PQkpFQ1Q6CisgICAgICAgIHsKKyAgICAgICAgICAgIG9iamVjdCBvYjsKKworICAgICAgICAgICAgaWYgKHNpemVvZihhcmdzKSAhPSAxKQorICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKCJiYWQgbnVtYmVyIG9mIGFyZ3VtZW50cyB0byBkZWJ1Z19pbmZvXG4iKTsKKyAgICAgICAgICAgIGlmICghb2JqZWN0cChhcmdzWzBdKSkKKyAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFnIGFyZyAyIHRvIGRlYnVnX2luZm8oKS5cbiIpOworCisgICAgICAgICAgICBvYiA9IGFyZ3NbMF07CisgICAgICAgICAgICBwcmludGYoIk9fSEVBUlRfQkVBVCAgICAgIDogJXNcbiIsIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPQ19IRUFSVF9CRUFUKSAgICAgICA/ICJUUlVFIiA6ICJGQUxTRSIpOworICAgICAgICAgICAgcHJpbnRmKCJPX0VOQUJMRV9DT01NQU5EUyA6ICVzXG4iLCBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0NfQ09NTUFORFNfRU5BQkxFRCkgPyAiVFJVRSIgOiAiRkFMU0UiKTsKKyAgICAgICAgICAgIHByaW50ZigiT19DTE9ORSAgICAgICAgICAgOiAlc1xuIiwgZWZ1bjo6Y2xvbmVwKG9iKSAgICAgICAgICAgICAgICAgICAgICAgICAgID8gIlRSVUUiIDogIkZBTFNFIik7CisgICAgICAgICAgICBwcmludGYoIk9fREVTVFJVQ1RFRCAgICAgIDogRkFMU0VcbiIpOworICAgICAgICAgICAgcHJpbnRmKCJPX1NXQVBQRUQgICAgICAgICA6ICVzXG4iLCBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU1dBUFBFRCkgICAgICAgICAgPyAiVFJVRSIgOiAiRkFMU0UiKTsKKyAgICAgICAgICAgIHByaW50ZigiT19PTkNFX0lOVEVSQUNUSVZFOiAlc1xuIiwgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX09OQ0VfSU5URVJBQ1RJVkUpID8gIlRSVUUiIDogIkZBTFNFIik7CisgICAgICAgICAgICBwcmludGYoIk9fUkVTRVRfU1RBVEUgICAgIDogJXNcbiIsIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9SRVNFVF9TVEFURSkgICAgICA/ICJUUlVFIiA6ICJGQUxTRSIpOworICAgICAgICAgICAgcHJpbnRmKCJPX1dJTExfQ0xFQU5fVVAgICA6ICVzXG4iLCBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfV0lMTF9DTEVBTl9VUCkgICAgPyAiVFJVRSIgOiAiRkFMU0UiKTsKKyAgICAgICAgICAgIHByaW50ZigiT19SRVBMQUNFRCAgICAgICAgOiAlc1xuIiwgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1JFUExBQ0VEKSAgICAgICAgID8gIlRSVUUiIDogIkZBTFNFIik7CisgICAgICAgICAgICBwcmludGYoInRpbWVfcmVzZXQgIDogJWRcbiIsICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9ORVhUX1JFU0VUX1RJTUUpKTsKKyAgICAgICAgICAgIHByaW50ZigidGltZV9vZl9yZWYgOiAlZFxuIiwgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX0xBU1RfUkVGX1RJTUUpKTsKKyAgICAgICAgICAgIHByaW50ZigicmVmICAgICAgICAgOiAlZFxuIiwgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX09CSkVDVF9SRUZTKSk7CisKKyAgICAgICAgICAgIGludCBndGlja3MgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfR0lHQVRJQ0tTKTsKKyAgICAgICAgICAgIGlmKGd0aWNrcykKKyAgICAgICAgICAgICAgICBwcmludGYoImV2YWxjb3N0ICAgOiAgJWQlMDlkXG4iLCBndGlja3MsIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9USUNLUykpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHByaW50ZigiZXZhbGNvc3QgICA6ICAlZFxuIiwgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfVElDS1MpKTsKKworICAgICAgICAgICAgcHJpbnRmKCJzd2FwX251bSAgICA6ICVkXG4iLCAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU1dBUF9OVU0pKTsKKyAgICAgICAgICAgIHByaW50ZigibmFtZSAgICAgICAgOiAnJXMnXG4iLCAgICAgZWZ1bjo6b2JqZWN0X25hbWUob2IpKTsKKyAgICAgICAgICAgIHByaW50ZigibG9hZF9uYW1lICAgOiAnJXMnXG4iLCAgICAgZWZ1bjo6bG9hZF9uYW1lKG9iKSk7CisKKyAgICAgICAgICAgIG9iamVjdCBuZXh0X29iID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX09CSkVDVF9ORVhUKTsKKyAgICAgICAgICAgIGlmIChuZXh0X29iKQorICAgICAgICAgICAgICAgIHByaW50ZigibmV4dF9hbGwgICAgOiBPQkooJXMpXG4iLCBlZnVuOjpvYmplY3RfbmFtZShuZXh0X29iKSk7CisKKyAgICAgICAgICAgIG9iamVjdCBwcmV2X29iID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX09CSkVDVF9QUkVWKTsKKyAgICAgICAgICAgIGlmIChwcmV2X29iKQorICAgICAgICAgICAgICAgIHByaW50ZigiUHJldmlvdXMgb2JqZWN0IGluIG9iamVjdCBsaXN0OiBPQkooJXMpXG4iLCBlZnVuOjpvYmplY3RfbmFtZShwcmV2X29iKSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcHJpbnRmKCJUaGlzIG9iamVjdCBpcyB0aGUgaGVhZCBvZiB0aGUgb2JqZWN0IGxpc3QuXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBESU5GT19NRU1PUlk6CisgICAgICAgIHsKKyAgICAgICAgICAgIG9iamVjdCBvYjsKKworICAgICAgICAgICAgaWYgKHNpemVvZihhcmdzKSAhPSAxKQorICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKCJiYWQgbnVtYmVyIG9mIGFyZ3VtZW50cyB0byBkZWJ1Z19pbmZvXG4iKTsKKyAgICAgICAgICAgIGlmICghb2JqZWN0cChhcmdzWzBdKSkKKyAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFnIGFyZyAyIHRvIGRlYnVnX2luZm8oKS5cbiIpOworCisgICAgICAgICAgICBvYiA9IGFyZ3NbMF07CisKKyAgICAgICAgICAgIHByaW50ZigicHJvZ3JhbSByZWYncyAlM2RcbiIsICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1BST0dfUkVGUykpOworICAgICAgICAgICAgcHJpbnRmKCJOYW1lOiAnJXMnXG4iLCAgICAgICAgICBlZnVuOjpwcm9ncmFtX25hbWUob2IpKTsKKyAgICAgICAgICAgIHByaW50ZigicHJvZ3JhbSBzaXplICAgICU2ZFxuIiwgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1BST0dfU0laRSkpOworICAgICAgICAgICAgcHJpbnRmKCJudW0gZnVuYydzOiAgJTNkICglNGQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTlVNX0ZVTkNUSU9OUyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSVpFX0ZVTkNUSU9OUykpOworICAgICAgICAgICAgcHJpbnRmKCJudW0gdmFyczogICAgJTNkICglNGQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTlVNX1ZBUklBQkxFUyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSVpFX1ZBUklBQkxFUykpOworCisgICAgICAgICAgICBwcmludGYoIm51bSBzdHJpbmdzOiAlM2QgKCU0ZCkgOiBvdmVyaGVhZCAlZCArIGRhdGEgJWQgKCVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05VTV9TVFJJTkdTKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NJWkVfU1RSSU5HUykgKyBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0laRV9TVFJJTkdTX0RBVEEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0laRV9TVFJJTkdTKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NJWkVfU1RSSU5HU19EQVRBKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NJWkVfU1RSSU5HU19EQVRBX1RPVEFMKSk7CisKKyAgICAgICAgICAgIHByaW50ZigibnVtIGluaGVyaXRzICUzZCAoJTRkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05VTV9JTkhFUklURUQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0laRV9JTkhFUklURUQpKTsKKworICAgICAgICAgICAgcHJpbnRmKCJ0b3RhbCBzaXplICAgICAgJTZkXG4iLCBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfUFJPR19TSVpFX1RPVEFMKSk7CisKKyAgICAgICAgICAgIHByaW50ZigiZGF0YSBzaXplICAgICAgICU2ZCAoJTZkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfREFUQV9TSVpFKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX0RBVEFfU0laRV9UT1RBTCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIERJTkZPX09CSkxJU1Q6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzaXplb2YoYXJncykgPT0gMCkKKyAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFkIG51bWJlciBvZiBhcmd1bWVudHMgdG8gZGVidWdfaW5mb1xuIik7CisKKyAgICAgICAgICAgIGlmIChzaXplb2YoYXJncykgPT0gMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvYmplY3QgKiBvYnMgPSBlZnVuOjpvYmplY3RzKGFyZ3NbMF0sIDEpOworICAgICAgICAgICAgICAgIHJldHVybiBvYnNbMF07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIGVmdW46Om9iamVjdHMoYXJnc1swXSwgYXJnc1sxXSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgRElORk9fTUFMTE9DOgorICAgICAgICAgICAgd3JpdGUoZGVidWdfaW5mbyhESU5GT19TVEFUVVMsICJtYWxsb2MiKSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIERJTkZPX1NUQVRVUzoKKyAgICAgICAgeworICAgICAgICAgICAgc3RyaW5nIHdoaWNoOworICAgICAgICAgICAgaW50IG9wdDsKKworICAgICAgICAgICAgaWYgKHNpemVvZihhcmdzKSA+IDEpCisgICAgICAgICAgICAgICAgcmFpc2VfZXJyb3IoImJhZCBudW1iZXIgb2YgYXJndW1lbnRzIHRvIGRlYnVnX2luZm9cbiIpOworCisgICAgICAgICAgICBpZiAoIXNpemVvZihhcmdzKSB8fCAhYXJnc1swXSkKKyAgICAgICAgICAgICAgICB3aGljaCA9ICIiOworICAgICAgICAgICAgZWxzZSBpZihzdHJpbmdwKGFyZ3NbMF0pKQorICAgICAgICAgICAgICAgIHdoaWNoID0gYXJnc1swXTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFnIGFyZyAyIHRvIGRlYnVnX2luZm8oKS5cbiIpOworCisgICAgICAgICAgICBzd2l0Y2god2hpY2gpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAiIjoKKyAgICAgICAgICAgICAgICAgICAgb3B0ID0gRElfU1RBVFVTX1RFWFRfTUVNT1JZOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgInRhYmxlcyI6CisgICAgICAgICAgICAgICAgICAgIG9wdCA9IERJX1NUQVRVU19URVhUX1RBQkxFUzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlICJzd2FwIjoKKyAgICAgICAgICAgICAgICAgICAgb3B0ID0gRElfU1RBVFVTX1RFWFRfU1dBUDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlICJtYWxsb2MiOgorICAgICAgICAgICAgICAgICAgICBvcHQgPSBESV9TVEFUVVNfVEVYVF9NQUxMT0M7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAibWFsbG9jIGV4dHN0YXRzIjoKKyAgICAgICAgICAgICAgICAgICAgb3B0ID0gRElfU1RBVFVTX1RFWFRfTUFMTE9DX0VYVEVOREVEOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gZWZ1bjo6ZHJpdmVyX2luZm8ob3B0KTsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgRElORk9fRFVNUDoKKyAgICAgICAgeworICAgICAgICAgICAgaW50IG9wdDsKKworICAgICAgICAgICAgaWYgKCFzaXplb2YoYXJncykpCisgICAgICAgICAgICAgICAgcmFpc2VfZXJyb3IoImJhZCBudW1iZXIgb2YgYXJndW1lbnRzIHRvIGRlYnVnX2luZm9cbiIpOworCisgICAgICAgICAgICBpZighc3RyaW5ncChhcmdzWzBdKSkKKyAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFnIGFyZyAyIHRvIGRlYnVnX2luZm8oKS5cbiIpOworCisgICAgICAgICAgICBzd2l0Y2goYXJnc1swXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlICJvYmplY3RzIjoKKyAgICAgICAgICAgICAgICAgICAgb3B0ID0gRERJX09CSkVDVFM7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAiZGVzdHJ1Y3RlZCI6CisgICAgICAgICAgICAgICAgICAgIG9wdCA9IERESV9PQkpFQ1RTX0RFU1RSVUNURUQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAib3Bjb2RlcyI6CisgICAgICAgICAgICAgICAgICAgIG9wdCA9IERESV9PUENPREVTOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgIm1lbW9yeSI6CisgICAgICAgICAgICAgICAgICAgIG9wdCA9IERESV9NRU1PUlk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigiQmFkIGFyZ3VtZW50ICclcycgdG8gZGVidWdfaW5mbyhESU5GT19EVU1QKS5cbiIsIGFyZ3NbMF0pKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBlZnVuOjpkdW1wX2RyaXZlcl9pbmZvKG9wdCwgYXJnc1sxLi4xXS4uLik7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIERJTkZPX0RBVEE6CisgICAgICAgIHsKKyAgICAgICAgICAgIG1peGVkICogcmVzdWx0OworCisgICAgICAgICAgICBpZiAoIXNpemVvZihhcmdzKSkKKyAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFkIG51bWJlciBvZiBhcmd1bWVudHMgdG8gZGVidWdfaW5mb1xuIik7CisKKyAgICAgICAgICAgIGlmICghaW50cChhcmdzWzBdKSkKKyAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFnIGFyZyAyIHRvIGRlYnVnX2luZm8oKS5cbiIpOworCisgICAgICAgICAgICBpZiAoc2l6ZW9mKGFyZ3MpID09IDIgJiYgIWludHAoYXJnc1sxXSkpCisgICAgICAgICAgICAgICAgcmFpc2VfZXJyb3IoImJhZyBhcmcgMyB0byBkZWJ1Z19pbmZvKCkuXG4iKTsKKworICAgICAgICAgICAgc3dpdGNoKGFyZ3NbMF0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBESURfU1RBVFVTOgorICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBhbGxvY2F0ZShESURfU1RBVFVTX01BWCk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9BQ1RJT05TXSAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0FDVElPTlMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0FDVElPTlNfU0laRV0gICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX0FDVElPTlMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NIQURPV1NdICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU0hBRE9XUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU0hBRE9XU19TSVpFXSAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU0hBRE9XUyk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9PQkpFQ1RTXSAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX09CSkVDVFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX09CSkVDVFNfU0laRV0gICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX09CSkVDVFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX09CSkVDVFNfU1dBUFBFRF0gICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fT0JKRUNUU19TV0FQUEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9PQkpFQ1RTX1NXQVBfU0laRV0gICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9PQkpFQ1RTX1NXQVBQRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX09CSkVDVFNfTElTVF0gICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fT0JKRUNUU19JTl9MSVNUKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9PQkpFQ1RTX05FV0xZX0RFU1RdICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX09CSkVDVFNfTkVXTFlfREVTVFJVQ1RFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfT0JKRUNUU19ERVNUUlVDVEVEXSAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9PQkpFQ1RTX0RFU1RSVUNURUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX09CSkVDVFNfUFJPQ0VTU0VEXSAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fT0JKRUNUU19MQVNUX1BST0NFU1NFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfT0JKRUNUU19BVkdfUFJPQ10gICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX0xPQURfQVZFUkFHRV9QUk9DRVNTRURfT0JKRUNUU19SRUxBVElWRSk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9PVEFCTEVdICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX09CSkVDVFNfSU5fVEFCTEUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX09UQUJMRV9TTE9UU10gICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fT0JKRUNUX1RBQkxFX1NMT1RTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9PVEFCTEVfU0laRV0gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9PQkpFQ1RfVEFCTEUpOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfSEJFQVRfT0JKU10gICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9IRUFSVEJFQVRTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9IQkVBVF9DQUxMU10gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0hFQVJUQkVBVF9BQ1RJVkVfQ1lDTEVTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9IQkVBVF9DQUxMU19UT1RBTF0gICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0hFQVJUQkVBVF9UT1RBTF9DWUNMRVMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0hCRUFUX1NMT1RTXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fSEVBUlRCRUFUUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfSEJFQVRfU0laRV0gICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfSEVBUlRCRUFUUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfSEJFQVRfUFJPQ0VTU0VEXSAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9IRUFSVEJFQVRTX0xBU1RfUFJPQ0VTU0VEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9IQkVBVF9BVkdfUFJPQ10gICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTE9BRF9BVkVSQUdFX1BST0NFU1NFRF9IRUFSVEJFQVRTX1JFTEFUSVZFKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0NBTExPVVRTXSAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fQ0FMTE9VVFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0NBTExPVVRfU0laRV0gICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX0NBTExPVVRTKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0FSUkFZU10gICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fQVJSQVlTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9BUlJBWVNfU0laRV0gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9BUlJBWVMpOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfTUFQUElOR1NdICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9NQVBQSU5HUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfTUFQUElOR1NfU0laRV0gICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfTUFQUElOR1MpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0hZQlJJRF9NQVBQSU5HU10gICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fTUFQUElOR1NfSFlCUklEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9IQVNIX01BUFBJTkdTXSAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX01BUFBJTkdTX0hBU0gpOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSVUNUU10gICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TVFJVQ1RTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJVQ1RTX1NJWkVdICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TVFJVQ1RTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJVQ1RfVFlQRVNdICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NUUlVDVF9UWVBFUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSVUNUX1RZUEVTX1NJWkVdICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU1RSVUNUX1RZUEVTKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1BST0dTXSAgICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fUFJPR1MpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1BST0dTX1NJWkVdICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1BST0dTKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1BST0dTX1NXQVBQRURdICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fUFJPR1NfU1dBUFBFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfUFJPR1NfU1dBUF9TSVpFXSAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfUFJPR1NfU1dBUFBFRCk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9VU0VSX1JFU0VSVkVdICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTUVNT1JZX1JFU0VSVkVfVVNFUik7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfTUFTVEVSX1JFU0VSVkVdICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX01FTU9SWV9SRVNFUlZFX01BU1RFUik7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1lTVEVNX1JFU0VSVkVdICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX01FTU9SWV9SRVNFUlZFX1NZU1RFTSk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9BRERfTUVTU0FHRV0gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX01FU1NBR0VTX09VVCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfUEFDS0VUU10gICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9QQUNLRVRTX09VVCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfUEFDS0VUX1NJWkVdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfUEFDS0VUU19PVVQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1BBQ0tFVFNfSU5dICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fUEFDS0VUU19JTik7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfUEFDS0VUX1NJWkVfSU5dICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfUEFDS0VUU19JTik7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9BUFBMWV0gICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0ZVTkNUSU9OX05BTUVfQ0FMTFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0FQUExZX0hJVFNdICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fRlVOQ1RJT05fTkFNRV9DQUxMX0hJVFMpOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSSU5HU10gICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9WSVJUVUFMX1NUUklOR1MpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUklOR19TSVpFXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NUUklOR1MpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUl9UQUJMRV9TSVpFXSAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NUUklOR19UQUJMRSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSX09WRVJIRUFEXSAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU1RSSU5HX09WRVJIRUFEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9VTlRBQkxFRF0gICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NUUklOR1NfVU5UQUJMRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1VOVEFCTEVEX1NJWkVdICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NUUklOR1NfVU5UQUJMRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1RBQkxFRF0gICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1RSSU5HU19UQUJMRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1RBQkxFRF9TSVpFXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NUUklOR1NfVEFCTEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJfU0VBUkNIRVNdICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NUUklOR19UQUJMRV9MT09LVVBTX0JZX0lOREVYKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJfU0VBUkNITEVOXSAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NUUklOR19UQUJMRV9MT09LVVBfU1RFUFNfQllfSU5ERVgpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUl9TRUFSQ0hFU19CWVZBTFVFXSAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1RSSU5HX1RBQkxFX0xPT0tVUFNfQllfVkFMVUUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUl9TRUFSQ0hMRU5fQllWQUxVRV0gPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1RSSU5HX1RBQkxFX0xPT0tVUF9TVEVQU19CWV9WQUxVRSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSX0NIQUlOU10gICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TVFJJTkdfVEFCTEVfU0xPVFNfVVNFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSX0FEREVEXSAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TVFJJTkdfVEFCTEVfU1RSSU5HU19BRERFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSX0RFTEVURURdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TVFJJTkdfVEFCTEVfU1RSSU5HU19SRU1PVkVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJfQ09MTElTSU9OU10gICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NUUklOR19UQUJMRV9DT0xMSVNJT05TKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJfRk9VTkRdICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NUUklOR19UQUJMRV9ISVRTX0JZX0lOREVYKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJfRk9VTkRfQllWQUxVRV0gICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NUUklOR19UQUJMRV9ISVRTX0JZX1ZBTFVFKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1JYX0NBQ0hFRF0gICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fUkVHRVgpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1JYX1RBQkxFXSAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fUkVHRVhfVEFCTEVfU0xPVFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1JYX1RBQkxFX1NJWkVdICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1JFR0VYKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9SWF9SRVFVRVNUU10gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1JFR0VYX0xPT0tVUFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1JYX1JFUV9GT1VORF0gICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fUkVHRVhfTE9PS1VQX0hJVFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1JYX1JFUV9DT0xMXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fUkVHRVhfTE9PS1VQX0NPTExJU0lPTlMpOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfTUJfRklMRV0gICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfQlVGRkVSX0ZJTEUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX01CX1NXQVBdICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX0JVRkZFUl9TV0FQKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0JPT1RfVElNRV0gICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9CT09UX1RJTUUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgRElEX1NXQVA6CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGFsbG9jYXRlKERJRF9TV0FQX01BWCk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19QUk9HU10gICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1BST0dTX1NXQVBQRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX1BST0dfU0laRV0gICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1BST0dTX1NXQVBQRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX1BST0dfVU5TV0FQUEVEXSAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fUFJPR1NfVU5TV0FQUEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19QUk9HX1VfU0laRV0gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9QUk9HU19VTlNXQVBQRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX1ZBUlNdICAgICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fT0JKRUNUU19TV0FQUEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19WQVJfU0laRV0gICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9PQkpFQ1RTX1NXQVBQRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX0ZSRUVdICAgICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1dBUF9CTE9DS1NfRlJFRSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfRlJFRV9TSVpFXSAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU1dBUF9CTE9DS1NfRlJFRSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfRklMRV9TSVpFXSAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU1dBUF9CTE9DS1MpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX1JFVVNFRF0gICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NXQVBfQkxPQ0tTX1JFVVNFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfU0VBUkNIRVNdICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TV0FQX0JMT0NLU19SRVVTRV9MT09LVVBTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19TRUFSQ0hfTEVOXSAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NXQVBfQkxPQ0tTX1JFVVNFX0xPT0tVUF9TVEVQUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfRl9TRUFSQ0hFU10gICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TV0FQX0JMT0NLU19GUkVFX0xPT0tVUFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX0ZfU0VBUkNIX0xFTl0gICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1dBUF9CTE9DS1NfRlJFRV9MT09LVVBfU1RFUFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX0NPTVBBQ1RdICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhEQ19TV0FQX0NPTVBBQ1RfTU9ERSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfUkVDWUNMRV9GUkVFXSAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NXQVBfUkVDWUNMRV9QSEFTRSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBESURfTUVNT1JZOgorICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBhbGxvY2F0ZShESURfTUVNT1JZX01BWCk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fTkFNRV0gICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTUVNT1JZX0FMTE9DQVRPUl9OQU1FKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fU0JSS10gICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NZU19BTExPQ0FURURfQkxPQ0tTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fU0JSS19TSVpFXSAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TWVNfQUxMT0NBVEVEX0JMT0NLUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0xBUkdFXSAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9MQVJHRV9CTE9DS1NfQUxMT0NBVEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fTEFSR0VfU0laRV0gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9MQVJHRV9CTE9DS1NfQUxMT0NBVEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fTEZSRUVdICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0xBUkdFX0JMT0NLU19GUkVFKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fTEZSRUVfU0laRV0gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9MQVJHRV9CTE9DS1NfRlJFRSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0xXQVNURURdICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9MQVJHRV9CTE9DS1NfV0FTVEUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9MV0FTVEVEX1NJWkVdICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX0xBUkdFX0JMT0NLU19XQVNURSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0NIVU5LXSAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TTUFMTF9CTE9DS19DSFVOS1MpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9DSFVOS19TSVpFXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NNQUxMX0JMT0NLX0NIVU5LUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX1NNQUxMXSAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TTUFMTF9CTE9DS1NfQUxMT0NBVEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fU01BTExfU0laRV0gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TTUFMTF9CTE9DS1NfQUxMT0NBVEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fU0ZSRUVdICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NNQUxMX0JMT0NLU19GUkVFKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fU0ZSRUVfU0laRV0gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TTUFMTF9CTE9DS1NfRlJFRSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX1NXQVNURURdICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TTUFMTF9CTE9DS1NfV0FTVEUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9TV0FTVEVEX1NJWkVdICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NNQUxMX0JMT0NLU19XQVNURSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX01JTkNfQ0FMTFNdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9JTkNSRU1FTlRfU0laRV9DQUxMUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX01JTkNfU1VDQ0VTU10gICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9JTkNSRU1FTlRfU0laRV9DQUxMX1NVQ0NFU1NFUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX01JTkNfU0laRV0gICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfSU5DUkVNRU5UX1NJWkVfQ0FMTF9ESUZGUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX1BFUk1dICAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9VTk1BTkFHRURfQkxPQ0tTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fUEVSTV9TSVpFXSAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9VTk1BTkFHRURfQkxPQ0tTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fQ0xJQl0gICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1JFUExBQ0VNRU5UX01BTExPQ19DQUxMUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0NMSUJfU0laRV0gICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfUkVQTEFDRU1FTlRfTUFMTE9DX0NBTExTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fT1ZFUkhFQURdICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TTUFMTF9CTE9DS19PVkVSSEVBRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0FMTE9DQVRFRF0gICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfTUVNT1JZX1VTRUQpICsgZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9NRU1PUllfT1ZFUkhFQUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9VU0VEXSAgICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX01FTU9SWV9VU0VEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fVE9UQUxfVU5VU0VEXSAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9NRU1PUllfVU5VU0VEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fREVGUkFHX0NBTExTXSAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX01FTU9SWV9ERUZSQUdNRU5UQVRJT05fQ0FMTFNfRlVMTCkgKyBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fTUVNT1JZX0RFRlJBR01FTlRBVElPTl9DQUxMU19UQVJHRVRFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0RFRlJBR19DQUxMU19SRVFdICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9NRU1PUllfREVGUkFHTUVOVEFUSU9OX0NBTExTX1RBUkdFVEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fREVGUkFHX1JFUV9TVUNDRVNTXSAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX01FTU9SWV9ERUZSQUdNRU5UQVRJT05fQ0FMTF9UQVJHRVRfSElUUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0RFRlJBR19CTE9DS1NfSU5TUEVDVEVEXSA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9NRU1PUllfREVGUkFHTUVOVEFUSU9OX0JMT0NLU19JTlNQRUNURUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9ERUZSQUdfQkxPQ0tTX01FUkdFRF0gPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fTUVNT1JZX0RFRlJBR01FTlRBVElPTl9CTE9DS1NfTUVSR0VEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fREVGUkFHX0JMT0NLU19SRVNVTFRdID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX01FTU9SWV9ERUZSQUdNRU5UQVRJT05fQkxPQ0tTX1JFU1VMVElORyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0FWTF9OT0RFU10gICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9GUkVFX0JMT0NLU19BVkxfTk9ERVMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9FWFRfU1RBVElTVElDU10gICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9NRU1PUllfRVhURU5ERURfU1RBVElTVElDUyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc2l6ZW9mKGFyZ3MpID09IDIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGlkeCA9IGFyZ3NbMF07CisgICAgICAgICAgICAgICAgaWYgKGlkeCA8IDAgfHwgaWR4ID49IHNpemVvZihyZXN1bHQpKQorICAgICAgICAgICAgICAgICAgICByYWlzZV9lcnJvcihzcHJpbnRmKCJJbGxlZ2FsIGluZGV4IGZvciBkZWJ1Z19pbmZvKCk6ICVkLCBleHBlY3RlZCAwLi4lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlkeCwgc2l6ZW9mKHJlc3VsdCktMSkpOworCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdFtpZHhdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIERJTkZPX1RSQUNFOgorICAgICAgICB7CisgICAgICAgICAgICBpbnQgd2hpY2ggPSBESVRfQ1VSUkVOVDsKKworICAgICAgICAgICAgaWYgKHNpemVvZihhcmdzKSA+IDEpCisgICAgICAgICAgICAgICAgcmFpc2VfZXJyb3IoImJhZCBudW1iZXIgb2YgYXJndW1lbnRzIHRvIGRlYnVnX2luZm9cbiIpOworICAgICAgICAgICAgaWYgKHNpemVvZihhcmdzKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWludHAoYXJnc1swXSkpCisgICAgICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKCJiYWcgYXJnIDIgdG8gZGVidWdfaW5mbygpLlxuIik7CisgICAgICAgICAgICAgICAgd2hpY2ggPSBhcmdzWzBdOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKHdoaWNoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgRElUX0NVUlJFTlQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlZnVuOjpkcml2ZXJfaW5mbyhESV9UUkFDRV9DVVJSRU5UKTsKKworICAgICAgICAgICAgICAgIGNhc2UgRElUX0VSUk9SOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWZ1bjo6ZHJpdmVyX2luZm8oRElfVFJBQ0VfTEFTVF9FUlJPUikgfHwgKHsgIk5vIHRyYWNlLiIgfSk7CisKKyAgICAgICAgICAgICAgICBjYXNlIERJVF9VTkNBVUdIVF9FUlJPUjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVmdW46OmRyaXZlcl9pbmZvKERJX1RSQUNFX0xBU1RfVU5DQVVHSFRfRVJST1IpIHx8ICh7ICJObyB0cmFjZS4iIH0pOworCisgICAgICAgICAgICAgICAgY2FzZSBESVRfU1RSX0NVUlJFTlQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlZnVuOjpkcml2ZXJfaW5mbyhESV9UUkFDRV9DVVJSRU5UX0FTX1NUUklORyk7CisKKyAgICAgICAgICAgICAgICBjYXNlIERJVF9DVVJSRU5UX0RFUFRIOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWZ1bjo6ZHJpdmVyX2luZm8oRElfVFJBQ0VfQ1VSUkVOVF9ERVBUSCk7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFkIGFyZyAyIHRvIGRlYnVnX2luZm8oKS5cbiIpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICBjYXNlIERJTkZPX0VWQUxfTlVNQkVSOgorICAgICAgICAgICAgcmV0dXJuIGVmdW46OmRyaXZlcl9pbmZvKERJX0VWQUxfTlVNQkVSKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvZW5hYmxlX2NvbW1hbmRzLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9lbmFibGVfY29tbWFuZHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDFjOTYzCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvZW5hYmxlX2NvbW1hbmRzLmMKQEAgLTAsMCArMSwzMCBAQAorLyogVGhlc2Ugc2VmdW5zIGFyZSB0byBwcm92aWRlIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBlZnVucyBlbmFibGVfY29tbWFuZHMoKQorICogYW5kIGRpc2FibGVfY29tbWFuZHMoKS4KKyAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgorICovCisKKyNpbmNsdWRlIDxjb25maWd1cmF0aW9uLmg+CisKKyNpZiAhIF9fRUZVTl9ERUZJTkVEX18oZW5hYmxlX2NvbW1hbmRzKQorCit2b2lkIGVuYWJsZV9jb21tYW5kcygpCit7CisgICAgb2JqZWN0IG9iID0gZWZ1bjo6cHJldmlvdXNfb2JqZWN0KCk7CisKKyAgICBlZnVuOjpjb25maWd1cmVfb2JqZWN0KG9iLCBPQ19DT01NQU5EU19FTkFCTEVELCAxKTsKKyAgICBlZnVuOjpzZXRfdGhpc19wbGF5ZXIob2IpOworfQorCisjZW5kaWYKKworI2lmICEgX19FRlVOX0RFRklORURfXyhkaXNhYmxlX2NvbW1hbmRzKQorCit2b2lkIGRpc2FibGVfY29tbWFuZHMoKQoreworICAgIG9iamVjdCBvYiA9IGVmdW46OnByZXZpb3VzX29iamVjdCgpOworCisgICAgZWZ1bjo6Y29uZmlndXJlX29iamVjdChvYiwgT0NfQ09NTUFORFNfRU5BQkxFRCwgMCk7CisgICAgZWZ1bjo6c2V0X3RoaXNfcGxheWVyKDApOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL2hhc2guYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL2hhc2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWJiZjYwCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvaGFzaC5jCkBAIC0wLDAgKzEsMTcgQEAKKyNpbmNsdWRlICIvc3lzL3Rscy5oIgorCitkZXByZWNhdGVkIHN0cmluZyBtZDUobWl4ZWQgYXJnLCB2YXJhcmdzIG1peGVkKiBpdGVyYXRpb25zKQoreworICAgIGlmIChleHRlcm5fY2FsbCgpKQorICAgICAgICAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKKworICAgIHJldHVybiBoYXNoKFRMU19IQVNIX01ENSwgYXJnLCBpdGVyYXRpb25zLi4uKTsKK30KKworZGVwcmVjYXRlZCBzdHJpbmcgc2hhMShtaXhlZCBhcmcsIHZhcmFyZ3MgbWl4ZWQqIGl0ZXJhdGlvbnMpCit7CisgICAgaWYgKGV4dGVybl9jYWxsKCkpCisgICAgICAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOworCisgICAgcmV0dXJuIGhhc2goVExTX0hBU0hfU0hBMSwgYXJnLCBpdGVyYXRpb25zLi4uKTsKK30KZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL2xpdmluZ3MuYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL2xpdmluZ3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjBmY2VlCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvbGl2aW5ncy5jCkBAIC0wLDAgKzEsMzQ4IEBACisvLyAqIGxpdmluZ19uYW1lLUJlaGFuZGx1bmcKKworI2RlZmluZSBjbGVhbl9sb2cocykKKy8vI2RlZmluZSBjbGVhbl9sb2cocykgbG9nX2ZpbGUoIkNMRUFOX1NJTSIsY3RpbWUodGltZSgpKVs0Li4xOF0rIjogIisocykpOworCitwcml2YXRlIG5vc2F2ZSBtYXBwaW5nIGxpdmluZ19uYW1lX20sIG5hbWVfbGl2aW5nX20sIG5ldGRlYWQ7CisKK3ByaXZhdGUgdm9pZCBJbml0TGl2aW5nRGF0YShtaXhlZCB3aXppbmZvKSB7CisgIC8vIGxpdmluZ19uYW1lIGlzdCBlaW4gUG9pbnRlciBkZXIgYXVjaCBpbiBkZXIgZXh0cmFfd2l6aW5mbyBnZWhhbHRlbiAKKyAgLy8gd2lyZCwgc28ga2FubiBkaWUgc2ltdWxfZWZ1biBuZXUgZ2VsYWRlbiB3ZXJkZW4sIG9obmUgZGFzcyBkaWVzZXMKKyAgLy8gTWFwcGluZyB2ZXJsb3JlbiBnZWh0CisgIGlmICghbWFwcGluZ3AobGl2aW5nX25hbWVfbSA9IHdpemluZm9bTElWSU5HX05BTUVdKSkKKyAgICBsaXZpbmdfbmFtZV9tID0gd2l6aW5mb1tMSVZJTkdfTkFNRV0gPSBtX2FsbG9jYXRlKDAsIDEpOworCisgIC8vIEdsZWljaGVzIGdpbHQgZnVlciBkYXMgTWFwcGluZyBOYW1lLUxpdmluZworICBpZiAoIW1hcHBpbmdwKG5hbWVfbGl2aW5nX20gPSB3aXppbmZvW05BTUVfTElWSU5HXSkpCisgICAgbmFtZV9saXZpbmdfbSA9IHdpemluZm9bTkFNRV9MSVZJTkddID0gbV9hbGxvY2F0ZSgwLCAxKTsKKworICAvLyBOZXR6dG90ZSBzaW5kIGViZW5mYWxscyBpbiBkZXIgZXh0cmFfd2l6aW5mbworICBpZiAoIW1hcHBpbmdwKG5ldGRlYWQgPSB3aXppbmZvW05FVERFQURfTUFQXSkpCisgICAgbmV0ZGVhZCA9IHdpemluZm9bTkVUREVBRF9NQVBdID0gKFtdKTsKK30KKworcHVibGljIHZhcmFyZ3Mgc3RyaW5nIGdldHV1aWQoIG9iamVjdCBvYiApCit7CisgICAgbWl4ZWQgKnJldDsKKworICAgIGlmICggIW9iamVjdHAob2IpICkKKyAgICAgICBvYiA9IHByZXZpb3VzX29iamVjdCgpOworCisgICAgaWYgKCAhcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShvYikgKQorICAgICAgIHJldHVybiBnZXR1aWQob2IpOworCisgICAgcmV0ID0gKG1peGVkKW1hc3RlcigpLT5nZXRfdXNlcmluZm8oIGdldHVpZChvYikgKTsKKworICAgIGlmICggIXBvaW50ZXJwKHJldCkgfHwgc2l6ZW9mKHJldCkgPCA1ICkKKyAgICAgICByZXR1cm4gZ2V0dWlkKG9iKTsKKworICAgIC8vIFVzZXJuYW1lICsgIl8iICsgQ3JlYXRpb25EYXRlCisgICAgcmV0dXJuIHJldFswXSArICJfIiArIHJldFs1XTsKK30KKwordm9pZCBzZXRfb2JqZWN0X2xpdmluZ19uYW1lKHN0cmluZyBsaXZuYW1lLCBvYmplY3Qgb2JqKQoreworICBzdHJpbmcgb2xkOworICBtaXhlZCBhOworICBpbnQgaTsKKworICBpZiAocHJldmlvdXNfb2JqZWN0KCk9PW9iaiB8fCBwcmV2aW91c19vYmplY3QoKT09dGhpc19vYmplY3QoKSB8fAorICAgICAgcHJldmlvdXNfb2JqZWN0KCk9PW1hc3RlcigpKQorICB7CisgICAgaWYoIWxpdm5hbWUgfHwgIXN0cmluZ3AobGl2bmFtZSkpIHsKKyAgICAgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CisgICAgICByYWlzZV9lcnJvcihzcHJpbnRmKCIlTzogaWxsZWdhbCBsaXZpbmcgbmFtZTogJU9cbiIsIG9iaiwgbGl2bmFtZSkpOworICAgIH0KKyAgICBpZiAob2xkID0gbGl2aW5nX25hbWVfbVtvYmpdKSB7CisgICAgICBpZiAocG9pbnRlcnAoYSA9IG5hbWVfbGl2aW5nX21bb2xkXSkpIHsKKyAgICAgICBhW21lbWJlcihhLCBvYmopXSA9IDA7CisgICAgICB9IGVsc2UgeworICAgICAgIG1fZGVsZXRlKG5hbWVfbGl2aW5nX20sIG9sZCk7CisgICAgICB9CisgICAgfQorICAgIGxpdmluZ19uYW1lX21bb2JqXSA9IGxpdm5hbWU7CisgICAgaWYgKGEgPSBuYW1lX2xpdmluZ19tW2xpdm5hbWVdKSB7CisgICAgICBpZiAoIXBvaW50ZXJwKGEpKSB7CisgICAgICAgbmFtZV9saXZpbmdfbVtsaXZuYW1lXSA9ICh7YSwgb2JqfSk7CisgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgLyogVHJ5IHRvIHJlYWxsb2NhdGUgZW50cnkgZnJvbSBkZXN0cnVjdGVkIG9iamVjdCAqLworICAgICAgaWYgKChpID0gbWVtYmVyKGEsIDApKSA+PSAwKSB7CisgICAgICAgYVtpXSA9IG9iajsKKyAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBuYW1lX2xpdmluZ19tW2xpdm5hbWVdID0gYSArICh7b2JqfSk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIG5hbWVfbGl2aW5nX21bbGl2bmFtZV0gPSBvYmo7CisgIH0KK30KKwordm9pZCBzZXRfbGl2aW5nX25hbWUoc3RyaW5nIGxpdm5hbWUpCit7CisgIHNldF9vYmplY3RfbGl2aW5nX25hbWUobGl2bmFtZSxwcmV2aW91c19vYmplY3QoKSk7Cit9CisKK3ZvaWQgcmVtb3ZlX2xpdmluZ19uYW1lKCkKK3sKKyAgc3RyaW5nIGxpdm5hbWU7CisKKyAgaWYgKCFwcmV2aW91c19vYmplY3QoKSkKKyAgICByZXR1cm47CisgIGlmIChsaXZuYW1lPWxpdmluZ19uYW1lX21bcHJldmlvdXNfb2JqZWN0KCldKQorICB7CisgICAgbV9kZWxldGUobGl2aW5nX25hbWVfbSxwcmV2aW91c19vYmplY3QoKSk7CisgICAgaWYgKG9iamVjdHAobmFtZV9saXZpbmdfbVtsaXZuYW1lXSkpCisgICAgeworICAgICAgaWYgKG5hbWVfbGl2aW5nX21bbGl2bmFtZV09PXByZXZpb3VzX29iamVjdCgpKQorICAgICAgIG1fZGVsZXRlKG5hbWVfbGl2aW5nX20sbGl2bmFtZSk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChwb2ludGVycChuYW1lX2xpdmluZ19tW2xpdm5hbWVdKSkKKyAgICB7CisgICAgICBuYW1lX2xpdmluZ19tW2xpdm5hbWVdLT0oe3ByZXZpb3VzX29iamVjdCgpfSk7CisgICAgICBpZiAoIXNpemVvZihuYW1lX2xpdmluZ19tW2xpdm5hbWVdKSkKKyAgICAgICBtX2RlbGV0ZShuYW1lX2xpdmluZ19tLGxpdm5hbWUpOworICAgIH0KKyAgfQorfQorCit2b2lkIF9zZXRfbmV0ZGVhZCgpCit7CisgIGlmIChxdWVyeV9vbmNlX2ludGVyYWN0aXZlKHByZXZpb3VzX29iamVjdCgpKSkKKyAgICBuZXRkZWFkW2dldHVpZChwcmV2aW91c19vYmplY3QoKSldPXByZXZpb3VzX29iamVjdCgpOworfQorCit2b2lkIF9yZW1vdmVfbmV0ZGVhZCgpCit7CisgIG1fZGVsZXRlKG5ldGRlYWQsZ2V0dWlkKHByZXZpb3VzX29iamVjdCgpKSk7Cit9CisKK29iamVjdCBmaW5kX25ldGRlYWQoc3RyaW5nIHV1aWQpCit7CisgIGludCBpOworICBzdHJpbmcgdWlkOworICAvLyBXZW5uIHNzY2FuZigpIDIgbGllZmVydCwgaXN0IHV1aWQgYXVjaCBuZSB1dWlkLgorICBpbnQgaXNfdXVpZCA9IHNzY2FuZih1dWlkLCAiJXNfJWQiLCB1aWQsIGkpID09IDI7CisgIGlmICghaXNfdXVpZCkKKyAgICB1aWQgPSB1dWlkOworIAorICBpZiAoaXNfdXVpZCAmJiBnZXR1dWlkKG5ldGRlYWRbdWlkXSkgIT0gdXVpZCkKKyAgICAgIHJldHVybiAwOworCisgIHJldHVybiBuZXRkZWFkW3VpZF07Cit9CisKK3N0cmluZyAqZHVtcF9uZXRkZWFkKCkKK3sKKyAgcmV0dXJuIG1faW5kaWNlcyhuZXRkZWFkKTsKK30KKworb2JqZWN0IGZpbmRfbGl2aW5nKHN0cmluZyBsaXZuYW1lKSB7CisgIG1peGVkICphLCByOworICBpbnQgaTsKKworICBpZiAocG9pbnRlcnAociA9IG5hbWVfbGl2aW5nX21bbGl2bmFtZV0pKSB7CisgICAgaWYgKG1lbWJlcihyLDApPj0wKQorICAgICAgci09KHswfSk7CisgICAgaWYgKCFzaXplb2YocikpeworICAgICAgbV9kZWxldGUobmFtZV9saXZpbmdfbSxsaXZuYW1lKTsKKyAgICAgIGNsZWFuX2xvZyhzcHJpbnRmKCJmaW5kX2xpdmluZyBsb2VzY2h0ICVzXG4iLGxpdm5hbWUpKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoICFsaXZpbmcociA9IChhID0gcilbMF0pKSB7CisgICAgICBmb3IgKGkgPSBzaXplb2YoYSk7IC0taTspIHsKKyAgICAgICBpZiAobGl2aW5nKGFbPGldKSkgeworICAgICAgICAgciA9IGFbPGldOworICAgICAgICAgYVs8aV0gPSBhWzBdOworICAgICAgICAgcmV0dXJuIGFbMF0gPSByOworICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHI7CisgIH0KKyAgcmV0dXJuIGxpdmluZyhyKSAmJiByOworfQorCitvYmplY3QgKmZpbmRfbGl2aW5ncyhzdHJpbmcgbGl2bmFtZSkKK3sKKyAgbWl4ZWQgcjsKKworICBpZiAocG9pbnRlcnAocj1uYW1lX2xpdmluZ19tW2xpdm5hbWVdKSkKKyAgICByLT0oezB9KTsKKyAgZWxzZQorICAgIGlmIChvYmplY3RwKHIpKQorICAgICAgcj0oe3J9KTsKKyAgaWYgKCFwb2ludGVycChyKXx8IXNpemVvZihyKSkKKyAgICByZXR1cm4gMDsKKyAgcmV0dXJuIHI7Cit9CisKK29iamVjdCBmaW5kX3BsYXllcihzdHJpbmcgdXVpZCkgeworICBvYmplY3QgKm9ianM7CisgIG1peGVkIHJlczsKKyAgaW50IGk7CisgIHN0cmluZyB1aWQ7CisKKyAgaWYgKCFzdHJpbmdwKHV1aWQpKQorICAgIHJldHVybiAwOworICAvLyBXZW5uIHNzY2FuZigpIDIgbGllZmVydCwgaXN0IHV1aWQgYXVjaCBuZSB1dWlkLgorICBpbnQgaXNfdXVpZCA9IHNzY2FuZih1dWlkLCAiJXNfJWQiLCB1aWQsIGkpID09IDI7CisgIGlmICghaXNfdXVpZCkKKyAgICB1aWQgPSB1dWlkOworCisgIGlmIChwb2ludGVycChyZXMgPSBuYW1lX2xpdmluZ19tW3VpZF0pKSB7CisgICAgLy8gemVyc3RvZXJ0ZSBPYmpla3RlIGdnZi4gZW50ZmVybmVuCisgICAgaWYgKG1lbWJlcihyZXMsMCk+PTApIHsKKyAgICAgIHJlcy09KHswfSk7CisgICAgICBuYW1lX2xpdmluZ19tW3VpZF0gPSByZXM7CisgICAgfQorICAgIC8vIGdnZi4gTmFtZW4gb2huZSBPYmpla3RlIGVudGZlcm5lbi4KKyAgICBpZiAoIXNpemVvZihyZXMpKXsKKyAgICAgIG1fZGVsZXRlKG5hbWVfbGl2aW5nX20sdWlkKTsKKyAgICAgIGNsZWFuX2xvZyhzcHJpbnRmKCJmaW5kX3BsYXllciBsb2VzY2h0ICVzXG4iLHVpZCkpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIG9ianMgPSByZXM7CisgICAgcmVzID0gb2Jqc1swXTsKKyAgICAvLyBXZW5uIGRhcyAwLiBFbGVtZW50IGRlciBTcGllbGVyIGlzdCwgc2luZCB3aXIgZmVydGlnLiBBbnNvbnN0ZW4gc3VjaGVuCisgICAgLy8gd2lyIGRlbiBTcGllbGVyIHVuZCBzY2hpZWJlbiBpaG4gYW4gZGllIDAuIFN0ZWxsZSBpbSBBcnJheS4KKyAgICBpZiAoICFxdWVyeV9vbmNlX2ludGVyYWN0aXZlKHJlcykpIHsKKyAgICAgIGZvciAoaSA9IHNpemVvZihvYmpzKTsgLS1pOykgeworICAgICAgIGlmIChvYmpzWzxpXSAmJiBxdWVyeV9vbmNlX2ludGVyYWN0aXZlKG9ianNbPGldKSkgeworICAgICAgICAgcmVzID0gb2Jqc1s8aV07CisgICAgICAgICBvYmpzWzxpXSA9IG9ianNbMF07CisgICAgICAgICBvYmpzWzBdID0gcmVzOworICAgICAgICAgYnJlYWs7CisgICAgICAgfQorICAgICAgfQorICAgICAgcmVzID0gKG9iamVjdHAocmVzKSAmJiBxdWVyeV9vbmNlX2ludGVyYWN0aXZlKHJlcykpID8gcmVzIDogMDsKKyAgICB9CisgICAgLy8gZWxzZTogaW4gcmVzIHN0ZWh0IGRlciBTcGllbGVyIHNjaG9uLgorICB9CisgIGVsc2UgaWYgKG9iamVjdHAocmVzKSkgLy8gciBpc3QgbmVuIEVpbnplbG9iamVrdAorICAgIHJlcyA9IHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUocmVzKSA/IHJlcyA6IDA7CisKKyAgLy8gcmVzIGlzdCBqZXR6dCBnZ2YuIGRlciBTcGllbGVyLiBBYmVyIHdlbm4gZGVyIG5lIGFuZGVyZSBhbHMgZGllIGdlc3VjaHRlCisgIC8vIFVVSUQgaGF0LCBpc3QgZGFzIEVyZ2VibmlzIHRyb3R6ZGVtIDAuCisgIGlmIChpc191dWlkICYmIGdldHV1aWQocmVzKSE9dXVpZCkKKyAgICAgIHJldHVybiAwOworCisgIC8vIGVuZGxpY2ggZ2VmdW5kZW4KKyAgcmV0dXJuIHJlczsKK30KKworcHJpdmF0ZSBpbnQgY2hlY2tfbWF0Y2goIHN0cmluZyBzdHIsIGludCBwbGF5ZXJzX29ubHkgKQoreworICAgIG1peGVkIG1hdGNoOworCisgICAgaWYgKCAhKG1hdGNoID0gbmFtZV9saXZpbmdfbVtzdHJdKSApCisgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAoICFwb2ludGVycChtYXRjaCkgKQorICAgICAgIG1hdGNoID0gKHsgbWF0Y2ggfSk7CisKKyAgICBtYXRjaCAtPSAoezB9KTsKKworICAgIGlmICggc2l6ZW9mKG1hdGNoKSApeworICAgICAgIGlmICggcGxheWVyc19vbmx5ICkKKyAgICAgICAgICAgcmV0dXJuIHNpemVvZihmaWx0ZXIoIG1hdGNoLCAjJ3F1ZXJ5X29uY2VfaW50ZXJhY3RpdmUvKicqLyApKQorICAgICAgICAgICAgICA+IDA7CisgICAgICAgZWxzZQorICAgICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBtX2RlbGV0ZSggbmFtZV9saXZpbmdfbSwgc3RyICk7CisgICAgY2xlYW5fbG9nKCBzcHJpbnRmKCJjaGVja19tYXRjaCBsb2VzY2h0ICVzXG4iLCBzdHIpICk7CisgICAgcmV0dXJuIDA7Cit9CisKKy8vVE9ETzo6IHN0cmluZ3xzdHJpbmcqIGV4Y2x1ZGUKK3ZhcmFyZ3MgbWl4ZWQgbWF0Y2hfbGl2aW5nKCBzdHJpbmcgc3RyLCBpbnQgcGxheWVyc19vbmx5LCBtaXhlZCBleGNsdWRlICkKK3sKKyAgICBpbnQgaSwgczsKKyAgICBtaXhlZCBtYXRjaCwgKnVzZXI7CisKKyAgICBpZiAoICFzdHIgfHwgc3RyID09ICIiICkKKyAgICAgICByZXR1cm4gMDsKKworICAgIGlmICggIXBvaW50ZXJwKGV4Y2x1ZGUpICkKKyAgICAgICBleGNsdWRlID0gKHsgZXhjbHVkZSB9KTsKKworICAgIGlmICggbWVtYmVyKGV4Y2x1ZGUsIHN0cikgPCAwICYmIGNoZWNrX21hdGNoKHN0ciwgcGxheWVyc19vbmx5KSApCisgICAgICAgcmV0dXJuIHN0cjsKKworICAgIHVzZXIgPSBtX2luZGljZXMobmFtZV9saXZpbmdfbSk7CisgICAgcyA9IHNpemVvZihzdHIpOworICAgIG1hdGNoID0gMDsKKworICAgIGZvciAoIGkgPSBzaXplb2YodXNlcik7IGktLTsgKQorICAgICAgIGlmICggc3RyID09IHVzZXJbaV1bMC4ucy0xXSAmJiBtZW1iZXIoIGV4Y2x1ZGUsIHVzZXJbaV0gKSA8IDAgKQorICAgICAgICAgICBpZiAoIG1hdGNoICkKKyAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIGlmICggY2hlY2tfbWF0Y2godXNlcltpXSwgcGxheWVyc19vbmx5KSApCisgICAgICAgICAgICAgICAgICBtYXRjaCA9IHVzZXJbaV07CisKKyAgICBpZiAoICFtYXRjaCApCisgICAgICAgcmV0dXJuIC0yOworCisgICAgcmV0dXJuIG1hdGNoOworfQorCittaXhlZCAqZHVtcF9saXZpbmdzKCkKK3sKKyAgcmV0dXJuIHNvcnRfYXJyYXkobV9pbmRpY2VzKG5hbWVfbGl2aW5nX20pLCMnPik7Cit9CisKKy8vICogcmVnZWxtYWVzc2lnIExpc3RlbiB2b24gQmFsbGFzdCBiZWZyZWllbgorcHJpdmF0ZSB2b2lkIGNsZWFuX25hbWVfbGl2aW5nX20oc3RyaW5nICprZXlzLCBpbnQgbGVmdCwgaW50IG51bSkKK3sKKyAgaW50IGksIGo7CisgIG1peGVkIGE7CisKKyAgd2hpbGUgKGxlZnQgJiYgbnVtLS0pCisgIHsKKyAgICBpZiAocG9pbnRlcnAoYSA9IG5hbWVfbGl2aW5nX21ba2V5c1stLWxlZnRdXSkgJiYgbWVtYmVyKGEsIDApPj0wKQorICAgIHsKKyAgICAgIGEtPSh7MH0pOworICAgICAgbmFtZV9saXZpbmdfbVtrZXlzW2xlZnRdXSA9IGE7CisgICAgfQorICAgIGlmICghYSB8fCAocG9pbnRlcnAoYSkgJiYgIXNpemVvZihhKSkpCisgICAgeworICAgICAgY2xlYW5fbG9nKCJUb2FzdGluZyAiK2tleXNbbGVmdF0rIlxuIik7CisgICAgICBtX2RlbGV0ZShuYW1lX2xpdmluZ19tLCBrZXlzW2xlZnRdKTsKKyAgICB9IGVsc2UgY2xlYW5fbG9nKHNwcmludGYoIktFRVBJTkcgJXMgKCVPKVxuIixrZXlzW2xlZnRdLHBvaW50ZXJwKGEpP3NpemVvZihhKTphKSk7CisgIH0KKyAgaWYgKGxlZnQpCisgICAgZWZ1bjo6Y2FsbF9vdXQoIydjbGVhbl9uYW1lX2xpdmluZ19tLCAxLCBrZXlzLCBsZWZ0LCA4MCk7CisgIGVsc2UKKyAgICBjbGVhbl9sb2coIkNsZWFuIHByb2Nlc3MgZmluaXNoZWRcbiIpOworfQorCitwcml2YXRlIHZvaWQgY2xlYW5fbmV0ZGVhZCgpIHsKKyAgaW50IGk7CisgIHN0cmluZyAqczsKKyAgb2JqZWN0IG9iOworCisgIHM9bV9pbmRpY2VzKG5ldGRlYWQpOworICBmb3IgKGk9c2l6ZW9mKHMpLTE7aT49MDtpLS0pCisgICAgaWYgKCFvYmplY3RwKG9iPW5ldGRlYWRbc1tpXV0pIHx8IGludGVyYWN0aXZlKG9iKSkKKyAgICAgIG1fZGVsZXRlKG5ldGRlYWQsc1tpXSk7Cit9CisKK3ByaXZhdGUgdm9pZCBDbGVhbkxpdmluZ0RhdGEoKSB7CisgIGlmIChmaW5kX2NhbGxfb3V0KCMnY2xlYW5fbmFtZV9saXZpbmdfbSkgPCAwKSB7CisgICAgY2xlYW5fbG9nKCJTdGFydGluZyBjbGVhbiBwcm9jZXNzXG4iKTsKKyAgICBlZnVuOjpjYWxsX291dCgjJ2NsZWFuX25hbWVfbGl2aW5nX20sCisgICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgIG1faW5kaWNlcyhuYW1lX2xpdmluZ19tKSwKKyAgICAgICAgICAgICAgICAgc2l6ZW9mKG5hbWVfbGl2aW5nX20pLAorICAgICAgICAgICAgICAgICA4MAorICAgICAgICAgICAgICAgICApOworICB9CisgIGVmdW46OmNhbGxfb3V0KCMnY2xlYW5fbmV0ZGVhZCwyKTsKK30KKworI3VuZGVmIGNsZWFuX2xvZworCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9vYmplY3RfaW5mby5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvb2JqZWN0X2luZm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDdjMDA5Ci0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvb2JqZWN0X2luZm8uYwpAQCAtMCwwICsxLDEwNiBAQAorLyogVGhpcyBzZWZ1biBpcyB0byBwcm92aWRlIHRoZSBvbGQgc2VtYW50aWNzIG9mIHRoZSBlZnVuIG9iamVjdF9pbmZvKCkuCisgKiBGZWVsIGZyZWUgdG8gYWRkIGl0IHRvIHlvdXIgbXVkbGlicywgaWYgeW91IGhhdmUgbXVjaCBjb2RlIHJlbHlpbmcgb24gdGhhdC4KKyAqLworCisjaWYgX19FRlVOX0RFRklORURfXyhkcml2ZXJfaW5mbykgLyogTmV3ZXIgdmVyc2lvbiBpcyB0aGVyZSAqLworCisjaW5jbHVkZSA8b2JqZWN0aW5mby5oPgorI2luY2x1ZGUgPG9iamVjdF9pbmZvLmg+CisKK21peGVkIG9iamVjdF9pbmZvKG9iamVjdCBvYiwgaW50IHdoYXQsIHZhcmFyZ3MgaW50KiBpbmRleCkKK3sKKyAgICBtaXhlZCAqIHJlc3VsdDsKKworICAgIGlmIChzaXplb2YoaW5kZXgpID4gMSkKKyAgICAgICAgcmFpc2VfZXJyb3IoIlRvbyBtYW55IGFyZ3VtZW50cyB0byBvYmplY3RfaW5mb1xuIik7CisKKyAgICBzd2l0Y2god2hhdCkKKyAgICB7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByYWlzZV9lcnJvcihzcHJpbnRmKCJJbGxlZ2FsIHZhbHVlICVkIGZvciBvYmplY3RfaW5mbygpLlxuIiwgd2hhdCkpOworCisgICAgICAgIGNhc2UgT0lORk9fQkFTSUM6CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IGFsbG9jYXRlKE9JQl9NQVgpOworCisgICAgICAgICAgICByZXN1bHRbT0lCX0hFQVJUX0JFQVRdICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPQ19IRUFSVF9CRUFUKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfSVNfV0laQVJEXSAgICAgICAgID0gMDsgICAvKiBOb3Qgc3VwcG9ydGVkIGFueW1vcmUuICovCisgICAgICAgICAgICByZXN1bHRbT0lCX0VOQUJMRV9DT01NQU5EU10gICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPQ19DT01NQU5EU19FTkFCTEVEKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfQ0xPTkVdICAgICAgICAgICAgID0gZWZ1bjo6Y2xvbmVwKG9iKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfREVTVFJVQ1RFRF0gICAgICAgID0gMDsgICAvKiBOb3QgcG9zc2libGUgYW55bW9yZS4gKi8KKyAgICAgICAgICAgIHJlc3VsdFtPSUJfU1dBUFBFRF0gICAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NXQVBQRUQpOworICAgICAgICAgICAgcmVzdWx0W09JQl9PTkNFX0lOVEVSQUNUSVZFXSAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfT05DRV9JTlRFUkFDVElWRSk7CisgICAgICAgICAgICByZXN1bHRbT0lCX1JFU0VUX1NUQVRFXSAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9SRVNFVF9TVEFURSk7CisgICAgICAgICAgICByZXN1bHRbT0lCX1dJTExfQ0xFQU5fVVBdICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9XSUxMX0NMRUFOX1VQKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfTEFNQkRBX1JFRkVSRU5DRURdID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX0xBTUJEQV9SRUZFUkVOQ0VEKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfU0hBRE9XXSAgICAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NIQURPV19QUkVWKSAmJiAxOworICAgICAgICAgICAgcmVzdWx0W09JQl9SRVBMQUNFRF0gICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfUkVQTEFDRUQpOworICAgICAgICAgICAgcmVzdWx0W09JQl9ORVhUX1JFU0VUXSAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTkVYVF9SRVNFVF9USU1FKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfVElNRV9PRl9SRUZdICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX0xBU1RfUkVGX1RJTUUpOworICAgICAgICAgICAgcmVzdWx0W09JQl9SRUZdICAgICAgICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfT0JKRUNUX1JFRlMpOworICAgICAgICAgICAgcmVzdWx0W09JQl9HSUdBVElDS1NdICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfR0lHQVRJQ0tTKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfVElDS1NdICAgICAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1RJQ0tTKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfU1dBUF9OVU1dICAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NXQVBfTlVNKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfUFJPR19TV0FQUEVEXSAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1BST0dfU1dBUFBFRCk7CisgICAgICAgICAgICByZXN1bHRbT0lCX1ZBUl9TV0FQUEVEXSAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9WQVJfU1dBUFBFRCk7CisgICAgICAgICAgICByZXN1bHRbT0lCX05BTUVdICAgICAgICAgICAgICA9IGVmdW46Om9iamVjdF9uYW1lKG9iKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfTE9BRF9OQU1FXSAgICAgICAgID0gZWZ1bjo6bG9hZF9uYW1lKG9iKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfTkVYVF9BTExdICAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX09CSkVDVF9ORVhUKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfUFJFVl9BTExdICAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX09CSkVDVF9QUkVWKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfTkVYVF9DTEVBTlVQXSAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05FWFRfQ0xFQU5VUF9USU1FKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBPSU5GT19QT1NJVElPTjoKKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ID0gYWxsb2NhdGUoT0lQX01BWCk7CisKKyAgICAgICAgICAgIHJlc3VsdFtPSVBfTkVYVF0gPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfT0JKRUNUX05FWFQpOworICAgICAgICAgICAgcmVzdWx0W09JUF9QUkVWXSA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9PQkpFQ1RfUFJFVik7CisgICAgICAgICAgICByZXN1bHRbT0lQX1BPU10gID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX09CSkVDVF9QT1MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIE9JTkZPX01FTU9SWToKKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ID0gYWxsb2NhdGUoT0lNX01BWCk7CisKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fUkVGXSAgICAgICAgICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9QUk9HX1JFRlMpOworICAgICAgICAgICAgcmVzdWx0W09JTV9OQU1FXSAgICAgICAgICAgICAgID0gZWZ1bjo6cHJvZ3JhbV9uYW1lKG9iKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fUFJPR19TSVpFXSAgICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9QUk9HX1NJWkUpOworICAgICAgICAgICAgcmVzdWx0W09JTV9OVU1fRlVOQ1RJT05TXSAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05VTV9GVU5DVElPTlMpOworICAgICAgICAgICAgcmVzdWx0W09JTV9TSVpFX0ZVTkNUSU9OU10gICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NJWkVfRlVOQ1RJT05TKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fTlVNX1ZBUklBQkxFU10gICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9OVU1fVkFSSUFCTEVTKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fU0laRV9WQVJJQUJMRVNdICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSVpFX1ZBUklBQkxFUyk7CisgICAgICAgICAgICByZXN1bHRbT0lNX05VTV9TVFJJTkdTXSAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTlVNX1NUUklOR1MpOworICAgICAgICAgICAgcmVzdWx0W09JTV9TSVpFX1NUUklOR1NdICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NJWkVfU1RSSU5HUyk7CisgICAgICAgICAgICByZXN1bHRbT0lNX1NJWkVfU1RSSU5HU19EQVRBXSAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0laRV9TVFJJTkdTX0RBVEEpOworICAgICAgICAgICAgcmVzdWx0W09JTV9TSVpFX1NUUklOR1NfVE9UQUxdID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NJWkVfU1RSSU5HU19EQVRBX1RPVEFMKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fTlVNX0lOSEVSSVRFRF0gICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9OVU1fSU5IRVJJVEVEKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fU0laRV9JTkhFUklURURdICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSVpFX0lOSEVSSVRFRCk7CisgICAgICAgICAgICByZXN1bHRbT0lNX1RPVEFMX1NJWkVdICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfUFJPR19TSVpFX1RPVEFMKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fREFUQV9TSVpFXSAgICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9EQVRBX1NJWkUpOworICAgICAgICAgICAgcmVzdWx0W09JTV9UT1RBTF9EQVRBX1NJWkVdICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX0RBVEFfU0laRV9UT1RBTCk7CisgICAgICAgICAgICByZXN1bHRbT0lNX05PX0lOSEVSSVRdICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTk9fSU5IRVJJVCk7CisgICAgICAgICAgICByZXN1bHRbT0lNX05PX0NMT05FXSAgICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTk9fQ0xPTkUpOworICAgICAgICAgICAgcmVzdWx0W09JTV9OT19TSEFET1ddICAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05PX1NIQURPVyk7CisgICAgICAgICAgICByZXN1bHRbT0lNX05VTV9JTkNMVURFU10gICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTlVNX0lOQ0xVREVEKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fU0hBUkVfVkFSSUFCTEVTXSAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSEFSRV9WQVJJQUJMRVMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoc2l6ZW9mKGluZGV4KSkKKyAgICB7CisgICAgICAgIGludCBpZHggPSBpbmRleFswXTsKKyAgICAgICAgaWYgKGlkeCA8IDAgfHwgaWR4ID49IHNpemVvZihyZXN1bHQpKQorICAgICAgICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigiSWxsZWdhbCBpbmRleCBmb3Igb2JqZWN0X2luZm8oKTogJWQsIGV4cGVjdGVkIDAuLiVkXG4iLAorICAgICAgICAgICAgICAgIGlkeCwgc2l6ZW9mKHJlc3VsdCktMSkpOworCisgICAgICAgIHJldHVybiByZXN1bHRbaWR4XTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXR1cm4gcmVzdWx0OworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3F1ZXJ5X2VkaXRpbmcuYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3F1ZXJ5X2VkaXRpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTQ2ZGNkCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvcXVlcnlfZWRpdGluZy5jCkBAIC0wLDAgKzEsMTcgQEAKKy8qIFRoaXMgc2VmdW4gaXMgdG8gcHJvdmlkZSBhIHJlcGxhY2VtZW50IGZvciB0aGUgZWZ1biBxdWVyeV9lZGl0aW5nKCkuCisgKiBGZWVsIGZyZWUgdG8gYWRkIGl0IHRvIHlvdXIgbXVkbGlicywgaWYgeW91IGhhdmUgbXVjaCBjb2RlIHJlbHlpbmcgb24gdGhhdC4KKyAqLworCisjaWYgISBfX0VGVU5fREVGSU5FRF9fKHF1ZXJ5X2VkaXRpbmcpCisKKyNpbmNsdWRlIDxpbnRlcmFjdGl2ZV9pbmZvLmg+CisKK2ludHxvYmplY3QgcXVlcnlfZWRpdGluZyhvYmplY3Qgb2IpCit7CisgICAgaWYoIWVmdW46OmludGVyYWN0aXZlKG9iKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyhvYiwgSUlfRURJVElORyk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvcXVlcnlfaWRsZS5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvcXVlcnlfaWRsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzYTMyYWUKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9xdWVyeV9pZGxlLmMKQEAgLTAsMCArMSwxNCBAQAorLyogVGhpcyBzZWZ1biBpcyB0byBwcm92aWRlIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBlZnVuIHF1ZXJ5X2lkbGUoKS4KKyAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgorICovCisKKyNpZiAhIF9fRUZVTl9ERUZJTkVEX18ocXVlcnlfaWRsZSkKKworI2luY2x1ZGUgPGludGVyYWN0aXZlX2luZm8uaD4KKworaW50IHF1ZXJ5X2lkbGUob2JqZWN0IG9iKQoreworICAgIHJldHVybiBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKG9iLCBJSV9JRExFKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9xdWVyeV9pbnB1dF9wZW5kaW5nLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9xdWVyeV9pbnB1dF9wZW5kaW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ4YzMxMQotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3F1ZXJ5X2lucHV0X3BlbmRpbmcuYwpAQCAtMCwwICsxLDE3IEBACisvKiBUaGlzIHNlZnVuIGlzIHRvIHByb3ZpZGUgYSByZXBsYWNlbWVudCBmb3IgdGhlIGVmdW4gcXVlcnlfaW5wdXRfcGVuZGluZygpLgorICogRmVlbCBmcmVlIHRvIGFkZCBpdCB0byB5b3VyIG11ZGxpYnMsIGlmIHlvdSBoYXZlIG11Y2ggY29kZSByZWx5aW5nIG9uIHRoYXQuCisgKi8KKworI2lmICEgX19FRlVOX0RFRklORURfXyhxdWVyeV9pbnB1dF9wZW5kaW5nKQorCisjaW5jbHVkZSA8aW50ZXJhY3RpdmVfaW5mby5oPgorCitvYmplY3QgcXVlcnlfaW5wdXRfcGVuZGluZyhvYmplY3Qgb2IpCit7CisgICAgaWYoIWVmdW46OmludGVyYWN0aXZlKG9iKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyhvYiwgSUlfSU5QVVRfUEVORElORyk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvcXVlcnlfaXBfbmFtZS5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvcXVlcnlfaXBfbmFtZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkYTZlMDcKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9xdWVyeV9pcF9uYW1lLmMKQEAgLTAsMCArMSw0OCBAQAorLyogVGhpcyBzZWZ1biBpcyB0byBwcm92aWRlIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBlZnVucyBxdWVyeV9pcF9uYW1lKCkgYW5kCisgKiBxdWVyeV9pcF9udW1iZXIoKS4KKyAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgorICovCisKKyNpZiAhIF9fRUZVTl9ERUZJTkVEX18ocXVlcnlfaXBfbmFtZSkKKworI2luY2x1ZGUgPGludGVyYWN0aXZlX2luZm8uaD4KKworcHJpdmF0ZSB2YXJhcmdzIHN0cmluZyBfcXVlcnlfaXBfbmFtZShvYmplY3QgcGxheWVyKQoreworICAgIG9iamVjdCBvYiA9IHBsYXllcjsKKyAgICBvYiB8fD0gZWZ1bjo6dGhpc19wbGF5ZXIoKTsKKworICAgIHBsYXllciA9IGVmdW46OmludGVyYWN0aXZlX2luZm8ob2IsIElJX0lQX0FERFJFU1MpOworICAgIHJldHVybiBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKG9iLCBJSV9JUF9OQU1FKTsKK30KKworcHJpdmF0ZSB2YXJhcmdzIHN0cmluZyBfcXVlcnlfaXBfbnVtYmVyKG9iamVjdCBwbGF5ZXIpCit7CisgICAgb2JqZWN0IG9iID0gcGxheWVyOworICAgIG9iIHx8PSBlZnVuOjp0aGlzX3BsYXllcigpOworCisgICAgcGxheWVyID0gZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyhvYiwgSUlfSVBfQUREUkVTUyk7CisgICAgcmV0dXJuIGVmdW46OmludGVyYWN0aXZlX2luZm8ob2IsIElJX0lQX05VTUJFUik7Cit9CisKKy8vICogSGVya3VuZnRzLUVybWl0dGx1bmcKK3N0cmluZyBxdWVyeV9pcF9udW1iZXIob2JqZWN0IG9iKQoreworICBvYj0gb2IgfHwgdGhpc19wbGF5ZXIoKTsKKyAgaWYgKCFvYmplY3RwKG9iKSB8fCAhaW50ZXJhY3RpdmUob2IpKSByZXR1cm4gMDsKKyAgaWYob2ItPnF1ZXJ5X3JlYWxpcCgpICYmIChzdHJpbmcpb2ItPnF1ZXJ5X3JlYWxpcCgpIT0iIikKKyAgeworICAgIHJldHVybiAoc3RyaW5nKW9iLT5xdWVyeV9yZWFsaXAoKTsKKyAgfQorICByZXR1cm4gX3F1ZXJ5X2lwX251bWJlcihvYik7Cit9CisKK3N0cmluZyBxdWVyeV9pcF9uYW1lKG1peGVkIG9iKQoreworICBpZiAoICFvYiB8fCBvYmplY3RwKG9iKSApCisgICAgICBvYj1xdWVyeV9pcF9udW1iZXIob2IpOworICByZXR1cm4gKHN0cmluZykiL3AvZGFlbW9uL2lwbG9va3VwIi0+aG9zdChvYik7Cit9CisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9xdWVyeV9saW1pdHMuYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3F1ZXJ5X2xpbWl0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjYmYzOTAKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9xdWVyeV9saW1pdHMuYwpAQCAtMCwwICsxLDE0IEBACisvKiBUaGlzIHNlZnVuIGlzIHRvIHByb3ZpZGUgYSByZXBsYWNlbWVudCBmb3IgdGhlIGVmdW4gcXVlcnlfbGltaXRzKCkuCisgKiBGZWVsIGZyZWUgdG8gYWRkIGl0IHRvIHlvdXIgbXVkbGlicywgaWYgeW91IGhhdmUgbXVjaCBjb2RlIHJlbHlpbmcgb24gdGhhdC4KKyAqLworCisjaWYgISBfX0VGVU5fREVGSU5FRF9fKHF1ZXJ5X2xpbWl0cykKKworI2luY2x1ZGUgPGRyaXZlcl9pbmZvLmg+CisKK3ZhcmFyZ3MgaW50KiBxdWVyeV9saW1pdHMoaW50IGRlZikKK3sKKyAgICByZXR1cm4gZWZ1bjo6ZHJpdmVyX2luZm8oZGVmID8gRENfREVGQVVMVF9SVU5USU1FX0xJTUlUUyA6IERJX0NVUlJFTlRfUlVOVElNRV9MSU1JVFMpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3F1ZXJ5X2xvYWRfYXZlcmFnZS5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvcXVlcnlfbG9hZF9hdmVyYWdlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IzNmYwZQotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3F1ZXJ5X2xvYWRfYXZlcmFnZS5jCkBAIC0wLDAgKzEsMTYgQEAKKy8qIFRoaXMgc2VmdW4gaXMgdG8gcHJvdmlkZSBhIHJlcGxhY2VtZW50IGZvciB0aGUgZWZ1biBxdWVyeV9sb2FkX2F2ZXJhZ2UoKS4KKyAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgorICovCisKKyNpZiAhIF9fRUZVTl9ERUZJTkVEX18ocXVlcnlfbG9hZF9hdmVyYWdlKQorCisjaW5jbHVkZSA8ZHJpdmVyX2luZm8uaD4KKworc3RyaW5nIHF1ZXJ5X2xvYWRfYXZlcmFnZSgpCit7CisgICAgcmV0dXJuIGVmdW46OnNwcmludGYoIiUuMmYgY21kcy9zLCAlLjJmIGNvbXAgbGluZXMvcyIsCisgICAgICAgIGVmdW46OmRyaXZlcl9pbmZvKERJX0xPQURfQVZFUkFHRV9DT01NQU5EUyksCisgICAgICAgIGVmdW46OmRyaXZlcl9pbmZvKERJX0xPQURfQVZFUkFHRV9MSU5FUykpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3F1ZXJ5X211ZF9wb3J0LmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9xdWVyeV9tdWRfcG9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmZjAwOWQKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9xdWVyeV9tdWRfcG9ydC5jCkBAIC0wLDAgKzEsMzUgQEAKKy8qIFRoaXMgc2VmdW4gaXMgdG8gcHJvdmlkZSBhIHJlcGxhY2VtZW50IGZvciB0aGUgZWZ1biBxdWVyeV9tdWRfcG9ydCgpLgorICogRmVlbCBmcmVlIHRvIGFkZCBpdCB0byB5b3VyIG11ZGxpYnMsIGlmIHlvdSBoYXZlIG11Y2ggY29kZSByZWx5aW5nIG9uIHRoYXQuCisgKi8KKworI2lmICEgX19FRlVOX0RFRklORURfXyhxdWVyeV9tdWRfcG9ydCkKKworI2luY2x1ZGUgPGludGVyYWN0aXZlX2luZm8uaD4KKyNpbmNsdWRlIDxkcml2ZXJfaW5mby5oPgorCitpbnQgcXVlcnlfbXVkX3BvcnQodmFyYXJncyBpbnQqfG9iamVjdCogYXJncykKK3sKKyAgICBpZighc2l6ZW9mKGFyZ3MpICYmIGVmdW46OnRoaXNfcGxheWVyKCkgJiYgZWZ1bjo6aW50ZXJhY3RpdmUodGhpc19wbGF5ZXIoKSkpCisgICAgICAgIHJldHVybiBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKHRoaXNfcGxheWVyKCksIElJX01VRF9QT1JUKTsKKworICAgIGlmKHNpemVvZihhcmdzKSA+IDEpCisgICAgICAgIHJhaXNlX2Vycm9yKCJUb28gbWFueSBhcmd1bWVudHMgdG8gcXVlcnlfbXVkX3BvcnRcbiIpOworCisgICAgaWYoc2l6ZW9mKGFyZ3MpICYmIGVmdW46Om9iamVjdHAoYXJnc1swXSkgJiYgZWZ1bjo6aW50ZXJhY3RpdmUoYXJnc1swXSkpCisgICAgICAgIHJldHVybiBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKGFyZ3NbMF0sIElJX01VRF9QT1JUKTsKKworICAgIGlmKHNpemVvZihhcmdzKSAmJiBpbnRwKGFyZ3NbMF0pKQorICAgIHsKKyAgICAgICAgaW50KiBwb3J0cyA9IGVmdW46OmRyaXZlcl9pbmZvKERJX01VRF9QT1JUUyk7CisgICAgICAgIGlmKGFyZ3NbMF0gPCAtMSB8fCBhcmdzWzBdID49IHNpemVvZihwb3J0cykpCisgICAgICAgICAgICByYWlzZV9lcnJvcihlZnVuOjpzcHJpbnRmKCJCYWQgYXJnIDEgdG8gcXVlcnlfbXVkX3BvcnQoKTogdmFsdWUgJWQgb3V0IG9mIHJhbmdlLlxuIiwgYXJnc1swXSkpOworICAgICAgICBlbHNlIGlmKGFyZ3NbMF0gPT0gLTEpCisgICAgICAgICAgICByZXR1cm4gc2l6ZW9mKHBvcnRzKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIHBvcnRzW2FyZ3NbMF1dOworICAgIH0KKworICAgIHJldHVybiBlZnVuOjpkcml2ZXJfaW5mbyhESV9NVURfUE9SVFMpWzBdOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3F1ZXJ5X29uY2VfaW50ZXJhY3RpdmUuYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3F1ZXJ5X29uY2VfaW50ZXJhY3RpdmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzc4MjlmCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvcXVlcnlfb25jZV9pbnRlcmFjdGl2ZS5jCkBAIC0wLDAgKzEsMTQgQEAKKy8qIFRoaXMgc2VmdW4gaXMgdG8gcHJvdmlkZSBhIHJlcGxhY2VtZW50IGZvciB0aGUgZWZ1biBxdWVyeV9vbmNlX2ludGVyYWN0aXZlKCkuCisgKiBGZWVsIGZyZWUgdG8gYWRkIGl0IHRvIHlvdXIgbXVkbGlicywgaWYgeW91IGhhdmUgbXVjaCBjb2RlIHJlbHlpbmcgb24gdGhhdC4KKyAqLworCisjaWYgISBfX0VGVU5fREVGSU5FRF9fKHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUpCisKKyNpbmNsdWRlIDxvYmplY3RfaW5mby5oPgorCitpbnQgcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShvYmplY3Qgb2IpCit7CisgICAgcmV0dXJuIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9PTkNFX0lOVEVSQUNUSVZFKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9xdWVyeV9zbm9vcC5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvcXVlcnlfc25vb3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmE2OWMwCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvcXVlcnlfc25vb3AuYwpAQCAtMCwwICsxLDMwIEBACisvKiBUaGlzIHNlZnVuIGlzIHRvIHByb3ZpZGUgYSByZXBsYWNlbWVudCBmb3IgdGhlIGVmdW4gcXVlcnlfc25vb3AoKS4KKyAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgorICovCisKKworI2luY2x1ZGUgPGludGVyYWN0aXZlX2luZm8uaD4KKworcHJpdmF0ZSBvYmplY3QgX3F1ZXJ5X3Nub29wKG9iamVjdCBvYikKK3sKKyAgICBpZighZWZ1bjo6aW50ZXJhY3RpdmUob2IpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIG9iamVjdCBwcmV2ID0gZWZ1bjo6cHJldmlvdXNfb2JqZWN0KCk7CisgICAgZWZ1bjo6c2V0X3RoaXNfb2JqZWN0KHByZXYpOworI2lmICEgX19FRlVOX0RFRklORURfXyhxdWVyeV9zbm9vcCkKKyAgICByZXR1cm4gZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyhvYiwgSUlfU05PT1BfTkVYVCk7CisjZWxzZQorICAgIHJldHVybiBlZnVuOjpxdWVyeV9zbm9vcChvYik7CisjZW5kaWYKK30KKworbm9tYXNrIG9iamVjdCBxdWVyeV9zbm9vcChvYmplY3Qgd2hvKSB7CisgIG9iamVjdCBzbm9vcGVyOworCisgIHNub29wZXI9X3F1ZXJ5X3Nub29wKHdobyk7CisgIGlmICghc25vb3BlcikgcmV0dXJuIDA7CisgIGlmIChxdWVyeV93aXpfZ3JwKHNub29wZXIpPnF1ZXJ5X3dpel9ncnAoZ2V0dWlkKHByZXZpb3VzX29iamVjdCgpKSkgJiYKKyAgICAgIElTX0FSQ0goc25vb3BlcikpIHJldHVybiAwOworICByZXR1cm4gc25vb3BlcjsKK30KZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NldF9oZWFydF9iZWF0LmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zZXRfaGVhcnRfYmVhdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzOTk1ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zZXRfaGVhcnRfYmVhdC5jCkBAIC0wLDAgKzEsMjQgQEAKKy8qIFRoaXMgc2VmdW4gaXMgdG8gcHJvdmlkZSBhIHJlcGxhY2VtZW50IGZvciB0aGUgZWZ1biBzZXRfaGVhcnRfYmVhdCgpLgorICogRmVlbCBmcmVlIHRvIGFkZCBpdCB0byB5b3VyIG11ZGxpYnMsIGlmIHlvdSBoYXZlIG11Y2ggY29kZSByZWx5aW5nIG9uIHRoYXQuCisgKi8KKworI2lmICEgX19FRlVOX0RFRklORURfXyhzZXRfaGVhcnRfYmVhdCkKKworI2luY2x1ZGUgPGNvbmZpZ3VyYXRpb24uaD4KKworaW50IHNldF9oZWFydF9iZWF0KGludCBmbGFnKQoreworICAgIG9iamVjdCBvYiA9IGVmdW46OnByZXZpb3VzX29iamVjdCgpOworICAgIGludCBoYiA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPQ19IRUFSVF9CRUFUKTsKKworICAgIGlmICghZmxhZyA9PSAhaGIpCisgICAgICAgIHJldHVybiAwOworCisgICAgZWZ1bjo6Y29uZmlndXJlX29iamVjdChvYiwgT0NfSEVBUlRfQkVBVCwgZmxhZyk7CisKKyAgICByZXR1cm4gMTsKK30KKworI2VuZGlmCisKKwpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc2V0X2lzX3dpemFyZC5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc2V0X2lzX3dpemFyZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwMWNjZGIKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zZXRfaXNfd2l6YXJkLmMKQEAgLTAsMCArMSwxMzcgQEAKKy8qIFRoZXNlIGFyZSB0aGUgc3BlY2lhbCBjb21tYW5kcyBmcm9tIHRoZSBkcml2ZXIgdGhhdCBhcmUgYWN0aXZhdGVkIHdpdGgKKyAqIHNldF9pc193aXphcmQoKS4gVGhlc2UgZnVuY3Rpb25zIG11c3QgYmUgYWRkZWQgdG8gdGhlIHBsYXllciBvYmplY3QuCisgKiBBbHNvIHNldF9pc193aXphcmQoKSBtdXN0IGJlIGNhbGxlZCBpbiB0aGUgY29ycmVzcG9uZGluZyBwbGF5ZXIgb2JqZWN0LAorICogbm90IGFzIGFuIChzaW11bC0pZWZ1bi4KKyAqLworCisjaW5jbHVkZSA8Y29tbWFuZHMuaD4KKyNpbmNsdWRlIDxkcml2ZXJfaW5mby5oPgorCisvKiBpc193aXphcmQ6CisgKiAgMTogaGFzIGFjdGlvbnMsCisgKiAgMDogbmV2ZXIgaGFkIGFjdGlvbnMsCisgKiAtMTogaGFkIGFjdGlvbnMgb25jZS4KKyAqLworcHJpdmF0ZSBub3NhdmUgaW50IGlzX3dpemFyZDsKKworcHJpdmF0ZSBpbnQgZHJpdmVyX21hbGxvYyhzdHJpbmcgc3RyKQoreworICAgIGlmKGlzX3dpemFyZCA8PSAwKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmKCFzaXplb2Yoc3RyKSkKKyAgICB7CisgICAgICAgIHdyaXRlKGVmdW46OmRyaXZlcl9pbmZvKERJX1NUQVRVU19URVhUX01BTExPQykpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBpZihzdHIgPT0gImV4dHN0YXRzIikKKyAgICB7CisgICAgICAgIHdyaXRlKGVmdW46OmRyaXZlcl9pbmZvKERJX1NUQVRVU19URVhUX01BTExPQ19FWFRFTkRFRCkpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworcHJpdmF0ZSBpbnQgZHJpdmVyX2R1bXBhbGxvYmooc3RyaW5nIHN0cikKK3sKKyAgICBpZihpc193aXphcmQgPD0gMCB8fCBzaXplb2Yoc3RyKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICB3cml0ZSgiRHVtcGluZyB0byAvT0JKX0RVTVAgLi4uICIpOworICAgIGVmdW46OmR1bXBfZHJpdmVyX2luZm8oRERJX09CSkVDVFMpOworICAgIGVmdW46OmR1bXBfZHJpdmVyX2luZm8oRERJX09CSkVDVFNfREVTVFJVQ1RFRCk7CisgICAgd3JpdGUoImRvbmVcbiIpOworICAgIHJldHVybiAxOworfQorCitwcml2YXRlIGludCBkcml2ZXJfb3BjZHVtcChzdHJpbmcgc3RyKQoreworICAgIGlmKGlzX3dpemFyZCA8PSAwIHx8IHNpemVvZihzdHIpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGVmdW46OmR1bXBfZHJpdmVyX2luZm8oRERJX09QQ09ERVMpOworICAgIHJldHVybiAxOworfQorCitwcml2YXRlIGludCBkcml2ZXJfc3RhdHVzKHN0cmluZyBzdHIpCit7CisgICAgaW50IG9wdDsKKyAgICBpZihpc193aXphcmQgPD0gMCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBzd2l0Y2goc3RyIHx8ICIiKQorICAgIHsKKyAgICAgICAgY2FzZSAiIjoKKyAgICAgICAgICAgIG9wdCA9IERJX1NUQVRVU19URVhUX01FTU9SWTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgInRhYmxlcyI6CisgICAgICAgIGNhc2UgIiB0YWJsZXMiOgorICAgICAgICAgICAgb3B0ID0gRElfU1RBVFVTX1RFWFRfVEFCTEVTOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAic3dhcCI6CisgICAgICAgIGNhc2UgIiBzd2FwIjoKKyAgICAgICAgICAgIG9wdCA9IERJX1NUQVRVU19URVhUX1NXQVA7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICJtYWxsb2MiOgorICAgICAgICBjYXNlICIgbWFsbG9jIjoKKyAgICAgICAgICAgIG9wdCA9IERJX1NUQVRVU19URVhUX01BTExPQzsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgIm1hbGxvYyBleHRzdGF0cyI6CisgICAgICAgIGNhc2UgIiBtYWxsb2MgZXh0c3RhdHMiOgorICAgICAgICAgICAgb3B0ID0gRElfU1RBVFVTX1RFWFRfTUFMTE9DX0VYVEVOREVEOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHdyaXRlKGVmdW46OmRyaXZlcl9pbmZvKG9wdCkpOworICAgIHJldHVybiAxOworfQorCitpbnQgc2V0X2lzX3dpemFyZCh2YXJhcmdzIDxvYmplY3R8aW50PiogYXJncykKK3sKKyAgICBpbnQgb2xkdmFsID0gaXNfd2l6YXJkOworCisgICAgaWYoIXNpemVvZihhcmdzKSkKKyAgICAgICAgcmFpc2VfZXJyb3IoIlRvbyBmZXcgYXJndW1lbnRzIHRvIHNldF9pc193aXphcmRcbiIpOworICAgIGlmKHNpemVvZihhcmdzKSA+IDIpCisgICAgICAgIHJhaXNlX2Vycm9yKCJUb28gbWFueSBhcmd1bWVudHMgdG8gc2V0X2lzX3dpemFyZFxuIik7CisgICAgaWYoIW9iamVjdHAoYXJnc1swXSkpCisgICAgICAgIHJhaXNlX2Vycm9yKCJCYWQgYXJnIDEgdG8gc2V0X2lzX3dpemFyZCgpXG4iKTsKKyAgICBpZihhcmdzWzBdICE9IHRoaXNfb2JqZWN0KCkpCisgICAgICAgIHJhaXNlX2Vycm9yKCJPbmx5IHNldF9pc193aXphcmQgZm9yIHRoZSBjdXJyZW50IG9iamVjdCBzdXBwb3J0ZWRcbiIpOworICAgIGlmKHRoaXNfcGxheWVyKCkgIT0gdGhpc19vYmplY3QoKSkKKyAgICAgICAgcmFpc2VfZXJyb3IoIlRoZSBjdXJyZW50IG9iamVjdCBtdXN0IGJlIHRoaXNfcGxheWVyKCkgZm9yIHNldF9pc193aXphcmQoKVxuIik7CisgICAgaWYoc2l6ZW9mKGFyZ3MpID09IDIgJiYgIWludHAoYXJnc1sxXSkpCisgICAgICAgIHJhaXNlX2Vycm9yKCJCYWQgYXJnIDIgdG8gc2V0X2lzX3dpemFyZCgpXG4iKTsKKworICAgIGlmKHNpemVvZihhcmdzKSA9PSAyICYmICFhcmdzWzFdKQorICAgIHsKKyAgICAgICAgaWYoaXNfd2l6YXJkID4gMCkKKyAgICAgICAgICAgIGlzX3dpemFyZCA9IC0xOworICAgIH0KKyAgICBlbHNlIGlmKHNpemVvZihhcmdzKSA9PSAyICYmIGFyZ3NbMV08MCkKKyAgICB7CisgICAgICAgICAvLyBKdXN0IHJldHVybiB0aGUgb2xkIHZhbHVlLgorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZighaXNfd2l6YXJkKQorICAgICAgICB7CisgICAgICAgICAgICBhZGRfYWN0aW9uKCMnZHJpdmVyX21hbGxvYywgIm1hbGxvYyIpOworICAgICAgICAgICAgYWRkX2FjdGlvbigjJ2RyaXZlcl9kdW1wYWxsb2JqLCAiZHVtcGFsbG9iaiIpOworICAgICAgICAgICAgYWRkX2FjdGlvbigjJ2RyaXZlcl9vcGNkdW1wLCAib3BjZHVtcCIpOworICAgICAgICAgICAgYWRkX2FjdGlvbigjJ2RyaXZlcl9zdGF0dXMsICJzdGF0dXMiLCBBQV9OT1NQQUNFKTsKKyAgICAgICAgfQorICAgICAgICBpc193aXphcmQgPSAxOworICAgIH0KKworICAgIHJldHVybiBvbGR2YWwgPiAwOworfQpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc2V0X3Byb21wdC5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc2V0X3Byb21wdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiNTk2OTIKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zZXRfcHJvbXB0LmMKQEAgLTAsMCArMSwyMSBAQAorLyogVGhpcyBzZWZ1biBpcyB0byBwcm92aWRlIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBlZnVuIHNldF9wcm9tcHQoKS4KKyAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgorICovCisKKyNpZiAhIF9fRUZVTl9ERUZJTkVEX18oc2V0X3Byb21wdCkKKworI2luY2x1ZGUgPGNvbmZpZ3VyYXRpb24uaD4KKwordmFyYXJncyBzdHJpbmd8Y2xvc3VyZSBzZXRfcHJvbXB0KHN0cmluZ3xjbG9zdXJlfGludCBwcm9tcHQsIG9iamVjdCBvYikKK3sKKyAgICBvYiB8fD0gZWZ1bjo6dGhpc19wbGF5ZXIoKTsKKworICAgIG1peGVkIG9sZHByb21wdCA9IGVmdW46OmludGVyYWN0aXZlX2luZm8ob2IsIElDX1BST01QVCk7CisKKyAgICBpZighaW50cChwcm9tcHQpKQorICAgICAgICBlZnVuOjpjb25maWd1cmVfaW50ZXJhY3RpdmUob2IsIElDX1BST01QVCwgcHJvbXB0KTsKKworICAgIHJldHVybiBvbGRwcm9tcHQ7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc2hhZG93LmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zaGFkb3cuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjA4YzczCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc2hhZG93LmMKQEAgLTAsMCArMSw1NSBAQAorLyogVGhlc2Ugc2VmdW5zIGFyZSB0byBwcm92aWRlIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBlZnVuIHF1ZXJ5X3NoYWRvd2luZygpCisgKiBhbmQgdGhlIG9sZCBzZW1hbnRpY3Mgb2YgdGhlIGVmdW4gc2hhZG93KCkuCisgKiBGZWVsIGZyZWUgdG8gYWRkIGl0IHRvIHlvdXIgbXVkbGlicywgaWYgeW91IGhhdmUgbXVjaCBjb2RlIHJlbHlpbmcgb24gdGhhdC4KKyAqLworCisjaWYgISBfX0VGVU5fREVGSU5FRF9fKHF1ZXJ5X3NoYWRvd2luZykKKworI2luY2x1ZGUgPG9iamVjdF9pbmZvLmg+CisKK29iamVjdCBxdWVyeV9zaGFkb3dpbmcob2JqZWN0IG9iKQoreworICAgIHJldHVybiBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0hBRE9XX1BSRVYpOworfQorCitwcml2YXRlIG9iamVjdCBfc2hhZG93KG9iamVjdCBvYiwgaW50IGZsYWcpCit7CisgICAgaWYoZmxhZykKKyAgICB7CisgICAgICAgIG9iamVjdCBzaGFkb3dlciA9IGVmdW46OnByZXZpb3VzX29iamVjdCgxKTsKKyAgICAgICAgZWZ1bjo6c2V0X3RoaXNfb2JqZWN0KHNoYWRvd2VyKTsKKworICAgICAgICBpZiAoZWZ1bjo6c2hhZG93KG9iKSkKKyAgICAgICAgICAgIHJldHVybiBlZnVuOjpvYmplY3RfaW5mbyhzaGFkb3dlciwgT0lfU0hBRE9XX1BSRVYpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXR1cm4gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NIQURPV19ORVhUKTsKK30KKyNlbHNlCitwcml2YXRlIG9iamVjdCBfc2hhZG93KG9iamVjdCBvYiwgaW50IGZsYWcpCit7CisgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoMSkpOworICByZXR1cm4gZWZ1bjo6c2hhZG93KG9iLCBmbGFnKTsKK30KKyNlbmRpZgorCisKK3B1YmxpYyBvYmplY3Qgc2hhZG93KG9iamVjdCBvYiwgaW50IGZsYWcpCit7CisgIG9iamVjdCByZXMgPSBmdW5jYWxsKCMnX3NoYWRvdyxvYiwgZmxhZyk7CisgIGlmIChmbGFnKQorICAgICIvc2VjdXJlL3NoYWRvd21hc3RlciItPlJlZ2lzdGVyU2hhZG93KHByZXZpb3VzX29iamVjdCgpKTsKKyAgcmV0dXJuIHJlczsKK30KKworcHJpdmF0ZSB2b2lkIF91bnNoYWRvdygpIHsKKyAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgxKSk7CisgIGVmdW46OnVuc2hhZG93KCk7Cit9CisKK3B1YmxpYyB2b2lkIHVuc2hhZG93KCkgeworICBmdW5jYWxsKCMnX3Vuc2hhZG93KTsKKyAgIi9zZWN1cmUvc2hhZG93bWFzdGVyIi0+VW5yZWdpc3RlclNoYWRvdyhwcmV2aW91c19vYmplY3QoKSk7Cit9CmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zaW11bF9lZnVuLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zaW11bF9lZnVuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRlMGI3OAotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NpbXVsX2VmdW4uYwpAQCAtMCwwICsxLDIwMTYgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBzaW11bF9lZnVuLmMgLS0gc2ltdWwgZWZ1bidzCisvLworLy8gJElkOiBzaW11bF9lZnVuLmMgNzQwOCAyMDEwLTAyLTA2IDAwOjI3OjI1WiBaZXNzdHJhICQKKyNwcmFnbWEgc3RyaWN0X3R5cGVzLHNhdmVfdHlwZXMscnR0X2NoZWNrcworI3ByYWdtYSBub19jbG9uZSxub19zaGFkb3csbm9faW5oZXJpdAorI3ByYWdtYSBwZWRhbnRpYyxyYW5nZV9jaGVjayx3YXJuX2RlcHJlY2F0ZWQKKyNwcmFnbWEgd2Fybl9lbXB0eV9jYXN0cyx3YXJuX21pc3NpbmdfcmV0dXJuLHdhcm5fZnVuY3Rpb25faW5jb25zaXN0ZW50CisKKy8vIEFic29sdXRlIFBmYWRlIGVyZm9yZGVybGljaCAtIHp1bSBaZWl0cHVua3QsIHdvIGRlciBNYXN0ZXIgZ2VsYWRlbgorLy8gd2lyZCwgc2luZCBub2NoIGtlaW5lIEluY2x1ZGUtUGZhZGUgZGEgLi4uCisKKyNkZWZpbmUgU05PT1BMT0dGSUxFICJTTk9PUCIKKyNkZWZpbmUgQVNOT09QTE9HRklMRSAiQVJDSC9TTk9PUCIKKworI2luY2x1ZGUgIi9zZWN1cmUvY29uZmlnLmgiCisjaW5jbHVkZSAiL3NlY3VyZS93aXpsZXZlbHMuaCIKKyNpbmNsdWRlICIvc3lzL3Nub29waW5nLmgiCisjaW5jbHVkZSAiL3N5cy9sYW5ndWFnZS5oIgorI2luY2x1ZGUgIi9zeXMvdGhpbmcvcHJvcGVydGllcy5oIgorI2luY2x1ZGUgIi9zeXMvd2l6bGlzdC5oIgorI2luY2x1ZGUgIi9zeXMvZXJxLmgiCisjaW5jbHVkZSAiL3N5cy9scGN0eXBlcy5oIgorI2luY2x1ZGUgIi9zeXMvZGFlbW9uLmgiCisjaW5jbHVkZSAiL3N5cy9wbGF5ZXIvYmFzZS5oIgorI2luY2x1ZGUgIi9zeXMvdGhpbmcvZGVzY3JpcHRpb24uaCIKKyNpbmNsdWRlICIvc3lzL2NvbnRhaW5lci5oIgorI2luY2x1ZGUgIi9zeXMvZGVmaW5lcy5oIgorI2luY2x1ZGUgIi9zeXMvdGVsbmV0LmgiCisjaW5jbHVkZSAiL3N5cy9vYmplY3RpbmZvLmgiCisjaW5jbHVkZSAiL3N5cy9maWxlcy5oIgorI2luY2x1ZGUgIi9zeXMvc3RyaW5ncy5oIgorI2luY2x1ZGUgIi9zeXMvdGltZS5oIgorI2luY2x1ZGUgIi9zeXMvbHBjdHlwZXMuaCIKKyNpbmNsdWRlICIvc3lzL25vdGlmeV9mYWlsLmgiCisjaW5jbHVkZSAiL3N5cy90bHMuaCIKKyNpbmNsdWRlICIvc3lzL2lucHV0X3RvLmgiCisjaW5jbHVkZSAiL3N5cy9vYmplY3RfaW5mby5oIgorCisvKiBmdW5jdGlvbiBwcm90b3R5cGVzCisgKi8KK3N0cmluZyBkdGltZShpbnQgd2Fubik7Cit2YXJhcmdzIGludCBsb2dfZmlsZShzdHJpbmcgZmlsZSwgc3RyaW5nIHR4dCwgaW50IHNpemVfdG9fYnJlYWspOworaW50IHF1ZXJ5X3dpel9sZXZlbChtaXhlZCBwbGF5ZXIpOworbm9tYXNrIHZhcmFyZ3MgaW50IHNub29wKG9iamVjdCBtZSwgb2JqZWN0IHlvdSk7Cit2YXJhcmdzIHN0cmluZyBjb3VudHJ5KG1peGVkIGlwLCBzdHJpbmcgbnVtKTsKK2ludCBxdWVyeV93aXpfZ3JwKG1peGVkIHdpeik7CitwdWJsaWMgdmFyYXJncyBvYmplY3QgZGVlcF9wcmVzZW50KG1peGVkIHdoYXQsIG9iamVjdCBvYik7Citub21hc2sgaW50IHNlY3VyZV9sZXZlbCgpOworbm9tYXNrIHN0cmluZyBzZWN1cmVfZXVpZCgpOworcHVibGljIG5vbWFzayBpbnQgcHJvY2Vzc19jYWxsKCk7Citub21hc2sgbWl4ZWQgX19jcmVhdGVfcGxheWVyX2R1bW15KHN0cmluZyBuYW1lKTsKK3ZhcmFyZ3Mgc3RyaW5nIHJlcGxhY2VfcGVyc29uYWwoc3RyaW5nIHN0ciwgbWl4ZWQgKm9icywgaW50IGNhcHMpOworCisKKy8vcmVwbGFjZW1lbnRzIGZvciBkcm9wcGVkIGVmdW5zIGluIExECisjaWYgIV9fRUZVTl9ERUZJTkVEX18oZXh0cmFjdCkKK3ZhcmFyZ3Mgc3RyaW5nIGV4dHJhY3Qoc3RyaW5nIHN0ciwgaW50IGZyb20sIGludCB0byk7CisjZW5kaWYKKyNpZiAhX19FRlVOX0RFRklORURfXyhzbGljZV9hcnJheSkKK3ZhcmFyZ3MgbWl4ZWQgc2xpY2VfYXJyYXkobWl4ZWQgYXJyYXksIGludCBmcm9tLCBpbnQgdG8pOworI2VuZGlmCisjaWYgIV9fRUZVTl9ERUZJTkVEX18obWVtYmVyX2FycmF5KQoraW50IG1lbWJlcl9hcnJheShtaXhlZCBpdGVtLCBtaXhlZCBhcnJheXN0cmluZyk7CisjZW5kaWYKKworLy8gSW5jbHVkZSB0aGUgZGlmZmVyZW50IHN1YiAnbW9kdWxlcycgb2YgdGhlIHNpbXVsX2VmdW4KKyNpbmNsdWRlIF9fRElSX18iZGVidWdfaW5mby5jIgorI2luY2x1ZGUgX19ESVJfXyJlbmFibGVfY29tbWFuZHMuYyIKKyNpbmNsdWRlIF9fRElSX18iaGFzaC5jIgorI2luY2x1ZGUgX19ESVJfXyJvYmplY3RfaW5mby5jIgorI2luY2x1ZGUgX19ESVJfXyJxdWVyeV9lZGl0aW5nLmMiCisjaW5jbHVkZSBfX0RJUl9fInF1ZXJ5X2lkbGUuYyIKKyNpbmNsdWRlIF9fRElSX18icXVlcnlfaW5wdXRfcGVuZGluZy5jIgorI2luY2x1ZGUgX19ESVJfXyJxdWVyeV9pcF9uYW1lLmMiCisjaW5jbHVkZSBfX0RJUl9fInF1ZXJ5X2xpbWl0cy5jIgorI2luY2x1ZGUgX19ESVJfXyJxdWVyeV9sb2FkX2F2ZXJhZ2UuYyIKKyNpbmNsdWRlIF9fRElSX18icXVlcnlfbXVkX3BvcnQuYyIKKyNpbmNsdWRlIF9fRElSX18icXVlcnlfb25jZV9pbnRlcmFjdGl2ZS5jIgorI2luY2x1ZGUgX19ESVJfXyJxdWVyeV9zbm9vcC5jIgorI2luY2x1ZGUgX19ESVJfXyJzZXRfaGVhcnRfYmVhdC5jIgorI2lmIF9fQk9PVF9USU1FX18gPCAxNDU2MjYxODU5CisjaW5jbHVkZSBfX0RJUl9fInNldF9wcm9tcHQuYyIKKyNlbmRpZgorI2luY2x1ZGUgX19ESVJfXyJzaGFkb3cuYyIKKyNpbmNsdWRlIF9fRElSX18ibGl2aW5ncy5jIgorI2luY2x1ZGUgX19ESVJfXyJjb21tLmMiCisKKyNkZWZpbmUgVE8gICAgICAgIGVmdW46OnRoaXNfb2JqZWN0KCkKKyNkZWZpbmUgVEkgICAgICAgIGVmdW46OnRoaXNfaW50ZXJhY3RpdmUoKQorI2RlZmluZSBUUCAgICAgICAgZWZ1bjo6dGhpc19wbGF5ZXIoKQorI2RlZmluZSBQTyAgICAgICAgZWZ1bjo6cHJldmlvdXNfb2JqZWN0KDApCisjZGVmaW5lIExFVkVMKHgpIHF1ZXJ5X3dpel9sZXZlbCh4KQorI2RlZmluZSBOQU1FKHgpICBjYXBpdGFsaXplKGdldHVpZCh4KSkKKworI2RlZmluZSBERUJVRyh4KSBpZiAoZmluZF9wbGF5ZXIoInplc3N0cmEiKSkgXAorICB0ZWxsX29iamVjdChmaW5kX3BsYXllcigiemVzc3RyYSIpLHgpCisKK21peGVkIGR0aW1lX2NhY2hlID0gKHstMSwiIn0pOworCisjaWZkZWYgSU9TVEFUUworc3RydWN0IGlvc3RhdF9zIHsKKyAgc3RyaW5nIG9uYW1lOworICBpbnQgdGltZTsKKyAgaW50IHNpemU7Cit9OworbWl4ZWQgc2F2ZW9fc3RhdCA9ICh7IDAsYWxsb2NhdGUoMjAwLCAwKSB9KTsKK21peGVkIHJlc3RvcmVvX3N0YXQgPSAoeyAwLGFsbG9jYXRlKDIwMCwwKSB9KTsKKy8vbWl4ZWQgd3JpdGVmaWxlX3N0YXQgPSAoeyAwLGFsbG9jYXRlKDEwMCwoPGlvc3RhdF9zPikpIH0pOworLy9taXhlZCByZWFkZmlsZV9zdGF0ID0gKHsgMCxhbGxvY2F0ZSgxMDAsKDxpb3N0YXRfcz4pKSB9KTsKKy8vbWl4ZWQgbG9nX3N0YXQgPSAoeyAwLGFsbG9jYXRlKDEwMCwoPGlvc3RhdF9zPikpIH0pOworCittaXhlZCBfX19pb3N0YXRzKGludCB0eXBlKSB7CisgIHN3aXRjaCh0eXBlKSB7CisgICAgY2FzZSAxOgorICAgICAgcmV0dXJuIHNhdmVvX3N0YXQ7CisgICAgY2FzZSAyOgorICAgICAgcmV0dXJuIHJlc3RvcmVvX3N0YXQ7CisvKiAgICBjYXNlIDM6CisgICAgICByZXR1cm4gd3JpdGVmaWxlX3N0YXQ7CisgICAgY2FzZSA0OgorICAgICAgcmV0dXJuIHJlYWRmaWxlX3N0YXQ7CisgICAgY2FzZSA1OgorICAgICAgcmV0dXJuIGxvZ19zdGF0OworICAgICAgKi8KKyAgfQorICByZXR1cm4gMDsKK30KKyNlbmRpZgorCisvLyBOaWNodCBqZWRlciBNYWdpZXIgbXVzcyBkaWUgc2ltdWxfZWZ1biBlbnRzb3JnZW4ga29lbm5lbi4KK3N0cmluZyBOb3RpZnlEZXN0cnVjdChvYmplY3QgY2FsbGVyKSB7CisgICAgaWYoIChjYWxsZXIhPXRoaXNfb2JqZWN0KCkgJiYgIUFSQ0hfU0VDVVJJVFkpIHx8IHByb2Nlc3NfY2FsbCgpICkgeworICAgICAgcmV0dXJuICJEdSBkYXJmc3QgZGFzIHNpbXVsX2VmdW4gT2JqZWt0IG5pY2h0IHplcnN0b2VyZW4hXG4iOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworcHVibGljIG5vbWFzayB2b2lkIHJlbW92ZV9pbnRlcmFjdGl2ZSggb2JqZWN0IG9iICkKK3sKKyAgICBpZiAoIG9iamVjdHAob2IpICYmIHByZXZpb3VzX29iamVjdCgpCisgICAgICAgICYmIG9iamVjdF9uYW1lKHByZXZpb3VzX29iamVjdCgpKVswLi43XSAhPSAiL3NlY3VyZS8iCisgICAgICAgICYmICgocHJldmlvdXNfb2JqZWN0KCkgIT0gb2IKKyAgICAgICAgICAgICAmJiAob2IgIT0gdGhpc19wbGF5ZXIoKSB8fCBvYiAhPSB0aGlzX2ludGVyYWN0aXZlKCkpKQorICAgICAgICAgICAgfHwgKHByZXZpb3VzX29iamVjdCgpID09IG9iCisgICAgICAgICAgICAgICAmJiAodGhpc19wbGF5ZXIoKSAmJiB0aGlzX3BsYXllcigpICE9IG9iCisgICAgICAgICAgICAgICAgICAgfHwgdGhpc19pbnRlcmFjdGl2ZSgpICYmIHRoaXNfaW50ZXJhY3RpdmUoKSAhPSBvYikpICkgKQorCisgICAgICAgbG9nX2ZpbGUoICJQTEFZRVJERVNUIiwKKyAgICAgICAgICAgICAgICBzcHJpbnRmKCAiJXM6ICVPIGF1c2dlbG9nZ3Qgdm9uIFBPICVPLCBUSSAlTywgVFAgJU9cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBkdGltZSh0aW1lKCkpLCBvYiwgcHJldmlvdXNfb2JqZWN0KCksCisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzX2ludGVyYWN0aXZlKCksIHRoaXNfcGxheWVyKCkgKSApOworCisgICAgZWZ1bjo6cmVtb3ZlX2ludGVyYWN0aXZlKG9iKTsKK30KKworCit2b2lkIF9fX3VwZG1hc3RlcigpCit7CisgICAgb2JqZWN0IG9iOworCisgICAgLy9zb2xsdGUgbmljaHQgamVkZXIgZHVlcmZlbi4KKyAgICBpZiAocHJvY2Vzc19jYWxsKCkgfHwgIUFSQ0hfU0VDVVJJVFkpCisgICAgICByYWlzZV9lcnJvcigiSWxsZWdhbCB1c2Ugb2YgX19fdXBkbWFzdGVyKCkhIik7CisKKyAgICB3cml0ZSgiUmVtb3Zpbmcgb2xkIG1hc3RlciAuLi4gIik7CisgICAgZm9yZWFjaChzdHJpbmcgZmlsZTogCisgICAgICAgIGdldF9kaXIoIi9zZWN1cmUvbWFzdGVyLyouYyIsR0VURElSX05BTUVTfEdFVERJUl9VTlNPUlRFRHxHRVRESVJfUEFUSCkpIHsKKyAgICAgIGlmIChvYiA9IGZpbmRfb2JqZWN0KGZpbGUpKQorICAgICAgIGVmdW46OmRlc3RydWN0KG9iKTsKKyAgICB9CisgICAgZWZ1bjo6ZGVzdHJ1Y3QoZWZ1bjo6ZmluZF9vYmplY3QoIi9zZWN1cmUvbWFzdGVyIikpOworICAgIHdyaXRlKCJkb25lLlxuTG9hZGluZyBhZ2FpbiAuLi4gIik7CisgICAgbG9hZF9vYmplY3QoIi9zZWN1cmUvbWFzdGVyIik7CisKKyAgICB3cml0ZSgiZG9uZS5cbiIpOworfQorCit2YXJhcmdzIHN0cmluZyBjb3VudHJ5KG1peGVkIGlwLCBzdHJpbmcgbnVtKSB7CisgIG1peGVkIHJldDsKKworICBpZihyZXQgPSAoc3RyaW5nKSIvcC9kYWVtb24vaXBsb29rdXAiLT5jb3VudHJ5KG51bSB8fCBpcCkpIHsKKyAgICByZXR1cm4gcmV0OworICB9IGVsc2UgcmV0dXJuICI/Pz8iOworfQorCisKKy8vICogU25vb3BlbiB1bmQgd2FzIGRhenVnZWhvZXJ0CitzdGF0aWMgb2JqZWN0IGZpbmRfc25vb3BlZChvYmplY3Qgd2hvKQoreworICBvYmplY3QgKnU7CisgIGludCBpOworCisgIGZvciAoaT1zaXplb2YodT11c2VycygpKS0xO2k+PTA7aS0tKQorICAgIGlmICh3aG89PWVmdW46OmludGVyYWN0aXZlX2luZm8odVtpXSwgSUlfU05PT1BfTkVYVCkpCisgICAgICByZXR1cm4gdVtpXTsKKyAgcmV0dXJuIDA7Cit9CisKK3ByaXZhdGUgc3RyaW5nIExjdXQoc3RyaW5nIHN0cikgeworICByZXR1cm4gc3RyWzUuLjExXStzdHJbMTguLl07Cit9CisKK25vbWFzayB2YXJhcmdzIGludCBzbm9vcCggb2JqZWN0IG1lLCBvYmplY3QgeW91ICkKK3sKKyAgICBpbnQgcmV0OworICAgIG9iamVjdCBzbm9vcGVyMCwgc25vb3Blciwgc25vb3BlcjIsIHNub29wZXIzOworCisgICAgaWYoICFvYmplY3RwKG1lKSB8fCBtZSA9PSB5b3UgfHwgIVBPICkKKyAgICAgICByZXR1cm4gMDsKKworICAgIHNub29wZXIwID0gZmluZF9zbm9vcGVkKG1lKTsKKworICAgICBpZih5b3UpeworICAgICAgICBpZiAoIFBPICE9IG1lICYmIHF1ZXJ5X3dpel9ncnAobWUpID49IHF1ZXJ5X3dpel9ncnAoZ2V0ZXVpZChQTykpICkKKyAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIGlmICggcXVlcnlfd2l6X2dycChtZSkgPD0gcXVlcnlfd2l6X2dycCh5b3UpICYmCisgICAgICAgICAgICAgISh5b3UtPlF1ZXJ5QWxsb3dTbm9vcChtZSkpICkKKyAgICAgICAgICAgIGlmICggIUlTX0RFUFVUWShtZSkgfHwgSVNfQVJDSCh5b3UpICkKKyAgICAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIGlmICggKHNub29wZXIgPSBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKHlvdSwgSUlfU05PT1BfTkVYVCkpICYmCisgICAgICAgICAgICAgcXVlcnlfd2l6X2dycChzbm9vcGVyKSA+PSBxdWVyeV93aXpfZ3JwKG1lKSApeworICAgICAgICAgICAgaWYgKCAoaW50KXNub29wZXItPlF1ZXJ5UHJvcChQX1NOT09QRkxBR1MpICYgU0ZfTE9DS0VEICkKKyAgICAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgICAgICB0ZWxsX29iamVjdCggc25vb3Blciwgc3ByaW50ZiggIiVzIHNub29wZWQgamV0enQgJXMuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWUtPm5hbWUoV0VSKSwgeW91LT5uYW1lKFdFUikgKSApOworCisgICAgICAgICAgICBzbm9vcGVyMiA9IG1lOworCisgICAgICAgICAgICB3aGlsZSAoIHNub29wZXIzID0gaW50ZXJhY3RpdmVfaW5mbyhzbm9vcGVyMiwgSUlfU05PT1BfTkVYVCkgKXsKKyAgICAgICAgICAgICAgIHRlbGxfb2JqZWN0KCBzbm9vcGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZiggIiVzIHdpcmQgc2VpbmVyc2VpdHMgdm9uICVzIGdlc25vb3BlZC5cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLHNub29wZXIyLT5uYW1lKFdFUiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNub29wZXIzLT5uYW1lKFdFTSkgKSApOworICAgICAgICAgICAgICAgc25vb3BlcjIgPSBzbm9vcGVyMzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZWZ1bjo6c25vb3AoIHNub29wZXIsIHNub29wZXIyICk7CisKKyAgICAgICAgICAgIGlmICggZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyhzbm9vcGVyMiwgSUlfU05PT1BfTkVYVCkgIT0gc25vb3BlciApCisgICAgICAgICAgICAgICB0ZWxsX29iamVjdCggc25vb3Blciwgc3ByaW50ZiggIkR1IGthbm5zdCAlcyBuaWNodCBzbm9vcGVuLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNub29wZXIyLT5uYW1lKFdFTikgKSApOworICAgICAgICAgICAgZWxzZXsKKyAgICAgICAgICAgICAgIHRlbGxfb2JqZWN0KCBzbm9vcGVyLCBzcHJpbnRmKCAiRHUgc25vb3BzdCBqZXR6dCAlcy5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbm9vcGVyMi0+bmFtZShXRU4pICkgKTsKKyAgICAgICAgICAgICAgIGlmICggIUlTX0RFUFVUWShzbm9vcGVyKSApeworICAgICAgICAgICAgICAgICAgIGxvZ19maWxlKCBTTk9PUExPR0ZJTEUsIHNwcmludGYoIiVzOiAlTyAlTyAlT1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHRpbWUodGltZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25vb3BlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25vb3BlcjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50KHNub29wZXIyKSApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAwMCApOworICAgICAgICAgICAgICAgICAgIGlmIChzbm9vcGVyMCkKKyAgICAgICAgICAgICAgICAgICAgICBDSE1BU1RFUi0+c2VuZCggIlNub29wIiwgc25vb3BlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoICIlcyAqT0ZGKiAlcyAoJU8pIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShnZXR1aWQoc25vb3BlcikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBpdGFsaXplKGdldHVpZChzbm9vcGVyMCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudChzbm9vcGVyMCkgKSApOworCisgICAgICAgICAgICAgICAgICAgQ0hNQVNURVItPnNlbmQoICJTbm9vcCIsIHNub29wZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCIlcyAtPiAlcyAoJU8pIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBpdGFsaXplKGdldHVpZChzbm9vcGVyKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShnZXR1aWQoc25vb3BlcjIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudChzbm9vcGVyMikpKTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIGVsc2V7CisgICAgICAgICAgICAgICAgICAgbG9nX2ZpbGUoIEFTTk9PUExPR0ZJTEUsIHNwcmludGYoICIlczogJU8gJU8gJU9cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHRpbWUodGltZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbm9vcGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNub29wZXIyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50KHNub29wZXIyKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDEwMDAwMCApOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGlmIChzbm9vcGVyKQorICAgICAgICAgICAgICAgaWYgKCAhbWUtPlF1ZXJ5UHJvcChQX1NOT09QRkxBR1MpICYgU0ZfTE9DS0VEICl7CisgICAgICAgICAgICAgICAgICAgcHJpbnRmKCAiJXMgd2lyZCBiZXJlaXRzIHZvbiAlcyBnZXNub29wZWQuIEJlbnV0emUgZGFzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiZlwiLUZsYWcsIHdlbm4gZHUgZGVubm9jaCBzbm9vcGVuIHdpbGxzdC5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHlvdS0+bmFtZShXRVIpLCBzbm9vcGVyLT5uYW1lKFdFTSkgKTsKKyAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgIH0KKworICAgICAgICByZXQgPSBlZnVuOjpzbm9vcCggbWUsIHlvdSApOworCisgICAgICAgIGlmICggIUlTX0RFUFVUWShtZSkgJiYgZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyh5b3UsIElJX1NOT09QX05FWFQpID09IG1lKXsKKyAgICAgICAgICAgIGxvZ19maWxlKCBTTk9PUExPR0ZJTEUsIHNwcmludGYoICIlczogJU8gJU8gJU9cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExjdXQoZHRpbWUodGltZSgpKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lLCB5b3UsIGVudmlyb25tZW50KHlvdSkgKSwKKyAgICAgICAgICAgICAgICAgICAgIDEwMDAwMCApOworCisgICAgICAgICAgICBpZiAoc25vb3BlcjApCisgICAgICAgICAgICAgICBDSE1BU1RFUi0+c2VuZCggIlNub29wIiwgbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoICIlcyAqT0ZGKiAlcyAoJU8pLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShnZXR1aWQobWUpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBpdGFsaXplKGdldHVpZChzbm9vcGVyMCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50KHNub29wZXIwKSApICk7CisKKyAgICAgICAgICAgIENITUFTVEVSLT5zZW5kKCAiU25vb3AiLCBtZSwgc3ByaW50ZiggIiVzIC0+ICVzICglTykuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUoZ2V0dWlkKG1lKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBpdGFsaXplKGdldHVpZCh5b3UpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50KHlvdSkgKSApOworICAgICAgICB9CisgICAgICAgIGVsc2V7CisgICAgICAgICAgICBpZiAoIGVmdW46OmludGVyYWN0aXZlX2luZm8oeW91LCBJSV9TTk9PUF9ORVhUKSA9PSBtZSApeworICAgICAgICAgICAgICAgbG9nX2ZpbGUoIEFTTk9PUExPR0ZJTEUsIHNwcmludGYoICIlczogJU8gJU8gJU9cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMY3V0KGR0aW1lKHRpbWUoKSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWUsIHlvdSwgZW52aXJvbm1lbnQoeW91KSApLAorICAgICAgICAgICAgICAgICAgICAgICAgMTAwMDAwICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIHJldCAmJiBxdWVyeV93aXpfZ3JwKG1lKSA8PSBxdWVyeV93aXpfZ3JwKHlvdSkgJiYKKyAgICAgICAgICAgICAhSVNfREVQVVRZKG1lKSApCisgICAgICAgICAgICB0ZWxsX29iamVjdCggeW91LCAiKioqICIgKyBOQU1FKG1lKSArICIgc25vb3B0IERpY2ghXG4iICk7CisKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgfQorICAgICBlbHNlIHsKKyAgICAgICAgaWYgKCAobWUgPT0gUE8gfHwKKyAgICAgICAgICAgICAgcXVlcnlfd2l6X2dycChnZXRldWlkKFBPKSkgPiBxdWVyeV93aXpfZ3JwKG1lKSB8fAorICAgICAgICAgICAgICAocXVlcnlfd2l6X2dycChnZXRldWlkKFBPKSkgPT0gcXVlcnlfd2l6X2dycChtZSkgJiYKKyAgICAgICAgICAgICAgZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyhQTywgSUlfU05PT1BfTkVYVCkgPT0gbWUpKSAmJiBzbm9vcGVyMCApeworICAgICAgICAgICAgaWYgKCAhSVNfREVQVVRZKG1lKSApeworICAgICAgICAgICAgICAgbG9nX2ZpbGUoIFNOT09QTE9HRklMRSwgc3ByaW50ZiggIiVzOiAlTyAlTyAlTyAqT0ZGKlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGN1dChkdGltZSh0aW1lKCkpKSwgbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNub29wZXIwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudChzbm9vcGVyMCkgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAwMCApOworCisgICAgICAgICAgICAgICAgQ0hNQVNURVItPnNlbmQoICJTbm9vcCIsIG1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZiggIiVzICpPRkYqICVzICglTykuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShnZXR1aWQobWUpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShnZXR1aWQoc25vb3BlcjApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQoc25vb3BlcjApICkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2V7CisgICAgICAgICAgICAgICBsb2dfZmlsZSggQVNOT09QTE9HRklMRSwgc3ByaW50ZiggIiVzOiAlTyAlTyAlTyAqT0ZGKlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExjdXQoZHRpbWUodGltZSgpKSksIG1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25vb3BlcjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudChzbm9vcGVyMCkgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAwMCApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gZWZ1bjo6c25vb3AobWUpOworICAgICAgICB9CisgICAgIH0KKyAgICAgcmV0dXJuIDA7Cit9CisKKworCisvLyAqIEVtdWxhdGlvbiBkZXMgJ2FsdGVuJyBleHBsb2RlIGR1cmNoIGRhcyBuZXVlCitzdHJpbmcgKm9sZF9leHBsb2RlKHN0cmluZyBzdHIsIHN0cmluZyBkZWwpIHsKKyAgaW50IHMsIHQ7CisgIHN0cmluZyAqc3RyczsKKworICBpZiAoIXN0cmluZ3Aoc3RyKSkgeworICAgICAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKKyAgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoCisgICAgICAgICAiSW52YWxpZCBhcmd1bWVudCAxIHRvIG9sZF9leHBsb2RlKCkhIEV4cGVjdGVkIDxzdHJpbmc+LCBnb3Q6ICIKKyAgICAgICAgICIlLjMwT1xuIixzdHIpKTsKKyAgfQorICBpZiAoIXN0cmluZ3AoZGVsKSkgeworICAgICAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKKyAgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoCisgICAgICAgICAiSW52YWxpZCBhcmd1bWVudCAyIHRvIG9sZF9leHBsb2RlKCkhIEV4cGVjdGVkIDxzdHJpbmc+LCBnb3Q6ICIKKyAgICAgICAgICIlLjMwT1xuIixkZWwpKTsKKyAgfQorICBpZihkZWwgPT0gIiIpCisgICAgcmV0dXJuICh7c3RyfSk7CisgIHN0cnM9ZWZ1bjo6ZXhwbG9kZShzdHIsIGRlbCk7CisgIHQ9c2l6ZW9mKHN0cnMpLTE7CisgIHdoaWxlKHM8PXQgJiYgc3Ryc1tzKytdID09ICIiKTtzLS07CisgIHdoaWxlKHQ+PTAgJiYgc3Ryc1t0LS1dID09ICIiKTt0Kys7CisgIGlmKHM8PXQpCisgICAgcmV0dXJuIHN0cnNbcy4udF07CisgIHJldHVybiAoe30pOworfQorCitpbnQgZmlsZV90aW1lKHN0cmluZyBwYXRoKSB7CisgIG1peGVkICp2OworCisgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CisgIGlmIChzaXplb2Yodj1nZXRfZGlyKHBhdGgsR0VURElSX0RBVEVTKSkpIHJldHVybiB2WzBdOworICByZXR1cm4oMCk7IC8vc29uc3QKK30KKworLy8gKiBCZWkgNTBrIEdyb2Vzc2UgTG9nLUZpbGUgcm90aWVyZW4KK3ZhcmFyZ3MgaW50IGxvZ19maWxlKHN0cmluZyBmaWxlLCBzdHJpbmcgdHh0LCBpbnQgc2l6ZV90b19icmVhaykgeworICBtaXhlZCAqc3Q7CisKKyAgZmlsZT0iL2xvZy8iK2ZpbGU7CisgIGZpbGU9aW1wbG9kZSgoZWZ1bjo6ZXhwbG9kZShmaWxlLCIvIiktKHsiLi4ifSkpLCIvIik7CisvLyAgdGVsbF9vYmplY3QoZmluZF9wbGF5ZXIoImpvZiIpLHNwcmludGYoIkxPRyBGSUxFOiAlTyAtPiAlT1xuIixwcmV2aW91c19vYmplY3QoKSxmaWxlKSk7CisgIGlmICghZnVuY2FsbChiaW5kX2xhbWJkYSgjJ2VmdW46OmNhbGxfb3RoZXIsUE8pLCJzZWN1cmUvbWFzdGVyIiwvLycpCisgICAgICAgICAgICAgICJ2YWxpZF93cml0ZSIsZmlsZSxnZXRldWlkKFBPKSwibG9nX2ZpbGUiLFBPKSkKKyAgICAgIHJldHVybiAwOworICBpZiAoIHNpemVfdG9fYnJlYWsgPj0gMCAmICgKKyAgICAgIHNpemVvZihzdCA9IGdldF9kaXIoZmlsZSwyKSApICYmIHN0WzBdID49IChzaXplX3RvX2JyZWFrfE1BWF9MT0dfU0laRSkpKQorICAgICAgY2F0Y2gocmVuYW1lKGZpbGUsIGZpbGUgKyAiLm9sZCIpO3B1Ymxpc2gpOyAvKiBObyBwYW5pYyBpZiBmYWlsdXJlICovCisgIHJldHVybih3cml0ZV9maWxlKGZpbGUsdHh0KSk7Cit9CisKKy8vICogTWFnaWVyLUxldmVsIGFiZnJhZ2VuCitpbnQgcXVlcnlfd2l6X2xldmVsKG1peGVkIHBsYXllcikgeworICByZXR1cm4gKGludCkiL3NlY3VyZS9tYXN0ZXIiLT5xdWVyeV93aXpfbGV2ZWwocGxheWVyKTsKK30KKworI2lmZGVmIF9fQUxJU1RTX18KKy8vICogRWxlbWVudCBhdXMgQWxpc3QgbG9lc2NoZW4gKGJ5IGtleSkKK21peGVkICpyZW1vdmVfYWxpc3QobWl4ZWQga2V5LG1peGVkICphbGlzdCkKK3sKKyAgaW50IGksajsKKworICBpZiAoIXBvaW50ZXJwKGFsaXN0KSB8fCAhc2l6ZW9mKGFsaXN0KSkKKyAgICByZXR1cm4gYWxpc3Q7CisgIGlmICghcG9pbnRlcnAoYWxpc3RbMF0pKQorICB7CisgICAgaWYgKChpPWFzc29jKGtleSxhbGlzdCkpPDApCisgICAgICByZXR1cm4gYWxpc3Q7CisgICAgcmV0dXJuIGFsaXN0WzAuLmktMV0rYWxpc3RbaSsxLi5dOworICB9CisgIGkgPSBhc3NvYyhrZXksYWxpc3RbMF0pOworICBpZiAoKGk9YXNzb2Moa2V5LGFsaXN0WzBdKSk8MCkKKyAgICByZXR1cm4gYWxpc3Q7CisgIGFsaXN0PWFsaXN0WzAuLl07CisgIGZvciAoaj1zaXplb2YoYWxpc3QpLTE7aj49MDtqLS0pCisgICAgYWxpc3Rbal09YWxpc3Rbal1bMC4uaS0xXSthbGlzdFtqXVtpKzEuLl07CisgIHJldHVybiBhbGlzdDsKK30KKworLy8gKiBFbGVtZW50IGF1cyBBbGlzdCBsb2VzY2hlbiAoYnkgcG9zKQorbWl4ZWQgKmV4Y2x1ZGVfYWxpc3QoaW50IGksbWl4ZWQgKmFsaXN0KQoreworICBpbnQgajsKKyAgaWYgKCFwb2ludGVycChhbGlzdCkgfHwgIXNpemVvZihhbGlzdCkgfHwgaTwwKQorICAgIHJldHVybiBhbGlzdDsKKyAgaWYgKCFwb2ludGVycChhbGlzdFswXSkpCisgICAgcmV0dXJuIGFsaXN0WzAuLmktMV0rYWxpc3RbaSsxLi5dOworICBhbGlzdD1hbGlzdFswLi5dOyAvKiBDcmVhdGUgUEhZU0lDQUwgY29weSBvZiBhbGlzdCAqLworICBmb3IgKGo9c2l6ZW9mKGFsaXN0KS0xO2o+PTA7ai0tKQorICAgIGFsaXN0W2pdPWFsaXN0W2pdWzAuLmktMV0rYWxpc3Rbal1baSsxLi5dOworICByZXR1cm4gYWxpc3Q7IC8qIG9yZGVyX2FsaXN0IGlzIE5PVCBuZWNlc3NhcnkgLSBzZWUgL2RvYy9MUEMvYWxpc3QgKi8KK30KKyNlbmRpZiAvLyBfX0FMSVNUU19fCisKKy8vICogR2VybWFuIHZlcnNpb24gb2YgY3RpbWUoKQorI2RlZmluZSBUQUdFICh7IlNvbiIsIk1vbiIsIkRpZSIsIk1pdCIsIkRvbiIsIkZyZSIsIlNhbSJ9KQorI2RlZmluZSBNT05BVEUgKHsiSmFuIiwiRmViIiwiTWFyIiwiQXByIiwiTWFpIiwiSnVuIiwiSnVsIiwiQXVnIixcCisgICAgICAgICAgICAgICAgICJTZXAiLCJPa3QiLCJOb3YiLCJEZXoifSkKK3N0cmluZyBkdGltZShpbnQgd2FubikgeworICAKKyAgaWYgKHdhbm4gPT0gZHRpbWVfY2FjaGVbMF0pCisgICAgcmV0dXJuKGR0aW1lX2NhY2hlWzFdKTsKKworICBpbnQgKmx0ID0gbG9jYWx0aW1lKHdhbm4pOworICByZXR1cm4gc3ByaW50ZigiJXMsICUyZC4gJXMgJWQsICUwMmQ6JTAyZDolMDJkIiwKKyAgICAgIFRBR0VbbHRbVE1fV0RBWV1dLCBsdFtUTV9NREFZXSwgTU9OQVRFW2x0W1RNX01PTl1dLCAKKyAgICAgIGx0W1RNX1lFQVJdLGx0W1RNX0hPVVJdLCBsdFtUTV9NSU5dLCBsdFtUTV9TRUNdKTsKK30KKworLy8gd2VubiBzdHJmdGltZSBpbSBEcml2ZXIgbmljaHQgZXhpc3RpZXJ0LCBpc3QgZGllcyBoaWVyIGVpbiBBbGlhcyBhdWYgZHRpbWUoKSwKKy8vIHp3YXIgc3RpbW10IGRhcyBGb3JtYXQgZGFubiBuaWNodCwgYWJlciBkaWUgTXVkbGliIGJ1Z2d0IG5pY2h0IHVuZCBzY2hyZWlidAorLy8gZWluIG9yZGVudGxpY2hlcyBEYXR1bS9VaHJ6ZWl0LgorI2lmICFfX0VGVU5fREVGSU5FRF9fKHN0cmZ0aW1lKQordmFyYXJncyBzdHJpbmcgc3RyZnRpbWUobWl4ZWQgZm10LCBpbnQgY2xvY2ssIGludCBsb2NhbGl6ZWQpIHsKKyAgaWYgKGludHAoY2xvY2spICYmIGNsb2NrID49IDApCisgICAgcmV0dXJuIGR0aW1lKGNsb2NrKTsKKyAgZWxzZSBpZiAoaW50cChmbXQpICYmIGZtdCA+PSAwKQorICAgIHJldHVybiBkdGltZShmbXQpOworICAKKyAgcmV0dXJuIGR0aW1lKHRpbWUoKSk7Cit9CisjZW5kaWYgLy8hX19FRlVOX0RFRklORURfXyhzdHJmdGltZSkKKworLy8gKiBTaHV0ZG93biBtaXQgenVzYWV0emxpY2hlbSBsb2dnaW5nCitub21hc2sgaW50IHNodXRkb3duKHN0cmluZyByZWFzb24pCit7CisgIHN0cmluZyBuYW1lOworICBzdHJpbmcgb2JuYW1lOworICBzdHJpbmcgb3V0cHV0OworCisgIGlmICghcmVhc29uKQorICAgIHJldHVybiAwOworICBpZiAoICFBUkNIX1NFQ1VSSVRZICYmIGdldHVpZChwcmV2aW91c19vYmplY3QoKSkhPVJPT1RJRCAmJgorICAgICAgICAgIG9iamVjdF9uYW1lKHByZXZpb3VzX29iamVjdCgpKSE9Ii9vYmovc2h1dCIgKQorICB7CisgICAgd3JpdGUoIllvdSBoYXZlIG5vIHBlcm1pc3Npb24gdG8gc2h1dCBkb3duIHRoZSBnYW1lZHJpdmVyIVxuIik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKCh0aGlzX2ludGVyYWN0aXZlKCkpJiYobmFtZT1nZXR1aWQodGhpc19pbnRlcmFjdGl2ZSgpKSkpCisgIHsKKyAgICBuYW1lPWNhcGl0YWxpemUobmFtZSk7CisgICAgZmlsdGVyKHVzZXJzKCksIyd0ZWxsX29iamVjdCwvLycKKyAgICAgICAgICAgICAgIGNhcGl0YWxpemUobmFtZSkrIiBmYWVocnQgZGFzIFNwaWVsIGhlcnVudGVyIVxuIik7CisgIH0KKyAgZWxzZQorICAgIG5hbWU9IkFOT05ZTU9VUyI7CisgIGlmIChwcmV2aW91c19vYmplY3QoKSkgb2JuYW1lPWNhcGl0YWxpemUoZ2V0dWlkKHByZXZpb3VzX29iamVjdCgpKSk7CisgIG91dHB1dD1uYW1lOworICBpZiAob2JuYW1lICYmIG5hbWUhPW9ibmFtZSkgb3V0cHV0PW91dHB1dCsiICgiK29ibmFtZSsiKSI7CisgIGlmIChwcmV2aW91c19vYmplY3QoKSYmb2JqZWN0X25hbWUocHJldmlvdXNfb2JqZWN0KCkpPT0iL29iai9zaHV0Iil7CisgICAgb3V0cHV0Kz0iIGZhZWhydCBkYXMgU3BpZWwgdmlhIEFybWFnZWRkb24gaGVydW50ZXIuXG4iOworICAgIG91dHB1dD1kdGltZSh0aW1lKCkpKyI6ICIrb3V0cHV0OworICAgIGxvZ19maWxlKCJHQU1FX0xPRyIsb3V0cHV0KyJcbiIsLTEpOworICAgIGVmdW46OnNodXRkb3duKCk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgb3V0cHV0PWN0aW1lKHRpbWUoKSkrIjogIitvdXRwdXQrIiBmYWVocnQgZGFzIFNwaWVsIGhlcnVudGVyLlxuIjsKKyAgb3V0cHV0Kz0iICAgIEdydW5kOiAiK3JlYXNvbjsKKyAgbG9nX2ZpbGUoIkdBTUVfTE9HIixvdXRwdXQrIlxuIiwtMSk7CisgIGVmdW46OnNodXRkb3duKCk7CisgIHJldHVybiAxOworfQorCisvLyAqIGxvd2VyY2hhcgorCitpbnQgbG93ZXJjaGFyKGludCBjaGFyKSB7CisgIGlmIChjaGFyPCdBJyB8fCBjaGFyPidaJykgcmV0dXJuIGNoYXI7CisgIHJldHVybiBjaGFyKzMyOworfQorCisvLyAqIHVwcGVyc3RyaW5nCisKK3N0cmluZyB1cHBlcnN0cmluZyhzdHJpbmcgcykKK3sKKyNpZiBfX0VGVU5fREVGSU5FRF9fKHVwcGVyX2Nhc2UpCisgIHJldHVybih1cHBlcl9jYXNlKHMpKTsKKyNlbHNlCisgIGludCBpOworICBpZiAoIXN0cmluZ3AocykpIHJldHVybiAwOworICBmb3IgKGk9c2l6ZW9mKHMpLTE7aT49MDtpLS0pIHNbaV09KChzW2ldPCdhJ3x8c1tpXT4neicpP3NbaV06c1tpXS0zMik7CisgIHJldHVybiBzOworI2VuZGlmCit9CisKKy8vICogbG93ZXJzdHJpbmcKKworc3RyaW5nIGxvd2Vyc3RyaW5nKHN0cmluZyBzKQoreworICBpZiAoIXN0cmluZ3AocykpIHJldHVybiAwOworICByZXR1cm4gbG93ZXJfY2FzZShzKTsKK30KKworCisvLyAqIEdEIHZlcnNpb24KK3N0cmluZyB2ZXJzaW9uKCkKK3sKKyAgcmV0dXJuIF9fVkVSU0lPTl9fOworfQorCisvLyAqIGJyZWFrX3N0cmluZworLy8gc3RyZXRjaCgpIC0tIHN0cmV0Y2ggYSBsaW5lIHRvIGZpbGwgYSBnaXZlbiB3aWR0aCAKK3ByaXZhdGUgc3RyaW5nIHN0cmV0Y2goc3RyaW5nIHMsIGludCB3aWR0aCkgeworICBpbnQgbGVuPXNpemVvZihzKTsKKyAgaWYgKGxlbj09d2lkdGgpIHJldHVybiBzOworCisgIC8vIHJlaW5lIExlZXJ6ZWlsZW4sIGRpcmVrdCB6dXJ1ZWNrZ2ViZW4KKyAgc3RyaW5nIHRyaW1tZWQ9dHJpbShzLFRSSU1fTEVGVCwiICIpOworICBpZiAodHJpbW1lZD09IiIpIHJldHVybiBzOyAKKyAgaW50IHN0YXJ0X3NwYWNlcyA9IGxlbiAtIHNpemVvZih0cmltbWVkKTsKKworICBzdHJpbmcqIHdvcmRzID0gZXhwbG9kZSh0cmltbWVkLCAiICIpOworICAvLyBkZXIgbGV0enRlIGtyaWVndCBrZWluZSBTcGFjZXMKKyAgaW50IHdvcmRfY291bnQ9c2l6ZW9mKHdvcmRzKSAtIDE7CisgIC8vIHdlbm4gWmVpbGUgbnVyIGF1cyBlaW5lbSBXb3J0LCB3aXJkIGRhcyBXb3J0IHp1cnVlY2tnZWdlYmVuCisgIGlmICghd29yZF9jb3VudCkKKyAgICByZXR1cm4gIiAiKnN0YXJ0X3NwYWNlcyArIHdvcmRzWzBdOworCisgIGludCBzcGFjZV9jb3VudCA9IHdpZHRoIC0gbGVuOworCisgIGludCBzcGFjZV9wZXJfd29yZD0od29yZF9jb3VudCtzcGFjZV9jb3VudCkgLyB3b3JkX2NvdW50OworICAvLyBBbnouV29lcnRlciBtaXQgWnVzYXR6LVNwYWNlCisgIGludCByZXN0PSh3b3JkX2NvdW50K3NwYWNlX2NvdW50KSAlIHdvcmRfY291bnQ7IAorICAvLyBSZXN0LVNwYWNlcyBWZXJ0ZWlsZW4KKyAgZm9yZWFjaCAoaW50IHBvcyA6IHJlc3QpIHdvcmRzW3Bvc10rPSIgIjsKKyAgcmV0dXJuICgiICIqc3RhcnRfc3BhY2VzKSArIGltcGxvZGUoIHdvcmRzLCAiICIqc3BhY2VfcGVyX3dvcmQgKTsKK30KKworLy8gYXVzIEdlc2Nod2luZGlna2VpdHNncnVlbmRlbiBoYXQgZGVyIEJsb2Nrc2F0eiBmdWVyIGJyZWFrX3N0cmluZyBlaW5lCisvLyBlaWdlbmUgRnVua3Rpb24gYmVrb21tZW46Citwcml2YXRlIHZhcmFyZ3Mgc3RyaW5nIGJsb2NrX3N0cmluZyhzdHJpbmcgcywgaW50IHdpZHRoLCBpbnQgZmxhZ3MpIHsKKyAgLy8gd2VubiBCU19MRUFWRV9NWV9MRlMsIGFiZXIga2VpbiBCU19OT19QQVJJTkRFTlQsIGRhbm4gd2VyZGVuIFplaWxlbiBtaXQKKyAgLy8gZWluZW0gTGVlcnplaWNoZW4gYmVnb25uZW4uCisgIC8vIEJUVzogV2VubiAhQlNfTEVBVkVfTVlfTEZTLCBoYXQgZGVyIEF1ZnJ1ZmVyIGJlcmVpdHMgYWxsZSBcbiBkdXJjaCAiICIKKyAgLy8gZXJzZXR6dC4KKyAgaWYgKCAoZmxhZ3MgJiBCU19MRUFWRV9NWV9MRlMpCisgICAgICAmJiAhKGZsYWdzICYgQlNfTk9fUEFSSU5ERU5UKSkKKyAgeworICAgICAgcyA9ICIgIityZWdyZXBsYWNlKHMsIlxuIiwiXG4gIiwxKTsKKyAgfQorCisgIC8vIHNwcmludGYgZnVlbGx0IGRpZSBsZXR6dGUgWmVpbGUgYXVmIGRpZSBGZWxkYnJlaXRlIChoaWVyIGFsc28KKyAgLy8gWmVpbGVuYnJlaXRlKSBtaXQgRnVlbGx6ZWljaGVuIGF1Ziwgd2VubiBzaWUgTklDSFQgbWl0IFxuIHVtZ2Vicm9jaGVuCisgIC8vIGlzdC4gRXMgd2lyZCBhbiBkaWUgbGV0enRlIFplaWxlIGFiZXIga2VpbiBaZWlsZW51bWJydWNoIGFuZ2VoYWVuZ3QuCisgIC8vIEVpZ2VudGxpY2ggaXN0IGRhcyBBdWZmdWVsbGVuIGRvb2YsIGFiZXIgdmVybXV0bGljaCBpc3QgZXMgdW5ub2V0aWcsIGVzCisgIC8vIHdpZWRlciBydWVja2dhZW5naWcgenUgbWFjaGVuLgorICBzID0gc3ByaW50ZiggIiUtKj1zIiwgd2lkdGgsIHMpOworCisgIHN0cmluZyAqdG1wPWV4cGxvZGUocywgIlxuIik7CisgIC8vIE51ciB3ZW5uIHMgbWVocnplaWxpZyBpc3QsIEJsb2Nrc2F0eiBkcmF1cyBtYWNoZW4uIERpZSBsZXR6dGUgWmVpbGUgd2lyZAorICAvLyBuYXR1ZXJsaWNoIG5pY2h0IGdlZGVobnQuIFNpZSBpc3QgZGFmdWVyIHNjaG9uIHZvbiBzcHJpbnRmKCkgYXVmZ2VmdWVsbHQKKyAgLy8gd29yZGVuLiBCVFc6IERpZSBsZXR6dGUgWmVpbGUgZW5kZXQgdS5VLiBub2NoIG5pY2h0IG1pdCBlaW5lbSBcbiAoYnp3LgorICAvLyBudXIgZGFubiwgd2VubiBCU19MRUFWRV9NWV9MRlMgdW5kIGRlciB1ZWJlcmdlYmVuZSBUZXh0IHNjaG9uIG5lbiBcbiBhbQorICAvLyBFbmRlIGRlciBsZXR6dGVuIFplaWxlIGhhdCksIGRhcyBtYWNodCBkZXIgQXVmcnVmZXIuLi4KKyAgaWYgKHNpemVvZih0bXApID4gMSkKKyAgICByZXR1cm4gaW1wbG9kZSggbWFwKCB0bXBbMC4uPDJdLCAjJ3N0cmV0Y2gvKicqLywgd2lkdGggKSwgIlxuIiApIAorICAgICAgKyAiXG4iICsgdG1wWzwxXTsKKworICByZXR1cm4gczsKK30KKworcHVibGljIHZhcmFyZ3Mgc3RyaW5nIGJyZWFrX3N0cmluZyhzdHJpbmcgcywgaW50IHcsIG1peGVkIGluZGVudCwgaW50IGZsYWdzKQoreworICAgIGlmICggIXMgfHwgcyA9PSAiIiApIHJldHVybiAiIjsKKworICAgIGlmICggIXcgKSB3PTc4OworCisgICAgaWYoIGludHAoaW5kZW50KSApCisgICAgICAgaW5kZW50ID0gaW5kZW50ID8gIiAiKmluZGVudCA6ICIiOworCisgICAgaW50IGluZGVudGxlbj1zdHJpbmdwKGluZGVudCkgPyBzaXplb2YoaW5kZW50KSA6IDA7CisKKyAgICBpZiAoaW5kZW50bGVuPncpIHsKKyAgICAgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CisgICAgICByYWlzZV9lcnJvcihzcHJpbnRmKCJicmVha19zdHJpbmc6IGluZGVudCBsb25nZXIgJWQgdGhhbiB3aWR0aCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgIGluZGVudGxlbix3KSk7CisgICAgICAvLyB3PSgoaW5kZW50bGVuL3cpKzEpKnc7CisgICAgfQorCisgICAgaWYgKCEoZmxhZ3MgJiBCU19MRUFWRV9NWV9MRlMpKSAKKyAgICAgIHM9cmVncmVwbGFjZSggcywgIlxuIiwgIiAiLCAxICk7CisKKyAgICBpZiAoIGZsYWdzICYgQlNfU0lOR0xFX1NQQUNFICkKKyAgICAgICBzID0gcmVncmVwbGFjZSggcywgIihefFxufCApICAqIiwgIlxcMSIsIDEgKTsKKyAKKyAgICBzdHJpbmcgcHJlZml4PSIiOworICAgIGlmIChpbmRlbnRsZW4gJiYgZmxhZ3MgJiBCU19QUkVQRU5EX0lOREVOVCkgeworICAgICAgaWYgKGluZGVudGxlbitzaXplb2YocykgPiB3IHx8IAorICAgICAgICAgKGZsYWdzICYgQlNfTEVBVkVfTVlfTEZTKSAmJiBzdHJzdHIocywiXG4iKT4tMSkgeworICAgICAgIHByZWZpeD1pbmRlbnQrIlxuIjsKKyAgICAgICBpbmRlbnQ9KGZsYWdzICYgQlNfTk9fUEFSSU5ERU5UKSA/ICIiIDogIiAiOworICAgICAgIGluZGVudGxlbj1zaXplb2YoaW5kZW50KTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIGZsYWdzICYgQlNfQkxPQ0sgKSB7CisgICAgICAvKgorICAgICAgICAgICBzID0gaW1wbG9kZSggbWFwKCBleHBsb2RlKCBzLCAiXG4iICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIydibG9ja19zdHJpbmcsIHcsIGluZGVudGxlbiwgZmxhZ3MpLAorICAgICAgICAgICAgICAgICAgICAgICIiICk7CisgICAgICAqLworICAgICAgcyA9IGJsb2NrX3N0cmluZyggcyAsIHcgLSBpbmRlbnRsZW4sIGZsYWdzICk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgcyA9IHNwcmludGYoIiUtMS4qPXMiLHctaW5kZW50bGVuLHMpOworICAgIH0KKyAgICBpZiAoIHNbPDFdICE9ICdcbicgKSBzICs9ICJcbiI7CisKKyAgICBpZiAoICFpbmRlbnRsZW4gKSByZXR1cm4gcHJlZml4ICsgczsKKyAgICAKKyAgICBzdHJpbmcgaW5kZW50MiA9ICggZmxhZ3MgJiBCU19JTkRFTlRfT05DRSApID8gKCIgIippbmRlbnRsZW4pIDppbmRlbnQ7CisgICAgICAKKyAgICByZXR1cm4gcHJlZml4ICsgaW5kZW50ICsgCisgICAgICByZWdyZXBsYWNlKCBzWzAuLjwyXSwgIlxuIiwgIlxuIitpbmRlbnQyLCAxICkgKyAiXG4iOworICAgICAgLyoKKyAgICAgICBzdHJpbmcgKmJ1ZjsKKworICAgICAgIGJ1ZiA9IGV4cGxvZGUoIHMsICJcbiIgKTsKKyAgICAgICByZXR1cm4gcHJlZml4ICsgaW5kZW50ICsgaW1wbG9kZSggYnVmWzAuLjwyXSwgIlxuIitpbmRlbnQyICkgKyBidWZbPDFdICsgIlxuIjsKKyAgICAgICovCit9CisKKy8vICogRWxlbWVudGUgYXVzIG1hcHBpbmcgbG9lc2NoZW4gLSBtYXBwaW5nIHZvcmhlciBrb3BpZXJlbgorCittYXBwaW5nIG1fY29weV9kZWxldGUobWFwcGluZyBtLCBtaXhlZCBrZXkpIHsKKyAgcmV0dXJuIG1fZGVsZXRlKGNvcHkobSksIGtleSk7Cit9CisKKy8vICogdGltZXMKK2ludCBsYXN0X3JlYm9vdF90aW1lKCkKK3sKKyAgcmV0dXJuIF9fQk9PVF9USU1FX187Cit9CisKK2ludCBmaXJzdF9ib290X3RpbWUoKQoreworICByZXR1cm4gNzAxNTE3NjAwOworfQorCitpbnQgZXhpc3RfZGF5cygpCit7CisgIHJldHVybiAoKCh0aW1lKCktZmlyc3RfYm9vdF90aW1lKCkpLzg2NDApKzUpLzEwOworfQorCisvLyAqIHVwdGltZSA6KQorc3RyaW5nIHVwdGltZSgpCit7CisgIGludCB0OworICBpbnQgdG1wOworICBzdHJpbmcgczsKKworICB0PXRpbWUoKS1fX0JPT1RfVElNRV9fOworICBzPSIiOworICBpZiAodD49ODY0MDApCisgICAgcys9c3ByaW50ZigiJWQgVGFnJXMsICIsdG1wPXQvODY0MDAsKHRtcD09MT8iIjoiZSIpKTsKKyAgaWYgKHQ+PTM2MDApCisgICAgcys9c3ByaW50ZigiJWQgU3R1bmRlJXMsICIsdG1wPSh0PXQlODY0MDApLzM2MDAsKHRtcD09MT8iIjoibiIpKTsKKyAgaWYgKHQ+NjApCisgICAgcys9c3ByaW50ZigiJWQgTWludXRlJXMgdW5kICIsdG1wPSh0PXQlMzYwMCkvNjAsKHRtcD09MT8iIjoibiIpKTsKKyAgcmV0dXJuIHMrc3ByaW50ZigiJWQgU2VrdW5kZSVzIix0PXQlNjAsKHQ9PTE/IiI6Im4iKSk7Cit9CisKKy8vICogV2FzIHR1biBiZWkgJ2RhbmdsaW5nJyBsZnVuLWNsb3N1cmVzID8KK3ZvaWQgZGFuZ2xpbmdfbGZ1bl9jbG9zdXJlKCkgeworICByYWlzZV9lcnJvcigiZGFuZ2xpbmcgbGZ1biBjbG9zdXJlXG4iKTsKK30KKworLy8gKiBTcGVycmVuIGF1c3NlciBmdWVyIG1hc3Rlci9zaW11bF9lZnVuCisKKyNpZiBfX0VGVU5fREVGSU5FRF9fKHNldF9lbnZpcm9ubWVudCkKK25vbWFzayB2b2lkIHNldF9lbnZpcm9ubWVudChvYmplY3QgbzEsIG9iamVjdCBvMikgeworICByYWlzZV9lcnJvcigiQXZhaWxhYmxlIG9ubHkgZm9yIHJvb3RcbiIpOworfQorI2VuZGlmCisKK25vbWFzayB2b2lkIHNldF90aGlzX3BsYXllcihvYmplY3QgcGwpIHsKKyAgcmFpc2VfZXJyb3IoIkF2YWlsYWJsZSBvbmx5IGZvciByb290XG4iKTsKK30KKworI2lmIF9fRUZVTl9ERUZJTkVEX18oZXhwb3J0X3VpZCkKK25vbWFzayB2b2lkIGV4cG9ydF91aWQob2JqZWN0IG9iKSB7CisgIHJhaXNlX2Vycm9yKCJBdmFpbGFibGUgb25seSBmb3Igcm9vdFxuIik7Cit9CisjZW5kaWYKKworLy8gKiBKZXR6dCBhdWNoIGNsb3N1cmVzCitpbnQgcHJvY2Vzc19mbGFnOworCitwdWJsaWMgbm9tYXNrIGludCBwcm9jZXNzX2NhbGwoKQoreworICBpZiAocHJvY2Vzc19mbGFnPjApCisgICAgcmV0dXJuIHByb2Nlc3NfZmxhZzsKKyAgZWxzZSByZXR1cm4oMCk7Cit9CisKK3ByaXZhdGUgbm9tYXNrIHN0cmluZyBfcHJvY2Vzc19zdHJpbmcoc3RyaW5nIHN0cixvYmplY3QgcG8pIHsKKyAgICAgICAgICAgICAgc2V0X3RoaXNfb2JqZWN0KHBvKTsKKyAgICAgICAgICAgICAgcmV0dXJuKGVmdW46OnByb2Nlc3Nfc3RyaW5nKHN0cikpOworfQorCitub21hc2sgc3RyaW5nIHByb2Nlc3Nfc3RyaW5nKCBtaXhlZCBzdHIgKQoreworICBzdHJpbmcgdG1wLCBlcnI7CisgIGludCBmbGFnOyAKKworICBpZiAoIGNsb3N1cmVwKHN0cikgKSB7CisgICAgICBzZXRfdGhpc19vYmplY3QoIHByZXZpb3VzX29iamVjdCgpICk7CisgICAgICByZXR1cm4gZnVuY2FsbChzdHIpOworICB9CisgIGVsc2UgaWYgKHN0cj09MCkKKyAgICAgIHJldHVybigoc3RyaW5nKXN0cik7CisgIGVsc2UgaWYgKCAhc3RyaW5ncChzdHIpICkgeworICAgICAgcmV0dXJuIHRvX3N0cmluZyhzdHIpOworICB9CisKKyAgaWYgKCAhKGZsYWcgPSBwcm9jZXNzX2ZsYWcgPiB0aW1lKCkgLSA2MCkpICAgICAgICAgICAgICAgICAgICAgCisgICAgICBwcm9jZXNzX2ZsYWc9dGltZSgpOworCisgIGVyciA9IGNhdGNoKHRtcCA9IGZ1bmNhbGwoIydfcHJvY2Vzc19zdHJpbmcsc3RyLHByZXZpb3VzX29iamVjdCgpKTsgcHVibGlzaCk7CisKKyAgaWYgKCAhZmxhZyApCisgICAgcHJvY2Vzc19mbGFnPTA7CisKKyAgaWYgKGVycikgeworICAgIC8vIFZlcmFyYmVpdHVuZyBhYmJyZWNoZW4KKyAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOworICAgIHJhaXNlX2Vycm9yKGVycik7CisgIH0KKyAgcmV0dXJuIHRtcDsKK30KKworLy8gJ21rZGlyIC1wJyAtIGVyemV1Z3QgZWluZSBrb21wbGV0dGUgSGllcmFyY2hpZSB2b24gVmVyemVpY2huaXNzZW4uCisvLyB3ZW5uIGRhcyBWZXJ6ZWljaG5pcyBhbmdlbGVndCB3dXJkZSBvZGVyIHNjaG9uIGV4aXN0aWVydCwgd2lyZCAxCisvLyB6dXJ1ZWNrZ2VsaWVmZXJ0LCBzb25zdCAwLgorLy8gV2lyZnQgZWluZW4gRmVobGVyLCB3ZW5uIGRhcyBhbmdlYmVuZSBWZXJ6ZWljaG5pcyBuaWNodCBhYnNvbHV0IGlzdCEKK3B1YmxpYyBpbnQgbWtkaXJwKHN0cmluZyBkaXIpIHsKKyAgLy8gd2VubiBlcyBudXIga2VpbmVuIGZ1ZWhyZW5kZW4gLyBnaWJ0LCBpc3QgZGFzIGVpbiBGZWhsZXIuCisgIGlmIChzdHJzdHIoZGlyLCAiLyIpICE9IDApCisgICAgcmFpc2VfZXJyb3IoIm1rZGlycCgpOiBQZmFkIGlzdCBuaWNodCBhYnNvbHV0ZS5cbiIpOworICAvLyBjdXQgb2ZmIHRyYWlsaW5nIC8uLi4KKyAgaWYgKGRpcls8MV09PScvJykKKyAgICAgIGRpciA9IGRpclswLi48Ml07CisKKyAgaW50IGZzdGF0ID0gZmlsZV9zaXplKGRpcik7CisgIC8vIHdlbm4gZXMgc2Nob24gZXhpc3RpZXJ0LCB0dW4gd2lyIGVpbmZhY2ggc28sIGFscyBoYWV0dGVuIHdpciBlcyBhbmdlbGVndC4KKyAgaWYgKGZzdGF0ID09IEZTSVpFX0RJUikKKyAgICByZXR1cm4gMTsKKyAgLy8gd2VubiBzY2hvbiBuZSBEYXRlaSBleGlzdGllcnQsIGdlaHQgZXMgbmljaHQuCisgIGlmIChmc3RhdCAhPSBGU0laRV9OT0ZJTEUpCisgICAgcmV0dXJuIDA7CisgIC8vIHdlbm4gZXMgbnVyIGVpbmVuIC8gZ2lidCAoZGVuIGZ1ZWhyZW5kZW4pLCBkYW5uIGlzdCBlcyBlaW4KKyAgLy8gdG9wbGV2ZWwtdmVyemVpY2huaXMsIHdhcyBkaXJla3QgYW5nZWxlZ3Qgd2lyZC4KKyAgaWYgKHN0cnJzdHIoZGlyLCIvIik9PTApIHsKKyAgICByZXR1cm4gZnVuY2FsbChiaW5kX2xhbWJkYSgjJ2VmdW46Om1rZGlyLCBwcmV2aW91c19vYmplY3QoKSksIGRpcik7CisgIH0KKworICAvLyBta2RpcigpIG5pY2h0IGRpcmVrdCBydWZlbiwgc29uZGVybiB2b3JoZXIgYWxzIGNsb3N1cmUgYW5zIGF1ZnJ1ZmVuZGUKKyAgLy8gT2JqZWt0IGJpbmRlbi4gU29uc3QgbGFldWZ0IGRpZSBSZWNodGVwcnVlZnVuZyBpbiB2YWxpZF93cml0ZSgpIGltIE1hc3RlcgorICAvLyB1bnRlciBkZXIgQW5uYWhtZSwgZGFzcyBkaWUgc2ltdWxfZWZ1bi5jIG1pdCBpaHJlciByb290IGlkIHdhcyB3aWxsLgorCisgIC8vIGpldHp0IHJla3Vyc2l2IGRpZSBWZXJ6ZWljaG5pc2hpZXJhcmNoaWUgYW5sZWdlbi4gV2VubiBkYXMgZXJmb2xncmVpY2gKKyAgLy8gaXN0LCBkYW5uIGtvZW5uZW4gd2lyIGpldHp0IG1pdCBta2RpciBkYXMgdGllZnN0ZSBWZXJ6ZWljaG5pcyBhbmxlZ2VuCisgIGlmIChta2RpcnAoZGlyWzAuLnN0cnJzdHIoZGlyLCIvIiktMV0pID09IDEpCisgICAgcmV0dXJuIGZ1bmNhbGwoYmluZF9sYW1iZGEoIydlZnVuOjpta2RpciwgcHJldmlvdXNfb2JqZWN0KCkpLCBkaXIpOworfQorCisKKy8vICogUHJvcGVydGllcyBnZ2ZzLiBtaXRzcGVpY2hlcm4KK21peGVkIHNhdmVfb2JqZWN0KG1peGVkIG5hbWUpCit7CisgIG1hcHBpbmcgcHJvcGVydGllczsKKyAgbWFwcGluZyBzYXZlOworICBtaXhlZCBpbmRleCwgcmVzOworICBpbnQgaTsKKworICAvLyBudXIgU3RyaW5ncyB1bmQgMCB6dWxhc3NlbgorICBpZiAoKCFzdHJpbmdwKG5hbWUpIHx8ICFzaXplb2YobmFtZSkpICYmIAorICAgICAgKCFpbnRwKG5hbWUpIHx8IG5hbWUhPTApKSB7CisgICAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOworICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigKKyAgICAgICAgICJPbmx5IG5vbi1lbXB0eSBzdHJpbmdzIGFuZCAwIG1heSBiZSB1c2VkIGFzIGZpbGVuYW1lIGluICIKKyAgICAgICAgICJzZWZ1bjo6c2F2ZV9vYmplY3QoKSEgQXJndW1lbnQgd2FzICVPXG4iLG5hbWUpKTsKKyAgfQorCisgIHNhdmUgPSBtX2FsbG9jYXRlKDAsIDIpOworICBwcm9wZXJ0aWVzID0gKG1hcHBpbmcpcHJldmlvdXNfb2JqZWN0KCktPlF1ZXJ5UHJvcGVydGllcygpOworCisgIGlmKG1hcHBpbmdwKHByb3BlcnRpZXMpKQorICB7CisgICAgLy8gZGVsZXRlIGFsbCBlbnRyaWVzIGluIG1hcHBpbmcgcHJvcGVydGllcyB3aXRob3V0IFNBVkUgZmxhZyEKKyAgICBpbmRleCA9IG1faW5kaWNlcyhwcm9wZXJ0aWVzKTsKKyAgICBmb3IoaSA9IHNpemVvZihpbmRleCktMTsgaT49MDtpLS0pCisgICAgeworICAgICAgaWYocHJvcGVydGllc1tpbmRleFtpXSwgRl9NT0RFXSAmIFNBVkUpCisgICAgICB7CisgICAgICAgc2F2ZVtpbmRleFtpXV0gPSBwcm9wZXJ0aWVzW2luZGV4W2ldXTsKKyAgICAgICBzYXZlW2luZGV4W2ldLCBGX01PREVdID0KKyAgICAgICBwcm9wZXJ0aWVzW2luZGV4W2ldLCBGX01PREVdICYKKyAgICAgICAgICAgICAgICAgICAgKH4oU0VUTU5PVEZPVU5EfFFVRVJZTU5PVEZPVU5EfFFVRVJZQ0FDSEVEfFNFVENBQ0hFRCkpOworICAgICAgfQorICAgIH0KKyAgfQorICBlbHNlIHNhdmUgPSAoW10pOworCisgIC8vIHNhdmUgb2JqZWN0IQorICBwcmV2aW91c19vYmplY3QoKS0+X3NldF9zYXZlX2RhdGEoc2F2ZSk7CisgIC8vIGZvcm1hdDogd2llIGRlZmluaWVydCBpbiBjb25maWcuaAorICBpZiAoc3RyaW5ncChuYW1lKSkKKyAgICByZXMgPSBmdW5jYWxsKGJpbmRfbGFtYmRhKCMnZWZ1bjo6c2F2ZV9vYmplY3QsIHByZXZpb3VzX29iamVjdCgpKSwgbmFtZSwKKyAgICAgICBfX0xJQl9fU0FWRV9GT1JNQVRfVkVSU0lPTl9fKTsKKyAgZWxzZQorICAgIHJlcyA9IGZ1bmNhbGwoYmluZF9sYW1iZGEoIydlZnVuOjpzYXZlX29iamVjdCwgcHJldmlvdXNfb2JqZWN0KCkpLAorICAgICAgIF9fTElCX19TQVZFX0ZPUk1BVF9WRVJTSU9OX18pOworICBwcmV2aW91c19vYmplY3QoKS0+X3NldF9zYXZlX2RhdGEoMCk7CisKKyNpZmRlZiBJT1NUQVRTCisgIC8vIFN0YXRzLi4uCisgIHN0cnVjdCBpb3N0YXRfcyBzdGF0ID0gKDxpb3N0YXRfcz4pOworICBzdGF0LT5vbmFtZSA9IG9iamVjdF9uYW1lKHByZXZpb3VzX29iamVjdCgpKTsKKyAgc3RhdC0+dGltZSA9IHRpbWUoKTsKKyAgLy9zdGF0LT5zaXplID0gKGludClvYmplY3RfaW5mbyhwcmV2aW91c19vYmplY3QoKSxPSU5GT19NRU1PUlksCisgIC8vICAgIE9JTV9UT1RBTF9EQVRBX1NJWkUpOworICBpZiAoc3RyaW5ncChuYW1lKSkKKyAgICAgIHN0YXQtPnNpemUgPSBmaWxlX3NpemUobmFtZSArICIubyIpOworICBlbHNlCisgICAgICBzdGF0LT5zaXplb2YocmVzKTsKKyAgLy9kZWJ1Z19tZXNzYWdlKCJzYXZlbzogIitzYXZlb19zdGF0WzBdKyJcbiIpOworICBzYXZlb19zdGF0WzFdW3NhdmVvX3N0YXRbMF1dID0gc3RhdDsKKyAgc2F2ZW9fc3RhdFswXSA9IChzYXZlb19zdGF0WzBdICsgMSkgJSBzaXplb2Yoc2F2ZW9fc3RhdFsxXSk7CisgIC8vZGVidWdfbWVzc2FnZSgic2F2ZW8gMjogIitzYXZlb19zdGF0WzBdKyJcbiIpOworI2VuZGlmCisKKyAgcmV0dXJuIHJlczsKK30KKworLy8gKiBBdWNoIFByb3BlcnRpZXMgbGFkZW4KK2ludCByZXN0b3JlX29iamVjdChzdHJpbmcgbmFtZSkKK3sKKyAgaW50IHJlc3VsdDsKKyAgbWl4ZWQgaW5kZXg7CisgIG1peGVkIHNhdmU7CisgIG1hcHBpbmcgcHJvcGVydGllczsKKyAgaW50IGk7CisgIGNsb3N1cmUgY2w7CisKKyAgLy8gZ2V0IGFjdHVhbCBwcm9wZXJ0eSBzZXR0aW5ncyAoYnkgY3JlYXRlKCkpCisgIHByb3BlcnRpZXMgPSAobWFwcGluZylwcmV2aW91c19vYmplY3QoKS0+UXVlcnlQcm9wZXJ0aWVzKCk7CisKKy8vICBERUJVRyhzcHJpbnRmKCJSRVNUT1JFICVPXG4iLG5hbWUpKTsKKyAgLy8gcmVzdG9yZSBvYmplY3QKKyAgcmVzdWx0PWZ1bmNhbGwoYmluZF9sYW1iZGEoIydlZnVuOjpyZXN0b3JlX29iamVjdCwgcHJldmlvdXNfb2JqZWN0KCkpLCBuYW1lKTsKKyAgLy8nKSkKKyAgLy9fZ2V0X3NhdmVfZGF0YSBsaWVmZXJ0IHRhdHNhZWNobGljaCBtaXhlZCB6dXJ1ZWNrLCB3ZW5uIGRhcyBhdWNoIGltbWVyIGVpbiAKKyAgLy9tYXBwaW5nIHNlaW4gc29sbHRlLgorICBzYXZlID0gKG1peGVkKXByZXZpb3VzX29iamVjdCgpLT5fZ2V0X3NhdmVfZGF0YSgpOworICBpZihtYXBwaW5ncChzYXZlKSkKKyAgeworICAgIGluZGV4ID0gbV9pbmRpY2VzKHNhdmUpOworICAgIGZvcihpID0gc2l6ZW9mKGluZGV4KS0xOyBpPj0wOyBpLS0pCisgICAgeworICAgICAgcHJvcGVydGllc1tpbmRleFtpXV0gPSBzYXZlW2luZGV4W2ldXTsKKyAgICAgIHByb3BlcnRpZXNbaW5kZXhbaV0sIEZfTU9ERV0gPSBzYXZlW2luZGV4W2ldLCBGX01PREVdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJn4oU0VUQ0FDSEVEfFFVRVJZQ0FDSEVEKTsKKyAgICB9CisgIH0KKyAgZWxzZSBwcm9wZXJ0aWVzID0gKFtdKTsKKworICAvLyByZXN0b3JlIHByb3BlcnRpZXMKKyAgZnVuY2FsbCgKKyAgICAgICAgICBiaW5kX2xhbWJkYSgKKyAgICAgICAgICAgICAgICAgICAgIHVuYm91bmRfbGFtYmRhKCh7J2FyZ30pLCAvLyd9KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh7IydjYWxsX290aGVyLCh7Iyd0aGlzX29iamVjdH0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZXRQcm9wZXJ0aWVzIiwnYXJnfSkpLC8vJykKKyAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzX29iamVjdCgpKSxwcm9wZXJ0aWVzKTsKKyAgcHJldmlvdXNfb2JqZWN0KCktPl9zZXRfc2F2ZV9kYXRhKDApOworCisjaWZkZWYgSU9TVEFUUworICAvLyBTdGF0cy4uLgorICAvL2RlYnVnX21lc3NhZ2UoInJlc3RvcmVvOiAiK3Jlc3RvcmVvX3N0YXRbMF0rIlxuIik7CisgIHN0cnVjdCBpb3N0YXRfcyBzdGF0ID0gKDxpb3N0YXRfcz4pOworICBzdGF0LT5vbmFtZSA9IG9iamVjdF9uYW1lKHByZXZpb3VzX29iamVjdCgpKTsKKyAgc3RhdC0+dGltZSA9IHRpbWUoKTsKKyAgLy9zdGF0LT5zaXplID0gKGludClvYmplY3RfaW5mbyhwcmV2aW91c19vYmplY3QoKSxPSU5GT19NRU1PUlksCisgIC8vICAgIE9JTV9UT1RBTF9EQVRBX1NJWkUpOworICBzdGF0LT5zaXplID0gZmlsZV9zaXplKG5hbWUgKyAiLm8iKTsKKyAgcmVzdG9yZW9fc3RhdFsxXVtyZXN0b3Jlb19zdGF0WzBdXSA9IHN0YXQ7CisKKyAgcmVzdG9yZW9fc3RhdFswXSA9IChyZXN0b3Jlb19zdGF0WzBdICsgMSkgJSBzaXplb2YocmVzdG9yZW9fc3RhdFsxXSk7CisjZW5kaWYKKworICByZXR1cm4gcmVzdWx0OworfQorCisvLyAqIEhCIGVpbmVzIE9iamVrdGVzIGVpbi9hdXNzY2hhbHRlbgoraW50IHNldF9vYmplY3RfaGVhcnRfYmVhdChvYmplY3Qgb2IsIGludCBmbGFnKQoreworICBpZiAob2JqZWN0cChvYikpCisgICAgcmV0dXJuIGZ1bmNhbGwoYmluZF9sYW1iZGEoIydlZnVuOjpjb25maWd1cmVfb2JqZWN0LG9iKSwgb2IsIE9DX0hFQVJUX0JFQVQsIGZsYWcpOworfQorCisvLyAqIE1hZ2llcmxldmVsZ3J1cHBlbiBlcm1pdHRlbG4KK2ludCBxdWVyeV93aXpfZ3JwKG1peGVkIHdpeikKK3sKKyAgaW50IGxldjsKKworICBsZXY9cXVlcnlfd2l6X2xldmVsKHdpeik7CisgIGlmIChsZXY8U0VFUl9MVkwpIHJldHVybiAwOworICBpZiAobGV2Pj1HT0RfTFZMKSByZXR1cm4gbGV2OworICBpZiAobGV2Pj1BUkNIX0xWTCkgcmV0dXJuIEFSQ0hfR1JQOworICBpZiAobGV2Pj1FTERFUl9MVkwpIHJldHVybiBFTERFUl9HUlA7CisgIGlmIChsZXY+PUxPUkRfTFZMKSByZXR1cm4gTE9SRF9HUlA7CisgIGlmIChsZXY+PVNQRUNJQUxfTFZMKSByZXR1cm4gU1BFQ0lBTF9HUlA7CisgIGlmIChsZXY+PURPTUFJTk1FTUJFUl9MVkwpIHJldHVybiBET01BSU5NRU1CRVJfR1JQOworICBpZiAobGV2Pj1XSVpBUkRfTFZMKSByZXR1cm4gV0laQVJEX0dSUDsKKyAgaWYgKGxldj49TEVBUk5FUl9MVkwpIHJldHVybiBMRUFSTkVSX0dSUDsKKyAgcmV0dXJuIFNFRVJfR1JQOworfQorCittaXhlZCAqd2l6bGlzdF9pbmZvKCkKK3sKKyAgaWYgKEFSQ0hfU0VDVVJJVFkgfHwgIWV4dGVybl9jYWxsKCkpCisgICAgICAgICAgICByZXR1cm4gZWZ1bjo6d2l6bGlzdF9pbmZvKCk7CisgIHJldHVybiAwOworfQorCisvLyAqIHdpemxpc3QgYXVzZ2ViZW4KK3ZhcmFyZ3Mgdm9pZCB3aXpsaXN0KHN0cmluZyBuYW1lLCBpbnQgc29ydGtleSApIHsKKworICBpZiAoIW5hbWUpCisgIHsKKyAgICBpZiAodGhpc19wbGF5ZXIoKSkKKyAgICAgIG5hbWUgPSBnZXR1aWQodGhpc19wbGF5ZXIoKSk7CisgICAgaWYgKCFuYW1lKQorICAgICAgcmV0dXJuOworICB9CisKKyAgLy8gU2NobHVlc3NlbCBkYXJmIG51ciBpbiBlaW5lbSBndWVsdGlnZW4gQmVyZWljaCBzZWluCisgIGlmIChzb3J0a2V5PFdMX05BTUUgfHwgc29ydGtleT49V0xfU0laRSkgc29ydGtleT1XTF9DT1NUOworCisgIG1peGVkKiogd2wgPSBlZnVuOjp3aXpsaXN0X2luZm8oKTsKKyAgLy8gbmFjaCA8c29ydGtleT4gc29ydGllcmVuCisgIHdsID0gc29ydF9hcnJheSh3bCwgZnVuY3Rpb24gaW50IChtaXhlZCBhLCBtaXhlZCBiKQorICAgICAge3JldHVybiBhW3NvcnRrZXldIDwgYltzb3J0a2V5XTsgfSApOworCisgIC8vIFN1bW1lIHVlYmVyIGFsbGUgS29tbWFuZG9zIGVybWl0dGVsbi4KKyAgaW50IHRvdGFsX2NtZCwgaTsKKyAgaW50IHBvcz0tMTsKKyAgZm9yZWFjaChtaXhlZCBlbnRyeSA6IHdsKQorICB7CisgICAgdG90YWxfY21kICs9IGVudHJ5W1dMX0NPTU1BTkRTXTsKKyAgICBpZiAoZW50cnlbV0xfTkFNRV0gPT0gbmFtZSkKKyAgICAgIHBvcyA9IGk7CisgICAgKytpOworICB9CisKKyAgaWYgKHBvcyA8IDAgJiYgbmFtZSAhPSAiQUxMIiAmJiBuYW1lICE9ICJUT1AxMDAiKQorICAgIHJldHVybjsKKworICBpZiAobmFtZSA9PSAiVE9QMTAwIikKKyAgeworICAgIGlmIChzaXplb2Yod2wpID4gMTAwKQorICAgICAgd2wgPSB3bFswLi4xMDBdOworICAgIGVsc2UKKyAgICAgIHdsID0gd2w7CisgIH0KKyAgLy8gdW0gbmFtZSBoZXJ1bSBzY2huZWlkZW4KKyAgZWxzZSBpZiAobmFtZSAhPSAiQUxMIikKKyAgeworICAgIGlmIChzaXplb2Yod2wpIDw9IDIxKQorICAgICAgd2wgPSB3bDsKKyAgICBlbHNlIGlmIChwb3MgKyAxMCA8IHNpemVvZih3bCkgJiYgcG9zIC0gMTAgPiAwKQorICAgICAgd2wgPSB3bFtwb3MtMTAuLnBvcysxMF07CisgICAgZWxzZSBpZiAocG9zIDw9MjEpCisgICAgICB3bCA9IHdsWzAuLjIwXTsKKyAgICBlbHNlIGlmIChwb3MgPj0gc2l6ZW9mKHdsKSAtIDIxKQorICAgICAgd2wgPSB3bFs8MjEuLl07CisgICAgZWxzZQorICAgICAgd2wgPSB3bDsKKyAgfQorCisgIHdyaXRlKCJcbldpemFyZCB0b3Agc2NvcmUgbGlzdFxuXG4iKTsKKyAgaWYgKHRvdGFsX2NtZCA9PSAwKQorICAgIHRvdGFsX2NtZCA9IDE7CisgIHByaW50ZigiJS0yMHMgJS02cyAlLTNzICUtMTdzICUtNnMgJS02cyAlLTZzXG4iLAorICAgICAgICAgIkVVSUQiLCAiY21kcyIsICIlIiwgIkNvc3RzIiwgIkhCIiwgIkFycmF5cyIsIk1hcHAuIik7CisgIGZvcmVhY2gobWl4ZWQgZTogd2wpCisgIHsKKyAgICBwcmludGYoIiUtOjIwcyAlOjZkICU6MmQlJSBbJTo2ZGssJTo2ZEddICU6NmQgJTo2ZCAlOjZkXG4iLAorICAgICAgICAgIGVbV0xfTkFNRV0sIGVbV0xfQ09NTUFORFNdLCBlW1dMX0NPTU1BTkRTXSAqIDEwMCAvIHRvdGFsX2NtZCwKKyAgICAgICAgICBlW1dMX0NPU1RdIC8gMTAwMCwgZVtXTF9UT1RBTF9HSUdBQ09TVF0sCisgICAgICAgICAgZVtXTF9IRUFSVF9CRUFUU10sIGVbV0xfQVJSQVlfVE9UQUxdLCBlW1dMX01BUFBJTkdfVE9UQUxdCisgICAgICAgICAgKTsKKyAgfQorICBwcmludGYoIlxuVG90YWwgICAgICAgICAlN2QgICAgICAgICAoJWQpXG5cbiIsIHRvdGFsX2NtZCwgc2l6ZW9mKHdsKSk7Cit9CisKKworLy8gQWIgaGllciBmb2xnZW4gSGlsZnNmdW5rdGlvbmVuIGZ1ZXIgY2FsbF9vdXQoKSBiencuIGZ1ZXIgZGVyZW4gQmVncmVuenVuZworCisvLyBlcm1pdHRlbHQgZGFzIE9iamVrdCBkZXMgQ2FsbG91dHMuCitwcml2YXRlIG9iamVjdCBfY2FsbF9vdXRfb2JqKCBtaXhlZCBjYWxsX291dCApIHsKKyAgICByZXR1cm4gcG9pbnRlcnAoY2FsbF9vdXQpID8gY2FsbF9vdXRbMF0gOiAwOworfQorCitwcml2YXRlIHZvaWQgX3NhbWVfb2JqZWN0KCBvYmplY3Qgb2IsIG1hcHBpbmcgbSApIHsKKyAgLy8gaXN0IG5pY2h0IHNvIGJsb2VkLCB3aWUgZXMgYXVzc2llaHQsIHMuIG5hY2hmb2xnZWRlIFZlcndlbmR1bmcgdm9uIG0KKyAgaWYgKCBtW29iXSApCisgICAgbVtvYl0gKz0gKHsgb2IgfSk7CisgIGVsc2UKKyAgICBtW29iXSA9ICh7IG9iIH0pOyAKK30KKworLy8gYWxsZSBPYmpla3RlIGltIE1hcHBpbmcgbSB6dXNhbW1lbmZhc3NlbiwgZGllIGRlbiBnbGVpY2hlbiBMb2FkbmFtZSAoTmFtZSBkZXIKKy8vIEJsdWVwcmludCkgaGFiZW4sIGFsc28gYWxsZSBDbG9uZXMgZGVyIEJQLCBkaWUgQ2FsbG91dHMgbGF1ZmVuIGhhYmVuLgorLy8gT2JqZWt0ZSB3ZXJkZW4gYXVjaCBtZWhyZmFjaCBlcmZhc3N0LCBqZSBuYWNoIEFuemFobCBpaHJlciBDYWxsb3V0cy4KK3ByaXZhdGUgdm9pZCBfc2FtZV9wYXRoKCBvYmplY3Qga2V5LCBvYmplY3QgKm9icywgbWFwcGluZyBtICkgeworICBzdHJpbmcgcGF0aDsKKyAgaWYgKCFvYmplY3RwKGtleSkgfHwgIXBvaW50ZXJwKG9icykpIHJldHVybjsKKworICBwYXRoID0gbG9hZF9uYW1lKGtleSk7CisKKyAgaWYgKCBtW3BhdGhdICkKKyAgICBtW3BhdGhdICs9IG9iczsKKyAgZWxzZQorICAgIG1bcGF0aF0gPSBvYnM7Cit9CisKKy8vIGtleSBrYW5uIG9iamVjdCBvZGVyIHN0cmluZyBzZWluLgorcHJpdmF0ZSBpbnQgX3Rvb19tYW55KCBtaXhlZCBrZXksIG1hcHBpbmcgbSwgaW50IGkgKSB7CisgICAgcmV0dXJuIHNpemVvZihtW2tleV0pID49IGk7Cit9CisKKy8vIGFsbGUgT2JqZWt0ZSBpbiBvYnMgemVyc3RvZXJlbiB1bmQgRmVobGVybWVsZHVuZyBhdXNnZWJlbi4gQUNIVFVORzogRGllCisvLyBPYmpla3RlIHdlcmRlbiBpZFIgenUgZWluZXIgQlAgZ2Vob2VyZW4sIG11ZXNzZW4gYWJlciBuaWNodCEgSW4gZGVtIEZhbGwKKy8vIHdpcmQgYXVmIGRlciBFYmVuZSBhYmVyIG51ciBlaW4gT2JqZWt0IGluIGRlciBGZWhsZXJtZWxkdW5nIGVyd2FlaG50LgorcHJpdmF0ZSB2b2lkIF9kZXN0cm95KCBtaXhlZCBrZXksIG9iamVjdCAqb2JzLCBzdHJpbmcgdGV4dCwgaW50IHVpZCApIHsKKyAgICBpZiAoIXBvaW50ZXJwKG9icykpIHJldHVybjsKKyAgICAvLyBBcnJheSBtaXQgdW5pcXVlIEVpbnRyYWVnZSBlcnpldWdlbi4KKyAgICBvYnMgPSBtX2luZGljZXMoIG1rbWFwcGluZyhvYnMpICk7CisgICAgLy8gRmVobGVybWVsZHVuZyBhdWYgZGVyIEViZW5lIGF1c2dlYmVuLCBpbSBjYXRjaCgpIG1pdCBwdWJsaXNoLCBkYW1pdCBlcworICAgIC8vIGF1ZiBkZXIgRWJlbmUgZGlyZWt0IHNjcm9sbHQsIGRlciBiYWNrdHJhY2UgdmVyZnVlZ2JhciBpc3QgKGltCisgICAgLy8gZ2VnZW5zYXR6IHp1ciBMb2VzdW5nIG1pdHRlbHMgQ2FsbG91dCksIGRpZSBBdXNmdWVocnVuZyBhYmVyIHdlaXRlcgorICAgIC8vIGxhZXVmdC4KKyAgICBjYXRjaCggZWZ1bjo6cmFpc2VfZXJyb3IoICAgICAgICAgICAKKyAgICAgICAgIHNwcmludGYoIHRleHQsICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICB1aWQgPyAoc3RyaW5nKW1hc3RlcigpLT5jcmVhdG9yX2ZpbGUoa2V5KSA6IGtleSwgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgIHNpemVvZihvYnMpLCBvYmplY3RfbmFtZShvYnNbPDFdKSApICk7cHVibGlzaCk7CisgICAgLy8gVW5kIHdlZyBtaXQgZGVtIEtyYW0uLi4KKyAgICBmaWx0ZXIoIG9icywgIydlZnVuOjpkZXN0cnVjdC8qJyovICk7Cit9CisKKy8vIEFsbGUgT2JqZWt0IGVpbmVyIFVJRCBpbSBNYXBwaW5nIG0gbWl0IFVJRCBhbHMgS0V5cyB6dXNhbW1lbmZhc3Nlbi4gT2JqZWt0CisvLyBzaW5kIGRhYmVpIG5pY2h0IHVuaXF1ZS4KK3ByaXZhdGUgdm9pZCBfc2FtZV91aWQoIHN0cmluZyBrZXksIG9iamVjdCAqb2JzLCBtYXBwaW5nIG0sIGNsb3N1cmUgY2YgKSB7CisgIHN0cmluZyB1aWQ7CisKKyAgaWYgKCAhcG9pbnRlcnAob2JzKSB8fCAhc2l6ZW9mKG9icykgKQorICAgIHJldHVybjsKKworICB1aWQgPSBmdW5jYWxsKCBjZiwga2V5ICk7CisKKyAgaWYgKCBtW3VpZF0gKQorICAgIG1bdWlkXSArPSBvYnM7IC8vIG9icyBpc3QgbmVuIEFycmF5CisgIGVsc2UKKyAgICBtW3VpZF0gPSBvYnM7Cit9CisKK3ByaXZhdGUgaW50IF9sb2dfY2FsbF9vdXQobWl4ZWQgY28pCit7CisgIGxvZ19maWxlKCJUT09fTUFOWV9DQUxMT1VUUyIsCisgICAgICBzcHJpbnRmKCIlczo6JU8gKCVkKVxuIixvYmplY3RfbmFtZShjb1swXSksY29bMV0sY29bMl0pLAorICAgICAgMjAwMDAwKTsKKyAgcmV0dXJuIDA7Cit9CisKK3ByaXZhdGUgaW50IGxhc3RfY2FsbG91dF9sb2c9MDsKKworbm9tYXNrIHZhcmFyZ3Mgdm9pZCBjYWxsX291dCggdmFyYXJncyBtaXhlZCAqYXJncyApCit7CisgICAgbWl4ZWQgdG1wLCAqY2FsbF9vdXRzOworCisgICAgLy8gQmVpID42MDAgQ2FsbG91dHMgYWxsZSBPYmpla3RlIGtpbGxlbiwgZGllIG1laHIgYWxzIDMwIENhbGxvdXRzIGxhdWZlbgorICAgIC8vIGhhYmVuLgorICAgIGlmICggZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0NBTExPVVRTKSA+IDYwMAorICAgICAgICAmJiBnZXRldWlkKHByZXZpb3VzX29iamVjdCgpKSAhPSBST09USUQgKQorICAgIHsKKyAgICAgICAvLyBMb2cgZXJ6ZXVnZW4uLi4KKyAgICAgICBpZiAobGFzdF9jYWxsb3V0X2xvZyA8CisgICAgICAgICAgIGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9IRUFSVEJFQVRfVE9UQUxfQ1lDTEVTKSAtIDEwCisgICAgICAgICAgICYmIGdldF9ldmFsX2Nvc3QoKSA+IDIwMDAwMCkKKyAgICAgICB7CisgICAgICAgICBsYXN0X2NhbGxvdXRfbG9nID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0hFQVJUQkVBVF9UT1RBTF9DWUNMRVMpOworICAgICAgICAgbG9nX2ZpbGUoIlRPT19NQU5ZX0NBTExPVVRTIiwKKyAgICAgICAgICAgICBzcHJpbnRmKCJcbiVzOiAjIyMjIyMjIyMjIyMgVG9vIG1hbnkgY2FsbG91dHM6ICVkICMjIyMjIyMjIyMjIyMjXG4iLAorICAgICAgICAgICAgICAgICAgICAgc3RyZnRpbWUoIiV5JW0lZC0lSCVNJVMiKSwKKyAgICAgICAgICAgICAgICAgICAgIGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9DQUxMT1VUUykpKTsKKyAgICAgICAgIGZpbHRlcihlZnVuOjpjYWxsX291dF9pbmZvKCksICMnX2xvZ19jYWxsX291dCk7CisgICAgICAgfQorICAgICAgIC8vIE9iamVrdGUgYWxsZXIgQ2FsbG91dHMgZXJtaXR0ZWxuCisgICAgICAgY2FsbF9vdXRzID0gbWFwKCBlZnVuOjpjYWxsX291dF9pbmZvKCksICMnX2NhbGxfb3V0X29iaiApOworICAgICAgIG1hcHBpbmcgb2JqZWN0bWFwID0gKFtdKTsKKyAgICAgICBmaWx0ZXIoIGNhbGxfb3V0cywgIydfc2FtZV9vYmplY3QsICZvYmplY3RtYXAgKTsKKyAgICAgICAvLyBNYXN0ZXIgbmljaHQgZ3JpbGxlbi4uLgorICAgICAgIGVmdW46Om1fZGVsZXRlKCBvYmplY3RtYXAsIG1hc3RlcigxKSApOworICAgICAgIC8vIGFsbGUgT2JqZWt0ZSByYXVzc3VjaGVuLCBkaWUgenV2aWVsZSBoYWJlbi4uLgorICAgICAgIG1hcHBpbmcgcmVzID0gZmlsdGVyX2luZGljZXMoIG9iamVjdG1hcCwgIydfdG9vX21hbnksIG9iamVjdG1hcCwgMjkgKTsKKyAgICAgICAvLyB1bmQgdWViZXIgYWxsZSBLZXlzIGdlaGVuLCBhbiBfZGVzdHJveSgpIHdlcmRlbiBLZXkgdW5kIEFycmF5IG1pdAorICAgICAgIC8vIE9iamVrdGVuIHVlYmVyZ2ViZW4gKGluIGRpZXNlbSBGYWxsIHNpbmQgS2V5cyB1bmQgQXJyYXkgbWl0CisgICAgICAgLy8gT2JqZWt0ZW4gamV3ZWlscyBkYXMgZ2xlaWNoZSBPYmpla3QpLgorICAgICAgIGlmICggc2l6ZW9mKHJlcykgKSAgICAgICAKKyAgICAgICAgICAgd2Fsa19tYXBwaW5nKHJlcywgIydfZGVzdHJveSwgIkNBTExfT1VUIG92ZXJmbG93IGJ5IHNpbmdsZSAiICAgICAgICAgICAgIAorICAgICAgICAgICAgICAib2JqZWN0IFslT10uIERlc3RydWN0ZWQgJWQgb2JqZWN0cy4gWyVzXVxuIiwgMCApOworCisgICAgICAgLy8gQmVpIChhdWNoIG5hY2ggZGVtIGVyc3RlbiBBdWZyYWV1bWVuIG5vY2gpID44MDAgQ2FsbG91dHMgYWxsZQorICAgICAgIC8vIE9iamVrdGUga2lsbGVuLCBkaWUgbWVociBhbHMgNTAgQ2FsbG91dHMgbGF1ZmVuIGhhYmVuIC0gdW5kCisgICAgICAgLy8gZGllc21hbCB6YWVobGVuIENsb25lcyBuaWNodCBlaWdlbnN0YWVuZGlnISBELmguIGVzIHdlcmRlbiBhbGxlCisgICAgICAgLy8gQ2xvbmVzIGVpbmVyIEJQIGdla2lsbHQsIGRpZSBDYWxsb3V0cyBsYXVmZW4gaGFiZW4sIGZhbGxzIGFsbGUKKyAgICAgICAvLyBkaWVzZSBPYmpla3RlIF96dXNhbW1lbl8gbWVociBhbHMgNTAgQ2FsbG91dHMgaGFiZW4hCisgICAgICAgaWYgKCBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fQ0FMTE9VVFMpID4gODAwICkgeworICAgICAgICAgICAvLyB6ZXJzdG9lcnRlIE9iamVrdGUgdm9uIGRlciBsZXR6dGVuIEFrdGlvbiBzaW5kIGluIG9iamVjdG1hcCBuaWNodAorICAgICAgICAgICAvLyBtZWhyIGRyaW4sIGRhIHNpZSBkb3J0IGFscyBLZXlzIHZlcndlbmRldCB3dXJkZW4uCisgICAgICAgICAgIG1hcHBpbmcgcGF0aG1hcD0oW10pOworICAgICAgICAgICAvLyBhbGxlIE9iamVrdCBlaW5lciBCUCBpbiByZXMgc29ydGllcmVuLCBCUC1OYW1lIGFscyBLZXksIEFycmF5cworICAgICAgICAgICAvLyB2b24gT2JqZWt0ZW4gYWxzIFdlcnRlLgorICAgICAgICAgICB3YWxrX21hcHBpbmcoIG9iamVjdG1hcCwgIydfc2FtZV9wYXRoLCAmcGF0aG1hcCk7CisgICAgICAgICAgIC8vIGFsbGUgQlBzICh1bmQgaWhyZSBPYmpla3RlKSByYXVzc3VjaGVuLCBkaWUgenV2aWVsZSBoYWJlbi4uLgorICAgICAgICAgICByZXMgPSBmaWx0ZXJfaW5kaWNlcyggcGF0aG1hcCwgIydfdG9vX21hbnkvKicqLywgcGF0aG1hcCwgNTAgKTsKKyAgICAgICAgICAgLy8gdW5kIHVlYmVyIGFsbGUgS2V5cyBnZWhlbiwgYW4gX2Rlc3Ryb3koKSB3ZXJkZW4gZGllIENsb25lcworICAgICAgICAgICAvLyB1ZWJlcmdlYmVuLCBkaWUgQ2FsbG91dHMgaGFiZW4uCisgICAgICAgICAgIGlmICggc2l6ZW9mKHJlcykgKQorICAgICAgICAgICAgICB3YWxrX21hcHBpbmcoIHJlcywgIydfZGVzdHJveS8qJyovLCAiQ0FMTF9PVVQgb3ZlcmZsb3cgYnkgZmlsZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiJyVzJy4gRGVzdHJ1Y3RlZCAlZCBvYmplY3RzLiBbJXNdXG4iLCAwICk7CisKKyAgICAgICAgICAgLy8gV2VubiBiZWlkZSBBdWZyYWV1bWFyYmVpdGVuIG5pY2h0cyBnZWJyYWNodCBoYWJlbiB1bmQgaW1tZXIKKyAgICAgICAgICAgLy8gbm9jaCA+MTAwMCBDYWxsb3V0cyBsYXVmZW4sIHdlcmRlbiBkaWVzbWFsIGFsbGUgQ2FsbG91dHMKKyAgICAgICAgICAgLy8gZWluZXIgVUlEIHp1c2FtbWVuZ2V6YWVobHQuCisgICAgICAgICAgIC8vIEFsbGUgT2JqZWt0ZSBlaW5lciBVSUQsIGRpZSBlcyBpbiBTdW1tZSBhbGxlciBpaHJlciBPYmpla3QgbWl0CisgICAgICAgICAgIC8vIENhbGxvdXRzIGF1ZiBtZWhyIGFscyAxMDAgQ2FsbG91dHMgYnJpbmd0LCB3ZXJkZW4gZ2Vyb2VzdGV0LgorICAgICAgICAgICBpZiAoZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0NBTExPVVRTKSA+IDEwMDApCisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLy8gZGFzIG5hY2ggQlAtTmFtZW4gdm9yZ2VmaWx0ZXJ0ZSBNYXBwaW5nIGpldHp0IG5hY2ggVUlEcworICAgICAgICAgICAgICAvLyB6dXNhbW1lbnNvcnRpZXJlbi4gWmVyc3RvZXJ0ZSBDbG9uZXMgZmlsdGVyIF9zYW1lX3VpZCgpCisgICAgICAgICAgICAgIC8vIHJhdXMuCisgICAgICAgICAgICAgIG1hcHBpbmcgdWlkbWFwPShbXSk7CisgICAgICAgICAgICAgIHdhbGtfbWFwcGluZyggcGF0aG1hcCwgIydfc2FtZV91aWQsICZ1aWRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2xfZnVuY3Rpb24oICJjcmVhdG9yX2ZpbGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9zZWN1cmUvbWFzdGVyIiApICk7CisgICAgICAgICAgICAgIC8vIEluIHJlcyBudW4gVUlEcyBhbHMgS2V5cyB1bmQgQXJyYXlzIHZvbiBPYmpla3RlbiBhbHMgV2VydGUuCisgICAgICAgICAgICAgIC8vIERpZSByYXVzZmlsdGVybiwgZGllIG1laHIgYWxzIDEwMCBPYmpla3RlIChub24tdW5pcXVlLCBkLmguCisgICAgICAgICAgICAgIC8vIDEwMCBDYWxsb3V0cyEpIGhhYmVuLgorICAgICAgICAgICAgICByZXMgPSBmaWx0ZXJfaW5kaWNlcyggdWlkbWFwLCAjJ190b29fbWFueSwgdWlkbWFwLCAxMDAgKTsKKyAgICAgICAgICAgICAgLy8gdW5kIGVybmV1dCB1ZWJlciBkaWUgS2V5cyBsYXVmZW4gdW5kIGpld2VpbHMgZGllIEFycmF5cyBtaXQKKyAgICAgICAgICAgICAgLy8gZGVuIE9iamVrdGVuIHp1ciBaZXJzdG9lcnVuZyBhbiBfZGVzdHJveSgpLi4uCisgICAgICAgICAgICAgIGlmICggc2l6ZW9mKHJlcykgKQorICAgICAgICAgICAgICAgICAgd2Fsa19tYXBwaW5nKCByZXMsICMnX2Rlc3Ryb3ksICJDQUxMX09VVCBvdmVyZmxvdyBieSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVUlEICclcycuIERlc3RydWN0ZWQgJWQgb2JqZWN0cy4gWyVzXVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgKTsKKyAgICAgICAgICAgfQorICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBGYWxscyBkYXMgYXVmcnVmZW5kZSBPYmpla3QgemVyc3RvZXJ0IHd1cmRlIGJlaW0gQXVmcmFldW1lbgorICAgIGlmICggIXByZXZpb3VzX29iamVjdCgpICkKKyAgICAgICByZXR1cm47CisKKyAgICBzZXRfdGhpc19vYmplY3QoIHByZXZpb3VzX29iamVjdCgpICk7CisgICAgYXBwbHkoICMnZWZ1bjo6Y2FsbF9vdXQsIGFyZ3MgKTsKKyAgICByZXR1cm47Cit9CisKK21peGVkIGNhbGxfb3V0X2luZm8oKSB7CisgIAorICBvYmplY3QgcG8gPSBwcmV2aW91c19vYmplY3QoKTsKKyAgbWl4ZWQgY29pID0gZWZ1bjo6Y2FsbF9vdXRfaW5mbygpOworCisgIC8vIHVuZ2VmaWx0ZXJ0ZW4gT3V0cHV0IG51ciBmdWVyIGJlc3RpbW10ZSBPYmpla3RlLCBPYmpla3RlIGluIC9zdGQgb2RlcgorICAvLyAvb2JqIGhhYmVuIGRpZSBCYWNrYm9uZUlELgorICBpZiAocXVlcnlfd2l6X2xldmVsKGdldHVpZChwbykpID49IEFSQ0hfTFZMCisgICAgICAgfHwgKHN0cmluZyltYXN0ZXIoKS0+Y3JlYXRvcl9maWxlKGxvYWRfbmFtZShwbykpID09IEJBQ0tCT05FSUQgKSB7CisgICAgICByZXR1cm4gY29pOworICB9CisgIGVsc2UgeworICAgICAgcmV0dXJuIGZpbHRlcihjb2ksIGZ1bmN0aW9uIG1peGVkIChtaXhlZCBhcnIpIHsKKyAgICAgICAgICAgICAgaWYgKHBvaW50ZXJwKGFycikgJiYgYXJyWzBdPT1wbykKKyAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgIGVsc2UgcmV0dXJuIDA7IH0pOworICB9Cit9CisKKy8vICogWnUgZWluZXIgY2xvc3VyZSBkYXMgT2JqZWt0LCBhbiBkYXMgc2llIGdlYnVuZGVuIGlzdCwgc3VjaGVuCisvLyBOSUNIVCBkYXMgT2JqZWt0LCB3YXMgZ2dmLiBkaWUgbGZ1biBkZWZpbmllcnQhCittaXhlZCBxdWVyeV9jbG9zdXJlX29iamVjdChjbG9zdXJlIGMpIHsKKyAgcmV0dXJuCisgICAgQ0xPU1VSRV9JU19VTkJPVU5EX0xBTUJEQShnZXRfdHlwZV9pbmZvKGMsIDEpKSA/CisgICAgICAwIDoKKyAgKHRvX29iamVjdChjKSB8fCAtMSk7Cit9CisKKy8vICogV2lyIHdvbGxlbiBudXIgRUlOIEFyZ3VtZW50IC4uLiBhdXNzZXJkZW0gY2hlY2tzIGZ1ZXIgZGVuIE5ldHp0b3RlbnJhdW0KK3ZhcmFyZ3Mgdm9pZCBtb3ZlX29iamVjdChtaXhlZCB3aGF0LCBtaXhlZCB3aGVyZSkKK3sKKyAgb2JqZWN0IHBvLHRtcDsKKworICBwbz1wcmV2aW91c19vYmplY3QoKTsKKyAgaWYgKCF3aGVyZSkKKyAgeworICAgIHdoZXJlPXdoYXQ7CisgICAgd2hhdD1wbzsKKyAgfQorICBpZiAoKChzdHJpbmdwKHdoZXJlKSAmJiB3aGVyZT09TkVUREVBRF9ST09NICkgfHwKKyAgICAgICAob2JqZWN0cCh3aGVyZSkgJiYgd2hlcmU9PWZpbmRfb2JqZWN0KE5FVERFQURfUk9PTSkpKSAmJgorICAgICAgIG9iamVjdHAod2hhdCkgJiYgb2JqZWN0X25hbWUod2hhdCkhPSIvb2JqL3NwZXJyZXIiKQorICB7CisgICAgaWYgKCFxdWVyeV9vbmNlX2ludGVyYWN0aXZlKHdoYXQpKQorICAgIHsKKyAgICAgIHdoYXQtPnJlbW92ZSgpOworICAgICAgaWYgKHdoYXQpIGRlc3RydWN0KHdoYXQpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAobGl2aW5nKHdoYXQpIHx8IGludGVyYWN0aXZlKHdoYXQpKQorICAgIHsKKyAgICAgIGxvZ19maWxlKCJOREVBRDIiLHNwcmludGYoIlRSWUVEIFRPIE1PVkUgVE8gTkVUREVBRDogJU9cbiIsd2hhdCkpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzZXRfb2JqZWN0X2hlYXJ0X2JlYXQod2hhdCwwKTsKKyAgfQorICB0bXA9d2hhdDsKKyAgd2hpbGUgKHRtcD1lbnZpcm9ubWVudCh0bXApKQorICAgICAgLy8gSmEuIE1hbiBydWZ0IGRpZSBfc2V0X3h4eCgpLUZ1bmt0aW9uZW4gZWlnZW50bGljaCBuaWNodCBkaXJla3QgYXVmLgorICAgICAgLy8gQWJlciBkYXMgTGljaHRzeXN0ZW0gaXN0IHNjaG9uICpzbyogcmVjaGVuaW50ZW5zaXYgdW5kIGdlcmFkZSBkZXIKKyAgICAgIC8vIFBfTEFTVF9DT05URU5UX0NIQU5HRS1DYWNoZSB3aXJkICpzbyogb2Z0IGJlbm9ldGlndCwgZGFzcyBlcyBtaXIKKyAgICAgIC8vIGRhIHVtIGplZGVzIGJpc3NjaGVuIFJlY2hlbnplaXQgZ2VodC4KKyAgICAgIC8vIERlciBad2VjayBoZWlsaWd0IGphIGJla2FubnRsaWNoIGRpZSBNaXR0ZWwuIDstKQorICAgICAgLy8KKyAgICAgIC8vIFRpYW1haworICAgIHRtcC0+X3NldF9sYXN0X2NvbnRlbnRfY2hhbmdlKCk7CisgIGZ1bmNhbGwoYmluZF9sYW1iZGEoIydlZnVuOjptb3ZlX29iamVjdCxwbyksd2hhdCx3aGVyZSk7CisgIGlmICh0bXA9d2hhdCkKKyAgICB3aGlsZSAodG1wPWVudmlyb25tZW50KHRtcCkpCisgICAgICB0bXAtPl9zZXRfbGFzdF9jb250ZW50X2NoYW5nZSgpOworfQorCisKK3ZvaWQgc3RhcnRfc2ltdWxfZWZ1bigpIHsKKyAgbWl4ZWQgKmluZm87CisKKyAgLy8gRmFsbHMgbm9jaCBuaWNodCBnZXRhbiwgZXh0cmFfd2l6aW5mbyBpbml0aWFsaXNpZXJlbgorICBpZiAoICFwb2ludGVycChpbmZvID0gZ2V0X2V4dHJhX3dpemluZm8oMCkpICkKKyAgICBzZXRfZXh0cmFfd2l6aW5mbygwLCBpbmZvID0gYWxsb2NhdGUoQkFDS0JPTkVfV0laSU5GT19TSVpFKSk7CisKKyAgSW5pdExpdmluZ0RhdGEoaW5mbyk7CisKKyAgc2V0X25leHRfcmVzZXQoMTApOyAvLyBkaXJla3QgbWFsIGF1ZnJhZXVtZW4KK30KKworcHJvdGVjdGVkIHZvaWQgcmVzZXQoKSB7CisgIHNldF9uZXh0X3Jlc2V0KDcyMDApOworICBDbGVhbkxpdmluZ0RhdGEoKTsKK30KKworI2lmICFfX0VGVU5fREVGSU5FRF9fKGFic29sdXRlX2hiX2NvdW50KQoraW50IGFic29sdXRlX2hiX2NvdW50KCkgeworICByZXR1cm4gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0hFQVJUQkVBVF9UT1RBTF9DWUNMRVMpOworfQorI2VuZGlmCisKK3ZvaWQgX19zZXRfZW52aXJvbm1lbnQob2JqZWN0IG9iLCBtaXhlZCB0YXJnZXQpCit7CisgIHN0cmluZyBwYXRoOworICBvYmplY3Qgb2JqOworCisgIGlmICghb2JqZWN0cChvYikpCisgICAgcmV0dXJuOworICBpZiAoIUlTX0FSQ0goZ2V0ZXVpZChwcmV2aW91c19vYmplY3QoKSkpIHx8ICFBUkNIX1NFQ1VSSVRZICkKKyAgICByZXR1cm47CisgIGlmIChvYmplY3RwKHRhcmdldCkpCisgIHsKKyAgICBlZnVuOjpzZXRfZW52aXJvbm1lbnQob2IsdGFyZ2V0KTsKKyAgICByZXR1cm47CisgIH0KKyAgcGF0aD0oc3RyaW5nKU1BU1RFUi0+X2dldF9wYXRoKHRhcmdldCx0aGlzX2ludGVyYWN0aXZlKCkpOworICBpZiAoc3RyaW5ncChwYXRoKSAmJiBmaWxlX3NpemUocGF0aCsiLmMiKT49MCAmJgorICAgICAgIWNhdGNoKGxvYWRfb2JqZWN0KHBhdGgpO3B1Ymxpc2gpICkKKyAgeworICAgIG9iaj1maW5kX29iamVjdChwYXRoKTsKKyAgICBlZnVuOjpzZXRfZW52aXJvbm1lbnQob2Isb2JqKTsKKyAgICByZXR1cm47CisgIH0KK30KKwordm9pZCBfZHVtcF93aXpsaXN0KHN0cmluZyBmaWxlLCBpbnQgc29ydGJ5KSB7CisgIGludCBpOworICBtaXhlZCAqYTsKKworICBpZiAoIUxPUkRfU0VDVVJJVFkpCisgICAgcmV0dXJuOworICBpZiAoIW1hc3RlcigpLT52YWxpZF93cml0ZShmaWxlLGdldGV1aWQocHJldmlvdXNfb2JqZWN0KCkpLCJ3cml0ZV9maWxlIikpCisgIHsKKyAgICB3cml0ZSgiTk8gV1JJVEUgUEVSTUlTU0lPTlxuIik7CisgICAgcmV0dXJuOworICB9CisgIGEgPSB3aXpsaXN0X2luZm8oKTsKKyAgYSA9IHNvcnRfYXJyYXkoYSwgbGFtYmRhKCAoeydhLCdifSksCisgICAgICAgICAgICAgICAgICAgICAgICAoeyMnPCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHsjJ1ssJ2Esc29ydGJ5fSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICh7IydbLCdiLHNvcnRieX0pCisgICAgICAgICAgICAgICAgICAgICAgICAgfSkpKTsKKyAgcm0oZmlsZSk7CisgIGZvciAoaT1zaXplb2YoYSktMTtpPj0wO2ktLSkKKyAgICB3cml0ZV9maWxlKGZpbGUsc3ByaW50ZigiJS0xMXM6IGV2YWw9JS04ZCBjbWRzPSUtNmQgSEJzPSUtNWQgYXJyYXk9JS01ZCBtYXBwaW5nPSUtN2RcbiIsCisgICAgICBhW2ldW1dMX05BTUVdLGFbaV1bV0xfVE9UQUxfQ09TVF0sYVtpXVtXTF9DT01NQU5EU10sYVtpXVtXTF9IRUFSVF9CRUFUU10sCisgICAgICBhW2ldW1dMX0FSUkFZX1RPVEFMXSxhW2ldW1dMX0NBTExfT1VUXSkpOworfQorCitwdWJsaWMgdmFyYXJncyBvYmplY3QgZGVlcF9wcmVzZW50KG1peGVkIHdoYXQsIG9iamVjdCBvYikgeworCisgIGlmKCFvYmplY3RwKG9iKSkKKyAgICBvYj1wcmV2aW91c19vYmplY3QoKTsKKyAgLy8gV2VubiBlaW4gT2JqZWt0IGdlc3VjaHQgd2lyZDogQWxsZSBFbnZzIGRpZXNlcyBPYmpla3RzIGVybWl0dGVsbiB1bmQKKyAgLy8gc2NoYXVlbiwgb2IgaW4gZGllc2VuIG9iIHZvcmtvbW10LiBEYW5uIGlzdCB3aGF0IGluIG9iIGVudGhhbHRlbi4KKyAgaWYob2JqZWN0cCh3aGF0KSkgeworICAgIG9iamVjdCAqZW52cz1hbGxfZW52aXJvbm1lbnQod2hhdCk7CisgICAgLy8gd2VubiBvYiBrZWluIEVudmlyb25tZW50IGhhdCwgaXN0IGVzIG9mZmVuc2ljaHRsaWNoIG5pY2h0IGluIHdoYXQKKyAgICAvLyBlbnRoYWx0ZW4uCisgICAgaWYgKCFwb2ludGVycChlbnZzKSkgcmV0dXJuIDA7CisgICAgaWYgKG1lbWJlcihlbnZzLCBvYikgIT0gLTEpIHJldHVybiB3aGF0OworICB9CisgIC8vIHNvbnN0IHdpcmRzIHRldXJlciwgdWViZXIgYWxsZSBPYmpla3RlIGltIChkZWVwKSBJbnYgbGF1ZmVuIHVuZCBwZXIgaWQoKQorICAvLyB0ZXN0ZW4uIERhYmVpIG11c3MgYWJlciBkaWUgZ2V3dWVuc2NodGUgTnIuICgiZmxhc2NoZSAzIikgYWJnZXNjaG5pdHRlbgorICAvLyB3ZXJkZW4gdW5kIHNlbGJlciBnZXphZWhsdCB3ZXJkZW4sIHdlbGNoZSBkYXMgZW50c3ByZWNoZW5kZSBPYmpla3QgaXN0LgorICBlbHNlIGlmIChzdHJpbmdwKHdoYXQpKSB7CisgICAgICBpbnQgY250OworICAgICAgc3RyaW5nIG5ld3doYXQ7CisgICAgICBpZihzc2NhbmYod2hhdCwiJXMgJWQiLG5ld3doYXQsY250KSE9MikKKyAgICAgICBjbnQ9MTsKKyAgICAgIGVsc2UKKyAgICAgICB3aGF0PW5ld3doYXQ7CisgICAgICBmb3JlYWNoKG9iamVjdCBpbnZvYjogZGVlcF9pbnZlbnRvcnkob2IpKSB7CisgICAgICAgaWYgKGludm9iLT5pZCh3aGF0KSAmJiAhLS1jbnQpCisgICAgICAgICAgIHJldHVybiBpbnZvYjsKKyAgICAgIH0KKyAgfQorICBlbHNlIHsKKyAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOworICAgIHJhaXNlX2Vycm9yKHNwcmludGYoIldyb25nIGFyZ3VtZW50IDEgdG8gZGVlcF9wcmVzZW50KCkuICIKKyAgICAgICAgICJFeHBlY3RlZCBcIm9iamVjdFwiIG9yIFwic3RyaW5nXCIsIGdvdCAlLjUwTy5cbiIsCisgICAgICAgICB3aGF0KSk7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK21hcHBpbmcgZHVtcF9pcF9tYXBwaW5nKCkKK3sKKyAgcmV0dXJuIDA7Cit9CisKK25vbWFzayB2b2lkIHN3YXAob2JqZWN0IG9iaikKK3sKKyAgd3JpdGUoIllvdXIgYXJlIG5vdCBhbGxvd2VkIHRvIHN3YXAgb2JqZWN0cyBieSBoYW5kIVxuIik7CisgIHJldHVybjsKK30KKworbm9tYXNrIHZhcmFyZ3Mgdm9pZCBnYXJiYWdlX2NvbGxlY3Rpb24oc3RyaW5nIHN0cikKK3sKKyAgaWYocHJldmlvdXNfb2JqZWN0KCk9PTAgfHwgIUlTX0FSQ0goZ2V0ZXVpZChwcmV2aW91c19vYmplY3QoKSkpIAorICAgICAgfHwgIUFSQ0hfU0VDVVJJVFkpCisgIHsKKyAgICB3cml0ZSgiQ2FsbCBHQyBub3cgYW5kIHRoZSBtdWQgd2lsbCBjcmFzaCBpbiA1LTYgaG91cnMuIERPTlQgRE8gSVQhXG4iKTsKKyAgICByZXR1cm47CisgIH0KKyAgZWxzZSBpZiAoc3RyaW5ncChzdHIpKQorICB7CisgICAgcmV0dXJuIGVmdW46OmdhcmJhZ2VfY29sbGVjdGlvbihzdHIpOworICB9CisgIGVsc2UgCisgICAgcmV0dXJuIGVmdW46OmdhcmJhZ2VfY29sbGVjdGlvbigpOworfQorCit2YXJhcmdzIHZvaWQgbm90aWZ5X2ZhaWwobWl4ZWQgbmYsIGludCBwcmlvKSB7CisgIG9iamVjdCBwbyxvbGRvOworICBpbnQgb2xkcHJpbzsKKyAgCisgIGlmICghUEwgfHwgIW9iamVjdHAocG89cHJldmlvdXNfb2JqZWN0KCkpKSByZXR1cm47CisgIGlmICghc3RyaW5ncChuZikgJiYgIWNsb3N1cmVwKG5mKSkgeworICAgICAgc2V0X3RoaXNfb2JqZWN0KHBvKTsKKyAgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoCisgICAgICAgICAiT25seSBzdHJpbmdzIGFuZCBjbG9zdXJlcyBhbGxvd2VkIGZvciBub3RpZnlfZmFpbCEgIgorICAgICAgICAgIkFyZ3VtZW50IHdhczogJS41ME8uLi5cbiIsbmYpKTsKKyAgfQorCisgIC8vIGZhbGxzIGVpbiBPYmpla3QgYmVyZWl0cyBuZW4gbm90aWZ5X2ZhaWwoKSBzZXR6dGUsIFByaW9yaXRhZXRlbiBhYnNjaGFldHplbgorICAvLyB1bmQgdmVyZ2xlaWNoZW4uCisgIGlmIChvYmplY3RwKG9sZG89cXVlcnlfbm90aWZ5X2ZhaWwoMSkpICYmIHBvIT1vbGRvKSB7CisgICAgaWYgKCFwcmlvKSB7ICAgICAgIAorICAgICAgLy9Qcmlvcml0YWV0IGRpZXNlcyBub3RpZnlfZmFpbCgpICdhYnNjaGFldHplbicKKyAgICAgIGlmIChwbz09UEwpIC8vIFNwaWVsZXItaW50ZXJuZSAoc291bC1jbWRzKQorICAgICAgICBwcmlvPU5GX05MX09XTjsKKyAgICAgIGVsc2UgaWYgKGxpdmluZyhwbykpCisgICAgICAgIHByaW89TkZfTkxfTElWSU5HOworICAgICAgZWxzZSBpZiAoKGludClwby0+SXNSb29tKCkpCisgICAgICAgIHByaW89TkZfTkxfUk9PTTsKKyAgICAgIGVsc2UKKyAgICAgICAgcHJpbz1ORl9OTF9USElORzsKKyAgICB9CisgICAgLy9Qcmlvcml0YWV0IGRlcyBhbHRlbiBTZXR6ZXJzIGFic2NoYWV0emVuCisgICAgaWYgKG9sZG89PVBMKQorICAgICAgb2xkcHJpbz1ORl9OTF9PV047CisgICAgZWxzZSBpZiAobGl2aW5nKG9sZG8pKQorICAgICAgb2xkcHJpbz1ORl9OTF9MSVZJTkc7CisgICAgZWxzZSBpZiAoKGludClvbGRvLT5Jc1Jvb20oKSkKKyAgICAgIG9sZHByaW89TkZfTkxfUk9PTTsKKyAgICBlbHNlCisgICAgICBvbGRwcmlvPU5GX05MX1RISU5HOworICB9CisgIGVsc2UgLy8gd2VubiBlcyBub2NoIGtlaW4gTm90aWZ5X2ZhaWwgZ2lidDoKKyAgICBvbGRwcmlvPU5GX05MX05PTkU7CisKKyAgLy92ZXJnbGVpY2hlbiB1bmQgZ2dmLiBzZXR6ZW4KKyAgaWYgKHByaW8gPj0gb2xkcHJpbykgeyAKKyAgICBzZXRfdGhpc19vYmplY3QocG8pOworICAgIGVmdW46Om5vdGlmeV9mYWlsKG5mKTsKKyAgfQorCisgIHJldHVybjsKK30KKwordm9pZCBfbm90aWZ5X2ZhaWwoc3RyaW5nIHN0cikKK3sKKyAgLy9xdWVyeV9ub3RpZnlfZmFpbCgpIGJlbnV0emVuLCB1bSBkYXMgT2JqZWt0CisgIC8vZGVzIGxldHp0ZW4gbm90aWZ5X2ZhaWwoKSB6dSBlcm1pdHRlbG4KKyAgb2JqZWN0IG87CisgIGlmICgobz1xdWVyeV9ub3RpZnlfZmFpbCgxKSkgJiYgbyE9cHJldmlvdXNfb2JqZWN0KCkpCisgICAgcmV0dXJuOworICAvL25vY2gga2VpbiBub3RpZnlfZmFpbCgpIGZ1ZXIgZGllc2VzIEtvbW1hbmRvIGdlc2V0enQsIGF1ZiBnZWh0cy4KKyAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKKyAgZWZ1bjo6bm90aWZ5X2ZhaWwoc3RyKTsKKyAgcmV0dXJuOworfQorCitzdHJpbmcgdGltZTJzdHJpbmcoIHN0cmluZyBmb3JtYXQsIGludCB6ZWl0ICkKK3sKKyAgaW50IGksY2gsbWF4dW5pdCxkdW1teTsKKyAgc3RyaW5nICpwYXJ0cywgZm10OworCisgIGludCBzZWNzID0gemVpdDsKKyAgaW50IG1pbnMgPSAoemVpdC82MCk7CisgIGludCBob3VycyA9ICh6ZWl0LzM2MDApOworICBpbnQgZGF5cyA9ICh6ZWl0Lzg2NDAwKTsKKyAgaW50IHdlZWtzID0gICh6ZWl0LzYwNDgwMCk7CisgIGludCBtb250aHMgPSAoemVpdC8yNDE5MjAwKTsKKyAgaW50IGFiYnIgPSAwOworCisgIHBhcnRzID0gcmVnZXhwbG9kZSggZm9ybWF0LCAiXCglXCgtfFwpWzAtOV0qW253ZGhtc3hOV0RITVNYXVwpfFwoJSVcKSIgKTsKKworICBmb3IoIGk9MTsgaTxzaXplb2YocGFydHMpOyBpKz0yICkKKyAgeworICAgIGNoID0gcGFydHNbaV1bPDFdOworICAgIHN3aXRjaCggcGFydHNbaV1bPDFdICkKKyAgICB7CisgICAgY2FzZSAneCc6IGNhc2UgJ1gnOgorICAgICAgIGFiYnIgPSBzc2NhbmYoIHBhcnRzW2ldLCAiJSUlZCIsIGR1bW15ICkgJiYgZHVtbXk9PTA7CisgICAgICAgLy8gTk8gYnJlYWsgIQorICAgIGNhc2UgJ24nOiBjYXNlICdOJzoKKyAgICAgICBtYXh1bml0IHw9IDMxOworICAgICAgIGJyZWFrOworICAgIGNhc2UgJ3cnOiBjYXNlICdXJzoKKyAgICAgICBtYXh1bml0IHw9IDE1OworICAgICAgIGJyZWFrOworICAgIGNhc2UgJ2QnOiBjYXNlICdEJzoKKyAgICAgICBtYXh1bml0IHw9IDc7CisgICAgICAgYnJlYWs7CisgICAgY2FzZSAnaCc6IGNhc2UgJ0gnOgorICAgICAgIG1heHVuaXQgfD0gMzsKKyAgICAgICBicmVhazsKKyAgICBjYXNlICdtJzogY2FzZSAnTSc6CisgICAgICAgbWF4dW5pdCB8PSAxOworICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBpZiggbWF4dW5pdCAmIDE2ICkgd2Vla3MgJT0gNDsKKyAgaWYoIG1heHVuaXQgJiA4ICkgZGF5cyAlPSA3OworICBpZiggbWF4dW5pdCAmIDQgKSBob3VycyAlPSAyNDsKKyAgaWYoIG1heHVuaXQgJiAyICkgbWlucyAlPSA2MDsKKyAgaWYoIG1heHVuaXQgKSBzZWNzICU9IDYwOworCisgIGZvciggaT0xOyBpPHNpemVvZihwYXJ0cyk7IGkrPTIgKQorICB7CisgICAgZm10ID0gcGFydHNbaV1bMC4uPDJdOworICAgIGNoID0gcGFydHNbaV1bPDFdOworICAgIGlmKCBjaD09J3gnICkKKyAgICB7CisgICAgICBpZiAobW9udGhzID4gMCkgY2g9J24nOworICAgICAgZWxzZSBpZiggd2Vla3M+MCApIGNoPSd3JzsKKyAgICAgIGVsc2UgaWYoIGRheXM+MCApIGNoPSdkJzsKKyAgICAgIGVsc2UgaWYoIGhvdXJzPjAgKSBjaD0naCc7IAorICAgICAgZWxzZSBpZihtaW5zID4gMCkgY2ggPSAnbSc7CisgICAgICBlbHNlIGNoID0gJ3MnOworICAgIH0KKyAgICBlbHNlIGlmKCBjaD09J1gnICkKKyAgICB7CisgICAgICBpZiAobW9udGhzID4gMCkgY2g9J04nOworICAgICAgZWxzZSBpZiggd2Vla3M+MCApIGNoPSdXJzsKKyAgICAgIGVsc2UgaWYoIGRheXM+MCApIGNoPSdEJzsKKyAgICAgIGVsc2UgaWYoIGhvdXJzPjAgKSBjaD0nSCc7IAorICAgICAgZWxzZSBpZihtaW5zID4gMCkgY2ggPSAnTSc7CisgICAgICBlbHNlIGNoID0gJ1MnOworICAgIH0KKyAgICAKKyAgICBzd2l0Y2goIGNoICkKKyAgICB7CisgICAgICBjYXNlICduJzogcGFydHNbaV0gPSBzcHJpbnRmKCBmbXQrImQiLCBtb250aHMgKTsgYnJlYWs7CisgICAgICBjYXNlICd3JzogcGFydHNbaV0gPSBzcHJpbnRmKCBmbXQrImQiLCB3ZWVrcyApOyBicmVhazsKKyAgICAgIGNhc2UgJ2QnOiBwYXJ0c1tpXSA9IHNwcmludGYoIGZtdCsiZCIsIGRheXMgKTsgYnJlYWs7CisgICAgICBjYXNlICdoJzogcGFydHNbaV0gPSBzcHJpbnRmKCBmbXQrImQiLCBob3VycyApOyBicmVhazsKKyAgICAgIGNhc2UgJ20nOiBwYXJ0c1tpXSA9IHNwcmludGYoIGZtdCsiZCIsIG1pbnMgKTsgYnJlYWs7CisgICAgICBjYXNlICdzJzogcGFydHNbaV0gPSBzcHJpbnRmKCBmbXQrImQiLCBzZWNzICk7IGJyZWFrOworICAgICAgY2FzZSAnTic6CisgICAgICAgaWYoYWJicikgcGFydHNbaV0gPSAiTSI7CisgICAgICAgZWxzZSBwYXJ0c1tpXSA9IHNwcmludGYoIGZtdCsicyIsIChtb250aHM9PTEpID8gIk1vbmF0IiA6ICJNb25hdGUiICk7CisgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdXJzoKKyAgICAgICBpZihhYmJyKSBwYXJ0c1tpXSA9ICJ3IjsgZWxzZQorICAgICAgIHBhcnRzW2ldID0gc3ByaW50ZiggZm10KyJzIiwgKHdlZWtzPT0xKSA/ICJXb2NoZSIgOiAiV29jaGVuIiApOworICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnRCc6CisgICAgICAgaWYoYWJicikgcGFydHNbaV0gPSAiZCI7IGVsc2UKKyAgICAgICBwYXJ0c1tpXSA9IHNwcmludGYoIGZtdCsicyIsIChkYXlzPT0xKSA/ICJUYWciIDogIlRhZ2UiICk7CisgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdIJzoKKyAgICAgICBpZihhYmJyKSBwYXJ0c1tpXSA9ICJoIjsgZWxzZQorICAgICAgIHBhcnRzW2ldID0gc3ByaW50ZiggZm10KyJzIiwgKGhvdXJzPT0xKSA/ICJTdHVuZGUiIDogIlN0dW5kZW4iICk7CisgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdNJzoKKyAgICAgICBpZihhYmJyKSBwYXJ0c1tpXSA9ICJtIjsgZWxzZQorICAgICAgIHBhcnRzW2ldID0gc3ByaW50ZiggZm10KyJzIiwgKG1pbnM9PTEpID8gIk1pbnV0ZSIgOiAiTWludXRlbiIgKTsKKyAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ1MnOgorICAgICAgIGlmKGFiYnIpIHBhcnRzW2ldID0gInMiOyBlbHNlCisgICAgICAgcGFydHNbaV0gPSBzcHJpbnRmKCBmbXQrInMiLCAoc2Vjcz09MSkgPyAiU2VrdW5kZSIgOiAiU2VrdW5kZW4iICk7CisgICAgICAgYnJlYWs7CisgICAgICBjYXNlICclJzoKKyAgICAgICBwYXJ0c1tpXSA9ICIlIjsKKyAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGltcGxvZGUoIHBhcnRzLCAiIiApOworfQorCitub21hc2sgbWl4ZWQgX19jcmVhdGVfcGxheWVyX2R1bW15KHN0cmluZyBuYW1lKQoreworICBzdHJpbmcgZXJyOworICBvYmplY3Qgb2I7CisgIG1peGVkIG07CisgIC8vaGF0IG5lbiBTY2hlcnprZWtzIGRpZSBCbHVlcHJpbnQgYmV3ZWd0PworICBpZiAoKG9iPWZpbmRfb2JqZWN0KCIvc2VjdXJlL2xvZ2luIikpICYmIGVudmlyb25tZW50KG9iKSkKKyAgICAgIGNhdGNoKGRlc3RydWN0KG9iKTtwdWJsaXNoKTsKKyAgZXJyID0gY2F0Y2gob2IgPSBjbG9uZV9vYmplY3QoInNlY3VyZS9sb2dpbiIpO3B1Ymxpc2gpOworICBpZiAoZXJyKQorICB7CisgICAgd3JpdGUoIkZlaGxlciBiZWltIExhZGVuIHZvbiAvc2VjdXJlL2xvZ2luLmNcbiIrZXJyKyJcbiIpOworICAgIHJldHVybiAwOworICB9CisgIGlmIChvYmplY3RwKG09KG1peGVkKW9iLT5uZXdfbG9nb24obmFtZSkpKSBuZXRkZWFkW25hbWVdPW07CisgIHJldHVybiBtOworfQorCitub21hc2sgaW50IHNlY3VyZV9sZXZlbCgpCit7CisgIGludCAqbGV2ZWw7CisgIC8va2V0dGUgZGVyIENhbGxlciBkdXJjaGxhdWZlbiwgZGVuIG5pZWRyaWdzdGVuIExldmVsIGluIGRlciBLZXR0ZQorICAvL3p1cnVlY2tnZWJlbi4gWmVyc3RvZXJ0ZSBPYmpla3RlIChTZWxic3R6ZXJzdG9lcmVyKSBmdWVocmVuIHp1ciBSdWVja2dhYmUKKyAgLy92b24gMC4KKyAgLy9jYWxsZXJfc3RhY2soMSkgZnVlZ3QgZGVtIFJ1ZWNrZ2FiZWFycmF5IHRoaXNfaW50ZXJhY3RpdmUoKSBoaW56dSBiencuIDAsCisgIC8vd2VubiBlcyBrZWluZW4gSW50ZXJhY3RpdmUgZ2lidC4gRGllIDAgZnVlaHJ0IGRhbm4gd2llIGJlaSB6ZXJzdG9lcnRlbgorICAvL09iamVrdGVuIHp1ciBSdWVja2dhYmUgdm9uIDAsIHdhcyBnZXd1ZW5zY2h0IGlzdCwgZGEgZXMgaGllciBlaW5lbgorICAvL0lOdGVyYWN0aXZlIGdlYmVuIG11c3MuCisgIGxldmVsPW1hcChjYWxsZXJfc3RhY2soMSksZnVuY3Rpb24gaW50IChvYmplY3QgY2FsbGVyKQorICAgICAge2lmIChvYmplY3RwKGNhbGxlcikpCisgICAgICAgcmV0dXJuKHF1ZXJ5X3dpel9sZXZlbChnZXRldWlkKGNhbGxlcikpKTsKKyAgICAgICByZXR1cm4oMCk7IC8vIGtlaW4gT2JqZWt0IGRhLCAwLgorICAgICAgfSApOworICByZXR1cm4obWluKGxldmVsKSk7IC8vZGVuIGtsZWluc3RlbiBXZXJ0IGltIEFycmF5IHp1cnVlY2tnZWJlbiAoZ2dmLiAwKQorfQorCitub21hc2sgc3RyaW5nIHNlY3VyZV9ldWlkKCkKK3sKKyAgc3RyaW5nIGV1aWQ7CisKKyAgaWYgKCF0aGlzX2ludGVyYWN0aXZlKCkpIC8vIEVzIG11c3MgZWluZW4gaW50ZXJhY3RpdmUgZ2ViZW4KKyAgICAgcmV0dXJuIDA7CisgIGV1aWQ9Z2V0ZXVpZCh0aGlzX2ludGVyYWN0aXZlKCkpOworICAvLyB1ZWJlciBhbGxlIENhbGxlciBpdGVyaWVyZW4uIFdlbm4gZWluZXMgZGF2b24gZWluZSBhbmRlcmUgZXVpZCBoYXQgYWxzCisgIC8vIGRlciBJbnRlcmFjdGl2ZSB1bmQgZGllc2UgbmljaHQgZGllIFJPT1RJRCBpc3QsIHdpcmQgMCB6dXJ1ZWNrZ2ViZW4uCisgIC8vIEViZW5zbywgZmFsbHMgZWluIFNlbGJzdHplcnN0b2VyZXIgaXJnZW5kd28gaW4gZGVyIEtldHRlIGlzdC4KKyAgZm9yZWFjaChvYmplY3QgY2FsbGVyOiBjYWxsZXJfc3RhY2soKSkgeworICAgICAgaWYgKCFvYmplY3RwKGNhbGxlcikgfHwKKyAgICAgICAoZ2V0ZXVpZChjYWxsZXIpIT1ldWlkICYmIGdldGV1aWQoY2FsbGVyKSE9Uk9PVElEKSkKKyAgICAgICAgIHJldHVybiAwOworICB9CisgIHJldHVybiBldWlkOyAvLyAnc2ljaGVyZScgZXVpZCB6dXJ1ZWNrZ2ViZW4KK30KKworLy8gSU5QVVRfUFJPTVBUIHVuZCBuZW4gTGVlcnByb21wdCBoaW56dWZ1ZWdlbiwgd2VubiBrZWlucyB1ZWJlcmdlYmVuIHdpcmQuCisvLyBEYXMgc29sbCBkYXp1IGRpZW5lbiwgZGFzcyBhbGxlIGdnZi4gZWluIEVPUiBhbSBQcm9tcHRlbmRlIGtyaWVnZW4uLi4KKy8vI2lmIF9fQk9PVF9USU1FX18gPCAxMzYwMDE3MjEzCit2YXJhcmdzIHZvaWQgaW5wdXRfdG8oIG1peGVkIGZ1biwgaW50IGZsYWdzLCB2YXJhcmdzIG1peGVkICphcmdzICkKK3sKKyAgICBtaXhlZCAqYXJyOworICAgIGludCBpOworCisgICAgaWYgKCAhdGhpc19wbGF5ZXIoKSB8fCAhcHJldmlvdXNfb2JqZWN0KCkgKQorICAgICAgIHJldHVybjsKKworICAgIC8vIFRPRE86IGlucHV0X3RvKC4uLixJTlBVVF9QUk9NUFQsICIiLCAuLi4pLCB3ZW5uIGtlaW4gSU5QVVRfUFJPTVBUCisgICAgLy8gdm9ya29tbXQuLi4KKyAgICBpZiAoIGZsYWdzJklOUFVUX1BST01QVCApIHsgICAgCisgICAgICAgIGFyciA9ICh7IGZ1biwgZmxhZ3MgfSkgKyBhcmdzOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLy8gZ2dmLiBlaW4gSU5QVVRfUFJPTVBUIGhpbnp1ZnVlZ2VuIHVuZCBuZW4gTGVlcnN0cmluZyBhbHMgUHJvbXB0LgorICAgICAgICBmbGFncyB8PSBJTlBVVF9QUk9NUFQ7CisgICAgICAgIGFyciA9ICh7IGZ1biwgZmxhZ3MsICIiIH0pICsgYXJnczsKKyAgICB9CisKKyAgICAvLyBBcnJheXMgZ2VnZW4gZmxhdHRlbiBxdW90ZW4uCisgICAgZm9yICggaSA9IHNpemVvZihhcnIpIC0gMTsgaSA+IDE7IGktLSApCisgICAgICAgaWYgKCBwb2ludGVycChhcnJbaV0pICkKKyAgICAgICAgICAgYXJyW2ldID0gcXVvdGUoYXJyW2ldKTsKKworICAgIGFwcGx5KCBiaW5kX2xhbWJkYSggdW5ib3VuZF9sYW1iZGEoICh7fSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHsgIydlZnVuOjppbnB1dF90by8qJyovIH0pICsgYXJyICksCisgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzX29iamVjdCgpICkgKTsKK30KKy8vI2VuZGlmCisKK25vbWFzayBpbnQgc2V0X2xpZ2h0KGludCBpKQorLy8gZXJob2VodCBkYXMgTGljaHRsZXZlbCBlaW5lcyBPYmpla3RzIHVtIGkKKy8vIHJlc3VsdDogZGFzIExpY2h0bGV2ZWwgaW5uZXJoYWxiIGRlcyBPYmpla3RzCit7CisgICAgb2JqZWN0IG9iLCAqaW52OworICAgIGludCBsYWxsLCBsaWdodCwgZGFyaywgdG1wOworCisgICAgaWYgKCEob2I9cHJldmlvdXNfb2JqZWN0KCkpKSByZXR1cm4gMDsgLy8gb2huZSBkYXMgZ2VodHMgbmljaHQuCisKKyAgICAvLyBhdXMga29tcGF0aWJpbGl0YWV0c2dydWVuZGVuIGthbm4gbWFuIGF1Y2ggZGVuIExpY2h0bGV2ZWwgbm9jaCBzZXR6ZW4KKyAgICBpZiAoaSE9MCkgb2ItPlNldFByb3AoUF9MSUdIVCwgb2ItPlF1ZXJ5UHJvcChQX0xJR0hUKStpKTsKKworICAgIC8vIExpY2h0YmVyZWNobnVuZyBmaW5kZXQgZWlnZW50bGljaCBpbiBkZXIgTXVkbGliIHN0YXR0LgorICAgIHJldHVybiAoaW50KW9iLT5RdWVyeVByb3AoUF9JTlRfTElHSFQpOworfQorCisKK3B1YmxpYyBzdHJpbmcgaXNvMmFzY2lpKCBzdHJpbmcgc3RyICkKK3sKKyAgICBpZiAoICFzdHJpbmdwKHN0cikgfHwgIXNpemVvZihzdHIpICkKKyAgICAgICByZXR1cm4gIiI7CisKKyAgICBzdHIgPSByZWdyZXBsYWNlKCBzdHIsICLkIiwgImFlIiwgMSApOworICAgIHN0ciA9IHJlZ3JlcGxhY2UoIHN0ciwgIvYiLCAib2UiLCAxICk7CisgICAgc3RyID0gcmVncmVwbGFjZSggc3RyLCAi/CIsICJ1ZSIsIDEgKTsKKyAgICBzdHIgPSByZWdyZXBsYWNlKCBzdHIsICLEIiwgIkFlIiwgMSApOworICAgIHN0ciA9IHJlZ3JlcGxhY2UoIHN0ciwgItYiLCAiT2UiLCAxICk7CisgICAgc3RyID0gcmVncmVwbGFjZSggc3RyLCAi3CIsICJVZSIsIDEgKTsKKyAgICBzdHIgPSByZWdyZXBsYWNlKCBzdHIsICLfIiwgInNzIiwgMSApOworICAgIHN0ciA9IHJlZ3JlcGxhY2UoIHN0ciwgIlteIC1+XSIsICI/IiwgMSApOworCisgICAgcmV0dXJuIHN0cjsKK30KKworCitwdWJsaWMgdmFyYXJncyBzdHJpbmcgQ291bnRVcCggc3RyaW5nICpzLCBzdHJpbmcgc2VwLCBzdHJpbmcgbGFzdHNlcCApCit7CisgICAgc3RyaW5nIHJldDsKKworICAgIGlmICggIXBvaW50ZXJwKHMpICkKKyAgICAgICByZXR1cm4gIiI7CisgICAgCisgICAgaWYgKCFzZXApIHNlcCA9ICIsICI7CisgICAgaWYgKCFsYXN0c2VwKSBsYXN0c2VwID0gIiB1bmQgIjsKKworICAgIHN3aXRjaCAoc2l6ZW9mKHMpKSAgeworICAgICAgIGNhc2UgMDogcmV0PSIiOyBicmVhazsKKyAgICAgICBjYXNlIDE6IHJldD1zWzBdOyBicmVhazsKKyAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICByZXQgPSBpbXBsb2RlKHNbMC4uPDJdLCBzZXApOworICAgICAgICAgICAgICByZXQgKz0gbGFzdHNlcCArIHNbPDFdOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitub21hc2sgdmFyYXJncyBpbnQgcXVlcnlfbmV4dF9yZXNldChvYmplY3Qgb2IpIHsKKworICAgIC8vIFR5cHBydWVmdW5nOiBldHdhcyBhbmRlcmVzIGFscyBPYmpla3RlIG9kZXIgMCBzb2xsZW4gRmVobGVyIHNlaW4uCisgICAgaWYgKG9iICYmICFvYmplY3RwKG9iKSkKKyAgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoIkJhZCBhcmcgMSB0byBxdWVyeV9uZXh0X3Jlc2V0KCk6IGdvdCAlLjIwTywgIgorICAgICAgICAgICAiZXhwZWN0ZWQgb2JqZWN0LlxuIixvYikpOworCisgICAgLy8gRGVmYXVsdG9iamVrdCBQTywgd2VubiAwIHVlYmVyZ2ViZW4uCisgICAgaWYgKCAhb2JqZWN0cChvYikgKQorICAgICAgb2IgPSBwcmV2aW91c19vYmplY3QoKTsKKworICAgIHJldHVybiBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTkVYVF9SRVNFVF9USU1FKTsKK30KKworCisjaWYgIV9fRUZVTl9ERUZJTkVEX18oY29weV9maWxlKQorI2RlZmluZSBNQVhMRU4gNTAwMDAKK25vbWFzayBpbnQgY29weV9maWxlKHN0cmluZyBzb3VyY2UsIHN0cmluZyBkZXN0KQoreworCisgIGludCBwdHI7CisgIHN0cmluZyBieXRlczsKKworICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOworICBpZiAoIXNpemVvZihzb3VyY2UpfHwhc2l6ZW9mKGRlc3QpfHxzb3VyY2U9PWRlc3R8fChmaWxlX3NpemUoc291cmNlKT09LTEpfHwKKyAgICAgICghY2FsbF9vdGhlcihtYXN0ZXIoKSwidmFsaWRfcmVhZCIsc291cmNlLAorICAgICAgICAgICAgICAgICAgIGdldHVpZCh0aGlzX2ludGVyYWN0aXZlKCl8fAorICAgICAgICAgICAgICAgICBwcmV2aW91c19vYmplY3QoKSksInJlYWRfZmlsZSIscHJldmlvdXNfb2JqZWN0KCkpKXx8CisgICAgICAoIWNhbGxfb3RoZXIobWFzdGVyKCksInZhbGlkX3JlYWQiLHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICBnZXR1aWQodGhpc19pbnRlcmFjdGl2ZSgpfHwKKyAgICAgICAgICAgICAgICAgcHJldmlvdXNfb2JqZWN0KCkpLCJ3cml0ZV9maWxlIixwcmV2aW91c19vYmplY3QoKSkpKQorICAgIHJldHVybiAxOworICBzd2l0Y2ggKGZpbGVfc2l6ZShkZXN0KSkKKyAgeworICBjYXNlIC0xOgorICAgIGJyZWFrOworICBjYXNlIC0yOgorICAgIGlmIChkZXN0WzwxXSE9Jy8nKSBkZXN0Kz0iLyI7CisgICAgZGVzdCs9ZWZ1bjo6ZXhwbG9kZShzb3VyY2UsIi8iKVs8MV07CisgICAgaWYgKGZpbGVfc2l6ZShkZXN0KT09LTIpIHJldHVybiAxOworICAgIGlmIChmaWxlX3NpemUoZGVzdCkhPS0xKSBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBpZiAoIXJtKGRlc3QpKSByZXR1cm4gMTsKKyAgICBicmVhazsKKyAgfQorICBkbworICB7CisgICAgYnl0ZXMgPSByZWFkX2J5dGVzKHNvdXJjZSwgcHRyLCBNQVhMRU4pOyBwdHIgKz0gTUFYTEVOOworICAgIGlmICghYnl0ZXMpIGJ5dGVzPSIiOworICAgIHdyaXRlX2ZpbGUoZGVzdCwgYnl0ZXMpOworICB9CisgIHdoaWxlKHNpemVvZihieXRlcykgPT0gTUFYTEVOKTsKKyAgcmV0dXJuIDA7Cit9CisjZW5kaWYgLy8hX19FRlVOX0RFRklORURfXyhjb3B5X2ZpbGUpCisKKworLy8gIyMjIEVyc2F0emF1ZmxvZXN1bmcgaW4gU3RyaW5ncyAjIyMKK3ZhcmFyZ3Mgc3RyaW5nIHJlcGxhY2VfcGVyc29uYWwoc3RyaW5nIHN0ciwgbWl4ZWQgKm9icywgaW50IGNhcHMpIHsKKyAgaW50IGk7CisgIHN0cmluZyAqcGFydHM7CisKKyAgcGFydHMgPSByZWdleHBsb2RlKHN0ciwgIkBXRVtBLVNVXSpbMC05XSIpOworICBpID0gc2l6ZW9mKHBhcnRzKTsKKworICBpZiAoaT4xKSB7CisgICAgaW50IGosIHQ7CisgICAgY2xvc3VyZSAqbmFtZV9jbHM7CisKKyAgICB0ID0gaiA9IHNpemVvZihvYnMpOworCisgICAgbmFtZV9jbHMgID0gIGFsbG9jYXRlKGopOworICAgIHdoaWxlIChqLS0pCisgICAgICBpZiAob2JqZWN0cChvYnNbal0pKQorICAgICAgICBuYW1lX2Nsc1tqXSA9IHN5bWJvbF9mdW5jdGlvbigibmFtZSIsIG9ic1tqXSk7CisgICAgICBlbHNlIGlmIChzdHJpbmdwKG9ic1tqXSkpCisgICAgICAgIG5hbWVfY2xzW2pdID0gb2JzW2pdOworCisgICAgd2hpbGUgKChpLT0gMik+MCkgeworICAgICAgaW50IG9iX25yOworICAgICAgLy8genUgZXJzZXR6ZW5kZXMgVG9rZW4gaW4gRmFsbCB1bmQgT2JqZWt0aW5kZXggYXVmc3BhbHRlbgorICAgICAgb2JfbnIgPSBwYXJ0c1tpXVs8MV0tJzEnOworICAgICAgaWYgKG9iX25yPDAgfHwgb2JfbnI+PXQpIHsKKyAgICAgICAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKKyAgICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigicmVwbGFjZV9wZXJzb25hbDogdXNpbmcgd3Jvbmcgb2JqZWN0IGluZGV4ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICBvYl9ucikpOworICAgICAgICByZXR1cm4gaW1wbG9kZShwYXJ0cywgIiIpOworICAgICAgfQorCisgICAgICAvLyBjYXN1cyBrYW5uIG1hbiBzY2hvbiBoaWVyIGVudHNjaGVpZGVuCisgICAgICBpbnQgY2FzdXM7CisgICAgICBzdHJpbmcgcGFydCA9IHBhcnRzW2ldOworICAgICAgc3dpdGNoIChwYXJ0WzNdKSB7CisgICAgICAgIGNhc2UgJ1InOiBjYXN1cyA9IFdFUjsgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ1MnOiBjYXN1cyA9IFdFU1NFTjsgYnJlYWs7CisgICAgICAgIGNhc2UgJ00nOiBjYXN1cyA9IFdFTTsgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ04nOiBjYXN1cyA9IFdFTjsgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6ICBjb250aW51ZTsgLy8gcGFzc3Qgc2Nob24gamV0enQgbmljaHQgaW4gZGFzIEhhdXB0bXVzdGVyCisgICAgICB9CisKKyAgICAgIC8vIHVuZCBqZXR6dCBkaWUgZWluemVsbmVuIEtleXdvcmRzIG9obmUgZnVlaHJlbmRlcyAiQFdFIiwgYmVlbmRlbmRlIElkCisgICAgICBtaXhlZCB0bXA7CisgICAgICBzd2l0Y2ggKHBhcnRbMy4uPDJdKSB7CisgICAgICAgIGNhc2UgIlIiOiBjYXNlICJTU0VOIjogY2FzZSAiTSI6IGNhc2UgIk4iOiAgICAgICAgICAgICAgIC8vIE5hbWUKKyAgICAgICAgICBwYXJ0c1tpXSA9IGZ1bmNhbGwobmFtZV9jbHNbb2JfbnJdLCBjYXN1cywgMSk7ICBicmVhazsKKyAgICAgICAgY2FzZSAiUlUiOiBjYXNlICJTU0VOVSI6IGNhc2UgIk1VIjogY2FzZSAiTlUiOiAgICAgICAgICAgLy8gdW5iZXN0aW1tdAorICAgICAgICAgIHBhcnRzW2ldID0gZnVuY2FsbChuYW1lX2Nsc1tvYl9ucl0sIGNhc3VzKTsgICAgIGJyZWFrOworICAgICAgICBjYXNlICJSUVAiOiBjYXNlICJTU0VOUVAiOiBjYXNlICJNUVAiOiBjYXNlICJOUVAiOiAgICAgICAvLyBQcm9ub3VuCisgICAgICAgICAgaWYgKG9iamVjdHAodG1wID0gb2JzW29iX25yXSkpCisgICAgICAgICAgICBwYXJ0c1tpXSA9IChzdHJpbmcpdG1wLT5RdWVyeVByb25vdW4oY2FzdXMpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICJSUUEiOiBjYXNlICJTU0VOUUEiOiBjYXNlICJNUUEiOiBjYXNlICJOUUEiOiAgICAgICAvLyBBcnRpY2xlCisgICAgICAgICAgaWYgKG9iamVjdHAodG1wID0gb2JzW29iX25yXSkpCisgICAgICAgICAgICB0bXAgPSAoc3RyaW5nKXRtcC0+UXVlcnlBcnRpY2xlKGNhc3VzLCAxLCAxKTsKKyAgICAgICAgICBpZiAoc3RyaW5ncCh0bXApICYmICEodG1wWzwxXV4nICcpKSAKKyAgICAgICAgICAgIHRtcCA9IHRtcFswLi48Ml07ICAgICAgICAgICAgICAgIC8vIEV4dHJhLVNwYWNlIHdpZWRlciBsb2VzY2hlbgorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICJSUVBQTVMiOiBjYXNlICJTU0VOUVBQTVMiOiBjYXNlICJNUVBQTVMiOiBjYXNlICJOUVBQTVMiOgorICAgICAgICAgIGlmIChvYmplY3RwKHRtcCA9IG9ic1tvYl9ucl0pKQorICAgICAgICAgICAgcGFydHNbaV0gPSAoc3RyaW5nKXRtcC0+UXVlcnlQb3NzUHJvbm91bihNQUxFLCBjYXN1cywgU0lOR1VMQVIpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICJSUVBQRlMiOiBjYXNlICJTU0VOUVBQRlMiOiBjYXNlICJNUVBQRlMiOiBjYXNlICJOUVBQRlMiOgorICAgICAgICAgIGlmIChvYmplY3RwKHRtcCA9IG9ic1tvYl9ucl0pKQorICAgICAgICAgICAgcGFydHNbaV0gPSAoc3RyaW5nKXRtcC0+UXVlcnlQb3NzUHJvbm91bihGRU1BTEUsIGNhc3VzLCBTSU5HVUxBUik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgIlJRUFBOUyI6IGNhc2UgIlNTRU5RUFBOUyI6IGNhc2UgIk1RUFBOUyI6IGNhc2UgIk5RUFBOUyI6CisgICAgICAgICAgaWYgKG9iamVjdHAodG1wID0gb2JzW29iX25yXSkpCisgICAgICAgICAgICBwYXJ0c1tpXSA9IChzdHJpbmcpdG1wLT5RdWVyeVBvc3NQcm9ub3VuKE5FVVRFUiwgY2FzdXMsIFNJTkdVTEFSKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAiUlFQUE1QIjogY2FzZSAiU1NFTlFQUE1QIjogY2FzZSAiTVFQUE1QIjogY2FzZSAiTlFQUE1QIjoKKyAgICAgICAgICBpZiAob2JqZWN0cCh0bXAgPSBvYnNbb2JfbnJdKSkKKyAgICAgICAgICAgIHBhcnRzW2ldID0gKHN0cmluZyl0bXAtPlF1ZXJ5UG9zc1Byb25vdW4oTUFMRSwgY2FzdXMsIFBMVVJBTCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgIlJRUFBGUCI6IGNhc2UgIlNTRU5RUFBGUCI6IGNhc2UgIk1RUFBGUCI6IGNhc2UgIk5RUFBGUCI6CisgICAgICAgICAgaWYgKG9iamVjdHAodG1wID0gb2JzW29iX25yXSkpCisgICAgICAgICAgICBwYXJ0c1tpXSA9IChzdHJpbmcpdG1wLT5RdWVyeVBvc3NQcm9ub3VuKEZFTUFMRSwgY2FzdXMsIFBMVVJBTCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgIlJRUFBOUCI6IGNhc2UgIlNTRU5RUFBOUCI6IGNhc2UgIk1RUFBOUCI6IGNhc2UgIk5RUFBOUCI6CisgICAgICAgICAgaWYgKG9iamVjdHAodG1wID0gb2JzW29iX25yXSkpCisgICAgICAgICAgICBwYXJ0c1tpXSA9IChzdHJpbmcpdG1wLT5RdWVyeVBvc3NQcm9ub3VuKE5FVVRFUiwgY2FzdXMsIFBMVVJBTCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICAKKyAgICAgIC8vIHdlbm4gdG1wIGVpbiBTdHJpbmcgd2FyLCB3ZWlzZW4gd2lyIGVzIGhpZXIgcGF1c2NoYWwgenUKKyAgICAgIGlmIChzdHJpbmdwKHRtcCkpCisgICAgICAgIHBhcnRzW2ldID0gdG1wOworCisgICAgICAvLyBhdWYgV3Vuc2NoIHdpcmQgbmFjaCBTYXR6ZW5kZW4gZ3Jvc3MgZ2VzY2hyaWViZW4KKyAgICAgIGlmIChjYXBzKQorICAgICAgICBzd2l0Y2ggKHBhcnRzW2ktMV1bPDIuLl0pIHsKKyAgICAgICAgICBjYXNlICIuICI6ICBjYXNlICIhICI6ICBjYXNlICI/ICI6CisgICAgICAgICAgY2FzZSAiLiI6ICAgY2FzZSAiISI6ICAgY2FzZSAiPyI6CisgICAgICAgICAgY2FzZSAiLlxuIjogY2FzZSAiIVxuIjogY2FzZSAiP1xuIjoKKyAgICAgICAgICBjYXNlICJcIiAiOiBjYXNlICJcIlxuIjoKKyAgICAgICAgICAgIHBhcnRzW2ldID0gY2FwaXRhbGl6ZShwYXJ0c1tpXSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gaW1wbG9kZShwYXJ0cywgIiIpOworICB9CisgIHJldHVybiBzdHI7Cit9CisKKworLy9yZXBsYWNlbWVudHMgZm9yIGRyb3BwZWQgZWZ1bnMgaW4gTEQKKyNpZiAhX19FRlVOX0RFRklORURfXyhleHRyYWN0KQorZGVwcmVjYXRlZCB2YXJhcmdzIHN0cmluZyBleHRyYWN0KHN0cmluZyBzdHIsIGludCBmcm9tLCBpbnQgdG8pIHsKKworICBpZighc3RyaW5ncChzdHIpKSB7CisgICAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKKyAgICByYWlzZV9lcnJvcihzcHJpbnRmKCJCYWQgYXJndW1lbnQgMSB0byBleHRyYWN0KCk6ICVPIixzdHIpKTsKKyAgfQorICBpZiAoaW50cChmcm9tKSAmJiBpbnRwKHRvKSkgeworICAgIGlmIChmcm9tPj0wICYmIHRvPj0wKQorICAgICAgcmV0dXJuKHN0cltmcm9tIC4uIHRvXSk7CisgICAgZWxzZSBpZiAoZnJvbT49MCAmJiB0bzwwKQorICAgICAgcmV0dXJuKHN0cltmcm9tIC4uIDxhYnModG8pXSk7CisgICAgZWxzZSBpZiAoZnJvbTwwICYmIHRvPj0wKQorICAgICAgcmV0dXJuKHN0cls8YWJzKGZyb20pIC4uIHRvXSk7CisgICAgZWxzZQorICAgICAgcmV0dXJuKHN0cls8YWJzKGZyb20pIC4uIDxhYnModG8pXSk7CisgIH0KKyAgZWxzZSBpZiAoaW50cChmcm9tKSkgeworICAgIGlmIChmcm9tPj0wKQorICAgICAgcmV0dXJuKHN0cltmcm9tIC4uIF0pOworICAgIGVsc2UKKyAgICAgIHJldHVybihzdHJbPGFicyhmcm9tKSAuLiBdKTsKKyAgfQorICBlbHNlIHsKKyAgICByZXR1cm4oc3RyKTsKKyAgfQorfQorI2VuZGlmIC8vICFfX0VGVU5fREVGSU5FRF9fKGV4dHJhY3QpCisKKyNpZiAhX19FRlVOX0RFRklORURfXyhzbGljZV9hcnJheSkKK2RlcHJlY2F0ZWQgdmFyYXJncyBtaXhlZCBzbGljZV9hcnJheShtaXhlZCBhcnJheSwgaW50IGZyb20sIGludCB0bykgeworCisgIGlmKCFwb2ludGVycChhcnJheSkpIHsKKyAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOworICAgIHJhaXNlX2Vycm9yKHNwcmludGYoIkJhZCBhcmd1bWVudCAxIHRvIHNsaWNlX2FycmF5KCk6ICVPIixhcnJheSkpOworICB9CisgIGlmIChpbnRwKGZyb20pICYmIGludHAodG8pKSB7CisgICAgaWYgKGZyb20+PTAgJiYgdG8+PTApCisgICAgICByZXR1cm4oYXJyYXlbZnJvbSAuLiB0b10pOworICAgIGVsc2UgaWYgKGZyb20+PTAgJiYgdG88MCkKKyAgICAgIHJldHVybihhcnJheVtmcm9tIC4uIDxhYnModG8pXSk7CisgICAgZWxzZSBpZiAoZnJvbTwwICYmIHRvPj0wKQorICAgICAgcmV0dXJuKGFycmF5WzxhYnMoZnJvbSkgLi4gdG9dKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4oYXJyYXlbPGFicyhmcm9tKSAuLiA8YWJzKHRvKV0pOworICB9CisgIGVsc2UgaWYgKGludHAoZnJvbSkpIHsKKyAgICBpZiAoZnJvbT49MCkKKyAgICAgIHJldHVybihhcnJheVtmcm9tIC4uIF0pOworICAgIGVsc2UKKyAgICAgIHJldHVybihhcnJheVs8YWJzKGZyb20pIC4uIF0pOworICB9CisgIGVsc2UgeworICAgIHJldHVybihhcnJheSk7CisgIH0KK30KKyNlbmRpZiAvLyAhX19FRlVOX0RFRklORURfXyhzbGljZV9hcnJheSkKKworI2lmICFfX0VGVU5fREVGSU5FRF9fKG1lbWJlcl9hcnJheSkKK2RlcHJlY2F0ZWQgaW50IG1lbWJlcl9hcnJheShtaXhlZCBpdGVtLCBtaXhlZCBhcnJheXN0cmluZykgeworCisgIGlmIChwb2ludGVycChhcnJheXN0cmluZykpIHsKKyAgICByZXR1cm4oZWZ1bjo6bWVtYmVyKGFycmF5c3RyaW5nLGl0ZW0pKTsKKyAgfQorICBlbHNlIGlmIChzdHJpbmdwKGFycmF5c3RyaW5nKSkgeworICAgIHJldHVybihlZnVuOjptZW1iZXIoYXJyYXlzdHJpbmcsdG9faW50KGl0ZW0pKSk7CisgIH0KKyAgZWxzZSB7CisgICAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKKyAgICByYWlzZV9lcnJvcihzcHJpbnRmKCJCYWQgYXJndW1lbnQgMSB0byBtZW1iZXJfYXJyYXkoKTogJU8iLGFycmF5c3RyaW5nKSk7CisgIH0KK30KKyNlbmRpZiAvLyAhX19FRlVOX0RFRklORURfXyhtZW1iZXJfYXJyYXkpCisKKy8vIFRoZSBkaWdpdCBhdCB0aGUgaSd0aCBwb3NpdGlvbiBpcyB0aGUgbnVtYmVyIG9mIGJpdHMgc2V0IGluICdpJy4KK3N0cmluZyBjb3VudF90YWJsZSA9CisgICAgIjAxMTIxMjIzMTIyMzIzMzQxMjIzMjMzNDIzMzQzNDQ1MTIyMzIzMzQyMzM0MzQ0NTIzMzQzNDQ1MzQ0NTQ1NTYiOworaW50IGJyb2tlbl9jb3VudF9iaXRzKCBzdHJpbmcgcyApIHsKKyAgICBpbnQgaSwgcmVzOworICAgIGlmKCAhc3RyaW5ncChzKSB8fCAhKGk9c2l6ZW9mKHMpKSApIHJldHVybiAwOworICAgIGZvciggOyBpLS0+MDsgKSB7CisgICAgICAgIC8vIFdlIGFyZSBjb3VudGluZyA2IGJpdHMgYXQgYSB0aW1lIHVzaW5nIGEgcHJlY29tcGlsZWQgdGFibGUuCisgICAgICAgIHJlcyArPSBjb3VudF90YWJsZVsoc1tpXS0nICcpJjYzXS0nMCc7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKKyNpZiAhX19FRlVOX0RFRklORURfXyhjb3VudF9iaXRzKQoraW50IGNvdW50X2JpdHMoIHN0cmluZyBzICkgeworICAgIHJldHVybihicm9rZW5fY291bnRfYml0cyhzKSk7Cit9CisjZW5kaWYKKworCisvLyAqIFRlaWxlIGF1cyBlaW5lbSBBcnJheSBlbnRmZXJuZW4gKioqIE9CU09MRVRFCitkZXByZWNhdGVkIG1peGVkICpleGNsdWRlX2FycmF5KG1peGVkICphcnIsaW50IGZyb20saW50IHRvKQoreworICBpZiAodG88ZnJvbSkKKyAgICB0byA9IGZyb207CisgIHJldHVybiBhcnJbMC4uZnJvbS0xXSthcnJbdG8rMS4uXTsKK30KKwpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvUkVBRE1FIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwMzQyOWEKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9SRUFETUUKQEAgLTAsMCArMSwyMCBAQAorc2ltdWxfZWZ1biAKKy0tLS0tLS0tLS0gCitEYXMgc2ltdWxfZWZ1biBPYmpla3QgL3NlY3VyZS9zaW11bF9lZnVuL3NpbXVsX2VmdW4gYmVudXR6dCBkaWUgRGF0ZWllbgoraW4gL3NlY3VyZS9zaW11bF9lZnVuLgorSW0gVmVyemVpY2huaXMgL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlIGlzdCBlaW5lIFNpY2hlcmhlaXRza29waWUgdm9uIGFsbGVuIAorRGF0ZWllbiBpbiAvc2VjdXJlL3NpbXVsX2VmdW4uCisKK0ZhbGxzIC9zZWN1cmUvc2ltdWxfZWZ1bi9zaW11bF9lZnVuLmMgbmljaHQgbGFkYmFyIGlzdCwgd2lyZCAKKy9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zaW11bF9lZnVuLmMgYWxzIEVyc2F0eiB2ZXJzdWNodC4gV2VubiBhdWNoIGRhcworbmljaHQgbGFkYmFyIGlzdCwgZXJmb2xndCBlaW4gU2h1dGRvd24gZGVzIE11ZHMuCisKK0JlaSBBZW5kZXJ1bmdlbiBzb2xsdGUgX3p1ZXJzdF8gZGllIG5vcm1hbGUgc2ltdWwgZWZ1biBlZGl0aWVydCB1bmQKK2Fuc2NobGllc3NlbmQgemVyc3RvZXJ0L2VudGxhZGVuIHdlcmRlbiwgd29yYXVmaGluIHNpZSBpbXBsaXppdCBkdXJjaCBkZW4KK0RyaXZlciB1bmQgTWFzdGVyIG5ldWdlbGFkZW4gd2lyZC4gSXN0IGRpZXMgZXJmb2xncmVpY2ggdW5kIGRpZSBuZXVlCitzaW11bF9lZnVuIGxhZXVmdCAoZXJzdCBkYW5uISkga29waWVydCBtYW4gZGllIERhdGVpZW4gYXVzIAorL3NlY3VyZS9zaW11bF9lZnVuIG5hY2ggL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlLgorCitEaWUgRGF0ZWllbiBoaWVyIHNpbmQgbWl0IEF1c25haG1lIGRlciBzaW11bF9lZnVuLmMgc2VsYnN0IF9uaWNodF8gZGF6dSAKK2dlZGFjaHQsIGdlbGFkZW4genUgd2VyZGVuLgorCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9jb21tLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9jb21tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZiNTk4YwotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL2NvbW0uYwpAQCAtMCwwICsxLDEyNSBAQAorI2luY2x1ZGUgPGxpdmluZy9jb21tLmg+CisKKy8vIFNlbmRldCBhbiBhbGxlIE9iamVrdGUgaW4gcm9vbSB1bmQgcm9vbSBzZWxiZXIgZHVyY2ggQXVmcnVmIHZvbgorLy8gUmVjZWl2ZU1zZygpLgordmFyYXJncyB2b2lkIHNlbmRfcm9vbShvYmplY3R8c3RyaW5nIHJvb20sIHN0cmluZyBtc2csIGludCBtc2dfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG1zZ19hY3Rpb24sIHN0cmluZyBtc2dfcHJlZml4LCBvYmplY3QgKmV4Y2x1ZGUsCisgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdCBvcmlnaW4pCit7CisgIGlmIChzdHJpbmdwKHJvb20pKQorICAgIHJvb209bG9hZF9vYmplY3Qocm9vbSk7CisgIAorICBvcmlnaW4gfHw9IHByZXZpb3VzX29iamVjdCgpOworICBvYmplY3QgKmRlc3QgPSBleGNsdWRlID8gYWxsX2ludmVudG9yeShyb29tKSAtIGV4Y2x1ZGUgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsX2ludmVudG9yeShyb29tKTsKKworICBkZXN0LT5SZWNlaXZlTXNnKG1zZywgbXNnX3R5cGUsIG1zZ19hY3Rpb24sIG1zZ19wcmVmaXgsIG9yaWdpbik7CisgIHJvb20tPlJlY2VpdmVNc2cobXNnLCBtc2dfdHlwZSwgbXNnX2FjdGlvbiwgbXNnX3ByZWZpeCwgb3JpZ2luKTsKK30KKworc3RhdGljIGludCBfc2hvdXRfZmlsdGVyKCBvYmplY3Qgb2IsIHN0cmluZyBwYXQgKQoreworICAgIHN0cmluZyAqaWdub3JlOworCisgICAgaWYgKCAhZW52aXJvbm1lbnQob2IpICkKKyAgICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiBzaXplb2YoIHJlZ2V4cCggKHsgb2JqZWN0X25hbWUoIGVudmlyb25tZW50KG9iKSApIH0pLCBwYXQgKSApOworfQorCit2YXJhcmdzIHZvaWQgc2hvdXQoIHN0cmluZyBzLCBtaXhlZCB3aGVyZSApeworICAgIG9iamVjdCAqdTsKKyAgICBzdHJpbmcgKnBmYWRlOworCisgICAgaWYgKCAhc2l6ZW9mKCB1ID0gdXNlcnMoKSAtICh7IHRoaXNfcGxheWVyKCkgfSkgKSApCisgICAgICAgcmV0dXJuOworCisgICAgaWYgKCAhd2hlcmUgKQorICAgICAgIHBmYWRlID0gKHsgIi8iIH0pOworICAgIGVsc2UgaWYgKCBpbnRwKHdoZXJlKSApCisgICAgICAgcGZhZGUgPQorICAgICAgICAgICAoeyBpbXBsb2RlKCBlZnVuOjpleHBsb2RlKCBvYmplY3RfbmFtZSggZW52aXJvbm1lbnQodGhpc19wbGF5ZXIoKSkgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8iIClbMC4uMl0sICIvIiApICsgIi8iIH0pOworICAgIGVsc2UgaWYgKCBzdHJpbmdwKHdoZXJlKSApCisgICAgICAgcGZhZGUgPSAoeyB3aGVyZSB9KTsKKyAgICBlbHNlCisgICAgICAgcGZhZGUgPSB3aGVyZTsKKworICAgIHUgPSBmaWx0ZXIoIHUsICJfc2hvdXRfZmlsdGVyIiwgTUUsIGltcGxvZGUoIHBmYWRlLCAifCIgKSApOworICAgIHUtPlJlY2VpdmVNc2cocywgTVRfQ09NTXxNVF9GQVJ8TVNHX0RPTlRfV1JBUHxNU0dfRE9OVF9TVE9SRSwKKyAgICAgICAgICAgICAgICAgIE1BX1NIT1VUX1NFRlVOLCAwLCBwcmV2aW91c19vYmplY3QoKSk7Cit9CisKKworI2lmIF9fVkVSU0lPTl9fID4gIjMuMy43MTgiCisvLyBUaGlzIHNlZnVuIHJlcGxhY2VzIHRoZSBkZXByZWNhdGVkIGVmdW4gY2F0KCkuCisjZGVmaW5lIENBVF9NQVhfTElORVMgNTAKK3ZhcmFyZ3MgaW50IGNhdChzdHJpbmcgZmlsZSwgaW50IHN0YXJ0LCBpbnQgbnVtKQoreworICAgIGlmIChleHRlcm5fY2FsbCgpKQorICAgICAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOworCisgICAgaW50IG1vcmU7CisKKyAgICBpZiAobnVtIDwgMCB8fCAhdGhpc19wbGF5ZXIoKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAoIXN0YXJ0KQorICAgICAgICBzdGFydCA9IDE7CisKKyAgICBpZiAoIW51bSB8fCBudW0gPiBDQVRfTUFYX0xJTkVTKSB7CisgICAgICAgIG51bSA9IENBVF9NQVhfTElORVM7CisgICAgICAgIG1vcmUgPSBzaXplb2YocmVhZF9maWxlKGZpbGUsIHN0YXJ0K251bSwgMSkpOworICAgIH0KKworICAgIHN0cmluZyB0eHQgPSByZWFkX2ZpbGUoZmlsZSwgc3RhcnQsIG51bSk7CisgICAgaWYgKCF0eHQpCisgICAgICAgIHJldHVybiAwOworCisgICAgZWZ1bjo6dGVsbF9vYmplY3QodGhpc19wbGF5ZXIoKSwgdHh0KTsKKworICAgIGlmIChtb3JlKQorICAgICAgICBlZnVuOjp0ZWxsX29iamVjdCh0aGlzX3BsYXllcigpLCAiKioqKipUUlVOQ0FURUQqKioqXG4iKTsKKworICAgIHJldHVybiBzaXplb2YodHh0ICYgIlxuIik7Cit9CisjdW5kZWYgQ0FUX01BWF9MSU5FUworI2VuZGlmIC8vIF9fVkVSU0lPTl9fID4gIjMuMy43MTgiCisKKyNpZiBfX1ZFUlNJT05fXyA+ICIzLjMuNzE5IgorLy8gVGhpcyBzZWZ1biByZXBsYWNlcyB0aGUgZGVwcmVjYXRlZCBlZnVuIHRhaWwoKS4KKyNkZWZpbmUgVEFJTF9NQVhfQllURVMgMTAwMAordmFyYXJncyBpbnQgdGFpbChzdHJpbmcgZmlsZSkKK3sKKyAgICBpZiAoZXh0ZXJuX2NhbGwoKSkKKyAgICAgICAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKKworICAgIGlmICghc3RyaW5ncChmaWxlKSB8fCAhdGhpc19wbGF5ZXIoKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBzdHJpbmcgdHh0ID0gcmVhZF9ieXRlcyhmaWxlLCAtKFRBSUxfTUFYX0JZVEVTICsgODApLCAoVEFJTF9NQVhfQllURVMgKyA4MCkpOworICAgIC8vIHJlYWRfYnl0ZXMoKSByZXR1cm5zIDAgaWYgdGhlIHN0YXJ0IG9mIHRoZSBzZWN0aW9uIGdpdmVuIGJ5CisgICAgLy8gcGFyYW1ldGVyICMyIGxpZXMgYmV5b25kIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUuCisgICAgLy8gSW4gdGhpcyBjYXNlIHdlIHNpbXBseSB0cnkgYW5kIHJlYWQgdGhlIGVudGlyZSBmaWxlLgorICAgIGlmICghc3RyaW5ncCh0eHQpICYmIGZpbGVfc2l6ZShmaWxlKSA8IFRBSUxfTUFYX0JZVEVTKzgwKQorICAgICAgdHh0ID0gcmVhZF9maWxlKGZpbGUpOworICAgIC8vIEV4aXQgaWYgc3RpbGwgbm90aGluZyBjb3VsZCBiZSByZWFkLgorICAgIGlmICghc3RyaW5ncCh0eHQpKQorICAgICAgcmV0dXJuIDA7CisKKyAgICAvLyBjdXQgb2ZmIGZpcnN0IChpbmNvbXBsZXRlKSBsaW5lCisgICAgaW50IGluZGV4ID0gc3Ryc3RyKHR4dCwgIlxuIik7CisgICAgaWYgKGluZGV4ID4gLTEpIHsKKyAgICAgICAgaWYgKGluZGV4ICsgMSA8IHNpemVvZih0eHQpKQorICAgICAgICAgICAgdHh0ID0gdHh0W2luZGV4KzEuLl07CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHR4dCA9ICIiOworICAgIH0KKworICAgIGVmdW46OnRlbGxfb2JqZWN0KHRoaXNfcGxheWVyKCksIHR4dCk7CisKKyAgICByZXR1cm4gMTsKK30KKyN1bmRlZiBUQUlMX01BWF9CWVRFUworI2VuZGlmIC8vIF9fVkVSU0lPTl9fID4gIjMuMy43MTkiCisKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL2RlYnVnX2luZm8uYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL2RlYnVnX2luZm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjA3YzJmCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvZGVidWdfaW5mby5jCkBAIC0wLDAgKzEsNDM0IEBACisvKiBUaGlzIHNlZnVuIGlzIHRvIHByb3ZpZGUgYSByZXBsYWNlbWVudCBmb3IgdGhlIGVmdW4gZGVidWdfaW5mbygpLgorICogRmVlbCBmcmVlIHRvIGFkZCBpdCB0byB5b3VyIG11ZGxpYnMsIGlmIHlvdSBoYXZlIG11Y2ggY29kZSByZWx5aW5nIG9uIHRoYXQuCisgKi8KKworI2lmICEgX19FRlVOX0RFRklORURfXyhkZWJ1Z19pbmZvKQorCisjaW5jbHVkZSA8ZHJpdmVyX2luZm8uaD4KKyNpbmNsdWRlIDxkZWJ1Z19pbmZvLmg+CisKK21peGVkIGRlYnVnX2luZm8oaW50IHdoYXQsIHZhcmFyZ3MgbWl4ZWQqIGFyZ3MpCit7CisgICAgaWYgKHNpemVvZihhcmdzKSA+IDIpCisgICAgICAgIHJhaXNlX2Vycm9yKCJUb28gbWFueSBhcmd1bWVudHMgdG8gZGVidWdfaW5mb1xuIik7CisKKyAgICBzd2l0Y2god2hhdCkKKyAgICB7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByYWlzZV9lcnJvcihzcHJpbnRmKCJJbGxlZ2FsIHZhbHVlICVkIGZvciBkZWJ1Z19pbmZvKCkuXG4iLCB3aGF0KSk7CisKKyAgICAgICAgY2FzZSBESU5GT19PQkpFQ1Q6CisgICAgICAgIHsKKyAgICAgICAgICAgIG9iamVjdCBvYjsKKworICAgICAgICAgICAgaWYgKHNpemVvZihhcmdzKSAhPSAxKQorICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKCJiYWQgbnVtYmVyIG9mIGFyZ3VtZW50cyB0byBkZWJ1Z19pbmZvXG4iKTsKKyAgICAgICAgICAgIGlmICghb2JqZWN0cChhcmdzWzBdKSkKKyAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFnIGFyZyAyIHRvIGRlYnVnX2luZm8oKS5cbiIpOworCisgICAgICAgICAgICBvYiA9IGFyZ3NbMF07CisgICAgICAgICAgICBwcmludGYoIk9fSEVBUlRfQkVBVCAgICAgIDogJXNcbiIsIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPQ19IRUFSVF9CRUFUKSAgICAgICA/ICJUUlVFIiA6ICJGQUxTRSIpOworICAgICAgICAgICAgcHJpbnRmKCJPX0VOQUJMRV9DT01NQU5EUyA6ICVzXG4iLCBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0NfQ09NTUFORFNfRU5BQkxFRCkgPyAiVFJVRSIgOiAiRkFMU0UiKTsKKyAgICAgICAgICAgIHByaW50ZigiT19DTE9ORSAgICAgICAgICAgOiAlc1xuIiwgZWZ1bjo6Y2xvbmVwKG9iKSAgICAgICAgICAgICAgICAgICAgICAgICAgID8gIlRSVUUiIDogIkZBTFNFIik7CisgICAgICAgICAgICBwcmludGYoIk9fREVTVFJVQ1RFRCAgICAgIDogRkFMU0VcbiIpOworICAgICAgICAgICAgcHJpbnRmKCJPX1NXQVBQRUQgICAgICAgICA6ICVzXG4iLCBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU1dBUFBFRCkgICAgICAgICAgPyAiVFJVRSIgOiAiRkFMU0UiKTsKKyAgICAgICAgICAgIHByaW50ZigiT19PTkNFX0lOVEVSQUNUSVZFOiAlc1xuIiwgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX09OQ0VfSU5URVJBQ1RJVkUpID8gIlRSVUUiIDogIkZBTFNFIik7CisgICAgICAgICAgICBwcmludGYoIk9fUkVTRVRfU1RBVEUgICAgIDogJXNcbiIsIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9SRVNFVF9TVEFURSkgICAgICA/ICJUUlVFIiA6ICJGQUxTRSIpOworICAgICAgICAgICAgcHJpbnRmKCJPX1dJTExfQ0xFQU5fVVAgICA6ICVzXG4iLCBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfV0lMTF9DTEVBTl9VUCkgICAgPyAiVFJVRSIgOiAiRkFMU0UiKTsKKyAgICAgICAgICAgIHByaW50ZigiT19SRVBMQUNFRCAgICAgICAgOiAlc1xuIiwgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1JFUExBQ0VEKSAgICAgICAgID8gIlRSVUUiIDogIkZBTFNFIik7CisgICAgICAgICAgICBwcmludGYoInRpbWVfcmVzZXQgIDogJWRcbiIsICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9ORVhUX1JFU0VUX1RJTUUpKTsKKyAgICAgICAgICAgIHByaW50ZigidGltZV9vZl9yZWYgOiAlZFxuIiwgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX0xBU1RfUkVGX1RJTUUpKTsKKyAgICAgICAgICAgIHByaW50ZigicmVmICAgICAgICAgOiAlZFxuIiwgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX09CSkVDVF9SRUZTKSk7CisKKyAgICAgICAgICAgIGludCBndGlja3MgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfR0lHQVRJQ0tTKTsKKyAgICAgICAgICAgIGlmKGd0aWNrcykKKyAgICAgICAgICAgICAgICBwcmludGYoImV2YWxjb3N0ICAgOiAgJWQlMDlkXG4iLCBndGlja3MsIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9USUNLUykpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHByaW50ZigiZXZhbGNvc3QgICA6ICAlZFxuIiwgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfVElDS1MpKTsKKworICAgICAgICAgICAgcHJpbnRmKCJzd2FwX251bSAgICA6ICVkXG4iLCAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU1dBUF9OVU0pKTsKKyAgICAgICAgICAgIHByaW50ZigibmFtZSAgICAgICAgOiAnJXMnXG4iLCAgICAgZWZ1bjo6b2JqZWN0X25hbWUob2IpKTsKKyAgICAgICAgICAgIHByaW50ZigibG9hZF9uYW1lICAgOiAnJXMnXG4iLCAgICAgZWZ1bjo6bG9hZF9uYW1lKG9iKSk7CisKKyAgICAgICAgICAgIG9iamVjdCBuZXh0X29iID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX09CSkVDVF9ORVhUKTsKKyAgICAgICAgICAgIGlmIChuZXh0X29iKQorICAgICAgICAgICAgICAgIHByaW50ZigibmV4dF9hbGwgICAgOiBPQkooJXMpXG4iLCBlZnVuOjpvYmplY3RfbmFtZShuZXh0X29iKSk7CisKKyAgICAgICAgICAgIG9iamVjdCBwcmV2X29iID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX09CSkVDVF9QUkVWKTsKKyAgICAgICAgICAgIGlmIChwcmV2X29iKQorICAgICAgICAgICAgICAgIHByaW50ZigiUHJldmlvdXMgb2JqZWN0IGluIG9iamVjdCBsaXN0OiBPQkooJXMpXG4iLCBlZnVuOjpvYmplY3RfbmFtZShwcmV2X29iKSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcHJpbnRmKCJUaGlzIG9iamVjdCBpcyB0aGUgaGVhZCBvZiB0aGUgb2JqZWN0IGxpc3QuXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBESU5GT19NRU1PUlk6CisgICAgICAgIHsKKyAgICAgICAgICAgIG9iamVjdCBvYjsKKworICAgICAgICAgICAgaWYgKHNpemVvZihhcmdzKSAhPSAxKQorICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKCJiYWQgbnVtYmVyIG9mIGFyZ3VtZW50cyB0byBkZWJ1Z19pbmZvXG4iKTsKKyAgICAgICAgICAgIGlmICghb2JqZWN0cChhcmdzWzBdKSkKKyAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFnIGFyZyAyIHRvIGRlYnVnX2luZm8oKS5cbiIpOworCisgICAgICAgICAgICBvYiA9IGFyZ3NbMF07CisKKyAgICAgICAgICAgIHByaW50ZigicHJvZ3JhbSByZWYncyAlM2RcbiIsICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1BST0dfUkVGUykpOworICAgICAgICAgICAgcHJpbnRmKCJOYW1lOiAnJXMnXG4iLCAgICAgICAgICBlZnVuOjpwcm9ncmFtX25hbWUob2IpKTsKKyAgICAgICAgICAgIHByaW50ZigicHJvZ3JhbSBzaXplICAgICU2ZFxuIiwgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1BST0dfU0laRSkpOworICAgICAgICAgICAgcHJpbnRmKCJudW0gZnVuYydzOiAgJTNkICglNGQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTlVNX0ZVTkNUSU9OUyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSVpFX0ZVTkNUSU9OUykpOworICAgICAgICAgICAgcHJpbnRmKCJudW0gdmFyczogICAgJTNkICglNGQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTlVNX1ZBUklBQkxFUyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSVpFX1ZBUklBQkxFUykpOworCisgICAgICAgICAgICBwcmludGYoIm51bSBzdHJpbmdzOiAlM2QgKCU0ZCkgOiBvdmVyaGVhZCAlZCArIGRhdGEgJWQgKCVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05VTV9TVFJJTkdTKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NJWkVfU1RSSU5HUykgKyBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0laRV9TVFJJTkdTX0RBVEEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0laRV9TVFJJTkdTKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NJWkVfU1RSSU5HU19EQVRBKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NJWkVfU1RSSU5HU19EQVRBX1RPVEFMKSk7CisKKyAgICAgICAgICAgIHByaW50ZigibnVtIGluaGVyaXRzICUzZCAoJTRkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05VTV9JTkhFUklURUQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0laRV9JTkhFUklURUQpKTsKKworICAgICAgICAgICAgcHJpbnRmKCJ0b3RhbCBzaXplICAgICAgJTZkXG4iLCBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfUFJPR19TSVpFX1RPVEFMKSk7CisKKyAgICAgICAgICAgIHByaW50ZigiZGF0YSBzaXplICAgICAgICU2ZCAoJTZkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfREFUQV9TSVpFKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX0RBVEFfU0laRV9UT1RBTCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIERJTkZPX09CSkxJU1Q6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzaXplb2YoYXJncykgPT0gMCkKKyAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFkIG51bWJlciBvZiBhcmd1bWVudHMgdG8gZGVidWdfaW5mb1xuIik7CisKKyAgICAgICAgICAgIGlmIChzaXplb2YoYXJncykgPT0gMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvYmplY3QgKiBvYnMgPSBlZnVuOjpvYmplY3RzKGFyZ3NbMF0sIDEpOworICAgICAgICAgICAgICAgIHJldHVybiBvYnNbMF07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIGVmdW46Om9iamVjdHMoYXJnc1swXSwgYXJnc1sxXSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgRElORk9fTUFMTE9DOgorICAgICAgICAgICAgd3JpdGUoZGVidWdfaW5mbyhESU5GT19TVEFUVVMsICJtYWxsb2MiKSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIERJTkZPX1NUQVRVUzoKKyAgICAgICAgeworICAgICAgICAgICAgc3RyaW5nIHdoaWNoOworICAgICAgICAgICAgaW50IG9wdDsKKworICAgICAgICAgICAgaWYgKHNpemVvZihhcmdzKSA+IDEpCisgICAgICAgICAgICAgICAgcmFpc2VfZXJyb3IoImJhZCBudW1iZXIgb2YgYXJndW1lbnRzIHRvIGRlYnVnX2luZm9cbiIpOworCisgICAgICAgICAgICBpZiAoIXNpemVvZihhcmdzKSB8fCAhYXJnc1swXSkKKyAgICAgICAgICAgICAgICB3aGljaCA9ICIiOworICAgICAgICAgICAgZWxzZSBpZihzdHJpbmdwKGFyZ3NbMF0pKQorICAgICAgICAgICAgICAgIHdoaWNoID0gYXJnc1swXTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFnIGFyZyAyIHRvIGRlYnVnX2luZm8oKS5cbiIpOworCisgICAgICAgICAgICBzd2l0Y2god2hpY2gpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAiIjoKKyAgICAgICAgICAgICAgICAgICAgb3B0ID0gRElfU1RBVFVTX1RFWFRfTUVNT1JZOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgInRhYmxlcyI6CisgICAgICAgICAgICAgICAgICAgIG9wdCA9IERJX1NUQVRVU19URVhUX1RBQkxFUzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlICJzd2FwIjoKKyAgICAgICAgICAgICAgICAgICAgb3B0ID0gRElfU1RBVFVTX1RFWFRfU1dBUDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlICJtYWxsb2MiOgorICAgICAgICAgICAgICAgICAgICBvcHQgPSBESV9TVEFUVVNfVEVYVF9NQUxMT0M7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAibWFsbG9jIGV4dHN0YXRzIjoKKyAgICAgICAgICAgICAgICAgICAgb3B0ID0gRElfU1RBVFVTX1RFWFRfTUFMTE9DX0VYVEVOREVEOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gZWZ1bjo6ZHJpdmVyX2luZm8ob3B0KTsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgRElORk9fRFVNUDoKKyAgICAgICAgeworICAgICAgICAgICAgaW50IG9wdDsKKworICAgICAgICAgICAgaWYgKCFzaXplb2YoYXJncykpCisgICAgICAgICAgICAgICAgcmFpc2VfZXJyb3IoImJhZCBudW1iZXIgb2YgYXJndW1lbnRzIHRvIGRlYnVnX2luZm9cbiIpOworCisgICAgICAgICAgICBpZighc3RyaW5ncChhcmdzWzBdKSkKKyAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFnIGFyZyAyIHRvIGRlYnVnX2luZm8oKS5cbiIpOworCisgICAgICAgICAgICBzd2l0Y2goYXJnc1swXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlICJvYmplY3RzIjoKKyAgICAgICAgICAgICAgICAgICAgb3B0ID0gRERJX09CSkVDVFM7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAiZGVzdHJ1Y3RlZCI6CisgICAgICAgICAgICAgICAgICAgIG9wdCA9IERESV9PQkpFQ1RTX0RFU1RSVUNURUQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAib3Bjb2RlcyI6CisgICAgICAgICAgICAgICAgICAgIG9wdCA9IERESV9PUENPREVTOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgIm1lbW9yeSI6CisgICAgICAgICAgICAgICAgICAgIG9wdCA9IERESV9NRU1PUlk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigiQmFkIGFyZ3VtZW50ICclcycgdG8gZGVidWdfaW5mbyhESU5GT19EVU1QKS5cbiIsIGFyZ3NbMF0pKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBlZnVuOjpkdW1wX2RyaXZlcl9pbmZvKG9wdCwgYXJnc1sxLi4xXS4uLik7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIERJTkZPX0RBVEE6CisgICAgICAgIHsKKyAgICAgICAgICAgIG1peGVkICogcmVzdWx0OworCisgICAgICAgICAgICBpZiAoIXNpemVvZihhcmdzKSkKKyAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFkIG51bWJlciBvZiBhcmd1bWVudHMgdG8gZGVidWdfaW5mb1xuIik7CisKKyAgICAgICAgICAgIGlmICghaW50cChhcmdzWzBdKSkKKyAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFnIGFyZyAyIHRvIGRlYnVnX2luZm8oKS5cbiIpOworCisgICAgICAgICAgICBpZiAoc2l6ZW9mKGFyZ3MpID09IDIgJiYgIWludHAoYXJnc1sxXSkpCisgICAgICAgICAgICAgICAgcmFpc2VfZXJyb3IoImJhZyBhcmcgMyB0byBkZWJ1Z19pbmZvKCkuXG4iKTsKKworICAgICAgICAgICAgc3dpdGNoKGFyZ3NbMF0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBESURfU1RBVFVTOgorICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBhbGxvY2F0ZShESURfU1RBVFVTX01BWCk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9BQ1RJT05TXSAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0FDVElPTlMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0FDVElPTlNfU0laRV0gICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX0FDVElPTlMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NIQURPV1NdICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU0hBRE9XUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU0hBRE9XU19TSVpFXSAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU0hBRE9XUyk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9PQkpFQ1RTXSAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX09CSkVDVFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX09CSkVDVFNfU0laRV0gICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX09CSkVDVFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX09CSkVDVFNfU1dBUFBFRF0gICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fT0JKRUNUU19TV0FQUEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9PQkpFQ1RTX1NXQVBfU0laRV0gICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9PQkpFQ1RTX1NXQVBQRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX09CSkVDVFNfTElTVF0gICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fT0JKRUNUU19JTl9MSVNUKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9PQkpFQ1RTX05FV0xZX0RFU1RdICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX09CSkVDVFNfTkVXTFlfREVTVFJVQ1RFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfT0JKRUNUU19ERVNUUlVDVEVEXSAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9PQkpFQ1RTX0RFU1RSVUNURUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX09CSkVDVFNfUFJPQ0VTU0VEXSAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fT0JKRUNUU19MQVNUX1BST0NFU1NFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfT0JKRUNUU19BVkdfUFJPQ10gICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX0xPQURfQVZFUkFHRV9QUk9DRVNTRURfT0JKRUNUU19SRUxBVElWRSk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9PVEFCTEVdICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX09CSkVDVFNfSU5fVEFCTEUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX09UQUJMRV9TTE9UU10gICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fT0JKRUNUX1RBQkxFX1NMT1RTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9PVEFCTEVfU0laRV0gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9PQkpFQ1RfVEFCTEUpOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfSEJFQVRfT0JKU10gICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9IRUFSVEJFQVRTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9IQkVBVF9DQUxMU10gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0hFQVJUQkVBVF9BQ1RJVkVfQ1lDTEVTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9IQkVBVF9DQUxMU19UT1RBTF0gICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0hFQVJUQkVBVF9UT1RBTF9DWUNMRVMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0hCRUFUX1NMT1RTXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fSEVBUlRCRUFUUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfSEJFQVRfU0laRV0gICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfSEVBUlRCRUFUUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfSEJFQVRfUFJPQ0VTU0VEXSAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9IRUFSVEJFQVRTX0xBU1RfUFJPQ0VTU0VEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9IQkVBVF9BVkdfUFJPQ10gICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTE9BRF9BVkVSQUdFX1BST0NFU1NFRF9IRUFSVEJFQVRTX1JFTEFUSVZFKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0NBTExPVVRTXSAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fQ0FMTE9VVFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0NBTExPVVRfU0laRV0gICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX0NBTExPVVRTKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0FSUkFZU10gICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fQVJSQVlTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9BUlJBWVNfU0laRV0gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9BUlJBWVMpOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfTUFQUElOR1NdICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9NQVBQSU5HUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfTUFQUElOR1NfU0laRV0gICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfTUFQUElOR1MpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0hZQlJJRF9NQVBQSU5HU10gICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fTUFQUElOR1NfSFlCUklEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9IQVNIX01BUFBJTkdTXSAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX01BUFBJTkdTX0hBU0gpOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSVUNUU10gICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TVFJVQ1RTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJVQ1RTX1NJWkVdICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TVFJVQ1RTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJVQ1RfVFlQRVNdICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NUUlVDVF9UWVBFUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSVUNUX1RZUEVTX1NJWkVdICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU1RSVUNUX1RZUEVTKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1BST0dTXSAgICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fUFJPR1MpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1BST0dTX1NJWkVdICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1BST0dTKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1BST0dTX1NXQVBQRURdICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fUFJPR1NfU1dBUFBFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfUFJPR1NfU1dBUF9TSVpFXSAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfUFJPR1NfU1dBUFBFRCk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9VU0VSX1JFU0VSVkVdICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTUVNT1JZX1JFU0VSVkVfVVNFUik7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfTUFTVEVSX1JFU0VSVkVdICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX01FTU9SWV9SRVNFUlZFX01BU1RFUik7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1lTVEVNX1JFU0VSVkVdICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX01FTU9SWV9SRVNFUlZFX1NZU1RFTSk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9BRERfTUVTU0FHRV0gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX01FU1NBR0VTX09VVCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfUEFDS0VUU10gICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9QQUNLRVRTX09VVCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfUEFDS0VUX1NJWkVdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfUEFDS0VUU19PVVQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1BBQ0tFVFNfSU5dICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fUEFDS0VUU19JTik7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfUEFDS0VUX1NJWkVfSU5dICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfUEFDS0VUU19JTik7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9BUFBMWV0gICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0ZVTkNUSU9OX05BTUVfQ0FMTFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0FQUExZX0hJVFNdICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fRlVOQ1RJT05fTkFNRV9DQUxMX0hJVFMpOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSSU5HU10gICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9WSVJUVUFMX1NUUklOR1MpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUklOR19TSVpFXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NUUklOR1MpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUl9UQUJMRV9TSVpFXSAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NUUklOR19UQUJMRSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSX09WRVJIRUFEXSAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU1RSSU5HX09WRVJIRUFEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9VTlRBQkxFRF0gICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NUUklOR1NfVU5UQUJMRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1VOVEFCTEVEX1NJWkVdICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NUUklOR1NfVU5UQUJMRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1RBQkxFRF0gICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1RSSU5HU19UQUJMRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1RBQkxFRF9TSVpFXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NUUklOR1NfVEFCTEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJfU0VBUkNIRVNdICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NUUklOR19UQUJMRV9MT09LVVBTX0JZX0lOREVYKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJfU0VBUkNITEVOXSAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NUUklOR19UQUJMRV9MT09LVVBfU1RFUFNfQllfSU5ERVgpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUl9TRUFSQ0hFU19CWVZBTFVFXSAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1RSSU5HX1RBQkxFX0xPT0tVUFNfQllfVkFMVUUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUl9TRUFSQ0hMRU5fQllWQUxVRV0gPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1RSSU5HX1RBQkxFX0xPT0tVUF9TVEVQU19CWV9WQUxVRSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSX0NIQUlOU10gICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TVFJJTkdfVEFCTEVfU0xPVFNfVVNFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSX0FEREVEXSAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TVFJJTkdfVEFCTEVfU1RSSU5HU19BRERFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSX0RFTEVURURdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TVFJJTkdfVEFCTEVfU1RSSU5HU19SRU1PVkVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJfQ09MTElTSU9OU10gICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NUUklOR19UQUJMRV9DT0xMSVNJT05TKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJfRk9VTkRdICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NUUklOR19UQUJMRV9ISVRTX0JZX0lOREVYKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJfRk9VTkRfQllWQUxVRV0gICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NUUklOR19UQUJMRV9ISVRTX0JZX1ZBTFVFKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1JYX0NBQ0hFRF0gICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fUkVHRVgpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1JYX1RBQkxFXSAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fUkVHRVhfVEFCTEVfU0xPVFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1JYX1RBQkxFX1NJWkVdICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1JFR0VYKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9SWF9SRVFVRVNUU10gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1JFR0VYX0xPT0tVUFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1JYX1JFUV9GT1VORF0gICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fUkVHRVhfTE9PS1VQX0hJVFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1JYX1JFUV9DT0xMXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fUkVHRVhfTE9PS1VQX0NPTExJU0lPTlMpOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfTUJfRklMRV0gICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfQlVGRkVSX0ZJTEUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX01CX1NXQVBdICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX0JVRkZFUl9TV0FQKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0JPT1RfVElNRV0gICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9CT09UX1RJTUUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgRElEX1NXQVA6CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGFsbG9jYXRlKERJRF9TV0FQX01BWCk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19QUk9HU10gICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1BST0dTX1NXQVBQRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX1BST0dfU0laRV0gICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1BST0dTX1NXQVBQRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX1BST0dfVU5TV0FQUEVEXSAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fUFJPR1NfVU5TV0FQUEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19QUk9HX1VfU0laRV0gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9QUk9HU19VTlNXQVBQRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX1ZBUlNdICAgICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fT0JKRUNUU19TV0FQUEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19WQVJfU0laRV0gICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9PQkpFQ1RTX1NXQVBQRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX0ZSRUVdICAgICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1dBUF9CTE9DS1NfRlJFRSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfRlJFRV9TSVpFXSAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU1dBUF9CTE9DS1NfRlJFRSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfRklMRV9TSVpFXSAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU1dBUF9CTE9DS1MpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX1JFVVNFRF0gICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NXQVBfQkxPQ0tTX1JFVVNFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfU0VBUkNIRVNdICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TV0FQX0JMT0NLU19SRVVTRV9MT09LVVBTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19TRUFSQ0hfTEVOXSAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NXQVBfQkxPQ0tTX1JFVVNFX0xPT0tVUF9TVEVQUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfRl9TRUFSQ0hFU10gICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TV0FQX0JMT0NLU19GUkVFX0xPT0tVUFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX0ZfU0VBUkNIX0xFTl0gICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1dBUF9CTE9DS1NfRlJFRV9MT09LVVBfU1RFUFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX0NPTVBBQ1RdICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhEQ19TV0FQX0NPTVBBQ1RfTU9ERSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfUkVDWUNMRV9GUkVFXSAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NXQVBfUkVDWUNMRV9QSEFTRSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBESURfTUVNT1JZOgorICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBhbGxvY2F0ZShESURfTUVNT1JZX01BWCk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fTkFNRV0gICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTUVNT1JZX0FMTE9DQVRPUl9OQU1FKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fU0JSS10gICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NZU19BTExPQ0FURURfQkxPQ0tTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fU0JSS19TSVpFXSAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TWVNfQUxMT0NBVEVEX0JMT0NLUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0xBUkdFXSAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9MQVJHRV9CTE9DS1NfQUxMT0NBVEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fTEFSR0VfU0laRV0gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9MQVJHRV9CTE9DS1NfQUxMT0NBVEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fTEZSRUVdICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0xBUkdFX0JMT0NLU19GUkVFKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fTEZSRUVfU0laRV0gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9MQVJHRV9CTE9DS1NfRlJFRSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0xXQVNURURdICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9MQVJHRV9CTE9DS1NfV0FTVEUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9MV0FTVEVEX1NJWkVdICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX0xBUkdFX0JMT0NLU19XQVNURSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0NIVU5LXSAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TTUFMTF9CTE9DS19DSFVOS1MpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9DSFVOS19TSVpFXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NNQUxMX0JMT0NLX0NIVU5LUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX1NNQUxMXSAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TTUFMTF9CTE9DS1NfQUxMT0NBVEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fU01BTExfU0laRV0gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TTUFMTF9CTE9DS1NfQUxMT0NBVEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fU0ZSRUVdICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NNQUxMX0JMT0NLU19GUkVFKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fU0ZSRUVfU0laRV0gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TTUFMTF9CTE9DS1NfRlJFRSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX1NXQVNURURdICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TTUFMTF9CTE9DS1NfV0FTVEUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9TV0FTVEVEX1NJWkVdICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NNQUxMX0JMT0NLU19XQVNURSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX01JTkNfQ0FMTFNdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9JTkNSRU1FTlRfU0laRV9DQUxMUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX01JTkNfU1VDQ0VTU10gICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9JTkNSRU1FTlRfU0laRV9DQUxMX1NVQ0NFU1NFUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX01JTkNfU0laRV0gICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfSU5DUkVNRU5UX1NJWkVfQ0FMTF9ESUZGUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX1BFUk1dICAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9VTk1BTkFHRURfQkxPQ0tTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fUEVSTV9TSVpFXSAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9VTk1BTkFHRURfQkxPQ0tTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fQ0xJQl0gICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1JFUExBQ0VNRU5UX01BTExPQ19DQUxMUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0NMSUJfU0laRV0gICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfUkVQTEFDRU1FTlRfTUFMTE9DX0NBTExTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fT1ZFUkhFQURdICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TTUFMTF9CTE9DS19PVkVSSEVBRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0FMTE9DQVRFRF0gICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfTUVNT1JZX1VTRUQpICsgZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9NRU1PUllfT1ZFUkhFQUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9VU0VEXSAgICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX01FTU9SWV9VU0VEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fVE9UQUxfVU5VU0VEXSAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9NRU1PUllfVU5VU0VEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fREVGUkFHX0NBTExTXSAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX01FTU9SWV9ERUZSQUdNRU5UQVRJT05fQ0FMTFNfRlVMTCkgKyBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fTUVNT1JZX0RFRlJBR01FTlRBVElPTl9DQUxMU19UQVJHRVRFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0RFRlJBR19DQUxMU19SRVFdICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9NRU1PUllfREVGUkFHTUVOVEFUSU9OX0NBTExTX1RBUkdFVEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fREVGUkFHX1JFUV9TVUNDRVNTXSAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX01FTU9SWV9ERUZSQUdNRU5UQVRJT05fQ0FMTF9UQVJHRVRfSElUUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0RFRlJBR19CTE9DS1NfSU5TUEVDVEVEXSA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9NRU1PUllfREVGUkFHTUVOVEFUSU9OX0JMT0NLU19JTlNQRUNURUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9ERUZSQUdfQkxPQ0tTX01FUkdFRF0gPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fTUVNT1JZX0RFRlJBR01FTlRBVElPTl9CTE9DS1NfTUVSR0VEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fREVGUkFHX0JMT0NLU19SRVNVTFRdID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX01FTU9SWV9ERUZSQUdNRU5UQVRJT05fQkxPQ0tTX1JFU1VMVElORyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0FWTF9OT0RFU10gICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9GUkVFX0JMT0NLU19BVkxfTk9ERVMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9FWFRfU1RBVElTVElDU10gICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9NRU1PUllfRVhURU5ERURfU1RBVElTVElDUyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc2l6ZW9mKGFyZ3MpID09IDIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGlkeCA9IGFyZ3NbMF07CisgICAgICAgICAgICAgICAgaWYgKGlkeCA8IDAgfHwgaWR4ID49IHNpemVvZihyZXN1bHQpKQorICAgICAgICAgICAgICAgICAgICByYWlzZV9lcnJvcihzcHJpbnRmKCJJbGxlZ2FsIGluZGV4IGZvciBkZWJ1Z19pbmZvKCk6ICVkLCBleHBlY3RlZCAwLi4lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlkeCwgc2l6ZW9mKHJlc3VsdCktMSkpOworCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdFtpZHhdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIERJTkZPX1RSQUNFOgorICAgICAgICB7CisgICAgICAgICAgICBpbnQgd2hpY2ggPSBESVRfQ1VSUkVOVDsKKworICAgICAgICAgICAgaWYgKHNpemVvZihhcmdzKSA+IDEpCisgICAgICAgICAgICAgICAgcmFpc2VfZXJyb3IoImJhZCBudW1iZXIgb2YgYXJndW1lbnRzIHRvIGRlYnVnX2luZm9cbiIpOworICAgICAgICAgICAgaWYgKHNpemVvZihhcmdzKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWludHAoYXJnc1swXSkpCisgICAgICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKCJiYWcgYXJnIDIgdG8gZGVidWdfaW5mbygpLlxuIik7CisgICAgICAgICAgICAgICAgd2hpY2ggPSBhcmdzWzBdOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKHdoaWNoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgRElUX0NVUlJFTlQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlZnVuOjpkcml2ZXJfaW5mbyhESV9UUkFDRV9DVVJSRU5UKTsKKworICAgICAgICAgICAgICAgIGNhc2UgRElUX0VSUk9SOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWZ1bjo6ZHJpdmVyX2luZm8oRElfVFJBQ0VfTEFTVF9FUlJPUikgfHwgKHsgIk5vIHRyYWNlLiIgfSk7CisKKyAgICAgICAgICAgICAgICBjYXNlIERJVF9VTkNBVUdIVF9FUlJPUjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVmdW46OmRyaXZlcl9pbmZvKERJX1RSQUNFX0xBU1RfVU5DQVVHSFRfRVJST1IpIHx8ICh7ICJObyB0cmFjZS4iIH0pOworCisgICAgICAgICAgICAgICAgY2FzZSBESVRfU1RSX0NVUlJFTlQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlZnVuOjpkcml2ZXJfaW5mbyhESV9UUkFDRV9DVVJSRU5UX0FTX1NUUklORyk7CisKKyAgICAgICAgICAgICAgICBjYXNlIERJVF9DVVJSRU5UX0RFUFRIOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWZ1bjo6ZHJpdmVyX2luZm8oRElfVFJBQ0VfQ1VSUkVOVF9ERVBUSCk7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFkIGFyZyAyIHRvIGRlYnVnX2luZm8oKS5cbiIpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICBjYXNlIERJTkZPX0VWQUxfTlVNQkVSOgorICAgICAgICAgICAgcmV0dXJuIGVmdW46OmRyaXZlcl9pbmZvKERJX0VWQUxfTlVNQkVSKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvZW5hYmxlX2NvbW1hbmRzLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9lbmFibGVfY29tbWFuZHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDFjOTYzCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvZW5hYmxlX2NvbW1hbmRzLmMKQEAgLTAsMCArMSwzMCBAQAorLyogVGhlc2Ugc2VmdW5zIGFyZSB0byBwcm92aWRlIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBlZnVucyBlbmFibGVfY29tbWFuZHMoKQorICogYW5kIGRpc2FibGVfY29tbWFuZHMoKS4KKyAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgorICovCisKKyNpbmNsdWRlIDxjb25maWd1cmF0aW9uLmg+CisKKyNpZiAhIF9fRUZVTl9ERUZJTkVEX18oZW5hYmxlX2NvbW1hbmRzKQorCit2b2lkIGVuYWJsZV9jb21tYW5kcygpCit7CisgICAgb2JqZWN0IG9iID0gZWZ1bjo6cHJldmlvdXNfb2JqZWN0KCk7CisKKyAgICBlZnVuOjpjb25maWd1cmVfb2JqZWN0KG9iLCBPQ19DT01NQU5EU19FTkFCTEVELCAxKTsKKyAgICBlZnVuOjpzZXRfdGhpc19wbGF5ZXIob2IpOworfQorCisjZW5kaWYKKworI2lmICEgX19FRlVOX0RFRklORURfXyhkaXNhYmxlX2NvbW1hbmRzKQorCit2b2lkIGRpc2FibGVfY29tbWFuZHMoKQoreworICAgIG9iamVjdCBvYiA9IGVmdW46OnByZXZpb3VzX29iamVjdCgpOworCisgICAgZWZ1bjo6Y29uZmlndXJlX29iamVjdChvYiwgT0NfQ09NTUFORFNfRU5BQkxFRCwgMCk7CisgICAgZWZ1bjo6c2V0X3RoaXNfcGxheWVyKDApOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL2hhc2guYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL2hhc2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWJiZjYwCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvaGFzaC5jCkBAIC0wLDAgKzEsMTcgQEAKKyNpbmNsdWRlICIvc3lzL3Rscy5oIgorCitkZXByZWNhdGVkIHN0cmluZyBtZDUobWl4ZWQgYXJnLCB2YXJhcmdzIG1peGVkKiBpdGVyYXRpb25zKQoreworICAgIGlmIChleHRlcm5fY2FsbCgpKQorICAgICAgICAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKKworICAgIHJldHVybiBoYXNoKFRMU19IQVNIX01ENSwgYXJnLCBpdGVyYXRpb25zLi4uKTsKK30KKworZGVwcmVjYXRlZCBzdHJpbmcgc2hhMShtaXhlZCBhcmcsIHZhcmFyZ3MgbWl4ZWQqIGl0ZXJhdGlvbnMpCit7CisgICAgaWYgKGV4dGVybl9jYWxsKCkpCisgICAgICAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOworCisgICAgcmV0dXJuIGhhc2goVExTX0hBU0hfU0hBMSwgYXJnLCBpdGVyYXRpb25zLi4uKTsKK30KZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL2xpdmluZ3MuYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL2xpdmluZ3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjBmY2VlCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvbGl2aW5ncy5jCkBAIC0wLDAgKzEsMzQ4IEBACisvLyAqIGxpdmluZ19uYW1lLUJlaGFuZGx1bmcKKworI2RlZmluZSBjbGVhbl9sb2cocykKKy8vI2RlZmluZSBjbGVhbl9sb2cocykgbG9nX2ZpbGUoIkNMRUFOX1NJTSIsY3RpbWUodGltZSgpKVs0Li4xOF0rIjogIisocykpOworCitwcml2YXRlIG5vc2F2ZSBtYXBwaW5nIGxpdmluZ19uYW1lX20sIG5hbWVfbGl2aW5nX20sIG5ldGRlYWQ7CisKK3ByaXZhdGUgdm9pZCBJbml0TGl2aW5nRGF0YShtaXhlZCB3aXppbmZvKSB7CisgIC8vIGxpdmluZ19uYW1lIGlzdCBlaW4gUG9pbnRlciBkZXIgYXVjaCBpbiBkZXIgZXh0cmFfd2l6aW5mbyBnZWhhbHRlbiAKKyAgLy8gd2lyZCwgc28ga2FubiBkaWUgc2ltdWxfZWZ1biBuZXUgZ2VsYWRlbiB3ZXJkZW4sIG9obmUgZGFzcyBkaWVzZXMKKyAgLy8gTWFwcGluZyB2ZXJsb3JlbiBnZWh0CisgIGlmICghbWFwcGluZ3AobGl2aW5nX25hbWVfbSA9IHdpemluZm9bTElWSU5HX05BTUVdKSkKKyAgICBsaXZpbmdfbmFtZV9tID0gd2l6aW5mb1tMSVZJTkdfTkFNRV0gPSBtX2FsbG9jYXRlKDAsIDEpOworCisgIC8vIEdsZWljaGVzIGdpbHQgZnVlciBkYXMgTWFwcGluZyBOYW1lLUxpdmluZworICBpZiAoIW1hcHBpbmdwKG5hbWVfbGl2aW5nX20gPSB3aXppbmZvW05BTUVfTElWSU5HXSkpCisgICAgbmFtZV9saXZpbmdfbSA9IHdpemluZm9bTkFNRV9MSVZJTkddID0gbV9hbGxvY2F0ZSgwLCAxKTsKKworICAvLyBOZXR6dG90ZSBzaW5kIGViZW5mYWxscyBpbiBkZXIgZXh0cmFfd2l6aW5mbworICBpZiAoIW1hcHBpbmdwKG5ldGRlYWQgPSB3aXppbmZvW05FVERFQURfTUFQXSkpCisgICAgbmV0ZGVhZCA9IHdpemluZm9bTkVUREVBRF9NQVBdID0gKFtdKTsKK30KKworcHVibGljIHZhcmFyZ3Mgc3RyaW5nIGdldHV1aWQoIG9iamVjdCBvYiApCit7CisgICAgbWl4ZWQgKnJldDsKKworICAgIGlmICggIW9iamVjdHAob2IpICkKKyAgICAgICBvYiA9IHByZXZpb3VzX29iamVjdCgpOworCisgICAgaWYgKCAhcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShvYikgKQorICAgICAgIHJldHVybiBnZXR1aWQob2IpOworCisgICAgcmV0ID0gKG1peGVkKW1hc3RlcigpLT5nZXRfdXNlcmluZm8oIGdldHVpZChvYikgKTsKKworICAgIGlmICggIXBvaW50ZXJwKHJldCkgfHwgc2l6ZW9mKHJldCkgPCA1ICkKKyAgICAgICByZXR1cm4gZ2V0dWlkKG9iKTsKKworICAgIC8vIFVzZXJuYW1lICsgIl8iICsgQ3JlYXRpb25EYXRlCisgICAgcmV0dXJuIHJldFswXSArICJfIiArIHJldFs1XTsKK30KKwordm9pZCBzZXRfb2JqZWN0X2xpdmluZ19uYW1lKHN0cmluZyBsaXZuYW1lLCBvYmplY3Qgb2JqKQoreworICBzdHJpbmcgb2xkOworICBtaXhlZCBhOworICBpbnQgaTsKKworICBpZiAocHJldmlvdXNfb2JqZWN0KCk9PW9iaiB8fCBwcmV2aW91c19vYmplY3QoKT09dGhpc19vYmplY3QoKSB8fAorICAgICAgcHJldmlvdXNfb2JqZWN0KCk9PW1hc3RlcigpKQorICB7CisgICAgaWYoIWxpdm5hbWUgfHwgIXN0cmluZ3AobGl2bmFtZSkpIHsKKyAgICAgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CisgICAgICByYWlzZV9lcnJvcihzcHJpbnRmKCIlTzogaWxsZWdhbCBsaXZpbmcgbmFtZTogJU9cbiIsIG9iaiwgbGl2bmFtZSkpOworICAgIH0KKyAgICBpZiAob2xkID0gbGl2aW5nX25hbWVfbVtvYmpdKSB7CisgICAgICBpZiAocG9pbnRlcnAoYSA9IG5hbWVfbGl2aW5nX21bb2xkXSkpIHsKKyAgICAgICBhW21lbWJlcihhLCBvYmopXSA9IDA7CisgICAgICB9IGVsc2UgeworICAgICAgIG1fZGVsZXRlKG5hbWVfbGl2aW5nX20sIG9sZCk7CisgICAgICB9CisgICAgfQorICAgIGxpdmluZ19uYW1lX21bb2JqXSA9IGxpdm5hbWU7CisgICAgaWYgKGEgPSBuYW1lX2xpdmluZ19tW2xpdm5hbWVdKSB7CisgICAgICBpZiAoIXBvaW50ZXJwKGEpKSB7CisgICAgICAgbmFtZV9saXZpbmdfbVtsaXZuYW1lXSA9ICh7YSwgb2JqfSk7CisgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgLyogVHJ5IHRvIHJlYWxsb2NhdGUgZW50cnkgZnJvbSBkZXN0cnVjdGVkIG9iamVjdCAqLworICAgICAgaWYgKChpID0gbWVtYmVyKGEsIDApKSA+PSAwKSB7CisgICAgICAgYVtpXSA9IG9iajsKKyAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBuYW1lX2xpdmluZ19tW2xpdm5hbWVdID0gYSArICh7b2JqfSk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIG5hbWVfbGl2aW5nX21bbGl2bmFtZV0gPSBvYmo7CisgIH0KK30KKwordm9pZCBzZXRfbGl2aW5nX25hbWUoc3RyaW5nIGxpdm5hbWUpCit7CisgIHNldF9vYmplY3RfbGl2aW5nX25hbWUobGl2bmFtZSxwcmV2aW91c19vYmplY3QoKSk7Cit9CisKK3ZvaWQgcmVtb3ZlX2xpdmluZ19uYW1lKCkKK3sKKyAgc3RyaW5nIGxpdm5hbWU7CisKKyAgaWYgKCFwcmV2aW91c19vYmplY3QoKSkKKyAgICByZXR1cm47CisgIGlmIChsaXZuYW1lPWxpdmluZ19uYW1lX21bcHJldmlvdXNfb2JqZWN0KCldKQorICB7CisgICAgbV9kZWxldGUobGl2aW5nX25hbWVfbSxwcmV2aW91c19vYmplY3QoKSk7CisgICAgaWYgKG9iamVjdHAobmFtZV9saXZpbmdfbVtsaXZuYW1lXSkpCisgICAgeworICAgICAgaWYgKG5hbWVfbGl2aW5nX21bbGl2bmFtZV09PXByZXZpb3VzX29iamVjdCgpKQorICAgICAgIG1fZGVsZXRlKG5hbWVfbGl2aW5nX20sbGl2bmFtZSk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChwb2ludGVycChuYW1lX2xpdmluZ19tW2xpdm5hbWVdKSkKKyAgICB7CisgICAgICBuYW1lX2xpdmluZ19tW2xpdm5hbWVdLT0oe3ByZXZpb3VzX29iamVjdCgpfSk7CisgICAgICBpZiAoIXNpemVvZihuYW1lX2xpdmluZ19tW2xpdm5hbWVdKSkKKyAgICAgICBtX2RlbGV0ZShuYW1lX2xpdmluZ19tLGxpdm5hbWUpOworICAgIH0KKyAgfQorfQorCit2b2lkIF9zZXRfbmV0ZGVhZCgpCit7CisgIGlmIChxdWVyeV9vbmNlX2ludGVyYWN0aXZlKHByZXZpb3VzX29iamVjdCgpKSkKKyAgICBuZXRkZWFkW2dldHVpZChwcmV2aW91c19vYmplY3QoKSldPXByZXZpb3VzX29iamVjdCgpOworfQorCit2b2lkIF9yZW1vdmVfbmV0ZGVhZCgpCit7CisgIG1fZGVsZXRlKG5ldGRlYWQsZ2V0dWlkKHByZXZpb3VzX29iamVjdCgpKSk7Cit9CisKK29iamVjdCBmaW5kX25ldGRlYWQoc3RyaW5nIHV1aWQpCit7CisgIGludCBpOworICBzdHJpbmcgdWlkOworICAvLyBXZW5uIHNzY2FuZigpIDIgbGllZmVydCwgaXN0IHV1aWQgYXVjaCBuZSB1dWlkLgorICBpbnQgaXNfdXVpZCA9IHNzY2FuZih1dWlkLCAiJXNfJWQiLCB1aWQsIGkpID09IDI7CisgIGlmICghaXNfdXVpZCkKKyAgICB1aWQgPSB1dWlkOworIAorICBpZiAoaXNfdXVpZCAmJiBnZXR1dWlkKG5ldGRlYWRbdWlkXSkgIT0gdXVpZCkKKyAgICAgIHJldHVybiAwOworCisgIHJldHVybiBuZXRkZWFkW3VpZF07Cit9CisKK3N0cmluZyAqZHVtcF9uZXRkZWFkKCkKK3sKKyAgcmV0dXJuIG1faW5kaWNlcyhuZXRkZWFkKTsKK30KKworb2JqZWN0IGZpbmRfbGl2aW5nKHN0cmluZyBsaXZuYW1lKSB7CisgIG1peGVkICphLCByOworICBpbnQgaTsKKworICBpZiAocG9pbnRlcnAociA9IG5hbWVfbGl2aW5nX21bbGl2bmFtZV0pKSB7CisgICAgaWYgKG1lbWJlcihyLDApPj0wKQorICAgICAgci09KHswfSk7CisgICAgaWYgKCFzaXplb2YocikpeworICAgICAgbV9kZWxldGUobmFtZV9saXZpbmdfbSxsaXZuYW1lKTsKKyAgICAgIGNsZWFuX2xvZyhzcHJpbnRmKCJmaW5kX2xpdmluZyBsb2VzY2h0ICVzXG4iLGxpdm5hbWUpKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoICFsaXZpbmcociA9IChhID0gcilbMF0pKSB7CisgICAgICBmb3IgKGkgPSBzaXplb2YoYSk7IC0taTspIHsKKyAgICAgICBpZiAobGl2aW5nKGFbPGldKSkgeworICAgICAgICAgciA9IGFbPGldOworICAgICAgICAgYVs8aV0gPSBhWzBdOworICAgICAgICAgcmV0dXJuIGFbMF0gPSByOworICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHI7CisgIH0KKyAgcmV0dXJuIGxpdmluZyhyKSAmJiByOworfQorCitvYmplY3QgKmZpbmRfbGl2aW5ncyhzdHJpbmcgbGl2bmFtZSkKK3sKKyAgbWl4ZWQgcjsKKworICBpZiAocG9pbnRlcnAocj1uYW1lX2xpdmluZ19tW2xpdm5hbWVdKSkKKyAgICByLT0oezB9KTsKKyAgZWxzZQorICAgIGlmIChvYmplY3RwKHIpKQorICAgICAgcj0oe3J9KTsKKyAgaWYgKCFwb2ludGVycChyKXx8IXNpemVvZihyKSkKKyAgICByZXR1cm4gMDsKKyAgcmV0dXJuIHI7Cit9CisKK29iamVjdCBmaW5kX3BsYXllcihzdHJpbmcgdXVpZCkgeworICBvYmplY3QgKm9ianM7CisgIG1peGVkIHJlczsKKyAgaW50IGk7CisgIHN0cmluZyB1aWQ7CisKKyAgaWYgKCFzdHJpbmdwKHV1aWQpKQorICAgIHJldHVybiAwOworICAvLyBXZW5uIHNzY2FuZigpIDIgbGllZmVydCwgaXN0IHV1aWQgYXVjaCBuZSB1dWlkLgorICBpbnQgaXNfdXVpZCA9IHNzY2FuZih1dWlkLCAiJXNfJWQiLCB1aWQsIGkpID09IDI7CisgIGlmICghaXNfdXVpZCkKKyAgICB1aWQgPSB1dWlkOworCisgIGlmIChwb2ludGVycChyZXMgPSBuYW1lX2xpdmluZ19tW3VpZF0pKSB7CisgICAgLy8gemVyc3RvZXJ0ZSBPYmpla3RlIGdnZi4gZW50ZmVybmVuCisgICAgaWYgKG1lbWJlcihyZXMsMCk+PTApIHsKKyAgICAgIHJlcy09KHswfSk7CisgICAgICBuYW1lX2xpdmluZ19tW3VpZF0gPSByZXM7CisgICAgfQorICAgIC8vIGdnZi4gTmFtZW4gb2huZSBPYmpla3RlIGVudGZlcm5lbi4KKyAgICBpZiAoIXNpemVvZihyZXMpKXsKKyAgICAgIG1fZGVsZXRlKG5hbWVfbGl2aW5nX20sdWlkKTsKKyAgICAgIGNsZWFuX2xvZyhzcHJpbnRmKCJmaW5kX3BsYXllciBsb2VzY2h0ICVzXG4iLHVpZCkpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIG9ianMgPSByZXM7CisgICAgcmVzID0gb2Jqc1swXTsKKyAgICAvLyBXZW5uIGRhcyAwLiBFbGVtZW50IGRlciBTcGllbGVyIGlzdCwgc2luZCB3aXIgZmVydGlnLiBBbnNvbnN0ZW4gc3VjaGVuCisgICAgLy8gd2lyIGRlbiBTcGllbGVyIHVuZCBzY2hpZWJlbiBpaG4gYW4gZGllIDAuIFN0ZWxsZSBpbSBBcnJheS4KKyAgICBpZiAoICFxdWVyeV9vbmNlX2ludGVyYWN0aXZlKHJlcykpIHsKKyAgICAgIGZvciAoaSA9IHNpemVvZihvYmpzKTsgLS1pOykgeworICAgICAgIGlmIChvYmpzWzxpXSAmJiBxdWVyeV9vbmNlX2ludGVyYWN0aXZlKG9ianNbPGldKSkgeworICAgICAgICAgcmVzID0gb2Jqc1s8aV07CisgICAgICAgICBvYmpzWzxpXSA9IG9ianNbMF07CisgICAgICAgICBvYmpzWzBdID0gcmVzOworICAgICAgICAgYnJlYWs7CisgICAgICAgfQorICAgICAgfQorICAgICAgcmVzID0gKG9iamVjdHAocmVzKSAmJiBxdWVyeV9vbmNlX2ludGVyYWN0aXZlKHJlcykpID8gcmVzIDogMDsKKyAgICB9CisgICAgLy8gZWxzZTogaW4gcmVzIHN0ZWh0IGRlciBTcGllbGVyIHNjaG9uLgorICB9CisgIGVsc2UgaWYgKG9iamVjdHAocmVzKSkgLy8gciBpc3QgbmVuIEVpbnplbG9iamVrdAorICAgIHJlcyA9IHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUocmVzKSA/IHJlcyA6IDA7CisKKyAgLy8gcmVzIGlzdCBqZXR6dCBnZ2YuIGRlciBTcGllbGVyLiBBYmVyIHdlbm4gZGVyIG5lIGFuZGVyZSBhbHMgZGllIGdlc3VjaHRlCisgIC8vIFVVSUQgaGF0LCBpc3QgZGFzIEVyZ2VibmlzIHRyb3R6ZGVtIDAuCisgIGlmIChpc191dWlkICYmIGdldHV1aWQocmVzKSE9dXVpZCkKKyAgICAgIHJldHVybiAwOworCisgIC8vIGVuZGxpY2ggZ2VmdW5kZW4KKyAgcmV0dXJuIHJlczsKK30KKworcHJpdmF0ZSBpbnQgY2hlY2tfbWF0Y2goIHN0cmluZyBzdHIsIGludCBwbGF5ZXJzX29ubHkgKQoreworICAgIG1peGVkIG1hdGNoOworCisgICAgaWYgKCAhKG1hdGNoID0gbmFtZV9saXZpbmdfbVtzdHJdKSApCisgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAoICFwb2ludGVycChtYXRjaCkgKQorICAgICAgIG1hdGNoID0gKHsgbWF0Y2ggfSk7CisKKyAgICBtYXRjaCAtPSAoezB9KTsKKworICAgIGlmICggc2l6ZW9mKG1hdGNoKSApeworICAgICAgIGlmICggcGxheWVyc19vbmx5ICkKKyAgICAgICAgICAgcmV0dXJuIHNpemVvZihmaWx0ZXIoIG1hdGNoLCAjJ3F1ZXJ5X29uY2VfaW50ZXJhY3RpdmUvKicqLyApKQorICAgICAgICAgICAgICA+IDA7CisgICAgICAgZWxzZQorICAgICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBtX2RlbGV0ZSggbmFtZV9saXZpbmdfbSwgc3RyICk7CisgICAgY2xlYW5fbG9nKCBzcHJpbnRmKCJjaGVja19tYXRjaCBsb2VzY2h0ICVzXG4iLCBzdHIpICk7CisgICAgcmV0dXJuIDA7Cit9CisKKy8vVE9ETzo6IHN0cmluZ3xzdHJpbmcqIGV4Y2x1ZGUKK3ZhcmFyZ3MgbWl4ZWQgbWF0Y2hfbGl2aW5nKCBzdHJpbmcgc3RyLCBpbnQgcGxheWVyc19vbmx5LCBtaXhlZCBleGNsdWRlICkKK3sKKyAgICBpbnQgaSwgczsKKyAgICBtaXhlZCBtYXRjaCwgKnVzZXI7CisKKyAgICBpZiAoICFzdHIgfHwgc3RyID09ICIiICkKKyAgICAgICByZXR1cm4gMDsKKworICAgIGlmICggIXBvaW50ZXJwKGV4Y2x1ZGUpICkKKyAgICAgICBleGNsdWRlID0gKHsgZXhjbHVkZSB9KTsKKworICAgIGlmICggbWVtYmVyKGV4Y2x1ZGUsIHN0cikgPCAwICYmIGNoZWNrX21hdGNoKHN0ciwgcGxheWVyc19vbmx5KSApCisgICAgICAgcmV0dXJuIHN0cjsKKworICAgIHVzZXIgPSBtX2luZGljZXMobmFtZV9saXZpbmdfbSk7CisgICAgcyA9IHNpemVvZihzdHIpOworICAgIG1hdGNoID0gMDsKKworICAgIGZvciAoIGkgPSBzaXplb2YodXNlcik7IGktLTsgKQorICAgICAgIGlmICggc3RyID09IHVzZXJbaV1bMC4ucy0xXSAmJiBtZW1iZXIoIGV4Y2x1ZGUsIHVzZXJbaV0gKSA8IDAgKQorICAgICAgICAgICBpZiAoIG1hdGNoICkKKyAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIGlmICggY2hlY2tfbWF0Y2godXNlcltpXSwgcGxheWVyc19vbmx5KSApCisgICAgICAgICAgICAgICAgICBtYXRjaCA9IHVzZXJbaV07CisKKyAgICBpZiAoICFtYXRjaCApCisgICAgICAgcmV0dXJuIC0yOworCisgICAgcmV0dXJuIG1hdGNoOworfQorCittaXhlZCAqZHVtcF9saXZpbmdzKCkKK3sKKyAgcmV0dXJuIHNvcnRfYXJyYXkobV9pbmRpY2VzKG5hbWVfbGl2aW5nX20pLCMnPik7Cit9CisKKy8vICogcmVnZWxtYWVzc2lnIExpc3RlbiB2b24gQmFsbGFzdCBiZWZyZWllbgorcHJpdmF0ZSB2b2lkIGNsZWFuX25hbWVfbGl2aW5nX20oc3RyaW5nICprZXlzLCBpbnQgbGVmdCwgaW50IG51bSkKK3sKKyAgaW50IGksIGo7CisgIG1peGVkIGE7CisKKyAgd2hpbGUgKGxlZnQgJiYgbnVtLS0pCisgIHsKKyAgICBpZiAocG9pbnRlcnAoYSA9IG5hbWVfbGl2aW5nX21ba2V5c1stLWxlZnRdXSkgJiYgbWVtYmVyKGEsIDApPj0wKQorICAgIHsKKyAgICAgIGEtPSh7MH0pOworICAgICAgbmFtZV9saXZpbmdfbVtrZXlzW2xlZnRdXSA9IGE7CisgICAgfQorICAgIGlmICghYSB8fCAocG9pbnRlcnAoYSkgJiYgIXNpemVvZihhKSkpCisgICAgeworICAgICAgY2xlYW5fbG9nKCJUb2FzdGluZyAiK2tleXNbbGVmdF0rIlxuIik7CisgICAgICBtX2RlbGV0ZShuYW1lX2xpdmluZ19tLCBrZXlzW2xlZnRdKTsKKyAgICB9IGVsc2UgY2xlYW5fbG9nKHNwcmludGYoIktFRVBJTkcgJXMgKCVPKVxuIixrZXlzW2xlZnRdLHBvaW50ZXJwKGEpP3NpemVvZihhKTphKSk7CisgIH0KKyAgaWYgKGxlZnQpCisgICAgZWZ1bjo6Y2FsbF9vdXQoIydjbGVhbl9uYW1lX2xpdmluZ19tLCAxLCBrZXlzLCBsZWZ0LCA4MCk7CisgIGVsc2UKKyAgICBjbGVhbl9sb2coIkNsZWFuIHByb2Nlc3MgZmluaXNoZWRcbiIpOworfQorCitwcml2YXRlIHZvaWQgY2xlYW5fbmV0ZGVhZCgpIHsKKyAgaW50IGk7CisgIHN0cmluZyAqczsKKyAgb2JqZWN0IG9iOworCisgIHM9bV9pbmRpY2VzKG5ldGRlYWQpOworICBmb3IgKGk9c2l6ZW9mKHMpLTE7aT49MDtpLS0pCisgICAgaWYgKCFvYmplY3RwKG9iPW5ldGRlYWRbc1tpXV0pIHx8IGludGVyYWN0aXZlKG9iKSkKKyAgICAgIG1fZGVsZXRlKG5ldGRlYWQsc1tpXSk7Cit9CisKK3ByaXZhdGUgdm9pZCBDbGVhbkxpdmluZ0RhdGEoKSB7CisgIGlmIChmaW5kX2NhbGxfb3V0KCMnY2xlYW5fbmFtZV9saXZpbmdfbSkgPCAwKSB7CisgICAgY2xlYW5fbG9nKCJTdGFydGluZyBjbGVhbiBwcm9jZXNzXG4iKTsKKyAgICBlZnVuOjpjYWxsX291dCgjJ2NsZWFuX25hbWVfbGl2aW5nX20sCisgICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgIG1faW5kaWNlcyhuYW1lX2xpdmluZ19tKSwKKyAgICAgICAgICAgICAgICAgc2l6ZW9mKG5hbWVfbGl2aW5nX20pLAorICAgICAgICAgICAgICAgICA4MAorICAgICAgICAgICAgICAgICApOworICB9CisgIGVmdW46OmNhbGxfb3V0KCMnY2xlYW5fbmV0ZGVhZCwyKTsKK30KKworI3VuZGVmIGNsZWFuX2xvZworCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9vYmplY3RfaW5mby5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvb2JqZWN0X2luZm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDdjMDA5Ci0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvb2JqZWN0X2luZm8uYwpAQCAtMCwwICsxLDEwNiBAQAorLyogVGhpcyBzZWZ1biBpcyB0byBwcm92aWRlIHRoZSBvbGQgc2VtYW50aWNzIG9mIHRoZSBlZnVuIG9iamVjdF9pbmZvKCkuCisgKiBGZWVsIGZyZWUgdG8gYWRkIGl0IHRvIHlvdXIgbXVkbGlicywgaWYgeW91IGhhdmUgbXVjaCBjb2RlIHJlbHlpbmcgb24gdGhhdC4KKyAqLworCisjaWYgX19FRlVOX0RFRklORURfXyhkcml2ZXJfaW5mbykgLyogTmV3ZXIgdmVyc2lvbiBpcyB0aGVyZSAqLworCisjaW5jbHVkZSA8b2JqZWN0aW5mby5oPgorI2luY2x1ZGUgPG9iamVjdF9pbmZvLmg+CisKK21peGVkIG9iamVjdF9pbmZvKG9iamVjdCBvYiwgaW50IHdoYXQsIHZhcmFyZ3MgaW50KiBpbmRleCkKK3sKKyAgICBtaXhlZCAqIHJlc3VsdDsKKworICAgIGlmIChzaXplb2YoaW5kZXgpID4gMSkKKyAgICAgICAgcmFpc2VfZXJyb3IoIlRvbyBtYW55IGFyZ3VtZW50cyB0byBvYmplY3RfaW5mb1xuIik7CisKKyAgICBzd2l0Y2god2hhdCkKKyAgICB7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByYWlzZV9lcnJvcihzcHJpbnRmKCJJbGxlZ2FsIHZhbHVlICVkIGZvciBvYmplY3RfaW5mbygpLlxuIiwgd2hhdCkpOworCisgICAgICAgIGNhc2UgT0lORk9fQkFTSUM6CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IGFsbG9jYXRlKE9JQl9NQVgpOworCisgICAgICAgICAgICByZXN1bHRbT0lCX0hFQVJUX0JFQVRdICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPQ19IRUFSVF9CRUFUKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfSVNfV0laQVJEXSAgICAgICAgID0gMDsgICAvKiBOb3Qgc3VwcG9ydGVkIGFueW1vcmUuICovCisgICAgICAgICAgICByZXN1bHRbT0lCX0VOQUJMRV9DT01NQU5EU10gICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPQ19DT01NQU5EU19FTkFCTEVEKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfQ0xPTkVdICAgICAgICAgICAgID0gZWZ1bjo6Y2xvbmVwKG9iKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfREVTVFJVQ1RFRF0gICAgICAgID0gMDsgICAvKiBOb3QgcG9zc2libGUgYW55bW9yZS4gKi8KKyAgICAgICAgICAgIHJlc3VsdFtPSUJfU1dBUFBFRF0gICAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NXQVBQRUQpOworICAgICAgICAgICAgcmVzdWx0W09JQl9PTkNFX0lOVEVSQUNUSVZFXSAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfT05DRV9JTlRFUkFDVElWRSk7CisgICAgICAgICAgICByZXN1bHRbT0lCX1JFU0VUX1NUQVRFXSAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9SRVNFVF9TVEFURSk7CisgICAgICAgICAgICByZXN1bHRbT0lCX1dJTExfQ0xFQU5fVVBdICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9XSUxMX0NMRUFOX1VQKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfTEFNQkRBX1JFRkVSRU5DRURdID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX0xBTUJEQV9SRUZFUkVOQ0VEKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfU0hBRE9XXSAgICAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NIQURPV19QUkVWKSAmJiAxOworICAgICAgICAgICAgcmVzdWx0W09JQl9SRVBMQUNFRF0gICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfUkVQTEFDRUQpOworICAgICAgICAgICAgcmVzdWx0W09JQl9ORVhUX1JFU0VUXSAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTkVYVF9SRVNFVF9USU1FKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfVElNRV9PRl9SRUZdICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX0xBU1RfUkVGX1RJTUUpOworICAgICAgICAgICAgcmVzdWx0W09JQl9SRUZdICAgICAgICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfT0JKRUNUX1JFRlMpOworICAgICAgICAgICAgcmVzdWx0W09JQl9HSUdBVElDS1NdICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfR0lHQVRJQ0tTKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfVElDS1NdICAgICAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1RJQ0tTKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfU1dBUF9OVU1dICAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NXQVBfTlVNKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfUFJPR19TV0FQUEVEXSAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1BST0dfU1dBUFBFRCk7CisgICAgICAgICAgICByZXN1bHRbT0lCX1ZBUl9TV0FQUEVEXSAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9WQVJfU1dBUFBFRCk7CisgICAgICAgICAgICByZXN1bHRbT0lCX05BTUVdICAgICAgICAgICAgICA9IGVmdW46Om9iamVjdF9uYW1lKG9iKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfTE9BRF9OQU1FXSAgICAgICAgID0gZWZ1bjo6bG9hZF9uYW1lKG9iKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfTkVYVF9BTExdICAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX09CSkVDVF9ORVhUKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfUFJFVl9BTExdICAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX09CSkVDVF9QUkVWKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfTkVYVF9DTEVBTlVQXSAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05FWFRfQ0xFQU5VUF9USU1FKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBPSU5GT19QT1NJVElPTjoKKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ID0gYWxsb2NhdGUoT0lQX01BWCk7CisKKyAgICAgICAgICAgIHJlc3VsdFtPSVBfTkVYVF0gPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfT0JKRUNUX05FWFQpOworICAgICAgICAgICAgcmVzdWx0W09JUF9QUkVWXSA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9PQkpFQ1RfUFJFVik7CisgICAgICAgICAgICByZXN1bHRbT0lQX1BPU10gID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX09CSkVDVF9QT1MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIE9JTkZPX01FTU9SWToKKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ID0gYWxsb2NhdGUoT0lNX01BWCk7CisKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fUkVGXSAgICAgICAgICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9QUk9HX1JFRlMpOworICAgICAgICAgICAgcmVzdWx0W09JTV9OQU1FXSAgICAgICAgICAgICAgID0gZWZ1bjo6cHJvZ3JhbV9uYW1lKG9iKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fUFJPR19TSVpFXSAgICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9QUk9HX1NJWkUpOworICAgICAgICAgICAgcmVzdWx0W09JTV9OVU1fRlVOQ1RJT05TXSAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05VTV9GVU5DVElPTlMpOworICAgICAgICAgICAgcmVzdWx0W09JTV9TSVpFX0ZVTkNUSU9OU10gICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NJWkVfRlVOQ1RJT05TKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fTlVNX1ZBUklBQkxFU10gICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9OVU1fVkFSSUFCTEVTKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fU0laRV9WQVJJQUJMRVNdICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSVpFX1ZBUklBQkxFUyk7CisgICAgICAgICAgICByZXN1bHRbT0lNX05VTV9TVFJJTkdTXSAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTlVNX1NUUklOR1MpOworICAgICAgICAgICAgcmVzdWx0W09JTV9TSVpFX1NUUklOR1NdICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NJWkVfU1RSSU5HUyk7CisgICAgICAgICAgICByZXN1bHRbT0lNX1NJWkVfU1RSSU5HU19EQVRBXSAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0laRV9TVFJJTkdTX0RBVEEpOworICAgICAgICAgICAgcmVzdWx0W09JTV9TSVpFX1NUUklOR1NfVE9UQUxdID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NJWkVfU1RSSU5HU19EQVRBX1RPVEFMKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fTlVNX0lOSEVSSVRFRF0gICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9OVU1fSU5IRVJJVEVEKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fU0laRV9JTkhFUklURURdICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSVpFX0lOSEVSSVRFRCk7CisgICAgICAgICAgICByZXN1bHRbT0lNX1RPVEFMX1NJWkVdICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfUFJPR19TSVpFX1RPVEFMKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fREFUQV9TSVpFXSAgICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9EQVRBX1NJWkUpOworICAgICAgICAgICAgcmVzdWx0W09JTV9UT1RBTF9EQVRBX1NJWkVdICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX0RBVEFfU0laRV9UT1RBTCk7CisgICAgICAgICAgICByZXN1bHRbT0lNX05PX0lOSEVSSVRdICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTk9fSU5IRVJJVCk7CisgICAgICAgICAgICByZXN1bHRbT0lNX05PX0NMT05FXSAgICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTk9fQ0xPTkUpOworICAgICAgICAgICAgcmVzdWx0W09JTV9OT19TSEFET1ddICAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05PX1NIQURPVyk7CisgICAgICAgICAgICByZXN1bHRbT0lNX05VTV9JTkNMVURFU10gICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTlVNX0lOQ0xVREVEKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fU0hBUkVfVkFSSUFCTEVTXSAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSEFSRV9WQVJJQUJMRVMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoc2l6ZW9mKGluZGV4KSkKKyAgICB7CisgICAgICAgIGludCBpZHggPSBpbmRleFswXTsKKyAgICAgICAgaWYgKGlkeCA8IDAgfHwgaWR4ID49IHNpemVvZihyZXN1bHQpKQorICAgICAgICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigiSWxsZWdhbCBpbmRleCBmb3Igb2JqZWN0X2luZm8oKTogJWQsIGV4cGVjdGVkIDAuLiVkXG4iLAorICAgICAgICAgICAgICAgIGlkeCwgc2l6ZW9mKHJlc3VsdCktMSkpOworCisgICAgICAgIHJldHVybiByZXN1bHRbaWR4XTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXR1cm4gcmVzdWx0OworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3F1ZXJ5X2VkaXRpbmcuYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3F1ZXJ5X2VkaXRpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTQ2ZGNkCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvcXVlcnlfZWRpdGluZy5jCkBAIC0wLDAgKzEsMTcgQEAKKy8qIFRoaXMgc2VmdW4gaXMgdG8gcHJvdmlkZSBhIHJlcGxhY2VtZW50IGZvciB0aGUgZWZ1biBxdWVyeV9lZGl0aW5nKCkuCisgKiBGZWVsIGZyZWUgdG8gYWRkIGl0IHRvIHlvdXIgbXVkbGlicywgaWYgeW91IGhhdmUgbXVjaCBjb2RlIHJlbHlpbmcgb24gdGhhdC4KKyAqLworCisjaWYgISBfX0VGVU5fREVGSU5FRF9fKHF1ZXJ5X2VkaXRpbmcpCisKKyNpbmNsdWRlIDxpbnRlcmFjdGl2ZV9pbmZvLmg+CisKK2ludHxvYmplY3QgcXVlcnlfZWRpdGluZyhvYmplY3Qgb2IpCit7CisgICAgaWYoIWVmdW46OmludGVyYWN0aXZlKG9iKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyhvYiwgSUlfRURJVElORyk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvcXVlcnlfaWRsZS5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvcXVlcnlfaWRsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzYTMyYWUKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9xdWVyeV9pZGxlLmMKQEAgLTAsMCArMSwxNCBAQAorLyogVGhpcyBzZWZ1biBpcyB0byBwcm92aWRlIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBlZnVuIHF1ZXJ5X2lkbGUoKS4KKyAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgorICovCisKKyNpZiAhIF9fRUZVTl9ERUZJTkVEX18ocXVlcnlfaWRsZSkKKworI2luY2x1ZGUgPGludGVyYWN0aXZlX2luZm8uaD4KKworaW50IHF1ZXJ5X2lkbGUob2JqZWN0IG9iKQoreworICAgIHJldHVybiBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKG9iLCBJSV9JRExFKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9xdWVyeV9pbnB1dF9wZW5kaW5nLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9xdWVyeV9pbnB1dF9wZW5kaW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ4YzMxMQotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3F1ZXJ5X2lucHV0X3BlbmRpbmcuYwpAQCAtMCwwICsxLDE3IEBACisvKiBUaGlzIHNlZnVuIGlzIHRvIHByb3ZpZGUgYSByZXBsYWNlbWVudCBmb3IgdGhlIGVmdW4gcXVlcnlfaW5wdXRfcGVuZGluZygpLgorICogRmVlbCBmcmVlIHRvIGFkZCBpdCB0byB5b3VyIG11ZGxpYnMsIGlmIHlvdSBoYXZlIG11Y2ggY29kZSByZWx5aW5nIG9uIHRoYXQuCisgKi8KKworI2lmICEgX19FRlVOX0RFRklORURfXyhxdWVyeV9pbnB1dF9wZW5kaW5nKQorCisjaW5jbHVkZSA8aW50ZXJhY3RpdmVfaW5mby5oPgorCitvYmplY3QgcXVlcnlfaW5wdXRfcGVuZGluZyhvYmplY3Qgb2IpCit7CisgICAgaWYoIWVmdW46OmludGVyYWN0aXZlKG9iKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyhvYiwgSUlfSU5QVVRfUEVORElORyk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvcXVlcnlfaXBfbmFtZS5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvcXVlcnlfaXBfbmFtZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlNzRlYTAKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9xdWVyeV9pcF9uYW1lLmMKQEAgLTAsMCArMSw0OCBAQAorLyogVGhpcyBzZWZ1biBpcyB0byBwcm92aWRlIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBlZnVucyBxdWVyeV9pcF9uYW1lKCkgYW5kCisgKiBxdWVyeV9pcF9udW1iZXIoKS4KKyAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgorICovCisKKyNpZiAhIF9fRUZVTl9ERUZJTkVEX18ocXVlcnlfaXBfbmFtZSkKKworI2luY2x1ZGUgPGludGVyYWN0aXZlX2luZm8uaD4KKworcHJpdmF0ZSB2YXJhcmdzIHN0cmluZyBfcXVlcnlfaXBfbmFtZShvYmplY3QgcGxheWVyKQoreworICAgIG9iamVjdCBvYiA9IHBsYXllcjsKKyAgICBvYiB8fD0gZWZ1bjo6dGhpc19wbGF5ZXIoKTsKKworICAgIHBsYXllciA9IGVmdW46OmludGVyYWN0aXZlX2luZm8ob2IsIElJX0lQX0FERFJFU1MpOworICAgIHJldHVybiBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKG9iLCBJSV9JUF9OQU1FKTsKK30KKworcHJpdmF0ZSB2YXJhcmdzIHN0cmluZyBfcXVlcnlfaXBfbnVtYmVyKG9iamVjdCBwbGF5ZXIpCit7CisgICAgb2JqZWN0IG9iID0gcGxheWVyOworICAgIG9iIHx8PSBlZnVuOjp0aGlzX3BsYXllcigpOworCisgICAgcGxheWVyID0gZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyhvYiwgSUlfSVBfQUREUkVTUyk7CisgICAgcmV0dXJuIGVmdW46OmludGVyYWN0aXZlX2luZm8ob2IsIElJX0lQX05VTUJFUik7Cit9CisKKy8vICogSGVya3VuZnRzLUVybWl0dGx1bmcKK3N0cmluZyBxdWVyeV9pcF9udW1iZXIob2JqZWN0IG9iKQoreworICBvYj0gb2IgfHwgdGhpc19wbGF5ZXIoKTsKKyAgaWYgKCFvYmplY3RwKG9iKSB8fCAhaW50ZXJhY3RpdmUob2IpKSByZXR1cm4gMDsKKyAgaWYob2ItPnF1ZXJ5X3JlYWxpcCgpICYmIChzdHJpbmcpb2ItPnF1ZXJ5X3JlYWxpcCgpIT0iIikKKyAgeworICAgIHJldHVybiAoc3RyaW5nKW9iLT5xdWVyeV9yZWFsaXAoKTsKKyAgfQorICByZXR1cm4gX3F1ZXJ5X2lwX251bWJlcihvYik7Cit9CisKK3N0cmluZyBxdWVyeV9pcF9uYW1lKG1peGVkIG9iKQoreworICBpZiAoICFvYiB8fCBvYmplY3RwKG9iKSApCisgICAgICBvYj1fcXVlcnlfaXBfbnVtYmVyKG9iKTsKKyAgcmV0dXJuIChzdHJpbmcpIi9wL2RhZW1vbi9pcGxvb2t1cCItPmhvc3Qob2IpOworfQorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvcXVlcnlfbGltaXRzLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9xdWVyeV9saW1pdHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2JmMzkwCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvcXVlcnlfbGltaXRzLmMKQEAgLTAsMCArMSwxNCBAQAorLyogVGhpcyBzZWZ1biBpcyB0byBwcm92aWRlIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBlZnVuIHF1ZXJ5X2xpbWl0cygpLgorICogRmVlbCBmcmVlIHRvIGFkZCBpdCB0byB5b3VyIG11ZGxpYnMsIGlmIHlvdSBoYXZlIG11Y2ggY29kZSByZWx5aW5nIG9uIHRoYXQuCisgKi8KKworI2lmICEgX19FRlVOX0RFRklORURfXyhxdWVyeV9saW1pdHMpCisKKyNpbmNsdWRlIDxkcml2ZXJfaW5mby5oPgorCit2YXJhcmdzIGludCogcXVlcnlfbGltaXRzKGludCBkZWYpCit7CisgICAgcmV0dXJuIGVmdW46OmRyaXZlcl9pbmZvKGRlZiA/IERDX0RFRkFVTFRfUlVOVElNRV9MSU1JVFMgOiBESV9DVVJSRU5UX1JVTlRJTUVfTElNSVRTKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9xdWVyeV9sb2FkX2F2ZXJhZ2UuYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3F1ZXJ5X2xvYWRfYXZlcmFnZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiMzZmMGUKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9xdWVyeV9sb2FkX2F2ZXJhZ2UuYwpAQCAtMCwwICsxLDE2IEBACisvKiBUaGlzIHNlZnVuIGlzIHRvIHByb3ZpZGUgYSByZXBsYWNlbWVudCBmb3IgdGhlIGVmdW4gcXVlcnlfbG9hZF9hdmVyYWdlKCkuCisgKiBGZWVsIGZyZWUgdG8gYWRkIGl0IHRvIHlvdXIgbXVkbGlicywgaWYgeW91IGhhdmUgbXVjaCBjb2RlIHJlbHlpbmcgb24gdGhhdC4KKyAqLworCisjaWYgISBfX0VGVU5fREVGSU5FRF9fKHF1ZXJ5X2xvYWRfYXZlcmFnZSkKKworI2luY2x1ZGUgPGRyaXZlcl9pbmZvLmg+CisKK3N0cmluZyBxdWVyeV9sb2FkX2F2ZXJhZ2UoKQoreworICAgIHJldHVybiBlZnVuOjpzcHJpbnRmKCIlLjJmIGNtZHMvcywgJS4yZiBjb21wIGxpbmVzL3MiLAorICAgICAgICBlZnVuOjpkcml2ZXJfaW5mbyhESV9MT0FEX0FWRVJBR0VfQ09NTUFORFMpLAorICAgICAgICBlZnVuOjpkcml2ZXJfaW5mbyhESV9MT0FEX0FWRVJBR0VfTElORVMpKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9xdWVyeV9tdWRfcG9ydC5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvcXVlcnlfbXVkX3BvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmYwMDlkCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvcXVlcnlfbXVkX3BvcnQuYwpAQCAtMCwwICsxLDM1IEBACisvKiBUaGlzIHNlZnVuIGlzIHRvIHByb3ZpZGUgYSByZXBsYWNlbWVudCBmb3IgdGhlIGVmdW4gcXVlcnlfbXVkX3BvcnQoKS4KKyAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgorICovCisKKyNpZiAhIF9fRUZVTl9ERUZJTkVEX18ocXVlcnlfbXVkX3BvcnQpCisKKyNpbmNsdWRlIDxpbnRlcmFjdGl2ZV9pbmZvLmg+CisjaW5jbHVkZSA8ZHJpdmVyX2luZm8uaD4KKworaW50IHF1ZXJ5X211ZF9wb3J0KHZhcmFyZ3MgaW50KnxvYmplY3QqIGFyZ3MpCit7CisgICAgaWYoIXNpemVvZihhcmdzKSAmJiBlZnVuOjp0aGlzX3BsYXllcigpICYmIGVmdW46OmludGVyYWN0aXZlKHRoaXNfcGxheWVyKCkpKQorICAgICAgICByZXR1cm4gZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyh0aGlzX3BsYXllcigpLCBJSV9NVURfUE9SVCk7CisKKyAgICBpZihzaXplb2YoYXJncykgPiAxKQorICAgICAgICByYWlzZV9lcnJvcigiVG9vIG1hbnkgYXJndW1lbnRzIHRvIHF1ZXJ5X211ZF9wb3J0XG4iKTsKKworICAgIGlmKHNpemVvZihhcmdzKSAmJiBlZnVuOjpvYmplY3RwKGFyZ3NbMF0pICYmIGVmdW46OmludGVyYWN0aXZlKGFyZ3NbMF0pKQorICAgICAgICByZXR1cm4gZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyhhcmdzWzBdLCBJSV9NVURfUE9SVCk7CisKKyAgICBpZihzaXplb2YoYXJncykgJiYgaW50cChhcmdzWzBdKSkKKyAgICB7CisgICAgICAgIGludCogcG9ydHMgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9NVURfUE9SVFMpOworICAgICAgICBpZihhcmdzWzBdIDwgLTEgfHwgYXJnc1swXSA+PSBzaXplb2YocG9ydHMpKQorICAgICAgICAgICAgcmFpc2VfZXJyb3IoZWZ1bjo6c3ByaW50ZigiQmFkIGFyZyAxIHRvIHF1ZXJ5X211ZF9wb3J0KCk6IHZhbHVlICVkIG91dCBvZiByYW5nZS5cbiIsIGFyZ3NbMF0pKTsKKyAgICAgICAgZWxzZSBpZihhcmdzWzBdID09IC0xKQorICAgICAgICAgICAgcmV0dXJuIHNpemVvZihwb3J0cyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBwb3J0c1thcmdzWzBdXTsKKyAgICB9CisKKyAgICByZXR1cm4gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTVVEX1BPUlRTKVswXTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9xdWVyeV9vbmNlX2ludGVyYWN0aXZlLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9xdWVyeV9vbmNlX2ludGVyYWN0aXZlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM3ODI5ZgotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3F1ZXJ5X29uY2VfaW50ZXJhY3RpdmUuYwpAQCAtMCwwICsxLDE0IEBACisvKiBUaGlzIHNlZnVuIGlzIHRvIHByb3ZpZGUgYSByZXBsYWNlbWVudCBmb3IgdGhlIGVmdW4gcXVlcnlfb25jZV9pbnRlcmFjdGl2ZSgpLgorICogRmVlbCBmcmVlIHRvIGFkZCBpdCB0byB5b3VyIG11ZGxpYnMsIGlmIHlvdSBoYXZlIG11Y2ggY29kZSByZWx5aW5nIG9uIHRoYXQuCisgKi8KKworI2lmICEgX19FRlVOX0RFRklORURfXyhxdWVyeV9vbmNlX2ludGVyYWN0aXZlKQorCisjaW5jbHVkZSA8b2JqZWN0X2luZm8uaD4KKworaW50IHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUob2JqZWN0IG9iKQoreworICAgIHJldHVybiBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfT05DRV9JTlRFUkFDVElWRSk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvcXVlcnlfc25vb3AuYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3F1ZXJ5X3Nub29wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZhNjljMAotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3F1ZXJ5X3Nub29wLmMKQEAgLTAsMCArMSwzMCBAQAorLyogVGhpcyBzZWZ1biBpcyB0byBwcm92aWRlIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBlZnVuIHF1ZXJ5X3Nub29wKCkuCisgKiBGZWVsIGZyZWUgdG8gYWRkIGl0IHRvIHlvdXIgbXVkbGlicywgaWYgeW91IGhhdmUgbXVjaCBjb2RlIHJlbHlpbmcgb24gdGhhdC4KKyAqLworCisKKyNpbmNsdWRlIDxpbnRlcmFjdGl2ZV9pbmZvLmg+CisKK3ByaXZhdGUgb2JqZWN0IF9xdWVyeV9zbm9vcChvYmplY3Qgb2IpCit7CisgICAgaWYoIWVmdW46OmludGVyYWN0aXZlKG9iKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBvYmplY3QgcHJldiA9IGVmdW46OnByZXZpb3VzX29iamVjdCgpOworICAgIGVmdW46OnNldF90aGlzX29iamVjdChwcmV2KTsKKyNpZiAhIF9fRUZVTl9ERUZJTkVEX18ocXVlcnlfc25vb3ApCisgICAgcmV0dXJuIGVmdW46OmludGVyYWN0aXZlX2luZm8ob2IsIElJX1NOT09QX05FWFQpOworI2Vsc2UKKyAgICByZXR1cm4gZWZ1bjo6cXVlcnlfc25vb3Aob2IpOworI2VuZGlmCit9CisKK25vbWFzayBvYmplY3QgcXVlcnlfc25vb3Aob2JqZWN0IHdobykgeworICBvYmplY3Qgc25vb3BlcjsKKworICBzbm9vcGVyPV9xdWVyeV9zbm9vcCh3aG8pOworICBpZiAoIXNub29wZXIpIHJldHVybiAwOworICBpZiAocXVlcnlfd2l6X2dycChzbm9vcGVyKT5xdWVyeV93aXpfZ3JwKGdldHVpZChwcmV2aW91c19vYmplY3QoKSkpICYmCisgICAgICBJU19BUkNIKHNub29wZXIpKSByZXR1cm4gMDsKKyAgcmV0dXJuIHNub29wZXI7Cit9CmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zZXRfaGVhcnRfYmVhdC5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc2V0X2hlYXJ0X2JlYXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzk5NWViCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc2V0X2hlYXJ0X2JlYXQuYwpAQCAtMCwwICsxLDI0IEBACisvKiBUaGlzIHNlZnVuIGlzIHRvIHByb3ZpZGUgYSByZXBsYWNlbWVudCBmb3IgdGhlIGVmdW4gc2V0X2hlYXJ0X2JlYXQoKS4KKyAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgorICovCisKKyNpZiAhIF9fRUZVTl9ERUZJTkVEX18oc2V0X2hlYXJ0X2JlYXQpCisKKyNpbmNsdWRlIDxjb25maWd1cmF0aW9uLmg+CisKK2ludCBzZXRfaGVhcnRfYmVhdChpbnQgZmxhZykKK3sKKyAgICBvYmplY3Qgb2IgPSBlZnVuOjpwcmV2aW91c19vYmplY3QoKTsKKyAgICBpbnQgaGIgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0NfSEVBUlRfQkVBVCk7CisKKyAgICBpZiAoIWZsYWcgPT0gIWhiKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGVmdW46OmNvbmZpZ3VyZV9vYmplY3Qob2IsIE9DX0hFQVJUX0JFQVQsIGZsYWcpOworCisgICAgcmV0dXJuIDE7Cit9CisKKyNlbmRpZgorCisKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NldF9pc193aXphcmQuYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NldF9pc193aXphcmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDFjY2RiCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc2V0X2lzX3dpemFyZC5jCkBAIC0wLDAgKzEsMTM3IEBACisvKiBUaGVzZSBhcmUgdGhlIHNwZWNpYWwgY29tbWFuZHMgZnJvbSB0aGUgZHJpdmVyIHRoYXQgYXJlIGFjdGl2YXRlZCB3aXRoCisgKiBzZXRfaXNfd2l6YXJkKCkuIFRoZXNlIGZ1bmN0aW9ucyBtdXN0IGJlIGFkZGVkIHRvIHRoZSBwbGF5ZXIgb2JqZWN0LgorICogQWxzbyBzZXRfaXNfd2l6YXJkKCkgbXVzdCBiZSBjYWxsZWQgaW4gdGhlIGNvcnJlc3BvbmRpbmcgcGxheWVyIG9iamVjdCwKKyAqIG5vdCBhcyBhbiAoc2ltdWwtKWVmdW4uCisgKi8KKworI2luY2x1ZGUgPGNvbW1hbmRzLmg+CisjaW5jbHVkZSA8ZHJpdmVyX2luZm8uaD4KKworLyogaXNfd2l6YXJkOgorICogIDE6IGhhcyBhY3Rpb25zLAorICogIDA6IG5ldmVyIGhhZCBhY3Rpb25zLAorICogLTE6IGhhZCBhY3Rpb25zIG9uY2UuCisgKi8KK3ByaXZhdGUgbm9zYXZlIGludCBpc193aXphcmQ7CisKK3ByaXZhdGUgaW50IGRyaXZlcl9tYWxsb2Moc3RyaW5nIHN0cikKK3sKKyAgICBpZihpc193aXphcmQgPD0gMCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZighc2l6ZW9mKHN0cikpCisgICAgeworICAgICAgICB3cml0ZShlZnVuOjpkcml2ZXJfaW5mbyhESV9TVEFUVVNfVEVYVF9NQUxMT0MpKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgaWYoc3RyID09ICJleHRzdGF0cyIpCisgICAgeworICAgICAgICB3cml0ZShlZnVuOjpkcml2ZXJfaW5mbyhESV9TVEFUVVNfVEVYVF9NQUxMT0NfRVhURU5ERUQpKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3ByaXZhdGUgaW50IGRyaXZlcl9kdW1wYWxsb2JqKHN0cmluZyBzdHIpCit7CisgICAgaWYoaXNfd2l6YXJkIDw9IDAgfHwgc2l6ZW9mKHN0cikpCisgICAgICAgIHJldHVybiAwOworCisgICAgd3JpdGUoIkR1bXBpbmcgdG8gL09CSl9EVU1QIC4uLiAiKTsKKyAgICBlZnVuOjpkdW1wX2RyaXZlcl9pbmZvKERESV9PQkpFQ1RTKTsKKyAgICBlZnVuOjpkdW1wX2RyaXZlcl9pbmZvKERESV9PQkpFQ1RTX0RFU1RSVUNURUQpOworICAgIHdyaXRlKCJkb25lXG4iKTsKKyAgICByZXR1cm4gMTsKK30KKworcHJpdmF0ZSBpbnQgZHJpdmVyX29wY2R1bXAoc3RyaW5nIHN0cikKK3sKKyAgICBpZihpc193aXphcmQgPD0gMCB8fCBzaXplb2Yoc3RyKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBlZnVuOjpkdW1wX2RyaXZlcl9pbmZvKERESV9PUENPREVTKTsKKyAgICByZXR1cm4gMTsKK30KKworcHJpdmF0ZSBpbnQgZHJpdmVyX3N0YXR1cyhzdHJpbmcgc3RyKQoreworICAgIGludCBvcHQ7CisgICAgaWYoaXNfd2l6YXJkIDw9IDApCisgICAgICAgIHJldHVybiAwOworCisgICAgc3dpdGNoKHN0ciB8fCAiIikKKyAgICB7CisgICAgICAgIGNhc2UgIiI6CisgICAgICAgICAgICBvcHQgPSBESV9TVEFUVVNfVEVYVF9NRU1PUlk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICJ0YWJsZXMiOgorICAgICAgICBjYXNlICIgdGFibGVzIjoKKyAgICAgICAgICAgIG9wdCA9IERJX1NUQVRVU19URVhUX1RBQkxFUzsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgInN3YXAiOgorICAgICAgICBjYXNlICIgc3dhcCI6CisgICAgICAgICAgICBvcHQgPSBESV9TVEFUVVNfVEVYVF9TV0FQOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAibWFsbG9jIjoKKyAgICAgICAgY2FzZSAiIG1hbGxvYyI6CisgICAgICAgICAgICBvcHQgPSBESV9TVEFUVVNfVEVYVF9NQUxMT0M7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICJtYWxsb2MgZXh0c3RhdHMiOgorICAgICAgICBjYXNlICIgbWFsbG9jIGV4dHN0YXRzIjoKKyAgICAgICAgICAgIG9wdCA9IERJX1NUQVRVU19URVhUX01BTExPQ19FWFRFTkRFRDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICB3cml0ZShlZnVuOjpkcml2ZXJfaW5mbyhvcHQpKTsKKyAgICByZXR1cm4gMTsKK30KKworaW50IHNldF9pc193aXphcmQodmFyYXJncyA8b2JqZWN0fGludD4qIGFyZ3MpCit7CisgICAgaW50IG9sZHZhbCA9IGlzX3dpemFyZDsKKworICAgIGlmKCFzaXplb2YoYXJncykpCisgICAgICAgIHJhaXNlX2Vycm9yKCJUb28gZmV3IGFyZ3VtZW50cyB0byBzZXRfaXNfd2l6YXJkXG4iKTsKKyAgICBpZihzaXplb2YoYXJncykgPiAyKQorICAgICAgICByYWlzZV9lcnJvcigiVG9vIG1hbnkgYXJndW1lbnRzIHRvIHNldF9pc193aXphcmRcbiIpOworICAgIGlmKCFvYmplY3RwKGFyZ3NbMF0pKQorICAgICAgICByYWlzZV9lcnJvcigiQmFkIGFyZyAxIHRvIHNldF9pc193aXphcmQoKVxuIik7CisgICAgaWYoYXJnc1swXSAhPSB0aGlzX29iamVjdCgpKQorICAgICAgICByYWlzZV9lcnJvcigiT25seSBzZXRfaXNfd2l6YXJkIGZvciB0aGUgY3VycmVudCBvYmplY3Qgc3VwcG9ydGVkXG4iKTsKKyAgICBpZih0aGlzX3BsYXllcigpICE9IHRoaXNfb2JqZWN0KCkpCisgICAgICAgIHJhaXNlX2Vycm9yKCJUaGUgY3VycmVudCBvYmplY3QgbXVzdCBiZSB0aGlzX3BsYXllcigpIGZvciBzZXRfaXNfd2l6YXJkKClcbiIpOworICAgIGlmKHNpemVvZihhcmdzKSA9PSAyICYmICFpbnRwKGFyZ3NbMV0pKQorICAgICAgICByYWlzZV9lcnJvcigiQmFkIGFyZyAyIHRvIHNldF9pc193aXphcmQoKVxuIik7CisKKyAgICBpZihzaXplb2YoYXJncykgPT0gMiAmJiAhYXJnc1sxXSkKKyAgICB7CisgICAgICAgIGlmKGlzX3dpemFyZCA+IDApCisgICAgICAgICAgICBpc193aXphcmQgPSAtMTsKKyAgICB9CisgICAgZWxzZSBpZihzaXplb2YoYXJncykgPT0gMiAmJiBhcmdzWzFdPDApCisgICAgeworICAgICAgICAgLy8gSnVzdCByZXR1cm4gdGhlIG9sZCB2YWx1ZS4KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYoIWlzX3dpemFyZCkKKyAgICAgICAgeworICAgICAgICAgICAgYWRkX2FjdGlvbigjJ2RyaXZlcl9tYWxsb2MsICJtYWxsb2MiKTsKKyAgICAgICAgICAgIGFkZF9hY3Rpb24oIydkcml2ZXJfZHVtcGFsbG9iaiwgImR1bXBhbGxvYmoiKTsKKyAgICAgICAgICAgIGFkZF9hY3Rpb24oIydkcml2ZXJfb3BjZHVtcCwgIm9wY2R1bXAiKTsKKyAgICAgICAgICAgIGFkZF9hY3Rpb24oIydkcml2ZXJfc3RhdHVzLCAic3RhdHVzIiwgQUFfTk9TUEFDRSk7CisgICAgICAgIH0KKyAgICAgICAgaXNfd2l6YXJkID0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gb2xkdmFsID4gMDsKK30KZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NldF9wcm9tcHQuYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NldF9wcm9tcHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjU5NjkyCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc2V0X3Byb21wdC5jCkBAIC0wLDAgKzEsMjEgQEAKKy8qIFRoaXMgc2VmdW4gaXMgdG8gcHJvdmlkZSBhIHJlcGxhY2VtZW50IGZvciB0aGUgZWZ1biBzZXRfcHJvbXB0KCkuCisgKiBGZWVsIGZyZWUgdG8gYWRkIGl0IHRvIHlvdXIgbXVkbGlicywgaWYgeW91IGhhdmUgbXVjaCBjb2RlIHJlbHlpbmcgb24gdGhhdC4KKyAqLworCisjaWYgISBfX0VGVU5fREVGSU5FRF9fKHNldF9wcm9tcHQpCisKKyNpbmNsdWRlIDxjb25maWd1cmF0aW9uLmg+CisKK3ZhcmFyZ3Mgc3RyaW5nfGNsb3N1cmUgc2V0X3Byb21wdChzdHJpbmd8Y2xvc3VyZXxpbnQgcHJvbXB0LCBvYmplY3Qgb2IpCit7CisgICAgb2IgfHw9IGVmdW46OnRoaXNfcGxheWVyKCk7CisKKyAgICBtaXhlZCBvbGRwcm9tcHQgPSBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKG9iLCBJQ19QUk9NUFQpOworCisgICAgaWYoIWludHAocHJvbXB0KSkKKyAgICAgICAgZWZ1bjo6Y29uZmlndXJlX2ludGVyYWN0aXZlKG9iLCBJQ19QUk9NUFQsIHByb21wdCk7CisKKyAgICByZXR1cm4gb2xkcHJvbXB0OworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NoYWRvdy5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc2hhZG93LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYwOGM3MwotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NoYWRvdy5jCkBAIC0wLDAgKzEsNTUgQEAKKy8qIFRoZXNlIHNlZnVucyBhcmUgdG8gcHJvdmlkZSBhIHJlcGxhY2VtZW50IGZvciB0aGUgZWZ1biBxdWVyeV9zaGFkb3dpbmcoKQorICogYW5kIHRoZSBvbGQgc2VtYW50aWNzIG9mIHRoZSBlZnVuIHNoYWRvdygpLgorICogRmVlbCBmcmVlIHRvIGFkZCBpdCB0byB5b3VyIG11ZGxpYnMsIGlmIHlvdSBoYXZlIG11Y2ggY29kZSByZWx5aW5nIG9uIHRoYXQuCisgKi8KKworI2lmICEgX19FRlVOX0RFRklORURfXyhxdWVyeV9zaGFkb3dpbmcpCisKKyNpbmNsdWRlIDxvYmplY3RfaW5mby5oPgorCitvYmplY3QgcXVlcnlfc2hhZG93aW5nKG9iamVjdCBvYikKK3sKKyAgICByZXR1cm4gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NIQURPV19QUkVWKTsKK30KKworcHJpdmF0ZSBvYmplY3QgX3NoYWRvdyhvYmplY3Qgb2IsIGludCBmbGFnKQoreworICAgIGlmKGZsYWcpCisgICAgeworICAgICAgICBvYmplY3Qgc2hhZG93ZXIgPSBlZnVuOjpwcmV2aW91c19vYmplY3QoMSk7CisgICAgICAgIGVmdW46OnNldF90aGlzX29iamVjdChzaGFkb3dlcik7CisKKyAgICAgICAgaWYgKGVmdW46OnNoYWRvdyhvYikpCisgICAgICAgICAgICByZXR1cm4gZWZ1bjo6b2JqZWN0X2luZm8oc2hhZG93ZXIsIE9JX1NIQURPV19QUkVWKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSEFET1dfTkVYVCk7Cit9CisjZWxzZQorcHJpdmF0ZSBvYmplY3QgX3NoYWRvdyhvYmplY3Qgb2IsIGludCBmbGFnKQoreworICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KDEpKTsKKyAgcmV0dXJuIGVmdW46OnNoYWRvdyhvYiwgZmxhZyk7Cit9CisjZW5kaWYKKworCitwdWJsaWMgb2JqZWN0IHNoYWRvdyhvYmplY3Qgb2IsIGludCBmbGFnKQoreworICBvYmplY3QgcmVzID0gZnVuY2FsbCgjJ19zaGFkb3csb2IsIGZsYWcpOworICBpZiAoZmxhZykKKyAgICAiL3NlY3VyZS9zaGFkb3dtYXN0ZXIiLT5SZWdpc3RlclNoYWRvdyhwcmV2aW91c19vYmplY3QoKSk7CisgIHJldHVybiByZXM7Cit9CisKK3ByaXZhdGUgdm9pZCBfdW5zaGFkb3coKSB7CisgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoMSkpOworICBlZnVuOjp1bnNoYWRvdygpOworfQorCitwdWJsaWMgdm9pZCB1bnNoYWRvdygpIHsKKyAgZnVuY2FsbCgjJ191bnNoYWRvdyk7CisgICIvc2VjdXJlL3NoYWRvd21hc3RlciItPlVucmVnaXN0ZXJTaGFkb3cocHJldmlvdXNfb2JqZWN0KCkpOworfQpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc2ltdWxfZWZ1bi5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc2ltdWxfZWZ1bi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViNjg3ODkKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zaW11bF9lZnVuLmMKQEAgLTAsMCArMSwxOTk1IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gc2ltdWxfZWZ1bi5jIC0tIHNpbXVsIGVmdW4ncworLy8KKy8vICRJZDogc2ltdWxfZWZ1bi5jIDc0MDggMjAxMC0wMi0wNiAwMDoyNzoyNVogWmVzc3RyYSAkCisjcHJhZ21hIHN0cmljdF90eXBlcyxzYXZlX3R5cGVzLHJ0dF9jaGVja3MKKyNwcmFnbWEgbm9fY2xvbmUsbm9fc2hhZG93LG5vX2luaGVyaXQKKyNwcmFnbWEgcGVkYW50aWMscmFuZ2VfY2hlY2ssd2Fybl9kZXByZWNhdGVkCisjcHJhZ21hIHdhcm5fZW1wdHlfY2FzdHMsd2Fybl9taXNzaW5nX3JldHVybix3YXJuX2Z1bmN0aW9uX2luY29uc2lzdGVudAorCisvLyBBYnNvbHV0ZSBQZmFkZSBlcmZvcmRlcmxpY2ggLSB6dW0gWmVpdHB1bmt0LCB3byBkZXIgTWFzdGVyIGdlbGFkZW4KKy8vIHdpcmQsIHNpbmQgbm9jaCBrZWluZSBJbmNsdWRlLVBmYWRlIGRhIC4uLgorCisjZGVmaW5lIFNOT09QTE9HRklMRSAiU05PT1AiCisjZGVmaW5lIEFTTk9PUExPR0ZJTEUgIkFSQ0gvU05PT1AiCisKKyNpbmNsdWRlICIvc2VjdXJlL2NvbmZpZy5oIgorI2luY2x1ZGUgIi9zZWN1cmUvd2l6bGV2ZWxzLmgiCisjaW5jbHVkZSAiL3N5cy9zbm9vcGluZy5oIgorI2luY2x1ZGUgIi9zeXMvbGFuZ3VhZ2UuaCIKKyNpbmNsdWRlICIvc3lzL3RoaW5nL3Byb3BlcnRpZXMuaCIKKyNpbmNsdWRlICIvc3lzL3dpemxpc3QuaCIKKyNpbmNsdWRlICIvc3lzL2VycS5oIgorI2luY2x1ZGUgIi9zeXMvbHBjdHlwZXMuaCIKKyNpbmNsdWRlICIvc3lzL2RhZW1vbi5oIgorI2luY2x1ZGUgIi9zeXMvcGxheWVyL2Jhc2UuaCIKKyNpbmNsdWRlICIvc3lzL3RoaW5nL2Rlc2NyaXB0aW9uLmgiCisjaW5jbHVkZSAiL3N5cy9jb250YWluZXIuaCIKKyNpbmNsdWRlICIvc3lzL2RlZmluZXMuaCIKKyNpbmNsdWRlICIvc3lzL3RlbG5ldC5oIgorI2luY2x1ZGUgIi9zeXMvb2JqZWN0aW5mby5oIgorI2luY2x1ZGUgIi9zeXMvZmlsZXMuaCIKKyNpbmNsdWRlICIvc3lzL3N0cmluZ3MuaCIKKyNpbmNsdWRlICIvc3lzL3RpbWUuaCIKKyNpbmNsdWRlICIvc3lzL2xwY3R5cGVzLmgiCisjaW5jbHVkZSAiL3N5cy9ub3RpZnlfZmFpbC5oIgorI2luY2x1ZGUgIi9zeXMvdGxzLmgiCisjaW5jbHVkZSAiL3N5cy9pbnB1dF90by5oIgorI2luY2x1ZGUgIi9zeXMvb2JqZWN0X2luZm8uaCIKKworLyogZnVuY3Rpb24gcHJvdG90eXBlcworICovCitzdHJpbmcgZHRpbWUoaW50IHdhbm4pOwordmFyYXJncyBpbnQgbG9nX2ZpbGUoc3RyaW5nIGZpbGUsIHN0cmluZyB0eHQsIGludCBzaXplX3RvX2JyZWFrKTsKK2ludCBxdWVyeV93aXpfbGV2ZWwobWl4ZWQgcGxheWVyKTsKK25vbWFzayB2YXJhcmdzIGludCBzbm9vcChvYmplY3QgbWUsIG9iamVjdCB5b3UpOwordmFyYXJncyBzdHJpbmcgY291bnRyeShtaXhlZCBpcCwgc3RyaW5nIG51bSk7CitpbnQgcXVlcnlfd2l6X2dycChtaXhlZCB3aXopOworcHVibGljIHZhcmFyZ3Mgb2JqZWN0IGRlZXBfcHJlc2VudChtaXhlZCB3aGF0LCBvYmplY3Qgb2IpOworbm9tYXNrIGludCBzZWN1cmVfbGV2ZWwoKTsKK25vbWFzayBzdHJpbmcgc2VjdXJlX2V1aWQoKTsKK3B1YmxpYyBub21hc2sgaW50IHByb2Nlc3NfY2FsbCgpOworbm9tYXNrIG1peGVkIF9fY3JlYXRlX3BsYXllcl9kdW1teShzdHJpbmcgbmFtZSk7Cit2YXJhcmdzIHN0cmluZyByZXBsYWNlX3BlcnNvbmFsKHN0cmluZyBzdHIsIG1peGVkICpvYnMsIGludCBjYXBzKTsKKworCisvL3JlcGxhY2VtZW50cyBmb3IgZHJvcHBlZCBlZnVucyBpbiBMRAorI2lmICFfX0VGVU5fREVGSU5FRF9fKGV4dHJhY3QpCit2YXJhcmdzIHN0cmluZyBleHRyYWN0KHN0cmluZyBzdHIsIGludCBmcm9tLCBpbnQgdG8pOworI2VuZGlmCisjaWYgIV9fRUZVTl9ERUZJTkVEX18oc2xpY2VfYXJyYXkpCit2YXJhcmdzIG1peGVkIHNsaWNlX2FycmF5KG1peGVkIGFycmF5LCBpbnQgZnJvbSwgaW50IHRvKTsKKyNlbmRpZgorI2lmICFfX0VGVU5fREVGSU5FRF9fKG1lbWJlcl9hcnJheSkKK2ludCBtZW1iZXJfYXJyYXkobWl4ZWQgaXRlbSwgbWl4ZWQgYXJyYXlzdHJpbmcpOworI2VuZGlmCisKKy8vIEluY2x1ZGUgdGhlIGRpZmZlcmVudCBzdWIgJ21vZHVsZXMnIG9mIHRoZSBzaW11bF9lZnVuCisjaW5jbHVkZSBfX0RJUl9fImRlYnVnX2luZm8uYyIKKyNpbmNsdWRlIF9fRElSX18iZW5hYmxlX2NvbW1hbmRzLmMiCisjaW5jbHVkZSBfX0RJUl9fImhhc2guYyIKKyNpbmNsdWRlIF9fRElSX18ib2JqZWN0X2luZm8uYyIKKyNpbmNsdWRlIF9fRElSX18icXVlcnlfZWRpdGluZy5jIgorI2luY2x1ZGUgX19ESVJfXyJxdWVyeV9pZGxlLmMiCisjaW5jbHVkZSBfX0RJUl9fInF1ZXJ5X2lucHV0X3BlbmRpbmcuYyIKKyNpbmNsdWRlIF9fRElSX18icXVlcnlfaXBfbmFtZS5jIgorI2luY2x1ZGUgX19ESVJfXyJxdWVyeV9saW1pdHMuYyIKKyNpbmNsdWRlIF9fRElSX18icXVlcnlfbG9hZF9hdmVyYWdlLmMiCisjaW5jbHVkZSBfX0RJUl9fInF1ZXJ5X211ZF9wb3J0LmMiCisjaW5jbHVkZSBfX0RJUl9fInF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUuYyIKKyNpbmNsdWRlIF9fRElSX18icXVlcnlfc25vb3AuYyIKKyNpbmNsdWRlIF9fRElSX18ic2V0X2hlYXJ0X2JlYXQuYyIKKyNpZiBfX0JPT1RfVElNRV9fIDwgMTQ1NjI2MTg1OQorI2luY2x1ZGUgX19ESVJfXyJzZXRfcHJvbXB0LmMiCisjZW5kaWYKKyNpbmNsdWRlIF9fRElSX18ic2hhZG93LmMiCisjaW5jbHVkZSBfX0RJUl9fImxpdmluZ3MuYyIKKyNpbmNsdWRlIF9fRElSX18iY29tbS5jIgorCisjZGVmaW5lIFRPICAgICAgICBlZnVuOjp0aGlzX29iamVjdCgpCisjZGVmaW5lIFRJICAgICAgICBlZnVuOjp0aGlzX2ludGVyYWN0aXZlKCkKKyNkZWZpbmUgVFAgICAgICAgIGVmdW46OnRoaXNfcGxheWVyKCkKKyNkZWZpbmUgUE8gICAgICAgIGVmdW46OnByZXZpb3VzX29iamVjdCgwKQorI2RlZmluZSBMRVZFTCh4KSBxdWVyeV93aXpfbGV2ZWwoeCkKKyNkZWZpbmUgTkFNRSh4KSAgY2FwaXRhbGl6ZShnZXR1aWQoeCkpCisKKyNkZWZpbmUgREVCVUcoeCkgaWYgKGZpbmRfcGxheWVyKCJ6ZXNzdHJhIikpIFwKKyAgdGVsbF9vYmplY3QoZmluZF9wbGF5ZXIoInplc3N0cmEiKSx4KQorCittaXhlZCBkdGltZV9jYWNoZSA9ICh7LTEsIiJ9KTsKKworI2lmZGVmIElPU1RBVFMKK3N0cnVjdCBpb3N0YXRfcyB7CisgIHN0cmluZyBvbmFtZTsKKyAgaW50IHRpbWU7CisgIGludCBzaXplOworfTsKK21peGVkIHNhdmVvX3N0YXQgPSAoeyAwLGFsbG9jYXRlKDIwMCwgMCkgfSk7CittaXhlZCByZXN0b3Jlb19zdGF0ID0gKHsgMCxhbGxvY2F0ZSgyMDAsMCkgfSk7CisvL21peGVkIHdyaXRlZmlsZV9zdGF0ID0gKHsgMCxhbGxvY2F0ZSgxMDAsKDxpb3N0YXRfcz4pKSB9KTsKKy8vbWl4ZWQgcmVhZGZpbGVfc3RhdCA9ICh7IDAsYWxsb2NhdGUoMTAwLCg8aW9zdGF0X3M+KSkgfSk7CisvL21peGVkIGxvZ19zdGF0ID0gKHsgMCxhbGxvY2F0ZSgxMDAsKDxpb3N0YXRfcz4pKSB9KTsKKworbWl4ZWQgX19faW9zdGF0cyhpbnQgdHlwZSkgeworICBzd2l0Y2godHlwZSkgeworICAgIGNhc2UgMToKKyAgICAgIHJldHVybiBzYXZlb19zdGF0OworICAgIGNhc2UgMjoKKyAgICAgIHJldHVybiByZXN0b3Jlb19zdGF0OworLyogICAgY2FzZSAzOgorICAgICAgcmV0dXJuIHdyaXRlZmlsZV9zdGF0OworICAgIGNhc2UgNDoKKyAgICAgIHJldHVybiByZWFkZmlsZV9zdGF0OworICAgIGNhc2UgNToKKyAgICAgIHJldHVybiBsb2dfc3RhdDsKKyAgICAgICovCisgIH0KKyAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKworLy8gTmljaHQgamVkZXIgTWFnaWVyIG11c3MgZGllIHNpbXVsX2VmdW4gZW50c29yZ2VuIGtvZW5uZW4uCitzdHJpbmcgTm90aWZ5RGVzdHJ1Y3Qob2JqZWN0IGNhbGxlcikgeworICAgIGlmKCAoY2FsbGVyIT10aGlzX29iamVjdCgpICYmICFBUkNIX1NFQ1VSSVRZKSB8fCBwcm9jZXNzX2NhbGwoKSApIHsKKyAgICAgIHJldHVybiAiRHUgZGFyZnN0IGRhcyBzaW11bF9lZnVuIE9iamVrdCBuaWNodCB6ZXJzdG9lcmVuIVxuIjsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3B1YmxpYyBub21hc2sgdm9pZCByZW1vdmVfaW50ZXJhY3RpdmUoIG9iamVjdCBvYiApCit7CisgICAgaWYgKCBvYmplY3RwKG9iKSAmJiBwcmV2aW91c19vYmplY3QoKQorICAgICAgICAmJiBvYmplY3RfbmFtZShwcmV2aW91c19vYmplY3QoKSlbMC4uN10gIT0gIi9zZWN1cmUvIgorICAgICAgICAmJiAoKHByZXZpb3VzX29iamVjdCgpICE9IG9iCisgICAgICAgICAgICAgJiYgKG9iICE9IHRoaXNfcGxheWVyKCkgfHwgb2IgIT0gdGhpc19pbnRlcmFjdGl2ZSgpKSkKKyAgICAgICAgICAgIHx8IChwcmV2aW91c19vYmplY3QoKSA9PSBvYgorICAgICAgICAgICAgICAgJiYgKHRoaXNfcGxheWVyKCkgJiYgdGhpc19wbGF5ZXIoKSAhPSBvYgorICAgICAgICAgICAgICAgICAgIHx8IHRoaXNfaW50ZXJhY3RpdmUoKSAmJiB0aGlzX2ludGVyYWN0aXZlKCkgIT0gb2IpKSApICkKKworICAgICAgIGxvZ19maWxlKCAiUExBWUVSREVTVCIsCisgICAgICAgICAgICAgICAgc3ByaW50ZiggIiVzOiAlTyBhdXNnZWxvZ2d0IHZvbiBQTyAlTywgVEkgJU8sIFRQICVPXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZHRpbWUodGltZSgpKSwgb2IsIHByZXZpb3VzX29iamVjdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgdGhpc19pbnRlcmFjdGl2ZSgpLCB0aGlzX3BsYXllcigpICkgKTsKKworICAgIGVmdW46OnJlbW92ZV9pbnRlcmFjdGl2ZShvYik7Cit9CisKKwordm9pZCBfX191cGRtYXN0ZXIoKQoreworICAgIG9iamVjdCBvYjsKKworICAgIC8vc29sbHRlIG5pY2h0IGplZGVyIGR1ZXJmZW4uCisgICAgaWYgKHByb2Nlc3NfY2FsbCgpIHx8ICFBUkNIX1NFQ1VSSVRZKQorICAgICAgcmFpc2VfZXJyb3IoIklsbGVnYWwgdXNlIG9mIF9fX3VwZG1hc3RlcigpISIpOworCisgICAgd3JpdGUoIlJlbW92aW5nIG9sZCBtYXN0ZXIgLi4uICIpOworICAgIGZvcmVhY2goc3RyaW5nIGZpbGU6IAorICAgICAgICBnZXRfZGlyKCIvc2VjdXJlL21hc3Rlci8qLmMiLEdFVERJUl9OQU1FU3xHRVRESVJfVU5TT1JURUR8R0VURElSX1BBVEgpKSB7CisgICAgICBpZiAob2IgPSBmaW5kX29iamVjdChmaWxlKSkKKyAgICAgICBlZnVuOjpkZXN0cnVjdChvYik7CisgICAgfQorICAgIGVmdW46OmRlc3RydWN0KGVmdW46OmZpbmRfb2JqZWN0KCIvc2VjdXJlL21hc3RlciIpKTsKKyAgICB3cml0ZSgiZG9uZS5cbkxvYWRpbmcgYWdhaW4gLi4uICIpOworICAgIGxvYWRfb2JqZWN0KCIvc2VjdXJlL21hc3RlciIpOworCisgICAgd3JpdGUoImRvbmUuXG4iKTsKK30KKwordmFyYXJncyBzdHJpbmcgY291bnRyeShtaXhlZCBpcCwgc3RyaW5nIG51bSkgeworICBtaXhlZCByZXQ7CisKKyAgaWYocmV0ID0gKHN0cmluZykiL3AvZGFlbW9uL2lwbG9va3VwIi0+Y291bnRyeShudW0gfHwgaXApKSB7CisgICAgcmV0dXJuIHJldDsKKyAgfSBlbHNlIHJldHVybiAiPz8/IjsKK30KKworCisvLyAqIFNub29wZW4gdW5kIHdhcyBkYXp1Z2Vob2VydAorc3RhdGljIG9iamVjdCBmaW5kX3Nub29wZWQob2JqZWN0IHdobykKK3sKKyAgb2JqZWN0ICp1OworICBpbnQgaTsKKworICBmb3IgKGk9c2l6ZW9mKHU9dXNlcnMoKSktMTtpPj0wO2ktLSkKKyAgICBpZiAod2hvPT1lZnVuOjppbnRlcmFjdGl2ZV9pbmZvKHVbaV0sIElJX1NOT09QX05FWFQpKQorICAgICAgcmV0dXJuIHVbaV07CisgIHJldHVybiAwOworfQorCitwcml2YXRlIHN0cmluZyBMY3V0KHN0cmluZyBzdHIpIHsKKyAgcmV0dXJuIHN0cls1Li4xMV0rc3RyWzE4Li5dOworfQorCitub21hc2sgdmFyYXJncyBpbnQgc25vb3AoIG9iamVjdCBtZSwgb2JqZWN0IHlvdSApCit7CisgICAgaW50IHJldDsKKyAgICBvYmplY3Qgc25vb3BlcjAsIHNub29wZXIsIHNub29wZXIyLCBzbm9vcGVyMzsKKworICAgIGlmKCAhb2JqZWN0cChtZSkgfHwgbWUgPT0geW91IHx8ICFQTyApCisgICAgICAgcmV0dXJuIDA7CisKKyAgICBzbm9vcGVyMCA9IGZpbmRfc25vb3BlZChtZSk7CisKKyAgICAgaWYoeW91KXsKKyAgICAgICAgaWYgKCBQTyAhPSBtZSAmJiBxdWVyeV93aXpfZ3JwKG1lKSA+PSBxdWVyeV93aXpfZ3JwKGdldGV1aWQoUE8pKSApCisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBpZiAoIHF1ZXJ5X3dpel9ncnAobWUpIDw9IHF1ZXJ5X3dpel9ncnAoeW91KSAmJgorICAgICAgICAgICAgICEoeW91LT5RdWVyeUFsbG93U25vb3AobWUpKSApCisgICAgICAgICAgICBpZiAoICFJU19ERVBVVFkobWUpIHx8IElTX0FSQ0goeW91KSApCisgICAgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBpZiAoIChzbm9vcGVyID0gZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyh5b3UsIElJX1NOT09QX05FWFQpKSAmJgorICAgICAgICAgICAgIHF1ZXJ5X3dpel9ncnAoc25vb3BlcikgPj0gcXVlcnlfd2l6X2dycChtZSkgKXsKKyAgICAgICAgICAgIGlmICggKGludClzbm9vcGVyLT5RdWVyeVByb3AoUF9TTk9PUEZMQUdTKSAmIFNGX0xPQ0tFRCApCisgICAgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICAgICAgdGVsbF9vYmplY3QoIHNub29wZXIsIHNwcmludGYoICIlcyBzbm9vcGVkIGpldHp0ICVzLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lLT5uYW1lKFdFUiksIHlvdS0+bmFtZShXRVIpICkgKTsKKworICAgICAgICAgICAgc25vb3BlcjIgPSBtZTsKKworICAgICAgICAgICAgd2hpbGUgKCBzbm9vcGVyMyA9IGludGVyYWN0aXZlX2luZm8oc25vb3BlcjIsIElJX1NOT09QX05FWFQpICl7CisgICAgICAgICAgICAgICB0ZWxsX29iamVjdCggc25vb3BlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoICIlcyB3aXJkIHNlaW5lcnNlaXRzIHZvbiAlcyBnZXNub29wZWQuXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxzbm9vcGVyMi0+bmFtZShXRVIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbm9vcGVyMy0+bmFtZShXRU0pICkgKTsKKyAgICAgICAgICAgICAgIHNub29wZXIyID0gc25vb3BlcjM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGVmdW46OnNub29wKCBzbm9vcGVyLCBzbm9vcGVyMiApOworCisgICAgICAgICAgICBpZiAoIGVmdW46OmludGVyYWN0aXZlX2luZm8oc25vb3BlcjIsIElJX1NOT09QX05FWFQpICE9IHNub29wZXIgKQorICAgICAgICAgICAgICAgdGVsbF9vYmplY3QoIHNub29wZXIsIHNwcmludGYoICJEdSBrYW5uc3QgJXMgbmljaHQgc25vb3Blbi5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbm9vcGVyMi0+bmFtZShXRU4pICkgKTsKKyAgICAgICAgICAgIGVsc2V7CisgICAgICAgICAgICAgICB0ZWxsX29iamVjdCggc25vb3Blciwgc3ByaW50ZiggIkR1IHNub29wc3QgamV0enQgJXMuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25vb3BlcjItPm5hbWUoV0VOKSApICk7CisgICAgICAgICAgICAgICBpZiAoICFJU19ERVBVVFkoc25vb3BlcikgKXsKKyAgICAgICAgICAgICAgICAgICBsb2dfZmlsZSggU05PT1BMT0dGSUxFLCBzcHJpbnRmKCIlczogJU8gJU8gJU9cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0aW1lKHRpbWUoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNub29wZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNub29wZXIyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudChzbm9vcGVyMikgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAwMDAgKTsKKyAgICAgICAgICAgICAgICAgICBpZiAoc25vb3BlcjApCisgICAgICAgICAgICAgICAgICAgICAgQ0hNQVNURVItPnNlbmQoICJTbm9vcCIsIHNub29wZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCAiJXMgKk9GRiogJXMgKCVPKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUoZ2V0dWlkKHNub29wZXIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShnZXR1aWQoc25vb3BlcjApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQoc25vb3BlcjApICkgKTsKKworICAgICAgICAgICAgICAgICAgIENITUFTVEVSLT5zZW5kKCAiU25vb3AiLCBzbm9vcGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZigiJXMgLT4gJXMgKCVPKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShnZXR1aWQoc25vb3BlcikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUoZ2V0dWlkKHNub29wZXIyKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQoc25vb3BlcjIpKSk7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICBlbHNleworICAgICAgICAgICAgICAgICAgIGxvZ19maWxlKCBBU05PT1BMT0dGSUxFLCBzcHJpbnRmKCAiJXM6ICVPICVPICVPXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0aW1lKHRpbWUoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25vb3BlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbm9vcGVyMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudChzbm9vcGVyMikgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICwxMDAwMDAgKTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBpZiAoc25vb3BlcikKKyAgICAgICAgICAgICAgIGlmICggIW1lLT5RdWVyeVByb3AoUF9TTk9PUEZMQUdTKSAmIFNGX0xPQ0tFRCApeworICAgICAgICAgICAgICAgICAgIHByaW50ZiggIiVzIHdpcmQgYmVyZWl0cyB2b24gJXMgZ2Vzbm9vcGVkLiBCZW51dHplIGRhcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJcImZcIi1GbGFnLCB3ZW5uIGR1IGRlbm5vY2ggc25vb3BlbiB3aWxsc3QuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICB5b3UtPm5hbWUoV0VSKSwgc25vb3Blci0+bmFtZShXRU0pICk7CisgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICB9CisKKyAgICAgICAgcmV0ID0gZWZ1bjo6c25vb3AoIG1lLCB5b3UgKTsKKworICAgICAgICBpZiAoICFJU19ERVBVVFkobWUpICYmIGVmdW46OmludGVyYWN0aXZlX2luZm8oeW91LCBJSV9TTk9PUF9ORVhUKSA9PSBtZSl7CisgICAgICAgICAgICBsb2dfZmlsZSggU05PT1BMT0dGSUxFLCBzcHJpbnRmKCAiJXM6ICVPICVPICVPXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMY3V0KGR0aW1lKHRpbWUoKSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZSwgeW91LCBlbnZpcm9ubWVudCh5b3UpICksCisgICAgICAgICAgICAgICAgICAgICAxMDAwMDAgKTsKKworICAgICAgICAgICAgaWYgKHNub29wZXIwKQorICAgICAgICAgICAgICAgQ0hNQVNURVItPnNlbmQoICJTbm9vcCIsIG1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCAiJXMgKk9GRiogJXMgKCVPKS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUoZ2V0dWlkKG1lKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShnZXR1aWQoc25vb3BlcjApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudChzbm9vcGVyMCkgKSApOworCisgICAgICAgICAgICBDSE1BU1RFUi0+c2VuZCggIlNub29wIiwgbWUsIHNwcmludGYoICIlcyAtPiAlcyAoJU8pLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBpdGFsaXplKGdldHVpZChtZSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShnZXR1aWQoeW91KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudCh5b3UpICkgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNleworICAgICAgICAgICAgaWYgKCBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKHlvdSwgSUlfU05PT1BfTkVYVCkgPT0gbWUgKXsKKyAgICAgICAgICAgICAgIGxvZ19maWxlKCBBU05PT1BMT0dGSUxFLCBzcHJpbnRmKCAiJXM6ICVPICVPICVPXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGN1dChkdGltZSh0aW1lKCkpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lLCB5b3UsIGVudmlyb25tZW50KHlvdSkgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAwMCApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCByZXQgJiYgcXVlcnlfd2l6X2dycChtZSkgPD0gcXVlcnlfd2l6X2dycCh5b3UpICYmCisgICAgICAgICAgICAgIUlTX0RFUFVUWShtZSkgKQorICAgICAgICAgICAgdGVsbF9vYmplY3QoIHlvdSwgIioqKiAiICsgTkFNRShtZSkgKyAiIHNub29wdCBEaWNoIVxuIiApOworCisgICAgICAgIHJldHVybiByZXQ7CisgICAgIH0KKyAgICAgZWxzZSB7CisgICAgICAgIGlmICggKG1lID09IFBPIHx8CisgICAgICAgICAgICAgIHF1ZXJ5X3dpel9ncnAoZ2V0ZXVpZChQTykpID4gcXVlcnlfd2l6X2dycChtZSkgfHwKKyAgICAgICAgICAgICAgKHF1ZXJ5X3dpel9ncnAoZ2V0ZXVpZChQTykpID09IHF1ZXJ5X3dpel9ncnAobWUpICYmCisgICAgICAgICAgICAgIGVmdW46OmludGVyYWN0aXZlX2luZm8oUE8sIElJX1NOT09QX05FWFQpID09IG1lKSkgJiYgc25vb3BlcjAgKXsKKyAgICAgICAgICAgIGlmICggIUlTX0RFUFVUWShtZSkgKXsKKyAgICAgICAgICAgICAgIGxvZ19maWxlKCBTTk9PUExPR0ZJTEUsIHNwcmludGYoICIlczogJU8gJU8gJU8gKk9GRipcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExjdXQoZHRpbWUodGltZSgpKSksIG1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbm9vcGVyMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQoc25vb3BlcjApICksCisgICAgICAgICAgICAgICAgICAgICAgICAxMDAwMDAgKTsKKworICAgICAgICAgICAgICAgIENITUFTVEVSLT5zZW5kKCAiU25vb3AiLCBtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoICIlcyAqT0ZGKiAlcyAoJU8pLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUoZ2V0dWlkKG1lKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUoZ2V0dWlkKHNub29wZXIwKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50KHNub29wZXIwKSApICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNleworICAgICAgICAgICAgICAgbG9nX2ZpbGUoIEFTTk9PUExPR0ZJTEUsIHNwcmludGYoICIlczogJU8gJU8gJU8gKk9GRipcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMY3V0KGR0aW1lKHRpbWUoKSkpLCBtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNub29wZXIwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQoc25vb3BlcjApICksCisgICAgICAgICAgICAgICAgICAgICAgICAxMDAwMDAgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGVmdW46OnNub29wKG1lKTsKKyAgICAgICAgfQorICAgICB9CisgICAgIHJldHVybiAwOworfQorCisKKworLy8gKiBFbXVsYXRpb24gZGVzICdhbHRlbicgZXhwbG9kZSBkdXJjaCBkYXMgbmV1ZQorc3RyaW5nICpvbGRfZXhwbG9kZShzdHJpbmcgc3RyLCBzdHJpbmcgZGVsKSB7CisgIGludCBzLCB0OworICBzdHJpbmcgKnN0cnM7CisKKyAgaWYgKCFzdHJpbmdwKHN0cikpIHsKKyAgICAgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CisgICAgICByYWlzZV9lcnJvcihzcHJpbnRmKAorICAgICAgICAgIkludmFsaWQgYXJndW1lbnQgMSB0byBvbGRfZXhwbG9kZSgpISBFeHBlY3RlZCA8c3RyaW5nPiwgZ290OiAiCisgICAgICAgICAiJS4zME9cbiIsc3RyKSk7CisgIH0KKyAgaWYgKCFzdHJpbmdwKGRlbCkpIHsKKyAgICAgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CisgICAgICByYWlzZV9lcnJvcihzcHJpbnRmKAorICAgICAgICAgIkludmFsaWQgYXJndW1lbnQgMiB0byBvbGRfZXhwbG9kZSgpISBFeHBlY3RlZCA8c3RyaW5nPiwgZ290OiAiCisgICAgICAgICAiJS4zME9cbiIsZGVsKSk7CisgIH0KKyAgaWYoZGVsID09ICIiKQorICAgIHJldHVybiAoe3N0cn0pOworICBzdHJzPWVmdW46OmV4cGxvZGUoc3RyLCBkZWwpOworICB0PXNpemVvZihzdHJzKS0xOworICB3aGlsZShzPD10ICYmIHN0cnNbcysrXSA9PSAiIik7cy0tOworICB3aGlsZSh0Pj0wICYmIHN0cnNbdC0tXSA9PSAiIik7dCsrOworICBpZihzPD10KQorICAgIHJldHVybiBzdHJzW3MuLnRdOworICByZXR1cm4gKHt9KTsKK30KKworaW50IGZpbGVfdGltZShzdHJpbmcgcGF0aCkgeworICBtaXhlZCAqdjsKKworICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOworICBpZiAoc2l6ZW9mKHY9Z2V0X2RpcihwYXRoLEdFVERJUl9EQVRFUykpKSByZXR1cm4gdlswXTsKKyAgcmV0dXJuKDApOyAvL3NvbnN0Cit9CisKKy8vICogQmVpIDUwayBHcm9lc3NlIExvZy1GaWxlIHJvdGllcmVuCit2YXJhcmdzIGludCBsb2dfZmlsZShzdHJpbmcgZmlsZSwgc3RyaW5nIHR4dCwgaW50IHNpemVfdG9fYnJlYWspIHsKKyAgbWl4ZWQgKnN0OworCisgIGZpbGU9Ii9sb2cvIitmaWxlOworICBmaWxlPWltcGxvZGUoKGVmdW46OmV4cGxvZGUoZmlsZSwiLyIpLSh7Ii4uIn0pKSwiLyIpOworLy8gIHRlbGxfb2JqZWN0KGZpbmRfcGxheWVyKCJqb2YiKSxzcHJpbnRmKCJMT0cgRklMRTogJU8gLT4gJU9cbiIscHJldmlvdXNfb2JqZWN0KCksZmlsZSkpOworICBpZiAoIWZ1bmNhbGwoYmluZF9sYW1iZGEoIydlZnVuOjpjYWxsX290aGVyLFBPKSwic2VjdXJlL21hc3RlciIsLy8nKQorICAgICAgICAgICAgICAidmFsaWRfd3JpdGUiLGZpbGUsZ2V0ZXVpZChQTyksImxvZ19maWxlIixQTykpCisgICAgICByZXR1cm4gMDsKKyAgaWYgKCBzaXplX3RvX2JyZWFrID49IDAgJiAoCisgICAgICBzaXplb2Yoc3QgPSBnZXRfZGlyKGZpbGUsMikgKSAmJiBzdFswXSA+PSAoc2l6ZV90b19icmVha3xNQVhfTE9HX1NJWkUpKSkKKyAgICAgIGNhdGNoKHJlbmFtZShmaWxlLCBmaWxlICsgIi5vbGQiKTtwdWJsaXNoKTsgLyogTm8gcGFuaWMgaWYgZmFpbHVyZSAqLworICByZXR1cm4od3JpdGVfZmlsZShmaWxlLHR4dCkpOworfQorCisvLyAqIE1hZ2llci1MZXZlbCBhYmZyYWdlbgoraW50IHF1ZXJ5X3dpel9sZXZlbChtaXhlZCBwbGF5ZXIpIHsKKyAgcmV0dXJuIChpbnQpIi9zZWN1cmUvbWFzdGVyIi0+cXVlcnlfd2l6X2xldmVsKHBsYXllcik7Cit9CisKKyNpZmRlZiBfX0FMSVNUU19fCisvLyAqIEVsZW1lbnQgYXVzIEFsaXN0IGxvZXNjaGVuIChieSBrZXkpCittaXhlZCAqcmVtb3ZlX2FsaXN0KG1peGVkIGtleSxtaXhlZCAqYWxpc3QpCit7CisgIGludCBpLGo7CisKKyAgaWYgKCFwb2ludGVycChhbGlzdCkgfHwgIXNpemVvZihhbGlzdCkpCisgICAgcmV0dXJuIGFsaXN0OworICBpZiAoIXBvaW50ZXJwKGFsaXN0WzBdKSkKKyAgeworICAgIGlmICgoaT1hc3NvYyhrZXksYWxpc3QpKTwwKQorICAgICAgcmV0dXJuIGFsaXN0OworICAgIHJldHVybiBhbGlzdFswLi5pLTFdK2FsaXN0W2krMS4uXTsKKyAgfQorICBpID0gYXNzb2Moa2V5LGFsaXN0WzBdKTsKKyAgaWYgKChpPWFzc29jKGtleSxhbGlzdFswXSkpPDApCisgICAgcmV0dXJuIGFsaXN0OworICBhbGlzdD1hbGlzdFswLi5dOworICBmb3IgKGo9c2l6ZW9mKGFsaXN0KS0xO2o+PTA7ai0tKQorICAgIGFsaXN0W2pdPWFsaXN0W2pdWzAuLmktMV0rYWxpc3Rbal1baSsxLi5dOworICByZXR1cm4gYWxpc3Q7Cit9CisKKy8vICogRWxlbWVudCBhdXMgQWxpc3QgbG9lc2NoZW4gKGJ5IHBvcykKK21peGVkICpleGNsdWRlX2FsaXN0KGludCBpLG1peGVkICphbGlzdCkKK3sKKyAgaW50IGo7CisgIGlmICghcG9pbnRlcnAoYWxpc3QpIHx8ICFzaXplb2YoYWxpc3QpIHx8IGk8MCkKKyAgICByZXR1cm4gYWxpc3Q7CisgIGlmICghcG9pbnRlcnAoYWxpc3RbMF0pKQorICAgIHJldHVybiBhbGlzdFswLi5pLTFdK2FsaXN0W2krMS4uXTsKKyAgYWxpc3Q9YWxpc3RbMC4uXTsgLyogQ3JlYXRlIFBIWVNJQ0FMIGNvcHkgb2YgYWxpc3QgKi8KKyAgZm9yIChqPXNpemVvZihhbGlzdCktMTtqPj0wO2otLSkKKyAgICBhbGlzdFtqXT1hbGlzdFtqXVswLi5pLTFdK2FsaXN0W2pdW2krMS4uXTsKKyAgcmV0dXJuIGFsaXN0OyAvKiBvcmRlcl9hbGlzdCBpcyBOT1QgbmVjZXNzYXJ5IC0gc2VlIC9kb2MvTFBDL2FsaXN0ICovCit9CisjZW5kaWYgLy8gX19BTElTVFNfXworCisvLyAqIEdlcm1hbiB2ZXJzaW9uIG9mIGN0aW1lKCkKKyNkZWZpbmUgVEFHRSAoeyJTb24iLCJNb24iLCJEaWUiLCJNaXQiLCJEb24iLCJGcmUiLCJTYW0ifSkKKyNkZWZpbmUgTU9OQVRFICh7IkphbiIsIkZlYiIsIk1hciIsIkFwciIsIk1haSIsIkp1biIsIkp1bCIsIkF1ZyIsXAorICAgICAgICAgICAgICAgICAiU2VwIiwiT2t0IiwiTm92IiwiRGV6In0pCitzdHJpbmcgZHRpbWUoaW50IHdhbm4pIHsKKyAgCisgIGlmICh3YW5uID09IGR0aW1lX2NhY2hlWzBdKQorICAgIHJldHVybihkdGltZV9jYWNoZVsxXSk7CisKKyAgaW50ICpsdCA9IGxvY2FsdGltZSh3YW5uKTsKKyAgcmV0dXJuIHNwcmludGYoIiVzLCAlMmQuICVzICVkLCAlMDJkOiUwMmQ6JTAyZCIsCisgICAgICBUQUdFW2x0W1RNX1dEQVldXSwgbHRbVE1fTURBWV0sIE1PTkFURVtsdFtUTV9NT05dXSwgCisgICAgICBsdFtUTV9ZRUFSXSxsdFtUTV9IT1VSXSwgbHRbVE1fTUlOXSwgbHRbVE1fU0VDXSk7Cit9CisKKy8vIHdlbm4gc3RyZnRpbWUgaW0gRHJpdmVyIG5pY2h0IGV4aXN0aWVydCwgaXN0IGRpZXMgaGllciBlaW4gQWxpYXMgYXVmIGR0aW1lKCksCisvLyB6d2FyIHN0aW1tdCBkYXMgRm9ybWF0IGRhbm4gbmljaHQsIGFiZXIgZGllIE11ZGxpYiBidWdndCBuaWNodCB1bmQgc2NocmVpYnQKKy8vIGVpbiBvcmRlbnRsaWNoZXMgRGF0dW0vVWhyemVpdC4KKyNpZiAhX19FRlVOX0RFRklORURfXyhzdHJmdGltZSkKK3ZhcmFyZ3Mgc3RyaW5nIHN0cmZ0aW1lKG1peGVkIGZtdCwgaW50IGNsb2NrLCBpbnQgbG9jYWxpemVkKSB7CisgIGlmIChpbnRwKGNsb2NrKSAmJiBjbG9jayA+PSAwKQorICAgIHJldHVybiBkdGltZShjbG9jayk7CisgIGVsc2UgaWYgKGludHAoZm10KSAmJiBmbXQgPj0gMCkKKyAgICByZXR1cm4gZHRpbWUoZm10KTsKKyAgCisgIHJldHVybiBkdGltZSh0aW1lKCkpOworfQorI2VuZGlmIC8vIV9fRUZVTl9ERUZJTkVEX18oc3RyZnRpbWUpCisKKy8vICogU2h1dGRvd24gbWl0IHp1c2FldHpsaWNoZW0gbG9nZ2luZworbm9tYXNrIGludCBzaHV0ZG93bihzdHJpbmcgcmVhc29uKQoreworICBzdHJpbmcgbmFtZTsKKyAgc3RyaW5nIG9ibmFtZTsKKyAgc3RyaW5nIG91dHB1dDsKKworICBpZiAoIXJlYXNvbikKKyAgICByZXR1cm4gMDsKKyAgaWYgKCAhQVJDSF9TRUNVUklUWSAmJiBnZXR1aWQocHJldmlvdXNfb2JqZWN0KCkpIT1ST09USUQgJiYKKyAgICAgICAgICBvYmplY3RfbmFtZShwcmV2aW91c19vYmplY3QoKSkhPSIvb2JqL3NodXQiICkKKyAgeworICAgIHdyaXRlKCJZb3UgaGF2ZSBubyBwZXJtaXNzaW9uIHRvIHNodXQgZG93biB0aGUgZ2FtZWRyaXZlciFcbiIpOworICAgIHJldHVybiAwOworICB9CisgIGlmICgodGhpc19pbnRlcmFjdGl2ZSgpKSYmKG5hbWU9Z2V0dWlkKHRoaXNfaW50ZXJhY3RpdmUoKSkpKQorICB7CisgICAgbmFtZT1jYXBpdGFsaXplKG5hbWUpOworICAgIGZpbHRlcih1c2VycygpLCMndGVsbF9vYmplY3QsLy8nCisgICAgICAgICAgICAgICBjYXBpdGFsaXplKG5hbWUpKyIgZmFlaHJ0IGRhcyBTcGllbCBoZXJ1bnRlciFcbiIpOworICB9CisgIGVsc2UKKyAgICBuYW1lPSJBTk9OWU1PVVMiOworICBpZiAocHJldmlvdXNfb2JqZWN0KCkpIG9ibmFtZT1jYXBpdGFsaXplKGdldHVpZChwcmV2aW91c19vYmplY3QoKSkpOworICBvdXRwdXQ9bmFtZTsKKyAgaWYgKG9ibmFtZSAmJiBuYW1lIT1vYm5hbWUpIG91dHB1dD1vdXRwdXQrIiAoIitvYm5hbWUrIikiOworICBpZiAocHJldmlvdXNfb2JqZWN0KCkmJm9iamVjdF9uYW1lKHByZXZpb3VzX29iamVjdCgpKT09Ii9vYmovc2h1dCIpeworICAgIG91dHB1dCs9IiBmYWVocnQgZGFzIFNwaWVsIHZpYSBBcm1hZ2VkZG9uIGhlcnVudGVyLlxuIjsKKyAgICBvdXRwdXQ9ZHRpbWUodGltZSgpKSsiOiAiK291dHB1dDsKKyAgICBsb2dfZmlsZSgiR0FNRV9MT0ciLG91dHB1dCsiXG4iLC0xKTsKKyAgICBlZnVuOjpzaHV0ZG93bigpOworICAgIHJldHVybiAxOworICB9CisgIG91dHB1dD1jdGltZSh0aW1lKCkpKyI6ICIrb3V0cHV0KyIgZmFlaHJ0IGRhcyBTcGllbCBoZXJ1bnRlci5cbiI7CisgIG91dHB1dCs9IiAgICBHcnVuZDogIityZWFzb247CisgIGxvZ19maWxlKCJHQU1FX0xPRyIsb3V0cHV0KyJcbiIsLTEpOworICBlZnVuOjpzaHV0ZG93bigpOworICByZXR1cm4gMTsKK30KKworLy8gKiBsb3dlcmNoYXIKKworaW50IGxvd2VyY2hhcihpbnQgY2hhcikgeworICBpZiAoY2hhcjwnQScgfHwgY2hhcj4nWicpIHJldHVybiBjaGFyOworICByZXR1cm4gY2hhciszMjsKK30KKworLy8gKiB1cHBlcnN0cmluZworCitzdHJpbmcgdXBwZXJzdHJpbmcoc3RyaW5nIHMpCit7CisjaWYgX19FRlVOX0RFRklORURfXyh1cHBlcl9jYXNlKQorICByZXR1cm4odXBwZXJfY2FzZShzKSk7CisjZWxzZQorICBpbnQgaTsKKyAgaWYgKCFzdHJpbmdwKHMpKSByZXR1cm4gMDsKKyAgZm9yIChpPXNpemVvZihzKS0xO2k+PTA7aS0tKSBzW2ldPSgoc1tpXTwnYSd8fHNbaV0+J3onKT9zW2ldOnNbaV0tMzIpOworICByZXR1cm4gczsKKyNlbmRpZgorfQorCisvLyAqIGxvd2Vyc3RyaW5nCisKK3N0cmluZyBsb3dlcnN0cmluZyhzdHJpbmcgcykKK3sKKyAgaWYgKCFzdHJpbmdwKHMpKSByZXR1cm4gMDsKKyAgcmV0dXJuIGxvd2VyX2Nhc2Uocyk7Cit9CisKKworLy8gKiBHRCB2ZXJzaW9uCitzdHJpbmcgdmVyc2lvbigpCit7CisgIHJldHVybiBfX1ZFUlNJT05fXzsKK30KKworLy8gKiBicmVha19zdHJpbmcKKy8vIHN0cmV0Y2goKSAtLSBzdHJldGNoIGEgbGluZSB0byBmaWxsIGEgZ2l2ZW4gd2lkdGggCitwcml2YXRlIHN0cmluZyBzdHJldGNoKHN0cmluZyBzLCBpbnQgd2lkdGgpIHsKKyAgaW50IGxlbj1zaXplb2Yocyk7CisgIGlmIChsZW49PXdpZHRoKSByZXR1cm4gczsKKworICAvLyByZWluZSBMZWVyemVpbGVuLCBkaXJla3QgenVydWVja2dlYmVuCisgIHN0cmluZyB0cmltbWVkPXRyaW0ocyxUUklNX0xFRlQsIiAiKTsKKyAgaWYgKHRyaW1tZWQ9PSIiKSByZXR1cm4gczsgCisgIGludCBzdGFydF9zcGFjZXMgPSBsZW4gLSBzaXplb2YodHJpbW1lZCk7CisKKyAgc3RyaW5nKiB3b3JkcyA9IGV4cGxvZGUodHJpbW1lZCwgIiAiKTsKKyAgLy8gZGVyIGxldHp0ZSBrcmllZ3Qga2VpbmUgU3BhY2VzCisgIGludCB3b3JkX2NvdW50PXNpemVvZih3b3JkcykgLSAxOworICAvLyB3ZW5uIFplaWxlIG51ciBhdXMgZWluZW0gV29ydCwgd2lyZCBkYXMgV29ydCB6dXJ1ZWNrZ2VnZWJlbgorICBpZiAoIXdvcmRfY291bnQpCisgICAgcmV0dXJuICIgIipzdGFydF9zcGFjZXMgKyB3b3Jkc1swXTsKKworICBpbnQgc3BhY2VfY291bnQgPSB3aWR0aCAtIGxlbjsKKworICBpbnQgc3BhY2VfcGVyX3dvcmQ9KHdvcmRfY291bnQrc3BhY2VfY291bnQpIC8gd29yZF9jb3VudDsKKyAgLy8gQW56LldvZXJ0ZXIgbWl0IFp1c2F0ei1TcGFjZQorICBpbnQgcmVzdD0od29yZF9jb3VudCtzcGFjZV9jb3VudCkgJSB3b3JkX2NvdW50OyAKKyAgLy8gUmVzdC1TcGFjZXMgVmVydGVpbGVuCisgIGZvcmVhY2ggKGludCBwb3MgOiByZXN0KSB3b3Jkc1twb3NdKz0iICI7CisgIHJldHVybiAoIiAiKnN0YXJ0X3NwYWNlcykgKyBpbXBsb2RlKCB3b3JkcywgIiAiKnNwYWNlX3Blcl93b3JkICk7Cit9CisKKy8vIGF1cyBHZXNjaHdpbmRpZ2tlaXRzZ3J1ZW5kZW4gaGF0IGRlciBCbG9ja3NhdHogZnVlciBicmVha19zdHJpbmcgZWluZQorLy8gZWlnZW5lIEZ1bmt0aW9uIGJla29tbWVuOgorcHJpdmF0ZSB2YXJhcmdzIHN0cmluZyBibG9ja19zdHJpbmcoc3RyaW5nIHMsIGludCB3aWR0aCwgaW50IGZsYWdzKSB7CisgIC8vIHdlbm4gQlNfTEVBVkVfTVlfTEZTLCBhYmVyIGtlaW4gQlNfTk9fUEFSSU5ERU5ULCBkYW5uIHdlcmRlbiBaZWlsZW4gbWl0CisgIC8vIGVpbmVtIExlZXJ6ZWljaGVuIGJlZ29ubmVuLgorICAvLyBCVFc6IFdlbm4gIUJTX0xFQVZFX01ZX0xGUywgaGF0IGRlciBBdWZydWZlciBiZXJlaXRzIGFsbGUgXG4gZHVyY2ggIiAiCisgIC8vIGVyc2V0enQuCisgIGlmICggKGZsYWdzICYgQlNfTEVBVkVfTVlfTEZTKQorICAgICAgJiYgIShmbGFncyAmIEJTX05PX1BBUklOREVOVCkpCisgIHsKKyAgICAgIHMgPSAiICIrcmVncmVwbGFjZShzLCJcbiIsIlxuICIsMSk7CisgIH0KKworICAvLyBzcHJpbnRmIGZ1ZWxsdCBkaWUgbGV0enRlIFplaWxlIGF1ZiBkaWUgRmVsZGJyZWl0ZSAoaGllciBhbHNvCisgIC8vIFplaWxlbmJyZWl0ZSkgbWl0IEZ1ZWxsemVpY2hlbiBhdWYsIHdlbm4gc2llIE5JQ0hUIG1pdCBcbiB1bWdlYnJvY2hlbgorICAvLyBpc3QuIEVzIHdpcmQgYW4gZGllIGxldHp0ZSBaZWlsZSBhYmVyIGtlaW4gWmVpbGVudW1icnVjaCBhbmdlaGFlbmd0LgorICAvLyBFaWdlbnRsaWNoIGlzdCBkYXMgQXVmZnVlbGxlbiBkb29mLCBhYmVyIHZlcm11dGxpY2ggaXN0IGVzIHVubm9ldGlnLCBlcworICAvLyB3aWVkZXIgcnVlY2tnYWVuZ2lnIHp1IG1hY2hlbi4KKyAgcyA9IHNwcmludGYoICIlLSo9cyIsIHdpZHRoLCBzKTsKKworICBzdHJpbmcgKnRtcD1leHBsb2RlKHMsICJcbiIpOworICAvLyBOdXIgd2VubiBzIG1laHJ6ZWlsaWcgaXN0LCBCbG9ja3NhdHogZHJhdXMgbWFjaGVuLiBEaWUgbGV0enRlIFplaWxlIHdpcmQKKyAgLy8gbmF0dWVybGljaCBuaWNodCBnZWRlaG50LiBTaWUgaXN0IGRhZnVlciBzY2hvbiB2b24gc3ByaW50ZigpIGF1ZmdlZnVlbGx0CisgIC8vIHdvcmRlbi4gQlRXOiBEaWUgbGV0enRlIFplaWxlIGVuZGV0IHUuVS4gbm9jaCBuaWNodCBtaXQgZWluZW0gXG4gKGJ6dy4KKyAgLy8gbnVyIGRhbm4sIHdlbm4gQlNfTEVBVkVfTVlfTEZTIHVuZCBkZXIgdWViZXJnZWJlbmUgVGV4dCBzY2hvbiBuZW4gXG4gYW0KKyAgLy8gRW5kZSBkZXIgbGV0enRlbiBaZWlsZSBoYXQpLCBkYXMgbWFjaHQgZGVyIEF1ZnJ1ZmVyLi4uCisgIGlmIChzaXplb2YodG1wKSA+IDEpCisgICAgcmV0dXJuIGltcGxvZGUoIG1hcCggdG1wWzAuLjwyXSwgIydzdHJldGNoLyonKi8sIHdpZHRoICksICJcbiIgKSAKKyAgICAgICsgIlxuIiArIHRtcFs8MV07CisKKyAgcmV0dXJuIHM7Cit9CisKK3B1YmxpYyB2YXJhcmdzIHN0cmluZyBicmVha19zdHJpbmcoc3RyaW5nIHMsIGludCB3LCBtaXhlZCBpbmRlbnQsIGludCBmbGFncykKK3sKKyAgICBpZiAoICFzIHx8IHMgPT0gIiIgKSByZXR1cm4gIiI7CisKKyAgICBpZiAoICF3ICkgdz03ODsKKworICAgIGlmKCBpbnRwKGluZGVudCkgKQorICAgICAgIGluZGVudCA9IGluZGVudCA/ICIgIippbmRlbnQgOiAiIjsKKworICAgIGludCBpbmRlbnRsZW49c3RyaW5ncChpbmRlbnQpID8gc2l6ZW9mKGluZGVudCkgOiAwOworCisgICAgaWYgKGluZGVudGxlbj53KSB7CisgICAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOworICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigiYnJlYWtfc3RyaW5nOiBpbmRlbnQgbG9uZ2VyICVkIHRoYW4gd2lkdGggJWRcbiIsCisgICAgICAgICAgICAgICAgICBpbmRlbnRsZW4sdykpOworICAgICAgLy8gdz0oKGluZGVudGxlbi93KSsxKSp3OworICAgIH0KKworICAgIGlmICghKGZsYWdzICYgQlNfTEVBVkVfTVlfTEZTKSkgCisgICAgICBzPXJlZ3JlcGxhY2UoIHMsICJcbiIsICIgIiwgMSApOworCisgICAgaWYgKCBmbGFncyAmIEJTX1NJTkdMRV9TUEFDRSApCisgICAgICAgcyA9IHJlZ3JlcGxhY2UoIHMsICIoXnxcbnwgKSAgKiIsICJcXDEiLCAxICk7CisgCisgICAgc3RyaW5nIHByZWZpeD0iIjsKKyAgICBpZiAoaW5kZW50bGVuICYmIGZsYWdzICYgQlNfUFJFUEVORF9JTkRFTlQpIHsKKyAgICAgIGlmIChpbmRlbnRsZW4rc2l6ZW9mKHMpID4gdyB8fCAKKyAgICAgICAgIChmbGFncyAmIEJTX0xFQVZFX01ZX0xGUykgJiYgc3Ryc3RyKHMsIlxuIik+LTEpIHsKKyAgICAgICBwcmVmaXg9aW5kZW50KyJcbiI7CisgICAgICAgaW5kZW50PShmbGFncyAmIEJTX05PX1BBUklOREVOVCkgPyAiIiA6ICIgIjsKKyAgICAgICBpbmRlbnRsZW49c2l6ZW9mKGluZGVudCk7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKCBmbGFncyAmIEJTX0JMT0NLICkgeworICAgICAgLyoKKyAgICAgICAgICAgcyA9IGltcGxvZGUoIG1hcCggZXhwbG9kZSggcywgIlxuIiApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMnYmxvY2tfc3RyaW5nLCB3LCBpbmRlbnRsZW4sIGZsYWdzKSwKKyAgICAgICAgICAgICAgICAgICAgICAiIiApOworICAgICAgKi8KKyAgICAgIHMgPSBibG9ja19zdHJpbmcoIHMgLCB3IC0gaW5kZW50bGVuLCBmbGFncyApOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIHMgPSBzcHJpbnRmKCIlLTEuKj1zIix3LWluZGVudGxlbixzKTsKKyAgICB9CisgICAgaWYgKCBzWzwxXSAhPSAnXG4nICkgcyArPSAiXG4iOworCisgICAgaWYgKCAhaW5kZW50bGVuICkgcmV0dXJuIHByZWZpeCArIHM7CisgICAgCisgICAgc3RyaW5nIGluZGVudDIgPSAoIGZsYWdzICYgQlNfSU5ERU5UX09OQ0UgKSA/ICgiICIqaW5kZW50bGVuKSA6aW5kZW50OworICAgICAgCisgICAgcmV0dXJuIHByZWZpeCArIGluZGVudCArIAorICAgICAgcmVncmVwbGFjZSggc1swLi48Ml0sICJcbiIsICJcbiIraW5kZW50MiwgMSApICsgIlxuIjsKKyAgICAgIC8qCisgICAgICAgc3RyaW5nICpidWY7CisKKyAgICAgICBidWYgPSBleHBsb2RlKCBzLCAiXG4iICk7CisgICAgICAgcmV0dXJuIHByZWZpeCArIGluZGVudCArIGltcGxvZGUoIGJ1ZlswLi48Ml0sICJcbiIraW5kZW50MiApICsgYnVmWzwxXSArICJcbiI7CisgICAgICAqLworfQorCisvLyAqIEVsZW1lbnRlIGF1cyBtYXBwaW5nIGxvZXNjaGVuIC0gbWFwcGluZyB2b3JoZXIga29waWVyZW4KKworbWFwcGluZyBtX2NvcHlfZGVsZXRlKG1hcHBpbmcgbSwgbWl4ZWQga2V5KSB7CisgIHJldHVybiBtX2RlbGV0ZShjb3B5KG0pLCBrZXkpOworfQorCisvLyAqIHRpbWVzCitpbnQgbGFzdF9yZWJvb3RfdGltZSgpCit7CisgIHJldHVybiBfX0JPT1RfVElNRV9fOworfQorCitpbnQgZmlyc3RfYm9vdF90aW1lKCkKK3sKKyAgcmV0dXJuIDcwMTUxNzYwMDsKK30KKworaW50IGV4aXN0X2RheXMoKQoreworICByZXR1cm4gKCgodGltZSgpLWZpcnN0X2Jvb3RfdGltZSgpKS84NjQwKSs1KS8xMDsKK30KKworLy8gKiB1cHRpbWUgOikKK3N0cmluZyB1cHRpbWUoKQoreworICBpbnQgdDsKKyAgaW50IHRtcDsKKyAgc3RyaW5nIHM7CisKKyAgdD10aW1lKCktX19CT09UX1RJTUVfXzsKKyAgcz0iIjsKKyAgaWYgKHQ+PTg2NDAwKQorICAgIHMrPXNwcmludGYoIiVkIFRhZyVzLCAiLHRtcD10Lzg2NDAwLCh0bXA9PTE/IiI6ImUiKSk7CisgIGlmICh0Pj0zNjAwKQorICAgIHMrPXNwcmludGYoIiVkIFN0dW5kZSVzLCAiLHRtcD0odD10JTg2NDAwKS8zNjAwLCh0bXA9PTE/IiI6Im4iKSk7CisgIGlmICh0PjYwKQorICAgIHMrPXNwcmludGYoIiVkIE1pbnV0ZSVzIHVuZCAiLHRtcD0odD10JTM2MDApLzYwLCh0bXA9PTE/IiI6Im4iKSk7CisgIHJldHVybiBzK3NwcmludGYoIiVkIFNla3VuZGUlcyIsdD10JTYwLCh0PT0xPyIiOiJuIikpOworfQorCisvLyAqIFdhcyB0dW4gYmVpICdkYW5nbGluZycgbGZ1bi1jbG9zdXJlcyA/Cit2b2lkIGRhbmdsaW5nX2xmdW5fY2xvc3VyZSgpIHsKKyAgcmFpc2VfZXJyb3IoImRhbmdsaW5nIGxmdW4gY2xvc3VyZVxuIik7Cit9CisKKy8vICogU3BlcnJlbiBhdXNzZXIgZnVlciBtYXN0ZXIvc2ltdWxfZWZ1bgorCisjaWYgX19FRlVOX0RFRklORURfXyhzZXRfZW52aXJvbm1lbnQpCitub21hc2sgdm9pZCBzZXRfZW52aXJvbm1lbnQob2JqZWN0IG8xLCBvYmplY3QgbzIpIHsKKyAgcmFpc2VfZXJyb3IoIkF2YWlsYWJsZSBvbmx5IGZvciByb290XG4iKTsKK30KKyNlbmRpZgorCitub21hc2sgdm9pZCBzZXRfdGhpc19wbGF5ZXIob2JqZWN0IHBsKSB7CisgIHJhaXNlX2Vycm9yKCJBdmFpbGFibGUgb25seSBmb3Igcm9vdFxuIik7Cit9CisKKyNpZiBfX0VGVU5fREVGSU5FRF9fKGV4cG9ydF91aWQpCitub21hc2sgdm9pZCBleHBvcnRfdWlkKG9iamVjdCBvYikgeworICByYWlzZV9lcnJvcigiQXZhaWxhYmxlIG9ubHkgZm9yIHJvb3RcbiIpOworfQorI2VuZGlmCisKKy8vICogSmV0enQgYXVjaCBjbG9zdXJlcworaW50IHByb2Nlc3NfZmxhZzsKKworcHVibGljIG5vbWFzayBpbnQgcHJvY2Vzc19jYWxsKCkKK3sKKyAgaWYgKHByb2Nlc3NfZmxhZz4wKQorICAgIHJldHVybiBwcm9jZXNzX2ZsYWc7CisgIGVsc2UgcmV0dXJuKDApOworfQorCitwcml2YXRlIG5vbWFzayBzdHJpbmcgX3Byb2Nlc3Nfc3RyaW5nKHN0cmluZyBzdHIsb2JqZWN0IHBvKSB7CisgICAgICAgICAgICAgIHNldF90aGlzX29iamVjdChwbyk7CisgICAgICAgICAgICAgIHJldHVybihlZnVuOjpwcm9jZXNzX3N0cmluZyhzdHIpKTsKK30KKworbm9tYXNrIHN0cmluZyBwcm9jZXNzX3N0cmluZyggbWl4ZWQgc3RyICkKK3sKKyAgc3RyaW5nIHRtcCwgZXJyOworICBpbnQgZmxhZzsgCisKKyAgaWYgKCBjbG9zdXJlcChzdHIpICkgeworICAgICAgc2V0X3RoaXNfb2JqZWN0KCBwcmV2aW91c19vYmplY3QoKSApOworICAgICAgcmV0dXJuIGZ1bmNhbGwoc3RyKTsKKyAgfQorICBlbHNlIGlmIChzdHI9PTApCisgICAgICByZXR1cm4oKHN0cmluZylzdHIpOworICBlbHNlIGlmICggIXN0cmluZ3Aoc3RyKSApIHsKKyAgICAgIHJldHVybiB0b19zdHJpbmcoc3RyKTsKKyAgfQorCisgIGlmICggIShmbGFnID0gcHJvY2Vzc19mbGFnID4gdGltZSgpIC0gNjApKSAgICAgICAgICAgICAgICAgICAgIAorICAgICAgcHJvY2Vzc19mbGFnPXRpbWUoKTsKKworICBlcnIgPSBjYXRjaCh0bXAgPSBmdW5jYWxsKCMnX3Byb2Nlc3Nfc3RyaW5nLHN0cixwcmV2aW91c19vYmplY3QoKSk7IHB1Ymxpc2gpOworCisgIGlmICggIWZsYWcgKQorICAgIHByb2Nlc3NfZmxhZz0wOworCisgIGlmIChlcnIpIHsKKyAgICAvLyBWZXJhcmJlaXR1bmcgYWJicmVjaGVuCisgICAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKKyAgICByYWlzZV9lcnJvcihlcnIpOworICB9CisgIHJldHVybiB0bXA7Cit9CisKKy8vICdta2RpciAtcCcgLSBlcnpldWd0IGVpbmUga29tcGxldHRlIEhpZXJhcmNoaWUgdm9uIFZlcnplaWNobmlzc2VuLgorLy8gd2VubiBkYXMgVmVyemVpY2huaXMgYW5nZWxlZ3Qgd3VyZGUgb2RlciBzY2hvbiBleGlzdGllcnQsIHdpcmQgMQorLy8genVydWVja2dlbGllZmVydCwgc29uc3QgMC4KKy8vIFdpcmZ0IGVpbmVuIEZlaGxlciwgd2VubiBkYXMgYW5nZWJlbmUgVmVyemVpY2huaXMgbmljaHQgYWJzb2x1dCBpc3QhCitwdWJsaWMgaW50IG1rZGlycChzdHJpbmcgZGlyKSB7CisgIC8vIHdlbm4gZXMgbnVyIGtlaW5lbiBmdWVocmVuZGVuIC8gZ2lidCwgaXN0IGRhcyBlaW4gRmVobGVyLgorICBpZiAoc3Ryc3RyKGRpciwgIi8iKSAhPSAwKQorICAgIHJhaXNlX2Vycm9yKCJta2RpcnAoKTogUGZhZCBpc3QgbmljaHQgYWJzb2x1dGUuXG4iKTsKKyAgLy8gY3V0IG9mZiB0cmFpbGluZyAvLi4uCisgIGlmIChkaXJbPDFdPT0nLycpCisgICAgICBkaXIgPSBkaXJbMC4uPDJdOworCisgIGludCBmc3RhdCA9IGZpbGVfc2l6ZShkaXIpOworICAvLyB3ZW5uIGVzIHNjaG9uIGV4aXN0aWVydCwgdHVuIHdpciBlaW5mYWNoIHNvLCBhbHMgaGFldHRlbiB3aXIgZXMgYW5nZWxlZ3QuCisgIGlmIChmc3RhdCA9PSBGU0laRV9ESVIpCisgICAgcmV0dXJuIDE7CisgIC8vIHdlbm4gc2Nob24gbmUgRGF0ZWkgZXhpc3RpZXJ0LCBnZWh0IGVzIG5pY2h0LgorICBpZiAoZnN0YXQgIT0gRlNJWkVfTk9GSUxFKQorICAgIHJldHVybiAwOworICAvLyB3ZW5uIGVzIG51ciBlaW5lbiAvIGdpYnQgKGRlbiBmdWVocmVuZGVuKSwgZGFubiBpc3QgZXMgZWluCisgIC8vIHRvcGxldmVsLXZlcnplaWNobmlzLCB3YXMgZGlyZWt0IGFuZ2VsZWd0IHdpcmQuCisgIGlmIChzdHJyc3RyKGRpciwiLyIpPT0wKSB7CisgICAgcmV0dXJuIGZ1bmNhbGwoYmluZF9sYW1iZGEoIydlZnVuOjpta2RpciwgcHJldmlvdXNfb2JqZWN0KCkpLCBkaXIpOworICB9CisKKyAgLy8gbWtkaXIoKSBuaWNodCBkaXJla3QgcnVmZW4sIHNvbmRlcm4gdm9yaGVyIGFscyBjbG9zdXJlIGFucyBhdWZydWZlbmRlCisgIC8vIE9iamVrdCBiaW5kZW4uIFNvbnN0IGxhZXVmdCBkaWUgUmVjaHRlcHJ1ZWZ1bmcgaW4gdmFsaWRfd3JpdGUoKSBpbSBNYXN0ZXIKKyAgLy8gdW50ZXIgZGVyIEFubmFobWUsIGRhc3MgZGllIHNpbXVsX2VmdW4uYyBtaXQgaWhyZXIgcm9vdCBpZCB3YXMgd2lsbC4KKworICAvLyBqZXR6dCByZWt1cnNpdiBkaWUgVmVyemVpY2huaXNoaWVyYXJjaGllIGFubGVnZW4uIFdlbm4gZGFzIGVyZm9sZ3JlaWNoCisgIC8vIGlzdCwgZGFubiBrb2VubmVuIHdpciBqZXR6dCBtaXQgbWtkaXIgZGFzIHRpZWZzdGUgVmVyemVpY2huaXMgYW5sZWdlbgorICBpZiAobWtkaXJwKGRpclswLi5zdHJyc3RyKGRpciwiLyIpLTFdKSA9PSAxKQorICAgIHJldHVybiBmdW5jYWxsKGJpbmRfbGFtYmRhKCMnZWZ1bjo6bWtkaXIsIHByZXZpb3VzX29iamVjdCgpKSwgZGlyKTsKK30KKworCisvLyAqIFByb3BlcnRpZXMgZ2dmcy4gbWl0c3BlaWNoZXJuCittaXhlZCBzYXZlX29iamVjdChtaXhlZCBuYW1lKQoreworICBtYXBwaW5nIHByb3BlcnRpZXM7CisgIG1hcHBpbmcgc2F2ZTsKKyAgbWl4ZWQgaW5kZXgsIHJlczsKKyAgaW50IGk7CisKKyAgLy8gbnVyIFN0cmluZ3MgdW5kIDAgenVsYXNzZW4KKyAgaWYgKCghc3RyaW5ncChuYW1lKSB8fCAhc2l6ZW9mKG5hbWUpKSAmJiAKKyAgICAgICghaW50cChuYW1lKSB8fCBuYW1lIT0wKSkgeworICAgICAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKKyAgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoCisgICAgICAgICAiT25seSBub24tZW1wdHkgc3RyaW5ncyBhbmQgMCBtYXkgYmUgdXNlZCBhcyBmaWxlbmFtZSBpbiAiCisgICAgICAgICAic2VmdW46OnNhdmVfb2JqZWN0KCkhIEFyZ3VtZW50IHdhcyAlT1xuIixuYW1lKSk7CisgIH0KKworICBzYXZlID0gbV9hbGxvY2F0ZSgwLCAyKTsKKyAgcHJvcGVydGllcyA9IChtYXBwaW5nKXByZXZpb3VzX29iamVjdCgpLT5RdWVyeVByb3BlcnRpZXMoKTsKKworICBpZihtYXBwaW5ncChwcm9wZXJ0aWVzKSkKKyAgeworICAgIC8vIGRlbGV0ZSBhbGwgZW50cmllcyBpbiBtYXBwaW5nIHByb3BlcnRpZXMgd2l0aG91dCBTQVZFIGZsYWchCisgICAgaW5kZXggPSBtX2luZGljZXMocHJvcGVydGllcyk7CisgICAgZm9yKGkgPSBzaXplb2YoaW5kZXgpLTE7IGk+PTA7aS0tKQorICAgIHsKKyAgICAgIGlmKHByb3BlcnRpZXNbaW5kZXhbaV0sIEZfTU9ERV0gJiBTQVZFKQorICAgICAgeworICAgICAgIHNhdmVbaW5kZXhbaV1dID0gcHJvcGVydGllc1tpbmRleFtpXV07CisgICAgICAgc2F2ZVtpbmRleFtpXSwgRl9NT0RFXSA9CisgICAgICAgcHJvcGVydGllc1tpbmRleFtpXSwgRl9NT0RFXSAmCisgICAgICAgICAgICAgICAgICAgICh+KFNFVE1OT1RGT1VORHxRVUVSWU1OT1RGT1VORHxRVUVSWUNBQ0hFRHxTRVRDQUNIRUQpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZWxzZSBzYXZlID0gKFtdKTsKKworICAvLyBzYXZlIG9iamVjdCEKKyAgcHJldmlvdXNfb2JqZWN0KCktPl9zZXRfc2F2ZV9kYXRhKHNhdmUpOworICAvLyBmb3JtYXQ6IHdpZSBkZWZpbmllcnQgaW4gY29uZmlnLmgKKyAgaWYgKHN0cmluZ3AobmFtZSkpCisgICAgcmVzID0gZnVuY2FsbChiaW5kX2xhbWJkYSgjJ2VmdW46OnNhdmVfb2JqZWN0LCBwcmV2aW91c19vYmplY3QoKSksIG5hbWUsCisgICAgICAgX19MSUJfX1NBVkVfRk9STUFUX1ZFUlNJT05fXyk7CisgIGVsc2UKKyAgICByZXMgPSBmdW5jYWxsKGJpbmRfbGFtYmRhKCMnZWZ1bjo6c2F2ZV9vYmplY3QsIHByZXZpb3VzX29iamVjdCgpKSwKKyAgICAgICBfX0xJQl9fU0FWRV9GT1JNQVRfVkVSU0lPTl9fKTsKKyAgcHJldmlvdXNfb2JqZWN0KCktPl9zZXRfc2F2ZV9kYXRhKDApOworCisjaWZkZWYgSU9TVEFUUworICAvLyBTdGF0cy4uLgorICBzdHJ1Y3QgaW9zdGF0X3Mgc3RhdCA9ICg8aW9zdGF0X3M+KTsKKyAgc3RhdC0+b25hbWUgPSBvYmplY3RfbmFtZShwcmV2aW91c19vYmplY3QoKSk7CisgIHN0YXQtPnRpbWUgPSB0aW1lKCk7CisgIC8vc3RhdC0+c2l6ZSA9IChpbnQpb2JqZWN0X2luZm8ocHJldmlvdXNfb2JqZWN0KCksT0lORk9fTUVNT1JZLAorICAvLyAgICBPSU1fVE9UQUxfREFUQV9TSVpFKTsKKyAgaWYgKHN0cmluZ3AobmFtZSkpCisgICAgICBzdGF0LT5zaXplID0gZmlsZV9zaXplKG5hbWUgKyAiLm8iKTsKKyAgZWxzZQorICAgICAgc3RhdC0+c2l6ZW9mKHJlcyk7CisgIC8vZGVidWdfbWVzc2FnZSgic2F2ZW86ICIrc2F2ZW9fc3RhdFswXSsiXG4iKTsKKyAgc2F2ZW9fc3RhdFsxXVtzYXZlb19zdGF0WzBdXSA9IHN0YXQ7CisgIHNhdmVvX3N0YXRbMF0gPSAoc2F2ZW9fc3RhdFswXSArIDEpICUgc2l6ZW9mKHNhdmVvX3N0YXRbMV0pOworICAvL2RlYnVnX21lc3NhZ2UoInNhdmVvIDI6ICIrc2F2ZW9fc3RhdFswXSsiXG4iKTsKKyNlbmRpZgorCisgIHJldHVybiByZXM7Cit9CisKKy8vICogQXVjaCBQcm9wZXJ0aWVzIGxhZGVuCitpbnQgcmVzdG9yZV9vYmplY3Qoc3RyaW5nIG5hbWUpCit7CisgIGludCByZXN1bHQ7CisgIG1peGVkIGluZGV4OworICBtaXhlZCBzYXZlOworICBtYXBwaW5nIHByb3BlcnRpZXM7CisgIGludCBpOworICBjbG9zdXJlIGNsOworCisgIC8vIGdldCBhY3R1YWwgcHJvcGVydHkgc2V0dGluZ3MgKGJ5IGNyZWF0ZSgpKQorICBwcm9wZXJ0aWVzID0gKG1hcHBpbmcpcHJldmlvdXNfb2JqZWN0KCktPlF1ZXJ5UHJvcGVydGllcygpOworCisvLyAgREVCVUcoc3ByaW50ZigiUkVTVE9SRSAlT1xuIixuYW1lKSk7CisgIC8vIHJlc3RvcmUgb2JqZWN0CisgIHJlc3VsdD1mdW5jYWxsKGJpbmRfbGFtYmRhKCMnZWZ1bjo6cmVzdG9yZV9vYmplY3QsIHByZXZpb3VzX29iamVjdCgpKSwgbmFtZSk7CisgIC8vJykpCisgIC8vX2dldF9zYXZlX2RhdGEgbGllZmVydCB0YXRzYWVjaGxpY2ggbWl4ZWQgenVydWVjaywgd2VubiBkYXMgYXVjaCBpbW1lciBlaW4gCisgIC8vbWFwcGluZyBzZWluIHNvbGx0ZS4KKyAgc2F2ZSA9IChtaXhlZClwcmV2aW91c19vYmplY3QoKS0+X2dldF9zYXZlX2RhdGEoKTsKKyAgaWYobWFwcGluZ3Aoc2F2ZSkpCisgIHsKKyAgICBpbmRleCA9IG1faW5kaWNlcyhzYXZlKTsKKyAgICBmb3IoaSA9IHNpemVvZihpbmRleCktMTsgaT49MDsgaS0tKQorICAgIHsKKyAgICAgIHByb3BlcnRpZXNbaW5kZXhbaV1dID0gc2F2ZVtpbmRleFtpXV07CisgICAgICBwcm9wZXJ0aWVzW2luZGV4W2ldLCBGX01PREVdID0gc2F2ZVtpbmRleFtpXSwgRl9NT0RFXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ+KFNFVENBQ0hFRHxRVUVSWUNBQ0hFRCk7CisgICAgfQorICB9CisgIGVsc2UgcHJvcGVydGllcyA9IChbXSk7CisKKyAgLy8gcmVzdG9yZSBwcm9wZXJ0aWVzCisgIGZ1bmNhbGwoCisgICAgICAgICAgYmluZF9sYW1iZGEoCisgICAgICAgICAgICAgICAgICAgICB1bmJvdW5kX2xhbWJkYSgoeydhcmd9KSwgLy8nfSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoeyMnY2FsbF9vdGhlciwoeyMndGhpc19vYmplY3R9KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2V0UHJvcGVydGllcyIsJ2FyZ30pKSwvLycpCisgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c19vYmplY3QoKSkscHJvcGVydGllcyk7CisgIHByZXZpb3VzX29iamVjdCgpLT5fc2V0X3NhdmVfZGF0YSgwKTsKKworI2lmZGVmIElPU1RBVFMKKyAgLy8gU3RhdHMuLi4KKyAgLy9kZWJ1Z19tZXNzYWdlKCJyZXN0b3JlbzogIityZXN0b3Jlb19zdGF0WzBdKyJcbiIpOworICBzdHJ1Y3QgaW9zdGF0X3Mgc3RhdCA9ICg8aW9zdGF0X3M+KTsKKyAgc3RhdC0+b25hbWUgPSBvYmplY3RfbmFtZShwcmV2aW91c19vYmplY3QoKSk7CisgIHN0YXQtPnRpbWUgPSB0aW1lKCk7CisgIC8vc3RhdC0+c2l6ZSA9IChpbnQpb2JqZWN0X2luZm8ocHJldmlvdXNfb2JqZWN0KCksT0lORk9fTUVNT1JZLAorICAvLyAgICBPSU1fVE9UQUxfREFUQV9TSVpFKTsKKyAgc3RhdC0+c2l6ZSA9IGZpbGVfc2l6ZShuYW1lICsgIi5vIik7CisgIHJlc3RvcmVvX3N0YXRbMV1bcmVzdG9yZW9fc3RhdFswXV0gPSBzdGF0OworCisgIHJlc3RvcmVvX3N0YXRbMF0gPSAocmVzdG9yZW9fc3RhdFswXSArIDEpICUgc2l6ZW9mKHJlc3RvcmVvX3N0YXRbMV0pOworI2VuZGlmCisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gKiBIQiBlaW5lcyBPYmpla3RlcyBlaW4vYXVzc2NoYWx0ZW4KK2ludCBzZXRfb2JqZWN0X2hlYXJ0X2JlYXQob2JqZWN0IG9iLCBpbnQgZmxhZykKK3sKKyAgaWYgKG9iamVjdHAob2IpKQorICAgIHJldHVybiBmdW5jYWxsKGJpbmRfbGFtYmRhKCMnZWZ1bjo6Y29uZmlndXJlX29iamVjdCxvYiksIG9iLCBPQ19IRUFSVF9CRUFULCBmbGFnKTsKK30KKworLy8gKiBNYWdpZXJsZXZlbGdydXBwZW4gZXJtaXR0ZWxuCitpbnQgcXVlcnlfd2l6X2dycChtaXhlZCB3aXopCit7CisgIGludCBsZXY7CisKKyAgbGV2PXF1ZXJ5X3dpel9sZXZlbCh3aXopOworICBpZiAobGV2PFNFRVJfTFZMKSByZXR1cm4gMDsKKyAgaWYgKGxldj49R09EX0xWTCkgcmV0dXJuIGxldjsKKyAgaWYgKGxldj49QVJDSF9MVkwpIHJldHVybiBBUkNIX0dSUDsKKyAgaWYgKGxldj49RUxERVJfTFZMKSByZXR1cm4gRUxERVJfR1JQOworICBpZiAobGV2Pj1MT1JEX0xWTCkgcmV0dXJuIExPUkRfR1JQOworICBpZiAobGV2Pj1TUEVDSUFMX0xWTCkgcmV0dXJuIFNQRUNJQUxfR1JQOworICBpZiAobGV2Pj1ET01BSU5NRU1CRVJfTFZMKSByZXR1cm4gRE9NQUlOTUVNQkVSX0dSUDsKKyAgaWYgKGxldj49V0laQVJEX0xWTCkgcmV0dXJuIFdJWkFSRF9HUlA7CisgIGlmIChsZXY+PUxFQVJORVJfTFZMKSByZXR1cm4gTEVBUk5FUl9HUlA7CisgIHJldHVybiBTRUVSX0dSUDsKK30KKworbWl4ZWQgKndpemxpc3RfaW5mbygpCit7CisgIGlmIChBUkNIX1NFQ1VSSVRZIHx8ICFleHRlcm5fY2FsbCgpKQorICAgICAgICAgICAgcmV0dXJuIGVmdW46Ondpemxpc3RfaW5mbygpOworICByZXR1cm4gMDsKK30KKworLy8gKiB3aXpsaXN0IGF1c2dlYmVuCit2YXJhcmdzIHZvaWQgd2l6bGlzdChzdHJpbmcgbmFtZSwgaW50IHNvcnRrZXkgKSB7CisKKyAgaWYgKCFuYW1lKQorICB7CisgICAgaWYgKHRoaXNfcGxheWVyKCkpCisgICAgICBuYW1lID0gZ2V0dWlkKHRoaXNfcGxheWVyKCkpOworICAgIGlmICghbmFtZSkKKyAgICAgIHJldHVybjsKKyAgfQorCisgIC8vIFNjaGx1ZXNzZWwgZGFyZiBudXIgaW4gZWluZW0gZ3VlbHRpZ2VuIEJlcmVpY2ggc2VpbgorICBpZiAoc29ydGtleTxXTF9OQU1FIHx8IHNvcnRrZXk+PVdMX1NJWkUpIHNvcnRrZXk9V0xfQ09TVDsKKworICBtaXhlZCoqIHdsID0gZWZ1bjo6d2l6bGlzdF9pbmZvKCk7CisgIC8vIG5hY2ggPHNvcnRrZXk+IHNvcnRpZXJlbgorICB3bCA9IHNvcnRfYXJyYXkod2wsIGZ1bmN0aW9uIGludCAobWl4ZWQgYSwgbWl4ZWQgYikKKyAgICAgIHtyZXR1cm4gYVtzb3J0a2V5XSA8IGJbc29ydGtleV07IH0gKTsKKworICAvLyBTdW1tZSB1ZWJlciBhbGxlIEtvbW1hbmRvcyBlcm1pdHRlbG4uCisgIGludCB0b3RhbF9jbWQsIGk7CisgIGludCBwb3M9LTE7CisgIGZvcmVhY2gobWl4ZWQgZW50cnkgOiB3bCkKKyAgeworICAgIHRvdGFsX2NtZCArPSBlbnRyeVtXTF9DT01NQU5EU107CisgICAgaWYgKGVudHJ5W1dMX05BTUVdID09IG5hbWUpCisgICAgICBwb3MgPSBpOworICAgICsraTsKKyAgfQorCisgIGlmIChwb3MgPCAwICYmIG5hbWUgIT0gIkFMTCIgJiYgbmFtZSAhPSAiVE9QMTAwIikKKyAgICByZXR1cm47CisKKyAgaWYgKG5hbWUgPT0gIlRPUDEwMCIpCisgIHsKKyAgICBpZiAoc2l6ZW9mKHdsKSA+IDEwMCkKKyAgICAgIHdsID0gd2xbMC4uMTAwXTsKKyAgICBlbHNlCisgICAgICB3bCA9IHdsOworICB9CisgIC8vIHVtIG5hbWUgaGVydW0gc2NobmVpZGVuCisgIGVsc2UgaWYgKG5hbWUgIT0gIkFMTCIpCisgIHsKKyAgICBpZiAoc2l6ZW9mKHdsKSA8PSAyMSkKKyAgICAgIHdsID0gd2w7CisgICAgZWxzZSBpZiAocG9zICsgMTAgPCBzaXplb2Yod2wpICYmIHBvcyAtIDEwID4gMCkKKyAgICAgIHdsID0gd2xbcG9zLTEwLi5wb3MrMTBdOworICAgIGVsc2UgaWYgKHBvcyA8PTIxKQorICAgICAgd2wgPSB3bFswLi4yMF07CisgICAgZWxzZSBpZiAocG9zID49IHNpemVvZih3bCkgLSAyMSkKKyAgICAgIHdsID0gd2xbPDIxLi5dOworICAgIGVsc2UKKyAgICAgIHdsID0gd2w7CisgIH0KKworICB3cml0ZSgiXG5XaXphcmQgdG9wIHNjb3JlIGxpc3RcblxuIik7CisgIGlmICh0b3RhbF9jbWQgPT0gMCkKKyAgICB0b3RhbF9jbWQgPSAxOworICBwcmludGYoIiUtMjBzICUtNnMgJS0zcyAlLTE3cyAlLTZzICUtNnMgJS02c1xuIiwKKyAgICAgICAgICJFVUlEIiwgImNtZHMiLCAiJSIsICJDb3N0cyIsICJIQiIsICJBcnJheXMiLCJNYXBwLiIpOworICBmb3JlYWNoKG1peGVkIGU6IHdsKQorICB7CisgICAgcHJpbnRmKCIlLToyMHMgJTo2ZCAlOjJkJSUgWyU6NmRrLCU6NmRHXSAlOjZkICU6NmQgJTo2ZFxuIiwKKyAgICAgICAgICBlW1dMX05BTUVdLCBlW1dMX0NPTU1BTkRTXSwgZVtXTF9DT01NQU5EU10gKiAxMDAgLyB0b3RhbF9jbWQsCisgICAgICAgICAgZVtXTF9DT1NUXSAvIDEwMDAsIGVbV0xfVE9UQUxfR0lHQUNPU1RdLAorICAgICAgICAgIGVbV0xfSEVBUlRfQkVBVFNdLCBlW1dMX0FSUkFZX1RPVEFMXSwgZVtXTF9NQVBQSU5HX1RPVEFMXQorICAgICAgICAgICk7CisgIH0KKyAgcHJpbnRmKCJcblRvdGFsICAgICAgICAgJTdkICAgICAgICAgKCVkKVxuXG4iLCB0b3RhbF9jbWQsIHNpemVvZih3bCkpOworfQorCisKKy8vIEFiIGhpZXIgZm9sZ2VuIEhpbGZzZnVua3Rpb25lbiBmdWVyIGNhbGxfb3V0KCkgYnp3LiBmdWVyIGRlcmVuIEJlZ3Jlbnp1bmcKKworLy8gZXJtaXR0ZWx0IGRhcyBPYmpla3QgZGVzIENhbGxvdXRzLgorcHJpdmF0ZSBvYmplY3QgX2NhbGxfb3V0X29iaiggbWl4ZWQgY2FsbF9vdXQgKSB7CisgICAgcmV0dXJuIHBvaW50ZXJwKGNhbGxfb3V0KSA/IGNhbGxfb3V0WzBdIDogMDsKK30KKworcHJpdmF0ZSB2b2lkIF9zYW1lX29iamVjdCggb2JqZWN0IG9iLCBtYXBwaW5nIG0gKSB7CisgIC8vIGlzdCBuaWNodCBzbyBibG9lZCwgd2llIGVzIGF1c3NpZWh0LCBzLiBuYWNoZm9sZ2VkZSBWZXJ3ZW5kdW5nIHZvbiBtCisgIGlmICggbVtvYl0gKQorICAgIG1bb2JdICs9ICh7IG9iIH0pOworICBlbHNlCisgICAgbVtvYl0gPSAoeyBvYiB9KTsgCit9CisKKy8vIGFsbGUgT2JqZWt0ZSBpbSBNYXBwaW5nIG0genVzYW1tZW5mYXNzZW4sIGRpZSBkZW4gZ2xlaWNoZW4gTG9hZG5hbWUgKE5hbWUgZGVyCisvLyBCbHVlcHJpbnQpIGhhYmVuLCBhbHNvIGFsbGUgQ2xvbmVzIGRlciBCUCwgZGllIENhbGxvdXRzIGxhdWZlbiBoYWJlbi4KKy8vIE9iamVrdGUgd2VyZGVuIGF1Y2ggbWVocmZhY2ggZXJmYXNzdCwgamUgbmFjaCBBbnphaGwgaWhyZXIgQ2FsbG91dHMuCitwcml2YXRlIHZvaWQgX3NhbWVfcGF0aCggb2JqZWN0IGtleSwgb2JqZWN0ICpvYnMsIG1hcHBpbmcgbSApIHsKKyAgc3RyaW5nIHBhdGg7CisgIGlmICghb2JqZWN0cChrZXkpIHx8ICFwb2ludGVycChvYnMpKSByZXR1cm47CisKKyAgcGF0aCA9IGxvYWRfbmFtZShrZXkpOworCisgIGlmICggbVtwYXRoXSApCisgICAgbVtwYXRoXSArPSBvYnM7CisgIGVsc2UKKyAgICBtW3BhdGhdID0gb2JzOworfQorCisvLyBrZXkga2FubiBvYmplY3Qgb2RlciBzdHJpbmcgc2Vpbi4KK3ByaXZhdGUgaW50IF90b29fbWFueSggbWl4ZWQga2V5LCBtYXBwaW5nIG0sIGludCBpICkgeworICAgIHJldHVybiBzaXplb2YobVtrZXldKSA+PSBpOworfQorCisvLyBhbGxlIE9iamVrdGUgaW4gb2JzIHplcnN0b2VyZW4gdW5kIEZlaGxlcm1lbGR1bmcgYXVzZ2ViZW4uIEFDSFRVTkc6IERpZQorLy8gT2JqZWt0ZSB3ZXJkZW4gaWRSIHp1IGVpbmVyIEJQIGdlaG9lcmVuLCBtdWVzc2VuIGFiZXIgbmljaHQhIEluIGRlbSBGYWxsCisvLyB3aXJkIGF1ZiBkZXIgRWJlbmUgYWJlciBudXIgZWluIE9iamVrdCBpbiBkZXIgRmVobGVybWVsZHVuZyBlcndhZWhudC4KK3ByaXZhdGUgdm9pZCBfZGVzdHJveSggbWl4ZWQga2V5LCBvYmplY3QgKm9icywgc3RyaW5nIHRleHQsIGludCB1aWQgKSB7CisgICAgaWYgKCFwb2ludGVycChvYnMpKSByZXR1cm47CisgICAgLy8gQXJyYXkgbWl0IHVuaXF1ZSBFaW50cmFlZ2UgZXJ6ZXVnZW4uCisgICAgb2JzID0gbV9pbmRpY2VzKCBta21hcHBpbmcob2JzKSApOworICAgIC8vIEZlaGxlcm1lbGR1bmcgYXVmIGRlciBFYmVuZSBhdXNnZWJlbiwgaW0gY2F0Y2goKSBtaXQgcHVibGlzaCwgZGFtaXQgZXMKKyAgICAvLyBhdWYgZGVyIEViZW5lIGRpcmVrdCBzY3JvbGx0LCBkZXIgYmFja3RyYWNlIHZlcmZ1ZWdiYXIgaXN0IChpbQorICAgIC8vIGdlZ2Vuc2F0eiB6dXIgTG9lc3VuZyBtaXR0ZWxzIENhbGxvdXQpLCBkaWUgQXVzZnVlaHJ1bmcgYWJlciB3ZWl0ZXIKKyAgICAvLyBsYWV1ZnQuCisgICAgY2F0Y2goIGVmdW46OnJhaXNlX2Vycm9yKCAgICAgICAgICAgCisgICAgICAgICBzcHJpbnRmKCB0ZXh0LCAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgdWlkID8gKHN0cmluZyltYXN0ZXIoKS0+Y3JlYXRvcl9maWxlKGtleSkgOiBrZXksICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICBzaXplb2Yob2JzKSwgb2JqZWN0X25hbWUob2JzWzwxXSkgKSApO3B1Ymxpc2gpOworICAgIC8vIFVuZCB3ZWcgbWl0IGRlbSBLcmFtLi4uCisgICAgZmlsdGVyKCBvYnMsICMnZWZ1bjo6ZGVzdHJ1Y3QvKicqLyApOworfQorCisvLyBBbGxlIE9iamVrdCBlaW5lciBVSUQgaW0gTWFwcGluZyBtIG1pdCBVSUQgYWxzIEtFeXMgenVzYW1tZW5mYXNzZW4uIE9iamVrdAorLy8gc2luZCBkYWJlaSBuaWNodCB1bmlxdWUuCitwcml2YXRlIHZvaWQgX3NhbWVfdWlkKCBzdHJpbmcga2V5LCBvYmplY3QgKm9icywgbWFwcGluZyBtLCBjbG9zdXJlIGNmICkgeworICBzdHJpbmcgdWlkOworCisgIGlmICggIXBvaW50ZXJwKG9icykgfHwgIXNpemVvZihvYnMpICkKKyAgICByZXR1cm47CisKKyAgdWlkID0gZnVuY2FsbCggY2YsIGtleSApOworCisgIGlmICggbVt1aWRdICkKKyAgICBtW3VpZF0gKz0gb2JzOyAvLyBvYnMgaXN0IG5lbiBBcnJheQorICBlbHNlCisgICAgbVt1aWRdID0gb2JzOworfQorCitub21hc2sgdmFyYXJncyB2b2lkIGNhbGxfb3V0KCB2YXJhcmdzIG1peGVkICphcmdzICkKK3sKKyAgICBtaXhlZCB0bXAsICpjYWxsX291dHM7CisKKyAgICAvLyBCZWkgPjYwMCBDYWxsb3V0cyBhbGxlIE9iamVrdGUga2lsbGVuLCBkaWUgbWVociBhbHMgMzAgQ2FsbG91dHMgbGF1ZmVuCisgICAgLy8gaGFiZW4uCisgICAgaWYgKCBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fQ0FMTE9VVFMpID4gNjAwCisgICAgICAgICYmIGdldGV1aWQocHJldmlvdXNfb2JqZWN0KCkpICE9IFJPT1RJRCApCisgICAgeworICAgICAgIC8vIExvZyBlcnpldWdlbi4uLgorICAgICAgCisgICAgICAgLy8gT2JqZWt0ZSBhbGxlciBDYWxsb3V0cyBlcm1pdHRlbG4KKyAgICAgICBjYWxsX291dHMgPSBtYXAoIGVmdW46OmNhbGxfb3V0X2luZm8oKSwgIydfY2FsbF9vdXRfb2JqICk7CisgICAgICAgbWFwcGluZyBvYmplY3RtYXAgPSAoW10pOworICAgICAgIGZpbHRlciggY2FsbF9vdXRzLCAjJ19zYW1lX29iamVjdCwgJm9iamVjdG1hcCApOworICAgICAgIC8vIE1hc3RlciBuaWNodCBncmlsbGVuLi4uCisgICAgICAgZWZ1bjo6bV9kZWxldGUoIG9iamVjdG1hcCwgbWFzdGVyKDEpICk7CisgICAgICAgLy8gYWxsZSBPYmpla3RlIHJhdXNzdWNoZW4sIGRpZSB6dXZpZWxlIGhhYmVuLi4uCisgICAgICAgbWFwcGluZyByZXMgPSBmaWx0ZXJfaW5kaWNlcyggb2JqZWN0bWFwLCAjJ190b29fbWFueSwgb2JqZWN0bWFwLCAyOSApOworICAgICAgIC8vIHVuZCB1ZWJlciBhbGxlIEtleXMgZ2VoZW4sIGFuIF9kZXN0cm95KCkgd2VyZGVuIEtleSB1bmQgQXJyYXkgbWl0CisgICAgICAgLy8gT2JqZWt0ZW4gdWViZXJnZWJlbiAoaW4gZGllc2VtIEZhbGwgc2luZCBLZXlzIHVuZCBBcnJheSBtaXQKKyAgICAgICAvLyBPYmpla3RlbiBqZXdlaWxzIGRhcyBnbGVpY2hlIE9iamVrdCkuCisgICAgICAgaWYgKCBzaXplb2YocmVzKSApICAgICAgIAorICAgICAgICAgICB3YWxrX21hcHBpbmcocmVzLCAjJ19kZXN0cm95LCAiQ0FMTF9PVVQgb3ZlcmZsb3cgYnkgc2luZ2xlICIgICAgICAgICAgICAgCisgICAgICAgICAgICAgICJvYmplY3QgWyVPXS4gRGVzdHJ1Y3RlZCAlZCBvYmplY3RzLiBbJXNdXG4iLCAwICk7CisKKyAgICAgICAvLyBCZWkgKGF1Y2ggbmFjaCBkZW0gZXJzdGVuIEF1ZnJhZXVtZW4gbm9jaCkgPjgwMCBDYWxsb3V0cyBhbGxlCisgICAgICAgLy8gT2JqZWt0ZSBraWxsZW4sIGRpZSBtZWhyIGFscyA1MCBDYWxsb3V0cyBsYXVmZW4gaGFiZW4gLSB1bmQKKyAgICAgICAvLyBkaWVzbWFsIHphZWhsZW4gQ2xvbmVzIG5pY2h0IGVpZ2Vuc3RhZW5kaWchIEQuaC4gZXMgd2VyZGVuIGFsbGUKKyAgICAgICAvLyBDbG9uZXMgZWluZXIgQlAgZ2VraWxsdCwgZGllIENhbGxvdXRzIGxhdWZlbiBoYWJlbiwgZmFsbHMgYWxsZQorICAgICAgIC8vIGRpZXNlIE9iamVrdGUgX3p1c2FtbWVuXyBtZWhyIGFscyA1MCBDYWxsb3V0cyBoYWJlbiEKKyAgICAgICBpZiAoIGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9DQUxMT1VUUykgPiA4MDAgKSB7CisgICAgICAgICAgIC8vIHplcnN0b2VydGUgT2JqZWt0ZSB2b24gZGVyIGxldHp0ZW4gQWt0aW9uIHNpbmQgaW4gb2JqZWN0bWFwIG5pY2h0CisgICAgICAgICAgIC8vIG1laHIgZHJpbiwgZGEgc2llIGRvcnQgYWxzIEtleXMgdmVyd2VuZGV0IHd1cmRlbi4KKyAgICAgICAgICAgbWFwcGluZyBwYXRobWFwPShbXSk7CisgICAgICAgICAgIC8vIGFsbGUgT2JqZWt0IGVpbmVyIEJQIGluIHJlcyBzb3J0aWVyZW4sIEJQLU5hbWUgYWxzIEtleSwgQXJyYXlzCisgICAgICAgICAgIC8vIHZvbiBPYmpla3RlbiBhbHMgV2VydGUuCisgICAgICAgICAgIHdhbGtfbWFwcGluZyggb2JqZWN0bWFwLCAjJ19zYW1lX3BhdGgsICZwYXRobWFwKTsKKyAgICAgICAgICAgLy8gYWxsZSBCUHMgKHVuZCBpaHJlIE9iamVrdGUpIHJhdXNzdWNoZW4sIGRpZSB6dXZpZWxlIGhhYmVuLi4uCisgICAgICAgICAgIHJlcyA9IGZpbHRlcl9pbmRpY2VzKCBwYXRobWFwLCAjJ190b29fbWFueS8qJyovLCBwYXRobWFwLCA1MCApOworICAgICAgICAgICAvLyB1bmQgdWViZXIgYWxsZSBLZXlzIGdlaGVuLCBhbiBfZGVzdHJveSgpIHdlcmRlbiBkaWUgQ2xvbmVzCisgICAgICAgICAgIC8vIHVlYmVyZ2ViZW4sIGRpZSBDYWxsb3V0cyBoYWJlbi4KKyAgICAgICAgICAgaWYgKCBzaXplb2YocmVzKSApCisgICAgICAgICAgICAgIHdhbGtfbWFwcGluZyggcmVzLCAjJ19kZXN0cm95LyonKi8sICJDQUxMX09VVCBvdmVyZmxvdyBieSBmaWxlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICInJXMnLiBEZXN0cnVjdGVkICVkIG9iamVjdHMuIFslc11cbiIsIDAgKTsKKworICAgICAgICAgICAvLyBXZW5uIGJlaWRlIEF1ZnJhZXVtYXJiZWl0ZW4gbmljaHRzIGdlYnJhY2h0IGhhYmVuIHVuZCBpbW1lcgorICAgICAgICAgICAvLyBub2NoID4xMDAwIENhbGxvdXRzIGxhdWZlbiwgd2VyZGVuIGRpZXNtYWwgYWxsZSBDYWxsb3V0cworICAgICAgICAgICAvLyBlaW5lciBVSUQgenVzYW1tZW5nZXphZWhsdC4KKyAgICAgICAgICAgLy8gQWxsZSBPYmpla3RlIGVpbmVyIFVJRCwgZGllIGVzIGluIFN1bW1lIGFsbGVyIGlocmVyIE9iamVrdCBtaXQKKyAgICAgICAgICAgLy8gQ2FsbG91dHMgYXVmIG1laHIgYWxzIDEwMCBDYWxsb3V0cyBicmluZ3QsIHdlcmRlbiBnZXJvZXN0ZXQuCisgICAgICAgICAgIGlmIChlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fQ0FMTE9VVFMpID4gMTAwMCkKKyAgICAgICAgICAgeworICAgICAgICAgICAgICAvLyBkYXMgbmFjaCBCUC1OYW1lbiB2b3JnZWZpbHRlcnRlIE1hcHBpbmcgamV0enQgbmFjaCBVSURzCisgICAgICAgICAgICAgIC8vIHp1c2FtbWVuc29ydGllcmVuLiBaZXJzdG9lcnRlIENsb25lcyBmaWx0ZXIgX3NhbWVfdWlkKCkKKyAgICAgICAgICAgICAgLy8gcmF1cy4KKyAgICAgICAgICAgICAgbWFwcGluZyB1aWRtYXA9KFtdKTsKKyAgICAgICAgICAgICAgd2Fsa19tYXBwaW5nKCBwYXRobWFwLCAjJ19zYW1lX3VpZCwgJnVpZG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bWJvbF9mdW5jdGlvbiggImNyZWF0b3JfZmlsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiL3NlY3VyZS9tYXN0ZXIiICkgKTsKKyAgICAgICAgICAgICAgLy8gSW4gcmVzIG51biBVSURzIGFscyBLZXlzIHVuZCBBcnJheXMgdm9uIE9iamVrdGVuIGFscyBXZXJ0ZS4KKyAgICAgICAgICAgICAgLy8gRGllIHJhdXNmaWx0ZXJuLCBkaWUgbWVociBhbHMgMTAwIE9iamVrdGUgKG5vbi11bmlxdWUsIGQuaC4KKyAgICAgICAgICAgICAgLy8gMTAwIENhbGxvdXRzISkgaGFiZW4uCisgICAgICAgICAgICAgIHJlcyA9IGZpbHRlcl9pbmRpY2VzKCB1aWRtYXAsICMnX3Rvb19tYW55LCB1aWRtYXAsIDEwMCApOworICAgICAgICAgICAgICAvLyB1bmQgZXJuZXV0IHVlYmVyIGRpZSBLZXlzIGxhdWZlbiB1bmQgamV3ZWlscyBkaWUgQXJyYXlzIG1pdAorICAgICAgICAgICAgICAvLyBkZW4gT2JqZWt0ZW4genVyIFplcnN0b2VydW5nIGFuIF9kZXN0cm95KCkuLi4KKyAgICAgICAgICAgICAgaWYgKCBzaXplb2YocmVzKSApCisgICAgICAgICAgICAgICAgICB3YWxrX21hcHBpbmcoIHJlcywgIydfZGVzdHJveSwgIkNBTExfT1VUIG92ZXJmbG93IGJ5ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVSUQgJyVzJy4gRGVzdHJ1Y3RlZCAlZCBvYmplY3RzLiBbJXNdXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSApOworICAgICAgICAgICB9CisgICAgICAgfQorICAgIH0KKworICAgIC8vIEZhbGxzIGRhcyBhdWZydWZlbmRlIE9iamVrdCB6ZXJzdG9lcnQgd3VyZGUgYmVpbSBBdWZyYWV1bWVuCisgICAgaWYgKCAhcHJldmlvdXNfb2JqZWN0KCkgKQorICAgICAgIHJldHVybjsKKworICAgIHNldF90aGlzX29iamVjdCggcHJldmlvdXNfb2JqZWN0KCkgKTsKKyAgICBhcHBseSggIydlZnVuOjpjYWxsX291dCwgYXJncyApOworICAgIHJldHVybjsKK30KKworbWl4ZWQgY2FsbF9vdXRfaW5mbygpIHsKKyAgCisgIG9iamVjdCBwbyA9IHByZXZpb3VzX29iamVjdCgpOworICBtaXhlZCBjb2kgPSBlZnVuOjpjYWxsX291dF9pbmZvKCk7CisKKyAgLy8gdW5nZWZpbHRlcnRlbiBPdXRwdXQgbnVyIGZ1ZXIgYmVzdGltbXRlIE9iamVrdGUsIE9iamVrdGUgaW4gL3N0ZCBvZGVyCisgIC8vIC9vYmogaGFiZW4gZGllIEJhY2tib25lSUQuCisgIGlmIChxdWVyeV93aXpfbGV2ZWwoZ2V0dWlkKHBvKSkgPj0gQVJDSF9MVkwKKyAgICAgICB8fCAoc3RyaW5nKW1hc3RlcigpLT5jcmVhdG9yX2ZpbGUobG9hZF9uYW1lKHBvKSkgPT0gQkFDS0JPTkVJRCApIHsKKyAgICAgIHJldHVybiBjb2k7CisgIH0KKyAgZWxzZSB7CisgICAgICByZXR1cm4gZmlsdGVyKGNvaSwgZnVuY3Rpb24gbWl4ZWQgKG1peGVkIGFycikgeworICAgICAgICAgICAgICBpZiAocG9pbnRlcnAoYXJyKSAmJiBhcnJbMF09PXBvKQorICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgZWxzZSByZXR1cm4gMDsgfSk7CisgIH0KK30KKworLy8gKiBadSBlaW5lciBjbG9zdXJlIGRhcyBPYmpla3QsIGFuIGRhcyBzaWUgZ2VidW5kZW4gaXN0LCBzdWNoZW4KK21peGVkIHF1ZXJ5X2Nsb3N1cmVfb2JqZWN0KGNsb3N1cmUgYykgeworICByZXR1cm4KKyAgICBDTE9TVVJFX0lTX1VOQk9VTkRfTEFNQkRBKGdldF90eXBlX2luZm8oYywgMSkpID8KKyAgICAgIDAgOgorICAodG9fb2JqZWN0KGMpIHx8IC0xKTsKK30KKworLy8gKiBXaXIgd29sbGVuIG51ciBFSU4gQXJndW1lbnQgLi4uIGF1c3NlcmRlbSBjaGVja3MgZnVlciBkZW4gTmV0enRvdGVucmF1bQordmFyYXJncyB2b2lkIG1vdmVfb2JqZWN0KG1peGVkIHdoYXQsIG1peGVkIHdoZXJlKQoreworICBvYmplY3QgcG8sdG1wOworCisgIHBvPXByZXZpb3VzX29iamVjdCgpOworICBpZiAoIXdoZXJlKQorICB7CisgICAgd2hlcmU9d2hhdDsKKyAgICB3aGF0PXBvOworICB9CisgIGlmICgoKHN0cmluZ3Aod2hlcmUpICYmIHdoZXJlPT1ORVRERUFEX1JPT00gKSB8fAorICAgICAgIChvYmplY3RwKHdoZXJlKSAmJiB3aGVyZT09ZmluZF9vYmplY3QoTkVUREVBRF9ST09NKSkpICYmCisgICAgICAgb2JqZWN0cCh3aGF0KSAmJiBvYmplY3RfbmFtZSh3aGF0KSE9Ii9vYmovc3BlcnJlciIpCisgIHsKKyAgICBpZiAoIXF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUod2hhdCkpCisgICAgeworICAgICAgd2hhdC0+cmVtb3ZlKCk7CisgICAgICBpZiAod2hhdCkgZGVzdHJ1Y3Qod2hhdCk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChsaXZpbmcod2hhdCkgfHwgaW50ZXJhY3RpdmUod2hhdCkpCisgICAgeworICAgICAgbG9nX2ZpbGUoIk5ERUFEMiIsc3ByaW50ZigiVFJZRUQgVE8gTU9WRSBUTyBORVRERUFEOiAlT1xuIix3aGF0KSk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIHNldF9vYmplY3RfaGVhcnRfYmVhdCh3aGF0LDApOworICB9CisgIHRtcD13aGF0OworICB3aGlsZSAodG1wPWVudmlyb25tZW50KHRtcCkpCisgICAgICAvLyBKYS4gTWFuIHJ1ZnQgZGllIF9zZXRfeHh4KCktRnVua3Rpb25lbiBlaWdlbnRsaWNoIG5pY2h0IGRpcmVrdCBhdWYuCisgICAgICAvLyBBYmVyIGRhcyBMaWNodHN5c3RlbSBpc3Qgc2Nob24gKnNvKiByZWNoZW5pbnRlbnNpdiB1bmQgZ2VyYWRlIGRlcgorICAgICAgLy8gUF9MQVNUX0NPTlRFTlRfQ0hBTkdFLUNhY2hlIHdpcmQgKnNvKiBvZnQgYmVub2V0aWd0LCBkYXNzIGVzIG1pcgorICAgICAgLy8gZGEgdW0gamVkZXMgYmlzc2NoZW4gUmVjaGVuemVpdCBnZWh0LgorICAgICAgLy8gRGVyIFp3ZWNrIGhlaWxpZ3QgamEgYmVrYW5udGxpY2ggZGllIE1pdHRlbC4gOy0pCisgICAgICAvLworICAgICAgLy8gVGlhbWFrCisgICAgdG1wLT5fc2V0X2xhc3RfY29udGVudF9jaGFuZ2UoKTsKKyAgZnVuY2FsbChiaW5kX2xhbWJkYSgjJ2VmdW46Om1vdmVfb2JqZWN0LHBvKSx3aGF0LHdoZXJlKTsKKyAgaWYgKHRtcD13aGF0KQorICAgIHdoaWxlICh0bXA9ZW52aXJvbm1lbnQodG1wKSkKKyAgICAgIHRtcC0+X3NldF9sYXN0X2NvbnRlbnRfY2hhbmdlKCk7Cit9CisKKwordm9pZCBzdGFydF9zaW11bF9lZnVuKCkgeworICBtaXhlZCAqaW5mbzsKKworICAvLyBGYWxscyBub2NoIG5pY2h0IGdldGFuLCBleHRyYV93aXppbmZvIGluaXRpYWxpc2llcmVuCisgIGlmICggIXBvaW50ZXJwKGluZm8gPSBnZXRfZXh0cmFfd2l6aW5mbygwKSkgKQorICAgIHNldF9leHRyYV93aXppbmZvKDAsIGluZm8gPSBhbGxvY2F0ZShCQUNLQk9ORV9XSVpJTkZPX1NJWkUpKTsKKworICBJbml0TGl2aW5nRGF0YShpbmZvKTsKKworICBzZXRfbmV4dF9yZXNldCgxMCk7IC8vIGRpcmVrdCBtYWwgYXVmcmFldW1lbgorfQorCitwcm90ZWN0ZWQgdm9pZCByZXNldCgpIHsKKyAgc2V0X25leHRfcmVzZXQoNzIwMCk7CisgIENsZWFuTGl2aW5nRGF0YSgpOworfQorCisjaWYgIV9fRUZVTl9ERUZJTkVEX18oYWJzb2x1dGVfaGJfY291bnQpCitpbnQgYWJzb2x1dGVfaGJfY291bnQoKSB7CisgIHJldHVybiBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fSEVBUlRCRUFUX1RPVEFMX0NZQ0xFUyk7Cit9CisjZW5kaWYKKwordm9pZCBfX3NldF9lbnZpcm9ubWVudChvYmplY3Qgb2IsIG1peGVkIHRhcmdldCkKK3sKKyAgc3RyaW5nIHBhdGg7CisgIG9iamVjdCBvYmo7CisKKyAgaWYgKCFvYmplY3RwKG9iKSkKKyAgICByZXR1cm47CisgIGlmICghSVNfQVJDSChnZXRldWlkKHByZXZpb3VzX29iamVjdCgpKSkgfHwgIUFSQ0hfU0VDVVJJVFkgKQorICAgIHJldHVybjsKKyAgaWYgKG9iamVjdHAodGFyZ2V0KSkKKyAgeworICAgIGVmdW46OnNldF9lbnZpcm9ubWVudChvYix0YXJnZXQpOworICAgIHJldHVybjsKKyAgfQorICBwYXRoPShzdHJpbmcpTUFTVEVSLT5fZ2V0X3BhdGgodGFyZ2V0LHRoaXNfaW50ZXJhY3RpdmUoKSk7CisgIGlmIChzdHJpbmdwKHBhdGgpICYmIGZpbGVfc2l6ZShwYXRoKyIuYyIpPj0wICYmCisgICAgICAhY2F0Y2gobG9hZF9vYmplY3QocGF0aCk7cHVibGlzaCkgKQorICB7CisgICAgb2JqPWZpbmRfb2JqZWN0KHBhdGgpOworICAgIGVmdW46OnNldF9lbnZpcm9ubWVudChvYixvYmopOworICAgIHJldHVybjsKKyAgfQorfQorCit2b2lkIF9kdW1wX3dpemxpc3Qoc3RyaW5nIGZpbGUsIGludCBzb3J0YnkpIHsKKyAgaW50IGk7CisgIG1peGVkICphOworCisgIGlmICghTE9SRF9TRUNVUklUWSkKKyAgICByZXR1cm47CisgIGlmICghbWFzdGVyKCktPnZhbGlkX3dyaXRlKGZpbGUsZ2V0ZXVpZChwcmV2aW91c19vYmplY3QoKSksIndyaXRlX2ZpbGUiKSkKKyAgeworICAgIHdyaXRlKCJOTyBXUklURSBQRVJNSVNTSU9OXG4iKTsKKyAgICByZXR1cm47CisgIH0KKyAgYSA9IHdpemxpc3RfaW5mbygpOworICBhID0gc29ydF9hcnJheShhLCBsYW1iZGEoICh7J2EsJ2J9KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICh7Iyc8LAorICAgICAgICAgICAgICAgICAgICAgICAgICAoeyMnWywnYSxzb3J0Ynl9KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHsjJ1ssJ2Isc29ydGJ5fSkKKyAgICAgICAgICAgICAgICAgICAgICAgICB9KSkpOworICBybShmaWxlKTsKKyAgZm9yIChpPXNpemVvZihhKS0xO2k+PTA7aS0tKQorICAgIHdyaXRlX2ZpbGUoZmlsZSxzcHJpbnRmKCIlLTExczogZXZhbD0lLThkIGNtZHM9JS02ZCBIQnM9JS01ZCBhcnJheT0lLTVkIG1hcHBpbmc9JS03ZFxuIiwKKyAgICAgIGFbaV1bV0xfTkFNRV0sYVtpXVtXTF9UT1RBTF9DT1NUXSxhW2ldW1dMX0NPTU1BTkRTXSxhW2ldW1dMX0hFQVJUX0JFQVRTXSwKKyAgICAgIGFbaV1bV0xfQVJSQVlfVE9UQUxdLGFbaV1bV0xfQ0FMTF9PVVRdKSk7Cit9CisKK3B1YmxpYyB2YXJhcmdzIG9iamVjdCBkZWVwX3ByZXNlbnQobWl4ZWQgd2hhdCwgb2JqZWN0IG9iKSB7CisKKyAgaWYoIW9iamVjdHAob2IpKQorICAgIG9iPXByZXZpb3VzX29iamVjdCgpOworICAvLyBXZW5uIGVpbiBPYmpla3QgZ2VzdWNodCB3aXJkOiBBbGxlIEVudnMgZGllc2VzIE9iamVrdHMgZXJtaXR0ZWxuIHVuZAorICAvLyBzY2hhdWVuLCBvYiBpbiBkaWVzZW4gb2Igdm9ya29tbXQuIERhbm4gaXN0IHdoYXQgaW4gb2IgZW50aGFsdGVuLgorICBpZihvYmplY3RwKHdoYXQpKSB7CisgICAgb2JqZWN0ICplbnZzPWFsbF9lbnZpcm9ubWVudCh3aGF0KTsKKyAgICAvLyB3ZW5uIG9iIGtlaW4gRW52aXJvbm1lbnQgaGF0LCBpc3QgZXMgb2ZmZW5zaWNodGxpY2ggbmljaHQgaW4gd2hhdAorICAgIC8vIGVudGhhbHRlbi4KKyAgICBpZiAoIXBvaW50ZXJwKGVudnMpKSByZXR1cm4gMDsKKyAgICBpZiAobWVtYmVyKGVudnMsIG9iKSAhPSAtMSkgcmV0dXJuIHdoYXQ7CisgIH0KKyAgLy8gc29uc3Qgd2lyZHMgdGV1cmVyLCB1ZWJlciBhbGxlIE9iamVrdGUgaW0gKGRlZXApIEludiBsYXVmZW4gdW5kIHBlciBpZCgpCisgIC8vIHRlc3Rlbi4gRGFiZWkgbXVzcyBhYmVyIGRpZSBnZXd1ZW5zY2h0ZSBOci4gKCJmbGFzY2hlIDMiKSBhYmdlc2Nobml0dGVuCisgIC8vIHdlcmRlbiB1bmQgc2VsYmVyIGdlemFlaGx0IHdlcmRlbiwgd2VsY2hlIGRhcyBlbnRzcHJlY2hlbmRlIE9iamVrdCBpc3QuCisgIGVsc2UgaWYgKHN0cmluZ3Aod2hhdCkpIHsKKyAgICAgIGludCBjbnQ7CisgICAgICBzdHJpbmcgbmV3d2hhdDsKKyAgICAgIGlmKHNzY2FuZih3aGF0LCIlcyAlZCIsbmV3d2hhdCxjbnQpIT0yKQorICAgICAgIGNudD0xOworICAgICAgZWxzZQorICAgICAgIHdoYXQ9bmV3d2hhdDsKKyAgICAgIGZvcmVhY2gob2JqZWN0IGludm9iOiBkZWVwX2ludmVudG9yeShvYikpIHsKKyAgICAgICBpZiAoaW52b2ItPmlkKHdoYXQpICYmICEtLWNudCkKKyAgICAgICAgICAgcmV0dXJuIGludm9iOworICAgICAgfQorICB9CisgIGVsc2UgeworICAgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CisgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigiV3JvbmcgYXJndW1lbnQgMSB0byBkZWVwX3ByZXNlbnQoKS4gIgorICAgICAgICAgIkV4cGVjdGVkIFwib2JqZWN0XCIgb3IgXCJzdHJpbmdcIiwgZ290ICUuNTBPLlxuIiwKKyAgICAgICAgIHdoYXQpKTsKKyAgfQorICByZXR1cm4gMDsKK30KKworbWFwcGluZyBkdW1wX2lwX21hcHBpbmcoKQoreworICByZXR1cm4gMDsKK30KKworbm9tYXNrIHZvaWQgc3dhcChvYmplY3Qgb2JqKQoreworICB3cml0ZSgiWW91ciBhcmUgbm90IGFsbG93ZWQgdG8gc3dhcCBvYmplY3RzIGJ5IGhhbmQhXG4iKTsKKyAgcmV0dXJuOworfQorCitub21hc2sgdmFyYXJncyB2b2lkIGdhcmJhZ2VfY29sbGVjdGlvbihzdHJpbmcgc3RyKQoreworICBpZihwcmV2aW91c19vYmplY3QoKT09MCB8fCAhSVNfQVJDSChnZXRldWlkKHByZXZpb3VzX29iamVjdCgpKSkgCisgICAgICB8fCAhQVJDSF9TRUNVUklUWSkKKyAgeworICAgIHdyaXRlKCJDYWxsIEdDIG5vdyBhbmQgdGhlIG11ZCB3aWxsIGNyYXNoIGluIDUtNiBob3Vycy4gRE9OVCBETyBJVCFcbiIpOworICAgIHJldHVybjsKKyAgfQorICBlbHNlIGlmIChzdHJpbmdwKHN0cikpCisgIHsKKyAgICByZXR1cm4gZWZ1bjo6Z2FyYmFnZV9jb2xsZWN0aW9uKHN0cik7CisgIH0KKyAgZWxzZSAKKyAgICByZXR1cm4gZWZ1bjo6Z2FyYmFnZV9jb2xsZWN0aW9uKCk7Cit9CisKK3ZhcmFyZ3Mgdm9pZCBub3RpZnlfZmFpbChtaXhlZCBuZiwgaW50IHByaW8pIHsKKyAgb2JqZWN0IHBvLG9sZG87CisgIGludCBvbGRwcmlvOworICAKKyAgaWYgKCFQTCB8fCAhb2JqZWN0cChwbz1wcmV2aW91c19vYmplY3QoKSkpIHJldHVybjsKKyAgaWYgKCFzdHJpbmdwKG5mKSAmJiAhY2xvc3VyZXAobmYpKSB7CisgICAgICBzZXRfdGhpc19vYmplY3QocG8pOworICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigKKyAgICAgICAgICJPbmx5IHN0cmluZ3MgYW5kIGNsb3N1cmVzIGFsbG93ZWQgZm9yIG5vdGlmeV9mYWlsISAiCisgICAgICAgICAiQXJndW1lbnQgd2FzOiAlLjUwTy4uLlxuIixuZikpOworICB9CisKKyAgLy8gZmFsbHMgZWluIE9iamVrdCBiZXJlaXRzIG5lbiBub3RpZnlfZmFpbCgpIHNldHp0ZSwgUHJpb3JpdGFldGVuIGFic2NoYWV0emVuCisgIC8vIHVuZCB2ZXJnbGVpY2hlbi4KKyAgaWYgKG9iamVjdHAob2xkbz1xdWVyeV9ub3RpZnlfZmFpbCgxKSkgJiYgcG8hPW9sZG8pIHsKKyAgICBpZiAoIXByaW8pIHsgICAgICAgCisgICAgICAvL1ByaW9yaXRhZXQgZGllc2VzIG5vdGlmeV9mYWlsKCkgJ2Fic2NoYWV0emVuJworICAgICAgaWYgKHBvPT1QTCkgLy8gU3BpZWxlci1pbnRlcm5lIChzb3VsLWNtZHMpCisgICAgICAgIHByaW89TkZfTkxfT1dOOworICAgICAgZWxzZSBpZiAobGl2aW5nKHBvKSkKKyAgICAgICAgcHJpbz1ORl9OTF9MSVZJTkc7CisgICAgICBlbHNlIGlmICgoaW50KXBvLT5Jc1Jvb20oKSkKKyAgICAgICAgcHJpbz1ORl9OTF9ST09NOworICAgICAgZWxzZQorICAgICAgICBwcmlvPU5GX05MX1RISU5HOworICAgIH0KKyAgICAvL1ByaW9yaXRhZXQgZGVzIGFsdGVuIFNldHplcnMgYWJzY2hhZXR6ZW4KKyAgICBpZiAob2xkbz09UEwpCisgICAgICBvbGRwcmlvPU5GX05MX09XTjsKKyAgICBlbHNlIGlmIChsaXZpbmcob2xkbykpCisgICAgICBvbGRwcmlvPU5GX05MX0xJVklORzsKKyAgICBlbHNlIGlmICgoaW50KW9sZG8tPklzUm9vbSgpKQorICAgICAgb2xkcHJpbz1ORl9OTF9ST09NOworICAgIGVsc2UKKyAgICAgIG9sZHByaW89TkZfTkxfVEhJTkc7CisgIH0KKyAgZWxzZSAvLyB3ZW5uIGVzIG5vY2gga2VpbiBOb3RpZnlfZmFpbCBnaWJ0OgorICAgIG9sZHByaW89TkZfTkxfTk9ORTsKKworICAvL3ZlcmdsZWljaGVuIHVuZCBnZ2YuIHNldHplbgorICBpZiAocHJpbyA+PSBvbGRwcmlvKSB7IAorICAgIHNldF90aGlzX29iamVjdChwbyk7CisgICAgZWZ1bjo6bm90aWZ5X2ZhaWwobmYpOworICB9CisKKyAgcmV0dXJuOworfQorCit2b2lkIF9ub3RpZnlfZmFpbChzdHJpbmcgc3RyKQoreworICAvL3F1ZXJ5X25vdGlmeV9mYWlsKCkgYmVudXR6ZW4sIHVtIGRhcyBPYmpla3QKKyAgLy9kZXMgbGV0enRlbiBub3RpZnlfZmFpbCgpIHp1IGVybWl0dGVsbgorICBvYmplY3QgbzsKKyAgaWYgKChvPXF1ZXJ5X25vdGlmeV9mYWlsKDEpKSAmJiBvIT1wcmV2aW91c19vYmplY3QoKSkKKyAgICByZXR1cm47CisgIC8vbm9jaCBrZWluIG5vdGlmeV9mYWlsKCkgZnVlciBkaWVzZXMgS29tbWFuZG8gZ2VzZXR6dCwgYXVmIGdlaHRzLgorICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOworICBlZnVuOjpub3RpZnlfZmFpbChzdHIpOworICByZXR1cm47Cit9CisKK3N0cmluZyB0aW1lMnN0cmluZyggc3RyaW5nIGZvcm1hdCwgaW50IHplaXQgKQoreworICBpbnQgaSxjaCxtYXh1bml0LGR1bW15OworICBzdHJpbmcgKnBhcnRzLCBmbXQ7CisKKyAgaW50IHNlY3MgPSB6ZWl0OworICBpbnQgbWlucyA9ICh6ZWl0LzYwKTsKKyAgaW50IGhvdXJzID0gKHplaXQvMzYwMCk7CisgIGludCBkYXlzID0gKHplaXQvODY0MDApOworICBpbnQgd2Vla3MgPSAgKHplaXQvNjA0ODAwKTsKKyAgaW50IG1vbnRocyA9ICh6ZWl0LzI0MTkyMDApOworICBpbnQgYWJiciA9IDA7CisKKyAgcGFydHMgPSByZWdleHBsb2RlKCBmb3JtYXQsICJcKCVcKC18XClbMC05XSpbbndkaG1zeE5XREhNU1hdXCl8XCglJVwpIiApOworCisgIGZvciggaT0xOyBpPHNpemVvZihwYXJ0cyk7IGkrPTIgKQorICB7CisgICAgY2ggPSBwYXJ0c1tpXVs8MV07CisgICAgc3dpdGNoKCBwYXJ0c1tpXVs8MV0gKQorICAgIHsKKyAgICBjYXNlICd4JzogY2FzZSAnWCc6CisgICAgICAgYWJiciA9IHNzY2FuZiggcGFydHNbaV0sICIlJSVkIiwgZHVtbXkgKSAmJiBkdW1teT09MDsKKyAgICAgICAvLyBOTyBicmVhayAhCisgICAgY2FzZSAnbic6IGNhc2UgJ04nOgorICAgICAgIG1heHVuaXQgfD0gMzE7CisgICAgICAgYnJlYWs7CisgICAgY2FzZSAndyc6IGNhc2UgJ1cnOgorICAgICAgIG1heHVuaXQgfD0gMTU7CisgICAgICAgYnJlYWs7CisgICAgY2FzZSAnZCc6IGNhc2UgJ0QnOgorICAgICAgIG1heHVuaXQgfD0gNzsKKyAgICAgICBicmVhazsKKyAgICBjYXNlICdoJzogY2FzZSAnSCc6CisgICAgICAgbWF4dW5pdCB8PSAzOworICAgICAgIGJyZWFrOworICAgIGNhc2UgJ20nOiBjYXNlICdNJzoKKyAgICAgICBtYXh1bml0IHw9IDE7CisgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGlmKCBtYXh1bml0ICYgMTYgKSB3ZWVrcyAlPSA0OworICBpZiggbWF4dW5pdCAmIDggKSBkYXlzICU9IDc7CisgIGlmKCBtYXh1bml0ICYgNCApIGhvdXJzICU9IDI0OworICBpZiggbWF4dW5pdCAmIDIgKSBtaW5zICU9IDYwOworICBpZiggbWF4dW5pdCApIHNlY3MgJT0gNjA7CisKKyAgZm9yKCBpPTE7IGk8c2l6ZW9mKHBhcnRzKTsgaSs9MiApCisgIHsKKyAgICBmbXQgPSBwYXJ0c1tpXVswLi48Ml07CisgICAgY2ggPSBwYXJ0c1tpXVs8MV07CisgICAgaWYoIGNoPT0neCcgKQorICAgIHsKKyAgICAgIGlmIChtb250aHMgPiAwKSBjaD0nbic7CisgICAgICBlbHNlIGlmKCB3ZWVrcz4wICkgY2g9J3cnOworICAgICAgZWxzZSBpZiggZGF5cz4wICkgY2g9J2QnOworICAgICAgZWxzZSBpZiggaG91cnM+MCApIGNoPSdoJzsgCisgICAgICBlbHNlIGlmKG1pbnMgPiAwKSBjaCA9ICdtJzsKKyAgICAgIGVsc2UgY2ggPSAncyc7CisgICAgfQorICAgIGVsc2UgaWYoIGNoPT0nWCcgKQorICAgIHsKKyAgICAgIGlmIChtb250aHMgPiAwKSBjaD0nTic7CisgICAgICBlbHNlIGlmKCB3ZWVrcz4wICkgY2g9J1cnOworICAgICAgZWxzZSBpZiggZGF5cz4wICkgY2g9J0QnOworICAgICAgZWxzZSBpZiggaG91cnM+MCApIGNoPSdIJzsgCisgICAgICBlbHNlIGlmKG1pbnMgPiAwKSBjaCA9ICdNJzsKKyAgICAgIGVsc2UgY2ggPSAnUyc7CisgICAgfQorICAgIAorICAgIHN3aXRjaCggY2ggKQorICAgIHsKKyAgICAgIGNhc2UgJ24nOiBwYXJ0c1tpXSA9IHNwcmludGYoIGZtdCsiZCIsIG1vbnRocyApOyBicmVhazsKKyAgICAgIGNhc2UgJ3cnOiBwYXJ0c1tpXSA9IHNwcmludGYoIGZtdCsiZCIsIHdlZWtzICk7IGJyZWFrOworICAgICAgY2FzZSAnZCc6IHBhcnRzW2ldID0gc3ByaW50ZiggZm10KyJkIiwgZGF5cyApOyBicmVhazsKKyAgICAgIGNhc2UgJ2gnOiBwYXJ0c1tpXSA9IHNwcmludGYoIGZtdCsiZCIsIGhvdXJzICk7IGJyZWFrOworICAgICAgY2FzZSAnbSc6IHBhcnRzW2ldID0gc3ByaW50ZiggZm10KyJkIiwgbWlucyApOyBicmVhazsKKyAgICAgIGNhc2UgJ3MnOiBwYXJ0c1tpXSA9IHNwcmludGYoIGZtdCsiZCIsIHNlY3MgKTsgYnJlYWs7CisgICAgICBjYXNlICdOJzoKKyAgICAgICBpZihhYmJyKSBwYXJ0c1tpXSA9ICJNIjsKKyAgICAgICBlbHNlIHBhcnRzW2ldID0gc3ByaW50ZiggZm10KyJzIiwgKG1vbnRocz09MSkgPyAiTW9uYXQiIDogIk1vbmF0ZSIgKTsKKyAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ1cnOgorICAgICAgIGlmKGFiYnIpIHBhcnRzW2ldID0gInciOyBlbHNlCisgICAgICAgcGFydHNbaV0gPSBzcHJpbnRmKCBmbXQrInMiLCAod2Vla3M9PTEpID8gIldvY2hlIiA6ICJXb2NoZW4iICk7CisgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdEJzoKKyAgICAgICBpZihhYmJyKSBwYXJ0c1tpXSA9ICJkIjsgZWxzZQorICAgICAgIHBhcnRzW2ldID0gc3ByaW50ZiggZm10KyJzIiwgKGRheXM9PTEpID8gIlRhZyIgOiAiVGFnZSIgKTsKKyAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ0gnOgorICAgICAgIGlmKGFiYnIpIHBhcnRzW2ldID0gImgiOyBlbHNlCisgICAgICAgcGFydHNbaV0gPSBzcHJpbnRmKCBmbXQrInMiLCAoaG91cnM9PTEpID8gIlN0dW5kZSIgOiAiU3R1bmRlbiIgKTsKKyAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ00nOgorICAgICAgIGlmKGFiYnIpIHBhcnRzW2ldID0gIm0iOyBlbHNlCisgICAgICAgcGFydHNbaV0gPSBzcHJpbnRmKCBmbXQrInMiLCAobWlucz09MSkgPyAiTWludXRlIiA6ICJNaW51dGVuIiApOworICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnUyc6CisgICAgICAgaWYoYWJicikgcGFydHNbaV0gPSAicyI7IGVsc2UKKyAgICAgICBwYXJ0c1tpXSA9IHNwcmludGYoIGZtdCsicyIsIChzZWNzPT0xKSA/ICJTZWt1bmRlIiA6ICJTZWt1bmRlbiIgKTsKKyAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJyUnOgorICAgICAgIHBhcnRzW2ldID0gIiUiOworICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gaW1wbG9kZSggcGFydHMsICIiICk7Cit9CisKK25vbWFzayBtaXhlZCBfX2NyZWF0ZV9wbGF5ZXJfZHVtbXkoc3RyaW5nIG5hbWUpCit7CisgIHN0cmluZyBlcnI7CisgIG9iamVjdCBvYjsKKyAgbWl4ZWQgbTsKKyAgLy9oYXQgbmVuIFNjaGVyemtla3MgZGllIEJsdWVwcmludCBiZXdlZ3Q/CisgIGlmICgob2I9ZmluZF9vYmplY3QoIi9zZWN1cmUvbG9naW4iKSkgJiYgZW52aXJvbm1lbnQob2IpKQorICAgICAgY2F0Y2goZGVzdHJ1Y3Qob2IpO3B1Ymxpc2gpOworICBlcnIgPSBjYXRjaChvYiA9IGNsb25lX29iamVjdCgic2VjdXJlL2xvZ2luIik7cHVibGlzaCk7CisgIGlmIChlcnIpCisgIHsKKyAgICB3cml0ZSgiRmVobGVyIGJlaW0gTGFkZW4gdm9uIC9zZWN1cmUvbG9naW4uY1xuIitlcnIrIlxuIik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKG9iamVjdHAobT0obWl4ZWQpb2ItPm5ld19sb2dvbihuYW1lKSkpIG5ldGRlYWRbbmFtZV09bTsKKyAgcmV0dXJuIG07Cit9CisKK25vbWFzayBpbnQgc2VjdXJlX2xldmVsKCkKK3sKKyAgaW50ICpsZXZlbDsKKyAgLy9rZXR0ZSBkZXIgQ2FsbGVyIGR1cmNobGF1ZmVuLCBkZW4gbmllZHJpZ3N0ZW4gTGV2ZWwgaW4gZGVyIEtldHRlCisgIC8venVydWVja2dlYmVuLiBaZXJzdG9lcnRlIE9iamVrdGUgKFNlbGJzdHplcnN0b2VyZXIpIGZ1ZWhyZW4genVyIFJ1ZWNrZ2FiZQorICAvL3ZvbiAwLgorICAvL2NhbGxlcl9zdGFjaygxKSBmdWVndCBkZW0gUnVlY2tnYWJlYXJyYXkgdGhpc19pbnRlcmFjdGl2ZSgpIGhpbnp1IGJ6dy4gMCwKKyAgLy93ZW5uIGVzIGtlaW5lbiBJbnRlcmFjdGl2ZSBnaWJ0LiBEaWUgMCBmdWVocnQgZGFubiB3aWUgYmVpIHplcnN0b2VydGVuCisgIC8vT2JqZWt0ZW4genVyIFJ1ZWNrZ2FiZSB2b24gMCwgd2FzIGdld3VlbnNjaHQgaXN0LCBkYSBlcyBoaWVyIGVpbmVuCisgIC8vSU50ZXJhY3RpdmUgZ2ViZW4gbXVzcy4KKyAgbGV2ZWw9bWFwKGNhbGxlcl9zdGFjaygxKSxmdW5jdGlvbiBpbnQgKG9iamVjdCBjYWxsZXIpCisgICAgICB7aWYgKG9iamVjdHAoY2FsbGVyKSkKKyAgICAgICByZXR1cm4ocXVlcnlfd2l6X2xldmVsKGdldGV1aWQoY2FsbGVyKSkpOworICAgICAgIHJldHVybigwKTsgLy8ga2VpbiBPYmpla3QgZGEsIDAuCisgICAgICB9ICk7CisgIHJldHVybihtaW4obGV2ZWwpKTsgLy9kZW4ga2xlaW5zdGVuIFdlcnQgaW0gQXJyYXkgenVydWVja2dlYmVuIChnZ2YuIDApCit9CisKK25vbWFzayBzdHJpbmcgc2VjdXJlX2V1aWQoKQoreworICBzdHJpbmcgZXVpZDsKKworICBpZiAoIXRoaXNfaW50ZXJhY3RpdmUoKSkgLy8gRXMgbXVzcyBlaW5lbiBpbnRlcmFjdGl2ZSBnZWJlbgorICAgICByZXR1cm4gMDsKKyAgZXVpZD1nZXRldWlkKHRoaXNfaW50ZXJhY3RpdmUoKSk7CisgIC8vIHVlYmVyIGFsbGUgQ2FsbGVyIGl0ZXJpZXJlbi4gV2VubiBlaW5lcyBkYXZvbiBlaW5lIGFuZGVyZSBldWlkIGhhdCBhbHMKKyAgLy8gZGVyIEludGVyYWN0aXZlIHVuZCBkaWVzZSBuaWNodCBkaWUgUk9PVElEIGlzdCwgd2lyZCAwIHp1cnVlY2tnZWJlbi4KKyAgLy8gRWJlbnNvLCBmYWxscyBlaW4gU2VsYnN0emVyc3RvZXJlciBpcmdlbmR3byBpbiBkZXIgS2V0dGUgaXN0LgorICBmb3JlYWNoKG9iamVjdCBjYWxsZXI6IGNhbGxlcl9zdGFjaygpKSB7CisgICAgICBpZiAoIW9iamVjdHAoY2FsbGVyKSB8fAorICAgICAgIChnZXRldWlkKGNhbGxlcikhPWV1aWQgJiYgZ2V0ZXVpZChjYWxsZXIpIT1ST09USUQpKQorICAgICAgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIGV1aWQ7IC8vICdzaWNoZXJlJyBldWlkIHp1cnVlY2tnZWJlbgorfQorCisvLyBJTlBVVF9QUk9NUFQgdW5kIG5lbiBMZWVycHJvbXB0IGhpbnp1ZnVlZ2VuLCB3ZW5uIGtlaW5zIHVlYmVyZ2ViZW4gd2lyZC4KKy8vIERhcyBzb2xsIGRhenUgZGllbmVuLCBkYXNzIGFsbGUgZ2dmLiBlaW4gRU9SIGFtIFByb21wdGVuZGUga3JpZWdlbi4uLgorLy8jaWYgX19CT09UX1RJTUVfXyA8IDEzNjAwMTcyMTMKK3ZhcmFyZ3Mgdm9pZCBpbnB1dF90byggbWl4ZWQgZnVuLCBpbnQgZmxhZ3MsIHZhcmFyZ3MgbWl4ZWQgKmFyZ3MgKQoreworICAgIG1peGVkICphcnI7CisgICAgaW50IGk7CisKKyAgICBpZiAoICF0aGlzX3BsYXllcigpIHx8ICFwcmV2aW91c19vYmplY3QoKSApCisgICAgICAgcmV0dXJuOworCisgICAgLy8gVE9ETzogaW5wdXRfdG8oLi4uLElOUFVUX1BST01QVCwgIiIsIC4uLiksIHdlbm4ga2VpbiBJTlBVVF9QUk9NUFQKKyAgICAvLyB2b3Jrb21tdC4uLgorICAgIGlmICggZmxhZ3MmSU5QVVRfUFJPTVBUICkgeyAgICAKKyAgICAgICAgYXJyID0gKHsgZnVuLCBmbGFncyB9KSArIGFyZ3M7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvLyBnZ2YuIGVpbiBJTlBVVF9QUk9NUFQgaGluenVmdWVnZW4gdW5kIG5lbiBMZWVyc3RyaW5nIGFscyBQcm9tcHQuCisgICAgICAgIGZsYWdzIHw9IElOUFVUX1BST01QVDsKKyAgICAgICAgYXJyID0gKHsgZnVuLCBmbGFncywgIiIgfSkgKyBhcmdzOworICAgIH0KKworICAgIC8vIEFycmF5cyBnZWdlbiBmbGF0dGVuIHF1b3Rlbi4KKyAgICBmb3IgKCBpID0gc2l6ZW9mKGFycikgLSAxOyBpID4gMTsgaS0tICkKKyAgICAgICBpZiAoIHBvaW50ZXJwKGFycltpXSkgKQorICAgICAgICAgICBhcnJbaV0gPSBxdW90ZShhcnJbaV0pOworCisgICAgYXBwbHkoIGJpbmRfbGFtYmRhKCB1bmJvdW5kX2xhbWJkYSggKHt9KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoeyAjJ2VmdW46OmlucHV0X3RvLyonKi8gfSkgKyBhcnIgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNfb2JqZWN0KCkgKSApOworfQorLy8jZW5kaWYKKworbm9tYXNrIGludCBzZXRfbGlnaHQoaW50IGkpCisvLyBlcmhvZWh0IGRhcyBMaWNodGxldmVsIGVpbmVzIE9iamVrdHMgdW0gaQorLy8gcmVzdWx0OiBkYXMgTGljaHRsZXZlbCBpbm5lcmhhbGIgZGVzIE9iamVrdHMKK3sKKyAgICBvYmplY3Qgb2IsICppbnY7CisgICAgaW50IGxhbGwsIGxpZ2h0LCBkYXJrLCB0bXA7CisKKyAgICBpZiAoIShvYj1wcmV2aW91c19vYmplY3QoKSkpIHJldHVybiAwOyAvLyBvaG5lIGRhcyBnZWh0cyBuaWNodC4KKworICAgIC8vIGF1cyBrb21wYXRpYmlsaXRhZXRzZ3J1ZW5kZW4ga2FubiBtYW4gYXVjaCBkZW4gTGljaHRsZXZlbCBub2NoIHNldHplbgorICAgIGlmIChpIT0wKSBvYi0+U2V0UHJvcChQX0xJR0hULCBvYi0+UXVlcnlQcm9wKFBfTElHSFQpK2kpOworCisgICAgLy8gTGljaHRiZXJlY2hudW5nIGZpbmRldCBlaWdlbnRsaWNoIGluIGRlciBNdWRsaWIgc3RhdHQuCisgICAgcmV0dXJuIChpbnQpb2ItPlF1ZXJ5UHJvcChQX0lOVF9MSUdIVCk7Cit9CisKKworcHVibGljIHN0cmluZyBpc28yYXNjaWkoIHN0cmluZyBzdHIgKQoreworICAgIGlmICggIXN0cmluZ3Aoc3RyKSB8fCAhc2l6ZW9mKHN0cikgKQorICAgICAgIHJldHVybiAiIjsKKworICAgIHN0ciA9IHJlZ3JlcGxhY2UoIHN0ciwgIuQiLCAiYWUiLCAxICk7CisgICAgc3RyID0gcmVncmVwbGFjZSggc3RyLCAi9iIsICJvZSIsIDEgKTsKKyAgICBzdHIgPSByZWdyZXBsYWNlKCBzdHIsICL8IiwgInVlIiwgMSApOworICAgIHN0ciA9IHJlZ3JlcGxhY2UoIHN0ciwgIsQiLCAiQWUiLCAxICk7CisgICAgc3RyID0gcmVncmVwbGFjZSggc3RyLCAi1iIsICJPZSIsIDEgKTsKKyAgICBzdHIgPSByZWdyZXBsYWNlKCBzdHIsICLcIiwgIlVlIiwgMSApOworICAgIHN0ciA9IHJlZ3JlcGxhY2UoIHN0ciwgIt8iLCAic3MiLCAxICk7CisgICAgc3RyID0gcmVncmVwbGFjZSggc3RyLCAiW14gLX5dIiwgIj8iLCAxICk7CisKKyAgICByZXR1cm4gc3RyOworfQorCisKK3B1YmxpYyB2YXJhcmdzIHN0cmluZyBDb3VudFVwKCBzdHJpbmcgKnMsIHN0cmluZyBzZXAsIHN0cmluZyBsYXN0c2VwICkKK3sKKyAgICBzdHJpbmcgcmV0OworCisgICAgaWYgKCAhcG9pbnRlcnAocykgKQorICAgICAgIHJldHVybiAiIjsKKyAgICAKKyAgICBpZiAoIXNlcCkgc2VwID0gIiwgIjsKKyAgICBpZiAoIWxhc3RzZXApIGxhc3RzZXAgPSAiIHVuZCAiOworCisgICAgc3dpdGNoIChzaXplb2YocykpICB7CisgICAgICAgY2FzZSAwOiByZXQ9IiI7IGJyZWFrOworICAgICAgIGNhc2UgMTogcmV0PXNbMF07IGJyZWFrOworICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIHJldCA9IGltcGxvZGUoc1swLi48Ml0sIHNlcCk7CisgICAgICAgICAgICAgIHJldCArPSBsYXN0c2VwICsgc1s8MV07CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK25vbWFzayB2YXJhcmdzIGludCBxdWVyeV9uZXh0X3Jlc2V0KG9iamVjdCBvYikgeworCisgICAgLy8gVHlwcHJ1ZWZ1bmc6IGV0d2FzIGFuZGVyZXMgYWxzIE9iamVrdGUgb2RlciAwIHNvbGxlbiBGZWhsZXIgc2Vpbi4KKyAgICBpZiAob2IgJiYgIW9iamVjdHAob2IpKQorICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigiQmFkIGFyZyAxIHRvIHF1ZXJ5X25leHRfcmVzZXQoKTogZ290ICUuMjBPLCAiCisgICAgICAgICAgICJleHBlY3RlZCBvYmplY3QuXG4iLG9iKSk7CisKKyAgICAvLyBEZWZhdWx0b2JqZWt0IFBPLCB3ZW5uIDAgdWViZXJnZWJlbi4KKyAgICBpZiAoICFvYmplY3RwKG9iKSApCisgICAgICBvYiA9IHByZXZpb3VzX29iamVjdCgpOworCisgICAgcmV0dXJuIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9ORVhUX1JFU0VUX1RJTUUpOworfQorCisKKyNpZiAhX19FRlVOX0RFRklORURfXyhjb3B5X2ZpbGUpCisjZGVmaW5lIE1BWExFTiA1MDAwMAorbm9tYXNrIGludCBjb3B5X2ZpbGUoc3RyaW5nIHNvdXJjZSwgc3RyaW5nIGRlc3QpCit7CisKKyAgaW50IHB0cjsKKyAgc3RyaW5nIGJ5dGVzOworCisgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CisgIGlmICghc2l6ZW9mKHNvdXJjZSl8fCFzaXplb2YoZGVzdCl8fHNvdXJjZT09ZGVzdHx8KGZpbGVfc2l6ZShzb3VyY2UpPT0tMSl8fAorICAgICAgKCFjYWxsX290aGVyKG1hc3RlcigpLCJ2YWxpZF9yZWFkIixzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgZ2V0dWlkKHRoaXNfaW50ZXJhY3RpdmUoKXx8CisgICAgICAgICAgICAgICAgIHByZXZpb3VzX29iamVjdCgpKSwicmVhZF9maWxlIixwcmV2aW91c19vYmplY3QoKSkpfHwKKyAgICAgICghY2FsbF9vdGhlcihtYXN0ZXIoKSwidmFsaWRfcmVhZCIsc291cmNlLAorICAgICAgICAgICAgICAgICAgIGdldHVpZCh0aGlzX2ludGVyYWN0aXZlKCl8fAorICAgICAgICAgICAgICAgICBwcmV2aW91c19vYmplY3QoKSksIndyaXRlX2ZpbGUiLHByZXZpb3VzX29iamVjdCgpKSkpCisgICAgcmV0dXJuIDE7CisgIHN3aXRjaCAoZmlsZV9zaXplKGRlc3QpKQorICB7CisgIGNhc2UgLTE6CisgICAgYnJlYWs7CisgIGNhc2UgLTI6CisgICAgaWYgKGRlc3RbPDFdIT0nLycpIGRlc3QrPSIvIjsKKyAgICBkZXN0Kz1lZnVuOjpleHBsb2RlKHNvdXJjZSwiLyIpWzwxXTsKKyAgICBpZiAoZmlsZV9zaXplKGRlc3QpPT0tMikgcmV0dXJuIDE7CisgICAgaWYgKGZpbGVfc2l6ZShkZXN0KSE9LTEpIGJyZWFrOworICBkZWZhdWx0OgorICAgIGlmICghcm0oZGVzdCkpIHJldHVybiAxOworICAgIGJyZWFrOworICB9CisgIGRvCisgIHsKKyAgICBieXRlcyA9IHJlYWRfYnl0ZXMoc291cmNlLCBwdHIsIE1BWExFTik7IHB0ciArPSBNQVhMRU47CisgICAgaWYgKCFieXRlcykgYnl0ZXM9IiI7CisgICAgd3JpdGVfZmlsZShkZXN0LCBieXRlcyk7CisgIH0KKyAgd2hpbGUoc2l6ZW9mKGJ5dGVzKSA9PSBNQVhMRU4pOworICByZXR1cm4gMDsKK30KKyNlbmRpZiAvLyFfX0VGVU5fREVGSU5FRF9fKGNvcHlfZmlsZSkKKworCisvLyAjIyMgRXJzYXR6YXVmbG9lc3VuZyBpbiBTdHJpbmdzICMjIwordmFyYXJncyBzdHJpbmcgcmVwbGFjZV9wZXJzb25hbChzdHJpbmcgc3RyLCBtaXhlZCAqb2JzLCBpbnQgY2FwcykgeworICBpbnQgaTsKKyAgc3RyaW5nICpwYXJ0czsKKworICBwYXJ0cyA9IHJlZ2V4cGxvZGUoc3RyLCAiQFdFW0EtU1VdKlswLTldIik7CisgIGkgPSBzaXplb2YocGFydHMpOworCisgIGlmIChpPjEpIHsKKyAgICBpbnQgaiwgdDsKKyAgICBjbG9zdXJlICpuYW1lX2NsczsKKworICAgIHQgPSBqID0gc2l6ZW9mKG9icyk7CisKKyAgICBuYW1lX2NscyAgPSAgYWxsb2NhdGUoaik7CisgICAgd2hpbGUgKGotLSkKKyAgICAgIGlmIChvYmplY3RwKG9ic1tqXSkpCisgICAgICAgIG5hbWVfY2xzW2pdID0gc3ltYm9sX2Z1bmN0aW9uKCJuYW1lIiwgb2JzW2pdKTsKKyAgICAgIGVsc2UgaWYgKHN0cmluZ3Aob2JzW2pdKSkKKyAgICAgICAgbmFtZV9jbHNbal0gPSBvYnNbal07CisKKyAgICB3aGlsZSAoKGktPSAyKT4wKSB7CisgICAgICBpbnQgb2JfbnI7CisgICAgICAvLyB6dSBlcnNldHplbmRlcyBUb2tlbiBpbiBGYWxsIHVuZCBPYmpla3RpbmRleCBhdWZzcGFsdGVuCisgICAgICBvYl9uciA9IHBhcnRzW2ldWzwxXS0nMSc7CisgICAgICBpZiAob2JfbnI8MCB8fCBvYl9ucj49dCkgeworICAgICAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOworICAgICAgICByYWlzZV9lcnJvcihzcHJpbnRmKCJyZXBsYWNlX3BlcnNvbmFsOiB1c2luZyB3cm9uZyBvYmplY3QgaW5kZXggJWRcbiIsCisgICAgICAgICAgICAgICAgICAgIG9iX25yKSk7CisgICAgICAgIHJldHVybiBpbXBsb2RlKHBhcnRzLCAiIik7CisgICAgICB9CisKKyAgICAgIC8vIGNhc3VzIGthbm4gbWFuIHNjaG9uIGhpZXIgZW50c2NoZWlkZW4KKyAgICAgIGludCBjYXN1czsKKyAgICAgIHN0cmluZyBwYXJ0ID0gcGFydHNbaV07CisgICAgICBzd2l0Y2ggKHBhcnRbM10pIHsKKyAgICAgICAgY2FzZSAnUic6IGNhc3VzID0gV0VSOyAgICBicmVhazsKKyAgICAgICAgY2FzZSAnUyc6IGNhc3VzID0gV0VTU0VOOyBicmVhazsKKyAgICAgICAgY2FzZSAnTSc6IGNhc3VzID0gV0VNOyAgICBicmVhazsKKyAgICAgICAgY2FzZSAnTic6IGNhc3VzID0gV0VOOyAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDogIGNvbnRpbnVlOyAvLyBwYXNzdCBzY2hvbiBqZXR6dCBuaWNodCBpbiBkYXMgSGF1cHRtdXN0ZXIKKyAgICAgIH0KKworICAgICAgLy8gdW5kIGpldHp0IGRpZSBlaW56ZWxuZW4gS2V5d29yZHMgb2huZSBmdWVocmVuZGVzICJAV0UiLCBiZWVuZGVuZGUgSWQKKyAgICAgIG1peGVkIHRtcDsKKyAgICAgIHN3aXRjaCAocGFydFszLi48Ml0pIHsKKyAgICAgICAgY2FzZSAiUiI6IGNhc2UgIlNTRU4iOiBjYXNlICJNIjogY2FzZSAiTiI6ICAgICAgICAgICAgICAgLy8gTmFtZQorICAgICAgICAgIHBhcnRzW2ldID0gZnVuY2FsbChuYW1lX2Nsc1tvYl9ucl0sIGNhc3VzLCAxKTsgIGJyZWFrOworICAgICAgICBjYXNlICJSVSI6IGNhc2UgIlNTRU5VIjogY2FzZSAiTVUiOiBjYXNlICJOVSI6ICAgICAgICAgICAvLyB1bmJlc3RpbW10CisgICAgICAgICAgcGFydHNbaV0gPSBmdW5jYWxsKG5hbWVfY2xzW29iX25yXSwgY2FzdXMpOyAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgIlJRUCI6IGNhc2UgIlNTRU5RUCI6IGNhc2UgIk1RUCI6IGNhc2UgIk5RUCI6ICAgICAgIC8vIFByb25vdW4KKyAgICAgICAgICBpZiAob2JqZWN0cCh0bXAgPSBvYnNbb2JfbnJdKSkKKyAgICAgICAgICAgIHBhcnRzW2ldID0gKHN0cmluZyl0bXAtPlF1ZXJ5UHJvbm91bihjYXN1cyk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgIlJRQSI6IGNhc2UgIlNTRU5RQSI6IGNhc2UgIk1RQSI6IGNhc2UgIk5RQSI6ICAgICAgIC8vIEFydGljbGUKKyAgICAgICAgICBpZiAob2JqZWN0cCh0bXAgPSBvYnNbb2JfbnJdKSkKKyAgICAgICAgICAgIHRtcCA9IChzdHJpbmcpdG1wLT5RdWVyeUFydGljbGUoY2FzdXMsIDEsIDEpOworICAgICAgICAgIGlmIChzdHJpbmdwKHRtcCkgJiYgISh0bXBbPDFdXicgJykpIAorICAgICAgICAgICAgdG1wID0gdG1wWzAuLjwyXTsgICAgICAgICAgICAgICAgLy8gRXh0cmEtU3BhY2Ugd2llZGVyIGxvZXNjaGVuCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgIlJRUFBNUyI6IGNhc2UgIlNTRU5RUFBNUyI6IGNhc2UgIk1RUFBNUyI6IGNhc2UgIk5RUFBNUyI6CisgICAgICAgICAgaWYgKG9iamVjdHAodG1wID0gb2JzW29iX25yXSkpCisgICAgICAgICAgICBwYXJ0c1tpXSA9IChzdHJpbmcpdG1wLT5RdWVyeVBvc3NQcm9ub3VuKE1BTEUsIGNhc3VzLCBTSU5HVUxBUik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgIlJRUFBGUyI6IGNhc2UgIlNTRU5RUFBGUyI6IGNhc2UgIk1RUFBGUyI6IGNhc2UgIk5RUFBGUyI6CisgICAgICAgICAgaWYgKG9iamVjdHAodG1wID0gb2JzW29iX25yXSkpCisgICAgICAgICAgICBwYXJ0c1tpXSA9IChzdHJpbmcpdG1wLT5RdWVyeVBvc3NQcm9ub3VuKEZFTUFMRSwgY2FzdXMsIFNJTkdVTEFSKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAiUlFQUE5TIjogY2FzZSAiU1NFTlFQUE5TIjogY2FzZSAiTVFQUE5TIjogY2FzZSAiTlFQUE5TIjoKKyAgICAgICAgICBpZiAob2JqZWN0cCh0bXAgPSBvYnNbb2JfbnJdKSkKKyAgICAgICAgICAgIHBhcnRzW2ldID0gKHN0cmluZyl0bXAtPlF1ZXJ5UG9zc1Byb25vdW4oTkVVVEVSLCBjYXN1cywgU0lOR1VMQVIpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICJSUVBQTVAiOiBjYXNlICJTU0VOUVBQTVAiOiBjYXNlICJNUVBQTVAiOiBjYXNlICJOUVBQTVAiOgorICAgICAgICAgIGlmIChvYmplY3RwKHRtcCA9IG9ic1tvYl9ucl0pKQorICAgICAgICAgICAgcGFydHNbaV0gPSAoc3RyaW5nKXRtcC0+UXVlcnlQb3NzUHJvbm91bihNQUxFLCBjYXN1cywgUExVUkFMKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAiUlFQUEZQIjogY2FzZSAiU1NFTlFQUEZQIjogY2FzZSAiTVFQUEZQIjogY2FzZSAiTlFQUEZQIjoKKyAgICAgICAgICBpZiAob2JqZWN0cCh0bXAgPSBvYnNbb2JfbnJdKSkKKyAgICAgICAgICAgIHBhcnRzW2ldID0gKHN0cmluZyl0bXAtPlF1ZXJ5UG9zc1Byb25vdW4oRkVNQUxFLCBjYXN1cywgUExVUkFMKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAiUlFQUE5QIjogY2FzZSAiU1NFTlFQUE5QIjogY2FzZSAiTVFQUE5QIjogY2FzZSAiTlFQUE5QIjoKKyAgICAgICAgICBpZiAob2JqZWN0cCh0bXAgPSBvYnNbb2JfbnJdKSkKKyAgICAgICAgICAgIHBhcnRzW2ldID0gKHN0cmluZyl0bXAtPlF1ZXJ5UG9zc1Byb25vdW4oTkVVVEVSLCBjYXN1cywgUExVUkFMKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIAorICAgICAgLy8gd2VubiB0bXAgZWluIFN0cmluZyB3YXIsIHdlaXNlbiB3aXIgZXMgaGllciBwYXVzY2hhbCB6dQorICAgICAgaWYgKHN0cmluZ3AodG1wKSkKKyAgICAgICAgcGFydHNbaV0gPSB0bXA7CisKKyAgICAgIC8vIGF1ZiBXdW5zY2ggd2lyZCBuYWNoIFNhdHplbmRlbiBncm9zcyBnZXNjaHJpZWJlbgorICAgICAgaWYgKGNhcHMpCisgICAgICAgIHN3aXRjaCAocGFydHNbaS0xXVs8Mi4uXSkgeworICAgICAgICAgIGNhc2UgIi4gIjogIGNhc2UgIiEgIjogIGNhc2UgIj8gIjoKKyAgICAgICAgICBjYXNlICIuIjogICBjYXNlICIhIjogICBjYXNlICI/IjoKKyAgICAgICAgICBjYXNlICIuXG4iOiBjYXNlICIhXG4iOiBjYXNlICI/XG4iOgorICAgICAgICAgIGNhc2UgIlwiICI6IGNhc2UgIlwiXG4iOgorICAgICAgICAgICAgcGFydHNbaV0gPSBjYXBpdGFsaXplKHBhcnRzW2ldKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBpbXBsb2RlKHBhcnRzLCAiIik7CisgIH0KKyAgcmV0dXJuIHN0cjsKK30KKworCisvL3JlcGxhY2VtZW50cyBmb3IgZHJvcHBlZCBlZnVucyBpbiBMRAorI2lmICFfX0VGVU5fREVGSU5FRF9fKGV4dHJhY3QpCitkZXByZWNhdGVkIHZhcmFyZ3Mgc3RyaW5nIGV4dHJhY3Qoc3RyaW5nIHN0ciwgaW50IGZyb20sIGludCB0bykgeworCisgIGlmKCFzdHJpbmdwKHN0cikpIHsKKyAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOworICAgIHJhaXNlX2Vycm9yKHNwcmludGYoIkJhZCBhcmd1bWVudCAxIHRvIGV4dHJhY3QoKTogJU8iLHN0cikpOworICB9CisgIGlmIChpbnRwKGZyb20pICYmIGludHAodG8pKSB7CisgICAgaWYgKGZyb20+PTAgJiYgdG8+PTApCisgICAgICByZXR1cm4oc3RyW2Zyb20gLi4gdG9dKTsKKyAgICBlbHNlIGlmIChmcm9tPj0wICYmIHRvPDApCisgICAgICByZXR1cm4oc3RyW2Zyb20gLi4gPGFicyh0byldKTsKKyAgICBlbHNlIGlmIChmcm9tPDAgJiYgdG8+PTApCisgICAgICByZXR1cm4oc3RyWzxhYnMoZnJvbSkgLi4gdG9dKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4oc3RyWzxhYnMoZnJvbSkgLi4gPGFicyh0byldKTsKKyAgfQorICBlbHNlIGlmIChpbnRwKGZyb20pKSB7CisgICAgaWYgKGZyb20+PTApCisgICAgICByZXR1cm4oc3RyW2Zyb20gLi4gXSk7CisgICAgZWxzZQorICAgICAgcmV0dXJuKHN0cls8YWJzKGZyb20pIC4uIF0pOworICB9CisgIGVsc2UgeworICAgIHJldHVybihzdHIpOworICB9Cit9CisjZW5kaWYgLy8gIV9fRUZVTl9ERUZJTkVEX18oZXh0cmFjdCkKKworI2lmICFfX0VGVU5fREVGSU5FRF9fKHNsaWNlX2FycmF5KQorZGVwcmVjYXRlZCB2YXJhcmdzIG1peGVkIHNsaWNlX2FycmF5KG1peGVkIGFycmF5LCBpbnQgZnJvbSwgaW50IHRvKSB7CisKKyAgaWYoIXBvaW50ZXJwKGFycmF5KSkgeworICAgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CisgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigiQmFkIGFyZ3VtZW50IDEgdG8gc2xpY2VfYXJyYXkoKTogJU8iLGFycmF5KSk7CisgIH0KKyAgaWYgKGludHAoZnJvbSkgJiYgaW50cCh0bykpIHsKKyAgICBpZiAoZnJvbT49MCAmJiB0bz49MCkKKyAgICAgIHJldHVybihhcnJheVtmcm9tIC4uIHRvXSk7CisgICAgZWxzZSBpZiAoZnJvbT49MCAmJiB0bzwwKQorICAgICAgcmV0dXJuKGFycmF5W2Zyb20gLi4gPGFicyh0byldKTsKKyAgICBlbHNlIGlmIChmcm9tPDAgJiYgdG8+PTApCisgICAgICByZXR1cm4oYXJyYXlbPGFicyhmcm9tKSAuLiB0b10pOworICAgIGVsc2UKKyAgICAgIHJldHVybihhcnJheVs8YWJzKGZyb20pIC4uIDxhYnModG8pXSk7CisgIH0KKyAgZWxzZSBpZiAoaW50cChmcm9tKSkgeworICAgIGlmIChmcm9tPj0wKQorICAgICAgcmV0dXJuKGFycmF5W2Zyb20gLi4gXSk7CisgICAgZWxzZQorICAgICAgcmV0dXJuKGFycmF5WzxhYnMoZnJvbSkgLi4gXSk7CisgIH0KKyAgZWxzZSB7CisgICAgcmV0dXJuKGFycmF5KTsKKyAgfQorfQorI2VuZGlmIC8vICFfX0VGVU5fREVGSU5FRF9fKHNsaWNlX2FycmF5KQorCisjaWYgIV9fRUZVTl9ERUZJTkVEX18obWVtYmVyX2FycmF5KQorZGVwcmVjYXRlZCBpbnQgbWVtYmVyX2FycmF5KG1peGVkIGl0ZW0sIG1peGVkIGFycmF5c3RyaW5nKSB7CisKKyAgaWYgKHBvaW50ZXJwKGFycmF5c3RyaW5nKSkgeworICAgIHJldHVybihlZnVuOjptZW1iZXIoYXJyYXlzdHJpbmcsaXRlbSkpOworICB9CisgIGVsc2UgaWYgKHN0cmluZ3AoYXJyYXlzdHJpbmcpKSB7CisgICAgcmV0dXJuKGVmdW46Om1lbWJlcihhcnJheXN0cmluZyx0b19pbnQoaXRlbSkpKTsKKyAgfQorICBlbHNlIHsKKyAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOworICAgIHJhaXNlX2Vycm9yKHNwcmludGYoIkJhZCBhcmd1bWVudCAxIHRvIG1lbWJlcl9hcnJheSgpOiAlTyIsYXJyYXlzdHJpbmcpKTsKKyAgfQorfQorI2VuZGlmIC8vICFfX0VGVU5fREVGSU5FRF9fKG1lbWJlcl9hcnJheSkKKworLy8gVGhlIGRpZ2l0IGF0IHRoZSBpJ3RoIHBvc2l0aW9uIGlzIHRoZSBudW1iZXIgb2YgYml0cyBzZXQgaW4gJ2knLgorc3RyaW5nIGNvdW50X3RhYmxlID0KKyAgICAiMDExMjEyMjMxMjIzMjMzNDEyMjMyMzM0MjMzNDM0NDUxMjIzMjMzNDIzMzQzNDQ1MjMzNDM0NDUzNDQ1NDU1NiI7CitpbnQgYnJva2VuX2NvdW50X2JpdHMoIHN0cmluZyBzICkgeworICAgIGludCBpLCByZXM7CisgICAgaWYoICFzdHJpbmdwKHMpIHx8ICEoaT1zaXplb2YocykpICkgcmV0dXJuIDA7CisgICAgZm9yKCA7IGktLT4wOyApIHsKKyAgICAgICAgLy8gV2UgYXJlIGNvdW50aW5nIDYgYml0cyBhdCBhIHRpbWUgdXNpbmcgYSBwcmVjb21waWxlZCB0YWJsZS4KKyAgICAgICAgcmVzICs9IGNvdW50X3RhYmxlWyhzW2ldLScgJykmNjNdLScwJzsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworI2lmICFfX0VGVU5fREVGSU5FRF9fKGNvdW50X2JpdHMpCitpbnQgY291bnRfYml0cyggc3RyaW5nIHMgKSB7CisgICAgcmV0dXJuKGJyb2tlbl9jb3VudF9iaXRzKHMpKTsKK30KKyNlbmRpZgorCisKKy8vICogVGVpbGUgYXVzIGVpbmVtIEFycmF5IGVudGZlcm5lbiAqKiogT0JTT0xFVEUKK2RlcHJlY2F0ZWQgbWl4ZWQgKmV4Y2x1ZGVfYXJyYXkobWl4ZWQgKmFycixpbnQgZnJvbSxpbnQgdG8pCit7CisgIGlmICh0bzxmcm9tKQorICAgIHRvID0gZnJvbTsKKyAgcmV0dXJuIGFyclswLi5mcm9tLTFdK2Fyclt0bysxLi5dOworfQorCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9SRUFETUUgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAzNDI5YQotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL1JFQURNRQpAQCAtMCwwICsxLDIwIEBACitzaW11bF9lZnVuIAorLS0tLS0tLS0tLSAKK0RhcyBzaW11bF9lZnVuIE9iamVrdCAvc2VjdXJlL3NpbXVsX2VmdW4vc2ltdWxfZWZ1biBiZW51dHp0IGRpZSBEYXRlaWVuCitpbiAvc2VjdXJlL3NpbXVsX2VmdW4uCitJbSBWZXJ6ZWljaG5pcyAvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUgaXN0IGVpbmUgU2ljaGVyaGVpdHNrb3BpZSB2b24gYWxsZW4gCitEYXRlaWVuIGluIC9zZWN1cmUvc2ltdWxfZWZ1bi4KKworRmFsbHMgL3NlY3VyZS9zaW11bF9lZnVuL3NpbXVsX2VmdW4uYyBuaWNodCBsYWRiYXIgaXN0LCB3aXJkIAorL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NpbXVsX2VmdW4uYyBhbHMgRXJzYXR6IHZlcnN1Y2h0LiBXZW5uIGF1Y2ggZGFzCituaWNodCBsYWRiYXIgaXN0LCBlcmZvbGd0IGVpbiBTaHV0ZG93biBkZXMgTXVkcy4KKworQmVpIEFlbmRlcnVuZ2VuIHNvbGx0ZSBfenVlcnN0XyBkaWUgbm9ybWFsZSBzaW11bCBlZnVuIGVkaXRpZXJ0IHVuZAorYW5zY2hsaWVzc2VuZCB6ZXJzdG9lcnQvZW50bGFkZW4gd2VyZGVuLCB3b3JhdWZoaW4gc2llIGltcGxpeml0IGR1cmNoIGRlbgorRHJpdmVyIHVuZCBNYXN0ZXIgbmV1Z2VsYWRlbiB3aXJkLiBJc3QgZGllcyBlcmZvbGdyZWljaCB1bmQgZGllIG5ldWUKK3NpbXVsX2VmdW4gbGFldWZ0IChlcnN0IGRhbm4hKSBrb3BpZXJ0IG1hbiBkaWUgRGF0ZWllbiBhdXMgCisvc2VjdXJlL3NpbXVsX2VmdW4gbmFjaCAvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUuCisKK0RpZSBEYXRlaWVuIGhpZXIgc2luZCBtaXQgQXVzbmFobWUgZGVyIHNpbXVsX2VmdW4uYyBzZWxic3QgX25pY2h0XyBkYXp1IAorZ2VkYWNodCwgZ2VsYWRlbiB6dSB3ZXJkZW4uCisKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL2NvbW0uYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL2NvbW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmI1OThjCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvY29tbS5jCkBAIC0wLDAgKzEsMTI1IEBACisjaW5jbHVkZSA8bGl2aW5nL2NvbW0uaD4KKworLy8gU2VuZGV0IGFuIGFsbGUgT2JqZWt0ZSBpbiByb29tIHVuZCByb29tIHNlbGJlciBkdXJjaCBBdWZydWYgdm9uCisvLyBSZWNlaXZlTXNnKCkuCit2YXJhcmdzIHZvaWQgc2VuZF9yb29tKG9iamVjdHxzdHJpbmcgcm9vbSwgc3RyaW5nIG1zZywgaW50IG1zZ190eXBlLAorICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbXNnX2FjdGlvbiwgc3RyaW5nIG1zZ19wcmVmaXgsIG9iamVjdCAqZXhjbHVkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0IG9yaWdpbikKK3sKKyAgaWYgKHN0cmluZ3Aocm9vbSkpCisgICAgcm9vbT1sb2FkX29iamVjdChyb29tKTsKKyAgCisgIG9yaWdpbiB8fD0gcHJldmlvdXNfb2JqZWN0KCk7CisgIG9iamVjdCAqZGVzdCA9IGV4Y2x1ZGUgPyBhbGxfaW52ZW50b3J5KHJvb20pIC0gZXhjbHVkZSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxfaW52ZW50b3J5KHJvb20pOworCisgIGRlc3QtPlJlY2VpdmVNc2cobXNnLCBtc2dfdHlwZSwgbXNnX2FjdGlvbiwgbXNnX3ByZWZpeCwgb3JpZ2luKTsKKyAgcm9vbS0+UmVjZWl2ZU1zZyhtc2csIG1zZ190eXBlLCBtc2dfYWN0aW9uLCBtc2dfcHJlZml4LCBvcmlnaW4pOworfQorCitzdGF0aWMgaW50IF9zaG91dF9maWx0ZXIoIG9iamVjdCBvYiwgc3RyaW5nIHBhdCApCit7CisgICAgc3RyaW5nICppZ25vcmU7CisKKyAgICBpZiAoICFlbnZpcm9ubWVudChvYikgKQorICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIHNpemVvZiggcmVnZXhwKCAoeyBvYmplY3RfbmFtZSggZW52aXJvbm1lbnQob2IpICkgfSksIHBhdCApICk7Cit9CisKK3ZhcmFyZ3Mgdm9pZCBzaG91dCggc3RyaW5nIHMsIG1peGVkIHdoZXJlICl7CisgICAgb2JqZWN0ICp1OworICAgIHN0cmluZyAqcGZhZGU7CisKKyAgICBpZiAoICFzaXplb2YoIHUgPSB1c2VycygpIC0gKHsgdGhpc19wbGF5ZXIoKSB9KSApICkKKyAgICAgICByZXR1cm47CisKKyAgICBpZiAoICF3aGVyZSApCisgICAgICAgcGZhZGUgPSAoeyAiLyIgfSk7CisgICAgZWxzZSBpZiAoIGludHAod2hlcmUpICkKKyAgICAgICBwZmFkZSA9CisgICAgICAgICAgICh7IGltcGxvZGUoIGVmdW46OmV4cGxvZGUoIG9iamVjdF9uYW1lKCBlbnZpcm9ubWVudCh0aGlzX3BsYXllcigpKSApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLyIgKVswLi4yXSwgIi8iICkgKyAiLyIgfSk7CisgICAgZWxzZSBpZiAoIHN0cmluZ3Aod2hlcmUpICkKKyAgICAgICBwZmFkZSA9ICh7IHdoZXJlIH0pOworICAgIGVsc2UKKyAgICAgICBwZmFkZSA9IHdoZXJlOworCisgICAgdSA9IGZpbHRlciggdSwgIl9zaG91dF9maWx0ZXIiLCBNRSwgaW1wbG9kZSggcGZhZGUsICJ8IiApICk7CisgICAgdS0+UmVjZWl2ZU1zZyhzLCBNVF9DT01NfE1UX0ZBUnxNU0dfRE9OVF9XUkFQfE1TR19ET05UX1NUT1JFLAorICAgICAgICAgICAgICAgICAgTUFfU0hPVVRfU0VGVU4sIDAsIHByZXZpb3VzX29iamVjdCgpKTsKK30KKworCisjaWYgX19WRVJTSU9OX18gPiAiMy4zLjcxOCIKKy8vIFRoaXMgc2VmdW4gcmVwbGFjZXMgdGhlIGRlcHJlY2F0ZWQgZWZ1biBjYXQoKS4KKyNkZWZpbmUgQ0FUX01BWF9MSU5FUyA1MAordmFyYXJncyBpbnQgY2F0KHN0cmluZyBmaWxlLCBpbnQgc3RhcnQsIGludCBudW0pCit7CisgICAgaWYgKGV4dGVybl9jYWxsKCkpCisgICAgICAgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CisKKyAgICBpbnQgbW9yZTsKKworICAgIGlmIChudW0gPCAwIHx8ICF0aGlzX3BsYXllcigpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmICghc3RhcnQpCisgICAgICAgIHN0YXJ0ID0gMTsKKworICAgIGlmICghbnVtIHx8IG51bSA+IENBVF9NQVhfTElORVMpIHsKKyAgICAgICAgbnVtID0gQ0FUX01BWF9MSU5FUzsKKyAgICAgICAgbW9yZSA9IHNpemVvZihyZWFkX2ZpbGUoZmlsZSwgc3RhcnQrbnVtLCAxKSk7CisgICAgfQorCisgICAgc3RyaW5nIHR4dCA9IHJlYWRfZmlsZShmaWxlLCBzdGFydCwgbnVtKTsKKyAgICBpZiAoIXR4dCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBlZnVuOjp0ZWxsX29iamVjdCh0aGlzX3BsYXllcigpLCB0eHQpOworCisgICAgaWYgKG1vcmUpCisgICAgICAgIGVmdW46OnRlbGxfb2JqZWN0KHRoaXNfcGxheWVyKCksICIqKioqKlRSVU5DQVRFRCoqKipcbiIpOworCisgICAgcmV0dXJuIHNpemVvZih0eHQgJiAiXG4iKTsKK30KKyN1bmRlZiBDQVRfTUFYX0xJTkVTCisjZW5kaWYgLy8gX19WRVJTSU9OX18gPiAiMy4zLjcxOCIKKworI2lmIF9fVkVSU0lPTl9fID4gIjMuMy43MTkiCisvLyBUaGlzIHNlZnVuIHJlcGxhY2VzIHRoZSBkZXByZWNhdGVkIGVmdW4gdGFpbCgpLgorI2RlZmluZSBUQUlMX01BWF9CWVRFUyAxMDAwCit2YXJhcmdzIGludCB0YWlsKHN0cmluZyBmaWxlKQoreworICAgIGlmIChleHRlcm5fY2FsbCgpKQorICAgICAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOworCisgICAgaWYgKCFzdHJpbmdwKGZpbGUpIHx8ICF0aGlzX3BsYXllcigpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHN0cmluZyB0eHQgPSByZWFkX2J5dGVzKGZpbGUsIC0oVEFJTF9NQVhfQllURVMgKyA4MCksIChUQUlMX01BWF9CWVRFUyArIDgwKSk7CisgICAgLy8gcmVhZF9ieXRlcygpIHJldHVybnMgMCBpZiB0aGUgc3RhcnQgb2YgdGhlIHNlY3Rpb24gZ2l2ZW4gYnkKKyAgICAvLyBwYXJhbWV0ZXIgIzIgbGllcyBiZXlvbmQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZS4KKyAgICAvLyBJbiB0aGlzIGNhc2Ugd2Ugc2ltcGx5IHRyeSBhbmQgcmVhZCB0aGUgZW50aXJlIGZpbGUuCisgICAgaWYgKCFzdHJpbmdwKHR4dCkgJiYgZmlsZV9zaXplKGZpbGUpIDwgVEFJTF9NQVhfQllURVMrODApCisgICAgICB0eHQgPSByZWFkX2ZpbGUoZmlsZSk7CisgICAgLy8gRXhpdCBpZiBzdGlsbCBub3RoaW5nIGNvdWxkIGJlIHJlYWQuCisgICAgaWYgKCFzdHJpbmdwKHR4dCkpCisgICAgICByZXR1cm4gMDsKKworICAgIC8vIGN1dCBvZmYgZmlyc3QgKGluY29tcGxldGUpIGxpbmUKKyAgICBpbnQgaW5kZXggPSBzdHJzdHIodHh0LCAiXG4iKTsKKyAgICBpZiAoaW5kZXggPiAtMSkgeworICAgICAgICBpZiAoaW5kZXggKyAxIDwgc2l6ZW9mKHR4dCkpCisgICAgICAgICAgICB0eHQgPSB0eHRbaW5kZXgrMS4uXTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdHh0ID0gIiI7CisgICAgfQorCisgICAgZWZ1bjo6dGVsbF9vYmplY3QodGhpc19wbGF5ZXIoKSwgdHh0KTsKKworICAgIHJldHVybiAxOworfQorI3VuZGVmIFRBSUxfTUFYX0JZVEVTCisjZW5kaWYgLy8gX19WRVJTSU9OX18gPiAiMy4zLjcxOSIKKwpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvZGVidWdfaW5mby5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvZGVidWdfaW5mby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2MDdjMmYKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9kZWJ1Z19pbmZvLmMKQEAgLTAsMCArMSw0MzQgQEAKKy8qIFRoaXMgc2VmdW4gaXMgdG8gcHJvdmlkZSBhIHJlcGxhY2VtZW50IGZvciB0aGUgZWZ1biBkZWJ1Z19pbmZvKCkuCisgKiBGZWVsIGZyZWUgdG8gYWRkIGl0IHRvIHlvdXIgbXVkbGlicywgaWYgeW91IGhhdmUgbXVjaCBjb2RlIHJlbHlpbmcgb24gdGhhdC4KKyAqLworCisjaWYgISBfX0VGVU5fREVGSU5FRF9fKGRlYnVnX2luZm8pCisKKyNpbmNsdWRlIDxkcml2ZXJfaW5mby5oPgorI2luY2x1ZGUgPGRlYnVnX2luZm8uaD4KKworbWl4ZWQgZGVidWdfaW5mbyhpbnQgd2hhdCwgdmFyYXJncyBtaXhlZCogYXJncykKK3sKKyAgICBpZiAoc2l6ZW9mKGFyZ3MpID4gMikKKyAgICAgICAgcmFpc2VfZXJyb3IoIlRvbyBtYW55IGFyZ3VtZW50cyB0byBkZWJ1Z19pbmZvXG4iKTsKKworICAgIHN3aXRjaCh3aGF0KQorICAgIHsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoIklsbGVnYWwgdmFsdWUgJWQgZm9yIGRlYnVnX2luZm8oKS5cbiIsIHdoYXQpKTsKKworICAgICAgICBjYXNlIERJTkZPX09CSkVDVDoKKyAgICAgICAgeworICAgICAgICAgICAgb2JqZWN0IG9iOworCisgICAgICAgICAgICBpZiAoc2l6ZW9mKGFyZ3MpICE9IDEpCisgICAgICAgICAgICAgICAgcmFpc2VfZXJyb3IoImJhZCBudW1iZXIgb2YgYXJndW1lbnRzIHRvIGRlYnVnX2luZm9cbiIpOworICAgICAgICAgICAgaWYgKCFvYmplY3RwKGFyZ3NbMF0pKQorICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKCJiYWcgYXJnIDIgdG8gZGVidWdfaW5mbygpLlxuIik7CisKKyAgICAgICAgICAgIG9iID0gYXJnc1swXTsKKyAgICAgICAgICAgIHByaW50ZigiT19IRUFSVF9CRUFUICAgICAgOiAlc1xuIiwgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9DX0hFQVJUX0JFQVQpICAgICAgID8gIlRSVUUiIDogIkZBTFNFIik7CisgICAgICAgICAgICBwcmludGYoIk9fRU5BQkxFX0NPTU1BTkRTIDogJXNcbiIsIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPQ19DT01NQU5EU19FTkFCTEVEKSA/ICJUUlVFIiA6ICJGQUxTRSIpOworICAgICAgICAgICAgcHJpbnRmKCJPX0NMT05FICAgICAgICAgICA6ICVzXG4iLCBlZnVuOjpjbG9uZXAob2IpICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAiVFJVRSIgOiAiRkFMU0UiKTsKKyAgICAgICAgICAgIHByaW50ZigiT19ERVNUUlVDVEVEICAgICAgOiBGQUxTRVxuIik7CisgICAgICAgICAgICBwcmludGYoIk9fU1dBUFBFRCAgICAgICAgIDogJXNcbiIsIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TV0FQUEVEKSAgICAgICAgICA/ICJUUlVFIiA6ICJGQUxTRSIpOworICAgICAgICAgICAgcHJpbnRmKCJPX09OQ0VfSU5URVJBQ1RJVkU6ICVzXG4iLCBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfT05DRV9JTlRFUkFDVElWRSkgPyAiVFJVRSIgOiAiRkFMU0UiKTsKKyAgICAgICAgICAgIHByaW50ZigiT19SRVNFVF9TVEFURSAgICAgOiAlc1xuIiwgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1JFU0VUX1NUQVRFKSAgICAgID8gIlRSVUUiIDogIkZBTFNFIik7CisgICAgICAgICAgICBwcmludGYoIk9fV0lMTF9DTEVBTl9VUCAgIDogJXNcbiIsIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9XSUxMX0NMRUFOX1VQKSAgICA/ICJUUlVFIiA6ICJGQUxTRSIpOworICAgICAgICAgICAgcHJpbnRmKCJPX1JFUExBQ0VEICAgICAgICA6ICVzXG4iLCBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfUkVQTEFDRUQpICAgICAgICAgPyAiVFJVRSIgOiAiRkFMU0UiKTsKKyAgICAgICAgICAgIHByaW50ZigidGltZV9yZXNldCAgOiAlZFxuIiwgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05FWFRfUkVTRVRfVElNRSkpOworICAgICAgICAgICAgcHJpbnRmKCJ0aW1lX29mX3JlZiA6ICVkXG4iLCAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTEFTVF9SRUZfVElNRSkpOworICAgICAgICAgICAgcHJpbnRmKCJyZWYgICAgICAgICA6ICVkXG4iLCAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfT0JKRUNUX1JFRlMpKTsKKworICAgICAgICAgICAgaW50IGd0aWNrcyA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9HSUdBVElDS1MpOworICAgICAgICAgICAgaWYoZ3RpY2tzKQorICAgICAgICAgICAgICAgIHByaW50ZigiZXZhbGNvc3QgICA6ICAlZCUwOWRcbiIsIGd0aWNrcywgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1RJQ0tTKSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcHJpbnRmKCJldmFsY29zdCAgIDogICVkXG4iLCAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9USUNLUykpOworCisgICAgICAgICAgICBwcmludGYoInN3YXBfbnVtICAgIDogJWRcbiIsICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TV0FQX05VTSkpOworICAgICAgICAgICAgcHJpbnRmKCJuYW1lICAgICAgICA6ICclcydcbiIsICAgICBlZnVuOjpvYmplY3RfbmFtZShvYikpOworICAgICAgICAgICAgcHJpbnRmKCJsb2FkX25hbWUgICA6ICclcydcbiIsICAgICBlZnVuOjpsb2FkX25hbWUob2IpKTsKKworICAgICAgICAgICAgb2JqZWN0IG5leHRfb2IgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfT0JKRUNUX05FWFQpOworICAgICAgICAgICAgaWYgKG5leHRfb2IpCisgICAgICAgICAgICAgICAgcHJpbnRmKCJuZXh0X2FsbCAgICA6IE9CSiglcylcbiIsIGVmdW46Om9iamVjdF9uYW1lKG5leHRfb2IpKTsKKworICAgICAgICAgICAgb2JqZWN0IHByZXZfb2IgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfT0JKRUNUX1BSRVYpOworICAgICAgICAgICAgaWYgKHByZXZfb2IpCisgICAgICAgICAgICAgICAgcHJpbnRmKCJQcmV2aW91cyBvYmplY3QgaW4gb2JqZWN0IGxpc3Q6IE9CSiglcylcbiIsIGVmdW46Om9iamVjdF9uYW1lKHByZXZfb2IpKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBwcmludGYoIlRoaXMgb2JqZWN0IGlzIHRoZSBoZWFkIG9mIHRoZSBvYmplY3QgbGlzdC5cbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIERJTkZPX01FTU9SWToKKyAgICAgICAgeworICAgICAgICAgICAgb2JqZWN0IG9iOworCisgICAgICAgICAgICBpZiAoc2l6ZW9mKGFyZ3MpICE9IDEpCisgICAgICAgICAgICAgICAgcmFpc2VfZXJyb3IoImJhZCBudW1iZXIgb2YgYXJndW1lbnRzIHRvIGRlYnVnX2luZm9cbiIpOworICAgICAgICAgICAgaWYgKCFvYmplY3RwKGFyZ3NbMF0pKQorICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKCJiYWcgYXJnIDIgdG8gZGVidWdfaW5mbygpLlxuIik7CisKKyAgICAgICAgICAgIG9iID0gYXJnc1swXTsKKworICAgICAgICAgICAgcHJpbnRmKCJwcm9ncmFtIHJlZidzICUzZFxuIiwgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfUFJPR19SRUZTKSk7CisgICAgICAgICAgICBwcmludGYoIk5hbWU6ICclcydcbiIsICAgICAgICAgIGVmdW46OnByb2dyYW1fbmFtZShvYikpOworICAgICAgICAgICAgcHJpbnRmKCJwcm9ncmFtIHNpemUgICAgJTZkXG4iLCBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfUFJPR19TSVpFKSk7CisgICAgICAgICAgICBwcmludGYoIm51bSBmdW5jJ3M6ICAlM2QgKCU0ZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9OVU1fRlVOQ1RJT05TKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NJWkVfRlVOQ1RJT05TKSk7CisgICAgICAgICAgICBwcmludGYoIm51bSB2YXJzOiAgICAlM2QgKCU0ZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9OVU1fVkFSSUFCTEVTKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NJWkVfVkFSSUFCTEVTKSk7CisKKyAgICAgICAgICAgIHByaW50ZigibnVtIHN0cmluZ3M6ICUzZCAoJTRkKSA6IG92ZXJoZWFkICVkICsgZGF0YSAlZCAoJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTlVNX1NUUklOR1MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0laRV9TVFJJTkdTKSArIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSVpFX1NUUklOR1NfREFUQSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSVpFX1NUUklOR1MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0laRV9TVFJJTkdTX0RBVEEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0laRV9TVFJJTkdTX0RBVEFfVE9UQUwpKTsKKworICAgICAgICAgICAgcHJpbnRmKCJudW0gaW5oZXJpdHMgJTNkICglNGQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTlVNX0lOSEVSSVRFRCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSVpFX0lOSEVSSVRFRCkpOworCisgICAgICAgICAgICBwcmludGYoInRvdGFsIHNpemUgICAgICAlNmRcbiIsIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9QUk9HX1NJWkVfVE9UQUwpKTsKKworICAgICAgICAgICAgcHJpbnRmKCJkYXRhIHNpemUgICAgICAgJTZkICglNmRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9EQVRBX1NJWkUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfREFUQV9TSVpFX1RPVEFMKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgRElORk9fT0JKTElTVDoKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHNpemVvZihhcmdzKSA9PSAwKQorICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKCJiYWQgbnVtYmVyIG9mIGFyZ3VtZW50cyB0byBkZWJ1Z19pbmZvXG4iKTsKKworICAgICAgICAgICAgaWYgKHNpemVvZihhcmdzKSA9PSAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG9iamVjdCAqIG9icyA9IGVmdW46Om9iamVjdHMoYXJnc1swXSwgMSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG9ic1swXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gZWZ1bjo6b2JqZWN0cyhhcmdzWzBdLCBhcmdzWzFdKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBESU5GT19NQUxMT0M6CisgICAgICAgICAgICB3cml0ZShkZWJ1Z19pbmZvKERJTkZPX1NUQVRVUywgIm1hbGxvYyIpKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgRElORk9fU1RBVFVTOgorICAgICAgICB7CisgICAgICAgICAgICBzdHJpbmcgd2hpY2g7CisgICAgICAgICAgICBpbnQgb3B0OworCisgICAgICAgICAgICBpZiAoc2l6ZW9mKGFyZ3MpID4gMSkKKyAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFkIG51bWJlciBvZiBhcmd1bWVudHMgdG8gZGVidWdfaW5mb1xuIik7CisKKyAgICAgICAgICAgIGlmICghc2l6ZW9mKGFyZ3MpIHx8ICFhcmdzWzBdKQorICAgICAgICAgICAgICAgIHdoaWNoID0gIiI7CisgICAgICAgICAgICBlbHNlIGlmKHN0cmluZ3AoYXJnc1swXSkpCisgICAgICAgICAgICAgICAgd2hpY2ggPSBhcmdzWzBdOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKCJiYWcgYXJnIDIgdG8gZGVidWdfaW5mbygpLlxuIik7CisKKyAgICAgICAgICAgIHN3aXRjaCh3aGljaCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlICIiOgorICAgICAgICAgICAgICAgICAgICBvcHQgPSBESV9TVEFUVVNfVEVYVF9NRU1PUlk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAidGFibGVzIjoKKyAgICAgICAgICAgICAgICAgICAgb3B0ID0gRElfU1RBVFVTX1RFWFRfVEFCTEVTOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgInN3YXAiOgorICAgICAgICAgICAgICAgICAgICBvcHQgPSBESV9TVEFUVVNfVEVYVF9TV0FQOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgIm1hbGxvYyI6CisgICAgICAgICAgICAgICAgICAgIG9wdCA9IERJX1NUQVRVU19URVhUX01BTExPQzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlICJtYWxsb2MgZXh0c3RhdHMiOgorICAgICAgICAgICAgICAgICAgICBvcHQgPSBESV9TVEFUVVNfVEVYVF9NQUxMT0NfRVhURU5ERUQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBlZnVuOjpkcml2ZXJfaW5mbyhvcHQpOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBESU5GT19EVU1QOgorICAgICAgICB7CisgICAgICAgICAgICBpbnQgb3B0OworCisgICAgICAgICAgICBpZiAoIXNpemVvZihhcmdzKSkKKyAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFkIG51bWJlciBvZiBhcmd1bWVudHMgdG8gZGVidWdfaW5mb1xuIik7CisKKyAgICAgICAgICAgIGlmKCFzdHJpbmdwKGFyZ3NbMF0pKQorICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKCJiYWcgYXJnIDIgdG8gZGVidWdfaW5mbygpLlxuIik7CisKKyAgICAgICAgICAgIHN3aXRjaChhcmdzWzBdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgIm9iamVjdHMiOgorICAgICAgICAgICAgICAgICAgICBvcHQgPSBERElfT0JKRUNUUzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlICJkZXN0cnVjdGVkIjoKKyAgICAgICAgICAgICAgICAgICAgb3B0ID0gRERJX09CSkVDVFNfREVTVFJVQ1RFRDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlICJvcGNvZGVzIjoKKyAgICAgICAgICAgICAgICAgICAgb3B0ID0gRERJX09QQ09ERVM7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAibWVtb3J5IjoKKyAgICAgICAgICAgICAgICAgICAgb3B0ID0gRERJX01FTU9SWTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByYWlzZV9lcnJvcihzcHJpbnRmKCJCYWQgYXJndW1lbnQgJyVzJyB0byBkZWJ1Z19pbmZvKERJTkZPX0RVTVApLlxuIiwgYXJnc1swXSkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGVmdW46OmR1bXBfZHJpdmVyX2luZm8ob3B0LCBhcmdzWzEuLjFdLi4uKTsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgRElORk9fREFUQToKKyAgICAgICAgeworICAgICAgICAgICAgbWl4ZWQgKiByZXN1bHQ7CisKKyAgICAgICAgICAgIGlmICghc2l6ZW9mKGFyZ3MpKQorICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKCJiYWQgbnVtYmVyIG9mIGFyZ3VtZW50cyB0byBkZWJ1Z19pbmZvXG4iKTsKKworICAgICAgICAgICAgaWYgKCFpbnRwKGFyZ3NbMF0pKQorICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKCJiYWcgYXJnIDIgdG8gZGVidWdfaW5mbygpLlxuIik7CisKKyAgICAgICAgICAgIGlmIChzaXplb2YoYXJncykgPT0gMiAmJiAhaW50cChhcmdzWzFdKSkKKyAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFnIGFyZyAzIHRvIGRlYnVnX2luZm8oKS5cbiIpOworCisgICAgICAgICAgICBzd2l0Y2goYXJnc1swXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIERJRF9TVEFUVVM6CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGFsbG9jYXRlKERJRF9TVEFUVVNfTUFYKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0FDVElPTlNdICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fQUNUSU9OUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfQUNUSU9OU19TSVpFXSAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfQUNUSU9OUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU0hBRE9XU10gICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TSEFET1dTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TSEFET1dTX1NJWkVdICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TSEFET1dTKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX09CSkVDVFNdICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fT0JKRUNUUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfT0JKRUNUU19TSVpFXSAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfT0JKRUNUUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfT0JKRUNUU19TV0FQUEVEXSAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9PQkpFQ1RTX1NXQVBQRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX09CSkVDVFNfU1dBUF9TSVpFXSAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX09CSkVDVFNfU1dBUFBFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfT0JKRUNUU19MSVNUXSAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9PQkpFQ1RTX0lOX0xJU1QpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX09CSkVDVFNfTkVXTFlfREVTVF0gICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fT0JKRUNUU19ORVdMWV9ERVNUUlVDVEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9PQkpFQ1RTX0RFU1RSVUNURURdICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX09CSkVDVFNfREVTVFJVQ1RFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfT0JKRUNUU19QUk9DRVNTRURdICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9PQkpFQ1RTX0xBU1RfUFJPQ0VTU0VEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9PQkpFQ1RTX0FWR19QUk9DXSAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTE9BRF9BVkVSQUdFX1BST0NFU1NFRF9PQkpFQ1RTX1JFTEFUSVZFKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX09UQUJMRV0gICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fT0JKRUNUU19JTl9UQUJMRSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfT1RBQkxFX1NMT1RTXSAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9PQkpFQ1RfVEFCTEVfU0xPVFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX09UQUJMRV9TSVpFXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX09CSkVDVF9UQUJMRSk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9IQkVBVF9PQkpTXSAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0hFQVJUQkVBVFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0hCRUFUX0NBTExTXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fSEVBUlRCRUFUX0FDVElWRV9DWUNMRVMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0hCRUFUX0NBTExTX1RPVEFMXSAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fSEVBUlRCRUFUX1RPVEFMX0NZQ0xFUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfSEJFQVRfU0xPVFNdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9IRUFSVEJFQVRTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9IQkVBVF9TSVpFXSAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9IRUFSVEJFQVRTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9IQkVBVF9QUk9DRVNTRURdICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0hFQVJUQkVBVFNfTEFTVF9QUk9DRVNTRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0hCRUFUX0FWR19QUk9DXSAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9MT0FEX0FWRVJBR0VfUFJPQ0VTU0VEX0hFQVJUQkVBVFNfUkVMQVRJVkUpOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfQ0FMTE9VVFNdICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9DQUxMT1VUUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfQ0FMTE9VVF9TSVpFXSAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfQ0FMTE9VVFMpOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfQVJSQVlTXSAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9BUlJBWVMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0FSUkFZU19TSVpFXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX0FSUkFZUyk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9NQVBQSU5HU10gICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX01BUFBJTkdTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9NQVBQSU5HU19TSVpFXSAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9NQVBQSU5HUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfSFlCUklEX01BUFBJTkdTXSAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9NQVBQSU5HU19IWUJSSUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0hBU0hfTUFQUElOR1NdICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fTUFQUElOR1NfSEFTSCk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJVQ1RTXSAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NUUlVDVFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUlVDVFNfU0laRV0gICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NUUlVDVFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUlVDVF9UWVBFU10gICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1RSVUNUX1RZUEVTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJVQ1RfVFlQRVNfU0laRV0gICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TVFJVQ1RfVFlQRVMpOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfUFJPR1NdICAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9QUk9HUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfUFJPR1NfU0laRV0gICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfUFJPR1MpOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfUFJPR1NfU1dBUFBFRF0gICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9QUk9HU19TV0FQUEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9QUk9HU19TV0FQX1NJWkVdICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9QUk9HU19TV0FQUEVEKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1VTRVJfUkVTRVJWRV0gICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9NRU1PUllfUkVTRVJWRV9VU0VSKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9NQVNURVJfUkVTRVJWRV0gICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTUVNT1JZX1JFU0VSVkVfTUFTVEVSKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TWVNURU1fUkVTRVJWRV0gICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTUVNT1JZX1JFU0VSVkVfU1lTVEVNKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0FERF9NRVNTQUdFXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fTUVTU0FHRVNfT1VUKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9QQUNLRVRTXSAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1BBQ0tFVFNfT1VUKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9QQUNLRVRfU0laRV0gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9QQUNLRVRTX09VVCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfUEFDS0VUU19JTl0gICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9QQUNLRVRTX0lOKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9QQUNLRVRfU0laRV9JTl0gICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9QQUNLRVRTX0lOKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX0FQUExZXSAgICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fRlVOQ1RJT05fTkFNRV9DQUxMUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfQVBQTFlfSElUU10gICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9GVU5DVElPTl9OQU1FX0NBTExfSElUUyk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJJTkdTXSAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1ZJUlRVQUxfU1RSSU5HUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSSU5HX1NJWkVdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU1RSSU5HUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSX1RBQkxFX1NJWkVdICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU1RSSU5HX1RBQkxFKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJfT1ZFUkhFQURdICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TVFJJTkdfT1ZFUkhFQUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1VOVEFCTEVEXSAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1RSSU5HU19VTlRBQkxFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfVU5UQUJMRURfU0laRV0gICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU1RSSU5HU19VTlRBQkxFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfVEFCTEVEXSAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TVFJJTkdTX1RBQkxFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfVEFCTEVEX1NJWkVdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU1RSSU5HU19UQUJMRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUl9TRUFSQ0hFU10gICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1RSSU5HX1RBQkxFX0xPT0tVUFNfQllfSU5ERVgpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUl9TRUFSQ0hMRU5dICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1RSSU5HX1RBQkxFX0xPT0tVUF9TVEVQU19CWV9JTkRFWCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSX1NFQVJDSEVTX0JZVkFMVUVdICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TVFJJTkdfVEFCTEVfTE9PS1VQU19CWV9WQUxVRSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfU1RSX1NFQVJDSExFTl9CWVZBTFVFXSA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TVFJJTkdfVEFCTEVfTE9PS1VQX1NURVBTX0JZX1ZBTFVFKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJfQ0hBSU5TXSAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NUUklOR19UQUJMRV9TTE9UU19VU0VEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJfQURERURdICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NUUklOR19UQUJMRV9TVFJJTkdTX0FEREVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9TVFJfREVMRVRFRF0gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NUUklOR19UQUJMRV9TVFJJTkdTX1JFTU9WRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUl9DT0xMSVNJT05TXSAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1RSSU5HX1RBQkxFX0NPTExJU0lPTlMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUl9GT1VORF0gICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1RSSU5HX1RBQkxFX0hJVFNfQllfSU5ERVgpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1NUUl9GT1VORF9CWVZBTFVFXSAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1RSSU5HX1RBQkxFX0hJVFNfQllfVkFMVUUpOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfUlhfQ0FDSEVEXSAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9SRUdFWCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfUlhfVEFCTEVdICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9SRUdFWF9UQUJMRV9TTE9UUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfUlhfVEFCTEVfU0laRV0gICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfUkVHRVgpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NUX1JYX1JFUVVFU1RTXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fUkVHRVhfTE9PS1VQUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfUlhfUkVRX0ZPVU5EXSAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9SRUdFWF9MT09LVVBfSElUUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfUlhfUkVRX0NPTExdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9SRUdFWF9MT09LVVBfQ09MTElTSU9OUyk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TVF9NQl9GSUxFXSAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9CVUZGRVJfRklMRSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfTUJfU1dBUF0gICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfQlVGRkVSX1NXQVApOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1RfQk9PVF9USU1FXSAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX0JPT1RfVElNRSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBESURfU1dBUDoKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gYWxsb2NhdGUoRElEX1NXQVBfTUFYKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX1BST0dTXSAgICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fUFJPR1NfU1dBUFBFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfUFJPR19TSVpFXSAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfUFJPR1NfU1dBUFBFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfUFJPR19VTlNXQVBQRURdICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9QUk9HU19VTlNXQVBQRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX1BST0dfVV9TSVpFXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1BST0dTX1VOU1dBUFBFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfVkFSU10gICAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9PQkpFQ1RTX1NXQVBQRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX1ZBUl9TSVpFXSAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX09CSkVDVFNfU1dBUFBFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfRlJFRV0gICAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TV0FQX0JMT0NLU19GUkVFKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19GUkVFX1NJWkVdICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TV0FQX0JMT0NLU19GUkVFKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19GSUxFX1NJWkVdICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9TV0FQX0JMT0NLUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfUkVVU0VEXSAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU1dBUF9CTE9DS1NfUkVVU0VEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19TRUFSQ0hFU10gICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NXQVBfQkxPQ0tTX1JFVVNFX0xPT0tVUFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX1NXX1NFQVJDSF9MRU5dICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1dBUF9CTE9DS1NfUkVVU0VfTE9PS1VQX1NURVBTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19GX1NFQVJDSEVTXSAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NXQVBfQkxPQ0tTX0ZSRUVfTE9PS1VQUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfRl9TRUFSQ0hfTEVOXSAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9TV0FQX0JMT0NLU19GUkVFX0xPT0tVUF9TVEVQUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfU1dfQ09NUEFDVF0gICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERDX1NXQVBfQ09NUEFDVF9NT0RFKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9TV19SRUNZQ0xFX0ZSRUVdICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU1dBUF9SRUNZQ0xFX1BIQVNFKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIERJRF9NRU1PUlk6CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGFsbG9jYXRlKERJRF9NRU1PUllfTUFYKTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9OQU1FXSAgICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9NRU1PUllfQUxMT0NBVE9SX05BTUUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9TQlJLXSAgICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU1lTX0FMTE9DQVRFRF9CTE9DS1MpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9TQlJLX1NJWkVdICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NZU19BTExPQ0FURURfQkxPQ0tTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fTEFSR0VdICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0xBUkdFX0JMT0NLU19BTExPQ0FURUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9MQVJHRV9TSVpFXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX0xBUkdFX0JMT0NLU19BTExPQ0FURUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9MRlJFRV0gICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fTEFSR0VfQkxPQ0tTX0ZSRUUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9MRlJFRV9TSVpFXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX0xBUkdFX0JMT0NLU19GUkVFKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fTFdBU1RFRF0gICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0xBUkdFX0JMT0NLU19XQVNURSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0xXQVNURURfU0laRV0gICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfTEFSR0VfQkxPQ0tTX1dBU1RFKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fQ0hVTktdICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NNQUxMX0JMT0NLX0NIVU5LUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0NIVU5LX1NJWkVdICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU01BTExfQkxPQ0tfQ0hVTktTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fU01BTExdICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NNQUxMX0JMT0NLU19BTExPQ0FURUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9TTUFMTF9TSVpFXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NNQUxMX0JMT0NLU19BTExPQ0FURUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9TRlJFRV0gICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fU01BTExfQkxPQ0tTX0ZSRUUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9TRlJFRV9TSVpFXSAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NNQUxMX0JMT0NLU19GUkVFKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fU1dBU1RFRF0gICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1NNQUxMX0JMT0NLU19XQVNURSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX1NXQVNURURfU0laRV0gICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfU01BTExfQkxPQ0tTX1dBU1RFKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fTUlOQ19DQUxMU10gICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0lOQ1JFTUVOVF9TSVpFX0NBTExTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fTUlOQ19TVUNDRVNTXSAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0lOQ1JFTUVOVF9TSVpFX0NBTExfU1VDQ0VTU0VTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fTUlOQ19TSVpFXSAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9JTkNSRU1FTlRfU0laRV9DQUxMX0RJRkZTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fUEVSTV0gICAgICAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX1VOTUFOQUdFRF9CTE9DS1MpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9QRVJNX1NJWkVdICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1VOTUFOQUdFRF9CTE9DS1MpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9DTElCXSAgICAgICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fUkVQTEFDRU1FTlRfTUFMTE9DX0NBTExTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fQ0xJQl9TSVpFXSAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9SRVBMQUNFTUVOVF9NQUxMT0NfQ0FMTFMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9PVkVSSEVBRF0gICAgICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX1NNQUxMX0JMT0NLX09WRVJIRUFEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fQUxMT0NBVEVEXSAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfU0laRV9NRU1PUllfVVNFRCkgKyBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX01FTU9SWV9PVkVSSEVBRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX1VTRURdICAgICAgICAgICAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX1NJWkVfTUVNT1JZX1VTRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9UT1RBTF9VTlVTRURdICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9TSVpFX01FTU9SWV9VTlVTRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9ERUZSQUdfQ0FMTFNdICAgICAgICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fTUVNT1JZX0RFRlJBR01FTlRBVElPTl9DQUxMU19GVUxMKSArIGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9NRU1PUllfREVGUkFHTUVOVEFUSU9OX0NBTExTX1RBUkdFVEVEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fREVGUkFHX0NBTExTX1JFUV0gICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX01FTU9SWV9ERUZSQUdNRU5UQVRJT05fQ0FMTFNfVEFSR0VURUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9ERUZSQUdfUkVRX1NVQ0NFU1NdICAgPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fTUVNT1JZX0RFRlJBR01FTlRBVElPTl9DQUxMX1RBUkdFVF9ISVRTKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fREVGUkFHX0JMT0NLU19JTlNQRUNURURdID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX01FTU9SWV9ERUZSQUdNRU5UQVRJT05fQkxPQ0tTX0lOU1BFQ1RFRCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0RFRlJBR19CTE9DS1NfTUVSR0VEXSA9IGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9NRU1PUllfREVGUkFHTUVOVEFUSU9OX0JMT0NLU19NRVJHRUQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRbRElEX01FTV9ERUZSQUdfQkxPQ0tTX1JFU1VMVF0gPSBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fTUVNT1JZX0RFRlJBR01FTlRBVElPTl9CTE9DS1NfUkVTVUxUSU5HKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0RJRF9NRU1fQVZMX05PREVTXSAgICAgICAgICAgID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0ZSRUVfQkxPQ0tTX0FWTF9OT0RFUyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtESURfTUVNX0VYVF9TVEFUSVNUSUNTXSAgICAgICA9IGVmdW46OmRyaXZlcl9pbmZvKERJX01FTU9SWV9FWFRFTkRFRF9TVEFUSVNUSUNTKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzaXplb2YoYXJncykgPT0gMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgaWR4ID0gYXJnc1swXTsKKyAgICAgICAgICAgICAgICBpZiAoaWR4IDwgMCB8fCBpZHggPj0gc2l6ZW9mKHJlc3VsdCkpCisgICAgICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoIklsbGVnYWwgaW5kZXggZm9yIGRlYnVnX2luZm8oKTogJWQsIGV4cGVjdGVkIDAuLiVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgaWR4LCBzaXplb2YocmVzdWx0KS0xKSk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0W2lkeF07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgRElORk9fVFJBQ0U6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludCB3aGljaCA9IERJVF9DVVJSRU5UOworCisgICAgICAgICAgICBpZiAoc2l6ZW9mKGFyZ3MpID4gMSkKKyAgICAgICAgICAgICAgICByYWlzZV9lcnJvcigiYmFkIG51bWJlciBvZiBhcmd1bWVudHMgdG8gZGVidWdfaW5mb1xuIik7CisgICAgICAgICAgICBpZiAoc2l6ZW9mKGFyZ3MpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghaW50cChhcmdzWzBdKSkKKyAgICAgICAgICAgICAgICAgICAgcmFpc2VfZXJyb3IoImJhZyBhcmcgMiB0byBkZWJ1Z19pbmZvKCkuXG4iKTsKKyAgICAgICAgICAgICAgICB3aGljaCA9IGFyZ3NbMF07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAod2hpY2gpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBESVRfQ1VSUkVOVDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVmdW46OmRyaXZlcl9pbmZvKERJX1RSQUNFX0NVUlJFTlQpOworCisgICAgICAgICAgICAgICAgY2FzZSBESVRfRVJST1I6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlZnVuOjpkcml2ZXJfaW5mbyhESV9UUkFDRV9MQVNUX0VSUk9SKSB8fCAoeyAiTm8gdHJhY2UuIiB9KTsKKworICAgICAgICAgICAgICAgIGNhc2UgRElUX1VOQ0FVR0hUX0VSUk9SOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWZ1bjo6ZHJpdmVyX2luZm8oRElfVFJBQ0VfTEFTVF9VTkNBVUdIVF9FUlJPUikgfHwgKHsgIk5vIHRyYWNlLiIgfSk7CisKKyAgICAgICAgICAgICAgICBjYXNlIERJVF9TVFJfQ1VSUkVOVDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVmdW46OmRyaXZlcl9pbmZvKERJX1RSQUNFX0NVUlJFTlRfQVNfU1RSSU5HKTsKKworICAgICAgICAgICAgICAgIGNhc2UgRElUX0NVUlJFTlRfREVQVEg6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlZnVuOjpkcml2ZXJfaW5mbyhESV9UUkFDRV9DVVJSRU5UX0RFUFRIKTsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlX2Vycm9yKCJiYWQgYXJnIDIgdG8gZGVidWdfaW5mbygpLlxuIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgRElORk9fRVZBTF9OVU1CRVI6CisgICAgICAgICAgICByZXR1cm4gZWZ1bjo6ZHJpdmVyX2luZm8oRElfRVZBTF9OVU1CRVIpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9lbmFibGVfY29tbWFuZHMuYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL2VuYWJsZV9jb21tYW5kcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkMWM5NjMKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9lbmFibGVfY29tbWFuZHMuYwpAQCAtMCwwICsxLDMwIEBACisvKiBUaGVzZSBzZWZ1bnMgYXJlIHRvIHByb3ZpZGUgYSByZXBsYWNlbWVudCBmb3IgdGhlIGVmdW5zIGVuYWJsZV9jb21tYW5kcygpCisgKiBhbmQgZGlzYWJsZV9jb21tYW5kcygpLgorICogRmVlbCBmcmVlIHRvIGFkZCBpdCB0byB5b3VyIG11ZGxpYnMsIGlmIHlvdSBoYXZlIG11Y2ggY29kZSByZWx5aW5nIG9uIHRoYXQuCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZ3VyYXRpb24uaD4KKworI2lmICEgX19FRlVOX0RFRklORURfXyhlbmFibGVfY29tbWFuZHMpCisKK3ZvaWQgZW5hYmxlX2NvbW1hbmRzKCkKK3sKKyAgICBvYmplY3Qgb2IgPSBlZnVuOjpwcmV2aW91c19vYmplY3QoKTsKKworICAgIGVmdW46OmNvbmZpZ3VyZV9vYmplY3Qob2IsIE9DX0NPTU1BTkRTX0VOQUJMRUQsIDEpOworICAgIGVmdW46OnNldF90aGlzX3BsYXllcihvYik7Cit9CisKKyNlbmRpZgorCisjaWYgISBfX0VGVU5fREVGSU5FRF9fKGRpc2FibGVfY29tbWFuZHMpCisKK3ZvaWQgZGlzYWJsZV9jb21tYW5kcygpCit7CisgICAgb2JqZWN0IG9iID0gZWZ1bjo6cHJldmlvdXNfb2JqZWN0KCk7CisKKyAgICBlZnVuOjpjb25maWd1cmVfb2JqZWN0KG9iLCBPQ19DT01NQU5EU19FTkFCTEVELCAwKTsKKyAgICBlZnVuOjpzZXRfdGhpc19wbGF5ZXIoMCk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvaGFzaC5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvaGFzaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxYmJmNjAKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9oYXNoLmMKQEAgLTAsMCArMSwxNyBAQAorI2luY2x1ZGUgIi9zeXMvdGxzLmgiCisKK2RlcHJlY2F0ZWQgc3RyaW5nIG1kNShtaXhlZCBhcmcsIHZhcmFyZ3MgbWl4ZWQqIGl0ZXJhdGlvbnMpCit7CisgICAgaWYgKGV4dGVybl9jYWxsKCkpCisgICAgICAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOworCisgICAgcmV0dXJuIGhhc2goVExTX0hBU0hfTUQ1LCBhcmcsIGl0ZXJhdGlvbnMuLi4pOworfQorCitkZXByZWNhdGVkIHN0cmluZyBzaGExKG1peGVkIGFyZywgdmFyYXJncyBtaXhlZCogaXRlcmF0aW9ucykKK3sKKyAgICBpZiAoZXh0ZXJuX2NhbGwoKSkKKyAgICAgICAgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CisKKyAgICByZXR1cm4gaGFzaChUTFNfSEFTSF9TSEExLCBhcmcsIGl0ZXJhdGlvbnMuLi4pOworfQpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvbGl2aW5ncy5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvbGl2aW5ncy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2MGZjZWUKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9saXZpbmdzLmMKQEAgLTAsMCArMSwzNDggQEAKKy8vICogbGl2aW5nX25hbWUtQmVoYW5kbHVuZworCisjZGVmaW5lIGNsZWFuX2xvZyhzKQorLy8jZGVmaW5lIGNsZWFuX2xvZyhzKSBsb2dfZmlsZSgiQ0xFQU5fU0lNIixjdGltZSh0aW1lKCkpWzQuLjE4XSsiOiAiKyhzKSk7CisKK3ByaXZhdGUgbm9zYXZlIG1hcHBpbmcgbGl2aW5nX25hbWVfbSwgbmFtZV9saXZpbmdfbSwgbmV0ZGVhZDsKKworcHJpdmF0ZSB2b2lkIEluaXRMaXZpbmdEYXRhKG1peGVkIHdpemluZm8pIHsKKyAgLy8gbGl2aW5nX25hbWUgaXN0IGVpbiBQb2ludGVyIGRlciBhdWNoIGluIGRlciBleHRyYV93aXppbmZvIGdlaGFsdGVuIAorICAvLyB3aXJkLCBzbyBrYW5uIGRpZSBzaW11bF9lZnVuIG5ldSBnZWxhZGVuIHdlcmRlbiwgb2huZSBkYXNzIGRpZXNlcworICAvLyBNYXBwaW5nIHZlcmxvcmVuIGdlaHQKKyAgaWYgKCFtYXBwaW5ncChsaXZpbmdfbmFtZV9tID0gd2l6aW5mb1tMSVZJTkdfTkFNRV0pKQorICAgIGxpdmluZ19uYW1lX20gPSB3aXppbmZvW0xJVklOR19OQU1FXSA9IG1fYWxsb2NhdGUoMCwgMSk7CisKKyAgLy8gR2xlaWNoZXMgZ2lsdCBmdWVyIGRhcyBNYXBwaW5nIE5hbWUtTGl2aW5nCisgIGlmICghbWFwcGluZ3AobmFtZV9saXZpbmdfbSA9IHdpemluZm9bTkFNRV9MSVZJTkddKSkKKyAgICBuYW1lX2xpdmluZ19tID0gd2l6aW5mb1tOQU1FX0xJVklOR10gPSBtX2FsbG9jYXRlKDAsIDEpOworCisgIC8vIE5ldHp0b3RlIHNpbmQgZWJlbmZhbGxzIGluIGRlciBleHRyYV93aXppbmZvCisgIGlmICghbWFwcGluZ3AobmV0ZGVhZCA9IHdpemluZm9bTkVUREVBRF9NQVBdKSkKKyAgICBuZXRkZWFkID0gd2l6aW5mb1tORVRERUFEX01BUF0gPSAoW10pOworfQorCitwdWJsaWMgdmFyYXJncyBzdHJpbmcgZ2V0dXVpZCggb2JqZWN0IG9iICkKK3sKKyAgICBtaXhlZCAqcmV0OworCisgICAgaWYgKCAhb2JqZWN0cChvYikgKQorICAgICAgIG9iID0gcHJldmlvdXNfb2JqZWN0KCk7CisKKyAgICBpZiAoICFxdWVyeV9vbmNlX2ludGVyYWN0aXZlKG9iKSApCisgICAgICAgcmV0dXJuIGdldHVpZChvYik7CisKKyAgICByZXQgPSAobWl4ZWQpbWFzdGVyKCktPmdldF91c2VyaW5mbyggZ2V0dWlkKG9iKSApOworCisgICAgaWYgKCAhcG9pbnRlcnAocmV0KSB8fCBzaXplb2YocmV0KSA8IDUgKQorICAgICAgIHJldHVybiBnZXR1aWQob2IpOworCisgICAgLy8gVXNlcm5hbWUgKyAiXyIgKyBDcmVhdGlvbkRhdGUKKyAgICByZXR1cm4gcmV0WzBdICsgIl8iICsgcmV0WzVdOworfQorCit2b2lkIHNldF9vYmplY3RfbGl2aW5nX25hbWUoc3RyaW5nIGxpdm5hbWUsIG9iamVjdCBvYmopCit7CisgIHN0cmluZyBvbGQ7CisgIG1peGVkIGE7CisgIGludCBpOworCisgIGlmIChwcmV2aW91c19vYmplY3QoKT09b2JqIHx8IHByZXZpb3VzX29iamVjdCgpPT10aGlzX29iamVjdCgpIHx8CisgICAgICBwcmV2aW91c19vYmplY3QoKT09bWFzdGVyKCkpCisgIHsKKyAgICBpZighbGl2bmFtZSB8fCAhc3RyaW5ncChsaXZuYW1lKSkgeworICAgICAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKKyAgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoIiVPOiBpbGxlZ2FsIGxpdmluZyBuYW1lOiAlT1xuIiwgb2JqLCBsaXZuYW1lKSk7CisgICAgfQorICAgIGlmIChvbGQgPSBsaXZpbmdfbmFtZV9tW29ial0pIHsKKyAgICAgIGlmIChwb2ludGVycChhID0gbmFtZV9saXZpbmdfbVtvbGRdKSkgeworICAgICAgIGFbbWVtYmVyKGEsIG9iaildID0gMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgbV9kZWxldGUobmFtZV9saXZpbmdfbSwgb2xkKTsKKyAgICAgIH0KKyAgICB9CisgICAgbGl2aW5nX25hbWVfbVtvYmpdID0gbGl2bmFtZTsKKyAgICBpZiAoYSA9IG5hbWVfbGl2aW5nX21bbGl2bmFtZV0pIHsKKyAgICAgIGlmICghcG9pbnRlcnAoYSkpIHsKKyAgICAgICBuYW1lX2xpdmluZ19tW2xpdm5hbWVdID0gKHthLCBvYmp9KTsKKyAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICAvKiBUcnkgdG8gcmVhbGxvY2F0ZSBlbnRyeSBmcm9tIGRlc3RydWN0ZWQgb2JqZWN0ICovCisgICAgICBpZiAoKGkgPSBtZW1iZXIoYSwgMCkpID49IDApIHsKKyAgICAgICBhW2ldID0gb2JqOworICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIG5hbWVfbGl2aW5nX21bbGl2bmFtZV0gPSBhICsgKHtvYmp9KTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgbmFtZV9saXZpbmdfbVtsaXZuYW1lXSA9IG9iajsKKyAgfQorfQorCit2b2lkIHNldF9saXZpbmdfbmFtZShzdHJpbmcgbGl2bmFtZSkKK3sKKyAgc2V0X29iamVjdF9saXZpbmdfbmFtZShsaXZuYW1lLHByZXZpb3VzX29iamVjdCgpKTsKK30KKwordm9pZCByZW1vdmVfbGl2aW5nX25hbWUoKQoreworICBzdHJpbmcgbGl2bmFtZTsKKworICBpZiAoIXByZXZpb3VzX29iamVjdCgpKQorICAgIHJldHVybjsKKyAgaWYgKGxpdm5hbWU9bGl2aW5nX25hbWVfbVtwcmV2aW91c19vYmplY3QoKV0pCisgIHsKKyAgICBtX2RlbGV0ZShsaXZpbmdfbmFtZV9tLHByZXZpb3VzX29iamVjdCgpKTsKKyAgICBpZiAob2JqZWN0cChuYW1lX2xpdmluZ19tW2xpdm5hbWVdKSkKKyAgICB7CisgICAgICBpZiAobmFtZV9saXZpbmdfbVtsaXZuYW1lXT09cHJldmlvdXNfb2JqZWN0KCkpCisgICAgICAgbV9kZWxldGUobmFtZV9saXZpbmdfbSxsaXZuYW1lKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKHBvaW50ZXJwKG5hbWVfbGl2aW5nX21bbGl2bmFtZV0pKQorICAgIHsKKyAgICAgIG5hbWVfbGl2aW5nX21bbGl2bmFtZV0tPSh7cHJldmlvdXNfb2JqZWN0KCl9KTsKKyAgICAgIGlmICghc2l6ZW9mKG5hbWVfbGl2aW5nX21bbGl2bmFtZV0pKQorICAgICAgIG1fZGVsZXRlKG5hbWVfbGl2aW5nX20sbGl2bmFtZSk7CisgICAgfQorICB9Cit9CisKK3ZvaWQgX3NldF9uZXRkZWFkKCkKK3sKKyAgaWYgKHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUocHJldmlvdXNfb2JqZWN0KCkpKQorICAgIG5ldGRlYWRbZ2V0dWlkKHByZXZpb3VzX29iamVjdCgpKV09cHJldmlvdXNfb2JqZWN0KCk7Cit9CisKK3ZvaWQgX3JlbW92ZV9uZXRkZWFkKCkKK3sKKyAgbV9kZWxldGUobmV0ZGVhZCxnZXR1aWQocHJldmlvdXNfb2JqZWN0KCkpKTsKK30KKworb2JqZWN0IGZpbmRfbmV0ZGVhZChzdHJpbmcgdXVpZCkKK3sKKyAgaW50IGk7CisgIHN0cmluZyB1aWQ7CisgIC8vIFdlbm4gc3NjYW5mKCkgMiBsaWVmZXJ0LCBpc3QgdXVpZCBhdWNoIG5lIHV1aWQuCisgIGludCBpc191dWlkID0gc3NjYW5mKHV1aWQsICIlc18lZCIsIHVpZCwgaSkgPT0gMjsKKyAgaWYgKCFpc191dWlkKQorICAgIHVpZCA9IHV1aWQ7CisgCisgIGlmIChpc191dWlkICYmIGdldHV1aWQobmV0ZGVhZFt1aWRdKSAhPSB1dWlkKQorICAgICAgcmV0dXJuIDA7CisKKyAgcmV0dXJuIG5ldGRlYWRbdWlkXTsKK30KKworc3RyaW5nICpkdW1wX25ldGRlYWQoKQoreworICByZXR1cm4gbV9pbmRpY2VzKG5ldGRlYWQpOworfQorCitvYmplY3QgZmluZF9saXZpbmcoc3RyaW5nIGxpdm5hbWUpIHsKKyAgbWl4ZWQgKmEsIHI7CisgIGludCBpOworCisgIGlmIChwb2ludGVycChyID0gbmFtZV9saXZpbmdfbVtsaXZuYW1lXSkpIHsKKyAgICBpZiAobWVtYmVyKHIsMCk+PTApCisgICAgICByLT0oezB9KTsKKyAgICBpZiAoIXNpemVvZihyKSl7CisgICAgICBtX2RlbGV0ZShuYW1lX2xpdmluZ19tLGxpdm5hbWUpOworICAgICAgY2xlYW5fbG9nKHNwcmludGYoImZpbmRfbGl2aW5nIGxvZXNjaHQgJXNcbiIsbGl2bmFtZSkpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmICggIWxpdmluZyhyID0gKGEgPSByKVswXSkpIHsKKyAgICAgIGZvciAoaSA9IHNpemVvZihhKTsgLS1pOykgeworICAgICAgIGlmIChsaXZpbmcoYVs8aV0pKSB7CisgICAgICAgICByID0gYVs8aV07CisgICAgICAgICBhWzxpXSA9IGFbMF07CisgICAgICAgICByZXR1cm4gYVswXSA9IHI7CisgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcjsKKyAgfQorICByZXR1cm4gbGl2aW5nKHIpICYmIHI7Cit9CisKK29iamVjdCAqZmluZF9saXZpbmdzKHN0cmluZyBsaXZuYW1lKQoreworICBtaXhlZCByOworCisgIGlmIChwb2ludGVycChyPW5hbWVfbGl2aW5nX21bbGl2bmFtZV0pKQorICAgIHItPSh7MH0pOworICBlbHNlCisgICAgaWYgKG9iamVjdHAocikpCisgICAgICByPSh7cn0pOworICBpZiAoIXBvaW50ZXJwKHIpfHwhc2l6ZW9mKHIpKQorICAgIHJldHVybiAwOworICByZXR1cm4gcjsKK30KKworb2JqZWN0IGZpbmRfcGxheWVyKHN0cmluZyB1dWlkKSB7CisgIG9iamVjdCAqb2JqczsKKyAgbWl4ZWQgcmVzOworICBpbnQgaTsKKyAgc3RyaW5nIHVpZDsKKworICBpZiAoIXN0cmluZ3AodXVpZCkpCisgICAgcmV0dXJuIDA7CisgIC8vIFdlbm4gc3NjYW5mKCkgMiBsaWVmZXJ0LCBpc3QgdXVpZCBhdWNoIG5lIHV1aWQuCisgIGludCBpc191dWlkID0gc3NjYW5mKHV1aWQsICIlc18lZCIsIHVpZCwgaSkgPT0gMjsKKyAgaWYgKCFpc191dWlkKQorICAgIHVpZCA9IHV1aWQ7CisKKyAgaWYgKHBvaW50ZXJwKHJlcyA9IG5hbWVfbGl2aW5nX21bdWlkXSkpIHsKKyAgICAvLyB6ZXJzdG9lcnRlIE9iamVrdGUgZ2dmLiBlbnRmZXJuZW4KKyAgICBpZiAobWVtYmVyKHJlcywwKT49MCkgeworICAgICAgcmVzLT0oezB9KTsKKyAgICAgIG5hbWVfbGl2aW5nX21bdWlkXSA9IHJlczsKKyAgICB9CisgICAgLy8gZ2dmLiBOYW1lbiBvaG5lIE9iamVrdGUgZW50ZmVybmVuLgorICAgIGlmICghc2l6ZW9mKHJlcykpeworICAgICAgbV9kZWxldGUobmFtZV9saXZpbmdfbSx1aWQpOworICAgICAgY2xlYW5fbG9nKHNwcmludGYoImZpbmRfcGxheWVyIGxvZXNjaHQgJXNcbiIsdWlkKSk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgb2JqcyA9IHJlczsKKyAgICByZXMgPSBvYmpzWzBdOworICAgIC8vIFdlbm4gZGFzIDAuIEVsZW1lbnQgZGVyIFNwaWVsZXIgaXN0LCBzaW5kIHdpciBmZXJ0aWcuIEFuc29uc3RlbiBzdWNoZW4KKyAgICAvLyB3aXIgZGVuIFNwaWVsZXIgdW5kIHNjaGllYmVuIGlobiBhbiBkaWUgMC4gU3RlbGxlIGltIEFycmF5LgorICAgIGlmICggIXF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUocmVzKSkgeworICAgICAgZm9yIChpID0gc2l6ZW9mKG9ianMpOyAtLWk7KSB7CisgICAgICAgaWYgKG9ianNbPGldICYmIHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUob2Jqc1s8aV0pKSB7CisgICAgICAgICByZXMgPSBvYmpzWzxpXTsKKyAgICAgICAgIG9ianNbPGldID0gb2Jqc1swXTsKKyAgICAgICAgIG9ianNbMF0gPSByZXM7CisgICAgICAgICBicmVhazsKKyAgICAgICB9CisgICAgICB9CisgICAgICByZXMgPSAob2JqZWN0cChyZXMpICYmIHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUocmVzKSkgPyByZXMgOiAwOworICAgIH0KKyAgICAvLyBlbHNlOiBpbiByZXMgc3RlaHQgZGVyIFNwaWVsZXIgc2Nob24uCisgIH0KKyAgZWxzZSBpZiAob2JqZWN0cChyZXMpKSAvLyByIGlzdCBuZW4gRWluemVsb2JqZWt0CisgICAgcmVzID0gcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShyZXMpID8gcmVzIDogMDsKKworICAvLyByZXMgaXN0IGpldHp0IGdnZi4gZGVyIFNwaWVsZXIuIEFiZXIgd2VubiBkZXIgbmUgYW5kZXJlIGFscyBkaWUgZ2VzdWNodGUKKyAgLy8gVVVJRCBoYXQsIGlzdCBkYXMgRXJnZWJuaXMgdHJvdHpkZW0gMC4KKyAgaWYgKGlzX3V1aWQgJiYgZ2V0dXVpZChyZXMpIT11dWlkKQorICAgICAgcmV0dXJuIDA7CisKKyAgLy8gZW5kbGljaCBnZWZ1bmRlbgorICByZXR1cm4gcmVzOworfQorCitwcml2YXRlIGludCBjaGVja19tYXRjaCggc3RyaW5nIHN0ciwgaW50IHBsYXllcnNfb25seSApCit7CisgICAgbWl4ZWQgbWF0Y2g7CisKKyAgICBpZiAoICEobWF0Y2ggPSBuYW1lX2xpdmluZ19tW3N0cl0pICkKKyAgICAgICByZXR1cm4gMDsKKworICAgIGlmICggIXBvaW50ZXJwKG1hdGNoKSApCisgICAgICAgbWF0Y2ggPSAoeyBtYXRjaCB9KTsKKworICAgIG1hdGNoIC09ICh7MH0pOworCisgICAgaWYgKCBzaXplb2YobWF0Y2gpICl7CisgICAgICAgaWYgKCBwbGF5ZXJzX29ubHkgKQorICAgICAgICAgICByZXR1cm4gc2l6ZW9mKGZpbHRlciggbWF0Y2gsICMncXVlcnlfb25jZV9pbnRlcmFjdGl2ZS8qJyovICkpCisgICAgICAgICAgICAgID4gMDsKKyAgICAgICBlbHNlCisgICAgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIG1fZGVsZXRlKCBuYW1lX2xpdmluZ19tLCBzdHIgKTsKKyAgICBjbGVhbl9sb2coIHNwcmludGYoImNoZWNrX21hdGNoIGxvZXNjaHQgJXNcbiIsIHN0cikgKTsKKyAgICByZXR1cm4gMDsKK30KKworLy9UT0RPOjogc3RyaW5nfHN0cmluZyogZXhjbHVkZQordmFyYXJncyBtaXhlZCBtYXRjaF9saXZpbmcoIHN0cmluZyBzdHIsIGludCBwbGF5ZXJzX29ubHksIG1peGVkIGV4Y2x1ZGUgKQoreworICAgIGludCBpLCBzOworICAgIG1peGVkIG1hdGNoLCAqdXNlcjsKKworICAgIGlmICggIXN0ciB8fCBzdHIgPT0gIiIgKQorICAgICAgIHJldHVybiAwOworCisgICAgaWYgKCAhcG9pbnRlcnAoZXhjbHVkZSkgKQorICAgICAgIGV4Y2x1ZGUgPSAoeyBleGNsdWRlIH0pOworCisgICAgaWYgKCBtZW1iZXIoZXhjbHVkZSwgc3RyKSA8IDAgJiYgY2hlY2tfbWF0Y2goc3RyLCBwbGF5ZXJzX29ubHkpICkKKyAgICAgICByZXR1cm4gc3RyOworCisgICAgdXNlciA9IG1faW5kaWNlcyhuYW1lX2xpdmluZ19tKTsKKyAgICBzID0gc2l6ZW9mKHN0cik7CisgICAgbWF0Y2ggPSAwOworCisgICAgZm9yICggaSA9IHNpemVvZih1c2VyKTsgaS0tOyApCisgICAgICAgaWYgKCBzdHIgPT0gdXNlcltpXVswLi5zLTFdICYmIG1lbWJlciggZXhjbHVkZSwgdXNlcltpXSApIDwgMCApCisgICAgICAgICAgIGlmICggbWF0Y2ggKQorICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgaWYgKCBjaGVja19tYXRjaCh1c2VyW2ldLCBwbGF5ZXJzX29ubHkpICkKKyAgICAgICAgICAgICAgICAgIG1hdGNoID0gdXNlcltpXTsKKworICAgIGlmICggIW1hdGNoICkKKyAgICAgICByZXR1cm4gLTI7CisKKyAgICByZXR1cm4gbWF0Y2g7Cit9CisKK21peGVkICpkdW1wX2xpdmluZ3MoKQoreworICByZXR1cm4gc29ydF9hcnJheShtX2luZGljZXMobmFtZV9saXZpbmdfbSksIyc+KTsKK30KKworLy8gKiByZWdlbG1hZXNzaWcgTGlzdGVuIHZvbiBCYWxsYXN0IGJlZnJlaWVuCitwcml2YXRlIHZvaWQgY2xlYW5fbmFtZV9saXZpbmdfbShzdHJpbmcgKmtleXMsIGludCBsZWZ0LCBpbnQgbnVtKQoreworICBpbnQgaSwgajsKKyAgbWl4ZWQgYTsKKworICB3aGlsZSAobGVmdCAmJiBudW0tLSkKKyAgeworICAgIGlmIChwb2ludGVycChhID0gbmFtZV9saXZpbmdfbVtrZXlzWy0tbGVmdF1dKSAmJiBtZW1iZXIoYSwgMCk+PTApCisgICAgeworICAgICAgYS09KHswfSk7CisgICAgICBuYW1lX2xpdmluZ19tW2tleXNbbGVmdF1dID0gYTsKKyAgICB9CisgICAgaWYgKCFhIHx8IChwb2ludGVycChhKSAmJiAhc2l6ZW9mKGEpKSkKKyAgICB7CisgICAgICBjbGVhbl9sb2coIlRvYXN0aW5nICIra2V5c1tsZWZ0XSsiXG4iKTsKKyAgICAgIG1fZGVsZXRlKG5hbWVfbGl2aW5nX20sIGtleXNbbGVmdF0pOworICAgIH0gZWxzZSBjbGVhbl9sb2coc3ByaW50ZigiS0VFUElORyAlcyAoJU8pXG4iLGtleXNbbGVmdF0scG9pbnRlcnAoYSk/c2l6ZW9mKGEpOmEpKTsKKyAgfQorICBpZiAobGVmdCkKKyAgICBlZnVuOjpjYWxsX291dCgjJ2NsZWFuX25hbWVfbGl2aW5nX20sIDEsIGtleXMsIGxlZnQsIDgwKTsKKyAgZWxzZQorICAgIGNsZWFuX2xvZygiQ2xlYW4gcHJvY2VzcyBmaW5pc2hlZFxuIik7Cit9CisKK3ByaXZhdGUgdm9pZCBjbGVhbl9uZXRkZWFkKCkgeworICBpbnQgaTsKKyAgc3RyaW5nICpzOworICBvYmplY3Qgb2I7CisKKyAgcz1tX2luZGljZXMobmV0ZGVhZCk7CisgIGZvciAoaT1zaXplb2YocyktMTtpPj0wO2ktLSkKKyAgICBpZiAoIW9iamVjdHAob2I9bmV0ZGVhZFtzW2ldXSkgfHwgaW50ZXJhY3RpdmUob2IpKQorICAgICAgbV9kZWxldGUobmV0ZGVhZCxzW2ldKTsKK30KKworcHJpdmF0ZSB2b2lkIENsZWFuTGl2aW5nRGF0YSgpIHsKKyAgaWYgKGZpbmRfY2FsbF9vdXQoIydjbGVhbl9uYW1lX2xpdmluZ19tKSA8IDApIHsKKyAgICBjbGVhbl9sb2coIlN0YXJ0aW5nIGNsZWFuIHByb2Nlc3NcbiIpOworICAgIGVmdW46OmNhbGxfb3V0KCMnY2xlYW5fbmFtZV9saXZpbmdfbSwKKyAgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgbV9pbmRpY2VzKG5hbWVfbGl2aW5nX20pLAorICAgICAgICAgICAgICAgICBzaXplb2YobmFtZV9saXZpbmdfbSksCisgICAgICAgICAgICAgICAgIDgwCisgICAgICAgICAgICAgICAgICk7CisgIH0KKyAgZWZ1bjo6Y2FsbF9vdXQoIydjbGVhbl9uZXRkZWFkLDIpOworfQorCisjdW5kZWYgY2xlYW5fbG9nCisKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL29iamVjdF9pbmZvLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9vYmplY3RfaW5mby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkN2MwMDkKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9vYmplY3RfaW5mby5jCkBAIC0wLDAgKzEsMTA2IEBACisvKiBUaGlzIHNlZnVuIGlzIHRvIHByb3ZpZGUgdGhlIG9sZCBzZW1hbnRpY3Mgb2YgdGhlIGVmdW4gb2JqZWN0X2luZm8oKS4KKyAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgorICovCisKKyNpZiBfX0VGVU5fREVGSU5FRF9fKGRyaXZlcl9pbmZvKSAvKiBOZXdlciB2ZXJzaW9uIGlzIHRoZXJlICovCisKKyNpbmNsdWRlIDxvYmplY3RpbmZvLmg+CisjaW5jbHVkZSA8b2JqZWN0X2luZm8uaD4KKworbWl4ZWQgb2JqZWN0X2luZm8ob2JqZWN0IG9iLCBpbnQgd2hhdCwgdmFyYXJncyBpbnQqIGluZGV4KQoreworICAgIG1peGVkICogcmVzdWx0OworCisgICAgaWYgKHNpemVvZihpbmRleCkgPiAxKQorICAgICAgICByYWlzZV9lcnJvcigiVG9vIG1hbnkgYXJndW1lbnRzIHRvIG9iamVjdF9pbmZvXG4iKTsKKworICAgIHN3aXRjaCh3aGF0KQorICAgIHsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoIklsbGVnYWwgdmFsdWUgJWQgZm9yIG9iamVjdF9pbmZvKCkuXG4iLCB3aGF0KSk7CisKKyAgICAgICAgY2FzZSBPSU5GT19CQVNJQzoKKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ID0gYWxsb2NhdGUoT0lCX01BWCk7CisKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfSEVBUlRfQkVBVF0gICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9DX0hFQVJUX0JFQVQpOworICAgICAgICAgICAgcmVzdWx0W09JQl9JU19XSVpBUkRdICAgICAgICAgPSAwOyAgIC8qIE5vdCBzdXBwb3J0ZWQgYW55bW9yZS4gKi8KKyAgICAgICAgICAgIHJlc3VsdFtPSUJfRU5BQkxFX0NPTU1BTkRTXSAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9DX0NPTU1BTkRTX0VOQUJMRUQpOworICAgICAgICAgICAgcmVzdWx0W09JQl9DTE9ORV0gICAgICAgICAgICAgPSBlZnVuOjpjbG9uZXAob2IpOworICAgICAgICAgICAgcmVzdWx0W09JQl9ERVNUUlVDVEVEXSAgICAgICAgPSAwOyAgIC8qIE5vdCBwb3NzaWJsZSBhbnltb3JlLiAqLworICAgICAgICAgICAgcmVzdWx0W09JQl9TV0FQUEVEXSAgICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU1dBUFBFRCk7CisgICAgICAgICAgICByZXN1bHRbT0lCX09OQ0VfSU5URVJBQ1RJVkVdICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9PTkNFX0lOVEVSQUNUSVZFKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfUkVTRVRfU1RBVEVdICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1JFU0VUX1NUQVRFKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfV0lMTF9DTEVBTl9VUF0gICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1dJTExfQ0xFQU5fVVApOworICAgICAgICAgICAgcmVzdWx0W09JQl9MQU1CREFfUkVGRVJFTkNFRF0gPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTEFNQkRBX1JFRkVSRU5DRUQpOworICAgICAgICAgICAgcmVzdWx0W09JQl9TSEFET1ddICAgICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0hBRE9XX1BSRVYpICYmIDE7CisgICAgICAgICAgICByZXN1bHRbT0lCX1JFUExBQ0VEXSAgICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9SRVBMQUNFRCk7CisgICAgICAgICAgICByZXN1bHRbT0lCX05FWFRfUkVTRVRdICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9ORVhUX1JFU0VUX1RJTUUpOworICAgICAgICAgICAgcmVzdWx0W09JQl9USU1FX09GX1JFRl0gICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTEFTVF9SRUZfVElNRSk7CisgICAgICAgICAgICByZXN1bHRbT0lCX1JFRl0gICAgICAgICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9PQkpFQ1RfUkVGUyk7CisgICAgICAgICAgICByZXN1bHRbT0lCX0dJR0FUSUNLU10gICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9HSUdBVElDS1MpOworICAgICAgICAgICAgcmVzdWx0W09JQl9USUNLU10gICAgICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfVElDS1MpOworICAgICAgICAgICAgcmVzdWx0W09JQl9TV0FQX05VTV0gICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU1dBUF9OVU0pOworICAgICAgICAgICAgcmVzdWx0W09JQl9QUk9HX1NXQVBQRURdICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfUFJPR19TV0FQUEVEKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfVkFSX1NXQVBQRURdICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1ZBUl9TV0FQUEVEKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSUJfTkFNRV0gICAgICAgICAgICAgID0gZWZ1bjo6b2JqZWN0X25hbWUob2IpOworICAgICAgICAgICAgcmVzdWx0W09JQl9MT0FEX05BTUVdICAgICAgICAgPSBlZnVuOjpsb2FkX25hbWUob2IpOworICAgICAgICAgICAgcmVzdWx0W09JQl9ORVhUX0FMTF0gICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfT0JKRUNUX05FWFQpOworICAgICAgICAgICAgcmVzdWx0W09JQl9QUkVWX0FMTF0gICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfT0JKRUNUX1BSRVYpOworICAgICAgICAgICAgcmVzdWx0W09JQl9ORVhUX0NMRUFOVVBdICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTkVYVF9DTEVBTlVQX1RJTUUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIE9JTkZPX1BPU0lUSU9OOgorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgPSBhbGxvY2F0ZShPSVBfTUFYKTsKKworICAgICAgICAgICAgcmVzdWx0W09JUF9ORVhUXSA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9PQkpFQ1RfTkVYVCk7CisgICAgICAgICAgICByZXN1bHRbT0lQX1BSRVZdID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX09CSkVDVF9QUkVWKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSVBfUE9TXSAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfT0JKRUNUX1BPUyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgT0lORk9fTUVNT1JZOgorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgPSBhbGxvY2F0ZShPSU1fTUFYKTsKKworICAgICAgICAgICAgcmVzdWx0W09JTV9SRUZdICAgICAgICAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1BST0dfUkVGUyk7CisgICAgICAgICAgICByZXN1bHRbT0lNX05BTUVdICAgICAgICAgICAgICAgPSBlZnVuOjpwcm9ncmFtX25hbWUob2IpOworICAgICAgICAgICAgcmVzdWx0W09JTV9QUk9HX1NJWkVdICAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1BST0dfU0laRSk7CisgICAgICAgICAgICByZXN1bHRbT0lNX05VTV9GVU5DVElPTlNdICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTlVNX0ZVTkNUSU9OUyk7CisgICAgICAgICAgICByZXN1bHRbT0lNX1NJWkVfRlVOQ1RJT05TXSAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0laRV9GVU5DVElPTlMpOworICAgICAgICAgICAgcmVzdWx0W09JTV9OVU1fVkFSSUFCTEVTXSAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05VTV9WQVJJQUJMRVMpOworICAgICAgICAgICAgcmVzdWx0W09JTV9TSVpFX1ZBUklBQkxFU10gICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NJWkVfVkFSSUFCTEVTKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fTlVNX1NUUklOR1NdICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9OVU1fU1RSSU5HUyk7CisgICAgICAgICAgICByZXN1bHRbT0lNX1NJWkVfU1RSSU5HU10gICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0laRV9TVFJJTkdTKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fU0laRV9TVFJJTkdTX0RBVEFdICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9TSVpFX1NUUklOR1NfREFUQSk7CisgICAgICAgICAgICByZXN1bHRbT0lNX1NJWkVfU1RSSU5HU19UT1RBTF0gPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0laRV9TVFJJTkdTX0RBVEFfVE9UQUwpOworICAgICAgICAgICAgcmVzdWx0W09JTV9OVU1fSU5IRVJJVEVEXSAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05VTV9JTkhFUklURUQpOworICAgICAgICAgICAgcmVzdWx0W09JTV9TSVpFX0lOSEVSSVRFRF0gICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NJWkVfSU5IRVJJVEVEKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fVE9UQUxfU0laRV0gICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9QUk9HX1NJWkVfVE9UQUwpOworICAgICAgICAgICAgcmVzdWx0W09JTV9EQVRBX1NJWkVdICAgICAgICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX0RBVEFfU0laRSk7CisgICAgICAgICAgICByZXN1bHRbT0lNX1RPVEFMX0RBVEFfU0laRV0gICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfREFUQV9TSVpFX1RPVEFMKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fTk9fSU5IRVJJVF0gICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9OT19JTkhFUklUKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fTk9fQ0xPTkVdICAgICAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9OT19DTE9ORSk7CisgICAgICAgICAgICByZXN1bHRbT0lNX05PX1NIQURPV10gICAgICAgICAgPSBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfTk9fU0hBRE9XKTsKKyAgICAgICAgICAgIHJlc3VsdFtPSU1fTlVNX0lOQ0xVREVTXSAgICAgICA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9OVU1fSU5DTFVERUQpOworICAgICAgICAgICAgcmVzdWx0W09JTV9TSEFSRV9WQVJJQUJMRVNdICAgID0gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NIQVJFX1ZBUklBQkxFUyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChzaXplb2YoaW5kZXgpKQorICAgIHsKKyAgICAgICAgaW50IGlkeCA9IGluZGV4WzBdOworICAgICAgICBpZiAoaWR4IDwgMCB8fCBpZHggPj0gc2l6ZW9mKHJlc3VsdCkpCisgICAgICAgICAgICByYWlzZV9lcnJvcihzcHJpbnRmKCJJbGxlZ2FsIGluZGV4IGZvciBvYmplY3RfaW5mbygpOiAlZCwgZXhwZWN0ZWQgMC4uJWRcbiIsCisgICAgICAgICAgICAgICAgaWR4LCBzaXplb2YocmVzdWx0KS0xKSk7CisKKyAgICAgICAgcmV0dXJuIHJlc3VsdFtpZHhdOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiByZXN1bHQ7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvcXVlcnlfZWRpdGluZy5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvcXVlcnlfZWRpdGluZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxNDZkY2QKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9xdWVyeV9lZGl0aW5nLmMKQEAgLTAsMCArMSwxNyBAQAorLyogVGhpcyBzZWZ1biBpcyB0byBwcm92aWRlIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBlZnVuIHF1ZXJ5X2VkaXRpbmcoKS4KKyAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgorICovCisKKyNpZiAhIF9fRUZVTl9ERUZJTkVEX18ocXVlcnlfZWRpdGluZykKKworI2luY2x1ZGUgPGludGVyYWN0aXZlX2luZm8uaD4KKworaW50fG9iamVjdCBxdWVyeV9lZGl0aW5nKG9iamVjdCBvYikKK3sKKyAgICBpZighZWZ1bjo6aW50ZXJhY3RpdmUob2IpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKG9iLCBJSV9FRElUSU5HKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9xdWVyeV9pZGxlLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9xdWVyeV9pZGxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNhMzJhZQotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL3F1ZXJ5X2lkbGUuYwpAQCAtMCwwICsxLDE0IEBACisvKiBUaGlzIHNlZnVuIGlzIHRvIHByb3ZpZGUgYSByZXBsYWNlbWVudCBmb3IgdGhlIGVmdW4gcXVlcnlfaWRsZSgpLgorICogRmVlbCBmcmVlIHRvIGFkZCBpdCB0byB5b3VyIG11ZGxpYnMsIGlmIHlvdSBoYXZlIG11Y2ggY29kZSByZWx5aW5nIG9uIHRoYXQuCisgKi8KKworI2lmICEgX19FRlVOX0RFRklORURfXyhxdWVyeV9pZGxlKQorCisjaW5jbHVkZSA8aW50ZXJhY3RpdmVfaW5mby5oPgorCitpbnQgcXVlcnlfaWRsZShvYmplY3Qgb2IpCit7CisgICAgcmV0dXJuIGVmdW46OmludGVyYWN0aXZlX2luZm8ob2IsIElJX0lETEUpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL3F1ZXJ5X2lucHV0X3BlbmRpbmcuYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL3F1ZXJ5X2lucHV0X3BlbmRpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDhjMzExCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvcXVlcnlfaW5wdXRfcGVuZGluZy5jCkBAIC0wLDAgKzEsMTcgQEAKKy8qIFRoaXMgc2VmdW4gaXMgdG8gcHJvdmlkZSBhIHJlcGxhY2VtZW50IGZvciB0aGUgZWZ1biBxdWVyeV9pbnB1dF9wZW5kaW5nKCkuCisgKiBGZWVsIGZyZWUgdG8gYWRkIGl0IHRvIHlvdXIgbXVkbGlicywgaWYgeW91IGhhdmUgbXVjaCBjb2RlIHJlbHlpbmcgb24gdGhhdC4KKyAqLworCisjaWYgISBfX0VGVU5fREVGSU5FRF9fKHF1ZXJ5X2lucHV0X3BlbmRpbmcpCisKKyNpbmNsdWRlIDxpbnRlcmFjdGl2ZV9pbmZvLmg+CisKK29iamVjdCBxdWVyeV9pbnB1dF9wZW5kaW5nKG9iamVjdCBvYikKK3sKKyAgICBpZighZWZ1bjo6aW50ZXJhY3RpdmUob2IpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKG9iLCBJSV9JTlBVVF9QRU5ESU5HKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9xdWVyeV9pcF9uYW1lLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9xdWVyeV9pcF9uYW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU3NGVhMAotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL3F1ZXJ5X2lwX25hbWUuYwpAQCAtMCwwICsxLDQ4IEBACisvKiBUaGlzIHNlZnVuIGlzIHRvIHByb3ZpZGUgYSByZXBsYWNlbWVudCBmb3IgdGhlIGVmdW5zIHF1ZXJ5X2lwX25hbWUoKSBhbmQKKyAqIHF1ZXJ5X2lwX251bWJlcigpLgorICogRmVlbCBmcmVlIHRvIGFkZCBpdCB0byB5b3VyIG11ZGxpYnMsIGlmIHlvdSBoYXZlIG11Y2ggY29kZSByZWx5aW5nIG9uIHRoYXQuCisgKi8KKworI2lmICEgX19FRlVOX0RFRklORURfXyhxdWVyeV9pcF9uYW1lKQorCisjaW5jbHVkZSA8aW50ZXJhY3RpdmVfaW5mby5oPgorCitwcml2YXRlIHZhcmFyZ3Mgc3RyaW5nIF9xdWVyeV9pcF9uYW1lKG9iamVjdCBwbGF5ZXIpCit7CisgICAgb2JqZWN0IG9iID0gcGxheWVyOworICAgIG9iIHx8PSBlZnVuOjp0aGlzX3BsYXllcigpOworCisgICAgcGxheWVyID0gZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyhvYiwgSUlfSVBfQUREUkVTUyk7CisgICAgcmV0dXJuIGVmdW46OmludGVyYWN0aXZlX2luZm8ob2IsIElJX0lQX05BTUUpOworfQorCitwcml2YXRlIHZhcmFyZ3Mgc3RyaW5nIF9xdWVyeV9pcF9udW1iZXIob2JqZWN0IHBsYXllcikKK3sKKyAgICBvYmplY3Qgb2IgPSBwbGF5ZXI7CisgICAgb2IgfHw9IGVmdW46OnRoaXNfcGxheWVyKCk7CisKKyAgICBwbGF5ZXIgPSBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKG9iLCBJSV9JUF9BRERSRVNTKTsKKyAgICByZXR1cm4gZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyhvYiwgSUlfSVBfTlVNQkVSKTsKK30KKworLy8gKiBIZXJrdW5mdHMtRXJtaXR0bHVuZworc3RyaW5nIHF1ZXJ5X2lwX251bWJlcihvYmplY3Qgb2IpCit7CisgIG9iPSBvYiB8fCB0aGlzX3BsYXllcigpOworICBpZiAoIW9iamVjdHAob2IpIHx8ICFpbnRlcmFjdGl2ZShvYikpIHJldHVybiAwOworICBpZihvYi0+cXVlcnlfcmVhbGlwKCkgJiYgKHN0cmluZylvYi0+cXVlcnlfcmVhbGlwKCkhPSIiKQorICB7CisgICAgcmV0dXJuIChzdHJpbmcpb2ItPnF1ZXJ5X3JlYWxpcCgpOworICB9CisgIHJldHVybiBfcXVlcnlfaXBfbnVtYmVyKG9iKTsKK30KKworc3RyaW5nIHF1ZXJ5X2lwX25hbWUobWl4ZWQgb2IpCit7CisgIGlmICggIW9iIHx8IG9iamVjdHAob2IpICkKKyAgICAgIG9iPV9xdWVyeV9pcF9udW1iZXIob2IpOworICByZXR1cm4gKHN0cmluZykiL3AvZGFlbW9uL2lwbG9va3VwIi0+aG9zdChvYik7Cit9CisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9xdWVyeV9saW1pdHMuYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL3F1ZXJ5X2xpbWl0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjYmYzOTAKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9xdWVyeV9saW1pdHMuYwpAQCAtMCwwICsxLDE0IEBACisvKiBUaGlzIHNlZnVuIGlzIHRvIHByb3ZpZGUgYSByZXBsYWNlbWVudCBmb3IgdGhlIGVmdW4gcXVlcnlfbGltaXRzKCkuCisgKiBGZWVsIGZyZWUgdG8gYWRkIGl0IHRvIHlvdXIgbXVkbGlicywgaWYgeW91IGhhdmUgbXVjaCBjb2RlIHJlbHlpbmcgb24gdGhhdC4KKyAqLworCisjaWYgISBfX0VGVU5fREVGSU5FRF9fKHF1ZXJ5X2xpbWl0cykKKworI2luY2x1ZGUgPGRyaXZlcl9pbmZvLmg+CisKK3ZhcmFyZ3MgaW50KiBxdWVyeV9saW1pdHMoaW50IGRlZikKK3sKKyAgICByZXR1cm4gZWZ1bjo6ZHJpdmVyX2luZm8oZGVmID8gRENfREVGQVVMVF9SVU5USU1FX0xJTUlUUyA6IERJX0NVUlJFTlRfUlVOVElNRV9MSU1JVFMpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL3F1ZXJ5X2xvYWRfYXZlcmFnZS5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvcXVlcnlfbG9hZF9hdmVyYWdlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IzNmYwZQotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL3F1ZXJ5X2xvYWRfYXZlcmFnZS5jCkBAIC0wLDAgKzEsMTYgQEAKKy8qIFRoaXMgc2VmdW4gaXMgdG8gcHJvdmlkZSBhIHJlcGxhY2VtZW50IGZvciB0aGUgZWZ1biBxdWVyeV9sb2FkX2F2ZXJhZ2UoKS4KKyAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgorICovCisKKyNpZiAhIF9fRUZVTl9ERUZJTkVEX18ocXVlcnlfbG9hZF9hdmVyYWdlKQorCisjaW5jbHVkZSA8ZHJpdmVyX2luZm8uaD4KKworc3RyaW5nIHF1ZXJ5X2xvYWRfYXZlcmFnZSgpCit7CisgICAgcmV0dXJuIGVmdW46OnNwcmludGYoIiUuMmYgY21kcy9zLCAlLjJmIGNvbXAgbGluZXMvcyIsCisgICAgICAgIGVmdW46OmRyaXZlcl9pbmZvKERJX0xPQURfQVZFUkFHRV9DT01NQU5EUyksCisgICAgICAgIGVmdW46OmRyaXZlcl9pbmZvKERJX0xPQURfQVZFUkFHRV9MSU5FUykpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL3F1ZXJ5X211ZF9wb3J0LmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9xdWVyeV9tdWRfcG9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmZjAwOWQKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9xdWVyeV9tdWRfcG9ydC5jCkBAIC0wLDAgKzEsMzUgQEAKKy8qIFRoaXMgc2VmdW4gaXMgdG8gcHJvdmlkZSBhIHJlcGxhY2VtZW50IGZvciB0aGUgZWZ1biBxdWVyeV9tdWRfcG9ydCgpLgorICogRmVlbCBmcmVlIHRvIGFkZCBpdCB0byB5b3VyIG11ZGxpYnMsIGlmIHlvdSBoYXZlIG11Y2ggY29kZSByZWx5aW5nIG9uIHRoYXQuCisgKi8KKworI2lmICEgX19FRlVOX0RFRklORURfXyhxdWVyeV9tdWRfcG9ydCkKKworI2luY2x1ZGUgPGludGVyYWN0aXZlX2luZm8uaD4KKyNpbmNsdWRlIDxkcml2ZXJfaW5mby5oPgorCitpbnQgcXVlcnlfbXVkX3BvcnQodmFyYXJncyBpbnQqfG9iamVjdCogYXJncykKK3sKKyAgICBpZighc2l6ZW9mKGFyZ3MpICYmIGVmdW46OnRoaXNfcGxheWVyKCkgJiYgZWZ1bjo6aW50ZXJhY3RpdmUodGhpc19wbGF5ZXIoKSkpCisgICAgICAgIHJldHVybiBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKHRoaXNfcGxheWVyKCksIElJX01VRF9QT1JUKTsKKworICAgIGlmKHNpemVvZihhcmdzKSA+IDEpCisgICAgICAgIHJhaXNlX2Vycm9yKCJUb28gbWFueSBhcmd1bWVudHMgdG8gcXVlcnlfbXVkX3BvcnRcbiIpOworCisgICAgaWYoc2l6ZW9mKGFyZ3MpICYmIGVmdW46Om9iamVjdHAoYXJnc1swXSkgJiYgZWZ1bjo6aW50ZXJhY3RpdmUoYXJnc1swXSkpCisgICAgICAgIHJldHVybiBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKGFyZ3NbMF0sIElJX01VRF9QT1JUKTsKKworICAgIGlmKHNpemVvZihhcmdzKSAmJiBpbnRwKGFyZ3NbMF0pKQorICAgIHsKKyAgICAgICAgaW50KiBwb3J0cyA9IGVmdW46OmRyaXZlcl9pbmZvKERJX01VRF9QT1JUUyk7CisgICAgICAgIGlmKGFyZ3NbMF0gPCAtMSB8fCBhcmdzWzBdID49IHNpemVvZihwb3J0cykpCisgICAgICAgICAgICByYWlzZV9lcnJvcihlZnVuOjpzcHJpbnRmKCJCYWQgYXJnIDEgdG8gcXVlcnlfbXVkX3BvcnQoKTogdmFsdWUgJWQgb3V0IG9mIHJhbmdlLlxuIiwgYXJnc1swXSkpOworICAgICAgICBlbHNlIGlmKGFyZ3NbMF0gPT0gLTEpCisgICAgICAgICAgICByZXR1cm4gc2l6ZW9mKHBvcnRzKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIHBvcnRzW2FyZ3NbMF1dOworICAgIH0KKworICAgIHJldHVybiBlZnVuOjpkcml2ZXJfaW5mbyhESV9NVURfUE9SVFMpWzBdOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL3F1ZXJ5X29uY2VfaW50ZXJhY3RpdmUuYyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL3F1ZXJ5X29uY2VfaW50ZXJhY3RpdmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzc4MjlmCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvcXVlcnlfb25jZV9pbnRlcmFjdGl2ZS5jCkBAIC0wLDAgKzEsMTQgQEAKKy8qIFRoaXMgc2VmdW4gaXMgdG8gcHJvdmlkZSBhIHJlcGxhY2VtZW50IGZvciB0aGUgZWZ1biBxdWVyeV9vbmNlX2ludGVyYWN0aXZlKCkuCisgKiBGZWVsIGZyZWUgdG8gYWRkIGl0IHRvIHlvdXIgbXVkbGlicywgaWYgeW91IGhhdmUgbXVjaCBjb2RlIHJlbHlpbmcgb24gdGhhdC4KKyAqLworCisjaWYgISBfX0VGVU5fREVGSU5FRF9fKHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUpCisKKyNpbmNsdWRlIDxvYmplY3RfaW5mby5oPgorCitpbnQgcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShvYmplY3Qgb2IpCit7CisgICAgcmV0dXJuIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9PTkNFX0lOVEVSQUNUSVZFKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9xdWVyeV9zbm9vcC5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvcXVlcnlfc25vb3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmE2OWMwCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvcXVlcnlfc25vb3AuYwpAQCAtMCwwICsxLDMwIEBACisvKiBUaGlzIHNlZnVuIGlzIHRvIHByb3ZpZGUgYSByZXBsYWNlbWVudCBmb3IgdGhlIGVmdW4gcXVlcnlfc25vb3AoKS4KKyAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgorICovCisKKworI2luY2x1ZGUgPGludGVyYWN0aXZlX2luZm8uaD4KKworcHJpdmF0ZSBvYmplY3QgX3F1ZXJ5X3Nub29wKG9iamVjdCBvYikKK3sKKyAgICBpZighZWZ1bjo6aW50ZXJhY3RpdmUob2IpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIG9iamVjdCBwcmV2ID0gZWZ1bjo6cHJldmlvdXNfb2JqZWN0KCk7CisgICAgZWZ1bjo6c2V0X3RoaXNfb2JqZWN0KHByZXYpOworI2lmICEgX19FRlVOX0RFRklORURfXyhxdWVyeV9zbm9vcCkKKyAgICByZXR1cm4gZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyhvYiwgSUlfU05PT1BfTkVYVCk7CisjZWxzZQorICAgIHJldHVybiBlZnVuOjpxdWVyeV9zbm9vcChvYik7CisjZW5kaWYKK30KKworbm9tYXNrIG9iamVjdCBxdWVyeV9zbm9vcChvYmplY3Qgd2hvKSB7CisgIG9iamVjdCBzbm9vcGVyOworCisgIHNub29wZXI9X3F1ZXJ5X3Nub29wKHdobyk7CisgIGlmICghc25vb3BlcikgcmV0dXJuIDA7CisgIGlmIChxdWVyeV93aXpfZ3JwKHNub29wZXIpPnF1ZXJ5X3dpel9ncnAoZ2V0dWlkKHByZXZpb3VzX29iamVjdCgpKSkgJiYKKyAgICAgIElTX0FSQ0goc25vb3BlcikpIHJldHVybiAwOworICByZXR1cm4gc25vb3BlcjsKK30KZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL3NldF9oZWFydF9iZWF0LmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9zZXRfaGVhcnRfYmVhdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzOTk1ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9zZXRfaGVhcnRfYmVhdC5jCkBAIC0wLDAgKzEsMjQgQEAKKy8qIFRoaXMgc2VmdW4gaXMgdG8gcHJvdmlkZSBhIHJlcGxhY2VtZW50IGZvciB0aGUgZWZ1biBzZXRfaGVhcnRfYmVhdCgpLgorICogRmVlbCBmcmVlIHRvIGFkZCBpdCB0byB5b3VyIG11ZGxpYnMsIGlmIHlvdSBoYXZlIG11Y2ggY29kZSByZWx5aW5nIG9uIHRoYXQuCisgKi8KKworI2lmICEgX19FRlVOX0RFRklORURfXyhzZXRfaGVhcnRfYmVhdCkKKworI2luY2x1ZGUgPGNvbmZpZ3VyYXRpb24uaD4KKworaW50IHNldF9oZWFydF9iZWF0KGludCBmbGFnKQoreworICAgIG9iamVjdCBvYiA9IGVmdW46OnByZXZpb3VzX29iamVjdCgpOworICAgIGludCBoYiA9IGVmdW46Om9iamVjdF9pbmZvKG9iLCBPQ19IRUFSVF9CRUFUKTsKKworICAgIGlmICghZmxhZyA9PSAhaGIpCisgICAgICAgIHJldHVybiAwOworCisgICAgZWZ1bjo6Y29uZmlndXJlX29iamVjdChvYiwgT0NfSEVBUlRfQkVBVCwgZmxhZyk7CisKKyAgICByZXR1cm4gMTsKK30KKworI2VuZGlmCisKKwpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvc2V0X2lzX3dpemFyZC5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvc2V0X2lzX3dpemFyZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwMWNjZGIKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9zZXRfaXNfd2l6YXJkLmMKQEAgLTAsMCArMSwxMzcgQEAKKy8qIFRoZXNlIGFyZSB0aGUgc3BlY2lhbCBjb21tYW5kcyBmcm9tIHRoZSBkcml2ZXIgdGhhdCBhcmUgYWN0aXZhdGVkIHdpdGgKKyAqIHNldF9pc193aXphcmQoKS4gVGhlc2UgZnVuY3Rpb25zIG11c3QgYmUgYWRkZWQgdG8gdGhlIHBsYXllciBvYmplY3QuCisgKiBBbHNvIHNldF9pc193aXphcmQoKSBtdXN0IGJlIGNhbGxlZCBpbiB0aGUgY29ycmVzcG9uZGluZyBwbGF5ZXIgb2JqZWN0LAorICogbm90IGFzIGFuIChzaW11bC0pZWZ1bi4KKyAqLworCisjaW5jbHVkZSA8Y29tbWFuZHMuaD4KKyNpbmNsdWRlIDxkcml2ZXJfaW5mby5oPgorCisvKiBpc193aXphcmQ6CisgKiAgMTogaGFzIGFjdGlvbnMsCisgKiAgMDogbmV2ZXIgaGFkIGFjdGlvbnMsCisgKiAtMTogaGFkIGFjdGlvbnMgb25jZS4KKyAqLworcHJpdmF0ZSBub3NhdmUgaW50IGlzX3dpemFyZDsKKworcHJpdmF0ZSBpbnQgZHJpdmVyX21hbGxvYyhzdHJpbmcgc3RyKQoreworICAgIGlmKGlzX3dpemFyZCA8PSAwKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmKCFzaXplb2Yoc3RyKSkKKyAgICB7CisgICAgICAgIHdyaXRlKGVmdW46OmRyaXZlcl9pbmZvKERJX1NUQVRVU19URVhUX01BTExPQykpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBpZihzdHIgPT0gImV4dHN0YXRzIikKKyAgICB7CisgICAgICAgIHdyaXRlKGVmdW46OmRyaXZlcl9pbmZvKERJX1NUQVRVU19URVhUX01BTExPQ19FWFRFTkRFRCkpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworcHJpdmF0ZSBpbnQgZHJpdmVyX2R1bXBhbGxvYmooc3RyaW5nIHN0cikKK3sKKyAgICBpZihpc193aXphcmQgPD0gMCB8fCBzaXplb2Yoc3RyKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICB3cml0ZSgiRHVtcGluZyB0byAvT0JKX0RVTVAgLi4uICIpOworICAgIGVmdW46OmR1bXBfZHJpdmVyX2luZm8oRERJX09CSkVDVFMpOworICAgIGVmdW46OmR1bXBfZHJpdmVyX2luZm8oRERJX09CSkVDVFNfREVTVFJVQ1RFRCk7CisgICAgd3JpdGUoImRvbmVcbiIpOworICAgIHJldHVybiAxOworfQorCitwcml2YXRlIGludCBkcml2ZXJfb3BjZHVtcChzdHJpbmcgc3RyKQoreworICAgIGlmKGlzX3dpemFyZCA8PSAwIHx8IHNpemVvZihzdHIpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGVmdW46OmR1bXBfZHJpdmVyX2luZm8oRERJX09QQ09ERVMpOworICAgIHJldHVybiAxOworfQorCitwcml2YXRlIGludCBkcml2ZXJfc3RhdHVzKHN0cmluZyBzdHIpCit7CisgICAgaW50IG9wdDsKKyAgICBpZihpc193aXphcmQgPD0gMCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBzd2l0Y2goc3RyIHx8ICIiKQorICAgIHsKKyAgICAgICAgY2FzZSAiIjoKKyAgICAgICAgICAgIG9wdCA9IERJX1NUQVRVU19URVhUX01FTU9SWTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgInRhYmxlcyI6CisgICAgICAgIGNhc2UgIiB0YWJsZXMiOgorICAgICAgICAgICAgb3B0ID0gRElfU1RBVFVTX1RFWFRfVEFCTEVTOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAic3dhcCI6CisgICAgICAgIGNhc2UgIiBzd2FwIjoKKyAgICAgICAgICAgIG9wdCA9IERJX1NUQVRVU19URVhUX1NXQVA7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICJtYWxsb2MiOgorICAgICAgICBjYXNlICIgbWFsbG9jIjoKKyAgICAgICAgICAgIG9wdCA9IERJX1NUQVRVU19URVhUX01BTExPQzsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgIm1hbGxvYyBleHRzdGF0cyI6CisgICAgICAgIGNhc2UgIiBtYWxsb2MgZXh0c3RhdHMiOgorICAgICAgICAgICAgb3B0ID0gRElfU1RBVFVTX1RFWFRfTUFMTE9DX0VYVEVOREVEOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHdyaXRlKGVmdW46OmRyaXZlcl9pbmZvKG9wdCkpOworICAgIHJldHVybiAxOworfQorCitpbnQgc2V0X2lzX3dpemFyZCh2YXJhcmdzIDxvYmplY3R8aW50PiogYXJncykKK3sKKyAgICBpbnQgb2xkdmFsID0gaXNfd2l6YXJkOworCisgICAgaWYoIXNpemVvZihhcmdzKSkKKyAgICAgICAgcmFpc2VfZXJyb3IoIlRvbyBmZXcgYXJndW1lbnRzIHRvIHNldF9pc193aXphcmRcbiIpOworICAgIGlmKHNpemVvZihhcmdzKSA+IDIpCisgICAgICAgIHJhaXNlX2Vycm9yKCJUb28gbWFueSBhcmd1bWVudHMgdG8gc2V0X2lzX3dpemFyZFxuIik7CisgICAgaWYoIW9iamVjdHAoYXJnc1swXSkpCisgICAgICAgIHJhaXNlX2Vycm9yKCJCYWQgYXJnIDEgdG8gc2V0X2lzX3dpemFyZCgpXG4iKTsKKyAgICBpZihhcmdzWzBdICE9IHRoaXNfb2JqZWN0KCkpCisgICAgICAgIHJhaXNlX2Vycm9yKCJPbmx5IHNldF9pc193aXphcmQgZm9yIHRoZSBjdXJyZW50IG9iamVjdCBzdXBwb3J0ZWRcbiIpOworICAgIGlmKHRoaXNfcGxheWVyKCkgIT0gdGhpc19vYmplY3QoKSkKKyAgICAgICAgcmFpc2VfZXJyb3IoIlRoZSBjdXJyZW50IG9iamVjdCBtdXN0IGJlIHRoaXNfcGxheWVyKCkgZm9yIHNldF9pc193aXphcmQoKVxuIik7CisgICAgaWYoc2l6ZW9mKGFyZ3MpID09IDIgJiYgIWludHAoYXJnc1sxXSkpCisgICAgICAgIHJhaXNlX2Vycm9yKCJCYWQgYXJnIDIgdG8gc2V0X2lzX3dpemFyZCgpXG4iKTsKKworICAgIGlmKHNpemVvZihhcmdzKSA9PSAyICYmICFhcmdzWzFdKQorICAgIHsKKyAgICAgICAgaWYoaXNfd2l6YXJkID4gMCkKKyAgICAgICAgICAgIGlzX3dpemFyZCA9IC0xOworICAgIH0KKyAgICBlbHNlIGlmKHNpemVvZihhcmdzKSA9PSAyICYmIGFyZ3NbMV08MCkKKyAgICB7CisgICAgICAgICAvLyBKdXN0IHJldHVybiB0aGUgb2xkIHZhbHVlLgorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZighaXNfd2l6YXJkKQorICAgICAgICB7CisgICAgICAgICAgICBhZGRfYWN0aW9uKCMnZHJpdmVyX21hbGxvYywgIm1hbGxvYyIpOworICAgICAgICAgICAgYWRkX2FjdGlvbigjJ2RyaXZlcl9kdW1wYWxsb2JqLCAiZHVtcGFsbG9iaiIpOworICAgICAgICAgICAgYWRkX2FjdGlvbigjJ2RyaXZlcl9vcGNkdW1wLCAib3BjZHVtcCIpOworICAgICAgICAgICAgYWRkX2FjdGlvbigjJ2RyaXZlcl9zdGF0dXMsICJzdGF0dXMiLCBBQV9OT1NQQUNFKTsKKyAgICAgICAgfQorICAgICAgICBpc193aXphcmQgPSAxOworICAgIH0KKworICAgIHJldHVybiBvbGR2YWwgPiAwOworfQpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvc2V0X3Byb21wdC5jIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvc2V0X3Byb21wdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiNTk2OTIKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9zZXRfcHJvbXB0LmMKQEAgLTAsMCArMSwyMSBAQAorLyogVGhpcyBzZWZ1biBpcyB0byBwcm92aWRlIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBlZnVuIHNldF9wcm9tcHQoKS4KKyAqIEZlZWwgZnJlZSB0byBhZGQgaXQgdG8geW91ciBtdWRsaWJzLCBpZiB5b3UgaGF2ZSBtdWNoIGNvZGUgcmVseWluZyBvbiB0aGF0LgorICovCisKKyNpZiAhIF9fRUZVTl9ERUZJTkVEX18oc2V0X3Byb21wdCkKKworI2luY2x1ZGUgPGNvbmZpZ3VyYXRpb24uaD4KKwordmFyYXJncyBzdHJpbmd8Y2xvc3VyZSBzZXRfcHJvbXB0KHN0cmluZ3xjbG9zdXJlfGludCBwcm9tcHQsIG9iamVjdCBvYikKK3sKKyAgICBvYiB8fD0gZWZ1bjo6dGhpc19wbGF5ZXIoKTsKKworICAgIG1peGVkIG9sZHByb21wdCA9IGVmdW46OmludGVyYWN0aXZlX2luZm8ob2IsIElDX1BST01QVCk7CisKKyAgICBpZighaW50cChwcm9tcHQpKQorICAgICAgICBlZnVuOjpjb25maWd1cmVfaW50ZXJhY3RpdmUob2IsIElDX1BST01QVCwgcHJvbXB0KTsKKworICAgIHJldHVybiBvbGRwcm9tcHQ7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvc2hhZG93LmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9zaGFkb3cuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjA4YzczCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3NpbXVsX2VmdW4vc3BhcmUvc3BhcmUvc3BhcmUvc2hhZG93LmMKQEAgLTAsMCArMSw1NSBAQAorLyogVGhlc2Ugc2VmdW5zIGFyZSB0byBwcm92aWRlIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBlZnVuIHF1ZXJ5X3NoYWRvd2luZygpCisgKiBhbmQgdGhlIG9sZCBzZW1hbnRpY3Mgb2YgdGhlIGVmdW4gc2hhZG93KCkuCisgKiBGZWVsIGZyZWUgdG8gYWRkIGl0IHRvIHlvdXIgbXVkbGlicywgaWYgeW91IGhhdmUgbXVjaCBjb2RlIHJlbHlpbmcgb24gdGhhdC4KKyAqLworCisjaWYgISBfX0VGVU5fREVGSU5FRF9fKHF1ZXJ5X3NoYWRvd2luZykKKworI2luY2x1ZGUgPG9iamVjdF9pbmZvLmg+CisKK29iamVjdCBxdWVyeV9zaGFkb3dpbmcob2JqZWN0IG9iKQoreworICAgIHJldHVybiBlZnVuOjpvYmplY3RfaW5mbyhvYiwgT0lfU0hBRE9XX1BSRVYpOworfQorCitwcml2YXRlIG9iamVjdCBfc2hhZG93KG9iamVjdCBvYiwgaW50IGZsYWcpCit7CisgICAgaWYoZmxhZykKKyAgICB7CisgICAgICAgIG9iamVjdCBzaGFkb3dlciA9IGVmdW46OnByZXZpb3VzX29iamVjdCgxKTsKKyAgICAgICAgZWZ1bjo6c2V0X3RoaXNfb2JqZWN0KHNoYWRvd2VyKTsKKworICAgICAgICBpZiAoZWZ1bjo6c2hhZG93KG9iKSkKKyAgICAgICAgICAgIHJldHVybiBlZnVuOjpvYmplY3RfaW5mbyhzaGFkb3dlciwgT0lfU0hBRE9XX1BSRVYpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXR1cm4gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX1NIQURPV19ORVhUKTsKK30KKyNlbHNlCitwcml2YXRlIG9iamVjdCBfc2hhZG93KG9iamVjdCBvYiwgaW50IGZsYWcpCit7CisgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoMSkpOworICByZXR1cm4gZWZ1bjo6c2hhZG93KG9iLCBmbGFnKTsKK30KKyNlbmRpZgorCisKK3B1YmxpYyBvYmplY3Qgc2hhZG93KG9iamVjdCBvYiwgaW50IGZsYWcpCit7CisgIG9iamVjdCByZXMgPSBmdW5jYWxsKCMnX3NoYWRvdyxvYiwgZmxhZyk7CisgIGlmIChmbGFnKQorICAgICIvc2VjdXJlL3NoYWRvd21hc3RlciItPlJlZ2lzdGVyU2hhZG93KHByZXZpb3VzX29iamVjdCgpKTsKKyAgcmV0dXJuIHJlczsKK30KKworcHJpdmF0ZSB2b2lkIF91bnNoYWRvdygpIHsKKyAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgxKSk7CisgIGVmdW46OnVuc2hhZG93KCk7Cit9CisKK3B1YmxpYyB2b2lkIHVuc2hhZG93KCkgeworICBmdW5jYWxsKCMnX3Vuc2hhZG93KTsKKyAgIi9zZWN1cmUvc2hhZG93bWFzdGVyIi0+VW5yZWdpc3RlclNoYWRvdyhwcmV2aW91c19vYmplY3QoKSk7Cit9CmRpZmYgLS1naXQgYS9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9zaW11bF9lZnVuLmMgYi9zZWN1cmUvc2ltdWxfZWZ1bi9zcGFyZS9zcGFyZS9zcGFyZS9zaW11bF9lZnVuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI2ODc4OQotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zaW11bF9lZnVuL3NwYXJlL3NwYXJlL3NwYXJlL3NpbXVsX2VmdW4uYwpAQCAtMCwwICsxLDE5OTUgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBzaW11bF9lZnVuLmMgLS0gc2ltdWwgZWZ1bidzCisvLworLy8gJElkOiBzaW11bF9lZnVuLmMgNzQwOCAyMDEwLTAyLTA2IDAwOjI3OjI1WiBaZXNzdHJhICQKKyNwcmFnbWEgc3RyaWN0X3R5cGVzLHNhdmVfdHlwZXMscnR0X2NoZWNrcworI3ByYWdtYSBub19jbG9uZSxub19zaGFkb3csbm9faW5oZXJpdAorI3ByYWdtYSBwZWRhbnRpYyxyYW5nZV9jaGVjayx3YXJuX2RlcHJlY2F0ZWQKKyNwcmFnbWEgd2Fybl9lbXB0eV9jYXN0cyx3YXJuX21pc3NpbmdfcmV0dXJuLHdhcm5fZnVuY3Rpb25faW5jb25zaXN0ZW50CisKKy8vIEFic29sdXRlIFBmYWRlIGVyZm9yZGVybGljaCAtIHp1bSBaZWl0cHVua3QsIHdvIGRlciBNYXN0ZXIgZ2VsYWRlbgorLy8gd2lyZCwgc2luZCBub2NoIGtlaW5lIEluY2x1ZGUtUGZhZGUgZGEgLi4uCisKKyNkZWZpbmUgU05PT1BMT0dGSUxFICJTTk9PUCIKKyNkZWZpbmUgQVNOT09QTE9HRklMRSAiQVJDSC9TTk9PUCIKKworI2luY2x1ZGUgIi9zZWN1cmUvY29uZmlnLmgiCisjaW5jbHVkZSAiL3NlY3VyZS93aXpsZXZlbHMuaCIKKyNpbmNsdWRlICIvc3lzL3Nub29waW5nLmgiCisjaW5jbHVkZSAiL3N5cy9sYW5ndWFnZS5oIgorI2luY2x1ZGUgIi9zeXMvdGhpbmcvcHJvcGVydGllcy5oIgorI2luY2x1ZGUgIi9zeXMvd2l6bGlzdC5oIgorI2luY2x1ZGUgIi9zeXMvZXJxLmgiCisjaW5jbHVkZSAiL3N5cy9scGN0eXBlcy5oIgorI2luY2x1ZGUgIi9zeXMvZGFlbW9uLmgiCisjaW5jbHVkZSAiL3N5cy9wbGF5ZXIvYmFzZS5oIgorI2luY2x1ZGUgIi9zeXMvdGhpbmcvZGVzY3JpcHRpb24uaCIKKyNpbmNsdWRlICIvc3lzL2NvbnRhaW5lci5oIgorI2luY2x1ZGUgIi9zeXMvZGVmaW5lcy5oIgorI2luY2x1ZGUgIi9zeXMvdGVsbmV0LmgiCisjaW5jbHVkZSAiL3N5cy9vYmplY3RpbmZvLmgiCisjaW5jbHVkZSAiL3N5cy9maWxlcy5oIgorI2luY2x1ZGUgIi9zeXMvc3RyaW5ncy5oIgorI2luY2x1ZGUgIi9zeXMvdGltZS5oIgorI2luY2x1ZGUgIi9zeXMvbHBjdHlwZXMuaCIKKyNpbmNsdWRlICIvc3lzL25vdGlmeV9mYWlsLmgiCisjaW5jbHVkZSAiL3N5cy90bHMuaCIKKyNpbmNsdWRlICIvc3lzL2lucHV0X3RvLmgiCisjaW5jbHVkZSAiL3N5cy9vYmplY3RfaW5mby5oIgorCisvKiBmdW5jdGlvbiBwcm90b3R5cGVzCisgKi8KK3N0cmluZyBkdGltZShpbnQgd2Fubik7Cit2YXJhcmdzIGludCBsb2dfZmlsZShzdHJpbmcgZmlsZSwgc3RyaW5nIHR4dCwgaW50IHNpemVfdG9fYnJlYWspOworaW50IHF1ZXJ5X3dpel9sZXZlbChtaXhlZCBwbGF5ZXIpOworbm9tYXNrIHZhcmFyZ3MgaW50IHNub29wKG9iamVjdCBtZSwgb2JqZWN0IHlvdSk7Cit2YXJhcmdzIHN0cmluZyBjb3VudHJ5KG1peGVkIGlwLCBzdHJpbmcgbnVtKTsKK2ludCBxdWVyeV93aXpfZ3JwKG1peGVkIHdpeik7CitwdWJsaWMgdmFyYXJncyBvYmplY3QgZGVlcF9wcmVzZW50KG1peGVkIHdoYXQsIG9iamVjdCBvYik7Citub21hc2sgaW50IHNlY3VyZV9sZXZlbCgpOworbm9tYXNrIHN0cmluZyBzZWN1cmVfZXVpZCgpOworcHVibGljIG5vbWFzayBpbnQgcHJvY2Vzc19jYWxsKCk7Citub21hc2sgbWl4ZWQgX19jcmVhdGVfcGxheWVyX2R1bW15KHN0cmluZyBuYW1lKTsKK3ZhcmFyZ3Mgc3RyaW5nIHJlcGxhY2VfcGVyc29uYWwoc3RyaW5nIHN0ciwgbWl4ZWQgKm9icywgaW50IGNhcHMpOworCisKKy8vcmVwbGFjZW1lbnRzIGZvciBkcm9wcGVkIGVmdW5zIGluIExECisjaWYgIV9fRUZVTl9ERUZJTkVEX18oZXh0cmFjdCkKK3ZhcmFyZ3Mgc3RyaW5nIGV4dHJhY3Qoc3RyaW5nIHN0ciwgaW50IGZyb20sIGludCB0byk7CisjZW5kaWYKKyNpZiAhX19FRlVOX0RFRklORURfXyhzbGljZV9hcnJheSkKK3ZhcmFyZ3MgbWl4ZWQgc2xpY2VfYXJyYXkobWl4ZWQgYXJyYXksIGludCBmcm9tLCBpbnQgdG8pOworI2VuZGlmCisjaWYgIV9fRUZVTl9ERUZJTkVEX18obWVtYmVyX2FycmF5KQoraW50IG1lbWJlcl9hcnJheShtaXhlZCBpdGVtLCBtaXhlZCBhcnJheXN0cmluZyk7CisjZW5kaWYKKworLy8gSW5jbHVkZSB0aGUgZGlmZmVyZW50IHN1YiAnbW9kdWxlcycgb2YgdGhlIHNpbXVsX2VmdW4KKyNpbmNsdWRlIF9fRElSX18iZGVidWdfaW5mby5jIgorI2luY2x1ZGUgX19ESVJfXyJlbmFibGVfY29tbWFuZHMuYyIKKyNpbmNsdWRlIF9fRElSX18iaGFzaC5jIgorI2luY2x1ZGUgX19ESVJfXyJvYmplY3RfaW5mby5jIgorI2luY2x1ZGUgX19ESVJfXyJxdWVyeV9lZGl0aW5nLmMiCisjaW5jbHVkZSBfX0RJUl9fInF1ZXJ5X2lkbGUuYyIKKyNpbmNsdWRlIF9fRElSX18icXVlcnlfaW5wdXRfcGVuZGluZy5jIgorI2luY2x1ZGUgX19ESVJfXyJxdWVyeV9pcF9uYW1lLmMiCisjaW5jbHVkZSBfX0RJUl9fInF1ZXJ5X2xpbWl0cy5jIgorI2luY2x1ZGUgX19ESVJfXyJxdWVyeV9sb2FkX2F2ZXJhZ2UuYyIKKyNpbmNsdWRlIF9fRElSX18icXVlcnlfbXVkX3BvcnQuYyIKKyNpbmNsdWRlIF9fRElSX18icXVlcnlfb25jZV9pbnRlcmFjdGl2ZS5jIgorI2luY2x1ZGUgX19ESVJfXyJxdWVyeV9zbm9vcC5jIgorI2luY2x1ZGUgX19ESVJfXyJzZXRfaGVhcnRfYmVhdC5jIgorI2lmIF9fQk9PVF9USU1FX18gPCAxNDU2MjYxODU5CisjaW5jbHVkZSBfX0RJUl9fInNldF9wcm9tcHQuYyIKKyNlbmRpZgorI2luY2x1ZGUgX19ESVJfXyJzaGFkb3cuYyIKKyNpbmNsdWRlIF9fRElSX18ibGl2aW5ncy5jIgorI2luY2x1ZGUgX19ESVJfXyJjb21tLmMiCisKKyNkZWZpbmUgVE8gICAgICAgIGVmdW46OnRoaXNfb2JqZWN0KCkKKyNkZWZpbmUgVEkgICAgICAgIGVmdW46OnRoaXNfaW50ZXJhY3RpdmUoKQorI2RlZmluZSBUUCAgICAgICAgZWZ1bjo6dGhpc19wbGF5ZXIoKQorI2RlZmluZSBQTyAgICAgICAgZWZ1bjo6cHJldmlvdXNfb2JqZWN0KDApCisjZGVmaW5lIExFVkVMKHgpIHF1ZXJ5X3dpel9sZXZlbCh4KQorI2RlZmluZSBOQU1FKHgpICBjYXBpdGFsaXplKGdldHVpZCh4KSkKKworI2RlZmluZSBERUJVRyh4KSBpZiAoZmluZF9wbGF5ZXIoInplc3N0cmEiKSkgXAorICB0ZWxsX29iamVjdChmaW5kX3BsYXllcigiemVzc3RyYSIpLHgpCisKK21peGVkIGR0aW1lX2NhY2hlID0gKHstMSwiIn0pOworCisjaWZkZWYgSU9TVEFUUworc3RydWN0IGlvc3RhdF9zIHsKKyAgc3RyaW5nIG9uYW1lOworICBpbnQgdGltZTsKKyAgaW50IHNpemU7Cit9OworbWl4ZWQgc2F2ZW9fc3RhdCA9ICh7IDAsYWxsb2NhdGUoMjAwLCAwKSB9KTsKK21peGVkIHJlc3RvcmVvX3N0YXQgPSAoeyAwLGFsbG9jYXRlKDIwMCwwKSB9KTsKKy8vbWl4ZWQgd3JpdGVmaWxlX3N0YXQgPSAoeyAwLGFsbG9jYXRlKDEwMCwoPGlvc3RhdF9zPikpIH0pOworLy9taXhlZCByZWFkZmlsZV9zdGF0ID0gKHsgMCxhbGxvY2F0ZSgxMDAsKDxpb3N0YXRfcz4pKSB9KTsKKy8vbWl4ZWQgbG9nX3N0YXQgPSAoeyAwLGFsbG9jYXRlKDEwMCwoPGlvc3RhdF9zPikpIH0pOworCittaXhlZCBfX19pb3N0YXRzKGludCB0eXBlKSB7CisgIHN3aXRjaCh0eXBlKSB7CisgICAgY2FzZSAxOgorICAgICAgcmV0dXJuIHNhdmVvX3N0YXQ7CisgICAgY2FzZSAyOgorICAgICAgcmV0dXJuIHJlc3RvcmVvX3N0YXQ7CisvKiAgICBjYXNlIDM6CisgICAgICByZXR1cm4gd3JpdGVmaWxlX3N0YXQ7CisgICAgY2FzZSA0OgorICAgICAgcmV0dXJuIHJlYWRmaWxlX3N0YXQ7CisgICAgY2FzZSA1OgorICAgICAgcmV0dXJuIGxvZ19zdGF0OworICAgICAgKi8KKyAgfQorICByZXR1cm4gMDsKK30KKyNlbmRpZgorCisvLyBOaWNodCBqZWRlciBNYWdpZXIgbXVzcyBkaWUgc2ltdWxfZWZ1biBlbnRzb3JnZW4ga29lbm5lbi4KK3N0cmluZyBOb3RpZnlEZXN0cnVjdChvYmplY3QgY2FsbGVyKSB7CisgICAgaWYoIChjYWxsZXIhPXRoaXNfb2JqZWN0KCkgJiYgIUFSQ0hfU0VDVVJJVFkpIHx8IHByb2Nlc3NfY2FsbCgpICkgeworICAgICAgcmV0dXJuICJEdSBkYXJmc3QgZGFzIHNpbXVsX2VmdW4gT2JqZWt0IG5pY2h0IHplcnN0b2VyZW4hXG4iOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworcHVibGljIG5vbWFzayB2b2lkIHJlbW92ZV9pbnRlcmFjdGl2ZSggb2JqZWN0IG9iICkKK3sKKyAgICBpZiAoIG9iamVjdHAob2IpICYmIHByZXZpb3VzX29iamVjdCgpCisgICAgICAgICYmIG9iamVjdF9uYW1lKHByZXZpb3VzX29iamVjdCgpKVswLi43XSAhPSAiL3NlY3VyZS8iCisgICAgICAgICYmICgocHJldmlvdXNfb2JqZWN0KCkgIT0gb2IKKyAgICAgICAgICAgICAmJiAob2IgIT0gdGhpc19wbGF5ZXIoKSB8fCBvYiAhPSB0aGlzX2ludGVyYWN0aXZlKCkpKQorICAgICAgICAgICAgfHwgKHByZXZpb3VzX29iamVjdCgpID09IG9iCisgICAgICAgICAgICAgICAmJiAodGhpc19wbGF5ZXIoKSAmJiB0aGlzX3BsYXllcigpICE9IG9iCisgICAgICAgICAgICAgICAgICAgfHwgdGhpc19pbnRlcmFjdGl2ZSgpICYmIHRoaXNfaW50ZXJhY3RpdmUoKSAhPSBvYikpICkgKQorCisgICAgICAgbG9nX2ZpbGUoICJQTEFZRVJERVNUIiwKKyAgICAgICAgICAgICAgICBzcHJpbnRmKCAiJXM6ICVPIGF1c2dlbG9nZ3Qgdm9uIFBPICVPLCBUSSAlTywgVFAgJU9cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBkdGltZSh0aW1lKCkpLCBvYiwgcHJldmlvdXNfb2JqZWN0KCksCisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzX2ludGVyYWN0aXZlKCksIHRoaXNfcGxheWVyKCkgKSApOworCisgICAgZWZ1bjo6cmVtb3ZlX2ludGVyYWN0aXZlKG9iKTsKK30KKworCit2b2lkIF9fX3VwZG1hc3RlcigpCit7CisgICAgb2JqZWN0IG9iOworCisgICAgLy9zb2xsdGUgbmljaHQgamVkZXIgZHVlcmZlbi4KKyAgICBpZiAocHJvY2Vzc19jYWxsKCkgfHwgIUFSQ0hfU0VDVVJJVFkpCisgICAgICByYWlzZV9lcnJvcigiSWxsZWdhbCB1c2Ugb2YgX19fdXBkbWFzdGVyKCkhIik7CisKKyAgICB3cml0ZSgiUmVtb3Zpbmcgb2xkIG1hc3RlciAuLi4gIik7CisgICAgZm9yZWFjaChzdHJpbmcgZmlsZTogCisgICAgICAgIGdldF9kaXIoIi9zZWN1cmUvbWFzdGVyLyouYyIsR0VURElSX05BTUVTfEdFVERJUl9VTlNPUlRFRHxHRVRESVJfUEFUSCkpIHsKKyAgICAgIGlmIChvYiA9IGZpbmRfb2JqZWN0KGZpbGUpKQorICAgICAgIGVmdW46OmRlc3RydWN0KG9iKTsKKyAgICB9CisgICAgZWZ1bjo6ZGVzdHJ1Y3QoZWZ1bjo6ZmluZF9vYmplY3QoIi9zZWN1cmUvbWFzdGVyIikpOworICAgIHdyaXRlKCJkb25lLlxuTG9hZGluZyBhZ2FpbiAuLi4gIik7CisgICAgbG9hZF9vYmplY3QoIi9zZWN1cmUvbWFzdGVyIik7CisKKyAgICB3cml0ZSgiZG9uZS5cbiIpOworfQorCit2YXJhcmdzIHN0cmluZyBjb3VudHJ5KG1peGVkIGlwLCBzdHJpbmcgbnVtKSB7CisgIG1peGVkIHJldDsKKworICBpZihyZXQgPSAoc3RyaW5nKSIvcC9kYWVtb24vaXBsb29rdXAiLT5jb3VudHJ5KG51bSB8fCBpcCkpIHsKKyAgICByZXR1cm4gcmV0OworICB9IGVsc2UgcmV0dXJuICI/Pz8iOworfQorCisKKy8vICogU25vb3BlbiB1bmQgd2FzIGRhenVnZWhvZXJ0CitzdGF0aWMgb2JqZWN0IGZpbmRfc25vb3BlZChvYmplY3Qgd2hvKQoreworICBvYmplY3QgKnU7CisgIGludCBpOworCisgIGZvciAoaT1zaXplb2YodT11c2VycygpKS0xO2k+PTA7aS0tKQorICAgIGlmICh3aG89PWVmdW46OmludGVyYWN0aXZlX2luZm8odVtpXSwgSUlfU05PT1BfTkVYVCkpCisgICAgICByZXR1cm4gdVtpXTsKKyAgcmV0dXJuIDA7Cit9CisKK3ByaXZhdGUgc3RyaW5nIExjdXQoc3RyaW5nIHN0cikgeworICByZXR1cm4gc3RyWzUuLjExXStzdHJbMTguLl07Cit9CisKK25vbWFzayB2YXJhcmdzIGludCBzbm9vcCggb2JqZWN0IG1lLCBvYmplY3QgeW91ICkKK3sKKyAgICBpbnQgcmV0OworICAgIG9iamVjdCBzbm9vcGVyMCwgc25vb3Blciwgc25vb3BlcjIsIHNub29wZXIzOworCisgICAgaWYoICFvYmplY3RwKG1lKSB8fCBtZSA9PSB5b3UgfHwgIVBPICkKKyAgICAgICByZXR1cm4gMDsKKworICAgIHNub29wZXIwID0gZmluZF9zbm9vcGVkKG1lKTsKKworICAgICBpZih5b3UpeworICAgICAgICBpZiAoIFBPICE9IG1lICYmIHF1ZXJ5X3dpel9ncnAobWUpID49IHF1ZXJ5X3dpel9ncnAoZ2V0ZXVpZChQTykpICkKKyAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIGlmICggcXVlcnlfd2l6X2dycChtZSkgPD0gcXVlcnlfd2l6X2dycCh5b3UpICYmCisgICAgICAgICAgICAgISh5b3UtPlF1ZXJ5QWxsb3dTbm9vcChtZSkpICkKKyAgICAgICAgICAgIGlmICggIUlTX0RFUFVUWShtZSkgfHwgSVNfQVJDSCh5b3UpICkKKyAgICAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIGlmICggKHNub29wZXIgPSBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKHlvdSwgSUlfU05PT1BfTkVYVCkpICYmCisgICAgICAgICAgICAgcXVlcnlfd2l6X2dycChzbm9vcGVyKSA+PSBxdWVyeV93aXpfZ3JwKG1lKSApeworICAgICAgICAgICAgaWYgKCAoaW50KXNub29wZXItPlF1ZXJ5UHJvcChQX1NOT09QRkxBR1MpICYgU0ZfTE9DS0VEICkKKyAgICAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgICAgICB0ZWxsX29iamVjdCggc25vb3Blciwgc3ByaW50ZiggIiVzIHNub29wZWQgamV0enQgJXMuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWUtPm5hbWUoV0VSKSwgeW91LT5uYW1lKFdFUikgKSApOworCisgICAgICAgICAgICBzbm9vcGVyMiA9IG1lOworCisgICAgICAgICAgICB3aGlsZSAoIHNub29wZXIzID0gaW50ZXJhY3RpdmVfaW5mbyhzbm9vcGVyMiwgSUlfU05PT1BfTkVYVCkgKXsKKyAgICAgICAgICAgICAgIHRlbGxfb2JqZWN0KCBzbm9vcGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZiggIiVzIHdpcmQgc2VpbmVyc2VpdHMgdm9uICVzIGdlc25vb3BlZC5cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLHNub29wZXIyLT5uYW1lKFdFUiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNub29wZXIzLT5uYW1lKFdFTSkgKSApOworICAgICAgICAgICAgICAgc25vb3BlcjIgPSBzbm9vcGVyMzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZWZ1bjo6c25vb3AoIHNub29wZXIsIHNub29wZXIyICk7CisKKyAgICAgICAgICAgIGlmICggZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyhzbm9vcGVyMiwgSUlfU05PT1BfTkVYVCkgIT0gc25vb3BlciApCisgICAgICAgICAgICAgICB0ZWxsX29iamVjdCggc25vb3Blciwgc3ByaW50ZiggIkR1IGthbm5zdCAlcyBuaWNodCBzbm9vcGVuLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNub29wZXIyLT5uYW1lKFdFTikgKSApOworICAgICAgICAgICAgZWxzZXsKKyAgICAgICAgICAgICAgIHRlbGxfb2JqZWN0KCBzbm9vcGVyLCBzcHJpbnRmKCAiRHUgc25vb3BzdCBqZXR6dCAlcy5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbm9vcGVyMi0+bmFtZShXRU4pICkgKTsKKyAgICAgICAgICAgICAgIGlmICggIUlTX0RFUFVUWShzbm9vcGVyKSApeworICAgICAgICAgICAgICAgICAgIGxvZ19maWxlKCBTTk9PUExPR0ZJTEUsIHNwcmludGYoIiVzOiAlTyAlTyAlT1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHRpbWUodGltZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25vb3BlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25vb3BlcjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50KHNub29wZXIyKSApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAwMCApOworICAgICAgICAgICAgICAgICAgIGlmIChzbm9vcGVyMCkKKyAgICAgICAgICAgICAgICAgICAgICBDSE1BU1RFUi0+c2VuZCggIlNub29wIiwgc25vb3BlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoICIlcyAqT0ZGKiAlcyAoJU8pIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShnZXR1aWQoc25vb3BlcikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBpdGFsaXplKGdldHVpZChzbm9vcGVyMCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudChzbm9vcGVyMCkgKSApOworCisgICAgICAgICAgICAgICAgICAgQ0hNQVNURVItPnNlbmQoICJTbm9vcCIsIHNub29wZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCIlcyAtPiAlcyAoJU8pIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBpdGFsaXplKGdldHVpZChzbm9vcGVyKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShnZXR1aWQoc25vb3BlcjIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudChzbm9vcGVyMikpKTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIGVsc2V7CisgICAgICAgICAgICAgICAgICAgbG9nX2ZpbGUoIEFTTk9PUExPR0ZJTEUsIHNwcmludGYoICIlczogJU8gJU8gJU9cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHRpbWUodGltZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbm9vcGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNub29wZXIyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50KHNub29wZXIyKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDEwMDAwMCApOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGlmIChzbm9vcGVyKQorICAgICAgICAgICAgICAgaWYgKCAhbWUtPlF1ZXJ5UHJvcChQX1NOT09QRkxBR1MpICYgU0ZfTE9DS0VEICl7CisgICAgICAgICAgICAgICAgICAgcHJpbnRmKCAiJXMgd2lyZCBiZXJlaXRzIHZvbiAlcyBnZXNub29wZWQuIEJlbnV0emUgZGFzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiZlwiLUZsYWcsIHdlbm4gZHUgZGVubm9jaCBzbm9vcGVuIHdpbGxzdC5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHlvdS0+bmFtZShXRVIpLCBzbm9vcGVyLT5uYW1lKFdFTSkgKTsKKyAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgIH0KKworICAgICAgICByZXQgPSBlZnVuOjpzbm9vcCggbWUsIHlvdSApOworCisgICAgICAgIGlmICggIUlTX0RFUFVUWShtZSkgJiYgZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyh5b3UsIElJX1NOT09QX05FWFQpID09IG1lKXsKKyAgICAgICAgICAgIGxvZ19maWxlKCBTTk9PUExPR0ZJTEUsIHNwcmludGYoICIlczogJU8gJU8gJU9cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExjdXQoZHRpbWUodGltZSgpKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lLCB5b3UsIGVudmlyb25tZW50KHlvdSkgKSwKKyAgICAgICAgICAgICAgICAgICAgIDEwMDAwMCApOworCisgICAgICAgICAgICBpZiAoc25vb3BlcjApCisgICAgICAgICAgICAgICBDSE1BU1RFUi0+c2VuZCggIlNub29wIiwgbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoICIlcyAqT0ZGKiAlcyAoJU8pLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShnZXR1aWQobWUpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBpdGFsaXplKGdldHVpZChzbm9vcGVyMCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50KHNub29wZXIwKSApICk7CisKKyAgICAgICAgICAgIENITUFTVEVSLT5zZW5kKCAiU25vb3AiLCBtZSwgc3ByaW50ZiggIiVzIC0+ICVzICglTykuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUoZ2V0dWlkKG1lKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBpdGFsaXplKGdldHVpZCh5b3UpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50KHlvdSkgKSApOworICAgICAgICB9CisgICAgICAgIGVsc2V7CisgICAgICAgICAgICBpZiAoIGVmdW46OmludGVyYWN0aXZlX2luZm8oeW91LCBJSV9TTk9PUF9ORVhUKSA9PSBtZSApeworICAgICAgICAgICAgICAgbG9nX2ZpbGUoIEFTTk9PUExPR0ZJTEUsIHNwcmludGYoICIlczogJU8gJU8gJU9cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMY3V0KGR0aW1lKHRpbWUoKSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWUsIHlvdSwgZW52aXJvbm1lbnQoeW91KSApLAorICAgICAgICAgICAgICAgICAgICAgICAgMTAwMDAwICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIHJldCAmJiBxdWVyeV93aXpfZ3JwKG1lKSA8PSBxdWVyeV93aXpfZ3JwKHlvdSkgJiYKKyAgICAgICAgICAgICAhSVNfREVQVVRZKG1lKSApCisgICAgICAgICAgICB0ZWxsX29iamVjdCggeW91LCAiKioqICIgKyBOQU1FKG1lKSArICIgc25vb3B0IERpY2ghXG4iICk7CisKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgfQorICAgICBlbHNlIHsKKyAgICAgICAgaWYgKCAobWUgPT0gUE8gfHwKKyAgICAgICAgICAgICAgcXVlcnlfd2l6X2dycChnZXRldWlkKFBPKSkgPiBxdWVyeV93aXpfZ3JwKG1lKSB8fAorICAgICAgICAgICAgICAocXVlcnlfd2l6X2dycChnZXRldWlkKFBPKSkgPT0gcXVlcnlfd2l6X2dycChtZSkgJiYKKyAgICAgICAgICAgICAgZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyhQTywgSUlfU05PT1BfTkVYVCkgPT0gbWUpKSAmJiBzbm9vcGVyMCApeworICAgICAgICAgICAgaWYgKCAhSVNfREVQVVRZKG1lKSApeworICAgICAgICAgICAgICAgbG9nX2ZpbGUoIFNOT09QTE9HRklMRSwgc3ByaW50ZiggIiVzOiAlTyAlTyAlTyAqT0ZGKlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGN1dChkdGltZSh0aW1lKCkpKSwgbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNub29wZXIwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudChzbm9vcGVyMCkgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAwMCApOworCisgICAgICAgICAgICAgICAgQ0hNQVNURVItPnNlbmQoICJTbm9vcCIsIG1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZiggIiVzICpPRkYqICVzICglTykuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShnZXR1aWQobWUpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShnZXR1aWQoc25vb3BlcjApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQoc25vb3BlcjApICkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2V7CisgICAgICAgICAgICAgICBsb2dfZmlsZSggQVNOT09QTE9HRklMRSwgc3ByaW50ZiggIiVzOiAlTyAlTyAlTyAqT0ZGKlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExjdXQoZHRpbWUodGltZSgpKSksIG1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25vb3BlcjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudChzbm9vcGVyMCkgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAwMCApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gZWZ1bjo6c25vb3AobWUpOworICAgICAgICB9CisgICAgIH0KKyAgICAgcmV0dXJuIDA7Cit9CisKKworCisvLyAqIEVtdWxhdGlvbiBkZXMgJ2FsdGVuJyBleHBsb2RlIGR1cmNoIGRhcyBuZXVlCitzdHJpbmcgKm9sZF9leHBsb2RlKHN0cmluZyBzdHIsIHN0cmluZyBkZWwpIHsKKyAgaW50IHMsIHQ7CisgIHN0cmluZyAqc3RyczsKKworICBpZiAoIXN0cmluZ3Aoc3RyKSkgeworICAgICAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKKyAgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoCisgICAgICAgICAiSW52YWxpZCBhcmd1bWVudCAxIHRvIG9sZF9leHBsb2RlKCkhIEV4cGVjdGVkIDxzdHJpbmc+LCBnb3Q6ICIKKyAgICAgICAgICIlLjMwT1xuIixzdHIpKTsKKyAgfQorICBpZiAoIXN0cmluZ3AoZGVsKSkgeworICAgICAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKKyAgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoCisgICAgICAgICAiSW52YWxpZCBhcmd1bWVudCAyIHRvIG9sZF9leHBsb2RlKCkhIEV4cGVjdGVkIDxzdHJpbmc+LCBnb3Q6ICIKKyAgICAgICAgICIlLjMwT1xuIixkZWwpKTsKKyAgfQorICBpZihkZWwgPT0gIiIpCisgICAgcmV0dXJuICh7c3RyfSk7CisgIHN0cnM9ZWZ1bjo6ZXhwbG9kZShzdHIsIGRlbCk7CisgIHQ9c2l6ZW9mKHN0cnMpLTE7CisgIHdoaWxlKHM8PXQgJiYgc3Ryc1tzKytdID09ICIiKTtzLS07CisgIHdoaWxlKHQ+PTAgJiYgc3Ryc1t0LS1dID09ICIiKTt0Kys7CisgIGlmKHM8PXQpCisgICAgcmV0dXJuIHN0cnNbcy4udF07CisgIHJldHVybiAoe30pOworfQorCitpbnQgZmlsZV90aW1lKHN0cmluZyBwYXRoKSB7CisgIG1peGVkICp2OworCisgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CisgIGlmIChzaXplb2Yodj1nZXRfZGlyKHBhdGgsR0VURElSX0RBVEVTKSkpIHJldHVybiB2WzBdOworICByZXR1cm4oMCk7IC8vc29uc3QKK30KKworLy8gKiBCZWkgNTBrIEdyb2Vzc2UgTG9nLUZpbGUgcm90aWVyZW4KK3ZhcmFyZ3MgaW50IGxvZ19maWxlKHN0cmluZyBmaWxlLCBzdHJpbmcgdHh0LCBpbnQgc2l6ZV90b19icmVhaykgeworICBtaXhlZCAqc3Q7CisKKyAgZmlsZT0iL2xvZy8iK2ZpbGU7CisgIGZpbGU9aW1wbG9kZSgoZWZ1bjo6ZXhwbG9kZShmaWxlLCIvIiktKHsiLi4ifSkpLCIvIik7CisvLyAgdGVsbF9vYmplY3QoZmluZF9wbGF5ZXIoImpvZiIpLHNwcmludGYoIkxPRyBGSUxFOiAlTyAtPiAlT1xuIixwcmV2aW91c19vYmplY3QoKSxmaWxlKSk7CisgIGlmICghZnVuY2FsbChiaW5kX2xhbWJkYSgjJ2VmdW46OmNhbGxfb3RoZXIsUE8pLCJzZWN1cmUvbWFzdGVyIiwvLycpCisgICAgICAgICAgICAgICJ2YWxpZF93cml0ZSIsZmlsZSxnZXRldWlkKFBPKSwibG9nX2ZpbGUiLFBPKSkKKyAgICAgIHJldHVybiAwOworICBpZiAoIHNpemVfdG9fYnJlYWsgPj0gMCAmICgKKyAgICAgIHNpemVvZihzdCA9IGdldF9kaXIoZmlsZSwyKSApICYmIHN0WzBdID49IChzaXplX3RvX2JyZWFrfE1BWF9MT0dfU0laRSkpKQorICAgICAgY2F0Y2gocmVuYW1lKGZpbGUsIGZpbGUgKyAiLm9sZCIpO3B1Ymxpc2gpOyAvKiBObyBwYW5pYyBpZiBmYWlsdXJlICovCisgIHJldHVybih3cml0ZV9maWxlKGZpbGUsdHh0KSk7Cit9CisKKy8vICogTWFnaWVyLUxldmVsIGFiZnJhZ2VuCitpbnQgcXVlcnlfd2l6X2xldmVsKG1peGVkIHBsYXllcikgeworICByZXR1cm4gKGludCkiL3NlY3VyZS9tYXN0ZXIiLT5xdWVyeV93aXpfbGV2ZWwocGxheWVyKTsKK30KKworI2lmZGVmIF9fQUxJU1RTX18KKy8vICogRWxlbWVudCBhdXMgQWxpc3QgbG9lc2NoZW4gKGJ5IGtleSkKK21peGVkICpyZW1vdmVfYWxpc3QobWl4ZWQga2V5LG1peGVkICphbGlzdCkKK3sKKyAgaW50IGksajsKKworICBpZiAoIXBvaW50ZXJwKGFsaXN0KSB8fCAhc2l6ZW9mKGFsaXN0KSkKKyAgICByZXR1cm4gYWxpc3Q7CisgIGlmICghcG9pbnRlcnAoYWxpc3RbMF0pKQorICB7CisgICAgaWYgKChpPWFzc29jKGtleSxhbGlzdCkpPDApCisgICAgICByZXR1cm4gYWxpc3Q7CisgICAgcmV0dXJuIGFsaXN0WzAuLmktMV0rYWxpc3RbaSsxLi5dOworICB9CisgIGkgPSBhc3NvYyhrZXksYWxpc3RbMF0pOworICBpZiAoKGk9YXNzb2Moa2V5LGFsaXN0WzBdKSk8MCkKKyAgICByZXR1cm4gYWxpc3Q7CisgIGFsaXN0PWFsaXN0WzAuLl07CisgIGZvciAoaj1zaXplb2YoYWxpc3QpLTE7aj49MDtqLS0pCisgICAgYWxpc3Rbal09YWxpc3Rbal1bMC4uaS0xXSthbGlzdFtqXVtpKzEuLl07CisgIHJldHVybiBhbGlzdDsKK30KKworLy8gKiBFbGVtZW50IGF1cyBBbGlzdCBsb2VzY2hlbiAoYnkgcG9zKQorbWl4ZWQgKmV4Y2x1ZGVfYWxpc3QoaW50IGksbWl4ZWQgKmFsaXN0KQoreworICBpbnQgajsKKyAgaWYgKCFwb2ludGVycChhbGlzdCkgfHwgIXNpemVvZihhbGlzdCkgfHwgaTwwKQorICAgIHJldHVybiBhbGlzdDsKKyAgaWYgKCFwb2ludGVycChhbGlzdFswXSkpCisgICAgcmV0dXJuIGFsaXN0WzAuLmktMV0rYWxpc3RbaSsxLi5dOworICBhbGlzdD1hbGlzdFswLi5dOyAvKiBDcmVhdGUgUEhZU0lDQUwgY29weSBvZiBhbGlzdCAqLworICBmb3IgKGo9c2l6ZW9mKGFsaXN0KS0xO2o+PTA7ai0tKQorICAgIGFsaXN0W2pdPWFsaXN0W2pdWzAuLmktMV0rYWxpc3Rbal1baSsxLi5dOworICByZXR1cm4gYWxpc3Q7IC8qIG9yZGVyX2FsaXN0IGlzIE5PVCBuZWNlc3NhcnkgLSBzZWUgL2RvYy9MUEMvYWxpc3QgKi8KK30KKyNlbmRpZiAvLyBfX0FMSVNUU19fCisKKy8vICogR2VybWFuIHZlcnNpb24gb2YgY3RpbWUoKQorI2RlZmluZSBUQUdFICh7IlNvbiIsIk1vbiIsIkRpZSIsIk1pdCIsIkRvbiIsIkZyZSIsIlNhbSJ9KQorI2RlZmluZSBNT05BVEUgKHsiSmFuIiwiRmViIiwiTWFyIiwiQXByIiwiTWFpIiwiSnVuIiwiSnVsIiwiQXVnIixcCisgICAgICAgICAgICAgICAgICJTZXAiLCJPa3QiLCJOb3YiLCJEZXoifSkKK3N0cmluZyBkdGltZShpbnQgd2FubikgeworICAKKyAgaWYgKHdhbm4gPT0gZHRpbWVfY2FjaGVbMF0pCisgICAgcmV0dXJuKGR0aW1lX2NhY2hlWzFdKTsKKworICBpbnQgKmx0ID0gbG9jYWx0aW1lKHdhbm4pOworICByZXR1cm4gc3ByaW50ZigiJXMsICUyZC4gJXMgJWQsICUwMmQ6JTAyZDolMDJkIiwKKyAgICAgIFRBR0VbbHRbVE1fV0RBWV1dLCBsdFtUTV9NREFZXSwgTU9OQVRFW2x0W1RNX01PTl1dLCAKKyAgICAgIGx0W1RNX1lFQVJdLGx0W1RNX0hPVVJdLCBsdFtUTV9NSU5dLCBsdFtUTV9TRUNdKTsKK30KKworLy8gd2VubiBzdHJmdGltZSBpbSBEcml2ZXIgbmljaHQgZXhpc3RpZXJ0LCBpc3QgZGllcyBoaWVyIGVpbiBBbGlhcyBhdWYgZHRpbWUoKSwKKy8vIHp3YXIgc3RpbW10IGRhcyBGb3JtYXQgZGFubiBuaWNodCwgYWJlciBkaWUgTXVkbGliIGJ1Z2d0IG5pY2h0IHVuZCBzY2hyZWlidAorLy8gZWluIG9yZGVudGxpY2hlcyBEYXR1bS9VaHJ6ZWl0LgorI2lmICFfX0VGVU5fREVGSU5FRF9fKHN0cmZ0aW1lKQordmFyYXJncyBzdHJpbmcgc3RyZnRpbWUobWl4ZWQgZm10LCBpbnQgY2xvY2ssIGludCBsb2NhbGl6ZWQpIHsKKyAgaWYgKGludHAoY2xvY2spICYmIGNsb2NrID49IDApCisgICAgcmV0dXJuIGR0aW1lKGNsb2NrKTsKKyAgZWxzZSBpZiAoaW50cChmbXQpICYmIGZtdCA+PSAwKQorICAgIHJldHVybiBkdGltZShmbXQpOworICAKKyAgcmV0dXJuIGR0aW1lKHRpbWUoKSk7Cit9CisjZW5kaWYgLy8hX19FRlVOX0RFRklORURfXyhzdHJmdGltZSkKKworLy8gKiBTaHV0ZG93biBtaXQgenVzYWV0emxpY2hlbSBsb2dnaW5nCitub21hc2sgaW50IHNodXRkb3duKHN0cmluZyByZWFzb24pCit7CisgIHN0cmluZyBuYW1lOworICBzdHJpbmcgb2JuYW1lOworICBzdHJpbmcgb3V0cHV0OworCisgIGlmICghcmVhc29uKQorICAgIHJldHVybiAwOworICBpZiAoICFBUkNIX1NFQ1VSSVRZICYmIGdldHVpZChwcmV2aW91c19vYmplY3QoKSkhPVJPT1RJRCAmJgorICAgICAgICAgIG9iamVjdF9uYW1lKHByZXZpb3VzX29iamVjdCgpKSE9Ii9vYmovc2h1dCIgKQorICB7CisgICAgd3JpdGUoIllvdSBoYXZlIG5vIHBlcm1pc3Npb24gdG8gc2h1dCBkb3duIHRoZSBnYW1lZHJpdmVyIVxuIik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKCh0aGlzX2ludGVyYWN0aXZlKCkpJiYobmFtZT1nZXR1aWQodGhpc19pbnRlcmFjdGl2ZSgpKSkpCisgIHsKKyAgICBuYW1lPWNhcGl0YWxpemUobmFtZSk7CisgICAgZmlsdGVyKHVzZXJzKCksIyd0ZWxsX29iamVjdCwvLycKKyAgICAgICAgICAgICAgIGNhcGl0YWxpemUobmFtZSkrIiBmYWVocnQgZGFzIFNwaWVsIGhlcnVudGVyIVxuIik7CisgIH0KKyAgZWxzZQorICAgIG5hbWU9IkFOT05ZTU9VUyI7CisgIGlmIChwcmV2aW91c19vYmplY3QoKSkgb2JuYW1lPWNhcGl0YWxpemUoZ2V0dWlkKHByZXZpb3VzX29iamVjdCgpKSk7CisgIG91dHB1dD1uYW1lOworICBpZiAob2JuYW1lICYmIG5hbWUhPW9ibmFtZSkgb3V0cHV0PW91dHB1dCsiICgiK29ibmFtZSsiKSI7CisgIGlmIChwcmV2aW91c19vYmplY3QoKSYmb2JqZWN0X25hbWUocHJldmlvdXNfb2JqZWN0KCkpPT0iL29iai9zaHV0Iil7CisgICAgb3V0cHV0Kz0iIGZhZWhydCBkYXMgU3BpZWwgdmlhIEFybWFnZWRkb24gaGVydW50ZXIuXG4iOworICAgIG91dHB1dD1kdGltZSh0aW1lKCkpKyI6ICIrb3V0cHV0OworICAgIGxvZ19maWxlKCJHQU1FX0xPRyIsb3V0cHV0KyJcbiIsLTEpOworICAgIGVmdW46OnNodXRkb3duKCk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgb3V0cHV0PWN0aW1lKHRpbWUoKSkrIjogIitvdXRwdXQrIiBmYWVocnQgZGFzIFNwaWVsIGhlcnVudGVyLlxuIjsKKyAgb3V0cHV0Kz0iICAgIEdydW5kOiAiK3JlYXNvbjsKKyAgbG9nX2ZpbGUoIkdBTUVfTE9HIixvdXRwdXQrIlxuIiwtMSk7CisgIGVmdW46OnNodXRkb3duKCk7CisgIHJldHVybiAxOworfQorCisvLyAqIGxvd2VyY2hhcgorCitpbnQgbG93ZXJjaGFyKGludCBjaGFyKSB7CisgIGlmIChjaGFyPCdBJyB8fCBjaGFyPidaJykgcmV0dXJuIGNoYXI7CisgIHJldHVybiBjaGFyKzMyOworfQorCisvLyAqIHVwcGVyc3RyaW5nCisKK3N0cmluZyB1cHBlcnN0cmluZyhzdHJpbmcgcykKK3sKKyNpZiBfX0VGVU5fREVGSU5FRF9fKHVwcGVyX2Nhc2UpCisgIHJldHVybih1cHBlcl9jYXNlKHMpKTsKKyNlbHNlCisgIGludCBpOworICBpZiAoIXN0cmluZ3AocykpIHJldHVybiAwOworICBmb3IgKGk9c2l6ZW9mKHMpLTE7aT49MDtpLS0pIHNbaV09KChzW2ldPCdhJ3x8c1tpXT4neicpP3NbaV06c1tpXS0zMik7CisgIHJldHVybiBzOworI2VuZGlmCit9CisKKy8vICogbG93ZXJzdHJpbmcKKworc3RyaW5nIGxvd2Vyc3RyaW5nKHN0cmluZyBzKQoreworICBpZiAoIXN0cmluZ3AocykpIHJldHVybiAwOworICByZXR1cm4gbG93ZXJfY2FzZShzKTsKK30KKworCisvLyAqIEdEIHZlcnNpb24KK3N0cmluZyB2ZXJzaW9uKCkKK3sKKyAgcmV0dXJuIF9fVkVSU0lPTl9fOworfQorCisvLyAqIGJyZWFrX3N0cmluZworLy8gc3RyZXRjaCgpIC0tIHN0cmV0Y2ggYSBsaW5lIHRvIGZpbGwgYSBnaXZlbiB3aWR0aCAKK3ByaXZhdGUgc3RyaW5nIHN0cmV0Y2goc3RyaW5nIHMsIGludCB3aWR0aCkgeworICBpbnQgbGVuPXNpemVvZihzKTsKKyAgaWYgKGxlbj09d2lkdGgpIHJldHVybiBzOworCisgIC8vIHJlaW5lIExlZXJ6ZWlsZW4sIGRpcmVrdCB6dXJ1ZWNrZ2ViZW4KKyAgc3RyaW5nIHRyaW1tZWQ9dHJpbShzLFRSSU1fTEVGVCwiICIpOworICBpZiAodHJpbW1lZD09IiIpIHJldHVybiBzOyAKKyAgaW50IHN0YXJ0X3NwYWNlcyA9IGxlbiAtIHNpemVvZih0cmltbWVkKTsKKworICBzdHJpbmcqIHdvcmRzID0gZXhwbG9kZSh0cmltbWVkLCAiICIpOworICAvLyBkZXIgbGV0enRlIGtyaWVndCBrZWluZSBTcGFjZXMKKyAgaW50IHdvcmRfY291bnQ9c2l6ZW9mKHdvcmRzKSAtIDE7CisgIC8vIHdlbm4gWmVpbGUgbnVyIGF1cyBlaW5lbSBXb3J0LCB3aXJkIGRhcyBXb3J0IHp1cnVlY2tnZWdlYmVuCisgIGlmICghd29yZF9jb3VudCkKKyAgICByZXR1cm4gIiAiKnN0YXJ0X3NwYWNlcyArIHdvcmRzWzBdOworCisgIGludCBzcGFjZV9jb3VudCA9IHdpZHRoIC0gbGVuOworCisgIGludCBzcGFjZV9wZXJfd29yZD0od29yZF9jb3VudCtzcGFjZV9jb3VudCkgLyB3b3JkX2NvdW50OworICAvLyBBbnouV29lcnRlciBtaXQgWnVzYXR6LVNwYWNlCisgIGludCByZXN0PSh3b3JkX2NvdW50K3NwYWNlX2NvdW50KSAlIHdvcmRfY291bnQ7IAorICAvLyBSZXN0LVNwYWNlcyBWZXJ0ZWlsZW4KKyAgZm9yZWFjaCAoaW50IHBvcyA6IHJlc3QpIHdvcmRzW3Bvc10rPSIgIjsKKyAgcmV0dXJuICgiICIqc3RhcnRfc3BhY2VzKSArIGltcGxvZGUoIHdvcmRzLCAiICIqc3BhY2VfcGVyX3dvcmQgKTsKK30KKworLy8gYXVzIEdlc2Nod2luZGlna2VpdHNncnVlbmRlbiBoYXQgZGVyIEJsb2Nrc2F0eiBmdWVyIGJyZWFrX3N0cmluZyBlaW5lCisvLyBlaWdlbmUgRnVua3Rpb24gYmVrb21tZW46Citwcml2YXRlIHZhcmFyZ3Mgc3RyaW5nIGJsb2NrX3N0cmluZyhzdHJpbmcgcywgaW50IHdpZHRoLCBpbnQgZmxhZ3MpIHsKKyAgLy8gd2VubiBCU19MRUFWRV9NWV9MRlMsIGFiZXIga2VpbiBCU19OT19QQVJJTkRFTlQsIGRhbm4gd2VyZGVuIFplaWxlbiBtaXQKKyAgLy8gZWluZW0gTGVlcnplaWNoZW4gYmVnb25uZW4uCisgIC8vIEJUVzogV2VubiAhQlNfTEVBVkVfTVlfTEZTLCBoYXQgZGVyIEF1ZnJ1ZmVyIGJlcmVpdHMgYWxsZSBcbiBkdXJjaCAiICIKKyAgLy8gZXJzZXR6dC4KKyAgaWYgKCAoZmxhZ3MgJiBCU19MRUFWRV9NWV9MRlMpCisgICAgICAmJiAhKGZsYWdzICYgQlNfTk9fUEFSSU5ERU5UKSkKKyAgeworICAgICAgcyA9ICIgIityZWdyZXBsYWNlKHMsIlxuIiwiXG4gIiwxKTsKKyAgfQorCisgIC8vIHNwcmludGYgZnVlbGx0IGRpZSBsZXR6dGUgWmVpbGUgYXVmIGRpZSBGZWxkYnJlaXRlIChoaWVyIGFsc28KKyAgLy8gWmVpbGVuYnJlaXRlKSBtaXQgRnVlbGx6ZWljaGVuIGF1Ziwgd2VubiBzaWUgTklDSFQgbWl0IFxuIHVtZ2Vicm9jaGVuCisgIC8vIGlzdC4gRXMgd2lyZCBhbiBkaWUgbGV0enRlIFplaWxlIGFiZXIga2VpbiBaZWlsZW51bWJydWNoIGFuZ2VoYWVuZ3QuCisgIC8vIEVpZ2VudGxpY2ggaXN0IGRhcyBBdWZmdWVsbGVuIGRvb2YsIGFiZXIgdmVybXV0bGljaCBpc3QgZXMgdW5ub2V0aWcsIGVzCisgIC8vIHdpZWRlciBydWVja2dhZW5naWcgenUgbWFjaGVuLgorICBzID0gc3ByaW50ZiggIiUtKj1zIiwgd2lkdGgsIHMpOworCisgIHN0cmluZyAqdG1wPWV4cGxvZGUocywgIlxuIik7CisgIC8vIE51ciB3ZW5uIHMgbWVocnplaWxpZyBpc3QsIEJsb2Nrc2F0eiBkcmF1cyBtYWNoZW4uIERpZSBsZXR6dGUgWmVpbGUgd2lyZAorICAvLyBuYXR1ZXJsaWNoIG5pY2h0IGdlZGVobnQuIFNpZSBpc3QgZGFmdWVyIHNjaG9uIHZvbiBzcHJpbnRmKCkgYXVmZ2VmdWVsbHQKKyAgLy8gd29yZGVuLiBCVFc6IERpZSBsZXR6dGUgWmVpbGUgZW5kZXQgdS5VLiBub2NoIG5pY2h0IG1pdCBlaW5lbSBcbiAoYnp3LgorICAvLyBudXIgZGFubiwgd2VubiBCU19MRUFWRV9NWV9MRlMgdW5kIGRlciB1ZWJlcmdlYmVuZSBUZXh0IHNjaG9uIG5lbiBcbiBhbQorICAvLyBFbmRlIGRlciBsZXR6dGVuIFplaWxlIGhhdCksIGRhcyBtYWNodCBkZXIgQXVmcnVmZXIuLi4KKyAgaWYgKHNpemVvZih0bXApID4gMSkKKyAgICByZXR1cm4gaW1wbG9kZSggbWFwKCB0bXBbMC4uPDJdLCAjJ3N0cmV0Y2gvKicqLywgd2lkdGggKSwgIlxuIiApIAorICAgICAgKyAiXG4iICsgdG1wWzwxXTsKKworICByZXR1cm4gczsKK30KKworcHVibGljIHZhcmFyZ3Mgc3RyaW5nIGJyZWFrX3N0cmluZyhzdHJpbmcgcywgaW50IHcsIG1peGVkIGluZGVudCwgaW50IGZsYWdzKQoreworICAgIGlmICggIXMgfHwgcyA9PSAiIiApIHJldHVybiAiIjsKKworICAgIGlmICggIXcgKSB3PTc4OworCisgICAgaWYoIGludHAoaW5kZW50KSApCisgICAgICAgaW5kZW50ID0gaW5kZW50ID8gIiAiKmluZGVudCA6ICIiOworCisgICAgaW50IGluZGVudGxlbj1zdHJpbmdwKGluZGVudCkgPyBzaXplb2YoaW5kZW50KSA6IDA7CisKKyAgICBpZiAoaW5kZW50bGVuPncpIHsKKyAgICAgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CisgICAgICByYWlzZV9lcnJvcihzcHJpbnRmKCJicmVha19zdHJpbmc6IGluZGVudCBsb25nZXIgJWQgdGhhbiB3aWR0aCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgIGluZGVudGxlbix3KSk7CisgICAgICAvLyB3PSgoaW5kZW50bGVuL3cpKzEpKnc7CisgICAgfQorCisgICAgaWYgKCEoZmxhZ3MgJiBCU19MRUFWRV9NWV9MRlMpKSAKKyAgICAgIHM9cmVncmVwbGFjZSggcywgIlxuIiwgIiAiLCAxICk7CisKKyAgICBpZiAoIGZsYWdzICYgQlNfU0lOR0xFX1NQQUNFICkKKyAgICAgICBzID0gcmVncmVwbGFjZSggcywgIihefFxufCApICAqIiwgIlxcMSIsIDEgKTsKKyAKKyAgICBzdHJpbmcgcHJlZml4PSIiOworICAgIGlmIChpbmRlbnRsZW4gJiYgZmxhZ3MgJiBCU19QUkVQRU5EX0lOREVOVCkgeworICAgICAgaWYgKGluZGVudGxlbitzaXplb2YocykgPiB3IHx8IAorICAgICAgICAgKGZsYWdzICYgQlNfTEVBVkVfTVlfTEZTKSAmJiBzdHJzdHIocywiXG4iKT4tMSkgeworICAgICAgIHByZWZpeD1pbmRlbnQrIlxuIjsKKyAgICAgICBpbmRlbnQ9KGZsYWdzICYgQlNfTk9fUEFSSU5ERU5UKSA/ICIiIDogIiAiOworICAgICAgIGluZGVudGxlbj1zaXplb2YoaW5kZW50KTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIGZsYWdzICYgQlNfQkxPQ0sgKSB7CisgICAgICAvKgorICAgICAgICAgICBzID0gaW1wbG9kZSggbWFwKCBleHBsb2RlKCBzLCAiXG4iICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIydibG9ja19zdHJpbmcsIHcsIGluZGVudGxlbiwgZmxhZ3MpLAorICAgICAgICAgICAgICAgICAgICAgICIiICk7CisgICAgICAqLworICAgICAgcyA9IGJsb2NrX3N0cmluZyggcyAsIHcgLSBpbmRlbnRsZW4sIGZsYWdzICk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgcyA9IHNwcmludGYoIiUtMS4qPXMiLHctaW5kZW50bGVuLHMpOworICAgIH0KKyAgICBpZiAoIHNbPDFdICE9ICdcbicgKSBzICs9ICJcbiI7CisKKyAgICBpZiAoICFpbmRlbnRsZW4gKSByZXR1cm4gcHJlZml4ICsgczsKKyAgICAKKyAgICBzdHJpbmcgaW5kZW50MiA9ICggZmxhZ3MgJiBCU19JTkRFTlRfT05DRSApID8gKCIgIippbmRlbnRsZW4pIDppbmRlbnQ7CisgICAgICAKKyAgICByZXR1cm4gcHJlZml4ICsgaW5kZW50ICsgCisgICAgICByZWdyZXBsYWNlKCBzWzAuLjwyXSwgIlxuIiwgIlxuIitpbmRlbnQyLCAxICkgKyAiXG4iOworICAgICAgLyoKKyAgICAgICBzdHJpbmcgKmJ1ZjsKKworICAgICAgIGJ1ZiA9IGV4cGxvZGUoIHMsICJcbiIgKTsKKyAgICAgICByZXR1cm4gcHJlZml4ICsgaW5kZW50ICsgaW1wbG9kZSggYnVmWzAuLjwyXSwgIlxuIitpbmRlbnQyICkgKyBidWZbPDFdICsgIlxuIjsKKyAgICAgICovCit9CisKKy8vICogRWxlbWVudGUgYXVzIG1hcHBpbmcgbG9lc2NoZW4gLSBtYXBwaW5nIHZvcmhlciBrb3BpZXJlbgorCittYXBwaW5nIG1fY29weV9kZWxldGUobWFwcGluZyBtLCBtaXhlZCBrZXkpIHsKKyAgcmV0dXJuIG1fZGVsZXRlKGNvcHkobSksIGtleSk7Cit9CisKKy8vICogdGltZXMKK2ludCBsYXN0X3JlYm9vdF90aW1lKCkKK3sKKyAgcmV0dXJuIF9fQk9PVF9USU1FX187Cit9CisKK2ludCBmaXJzdF9ib290X3RpbWUoKQoreworICByZXR1cm4gNzAxNTE3NjAwOworfQorCitpbnQgZXhpc3RfZGF5cygpCit7CisgIHJldHVybiAoKCh0aW1lKCktZmlyc3RfYm9vdF90aW1lKCkpLzg2NDApKzUpLzEwOworfQorCisvLyAqIHVwdGltZSA6KQorc3RyaW5nIHVwdGltZSgpCit7CisgIGludCB0OworICBpbnQgdG1wOworICBzdHJpbmcgczsKKworICB0PXRpbWUoKS1fX0JPT1RfVElNRV9fOworICBzPSIiOworICBpZiAodD49ODY0MDApCisgICAgcys9c3ByaW50ZigiJWQgVGFnJXMsICIsdG1wPXQvODY0MDAsKHRtcD09MT8iIjoiZSIpKTsKKyAgaWYgKHQ+PTM2MDApCisgICAgcys9c3ByaW50ZigiJWQgU3R1bmRlJXMsICIsdG1wPSh0PXQlODY0MDApLzM2MDAsKHRtcD09MT8iIjoibiIpKTsKKyAgaWYgKHQ+NjApCisgICAgcys9c3ByaW50ZigiJWQgTWludXRlJXMgdW5kICIsdG1wPSh0PXQlMzYwMCkvNjAsKHRtcD09MT8iIjoibiIpKTsKKyAgcmV0dXJuIHMrc3ByaW50ZigiJWQgU2VrdW5kZSVzIix0PXQlNjAsKHQ9PTE/IiI6Im4iKSk7Cit9CisKKy8vICogV2FzIHR1biBiZWkgJ2RhbmdsaW5nJyBsZnVuLWNsb3N1cmVzID8KK3ZvaWQgZGFuZ2xpbmdfbGZ1bl9jbG9zdXJlKCkgeworICByYWlzZV9lcnJvcigiZGFuZ2xpbmcgbGZ1biBjbG9zdXJlXG4iKTsKK30KKworLy8gKiBTcGVycmVuIGF1c3NlciBmdWVyIG1hc3Rlci9zaW11bF9lZnVuCisKKyNpZiBfX0VGVU5fREVGSU5FRF9fKHNldF9lbnZpcm9ubWVudCkKK25vbWFzayB2b2lkIHNldF9lbnZpcm9ubWVudChvYmplY3QgbzEsIG9iamVjdCBvMikgeworICByYWlzZV9lcnJvcigiQXZhaWxhYmxlIG9ubHkgZm9yIHJvb3RcbiIpOworfQorI2VuZGlmCisKK25vbWFzayB2b2lkIHNldF90aGlzX3BsYXllcihvYmplY3QgcGwpIHsKKyAgcmFpc2VfZXJyb3IoIkF2YWlsYWJsZSBvbmx5IGZvciByb290XG4iKTsKK30KKworI2lmIF9fRUZVTl9ERUZJTkVEX18oZXhwb3J0X3VpZCkKK25vbWFzayB2b2lkIGV4cG9ydF91aWQob2JqZWN0IG9iKSB7CisgIHJhaXNlX2Vycm9yKCJBdmFpbGFibGUgb25seSBmb3Igcm9vdFxuIik7Cit9CisjZW5kaWYKKworLy8gKiBKZXR6dCBhdWNoIGNsb3N1cmVzCitpbnQgcHJvY2Vzc19mbGFnOworCitwdWJsaWMgbm9tYXNrIGludCBwcm9jZXNzX2NhbGwoKQoreworICBpZiAocHJvY2Vzc19mbGFnPjApCisgICAgcmV0dXJuIHByb2Nlc3NfZmxhZzsKKyAgZWxzZSByZXR1cm4oMCk7Cit9CisKK3ByaXZhdGUgbm9tYXNrIHN0cmluZyBfcHJvY2Vzc19zdHJpbmcoc3RyaW5nIHN0cixvYmplY3QgcG8pIHsKKyAgICAgICAgICAgICAgc2V0X3RoaXNfb2JqZWN0KHBvKTsKKyAgICAgICAgICAgICAgcmV0dXJuKGVmdW46OnByb2Nlc3Nfc3RyaW5nKHN0cikpOworfQorCitub21hc2sgc3RyaW5nIHByb2Nlc3Nfc3RyaW5nKCBtaXhlZCBzdHIgKQoreworICBzdHJpbmcgdG1wLCBlcnI7CisgIGludCBmbGFnOyAKKworICBpZiAoIGNsb3N1cmVwKHN0cikgKSB7CisgICAgICBzZXRfdGhpc19vYmplY3QoIHByZXZpb3VzX29iamVjdCgpICk7CisgICAgICByZXR1cm4gZnVuY2FsbChzdHIpOworICB9CisgIGVsc2UgaWYgKHN0cj09MCkKKyAgICAgIHJldHVybigoc3RyaW5nKXN0cik7CisgIGVsc2UgaWYgKCAhc3RyaW5ncChzdHIpICkgeworICAgICAgcmV0dXJuIHRvX3N0cmluZyhzdHIpOworICB9CisKKyAgaWYgKCAhKGZsYWcgPSBwcm9jZXNzX2ZsYWcgPiB0aW1lKCkgLSA2MCkpICAgICAgICAgICAgICAgICAgICAgCisgICAgICBwcm9jZXNzX2ZsYWc9dGltZSgpOworCisgIGVyciA9IGNhdGNoKHRtcCA9IGZ1bmNhbGwoIydfcHJvY2Vzc19zdHJpbmcsc3RyLHByZXZpb3VzX29iamVjdCgpKTsgcHVibGlzaCk7CisKKyAgaWYgKCAhZmxhZyApCisgICAgcHJvY2Vzc19mbGFnPTA7CisKKyAgaWYgKGVycikgeworICAgIC8vIFZlcmFyYmVpdHVuZyBhYmJyZWNoZW4KKyAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOworICAgIHJhaXNlX2Vycm9yKGVycik7CisgIH0KKyAgcmV0dXJuIHRtcDsKK30KKworLy8gJ21rZGlyIC1wJyAtIGVyemV1Z3QgZWluZSBrb21wbGV0dGUgSGllcmFyY2hpZSB2b24gVmVyemVpY2huaXNzZW4uCisvLyB3ZW5uIGRhcyBWZXJ6ZWljaG5pcyBhbmdlbGVndCB3dXJkZSBvZGVyIHNjaG9uIGV4aXN0aWVydCwgd2lyZCAxCisvLyB6dXJ1ZWNrZ2VsaWVmZXJ0LCBzb25zdCAwLgorLy8gV2lyZnQgZWluZW4gRmVobGVyLCB3ZW5uIGRhcyBhbmdlYmVuZSBWZXJ6ZWljaG5pcyBuaWNodCBhYnNvbHV0IGlzdCEKK3B1YmxpYyBpbnQgbWtkaXJwKHN0cmluZyBkaXIpIHsKKyAgLy8gd2VubiBlcyBudXIga2VpbmVuIGZ1ZWhyZW5kZW4gLyBnaWJ0LCBpc3QgZGFzIGVpbiBGZWhsZXIuCisgIGlmIChzdHJzdHIoZGlyLCAiLyIpICE9IDApCisgICAgcmFpc2VfZXJyb3IoIm1rZGlycCgpOiBQZmFkIGlzdCBuaWNodCBhYnNvbHV0ZS5cbiIpOworICAvLyBjdXQgb2ZmIHRyYWlsaW5nIC8uLi4KKyAgaWYgKGRpcls8MV09PScvJykKKyAgICAgIGRpciA9IGRpclswLi48Ml07CisKKyAgaW50IGZzdGF0ID0gZmlsZV9zaXplKGRpcik7CisgIC8vIHdlbm4gZXMgc2Nob24gZXhpc3RpZXJ0LCB0dW4gd2lyIGVpbmZhY2ggc28sIGFscyBoYWV0dGVuIHdpciBlcyBhbmdlbGVndC4KKyAgaWYgKGZzdGF0ID09IEZTSVpFX0RJUikKKyAgICByZXR1cm4gMTsKKyAgLy8gd2VubiBzY2hvbiBuZSBEYXRlaSBleGlzdGllcnQsIGdlaHQgZXMgbmljaHQuCisgIGlmIChmc3RhdCAhPSBGU0laRV9OT0ZJTEUpCisgICAgcmV0dXJuIDA7CisgIC8vIHdlbm4gZXMgbnVyIGVpbmVuIC8gZ2lidCAoZGVuIGZ1ZWhyZW5kZW4pLCBkYW5uIGlzdCBlcyBlaW4KKyAgLy8gdG9wbGV2ZWwtdmVyemVpY2huaXMsIHdhcyBkaXJla3QgYW5nZWxlZ3Qgd2lyZC4KKyAgaWYgKHN0cnJzdHIoZGlyLCIvIik9PTApIHsKKyAgICByZXR1cm4gZnVuY2FsbChiaW5kX2xhbWJkYSgjJ2VmdW46Om1rZGlyLCBwcmV2aW91c19vYmplY3QoKSksIGRpcik7CisgIH0KKworICAvLyBta2RpcigpIG5pY2h0IGRpcmVrdCBydWZlbiwgc29uZGVybiB2b3JoZXIgYWxzIGNsb3N1cmUgYW5zIGF1ZnJ1ZmVuZGUKKyAgLy8gT2JqZWt0IGJpbmRlbi4gU29uc3QgbGFldWZ0IGRpZSBSZWNodGVwcnVlZnVuZyBpbiB2YWxpZF93cml0ZSgpIGltIE1hc3RlcgorICAvLyB1bnRlciBkZXIgQW5uYWhtZSwgZGFzcyBkaWUgc2ltdWxfZWZ1bi5jIG1pdCBpaHJlciByb290IGlkIHdhcyB3aWxsLgorCisgIC8vIGpldHp0IHJla3Vyc2l2IGRpZSBWZXJ6ZWljaG5pc2hpZXJhcmNoaWUgYW5sZWdlbi4gV2VubiBkYXMgZXJmb2xncmVpY2gKKyAgLy8gaXN0LCBkYW5uIGtvZW5uZW4gd2lyIGpldHp0IG1pdCBta2RpciBkYXMgdGllZnN0ZSBWZXJ6ZWljaG5pcyBhbmxlZ2VuCisgIGlmIChta2RpcnAoZGlyWzAuLnN0cnJzdHIoZGlyLCIvIiktMV0pID09IDEpCisgICAgcmV0dXJuIGZ1bmNhbGwoYmluZF9sYW1iZGEoIydlZnVuOjpta2RpciwgcHJldmlvdXNfb2JqZWN0KCkpLCBkaXIpOworfQorCisKKy8vICogUHJvcGVydGllcyBnZ2ZzLiBtaXRzcGVpY2hlcm4KK21peGVkIHNhdmVfb2JqZWN0KG1peGVkIG5hbWUpCit7CisgIG1hcHBpbmcgcHJvcGVydGllczsKKyAgbWFwcGluZyBzYXZlOworICBtaXhlZCBpbmRleCwgcmVzOworICBpbnQgaTsKKworICAvLyBudXIgU3RyaW5ncyB1bmQgMCB6dWxhc3NlbgorICBpZiAoKCFzdHJpbmdwKG5hbWUpIHx8ICFzaXplb2YobmFtZSkpICYmIAorICAgICAgKCFpbnRwKG5hbWUpIHx8IG5hbWUhPTApKSB7CisgICAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOworICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigKKyAgICAgICAgICJPbmx5IG5vbi1lbXB0eSBzdHJpbmdzIGFuZCAwIG1heSBiZSB1c2VkIGFzIGZpbGVuYW1lIGluICIKKyAgICAgICAgICJzZWZ1bjo6c2F2ZV9vYmplY3QoKSEgQXJndW1lbnQgd2FzICVPXG4iLG5hbWUpKTsKKyAgfQorCisgIHNhdmUgPSBtX2FsbG9jYXRlKDAsIDIpOworICBwcm9wZXJ0aWVzID0gKG1hcHBpbmcpcHJldmlvdXNfb2JqZWN0KCktPlF1ZXJ5UHJvcGVydGllcygpOworCisgIGlmKG1hcHBpbmdwKHByb3BlcnRpZXMpKQorICB7CisgICAgLy8gZGVsZXRlIGFsbCBlbnRyaWVzIGluIG1hcHBpbmcgcHJvcGVydGllcyB3aXRob3V0IFNBVkUgZmxhZyEKKyAgICBpbmRleCA9IG1faW5kaWNlcyhwcm9wZXJ0aWVzKTsKKyAgICBmb3IoaSA9IHNpemVvZihpbmRleCktMTsgaT49MDtpLS0pCisgICAgeworICAgICAgaWYocHJvcGVydGllc1tpbmRleFtpXSwgRl9NT0RFXSAmIFNBVkUpCisgICAgICB7CisgICAgICAgc2F2ZVtpbmRleFtpXV0gPSBwcm9wZXJ0aWVzW2luZGV4W2ldXTsKKyAgICAgICBzYXZlW2luZGV4W2ldLCBGX01PREVdID0KKyAgICAgICBwcm9wZXJ0aWVzW2luZGV4W2ldLCBGX01PREVdICYKKyAgICAgICAgICAgICAgICAgICAgKH4oU0VUTU5PVEZPVU5EfFFVRVJZTU5PVEZPVU5EfFFVRVJZQ0FDSEVEfFNFVENBQ0hFRCkpOworICAgICAgfQorICAgIH0KKyAgfQorICBlbHNlIHNhdmUgPSAoW10pOworCisgIC8vIHNhdmUgb2JqZWN0IQorICBwcmV2aW91c19vYmplY3QoKS0+X3NldF9zYXZlX2RhdGEoc2F2ZSk7CisgIC8vIGZvcm1hdDogd2llIGRlZmluaWVydCBpbiBjb25maWcuaAorICBpZiAoc3RyaW5ncChuYW1lKSkKKyAgICByZXMgPSBmdW5jYWxsKGJpbmRfbGFtYmRhKCMnZWZ1bjo6c2F2ZV9vYmplY3QsIHByZXZpb3VzX29iamVjdCgpKSwgbmFtZSwKKyAgICAgICBfX0xJQl9fU0FWRV9GT1JNQVRfVkVSU0lPTl9fKTsKKyAgZWxzZQorICAgIHJlcyA9IGZ1bmNhbGwoYmluZF9sYW1iZGEoIydlZnVuOjpzYXZlX29iamVjdCwgcHJldmlvdXNfb2JqZWN0KCkpLAorICAgICAgIF9fTElCX19TQVZFX0ZPUk1BVF9WRVJTSU9OX18pOworICBwcmV2aW91c19vYmplY3QoKS0+X3NldF9zYXZlX2RhdGEoMCk7CisKKyNpZmRlZiBJT1NUQVRTCisgIC8vIFN0YXRzLi4uCisgIHN0cnVjdCBpb3N0YXRfcyBzdGF0ID0gKDxpb3N0YXRfcz4pOworICBzdGF0LT5vbmFtZSA9IG9iamVjdF9uYW1lKHByZXZpb3VzX29iamVjdCgpKTsKKyAgc3RhdC0+dGltZSA9IHRpbWUoKTsKKyAgLy9zdGF0LT5zaXplID0gKGludClvYmplY3RfaW5mbyhwcmV2aW91c19vYmplY3QoKSxPSU5GT19NRU1PUlksCisgIC8vICAgIE9JTV9UT1RBTF9EQVRBX1NJWkUpOworICBpZiAoc3RyaW5ncChuYW1lKSkKKyAgICAgIHN0YXQtPnNpemUgPSBmaWxlX3NpemUobmFtZSArICIubyIpOworICBlbHNlCisgICAgICBzdGF0LT5zaXplb2YocmVzKTsKKyAgLy9kZWJ1Z19tZXNzYWdlKCJzYXZlbzogIitzYXZlb19zdGF0WzBdKyJcbiIpOworICBzYXZlb19zdGF0WzFdW3NhdmVvX3N0YXRbMF1dID0gc3RhdDsKKyAgc2F2ZW9fc3RhdFswXSA9IChzYXZlb19zdGF0WzBdICsgMSkgJSBzaXplb2Yoc2F2ZW9fc3RhdFsxXSk7CisgIC8vZGVidWdfbWVzc2FnZSgic2F2ZW8gMjogIitzYXZlb19zdGF0WzBdKyJcbiIpOworI2VuZGlmCisKKyAgcmV0dXJuIHJlczsKK30KKworLy8gKiBBdWNoIFByb3BlcnRpZXMgbGFkZW4KK2ludCByZXN0b3JlX29iamVjdChzdHJpbmcgbmFtZSkKK3sKKyAgaW50IHJlc3VsdDsKKyAgbWl4ZWQgaW5kZXg7CisgIG1peGVkIHNhdmU7CisgIG1hcHBpbmcgcHJvcGVydGllczsKKyAgaW50IGk7CisgIGNsb3N1cmUgY2w7CisKKyAgLy8gZ2V0IGFjdHVhbCBwcm9wZXJ0eSBzZXR0aW5ncyAoYnkgY3JlYXRlKCkpCisgIHByb3BlcnRpZXMgPSAobWFwcGluZylwcmV2aW91c19vYmplY3QoKS0+UXVlcnlQcm9wZXJ0aWVzKCk7CisKKy8vICBERUJVRyhzcHJpbnRmKCJSRVNUT1JFICVPXG4iLG5hbWUpKTsKKyAgLy8gcmVzdG9yZSBvYmplY3QKKyAgcmVzdWx0PWZ1bmNhbGwoYmluZF9sYW1iZGEoIydlZnVuOjpyZXN0b3JlX29iamVjdCwgcHJldmlvdXNfb2JqZWN0KCkpLCBuYW1lKTsKKyAgLy8nKSkKKyAgLy9fZ2V0X3NhdmVfZGF0YSBsaWVmZXJ0IHRhdHNhZWNobGljaCBtaXhlZCB6dXJ1ZWNrLCB3ZW5uIGRhcyBhdWNoIGltbWVyIGVpbiAKKyAgLy9tYXBwaW5nIHNlaW4gc29sbHRlLgorICBzYXZlID0gKG1peGVkKXByZXZpb3VzX29iamVjdCgpLT5fZ2V0X3NhdmVfZGF0YSgpOworICBpZihtYXBwaW5ncChzYXZlKSkKKyAgeworICAgIGluZGV4ID0gbV9pbmRpY2VzKHNhdmUpOworICAgIGZvcihpID0gc2l6ZW9mKGluZGV4KS0xOyBpPj0wOyBpLS0pCisgICAgeworICAgICAgcHJvcGVydGllc1tpbmRleFtpXV0gPSBzYXZlW2luZGV4W2ldXTsKKyAgICAgIHByb3BlcnRpZXNbaW5kZXhbaV0sIEZfTU9ERV0gPSBzYXZlW2luZGV4W2ldLCBGX01PREVdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJn4oU0VUQ0FDSEVEfFFVRVJZQ0FDSEVEKTsKKyAgICB9CisgIH0KKyAgZWxzZSBwcm9wZXJ0aWVzID0gKFtdKTsKKworICAvLyByZXN0b3JlIHByb3BlcnRpZXMKKyAgZnVuY2FsbCgKKyAgICAgICAgICBiaW5kX2xhbWJkYSgKKyAgICAgICAgICAgICAgICAgICAgIHVuYm91bmRfbGFtYmRhKCh7J2FyZ30pLCAvLyd9KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh7IydjYWxsX290aGVyLCh7Iyd0aGlzX29iamVjdH0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZXRQcm9wZXJ0aWVzIiwnYXJnfSkpLC8vJykKKyAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzX29iamVjdCgpKSxwcm9wZXJ0aWVzKTsKKyAgcHJldmlvdXNfb2JqZWN0KCktPl9zZXRfc2F2ZV9kYXRhKDApOworCisjaWZkZWYgSU9TVEFUUworICAvLyBTdGF0cy4uLgorICAvL2RlYnVnX21lc3NhZ2UoInJlc3RvcmVvOiAiK3Jlc3RvcmVvX3N0YXRbMF0rIlxuIik7CisgIHN0cnVjdCBpb3N0YXRfcyBzdGF0ID0gKDxpb3N0YXRfcz4pOworICBzdGF0LT5vbmFtZSA9IG9iamVjdF9uYW1lKHByZXZpb3VzX29iamVjdCgpKTsKKyAgc3RhdC0+dGltZSA9IHRpbWUoKTsKKyAgLy9zdGF0LT5zaXplID0gKGludClvYmplY3RfaW5mbyhwcmV2aW91c19vYmplY3QoKSxPSU5GT19NRU1PUlksCisgIC8vICAgIE9JTV9UT1RBTF9EQVRBX1NJWkUpOworICBzdGF0LT5zaXplID0gZmlsZV9zaXplKG5hbWUgKyAiLm8iKTsKKyAgcmVzdG9yZW9fc3RhdFsxXVtyZXN0b3Jlb19zdGF0WzBdXSA9IHN0YXQ7CisKKyAgcmVzdG9yZW9fc3RhdFswXSA9IChyZXN0b3Jlb19zdGF0WzBdICsgMSkgJSBzaXplb2YocmVzdG9yZW9fc3RhdFsxXSk7CisjZW5kaWYKKworICByZXR1cm4gcmVzdWx0OworfQorCisvLyAqIEhCIGVpbmVzIE9iamVrdGVzIGVpbi9hdXNzY2hhbHRlbgoraW50IHNldF9vYmplY3RfaGVhcnRfYmVhdChvYmplY3Qgb2IsIGludCBmbGFnKQoreworICBpZiAob2JqZWN0cChvYikpCisgICAgcmV0dXJuIGZ1bmNhbGwoYmluZF9sYW1iZGEoIydlZnVuOjpjb25maWd1cmVfb2JqZWN0LG9iKSwgb2IsIE9DX0hFQVJUX0JFQVQsIGZsYWcpOworfQorCisvLyAqIE1hZ2llcmxldmVsZ3J1cHBlbiBlcm1pdHRlbG4KK2ludCBxdWVyeV93aXpfZ3JwKG1peGVkIHdpeikKK3sKKyAgaW50IGxldjsKKworICBsZXY9cXVlcnlfd2l6X2xldmVsKHdpeik7CisgIGlmIChsZXY8U0VFUl9MVkwpIHJldHVybiAwOworICBpZiAobGV2Pj1HT0RfTFZMKSByZXR1cm4gbGV2OworICBpZiAobGV2Pj1BUkNIX0xWTCkgcmV0dXJuIEFSQ0hfR1JQOworICBpZiAobGV2Pj1FTERFUl9MVkwpIHJldHVybiBFTERFUl9HUlA7CisgIGlmIChsZXY+PUxPUkRfTFZMKSByZXR1cm4gTE9SRF9HUlA7CisgIGlmIChsZXY+PVNQRUNJQUxfTFZMKSByZXR1cm4gU1BFQ0lBTF9HUlA7CisgIGlmIChsZXY+PURPTUFJTk1FTUJFUl9MVkwpIHJldHVybiBET01BSU5NRU1CRVJfR1JQOworICBpZiAobGV2Pj1XSVpBUkRfTFZMKSByZXR1cm4gV0laQVJEX0dSUDsKKyAgaWYgKGxldj49TEVBUk5FUl9MVkwpIHJldHVybiBMRUFSTkVSX0dSUDsKKyAgcmV0dXJuIFNFRVJfR1JQOworfQorCittaXhlZCAqd2l6bGlzdF9pbmZvKCkKK3sKKyAgaWYgKEFSQ0hfU0VDVVJJVFkgfHwgIWV4dGVybl9jYWxsKCkpCisgICAgICAgICAgICByZXR1cm4gZWZ1bjo6d2l6bGlzdF9pbmZvKCk7CisgIHJldHVybiAwOworfQorCisvLyAqIHdpemxpc3QgYXVzZ2ViZW4KK3ZhcmFyZ3Mgdm9pZCB3aXpsaXN0KHN0cmluZyBuYW1lLCBpbnQgc29ydGtleSApIHsKKworICBpZiAoIW5hbWUpCisgIHsKKyAgICBpZiAodGhpc19wbGF5ZXIoKSkKKyAgICAgIG5hbWUgPSBnZXR1aWQodGhpc19wbGF5ZXIoKSk7CisgICAgaWYgKCFuYW1lKQorICAgICAgcmV0dXJuOworICB9CisKKyAgLy8gU2NobHVlc3NlbCBkYXJmIG51ciBpbiBlaW5lbSBndWVsdGlnZW4gQmVyZWljaCBzZWluCisgIGlmIChzb3J0a2V5PFdMX05BTUUgfHwgc29ydGtleT49V0xfU0laRSkgc29ydGtleT1XTF9DT1NUOworCisgIG1peGVkKiogd2wgPSBlZnVuOjp3aXpsaXN0X2luZm8oKTsKKyAgLy8gbmFjaCA8c29ydGtleT4gc29ydGllcmVuCisgIHdsID0gc29ydF9hcnJheSh3bCwgZnVuY3Rpb24gaW50IChtaXhlZCBhLCBtaXhlZCBiKQorICAgICAge3JldHVybiBhW3NvcnRrZXldIDwgYltzb3J0a2V5XTsgfSApOworCisgIC8vIFN1bW1lIHVlYmVyIGFsbGUgS29tbWFuZG9zIGVybWl0dGVsbi4KKyAgaW50IHRvdGFsX2NtZCwgaTsKKyAgaW50IHBvcz0tMTsKKyAgZm9yZWFjaChtaXhlZCBlbnRyeSA6IHdsKQorICB7CisgICAgdG90YWxfY21kICs9IGVudHJ5W1dMX0NPTU1BTkRTXTsKKyAgICBpZiAoZW50cnlbV0xfTkFNRV0gPT0gbmFtZSkKKyAgICAgIHBvcyA9IGk7CisgICAgKytpOworICB9CisKKyAgaWYgKHBvcyA8IDAgJiYgbmFtZSAhPSAiQUxMIiAmJiBuYW1lICE9ICJUT1AxMDAiKQorICAgIHJldHVybjsKKworICBpZiAobmFtZSA9PSAiVE9QMTAwIikKKyAgeworICAgIGlmIChzaXplb2Yod2wpID4gMTAwKQorICAgICAgd2wgPSB3bFswLi4xMDBdOworICAgIGVsc2UKKyAgICAgIHdsID0gd2w7CisgIH0KKyAgLy8gdW0gbmFtZSBoZXJ1bSBzY2huZWlkZW4KKyAgZWxzZSBpZiAobmFtZSAhPSAiQUxMIikKKyAgeworICAgIGlmIChzaXplb2Yod2wpIDw9IDIxKQorICAgICAgd2wgPSB3bDsKKyAgICBlbHNlIGlmIChwb3MgKyAxMCA8IHNpemVvZih3bCkgJiYgcG9zIC0gMTAgPiAwKQorICAgICAgd2wgPSB3bFtwb3MtMTAuLnBvcysxMF07CisgICAgZWxzZSBpZiAocG9zIDw9MjEpCisgICAgICB3bCA9IHdsWzAuLjIwXTsKKyAgICBlbHNlIGlmIChwb3MgPj0gc2l6ZW9mKHdsKSAtIDIxKQorICAgICAgd2wgPSB3bFs8MjEuLl07CisgICAgZWxzZQorICAgICAgd2wgPSB3bDsKKyAgfQorCisgIHdyaXRlKCJcbldpemFyZCB0b3Agc2NvcmUgbGlzdFxuXG4iKTsKKyAgaWYgKHRvdGFsX2NtZCA9PSAwKQorICAgIHRvdGFsX2NtZCA9IDE7CisgIHByaW50ZigiJS0yMHMgJS02cyAlLTNzICUtMTdzICUtNnMgJS02cyAlLTZzXG4iLAorICAgICAgICAgIkVVSUQiLCAiY21kcyIsICIlIiwgIkNvc3RzIiwgIkhCIiwgIkFycmF5cyIsIk1hcHAuIik7CisgIGZvcmVhY2gobWl4ZWQgZTogd2wpCisgIHsKKyAgICBwcmludGYoIiUtOjIwcyAlOjZkICU6MmQlJSBbJTo2ZGssJTo2ZEddICU6NmQgJTo2ZCAlOjZkXG4iLAorICAgICAgICAgIGVbV0xfTkFNRV0sIGVbV0xfQ09NTUFORFNdLCBlW1dMX0NPTU1BTkRTXSAqIDEwMCAvIHRvdGFsX2NtZCwKKyAgICAgICAgICBlW1dMX0NPU1RdIC8gMTAwMCwgZVtXTF9UT1RBTF9HSUdBQ09TVF0sCisgICAgICAgICAgZVtXTF9IRUFSVF9CRUFUU10sIGVbV0xfQVJSQVlfVE9UQUxdLCBlW1dMX01BUFBJTkdfVE9UQUxdCisgICAgICAgICAgKTsKKyAgfQorICBwcmludGYoIlxuVG90YWwgICAgICAgICAlN2QgICAgICAgICAoJWQpXG5cbiIsIHRvdGFsX2NtZCwgc2l6ZW9mKHdsKSk7Cit9CisKKworLy8gQWIgaGllciBmb2xnZW4gSGlsZnNmdW5rdGlvbmVuIGZ1ZXIgY2FsbF9vdXQoKSBiencuIGZ1ZXIgZGVyZW4gQmVncmVuenVuZworCisvLyBlcm1pdHRlbHQgZGFzIE9iamVrdCBkZXMgQ2FsbG91dHMuCitwcml2YXRlIG9iamVjdCBfY2FsbF9vdXRfb2JqKCBtaXhlZCBjYWxsX291dCApIHsKKyAgICByZXR1cm4gcG9pbnRlcnAoY2FsbF9vdXQpID8gY2FsbF9vdXRbMF0gOiAwOworfQorCitwcml2YXRlIHZvaWQgX3NhbWVfb2JqZWN0KCBvYmplY3Qgb2IsIG1hcHBpbmcgbSApIHsKKyAgLy8gaXN0IG5pY2h0IHNvIGJsb2VkLCB3aWUgZXMgYXVzc2llaHQsIHMuIG5hY2hmb2xnZWRlIFZlcndlbmR1bmcgdm9uIG0KKyAgaWYgKCBtW29iXSApCisgICAgbVtvYl0gKz0gKHsgb2IgfSk7CisgIGVsc2UKKyAgICBtW29iXSA9ICh7IG9iIH0pOyAKK30KKworLy8gYWxsZSBPYmpla3RlIGltIE1hcHBpbmcgbSB6dXNhbW1lbmZhc3NlbiwgZGllIGRlbiBnbGVpY2hlbiBMb2FkbmFtZSAoTmFtZSBkZXIKKy8vIEJsdWVwcmludCkgaGFiZW4sIGFsc28gYWxsZSBDbG9uZXMgZGVyIEJQLCBkaWUgQ2FsbG91dHMgbGF1ZmVuIGhhYmVuLgorLy8gT2JqZWt0ZSB3ZXJkZW4gYXVjaCBtZWhyZmFjaCBlcmZhc3N0LCBqZSBuYWNoIEFuemFobCBpaHJlciBDYWxsb3V0cy4KK3ByaXZhdGUgdm9pZCBfc2FtZV9wYXRoKCBvYmplY3Qga2V5LCBvYmplY3QgKm9icywgbWFwcGluZyBtICkgeworICBzdHJpbmcgcGF0aDsKKyAgaWYgKCFvYmplY3RwKGtleSkgfHwgIXBvaW50ZXJwKG9icykpIHJldHVybjsKKworICBwYXRoID0gbG9hZF9uYW1lKGtleSk7CisKKyAgaWYgKCBtW3BhdGhdICkKKyAgICBtW3BhdGhdICs9IG9iczsKKyAgZWxzZQorICAgIG1bcGF0aF0gPSBvYnM7Cit9CisKKy8vIGtleSBrYW5uIG9iamVjdCBvZGVyIHN0cmluZyBzZWluLgorcHJpdmF0ZSBpbnQgX3Rvb19tYW55KCBtaXhlZCBrZXksIG1hcHBpbmcgbSwgaW50IGkgKSB7CisgICAgcmV0dXJuIHNpemVvZihtW2tleV0pID49IGk7Cit9CisKKy8vIGFsbGUgT2JqZWt0ZSBpbiBvYnMgemVyc3RvZXJlbiB1bmQgRmVobGVybWVsZHVuZyBhdXNnZWJlbi4gQUNIVFVORzogRGllCisvLyBPYmpla3RlIHdlcmRlbiBpZFIgenUgZWluZXIgQlAgZ2Vob2VyZW4sIG11ZXNzZW4gYWJlciBuaWNodCEgSW4gZGVtIEZhbGwKKy8vIHdpcmQgYXVmIGRlciBFYmVuZSBhYmVyIG51ciBlaW4gT2JqZWt0IGluIGRlciBGZWhsZXJtZWxkdW5nIGVyd2FlaG50LgorcHJpdmF0ZSB2b2lkIF9kZXN0cm95KCBtaXhlZCBrZXksIG9iamVjdCAqb2JzLCBzdHJpbmcgdGV4dCwgaW50IHVpZCApIHsKKyAgICBpZiAoIXBvaW50ZXJwKG9icykpIHJldHVybjsKKyAgICAvLyBBcnJheSBtaXQgdW5pcXVlIEVpbnRyYWVnZSBlcnpldWdlbi4KKyAgICBvYnMgPSBtX2luZGljZXMoIG1rbWFwcGluZyhvYnMpICk7CisgICAgLy8gRmVobGVybWVsZHVuZyBhdWYgZGVyIEViZW5lIGF1c2dlYmVuLCBpbSBjYXRjaCgpIG1pdCBwdWJsaXNoLCBkYW1pdCBlcworICAgIC8vIGF1ZiBkZXIgRWJlbmUgZGlyZWt0IHNjcm9sbHQsIGRlciBiYWNrdHJhY2UgdmVyZnVlZ2JhciBpc3QgKGltCisgICAgLy8gZ2VnZW5zYXR6IHp1ciBMb2VzdW5nIG1pdHRlbHMgQ2FsbG91dCksIGRpZSBBdXNmdWVocnVuZyBhYmVyIHdlaXRlcgorICAgIC8vIGxhZXVmdC4KKyAgICBjYXRjaCggZWZ1bjo6cmFpc2VfZXJyb3IoICAgICAgICAgICAKKyAgICAgICAgIHNwcmludGYoIHRleHQsICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICB1aWQgPyAoc3RyaW5nKW1hc3RlcigpLT5jcmVhdG9yX2ZpbGUoa2V5KSA6IGtleSwgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgIHNpemVvZihvYnMpLCBvYmplY3RfbmFtZShvYnNbPDFdKSApICk7cHVibGlzaCk7CisgICAgLy8gVW5kIHdlZyBtaXQgZGVtIEtyYW0uLi4KKyAgICBmaWx0ZXIoIG9icywgIydlZnVuOjpkZXN0cnVjdC8qJyovICk7Cit9CisKKy8vIEFsbGUgT2JqZWt0IGVpbmVyIFVJRCBpbSBNYXBwaW5nIG0gbWl0IFVJRCBhbHMgS0V5cyB6dXNhbW1lbmZhc3Nlbi4gT2JqZWt0CisvLyBzaW5kIGRhYmVpIG5pY2h0IHVuaXF1ZS4KK3ByaXZhdGUgdm9pZCBfc2FtZV91aWQoIHN0cmluZyBrZXksIG9iamVjdCAqb2JzLCBtYXBwaW5nIG0sIGNsb3N1cmUgY2YgKSB7CisgIHN0cmluZyB1aWQ7CisKKyAgaWYgKCAhcG9pbnRlcnAob2JzKSB8fCAhc2l6ZW9mKG9icykgKQorICAgIHJldHVybjsKKworICB1aWQgPSBmdW5jYWxsKCBjZiwga2V5ICk7CisKKyAgaWYgKCBtW3VpZF0gKQorICAgIG1bdWlkXSArPSBvYnM7IC8vIG9icyBpc3QgbmVuIEFycmF5CisgIGVsc2UKKyAgICBtW3VpZF0gPSBvYnM7Cit9CisKK25vbWFzayB2YXJhcmdzIHZvaWQgY2FsbF9vdXQoIHZhcmFyZ3MgbWl4ZWQgKmFyZ3MgKQoreworICAgIG1peGVkIHRtcCwgKmNhbGxfb3V0czsKKworICAgIC8vIEJlaSA+NjAwIENhbGxvdXRzIGFsbGUgT2JqZWt0ZSBraWxsZW4sIGRpZSBtZWhyIGFscyAzMCBDYWxsb3V0cyBsYXVmZW4KKyAgICAvLyBoYWJlbi4KKyAgICBpZiAoIGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9DQUxMT1VUUykgPiA2MDAKKyAgICAgICAgJiYgZ2V0ZXVpZChwcmV2aW91c19vYmplY3QoKSkgIT0gUk9PVElEICkKKyAgICB7CisgICAgICAgLy8gTG9nIGVyemV1Z2VuLi4uCisgICAgICAKKyAgICAgICAvLyBPYmpla3RlIGFsbGVyIENhbGxvdXRzIGVybWl0dGVsbgorICAgICAgIGNhbGxfb3V0cyA9IG1hcCggZWZ1bjo6Y2FsbF9vdXRfaW5mbygpLCAjJ19jYWxsX291dF9vYmogKTsKKyAgICAgICBtYXBwaW5nIG9iamVjdG1hcCA9IChbXSk7CisgICAgICAgZmlsdGVyKCBjYWxsX291dHMsICMnX3NhbWVfb2JqZWN0LCAmb2JqZWN0bWFwICk7CisgICAgICAgLy8gTWFzdGVyIG5pY2h0IGdyaWxsZW4uLi4KKyAgICAgICBlZnVuOjptX2RlbGV0ZSggb2JqZWN0bWFwLCBtYXN0ZXIoMSkgKTsKKyAgICAgICAvLyBhbGxlIE9iamVrdGUgcmF1c3N1Y2hlbiwgZGllIHp1dmllbGUgaGFiZW4uLi4KKyAgICAgICBtYXBwaW5nIHJlcyA9IGZpbHRlcl9pbmRpY2VzKCBvYmplY3RtYXAsICMnX3Rvb19tYW55LCBvYmplY3RtYXAsIDI5ICk7CisgICAgICAgLy8gdW5kIHVlYmVyIGFsbGUgS2V5cyBnZWhlbiwgYW4gX2Rlc3Ryb3koKSB3ZXJkZW4gS2V5IHVuZCBBcnJheSBtaXQKKyAgICAgICAvLyBPYmpla3RlbiB1ZWJlcmdlYmVuIChpbiBkaWVzZW0gRmFsbCBzaW5kIEtleXMgdW5kIEFycmF5IG1pdAorICAgICAgIC8vIE9iamVrdGVuIGpld2VpbHMgZGFzIGdsZWljaGUgT2JqZWt0KS4KKyAgICAgICBpZiAoIHNpemVvZihyZXMpICkgICAgICAgCisgICAgICAgICAgIHdhbGtfbWFwcGluZyhyZXMsICMnX2Rlc3Ryb3ksICJDQUxMX09VVCBvdmVyZmxvdyBieSBzaW5nbGUgIiAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgIm9iamVjdCBbJU9dLiBEZXN0cnVjdGVkICVkIG9iamVjdHMuIFslc11cbiIsIDAgKTsKKworICAgICAgIC8vIEJlaSAoYXVjaCBuYWNoIGRlbSBlcnN0ZW4gQXVmcmFldW1lbiBub2NoKSA+ODAwIENhbGxvdXRzIGFsbGUKKyAgICAgICAvLyBPYmpla3RlIGtpbGxlbiwgZGllIG1laHIgYWxzIDUwIENhbGxvdXRzIGxhdWZlbiBoYWJlbiAtIHVuZAorICAgICAgIC8vIGRpZXNtYWwgemFlaGxlbiBDbG9uZXMgbmljaHQgZWlnZW5zdGFlbmRpZyEgRC5oLiBlcyB3ZXJkZW4gYWxsZQorICAgICAgIC8vIENsb25lcyBlaW5lciBCUCBnZWtpbGx0LCBkaWUgQ2FsbG91dHMgbGF1ZmVuIGhhYmVuLCBmYWxscyBhbGxlCisgICAgICAgLy8gZGllc2UgT2JqZWt0ZSBfenVzYW1tZW5fIG1laHIgYWxzIDUwIENhbGxvdXRzIGhhYmVuIQorICAgICAgIGlmICggZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0NBTExPVVRTKSA+IDgwMCApIHsKKyAgICAgICAgICAgLy8gemVyc3RvZXJ0ZSBPYmpla3RlIHZvbiBkZXIgbGV0enRlbiBBa3Rpb24gc2luZCBpbiBvYmplY3RtYXAgbmljaHQKKyAgICAgICAgICAgLy8gbWVociBkcmluLCBkYSBzaWUgZG9ydCBhbHMgS2V5cyB2ZXJ3ZW5kZXQgd3VyZGVuLgorICAgICAgICAgICBtYXBwaW5nIHBhdGhtYXA9KFtdKTsKKyAgICAgICAgICAgLy8gYWxsZSBPYmpla3QgZWluZXIgQlAgaW4gcmVzIHNvcnRpZXJlbiwgQlAtTmFtZSBhbHMgS2V5LCBBcnJheXMKKyAgICAgICAgICAgLy8gdm9uIE9iamVrdGVuIGFscyBXZXJ0ZS4KKyAgICAgICAgICAgd2Fsa19tYXBwaW5nKCBvYmplY3RtYXAsICMnX3NhbWVfcGF0aCwgJnBhdGhtYXApOworICAgICAgICAgICAvLyBhbGxlIEJQcyAodW5kIGlocmUgT2JqZWt0ZSkgcmF1c3N1Y2hlbiwgZGllIHp1dmllbGUgaGFiZW4uLi4KKyAgICAgICAgICAgcmVzID0gZmlsdGVyX2luZGljZXMoIHBhdGhtYXAsICMnX3Rvb19tYW55LyonKi8sIHBhdGhtYXAsIDUwICk7CisgICAgICAgICAgIC8vIHVuZCB1ZWJlciBhbGxlIEtleXMgZ2VoZW4sIGFuIF9kZXN0cm95KCkgd2VyZGVuIGRpZSBDbG9uZXMKKyAgICAgICAgICAgLy8gdWViZXJnZWJlbiwgZGllIENhbGxvdXRzIGhhYmVuLgorICAgICAgICAgICBpZiAoIHNpemVvZihyZXMpICkKKyAgICAgICAgICAgICAgd2Fsa19tYXBwaW5nKCByZXMsICMnX2Rlc3Ryb3kvKicqLywgIkNBTExfT1VUIG92ZXJmbG93IGJ5IGZpbGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiclcycuIERlc3RydWN0ZWQgJWQgb2JqZWN0cy4gWyVzXVxuIiwgMCApOworCisgICAgICAgICAgIC8vIFdlbm4gYmVpZGUgQXVmcmFldW1hcmJlaXRlbiBuaWNodHMgZ2VicmFjaHQgaGFiZW4gdW5kIGltbWVyCisgICAgICAgICAgIC8vIG5vY2ggPjEwMDAgQ2FsbG91dHMgbGF1ZmVuLCB3ZXJkZW4gZGllc21hbCBhbGxlIENhbGxvdXRzCisgICAgICAgICAgIC8vIGVpbmVyIFVJRCB6dXNhbW1lbmdlemFlaGx0LgorICAgICAgICAgICAvLyBBbGxlIE9iamVrdGUgZWluZXIgVUlELCBkaWUgZXMgaW4gU3VtbWUgYWxsZXIgaWhyZXIgT2JqZWt0IG1pdAorICAgICAgICAgICAvLyBDYWxsb3V0cyBhdWYgbWVociBhbHMgMTAwIENhbGxvdXRzIGJyaW5ndCwgd2VyZGVuIGdlcm9lc3RldC4KKyAgICAgICAgICAgaWYgKGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9DQUxMT1VUUykgPiAxMDAwKQorICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8vIGRhcyBuYWNoIEJQLU5hbWVuIHZvcmdlZmlsdGVydGUgTWFwcGluZyBqZXR6dCBuYWNoIFVJRHMKKyAgICAgICAgICAgICAgLy8genVzYW1tZW5zb3J0aWVyZW4uIFplcnN0b2VydGUgQ2xvbmVzIGZpbHRlciBfc2FtZV91aWQoKQorICAgICAgICAgICAgICAvLyByYXVzLgorICAgICAgICAgICAgICBtYXBwaW5nIHVpZG1hcD0oW10pOworICAgICAgICAgICAgICB3YWxrX21hcHBpbmcoIHBhdGhtYXAsICMnX3NhbWVfdWlkLCAmdWlkbWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltYm9sX2Z1bmN0aW9uKCAiY3JlYXRvcl9maWxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvc2VjdXJlL21hc3RlciIgKSApOworICAgICAgICAgICAgICAvLyBJbiByZXMgbnVuIFVJRHMgYWxzIEtleXMgdW5kIEFycmF5cyB2b24gT2JqZWt0ZW4gYWxzIFdlcnRlLgorICAgICAgICAgICAgICAvLyBEaWUgcmF1c2ZpbHRlcm4sIGRpZSBtZWhyIGFscyAxMDAgT2JqZWt0ZSAobm9uLXVuaXF1ZSwgZC5oLgorICAgICAgICAgICAgICAvLyAxMDAgQ2FsbG91dHMhKSBoYWJlbi4KKyAgICAgICAgICAgICAgcmVzID0gZmlsdGVyX2luZGljZXMoIHVpZG1hcCwgIydfdG9vX21hbnksIHVpZG1hcCwgMTAwICk7CisgICAgICAgICAgICAgIC8vIHVuZCBlcm5ldXQgdWViZXIgZGllIEtleXMgbGF1ZmVuIHVuZCBqZXdlaWxzIGRpZSBBcnJheXMgbWl0CisgICAgICAgICAgICAgIC8vIGRlbiBPYmpla3RlbiB6dXIgWmVyc3RvZXJ1bmcgYW4gX2Rlc3Ryb3koKS4uLgorICAgICAgICAgICAgICBpZiAoIHNpemVvZihyZXMpICkKKyAgICAgICAgICAgICAgICAgIHdhbGtfbWFwcGluZyggcmVzLCAjJ19kZXN0cm95LCAiQ0FMTF9PVVQgb3ZlcmZsb3cgYnkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVJRCAnJXMnLiBEZXN0cnVjdGVkICVkIG9iamVjdHMuIFslc11cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICk7CisgICAgICAgICAgIH0KKyAgICAgICB9CisgICAgfQorCisgICAgLy8gRmFsbHMgZGFzIGF1ZnJ1ZmVuZGUgT2JqZWt0IHplcnN0b2VydCB3dXJkZSBiZWltIEF1ZnJhZXVtZW4KKyAgICBpZiAoICFwcmV2aW91c19vYmplY3QoKSApCisgICAgICAgcmV0dXJuOworCisgICAgc2V0X3RoaXNfb2JqZWN0KCBwcmV2aW91c19vYmplY3QoKSApOworICAgIGFwcGx5KCAjJ2VmdW46OmNhbGxfb3V0LCBhcmdzICk7CisgICAgcmV0dXJuOworfQorCittaXhlZCBjYWxsX291dF9pbmZvKCkgeworICAKKyAgb2JqZWN0IHBvID0gcHJldmlvdXNfb2JqZWN0KCk7CisgIG1peGVkIGNvaSA9IGVmdW46OmNhbGxfb3V0X2luZm8oKTsKKworICAvLyB1bmdlZmlsdGVydGVuIE91dHB1dCBudXIgZnVlciBiZXN0aW1tdGUgT2JqZWt0ZSwgT2JqZWt0ZSBpbiAvc3RkIG9kZXIKKyAgLy8gL29iaiBoYWJlbiBkaWUgQmFja2JvbmVJRC4KKyAgaWYgKHF1ZXJ5X3dpel9sZXZlbChnZXR1aWQocG8pKSA+PSBBUkNIX0xWTAorICAgICAgIHx8IChzdHJpbmcpbWFzdGVyKCktPmNyZWF0b3JfZmlsZShsb2FkX25hbWUocG8pKSA9PSBCQUNLQk9ORUlEICkgeworICAgICAgcmV0dXJuIGNvaTsKKyAgfQorICBlbHNlIHsKKyAgICAgIHJldHVybiBmaWx0ZXIoY29pLCBmdW5jdGlvbiBtaXhlZCAobWl4ZWQgYXJyKSB7CisgICAgICAgICAgICAgIGlmIChwb2ludGVycChhcnIpICYmIGFyclswXT09cG8pCisgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICBlbHNlIHJldHVybiAwOyB9KTsKKyAgfQorfQorCisvLyAqIFp1IGVpbmVyIGNsb3N1cmUgZGFzIE9iamVrdCwgYW4gZGFzIHNpZSBnZWJ1bmRlbiBpc3QsIHN1Y2hlbgorbWl4ZWQgcXVlcnlfY2xvc3VyZV9vYmplY3QoY2xvc3VyZSBjKSB7CisgIHJldHVybgorICAgIENMT1NVUkVfSVNfVU5CT1VORF9MQU1CREEoZ2V0X3R5cGVfaW5mbyhjLCAxKSkgPworICAgICAgMCA6CisgICh0b19vYmplY3QoYykgfHwgLTEpOworfQorCisvLyAqIFdpciB3b2xsZW4gbnVyIEVJTiBBcmd1bWVudCAuLi4gYXVzc2VyZGVtIGNoZWNrcyBmdWVyIGRlbiBOZXR6dG90ZW5yYXVtCit2YXJhcmdzIHZvaWQgbW92ZV9vYmplY3QobWl4ZWQgd2hhdCwgbWl4ZWQgd2hlcmUpCit7CisgIG9iamVjdCBwbyx0bXA7CisKKyAgcG89cHJldmlvdXNfb2JqZWN0KCk7CisgIGlmICghd2hlcmUpCisgIHsKKyAgICB3aGVyZT13aGF0OworICAgIHdoYXQ9cG87CisgIH0KKyAgaWYgKCgoc3RyaW5ncCh3aGVyZSkgJiYgd2hlcmU9PU5FVERFQURfUk9PTSApIHx8CisgICAgICAgKG9iamVjdHAod2hlcmUpICYmIHdoZXJlPT1maW5kX29iamVjdChORVRERUFEX1JPT00pKSkgJiYKKyAgICAgICBvYmplY3RwKHdoYXQpICYmIG9iamVjdF9uYW1lKHdoYXQpIT0iL29iai9zcGVycmVyIikKKyAgeworICAgIGlmICghcXVlcnlfb25jZV9pbnRlcmFjdGl2ZSh3aGF0KSkKKyAgICB7CisgICAgICB3aGF0LT5yZW1vdmUoKTsKKyAgICAgIGlmICh3aGF0KSBkZXN0cnVjdCh3aGF0KTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKGxpdmluZyh3aGF0KSB8fCBpbnRlcmFjdGl2ZSh3aGF0KSkKKyAgICB7CisgICAgICBsb2dfZmlsZSgiTkRFQUQyIixzcHJpbnRmKCJUUllFRCBUTyBNT1ZFIFRPIE5FVERFQUQ6ICVPXG4iLHdoYXQpKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgc2V0X29iamVjdF9oZWFydF9iZWF0KHdoYXQsMCk7CisgIH0KKyAgdG1wPXdoYXQ7CisgIHdoaWxlICh0bXA9ZW52aXJvbm1lbnQodG1wKSkKKyAgICAgIC8vIEphLiBNYW4gcnVmdCBkaWUgX3NldF94eHgoKS1GdW5rdGlvbmVuIGVpZ2VudGxpY2ggbmljaHQgZGlyZWt0IGF1Zi4KKyAgICAgIC8vIEFiZXIgZGFzIExpY2h0c3lzdGVtIGlzdCBzY2hvbiAqc28qIHJlY2hlbmludGVuc2l2IHVuZCBnZXJhZGUgZGVyCisgICAgICAvLyBQX0xBU1RfQ09OVEVOVF9DSEFOR0UtQ2FjaGUgd2lyZCAqc28qIG9mdCBiZW5vZXRpZ3QsIGRhc3MgZXMgbWlyCisgICAgICAvLyBkYSB1bSBqZWRlcyBiaXNzY2hlbiBSZWNoZW56ZWl0IGdlaHQuCisgICAgICAvLyBEZXIgWndlY2sgaGVpbGlndCBqYSBiZWthbm50bGljaCBkaWUgTWl0dGVsLiA7LSkKKyAgICAgIC8vCisgICAgICAvLyBUaWFtYWsKKyAgICB0bXAtPl9zZXRfbGFzdF9jb250ZW50X2NoYW5nZSgpOworICBmdW5jYWxsKGJpbmRfbGFtYmRhKCMnZWZ1bjo6bW92ZV9vYmplY3QscG8pLHdoYXQsd2hlcmUpOworICBpZiAodG1wPXdoYXQpCisgICAgd2hpbGUgKHRtcD1lbnZpcm9ubWVudCh0bXApKQorICAgICAgdG1wLT5fc2V0X2xhc3RfY29udGVudF9jaGFuZ2UoKTsKK30KKworCit2b2lkIHN0YXJ0X3NpbXVsX2VmdW4oKSB7CisgIG1peGVkICppbmZvOworCisgIC8vIEZhbGxzIG5vY2ggbmljaHQgZ2V0YW4sIGV4dHJhX3dpemluZm8gaW5pdGlhbGlzaWVyZW4KKyAgaWYgKCAhcG9pbnRlcnAoaW5mbyA9IGdldF9leHRyYV93aXppbmZvKDApKSApCisgICAgc2V0X2V4dHJhX3dpemluZm8oMCwgaW5mbyA9IGFsbG9jYXRlKEJBQ0tCT05FX1dJWklORk9fU0laRSkpOworCisgIEluaXRMaXZpbmdEYXRhKGluZm8pOworCisgIHNldF9uZXh0X3Jlc2V0KDEwKTsgLy8gZGlyZWt0IG1hbCBhdWZyYWV1bWVuCit9CisKK3Byb3RlY3RlZCB2b2lkIHJlc2V0KCkgeworICBzZXRfbmV4dF9yZXNldCg3MjAwKTsKKyAgQ2xlYW5MaXZpbmdEYXRhKCk7Cit9CisKKyNpZiAhX19FRlVOX0RFRklORURfXyhhYnNvbHV0ZV9oYl9jb3VudCkKK2ludCBhYnNvbHV0ZV9oYl9jb3VudCgpIHsKKyAgcmV0dXJuIGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9IRUFSVEJFQVRfVE9UQUxfQ1lDTEVTKTsKK30KKyNlbmRpZgorCit2b2lkIF9fc2V0X2Vudmlyb25tZW50KG9iamVjdCBvYiwgbWl4ZWQgdGFyZ2V0KQoreworICBzdHJpbmcgcGF0aDsKKyAgb2JqZWN0IG9iajsKKworICBpZiAoIW9iamVjdHAob2IpKQorICAgIHJldHVybjsKKyAgaWYgKCFJU19BUkNIKGdldGV1aWQocHJldmlvdXNfb2JqZWN0KCkpKSB8fCAhQVJDSF9TRUNVUklUWSApCisgICAgcmV0dXJuOworICBpZiAob2JqZWN0cCh0YXJnZXQpKQorICB7CisgICAgZWZ1bjo6c2V0X2Vudmlyb25tZW50KG9iLHRhcmdldCk7CisgICAgcmV0dXJuOworICB9CisgIHBhdGg9KHN0cmluZylNQVNURVItPl9nZXRfcGF0aCh0YXJnZXQsdGhpc19pbnRlcmFjdGl2ZSgpKTsKKyAgaWYgKHN0cmluZ3AocGF0aCkgJiYgZmlsZV9zaXplKHBhdGgrIi5jIik+PTAgJiYKKyAgICAgICFjYXRjaChsb2FkX29iamVjdChwYXRoKTtwdWJsaXNoKSApCisgIHsKKyAgICBvYmo9ZmluZF9vYmplY3QocGF0aCk7CisgICAgZWZ1bjo6c2V0X2Vudmlyb25tZW50KG9iLG9iaik7CisgICAgcmV0dXJuOworICB9Cit9CisKK3ZvaWQgX2R1bXBfd2l6bGlzdChzdHJpbmcgZmlsZSwgaW50IHNvcnRieSkgeworICBpbnQgaTsKKyAgbWl4ZWQgKmE7CisKKyAgaWYgKCFMT1JEX1NFQ1VSSVRZKQorICAgIHJldHVybjsKKyAgaWYgKCFtYXN0ZXIoKS0+dmFsaWRfd3JpdGUoZmlsZSxnZXRldWlkKHByZXZpb3VzX29iamVjdCgpKSwid3JpdGVfZmlsZSIpKQorICB7CisgICAgd3JpdGUoIk5PIFdSSVRFIFBFUk1JU1NJT05cbiIpOworICAgIHJldHVybjsKKyAgfQorICBhID0gd2l6bGlzdF9pbmZvKCk7CisgIGEgPSBzb3J0X2FycmF5KGEsIGxhbWJkYSggKHsnYSwnYn0pLAorICAgICAgICAgICAgICAgICAgICAgICAgKHsjJzwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICh7IydbLCdhLHNvcnRieX0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoeyMnWywnYixzb3J0Ynl9KQorICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSk7CisgIHJtKGZpbGUpOworICBmb3IgKGk9c2l6ZW9mKGEpLTE7aT49MDtpLS0pCisgICAgd3JpdGVfZmlsZShmaWxlLHNwcmludGYoIiUtMTFzOiBldmFsPSUtOGQgY21kcz0lLTZkIEhCcz0lLTVkIGFycmF5PSUtNWQgbWFwcGluZz0lLTdkXG4iLAorICAgICAgYVtpXVtXTF9OQU1FXSxhW2ldW1dMX1RPVEFMX0NPU1RdLGFbaV1bV0xfQ09NTUFORFNdLGFbaV1bV0xfSEVBUlRfQkVBVFNdLAorICAgICAgYVtpXVtXTF9BUlJBWV9UT1RBTF0sYVtpXVtXTF9DQUxMX09VVF0pKTsKK30KKworcHVibGljIHZhcmFyZ3Mgb2JqZWN0IGRlZXBfcHJlc2VudChtaXhlZCB3aGF0LCBvYmplY3Qgb2IpIHsKKworICBpZighb2JqZWN0cChvYikpCisgICAgb2I9cHJldmlvdXNfb2JqZWN0KCk7CisgIC8vIFdlbm4gZWluIE9iamVrdCBnZXN1Y2h0IHdpcmQ6IEFsbGUgRW52cyBkaWVzZXMgT2JqZWt0cyBlcm1pdHRlbG4gdW5kCisgIC8vIHNjaGF1ZW4sIG9iIGluIGRpZXNlbiBvYiB2b3Jrb21tdC4gRGFubiBpc3Qgd2hhdCBpbiBvYiBlbnRoYWx0ZW4uCisgIGlmKG9iamVjdHAod2hhdCkpIHsKKyAgICBvYmplY3QgKmVudnM9YWxsX2Vudmlyb25tZW50KHdoYXQpOworICAgIC8vIHdlbm4gb2Iga2VpbiBFbnZpcm9ubWVudCBoYXQsIGlzdCBlcyBvZmZlbnNpY2h0bGljaCBuaWNodCBpbiB3aGF0CisgICAgLy8gZW50aGFsdGVuLgorICAgIGlmICghcG9pbnRlcnAoZW52cykpIHJldHVybiAwOworICAgIGlmIChtZW1iZXIoZW52cywgb2IpICE9IC0xKSByZXR1cm4gd2hhdDsKKyAgfQorICAvLyBzb25zdCB3aXJkcyB0ZXVyZXIsIHVlYmVyIGFsbGUgT2JqZWt0ZSBpbSAoZGVlcCkgSW52IGxhdWZlbiB1bmQgcGVyIGlkKCkKKyAgLy8gdGVzdGVuLiBEYWJlaSBtdXNzIGFiZXIgZGllIGdld3VlbnNjaHRlIE5yLiAoImZsYXNjaGUgMyIpIGFiZ2VzY2huaXR0ZW4KKyAgLy8gd2VyZGVuIHVuZCBzZWxiZXIgZ2V6YWVobHQgd2VyZGVuLCB3ZWxjaGUgZGFzIGVudHNwcmVjaGVuZGUgT2JqZWt0IGlzdC4KKyAgZWxzZSBpZiAoc3RyaW5ncCh3aGF0KSkgeworICAgICAgaW50IGNudDsKKyAgICAgIHN0cmluZyBuZXd3aGF0OworICAgICAgaWYoc3NjYW5mKHdoYXQsIiVzICVkIixuZXd3aGF0LGNudCkhPTIpCisgICAgICAgY250PTE7CisgICAgICBlbHNlCisgICAgICAgd2hhdD1uZXd3aGF0OworICAgICAgZm9yZWFjaChvYmplY3QgaW52b2I6IGRlZXBfaW52ZW50b3J5KG9iKSkgeworICAgICAgIGlmIChpbnZvYi0+aWQod2hhdCkgJiYgIS0tY250KQorICAgICAgICAgICByZXR1cm4gaW52b2I7CisgICAgICB9CisgIH0KKyAgZWxzZSB7CisgICAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKKyAgICByYWlzZV9lcnJvcihzcHJpbnRmKCJXcm9uZyBhcmd1bWVudCAxIHRvIGRlZXBfcHJlc2VudCgpLiAiCisgICAgICAgICAiRXhwZWN0ZWQgXCJvYmplY3RcIiBvciBcInN0cmluZ1wiLCBnb3QgJS41ME8uXG4iLAorICAgICAgICAgd2hhdCkpOworICB9CisgIHJldHVybiAwOworfQorCittYXBwaW5nIGR1bXBfaXBfbWFwcGluZygpCit7CisgIHJldHVybiAwOworfQorCitub21hc2sgdm9pZCBzd2FwKG9iamVjdCBvYmopCit7CisgIHdyaXRlKCJZb3VyIGFyZSBub3QgYWxsb3dlZCB0byBzd2FwIG9iamVjdHMgYnkgaGFuZCFcbiIpOworICByZXR1cm47Cit9CisKK25vbWFzayB2YXJhcmdzIHZvaWQgZ2FyYmFnZV9jb2xsZWN0aW9uKHN0cmluZyBzdHIpCit7CisgIGlmKHByZXZpb3VzX29iamVjdCgpPT0wIHx8ICFJU19BUkNIKGdldGV1aWQocHJldmlvdXNfb2JqZWN0KCkpKSAKKyAgICAgIHx8ICFBUkNIX1NFQ1VSSVRZKQorICB7CisgICAgd3JpdGUoIkNhbGwgR0Mgbm93IGFuZCB0aGUgbXVkIHdpbGwgY3Jhc2ggaW4gNS02IGhvdXJzLiBET05UIERPIElUIVxuIik7CisgICAgcmV0dXJuOworICB9CisgIGVsc2UgaWYgKHN0cmluZ3Aoc3RyKSkKKyAgeworICAgIHJldHVybiBlZnVuOjpnYXJiYWdlX2NvbGxlY3Rpb24oc3RyKTsKKyAgfQorICBlbHNlIAorICAgIHJldHVybiBlZnVuOjpnYXJiYWdlX2NvbGxlY3Rpb24oKTsKK30KKwordmFyYXJncyB2b2lkIG5vdGlmeV9mYWlsKG1peGVkIG5mLCBpbnQgcHJpbykgeworICBvYmplY3QgcG8sb2xkbzsKKyAgaW50IG9sZHByaW87CisgIAorICBpZiAoIVBMIHx8ICFvYmplY3RwKHBvPXByZXZpb3VzX29iamVjdCgpKSkgcmV0dXJuOworICBpZiAoIXN0cmluZ3AobmYpICYmICFjbG9zdXJlcChuZikpIHsKKyAgICAgIHNldF90aGlzX29iamVjdChwbyk7CisgICAgICByYWlzZV9lcnJvcihzcHJpbnRmKAorICAgICAgICAgIk9ubHkgc3RyaW5ncyBhbmQgY2xvc3VyZXMgYWxsb3dlZCBmb3Igbm90aWZ5X2ZhaWwhICIKKyAgICAgICAgICJBcmd1bWVudCB3YXM6ICUuNTBPLi4uXG4iLG5mKSk7CisgIH0KKworICAvLyBmYWxscyBlaW4gT2JqZWt0IGJlcmVpdHMgbmVuIG5vdGlmeV9mYWlsKCkgc2V0enRlLCBQcmlvcml0YWV0ZW4gYWJzY2hhZXR6ZW4KKyAgLy8gdW5kIHZlcmdsZWljaGVuLgorICBpZiAob2JqZWN0cChvbGRvPXF1ZXJ5X25vdGlmeV9mYWlsKDEpKSAmJiBwbyE9b2xkbykgeworICAgIGlmICghcHJpbykgeyAgICAgICAKKyAgICAgIC8vUHJpb3JpdGFldCBkaWVzZXMgbm90aWZ5X2ZhaWwoKSAnYWJzY2hhZXR6ZW4nCisgICAgICBpZiAocG89PVBMKSAvLyBTcGllbGVyLWludGVybmUgKHNvdWwtY21kcykKKyAgICAgICAgcHJpbz1ORl9OTF9PV047CisgICAgICBlbHNlIGlmIChsaXZpbmcocG8pKQorICAgICAgICBwcmlvPU5GX05MX0xJVklORzsKKyAgICAgIGVsc2UgaWYgKChpbnQpcG8tPklzUm9vbSgpKQorICAgICAgICBwcmlvPU5GX05MX1JPT007CisgICAgICBlbHNlCisgICAgICAgIHByaW89TkZfTkxfVEhJTkc7CisgICAgfQorICAgIC8vUHJpb3JpdGFldCBkZXMgYWx0ZW4gU2V0emVycyBhYnNjaGFldHplbgorICAgIGlmIChvbGRvPT1QTCkKKyAgICAgIG9sZHByaW89TkZfTkxfT1dOOworICAgIGVsc2UgaWYgKGxpdmluZyhvbGRvKSkKKyAgICAgIG9sZHByaW89TkZfTkxfTElWSU5HOworICAgIGVsc2UgaWYgKChpbnQpb2xkby0+SXNSb29tKCkpCisgICAgICBvbGRwcmlvPU5GX05MX1JPT007CisgICAgZWxzZQorICAgICAgb2xkcHJpbz1ORl9OTF9USElORzsKKyAgfQorICBlbHNlIC8vIHdlbm4gZXMgbm9jaCBrZWluIE5vdGlmeV9mYWlsIGdpYnQ6CisgICAgb2xkcHJpbz1ORl9OTF9OT05FOworCisgIC8vdmVyZ2xlaWNoZW4gdW5kIGdnZi4gc2V0emVuCisgIGlmIChwcmlvID49IG9sZHByaW8pIHsgCisgICAgc2V0X3RoaXNfb2JqZWN0KHBvKTsKKyAgICBlZnVuOjpub3RpZnlfZmFpbChuZik7CisgIH0KKworICByZXR1cm47Cit9CisKK3ZvaWQgX25vdGlmeV9mYWlsKHN0cmluZyBzdHIpCit7CisgIC8vcXVlcnlfbm90aWZ5X2ZhaWwoKSBiZW51dHplbiwgdW0gZGFzIE9iamVrdAorICAvL2RlcyBsZXR6dGVuIG5vdGlmeV9mYWlsKCkgenUgZXJtaXR0ZWxuCisgIG9iamVjdCBvOworICBpZiAoKG89cXVlcnlfbm90aWZ5X2ZhaWwoMSkpICYmIG8hPXByZXZpb3VzX29iamVjdCgpKQorICAgIHJldHVybjsKKyAgLy9ub2NoIGtlaW4gbm90aWZ5X2ZhaWwoKSBmdWVyIGRpZXNlcyBLb21tYW5kbyBnZXNldHp0LCBhdWYgZ2VodHMuCisgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CisgIGVmdW46Om5vdGlmeV9mYWlsKHN0cik7CisgIHJldHVybjsKK30KKworc3RyaW5nIHRpbWUyc3RyaW5nKCBzdHJpbmcgZm9ybWF0LCBpbnQgemVpdCApCit7CisgIGludCBpLGNoLG1heHVuaXQsZHVtbXk7CisgIHN0cmluZyAqcGFydHMsIGZtdDsKKworICBpbnQgc2VjcyA9IHplaXQ7CisgIGludCBtaW5zID0gKHplaXQvNjApOworICBpbnQgaG91cnMgPSAoemVpdC8zNjAwKTsKKyAgaW50IGRheXMgPSAoemVpdC84NjQwMCk7CisgIGludCB3ZWVrcyA9ICAoemVpdC82MDQ4MDApOworICBpbnQgbW9udGhzID0gKHplaXQvMjQxOTIwMCk7CisgIGludCBhYmJyID0gMDsKKworICBwYXJ0cyA9IHJlZ2V4cGxvZGUoIGZvcm1hdCwgIlwoJVwoLXxcKVswLTldKltud2RobXN4TldESE1TWF1cKXxcKCUlXCkiICk7CisKKyAgZm9yKCBpPTE7IGk8c2l6ZW9mKHBhcnRzKTsgaSs9MiApCisgIHsKKyAgICBjaCA9IHBhcnRzW2ldWzwxXTsKKyAgICBzd2l0Y2goIHBhcnRzW2ldWzwxXSApCisgICAgeworICAgIGNhc2UgJ3gnOiBjYXNlICdYJzoKKyAgICAgICBhYmJyID0gc3NjYW5mKCBwYXJ0c1tpXSwgIiUlJWQiLCBkdW1teSApICYmIGR1bW15PT0wOworICAgICAgIC8vIE5PIGJyZWFrICEKKyAgICBjYXNlICduJzogY2FzZSAnTic6CisgICAgICAgbWF4dW5pdCB8PSAzMTsKKyAgICAgICBicmVhazsKKyAgICBjYXNlICd3JzogY2FzZSAnVyc6CisgICAgICAgbWF4dW5pdCB8PSAxNTsKKyAgICAgICBicmVhazsKKyAgICBjYXNlICdkJzogY2FzZSAnRCc6CisgICAgICAgbWF4dW5pdCB8PSA3OworICAgICAgIGJyZWFrOworICAgIGNhc2UgJ2gnOiBjYXNlICdIJzoKKyAgICAgICBtYXh1bml0IHw9IDM7CisgICAgICAgYnJlYWs7CisgICAgY2FzZSAnbSc6IGNhc2UgJ00nOgorICAgICAgIG1heHVuaXQgfD0gMTsKKyAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgaWYoIG1heHVuaXQgJiAxNiApIHdlZWtzICU9IDQ7CisgIGlmKCBtYXh1bml0ICYgOCApIGRheXMgJT0gNzsKKyAgaWYoIG1heHVuaXQgJiA0ICkgaG91cnMgJT0gMjQ7CisgIGlmKCBtYXh1bml0ICYgMiApIG1pbnMgJT0gNjA7CisgIGlmKCBtYXh1bml0ICkgc2VjcyAlPSA2MDsKKworICBmb3IoIGk9MTsgaTxzaXplb2YocGFydHMpOyBpKz0yICkKKyAgeworICAgIGZtdCA9IHBhcnRzW2ldWzAuLjwyXTsKKyAgICBjaCA9IHBhcnRzW2ldWzwxXTsKKyAgICBpZiggY2g9PSd4JyApCisgICAgeworICAgICAgaWYgKG1vbnRocyA+IDApIGNoPSduJzsKKyAgICAgIGVsc2UgaWYoIHdlZWtzPjAgKSBjaD0ndyc7CisgICAgICBlbHNlIGlmKCBkYXlzPjAgKSBjaD0nZCc7CisgICAgICBlbHNlIGlmKCBob3Vycz4wICkgY2g9J2gnOyAKKyAgICAgIGVsc2UgaWYobWlucyA+IDApIGNoID0gJ20nOworICAgICAgZWxzZSBjaCA9ICdzJzsKKyAgICB9CisgICAgZWxzZSBpZiggY2g9PSdYJyApCisgICAgeworICAgICAgaWYgKG1vbnRocyA+IDApIGNoPSdOJzsKKyAgICAgIGVsc2UgaWYoIHdlZWtzPjAgKSBjaD0nVyc7CisgICAgICBlbHNlIGlmKCBkYXlzPjAgKSBjaD0nRCc7CisgICAgICBlbHNlIGlmKCBob3Vycz4wICkgY2g9J0gnOyAKKyAgICAgIGVsc2UgaWYobWlucyA+IDApIGNoID0gJ00nOworICAgICAgZWxzZSBjaCA9ICdTJzsKKyAgICB9CisgICAgCisgICAgc3dpdGNoKCBjaCApCisgICAgeworICAgICAgY2FzZSAnbic6IHBhcnRzW2ldID0gc3ByaW50ZiggZm10KyJkIiwgbW9udGhzICk7IGJyZWFrOworICAgICAgY2FzZSAndyc6IHBhcnRzW2ldID0gc3ByaW50ZiggZm10KyJkIiwgd2Vla3MgKTsgYnJlYWs7CisgICAgICBjYXNlICdkJzogcGFydHNbaV0gPSBzcHJpbnRmKCBmbXQrImQiLCBkYXlzICk7IGJyZWFrOworICAgICAgY2FzZSAnaCc6IHBhcnRzW2ldID0gc3ByaW50ZiggZm10KyJkIiwgaG91cnMgKTsgYnJlYWs7CisgICAgICBjYXNlICdtJzogcGFydHNbaV0gPSBzcHJpbnRmKCBmbXQrImQiLCBtaW5zICk7IGJyZWFrOworICAgICAgY2FzZSAncyc6IHBhcnRzW2ldID0gc3ByaW50ZiggZm10KyJkIiwgc2VjcyApOyBicmVhazsKKyAgICAgIGNhc2UgJ04nOgorICAgICAgIGlmKGFiYnIpIHBhcnRzW2ldID0gIk0iOworICAgICAgIGVsc2UgcGFydHNbaV0gPSBzcHJpbnRmKCBmbXQrInMiLCAobW9udGhzPT0xKSA/ICJNb25hdCIgOiAiTW9uYXRlIiApOworICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnVyc6CisgICAgICAgaWYoYWJicikgcGFydHNbaV0gPSAidyI7IGVsc2UKKyAgICAgICBwYXJ0c1tpXSA9IHNwcmludGYoIGZtdCsicyIsICh3ZWVrcz09MSkgPyAiV29jaGUiIDogIldvY2hlbiIgKTsKKyAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ0QnOgorICAgICAgIGlmKGFiYnIpIHBhcnRzW2ldID0gImQiOyBlbHNlCisgICAgICAgcGFydHNbaV0gPSBzcHJpbnRmKCBmbXQrInMiLCAoZGF5cz09MSkgPyAiVGFnIiA6ICJUYWdlIiApOworICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnSCc6CisgICAgICAgaWYoYWJicikgcGFydHNbaV0gPSAiaCI7IGVsc2UKKyAgICAgICBwYXJ0c1tpXSA9IHNwcmludGYoIGZtdCsicyIsIChob3Vycz09MSkgPyAiU3R1bmRlIiA6ICJTdHVuZGVuIiApOworICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnTSc6CisgICAgICAgaWYoYWJicikgcGFydHNbaV0gPSAibSI7IGVsc2UKKyAgICAgICBwYXJ0c1tpXSA9IHNwcmludGYoIGZtdCsicyIsIChtaW5zPT0xKSA/ICJNaW51dGUiIDogIk1pbnV0ZW4iICk7CisgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdTJzoKKyAgICAgICBpZihhYmJyKSBwYXJ0c1tpXSA9ICJzIjsgZWxzZQorICAgICAgIHBhcnRzW2ldID0gc3ByaW50ZiggZm10KyJzIiwgKHNlY3M9PTEpID8gIlNla3VuZGUiIDogIlNla3VuZGVuIiApOworICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnJSc6CisgICAgICAgcGFydHNbaV0gPSAiJSI7CisgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBpbXBsb2RlKCBwYXJ0cywgIiIgKTsKK30KKworbm9tYXNrIG1peGVkIF9fY3JlYXRlX3BsYXllcl9kdW1teShzdHJpbmcgbmFtZSkKK3sKKyAgc3RyaW5nIGVycjsKKyAgb2JqZWN0IG9iOworICBtaXhlZCBtOworICAvL2hhdCBuZW4gU2NoZXJ6a2VrcyBkaWUgQmx1ZXByaW50IGJld2VndD8KKyAgaWYgKChvYj1maW5kX29iamVjdCgiL3NlY3VyZS9sb2dpbiIpKSAmJiBlbnZpcm9ubWVudChvYikpCisgICAgICBjYXRjaChkZXN0cnVjdChvYik7cHVibGlzaCk7CisgIGVyciA9IGNhdGNoKG9iID0gY2xvbmVfb2JqZWN0KCJzZWN1cmUvbG9naW4iKTtwdWJsaXNoKTsKKyAgaWYgKGVycikKKyAgeworICAgIHdyaXRlKCJGZWhsZXIgYmVpbSBMYWRlbiB2b24gL3NlY3VyZS9sb2dpbi5jXG4iK2VycisiXG4iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAob2JqZWN0cChtPShtaXhlZClvYi0+bmV3X2xvZ29uKG5hbWUpKSkgbmV0ZGVhZFtuYW1lXT1tOworICByZXR1cm4gbTsKK30KKworbm9tYXNrIGludCBzZWN1cmVfbGV2ZWwoKQoreworICBpbnQgKmxldmVsOworICAvL2tldHRlIGRlciBDYWxsZXIgZHVyY2hsYXVmZW4sIGRlbiBuaWVkcmlnc3RlbiBMZXZlbCBpbiBkZXIgS2V0dGUKKyAgLy96dXJ1ZWNrZ2ViZW4uIFplcnN0b2VydGUgT2JqZWt0ZSAoU2VsYnN0emVyc3RvZXJlcikgZnVlaHJlbiB6dXIgUnVlY2tnYWJlCisgIC8vdm9uIDAuCisgIC8vY2FsbGVyX3N0YWNrKDEpIGZ1ZWd0IGRlbSBSdWVja2dhYmVhcnJheSB0aGlzX2ludGVyYWN0aXZlKCkgaGluenUgYnp3LiAwLAorICAvL3dlbm4gZXMga2VpbmVuIEludGVyYWN0aXZlIGdpYnQuIERpZSAwIGZ1ZWhydCBkYW5uIHdpZSBiZWkgemVyc3RvZXJ0ZW4KKyAgLy9PYmpla3RlbiB6dXIgUnVlY2tnYWJlIHZvbiAwLCB3YXMgZ2V3dWVuc2NodCBpc3QsIGRhIGVzIGhpZXIgZWluZW4KKyAgLy9JTnRlcmFjdGl2ZSBnZWJlbiBtdXNzLgorICBsZXZlbD1tYXAoY2FsbGVyX3N0YWNrKDEpLGZ1bmN0aW9uIGludCAob2JqZWN0IGNhbGxlcikKKyAgICAgIHtpZiAob2JqZWN0cChjYWxsZXIpKQorICAgICAgIHJldHVybihxdWVyeV93aXpfbGV2ZWwoZ2V0ZXVpZChjYWxsZXIpKSk7CisgICAgICAgcmV0dXJuKDApOyAvLyBrZWluIE9iamVrdCBkYSwgMC4KKyAgICAgIH0gKTsKKyAgcmV0dXJuKG1pbihsZXZlbCkpOyAvL2RlbiBrbGVpbnN0ZW4gV2VydCBpbSBBcnJheSB6dXJ1ZWNrZ2ViZW4gKGdnZi4gMCkKK30KKworbm9tYXNrIHN0cmluZyBzZWN1cmVfZXVpZCgpCit7CisgIHN0cmluZyBldWlkOworCisgIGlmICghdGhpc19pbnRlcmFjdGl2ZSgpKSAvLyBFcyBtdXNzIGVpbmVuIGludGVyYWN0aXZlIGdlYmVuCisgICAgIHJldHVybiAwOworICBldWlkPWdldGV1aWQodGhpc19pbnRlcmFjdGl2ZSgpKTsKKyAgLy8gdWViZXIgYWxsZSBDYWxsZXIgaXRlcmllcmVuLiBXZW5uIGVpbmVzIGRhdm9uIGVpbmUgYW5kZXJlIGV1aWQgaGF0IGFscworICAvLyBkZXIgSW50ZXJhY3RpdmUgdW5kIGRpZXNlIG5pY2h0IGRpZSBST09USUQgaXN0LCB3aXJkIDAgenVydWVja2dlYmVuLgorICAvLyBFYmVuc28sIGZhbGxzIGVpbiBTZWxic3R6ZXJzdG9lcmVyIGlyZ2VuZHdvIGluIGRlciBLZXR0ZSBpc3QuCisgIGZvcmVhY2gob2JqZWN0IGNhbGxlcjogY2FsbGVyX3N0YWNrKCkpIHsKKyAgICAgIGlmICghb2JqZWN0cChjYWxsZXIpIHx8CisgICAgICAgKGdldGV1aWQoY2FsbGVyKSE9ZXVpZCAmJiBnZXRldWlkKGNhbGxlcikhPVJPT1RJRCkpCisgICAgICAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gZXVpZDsgLy8gJ3NpY2hlcmUnIGV1aWQgenVydWVja2dlYmVuCit9CisKKy8vIElOUFVUX1BST01QVCB1bmQgbmVuIExlZXJwcm9tcHQgaGluenVmdWVnZW4sIHdlbm4ga2VpbnMgdWViZXJnZWJlbiB3aXJkLgorLy8gRGFzIHNvbGwgZGF6dSBkaWVuZW4sIGRhc3MgYWxsZSBnZ2YuIGVpbiBFT1IgYW0gUHJvbXB0ZW5kZSBrcmllZ2VuLi4uCisvLyNpZiBfX0JPT1RfVElNRV9fIDwgMTM2MDAxNzIxMwordmFyYXJncyB2b2lkIGlucHV0X3RvKCBtaXhlZCBmdW4sIGludCBmbGFncywgdmFyYXJncyBtaXhlZCAqYXJncyApCit7CisgICAgbWl4ZWQgKmFycjsKKyAgICBpbnQgaTsKKworICAgIGlmICggIXRoaXNfcGxheWVyKCkgfHwgIXByZXZpb3VzX29iamVjdCgpICkKKyAgICAgICByZXR1cm47CisKKyAgICAvLyBUT0RPOiBpbnB1dF90byguLi4sSU5QVVRfUFJPTVBULCAiIiwgLi4uKSwgd2VubiBrZWluIElOUFVUX1BST01QVAorICAgIC8vIHZvcmtvbW10Li4uCisgICAgaWYgKCBmbGFncyZJTlBVVF9QUk9NUFQgKSB7ICAgIAorICAgICAgICBhcnIgPSAoeyBmdW4sIGZsYWdzIH0pICsgYXJnczsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8vIGdnZi4gZWluIElOUFVUX1BST01QVCBoaW56dWZ1ZWdlbiB1bmQgbmVuIExlZXJzdHJpbmcgYWxzIFByb21wdC4KKyAgICAgICAgZmxhZ3MgfD0gSU5QVVRfUFJPTVBUOworICAgICAgICBhcnIgPSAoeyBmdW4sIGZsYWdzLCAiIiB9KSArIGFyZ3M7CisgICAgfQorCisgICAgLy8gQXJyYXlzIGdlZ2VuIGZsYXR0ZW4gcXVvdGVuLgorICAgIGZvciAoIGkgPSBzaXplb2YoYXJyKSAtIDE7IGkgPiAxOyBpLS0gKQorICAgICAgIGlmICggcG9pbnRlcnAoYXJyW2ldKSApCisgICAgICAgICAgIGFycltpXSA9IHF1b3RlKGFycltpXSk7CisKKyAgICBhcHBseSggYmluZF9sYW1iZGEoIHVuYm91bmRfbGFtYmRhKCAoe30pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh7ICMnZWZ1bjo6aW5wdXRfdG8vKicqLyB9KSArIGFyciApLAorICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c19vYmplY3QoKSApICk7Cit9CisvLyNlbmRpZgorCitub21hc2sgaW50IHNldF9saWdodChpbnQgaSkKKy8vIGVyaG9laHQgZGFzIExpY2h0bGV2ZWwgZWluZXMgT2JqZWt0cyB1bSBpCisvLyByZXN1bHQ6IGRhcyBMaWNodGxldmVsIGlubmVyaGFsYiBkZXMgT2JqZWt0cworeworICAgIG9iamVjdCBvYiwgKmludjsKKyAgICBpbnQgbGFsbCwgbGlnaHQsIGRhcmssIHRtcDsKKworICAgIGlmICghKG9iPXByZXZpb3VzX29iamVjdCgpKSkgcmV0dXJuIDA7IC8vIG9obmUgZGFzIGdlaHRzIG5pY2h0LgorCisgICAgLy8gYXVzIGtvbXBhdGliaWxpdGFldHNncnVlbmRlbiBrYW5uIG1hbiBhdWNoIGRlbiBMaWNodGxldmVsIG5vY2ggc2V0emVuCisgICAgaWYgKGkhPTApIG9iLT5TZXRQcm9wKFBfTElHSFQsIG9iLT5RdWVyeVByb3AoUF9MSUdIVCkraSk7CisKKyAgICAvLyBMaWNodGJlcmVjaG51bmcgZmluZGV0IGVpZ2VudGxpY2ggaW4gZGVyIE11ZGxpYiBzdGF0dC4KKyAgICByZXR1cm4gKGludClvYi0+UXVlcnlQcm9wKFBfSU5UX0xJR0hUKTsKK30KKworCitwdWJsaWMgc3RyaW5nIGlzbzJhc2NpaSggc3RyaW5nIHN0ciApCit7CisgICAgaWYgKCAhc3RyaW5ncChzdHIpIHx8ICFzaXplb2Yoc3RyKSApCisgICAgICAgcmV0dXJuICIiOworCisgICAgc3RyID0gcmVncmVwbGFjZSggc3RyLCAi5CIsICJhZSIsIDEgKTsKKyAgICBzdHIgPSByZWdyZXBsYWNlKCBzdHIsICL2IiwgIm9lIiwgMSApOworICAgIHN0ciA9IHJlZ3JlcGxhY2UoIHN0ciwgIvwiLCAidWUiLCAxICk7CisgICAgc3RyID0gcmVncmVwbGFjZSggc3RyLCAixCIsICJBZSIsIDEgKTsKKyAgICBzdHIgPSByZWdyZXBsYWNlKCBzdHIsICLWIiwgIk9lIiwgMSApOworICAgIHN0ciA9IHJlZ3JlcGxhY2UoIHN0ciwgItwiLCAiVWUiLCAxICk7CisgICAgc3RyID0gcmVncmVwbGFjZSggc3RyLCAi3yIsICJzcyIsIDEgKTsKKyAgICBzdHIgPSByZWdyZXBsYWNlKCBzdHIsICJbXiAtfl0iLCAiPyIsIDEgKTsKKworICAgIHJldHVybiBzdHI7Cit9CisKKworcHVibGljIHZhcmFyZ3Mgc3RyaW5nIENvdW50VXAoIHN0cmluZyAqcywgc3RyaW5nIHNlcCwgc3RyaW5nIGxhc3RzZXAgKQoreworICAgIHN0cmluZyByZXQ7CisKKyAgICBpZiAoICFwb2ludGVycChzKSApCisgICAgICAgcmV0dXJuICIiOworICAgIAorICAgIGlmICghc2VwKSBzZXAgPSAiLCAiOworICAgIGlmICghbGFzdHNlcCkgbGFzdHNlcCA9ICIgdW5kICI7CisKKyAgICBzd2l0Y2ggKHNpemVvZihzKSkgIHsKKyAgICAgICBjYXNlIDA6IHJldD0iIjsgYnJlYWs7CisgICAgICAgY2FzZSAxOiByZXQ9c1swXTsgYnJlYWs7CisgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgcmV0ID0gaW1wbG9kZShzWzAuLjwyXSwgc2VwKTsKKyAgICAgICAgICAgICAgcmV0ICs9IGxhc3RzZXAgKyBzWzwxXTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworbm9tYXNrIHZhcmFyZ3MgaW50IHF1ZXJ5X25leHRfcmVzZXQob2JqZWN0IG9iKSB7CisKKyAgICAvLyBUeXBwcnVlZnVuZzogZXR3YXMgYW5kZXJlcyBhbHMgT2JqZWt0ZSBvZGVyIDAgc29sbGVuIEZlaGxlciBzZWluLgorICAgIGlmIChvYiAmJiAhb2JqZWN0cChvYikpCisgICAgICByYWlzZV9lcnJvcihzcHJpbnRmKCJCYWQgYXJnIDEgdG8gcXVlcnlfbmV4dF9yZXNldCgpOiBnb3QgJS4yME8sICIKKyAgICAgICAgICAgImV4cGVjdGVkIG9iamVjdC5cbiIsb2IpKTsKKworICAgIC8vIERlZmF1bHRvYmpla3QgUE8sIHdlbm4gMCB1ZWJlcmdlYmVuLgorICAgIGlmICggIW9iamVjdHAob2IpICkKKyAgICAgIG9iID0gcHJldmlvdXNfb2JqZWN0KCk7CisKKyAgICByZXR1cm4gZWZ1bjo6b2JqZWN0X2luZm8ob2IsIE9JX05FWFRfUkVTRVRfVElNRSk7Cit9CisKKworI2lmICFfX0VGVU5fREVGSU5FRF9fKGNvcHlfZmlsZSkKKyNkZWZpbmUgTUFYTEVOIDUwMDAwCitub21hc2sgaW50IGNvcHlfZmlsZShzdHJpbmcgc291cmNlLCBzdHJpbmcgZGVzdCkKK3sKKworICBpbnQgcHRyOworICBzdHJpbmcgYnl0ZXM7CisKKyAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKKyAgaWYgKCFzaXplb2Yoc291cmNlKXx8IXNpemVvZihkZXN0KXx8c291cmNlPT1kZXN0fHwoZmlsZV9zaXplKHNvdXJjZSk9PS0xKXx8CisgICAgICAoIWNhbGxfb3RoZXIobWFzdGVyKCksInZhbGlkX3JlYWQiLHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICBnZXR1aWQodGhpc19pbnRlcmFjdGl2ZSgpfHwKKyAgICAgICAgICAgICAgICAgcHJldmlvdXNfb2JqZWN0KCkpLCJyZWFkX2ZpbGUiLHByZXZpb3VzX29iamVjdCgpKSl8fAorICAgICAgKCFjYWxsX290aGVyKG1hc3RlcigpLCJ2YWxpZF9yZWFkIixzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgZ2V0dWlkKHRoaXNfaW50ZXJhY3RpdmUoKXx8CisgICAgICAgICAgICAgICAgIHByZXZpb3VzX29iamVjdCgpKSwid3JpdGVfZmlsZSIscHJldmlvdXNfb2JqZWN0KCkpKSkKKyAgICByZXR1cm4gMTsKKyAgc3dpdGNoIChmaWxlX3NpemUoZGVzdCkpCisgIHsKKyAgY2FzZSAtMToKKyAgICBicmVhazsKKyAgY2FzZSAtMjoKKyAgICBpZiAoZGVzdFs8MV0hPScvJykgZGVzdCs9Ii8iOworICAgIGRlc3QrPWVmdW46OmV4cGxvZGUoc291cmNlLCIvIilbPDFdOworICAgIGlmIChmaWxlX3NpemUoZGVzdCk9PS0yKSByZXR1cm4gMTsKKyAgICBpZiAoZmlsZV9zaXplKGRlc3QpIT0tMSkgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgaWYgKCFybShkZXN0KSkgcmV0dXJuIDE7CisgICAgYnJlYWs7CisgIH0KKyAgZG8KKyAgeworICAgIGJ5dGVzID0gcmVhZF9ieXRlcyhzb3VyY2UsIHB0ciwgTUFYTEVOKTsgcHRyICs9IE1BWExFTjsKKyAgICBpZiAoIWJ5dGVzKSBieXRlcz0iIjsKKyAgICB3cml0ZV9maWxlKGRlc3QsIGJ5dGVzKTsKKyAgfQorICB3aGlsZShzaXplb2YoYnl0ZXMpID09IE1BWExFTik7CisgIHJldHVybiAwOworfQorI2VuZGlmIC8vIV9fRUZVTl9ERUZJTkVEX18oY29weV9maWxlKQorCisKKy8vICMjIyBFcnNhdHphdWZsb2VzdW5nIGluIFN0cmluZ3MgIyMjCit2YXJhcmdzIHN0cmluZyByZXBsYWNlX3BlcnNvbmFsKHN0cmluZyBzdHIsIG1peGVkICpvYnMsIGludCBjYXBzKSB7CisgIGludCBpOworICBzdHJpbmcgKnBhcnRzOworCisgIHBhcnRzID0gcmVnZXhwbG9kZShzdHIsICJAV0VbQS1TVV0qWzAtOV0iKTsKKyAgaSA9IHNpemVvZihwYXJ0cyk7CisKKyAgaWYgKGk+MSkgeworICAgIGludCBqLCB0OworICAgIGNsb3N1cmUgKm5hbWVfY2xzOworCisgICAgdCA9IGogPSBzaXplb2Yob2JzKTsKKworICAgIG5hbWVfY2xzICA9ICBhbGxvY2F0ZShqKTsKKyAgICB3aGlsZSAoai0tKQorICAgICAgaWYgKG9iamVjdHAob2JzW2pdKSkKKyAgICAgICAgbmFtZV9jbHNbal0gPSBzeW1ib2xfZnVuY3Rpb24oIm5hbWUiLCBvYnNbal0pOworICAgICAgZWxzZSBpZiAoc3RyaW5ncChvYnNbal0pKQorICAgICAgICBuYW1lX2Nsc1tqXSA9IG9ic1tqXTsKKworICAgIHdoaWxlICgoaS09IDIpPjApIHsKKyAgICAgIGludCBvYl9ucjsKKyAgICAgIC8vIHp1IGVyc2V0emVuZGVzIFRva2VuIGluIEZhbGwgdW5kIE9iamVrdGluZGV4IGF1ZnNwYWx0ZW4KKyAgICAgIG9iX25yID0gcGFydHNbaV1bPDFdLScxJzsKKyAgICAgIGlmIChvYl9ucjwwIHx8IG9iX25yPj10KSB7CisgICAgICAgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CisgICAgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoInJlcGxhY2VfcGVyc29uYWw6IHVzaW5nIHdyb25nIG9iamVjdCBpbmRleCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgb2JfbnIpKTsKKyAgICAgICAgcmV0dXJuIGltcGxvZGUocGFydHMsICIiKTsKKyAgICAgIH0KKworICAgICAgLy8gY2FzdXMga2FubiBtYW4gc2Nob24gaGllciBlbnRzY2hlaWRlbgorICAgICAgaW50IGNhc3VzOworICAgICAgc3RyaW5nIHBhcnQgPSBwYXJ0c1tpXTsKKyAgICAgIHN3aXRjaCAocGFydFszXSkgeworICAgICAgICBjYXNlICdSJzogY2FzdXMgPSBXRVI7ICAgIGJyZWFrOworICAgICAgICBjYXNlICdTJzogY2FzdXMgPSBXRVNTRU47IGJyZWFrOworICAgICAgICBjYXNlICdNJzogY2FzdXMgPSBXRU07ICAgIGJyZWFrOworICAgICAgICBjYXNlICdOJzogY2FzdXMgPSBXRU47ICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OiAgY29udGludWU7IC8vIHBhc3N0IHNjaG9uIGpldHp0IG5pY2h0IGluIGRhcyBIYXVwdG11c3RlcgorICAgICAgfQorCisgICAgICAvLyB1bmQgamV0enQgZGllIGVpbnplbG5lbiBLZXl3b3JkcyBvaG5lIGZ1ZWhyZW5kZXMgIkBXRSIsIGJlZW5kZW5kZSBJZAorICAgICAgbWl4ZWQgdG1wOworICAgICAgc3dpdGNoIChwYXJ0WzMuLjwyXSkgeworICAgICAgICBjYXNlICJSIjogY2FzZSAiU1NFTiI6IGNhc2UgIk0iOiBjYXNlICJOIjogICAgICAgICAgICAgICAvLyBOYW1lCisgICAgICAgICAgcGFydHNbaV0gPSBmdW5jYWxsKG5hbWVfY2xzW29iX25yXSwgY2FzdXMsIDEpOyAgYnJlYWs7CisgICAgICAgIGNhc2UgIlJVIjogY2FzZSAiU1NFTlUiOiBjYXNlICJNVSI6IGNhc2UgIk5VIjogICAgICAgICAgIC8vIHVuYmVzdGltbXQKKyAgICAgICAgICBwYXJ0c1tpXSA9IGZ1bmNhbGwobmFtZV9jbHNbb2JfbnJdLCBjYXN1cyk7ICAgICBicmVhazsKKyAgICAgICAgY2FzZSAiUlFQIjogY2FzZSAiU1NFTlFQIjogY2FzZSAiTVFQIjogY2FzZSAiTlFQIjogICAgICAgLy8gUHJvbm91bgorICAgICAgICAgIGlmIChvYmplY3RwKHRtcCA9IG9ic1tvYl9ucl0pKQorICAgICAgICAgICAgcGFydHNbaV0gPSAoc3RyaW5nKXRtcC0+UXVlcnlQcm9ub3VuKGNhc3VzKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAiUlFBIjogY2FzZSAiU1NFTlFBIjogY2FzZSAiTVFBIjogY2FzZSAiTlFBIjogICAgICAgLy8gQXJ0aWNsZQorICAgICAgICAgIGlmIChvYmplY3RwKHRtcCA9IG9ic1tvYl9ucl0pKQorICAgICAgICAgICAgdG1wID0gKHN0cmluZyl0bXAtPlF1ZXJ5QXJ0aWNsZShjYXN1cywgMSwgMSk7CisgICAgICAgICAgaWYgKHN0cmluZ3AodG1wKSAmJiAhKHRtcFs8MV1eJyAnKSkgCisgICAgICAgICAgICB0bXAgPSB0bXBbMC4uPDJdOyAgICAgICAgICAgICAgICAvLyBFeHRyYS1TcGFjZSB3aWVkZXIgbG9lc2NoZW4KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAiUlFQUE1TIjogY2FzZSAiU1NFTlFQUE1TIjogY2FzZSAiTVFQUE1TIjogY2FzZSAiTlFQUE1TIjoKKyAgICAgICAgICBpZiAob2JqZWN0cCh0bXAgPSBvYnNbb2JfbnJdKSkKKyAgICAgICAgICAgIHBhcnRzW2ldID0gKHN0cmluZyl0bXAtPlF1ZXJ5UG9zc1Byb25vdW4oTUFMRSwgY2FzdXMsIFNJTkdVTEFSKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAiUlFQUEZTIjogY2FzZSAiU1NFTlFQUEZTIjogY2FzZSAiTVFQUEZTIjogY2FzZSAiTlFQUEZTIjoKKyAgICAgICAgICBpZiAob2JqZWN0cCh0bXAgPSBvYnNbb2JfbnJdKSkKKyAgICAgICAgICAgIHBhcnRzW2ldID0gKHN0cmluZyl0bXAtPlF1ZXJ5UG9zc1Byb25vdW4oRkVNQUxFLCBjYXN1cywgU0lOR1VMQVIpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICJSUVBQTlMiOiBjYXNlICJTU0VOUVBQTlMiOiBjYXNlICJNUVBQTlMiOiBjYXNlICJOUVBQTlMiOgorICAgICAgICAgIGlmIChvYmplY3RwKHRtcCA9IG9ic1tvYl9ucl0pKQorICAgICAgICAgICAgcGFydHNbaV0gPSAoc3RyaW5nKXRtcC0+UXVlcnlQb3NzUHJvbm91bihORVVURVIsIGNhc3VzLCBTSU5HVUxBUik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgIlJRUFBNUCI6IGNhc2UgIlNTRU5RUFBNUCI6IGNhc2UgIk1RUFBNUCI6IGNhc2UgIk5RUFBNUCI6CisgICAgICAgICAgaWYgKG9iamVjdHAodG1wID0gb2JzW29iX25yXSkpCisgICAgICAgICAgICBwYXJ0c1tpXSA9IChzdHJpbmcpdG1wLT5RdWVyeVBvc3NQcm9ub3VuKE1BTEUsIGNhc3VzLCBQTFVSQUwpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICJSUVBQRlAiOiBjYXNlICJTU0VOUVBQRlAiOiBjYXNlICJNUVBQRlAiOiBjYXNlICJOUVBQRlAiOgorICAgICAgICAgIGlmIChvYmplY3RwKHRtcCA9IG9ic1tvYl9ucl0pKQorICAgICAgICAgICAgcGFydHNbaV0gPSAoc3RyaW5nKXRtcC0+UXVlcnlQb3NzUHJvbm91bihGRU1BTEUsIGNhc3VzLCBQTFVSQUwpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICJSUVBQTlAiOiBjYXNlICJTU0VOUVBQTlAiOiBjYXNlICJNUVBQTlAiOiBjYXNlICJOUVBQTlAiOgorICAgICAgICAgIGlmIChvYmplY3RwKHRtcCA9IG9ic1tvYl9ucl0pKQorICAgICAgICAgICAgcGFydHNbaV0gPSAoc3RyaW5nKXRtcC0+UXVlcnlQb3NzUHJvbm91bihORVVURVIsIGNhc3VzLCBQTFVSQUwpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgCisgICAgICAvLyB3ZW5uIHRtcCBlaW4gU3RyaW5nIHdhciwgd2Vpc2VuIHdpciBlcyBoaWVyIHBhdXNjaGFsIHp1CisgICAgICBpZiAoc3RyaW5ncCh0bXApKQorICAgICAgICBwYXJ0c1tpXSA9IHRtcDsKKworICAgICAgLy8gYXVmIFd1bnNjaCB3aXJkIG5hY2ggU2F0emVuZGVuIGdyb3NzIGdlc2NocmllYmVuCisgICAgICBpZiAoY2FwcykKKyAgICAgICAgc3dpdGNoIChwYXJ0c1tpLTFdWzwyLi5dKSB7CisgICAgICAgICAgY2FzZSAiLiAiOiAgY2FzZSAiISAiOiAgY2FzZSAiPyAiOgorICAgICAgICAgIGNhc2UgIi4iOiAgIGNhc2UgIiEiOiAgIGNhc2UgIj8iOgorICAgICAgICAgIGNhc2UgIi5cbiI6IGNhc2UgIiFcbiI6IGNhc2UgIj9cbiI6CisgICAgICAgICAgY2FzZSAiXCIgIjogY2FzZSAiXCJcbiI6CisgICAgICAgICAgICBwYXJ0c1tpXSA9IGNhcGl0YWxpemUocGFydHNbaV0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGltcGxvZGUocGFydHMsICIiKTsKKyAgfQorICByZXR1cm4gc3RyOworfQorCisKKy8vcmVwbGFjZW1lbnRzIGZvciBkcm9wcGVkIGVmdW5zIGluIExECisjaWYgIV9fRUZVTl9ERUZJTkVEX18oZXh0cmFjdCkKK2RlcHJlY2F0ZWQgdmFyYXJncyBzdHJpbmcgZXh0cmFjdChzdHJpbmcgc3RyLCBpbnQgZnJvbSwgaW50IHRvKSB7CisKKyAgaWYoIXN0cmluZ3Aoc3RyKSkgeworICAgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CisgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigiQmFkIGFyZ3VtZW50IDEgdG8gZXh0cmFjdCgpOiAlTyIsc3RyKSk7CisgIH0KKyAgaWYgKGludHAoZnJvbSkgJiYgaW50cCh0bykpIHsKKyAgICBpZiAoZnJvbT49MCAmJiB0bz49MCkKKyAgICAgIHJldHVybihzdHJbZnJvbSAuLiB0b10pOworICAgIGVsc2UgaWYgKGZyb20+PTAgJiYgdG88MCkKKyAgICAgIHJldHVybihzdHJbZnJvbSAuLiA8YWJzKHRvKV0pOworICAgIGVsc2UgaWYgKGZyb208MCAmJiB0bz49MCkKKyAgICAgIHJldHVybihzdHJbPGFicyhmcm9tKSAuLiB0b10pOworICAgIGVsc2UKKyAgICAgIHJldHVybihzdHJbPGFicyhmcm9tKSAuLiA8YWJzKHRvKV0pOworICB9CisgIGVsc2UgaWYgKGludHAoZnJvbSkpIHsKKyAgICBpZiAoZnJvbT49MCkKKyAgICAgIHJldHVybihzdHJbZnJvbSAuLiBdKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4oc3RyWzxhYnMoZnJvbSkgLi4gXSk7CisgIH0KKyAgZWxzZSB7CisgICAgcmV0dXJuKHN0cik7CisgIH0KK30KKyNlbmRpZiAvLyAhX19FRlVOX0RFRklORURfXyhleHRyYWN0KQorCisjaWYgIV9fRUZVTl9ERUZJTkVEX18oc2xpY2VfYXJyYXkpCitkZXByZWNhdGVkIHZhcmFyZ3MgbWl4ZWQgc2xpY2VfYXJyYXkobWl4ZWQgYXJyYXksIGludCBmcm9tLCBpbnQgdG8pIHsKKworICBpZighcG9pbnRlcnAoYXJyYXkpKSB7CisgICAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKKyAgICByYWlzZV9lcnJvcihzcHJpbnRmKCJCYWQgYXJndW1lbnQgMSB0byBzbGljZV9hcnJheSgpOiAlTyIsYXJyYXkpKTsKKyAgfQorICBpZiAoaW50cChmcm9tKSAmJiBpbnRwKHRvKSkgeworICAgIGlmIChmcm9tPj0wICYmIHRvPj0wKQorICAgICAgcmV0dXJuKGFycmF5W2Zyb20gLi4gdG9dKTsKKyAgICBlbHNlIGlmIChmcm9tPj0wICYmIHRvPDApCisgICAgICByZXR1cm4oYXJyYXlbZnJvbSAuLiA8YWJzKHRvKV0pOworICAgIGVsc2UgaWYgKGZyb208MCAmJiB0bz49MCkKKyAgICAgIHJldHVybihhcnJheVs8YWJzKGZyb20pIC4uIHRvXSk7CisgICAgZWxzZQorICAgICAgcmV0dXJuKGFycmF5WzxhYnMoZnJvbSkgLi4gPGFicyh0byldKTsKKyAgfQorICBlbHNlIGlmIChpbnRwKGZyb20pKSB7CisgICAgaWYgKGZyb20+PTApCisgICAgICByZXR1cm4oYXJyYXlbZnJvbSAuLiBdKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4oYXJyYXlbPGFicyhmcm9tKSAuLiBdKTsKKyAgfQorICBlbHNlIHsKKyAgICByZXR1cm4oYXJyYXkpOworICB9Cit9CisjZW5kaWYgLy8gIV9fRUZVTl9ERUZJTkVEX18oc2xpY2VfYXJyYXkpCisKKyNpZiAhX19FRlVOX0RFRklORURfXyhtZW1iZXJfYXJyYXkpCitkZXByZWNhdGVkIGludCBtZW1iZXJfYXJyYXkobWl4ZWQgaXRlbSwgbWl4ZWQgYXJyYXlzdHJpbmcpIHsKKworICBpZiAocG9pbnRlcnAoYXJyYXlzdHJpbmcpKSB7CisgICAgcmV0dXJuKGVmdW46Om1lbWJlcihhcnJheXN0cmluZyxpdGVtKSk7CisgIH0KKyAgZWxzZSBpZiAoc3RyaW5ncChhcnJheXN0cmluZykpIHsKKyAgICByZXR1cm4oZWZ1bjo6bWVtYmVyKGFycmF5c3RyaW5nLHRvX2ludChpdGVtKSkpOworICB9CisgIGVsc2UgeworICAgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CisgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigiQmFkIGFyZ3VtZW50IDEgdG8gbWVtYmVyX2FycmF5KCk6ICVPIixhcnJheXN0cmluZykpOworICB9Cit9CisjZW5kaWYgLy8gIV9fRUZVTl9ERUZJTkVEX18obWVtYmVyX2FycmF5KQorCisvLyBUaGUgZGlnaXQgYXQgdGhlIGkndGggcG9zaXRpb24gaXMgdGhlIG51bWJlciBvZiBiaXRzIHNldCBpbiAnaScuCitzdHJpbmcgY291bnRfdGFibGUgPQorICAgICIwMTEyMTIyMzEyMjMyMzM0MTIyMzIzMzQyMzM0MzQ0NTEyMjMyMzM0MjMzNDM0NDUyMzM0MzQ0NTM0NDU0NTU2IjsKK2ludCBicm9rZW5fY291bnRfYml0cyggc3RyaW5nIHMgKSB7CisgICAgaW50IGksIHJlczsKKyAgICBpZiggIXN0cmluZ3AocykgfHwgIShpPXNpemVvZihzKSkgKSByZXR1cm4gMDsKKyAgICBmb3IoIDsgaS0tPjA7ICkgeworICAgICAgICAvLyBXZSBhcmUgY291bnRpbmcgNiBiaXRzIGF0IGEgdGltZSB1c2luZyBhIHByZWNvbXBpbGVkIHRhYmxlLgorICAgICAgICByZXMgKz0gY291bnRfdGFibGVbKHNbaV0tJyAnKSY2M10tJzAnOworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCisjaWYgIV9fRUZVTl9ERUZJTkVEX18oY291bnRfYml0cykKK2ludCBjb3VudF9iaXRzKCBzdHJpbmcgcyApIHsKKyAgICByZXR1cm4oYnJva2VuX2NvdW50X2JpdHMocykpOworfQorI2VuZGlmCisKKworLy8gKiBUZWlsZSBhdXMgZWluZW0gQXJyYXkgZW50ZmVybmVuICoqKiBPQlNPTEVURQorZGVwcmVjYXRlZCBtaXhlZCAqZXhjbHVkZV9hcnJheShtaXhlZCAqYXJyLGludCBmcm9tLGludCB0bykKK3sKKyAgaWYgKHRvPGZyb20pCisgICAgdG8gPSBmcm9tOworICByZXR1cm4gYXJyWzAuLmZyb20tMV0rYXJyW3RvKzEuLl07Cit9CisKZGlmZiAtLWdpdCBhL3NlY3VyZS9zaW5tYXN0ZXIuYyBiL3NlY3VyZS9zaW5tYXN0ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGI4Zjk0Ci0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3Npbm1hc3Rlci5jCkBAIC0wLDAgKzEsMjEzIEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gc2VjdXJlL3Npbm1hc3Rlci5jIC0tIERhcyBTdHJhZnJlZ2lzdGVyCisvLworLy8gJElkOiBzaW5tYXN0ZXIuYyA5MTQyIDIwMTUtMDItMDQgMjI6MTc6MjlaIFplc3N0cmEgJAorCisjZGVmaW5lIFNJTl9TQVZFICIvc2VjdXJlL0FSQ0gvc2lucyIKKyNkZWZpbmUgU0lOX0xPRyAgIkFSQ0gvc2lucyIKKyNkZWZpbmUgU0lOX0RVTVAgIi9zZWN1cmUvQVJDSC9zaW5zLmR1bXAiCisKKyNpbmNsdWRlIDxkZWZpbmVzLmg+CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHdpemxldmVscy5oPgorCisjcHJhZ21hIHN0cmljdF90eXBlcworCittYXBwaW5nIHNpbnM7CisKK3B1YmxpYyB2b2lkIGNyZWF0ZSgpCit7CisgICAgc2V0ZXVpZChnZXR1aWQoTUUpKTsKKyAgICBpZiAoICFyZXN0b3JlX29iamVjdChTSU5fU0FWRSkgKQorICAgICAgICBzaW5zID0gKFtdKTsKK30KKworc3RhdGljIHZvaWQgc2F2ZV9tZSgpCit7CisgICAgc2F2ZV9vYmplY3QoU0lOX1NBVkUpOworfQorCitwcml2YXRlIHZhcmFyZ3MgaW50IGlzX2FsbG93ZWQoaW50IGFyY2hvbmx5KQoreworICBpZiAocHJldmlvdXNfb2JqZWN0KCkgJiYgZ2V0ZXVpZChwcmV2aW91c19vYmplY3QoKSk9PVJPT1RJRCkKKyAgICByZXR1cm4gMTsKKyAgaWYgKCFwcm9jZXNzX2NhbGwoKSAmJiBwcmV2aW91c19vYmplY3QoKSAmJiB0aGlzX2ludGVyYWN0aXZlKCkgJiYgKEFSQ0hfU0VDVVJJVFkgfHwgKCFhcmNob25seSAmJiBJU19ERVBVVFkoc2VjdXJlX2V1aWQoKSkpICkgKQorICAgIHJldHVybiAxOworICByZXR1cm4gMDsKK30KKworcHVibGljIG5vbWFzayBpbnQgcXVlcnlfcHJldmVudF9zaGFkb3coKQoreworICAgIHJldHVybiAxOworfQorCitwdWJsaWMgc3RyaW5nIExpc3RTaW5uZXJzKCkKK3sgICBzdHJpbmcgKm5hbWVzOworCisgICAgaWYgKCAhaXNfYWxsb3dlZCgpICkKKyAgICAgIHJldHVybiAiQUNDRVNTIERFTklFRFxuIjsKKworICAgIGlmICggc2l6ZW9mKG5hbWVzPW1faW5kaWNlcyhzaW5zKSk8MSApCisgICAgICByZXR1cm4gIkVzIHNpbmQga2VpbmUgRWludHJhZWdlIHZvcmhhbmRlbi5cbiI7CisKKyAgICBuYW1lcyA9IHNvcnRfYXJyYXkoIG1hcCggbmFtZXMsICMnY2FwaXRhbGl6ZSApLCAjJz4gKTsKKworICAgIHJldHVybiBzcHJpbnRmKCJMaXN0ZSBkZXIgZWluZ2V0cmFnZW5lbiBTdWVuZGVyOlxuJSM3OC42c1xuIiwKKyAgICAgICAgICAgICAgICAgICBpbXBsb2RlKG5hbWVzLCJcbiIpKTsKK30KKworcHVibGljIHN0cmluZyBMaXN0U2lucyhzdHJpbmcgd2hvKQoreyAgIHN0cmluZyByZTsKKyAgICBpbnQgICAgaSxqOworCisgICAgaWYgKCAhaXNfYWxsb3dlZCgpICkKKyAgICAgIHJldHVybiAiQUNDRVNTIERFTklFRFxuIjsKKworICAgIGlmICggIXN0cmluZ3Aod2hvKSB8fCAoc2l6ZW9mKHdobyk8MSkgKQorICAgICAgcmV0dXJuICJTWU5UQVggRVJST1IuXG4iOworCisgICAgaWYgKCAhbWVtYmVyKHNpbnMsd2hvKSB8fCAhcG9pbnRlcnAoc2luc1t3aG9dKSB8fCAoKGo9c2l6ZW9mKHNpbnNbd2hvXSkpPDEpICkKKyAgICAgIHJldHVybiBzcHJpbnRmKCJFcyBsaWVnZW4ga2VpbmUgRWludHJhZWdlIGZ1ZXIgJyVzJyB2b3IuXG4iLENBUCh3aG8pKTsKKworICAgIGZvciAoIGk9MSwgcmUgPSAoKHN0cmluZylzaW5zW3dob11bMF0rIlxuIikgOyBpPGogOyBpKysgKQorICAgICAgcmUgKz0gc3ByaW50ZigiJTNkOiAlc1xuIixpLChzdHJpbmcpc2luc1t3aG9dW2ldKTsKKworICAgIHJldHVybiByZTsKK30KKworc3RhdGljIHZvaWQgX2FkZF9lbnRyeShzdHJpbmcgd2hvLCBzdHJpbmcgZW50cnksIG9iamVjdCBwbCkKK3sgICBzdHJpbmcgKmFkZDsKKworICAgIGlmICggbWVtYmVyKHNpbnMsd2hvKSAmJiBwb2ludGVycChzaW5zW3dob10pICYmIChzaXplb2Yoc2luc1t3aG9dKT4wKSApCisgICAgICAgIGFkZCA9IChzdHJpbmcqKXNpbnNbd2hvXTsKKyAgICBlbHNlCisgICAgICAgIGFkZCA9ICh7IHNwcmludGYoIkVpbnRyYWVnZSBmdWVyICclcyc6IixDQVAod2hvKSkgfSk7CisKKyAgICBhZGQgKz0gKHsgZW50cnkgfSk7CisKKyAgICBzaW5zW3dob10gPSBhZGQ7CisKKyAgICBzYXZlX21lKCk7CisKKyAgICBsb2dfZmlsZShTSU5fTE9HLAorICAgICAgICBzcHJpbnRmKCIlcyBFaW50cmFnIGZ1ZXIgJXMgdm9uICVzXG4iLAorICAgICAgICAgICAgZHRpbWUodGltZSgpKSxDQVAod2hvKSxDQVAoZ2V0dWlkKHBsKSkgKSApOworfQorCitwdWJsaWMgc3RyaW5nIEFkZFNpbihzdHJpbmcgd2hvLCBzdHJpbmcgdGV4dCkKK3sgICBvYmplY3QgcGw7CisgICAgc3RyaW5nIGVyc3RpOworCisgICAgaWYgKCAhaXNfYWxsb3dlZCgpICkKKyAgICAgIHJldHVybiAiQUNDRVNTIERFTklFRFxuIjsKKworICAgIGlmICggIXN0cmluZ3Aod2hvKSB8fCAoc2l6ZW9mKHdobyk8MSkKKyAgICAgICAgfHwgIXN0cmluZ3AodGV4dCkgfHwgKHNpemVvZih0ZXh0KTwxKSApCisgICAgICByZXR1cm4gIlNZTlRBWCBFUlJPUi5cbiI7CisKKyAgICBpZiAoIHRleHRbMC4uMl09PSItZiAiICkKKyAgICAgIHRleHQ9dGV4dFszLi5dOworICAgIGVsc2UgaWYgKCBmaWxlX3NpemUoc3ByaW50ZigiL3NhdmUvJXMvJXMubyIsd2hvWzAuLjBdLHdobykpPDEpCisgICAgICByZXR1cm4gc3ByaW50ZigiRXMgZ2lidCBrZWluZW4gU3BpZWxlciBuYW1lbnMgJyVzJ1xuIix3aG8pOworCisgICAgdGV4dCA9IGR0aW1lKHRpbWUoKSkgKyAiICgiK0NBUChnZXR1aWQoUlBMKSkrIilcbiIgCisgICAgICAgICArIGJyZWFrX3N0cmluZyh0ZXh0LDc4LCIgICAgICIgKTsKKworICAgIF9hZGRfZW50cnkoIHdobywgdGV4dCwgUlBMICk7CisKKyAgICBpZiAoIG9iamVjdHAocGw9KGZpbmRfcGxheWVyKHdobyl8fGZpbmRfbmV0ZGVhZCh3aG8pKSkKKyAgICAgICAgJiYgIUlTX1dJWkFSRChwbCkgLy8gTWFnaWVyIGhhYmVuIG1hbmNobWFsIGtvbWlzY2hlIEVyc3RpZXMgLi4uCisgICAgICAgICYmIHN0cmluZ3AoZXJzdGk9KHN0cmluZylwbC0+UXVlcnlQcm9wKFBfU0VDT05EKSkgKQorICAgIHsKKyAgICAgICAgcmV0dXJuICggc3ByaW50ZigiT2suXG5GdWVnZSBFaW50cmFnIGJlaSBFcnN0aSAnJXMnIGhpbnp1LlxuIixlcnN0aSkKKyAgICAgICAgICAgICAgICArIEFkZFNpbiggbG93ZXJfY2FzZShlcnN0aSksICgiLWYgc2llaGUgIit3aG8pICkgKTsKKyAgICB9CisKKyAgICByZXR1cm4gIk9LLlxuIjsKK30KKworcHVibGljIHN0cmluZyBSZW1vdmVTaW4oc3RyaW5nIHdobywgaW50IG5yKQoreyAgIHN0cmluZyAqcmVtOworCisgICAgaWYgKCAhaXNfYWxsb3dlZCgxKSApCisgICAgICByZXR1cm4gIkFDQ0VTUyBERU5JRURcbiI7CisKKyAgICBpZiAoICFpbnRwKG5yKSB8fCAobnI8MSkgfHwgIXN0cmluZ3Aod2hvKSB8fCAoc2l6ZW9mKHdobyk8MSkgKQorICAgICAgcmV0dXJuICJTWU5UQVggRVJST1IuXG4iOworCisgICAgaWYgKCAhbWVtYmVyKHNpbnMsd2hvKSB8fCAhcG9pbnRlcnAoc2luc1t3aG9dKSB8fCAoc2l6ZW9mKHNpbnNbd2hvXSk8MSkgKQorICAgICAgcmV0dXJuIHNwcmludGYoIkZFSExFUjogS2VpbmUgRWludHJhZWdlIGZ1ZXIgJyVzJyB2b3JoYW5kZW4uXG4iLAorICAgICAgICAgICAgICAgICAgICAgQ0FQKHdobykpOworCisgICAgcmVtID0gKHN0cmluZyopc2luc1t3aG9dOworCisgICAgaWYgKCBzaXplb2YocmVtKTw9bnIgKQorICAgICAgcmV0dXJuICJGRUhMRVI6IERpZXNlbiBFaW50cmFnIGdpYnQgZXMgbmljaHQuXG4iOworCisgICAgcmVtW25yXSA9IDA7CisKKyAgICByZW0gLT0gKHsgMCB9KTsKKworICAgIGxvZ19maWxlKFNJTl9MT0csCisgICAgICAgIHNwcmludGYoIiVzIExvZXNjaHVuZyBiZWkgJXMgdm9uICVzXG4iLAorICAgICAgICAgICAgZHRpbWUodGltZSgpKSxDQVAod2hvKSxDQVAoZ2V0dWlkKFJQTCkpICkgKTsKKworCisgICAgaWYgKCBzaXplb2YocmVtKTwyICkKKyAgICB7CisgICAgICAgIG1fZGVsZXRlKHNpbnMsd2hvKTsKKyAgICAgICAgc2F2ZV9tZSgpOworICAgICAgICByZXR1cm4gc3ByaW50ZigiTGV0enRlbiBFaW50cmFnIHZvbiAnJXMnIGdlbG9lc2NodC5cbiIsQ0FQKHdobykpOworICAgIH0KKworICAgIHNpbnNbd2hvXSA9IHJlbTsKKyAgICBzYXZlX21lKCk7CisKKyAgICByZXR1cm4gc3ByaW50ZigiRWludHJhZyAlZCB2b24gJyVzJyBnZWxvZXNjaHQuXG4iLG5yLENBUCh3aG8pKTsKK30KKworcHVibGljIHZhcmFyZ3Mgc3RyaW5nIER1bXAoaW50IGZsYWcpCit7ICAgc3RyaW5nICpzbnIsKnNucyxkdW1wOworICAgIGludCAgICBpLGosayxzLHQ7CisKKyAgICBpZiAoICFpc19hbGxvd2VkKDApICkKKyAgICAgIHJldHVybiAiQUNDRVNTIERFTklFRFxuIjsKKworICAgIGlmICggIWZsYWcgJiYgZmlsZV9zaXplKFNJTl9EVU1QKT4xICkKKyAgICAgIHJtKCBTSU5fRFVNUCApOworCisgICAgcz1pPXNpemVvZihzbnI9c29ydF9hcnJheShtX2luZGljZXMoc2lucyksIyc8KSk7CisKKyAgICBpZiAoIGk8MSApCisgICAgICByZXR1cm4gIktlaW5lIFN1ZW5kZXIgZGEuXG4iOworCisgICAgZHVtcCA9IHNwcmludGYoIlxuJXw3OHNcbiUnPSc3OC43OHNcblxuIiwKKyAgICAgICAgICAgICAgIHNwcmludGYoIkR1bXAgZGVyIFN1ZW5kZW4tRWludHJhZWdlICglcyk6IixkdGltZSh0aW1lKCkpKSwKKyAgICAgICAgICAgICAgICIiKTsKKworICAgIGZvciAoIC0taSx0PTAgOyBpPj0wIDsgaS0tICkKKyAgICB7CisgICAgICAgIGogPSBzaXplb2Yoc25zPXNpbnNbc25yW2ldXSk7CisgICAgICAgIHQgKz0gKGotMSk7CisgICAgICAgIGR1bXAgKz0gKHNuc1swXSsiXG5cbiIpOworCisgICAgICAgIGZvciAoIGs9MSA7IGs8aiA7IGsrKyApCisgICAgICAgICAgICBkdW1wICs9IHNwcmludGYoIiUzZDogJXNcbiIsayxzbnNba10pOworCisgICAgICAgIGR1bXAgKz0gc3ByaW50ZigiJSc9Jzc4Ljc4c1xuXG4iLCIiKTsKKyAgICB9CisKKyAgICBkdW1wICs9IHNwcmludGYoIlN0YXRpc3RpazpcblxuIisKKyAgICAgICAgICAgICAgICAgICAgIiAgRXMgc2luZCAlZCBTdWVuZGVyIG1pdCBpbnNnZXMuICVkIEVpbnRyYWVnZW4gdm9yaGFuZGVuLlxuIisKKyAgICAgICAgICAgICAgICAgICAgIiAgRGFzIG1hY2h0IGVpbmVuIFNjaG5pdHQgdm9uICUuNmYgRWludHJhZWdlbi5cblxuIiwKKyAgICAgICAgICAgICAgICAgICAgcyx0LCggdG9fZmxvYXQodCkvdG9fZmxvYXQocykgKSk7CisKKyAgICBpZiAoICFmbGFnICkKKyAgICB7CisgICAgICAgIHdyaXRlX2ZpbGUoU0lOX0RVTVAsZHVtcCk7CisgICAgICAgIHJldHVybiBzcHJpbnRmKCJFcyB3dXJkZW4gJWQgU3VlbmRlciBnZWR1bXBlZC5cbiIscyk7CisgICAgICAgIAorICAgIH0KKyAgICByZXR1cm4gZHVtcDsKK30KZGlmZiAtLWdpdCBhL3NlY3VyZS9zeW50YXhkYi5jIGIvc2VjdXJlL3N5bnRheGRiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTcyZWFlNgotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS9zeW50YXhkYi5jCkBAIC0wLDAgKzEsMjIzIEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvKiogXGZpbGUgL2ZpbGUuYworKiBtZXJrdCBzaWNoIFN5bnRheGVuIHVuZCBkZXJlbiBFcmZvbGcKKyogS29tbXQgZ2FyIG5pY2h0IG1pdCBnZXNjaGFjaHRlbHRlbiBCZWZlaGxlbiBrbGFyLi4uCisqIFxhdXRob3IgWmVzc3RyYQorKi8KKworI3ByYWdtYSBzdHJvbmdfdHlwZXMsc2F2ZV90eXBlcyxydHRfY2hlY2tzCisjcHJhZ21hIG5vX2Nsb25lLG5vX2luaGVyaXQsbm9fc2hhZG93CisjcHJhZ21hIHBlZGFudGljLCByYW5nZV9jaGVjaworCisjaW5jbHVkZSA8ZGVmaW5lcy5oPgorI2luY2x1ZGUgPGV2ZW50cy5oPgorI2luY2x1ZGUgPHdpemxldmVscy5oPgorI2luY2x1ZGUgPHBsYXllci9iYXNlLmg+CisjaW5jbHVkZSA8dXNlcmluZm8uaD4KKyNpbmNsdWRlIDxkcml2ZXJfaW5mby5oPgorI2luY2x1ZGUgPHJlZ2V4cC5oPgorCisjZGVmaW5lIEhPTUUoeCkgKF9fUEFUSF9fKDApK3gpCisjZGVmaW5lIFpERUJVRyh4KSB0ZWxsX3Jvb20oIi9wbGF5ZXJzL3plc3N0cmEvd29ya3Jvb20iLFwKKyAgICAgICAgICAgICAgICAgICAgc3ByaW50Zigic3ludGF4OiAlT1xuIix4KSk7CisKK21hcHBpbmcgYmxhY2tsaXN0OworCitzdHJ1Y3QgY21kX3MgeworICAgIHN0cmluZyB2ZXJiOworICAgIHN0cmluZyBjbWQ7CisgICAgc3RyaW5nIHVpZDsKKyAgICBpbnQgc3VjY2VzczsKKyAgICBpbnQgZnA7CisgICAgaW50IGV2YWxubzsKKyAgICBzdHJpbmcgdHBfdWlkOworICAgIGludCBmaW5pc2hlZDsKK307CisKKy8vIExJc3RlIGRlciBsZXR6dGVuIEtvbW1hbmRvcywgUXVldWUgenVtIHNwZWljaGVybiBpbiBkaWUgREIuCisvLyBEYXMgbGV0enRlIEVsZW1lbnQgaXN0IGRhcyBsZXR6dGUgS29tbWFuZG8gKGdnZi4gbm9jaCBuaWNodCBhYmdlc2NobG9zc2VuKQorcHJpdmF0ZSBzdHJ1Y3QgY21kX3MgKmNvbW1hbmRzID0gKHt9KTsKKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkKK3sKKyAgc2V0ZXVpZChnZXR1aWQoKSk7CisgIGlmIChzbF9vcGVuKEhPTUUoIkFSQ0gvc3ludGF4ZW4uc3FsaXRlIikpICE9IDEpCisgIHsKKyAgICByYWlzZV9lcnJvcigiRGF0ZW5iYW5rIGtvbm50ZSBuaWNodCBnZW9lZmZuZXQgd2VyZGVuLlxuIik7CisgIH0KKyAgLy8gVGFiZWxsZW4gdW5kIEluZGljZXMgYW5sZWdlbiwgZmFsbHMgZGllIG5pY2h0IGV4aXN0aWVyZW4uCisgIHNsX2V4ZWMoIkNSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIHN5bnRheGVuKCIKKyAgICAgICAgICAiY21kIFRFWFQgVU5JUVVFLCAiCisgICAgICAgICAgInZlcmIgVEVYVCBOT1QgTlVMTCwgZW52dWlkIFRFWFQgTk9UIE5VTEwsICIKKyAgICAgICAgICAic3VjY2VzcyBJTlRFR0VSLCBjb3VudCBJTlRFR0VSLCBmcCBJTlRFR0VSKTsiKTsKKyAgc2xfZXhlYygiQ1JFQVRFIElOREVYIElGIE5PVCBFWElTVFMgaWR4X3ZlcmIgT04gc3ludGF4ZW4odmVyYik7Iik7CisgIC8vIGRpZXNlcyBPYmpla3QgZGFyZiBudXIgcGVyIGhhbmQgKG1pdCB0aGlzX3BsYXllcigpKSBnZWxhZGVuIHdlcmRlbiwgd2VpbAorICAvLyBkYSBlaW4gVGVpbCBkZXIgQmxhY2tsaXN0IGhlcmtvbW10Li4uIE1hbiBiZWFjaHRlLCBkYXNzIGRpZXMgYXVjaCBkYXMKKyAgLy8gaXN0LCB3YXMgZGllIHVlYmxpY2hlbiBLb21tdW5pa2F0aW9uc2JlZmVobGUgYXVzZmlsdGVydC4KKyAgc3RyaW5nICp0bXAgPSBtYXAodGhpc19wbGF5ZXIoKS0+UXVlcnlQcm9wKFBfTE9DQUxDTURTKSwKKyAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gc3RyaW5nIChtaXhlZCB2YWwpCisgICAgICAgICAgICAgICAgICAgIHtyZXR1cm4gdmFsWzBdO30KKyAgICAgICAgICAgICAgICAgICApOworICBibGFja2xpc3QgPSBta21hcHBpbmcodG1wCisgICAgICAgICAgICAgICAgICAtICh7ICJ0b2V0ZSIsInNjaG51cHBlciIsICJzY2hudXBwZXJlIiwgInN1Y2hlIiwic3VjaCIsCisgICAgICAgICAgICAgICAgICAgICAgICJ1bnQiLCAidW50ZXJzdWNoZSIsInVudGVyc3VjaCIsICJyaWVjaCIsCisgICAgICAgICAgICAgICAgICAgICAgICJyaWVjaGUiLCAibGF1c2NoIiwgImxhdXNjaGUiLCAidGFzdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAiZnVlaGwiLCAiZnVlaGxlLCBiZXJ1ZWhyZSIsICJzY2hhdSIsICJzY2hhdWUiLAorICAgICAgICAgICAgICAgICAgICAgICAibGVzIiwgImxpZXMiLCAiYmV0cmFjaHRlIiwgImJldHIiLCAiYmV0cmFjaHQiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgInRlaWxlIiAvLyB3aXJkIHBlciByZWdleHAgZ2VmaWx0ZXJ0IQorICAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAgICsgKHsibWFpbCIsImZyYWdlIiwiZnJhZyIsICJ4bG9hZCIsICJ4ZXZhbCIsICJ4Y2FsbCIsCisgICAgICAgICAgICAgICAgICAgICAgImdydXBwZSIsICJnIiwgInRlYW0iLCAiZnJ1ZmUiLCAiZnJ1ZiIsICJmd2VyIiwKKyAgICAgICAgICAgICAgICAgICAgICAiZmVtb3RlIiwgInJrbnVkZGVsIiwgImtudWRkZWwiLCAibmljayIsICJuaWNrZSIsCisgICAgICAgICAgICAgICAgICAgICAgInJuaWNrIiwgInJuaWNrZSIsICJrbnVkZGVsIiwgImtudWRkZWxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAicmtudWRkZWwiLCAicmtudWRkZWxlIiwiZGVua2UiLCJkZW5rIiwKKyAgICAgICAgICAgICAgICAgICAgICAiZmZpeCIsImZub3RpeiIsImZ1ZWJlcnRyYWdlIiwgImNoYW9za29udHJvbGxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAia3JlaXMiLCAvLyBNYXRyaXhrcmlzdGFsbAorICAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICk7Cit9CisKK3ByaXZhdGUgdm9pZCB3cml0ZV9kYigpCit7CisgIGZvcmVhY2goc3RydWN0IGNtZF9zIGMgOiBjb21tYW5kcykKKyAgeworICAgIGludCoqIHJvdz1zbF9leGVjKCJTRUxFQ1Qgcm93aWQsIHN1Y2Nlc3MsIGNvdW50LCBmcCBmcm9tIHN5bnRheGVuICIKKyAgICAgICAgICAgICAgICAgICAgICAiV0hFUkUgY21kPT8xOyIsCisgICAgICAgICAgICAgICAgICAgICAgYy0+Y21kKTsKKyAgICBpZiAocm93KQorICAgIHsKKyAgICAgIHNsX2V4ZWMoIlVQREFURSBzeW50YXhlbiBTRVQgc3VjY2Vzcz0/MiwgY291bnQ9PzMsIGZwPT80IgorICAgICAgICAgICAgICAiV0hFUkUgcm93aWQ9PzE7Iiwgcm93WzBdWzBdLAorICAgICAgICAgICAgICBjLT5zdWNjZXNzIHx8IHJvd1swXVsxXSwKKyAgICAgICAgICAgICAgKytyb3dbMF1bMl0sIGMtPmZwIHx8IHJvd1swXVszXSApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgc2xfZXhlYygiSU5TRVJUIElOVE8gc3ludGF4ZW4odmVyYiwgY21kLCBlbnZ1aWQsIHN1Y2Nlc3MsIGNvdW50LCBmcCkgIgorICAgICAgICAgICAgICAiVkFMVUVTKD8xLD8yLD8zLD80LD81LD82KTsiLAorICAgICAgICAgICAgICBjLT52ZXJiLCBjLT5jbWQsIGMtPnVpZCwgYy0+c3VjY2VzcywgMSwgYy0+ZnApOworICAgIH0KKyAgfQorICBjb21tYW5kcyA9ICh7fSk7Cit9CisKKy8vIEJlZW5kZXQgZWluIEtvbW1hbmRvLCB3aXJkIG51ciBpbnRlcm4gZ2VydWZlbgorcHJpdmF0ZSB2b2lkIGNvbW1pdChzdHJ1Y3QgY21kX3MgYykKK3sKKyAgYy0+ZmluaXNoZWQgPSAxOworICAvL3ByaW50ZigiS29tbWFuZG8gYWJnZXNjaGxvc3NlbjogJU9cbiIsIGMpOworICBpZiAoZ2V0X2V2YWxfY29zdCgpID4gMTAwMDAwMAorICAgICAgJiYgc2l6ZW9mKGNvbW1hbmRzKSA+IDUKKyAgICAgICYmIGZpbmRfY2FsbF9vdXQoIyd3cml0ZV9kYikgPT0gLTEpCisgIHsKKyAgICAvLyBJbiBEQiB3ZWdzY2hyZWliZW4KKyAgICBjYWxsX291dCgjJ3dyaXRlX2RiLCAxKTsKKyAgfQorfQorCitwdWJsaWMgdmFyYXJncyBpbnQgcmVtb3ZlKGludCBzaWxlbnQpCit7CisgIHdyaXRlX2RiKCk7CisgIGRlc3RydWN0KHRoaXNfb2JqZWN0KCkpOworICByZXR1cm4gMTsKK30KKworLy8gZ2VydWZlbiwgd2VubiBlaW4gU3BpZWxlciBlaW4gS29tbWFuZG8gZWluZ2V0aXBwdCBoYXQsIGF1cyBtb2RpZnlfY29tbWFuZCgpCisvLyBoZXJhdXMuIE5hY2ggUGFyc2VuIHVuZCBLb21tYW5kb2Jsb2NrLCBhYmVyIHZvciBhbGxlbSBhbmRlcmVuLgorLy8gQUNIVFVORzogd2VubiBlaW4gS29tbWFuZG8gZXJmb2xncmVpY2ggaXN0LCB3aXJkIEtFSU4gZW5kX2NtZCgpIHZvbiBhdXNzZW4KKy8vIGdlcnVmZW4uLi4KK3B1YmxpYyB2b2lkIHN0YXJ0X2NtZChzdHJpbmcgY21kc3RyKQoreworICBpZiAoIWludGVyYWN0aXZlKHByZXZpb3VzX29iamVjdCgpKSkKKyAgICAgIHJldHVybjsKKyAgY21kc3RyID0gbG93ZXJfY2FzZShjbWRzdHIpOworICAvLyBsZXR6dGVzIEtvbW1hbmRvIG5vdGZhbGxzIGFic2NobGllc3NlbgorICBzdHJ1Y3QgY21kX3MgY21kOworICBpZiAoc2l6ZW9mKGNvbW1hbmRzKSkKKyAgeworICAgIGNtZCA9IGNvbW1hbmRzWzwxXTsKKyAgICBpZiAoIWNtZC0+ZmluaXNoZWQpCisgICAgeworICAgICAgLy8gd2lyIGJldHJhY2h0ZW4gZXMgdWVicmlnZW5zIGFscyBlcmZvbGdyZWljaCEKKyAgICAgIGNvbW1pdChjbWQpOworICAgIH0KKyAgfQorICAvLyB0ZWlsZS0gbWl0IHVuZCBFYmVuZW4gdW5kIGFsbGUgS29tbWFuZG9zLCBkaWUgbnVyIGF1cyB2ZXJiIHVuZCBlaW5lbSBXb3J0CisgIC8vIGJlc3RlaGVuLCBzaW5kIGF1Y2ggdW5udWV0ei4KKyAgLy9wcmludGYoIiVPXG4iLGNtZHN0cik7CisgIGlmIChzaXplb2YoZXhwbG9kZShjbWRzdHIsICIgIikpIDwgMworICAgICAgfHwgc2l6ZW9mKGNtZHN0cikgPiAxMDAKKyAgICAgIHx8IHJlZ21hdGNoKGNtZHN0ciwiXnRlaWxlLiptaXQiLFJFX1BDUkUpCisgICAgICB8fCByZWdtYXRjaChjbWRzdHIsIl4tW1s6YWxwaGE6XS1dKlsnIDpdezF9IixSRV9QQ1JFKQorICAgICAgfHwgcmVnbWF0Y2goY21kc3RyLCJeWy4nXSIsIFJFX1BDUkUpCisgICAgICkKKyAgeworICAgICAgcmV0dXJuOworICB9CisgIGNtZCA9ICg8Y21kX3M+IHZlcmI6IGV4cGxvZGUoY21kc3RyLCAiICIpWzBdLAorICAgICAgICAgY21kOiBjbWRzdHIsCisgICAgICAgICB1aWQ6IGdldHVpZChlbnZpcm9ubWVudCh0aGlzX3BsYXllcigpKSksCisgICAgICAgICBldmFsbm86IGRyaXZlcl9pbmZvKERJX0VWQUxfTlVNQkVSKSwKKyAgICAgICAgIHN1Y2Nlc3M6IDEsCisgICAgICAgICB0cF91aWQ6IGdldHVpZChwcmV2aW91c19vYmplY3QoKSksCisgICAgICApOworICAvLyBzb25zdGlnZSBCbGFja2xpc3QKKyAgaWYgKG1lbWJlcihibGFja2xpc3QsIGNtZC0+dmVyYikpCisgICAgICByZXR1cm47CisKKyAgY29tbWFuZHMgKz0gKHtjbWR9KTsKKyAgLy9wcmludGYoIktvbW1hbmRvc3RhcnQ6ICVPXG4iLCBjbWQpOworfQorCisvLyBnZXJ1ZmVuIHZvbiBfYXVzd2VydGVuKCkgaW0gU3BpZWxlcm9iamVrdCAtIGRhcyBrb21tdCB6aWVtbGljaCBhbSBFbmRlIGRlcgorLy8gS29tbWFuZG92ZXJhcmJlaXR1bmcgLSB3ZW5uIGVzIG5vY2ggZ2VydWZlbiB3aXJkIHVuZCB1bnMgcnVmdCwgYmV0cmFjaHRlbgorLy8gd2lyIGRhcyBLb21tYW5kbyBhbHMgTklDSFQgZXJmb2xncmVpY2guCitwdWJsaWMgdm9pZCBjbWRfdW5zdWNjZXNzZnVsKCkKK3sKKyAgaWYgKCFzaXplb2YoY29tbWFuZHMpKQorICAgIHJldHVybjsKKyAgc3RydWN0IGNtZF9zIGNtZCA9IGNvbW1hbmRzWzwxXTsKKyAgLy8gRGFyZiBudXIgdm9tIFNwaWVsZXJvYmpla3QgZ2VydWZlbiB3ZXJkZW4sIHdlbGNoZXMgZGFzIGxldHp0ZSBLb21tYW5kbworICAvLyBhbmdlZmFuZ2VuIGhhdC4KKyAgaWYgKGNtZC0+dHBfdWlkICE9IGdldHVpZChwcmV2aW91c19vYmplY3QoKSkpCisgICAgcmV0dXJuOworICAvLyB1bmQgZGllcyBnZWhvZXJ0IG51ciB6dW0gbGV0enRlbiBLb21tYW5kbywgd2VubiBWZXJiIHVuZCBFdmFsLU5vCisgIC8vIHVlYmVyZWluc3RpbW1lbi4KKyAgaWYgKGNtZC0+dmVyYiA9PSBxdWVyeV92ZXJiKCkKKyAgICAgIHx8IGNtZC0+ZXZhbG5vID09IGRyaXZlcl9pbmZvKERJX0VWQUxfTlVNQkVSKSkKKyAgeworICAgIGNtZC0+c3VjY2VzcyA9IDA7CisgICAgLy9wcmludGYoIktvbW1hbmRvIG5pY2h0IGVyZm9sZ3JlaWNoOiAlT1xuIiwgY21kKTsKKyAgICBjb21taXQoY21kKTsKKyAgfQorICAvLyBXZW5uIG5pY2h0LCB3YXIgZGFzIGxldHp0ZSBLb21tYW5kbyBvZmZlbmJhciBkb2NoIGVyZm9sZ3JlaWNoLiBBdXMKKyAgLy8gaXJnZW5kbmVtIEdydW5kIGhhYmVuIHdpciBhYmVyIGRlbiBTdGFydCBkZXMgbmV1ZW4gS29tbWFuZG9zIHZlcnBhc3N0LgorICAvLyBEYWhlciB2ZXJ3ZXJmZW4gd2lyIGRhcyBqZXR6dC4gRGFzIGFsdGUgS29tbWFuZG8gd2FyIGFiZXIgb2ZmZW5iYXIKKyAgLy8gZXJmb2xncmVpY2gsIGRhaGVyIHdpcmQgZXMgamV0enQgYWJnZXNjaGxvc3Nlbi4KKyAgZWxzZQorICB7CisgICAgY29tbWl0KGNtZCk7CisgIH0KK30KKworcHVibGljIHZvaWQgTG9nRVAoaW50IHR5cGUpCit7CisgIGlmICghc2l6ZW9mKGNvbW1hbmRzKSkKKyAgICByZXR1cm47CisgIHN0cnVjdCBjbWRfcyBjbWQgPSBjb21tYW5kc1s8MV07CisgIC8vIERhcmYgbnVyIHZvbSBTcGllbGVyb2JqZWt0IGdlcnVmZW4gd2VyZGVuLCB3ZWxjaGVzIGRhcyBsZXR6dGUgS29tbWFuZG8KKyAgLy8gYW5nZWZhbmdlbiBoYXQuCisgIGlmIChjbWQtPnRwX3VpZCAhPSBnZXR1aWQocHJldmlvdXNfb2JqZWN0KCkpKQorICAgIHJldHVybjsKKyAgLy9wcmludGYoIkZQIGdlZnVuZGVuOiAlT1xuIiwgY21kKTsKKyAgLy8gdW5kIGRpZXMgZ2Vob2VydCBudXIgenVtIGxldHp0ZW4gS29tbWFuZG8sIHdlbm4gVmVyYiB1bmQgRXZhbC1ObworICAvLyB1ZWJlcmVpbnN0aW1tZW4uCisgIGlmIChjbWQtPnZlcmIgPT0gcXVlcnlfdmVyYigpCisgICAgICB8fCBjbWQtPmV2YWxubyA9PSBkcml2ZXJfaW5mbyhESV9FVkFMX05VTUJFUikpCisgIHsKKyAgICBjbWQtPmZwID0gdHlwZSsxOworICAgIC8vIFVuZCB3ZW5uIGVzIG5lbiBGUCBnYWIsIGlzdCBkYXMgS29tbWFuZG8gYXVjaCBlcmZvbGdyZWljaC4KKyAgICBjb21taXQoY21kKTsKKyAgfQorfQorCmRpZmYgLS1naXQgYS9zZWN1cmUvdGVsbmV0bmVnLXN0cnVjdHMuYyBiL3NlY3VyZS90ZWxuZXRuZWctc3RydWN0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlZmVlYWUKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvdGVsbmV0bmVnLXN0cnVjdHMuYwpAQCAtMCwwICsxLDQ3IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gdGVsbmV0bmVnLXN0cnVjdHMuYyAtLSBTdHJ1Y3RzIGZ1ZXIgZGllIFRlbG5ldCBPcHRpb24gaGFuZGxlcgorLy8KKyNwcmFnbWEgc3RyaWN0X3R5cGVzLHNhdmVfdHlwZXMKKyNwcmFnbWEgcmFuZ2VfY2hlY2sKKyNwcmFnbWEgbm9fY2xvbmUKKyNwcmFnbWEgbm9fc2hhZG93CisjcHJhZ21hIHBlZGFudGljCisKK3N0cnVjdCB0b19zdGF0ZV9zIHsKKyAgaW50IGxvY2Fsc2lkZTsgICAgICAvLyB3aXNoIGZvciB0aGUgbG9jYWwgc2lkZSAoTVVEKQorICBpbnQgcmVtb3Rlc2lkZTsgICAgIC8vIHdpc2ggZm9yIHRoZSByZW1vdGUgc2lkZSAoQ0xJRU5UKQorICBpbnQgKnNiZGF0YTsgICAgICAgIC8vIGxhc3QgU0IgZGF0YSBzZW50L3JlY2VpdmVkIGJ5IHVzCit9OworCitzdHJ1Y3QgdGVsb3B0X3MgeworICBpbnQgb3B0aW9uOworICAgLy8gUmVjZWl2ZWhhbmRsZXIsIHdpcmQgZ2VydWZlbiwgd2VubiB3aXIgdm9tIENsaWVudCBpcmdlbmR3YXMgYnpnbC4gZGllc2VyCisgICAvLyBUZWxuZXQgT3B0aW9uIGVtcGZhbmdlbi4gV2VubiBnZXNldHp0LCBkYXJmIGRlciBDbGllbnQgZGllIE9wdGlvbgorICAgLy8gZWluc2NoYWx0ZW4uCisgIGNsb3N1cmUgcmVtb3RlaGFuZGxlcjsKKyAgLy8gV2lyZCBnZXJ1ZmVuLCB3ZW5uIGRpZSBPcHRpb24gYXVmIHVuc2VyZXIgU2VpdGUgZWluZ2VzY2hhbHRldCB3dXJkZS4KKyAgLy8gV2VubiBnZXNldHp0LCBzb2xsIHZlcnN1Y2h0IHdlcmRlbiwgZGllIE9wdGlvbiBhdWYgTXVkc2VpdGUKKyAgLy8gZWluenVzY2hhbHRlbgorICBjbG9zdXJlIGxvY2FsaGFuZGxlcjsKKyAgLy8gRGllIFd1ZW5zY2hlIF93YWVocmVuZF8gZWluZXIgVmVyaGFuZGx1bmcgKGJ6dy4gZ2VzZW5kZXRlIChsb193aXNoZXMpIHVuZAorICAvLyBlbXBmYW5nZW5lIChyZV93aXNoZXMpIFNCLURhdGVuIGF1Y2ggYXVzc2VyaGFsYiB2b24gVmVyaGFuZGx1bmdlbikuCisgIHN0cnVjdCB0b19zdGF0ZV9zIGxvX3dpc2hlczsgICAgLy8gb3VyIHdpc2hlcyAoc2VudCBieSB1cykKKyAgc3RydWN0IHRvX3N0YXRlX3MgcmVfd2lzaGVzOyAgICAvLyByZW1vdGUgd2lzaGVzIChyZWNlaXZlZCBieSB1cykKKyAgLy8gY3VycmVudGx5IGVmZmVjdGl2ZS9hY3RpdmUgc3RhdGUKKyAgc3RydWN0IHRvX3N0YXRlX3Mgc3RhdGU7CisgIC8vIGRhdGEgdXNlZCBieSB0aGUgaGFuZGxlcnMgLSBOT1QgVVNFRCBCWSB0aGlzIHByb2dyYW0hCisgIG1peGVkIGRhdGE7Cit9OworLyogZXhwbGFuYXRpb25zOgorICAgdGVsb3B0X3MtPmxvX3dpc2hlcy0+bG9jYWxzaWRlOiB0aGUgc3RhdGUgd2Ugd2FudCB0byBiZSBpbiAgKFdJTEwvV09OVCkKKyAgIHRlbG9wdF9zLT5sb193aXNoZXMtPnJlbW90ZXNpZGU6IHRoZSBzdGF0ZSB3ZSB3YW50IHRoZSBvdGhlciBzaWRlIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBpbiAgKERPL0RPTlQpCisgICB0ZWxvcHRfcy0+cmVfd2lzaGVzLT5sb2NhbHNpZGU6IHRoZSBzdGF0ZSB0aGUgb3RoZXIgc2lkZSB3YW50cyBVUyB0byBiZSBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRE8vRE9OVCkKKyAgIHRlbG9wdF9zLT5yZV93aXNoZXMtPnJlbW90ZXNpZGU6IHRoZSBzdGF0ZSB0aGUgb3RoZXIgc2lkZSB3YW50cyB0byBiZSBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdJTEwvV09OVCkKKyAgIHRlbG9wdF9zLT5zdGF0ZTogICB0aGUgY3VycmVudGx5IGVmZmVjdGl2ZSBzdGF0ZSBvZiB0aGUgb3B0aW9uIG9uIHRoZSB0d28KKyAgICAgICAgICAgICAgICAgICAgICBzaWRlcy4KKyAgICovCisKZGlmZiAtLWdpdCBhL3NlY3VyZS90ZWxuZXRuZWcuYyBiL3NlY3VyZS90ZWxuZXRuZWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDFlMWEwCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3RlbG5ldG5lZy5jCkBAIC0wLDAgKzEsODYzIEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gdGVsbmV0bmVnLmMgLS0gVmVyd2FsdHVuZyB2b24gVGVsbmV0LU5lZ290aWF0aW9ucworLy8KKy8vICRJZCQKKworLyogRGFzIE9yaWdpbmFsIHd1cmRlIHZvbiBNYXJjdXNAVGFwcCB6dXIgVmVyZnVlZ3VuZyBnZXN0ZWxsdC4gKi8KKy8qIEFuZ2VwYXNzdCBmdWVyIGRpZSBNRy1NdWRsaWIgdm9uIFJpbmdvckBNRyAqLworLyogV2VpdGdlaGVuZCB1ZWJlcmFyYmVpdGV0IHZvbiBaZXNzdHJhQE1HICovCisKKyNwcmFnbWEgc3RyaWN0X3R5cGVzLHNhdmVfdHlwZXMKKyNwcmFnbWEgcmFuZ2VfY2hlY2sKKyNwcmFnbWEgbm9fY2xvbmUKKyNwcmFnbWEgbm9fc2hhZG93CisjcHJhZ21hIHBlZGFudGljCisKK2luaGVyaXQgIi9zZWN1cmUvdGVsbmV0bmVnLXN0cnVjdHMuYyI7CisKKyNkZWZpbmUgTkVFRF9QUk9UT1RZUEVTCisjaW5jbHVkZSAiL3NlY3VyZS90ZWxuZXRuZWcuaCIKKyN1bmRlZiBORUVEX1BST1RPVFlQRVMKKworLy8gdW50ZXJzdHVldHp0ZSBPcHRpb25lbjoKKy8vIFRFTE9QVF9FT1IsIFRFTE9QVF9OQVdTLCBURUxPUFRfTElORU1PREUsIFRFTE9QVF9UVFlQRQorCisvLyNkZWZpbmUgX19ERUJVR19fIDEKKworI2lmZGVmIF9fREVCVUdfXworI2RlZmluZSBERUJVRyh4KSAgICAgICAgaWYgKGludGVyYWN0aXZlKHRoaXNfb2JqZWN0KCkpKVwKKyAgICAgICAgICB0ZWxsX29iamVjdCh0aGlzX29iamVjdCgpLCJUTjogIiArIHggKyAiXG4iKQorI2RlZmluZSBEVE4oeCx5KSBfZGVidWdfcHJpbnQoeCx5KQorI2Vsc2UKKyMgZGVmaW5lIERFQlVHKHgpCisjIGRlZmluZSBEVE4oeCx5KQorI2VuZGlmCisKKworCisvLyBBdXMgbWluaV9wcm9wcy5jOgorcHVibGljIHZhcmFyZ3MgbWl4ZWQgUXVlcnkoIHN0cmluZyBzdHIsIGludCB0eXBlICk7CitwdWJsaWMgdmFyYXJncyBtaXhlZCBTZXQoIHN0cmluZyBzdHIsIG1peGVkIHZhbHVlLCBpbnQgdHlwZSApOworCitwcml2YXRlIG5vc2F2ZSBtYXBwaW5nIFROID0gKFtdKTsKK25vc2F2ZSBzdHJpbmcgKlRlcm1pbmFsczsKKworLy8gUHJvdG90eXBlbgorcHJpdmF0ZSB2b2lkIGV2YWxfbmF3cyhpbnQgKm9wdGFyZ3MpOworCisjaWZkZWYgX19ERUJVR19fCisvLyBHaWJ0cyBlaW5pZ2UgS29uc3RhbnRlbiBtaXQgc3ltLiBOYW1lbiBhdXMuCitwcml2YXRlIHN0cmluZyBkdHJhbnNsYXRlKGludCBpKSB7CisgIHN3aXRjaChpKSB7CisgICAgY2FzZSBJQUM6IHJldHVybiAiSUFDIjsKKyAgICBjYXNlIERPTlQ6IHJldHVybiAiRE9OVCI7CisgICAgY2FzZSBETzogcmV0dXJuICJETyI7CisgICAgY2FzZSBXT05UOiByZXR1cm4gIldPTlQiOworICAgIGNhc2UgV0lMTDogcmV0dXJuICJXSUxMIjsKKyAgICBjYXNlIFNCOiByZXR1cm4gIlNCIjsKKyAgICBjYXNlIFNFOiByZXR1cm4gIlNFIjsKKyAgICBjYXNlIEVPUjogcmV0dXJuICJFT1IiOworICAgIGNhc2UgVEVMT1BUX0xJTkVNT0RFOiByZXR1cm4gIlRFTE9QVF9MSU5FTU9ERSI7CisgICAgY2FzZSBURUxPUFRfWERJU1BMT0M6IHJldHVybiAiVEVMT1BUX1hESVNQTE9DIjsKKyAgICBjYXNlIFRFTE9QVF9FTlZJUk9OOiByZXR1cm4gIlRFTE9QVF9FTlZJUk9OIjsKKyAgICBjYXNlIFRFTE9QVF9ORVdFTlY6IHJldHVybiAiVEVMT1BUX05FV0VOViI7CisgICAgY2FzZSBURUxPUFRfRU9SOiByZXR1cm4gIlRFTE9QVF9FT1IiOworICAgIGNhc2UgVEVMT1BUX05BV1M6IHJldHVybiAiVEVMT1BUX05BV1MiOworICAgIGNhc2UgVEVMT1BUX1RTUEVFRDogcmV0dXJuICJURUxPUFRfVFNQRUVEIjsKKyAgICBjYXNlIFRFTE9QVF9UVFlQRTogcmV0dXJuICJURUxPUFRfVFRZUEUiOworICAgIGNhc2UgVEVMT1BUX0VDSE86IHJldHVybiAiVEVMT1BUX0VDSE8iOworICAgIGNhc2UgVEVMT1BUX1NHQTogcmV0dXJuICJURUxPUFRfU0dBIjsKKyAgICBjYXNlIFRFTE9QVF9OQU1TOiByZXR1cm4gIlRFTE9QVF9OQU1TIjsKKyAgICBjYXNlIFRFTE9QVF9TVEFUVVM6IHJldHVybiAiVEVMT1BUX1NUQVRVUyI7CisgICAgY2FzZSBURUxPUFRfVE06IHJldHVybiAiVEVMT1BUX1RNIjsKKworICAgIGNhc2UgVEVMT1BUX01TRFA6IHJldHVybiAiVEVMT1BUX01TRFAiOworICAgIGNhc2UgVEVMT1BUX0NPTVBSRVNTMjogcmV0dXJuICJURUxPUFRfQ09NUFJFU1MyIjsKKyAgICBjYXNlIFRFTE9QVF9NU1A6IHJldHVybiAiVEVMT1BUX01TUCI7CisgICAgY2FzZSBURUxPUFRfTVhQOiByZXR1cm4gIlRFTE9QVF9NWFAiOworICAgIGNhc2UgVEVMT1BUX0FUQ1A6IHJldHVybiAiVEVMT1BUX0FUQ1AiOworICAgIGNhc2UgVEVMT1BUX0dNQ1A6IHJldHVybiAiVEVMT1BUX0dNQ1AiOworICAgIGNhc2UgVEVMT1BUX01TU1A6IHJldHVybiAiVEVMT1BUX01TU1AiOworICB9CisgIHJldHVybiB0b19zdHJpbmcoaSk7Cit9CisKKy8vIEdpYnQgPGFycj4gaGFsYndlZ3MgbGVzYmFyIGFuIHRoaXNfb2JqZWN0KCkgYXVzLgorcHJpdmF0ZSB2b2lkIF9kZWJ1Z19wcmludChzdHJpbmcgeCwgaW50ICphcnIpIHsKKyAgaWYgKGFyclsxXSA9PSBTQiAmJiBhcnJbPDFdICE9IFNFKQorICAgIGFyciArPSAoe0lBQywgU0V9KTsKKyAgY2xvc3VyZSBtYXBfaW50ID0gZnVuY3Rpb24gc3RyaW5nIChpbnQgaSkKKyAgICB7IGlmIChpID49IDMyICYmIGkgPD0gMTI2KSByZXR1cm4gc3ByaW50ZigiJWMiLGkpOworICAgICAgcmV0dXJuICJbIit0b19zdHJpbmcoaSkrIl0iOworICAgIH07CisgIGlmIChzaXplb2YoYXJyKTw9NSkgeworICAgIGZvcmVhY2goaW50IGMgOiBhcnIpCisgICAgICB4ICs9ICIgIiArIGR0cmFuc2xhdGUoYyk7CisgIH0KKyAgZWxzZSB7CisgICAgICB4ICs9IGR0cmFuc2xhdGUoYXJyWzBdKSArICIgIiArIGR0cmFuc2xhdGUoYXJyWzFdKSArICIgIgorICAgICAgICAgICArIGR0cmFuc2xhdGUoYXJyWzJdKSArICIgIgorICAgICAgICAgICArIGltcGxvZGUobWFwKGFyclszLi48M10sIG1hcF9pbnQpLCIgIikKKyAgICAgICAgICAgKyAiICIgKyBkdHJhbnNsYXRlKGFycls8Ml0pICsgIiAiICsgZHRyYW5zbGF0ZShhcnJbPDFdKTsKKyAgfQorICBERUJVRyh4KTsKK30KKyNlbmRpZgorCitwcm90ZWN0ZWQgdmFyYXJncyBpbnQgc2VuZF90ZWxuZXRfbmVnKGludCAqYXJyLCBpbnQgYm1fZmxhZ3MpCit7CisgICAgaWYgKCBzaXplb2YoYXJyKSA8IDIgKQorICAgICAgICByZXR1cm4gZWZ1bjo6YmluYXJ5X21lc3NhZ2UoYXJyLGJtX2ZsYWdzKTsKKworICAgIHN0cnVjdCB0ZWxvcHRfcyBvcHQgPSBUTlthcnJbMV1dOworCisgICAgc3dpdGNoIChhcnJbMF0peworICAgIGNhc2UgRE86CisgICAgY2FzZSBET05UOgorICAgICAgICAob3B0LT5sb193aXNoZXMpLT5yZW1vdGVzaWRlID0gYXJyWzBdOworICAgICAgICBhcnIgPSAoe0lBQ30pICsgYXJyOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFdJTEw6CisgICAgY2FzZSBXT05UOgorICAgICAgICAob3B0LT5sb193aXNoZXMpLT5sb2NhbHNpZGUgPSBhcnJbMF07CisgICAgICAgIGFyciA9ICh7SUFDfSkgKyBhcnI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU0I6CisgICAgICAgIChvcHQtPmxvX3dpc2hlcyktPnNiZGF0YSA9IGFyclswLi5dOworICAgICAgICBhcnIgPSAoe0lBQ30pICsgYXJyICsgKHtJQUMsIFNFfSk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBEVE4oInNlbmRfdG46ICIsYXJyKTsKKyAgICByZXR1cm4gZWZ1bjo6YmluYXJ5X21lc3NhZ2UoYXJyLCBibV9mbGFncyk7Cit9CisKK3Byb3RlY3RlZCB2YXJhcmdzIGludCBzZW5kX3RlbG5ldF9uZWdfc3RyKHN0cmluZyBzdHIsIGludCBibV9mbGFncykgeworI2lmZGVmIF9fREVCVUdfXworICAgIC8vIERlYnVnYXVzZ2FiZW4genVyIFplaXQgbnVyIGZ1ZXIgYXJyYXliYXNpZXJ0ZSBWYXJpYW50ZQorICAgIHJldHVybiBzZW5kX3RlbG5ldF9uZWcodG9fYXJyYXkoc3RyKSwgYm1fZmxhZ3MpOworI2Vsc2UKKyAgICBpZiAoIHNpemVvZihzdHIpIDwgMiApCisgICAgICAgIHJldHVybiBlZnVuOjpiaW5hcnlfbWVzc2FnZShzdHIsIGJtX2ZsYWdzKTsKKworICAgIHN0cnVjdCB0ZWxvcHRfcyBvcHQgPSBUTltzdHJbMV1dOworCisgICAgc3dpdGNoIChzdHJbMF0pIHsKKyAgICBjYXNlIERPOgorICAgIGNhc2UgRE9OVDoKKyAgICAgICAgKG9wdC0+bG9fd2lzaGVzKS0+cmVtb3Rlc2lkZSA9IHN0clswXTsKKyAgICAgICAgc3RyPXNwcmludGYoIiVjJXMiLElBQyxzdHIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFdJTEw6CisgICAgY2FzZSBXT05UOgorICAgICAgICAob3B0LT5sb193aXNoZXMpLT5sb2NhbHNpZGUgPSBzdHJbMF07CisgICAgICAgIHN0cj1zcHJpbnRmKCIlYyVzIixJQUMsc3RyKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTQjoKKyAgICAgICAgKG9wdC0+bG9fd2lzaGVzKS0+c2JkYXRhID0gbWFwKGV4cGxvZGUoc3RyWzAuLl0sIiIpLCMndG9faW50KTsKKyAgICAgICAgc3RyPXNwcmludGYoIiVjJXMlYyVjIiwgSUFDLCBzdHIsIElBQywgU0UpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gZWZ1bjo6YmluYXJ5X21lc3NhZ2Uoc3RyLCBibV9mbGFncyk7CisjZW5kaWYgLy8gX19ERUJVR19fCit9CisKKy8vIFN0YXJ0ZXQgZWluZSBWZXJoYW5kbHVuZywgdW0gZGVuIFN0YXR1cyBlaW5lciBPcHRpb24genUgYWVuZGVybi4KKy8vIFdlbm4gYmVyZWl0cyBlaW5lIFZlcmhhbmRsdW5nIGxhZXVmdCwgd2lyZCBuaWNodHMgZ2VtYWNodCB1bmQgLTEKKy8vIHp1cnVlY2tnZWJlbi4KKy8vIFdlbm4gZGllIFZlcmhhbmRsdW5nIGtlaW5lIEFlbmRlcnVuZyB2b20gU3RhdHVzIHF1byB6dW0gWmllbCBoYXQsIHdpcmQKKy8vIG5pY2h0cyBnZW1hY2h0IHVuZCAtMiB6dXJ1ZWNrZ2VnZWJlbi4KKy8vIEFuc29uc3RlbiBpc3QgZGllIFJ1ZWNrZ2FiZSBkaWUgQW56YWhsIGRlciB1ZWJlcm1pdHRlbHRlbiBaZWljaGVuLgorLy8gPGFjdGlvbj46IFdJTEw6IE9wdGlvbiBzb2xsIGF1ZiBkaWVzZXIgU2VpdGUgZWluZ2VzY2hhbHRldCB3ZXJkZW4uCisvLyAgICAgICAgICAgV09OVDogT3B0aW9uIHNvbGwgYXVmIGRpZXNlciBTZWl0ZSBhdXNnZXNjaGFsdGV0IHdlcmRlbi4KKy8vICAgICAgICAgICBETyAgOiBPcHRpb24gc29sbCBhdWYgZGVyIGFuZGVyZW4gU2VpdGUgZWluZ2VzY2hhbHRldCB3ZXJkZW4uCisvLyAgICAgICAgICAgRE9OVDogT3B0aW9uIHNvbGwgYXVmIGRlciBhbmRlcmVuIFNlaXRlIGF1c2dlc2NoYWx0ZXQgd2VyZGVuLgorcHJvdGVjdGVkIGludCBkb190ZWxuZXRfbmVnKGludCBvcHRpb24sIGludCBhY3Rpb24pIHsKKyAgc3RydWN0IHRlbG9wdF9zIG9wdCA9IFROW29wdGlvbl07CisgIGlmICghc3RydWN0cChvcHQpKQorICB7CisgICAgb3B0ID0gKDx0ZWxvcHRfcz4gb3B0aW9uOiBvcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgcmVfd2lzaGVzOiAoPHRvX3N0YXRlX3M+KSwKKyAgICAgICAgICAgICAgICAgICAgICBsb193aXNoZXM6ICg8dG9fc3RhdGVfcz4pLAorICAgICAgICAgICAgICAgICAgICAgIHN0YXRlOiAoPHRvX3N0YXRlX3M+KQorICAgICAgICAgICk7CisgICAgVE5bb3B0aW9uXSA9IG9wdDsKKyAgfQorICAvLyBlcyB3aXJkIG51ciBnZXBydWVmdCwgb2Igd2lyIGJlcmVpdHMgZWluZSBWZXJoYW5kbHVuZyBiZWdvbm5lbiBoYWJlbgorICAvLyAobG9fd2lzaGVzKSwgd2VpbCByZWlua29tbWVuZGUgcmVtb3RlIFd1ZW5zY2hlIGxldHp0ZW5kbGljaCBzb2ZvcnQgZHVyY2gKKyAgLy8gdW5zZXJlIEFudHdvcnQgZXJsZWRpZ3Qgc2luZC4KKyAgc3dpdGNoKGFjdGlvbikKKyAgeworICAgIGNhc2UgV0lMTDoKKyAgICAgIGlmIChvcHQtPmxvX3dpc2hlcy0+bG9jYWxzaWRlICE9IDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIGlmIChvcHQtPnN0YXRlLT5sb2NhbHNpZGUpCisgICAgICAgIHJldHVybiAtMjsKKyAgICAgIHJldHVybiBzZW5kX3RlbG5ldF9uZWcoICh7IFdJTEwsIG9wdGlvbiB9KSApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBXT05UOgorICAgICAgaWYgKG9wdC0+bG9fd2lzaGVzLT5sb2NhbHNpZGUgIT0gMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgaWYgKCFvcHQtPnN0YXRlLT5sb2NhbHNpZGUpCisgICAgICAgIHJldHVybiAtMjsKKyAgICAgIHJldHVybiBzZW5kX3RlbG5ldF9uZWcoICh7IFdPTlQsIG9wdGlvbiB9KSApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBETzoKKyAgICAgIGlmIChvcHQtPmxvX3dpc2hlcy0+cmVtb3Rlc2lkZSAhPSAwKQorICAgICAgICByZXR1cm4gLTE7CisgICAgICBpZiAob3B0LT5zdGF0ZS0+cmVtb3Rlc2lkZSkKKyAgICAgICAgcmV0dXJuIC0yOworICAgICAgcmV0dXJuIHNlbmRfdGVsbmV0X25lZyggKHsgRE8sIG9wdGlvbiB9KSApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBET05UOgorICAgICAgaWYgKG9wdC0+bG9fd2lzaGVzLT5yZW1vdGVzaWRlICE9IDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIGlmICghb3B0LT5zdGF0ZS0+cmVtb3Rlc2lkZSkKKyAgICAgICAgcmV0dXJuIC0yOworICAgICAgcmV0dXJuIHNlbmRfdGVsbmV0X25lZyggKHsgRE9OVCwgb3B0aW9uIH0pICk7CisgICAgICBicmVhazsKKyAgfQorICByYWlzZV9lcnJvcihzcHJpbnRmKCJVbnN1cHBvcnRlZCB0ZWxuZXQgbmVnb3RhdGlvbiBhY3Rpb24gaW4gIgorICAgICAgImRvX3RlbG5ldF9uZWcoKTogJWRcbiIsYWN0aW9uKSk7Cit9CisKKy8vIExPQ0FMIFN0YW5kYXJkIEhhbmRsZXJzIC8vCitwcml2YXRlIHZvaWQgX3N0ZF9sb19oYW5kbGVyX2VvcihzdHJ1Y3QgdGVsb3B0X3Mgb3B0LCBpbnQgYWN0aW9uKSB7CisgIC8vIHRhdHNhZWNobGljaCBuaXggenUgdHVuLiBIYW5kbGVyIGlzdCBudXIgZGEsIGRhbWl0IGRpZSBPcHRpb24gYXVmIGRpZXNlcgorICAvLyBTZWl0ZSBha3RpdmllcnQgd2lyZC4gRGllIEFyYmVpdCBlcmxlZGlndCBwcmludF9wcm9tcHQuCisgIHJldHVybjsKK30KKworcHJpdmF0ZSB2b2lkIF9zdGRfbG9faGFuZGxlcl9tc3NwKHN0cnVjdCB0ZWxvcHRfcyBvcHQsIGludCBhY3Rpb24pIHsKKyAgLy8gbnVyIGVpbnNjaGFsdGVuIGlzdCBpbnRlcmVzc2FudC4KKyAgaWYgKGFjdGlvbiAhPSBMT0NBTE9OKQorICAgIHJldHVybjsKKyAgLy8gS3JhbXMgc2VuZGVuLCB3ZW5uIE9iamVrdCBnZWxhZGVuLiBTb25zdCB3aWVkZXIgYWJzY2hhbHRlbiAoa29tbXQKKyAgLy8gaG9mZmVudGxpY2ggbmljaHQgdm9yKS4uLgorICBvYmplY3QgbXNzcCA9IGZpbmRfb2JqZWN0KCIvc2VjdXJlL21pc2MvbXNzcCIpOworICBpZiAoIW1zc3ApCisgICAgc2VuZF90ZWxuZXRfbmVnKCAoe1dPTlQsIFRFTE9QVF9NU1NQIH0pICk7CisgIGVsc2UKKyAgeworICAgIHNlbmRfdGVsbmV0X25lZ19zdHIoc3ByaW50ZigiJWMlYyVzIiwKKyAgICAgICAgICBTQiwgVEVMT1BUX01TU1AsIG1zc3AtPmdldF90ZWxuZWdzX3N0cigpKSk7CisgICAgLy8gZGllIERhdGVuIGJyYXVjaGVuIHdpciBuaWNodCBtZWhyCisgICAgb3B0LT5sb193aXNoZXMtPnNiZGF0YSA9IDA7CisgIH0KK30KKworCisvLyBSRU1PVEUgU3RhbmRhcmQgSGFuZGxlcnMgLy8KK3ByaXZhdGUgdm9pZCBfc3RkX3JlX2hhbmRsZXJfdG0oc3RydWN0IHRlbG9wdF9zIG9wdCwgaW50IGFjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpkYXRhKQoreworICAvLyBlZ2FsLCB3YXMgZ2VhbnR3b3J0ZXQgd3VyZGUsIGVzIGdpYnQgbmVuIEhpbndlaXMgYXVmIGRpZSByb3VuZC10cmlwLXRpbWUuCisgIC8vIFdlbm4gZWluIEFycmF5IGluIG9wdC0+ZGF0YVsxXSBzdGVodCwgcmVjaG5lbiB3aXIgZGFzIGF1cyB1bmQgc2NocmVpYmVuIGVzCisgIC8vIGluIG9wdC0+ZGF0YVswXSBhbHMgRXJnZWJuaXMgcmVpbi4KKyAgaWYgKHBvaW50ZXJwKG9wdC0+ZGF0YSkgJiYgcG9pbnRlcnAob3B0LT5kYXRhWzFdKSkKKyAgeworICAgIGludCAqdXQgPSB1dGltZSgpOworICAgIGludCAqc3RhcnQgPSBvcHQtPmRhdGFbMV07CisgICAgaW50IHJlcyA9ICh1dFswXSAtIHN0YXJ0WzBdKSAqIDEwMDAwMDA7CisgICAgcmVzICs9IHV0WzFdIC0gc3RhcnRbMV07CisgICAgb3B0LT5kYXRhWzBdID0gcmVzOworICAgIG9wdC0+ZGF0YVsxXSA9IDA7CisgICAgREVCVUcoIlJUVDogIityZXMpOworICB9CisgIHJldHVybjsKK30KKworcHJpdmF0ZSB2b2lkIF9zdGRfcmVfaGFuZGxlcl9uYXdzKHN0cnVjdCB0ZWxvcHRfcyBvcHQsIGludCBhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpkYXRhKQoreworICBpZiAoYWN0aW9uID09IFNCKQorICB7CisgICAgZXZhbF9uYXdzKGRhdGEpOworICB9Cit9CisKK3ByaXZhdGUgdm9pZCBfc3RkX3JlX2hhbmRsZXJfbGluZW1vZGUoc3RydWN0IHRlbG9wdF9zIG9wdCwgaW50IGFjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpkYXRhKQoreworICBpZiAoYWN0aW9uID09IFJFTU9URU9OKQorICB7CisgICAgLy8gc2VlIC9kb2MvY29uY2VwdHMvbmVnb3RpYXRpb25zLiBXZSB1c2Ugb25seSB0aGUgbWluaW11bQorICAgIC8vIG5lZWRlZCBmb3IgbGluZW1vZGU6IHN3aXRjaGluZyBvbiBsb2NhbCBjb21tYW5kbGluZS1lZGl0aW5nCisgICAgLy8gZm9yIHRoZSBjbGllbnQuCisgICAgc2VuZF90ZWxuZXRfbmVnKCh7IFNCLCBURUxPUFRfTElORU1PREUsIExNX01PREUsIE1PREVfRURJVCB9KSk7CisgICAgLy8gZmx1c2ggb24gMGQgYW5kIDBhLi4uCisgICAgLy8gVE9ETzogd2hhdCBkb2VzIHRoaXMgZXhhY3RseSBkbz8KKyAgICBzZW5kX3RlbG5ldF9uZWcoKHsgU0IsIFRFTE9QVF9MSU5FTU9ERSwgRE8sIExNX0ZPUldBUkRNQVNLLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwfDB4MDggfSkpOworICAgIC8vR25hLi4uCisgICAgb3B0LT5sb193aXNoZXMtPnNiZGF0YSA9ICh7TU9ERV9FRElUfSk7CisgIH0KK30KKworcHJpdmF0ZSB2b2lkIF9zdGRfcmVfaGFuZGxlcl90dHlwZShzdHJ1Y3QgdGVsb3B0X3Mgb3B0LCBpbnQgYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmRhdGEpCit7CisgIGlmIChhY3Rpb24gPT0gU0IpCisgIHsKKyAgICAvL1RPRE86IGdldCByaWQgb2YgdGhpcyBoeXN0ZXJpY2FsIHN0dWZmLi4uCisgICAgLy9OT1RFOiBXZSBkbyBub3QgZG8gbXVsdGlwbGUgU0IgU0VORHMgZHVlIHRvIHNvbWUgd2VpcmQKKyAgICAvL2J1Z3MgaW4gSUJNMzI3MCBlbXVsYXRpbmcgdGVsbmV0cyB3aGljaCBjcmFzaCBpZiB3ZQorICAgIC8vZG8gdGhhdC4KKyAgICBpZiAoIHNpemVvZihkYXRhKSA8IDEgKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoIGRhdGFbMF0gIT0gVEVMUVVBTF9JUyApCisgICAgICAgIHJldHVybjsKKworICAgIHN0cmluZyB0bXB0ZXJtaW5hbCA9IGxvd2VyX2Nhc2UoIHRvX3N0cmluZyhkYXRhWzEuLl0pICk7CisgICAgaWYgKCAhVGVybWluYWxzICkKKyAgICAgICAgVGVybWluYWxzID0gKHsgdG1wdGVybWluYWwgfSk7CisgICAgZWxzZQorICAgICAgICBUZXJtaW5hbHMgKz0gKHsgdG1wdGVybWluYWwgfSk7CisKKyAgICBpZiAoIFF1ZXJ5KFBfVFRZX1RZUEUpICkKKyAgICAgICAgICBTZXQoIFBfVFRZX1RZUEUsIFRlcm1pbmFsc1swXSApOworICB9CisgIGVsc2UgaWYgKGFjdGlvbiA9PSBSRU1PVEVPTikKKyAgeworICAgIHNlbmRfdGVsbmV0X25lZygoeyBTQiwgVEVMT1BUX1RUWVBFLCBURUxRVUFMX1NFTkQgfSkpOworICB9Cit9CisKKy8vIEJpbmRldC9yZWdpc3RyaWVydCBIYW5kbGVyIGZ1ZXIgZGllIGpldy4gVGVsbmV0IE9wdGlvbi4gKE9kZXIgbG9lc2NodCBzaWUKKy8vIGF1Y2ggd2llZGVyLikgSmUgbmFjaCA8aW5pdG5lZz4gd2lyZCB2ZXJzdWNodCwgZGllIE9wdGlvbiBuZXUgenUKKy8vIHZlcmhhbmRlbG4uCitwcm90ZWN0ZWQgaW50IGJpbmRfdGVsbmVnX2hhbmRsZXIoaW50IG9wdGlvbiwgY2xvc3VyZSByZSwgY2xvc3VyZSBsbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5pdG5lZykKK3sKKyAgc3RydWN0IHRlbG9wdF9zIG9wdCA9IFROW29wdGlvbl07CisgIGlmICghc3RydWN0cChvcHQpKQorICB7CisgICAgb3B0ID0gKDx0ZWxvcHRfcz4gb3B0aW9uOiBvcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgcmVfd2lzaGVzOiAoPHRvX3N0YXRlX3M+KSwKKyAgICAgICAgICAgICAgICAgICAgICBsb193aXNoZXM6ICg8dG9fc3RhdGVfcz4pLAorICAgICAgICAgICAgICAgICAgICAgIHN0YXRlOiAoPHRvX3N0YXRlX3M+KQorICAgICAgICAgICk7CisgICAgVE5bb3B0aW9uXSA9IG9wdDsKKyAgfQorCisgIG9wdC0+cmVtb3RlaGFuZGxlciA9IHJlOworICBpZiAoaW5pdG5lZykKKyAgeworICAgIGlmIChyZSkKKyAgICAgIGRvX3RlbG5ldF9uZWcob3B0aW9uLCBETyk7CisgICAgZWxzZQorICAgICAgZG9fdGVsbmV0X25lZyhvcHRpb24sIERPTlQgKTsKKyAgfQorCisgIG9wdC0+bG9jYWxoYW5kbGVyID0gbG87CisgIGlmIChpbml0bmVnKQorICB7CisgICAgaWYgKGxvKQorICAgICAgZG9fdGVsbmV0X25lZyhvcHRpb24sIFdJTEwpOworICAgIGVsc2UKKyAgICAgIGRvX3RlbG5ldF9uZWcob3B0aW9uLCBXT05UKTsKKyAgfQorICByZXR1cm4gMTsKK30KKworCisvLyBNYWwgdW5zZXJlIFd1ZW5zY2hlIGFuIGRlbiBDbGllbnQgc2NoaWNrZW4gdW5kIGRpZSBTdGFuZGFyZGhhbmRsZXIKKy8vIHJlZ2lzdHJpZXJlbi4gSGllcmJlaSBiZWkgQmVkYXJmIG5ldWUgVmVyaGFuZGx1bmdlbiBzdGFydGVuLgorLy8gR2VydWZlbiBhdXMgbG9naW4uYyBuYWNoIFZlcmJpbmR1bmdzYXVmYmF1LgorLy8gQmVtZXJrdW5nOiBkYXMgU3BpZWxlcm9iamVrdCBiaWV0ZXQgZXZ0LiBub2NoIHp1c2FldHpsaWNoZSBUZWxuZXRvcHRpb25lbgorLy8gICAgICAgICAgICBhbiwgZGllIGRhbm4gdWViZXIgc3RhcnR1cF90ZWxuZXRfbmVncygpIChpbSBTcGllbGVyb2JqZWt0KQorLy8gICAgICAgICAgICBsYXVmZW4uCitwcm90ZWN0ZWQgdm9pZCBTZW5kVGVsb3B0cygpCit7CisgIGJpbmRfdGVsbmVnX2hhbmRsZXIoVEVMT1BUX0VPUiwgMCwgIydfc3RkX2xvX2hhbmRsZXJfZW9yLCAxKTsKKyAgaWYgKGZpbmRfb2JqZWN0KCIvc2VjdXJlL21pc2MvbXNzcCIpKQorICAgIGJpbmRfdGVsbmVnX2hhbmRsZXIoVEVMT1BUX01TU1AsIDAsICMnX3N0ZF9sb19oYW5kbGVyX21zc3AsIDEpOworCisgIGJpbmRfdGVsbmVnX2hhbmRsZXIoVEVMT1BUX05BV1MsICMnX3N0ZF9yZV9oYW5kbGVyX25hd3MsIDAsIDEpOworICBiaW5kX3RlbG5lZ19oYW5kbGVyKFRFTE9QVF9MSU5FTU9ERSwgIydfc3RkX3JlX2hhbmRsZXJfbGluZW1vZGUsIDAsIDEpOworICBiaW5kX3RlbG5lZ19oYW5kbGVyKFRFTE9QVF9UVFlQRSwgIydfc3RkX3JlX2hhbmRsZXJfdHR5cGUsIDAsIDEpOworICAvLyBmdWVyIFRFTE9QVF9UTSBqZXR6dCBrZWluZSBWZXJoYW5kbHVuZyBhbnN0b3NzZW4uCisgIGJpbmRfdGVsbmVnX2hhbmRsZXIoVEVMT1BUX1RNLCAjJ19zdGRfcmVfaGFuZGxlcl90bSwgMCwgMCk7Cit9CisKKworLy8gQmluZGV0IGRpZSBTdGFuZGFyZGhhbmRsZXIgX2F1cyBkaWVzZW1fIFByb2dyYW1tICh1bmQgdWViZXJzY2hyZWlidCBkYWJlaQorLy8gZ2dmLiBhbmRlcmUpLiBIaWVyYmVpIHdlcmRlbiBudXIgZGllIEhhbmRsZXIgbmV1IGdlYnVuZGVuLCBrZWluZSBuZXVlbgorLy8gVmVyaGFuZGx1bmdlbiBpbml0aWllcnQuCisvLyBnZXJ1ZmVuIGF1cyBiYXNlLmMgaW5kaXJla3QgdmlhIHN0YXJ0dXBfdGVsbmV0X25lZ3MoKS4KK3Byb3RlY3RlZCB2b2lkIF9iaW5kX3RlbG5lZ19zdGRfaGFuZGxlcnMoKSB7CisgIGJpbmRfdGVsbmVnX2hhbmRsZXIoVEVMT1BUX0VPUiwgMCwgIydfc3RkX2xvX2hhbmRsZXJfZW9yLCAwKTsKKyAgLy8gQmVzb25kZXJlIFNpdHVhdGlvbjogTVNTUCBpc3QgbmFjaCBTcGllbGVybG9naW4gZWlnZW50bGljaCB1bmludGVyZXNzYW50LgorICAvLyBEYWhlciBzcGFyZW4gd2lyIHVucyBkYXMgaW0gS29udGV4dCBkZXMgU3BpZWxlcm9iamVrdHMgdW5kIHNjaGFsdGVuIGVzCisgIC8vIGVpbmZhY2ggd2llZGVyIGF1cy4KKyAgYmluZF90ZWxuZWdfaGFuZGxlcihURUxPUFRfTVNTUCwgMCwgMCwgMCk7CisKKyAgYmluZF90ZWxuZWdfaGFuZGxlcihURUxPUFRfTkFXUywgIydfc3RkX3JlX2hhbmRsZXJfbmF3cywgMCwgMCk7CisgIGJpbmRfdGVsbmVnX2hhbmRsZXIoVEVMT1BUX0xJTkVNT0RFLCAjJ19zdGRfcmVfaGFuZGxlcl9saW5lbW9kZSwgMCwgMCk7CisgIGJpbmRfdGVsbmVnX2hhbmRsZXIoVEVMT1BUX1RUWVBFLCAjJ19zdGRfcmVfaGFuZGxlcl90dHlwZSwgMCwgMCk7CisgIGJpbmRfdGVsbmVnX2hhbmRsZXIoVEVMT1BUX1RNLCAjJ19zdGRfcmVfaGFuZGxlcl90bSwgMCwgMCk7Cit9CisKKworLy8gUnVmdCBkaWUgZW50c3ByZWNoZW5kZW4gaGFuZGxlciB2b24gZGVyIFRlbG5ldCBPcHRpb24uCisvLyBXZW5uIGVzIGtlaW5lbiBoYW5kbGVyIChtZWhyKSBnaWJ0LCB3aXJkIGRpZSBPcHRpb24gYXVjaCBhdWYgZGVyIGpld2VpbGlnZW4KKy8vIFNlaXRlIGF1c2dlc2NoYWx0ZXQuIERlc2hhbGIgTVVTUyBsb193aXNoZXMgdW5kIHJlX3dpc2hlcyB2b20gQXVmcnVmZXIgVk9SCisvLyBERU0gQVVGUlVGIHp1cnVlY2tnZXNldHp0IHdvcmRlbiBzZWluIQorLy8gPGFjdGlvbj46ICdMT0NBTE9OJzogICBPcHRpb24gd3VyZGUgYXVmIHVuc2VyZXIgU2VpdGUgZWluZ2VzY2hhbHRldAorLy8gICAgICAgICAgICdMT0NBTE9GRic6ICBPcHRpb24gd3VyZGUgYXVmIHVuc2VyZXIgU2VpdGUgYXVzZ2VzY2hhbHRldAorLy8gICAgICAgICAgICdSRU1PVEVPTic6ICBPcHRpb24gd3VyZGUgYXVmIENsaWVudHNlaXRlIGVpbmdlc2NoYWx0ZXQKKy8vICAgICAgICAgICAnUkVNT1RFT0ZGJzogT3B0aW9uIHd1cmRlIGF1ZiBDbGllbnRzZWl0ZSBhdXNnZXNjaGFsdGV0CisvLyAgICAgICAgICAgJ1NCJzogICAgICAgIFN1Ym9wdGlvbiBuZWdvdGlhdGlvbiBEYXRlbiB3dXJkZW4gZW1wZmFuZ2VuCisvLyA8ZGF0YT46IGRpZSBwZXIgU0IgZW1wZmFuZ2VuZW4gRGF0ZW4gKHVudmVyYXJiZWl0ZXQpCitwcml2YXRlIHZvaWQgX2NhbGxfaGFuZGxlcihzdHJ1Y3QgdGVsb3B0X3Mgb3B0LCBpbnQgYWN0aW9uLCBpbnQgKmRhdGEpIHsKKyAgc3dpdGNoKGFjdGlvbikKKyAgeworICAgIGNhc2UgUkVNT1RFT046CisgICAgY2FzZSBSRU1PVEVPRkY6CisgICAgY2FzZSBTQjoKKyAgICAgIGlmIChvcHQtPnJlbW90ZWhhbmRsZXIpCisgICAgICB7CisgICAgICAgIGZ1bmNhbGwob3B0LT5yZW1vdGVoYW5kbGVyLCBvcHQsIGFjdGlvbiwgZGF0YSk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIC8vIG9rLCBnZWh0IG5pY2h0LiBHZ2YuIEFic2NoYWx0ZW4gKGRvX3RlbG5ldF9uZWcgcGFzc3QgYXVmLAorICAgICAgICAvLyBkYXNzIG51ciB2ZXJoYW5kZWx0IHdpcmQsIHdlbm4gZGllIE9wdGlvbiBhbiBpc3QuKQorICAgICAgICBkb190ZWxuZXRfbmVnKCBvcHQtPm9wdGlvbiwgRE9OVCApOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBMT0NBTE9OOgorICAgIGNhc2UgTE9DQUxPRkY6CisgICAgICBpZiAob3B0LT5sb2NhbGhhbmRsZXIpCisgICAgICB7CisgICAgICAgIGZ1bmNhbGwob3B0LT5sb2NhbGhhbmRsZXIsIG9wdCwgYWN0aW9uKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgIC8vIG9rLCBnZWh0IG5pY2h0LiBHZ2YuIEFic2NoYWx0ZW4gKGRvX3RlbG5ldF9uZWcgcGFzc3QgYXVmLAorICAgICAgLy8gZGFzcyBudXIgdmVyaGFuZGVsdCB3aXJkLCB3ZW5uIGRpZSBPcHRpb24gYW4gaXN0LikKKyAgICAgICAgZG9fdGVsbmV0X25lZyggb3B0LT5vcHRpb24sIFdPTlQgKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICB9Cit9CisKKy8vIEdlcnVmZW4gdm9tIERyaXZlciwgd2VubiBuZXVlIHRlbG5ldCBvcHRpb25zIHJlaW5rb21tZW4uCit2b2lkCit0ZWxuZXRfbmVnKGludCBjb21tYW5kLCBpbnQgb3B0aW9uLCBpbnQgKm9wdGFyZ3MpCit7CisgICAgRFROKCJyZWN2X3RuOiAiLCAoe0lBQywgY29tbWFuZCwgb3B0aW9ufSkgKyAob3B0YXJnc3x8KHt9KSkpOworCisgICAgc3RydWN0IHRlbG9wdF9zIG9wdCA9IFROW29wdGlvbl07CisgICAgaWYgKCFzdHJ1Y3RwKG9wdCkpCisgICAgeworICAgICAgb3B0ID0gKDx0ZWxvcHRfcz4gb3B0aW9uOiBvcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICByZV93aXNoZXM6ICg8dG9fc3RhdGVfcz4pLAorICAgICAgICAgICAgICAgICAgICAgICAgbG9fd2lzaGVzOiAoPHRvX3N0YXRlX3M+KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlOiAoPHRvX3N0YXRlX3M+KQorICAgICAgICAgICAgKTsKKyAgICAgIFROW29wdGlvbl0gPSBvcHQ7CisgICAgfQorCisgICAgLy8gV2FzIHdpbGwgZGVyIENsaWVudCB0dW4/CisgICAgaWYgKGNvbW1hbmQgPT0gV09OVCkKKyAgICB7CisgICAgICAgIC8vIENsaWVudCB3aWxsIGRpZSBPcHRpb24gYXVmIHNlaW5lciBTZWl0ZSBhYnNjaGFsdGVuLiBXaXIgTVVFU1NFTiBkYXMKKyAgICAgICAgLy8gYWt6ZXB0aWVyZW4uCisgICAgICAgIC8vIFdpciBtdWVzc2VuIGRhcyBhbGxlcmRpbmdzIGlnbm9yaWVyZW4sIHdlbm4gZGllIE9wdGlvbiBiZXJlaXRzIGF1cworICAgICAgICAvLyBpc3QuCisgICAgICAgIGlmIChvcHQtPnN0YXRlLT5yZW1vdGVzaWRlPT0wKQorICAgICAgICB7CisgICAgICAgICAgLy8gQXVzbmFobWUgZnVlciBURUxPUFRfVE0sIGRhIGRhcyBrYXVtIGVpbiBDbGllbnQga2FubiB1bmQgZnVlciBSVFQKKyAgICAgICAgICAvLyBlcyBlaWdlbnRsaWNoIGF1Y2ggZWdhbCBpc3QsIHdhcyB6dXJ1ZWNrIGtvbW10OiBkZXIgaGFuZGxlciB3aXJkCisgICAgICAgICAgLy8genVtaW5kZXN0IGRvY2ggZ2VydWZlbiB6dW0gQXVzcmVjaG5lbiBkZXIgUlRUCisgICAgICAgICAgaWYgKG9wdGlvbiA9PSBURUxPUFRfVE0pCisgICAgICAgICAgICBfY2FsbF9oYW5kbGVyKG9wdCwgUkVNT1RFT0ZGLCAwKTsKKyAgICAgICAgICAvLyBhbnNvbnN0ZW4gYWJlciB3aXJrbGljaCBpZ25vcmllcmVuLiA7KQorICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBvcHQtPnJlX3dpc2hlcy0+cmVtb3Rlc2lkZSA9IGNvbW1hbmQ7CisgICAgICAgIC8vIEJlc3RhZXRpZ3VuZyBhdWYgZWluIFdPTlQgc2VuZGVuLCB3ZW5uIHdpciBuaWNodCBzZWxiZXIgc2Nob24gZWluCisgICAgICAgIC8vIERPTlQgZ2VzY2hpY2t0IGhhdHRlbi4KKyAgICAgICAgaWYgKG9wdC0+bG9fd2lzaGVzLT5yZW1vdGVzaWRlICE9IERPTlQpIHsKKyAgICAgICAgICBzZW5kX3RlbG5ldF9uZWcoICh7RE9OVCwgb3B0aW9ufSkgKTsKKyAgICAgICAgfQorICAgICAgICAvLyBXaXIgaGFiZW4gamV0enQgYXVmIGplZGVuIEZhbGwgZWluIERPTlQgZ2VzZW5kZXQgdW5kIGVpbiBXT05UCisgICAgICAgIC8vIGVyaGFsdGVuLiBEYW1pdCBpc3QgZGllIE9wdGlvbiBqZXR6dCBhdWYgZGVyIGNsaWVudHNlaXRlIGF1cy4KKyAgICAgICAgLy8gQXVzc2VyZGVtIHNldHplbiB3aXIgZGllIFdpc2hlcyB6dXJ1ZWNrLgorICAgICAgICBvcHQtPnJlX3dpc2hlcy0+cmVtb3Rlc2lkZSA9IDA7CisgICAgICAgIG9wdC0+bG9fd2lzaGVzLT5yZW1vdGVzaWRlID0gMDsKKyAgICAgICAgaWYgKG9wdC0+c3RhdGUtPnJlbW90ZXNpZGUgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgb3B0LT5zdGF0ZS0+cmVtb3Rlc2lkZSA9IDA7CisgICAgICAgICAgICBfY2FsbF9oYW5kbGVyKG9wdCwgUkVNT1RFT0ZGLCAwKTsKKyAgICAgICAgfQorICAgIH0gLy8gV09OVCB2b20gQ2xpZW50IHZlcmFyYmVpdGV0CisgICAgZWxzZSBpZiAoIGNvbW1hbmQgPT0gV0lMTCkKKyAgICB7CisgICAgICAgIC8vIFdlbm4gZGllIE9wdGlvbiBiZXJlaXRzIGFuIGlzdCwgbXVlc3NlbiB3aXIgZGllcyBpZ25vcmllcmVuLgorICAgICAgICBpZiAob3B0LT5zdGF0ZS0+cmVtb3Rlc2lkZSA9PSAxKQorICAgICAgICB7CisgICAgICAgICAgLy8gQXVzbmFobWUgZnVlciBURUxPUFRfVE0sIGRlciBoYW5kbGVyIHdpcmQgenVtaW5kZXN0IGRvY2ggZ2VydWZlbgorICAgICAgICAgIC8vIHp1bSBBdXNyZWNobmVuIGRlciBSVFQuIERpZXNlIE9wdGlvbiBsYWVzc3Qgc2ljaCBvaG5laGluCisgICAgICAgICAgLy8gYWt0aXZpZXJlbiwgYXVjaCB3ZW5uIHNpZSBzY2hvbiBhbiBpc3QuCisgICAgICAgICAgaWYgKG9wdGlvbiA9PSBURUxPUFRfVE0pCisgICAgICAgICAgICBfY2FsbF9oYW5kbGVyKG9wdCwgUkVNT1RFT04sIDApOworICAgICAgICAgIC8vIHNvbnN0IGFiZXIgd2lya2xpY2ggaWdub3JpZXJlbi4gOy0pCisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG9wdC0+cmVfd2lzaGVzLT5yZW1vdGVzaWRlID0gY29tbWFuZDsKKyAgICAgICAgaWYgKCBvcHQtPmxvX3dpc2hlcy0+cmVtb3Rlc2lkZSA9PSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gRGVyIENsaWVudCB3aWxsLCB3aXIgaGFiZW4gbm9jaCBuaXggZGF6dSBnZXNhZ3QuIChNaXQgdW5zZXJlcgorICAgICAgICAgICAgLy8gQW50d29ydCBpc3QgZGllIFZlcmhhbmRsdW5nIHVlYnJpZ2VucyBiZWVuZGV0LikKKyAgICAgICAgICAgIC8vIFdlbm4gZXMgZWluZW4gcmVtb3RlaGFuZGxlciBmdWVyIGRpZSBPcHRpb24gZ2lidCwgc2NoYWx0ZW4gd2lyCisgICAgICAgICAgICAvLyBzaWUgZWluLi4uCisgICAgICAgICAgICBpZiAob3B0LT5yZW1vdGVoYW5kbGVyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNlbmRfdGVsbmV0X25lZygoe0RPLCBvcHRpb259KSk7CisgICAgICAgICAgICAgICAgLy8gT3B0aW9uIGpldHp0IGFuIGRlciBDbGllbnRzZWl0ZSBhbi4KKyAgICAgICAgICAgICAgICBvcHQtPnJlX3dpc2hlcy0+cmVtb3Rlc2lkZSA9IDA7CisgICAgICAgICAgICAgICAgb3B0LT5sb193aXNoZXMtPnJlbW90ZXNpZGUgPSAwOworICAgICAgICAgICAgICAgIGlmIChvcHQtPnN0YXRlLT5yZW1vdGVzaWRlICE9IDEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBvcHQtPnN0YXRlLT5yZW1vdGVzaWRlID0gMTsKKyAgICAgICAgICAgICAgICAgICAgX2NhbGxfaGFuZGxlcihvcHQsIFJFTU9URU9OLCAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8vIHNvbnN0IHZlcndlaWdlcm4gd2lyIGRhcyBlaW5zY2hhbHRlbiAoZGllIG1laXN0ZW4gT3B0aW9uZW4KKyAgICAgICAgICAgICAgLy8gYXVmIENsaWVudHNlaXRlIHNpbmQgZnVlciB1bnMgZWggZWdhbCkuCisgICAgICAgICAgICAgIHNlbmRfdGVsbmV0X25lZygoe0RPTlQsIG9wdGlvbn0pKTsKKyAgICAgICAgICAgICAgLy8gT3B0aW9uIGpldHp0IGFuIGRlciBDbGllbnRzZWl0ZSBhdXMuCisgICAgICAgICAgICAgIG9wdC0+cmVfd2lzaGVzLT5yZW1vdGVzaWRlID0gMDsKKyAgICAgICAgICAgICAgb3B0LT5sb193aXNoZXMtPnJlbW90ZXNpZGUgPSAwOworICAgICAgICAgICAgICBpZiAob3B0LT5zdGF0ZS0+cmVtb3Rlc2lkZSAhPSAwKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBvcHQtPnN0YXRlLT5yZW1vdGVzaWRlID0gMDsKKyAgICAgICAgICAgICAgICAgIF9jYWxsX2hhbmRsZXIob3B0LCBSRU1PVEVPRkYsIDApOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIG9wdC0+bG9fd2lzaGVzLT5yZW1vdGVzaWRlID09IERPKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBXaXIgaGFiZW4gaGFiZW4gYmVyZWl0cyBwZXIgRE8gYW5nZWZvcmRlcnQsIGQuaC4gZGFzIGlzdCBkaWUKKyAgICAgICAgICAgIC8vIENsaWVudGJlc3RhZXRpZ3VuZyAtIHdpciBkdWVyZmVuIG5pY2h0IGJlc3RhZXRpZ2VuIHVuZCBkaWUKKyAgICAgICAgICAgIC8vIE9wdGlvbiBpc3QgamV0enQgY2xpZW50c2VpdGlnIGFrdGl2LiBWZXJoYW5kbHVuZyBiZWVuZGV0LgorICAgICAgICAgICAgb3B0LT5yZV93aXNoZXMtPnJlbW90ZXNpZGUgPSAwOworICAgICAgICAgICAgb3B0LT5sb193aXNoZXMtPnJlbW90ZXNpZGUgPSAwOworICAgICAgICAgICAgaWYgKG9wdC0+c3RhdGUtPnJlbW90ZXNpZGUgIT0gMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvcHQtPnN0YXRlLT5yZW1vdGVzaWRlID0gMTsKKyAgICAgICAgICAgICAgICBfY2FsbF9oYW5kbGVyKG9wdCwgUkVNT1RFT04sIDApOworICAgICAgICAgICAgfQorICAgICAgICB9IC8vIGlmIChETykKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgLy8gTWhtbS4gV2lyIGhhdHRlbiBlaW4gRE9OVCBnZXNlbmRldCwgYWJlciBkZXIgQ2xpZW50IGhhdCBtaXQgV0lMTAorICAgICAgICAgIC8vIGdlYW50d29ydGV0LiBEYXMgZGFyZiBlciBlaWdlbnRsaWNoIGdhciBuaWNodC4KKyAgICAgICAgICAvL1RPRE86IHdhcyBzb2xsdGUgbWFuIGpldHp0IGVpZ2VudGxpY2ggdHVuPyBFcnN0bWFsIHdpZWRlcmhvbGVuIHdpcgorICAgICAgICAgIC8vZGFzIERPTlQuLi4KKyAgICAgICAgICBzZW5kX3RlbG5ldF9uZWcoICh7RE9OVCwgb3B0aW9ufSkgKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybjsKKyAgICB9IC8vIFdJTEwgdm9tIENsaWVudCB2ZXJhcmJlaXRldAorICAgIC8vIFdhcyBzb2xsZW4gd2lyIChuaWNodCkgZnVlciBkZW4gQ2xpZW50IHR1bj8KKyAgICBlbHNlIGlmICggY29tbWFuZCA9PSBET05UKQorICAgIHsKKyAgICAgICAgLy8gQ2xpZW50IHdpbGwsIGRhc3Mgd2lyIGV0d2FzIG5pY2h0IHR1bi4gV2lyIE1VRVNTRU4gZGFzIGFremVwdGllcmVuLgorICAgICAgICAvLyB3ZW5uIGRpZSBPcHRpb24gYXVmIHVuc2VyZXIgU2VpdGUgYWJlciBzY2hvbiBhdXMgaXN0LCBtdWVzc2VuIHdpcgorICAgICAgICAvLyBkaWVzIGlnbm9yaWVyZW4uCisgICAgICAgIGlmIChvcHQtPnN0YXRlLT5sb2NhbHNpZGUgPT0gMCkKKyAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgb3B0LT5yZV93aXNoZXMtPmxvY2Fsc2lkZSA9IGNvbW1hbmQ7CisgICAgICAgIC8vIFdlbm4gd2lyIG5vY2gga2VpbiBXT05UIGdlc2VuZGV0IGhhYmVuLCBzZW5kZW4gd2lyIGRhcyBqZXR6dCBhbHMKKyAgICAgICAgLy8gQmVzdGFldGlndW5nLgorICAgICAgICBpZiAob3B0LT5sb193aXNoZXMtPmxvY2Fsc2lkZSA9IFdPTlQpCisgICAgICAgICAgICBzZW5kX3RlbG5ldF9uZWcoICh7V09OVCwgb3B0aW9ufSkgKTsKKyAgICAgICAgLy8gVmVyaGFuZGx1bmcgYmVlbmRldCwgT3B0aW9uIGlzIGF1ZiB1bnNlcmVyIFNlaXRlIGpldHp0IGF1cy4KKyAgICAgICAgLy8gV3VlbnNjaGUgYXVjaCB3aWVkZXIgenVydWVja3NldHplbi4KKyAgICAgICAgb3B0LT5yZV93aXNoZXMtPmxvY2Fsc2lkZSA9IDA7CisgICAgICAgIG9wdC0+bG9fd2lzaGVzLT5sb2NhbHNpZGUgPSAwOworICAgICAgICBpZiAob3B0LT5zdGF0ZS0+bG9jYWxzaWRlICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICBvcHQtPnN0YXRlLT5sb2NhbHNpZGUgPSAwOworICAgICAgICAgIF9jYWxsX2hhbmRsZXIob3B0LCBMT0NBTE9GRiwgMCk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoIGNvbW1hbmQgPT0gRE8gKQorICAgIHsKKyAgICAgICAgLy8gQ2xpZW50IHdpbGwsIGRhc3Mgd2lyIG9wdGlvbiB0dW4uIE1hbCBzY2hhdWVuLCB3aWUgd2lyIGRhenUgc3RlaGVuLgorICAgICAgICAvLyB3ZW5uIGRpZSBPcHRpb24gYXVmIHVuc2VyZXIgU2VpdGUgYWJlciBzY2hvbiBhbiBpc3QsIG11ZXNzZW4gd2lyCisgICAgICAgIC8vIGRpZXMgaWdub3JpZXJlbi4KKyAgICAgICAgaWYgKG9wdC0+c3RhdGUtPmxvY2Fsc2lkZSA9PSAxKQorICAgICAgICAgIHJldHVybjsKKworICAgICAgICBvcHQtPnJlX3dpc2hlcy0+bG9jYWxzaWRlID0gY29tbWFuZDsKKworICAgICAgICBpZiAoIG9wdC0+bG9fd2lzaGVzLT5sb2NhbHNpZGUgPT0gMCApIHsKKyAgICAgICAgICAgIC8vIHdpciBoYWJlbiB1bnNlcmUgV3VlbnNjaGUgbm9jaCBuaWNodCBnZWFldXNzZXJ0LiBTb2JhbGQgd2lyCisgICAgICAgICAgICAvLyBiZXN0YWV0aWdlbiwgaXN0IGRpZSBPcHRpb24gYXVmIHVuc2VyZXIgU2VpdGUgYW4vYXVzIHVuZCBkaWUKKyAgICAgICAgICAgIC8vIFZlcmhhbmRsdW5nZW4gYmVlbmRldC4KKyAgICAgICAgICAgIC8vIGluIGplZGVtIEZhbGwgZGllIFd1ZW5zY2hlIHp1cnVlY2tzZXR6ZW4KKyAgICAgICAgICAgIG9wdC0+cmVfd2lzaGVzLT5sb2NhbHNpZGUgPSAwOworICAgICAgICAgICAgb3B0LT5sb193aXNoZXMtPmxvY2Fsc2lkZSA9IDA7CisgICAgICAgICAgICBpZiAob3B0LT5sb2NhbGhhbmRsZXIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2VuZF90ZWxuZXRfbmVnKCh7V0lMTCwgb3B0aW9ufSkpOworICAgICAgICAgICAgICAgIG9wdC0+c3RhdGUtPmxvY2Fsc2lkZSA9IDE7CisgICAgICAgICAgICAgICAgX2NhbGxfaGFuZGxlcihvcHQsIExPQ0FMT04sIDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNlbmRfdGVsbmV0X25lZygoe1dPTlQsIG9wdGlvbn0pKTsKKyAgICAgICAgICAgICAgICBvcHQtPnN0YXRlLT5sb2NhbHNpZGUgPSAwOworICAgICAgICAgICAgICAgIF9jYWxsX2hhbmRsZXIob3B0LCBMT0NBTE9GRiwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAob3B0LT5sb193aXNoZXMtPmxvY2Fsc2lkZSA9PSBXSUxMICkgeworICAgICAgICAgICAgLy8gd2lyIGhhYmVuIHNjaG9uIFdJTEwgZ2VzZW5kZXQsIHdlbGNoZXMgZGVyIENsaWVudCBqZXR6dAorICAgICAgICAgICAgLy8gYmVzdGFldGlndCBoYXQgKGQuaC4gZGllIE9wdGlvbiBpc3QgamV0enQgYXVmIGRpZXNlciBTZWl0ZSBhbiksCisgICAgICAgICAgICAvLyB3aXIgYmVzdGFldGlnZW4gZGFzIGFiZXIgbmljaHQgKG5vY2htYWwpLgorICAgICAgICAgICAgb3B0LT5yZV93aXNoZXMtPmxvY2Fsc2lkZSA9IDA7CisgICAgICAgICAgICBvcHQtPmxvX3dpc2hlcy0+bG9jYWxzaWRlID0gMDsKKyAgICAgICAgICAgIGlmIChvcHQtPnN0YXRlLT5sb2NhbHNpZGUgIT0gMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgb3B0LT5zdGF0ZS0+bG9jYWxzaWRlID0gMTsKKyAgICAgICAgICAgICAgX2NhbGxfaGFuZGxlcihvcHQsIExPQ0FMT04sIDApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLy8gTWhtbS4gV2lyIGhhYmVuIGVpbiBXT05UIGdlc2VuZGV0LCBkZXIgQ2xpZW50IGhhdCBtaXQgRE8KKyAgICAgICAgICAgIC8vIGdlYW50d29ydGV0LiBEYXMgZGFyZiBlciBlaWdlbnRsaWNoIG5pY2h0LgorICAgICAgICAgICAgLy8gVE9ETzogV2FzIHR1bj8KKyAgICAgICAgICAgIHNlbmRfdGVsbmV0X25lZyAoICh7V09OVCwgb3B0aW9ufSkgKTsKKyAgICAgICAgfQorICAgICAgICAvLyBmZXJ0aWcgbWl0IERPCisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy8gYmxlaWJ0IG5vY2ggU0IgdWViZXIKKyAgICBlbHNlIGlmICggY29tbWFuZCA9PSBTQiApCisgICAgeworICAgICAgICBvcHQtPnJlX3dpc2hlcy0+c2JkYXRhID0gb3B0YXJnczsKKyAgICAgICAgX2NhbGxfaGFuZGxlcihvcHQsIFNCLCBvcHRhcmdzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0gLy8gaWYgKCBjb21tYW5kID09IFNCICkKK30KKworLy8gd2lyZCBudXIgaW4gYmFzZS5jIGdlcnVmZW4sIHdlbm4gZGllIFZlcmJpbmR1bmcgYW4gZGFzIFNwaWVsZXJvYmpla3QKKy8vIHVlYmVyZ2ViZW4gd3VyZGUuCisvLyBlcyB1ZWJlcnRyYWVndCB1bnRlciBhbmRlcmVtIGRlbiBUZWxuZXQgT3B0aW9uIFp1c3RhbmQgYXVzIGxvZ2luLmMgKGRhcyBpc3QKKy8vIGRhbm4gcHJldmlvdXNfb2JqZWN0KCkpIGluIGRhcyBTcGllbGVyb2JqZWt0ICh3ZWxjaGVzIGRhbm4gdGhpc19vYmplY3QoKSkKKy8vIGlzdCEKK3Byb3RlY3RlZCB2b2lkCitzdGFydHVwX3RlbG5ldF9uZWdzKCkKK3sKKyAgaW50KiBvcHRhcmdzOworCisgIFNldCggUF9UVFlfVFlQRSwgMCApOyAgLy9hdm9pZCBBTlkgbWlzdGFrZXMuLi4gV2lyZCB1bnRlbiBuZXUgZ2VzZXR6dC4KKyAgLy8gRGF0ZW4gYXVzIGRlbSBMb2dpbm9iamVrdCB1ZWJlcnRyYWdlbi4gRGFzIGlzdCB3aWNodGlnISAoRGFiZWkgd2lyZCBkYW5uCisgIC8vIGF1Y2ggZGVyIFN0YXR1cyB2b24gZGVyIGxldHp0ZW4gU2Vzc2lvbiB1ZWJlcnNjaHJpZWJlbi4pCisgIFROID0gKG1hcHBpbmcpIHByZXZpb3VzX29iamVjdCgpLT5xdWVyeV90ZWxuZXRfbmVnKCk7CisgIC8vIGJldm9yIGlyZ2VuZHdhcyBhbmRlcmVzIGdlbWFjaHQgd2lyZCwgd2VyZGVuIGVyc3RtYWwgZGllIFN0YW5kYXJkaGFuZGxlcgorICAvLyBnZXNldHp0LiBEaWUgc2luZCBuYWVtbGljaCBpbiBkaWVzZW0gT2JqZWt0IGpldHp0IGVyc3RtYWwga2FwdXR0LCB3ZWlsCisgIC8vIHNpZSBpbSBMb2dpbm9iamVrdCBnZXJ1ZmVuIHdlcmRlbi4KKyAgX2JpbmRfdGVsbmVnX3N0ZF9oYW5kbGVycygpOworICAvLyBkYW5uIHJlc3RsaWNoZSBEYXRlbiBhdXMgZGVtIExvZ2lub2JqZWt0IGhvbGVuLgorICBUZXJtaW5hbHMgPSAoc3RyaW5nICopIHByZXZpb3VzX29iamVjdCgpLT5xdWVyeV90ZXJtaW5hbHMoKTsKKyAgU2V0KCBQX1RUWV9DT0xTLCBwcmV2aW91c19vYmplY3QoKS0+UXVlcnkoUF9UVFlfQ09MUykgKTsKKyAgU2V0KCBQX1RUWV9ST1dTLCBwcmV2aW91c19vYmplY3QoKS0+UXVlcnkoUF9UVFlfUk9XUykgKTsKKworICBzdHJ1Y3QgdGVsb3B0X3Mgb3B0ID0gVE5bVEVMT1BUX05BV1NdOworICBpZiAob3B0YXJncyA9IChvcHQtPnJlX3dpc2hlcyktPnNiZGF0YSkgeworICAgICAgZXZhbF9uYXdzKG9wdGFyZ3MpOworICB9CisKKyAgaWYgKCBwb2ludGVycChUZXJtaW5hbHMpICYmIHNpemVvZihUZXJtaW5hbHMpKSB7CisgICAgICBpZiAoIFRlcm1pbmFsc1swXVswLi4zXSA9PSAiZGVjLSIgKQorICAgICAgICAgIFRlcm1pbmFsc1swXSA9IFRlcm1pbmFsc1swXVs0Li5dOworCisgICAgICBpZiAoIFRlcm1pbmFsc1swXSA9PSAibGludXgiICkKKyAgICAgICAgICBUZXJtaW5hbHNbMF0gPSAidnQxMDAiOworCisgICAgICBTZXQoIFBfVFRZX1RZUEUsIFRlcm1pbmFsc1swXSApOworICB9Cit9CisKKy8vIHNvbWVob3cgY29tcGxldGVseSBvdXQgb2YgdGhlIG9yZGluYXJ5IG9wdGlvbnMgcHJvY2Vzc2luZy9uZWdvdGlhdGlvbi4gQnV0CisvLyB0aGUgb25seSBwdXJwb3NlIGlzIHRvIHRyYW5zbWl0IHNvbWV0aGluZyBvdmVyIHRoZSB3aXJlIHdoaWNoIGlzIG5vdCBzaG93biwKKy8vIGJ1dCAobGlrZWx5KSBhbnN3ZXJlZCBieSB0aGUgb3RoZXIgZGV2aWNlLgorcHJvdGVjdGVkIHZvaWQgc2VuZF90ZWxuZXRfdGltaW5nX21hcmsoKSB7CisgIHN0cnVjdCB0ZWxvcHRfcyBvcHQgPSBUTltURUxPUFRfVE1dOworICBpZiAocG9pbnRlcnAob3B0LT5kYXRhKSkKKyAgICBvcHQtPmRhdGFbMV0gPSB1dGltZSgpOworICBlbHNlCisgICAgb3B0LT5kYXRhID0gKHsgMCwgdXRpbWUoKSB9KTsKKyAgLy8gYWJzaWNodGxpY2ggbmljaHQgZG9fdGVsbmV0X25lKCkgdmVyd2VuZGV0LCBkYSBkaWVzIG5pY2h0IHNlbmRlbiB3dWVyZGUsCisgIC8vIGhhZXR0ZSBkZXIgQ2xpZW50IHNjaG9ubWFsIG1pdCBXSUxMIGdlYW50d29ydGV0LiBURUxPUFRfVE0gaXN0IGFiZXIgZWluZQorICAvLyBPcHRpb24sIGJlaSBkZXIgbWFuIGRhcyBkYXJmLi4uCisgIHNlbmRfdGVsbmV0X25lZyggKHtETywgVEVMT1BUX1RNfSkgKTsKK30KKworLyogSXMgY2FsbGVkIGZyb20gdGhlIEhfUFJJTlRfUFJPTVBUIGRyaXZlciBob29rIGFuZCBhcHBlbmRzIHRoZSBJQUMgRU9SIGlmCisgKiB0aGUgY2xpZW50IHN1cHBvcnRzIGl0LgorICovCit2b2lkIHByaW50X3Byb21wdChzdHJpbmcgcHJvbXB0KSB7CisvLyAgICBpZiAoZXh0ZXJuX2NhbGwoKSAmJiBwcmV2aW91c19vYmplY3QoKSE9dGhpc19vYmplY3QoKSkKKy8vICAgICAgICByZXR1cm47CisKKyAgICAvLyBnZ2YuIFVocnplaXQgaW4gZGVuIHByb21wdCByZWluc2NocmVpYmVuLgorICAgIHByb21wdCA9IHJlZ3JlcGxhY2UocHJvbXB0LCJcXHQiLHN0cmZ0aW1lKCIlSDolTSIpLDApOworICAgIC8vIFByb21wdCBzZW5kZW4KKyAgICB0ZWxsX29iamVjdCh0aGlzX29iamVjdCgpLCBwcm9tcHQpOworICAgIC8vIFVuZCBFT1Igc2VuZGVuLCBmYWxscyB2b20gQ2xpZW50IGdld3VlbnNjaHQuCisgICAgc3RydWN0IHRlbG9wdF9zIG9wdCA9IFROW1RFTE9QVF9FT1JdOworICAgIGlmIChvcHQtPnN0YXRlLT5sb2NhbHNpZGUgPT0gMSkKKyAgICB7CisgICAgICAgIGJpbmFyeV9tZXNzYWdlKCh7SUFDLCBFT1J9KSwgMSk7CisgICAgICAgIERUTigidG5fZW9yICIsKHtJQUMsRU9SfSkpOworICAgIH0KK30KKworLy8gSGVscGVyCitwcml2YXRlIHZvaWQgZXZhbF9uYXdzKGludCAqb3B0YXJncykgeworICBpbnQgbCwgYzsKKworICBpZiAoIHNpemVvZihvcHRhcmdzKSAhPSA0ICkKKyAgeworICAgICAgdGVsbF9vYmplY3QodGhpc19vYmplY3QoKSwKKyAgICAgICAgICBicmVha19zdHJpbmcoIHNwcmludGYoIkRlaW4gQ2xpZW50IGhhdCBlaW5lbiBGZWhsZXIgYmVpbSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIkF1c2hhbmRlbG4gZGVyIFRFTE9QVF9OQVdTIC0gZXIgaGF0IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsiSUFDIFNCICVPIElBQyBTRSBnZXNlbmRldCFcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0YXJncyksIDc4LAorICAgICAgICAgICAgICAgICAgICAiRGVyIEdhbWVEcml2ZXIgdGVpbHQgRGlyIG1pdDogIiApKTsKKyAgICAgIC8vIHVuZCBkZW0gQ2xpZW50IHNhZ2VuLCBkYXNzIGVyIGRlbiBTY2hyb3R0IG5pY2h0IG1laHIgdWViZXJ0cmFnZW4KKyAgICAgIC8vIHNvbGwgKGZhbGxzIHdpciBkYXMgbmljaHQgc2Nob24gZ2VtYWNodCBoYWJlbikuCisgICAgICBzdHJ1Y3QgdGVsb3B0X3Mgb3B0ID0gVE5bVEVMT1BUX05BV1NdOworICAgICAgaWYgKG9wdC0+c3RhdGUtPnJlbW90ZXNpZGUgPT0gV0lMTAorICAgICAgICAgICYmIG9wdC0+bG9fd2lzaGVzLT5yZW1vdGVzaWRlICE9IERPTlQpCisgICAgICAgIHNlbmRfdGVsbmV0X25lZygoIHtET05ULCBURUxPUFRfTkFXU30pICk7CisgICAgICByZXR1cm47CisgIH0KKworICBpZiAoIGludGVyYWN0aXZlKHRoaXNfb2JqZWN0KCkpICl7CisgICAgICBpZiAoICFvcHRhcmdzWzFdICkKKyAgICAgICAgICBjID0gb3B0YXJnc1swXTsKKyAgICAgIGVsc2UKKyAgICAgICAgICBjID0gb3B0YXJnc1sxXSArIG9wdGFyZ3NbMF0gKiAyNTY7CisKKyAgICAgIGlmICggYyA8IDM1ICl7CisgICAgICAgICAgaWYgKFF1ZXJ5KFBfVFRZX1NIT1cpKQorICAgICAgICAgICAgICB0ZWxsX29iamVjdCggdGhpc19vYmplY3QoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtfc3RyaW5nKCJEZWluIEZlbnN0ZXIgaXN0IHNjaG1hbGVyIGFscyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsiIDM1IFplaWNoZW4/IER1IHNjaGVyenQuIDstKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsiIEljaCBiZW51dHplIGRlbiBTdGFuZGFyZHdlcnQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIiB2b24gODAgWmVpY2hlbi5cbiIsIDc4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRlciBHYW1lRHJpdmVyIHRlaWx0IERpciBtaXQ6ICIpCisgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgYyA9IDgwOworICAgICAgfQorCisgICAgICBpZiAoICFvcHRhcmdzWzNdICkKKyAgICAgICAgICBsID0gb3B0YXJnc1syXTsKKyAgICAgIGVsc2UKKyAgICAgICAgICBsID0gMjU2ICogb3B0YXJnc1syXSArIG9wdGFyZ3NbM107CisKKyAgICAgIGlmICggbCA+IDEwMCApeworICAgICAgICAgIC8vVE9ETzogcmVtb3ZlCisgICAgICAgICAgbCA9IDEwMDsKKyAgICAgICAgICBpZiAoUXVlcnkoUF9UVFlfU0hPVykpCisgICAgICAgICAgICAgIHRlbGxfb2JqZWN0KCB0aGlzX29iamVjdCgpLAorICAgICAgICAgICAgICAgICAgICAgICBicmVha19zdHJpbmcoIlR1dCBtaXIgbGVpZCwgYWJlciBpY2gga2FubiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsiIG51ciBiaXMgenUgMTAwIFplaWxlbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsiIHZlcndhbHRlbi5cbiIsIChjID8gYy0yIDogNzgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRlciBHYW1lRHJpdmVyIHRlaWx0IERpciBtaXQ6ICIgKQorICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgfQorCisgICAgICBpZiAoIGwgPCAzICl7CisgICAgICAgICAgaWYgKFF1ZXJ5KFBfVFRZX1NIT1cpKQorICAgICAgICAgICAgICB0ZWxsX29iamVjdCggdGhpc19vYmplY3QoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtfc3RyaW5nKCJEdSB3aWxsc3Qgd2VuaWdlciBhbHMgZHJlaSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsiIFplaWxlbiBiZW51dHplbj8gR2xhdWIgaWNoIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyIgRGlyIG5pY2h0IC0gaWNoIGJlbnV0emUgZGVuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyIgU3RhbmRhcmR3ZXJ0IHZvbiAyNCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsiIFplaWxlbi5cbiIsIChjID8gYy0yIDogNzgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRlciBHYW1lRHJpdmVyIHRlaWx0IERpciBtaXQ6ICIgKQorICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgIGwgPSAyNDsKKyAgICAgIH0KKworICAgICAgaWYgKCAoKGludCkgUXVlcnkoUF9UVFlfUk9XUykgIT0gbCkgfHwKKyAgICAgICAgICAgKChpbnQpIFF1ZXJ5KFBfVFRZX0NPTFMpICE9IGMpICl7CisgICAgICAgICAgU2V0KCBQX1RUWV9ST1dTLCBsICk7CisgICAgICAgICAgU2V0KCBQX1RUWV9DT0xTLCBjICk7CisKKyAgICAgICAgICBpZiAoUXVlcnkoUF9UVFlfU0hPVykpCisgICAgICAgICAgICAgIHRlbGxfb2JqZWN0KCB0aGlzX29iamVjdCgpLAorICAgICAgICAgICAgICAgICAgICAgICBicmVha19zdHJpbmcoIkR1IGhhc3QgRGVpbmUgRmVuc3Rlcmdyb2Vzc2UgYXVmIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyIgIitsKyIgWmVpbGVuIHVuZCAiK2MrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIFNwYWx0ZW4gZ2VhZW5kZXJ0LlxuIiwgYy0yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRlciBHYW1lRHJpdmVyIHRlaWx0IERpciBtaXQ6ICIpCisgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICB9CisgIH0KK30KKworcHJpdmF0ZSB2b2lkIF9jYWxsX29sZF9TZW5kVGVsT3B0cyhvYmplY3QgcG8pIHsKKyAgaWYgKCFvYmplY3RwKHBvKSB8fCAhaW50ZXJhY3RpdmUocG8pKSByZXR1cm47CisvKgorICBjbG9zdXJlIGNsPXVuYm91bmRfbGFtYmRhKCAoe30pLAorICAgICAgICAgICAgICAgKHsgIydmdW5jYWxsLCAoeyMnc3ltYm9sX2Z1bmN0aW9uLCAiU2VuZFRlbG9wdHMifSkgfSkgKTsKKworICBmdW5jYWxsKGJpbmRfbGFtYmRhKGNsLCBwbykpOworKi8gIAorICAvLyBCbG9vZHkgdGVtcG9yYXJ5IEhhY2sgdW50aWwgbmV4dCByZWJvb3QuLi4KKworICBmdW5jYWxsKCBiaW5kX2xhbWJkYSggIydlZnVuOjpiaW5hcnlfbWVzc2FnZSwgcG8gKSwKKyAgICAgICAgICAgKHsgSUFDLCBXSUxMLCBURUxPUFRfRU9SLAorICAgICAgICAgICAgICBJQUMsIERPLCBURUxPUFRfVFRZUEUsCisgICAgICAgICAgICAgIElBQywgRE8sIFRFTE9QVF9OQVdTLAorICAgICAgICAgICAgICBJQUMsIERPLCBURUxPUFRfTElORU1PREUsCisgICAgICAgICAgIH0pLCAweDEgKTsKK30KKworLy8gUXVlcnktL1NldC1NZXRob2RlbgorLy8gVW5kIHdlbm4gaGllciBlaW5lciB2b24gYXVzc2VuIGRyYW4gcnVtcGZ1c2NodCwgd2VyZGUgaWNoIHNhdWVyLgorbWFwcGluZworcXVlcnlfdGVsbmV0X25lZygpCit7CisgICBpZiAoaW50ZXJhY3RpdmUocHJldmlvdXNfb2JqZWN0KCkpCisgICAgICAmJiBwcm9ncmFtX3RpbWUocHJldmlvdXNfb2JqZWN0KCkpIDwgMTM1OTkyNjA3OQorICAgICAgJiYgbG9hZF9uYW1lKHRoaXNfb2JqZWN0KCkpID09ICIvc2VjdXJlL2xvZ2luIiApCisgICAgeworICAgICAgY2FsbF9vdXQoIydfY2FsbF9vbGRfU2VuZFRlbE9wdHMsIDAsIHByZXZpb3VzX29iamVjdCgpKTsKKyAgICAgIC8vIGFsdGUgRGF0ZW5zdHJ1a3R1ciB6dXJ1ZWNrZ2ViZW4uLi4gTGVpZGVyIGxlZXIuLi4KKyAgICAgIHJldHVybiAoWyJzZW50IjogbV9hbGxvY2F0ZSgzLDMpLCAicmVjZWl2ZWQiOiBtX2FsbG9jYXRlKDMsMykgXSk7CisgICAgfQorCisgICAgcmV0dXJuIFROOworfQorCisvLyBzaWVoZSBvYmVuCitzdHJpbmcgKgorcXVlcnlfdGVybWluYWxzKCkgeworICAgIHJldHVybiBUZXJtaW5hbHM7Cit9CisKK3B1YmxpYyBpbnQgX3F1ZXJ5X3BfbGliX3RlbG5ldF9ydHRpbWUoKQoreworICBzdHJ1Y3QgdGVsb3B0X3Mgb3B0ID0gVE5bVEVMT1BUX1RNXTsKKyAgaWYgKG9wdCAmJiBwb2ludGVycChvcHQtPmRhdGEpKQorICAgIHJldHVybiAob3B0LT5kYXRhKVswXTsKKyAgcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL3NlY3VyZS90ZWxuZXRuZWcuaCBiL3NlY3VyZS90ZWxuZXRuZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2I2NzIzCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3RlbG5ldG5lZy5oCkBAIC0wLDAgKzEsNDQgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyAvc2VjdXJlL3RlbG5ldG5lZy5oIC0tIERlZmluaXRpb25lbiB1bmQgUHJvdG90eXBlcyBmdWVyIFRlbG5ldC1OZWdvdGlhdGlvbnMKKy8vCisvLyAkSWQ6IHRlbG5ldG5lZy5oLHYgMS4xIDIwMDMvMDIvMTcgMTE6MjA6MDIgUmlrdXMgRXhwICQKKworI2lmbmRlZiBfU0VDVVJFX1RFTE5FVE5FR19IXworI2RlZmluZSBfU0VDVVJFX1RFTE5FVE5FR19IXworLy8gRGllcyBpc3QgdmVybXV0bGljaCBkZXIgZWluemlnZSBUZWlsLCBkZW4gYW5kZXJlICh6LkIuIHBsYXllci9iYXNlLmgpCisvLyBicmF1Y2hlbi4uLgorLy8gUHJvcGVydGllcyBmdWVyIGRpZSB0YXRzYWVjaGxpY2hlIEZlbnN0ZXJncm9lc3NlIGRlcyBUZWxuZXRjbGllbnRzIHNvd2llCisvLyBkZW4gZWluZ2VzdGVsbHRlbiBUZXJtaW5hbHR5cC4gRmFsbHMgZGVyIENsaWVudCBkaWUgRGF0ZW4gbmljaHQKKy8vIGhlcmF1c3J1ZWNrdCwgYmxlaWJlbiBkaWUgUHJvcGVydGllcyBsZWVyLgorI2RlZmluZSBQX1RUWSAgICAgICAgICAgICAgICAidHR5IgorI2RlZmluZSBQX1RUWV9DT0xTICAgICAgICAgICAidHR5X2NvbHMiCisjZGVmaW5lIFBfVFRZX1JPV1MgICAgICAgICAgICJ0dHlfcm93cyIKKyNkZWZpbmUgUF9UVFlfVFlQRSAgICAgICAgICAgInR0eV90eXBlIgorI2RlZmluZSBQX1RUWV9TSE9XICAgICAgICAgICAidHR5X3Nob3ciCisjZGVmaW5lIFBfVEVMTkVUX1JUVElNRSAgICAgICJwX2xpYl90ZWxuZXRfcnR0aW1lIgorCisjZW5kaWYKKworCisjaWZkZWYgTkVFRF9QUk9UT1RZUEVTCisjaWZuZGVmIF9TRUNVUkVfVEVMTkVUTkVHX0hfUFJPVE9TXworI2RlZmluZSBfU0VDVVJFX1RFTE5FVE5FR19IX1BST1RPU18KKy8vIHdpcmQgZWlnZW50bGljaCBudXIgZnVlciBkaWUgSW1wbGVtZW50YXRpb24gZ2VicmF1Y2h0CisjaW5jbHVkZSAiL3N5cy90ZWxuZXQuaCIKKworLy8gS29uc3RhbnRlbiBmdWVyIGRpZSBqZXcuIHJlbW90ZSB1bmQgbG9jYWwgaGFuZGxlcgorI2RlZmluZSBMT0NBTE9OICAgV0lMTAorI2RlZmluZSBMT0NBTE9GRiAgV09OVAorI2RlZmluZSBSRU1PVEVPTiAgRE8KKyNkZWZpbmUgUkVNT1RFT0ZGIERPTlQKKworcHJvdGVjdGVkIGludCBiaW5kX3RlbG5lZ19oYW5kbGVyKGludCBvcHRpb24sIGNsb3N1cmUgcmUsIGNsb3N1cmUgbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluaXRuZWcpOworcHJvdGVjdGVkIGludCBkb190ZWxuZXRfbmVnKGludCBvcHRpb24sIGludCBhY3Rpb24pOworcHJvdGVjdGVkIHZhcmFyZ3MgaW50IHNlbmRfdGVsbmV0X25lZyhpbnQgKmFyciwgaW50IGJtX2ZsYWdzKTsKK3Byb3RlY3RlZCB2YXJhcmdzIGludCBzZW5kX3RlbG5ldF9uZWdfc3RyKHN0cmluZyBzdHIsIGludCBibV9mbGFncyk7CisKKyNlbmRpZiAvLyBfU0VDVVJFX1RFTE5FVE5FR19IX1BST1RPU18KKyNlbmRpZiAvLyBORUVEX1BST1RPVFlQRVMKKwpkaWZmIC0tZ2l0IGEvc2VjdXJlL3RvcGxpc3RlLmMgYi9zZWN1cmUvdG9wbGlzdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjc1N2U0Ci0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3RvcGxpc3RlLmMKQEAgLTAsMCArMSwyODAgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8qKiBcZmlsZSAvZmlsZS5jCisqIEt1cnpiZXNjaHJlaWJ1bmcuCisqIExhbmdiZXNjaHJlaWJ1bmcuLi4KKyogXGF1dGhvciA8QXV0b3I+CisqIFxkYXRlIDxkYXRlPgorKiBcdmVyc2lvbiAkSWQkCisqLworLyogQ2hhbmdlbG9nOgorKi8KKyNwcmFnbWEgc3Ryb25nX3R5cGVzLHNhdmVfdHlwZXMscnR0X2NoZWNrcworI3ByYWdtYSBub19jbG9uZSxub19pbmhlcml0LG5vX3NoYWRvdworI3ByYWdtYSBwZWRhbnRpYywgcmFuZ2VfY2hlY2sKKworI2luY2x1ZGUgPGRlZmluZXMuaD4KKyNpbmNsdWRlIDxldmVudHMuaD4KKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKyNpbmNsdWRlIDxsZXBtYXN0ZXIuaD4KKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8dXNlcmluZm8uaD4KKworI2RlZmluZSBIT01FKHgpIChfX1BBVEhfXygwKSt4KQorI2luY2x1ZGUgPGxpdmluZy9jb21tLmg+CisjZGVmaW5lIFpERUJVRyh4KSBpZiAoZmluZF9wbGF5ZXIoInplc3N0cmEiKSkgXAorICBmaW5kX3BsYXllcigiemVzc3RyYSIpLT5SZWNlaXZlTXNnKHgsTVRfREVCVUcsMCxvYmplY3RfbmFtZSgpKyI6Iix0aGlzX29iamVjdCgpKQorLy8jZGVmaW5lIFpERUJVRyh4KQorCitvYmplY3QgKnBsYXllcnMgPSAoe30pOworCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKQoreworICBzZXRldWlkKGdldHVpZCgpKTsKKyAgaWYgKHNsX29wZW4oSE9NRSgiQVJDSC90b3BsaXN0ZS5zcWxpdGUiKSkgIT0gMSkKKyAgeworICAgIHJhaXNlX2Vycm9yKCJEYXRlbmJhbmsga29ubnRlIG5pY2h0IGdlb2VmZm5ldCB3ZXJkZW4uXG4iKTsKKyAgfQorICAvLyBUYWJlbGxlbiB1bmQgSW5kaWNlcyBhbmxlZ2VuLCBmYWxscyBkaWUgbmljaHQgZXhpc3RpZXJlbi4KKyAgc2xfZXhlYygiQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgdG9wbGlzdGUobmFtZSBURVhUIFBSSU1BUlkgS0VZIEFTQywgIgorICAgICAgICAgICJnaWxkZSBURVhUIE5PVCBOVUxMLCByYXNzZSBURVhUIE5PVCBOVUxMLCAiCisgICAgICAgICAgImFnZSBEQVRFVElNRSwgd2l6bGV2ZWwgSU5URUdFUiwgIgorICAgICAgICAgICJsYXN0dXBkYXRlIERBVEVUSU1FIERFRkFVTFQgY3VycmVudF90aW1lc3RhbXAsICIKKyAgICAgICAgICAibGVwIElOVEVHRVIsIHFwIElOVEVHRVIsIHhwIElOVEVHRVIsIGxldmVsIElOVEVHRVIiCisgICAgICAgICAgImhhcmRjb3JlIElOVEVHRVIpOyIpOworICBzbF9leGVjKCJDUkVBVEUgSU5ERVggSUYgTk9UIEVYSVNUUyBpZHhfZ2lsZGUgT04gdG9wbGlzdGUoZ2lsZGUpOyIpOworICBzbF9leGVjKCJDUkVBVEUgSU5ERVggSUYgTk9UIEVYSVNUUyBpZHhfcmFzc2UgT04gdG9wbGlzdGUocmFzc2UpOyIpOworICBzbF9leGVjKCJDUkVBVEUgSU5ERVggSUYgTk9UIEVYSVNUUyBpZHhfaGFyZGNvcmUgT04gdG9wbGlzdGUoaGFyZGNvcmUpOyIpOworICAKKyAgLy8gTG9naW4tRXZlbnQgYWJvbm5pZXJlbgorICBpZiAoRVZFTlRELT5SZWdpc3RlckV2ZW50KEVWVF9MSUJfTE9HSU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxpc3RlbiIsIHRoaXNfb2JqZWN0KCkpIDw9IDApCisgIHsKKyAgICByYWlzZV9lcnJvcigiTG9naW5ldmVudCBrb25udGUgbmljaHQgYWJvbm5pZXJ0IHdlcmRlbi5cbiIpOworICB9CisgIGlmIChFVkVOVEQtPlJlZ2lzdGVyRXZlbnQoRVZUX0xJQl9BRFZBTkNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsaXN0ZW4iLCB0aGlzX29iamVjdCgpKSA8PSAwKQorICB7CisgICAgcmFpc2VfZXJyb3IoIkVWVF9MSUJfQURWQU5DRSBrb25udGUgbmljaHQgYWJvbm5pZXJ0IHdlcmRlbi5cbiIpOworICB9CisgIGlmIChFVkVOVEQtPlJlZ2lzdGVyRXZlbnQoRVZUX0xJQl9RVUVTVF9TT0xWRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxpc3RlbiIsIHRoaXNfb2JqZWN0KCkpIDw9IDApCisgIHsKKyAgICByYWlzZV9lcnJvcigiRVZUX0xJQl9RVUVTVF9TT0xWRUQga29ubnRlIG5pY2h0IGFib25uaWVydCB3ZXJkZW4uXG4iKTsKKyAgfQorICBpZiAoRVZFTlRELT5SZWdpc3RlckV2ZW50KEVWVF9MSUJfTUlOSVFVRVNUX1NPTFZFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGlzdGVuIiwgdGhpc19vYmplY3QoKSkgPD0gMCkKKyAgeworICAgIHJhaXNlX2Vycm9yKCJFVlRfTElCX01JTklRVUVTVF9TT0xWRUQga29ubnRlIG5pY2h0IGFib25uaWVydCB3ZXJkZW4uXG4iKTsKKyAgfQorfQorCitwcml2YXRlIHZvaWQgcHJvY2VzcygpCit7CisgIGZvcmVhY2gob2JqZWN0IHBsIDogJnBsYXllcnMpCisgIHsKKyAgICBpZiAoZ2V0X2V2YWxfY29zdCgpIDwgMjAwMDAwKQorICAgIHsKKyAgICAgIGNhbGxfb3V0KCMncHJvY2VzcywgMik7CisgICAgICBwbGF5ZXJzIC09ICh7MH0pOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzbF9leGVjKCJJTlNFUlQgT1IgUkVQTEFDRSBJTlRPIHRvcGxpc3RlKG5hbWUsIGdpbGRlLCByYXNzZSwgIgorICAgICAgICAgICAgICAgICJhZ2UsIHdpemxldmVsLCBsYXN0dXBkYXRlLCBsZXAsIHFwLCB4cCwgbGV2ZWwsIGhhcmRjb3JlKSAiCisgICAgICAgICAgICAgICAgIlZBTFVFUyg/MSw/Miw/Myw/NCw/NSw/Niw/Nyw/OCw/OSw/MTAsPzExKTsiLAorICAgICAgICAgICAgICAgIHBsLT5xdWVyeV9yZWFsX25hbWUoKSwKKyAgICAgICAgICAgICAgICBwbC0+UXVlcnlQcm9wKFBfR1VJTEQpIHx8ICJ1bmJla2FubnQiLAorICAgICAgICAgICAgICAgIHBsLT5RdWVyeVByb3AoUF9SQUNFKSwKKyAgICAgICAgICAgICAgICBwbC0+UXVlcnlQcm9wKFBfQUdFKSwKKyAgICAgICAgICAgICAgICBxdWVyeV93aXpfbGV2ZWwocGwpLAorICAgICAgICAgICAgICAgIHRpbWUoKSwKKyAgICAgICAgICAgICAgICBMRVBNQVNURVItPlF1ZXJ5TEVQRm9yUGxheWVyKHBsKSwKKyAgICAgICAgICAgICAgICBwbC0+UXVlcnlQcm9wKFBfUVApLAorICAgICAgICAgICAgICAgIHBsLT5RdWVyeVByb3AoUF9YUCksCisgICAgICAgICAgICAgICAgcGwtPlF1ZXJ5UHJvcChQX0xFVkVMKSwKKyAgICAgICAgICAgICAgICBwbC0+cXVlcnlfaGNfcGxheSgpCisgICAgICAgICAgICAgICApOworICAgIHBsPTA7CisgIH0KKyAgcGxheWVycyAtPSAoezB9KTsKK30KKworcHVibGljIHZvaWQgbGlzdGVuKHN0cmluZyBlaWQsIG9iamVjdCB0cmlnb2IsIG1peGVkIGRhdGEpCit7CisgIGlmIChwcmV2aW91c19vYmplY3QoKSAhPSBmaW5kX29iamVjdChFVkVOVEQpCisgICAgICB8fCAhdHJpZ29iCisgICAgICB8fCAhcXVlcnlfb25jZV9pbnRlcmFjdGl2ZSh0cmlnb2IpCisgICAgICB8fCBJU19MRUFSTkVSKHRyaWdvYikKKyAgICAgIHx8IChtaXhlZCl0cmlnb2ItPlF1ZXJ5UHJvcChQX1RFU1RQTEFZRVIpCisgICAgICB8fCB0cmlnb2ItPlF1ZXJ5R3Vlc3QoKQorICAgICAgfHwgdHJpZ29iLT5RdWVyeVByb3AoUF9OT19UT1BMSVNUKQorICAgICApCisgICAgcmV0dXJuOworCisgIC8vIERpZXNlciBoYW5kbGVyIGhhdCBudXIgMzBrIFRpY2tzIHp1ciBWZXJmdWVndW5nLCBkdW1tZXJ3ZWlzZSBrYW5uCisgIC8vIFF1ZXJ5TEVQRm9yUGxheWVyKCkgbG9ja2VyIHVlYmVyIDMwayBrb3N0ZW4sIHdlbm4gZGVyIFNwaWVsZXIgbmljaHQgaW4KKyAgLy8gQ2FjaGVzIGRyaW4gaXN0LiBEYWhlciBtdXNzIGRhcyBqZXR6dCBwZXIgY2FsbF9vdXQgZW50a29wcGVsdCB3ZXJkZW4uCisgIC8vICpzZXVmeioKKyAgaWYgKG1lbWJlcihwbGF5ZXJzLCB0cmlnb2IpID09IC0xKQorICB7CisgICAgcGxheWVycyArPSAoe3RyaWdvYn0pOworICAgIGlmIChmaW5kX2NhbGxfb3V0KCMncHJvY2VzcykgPT0gLTEpCisgICAgICBjYWxsX291dCgjJ3Byb2Nlc3MsIDIpOworICB9Cit9CisKK3B1YmxpYyB2YXJhcmdzIDwgPHN0cmluZ3xpbnQ+KiA+KiBMaXN0ZShzdHJpbmcgcmFzc2UsIHN0cmluZyBnaWxkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGltaXQsIHN0cmluZyBzb3J0KQoreworICAvLyBEZWZhdWx0czoKKyAgc29ydCB8fD0gImxlcCI7CisgIGlmICghbGltaXQgfHwgbGltaXQgPiAxMDApCisgICAgbGltaXQ9MTAwOworICBlbHNlIGlmIChsaW1pdCA8IDEpCisgICAgbGltaXQ9MTsKKyAgaWYgKHJhc3NlICYmIGdpbGRlKQorICAgIHJldHVybiBzbF9leGVjKAorICAgICAgICAic2VsZWN0IG5hbWUsbGVwLHFwLHhwLGxldmVsLGFnZSxyYXNzZSxnaWxkZSx3aXpsZXZlbCxoYXJkY29yZSBmcm9tIHRvcGxpc3RlICIKKyAgICAgICAgIldIRVJFIHJhc3NlPT8xIEFORCBnaWxkZT0/MiAiCisgICAgICAgICJPUkRFUiBCWSAiK3NvcnQrIiBERVNDIExJTUlUICIrbGltaXQrIjsiLAorICAgICAgICByYXNzZSwgZ2lsZGUpOworICBlbHNlIGlmIChyYXNzZSkKKyAgICByZXR1cm4gc2xfZXhlYygKKyAgICAgICAgInNlbGVjdCBuYW1lLGxlcCxxcCx4cCxsZXZlbCxhZ2UscmFzc2UsZ2lsZGUsd2l6bGV2ZWwsaGFyZGNvcmUgZnJvbSB0b3BsaXN0ZSAiCisgICAgICAgICJXSEVSRSByYXNzZT0/MSAiCisgICAgICAgICJPUkRFUiBCWSAiK3NvcnQrIiBERVNDIExJTUlUICIrbGltaXQrIjsiLAorICAgICAgICByYXNzZSk7CisgIGVsc2UgaWYgKGdpbGRlKQorICAgIHJldHVybiBzbF9leGVjKAorICAgICAgICAic2VsZWN0IG5hbWUsbGVwLHFwLHhwLGxldmVsLGFnZSxyYXNzZSxnaWxkZSx3aXpsZXZlbCxoYXJkY29yZSBmcm9tIHRvcGxpc3RlICIKKyAgICAgICAgIldIRVJFIGdpbGRlPT8xICIKKyAgICAgICAgIk9SREVSIEJZICIrc29ydCsiIERFU0MgTElNSVQgIitsaW1pdCsiOyIsCisgICAgICAgIGdpbGRlKTsKKyAgcmV0dXJuIHNsX2V4ZWMoCisgICAgICAic2VsZWN0IG5hbWUsbGVwLHFwLHhwLGxldmVsLGFnZSxyYXNzZSxnaWxkZSx3aXpsZXZlbCxoYXJkY29yZSBmcm9tIHRvcGxpc3RlICIKKyAgICAgICJPUkRFUiBCWSAiK3NvcnQrIiBERVNDIExJTUlUICIrbGltaXQrIjsiKTsKK30KKworcHVibGljIHZhcmFyZ3MgPCA8c3RyaW5nfGludD4qID4qIFNwaWVsZXJMaXN0ZShzdHJpbmcgcmFzc2UsIHN0cmluZyBnaWxkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGltaXQsIHN0cmluZyBzb3J0KQoreworICAvLyBEZWZhdWx0czoKKyAgc29ydCB8fD0gImxlcCI7CisgIGlmICghbGltaXQgfHwgbGltaXQgPiAxMDApCisgICAgbGltaXQ9MTAwOworICBlbHNlIGlmIChsaW1pdCA8IDEpCisgICAgbGltaXQ9MTsKKyAgaWYgKHJhc3NlICYmIGdpbGRlKQorICAgIHJldHVybiBzbF9leGVjKAorICAgICAgICAic2VsZWN0IG5hbWUsbGVwLHFwLHhwLGxldmVsLGFnZSxyYXNzZSxnaWxkZSx3aXpsZXZlbCxoYXJkY29yZSBmcm9tIHRvcGxpc3RlICIKKyAgICAgICAgIldIRVJFIHJhc3NlPT8xIEFORCBnaWxkZT0/MiBBTkQgd2l6bGV2ZWw9MCAiCisgICAgICAgICJPUkRFUiBCWSAiK3NvcnQrIiBERVNDIExJTUlUICIrbGltaXQrIjsiLAorICAgICAgICByYXNzZSwgZ2lsZGUpOworICBlbHNlIGlmIChyYXNzZSkKKyAgICByZXR1cm4gc2xfZXhlYygKKyAgICAgICAgInNlbGVjdCBuYW1lLGxlcCxxcCx4cCxsZXZlbCxhZ2UscmFzc2UsZ2lsZGUsd2l6bGV2ZWwsaGFyZGNvcmUgZnJvbSB0b3BsaXN0ZSAiCisgICAgICAgICJXSEVSRSByYXNzZT0/MSBBTkQgd2l6bGV2ZWw9MCAiCisgICAgICAgICJPUkRFUiBCWSAiK3NvcnQrIiBERVNDIExJTUlUICIrbGltaXQrIjsiLAorICAgICAgICByYXNzZSk7CisgIGVsc2UgaWYgKGdpbGRlKQorICAgIHJldHVybiBzbF9leGVjKAorICAgICAgICAic2VsZWN0IG5hbWUsbGVwLHFwLHhwLGxldmVsLGFnZSxyYXNzZSxnaWxkZSx3aXpsZXZlbCxoYXJkY29yZSBmcm9tIHRvcGxpc3RlICIKKyAgICAgICAgIldIRVJFIGdpbGRlPT8xIEFORCB3aXpsZXZlbD0wICIKKyAgICAgICAgIk9SREVSIEJZICIrc29ydCsiIERFU0MgTElNSVQgIitsaW1pdCsiOyIsCisgICAgICAgIGdpbGRlKTsKKyAgcmV0dXJuIHNsX2V4ZWMoCisgICAgICAic2VsZWN0IG5hbWUsbGVwLHFwLHhwLGxldmVsLGFnZSxyYXNzZSxnaWxkZSx3aXpsZXZlbCxoYXJkY29yZSBmcm9tIHRvcGxpc3RlICIKKyAgICAgICJXSEVSRSB3aXpsZXZlbD0wICIKKyAgICAgICJPUkRFUiBCWSAiK3NvcnQrIiBERVNDIExJTUlUICIrbGltaXQrIjsiKTsKK30KKworcHVibGljIHZhcmFyZ3MgPCA8c3RyaW5nfGludD4qID4qIFNlaGVyTGlzdGUoc3RyaW5nIHJhc3NlLCBzdHJpbmcgZ2lsZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbWl0LCBzdHJpbmcgc29ydCkKK3sKKyAgLy8gRGVmYXVsdHM6CisgIHNvcnQgfHw9ICJsZXAiOworICBpZiAoIWxpbWl0IHx8IGxpbWl0ID4gMTAwKQorICAgIGxpbWl0PTEwMDsKKyAgZWxzZSBpZiAobGltaXQgPCAxKQorICAgIGxpbWl0PTE7CisgIGlmIChyYXNzZSAmJiBnaWxkZSkKKyAgICByZXR1cm4gc2xfZXhlYygKKyAgICAgICAgInNlbGVjdCBuYW1lLGxlcCxxcCx4cCxsZXZlbCxhZ2UscmFzc2UsZ2lsZGUsd2l6bGV2ZWwsaGFyZGNvcmUgZnJvbSB0b3BsaXN0ZSAiCisgICAgICAgICJXSEVSRSByYXNzZT0/MSBBTkQgZ2lsZGU9PzIgQU5EIHdpemxldmVsPTEgIgorICAgICAgICAiT1JERVIgQlkgIitzb3J0KyIgREVTQyBMSU1JVCAiK2xpbWl0KyI7IiwKKyAgICAgICAgcmFzc2UsIGdpbGRlKTsKKyAgZWxzZSBpZiAocmFzc2UpCisgICAgcmV0dXJuIHNsX2V4ZWMoCisgICAgICAgICJzZWxlY3QgbmFtZSxsZXAscXAseHAsbGV2ZWwsYWdlLHJhc3NlLGdpbGRlLHdpemxldmVsLGhhcmRjb3JlIGZyb20gdG9wbGlzdGUgIgorICAgICAgICAiV0hFUkUgcmFzc2U9PzEgQU5EIHdpemxldmVsPTEgIgorICAgICAgICAiT1JERVIgQlkgIitzb3J0KyIgREVTQyBMSU1JVCAiK2xpbWl0KyI7IiwKKyAgICAgICAgcmFzc2UpOworICBlbHNlIGlmIChnaWxkZSkKKyAgICByZXR1cm4gc2xfZXhlYygKKyAgICAgICAgInNlbGVjdCBuYW1lLGxlcCxxcCx4cCxsZXZlbCxhZ2UscmFzc2UsZ2lsZGUsd2l6bGV2ZWwsaGFyZGNvcmUgZnJvbSB0b3BsaXN0ZSAiCisgICAgICAgICJXSEVSRSBnaWxkZT0/MSBBTkQgd2l6bGV2ZWw9MSAiCisgICAgICAgICJPUkRFUiBCWSAiK3NvcnQrIiBERVNDIExJTUlUICIrbGltaXQrIjsiLAorICAgICAgICBnaWxkZSk7CisgIHJldHVybiBzbF9leGVjKAorICAgICAgInNlbGVjdCBuYW1lLGxlcCxxcCx4cCxsZXZlbCxhZ2UscmFzc2UsZ2lsZGUsd2l6bGV2ZWwsaGFyZGNvcmUgZnJvbSB0b3BsaXN0ZSAiCisgICAgICAiV0hFUkUgd2l6bGV2ZWw9MSAiCisgICAgICAiT1JERVIgQlkgIitzb3J0KyIgREVTQyBMSU1JVCAiK2xpbWl0KyI7Iik7Cit9CisKK3B1YmxpYyB2YXJhcmdzIDwgPHN0cmluZ3xpbnQ+KiA+KiBIYXJkY29yZUxpc3RlKHN0cmluZyByYXNzZSwgc3RyaW5nIGdpbGRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW1pdCwgc3RyaW5nIHNvcnQpCit7CisgIC8vIERlZmF1bHRzOgorICBzb3J0IHx8PSAibGVwIjsKKyAgaWYgKCFsaW1pdCB8fCBsaW1pdCA+IDEwMCkKKyAgICBsaW1pdD0xMDA7CisgIGVsc2UgaWYgKGxpbWl0IDwgMSkKKyAgICBsaW1pdD0xOworICBpZiAocmFzc2UgJiYgZ2lsZGUpCisgICAgcmV0dXJuIHNsX2V4ZWMoCisgICAgICAgICJzZWxlY3QgbmFtZSxsZXAscXAseHAsbGV2ZWwsYWdlLHJhc3NlLGdpbGRlLHdpemxldmVsLGhhcmRjb3JlIGZyb20gdG9wbGlzdGUgIgorICAgICAgICAiV0hFUkUgcmFzc2U9PzEgQU5EIGdpbGRlPT8yIEFORCBoYXJkY29yZT4wICIKKyAgICAgICAgIk9SREVSIEJZICIrc29ydCsiIERFU0MgTElNSVQgIitsaW1pdCsiOyIsCisgICAgICAgIHJhc3NlLCBnaWxkZSk7CisgIGVsc2UgaWYgKHJhc3NlKQorICAgIHJldHVybiBzbF9leGVjKAorICAgICAgICAic2VsZWN0IG5hbWUsbGVwLHFwLHhwLGxldmVsLGFnZSxyYXNzZSxnaWxkZSx3aXpsZXZlbCxoYXJkY29yZSBmcm9tIHRvcGxpc3RlICIKKyAgICAgICAgIldIRVJFIHJhc3NlPT8xIEFORCBoYXJkY29yZT4wICIKKyAgICAgICAgIk9SREVSIEJZICIrc29ydCsiIERFU0MgTElNSVQgIitsaW1pdCsiOyIsCisgICAgICAgIHJhc3NlKTsKKyAgZWxzZSBpZiAoZ2lsZGUpCisgICAgcmV0dXJuIHNsX2V4ZWMoCisgICAgICAgICJzZWxlY3QgbmFtZSxsZXAscXAseHAsbGV2ZWwsYWdlLHJhc3NlLGdpbGRlLHdpemxldmVsLGhhcmRjb3JlIGZyb20gdG9wbGlzdGUgIgorICAgICAgICAiV0hFUkUgZ2lsZGU9PzEgQU5EIGhhcmRjb3JlPjAgIgorICAgICAgICAiT1JERVIgQlkgIitzb3J0KyIgREVTQyBMSU1JVCAiK2xpbWl0KyI7IiwKKyAgICAgICAgZ2lsZGUpOworICByZXR1cm4gc2xfZXhlYygKKyAgICAgICJzZWxlY3QgbmFtZSxsZXAscXAseHAsbGV2ZWwsYWdlLHJhc3NlLGdpbGRlLHdpemxldmVsLGhhcmRjb3JlIGZyb20gdG9wbGlzdGUgIgorICAgICAgIldIRVJFIGhhcmRjb3JlPjAgIgorICAgICAgIk9SREVSIEJZICIrc29ydCsiIERFU0MgTElNSVQgIitsaW1pdCsiOyIpOworfQorCit2YXJhcmdzIGludCByZW1vdmUoaW50IHNpbGVudCkKK3sKKyAgRVZFTlRELT5VbnJlZ2lzdGVyRXZlbnQoRVZUX0xJQl9MT0dJTiwgdGhpc19vYmplY3QoKSk7CisgIHNsX2Nsb3NlKCk7CisgIGRlc3RydWN0KE1FKTsKKyAgcmV0dXJuIDE7Cit9CisKK3B1YmxpYyBtaXhlZCBzcWxfcXVlcnkoc3RyaW5nIHF1ZXJ5KQoreworICBpZiAoQVJDSF9TRUNVUklUWSkKKyAgICByZXR1cm4gc2xfZXhlYyhxdWVyeSk7CisgIHJldHVybiAwOworfQorCit2b2lkIHJlc2V0KCkKK3sKKyAgLy8gQWxsZSBFaW50cmFlZ2UgbG9lc2NoZW4sIGRpZSBzZWl0IDkwIG5pY2h0IG1laHIgYWt0dWFsaXNpZXJ0IHd1cmRlbi4KKy8vICBzbF9leGVjKCJERUxFVEUgRlJPTSB0b3BsaXN0ZSBXSEVSRSBsYXN0dXBkYXRlPD8xOyIsCisvLyAgICAgICAgICAgICAgICB0aW1lKCktOTAqMjQqMzYwMCk7CisgIHNsX2V4ZWMoIkRFTEVURSBGUk9NIHRvcGxpc3RlIFdIRVJFIG5hbWUgSU4gKFNFTEVDVCBuYW1lIEZST00gdG9wbGlzdGUgIgorICAgICAgICAgICJPUkRFUiBCWSBsZXAgREVTQyBMSU1JVCAxMDAwLCAtMSk7Iik7CisgIHNldF9uZXh0X3Jlc2V0KDg2NDAwKTsKK30KKwpkaWZmIC0tZ2l0IGEvc2VjdXJlL3VkcC9jaGFubmVsLmMgYi9zZWN1cmUvdWRwL2NoYW5uZWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTkyZmZlCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3VkcC9jaGFubmVsLmMKQEAgLTAsMCArMSwxMTAgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBjaGFubmVsLmMKKy8vCisvLyAkSWQ6IGNoYW5uZWwuYyA5MTQyIDIwMTUtMDItMDQgMjI6MTc6MjlaIFplc3N0cmEgJAorCisjaW5jbHVkZSA8dWRwLmg+CisKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8ZGFlbW9uLmg+CisKKyNpZmRlZiBaRUJFREVFCitpbmhlcml0ICIvc3lzL2Zvcm1hdCI7CisjZW5kaWYKKworI2RlZmluZSBDT01NQU5EICAgICAgICAgICAgICAgICJjbWQiCisjZGVmaW5lIENIQU5ORUwgICAgICAgICAgICAgICAgImNoYW5uZWwiCisKK3ByaXZhdGUgbm9zYXZlIG1peGVkIF9uYW1lXzsKKworaW50IGZpbHRlcl9saXN0ZW5lcnMob2JqZWN0IG9iLCBzdHJpbmcgY2hhbm5lbCkgeworICAgIHJldHVybiBvYi0+UXVlcnlQcm9wKFBfSU5URVJNVUQpOworfQorCitpbnQgdWRwX2NoYW5uZWwobWFwcGluZyBkYXRhKSB7CisgIG9iamVjdCAqbGlzdDsKKyAgc3RyaW5nIG1zZzsKKyAgaW50IGksIHR5cGU7CisKKyAgLyogQ29tcGF0YWJpbGl0eSB3aXRoIG9sZGVyIHN5c3RlbXMuICovCisgIGlmICghZGF0YVtDSEFOTkVMXSkKKyAgICBkYXRhW0NIQU5ORUxdID0gZGF0YVsiQ0hBTk5FTCJdOworICBpZiAoIWRhdGFbQ09NTUFORF0pCisgICAgZGF0YVtDT01NQU5EXSA9IGRhdGFbIkNNRCJdOworICBpZiAoIWRhdGFbREFUQV0pCisgICAgZGF0YVtEQVRBXT0iIjsKKworICBpZiAoIXN0cmluZ3AoZGF0YVtDSEFOTkVMXSkgfHwgIXNpemVvZihkYXRhW0NIQU5ORUxdKQorICAgICAgfHwgIXN0cmluZ3AoZGF0YVtEQVRBXSkgfHwgIXNpemVvZihkYXRhW0RBVEFdKQorICAgICAgfHwgIXN0cmluZ3AoZGF0YVtOQU1FXSkgfHwgIXNpemVvZihkYXRhW05BTUVdKQorICAgICAgfHwgIXN0cmluZ3AoZGF0YVtTRU5ERVJdKSB8fCAhc2l6ZW9mKGRhdGFbU0VOREVSXSkpCisgICAgcmV0dXJuIDA7CisKKyAgZGF0YVtEQVRBXT0KKyAgICBpbXBsb2RlKGZpbHRlcihleHBsb2RlKGRhdGFbREFUQV0sICIiKSwgIyc+PSwgIiAiKSwgIiIpOy8vJykpCisgIGRhdGFbTkFNRV09CisgICAgaW1wbG9kZShmaWx0ZXIoZXhwbG9kZShkYXRhW05BTUVdLCAiIiksICMnPj0sICIgIiksICIiKTsvLycpKQorICBzd2l0Y2goZGF0YVtDT01NQU5EXSkgeworICBjYXNlICJsaXN0IjoKKyAgICAvKiBSZXF1ZXN0IGZvciBhIGxpc3Qgb2YgcGVvcGxlIGxpc3RlbmluZyB0byBhIGNlcnRhaW4gY2hhbm5lbC4gKi8KKyAgICBsaXN0ID0gZmlsdGVyKHVzZXJzKCksICJmaWx0ZXJfbGlzdGVuZXJzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNfb2JqZWN0KCksIGRhdGFbQ0hBTk5FTF0pOworICAgIGlmIChpID0gc2l6ZW9mKGxpc3QpKSB7CisgICAgICBtc2cgPSAiWyIgKyBjYXBpdGFsaXplKGRhdGFbQ0hBTk5FTF0pICsgIkAiICsKKyAgICAgICAgTE9DQUxfTkFNRSArICJdIExpc3RlbmluZzpcbiI7CisgICAgICB3aGlsZShpLS0pCisgICAgICAgIG1zZyArPQorICAgICAgICAgICIgICAgIiArIGNhcGl0YWxpemUobGlzdFtpXS0+cXVlcnlfcmVhbF9uYW1lKCkpICsgIlxuIjsKKyAgICB9CisgICAgZWxzZQorICAgICAgbXNnID0gIlsiICsgY2FwaXRhbGl6ZShkYXRhW0NIQU5ORUxdKSArICJAIiArIExPQ0FMX05BTUUgCisgICAgICArICJdIE5vYm9keSBMaXN0ZW5pbmcuXG4iOworICAgIElORVRELT5fc2VuZF91ZHAoZGF0YVtOQU1FXSwgKFsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRVFVRVNUOiBSRVBMWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUNJUElFTlQ6IGRhdGFbU0VOREVSXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRDogZGF0YVtJRF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFUQTogbXNnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pKTsKKyAgICByZXR1cm4gMTsKKyAgY2FzZSAiZW1vdGUiOiAvKiBBIGNoYW5uZWwgZW1vdGUuICovCisgICAgICB0eXBlID0gTVNHX0VNT1RFOworICAgICAgYnJlYWs7CisgIGRlZmF1bHQ6IC8qIEEgcmVndWxhciBjaGFubmVsIG1lc3NhZ2UuICovCisgICAgdHlwZSA9IE1TR19TQVk7CisgICAgYnJlYWs7CisgIH0KKyAgX25hbWVfID0gY2FwaXRhbGl6ZShkYXRhW1NFTkRFUl0pKyJAIitjYXBpdGFsaXplKGRhdGFbTkFNRV0pOworICBDSE1BU1RFUi0+c2VuZChjYXBpdGFsaXplKGRhdGFbQ0hBTk5FTF0pLCB0aGlzX29iamVjdCgpLCAKKyAgICAgICAgICAgICAgICAgZGF0YVtEQVRBXSwgdHlwZSk7CisgIF9uYW1lXyA9IDA7CisgIHJldHVybiAxOworfQorCitzdHJpbmcgbmFtZSgpIHsgcmV0dXJuIF9uYW1lXyB8fCAiPEludGVybXVkPiI7IH0KK3N0cmluZyBOYW1lKCkge3JldHVybiBjYXBpdGFsaXplKF9uYW1lXyB8fCAiPEludGVybXVkPiIpO30KKworcHJpdmF0ZSB2b2lkIF9zZW5kKHN0cmluZyBtdWQsIG1peGVkIGRhdGEsIG1hcHBpbmcgcmVxdWVzdCkKK3sKKyAgaWYobWVtYmVyKGRhdGFbSE9TVF9DT01NQU5EU10sICJjaGFubmVsIikgIT0gLTEgfHwKKyAgICAgbWVtYmVyKGRhdGFbSE9TVF9DT01NQU5EU10sICIqIikgIT0gLTEpCisgICAgSU5FVEQtPl9zZW5kX3VkcChkYXRhW0hPU1RfTkFNRV0sIHJlcXVlc3QpOworfQorCit2b2lkIENoYW5uZWxNZXNzYWdlKG1peGVkIG0pCit7CisgIG1hcHBpbmcgcmVxdWVzdDsKKyAgaWYobVsxXSA9PSB0aGlzX29iamVjdCgpKSByZXR1cm47CisgIHJlcXVlc3QgPSAoWworICAgICAgICAgICAgICBSRVFVRVNUIDogImNoYW5uZWwiLAorICAgICAgICAgICAgICBTRU5ERVIgIDogbVsxXS0+bmFtZSgpIHx8IGNhcGl0YWxpemUoZ2V0dWlkKG1bMV0pKSwKKyAgICAgICAgICAgICAgIkNIQU5ORUwiOiBsb3dlcl9jYXNlKG1bMF0pLAorICAgICAgICAgICAgICBEQVRBICAgIDogaW1wbG9kZShvbGRfZXhwbG9kZShtWzJdLCAiXG4iKSwgIiAiKV0pOworICBpZihtWzNdID09IE1TR19HRU1PVEUgfHwgbVszXSA9PSBNU0dfRU1PVEUpCisgIHsgCisgICAgcmVxdWVzdFsiRU1PVEUiXSA9IDE7CisgICAgcmVxdWVzdFsiQ01EIl0gPSAiZW1vdGUiOworICB9CisgIHdhbGtfbWFwcGluZyhJTkVURC0+cXVlcnkoImhvc3RzIikgLSAoW2xvd2VyX2Nhc2UoTVVETkFNRSldKSwgCisgICAgICAgICAgICAgICAjJ19zZW5kLyonKi8sIHJlcXVlc3QpOworfQpkaWZmIC0tZ2l0IGEvc2VjdXJlL3VkcC9maW5nZXIuYyBiL3NlY3VyZS91ZHAvZmluZ2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzlkNGM0ZAotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS91ZHAvZmluZ2VyLmMKQEAgLTAsMCArMSwzMSBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIGZpbmdlci5jCisvLworLy8gJElkOiBmaW5nZXIuYyA2MDgxIDIwMDYtMTAtMjMgMTQ6MTI6MzRaIFplc3N0cmEgJAorCisjaW5jbHVkZSA8dWRwLmg+CisKK3N0cmluZyBsYXN0X2ZpbmdlcjsKKworI2lmZGVmIFpFQkVERUUKKyNpbmNsdWRlIDxzeXN0ZW0uaD4KKyNlbGlmICFkZWZpbmVkKElORVREKQorI2RlZmluZSBJTkVURAkiL3NlY3VyZS9pbmV0ZCIKKyNlbmRpZgorCit2b2lkIHVkcF9maW5nZXIobWFwcGluZyBkYXRhKQoreworICBsYXN0X2Zpbmdlcj1jYXBpdGFsaXplKHRvX3N0cmluZyhkYXRhW1NFTkRFUl0pKSsiQCIrZGF0YVtOQU1FXTsKKyAgSU5FVEQtPl9zZW5kX3VkcChkYXRhW05BTUVdLCAoWworCVJFUVVFU1Q6IFJFUExZLAorCVJFQ0lQSUVOVDogZGF0YVtTRU5ERVJdLAorCUlEOiBkYXRhW0lEXSwKKwlEQVRBOiAiL3AvZGFlbW9uL2ZpbmdlciItPmZpbmdlcl9zaW5nbGUoZGF0YVtEQVRBXSkKKyAgICBdKSApOworfQorCitzdHJpbmcgUXVlcnlMYXN0RmluZ2VyKCkKK3sKKyAgcmV0dXJuIGxhc3RfZmluZ2VyOworfQpkaWZmIC0tZ2l0IGEvc2VjdXJlL3VkcC9odG1sd2hvLmMgYi9zZWN1cmUvdWRwL2h0bWx3aG8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWNkODk5Ci0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3VkcC9odG1sd2hvLmMKQEAgLTAsMCArMSw1MyBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIGh0bWx3aG8uYworLy8KKy8vICRJZDogaHRtbHdoby5jIDg3NTUgMjAxNC0wNC0yNiAxMzoxMzo0MFogWmVzc3RyYSAkCisKKyNwcmFnbWEgd2Vha190eXBlcworCisjaW5jbHVkZSA8dWRwLmg+CisKKyNkZWZpbmUgVEooeCkgaWYgKGZpbmRfcGxheWVyKCJqb2YiKSkgdGVsbF9vYmplY3QoZmluZF9wbGF5ZXIoImpvZiIpLHgpCisKK3N0cmluZyBhZGp1c3Qoc3RyaW5nIHN0cixpbnQgd2lkKQoreworICBpbnQgdzI7CisKKyAgdzI9d2lkLzI7CisgIHdpZD13aWQtdzI7CisgIHJldHVybiBleHRyYWN0KCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwwLHdpZC0xKStzdHIrCisgICAgZXh0cmFjdCgiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwwLHcyLTEpOworfQorCit1ZHBfaHRtbHdobyhkYXRhKQoreworICBpbnQgaSxudW07CisgIHN0cmluZyAqbWRhdGE7CisgIHN0cmluZyB3aG9saXN0ZSx0bXAsdG1wMjsKKyAKKyAgbWRhdGE9Ii9vYmovd2VybGlzdGUiLT5RdWVyeVdob0xpc3RlKDAsMCwxKTsKKyAgbnVtPXNpemVvZihtZGF0YSk7CisgIGZvciAoaT1udW0tMTtpPj0wO2ktLSkKKyAgeworICAgIHRtcD1tZGF0YVtpXVswXS0+bmFtZSgpOworICAgIGlmICh0bXAmJnNpemVvZih0bXApKQorICAgIHsKKyAgICAgIHRtcDI9ZXhwbG9kZShtZGF0YVtpXVsxXSx0bXApOworICAgICAgaWYgKHNpemVvZih0bXAyKT4xKQorICAgICAgeworICAgICAgICB0bXAyWzBdPSI8QSBIUkVGPVwiL2h0YmluL211ZHd3dz9maW5nZXI/IitnZXR1aWQobWRhdGFbaV1bMF0pKyJcIj48Yj4iOworICAgICAgICB0bXAyWzFdPSI8L2I+PC9BPiIrdG1wMlsxXTsKKyAgICAgICAgbWRhdGFbaV1bMV09aW1wbG9kZSh0bXAyLHRtcCk7CisgICAgICB9CisgICAgICBtZGF0YVtpXT0iIDxMST4gIittZGF0YVtpXVsxXTsKKyAgICB9CisgIH0KKyAgd2hvbGlzdGU9aW1wbG9kZShtZGF0YSwiXG4iKTsKKyAgSU5FVEQtPl9zZW5kX3VkcChkYXRhW05BTUVdLCAoWworCQkJCVJFUVVFU1Q6IFJFUExZLAorCQkJCVJFQ0lQSUVOVDogZGF0YVtTRU5ERVJdLAorCQkJCUlEOiBkYXRhW0lEXSwKKwkJCQlEQVRBOiB3aG9saXN0ZQorCQkJCV0pICk7Cit9CmRpZmYgLS1naXQgYS9zZWN1cmUvdWRwL2xvY2F0ZS5jIGIvc2VjdXJlL3VkcC9sb2NhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzkzZDA1Ci0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3VkcC9sb2NhdGUuYwpAQCAtMCwwICsxLDMzIEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gbG9jYXRlLmMKKy8vCisvLyAkSWQ6IGxvY2F0ZS5jIDYwODEgMjAwNi0xMC0yMyAxNDoxMjozNFogWmVzc3RyYSAkCisKKyNpbmNsdWRlIDx1ZHAuaD4KKworI2RlZmluZSBGT1VORAkJImZuZCIKKyNkZWZpbmUgVVNFUgkJInVzZXIiCisjZGVmaW5lIFZFUkJPU0UJCSJ2YnMiCisKK3ZvaWQgdWRwX2xvY2F0ZShtYXBwaW5nIGRhdGEpIHsKKyAgICBtYXBwaW5nIHJldDsKKyAgICBvYmplY3Qgb2I7CisKKyAgICByZXQgPSAoWworCVJFUVVFU1Q6IFJFUExZLAorCVJFQ0lQSUVOVDogZGF0YVtTRU5ERVJdLAorCUlEOiBkYXRhW0lEXSwKKwlVU0VSOiBkYXRhW1VTRVJdLAorCVZFUkJPU0U6IGRhdGFbVkVSQk9TRV0sCisgICAgXSk7CisgICAgaWYgKGRhdGFbREFUQV0gJiYgKG9iID0gZmluZF9wbGF5ZXIoZGF0YVtEQVRBXSkpICYmCisgICAgaW50ZXJhY3RpdmUob2IpICYmICFvYi0+cXVlcnlfaW52aXMoKSkgeworCXJldFtGT1VORF0gPSAxOworCXJldFtEQVRBXSA9ICJsb2NhdGVAIiArIExPQ0FMX05BTUUgKyAiOiAiICsgb2ItPnNob3J0KCk7CisgICAgfQorICAgIGVsc2UKKwlyZXRbREFUQV0gPSAibG9jYXRlQCIgKyBMT0NBTF9OQU1FICsgIjogTm8gc3VjaCBwbGF5ZXI6ICIgKworCWRhdGFbREFUQV0gKyAiXG4iOworICAgIElORVRELT5fc2VuZF91ZHAoZGF0YVtOQU1FXSwgcmV0KTsKK30KZGlmZiAtLWdpdCBhL3NlY3VyZS91ZHAvbWFpbC5jIGIvc2VjdXJlL3VkcC9tYWlsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRmODY1MQotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS91ZHAvbWFpbC5jCkBAIC0wLDAgKzEsNjQgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBtYWlsLmMKKy8vCisvLyAkSWQ6IG1haWwuYyA2MDgxIDIwMDYtMTAtMjMgMTQ6MTI6MzRaIFplc3N0cmEgJAorCisvKgorICogVkVSU0lPTiAxLjAKKyAqIHVkcCBtb2R1bGUgZm9yIHRoZSBVRFAgTUFJTCBzeXN0ZW0gKEF1dGhvcjogQWx2aW5AU3VzaGkpCisgKiBSZXF1aXJlcyBJTkVURCBWMC42MCBvciBoaWdoZXIgKElORVREIEF1dGhvcjogTm9zdHJhZGFtdXNAWmViZWRlZSkKKyAqLworCisjaW5jbHVkZSA8dWRwLmg+CisjaW5jbHVkZSA8dWRwX21haWwuaD4KKworLyoKKyNkZWZpbmUgREVCVUcobXNnKSBpZiAoZmluZF9wbGF5ZXIoImhhdGUiKSkgdGVsbF9vYmplY3QoZmluZF9wbGF5ZXIoImhhdGUiKSxtc2cpCisqLworI3VuZGVmIERFQlVHCisjZGVmaW5lIERFQlVHKHgpCisKK3ZvaWQgdWRwX21haWwobWFwcGluZyBkYXRhKQoreworICBERUJVRyhzcHJpbnRmKCJVRFBNQUlMICVPXG4iLGRhdGEpKTsKKyAgaWYoIW1lbWJlcihkYXRhLFJFQ0lQSUVOVCkgfHwgIWRhdGFbUkVDSVBJRU5UXSkKKyAgICB7CisgICAgICBsb2dfZmlsZSgiSU5FVEQiLCJJbnZhbGlkIHVkcF9tYWlsIHBhY2tldC4gTm8gUmVjaXBpZW50LlxuIik7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmKCFMT0NBTF9NQUlMRVItPnF1ZXJ5X3JlY2lwaWVudF9vayhkYXRhW1JFQ0lQSUVOVF0pKQorICAgIHsKKyAgICAgIElORVRELT5fc2VuZF91ZHAoZGF0YVtOQU1FXSwgKFsKKwkgICAgUkVRVUVTVDogUkVQTFksCisJICAgIFJFQ0lQSUVOVDogZGF0YVtTRU5ERVJdLAorCSAgICBVRFBNX1NUQVRVUzogVURQTV9TVEFUVVNfVU5LTk9XTl9QTEFZRVIsCisJICAgIFVEUE1fV1JJVEVSOiBkYXRhW1VEUE1fV1JJVEVSXSwKKwkgICAgVURQTV9TUE9PTF9OQU1FOiBkYXRhW1VEUE1fU1BPT0xfTkFNRV0sCisJICAgIElEOiBkYXRhW0lEXSwKKwkgICAgREFUQTogIlJlYXNvbjogVW5rbm93biBwbGF5ZXIgXCIiK2NhcGl0YWxpemUoZGF0YVtSRUNJUElFTlRdKSsKKwkJIlwiXG5cbklOQ0xVREVEIE1FU1NBR0UgRk9MTE9XUyA6LVxuXG4iKworCQkiU3ViamVjdDogIitkYXRhW1VEUE1fU1VCSkVDVF0rIlxuIitkYXRhW0RBVEFdCisgICAgICBdKSApOworCisgICAgICByZXR1cm47CisgICAgfQorCisgIExPQ0FMX01BSUxFUi0+ZGVsaXZlcl9tYWlsKAorCWRhdGFbUkVDSVBJRU5UXSwJCQkvKiBUbyAqLworCWRhdGFbVURQTV9XUklURVJdKyJAIitkYXRhW05BTUVdLAkvKiBGcm9tICovCisJZGF0YVtVRFBNX1NVQkpFQ1RdLAkJCS8qIFN1YmogKi8KKwlkYXRhW0RBVEFdCQkJCS8qIE1haWwgQm9keSAqLworICApOworCisgIElORVRELT5fc2VuZF91ZHAoZGF0YVtOQU1FXSwgKFsKKwkgICAgUkVRVUVTVDogUkVQTFksCisJICAgIFJFQ0lQSUVOVDogZGF0YVtTRU5ERVJdLAorCSAgICBVRFBNX1NUQVRVUzogVURQTV9TVEFUVVNfREVMSVZFUkVEX09LLAorCSAgICBVRFBNX1dSSVRFUjogZGF0YVtVRFBNX1dSSVRFUl0sCisJICAgIFVEUE1fU1BPT0xfTkFNRTogZGF0YVtVRFBNX1NQT09MX05BTUVdLAorCSAgICBJRDogZGF0YVtJRF0sCisJICAgIERBVEE6IGRhdGFbUkVDSVBJRU5UXQorICBdKSApOworfQpkaWZmIC0tZ2l0IGEvc2VjdXJlL3VkcC9tYW4uYyBiL3NlY3VyZS91ZHAvbWFuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhjNGI1NwotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS91ZHAvbWFuLmMKQEAgLTAsMCArMSw5OCBAQAorI3ByYWdtYSBzdHJpY3RfdHlwZXMKKyNpbmNsdWRlIDx1ZHAuaD4KKyNpbmNsdWRlIDxkYWVtb24uaD4KKworI2RlZmluZSBNQVhfUkVBRF9GSUxFX0xFTiA1MDAwMAorCisvLyBURU1QT1JBUlkKKworI2luY2x1ZGUgPHVkcF9sYW5ndWFnZS5oPgorI2luY2x1ZGUgPGxvZ2dpbmcuaD4KKworI2lmbmRlZiBMT0NBTF9OQU1FCisjZGVmaW5lIExPQ0FMX05BTUUgIk1vcmdlbkdyYXVlbiIKKyNlbmRpZgorCisjaWZuZGVmIElORVREX0lOVkFMSURfQUNDRVNTCisjZGVmaW5lIElORVREX0lOVkFMSURfQUNDRVNTIElOVEVSTVVETE9HKCJJTlZBTElEX0FDQ0VTUyIpCisjZW5kaWYKKworI2lmbmRlZiBJTlZBTElEX0FDQ0VTUworI2RlZmluZSBJTlZBTElEX0FDQ0VTUyh4KSBcCisgICAgICAgICAgIGxvZ19maWxlKElORVREX0lOVkFMSURfQUNDRVNTLCBcCisgICAgICAgICAgICAgICAgICAgIHNwcmludGYoSU5FVERfSU5WX0FDQ0VTU19NU0cgIlRJOiAlTyBQTzogJU9cbiIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdGltZSgpWzQuLjE1XSx0aGlzX2ludGVyYWN0aXZlKCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c19vYmplY3QoKSkpCisjZW5kaWYKKworCisvLyBFTkQgVEVNUE9SQVJZCisKK3ZvaWQgdWRwX21hbihtYXBwaW5nIGRhdGEpCit7CisgIG1hcHBpbmcgcGFnZXM7CisgIGludCBpbmRleDsKKyAgc3RyaW5nIG1hbnBhZ2UscmV0OworICBzdHJpbmd8c3RyaW5nKiB0bXA7CisKKyAgaWYgKHByZXZpb3VzX29iamVjdCgpIT1maW5kX29iamVjdChJTkVURCkpCisgIHsKKyAgICBJTlZBTElEX0FDQ0VTUyhNYW4pOworICAgIHJldHVybjsKKyAgfQorCisgIG1hbnBhZ2U9ZGF0YVtEQVRBXTsKKyAgdG1wPWV4cGxvZGUobWFucGFnZSwiLyIpOworICBpZiAoc2l6ZW9mKHRtcCk+MSkKKyAgeworICAgIGlmIChmaWxlX3NpemUoTUFORF9ET0NESVIrbWFucGFnZSk+PTApCisgICAgICB0bXA9KHt0bXBbPDFdLG1hbnBhZ2V9KTsKKyAgICBlbHNlCisgICAgICB0bXA9KHt9KTsKKyAgfQorICBlbHNlCisgICAgdG1wPShzdHJpbmcgKiljYWxsX290aGVyKE1BTkQsImxvY2F0ZSIsZGF0YVtEQVRBXSwwKTsKKyAgcGFnZXM9KFtdKTsKKyAgaW5kZXg9c2l6ZW9mKHRtcCk7CisgIHdoaWxlKGluZGV4LS0pCisgIHsKKyAgICBpZiAodG1wWzFdWzAuLjFdIT0iZy4iKSBwYWdlc1t0bXBbaW5kZXhdXT10bXBbaW5kZXgtMV07CisgICAgaW5kZXgtLTsKKyAgfQorICBzd2l0Y2goc2l6ZW9mKHBhZ2VzKSkKKyAgeworICAgIGNhc2UgMDoKKyAgICAgIHJldD1zcHJpbnRmKElORVREX05PX01BTlBBR0UsTE9DQUxfTkFNRSxtYW5wYWdlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgIHRtcD1tX2luZGljZXMocGFnZXMpWzBdOworICAgICAgcmV0PXNwcmludGYoSU5FVERfTUFOUEFHRV9GT1VORCxMT0NBTF9OQU1FLHBhZ2VzW3RtcF0pOworICAgICAgaW5kZXg9MDsKKyAgICAgIHdoaWxlKG1hbnBhZ2U9cmVhZF9maWxlKE1BTkRfRE9DRElSK3RtcCxpbmRleCkpCisgICAgICB7CisgICAgICAgIHJldCs9bWFucGFnZTsKKyAgICAgICAgaW5kZXgrPU1BWF9SRUFEX0ZJTEVfTEVOOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldD1zcHJpbnRmKElORVREX01BTlBBR0VTLExPQ0FMX05BTUUsIiIsCisgICAgICAgICAgICAgICAgICBicmVha19zdHJpbmcoaW1wbG9kZShtX3ZhbHVlcyhwYWdlcyksIiAiKSw3OCksIiIpOworICAgICAgYnJlYWs7CisgIH0KKyAgSU5FVEQtPl9zZW5kX3VkcChkYXRhW05BTUVdLAorICAgICAgICAgICAgICAgICAgICAgKFsKKyAgICAgICAgICAgICAgICAgICAgICAgUkVRVUVTVDogUkVQTFksCisgICAgICAgICAgICAgICAgICAgICAgIFJFQ0lQSUVOVDogZGF0YVtTRU5ERVJdLAorICAgICAgICAgICAgICAgICAgICAgICBJRDogZGF0YVtJRF0sCisgICAgICAgICAgICAgICAgICAgICAgIERBVEE6IHJldAorICAgICAgICAgICAgICAgICAgICAgXSkpOworfQorCitzdHJpbmcgc2VuZF9yZXF1ZXN0KHN0cmluZyBtdWRuYW1lLCBzdHJpbmcgcGFnZW5hbWUpCit7CisgIHJldHVybiAoSU5FVEQtPl9zZW5kX3VkcChtdWRuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoW1JFUVVFU1Q6ICJtYW4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBVEE6IHBhZ2VuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFTkRFUjogZ2V0dWlkKHByZXZpb3VzX29iamVjdCgpKV0pLDEpfHwKKyAgICAgICAgICBzcHJpbnRmKElORVREX01BTl9SRVFVRVNURUQscGFnZW5hbWUsbXVkbmFtZSkpOworfQpkaWZmIC0tZ2l0IGEvc2VjdXJlL3VkcC9waW5nLmMgYi9zZWN1cmUvdWRwL3BpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDgzMjlkCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3VkcC9waW5nLmMKQEAgLTAsMCArMSwyMiBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIHBpbmcuYworLy8KKy8vICRJZDogcGluZy5jIDYwODEgMjAwNi0xMC0yMyAxNDoxMjozNFogWmVzc3RyYSAkCisKKyNpbmNsdWRlIDx1ZHAuaD4KKworI2lmZGVmIFpFQkVERUUKKyNpbmNsdWRlIDxzeXN0ZW0uaD4KKyNlbGlmICFkZWZpbmVkKElORVREKQorI2RlZmluZSBJTkVURAkiL3NlY3VyZS9pbmV0ZCIKKyNlbmRpZgorCit2b2lkIHVkcF9waW5nKG1hcHBpbmcgZGF0YSkgeworICAgIElORVRELT5fc2VuZF91ZHAoZGF0YVtOQU1FXSwgKFsKKwlSRVFVRVNUOiBSRVBMWSwKKwlSRUNJUElFTlQ6IGRhdGFbU0VOREVSXSwKKwlJRDogZGF0YVtJRF0sCisJREFUQTogTE9DQUxfTkFNRSArICIgaXMgYWxpdmUuXG4iCisgICAgXSkgKTsKK30KZGlmZiAtLWdpdCBhL3NlY3VyZS91ZHAvcXVlcnkuYyBiL3NlY3VyZS91ZHAvcXVlcnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWJjN2NkCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3VkcC9xdWVyeS5jCkBAIC0wLDAgKzEsODggQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBxdWVyeS5jCisvLworLy8gJElkOiBxdWVyeS5jIDczOTcgMjAxMC0wMS0yNiAyMTo0ODoxMVogWmVzc3RyYSAkCisKKyNpbmNsdWRlIDx1ZHAuaD4KKyNpbmNsdWRlIDx1ZHBfbGFuZ3VhZ2UuaD4KKyNpbmNsdWRlIDxzdHJpbmdzLmg+CisKKyNpZmRlZiBaRUJFREVFCisjaW5jbHVkZSA8c3lzdGVtLmg+CisjZWxpZiAhZGVmaW5lZChJTkVURCkKKyNkZWZpbmUgSU5FVEQgICAgICAgICIvc2VjdXJlL2luZXRkIgorI2VuZGlmCisKKy8qIE11ZCAvIEFkbWluIGVtYWlsIGFkZHJlc3MuICovCisjZGVmaW5lIEVNQUlMICAgICAgICAibXVkQG1nLm11ZC5kZSIKKwordm9pZCB1ZHBfcXVlcnkobWFwcGluZyBkYXRhKSB7CisgICAgbWFwcGluZyByZXQ7CisKKyAgICBzd2l0Y2goZGF0YVtEQVRBXSkgeworICAgICAgICBjYXNlICJjb21tYW5kcyI6CisgICAgICAgICAgICByZXQgPSBJTkVURC0+cXVlcnkoImhvc3RzIik7CisgICAgICAgICAgICBpZiAocmV0W2xvd2VyX2Nhc2UoZGF0YVtOQU1FXSldKQorICAgICAgICAgICAgICAgIHJldCA9IChbCisgICAgICAgICAgICAgICAgREFUQTogaW1wbG9kZShyZXRbbG93ZXJfY2FzZShkYXRhW05BTUVdKV1bTE9DQUxfQ09NTUFORFNdLCAiOiIpCisgICAgICAgICAgICAgICAgXSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0ID0gKFsgREFUQTogaW1wbG9kZShJTkVURC0+cXVlcnkoImNvbW1hbmRzIiksICI6IikgXSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAiZW1haWwiOgorICAgICAgICAgICAgcmV0ID0gKFsgREFUQTogRU1BSUwgXSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAiaG9zdHMiOgorICAgICAgICB7CisgICAgICAgICAgICBzdHJpbmcgdG1wID0gIiI7CisgICAgICBmb3JlYWNoKHN0cmluZyBtdWRuYW1lLCBtaXhlZCBmaWVsZHM6IElORVRELT5xdWVyeSgiaG9zdHMiKSkgeworICAgICAgICB0bXAgKz0gZmllbGRzW0hPU1RfTkFNRV0gKyAiOiIgKworICAgICAgICAgICAgIGZpZWxkc1tIT1NUX0lQXSArICI6IiArCisgICAgICAgICAgICAgZmllbGRzW0hPU1RfVURQX1BPUlRdICsgIjoiICsKKyAgICAgICAgICAgICBpbXBsb2RlKGZpZWxkc1tMT0NBTF9DT01NQU5EU10sICIsIikgKyAiOiIgKworICAgICAgICAgICAgIGltcGxvZGUoZmllbGRzW0hPU1RfQ09NTUFORFNdLCAiLCIpICsgIlxuIjsKKyAgICAgIH0KKyAgICAgICAgICAgIHJldCA9IChbIERBVEE6IHRyaW0odG1wLFRSSU1fUklHSFQsICJcbiIpIF0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSAiaW5ldGQiOgorICAgICAgICAgICAgcmV0ID0gKFsgREFUQTogSU5FVERfVkVSU0lPTiBdKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICJsaXN0IjoKKyAgICAgICAgICAgIC8qIExpc3Qgb2YgdGhpbmdzdGhhdCBjYW4gYmUgcXVlcmllZC4gKi8KKyAgICAgICAgICAgIHJldCA9IChbIERBVEE6ICJjb21tYW5kczplbWFpbDpob3N0czppbmV0ZDptdWRfcG9ydDp0aW1lOnZlcnNpb24iIF0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgIm11ZF9wb3J0IjoKKyAgICAgICAgICAgIHJldCA9IChbIERBVEE6IHF1ZXJ5X211ZF9wb3J0KCkgXSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAidGltZSI6CisgICAgICAgICAgICByZXQgPSAoWyBEQVRBOiB0aW1lKCkgXSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAidmVyc2lvbiI6CisgICAgICAgICAgICByZXQgPSAoWyBEQVRBOiB2ZXJzaW9uKCkgXSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIC8qIEp1c3QgaWdub3JlIGl0IGZvciB0aGUgdGltZSBiZWluZy4gKi8KKyAgICAgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgSU5FVEQtPl9zZW5kX3VkcChkYXRhW05BTUVdLCByZXQgKyAoWworICAgICAgICBSRVFVRVNUOiBSRVBMWSwKKyAgICAgICAgUkVDSVBJRU5UOiBkYXRhW1NFTkRFUl0sCisgICAgICAgIElEOiBkYXRhW0lEXSwKKyAgICAgICAgIlFVRVJZIjogZGF0YVtEQVRBXQorICAgIF0pICk7Cit9CisKK3N0cmluZyBzZW5kX3JlcXVlc3Qoc3RyaW5nIG11ZG5hbWUsIHN0cmluZyBwcm9wKQoreworICBpZiAoIXN0cmluZ3AobXVkbmFtZSkgfHwgIXN0cmluZ3AocHJvcCkpCisgICAgcmV0dXJuIDA7CisgIAorICByZXR1cm4gKElORVRELT5fc2VuZF91ZHAobXVkbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFtSRVFVRVNUOiAicXVlcnkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBVEE6IHByb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VOREVSOiBnZXR1aWQocHJldmlvdXNfb2JqZWN0KCkpXSksMSl8fAorICAgICAgICAgIHNwcmludGYoSU5FVERfUVVFUllfUkVRVUVTVEVELCBwcm9wLCBtdWRuYW1lKSk7Cit9CisKZGlmZiAtLWdpdCBhL3NlY3VyZS91ZHAvcmVwbHkuYyBiL3NlY3VyZS91ZHAvcmVwbHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjA2NjFhCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3VkcC9yZXBseS5jCkBAIC0wLDAgKzEsNTQgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyByZXBseS5jCisvLworLy8gJElkOiByZXBseS5jLHYgMS4yIDIwMDMvMDQvMDggMDk6Mjg6MTcgUmlrdXMgRXhwICQKKworI2luY2x1ZGUgPHVkcC5oPgorCisjaWZuZGVmIERBVEUKKyNkZWZpbmUgREFURQljdGltZSgpWzQuLjE1XQorI2VuZGlmCisKK3ZvaWQgdWRwX3JlcGx5KG1hcHBpbmcgZGF0YSkKK3sKKyAgc3RyaW5nIGVycixyZWNwdCxzZXJ2OworICBvYmplY3Qgb2I7CisgIAorICAKKyAgaWYgKHBvaW50ZXJwKGRhdGFbU1lTVEVNXSkmJm1lbWJlcihkYXRhW1NZU1RFTV0sVElNRV9PVVQpPi0xKQorICB7CisgICAgaWYgKGRhdGFbU0VOREVSXSkKKyAgICB7CisgICAgICBpZiAoc3RyaW5ncChkYXRhW1NFTkRFUl0pJiYob2I9ZmluZF9wbGF5ZXIoZGF0YVtTRU5ERVJdKSkpCisgICAgICB7CisgICAgICAgIHN3aXRjaChkYXRhW1JFUVVFU1RdKQorICAgICAgICB7CisgICAgICAgICAgY2FzZSAidGVsbCI6IHNlcnY9InRlaWxlIG1pdDogIjticmVhazsKKyAgICAgICAgICBjYXNlICJ3aG8iOiAgc2Vydj0id2VyOiAiO2JyZWFrOworICAgICAgICAgIGRlZmF1bHQ6IHNlcnY9ZGF0YVtSRVFVRVNUXSsiOiAiOyBicmVhazsKKyAgICAgICAgfQorICAgICAgICB0ZWxsX29iamVjdChvYiwgYnJlYWtfc3RyaW5nKCJEYXMgTXVkIFwnIiArIGRhdGFbTkFNRV0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcJyBrb25udGUgbmljaHQgZXJyZWljaHQgd2VyZGVuLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3OCxzZXJ2KSk7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIGlmIChvYmplY3RwKG9iID0gZGF0YVtTRU5ERVJdKXx8KG9iID0gZmluZF9vYmplY3QoZGF0YVtTRU5ERVJdKSkpCisgICAgICAgICAgb2ItPnVkcF9yZXBseShkYXRhKTsKKyAgICB9CisgICAgcmV0dXJuOworICB9CisgIGlmIChkYXRhW1JFQ0lQSUVOVF0pCisgIHsKKyAgICBpZiAoc3RyaW5ncChkYXRhW1JFQ0lQSUVOVF0pJiYob2IgPSBmaW5kX3BsYXllcihkYXRhW1JFQ0lQSUVOVF0pKSkKKyAgICAgIHRlbGxfb2JqZWN0KG9iLCAiXG4iICsgZGF0YVtEQVRBXSk7CisgICAgZWxzZSBpZiAob2I9ZmluZF9vYmplY3QoZGF0YVtSRUNJUElFTlRdKSkKKyAgICAgIG9iLT51ZHBfcmVwbHkoZGF0YSk7CisgICAgcmV0dXJuOworICB9CisgIGlmIChkYXRhW1JFUVVFU1RdPT0icGluZyIpcmV0dXJuOworICBpZiAoZGF0YVtEQVRBXSkKKyAgICBsb2dfZmlsZShJTkVURF9MT0dfRklMRSwgREFURSArICI6IEFudHdvcnQgdm9uICIgKyBkYXRhW05BTUVdICsKKyAgICAgICAgICAgICAiXG4iICsgZGF0YVtEQVRBXSArICJcbiIpOworICByZXR1cm47Cit9CmRpZmYgLS1naXQgYS9zZWN1cmUvdWRwL3RlbGwuYyBiL3NlY3VyZS91ZHAvdGVsbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiMWFiNjEKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvdWRwL3RlbGwuYwpAQCAtMCwwICsxLDExOCBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIHRlbGwuYworLy8KKy8vICRJZDogdGVsbC5jIDg3NTUgMjAxNC0wNC0yNiAxMzoxMzo0MFogWmVzc3RyYSAkCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDx1ZHAuaD4KKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisKKyNpZmRlZiBaRUJFREVFCisjaW5jbHVkZSA8c3lzdGVtLmg+Citpbmhlcml0ICIvc3lzL2Zvcm1hdCI7CisjZWxpZiAhZGVmaW5lZChJTkVURCkKKyNkZWZpbmUgSU5FVEQgIi9zZWN1cmUvaW5ldGQiCisjZW5kaWYKKworCit2b2lkIHVkcF90ZWxsKG1hcHBpbmcgZGF0YSkgeworICBvYmplY3Qgb2I7CisgIHN0cmluZyBtZXNzYWdlX3N0cmluZywgbWVzc2FnZV9wcmVmaXgsIGF3YXk7CisgIGludCBpLHJlOworICBzdHJpbmcgKm1lc3NhZ2VfYXJyYXk7CisKKyAgaWYgKGRhdGFbUkVDSVBJRU5UXSAmJgorICAgICAgIChvYiA9IGZpbmRfcGxheWVyKGxvd2VyX2Nhc2UoZGF0YVtSRUNJUElFTlRdKSkpICYmCisgICAgICAgaW50ZXJhY3RpdmUob2IpKSB7CisgICAgCisgICAgaWYgKCFzdHJpbmdwKGRhdGFbU0VOREVSXSkgfHwgIXNpemVvZihkYXRhW1NFTkRFUl0pKQorCWRhdGFbU0VOREVSXT0iPFVua25vd24+IjsKKyAgICBpZiAoIXN0cmluZ3AoZGF0YVtEQVRBXSkgfHwgIXNpemVvZihkYXRhW0RBVEFdKSkKKwlkYXRhW0RBVEFdPSI8TmljaHRzPiI7CisgICAKKyAgICBkYXRhW1NFTkRFUl09CisgICAgICBpbXBsb2RlKGZpbHRlcihleHBsb2RlKGRhdGFbU0VOREVSXSwgIiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIyc+PSwvKicqLyAiICIpLCAiIik7CisgICAgZGF0YVtEQVRBXT0KKyAgICAgIGltcGxvZGUoZmlsdGVyKGV4cGxvZGUoZGF0YVtEQVRBXSwgIiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIyc+PSwvKicqLyAiICIpLCAiIik7CisgICAgbWVzc2FnZV9wcmVmaXg9Y2FwaXRhbGl6ZShkYXRhW1NFTkRFUl0pKyJAIitkYXRhW05BTUVdKworICAgICAgICAgICAgICAgICAgICIgdGVpbHQgRGlyIG1pdDogIjsKKyAgICBtZXNzYWdlX3N0cmluZz1icmVha19zdHJpbmcoZGF0YVtEQVRBXSw3OCxtZXNzYWdlX3ByZWZpeCwwKTsKKworICAgIC8qIERpZSBBbnphaGwgZGVyIExlZXJ6ZWlsZW4gYW0gRW5kZSBlaW5lcyB0bSdzIHNjaGVpbnQgbmljaHQgZ2Vub3JtdCAqLworICAgIHdoaWxlKG1lc3NhZ2Vfc3RyaW5nWzwxXT09J1xuJyltZXNzYWdlX3N0cmluZz1tZXNzYWdlX3N0cmluZ1swLi48Ml07CisgICAgbWVzc2FnZV9zdHJpbmcgKz0gIlxuIjsKKworICAgIHJlID0gb2ItPk1lc3NhZ2UoIlxuIittZXNzYWdlX3N0cmluZywgTVNHRkxBR19SVEVMTCk7CisKKyAgICBpZiAoIW9iLT5RdWVyeVByb3AoUF9JTlZJUykpeworICAgICAgLyogRXJzdCB0ZXN0ZW4sIG9iIGRpZSBNZWxkdW5nIHVlYmVyaGF1cHQgYW5nZWtvbW1lbiBpc3QhICovCisgICAgICBpZihyZT09TUVTU0FHRV9ERUFGKQorICAgICAgICBtZXNzYWdlX3N0cmluZz1zcHJpbnRmKCIlc0AiTVVETkFNRSIgaXN0IG1vbWVudGFuIGxlaWRlciB0YXViLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBpdGFsaXplKGdldHVpZChvYikpKTsKKyAgICAgIGVsc2UgaWYocmU9PU1FU1NBR0VfSUdOT1JFX1lPVSkKKyAgICAgICAgbWVzc2FnZV9zdHJpbmc9c3ByaW50ZigiJXNAIk1VRE5BTUUiIGlnbm9yaWVydCBEaWNoLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBpdGFsaXplKGdldHVpZChvYikpKTsKKyAgICAgIGVsc2UgaWYocmU9PU1FU1NBR0VfSUdOT1JFX01VRCkKKyAgICAgICAgbWVzc2FnZV9zdHJpbmc9c3ByaW50ZigiJXNAIk1VRE5BTUUiIGlnbm9yaWVydCBkYXMgTXVkICclcycuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUoZ2V0dWlkKG9iKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVtOQU1FXSk7CisgICAgICBlbHNlIHsKKyAgICAgICAgLyogRXJzdCBkYW5uIGRpZSBFcmZvbGdzLVJ1ZWNrbWVsZHVuZyBhYnNjaGlja2VuICovCisgICAgICAgIG1lc3NhZ2VfcHJlZml4PSJEdSB0ZWlsc3QgIitjYXBpdGFsaXplKGRhdGFbUkVDSVBJRU5UXSkgKyAiQCIgCisgICAgICAgICAgICAgICAgICAgICAgIExPQ0FMX05BTUUgKyAiIG1pdDogIjsKKyAgICAgICAgbWVzc2FnZV9zdHJpbmc9YnJlYWtfc3RyaW5nKGRhdGFbREFUQV0sNzgsbWVzc2FnZV9wcmVmaXgsMCk7CisgICAgICAgIGlmKG9iLT5RdWVyeVByb3AoUF9BV0FZKSkKKyAgICAgICAgICBtZXNzYWdlX3N0cmluZz1zcHJpbnRmKCIlcyVzQCJNVUROQU1FIiBpc3QgZ2VyYWRlIG5pY2h0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYTogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlX3N0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iLT5uYW1lKFdFUiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYi0+UXVlcnlQcm9wKFBfQVdBWSkpOworICAgICAgICBlbHNlIGlmICgoaT1xdWVyeV9pZGxlKG9iKSk+PTYwMCl7IC8vIDEwIE1pbnMKKyAgICAgICAgICBpZiAoaTwzNjAwKSBhd2F5PXRpbWUyc3RyaW5nKCIlbSAlTSIsaSk7CisgICAgICAgICAgZWxzZSBhd2F5PXRpbWUyc3RyaW5nKCIlaCAlSCB1bmQgJW0gJU0iLGkpOworICAgICAgICAgIG1lc3NhZ2Vfc3RyaW5nPQorICAgICAgICAgICAgIHNwcmludGYoIiVzJXNAIk1VRE5BTUUiIGlzdCBzZWl0ICVzIHZvZWxsaWcgdW50YWV0aWcuXG4iLAorICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZV9zdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICBvYi0+TmFtZShXRVIpLAorICAgICAgICAgICAgICAgICAgICAgYXdheSk7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoKHJlKSB7CisgICAgICAgIGNhc2UgTUVTU0FHRV9DQUNIRToKKyAgICAgICAgICBtZXNzYWdlX3N0cmluZyArPQorICAgICAgICAgICAgc3ByaW50ZigiJXNAIk1VRE5BTUUiIG1vZWNodGUgZ2VyYWRlIG5pY2h0IGdlc3RvZXJ0IHdlcmRlbi5cbiIrCisgICAgICAgICAgICAgICAgICAgICJEaWUgTWl0dGVsdW5nIHd1cmRlIHZvbiBlaW5lbSBrbGVpbmVuIEtvYm9sZCBpbiBFbXBmYW5nIisKKyAgICAgICAgICAgICAgICAgICAgImdlbm9tbWVuLlxuRXIgd2lyZCBzaWUgc3BhZXRlciB3ZWl0ZXJsZWl0ZW4uXG4iLAorICAgICAgICAgICAgICAgICAgICBjYXBpdGFsaXplKGdldHVpZChvYikpKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNRVNTQUdFX0NBQ0hFX0ZVTEw6CisgICAgICAgICAgbWVzc2FnZV9zdHJpbmcgKz0KKyAgICAgICAgICAgIHNwcmludGYoIiVzQCJNVUROQU1FIiBtb2VjaHRlIGdlcmFkZSBuaWNodCBnZXN0b2VydCB3ZXJkZW4uXG4iKworICAgICAgICAgICAgICAgICAgICAiRGllIE1pdHRlaWx1bmcgZ2luZyB2ZXJsb3JlbiwgZGVubiBkZXIgS29ib2xkIGthbm4gc2ljaCAiKworICAgICAgICAgICAgICAgICAgICAibmljaHRzIG1laHIgbWVya2VuLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShnZXR1aWQob2IpKSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgZWxzZSBtZXNzYWdlX3N0cmluZz0iXG5Sb290QCJNVUROQU1FIjogU3BpZWxlciAiKworICAgICAgICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShkYXRhW1JFQ0lQSUVOVF0pKworICAgICAgICAgICAgICAgICAgICAgICAgIiBmaW5kZSBpY2ggaW4gIk1VRE5BTUUiIG5pY2h0IVxuIjsKKyAgICBJTkVURC0+X3NlbmRfdWRwKGRhdGFbTkFNRV0sCisgICAgICAgICAgICAgICAgICAgIChbIFJFUVVFU1Q6IFJFUExZLAorICAgICAgICAgICAgICAgICAgICAgICBSRUNJUElFTlQ6IGRhdGFbU0VOREVSXSwKKyAgICAgICAgICAgICAgICAgICAgICAgSUQ6IGRhdGFbSURdLAorICAgICAgICAgICAgICAgICAgICAgICBEQVRBOiAiXG4iK21lc3NhZ2Vfc3RyaW5nIF0pICk7CisgIH0KKyAgZWxzZQorICAgIElORVRELT5fc2VuZF91ZHAoZGF0YVtOQU1FXSwKKyAgICAgICAgICAgICAgICAgICAgKFsgUkVRVUVTVDogUkVQTFksCisgICAgICAgICAgICAgICAgICAgICAgIFJFQ0lQSUVOVDogZGF0YVtTRU5ERVJdLAorICAgICAgICAgICAgICAgICAgICAgICBJRDogZGF0YVtJRF0sCisgICAgICAgICAgICAgICAgICAgICAgIERBVEE6IHNwcmludGYoIlJvb3RAIk1VRE5BTUUiOiBTcGllbGVyICVzIGZpbmRlICIrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImljaCBpbiAiTVVETkFNRSIgbmljaHQhXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUoZGF0YVtSRUNJUElFTlRdKSkKKyAgICAgICAgICAgICAgICAgICAgXSkgKTsKK30KZGlmZiAtLWdpdCBhL3NlY3VyZS91ZHAvd2hvLmMgYi9zZWN1cmUvdWRwL3doby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiZTliYjMKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvdWRwL3doby5jCkBAIC0wLDAgKzEsNTggQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyB3aG8uYworLy8KKy8vICRJZDogd2hvLmMgODc1NSAyMDE0LTA0LTI2IDEzOjEzOjQwWiBaZXNzdHJhICQKKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPHVkcC5oPgorCitpbnQgbGFzdDsKK2ludCBtYXh0b2RheSwgbWF4ZXZlcjsKKwordm9pZCBjcmVhdGUoKQoreworICBzdHJpbmcgdG1wMSwgdG1wMiwgZHVtbXk7CisKKyAgaWYgKHRpbWUoKS1sYXN0PDE4MDApIHJldHVybjsKKyAgbGFzdD10aW1lKCk7CisgIHRtcDE9cmVhZF9maWxlKCIvZXRjL21heHVzZXJzLmV2ZXIiLDAsMSk7CisgIHRtcDI9cmVhZF9maWxlKCIvZXRjL21heHVzZXJzIiwwLDEpOworICBpZiAoc3RyaW5ncCh0bXAxKSYmc2l6ZW9mKHRtcDEpKSBzc2NhbmYodG1wMSwiJWQgJXMiLG1heGV2ZXIsZHVtbXkpOworICBpZiAoc3RyaW5ncCh0bXAyKSYmc2l6ZW9mKHRtcDIpKSBzc2NhbmYodG1wMiwiJWQgJXMiLG1heHRvZGF5LGR1bW15KTsKK30KKworc3RyaW5nIGFkanVzdChzdHJpbmcgc3RyLGludCB3aWQpIHsKKyAgcmV0dXJuIHNwcmludGYoIiUqfHMiLHdpZCxzdHIpOworfQorCit2b2lkIHVkcF93aG8obWFwcGluZyBkYXRhKQoreworICBpbnQgaTsKKyAgc3RyaW5nICpsaW5lczsKKyAgc3RyaW5nIHdob2xpc3RlLGhlYWRlcjsKKworICBjcmVhdGUoKTsKKyAgbGluZXM9Ii9vYmovd2VybGlzdGUiLT5RdWVyeVdob0xpc3RlKDAsIDEpOworICB3aG9saXN0ZT1pbXBsb2RlKGxpbmVzLCJcbiIpOworICBsaW5lcz0oeworICAgICIqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKiIsCisgICAgIiIsIiIsIiIsIiIsCisgICAgIiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qIn0pOworICBoZWFkZXI9TVVETkFNRSIsIExETXVkICIrX19WRVJTSU9OX187CisgIGxpbmVzWzFdPSJ8IithZGp1c3QoaGVhZGVyLHNpemVvZihsaW5lc1swXSktMikrInwiOworICBoZWFkZXI9IkFkcmVzc2U6IE1HLk11ZC5ERSAoODcuNzkuMjQuNjApIDIzIChhbHRlcm5hdGl2IDQ3MTEpIjsKKyAgbGluZXNbMl09InwiK2FkanVzdChoZWFkZXIsc2l6ZW9mKGxpbmVzWzBdKS0yKSsifCI7CisgIGhlYWRlcj0iVXB0aW1lOiAiK3VwdGltZSgpOworICBsaW5lc1szXT0ifCIrYWRqdXN0KGhlYWRlcixzaXplb2YobGluZXNbMF0pLTIpKyJ8IjsKKyAgaGVhZGVyPV9NVURMSUJfTkFNRV8iLU11ZGxpYiAiX01VRExJQl9WRVJTSU9OXzsKKyAgbGluZXNbNF09InwiK2FkanVzdChoZWFkZXIsc2l6ZW9mKGxpbmVzWzBdKS0yKSsifCI7CisgIGhlYWRlcj1pbXBsb2RlKGxpbmVzLCJcbiIpOworICB3aG9saXN0ZT1oZWFkZXIrIlxuIit3aG9saXN0ZStzcHJpbnRmKCJcbioqKiBBbndlc2VuZGUgaW0gIk1VRE5BTUUiOiBNYXguIGhldXRlICVkLCBSZWtvcmQgJWRcbiIsbWF4dG9kYXksbWF4ZXZlcik7CisgIElORVRELT5fc2VuZF91ZHAoZGF0YVtOQU1FXSwgKFsKKwkJCQlSRVFVRVNUOiBSRVBMWSwKKwkJCQlSRUNJUElFTlQ6IGRhdGFbU0VOREVSXSwKKwkJCQlJRDogZGF0YVtJRF0sCisJCQkJREFUQTogd2hvbGlzdGUKKwkJCQldKSApOworfQpkaWZmIC0tZ2l0IGEvc2VjdXJlL3VkcC93d3cuYyBiL3NlY3VyZS91ZHAvd3d3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FkNGZmYwotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS91ZHAvd3d3LmMKQEAgLTAsMCArMSwxMzAgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyB3d3cuYyAtLSBXV1cgR3Vlc3QgQ2xpZW50CisvLworLy8gJElkOiB3d3cuYyA4NzU1IDIwMTQtMDQtMjYgMTM6MTM6NDBaIFplc3N0cmEgJAorCisjcHJhZ21hIHN0cm9uZ190eXBlcworI3ByYWdtYSBjb21iaW5lX3N0cmluZ3MKKworI2lmZGVmIE1PUkdFTkdSQVVFTgorIyBpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHVkcC5oPgorI2luY2x1ZGUgPHd3dy5oPgorCisjdW5kZWYgREVCVUcgCisKK3ByaXZhdGUgbWl4ZWQgcGVuZGluZzsgLy8gcGVuZGluZyB1ZHAgcmVxdWVzdHMKKworLy8gSFRNTHVuZXNjYXBlIC0tIHRyeSB0byByZXNvbHZlICU8aGV4PiBlc2NhcGUgY29kZXMgZnJvbSBIVE1ML1dXVworcHJpdmF0ZSBzdHJpbmcgSFRNTHVuZXNjYXBlKHN0cmluZyBjaGFyKQoreworICBpbnQgbGVuOworICBpZighY2hhciB8fCAhKGxlbiA9IHNpemVvZihjaGFyKSkpIHJldHVybiAiIjsKKyAgaWYoY2hhclswXSA9PSAnJScgJiYgbGVuID0gMykgeworICAgIGludCB2YWwsIGNoOworICAgIHdoaWxlKC0tbGVuKSB7CisgICAgICBzd2l0Y2goY2hhcltsZW5dKSB7CisgICAgICBjYXNlICcwJy4uJzknOgorICAgICAgICB2YWwgPSAoaW50KWNoYXJbbGVuLi5sZW5dOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ0EnLi4nRic6CisgICAgICAgIHZhbCA9IGNoYXJbbGVuXS01NTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpZihsZW4gPCAyKSB2YWwgPDw9IDQ7CisgICAgICBjaCArPSB2YWw7CisgICAgfQorICAgIHJldHVybiBzcHJpbnRmKCIlYyIsIGNoKTsKKyAgfQorICByZXR1cm4gY2hhcjsKK30KKworcHJpdmF0ZSBzdHJpbmcgdHJhbnNsYXRlKHN0cmluZyBzdHIpCit7CisgIHJldHVybiBpbXBsb2RlKG1hcChyZWdleHBsb2RlKHN0ciwgIlslXS4uIiksICMnSFRNTHVuZXNjYXBlLyonKi8pLCAiIik7Cit9CisKKy8vIGRlY29kZSgpIC0tIGRlY29kZSB0aGUgaW5wdXQgY21kcyBzdHJpbmcKK3ByaXZhdGUgbWFwcGluZyBkZWNvZGUoc3RyaW5nIGlucHV0KQoreworICBtaXhlZCB0bXA7IGludCBpOworICBtYXBwaW5nIGNtZHM7CisgIGNtZHMgPSAoW10pOworICBpID0gc2l6ZW9mKHRtcCA9IG9sZF9leHBsb2RlKHRyYW5zbGF0ZShpbnB1dCksICImIikpOworICB3aGlsZShpLS0pCisgIHsKKyAgICBpZihzaXplb2YodG1wW2ldID0gb2xkX2V4cGxvZGUodG1wW2ldLCAiPSIpKSA9PSAyKQorICAgICAgY21kc1t0bXBbaV1bMF1dID0gdG1wW2ldWzFdOworICB9CisgIHJldHVybiBjbWRzOworfQorCisvLyBwdXQoKSAtLSBwdXQgdG9nZXRoZXIgYSBrZXkgYW5kIGEgdmFsdWUKK3ByaXZhdGUgc3RyaW5nIHB1dChzdHJpbmcga2V5LCBtYXBwaW5nIHZhbCkKK3sKKyAgcmV0dXJuIGtleSsiPSIrdmFsW2tleV07Cit9CisvLyBlbmNvZGUoKSAtLSBlbmNvZGUgdGhlIGlucHV0IGNtZHMgc3RyaW5nCitwcml2YXRlIHN0cmluZyBlbmNvZGUobWFwcGluZyBpbnB1dCkKK3sgcmV0dXJuIGltcGxvZGUobWFwKG1faW5kaWNlcyhpbnB1dCksICMncHV0LyonKi8sIGlucHV0KSwgIiYiKTsgfQorCit2b2lkIFNlbmQobWFwcGluZyBkYXRhLCBzdHJpbmcgdGV4dCwgbWl4ZWQgYmFjaykKK3sKKyAgaWYoc3Ryc3RyKChzdHJpbmcpcHJldmlvdXNfb2JqZWN0KCksIFVEUFBBVEgrIi8iKSkgcmV0dXJuOworICBpZighZGF0YSAmJiAhcGVuZGluZykgcmV0dXJuOworICBlbHNlIGlmKCFkYXRhICYmIHBlbmRpbmcpCisgIHsKKyAgICBkYXRhID0gcGVuZGluZ1swXTsgYmFjayA9IHBlbmRpbmdbMV07IHBlbmRpbmcgPSAwOworICB9CisgIElORVRELT5fc2VuZF91ZHAoZGF0YVtOQU1FXSwgKFsKKyAgICAgIFJFUVVFU1Q6IFJFUExZLAorICAgICAgUkVDSVBJRU5UOiBkYXRhW1NFTkRFUl0sCisgICAgICBJRDogZGF0YVtJRF0sCisgICAgICAiVVJMIjpkYXRhW0RBVEFdLAorICAgICAgREFUQTogIlxuXG4iK3RleHQrIlxuIgorICAgICAgXSkpOworfQorCitwcml2YXRlIHN0cmluZyBleGNoKHN0cmluZyBzdHIsIG1hcHBpbmcgdG8pCit7CisgIGlmKCF0b1tzdHJdKSByZXR1cm4gc3RyOworICByZXR1cm4gdG9bc3RyXTsKK30KKworcHJpdmF0ZSBzdHJpbmcgeGNvZGUoc3RyaW5nIHN0ciwgbWFwcGluZyB0bykKK3sKKyAgcmV0dXJuIGltcGxvZGUobWFwKHJlZ2V4cGxvZGUoc3RyLCBpbXBsb2RlKG1faW5kaWNlcyh0byksICJ8IikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIydleGNoLyonKi8sIHRvKSwgIiIpOworfQorCit2b2lkIHVkcF93d3cobWFwcGluZyBkYXRhKQoreworICBzdHJpbmcgdGV4dCwgZXJyb3I7CisgIHN0cmluZyBiYWNrOyBpbnQgc2l6ZTsKKyAgbWFwcGluZyBjbWRzOworICBlcnJvciA9IGNhdGNoKHNpemUgPSBzaXplb2YoY21kcyA9IGRlY29kZShkYXRhW0RBVEFdKSkpOworICBpZihjbWRzW0JBQ0tdKSBiYWNrID0geGNvZGUoY21kc1tCQUNLXSwgKFsiWGFtcFgiOiImIiwgIlhlcVgiOiI9Il0pKTsKKyAgY21kc1tCQUNLXSA9IHhjb2RlKGVuY29kZShjbWRzLShbQkFDS10pKSwgKFsiJiI6IlhhbXBYIiwgIj0iOiJYZXFYIl0pKTsKKyAgaWYoZXJyb3IgfHwKKyAgICAgZXJyb3I9Y2F0Y2godGV4dD0oIi8iK29iamVjdF9uYW1lKHRoaXNfb2JqZWN0KCkpKyIuIitjbWRzW1JFUV0pLT5SZXF1ZXN0KGNtZHMpKSkKKyAgeworI2lmZGVmIERFQlVHCisgICAgdGV4dCA9ICI8SDE+RmVobGVyOiAiK2Vycm9yKyI8L0gxPjxIUj48SDM+S29udGV4dDo8L0gzPiIKKyAgICsgIjxQUkU+IitzcHJpbnRmKCIlTyIsIGRhdGEpKyI8L1BSRT4iOworI2Vsc2UKKyAgICB0ZXh0ID0gIjxIMT5GZWhsZXI6IEFuZnJhZ2Uga29ubnRlIG5pY2h0IGJlYXJiZWl0ZXQgd2VyZGVuITwvSDE+IjsKKyNlbmRpZgorICAgIGxvZ19maWxlKFdXV0xPRywgIkVSUk9SOiAiK2Vycm9yWzAuLjwyXSsiLCBEQVRBIEZPTExPV1M6XG4iKTsKKyAgfQorICBsb2dfZmlsZShXV1dMT0csIHNwcmludGYoIlslc10gJXNcbiIsIGN0aW1lKHRpbWUoKSlbNC4uMTVdLCBkYXRhW0RBVEFdKSk7CisgIGlmKGNtZHNbUkVRXSA9PSBSX0lOVEVSTVVEICYmICF0ZXh0KQorICB7CisgICAgcGVuZGluZyA9ICh7ZGF0YSwgYmFja30pOworICAgIHJldHVybiAwOworICB9CisgIHBlbmRpbmcgPSAwOworICBmdW5jYWxsKCMnU2VuZCwgZGF0YSwgdGV4dCwgYmFjayk7Cit9CmRpZmYgLS1naXQgYS9zZWN1cmUvdWRwL3d3dy5maW5nZXIuYyBiL3NlY3VyZS91ZHAvd3d3LmZpbmdlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiYmNjYWYKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvdWRwL3d3dy5maW5nZXIuYwpAQCAtMCwwICsxLDcyIEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gd3d3LmZpbmdlci5jCisvLworLy8gJElkOiB3d3cuZmluZ2VyLmMgODc1NSAyMDE0LTA0LTI2IDEzOjEzOjQwWiBaZXNzdHJhICQKKworI3ByYWdtYSBzdHJvbmdfdHlwZXMKKyNwcmFnbWEgY29tYmluZV9zdHJpbmdzCisKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8d3d3Lmg+CisjaW5jbHVkZSA8cmVnZXhwLmg+CisKK3N0cmluZyBSZXF1ZXN0KG1hcHBpbmcgY21kcykKK3sKKyAgaWYoIXNpemVvZihjbWRzKSB8fCAhc3RyaW5ncChjbWRzW1VTRVJdKSkKKyAgICByZXR1cm4gRVJST1IoIktlaW4gTnV0emVyIGFuZ2VnZWJlbiEiKTsKKyAgLyoKKyAgICogS2FubiBqYSBzZWluLCBkYXNzIGVpbiBTcGllbGVyIGF1ZiBkaWUgSWRlZSBrb21tdCwgSFRNTC1UYWdzCisgICAqIGluIHNlaW5lIEJlc2NocmVpYnVuZyBlaW56dWJhdWVuLiBVbnNlcmUgU2VpdGUgaXN0IGFiZXIgc2Nob24KKyAgICogaW50ZXJha3RpdiBnZW51Zy4gKEFubTogTnVyIDwuKj4tVm9ya29tbW5pc3NlIHp1IGVyc2V0emVuIG51dHp0CisgICAqIG5peCwgZGEgbWFuIGF1Y2ggbWl0IGVpbnplbG5lbiBaZWljaGVuIFNjaGFkZW4gbWFjaGVuIGthbm4uCisgICAqLworICBzdHJpbmcgcmVzdWx0ID0gcmVncmVwbGFjZShGSU5HRVIoIi1hICIrY21kc1tVU0VSXSksICI8IiwiXFwmbHQ7IiwxKTsgCisgIHJlc3VsdCA9IHJlZ3JlcGxhY2UocmVzdWx0LCAiPiIsIlxcJmd0OyIsMSk7CisgIHN0cmluZyAqcmVzbGluZXMgPSBleHBsb2RlKHJlc3VsdCwiXG4iKTsKKyAgLyoKKyAgICogR3J1bmQgZGVzIGtvbW1lbmRlbiBDb2RlYmxvY2tzIGlzdCAsIGRhc3MgbWFuY2hlIFNwaWVsZXIgaWhyZQorICAgKiBIb21lcGFnZSBtaXQgImh0dHA6Ly9tZy5tdWQuZGUiIGFuZ2ViZW4sIGFuZGVyZSBudXIibWcubXVkLmRlIiAKKyAgICogc2NocmVpYmVuLiBEYW1pdCBhYmVyIGRlciBCcm93c2VyIGRlbiBMaW5rIGFscyBhYnNvbHV0IGludGVycHJldGllcnQsIAorICAgKiBtdXNzIGRhcyBodHRwOi8vIGRhdm9yIHN0ZWhlbiwgdW5kIHp3YXIgbnVyIGVpbm1hbC4gCisgICAqLworICBzdHJpbmcgKnRtcCA9IHJlZ2V4cChyZXNsaW5lcywiXkhvbWVwYWdlOiIpOworICBpZiAoc2l6ZW9mKHRtcCkmJnN0cmluZ3AodG1wWzBdKSYmc2l6ZW9mKHRtcFswXSk+MTYpIHsKKwkgIHN0cmluZyB0bXAyOworICAgIHN0cmluZyBxdW90ZWQgPSByZWdyZXBsYWNlKHRtcFswXSwiKFtbXFxdKyo/LlxcXFxdKSIsIlxcXFxcXDEiLCAxKTsKKyAgICBpZiAodG1wWzBdWzEwLi4xNl09PSJodHRwOi8vIikKKyAgICAgIHRtcDI9c3ByaW50ZigiSG9tZXBhZ2U6IDxBIEhSRUY9XCIlc1wiPiVzPC9BPiIsCisJCSAgICAgIHRtcFswXVsxMC4uXSx0bXBbMF1bMTAuLl0pOworICAgIGVsc2UKKyAgICAgIHRtcDI9c3ByaW50ZigiSG9tZXBhZ2U6IDxBIEhSRUY9XCJodHRwOi8vJXNcIj4lczwvQT4iLAorCQkgICAgICB0bXBbMF1bMTAuLl0sdG1wWzBdWzEwLi5dKTsKKyAgICByZXN1bHQgPSByZWdyZXBsYWNlKHJlc3VsdCxxdW90ZWQsdG1wMiwxKTsKKyAgfQorICB0bXAgPSByZWdleHAocmVzbGluZXMsIl5BdmF0YXItVVJJOiIpOworICBpZiAoc2l6ZW9mKHRtcCkpIHsKKyAgICAgcmVzdWx0ID0gcmVncmVwbGFjZShyZXN1bHQsCisgICAgICAgICAgICAgIkF2YXRhci1VUkk6IChbXlxuXSopIiwKKyAgICAgICAgICAgICAiQXZhdGFyLVVSSTogPGEgaHJlZj1cXDE+XFwxPC9hPiIsMSk7IAorICAgIGlmIChzaXplb2YocmVnZXhwKCh7dG1wWzBdfSksImh0dHBbc117MCwxfTovLyIsUkVfUENSRSkpKSB7CisgICAgICBzdHJpbmcgdXJpID0gcmVncmVwbGFjZSh0bXBbMF0sICJBdmF0YXItVVJJOiAoW15cbl0qKSIsICJcXDEiLDEpOworICAgICAgcmVzdWx0ID0gIjxpbWcgc3JjPVwiIit1cmkrIlwiIGhlaWdodD0xNTAgYWx0PVwiIiArIGNhcGl0YWxpemUoY21kc1tVU0VSXSkKKyAgICAgICAgICAgICAgICsgIlwiIC8+PGJyPiIKKyAgICAgICAgICAgICAgICsgcmVzdWx0OworICAgIH0KKyAgfQorCisgIHJlc3VsdCA9IHJlZ3JlcGxhY2UocmVzdWx0LAorCQkgICAgICAiRS1NYWlsLUFkcmVzc2U6IChbXlxuXSopIiwKKwkJICAgICAgIkUtTWFpbC1BZHJlc3NlOiBCaXR0ZSBuYWNoZnJhZ2VuLi4uIiwxKTsKKworICByZXN1bHQgPSByZWdyZXBsYWNlKHJlc3VsdCwKKwkJICAgICAgIk1lc3NlbmdlcjogKFteXG5dKikiLAorCQkgICAgICAiTWVzc2VuZ2VyOiBCaXR0ZSBuYWNoZnJhZ2VuLi4uIiwgMSk7CisKKyAgcmVzdWx0ID0gcmVncmVwbGFjZShyZXN1bHQsCisJCSAgICAgICJJQ1E6IChbXlxuXSopIiwKKwkJICAgICAgIklDUTogQml0dGUgbmFjaGZyYWdlbi4uLiIsIDEpOworCisgIHJldHVybiAiPEgyPldlciBpc3QgIitjYXBpdGFsaXplKGNtZHNbVVNFUl0pKyI/PC9IMj48SFI+IgorICAgICsiPFBSRT4iK3Jlc3VsdCsiPC9QUkU+IjsKK30KZGlmZiAtLWdpdCBhL3NlY3VyZS91ZHAvd3d3Lm5ld3MuYyBiL3NlY3VyZS91ZHAvd3d3Lm5ld3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTA2OGRiCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3VkcC93d3cubmV3cy5jCkBAIC0wLDAgKzEsMjE0IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gd3d3Lm5ld3MuYyAtLSBXV1cgZnJvbnRlbmQgZm9yIHJlYWRpbmcgbXVkIG5ld3MKKy8vCisvLyAkSWQ6IHd3dy5uZXdzLmMgODc1NSAyMDE0LTA0LTI2IDEzOjEzOjQwWiBaZXNzdHJhICQKKworI3ByYWdtYSBzdHJvbmdfdHlwZXMKKyNwcmFnbWEgY29tYmluZV9zdHJpbmdzCisKKyNpbmNsdWRlIDx3d3cuaD4KKworI2RlZmluZSBEQkcoeCkgIHRlbGxfb2JqZWN0KGZpbmRfcGxheWVyKCJoYXRlIiksIHNwcmludGYoIkRCRzogJU9cbiIsIHgpKQorCisjZGVmaW5lIE5FV1NEICIvc2VjdXJlL25ld3MiCisKKyNkZWZpbmUgTl9HUk9VUCAwCisjZGVmaW5lIE5fQVVUSE9SIDEKKyNkZWZpbmUgTl9USUQgMgorI2RlZmluZSBOX0RBVEUgMworI2RlZmluZSBOX1RJVExFIDQKKyNkZWZpbmUgTl9BUlRJQ0xFIDUKKwordmFyYXJncyBwcml2YXRlIHN0cmluZyB1cmwoc3RyaW5nIGdyb3VwLCBzdHJpbmcgYXJ0aWNsZSkKK3sKKyAgcmV0dXJuICJcIiIrTVVEV1dXKyI/IitSRVErIj0iK1JfTkVXUworICAgICsoZ3JvdXA/IiYiK0dST1VQKyI9Iitncm91cDoiIikKKyAgICArKGFydGljbGU/IiYiK0FSVElDTEUrIj0iK2FydGljbGU6IiIpKyJcIiI7Cit9CisKK3ZhcmFyZ3MgcHJpdmF0ZSBzdHJpbmcgbWFrZV9saW5rKHN0cmluZyB0ZXh0LCBzdHJpbmcgZ3JvdXAsIHN0cmluZyBhcnRpY2xlKQoreworICBpZighdGV4dCB8fCAhc2l6ZW9mKHRleHQpKSB0ZXh0ID0gIi1VbmJlbmFubnQtIjsKKyAgcmV0dXJuICI8QSBIUkVGPSIrdXJsKGdyb3VwLCBhcnRpY2xlKSsiPiIrdGV4dCsiPC9BPiI7Cit9CisKK3N0cmluZyBHcm91cExpc3QoKQoreworICBzdHJpbmcgKmxpc3QsIHJldDsKKyAgaW50IGksIHQ7CisKKyAgbGlzdCA9IE5FV1NELT5HZXRHcm91cHMoKTsKKyAgZm9yIChpID0gMCwgcmV0ID0gIiI7IGkgPCBzaXplb2YobGlzdCk7IGkrKykKKyAgICByZXQgKz0gc3ByaW50ZigiWyUzZCBBcnRpa2VsLCAlLTZzXSAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICBzaXplb2YoTkVXU0QtPkdldE5vdGVzKGxpc3RbaV0pKSwKKyAgICAgICAgICAgICAgICAgICBkdGltZSh0ID0gTkVXU0QtPkdldE5ld3NUaW1lKGxpc3RbaV0pKVs1Li4xMV0sCisgICAgICAgICAgICAgICAgICAgbWFrZV9saW5rKGxpc3RbaV0sbGlzdFtpXSsiOiIrdCkpOworICByZXR1cm4gIjxIMj4mVXVtbDtiZXJzaWNodDwvSDI+IgorICAgICAgICArIjxIMz5bIitzaXplb2YobGlzdCkrIiBHcnVwcGVuLCAiCisgICAgICAgICsibGV0enRlICZBdW1sO25kZXJ1bmcgIitkdGltZShORVdTRC0+R2V0TmV3c1RpbWUoKSkrIl08L0gzPiIKKyAgICAgICAgKyI8UFJFPiIgKyByZXQgKyI8L1BSRT4iOworfQorCisjZGVmaW5lIFRIUkVBRChhKSAoIn4jISBybj0iKyhhW05fQVVUSE9SXSkrIiBydD0iKyhhW05fREFURV0pKyBcCisgICAgICAgICAgICAgICAgICAgIiByZz0iKyhhW05fR1JPVVBdKSkKKyNkZWZpbmUgVEVYUFIgInJuPVteXG4gXSp8cnQ9W15cbiBdKnxyZz1bXlxuIF0qIgorCitwcml2YXRlIG1peGVkIHRpbmZvKG1peGVkIGFydGljbGUpCit7CisgIG1peGVkIHRtcCwgaW5mbzsKKyAgc3RyaW5nIHJuLCBydCwgcmcsIHRpZDsKKyAgaW50IGosIGs7CisKKyAgdG1wID0gcmVnZXhwKG9sZF9leHBsb2RlKGFydGljbGVbTl9BUlRJQ0xFXSwgIlxuIiksICJefiMhIik7CisgIGZvcihqID0gc2l6ZW9mKHRtcCk7IGotLTspIHsKKyAgICBtaXhlZCBsaW5lOworICAgIGxpbmUgPSBvbGRfZXhwbG9kZSh0bXBbal0sICIgIik7CisgICAgZm9yKGsgPSBzaXplb2YobGluZSk7IGstLTspIHsKKyAgICAgIGlmKGxpbmVba11bMC4uMV09PSJybiIpIHJuID0gbGluZVtrXVszLi5dOworICAgICAgaWYobGluZVtrXVswLi4xXT09InJ0IikgcnQgPSBsaW5lW2tdWzMuLl07CisgICAgICBpZihsaW5lW2tdWzAuLjFdPT0icmciKSByZyA9IGxpbmVba11bMy4uXTsKKyAgICAgIGlmKGxpbmVba11bMC4uMl09PSJ0aWQiKSB0aWQgPSBsaW5lW2tdWzQuLl07CisgICAgfQorICB9CisgIGlmKCF0aWQpIHRpZCA9ICIiK2FydGljbGVbTl9EQVRFXTsKKyAgcmV0dXJuICh7IHJuLCBydCwgcmcsIHRpZCB9KTsKK30KKworI2RlZmluZSBSTiAgMAorI2RlZmluZSBSVCAgMQorI2RlZmluZSBSRyAgMgorI2RlZmluZSBUSUQgMworCitwcml2YXRlIGludCB0aHJlYWQobWl4ZWQgYXJ0aWNsZSwgaW50IGksIG1hcHBpbmcgdCkKK3sKKyAgbWl4ZWQgaW5mbzsKKyAgaW5mbyA9IHRpbmZvKGFydGljbGUpOworCisgIGlmKGluZm9bVElEXSkgeworICAgIHRbaW5mb1tUSURdXSsrOworICAgIHRbaW5mb1tUSURdLCAxXSA9IHNwcmludGYoIiUzLjNkIFslLTEycyAlLTZzXSUtM3MgJXNcbiIsCisgICAgICAgICAgICBpKzEsCisgICAgICAgICAgICBhcnRpY2xlW05fQVVUSE9SXSsiOiIsCisgICAgICAgICAgICBkdGltZShhcnRpY2xlW05fREFURV0pWzUuLjExXSwKKyAgICAgICAgICAgICh0W2luZm9bVElEXV0gLSAxKSA/ICIrIisodFtpbmZvW1RJRF1dLTEpIDogIiAtICIsCisgICAgICAgICAgICBtYWtlX2xpbmsoYXJ0aWNsZVtOX1RJVExFXSwKKyAgICAgICAgICBhcnRpY2xlW05fR1JPVVBdLCB0b19zdHJpbmcoaSkpKQorICAgICAgKyAodFtpbmZvW1RJRF0sIDFdID8gdFtpbmZvW1RJRF0sIDFdIDogIiIpOworICAgIHRbaW5mb1tUSURdLCAyXSA9IGluZm87CisgICAgaWYoYXJ0aWNsZVtOX0RBVEVdID4gdG9faW50KHRbaW5mb1tUSURdLCAzXSkpCisgICAgICB0W2luZm9bVElEXSwgM10gPSAiIithcnRpY2xlW05fREFURV07CisgICAgcmV0dXJuIDE7CisgIH0KK30KKworcHJpdmF0ZSBpbnQgZXhwaXJlZChtaXhlZCAqbGlzdCwgaW50IGkpCit7CisgIG1peGVkIGluZm87CisgIGluZm8gPSB0aW5mbyhsaXN0W2ldKTsKKyAgZm9yKGktLTsgaSA+PSAwOyBpLS0pCisgICAgaWYobGlzdFtpXVtOX0FVVEhPUl0gPT0gaW5mb1tSTl0gJiYKKyAgICAgICBsaXN0W2ldW05fREFURV0gPT0gdG9faW50KGluZm9bUlRdKSkKKyAgICAgIHJldHVybiAwOworICByZXR1cm4gMTsKK30KKworc3RyaW5nIEFydGljbGVMaXN0KHN0cmluZyBncm91cCkKK3sKKyAgc3RyaW5nICpsaXN0LCByZXQ7CisgIG1hcHBpbmcgdDsKKyAgaW50IGk7CisKKyAgbGlzdCA9IE5FV1NELT5HZXROb3Rlcyhncm91cCA9IG9sZF9leHBsb2RlKGdyb3VwLCAiOiIpWzBdKTsKKyAgaWYgKCFwb2ludGVycChsaXN0KSkgeworICByZXR1cm4gIjxIMj5HcnVwcGU6ICIrZ3JvdXArIjwvSDI+IgorICAgICI8SDM+ZXhpc3RpZXJ0IG5pY2h0LjwvSDM+IgorICAgICJbIittYWtlX2xpbmsoIkdydXBwZW4mdXVtbDtiZXJzaWNodCIpKyJdIjsKKyAgfQorICB0ID0gbV9hbGxvY2F0ZSgwLDQpOworICBmb3IgKGkgPSBzaXplb2YobGlzdCktMSwgcmV0ID0gIiI7IGkgPj0gMDsgaS0tKQorICAgIGlmKCF0aHJlYWQobGlzdFtpXSwgaSwgdCkgfHwgZXhwaXJlZChsaXN0LCBpKSkKKyAgICB7CisgICAgICBpbnQgdHRtcDsKKyAgICAgIHN0cmluZyB0aWQ7CisgICAgICBtaXhlZCB0dDsgdHQgPSB0aW5mbyhsaXN0W2ldKTsKKyAgICAgIHR0bXAgPSB0W3RpZCA9IHR0W1RJRF1dIC0gMTsKKyAgICAgIHJldCA9IHNwcmludGYoIiUzLjNkIFslLTEycyAlLTZzXSUtM3MgJXNcbiIsCisJCSAgICBpKzEsCisgICAgICAgICAgICAgICAgICAgIGxpc3RbaV1bTl9BVVRIT1JdKyI6IiwKKyAgICAgICAgICAgICAgICAgICAgZHRpbWUobGlzdFtpXVtOX0RBVEVdKVs1Li4xMV0sCisgICAgICAgICAgICAgICAgICAgIHR0bXAgPiAwID8gIisiK3R0bXAgOiAiIC0gIiwKKyAgICAgICAgICAgICAgICAgICAgbWFrZV9saW5rKChzdHJpbmcpbGlzdFtpXVtOX1RJVExFXQorICAgICAgICAgICAgKyh0dG1wID4gMCA/CisgICAgICAgICIgKCIrZHRpbWUodG9faW50KHRbdGlkLCAzXSkpWzUuLjExXQorICAgICAgICArZHRpbWUodG9faW50KHRbdGlkLCAzXSkpWzE3Li5dKyIpIiA6ICIiKSwKKyAgICAgICAgICAgIGdyb3VwLCB0b19zdHJpbmcoaSkrIjoiK3RbdGlkLCAzXSkpICsgcmV0OworICAgIH0KKworICByZXR1cm4gIjxIMj5HcnVwcGU6ICIrZ3JvdXArIjwvSDI+IgorICAgICsiPEgzPlsiK3NpemVvZihsaXN0KSsiIEFydGlrZWwsICIKKyAgICArImxldHp0ZSAmQXVtbDtuZGVydW5nICIrZHRpbWUoTkVXU0QtPkdldE5ld3NUaW1lKGdyb3VwKSkrIl08L0gzPiIKKyAgICArIjxQUkU+IiArIHJldCArICI8L1BSRT4iCisgICAgKyJbIittYWtlX2xpbmsoIkdydXBwZW4mdXVtbDtiZXJzaWNodCIpKyJdIjsKK30KKworcHJpdmF0ZSB2YXJhcmdzIHN0cmluZyBNZXNzYWdlKHN0cmluZyBncm91cCwgbWl4ZWQgYXJ0aWNsZSkKK3sKKyAgbWl4ZWQgdGV4dCwgdG1wLCB0dG1wLCBuZXh0LCBwcmV2LCBpbmZvOworICBzdHJpbmcgYXJ0OworICBtYXBwaW5nIHQ7CisgIGludCBpOworCisgIGlmICghYXJ0aWNsZSkgYXJ0aWNsZSA9IDA7CisgIGVsc2UgYXJ0aWNsZSA9IHRvX2ludChvbGRfZXhwbG9kZShhcnRpY2xlLCAiOiIpWzBdKTsKKworICB0bXAgPSBORVdTRC0+R2V0Tm90ZXMoZ3JvdXAgPSBvbGRfZXhwbG9kZShncm91cCwgIjoiKVswXSk7CisgIGlmIChwb2ludGVycCh0bXApICYmIChhcnRpY2xlID49IHNpemVvZih0bXApKSkKKyAgICAgIHJldHVybigiQXJ0aWtlbCBuaWNodCBnZWZ1bmRlbiwgc292aWVsZSBBcnRpa2VsIGhhdCBkaWVzZSBSdWJyaWsgIgorCSAgIm5pY2h0IVxuIik7CisKKyAgdGV4dCA9IHRtcFthcnRpY2xlXTsKKworICB0ID0gbV9hbGxvY2F0ZSgwLDQpOworICBmb3IoaSA9IHNpemVvZih0bXApLTE7IGkgPiBhcnRpY2xlOyBpLS0pCisgICAgdGhyZWFkKHRtcFtpXSwgaSwgdCk7CisgIG5leHQgPSAiTiZhdW1sO2Noc3RlciBBcnRpa2VsIjsKKyAgcHJldiA9ICJWb3JpZ2VyIEFydGlrZWwiOworCisgIGFydCA9IGltcGxvZGUoKHR0bXAgPSBvbGRfZXhwbG9kZSh0ZXh0W05fQVJUSUNMRV0sICJcbiIpKQorICAgICAgICAgICAgICAgIC0gcmVnZXhwKHR0bXAsICJefiMhIiksICJcbiIpOworCisgIGFydCA9IHJlZ3JlcGxhY2UoYXJ0LCAiPCIsICJcXCZsdDsiLCAxKTsKKyAgYXJ0ID0gcmVncmVwbGFjZShhcnQsICI+IiwgIlxcJmd0OyIsIDEpOworICBhcnQgPSByZWdyZXBsYWNlKGFydCwgIihbYS16QS1aXVthLXpBLVpdKjovL1teIFxuXHRdW14gXG5cdF0qKSIsICI8YSBocmVmPVwiXFwxXCI+XFwxPC9hPiIsIDEpOworCisgIGluZm8gPSB0aW5mbyh0ZXh0KTsKKworICByZXR1cm4gIjxIMT4iICsgdGV4dFtOX1RJVExFXSArICI8L0gxPjxIUj5cbiIKKyAgICAgICArICI8SDM+IiArIGdyb3VwICsgIjogIiArIHRleHRbTl9BVVRIT1JdCisgICAgICAgKyAiIChBcnRpa2VsICIgKyAoYXJ0aWNsZSArIDEpICsgIiwgIiArIGR0aW1lKHRleHRbTl9EQVRFXSkgKyAiKVxuPC9IMz4iCisgICAgICAgKyAoaW5mb1tSTl0gPyAoIjxIND5BbnR3b3J0IGF1ZiAiK2luZm9bUk5dKworICAgICAgICAgIChleHBpcmVkKHRtcCwgYXJ0aWNsZSkgPyAiICh2ZXJmYWxsZW4pIiA6ICIiKSsiPC9IND4iKQorICAgIDogIiIpCisgICAgICAgKyAiPFBSRT4iICsgYXJ0ICsgIjwvUFJFPlxuIgorICAgICAgICsgKHRbaW5mb1tUSURdXSA/CisgICAgICAgICAgIjxIUj5XZWl0ZXJlIEFydGlrZWwgenUgZGllc2VtIFRoZW1hOiIKKyAgKyAiPFBSRT4iICsgdFtpbmZvW1RJRF0sIDFdICsgIjwvUFJFPjxIUj4iIDogIiIpCisgICAgICAgKyAiIFsiKyhhcnRpY2xlIDwgc2l6ZW9mKHRtcCktMSA/IG1ha2VfbGluayhuZXh0LCBncm91cCx0b19zdHJpbmcoYXJ0aWNsZSsxKSkgOgorICAgICAgICAgICAgICBuZXh0KSsiXSIKKyAgICAgICArICIgWyIrKGFydGljbGUgPyBtYWtlX2xpbmsocHJldiwgZ3JvdXAsIHRvX3N0cmluZyhhcnRpY2xlLTEpKSA6IHByZXYpKyJdIgorICAgICAgICsgIiBbIittYWtlX2xpbmsoIkFydGlrZWwmdXVtbDtiZXJzaWNodCIsIGdyb3VwKSsiXSIKKyAgICAgICArICIgWyIrbWFrZV9saW5rKCJHcnVwcGVuJnV1bWw7YmVyc2ljaHQiKSsiXSI7Cit9CisKK3N0cmluZyBSZXF1ZXN0KG1hcHBpbmcgY21kcykKK3sKKyAgc3RyaW5nIHRleHQ7CisgIGlmKCFjbWRzW0dST1VQXSkgdGV4dCA9IEdyb3VwTGlzdCgpOworICBlbHNlCisgICAgaWYoIWNtZHNbQVJUSUNMRV0pIHRleHQgPSBBcnRpY2xlTGlzdChjbWRzW0dST1VQXSk7CisgICAgZWxzZSB0ZXh0ID0gTWVzc2FnZShjbWRzW0dST1VQXSwgY21kc1tBUlRJQ0xFXSk7CisKKyAgcmV0dXJuICI8SDI+IitNVUROQU1FKyIgWmVpdHVuZzwvSDI+PEhSPiIKKyAgICAgICAgK3RleHQ7Cit9CmRpZmYgLS1naXQgYS9zZWN1cmUvdWRwL3d3dy53aG8uYyBiL3NlY3VyZS91ZHAvd3d3Lndoby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2NDY1NjkKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cmUvdWRwL3d3dy53aG8uYwpAQCAtMCwwICsxLDQxIEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gd3d3Lndoby5jCisvLworLy8gJElkOiB3d3cud2hvLmMgODc1NSAyMDE0LTA0LTI2IDEzOjEzOjQwWiBaZXNzdHJhICQKKworI3ByYWdtYSBzdHJvbmdfdHlwZXMKKyNwcmFnbWEgY29tYmluZV9zdHJpbmdzCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8d3d3Lmg+CisKK3N0cmluZyBNYWtlTGluayhtaXhlZCBlbnRyeSkKK3sKKyAgc3RyaW5nIG5tOworICBpbnQgaWR4OworCisgIGVudHJ5WzFdID0gcmVncmVwbGFjZShlbnRyeVsxXSwgIjwiLCAiXFwmbHQ7IiwgMSk7CisgIGVudHJ5WzFdID0gcmVncmVwbGFjZShlbnRyeVsxXSwgIj4iLCAiXFwmZ3Q7IiwgMSk7CisgIG5tID0gZ2V0dWlkKGVudHJ5WzBdKTsKKyAgaWYobm0gPT0gIiBSIE8gTyBUICIpIHJldHVybiAiPFRUPiIrZW50cnlbMV1bMC4uMl0rIjwvVFQ+IitlbnRyeVsxXVszLi5dOworICBpZHggPSBzdHJzdHIobG93ZXJfY2FzZShlbnRyeVsxXSksIG5tKTsKKyAgcmV0dXJuICI8VFQ+IitlbnRyeVsxXVswLi4yXSsiPC9UVD4iK2VudHJ5WzFdWzMuLmlkeC0xXQorICAgICAgICsgIjxBIEhSRUY9XCIiK01VRFdXVysiPyIrUkVRKyI9IitSX0ZJTkdFUisiJiIrVVNFUisiPSIrbm0rIlwiPjxCPiIKKyAgICAgICArIGVudHJ5WzFdW2lkeC4uaWR4ID0gaWR4K3NpemVvZihubSldCisgICAgICAgKyAiPC9CPjwvQT4iCisgICAgICAgKyBlbnRyeVsxXVtpZHgrMS4uXTsKK30KKworc3RyaW5nIFJlcXVlc3QobWFwcGluZyBjbWRzKQoreworICBzdHJpbmcgKndobywgKmxpc3Q7IGludCBpLCBzOworICBpZiAoIXNpemVvZihjbWRzKSkgcmV0dXJuIEVSUk9SKCJBbmZyYWdlIHVuZyZ1dW1sO2x0aWchIik7CisgIHdobyA9IGFsbG9jYXRlKHMgPSBzaXplb2YobGlzdCA9IFdITykpOworICBmb3IoaSA9IHM7IGktLTsgaSA+IDApIAorICAgIHdob1tpXSA9IE1ha2VMaW5rKGxpc3RbcyAtIGkgLSAxXSk7CisgIC8vIHdobyA9IG1hcChXSE8sICMnTWFrZUxpbmsvKicqLyk7CisgIHJldHVybiAiPEgyPldlciBpc3QgZ2VyYWRlIGluICJNVUROQU1FIj88L0gyPjxIUj4iCisgICAgICAgKyAiPE9MPjxMST4iK2ltcGxvZGUod2hvLCAiXG48TEk+IikrIjwvT0w+IjsKK30KZGlmZiAtLWdpdCBhL3NlY3VyZS91ZHBfbWFpbC5jIGIvc2VjdXJlL3VkcF9tYWlsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzIwM2ZiOQotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyZS91ZHBfbWFpbC5jCkBAIC0wLDAgKzEsMjg1IEBACisvKgorICogVkVSU0lPTiAxLjAKKyAqIFVEUCBNQUlMIHN5c3RlbSAoQXV0aG9yOiBBbHZpbkBTdXNoaSkKKyAqIFJlcXVpcmVzIElORVREIFYwLjYwIG9yIGhpZ2hlciAoSU5FVEQgQXV0aG9yOiBOb3N0cmFkYW11c0BaZWJlZGVlKQorICovCisjcHJhZ21hIHN0cmljdF90eXBlcworI3ByYWdtYSBub19jbG9uZQorI3ByYWdtYSBub19zaGFkb3cKKyNwcmFnbWEgbm9faW5oZXJpdAorI3ByYWdtYSB2ZXJib3NlX2Vycm9ycworI3ByYWdtYSBjb21iaW5lX3N0cmluZ3MKKy8vI3ByYWdtYSBwZWRhbnRpYworLy8jcHJhZ21hIHJhbmdlX2NoZWNrCisjcHJhZ21hIHdhcm5fZGVwcmVjYXRlZAorCisjaW5jbHVkZSA8dWRwLmg+CisjaW5jbHVkZSA8dWRwX21haWwuaD4KKworI2lmZGVmIERFQlVHCisjdW5kZWYgREVCVUcKKyNlbmRpZgorI2RlZmluZSBERUJVRyh4KQorCittYXBwaW5nIHNwb29sX2l0ZW07CisKK3N0YXRpYyBzdHJpbmcgKnNwb29sOworCitwcml2YXRlIGludCBtYXRjaF9tdWRfbmFtZShzdHJpbmcgbXVkbmFtZSwgc3RyaW5nIG1hdGNoX3N0cikgeworICAgIHJldHVybiBtdWRuYW1lWzAuLnNpemVvZihtYXRjaF9zdHIpLTFdID09IG1hdGNoX3N0cjsKK30KKworc3RhdGljIHZvaWQgc2F2ZV9zcG9vbF9pdGVtKCkKK3sKKyAgc3RyaW5nIG5hbWU7CisgIGludCBjb3VudDsKKworICBpZighc3Bvb2xfaXRlbSB8fCAhbWFwcGluZ3Aoc3Bvb2xfaXRlbSkgfHwgc3Bvb2xfaXRlbT09KFtdKSkKKyAgICByZXR1cm47CisKKyAgZG8geworICAgICsrY291bnQ7CisgICAgbmFtZT1zcG9vbF9pdGVtW1VEUE1TX0RFU1RdKyItIit0b19zdHJpbmcoY291bnQpOworICB9IHdoaWxlKHNwb29sICYmIG1lbWJlcihzcG9vbCwgbmFtZSkhPS0xKTsKKworICBzYXZlX29iamVjdChVRFBNX1NQT09MX0RJUituYW1lKTsKKworICBpZighc3Bvb2wgfHwgIXNpemVvZihzcG9vbCkpCisgICAgc3Bvb2wgPSAoeyBuYW1lIH0pOworICBlbHNlCisgICAgc3Bvb2wgKz0gKHsgbmFtZSB9KTsKK30KKworLyogZm9yd2FyZCBkZWNsYXJhdGlvbiAqLwordm9pZCBkZWxpdmVyX21haWwoc3RyaW5nIHJlY2lwaWVudCxzdHJpbmcgbXVkLHN0cmluZyBmcm9tLAorCXN0cmluZyBzdWJqLHN0cmluZyBtYWlsX2JvZHksaW50IHN0YXR1c19mbGFnLHN0cmluZyBzcG9vbF9uYW1lKTsKKworLyogZm9yd2FyZCBkZWNsYXJhdGlvbiAqLworc3RhdGljIHZvaWQgc3RhcnRfcmV0cnlfY2FsbG91dCgpOworCitzdGF0aWMgdm9pZCByZW1vdmVfZnJvbV9zcG9vbChzdHJpbmcgc3Bvb2xfZmlsZSkKK3sKKyAgaW50IGlkeDsKKworICBpZihzcG9vbCAmJiAoaWR4PW1lbWJlcihzcG9vbCxzcG9vbF9maWxlKSkhPS0xKQorICAgIHsKKyAgICAgIHNwb29sIC09ICh7IHNwb29sX2ZpbGUgfSk7CisgICAgICBpZighc2l6ZW9mKHNwb29sKSkKKyAgICAgICAgc3Bvb2w9MDsKKyAgICB9CisKKyAgaWYoZmlsZV9zaXplKCIvIitVRFBNX1NQT09MX0RJUitzcG9vbF9maWxlKyIubyIpPjApCisgICAgaWYoIXJtKCIvIitVRFBNX1NQT09MX0RJUitzcG9vbF9maWxlKyIubyIpKQorICAgICAgbG9nX2ZpbGUoSU5FVERfTE9HX0ZJTEUsIlVQRF9NQUlMOiBDYW4ndCBkZWxldGUgc3Bvb2wgZmlsZSAiKworCQkiLyIrVURQTV9TUE9PTF9ESVIrc3Bvb2xfZmlsZSsiLm8iKTsKK30KKworc3RhdGljIHZvaWQgcmV0cnlfc2VuZCgpCit7CisgIGludCBpOworICBzdHJpbmcgbXNnOworCisgIGlmKCFzcG9vbCB8fCAhc2l6ZW9mKHNwb29sKSkgcmV0dXJuOworCisgIGZvcihpPTA7aTxzaXplb2Yoc3Bvb2wpOysraSkKKyAgICB7CisgICAgICBpZighcmVzdG9yZV9vYmplY3QoVURQTV9TUE9PTF9ESVIrc3Bvb2xbaV0pKQorICAgICAgICB7CisgICAgICAgICAgbG9nX2ZpbGUoSU5FVERfTE9HX0ZJTEUsIlVEUF9NQUlMOiBGYWxpZWQgdG8gcmVzdG9yZSBzcG9vbCBmaWxlICIrCisJCVVEUE1fU1BPT0xfRElSK3Nwb29sW2ldKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICBpZih0aW1lKCkgLSBzcG9vbF9pdGVtW1VEUE1TX1RJTUVdID4gVURQTV9TRU5EX0ZBSUwqNjApCisgICAgICAgIHsKKyAgICAgICAgICBtc2c9IlJlYXNvbjogVW5hYmxlIHRvIGNvbm5lY3QgdG8gc2l0ZSBcIiIrc3Bvb2xfaXRlbVtVRFBNU19ERVNUXSsKKwkJIlwiXG5cbklOQ0xVREVEIE1FU1NBR0UgRk9MTE9XUyA6LVxuXG4iKworCQkiVG86ICIrc3Bvb2xfaXRlbVtVRFBNU19UT10rIlxuIisKKwkJIlN1YmplY3Q6ICIrc3Bvb2xfaXRlbVtVRFBNU19TVUJKRUNUXSsiXG4iKworCQlzcG9vbF9pdGVtW1VEUE1TX0JPRFldOworCisgICAgICAgICAgTE9DQUxfTUFJTEVSLT5kZWxpdmVyX21haWwoCisJCXNwb29sX2l0ZW1bVURQTVNfRlJPTV0sCS8qIFRPICovCisJCSJNYWlsZXJAIitMT0NBTF9OQU1FLAkvKiBGUk9NICovCisJCSJCb3VuY2VkIE1haWwiLAkJLyogU1VCSkVDVCAqLworCQltc2cJCQkvKiBNQUlMIEJPRFkgKi8KKwkgICk7CisgICAgICAgICAgcmVtb3ZlX2Zyb21fc3Bvb2woc3Bvb2xbaV0pOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICBkZWxpdmVyX21haWwoCisJc3Bvb2xfaXRlbVtVRFBNU19UT10sCisJc3Bvb2xfaXRlbVtVRFBNU19ERVNUXSwKKwlzcG9vbF9pdGVtW1VEUE1TX0ZST01dLAorCXNwb29sX2l0ZW1bVURQTVNfU1VCSkVDVF0sCisJc3Bvb2xfaXRlbVtVRFBNU19CT0RZXSwKKwlVRFBNX1NUQVRVU19JTl9TUE9PTCwKKwlzcG9vbFtpXSk7CisgICAgfQorCisgIHN0YXJ0X3JldHJ5X2NhbGxvdXQoKTsKK30KKworc3RhdGljIHZvaWQgc3RhcnRfcmV0cnlfY2FsbG91dCgpCit7CisgIGlmKGZpbmRfY2FsbF9vdXQoInJldHJ5X3NlbmQiKSE9IC0xICkgcmV0dXJuOworCisgIGNhbGxfb3V0KCJyZXRyeV9zZW5kIixVRFBNX1JFVFJZX1NFTkQqNjApOworfQorCitzdGF0aWMgdm9pZCBmYWlsZWRfdG9fZGVsaXZlcihtYXBwaW5nIGRhdGEpCit7CisgIHN0cmluZyBtc2c7CisgIG9iamVjdCBvYmo7CisKKyAgaWYoIWRhdGFbU1lTVEVNXSB8fCBkYXRhW1NZU1RFTV0gIT0gVElNRV9PVVQpCisgICAgeworICAgICAgbXNnPSJSZWFzb246IEVycm9yIGluIGNvbm5lY3Rpb24gdG8gcmVtb3RlIHNpdGUgXCIiK2RhdGFbTkFNRV0rIlwiXG5cbiIrCisJIklOQ0xVREVEIE1FU1NBR0UgRk9MTE9XUyA6LVxuXG4iKworCSJUbzogIitkYXRhW1JFQ0lQSUVOVF0rIlxuIisKKwkiU3ViamVjdDogIitkYXRhW1VEUE1fU1VCSkVDVF0rIlxuIitkYXRhW0RBVEFdOworCisgICAgICBMT0NBTF9NQUlMRVItPmRlbGl2ZXJfbWFpbCgKKwkJZGF0YVtVRFBNX1dSSVRFUl0sCS8qIFRPICovCisJCSJNYWlsZXJAIitMT0NBTF9OQU1FLAkvKiBGUk9NICovCisJCSJCb3VuY2VkIE1haWwiLAkJLyogU1VCSkVDVCAqLworCQltc2cJCQkvKiBNQUlMIEJPRFkgKi8KKyAgICAgICk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIC8qIE9LIHRyYW5zbWlzc2lvbiB0aW1lZCBvdXQuLiBwbGFjZSBpbiBtYWlsIHNwb29sICovCisgIAorICBpZigob2JqPWZpbmRfcGxheWVyKGRhdGFbVURQTV9XUklURVJdKSkpCisgICAgeworICAgICAgdGVsbF9vYmplY3Qob2JqLCJNYWlsIGRlbGl2ZXJ5IHRvICIrZGF0YVtSRUNJUElFTlRdKyJAIitkYXRhW05BTUVdKworCSIgVGltZWQgT3V0LiBQbGFjaW5nIG1haWwgaW4gc3Bvb2wuXG4iKTsKKyAgICB9CisKKyAgc3Bvb2xfaXRlbT0oWworCVVEUE1TX1RJTUU6CXRpbWUoKSwKKwlVRFBNU19UTzoJZGF0YVtSRUNJUElFTlRdLAorCVVEUE1TX0RFU1Q6CWRhdGFbTkFNRV0sCisJVURQTVNfRlJPTToJZGF0YVtVRFBNX1dSSVRFUl0sCisJVURQTVNfU1VCSkVDVDoJZGF0YVtVRFBNX1NVQkpFQ1RdLAorCVVEUE1TX0JPRFk6CWRhdGFbREFUQV0KKyAgXSk7CisKKyAgc2F2ZV9zcG9vbF9pdGVtKCk7CisKKyAgc3RhcnRfcmV0cnlfY2FsbG91dCgpOworfQorCitzdGF0aWMgdm9pZCBnZXRfcGVuZGluZ19kZWxpdmVyaWVzKCkKK3sKKyAgc3RyaW5nICplbnRyaWVzOworICBpbnQgaTsKKworICBlbnRyaWVzPWdldF9kaXIoVURQTV9TUE9PTF9ESVIrIioubyIpOworICBpZighZW50cmllcyB8fCAhc2l6ZW9mKGVudHJpZXMpKSByZXR1cm47CisKKyAgc3Bvb2w9YWxsb2NhdGUoc2l6ZW9mKGVudHJpZXMpKTsKKyAgZm9yKGk9MDtpPHNpemVvZihlbnRyaWVzKTsrK2kpCisgICAgc3Bvb2xbaV09ZW50cmllc1tpXVswLi48M107CisKKyAgc3RhcnRfcmV0cnlfY2FsbG91dCgpOworfQorCit2b2lkIGNyZWF0ZSgpCit7CisJc2V0ZXVpZChnZXR1aWQodGhpc19vYmplY3QoKSkpOworICBnZXRfcGVuZGluZ19kZWxpdmVyaWVzKCk7Cit9CisKKy8qCisgKiBQdWJsaWMgcm91dGluZXMKKyAqLworCitpbnQgcXVlcnlfdmFsaWRfbWFpbF9ob3N0KHN0cmluZyBob3N0bmFtZSkKK3sKKyAgc3RyaW5nICptYXRjaDsKKworICBtYXRjaD1maWx0ZXIobV9pbmRpY2VzKChtYXBwaW5nKUlORVRELT5xdWVyeSgiaG9zdHMiKSksCisJCSMnbWF0Y2hfbXVkX25hbWUsbG93ZXJfY2FzZShob3N0bmFtZSkpOworCisgIHJldHVybiAoc2l6ZW9mKG1hdGNoKT09MSk7Cit9CisKK3ZvaWQgZGVsaXZlcl9tYWlsKHN0cmluZyByZWNpcGllbnQsc3RyaW5nIG11ZCxzdHJpbmcgZnJvbSwKKwlzdHJpbmcgc3ViaixzdHJpbmcgbWFpbF9ib2R5LGludCBzdGF0dXNfZmxhZyxzdHJpbmcgc3Bvb2xfbmFtZSkKK3sKKyAgbWFwcGluZyBkYXRhOworCisgIC8vIEdlbG9nZ3Qgd2lyZCwgd2VubiBlaW4gYXVmcnVmZW5kZXMgT2JqZWt0IG5pY2h0IHNpY2hlciBpc3QuCisgIGlmIChvYmplY3RfbmFtZShwcmV2aW91c19vYmplY3QoKSlbMC4uN10hPSIvc2VjdXJlLyIpCisgICAgd3JpdGVfZmlsZSgiL3NlY3VyZS9BUkNIL0RFTElWRVJfTUFJTCIsCisgICAgICBzcHJpbnRmKCIlcyA6IEF1ZnJ1ZiB2b24gL3NlY3VyZS91ZHBfbWFpbC0+ZGVsaXZlcl9tYWlsKClcbiIKKyAgICAgICAgICAgICAgIiAgU2VuZGVyOiAlTyBFbXBmYWVuZ2VyOiAlT0AlT1xuICBQTzogJU8gVEk6ICVPIFRQOiVPXG5cbiIsCisgICAgICAgICAgICAgIGN0aW1lKHRpbWUoKSksZnJvbSwgcmVjaXBpZW50LCBtdWQsCisgICAgICAgICAgICAgIHByZXZpb3VzX29iamVjdCgpLCB0aGlzX2ludGVyYWN0aXZlKCksIHRoaXNfcGxheWVyKCkpKTsKKyAgCisgIGRhdGE9KFsKKwlSRVFVRVNUOiAibWFpbCIsCisJUkVDSVBJRU5UOiByZWNpcGllbnQsCisgICAgICAgIFNFTkRFUjogdGhpc19vYmplY3QoKSwKKwlVRFBNX1NUQVRVUzogc3RhdHVzX2ZsYWcsCisJVURQTV9XUklURVI6IGxvd2VyX2Nhc2UoZnJvbSksCisJVURQTV9TVUJKRUNUOiBzdWJqLAorICAgICAgICBVRFBNX1NQT09MX05BTUU6IHNwb29sX25hbWUsCisJREFUQTogbWFpbF9ib2R5CisgIF0pOworCisgIElORVRELT5fc2VuZF91ZHAobXVkLGRhdGEsMSk7Cit9CisKK3ZvaWQgdWRwX3JlcGx5KG1hcHBpbmcgZGF0YSkKK3sKKyAgb2JqZWN0IHNlbmRlcjsKKworICBERUJVRyhzcHJpbnRmKCJNQUlMRVIgUkVDRUlWRUQgJU9cbiIsZGF0YSkpOworICBpZiAoIW1lbWJlcihkYXRhLFVEUE1fU1RBVFVTKSkKKyAgeworICAgICBERUJVRygiQk9VTkNJTkdcbiIpOworICAgICBMT0NBTF9NQUlMRVItPmRlbGl2ZXJfbWFpbCgKKyAgICAgICAgZGF0YVtVRFBNX1dSSVRFUl0sCS8qIFRPICovCisJIklORVREQCIrZGF0YVtOQU1FXSwJLyogRlJPTSAqLworCSJCb3VuY2VkIE1haWwoTm8gbWFpbCBzdXBwb3J0IHlldD8pIiwJCS8qIFNVQkpFQ1QgKi8KKwlkYXRhW0RBVEFdCQkvKiBNQUlMIEJPRFkgKi8KKwkpOworICAgICAgICBpZihkYXRhW1VEUE1fU1BPT0xfTkFNRV0pCisgICAgICAgICAgcmVtb3ZlX2Zyb21fc3Bvb2woZGF0YVtVRFBNX1NQT09MX05BTUVdKTsKKyAgfSBlbHNlCisgIHN3aXRjaChkYXRhW1VEUE1fU1RBVFVTXSkKKyAgICB7CisgICAgICBjYXNlIFVEUE1fU1RBVFVTX1RJTUVfT1VUOgorICAgICAgICBmYWlsZWRfdG9fZGVsaXZlcihkYXRhKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgVURQTV9TVEFUVVNfREVMSVZFUkVEX09LOgorICAgICAgICBpZigoc2VuZGVyPWZpbmRfcGxheWVyKGRhdGFbVURQTV9XUklURVJdKSkpCisgICAgICAgICAgeworICAgICAgICAgICAgdGVsbF9vYmplY3Qoc2VuZGVyLCJNYWlsZXJAIitkYXRhW05BTUVdKyI6ICIrCisJCSJNYWlsIHRvICIrY2FwaXRhbGl6ZShkYXRhW0RBVEFdKSsiIGRlbGl2ZXJlZCBvay5cbiIpOworICAgICAgICAgIH0KKyAgICAgICAgaWYoZGF0YVtVRFBNX1NQT09MX05BTUVdKQorICAgICAgICAgIHJlbW92ZV9mcm9tX3Nwb29sKGRhdGFbVURQTV9TUE9PTF9OQU1FXSk7CisKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgVURQTV9TVEFUVVNfVU5LTk9XTl9QTEFZRVI6CisgICAgICAgIExPQ0FMX01BSUxFUi0+ZGVsaXZlcl9tYWlsKAorCQlkYXRhW1VEUE1fV1JJVEVSXSwJLyogVE8gKi8KKwkJIk1haWxlckAiK2RhdGFbTkFNRV0sCS8qIEZST00gKi8KKwkJIkJvdW5jZWQgTWFpbCIsCQkvKiBTVUJKRUNUICovCisJCWRhdGFbREFUQV0JCS8qIE1BSUwgQk9EWSAqLworCSk7CisgICAgICAgIGlmKGRhdGFbVURQTV9TUE9PTF9OQU1FXSkKKyAgICAgICAgICByZW1vdmVfZnJvbV9zcG9vbChkYXRhW1VEUE1fU1BPT0xfTkFNRV0pOworICAgICAgICBicmVhazsKKworCWNhc2UgVURQTV9TVEFUVVNfSU5fU1BPT0w6CisgICAgICAgICAgLyogRG8gbm90aGluZyAqLworICAgICAgICAgIGJyZWFrOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NlY3VyZS93YWhsbWFzY2hpbmUuYyBiL3NlY3VyZS93YWhsbWFzY2hpbmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzA1Zjg3Ci0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3dhaGxtYXNjaGluZS5jCkBAIC0wLDAgKzEsMjUyIEBACisvLyBkYSBkaWVzZXMgT2JqZWt0IGluIC9zZWN1cmUgbGllZ3QgdW5kIFJPT1RJRCBpbm5lIGhhdCwgbXVlc3NlbiBiZXNvbmRlcmUKKy8vIFNpY2hlcmhlaXRzdm9ya2VocnVuZ2VuIGdldHJvZmZlbiB3ZXJkZW4uIEluc2Jlc29uZGVyZSBkdWVyZmVuIGtlaW5lIEZpbGVzCisvLyBhdXMgL3N0ZC8gaW5oZXJpdGV0IHdlcmRlbiwgZGEgZXMgZnVlciBkaWVzZSBGaWxlcyBrZWluZXIgUk9PVElEIGJlZGFyZi4KKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxkZWZpbmVzLmg+CisjaW5jbHVkZSAiL3NlY3VyZS93aXpsZXZlbHMuaCIKKworc3RhdGljIHN0cmluZyBpbl91c2U7CisKK3N0cmluZyB0aGVtYTsKK3N0cmluZyAqbW9lZ2xpY2hrZWl0ZW47CitzdHJpbmcgKmVyZ2VibmlzOworCisjdW5kZWYgU0FZCisKK3ByaXZhdGUgdm9pZCBTQVkoIHN0cmluZyBzdHIgKQoreworICB3cml0ZSAoIHN0ciApOworICB3cml0ZV9maWxlKCIvbG9nL1dBSEwiLCBzdHIpOworfQorCit2b2lkIGNyZWF0ZSgpCit7CisgIGlmIChjbG9uZXAoTUUpKSBkZXN0cnVjdChNRSk7CisgIGlmIChlcmdlYm5pcykgcmV0dXJuOworICBzZXRldWlkKGdldHVpZCgpKTsKKyAgaW5fdXNlPTA7CisgIGVyZ2VibmlzPSh7KHt9KSwoe30pfSk7CisgIG1vZWdsaWNoa2VpdGVuPSh7fSk7CisgIHJlc3RvcmVfb2JqZWN0KCJ3YWhsL3dhaGwiKTsKKyAgbW92ZV9vYmplY3QoTUUsICIvZ2lsZGVuL2FiZW50ZXVyZXIiKTsKK30KKwordmFyYXJncyBzdHJpbmcgbmFtZShpbnQgY2FzdXMsIGludCBkZW1vbikKK3sKKyAgaWYgKGRlbW9uPT1SQVcpIHJldHVybiAiV2FobG1hc2NoaW5lIjsKKyAgc3dpdGNoKGNhc3VzKSB7CisgICAgY2FzZSBXRU06CisgICAgY2FzZSBXRVNTRU46CisgICAgICBpZiAoZGVtb249PTEpCisgICAgICAgIHJldHVybiAiZGVyIFdhaGxtYXNjaGluZSI7CisgICAgICByZXR1cm4gImVpbmVyIFdhaGxtYXNjaGluZSI7CisgICAgZGVmYXVsdDoKKyAgICAgIGlmIChkZW1vbj09MSkKKyAgICAgICAgcmV0dXJuICJkaWUgV2FobG1hc2NoaW5lIjsKKyAgICAgIHJldHVybiAiZWluZSBXYWhsbWFzY2hpbmUiOworICB9Cit9CisKK3ZhcmFyZ3Mgc3RyaW5nIE5hbWUoaW50IGNhc3VzLCBpbnQgZGVtb24pCit7ICAgcmV0dXJuIGNhcGl0YWxpemUobmFtZShjYXN1cywgZGVtb24pKTsgIH0KKworCitwdWJsaWMgc3RyaW5nIFF1ZXJ5UHJvbm91bihpbnQgY2FzdXMpCit7CisgIHN3aXRjaChjYXN1cykKKyAgeworICAgIGNhc2UgV0VSOgorICAgICAgcmV0dXJuICJzaWUiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBXRU06IAorICAgICAgcmV0dXJuICJpaHIiOworICB9CisgIHJldHVybiAic2llIjsKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKK3N0cmluZyBzaG9ydCgpCit7ICByZXR1cm4gIkVpbmUgV2FobG1hc2NoaW5lLlxuIjsgIH0KKworc3RyaW5nIGxvbmcoKQoreworICByZXR1cm4gIkVpbmUgV2FobG1hc2NoaW5lLiBNaXQgaWhyIGtvZW5uZW4gZ2VoZWltZSBXYWhsZW4gZHVyY2hnZWZ1ZWhydCB3ZXJkZW4uXG4iKworICAgICJBa3R1ZWxsZXMgVGhlbWE6ICIrKHN0cmluZ3AodGhlbWEpID8gdGhlbWEgOiAia2VpbmVzIikrIlxuIjsKK30KKworbWl4ZWQgUXVlcnkobWl4ZWQgcGFyYW0pCit7CisgICBpZiAoIXN0cmluZ3AocGFyYW0pKSByZXR1cm4gMDsKKyAgIHN3aXRjaCAocGFyYW0pIHsKKyAgICAgY2FzZSBQX05PR0VUOiAgIHJldHVybiAxOworICAgICBjYXNlIFBfR0VOREVSOiAgcmV0dXJuIEZFTUFMRTsKKyAgICAgY2FzZSBQX05BTUU6ICAgIHJldHVybiAiV2FobG1hc2NoaW5lIjsKKyAgIH0KKyAgIHJldHVybiAwOworfQorCittaXhlZCBRdWVyeVByb3AobWl4ZWQgcGFyYW0pCit7ICByZXR1cm4gUXVlcnkocGFyYW0pOyAgfQorCitpbnQgU2V0KG1peGVkIHBhcmFtKQoreyAgcmV0dXJuIC0xOyAgfQorCitpbnQgU2V0UHJvcChtaXhlZCBwYXJhbSkKK3sgIHJldHVybiAtMTsgIH0KKwordmFyYXJncyBpbnQgaWQoc3RyaW5nIHN0ciwgaW50IGx2bCkKK3sgIHJldHVybiAobWVtYmVyKCh7Im1hc2NoaW5lIiwgIndhZWhsZXIiLCAid2FobG1hc2NoaW5lIn0pLCBzdHIpIT0tMSk7ICB9CisKKy8vIGFiIGhpZXIga29tbXQgZGVyIGVpZ2VudGxpY2hlIENvZGUgZGVyIFdhaGxtYXNjaGluZQorCit2b2lkIGluaXQoKQoreworICBhZGRfYWN0aW9uKCJ3YWVobGUiLCAid2FlaGwiLDEpOworICBhZGRfYWN0aW9uKCJhdXN3ZXJ0dW5nIiwiYXVzd2VydHVuZyIpOworICBhZGRfYWN0aW9uKCJ3YWhsdGhlbWEiLCAid2FobHRoZW1hIik7CisgIGFkZF9hY3Rpb24oIm1vZWdsaWNoa2VpdCIsIm1vZWdsaWNoa2VpdCIpOworfQorCit2b2lkIHNhdmVfbWUoKQoreyAgc2F2ZV9vYmplY3QoIndhaGwvd2FobCIpOyAgfQorCitzdGF0aWMgaW50IHdhZWhsZSgpCit7CisgIGludCBpOworICBtaXhlZCBzZWNvbmQ7CisKKyAgaWYgKCFSUEwpIHJldHVybiAwOworICBpZiAoUlBMLT5RdWVyeVByb3AoUF9MRVZFTCk8MTApIHsKKyAgICBub3RpZnlfZmFpbCgiTWFuIGthbm4gZXJzdCBhYiBTdHVmZSAxMCBtaXR3YWVobGVuIDooXG4iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoUlBMLT5RdWVyeVByb3AoUF9URVNUUExBWUVSKSkgeworICAgIG5vdGlmeV9mYWlsKCJUZXN0c3BpZWxlciBzaW5kIHZvbiBkZXIgV2FobCBhdXNnZXNjaGxvc3Nlbi5cbiIpOworICAgIHJldHVybiAwOworICB9CisgIGlmICgoc2Vjb25kPVJQTC0+UXVlcnlQcm9wKFBfU0VDT05EKSkgJiYKKyAgICAgICghc3RyaW5ncChzZWNvbmQpIHx8IChmaWxlX3NpemUoIi9zYXZlLyIrbG93ZXJfY2FzZShzZWNvbmRbMC4uMF0pKyIvIitsb3dlcl9jYXNlKHNlY29uZCkrIi5vIik8PTApKSkgeworICAgIG5vdGlmeV9mYWlsKCJOaWNodCByaWNodGlnIG1hcmtpZXJ0ZSBad2VpdGllcyBzaW5kIHZvbiBkZXIgV2FobCBhdXNnZXNjaGxvc3Nlbi5cbiIpOworICAgIHJldHVybiAwOworICB9CisgIGlmIChpbl91c2UpCisgIHsKKyAgICB3cml0ZShpbl91c2UrIiB3YWVobHQgZ2VyYWRlLCB3YXJ0ZSBhbHNvIGJpdHRlIGVpbmVuIEF1Z2VuYmxpY2suXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBpbl91c2U9Y2FwaXRhbGl6ZShnZXR1aWQoUlBMKSk7CisgIHNheShpbl91c2UrIiB0cml0dCBhbiBkaWUgV2FobG1hc2NoaW5lLlxuIik7CisgIHdyaXRlKGxvbmcoKSk7CisgIHdyaXRlKCJEYXMgc3RlaHQgenVyIEF1c3dhaGw6XG4iKTsKKyAgZm9yIChpPTA7aTxzaXplb2YobW9lZ2xpY2hrZWl0ZW4pO2krKykKKyAgICB3cml0ZShzcHJpbnRmKCIgLS0gJWQuKSAlc1xuIixpKzEsbW9lZ2xpY2hrZWl0ZW5baV0pKTsKKyAgd3JpdGUoIlRyaWZmIG51biBEZWluZSBXYWhsIChzaWUgaXN0IFVOU0lDSFRCQVIpOiAiKTsKKyAgaW5wdXRfdG8oIndhZWhsZV8yIiwxKTsKKyAgcmV0dXJuIDE7Cit9CisKK3ByaXZhdGUgaW50IGZhbHNjaCgpCit7CisgIHdyaXRlKCJEaWVzZSBBdXN3YWhsIGlzdCB1bmd1ZWx0aWcuIFZlcnN1Y2hzIGJpdHRlIGdsZWljaCBub2NobWFsLlxuIik7CisgIHNheShpbl91c2UrIiBoYXQgYXVzZ2V3YWVobHQuXG4iKTsKKyAgaW5fdXNlPTA7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IHdhZWhsZV8yKHN0cmluZyBzdHIpCit7CisgIGludCBpOworICBtaXhlZCBuYW1lOworCisgIGlmICghc3RyKSByZXR1cm4gZmFsc2NoKCk7CisgIAorICBuYW1lPVJQTC0+UXVlcnlQcm9wKFBfU0VDT05EKTsKKyAgaWYgKCFzdHJpbmdwKG5hbWUpKQorICAgIG5hbWU9Z2V0dWlkKFJQTCk7CisgIGVsc2UgbmFtZT1sb3dlcl9jYXNlKG5hbWUpOworICAgICAgICAgICAgCisgIGlmIChtZW1iZXJfYXJyYXkoc3RyLCBtb2VnbGljaGtlaXRlbik9PS0xKSB7CisgICAgaWYgKCAhc3NjYW5mKCBzdHIsICIlZCIsIGkgKSApIHJldHVybiBmYWxzY2goKTsKKyAgICBpZiAoIGk8MSB8fCBpPnNpemVvZihtb2VnbGljaGtlaXRlbikgKSByZXR1cm4gZmFsc2NoKCk7CisgICAgZXJnZWJuaXM9aW5zZXJ0X2FsaXN0KG5hbWUsbW9lZ2xpY2hrZWl0ZW5baS0xXSxlcmdlYm5pcyk7CisgIH0KKyAgZWxzZSBlcmdlYm5pcz1pbnNlcnRfYWxpc3QobmFtZSxzdHIsZXJnZWJuaXMpOworICB3cml0ZSgiT2suXG4iKTsKKyAgc2F2ZV9tZSgpOworICBzYXkoaW5fdXNlKyIgaGF0IGF1c2dld2FlaGx0LlxuIik7CisgIGluX3VzZT0wOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBhdXN3ZXJ0dW5nKCkKK3sKKyAgaW50IGksaixtYXgsYWxsOworICBtYXBwaW5nIHN0aW1tZW4sIGRhdGE7CisgIG1peGVkIG5hbWVzOworCisgIGlmICghQVJDSF9TRUNVUklUWSB8fCBwcm9jZXNzX2NhbGwoKSkgcmV0dXJuIDA7CisKKyAgcm0oIi9sb2cvV0FITCIpOworCisgIGRhdGEgPSBta21hcHBpbmcoZXJnZWJuaXNbMF0sIGVyZ2VibmlzWzFdKTsKKyAgbmFtZXMgPSBtX2luZGljZXMoZGF0YSk7CisgIHN0aW1tZW4gPSAoW10pOworCisgIFNBWSgiXG5cblxuV2FobGVyZ2Vibmlzc2UgenVtIFRoZW1hOiAiK3RoZW1hKyJcbiIpOworICBTQVkoIlxuR2V3YWVobHQgaGFiZW4gZm9sZ2VuZGUgUGVyc29uZW46IFxuIik7CisgIFNBWShicmVha19zdHJpbmcoQ291bnRVcChtYXAoc29ydF9hcnJheShuYW1lcywgIyc+LyonKi8pLCAjJ2NhcGl0YWxpemUvKicqLykpLCA3OCkpOworICBTQVkoIlxuIik7CisKKyAgd2hpbGUoc2l6ZW9mKG5hbWVzKSkgeworICAgIHN0aW1tZW5bZGF0YVtuYW1lc1swXV1dKys7CisgICAgbmFtZXNbMC4uMF0gPSAoe30pOworICAgIGFsbCsrOworICB9CisKKyAgU0FZKCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuIik7CisgIFNBWSgiRXJnZWJuaXM6XG4iKTsKKyAgZm9yIChpPTA7aTxzaXplb2YobW9lZ2xpY2hrZWl0ZW4pO2krKykKKyAgICBTQVkoc3ByaW50ZigiIC0tICUyZC4pICUyMHM6ICUzZCAoJScgJzMuMmYlJSlcbiIsIGkrMSwgbW9lZ2xpY2hrZWl0ZW5baV0sCisgICAgICAgICAgICAgICAgc3RpbW1lblttb2VnbGljaGtlaXRlbltpXV0sIDEuMCAqIHN0aW1tZW5bbW9lZ2xpY2hrZWl0ZW5baV1dICogMTAwLjAgLyAoMS4wICogYWxsKSkpOworICBTQVkoc3ByaW50ZigiR2VzYW10c3RpbW1lbjogJWRcbiIsIHNpemVvZihtX2luZGljZXMoZGF0YSkpKSk7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IHdhaGx0aGVtYShzdHJpbmcgc3RyKQoreworICBpZiAoIUFSQ0hfU0VDVVJJVFkgfHwgcHJvY2Vzc19jYWxsKCkpIHsKKyAgICB3cml0ZSgiTk9UIGFsbG93ZWQiKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoIShzdHI9dGhpc19pbnRlcmFjdGl2ZSgpLT5fdW5wYXJzZWRfYXJncygpKSkgcmV0dXJuIDA7CisgIHRoZW1hPXN0cjsKKyAgc2F5KFJQTC0+bmFtZShXRVIpKyIgc2V0enQgZWluIG5ldWVzIEFic3RpbW11bmdzdGhlbWEgZmVzdC5cbiIpOworICBlcmdlYm5pcz0oeyh7fSksKHt9KX0pOworICBtb2VnbGljaGtlaXRlbj0oe30pOworICB3cml0ZSgiT2suXG4iKTsKKyAgc2F2ZV9tZSgpOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBtb2VnbGljaGtlaXQoc3RyaW5nIHN0cikKK3sKKyAgaWYgKCFBUkNIX1NFQ1VSSVRZIHx8IHByb2Nlc3NfY2FsbCgpKSB7CisgICAgd3JpdGUoIk5PVCBhbGxvd2VkIik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKCEoc3RyPVJQTC0+X3VucGFyc2VkX2FyZ3MoKSkpIHJldHVybiAwOworICBpZiAobWVtYmVyX2FycmF5KHN0ciwgbW9lZ2xpY2hrZWl0ZW4pICE9IC0xKSB7CisgICAgd3JpdGUoIlNjaG9uIGRyaW4uXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBtb2VnbGljaGtlaXRlbis9KHtzdHJ9KTsKKyAgd3JpdGUoIk9rLlxuIik7CisgIHNhdmVfbWUoKTsKKyAgcmV0dXJuIDE7Cit9CisKK21peGVkIF9pbnRlcm5hbCgpCit7CisgIGlmICghQVJDSF9TRUNVUklUWSB8fCBwcm9jZXNzX2NhbGwoKSkgcmV0dXJuIDA7CisgIHJldHVybiBlcmdlYm5pczsKK30KZGlmZiAtLWdpdCBhL3NlY3VyZS93aXpsZXZlbHMuaCBiL3NlY3VyZS93aXpsZXZlbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzg1MTU4Ci0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3dpemxldmVscy5oCkBAIC0wLDAgKzEsNjMgQEAKKyNpZm5kZWYgX1dJWkxFVkVMU18KKyNkZWZpbmUgX1dJWkxFVkVMU18KKy8qCisgKiB3aXpsZXZlbHMuaAorICoKKyAqIFRoaXMgZmlsZSBkZWZpbmVzIHNvbWUgdXNlZnVsIG1hY3JvcyB0byBkZXRlcm1pbmUgdGhlIGxldmVsIG9mCisgKiBhIHdpemFyZCBpbiB0ZXJtcyBvZiBhYmlsaXR5IHRvIGRvIGNlcnRhaW4gd2l6YXJkIHRoaW5ncy4KKyAqIFNlZSBhbHNvIGRvYy9jb25jZXB0cy9sZXZlbHMuIFRoZSBncm91cGluZyBiZWxvdyBpcyB0YWtlbiBmcm9tIHRoZXJlLgorICoKKyAqLworI2luY2x1ZGUgIi9zZWN1cmUvY29uZmlnLmgiCisKKyNkZWZpbmUJU0VFUl9MVkwgMQorI2RlZmluZQlMRUFSTkVSX0xWTCAxMAorI2RlZmluZQlXSVpBUkRfTFZMIDIwCisjZGVmaW5lIERPTUFJTk1FTUJFUl9MVkwgMjUKKyNkZWZpbmUgU1BFQ0lBTF9MVkwgMzAKKyNkZWZpbmUJTE9SRF9MVkwgNDAKKyNkZWZpbmUgRUxERVJfTFZMIDUwCisjZGVmaW5lCUFSQ0hfTFZMIDYwCisjZGVmaW5lIEdPRF9MVkwgMTAwCisKKyNkZWZpbmUgU0VFUl9HUlAgMQorI2RlZmluZSBMRUFSTkVSX0dSUCAyCisjZGVmaW5lIFdJWkFSRF9HUlAgMworI2RlZmluZSBET01BSU5NRU1CRVJfR1JQIDQKKyNkZWZpbmUgU1BFQ0lBTF9HUlAgNQorI2RlZmluZSBMT1JEX0dSUCA2CisjZGVmaW5lIEVMREVSX0dSUCA3CisjZGVmaW5lIEFSQ0hfR1JQIDgKKworLyogdXNlciBpcyBhbiBvYmplY3Qgd2hpY2ggaXMgdG8gYmUgY2hlY2tlZCAqLworLyogZm9yIGV4YW1wbGUsIHVzZSBJU19XSVpBUkQodGhpc19wbGF5ZXIoKSkgdG8gY2hlY2sgKi8KKy8qIGlmIGEgcGxheWVyIGlzIGEgd2l6YXJkLiAqLworI2RlZmluZSBJU19TRUVSKHVzZXIpIChxdWVyeV93aXpfbGV2ZWwodXNlcikgPj0gU0VFUl9MVkwpCisjZGVmaW5lIElTX0xFQVJORVIodXNlcikgKHF1ZXJ5X3dpel9sZXZlbCh1c2VyKSA+PSBMRUFSTkVSX0xWTCkKKyNkZWZpbmUgSVNfU1BFQ0lBTCh1c2VyKSAocXVlcnlfd2l6X2xldmVsKHVzZXIpID49IFNQRUNJQUxfTFZMKQorI2RlZmluZSBJU19XSVpBUkQodXNlcikgKHF1ZXJ5X3dpel9sZXZlbCh1c2VyKSA+PSBXSVpBUkRfTFZMKQorI2RlZmluZSBJU19ET01BSU5NRU1CRVIodXNlcikgKHF1ZXJ5X3dpel9sZXZlbCh1c2VyKSA+PSBET01BSU5NRU1CRVJfTFZMKQorI2RlZmluZSBJU19ERVBVVFkodXNlcikgKG1hc3RlcigpLT5Jc0RlcHV0eSh1c2VyKSkKKyNkZWZpbmUgSVNfTE9SRCh1c2VyKSAocXVlcnlfd2l6X2xldmVsKHVzZXIpID49IExPUkRfTFZMKQorI2RlZmluZSBJU19FTERFUih1c2VyKSAocXVlcnlfd2l6X2xldmVsKHVzZXIpID49IEVMREVSX0xWTCkKKyNkZWZpbmUgSVNfQVJDSCh1c2VyKSAocXVlcnlfd2l6X2xldmVsKHVzZXIpID49IEFSQ0hfTFZMKQorI2RlZmluZSBJU19HT0QodXNlcikgKHF1ZXJ5X3dpel9sZXZlbCh1c2VyKSA+PSBHT0RfTFZMKQorCisjZGVmaW5lIElTX0xFQVJOSU5HKHVzZXIpIChxdWVyeV93aXpfbGV2ZWwodXNlcikgPj0gTEVBUk5FUl9MVkwgJiZcCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLT5RdWVyeVByb3AoUF9XQU5UU19UT19MRUFSTikpCisjZGVmaW5lIElTX0xPUkRfRE9NQUlOKHVzZXIsZG9tYWluKSAobWFzdGVyKCktPmRvbWFpbl9tYXN0ZXIodXNlcixkb21haW4pKQorCisvKgorICogSW50ZXJmYWNlIGZvciBlbmhhbmNlZCBzZWN1cml0eSBmdW5jdGlvbnMKKyAqLworI2RlZmluZSBTRUVSX1NFQ1VSSVRZIChzZWN1cmVfbGV2ZWwoKSA+PSBTRUVSX0xWTCkKKyNkZWZpbmUgTEVBUk5FUl9TRUNVUklUWSAoc2VjdXJlX2xldmVsKCkgPj0gTEVBUk5FUl9MVkwpCisjZGVmaW5lIFdJWkFSRF9TRUNVUklUWSAoc2VjdXJlX2xldmVsKCkgPj0gV0laQVJEX0xWTCkKKyNkZWZpbmUgRE9NQUlOTUVNQkVSX1NFQ1VSSVRZIChzZWN1cmVfbGV2ZWwoKSA+PSBET01BSU5NRU1CRVJfTFZMKQorI2RlZmluZSBTUEVDSUFMX1NFQ1VSSVRZIChzZWN1cmVfbGV2ZWwoKSA+PSBTUEVDSUFMX0xWTCkKKyNkZWZpbmUgTE9SRF9TRUNVUklUWSAoc2VjdXJlX2xldmVsKCkgPj0gTE9SRF9MVkwpCisjZGVmaW5lIEVMREVSX1NFQ1VSSVRZIChzZWN1cmVfbGV2ZWwoKSA+PSBFTERFUl9MVkwpCisjZGVmaW5lIEFSQ0hfU0VDVVJJVFkgKHNlY3VyZV9sZXZlbCgpID49IEFSQ0hfTFZMKQorI2RlZmluZSBHT0RfU0VDVVJJVFkgKHNlY3VyZV9sZXZlbCgpID49IEdPRF9MVkwpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VjdXJlL3p3ZWl0aWVzLmMgYi9zZWN1cmUvendlaXRpZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTMwN2MyCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJlL3p3ZWl0aWVzLmMKQEAgLTAsMCArMSwxNjQgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8qKiBcZmlsZSAvZmlsZS5jCisqIEt1cnpiZXNjaHJlaWJ1bmcuCisqIExhbmdiZXNjaHJlaWJ1bmcuLi4KKyogXGF1dGhvciA8QXV0b3I+CisqIFxkYXRlIDxkYXRlPgorKiBcdmVyc2lvbiAkSWQkCisqLworLyogQ2hhbmdlbG9nOgorKi8KKyNwcmFnbWEgc3Ryb25nX3R5cGVzLHNhdmVfdHlwZXMscnR0X2NoZWNrcworI3ByYWdtYSBub19jbG9uZSxub19pbmhlcml0LG5vX3NoYWRvdworI3ByYWdtYSBwZWRhbnRpYywgcmFuZ2VfY2hlY2sKKworI2luY2x1ZGUgPGRlZmluZXMuaD4KKyNpbmNsdWRlIDxldmVudHMuaD4KKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKyNpbmNsdWRlIDxwbGF5ZXIvYmFzZS5oPgorI2luY2x1ZGUgPHVzZXJpbmZvLmg+CisKKyNkZWZpbmUgSE9NRSh4KSAoX19QQVRIX18oMCkreCkKKyNkZWZpbmUgWkRFQlVHKHgpIHRlbGxfcm9vbSgiL3BsYXllcnMvemVzc3RyYS93b3Jrcm9vbSIsXAorICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCJzZWNvbmQ6ICVPXG4iLHgpKTsKKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkKK3sKKyAgc2V0ZXVpZChnZXR1aWQoKSk7CisgIGlmIChzbF9vcGVuKEhPTUUoIkFSQ0gvc2Vjb25kLnNxbGl0ZSIpKSAhPSAxKQorICB7CisgICAgcmFpc2VfZXJyb3IoIkRhdGVuYmFuayBrb25udGUgbmljaHQgZ2VvZWZmbmV0IHdlcmRlbi5cbiIpOworICB9CisgIC8vIFRhYmVsbGVuIHVuZCBJbmRpY2VzIGFubGVnZW4sIGZhbGxzIGRpZSBuaWNodCBleGlzdGllcmVuLgorICBzbF9leGVjKCJDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyB6d2VpdGllcyh1dWlkIFRFWFQgUFJJTUFSWSBLRVkgQVNDLCAiCisgICAgICAgICAgIm5hbWUgVEVYVCBOT1QgTlVMTCwgZXJzdGlldXVpZCBURVhUIE5PVCBOVUxMLCAiCisgICAgICAgICAgImVyc3RpZSBURVhUIE5PVCBOVUxMKTsiKTsKKyAgc2xfZXhlYygiQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgdGVzdGllcyhuYW1lIFRFWFQgUFJJTUFSWSBLRVkgQVNDLCAiCisgICAgICAgICAgIm1hZ2llciBURVhUIE5PVCBOVUxMLCAiCisgICAgICAgICAgImxhc3Rsb2dpbiBEQVRFVElNRSBERUZBVUxUIGN1cnJlbnRfdGltZXN0YW1wKTsiKTsKKyAgc2xfZXhlYygiQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgZmFtaWxpZW4oIgorICAgICAgICAgICJlcnN0aWV1dWlkIFRFWFQgUFJJTUFSWSBLRVkgQVNDLCBmYW1pbGllIFRFWFQgTk9UIE5VTEwpOyIpOworICBzbF9leGVjKCJDUkVBVEUgSU5ERVggSUYgTk9UIEVYSVNUUyBpZHhfZXJzdGllIE9OIHp3ZWl0aWVzKGVyc3RpZSk7Iik7CisgIHNsX2V4ZWMoIkNSRUFURSBJTkRFWCBJRiBOT1QgRVhJU1RTIGlkeF9uYW1lIE9OIHp3ZWl0aWVzKG5hbWUpOyIpOworICBzbF9leGVjKCJDUkVBVEUgSU5ERVggSUYgTk9UIEVYSVNUUyBpZHhfbWFnaWVybmFtZSBPTiB0ZXN0aWVzKG1hZ2llcik7Iik7CisgIHNsX2V4ZWMoIkNSRUFURSBJTkRFWCBJRiBOT1QgRVhJU1RTIGlkeF9mYW1pbGllIE9OIGZhbWlsaWVuKGZhbWlsaWUpOyIpOworCisgIC8vIExvZ2luLUV2ZW50IGFib25uaWVyZW4KKyAgaWYgKEVWRU5URC0+UmVnaXN0ZXJFdmVudChFVlRfTElCX0xPR0lOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsaXN0ZW4iLCB0aGlzX29iamVjdCgpKSA8PSAwKQorICB7CisgICAgcmFpc2VfZXJyb3IoIkxvZ2luZXZlbnQga29ubnRlIG5pY2h0IGFib25uaWVydCB3ZXJkZW4uXG4iKTsKKyAgfQorfQorCitwdWJsaWMgdm9pZCBsaXN0ZW4oc3RyaW5nIGVpZCwgb2JqZWN0IHRyaWdvYiwgbWl4ZWQgZGF0YSkKK3sKKyAgaWYgKHByZXZpb3VzX29iamVjdCgpICE9IGZpbmRfb2JqZWN0KEVWRU5URCkKKyAgICAgIHx8ICF0cmlnb2IKKyAgICAgIHx8ICFxdWVyeV9vbmNlX2ludGVyYWN0aXZlKHRyaWdvYikKKyAgICAgIHx8IElTX0xFQVJORVIodHJpZ29iKSkKKyAgICByZXR1cm47CisgIC8vIHdlbm4gdGVzdGllLCB3aXJkIGRlciBDaGFyIGFscyBUZXN0aWUgYmVoYW5kZWx0IHVuZCBQX1NFQ09ORCBpZ25vcmllcnQuCisgIG1peGVkIHRlc3RpZT10cmlnb2ItPlF1ZXJ5UHJvcChQX1RFU1RQTEFZRVIpOworICBpZiAoc3RyaW5ncCh0ZXN0aWUpCisgICAgICAmJiBzdHJzdHIodGVzdGllLCJHaWxkZSIpPT0tMSkKKyAgeworICAgIG1peGVkIHBsaW5mbyA9IG1hc3RlcigpLT5nZXRfdXNlcmluZm8odGVzdGllKTsKKyAgICBpZiAocG9pbnRlcnAocGxpbmZvKSkKKyAgICB7CisgICAgICBzbF9leGVjKCJJTlNFUlQgT1IgUkVQTEFDRSBJTlRPIHRlc3RpZXMobmFtZSwgbWFnaWVyLCBsYXN0bG9naW4pICIKKyAgICAgICAgICAgICAgIlZBTFVFUyg/MSw/Miw/Myk7IiwKKyAgICAgICAgICAgICAgdHJpZ29iLT5xdWVyeV9yZWFsX25hbWUoKSwKKyAgICAgICAgICAgICAgdGVzdGllLCB0aW1lKCkpOworICAgICAgcmV0dXJuOyAvLyB6d2VpdGllIGpldHp0IGF1ZiBqZWRlbiBGYWxsIGlnbm9yaWVyZW4uCisgICAgfQorICB9CisKKyAgbWl4ZWQgZXJzdGllPXRyaWdvYi0+UXVlcnlQcm9wKFBfU0VDT05EKTsKKyAgaWYgKHN0cmluZ3AoZXJzdGllKSkKKyAgeworICAgIG1peGVkIHBsaW5mbyA9IG1hc3RlcigpLT5nZXRfdXNlcmluZm8oZXJzdGllKTsKKyAgICBpZiAocG9pbnRlcnAocGxpbmZvKSkKKyAgICB7CisgICAgICBzbF9leGVjKCJJTlNFUlQgT1IgUkVQTEFDRSBJTlRPIHp3ZWl0aWVzKHV1aWQsIG5hbWUsIGVyc3RpZXV1aWQsIGVyc3RpZSkgIgorICAgICAgICAgICAgICAiVkFMVUVTKD8xLD8yLD8zLD80KTsiLAorICAgICAgICAgICAgICBnZXR1dWlkKHRyaWdvYiksCisgICAgICAgICAgICAgIHRyaWdvYi0+cXVlcnlfcmVhbF9uYW1lKCksCisgICAgICAgICAgICAgIGVyc3RpZSArICJfIiArIHBsaW5mb1tVU0VSX0NSRUFUSU9OX0RBVEUrMV0sCisgICAgICAgICAgICAgIGVyc3RpZSk7CisgICAgfQorICAgIC8vWkRFQlVHKHNwcmludGYoIiVPLCAlTywgJU9cbiIsZWlkLHRyaWdvYixkYXRhKSk7CisgIH0KK30KKwordmFyYXJncyBpbnQgcmVtb3ZlKGludCBzaWxlbnQpCit7CisgIEVWRU5URC0+VW5yZWdpc3RlckV2ZW50KEVWVF9MSUJfTE9HSU4sIHRoaXNfb2JqZWN0KCkpOworICBzbF9jbG9zZSgpOworICBkZXN0cnVjdChNRSk7CisgIHJldHVybiAxOworfQorCitwdWJsaWMgbWl4ZWQgc3FsX3F1ZXJ5KHN0cmluZyBxdWVyeSkKK3sKKyAgaWYgKEFSQ0hfU0VDVVJJVFkpCisgICAgcmV0dXJuIHNsX2V4ZWMocXVlcnkpOworICByZXR1cm4gMDsKK30KKworcHJpdmF0ZSBzdHJpbmcgZ2V0X2Vyc3RpZV9kYXRhKHN0cmluZyBkYXR1bSwgb2JqZWN0IHp3ZWl0aWUpCit7CisgIGlmICghendlaXRpZSkgcmV0dXJuIDA7CisgIG1peGVkIHJlcyA9IHNsX2V4ZWMoIlNFTEVDVCAiICsgZGF0dW0gKyAiIEZST00gendlaXRpZXMgV0hFUkUgdXVpZD0/MSIsCisgICAgICAgICAgICAgICAgICAgICAgZ2V0dXVpZCh6d2VpdGllKSk7CisgIGlmIChzaXplb2YocmVzKSkKKyAgICByZXR1cm4gcmVzWzBdWzBdOworCisgIHJldHVybiAwOworfQorCitwdWJsaWMgdmFyYXJncyBzdHJpbmcgUXVlcnlFcnN0aWVOYW1lKG9iamVjdCB6d2VpdGllKQoreworICByZXR1cm4gZ2V0X2Vyc3RpZV9kYXRhKCJlcnN0aWUiLCB6d2VpdGllIHx8IHByZXZpb3VzX29iamVjdCgpKTsKK30KKworcHVibGljIHZhcmFyZ3Mgc3RyaW5nIFF1ZXJ5RXJzdGllVVVJRChvYmplY3QgendlaXRpZSkKK3sKKyAgcmV0dXJuIGdldF9lcnN0aWVfZGF0YSgiZXJzdGlldXVpZCIsIHp3ZWl0aWUgfHwgcHJldmlvdXNfb2JqZWN0KCkpOworfQorCitwcml2YXRlIHN0cmluZyogZ2V0X3p3ZWl0aWVfZGF0YShzdHJpbmcgZGF0dW0sIG9iamVjdCBlcnN0aWUpCit7CisgIGlmICghZXJzdGllKSByZXR1cm4gMDsKKyAgbWl4ZWQgdG1wID0gc2xfZXhlYygiU0VMRUNUICIgKyBkYXR1bSArICIgRlJPTSB6d2VpdGllcyBXSEVSRSBlcnN0aWV1dWlkPT8xIiwKKyAgICAgICAgICAgICAgICAgICAgICBnZXR1dWlkKGVyc3RpZSkpOworICBpZiAoc2l6ZW9mKHRtcCkpCisgIHsKKyAgICBzdHJpbmcgKnJlcz0oe30pOworICAgIGZvcmVhY2goc3RyaW5nICpyb3c6IHRtcCkKKyAgICAgIHJlcys9KHtyb3dbMF19KTsKKyAgICByZXR1cm4gcmVzOworICB9CisgIHJldHVybiAwOworfQorCitwdWJsaWMgdmFyYXJncyBzdHJpbmcqIFF1ZXJ5WndlaXRpZXMob2JqZWN0IGVyc3RpZSkKK3sKKyAgcmV0dXJuIGdldF96d2VpdGllX2RhdGEoIm5hbWUiLCBlcnN0aWUgfHwgcHJldmlvdXNfb2JqZWN0KCkpOworfQorCitwdWJsaWMgdmFyYXJncyBzdHJpbmcgUXVlcnlGYW1pbGllKG9iamVjdCBwbCkKK3sKKyAgc3RyaW5nIGVyc3RpZSA9IGdldF9lcnN0aWVfZGF0YSgiZXJzdGlldXVpZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGwgfHwgcHJldmlvdXNfb2JqZWN0KCkpOworICAvLyBXZW5uICFlcnN0aWUsIGRhbm4gaXN0IHBsIGtlaW4gWndlaXRpZSwgYWxzbyBpc3QgZXIgc2VsYmVyIGVyc3RpZQorICBlcnN0aWUgfHw9IGdldHV1aWQocGwpOworICAvLyBqZXR6dCBub2NoIGd1Y2tlbiwgb2IgbmUgZXhwbGl6aXRlIEZhbWlsaWUgZnVlciBkZW4gZXJzdGllIGVyZmFzc3QgaXN0LgorICBtaXhlZCB0bXAgPSBzbF9leGVjKCJTRUxFQ1QgZmFtaWxpZSBGUk9NIGZhbWlsaWVuIFdIRVJFICIKKyAgICAgICAgICAgICAgICAgICAgICAiZXJzdGlldXVpZD0/MSIsZXJzdGllKTsKKyAgaWYgKHNpemVvZih0bXApKQorICAgIHJldHVybiB0bXBbMF1bMF07CisgIC8vIHdlbm4gbmljaHQsIGRhbm4gaXN0IGRpZSBGYW1pbGllIGRpZSBad2VpdGlldXVpZCAKKyAgcmV0dXJuIGVyc3RpZTsKK30KKwo=