ZGlmZiAtLWdpdCBhL21idGsvbWJ0a19saWIvc3JjL21idGtfaHR0cC5jIGIvbWJ0ay9tYnRrX2xpYi9zcmMvbWJ0a19odHRwLmMKaW5kZXggYjdhYjY3MS4uYTUwYjhlNSAxMDA3NTUKLS0tIGEvbWJ0ay9tYnRrX2xpYi9zcmMvbWJ0a19odHRwLmMKKysrIGIvbWJ0ay9tYnRrX2xpYi9zcmMvbWJ0a19odHRwLmMKQEAgLTIxLDkgKzIxLDYgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgQ29uc3RhbnRzIGFuZCBNYWNyb3MKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIEJVRkZFUl9TSVpFIDEwMjQKLQotCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgVmFyaWFibGVzOmxvY2FsCkBAIC00OTksNyArNDk2LDYgQEAKICAgICBjaGFyIGxpbmVbQlVGRkVSX1NJWkVdOwogICAgIGNoYXIgKnB0ciA9IE5VTEw7CiAgICAgaW50IGxlbiA9IDA7Ci0JaW50IHdyaXRlX2xlbiA9IDA7CiAgICAgd2hpbGUoKGxlbiA9IG1idGtfaHR0cF9yZWFkX2xpbmUoc2Vzc2lvbi0+c29ja19mZCxsaW5lLEJVRkZFUl9TSVpFKSkgPiAwKQogICAgIHsKICAgICAgICAgaWYoIW1lbWNtcChsaW5lLCJcclxuIiwyKSkKQEAgLTUwNyw3ICs1MDMsNyBAQAogICAgICAgICAgICAgTE9HRCgiUmVhZCBlbXB0eSBsaW5lLiIpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KLQkJCisKICAgICAgICAgLy8gRGVsZXRlICJcclxuIgogICAgICAgICBwdHIgPSBsaW5lICsgbGVuIC0gMTsgLy8gUG9pbnQgdG8gbGFzdCBjaGFyLgogICAgICAgICB3aGlsZShodHRwX2lzX3NwYWNlX2NoYXIoKnB0cikpCkBAIC01MTgsMjkgKzUxNCwxMyBAQAogICAgICAgICB9CiAKICAgICAgICAgTE9HVigiTElORTolcyIsbGluZSk7Ci0gICAgICAgIGlmKHNlc3Npb24tPnR5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qCi0gICAgCQlpZihzZXNzaW9uLT5maWxlX2ZkID49IDApCi0gICAgCQl7Ci0gICAgCQkJd3JpdGVfbGVuID0gd3JpdGUoc2Vzc2lvbi0+ZmlsZV9mZCwgbGluZSwgbGVuKTsKLSAgICAJICAgICAgICBpZih3cml0ZV9sZW4gPCBsZW4pIHsKLSAgICAJICAgICAgICAgICAgTE9HRSgid3JpdGUoKSBmYWlsLiIpOwotICAgIAkgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgCSAgICAgICAgfQotICAgIAkJfQotICAgIAkJKi8KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGh0dHBfaGFuZGxlc1tzZXNzaW9uLT5oYW5kbGVfaWRdLnNob3dfcnNwX2hlYWRlciAmJgotICAgICAgICAgICAgICAgaHR0cF9oYW5kbGVzW3Nlc3Npb24tPmhhbmRsZV9pZF0uZGF0YV9jYikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBodHRwX2hhbmRsZXNbc2Vzc2lvbi0+aGFuZGxlX2lkXS5kYXRhX2NiKHNlc3Npb24tPmlkLAotICAgICAgICAgICAgICAgICAgICAgICAgTUJUS19IVFRQX0RBVEFfSEVBREVSLGxpbmUsbGVuKTsKLSAgICAgICAgICAgIH0KIAotICAgICAgICB9ICAgICAgCisgICAgICAgIGlmKGh0dHBfaGFuZGxlc1tzZXNzaW9uLT5oYW5kbGVfaWRdLnNob3dfcnNwX2hlYWRlciAmJgorICAgICAgICAgICBodHRwX2hhbmRsZXNbc2Vzc2lvbi0+aGFuZGxlX2lkXS5kYXRhX2NiKQorICAgICAgICB7CisgICAgICAgICAgICBodHRwX2hhbmRsZXNbc2Vzc2lvbi0+aGFuZGxlX2lkXS5kYXRhX2NiKHNlc3Npb24tPmlkLAorICAgICAgICAgICAgICAgICAgICBNQlRLX0hUVFBfREFUQV9IRUFERVIsbGluZSxsZW4pOworICAgICAgICB9CiAKICAgICAgICAgaWYoIW1lbWNtcChsaW5lLCJIVFRQLyIsNSkpICAgLy8gIkhUVFAvMS4xIDIwMCBPSyIKICAgICAgICAgewpAQCAtNjc1LDcgKzY1NSw3IEBACiAgICAgY2hhciByZWFkX2J1ZltCVUZGRVJfU0laRSArIDFdOwogICAgIGludCByZWFkX2xlbiA9IDA7CiAgICAgY2hhciBjaHVua19idWZbQlVGRkVSX1NJWkUgKyAxXTsKLSAgICBpbnQgY2h1bmtfbGVuID0gMCwgd3JpdGVfbGVuPTA7CisgICAgaW50IGNodW5rX2xlbjsKICAgICBodHRwX2NodW5rX2luaXQoJmNodW5rZXIpOwogICAgIHdoaWxlKFRSVUUpCiAgICAgewpAQCAtNjk3LDI0ICs2NzcsOSBAQAogICAgICAgICBMT0dEKCJSZWFkIGNodW5rX2xlbjolZCIsY2h1bmtfbGVuKTsKICAgICAgICAgY2h1bmtfYnVmW2NodW5rX2xlbl0gPSAnXDAnOwogCi0gICAgICAgIGlmKHNlc3Npb24tPnR5cGUpCi0gICAgICAgIHsKLSAgICAJCWlmKHNlc3Npb24tPmZpbGVfZmQgPj0gMCkKLSAgICAJCXsKLSAgICAJCQl3cml0ZV9sZW4gPSB3cml0ZShzZXNzaW9uLT5maWxlX2ZkLCBjaHVua19idWYsIGNodW5rX2xlbik7Ci0gICAgCSAgICAgICAgaWYod3JpdGVfbGVuIDwgY2h1bmtfbGVuKSB7Ci0gICAgCSAgICAgICAgICAgIExPR0UoIndyaXRlKCkgZmFpbC4iKTsKLSAgICAJICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgIAkgICAgICAgIH0KLSAgICAJCX0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGh0dHBfaGFuZGxlc1tzZXNzaW9uLT5oYW5kbGVfaWRdLmRhdGFfY2IpCi0gICAgICAgICAgICAgICAgaHR0cF9oYW5kbGVzW3Nlc3Npb24tPmhhbmRsZV9pZF0uZGF0YV9jYihzZXNzaW9uLT5pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIE1CVEtfSFRUUF9EQVRBX0NPTlRFTlQsY2h1bmtfYnVmLGNodW5rX2xlbik7Ci0gICAgICAgICAgICB1c2xlZXAoMTAwMDAwKTsKLSAgICAgICAgfQorICAgICAgICBpZihodHRwX2hhbmRsZXNbc2Vzc2lvbi0+aGFuZGxlX2lkXS5kYXRhX2NiKQorICAgICAgICAgICAgaHR0cF9oYW5kbGVzW3Nlc3Npb24tPmhhbmRsZV9pZF0uZGF0YV9jYihzZXNzaW9uLT5pZCwKKyAgICAgICAgICAgICAgICAgICAgTUJUS19IVFRQX0RBVEFfQ09OVEVOVCxjaHVua19idWYsY2h1bmtfbGVuKTsKIAogICAgICAgICBpZihDSFVOS0VfU1RPUCA9PSBjaHVua19jb2RlKQogICAgICAgICB7CkBAIC03MzcsNyArNzAyLDYgQEAKICNkZWZpbmUgQlVGRkVSX1NJWkUgMjA0OAogICAgIGNoYXIgcmVhZF9idWZbQlVGRkVSX1NJWkUgKyAxXTsKICAgICBpbnQgcmVhZF9sZW4gPSAwOwotCWludCB3cml0ZV9sZW4gPSAwOwogICAgIGludDY0IHJlYWRfY291bnQgPSAwOwogICAgIHdoaWxlKFRSVUUpCiAgICAgewpAQCAtNzUyLDE1ICs3MTYsNiBAQAogICAgICAgICAKICAgICAgICAgaWYocmVhZF9jb3VudCArIHJlYWRfbGVuID49IHNlc3Npb24tPnJzcC5jb250ZW50X2xlbmd0aCkgICAvLyBSZWFkIGRhdGEgY29tcGxldGUuCiAgICAgICAgIHsKLSAgICAgICAgICAgIGlmKHNlc3Npb24tPmZpbGVfZmQgPj0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB3cml0ZV9sZW4gPSB3cml0ZShzZXNzaW9uLT5maWxlX2ZkLCByZWFkX2J1ZiwgcmVhZF9sZW4pOwotICAgICAgICAgICAgICAgIGlmKHdyaXRlX2xlbiA8IHJlYWRfbGVuKSB7Ci0gICAgICAgICAgICAgICAgICAgIExPR0UoIndyaXRlKCkgZmFpbC4iKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQogICAgICAgICAgICAgaWYoaHR0cF9oYW5kbGVzW3Nlc3Npb24tPmhhbmRsZV9pZF0uZGF0YV9jYikKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBodHRwX2hhbmRsZXNbc2Vzc2lvbi0+aGFuZGxlX2lkXS5kYXRhX2NiKHNlc3Npb24tPmlkLApAQCAtNzcyLDI5ICs3MjcsMTEgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKLSAgICAgICAgTE9HRSgicmVhZF9sZW4gOiVkLCBzZXNzaW9uLT50eXBlOiVkXG4iLCByZWFkX2xlbiwgc2Vzc2lvbi0+dHlwZSk7Ci0gICAgICAgIGlmKHNlc3Npb24tPnR5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKHNlc3Npb24tPmZpbGVfZmQgPj0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB3cml0ZV9sZW4gPSB3cml0ZShzZXNzaW9uLT5maWxlX2ZkLCByZWFkX2J1ZiwgcmVhZF9sZW4pOwotICAgICAgICAgICAgICAgIGlmKHdyaXRlX2xlbiA8IHJlYWRfbGVuKSB7Ci0gICAgICAgICAgICAgICAgICAgIExPR0UoIndyaXRlKCkgZmFpbC4iKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGh0dHBfaGFuZGxlc1tzZXNzaW9uLT5oYW5kbGVfaWRdLmRhdGFfY2IpCi0gICAgICAgICAgICAgICAgaHR0cF9oYW5kbGVzW3Nlc3Npb24tPmhhbmRsZV9pZF0uZGF0YV9jYihzZXNzaW9uLT5pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIE1CVEtfSFRUUF9EQVRBX0NPTlRFTlQscmVhZF9idWYscmVhZF9sZW4pOwotICAgICAgICAgICAgdXNsZWVwKDEwMDAwMCk7Ci0gICAgICAgIH0KKyAgICAgICAgaWYoaHR0cF9oYW5kbGVzW3Nlc3Npb24tPmhhbmRsZV9pZF0uZGF0YV9jYikKKyAgICAgICAgICAgIGh0dHBfaGFuZGxlc1tzZXNzaW9uLT5oYW5kbGVfaWRdLmRhdGFfY2Ioc2Vzc2lvbi0+aWQsCisgICAgICAgICAgICAgICAgICAgIE1CVEtfSFRUUF9EQVRBX0NPTlRFTlQscmVhZF9idWYscmVhZF9sZW4pOwogCiAgICAgICAgIHJlYWRfY291bnQgKz0gcmVhZF9sZW47Ci0gICAgICAgIExPR0UoIm1idGsxMTExMTExMTExMTExMTExMTExMTExMTEzYnkgcmVhZF9jb3VudDolZCwgcmVhZF9sZW46JWRcbi4iLCByZWFkX2NvdW50LCByZWFkX2xlbik7Ci0KICAgICB9CiAKICAgICByZXR1cm4gMDsKQEAgLTgwNiw3ICs3NDMsNiBAQAogI2RlZmluZSBCVUZGRVJfU0laRSAyMDQ4CiAgICAgY2hhciByZWFkX2J1ZltCVUZGRVJfU0laRSArIDFdOwogICAgIGludCByZWFkX2xlbiA9IDA7Ci0JaW50IHdyaXRlX2xlbiA9IDA7CiAgICAgd2hpbGUoVFJVRSkKICAgICB7CiAgICAgICAgIHJlYWRfbGVuID0gbWJ0a19odHRwX3JlYWQoc2Vzc2lvbi0+c29ja19mZCxyZWFkX2J1ZixCVUZGRVJfU0laRSwxMDAwKTsKQEAgLTgxOSwzMCArNzU1LDEyIEBACiAgICAgICAgICAgICAvL3JldHVybiAtMTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0JCQorCiAgICAgICAgIHJlYWRfYnVmW3JlYWRfbGVuXSA9ICdcMCc7CiAKLSAgICAgICAgaWYoc2Vzc2lvbi0+dHlwZSkKLSAgICAgICAgewotICAgIAkJaWYoc2Vzc2lvbi0+ZmlsZV9mZCA+PSAwKQotICAgIAkJewotICAgIAkJCXdyaXRlX2xlbiA9IHdyaXRlKHNlc3Npb24tPmZpbGVfZmQsIHJlYWRfYnVmLCByZWFkX2xlbik7Ci0gICAgCSAgICAgICAgaWYod3JpdGVfbGVuIDwgcmVhZF9sZW4pIHsKLSAgICAJICAgICAgICAgICAgTE9HRSgid3JpdGUoKSBmYWlsLiIpOwotICAgIAkgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgCSAgICAgICAgfQotICAgIAkJfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYoaHR0cF9oYW5kbGVzW3Nlc3Npb24tPmhhbmRsZV9pZF0uZGF0YV9jYikKLSAgICAgICAgICAgICAgICBodHRwX2hhbmRsZXNbc2Vzc2lvbi0+aGFuZGxlX2lkXS5kYXRhX2NiKHNlc3Npb24tPmlkLAotICAgICAgICAgICAgICAgICAgICAgICAgTUJUS19IVFRQX0RBVEFfQ09OVEVOVCxyZWFkX2J1ZixyZWFkX2xlbik7Ci0KLSAgICAgICAgICAgIHVzbGVlcCgxMDAwMDApOwotICAgICAgICB9Ci0gICAgICAgIExPR0UoIm1idGsxMTExMTExMTExMTExMTExMTExMTExMTExYnkgZ2VuZXJhbFxuLiIpOwotCisgICAgICAgIGlmKGh0dHBfaGFuZGxlc1tzZXNzaW9uLT5oYW5kbGVfaWRdLmRhdGFfY2IpCisgICAgICAgICAgICBodHRwX2hhbmRsZXNbc2Vzc2lvbi0+aGFuZGxlX2lkXS5kYXRhX2NiKHNlc3Npb24tPmlkLAorICAgICAgICAgICAgICAgICAgICBNQlRLX0hUVFBfREFUQV9DT05URU5ULHJlYWRfYnVmLHJlYWRfbGVuKTsKICAgICB9CiAKICAgICBpZihodHRwX2hhbmRsZXNbc2Vzc2lvbi0+aGFuZGxlX2lkXS5kYXRhX2NiKQpAQCAtODU3LDE4ICs3NzUsNyBAQAogewogICAgIExPR0koIlN0YXJ0IEhUVFAgcmVhZC4iKTsKICAgICBpbnQgcmVzdWx0ID0gMDsKLQkKIC8vICAgIHVzbGVlcCg1MDAwMDApOwotCWlmKHNlc3Npb24tPnR5cGUpCi0JewotCQlzZXNzaW9uLT5maWxlX2ZkID0gb3BlbigiL2h0dHBfdGVzdC50eHQiLCBPX1dST05MWXxPX1RSVU5DfE9fQ1JFQVR8T19BUFBFTkQsIDA2NjYpOwotCQotCQlpZihzZXNzaW9uLT5maWxlX2ZkIDwgMCkgewotCQkJTE9HRSgib3BlbigpIGZhaWwuIik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9Ci0KICAgICBzZXNzaW9uLT5zdGF0ZSA9IEhUVFBfU0VTU0lPTl9TVEFURV9SRUFEX0hFQURFUjsKICAgICBpZihodHRwX2hlYWRlcl9yZWFkKHNlc3Npb24pKQogICAgIHsKQEAgLTkxNywxOCArODI0LDYgQEAKIHJlYWRfZW5kOgogICAgIHNlc3Npb24tPnN0YXRlID0gSFRUUF9TRVNTSU9OX1NUQVRFX1JFQURfRU5EOwogCi0JaWYoc2Vzc2lvbi0+ZmlsZV9mZCA+PSAwKQotCXsKLQkJaWYoY2xvc2Uoc2Vzc2lvbi0+ZmlsZV9mZCkpCi0JCXsKLQkJCUxPR0koImNsb3NlKCkgZmFpbCBmaWxlX2ZkOiVkIixzZXNzaW9uLT5maWxlX2ZkKTsKLQkgICAgICAgIHNlc3Npb24tPmZpbGVfZmQgPSAtMTsKLQkJCXJldHVybiAtMTsKLQkJfQotCSAgICBzZXNzaW9uLT5maWxlX2ZkID0gLTE7Ci0JfQotCi0KICAgICBMT0dJKCJIVFRQIHJlcXVlc3QgY29tcGxldGVbcmVzdWx0IC0gJWRdLiIscmVzdWx0KTsKICAgICBpZihodHRwX3Nlc3Npb25fY2xvc2Uoc2Vzc2lvbikpCiAgICAgewpAQCAtMTE3MCwyNSArMTA2NSw2IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLWludCBtYnRrX2h0dHBfc2Vzc2lvbl90eXBlX3NldChpbnQgaGFuZGxlX2lkLCBpbnQgc2Vzc2lvbl9pZCwgbWJ0a19odHRwX3R5cGVfZW51bSB0eXBlKQotewotICAgIGlmKCFodHRwX3Nlc3Npb25fY2hlY2soaGFuZGxlX2lkLHNlc3Npb25faWQpKQotICAgIHsKLSAgICAgICAgTE9HRSgiU2Vzc2lvbiBlcnJvci4iKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIG1idGtfaHR0cF9zZXNzaW9uX3QgKnNlc3Npb24gPSBodHRwX2hhbmRsZXNbaGFuZGxlX2lkXS5zZXNzaW9uW3Nlc3Npb25faWRdOwotICAgIGlmKHNlc3Npb24tPnN0YXRlICE9IEhUVFBfU0VTU0lPTl9TVEFURV9OT04pCi0gICAgewotICAgICAgICBMT0dFKCJTZXNzaW9uIHN0YXRlIGVycm9yLlslZF0iLHNlc3Npb24tPnN0YXRlKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIHNlc3Npb24tPnR5cGUgPSB0eXBlOwotICAgIExPR0UoInNlc3Npb24tPnR5cGU6JWQsIHR5cGU6JWRcbiIsIHNlc3Npb24tPnR5cGUsIHR5cGUpOwotICAgIHJldHVybiAwOwotfQogCiBpbnQgbWJ0a19odHRwX3Nlc3Npb25faW5nbm9yZV9jZXJ0X3NldChpbnQgaGFuZGxlX2lkLCBpbnQgc2Vzc2lvbl9pZCwgYm9vbCBpbmdub3JlX2NlcnQpCiB7CkBAIC0xNTEzLDkxICsxMzg5LDQgQEAKICAgICByZXR1cm4gaHR0cF9oYW5kbGVzW2hhbmRsZV9pZF0uc2Vzc2lvbltzZXNzaW9uX2lkXTsKIH0KIAotaW50IG1idGtfaHR0cF9nZXRfZmlsZV9zaXplKGNoYXIgKmZpbGVfbmFtZSkKLXsKLQlpbnQgcmV0OwotCWludCBmZCA9IC0xOwotCXN0cnVjdCBzdGF0IGZpbGVfc3RhdDsKLQotICAgIExPR0UoIm1idGtfaHR0cF9nZXRfZmlsZV9zaXplKCkgc3RhcnRcbiIpOwotCi0JZmQgPSBvcGVuKGZpbGVfbmFtZSwgT19SRE9OTFkpOwkvLyA/P6GnoeM/YT8/P3QKLQlpZiAoZmQgPT0gLTEpIHsKLQkJcHJpbnRmKCJPcGVuIGZpbGUgJXMgZmFpbGVkXG4iLCBmaWxlX25hbWUpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXJldCA9IGZzdGF0KGZkLCAmZmlsZV9zdGF0KTsJLy8gPz+hp6GnPz8/P3Q/qKI/P6GnPz8KLQlpZiAocmV0ID09IC0xKSB7Ci0JCXByaW50ZigiR2V0IGZpbGUgJXMgc3RhdCBmYWlsZWRcbiIsIGZpbGVfbmFtZSk7Ci0JCWNsb3NlKGZkKTsKLQkJcmV0dXJuIC0xOwotCX0KLQljbG9zZShmZCk7Ci0gICAgTE9HRSgibWJ0a19odHRwX2dldF9maWxlX3NpemUoKSBlbmRcbiIpOwotCXJldHVybiBmaWxlX3N0YXQuc3Rfc2l6ZTsKLX0KLQotCi1pbnQgbWJ0a19odHRwX3JlYWRfZmlsZV9kYXRhKGludCBoYW5kbGVfaWQsIGludCBzZXNzaW9uX2lkLCAKLQkJCW1idGtfaHR0cF9kYXRhX2ZpbGVfdHlwZV9lbnVtIHR5cGUsaW50IG9mZnNldCwgbWJ0a19odHRwX2RhdGFfZmlsZV9jYWxsYmFja19mdW5jIGRhdGFfZmlsZV9jYikKLXsKLQotICAgIGlmKCFodHRwX3Nlc3Npb25fY2hlY2soaGFuZGxlX2lkLHNlc3Npb25faWQpKQotICAgIHsKLSAgICAgICAgTE9HRSgiU2Vzc2lvbiBlcnJvci4iKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIG1idGtfaHR0cF9zZXNzaW9uX3QgKnNlc3Npb24gPSBodHRwX2hhbmRsZXNbaGFuZGxlX2lkXS5zZXNzaW9uW3Nlc3Npb25faWRdOwotICAgIGlmKHNlc3Npb24gIT0gTlVMTCkKLSAgICB7Ci0JCWh0dHBfaGFuZGxlc1tzZXNzaW9uLT5oYW5kbGVfaWRdLmRhdGFfZmlsZV9jYiA9IGRhdGFfZmlsZV9jYjsKLQkKLQkJaWYodHlwZSkgLy8xIHJlYWQgZmlsZSBzaXplCi0JCXsKLQkJCWludCBzaXplID0gbWJ0a19odHRwX2dldF9maWxlX3NpemUoIi9odHRwX3Rlc3QudHh0Iik7Ci0JCQlodHRwX2hhbmRsZXNbc2Vzc2lvbi0+aGFuZGxlX2lkXS5kYXRhX2ZpbGVfY2IodHlwZSwgIE5VTEwsIHNpemUpOwotCQl9ZWxzZQkvL3JlYWQgZmlsZSBkYXRhCi0JCXsKLQkJCWNoYXIgYnVmWzEwMjQrMV0gPSB7MH07Ci0JCQlpbnQgcmV0ID0gMDsKLQotICAgICAgICAgICAgaW50IGZkID0gb3BlbigiL2h0dHBfdGVzdC50eHQiLCBPX1JET05MWSk7Ci0gICAgICAgICAgICBpZiAoZmQgPT0gLTEpIHsKLSAgICAgICAgICAgIAlwcmludGYoIk9wZW4gZmlsZSAlcyBmYWlsZWRcbiIsICIvaHR0cF90ZXN0LnR4dCIpOwotICAgICAgICAgICAgCXJldHVybiAtMTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYob2Zmc2V0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxzZWVrKGZkLCBvZmZzZXQsIFNFRUtfU0VUKTsKLSAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgdXNsZWVwKDUwMDAwMCk7Ci0gICAgICAgICAgICBpbnQgaW5kZXggPSAwOwotICAgICAgICAgICAgd2hpbGUoMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtZW1zZXQoYnVmLDAsIHNpemVvZihidWYpKTsKLSAgICAgICAgICAgICAgICByZXQgPSByZWFkKGZkLCBidWYsIDEwMjQpOwotICAgICAgICAgICAgICAgIHByaW50ZigicmV0ID0gJWQgLCAiLCByZXQpOwotICAgICAgICAgICAgICAgIHVzbGVlcCgxMDAwMDApOwotICAgICAgICAgICAgICAgIExPR0UoIm1idGssIHJlYWQgZmlsZTolc1xuIiwgYnVmKTsKLSAgICAgICAgICAgICAgICBpZihyZXQgPD0gMCkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBodHRwX2hhbmRsZXNbc2Vzc2lvbi0+aGFuZGxlX2lkXS5kYXRhX2ZpbGVfY2IodHlwZSwgYnVmLCByZXQpOwotICAgICAgICAgICAgICAgIGluZGV4Kys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjbG9zZShmZCk7Ci0gICAgICAgICAgICBwcmludGYoIiVkXG4iLCBpbmRleCk7Ci0KLSAgICAgICAgICAgIExPR0UoInJlYWQoKWVuZCAgaW5kZXg7OiVkLCByZXQ6JWQiLGluZGV4LHJldCk7Ci0JCX0KLQl9Ci0KLQotCXJldHVybiAwOwotfQotCi0KLQogCg==