ZGlmZiAtLWdpdCBhL0FuZHJvaWQubWsgYi9BbmRyb2lkLm1rCmluZGV4IDk3ZTYzNGIuLmE1MGFmMDIgMTAwNjQ0Ci0tLSBhL0FuZHJvaWQubWsKKysrIGIvQW5kcm9pZC5tawpAQCAtOCw5ICs4LDYgQEAKICAgICAgIGlmbmVxICgkKGZpbHRlciBtc204OTYwIGFwcTgwNjQgLCQoVEFSR0VUX0JPQVJEX1BMQVRGT1JNKSksKQogICAgICAgICAjRm9yIG1zbTg5NjAvYXBxODA2NCB0YXJnZXRzCiAgICAgICAgIGluY2x1ZGUgJChjYWxsIGFsbC1uYW1lZC1zdWJkaXItbWFrZWZpbGVzLG1zbTg5NjApCi0gICAgICBlbHNlIGlmbmVxICgkKGZpbHRlciBtc204OTc0ICwkKFRBUkdFVF9CT0FSRF9QTEFURk9STSkpLCkKLSAgICAgICAgI0ZvciBtc204OTc0IHRhcmdldAotICAgICAgICBpbmNsdWRlICQoY2FsbCBhbGwtbmFtZWQtc3ViZGlyLW1ha2VmaWxlcyxtc204OTc0KQogICAgICAgZWxzZSBpZm5lcSAoJChmaWx0ZXIgbXNtODA4NCAsJChUQVJHRVRfQk9BUkRfUExBVEZPUk0pKSwpCiAgICAgICAgICNGb3IgbXNtODA4NCB0YXJnZXQKICAgICAgICAgaW5jbHVkZSAkKGNhbGwgYWxsLW5hbWVkLXN1YmRpci1tYWtlZmlsZXMsbXNtODA4NCkKZGlmZiAtLWdpdCBhL21zbTg5NzQvQW5kcm9pZC5tayBiL21zbTg5NzQvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJjNWE1Ni4uMDAwMDAwMAotLS0gYS9tc204OTc0L0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWlmbmVxICgkKEJPQVJEX1ZFTkRPUl9RQ09NX0dQU19MT0NfQVBJX0hBUkRXQVJFKSwpCi1MT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCi0KLWluY2x1ZGUgJChjYWxsIGFsbC1tYWtlZmlsZXMtdW5kZXIsJChMT0NBTF9QQVRIKSkKLWVuZGlmCmRpZmYgLS1naXQgYS9tc204OTc0L2NvcmUvQW5kcm9pZC5tayBiL21zbTg5NzQvY29yZS9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjU4OThjLi4wMDAwMDAwCi0tLSBhL21zbTg5NzQvY29yZS9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotaWZuZXEgKCQoQk9BUkRfVkVORE9SX1FDT01fR1BTX0xPQ19BUElfSEFSRFdBUkUpLCkKLWlmbmVxICgkKEJVSUxEX1RJTllfQU5EUk9JRCksdHJ1ZSkKLQotTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfTU9EVUxFIDo9IGxpYmxvY19jb3JlCi1MT0NBTF9NT0RVTEVfT1dORVIgOj0gcWNvbQotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLSAgICBsaWJ1dGlscyBcCi0gICAgbGliY3V0aWxzIFwKLSAgICBsaWJncHMudXRpbHMgXAotICAgIGxpYmRsCi0KLUxPQ0FMX1NSQ19GSUxFUyArPSBcCi0gICAgTXNnVGFzay5jcHAgXAotICAgIExvY0FwaUJhc2UuY3BwIFwKLSAgICBMb2NBZGFwdGVyQmFzZS5jcHAgXAotICAgIENvbnRleHRCYXNlLmNwcCBcCi0gICAgTG9jRHVhbENvbnRleHQuY3BwIFwKLSAgICBsb2NfY29yZV9sb2cuY3BwCi0KLUxPQ0FMX0NGTEFHUyArPSBcCi0gICAgIC1mbm8tc2hvcnQtZW51bXMgXAotICAgICAtRF9BTkRST0lEXyBcCi0gICAgIC1Xbm8tdW51c2VkLXBhcmFtZXRlcgotCi1MT0NBTF9DX0lOQ0xVREVTOj0gXAotICAgICQoVEFSR0VUX09VVF9IRUFERVJTKS9ncHMudXRpbHMKLQotTE9DQUxfQ09QWV9IRUFERVJTX1RPOj0gbGlibG9jX2NvcmUvCi1MT0NBTF9DT1BZX0hFQURFUlM6PSBcCi0gICAgTXNnVGFzay5oIFwKLSAgICBMb2NBcGlCYXNlLmggXAotICAgIExvY0FkYXB0ZXJCYXNlLmggXAotICAgIENvbnRleHRCYXNlLmggXAotICAgIExvY0R1YWxDb250ZXh0LmggXAotICAgIExCU1Byb3h5QmFzZS5oIFwKLSAgICBVbHBQcm94eUJhc2UuaCBcCi0gICAgZ3BzX2V4dGVuZGVkX2MuaCBcCi0gICAgZ3BzX2V4dGVuZGVkLmggXAotICAgIGxvY19jb3JlX2xvZy5oIFwKLSAgICBMb2NBZGFwdGVyUHJveHlCYXNlLmgKLQotTE9DQUxfUFJFTElOS19NT0RVTEUgOj0gZmFsc2UKLQotaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQotCi1lbmRpZiAjIG5vdCBCVUlMRF9USU5ZX0FORFJPSUQKLWVuZGlmICMgQk9BUkRfVkVORE9SX1FDT01fR1BTX0xPQ19BUElfSEFSRFdBUkUKZGlmZiAtLWdpdCBhL21zbTg5NzQvY29yZS9Db250ZXh0QmFzZS5jcHAgYi9tc204OTc0L2NvcmUvQ29udGV4dEJhc2UuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzA1YTQ4Li4wMDAwMDAwCi0tLSBhL21zbTg5NzQvY29yZS9Db250ZXh0QmFzZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDExLTIwMTQsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCi0gKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKLSAqICAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24sIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCi0gKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKLSAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCi0gKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCi0gKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLSNkZWZpbmUgTE9HX05EREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJMb2NTdmNfQ3R4QmFzZSIKLQotI2luY2x1ZGUgPGRsZmNuLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL3NjaGVkX3BvbGljeS5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPENvbnRleHRCYXNlLmg+Ci0jaW5jbHVkZSA8bXNnX3EuaD4KLSNpbmNsdWRlIDxsb2NfdGFyZ2V0Lmg+Ci0jaW5jbHVkZSA8bG9nX3V0aWwuaD4KLSNpbmNsdWRlIDxsb2NfbG9nLmg+Ci0KLW5hbWVzcGFjZSBsb2NfY29yZSB7Ci0KLUxCU1Byb3h5QmFzZSogQ29udGV4dEJhc2U6OmdldExCU1Byb3h5KGNvbnN0IGNoYXIqIGxpYk5hbWUpCi17Ci0gICAgTEJTUHJveHlCYXNlKiBwcm94eSA9IE5VTEw7Ci0gICAgTE9DX0xPR0QoIiVzOiVkXTogZ2V0TEJTUHJveHkgbGlibmFtZTogJXNcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgbGliTmFtZSk7Ci0gICAgZGxlcnJvcigpOwotICAgIHZvaWQqIGxpYiA9IGRsb3BlbihsaWJOYW1lLCBSVExEX05PVyk7Ci0KLSAgICBpZiAoKHZvaWQqKU5VTEwgIT0gbGliKSB7Ci0gICAgICAgIGRsZXJyb3IoKTsKLSAgICAgICAgZ2V0TEJTUHJveHlfdCogZ2V0dGVyID0gKGdldExCU1Byb3h5X3QqKWRsc3ltKGxpYiwgImdldExCU1Byb3h5Iik7Ci0gICAgICAgIGlmIChOVUxMICE9IGdldHRlcikgewotICAgICAgICAgICAgcHJveHkgPSAoKmdldHRlcikoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIExPQ19MT0dEKCIlczolZF06IGdldHRlciBpcyBOVUxMLiBSZWFzb246ICVzIiwgX19mdW5jX18sIF9fTElORV9fLCBkbGVycm9yKCkpOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBMT0NfTE9HRCgiJXM6JWRdOiBsaWIgaXMgTlVMTC4gUmVhc29uOiAlcyIsIF9fZnVuY19fLCBfX0xJTkVfXywgZGxlcnJvcigpKTsKLSAgICB9Ci0gICAgaWYgKE5VTEwgPT0gcHJveHkpIHsKLSAgICAgICAgcHJveHkgPSBuZXcgTEJTUHJveHlCYXNlKCk7Ci0gICAgfQotICAgIExPQ19MT0dEKCIlczolZF06IEV4aXRpbmdcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0gICAgcmV0dXJuIHByb3h5OwotfQotCi1Mb2NBcGlCYXNlKiBDb250ZXh0QmFzZTo6Y3JlYXRlTG9jQXBpKExPQ19BUElfQURBUFRFUl9FVkVOVF9NQVNLX1QgZXhNYXNrKQotewotICAgIExvY0FwaUJhc2UqIGxvY0FwaSA9IE5VTEw7Ci0KLSAgICAvLyBmaXJzdCBpZiBjYW4gbm90IGJlIE1QUQotICAgIGlmIChUQVJHRVRfTVBRICE9IGxvY19nZXRfdGFyZ2V0KCkpIHsKLSAgICAgICAgaWYgKE5VTEwgPT0gKGxvY0FwaSA9IG1MQlNQcm94eS0+Z2V0TG9jQXBpKG1Nc2dUYXNrLCBleE1hc2ssIHRoaXMpKSkgewotICAgICAgICAgICAgdm9pZCAqaGFuZGxlID0gTlVMTDsKLSAgICAgICAgICAgIC8vdHJ5IHRvIHNlZSBpZiBMb2NBcGlWMDIgaXMgcHJlc2VudAotICAgICAgICAgICAgaWYoKGhhbmRsZSA9IGRsb3BlbigibGlibG9jX2FwaV92MDIuc28iLCBSVExEX05PVykpICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBMT0NfTE9HRCgiJXM6JWRdOiBsaWJsb2NfYXBpX3YwMi5zbyBpcyBwcmVzZW50IiwgX19mdW5jX18sIF9fTElORV9fKTsKLSAgICAgICAgICAgICAgICBkbGVycm9yKCk7Ci0gICAgICAgICAgICAgICAgZ2V0TG9jQXBpX3QqIGdldHRlciA9IChnZXRMb2NBcGlfdCopZGxzeW0oaGFuZGxlLCAiZ2V0TG9jQXBpIik7Ci0gICAgICAgICAgICAgICAgaWYoZ2V0dGVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgTE9DX0xPR0QoIiVzOiVkXTogZ2V0dGVyIGlzIG5vdCBOVUxMIGZvciBMb2NBcGlWMDIiLCBfX2Z1bmNfXywgX19MSU5FX18pOwotICAgICAgICAgICAgICAgICAgICBsb2NBcGkgPSAoKmdldHRlcikobU1zZ1Rhc2ssZXhNYXNrLCB0aGlzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIExPQ19MT0dEKCIlczolZF06IGdldHRlciBpcyBOVUxMLiBSZWFzb246ICVzIiwgX19mdW5jX18sIF9fTElORV9fLCBkbGVycm9yKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIG9ubHkgUlBDIGlzIHRoZSBvcHRpb24gbm93Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBMT0NfTE9HRCgiJXM6JWRdOiBsaWJsb2NfYXBpX3YwMi5zbyBpcyBOT1QgcHJlc2VudC4gVHJ5aW5nIFJQQyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIF9fTElORV9fKTsKLSAgICAgICAgICAgICAgICBoYW5kbGUgPSBkbG9wZW4oImxpYmxvY19hcGktcnBjLXFjLnNvIiwgUlRMRF9OT1cpOwotICAgICAgICAgICAgICAgIGlmIChOVUxMICE9IGhhbmRsZSkgewotICAgICAgICAgICAgICAgICAgICBnZXRMb2NBcGlfdCogZ2V0dGVyID0gKGdldExvY0FwaV90KilkbHN5bShoYW5kbGUsICJnZXRMb2NBcGkiKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKE5VTEwgIT0gZ2V0dGVyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMT0NfTE9HRCgiJXM6JWRdOiBnZXR0ZXIgaXMgTlVMTCBpbiBSUEMiLCBfX2Z1bmNfXywgX19MSU5FX18pOwotICAgICAgICAgICAgICAgICAgICAgICAgbG9jQXBpID0gKCpnZXR0ZXIpKG1Nc2dUYXNrLCBleE1hc2ssIHRoaXMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gbG9jQXBpIGNvdWxkIHN0aWxsIGJlIE5VTEwgYXQgdGhpcyB0aW1lCi0gICAgLy8gd2Ugd291bGQgdGhlbiBjcmVhdGUgYSBkdW1teSBvbmUKLSAgICBpZiAoTlVMTCA9PSBsb2NBcGkpIHsKLSAgICAgICAgbG9jQXBpID0gbmV3IExvY0FwaUJhc2UobU1zZ1Rhc2ssIGV4TWFzaywgdGhpcyk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGxvY0FwaTsKLX0KLQotQ29udGV4dEJhc2U6OkNvbnRleHRCYXNlKGNvbnN0IE1zZ1Rhc2sqIG1zZ1Rhc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgTE9DX0FQSV9BREFQVEVSX0VWRU5UX01BU0tfVCBleE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbGliTmFtZSkgOgotICAgIG1MQlNQcm94eShnZXRMQlNQcm94eShsaWJOYW1lKSksCi0gICAgbU1zZ1Rhc2sobXNnVGFzayksCi0gICAgbUxvY0FwaShjcmVhdGVMb2NBcGkoZXhNYXNrKSksCi0gICAgbUxvY0FwaVByb3h5KG1Mb2NBcGktPmdldExvY0FwaVByb3h5KCkpCi17Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL21zbTg5NzQvY29yZS9Db250ZXh0QmFzZS5oIGIvbXNtODk3NC9jb3JlL0NvbnRleHRCYXNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhZGJlZGQuLjAwMDAwMDAKLS0tIGEvbXNtODk3NC9jb3JlL0NvbnRleHRCYXNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxNCwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKLSAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAotICogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiwgbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKLSAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAotICogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKLSAqIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KLSAqIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotI2lmbmRlZiBfX0xPQ19DT05URVhUX0JBU0VfXwotI2RlZmluZSBfX0xPQ19DT05URVhUX0JBU0VfXwotCi0jaW5jbHVkZSA8c3RkYm9vbC5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8TXNnVGFzay5oPgotI2luY2x1ZGUgPExvY0FwaUJhc2UuaD4KLSNpbmNsdWRlIDxMQlNQcm94eUJhc2UuaD4KLQotbmFtZXNwYWNlIGxvY19jb3JlIHsKLQotY2xhc3MgTG9jQWRhcHRlckJhc2U7Ci0KLWNsYXNzIENvbnRleHRCYXNlIHsKLSAgICBzdGF0aWMgTEJTUHJveHlCYXNlKiBnZXRMQlNQcm94eShjb25zdCBjaGFyKiBsaWJOYW1lKTsKLSAgICBMb2NBcGlCYXNlKiBjcmVhdGVMb2NBcGkoTE9DX0FQSV9BREFQVEVSX0VWRU5UX01BU0tfVCBleGNsdWRlZE1hc2spOwotcHJvdGVjdGVkOgotICAgIGNvbnN0IExCU1Byb3h5QmFzZSogbUxCU1Byb3h5OwotICAgIGNvbnN0IE1zZ1Rhc2sqIG1Nc2dUYXNrOwotICAgIExvY0FwaUJhc2UqIG1Mb2NBcGk7Ci0gICAgTG9jQXBpUHJveHlCYXNlICptTG9jQXBpUHJveHk7Ci1wdWJsaWM6Ci0gICAgQ29udGV4dEJhc2UoY29uc3QgTXNnVGFzayogbXNnVGFzaywKLSAgICAgICAgICAgICAgICBMT0NfQVBJX0FEQVBURVJfRVZFTlRfTUFTS19UIGV4TWFzaywKLSAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBsaWJOYW1lKTsKLSAgICBpbmxpbmUgdmlydHVhbCB+Q29udGV4dEJhc2UoKSB7IGRlbGV0ZSBtTG9jQXBpOyBkZWxldGUgbUxCU1Byb3h5OyB9Ci0KLSAgICBpbmxpbmUgY29uc3QgTXNnVGFzayogZ2V0TXNnVGFzaygpIHsgcmV0dXJuIG1Nc2dUYXNrOyB9Ci0gICAgaW5saW5lIExvY0FwaUJhc2UqIGdldExvY0FwaSgpIHsgcmV0dXJuIG1Mb2NBcGk7IH0KLSAgICBpbmxpbmUgTG9jQXBpUHJveHlCYXNlKiBnZXRMb2NBcGlQcm94eSgpIHsgcmV0dXJuIG1Mb2NBcGlQcm94eTsgfQotICAgIGlubGluZSBib29sIGhhc0FncHNFeHRlbmRlZENhcGFiaWxpdGllcygpIHsgcmV0dXJuIG1MQlNQcm94eS0+aGFzQWdwc0V4dGVuZGVkQ2FwYWJpbGl0aWVzKCk7IH0KLSAgICBpbmxpbmUgYm9vbCBoYXNDUElFeHRlbmRlZENhcGFiaWxpdGllcygpIHsgcmV0dXJuIG1MQlNQcm94eS0+aGFzQ1BJRXh0ZW5kZWRDYXBhYmlsaXRpZXMoKTsgfQotICAgIGlubGluZSB2b2lkIHJlcXVlc3RVbHAoTG9jQWRhcHRlckJhc2UqIGFkYXB0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGNhcGFiaWxpdGllcykgewotICAgICAgICBtTEJTUHJveHktPnJlcXVlc3RVbHAoYWRhcHRlciwgY2FwYWJpbGl0aWVzKTsKLSAgICB9Ci0gICAgaW5saW5lIHZvaWQgc2VuZE1zZyhjb25zdCBMb2NNc2cgKm1zZykgeyBnZXRNc2dUYXNrKCktPnNlbmRNc2cobXNnKTsgfQotfTsKLQotfSAvLyBuYW1lc3BhY2UgbG9jX2NvcmUKLQotI2VuZGlmIC8vX19MT0NfQ09OVEVYVF9CQVNFX18KZGlmZiAtLWdpdCBhL21zbTg5NzQvY29yZS9JemF0UHJveHlCYXNlLmggYi9tc204OTc0L2NvcmUvSXphdFByb3h5QmFzZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2UzZDNmLi4wMDAwMDAwCi0tLSBhL21zbTg5NzQvY29yZS9JemF0UHJveHlCYXNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTMsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCi0gKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKLSAqICAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24sIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCi0gKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKLSAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCi0gKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCi0gKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLSNpZm5kZWYgSVpBVF9QUk9YWV9CQVNFX0gKLSNkZWZpbmUgSVpBVF9QUk9YWV9CQVNFX0gKLQotI2luY2x1ZGUgPGdwc19leHRlbmRlZC5oPgotI2luY2x1ZGUgPE1zZ1Rhc2suaD4KLQotbmFtZXNwYWNlIGxvY19jb3JlIHsKLQotY2xhc3MgTG9jQXBpQmFzZTsKLWNsYXNzIExvY0FkYXB0ZXJCYXNlOwotCi1jbGFzcyBJemF0UHJveHlCYXNlIHsKLSAgICBmcmllbmQgY2xhc3MgQ29udGV4dEJhc2U7Ci0gICAgaW5saW5lIHZpcnR1YWwgTG9jQXBpQmFzZSoKLSAgICAgICAgZ2V0TG9jQXBpKGNvbnN0IE1zZ1Rhc2sqIG1zZ1Rhc2ssCi0gICAgICAgICAgICAgICAgICBMT0NfQVBJX0FEQVBURVJfRVZFTlRfTUFTS19UIGV4TWFzaykgY29uc3QgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci1wcm90ZWN0ZWQ6Ci0gICAgaW5saW5lIEl6YXRQcm94eUJhc2UoKSB7fQotcHVibGljOgotICAgIGlubGluZSB2aXJ0dWFsIH5JemF0UHJveHlCYXNlKCkge30KLSAgICBpbmxpbmUgdmlydHVhbCB2b2lkIHJlcXVlc3RVbHAoTG9jQWRhcHRlckJhc2UqIGFkYXB0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgY2FwYWJpbGl0aWVzKSBjb25zdCB7fQotICAgIGlubGluZSB2aXJ0dWFsIGJvb2wgaGFzQWdwc0V4dCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci19OwotCi10eXBlZGVmIEl6YXRQcm94eUJhc2UqIChnZXRJemF0UHJveHlfdCkoKTsKLQotfSAvLyBuYW1lc3BhY2UgbG9jX2NvcmUKLQotI2VuZGlmIC8vIElaQVRfUFJPWFlfQkFTRV9ICmRpZmYgLS1naXQgYS9tc204OTc0L2NvcmUvTEJTUHJveHlCYXNlLmggYi9tc204OTc0L2NvcmUvTEJTUHJveHlCYXNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiN2RiZGYuLjAwMDAwMDAKLS0tIGEvbXNtODk3NC9jb3JlL0xCU1Byb3h5QmFzZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTQsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCi0gKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKLSAqICAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24sIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCi0gKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKLSAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCi0gKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCi0gKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLSNpZm5kZWYgSVpBVF9QUk9YWV9CQVNFX0gKLSNkZWZpbmUgSVpBVF9QUk9YWV9CQVNFX0gKLSNpbmNsdWRlIDxncHNfZXh0ZW5kZWQuaD4KLSNpbmNsdWRlIDxNc2dUYXNrLmg+Ci0KLW5hbWVzcGFjZSBsb2NfY29yZSB7Ci0KLWNsYXNzIExvY0FwaUJhc2U7Ci1jbGFzcyBMb2NBZGFwdGVyQmFzZTsKLWNsYXNzIENvbnRleHRCYXNlOwotCi1jbGFzcyBMQlNQcm94eUJhc2UgewotICAgIGZyaWVuZCBjbGFzcyBDb250ZXh0QmFzZTsKLSAgICBpbmxpbmUgdmlydHVhbCBMb2NBcGlCYXNlKgotICAgICAgICBnZXRMb2NBcGkoY29uc3QgTXNnVGFzayogbXNnVGFzaywKLSAgICAgICAgICAgICAgICAgIExPQ19BUElfQURBUFRFUl9FVkVOVF9NQVNLX1QgZXhNYXNrLAotICAgICAgICAgICAgICAgICAgQ29udGV4dEJhc2UqIGNvbnRleHQpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotcHJvdGVjdGVkOgotICAgIGlubGluZSBMQlNQcm94eUJhc2UoKSB7fQotcHVibGljOgotICAgIGlubGluZSB2aXJ0dWFsIH5MQlNQcm94eUJhc2UoKSB7fQotICAgIGlubGluZSB2aXJ0dWFsIHZvaWQgcmVxdWVzdFVscChMb2NBZGFwdGVyQmFzZSogYWRhcHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBjYXBhYmlsaXRpZXMpIGNvbnN0IHt9Ci0gICAgaW5saW5lIHZpcnR1YWwgYm9vbCBoYXNBZ3BzRXh0ZW5kZWRDYXBhYmlsaXRpZXMoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotICAgIGlubGluZSB2aXJ0dWFsIGJvb2wgaGFzQ1BJRXh0ZW5kZWRDYXBhYmlsaXRpZXMoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotICAgIHZpcnR1YWwgdm9pZCBpbmplY3RGZWF0dXJlQ29uZmlnKENvbnRleHRCYXNlKiBjb250ZXh0KSBjb25zdCB7fQotfTsKLQotdHlwZWRlZiBMQlNQcm94eUJhc2UqIChnZXRMQlNQcm94eV90KSgpOwotCi19IC8vIG5hbWVzcGFjZSBsb2NfY29yZQotCi0jZW5kaWYgLy8gSVpBVF9QUk9YWV9CQVNFX0gKZGlmZiAtLWdpdCBhL21zbTg5NzQvY29yZS9Mb2NBZGFwdGVyQmFzZS5jcHAgYi9tc204OTc0L2NvcmUvTG9jQWRhcHRlckJhc2UuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzE4NGRmLi4wMDAwMDAwCi0tLSBhL21zbTg5NzQvY29yZS9Mb2NBZGFwdGVyQmFzZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDExLTIwMTQsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCi0gKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKLSAqICAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24sIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCi0gKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKLSAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCi0gKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCi0gKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLSNkZWZpbmUgTE9HX05EREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJMb2NTdmNfTG9jQWRhcHRlckJhc2UiCi0KLSNpbmNsdWRlIDxkbGZjbi5oPgotI2luY2x1ZGUgPExvY0FkYXB0ZXJCYXNlLmg+Ci0jaW5jbHVkZSA8bG9jX3RhcmdldC5oPgotI2luY2x1ZGUgPGxvZ191dGlsLmg+Ci0jaW5jbHVkZSA8TG9jQWRhcHRlclByb3h5QmFzZS5oPgotCi1uYW1lc3BhY2UgbG9jX2NvcmUgewotCi0vLyBUaGlzIGlzIHRoZSB0b3AgbGV2ZWwgY2xhc3MsIHNvIHRoZSBjb25zdHJ1Y3RvciB3aWxsCi0vLyBhbHdheXMgZ2V0cyBjYWxsZWQuIEhlcmUgd2UgcHJlcGFyZSBmb3IgdGhlIGRlZmF1bHQuCi0vLyBCdXQgaWYgZ2V0TG9jQXBpKHRhcmdldEVudW1UeXBlIHRhcmdldCkgaXMgb3ZlcnJpZGVuLAotLy8gdGhlIHJpZ2h0IGxvY0FwaSBzaG91bGQgZ2V0IGNyZWF0ZWQuCi1Mb2NBZGFwdGVyQmFzZTo6TG9jQWRhcHRlckJhc2UoY29uc3QgTE9DX0FQSV9BREFQVEVSX0VWRU5UX01BU0tfVCBtYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHRCYXNlKiBjb250ZXh0LCBMb2NBZGFwdGVyUHJveHlCYXNlICphZGFwdGVyUHJveHlCYXNlKSA6Ci0gICAgbUV2dE1hc2sobWFzayksIG1Db250ZXh0KGNvbnRleHQpLAotICAgIG1Mb2NBcGkoY29udGV4dC0+Z2V0TG9jQXBpKCkpLCBtTG9jQWRhcHRlclByb3h5QmFzZShhZGFwdGVyUHJveHlCYXNlKSwKLSAgICBtTXNnVGFzayhjb250ZXh0LT5nZXRNc2dUYXNrKCkpCi17Ci0gICAgbUxvY0FwaS0+YWRkQWRhcHRlcih0aGlzKTsKLX0KLQotdm9pZCBMb2NBZGFwdGVyQmFzZTo6aGFuZGxlRW5naW5lVXBFdmVudCgpCi17Ci0gICAgaWYgKG1Mb2NBZGFwdGVyUHJveHlCYXNlKSB7Ci0gICAgICAgIG1Mb2NBZGFwdGVyUHJveHlCYXNlLT5oYW5kbGVFbmdpbmVVcEV2ZW50KCk7Ci0gICAgfQotfQotCi12b2lkIExvY0FkYXB0ZXJCYXNlOjpoYW5kbGVFbmdpbmVEb3duRXZlbnQoKQotewotICAgIGlmIChtTG9jQWRhcHRlclByb3h5QmFzZSkgewotICAgICAgICBtTG9jQWRhcHRlclByb3h5QmFzZS0+aGFuZGxlRW5naW5lRG93bkV2ZW50KCk7Ci0gICAgfQotfQotCi12b2lkIExvY0FkYXB0ZXJCYXNlOjoKLSAgICByZXBvcnRQb3NpdGlvbihVbHBMb2NhdGlvbiAmbG9jYXRpb24sCi0gICAgICAgICAgICAgICAgICAgR3BzTG9jYXRpb25FeHRlbmRlZCAmbG9jYXRpb25FeHRlbmRlZCwKLSAgICAgICAgICAgICAgICAgICB2b2lkKiBsb2NhdGlvbkV4dCwKLSAgICAgICAgICAgICAgICAgICBlbnVtIGxvY19zZXNzX3N0YXR1cyBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgTG9jUG9zVGVjaE1hc2sgbG9jX3RlY2hub2xvZ3lfbWFzaykKLURFRkFVTFRfSU1QTCgpCi0KLXZvaWQgTG9jQWRhcHRlckJhc2U6OgotICAgIHJlcG9ydFN2KEdwc1N2U3RhdHVzICZzdlN0YXR1cywKLSAgICAgICAgICAgICBHcHNMb2NhdGlvbkV4dGVuZGVkICZsb2NhdGlvbkV4dGVuZGVkLAotICAgICAgICAgICAgIHZvaWQqIHN2RXh0KQotREVGQVVMVF9JTVBMKCkKLQotCi12b2lkIExvY0FkYXB0ZXJCYXNlOjoKLSAgICByZXBvcnRTdGF0dXMoR3BzU3RhdHVzVmFsdWUgc3RhdHVzKQotREVGQVVMVF9JTVBMKCkKLQotCi12b2lkIExvY0FkYXB0ZXJCYXNlOjoKLSAgICByZXBvcnRObWVhKGNvbnN0IGNoYXIqIG5tZWEsIGludCBsZW5ndGgpCi1ERUZBVUxUX0lNUEwoKQotCi1ib29sIExvY0FkYXB0ZXJCYXNlOjoKLSAgICByZXBvcnRYdHJhU2VydmVyKGNvbnN0IGNoYXIqIHVybDEsIGNvbnN0IGNoYXIqIHVybDIsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB1cmwzLCBjb25zdCBpbnQgbWF4bGVuZ3RoKQotREVGQVVMVF9JTVBMKGZhbHNlKQotCi1ib29sIExvY0FkYXB0ZXJCYXNlOjoKLSAgICByZXF1ZXN0WHRyYURhdGEoKQotREVGQVVMVF9JTVBMKGZhbHNlKQotCi1ib29sIExvY0FkYXB0ZXJCYXNlOjoKLSAgICByZXF1ZXN0VGltZSgpCi1ERUZBVUxUX0lNUEwoZmFsc2UpCi0KLWJvb2wgTG9jQWRhcHRlckJhc2U6OgotICAgIHJlcXVlc3RMb2NhdGlvbigpCi1ERUZBVUxUX0lNUEwoZmFsc2UpCi0KLWJvb2wgTG9jQWRhcHRlckJhc2U6OgotICAgIHJlcXVlc3RBVEwoaW50IGNvbm5IYW5kbGUsIEFHcHNUeXBlIGFncHNfdHlwZSkKLURFRkFVTFRfSU1QTChmYWxzZSkKLQotYm9vbCBMb2NBZGFwdGVyQmFzZTo6Ci0gICAgcmVsZWFzZUFUTChpbnQgY29ubkhhbmRsZSkKLURFRkFVTFRfSU1QTChmYWxzZSkKLQotYm9vbCBMb2NBZGFwdGVyQmFzZTo6Ci0gICAgcmVxdWVzdFN1cGxFUyhpbnQgY29ubkhhbmRsZSkKLURFRkFVTFRfSU1QTChmYWxzZSkKLQotYm9vbCBMb2NBZGFwdGVyQmFzZTo6Ci0gICAgcmVwb3J0RGF0YUNhbGxPcGVuZWQoKQotREVGQVVMVF9JTVBMKGZhbHNlKQotCi1ib29sIExvY0FkYXB0ZXJCYXNlOjoKLSAgICByZXBvcnREYXRhQ2FsbENsb3NlZCgpCi1ERUZBVUxUX0lNUEwoZmFsc2UpCi0KLWJvb2wgTG9jQWRhcHRlckJhc2U6OgotICAgIHJlcXVlc3ROaU5vdGlmeShHcHNOaU5vdGlmaWNhdGlvbiAmbm90aWZ5LCBjb25zdCB2b2lkKiBkYXRhKQotREVGQVVMVF9JTVBMKGZhbHNlKQotCi12b2lkIExvY0FkYXB0ZXJCYXNlOjoKLSAgICBzaHV0ZG93bigpCi1ERUZBVUxUX0lNUEwoKQotCi12b2lkIExvY0FkYXB0ZXJCYXNlOjoKLSAgICByZXBvcnRHcHNNZWFzdXJlbWVudERhdGEoR3BzRGF0YSAmZ3BzTWVhc3VyZW1lbnREYXRhKQotREVGQVVMVF9JTVBMKCkKLX0gLy8gbmFtZXNwYWNlIGxvY19jb3JlCmRpZmYgLS1naXQgYS9tc204OTc0L2NvcmUvTG9jQWRhcHRlckJhc2UuaCBiL21zbTg5NzQvY29yZS9Mb2NBZGFwdGVyQmFzZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmZmMjZhLi4wMDAwMDAwCi0tLSBhL21zbTg5NzQvY29yZS9Mb2NBZGFwdGVyQmFzZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMS0yMDE0LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZwotICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCi0gKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uLCBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAotICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgotICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCi0gKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQotICogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgotICogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0jaWZuZGVmIExPQ19BUElfQURBUFRFUl9CQVNFX0gKLSNkZWZpbmUgTE9DX0FQSV9BREFQVEVSX0JBU0VfSAotCi0jaW5jbHVkZSA8Z3BzX2V4dGVuZGVkLmg+Ci0jaW5jbHVkZSA8VWxwUHJveHlCYXNlLmg+Ci0jaW5jbHVkZSA8Q29udGV4dEJhc2UuaD4KLQotbmFtZXNwYWNlIGxvY19jb3JlIHsKLQotY2xhc3MgTG9jQWRhcHRlclByb3h5QmFzZTsKLQotY2xhc3MgTG9jQWRhcHRlckJhc2UgewotcHJvdGVjdGVkOgotICAgIGNvbnN0IExPQ19BUElfQURBUFRFUl9FVkVOVF9NQVNLX1QgbUV2dE1hc2s7Ci0gICAgQ29udGV4dEJhc2UqIG1Db250ZXh0OwotICAgIExvY0FwaUJhc2UqIG1Mb2NBcGk7Ci0gICAgTG9jQWRhcHRlclByb3h5QmFzZSogbUxvY0FkYXB0ZXJQcm94eUJhc2U7Ci0gICAgY29uc3QgTXNnVGFzayogbU1zZ1Rhc2s7Ci0KLSAgICBpbmxpbmUgTG9jQWRhcHRlckJhc2UoY29uc3QgTXNnVGFzayogbXNnVGFzaykgOgotICAgICAgICBtRXZ0TWFzaygwKSwgbUNvbnRleHQoTlVMTCksIG1Mb2NBcGkoTlVMTCksIG1Mb2NBZGFwdGVyUHJveHlCYXNlKE5VTEwpLCBtTXNnVGFzayhtc2dUYXNrKSB7fQotcHVibGljOgotICAgIGlubGluZSB2aXJ0dWFsIH5Mb2NBZGFwdGVyQmFzZSgpIHsgbUxvY0FwaS0+cmVtb3ZlQWRhcHRlcih0aGlzKTsgfQotICAgIExvY0FkYXB0ZXJCYXNlKGNvbnN0IExPQ19BUElfQURBUFRFUl9FVkVOVF9NQVNLX1QgbWFzaywKLSAgICAgICAgICAgICAgICAgICBDb250ZXh0QmFzZSogY29udGV4dCwgTG9jQWRhcHRlclByb3h5QmFzZSAqYWRhcHRlclByb3h5QmFzZSA9IE5VTEwpOwotICAgIGlubGluZSBMT0NfQVBJX0FEQVBURVJfRVZFTlRfTUFTS19UCi0gICAgICAgIGNoZWNrTWFzayhMT0NfQVBJX0FEQVBURVJfRVZFTlRfTUFTS19UIG1hc2spIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIG1FdnRNYXNrICYgbWFzazsKLSAgICB9Ci0KLSAgICBpbmxpbmUgTE9DX0FQSV9BREFQVEVSX0VWRU5UX01BU0tfVCBnZXRFdnRNYXNrKCkgY29uc3QgewotICAgICAgICByZXR1cm4gbUV2dE1hc2s7Ci0gICAgfQotCi0gICAgaW5saW5lIHZvaWQgc2VuZE1zZyhjb25zdCBMb2NNc2cqIG1zZykgY29uc3QgewotICAgICAgICBtTXNnVGFzay0+c2VuZE1zZyhtc2cpOwotICAgIH0KLQotICAgIGlubGluZSB2b2lkIHNlbmRNc2coY29uc3QgTG9jTXNnKiBtc2cpIHsKLSAgICAgICAgbU1zZ1Rhc2stPnNlbmRNc2cobXNnKTsKLSAgICB9Ci0KLSAgICAvLyBUaGlzIHdpbGwgYmUgb3ZlcnJpZGRlbiBieSB0aGUgaW5kaXZpZHVhbCBhZGFwdGVycwotICAgIC8vIGlmIG5lY2Vzc2FyeS4KLSAgICBpbmxpbmUgdmlydHVhbCB2b2lkIHNldFVscFByb3h5KFVscFByb3h5QmFzZSogdWxwKSB7fQotICAgIHZpcnR1YWwgdm9pZCBoYW5kbGVFbmdpbmVVcEV2ZW50KCk7Ci0gICAgdmlydHVhbCB2b2lkIGhhbmRsZUVuZ2luZURvd25FdmVudCgpOwotICAgIGlubGluZSB2aXJ0dWFsIHZvaWQgc2V0UG9zaXRpb25Nb2RlSW50KExvY1Bvc01vZGUmIHBvc01vZGUpIHt9Ci0gICAgdmlydHVhbCB2b2lkIHN0YXJ0Rml4SW50KCkge30KLSAgICB2aXJ0dWFsIHZvaWQgc3RvcEZpeEludCgpIHt9Ci0gICAgdmlydHVhbCB2b2lkIGdldFpwcEludCgpIHt9Ci0gICAgdmlydHVhbCB2b2lkIHJlcG9ydFBvc2l0aW9uKFVscExvY2F0aW9uICZsb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3BzTG9jYXRpb25FeHRlbmRlZCAmbG9jYXRpb25FeHRlbmRlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogbG9jYXRpb25FeHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gbG9jX3Nlc3Nfc3RhdHVzIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jUG9zVGVjaE1hc2sgbG9jX3RlY2hub2xvZ3lfbWFzayk7Ci0gICAgdmlydHVhbCB2b2lkIHJlcG9ydFN2KEdwc1N2U3RhdHVzICZzdlN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgR3BzTG9jYXRpb25FeHRlbmRlZCAmbG9jYXRpb25FeHRlbmRlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogc3ZFeHQpOwotICAgIHZpcnR1YWwgdm9pZCByZXBvcnRTdGF0dXMoR3BzU3RhdHVzVmFsdWUgc3RhdHVzKTsKLSAgICB2aXJ0dWFsIHZvaWQgcmVwb3J0Tm1lYShjb25zdCBjaGFyKiBubWVhLCBpbnQgbGVuZ3RoKTsKLSAgICB2aXJ0dWFsIGJvb2wgcmVwb3J0WHRyYVNlcnZlcihjb25zdCBjaGFyKiB1cmwxLCBjb25zdCBjaGFyKiB1cmwyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHVybDMsIGNvbnN0IGludCBtYXhsZW5ndGgpOwotICAgIHZpcnR1YWwgYm9vbCByZXF1ZXN0WHRyYURhdGEoKTsKLSAgICB2aXJ0dWFsIGJvb2wgcmVxdWVzdFRpbWUoKTsKLSAgICB2aXJ0dWFsIGJvb2wgcmVxdWVzdExvY2F0aW9uKCk7Ci0gICAgdmlydHVhbCBib29sIHJlcXVlc3RBVEwoaW50IGNvbm5IYW5kbGUsIEFHcHNUeXBlIGFncHNfdHlwZSk7Ci0gICAgdmlydHVhbCBib29sIHJlbGVhc2VBVEwoaW50IGNvbm5IYW5kbGUpOwotICAgIHZpcnR1YWwgYm9vbCByZXF1ZXN0U3VwbEVTKGludCBjb25uSGFuZGxlKTsKLSAgICB2aXJ0dWFsIGJvb2wgcmVwb3J0RGF0YUNhbGxPcGVuZWQoKTsKLSAgICB2aXJ0dWFsIGJvb2wgcmVwb3J0RGF0YUNhbGxDbG9zZWQoKTsKLSAgICB2aXJ0dWFsIGJvb2wgcmVxdWVzdE5pTm90aWZ5KEdwc05pTm90aWZpY2F0aW9uICZub3RpZnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBkYXRhKTsKLSAgICBpbmxpbmUgdmlydHVhbCBib29sIGlzSW5TZXNzaW9uKCkgeyByZXR1cm4gZmFsc2U7IH0KLSAgICB2aXJ0dWFsIHZvaWQgc2h1dGRvd24oKTsKLSAgICBDb250ZXh0QmFzZSogZ2V0Q29udGV4dCgpIGNvbnN0IHsgcmV0dXJuIG1Db250ZXh0OyB9Ci0gICAgdmlydHVhbCB2b2lkIHJlcG9ydEdwc01lYXN1cmVtZW50RGF0YShHcHNEYXRhICZncHNNZWFzdXJlbWVudERhdGEpOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgbG9jX2NvcmUKLQotI2VuZGlmIC8vTE9DX0FQSV9BREFQVEVSX0JBU0VfSApkaWZmIC0tZ2l0IGEvbXNtODk3NC9jb3JlL0xvY0FkYXB0ZXJQcm94eUJhc2UuaCBiL21zbTg5NzQvY29yZS9Mb2NBZGFwdGVyUHJveHlCYXNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1YWYxMGIuLjAwMDAwMDAKLS0tIGEvbXNtODk3NC9jb3JlL0xvY0FkYXB0ZXJQcm94eUJhc2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxNCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZwotICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCi0gKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uLCBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAotICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgotICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCi0gKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQotICogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgotICogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpZm5kZWYgTE9DX0FEQVBURVJfUFJPWFlfQkFTRV9ICi0jZGVmaW5lIExPQ19BREFQVEVSX1BST1hZX0JBU0VfSAotCi0jaW5jbHVkZSA8Q29udGV4dEJhc2UuaD4KLSNpbmNsdWRlIDxncHNfZXh0ZW5kZWQuaD4KLQotbmFtZXNwYWNlIGxvY19jb3JlIHsKLQotY2xhc3MgTG9jQWRhcHRlclByb3h5QmFzZSB7Ci1wcml2YXRlOgotICAgIGNvbnN0IExvY0FkYXB0ZXJCYXNlICptTG9jQWRhcHRlckJhc2U7Ci1wcm90ZWN0ZWQ6Ci0gICAgaW5saW5lIExvY0FkYXB0ZXJQcm94eUJhc2UoY29uc3QgTE9DX0FQSV9BREFQVEVSX0VWRU5UX01BU0tfVCBtYXNrLAotICAgICAgICAgICAgICAgICAgIENvbnRleHRCYXNlKiBjb250ZXh0KToKLSAgICAgICAgICAgICAgICAgICBtTG9jQWRhcHRlckJhc2UobmV3IExvY0FkYXB0ZXJCYXNlKG1hc2ssIGNvbnRleHQsIHRoaXMpKSB7Ci0gICAgfQotICAgIGlubGluZSB2aXJ0dWFsIH5Mb2NBZGFwdGVyUHJveHlCYXNlKCkgewotICAgICAgICBkZWxldGUgbUxvY0FkYXB0ZXJCYXNlOwotICAgIH0KLSAgICBDb250ZXh0QmFzZSogZ2V0Q29udGV4dCgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIG1Mb2NBZGFwdGVyQmFzZS0+Z2V0Q29udGV4dCgpOwotICAgIH0KLXB1YmxpYzoKLSAgICBpbmxpbmUgdmlydHVhbCB2b2lkIGhhbmRsZUVuZ2luZVVwRXZlbnQoKSB7fTsKLSAgICBpbmxpbmUgdmlydHVhbCB2b2lkIGhhbmRsZUVuZ2luZURvd25FdmVudCgpIHt9OwotfTsKLQotfSAvLyBuYW1lc3BhY2UgbG9jX2NvcmUKLQotI2VuZGlmIC8vTE9DX0FEQVBURVJfUFJPWFlfQkFTRV9ICmRpZmYgLS1naXQgYS9tc204OTc0L2NvcmUvTG9jQXBpQmFzZS5jcHAgYi9tc204OTc0L2NvcmUvTG9jQXBpQmFzZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5NjlmZTUuLjAwMDAwMDAKLS0tIGEvbXNtODk3NC9jb3JlL0xvY0FwaUJhc2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNTA2ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMS0yMDE0LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZwotICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCi0gKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uLCBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAotICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgotICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCi0gKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQotICogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgotICogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0jZGVmaW5lIExPR19ORERFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiTG9jU3ZjX0xvY0FwaUJhc2UiCi0KLSNpbmNsdWRlIDxkbGZjbi5oPgotI2luY2x1ZGUgPExvY0FwaUJhc2UuaD4KLSNpbmNsdWRlIDxMb2NBZGFwdGVyQmFzZS5oPgotI2luY2x1ZGUgPGxvZ191dGlsLmg+Ci0jaW5jbHVkZSA8TG9jRHVhbENvbnRleHQuaD4KLQotbmFtZXNwYWNlIGxvY19jb3JlIHsKLQotI2RlZmluZSBUT19BTExfTE9DQURBUFRFUlMoY2FsbCkgVE9fQUxMX0FEQVBURVJTKG1Mb2NBZGFwdGVycywgKGNhbGwpKQotI2RlZmluZSBUT18xU1RfSEFORExJTkdfTE9DQURBUFRFUlMoY2FsbCkgVE9fMVNUX0hBTkRMSU5HX0FEQVBURVIobUxvY0FkYXB0ZXJzLCAoY2FsbCkpCi0KLWludCBoZXhjb2RlKGNoYXIgKmhleHN0cmluZywgaW50IHN0cmluZ19zaXplLAotICAgICAgICAgICAgY29uc3QgY2hhciAqZGF0YSwgaW50IGRhdGFfc2l6ZSkKLXsKLSAgIGludCBpOwotICAgZm9yIChpID0gMDsgaSA8IGRhdGFfc2l6ZTsgaSsrKQotICAgewotICAgICAgY2hhciBjaCA9IGRhdGFbaV07Ci0gICAgICBpZiAoaSoyICsgMyA8PSBzdHJpbmdfc2l6ZSkKLSAgICAgIHsKLSAgICAgICAgIHNucHJpbnRmKCZoZXhzdHJpbmdbaSoyXSwgMywgIiUwMlgiLCBjaCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgfQotICAgcmV0dXJuIGk7Ci19Ci0KLWludCBkZWNvZGVBZGRyZXNzKGNoYXIgKmFkZHJfc3RyaW5nLCBpbnQgc3RyaW5nX3NpemUsCi0gICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGF0YSwgaW50IGRhdGFfc2l6ZSkKLXsKLSAgICBjb25zdCBjaGFyIGFkZHJfcHJlZml4ID0gMHg5MTsKLSAgICBpbnQgaSwgaWR4T3V0cHV0ID0gMDsKLQotICAgIGlmICghZGF0YSB8fCAhYWRkcl9zdHJpbmcpIHsgcmV0dXJuIDA7IH0KLQotICAgIGlmIChkYXRhWzBdICE9IGFkZHJfcHJlZml4KQotICAgIHsKLSAgICAgICAgTE9DX0xPR1coImRlY29kZUFkZHJlc3M6IGFkZHJlc3MgcHJlZml4IGlzIG5vdCAweCV4IGJ1dCAweCV4IiwgYWRkcl9wcmVmaXgsIGRhdGFbMF0pOwotICAgICAgICBhZGRyX3N0cmluZ1swXSA9ICdcMCc7Ci0gICAgICAgIHJldHVybiAwOyAvLyBwcmVmaXggbm90IGNvcnJlY3QKLSAgICB9Ci0KLSAgICBmb3IgKGkgPSAxOyBpIDwgZGF0YV9zaXplOyBpKyspCi0gICAgewotICAgICAgICB1bnNpZ25lZCBjaGFyIGNoID0gZGF0YVtpXSwgbG93ID0gY2ggJiAweDBGLCBoaSA9IGNoID4+IDQ7Ci0gICAgICAgIGlmIChsb3cgPD0gOSAmJiBpZHhPdXRwdXQgPCBzdHJpbmdfc2l6ZSAtIDEpIHsgYWRkcl9zdHJpbmdbaWR4T3V0cHV0KytdID0gbG93ICsgJzAnOyB9Ci0gICAgICAgIGlmIChoaSA8PSA5ICYmIGlkeE91dHB1dCA8IHN0cmluZ19zaXplIC0gMSkgeyBhZGRyX3N0cmluZ1tpZHhPdXRwdXQrK10gPSBoaSArICcwJzsgfQotICAgIH0KLQotICAgIGFkZHJfc3RyaW5nW2lkeE91dHB1dF0gPSAnXDAnOyAvLyBUZXJtaW5hdGVzIHRoZSBzdHJpbmcKLQotICAgIHJldHVybiBpZHhPdXRwdXQ7Ci19Ci0KLXN0cnVjdCBMb2NTc3JNc2cgOiBwdWJsaWMgTG9jTXNnIHsKLSAgICBMb2NBcGlCYXNlKiBtTG9jQXBpOwotICAgIGlubGluZSBMb2NTc3JNc2coTG9jQXBpQmFzZSogbG9jQXBpKSA6Ci0gICAgICAgIExvY01zZygpLCBtTG9jQXBpKGxvY0FwaSkKLSAgICB7Ci0gICAgICAgIGxvY2FsbG9nKCk7Ci0gICAgfQotICAgIGlubGluZSB2aXJ0dWFsIHZvaWQgcHJvYygpIGNvbnN0IHsKLSAgICAgICAgbUxvY0FwaS0+Y2xvc2UoKTsKLSAgICAgICAgbUxvY0FwaS0+b3BlbihtTG9jQXBpLT5nZXRFdnRNYXNrKCkpOwotICAgIH0KLSAgICBpbmxpbmUgdm9pZCBsb2NhbGxvZygpIHsKLSAgICAgICAgTE9DX0xPR1YoIkxvY1Nzck1zZyIpOwotICAgIH0KLSAgICBpbmxpbmUgdmlydHVhbCB2b2lkIGxvZygpIHsKLSAgICAgICAgbG9jYWxsb2coKTsKLSAgICB9Ci19OwotCi1zdHJ1Y3QgTG9jT3Blbk1zZyA6IHB1YmxpYyBMb2NNc2cgewotICAgIExvY0FwaUJhc2UqIG1Mb2NBcGk7Ci0gICAgTE9DX0FQSV9BREFQVEVSX0VWRU5UX01BU0tfVCBtTWFzazsKLSAgICBpbmxpbmUgTG9jT3Blbk1zZyhMb2NBcGlCYXNlKiBsb2NBcGksCi0gICAgICAgICAgICAgICAgICAgICAgTE9DX0FQSV9BREFQVEVSX0VWRU5UX01BU0tfVCBtYXNrKSA6Ci0gICAgICAgIExvY01zZygpLCBtTG9jQXBpKGxvY0FwaSksIG1NYXNrKG1hc2spCi0gICAgewotICAgICAgICBsb2NhbGxvZygpOwotICAgIH0KLSAgICBpbmxpbmUgdmlydHVhbCB2b2lkIHByb2MoKSBjb25zdCB7Ci0gICAgICAgIG1Mb2NBcGktPm9wZW4obU1hc2spOwotICAgIH0KLSAgICBpbmxpbmUgdm9pZCBsb2NhbGxvZygpIHsKLSAgICAgICAgTE9DX0xPR1YoIiVzOiVkXTogTG9jT3BlbiBNYXNrOiAleFxuIiwKLSAgICAgICAgICAgICAgICAgX19mdW5jX18sIF9fTElORV9fLCBtTWFzayk7Ci0gICAgfQotICAgIGlubGluZSB2aXJ0dWFsIHZvaWQgbG9nKCkgewotICAgICAgICBsb2NhbGxvZygpOwotICAgIH0KLX07Ci0KLUxvY0FwaUJhc2U6OkxvY0FwaUJhc2UoY29uc3QgTXNnVGFzayogbXNnVGFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgTE9DX0FQSV9BREFQVEVSX0VWRU5UX01BU0tfVCBleGNsdWRlZE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgIENvbnRleHRCYXNlKiBjb250ZXh0KSA6Ci0gICAgbUV4Y2x1ZGVkTWFzayhleGNsdWRlZE1hc2spLCBtTXNnVGFzayhtc2dUYXNrKSwgbU1hc2soMCksIG1Db250ZXh0KGNvbnRleHQpCi17Ci0gICAgbWVtc2V0KG1Mb2NBZGFwdGVycywgMCwgc2l6ZW9mKG1Mb2NBZGFwdGVycykpOwotfQotCi1MT0NfQVBJX0FEQVBURVJfRVZFTlRfTUFTS19UIExvY0FwaUJhc2U6OmdldEV2dE1hc2soKQotewotICAgIExPQ19BUElfQURBUFRFUl9FVkVOVF9NQVNLX1QgbWFzayA9IDA7Ci0KLSAgICBUT19BTExfTE9DQURBUFRFUlMobWFzayB8PSBtTG9jQWRhcHRlcnNbaV0tPmdldEV2dE1hc2soKSk7Ci0KLSAgICByZXR1cm4gbWFzayAmIH5tRXhjbHVkZWRNYXNrOwotfQotCi1ib29sIExvY0FwaUJhc2U6OmlzSW5TZXNzaW9uKCkKLXsKLSAgICBib29sIGluU2Vzc2lvbiA9IGZhbHNlOwotCi0gICAgZm9yIChpbnQgaSA9IDA7Ci0gICAgICAgICAhaW5TZXNzaW9uICYmIGkgPCBNQVhfQURBUFRFUlMgJiYgTlVMTCAhPSBtTG9jQWRhcHRlcnNbaV07Ci0gICAgICAgICBpKyspIHsKLSAgICAgICAgaW5TZXNzaW9uID0gbUxvY0FkYXB0ZXJzW2ldLT5pc0luU2Vzc2lvbigpOwotICAgIH0KLQotICAgIHJldHVybiBpblNlc3Npb247Ci19Ci0KLXZvaWQgTG9jQXBpQmFzZTo6YWRkQWRhcHRlcihMb2NBZGFwdGVyQmFzZSogYWRhcHRlcikKLXsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9BREFQVEVSUyAmJiBtTG9jQWRhcHRlcnNbaV0gIT0gYWRhcHRlcjsgaSsrKSB7Ci0gICAgICAgIGlmIChtTG9jQWRhcHRlcnNbaV0gPT0gTlVMTCkgewotICAgICAgICAgICAgbUxvY0FkYXB0ZXJzW2ldID0gYWRhcHRlcjsKLSAgICAgICAgICAgIG1Nc2dUYXNrLT5zZW5kTXNnKG5ldyBMb2NPcGVuTXNnKHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWRhcHRlci0+Z2V0RXZ0TWFzaygpKSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXZvaWQgTG9jQXBpQmFzZTo6cmVtb3ZlQWRhcHRlcihMb2NBZGFwdGVyQmFzZSogYWRhcHRlcikKLXsKLSAgICBmb3IgKGludCBpID0gMDsKLSAgICAgICAgIGkgPCBNQVhfQURBUFRFUlMgJiYgTlVMTCAhPSBtTG9jQWRhcHRlcnNbaV07Ci0gICAgICAgICBpKyspIHsKLSAgICAgICAgaWYgKG1Mb2NBZGFwdGVyc1tpXSA9PSBhZGFwdGVyKSB7Ci0gICAgICAgICAgICBtTG9jQWRhcHRlcnNbaV0gPSBOVUxMOwotCi0gICAgICAgICAgICAvLyBzaGlmdCB0aGUgcmVzdCBvZiB0aGUgYWRhcHRlcnMgdXAgc28gdGhhdCB0aGUgcG9pbnRlcnMKLSAgICAgICAgICAgIC8vIGluIHRoZSBhcnJheSBkbyBub3QgaGF2ZSBob2xlcy4gIFRoaXMgc2hvdWxkIGJlIG1vcmUKLSAgICAgICAgICAgIC8vIHBlcmZvcm1hbnQsIGJlY2F1c2UgdGhlIGFycmF5IG1haW50ZW5hbmNlIGlzIG11Y2ggbXVjaAotICAgICAgICAgICAgLy8gbGVzcyBmcmVxdWVudCB0aGFuIGV2ZW50IGhhbmRsaW5ncywgd2hpY2ggbmVlZCB0byBsaW5lYXIKLSAgICAgICAgICAgIC8vIHNlYXJjaCBhbGwgdGhlIGFkYXB0ZXJzCi0gICAgICAgICAgICBpbnQgaiA9IGk7Ci0gICAgICAgICAgICB3aGlsZSAoKytpIDwgTUFYX0FEQVBURVJTICYmIG1Mb2NBZGFwdGVyc1tpXSAhPSBOVUxMKTsKLQotICAgICAgICAgICAgLy8gaSB3b3VsZCBiZSBNQVhfQURBUFRFUlMgb3IgcG9pbnQgdG8gYSBOVUxMCi0gICAgICAgICAgICBpLS07Ci0gICAgICAgICAgICAvLyBpIG5vdyBzaG91bGQgcG9pbnQgdG8gYSBub25lIE5VTEwgYWRhcHRlciB3aXRoaW4gdmFsaWQKLSAgICAgICAgICAgIC8vIHJhbmdlIGFsdGhvdWdoIGkgY291bGQgYmUgZXF1YWwgdG8gaiwgYnV0IGl0IHdvbid0IGh1cnQuCi0gICAgICAgICAgICAvLyBObyBuZWVkIHRvIGNoZWNrIGl0LCBhcyBpdCBnYWlucyBub3RoaW5nLgotICAgICAgICAgICAgbUxvY0FkYXB0ZXJzW2pdID0gbUxvY0FkYXB0ZXJzW2ldOwotICAgICAgICAgICAgLy8gdGhpcyBtYWtlcyBzdXJlIHRoYXQgd2UgZXhpdCB0aGUgZm9yIGxvb3AKLSAgICAgICAgICAgIG1Mb2NBZGFwdGVyc1tpXSA9IE5VTEw7Ci0KLSAgICAgICAgICAgIC8vIGlmIHdlIGhhdmUgYW4gZW1wdHkgbGlzdCBvZiBhZGFwdGVycwotICAgICAgICAgICAgaWYgKDAgPT0gaSkgewotICAgICAgICAgICAgICAgIGNsb3NlKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIGVsc2Ugd2UgbmVlZCB0byByZW1vdmUgdGhlIGJpdAotICAgICAgICAgICAgICAgIG1Nc2dUYXNrLT5zZW5kTXNnKG5ldyBMb2NPcGVuTXNnKHRoaXMsIGdldEV2dE1hc2soKSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIExvY0FwaUJhc2U6OmhhbmRsZUVuZ2luZVVwRXZlbnQoKQotewotICAgIC8vIFRoaXMgd2lsbCB0YWtlIGNhcmUgb2YgcmVuZWdvdGlhdGluZyB0aGUgbG9jIGhhbmRsZQotICAgIG1Nc2dUYXNrLT5zZW5kTXNnKG5ldyBMb2NTc3JNc2codGhpcykpOwotCi0gICAgTG9jRHVhbENvbnRleHQ6OmluamVjdEZlYXR1cmVDb25maWcobUNvbnRleHQpOwotCi0gICAgLy8gbG9vcCB0aHJvdWdoIGFkYXB0ZXJzLCBhbmQgZGVsaXZlciB0byBhbGwgYWRhcHRlcnMuCi0gICAgVE9fQUxMX0xPQ0FEQVBURVJTKG1Mb2NBZGFwdGVyc1tpXS0+aGFuZGxlRW5naW5lVXBFdmVudCgpKTsKLX0KLQotdm9pZCBMb2NBcGlCYXNlOjpoYW5kbGVFbmdpbmVEb3duRXZlbnQoKQotewotICAgIC8vIGxvb3AgdGhyb3VnaCBhZGFwdGVycywgYW5kIGRlbGl2ZXIgdG8gYWxsIGFkYXB0ZXJzLgotICAgIFRPX0FMTF9MT0NBREFQVEVSUyhtTG9jQWRhcHRlcnNbaV0tPmhhbmRsZUVuZ2luZURvd25FdmVudCgpKTsKLX0KLQotdm9pZCBMb2NBcGlCYXNlOjpyZXBvcnRQb3NpdGlvbihVbHBMb2NhdGlvbiAmbG9jYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdwc0xvY2F0aW9uRXh0ZW5kZWQgJmxvY2F0aW9uRXh0ZW5kZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGxvY2F0aW9uRXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIGxvY19zZXNzX3N0YXR1cyBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY1Bvc1RlY2hNYXNrIGxvY190ZWNobm9sb2d5X21hc2spCi17Ci0gICAgLy8gbG9vcCB0aHJvdWdoIGFkYXB0ZXJzLCBhbmQgZGVsaXZlciB0byBhbGwgYWRhcHRlcnMuCi0gICAgVE9fQUxMX0xPQ0FEQVBURVJTKAotICAgICAgICBtTG9jQWRhcHRlcnNbaV0tPnJlcG9ydFBvc2l0aW9uKGxvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uRXh0ZW5kZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb25FeHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY190ZWNobm9sb2d5X21hc2spCi0gICAgKTsKLX0KLQotdm9pZCBMb2NBcGlCYXNlOjpyZXBvcnRTdihHcHNTdlN0YXR1cyAmc3ZTdGF0dXMsCi0gICAgICAgICAgICAgICAgICBHcHNMb2NhdGlvbkV4dGVuZGVkICZsb2NhdGlvbkV4dGVuZGVkLAotICAgICAgICAgICAgICAgICAgdm9pZCogc3ZFeHQpCi17Ci0gICAgLy8gbG9vcCB0aHJvdWdoIGFkYXB0ZXJzLCBhbmQgZGVsaXZlciB0byBhbGwgYWRhcHRlcnMuCi0gICAgVE9fQUxMX0xPQ0FEQVBURVJTKAotICAgICAgICBtTG9jQWRhcHRlcnNbaV0tPnJlcG9ydFN2KHN2U3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uRXh0ZW5kZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ZFeHQpCi0gICAgKTsKLX0KLQotdm9pZCBMb2NBcGlCYXNlOjpyZXBvcnRTdGF0dXMoR3BzU3RhdHVzVmFsdWUgc3RhdHVzKQotewotICAgIC8vIGxvb3AgdGhyb3VnaCBhZGFwdGVycywgYW5kIGRlbGl2ZXIgdG8gYWxsIGFkYXB0ZXJzLgotICAgIFRPX0FMTF9MT0NBREFQVEVSUyhtTG9jQWRhcHRlcnNbaV0tPnJlcG9ydFN0YXR1cyhzdGF0dXMpKTsKLX0KLQotdm9pZCBMb2NBcGlCYXNlOjpyZXBvcnRObWVhKGNvbnN0IGNoYXIqIG5tZWEsIGludCBsZW5ndGgpCi17Ci0gICAgLy8gbG9vcCB0aHJvdWdoIGFkYXB0ZXJzLCBhbmQgZGVsaXZlciB0byBhbGwgYWRhcHRlcnMuCi0gICAgVE9fQUxMX0xPQ0FEQVBURVJTKG1Mb2NBZGFwdGVyc1tpXS0+cmVwb3J0Tm1lYShubWVhLCBsZW5ndGgpKTsKLX0KLQotdm9pZCBMb2NBcGlCYXNlOjpyZXBvcnRYdHJhU2VydmVyKGNvbnN0IGNoYXIqIHVybDEsIGNvbnN0IGNoYXIqIHVybDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdXJsMywgY29uc3QgaW50IG1heGxlbmd0aCkKLXsKLSAgICAvLyBsb29wIHRocm91Z2ggYWRhcHRlcnMsIGFuZCBkZWxpdmVyIHRvIHRoZSBmaXJzdCBoYW5kbGluZyBhZGFwdGVyLgotICAgIFRPXzFTVF9IQU5ETElOR19MT0NBREFQVEVSUyhtTG9jQWRhcHRlcnNbaV0tPnJlcG9ydFh0cmFTZXJ2ZXIodXJsMSwgdXJsMiwgdXJsMywgbWF4bGVuZ3RoKSk7Ci0KLX0KLQotdm9pZCBMb2NBcGlCYXNlOjpyZXF1ZXN0WHRyYURhdGEoKQotewotICAgIC8vIGxvb3AgdGhyb3VnaCBhZGFwdGVycywgYW5kIGRlbGl2ZXIgdG8gdGhlIGZpcnN0IGhhbmRsaW5nIGFkYXB0ZXIuCi0gICAgVE9fMVNUX0hBTkRMSU5HX0xPQ0FEQVBURVJTKG1Mb2NBZGFwdGVyc1tpXS0+cmVxdWVzdFh0cmFEYXRhKCkpOwotfQotCi12b2lkIExvY0FwaUJhc2U6OnJlcXVlc3RUaW1lKCkKLXsKLSAgICAvLyBsb29wIHRocm91Z2ggYWRhcHRlcnMsIGFuZCBkZWxpdmVyIHRvIHRoZSBmaXJzdCBoYW5kbGluZyBhZGFwdGVyLgotICAgIFRPXzFTVF9IQU5ETElOR19MT0NBREFQVEVSUyhtTG9jQWRhcHRlcnNbaV0tPnJlcXVlc3RUaW1lKCkpOwotfQotCi12b2lkIExvY0FwaUJhc2U6OnJlcXVlc3RMb2NhdGlvbigpCi17Ci0gICAgLy8gbG9vcCB0aHJvdWdoIGFkYXB0ZXJzLCBhbmQgZGVsaXZlciB0byB0aGUgZmlyc3QgaGFuZGxpbmcgYWRhcHRlci4KLSAgICBUT18xU1RfSEFORExJTkdfTE9DQURBUFRFUlMobUxvY0FkYXB0ZXJzW2ldLT5yZXF1ZXN0TG9jYXRpb24oKSk7Ci19Ci0KLXZvaWQgTG9jQXBpQmFzZTo6cmVxdWVzdEFUTChpbnQgY29ubkhhbmRsZSwgQUdwc1R5cGUgYWdwc190eXBlKQotewotICAgIC8vIGxvb3AgdGhyb3VnaCBhZGFwdGVycywgYW5kIGRlbGl2ZXIgdG8gdGhlIGZpcnN0IGhhbmRsaW5nIGFkYXB0ZXIuCi0gICAgVE9fMVNUX0hBTkRMSU5HX0xPQ0FEQVBURVJTKG1Mb2NBZGFwdGVyc1tpXS0+cmVxdWVzdEFUTChjb25uSGFuZGxlLCBhZ3BzX3R5cGUpKTsKLX0KLQotdm9pZCBMb2NBcGlCYXNlOjpyZWxlYXNlQVRMKGludCBjb25uSGFuZGxlKQotewotICAgIC8vIGxvb3AgdGhyb3VnaCBhZGFwdGVycywgYW5kIGRlbGl2ZXIgdG8gdGhlIGZpcnN0IGhhbmRsaW5nIGFkYXB0ZXIuCi0gICAgVE9fMVNUX0hBTkRMSU5HX0xPQ0FEQVBURVJTKG1Mb2NBZGFwdGVyc1tpXS0+cmVsZWFzZUFUTChjb25uSGFuZGxlKSk7Ci19Ci0KLXZvaWQgTG9jQXBpQmFzZTo6cmVxdWVzdFN1cGxFUyhpbnQgY29ubkhhbmRsZSkKLXsKLSAgICAvLyBsb29wIHRocm91Z2ggYWRhcHRlcnMsIGFuZCBkZWxpdmVyIHRvIHRoZSBmaXJzdCBoYW5kbGluZyBhZGFwdGVyLgotICAgIFRPXzFTVF9IQU5ETElOR19MT0NBREFQVEVSUyhtTG9jQWRhcHRlcnNbaV0tPnJlcXVlc3RTdXBsRVMoY29ubkhhbmRsZSkpOwotfQotCi12b2lkIExvY0FwaUJhc2U6OnJlcG9ydERhdGFDYWxsT3BlbmVkKCkKLXsKLSAgICAvLyBsb29wIHRocm91Z2ggYWRhcHRlcnMsIGFuZCBkZWxpdmVyIHRvIHRoZSBmaXJzdCBoYW5kbGluZyBhZGFwdGVyLgotICAgIFRPXzFTVF9IQU5ETElOR19MT0NBREFQVEVSUyhtTG9jQWRhcHRlcnNbaV0tPnJlcG9ydERhdGFDYWxsT3BlbmVkKCkpOwotfQotCi12b2lkIExvY0FwaUJhc2U6OnJlcG9ydERhdGFDYWxsQ2xvc2VkKCkKLXsKLSAgICAvLyBsb29wIHRocm91Z2ggYWRhcHRlcnMsIGFuZCBkZWxpdmVyIHRvIHRoZSBmaXJzdCBoYW5kbGluZyBhZGFwdGVyLgotICAgIFRPXzFTVF9IQU5ETElOR19MT0NBREFQVEVSUyhtTG9jQWRhcHRlcnNbaV0tPnJlcG9ydERhdGFDYWxsQ2xvc2VkKCkpOwotfQotCi12b2lkIExvY0FwaUJhc2U6OnJlcXVlc3ROaU5vdGlmeShHcHNOaU5vdGlmaWNhdGlvbiAmbm90aWZ5LCBjb25zdCB2b2lkKiBkYXRhKQotewotICAgIC8vIGxvb3AgdGhyb3VnaCBhZGFwdGVycywgYW5kIGRlbGl2ZXIgdG8gdGhlIGZpcnN0IGhhbmRsaW5nIGFkYXB0ZXIuCi0gICAgVE9fMVNUX0hBTkRMSU5HX0xPQ0FEQVBURVJTKG1Mb2NBZGFwdGVyc1tpXS0+cmVxdWVzdE5pTm90aWZ5KG5vdGlmeSwgZGF0YSkpOwotfQotCi12b2lkKiBMb2NBcGlCYXNlIDo6IGdldFNpYmxpbmcoKQotICAgIERFRkFVTFRfSU1QTChOVUxMKQotCi1Mb2NBcGlQcm94eUJhc2UqIExvY0FwaUJhc2UgOjogZ2V0TG9jQXBpUHJveHkoKQotICAgIERFRkFVTFRfSU1QTChOVUxMKQotCi12b2lkIExvY0FwaUJhc2U6OnJlcG9ydEdwc01lYXN1cmVtZW50RGF0YShHcHNEYXRhICZncHNNZWFzdXJlbWVudERhdGEpCi17Ci0gICAgLy8gbG9vcCB0aHJvdWdoIGFkYXB0ZXJzLCBhbmQgZGVsaXZlciB0byBhbGwgYWRhcHRlcnMuCi0gICAgVE9fQUxMX0xPQ0FEQVBURVJTKG1Mb2NBZGFwdGVyc1tpXS0+cmVwb3J0R3BzTWVhc3VyZW1lbnREYXRhKGdwc01lYXN1cmVtZW50RGF0YSkpOwotfQotCi1lbnVtIGxvY19hcGlfYWRhcHRlcl9lcnIgTG9jQXBpQmFzZTo6Ci0gICBvcGVuKExPQ19BUElfQURBUFRFUl9FVkVOVF9NQVNLX1QgbWFzaykKLURFRkFVTFRfSU1QTChMT0NfQVBJX0FEQVBURVJfRVJSX1NVQ0NFU1MpCi0KLWVudW0gbG9jX2FwaV9hZGFwdGVyX2VyciBMb2NBcGlCYXNlOjoKLSAgICBjbG9zZSgpCi1ERUZBVUxUX0lNUEwoTE9DX0FQSV9BREFQVEVSX0VSUl9TVUNDRVNTKQotCi1lbnVtIGxvY19hcGlfYWRhcHRlcl9lcnIgTG9jQXBpQmFzZTo6Ci0gICAgc3RhcnRGaXgoY29uc3QgTG9jUG9zTW9kZSYgcG9zTW9kZSkKLURFRkFVTFRfSU1QTChMT0NfQVBJX0FEQVBURVJfRVJSX1NVQ0NFU1MpCi0KLWVudW0gbG9jX2FwaV9hZGFwdGVyX2VyciBMb2NBcGlCYXNlOjoKLSAgICBzdG9wRml4KCkKLURFRkFVTFRfSU1QTChMT0NfQVBJX0FEQVBURVJfRVJSX1NVQ0NFU1MpCi0KLWVudW0gbG9jX2FwaV9hZGFwdGVyX2VyciBMb2NBcGlCYXNlOjoKLSAgICBkZWxldGVBaWRpbmdEYXRhKEdwc0FpZGluZ0RhdGEgZikKLURFRkFVTFRfSU1QTChMT0NfQVBJX0FEQVBURVJfRVJSX1NVQ0NFU1MpCi0KLWVudW0gbG9jX2FwaV9hZGFwdGVyX2VyciBMb2NBcGlCYXNlOjoKLSAgICBlbmFibGVEYXRhKGludCBlbmFibGUpCi1ERUZBVUxUX0lNUEwoTE9DX0FQSV9BREFQVEVSX0VSUl9TVUNDRVNTKQotCi1lbnVtIGxvY19hcGlfYWRhcHRlcl9lcnIgTG9jQXBpQmFzZTo6Ci0gICAgc2V0QVBOKGNoYXIqIGFwbiwgaW50IGxlbikKLURFRkFVTFRfSU1QTChMT0NfQVBJX0FEQVBURVJfRVJSX1NVQ0NFU1MpCi0KLWVudW0gbG9jX2FwaV9hZGFwdGVyX2VyciBMb2NBcGlCYXNlOjoKLSAgICBpbmplY3RQb3NpdGlvbihkb3VibGUgbGF0aXR1ZGUsIGRvdWJsZSBsb25naXR1ZGUsIGZsb2F0IGFjY3VyYWN5KQotREVGQVVMVF9JTVBMKExPQ19BUElfQURBUFRFUl9FUlJfU1VDQ0VTUykKLQotZW51bSBsb2NfYXBpX2FkYXB0ZXJfZXJyIExvY0FwaUJhc2U6OgotICAgIHNldFRpbWUoR3BzVXRjVGltZSB0aW1lLCBpbnQ2NF90IHRpbWVSZWZlcmVuY2UsIGludCB1bmNlcnRhaW50eSkKLURFRkFVTFRfSU1QTChMT0NfQVBJX0FEQVBURVJfRVJSX1NVQ0NFU1MpCi0KLWVudW0gbG9jX2FwaV9hZGFwdGVyX2VyciBMb2NBcGlCYXNlOjoKLSAgICBzZXRYdHJhRGF0YShjaGFyKiBkYXRhLCBpbnQgbGVuZ3RoKQotREVGQVVMVF9JTVBMKExPQ19BUElfQURBUFRFUl9FUlJfU1VDQ0VTUykKLQotZW51bSBsb2NfYXBpX2FkYXB0ZXJfZXJyIExvY0FwaUJhc2U6OgotICAgIHJlcXVlc3RYdHJhU2VydmVyKCkKLURFRkFVTFRfSU1QTChMT0NfQVBJX0FEQVBURVJfRVJSX1NVQ0NFU1MpCi0KLWVudW0gbG9jX2FwaV9hZGFwdGVyX2VyciBMb2NBcGlCYXNlOjoKLSAgIGF0bE9wZW5TdGF0dXMoaW50IGhhbmRsZSwgaW50IGlzX3N1Y2MsIGNoYXIqIGFwbiwKLSAgICAgICAgICAgICAgICAgQUdwc0JlYXJlclR5cGUgYmVhciwgQUdwc1R5cGUgYWdwc1R5cGUpCi1ERUZBVUxUX0lNUEwoTE9DX0FQSV9BREFQVEVSX0VSUl9TVUNDRVNTKQotCi1lbnVtIGxvY19hcGlfYWRhcHRlcl9lcnIgTG9jQXBpQmFzZTo6Ci0gICAgYXRsQ2xvc2VTdGF0dXMoaW50IGhhbmRsZSwgaW50IGlzX3N1Y2MpCi1ERUZBVUxUX0lNUEwoTE9DX0FQSV9BREFQVEVSX0VSUl9TVUNDRVNTKQotCi1lbnVtIGxvY19hcGlfYWRhcHRlcl9lcnIgTG9jQXBpQmFzZTo6Ci0gICAgc2V0UG9zaXRpb25Nb2RlKGNvbnN0IExvY1Bvc01vZGUmIHBvc01vZGUpCi1ERUZBVUxUX0lNUEwoTE9DX0FQSV9BREFQVEVSX0VSUl9TVUNDRVNTKQotCi1lbnVtIGxvY19hcGlfYWRhcHRlcl9lcnIgTG9jQXBpQmFzZTo6Ci0gICAgc2V0U2VydmVyKGNvbnN0IGNoYXIqIHVybCwgaW50IGxlbikKLURFRkFVTFRfSU1QTChMT0NfQVBJX0FEQVBURVJfRVJSX1NVQ0NFU1MpCi0KLWVudW0gbG9jX2FwaV9hZGFwdGVyX2VyciBMb2NBcGlCYXNlOjoKLSAgICBzZXRTZXJ2ZXIodW5zaWduZWQgaW50IGlwLCBpbnQgcG9ydCwKLSAgICAgICAgICAgICAgTG9jU2VydmVyVHlwZSB0eXBlKQotREVGQVVMVF9JTVBMKExPQ19BUElfQURBUFRFUl9FUlJfU1VDQ0VTUykKLQotZW51bSBsb2NfYXBpX2FkYXB0ZXJfZXJyIExvY0FwaUJhc2U6OgotICAgIGluZm9ybU5pUmVzcG9uc2UoR3BzVXNlclJlc3BvbnNlVHlwZSB1c2VyUmVzcG9uc2UsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBwYXNzVGhyb3VnaERhdGEpCi1ERUZBVUxUX0lNUEwoTE9DX0FQSV9BREFQVEVSX0VSUl9TVUNDRVNTKQotCi1lbnVtIGxvY19hcGlfYWRhcHRlcl9lcnIgTG9jQXBpQmFzZTo6Ci0gICAgc2V0U1VQTFZlcnNpb24odWludDMyX3QgdmVyc2lvbikKLURFRkFVTFRfSU1QTChMT0NfQVBJX0FEQVBURVJfRVJSX1NVQ0NFU1MpCi0KLWVudW0gbG9jX2FwaV9hZGFwdGVyX2VyciBMb2NBcGlCYXNlOjoKLSAgICBzZXRMUFBDb25maWcodWludDMyX3QgcHJvZmlsZSkKLURFRkFVTFRfSU1QTChMT0NfQVBJX0FEQVBURVJfRVJSX1NVQ0NFU1MpCi0KLWVudW0gbG9jX2FwaV9hZGFwdGVyX2VyciBMb2NBcGlCYXNlOjoKLSAgICBzZXRTZW5zb3JDb250cm9sQ29uZmlnKGludCBzZW5zb3JVc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZW5zb3JQcm92aWRlcikKLURFRkFVTFRfSU1QTChMT0NfQVBJX0FEQVBURVJfRVJSX1NVQ0NFU1MpCi0KLWVudW0gbG9jX2FwaV9hZGFwdGVyX2VyciBMb2NBcGlCYXNlOjoKLSAgICBzZXRTZW5zb3JQcm9wZXJ0aWVzKGJvb2wgZ3lyb0JpYXNWYXJpYW5jZVJhbmRvbVdhbGtfdmFsaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBneXJvQmlhc1ZhcmlhbmNlUmFuZG9tV2FsaywKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYWNjZWxCaWFzVmFyaWFuY2VSYW5kb21XYWxrX3ZhbGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYWNjZWxCaWFzVmFyaWFuY2VSYW5kb21XYWxrLAotICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhbmdsZUJpYXNWYXJpYW5jZVJhbmRvbVdhbGtfdmFsaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbmdsZUJpYXNWYXJpYW5jZVJhbmRvbVdhbGssCi0gICAgICAgICAgICAgICAgICAgICAgICBib29sIHJhdGVCaWFzVmFyaWFuY2VSYW5kb21XYWxrX3ZhbGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgcmF0ZUJpYXNWYXJpYW5jZVJhbmRvbVdhbGssCi0gICAgICAgICAgICAgICAgICAgICAgICBib29sIHZlbG9jaXR5Qmlhc1ZhcmlhbmNlUmFuZG9tV2Fsa192YWxpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHZlbG9jaXR5Qmlhc1ZhcmlhbmNlUmFuZG9tV2FsaykKLURFRkFVTFRfSU1QTChMT0NfQVBJX0FEQVBURVJfRVJSX1NVQ0NFU1MpCi0KLWVudW0gbG9jX2FwaV9hZGFwdGVyX2VyciBMb2NBcGlCYXNlOjoKLSAgICBzZXRTZW5zb3JQZXJmQ29udHJvbENvbmZpZyhpbnQgY29udHJvbE1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFjY2VsU2FtcGxlc1BlckJhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhY2NlbEJhdGNoZXNQZXJTZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGd5cm9TYW1wbGVzUGVyQmF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGd5cm9CYXRjaGVzUGVyU2VjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhY2NlbFNhbXBsZXNQZXJCYXRjaEhpZ2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFjY2VsQmF0Y2hlc1BlclNlY0hpZ2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGd5cm9TYW1wbGVzUGVyQmF0Y2hIaWdoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBneXJvQmF0Y2hlc1BlclNlY0hpZ2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFsZ29yaXRobUNvbmZpZykKLURFRkFVTFRfSU1QTChMT0NfQVBJX0FEQVBURVJfRVJSX1NVQ0NFU1MpCi0KLWVudW0gbG9jX2FwaV9hZGFwdGVyX2VyciBMb2NBcGlCYXNlOjoKLSAgICBzZXRFeHRQb3dlckNvbmZpZyhpbnQgaXNCYXR0ZXJ5Q2hhcmdpbmcpCi1ERUZBVUxUX0lNUEwoTE9DX0FQSV9BREFQVEVSX0VSUl9TVUNDRVNTKQotCi1lbnVtIGxvY19hcGlfYWRhcHRlcl9lcnIgTG9jQXBpQmFzZTo6Ci0gICAgc2V0QUdMT05BU1NQcm90b2NvbCh1bnNpZ25lZCBsb25nIGFHbG9uYXNzUHJvdG9jb2wpCi1ERUZBVUxUX0lNUEwoTE9DX0FQSV9BREFQVEVSX0VSUl9TVUNDRVNTKQotCi1lbnVtIGxvY19hcGlfYWRhcHRlcl9lcnIgTG9jQXBpQmFzZTo6Ci0gICBnZXRXd2FuWnBwRml4KEdwc0xvY2F0aW9uICYgenBwTG9jKQotREVGQVVMVF9JTVBMKExPQ19BUElfQURBUFRFUl9FUlJfU1VDQ0VTUykKLQotZW51bSBsb2NfYXBpX2FkYXB0ZXJfZXJyIExvY0FwaUJhc2U6OgotICAgZ2V0QmVzdEF2YWlsYWJsZVpwcEZpeChHcHNMb2NhdGlvbiAmIHpwcExvYykKLURFRkFVTFRfSU1QTChMT0NfQVBJX0FEQVBURVJfRVJSX1NVQ0NFU1MpCi0KLWVudW0gbG9jX2FwaV9hZGFwdGVyX2VyciBMb2NBcGlCYXNlOjoKLSAgIGdldEJlc3RBdmFpbGFibGVacHBGaXgoR3BzTG9jYXRpb24gJiB6cHBMb2MsIExvY1Bvc1RlY2hNYXNrICYgdGVjaF9tYXNrKQotREVGQVVMVF9JTVBMKExPQ19BUElfQURBUFRFUl9FUlJfU1VDQ0VTUykKLQotaW50IExvY0FwaUJhc2U6OgotICAgIGluaXREYXRhU2VydmljZUNsaWVudCgpCi1ERUZBVUxUX0lNUEwoLTEpCi0KLWludCBMb2NBcGlCYXNlOjoKLSAgICBvcGVuQW5kU3RhcnREYXRhQ2FsbCgpCi1ERUZBVUxUX0lNUEwoLTEpCi0KLXZvaWQgTG9jQXBpQmFzZTo6Ci0gICAgc3RvcERhdGFDYWxsKCkKLURFRkFVTFRfSU1QTCgpCi0KLXZvaWQgTG9jQXBpQmFzZTo6Ci0gICAgY2xvc2VEYXRhQ2FsbCgpCi1ERUZBVUxUX0lNUEwoKQotCi1pbnQgTG9jQXBpQmFzZTo6Ci0gICAgc2V0R3BzTG9jayhMT0NfR1BTX0xPQ0tfTUFTSyBsb2NrKQotREVGQVVMVF9JTVBMKC0xKQotCi12b2lkIExvY0FwaUJhc2U6OgotICAgIGluc3RhbGxBR3BzQ2VydChjb25zdCBEZXJFbmNvZGVkQ2VydGlmaWNhdGUqIHBEYXRhLAotICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzbG90Qml0TWFzaykKLURFRkFVTFRfSU1QTCgpCi0KLWludCBMb2NBcGlCYXNlOjoKLSAgICBnZXRHcHNMb2NrKCkKLURFRkFVTFRfSU1QTCgtMSkKLQotaW50IExvY0FwaUJhc2U6OgotICAgIHVwZGF0ZVJlZ2lzdHJhdGlvbk1hc2soTE9DX0FQSV9BREFQVEVSX0VWRU5UX01BU0tfVCBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY19yZWdpc3RyYXRpb25fbWFza19zdGF0dXMgaXNFbmFibGVkKQotREVGQVVMVF9JTVBMKC0xKQotCi1ib29sIExvY0FwaUJhc2U6OgotICAgIGduc3NDb25zdGVsbGF0aW9uQ29uZmlnKCkKLURFRkFVTFRfSU1QTChmYWxzZSkKLQotfSAvLyBuYW1lc3BhY2UgbG9jX2NvcmUKZGlmZiAtLWdpdCBhL21zbTg5NzQvY29yZS9Mb2NBcGlCYXNlLmggYi9tc204OTc0L2NvcmUvTG9jQXBpQmFzZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Njk1MGU2Li4wMDAwMDAwCi0tLSBhL21zbTg5NzQvY29yZS9Mb2NBcGlCYXNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNDIgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDExLTIwMTQsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCi0gKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKLSAqICAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24sIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCi0gKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKLSAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCi0gKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCi0gKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLSNpZm5kZWYgTE9DX0FQSV9CQVNFX0gKLSNkZWZpbmUgTE9DX0FQSV9CQVNFX0gKLQotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8Z3BzX2V4dGVuZGVkLmg+Ci0jaW5jbHVkZSA8TXNnVGFzay5oPgotI2luY2x1ZGUgPGxvZ191dGlsLmg+Ci0KLW5hbWVzcGFjZSBsb2NfY29yZSB7Ci1jbGFzcyBDb250ZXh0QmFzZTsKLQotaW50IGhleGNvZGUoY2hhciAqaGV4c3RyaW5nLCBpbnQgc3RyaW5nX3NpemUsCi0gICAgICAgICAgICBjb25zdCBjaGFyICpkYXRhLCBpbnQgZGF0YV9zaXplKTsKLWludCBkZWNvZGVBZGRyZXNzKGNoYXIgKmFkZHJfc3RyaW5nLCBpbnQgc3RyaW5nX3NpemUsCi0gICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkYXRhLCBpbnQgZGF0YV9zaXplKTsKLQotI2RlZmluZSBNQVhfQURBUFRFUlMgICAgICAgICAgMTAKLQotI2RlZmluZSBUT19BTExfQURBUFRFUlMoYWRhcHRlcnMsIGNhbGwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfQURBUFRFUlMgJiYgTlVMTCAhPSAoYWRhcHRlcnMpW2ldOyBpKyspIHsgIFwKLSAgICAgICAgY2FsbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0KLQotI2RlZmluZSBUT18xU1RfSEFORExJTkdfQURBUFRFUihhZGFwdGVycywgY2FsbCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPE1BWF9BREFQVEVSUyAmJiBOVUxMICE9IChhZGFwdGVycylbaV0gJiYgIShjYWxsKTsgaSsrKTsKLQotY2xhc3MgTG9jQWRhcHRlckJhc2U7Ci1zdHJ1Y3QgTG9jU3NyTXNnOwotc3RydWN0IExvY09wZW5Nc2c7Ci0KLWNsYXNzIExvY0FwaVByb3h5QmFzZSB7Ci1wdWJsaWM6Ci0gICAgaW5saW5lIExvY0FwaVByb3h5QmFzZSgpIHt9Ci0gICAgaW5saW5lIHZpcnR1YWwgfkxvY0FwaVByb3h5QmFzZSgpIHt9Ci0gICAgaW5saW5lIHZpcnR1YWwgdm9pZCogZ2V0U2libGluZzIoKSB7IHJldHVybiBOVUxMOyB9Ci19OwotCi1jbGFzcyBMb2NBcGlCYXNlIHsKLSAgICBmcmllbmQgc3RydWN0IExvY1Nzck1zZzsKLSAgICAvL0xvY09wZW5Nc2cgY2FsbHMgb3BlbigpIHdoaWNoIG1ha2VzIGl0IG5lY2Vzc2FyeSB0byBkZWNsYXJlCi0gICAgLy9pdCBhcyBhIGZyaWVuZAotICAgIGZyaWVuZCBzdHJ1Y3QgTG9jT3Blbk1zZzsKLSAgICBmcmllbmQgY2xhc3MgQ29udGV4dEJhc2U7Ci0gICAgY29uc3QgTXNnVGFzayogbU1zZ1Rhc2s7Ci0gICAgQ29udGV4dEJhc2UgKm1Db250ZXh0OwotICAgIExvY0FkYXB0ZXJCYXNlKiBtTG9jQWRhcHRlcnNbTUFYX0FEQVBURVJTXTsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgZW51bSBsb2NfYXBpX2FkYXB0ZXJfZXJyCi0gICAgICAgIG9wZW4oTE9DX0FQSV9BREFQVEVSX0VWRU5UX01BU0tfVCBtYXNrKTsKLSAgICB2aXJ0dWFsIGVudW0gbG9jX2FwaV9hZGFwdGVyX2VycgotICAgICAgICBjbG9zZSgpOwotICAgIExPQ19BUElfQURBUFRFUl9FVkVOVF9NQVNLX1QgZ2V0RXZ0TWFzaygpOwotICAgIExPQ19BUElfQURBUFRFUl9FVkVOVF9NQVNLX1QgbU1hc2s7Ci0gICAgTG9jQXBpQmFzZShjb25zdCBNc2dUYXNrKiBtc2dUYXNrLAotICAgICAgICAgICAgICAgTE9DX0FQSV9BREFQVEVSX0VWRU5UX01BU0tfVCBleGNsdWRlZE1hc2ssCi0gICAgICAgICAgICAgICBDb250ZXh0QmFzZSogY29udGV4dCA9IE5VTEwpOwotICAgIGlubGluZSB2aXJ0dWFsIH5Mb2NBcGlCYXNlKCkgeyBjbG9zZSgpOyB9Ci0gICAgYm9vbCBpc0luU2Vzc2lvbigpOwotICAgIGNvbnN0IExPQ19BUElfQURBUFRFUl9FVkVOVF9NQVNLX1QgbUV4Y2x1ZGVkTWFzazsKLQotcHVibGljOgotICAgIGlubGluZSB2b2lkIHNlbmRNc2coY29uc3QgTG9jTXNnKiBtc2cpIGNvbnN0IHsKLSAgICAgICAgbU1zZ1Rhc2stPnNlbmRNc2cobXNnKTsKLSAgICB9Ci0KLSAgICB2b2lkIGFkZEFkYXB0ZXIoTG9jQWRhcHRlckJhc2UqIGFkYXB0ZXIpOwotICAgIHZvaWQgcmVtb3ZlQWRhcHRlcihMb2NBZGFwdGVyQmFzZSogYWRhcHRlcik7Ci0KLSAgICAvLyB1cHdhcmQgY2FsbHMKLSAgICB2b2lkIGhhbmRsZUVuZ2luZVVwRXZlbnQoKTsKLSAgICB2b2lkIGhhbmRsZUVuZ2luZURvd25FdmVudCgpOwotICAgIHZvaWQgcmVwb3J0UG9zaXRpb24oVWxwTG9jYXRpb24gJmxvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgR3BzTG9jYXRpb25FeHRlbmRlZCAmbG9jYXRpb25FeHRlbmRlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGxvY2F0aW9uRXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBsb2Nfc2Vzc19zdGF0dXMgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgTG9jUG9zVGVjaE1hc2sgbG9jX3RlY2hub2xvZ3lfbWFzayA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9DX1BPU19URUNIX01BU0tfREVGQVVMVCk7Ci0gICAgdm9pZCByZXBvcnRTdihHcHNTdlN0YXR1cyAmc3ZTdGF0dXMsCi0gICAgICAgICAgICAgICAgICBHcHNMb2NhdGlvbkV4dGVuZGVkICZsb2NhdGlvbkV4dGVuZGVkLAotICAgICAgICAgICAgICAgICAgdm9pZCogc3ZFeHQpOwotICAgIHZvaWQgcmVwb3J0U3RhdHVzKEdwc1N0YXR1c1ZhbHVlIHN0YXR1cyk7Ci0gICAgdm9pZCByZXBvcnRObWVhKGNvbnN0IGNoYXIqIG5tZWEsIGludCBsZW5ndGgpOwotICAgIHZvaWQgcmVwb3J0WHRyYVNlcnZlcihjb25zdCBjaGFyKiB1cmwxLCBjb25zdCBjaGFyKiB1cmwyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB1cmwzLCBjb25zdCBpbnQgbWF4bGVuZ3RoKTsKLSAgICB2b2lkIHJlcXVlc3RYdHJhRGF0YSgpOwotICAgIHZvaWQgcmVxdWVzdFRpbWUoKTsKLSAgICB2b2lkIHJlcXVlc3RMb2NhdGlvbigpOwotICAgIHZvaWQgcmVxdWVzdEFUTChpbnQgY29ubkhhbmRsZSwgQUdwc1R5cGUgYWdwc190eXBlKTsKLSAgICB2b2lkIHJlbGVhc2VBVEwoaW50IGNvbm5IYW5kbGUpOwotICAgIHZvaWQgcmVxdWVzdFN1cGxFUyhpbnQgY29ubkhhbmRsZSk7Ci0gICAgdm9pZCByZXBvcnREYXRhQ2FsbE9wZW5lZCgpOwotICAgIHZvaWQgcmVwb3J0RGF0YUNhbGxDbG9zZWQoKTsKLSAgICB2b2lkIHJlcXVlc3ROaU5vdGlmeShHcHNOaU5vdGlmaWNhdGlvbiAmbm90aWZ5LCBjb25zdCB2b2lkKiBkYXRhKTsKLSAgICB2b2lkIHJlcG9ydEdwc01lYXN1cmVtZW50RGF0YShHcHNEYXRhICZncHNNZWFzdXJlbWVudERhdGEpOwotCi0gICAgLy8gZG93bndhcmQgY2FsbHMKLSAgICAvLyBBbGwgYmVsb3cgZnVuY3Rpb25zIGFyZSB0byBiZSBkZWZpbmVkIGJ5IGFkYXB0ZXIgc3BlY2lmaWMgbW9kdWxlczoKLSAgICAvLyBSUEMsIFFNSSwgZXRjLiAgVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gaXMgZW1wdHkuCi0KLSAgICB2aXJ0dWFsIHZvaWQqIGdldFNpYmxpbmcoKTsKLSAgICB2aXJ0dWFsIExvY0FwaVByb3h5QmFzZSogZ2V0TG9jQXBpUHJveHkoKTsKLSAgICB2aXJ0dWFsIGVudW0gbG9jX2FwaV9hZGFwdGVyX2VycgotICAgICAgICBzdGFydEZpeChjb25zdCBMb2NQb3NNb2RlJiBwb3NNb2RlKTsKLSAgICB2aXJ0dWFsIGVudW0gbG9jX2FwaV9hZGFwdGVyX2VycgotICAgICAgICBzdG9wRml4KCk7Ci0gICAgdmlydHVhbCBlbnVtIGxvY19hcGlfYWRhcHRlcl9lcnIKLSAgICAgICAgZGVsZXRlQWlkaW5nRGF0YShHcHNBaWRpbmdEYXRhIGYpOwotICAgIHZpcnR1YWwgZW51bSBsb2NfYXBpX2FkYXB0ZXJfZXJyCi0gICAgICAgIGVuYWJsZURhdGEoaW50IGVuYWJsZSk7Ci0gICAgdmlydHVhbCBlbnVtIGxvY19hcGlfYWRhcHRlcl9lcnIKLSAgICAgICAgc2V0QVBOKGNoYXIqIGFwbiwgaW50IGxlbik7Ci0gICAgdmlydHVhbCBlbnVtIGxvY19hcGlfYWRhcHRlcl9lcnIKLSAgICAgICAgaW5qZWN0UG9zaXRpb24oZG91YmxlIGxhdGl0dWRlLCBkb3VibGUgbG9uZ2l0dWRlLCBmbG9hdCBhY2N1cmFjeSk7Ci0gICAgdmlydHVhbCBlbnVtIGxvY19hcGlfYWRhcHRlcl9lcnIKLSAgICAgICAgc2V0VGltZShHcHNVdGNUaW1lIHRpbWUsIGludDY0X3QgdGltZVJlZmVyZW5jZSwgaW50IHVuY2VydGFpbnR5KTsKLSAgICB2aXJ0dWFsIGVudW0gbG9jX2FwaV9hZGFwdGVyX2VycgotICAgICAgICBzZXRYdHJhRGF0YShjaGFyKiBkYXRhLCBpbnQgbGVuZ3RoKTsKLSAgICB2aXJ0dWFsIGVudW0gbG9jX2FwaV9hZGFwdGVyX2VycgotICAgICAgICByZXF1ZXN0WHRyYVNlcnZlcigpOwotICAgIHZpcnR1YWwgZW51bSBsb2NfYXBpX2FkYXB0ZXJfZXJyCi0gICAgICAgIGF0bE9wZW5TdGF0dXMoaW50IGhhbmRsZSwgaW50IGlzX3N1Y2MsIGNoYXIqIGFwbiwgQUdwc0JlYXJlclR5cGUgYmVhciwgQUdwc1R5cGUgYWdwc1R5cGUpOwotICAgIHZpcnR1YWwgZW51bSBsb2NfYXBpX2FkYXB0ZXJfZXJyCi0gICAgICAgIGF0bENsb3NlU3RhdHVzKGludCBoYW5kbGUsIGludCBpc19zdWNjKTsKLSAgICB2aXJ0dWFsIGVudW0gbG9jX2FwaV9hZGFwdGVyX2VycgotICAgICAgICBzZXRQb3NpdGlvbk1vZGUoY29uc3QgTG9jUG9zTW9kZSYgcG9zTW9kZSk7Ci0gICAgdmlydHVhbCBlbnVtIGxvY19hcGlfYWRhcHRlcl9lcnIKLSAgICAgICAgc2V0U2VydmVyKGNvbnN0IGNoYXIqIHVybCwgaW50IGxlbik7Ci0gICAgdmlydHVhbCBlbnVtIGxvY19hcGlfYWRhcHRlcl9lcnIKLSAgICAgICAgc2V0U2VydmVyKHVuc2lnbmVkIGludCBpcCwgaW50IHBvcnQsCi0gICAgICAgICAgICAgICAgICBMb2NTZXJ2ZXJUeXBlIHR5cGUpOwotICAgIHZpcnR1YWwgZW51bSBsb2NfYXBpX2FkYXB0ZXJfZXJyCi0gICAgICAgIGluZm9ybU5pUmVzcG9uc2UoR3BzVXNlclJlc3BvbnNlVHlwZSB1c2VyUmVzcG9uc2UsIGNvbnN0IHZvaWQqIHBhc3NUaHJvdWdoRGF0YSk7Ci0gICAgdmlydHVhbCBlbnVtIGxvY19hcGlfYWRhcHRlcl9lcnIKLSAgICAgICAgc2V0U1VQTFZlcnNpb24odWludDMyX3QgdmVyc2lvbik7Ci0gICAgdmlydHVhbCBlbnVtIGxvY19hcGlfYWRhcHRlcl9lcnIKLSAgICAgICAgc2V0TFBQQ29uZmlnKHVpbnQzMl90IHByb2ZpbGUpOwotICAgIHZpcnR1YWwgZW51bSBsb2NfYXBpX2FkYXB0ZXJfZXJyCi0gICAgICAgIHNldFNlbnNvckNvbnRyb2xDb25maWcoaW50IHNlbnNvclVzYWdlLCBpbnQgc2Vuc29yUHJvdmlkZXIpOwotICAgIHZpcnR1YWwgZW51bSBsb2NfYXBpX2FkYXB0ZXJfZXJyCi0gICAgICAgIHNldFNlbnNvclByb3BlcnRpZXMoYm9vbCBneXJvQmlhc1ZhcmlhbmNlUmFuZG9tV2Fsa192YWxpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBneXJvQmlhc1ZhcmlhbmNlUmFuZG9tV2FsaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGFjY2VsQmlhc1ZhcmlhbmNlUmFuZG9tV2Fsa192YWxpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhY2NlbEJpYXNWYXJpYW5jZVJhbmRvbVdhbGssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhbmdsZUJpYXNWYXJpYW5jZVJhbmRvbVdhbGtfdmFsaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW5nbGVCaWFzVmFyaWFuY2VSYW5kb21XYWxrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmF0ZUJpYXNWYXJpYW5jZVJhbmRvbVdhbGtfdmFsaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgcmF0ZUJpYXNWYXJpYW5jZVJhbmRvbVdhbGssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB2ZWxvY2l0eUJpYXNWYXJpYW5jZVJhbmRvbVdhbGtfdmFsaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdmVsb2NpdHlCaWFzVmFyaWFuY2VSYW5kb21XYWxrKTsKLSAgICB2aXJ0dWFsIGVudW0gbG9jX2FwaV9hZGFwdGVyX2VycgotICAgICAgICBzZXRTZW5zb3JQZXJmQ29udHJvbENvbmZpZyhpbnQgY29udHJvbE1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFjY2VsU2FtcGxlc1BlckJhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhY2NlbEJhdGNoZXNQZXJTZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGd5cm9TYW1wbGVzUGVyQmF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGd5cm9CYXRjaGVzUGVyU2VjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhY2NlbFNhbXBsZXNQZXJCYXRjaEhpZ2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFjY2VsQmF0Y2hlc1BlclNlY0hpZ2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGd5cm9TYW1wbGVzUGVyQmF0Y2hIaWdoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBneXJvQmF0Y2hlc1BlclNlY0hpZ2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFsZ29yaXRobUNvbmZpZyk7Ci0gICAgdmlydHVhbCBlbnVtIGxvY19hcGlfYWRhcHRlcl9lcnIKLSAgICAgICAgc2V0RXh0UG93ZXJDb25maWcoaW50IGlzQmF0dGVyeUNoYXJnaW5nKTsKLSAgICB2aXJ0dWFsIGVudW0gbG9jX2FwaV9hZGFwdGVyX2VycgotICAgICAgICBzZXRBR0xPTkFTU1Byb3RvY29sKHVuc2lnbmVkIGxvbmcgYUdsb25hc3NQcm90b2NvbCk7Ci0gICAgdmlydHVhbCBlbnVtIGxvY19hcGlfYWRhcHRlcl9lcnIKLSAgICAgICAgZ2V0V3dhblpwcEZpeChHcHNMb2NhdGlvbiAmIHpwcExvYyk7Ci0gICAgdmlydHVhbCBlbnVtIGxvY19hcGlfYWRhcHRlcl9lcnIKLSAgICAgICAgZ2V0QmVzdEF2YWlsYWJsZVpwcEZpeChHcHNMb2NhdGlvbiAmIHpwcExvYyk7Ci0gICAgdmlydHVhbCBlbnVtIGxvY19hcGlfYWRhcHRlcl9lcnIKLSAgICAgICAgZ2V0QmVzdEF2YWlsYWJsZVpwcEZpeChHcHNMb2NhdGlvbiAmIHpwcExvYywgTG9jUG9zVGVjaE1hc2sgJiB0ZWNoX21hc2spOwotICAgIHZpcnR1YWwgaW50IGluaXREYXRhU2VydmljZUNsaWVudCgpOwotICAgIHZpcnR1YWwgaW50IG9wZW5BbmRTdGFydERhdGFDYWxsKCk7Ci0gICAgdmlydHVhbCB2b2lkIHN0b3BEYXRhQ2FsbCgpOwotICAgIHZpcnR1YWwgdm9pZCBjbG9zZURhdGFDYWxsKCk7Ci0gICAgdmlydHVhbCB2b2lkIGluc3RhbGxBR3BzQ2VydChjb25zdCBEZXJFbmNvZGVkQ2VydGlmaWNhdGUqIHBEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNsb3RCaXRNYXNrKTsKLQotICAgIGlubGluZSB2aXJ0dWFsIHZvaWQgc2V0SW5TZXNzaW9uKGJvb2wgaW5TZXNzaW9uKSB7fQotCi0gICAgLypWYWx1ZXMgZm9yIGxvY2sKLSAgICAgIDEgPSBEbyBub3QgbG9jayBhbnkgcG9zaXRpb24gc2Vzc2lvbnMKLSAgICAgIDIgPSBMb2NrIE1JIHBvc2l0aW9uIHNlc3Npb25zCi0gICAgICAzID0gTG9jayBNVCBwb3NpdGlvbiBzZXNzaW9ucwotICAgICAgNCA9IExvY2sgYWxsIHBvc2l0aW9uIHNlc3Npb25zCi0gICAgICovCi0gICAgdmlydHVhbCBpbnQgc2V0R3BzTG9jayhMT0NfR1BTX0xPQ0tfTUFTSyBsb2NrKTsKLSAgICAvKgotICAgICAgUmV0dXJucwotICAgICAgQ3VycmVudCB2YWx1ZSBvZiBHUFMgTG9jayBvbiBzdWNjZXNzCi0gICAgICAtMSBvbiBmYWlsdXJlCi0gICAgICovCi0gICAgdmlydHVhbCBpbnQgZ2V0R3BzTG9jayh2b2lkKTsKLQotICAgIC8qCi0gICAgICBVcGRhdGUgZ3BzIHJlcG9ydGluZyBldmVudHMKLSAgICAgKi8KLSAgICB2aXJ0dWFsIGludCB1cGRhdGVSZWdpc3RyYXRpb25NYXNrKExPQ19BUElfQURBUFRFUl9FVkVOVF9NQVNLX1QgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NfcmVnaXN0cmF0aW9uX21hc2tfc3RhdHVzIGlzRW5hYmxlZCk7Ci0gICAgLyoKLSAgICAgIENoZWNrIGlmIHRoZSBtb2RlbSBzdXBwb3J0IHRoZSBzZXJ2aWNlCi0gICAgICovCi0gICAgdmlydHVhbCBib29sIGduc3NDb25zdGVsbGF0aW9uQ29uZmlnKCk7Ci19OwotCi10eXBlZGVmIExvY0FwaUJhc2UqIChnZXRMb2NBcGlfdCkoY29uc3QgTXNnVGFzayogbXNnVGFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0NfQVBJX0FEQVBURVJfRVZFTlRfTUFTS19UIGV4TWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0QmFzZSAqY29udGV4dCk7Ci0KLX0gLy8gbmFtZXNwYWNlIGxvY19jb3JlCi0KLSNlbmRpZiAvL0xPQ19BUElfQkFTRV9ICmRpZmYgLS1naXQgYS9tc204OTc0L2NvcmUvTG9jRHVhbENvbnRleHQuY3BwIGIvbXNtODk3NC9jb3JlL0xvY0R1YWxDb250ZXh0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFhZDRmMC4uMDAwMDAwMAotLS0gYS9tc204OTc0L2NvcmUvTG9jRHVhbENvbnRleHQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMS0yMDE0LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZwotICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCi0gKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uLCBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAotICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgotICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCi0gKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQotICogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgotICogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0jZGVmaW5lIExPR19ORERFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiTG9jU3ZjX0R1YWxDdHgiCi0KLSNpbmNsdWRlIDxjdXRpbHMvc2NoZWRfcG9saWN5Lmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8TG9jRHVhbENvbnRleHQuaD4KLSNpbmNsdWRlIDxtc2dfcS5oPgotI2luY2x1ZGUgPGxvZ191dGlsLmg+Ci0jaW5jbHVkZSA8bG9jX2xvZy5oPgotCi1uYW1lc3BhY2UgbG9jX2NvcmUgewotCi0vLyBub3RoaW5nIGV4Y2x1ZGUgZm9yIGZvcmVncm91bmQKLWNvbnN0IExPQ19BUElfQURBUFRFUl9FVkVOVF9NQVNLX1QKLUxvY0R1YWxDb250ZXh0OjptRmdFeGNsTWFzayA9IDA7Ci0vLyBleGNsdWRlZCBldmVudHMgZm9yIGJhY2tncm91bmQgY2xpZW50cwotY29uc3QgTE9DX0FQSV9BREFQVEVSX0VWRU5UX01BU0tfVAotTG9jRHVhbENvbnRleHQ6Om1CZ0V4Y2xNYXNrID0KLSAgICAoTE9DX0FQSV9BREFQVEVSX0JJVF9QQVJTRURfUE9TSVRJT05fUkVQT1JUIHwKLSAgICAgTE9DX0FQSV9BREFQVEVSX0JJVF9TQVRFTExJVEVfUkVQT1JUIHwKLSAgICAgTE9DX0FQSV9BREFQVEVSX0JJVF9OTUVBXzFIWl9SRVBPUlQgfAotICAgICBMT0NfQVBJX0FEQVBURVJfQklUX05NRUFfUE9TSVRJT05fUkVQT1JUIHwKLSAgICAgTE9DX0FQSV9BREFQVEVSX0JJVF9JT0NUTF9SRVBPUlQgfAotICAgICBMT0NfQVBJX0FEQVBURVJfQklUX1NUQVRVU19SRVBPUlQgfAotICAgICBMT0NfQVBJX0FEQVBURVJfQklUX0dFT0ZFTkNFX0dFTl9BTEVSVCB8Ci0gICAgIExPQ19BUElfQURBUFRFUl9CSVRfR05TU19NRUFTVVJFTUVOVCk7Ci0KLWNvbnN0IE1zZ1Rhc2sqIExvY0R1YWxDb250ZXh0OjptTXNnVGFzayA9IE5VTEw7Ci1Db250ZXh0QmFzZSogTG9jRHVhbENvbnRleHQ6Om1GZ0NvbnRleHQgPSBOVUxMOwotQ29udGV4dEJhc2UqIExvY0R1YWxDb250ZXh0OjptQmdDb250ZXh0ID0gTlVMTDsKLUNvbnRleHRCYXNlKiBMb2NEdWFsQ29udGV4dDo6bUluamVjdENvbnRleHQgPSBOVUxMOwotLy8gdGhlIG5hbWUgbXVzdCBiZSBzaG9ydGVyIHRoYW4gMTUgY2hhcnMKLWNvbnN0IGNoYXIqIExvY0R1YWxDb250ZXh0OjptTG9jYXRpb25IYWxOYW1lID0gIkxvY19oYWxfd29ya2VyIjsKLWNvbnN0IGNoYXIqIExvY0R1YWxDb250ZXh0OjptTEJTTGliTmFtZSA9ICJsaWJsYnNfY29yZS5zbyI7Ci0KLWNvbnN0IE1zZ1Rhc2sqIExvY0R1YWxDb250ZXh0OjpnZXRNc2dUYXNrKE1zZ1Rhc2s6OnRDcmVhdGUgdENyZWF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBuYW1lKQotewotICAgIGlmIChOVUxMID09IG1Nc2dUYXNrKSB7Ci0gICAgICAgIG1Nc2dUYXNrID0gbmV3IE1zZ1Rhc2sodENyZWF0b3IsIG5hbWUpOwotICAgIH0KLSAgICByZXR1cm4gbU1zZ1Rhc2s7Ci19Ci0KLWNvbnN0IE1zZ1Rhc2sqIExvY0R1YWxDb250ZXh0OjpnZXRNc2dUYXNrKE1zZ1Rhc2s6OnRBc3NvY2lhdGUgdEFzc29jaWF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG5hbWUpCi17Ci0gICAgaWYgKE5VTEwgPT0gbU1zZ1Rhc2spIHsKLSAgICAgICAgbU1zZ1Rhc2sgPSBuZXcgTXNnVGFzayh0QXNzb2NpYXRlLCBuYW1lKTsKLSAgICB9IGVsc2UgaWYgKHRBc3NvY2lhdGUpIHsKLSAgICAgICAgbU1zZ1Rhc2stPmFzc29jaWF0ZSh0QXNzb2NpYXRlKTsKLSAgICB9Ci0gICAgcmV0dXJuIG1Nc2dUYXNrOwotfQotCi1Db250ZXh0QmFzZSogTG9jRHVhbENvbnRleHQ6OmdldExvY0ZnQ29udGV4dChNc2dUYXNrOjp0Q3JlYXRlIHRDcmVhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbmFtZSkKLXsKLSAgICBpZiAoTlVMTCA9PSBtRmdDb250ZXh0KSB7Ci0gICAgICAgIGNvbnN0IE1zZ1Rhc2sqIG1zZ1Rhc2sgPSBnZXRNc2dUYXNrKHRDcmVhdG9yLCBuYW1lKTsKLSAgICAgICAgbUZnQ29udGV4dCA9IG5ldyBMb2NEdWFsQ29udGV4dChtc2dUYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GZ0V4Y2xNYXNrKTsKLSAgICB9Ci0gICAgaWYoTlVMTCA9PSBtSW5qZWN0Q29udGV4dCkgewotICAgICAgICBtSW5qZWN0Q29udGV4dCA9IG1GZ0NvbnRleHQ7Ci0gICAgICAgIGluamVjdEZlYXR1cmVDb25maWcobUluamVjdENvbnRleHQpOwotICAgIH0KLSAgICByZXR1cm4gbUZnQ29udGV4dDsKLX0KLQotQ29udGV4dEJhc2UqIExvY0R1YWxDb250ZXh0OjpnZXRMb2NGZ0NvbnRleHQoTXNnVGFzazo6dEFzc29jaWF0ZSB0QXNzb2NpYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG5hbWUpCi17Ci0gICAgaWYgKE5VTEwgPT0gbUZnQ29udGV4dCkgewotICAgICAgICBjb25zdCBNc2dUYXNrKiBtc2dUYXNrID0gZ2V0TXNnVGFzayh0QXNzb2NpYXRlLCBuYW1lKTsKLSAgICAgICAgbUZnQ29udGV4dCA9IG5ldyBMb2NEdWFsQ29udGV4dChtc2dUYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GZ0V4Y2xNYXNrKTsKLSAgICB9Ci0gICAgaWYoTlVMTCA9PSBtSW5qZWN0Q29udGV4dCkgewotICAgICAgICBMT0NfTE9HRCgiJXM6JWRdOiBtSW5qZWN0Q29udGV4dCBpcyBGZ0NvbnRleHQiLCBfX2Z1bmNfXywgX19MSU5FX18pOwotICAgICAgICBtSW5qZWN0Q29udGV4dCA9IG1GZ0NvbnRleHQ7Ci0gICAgICAgIGluamVjdEZlYXR1cmVDb25maWcobUluamVjdENvbnRleHQpOwotICAgIH0KLSAgICByZXR1cm4gbUZnQ29udGV4dDsKLQotfQotCi1Db250ZXh0QmFzZSogTG9jRHVhbENvbnRleHQ6OmdldExvY0JnQ29udGV4dChNc2dUYXNrOjp0Q3JlYXRlIHRDcmVhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbmFtZSkKLXsKLSAgICBpZiAoTlVMTCA9PSBtQmdDb250ZXh0KSB7Ci0gICAgICAgIGNvbnN0IE1zZ1Rhc2sqIG1zZ1Rhc2sgPSBnZXRNc2dUYXNrKHRDcmVhdG9yLCBuYW1lKTsKLSAgICAgICAgbUJnQ29udGV4dCA9IG5ldyBMb2NEdWFsQ29udGV4dChtc2dUYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CZ0V4Y2xNYXNrKTsKLSAgICB9Ci0gICAgaWYoTlVMTCA9PSBtSW5qZWN0Q29udGV4dCkgewotICAgICAgICBMT0NfTE9HRCgiJXM6JWRdOiBtSW5qZWN0Q29udGV4dCBpcyBCZ0NvbnRleHQiLCBfX2Z1bmNfXywgX19MSU5FX18pOwotICAgICAgICBtSW5qZWN0Q29udGV4dCA9IG1CZ0NvbnRleHQ7Ci0gICAgICAgIGluamVjdEZlYXR1cmVDb25maWcobUluamVjdENvbnRleHQpOwotICAgIH0KLSAgICByZXR1cm4gbUJnQ29udGV4dDsKLX0KLQotQ29udGV4dEJhc2UqIExvY0R1YWxDb250ZXh0OjpnZXRMb2NCZ0NvbnRleHQoTXNnVGFzazo6dEFzc29jaWF0ZSB0QXNzb2NpYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbmFtZSkKLXsKLSAgICBpZiAoTlVMTCA9PSBtQmdDb250ZXh0KSB7Ci0gICAgICAgIGNvbnN0IE1zZ1Rhc2sqIG1zZ1Rhc2sgPSBnZXRNc2dUYXNrKHRBc3NvY2lhdGUsIG5hbWUpOwotICAgICAgICBtQmdDb250ZXh0ID0gbmV3IExvY0R1YWxDb250ZXh0KG1zZ1Rhc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJnRXhjbE1hc2spOwotICAgIH0KLSAgICBpZihOVUxMID09IG1JbmplY3RDb250ZXh0KSB7Ci0gICAgICAgIExPQ19MT0dEKCIlczolZF06IG1JbmplY3RDb250ZXh0IGlzIEJnQ29udGV4dCIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0gICAgICAgIG1JbmplY3RDb250ZXh0ID0gbUJnQ29udGV4dDsKLSAgICAgICAgaW5qZWN0RmVhdHVyZUNvbmZpZyhtSW5qZWN0Q29udGV4dCk7Ci0gICAgfQotICAgIHJldHVybiBtQmdDb250ZXh0OwotfQotCi12b2lkIExvY0R1YWxDb250ZXh0IDo6IGluamVjdEZlYXR1cmVDb25maWcoQ29udGV4dEJhc2UgKmN1ckNvbnRleHQpCi17Ci0gICAgTE9DX0xPR0QoIiVzOiVkXTogRW50ZXIiLCBfX2Z1bmNfXywgX19MSU5FX18pOwotICAgIGlmKGN1ckNvbnRleHQgPT0gbUluamVjdENvbnRleHQpIHsKLSAgICAgICAgTE9DX0xPR0QoIiVzOiVkXTogQ2FsbGluZyBMQlNQcm94eSAoJXApIHRvIGluamVjdCBmZWF0dXJlIGNvbmZpZyIsCi0gICAgICAgICAgICAgICAgIF9fZnVuY19fLCBfX0xJTkVfXywgKChMb2NEdWFsQ29udGV4dCAqKW1JbmplY3RDb250ZXh0KS0+bUxCU1Byb3h5KTsKLSAgICAgICAgKChMb2NEdWFsQ29udGV4dCAqKW1JbmplY3RDb250ZXh0KS0+bUxCU1Byb3h5LT5pbmplY3RGZWF0dXJlQ29uZmlnKGN1ckNvbnRleHQpOwotICAgIH0KLSAgICBMT0NfTE9HRCgiJXM6JWRdOiBFeGl0IiwgX19mdW5jX18sIF9fTElORV9fKTsKLX0KLQotTG9jRHVhbENvbnRleHQ6OkxvY0R1YWxDb250ZXh0KGNvbnN0IE1zZ1Rhc2sqIG1zZ1Rhc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9DX0FQSV9BREFQVEVSX0VWRU5UX01BU0tfVCBleE1hc2spIDoKLSAgICBDb250ZXh0QmFzZShtc2dUYXNrLCBleE1hc2ssIG1MQlNMaWJOYW1lKQotewotfQotCi19CmRpZmYgLS1naXQgYS9tc204OTc0L2NvcmUvTG9jRHVhbENvbnRleHQuaCBiL21zbTg5NzQvY29yZS9Mb2NEdWFsQ29udGV4dC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGM0ZGYzLi4wMDAwMDAwCi0tLSBhL21zbTg5NzQvY29yZS9Mb2NEdWFsQ29udGV4dC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDExLTIwMTQsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCi0gKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKLSAqICAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24sIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCi0gKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKLSAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCi0gKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCi0gKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLSNpZm5kZWYgX19MT0NfRU5HX0NPTlRFWFRfXwotI2RlZmluZSBfX0xPQ19FTkdfQ09OVEVYVF9fCi0KLSNpbmNsdWRlIDxzdGRib29sLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxkbGZjbi5oPgotI2luY2x1ZGUgPENvbnRleHRCYXNlLmg+Ci0KLW5hbWVzcGFjZSBsb2NfY29yZSB7Ci0KLWNsYXNzIExvY0R1YWxDb250ZXh0IDogcHVibGljIENvbnRleHRCYXNlIHsKLSAgICBzdGF0aWMgY29uc3QgTXNnVGFzayogbU1zZ1Rhc2s7Ci0gICAgc3RhdGljIENvbnRleHRCYXNlKiBtRmdDb250ZXh0OwotICAgIHN0YXRpYyBDb250ZXh0QmFzZSogbUJnQ29udGV4dDsKLSAgICBzdGF0aWMgQ29udGV4dEJhc2UqIG1JbmplY3RDb250ZXh0OwotICAgIHN0YXRpYyBjb25zdCBNc2dUYXNrKiBnZXRNc2dUYXNrKE1zZ1Rhc2s6OnRDcmVhdGUgdENyZWF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbmFtZSk7Ci0gICAgc3RhdGljIGNvbnN0IE1zZ1Rhc2sqIGdldE1zZ1Rhc2soTXNnVGFzazo6dEFzc29jaWF0ZSB0QXNzb2NpYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG5hbWUpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgTG9jRHVhbENvbnRleHQoY29uc3QgTXNnVGFzayogbXNnVGFzaywKLSAgICAgICAgICAgICAgICAgICBMT0NfQVBJX0FEQVBURVJfRVZFTlRfTUFTS19UIGV4TWFzayk7Ci0gICAgaW5saW5lIHZpcnR1YWwgfkxvY0R1YWxDb250ZXh0KCkge30KLQotcHVibGljOgotICAgIHN0YXRpYyBjb25zdCBjaGFyKiBtTEJTTGliTmFtZTsKLSAgICBzdGF0aWMgY29uc3QgTE9DX0FQSV9BREFQVEVSX0VWRU5UX01BU0tfVCBtRmdFeGNsTWFzazsKLSAgICBzdGF0aWMgY29uc3QgTE9DX0FQSV9BREFQVEVSX0VWRU5UX01BU0tfVCBtQmdFeGNsTWFzazsKLSAgICBzdGF0aWMgY29uc3QgY2hhciogbUxvY2F0aW9uSGFsTmFtZTsKLQotICAgIHN0YXRpYyBDb250ZXh0QmFzZSogZ2V0TG9jRmdDb250ZXh0KE1zZ1Rhc2s6OnRDcmVhdGUgdENyZWF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbmFtZSk7Ci0gICAgc3RhdGljIENvbnRleHRCYXNlKiBnZXRMb2NGZ0NvbnRleHQoTXNnVGFzazo6dEFzc29jaWF0ZSB0QXNzb2NpYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG5hbWUpOwotICAgIHN0YXRpYyBDb250ZXh0QmFzZSogZ2V0TG9jQmdDb250ZXh0KE1zZ1Rhc2s6OnRDcmVhdGUgdENyZWF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbmFtZSk7Ci0gICAgc3RhdGljIENvbnRleHRCYXNlKiBnZXRMb2NCZ0NvbnRleHQoTXNnVGFzazo6dEFzc29jaWF0ZSB0QXNzb2NpYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG5hbWUpOwotICAgIHN0YXRpYyB2b2lkIGluamVjdEZlYXR1cmVDb25maWcoQ29udGV4dEJhc2UgKmNvbnRleHQpOwotfTsKLQotfQotCi0jZW5kaWYgLy9fX0xPQ19FTkdfQ09OVEVYVF9fCmRpZmYgLS1naXQgYS9tc204OTc0L2NvcmUvTXNnVGFzay5jcHAgYi9tc204OTc0L2NvcmUvTXNnVGFzay5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkMzc1YWEuLjAwMDAwMDAKLS0tIGEvbXNtODk3NC9jb3JlL01zZ1Rhc2suY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMS0yMDEzLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZwotICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCi0gKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uLCBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAotICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgotICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCi0gKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQotICogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgotICogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0jZGVmaW5lIExPR19ORERFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiTG9jU3ZjX01zZ1Rhc2siCi0KLSNpbmNsdWRlIDxjdXRpbHMvc2NoZWRfcG9saWN5Lmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8TXNnVGFzay5oPgotI2luY2x1ZGUgPG1zZ19xLmg+Ci0jaW5jbHVkZSA8bG9nX3V0aWwuaD4KLSNpbmNsdWRlIDxsb2NfbG9nLmg+Ci0KLW5hbWVzcGFjZSBsb2NfY29yZSB7Ci0KLSNkZWZpbmUgTUFYX1RBU0tfQ09NTV9MRU4gMTUKLQotc3RhdGljIHZvaWQgTG9jTXNnRGVzdHJveSh2b2lkKiBtc2cpIHsKLSAgICBkZWxldGUgKExvY01zZyopbXNnOwotfQotCi1Nc2dUYXNrOjpNc2dUYXNrKHRDcmVhdGUgdENyZWF0b3IsIGNvbnN0IGNoYXIqIHRocmVhZE5hbWUpIDoKLSAgICBtUShtc2dfcV9pbml0MigpKSwgbUFzc29jaWF0b3IoTlVMTCl7Ci0gICAgaWYgKHRDcmVhdG9yKSB7Ci0gICAgICAgIHRDcmVhdG9yKHRocmVhZE5hbWUsIGxvb3BNYWluLAotICAgICAgICAgICAgICAgICAodm9pZCopbmV3IE1zZ1Rhc2sobVEsIG1Bc3NvY2lhdG9yKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgY3JlYXRlUFRocmVhZCh0aHJlYWROYW1lKTsKLSAgICB9Ci19Ci0KLU1zZ1Rhc2s6Ok1zZ1Rhc2sodEFzc29jaWF0ZSB0QXNzb2NpYXRvciwgY29uc3QgY2hhciogdGhyZWFkTmFtZSkgOgotICAgIG1RKG1zZ19xX2luaXQyKCkpLCBtQXNzb2NpYXRvcih0QXNzb2NpYXRvcil7Ci0gICAgY3JlYXRlUFRocmVhZCh0aHJlYWROYW1lKTsKLX0KLQotaW5saW5lCi1Nc2dUYXNrOjpNc2dUYXNrKGNvbnN0IHZvaWQqIHEsIHRBc3NvY2lhdGUgYXNzb2NpYXRvcikgOgotICAgIG1RKHEpLCBtQXNzb2NpYXRvcihhc3NvY2lhdG9yKXsKLX0KLQotTXNnVGFzazo6fk1zZ1Rhc2soKSB7Ci0gICAgbXNnX3FfdW5ibG9jaygodm9pZCopbVEpOwotfQotCi12b2lkIE1zZ1Rhc2s6OmFzc29jaWF0ZSh0QXNzb2NpYXRlIHRBc3NvY2lhdG9yKSBjb25zdCB7Ci0gICAgc3RydWN0IExvY0Fzc29jaWF0ZU1zZyA6IHB1YmxpYyBMb2NNc2cgewotICAgICAgICB0QXNzb2NpYXRlIG1Bc3NvY2lhdG9yOwotICAgICAgICBpbmxpbmUgTG9jQXNzb2NpYXRlTXNnKHRBc3NvY2lhdGUgYXNzb2NpYXRvcikgOgotICAgICAgICAgICAgTG9jTXNnKCksIG1Bc3NvY2lhdG9yKGFzc29jaWF0b3IpIHt9Ci0gICAgICAgIGlubGluZSB2aXJ0dWFsIHZvaWQgcHJvYygpIGNvbnN0IHsKLSAgICAgICAgICAgIGlmIChtQXNzb2NpYXRvcikgewotICAgICAgICAgICAgICAgIExPQ19MT0dEKCJNc2dUYXNrOjphc3NvY2lhdGUiKTsKLSAgICAgICAgICAgICAgICBtQXNzb2NpYXRvcigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfTsKLSAgICBzZW5kTXNnKG5ldyBMb2NBc3NvY2lhdGVNc2codEFzc29jaWF0b3IpKTsKLX0KLQotdm9pZCBNc2dUYXNrOjpjcmVhdGVQVGhyZWFkKGNvbnN0IGNoYXIqIHRocmVhZE5hbWUpIHsKLSAgICBwdGhyZWFkX2F0dHJfdCBhdHRyOwotICAgIHB0aHJlYWRfYXR0cl9pbml0KCZhdHRyKTsKLSAgICBwdGhyZWFkX2F0dHJfc2V0ZGV0YWNoc3RhdGUoJmF0dHIsIFBUSFJFQURfQ1JFQVRFX0RFVEFDSEVEKTsKLQotICAgIHB0aHJlYWRfdCB0aWQ7Ci0gICAgLy8gY3JlYXRlIHRoZSB0aHJlYWQgaGVyZSwgdGhlbiBpZiBzdWNjZXNzZnVsCi0gICAgLy8gYW5kIGEgbmFtZSBpcyBnaXZlbiwgd2Ugc2V0IHRoZSB0aHJlYWQgbmFtZQotICAgIGlmICghcHRocmVhZF9jcmVhdGUoJnRpZCwgJmF0dHIsIGxvb3BNYWluLAotICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5ldyBNc2dUYXNrKG1RLCBtQXNzb2NpYXRvcikpICYmCi0gICAgICAgIE5VTEwgIT0gdGhyZWFkTmFtZSkgewotICAgICAgICBjaGFyIGxuYW1lW01BWF9UQVNLX0NPTU1fTEVOKzFdOwotICAgICAgICBtZW1jcHkobG5hbWUsIHRocmVhZE5hbWUsIE1BWF9UQVNLX0NPTU1fTEVOKTsKLSAgICAgICAgbG5hbWVbTUFYX1RBU0tfQ09NTV9MRU5dID0gMDsKLSAgICAgICAgcHRocmVhZF9zZXRuYW1lX25wKHRpZCwgbG5hbWUpOwotICAgIH0KLX0KLQotdm9pZCBNc2dUYXNrOjpzZW5kTXNnKGNvbnN0IExvY01zZyogbXNnKSBjb25zdCB7Ci0gICAgbXNnX3Ffc25kKCh2b2lkKiltUSwgKHZvaWQqKW1zZywgTG9jTXNnRGVzdHJveSk7Ci19Ci0KLXZvaWQqIE1zZ1Rhc2s6Omxvb3BNYWluKHZvaWQqIGFyZykgewotICAgIE1zZ1Rhc2sqIGNvcHkgPSAoTXNnVGFzayopYXJnOwotCi0gICAgLy8gbWFrZSBzdXJlIHdlIGRvIG5vdCBydW4gaW4gYmFja2dyb3VuZCBzY2hlZHVsaW5nIGdyb3VwCi0gICAgc2V0X3NjaGVkX3BvbGljeShnZXR0aWQoKSwgU1BfRk9SRUdST1VORCk7Ci0KLSAgICBpZiAoTlVMTCAhPSBjb3B5LT5tQXNzb2NpYXRvcikgewotICAgICAgICBjb3B5LT5tQXNzb2NpYXRvcigpOwotICAgIH0KLQotICAgIExvY01zZyogbXNnOwotICAgIGludCBjbnQgPSAwOwotCi0gICAgd2hpbGUgKDEpIHsKLSAgICAgICAgTE9DX0xPR0QoIk1zZ1Rhc2s6Omxvb3AoKSAlZCBsaXN0ZW5pbmcgLi4uXG4iLCBjbnQrKyk7Ci0KLSAgICAgICAgbXNxX3FfZXJyX3R5cGUgcmVzdWx0ID0gbXNnX3FfcmN2KCh2b2lkKiljb3B5LT5tUSwgKHZvaWQgKiopJm1zZyk7Ci0KLSAgICAgICAgaWYgKGVNU0dfUV9TVUNDRVNTICE9IHJlc3VsdCkgewotICAgICAgICAgICAgTE9DX0xPR0UoIiVzOiVkXSBmYWlsIHJlY2VpdmluZyBtc2c6ICVzXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCi0gICAgICAgICAgICAgICAgICAgICBsb2NfZ2V0X21zZ19xX3N0YXR1cyhyZXN1bHQpKTsKLSAgICAgICAgICAgIC8vIGRlc3Ryb3kgdGhlIFEgYW5kIGV4aXQKLSAgICAgICAgICAgIG1zZ19xX2Rlc3Ryb3koKHZvaWQqKikmKGNvcHktPm1RKSk7Ci0gICAgICAgICAgICBkZWxldGUgY29weTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0KLSAgICAgICAgbXNnLT5sb2coKTsKLSAgICAgICAgLy8gdGhlcmUgaXMgd2hlcmUgZWFjaCBpbmRpdmlkdWFsIG1zZyBoYW5kbGluZyBpcyBpbnZva2VkCi0gICAgICAgIG1zZy0+cHJvYygpOwotCi0gICAgICAgIGRlbGV0ZSBtc2c7Ci0gICAgfQotCi0gICAgZGVsZXRlIGNvcHk7Ci0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvbXNtODk3NC9jb3JlL01zZ1Rhc2suaCBiL21zbTg5NzQvY29yZS9Nc2dUYXNrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1MGJiMzEuLjAwMDAwMDAKLS0tIGEvbXNtODk3NC9jb3JlL01zZ1Rhc2suaAorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMS0yMDEzLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZwotICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCi0gKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uLCBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAotICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgotICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCi0gKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQotICogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgotICogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0jaWZuZGVmIF9fTVNHX1RBU0tfXwotI2RlZmluZSBfX01TR19UQVNLX18KLQotI2luY2x1ZGUgPHN0ZGJvb2wuaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHB0aHJlYWQuaD4KLQotbmFtZXNwYWNlIGxvY19jb3JlIHsKLQotc3RydWN0IExvY01zZyB7Ci0gICAgaW5saW5lIExvY01zZygpIHt9Ci0gICAgaW5saW5lIHZpcnR1YWwgfkxvY01zZygpIHt9Ci0gICAgdmlydHVhbCB2b2lkIHByb2MoKSBjb25zdCA9IDA7Ci0gICAgaW5saW5lIHZpcnR1YWwgdm9pZCBsb2coKSBjb25zdCB7fQotfTsKLQotY2xhc3MgTXNnVGFzayB7Ci1wdWJsaWM6Ci0gICAgdHlwZWRlZiB2b2lkKiAoKnRTdGFydCkodm9pZCopOwotICAgIHR5cGVkZWYgcHRocmVhZF90ICgqdENyZWF0ZSkoY29uc3QgY2hhciogbmFtZSwgdFN0YXJ0IHN0YXJ0LCB2b2lkKiBhcmcpOwotICAgIHR5cGVkZWYgaW50ICgqdEFzc29jaWF0ZSkoKTsKLSAgICBNc2dUYXNrKHRDcmVhdGUgdENyZWF0b3IsIGNvbnN0IGNoYXIqIHRocmVhZE5hbWUpOwotICAgIE1zZ1Rhc2sodEFzc29jaWF0ZSB0QXNzb2NpYXRvciwgY29uc3QgY2hhciogdGhyZWFkTmFtZSk7Ci0gICAgfk1zZ1Rhc2soKTsKLSAgICB2b2lkIHNlbmRNc2coY29uc3QgTG9jTXNnKiBtc2cpIGNvbnN0OwotICAgIHZvaWQgYXNzb2NpYXRlKHRBc3NvY2lhdGUgdEFzc29jaWF0b3IpIGNvbnN0OwotCi1wcml2YXRlOgotICAgIGNvbnN0IHZvaWQqIG1ROwotICAgIHRBc3NvY2lhdGUgbUFzc29jaWF0b3I7Ci0gICAgTXNnVGFzayhjb25zdCB2b2lkKiBxLCB0QXNzb2NpYXRlIGFzc29jaWF0b3IpOwotICAgIHN0YXRpYyB2b2lkKiBsb29wTWFpbih2b2lkKiBjb3B5KTsKLSAgICB2b2lkIGNyZWF0ZVBUaHJlYWQoY29uc3QgY2hhciogbmFtZSk7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBsb2NfY29yZQotCi0jZW5kaWYgLy9fX01TR19UQVNLX18KZGlmZiAtLWdpdCBhL21zbTg5NzQvY29yZS9VbHBQcm94eUJhc2UuaCBiL21zbTg5NzQvY29yZS9VbHBQcm94eUJhc2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjlhODIyNC4uMDAwMDAwMAotLS0gYS9tc204OTc0L2NvcmUvVWxwUHJveHlCYXNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNCwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKLSAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAotICogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiwgbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKLSAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAotICogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKLSAqIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KLSAqIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotI2lmbmRlZiBVTFBfUFJPWFlfQkFTRV9ICi0jZGVmaW5lIFVMUF9QUk9YWV9CQVNFX0gKLQotI2luY2x1ZGUgPGdwc19leHRlbmRlZC5oPgotCi1uYW1lc3BhY2UgbG9jX2NvcmUgewotCi1jbGFzcyBMb2NBZGFwdGVyQmFzZTsKLQotY2xhc3MgVWxwUHJveHlCYXNlIHsKLXB1YmxpYzoKLSAgICBMb2NQb3NNb2RlIG1Qb3NNb2RlOwotICAgIGJvb2wgbUZpeFNldDsKLSAgICBpbmxpbmUgVWxwUHJveHlCYXNlKCkgewotICAgICAgICBtUG9zTW9kZS5tb2RlID0gTE9DX1BPU0lUSU9OX01PREVfSU5WQUxJRDsKLSAgICAgICAgbUZpeFNldCA9IGZhbHNlOwotICAgIH0KLSAgICBpbmxpbmUgdmlydHVhbCB+VWxwUHJveHlCYXNlKCkge30KLSAgICBpbmxpbmUgdmlydHVhbCBib29sIHNlbmRTdGFydEZpeCgpIHsgbUZpeFNldCA9IHRydWU7IHJldHVybiBmYWxzZTsgfQotICAgIGlubGluZSB2aXJ0dWFsIGJvb2wgc2VuZFN0b3BGaXgoKSB7IG1GaXhTZXQgPSBmYWxzZTsgcmV0dXJuIGZhbHNlOyB9Ci0gICAgaW5saW5lIHZpcnR1YWwgYm9vbCBzZW5kRml4TW9kZShMb2NQb3NNb2RlICZwYXJhbXMpIHsKLSAgICAgICAgbVBvc01vZGUgPSBwYXJhbXM7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpbmxpbmUgdmlydHVhbCBib29sIHJlcG9ydFBvc2l0aW9uKFVscExvY2F0aW9uICZsb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdwc0xvY2F0aW9uRXh0ZW5kZWQgJmxvY2F0aW9uRXh0ZW5kZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBsb2NhdGlvbkV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gbG9jX3Nlc3Nfc3RhdHVzIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY1Bvc1RlY2hNYXNrIGxvY190ZWNobm9sb2d5X21hc2spIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpbmxpbmUgdmlydHVhbCBib29sIHJlcG9ydFN2KEdwc1N2U3RhdHVzICZzdlN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdwc0xvY2F0aW9uRXh0ZW5kZWQgJmxvY2F0aW9uRXh0ZW5kZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBzdkV4dCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGlubGluZSB2aXJ0dWFsIGJvb2wgcmVwb3J0U3RhdHVzKEdwc1N0YXR1c1ZhbHVlIHN0YXR1cykgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGlubGluZSB2aXJ0dWFsIHZvaWQgc2V0QWRhcHRlcihMb2NBZGFwdGVyQmFzZSogYWRhcHRlcikge30KLSAgICBpbmxpbmUgdmlydHVhbCB2b2lkIHNldENhcGFiaWxpdGllcyh1bnNpZ25lZCBsb25nIGNhcGFiaWxpdGllcykge30KLSAgICBpbmxpbmUgdmlydHVhbCBib29sIHJlcG9ydEJhdGNoaW5nU2Vzc2lvbihHcHNFeHRCYXRjaE9wdGlvbnMgJm9wdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhY3RpdmUpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpbmxpbmUgdmlydHVhbCBib29sIHJlcG9ydFBvc2l0aW9ucyhHcHNFeHRMb2NhdGlvbiAqIGxvY2F0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bWJlcl9vZl9sb2NhdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBsb2Nfc2Vzc19zdGF0dXMgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY1Bvc1RlY2hNYXNrIHRlY2hNYXNrKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19OwotCi19IC8vIG5hbWVzcGFjZSBsb2NfY29yZQotCi0jZW5kaWYgLy8gVUxQX1BST1hZX0JBU0VfSApkaWZmIC0tZ2l0IGEvbXNtODk3NC9jb3JlL2dwc19leHRlbmRlZC5oIGIvbXNtODk3NC9jb3JlL2dwc19leHRlbmRlZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGIwNDE1Li4wMDAwMDAwCi0tLSBhL21zbTg5NzQvY29yZS9ncHNfZXh0ZW5kZWQuaAorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKLSAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAotICogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAotICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgotICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCi0gKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQotICogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgotICogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2lmbmRlZiBHUFNfRVhURU5ERURfSAotI2RlZmluZSBHUFNfRVhURU5ERURfSAotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLSNpbmNsdWRlIDxncHNfZXh0ZW5kZWRfYy5oPgotCi1zdHJ1Y3QgTG9jUG9zTW9kZQotewotICAgIExvY1Bvc2l0aW9uTW9kZSBtb2RlOwotICAgIEdwc1Bvc2l0aW9uUmVjdXJyZW5jZSByZWN1cnJlbmNlOwotICAgIHVpbnQzMl90IG1pbl9pbnRlcnZhbDsKLSAgICB1aW50MzJfdCBwcmVmZXJyZWRfYWNjdXJhY3k7Ci0gICAgdWludDMyX3QgcHJlZmVycmVkX3RpbWU7Ci0gICAgY2hhciBjcmVkZW50aWFsc1sxNF07Ci0gICAgY2hhciBwcm92aWRlcls4XTsKLSAgICBMb2NQb3NNb2RlKExvY1Bvc2l0aW9uTW9kZSBtLCBHcHNQb3NpdGlvblJlY3VycmVuY2UgcmVjciwKLSAgICAgICAgICAgICAgIHVpbnQzMl90IGdhcCwgdWludDMyX3QgYWNjdSwgdWludDMyX3QgdGltZSwKLSAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNyZWQsIGNvbnN0IGNoYXIqIHByb3YpIDoKLSAgICAgICAgbW9kZShtKSwgcmVjdXJyZW5jZShyZWNyKSwKLSAgICAgICAgbWluX2ludGVydmFsKGdhcCA8IE1JTl9QT1NTSUJMRV9GSVhfSU5URVJWQUwgPyBNSU5fUE9TU0lCTEVfRklYX0lOVEVSVkFMIDogZ2FwKSwKLSAgICAgICAgcHJlZmVycmVkX2FjY3VyYWN5KGFjY3UpLCBwcmVmZXJyZWRfdGltZSh0aW1lKSB7Ci0gICAgICAgIG1lbXNldChjcmVkZW50aWFscywgMCwgc2l6ZW9mKGNyZWRlbnRpYWxzKSk7Ci0gICAgICAgIG1lbXNldChwcm92aWRlciwgMCwgc2l6ZW9mKHByb3ZpZGVyKSk7Ci0gICAgICAgIGlmIChOVUxMICE9IGNyZWQpIHsKLSAgICAgICAgICAgIG1lbWNweShjcmVkZW50aWFscywgY3JlZCwgc2l6ZW9mKGNyZWRlbnRpYWxzKS0xKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoTlVMTCAhPSBwcm92KSB7Ci0gICAgICAgICAgICBtZW1jcHkocHJvdmlkZXIsIHByb3YsIHNpemVvZihwcm92aWRlciktMSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpbmxpbmUgTG9jUG9zTW9kZSgpIDoKLSAgICAgICAgbW9kZShMT0NfUE9TSVRJT05fTU9ERV9NU19CQVNFRCksCi0gICAgICAgIHJlY3VycmVuY2UoR1BTX1BPU0lUSU9OX1JFQ1VSUkVOQ0VfUEVSSU9ESUMpLAotICAgICAgICBtaW5faW50ZXJ2YWwoTUlOX1BPU1NJQkxFX0ZJWF9JTlRFUlZBTCksCi0gICAgICAgIHByZWZlcnJlZF9hY2N1cmFjeSg1MCksIHByZWZlcnJlZF90aW1lKDEyMDAwMCkgewotICAgICAgICBtZW1zZXQoY3JlZGVudGlhbHMsIDAsIHNpemVvZihjcmVkZW50aWFscykpOwotICAgICAgICBtZW1zZXQocHJvdmlkZXIsIDAsIHNpemVvZihwcm92aWRlcikpOwotICAgIH0KLQotICAgIGlubGluZSBib29sIGVxdWFscyhjb25zdCBMb2NQb3NNb2RlICZhbm90aGVyTW9kZSkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBhbm90aGVyTW9kZS5tb2RlID09IG1vZGUgJiYKLSAgICAgICAgICAgIGFub3RoZXJNb2RlLnJlY3VycmVuY2UgPT0gcmVjdXJyZW5jZSAmJgotICAgICAgICAgICAgYW5vdGhlck1vZGUubWluX2ludGVydmFsID09IG1pbl9pbnRlcnZhbCAmJgotICAgICAgICAgICAgYW5vdGhlck1vZGUucHJlZmVycmVkX2FjY3VyYWN5ID09IHByZWZlcnJlZF9hY2N1cmFjeSAmJgotICAgICAgICAgICAgYW5vdGhlck1vZGUucHJlZmVycmVkX3RpbWUgPT0gcHJlZmVycmVkX3RpbWUgJiYKLSAgICAgICAgICAgICFzdHJuY21wKGFub3RoZXJNb2RlLmNyZWRlbnRpYWxzLCBjcmVkZW50aWFscywgc2l6ZW9mKGNyZWRlbnRpYWxzKS0xKSAmJgotICAgICAgICAgICAgIXN0cm5jbXAoYW5vdGhlck1vZGUucHJvdmlkZXIsIHByb3ZpZGVyLCBzaXplb2YocHJvdmlkZXIpLTEpOwotICAgIH0KLQotICAgIHZvaWQgbG9ndigpIGNvbnN0OwotfTsKLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jZW5kaWYgLyogR1BTX0VYVEVOREVEX0ggKi8KLQpkaWZmIC0tZ2l0IGEvbXNtODk3NC9jb3JlL2dwc19leHRlbmRlZF9jLmggYi9tc204OTc0L2NvcmUvZ3BzX2V4dGVuZGVkX2MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjYyZTBlYS4uMDAwMDAwMAotLS0gYS9tc204OTc0L2NvcmUvZ3BzX2V4dGVuZGVkX2MuaAorKysgL2Rldi9udWxsCkBAIC0xLDM5OSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNCwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKLSAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAotICogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAotICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgotICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCi0gKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQotICogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgotICogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2lmbmRlZiBHUFNfRVhURU5ERURfQ19ICi0jZGVmaW5lIEdQU19FWFRFTkRFRF9DX0gKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxzdGRib29sLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvZ3BzLmg+Ci0KLS8qKiBMb2NhdGlvbiBoYXMgdmFsaWQgc291cmNlIGluZm9ybWF0aW9uLiAqLwotI2RlZmluZSBMT0NBVElPTl9IQVNfU09VUkNFX0lORk8gICAweDAwMjAKLS8qKiBHcHNMb2NhdGlvbiBoYXMgdmFsaWQgImlzIGluZG9vcj8iIGZsYWcgKi8KLSNkZWZpbmUgR1BTX0xPQ0FUSU9OX0hBU19JU19JTkRPT1IgICAweDAwNDAKLS8qKiBHcHNMb2NhdGlvbiBoYXMgdmFsaWQgZmxvb3IgbnVtYmVyICovCi0jZGVmaW5lIEdQU19MT0NBVElPTl9IQVNfRkxPT1JfTlVNQkVSICAgMHgwMDgwCi0vKiogR3BzTG9jYXRpb24gaGFzIHZhbGlkIG1hcCBVUkwqLwotI2RlZmluZSBHUFNfTE9DQVRJT05fSEFTX01BUF9VUkwgICAweDAxMDAKLS8qKiBHcHNMb2NhdGlvbiBoYXMgdmFsaWQgbWFwIGluZGV4ICovCi0jZGVmaW5lIEdQU19MT0NBVElPTl9IQVNfTUFQX0lOREVYICAgMHgwMjAwCi0KLS8qKiBTaXplcyBmb3IgaW5kb29yIGZpZWxkcyAqLwotI2RlZmluZSBHUFNfTE9DQVRJT05fTUFQX1VSTF9TSVpFIDQwMAotI2RlZmluZSBHUFNfTE9DQVRJT05fTUFQX0lOREVYX1NJWkUgMTYKLQotLyoqIFBvc2l0aW9uIHNvdXJjZSBpcyBVTFAgKi8KLSNkZWZpbmUgVUxQX0xPQ0FUSU9OX0lTX0ZST01fSFlCUklEICAgMHgwMDAxCi0vKiogUG9zaXRpb24gc291cmNlIGlzIEdOU1Mgb25seSAqLwotI2RlZmluZSBVTFBfTE9DQVRJT05fSVNfRlJPTV9HTlNTICAgICAweDAwMDIKLS8qKiBQb3NpdGlvbiBzb3VyY2UgaXMgWlBQIG9ubHkgKi8KLSNkZWZpbmUgVUxQX0xPQ0FUSU9OX0lTX0ZST01fWlBQICAgICAgMHgwMDA0Ci0vKiogUG9zaXRpb24gaXMgZnJvbSBhIEdlb2ZlbmNlIEJyZWFjaCBFdmVudCAqLwotI2RlZmluZSBVTFBfTE9DQVRJT05fSVNfRlJPTV9HRU9GRU5DRSAwWDAwMDgKLS8qKiBQb3NpdGlvaW4gaXMgZnJvbSBIYXJkd2FyZSBGTFAgKi8KLSNkZWZpbmUgVUxQX0xPQ0FUSU9OX0lTX0ZST01fSFdfRkxQICAgMHgwMDEwCi0KLSNkZWZpbmUgVUxQX01JTl9JTlRFUlZBTF9JTlZBTElEIDB4ZmZmZmZmZmYKLQotLypFbWVyZ2VuY3kgU1VQTCovCi0jZGVmaW5lIEdQU19OSV9UWVBFX0VNRVJHRU5DWV9TVVBMICAgIDQKLQotI2RlZmluZSBBR1BTX0NFUlRJRklDQVRFX01BWF9MRU5HVEggMjAwMAotI2RlZmluZSBBR1BTX0NFUlRJRklDQVRFX01BWF9TTE9UUyAxMAotCi1lbnVtIGxvY19yZWdpc3RyYXRpb25fbWFza19zdGF0dXMgewotICAgIExPQ19SRUdJU1RSQVRJT05fTUFTS19FTkFCTEVELAotICAgIExPQ19SRUdJU1RSQVRJT05fTUFTS19ESVNBQkxFRAotfTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIC8qKiBzZXQgdG8gc2l6ZW9mKFVscExvY2F0aW9uKSAqLwotICAgIHNpemVfdCAgICAgICAgICBzaXplOwotICAgIEdwc0xvY2F0aW9uICAgICBncHNMb2NhdGlvbjsKLSAgICAvKiBQcm92aWRlciBpbmRpY2F0b3IgZm9yIEhZQlJJRCBvciBHUFMgKi8KLSAgICB1aW50MTZfdCAgICAgICAgcG9zaXRpb25fc291cmNlOwotICAgIC8qYWxsb3dzIEhBTCB0byBwYXNzIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVsYXRlZCB0byB0aGUgbG9jYXRpb24gKi8KLSAgICBpbnQgICAgICAgICAgICAgcmF3RGF0YVNpemU7ICAgICAgICAgLyogaW4gIyBvZiBieXRlcyAqLwotICAgIHZvaWQgICAgICAgICAgICAqIHJhd0RhdGE7Ci0gICAgYm9vbCAgICAgICAgICAgIGlzX2luZG9vcjsKLSAgICBmbG9hdCAgICAgICAgICAgZmxvb3JfbnVtYmVyOwotICAgIGNoYXIgICAgICAgICAgICBtYXBfdXJsW0dQU19MT0NBVElPTl9NQVBfVVJMX1NJWkVdOwotICAgIHVuc2lnbmVkIGNoYXIgICBtYXBfaW5kZXhbR1BTX0xPQ0FUSU9OX01BUF9JTkRFWF9TSVpFXTsKLX0gVWxwTG9jYXRpb247Ci0KLS8qKiBBR1BTIHR5cGUgKi8KLXR5cGVkZWYgaW50MTZfdCBBR3BzRXh0VHlwZTsKLSNkZWZpbmUgQUdQU19UWVBFX0lOVkFMSUQgICAgICAgLTEKLSNkZWZpbmUgQUdQU19UWVBFX0FOWSAgICAgICAgICAgMAotI2RlZmluZSBBR1BTX1RZUEVfU1VQTCAgICAgICAgICAxCi0jZGVmaW5lIEFHUFNfVFlQRV9DMksgICAgICAgICAgIDIKLSNkZWZpbmUgQUdQU19UWVBFX1dXQU5fQU5ZICAgICAgMwotI2RlZmluZSBBR1BTX1RZUEVfV0lGSSAgICAgICAgICA0Ci0jZGVmaW5lIEFHUFNfVFlQRV9TVVBMX0VTICAgICAgIDUKLQotLyoqIFNTSUQgbGVuZ3RoICovCi0jZGVmaW5lIFNTSURfQlVGX1NJWkUgKDMyKzEpCi0KLXR5cGVkZWYgaW50MTZfdCBBR3BzQmVhcmVyVHlwZTsKLSNkZWZpbmUgQUdQU19BUE5fQkVBUkVSX0lOVkFMSUQgICAgLTEKLSNkZWZpbmUgQUdQU19BUE5fQkVBUkVSX0lQVjQgICAgICAgIDAKLSNkZWZpbmUgQUdQU19BUE5fQkVBUkVSX0lQVjYgICAgICAgIDEKLSNkZWZpbmUgQUdQU19BUE5fQkVBUkVSX0lQVjRWNiAgICAgIDIKLQotI2RlZmluZSBHUFNfREVMRVRFX0FMTUFOQUNfQ09SUiAgICAgMHgwMDAwMTAwMAotI2RlZmluZSBHUFNfREVMRVRFX0ZSRVFfQklBU19FU1QgICAgMHgwMDAwMjAwMAotI2RlZmluZSBHUFNfREVMRVRFX0VQSEVNRVJJU19HTE8gICAgMHgwMDAwNDAwMAotI2RlZmluZSBHUFNfREVMRVRFX0FMTUFOQUNfR0xPICAgICAgMHgwMDAwODAwMAotI2RlZmluZSBHUFNfREVMRVRFX1NWRElSX0dMTyAgICAgICAgMHgwMDAxMDAwMAotI2RlZmluZSBHUFNfREVMRVRFX1NWU1RFRVJfR0xPICAgICAgMHgwMDAyMDAwMAotI2RlZmluZSBHUFNfREVMRVRFX0FMTUFOQUNfQ09SUl9HTE8gMHgwMDA0MDAwMAotI2RlZmluZSBHUFNfREVMRVRFX1RJTUVfR1BTICAgICAgICAgMHgwMDA4MDAwMAotI2RlZmluZSBHUFNfREVMRVRFX1RJTUVfR0xPICAgICAgICAgMHgwMDEwMDAwMAotCi0vKiogR1BTIGV4dGVuZGVkIGNhbGxiYWNrIHN0cnVjdHVyZS4gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICAvKiogc2V0IHRvIHNpemVvZihHcHNDYWxsYmFja3MpICovCi0gICAgc2l6ZV90ICAgICAgc2l6ZTsKLSAgICBncHNfc2V0X2NhcGFiaWxpdGllcyBzZXRfY2FwYWJpbGl0aWVzX2NiOwotICAgIGdwc19hY3F1aXJlX3dha2Vsb2NrIGFjcXVpcmVfd2FrZWxvY2tfY2I7Ci0gICAgZ3BzX3JlbGVhc2Vfd2FrZWxvY2sgcmVsZWFzZV93YWtlbG9ja19jYjsKLSAgICBncHNfY3JlYXRlX3RocmVhZCBjcmVhdGVfdGhyZWFkX2NiOwotICAgIGdwc19yZXF1ZXN0X3V0Y190aW1lIHJlcXVlc3RfdXRjX3RpbWVfY2I7Ci19IEdwc0V4dENhbGxiYWNrczsKLQotLyoqIEdQUyBleHRlbmRlZCBiYXRjaCBvcHRpb25zICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgZG91YmxlIG1heF9wb3dlcl9hbGxvY2F0aW9uX21XOwotICAgIHVpbnQzMl90IHNvdXJjZXNfdG9fdXNlOwotICAgIHVpbnQzMl90IGZsYWdzOwotICAgIGludDY0X3QgcGVyaW9kX25zOwotfSBHcHNFeHRCYXRjaE9wdGlvbnM7Ci0KLS8qKiBDYWxsYmFjayB0byByZXBvcnQgdGhlIHh0cmEgc2VydmVyIHVybCB0byB0aGUgY2xpZW50LgotICogIFRoZSBjbGllbnQgc2hvdWxkIHVzZSB0aGlzIHVybCB3aGVuIGRvd25sb2FkaW5nIHh0cmEgdW5sZXNzIG92ZXJ3cml0dGVuCi0gKiAgaW4gdGhlIGdwcy5jb25mIGZpbGUKLSAqLwotdHlwZWRlZiB2b2lkICgqIHJlcG9ydF94dHJhX3NlcnZlcikoY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7Ci0KLS8qKiBDYWxsYmFjayBzdHJ1Y3R1cmUgZm9yIHRoZSBYVFJBIGludGVyZmFjZS4gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBncHNfeHRyYV9kb3dubG9hZF9yZXF1ZXN0IGRvd25sb2FkX3JlcXVlc3RfY2I7Ci0gICAgZ3BzX2NyZWF0ZV90aHJlYWQgY3JlYXRlX3RocmVhZF9jYjsKLSAgICByZXBvcnRfeHRyYV9zZXJ2ZXIgcmVwb3J0X3h0cmFfc2VydmVyX2NiOwotfSBHcHNYdHJhRXh0Q2FsbGJhY2tzOwotCi0vKiogUmVwcmVzZW50cyB0aGUgc3RhdHVzIG9mIEFHUFMuICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgLyoqIHNldCB0byBzaXplb2YoQUdwc0V4dFN0YXR1cykgKi8KLSAgICBzaXplX3QgICAgICAgICAgc2l6ZTsKLQotICAgIEFHcHNFeHRUeXBlIHR5cGU7Ci0gICAgQUdwc1N0YXR1c1ZhbHVlIHN0YXR1czsKLSAgICB1aW50MzJfdCAgICAgICAgaXB2NF9hZGRyOwotICAgIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIGFkZHI7Ci0gICAgY2hhciAgICAgICAgICAgIHNzaWRbU1NJRF9CVUZfU0laRV07Ci0gICAgY2hhciAgICAgICAgICAgIHBhc3N3b3JkW1NTSURfQlVGX1NJWkVdOwotfSBBR3BzRXh0U3RhdHVzOwotCi0vKiogQ2FsbGJhY2sgd2l0aCBBR1BTIHN0YXR1cyBpbmZvcm1hdGlvbi4KLSAqICBDYW4gb25seSBiZSBjYWxsZWQgZnJvbSBhIHRocmVhZCBjcmVhdGVkIGJ5IGNyZWF0ZV90aHJlYWRfY2IuCi0gKi8KLXR5cGVkZWYgdm9pZCAoKiBhZ3BzX3N0YXR1c19leHRlbmRlZCkoQUdwc0V4dFN0YXR1cyogc3RhdHVzKTsKLQotLyoqIENhbGxiYWNrIHN0cnVjdHVyZSBmb3IgdGhlIEFHUFMgaW50ZXJmYWNlLiAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGFncHNfc3RhdHVzX2V4dGVuZGVkIHN0YXR1c19jYjsKLSAgICBncHNfY3JlYXRlX3RocmVhZCBjcmVhdGVfdGhyZWFkX2NiOwotfSBBR3BzRXh0Q2FsbGJhY2tzOwotCi0KLS8qKiBHUFMgTkkgY2FsbGJhY2sgc3RydWN0dXJlLiAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICAvKioKLSAgICAgKiBTZW5kcyB0aGUgbm90aWZpY2F0aW9uIHJlcXVlc3QgZnJvbSBIQUwgdG8gR1BTTG9jYXRpb25Qcm92aWRlci4KLSAgICAgKi8KLSAgICBncHNfbmlfbm90aWZ5X2NhbGxiYWNrIG5vdGlmeV9jYjsKLSAgICBncHNfY3JlYXRlX3RocmVhZCBjcmVhdGVfdGhyZWFkX2NiOwotfSBHcHNOaUV4dENhbGxiYWNrczsKLQotdHlwZWRlZiBlbnVtIGxvY19zZXJ2ZXJfdHlwZSB7Ci0gICAgTE9DX0FHUFNfQ0RNQV9QREVfU0VSVkVSLAotICAgIExPQ19BR1BTX0NVU1RPTV9QREVfU0VSVkVSLAotICAgIExPQ19BR1BTX01QQ19TRVJWRVIsCi0gICAgTE9DX0FHUFNfU1VQTF9TRVJWRVIKLX0gTG9jU2VydmVyVHlwZTsKLQotdHlwZWRlZiBlbnVtIGxvY19wb3NpdGlvbl9tb2RlX3R5cGUgewotICAgIExPQ19QT1NJVElPTl9NT0RFX0lOVkFMSUQgPSAtMSwKLSAgICBMT0NfUE9TSVRJT05fTU9ERV9TVEFOREFMT05FID0gMCwKLSAgICBMT0NfUE9TSVRJT05fTU9ERV9NU19CQVNFRCwKLSAgICBMT0NfUE9TSVRJT05fTU9ERV9NU19BU1NJU1RFRCwKLSAgICBMT0NfUE9TSVRJT05fTU9ERV9SRVNFUlZFRF8xLAotICAgIExPQ19QT1NJVElPTl9NT0RFX1JFU0VSVkVEXzIsCi0gICAgTE9DX1BPU0lUSU9OX01PREVfUkVTRVJWRURfMywKLSAgICBMT0NfUE9TSVRJT05fTU9ERV9SRVNFUlZFRF80LAotICAgIExPQ19QT1NJVElPTl9NT0RFX1JFU0VSVkVEXzUKLQotfSBMb2NQb3NpdGlvbk1vZGU7Ci0KLSNkZWZpbmUgTUlOX1BPU1NJQkxFX0ZJWF9JTlRFUlZBTCAxMDAwIC8qIG1zZWMgKi8KLQotLyoqIEdwc0xvY2F0aW9uRXh0ZW5kZWQgaGFzIHZhbGlkIGxhdGl0dWRlIGFuZCBsb25naXR1ZGUuICovCi0jZGVmaW5lIEdQU19MT0NBVElPTl9FWFRFTkRFRF9IQVNfTEFUX0xPTkcgICAoMVU8PDApCi0vKiogR3BzTG9jYXRpb25FeHRlbmRlZCBoYXMgdmFsaWQgYWx0aXR1ZGUuICovCi0jZGVmaW5lIEdQU19MT0NBVElPTl9FWFRFTkRFRF9IQVNfQUxUSVRVREUgICAoMVU8PDEpCi0vKiogR3BzTG9jYXRpb25FeHRlbmRlZCBoYXMgdmFsaWQgc3BlZWQuICovCi0jZGVmaW5lIEdQU19MT0NBVElPTl9FWFRFTkRFRF9IQVNfU1BFRUQgICAgICAoMVU8PDIpCi0vKiogR3BzTG9jYXRpb25FeHRlbmRlZCBoYXMgdmFsaWQgYmVhcmluZy4gKi8KLSNkZWZpbmUgR1BTX0xPQ0FUSU9OX0VYVEVOREVEX0hBU19CRUFSSU5HICAgICgxVTw8NCkKLS8qKiBHcHNMb2NhdGlvbkV4dGVuZGVkIGhhcyB2YWxpZCBhY2N1cmFjeS4gKi8KLSNkZWZpbmUgR1BTX0xPQ0FUSU9OX0VYVEVOREVEX0hBU19BQ0NVUkFDWSAgICgxVTw8OCkKLQotLyoqIEdQUyBleHRlbmRlZCBzdXBwb3J0cyBnZW9mZW5jaW5nICovCi0jZGVmaW5lIEdQU19FWFRFTkRFRF9DQVBBQklMSVRZX0dFT0ZFTkNFICAgICAweDAwMDAwMDEKLS8qKiBHUFMgZXh0ZW5kZWQgc3VwcG9ydHMgYmF0Y2hpbmcgKi8KLSNkZWZpbmUgR1BTX0VYVEVOREVEX0NBUEFCSUxJVFlfQkFUQ0hJTkcgICAgIDB4MDAwMDAwMgotCi0vKiogRmxhZ3MgdG8gaW5kaWNhdGUgd2hpY2ggdmFsdWVzIGFyZSB2YWxpZCBpbiBhIEdwc0xvY2F0aW9uRXh0ZW5kZWQuICovCi10eXBlZGVmIHVpbnQxNl90IEdwc0xvY2F0aW9uRXh0ZW5kZWRGbGFnczsKLS8qKiBHcHNMb2NhdGlvbkV4dGVuZGVkIGhhcyB2YWxpZCBwZG9wLCBoZG9wLCB2ZG9wLiAqLwotI2RlZmluZSBHUFNfTE9DQVRJT05fRVhURU5ERURfSEFTX0RPUCAweDAwMDEKLS8qKiBHcHNMb2NhdGlvbkV4dGVuZGVkIGhhcyB2YWxpZCBhbHRpdHVkZSBtZWFuIHNlYSBsZXZlbC4gKi8KLSNkZWZpbmUgR1BTX0xPQ0FUSU9OX0VYVEVOREVEX0hBU19BTFRJVFVERV9NRUFOX1NFQV9MRVZFTCAweDAwMDIKLS8qKiBVbHBMb2NhdGlvbiBoYXMgdmFsaWQgbWFnbmV0aWMgZGV2aWF0aW9uLiAqLwotI2RlZmluZSBHUFNfTE9DQVRJT05fRVhURU5ERURfSEFTX01BR19ERVYgMHgwMDA0Ci0vKiogVWxwTG9jYXRpb24gaGFzIHZhbGlkIG1vZGUgaW5kaWNhdG9yLiAqLwotI2RlZmluZSBHUFNfTE9DQVRJT05fRVhURU5ERURfSEFTX01PREVfSU5EIDB4MDAwOAotLyoqIEdwc0xvY2F0aW9uRXh0ZW5kZWQgaGFzIHZhbGlkIHZlcnRpY2FsIHVuY2VydGFpbnR5ICovCi0jZGVmaW5lIEdQU19MT0NBVElPTl9FWFRFTkRFRF9IQVNfVkVSVF9VTkMgMHgwMDEwCi0vKiogR3BzTG9jYXRpb25FeHRlbmRlZCBoYXMgdmFsaWQgc3BlZWQgdW5jZXJ0YWludHkgKi8KLSNkZWZpbmUgR1BTX0xPQ0FUSU9OX0VYVEVOREVEX0hBU19TUEVFRF9VTkMgMHgwMDIwCi0KLS8qKiBSZXByZXNlbnRzIGdwcyBsb2NhdGlvbiBleHRlbmRlZC4gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICAvKiogc2V0IHRvIHNpemVvZihHcHNMb2NhdGlvbkV4dGVuZGVkKSAqLwotICAgIHNpemVfdCAgICAgICAgICBzaXplOwotICAgIC8qKiBDb250YWlucyBHcHNMb2NhdGlvbkV4dGVuZGVkRmxhZ3MgYml0cy4gKi8KLSAgICB1aW50MTZfdCAgICAgICAgZmxhZ3M7Ci0gICAgLyoqIENvbnRhaW5zIHRoZSBBbHRpdHVkZSB3cnQgbWVhbiBzZWEgbGV2ZWwgKi8KLSAgICBmbG9hdCAgICAgICAgICAgYWx0aXR1ZGVNZWFuU2VhTGV2ZWw7Ci0gICAgLyoqIENvbnRhaW5zIFBvc2l0aW9uIERpbHVzaW9uIG9mIFByZWNpc2lvbi4gKi8KLSAgICBmbG9hdCAgICAgICAgICAgcGRvcDsKLSAgICAvKiogQ29udGFpbnMgSG9yaXpvbnRhbCBEaWx1c2lvbiBvZiBQcmVjaXNpb24uICovCi0gICAgZmxvYXQgICAgICAgICAgIGhkb3A7Ci0gICAgLyoqIENvbnRhaW5zIFZlcnRpY2FsIERpbHVzaW9uIG9mIFByZWNpc2lvbi4gKi8KLSAgICBmbG9hdCAgICAgICAgICAgdmRvcDsKLSAgICAvKiogQ29udGFpbnMgTWFnbmV0aWMgRGV2aWF0aW9uLiAqLwotICAgIGZsb2F0ICAgICAgICAgICBtYWduZXRpY0RldmlhdGlvbjsKLSAgICAvKiogdmVydGljYWwgdW5jZXJ0YWludHkgaW4gbWV0ZXJzICovCi0gICAgZmxvYXQgICAgICAgICAgIHZlcnRfdW5jOwotICAgIC8qKiBzcGVlZCB1bmNlcnRhaW50eSBpbiBtL3MgKi8KLSAgICBmbG9hdCAgICAgICAgICAgc3BlZWRfdW5jOwotfSBHcHNMb2NhdGlvbkV4dGVuZGVkOwotCi10eXBlZGVmIHN0cnVjdCBHcHNFeHRMb2NhdGlvbl9zIHsKLSAgICBzaXplX3QgICAgICAgICAgc2l6ZTsKLSAgICB1aW50MTZfdCAgICAgICAgZmxhZ3M7Ci0gICAgZG91YmxlICAgICAgICAgIGxhdGl0dWRlOwotICAgIGRvdWJsZSAgICAgICAgICBsb25naXR1ZGU7Ci0gICAgZG91YmxlICAgICAgICAgIGFsdGl0dWRlOwotICAgIGZsb2F0ICAgICAgICAgICBzcGVlZDsKLSAgICBmbG9hdCAgICAgICAgICAgYmVhcmluZzsKLSAgICBmbG9hdCAgICAgICAgICAgYWNjdXJhY3k7Ci0gICAgaW50NjRfdCAgICAgICAgIHRpbWVzdGFtcDsKLSAgICB1aW50MzJfdCAgICAgICAgc291cmNlc191c2VkOwotfSBHcHNFeHRMb2NhdGlvbjsKLQotZW51bSBsb2Nfc2Vzc19zdGF0dXMgewotICAgIExPQ19TRVNTX1NVQ0NFU1MsCi0gICAgTE9DX1NFU1NfSU5URVJNRURJQVRFLAotICAgIExPQ19TRVNTX0ZBSUxVUkUKLX07Ci0KLXR5cGVkZWYgdWludDMyX3QgTG9jUG9zVGVjaE1hc2s7Ci0jZGVmaW5lIExPQ19QT1NfVEVDSF9NQVNLX0RFRkFVTFQgKChMb2NQb3NUZWNoTWFzaykweDAwMDAwMDAwKQotI2RlZmluZSBMT0NfUE9TX1RFQ0hfTUFTS19TQVRFTExJVEUgKChMb2NQb3NUZWNoTWFzaykweDAwMDAwMDAxKQotI2RlZmluZSBMT0NfUE9TX1RFQ0hfTUFTS19DRUxMSUQgKChMb2NQb3NUZWNoTWFzaykweDAwMDAwMDAyKQotI2RlZmluZSBMT0NfUE9TX1RFQ0hfTUFTS19XSUZJICgoTG9jUG9zVGVjaE1hc2spMHgwMDAwMDAwNCkKLSNkZWZpbmUgTE9DX1BPU19URUNIX01BU0tfU0VOU09SUyAoKExvY1Bvc1RlY2hNYXNrKTB4MDAwMDAwMDgpCi0jZGVmaW5lIExPQ19QT1NfVEVDSF9NQVNLX1JFRkVSRU5DRV9MT0NBVElPTiAoKExvY1Bvc1RlY2hNYXNrKTB4MDAwMDAwMTApCi0jZGVmaW5lIExPQ19QT1NfVEVDSF9NQVNLX0lOSkVDVEVEX0NPQVJTRV9QT1NJVElPTiAoKExvY1Bvc1RlY2hNYXNrKTB4MDAwMDAwMjApCi0jZGVmaW5lIExPQ19QT1NfVEVDSF9NQVNLX0FGTFQgKChMb2NQb3NUZWNoTWFzaykweDAwMDAwMDQwKQotI2RlZmluZSBMT0NfUE9TX1RFQ0hfTUFTS19IWUJSSUQgKChMb2NQb3NUZWNoTWFzaykweDAwMDAwMDgwKQotCi10eXBlZGVmIGVudW0gewotICBMT0NfRU5HX0lGX1JFUVVFU1RfU0VOREVSX0lEX1FVSVBDID0gMCwKLSAgTE9DX0VOR19JRl9SRVFVRVNUX1NFTkRFUl9JRF9NU0FQTSwKLSAgTE9DX0VOR19JRl9SRVFVRVNUX1NFTkRFUl9JRF9NU0FQVSwKLSAgTE9DX0VOR19JRl9SRVFVRVNUX1NFTkRFUl9JRF9HUFNPTkVfREFFTU9OLAotICBMT0NfRU5HX0lGX1JFUVVFU1RfU0VOREVSX0lEX01PREVNLAotICBMT0NfRU5HX0lGX1JFUVVFU1RfU0VOREVSX0lEX1VOS05PV04KLX0gbG9jX2lmX3JlcV9zZW5kZXJfaWRfZV90eXBlOwotCi0KLSNkZWZpbmUgc21hbGxlcl9vZihhLCBiKSAoKChhKSA+IChiKSkgPyAoYikgOiAoYSkpCi0jZGVmaW5lIE1BWF9BUE5fTEVOIDEwMAotCi0vLyBUaGlzIHdpbGwgYmUgb3ZlcnJpZGRlbiBieSB0aGUgaW5kaXZpZHVhbCBhZGFwdGVycwotLy8gaWYgbmVjZXNzYXJ5LgotI2RlZmluZSBERUZBVUxUX0lNUEwocnR2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBMT0NfTE9HRCgiJXM6IGRlZmF1bHQgaW1wbGVtZW50YXRpb24gaW52b2tlZCIsIF9fZnVuY19fKTsgXAotICAgIHJldHVybiBydHY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0KLWVudW0gbG9jX2FwaV9hZGFwdGVyX2VyciB7Ci0gICAgTE9DX0FQSV9BREFQVEVSX0VSUl9TVUNDRVNTICAgICAgICAgICAgID0gMCwKLSAgICBMT0NfQVBJX0FEQVBURVJfRVJSX0dFTkVSQUxfRkFJTFVSRSAgICAgPSAxLAotICAgIExPQ19BUElfQURBUFRFUl9FUlJfVU5TVVBQT1JURUQgICAgICAgICA9IDIsCi0gICAgTE9DX0FQSV9BREFQVEVSX0VSUl9JTlZBTElEX0hBTkRMRSAgICAgID0gNCwKLSAgICBMT0NfQVBJX0FEQVBURVJfRVJSX0lOVkFMSURfUEFSQU1FVEVSICAgPSA1LAotICAgIExPQ19BUElfQURBUFRFUl9FUlJfRU5HSU5FX0JVU1kgICAgICAgICA9IDYsCi0gICAgTE9DX0FQSV9BREFQVEVSX0VSUl9QSE9ORV9PRkZMSU5FICAgICAgID0gNywKLSAgICBMT0NfQVBJX0FEQVBURVJfRVJSX1RJTUVPVVQgICAgICAgICAgICAgPSA4LAotICAgIExPQ19BUElfQURBUFRFUl9FUlJfU0VSVklDRV9OT1RfUFJFU0VOVCA9IDksCi0KLSAgICBMT0NfQVBJX0FEQVBURVJfRVJSX0VOR0lORV9ET1dOICAgICAgICAgPSAxMDAsCi0gICAgTE9DX0FQSV9BREFQVEVSX0VSUl9GQUlMVVJFLAotICAgIExPQ19BUElfQURBUFRFUl9FUlJfVU5LTk9XTgotfTsKLQotZW51bSBsb2NfYXBpX2FkYXB0ZXJfZXZlbnRfaW5kZXggewotICAgIExPQ19BUElfQURBUFRFUl9SRVBPUlRfUE9TSVRJT04gPSAwLCAgICAgICAgICAgICAgIC8vIFBvc2l0aW9uIHJlcG9ydCBjb21lcyBpbiBsb2NfcGFyc2VkX3Bvc2l0aW9uX3NfdHlwZQotICAgIExPQ19BUElfQURBUFRFUl9SRVBPUlRfU0FURUxMSVRFLCAgICAgICAgICAgICAgICAgIC8vIFNhdGVsbGl0ZSBpbiB2aWV3IHJlcG9ydAotICAgIExPQ19BUElfQURBUFRFUl9SRVBPUlRfTk1FQV8xSFosICAgICAgICAgICAgICAgICAgIC8vIE5NRUEgcmVwb3J0IGF0IDFIWiByYXRlCi0gICAgTE9DX0FQSV9BREFQVEVSX1JFUE9SVF9OTUVBX1BPU0lUSU9OLCAgICAgICAgICAgICAgLy8gTk1FQSByZXBvcnQgYXQgcG9zaXRpb24gcmVwb3J0IHJhdGUKLSAgICBMT0NfQVBJX0FEQVBURVJfUkVRVUVTVF9OSV9OT1RJRllfVkVSSUZZLCAgICAgICAgICAvLyBOSSBub3RpZmljYXRpb24vdmVyaWZpY2F0aW9uIHJlcXVlc3QKLSAgICBMT0NfQVBJX0FEQVBURVJfUkVRVUVTVF9BU1NJU1RBTkNFX0RBVEEsICAgICAgICAgICAvLyBBc3Npc3RhbmNlIGRhdGEsIGVnOiB0aW1lLCBwcmVkaWN0ZWQgb3JiaXRzIHJlcXVlc3QKLSAgICBMT0NfQVBJX0FEQVBURVJfUkVRVUVTVF9MT0NBVElPTl9TRVJWRVIsICAgICAgICAgICAvLyBSZXF1ZXN0IGZvciBsb2NhdGlvbiBzZXJ2ZXIKLSAgICBMT0NfQVBJX0FEQVBURVJfUkVQT1JUX0lPQ1RMLCAgICAgICAgICAgICAgICAgICAgICAvLyBDYWxsYmFjayByZXBvcnQgZm9yIGxvY19pb2N0bAotICAgIExPQ19BUElfQURBUFRFUl9SRVBPUlRfU1RBVFVTLCAgICAgICAgICAgICAgICAgICAgIC8vIE1pc2Mgc3RhdHVzIHJlcG9ydDogZWcsIGVuZ2luZSBzdGF0ZQotICAgIExPQ19BUElfQURBUFRFUl9SRVFVRVNUX1dJRkksICAgICAgICAgICAgICAgICAgICAgIC8vCi0gICAgTE9DX0FQSV9BREFQVEVSX1NFTlNPUl9TVEFUVVMsICAgICAgICAgICAgICAgICAgICAgLy8KLSAgICBMT0NfQVBJX0FEQVBURVJfUkVRVUVTVF9USU1FX1NZTkMsICAgICAgICAgICAgICAgICAvLwotICAgIExPQ19BUElfQURBUFRFUl9SRVBPUlRfU1BJLCAgICAgICAgICAgICAgICAgICAgICAgIC8vCi0gICAgTE9DX0FQSV9BREFQVEVSX1JFUE9SVF9OSV9HRU9GRU5DRSwgICAgICAgICAgICAgICAgLy8KLSAgICBMT0NfQVBJX0FEQVBURVJfR0VPRkVOQ0VfR0VOX0FMRVJULCAgICAgICAgICAgICAgICAvLwotICAgIExPQ19BUElfQURBUFRFUl9SRVBPUlRfR0VORkVOQ0VfQlJFQUNILCAgICAgICAgICAgIC8vCi0gICAgTE9DX0FQSV9BREFQVEVSX1BFRE9NRVRFUl9DVFJMLCAgICAgICAgICAgICAgICAgICAgLy8KLSAgICBMT0NfQVBJX0FEQVBURVJfTU9USU9OX0NUUkwsICAgICAgICAgICAgICAgICAgICAgICAvLwotICAgIExPQ19BUElfQURBUFRFUl9SRVFVRVNUX1dJRklfQVBfREFUQSwgICAgICAgICAgICAgIC8vIFdpZmkgYXAgZGF0YQotICAgIExPQ19BUElfQURBUFRFUl9CQVRDSF9GVUxMLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJhdGNoaW5nIG9uIGZ1bGwKLSAgICBMT0NfQVBJX0FEQVBURVJfQkFUQ0hFRF9QT1NJVElPTl9SRVBPUlQsICAgICAgICAgICAvLyBCYXRjaGluZyBvbiBmaXgKLSAgICBMT0NfQVBJX0FEQVBURVJfQkFUQ0hFRF9HRU5GRU5DRV9CUkVBQ0hfUkVQT1JULCAgICAvLwotICAgIExPQ19BUElfQURBUFRFUl9HTlNTX01FQVNVUkVNRU5ULCAgICAgICAgICAgICAgICAgIC8vIEdOU1MgTWVhc3VyZW1lbnQgcmVwb3J0Ci0KLSAgICBMT0NfQVBJX0FEQVBURVJfRVZFTlRfTUFYCi19OwotCi0jZGVmaW5lIExPQ19BUElfQURBUFRFUl9CSVRfUEFSU0VEX1BPU0lUSU9OX1JFUE9SVCAgICAgICAgICAgKDE8PExPQ19BUElfQURBUFRFUl9SRVBPUlRfUE9TSVRJT04pCi0jZGVmaW5lIExPQ19BUElfQURBUFRFUl9CSVRfU0FURUxMSVRFX1JFUE9SVCAgICAgICAgICAgICAgICAgKDE8PExPQ19BUElfQURBUFRFUl9SRVBPUlRfU0FURUxMSVRFKQotI2RlZmluZSBMT0NfQVBJX0FEQVBURVJfQklUX05NRUFfMUhaX1JFUE9SVCAgICAgICAgICAgICAgICAgICgxPDxMT0NfQVBJX0FEQVBURVJfUkVQT1JUX05NRUFfMUhaKQotI2RlZmluZSBMT0NfQVBJX0FEQVBURVJfQklUX05NRUFfUE9TSVRJT05fUkVQT1JUICAgICAgICAgICAgICgxPDxMT0NfQVBJX0FEQVBURVJfUkVQT1JUX05NRUFfUE9TSVRJT04pCi0jZGVmaW5lIExPQ19BUElfQURBUFRFUl9CSVRfTklfTk9USUZZX1ZFUklGWV9SRVFVRVNUICAgICAgICAgKDE8PExPQ19BUElfQURBUFRFUl9SRVFVRVNUX05JX05PVElGWV9WRVJJRlkpCi0jZGVmaW5lIExPQ19BUElfQURBUFRFUl9CSVRfQVNTSVNUQU5DRV9EQVRBX1JFUVVFU1QgICAgICAgICAgKDE8PExPQ19BUElfQURBUFRFUl9SRVFVRVNUX0FTU0lTVEFOQ0VfREFUQSkKLSNkZWZpbmUgTE9DX0FQSV9BREFQVEVSX0JJVF9MT0NBVElPTl9TRVJWRVJfUkVRVUVTVCAgICAgICAgICAoMTw8TE9DX0FQSV9BREFQVEVSX1JFUVVFU1RfTE9DQVRJT05fU0VSVkVSKQotI2RlZmluZSBMT0NfQVBJX0FEQVBURVJfQklUX0lPQ1RMX1JFUE9SVCAgICAgICAgICAgICAgICAgICAgICgxPDxMT0NfQVBJX0FEQVBURVJfUkVQT1JUX0lPQ1RMKQotI2RlZmluZSBMT0NfQVBJX0FEQVBURVJfQklUX1NUQVRVU19SRVBPUlQgICAgICAgICAgICAgICAgICAgICgxPDxMT0NfQVBJX0FEQVBURVJfUkVQT1JUX1NUQVRVUykKLSNkZWZpbmUgTE9DX0FQSV9BREFQVEVSX0JJVF9SRVFVRVNUX1dJRkkgICAgICAgICAgICAgICAgICAgICAoMTw8TE9DX0FQSV9BREFQVEVSX1JFUVVFU1RfV0lGSSkKLSNkZWZpbmUgTE9DX0FQSV9BREFQVEVSX0JJVF9TRU5TT1JfU1RBVFVTICAgICAgICAgICAgICAgICAgICAoMTw8TE9DX0FQSV9BREFQVEVSX1NFTlNPUl9TVEFUVVMpCi0jZGVmaW5lIExPQ19BUElfQURBUFRFUl9CSVRfUkVRVUVTVF9USU1FX1NZTkMgICAgICAgICAgICAgICAgKDE8PExPQ19BUElfQURBUFRFUl9SRVFVRVNUX1RJTUVfU1lOQykKLSNkZWZpbmUgTE9DX0FQSV9BREFQVEVSX0JJVF9SRVBPUlRfU1BJICAgICAgICAgICAgICAgICAgICAgICAoMTw8TE9DX0FQSV9BREFQVEVSX1JFUE9SVF9TUEkpCi0jZGVmaW5lIExPQ19BUElfQURBUFRFUl9CSVRfUkVQT1JUX05JX0dFT0ZFTkNFICAgICAgICAgICAgICAgKDE8PExPQ19BUElfQURBUFRFUl9SRVBPUlRfTklfR0VPRkVOQ0UpCi0jZGVmaW5lIExPQ19BUElfQURBUFRFUl9CSVRfR0VPRkVOQ0VfR0VOX0FMRVJUICAgICAgICAgICAgICAgKDE8PExPQ19BUElfQURBUFRFUl9HRU9GRU5DRV9HRU5fQUxFUlQpCi0jZGVmaW5lIExPQ19BUElfQURBUFRFUl9CSVRfUkVQT1JUX0dFTkZFTkNFX0JSRUFDSCAgICAgICAgICAgKDE8PExPQ19BUElfQURBUFRFUl9SRVBPUlRfR0VORkVOQ0VfQlJFQUNIKQotI2RlZmluZSBMT0NfQVBJX0FEQVBURVJfQklUX0JBVENIRURfR0VORkVOQ0VfQlJFQUNIX1JFUE9SVCAgICgxPDxMT0NfQVBJX0FEQVBURVJfQkFUQ0hFRF9HRU5GRU5DRV9CUkVBQ0hfUkVQT1JUKQotI2RlZmluZSBMT0NfQVBJX0FEQVBURVJfQklUX1BFRE9NRVRFUl9DVFJMICAgICAgICAgICAgICAgICAgICgxPDxMT0NfQVBJX0FEQVBURVJfUEVET01FVEVSX0NUUkwpCi0jZGVmaW5lIExPQ19BUElfQURBUFRFUl9CSVRfTU9USU9OX0NUUkwgICAgICAgICAgICAgICAgICAgICAgKDE8PExPQ19BUElfQURBUFRFUl9NT1RJT05fQ1RSTCkKLSNkZWZpbmUgTE9DX0FQSV9BREFQVEVSX0JJVF9SRVFVRVNUX1dJRklfQVBfREFUQSAgICAgICAgICAgICAoMTw8TE9DX0FQSV9BREFQVEVSX1JFUVVFU1RfV0lGSV9BUF9EQVRBKQotI2RlZmluZSBMT0NfQVBJX0FEQVBURVJfQklUX0JBVENIX0ZVTEwgICAgICAgICAgICAgICAgICAgICAgICgxPDxMT0NfQVBJX0FEQVBURVJfQkFUQ0hfRlVMTCkKLSNkZWZpbmUgTE9DX0FQSV9BREFQVEVSX0JJVF9CQVRDSEVEX1BPU0lUSU9OX1JFUE9SVCAgICAgICAgICAoMTw8TE9DX0FQSV9BREFQVEVSX0JBVENIRURfUE9TSVRJT05fUkVQT1JUKQotI2RlZmluZSBMT0NfQVBJX0FEQVBURVJfQklUX0dOU1NfTUVBU1VSRU1FTlQgICAgICAgICAgICAgICAgICgxPDxMT0NfQVBJX0FEQVBURVJfR05TU19NRUFTVVJFTUVOVCkKLQotdHlwZWRlZiB1bnNpZ25lZCBpbnQgTE9DX0FQSV9BREFQVEVSX0VWRU5UX01BU0tfVDsKLQotdHlwZWRlZiB1aW50MzJfdCBMT0NfR1BTX0xPQ0tfTUFTSzsKLSNkZWZpbmUgaXNHcHNMb2NrTm9uZShsb2NrKSAoKGxvY2spID09IDApCi0jZGVmaW5lIGlzR3BzTG9ja01PKGxvY2spICgobG9jaykgJiAoKExPQ19HUFNfTE9DS19NQVNLKTEpKQotI2RlZmluZSBpc0dwc0xvY2tNVChsb2NrKSAoKGxvY2spICYgKChMT0NfR1BTX0xPQ0tfTUFTSykyKSkKLSNkZWZpbmUgaXNHcHNMb2NrQWxsKGxvY2spICgoKGxvY2spICYgKChMT0NfR1BTX0xPQ0tfTUFTSykzKSkgPT0gMykKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotI2VuZGlmIC8qIEdQU19FWFRFTkRFRF9DX0ggKi8KLQpkaWZmIC0tZ2l0IGEvbXNtODk3NC9jb3JlL2xvY19jb3JlX2xvZy5jcHAgYi9tc204OTc0L2NvcmUvbG9jX2NvcmVfbG9nLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMwZjRiOC4uMDAwMDAwMAotLS0gYS9tc204OTc0L2NvcmUvbG9jX2NvcmVfbG9nLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI1MSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxNCwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKLSAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAotICogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiwgbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKLSAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAotICogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKLSAqIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KLSAqIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jZGVmaW5lIExPR19ORERFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiTG9jU3ZjX2NvcmVfbG9nIgotCi0jaW5jbHVkZSA8bG9jX2xvZy5oPgotI2luY2x1ZGUgPGxvZ191dGlsLmg+Ci0jaW5jbHVkZSA8bG9jX2NvcmVfbG9nLmg+Ci0KLXZvaWQgTG9jUG9zTW9kZTo6bG9ndigpIGNvbnN0Ci17Ci0gICAgTE9DX0xPR1YgKCJQb3NpdGlvbiBtb2RlOiAlc1xuICBQb3NpdGlvbiByZWN1cnJlbmNlOiAlc1xuICAiCi0gICAgICAgICAgICAgICJtaW4gaW50ZXJ2YWw6ICVkXG4gIHByZWZlcnJlZCBhY2N1cmFjeTogJWRcbiAgIgotICAgICAgICAgICAgICAicHJlZmVycmVkIHRpbWU6ICVkXG4gIGNyZWRlbnRpYWxzOiAlcyAgcHJvdmlkZXI6ICVzIiwKLSAgICAgICAgICAgICAgbG9jX2dldF9wb3NpdGlvbl9tb2RlX25hbWUobW9kZSksCi0gICAgICAgICAgICAgIGxvY19nZXRfcG9zaXRpb25fcmVjdXJyZW5jZV9uYW1lKHJlY3VycmVuY2UpLAotICAgICAgICAgICAgICBtaW5faW50ZXJ2YWwsCi0gICAgICAgICAgICAgIHByZWZlcnJlZF9hY2N1cmFjeSwKLSAgICAgICAgICAgICAgcHJlZmVycmVkX3RpbWUsCi0gICAgICAgICAgICAgIGNyZWRlbnRpYWxzLAotICAgICAgICAgICAgICBwcm92aWRlcik7Ci19Ci0KLS8qIEdQUyBzdGF0dXMgbmFtZXMgKi8KLXN0YXRpYyBsb2NfbmFtZV92YWxfc190eXBlIGdwc19zdGF0dXNfbmFtZVtdID0KLXsKLSAgICBOQU1FX1ZBTCggR1BTX1NUQVRVU19OT05FICksCi0gICAgTkFNRV9WQUwoIEdQU19TVEFUVVNfU0VTU0lPTl9CRUdJTiApLAotICAgIE5BTUVfVkFMKCBHUFNfU1RBVFVTX1NFU1NJT05fRU5EICksCi0gICAgTkFNRV9WQUwoIEdQU19TVEFUVVNfRU5HSU5FX09OICksCi0gICAgTkFNRV9WQUwoIEdQU19TVEFUVVNfRU5HSU5FX09GRiApLAotfTsKLXN0YXRpYyBpbnQgZ3BzX3N0YXR1c19udW0gPSBzaXplb2YoZ3BzX3N0YXR1c19uYW1lKSAvIHNpemVvZihsb2NfbmFtZV92YWxfc190eXBlKTsKLQotLyogRmluZCBBbmRyb2lkIEdQUyBzdGF0dXMgbmFtZSAqLwotY29uc3QgY2hhciogbG9jX2dldF9ncHNfc3RhdHVzX25hbWUoR3BzU3RhdHVzVmFsdWUgZ3BzX3N0YXR1cykKLXsKLSAgIHJldHVybiBsb2NfZ2V0X25hbWVfZnJvbV92YWwoZ3BzX3N0YXR1c19uYW1lLCBncHNfc3RhdHVzX251bSwKLSAgICAgICAgIChsb25nKSBncHNfc3RhdHVzKTsKLX0KLQotCi0KLXN0YXRpYyBsb2NfbmFtZV92YWxfc190eXBlIGxvY19lbmdfcG9zaXRpb25fbW9kZXNbXSA9Ci17Ci0gICAgTkFNRV9WQUwoIExPQ19QT1NJVElPTl9NT0RFX1NUQU5EQUxPTkUgKSwKLSAgICBOQU1FX1ZBTCggTE9DX1BPU0lUSU9OX01PREVfTVNfQkFTRUQgKSwKLSAgICBOQU1FX1ZBTCggTE9DX1BPU0lUSU9OX01PREVfTVNfQVNTSVNURUQgKSwKLSAgICBOQU1FX1ZBTCggTE9DX1BPU0lUSU9OX01PREVfUkVTRVJWRURfMSApLAotICAgIE5BTUVfVkFMKCBMT0NfUE9TSVRJT05fTU9ERV9SRVNFUlZFRF8yICksCi0gICAgTkFNRV9WQUwoIExPQ19QT1NJVElPTl9NT0RFX1JFU0VSVkVEXzMgKSwKLSAgICBOQU1FX1ZBTCggTE9DX1BPU0lUSU9OX01PREVfUkVTRVJWRURfNCApLAotICAgIE5BTUVfVkFMKCBMT0NfUE9TSVRJT05fTU9ERV9SRVNFUlZFRF81ICkKLX07Ci1zdGF0aWMgaW50IGxvY19lbmdfcG9zaXRpb25fbW9kZV9udW0gPSBzaXplb2YobG9jX2VuZ19wb3NpdGlvbl9tb2RlcykgLyBzaXplb2YobG9jX25hbWVfdmFsX3NfdHlwZSk7Ci0KLWNvbnN0IGNoYXIqIGxvY19nZXRfcG9zaXRpb25fbW9kZV9uYW1lKEdwc1Bvc2l0aW9uTW9kZSBtb2RlKQotewotICAgIHJldHVybiBsb2NfZ2V0X25hbWVfZnJvbV92YWwobG9jX2VuZ19wb3NpdGlvbl9tb2RlcywgbG9jX2VuZ19wb3NpdGlvbl9tb2RlX251bSwgKGxvbmcpIG1vZGUpOwotfQotCi0KLQotc3RhdGljIGxvY19uYW1lX3ZhbF9zX3R5cGUgbG9jX2VuZ19wb3NpdGlvbl9yZWN1cnJlbmNlc1tdID0KLXsKLSAgICBOQU1FX1ZBTCggR1BTX1BPU0lUSU9OX1JFQ1VSUkVOQ0VfUEVSSU9ESUMgKSwKLSAgICBOQU1FX1ZBTCggR1BTX1BPU0lUSU9OX1JFQ1VSUkVOQ0VfU0lOR0xFICkKLX07Ci1zdGF0aWMgaW50IGxvY19lbmdfcG9zaXRpb25fcmVjdXJyZW5jZV9udW0gPSBzaXplb2YobG9jX2VuZ19wb3NpdGlvbl9yZWN1cnJlbmNlcykgLyBzaXplb2YobG9jX25hbWVfdmFsX3NfdHlwZSk7Ci0KLWNvbnN0IGNoYXIqIGxvY19nZXRfcG9zaXRpb25fcmVjdXJyZW5jZV9uYW1lKEdwc1Bvc2l0aW9uUmVjdXJyZW5jZSByZWN1cikKLXsKLSAgICByZXR1cm4gbG9jX2dldF9uYW1lX2Zyb21fdmFsKGxvY19lbmdfcG9zaXRpb25fcmVjdXJyZW5jZXMsIGxvY19lbmdfcG9zaXRpb25fcmVjdXJyZW5jZV9udW0sIChsb25nKSByZWN1cik7Ci19Ci0KLQotCi1zdGF0aWMgbG9jX25hbWVfdmFsX3NfdHlwZSBsb2NfZW5nX2FpZGluZ19kYXRhX2JpdHNbXSA9Ci17Ci0gICAgTkFNRV9WQUwoIEdQU19ERUxFVEVfRVBIRU1FUklTICksCi0gICAgTkFNRV9WQUwoIEdQU19ERUxFVEVfQUxNQU5BQyApLAotICAgIE5BTUVfVkFMKCBHUFNfREVMRVRFX1BPU0lUSU9OICksCi0gICAgTkFNRV9WQUwoIEdQU19ERUxFVEVfVElNRSApLAotICAgIE5BTUVfVkFMKCBHUFNfREVMRVRFX0lPTk8gKSwKLSAgICBOQU1FX1ZBTCggR1BTX0RFTEVURV9VVEMgKSwKLSAgICBOQU1FX1ZBTCggR1BTX0RFTEVURV9IRUFMVEggKSwKLSAgICBOQU1FX1ZBTCggR1BTX0RFTEVURV9TVkRJUiApLAotICAgIE5BTUVfVkFMKCBHUFNfREVMRVRFX1NWU1RFRVIgKSwKLSAgICBOQU1FX1ZBTCggR1BTX0RFTEVURV9TQURBVEEgKSwKLSAgICBOQU1FX1ZBTCggR1BTX0RFTEVURV9SVEkgKSwKLSAgICBOQU1FX1ZBTCggR1BTX0RFTEVURV9DRUxMREJfSU5GTyApLAotICAgIE5BTUVfVkFMKCBHUFNfREVMRVRFX0FMTUFOQUNfQ09SUiApLAotICAgIE5BTUVfVkFMKCBHUFNfREVMRVRFX0ZSRVFfQklBU19FU1QgKSwKLSAgICBOQU1FX1ZBTCggR1BTX0RFTEVURV9FUEhFTUVSSVNfR0xPICksCi0gICAgTkFNRV9WQUwoIEdQU19ERUxFVEVfQUxNQU5BQ19HTE8gKSwKLSAgICBOQU1FX1ZBTCggR1BTX0RFTEVURV9TVkRJUl9HTE8gKSwKLSAgICBOQU1FX1ZBTCggR1BTX0RFTEVURV9TVlNURUVSX0dMTyApLAotICAgIE5BTUVfVkFMKCBHUFNfREVMRVRFX0FMTUFOQUNfQ09SUl9HTE8gKSwKLSAgICBOQU1FX1ZBTCggR1BTX0RFTEVURV9USU1FX0dQUyApLAotICAgIE5BTUVfVkFMKCBHUFNfREVMRVRFX1RJTUVfR0xPICkKLX07Ci1zdGF0aWMgaW50IGxvY19lbmdfYWlkaW5nX2RhdGFfYml0X251bSA9IHNpemVvZihsb2NfZW5nX2FpZGluZ19kYXRhX2JpdHMpIC8gc2l6ZW9mKGxvY19uYW1lX3ZhbF9zX3R5cGUpOwotCi1jb25zdCBjaGFyKiBsb2NfZ2V0X2FpZGluZ19kYXRhX21hc2tfbmFtZXMoR3BzQWlkaW5nRGF0YSBkYXRhKQotewotICAgIHJldHVybiBOVUxMOwotfQotCi0KLXN0YXRpYyBsb2NfbmFtZV92YWxfc190eXBlIGxvY19lbmdfYWdwc190eXBlc1tdID0KLXsKLSAgICBOQU1FX1ZBTCggQUdQU19UWVBFX0lOVkFMSUQgKSwKLSAgICBOQU1FX1ZBTCggQUdQU19UWVBFX0FOWSApLAotICAgIE5BTUVfVkFMKCBBR1BTX1RZUEVfU1VQTCApLAotICAgIE5BTUVfVkFMKCBBR1BTX1RZUEVfQzJLICksCi0gICAgTkFNRV9WQUwoIEFHUFNfVFlQRV9XV0FOX0FOWSApCi19Owotc3RhdGljIGludCBsb2NfZW5nX2FncHNfdHlwZV9udW0gPSBzaXplb2YobG9jX2VuZ19hZ3BzX3R5cGVzKSAvIHNpemVvZihsb2NfbmFtZV92YWxfc190eXBlKTsKLQotY29uc3QgY2hhciogbG9jX2dldF9hZ3BzX3R5cGVfbmFtZShBR3BzVHlwZSB0eXBlKQotewotICAgIHJldHVybiBsb2NfZ2V0X25hbWVfZnJvbV92YWwobG9jX2VuZ19hZ3BzX3R5cGVzLCBsb2NfZW5nX2FncHNfdHlwZV9udW0sIChsb25nKSB0eXBlKTsKLX0KLQotCi1zdGF0aWMgbG9jX25hbWVfdmFsX3NfdHlwZSBsb2NfZW5nX25pX3R5cGVzW10gPQotewotICAgIE5BTUVfVkFMKCBHUFNfTklfVFlQRV9WT0lDRSApLAotICAgIE5BTUVfVkFMKCBHUFNfTklfVFlQRV9VTVRTX1NVUEwgKSwKLSAgICBOQU1FX1ZBTCggR1BTX05JX1RZUEVfVU1UU19DVFJMX1BMQU5FICksCi0gICAgTkFNRV9WQUwoIEdQU19OSV9UWVBFX0VNRVJHRU5DWV9TVVBMICkKLX07Ci1zdGF0aWMgaW50IGxvY19lbmdfbmlfdHlwZV9udW0gPSBzaXplb2YobG9jX2VuZ19uaV90eXBlcykgLyBzaXplb2YobG9jX25hbWVfdmFsX3NfdHlwZSk7Ci0KLWNvbnN0IGNoYXIqIGxvY19nZXRfbmlfdHlwZV9uYW1lKEdwc05pVHlwZSB0eXBlKQotewotICAgIHJldHVybiBsb2NfZ2V0X25hbWVfZnJvbV92YWwobG9jX2VuZ19uaV90eXBlcywgbG9jX2VuZ19uaV90eXBlX251bSwgKGxvbmcpIHR5cGUpOwotfQotCi0KLXN0YXRpYyBsb2NfbmFtZV92YWxfc190eXBlIGxvY19lbmdfbmlfcmVzcG9uc2VzW10gPQotewotICAgIE5BTUVfVkFMKCBHUFNfTklfUkVTUE9OU0VfQUNDRVBUICksCi0gICAgTkFNRV9WQUwoIEdQU19OSV9SRVNQT05TRV9ERU5ZICksCi0gICAgTkFNRV9WQUwoIEdQU19OSV9SRVNQT05TRV9ERU5ZICkKLX07Ci1zdGF0aWMgaW50IGxvY19lbmdfbmlfcmVwb25zZV9udW0gPSBzaXplb2YobG9jX2VuZ19uaV9yZXNwb25zZXMpIC8gc2l6ZW9mKGxvY19uYW1lX3ZhbF9zX3R5cGUpOwotCi1jb25zdCBjaGFyKiBsb2NfZ2V0X25pX3Jlc3BvbnNlX25hbWUoR3BzVXNlclJlc3BvbnNlVHlwZSByZXNwb25zZSkKLXsKLSAgICByZXR1cm4gbG9jX2dldF9uYW1lX2Zyb21fdmFsKGxvY19lbmdfbmlfcmVzcG9uc2VzLCBsb2NfZW5nX25pX3JlcG9uc2VfbnVtLCAobG9uZykgcmVzcG9uc2UpOwotfQotCi0KLXN0YXRpYyBsb2NfbmFtZV92YWxfc190eXBlIGxvY19lbmdfbmlfZW5jb2RpbmdzW10gPQotewotICAgIE5BTUVfVkFMKCBHUFNfRU5DX05PTkUgKSwKLSAgICBOQU1FX1ZBTCggR1BTX0VOQ19TVVBMX0dTTV9ERUZBVUxUICksCi0gICAgTkFNRV9WQUwoIEdQU19FTkNfU1VQTF9VVEY4ICksCi0gICAgTkFNRV9WQUwoIEdQU19FTkNfU1VQTF9VQ1MyICksCi0gICAgTkFNRV9WQUwoIEdQU19FTkNfVU5LTk9XTiApCi19Owotc3RhdGljIGludCBsb2NfZW5nX25pX2VuY29kaW5nX251bSA9IHNpemVvZihsb2NfZW5nX25pX2VuY29kaW5ncykgLyBzaXplb2YobG9jX25hbWVfdmFsX3NfdHlwZSk7Ci0KLWNvbnN0IGNoYXIqIGxvY19nZXRfbmlfZW5jb2RpbmdfbmFtZShHcHNOaUVuY29kaW5nVHlwZSBlbmNvZGluZykKLXsKLSAgICByZXR1cm4gbG9jX2dldF9uYW1lX2Zyb21fdmFsKGxvY19lbmdfbmlfZW5jb2RpbmdzLCBsb2NfZW5nX25pX2VuY29kaW5nX251bSwgKGxvbmcpIGVuY29kaW5nKTsKLX0KLQotc3RhdGljIGxvY19uYW1lX3ZhbF9zX3R5cGUgbG9jX2VuZ19hZ3BzX2JlYXJzW10gPQotewotICAgIE5BTUVfVkFMKCBBR1BTX0FQTl9CRUFSRVJfSU5WQUxJRCApLAotICAgIE5BTUVfVkFMKCBBR1BTX0FQTl9CRUFSRVJfSVBWNCApLAotICAgIE5BTUVfVkFMKCBBR1BTX0FQTl9CRUFSRVJfSVBWNiApLAotICAgIE5BTUVfVkFMKCBBR1BTX0FQTl9CRUFSRVJfSVBWNFY2ICkKLX07Ci1zdGF0aWMgaW50IGxvY19lbmdfYWdwc19iZWFyc19udW0gPSBzaXplb2YobG9jX2VuZ19hZ3BzX2JlYXJzKSAvIHNpemVvZihsb2NfbmFtZV92YWxfc190eXBlKTsKLQotY29uc3QgY2hhciogbG9jX2dldF9hZ3BzX2JlYXJfbmFtZShBR3BzQmVhcmVyVHlwZSBiZWFyZXIpCi17Ci0gICAgcmV0dXJuIGxvY19nZXRfbmFtZV9mcm9tX3ZhbChsb2NfZW5nX2FncHNfYmVhcnMsIGxvY19lbmdfYWdwc19iZWFyc19udW0sIChsb25nKSBiZWFyZXIpOwotfQotCi1zdGF0aWMgbG9jX25hbWVfdmFsX3NfdHlwZSBsb2NfZW5nX3NlcnZlcl90eXBlc1tdID0KLXsKLSAgICBOQU1FX1ZBTCggTE9DX0FHUFNfQ0RNQV9QREVfU0VSVkVSICksCi0gICAgTkFNRV9WQUwoIExPQ19BR1BTX0NVU1RPTV9QREVfU0VSVkVSICksCi0gICAgTkFNRV9WQUwoIExPQ19BR1BTX01QQ19TRVJWRVIgKSwKLSAgICBOQU1FX1ZBTCggTE9DX0FHUFNfU1VQTF9TRVJWRVIgKQotfTsKLXN0YXRpYyBpbnQgbG9jX2VuZ19zZXJ2ZXJfdHlwZXNfbnVtID0gc2l6ZW9mKGxvY19lbmdfc2VydmVyX3R5cGVzKSAvIHNpemVvZihsb2NfbmFtZV92YWxfc190eXBlKTsKLQotY29uc3QgY2hhciogbG9jX2dldF9zZXJ2ZXJfdHlwZV9uYW1lKExvY1NlcnZlclR5cGUgdHlwZSkKLXsKLSAgICByZXR1cm4gbG9jX2dldF9uYW1lX2Zyb21fdmFsKGxvY19lbmdfc2VydmVyX3R5cGVzLCBsb2NfZW5nX3NlcnZlcl90eXBlc19udW0sIChsb25nKSB0eXBlKTsKLX0KLQotc3RhdGljIGxvY19uYW1lX3ZhbF9zX3R5cGUgbG9jX2VuZ19wb3NpdGlvbl9zZXNzX3N0YXR1c190eXBlc1tdID0KLXsKLSAgICBOQU1FX1ZBTCggTE9DX1NFU1NfU1VDQ0VTUyApLAotICAgIE5BTUVfVkFMKCBMT0NfU0VTU19JTlRFUk1FRElBVEUgKSwKLSAgICBOQU1FX1ZBTCggTE9DX1NFU1NfRkFJTFVSRSApCi19Owotc3RhdGljIGludCBsb2NfZW5nX3Bvc2l0aW9uX3Nlc3Nfc3RhdHVzX251bSA9IHNpemVvZihsb2NfZW5nX3Bvc2l0aW9uX3Nlc3Nfc3RhdHVzX3R5cGVzKSAvIHNpemVvZihsb2NfbmFtZV92YWxfc190eXBlKTsKLQotY29uc3QgY2hhciogbG9jX2dldF9wb3NpdGlvbl9zZXNzX3N0YXR1c19uYW1lKGVudW0gbG9jX3Nlc3Nfc3RhdHVzIHN0YXR1cykKLXsKLSAgICByZXR1cm4gbG9jX2dldF9uYW1lX2Zyb21fdmFsKGxvY19lbmdfcG9zaXRpb25fc2Vzc19zdGF0dXNfdHlwZXMsIGxvY19lbmdfcG9zaXRpb25fc2Vzc19zdGF0dXNfbnVtLCAobG9uZykgc3RhdHVzKTsKLX0KLQotc3RhdGljIGxvY19uYW1lX3ZhbF9zX3R5cGUgbG9jX2VuZ19hZ3BzX3N0YXR1c19uYW1lc1tdID0KLXsKLSAgICBOQU1FX1ZBTCggR1BTX1JFUVVFU1RfQUdQU19EQVRBX0NPTk4gKSwKLSAgICBOQU1FX1ZBTCggR1BTX1JFTEVBU0VfQUdQU19EQVRBX0NPTk4gKSwKLSAgICBOQU1FX1ZBTCggR1BTX0FHUFNfREFUQV9DT05ORUNURUQgKSwKLSAgICBOQU1FX1ZBTCggR1BTX0FHUFNfREFUQV9DT05OX0RPTkUgKSwKLSAgICBOQU1FX1ZBTCggR1BTX0FHUFNfREFUQV9DT05OX0ZBSUxFRCApCi19Owotc3RhdGljIGludCBsb2NfZW5nX2FncHNfc3RhdHVzX251bSA9IHNpemVvZihsb2NfZW5nX2FncHNfc3RhdHVzX25hbWVzKSAvIHNpemVvZihsb2NfbmFtZV92YWxfc190eXBlKTsKLQotY29uc3QgY2hhciogbG9jX2dldF9hZ3BzX3N0YXR1c19uYW1lKEFHcHNTdGF0dXNWYWx1ZSBzdGF0dXMpCi17Ci0gICAgcmV0dXJuIGxvY19nZXRfbmFtZV9mcm9tX3ZhbChsb2NfZW5nX2FncHNfc3RhdHVzX25hbWVzLCBsb2NfZW5nX2FncHNfc3RhdHVzX251bSwgKGxvbmcpIHN0YXR1cyk7Ci19CmRpZmYgLS1naXQgYS9tc204OTc0L2NvcmUvbG9jX2NvcmVfbG9nLmggYi9tc204OTc0L2NvcmUvbG9jX2NvcmVfbG9nLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhMTgyNWEuLjAwMDAwMDAKLS0tIGEvbXNtODk3NC9jb3JlL2xvY19jb3JlX2xvZy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDExLTIwMTMsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCi0gKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKLSAqICAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24sIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCi0gKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKLSAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCi0gKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCi0gKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2lmbmRlZiBMT0NfQ09SRV9MT0dfSAotI2RlZmluZSBMT0NfQ09SRV9MT0dfSAotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLXsKLSNlbmRpZgotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxncHNfZXh0ZW5kZWQuaD4KLQotY29uc3QgY2hhciogbG9jX2dldF9ncHNfc3RhdHVzX25hbWUoR3BzU3RhdHVzVmFsdWUgZ3BzX3N0YXR1cyk7Ci1jb25zdCBjaGFyKiBsb2NfZ2V0X3Bvc2l0aW9uX21vZGVfbmFtZShHcHNQb3NpdGlvbk1vZGUgbW9kZSk7Ci1jb25zdCBjaGFyKiBsb2NfZ2V0X3Bvc2l0aW9uX3JlY3VycmVuY2VfbmFtZShHcHNQb3NpdGlvblJlY3VycmVuY2UgcmVjdXIpOwotY29uc3QgY2hhciogbG9jX2dldF9haWRpbmdfZGF0YV9tYXNrX25hbWVzKEdwc0FpZGluZ0RhdGEgZGF0YSk7Ci1jb25zdCBjaGFyKiBsb2NfZ2V0X2FncHNfdHlwZV9uYW1lKEFHcHNUeXBlIHR5cGUpOwotY29uc3QgY2hhciogbG9jX2dldF9uaV90eXBlX25hbWUoR3BzTmlUeXBlIHR5cGUpOwotY29uc3QgY2hhciogbG9jX2dldF9uaV9yZXNwb25zZV9uYW1lKEdwc1VzZXJSZXNwb25zZVR5cGUgcmVzcG9uc2UpOwotY29uc3QgY2hhciogbG9jX2dldF9uaV9lbmNvZGluZ19uYW1lKEdwc05pRW5jb2RpbmdUeXBlIGVuY29kaW5nKTsKLWNvbnN0IGNoYXIqIGxvY19nZXRfYWdwc19iZWFyX25hbWUoQUdwc0JlYXJlclR5cGUgYmVhcik7Ci1jb25zdCBjaGFyKiBsb2NfZ2V0X3NlcnZlcl90eXBlX25hbWUoTG9jU2VydmVyVHlwZSB0eXBlKTsKLWNvbnN0IGNoYXIqIGxvY19nZXRfcG9zaXRpb25fc2Vzc19zdGF0dXNfbmFtZShlbnVtIGxvY19zZXNzX3N0YXR1cyBzdGF0dXMpOwotY29uc3QgY2hhciogbG9jX2dldF9hZ3BzX3N0YXR1c19uYW1lKEFHcHNTdGF0dXNWYWx1ZSBzdGF0dXMpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYgLyogTE9DX0NPUkVfTE9HX0ggKi8KZGlmZiAtLWdpdCBhL21zbTg5NzQvZXRjL0FuZHJvaWQubWsgYi9tc204OTc0L2V0Yy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjkxNGEyLi4wMDAwMDAwCi0tLSBhL21zbTg5NzQvZXRjL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1MT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfTU9EVUxFIDo9IGdwcy5jb25mCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQwotTE9DQUxfTU9EVUxFX1BBVEggIDo9ICQoVEFSR0VUX09VVF9FVEMpLwotTE9DQUxfU1JDX0ZJTEVTIDo9IGdwcy5jb25mCi0KLWluY2x1ZGUgJChCVUlMRF9QUkVCVUlMVCkKZGlmZiAtLWdpdCBhL21zbTg5NzQvZXRjL2dwcy5jb25mIGIvbXNtODk3NC9ldGMvZ3BzLmNvbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxZmVlNmMuLjAwMDAwMDAKLS0tIGEvbXNtODk3NC9ldGMvZ3BzLmNvbmYKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotI1VuY29tbWVudGluZyB0aGVzZSB1cmxzIHdvdWxkIG9ubHkgZW5hYmxlCi0jdGhlIHBvd2VyIHVwIGF1dG8gaW5qZWN0aW9uIGFuZCBmb3JjZSBpbmplY3Rpb24odGVzdCBjYXNlKS4KLSNYVFJBX1NFUlZFUl8xPWh0dHA6Ly94dHJhMS5ncHNvbmV4dHJhLm5ldC94dHJhLmJpbgotI1hUUkFfU0VSVkVSXzI9aHR0cDovL3h0cmEyLmdwc29uZXh0cmEubmV0L3h0cmEuYmluCi0jWFRSQV9TRVJWRVJfMz1odHRwOi8veHRyYTMuZ3Bzb25leHRyYS5uZXQveHRyYS5iaW4KLQotIyBFcnJvciBFc3RpbWF0ZQotIyBfU0VUID0gMQotIyBfQ0xFQVIgPSAwCi1FUlJfRVNUSU1BVEU9MAotCi0jVGVzdAotTlRQX1NFUlZFUj10aW1lLmdwc29uZXh0cmEubmV0Ci0jQXNpYQotIyBOVFBfU0VSVkVSPWFzaWEucG9vbC5udHAub3JnCi0jRXVyb3BlCi0jIE5UUF9TRVJWRVI9ZXVyb3BlLnBvb2wubnRwLm9yZwotI05vcnRoIEFtZXJpY2EKLSMgTlRQX1NFUlZFUj1ub3J0aC1hbWVyaWNhLnBvb2wubnRwLm9yZwotCi0jIERFQlVHIExFVkVMUzogMCAtIG5vbmUsIDEgLSBFcnJvciwgMiAtIFdhcm5pbmcsIDMgLSBJbmZvCi0jICAgICAgICAgICAgICAgNCAtIERlYnVnLCA1IC0gVmVyYm9zZQotIyBJZiBERUJVR19MRVZFTCBpcyBjb21tZW50ZWQsIEFuZHJvaWQncyBsb2dnaW5nIGxldmVscyB3aWxsIGJlIHVzZWQKLURFQlVHX0xFVkVMID0gMwotCi0jIEludGVybWVkaWF0ZSBwb3NpdGlvbiByZXBvcnQsIDE9ZW5hYmxlLCAwPWRpc2FibGUKLUlOVEVSTUVESUFURV9QT1M9MAotCi0jIEJlbG93IGJpdCBtYXNrIGNvbmZpZ3VyZXMgaG93IEdQUyBmdW5jdGlvbmFsaXRpZXMKLSMgc2hvdWxkIGJlIGxvY2tlZCB3aGVuIHVzZXIgdHVybnMgb2ZmIEdQUyBvbiBTZXR0aW5ncwotIyBTZXQgYml0IDB4MSBpZiBNTyBHUFMgZnVuY3Rpb25hbGl0aWVzIGFyZSB0byBiZSBsb2NrZWQKLSMgU2V0IGJpdCAweDIgaWYgTkkgR1BTIGZ1bmN0aW9uYWxpdGllcyBhcmUgdG8gYmUgbG9ja2VkCi0jIGRlZmF1bHQgLSBub24gaXMgbG9ja2VkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5Ci0jR1BTX0xPQ0sgPSAwCi0KLSMgc3VwbCB2ZXJzaW9uIDEuMAotU1VQTF9WRVI9MHgxMDAwMAotCi0jIEVtZXJnZW5jeSBTVVBMLCAxPWVuYWJsZSwgMD1kaXNhYmxlCi1TVVBMX0VTPTEKLQotIyBHUFMgQ2FwYWJpbGl0aWVzIGJpdCBtYXNrCi0jIFNDSEVEVUxJTkcgPSAweDAxCi0jIE1TQiA9IDB4MDIKLSMgTVNBID0gMHgwNAotIyBPTl9ERU1BTkRfVElNRSA9IDB4MTAKLSMgR0VPRkVOQ0UgPSAweDIwCi0jIGRlZmF1bHQgPSBPTl9ERU1BTkRfVElNRSB8IE1TQSB8IE1TQiB8IFNDSEVEVUxJTkcgfCBHRU9GRU5DRQotQ0FQQUJJTElUSUVTPTB4MzcKLQotIyBBY2N1cmFjeSB0aHJlc2hvbGQgZm9yIGludGVybWVkaWF0ZSBwb3NpdGlvbnMKLSMgbGVzcyBhY2N1cmF0ZSBwb3NpdGlvbnMgYXJlIGlnbm9yZWQsIDAgZm9yIHBhc3NpbmcgYWxsIHBvc2l0aW9ucwotIyBBQ0NVUkFDWV9USFJFUz01MDAwCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIyMjIyBBR1BTIHNlcnZlciBzZXR0aW5ncyAjIyMjIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBGT1IgU1VQTCBTVVBQT1JULCBzZXQgdGhlIGZvbGxvd2luZwotIyBTVVBMX0hPU1Q9c3VwbC5ob3N0LmNvbSBvciBJUAotIyBTVVBMX1BPUlQ9MTIzNAotU1VQTF9IT1NUPXN1cGwuZ29vZ2xlLmNvbQotU1VQTF9QT1JUPTcyNzYKLQotIyBGT1IgQzJLIFBERSBTVVBQT1JULCBzZXQgdGhlIGZvbGxvd2luZwotIyBDMktfSE9TVD1jMmsucGRlLmNvbSBvciBJUAotIyBDMktfUE9SVD0xMjM0Ci0KLSMgQml0bWFzayBvZiBzbG90cyB0aGF0IGFyZSBhdmFpbGFibGUKLSMgZm9yIHdyaXRlL2luc3RhbGwgdG8sIHdoZXJlIDFzIGluZGljYXRlIHdyaXRhYmxlLAotIyBhbmQgdGhlIGRlZmF1bHQgdmFsdWUgaXMgMCB3aGVyZSBubyBzbG90cwotIyBhcmUgd3JpdGFibGUuIEZvciBleGFtcGxlLCBBR1BTX0NFUlRfV1JJVEFCTEVfTUFTSwotIyBvZiBiMTAwMDAwMTAxMCBtYWtlcyAzIHNsb3RzIGF2YWlsYWJsZQotIyBmb3IgaW5zdGFsbGF0aW9uIChzbG90cyAyLCA0LCBhbmQgMTApCi0jIGFuZCB0aGUgcmVtYWluaW5nIDcgc2xvdHMgdW53cml0YWJsZS4KLSNBR1BTX0NFUlRfV1JJVEFCTEVfTUFTSz0wCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyAgTFRFIFBvc2l0aW9uaW5nIFByb2ZpbGUgU2V0dGluZ3MKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyAwOiBFbmFibGUgUlJMUCBvbiBMVEUoRGVmYXVsdCkKLSMgMTogRW5hYmxlIExQUF9Vc2VyX1BsYW5lIG9uIExURQotIyAyOiBFbmFibGUgTFBQX0NvbnRyb2xfUGxhbmUKLSMgMzogRW5hYmxlIGJvdGggTFBQX1VzZXJfUGxhbmUgYW5kIExQUF9Db250cm9sX1BsYW5lCi1MUFBfUFJPRklMRSA9IDAKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgRVhUUkEgU0VUVElOR1MKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIE5NRUEgcHJvdmlkZXIgKDE9TW9kZW0gUHJvY2Vzc29yLCAwPUFwcGxpY2F0aW9uIFByb2Nlc3NvcikKLU5NRUFfUFJPVklERVI9MAotIyBNYXJrIGlmIGl0IGlzIGEgU0dMVEUgdGFyZ2V0ICgxPVNHTFRFLCAwPW5vblNHTFRFKQotU0dMVEVfVEFSR0VUPTAKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgU2VsZWN0IFBvc2l0aW9uaW5nIFByb3RvY29sIG9uIEEtR0xPTkFTUyBzeXN0ZW0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIDB4MTogUlJDIENQbGFuZQotIyAweDI6IFJSTFAgVVBsYW5lCi0jIDB4NDogTExQIFVwbGFuZQotQV9HTE9OQVNTX1BPU19QUk9UT0NPTF9TRUxFQ1QgPSAwCmRpZmYgLS1naXQgYS9tc204OTc0L2xvY19hcGkvQW5kcm9pZC5tayBiL21zbTg5NzQvbG9jX2FwaS9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDNiMzg2Li4wMDAwMDAwCi0tLSBhL21zbTg5NzQvbG9jX2FwaS9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotaWZuZXEgKCQoQk9BUkRfVkVORE9SX1FDT01fR1BTX0xPQ19BUElfSEFSRFdBUkUpLCkKLQotTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQotCi0jIGFkZCBSUEMgZGlycyBpZiBSUEMgaXMgYXZhaWxhYmxlCi1pZm5lcSAoJChUQVJHRVRfTk9fUlBDKSx0cnVlKQotCi1HUFNfRElSX0xJU1QgKz0gJChMT0NBTF9QQVRIKS9saWJsb2NfYXBpLXJwYy01MDAwMS8KLQotZW5kaWYgI1RBUkdFVF9OT19SUEMKLQotR1BTX0RJUl9MSVNUICs9ICQoTE9DQUxfUEFUSCkvbGlibG9jX2FwaV81MDAwMS8KLQotI2NhbGwgdGhlIHN1YmZvbGRlcnMKLWluY2x1ZGUgJChhZGRzdWZmaXggQW5kcm9pZC5taywgJChHUFNfRElSX0xJU1QpKQotCi1lbmRpZiNCT0FSRF9WRU5ET1JfUUNPTV9HUFNfTE9DX0FQSV9IQVJEV0FSRQpkaWZmIC0tZ2l0IGEvbXNtODk3NC9sb2NfYXBpL05PVElDRSBiL21zbTg5NzQvbG9jX2FwaS9OT1RJQ0UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1YjU3NDAuLjAwMDAwMDAKLS0tIGEvbXNtODk3NC9sb2NfYXBpL05PVElDRQorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLUNvcHlyaWdodCAoYykgMjAwOSwgUVVBTENPTU0gVVNBLCBJTkMuCi0KLUFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLQottyAgICAgICAgIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLQottyAgICAgICAgIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLQottyAgICAgICAgIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFFVQUxDT01NIFVTQSwgSU5DLiAgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLQotVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KZGlmZiAtLWdpdCBhL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpLXJwYy01MDAwMS9BbmRyb2lkLm1rIGIvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGktcnBjLTUwMDAxL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjNWQ1MzMuLjAwMDAwMDAKLS0tIGEvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGktcnBjLTUwMDAxL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLWlmZXEgKCQoQk9BUkRfVkVORE9SX1FDT01fR1BTX0xPQ19BUElfQU1TU19WRVJTSU9OKSw1MDAwMSkKLWluY2x1ZGUgJChjYWxsIGFsbC1zdWJkaXItbWFrZWZpbGVzKQotZW5kaWYKZGlmZiAtLWdpdCBhL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpLXJwYy01MDAwMS9saWJsb2NfYXBpLXJwYy1nbHVlL0FuZHJvaWQubWsgYi9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaS1ycGMtNTAwMDEvbGlibG9jX2FwaS1ycGMtZ2x1ZS9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjNkOTI0Li4wMDAwMDAwCi0tLSBhL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpLXJwYy01MDAwMS9saWJsb2NfYXBpLXJwYy1nbHVlL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1SUENfSU5DOj1ycGNfaW5jCi0KLXNvdXJjZV9maWxlczo9IFwKLSAgICBzcmMvbG9jX2FwaV9ycGNfZ2x1ZS5jIFwKLSAgICBzcmMvbG9jX2FwaV9zeW5jX2NhbGwuYyBcCi0gICAgc3JjL2xvY19hcGljYl9hcHBpbml0LmMgXAotICAgIHNyYy9sb2NfYXBpX2ZpeHVwLmMgXAotICAgIHNyYy9sb2NfYXBpX2xvZy5jIFwKLSAgICBzcmMvTG9jQXBpUnBjLmNwcAotCi1MT0NBTF9TUkNfRklMRVM6PSAkKHNvdXJjZV9maWxlcykKLQotTE9DQUxfQ0ZMQUdTOj0tZm5vLXNob3J0LWVudW1zCi1MT0NBTF9DRkxBR1MrPS1EREVCVUcgLURVU0VfUUNPTV9BVVRPX1JQQyAtRFVTRV9RQ09NX0FVVE9fUlBDCi1MT0NBTF9DRkxBR1MrPSQoR1BTX0ZFQVRVUkVTKQotCi0jIGZvciBsb2NfYXBpX2ZpeHVwLmMKLUxPQ0FMX0NGTEFHUys9LURBRERfWERSX0ZMT0FUIC1EQUREX1hEUl9CT09MCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVM6PSBcCi0gICAgbGlicnBjIFwKLSAgICBsaWJ1dGlscyBcCi0gICAgbGliY3V0aWxzIFwKLSAgICBsaWJjb21tb25kZWZzIFwKLSAgICBsaWJncHMudXRpbHMgXAotICAgIGxpYmxvY19jb3JlCi0KLUxPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAotICAgIGxpYmxvY19hcGlfcnBjZ2VuCi0KLUxPQ0FMX1BSRUxJTktfTU9EVUxFOj0gZmFsc2UKLQotTE9DQUxfQ19JTkNMVURFUzo9IFwKLSAgICAkKExPQ0FMX1BBVEgpIFwKLSAgICAkKExPQ0FMX1BBVEgpL3JwY19pbmMgXAotICAgICQoVEFSR0VUX09VVF9IRUFERVJTKS9ncHMudXRpbHMgXAotICAgICQoVEFSR0VUX09VVF9IRUFERVJTKS9saWJsb2NfY29yZSBcCi0gICAgJChUQVJHRVRfT1VUX0hFQURFUlMpL2xvY19hcGkvcnBjZ2VuL2luYyBcCi0gICAgJChUQVJHRVRfT1VUX0hFQURFUlMpL2xpYmNvbW1vbmRlZnMvcnBjZ2VuL2luYyBcCi0gICAgJChUQVJHRVRfT1VUX0hFQURFUlMpL2xpYnJwYyBcCi0gICAgJChUQVJHRVRfT1VUX0hFQURFUlMpL2xpYmxvYy1ycGMvcnBjX2luYyBcCi0gICAgJChUT1ApL2hhcmR3YXJlL21zbTdrL2xpYnJwYwotCi1MT0NBTF9DT1BZX0hFQURFUlNfVE86PSBsaWJsb2NfYXBpLXJwYy1xYy8kKFJQQ19JTkMpCi1MT0NBTF9DT1BZX0hFQURFUlM6PSBcCi0gICAgJChSUENfSU5DKS9sb2NfYXBpX3JwY19nbHVlLmggXAotICAgICQoUlBDX0lOQykvbG9jX2FwaV9maXh1cC5oIFwKLSAgICAkKFJQQ19JTkMpL2xvY19hcGlfc3luY19jYWxsLmggXAotICAgICQoUlBDX0lOQykvbG9jX2FwaWNiX2FwcGluaXQuaCBcCi0gICAgJChSUENfSU5DKS9Mb2NBcGlScGMuaAotCi1MT0NBTF9NT0RVTEU6PSBsaWJsb2NfYXBpLXJwYy1xYwotTE9DQUxfTU9EVUxFX09XTkVSIDo9IHFjb20KLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLQotaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGktcnBjLTUwMDAxL2xpYmxvY19hcGktcnBjLWdsdWUvTWFrZWZpbGUuYW0gYi9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaS1ycGMtNTAwMDEvbGlibG9jX2FwaS1ycGMtZ2x1ZS9NYWtlZmlsZS5hbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVjNTEzNi4uMDAwMDAwMAotLS0gYS9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaS1ycGMtNTAwMDEvbGlibG9jX2FwaS1ycGMtZ2x1ZS9NYWtlZmlsZS5hbQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLUFNX0NGTEFHUyA9IFwKLSAgIC1JLi4vLi4vLi4vdXRpbHMgXAotICAgLUkuLi8uLi8uLi9wbGF0Zm9ybV9saWJfYWJzdHJhY3Rpb25zIFwKLSAgIC1JLi9ycGNfaW5jIFwKLSAgIC1JLi4vbGlibG9jX2FwaS1ycGMtc3R1Yi9pbmMgXAotICAgLUkuLi8uLi9saWJsb2NfYXBpXzUwMDAxIFwKLSAgICQoTVNNN0tfQ0ZMQUdTKSBcCi0gICAtRFVTRV9RQ09NX0FVVE9fUlBDCi0KLXJlcXVpcmVkbGlicyA9IFwKLSAgIC4uLy4uLy4uL3V0aWxzL2xpYmdwc191dGlsc19zby5sYSBcCi0gICAkKE1TTTdLX0xJQlMpCi0KLWhfc291cmNlcyA9IFwKLSAgICBycGNfaW5jL2xvY19hcGlfcnBjX2dsdWUuaCBcCi0gICAgcnBjX2luYy9sb2NfYXBpX2ZpeHVwLmggXAotICAgIHJwY19pbmMvbG9jX2FwaV9zeW5jX2NhbGwuaCBcCi0gICAgcnBjX2luYy9sb2NfYXBpY2JfYXBwaW5pdC5oIFwKLQotY19zb3VyY2VzID0gXAotICAgIHNyYy9sb2NfYXBpX3JwY19nbHVlLmMgXAotICAgIHNyYy9sb2NfYXBpX3N5bmNfY2FsbC5jIFwKLSAgICBzcmMvbG9jX2FwaWNiX2FwcGluaXQuYyBcCi0gICAgc3JjL2xvY19hcGlfZml4dXAuYyBcCi0gICAgc3JjL2xvY19hcGlfbG9nLmMgXAotICAgIHNyYy9Mb2NBcGlScGNBZGFwdGVyLmNwcCBcCi0KLQotbGlicmFyeV9pbmNsdWRlZGlyID0gJChwa2dpbmNsdWRlZGlyKS9saWJsb2NfYXBpLXJwYy01MDAwMS9saWJsb2NfYXBpLXJwYy1nbHVlL3JwY19pbmMKLWxpYnJhcnlfaW5jbHVkZV9IRUFERVJTID0gJChoX3NvdXJjZXMpCi1saWJsb2NfYXBpX3JwY19xY19sYV9TT1VSQ0VTID0gJChjX3NvdXJjZXMpICQoaF9zb3VyY2VzKQotCi1pZiBVU0VfR0xJQgotbGlibG9jX2FwaV9ycGNfcWNfbGFfQ0ZMQUdTID0gLURVU0VfR0xJQiAkKEFNX0NGTEFHUykgQEdMSUJfQ0ZMQUdTQAotbGlibG9jX2FwaV9ycGNfcWNfbGFfTERGTEFHUyA9IC1sc3RkYysrIC1scHRocmVhZCBAR0xJQl9MSUJTQCAtc2hhcmVkIC12ZXJzaW9uLWluZm8gMTowOjAKLWxpYmxvY19hcGlfcnBjX3FjX2xhX0NQUEZMQUdTID0gLURVU0VfR0xJQiAkKEFNX0NGTEFHUykgJChBTV9DUFBGTEFHUykgQEdMSUJfQ0ZMQUdTQAotZWxzZQotbGlibG9jX2FwaV9ycGNfcWNfbGFfQ0ZMQUdTID0gJChBTV9DRkxBR1MpCi1saWJsb2NfYXBpX3JwY19xY19sYV9MREZMQUdTID0gLWxwdGhyZWFkIC1zaGFyZWQgLXZlcnNpb24taW5mbyAxOjA6MAotbGlibG9jX2FwaV9ycGNfcWNfbGFfQ1BQRkxBR1MgPSAkKEFNX0NGTEFHUykgJChBTV9DUFBGTEFHUykKLWVuZGlmCi0KLWxpYmxvY19hcGlfcnBjX3FjX2xhX0xJQkFERCA9ICQocmVxdWlyZWRsaWJzKSAtbHN0ZGMrKwotCi0jQ3JlYXRlIGFuZCBJbnN0YWxsIExpYnJhcmllcwotbGliX0xUTElCUkFSSUVTID0gbGlibG9jX2FwaV9ycGNfcWMubGEKZGlmZiAtLWdpdCBhL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpLXJwYy01MDAwMS9saWJsb2NfYXBpLXJwYy1nbHVlL3JwY19pbmMvTG9jQXBpUnBjLmggYi9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaS1ycGMtNTAwMDEvbGlibG9jX2FwaS1ycGMtZ2x1ZS9ycGNfaW5jL0xvY0FwaVJwYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWQ2N2Y0Li4wMDAwMDAwCi0tLSBhL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpLXJwYy01MDAwMS9saWJsb2NfYXBpLXJwYy1nbHVlL3JwY19pbmMvTG9jQXBpUnBjLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDExLDIwMTQsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCi0gKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKLSAqICAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKLSAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAotICogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKLSAqIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KLSAqIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotI2lmbmRlZiBMT0NfQVBJX1JQQ19ICi0jZGVmaW5lIExPQ19BUElfUlBDX0gKLQotI2luY2x1ZGUgPHJwYy9ycGMuaD4KLSNpbmNsdWRlIDxsb2NfYXBpX3JwY2dlbl9jb21tb25fcnBjLmg+Ci0jaW5jbHVkZSA8bG9jX2FwaV9ycGNfZ2x1ZS5oPgotI2luY2x1ZGUgPExvY0FwaUJhc2UuaD4KLSNpbmNsdWRlIDxsb2NfbG9nLmg+Ci0KLXVzaW5nIG5hbWVzcGFjZSBsb2NfY29yZTsKLQotY2xhc3MgTG9jQXBpUnBjIDogcHVibGljIExvY0FwaUJhc2UgewotcHJvdGVjdGVkOgotICAgIC8vIFJQQyBjb21tdW5pY2F0aW9uIGVzdGFibGlzaG1lbnQKLSAgICBycGNfbG9jX2NsaWVudF9oYW5kbGVfdHlwZSBjbGllbnRfaGFuZGxlOwotCi1wcml2YXRlOgotICAgIGludCBkYXRhRW5hYmxlTGFzdFNldDsKLSAgICBjaGFyIGFwbkxhc3RTZXRbTUFYX0FQTl9MRU5dOwotCi0gICAgc3RhdGljIGNvbnN0IExPQ19BUElfQURBUFRFUl9FVkVOVF9NQVNLX1QgbWFza0FsbDsKLSAgICBzdGF0aWMgY29uc3QgcnBjX2xvY19ldmVudF9tYXNrX3R5cGUgbG9jQml0c1tdOwotICAgIHN0YXRpYyBycGNfbG9jX2V2ZW50X21hc2tfdHlwZSBjb252ZXJ0TWFzayhMT0NfQVBJX0FEQVBURVJfRVZFTlRfTUFTS19UIG1hc2spOwotICAgIHN0YXRpYyBycGNfbG9jX2xvY2tfZV90eXBlIGNvbnZlcnRHcHNMb2NrTWFzayhMT0NfR1BTX0xPQ0tfTUFTSyBsb2NrTWFzayk7Ci0gICAgc3RhdGljIGVudW0gbG9jX2FwaV9hZGFwdGVyX2VyciBjb252ZXJ0RXJyKGludCBycGNFcnIpOwotICAgIHN0YXRpYyBHcHNOaUVuY29kaW5nVHlwZSBjb252ZXJ0TmlFbmNvZGluZ1R5cGUoaW50IGxvY19lbmNvZGluZyk7Ci0gICAgc3RhdGljIGludCBOSUV2ZW50RmlsbFZlcmZpeVR5cGUoR3BzTmlOb3RpZmljYXRpb24gJm5vdGlmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnBjX2xvY19uaV9ub3RpZnlfdmVyaWZ5X2VfdHlwZSBub3RpZl9wcml2KTsKLQotICAgIHZvaWQgcmVwb3J0UG9zaXRpb24oY29uc3QgcnBjX2xvY19wYXJzZWRfcG9zaXRpb25fc190eXBlICpsb2NhdGlvbl9yZXBvcnRfcHRyKTsKLSAgICB2b2lkIHJlcG9ydFN2KGNvbnN0IHJwY19sb2NfZ25zc19pbmZvX3NfdHlwZSAqZ25zc19yZXBvcnRfcHRyKTsKLSAgICB2b2lkIHJlcG9ydFN0YXR1cyhjb25zdCBycGNfbG9jX3N0YXR1c19ldmVudF9zX3R5cGUgKnN0YXR1c19yZXBvcnRfcHRyKTsKLSAgICB2b2lkIHJlcG9ydE5tZWEoY29uc3QgcnBjX2xvY19ubWVhX3JlcG9ydF9zX3R5cGUgKm5tZWFfcmVwb3J0X3B0cik7Ci0gICAgdm9pZCBBVExFdmVudChjb25zdCBycGNfbG9jX3NlcnZlcl9yZXF1ZXN0X3NfdHlwZSAqc2VydmVyX3JlcXVlc3RfcHRyKTsKLSAgICB2b2lkIE5JRXZlbnQoY29uc3QgcnBjX2xvY19uaV9ldmVudF9zX3R5cGUgKm5pX3JlcV9wdHIpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCBlbnVtIGxvY19hcGlfYWRhcHRlcl9lcnIKLSAgICAgICAgb3BlbihMT0NfQVBJX0FEQVBURVJfRVZFTlRfTUFTS19UIG1hc2spOwotICAgIHZpcnR1YWwgZW51bSBsb2NfYXBpX2FkYXB0ZXJfZXJyCi0gICAgICAgIGNsb3NlKCk7Ci0KLXB1YmxpYzoKLSAgICBMb2NBcGlScGMoY29uc3QgTXNnVGFzayogbXNnVGFzaywKLSAgICAgICAgICAgICAgTE9DX0FQSV9BREFQVEVSX0VWRU5UX01BU0tfVCBleE1hc2spOwotICAgIH5Mb2NBcGlScGMoKTsKLQotICAgIHZpcnR1YWwgaW50IGxvY0V2ZW50Q0IocnBjX2xvY19jbGllbnRfaGFuZGxlX3R5cGUgY2xpZW50X2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICBycGNfbG9jX2V2ZW50X21hc2tfdHlwZSBsb2NfZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgY29uc3QgcnBjX2xvY19ldmVudF9wYXlsb2FkX3VfdHlwZSogbG9jX2V2ZW50X3BheWxvYWQpOwotCi0gICAgdm9pZCBsb2NScGNHbG9iYWxDQihDTElFTlQqIGNsbnQsIGVudW0gcnBjX3Jlc2V0X2V2ZW50IGV2ZW50KTsKLQotICAgIC8vIFJQQyBhZGFwdGVyIGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbnMKLSAgICB2aXJ0dWFsIGVudW0gbG9jX2FwaV9hZGFwdGVyX2VycgotICAgICAgICBzdGFydEZpeChjb25zdCBMb2NQb3NNb2RlJiBwb3NNb2RlKTsKLSAgICB2aXJ0dWFsIGVudW0gbG9jX2FwaV9hZGFwdGVyX2VycgotICAgICAgICBzdG9wRml4KCk7Ci0gICAgdmlydHVhbCBlbnVtIGxvY19hcGlfYWRhcHRlcl9lcnIKLSAgICAgICAgc2V0UG9zaXRpb25Nb2RlKGNvbnN0IExvY1Bvc01vZGUmIG1vZGUpOwotICAgIGlubGluZSB2aXJ0dWFsIGVudW0gbG9jX2FwaV9hZGFwdGVyX2VycgotICAgICAgICBlbmFibGVEYXRhKGludCBlbmFibGUpIHsgcmV0dXJuIGVuYWJsZURhdGEoZW5hYmxlLCBmYWxzZSk7IH0KLSAgICB2aXJ0dWFsIGVudW0gbG9jX2FwaV9hZGFwdGVyX2VycgotICAgICAgICBlbmFibGVEYXRhKGludCBlbmFibGUsIGJvb2xlYW4gZm9yY2UpOwotICAgIHZpcnR1YWwgZW51bSBsb2NfYXBpX2FkYXB0ZXJfZXJyCi0gICAgICAgIHNldFRpbWUoR3BzVXRjVGltZSB0aW1lLCBpbnQ2NF90IHRpbWVSZWZlcmVuY2UsIGludCB1bmNlcnRhaW50eSk7Ci0gICAgdmlydHVhbCBlbnVtIGxvY19hcGlfYWRhcHRlcl9lcnIKLSAgICAgICAgaW5qZWN0UG9zaXRpb24oZG91YmxlIGxhdGl0dWRlLCBkb3VibGUgbG9uZ2l0dWRlLCBmbG9hdCBhY2N1cmFjeSk7Ci0gICAgdmlydHVhbCBlbnVtIGxvY19hcGlfYWRhcHRlcl9lcnIKLSAgICAgICAgZGVsZXRlQWlkaW5nRGF0YShHcHNBaWRpbmdEYXRhIGYpOwotICAgIHZpcnR1YWwgZW51bSBsb2NfYXBpX2FkYXB0ZXJfZXJyCi0gICAgICAgIGluZm9ybU5pUmVzcG9uc2UoR3BzVXNlclJlc3BvbnNlVHlwZSB1c2VyUmVzcG9uc2UsIGNvbnN0IHZvaWQqIHBhc3NUaHJvdWdoRGF0YSk7Ci0gICAgaW5saW5lIHZpcnR1YWwgZW51bSBsb2NfYXBpX2FkYXB0ZXJfZXJyCi0gICAgICAgIHNldEFQTihjaGFyKiBhcG4sIGludCBsZW4pIHsgcmV0dXJuIHNldEFQTihhcG4sIGxlbiwgZmFsc2UpOyB9Ci0gICAgdmlydHVhbCBlbnVtIGxvY19hcGlfYWRhcHRlcl9lcnIKLSAgICAgICAgc2V0QVBOKGNoYXIqIGFwbiwgaW50IGxlbiwgYm9vbGVhbiBmb3JjZSk7Ci0gICAgdmlydHVhbCBlbnVtIGxvY19hcGlfYWRhcHRlcl9lcnIKLSAgICAgICAgc2V0U2VydmVyKGNvbnN0IGNoYXIqIHVybCwgaW50IGxlbik7Ci0gICAgdmlydHVhbCBlbnVtIGxvY19hcGlfYWRhcHRlcl9lcnIKLSAgICAgICAgc2V0U2VydmVyKHVuc2lnbmVkIGludCBpcCwgaW50IHBvcnQsIExvY1NlcnZlclR5cGUgdHlwZSk7Ci0gICAgdmlydHVhbCBlbnVtIGxvY19hcGlfYWRhcHRlcl9lcnIKLSAgICAgICAgc2V0WHRyYURhdGEoY2hhciogZGF0YSwgaW50IGxlbmd0aCk7Ci0gICAgdmlydHVhbCBlbnVtIGxvY19hcGlfYWRhcHRlcl9lcnIKLSAgICAgICAgcmVxdWVzdFh0cmFTZXJ2ZXIoKTsKLSAgICB2aXJ0dWFsIGVudW0gbG9jX2FwaV9hZGFwdGVyX2VycgotICAgICAgICBhdGxPcGVuU3RhdHVzKGludCBoYW5kbGUsIGludCBpc19zdWNjLCBjaGFyKiBhcG4sIEFHcHNCZWFyZXJUeXBlIGJlYXIsIEFHcHNUeXBlIGFncHNUeXBlKTsKLSAgICB2aXJ0dWFsIGVudW0gbG9jX2FwaV9hZGFwdGVyX2VycgotICAgICAgICBhdGxDbG9zZVN0YXR1cyhpbnQgaGFuZGxlLCBpbnQgaXNfc3VjYyk7Ci0gICAgdmlydHVhbCBlbnVtIGxvY19hcGlfYWRhcHRlcl9lcnIKLSAgICAgICAgc2V0U1VQTFZlcnNpb24odWludDMyX3QgdmVyc2lvbik7Ci0gICAgdmlydHVhbCB2b2lkIHNldEluU2Vzc2lvbihib29sIGluU2Vzc2lvbik7Ci0KLSAgICAvKlZhbHVlcyBmb3IgbG9jawotICAgICAgMSA9IERvIG5vdCBsb2NrIGFueSBwb3NpdGlvbiBzZXNzaW9ucwotICAgICAgMiA9IExvY2sgTUkgcG9zaXRpb24gc2Vzc2lvbnMKLSAgICAgIDMgPSBMb2NrIE1UIHBvc2l0aW9uIHNlc3Npb25zCi0gICAgICA0ID0gTG9jayBhbGwgcG9zaXRpb24gc2Vzc2lvbnMKLSAgICAqLwotICAgIHZpcnR1YWwgaW50IHNldEdwc0xvY2soTE9DX0dQU19MT0NLX01BU0sgbG9jayk7Ci0gICAgLyoKLSAgICAgUmV0dXJucwotICAgICBDdXJyZW50IHZhbHVlIG9mIEdQUyBMb2NrIG9uIHN1Y2Nlc3MKLSAgICAgLTEgb24gZmFpbHVyZQotICAgICAqLwotICAgIHZpcnR1YWwgaW50IGdldEdwc0xvY2sodm9pZCk7Ci19OwotCi1leHRlcm4gIkMiIExvY0FwaUJhc2UqIGdldExvY0FwaShjb25zdCBNc2dUYXNrKiBtc2dUYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9DX0FQSV9BREFQVEVSX0VWRU5UX01BU0tfVCBleE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0QmFzZSAqY29udGV4dCk7Ci0KLSNlbmRpZiAvL0xPQ19BUElfUlBDX0gKZGlmZiAtLWdpdCBhL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpLXJwYy01MDAwMS9saWJsb2NfYXBpLXJwYy1nbHVlL3JwY19pbmMvZGVidWcuaCBiL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpLXJwYy01MDAwMS9saWJsb2NfYXBpLXJwYy1nbHVlL3JwY19pbmMvZGVidWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDlhNmQwYi4uMDAwMDAwMAotLS0gYS9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaS1ycGMtNTAwMDEvbGlibG9jX2FwaS1ycGMtZ2x1ZS9ycGNfaW5jL2RlYnVnLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTEsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCi0gKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKLSAqICAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKLSAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAotICogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKLSAqIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KLSAqIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpZm5kZWYgREVCVUdfSAotI2RlZmluZSBERUJVR19ICi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jZGVmaW5lIExPR19UQUcgIkxvY1N2Y19ycGMiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNkZWZpbmUgUFJJTlQoeC4uLikgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgZnByaW50ZihzdGRvdXQsICIlcyglZCkgIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7IFwKLSAgICAgICAgZnByaW50ZihzdGRvdXQsICMjeCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgQUxPR0QoeCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9IHdoaWxlKDApCi0KLSNpZmRlZiBERUJVRwotI2RlZmluZSBEIFBSSU5UCi0jZWxzZQotI2RlZmluZSBEKHguLi4pIGRvIHsgfSB3aGlsZSgwKQotI2VuZGlmCi0KLSNpZmRlZiBWRVJCT1NFCi0jZGVmaW5lIFYgUFJJTlQKLSNlbHNlCi0jZGVmaW5lIFYoeC4uLikgZG8geyB9IHdoaWxlKDApCi0jZW5kaWYKLQotI2RlZmluZSBFKHguLi4pIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzKCVkKSAiLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsgXAotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIyN4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBBTE9HRSh4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9IHdoaWxlKDApCi0KLSNkZWZpbmUgRkFJTElGKGNvbmQsIG1zZy4uLikgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGlmIChfX2J1aWx0aW5fZXhwZWN0IChjb25kLCAwKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczolczooJWQpOiAiLCBfX0ZJTEVfXywgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7IFwKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAjI21zZyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBBTE9HRSgjI21zZyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSB3aGlsZSgwKQotCi0jZW5kaWYvKkRFQlVHX0gqLwpkaWZmIC0tZ2l0IGEvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGktcnBjLTUwMDAxL2xpYmxvY19hcGktcnBjLWdsdWUvcnBjX2luYy9sb2NfYXBpX2ZpeHVwLmggYi9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaS1ycGMtNTAwMDEvbGlibG9jX2FwaS1ycGMtZ2x1ZS9ycGNfaW5jL2xvY19hcGlfZml4dXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQ4M2I0YS4uMDAwMDAwMAotLS0gYS9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaS1ycGMtNTAwMDEvbGlibG9jX2FwaS1ycGMtZ2x1ZS9ycGNfaW5jL2xvY19hcGlfZml4dXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDIyNiArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTEsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCi0gKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKLSAqICAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKLSAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAotICogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKLSAqIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KLSAqIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpZm5kZWYgIExPQ19BUElfRklYVVBfSAotI2RlZmluZSBMT0NfQVBJX0ZJWFVQX0gKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi17Ci0jZW5kaWYKLQotI2lmbmRlZiBOVUxMUFJPQwotI2RlZmluZSBOVUxMUFJPQyAwCi0jZW5kaWYgLyogTlVMTFBST0MgKi8KLQotI2lmZGVmIEFERF9YRFJfRkxPQVQKLQotZXh0ZXJuIGJvb2xfdCB4ZHJfZmxvYXQgKFhEUiAqX194ZHJzLCBmbG9hdCAqX19mcCk7Ci1leHRlcm4gYm9vbF90IHhkcl9kb3VibGUgKFhEUiAqX194ZHJzLCBkb3VibGUgKl9fZHApOwotCi0jZW5kaWYgLyogQUREX1hEUl9GTE9BVCAqLwotCi0jaWZkZWYgQUREX1hEUl9CT09MCi1leHRlcm4gYm9vbF90IHhkcl9ib29sKFhEUiAqX194ZHJzLCBpbnQgKl9fYnApOwotI2VuZGlmIC8qIEFERF9YRFJfQk9PTCAqLwotCi0jZGVmaW5lIFJQQ19MT0NfQVBJX01BSk9SX1ZFUlNJT05fTlVNQkVSICAgMQotI2RlZmluZSBSUENfTE9DX0FQSV9NSU5PUl9WRVJTSU9OX05VTUJFUiAgIDAKLQotLy8gUmV0dXJuIHZhbHVlIGZvciBsb2Nfb3BlbiBpbiBjYXNlIG9mIGZhaWx1cmUuCi0jZGVmaW5lIFJQQ19MT0NfQ0xJRU5UX0hBTkRMRV9JTlZBTElEICAgICAtMQotCi0vLyBSZXR1cm4gdmFsdWUgb2YgbG9jIGFwaSBjYWxscyBmb3IgbG9jX2Nsb3NlLCBsb2Nfc3RhcnRfZml4LCBsb2Nfc3RvcF9maXggYW5kIGxvY19pb2N0bAotLy8gVGhlc2UgYXJlIGFsc28gdGhlIHN0YXR1cyBmb3IgdGhlIGlvY3RsIGNhbGxiYWNrCi0jZGVmaW5lIFJQQ19MT0NfQVBJX1NVQ0NFU1MgICAgICAgICAgIDAKLSNkZWZpbmUgUlBDX0xPQ19BUElfR0VORVJBTF9GQUlMVVJFICAgMQotI2RlZmluZSBSUENfTE9DX0FQSV9VTlNVUFBPUlRFRCAgICAgICAyCi0jZGVmaW5lIFJQQ19MT0NfQVBJX0lOVkFMSURfSEFORExFICAgIDQKLSNkZWZpbmUgUlBDX0xPQ19BUElfSU5WQUxJRF9QQVJBTUVURVIgNQotI2RlZmluZSBSUENfTE9DX0FQSV9FTkdJTkVfQlVTWSAgICAgICA2Ci0jZGVmaW5lIFJQQ19MT0NfQVBJX1BIT05FX09GRkxJTkUgICAgIDcKLSNkZWZpbmUgUlBDX0xPQ19BUElfVElNRU9VVCAgICAgICAgICAgOAotCi0vLyBTcGVjaWFsIHJldHVybiB2YWx1ZSBmb3IgbG9jIGFwaSBjYWxscyBpbiBjYXNlIG9mIFJQQyBmYWlsdXJlCi0jZGVmaW5lIFJQQ19MT0NfQVBJX1JQQ19GQUlMVVJFICAgICAgICgtMTIzNCkKLS8vIFNwZWNpYWwgcmV0dXJuIHZhbHVlIGZvciBtb2RlbSByZXN0YXJ0IGluY3VycmVkIFJQQyBmYWlsdXJlCi0jZGVmaW5lIFJQQ19MT0NfQVBJX1JQQ19NT0RFTV9SRVNUQVJUICAgICAgICgtMTIzNSkKLQotI2RlZmluZSBSUENfTE9DX0FQSV9NQVhfU1ZfQ09VTlQgICAgICAgICAgICAgICAgICAgICAgODAKLSNkZWZpbmUgUlBDX0xPQ19BUElfTUFYX05NRUFfU1RSSU5HX0xFTkdUSCAgICAgICAgICAgIDEyMDAKLQotLy8gTWF4aW11bSBzZXJ2ZXIgYWRkcmVzcyB0aGF0IHdpbGwgYmUgdXNlZCBpbiBsb2NhdGlvbiBBUEkKLSNkZWZpbmUgUlBDX0xPQ19BUElfTUFYX1NFUlZFUl9BRERSX0xFTkdUSCAgICAgICAgICAgIDI1NgotI2RlZmluZSBSUENfTE9DX0FQSV9NQVhfTlVNX1BSRURJQ1RFRF9PUkJJVFNfU0VSVkVSUyAgMwotI2RlZmluZSBSUENfTE9DX0FQSV9NQVhfTlVNX05UUF9TRVJWRVJTICAgICAgICAgICAgICAgMwotCi0jZGVmaW5lIFJQQ19MT0NfRVZFTlRfUEFSU0VEX1BPU0lUSU9OX1JFUE9SVCAgICAgICAgICAgICAweDAwMDAwMDAxIC8vIFBvc2l0aW9uIHJlcG9ydCBjb21lcyBpbiBsb2NfcGFyc2VkX3Bvc2l0aW9uX3NfdHlwZQotI2RlZmluZSBSUENfTE9DX0VWRU5UX1NBVEVMTElURV9SRVBPUlQgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMiAvLyBTYXRlbGxpdGUgaW4gdmlldyByZXBvcnQKLSNkZWZpbmUgUlBDX0xPQ19FVkVOVF9OTUVBXzFIWl9SRVBPUlQgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQgLy8gTk1FQSByZXBvcnQgYXQgMUhaIHJhdGUKLSNkZWZpbmUgUlBDX0xPQ19FVkVOVF9OTUVBX1BPU0lUSU9OX1JFUE9SVCAgICAgICAgICAgICAgIDB4MDAwMDAwMDggLy8gTk1FQSByZXBvcnQgYXQgcG9zaXRpb24gcmVwb3J0IHJhdGUKLSNkZWZpbmUgUlBDX0xPQ19FVkVOVF9OSV9OT1RJRllfVkVSSUZZX1JFUVVFU1QgICAgICAgICAgIDB4MDAwMDAwMTAgLy8gTkkgbm90aWZpY2F0aW9uL3ZlcmlmaWNhdGlvbiByZXF1ZXN0Ci0jZGVmaW5lIFJQQ19MT0NfRVZFTlRfQVNTSVNUQU5DRV9EQVRBX1JFUVVFU1QgICAgICAgICAgICAweDAwMDAwMDIwIC8vIEFzc2lzdGFuY2UgZGF0YSwgZWc6IHRpbWUsIHByZWRpY3RlZCBvcmJpdHMgcmVxdWVzdAotI2RlZmluZSBSUENfTE9DX0VWRU5UX0xPQ0FUSU9OX1NFUlZFUl9SRVFVRVNUICAgICAgICAgICAgMHgwMDAwMDA0MCAvLyBSZXF1ZXN0IGZvciBsb2NhdGlvbiBzZXJ2ZXIKLSNkZWZpbmUgUlBDX0xPQ19FVkVOVF9JT0NUTF9SRVBPUlQgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODAgLy8gQ2FsbGJhY2sgcmVwb3J0IGZvciBsb2NfaW9jdGwKLSNkZWZpbmUgUlBDX0xPQ19FVkVOVF9TVEFUVVNfUkVQT1JUICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDAgLy8gTWlzYyBzdGF0dXMgcmVwb3J0OiBlZywgZW5naW5lIHN0YXRlCi0KLSNkZWZpbmUgUlBDX0xPQ19QT1NfVkFMSURfU0VTU0lPTl9TVEFUVVMgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgUlBDX0xPQ19QT1NfVkFMSURfVElNRVNUQU1QX0NBTEVOREFSICAgICAgICAgICAgIDB4MDAwMDAwMDIKLSNkZWZpbmUgUlBDX0xPQ19QT1NfVkFMSURfVElNRVNUQU1QX1VUQyAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKLSNkZWZpbmUgUlBDX0xPQ19QT1NfVkFMSURfTEVBUF9TRUNPTkRTICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKLSNkZWZpbmUgUlBDX0xPQ19QT1NfVkFMSURfVElNRV9VTkMgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAKLSNkZWZpbmUgUlBDX0xPQ19QT1NfVkFMSURfTEFUSVRVREUgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKLSNkZWZpbmUgUlBDX0xPQ19QT1NfVkFMSURfTE9OR0lUVURFICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKLSNkZWZpbmUgUlBDX0xPQ19QT1NfVkFMSURfQUxUSVRVREVfV1JUX0VMTElQU09JRCAgICAgICAgIDB4MDAwMDAwODAKLSNkZWZpbmUgUlBDX0xPQ19QT1NfVkFMSURfQUxUSVRVREVfV1JUX01FQU5fU0VBX0xFVkVMICAgIDB4MDAwMDAxMDAKLSNkZWZpbmUgUlBDX0xPQ19QT1NfVkFMSURfU1BFRURfSE9SSVpPTlRBTCAgICAgICAgICAgICAgIDB4MDAwMDAyMDAKLSNkZWZpbmUgUlBDX0xPQ19QT1NfVkFMSURfU1BFRURfVkVSVElDQUwgICAgICAgICAgICAgICAgIDB4MDAwMDA0MDAKLSNkZWZpbmUgUlBDX0xPQ19QT1NfVkFMSURfSEVBRElORyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA4MDAKLSNkZWZpbmUgUlBDX0xPQ19QT1NfVkFMSURfSE9SX1VOQ19DSVJDVUxBUiAgICAgICAgICAgICAgIDB4MDAwMDEwMDAKLSNkZWZpbmUgUlBDX0xPQ19QT1NfVkFMSURfSE9SX1VOQ19FTExJX1NFTUlfTUFKICAgICAgICAgIDB4MDAwMDIwMDAKLSNkZWZpbmUgUlBDX0xPQ19QT1NfVkFMSURfSE9SX1VOQ19FTExJX1NFTUlfTUlOICAgICAgICAgIDB4MDAwMDQwMDAKLSNkZWZpbmUgUlBDX0xPQ19QT1NfVkFMSURfSE9SX1VOQ19FTExJX09SSUVOVF9BWklNVVRIICAgIDB4MDAwMDgwMDAKLSNkZWZpbmUgUlBDX0xPQ19QT1NfVkFMSURfVkVSVElDQUxfVU5DICAgICAgICAgICAgICAgICAgIDB4MDAwMTAwMDAKLSNkZWZpbmUgUlBDX0xPQ19QT1NfVkFMSURfU1BFRURfVU5DICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMjAwMDAKLSNkZWZpbmUgUlBDX0xPQ19QT1NfVkFMSURfSEVBRElOR19VTkMgICAgICAgICAgICAgICAgICAgIDB4MDAwNDAwMDAKLSNkZWZpbmUgUlBDX0xPQ19QT1NfVkFMSURfQ09ORklERU5DRV9IT1JJWk9OVEFMICAgICAgICAgIDB4MDAwODAwMDAKLSNkZWZpbmUgUlBDX0xPQ19QT1NfVkFMSURfQ09ORklERU5DRV9WRVJUSUNBTCAgICAgICAgICAgIDB4MDAxMDAwMDAKLSNkZWZpbmUgUlBDX0xPQ19QT1NfVkFMSURfTUFHTkVUSUNfVkFSSUFUSU9OICAgICAgICAgICAgIDB4MDAyMDAwMDAKLSNkZWZpbmUgUlBDX0xPQ19QT1NfVkFMSURfVEVDSE5PTE9HWV9NQVNLICAgICAgICAgICAgICAgIDB4MDA0MDAwMDAKLQotI2RlZmluZSBSUENfTE9DX1BPU19URUNIX1NBVEVMTElURSAweDAwMDAwMDAxCi0jZGVmaW5lIFJQQ19MT0NfUE9TX1RFQ0hfQ0VMTElEICAgIDB4MDAwMDAwMDIKLSNkZWZpbmUgUlBDX0xPQ19QT1NfVEVDSF9XSUZJICAgICAgMHgwMDAwMDAwNAotCi0jZGVmaW5lIFJQQ19MT0NfU1ZfSU5GT19WQUxJRF9TWVNURU0gICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIFJQQ19MT0NfU1ZfSU5GT19WQUxJRF9QUk4gICAgICAgICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIFJQQ19MT0NfU1ZfSU5GT19WQUxJRF9IRUFMVEhfU1RBVFVTICAweDAwMDAwMDA0Ci0jZGVmaW5lIFJQQ19MT0NfU1ZfSU5GT19WQUxJRF9QUk9DRVNTX1NUQVRVUyAweDAwMDAwMDA4Ci0jZGVmaW5lIFJQQ19MT0NfU1ZfSU5GT19WQUxJRF9IQVNfRVBIICAgICAgICAweDAwMDAwMDEwCi0jZGVmaW5lIFJQQ19MT0NfU1ZfSU5GT19WQUxJRF9IQVNfQUxNICAgICAgICAweDAwMDAwMDIwCi0jZGVmaW5lIFJQQ19MT0NfU1ZfSU5GT19WQUxJRF9FTEVWQVRJT04gICAgICAweDAwMDAwMDQwCi0jZGVmaW5lIFJQQ19MT0NfU1ZfSU5GT19WQUxJRF9BWklNVVRIICAgICAgICAweDAwMDAwMDgwCi0jZGVmaW5lIFJQQ19MT0NfU1ZfSU5GT19WQUxJRF9TTlIgICAgICAgICAgICAweDAwMDAwMTAwCi0KLSNkZWZpbmUgUlBDX0xPQ19HTlNTX0lORk9fVkFMSURfUE9TX0RPUCAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBSUENfTE9DX0dOU1NfSU5GT19WQUxJRF9IT1JfRE9QICAgICAgICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIFJQQ19MT0NfR05TU19JTkZPX1ZBTElEX1ZFUlRfRE9QICAgICAgICAgIDB4MDAwMDAwMDQKLSNkZWZpbmUgUlBDX0xPQ19HTlNTX0lORk9fVkFMSURfQUxUSVRVREVfQVNTVU1FRCAgMHgwMDAwMDAwOAotI2RlZmluZSBSUENfTE9DX0dOU1NfSU5GT19WQUxJRF9TVl9DT1VOVCAgICAgICAgICAweDAwMDAwMDEwCi0jZGVmaW5lIFJQQ19MT0NfR05TU19JTkZPX1ZBTElEX1NWX0xJU1QgICAgICAgICAgIDB4MDAwMDAwMjAKLQotI2RlZmluZSBSUENfTE9DX05JX01BWF9SRVFVRVNUT1JfSURfTEVOR1RIICAgICAgICAgIDIwMAotI2RlZmluZSBSUENfTE9DX05JX1NVUExfSEFTSF9MRU5HVEggICAgICAgICAgICAgICAgIDgKLSNkZWZpbmUgUlBDX0xPQ19OSV9TVVBMX1NMUF9TRVNTSU9OX0lEX0JZVEVfTEVOR1RIICA0Ci0jZGVmaW5lIFJQQ19MT0NfTklfTUFYX0NMSUVOVF9OQU1FX0xFTkdUSCAgICAgICAgICAgNjQKLSNkZWZpbmUgUlBDX0xPQ19OSV9NQVhfRVhUX0NMSUVOVF9BRERSRVNTICAgICAgICAgICAyMAotI2RlZmluZSBSUENfTE9DX05JX0NPREVXT1JEX0xFTkdUSCAgICAgICAgICAgICAgICAgIDIwCi0KLSNkZWZpbmUgUlBDX0xPQ19OSV9TVVBMX1FPUF9WQUxJRCAgICAgICAgIDB4MDEKLSNkZWZpbmUgUlBDX0xPQ19OSV9TVVBMX1FPUF9WRVJBQ0NfVkFMSUQgIDB4MDIKLSNkZWZpbmUgUlBDX0xPQ19OSV9TVVBMX1FPUF9NQVhBR0VfVkFMSUQgIDB4MDQKLSNkZWZpbmUgUlBDX0xPQ19OSV9TVVBMX1FPUF9ERUxBWV9WQUxJRCAgIDB4MDgKLQotI2RlZmluZSBSUENfTE9DX0ZJWF9DUklUX1ZBTElEX1JFQ1VSUkVOQ0VfVFlQRSAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgUlBDX0xPQ19GSVhfQ1JJVF9WQUxJRF9QUkVGRVJSRURfT1BFUkFUSU9OX01PREUgICAgICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIFJQQ19MT0NfRklYX0NSSVRfVkFMSURfUFJFRkVSUkVEX0FDQ1VSQUNZICAgICAgICAgICAgICAgMHgwMDAwMDAwNAotI2RlZmluZSBSUENfTE9DX0ZJWF9DUklUX1ZBTElEX1BSRUZFUlJFRF9SRVNQT05TRV9USU1FICAgICAgICAgIDB4MDAwMDAwMDgKLSNkZWZpbmUgUlBDX0xPQ19GSVhfQ1JJVF9WQUxJRF9JTlRFUk1FRElBVEVfUE9TX1JFUE9SVF9FTkFCTEVEICAweDAwMDAwMDEwCi0jZGVmaW5lIFJQQ19MT0NfRklYX0NSSVRfVkFMSURfTk9USUZZX1RZUEUgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAotI2RlZmluZSBSUENfTE9DX0ZJWF9DUklUX1ZBTElEX01JTl9JTlRFUlZBTCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKLSNkZWZpbmUgUlBDX0xPQ19GSVhfQ1JJVF9WQUxJRF9NSU5fRElTVEFOQ0UgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDgwCi0jZGVmaW5lIFJQQ19MT0NfRklYX0NSSVRfVkFMSURfTUlOX0RJU1RfU0FNUExFX0lOVEVSVkFMICAgICAgICAgMHgwMDAwMDEwMAotCi0jZGVmaW5lIFJQQ19MT0NfQVNTSVNUX1BPU19WQUxJRF9USU1FU1RBTVBfVVRDICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgUlBDX0xPQ19BU1NJU1RfUE9TX1ZBTElEX0xBVElUVURFICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgotI2RlZmluZSBSUENfTE9DX0FTU0lTVF9QT1NfVkFMSURfTE9OR0lUVURFICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0Ci0jZGVmaW5lIFJQQ19MT0NfQVNTSVNUX1BPU19WQUxJRF9BTFRJVFVERV9XUlRfRUxMSVBTT0lEICAgICAgIDB4MDAwMDAwMDgKLSNkZWZpbmUgUlBDX0xPQ19BU1NJU1RfUE9TX1ZBTElEX0FMVElUVURFX1dSVF9NRUFOX1NFQV9MRVZFTCAgMHgwMDAwMDAxMAotI2RlZmluZSBSUENfTE9DX0FTU0lTVF9QT1NfVkFMSURfSE9SX1VOQ19DSVJDVUxBUiAgICAgICAgICAgICAweDAwMDAwMDIwCi0jZGVmaW5lIFJQQ19MT0NfQVNTSVNUX1BPU19WQUxJRF9WRVJUX1VOQyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKLSNkZWZpbmUgUlBDX0xPQ19BU1NJU1RfUE9TX1ZBTElEX0NPTkZJREVOQ0VfSE9SSVpPTlRBTCAgICAgICAgMHgwMDAwMDA4MAotI2RlZmluZSBSUENfTE9DX0FTU0lTVF9QT1NfVkFMSURfQ09ORklERU5DRV9WRVJUSUNBTCAgICAgICAgICAweDAwMDAwMTAwCi0jZGVmaW5lIFJQQ19MT0NfQVNTSVNUX1BPU19WQUxJRF9USU1FU1RBTVBfQUdFICAgICAgICAgICAgICAgIDB4MDAwMDAyMDAKLQotI2RlZmluZSBSUENfTE9DX0FTU0lTVF9EQVRBX0FMTCAgICAgICAgIDB4RkZGRkZGRkYKLQotI2RlZmluZSBSUENfTE9DX05NRUFfTUFTS19BTEwgICAgMHhmZmZmCi0jZGVmaW5lIFJQQ19MT0NfTk1FQV9NQVNLX0dHQSAgICAweDAwMDEKLSNkZWZpbmUgUlBDX0xPQ19OTUVBX01BU0tfUk1DICAgIDB4MDAwMgotI2RlZmluZSBSUENfTE9DX05NRUFfTUFTS19HU1YgICAgMHgwMDA0Ci0jZGVmaW5lIFJQQ19MT0NfTk1FQV9NQVNLX0dTQSAgICAweDAwMDgKLSNkZWZpbmUgUlBDX0xPQ19OTUVBX01BU0tfVlRHICAgIDB4MDAxMAotCi0vKiBFRlMgZGF0YSBhY2Nlc3MgKi8KLSNkZWZpbmUgUlBDX0xPQ19FRlNfTUFYX1BBVEhfTEVOX0JZVEVTICA2NCAgICAgLyogTWF4IGZpbGUgbmFtZSBsZW5ndGggaW4gYnl0ZXMgdGhhdCBjYW4gYmUgd3JpdHRlbiovCi0jZGVmaW5lIFJQQ19MT0NfRUZTX01BWF9GSUxFX0xFTl9CWVRFUyAgMjAwMCAgIC8qIE1heCBmaWxlIHNpemUgaW4gYnl0ZXMgdGhhdCBjYW4gYmUgd3JpdHRlbiAqLwotCi0vKiBXSVBFUiB2YWxpZCBpbmZvcm1hdGlvbiBmbGFnIGluIGxvZyByZXBvcnQgKi8KLSNkZWZpbmUgUlBDX0xPQ19XSVBFUl9MT0dfVElNRV9WQUxJRCAweDAxCi0jZGVmaW5lIFJQQ19MT0NfV0lQRVJfTE9HX1BPU19WQUxJRCAweDAyCi0jZGVmaW5lIFJQQ19MT0NfV0lQRVJfTE9HX0FQX1NFVF9WQUxJRCAweDA0Ci0KLS8qIEdlbmVyYWwgV0lQRVIgZGVmaW5lcyAqLwotI2RlZmluZSBSUENfTE9DX1dJUEVSX01BQ19BRERSX0xFTkdUSCAgNiAgICAgICAgICAgICAgLy8gRG8gbm90IGNoYW5nZSB0aGlzIG51bWJlciBzaW5jZSBpdCBhZmZlY3RzIFJQQyBhbmQgbG9nIHBhY2tldCBzaXplcwotI2RlZmluZSBSUENfTE9DX1dJUEVSX01BWF9SRVBPUlRFRF9BUFNfUEVSX0xPR19NU0cgNTAgLy8gRG8gbm90IGNoYW5nZSB0aGlzIG51bWJlciBzaW5jZSBpdCBhZmZlY3RzIFJQQyBhbmQgbG9nIHBhY2tldCBzaXplcwotCi0vKiBXSVBFUiBBUCBRdWFsaWZpZXIgKi8KLSNkZWZpbmUgUlBDX0xPQ19XSVBFUl9BUF9RVUFMSUZJRVJfQkVJTkdfVVNFRCAweDEgIC8qIEFQIGlzIGJlaW5nIHVzZWQgYnkgV1BTICovCi0jZGVmaW5lIFJQQ19MT0NfV0lQRVJfQVBfUVVBTElGSUVSX0hJRERFTl9TU0lEIDB4MiAvKiBBUCBkb2VzIG5vdCBicm9hZGNhc3QgU1NJRCAqLwotI2RlZmluZSBSUENfTE9DX1dJUEVSX0FQX1FVQUxJRklFUl9QUklWQVRFIDB4NCAgICAgLyogQVAgaGFzIGVuY3J5cHRpb24gdHVybmVkIG9uICovCi0jZGVmaW5lIFJQQ19MT0NfV0lQRVJfQVBfUVVBTElGSUVSX0lORlJBU1RSVUNUVVJFX01PREUgMHg4ICAgICAvKiBBUCBpcyBpbiBpbmZyYXN0cnVjdHVyZSBtb2RlIGFuZCBub3QgaW4gYWQtaG9jL3Vua25vd24gbW9kZSAqLwotCi0vKiBmbGFncyBmb3Igbm90aWZpY2F0aW9uICovCi0jZGVmaW5lICBSUENfTE9DX05JX0NMSUVOVF9OQU1FX1BSRVNFTlQgICAgICAgICAgICAgMHgwMDAxCi0jZGVmaW5lICBSUENfTE9DX05JX0NMSUVOVF9FWFRBRERSX1BSRVNFTlQgICAgICAgICAgMHgwMDAyCi0jZGVmaW5lICBSUENfTE9DX05JX0RFRl9MT0NBVElPTl9UWVBFX1BSRVNFTlQgICAgICAgMHgwMDEwCi0jZGVmaW5lICBSUENfTE9DX05JX1JFUVVFU1RPUl9JRF9QUkVTRU5UICAgICAgICAgICAgMHgwMDIwCi0jZGVmaW5lICBSUENfTE9DX05JX0NPREVXT1JEX1BSRVNFTlQgICAgICAgICAgICAgICAgMHgwMDQwCi0jZGVmaW5lICBSUENfTE9DX05JX1NFUlZJQ0VfVFlQRV9JRF9QUkVTRU5UICAgICAgICAgMHgwMDgwCi0jZGVmaW5lICBSUENfTE9DX05JX0VOQ09ESU5HX1RZUEVfUFJFU0VOVCAgICAgICAgICAgMHgwMTAwCi0KLS8qIGJlbG93IGFyZSBmb3IgUlBDX0xPQ19JT0NUTF9TRVRfTEJTX0FQTl9QUk9GSUxFIGRhdGEgKi8KLS8qIHZhbHVlcyBmb3IgYXBuX3Byb2ZpbGVzWzBdLnNydl9zeXN0ZW1fdHlwZSAqLwotI2RlZmluZSBMT0NfQVBOX1BST0ZJTEVfU1JWX1NZU19DRE1BICAweDAxCi0jZGVmaW5lIExPQ19BUE5fUFJPRklMRV9TUlZfU1lTX0hEUiAgIDB4MDIKLSNkZWZpbmUgTE9DX0FQTl9QUk9GSUxFX1NSVl9TWVNfR1NNICAgMHgwNAotI2RlZmluZSBMT0NfQVBOX1BST0ZJTEVfU1JWX1NZU19XQ0RNQSAweDA4Ci0jZGVmaW5lIExPQ19BUE5fUFJPRklMRV9TUlZfU1lTX0xURSAgIDB4MTAKLSNkZWZpbmUgTE9DX0FQTl9QUk9GSUxFX1NSVl9TWVNfTUFYICAgMHgxRgotLyogdmFsdWVzIGZvciBhcG5fcHJvZmlsZXNbMF0ucGRwX3R5cGUgKi8KLSNkZWZpbmUgTE9DX0FQTl9QUk9GSUxFX1BETl9UWVBFX0lQVjQgICAgMHgwMQotI2RlZmluZSBMT0NfQVBOX1BST0ZJTEVfUEROX1RZUEVfSVBWNiAgICAweDAyCi0jZGVmaW5lIExPQ19BUE5fUFJPRklMRV9QRE5fVFlQRV9JUFY0VjYgIDB4MDMKLSNkZWZpbmUgTE9DX0FQTl9QUk9GSUxFX1BETl9UWVBFX1BQUCAgICAgMHgwNAotI2RlZmluZSBMT0NfQVBOX1BST0ZJTEVfUEROX1RZUEVfTUFYICAgICAweDA0Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZiAvKiBMT0NfQVBJX0ZJWFVQX0ggKi8KZGlmZiAtLWdpdCBhL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpLXJwYy01MDAwMS9saWJsb2NfYXBpLXJwYy1nbHVlL3JwY19pbmMvbG9jX2FwaV9sb2cuaCBiL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpLXJwYy01MDAwMS9saWJsb2NfYXBpLXJwYy1nbHVlL3JwY19pbmMvbG9jX2FwaV9sb2cuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjAzNzQyOC4uMDAwMDAwMAotLS0gYS9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaS1ycGMtNTAwMDEvbGlibG9jX2FwaS1ycGMtZ2x1ZS9ycGNfaW5jL2xvY19hcGlfbG9nLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTEgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKLSAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAotICogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAotICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgotICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCi0gKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQotICogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgotICogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpZm5kZWYgTE9DX0FQSV9MT0dfSAotI2RlZmluZSBMT0NfQVBJX0xPR19ICi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotewotI2VuZGlmCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgImxvY19hcGlfcnBjZ2VuX2NvbW1vbl9ycGMuaCIKLQotZXh0ZXJuIGludCBsb2NfY2FsbGJhY2tfbG9nKAotICAgICAgcnBjX2xvY19ldmVudF9tYXNrX3R5cGUgICAgICAgICAgICAgICBsb2NfZXZlbnQsICAgICAgICAgICAgICAvKiBldmVudCBtYXNrICAgICAgICAgICAqLwotICAgICAgY29uc3QgcnBjX2xvY19ldmVudF9wYXlsb2FkX3VfdHlwZSogICBsb2NfZXZlbnRfcGF5bG9hZCAgICAgICAvKiBwYXlsb2FkICAgICAgICAgICAgICAqLwotKTsKLQotZXh0ZXJuIGNvbnN0IGNoYXIqIGxvY19nZXRfZXZlbnRfYXRsX29wZW5fbmFtZShycGNfbG9jX3NlcnZlcl9yZXF1ZXN0X2VfdHlwZSBsb2NfZXZlbnRfYXRsX29wZW4pOwotZXh0ZXJuIGNvbnN0IGNoYXIqIGxvY19nZXRfZXZlbnRfbmFtZShycGNfbG9jX2V2ZW50X21hc2tfdHlwZSBsb2NfZXZlbnRfbWFzayk7Ci1leHRlcm4gY29uc3QgY2hhciogbG9jX2dldF9pb2N0bF90eXBlX25hbWUocnBjX2xvY19pb2N0bF9lX3R5cGUgaW9jdGxfdHlwZSk7Ci1leHRlcm4gY29uc3QgY2hhciogbG9jX2dldF9pb2N0bF9zdGF0dXNfbmFtZSh1aW50MzIgc3RhdHVzKTsKLWV4dGVybiBjb25zdCBjaGFyKiBsb2NfZ2V0X3Nlc3Nfc3RhdHVzX25hbWUocnBjX2xvY19zZXNzaW9uX3N0YXR1c19lX3R5cGUgc3RhdHVzKTsKLWV4dGVybiBjb25zdCBjaGFyKiBsb2NfZ2V0X2VuZ2luZV9zdGF0ZV9uYW1lKHJwY19sb2NfZW5naW5lX3N0YXRlX2VfdHlwZSBzdGF0ZSk7Ci1leHRlcm4gY29uc3QgY2hhciogbG9jX2dldF9maXhfc2Vzc2lvbl9zdGF0ZV9uYW1lKHJwY19sb2NfZml4X3Nlc3Npb25fc3RhdGVfZV90eXBlIHN0YXRlKTsKLWV4dGVybiBjb25zdCBjaGFyKiBsb2NfZ2V0X3JwY19yZXNldF9ldmVudF9uYW1lKGVudW0gcnBjX3Jlc2V0X2V2ZW50IGV2ZW50KTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmIC8qIExPQ19BUElfTE9HX0ggKi8KZGlmZiAtLWdpdCBhL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpLXJwYy01MDAwMS9saWJsb2NfYXBpLXJwYy1nbHVlL3JwY19pbmMvbG9jX2FwaV9ycGNfZ2x1ZS5oIGIvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGktcnBjLTUwMDAxL2xpYmxvY19hcGktcnBjLWdsdWUvcnBjX2luYy9sb2NfYXBpX3JwY19nbHVlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkZjMzYWUuLjAwMDAwMDAKLS0tIGEvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGktcnBjLTUwMDAxL2xpYmxvY19hcGktcnBjLWdsdWUvcnBjX2luYy9sb2NfYXBpX3JwY19nbHVlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDExLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZwotICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCi0gKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCi0gKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKLSAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCi0gKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCi0gKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaWZuZGVmIExPQ19BUElfUlBDX0dMVUVfSAotI2RlZmluZSBMT0NfQVBJX1JQQ19HTFVFX0gKLQotLyogSW5jbHVkZSBSUEMgaGVhZGVycyAqLwotI2lmZGVmIFVTRV9MT0NBTF9SUEMKLSNpbmNsdWRlICJycGNfaW5jL2xvY19hcGlfY29tbW9uLmgiCi0jaW5jbHVkZSAicnBjX2luYy9sb2NfYXBpLmgiCi0jaW5jbHVkZSAicnBjX2luYy9sb2NfYXBpX2NiLmgiCi0jZW5kaWYKLQotI2lmZGVmIFVTRV9RQ09NX0FVVE9fUlBDCi0jaW5jbHVkZSAibG9jX2FwaV9ycGNnZW5fcnBjLmgiCi0jaW5jbHVkZSAibG9jX2FwaV9ycGNnZW5fY29tbW9uX3JwYy5oIgotI2luY2x1ZGUgImxvY19hcGlfcnBjZ2VuX2NiX3JwYy5oIgotI2VuZGlmCi0KLS8qIEJvb2xlYW4gKi8KLS8qIE90aGVyIGRhdGEgdHlwZXMgaW4gY29tZGVmLmggYXJlIGRlZmluZWQgaW4gcnBjIHN0dWJzLCBzbyBmaXggaXQgaGVyZSAqLwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyIGJvb2xlYW47Ci0jZGVmaW5lIFRSVUUgMQotI2RlZmluZSBGQUxTRSAwCi0KLSNpbmNsdWRlICJsb2NfYXBpX2ZpeHVwLmgiCi0jaW5jbHVkZSAibG9jX2FwaV9zeW5jX2NhbGwuaCIKLSNpbmNsdWRlIDxycGMvY2xudC5oPgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLXsKLSNlbmRpZgotCi1leHRlcm4gaW50IGxvY19hcGlfZ2x1ZV9pbml0KHZvaWQpOwotZXh0ZXJuIGludCBsb2NfYXBpX251bGwodm9pZCk7Ci0KLXR5cGVkZWYgaW50MzIgKGxvY19ldmVudF9jYl9mX3R5cGUpKAotICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckRhdGEsCi0gICAgcnBjX2xvY19jbGllbnRfaGFuZGxlX3R5cGUgICAgICAgICAgICBsb2NfaGFuZGxlLCAgICAgICAgICAgICAvKiBoYW5kbGUgb2YgdGhlIGNsaWVudCAqLwotICAgIHJwY19sb2NfZXZlbnRfbWFza190eXBlICAgICAgICAgICAgICAgbG9jX2V2ZW50LCAgICAgICAgICAgICAgLyogZXZlbnQgbWFzayAgICAgICAgICAgKi8KLSAgICBjb25zdCBycGNfbG9jX2V2ZW50X3BheWxvYWRfdV90eXBlKiAgIGxvY19ldmVudF9wYXlsb2FkICAgICAgIC8qIHBheWxvYWQgICAgICAgICAgICAgICovCi0pOwotCi10eXBlZGVmIHZvaWQgKGxvY19yZXNldF9ub3RpZl9jYl9mX3R5cGUpKAotICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckRhdGEsCi0gICAgQ0xJRU5UKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG50LAotICAgIGVudW0gcnBjX3Jlc2V0X2V2ZW50ICAgICAgICAgICAgICAgICAgZXZlbnQKLSk7Ci0KLWV4dGVybiBycGNfbG9jX2NsaWVudF9oYW5kbGVfdHlwZSBsb2Nfb3BlbigKLSAgICBycGNfbG9jX2V2ZW50X21hc2tfdHlwZSAgICAgICBldmVudF9yZWdfbWFzaywKLSAgICBsb2NfZXZlbnRfY2JfZl90eXBlICAgICAgICAgICAqZXZlbnRfY2FsbGJhY2ssCi0gICAgbG9jX3Jlc2V0X25vdGlmX2NiX2ZfdHlwZSAgICAgKnJwY19nbG9iYWxfY2IsCi0gICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgdXNlckRhdGEKLSk7Ci0KLWV4dGVybiBpbnQzMiBsb2NfY2xvc2UKLSgKLSAgICAgIHJwY19sb2NfY2xpZW50X2hhbmRsZV90eXBlIGhhbmRsZQotKTsKLQotZXh0ZXJuIHZvaWQgbG9jX2NsZWFyCi0oCi0gICAgICBycGNfbG9jX2NsaWVudF9oYW5kbGVfdHlwZSBoYW5kbGUKLSk7Ci0KLWV4dGVybiBpbnQzMiBsb2Nfc3RhcnRfZml4Ci0oCi0gICAgICBycGNfbG9jX2NsaWVudF9oYW5kbGVfdHlwZSBoYW5kbGUKLSk7Ci0KLWV4dGVybiBpbnQzMiBsb2Nfc3RvcF9maXgKLSgKLSAgICAgIHJwY19sb2NfY2xpZW50X2hhbmRsZV90eXBlIGhhbmRsZQotKTsKLQotZXh0ZXJuIGludDMyIGxvY19pb2N0bAotKAotICAgICAgcnBjX2xvY19jbGllbnRfaGFuZGxlX3R5cGUgICAgICAgICAgIGhhbmRsZSwKLSAgICAgIHJwY19sb2NfaW9jdGxfZV90eXBlICAgICAgICAgICAgICAgICBpb2N0bF90eXBlLAotICAgICAgcnBjX2xvY19pb2N0bF9kYXRhX3VfdHlwZSogICAgICAgICAgIGlvY3RsX2RhdGEKLSk7Ci0KLWV4dGVybiBpbnQgbG9jX2VuZ19pb2N0bAotKAotICAgICAgcnBjX2xvY19jbGllbnRfaGFuZGxlX3R5cGUgICAgICAgICAgIGhhbmRsZSwKLSAgICAgIHJwY19sb2NfaW9jdGxfZV90eXBlICAgICAgICAgICAgICAgICBpb2N0bF90eXBlLAotICAgICAgcnBjX2xvY19pb2N0bF9kYXRhX3VfdHlwZSogICAgICAgICAgIGlvY3RsX2RhdGFfcHRyLAotICAgICAgdWludDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXRfbXNlYywKLSAgICAgIHJwY19sb2NfaW9jdGxfY2FsbGJhY2tfc190eXBlICAgICAgICpjYl9kYXRhX3B0cgotKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmIC8qIExPQ19BUElfUlBDX0dMVUVfSCAqLwpkaWZmIC0tZ2l0IGEvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGktcnBjLTUwMDAxL2xpYmxvY19hcGktcnBjLWdsdWUvcnBjX2luYy9sb2NfYXBpX3N5bmNfY2FsbC5oIGIvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGktcnBjLTUwMDAxL2xpYmxvY19hcGktcnBjLWdsdWUvcnBjX2luYy9sb2NfYXBpX3N5bmNfY2FsbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzIwOGJkLi4wMDAwMDAwCi0tLSBhL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpLXJwYy01MDAwMS9saWJsb2NfYXBpLXJwYy1nbHVlL3JwY19pbmMvbG9jX2FwaV9zeW5jX2NhbGwuaAorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMSwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKLSAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAotICogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAotICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgotICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCi0gKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQotICogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgotICogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2lmbmRlZiBMT0NfQVBJX0NCX1NZTkNfSAotI2RlZmluZSBMT0NfQVBJX0NCX1NZTkNfSAotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLXsKLSNlbmRpZgotI2luY2x1ZGUgImxvY19hcGlfcnBjX2dsdWUuaCIKLSNkZWZpbmUgTE9DX1NZTkNfQ0FMTF9TTE9UU19NQVggOAotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICBwdGhyZWFkX211dGV4X3QgICAgICAgICAgICAgICAgbG9jazsKLQotICAgLyogQ2xpZW50IElEICovCi0gICBycGNfbG9jX2NsaWVudF9oYW5kbGVfdHlwZSAgICAgbG9jX2hhbmRsZTsKLQotICAgLyogQ2FsbGJhY2sgd2FpdGluZyBjb25kaXRpb25hbCB2YXJpYWJsZSAqLwotICAgcHRocmVhZF9jb25kX3QgICAgICAgICAgICAgICAgIGxvY19jYl9hcnJpdmVkX2NvbmQ7Ci0KLSAgIC8qIENhbGxiYWNrIHdhaXRpbmcgZGF0YSBibG9jaywgcHJvdGVjdGVkIGJ5IGxvY19jYl9kYXRhX211dGV4ICovCi0gICBib29sZWFuICAgICAgICAgICAgICAgICAgICAgICAgaW5fdXNlOwotICAgYm9vbGVhbiAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hbF9zZW50OwotICAgYm9vbGVhbiAgICAgICAgICAgICAgICAgICAgICAgIG5vdF9hdmFpbGFibGU7Ci0gICBycGNfbG9jX2V2ZW50X21hc2tfdHlwZSAgICAgICAgbG9jX2NiX3dhaXRfZXZlbnRfbWFzazsgICAgICAgIC8qIGV2ZW50IHRvIHdhaXQgZm9yICovCi0gICBycGNfbG9jX2lvY3RsX2VfdHlwZSAgICAgICAgICAgaW9jdGxfdHlwZTsgICAgICAgICAgICAgICAgICAgIC8qIGlvY3RsIHRvIHdhaXQgZm9yICovCi0gICBycGNfbG9jX2V2ZW50X3BheWxvYWRfdV90eXBlICAgbG9jX2NiX3JlY2VpdmVkX3BheWxvYWQ7ICAgICAgIC8qIHJlY2VpdmVkIHBheWxvYWQgKi8KLSAgIHJwY19sb2NfZXZlbnRfbWFza190eXBlICAgICAgICBsb2NfY2JfcmVjZWl2ZWRfZXZlbnRfbWFzazsgICAgLyogcmVjZWl2ZWQgZXZlbnQgICAqLwotfSBsb2Nfc3luY19jYWxsX3Nsb3Rfc190eXBlOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX29mX3Nsb3RzOwotICAgbG9jX3N5bmNfY2FsbF9zbG90X3NfdHlwZSAgICAgIHNsb3RzW0xPQ19TWU5DX0NBTExfU0xPVFNfTUFYXTsKLX0gbG9jX3N5bmNfY2FsbF9zbG90X2FycmF5X3NfdHlwZTsKLQotLyogSW5pdCBmdW5jdGlvbiAqLwotdm9pZCBsb2NfYXBpX3N5bmNfY2FsbF9pbml0KCk7Ci0KLS8qIERlc3Ryb3kgZnVuY3Rpb24gKi8KLXZvaWQgbG9jX2FwaV9zeW5jX2NhbGxfZGVzdHJveSgpOwotCi0vKiBQcm9jZXNzIExvYyBBUEkgY2FsbGJhY2tzIHRvIHdha2UgdXAgYmxvY2tlZCB1c2VyIHRocmVhZHMgKi8KLXZvaWQgbG9jX2FwaV9jYWxsYmFja19wcm9jZXNzX3N5bmNfY2FsbCgKLSAgICAgIHJwY19sb2NfY2xpZW50X2hhbmRsZV90eXBlICAgICAgICAgICAgbG9jX2hhbmRsZSwgICAgICAgICAgICAgLyogaGFuZGxlIG9mIHRoZSBjbGllbnQgKi8KLSAgICAgIHJwY19sb2NfZXZlbnRfbWFza190eXBlICAgICAgICAgICAgICAgbG9jX2V2ZW50LCAgICAgICAgICAgICAgLyogZXZlbnQgbWFzayAgICAgICAgICAgKi8KLSAgICAgIGNvbnN0IHJwY19sb2NfZXZlbnRfcGF5bG9hZF91X3R5cGUqICAgbG9jX2V2ZW50X3BheWxvYWQgICAgICAgLyogcGF5bG9hZCAgICAgICAgICAgICAgKi8KLSk7Ci0KLS8qIFJlZW50cmFudCBzeW5jaHJvbm91cyBJT0NUTCBjYWxsLCB1c2luZyBMb2MgQVBJIHJldHVybiBjb2RlICovCi1pbnQgbG9jX2FwaV9zeW5jX2lvY3RsCi0oCi0gICAgICBycGNfbG9jX2NsaWVudF9oYW5kbGVfdHlwZSAgICAgICAgICAgaGFuZGxlLAotICAgICAgcnBjX2xvY19pb2N0bF9lX3R5cGUgICAgICAgICAgICAgICAgIGlvY3RsX3R5cGUsCi0gICAgICBycGNfbG9jX2lvY3RsX2RhdGFfdV90eXBlKiAgICAgICAgICAgaW9jdGxfZGF0YV9wdHIsCi0gICAgICB1aW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dF9tc2VjLAotICAgICAgcnBjX2xvY19pb2N0bF9jYWxsYmFja19zX3R5cGUgICAgICAgKmNiX2RhdGFfcHRyCi0pOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYgLyogTE9DX0FQSV9DQl9TWU5DX0ggKi8KZGlmZiAtLWdpdCBhL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpLXJwYy01MDAwMS9saWJsb2NfYXBpLXJwYy1nbHVlL3JwY19pbmMvbG9jX2FwaWNiX2FwcGluaXQuaCBiL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpLXJwYy01MDAwMS9saWJsb2NfYXBpLXJwYy1nbHVlL3JwY19pbmMvbG9jX2FwaWNiX2FwcGluaXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE0MWQwOC4uMDAwMDAwMAotLS0gYS9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaS1ycGMtNTAwMDEvbGlibG9jX2FwaS1ycGMtZ2x1ZS9ycGNfaW5jL2xvY19hcGljYl9hcHBpbml0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTEsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCi0gKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKLSAqICAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKLSAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAotICogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKLSAqIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KLSAqIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpZm5kZWYgTE9DX0FQSUNCX0FQUElOSVRfSAotI2RlZmluZSBMT0NfQVBJQ0JfQVBQSU5JVF9ICi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotewotI2VuZGlmCi0KLSAvKiBJbml0aWFsaXphdGlvbiBmdW5jdGlvbiBmb3IgY2FsbGJhY2tzICovCi1leHRlcm4gaW50IGxvY19hcGljYl9hcHBfaW5pdCgpOwotZXh0ZXJuIHZvaWQgbG9jX2FwaWNiX2FwcF9kZWluaXQoKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmIC8qIExPQ19BUElDQl9BUFBJTklUX0ggKi8KZGlmZiAtLWdpdCBhL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpLXJwYy01MDAwMS9saWJsb2NfYXBpLXJwYy1nbHVlL3NyYy9Mb2NBcGlScGMuY3BwIGIvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGktcnBjLTUwMDAxL2xpYmxvY19hcGktcnBjLWdsdWUvc3JjL0xvY0FwaVJwYy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3ZDZiN2MuLjAwMDAwMDAKLS0tIGEvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGktcnBjLTUwMDAxL2xpYmxvY19hcGktcnBjLWdsdWUvc3JjL0xvY0FwaVJwYy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYxICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMS0yMDE0LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZwotICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCi0gKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uLCBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAotICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgotICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCi0gKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQotICogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgotICogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0jZGVmaW5lIExPR19ORERFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiTG9jU3ZjX2FwaV9ycGMiCi0KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxtYXRoLmg+Ci0jaWZuZGVmIFVTRV9HTElCCi0jaW5jbHVkZSA8dXRpbHMvU3lzdGVtQ2xvY2suaD4KLSNlbmRpZiAvKiBVU0VfR0xJQiAqLwotI2luY2x1ZGUgPExvY0FwaVJwYy5oPgotI2luY2x1ZGUgPExvY0FkYXB0ZXJCYXNlLmg+Ci0jaW5jbHVkZSA8bG9jX2FwaV9maXh1cC5oPgotI2luY2x1ZGUgPGxvY19hcGlfcnBjX2dsdWUuaD4KLSNpbmNsdWRlIDxsb2dfdXRpbC5oPgotI2luY2x1ZGUgPGxvY19sb2cuaD4KLSNpbmNsdWRlIDxsb2NfYXBpX2xvZy5oPgotI2lmZGVmIFVTRV9HTElCCi0jaW5jbHVkZSA8Z2xpYi5oPgotI2VuZGlmCi0jaW5jbHVkZSA8bGlicnBjLmg+Ci0jaW5jbHVkZSA8cGxhdGZvcm1fbGliX2luY2x1ZGVzLmg+Ci0KLXVzaW5nIG5hbWVzcGFjZSBsb2NfY29yZTsKLQotI2RlZmluZSBMT0NfWFRSQV9JTkpFQ1RfREVGQVVMVF9USU1FT1VUICgzMTAwKQotI2RlZmluZSBYVFJBX0JMT0NLX1NJWkUgICAgICAgICAgICAgICAgICgzMDcyKQotI2RlZmluZSBMT0NfSU9DVExfREVGQVVMVF9USU1FT1VUIDEwMDAgLy8gMTAwMCBtaWxsaS1zZWNvbmRzCi0jZGVmaW5lIExPQ19OSV9OT1RJRl9LRVlfQUREUkVTUyAgICAgICAgICAgIkFkZHJlc3MiCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1GVU5DVElPTiAgICBsb2NfZXZlbnRfY2IKLQotREVTQ1JJUFRJT04KLSAgIFRoaXMgaXMgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHJlZ2lzdGVyZWQgYnkgbG9jX29wZW4uCi0KLURFUEVOREVOQ0lFUwotICAgTi9BCi0KLVJFVFVSTiBWQUxVRQotICAgUlBDX0xPQ19BUElfU1VDQ0VTUwotCi1TSURFIEVGRkVDVFMKLSAgIE4vQQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotc3RhdGljIGludDMyIGxvY19ldmVudF9jYgotKAotICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLAotICAgIHJwY19sb2NfY2xpZW50X2hhbmRsZV90eXBlICAgICAgICAgICBjbGllbnRfaGFuZGxlLAotICAgIHJwY19sb2NfZXZlbnRfbWFza190eXBlICAgICAgICAgICAgICBsb2NfZXZlbnQsCi0gICAgY29uc3QgcnBjX2xvY19ldmVudF9wYXlsb2FkX3VfdHlwZSogIGxvY19ldmVudF9wYXlsb2FkCi0pCi17Ci0gICAgTU9ERU1fTE9HX0NBTExGTE9XKCVzLCBsb2NfZ2V0X2V2ZW50X25hbWUobG9jX2V2ZW50KSk7Ci0gICAgbG9jX2NhbGxiYWNrX2xvZyhsb2NfZXZlbnQsIGxvY19ldmVudF9wYXlsb2FkKTsKLSAgICBpbnQzMiByZXRfdmFsID0gKChMb2NBcGlScGMqKXVzZXIpLT5sb2NFdmVudENCKGNsaWVudF9oYW5kbGUsIGxvY19ldmVudCwgbG9jX2V2ZW50X3BheWxvYWQpOwotICAgIEVYSVRfTE9HKCVkLCByZXRfdmFsKTsKLSAgICByZXR1cm4gcmV0X3ZhbDsKLX0KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLUZVTkNUSU9OICAgIGxvY19lbmdfcnBjX2dsb2JhbF9jYgotCi1ERVNDUklQVElPTgotICAgVGhpcyBpcyB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gcmVnaXN0ZXJlZCBieSBsb2Nfb3BlbiBmb3IgUlBDIGdsb2JhbCBldmVudHMKLQotREVQRU5ERU5DSUVTCi0gICBOL0EKLQotUkVUVVJOIFZBTFVFCi0gICBSUENfTE9DX0FQSV9TVUNDRVNTCi0KLVNJREUgRUZGRUNUUwotICAgTi9BCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi1zdGF0aWMgdm9pZCBsb2NfcnBjX2dsb2JhbF9jYih2b2lkKiB1c2VyLCBDTElFTlQqIGNsbnQsIGVudW0gcnBjX3Jlc2V0X2V2ZW50IGV2ZW50KQotewotICAgIE1PREVNX0xPR19DQUxMRkxPVyglcywgbG9jX2dldF9ycGNfcmVzZXRfZXZlbnRfbmFtZShldmVudCkpOwotICAgICgoTG9jQXBpUnBjKil1c2VyKS0+bG9jUnBjR2xvYmFsQ0IoY2xudCwgZXZlbnQpOwotICAgIEVYSVRfTE9HKCVwLCBWT0lEX1JFVCk7Ci19Ci0KLWNvbnN0IExPQ19BUElfQURBUFRFUl9FVkVOVF9NQVNLX1QgTG9jQXBpUnBjOjptYXNrQWxsID0KLSAgICBMT0NfQVBJX0FEQVBURVJfQklUX1BBUlNFRF9QT1NJVElPTl9SRVBPUlQgfAotICAgIExPQ19BUElfQURBUFRFUl9CSVRfU0FURUxMSVRFX1JFUE9SVCB8Ci0gICAgTE9DX0FQSV9BREFQVEVSX0JJVF9MT0NBVElPTl9TRVJWRVJfUkVRVUVTVCB8Ci0gICAgTE9DX0FQSV9BREFQVEVSX0JJVF9BU1NJU1RBTkNFX0RBVEFfUkVRVUVTVCB8Ci0gICAgTE9DX0FQSV9BREFQVEVSX0JJVF9JT0NUTF9SRVBPUlQgfAotICAgIExPQ19BUElfQURBUFRFUl9CSVRfU1RBVFVTX1JFUE9SVCB8Ci0gICAgTE9DX0FQSV9BREFQVEVSX0JJVF9OTUVBXzFIWl9SRVBPUlQgfAotICAgIExPQ19BUElfQURBUFRFUl9CSVRfTklfTk9USUZZX1ZFUklGWV9SRVFVRVNUOwotCi1jb25zdCBycGNfbG9jX2V2ZW50X21hc2tfdHlwZSBMb2NBcGlScGM6OmxvY0JpdHNbXSA9Ci17Ci0gICAgUlBDX0xPQ19FVkVOVF9QQVJTRURfUE9TSVRJT05fUkVQT1JULAotICAgIFJQQ19MT0NfRVZFTlRfU0FURUxMSVRFX1JFUE9SVCwKLSAgICBSUENfTE9DX0VWRU5UX05NRUFfMUhaX1JFUE9SVCwKLSAgICBSUENfTE9DX0VWRU5UX05NRUFfUE9TSVRJT05fUkVQT1JULAotICAgIFJQQ19MT0NfRVZFTlRfTklfTk9USUZZX1ZFUklGWV9SRVFVRVNULAotICAgIFJQQ19MT0NfRVZFTlRfQVNTSVNUQU5DRV9EQVRBX1JFUVVFU1QsCi0gICAgUlBDX0xPQ19FVkVOVF9MT0NBVElPTl9TRVJWRVJfUkVRVUVTVCwKLSAgICBSUENfTE9DX0VWRU5UX0lPQ1RMX1JFUE9SVCwKLSAgICBSUENfTE9DX0VWRU5UX1NUQVRVU19SRVBPUlQsCi0gICAgUlBDX0xPQ19FVkVOVF9XUFNfTkVFREVEX1JFUVVFU1QKLX07Ci0KLS8vIGNvbnN0cnVjdG9yCi1Mb2NBcGlScGM6OkxvY0FwaVJwYyhjb25zdCBNc2dUYXNrKiBtc2dUYXNrLAotICAgICAgICAgICAgICAgICAgICAgTE9DX0FQSV9BREFQVEVSX0VWRU5UX01BU0tfVCBleE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICBDb250ZXh0QmFzZSogY29udGV4dCkgOgotICAgIExvY0FwaUJhc2UobXNnVGFzaywgZXhNYXNrLCBjb250ZXh0KSwKLSAgICBjbGllbnRfaGFuZGxlKFJQQ19MT0NfQ0xJRU5UX0hBTkRMRV9JTlZBTElEKSwKLSAgICBkYXRhRW5hYmxlTGFzdFNldCgtMSkKLXsKLSAgICBtZW1zZXQoYXBuTGFzdFNldCwgMCwgc2l6ZW9mKGFwbkxhc3RTZXQpKTsKLSAgICBsb2NfYXBpX2dsdWVfaW5pdCgpOwotfQotCi1Mb2NBcGlScGM6On5Mb2NBcGlScGMoKQotewotICAgIGNsb3NlKCk7Ci19Ci0KLXJwY19sb2NfZXZlbnRfbWFza190eXBlCi1Mb2NBcGlScGM6OmNvbnZlcnRNYXNrKExPQ19BUElfQURBUFRFUl9FVkVOVF9NQVNLX1QgbWFzaykKLXsKLSAgICBycGNfbG9jX2V2ZW50X21hc2tfdHlwZSBuZXdNYXNrID0gMDsKLQotICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwLCBiaXQ9MTsgMCAhPSBtYXNrOyBpKyssIGJpdDw8PTEpIHsKLSAgICAgICAgaWYgKG1hc2sgJiBiaXQpIHsKLSAgICAgICAgICAgIG5ld01hc2sgfD0gbG9jQml0c1tpXTsKLSAgICAgICAgICAgIG1hc2sgXj0gYml0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIG5ld01hc2s7Ci19Ci0KLXJwY19sb2NfbG9ja19lX3R5cGUKLUxvY0FwaVJwYzo6Y29udmVydEdwc0xvY2tNYXNrKExPQ19HUFNfTE9DS19NQVNLIGxvY2tNYXNrKQotewotICAgIGlmIChpc0dwc0xvY2tBbGwobG9ja01hc2spKQotICAgICAgICByZXR1cm4gUlBDX0xPQ19MT0NLX0FMTDsKLSAgICBpZiAoaXNHcHNMb2NrTU8obG9ja01hc2spKQotICAgICAgICByZXR1cm4gUlBDX0xPQ19MT0NLX01JOwotICAgIGlmIChpc0dwc0xvY2tNVChsb2NrTWFzaykpCi0gICAgICAgIHJldHVybiBSUENfTE9DX0xPQ0tfTVQ7Ci0gICAgaWYgKGlzR3BzTG9ja05vbmUobG9ja01hc2spKQotICAgICAgICByZXR1cm4gUlBDX0xPQ19MT0NLX05PTkU7Ci0gICAgcmV0dXJuIChycGNfbG9jX2xvY2tfZV90eXBlKWxvY2tNYXNrOwotfQotCi1lbnVtIGxvY19hcGlfYWRhcHRlcl9lcnIKLUxvY0FwaVJwYzo6Y29udmVydEVycihpbnQgcnBjRXJyKQotewotICAgIHN3aXRjaChycGNFcnIpCi0gICAgewotICAgIGNhc2UgUlBDX0xPQ19BUElfU1VDQ0VTUzoKLSAgICAgICAgcmV0dXJuIExPQ19BUElfQURBUFRFUl9FUlJfU1VDQ0VTUzsKLSAgICBjYXNlIFJQQ19MT0NfQVBJX0dFTkVSQUxfRkFJTFVSRToKLSAgICAgICAgcmV0dXJuIExPQ19BUElfQURBUFRFUl9FUlJfR0VORVJBTF9GQUlMVVJFOwotICAgIGNhc2UgUlBDX0xPQ19BUElfVU5TVVBQT1JURUQ6Ci0gICAgICAgIHJldHVybiBMT0NfQVBJX0FEQVBURVJfRVJSX1VOU1VQUE9SVEVEOwotICAgIGNhc2UgUlBDX0xPQ19BUElfSU5WQUxJRF9IQU5ETEU6Ci0gICAgICAgIHJldHVybiBMT0NfQVBJX0FEQVBURVJfRVJSX0lOVkFMSURfSEFORExFOwotICAgIGNhc2UgUlBDX0xPQ19BUElfSU5WQUxJRF9QQVJBTUVURVI6Ci0gICAgICAgIHJldHVybiBMT0NfQVBJX0FEQVBURVJfRVJSX0lOVkFMSURfUEFSQU1FVEVSOwotICAgIGNhc2UgUlBDX0xPQ19BUElfRU5HSU5FX0JVU1k6Ci0gICAgICAgIHJldHVybiBMT0NfQVBJX0FEQVBURVJfRVJSX0VOR0lORV9CVVNZOwotICAgIGNhc2UgUlBDX0xPQ19BUElfUEhPTkVfT0ZGTElORToKLSAgICAgICAgcmV0dXJuIExPQ19BUElfQURBUFRFUl9FUlJfUEhPTkVfT0ZGTElORTsKLSAgICBjYXNlIFJQQ19MT0NfQVBJX1RJTUVPVVQ6Ci0gICAgICAgIHJldHVybiBMT0NfQVBJX0FEQVBURVJfRVJSX1RJTUVPVVQ7Ci0gICAgY2FzZSBSUENfTE9DX0FQSV9SUENfTU9ERU1fUkVTVEFSVDoKLSAgICAgICAgcmV0dXJuIExPQ19BUElfQURBUFRFUl9FUlJfRU5HSU5FX0RPV047Ci0gICAgY2FzZSBSUENfTE9DX0FQSV9SUENfRkFJTFVSRToKLSAgICAgICAgcmV0dXJuIExPQ19BUElfQURBUFRFUl9FUlJfRkFJTFVSRTsKLSAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gTE9DX0FQSV9BREFQVEVSX0VSUl9VTktOT1dOOwotICAgIH0KLX0KLQotdm9pZCBMb2NBcGlScGM6OmxvY1JwY0dsb2JhbENCKENMSUVOVCogY2xudCwgZW51bSBycGNfcmVzZXRfZXZlbnQgZXZlbnQpCi17Ci0gICAgc3RhdGljIHJwY19sb2NfZW5naW5lX3N0YXRlX2VfdHlwZSBsYXN0X3N0YXRlID0gUlBDX0xPQ19FTkdJTkVfU1RBVEVfTUFYOwotCi0gICAgc3dpdGNoIChldmVudCkgewotICAgIGNhc2UgUlBDX1NVQlNZU1RFTV9SRVNUQVJUX0JFR0lOOgotICAgICAgICBpZiAoUlBDX0xPQ19FTkdJTkVfU1RBVEVfT0ZGICE9IGxhc3Rfc3RhdGUpIHsKLSAgICAgICAgICAgIGxhc3Rfc3RhdGUgPSBSUENfTE9DX0VOR0lORV9TVEFURV9PRkY7Ci0gICAgICAgICAgICBoYW5kbGVFbmdpbmVEb3duRXZlbnQoKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBjYXNlIFJQQ19TVUJTWVNURU1fUkVTVEFSVF9FTkQ6Ci0gICAgICAgIGlmIChSUENfTE9DX0VOR0lORV9TVEFURV9PTiAhPSBsYXN0X3N0YXRlKSB7Ci0gICAgICAgICAgICBsYXN0X3N0YXRlID0gUlBDX0xPQ19FTkdJTkVfU1RBVEVfT047Ci0gICAgICAgICAgICBoYW5kbGVFbmdpbmVVcEV2ZW50KCk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi1pbnQzMiBMb2NBcGlScGM6OmxvY0V2ZW50Q0IocnBjX2xvY19jbGllbnRfaGFuZGxlX3R5cGUgY2xpZW50X2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgIHJwY19sb2NfZXZlbnRfbWFza190eXBlIGxvY19ldmVudCwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJwY19sb2NfZXZlbnRfcGF5bG9hZF91X3R5cGUqIGxvY19ldmVudF9wYXlsb2FkKQotewotICAgIC8vIFBhcnNlZCByZXBvcnQKLSAgICBpZiAobG9jX2V2ZW50ICYgUlBDX0xPQ19FVkVOVF9QQVJTRURfUE9TSVRJT05fUkVQT1JUKQotICAgIHsKLSAgICAgICAgcmVwb3J0UG9zaXRpb24oJmxvY19ldmVudF9wYXlsb2FkLT5ycGNfbG9jX2V2ZW50X3BheWxvYWRfdV90eXBlX3UuCi0gICAgICAgICAgICAgICAgICAgICAgIHBhcnNlZF9sb2NhdGlvbl9yZXBvcnQpOwotICAgIH0KLQotICAgIC8vIFNhdGVsbGl0ZSByZXBvcnQKLSAgICBpZiAobG9jX2V2ZW50ICYgUlBDX0xPQ19FVkVOVF9TQVRFTExJVEVfUkVQT1JUKQotICAgIHsKLSAgICAgICAgcmVwb3J0U3YoJmxvY19ldmVudF9wYXlsb2FkLT5ycGNfbG9jX2V2ZW50X3BheWxvYWRfdV90eXBlX3UuZ25zc19yZXBvcnQpOwotICAgIH0KLQotICAgIC8vIFN0YXR1cyByZXBvcnQKLSAgICBpZiAobG9jX2V2ZW50ICYgUlBDX0xPQ19FVkVOVF9TVEFUVVNfUkVQT1JUKQotICAgIHsKLSAgICAgICAgcmVwb3J0U3RhdHVzKCZsb2NfZXZlbnRfcGF5bG9hZC0+cnBjX2xvY19ldmVudF9wYXlsb2FkX3VfdHlwZV91LnN0YXR1c19yZXBvcnQpOwotICAgIH0KLQotICAgIC8vIE5NRUEKLSAgICBpZiAobG9jX2V2ZW50ICYgUlBDX0xPQ19FVkVOVF9OTUVBXzFIWl9SRVBPUlQpCi0gICAgewotICAgICAgICByZXBvcnRObWVhKCYobG9jX2V2ZW50X3BheWxvYWQtPnJwY19sb2NfZXZlbnRfcGF5bG9hZF91X3R5cGVfdS5ubWVhX3JlcG9ydCkpOwotICAgIH0KLSAgICAvLyBYVFJBIHN1cHBvcnQ6IHN1cHBvcnRzIG9ubHkgWFRSQSBkb3dubG9hZAotICAgIGlmIChsb2NfZXZlbnQgJiBSUENfTE9DX0VWRU5UX0FTU0lTVEFOQ0VfREFUQV9SRVFVRVNUKQotICAgIHsKLSAgICAgICAgaWYgKGxvY19ldmVudF9wYXlsb2FkLT5ycGNfbG9jX2V2ZW50X3BheWxvYWRfdV90eXBlX3UuYXNzaXN0X2RhdGFfcmVxdWVzdC5ldmVudCA9PQotICAgICAgICAgICAgUlBDX0xPQ19BU1NJU1RfREFUQV9QUkVESUNURURfT1JCSVRTX1JFUSkKLSAgICAgICAgewotICAgICAgICAgICAgcmVxdWVzdFh0cmFEYXRhKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAobG9jX2V2ZW50X3BheWxvYWQtPnJwY19sb2NfZXZlbnRfcGF5bG9hZF91X3R5cGVfdS5hc3Npc3RfZGF0YV9yZXF1ZXN0LmV2ZW50ID09Ci0gICAgICAgICAgICAgICAgICAgUlBDX0xPQ19BU1NJU1RfREFUQV9USU1FX1JFUSkKLSAgICAgICAgewotICAgICAgICAgICAgcmVxdWVzdFRpbWUoKTsKLSAgICAgICAgfSBlbHNlIGlmIChsb2NfZXZlbnRfcGF5bG9hZC0+cnBjX2xvY19ldmVudF9wYXlsb2FkX3VfdHlwZV91LmFzc2lzdF9kYXRhX3JlcXVlc3QuZXZlbnQgPT0KLSAgICAgICAgICAgICAgICAgICBSUENfTE9DX0FTU0lTVF9EQVRBX1BPU0lUSU9OX0lOSkVDVElPTl9SRVEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlcXVlc3RMb2NhdGlvbigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gQUdQUyBkYXRhIHJlcXVlc3QKLSAgICBpZiAobG9jX2V2ZW50ICYgUlBDX0xPQ19FVkVOVF9MT0NBVElPTl9TRVJWRVJfUkVRVUVTVCkKLSAgICB7Ci0gICAgICAgIEFUTEV2ZW50KCZsb2NfZXZlbnRfcGF5bG9hZC0+cnBjX2xvY19ldmVudF9wYXlsb2FkX3VfdHlwZV91LgotICAgICAgICAgICAgICAgICBsb2Nfc2VydmVyX3JlcXVlc3QpOwotICAgIH0KLQotICAgIC8vIE5JIG5vdGlmeSByZXF1ZXN0Ci0gICAgaWYgKGxvY19ldmVudCAmIFJQQ19MT0NfRVZFTlRfTklfTk9USUZZX1ZFUklGWV9SRVFVRVNUKQotICAgIHsKLSAgICAgICAgTklFdmVudCgmbG9jX2V2ZW50X3BheWxvYWQtPnJwY19sb2NfZXZlbnRfcGF5bG9hZF91X3R5cGVfdS5uaV9yZXF1ZXN0KTsKLSAgICB9Ci0KLSAgICByZXR1cm4gUlBDX0xPQ19BUElfU1VDQ0VTUzsvL1dlIHNpbXBseSB3YW50IHRvIHJldHVybiBzdWNlc3MgaGVyZSBhcyB3ZSBkbyBub3Qgd2FudCB0bwotICAgIC8vIGNhdXNlIGFueSBpc3N1ZXMgaW4gUlBDIHRocmVhZCBjb250ZXh0Ci19Ci0KLWVudW0gbG9jX2FwaV9hZGFwdGVyX2VycgotTG9jQXBpUnBjOjpvcGVuKExPQ19BUElfQURBUFRFUl9FVkVOVF9NQVNLX1QgbWFzaykKLXsKLSAgICBlbnVtIGxvY19hcGlfYWRhcHRlcl9lcnIgcmV0X3ZhbCA9IExPQ19BUElfQURBUFRFUl9FUlJfU1VDQ0VTUzsKLQotICAgIC8vIFJQQyBkb2VzIG5vdCBkeW5hbWljYWxseSB1cGRhdGUgdGhlIGV2ZW50IG1hc2suIEFuZCBpbiB0aGUKLSAgICAvLyBjYXNlIG9mIFJQQywgYWxsIHdlIHN1cHBvcnQgYXJlIHBvc2l0aW9uaW5nIChncHMgKyBhZ3BzKQotICAgIC8vIG1hc2tzIGFueXdheXMsIHNvIHdlIHNpbXBseSBtYXNrIGFsbCBvZiB0aGVtIG9uIGFsd2F5cy4KLSAgICAvLyBBZnRlciBkb2luZyBzbyB0aGUgZmlyc3QgdGltZSBpbiBhIHBvd2VyIGN5Y2xlLCB3ZSBrbm93IHRoZXJlCi0gICAgLy8gd2lsbCB0aGUgZm9sbG93aW5nIGlmIGNvbmRpdGlvbiB3aWxsIG5ldmVyIGJlIHRydWUgYW55IG1vcmUuCi0gICAgbWFzayA9IG1hc2tBbGw7Ci0KLSAgICBpZiAobWFzayAhPSBtTWFzaykgewotICAgICAgICBpZiAoUlBDX0xPQ19DTElFTlRfSEFORExFX0lOVkFMSUQgIT0gY2xpZW50X2hhbmRsZSkgewotICAgICAgICAgICAgY2xvc2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1NYXNrID0gbWFzazsKLSAgICAgICAgLy8gaXQgaXMgaW1wb3J0YW50IHRvIGNhcCB0aGUgbWFzayBoZXJlLCBiZWNhdXNlIG5vdCBhbGwgTG9jQXBpJ3MKLSAgICAgICAgLy8gY2FuIGVuYWJsZSB0aGUgc2FtZSBiaXRzLCBlLmcuIGZvcmVncm91bmQgYW5kIGJja2dyb3VuZC4KLSAgICAgICAgY2xpZW50X2hhbmRsZSA9IGxvY19vcGVuKGNvbnZlcnRNYXNrKG1hc2spLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jX2V2ZW50X2NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jX3JwY19nbG9iYWxfY2IsIHRoaXMpOwotCi0gICAgICAgIGlmIChjbGllbnRfaGFuZGxlIDwgMCkgewotICAgICAgICAgICAgbU1hc2sgPSAwOwotICAgICAgICAgICAgY2xpZW50X2hhbmRsZSA9IFJQQ19MT0NfQ0xJRU5UX0hBTkRMRV9JTlZBTElEOwotICAgICAgICAgICAgcmV0X3ZhbCA9IExPQ19BUElfQURBUFRFUl9FUlJfSU5WQUxJRF9IQU5ETEU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gcmV0X3ZhbDsKLX0KLQotZW51bSBsb2NfYXBpX2FkYXB0ZXJfZXJyCi1Mb2NBcGlScGM6OmNsb3NlKCkKLXsKLSAgICBpZiAoUlBDX0xPQ19DTElFTlRfSEFORExFX0lOVkFMSUQgIT0gY2xpZW50X2hhbmRsZSkgewotICAgICAgICBsb2NfY2xlYXIoY2xpZW50X2hhbmRsZSk7Ci0gICAgfQotCi0gICAgbG9jX2Nsb3NlKGNsaWVudF9oYW5kbGUpOwotICAgIG1NYXNrID0gMDsKLSAgICBjbGllbnRfaGFuZGxlID0gUlBDX0xPQ19DTElFTlRfSEFORExFX0lOVkFMSUQ7Ci0KLSAgICByZXR1cm4gTE9DX0FQSV9BREFQVEVSX0VSUl9TVUNDRVNTOwotfQotCi1lbnVtIGxvY19hcGlfYWRhcHRlcl9lcnIKLUxvY0FwaVJwYzo6c3RhcnRGaXgoY29uc3QgTG9jUG9zTW9kZSYgcG9zTW9kZSkgewotICAgTE9DX0xPR0QoIkxvY0FwaVJwYzo6c3RhcnRGaXgoKSBjYWxsZWQiKTsKLSAgIHJldHVybiBjb252ZXJ0RXJyKAotICAgICAgIGxvY19zdGFydF9maXgoY2xpZW50X2hhbmRsZSkKLSAgICAgICApOwotfQotCi1lbnVtIGxvY19hcGlfYWRhcHRlcl9lcnIKLUxvY0FwaVJwYzo6c3RvcEZpeCgpIHsKLSAgIExPQ19MT0dEKCJMb2NBcGlScGM6OnN0b3BGaXgoKSBjYWxsZWQiKTsKLSAgIHJldHVybiBjb252ZXJ0RXJyKAotICAgICAgIGxvY19zdG9wX2ZpeChjbGllbnRfaGFuZGxlKQotICAgICAgICk7Ci19Ci0KLWVudW0gbG9jX2FwaV9hZGFwdGVyX2VycgotTG9jQXBpUnBjOjpzZXRQb3NpdGlvbk1vZGUoY29uc3QgTG9jUG9zTW9kZSYgcG9zTW9kZSkKLXsKLSAgICBycGNfbG9jX2lvY3RsX2RhdGFfdV90eXBlICAgIGlvY3RsX2RhdGE7Ci0gICAgcnBjX2xvY19maXhfY3JpdGVyaWFfc190eXBlICpmaXhfY3JpdGVyaWFfcHRyID0KLSAgICAgICAgJmlvY3RsX2RhdGEucnBjX2xvY19pb2N0bF9kYXRhX3VfdHlwZV91LmZpeF9jcml0ZXJpYTsKLSAgICBycGNfbG9jX2lvY3RsX2VfdHlwZSAgICAgICAgIGlvY3RsX3R5cGUgPSBSUENfTE9DX0lPQ1RMX1NFVF9GSVhfQ1JJVEVSSUE7Ci0gICAgcnBjX2xvY19vcGVyYXRpb25fbW9kZV9lX3R5cGUgb3BfbW9kZTsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgIHJldF92YWw7Ci0gICAgY29uc3QgTG9jUG9zTW9kZSogZml4Q3JpdGVyaWEgPSAmcG9zTW9kZTsKLQotICAgIEFMT0dEICgibG9jX2VuZ19zZXRfcG9zaXRpb24gbW9kZSwgY2xpZW50ID0gJWQsIGludGVydmFsID0gJWQsIG1vZGUgPSAlZFxuIiwKLSAgICAgICAgICAoaW50MzIpIGNsaWVudF9oYW5kbGUsIGZpeENyaXRlcmlhLT5taW5faW50ZXJ2YWwsIGZpeENyaXRlcmlhLT5tb2RlKTsKLQotICAgIHN3aXRjaCAoZml4Q3JpdGVyaWEtPm1vZGUpCi0gICAgewotICAgIGNhc2UgTE9DX1BPU0lUSU9OX01PREVfTVNfQkFTRUQ6Ci0gICAgICAgIG9wX21vZGUgPSBSUENfTE9DX09QRVJfTU9ERV9NU0I7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTE9DX1BPU0lUSU9OX01PREVfTVNfQVNTSVNURUQ6Ci0gICAgICAgIG9wX21vZGUgPSBSUENfTE9DX09QRVJfTU9ERV9NU0E7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTE9DX1BPU0lUSU9OX01PREVfUkVTRVJWRURfMToKLSAgICAgICAgb3BfbW9kZSA9IFJQQ19MT0NfT1BFUl9NT0RFX1NQRUVEX09QVElNQUw7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTE9DX1BPU0lUSU9OX01PREVfUkVTRVJWRURfMjoKLSAgICAgICAgb3BfbW9kZSA9IFJQQ19MT0NfT1BFUl9NT0RFX0FDQ1VSQUNZX09QVElNQUw7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTE9DX1BPU0lUSU9OX01PREVfUkVTRVJWRURfMzoKLSAgICAgICAgb3BfbW9kZSA9IFJQQ19MT0NfT1BFUl9NT0RFX0RBVEFfT1BUSU1BTDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBMT0NfUE9TSVRJT05fTU9ERV9SRVNFUlZFRF80OgotICAgIGNhc2UgTE9DX1BPU0lUSU9OX01PREVfUkVTRVJWRURfNToKLSAgICAgICAgb3BfbW9kZSA9IFJQQ19MT0NfT1BFUl9NT0RFX01TQTsKLSAgICAgICAgZml4X2NyaXRlcmlhX3B0ci0+cHJlZmVycmVkX3Jlc3BvbnNlX3RpbWUgID0gMDsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgb3BfbW9kZSA9IFJQQ19MT0NfT1BFUl9NT0RFX1NUQU5EQUxPTkU7Ci0gICAgfQotCi0gICAgZml4X2NyaXRlcmlhX3B0ci0+dmFsaWRfbWFzayA9IFJQQ19MT0NfRklYX0NSSVRfVkFMSURfUFJFRkVSUkVEX09QRVJBVElPTl9NT0RFIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlBDX0xPQ19GSVhfQ1JJVF9WQUxJRF9SRUNVUlJFTkNFX1RZUEU7Ci0gICAgZml4X2NyaXRlcmlhX3B0ci0+bWluX2ludGVydmFsID0gZml4Q3JpdGVyaWEtPm1pbl9pbnRlcnZhbDsKLSAgICBmaXhfY3JpdGVyaWFfcHRyLT5wcmVmZXJyZWRfb3BlcmF0aW9uX21vZGUgPSBvcF9tb2RlOwotCi0gICAgZml4X2NyaXRlcmlhX3B0ci0+bWluX2ludGVydmFsID0gZml4Q3JpdGVyaWEtPm1pbl9pbnRlcnZhbDsKLSAgICBmaXhfY3JpdGVyaWFfcHRyLT52YWxpZF9tYXNrIHw9IFJQQ19MT0NfRklYX0NSSVRfVkFMSURfTUlOX0lOVEVSVkFMOwotCi0gICAgaWYgKGZpeENyaXRlcmlhLT5wcmVmZXJyZWRfYWNjdXJhY3kgPiAwKSB7Ci0gICAgICAgIGZpeF9jcml0ZXJpYV9wdHItPnByZWZlcnJlZF9hY2N1cmFjeSA9IGZpeENyaXRlcmlhLT5wcmVmZXJyZWRfYWNjdXJhY3k7Ci0gICAgICAgIGZpeF9jcml0ZXJpYV9wdHItPnZhbGlkX21hc2sgfD0gUlBDX0xPQ19GSVhfQ1JJVF9WQUxJRF9QUkVGRVJSRURfQUNDVVJBQ1k7Ci0gICAgfQotICAgIGlmIChmaXhDcml0ZXJpYS0+cHJlZmVycmVkX3RpbWUgPiAwKSB7Ci0gICAgICAgIGZpeF9jcml0ZXJpYV9wdHItPnByZWZlcnJlZF9yZXNwb25zZV90aW1lID0gZml4Q3JpdGVyaWEtPnByZWZlcnJlZF90aW1lOwotICAgICAgICBmaXhfY3JpdGVyaWFfcHRyLT52YWxpZF9tYXNrIHw9IFJQQ19MT0NfRklYX0NSSVRfVkFMSURfUFJFRkVSUkVEX1JFU1BPTlNFX1RJTUU7Ci0gICAgfQotCi0gICAgc3dpdGNoIChmaXhDcml0ZXJpYS0+cmVjdXJyZW5jZSkgewotICAgIGNhc2UgR1BTX1BPU0lUSU9OX1JFQ1VSUkVOQ0VfU0lOR0xFOgotICAgICAgICBmaXhfY3JpdGVyaWFfcHRyLT5yZWN1cnJlbmNlX3R5cGUgPSBSUENfTE9DX1NJTkdMRV9GSVg7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgR1BTX1BPU0lUSU9OX1JFQ1VSUkVOQ0VfUEVSSU9ESUM6Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgZml4X2NyaXRlcmlhX3B0ci0+cmVjdXJyZW5jZV90eXBlID0gUlBDX0xPQ19QRVJJT0RJQ19GSVg7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBpb2N0bF9kYXRhLmRpc2MgPSBpb2N0bF90eXBlOwotCi0gICAgcmV0X3ZhbCA9IGxvY19lbmdfaW9jdGwgKGNsaWVudF9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvY3RsX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpb2N0bF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0NfSU9DVExfREVGQVVMVF9USU1FT1VULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMIC8qIE5vIG91dHB1dCBpbmZvcm1hdGlvbiBpcyBleHBlY3RlZCovKTsKLQotICAgIHJldHVybiBjb252ZXJ0RXJyKHJldF92YWwpOwotfQotCi1lbnVtIGxvY19hcGlfYWRhcHRlcl9lcnIKLUxvY0FwaVJwYzo6c2V0VGltZShHcHNVdGNUaW1lIHRpbWUsIGludDY0X3QgdGltZVJlZmVyZW5jZSwgaW50IHVuY2VydGFpbnR5KQotewotICAgIHJwY19sb2NfaW9jdGxfZGF0YV91X3R5cGUgICAgICAgIGlvY3RsX2RhdGE7Ci0gICAgcnBjX2xvY19hc3Npc3RfZGF0YV90aW1lX3NfdHlwZSAqdGltZV9pbmZvX3B0cjsKLSAgICBycGNfbG9jX2lvY3RsX2VfdHlwZSAgICAgICAgICAgICBpb2N0bF90eXBlID0gUlBDX0xPQ19JT0NUTF9JTkpFQ1RfVVRDX1RJTUU7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0X3ZhbDsKLQotICAgIExPQ19MT0dEICgibG9jX2VuZ19pbmplY3RfdGltZSwgdW5jZXJ0YWludHkgPSAlZFxuIiwgdW5jZXJ0YWludHkpOwotCi0gICAgdGltZV9pbmZvX3B0ciA9ICZpb2N0bF9kYXRhLnJwY19sb2NfaW9jdGxfZGF0YV91X3R5cGVfdS5hc3Npc3RhbmNlX2RhdGFfdGltZTsKLSAgICB0aW1lX2luZm9fcHRyLT50aW1lX3V0YyA9IHRpbWU7Ci0gICAgdGltZV9pbmZvX3B0ci0+dGltZV91dGMgKz0gKGludDY0X3QpKEVMQVBTRURfTUlMTElTX1NJTkNFX0JPT1RfUExBVEZPUk1fTElCX0FCU1RSQUNUSU9OIC0gdGltZVJlZmVyZW5jZSk7Ci0gICAgdGltZV9pbmZvX3B0ci0+dW5jZXJ0YWludHkgPSB1bmNlcnRhaW50eTsgLy8gVW5jZXJ0YWludHkgaW4gbXMKLQotICAgIGlvY3RsX2RhdGEuZGlzYyA9IGlvY3RsX3R5cGU7Ci0KLSAgICByZXRfdmFsID0gbG9jX2VuZ19pb2N0bCAoY2xpZW50X2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9jdGxfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlvY3RsX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPQ19JT0NUTF9ERUZBVUxUX1RJTUVPVVQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwgLyogTm8gb3V0cHV0IGluZm9ybWF0aW9uIGlzIGV4cGVjdGVkKi8pOwotCi0gICAgcmV0dXJuIGNvbnZlcnRFcnIocmV0X3ZhbCk7Ci19Ci0KLWVudW0gbG9jX2FwaV9hZGFwdGVyX2VycgotTG9jQXBpUnBjOjppbmplY3RQb3NpdGlvbihkb3VibGUgbGF0aXR1ZGUsIGRvdWJsZSBsb25naXR1ZGUsIGZsb2F0IGFjY3VyYWN5KQotewotICAgIC8qIElPQ1RMIGRhdGEgKi8KLSAgICBycGNfbG9jX2lvY3RsX2RhdGFfdV90eXBlIGlvY3RsX2RhdGE7Ci0gICAgcnBjX2xvY19hc3Npc3RfZGF0YV9wb3Nfc190eXBlICphc3Npc3RhbmNlX2RhdGFfcG9zaXRpb24gPQotICAgICAgICAmaW9jdGxfZGF0YS5ycGNfbG9jX2lvY3RsX2RhdGFfdV90eXBlX3UuYXNzaXN0YW5jZV9kYXRhX3Bvc2l0aW9uOwotICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0X3ZhbDsKLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgKiBGaWxsIGluIGxhdGl0dWRlLCBsb25naXR1ZGUgJiBhY2N1cmFjeQotICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgICAvKiBUaGlzIGNvbWJvIGlzIHJlcXVpcmVkICovCi0gICAgYXNzaXN0YW5jZV9kYXRhX3Bvc2l0aW9uLT52YWxpZF9tYXNrID0KLSAgICAgICAgUlBDX0xPQ19BU1NJU1RfUE9TX1ZBTElEX0xBVElUVURFIHwKLSAgICAgICAgUlBDX0xPQ19BU1NJU1RfUE9TX1ZBTElEX0xPTkdJVFVERSB8Ci0gICAgICAgIFJQQ19MT0NfQVNTSVNUX1BPU19WQUxJRF9IT1JfVU5DX0NJUkNVTEFSIHwKLSAgICAgICAgUlBDX0xPQ19BU1NJU1RfUE9TX1ZBTElEX0NPTkZJREVOQ0VfSE9SSVpPTlRBTDsKLQotICAgIGFzc2lzdGFuY2VfZGF0YV9wb3NpdGlvbi0+bGF0aXR1ZGUgPSBsYXRpdHVkZTsKLSAgICBhc3Npc3RhbmNlX2RhdGFfcG9zaXRpb24tPmxvbmdpdHVkZSA9IGxvbmdpdHVkZTsKLSAgICBhc3Npc3RhbmNlX2RhdGFfcG9zaXRpb24tPmhvcl91bmNfY2lyY3VsYXIgPSBhY2N1cmFjeTsgLyogTWV0ZXJzIGFzc3VtZWQgKi8KLSAgICBhc3Npc3RhbmNlX2RhdGFfcG9zaXRpb24tPmNvbmZpZGVuY2VfaG9yaXpvbnRhbCA9IDYzOyAgLyogNjMlICgxIHN0ZCBkZXYpIGFzc3VtZWQgKi8KLQotICAgIC8qIExvZyAqLwotICAgIExPQ19MT0dEKCJJbmplY3QgY29hcnNlIHBvc2l0aW9uIExhdD0lbGYsIExvbj0lbGYsIEFjYz0lLjJsZlxuIiwKLSAgICAgICAgICAgICAoZG91YmxlKSBhc3Npc3RhbmNlX2RhdGFfcG9zaXRpb24tPmxhdGl0dWRlLAotICAgICAgICAgICAgIChkb3VibGUpIGFzc2lzdGFuY2VfZGF0YV9wb3NpdGlvbi0+bG9uZ2l0dWRlLAotICAgICAgICAgICAgIChkb3VibGUpIGFzc2lzdGFuY2VfZGF0YV9wb3NpdGlvbi0+aG9yX3VuY19jaXJjdWxhcik7Ci0KLSAgICByZXRfdmFsID0gbG9jX2VuZ19pb2N0bCggY2xpZW50X2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlBDX0xPQ19JT0NUTF9JTkpFQ1RfUE9TSVRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpb2N0bF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0NfSU9DVExfREVGQVVMVF9USU1FT1VULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMIC8qIE5vIG91dHB1dCBpbmZvcm1hdGlvbiBpcyBleHBlY3RlZCovKTsKLSAgICByZXR1cm4gY29udmVydEVycihyZXRfdmFsKTsKLX0KLQotZW51bSBsb2NfYXBpX2FkYXB0ZXJfZXJyCi1Mb2NBcGlScGM6OmluZm9ybU5pUmVzcG9uc2UoR3BzVXNlclJlc3BvbnNlVHlwZSB1c2VyUmVzcG9uc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIHBhc3NUaHJvdWdoRGF0YSkKLXsKLSAgICBycGNfbG9jX2lvY3RsX2RhdGFfdV90eXBlIGRhdGE7Ci0gICAgcnBjX2xvY19pb2N0bF9jYWxsYmFja19zX3R5cGUgY2FsbGJhY2tfcGF5bG9hZDsKLQotICAgIG1lbWNweSgmZGF0YS5ycGNfbG9jX2lvY3RsX2RhdGFfdV90eXBlX3UudXNlcl92ZXJpZnlfcmVzcC5uaV9ldmVudF9wYXNzX2JhY2ssCi0gICAgICAgICAgIHBhc3NUaHJvdWdoRGF0YSwgc2l6ZW9mIChycGNfbG9jX25pX2V2ZW50X3NfdHlwZSkpOwotCi0gICAgcnBjX2xvY19uaV91c2VyX3Jlc3BfZV90eXBlIHJlc3A7Ci0gICAgc3dpdGNoICh1c2VyUmVzcG9uc2UpCi0gICAgewotICAgIGNhc2UgR1BTX05JX1JFU1BPTlNFX0FDQ0VQVDoKLSAgICAgICAgZGF0YS5ycGNfbG9jX2lvY3RsX2RhdGFfdV90eXBlX3UudXNlcl92ZXJpZnlfcmVzcC51c2VyX3Jlc3AgPQotICAgICAgICAgICAgUlBDX0xPQ19OSV9MQ1NfTk9USUZZX1ZFUklGWV9BQ0NFUFQ7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgR1BTX05JX1JFU1BPTlNFX0RFTlk6Ci0gICAgICAgIGRhdGEucnBjX2xvY19pb2N0bF9kYXRhX3VfdHlwZV91LnVzZXJfdmVyaWZ5X3Jlc3AudXNlcl9yZXNwID0KLSAgICAgICAgICAgIFJQQ19MT0NfTklfTENTX05PVElGWV9WRVJJRllfREVOWTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHUFNfTklfUkVTUE9OU0VfTk9SRVNQOgotICAgIGRlZmF1bHQ6Ci0gICAgICAgIGRhdGEucnBjX2xvY19pb2N0bF9kYXRhX3VfdHlwZV91LnVzZXJfdmVyaWZ5X3Jlc3AudXNlcl9yZXNwID0KLSAgICAgICAgICAgIFJQQ19MT0NfTklfTENTX05PVElGWV9WRVJJRllfTk9SRVNQOwotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICByZXR1cm4gY29udmVydEVycigKLSAgICAgICAgbG9jX2VuZ19pb2N0bChjbGllbnRfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgIFJQQ19MT0NfSU9DVExfSU5GT1JNX05JX1VTRVJfUkVTUE9OU0UsCi0gICAgICAgICAgICAgICAgICAgICAgJmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgTE9DX0lPQ1RMX0RFRkFVTFRfVElNRU9VVCwKLSAgICAgICAgICAgICAgICAgICAgICAmY2FsbGJhY2tfcGF5bG9hZCkKLSAgICAgICAgKTsKLX0KLQotZW51bSBsb2NfYXBpX2FkYXB0ZXJfZXJyCi1Mb2NBcGlScGM6OnNldEFQTihjaGFyKiBhcG4sIGludCBsZW4sIGJvb2xlYW4gZm9yY2UpCi17Ci0gICAgZW51bSBsb2NfYXBpX2FkYXB0ZXJfZXJyIHJ0diA9IExPQ19BUElfQURBUFRFUl9FUlJfU1VDQ0VTUzsKLSAgICBpbnQgc2l6ZSA9IHNpemVvZihhcG5MYXN0U2V0KTsKLSAgICBpZiAoZm9yY2UgfHwgbWVtY21wKGFwbkxhc3RTZXQsIGFwbiwgc2l6ZSkpIHsKLSAgICAgICAgaWYgKGxlbiA8IHNpemUpIHsKLSAgICAgICAgICAgIC8vIHNpemUgd2lsbCBiZSBub3QgbGFyZ2VyIHRoYW4gaXRzIG9yaWdpbmFsIHZhbHVlCi0gICAgICAgICAgICBzaXplID0gbGVuICsgMTsKLSAgICAgICAgfQotICAgICAgICBtZW1jcHkoYXBuTGFzdFNldCwgYXBuLCBzaXplKTsKLQotICAgICAgICBpZiAoIWlzSW5TZXNzaW9uKCkpIHsKLSAgICAgICAgICAgIHJwY19sb2NfaW9jdGxfZGF0YV91X3R5cGUgaW9jdGxfZGF0YSA9IHtSUENfTE9DX0lPQ1RMX1NFVF9MQlNfQVBOX1BST0ZJTEUsIHswfX07Ci0gICAgICAgICAgICBpb2N0bF9kYXRhLnJwY19sb2NfaW9jdGxfZGF0YV91X3R5cGVfdS5hcG5fcHJvZmlsZXNbMF0uc3J2X3N5c3RlbV90eXBlID0gTE9DX0FQTl9QUk9GSUxFX1NSVl9TWVNfTUFYOwotICAgICAgICAgICAgaW9jdGxfZGF0YS5ycGNfbG9jX2lvY3RsX2RhdGFfdV90eXBlX3UuYXBuX3Byb2ZpbGVzWzBdLnBkcF90eXBlID0gTE9DX0FQTl9QUk9GSUxFX1BETl9UWVBFX0lQVjQ7Ci0gICAgICAgICAgICBtZW1jcHkoJihpb2N0bF9kYXRhLnJwY19sb2NfaW9jdGxfZGF0YV91X3R5cGVfdS5hcG5fcHJvZmlsZXNbMF0uYXBuX25hbWUpLCBhcG4sIHNpemUpOwotCi0gICAgICAgICAgICBydHYgPSBjb252ZXJ0RXJyKAotICAgICAgICAgICAgICAgIGxvY19lbmdfaW9jdGwgKGNsaWVudF9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlBDX0xPQ19JT0NUTF9TRVRfTEJTX0FQTl9QUk9GSUxFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpb2N0bF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPQ19JT0NUTF9ERUZBVUxUX1RJTUVPVVQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkKLSAgICAgICAgICAgICAgICApOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBydHY7Ci19Ci0KLXZvaWQgTG9jQXBpUnBjOjpzZXRJblNlc3Npb24oYm9vbCBpblNlc3Npb24pCi17Ci0gICAgaWYgKCFpblNlc3Npb24pIHsKLSAgICAgICAgZW5hYmxlRGF0YShkYXRhRW5hYmxlTGFzdFNldCwgdHJ1ZSk7Ci0gICAgICAgIHNldEFQTihhcG5MYXN0U2V0LCBzaXplb2YoYXBuTGFzdFNldCktMSwgdHJ1ZSk7Ci0gICAgfQotfQotCi1lbnVtIGxvY19hcGlfYWRhcHRlcl9lcnIKLUxvY0FwaVJwYzo6c2V0U2VydmVyKGNvbnN0IGNoYXIqIHVybCwgaW50IGxlbikKLXsKLSAgICBycGNfbG9jX2lvY3RsX2RhdGFfdV90eXBlICAgICAgICAgaW9jdGxfZGF0YTsKLSAgICBycGNfbG9jX3NlcnZlcl9pbmZvX3NfdHlwZSAgICAgICAqc2VydmVyX2luZm9fcHRyOwotICAgIHJwY19sb2NfaW9jdGxfZV90eXBlICAgICAgICAgICAgICBpb2N0bF9jbWQ7Ci0KLSAgICBpb2N0bF9jbWQgPSBSUENfTE9DX0lPQ1RMX1NFVF9VTVRTX1NMUF9TRVJWRVJfQUREUjsKLSAgICBpb2N0bF9kYXRhLmRpc2MgPSBpb2N0bF9jbWQ7Ci0gICAgc2VydmVyX2luZm9fcHRyID0gJmlvY3RsX2RhdGEucnBjX2xvY19pb2N0bF9kYXRhX3VfdHlwZV91LnNlcnZlcl9hZGRyOwotICAgIHNlcnZlcl9pbmZvX3B0ci0+YWRkcl90eXBlID0gUlBDX0xPQ19TRVJWRVJfQUREUl9VUkw7Ci0gICAgc2VydmVyX2luZm9fcHRyLT5hZGRyX2luZm8uZGlzYyA9IHNlcnZlcl9pbmZvX3B0ci0+YWRkcl90eXBlOwotICAgIHNlcnZlcl9pbmZvX3B0ci0+YWRkcl9pbmZvLnJwY19sb2Nfc2VydmVyX2FkZHJfdV90eXBlX3UudXJsLmxlbmd0aCA9IGxlbjsKLSNpZiAoQU1TU19WRVJTSU9OPT0zMjAwKQotICAgIHNlcnZlcl9pbmZvX3B0ci0+YWRkcl9pbmZvLnJwY19sb2Nfc2VydmVyX2FkZHJfdV90eXBlX3UudXJsLmFkZHIuYWRkcl92YWwgPSAoY2hhciopIHVybDsKLSAgICBzZXJ2ZXJfaW5mb19wdHItPmFkZHJfaW5mby5ycGNfbG9jX3NlcnZlcl9hZGRyX3VfdHlwZV91LnVybC5hZGRyLmFkZHJfbGVuPSBsZW47Ci0jZWxzZQotICAgIHN0cmxjcHkoc2VydmVyX2luZm9fcHRyLT5hZGRyX2luZm8ucnBjX2xvY19zZXJ2ZXJfYWRkcl91X3R5cGVfdS51cmwuYWRkciwgdXJsLAotICAgICAgICAgICAgc2l6ZW9mIHNlcnZlcl9pbmZvX3B0ci0+YWRkcl9pbmZvLnJwY19sb2Nfc2VydmVyX2FkZHJfdV90eXBlX3UudXJsLmFkZHIpOwotI2VuZGlmIC8qICNpZiAoQU1TU19WRVJTSU9OPT0zMjAwKSAqLwotICAgIExPQ19MT0dEICgibG9jX2VuZ19zZXRfc2VydmVyLCBhZGRyID0gJXNcbiIsIHVybCk7Ci0KLSAgICByZXR1cm4gY29udmVydEVycigKLSAgICAgICAgbG9jX2VuZ19pb2N0bCAoY2xpZW50X2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgaW9jdGxfY21kLAotICAgICAgICAgICAgICAgICAgICAgICAmaW9jdGxfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgTE9DX0lPQ1RMX0RFRkFVTFRfVElNRU9VVCwKLSAgICAgICAgICAgICAgICAgICAgICAgTlVMTCAvKiBObyBvdXRwdXQgaW5mb3JtYXRpb24gaXMgZXhwZWN0ZWQqLykKLSAgICAgICAgKTsKLX0KLQotZW51bSBsb2NfYXBpX2FkYXB0ZXJfZXJyCi1Mb2NBcGlScGM6OnNldFNlcnZlcih1bnNpZ25lZCBpbnQgaXAsIGludCBwb3J0LCBMb2NTZXJ2ZXJUeXBlIHR5cGUpCi17Ci0gICAgcnBjX2xvY19pb2N0bF9kYXRhX3VfdHlwZSAgICAgICAgIGlvY3RsX2RhdGE7Ci0gICAgcnBjX2xvY19zZXJ2ZXJfaW5mb19zX3R5cGUgICAgICAgKnNlcnZlcl9pbmZvX3B0cjsKLSAgICBycGNfbG9jX2lvY3RsX2VfdHlwZSAgICAgICAgICAgICAgaW9jdGxfY21kOwotCi0gICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgY2FzZSBMT0NfQUdQU19NUENfU0VSVkVSOgotICAgICAgICBpb2N0bF9jbWQgPSBSUENfTE9DX0lPQ1RMX1NFVF9DRE1BX01QQ19TRVJWRVJfQUREUjsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBMT0NfQUdQU19DVVNUT01fUERFX1NFUlZFUjoKLSAgICAgICAgaW9jdGxfY21kID0gUlBDX0xPQ19JT0NUTF9TRVRfQ1VTVE9NX1BERV9TRVJWRVJfQUREUjsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgaW9jdGxfY21kID0gUlBDX0xPQ19JT0NUTF9TRVRfQ0RNQV9QREVfU0VSVkVSX0FERFI7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBpb2N0bF9kYXRhLmRpc2MgPSBpb2N0bF9jbWQ7Ci0gICAgc2VydmVyX2luZm9fcHRyID0gJmlvY3RsX2RhdGEucnBjX2xvY19pb2N0bF9kYXRhX3VfdHlwZV91LnNlcnZlcl9hZGRyOwotICAgIHNlcnZlcl9pbmZvX3B0ci0+YWRkcl90eXBlID0gUlBDX0xPQ19TRVJWRVJfQUREUl9JUFY0OwotICAgIHNlcnZlcl9pbmZvX3B0ci0+YWRkcl9pbmZvLmRpc2MgPSBzZXJ2ZXJfaW5mb19wdHItPmFkZHJfdHlwZTsKLSAgICBzZXJ2ZXJfaW5mb19wdHItPmFkZHJfaW5mby5ycGNfbG9jX3NlcnZlcl9hZGRyX3VfdHlwZV91LmlwdjQuYWRkciA9IGlwOwotICAgIHNlcnZlcl9pbmZvX3B0ci0+YWRkcl9pbmZvLnJwY19sb2Nfc2VydmVyX2FkZHJfdV90eXBlX3UuaXB2NC5wb3J0ID0gcG9ydDsKLSAgICBMT0NfTE9HRCAoInNldFNlcnZlciwgYWRkciA9ICVYOiVkXG4iLCAodW5zaWduZWQgaW50KSBpcCwgKHVuc2lnbmVkIGludCkgcG9ydCk7Ci0KLSAgICByZXR1cm4gY29udmVydEVycigKLSAgICAgICAgbG9jX2VuZ19pb2N0bCAoY2xpZW50X2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgaW9jdGxfY21kLAotICAgICAgICAgICAgICAgICAgICAgICAmaW9jdGxfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgTE9DX0lPQ1RMX0RFRkFVTFRfVElNRU9VVCwKLSAgICAgICAgICAgICAgICAgICAgICAgTlVMTCAvKiBObyBvdXRwdXQgaW5mb3JtYXRpb24gaXMgZXhwZWN0ZWQqLykKLSAgICAgICAgKTsKLX0KLQotZW51bSBsb2NfYXBpX2FkYXB0ZXJfZXJyCi1Mb2NBcGlScGM6OmVuYWJsZURhdGEoaW50IGVuYWJsZSwgYm9vbGVhbiBmb3JjZSkKLXsKLSAgICBlbnVtIGxvY19hcGlfYWRhcHRlcl9lcnIgcnR2ID0gTE9DX0FQSV9BREFQVEVSX0VSUl9TVUNDRVNTOwotICAgIGlmIChmb3JjZSB8fCBkYXRhRW5hYmxlTGFzdFNldCAhPSBlbmFibGUpIHsKLSAgICAgICAgZGF0YUVuYWJsZUxhc3RTZXQgPSBlbmFibGU7Ci0KLSAgICAgICAgaWYgKCFpc0luU2Vzc2lvbigpKSB7Ci0gICAgICAgICAgICBycGNfbG9jX2lvY3RsX2RhdGFfdV90eXBlIGlvY3RsX2RhdGEgPSB7UlBDX0xPQ19JT0NUTF9TRVRfREFUQV9FTkFCTEUsIHswfX07Ci0KLSAgICAgICAgICAgIGlvY3RsX2RhdGEucnBjX2xvY19pb2N0bF9kYXRhX3VfdHlwZV91LmRhdGFfZW5hYmxlID0gZW5hYmxlOwotICAgICAgICAgICAgcnR2ID0gIGNvbnZlcnRFcnIoCi0gICAgICAgICAgICAgICAgbG9jX2VuZ19pb2N0bCAoY2xpZW50X2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSUENfTE9DX0lPQ1RMX1NFVF9EQVRBX0VOQUJMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW9jdGxfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0NfSU9DVExfREVGQVVMVF9USU1FT1VULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpCi0gICAgICAgICAgICAgICAgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcnR2OwotfQotCi1lbnVtIGxvY19hcGlfYWRhcHRlcl9lcnIKLUxvY0FwaVJwYzo6ZGVsZXRlQWlkaW5nRGF0YShHcHNBaWRpbmdEYXRhIGJpdHMpCi17Ci0gICAgcnBjX2xvY19pb2N0bF9kYXRhX3VfdHlwZSBpb2N0bF9kYXRhID0ge1JQQ19MT0NfSU9DVExfREVMRVRFX0FTU0lTVF9EQVRBLCB7MH19OwotICAgIGlvY3RsX2RhdGEucnBjX2xvY19pb2N0bF9kYXRhX3VfdHlwZV91LmFzc2lzdF9kYXRhX2RlbGV0ZS50eXBlID0gYml0czsKLQotICAgIHJldHVybiBjb252ZXJ0RXJyKAotICAgICAgICBsb2NfZW5nX2lvY3RsIChjbGllbnRfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICBSUENfTE9DX0lPQ1RMX0RFTEVURV9BU1NJU1RfREFUQSwKLSAgICAgICAgICAgICAgICAgICAgICAgJmlvY3RsX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgIExPQ19JT0NUTF9ERUZBVUxUX1RJTUVPVVQsCi0gICAgICAgICAgICAgICAgICAgICAgIE5VTEwpCi0gICAgICAgICk7Ci19Ci0KLXZvaWQgTG9jQXBpUnBjOjpyZXBvcnRQb3NpdGlvbihjb25zdCBycGNfbG9jX3BhcnNlZF9wb3NpdGlvbl9zX3R5cGUgKmxvY2F0aW9uX3JlcG9ydF9wdHIpCi17Ci0gICAgTG9jUG9zVGVjaE1hc2sgdGVjaF9NYXNrID0gTE9DX1BPU19URUNIX01BU0tfREVGQVVMVDsKLQotICAgIFVscExvY2F0aW9uIGxvY2F0aW9uID0gezB9OwotICAgIEdwc0xvY2F0aW9uRXh0ZW5kZWQgbG9jYXRpb25FeHRlbmRlZCA9IHswfTsKLQotICAgIGxvY2F0aW9uLnNpemUgPSBzaXplb2YobG9jYXRpb24pOwotICAgIGxvY2F0aW9uRXh0ZW5kZWQuc2l6ZSA9IHNpemVvZihsb2NhdGlvbkV4dGVuZGVkKTsKLSAgICBpZiAobG9jYXRpb25fcmVwb3J0X3B0ci0+dmFsaWRfbWFzayAmIFJQQ19MT0NfUE9TX1ZBTElEX1NFU1NJT05fU1RBVFVTKQotICAgIHsKLSAgICAgICAgLy8gUHJvY2VzcyB0aGUgcG9zaXRpb24gZnJvbSBmaW5hbCBhbmQgaW50ZXJtZWRpYXRlIHJlcG9ydHMKLSAgICAgICAgaWYgKGxvY2F0aW9uX3JlcG9ydF9wdHItPnNlc3Npb25fc3RhdHVzID09IFJQQ19MT0NfU0VTU19TVEFUVVNfU1VDQ0VTUyB8fAotICAgICAgICAgICAgbG9jYXRpb25fcmVwb3J0X3B0ci0+c2Vzc2lvbl9zdGF0dXMgPT0gUlBDX0xPQ19TRVNTX1NUQVRVU19JTl9QUk9HRVNTKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBMYXRpdHVkZSAmIExvbmdpdHVkZQotICAgICAgICAgICAgaWYgKChsb2NhdGlvbl9yZXBvcnRfcHRyLT52YWxpZF9tYXNrICYgUlBDX0xPQ19QT1NfVkFMSURfTEFUSVRVREUpICYmCi0gICAgICAgICAgICAgICAgKGxvY2F0aW9uX3JlcG9ydF9wdHItPnZhbGlkX21hc2sgJiBSUENfTE9DX1BPU19WQUxJRF9MT05HSVRVREUpICYmCi0gICAgICAgICAgICAgICAgKGxvY2F0aW9uX3JlcG9ydF9wdHItPmxhdGl0dWRlICE9IDAgfHwKLSAgICAgICAgICAgICAgICAgbG9jYXRpb25fcmVwb3J0X3B0ci0+bG9uZ2l0dWRlICE9IDApKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvY2F0aW9uLmdwc0xvY2F0aW9uLmZsYWdzICAgIHw9IEdQU19MT0NBVElPTl9IQVNfTEFUX0xPTkc7Ci0gICAgICAgICAgICAgICAgbG9jYXRpb24uZ3BzTG9jYXRpb24ubGF0aXR1ZGUgID0gbG9jYXRpb25fcmVwb3J0X3B0ci0+bGF0aXR1ZGU7Ci0gICAgICAgICAgICAgICAgbG9jYXRpb24uZ3BzTG9jYXRpb24ubG9uZ2l0dWRlID0gbG9jYXRpb25fcmVwb3J0X3B0ci0+bG9uZ2l0dWRlOwotCi0gICAgICAgICAgICAgICAgLy8gVGltZSBzdGFtcCAoVVRDKQotICAgICAgICAgICAgICAgIGlmIChsb2NhdGlvbl9yZXBvcnRfcHRyLT52YWxpZF9tYXNrICYgUlBDX0xPQ19QT1NfVkFMSURfVElNRVNUQU1QX1VUQykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLmdwc0xvY2F0aW9uLnRpbWVzdGFtcCA9IGxvY2F0aW9uX3JlcG9ydF9wdHItPnRpbWVzdGFtcF91dGM7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gQWx0aXR1ZGUKLSAgICAgICAgICAgICAgICBpZiAobG9jYXRpb25fcmVwb3J0X3B0ci0+dmFsaWRfbWFzayAmICBSUENfTE9DX1BPU19WQUxJRF9BTFRJVFVERV9XUlRfRUxMSVBTT0lEICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLmdwc0xvY2F0aW9uLmZsYWdzICAgIHw9IEdQU19MT0NBVElPTl9IQVNfQUxUSVRVREU7Ci0gICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLmdwc0xvY2F0aW9uLmFsdGl0dWRlID0gbG9jYXRpb25fcmVwb3J0X3B0ci0+YWx0aXR1ZGVfd3J0X2VsbGlwc29pZDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBTcGVlZAotICAgICAgICAgICAgICAgIGlmICgobG9jYXRpb25fcmVwb3J0X3B0ci0+dmFsaWRfbWFzayAmIFJQQ19MT0NfUE9TX1ZBTElEX1NQRUVEX0hPUklaT05UQUwpICYmCi0gICAgICAgICAgICAgICAgICAgIChsb2NhdGlvbl9yZXBvcnRfcHRyLT52YWxpZF9tYXNrICYgUlBDX0xPQ19QT1NfVkFMSURfU1BFRURfVkVSVElDQUwpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24uZ3BzTG9jYXRpb24uZmxhZ3MgICAgfD0gR1BTX0xPQ0FUSU9OX0hBU19TUEVFRDsKLSAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24uZ3BzTG9jYXRpb24uc3BlZWQgPSBzcXJ0KGxvY2F0aW9uX3JlcG9ydF9wdHItPnNwZWVkX2hvcml6b250YWwgKiBsb2NhdGlvbl9yZXBvcnRfcHRyLT5zcGVlZF9ob3Jpem9udGFsICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uX3JlcG9ydF9wdHItPnNwZWVkX3ZlcnRpY2FsICogbG9jYXRpb25fcmVwb3J0X3B0ci0+c3BlZWRfdmVydGljYWwpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIEhlYWRpbmcKLSAgICAgICAgICAgICAgICBpZiAobG9jYXRpb25fcmVwb3J0X3B0ci0+dmFsaWRfbWFzayAmICBSUENfTE9DX1BPU19WQUxJRF9IRUFESU5HKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24uZ3BzTG9jYXRpb24uZmxhZ3MgICAgfD0gR1BTX0xPQ0FUSU9OX0hBU19CRUFSSU5HOwotICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbi5ncHNMb2NhdGlvbi5iZWFyaW5nID0gbG9jYXRpb25fcmVwb3J0X3B0ci0+aGVhZGluZzsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBVbmNlcnRhaW50eSAoY2lyY3VsYXIpCi0gICAgICAgICAgICAgICAgaWYgKCAobG9jYXRpb25fcmVwb3J0X3B0ci0+dmFsaWRfbWFzayAmIFJQQ19MT0NfUE9TX1ZBTElEX0hPUl9VTkNfQ0lSQ1VMQVIpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLmdwc0xvY2F0aW9uLmZsYWdzICAgIHw9IEdQU19MT0NBVElPTl9IQVNfQUNDVVJBQ1k7Ci0gICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLmdwc0xvY2F0aW9uLmFjY3VyYWN5ID0gbG9jYXRpb25fcmVwb3J0X3B0ci0+aG9yX3VuY19jaXJjdWxhcjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBUZWNobm9sb2d5IE1hc2sKLQotICAgICAgICAgICAgICAgIHRlY2hfTWFzayAgfD0gbG9jYXRpb25fcmVwb3J0X3B0ci0+dGVjaG5vbG9neV9tYXNrOwotICAgICAgICAgICAgICAgIC8vTWFyayB0aGUgbG9jYXRpb24gc291cmNlIGFzIGZyb20gR05TUwotICAgICAgICAgICAgICAgIGxvY2F0aW9uLmdwc0xvY2F0aW9uLmZsYWdzIHw9IExPQ0FUSU9OX0hBU19TT1VSQ0VfSU5GTzsKLSAgICAgICAgICAgICAgICBsb2NhdGlvbi5wb3NpdGlvbl9zb3VyY2UgPSBVTFBfTE9DQVRJT05fSVNfRlJPTV9HTlNTOwotICAgICAgICAgICAgICAgIGlmIChsb2NhdGlvbl9yZXBvcnRfcHRyLT52YWxpZF9tYXNrICYgUlBDX0xPQ19QT1NfVkFMSURfQUxUSVRVREVfV1JUX01FQU5fU0VBX0xFVkVMKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9jYXRpb25FeHRlbmRlZC5mbGFncyB8PSBHUFNfTE9DQVRJT05fRVhURU5ERURfSEFTX0FMVElUVURFX01FQU5fU0VBX0xFVkVMOwotICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbkV4dGVuZGVkLmFsdGl0dWRlTWVhblNlYUxldmVsID0gbG9jYXRpb25fcmVwb3J0X3B0ci0+YWx0aXR1ZGVfd3J0X21lYW5fc2VhX2xldmVsOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChsb2NhdGlvbl9yZXBvcnRfcHRyLT52YWxpZF9tYXNrICYgIFJQQ19MT0NfUE9TX1ZBTElEX01BR05FVElDX1ZBUklBVElPTiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbkV4dGVuZGVkLmZsYWdzIHw9IEdQU19MT0NBVElPTl9FWFRFTkRFRF9IQVNfTUFHX0RFVjsKLSAgICAgICAgICAgICAgICAgICAgbG9jYXRpb25FeHRlbmRlZC5tYWduZXRpY0RldmlhdGlvbiA9IGxvY2F0aW9uX3JlcG9ydF9wdHItPm1hZ25ldGljX2RldmlhdGlvbjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobG9jYXRpb25fcmVwb3J0X3B0ci0+dmFsaWRfbWFzayAmIFJQQ19MT0NfUE9TX1ZBTElEX1ZFUlRJQ0FMX1VOQykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgbG9jYXRpb25FeHRlbmRlZC5mbGFncyB8PSBHUFNfTE9DQVRJT05fRVhURU5ERURfSEFTX1ZFUlRfVU5DOwotICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uRXh0ZW5kZWQudmVydF91bmMgPSBsb2NhdGlvbl9yZXBvcnRfcHRyLT52ZXJ0X3VuYzsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobG9jYXRpb25fcmVwb3J0X3B0ci0+dmFsaWRfbWFzayAmIFJQQ19MT0NfUE9TX1ZBTElEX1NQRUVEX1VOQykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgbG9jYXRpb25FeHRlbmRlZC5mbGFncyB8PSBHUFNfTE9DQVRJT05fRVhURU5ERURfSEFTX1NQRUVEX1VOQzsKLSAgICAgICAgICAgICAgICAgICBsb2NhdGlvbkV4dGVuZGVkLnNwZWVkX3VuYyA9IGxvY2F0aW9uX3JlcG9ydF9wdHItPnNwZWVkX3VuYzsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBMT0NfTE9HVigicmVwb3J0UG9zaXRpb246IGZpcmUgY2FsbGJhY2tcbiIpOwotICAgICAgICAgICAgICAgIGVudW0gbG9jX3Nlc3Nfc3RhdHVzIGZpeFN0YXR1cyA9Ci0gICAgICAgICAgICAgICAgICAgIChsb2NhdGlvbl9yZXBvcnRfcHRyLT5zZXNzaW9uX3N0YXR1cwotICAgICAgICAgICAgICAgICAgICAgPT0gUlBDX0xPQ19TRVNTX1NUQVRVU19JTl9QUk9HRVNTID8KLSAgICAgICAgICAgICAgICAgICAgIExPQ19TRVNTX0lOVEVSTUVESUFURSA6IExPQ19TRVNTX1NVQ0NFU1MpOwotICAgICAgICAgICAgICAgIExvY0FwaUJhc2U6OnJlcG9ydFBvc2l0aW9uKGxvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uRXh0ZW5kZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKWxvY2F0aW9uX3JlcG9ydF9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZml4U3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlY2hfTWFzayk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBMb2NBcGlCYXNlOjpyZXBvcnRQb3NpdGlvbihsb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uRXh0ZW5kZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9DX1NFU1NfRkFJTFVSRSk7Ci0gICAgICAgICAgICBMT0NfTE9HVigibG9jX2VuZ19yZXBvcnRfcG9zaXRpb246IGlnbm9yZSBwb3NpdGlvbiByZXBvcnQgIgotICAgICAgICAgICAgICAgICAgICAgIndoZW4gc2Vzc2lvbiBzdGF0dXMgPSAlZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uX3JlcG9ydF9wdHItPnNlc3Npb25fc3RhdHVzKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBMT0NfTE9HVigibG9jX2VuZ19yZXBvcnRfcG9zaXRpb246IGlnbm9yZSBwb3NpdGlvbiByZXBvcnQgIgotICAgICAgICAgICAgICAgICAid2hlbiBzZXNzaW9uIHN0YXR1cyBpcyBub3Qgc2V0XG4iKTsKLSAgICB9Ci19Ci0KLXZvaWQgTG9jQXBpUnBjOjpyZXBvcnRTdihjb25zdCBycGNfbG9jX2duc3NfaW5mb19zX3R5cGUgKmduc3NfcmVwb3J0X3B0cikKLXsKLSAgICBHcHNTdlN0YXR1cyAgICAgU3ZTdGF0dXMgPSB7MH07Ci0gICAgR3BzTG9jYXRpb25FeHRlbmRlZCBsb2NhdGlvbkV4dGVuZGVkID0gezB9OwotICAgIGxvY2F0aW9uRXh0ZW5kZWQuc2l6ZSA9IHNpemVvZihsb2NhdGlvbkV4dGVuZGVkKTsKLSAgICBpbnQgICAgICAgICAgICAgbnVtX3N2c19tYXggPSAwOwotICAgIGNvbnN0IHJwY19sb2Nfc3ZfaW5mb19zX3R5cGUgKnN2X2luZm9fcHRyOwotCi0gICAgaWYgKGduc3NfcmVwb3J0X3B0ci0+dmFsaWRfbWFzayAmIFJQQ19MT0NfR05TU19JTkZPX1ZBTElEX1NWX0NPVU5UKQotICAgIHsKLSAgICAgICAgbnVtX3N2c19tYXggPSBnbnNzX3JlcG9ydF9wdHItPnN2X2NvdW50OwotICAgICAgICBpZiAobnVtX3N2c19tYXggPiBHUFNfTUFYX1NWUykKLSAgICAgICAgewotICAgICAgICAgICAgbnVtX3N2c19tYXggPSBHUFNfTUFYX1NWUzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChnbnNzX3JlcG9ydF9wdHItPnZhbGlkX21hc2sgJiBSUENfTE9DX0dOU1NfSU5GT19WQUxJRF9TVl9MSVNUKQotICAgIHsKLSAgICAgICAgU3ZTdGF0dXMubnVtX3N2cyA9IDA7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fc3ZzX21heDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdl9pbmZvX3B0ciA9ICYoZ25zc19yZXBvcnRfcHRyLT5zdl9saXN0LnN2X2xpc3RfdmFsW2ldKTsKLSAgICAgICAgICAgIGlmIChzdl9pbmZvX3B0ci0+dmFsaWRfbWFzayAmIFJQQ19MT0NfU1ZfSU5GT19WQUxJRF9TWVNURU0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHN2X2luZm9fcHRyLT5zeXN0ZW0gPT0gUlBDX0xPQ19TVl9TWVNURU1fR1BTKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU3ZTdGF0dXMuc3ZfbGlzdFtTdlN0YXR1cy5udW1fc3ZzXS5zaXplID0gc2l6ZW9mKEdwc1N2U3RhdHVzKTsKLSAgICAgICAgICAgICAgICAgICAgU3ZTdGF0dXMuc3ZfbGlzdFtTdlN0YXR1cy5udW1fc3ZzXS5wcm4gPSBzdl9pbmZvX3B0ci0+cHJuOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIFdlIG9ubHkgaGF2ZSB0aGUgZGF0YSBmaWVsZCB0byByZXBvcnQgZ3BzIGVwaCBhbmQgYWxtIG1hc2sKLSAgICAgICAgICAgICAgICAgICAgaWYgKChzdl9pbmZvX3B0ci0+dmFsaWRfbWFzayAmIFJQQ19MT0NfU1ZfSU5GT19WQUxJRF9IQVNfRVBIKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgKHN2X2luZm9fcHRyLT5oYXNfZXBoID09IDEpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdlN0YXR1cy5lcGhlbWVyaXNfbWFzayB8PSAoMSA8PCAoc3ZfaW5mb19wdHItPnBybi0xKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoKHN2X2luZm9fcHRyLT52YWxpZF9tYXNrICYgUlBDX0xPQ19TVl9JTkZPX1ZBTElEX0hBU19BTE0pICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAoc3ZfaW5mb19wdHItPmhhc19hbG0gPT0gMSkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN2U3RhdHVzLmFsbWFuYWNfbWFzayB8PSAoMSA8PCAoc3ZfaW5mb19wdHItPnBybi0xKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoKHN2X2luZm9fcHRyLT52YWxpZF9tYXNrICYgUlBDX0xPQ19TVl9JTkZPX1ZBTElEX1BST0NFU1NfU1RBVFVTKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgKHN2X2luZm9fcHRyLT5wcm9jZXNzX3N0YXR1cyA9PSBSUENfTE9DX1NWX1NUQVRVU19UUkFDSykpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN2U3RhdHVzLnVzZWRfaW5fZml4X21hc2sgfD0gKDEgPDwgKHN2X2luZm9fcHRyLT5wcm4tMSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIFNCQVM6IEdQUyBSUE46IDEyMC0xNTEsCi0gICAgICAgICAgICAgICAgLy8gSW4gZXh0ZW5lZGVkIG1lYXN1cmVtZW50IHJlcG9ydCwgd2UgZm9sbG93IG5tZWEgc3RhbmRhcmQsIHdoaWNoIGlzIGZyb20gMzMtNjQuCi0gICAgICAgICAgICAgICAgZWxzZSBpZiAoc3ZfaW5mb19wdHItPnN5c3RlbSA9PSBSUENfTE9DX1NWX1NZU1RFTV9TQkFTKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU3ZTdGF0dXMuc3ZfbGlzdFtTdlN0YXR1cy5udW1fc3ZzXS5wcm4gPSBzdl9pbmZvX3B0ci0+cHJuICsgMzMgLSAxMjA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIEdsb25lc3M6IFNsb3QgaWQ6IDEtMzIKLSAgICAgICAgICAgICAgICAvLyBJbiBleHRlbmRlZCBtZWFzdXJlbWVudCByZXBvcnQsIHdlIGZvbGxvdyBubWVhIHN0YW5kYXJkLCB3aGljaCBpcyA2NS05NgotICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN2X2luZm9fcHRyLT5zeXN0ZW0gPT0gUlBDX0xPQ19TVl9TWVNURU1fR0xPTkFTUykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFN2U3RhdHVzLnN2X2xpc3RbU3ZTdGF0dXMubnVtX3N2c10ucHJuID0gc3ZfaW5mb19wdHItPnBybiArICg2NS0xKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gVW5zdXBwb3J0ZWQgU1Ygc3lzdGVtCi0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoc3ZfaW5mb19wdHItPnZhbGlkX21hc2sgJiBSUENfTE9DX1NWX0lORk9fVkFMSURfU05SKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN2U3RhdHVzLnN2X2xpc3RbU3ZTdGF0dXMubnVtX3N2c10uc25yID0gc3ZfaW5mb19wdHItPnNucjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHN2X2luZm9fcHRyLT52YWxpZF9tYXNrICYgUlBDX0xPQ19TVl9JTkZPX1ZBTElEX0VMRVZBVElPTikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdlN0YXR1cy5zdl9saXN0W1N2U3RhdHVzLm51bV9zdnNdLmVsZXZhdGlvbiA9IHN2X2luZm9fcHRyLT5lbGV2YXRpb247Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChzdl9pbmZvX3B0ci0+dmFsaWRfbWFzayAmIFJQQ19MT0NfU1ZfSU5GT19WQUxJRF9BWklNVVRIKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN2U3RhdHVzLnN2X2xpc3RbU3ZTdGF0dXMubnVtX3N2c10uYXppbXV0aCA9IHN2X2luZm9fcHRyLT5hemltdXRoOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdlN0YXR1cy5udW1fc3ZzKys7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoKGduc3NfcmVwb3J0X3B0ci0+dmFsaWRfbWFzayAmIFJQQ19MT0NfR05TU19JTkZPX1ZBTElEX1BPU19ET1ApICYmCi0gICAgICAgIChnbnNzX3JlcG9ydF9wdHItPnZhbGlkX21hc2sgJiBSUENfTE9DX0dOU1NfSU5GT19WQUxJRF9IT1JfRE9QKSAmJgotICAgICAgICAoZ25zc19yZXBvcnRfcHRyLT52YWxpZF9tYXNrICYgUlBDX0xPQ19HTlNTX0lORk9fVkFMSURfVkVSVF9ET1ApKQotICAgIHsKLSAgICAgICAgbG9jYXRpb25FeHRlbmRlZC5mbGFncyB8PSBHUFNfTE9DQVRJT05fRVhURU5ERURfSEFTX0RPUDsKLSAgICAgICAgbG9jYXRpb25FeHRlbmRlZC5wZG9wID0gZ25zc19yZXBvcnRfcHRyLT5wb3NpdGlvbl9kb3A7Ci0gICAgICAgIGxvY2F0aW9uRXh0ZW5kZWQuaGRvcCA9IGduc3NfcmVwb3J0X3B0ci0+aG9yaXpvbnRhbF9kb3A7Ci0gICAgICAgIGxvY2F0aW9uRXh0ZW5kZWQudmRvcCA9IGduc3NfcmVwb3J0X3B0ci0+dmVydGljYWxfZG9wOwotICAgIH0KLQotICAgIGlmIChTdlN0YXR1cy5udW1fc3ZzID49IDApCi0gICAgewotICAgICAgICBMb2NBcGlCYXNlOjpyZXBvcnRTdihTdlN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb25FeHRlbmRlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKWduc3NfcmVwb3J0X3B0cik7Ci0gICAgfQotfQotCi12b2lkIExvY0FwaVJwYzo6cmVwb3J0U3RhdHVzKGNvbnN0IHJwY19sb2Nfc3RhdHVzX2V2ZW50X3NfdHlwZSAqc3RhdHVzX3JlcG9ydF9wdHIpCi17Ci0KLSAgICBpZiAoc3RhdHVzX3JlcG9ydF9wdHItPmV2ZW50ID09IFJQQ19MT0NfU1RBVFVTX0VWRU5UX0VOR0lORV9TVEFURSkgewotICAgICAgICBpZiAoc3RhdHVzX3JlcG9ydF9wdHItPnBheWxvYWQucnBjX2xvY19zdGF0dXNfZXZlbnRfcGF5bG9hZF91X3R5cGVfdS5lbmdpbmVfc3RhdGUgPT0gUlBDX0xPQ19FTkdJTkVfU1RBVEVfT04pCi0gICAgICAgIHsKLSAgICAgICAgICAgIExvY0FwaUJhc2U6OnJlcG9ydFN0YXR1cyhHUFNfU1RBVFVTX0VOR0lORV9PTik7Ci0gICAgICAgICAgICBMb2NBcGlCYXNlOjpyZXBvcnRTdGF0dXMoR1BTX1NUQVRVU19TRVNTSU9OX0JFR0lOKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChzdGF0dXNfcmVwb3J0X3B0ci0+cGF5bG9hZC5ycGNfbG9jX3N0YXR1c19ldmVudF9wYXlsb2FkX3VfdHlwZV91LmVuZ2luZV9zdGF0ZSA9PSBSUENfTE9DX0VOR0lORV9TVEFURV9PRkYpCi0gICAgICAgIHsKLSAgICAgICAgICAgIExvY0FwaUJhc2U6OnJlcG9ydFN0YXR1cyhHUFNfU1RBVFVTX1NFU1NJT05fRU5EKTsKLSAgICAgICAgICAgIExvY0FwaUJhc2U6OnJlcG9ydFN0YXR1cyhHUFNfU1RBVFVTX0VOR0lORV9PRkYpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgTG9jQXBpQmFzZTo6cmVwb3J0U3RhdHVzKEdQU19TVEFUVVNfTk9ORSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KLQotdm9pZCBMb2NBcGlScGM6OnJlcG9ydE5tZWEoY29uc3QgcnBjX2xvY19ubWVhX3JlcG9ydF9zX3R5cGUgKm5tZWFfcmVwb3J0X3B0cikKLXsKLQotI2lmIChBTVNTX1ZFUlNJT049PTMyMDApCi0gICAgTG9jQXBpQmFzZTo6cmVwb3J0Tm1lYShubWVhX3JlcG9ydF9wdHItPm5tZWFfc2VudGVuY2VzLm5tZWFfc2VudGVuY2VzX3ZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5tZWFfcmVwb3J0X3B0ci0+bm1lYV9zZW50ZW5jZXMubm1lYV9zZW50ZW5jZXNfbGVuKTsKLSNlbHNlCi0gICAgTG9jQXBpQmFzZTo6cmVwb3J0Tm1lYShubWVhX3JlcG9ydF9wdHItPm5tZWFfc2VudGVuY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbm1lYV9yZXBvcnRfcHRyLT5sZW5ndGgpOwotICAgIExPQ19MT0dEKCJsb2NfZW5nX3JlcG9ydF9ubWVhOiAkJWMlYyVjXG4iLAotICAgICAgICAgICAgIG5tZWFfcmVwb3J0X3B0ci0+bm1lYV9zZW50ZW5jZXNbM10sCi0gICAgICAgICAgICAgbm1lYV9yZXBvcnRfcHRyLT5ubWVhX3NlbnRlbmNlc1s0XSwKLSAgICAgICAgICAgICBubWVhX3JlcG9ydF9wdHItPm5tZWFfc2VudGVuY2VzWzVdKTsKLSNlbmRpZiAvKiAjaWYgKEFNU1NfVkVSU0lPTj09MzIwMCkgKi8KLX0KLQotZW51bSBsb2NfYXBpX2FkYXB0ZXJfZXJyCi1Mb2NBcGlScGM6OnNldFh0cmFEYXRhKGNoYXIqIGRhdGEsIGludCBsZW5ndGgpCi17Ci0gICAgaW50ICAgICBycGNfcmV0X3ZhbCA9IFJQQ19MT0NfQVBJX0dFTkVSQUxfRkFJTFVSRTsKLSAgICBpbnQgICAgIHRvdGFsX3BhcnRzOwotICAgIHVpbnQ4ICAgcGFydDsKLSAgICB1aW50MTYgIHBhcnRfbGVuOwotICAgIHVpbnQxNiAgbGVuX2luamVjdGVkOwotICAgIHJwY19sb2NfaW9jdGxfZGF0YV91X3R5cGUgICAgICAgICAgICBpb2N0bF9kYXRhOwotICAgIHJwY19sb2NfaW9jdGxfZV90eXBlICAgICAgICAgICAgICAgICBpb2N0bF90eXBlID0gUlBDX0xPQ19JT0NUTF9JTkpFQ1RfUFJFRElDVEVEX09SQklUU19EQVRBOwotICAgIHJwY19sb2NfcHJlZGljdGVkX29yYml0c19kYXRhX3NfdHlwZSAqcHJlZGljdGVkX29yYml0c19kYXRhX3B0cjsKLQotICAgIExPQ19MT0dEKCJxY3RfbG9jX2VuZ19pbmplY3RfeHRyYV9kYXRhLCB4dHJhIHNpemUgPSAlZCwgZGF0YSBwdHIgPSAweCVseFxuIiwgbGVuZ3RoLCAobG9uZykgZGF0YSk7Ci0KLSAgICBwcmVkaWN0ZWRfb3JiaXRzX2RhdGFfcHRyID0gJmlvY3RsX2RhdGEucnBjX2xvY19pb2N0bF9kYXRhX3VfdHlwZV91LnByZWRpY3RlZF9vcmJpdHNfZGF0YTsKLSAgICBwcmVkaWN0ZWRfb3JiaXRzX2RhdGFfcHRyLT5mb3JtYXRfdHlwZSA9IFJQQ19MT0NfUFJFRElDVEVEX09SQklUU19YVFJBOwotICAgIHByZWRpY3RlZF9vcmJpdHNfZGF0YV9wdHItPnRvdGFsX3NpemUgPSBsZW5ndGg7Ci0gICAgdG90YWxfcGFydHMgPSAobGVuZ3RoIC0gMSkgLyBYVFJBX0JMT0NLX1NJWkUgKyAxOwotICAgIHByZWRpY3RlZF9vcmJpdHNfZGF0YV9wdHItPnRvdGFsX3BhcnRzID0gdG90YWxfcGFydHM7Ci0KLSAgICBsZW5faW5qZWN0ZWQgPSAwOyAvLyBPIGJ5dGVzIGluamVjdGVkCi0gICAgaW9jdGxfZGF0YS5kaXNjID0gaW9jdGxfdHlwZTsKLQotICAgIC8vIFhUUkEgaW5qZWN0aW9uIHN0YXJ0cyB3aXRoIHBhcnQgMQotICAgIGZvciAocGFydCA9IDE7IHBhcnQgPD0gdG90YWxfcGFydHM7IHBhcnQrKykKLSAgICB7Ci0gICAgICAgIHByZWRpY3RlZF9vcmJpdHNfZGF0YV9wdHItPnBhcnQgPSBwYXJ0OwotICAgICAgICBwcmVkaWN0ZWRfb3JiaXRzX2RhdGFfcHRyLT5wYXJ0X2xlbiA9IFhUUkFfQkxPQ0tfU0laRTsKLSAgICAgICAgaWYgKFhUUkFfQkxPQ0tfU0laRSA+IChsZW5ndGggLSBsZW5faW5qZWN0ZWQpKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcmVkaWN0ZWRfb3JiaXRzX2RhdGFfcHRyLT5wYXJ0X2xlbiA9IGxlbmd0aCAtIGxlbl9pbmplY3RlZDsKLSAgICAgICAgfQotICAgICAgICBwcmVkaWN0ZWRfb3JiaXRzX2RhdGFfcHRyLT5kYXRhX3B0ci5kYXRhX3B0cl9sZW4gPSBwcmVkaWN0ZWRfb3JiaXRzX2RhdGFfcHRyLT5wYXJ0X2xlbjsKLSAgICAgICAgcHJlZGljdGVkX29yYml0c19kYXRhX3B0ci0+ZGF0YV9wdHIuZGF0YV9wdHJfdmFsID0gZGF0YSArIGxlbl9pbmplY3RlZDsKLQotICAgICAgICBMT0NfTE9HRCgicWN0X2xvY19lbmdfaW5qZWN0X3h0cmFfZGF0YSwgcGFydCAlZC8lZCwgbGVuID0gJWQsIHRvdGFsID0gJWRcbiIsCi0gICAgICAgICAgICAgICAgIHByZWRpY3RlZF9vcmJpdHNfZGF0YV9wdHItPnBhcnQsCi0gICAgICAgICAgICAgICAgIHRvdGFsX3BhcnRzLAotICAgICAgICAgICAgICAgICBwcmVkaWN0ZWRfb3JiaXRzX2RhdGFfcHRyLT5wYXJ0X2xlbiwKLSAgICAgICAgICAgICAgICAgbGVuX2luamVjdGVkKTsKLQotICAgICAgICBpZiAocGFydCA8IHRvdGFsX3BhcnRzKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBObyBjYWxsYmFjayBpbiB0aGlzIGNhc2UKLSAgICAgICAgICAgIHJwY19yZXRfdmFsID0gbG9jX2lvY3RsIChjbGllbnRfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvY3RsX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlvY3RsX2RhdGEpOwotCi0gICAgICAgICAgICBpZiAocnBjX3JldF92YWwgIT0gUlBDX0xPQ19BUElfU1VDQ0VTUykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBMT0NfTE9HRSgibG9jX2lvY3RsIGZvciB4dHJhIGVycm9yOiAlc1xuIiwgbG9jX2dldF9pb2N0bF9zdGF0dXNfbmFtZShycGNfcmV0X3ZhbCkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy9BZGQgYSBkZWxheSBvZiAxMCBtcyBzbyB0aGF0IHJlcGVhdGVkIFJQQyBjYWxscyBkb250IHN0YXJ2ZSB0aGUgbW9kZW0gcHJvY2Vzc29yCi0gICAgICAgICAgICB1c2xlZXAoMTAgKiAxMDAwKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIC8vIHBhcnQgPT0gdG90YWxfcGFydHMKLSAgICAgICAgewotICAgICAgICAgICAgLy8gTGFzdCBwYXJ0IGluamVjdGlvbiwgd2lsbCBuZWVkIHRvIHdhaXQgZm9yIGNhbGxiYWNrCi0gICAgICAgICAgICBpZiAoIWxvY19lbmdfaW9jdGwoY2xpZW50X2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb2N0bF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpb2N0bF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPQ19YVFJBX0lOSkVDVF9ERUZBVUxUX1RJTUVPVVQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcnBjX3JldF92YWwgPSBSUENfTE9DX0FQSV9HRU5FUkFMX0ZBSUxVUkU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsgLy8gZG9uZSB3aXRoIGluamVjdGlvbgotICAgICAgICB9Ci0KLSAgICAgICAgbGVuX2luamVjdGVkICs9IHByZWRpY3RlZF9vcmJpdHNfZGF0YV9wdHItPnBhcnRfbGVuOwotICAgICAgICBMT0NfTE9HRCgibG9jX2lvY3RsIFhUUkEgaW5qZWN0ZWQgbGVuZ3RoOiAlZFxuIiwgbGVuX2luamVjdGVkKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gY29udmVydEVycihycGNfcmV0X3ZhbCk7Ci19Ci0KLS8qIFJlcXVlc3QgdGhlIFh0cmEgU2VydmVyIFVybCBmcm9tIHRoZSBtb2RlbSAqLwotZW51bSBsb2NfYXBpX2FkYXB0ZXJfZXJyCi1Mb2NBcGlScGM6OnJlcXVlc3RYdHJhU2VydmVyKCkKLXsKLSAgICBsb2NfYXBpX2FkYXB0ZXJfZXJyICAgICAgICAgICBlcnI7Ci0gICAgcnBjX2xvY19pb2N0bF9kYXRhX3VfdHlwZSAgICAgZGF0YTsKLSAgICBycGNfbG9jX2lvY3RsX2NhbGxiYWNrX3NfdHlwZSBjYWxsYmFja19kYXRhOwotCi0gICAgZXJyID0gY29udmVydEVycihsb2NfZW5nX2lvY3RsKGNsaWVudF9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJQQ19MT0NfSU9DVExfUVVFUllfUFJFRElDVEVEX09SQklUU19EQVRBX1NPVVJDRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPQ19JT0NUTF9ERUZBVUxUX1RJTUVPVVQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjYWxsYmFja19kYXRhKSk7Ci0KLSAgICBpZiAoTE9DX0FQSV9BREFQVEVSX0VSUl9TVUNDRVNTICE9IGVycikKLSAgICB7Ci0gICAgICAgIExPQ19MT0dFKCJSUENfTE9DX0lPQ1RMX1FVRVJZX1BSRURJQ1RFRF9PUkJJVFNfREFUQV9TT1VSQ0UgZmFpbGVkITogZXJyPSVkXG4iLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBlbHNlIGlmIChSUENfTE9DX1NFU1NfU1RBVFVTX1NVQ0NFU1MgIT0gY2FsbGJhY2tfZGF0YS5zdGF0dXMpCi0gICAgewotICAgICAgICBMT0NfTE9HRSgiUlBDX0xPQ19JT0NUTF9RVUVSWV9QUkVESUNURURfT1JCSVRTX0RBVEFfU09VUkNFIGZhaWxlZCE6IHN0YXR1cz0lbGRcbiIsIGNhbGxiYWNrX2RhdGEuc3RhdHVzKTsKLSAgICAgICAgcmV0dXJuIExPQ19BUElfQURBUFRFUl9FUlJfR0VORVJBTF9GQUlMVVJFOwotICAgIH0KLSAgICBlbHNlIGlmIChSUENfTE9DX0lPQ1RMX1FVRVJZX1BSRURJQ1RFRF9PUkJJVFNfREFUQV9TT1VSQ0UgIT0gY2FsbGJhY2tfZGF0YS50eXBlKQotICAgIHsKLSAgICAgICAgTE9DX0xPR0UoIlJQQ19MT0NfSU9DVExfUVVFUllfUFJFRElDVEVEX09SQklUU19EQVRBX1NPVVJDRSBpcyBub3QgdGhlIHR5cGUgZXhwZWN0ZWQhIHR5cGU9JWRcbiIsIGNhbGxiYWNrX2RhdGEudHlwZSk7Ci0gICAgICAgIHJldHVybiBMT0NfQVBJX0FEQVBURVJfRVJSX0dFTkVSQUxfRkFJTFVSRTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoUlBDX0xPQ19JT0NUTF9RVUVSWV9QUkVESUNURURfT1JCSVRTX0RBVEFfU09VUkNFICE9IGNhbGxiYWNrX2RhdGEuZGF0YS5kaXNjKQotICAgIHsKLSAgICAgICAgTE9DX0xPR0UoIlJQQ19MT0NfSU9DVExfUVVFUllfUFJFRElDVEVEX09SQklUU19EQVRBX1NPVVJDRSBpcyBub3QgdGhlIGRpc2MgZXhwZWN0ZWQhIGRpc2M9JWRcbiIsIGNhbGxiYWNrX2RhdGEuZGF0YS5kaXNjKTsKLSAgICAgICAgcmV0dXJuIExPQ19BUElfQURBUFRFUl9FUlJfR0VORVJBTF9GQUlMVVJFOwotICAgIH0KLQotICAgIHJlcG9ydFh0cmFTZXJ2ZXIoY2FsbGJhY2tfZGF0YS5kYXRhLnJwY19sb2NfaW9jdGxfY2FsbGJhY2tfZGF0YV91X3R5cGVfdS4KLSAgICAgICAgICAgICAgICAgICAgIHByZWRpY3RlZF9vcmJpdHNfZGF0YV9zb3VyY2Uuc2VydmVyc1swXSwKLSAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrX2RhdGEuZGF0YS5ycGNfbG9jX2lvY3RsX2NhbGxiYWNrX2RhdGFfdV90eXBlX3UuCi0gICAgICAgICAgICAgICAgICAgICBwcmVkaWN0ZWRfb3JiaXRzX2RhdGFfc291cmNlLnNlcnZlcnNbMV0sCi0gICAgICAgICAgICAgICAgICAgICBjYWxsYmFja19kYXRhLmRhdGEucnBjX2xvY19pb2N0bF9jYWxsYmFja19kYXRhX3VfdHlwZV91LgotICAgICAgICAgICAgICAgICAgICAgcHJlZGljdGVkX29yYml0c19kYXRhX3NvdXJjZS5zZXJ2ZXJzWzJdLAotICAgICAgICAgICAgICAgICAgICAgMjU1KTsKLQotICAgIHJldHVybiBMT0NfQVBJX0FEQVBURVJfRVJSX1NVQ0NFU1M7Ci19Ci0KLWVudW0gbG9jX2FwaV9hZGFwdGVyX2VycgotTG9jQXBpUnBjOjphdGxPcGVuU3RhdHVzKGludCBoYW5kbGUsIGludCBpc19zdWNjLCBjaGFyKiBhcG4sIEFHcHNCZWFyZXJUeXBlIGJlYXJlciwgQUdwc1R5cGUgYWdwc1R5cGUpCi17Ci0gICAgcnBjX2xvY19zZXJ2ZXJfb3Blbl9zdGF0dXNfZV90eXBlIG9wZW5fc3RhdHVzID0gaXNfc3VjYyA/IFJQQ19MT0NfU0VSVkVSX09QRU5fU1VDQ0VTUyA6IFJQQ19MT0NfU0VSVkVSX09QRU5fRkFJTDsKLSAgIHJwY19sb2NfaW9jdGxfZGF0YV91X3R5cGUgICAgICAgICAgIGlvY3RsX2RhdGE7Ci0KLSAgICBpZiAoQUdQU19UWVBFX0lOVkFMSUQgPT0gYWdwc1R5cGUpIHsKLSAgICAgICAgcnBjX2xvY19zZXJ2ZXJfb3Blbl9zdGF0dXNfc190eXBlICAqY29ubl9vcGVuX3N0YXR1c19wdHIgPQotICAgICAgICAgICAgJmlvY3RsX2RhdGEucnBjX2xvY19pb2N0bF9kYXRhX3VfdHlwZV91LmNvbm5fb3Blbl9zdGF0dXM7Ci0KLSAgICAgICAgLy8gRmlsbCBpbiBkYXRhCi0gICAgICAgIGlvY3RsX2RhdGEuZGlzYyA9IFJQQ19MT0NfSU9DVExfSU5GT1JNX1NFUlZFUl9PUEVOX1NUQVRVUzsKLSAgICAgICAgY29ubl9vcGVuX3N0YXR1c19wdHItPmNvbm5faGFuZGxlID0gaGFuZGxlOwotICAgICAgICBjb25uX29wZW5fc3RhdHVzX3B0ci0+b3Blbl9zdGF0dXMgPSBvcGVuX3N0YXR1czsKLSNpZiAoQU1TU19WRVJTSU9OPT0zMjAwKQotICAgICAgICBjb25uX29wZW5fc3RhdHVzX3B0ci0+YXBuX25hbWUgPSBhcG47IC8qIHJlcXVpcmVzIEFQTiAqLwotI2Vsc2UKLSAgICAgICAgaWYgKGlzX3N1Y2MpIHsKLSAgICAgICAgICAgIHN0cmxjcHkoY29ubl9vcGVuX3N0YXR1c19wdHItPmFwbl9uYW1lLCBhcG4sCi0gICAgICAgICAgICAgICAgICAgIHNpemVvZiBjb25uX29wZW5fc3RhdHVzX3B0ci0+YXBuX25hbWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY29ubl9vcGVuX3N0YXR1c19wdHItPmFwbl9uYW1lWzBdID0gMDsKLSAgICAgICAgfQotI2VuZGlmIC8qICNpZiAoQU1TU19WRVJTSU9OPT0zMjAwKSAqLwotCi0gICAgICAgIExPQ19MT0dEKCJBVEwgUlBDX0xPQ19JT0NUTF9JTkZPUk1fU0VSVkVSX09QRU5fU1RBVFVTIG9wZW4gJXMsIEFQTiBuYW1lID0gWyVzXVxuIiwKLSAgICAgICAgICAgICAgICAgbG9nX3N1Y2NfZmFpbF9zdHJpbmcoaXNfc3VjYyksCi0gICAgICAgICAgICAgICAgIGFwbik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcnBjX2xvY19zZXJ2ZXJfbXVsdGlfb3Blbl9zdGF0dXNfc190eXBlICAqY29ubl9tdWx0aV9vcGVuX3N0YXR1c19wdHIgPQotICAgICAgICAgICAgJmlvY3RsX2RhdGEucnBjX2xvY19pb2N0bF9kYXRhX3VfdHlwZV91Lm11bHRpX2Nvbm5fb3Blbl9zdGF0dXM7Ci0KLSAgICAgICAgLy8gRmlsbCBpbiBkYXRhCi0gICAgICAgIGlvY3RsX2RhdGEuZGlzYyA9IFJQQ19MT0NfSU9DVExfSU5GT1JNX1NFUlZFUl9NVUxUSV9PUEVOX1NUQVRVUzsKLSAgICAgICAgY29ubl9tdWx0aV9vcGVuX3N0YXR1c19wdHItPmNvbm5faGFuZGxlID0gaGFuZGxlOwotICAgICAgICBjb25uX211bHRpX29wZW5fc3RhdHVzX3B0ci0+b3Blbl9zdGF0dXMgPSBvcGVuX3N0YXR1czsKLSAgICAgICAgaWYgKGlzX3N1Y2MpIHsKLSAgICAgICAgICAgIHN0cmxjcHkoY29ubl9tdWx0aV9vcGVuX3N0YXR1c19wdHItPmFwbl9uYW1lLCBhcG4sCi0gICAgICAgICAgICAgICAgICAgIHNpemVvZiBjb25uX211bHRpX29wZW5fc3RhdHVzX3B0ci0+YXBuX25hbWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY29ubl9tdWx0aV9vcGVuX3N0YXR1c19wdHItPmFwbl9uYW1lWzBdID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIHN3aXRjaChiZWFyZXIpCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSBBR1BTX0FQTl9CRUFSRVJfSVBWNDoKLSAgICAgICAgICAgIGNvbm5fbXVsdGlfb3Blbl9zdGF0dXNfcHRyLT5wZHBfdHlwZSA9IFJQQ19MT0NfU0VSVkVSX1BEUF9JUDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEFHUFNfQVBOX0JFQVJFUl9JUFY2OgotICAgICAgICAgICAgY29ubl9tdWx0aV9vcGVuX3N0YXR1c19wdHItPnBkcF90eXBlID0gUlBDX0xPQ19TRVJWRVJfUERQX0lQVjY7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBBR1BTX0FQTl9CRUFSRVJfSVBWNFY2OgotICAgICAgICAgICAgY29ubl9tdWx0aV9vcGVuX3N0YXR1c19wdHItPnBkcF90eXBlID0gUlBDX0xPQ19TRVJWRVJfUERQX0lQVjRWNjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgY29ubl9tdWx0aV9vcGVuX3N0YXR1c19wdHItPnBkcF90eXBlID0gUlBDX0xPQ19TRVJWRVJfUERQX1BQUDsKLSAgICAgICAgfQotCi0gICAgICAgIExPQ19MT0dEKCJBVEwgUlBDX0xPQ19JT0NUTF9JTkZPUk1fU0VSVkVSX01VTFRJX09QRU5fU1RBVFVTIG9wZW4gJXMsIEFQTiBuYW1lID0gWyVzXSwgcGRwX3R5cGUgPSAlZFxuIiwKLSAgICAgICAgICAgICAgICAgbG9nX3N1Y2NfZmFpbF9zdHJpbmcoaXNfc3VjYyksCi0gICAgICAgICAgICAgICAgIGFwbiwKLSAgICAgICAgICAgICAgICAgY29ubl9tdWx0aV9vcGVuX3N0YXR1c19wdHItPnBkcF90eXBlKTsKLSAgICB9Ci0KLSAgICAvLyBNYWtlIHRoZSBJT0NUTCBjYWxsCi0gICAgcmV0dXJuIGNvbnZlcnRFcnIoCi0gICAgICAgIGxvY19lbmdfaW9jdGwoY2xpZW50X2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICBpb2N0bF9kYXRhLmRpc2MsCi0gICAgICAgICAgICAgICAgICAgICAgJmlvY3RsX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgTE9DX0lPQ1RMX0RFRkFVTFRfVElNRU9VVCwKLSAgICAgICAgICAgICAgICAgICAgICBOVUxMKQotICAgICAgICApOwotfQotCi1lbnVtIGxvY19hcGlfYWRhcHRlcl9lcnIKLUxvY0FwaVJwYzo6YXRsQ2xvc2VTdGF0dXMoaW50IGhhbmRsZSwgaW50IGlzX3N1Y2MpCi17Ci0gICAgcnBjX2xvY19pb2N0bF9kYXRhX3VfdHlwZSAgICAgICAgICAgaW9jdGxfZGF0YTsKLSAgICBpb2N0bF9kYXRhLmRpc2MgPSBSUENfTE9DX0lPQ1RMX0lORk9STV9TRVJWRVJfQ0xPU0VfU1RBVFVTOwotCi0gICAgcnBjX2xvY19zZXJ2ZXJfY2xvc2Vfc3RhdHVzX3NfdHlwZSAqY29ubl9jbG9zZV9zdGF0dXNfcHRyID0KLSAgICAgICAgJmlvY3RsX2RhdGEucnBjX2xvY19pb2N0bF9kYXRhX3VfdHlwZV91LmNvbm5fY2xvc2Vfc3RhdHVzOwotICAgIGNvbm5fY2xvc2Vfc3RhdHVzX3B0ci0+Y29ubl9oYW5kbGUgPSBoYW5kbGU7Ci0gICAgY29ubl9jbG9zZV9zdGF0dXNfcHRyLT5jbG9zZV9zdGF0dXMgPSBpc19zdWNjID8gUlBDX0xPQ19TRVJWRVJfQ0xPU0VfU1VDQ0VTUyA6IFJQQ19MT0NfU0VSVkVSX0NMT1NFX0ZBSUw7Ci0KLSAgICAvLyBNYWtlIHRoZSBJT0NUTCBjYWxsCi0gICAgcmV0dXJuIGNvbnZlcnRFcnIoCi0gICAgICAgIGxvY19lbmdfaW9jdGwoY2xpZW50X2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICBpb2N0bF9kYXRhLmRpc2MsCi0gICAgICAgICAgICAgICAgICAgICAgJmlvY3RsX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgTE9DX0lPQ1RMX0RFRkFVTFRfVElNRU9VVCwKLSAgICAgICAgICAgICAgICAgICAgICBOVUxMKQotICAgICAgICApOwotfQotCi12b2lkIExvY0FwaVJwYzo6QVRMRXZlbnQoY29uc3QgcnBjX2xvY19zZXJ2ZXJfcmVxdWVzdF9zX3R5cGUgKnNlcnZlcl9yZXF1ZXN0X3B0cikKLXsKLSAgICBpbnQgY29ubkhhbmRsZTsKLSAgICBBR3BzVHlwZSBhZ3BzX3R5cGU7Ci0KLSAgICBMT0NfTE9HVigiUlBDX0xPQ19FVkVOVF9BU1NJU1RBTkNFX0RBVEFfUkVRVUVTVCBldmVudCAlcykiLAotICAgICAgICAgICAgIGxvY19nZXRfZXZlbnRfYXRsX29wZW5fbmFtZShzZXJ2ZXJfcmVxdWVzdF9wdHItPmV2ZW50KSk7Ci0gICAgc3dpdGNoIChzZXJ2ZXJfcmVxdWVzdF9wdHItPmV2ZW50KQotICAgIHsKLSAgICBjYXNlIFJQQ19MT0NfU0VSVkVSX1JFUVVFU1RfTVVMVElfT1BFTjoKLSAgICAgICAgY29ubkhhbmRsZSA9IHNlcnZlcl9yZXF1ZXN0X3B0ci0+cGF5bG9hZC5ycGNfbG9jX3NlcnZlcl9yZXF1ZXN0X3VfdHlwZV91Lm11bHRpX29wZW5fcmVxLmNvbm5faGFuZGxlOwotICAgICAgICBpZiAoc2VydmVyX3JlcXVlc3RfcHRyLT5wYXlsb2FkLnJwY19sb2Nfc2VydmVyX3JlcXVlc3RfdV90eXBlX3UubXVsdGlfb3Blbl9yZXEuY29ubmVjdGlvbl90eXBlCi0gICAgICAgICAgICA9PSBSUENfTE9DX1NFUlZFUl9DT05ORUNUSU9OX0xCUykgewotICAgICAgICAgICAgYWdwc190eXBlID0gQUdQU19UWVBFX1NVUEw7Ci0gICAgICAgICAgICBMT0NfTE9HVigiQVRMRXZlbnQ6IGV2ZW50IC0gUlBDX0xPQ19TRVJWRVJfUkVRVUVTVF9NVUxUSV9PUEVOXG4gICAgICAgICAgICB0eXBlIC0gQUdQU19UWVBFX1NVUExcbiAgICAgICAgICAgIGhhbmRsZSAtICVkIiwgY29ubkhhbmRsZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhZ3BzX3R5cGUgPSBBR1BTX1RZUEVfV1dBTl9BTlk7Ci0gICAgICAgICAgICBMT0NfTE9HVigiQVRMRXZlbnQ6IGV2ZW50IC0gUlBDX0xPQ19TRVJWRVJfUkVRVUVTVF9NVUxUSV9PUEVOXG4gICAgICAgICAgICB0eXBlIC0gQUdQU19UWVBFX1dXQU5fQU5ZXG4gICAgICAgICAgICBoYW5kbGUgLSAlZCIsIGNvbm5IYW5kbGUpOwotICAgICAgICB9Ci0gICAgICAgIHJlcXVlc3RBVEwoY29ubkhhbmRsZSwgYWdwc190eXBlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSUENfTE9DX1NFUlZFUl9SRVFVRVNUX09QRU46Ci0gICAgICAgIGNvbm5IYW5kbGUgPSBzZXJ2ZXJfcmVxdWVzdF9wdHItPnBheWxvYWQucnBjX2xvY19zZXJ2ZXJfcmVxdWVzdF91X3R5cGVfdS5vcGVuX3JlcS5jb25uX2hhbmRsZTsKLSAgICAgICAgTE9DX0xPR1YoIkFUTEV2ZW50OiBldmVudCAtIFJQQ19MT0NfU0VSVkVSX1JFUVVFU1RfT1BFTlxuICAgICAgICAgICAgaGFuZGxlIC0gJWQiLCBjb25uSGFuZGxlKTsKLSAgICAgICAgcmVxdWVzdEFUTChjb25uSGFuZGxlLCBBR1BTX1RZUEVfSU5WQUxJRCk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUlBDX0xPQ19TRVJWRVJfUkVRVUVTVF9DTE9TRToKLSAgICAgICAgY29ubkhhbmRsZSA9IHNlcnZlcl9yZXF1ZXN0X3B0ci0+cGF5bG9hZC5ycGNfbG9jX3NlcnZlcl9yZXF1ZXN0X3VfdHlwZV91LmNsb3NlX3JlcS5jb25uX2hhbmRsZTsKLSAgICAgICAgTE9DX0xPR1YoIkFUTEV2ZW50OiBldmVudCAtIFJQQ19MT0NfU0VSVkVSX1JFUVVFU1RfQ0xPU0VcbiAgICAgICAgICAgIGhhbmRsZSAtICVkIiwgY29ubkhhbmRsZSk7Ci0gICAgICAgIHJlbGVhc2VBVEwoY29ubkhhbmRsZSk7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIExPQ19MT0dFKCJBVExFdmVudDogZXZlbnQgdHlwZSAlZCBpbnZhbGlkIiwgc2VydmVyX3JlcXVlc3RfcHRyLT5ldmVudCk7Ci0gICB9Ci19Ci0KLXZvaWQgTG9jQXBpUnBjOjpOSUV2ZW50KGNvbnN0IHJwY19sb2NfbmlfZXZlbnRfc190eXBlICpuaV9yZXEpCi17Ci0gICAgR3BzTmlOb3RpZmljYXRpb24gbm90aWYgPSB7MH07Ci0KLSAgICBzd2l0Y2ggKG5pX3JlcS0+ZXZlbnQpCi0gICAgewotICAgIGNhc2UgUlBDX0xPQ19OSV9FVkVOVF9WWF9OT1RJRllfVkVSSUZZX1JFUToKLSAgICB7Ci0gICAgICAgIGNvbnN0IHJwY19sb2Nfbmlfdnhfbm90aWZ5X3ZlcmlmeV9yZXFfc190eXBlICp2eF9yZXEgPQotICAgICAgICAgICAgJm5pX3JlcS0+cGF5bG9hZC5ycGNfbG9jX25pX2V2ZW50X3BheWxvYWRfdV90eXBlX3UudnhfcmVxOwotICAgICAgICBMT0NfTE9HSSgiVlggTm90aWZpY2F0aW9uIik7Ci0gICAgICAgIG5vdGlmLm5pX3R5cGUgPSBHUFNfTklfVFlQRV9WT0lDRTsKLSAgICAgICAgLy8gUmVxdWVzdG9yIElECi0gICAgICAgIGhleGNvZGUobm90aWYucmVxdWVzdG9yX2lkLCBzaXplb2Ygbm90aWYucmVxdWVzdG9yX2lkLAotICAgICAgICAgICAgICAgIHZ4X3JlcS0+cmVxdWVzdGVyX2lkLnJlcXVlc3Rlcl9pZCwKLSAgICAgICAgICAgICAgICB2eF9yZXEtPnJlcXVlc3Rlcl9pZC5yZXF1ZXN0ZXJfaWRfbGVuZ3RoKTsKLSAgICAgICAgbm90aWYudGV4dF9lbmNvZGluZyA9IDA7IC8vIE5vIHRleHQgYW5kIG5vIGVuY29kaW5nCi0gICAgICAgIG5vdGlmLnJlcXVlc3Rvcl9pZF9lbmNvZGluZyA9IGNvbnZlcnROaUVuY29kaW5nVHlwZSh2eF9yZXEtPmVuY29kaW5nX3NjaGVtZSk7Ci0gICAgICAgIE5JRXZlbnRGaWxsVmVyZml5VHlwZShub3RpZiwgdnhfcmVxLT5ub3RpZmljYXRpb25fcHJpdl90eXBlKTsKLSAgICB9Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSUENfTE9DX05JX0VWRU5UX1VNVFNfQ1BfTk9USUZZX1ZFUklGWV9SRVE6Ci0gICAgewotICAgICAgICBjb25zdCBycGNfbG9jX25pX3VtdHNfY3Bfbm90aWZ5X3ZlcmlmeV9yZXFfc190eXBlICp1bXRzX2NwX3JlcSA9Ci0gICAgICAgICAgICAmbmlfcmVxLT5wYXlsb2FkLnJwY19sb2NfbmlfZXZlbnRfcGF5bG9hZF91X3R5cGVfdS51bXRzX2NwX3JlcTsKLSAgICAgICAgTE9DX0xPR0koIlVNVFMgQ1AgTm90aWZpY2F0aW9uXG4iKTsKLSAgICAgICAgbm90aWYubmlfdHlwZT0gR1BTX05JX1RZUEVfVU1UU19DVFJMX1BMQU5FOyAgICAgICAgIC8vIFN0b3JlcyBub3RpZmljYXRpb24gdGV4dAotI2lmIChBTVNTX1ZFUlNJT049PTMyMDApCi0gICAgICAgIGhleGNvZGUobm90aWYudGV4dCwgc2l6ZW9mIG5vdGlmLnRleHQsCi0gICAgICAgICAgICAgICAgdW10c19jcF9yZXEtPm5vdGlmaWNhdGlvbl90ZXh0Lm5vdGlmaWNhdGlvbl90ZXh0X3ZhbCwKLSAgICAgICAgICAgICAgICB1bXRzX2NwX3JlcS0+bm90aWZpY2F0aW9uX2xlbmd0aCk7Ci0gICAgICAgIGhleGNvZGUobm90aWYucmVxdWVzdG9yX2lkLCBzaXplb2Ygbm90aWYucmVxdWVzdG9yX2lkLAotICAgICAgICAgICAgICAgIHVtdHNfY3BfcmVxLT5yZXF1ZXN0b3JfaWQucmVxdWVzdG9yX2lkX3N0cmluZy5yZXF1ZXN0b3JfaWRfc3RyaW5nX3ZhbCwKLSAgICAgICAgICAgICAgICB1bXRzX2NwX3JlcS0+cmVxdWVzdG9yX2lkLnN0cmluZ19sZW4pOwotI2Vsc2UKLSAgICAgICAgaGV4Y29kZShub3RpZi50ZXh0LCBzaXplb2Ygbm90aWYudGV4dCwKLSAgICAgICAgICAgICAgICB1bXRzX2NwX3JlcS0+bm90aWZpY2F0aW9uX3RleHQsCi0gICAgICAgICAgICAgICAgdW10c19jcF9yZXEtPm5vdGlmaWNhdGlvbl9sZW5ndGgpOwotICAgICAgICBoZXhjb2RlKG5vdGlmLnJlcXVlc3Rvcl9pZCwgc2l6ZW9mIG5vdGlmLnJlcXVlc3Rvcl9pZCwKLSAgICAgICAgICAgICAgICB1bXRzX2NwX3JlcS0+cmVxdWVzdG9yX2lkLnJlcXVlc3Rvcl9pZF9zdHJpbmcsCi0gICAgICAgICAgICAgICAgdW10c19jcF9yZXEtPnJlcXVlc3Rvcl9pZC5zdHJpbmdfbGVuKTsKLSNlbmRpZgotICAgICAgICBub3RpZi50ZXh0X2VuY29kaW5nID0gY29udmVydE5pRW5jb2RpbmdUeXBlKHVtdHNfY3BfcmVxLT5kYXRhY29kaW5nX3NjaGVtZSk7Ci0gICAgICAgIG5vdGlmLnJlcXVlc3Rvcl9pZF9lbmNvZGluZyA9IG5vdGlmLnRleHRfZW5jb2Rpbmc7Ci0gICAgICAgIE5JRXZlbnRGaWxsVmVyZml5VHlwZShub3RpZiwgdW10c19jcF9yZXEtPm5vdGlmaWNhdGlvbl9wcml2X3R5cGUpOwotCi0gICAgICAgIC8vIExDUyBhZGRyZXNzICh1c2luZyBleHRyYXMgZmllbGQpCi0gICAgICAgIGlmICh1bXRzX2NwX3JlcS0+ZXh0X2NsaWVudF9hZGRyZXNzX2RhdGEuZXh0X2NsaWVudF9hZGRyZXNzX2xlbiAhPSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBDb3B5IExDUyBBZGRyZXNzIGludG8gbm90aWYuZXh0cmFzIGluIHRoZSBmb3JtYXQ6IEFkZHJlc3MgPSAwMTIzNDUKLSAgICAgICAgICAgIHN0cmxjYXQobm90aWYuZXh0cmFzLCBMT0NfTklfTk9USUZfS0VZX0FERFJFU1MsIHNpemVvZiBub3RpZi5leHRyYXMpOwotICAgICAgICAgICAgc3RybGNhdChub3RpZi5leHRyYXMsICIgPSAiLCBzaXplb2Ygbm90aWYuZXh0cmFzKTsKLSAgICAgICAgICAgIGludCBhZGRyX2xlbiA9IDA7Ci0gICAgICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzX3NvdXJjZSA9IE5VTEw7Ci0KLSNpZiAoQU1TU19WRVJTSU9OPT0zMjAwKQotICAgICAgICAgICAgYWRkcmVzc19zb3VyY2UgPSB1bXRzX2NwX3JlcS0+ZXh0X2NsaWVudF9hZGRyZXNzX2RhdGEuZXh0X2NsaWVudF9hZGRyZXNzLmV4dF9jbGllbnRfYWRkcmVzc192YWw7Ci0jZWxzZQotICAgICAgICAgICAgYWRkcmVzc19zb3VyY2UgPSB1bXRzX2NwX3JlcS0+ZXh0X2NsaWVudF9hZGRyZXNzX2RhdGEuZXh0X2NsaWVudF9hZGRyZXNzOwotI2VuZGlmIC8qICNpZiAoQU1TU19WRVJTSU9OPT0zMjAwKSAqLwotCi0gICAgICAgICAgICBjaGFyIGxjc19hZGRyWzMyXTsgLy8gRGVjb2RlZCBMQ1MgYWRkcmVzcyBmb3IgVU1UUyBDUCBOSQotICAgICAgICAgICAgYWRkcl9sZW4gPSBkZWNvZGVBZGRyZXNzKGxjc19hZGRyLCBzaXplb2YgbGNzX2FkZHIsIGFkZHJlc3Nfc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVtdHNfY3BfcmVxLT5leHRfY2xpZW50X2FkZHJlc3NfZGF0YS5leHRfY2xpZW50X2FkZHJlc3NfbGVuKTsKLQotICAgICAgICAgICAgLy8gVGhlIGFkZHJlc3MgaXMgQVNDSUkgc3RyaW5nCi0gICAgICAgICAgICBpZiAoYWRkcl9sZW4pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RybGNhdChub3RpZi5leHRyYXMsIGxjc19hZGRyLCBzaXplb2Ygbm90aWYuZXh0cmFzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJQQ19MT0NfTklfRVZFTlRfU1VQTF9OT1RJRllfVkVSSUZZX1JFUToKLSAgICB7Ci0gICAgICAgIGNvbnN0IHJwY19sb2Nfbmlfc3VwbF9ub3RpZnlfdmVyaWZ5X3JlcV9zX3R5cGUgKnN1cGxfcmVxID0KLSAgICAgICAgICAgICZuaV9yZXEtPnBheWxvYWQucnBjX2xvY19uaV9ldmVudF9wYXlsb2FkX3VfdHlwZV91LnN1cGxfcmVxOwotICAgICAgICBMT0NfTE9HSSgiU1VQTCBOb3RpZmljYXRpb25cbiIpOwotICAgICAgICBub3RpZi5uaV90eXBlID0gR1BTX05JX1RZUEVfVU1UU19TVVBMOwotCi0gICAgICAgIGlmIChzdXBsX3JlcS0+ZmxhZ3MgJiBSUENfTE9DX05JX0NMSUVOVF9OQU1FX1BSRVNFTlQpCi0gICAgICAgIHsKLSNpZiAoQU1TU19WRVJTSU9OPT0zMjAwKQotICAgICAgICAgICAgaGV4Y29kZShub3RpZi50ZXh0LCBzaXplb2Ygbm90aWYudGV4dCwKLSAgICAgICAgICAgICAgICAgICAgc3VwbF9yZXEtPmNsaWVudF9uYW1lLmNsaWVudF9uYW1lX3N0cmluZy5jbGllbnRfbmFtZV9zdHJpbmdfdmFsLCAgIC8qIGJ1ZmZlciAqLwotICAgICAgICAgICAgICAgICAgICBzdXBsX3JlcS0+Y2xpZW50X25hbWUuc3RyaW5nX2xlbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGVuZ3RoICovCi0gICAgICAgICAgICApOwotI2Vsc2UKLSAgICAgICAgICAgIGhleGNvZGUobm90aWYudGV4dCwgc2l6ZW9mIG5vdGlmLnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwbF9yZXEtPmNsaWVudF9uYW1lLmNsaWVudF9uYW1lX3N0cmluZywgICAvKiBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBsX3JlcS0+Y2xpZW50X25hbWUuc3RyaW5nX2xlbiAgICAgICAgICAgIC8qIGxlbmd0aCAqLwotICAgICAgICAgICAgKTsKLSNlbmRpZiAvKiAjaWYgKEFNU1NfVkVSU0lPTj09MzIwMCkgKi8KLSAgICAgICAgICAgIExPQ19MT0dWKCJTVVBMIE5JOiBjbGllbnRfbmFtZTogJXMgbGVuPSVkIiwgbm90aWYudGV4dCwgc3VwbF9yZXEtPmNsaWVudF9uYW1lLnN0cmluZ19sZW4pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgTE9DX0xPR1YoIlNVUEwgTkk6IGNsaWVudF9uYW1lIG5vdCBwcmVzZW50LiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUmVxdWVzdG9yIElECi0gICAgICAgIGlmIChzdXBsX3JlcS0+ZmxhZ3MgJiBSUENfTE9DX05JX1JFUVVFU1RPUl9JRF9QUkVTRU5UKQotICAgICAgICB7Ci0jaWYgKEFNU1NfVkVSU0lPTj09MzIwMCkKLSAgICAgICAgICAgIGhleGNvZGUobm90aWYucmVxdWVzdG9yX2lkLCBzaXplb2Ygbm90aWYucmVxdWVzdG9yX2lkLAotICAgICAgICAgICAgICAgICAgICBzdXBsX3JlcS0+cmVxdWVzdG9yX2lkLnJlcXVlc3Rvcl9pZF9zdHJpbmcucmVxdWVzdG9yX2lkX3N0cmluZ192YWwsICAvKiBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgc3VwbF9yZXEtPnJlcXVlc3Rvcl9pZC5zdHJpbmdfbGVuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGVuZ3RoICovCi0gICAgICAgICAgICAgICAgKTsKLSNlbHNlCi0gICAgICAgICAgICBoZXhjb2RlKG5vdGlmLnJlcXVlc3Rvcl9pZCwgc2l6ZW9mIG5vdGlmLnJlcXVlc3Rvcl9pZCwKLSAgICAgICAgICAgICAgICAgICAgc3VwbF9yZXEtPnJlcXVlc3Rvcl9pZC5yZXF1ZXN0b3JfaWRfc3RyaW5nLCAgLyogYnVmZmVyICovCi0gICAgICAgICAgICAgICAgICAgIHN1cGxfcmVxLT5yZXF1ZXN0b3JfaWQuc3RyaW5nX2xlbiAgICAgICAgICAgIC8qIGxlbmd0aCAqLwotICAgICAgICAgICAgICAgICk7Ci0jZW5kaWYgLyogI2lmIChBTVNTX1ZFUlNJT049PTMyMDApICovCi0gICAgICAgICAgICBMT0NfTE9HVigiU1VQTCBOSTogcmVxdWVzdG9yX2lkOiAlcyBsZW49JWQiLCBub3RpZi5yZXF1ZXN0b3JfaWQsIHN1cGxfcmVxLT5yZXF1ZXN0b3JfaWQuc3RyaW5nX2xlbik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBMT0NfTE9HVigiU1VQTCBOSTogcmVxdWVzdG9yX2lkIG5vdCBwcmVzZW50LiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gRW5jb2RpbmcgdHlwZQotICAgICAgICBpZiAoc3VwbF9yZXEtPmZsYWdzICYgUlBDX0xPQ19OSV9FTkNPRElOR19UWVBFX1BSRVNFTlQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG5vdGlmLnRleHRfZW5jb2RpbmcgPSBjb252ZXJ0TmlFbmNvZGluZ1R5cGUoc3VwbF9yZXEtPmRhdGFjb2Rpbmdfc2NoZW1lKTsKLSAgICAgICAgICAgIG5vdGlmLnJlcXVlc3Rvcl9pZF9lbmNvZGluZyA9IG5vdGlmLnRleHRfZW5jb2Rpbmc7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBub3RpZi50ZXh0X2VuY29kaW5nID0gbm90aWYucmVxdWVzdG9yX2lkX2VuY29kaW5nID0gR1BTX0VOQ19VTktOT1dOOwotICAgICAgICB9Ci0KLSAgICAgICAgTklFdmVudEZpbGxWZXJmaXlUeXBlKG5vdGlmLCBuaV9yZXEtPnBheWxvYWQucnBjX2xvY19uaV9ldmVudF9wYXlsb2FkX3VfdHlwZV91LnN1cGxfcmVxLm5vdGlmaWNhdGlvbl9wcml2X3R5cGUpOwotICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgICBMT0NfTE9HRSgiVW5rbm93biBOSSBldmVudDogJXhcbiIsIChpbnQpIG5pX3JlcS0+ZXZlbnQpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gdGhpcyBjb3B5IHdpbGwgZ2V0IGZyZWVkIGluIGxvY19lbmdfbmkgd2hlbiBsb2NfbmlfcmVzcG9uZCgpIGlzIGNhbGxlZAotICAgIHJwY19sb2NfbmlfZXZlbnRfc190eXBlICpjb3B5ID0gKHJwY19sb2NfbmlfZXZlbnRfc190eXBlICopbWFsbG9jKHNpemVvZigqY29weSkpOwotICAgIG1lbWNweShjb3B5LCBuaV9yZXEsIHNpemVvZigqY29weSkpOwotICAgIHJlcXVlc3ROaU5vdGlmeShub3RpZiwgKGNvbnN0IHZvaWQqKWNvcHkpOwotfQotCi1pbnQgTG9jQXBpUnBjOjpOSUV2ZW50RmlsbFZlcmZpeVR5cGUoR3BzTmlOb3RpZmljYXRpb24gJm5vdGlmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBycGNfbG9jX25pX25vdGlmeV92ZXJpZnlfZV90eXBlIG5vdGlmX3ByaXYpCi17Ci0gICBzd2l0Y2ggKG5vdGlmX3ByaXYpCi0gICB7Ci0gICBjYXNlIFJQQ19MT0NfTklfVVNFUl9OT19OT1RJRllfTk9fVkVSSUZZOgotICAgICAgIG5vdGlmLm5vdGlmeV9mbGFncyA9IDA7Ci0gICAgICAgbm90aWYuZGVmYXVsdF9yZXNwb25zZSA9IEdQU19OSV9SRVNQT05TRV9OT1JFU1A7Ci0gICAgICAgcmV0dXJuIDE7Ci0gICBjYXNlIFJQQ19MT0NfTklfVVNFUl9OT1RJRllfT05MWToKLSAgICAgICBub3RpZi5ub3RpZnlfZmxhZ3MgPSBHUFNfTklfTkVFRF9OT1RJRlk7Ci0gICAgICAgbm90aWYuZGVmYXVsdF9yZXNwb25zZSA9IEdQU19OSV9SRVNQT05TRV9OT1JFU1A7Ci0gICAgICAgcmV0dXJuIDE7Ci0gICBjYXNlIFJQQ19MT0NfTklfVVNFUl9OT1RJRllfVkVSSUZZX0FMTE9XX05PX1JFU1A6Ci0gICAgICAgbm90aWYubm90aWZ5X2ZsYWdzID0gR1BTX05JX05FRURfTk9USUZZIHwgR1BTX05JX05FRURfVkVSSUZZOwotICAgICAgIG5vdGlmLmRlZmF1bHRfcmVzcG9uc2UgPSBHUFNfTklfUkVTUE9OU0VfQUNDRVBUOwotICAgICAgIHJldHVybiAxOwotICAgY2FzZSBSUENfTE9DX05JX1VTRVJfTk9USUZZX1ZFUklGWV9OT1RfQUxMT1dfTk9fUkVTUDoKLSAgICAgICBub3RpZi5ub3RpZnlfZmxhZ3MgPSBHUFNfTklfTkVFRF9OT1RJRlkgfCBHUFNfTklfTkVFRF9WRVJJRlk7Ci0gICAgICAgbm90aWYuZGVmYXVsdF9yZXNwb25zZSA9IEdQU19OSV9SRVNQT05TRV9ERU5ZOwotICAgICAgIHJldHVybiAxOwotICAgY2FzZSBSUENfTE9DX05JX1VTRVJfUFJJVkFDWV9PVkVSUklERToKLSAgICAgICBub3RpZi5ub3RpZnlfZmxhZ3MgPSBHUFNfTklfUFJJVkFDWV9PVkVSUklERTsKLSAgICAgICBub3RpZi5kZWZhdWx0X3Jlc3BvbnNlID0gR1BTX05JX1JFU1BPTlNFX05PUkVTUDsKLSAgICAgICByZXR1cm4gMTsKLSAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgIH0KLX0KLQotZW51bSBsb2NfYXBpX2FkYXB0ZXJfZXJyCi1Mb2NBcGlScGM6OnNldFNVUExWZXJzaW9uKHVpbnQzMl90IHZlcnNpb24pCi17Ci0gICBycGNfbG9jX2lvY3RsX2RhdGFfdV90eXBlIGlvY3RsX2RhdGEgPSB7UlBDX0xPQ19JT0NUTF9TRVRfU1VQTF9WRVJTSU9OLCB7MH19OwotICAgaW9jdGxfZGF0YS5ycGNfbG9jX2lvY3RsX2RhdGFfdV90eXBlX3Uuc3VwbF92ZXJzaW9uID0gKGludCl2ZXJzaW9uOwotICAgcmV0dXJuIGNvbnZlcnRFcnIoCi0gICAgICAgbG9jX2VuZ19pb2N0bCAoY2xpZW50X2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICBSUENfTE9DX0lPQ1RMX1NFVF9TVVBMX1ZFUlNJT04sCi0gICAgICAgICAgICAgICAgICAgICAgJmlvY3RsX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgTE9DX0lPQ1RMX0RFRkFVTFRfVElNRU9VVCwKLSAgICAgICAgICAgICAgICAgICAgICBOVUxMKQotICAgICAgICk7Ci19Ci0KLUdwc05pRW5jb2RpbmdUeXBlIExvY0FwaVJwYzo6Y29udmVydE5pRW5jb2RpbmdUeXBlKGludCBsb2NfZW5jb2RpbmcpCi17Ci0gICBzd2l0Y2ggKGxvY19lbmNvZGluZykKLSAgIHsKLSAgIGNhc2UgUlBDX0xPQ19OSV9TVVBMX1VURjg6Ci0gICAgICAgcmV0dXJuIEdQU19FTkNfU1VQTF9VVEY4OwotICAgY2FzZSBSUENfTE9DX05JX1NVUExfVUNTMjoKLSAgICAgICByZXR1cm4gR1BTX0VOQ19TVVBMX1VDUzI7Ci0gICBjYXNlIFJQQ19MT0NfTklfU1VQTF9HU01fREVGQVVMVDoKLSAgICAgIHJldHVybiBHUFNfRU5DX1NVUExfR1NNX0RFRkFVTFQ7Ci0gICBjYXNlIFJQQ19MT0NfTklfU1NfTEFOR1VBR0VfVU5TUEVDOgotICAgICAgcmV0dXJuIEdQU19FTkNfU1VQTF9HU01fREVGQVVMVDsgLy8gU1NfTEFOR1VBR0VfVU5TUEVDID0gR1NNCi0gICBkZWZhdWx0OgotICAgICAgIHJldHVybiBHUFNfRU5DX1VOS05PV047Ci0gICB9Ci19Ci0KLUxvY0FwaUJhc2UqIGdldExvY0FwaShjb25zdCBNc2dUYXNrKiBtc2dUYXNrLAotICAgICAgICAgICAgICAgICAgICAgIExPQ19BUElfQURBUFRFUl9FVkVOVF9NQVNLX1QgZXhNYXNrLAotICAgICAgICAgICAgICAgICAgICAgIENvbnRleHRCYXNlICpjb250ZXh0KSB7Ci0gICAgcmV0dXJuIG5ldyBMb2NBcGlScGMobXNnVGFzaywgZXhNYXNrLCBjb250ZXh0KTsKLX0KLQotLypWYWx1ZXMgZm9yIGxvY2sKLSAgMSA9IERvIG5vdCBsb2NrIGFueSBwb3NpdGlvbiBzZXNzaW9ucwotICAyID0gTG9jayBNSSBwb3NpdGlvbiBzZXNzaW9ucwotICAzID0gTG9jayBNVCBwb3NpdGlvbiBzZXNzaW9ucwotICA0ID0gTG9jayBhbGwgcG9zaXRpb24gc2Vzc2lvbnMKLSovCi1pbnQgTG9jQXBpUnBjOjpzZXRHcHNMb2NrKExPQ19HUFNfTE9DS19NQVNLIGxvY2tNYXNrKQotewotICAgIHJwY19sb2NfaW9jdGxfZGF0YV91X3R5cGUgICAgaW9jdGxfZGF0YTsKLSAgICBib29sZWFuIHJldF92YWw7Ci0gICAgTE9DX0xPR0QoIiVzOiVkXTogbG9jazogJXhcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgbG9ja01hc2spOwotICAgIGlvY3RsX2RhdGEucnBjX2xvY19pb2N0bF9kYXRhX3VfdHlwZV91LmVuZ2luZV9sb2NrID0gY29udmVydEdwc0xvY2tNYXNrKGxvY2tNYXNrKTsKLSAgICBpb2N0bF9kYXRhLmRpc2MgPSBSUENfTE9DX0lPQ1RMX1NFVF9FTkdJTkVfTE9DSzsKLSAgICByZXRfdmFsID0gbG9jX2VuZ19pb2N0bCAobG9jX2VuZ19kYXRhLmNsaWVudF9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUlBDX0xPQ19JT0NUTF9TRVRfRU5HSU5FX0xPQ0ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlvY3RsX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9DX0lPQ1RMX0RFRkFVTFRfVElNRU9VVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMIC8qIE5vIG91dHB1dCBpbmZvcm1hdGlvbiBpcyBleHBlY3RlZCovKTsKLQotICAgIExPQ19MT0dEKCIlczolZF06IHJldF92YWw6ICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIChpbnQpcmV0X3ZhbCk7Ci0gICAgcmV0dXJuIChyZXRfdmFsID09IFRSVUUgPyAwIDogLTEpOwotfQotCi0vKgotICBSZXR1cm5zCi0gIEN1cnJlbnQgdmFsdWUgb2YgR1BTIGxvY2sgb24gc3VjY2VzcwotICAtMSBvbiBmYWlsdXJlCi0qLwotaW50IExvY0FwaVJwYyA6OiBnZXRHcHNMb2NrKCkKLXsKLSAgICBycGNfbG9jX2lvY3RsX2RhdGFfdV90eXBlICAgIGlvY3RsX2RhdGE7Ci0gICAgcnBjX2xvY19pb2N0bF9jYWxsYmFja19zX3R5cGUgY2FsbGJhY2tfcGF5bG9hZDsKLSAgICBib29sZWFuIHJldF92YWw7Ci0gICAgaW50IHJldD0wOwotICAgIExPQ19MT0dEKCIlczolZF06IEVudGVyXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotICAgIHJldF92YWwgPSBsb2NfZW5nX2lvY3RsIChsb2NfZW5nX2RhdGEuY2xpZW50X2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBSUENfTE9DX0lPQ1RMX0dFVF9FTkdJTkVfTE9DSywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW9jdGxfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0NfSU9DVExfREVGQVVMVF9USU1FT1VULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjYWxsYmFja19wYXlsb2FkKTsKLSAgICBpZihyZXRfdmFsID09IFRSVUUpIHsKLSAgICAgICAgcmV0ID0gKGludCljYWxsYmFja19wYXlsb2FkLmRhdGEuZW5naW5lX2xvY2s7Ci0gICAgICAgIExPQ19MT0dEKCIlczolZF06IExvY2sgdHlwZTogJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgcmV0KTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIExPQ19MT0dFKCIlczolZF06IElvY3RsIGZhaWxlZCIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0gICAgICAgIHJldCA9IC0xOwotICAgIH0KLSAgICBMT0NfTE9HRCgiJXM6JWRdOiBFeGl0XG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotICAgIHJldHVybiByZXQ7Ci19CmRpZmYgLS1naXQgYS9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaS1ycGMtNTAwMDEvbGlibG9jX2FwaS1ycGMtZ2x1ZS9zcmMvbG9jX2FwaV9maXh1cC5jIGIvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGktcnBjLTUwMDAxL2xpYmxvY19hcGktcnBjLWdsdWUvc3JjL2xvY19hcGlfZml4dXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM3ZWYxMS4uMDAwMDAwMAotLS0gYS9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaS1ycGMtNTAwMDEvbGlibG9jX2FwaS1ycGMtZ2x1ZS9zcmMvbG9jX2FwaV9maXh1cC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDExLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZwotICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCi0gKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCi0gKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKLSAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCi0gKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCi0gKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSA8cnBjL3JwYy5oPgotCi0jaW5jbHVkZSAibG9jX2FwaV9maXh1cC5oIgotCi0jaWZkZWYgQUREX1hEUl9GTE9BVAotCi1pbnQKLXhkcl9mbG9hdCh4ZHJwLCBmcCkKLSAgICAgICAgWERSICp4ZHJwOwotICAgICAgICBmbG9hdCAqZnA7Ci17Ci0gICAgICAgIHJldHVybiB4ZHJfbG9uZyh4ZHJwLCAobG9uZyopZnApOwotfQotCi1pbnQKLXhkcl9kb3VibGUoeGRycCwgZHApCi0gICAgICAgIFhEUiAqeGRycDsKLSAgICAgICAgZG91YmxlICpkcDsKLXsKLSAgICAgICAgICAgICAgICByZXR1cm4geGRyX2xvbmcoeGRycCwgKGxvbmcqKWRwICsgMSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgeGRyX2xvbmcoeGRycCwgKGxvbmcqKWRwKTsKLX0KLQotI2VuZGlmIC8qIEFERF9YRFJfRkxPQVQgKi8KZGlmZiAtLWdpdCBhL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpLXJwYy01MDAwMS9saWJsb2NfYXBpLXJwYy1nbHVlL3NyYy9sb2NfYXBpX2xvZy5jIGIvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGktcnBjLTUwMDAxL2xpYmxvY19hcGktcnBjLWdsdWUvc3JjL2xvY19hcGlfbG9nLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjNDgyMzIuLjAwMDAwMDAKLS0tIGEvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGktcnBjLTUwMDAxL2xpYmxvY19hcGktcnBjLWdsdWUvc3JjL2xvY19hcGlfbG9nLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNDUgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDExIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCi0gKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKLSAqICAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKLSAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAotICogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKLSAqIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KLSAqIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jZGVmaW5lIExPR19ORERFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiTG9jU3ZjX2FwaV9ycGNfZ2x1ZSIKLQotI2luY2x1ZGUgImxvY19hcGlfbG9nLmgiCi0jaW5jbHVkZSAibG9jX2xvZy5oIgotI2luY2x1ZGUgImxvZ191dGlsLmgiCi0jaW5jbHVkZSAicGxhdGZvcm1fbGliX2luY2x1ZGVzLmgiCi0jaW5jbHVkZSAicnBjL3JwYy5oIgotI2luY2x1ZGUgImxvY19hcGlfZml4dXAuaCIKLQotLyogRXZlbnQgbmFtZXMgKi8KLWxvY19uYW1lX3ZhbF9zX3R5cGUgbG9jX2V2ZW50X25hbWVbXSA9Ci0gICB7Ci0gICAgICBOQU1FX1ZBTCggUlBDX0xPQ19FVkVOVF9QQVJTRURfUE9TSVRJT05fUkVQT1JUICksCi0gICAgICBOQU1FX1ZBTCggUlBDX0xPQ19FVkVOVF9TQVRFTExJVEVfUkVQT1JUICksCi0gICAgICBOQU1FX1ZBTCggUlBDX0xPQ19FVkVOVF9OTUVBXzFIWl9SRVBPUlQgKSwKLSAgICAgIE5BTUVfVkFMKCBSUENfTE9DX0VWRU5UX05NRUFfUE9TSVRJT05fUkVQT1JUICksCi0gICAgICBOQU1FX1ZBTCggUlBDX0xPQ19FVkVOVF9OSV9OT1RJRllfVkVSSUZZX1JFUVVFU1QgKSwKLSAgICAgIE5BTUVfVkFMKCBSUENfTE9DX0VWRU5UX0FTU0lTVEFOQ0VfREFUQV9SRVFVRVNUICksCi0gICAgICBOQU1FX1ZBTCggUlBDX0xPQ19FVkVOVF9MT0NBVElPTl9TRVJWRVJfUkVRVUVTVCApLAotICAgICAgTkFNRV9WQUwoIFJQQ19MT0NfRVZFTlRfSU9DVExfUkVQT1JUICksCi0gICAgICBOQU1FX1ZBTCggUlBDX0xPQ19FVkVOVF9TVEFUVVNfUkVQT1JUICksCi0gICAgICBOQU1FX1ZBTCggUlBDX0xPQ19FVkVOVF9XUFNfTkVFREVEX1JFUVVFU1QgKSwKLSAgIH07Ci1pbnQgbG9jX2V2ZW50X251bSA9IHNpemVvZiBsb2NfZXZlbnRfbmFtZSAvIHNpemVvZihsb2NfbmFtZV92YWxfc190eXBlKTsKLQotLyogRXZlbnQgbmFtZXMgKi8KLWxvY19uYW1lX3ZhbF9zX3R5cGUgbG9jX2V2ZW50X2F0bF9vcGVuX25hbWVbXSA9Ci0gICB7Ci0gICAgICBOQU1FX1ZBTCggUlBDX0xPQ19TRVJWRVJfUkVRVUVTVF9PUEVOICksCi0gICAgICBOQU1FX1ZBTCggUlBDX0xPQ19TRVJWRVJfUkVRVUVTVF9DTE9TRSApLAotICAgICAgTkFNRV9WQUwoIFJQQ19MT0NfU0VSVkVSX1JFUVVFU1RfTVVMVElfT1BFTiApCi0gICB9OwotaW50IGxvY19ldmVudF9hdGxfb3Blbl9udW0gPSBzaXplb2YgbG9jX2V2ZW50X2F0bF9vcGVuX25hbWUgLyBzaXplb2YobG9jX25hbWVfdmFsX3NfdHlwZSk7Ci0KLS8qIEZpbmRzIHRoZSBmaXJzdCBldmVudCBmb3VuZCBpbiB0aGUgbWFzayAqLwotY29uc3QgY2hhciogbG9jX2dldF9ldmVudF9hdGxfb3Blbl9uYW1lKHJwY19sb2Nfc2VydmVyX3JlcXVlc3RfZV90eXBlIGxvY19ldmVudF9hdGxfb3BlbikKLXsKLSAgIHJldHVybiBsb2NfZ2V0X25hbWVfZnJvbV92YWwobG9jX2V2ZW50X2F0bF9vcGVuX25hbWUsIGxvY19ldmVudF9hdGxfb3Blbl9udW0sCi0gICAgICAgICAobG9uZykgbG9jX2V2ZW50X2F0bF9vcGVuKTsKLX0KLQotLyogSU9DVEwgVHlwZSBuYW1lcyAqLwotbG9jX25hbWVfdmFsX3NfdHlwZSBsb2NfaW9jdGxfdHlwZV9uYW1lW10gPQotICAgewotICAgICAgTkFNRV9WQUwoIFJQQ19MT0NfSU9DVExfR0VUX0FQSV9WRVJTSU9OICksCi0gICAgICBOQU1FX1ZBTCggUlBDX0xPQ19JT0NUTF9TRVRfRklYX0NSSVRFUklBICksCi0gICAgICBOQU1FX1ZBTCggUlBDX0xPQ19JT0NUTF9HRVRfRklYX0NSSVRFUklBICksCi0gICAgICBOQU1FX1ZBTCggUlBDX0xPQ19JT0NUTF9JTkZPUk1fTklfVVNFUl9SRVNQT05TRSApLAotICAgICAgTkFNRV9WQUwoIFJQQ19MT0NfSU9DVExfSU5KRUNUX1BSRURJQ1RFRF9PUkJJVFNfREFUQSApLAotICAgICAgTkFNRV9WQUwoIFJQQ19MT0NfSU9DVExfUVVFUllfUFJFRElDVEVEX09SQklUU19EQVRBX1ZBTElESVRZICksCi0gICAgICBOQU1FX1ZBTCggUlBDX0xPQ19JT0NUTF9RVUVSWV9QUkVESUNURURfT1JCSVRTX0RBVEFfU09VUkNFICksCi0gICAgICBOQU1FX1ZBTCggUlBDX0xPQ19JT0NUTF9TRVRfUFJFRElDVEVEX09SQklUU19EQVRBX0FVVE9fRE9XTkxPQUQgKSwKLSAgICAgIE5BTUVfVkFMKCBSUENfTE9DX0lPQ1RMX0lOSkVDVF9VVENfVElNRSApLAotICAgICAgTkFNRV9WQUwoIFJQQ19MT0NfSU9DVExfSU5KRUNUX1JUQ19WQUxVRSApLAotICAgICAgTkFNRV9WQUwoIFJQQ19MT0NfSU9DVExfSU5KRUNUX1BPU0lUSU9OICksCi0gICAgICBOQU1FX1ZBTCggUlBDX0xPQ19JT0NUTF9RVUVSWV9FTkdJTkVfU1RBVEUgKSwKLSAgICAgIE5BTUVfVkFMKCBSUENfTE9DX0lPQ1RMX0VSUk9SX0VTVElNQVRFX0NPTkZJRyksCi0gICAgICBOQU1FX1ZBTCggUlBDX0xPQ19JT0NUTF9JTkZPUk1fU0VSVkVSX01VTFRJX09QRU5fU1RBVFVTICksCi0gICAgICBOQU1FX1ZBTCggUlBDX0xPQ19JT0NUTF9JTkZPUk1fU0VSVkVSX09QRU5fU1RBVFVTICksCi0gICAgICBOQU1FX1ZBTCggUlBDX0xPQ19JT0NUTF9JTkZPUk1fU0VSVkVSX0NMT1NFX1NUQVRVUyApLAotICAgICAgTkFNRV9WQUwoIFJQQ19MT0NfSU9DVExfU0VORF9XSVBFUl9QT1NJVElPTl9SRVBPUlQgKSwKLSAgICAgIE5BTUVfVkFMKCBSUENfTE9DX0lPQ1RMX05PVElGWV9XSVBFUl9TVEFUVVMgKSwKLSAgICAgIE5BTUVfVkFMKCBSUENfTE9DX0lPQ1RMX1NFVF9FTkdJTkVfTE9DSyApLAotICAgICAgTkFNRV9WQUwoIFJQQ19MT0NfSU9DVExfR0VUX0VOR0lORV9MT0NLICksCi0gICAgICBOQU1FX1ZBTCggUlBDX0xPQ19JT0NUTF9TRVRfU0JBU19DT05GSUcgKSwKLSAgICAgIE5BTUVfVkFMKCBSUENfTE9DX0lPQ1RMX0dFVF9TQkFTX0NPTkZJRyApLAotICAgICAgTkFNRV9WQUwoIFJQQ19MT0NfSU9DVExfU0VUX05NRUFfVFlQRVMgKSwKLSAgICAgIE5BTUVfVkFMKCBSUENfTE9DX0lPQ1RMX0dFVF9OTUVBX1RZUEVTICksCi0gICAgICBOQU1FX1ZBTCggUlBDX0xPQ19JT0NUTF9TRVRfQ0RNQV9QREVfU0VSVkVSX0FERFIgKSwKLSAgICAgIE5BTUVfVkFMKCBSUENfTE9DX0lPQ1RMX0dFVF9DRE1BX1BERV9TRVJWRVJfQUREUiApLAotICAgICAgTkFNRV9WQUwoIFJQQ19MT0NfSU9DVExfU0VUX0NETUFfTVBDX1NFUlZFUl9BRERSICksCi0gICAgICBOQU1FX1ZBTCggUlBDX0xPQ19JT0NUTF9HRVRfQ0RNQV9NUENfU0VSVkVSX0FERFIgKSwKLSAgICAgIE5BTUVfVkFMKCBSUENfTE9DX0lPQ1RMX1NFVF9VTVRTX1NMUF9TRVJWRVJfQUREUiApLAotICAgICAgTkFNRV9WQUwoIFJQQ19MT0NfSU9DVExfR0VUX1VNVFNfU0xQX1NFUlZFUl9BRERSICksCi0gICAgICBOQU1FX1ZBTCggUlBDX0xPQ19JT0NUTF9TRVRfT05fREVNQU5EX0xQTSApLAotICAgICAgTkFNRV9WQUwoIFJQQ19MT0NfSU9DVExfR0VUX09OX0RFTUFORF9MUE0gKSwKLSAgICAgIE5BTUVfVkFMKCBSUENfTE9DX0lPQ1RMX1NFVF9YVFJBX1RfU0VTU0lPTl9DT05UUk9MICksCi0gICAgICBOQU1FX1ZBTCggUlBDX0xPQ19JT0NUTF9HRVRfWFRSQV9UX1NFU1NJT05fQ09OVFJPTCApLAotICAgICAgTkFNRV9WQUwoIFJQQ19MT0NfSU9DVExfU0VUX0xCU19BUE5fUFJPRklMRSApLAotICAgICAgTkFNRV9WQUwoIFJQQ19MT0NfSU9DVExfR0VUX0xCU19BUE5fUFJPRklMRSApLAotICAgICAgTkFNRV9WQUwoIFJQQ19MT0NfSU9DVExfU0VUX1hUUkFfQVBOX1BST0ZJTEUgKSwKLSAgICAgIE5BTUVfVkFMKCBSUENfTE9DX0lPQ1RMX0dFVF9YVFJBX0FQTl9QUk9GSUxFICksCi0gICAgICBOQU1FX1ZBTCggUlBDX0xPQ19JT0NUTF9TRVRfREFUQV9FTkFCTEUgKSwKLSAgICAgIE5BTUVfVkFMKCBSUENfTE9DX0lPQ1RMX1NFVF9TVVBMX1ZFUlNJT04gKSwKLSAgICAgIE5BTUVfVkFMKCBSUENfTE9DX0lPQ1RMX0dFVF9TVVBMX1ZFUlNJT04gKSwKLSAgICAgIE5BTUVfVkFMKCBSUENfTE9DX0lPQ1RMX0RFTEVURV9BU1NJU1RfREFUQSApLAotICAgICAgTkFNRV9WQUwoIFJQQ19MT0NfSU9DVExfU0VUX0NVU1RPTV9QREVfU0VSVkVSX0FERFIgKSwKLSAgICAgIE5BTUVfVkFMKCBSUENfTE9DX0lPQ1RMX0dFVF9DVVNUT01fUERFX1NFUlZFUl9BRERSICksCi0gICB9OwotaW50IGxvY19pb2N0bF90eXBlX251bSA9IHNpemVvZiBsb2NfaW9jdGxfdHlwZV9uYW1lIC8gc2l6ZW9mKGxvY19uYW1lX3ZhbF9zX3R5cGUpOwotCi0vKiBJT0NUTCBTdGF0dXMgbmFtZXMgKi8KLWxvY19uYW1lX3ZhbF9zX3R5cGUgbG9jX2lvY3RsX3N0YXR1c19uYW1lW10gPQotICAgewotICAgICAgTkFNRV9WQUwoIFJQQ19MT0NfQVBJX1NVQ0NFU1MgKSwKLSAgICAgIE5BTUVfVkFMKCBSUENfTE9DX0FQSV9HRU5FUkFMX0ZBSUxVUkUgKSwKLSAgICAgIE5BTUVfVkFMKCBSUENfTE9DX0FQSV9VTlNVUFBPUlRFRCApLAotICAgICAgTkFNRV9WQUwoIFJQQ19MT0NfQVBJX0lOVkFMSURfSEFORExFICksCi0gICAgICBOQU1FX1ZBTCggUlBDX0xPQ19BUElfSU5WQUxJRF9QQVJBTUVURVIgKSwKLSAgICAgIE5BTUVfVkFMKCBSUENfTE9DX0FQSV9FTkdJTkVfQlVTWSApLAotICAgICAgTkFNRV9WQUwoIFJQQ19MT0NfQVBJX1BIT05FX09GRkxJTkUgKSwKLSAgICAgIE5BTUVfVkFMKCBSUENfTE9DX0FQSV9USU1FT1VUICksCi0gICAgICBOQU1FX1ZBTCggUlBDX0xPQ19BUElfUlBDX0ZBSUxVUkUgKSwKLSAgICAgIE5BTUVfVkFMKCBSUENfTE9DX0FQSV9SUENfTU9ERU1fUkVTVEFSVCApCi0gICB9OwotaW50IGxvY19pb2N0bF9zdGF0dXNfbnVtID0gc2l6ZW9mIGxvY19pb2N0bF9zdGF0dXNfbmFtZSAvIHNpemVvZihsb2NfbmFtZV92YWxfc190eXBlKTsKLQotLyogRml4IHNlc3Npb24gc3RhdHVzIG5hbWVzICovCi1sb2NfbmFtZV92YWxfc190eXBlIGxvY19zZXNzX3N0YXR1c19uYW1lW10gPQotICAgewotICAgICAgTkFNRV9WQUwoIFJQQ19MT0NfU0VTU19TVEFUVVNfU1VDQ0VTUyApLAotICAgICAgTkFNRV9WQUwoIFJQQ19MT0NfU0VTU19TVEFUVVNfSU5fUFJPR0VTUyApLAotICAgICAgTkFNRV9WQUwoIFJQQ19MT0NfU0VTU19TVEFUVVNfR0VORVJBTF9GQUlMVVJFICksCi0gICAgICBOQU1FX1ZBTCggUlBDX0xPQ19TRVNTX1NUQVRVU19USU1FT1VUICksCi0gICAgICBOQU1FX1ZBTCggUlBDX0xPQ19TRVNTX1NUQVRVU19VU0VSX0VORCApLAotICAgICAgTkFNRV9WQUwoIFJQQ19MT0NfU0VTU19TVEFUVVNfQkFEX1BBUkFNRVRFUiApLAotICAgICAgTkFNRV9WQUwoIFJQQ19MT0NfU0VTU19TVEFUVVNfUEhPTkVfT0ZGTElORSApLAotICAgICAgTkFNRV9WQUwoIFJQQ19MT0NfU0VTU19TVEFUVVNfVVNFUl9FTkQgKSwKLSAgICAgIE5BTUVfVkFMKCBSUENfTE9DX1NFU1NfU1RBVFVTX0VOR0lORV9MT0NLRUQgKQotICAgfTsKLWludCBsb2Nfc2Vzc19zdGF0dXNfbnVtID0gc2l6ZW9mIGxvY19zZXNzX3N0YXR1c19uYW1lIC8gc2l6ZW9mKGxvY19uYW1lX3ZhbF9zX3R5cGUpOwotCi0vKiBFbmdpbmUgc3RhdGUgbmFtZXMgKi8KLWxvY19uYW1lX3ZhbF9zX3R5cGUgbG9jX2VuZ2luZV9zdGF0ZV9uYW1lW10gPQotICAgewotICAgICAgTkFNRV9WQUwoIFJQQ19MT0NfRU5HSU5FX1NUQVRFX09OICksCi0gICAgICBOQU1FX1ZBTCggUlBDX0xPQ19FTkdJTkVfU1RBVEVfT0ZGICkKLSAgIH07Ci1pbnQgbG9jX2VuZ2luZV9zdGF0ZV9udW0gPSBzaXplb2YgbG9jX2VuZ2luZV9zdGF0ZV9uYW1lIC8gc2l6ZW9mKGxvY19uYW1lX3ZhbF9zX3R5cGUpOwotCi0vKiBGaXggc2Vzc2lvbiBzdGF0ZSBuYW1lcyAqLwotbG9jX25hbWVfdmFsX3NfdHlwZSBsb2NfZml4X3Nlc3Npb25fc3RhdGVfbmFtZVtdID0KLSAgIHsKLSAgICAgIE5BTUVfVkFMKCBSUENfTE9DX0ZJWF9TRVNTSU9OX1NUQVRFX0JFR0lOICksCi0gICAgICBOQU1FX1ZBTCggUlBDX0xPQ19GSVhfU0VTU0lPTl9TVEFURV9FTkQgKQotICAgfTsKLWludCBsb2NfZml4X3Nlc3Npb25fc3RhdGVfbnVtID0gc2l6ZW9mIGxvY19maXhfc2Vzc2lvbl9zdGF0ZV9uYW1lIC8gc2l6ZW9mKGxvY19uYW1lX3ZhbF9zX3R5cGUpOwotCi0KLXN0YXRpYyBjb25zdCBjaGFyKiBsb2dfZmluYWxfaW50ZXJtX3N0cmluZyhpbnQgaXNfZmluYWwpCi17Ci0gICByZXR1cm4gaXNfZmluYWwgPyAiZmluYWwiIDogImludGVybWVkaWF0ZSI7Ci19Ci0KLS8qIExvZ3MgcGFyc2VkIHJlcG9ydCAqLwotc3RhdGljIHZvaWQgbG9nX3BhcnNlZF9yZXBvcnQoY29uc3QgcnBjX2xvY19wYXJzZWRfcG9zaXRpb25fc190eXBlICpwYXJzZWRfcmVwb3J0KQotewotICAgcnBjX2xvY19zZXNzaW9uX3N0YXR1c19lX3R5cGUgc3RhdHVzID0gcGFyc2VkX3JlcG9ydC0+c2Vzc2lvbl9zdGF0dXM7Ci0gICBMT0NfTE9HRCgiU2Vzc2lvbiBzdGF0dXM6ICVzICAgVmFsaWQgbWFzazogMHglWFxuIiwKLSAgICAgICAgIGxvY19nZXRfc2Vzc19zdGF0dXNfbmFtZShzdGF0dXMpLAotICAgICAgICAgKHVpbnQpIHBhcnNlZF9yZXBvcnQtPnZhbGlkX21hc2spOwotICAgTE9DX0xPR0QoIkxhdGl0dWRlOiAgJS43ZiAoJXMpXG4iLCBwYXJzZWRfcmVwb3J0LT5sYXRpdHVkZSwKLSAgICAgICAgIGxvZ19maW5hbF9pbnRlcm1fc3RyaW5nKAotICAgICAgICAgICAgICAgKHBhcnNlZF9yZXBvcnQtPnZhbGlkX21hc2sgJiBSUENfTE9DX1BPU19WQUxJRF9MQVRJVFVERSkgJiYKLSAgICAgICAgICAgICAgIHBhcnNlZF9yZXBvcnQtPnNlc3Npb25fc3RhdHVzID09IFJQQ19MT0NfU0VTU19TVEFUVVNfU1VDQ0VTUykpOwotICAgTE9DX0xPR0QoIkxvbmdpdHVkZTogJS43ZlxuIiwgcGFyc2VkX3JlcG9ydC0+bG9uZ2l0dWRlKTsKLSAgIExPQ19MT0dEKCJBY2N1cmFjeTogJS43ZlxuIiwgcGFyc2VkX3JlcG9ydC0+aG9yX3VuY19jaXJjdWxhcik7Ci19Ci0KLS8qIExvZ3Mgc3RhdHVzIHJlcG9ydCAqLwotc3RhdGljIHZvaWQgbG9nX3N0YXR1c19yZXBvcnQoY29uc3QgcnBjX2xvY19zdGF0dXNfZXZlbnRfc190eXBlICpzdGF0dXNfZXZlbnQpCi17Ci0gICBycGNfbG9jX3N0YXR1c19ldmVudF9lX3R5cGUgZXZlbnQgPSBzdGF0dXNfZXZlbnQtPmV2ZW50OwotICAgc3dpdGNoIChldmVudCkgewotICAgY2FzZSBSUENfTE9DX1NUQVRVU19FVkVOVF9FTkdJTkVfU1RBVEU6Ci0gICAgICBMT0NfTE9HRCgiRW5naW5lIHN0YXRlOiAlc1xuIiwKLSAgICAgICAgICAgIGxvY19nZXRfZW5naW5lX3N0YXRlX25hbWUoCi0gICAgICAgICAgICAgICAgICBzdGF0dXNfZXZlbnQtPnBheWxvYWQucnBjX2xvY19zdGF0dXNfZXZlbnRfcGF5bG9hZF91X3R5cGVfdS5lbmdpbmVfc3RhdGUpKTsKLSAgICAgIGJyZWFrOwotICAgY2FzZSBSUENfTE9DX1NUQVRVU19FVkVOVF9GSVhfU0VTU0lPTl9TVEFURToKLSAgICAgIExPQ19MT0dEKCJGaXggc2Vzc2lvbiBzdGF0ZTogJXNcbiIsCi0gICAgICAgICAgICBsb2NfZ2V0X2ZpeF9zZXNzaW9uX3N0YXRlX25hbWUoCi0gICAgICAgICAgICAgICAgICBzdGF0dXNfZXZlbnQtPnBheWxvYWQucnBjX2xvY19zdGF0dXNfZXZlbnRfcGF5bG9hZF91X3R5cGVfdS5maXhfc2Vzc2lvbl9zdGF0ZSkpOwotICAgICAgYnJlYWs7Ci0gICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICB9Ci19Ci0KLS8qIExvZ3MgdmFsaWQgZmllbGRzIGluIHRoZSBHTlNTIFNWIGNvbnN0ZWxsYXRpb24gcmVwb3J0ICovCi1zdGF0aWMgdm9pZCBsb2dfc2F0ZWxsaXRlX3JlcG9ydChjb25zdCBycGNfbG9jX2duc3NfaW5mb19zX3R5cGUgKmduc3MpCi17Ci0gICBpZiAoZ25zcy0+dmFsaWRfbWFzayAmIFJQQ19MT0NfR05TU19JTkZPX1ZBTElEX1BPU19ET1ApCi0gICB7Ci0gICAgICBMT0NfTE9HVigicG9zaXRpb24gZG9wOiAlLjNmXG4iLCAoZmxvYXQpIGduc3MtPnBvc2l0aW9uX2RvcCk7Ci0gICB9Ci0gICBpZiAoZ25zcy0+dmFsaWRfbWFzayAmIFJQQ19MT0NfR05TU19JTkZPX1ZBTElEX0hPUl9ET1ApCi0gICB7Ci0gICAgICBMT0NfTE9HVigiaG9yaXpvbnRhbCBkb3A6ICUuM2ZcbiIsIChmbG9hdCkgZ25zcy0+aG9yaXpvbnRhbF9kb3ApOwotICAgfQotICAgaWYgKGduc3MtPnZhbGlkX21hc2sgJiBSUENfTE9DX0dOU1NfSU5GT19WQUxJRF9WRVJUX0RPUCkKLSAgIHsKLSAgICAgIExPQ19MT0dWKCJ2ZXJ0aWNhbCBkb3A6ICUuM2ZcbiIsIChmbG9hdCkgZ25zcy0+dmVydGljYWxfZG9wKTsKLSAgIH0KLSAgIGlmIChnbnNzLT52YWxpZF9tYXNrICYgUlBDX0xPQ19HTlNTX0lORk9fVkFMSURfQUxUSVRVREVfQVNTVU1FRCkKLSAgIHsKLSAgICAgIExPQ19MT0dWKCJhbHRpdHVkZSBhc3N1bWVkOiAlZFxuIiwgKGludCkgZ25zcy0+YWx0aXR1ZGVfYXNzdW1lZCk7Ci0gICB9Ci0gICBpZiAoZ25zcy0+dmFsaWRfbWFzayAmIFJQQ19MT0NfR05TU19JTkZPX1ZBTElEX1NWX0NPVU5UKQotICAgewotICAgICAgTE9DX0xPR0QoInN2IGNvdW50OiAlZFxuIiwgKGludCkgZ25zcy0+c3ZfY291bnQpOwotICAgfQotICAgaWYgKGduc3MtPnZhbGlkX21hc2sgJiBSUENfTE9DX0dOU1NfSU5GT19WQUxJRF9TVl9MSVNUKQotICAgewotICAgICAgTE9DX0xPR1YoInN2IGxpc3Q6ICIpOwotCi0gICAgICBpZiAoZ25zcy0+c3ZfY291bnQpCi0gICAgICB7Ci0gICAgICAgICBMT0NfTE9HVigiXG5cdHN5c1x0cHJuXHRobHRoXHRwcm9jXHRlcGhcdGFsbVx0ZWxldlx0YXppXHRzbnJcbiIpOwotICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgICAgICBMT0NfTE9HVigiZW1wdHlcbiIpOwotICAgICAgfQotCi0gICAgICBpbnQgaTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBnbnNzLT5zdl9jb3VudDsgaSsrKQotICAgICAgewotICAgICAgICAgY29uc3QgcnBjX2xvY19zdl9pbmZvX3NfdHlwZSAqc3YgPSAmZ25zcy0+c3ZfbGlzdC5zdl9saXN0X3ZhbFtpXTsKLSAgICAgICAgIHJwY19sb2Nfc3ZfaW5mb192YWxpZF9tYXNrX3R5cGUgbWFzayA9IHN2LT52YWxpZF9tYXNrOwotICAgICAgICAgTE9DX0xPR1YoIiAgJWQ6IFx0JWRcdCVkXHQlZFx0JWRcdCVkXHQlZFx0JS4zZlx0JS4zZlx0JS4zZlxuIiwgaSwKLSAgICAgICAgICAgICAgIENIRUNLX01BU0soaW50LCAgIHN2LT5zeXN0ZW0sICAgICAgICAgbWFzaywgUlBDX0xPQ19TVl9JTkZPX1ZBTElEX1NZU1RFTSksCi0gICAgICAgICAgICAgICBDSEVDS19NQVNLKGludCwgICBzdi0+cHJuLCAgICAgICAgICAgIG1hc2ssIFJQQ19MT0NfU1ZfSU5GT19WQUxJRF9QUk4pLAotICAgICAgICAgICAgICAgQ0hFQ0tfTUFTSyhpbnQsICAgc3YtPmhlYWx0aF9zdGF0dXMsICBtYXNrLCBSUENfTE9DX1NWX0lORk9fVkFMSURfSEVBTFRIX1NUQVRVUyksCi0gICAgICAgICAgICAgICBDSEVDS19NQVNLKGludCwgICBzdi0+cHJvY2Vzc19zdGF0dXMsIG1hc2ssIFJQQ19MT0NfU1ZfSU5GT19WQUxJRF9QUk9DRVNTX1NUQVRVUyksCi0gICAgICAgICAgICAgICBDSEVDS19NQVNLKGludCwgICBzdi0+aGFzX2VwaCwgICAgICAgIG1hc2ssIFJQQ19MT0NfU1ZfSU5GT19WQUxJRF9IQVNfRVBIKSwKLSAgICAgICAgICAgICAgIENIRUNLX01BU0soaW50LCAgIHN2LT5oYXNfYWxtLCAgICAgICAgbWFzaywgUlBDX0xPQ19TVl9JTkZPX1ZBTElEX0hBU19BTE0pLAotICAgICAgICAgICAgICAgQ0hFQ0tfTUFTSyhmbG9hdCwgc3YtPmVsZXZhdGlvbiwgICAgICBtYXNrLCBSUENfTE9DX1NWX0lORk9fVkFMSURfRUxFVkFUSU9OKSwKLSAgICAgICAgICAgICAgIENIRUNLX01BU0soZmxvYXQsIHN2LT5hemltdXRoLCAgICAgICAgbWFzaywgUlBDX0xPQ19TVl9JTkZPX1ZBTElEX0FaSU1VVEgpLAotICAgICAgICAgICAgICAgQ0hFQ0tfTUFTSyhmbG9hdCwgc3YtPnNuciwgICAgICAgICAgICBtYXNrLCBSUENfTE9DX1NWX0lORk9fVkFMSURfU05SKQotICAgICAgICAgKTsKLSAgICAgIH0KLSAgIH0KLX0KLQotLyogTG9ncyBhIGNhbGxiYWNrIGV2ZW50ICovCi1pbnQgbG9jX2NhbGxiYWNrX2xvZygKLSAgICAgIHJwY19sb2NfZXZlbnRfbWFza190eXBlICAgICAgICAgICAgICAgbG9jX2V2ZW50LCAgICAgICAgICAgICAgLyogZXZlbnQgbWFzayAgICAgICAgICAgKi8KLSAgICAgIGNvbnN0IHJwY19sb2NfZXZlbnRfcGF5bG9hZF91X3R5cGUqICAgbG9jX2V2ZW50X3BheWxvYWQgICAgICAgLyogcGF5bG9hZCAgICAgICAgICAgICAgKi8KLSkKLXsKLSAgIHN3aXRjaCAobG9jX2V2ZW50KQotICAgewotICAgY2FzZSBSUENfTE9DX0VWRU5UX1NBVEVMTElURV9SRVBPUlQ6Ci0gICAgICBsb2dfc2F0ZWxsaXRlX3JlcG9ydCgmbG9jX2V2ZW50X3BheWxvYWQtPgotICAgICAgICAgICAgcnBjX2xvY19ldmVudF9wYXlsb2FkX3VfdHlwZV91Lmduc3NfcmVwb3J0KTsKLSAgICAgIGJyZWFrOwotICAgY2FzZSBSUENfTE9DX0VWRU5UX1NUQVRVU19SRVBPUlQ6Ci0gICAgICBsb2dfc3RhdHVzX3JlcG9ydCgmbG9jX2V2ZW50X3BheWxvYWQtPgotICAgICAgICAgICAgcnBjX2xvY19ldmVudF9wYXlsb2FkX3VfdHlwZV91LnN0YXR1c19yZXBvcnQpOwotICAgICAgYnJlYWs7Ci0gICBjYXNlIFJQQ19MT0NfRVZFTlRfUEFSU0VEX1BPU0lUSU9OX1JFUE9SVDoKLSAgICAgIGxvZ19wYXJzZWRfcmVwb3J0KCZsb2NfZXZlbnRfcGF5bG9hZC0+Ci0gICAgICAgICAgICBycGNfbG9jX2V2ZW50X3BheWxvYWRfdV90eXBlX3UucGFyc2VkX2xvY2F0aW9uX3JlcG9ydCk7Ci0gICAgICBicmVhazsKLSAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgIH0KLQotICAgcmV0dXJuIDA7Ci19Ci0KLS8qIEZpbmRzIHRoZSBmaXJzdCBldmVudCBmb3VuZCBpbiB0aGUgbWFzayAqLwotY29uc3QgY2hhciogbG9jX2dldF9ldmVudF9uYW1lKHJwY19sb2NfZXZlbnRfbWFza190eXBlIGxvY19ldmVudF9tYXNrKQotewotICAgcmV0dXJuIGxvY19nZXRfbmFtZV9mcm9tX21hc2sobG9jX2V2ZW50X25hbWUsIGxvY19ldmVudF9udW0sCi0gICAgICAgICAobG9uZykgbG9jX2V2ZW50X21hc2spOwotfQotCi0vKiBGaW5kcyBJT0NUTCB0eXBlIG5hbWUgKi8KLWNvbnN0IGNoYXIqIGxvY19nZXRfaW9jdGxfdHlwZV9uYW1lKHJwY19sb2NfaW9jdGxfZV90eXBlIGlvY3RsX3R5cGUpCi17Ci0gICByZXR1cm4gbG9jX2dldF9uYW1lX2Zyb21fdmFsKGxvY19pb2N0bF90eXBlX25hbWUsIGxvY19pb2N0bF90eXBlX251bSwKLSAgICAgICAgIChsb25nKSBpb2N0bF90eXBlKTsKLX0KLQotLyogRmluZHMgSU9DVEwgc3RhdHVzIG5hbWUgKi8KLWNvbnN0IGNoYXIqIGxvY19nZXRfaW9jdGxfc3RhdHVzX25hbWUodWludDMyIHN0YXR1cykKLXsKLSAgIHJldHVybiBsb2NfZ2V0X25hbWVfZnJvbV92YWwobG9jX2lvY3RsX3N0YXR1c19uYW1lLCBsb2NfaW9jdGxfc3RhdHVzX251bSwKLSAgICAgICAgIChsb25nKSBzdGF0dXMpOwotfQotCi0vKiBGaW5kcyBzZXNzaW9uIHN0YXR1cyBuYW1lICovCi1jb25zdCBjaGFyKiBsb2NfZ2V0X3Nlc3Nfc3RhdHVzX25hbWUocnBjX2xvY19zZXNzaW9uX3N0YXR1c19lX3R5cGUgc3RhdHVzKQotewotICAgcmV0dXJuIGxvY19nZXRfbmFtZV9mcm9tX3ZhbChsb2Nfc2Vzc19zdGF0dXNfbmFtZSwgbG9jX3Nlc3Nfc3RhdHVzX251bSwKLSAgICAgICAgIChsb25nKSBzdGF0dXMpOwotfQotCi0vKiBGaW5kIGVuZ2luZSBzdGF0ZSBuYW1lICovCi1jb25zdCBjaGFyKiBsb2NfZ2V0X2VuZ2luZV9zdGF0ZV9uYW1lKHJwY19sb2NfZW5naW5lX3N0YXRlX2VfdHlwZSBzdGF0ZSkKLXsKLSAgIHJldHVybiBsb2NfZ2V0X25hbWVfZnJvbV92YWwobG9jX2VuZ2luZV9zdGF0ZV9uYW1lLCBsb2NfZW5naW5lX3N0YXRlX251bSwKLSAgICAgICAgIChsb25nKSBzdGF0ZSk7Ci19Ci0KLS8qIEZpbmQgZW5naW5lIHN0YXRlIG5hbWUgKi8KLWNvbnN0IGNoYXIqIGxvY19nZXRfZml4X3Nlc3Npb25fc3RhdGVfbmFtZShycGNfbG9jX2ZpeF9zZXNzaW9uX3N0YXRlX2VfdHlwZSBzdGF0ZSkKLXsKLSAgIHJldHVybiBsb2NfZ2V0X25hbWVfZnJvbV92YWwobG9jX2ZpeF9zZXNzaW9uX3N0YXRlX25hbWUsIGxvY19maXhfc2Vzc2lvbl9zdGF0ZV9udW0sCi0gICAgICAgICAobG9uZykgc3RhdGUpOwotfQotCi0vKiBFdmVudCBuYW1lcyAqLwotbG9jX25hbWVfdmFsX3NfdHlwZSBycGNfcmVzZXRfZXZlbnRfbmFtZVtdID0KLXsKLSAgICBOQU1FX1ZBTCggUlBDX1NVQlNZU1RFTV9SRVNUQVJUX0JFR0lOICksCi0gICAgTkFNRV9WQUwoIFJQQ19TVUJTWVNURU1fUkVTVEFSVF9FTkQgKQotfTsKLWludCBycGNfcmVzZXRfZXZlbnRfbnVtID0gc2l6ZW9mIHJwY19yZXNldF9ldmVudF9uYW1lIC8gc2l6ZW9mKGxvY19uYW1lX3ZhbF9zX3R5cGUpOwotCi1jb25zdCBjaGFyKiBsb2NfZ2V0X3JwY19yZXNldF9ldmVudF9uYW1lKGVudW0gcnBjX3Jlc2V0X2V2ZW50IGV2ZW50KQotewotICAgIHJldHVybiBsb2NfZ2V0X25hbWVfZnJvbV92YWwocnBjX3Jlc2V0X2V2ZW50X25hbWUsIHJwY19yZXNldF9ldmVudF9udW0sIGV2ZW50KTsKLX0KZGlmZiAtLWdpdCBhL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpLXJwYy01MDAwMS9saWJsb2NfYXBpLXJwYy1nbHVlL3NyYy9sb2NfYXBpX3JwY19nbHVlLmMgYi9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaS1ycGMtNTAwMDEvbGlibG9jX2FwaS1ycGMtZ2x1ZS9zcmMvbG9jX2FwaV9ycGNfZ2x1ZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMGY0MDBjLi4wMDAwMDAwCi0tLSBhL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpLXJwYy01MDAwMS9saWJsb2NfYXBpLXJwYy1nbHVlL3NyYy9sb2NfYXBpX3JwY19nbHVlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MzYgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDExLTIwMTIsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCi0gKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKLSAqICAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24sIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCi0gKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKLSAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCi0gKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCi0gKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgICAgICAgICAgICAgICAgICBJTkNMVURFIEZJTEVTIEZPUiBNT0RVTEUKLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxwdGhyZWFkLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzeXMvc2VsZWN0Lmg+Ci0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8c3lzL21tYW4uaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxsb2NfYXBpX2xvZy5oPgotCi0jaW5jbHVkZSA8cnBjL3JwYy5oPgotCi0vKiBJbmNsdWRlIFJQQyBoZWFkZXJzICovCi0jaW5jbHVkZSAicnBjX2luYy9sb2NfYXBpX3JwY19nbHVlLmgiCi0KLS8qIENhbGxiYWNrIGluaXQgKi8KLSNpbmNsdWRlICJycGNfaW5jL2xvY19hcGljYl9hcHBpbml0LmgiCi0KLS8qIExvZ2dpbmcgKi8KLSNkZWZpbmUgTE9HX1RBRyAiTG9jU3ZjX2FwaV9ycGNfZ2x1ZSIKLSNkZWZpbmUgTE9HX05EREVCVUcgMAotI2lmbmRlZiBVU0VfR0xJQgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2VuZGlmIC8qIFVTRV9HTElCICovCi0KLS8qIExvZ2dpbmcgSW1wcm92ZW1lbnQgKi8KLSNpbmNsdWRlICJsb2dfdXRpbC5oIgotI2luY2x1ZGUgInBsYXRmb3JtX2xpYl9pbmNsdWRlcy5oIgotLypNYXhpbXVtIG51bWJlciBvZiBNb2RlbSBpbml0Ki8KLSNkZWZpbmUgUlBDX1RSWV9OVU0gMTAKLQotLypNYXhpbXVtIG51bWJlciBvZiBNb2RlbSBpbml0Ki8KLSNkZWZpbmUgUlBDX1RSWV9OVU0gMTAKLQotLyogVW5jb21tZW50IHRvIGZvcmNlIEFMT0dEIG1lc3NhZ2VzICovCi0vLyAjZGVmaW5lIEFMT0dEIEFMT0dJCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgIEV4dGVybmFsIGRlY2xhcmF0aW9ucwotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLUNMSUVOVCogbG9jX2FwaV9jbG50ID0gTlVMTDsKLQotLyogQ2FsbGJhY2sgSUQgYW5kIHBvaW50ZXIgKi8KLSNkZWZpbmUgTE9DX0FQSV9DQl9NQVhfQ0xJRU5UUyAxNgotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICB1aW50MzIgY2JfaWQ7ICAgICAgICAgICAgICAgICAgICAgICAgLyogc2FtZSBhcyBycGMvdHlwZXMuaCAqLwotICAgIGxvY19ldmVudF9jYl9mX3R5cGUgKmNiX2Z1bmM7ICAgICAgLyogY2FsbGJhY2sgZnVuYyAqLwotICAgIGxvY19yZXNldF9ub3RpZl9jYl9mX3R5cGUgKnJwY19jYjsgLyogY2FsbGJhY2sgZnJvbSBSUEMgKi8KLSAgICBycGNfbG9jX2NsaWVudF9oYW5kbGVfdHlwZSBoYW5kbGU7IC8qIHN0b3JlcyBoYW5kbGUgZm9yIGNsaWVudCBjbG9zaW5nICovCi0gICAgdm9pZCogdXNlcjsgICAgICAgICAgICAgICAgICAgICAgICAvKiB1c2VyJ3Mgb3duIGRhdGEgaGFuZGxlICovCi19IGxvY19nbHVlX2NiX2VudHJ5X3NfdHlwZTsKLQotbG9jX2dsdWVfY2JfZW50cnlfc190eXBlIGxvY19nbHVlX2NhbGxiYWNrX3RhYmxlW0xPQ19BUElfQ0JfTUFYX0NMSUVOVFNdOwotCi0jZGVmaW5lIFJQQ19GVU5DX1ZFUlNJT05fQkFTRShhLGIpIGEgIyMgYgotI2RlZmluZSBSUENfRlVOQ19WRVJTSU9OKGEsYikgUlBDX0ZVTkNfVkVSU0lPTl9CQVNFKGEsYikKLQotI2RlZmluZSBSUENfQ0FMTEJBQ0tfRlVOQ19WRVJTSU9OX0JBU0UoYSx2LGIpIGEgIyMgdiAjIyBiCi0jZGVmaW5lIFJQQ19DQUxMQkFDS19GVU5DX1ZFUlNJT04oYSx2LGIpIFJQQ19DQUxMQkFDS19GVU5DX1ZFUlNJT05fQkFTRShhLHYsYikKLQotI2RlZmluZSBMT0NfR0xVRV9DSEVDS19JTklUKHJldF90eXBlKSBcCi0gICBpZiAobG9jX2FwaV9jbG50ID09IE5VTEwpIHsgRVhJVF9MT0dfQ0FMTEZMT1coJWQsIFJQQ19MT0NfQVBJX1JQQ19GQUlMVVJFKTsgcmV0dXJuIChyZXRfdHlwZSkgUlBDX0xPQ19BUElfUlBDX0ZBSUxVUkU7IH0KLQotI2RlZmluZSBMT0NfR0xVRV9DSEVDS19SRVNVTFQoc3RhdCwgcmV0X3R5cGUpIFwKLSAgaWYgKHN0YXQgIT0gUlBDX1NVQ0NFU1MpIHsgXAotICAgICAgTE9DX0xPR0UoIiVzOiVkXSBmYWlsdXJlIGNvZGUgJWQiLCBfX2Z1bmNfXywgX19MSU5FX18sIHN0YXQpOyBcCi0gICAgICByZXR1cm4gKHJldF90eXBlKSgoc3RhdCA9PSBSUENfU1VCU1lTVEVNX1JFU1RBUlQpID8gXAotICAgICAgICAgICAgICAgICAgICAgICAgUlBDX0xPQ19BUElfUlBDX01PREVNX1JFU1RBUlQgOiBSUENfTE9DX0FQSV9SUENfRkFJTFVSRSk7IFwKLSAgfQotCi0vKiBDYWxsYmFjayBmdW5jdGlvbnMgKi8KLS8qIFJldHVybnMgMSBpZiBzdWNjZXNzZnVsICovCi1ib29sX3QgcnBjX2xvY19ldmVudF9jYl9mX3R5cGVfc3ZjKAotICAgICAgcnBjX2xvY19ldmVudF9jYl9mX3R5cGVfYXJncyAqYXJncCwKLSAgICAgIHJwY19sb2NfZXZlbnRfY2JfZl90eXBlX3JldHMgKnJldCwKLSAgICAgIHN0cnVjdCBzdmNfcmVxICpyZXEpCi17Ci0gICAgLy8gVGhlIGxvd2VyIHdvcmQgb2YgY2RfaWQgaXMgdGhlIGluZGV4Ci0gICAgaW50IGluZGV4ID0gYXJncC0+Y2JfaWQgJiAweEZGRkY7Ci0KLSAgICAvKiBDYWxsYmFjayBub3QgcmVnaXN0ZXJlZCwgb3IgdW5leHBlY3RlZCBJRCAoc2hvdWxkbid0IGhhcHBlbikgKi8KLSAgICBpZiAoaW5kZXggPj0gTE9DX0FQSV9DQl9NQVhfQ0xJRU5UUyB8fCBsb2NfZ2x1ZV9jYWxsYmFja190YWJsZVtpbmRleF0uY2JfZnVuYyA9PSBOVUxMKQotICAgIHsKLSAgICAgICAgTE9DX0xPR0UoIldhcm5pbmc6IE5vIGNhbGxiYWNrIGhhbmRsZXIgJWQuXG4iLCBpbmRleCk7Ci0gICAgICAgIHJldC0+bG9jX2V2ZW50X2NiX2ZfdHlwZV9yZXN1bHQgPSAwOwotICAgICAgICByZXR1cm4gMTsgLyogc2ltcGx5IHJldHVybiAqLwotICAgIH0KLQotICAgIExPQ19MT0dWKCJwcm9jOiAleCAgcHJvZzogJXggIHZlcnM6ICV4XG4iLAotICAgICAgICAgKGludCkgcmVxLT5ycV9wcm9jLAotICAgICAgICAgKGludCkgcmVxLT5ycV9wcm9nLAotICAgICAgICAgKGludCkgcmVxLT5ycV92ZXJzKTsKLQotICAgIExPQ19MT0dWKCJDYWxsYmFjayByZWNlaXZlZDogJXggKGNiX2lkPSVwIGhhbmRsZT0lZCByZXRfcHRyPSVkKVxuIiwKLSAgICAgICAgIChpbnQpIGFyZ3AtPmxvY19ldmVudCwKLSAgICAgICAgICAgICAgIGFyZ3AtPmNiX2lkLAotICAgICAgICAgKGludCkgYXJncC0+bG9jX2hhbmRsZSwKLSAgICAgICAgIChpbnQpIHJldCk7Ci0KLSAgICAvKiBGb3J3YXJkIGNhbGxiYWNrIHRvIHJlYWwgY2FsbGJhY2sgcHJvY2VkdXJlICovCi0gICAgcnBjX2xvY19jbGllbnRfaGFuZGxlX3R5cGUgICAgICAgIGxvY19oYW5kbGUgPSBhcmdwLT5sb2NfaGFuZGxlOwotICAgIHJwY19sb2NfZXZlbnRfbWFza190eXBlICAgICAgICAgICBsb2NfZXZlbnQgID0gYXJncC0+bG9jX2V2ZW50OwotICAgIGNvbnN0IHJwY19sb2NfZXZlbnRfcGF5bG9hZF91X3R5cGUqICBsb2NfZXZlbnRfcGF5bG9hZCA9Ci0gICAgICAgIChjb25zdCBycGNfbG9jX2V2ZW50X3BheWxvYWRfdV90eXBlKikgYXJncC0+bG9jX2V2ZW50X3BheWxvYWQ7Ci0KLSAgICAvKiBHaXZlcyBjb250cm9sIHRvIHN5bmNocm9ub3VzIGNhbGwgaGFuZGxlciAqLwotICAgIGxvY19hcGlfY2FsbGJhY2tfcHJvY2Vzc19zeW5jX2NhbGwobG9jX2hhbmRsZSwgbG9jX2V2ZW50LCBsb2NfZXZlbnRfcGF5bG9hZCk7Ci0KLSAgICBpbnQzMiByYyA9IChsb2NfZ2x1ZV9jYWxsYmFja190YWJsZVtpbmRleF0uY2JfZnVuYykobG9jX2dsdWVfY2FsbGJhY2tfdGFibGVbaW5kZXhdLnVzZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY19oYW5kbGUsIGxvY19ldmVudCwgbG9jX2V2ZW50X3BheWxvYWQpOwotCi0gICAgTE9DX0xPR1YoImNiX2Z1bmM9JXAiLCBsb2NfZ2x1ZV9jYWxsYmFja190YWJsZVtpbmRleF0uY2JfZnVuYyk7Ci0KLSAgICByZXQtPmxvY19ldmVudF9jYl9mX3R5cGVfcmVzdWx0ID0gcmM7Ci0KLSAgICByZXR1cm4gMTsgLyogb2sgKi8KLX0KLQotaW50IGxvY19hcGljYnByb2dfZnJlZXJlc3VsdCAoU1ZDWFBSVCAqdHJhbnNwLCB4ZHJwcm9jX3QgeGRyX3Jlc3VsdCwgY2FkZHJfdCByZXN1bHQpCi17Ci0gICB4ZHJfZnJlZSAoeGRyX3Jlc3VsdCwgcmVzdWx0KTsKLQotICAgLyoKLSAgICAqIEluc2VydCBhZGRpdGlvbmFsIGZyZWVpbmcgY29kZSBoZXJlLCBpZiBuZWVkZWQKLSAgICAqLwotICAgLy8gTE9DX0xPR0QoIioqKioqIGxvY19hcGljYnByb2dfZnJlZXJlc3VsdFxuIik7Ci0KLSAgIHJldHVybiAxOwotfQotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1GVU5DVElPTiBycGNfbG9jX2V2ZW50X2NiX2ZfdHlwZV88dmVyc2lvbj5fc3ZjIChNQUNSTykKLQotREVTQ1JJUFRJT04KLSAgIENhbGxiYWNrIGZ1bmN0aW9uIGZvciBMb2MgQVBJCi0KLVJFVFVSTiBWQUxVRQotICAgMSBmb3Igc3VjY2VzcwotICAgMCBmb3IgZmFpbHVyZQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotYm9vbF90IFJQQ19DQUxMQkFDS19GVU5DX1ZFUlNJT04ocnBjX2xvY19ldmVudF9jYl9mX3R5cGVfLCBSUENfTE9DX0VWRU5UX0NCX0ZfVFlQRV9WRVJTSU9OLCBfc3ZjKSAoCi0gICAgICBycGNfbG9jX2V2ZW50X2NiX2ZfdHlwZV9hcmdzICphcmdwLAotICAgICAgcnBjX2xvY19ldmVudF9jYl9mX3R5cGVfcmV0cyAqcmV0LAotICAgICAgc3RydWN0IHN2Y19yZXEgKnJlcSkKLXsKLSAgIHJldHVybiBycGNfbG9jX2V2ZW50X2NiX2ZfdHlwZV9zdmMoYXJncCwgcmV0LCByZXEpOwotfQotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1GVU5DVElPTiBsb2NfYXBpY2Jwcm9nXzx2ZXJzaW9uPl9mcmVlcmVzdWx0IChNQUNSTykKLQotREVTQ1JJUFRJT04KLSAgIEZyZWUgdXAgUlBDIGRhdGEgc3RydWN0dXJlCi0KLVJFVFVSTiBWQUxVRQotICAgMSBmb3Igc3VjY2VzcwotICAgMCBmb3IgZmFpbHVyZQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotI2RlZmluZSBWRVJTSU9OX0NPTkNBVChNQUpPUixNSU5PUikgTUFKT1IjI01JTk9SCi0jZGVmaW5lIGxvY19hcGljYl9wcm9nX1ZFUl9mcmVlcmVzdWx0KE0sTikgXAotaW50IFJQQ19DQUxMQkFDS19GVU5DX1ZFUlNJT04obG9jX2FwaWNicHJvZ18sIFZFUlNJT05fQ09OQ0FUKE0sTiksIF9mcmVlcmVzdWx0KSBcCi0oU1ZDWFBSVCAqdHJhbnNwLCB4ZHJwcm9jX3QgeGRyX3Jlc3VsdCwgY2FkZHJfdCByZXN1bHQpIFwKLXsgXAotICAgcmV0dXJuIGxvY19hcGljYnByb2dfZnJlZXJlc3VsdCh0cmFuc3AsIHhkcl9yZXN1bHQsIHJlc3VsdCk7IFwKLX0KLQotLyogRGVmaW5lIGFsbCBvZiB0aGUgcG9zc2libGUgbWlub3JzICovCi1sb2NfYXBpY2JfcHJvZ19WRVJfZnJlZXJlc3VsdChSUENfTE9DX0FQSV9BUElfTUFKT1JfTlVNLCAwMDAxKTsKLWxvY19hcGljYl9wcm9nX1ZFUl9mcmVlcmVzdWx0KFJQQ19MT0NfQVBJX0FQSV9NQUpPUl9OVU0sIDAwMDIpOwotbG9jX2FwaWNiX3Byb2dfVkVSX2ZyZWVyZXN1bHQoUlBDX0xPQ19BUElfQVBJX01BSk9SX05VTSwgMDAwMyk7Ci1sb2NfYXBpY2JfcHJvZ19WRVJfZnJlZXJlc3VsdChSUENfTE9DX0FQSV9BUElfTUFKT1JfTlVNLCAwMDA0KTsKLWxvY19hcGljYl9wcm9nX1ZFUl9mcmVlcmVzdWx0KFJQQ19MT0NfQVBJX0FQSV9NQUpPUl9OVU0sIDAwMDUpOwotbG9jX2FwaWNiX3Byb2dfVkVSX2ZyZWVyZXN1bHQoUlBDX0xPQ19BUElfQVBJX01BSk9SX05VTSwgMDAwNik7Ci0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUZVTkNUSU9OIHJwY19sb2NfYXBpX2NiX251bGxfPHZlcnNpb24+X3N2YyAoTUFDUk8pIFtQYXRjaCBmb3Igd3JvbmcgUlBDR0VOIHN0dWJzXQotCi1ERVNDUklQVElPTgotICAgTnVsbCBjYWxsYmFjayBmdW5jdGlvbiBmb3IgTG9jIEFQSQotCi1SRVRVUk4gVkFMVUUKLSAgIDEgZm9yIHN1Y2Nlc3MKLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLSNkZWZpbmUgcnBjX2xvY19hcGlfY2JfbnVsbF9WRVJfc3ZjKE0sTikgXAotYm9vbF90IFJQQ19DQUxMQkFDS19GVU5DX1ZFUlNJT04ocnBjX2xvY19hcGlfY2JfbnVsbF8sIFZFUlNJT05fQ09OQ0FUKE0sTiksIF9zdmMpICggXAotICAgICAgdm9pZCAqYSwgaW50ICpiLCBzdHJ1Y3Qgc3ZjX3JlcSAqcmVxKSBcCi17IFwKLSAgIHJldHVybiAxOyBcCi19Ci0KLS8qIERlZmluZSBhbGwgb2YgdGhlIHBvc3NpYmxlIG1pbm9ycyAqLwotcnBjX2xvY19hcGlfY2JfbnVsbF9WRVJfc3ZjKFJQQ19MT0NfQVBJX0FQSV9NQUpPUl9OVU0sIDAwMDEpOwotcnBjX2xvY19hcGlfY2JfbnVsbF9WRVJfc3ZjKFJQQ19MT0NfQVBJX0FQSV9NQUpPUl9OVU0sIDAwMDIpOwotcnBjX2xvY19hcGlfY2JfbnVsbF9WRVJfc3ZjKFJQQ19MT0NfQVBJX0FQSV9NQUpPUl9OVU0sIDAwMDMpOwotcnBjX2xvY19hcGlfY2JfbnVsbF9WRVJfc3ZjKFJQQ19MT0NfQVBJX0FQSV9NQUpPUl9OVU0sIDAwMDQpOwotcnBjX2xvY19hcGlfY2JfbnVsbF9WRVJfc3ZjKFJQQ19MT0NfQVBJX0FQSV9NQUpPUl9OVU0sIDAwMDUpOwotcnBjX2xvY19hcGlfY2JfbnVsbF9WRVJfc3ZjKFJQQ19MT0NfQVBJX0FQSV9NQUpPUl9OVU0sIDAwMDYpOwotCi1zdGF0aWMgdm9pZCBsb2NfYXBpX2dsdWVfcnBjX2NiKENMSUVOVCogY2xpZW50LCBlbnVtIHJwY19yZXNldF9ldmVudCBldmVudCkKLXsKLSAgICBpbnQgaTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgTE9DX0FQSV9DQl9NQVhfQ0xJRU5UUzsgaSsrKSB7Ci0gICAgICAgIGlmIChOVUxMICE9IGxvY19nbHVlX2NhbGxiYWNrX3RhYmxlW2ldLnJwY19jYikgewotICAgICAgICAgICAgbG9jX2dsdWVfY2FsbGJhY2tfdGFibGVbaV0ucnBjX2NiKGxvY19nbHVlX2NhbGxiYWNrX3RhYmxlW2ldLnVzZXIsIGNsaWVudCwgZXZlbnQpOwotICAgICAgICB9Ci0gICAgfQotfQotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1GVU5DVElPTiBsb2NfYXBpX2dsdWVfaW5pdAotCi1ERVNDUklQVElPTgotICAgSW5pdGlhdGVzIHRoZSBSUEMgY2xpZW50Ci0KLVJFVFVSTiBWQUxVRQotICAgMSBmb3Igc3VjY2VzcwotICAgMCBmb3IgZmFpbHVyZQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotaW50IGxvY19hcGlfZ2x1ZV9pbml0KHZvaWQpCi17Ci0gICBpZiAobG9jX2FwaV9jbG50ID09IE5VTEwpCi0gICB7Ci0gICAgICAvKiBJbml0aWFsaXplIGRhdGEgKi8KLSAgICAgIGludCBpOwotICAgICAgaW50IHBpZCA9IGdldHBpZCgpOwotICAgICAgZm9yIChpID0gMDsgaSA8IExPQ19BUElfQ0JfTUFYX0NMSUVOVFM7IGkrKykKLSAgICAgIHsKLSAgICAgICAgICBsb2NfZ2x1ZV9jYWxsYmFja190YWJsZVtpXS5jYl9pZCA9IGkgfCAocGlkIDw8IDE2KTsKLSAgICAgICAgICBsb2NfZ2x1ZV9jYWxsYmFja190YWJsZVtpXS5jYl9mdW5jID0gTlVMTDsKLSAgICAgICAgICBsb2NfZ2x1ZV9jYWxsYmFja190YWJsZVtpXS5oYW5kbGUgPSAtMTsKLSAgICAgICAgICBsb2NfZ2x1ZV9jYWxsYmFja190YWJsZVtpXS5ycGNfY2IgPSBOVUxMOwotICAgICAgICAgIGxvY19nbHVlX2NhbGxiYWNrX3RhYmxlW2ldLnVzZXIgPSBOVUxMOwotICAgICAgfQotCi0gICAgICAvKiBQcmludCBtc2cgKi8KLSAgICAgIExPQ19MT0dWKCJUcnlpbmcgdG8gY3JlYXRlIFJQQyBjbGllbnQuLi5cbiIpOwotICAgICAgbG9jX2FwaV9jbG50ID0gY2xudF9jcmVhdGUoTlVMTCwgTE9DX0FQSVBST0csIExPQ19BUElWRVJTLCBOVUxMKTsKLSAgICAgIExPQ19MT0dWKCJDcmVhdGVkIGxvY19hcGlfY2xudCAtLS0tICV4XG4iLCAodW5zaWduZWQgaW50KWxvY19hcGlfY2xudCk7Ci0KLSAgICAgIGlmIChsb2NfYXBpX2NsbnQgPT0gTlVMTCkKLSAgICAgIHsKLSAgICAgICAgIExPQ19MT0dFKCJFcnJvcjogY2Fubm90IGNyZWF0ZSBSUEMgY2xpZW50LlxuIik7Ci0gICAgICAgICByZXR1cm4gMDsKLSAgICAgIH0KLQotICAgICAgLyogSW5pdCBSUEMgY2FsbGJhY2tzICovCi0gICAgICBsb2NfYXBpX3N5bmNfY2FsbF9pbml0KCk7Ci0KLSAgICAgIGludCByYyA9IGxvY19hcGljYl9hcHBfaW5pdCgpOwotICAgICAgaWYgKHJjID49IDApCi0gICAgICB7Ci0gICAgICAgICBMT0NfTE9HRCgiTG9jIEFQSSBSUEMgY2xpZW50IGluaXRpYWxpemVkLlxuIik7Ci0gICAgICAgICBjbG50X3JlZ2lzdGVyX3Jlc2V0X25vdGlmaWNhdGlvbl9jYihsb2NfYXBpX2NsbnQsIGxvY19hcGlfZ2x1ZV9ycGNfY2IpOwotICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgICAgICBMT0NfTE9HRSgiTG9jIEFQSSBjYWxsYmFjayBpbml0aWFsaXphdGlvbiBmYWlsZWQuXG4iKTsKLSAgICAgICAgIHJldHVybiAwOwotICAgICAgfQotICAgfQotCi0gICByZXR1cm4gMTsKLX0KLQotcnBjX2xvY19jbGllbnRfaGFuZGxlX3R5cGUgbG9jX29wZW4gKAotICAgIHJwY19sb2NfZXZlbnRfbWFza190eXBlICAgICAgIGV2ZW50X3JlZ19tYXNrLAotICAgIGxvY19ldmVudF9jYl9mX3R5cGUgICAgICAgICAgICpldmVudF9jYWxsYmFjaywKLSAgICBsb2NfcmVzZXRfbm90aWZfY2JfZl90eXBlICAgICAqcnBjX2NiLAotICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJEYXRhCi0pCi17Ci0gICAgaW50IHRyeV9udW0gPSBSUENfVFJZX05VTTsKLSAgICBFTlRSWV9MT0coKTsKLSAgICBMT0NfR0xVRV9DSEVDS19JTklUKHJwY19sb2NfY2xpZW50X2hhbmRsZV90eXBlKTsKLQotICAgIHJwY19sb2NfY2xpZW50X2hhbmRsZV90eXBlIHJldF92YWw7Ci0KLSAgICBycGNfbG9jX29wZW5fYXJncyBhcmdzOwotICAgIGFyZ3MuZXZlbnRfcmVnX21hc2sgPSBldmVudF9yZWdfbWFzazsKLQotICAgIGludCBpLCBqID0gTE9DX0FQSV9DQl9NQVhfQ0xJRU5UUzsKLSAgICBmb3IgKGkgPSAwOyBpIDwgTE9DX0FQSV9DQl9NQVhfQ0xJRU5UUzsgaSsrKQotICAgIHsKLSAgICAgICAgaWYgKGxvY19nbHVlX2NhbGxiYWNrX3RhYmxlW2ldLnVzZXIgPT0gdXNlckRhdGEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIExPQ19MT0dXKCJDbGllbnQgYWxyZWFkeSBvcGVuZWQgc2VydmljZSAoY2FsbGJhY2s9JXApLi4uXG4iLAotICAgICAgICAgICAgICAgICAgZXZlbnRfY2FsbGJhY2spOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0gZWxzZSBpZiAoaiA9PSBMT0NfQVBJX0NCX01BWF9DTElFTlRTICYmCi0gICAgICAgICAgICAgICAgICAgbG9jX2dsdWVfY2FsbGJhY2tfdGFibGVbaV0udXNlciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBqID0gaTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChpID09IExPQ19BUElfQ0JfTUFYX0NMSUVOVFMpCi0gICAgewotICAgICAgICBpID0gajsKLSAgICB9Ci0KLSAgICBpZiAoaSA9PSBMT0NfQVBJX0NCX01BWF9DTElFTlRTKQotICAgIHsKLSAgICAgICAgTE9DX0xPR0UoIlRvbyBtYW55IGNsaWVudHMgb3BlbmVkIGF0IG9uY2UuLi5cbiIpOwotICAgICAgICByZXR1cm4gUlBDX0xPQ19DTElFTlRfSEFORExFX0lOVkFMSUQ7Ci0gICAgfQotCi0gICAgbG9jX2dsdWVfY2FsbGJhY2tfdGFibGVbaV0uY2JfZnVuYyA9IGV2ZW50X2NhbGxiYWNrOwotICAgIGxvY19nbHVlX2NhbGxiYWNrX3RhYmxlW2ldLnJwY19jYiA9IHJwY19jYjsKLSAgICBsb2NfZ2x1ZV9jYWxsYmFja190YWJsZVtpXS51c2VyID0gdXNlckRhdGE7Ci0KLSAgICBhcmdzLmV2ZW50X2NhbGxiYWNrID0gbG9jX2dsdWVfY2FsbGJhY2tfdGFibGVbaV0uY2JfaWQ7Ci0gICAgTE9DX0xPR1YoImNiX2lkPSVkLCBmdW5jPTB4JXgiLCBpLCAodW5zaWduZWQgaW50KSBldmVudF9jYWxsYmFjayk7Ci0KLSAgICBycGNfbG9jX29wZW5fcmV0cyByZXRzOwotICAgIGVudW0gY2xudF9zdGF0IHN0YXQgPSBSUENfU1VDQ0VTUzsKLQotICAgIEVYSVRfTE9HX0NBTExGTE9XKCVzLCAibG9jIGNsaWVudCBvcGVuIik7Ci0KLSAgICAgLyp0cnkgbW9yZSBmb3IgcnBjX2xvY19vcGVuX3h4KCkqLwotCi0gICAgZG8KLSAgICB7Ci0gICAgICAgIHN0YXQgPSBSUENfRlVOQ19WRVJTSU9OKHJwY19sb2Nfb3Blbl8sIFJQQ19MT0NfT1BFTl9WRVJTSU9OKSgmYXJncywgJnJldHMsIGxvY19hcGlfY2xudCk7Ci0gICAgICAgIHJldF92YWwgPSAocnBjX2xvY19jbGllbnRfaGFuZGxlX3R5cGUpIHJldHMubG9jX29wZW5fcmVzdWx0OwotICAgICAgICB0cnlfbnVtLS07Ci0KLSAgICB9d2hpbGUoIChSUENfU1VDQ0VTUyAhPSBzdGF0fHwwID4gcmV0X3ZhbCkgJiYgMCAhPSB0cnlfbnVtICk7Ci0KLSAgICBMT0NfR0xVRV9DSEVDS19SRVNVTFQoc3RhdCwgaW50MzIpOwotCi0gICAgLyogc2F2ZSB0aGUgaGFuZGxlIGluIHRoZSB0YWJsZSAqLwotICAgIGxvY19nbHVlX2NhbGxiYWNrX3RhYmxlW2ldLmhhbmRsZSA9IChycGNfbG9jX2NsaWVudF9oYW5kbGVfdHlwZSkgcmV0cy5sb2Nfb3Blbl9yZXN1bHQ7Ci0KLSAgICByZXR1cm4gcmV0X3ZhbDsKLQotfQotCi1pbnQzMiBsb2NfY2xvc2UKLSgKLSAgICAgIHJwY19sb2NfY2xpZW50X2hhbmRsZV90eXBlIGhhbmRsZQotKQotewotICAgIEVOVFJZX0xPRygpOwotICAgIExPQ19HTFVFX0NIRUNLX0lOSVQoaW50MzIpOwotCi0gICAgaW50MzIgcmV0X3ZhbDsKLQotICAgIHJwY19sb2NfY2xvc2VfYXJncyBhcmdzOwotICAgIGFyZ3MuaGFuZGxlID0gaGFuZGxlOwotCi0gICAgcnBjX2xvY19jbG9zZV9yZXRzIHJldHM7Ci0gICAgZW51bSBjbG50X3N0YXQgc3RhdCA9IFJQQ19TVUNDRVNTOwotCi0gICAgRVhJVF9MT0dfQ0FMTEZMT1coJXMsICJsb2MgY2xpZW50IGNsb3NlIik7Ci0gICAgc3RhdCA9IFJQQ19GVU5DX1ZFUlNJT04ocnBjX2xvY19jbG9zZV8sIFJQQ19MT0NfQ0xPU0VfVkVSU0lPTikoJmFyZ3MsICZyZXRzLCBsb2NfYXBpX2NsbnQpOwotCi0gICAgbG9jX2NsZWFyKGhhbmRsZSk7Ci0KLSAgICBMT0NfR0xVRV9DSEVDS19SRVNVTFQoc3RhdCwgaW50MzIpOwotICAgIHJldF92YWwgPSAoaW50MzIpIHJldHMubG9jX2Nsb3NlX3Jlc3VsdDsKLQotICAgIHJldHVybiByZXRfdmFsOwotfQotCi12b2lkIGxvY19jbGVhcihycGNfbG9jX2NsaWVudF9oYW5kbGVfdHlwZSBoYW5kbGUpIHsKLSAgICAvKiBDbGVhbiB0aGUgY2xpZW50J3MgY2FsbGJhY2sgZnVuY3Rpb24gaW4gY2FsbGJhY2sgdGFibGUgKi8KLSAgICBpbnQgaTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgTE9DX0FQSV9DQl9NQVhfQ0xJRU5UUzsgaSsrKQotICAgIHsKLSAgICAgICAgaWYgKGxvY19nbHVlX2NhbGxiYWNrX3RhYmxlW2ldLmhhbmRsZSA9PSBoYW5kbGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIEZvdW5kIHRoZSBjbGllbnQgKi8KLSAgICAgICAgICAgIGxvY19nbHVlX2NhbGxiYWNrX3RhYmxlW2ldLmNiX2Z1bmMgPSBOVUxMOwotICAgICAgICAgICAgbG9jX2dsdWVfY2FsbGJhY2tfdGFibGVbaV0ucnBjX2NiID0gTlVMTDsKLSAgICAgICAgICAgIGxvY19nbHVlX2NhbGxiYWNrX3RhYmxlW2ldLmhhbmRsZSA9IC0xOwotICAgICAgICAgICAgbG9jX2dsdWVfY2FsbGJhY2tfdGFibGVbaV0udXNlciA9IE5VTEw7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChpID09IExPQ19BUElfQ0JfTUFYX0NMSUVOVFMpCi0gICAgewotICAgICAgICBMT0NfTE9HVygiSGFuZGxlIG5vdCBmb3VuZCAoaGFuZGxlPSVkKS4uLlxuIiwgKGludCkgaGFuZGxlKTsKLSAgICB9Ci19Ci0KLWludDMyIGxvY19zdGFydF9maXgKLSgKLSAgICAgIHJwY19sb2NfY2xpZW50X2hhbmRsZV90eXBlIGhhbmRsZQotKQotewotICAgIEVOVFJZX0xPRygpOwotICAgIExPQ19HTFVFX0NIRUNLX0lOSVQoaW50MzIpOwotCi0gICAgaW50MzIgcmV0X3ZhbDsKLQotICAgIHJwY19sb2Nfc3RhcnRfZml4X2FyZ3MgYXJnczsKLSAgICBhcmdzLmhhbmRsZSA9IGhhbmRsZTsKLQotICAgIHJwY19sb2Nfc3RhcnRfZml4X3JldHMgcmV0czsKLSAgICBlbnVtIGNsbnRfc3RhdCBzdGF0ID0gUlBDX1NVQ0NFU1M7Ci0KLSAgICBFWElUX0xPR19DQUxMRkxPVyglcywgImxvYyBzdGFydCBmaXgiKTsKLSAgICBzdGF0ID0gUlBDX0ZVTkNfVkVSU0lPTihycGNfbG9jX3N0YXJ0X2ZpeF8sIFJQQ19MT0NfU1RBUlRfRklYX1ZFUlNJT04pKCZhcmdzLCAmcmV0cywgbG9jX2FwaV9jbG50KTsKLSAgICBMT0NfR0xVRV9DSEVDS19SRVNVTFQoc3RhdCwgaW50MzIpOwotCi0gICAgcmV0X3ZhbCA9IChpbnQzMikgcmV0cy5sb2Nfc3RhcnRfZml4X3Jlc3VsdDsKLQotICAgIHJldHVybiByZXRfdmFsOwotfQotCi1pbnQzMiBsb2Nfc3RvcF9maXgKLSgKLSAgICAgIHJwY19sb2NfY2xpZW50X2hhbmRsZV90eXBlIGhhbmRsZQotKQotewotICAgIEVOVFJZX0xPRygpOwotICAgIExPQ19HTFVFX0NIRUNLX0lOSVQoaW50MzIpOwotCi0gICAgaW50MzIgcmV0X3ZhbDsKLQotICAgIHJwY19sb2Nfc3RvcF9maXhfYXJncyBhcmdzOwotICAgIGFyZ3MuaGFuZGxlID0gaGFuZGxlOwotCi0gICAgcnBjX2xvY19zdG9wX2ZpeF9yZXRzIHJldHM7Ci0gICAgZW51bSBjbG50X3N0YXQgc3RhdCA9IFJQQ19TVUNDRVNTOwotCi0gICAgRVhJVF9MT0dfQ0FMTEZMT1coJXMsICJsb2Mgc3RvcCBmaXgiKTsKLSAgICBzdGF0ID0gUlBDX0ZVTkNfVkVSU0lPTihycGNfbG9jX3N0b3BfZml4XywgUlBDX0xPQ19TVE9QX0ZJWF9WRVJTSU9OKSgmYXJncywgJnJldHMsIGxvY19hcGlfY2xudCk7Ci0gICAgTE9DX0dMVUVfQ0hFQ0tfUkVTVUxUKHN0YXQsIGludDMyKTsKLQotICAgIHJldF92YWwgPSAoaW50MzIpIHJldHMubG9jX3N0b3BfZml4X3Jlc3VsdDsKLQotICAgIHJldHVybiByZXRfdmFsOwotfQotCi1pbnQzMiBsb2NfaW9jdGwKLSgKLSAgICAgIHJwY19sb2NfY2xpZW50X2hhbmRsZV90eXBlICAgICAgICAgICBoYW5kbGUsCi0gICAgICBycGNfbG9jX2lvY3RsX2VfdHlwZSAgICAgICAgICAgICAgICAgaW9jdGxfdHlwZSwKLSAgICAgIHJwY19sb2NfaW9jdGxfZGF0YV91X3R5cGUqICAgICAgICAgICBpb2N0bF9kYXRhCi0pCi17Ci0gICAgRU5UUllfTE9HKCk7Ci0gICAgTE9DX0dMVUVfQ0hFQ0tfSU5JVChpbnQzMik7Ci0KLSAgICBpbnQzMiByZXRfdmFsOwotCi0gICAgcnBjX2xvY19pb2N0bF9hcmdzIGFyZ3M7Ci0gICAgYXJncy5oYW5kbGUgPSBoYW5kbGU7Ci0gICAgYXJncy5pb2N0bF9kYXRhID0gaW9jdGxfZGF0YTsKLSAgICBhcmdzLmlvY3RsX3R5cGUgPSBpb2N0bF90eXBlOwotICAgIGlmIChpb2N0bF9kYXRhICE9IE5VTEwpCi0gICAgewotICAgICAgICAvKiBBc3NpZ24gaW9jdGwgdW5pb24gZGlzY3JpbWluYXRvciAqLwotICAgICAgICBpb2N0bF9kYXRhLT5kaXNjID0gaW9jdGxfdHlwZTsKLQotICAgICAgICAvKiBJbiBjYXNlIHRoZSB1c2VyIGhhc24ndCBmaWxsZWQgaW4gb3RoZXIgZGlzYyBmaWVsZHMsCi0gICAgICAgICAgIGF1dG9tYXRpY2FsbHkgZmlsbCB0aGVtIGluIGhlcmUgKi8KLSAgICAgICAgc3dpdGNoIChpb2N0bF90eXBlKQotICAgICAgICB7Ci0gICAgICAgIGNhc2UgUlBDX0xPQ19JT0NUTF9HRVRfQVBJX1ZFUlNJT046Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBSUENfTE9DX0lPQ1RMX1NFVF9GSVhfQ1JJVEVSSUE6Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBSUENfTE9DX0lPQ1RMX0dFVF9GSVhfQ1JJVEVSSUE6Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBSUENfTE9DX0lPQ1RMX0lORk9STV9OSV9VU0VSX1JFU1BPTlNFOgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUlBDX0xPQ19JT0NUTF9JTkpFQ1RfUFJFRElDVEVEX09SQklUU19EQVRBOgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUlBDX0xPQ19JT0NUTF9RVUVSWV9QUkVESUNURURfT1JCSVRTX0RBVEFfVkFMSURJVFk6Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBSUENfTE9DX0lPQ1RMX1FVRVJZX1BSRURJQ1RFRF9PUkJJVFNfREFUQV9TT1VSQ0U6Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBSUENfTE9DX0lPQ1RMX1NFVF9QUkVESUNURURfT1JCSVRTX0RBVEFfQVVUT19ET1dOTE9BRDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFJQQ19MT0NfSU9DVExfSU5KRUNUX1VUQ19USU1FOgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUlBDX0xPQ19JT0NUTF9JTkpFQ1RfUlRDX1ZBTFVFOgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUlBDX0xPQ19JT0NUTF9JTkpFQ1RfUE9TSVRJT046Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBSUENfTE9DX0lPQ1RMX1FVRVJZX0VOR0lORV9TVEFURToKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFJQQ19MT0NfSU9DVExfSU5GT1JNX1NFUlZFUl9PUEVOX1NUQVRVUzoKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFJQQ19MT0NfSU9DVExfSU5GT1JNX1NFUlZFUl9DTE9TRV9TVEFUVVM6Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBSUENfTE9DX0lPQ1RMX1NFVF9FTkdJTkVfTE9DSzoKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFJQQ19MT0NfSU9DVExfR0VUX0VOR0lORV9MT0NLOgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUlBDX0xPQ19JT0NUTF9TRVRfU0JBU19DT05GSUc6Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBSUENfTE9DX0lPQ1RMX0dFVF9TQkFTX0NPTkZJRzoKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFJQQ19MT0NfSU9DVExfU0VUX05NRUFfVFlQRVM6Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBSUENfTE9DX0lPQ1RMX0dFVF9OTUVBX1RZUEVTOgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUlBDX0xPQ19JT0NUTF9TRVRfQ0RNQV9QREVfU0VSVkVSX0FERFI6Ci0gICAgICAgIGNhc2UgUlBDX0xPQ19JT0NUTF9TRVRfQ0RNQV9NUENfU0VSVkVSX0FERFI6Ci0gICAgICAgIGNhc2UgUlBDX0xPQ19JT0NUTF9TRVRfVU1UU19TTFBfU0VSVkVSX0FERFI6Ci0gICAgICAgIGNhc2UgUlBDX0xPQ19JT0NUTF9TRVRfQ1VTVE9NX1BERV9TRVJWRVJfQUREUjoKLSAgICAgICAgICAgIGFyZ3MuaW9jdGxfZGF0YS0+cnBjX2xvY19pb2N0bF9kYXRhX3VfdHlwZV91LnNlcnZlcl9hZGRyLmFkZHJfaW5mby5kaXNjID0KLSAgICAgICAgICAgICAgICBhcmdzLmlvY3RsX2RhdGEtPnJwY19sb2NfaW9jdGxfZGF0YV91X3R5cGVfdS5zZXJ2ZXJfYWRkci5hZGRyX3R5cGU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBSUENfTE9DX0lPQ1RMX0dFVF9DRE1BX1BERV9TRVJWRVJfQUREUjoKLSAgICAgICAgY2FzZSBSUENfTE9DX0lPQ1RMX0dFVF9DRE1BX01QQ19TRVJWRVJfQUREUjoKLSAgICAgICAgY2FzZSBSUENfTE9DX0lPQ1RMX0dFVF9VTVRTX1NMUF9TRVJWRVJfQUREUjoKLSAgICAgICAgY2FzZSBSUENfTE9DX0lPQ1RMX0dFVF9DVVNUT01fUERFX1NFUlZFUl9BRERSOgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUlBDX0xPQ19JT0NUTF9TRVRfT05fREVNQU5EX0xQTToKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFJQQ19MT0NfSU9DVExfR0VUX09OX0RFTUFORF9MUE06Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBSUENfTE9DX0lPQ1RMX0RFTEVURV9BU1NJU1RfREFUQToKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0gLyogc3dpdGNoICovCi0gICAgfSAvKiBpb2N0bF9kYXRhICE9IE5VTEwgKi8KLQotICAgIHJwY19sb2NfaW9jdGxfcmV0cyByZXRzOwotICAgIGVudW0gY2xudF9zdGF0IHN0YXQgPSBSUENfU1VDQ0VTUzsKLQotICAgIEVYSVRfTE9HX0NBTExGTE9XKCVzLCBsb2NfZ2V0X2lvY3RsX3R5cGVfbmFtZShpb2N0bF90eXBlKSk7Ci0gICAgc3RhdCA9IFJQQ19GVU5DX1ZFUlNJT04ocnBjX2xvY19pb2N0bF8sIFJQQ19MT0NfSU9DVExfVkVSU0lPTikoJmFyZ3MsICZyZXRzLCBsb2NfYXBpX2NsbnQpOwotICAgIExPQ19HTFVFX0NIRUNLX1JFU1VMVChzdGF0LCBpbnQzMik7Ci0KLSAgICByZXRfdmFsID0gKGludDMyKSByZXRzLmxvY19pb2N0bF9yZXN1bHQ7Ci0KLSAgICByZXR1cm4gcmV0X3ZhbDsKLX0KLQotLyogUmV0dXJucyAwIGlmIGVycm9yICovCi1pbnQzMiBsb2NfYXBpX251bGwodm9pZCkKLXsKLSAgICBMT0NfR0xVRV9DSEVDS19JTklUKGludDMyKTsKLQotICAgIGludDMyIHJldHM7Ci0gICAgZW51bSBjbG50X3N0YXQgc3RhdCA9IFJQQ19TVUNDRVNTOwotCi0gICAgY2xudF91bnJlZ2lzdGVyX3Jlc2V0X25vdGlmaWNhdGlvbl9jYihsb2NfYXBpX2NsbnQpOwotICAgIHN0YXQgPSBSUENfRlVOQ19WRVJTSU9OKHJwY19sb2NfYXBpX251bGxfLCBSUENfTE9DX0FQSV9OVUxMX1ZFUlNJT04pKE5VTEwsICZyZXRzLCBsb2NfYXBpX2NsbnQpOwotICAgIExPQ19HTFVFX0NIRUNLX1JFU1VMVChzdGF0LCBpbnQzMik7Ci0KLSAgICByZXR1cm4gKGludDMyKSByZXRzOwotfQotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1GVU5DVElPTiAgICBsb2NfZW5nX2lvY3RsCi0KLURFU0NSSVBUSU9OCi0gICBUaGlzIGZ1bmN0aW9uIGNhbGxzIGxvY19pb2N0bCBhbmQgd2FpdHMgZm9yIHRoZSBjYWxsYmFjayByZXN1bHQgYmVmb3JlCi0gICByZXR1cm5pbmcgYmFjayB0byB0aGUgdXNlci4KLQotREVQRU5ERU5DSUVTCi0gICBOL0EKLQotUkVUVVJOIFZBTFVFCi0gICBUUlVFICAgICAgICAgICAgICAgICBpZiBzdWNjZXNzZnVsCi0gICBGQUxTRSAgICAgICAgICAgICAgICBpZiBmYWlsZWQKLQotU0lERSBFRkZFQ1RTCi0gICBOL0EKLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLWludCBsb2NfZW5nX2lvY3RsCi0oCi0gICAgICBycGNfbG9jX2NsaWVudF9oYW5kbGVfdHlwZSAgICAgICAgICAgaGFuZGxlLAotICAgICAgcnBjX2xvY19pb2N0bF9lX3R5cGUgICAgICAgICAgICAgICAgIGlvY3RsX3R5cGUsCi0gICAgICBycGNfbG9jX2lvY3RsX2RhdGFfdV90eXBlKiAgICAgICAgICAgaW9jdGxfZGF0YV9wdHIsCi0gICAgICB1aW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dF9tc2VjLAotICAgICAgcnBjX2xvY19pb2N0bF9jYWxsYmFja19zX3R5cGUgICAgICAgKmNiX2RhdGFfcHRyCi0pCi17Ci0gICAgaW50IHJldF92YWwgPSBSUENfTE9DX0FQSV9TVUNDRVNTOwotCi0gICAgcmV0X3ZhbCA9IGxvY19hcGlfc3luY19pb2N0bChoYW5kbGUsIGlvY3RsX3R5cGUsIGlvY3RsX2RhdGFfcHRyLCB0aW1lb3V0X21zZWMsIGNiX2RhdGFfcHRyKTsKLQotICAgIExPQ19MT0dEKCJsb2NfZW5nX2lvY3RsIHJlc3VsdDogY2xpZW50ID0gJWQsIGlvY3RsX3R5cGUgPSAlcywgcmV0dXJ0ICVzXG4iLAotICAgICAgICAgICAgIChpbnQzMikgaGFuZGxlLAotICAgICAgICAgICAgIGxvY19nZXRfaW9jdGxfdHlwZV9uYW1lKGlvY3RsX3R5cGUpLAotICAgICAgICAgICAgIGxvY19nZXRfaW9jdGxfc3RhdHVzX25hbWUocmV0X3ZhbCkgKTsKLQotICAgIHJldHVybiByZXRfdmFsOwotfQpkaWZmIC0tZ2l0IGEvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGktcnBjLTUwMDAxL2xpYmxvY19hcGktcnBjLWdsdWUvc3JjL2xvY19hcGlfc3luY19jYWxsLmMgYi9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaS1ycGMtNTAwMDEvbGlibG9jX2FwaS1ycGMtZ2x1ZS9zcmMvbG9jX2FwaV9zeW5jX2NhbGwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU2MjlkNy4uMDAwMDAwMAotLS0gYS9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaS1ycGMtNTAwMDEvbGlibG9jX2FwaS1ycGMtZ2x1ZS9zcmMvbG9jX2FwaV9zeW5jX2NhbGwuYworKysgL2Rldi9udWxsCkBAIC0xLDU2NSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxMiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKLSAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAotICogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiwgbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKLSAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAotICogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKLSAqIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KLSAqIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxwdGhyZWFkLmg+Ci0KLSNpbmNsdWRlIDxycGMvcnBjLmg+Ci0jaW5jbHVkZSA8bG9jX2FwaV9ycGNfZ2x1ZS5oPgotI2luY2x1ZGUgImxvY19hcGlfc3luY19jYWxsLmgiCi0KLS8qIExvZ2dpbmcgKi8KLSNkZWZpbmUgTE9HX1RBRyAiTG9jU3ZjX2FwaV9ycGNfZ2x1ZSIKLS8vICNkZWZpbmUgTE9HX05EREVCVUcgMAotI2lmbmRlZiBVU0VfR0xJQgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2VuZGlmIC8qIFVTRV9HTElCICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgICAgICBEQVRBIEZPUiBBU1lOQ0hST05PVVMgUlBDIFBST0NFU1NJTkcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWxvY19zeW5jX2NhbGxfc2xvdF9hcnJheV9zX3R5cGUgbG9jX3N5bmNfZGF0YTsKLQotcHRocmVhZF9tdXRleF90IGxvY19zeW5jX2NhbGxfbXV0ZXggPSBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSOwotYm9vbGVhbiBsb2Nfc3luY19jYWxsX2luaXRlZCA9IDA7Ci0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUZVTkNUSU9OICAgIGxvY19hcGlfc3luY19jYWxsX2luaXQKLQotREVTQ1JJUFRJT04KLSAgIEluaXRpYWxpemUgdGhpcyBtb2R1bGUKLQotREVQRU5ERU5DSUVTCi0gICBOL0EKLQotUkVUVVJOIFZBTFVFCi0gICBub25lCi0KLVNJREUgRUZGRUNUUwotICAgTi9BCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi12b2lkIGxvY19hcGlfc3luY19jYWxsX2luaXQoKQotewotICAgcHRocmVhZF9tdXRleF9sb2NrKCZsb2Nfc3luY19jYWxsX211dGV4KTsKLSAgIGlmIChsb2Nfc3luY19jYWxsX2luaXRlZCA9PSAxKSB7Ci0gICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmxvY19zeW5jX2NhbGxfbXV0ZXgpOwotICAgICAgIHJldHVybjsKLSAgIH0KLSAgIGxvY19zeW5jX2NhbGxfaW5pdGVkID0gMTsKLQotICAgbG9jX3N5bmNfZGF0YS5udW1fb2Zfc2xvdHMgPSBMT0NfU1lOQ19DQUxMX1NMT1RTX01BWDsKLQotICAgaW50IGk7Ci0gICBmb3IgKGkgPSAwOyBpIDwgbG9jX3N5bmNfZGF0YS5udW1fb2Zfc2xvdHM7IGkrKykKLSAgIHsKLSAgICAgIGxvY19zeW5jX2NhbGxfc2xvdF9zX3R5cGUgKnNsb3QgPSAmbG9jX3N5bmNfZGF0YS5zbG90c1tpXTsKLQotICAgICAgcHRocmVhZF9tdXRleF9pbml0KCZzbG90LT5sb2NrLCBOVUxMKTsKLSAgICAgIHB0aHJlYWRfY29uZF9pbml0KCZzbG90LT5sb2NfY2JfYXJyaXZlZF9jb25kLCBOVUxMKTsKLQotICAgICAgc2xvdC0+bm90X2F2YWlsYWJsZSA9IDA7Ci0gICAgICBzbG90LT5pbl91c2UgPSAwOwotICAgICAgc2xvdC0+bG9jX2hhbmRsZSA9IC0xOwotICAgICAgc2xvdC0+bG9jX2NiX3dhaXRfZXZlbnRfbWFzayA9IDA7ICAgICAgIC8qIGV2ZW50IHRvIHdhaXQgICAqLwotICAgICAgc2xvdC0+bG9jX2NiX3JlY2VpdmVkX2V2ZW50X21hc2sgPSAwOyAgIC8qIHJlY2VpdmVkIGV2ZW50ICAgKi8KLSAgIH0KLQotICAgcHRocmVhZF9tdXRleF91bmxvY2soJmxvY19zeW5jX2NhbGxfbXV0ZXgpOwotfQotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1GVU5DVElPTiAgICBsb2NfYXBpX3N5bmNfY2FsbF9kZXN0cm95Ci0KLURFU0NSSVBUSU9OCi0gICBJbml0aWFsaXplIHRoaXMgbW9kdWxlCi0KLURFUEVOREVOQ0lFUwotICAgTi9BCi0KLVJFVFVSTiBWQUxVRQotICAgbm9uZQotCi1TSURFIEVGRkVDVFMKLSAgIE4vQQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotdm9pZCBsb2NfYXBpX3N5bmNfY2FsbF9kZXN0cm95KCkKLXsKLSAgIGludCBpOwotCi0gICBwdGhyZWFkX211dGV4X2xvY2soJmxvY19zeW5jX2NhbGxfbXV0ZXgpOwotICAgaWYgKGxvY19zeW5jX2NhbGxfaW5pdGVkID09IDApIHsKLSAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbG9jX3N5bmNfY2FsbF9tdXRleCk7Ci0gICAgICAgcmV0dXJuOwotICAgfQotICAgbG9jX3N5bmNfY2FsbF9pbml0ZWQgPSAwOwotCi0gICBmb3IgKGkgPSAwOyBpIDwgbG9jX3N5bmNfZGF0YS5udW1fb2Zfc2xvdHM7IGkrKykKLSAgIHsKLSAgICAgIGxvY19zeW5jX2NhbGxfc2xvdF9zX3R5cGUgKnNsb3QgPSAmbG9jX3N5bmNfZGF0YS5zbG90c1tpXTsKLQotICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZzbG90LT5sb2NrKTsKLQotICAgICAgc2xvdC0+bm90X2F2YWlsYWJsZSA9IDE7Ci0KLSAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZzbG90LT5sb2NrKTsKLQotICAgICAgcHRocmVhZF9jb25kX2Rlc3Ryb3koJnNsb3QtPmxvY19jYl9hcnJpdmVkX2NvbmQpOwotICAgICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZzbG90LT5sb2NrKTsKLSAgIH0KLQotICAgcHRocmVhZF9tdXRleF91bmxvY2soJmxvY19zeW5jX2NhbGxfbXV0ZXgpOwotfQotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1GVU5DVElPTiAgICBsb2NfbWF0Y2hfY2FsbGJhY2sKLQotREVTQ1JJUFRJT04KLSAgIENoZWNrcyBpZiBhbiBhd2FpdGVkIGV2ZW50IGhhcyBhcnJpdmVkCi0KLVJFVFVSTiBWQUxVRQotICAgVFJVRSAgICAgICAgICAgICAgICAgYXJyaXZlZAotICAgRkFMU0UgICAgICAgICAgICAgICAgbm90IG1hdGNoaW5nCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi1zdGF0aWMgYm9vbGVhbiBsb2NfbWF0Y2hfY2FsbGJhY2soCi0gICAgICBycGNfbG9jX2V2ZW50X21hc2tfdHlwZSAgICAgICAgICAgICB3YWl0X21hc2ssCi0gICAgICBycGNfbG9jX2lvY3RsX2VfdHlwZSAgICAgICAgICAgICAgICB3YWl0X2lvY3RsLAotICAgICAgcnBjX2xvY19ldmVudF9tYXNrX3R5cGUgICAgICAgICAgICAgZXZlbnRfbWFzaywKLSAgICAgIGNvbnN0IHJwY19sb2NfZXZlbnRfcGF5bG9hZF91X3R5cGUgICpjYWxsYmFja19wYXlsb2FkCi0pCi17Ci0gICBpZiAoKGV2ZW50X21hc2sgJiB3YWl0X21hc2spID09IDApIHJldHVybiBGQUxTRTsKLQotICAgaWYgKGV2ZW50X21hc2sgIT0gUlBDX0xPQ19FVkVOVF9JT0NUTF9SRVBPUlQgfHwgd2FpdF9pb2N0bCA9PSAwIHx8Ci0gICAgICAgICggKGNhbGxiYWNrX3BheWxvYWQgIT0gTlVMTCkgJiYKLSAgICAgICAgIGNhbGxiYWNrX3BheWxvYWQtPnJwY19sb2NfZXZlbnRfcGF5bG9hZF91X3R5cGVfdS5pb2N0bF9yZXBvcnQudHlwZSA9PSB3YWl0X2lvY3RsKSApCi0gICAgICByZXR1cm4gVFJVRTsKLQotICAgcmV0dXJuIEZBTFNFOwotfQotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1GVU5DVElPTiAgICBsb2NfYXBpX2NhbGxiYWNrX3Byb2Nlc3Nfc3luY19jYWxsCi0KLURFU0NSSVBUSU9OCi0gICBXYWtlcyB1cCBibG9ja2VkIEFQSSBjYWxscyB0byBjaGVjayBpZiB0aGUgbmVlZGVkIGNhbGxiYWNrIGhhcyBhcnJpdmVkCi0KLURFUEVOREVOQ0lFUwotICAgTi9BCi0KLVJFVFVSTiBWQUxVRQotICAgbm9uZQotCi1TSURFIEVGRkVDVFMKLSAgIE4vQQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotdm9pZCBsb2NfYXBpX2NhbGxiYWNrX3Byb2Nlc3Nfc3luY19jYWxsKAotICAgICAgcnBjX2xvY19jbGllbnRfaGFuZGxlX3R5cGUgICAgICAgICAgICBsb2NfaGFuZGxlLCAgICAgICAgICAgICAvKiBoYW5kbGUgb2YgdGhlIGNsaWVudCAqLwotICAgICAgcnBjX2xvY19ldmVudF9tYXNrX3R5cGUgICAgICAgICAgICAgICBsb2NfZXZlbnQsICAgICAgICAgICAgICAvKiBldmVudCBtYXNrICAgICAgICAgICAqLwotICAgICAgY29uc3QgcnBjX2xvY19ldmVudF9wYXlsb2FkX3VfdHlwZSogICBsb2NfZXZlbnRfcGF5bG9hZCAgICAgICAvKiBwYXlsb2FkICAgICAgICAgICAgICAqLwotKQotewotICAgaW50IGk7Ci0KLSAgIEFMT0dWKCJsb2NfaGFuZGxlID0gMHglbHgsIGxvY19ldmVudCA9IDB4JWx4IiwgbG9jX2hhbmRsZSwgbG9jX2V2ZW50KTsKLSAgIGZvciAoaSA9IDA7IGkgPCBsb2Nfc3luY19kYXRhLm51bV9vZl9zbG90czsgaSsrKQotICAgewotICAgICAgbG9jX3N5bmNfY2FsbF9zbG90X3NfdHlwZSAqc2xvdCA9ICZsb2Nfc3luY19kYXRhLnNsb3RzW2ldOwotCi0gICAgICBwdGhyZWFkX211dGV4X2xvY2soJnNsb3QtPmxvY2spOwotCi0gICAgICBpZiAoc2xvdC0+aW5fdXNlICYmCi0gICAgICAgICAgc2xvdC0+c2lnbmFsX3NlbnQgPT0gMCAmJgotICAgICAgICAgIHNsb3QtPmxvY19oYW5kbGUgPT0gbG9jX2hhbmRsZSAmJgotICAgICAgICAgIGxvY19tYXRjaF9jYWxsYmFjayhzbG90LT5sb2NfY2Jfd2FpdF9ldmVudF9tYXNrLCBzbG90LT5pb2N0bF90eXBlLCBsb2NfZXZlbnQsIGxvY19ldmVudF9wYXlsb2FkKSkKLSAgICAgIHsKLSAgICAgICAgIG1lbWNweSgmc2xvdC0+bG9jX2NiX3JlY2VpdmVkX3BheWxvYWQsIGxvY19ldmVudF9wYXlsb2FkLCBzaXplb2YgKHJwY19sb2NfZXZlbnRfcGF5bG9hZF91X3R5cGUpKTsKLQotICAgICAgICAgc2xvdC0+bG9jX2NiX3JlY2VpdmVkX2V2ZW50X21hc2sgPSBsb2NfZXZlbnQ7Ci0KLSAgICAgICAgIEFMT0dWKCJzaWduYWwgc2xvdCAlZCBpbl91c2UgJWQsIGxvY19oYW5kbGUgMHglbHgsIGV2ZW50X21hc2sgMHglMXgsIGlvY3RsX3R5cGUgJWQiLCBpLCBzbG90LT5pbl91c2UsIHNsb3QtPmxvY19oYW5kbGUsIChpbnQpIHNsb3QtPmxvY19jYl93YWl0X2V2ZW50X21hc2ssIChpbnQpIHNsb3QtPmlvY3RsX3R5cGUpOwotICAgICAgICAgcHRocmVhZF9jb25kX3NpZ25hbCgmc2xvdC0+bG9jX2NiX2Fycml2ZWRfY29uZCk7Ci0gICAgICAgICBzbG90LT5zaWduYWxfc2VudCA9IDE7Ci0KLSAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZzbG90LT5sb2NrKTsKLSAgICAgICAgIGJyZWFrOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgIC8qIGRvIG5vdGhpbmcgKi8KLSAgICAgIH0KLQotICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJnNsb3QtPmxvY2spOwotICAgfQotfQotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1GVU5DVElPTiAgICBsb2NfbG9ja19hX3Nsb3QKLQotREVTQ1JJUFRJT04KLSAgIEFsbG9jYXRlcyBhIGJ1ZmZlciBzbG90IGZvciB0aGUgc3luY2hyb25vdXMgQVBJIGNhbGwKLQotREVQRU5ERU5DSUVTCi0gICBOL0EKLQotUkVUVVJOIFZBTFVFCi0gICBTZWxlY3QgSUQgKD49MCkgICAgIDogc3VjY2Vzc2Z1bAotICAgLTEgICAgICAgICAgICAgICAgICA6IGJ1ZmZlciBmdWxsCi0KLVNJREUgRUZGRUNUUwotICAgTi9BCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi1zdGF0aWMgaW50IGxvY19sb2NrX2Ffc2xvdCgpCi17Ci0gICBpbnQgaSwgc2VsZWN0X2lkID0gLTE7IC8qIG5vIGZyZWUgYnVmZmVyICovCi0KLSAgIGZvciAoaSA9IDA7IGkgPCBsb2Nfc3luY19kYXRhLm51bV9vZl9zbG90czsgaSsrKQotICAgewotICAgICAgbG9jX3N5bmNfY2FsbF9zbG90X3NfdHlwZSAqc2xvdCA9ICZsb2Nfc3luY19kYXRhLnNsb3RzW2ldOwotICAgICAgaWYgKHB0aHJlYWRfbXV0ZXhfdHJ5bG9jaygmc2xvdC0+bG9jaykgPT0gRUJVU1kpCi0gICAgICB7Ci0gICAgICAgICBBTE9HVigidHJ5bG9jayBFQlVTWSA6ICVkIiwgaSk7Ci0gICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgaWYgKCFzbG90LT5pbl91c2UgJiYgIXNsb3QtPm5vdF9hdmFpbGFibGUpCi0gICAgICB7Ci0gICAgICAgICBzZWxlY3RfaWQgPSBpOwotICAgICAgICAgLyogUmV0dXJuIGZyb20gaGVyZSBhbmQgbGVhdmUgdGhlIG11dGV4IGxvY2tlZC4KLSAgICAgICAgICAqIHdpbGwgdW5sb2NrIGl0IGluIGxvY191bmxvY2tfc2xvdCgpCi0gICAgICAgICAgKi8KLSAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgLyogQUxPR1YoInNsb3QgJWQgaW5fdXNlID0gJWQsIG5vdF9hdmFpbGFibGUgPSAlZCA6ICVkIiwgaSwgc2xvdC0+aW5fdXNlLCBzbG90LT5ub3RfYXZhaWxhYmxlLCBpKTsgKi8KLSAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZzbG90LT5sb2NrKTsKLSAgIH0KLQotICAgcmV0dXJuIHNlbGVjdF9pZDsKLX0KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotRlVOQ1RJT04gICAgbG9jX3VubG9ja19zbG90Ci0KLURFU0NSSVBUSU9OCi0gICBVbmxvY2tzIGEgYnVmZmVyIHNsb3QKLQotREVQRU5ERU5DSUVTCi0gICBOL0EKLQotUkVUVVJOIFZBTFVFCi0gICBOb25lCi0KLVNJREUgRUZGRUNUUwotICAgTi9BCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi1zdGF0aWMgdm9pZCBsb2NfdW5sb2NrX3Nsb3QoaW50IHNlbGVjdF9pZCkKLXsKLSAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZsb2Nfc3luY19kYXRhLnNsb3RzW3NlbGVjdF9pZF0ubG9jayk7Ci19Ci0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUZVTkNUSU9OICAgIGxvY19sb2NrX3Nsb3QKLQotREVTQ1JJUFRJT04KLSAgIExvY2tzIGEgc3BlY2lmaWMgc2xvdCB0aGF0IHdhcyBwcmV2aW91c2x5IGxvY2tlZCBmcm9tIGxvY19sb2NrX2Ffc2xvdAotCi1ERVBFTkRFTkNJRVMKLSAgIE4vQQotCi1SRVRVUk4gVkFMVUUKLSAgIE5vbmUKLQotU0lERSBFRkZFQ1RTCi0gICBOL0EKLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLXN0YXRpYyB2b2lkIGxvY19sb2NrX3Nsb3QoaW50IHNlbGVjdF9pZCkKLXsKLSAgICBwdGhyZWFkX211dGV4X2xvY2soJmxvY19zeW5jX2RhdGEuc2xvdHNbc2VsZWN0X2lkXS5sb2NrKTsKLX0KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotRlVOQ1RJT04gICAgbG9jX3NldF9zbG90X2luX3VzZQotCi1ERVNDUklQVElPTgotICAgU2V0cyB0aGUgaW5fdXNlIGZsYWcgb2Ygc2xvdCB0byB0cnVlIG9yIGZhbHNlLgotICAgU2hvdWxkIGJlIGNhbGxlZCBvbmx5IGFmdGVyIHRoZSBzbG90IGlzIGxvY2tlZAotCi1ERVBFTkRFTkNJRVMKLSAgIE4vQQotCi1SRVRVUk4gVkFMVUUKLSAgIE5vbmUKLQotU0lERSBFRkZFQ1RTCi0gICBOL0EKLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLXN0YXRpYyB2b2lkIGxvY19zZXRfc2xvdF9pbl91c2UoaW50IHNlbGVjdF9pZCwgYm9vbGVhbiBpbl91c2UpCi17Ci0gICAgbG9jX3N5bmNfZGF0YS5zbG90c1tzZWxlY3RfaWRdLmluX3VzZSA9IGluX3VzZTsKLSAgICBpZiAoaW5fdXNlID09IDEpCi0gICAgICAgIGxvY19zeW5jX2RhdGEuc2xvdHNbc2VsZWN0X2lkXS5zaWduYWxfc2VudCA9IDA7Ci19Ci0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUZVTkNUSU9OICAgIGxvY19hcGlfc2F2ZV9jYWxsYmFjawotCi1ERVNDUklQVElPTgotICAgU2VsZWN0cyB3aGljaCBjYWxsYmFjayBvciBJT0NUTCBldmVudCB0byB3YWl0IGZvci4KLQotICAgVGhlIGV2ZW50X21hc2sgc3BlY2lmaWVzIHRoZSBldmVudChzKS4gSWYgaXQgaXMgUlBDX0xPQ19FVkVOVF9JT0NUTF9SRVBPUlQsCi0gICB0aGVuIGlvY3RsX3R5cGUgc3BlY2lmaWVzIHRoZSBJT0NUTCBldmVudC4KLQotICAgSWYgaW9jdGxfdHlwZSBpcyBub24temVybywgUlBDX0xPQ19FVkVOVF9JT0NUTF9SRVBPUlQgaXMgYXV0b21hdGljYWxseSBhZGRlZC4KLQotREVQRU5ERU5DSUVTCi0gICBOL0EKLQotUkVUVVJOIFZBTFVFCi0gICBTZWxlY3QgSUQgKD49MCkgICAgIDogc3VjY2Vzc2Z1bAotICAgLTEgICAgICAgICAgICAgICAgICA6IG91dCBvZiBidWZmZXIKLQotU0lERSBFRkZFQ1RTCi0gICBOL0EKLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLXN0YXRpYyB2b2lkIGxvY19hcGlfc2F2ZV9jYWxsYmFjaygKLSAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdF9pZCwgICAgICAgICAgICAvKiBTZWxlY3RlZCBzbG90ICovCi0gICAgICBycGNfbG9jX2NsaWVudF9oYW5kbGVfdHlwZSAgICAgICBsb2NfaGFuZGxlLCAgICAgICAgICAgLyogQ2xpZW50IGhhbmRsZSAqLwotICAgICAgcnBjX2xvY19ldmVudF9tYXNrX3R5cGUgICAgICAgICAgZXZlbnRfbWFzaywgICAgICAgICAgIC8qIEV2ZW50IG1hc2sgdG8gd2FpdCBmb3IgKi8KLSAgICAgIHJwY19sb2NfaW9jdGxfZV90eXBlICAgICAgICAgICAgIGlvY3RsX3R5cGUgICAgICAgICAgICAvKiBJT0NUTCB0eXBlIHRvIHdhaXQgZm9yICovCi0pCi17Ci0gICBsb2Nfc3luY19jYWxsX3Nsb3Rfc190eXBlICpzbG90ID0gJmxvY19zeW5jX2RhdGEuc2xvdHNbc2VsZWN0X2lkXTsKLQotICAgc2xvdC0+bG9jX2hhbmRsZSA9IGxvY19oYW5kbGU7Ci0KLSAgIHNsb3QtPmxvY19jYl93YWl0X2V2ZW50X21hc2sgPSBldmVudF9tYXNrOwotICAgc2xvdC0+aW9jdGxfdHlwZSA9IGlvY3RsX3R5cGU7Ci0gICBpZiAoaW9jdGxfdHlwZSkgc2xvdC0+bG9jX2NiX3dhaXRfZXZlbnRfbWFzayB8PSBSUENfTE9DX0VWRU5UX0lPQ1RMX1JFUE9SVDsKLQotICAgcmV0dXJuOwotfQotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1GVU5DVElPTiAgICBsb2Nfc2F2ZV91c2VyX3BheWxvYWQKLQotREVTQ1JJUFRJT04KLSAgIFNhdmVzIHJlY2VpdmVkIHBheWxvYWQgaW50byB1c2VyIGRhdGEgc3RydWN0dXJlcwotCi1SRVRVUk4gVkFMVUUKLSAgIE5vbmUKLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLXN0YXRpYyB2b2lkIGxvY19zYXZlX3VzZXJfcGF5bG9hZCgKLSAgICAgIHJwY19sb2NfZXZlbnRfcGF5bG9hZF91X3R5cGUgICp1c2VyX2NiX3BheWxvYWQsCi0gICAgICBycGNfbG9jX2lvY3RsX2NhbGxiYWNrX3NfdHlwZSAqdXNlcl9pb2N0bF9idWZmZXIsCi0gICAgICBjb25zdCBycGNfbG9jX2V2ZW50X3BheWxvYWRfdV90eXBlICAqcmVjZWl2ZWRfY2JfcGF5bG9hZAotKQotewotICAgaWYgKHVzZXJfY2JfcGF5bG9hZCkKLSAgIHsKLSAgICAgIG1lbWNweSh1c2VyX2NiX3BheWxvYWQsIHJlY2VpdmVkX2NiX3BheWxvYWQsCi0gICAgICAgICAgICBzaXplb2YgKHJwY19sb2NfZXZlbnRfcGF5bG9hZF91X3R5cGUpKTsKLSAgIH0KLSAgIGlmICh1c2VyX2lvY3RsX2J1ZmZlcikKLSAgIHsKLSAgICAgIG1lbWNweSh1c2VyX2lvY3RsX2J1ZmZlciwKLSAgICAgICAgICAgICZyZWNlaXZlZF9jYl9wYXlsb2FkLT5ycGNfbG9jX2V2ZW50X3BheWxvYWRfdV90eXBlX3UuaW9jdGxfcmVwb3J0LAotICAgICAgICAgICAgc2l6ZW9mICp1c2VyX2lvY3RsX2J1ZmZlcik7Ci0gICB9Ci19Ci0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUZVTkNUSU9OICAgIGxvY19hcGlfd2FpdF9jYWxsYmFjawotCi1ERVNDUklQVElPTgotICAgV2FpdHMgZm9yIGEgc2VsZWN0ZWQgY2FsbGJhY2suIFRoZSB3YWl0IGV4cGlyZXMgaW4gdGltZW91dF9zZWNvbmRzIHNlY29uZHMuCi0KLSAgIElmIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgYmVmb3JlIGFuIGV4aXN0aW5nIHdhaXQgaGFzIGZpbmlzaGVkLCBpdCB3aWxsCi0gICBpbW1lZGlhdGVseSByZXR1cm4gRUJVU1kuCi0KLURFUEVOREVOQ0lFUwotICAgTi9BCi0KLVJFVFVSTiBWQUxVRQotICAgUlBDX0xPQ19BUElfU1VDQ0VTUyAgICAgICAgICAgICAgaWYgc3VjY2Vzc2Z1bCAoMCkKLSAgIFJQQ19MT0NfQVBJX1RJTUVPVVQgICAgICAgICAgICAgIGlmIHRpbWVkIG91dAotICAgUlBDX0xPQ19BUElfRU5HSU5FX0JVU1kgICAgICAgICAgaWYgYWxyZWFkeSBpbiBhIHdhaXQKLSAgIFJQQ19MT0NfQVBJX0lOVkFMSURfUEFSQU1FVEVSICAgIGlmIGNhbGxiYWNrIGlzIG5vdCB5ZXQgc2VsZWN0ZWQKLQotU0lERSBFRkZFQ1RTCi0gICBOL0EKLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLXN0YXRpYyBpbnQgbG9jX2FwaV93YWl0X2NhbGxiYWNrKAotICAgICAgaW50IHNlbGVjdF9pZCwgICAgICAgIC8qIElEIGZyb20gbG9jX3NlbGVjdF9jYWxsYmFjaygpICovCi0gICAgICBpbnQgdGltZW91dF9zZWNvbmRzLCAgLyogVGltZW91dCBpbiB0aGlzIG51bWJlciBvZiBzZWNvbmRzICAqLwotICAgICAgcnBjX2xvY19ldmVudF9wYXlsb2FkX3VfdHlwZSAgICAgKmNhbGxiYWNrX3BheWxvYWQsICAgIC8qIFBvaW50ZXIgdG8gY2FsbGJhY2sgcGF5bG9hZCBidWZmZXIsIGNhbiBiZSBOVUxMICovCi0gICAgICBycGNfbG9jX2lvY3RsX2NhbGxiYWNrX3NfdHlwZSAgICAqaW9jdGxfcGF5bG9hZCAgICAgICAgLyogUG9pbnRlciB0byBJT0NUTCBwYXlsb2FkLCBjYW4gYmUgTlVMTCAqLwotKQotewotICAgaW50IHJldF92YWwgPSBSUENfTE9DX0FQSV9TVUNDRVNTOyAgLyogdGhlIHJldHVybiB2YWx1ZSBvZiB0aGlzIGZ1bmN0aW9uOiAwID0gbm8gZXJyb3IgKi8KLSAgIGludCByYyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJldHVybiBjb2RlIGZyb20gcHRocmVhZCBjYWxscyAqLwotCi0gICBzdHJ1Y3QgdGltZXNwZWMgZXhwaXJlX3RpbWU7Ci0KLSAgIGxvY19zeW5jX2NhbGxfc2xvdF9zX3R5cGUgKnNsb3QgPSAmbG9jX3N5bmNfZGF0YS5zbG90c1tzZWxlY3RfaWRdOwotCi0gICBjbG9ja19nZXR0aW1lKENMT0NLX1JFQUxUSU1FLCAmZXhwaXJlX3RpbWUpOwotICAgZXhwaXJlX3RpbWUudHZfc2VjICs9IHRpbWVvdXRfc2Vjb25kczsKLQotICAgLyogV2FpdGluZyAqLwotICAgd2hpbGUgKHNsb3QtPnNpZ25hbF9zZW50ID09IDAgJiYgcmMgIT0gRVRJTUVET1VUKSB7Ci0gICAgICAgcmMgPSBwdGhyZWFkX2NvbmRfdGltZWR3YWl0KCZzbG90LT5sb2NfY2JfYXJyaXZlZF9jb25kLAotICAgICAgICAgICAgICZzbG90LT5sb2NrLCAmZXhwaXJlX3RpbWUpOwotICAgfQotCi0gICBpZiAocmMgPT0gRVRJTUVET1VUKQotICAgewotICAgICAgcmV0X3ZhbCA9IFJQQ19MT0NfQVBJX1RJTUVPVVQ7IC8qIFRpbWVkIG91dCAqLwotICAgICAgQUxPR0UoIlRJTUVPVVQ6ICVkIiwgc2VsZWN0X2lkKTsKLSAgIH0KLSAgIGVsc2UgewotICAgICAgLyogT2J0YWluZWQgdGhlIGZpcnN0IGF3YWl0ZWQgY2FsbGJhY2sgKi8KLSAgICAgIHJldF92YWwgPSBSUENfTE9DX0FQSV9TVUNDRVNTOyAgICAgICAvKiBTdWNjZXNzZnVsICovCi0gICAgICBsb2Nfc2F2ZV91c2VyX3BheWxvYWQoY2FsbGJhY2tfcGF5bG9hZCwgaW9jdGxfcGF5bG9hZCwgJnNsb3QtPmxvY19jYl9yZWNlaXZlZF9wYXlsb2FkKTsKLSAgIH0KLQotICAgcmV0dXJuIHJldF92YWw7Ci19Ci0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUZVTkNUSU9OICAgIGxvY19hcGlfc3luY19pb2N0bAotCi1ERVNDUklQVElPTgotICAgU3luY2hyb25vdXMgSU9DVEwgY2FsbCAocmVlbnRyYW50IHZlcnNpb24pCi0KLURFUEVOREVOQ0lFUwotICAgTi9BCi0KLVJFVFVSTiBWQUxVRQotICAgTG9jIEFQSSBlcnJvciBjb2RlICgwID0gc3VjY2VzcykKLQotU0lERSBFRkZFQ1RTCi0gICBOL0EKLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLWludCBsb2NfYXBpX3N5bmNfaW9jdGwKLSgKLSAgICAgIHJwY19sb2NfY2xpZW50X2hhbmRsZV90eXBlICAgICAgICAgICBoYW5kbGUsCi0gICAgICBycGNfbG9jX2lvY3RsX2VfdHlwZSAgICAgICAgICAgICAgICAgaW9jdGxfdHlwZSwKLSAgICAgIHJwY19sb2NfaW9jdGxfZGF0YV91X3R5cGUqICAgICAgICAgICBpb2N0bF9kYXRhX3B0ciwKLSAgICAgIHVpbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0X21zZWMsCi0gICAgICBycGNfbG9jX2lvY3RsX2NhbGxiYWNrX3NfdHlwZSAgICAgICAqY2JfZGF0YV9wdHIKLSkKLXsKLSAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjID0gLTE7Ci0gICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RfaWQ7Ci0gICBycGNfbG9jX2lvY3RsX2NhbGxiYWNrX3NfdHlwZSAgICBjYWxsYmFja19kYXRhOwotCi0gICBzZWxlY3RfaWQgPSBsb2NfbG9ja19hX3Nsb3QoKTsKLQotICAgaWYgKHNlbGVjdF9pZCA8IDAgfHwgc2VsZWN0X2lkID49IGxvY19zeW5jX2RhdGEubnVtX29mX3Nsb3RzKQotICAgewotICAgICAgQUxPR0UoInNsb3Qgbm90IGF2YWlsYWJsZSBpb2N0bF90eXBlID0gJXMiLAotICAgICAgICAgICBsb2NfZ2V0X2lvY3RsX3R5cGVfbmFtZShpb2N0bF90eXBlKSk7Ci0gICAgICByZXR1cm4gcmM7Ci0gICB9Ci0KLSAgIGxvY19zZXRfc2xvdF9pbl91c2Uoc2VsZWN0X2lkLCAxKTsgLy8gc2V0IHNsb3QgaW4gdXNlIHRvIHRydWUKLQotICAgLy8gU2VsZWN0IHRoZSBjYWxsYmFjayB3ZSBhcmUgd2FpdGluZyBmb3IKLSAgIGxvY19hcGlfc2F2ZV9jYWxsYmFjayhzZWxlY3RfaWQsIGhhbmRsZSwgMCwgaW9jdGxfdHlwZSk7Ci0KLSAgIGxvY191bmxvY2tfc2xvdChzZWxlY3RfaWQpOyAvLyBzbG90IGlzIHVubG9ja2VkLCBidXQgaW5fdXNlIGlzIHN0aWxsIHRydWUKLQotICAgLy8gd2Ugd2FudCB0byBhdm9pZCBrZWVwaW5nIHRoZSBzbG90IGxvY2tlZCBkdXJpbmcgdGhlIGxvY19pb2N0bCBiZWNhdXNlIHRoZSBycGMKLSAgIC8vIGZyYW1ld29yayB3aWxsIGFsc28gbG9jayBhIGRpZmZlcmVudCBtdXRleCBkdXJpbmcgdGhpcyBjYWxsLCBhbmQgdHlwaWNhbGx5Ci0gICAvLyBsb2NraW5nIHR3byBkaWZmZXJlbnQgbXV0ZXhlcyBhdCB0aGUgc2FtZSB0aW1lIGNhbiBsZWFkIHRvIGRlYWRsb2NrLgotICAgcmMgPSAgbG9jX2lvY3RsKGhhbmRsZSwgaW9jdGxfdHlwZSwgaW9jdGxfZGF0YV9wdHIpOwotCi0gICBsb2NfbG9ja19zbG90KHNlbGVjdF9pZCk7Ci0KLSAgIGlmIChyYyAhPSBSUENfTE9DX0FQSV9TVUNDRVNTKQotICAgewotICAgICAgQUxPR0UoImxvY19pb2N0bCBmYWlsZWQgc2VsZWN0X2lkID0gJWQsIGlvY3RsX3R5cGUgJXMsIHJldHVybmVkICVzIiwKLSAgICAgICAgICAgc2VsZWN0X2lkLCBsb2NfZ2V0X2lvY3RsX3R5cGVfbmFtZShpb2N0bF90eXBlKSwgbG9jX2dldF9pb2N0bF9zdGF0dXNfbmFtZShyYykpOwotICAgfQotICAgZWxzZSB7Ci0gICAgICBBTE9HVigic2VsZWN0X2lkID0gJWQsIGlvY3RsX3R5cGUgJWQsIHJldHVybmVkIFJQQ19MT0NfQVBJX1NVQ0NFU1MiLAotICAgICAgICAgIHNlbGVjdF9pZCwgaW9jdGxfdHlwZSk7Ci0gICAgICAvLyBXYWl0IGZvciB0aGUgY2FsbGJhY2sgb2YgbG9jX2lvY3RsCi0gICAgICBpZiAoKHJjID0gbG9jX2FwaV93YWl0X2NhbGxiYWNrKHNlbGVjdF9pZCwgdGltZW91dF9tc2VjIC8gMTAwMCwgTlVMTCwgJmNhbGxiYWNrX2RhdGEpKSAhPSAwKQotICAgICAgewotICAgICAgICAgLy8gQ2FsbGJhY2sgd2FpdGluZyBmYWlsZWQKLSAgICAgICAgIEFMT0dFKCJjYWxsYmFjayB3YWl0IGZhaWxlZCBzZWxlY3RfaWQgPSAlZCwgaW9jdGxfdHlwZSAlcywgcmV0dXJuZWQgJXMiLAotICAgICAgICAgICAgICBzZWxlY3RfaWQsIGxvY19nZXRfaW9jdGxfdHlwZV9uYW1lKGlvY3RsX3R5cGUpLCBsb2NfZ2V0X2lvY3RsX3N0YXR1c19uYW1lKHJjKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgICBpZiAoY2JfZGF0YV9wdHIpIG1lbWNweShjYl9kYXRhX3B0ciwgJmNhbGxiYWNrX2RhdGEsIHNpemVvZiAqY2JfZGF0YV9wdHIpOwotICAgICAgICAgaWYgKGNhbGxiYWNrX2RhdGEuc3RhdHVzICE9IFJQQ19MT0NfQVBJX1NVQ0NFU1MpCi0gICAgICAgICB7Ci0gICAgICAgICAgICByYyA9IGNhbGxiYWNrX2RhdGEuc3RhdHVzOwotICAgICAgICAgICAgQUxPR0UoImNhbGxiYWNrIHN0YXR1cyBmYWlsZWQgc2VsZWN0X2lkID0gJWQsIGlvY3RsX3R5cGUgJXMsIHJldHVybmVkICVzIiwKLSAgICAgICAgICAgICAgICAgc2VsZWN0X2lkLCBsb2NfZ2V0X2lvY3RsX3R5cGVfbmFtZShpb2N0bF90eXBlKSwgbG9jX2dldF9pb2N0bF9zdGF0dXNfbmFtZShyYykpOwotICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dWKCJjYWxsYmFjayBzdGF0dXMgc3VjY2VzcyBzZWxlY3RfaWQgPSAlZCwgaW9jdGxfdHlwZSAlZCwgcmV0dXJuZWQgJWQiLAotICAgICAgICAgICAgICAgIHNlbGVjdF9pZCwgaW9jdGxfdHlwZSwgcmMpOwotICAgICAgICAgfQotICAgICAgfSAvKiB3YWl0IGNhbGxiYWNrICovCi0gICB9IC8qIGxvY19pb2N0bCAqLwotCi0gICBsb2Nfc2V0X3Nsb3RfaW5fdXNlKHNlbGVjdF9pZCwgMCk7IC8vIHNldCBzbG90IGluIHVzZSB0byBmYWxzZQotICAgbG9jX3VubG9ja19zbG90KHNlbGVjdF9pZCk7Ci0KLSAgIHJldHVybiByYzsKLX0KLQotCmRpZmYgLS1naXQgYS9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaS1ycGMtNTAwMDEvbGlibG9jX2FwaS1ycGMtZ2x1ZS9zcmMvbG9jX2FwaWNiX2FwcGluaXQuYyBiL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpLXJwYy01MDAwMS9saWJsb2NfYXBpLXJwYy1nbHVlL3NyYy9sb2NfYXBpY2JfYXBwaW5pdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjViMjkxLi4wMDAwMDAwCi0tLSBhL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpLXJwYy01MDAwMS9saWJsb2NfYXBpLXJwYy1nbHVlL3NyYy9sb2NfYXBpY2JfYXBwaW5pdC5jCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDExLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZwotICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCi0gKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCi0gKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKLSAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCi0gKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCi0gKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSAicnBjL3JwYy5oIgotCi0vKiBJbmNsdWRlIFJQQyBoZWFkZXJzICovCi0jaWZkZWYgVVNFX0xPQ0FMX1JQQwotI2luY2x1ZGUgInJwY19pbmMvbG9jX2FwaV9jb21tb24uaCIKLSNpbmNsdWRlICJycGNfaW5jL2xvY19hcGkuaCIKLSNpbmNsdWRlICJycGNfaW5jL2xvY19hcGlfY2IuaCIKLSNlbmRpZgotCi0jaWZkZWYgVVNFX1FDT01fQVVUT19SUEMKLSNpbmNsdWRlICJsb2NfYXBpX3JwY2dlbl9ycGMuaCIKLSNpbmNsdWRlICJsb2NfYXBpX3JwY2dlbl9jb21tb25fcnBjLmgiCi0jaW5jbHVkZSAibG9jX2FwaV9ycGNnZW5fY2JfcnBjLmgiCi0jZW5kaWYKLQotI2luY2x1ZGUgInJwY19pbmMvbG9jX2FwaV9maXh1cC5oIgotI2luY2x1ZGUgImxvY19hcGljYl9hcHBpbml0LmgiCi0KLSNkZWZpbmUgUlBDX0ZVTkNfVkVSU0lPTl9CQVNFKGEsYikgYSAjIyBiCi0jZGVmaW5lIFJQQ19DQl9GVU5DX1ZFUlMoYSxiKSBSUENfRlVOQ19WRVJTSU9OX0JBU0UoYSxiKQotCi1zdGF0aWMgU1ZDWFBSVCogc3ZyUG9ydCA9IE5VTEw7Ci0KLWV4dGVybiB2b2lkIFJQQ19DQl9GVU5DX1ZFUlMobG9jX2FwaWNicHJvZ18sTE9DX0FQSUNCVkVSU18wMDAxKShzdHJ1Y3Qgc3ZjX3JlcSAqcnFzdHAsIHJlZ2lzdGVyIFNWQ1hQUlQgKnRyYW5zcCk7Ci0KLWludCBsb2NfYXBpY2JfYXBwX2luaXQodm9pZCkKLXsKLQotICAvKiBSZWdpc3RlciBhIGNhbGxiYWNrIHNlcnZlciB0byB1c2UgdGhlIGxvY19hcGljYnByb2dfKiBmdW5jdGlvbiAgKi8KLSAgaWYgKHN2clBvcnQgPT0gTlVMTCkgewotICAgICAgICBzdnJQb3J0ID0gc3ZjcnRyX2NyZWF0ZSgpOwotICB9Ci0gIGlmICghc3ZyUG9ydCkgcmV0dXJuIC0xOwotCi0gIHhwcnRfcmVnaXN0ZXIoc3ZyUG9ydCk7Ci0gIGlmKHN2Y19yZWdpc3RlcihzdnJQb3J0LCBMT0NfQVBJQ0JQUk9HLCBMT0NfQVBJQ0JWRVJTXzAwMDEsIFJQQ19DQl9GVU5DX1ZFUlMobG9jX2FwaWNicHJvZ18sTE9DX0FQSUNCVkVSU18wMDAxKSwwKSkKLSAgewotICAgICByZXR1cm4gMDsKLSAgfQotICBlbHNlCi0gIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLX0KLQotdm9pZCBsb2NfYXBpY2JfYXBwX2RlaW5pdCh2b2lkKQotewotICAgaWYgKHN2clBvcnQgPT0gTlVMTCkKLSAgIHsKLSAgICAgIHJldHVybjsKLSAgIH0KLQotICAgc3ZjX3VucmVnaXN0ZXIoc3ZyUG9ydCwgTE9DX0FQSUNCUFJPRywgTE9DX0FQSUNCVkVSU18wMDAxKTsKLSAgIHhwcnRfdW5yZWdpc3RlcihzdnJQb3J0KTsKLSAgIHN2Y19kZXN0cm95KHN2clBvcnQpOwotICAgc3ZyUG9ydCA9IE5VTEw7Ci19Ci0KZGlmZiAtLWdpdCBhL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpLXJwYy01MDAwMS9saWJsb2NfYXBpLXJwYy1zdHViL0FuZHJvaWQubWsgYi9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaS1ycGMtNTAwMDEvbGlibG9jX2FwaS1ycGMtc3R1Yi9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDk4N2U2Li4wMDAwMDAwCi0tLSBhL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpLXJwYy01MDAwMS9saWJsb2NfYXBpLXJwYy1zdHViL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi1MT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi0jIGZ1bmN0aW9ucwotTE9DX1JQQ0dFTl9BUElTX1BBVEggOj0gJChUQVJHRVRfT1VUX0lOVEVSTUVESUFURVMpL2xvY19hcGkvbGlibG9jX2FwaV9ycGNnZW5faW50ZXJtZWRpYXRlcwotTE9DX1JQQ0dFTl9BUElTX1BBVEhfRkwgOj0gLi4vLi4vLi4vLi4vLi4vJChUQVJHRVRfT1VUX0lOVEVSTUVESUFURVMpL2xvY19hcGkvbGlibG9jX2FwaV9ycGNnZW5faW50ZXJtZWRpYXRlcwotCi1MT0NBTF9NT0RVTEUgOj0gbGlibG9jX2FwaV9ycGNnZW4KLUxPQ0FMX01PRFVMRV9PV05FUiA6PSBxY29tCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotICAgIGxpYnJwYyBcCi0gICAgbGliY29tbW9uZGVmcwotCi1MT0NBTF9TUkNfRklMRVMgKz0gXAotICAgIHNyYy9sb2NfYXBpX3JwY2dlbl9jYl94ZHIuYyBcCi0gICAgc3JjL2xvY19hcGlfcnBjZ2VuX2NvbW1vbl94ZHIuYyBcCi0gICAgc3JjL2xvY19hcGlfcnBjZ2VuX2NiX3N2Yy5jIFwKLSAgICBzcmMvbG9jX2FwaV9ycGNnZW5fY2xudC5jIFwKLSAgICBzcmMvbG9jX2FwaV9ycGNnZW5feGRyLmMKLQotTE9DQUxfQ19JTkNMVURFUyArPSBoYXJkd2FyZS9tc203ay9saWJycGMKLUxPQ0FMX0NfSU5DTFVERVMgKz0gJChMT0NfUlBDR0VOX0FQSVNfUEFUSCkvLi4vLi4vU0hBUkVEX0xJQlJBUklFUy9saWJjb21tb25kZWZzX2ludGVybWVkaWF0ZXMvaW5jCi1MT0NBTF9DX0lOQ0xVREVTICs9ICQoTE9DQUxfUEFUSCkvaW5jCi1MT0NBTF9DX0lOQ0xVREVTICs9ICQoVEFSR0VUX09VVF9IRUFERVJTKS9saWJjb21tb25kZWZzL3JwY2dlbi9pbmMKLQotTE9DQUxfQ09QWV9IRUFERVJTX1RPIDo9IGxvY19hcGkvcnBjZ2VuL2luYwotTE9DQUxfQ09QWV9IRUFERVJTIDo9IGluYy9sb2NfYXBpX3JwY2dlbl9ycGMuaAotTE9DQUxfQ09QWV9IRUFERVJTICs9IGluYy9sb2NfYXBpX3JwY2dlbl9jb21tb25fcnBjLmgKLUxPQ0FMX0NPUFlfSEVBREVSUyArPSBpbmMvbG9jX2FwaV9ycGNnZW5fY2JfcnBjLmgKLUxPQ0FMX0NPUFlfSEVBREVSUyArPSBpbmMvbG9jX2FwaWNiX2FwcGluaXQuaAotCi1MT0NBTF9MRExJQlMgKz0gLWxwdGhyZWFkCi1MT0NBTF9QUkVMSU5LX01PRFVMRSA6PSBmYWxzZQotaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGktcnBjLTUwMDAxL2xpYmxvY19hcGktcnBjLXN0dWIvTWFrZWZpbGUuYW0gYi9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaS1ycGMtNTAwMDEvbGlibG9jX2FwaS1ycGMtc3R1Yi9NYWtlZmlsZS5hbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFjOGM4YS4uMDAwMDAwMAotLS0gYS9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaS1ycGMtNTAwMDEvbGlibG9jX2FwaS1ycGMtc3R1Yi9NYWtlZmlsZS5hbQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLUFNX0NGTEFHUyA9IFwKLSAgIC1JLi4vLi4vLi4vdXRpbHMgXAotICAgLUkuL2luYyBcCi0gICAkKE1TTTdLX0NGTEFHUykKLQotcmVxdWlyZWRsaWJzID0gXAotICAgIC4uLy4uLy4uL3V0aWxzL2xpYmdwc191dGlsc19zby5sYSBcCi0gICAgJChNU003S19MSUJTKQotCi1oX3NvdXJjZXMgPSBcCi0gICAgaW5jL2xvY19hcGlfcnBjZ2VuX3JwYy5oIFwKLSAgICBpbmMvbG9jX2FwaV9ycGNnZW5fY29tbW9uX3JwYy5oIFwKLSAgICBpbmMvbG9jX2FwaV9ycGNnZW5fY2JfcnBjLmggXAotICAgIGluYy9sb2NfYXBpY2JfYXBwaW5pdC5oCi0KLWNfc291cmNlcyA9IFwKLSAgICBzcmMvbG9jX2FwaV9ycGNnZW5fY2JfeGRyLmMgXAotICAgIHNyYy9sb2NfYXBpX3JwY2dlbl9jb21tb25feGRyLmMgXAotICAgIHNyYy9sb2NfYXBpX3JwY2dlbl9jYl9zdmMuYyBcCi0gICAgc3JjL2xvY19hcGlfcnBjZ2VuX2NsbnQuYyBcCi0gICAgc3JjL2xvY19hcGlfcnBjZ2VuX3hkci5jCi0KLQotCi1saWJyYXJ5X2luY2x1ZGVkaXIgPSAkKHBrZ2luY2x1ZGVkaXIpL2xpYmxvY19hcGktcnBjLTUwMDAxL2xpYmxvY19hcGktcnBjLXN0dWIvaW5jCi1saWJyYXJ5X2luY2x1ZGVfSEVBREVSUyA9ICQoaF9zb3VyY2VzKQotbGlibG9jX2FwaV9ycGNnZW5fbGFfU09VUkNFUyA9ICQoY19zb3VyY2VzKSAkKGhfc291cmNlcykKLQotaWYgVVNFX0dMSUIKLWxpYmxvY19hcGlfcnBjZ2VuX2xhX0NGTEFHUyA9IC1EVVNFX0dMSUIgJChBTV9DRkxBR1MpIEBHTElCX0NGTEFHU0AKLWxpYmxvY19hcGlfcnBjZ2VuX2xhX0xERkxBR1MgPSAtbHN0ZGMrKyAtbHB0aHJlYWQgQEdMSUJfTElCU0AgLXNoYXJlZCAtdmVyc2lvbi1pbmZvIDE6MDowCi1saWJsb2NfYXBpX3JwY2dlbl9sYV9DUFBGTEFHUyA9IC1EVVNFX0dMSUIgJChBTV9DRkxBR1MpICQoQU1fQ1BQRkxBR1MpIEBHTElCX0NGTEFHU0AKLWVsc2UKLWxpYmxvY19hcGlfcnBjZ2VuX2xhX0NGTEFHUyA9ICQoQU1fQ0ZMQUdTKQotbGlibG9jX2FwaV9ycGNnZW5fbGFfTERGTEFHUyA9IC1scHRocmVhZCAtc2hhcmVkIC12ZXJzaW9uLWluZm8gMTowOjAKLWxpYmxvY19hcGlfcnBjZ2VuX2xhX0NQUEZMQUdTID0gJChBTV9DRkxBR1MpICQoQU1fQ1BQRkxBR1MpCi1lbmRpZgotCi1saWJsb2NfYXBpX3JwY2dlbl9sYV9MSUJBREQgPSAkKHJlcXVpcmVkbGlicykgLWxzdGRjKysKLQotI0NyZWF0ZSBhbmQgSW5zdGFsbCBMaWJyYXJpZXMKLWxpYl9MVExJQlJBUklFUyA9IGxpYmxvY19hcGlfcnBjZ2VuLmxhCmRpZmYgLS1naXQgYS9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaS1ycGMtNTAwMDEvbGlibG9jX2FwaS1ycGMtc3R1Yi9pbmMvbG9jX2FwaV9ycGNnZW5fY2JfcnBjLmggYi9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaS1ycGMtNTAwMDEvbGlibG9jX2FwaS1ycGMtc3R1Yi9pbmMvbG9jX2FwaV9ycGNnZW5fY2JfcnBjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3ZjJjMzcuLjAwMDAwMDAKLS0tIGEvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGktcnBjLTUwMDAxL2xpYmxvY19hcGktcnBjLXN0dWIvaW5jL2xvY19hcGlfcnBjZ2VuX2NiX3JwYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMSwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKLSAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAotICogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAotICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgotICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCi0gKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQotICogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgotICogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0vKgotICogUGxlYXNlIGRvIG5vdCBlZGl0IHRoaXMgZmlsZS4KLSAqIEl0IHdhcyBnZW5lcmF0ZWQgdXNpbmcgcnBjZ2VuLgotICovCi0KLSNpZm5kZWYgX0xPQ19BUElfQ0JfUlBDX0hfUlBDR0VOCi0jZGVmaW5lIF9MT0NfQVBJX0NCX1JQQ19IX1JQQ0dFTgotCi0jaW5jbHVkZSAibGlicnBjLmgiCi0jaW5jbHVkZSAiY29tbW9uZGVmc19ycGNnZW5fcnBjLmgiCi0jaW5jbHVkZSAibG9jX2FwaV9ycGNnZW5fY29tbW9uX3JwYy5oIgotCi0jaW5jbHVkZSA8cHRocmVhZC5oPgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLQotc3RydWN0IHJwY19sb2NfZXZlbnRfY2JfZl90eXBlX2FyZ3MgewotICAgIHJwY191aW50MzIgY2JfaWQ7Ci0gICAgcnBjX2xvY19jbGllbnRfaGFuZGxlX3R5cGUgbG9jX2hhbmRsZTsKLSAgICBycGNfbG9jX2V2ZW50X21hc2tfdHlwZSBsb2NfZXZlbnQ7Ci0gICAgcnBjX2xvY19ldmVudF9wYXlsb2FkX3VfdHlwZSAqbG9jX2V2ZW50X3BheWxvYWQ7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgcnBjX2xvY19ldmVudF9jYl9mX3R5cGVfYXJncyBycGNfbG9jX2V2ZW50X2NiX2ZfdHlwZV9hcmdzOwotCi1zdHJ1Y3QgcnBjX2xvY19ldmVudF9jYl9mX3R5cGVfcmV0cyB7Ci0gICAgcnBjX2ludDMyIGxvY19ldmVudF9jYl9mX3R5cGVfcmVzdWx0OwotfTsKLXR5cGVkZWYgc3RydWN0IHJwY19sb2NfZXZlbnRfY2JfZl90eXBlX3JldHMgcnBjX2xvY19ldmVudF9jYl9mX3R5cGVfcmV0czsKLSNkZWZpbmUgTE9DX0FQSUNCVkVSUyAweDAwMDUwMDA2Ci0KLSNkZWZpbmUgTE9DX0FQSUNCUFJPRyAweDMxMDAwMDhDCi0jZGVmaW5lIExPQ19BUElDQlZFUlNfMDAwMSAweDAwMDUwMDAxCi0KLSNpZiBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKF9fY3BsdXNwbHVzKQotI2RlZmluZSBycGNfbG9jX2V2ZW50X2NiX2ZfdHlwZSAxCi1leHRlcm4gIGVudW0gY2xudF9zdGF0IHJwY19sb2NfZXZlbnRfY2JfZl90eXBlXzB4MDAwNTAwMDEocnBjX2xvY19ldmVudF9jYl9mX3R5cGVfYXJncyAqLCBycGNfbG9jX2V2ZW50X2NiX2ZfdHlwZV9yZXRzICosIENMSUVOVCAqKTsKLWV4dGVybiAgYm9vbF90IHJwY19sb2NfZXZlbnRfY2JfZl90eXBlXzB4MDAwNTAwMDFfc3ZjKHJwY19sb2NfZXZlbnRfY2JfZl90eXBlX2FyZ3MgKiwgcnBjX2xvY19ldmVudF9jYl9mX3R5cGVfcmV0cyAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKLWV4dGVybiBpbnQgbG9jX2FwaWNicHJvZ18weDAwMDUwMDAxX2ZyZWVyZXN1bHQgKFNWQ1hQUlQgKiwgeGRycHJvY190LCBjYWRkcl90KTsKLQotI2Vsc2UgLyogSyZSIEMgKi8KLSNkZWZpbmUgcnBjX2xvY19ldmVudF9jYl9mX3R5cGUgMQotZXh0ZXJuICBlbnVtIGNsbnRfc3RhdCBycGNfbG9jX2V2ZW50X2NiX2ZfdHlwZV8weDAwMDUwMDAxKCk7Ci1leHRlcm4gIGJvb2xfdCBycGNfbG9jX2V2ZW50X2NiX2ZfdHlwZV8weDAwMDUwMDAxX3N2YygpOwotZXh0ZXJuIGludCBsb2NfYXBpY2Jwcm9nXzB4MDAwNTAwMDFfZnJlZXJlc3VsdCAoKTsKLSNlbmRpZiAvKiBLJlIgQyAqLwotI2RlZmluZSBMT0NfQVBJQ0JWRVJTXzAwMDIgMHgwMDA1MDAwMgotCi0jaWYgZGVmaW5lZChfX1NURENfXykgfHwgZGVmaW5lZChfX2NwbHVzcGx1cykKLSNkZWZpbmUgcnBjX2xvY19hcGlfY2JfbnVsbCAweGZmZmZmZjAwCi1leHRlcm4gIGVudW0gY2xudF9zdGF0IHJwY19sb2NfYXBpX2NiX251bGxfMHgwMDA1MDAwMih2b2lkICosIGludCAqLCBDTElFTlQgKik7Ci1leHRlcm4gIGJvb2xfdCBycGNfbG9jX2FwaV9jYl9udWxsXzB4MDAwNTAwMDJfc3ZjKHZvaWQgKiwgaW50ICosIHN0cnVjdCBzdmNfcmVxICopOwotZXh0ZXJuIGludCBsb2NfYXBpY2Jwcm9nXzB4MDAwNTAwMDJfZnJlZXJlc3VsdCAoU1ZDWFBSVCAqLCB4ZHJwcm9jX3QsIGNhZGRyX3QpOwotCi0jZWxzZSAvKiBLJlIgQyAqLwotI2RlZmluZSBycGNfbG9jX2FwaV9jYl9udWxsIDB4ZmZmZmZmMDAKLWV4dGVybiAgZW51bSBjbG50X3N0YXQgcnBjX2xvY19hcGlfY2JfbnVsbF8weDAwMDUwMDAyKCk7Ci1leHRlcm4gIGJvb2xfdCBycGNfbG9jX2FwaV9jYl9udWxsXzB4MDAwNTAwMDJfc3ZjKCk7Ci1leHRlcm4gaW50IGxvY19hcGljYnByb2dfMHgwMDA1MDAwMl9mcmVlcmVzdWx0ICgpOwotI2VuZGlmIC8qIEsmUiBDICovCi0jZGVmaW5lIExPQ19BUElDQlZFUlNfMDAwMyAweDAwMDUwMDAzCi0KLSNpZiBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKF9fY3BsdXNwbHVzKQotZXh0ZXJuICBlbnVtIGNsbnRfc3RhdCBycGNfbG9jX2FwaV9jYl9udWxsXzB4MDAwNTAwMDModm9pZCAqLCBpbnQgKiwgQ0xJRU5UICopOwotZXh0ZXJuICBib29sX3QgcnBjX2xvY19hcGlfY2JfbnVsbF8weDAwMDUwMDAzX3N2Yyh2b2lkICosIGludCAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKLWV4dGVybiBpbnQgbG9jX2FwaWNicHJvZ18weDAwMDUwMDAzX2ZyZWVyZXN1bHQgKFNWQ1hQUlQgKiwgeGRycHJvY190LCBjYWRkcl90KTsKLQotI2Vsc2UgLyogSyZSIEMgKi8KLWV4dGVybiAgZW51bSBjbG50X3N0YXQgcnBjX2xvY19hcGlfY2JfbnVsbF8weDAwMDUwMDAzKCk7Ci1leHRlcm4gIGJvb2xfdCBycGNfbG9jX2FwaV9jYl9udWxsXzB4MDAwNTAwMDNfc3ZjKCk7Ci1leHRlcm4gaW50IGxvY19hcGljYnByb2dfMHgwMDA1MDAwM19mcmVlcmVzdWx0ICgpOwotI2VuZGlmIC8qIEsmUiBDICovCi0jZGVmaW5lIExPQ19BUElDQlZFUlNfMDAwNCAweDAwMDUwMDA0Ci0KLSNpZiBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKF9fY3BsdXNwbHVzKQotZXh0ZXJuICBlbnVtIGNsbnRfc3RhdCBycGNfbG9jX2FwaV9jYl9udWxsXzB4MDAwNTAwMDQodm9pZCAqLCBpbnQgKiwgQ0xJRU5UICopOwotZXh0ZXJuICBib29sX3QgcnBjX2xvY19hcGlfY2JfbnVsbF8weDAwMDUwMDA0X3N2Yyh2b2lkICosIGludCAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKLWV4dGVybiBpbnQgbG9jX2FwaWNicHJvZ18weDAwMDUwMDA0X2ZyZWVyZXN1bHQgKFNWQ1hQUlQgKiwgeGRycHJvY190LCBjYWRkcl90KTsKLQotI2Vsc2UgLyogSyZSIEMgKi8KLWV4dGVybiAgZW51bSBjbG50X3N0YXQgcnBjX2xvY19hcGlfY2JfbnVsbF8weDAwMDUwMDA0KCk7Ci1leHRlcm4gIGJvb2xfdCBycGNfbG9jX2FwaV9jYl9udWxsXzB4MDAwNTAwMDRfc3ZjKCk7Ci1leHRlcm4gaW50IGxvY19hcGljYnByb2dfMHgwMDA1MDAwNF9mcmVlcmVzdWx0ICgpOwotI2VuZGlmIC8qIEsmUiBDICovCi0jZGVmaW5lIExPQ19BUElDQlZFUlNfMDAwNSAweDAwMDUwMDA1Ci0KLSNpZiBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKF9fY3BsdXNwbHVzKQotZXh0ZXJuICBlbnVtIGNsbnRfc3RhdCBycGNfbG9jX2FwaV9jYl9udWxsXzB4MDAwNTAwMDUodm9pZCAqLCBpbnQgKiwgQ0xJRU5UICopOwotZXh0ZXJuICBib29sX3QgcnBjX2xvY19hcGlfY2JfbnVsbF8weDAwMDUwMDA1X3N2Yyh2b2lkICosIGludCAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKLWV4dGVybiBpbnQgbG9jX2FwaWNicHJvZ18weDAwMDUwMDA1X2ZyZWVyZXN1bHQgKFNWQ1hQUlQgKiwgeGRycHJvY190LCBjYWRkcl90KTsKLQotI2Vsc2UgLyogSyZSIEMgKi8KLWV4dGVybiAgZW51bSBjbG50X3N0YXQgcnBjX2xvY19hcGlfY2JfbnVsbF8weDAwMDUwMDA1KCk7Ci1leHRlcm4gIGJvb2xfdCBycGNfbG9jX2FwaV9jYl9udWxsXzB4MDAwNTAwMDVfc3ZjKCk7Ci1leHRlcm4gaW50IGxvY19hcGljYnByb2dfMHgwMDA1MDAwNV9mcmVlcmVzdWx0ICgpOwotI2VuZGlmIC8qIEsmUiBDICovCi0jZGVmaW5lIExPQ19BUElDQlZFUlNfMDAwNiAweDAwMDUwMDA2Ci0KLSNpZiBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKF9fY3BsdXNwbHVzKQotZXh0ZXJuICBlbnVtIGNsbnRfc3RhdCBycGNfbG9jX2FwaV9jYl9udWxsXzB4MDAwNTAwMDYodm9pZCAqLCBpbnQgKiwgQ0xJRU5UICopOwotZXh0ZXJuICBib29sX3QgcnBjX2xvY19hcGlfY2JfbnVsbF8weDAwMDUwMDA2X3N2Yyh2b2lkICosIGludCAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKLWV4dGVybiBpbnQgbG9jX2FwaWNicHJvZ18weDAwMDUwMDA2X2ZyZWVyZXN1bHQgKFNWQ1hQUlQgKiwgeGRycHJvY190LCBjYWRkcl90KTsKLQotI2Vsc2UgLyogSyZSIEMgKi8KLWV4dGVybiAgZW51bSBjbG50X3N0YXQgcnBjX2xvY19hcGlfY2JfbnVsbF8weDAwMDUwMDA2KCk7Ci1leHRlcm4gIGJvb2xfdCBycGNfbG9jX2FwaV9jYl9udWxsXzB4MDAwNTAwMDZfc3ZjKCk7Ci1leHRlcm4gaW50IGxvY19hcGljYnByb2dfMHgwMDA1MDAwNl9mcmVlcmVzdWx0ICgpOwotI2VuZGlmIC8qIEsmUiBDICovCi0KLS8qIHRoZSB4ZHIgZnVuY3Rpb25zICovCi0KLSNpZiBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKF9fY3BsdXNwbHVzKQotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2NfZXZlbnRfY2JfZl90eXBlX2FyZ3MgKFhEUiAqLCBycGNfbG9jX2V2ZW50X2NiX2ZfdHlwZV9hcmdzKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19ldmVudF9jYl9mX3R5cGVfcmV0cyAoWERSICosIHJwY19sb2NfZXZlbnRfY2JfZl90eXBlX3JldHMqKTsKLQotI2Vsc2UgLyogSyZSIEMgKi8KLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2NfZXZlbnRfY2JfZl90eXBlX2FyZ3MgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX2V2ZW50X2NiX2ZfdHlwZV9yZXRzICgpOwotCi0jZW5kaWYgLyogSyZSIEMgKi8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmIC8qICFfTE9DX0FQSV9DQl9SUENfSF9SUENHRU4gKi8KZGlmZiAtLWdpdCBhL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpLXJwYy01MDAwMS9saWJsb2NfYXBpLXJwYy1zdHViL2luYy9sb2NfYXBpX3JwY2dlbl9jb21tb25fcnBjLmggYi9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaS1ycGMtNTAwMDEvbGlibG9jX2FwaS1ycGMtc3R1Yi9pbmMvbG9jX2FwaV9ycGNnZW5fY29tbW9uX3JwYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTA3ZGUyLi4wMDAwMDAwCi0tLSBhL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpLXJwYy01MDAwMS9saWJsb2NfYXBpLXJwYy1zdHViL2luYy9sb2NfYXBpX3JwY2dlbl9jb21tb25fcnBjLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYxICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMSwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKLSAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAotICogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAotICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgotICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCi0gKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQotICogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgotICogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0vKgotICogUGxlYXNlIGRvIG5vdCBlZGl0IHRoaXMgZmlsZS4KLSAqIEl0IHdhcyBnZW5lcmF0ZWQgdXNpbmcgcnBjZ2VuLgotICovCi0KLSNpZm5kZWYgX0xPQ19BUElfQ09NTU9OX1JQQ19IX1JQQ0dFTgotI2RlZmluZSBfTE9DX0FQSV9DT01NT05fUlBDX0hfUlBDR0VOCi0KLSNpbmNsdWRlICJsaWJycGMuaCIKLSNpbmNsdWRlICJjb21tb25kZWZzX3JwY2dlbl9ycGMuaCIKLQotI2luY2x1ZGUgPHB0aHJlYWQuaD4KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0jZGVmaW5lIExPQ19BUElfVE9PTFZFUlMgMHgwMDA0MDAzMAotI2RlZmluZSBMT0NfQVBJX0ZFQVRVUkVTIDB4MDAwMDAwMDEKLSNkZWZpbmUgUlBDX0xPQ19FVkVOVF9TVEFUVVNfUkVQT1JUIDB4MDAwMDAxMDAKLSNkZWZpbmUgUlBDX0xPQ19FVkVOVF9BU1NJU1RBTkNFX0RBVEFfUkVRVUVTVCAweDAwMDAwMDIwCi0jZGVmaW5lIFJQQ19MT0NfRVZFTlRfV1BTX05FRURFRF9SRVFVRVNUIDB4MDAwMDAyMDAKLSNkZWZpbmUgUlBDX0xPQ19FVkVOVF9TQVRFTExJVEVfUkVQT1JUIDB4MDAwMDAwMDIKLSNkZWZpbmUgUlBDX0xPQ19FVkVOVF9QQVJTRURfUE9TSVRJT05fUkVQT1JUIDB4MDAwMDAwMDEKLSNkZWZpbmUgUlBDX0xPQ19FVkVOVF9SRVNFUlZFRCAweDgwMDAwMDAwMDAwMDAwMDAKLSNkZWZpbmUgUlBDX0xPQ19FVkVOVF9MT0NBVElPTl9TRVJWRVJfUkVRVUVTVCAweDAwMDAwMDQwCi0jZGVmaW5lIFJQQ19MT0NfRVZFTlRfTk1FQV9QT1NJVElPTl9SRVBPUlQgMHgwMDAwMDAwOAotI2RlZmluZSBSUENfTE9DX0VWRU5UX0lPQ1RMX1JFUE9SVCAweDAwMDAwMDgwCi0jZGVmaW5lIFJQQ19MT0NfRVZFTlRfTk1FQV8xSFpfUkVQT1JUIDB4MDAwMDAwMDQKLSNkZWZpbmUgUlBDX0xPQ19FVkVOVF9OSV9OT1RJRllfVkVSSUZZX1JFUVVFU1QgMHgwMDAwMDAxMAotI2RlZmluZSBSUENfTE9DX0FQSV9DQl9OVUxMX1ZFUlNJT04gMHgwMDA1MDAwMgotI2RlZmluZSBSUENfTE9DX0VWRU5UX0NCX0ZfVFlQRV9WRVJTSU9OIDB4MDAwNTAwMDEKLSNkZWZpbmUgUlBDX0xPQ19BUElfQVBJX1ZFUlNJT05TX1ZFUlNJT04gMHgwMDA1MDAwMQotI2RlZmluZSBSUENfTE9DX1NUT1BfRklYX1ZFUlNJT04gMHgwMDA1MDAwMQotI2RlZmluZSBSUENfTE9DX1NUQVJUX0ZJWF9WRVJTSU9OIDB4MDAwNTAwMDEKLSNkZWZpbmUgUlBDX0xPQ19JT0NUTF9WRVJTSU9OIDB4MDAwNTAwMDEKLSNkZWZpbmUgUlBDX0xPQ19DTE9TRV9WRVJTSU9OIDB4MDAwNTAwMDEKLSNkZWZpbmUgUlBDX0xPQ19BUElfUlBDX0dMVUVfQ09ERV9JTkZPX1JFTU9URV9WRVJTSU9OIDB4MDAwNTAwMDEKLSNkZWZpbmUgUlBDX0xPQ19PUEVOX1ZFUlNJT04gMHgwMDA1MDAwMQotI2RlZmluZSBSUENfTE9DX0FQSV9OVUxMX1ZFUlNJT04gMHgwMDA1MDAwMQotI2RlZmluZSBSUENfTE9DX0FQSV9BUElfTUFKT1JfTlVNIDB4MDAwNQotI2RlZmluZSBSUENfTE9DX0FQSUFQSV9WRVJTSU9OX0lTX0hBU0hLRVkgMAotCi10eXBlZGVmIHJwY19pbnQzMiBycGNfbG9jX2NsaWVudF9oYW5kbGVfdHlwZTsKLQotdHlwZWRlZiBycGNfdWludDY0IHJwY19sb2NfZXZlbnRfbWFza190eXBlOwotCi10eXBlZGVmIHJwY191aW50NjQgcnBjX2xvY19wb3NpdGlvbl92YWxpZF9tYXNrX3R5cGU7Ci0KLXR5cGVkZWYgcnBjX3VpbnQzMiBycGNfbG9jX3Bvc190ZWNobm9sb2d5X21hc2tfdHlwZTsKLQotZW51bSBycGNfbG9jX3Nlc3Npb25fc3RhdHVzX2VfdHlwZSB7Ci0gICAgUlBDX0xPQ19TRVNTX1NUQVRVU19TVUNDRVNTID0gMCwKLSAgICBSUENfTE9DX1NFU1NfU1RBVFVTX0lOX1BST0dFU1MgPSAxLAotICAgIFJQQ19MT0NfU0VTU19TVEFUVVNfR0VORVJBTF9GQUlMVVJFID0gMiwKLSAgICBSUENfTE9DX1NFU1NfU1RBVFVTX1RJTUVPVVQgPSAzLAotICAgIFJQQ19MT0NfU0VTU19TVEFUVVNfVVNFUl9FTkQgPSA0LAotICAgIFJQQ19MT0NfU0VTU19TVEFUVVNfQkFEX1BBUkFNRVRFUiA9IDUsCi0gICAgUlBDX0xPQ19TRVNTX1NUQVRVU19QSE9ORV9PRkZMSU5FID0gNiwKLSAgICBSUENfTE9DX1NFU1NfU1RBVFVTX0VOR0lORV9MT0NLRUQgPSA3LAotICAgIFJQQ19MT0NfU0VTU19TVEFUVVNfTUFYID0gMjY4NDM1NDU2LAotfTsKLXR5cGVkZWYgZW51bSBycGNfbG9jX3Nlc3Npb25fc3RhdHVzX2VfdHlwZSBycGNfbG9jX3Nlc3Npb25fc3RhdHVzX2VfdHlwZTsKLQotc3RydWN0IHJwY19sb2NfY2FsZW5kYXJfdGltZV9zX3R5cGUgewotICAgIHJwY191aW50MTYgeWVhcjsKLSAgICB1X2NoYXIgbW9udGg7Ci0gICAgdV9jaGFyIGRheV9vZl93ZWVrOwotICAgIHVfY2hhciBkYXk7Ci0gICAgdV9jaGFyIGhvdXI7Ci0gICAgdV9jaGFyIG1pbnV0ZTsKLSAgICB1X2NoYXIgc2Vjb25kOwotICAgIHJwY191aW50MTYgbWlsbGlzZWNvbmQ7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgcnBjX2xvY19jYWxlbmRhcl90aW1lX3NfdHlwZSBycGNfbG9jX2NhbGVuZGFyX3RpbWVfc190eXBlOwotCi1zdHJ1Y3QgcnBjX2xvY19wYXJzZWRfcG9zaXRpb25fc190eXBlIHsKLSAgICBycGNfbG9jX3Bvc2l0aW9uX3ZhbGlkX21hc2tfdHlwZSB2YWxpZF9tYXNrOwotICAgIHJwY19sb2Nfc2Vzc2lvbl9zdGF0dXNfZV90eXBlIHNlc3Npb25fc3RhdHVzOwotICAgIHJwY19sb2NfY2FsZW5kYXJfdGltZV9zX3R5cGUgdGltZXN0YW1wX2NhbGVuZGFyOwotICAgIHJwY191aW50NjQgdGltZXN0YW1wX3V0YzsKLSAgICBycGNfdWludDggbGVhcF9zZWNvbmRzOwotICAgIGZsb2F0IHRpbWVfdW5jOwotICAgIGRvdWJsZSBsYXRpdHVkZTsKLSAgICBkb3VibGUgbG9uZ2l0dWRlOwotICAgIGZsb2F0IGFsdGl0dWRlX3dydF9lbGxpcHNvaWQ7Ci0gICAgZmxvYXQgYWx0aXR1ZGVfd3J0X21lYW5fc2VhX2xldmVsOwotICAgIGZsb2F0IHNwZWVkX2hvcml6b250YWw7Ci0gICAgZmxvYXQgc3BlZWRfdmVydGljYWw7Ci0gICAgZmxvYXQgaGVhZGluZzsKLSAgICBmbG9hdCBob3JfdW5jX2NpcmN1bGFyOwotICAgIGZsb2F0IGhvcl91bmNfZWxsaXBzZV9zZW1pX21ham9yOwotICAgIGZsb2F0IGhvcl91bmNfZWxsaXBzZV9zZW1pX21pbm9yOwotICAgIGZsb2F0IGhvcl91bmNfZWxsaXBzZV9vcmllbnRfYXppbXV0aDsKLSAgICBmbG9hdCB2ZXJ0X3VuYzsKLSAgICBmbG9hdCBzcGVlZF91bmM7Ci0gICAgZmxvYXQgaGVhZGluZ191bmM7Ci0gICAgdV9jaGFyIGNvbmZpZGVuY2VfaG9yaXpvbnRhbDsKLSAgICB1X2NoYXIgY29uZmlkZW5jZV92ZXJ0aWNhbDsKLSAgICBmbG9hdCBtYWduZXRpY19kZXZpYXRpb247Ci0gICAgcnBjX2xvY19wb3NfdGVjaG5vbG9neV9tYXNrX3R5cGUgdGVjaG5vbG9neV9tYXNrOwotfTsKLXR5cGVkZWYgc3RydWN0IHJwY19sb2NfcGFyc2VkX3Bvc2l0aW9uX3NfdHlwZSBycGNfbG9jX3BhcnNlZF9wb3NpdGlvbl9zX3R5cGU7Ci0KLWVudW0gcnBjX2xvY19zdl9zeXN0ZW1fZV90eXBlIHsKLSAgICBSUENfTE9DX1NWX1NZU1RFTV9HUFMgPSAxLAotICAgIFJQQ19MT0NfU1ZfU1lTVEVNX0dBTElMRU8gPSAyLAotICAgIFJQQ19MT0NfU1ZfU1lTVEVNX1NCQVMgPSAzLAotICAgIFJQQ19MT0NfU1ZfU1lTVEVNX0NPTVBBU1MgPSA0LAotICAgIFJQQ19MT0NfU1ZfU1lTVEVNX0dMT05BU1MgPSA1LAotICAgIFJQQ19MT0NfU1ZfU1lTVEVNX01BWCA9IDI2ODQzNTQ1NiwKLX07Ci10eXBlZGVmIGVudW0gcnBjX2xvY19zdl9zeXN0ZW1fZV90eXBlIHJwY19sb2Nfc3Zfc3lzdGVtX2VfdHlwZTsKLQotZW51bSBycGNfbG9jX3N2X3N0YXR1c19lX3R5cGUgewotICAgIFJQQ19MT0NfU1ZfU1RBVFVTX0lETEUgPSAxLAotICAgIFJQQ19MT0NfU1ZfU1RBVFVTX1NFQVJDSCA9IDIsCi0gICAgUlBDX0xPQ19TVl9TVEFUVVNfVFJBQ0sgPSAzLAotICAgIFJQQ19MT0NfU1ZfU1RBVFVTX01BWCA9IDI2ODQzNTQ1NiwKLX07Ci10eXBlZGVmIGVudW0gcnBjX2xvY19zdl9zdGF0dXNfZV90eXBlIHJwY19sb2Nfc3Zfc3RhdHVzX2VfdHlwZTsKLQotdHlwZWRlZiBycGNfdWludDMyIHJwY19sb2Nfc3ZfaW5mb192YWxpZF9tYXNrX3R5cGU7Ci0KLXN0cnVjdCBycGNfbG9jX3N2X2luZm9fc190eXBlIHsKLSAgICBycGNfbG9jX3N2X2luZm9fdmFsaWRfbWFza190eXBlIHZhbGlkX21hc2s7Ci0gICAgcnBjX2xvY19zdl9zeXN0ZW1fZV90eXBlIHN5c3RlbTsKLSAgICBycGNfdWludDggcHJuOwotICAgIHJwY191aW50OCBoZWFsdGhfc3RhdHVzOwotICAgIHJwY19sb2Nfc3Zfc3RhdHVzX2VfdHlwZSBwcm9jZXNzX3N0YXR1czsKLSAgICBycGNfYm9vbGVhbiBoYXNfZXBoOwotICAgIHJwY19ib29sZWFuIGhhc19hbG07Ci0gICAgZmxvYXQgZWxldmF0aW9uOwotICAgIGZsb2F0IGF6aW11dGg7Ci0gICAgZmxvYXQgc25yOwotfTsKLXR5cGVkZWYgc3RydWN0IHJwY19sb2Nfc3ZfaW5mb19zX3R5cGUgcnBjX2xvY19zdl9pbmZvX3NfdHlwZTsKLQotdHlwZWRlZiBycGNfdWludDMyIHJwY19sb2NfZ25zc19pbmZvX3ZhbGlkX21hc2tfdHlwZTsKLQotc3RydWN0IHJwY19sb2NfZ25zc19pbmZvX3NfdHlwZSB7Ci0gICAgcnBjX2xvY19nbnNzX2luZm9fdmFsaWRfbWFza190eXBlIHZhbGlkX21hc2s7Ci0gICAgZmxvYXQgcG9zaXRpb25fZG9wOwotICAgIGZsb2F0IGhvcml6b250YWxfZG9wOwotICAgIGZsb2F0IHZlcnRpY2FsX2RvcDsKLSAgICBycGNfYm9vbGVhbiBhbHRpdHVkZV9hc3N1bWVkOwotICAgIHJwY191aW50MTYgc3ZfY291bnQ7Ci0gICAgc3RydWN0IHsKLSAgICAgICAgdV9pbnQgc3ZfbGlzdF9sZW47Ci0gICAgICAgIHJwY19sb2Nfc3ZfaW5mb19zX3R5cGUgKnN2X2xpc3RfdmFsOwotICAgIH0gc3ZfbGlzdDsKLX07Ci10eXBlZGVmIHN0cnVjdCBycGNfbG9jX2duc3NfaW5mb19zX3R5cGUgcnBjX2xvY19nbnNzX2luZm9fc190eXBlOwotCi1zdHJ1Y3QgcnBjX2xvY19ubWVhX3JlcG9ydF9zX3R5cGUgewotICAgIHJwY191aW50MTYgbGVuZ3RoOwotICAgIGNoYXIgbm1lYV9zZW50ZW5jZXNbMjAwXTsKLX07Ci10eXBlZGVmIHN0cnVjdCBycGNfbG9jX25tZWFfcmVwb3J0X3NfdHlwZSBycGNfbG9jX25tZWFfcmVwb3J0X3NfdHlwZTsKLQotZW51bSBycGNfbG9jX3N0YXR1c19ldmVudF9lX3R5cGUgewotICAgIFJQQ19MT0NfU1RBVFVTX0VWRU5UX0VOR0lORV9TVEFURSA9IDEsCi0gICAgUlBDX0xPQ19TVEFUVVNfRVZFTlRfRklYX1NFU1NJT05fU1RBVEUgPSAyLAotICAgIFJQQ19MT0NfU1RBVFVTX0VWRU5UX01BWCA9IDI2ODQzNTQ1NiwKLX07Ci10eXBlZGVmIGVudW0gcnBjX2xvY19zdGF0dXNfZXZlbnRfZV90eXBlIHJwY19sb2Nfc3RhdHVzX2V2ZW50X2VfdHlwZTsKLQotZW51bSBycGNfbG9jX2VuZ2luZV9zdGF0ZV9lX3R5cGUgewotICAgIFJQQ19MT0NfRU5HSU5FX1NUQVRFX09OID0gMSwKLSAgICBSUENfTE9DX0VOR0lORV9TVEFURV9PRkYgPSAyLAotICAgIFJQQ19MT0NfRU5HSU5FX1NUQVRFX01BWCA9IDI2ODQzNTQ1NiwKLX07Ci10eXBlZGVmIGVudW0gcnBjX2xvY19lbmdpbmVfc3RhdGVfZV90eXBlIHJwY19sb2NfZW5naW5lX3N0YXRlX2VfdHlwZTsKLQotZW51bSBycGNfbG9jX2ZpeF9zZXNzaW9uX3N0YXRlX2VfdHlwZSB7Ci0gICAgUlBDX0xPQ19GSVhfU0VTU0lPTl9TVEFURV9CRUdJTiA9IDEsCi0gICAgUlBDX0xPQ19GSVhfU0VTU0lPTl9TVEFURV9FTkQgPSAyLAotICAgIFJQQ19MT0NfRklYX1NFU1NJT05fU1RBVEVfTUFYID0gMjY4NDM1NDU2LAotfTsKLXR5cGVkZWYgZW51bSBycGNfbG9jX2ZpeF9zZXNzaW9uX3N0YXRlX2VfdHlwZSBycGNfbG9jX2ZpeF9zZXNzaW9uX3N0YXRlX2VfdHlwZTsKLQotc3RydWN0IHJwY19sb2Nfc3RhdHVzX2V2ZW50X3BheWxvYWRfdV90eXBlIHsKLSAgICBycGNfbG9jX3N0YXR1c19ldmVudF9lX3R5cGUgZGlzYzsKLSAgICB1bmlvbiB7Ci0gICAgICAgIHJwY19sb2NfZW5naW5lX3N0YXRlX2VfdHlwZSBlbmdpbmVfc3RhdGU7Ci0gICAgICAgIHJwY19sb2NfZml4X3Nlc3Npb25fc3RhdGVfZV90eXBlIGZpeF9zZXNzaW9uX3N0YXRlOwotICAgIH0gcnBjX2xvY19zdGF0dXNfZXZlbnRfcGF5bG9hZF91X3R5cGVfdTsKLX07Ci10eXBlZGVmIHN0cnVjdCBycGNfbG9jX3N0YXR1c19ldmVudF9wYXlsb2FkX3VfdHlwZSBycGNfbG9jX3N0YXR1c19ldmVudF9wYXlsb2FkX3VfdHlwZTsKLQotc3RydWN0IHJwY19sb2Nfc3RhdHVzX2V2ZW50X3NfdHlwZSB7Ci0gICAgcnBjX2xvY19zdGF0dXNfZXZlbnRfZV90eXBlIGV2ZW50OwotICAgIHJwY19sb2Nfc3RhdHVzX2V2ZW50X3BheWxvYWRfdV90eXBlIHBheWxvYWQ7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgcnBjX2xvY19zdGF0dXNfZXZlbnRfc190eXBlIHJwY19sb2Nfc3RhdHVzX2V2ZW50X3NfdHlwZTsKLQotZW51bSBycGNfbG9jX3NlcnZlcl9hZGRyX2VfdHlwZSB7Ci0gICAgUlBDX0xPQ19TRVJWRVJfQUREUl9JUFY0ID0gMSwKLSAgICBSUENfTE9DX1NFUlZFUl9BRERSX1VSTCA9IDIsCi0gICAgUlBDX0xPQ19TRVJWRVJfQUREUl9JUFY2ID0gMywKLSAgICBSUENfTE9DX1NFUlZFUl9BRERSX01BWCA9IDI2ODQzNTQ1NiwKLX07Ci10eXBlZGVmIGVudW0gcnBjX2xvY19zZXJ2ZXJfYWRkcl9lX3R5cGUgcnBjX2xvY19zZXJ2ZXJfYWRkcl9lX3R5cGU7Ci0KLXN0cnVjdCBycGNfbG9jX3NlcnZlcl9hZGRyX2lwdjRfdHlwZSB7Ci0gICAgcnBjX3VpbnQzMiBhZGRyOwotICAgIHJwY191aW50MTYgcG9ydDsKLX07Ci10eXBlZGVmIHN0cnVjdCBycGNfbG9jX3NlcnZlcl9hZGRyX2lwdjRfdHlwZSBycGNfbG9jX3NlcnZlcl9hZGRyX2lwdjRfdHlwZTsKLQotc3RydWN0IHJwY19sb2Nfc2VydmVyX2FkZHJfdXJsX3R5cGUgewotICAgIHJwY191aW50MTYgbGVuZ3RoOwotICAgIGNoYXIgYWRkclsyNTZdOwotfTsKLXR5cGVkZWYgc3RydWN0IHJwY19sb2Nfc2VydmVyX2FkZHJfdXJsX3R5cGUgcnBjX2xvY19zZXJ2ZXJfYWRkcl91cmxfdHlwZTsKLQotc3RydWN0IHJwY19sb2Nfc2VydmVyX2FkZHJfaXB2Nl90eXBlIHsKLSAgICBycGNfdWludDE2IGFkZHJbOF07Ci0gICAgcnBjX3VpbnQzMiBwb3J0OwotfTsKLXR5cGVkZWYgc3RydWN0IHJwY19sb2Nfc2VydmVyX2FkZHJfaXB2Nl90eXBlIHJwY19sb2Nfc2VydmVyX2FkZHJfaXB2Nl90eXBlOwotCi1zdHJ1Y3QgcnBjX2xvY19zZXJ2ZXJfYWRkcl91X3R5cGUgewotICAgIHJwY19sb2Nfc2VydmVyX2FkZHJfZV90eXBlIGRpc2M7Ci0gICAgdW5pb24gewotICAgICAgICBycGNfbG9jX3NlcnZlcl9hZGRyX2lwdjRfdHlwZSBpcHY0OwotICAgICAgICBycGNfbG9jX3NlcnZlcl9hZGRyX3VybF90eXBlIHVybDsKLSAgICAgICAgcnBjX2xvY19zZXJ2ZXJfYWRkcl9pcHY2X3R5cGUgaXB2NjsKLSAgICB9IHJwY19sb2Nfc2VydmVyX2FkZHJfdV90eXBlX3U7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgcnBjX2xvY19zZXJ2ZXJfYWRkcl91X3R5cGUgcnBjX2xvY19zZXJ2ZXJfYWRkcl91X3R5cGU7Ci0KLXN0cnVjdCBycGNfbG9jX3NlcnZlcl9pbmZvX3NfdHlwZSB7Ci0gICAgcnBjX2xvY19zZXJ2ZXJfYWRkcl9lX3R5cGUgYWRkcl90eXBlOwotICAgIHJwY19sb2Nfc2VydmVyX2FkZHJfdV90eXBlIGFkZHJfaW5mbzsKLX07Ci10eXBlZGVmIHN0cnVjdCBycGNfbG9jX3NlcnZlcl9pbmZvX3NfdHlwZSBycGNfbG9jX3NlcnZlcl9pbmZvX3NfdHlwZTsKLQotZW51bSBycGNfbG9jX25pX25vdGlmeV92ZXJpZnlfZV90eXBlIHsKLSAgICBSUENfTE9DX05JX1VTRVJfTk9fTk9USUZZX05PX1ZFUklGWSA9IDEsCi0gICAgUlBDX0xPQ19OSV9VU0VSX05PVElGWV9PTkxZID0gMiwKLSAgICBSUENfTE9DX05JX1VTRVJfTk9USUZZX1ZFUklGWV9BTExPV19OT19SRVNQID0gMywKLSAgICBSUENfTE9DX05JX1VTRVJfTk9USUZZX1ZFUklGWV9OT1RfQUxMT1dfTk9fUkVTUCA9IDQsCi0gICAgUlBDX0xPQ19OSV9VU0VSX1BSSVZBQ1lfT1ZFUlJJREUgPSA1LAotICAgIFJQQ19MT0NfTklfVVNFUl9OT1RJRllfVkVSSVRZX1RZUEVfTUFYID0gMjY4NDM1NDU2LAotfTsKLXR5cGVkZWYgZW51bSBycGNfbG9jX25pX25vdGlmeV92ZXJpZnlfZV90eXBlIHJwY19sb2Nfbmlfbm90aWZ5X3ZlcmlmeV9lX3R5cGU7Ci0KLWVudW0gcnBjX2xvY19uaV9ldmVudF9lX3R5cGUgewotICAgIFJQQ19MT0NfTklfRVZFTlRfVlhfTk9USUZZX1ZFUklGWV9SRVEgPSAxLAotICAgIFJQQ19MT0NfTklfRVZFTlRfU1VQTF9OT1RJRllfVkVSSUZZX1JFUSA9IDIsCi0gICAgUlBDX0xPQ19OSV9FVkVOVF9VTVRTX0NQX05PVElGWV9WRVJJRllfUkVRID0gMywKLSAgICBSUENfTE9DX05JX0VWRU5UX1ZYX1NFUlZJQ0VfSU5URVJBQ1RJT05fUkVRID0gNCwKLSAgICBSUENfTE9DX05JX0VWRU5UX01BWCA9IDI2ODQzNTQ1NiwKLX07Ci10eXBlZGVmIGVudW0gcnBjX2xvY19uaV9ldmVudF9lX3R5cGUgcnBjX2xvY19uaV9ldmVudF9lX3R5cGU7Ci0KLWVudW0gcnBjX2xvY19uaV9kYXRhY29kaW5nX3NjaGVtZV9lX3R5cGUgewotICAgIFJQQ19MT0NfTklfUFJFU1VQTF9JU082NDZJUlYgPSAwLAotICAgIFJQQ19MT0NfTklfUFJFU1VQTF9JU084ODU5ID0gMSwKLSAgICBSUENfTE9DX05JX1BSRVNVUExfVVRGOCA9IDIsCi0gICAgUlBDX0xPQ19OSV9QUkVTVVBMX1VURjE2ID0gMywKLSAgICBSUENfTE9DX05JX1BSRVNVUExfVUNTMiA9IDQsCi0gICAgUlBDX0xPQ19OSV9QUkVTVVBMX0dTTV9ERUZBVUxUID0gNSwKLSAgICBSUENfTE9DX05JX1BSRVNVUExfU0hJRlRfSklTID0gNiwKLSAgICBSUENfTE9DX05JX1BSRVNVUExfSklTID0gNywKLSAgICBSUENfTE9DX05JX1BSRVNVUExfRVVDID0gOCwKLSAgICBSUENfTE9DX05JX1BSRVNVUExfR0IyMzEyID0gOSwKLSAgICBSUENfTE9DX05JX1BSRVNVUExfQ05TMTE2NDMgPSAxMCwKLSAgICBSUENfTE9DX05JX1BSRVNVUExfS1NDMTAwMSA9IDExLAotICAgIFJQQ19MT0NfTklfUFJFU1VQTF9FTkNPRElOR19VTktOT1dOID0gMjE0NzQ4MzY0NywKLSAgICBSUENfTE9DX05JX1NTX0dFUk1BTiA9IDEyLAotICAgIFJQQ19MT0NfTklfU1NfRU5HTElTSCA9IDEzLAotICAgIFJQQ19MT0NfTklfU1NfSVRBTElBTiA9IDE0LAotICAgIFJQQ19MT0NfTklfU1NfRlJFTkNIID0gMTUsCi0gICAgUlBDX0xPQ19OSV9TU19TUEFOSVNIID0gMTYsCi0gICAgUlBDX0xPQ19OSV9TU19EVVRDSCA9IDE3LAotICAgIFJQQ19MT0NfTklfU1NfU1dFRElTSCA9IDE4LAotICAgIFJQQ19MT0NfTklfU1NfREFOSVNIID0gMTksCi0gICAgUlBDX0xPQ19OSV9TU19QT1JUVUdVRVNFID0gMjAsCi0gICAgUlBDX0xPQ19OSV9TU19GSU5OSVNIID0gMjEsCi0gICAgUlBDX0xPQ19OSV9TU19OT1JXRUdJQU4gPSAyMiwKLSAgICBSUENfTE9DX05JX1NTX0dSRUVLID0gMjMsCi0gICAgUlBDX0xPQ19OSV9TU19UVVJLSVNIID0gMjQsCi0gICAgUlBDX0xPQ19OSV9TU19IVU5HQVJJQU4gPSAyNSwKLSAgICBSUENfTE9DX05JX1NTX1BPTElTSCA9IDI2LAotICAgIFJQQ19MT0NfTklfU1NfTEFOR1VBR0VfVU5TUEVDID0gMjcsCi0gICAgUlBDX0xPQ19OSV9TVVBMX1VURjggPSAyOCwKLSAgICBSUENfTE9DX05JX1NVUExfVUNTMiA9IDI5LAotICAgIFJQQ19MT0NfTklfU1VQTF9HU01fREVGQVVMVCA9IDMwLAotICAgIFJQQ19MT0NfTklfU1VQTF9FTkNPRElOR19VTktOT1dOID0gMjE0NzQ4MzY0NywKLX07Ci10eXBlZGVmIGVudW0gcnBjX2xvY19uaV9kYXRhY29kaW5nX3NjaGVtZV9lX3R5cGUgcnBjX2xvY19uaV9kYXRhY29kaW5nX3NjaGVtZV9lX3R5cGU7Ci0KLWVudW0gcnBjX2xvY19uaV92eF9yZXF1ZXN0ZXJfaWRfZW5jb2Rpbmdfc2NoZW1lX2VfdHlwZSB7Ci0gICAgUlBDX0xPQ19OSV9WWF9PQ1RFVCA9IDAsCi0gICAgUlBDX0xPQ19OSV9WWF9FWE5fUFJPVE9DT0xfTVNHID0gMSwKLSAgICBSUENfTE9DX05JX1ZYX0FTQ0lJID0gMiwKLSAgICBSUENfTE9DX05JX1ZYX0lBNSA9IDMsCi0gICAgUlBDX0xPQ19OSV9WWF9VTklDT0RFID0gNCwKLSAgICBSUENfTE9DX05JX1ZYX1NISUZUX0pJUyA9IDUsCi0gICAgUlBDX0xPQ19OSV9WWF9LT1JFQU4gPSA2LAotICAgIFJQQ19MT0NfTklfVlhfTEFUSU5fSEVCUkVXID0gNywKLSAgICBSUENfTE9DX05JX1ZYX0xBVElOID0gOCwKLSAgICBSUENfTE9DX05JX1ZYX0dTTSA9IDksCi0gICAgUlBDX0xPQ19OSV9WWF9FTkNPRElOR19UWVBFX01BWCA9IDI2ODQzNTQ1NiwKLX07Ci10eXBlZGVmIGVudW0gcnBjX2xvY19uaV92eF9yZXF1ZXN0ZXJfaWRfZW5jb2Rpbmdfc2NoZW1lX2VfdHlwZSBycGNfbG9jX25pX3Z4X3JlcXVlc3Rlcl9pZF9lbmNvZGluZ19zY2hlbWVfZV90eXBlOwotCi1lbnVtIHJwY19sb2NfbmlfdnhfcG9zX21vZGVfZV90eXBlIHsKLSAgICBSUENfTE9DX1ZYX01TX0FTU0lTVEVEX09OTFkgPSAxLAotICAgIFJQQ19MT0NfVlhfTVNfQkFTRURfT05MWSA9IDIsCi0gICAgUlBDX0xPQ19WWF9NU19BU1NJU1RFRF9QUkVGX01TQkFTRURfQUxMV0QgPSAzLAotICAgIFJQQ19MT0NfVlhfTVNfQkFTRURfUFJFRl9BU1NJU1RFRF9BTExXRCA9IDQsCi0gICAgUlBDX0xPQ19WWF9QT1NfTU9ERV9NQVggPSAyNjg0MzU0NTYsCi19OwotdHlwZWRlZiBlbnVtIHJwY19sb2NfbmlfdnhfcG9zX21vZGVfZV90eXBlIHJwY19sb2NfbmlfdnhfcG9zX21vZGVfZV90eXBlOwotCi1zdHJ1Y3QgcnBjX2xvY19uaV92eF9yZXF1ZXN0ZXJfaWRfc190eXBlIHsKLSAgICB1X2NoYXIgcmVxdWVzdGVyX2lkX2xlbmd0aDsKLSAgICBjaGFyIHJlcXVlc3Rlcl9pZFsyMDBdOwotfTsKLXR5cGVkZWYgc3RydWN0IHJwY19sb2NfbmlfdnhfcmVxdWVzdGVyX2lkX3NfdHlwZSBycGNfbG9jX25pX3Z4X3JlcXVlc3Rlcl9pZF9zX3R5cGU7Ci0KLXN0cnVjdCBycGNfbG9jX25pX3Z4X25vdGlmeV92ZXJpZnlfcmVxX3NfdHlwZSB7Ci0gICAgcnBjX2xvY19uaV9ub3RpZnlfdmVyaWZ5X2VfdHlwZSBub3RpZmljYXRpb25fcHJpdl90eXBlOwotICAgIHVfY2hhciBwb3NfcW9zX2luY2w7Ci0gICAgdV9jaGFyIHBvc19xb3M7Ci0gICAgcnBjX3VpbnQzMiBudW1fZml4ZXM7Ci0gICAgcnBjX3VpbnQzMiB0YmY7Ci0gICAgcnBjX2xvY19uaV92eF9wb3NfbW9kZV9lX3R5cGUgcG9zX21vZGU7Ci0gICAgcnBjX2xvY19uaV92eF9yZXF1ZXN0ZXJfaWRfZW5jb2Rpbmdfc2NoZW1lX2VfdHlwZSBlbmNvZGluZ19zY2hlbWU7Ci0gICAgcnBjX2xvY19uaV92eF9yZXF1ZXN0ZXJfaWRfc190eXBlIHJlcXVlc3Rlcl9pZDsKLSAgICBycGNfdWludDE2IHVzZXJfcmVzcF90aW1lcl92YWw7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgcnBjX2xvY19uaV92eF9ub3RpZnlfdmVyaWZ5X3JlcV9zX3R5cGUgcnBjX2xvY19uaV92eF9ub3RpZnlfdmVyaWZ5X3JlcV9zX3R5cGU7Ci0KLWVudW0gcnBjX2xvY19uaV9zdXBsX3Bvc19tZXRob2RfZV90eXBlIHsKLSAgICBSUENfTE9DX05JX1BPU01FVEhPRF9BR1BTX1NFVEFTU0lTVEVEID0gMSwKLSAgICBSUENfTE9DX05JX1BPU01FVEhPRF9BR1BTX1NFVEJBU0VEID0gMiwKLSAgICBSUENfTE9DX05JX1BPU01FVEhPRF9BR1BTX1NFVEFTU0lTVEVEX1BSRUYgPSAzLAotICAgIFJQQ19MT0NfTklfUE9TTUVUSE9EX0FHUFNfU0VUQkFTRURfUFJFRiA9IDQsCi0gICAgUlBDX0xPQ19OSV9QT1NNRVRIT0RfQVVUT05PTU9VU19HUFMgPSA1LAotICAgIFJQQ19MT0NfTklfUE9TTUVUSE9EX0FGTFQgPSA2LAotICAgIFJQQ19MT0NfTklfUE9TTUVUSE9EX0VDSUQgPSA3LAotICAgIFJQQ19MT0NfTklfUE9TTUVUSE9EX0VPVEQgPSA4LAotICAgIFJQQ19MT0NfTklfUE9TTUVUSE9EX09URE9BID0gOSwKLSAgICBSUENfTE9DX05JX1BPU01FVEhPRF9OT19QT1NJVElPTiA9IDEwLAotICAgIFJQQ19MT0NfTklfUE9TTUVUSE9EX01BWCA9IDI2ODQzNTQ1NiwKLX07Ci10eXBlZGVmIGVudW0gcnBjX2xvY19uaV9zdXBsX3Bvc19tZXRob2RfZV90eXBlIHJwY19sb2Nfbmlfc3VwbF9wb3NfbWV0aG9kX2VfdHlwZTsKLQotc3RydWN0IHJwY19sb2Nfbmlfc3VwbF9zbHBfc2Vzc2lvbl9pZF9zX3R5cGUgewotICAgIHVfY2hhciBwcmVzZW5jZTsKLSAgICBjaGFyIHNlc3Npb25faWRbNF07Ci0gICAgcnBjX2xvY19zZXJ2ZXJfaW5mb19zX3R5cGUgc2xwX2FkZHJlc3M7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgcnBjX2xvY19uaV9zdXBsX3NscF9zZXNzaW9uX2lkX3NfdHlwZSBycGNfbG9jX25pX3N1cGxfc2xwX3Nlc3Npb25faWRfc190eXBlOwotCi1zdHJ1Y3QgcnBjX2xvY19uaV9yZXF1ZXN0b3JfaWRfc190eXBlIHsKLSAgICB1X2NoYXIgZGF0YV9jb2Rpbmdfc2NoZW1lOwotICAgIGNoYXIgcmVxdWVzdG9yX2lkX3N0cmluZ1syMDBdOwotICAgIHVfY2hhciBzdHJpbmdfbGVuOwotfTsKLXR5cGVkZWYgc3RydWN0IHJwY19sb2NfbmlfcmVxdWVzdG9yX2lkX3NfdHlwZSBycGNfbG9jX25pX3JlcXVlc3Rvcl9pZF9zX3R5cGU7Ci0KLXN0cnVjdCBycGNfbG9jX25pX3N1cGxfY2xpZW50X25hbWVfc190eXBlIHsKLSAgICB1X2NoYXIgZGF0YV9jb2Rpbmdfc2NoZW1lOwotICAgIGNoYXIgY2xpZW50X25hbWVfc3RyaW5nWzY0XTsKLSAgICB1X2NoYXIgc3RyaW5nX2xlbjsKLX07Ci10eXBlZGVmIHN0cnVjdCBycGNfbG9jX25pX3N1cGxfY2xpZW50X25hbWVfc190eXBlIHJwY19sb2Nfbmlfc3VwbF9jbGllbnRfbmFtZV9zX3R5cGU7Ci0KLXN0cnVjdCBycGNfbG9jX25pX3N1cGxfcW9wX3NfdHlwZSB7Ci0gICAgdV9jaGFyIGJpdF9tYXNrOwotICAgIHVfY2hhciBob3JhY2M7Ci0gICAgdV9jaGFyIHZlcmFjYzsKLSAgICBycGNfdWludDE2IG1heExvY0FnZTsKLSAgICB1X2NoYXIgZGVsYXk7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgcnBjX2xvY19uaV9zdXBsX3FvcF9zX3R5cGUgcnBjX2xvY19uaV9zdXBsX3FvcF9zX3R5cGU7Ci0KLXN0cnVjdCBycGNfbG9jX25pX3N1cGxfbm90aWZ5X3ZlcmlmeV9yZXFfc190eXBlIHsKLSAgICBycGNfbG9jX25pX25vdGlmeV92ZXJpZnlfZV90eXBlIG5vdGlmaWNhdGlvbl9wcml2X3R5cGU7Ci0gICAgcnBjX3VpbnQxNiBmbGFnczsKLSAgICBycGNfbG9jX25pX3N1cGxfc2xwX3Nlc3Npb25faWRfc190eXBlIHN1cGxfc2xwX3Nlc3Npb25faWQ7Ci0gICAgY2hhciBzdXBsX2hhc2hbOF07Ci0gICAgcnBjX2xvY19uaV9kYXRhY29kaW5nX3NjaGVtZV9lX3R5cGUgZGF0YWNvZGluZ19zY2hlbWU7Ci0gICAgcnBjX2xvY19uaV9zdXBsX3Bvc19tZXRob2RfZV90eXBlIHBvc19tZXRob2Q7Ci0gICAgcnBjX2xvY19uaV9yZXF1ZXN0b3JfaWRfc190eXBlIHJlcXVlc3Rvcl9pZDsKLSAgICBycGNfbG9jX25pX3N1cGxfY2xpZW50X25hbWVfc190eXBlIGNsaWVudF9uYW1lOwotICAgIHJwY19sb2Nfbmlfc3VwbF9xb3Bfc190eXBlIHN1cGxfcW9wOwotICAgIHJwY191aW50MTYgdXNlcl9yZXNwb25zZV90aW1lcjsKLX07Ci10eXBlZGVmIHN0cnVjdCBycGNfbG9jX25pX3N1cGxfbm90aWZ5X3ZlcmlmeV9yZXFfc190eXBlIHJwY19sb2Nfbmlfc3VwbF9ub3RpZnlfdmVyaWZ5X3JlcV9zX3R5cGU7Ci0KLXN0cnVjdCBycGNfbG9jX25pX2V4dF9jbGllbnRfYWRkcmVzc19zX3R5cGUgewotICAgIHVfY2hhciBleHRfY2xpZW50X2FkZHJlc3NfbGVuOwotICAgIGNoYXIgZXh0X2NsaWVudF9hZGRyZXNzWzIwXTsKLX07Ci10eXBlZGVmIHN0cnVjdCBycGNfbG9jX25pX2V4dF9jbGllbnRfYWRkcmVzc19zX3R5cGUgcnBjX2xvY19uaV9leHRfY2xpZW50X2FkZHJlc3Nfc190eXBlOwotCi1lbnVtIHJwY19sb2NfbmlfbG9jYXRpb25fdHlwZV9lX3R5cGUgewotICAgIFJQQ19MT0NfTklfTE9DQVRJT05UWVBFX0NVUlJFTlRfTE9DQVRJT04gPSAxLAotICAgIFJQQ19MT0NfTklfTE9DQVRJT05UWVBFX0NVUlJFTlRfT1JfTEFTVF9LTk9XTl9MT0NBVElPTiA9IDIsCi0gICAgUlBDX0xPQ19OSV9MT0NBVElPTlRZUEVfSU5JVElBTF9MT0NBVElPTiA9IDMsCi0gICAgUlBDX0xPQ19OSV9MT0NBVElPTlRZUEVfTUFYID0gMjY4NDM1NDU2LAotfTsKLXR5cGVkZWYgZW51bSBycGNfbG9jX25pX2xvY2F0aW9uX3R5cGVfZV90eXBlIHJwY19sb2NfbmlfbG9jYXRpb25fdHlwZV9lX3R5cGU7Ci0KLXN0cnVjdCBycGNfbG9jX25pX2RlZmVycmVkX2xvY2F0aW9uX3NfdHlwZSB7Ci0gICAgdV9jaGFyIHVudXNlZF9iaXRzOwotICAgIHVfY2hhciBtc19hdmFpbGFibGU7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgcnBjX2xvY19uaV9kZWZlcnJlZF9sb2NhdGlvbl9zX3R5cGUgcnBjX2xvY19uaV9kZWZlcnJlZF9sb2NhdGlvbl9zX3R5cGU7Ci0KLXN0cnVjdCBycGNfbG9jX25pX2NvZGV3b3JkX3N0cmluZ19zX3R5cGUgewotICAgIHVfY2hhciBkYXRhX2NvZGluZ19zY2hlbWU7Ci0gICAgY2hhciBsY3NfY29kZXdvcmRfc3RyaW5nWzIwXTsKLSAgICB1X2NoYXIgc3RyaW5nX2xlbjsKLX07Ci10eXBlZGVmIHN0cnVjdCBycGNfbG9jX25pX2NvZGV3b3JkX3N0cmluZ19zX3R5cGUgcnBjX2xvY19uaV9jb2Rld29yZF9zdHJpbmdfc190eXBlOwotCi1zdHJ1Y3QgcnBjX2xvY19uaV9zZXJ2aWNlX3R5cGVfaWRfc190eXBlIHsKLSAgICB1X2NoYXIgbGNzX3NlcnZpY2VfdHlwZV9pZDsKLX07Ci10eXBlZGVmIHN0cnVjdCBycGNfbG9jX25pX3NlcnZpY2VfdHlwZV9pZF9zX3R5cGUgcnBjX2xvY19uaV9zZXJ2aWNlX3R5cGVfaWRfc190eXBlOwotCi1zdHJ1Y3QgcnBjX2xvY19uaV91bXRzX2NwX25vdGlmeV92ZXJpZnlfcmVxX3NfdHlwZSB7Ci0gICAgcnBjX2xvY19uaV9ub3RpZnlfdmVyaWZ5X2VfdHlwZSBub3RpZmljYXRpb25fcHJpdl90eXBlOwotICAgIHVfY2hhciBpbnZva2VfaWQ7Ci0gICAgcnBjX3VpbnQxNiBmbGFnczsKLSAgICB1X2NoYXIgbm90aWZpY2F0aW9uX2xlbmd0aDsKLSAgICBjaGFyIG5vdGlmaWNhdGlvbl90ZXh0WzY0XTsKLSAgICBycGNfbG9jX25pX2RhdGFjb2Rpbmdfc2NoZW1lX2VfdHlwZSBkYXRhY29kaW5nX3NjaGVtZTsKLSAgICBycGNfbG9jX25pX2V4dF9jbGllbnRfYWRkcmVzc19zX3R5cGUgZXh0X2NsaWVudF9hZGRyZXNzX2RhdGE7Ci0gICAgcnBjX2xvY19uaV9sb2NhdGlvbl90eXBlX2VfdHlwZSBsb2NhdGlvbl90eXBlOwotICAgIHJwY19sb2NfbmlfZGVmZXJyZWRfbG9jYXRpb25fc190eXBlIGRlZmVycmVkX2xvY2F0aW9uOwotICAgIHJwY19sb2NfbmlfcmVxdWVzdG9yX2lkX3NfdHlwZSByZXF1ZXN0b3JfaWQ7Ci0gICAgcnBjX2xvY19uaV9jb2Rld29yZF9zdHJpbmdfc190eXBlIGNvZGV3b3JkX3N0cmluZzsKLSAgICBycGNfbG9jX25pX3NlcnZpY2VfdHlwZV9pZF9zX3R5cGUgc2VydmljZV90eXBlX2lkOwotICAgIHJwY191aW50MTYgdXNlcl9yZXNwb25zZV90aW1lcjsKLX07Ci10eXBlZGVmIHN0cnVjdCBycGNfbG9jX25pX3VtdHNfY3Bfbm90aWZ5X3ZlcmlmeV9yZXFfc190eXBlIHJwY19sb2NfbmlfdW10c19jcF9ub3RpZnlfdmVyaWZ5X3JlcV9zX3R5cGU7Ci0KLWVudW0gcnBjX2xvY19uaV9zZXJ2aWNlX2ludGVyYWN0aW9uX2VfdHlwZSB7Ci0gICAgUlBDX0xPQ19OSV9TRVJWSUNFX0lOVEVSQUNUSU9OX09OR09JTkdfTklfSU5DT01JTkdfTU8gPSAxLAotICAgIFJQQ19MT0NfTklfU0VSVklDRV9JTlRFUkFDVElPTl9NQVggPSAyNjg0MzU0NTYsCi19OwotdHlwZWRlZiBlbnVtIHJwY19sb2Nfbmlfc2VydmljZV9pbnRlcmFjdGlvbl9lX3R5cGUgcnBjX2xvY19uaV9zZXJ2aWNlX2ludGVyYWN0aW9uX2VfdHlwZTsKLQotc3RydWN0IHJwY19sb2Nfbmlfdnhfc2VydmljZV9pbnRlcmFjdGlvbl9yZXFfc190eXBlIHsKLSAgICBycGNfbG9jX25pX3Z4X25vdGlmeV92ZXJpZnlfcmVxX3NfdHlwZSBuaV92eF9yZXE7Ci0gICAgcnBjX2xvY19uaV9zZXJ2aWNlX2ludGVyYWN0aW9uX2VfdHlwZSBzZXJ2aWNlX2ludGVyYXRpb25fdHlwZTsKLX07Ci10eXBlZGVmIHN0cnVjdCBycGNfbG9jX25pX3Z4X3NlcnZpY2VfaW50ZXJhY3Rpb25fcmVxX3NfdHlwZSBycGNfbG9jX25pX3Z4X3NlcnZpY2VfaW50ZXJhY3Rpb25fcmVxX3NfdHlwZTsKLQotc3RydWN0IHJwY19sb2NfbmlfZXZlbnRfcGF5bG9hZF91X3R5cGUgewotICAgIHJwY19sb2NfbmlfZXZlbnRfZV90eXBlIGRpc2M7Ci0gICAgdW5pb24gewotICAgICAgICBycGNfbG9jX25pX3Z4X25vdGlmeV92ZXJpZnlfcmVxX3NfdHlwZSB2eF9yZXE7Ci0gICAgICAgIHJwY19sb2Nfbmlfc3VwbF9ub3RpZnlfdmVyaWZ5X3JlcV9zX3R5cGUgc3VwbF9yZXE7Ci0gICAgICAgIHJwY19sb2NfbmlfdW10c19jcF9ub3RpZnlfdmVyaWZ5X3JlcV9zX3R5cGUgdW10c19jcF9yZXE7Ci0gICAgICAgIHJwY19sb2Nfbmlfdnhfc2VydmljZV9pbnRlcmFjdGlvbl9yZXFfc190eXBlIHNlcnZpY2VfaW50ZXJhY3Rpb25fcmVxOwotICAgIH0gcnBjX2xvY19uaV9ldmVudF9wYXlsb2FkX3VfdHlwZV91OwotfTsKLXR5cGVkZWYgc3RydWN0IHJwY19sb2NfbmlfZXZlbnRfcGF5bG9hZF91X3R5cGUgcnBjX2xvY19uaV9ldmVudF9wYXlsb2FkX3VfdHlwZTsKLQotc3RydWN0IHJwY19sb2NfbmlfZXZlbnRfc190eXBlIHsKLSAgICBycGNfbG9jX25pX2V2ZW50X2VfdHlwZSBldmVudDsKLSAgICBycGNfbG9jX25pX2V2ZW50X3BheWxvYWRfdV90eXBlIHBheWxvYWQ7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgcnBjX2xvY19uaV9ldmVudF9zX3R5cGUgcnBjX2xvY19uaV9ldmVudF9zX3R5cGU7Ci0KLWVudW0gcnBjX2xvY19hc3Npc3RfZGF0YV9yZXF1ZXN0X2VfdHlwZSB7Ci0gICAgUlBDX0xPQ19BU1NJU1RfREFUQV9USU1FX1JFUSA9IDEsCi0gICAgUlBDX0xPQ19BU1NJU1RfREFUQV9QUkVESUNURURfT1JCSVRTX1JFUSA9IDIsCi0gICAgUlBDX0xPQ19BU1NJU1RfREFUQV9QT1NJVElPTl9JTkpFQ1RJT05fUkVRID0gMywKLSAgICBSUENfTE9DX0FTU0lTVF9EQVRBX01BWCA9IDI2ODQzNTQ1NiwKLX07Ci10eXBlZGVmIGVudW0gcnBjX2xvY19hc3Npc3RfZGF0YV9yZXF1ZXN0X2VfdHlwZSBycGNfbG9jX2Fzc2lzdF9kYXRhX3JlcXVlc3RfZV90eXBlOwotCi10eXBlZGVmIGNoYXIgKnJwY19zdHJ1Y3RfbG9jX3RpbWVfZG93bmxvYWRfc291cmNlX3NfdHlwZV9zZXJ2ZXJzX3B0cjsKLQotdHlwZWRlZiBycGNfc3RydWN0X2xvY190aW1lX2Rvd25sb2FkX3NvdXJjZV9zX3R5cGVfc2VydmVyc19wdHIgcnBjX3N0cnVjdF9sb2NfdGltZV9kb3dubG9hZF9zb3VyY2Vfc190eXBlX3NlcnZlcnNbM107Ci0KLXN0cnVjdCBycGNfbG9jX3RpbWVfZG93bmxvYWRfc291cmNlX3NfdHlwZSB7Ci0gICAgcnBjX3VpbnQzMiBkZWxheV90aHJlc2hvbGQ7Ci0gICAgcnBjX3N0cnVjdF9sb2NfdGltZV9kb3dubG9hZF9zb3VyY2Vfc190eXBlX3NlcnZlcnMgc2VydmVyczsKLX07Ci10eXBlZGVmIHN0cnVjdCBycGNfbG9jX3RpbWVfZG93bmxvYWRfc291cmNlX3NfdHlwZSBycGNfbG9jX3RpbWVfZG93bmxvYWRfc291cmNlX3NfdHlwZTsKLQotdHlwZWRlZiBjaGFyICpycGNfc3RydWN0X2xvY19wcmVkaWN0ZWRfb3JiaXRzX2RhdGFfc291cmNlX3NfdHlwZV9zZXJ2ZXJzX3B0cjsKLQotdHlwZWRlZiBycGNfc3RydWN0X2xvY19wcmVkaWN0ZWRfb3JiaXRzX2RhdGFfc291cmNlX3NfdHlwZV9zZXJ2ZXJzX3B0ciBycGNfc3RydWN0X2xvY19wcmVkaWN0ZWRfb3JiaXRzX2RhdGFfc291cmNlX3NfdHlwZV9zZXJ2ZXJzWzNdOwotCi1zdHJ1Y3QgcnBjX2xvY19wcmVkaWN0ZWRfb3JiaXRzX2RhdGFfc291cmNlX3NfdHlwZSB7Ci0gICAgcnBjX3VpbnQzMiBtYXhfZmlsZV9zaXplOwotICAgIHJwY191aW50MzIgbWF4X3BhcnRfc2l6ZTsKLSAgICBycGNfc3RydWN0X2xvY19wcmVkaWN0ZWRfb3JiaXRzX2RhdGFfc291cmNlX3NfdHlwZV9zZXJ2ZXJzIHNlcnZlcnM7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgcnBjX2xvY19wcmVkaWN0ZWRfb3JiaXRzX2RhdGFfc291cmNlX3NfdHlwZSBycGNfbG9jX3ByZWRpY3RlZF9vcmJpdHNfZGF0YV9zb3VyY2Vfc190eXBlOwotCi1zdHJ1Y3QgcnBjX2xvY19wb3NfaW5qX3JlcXVlc3Rfc190eXBlIHsKLSAgICBycGNfdWludDMyIGZsYWdzOwotICAgIGRvdWJsZSBsYXRpdHVkZTsKLSAgICBkb3VibGUgbG9uZ2l0dWRlOwotICAgIHJwY191aW50MzIgcG9zaXRpb25fdW5jZXJ0YWludHk7Ci0gICAgcnBjX3VpbnQ2NCB0aW1lc3RhbXA7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgcnBjX2xvY19wb3NfaW5qX3JlcXVlc3Rfc190eXBlIHJwY19sb2NfcG9zX2lual9yZXF1ZXN0X3NfdHlwZTsKLQotc3RydWN0IHJwY19sb2NfYXNzaXN0X2RhdGFfcmVxdWVzdF9wYXlsb2FkX3VfdHlwZSB7Ci0gICAgcnBjX2xvY19hc3Npc3RfZGF0YV9yZXF1ZXN0X2VfdHlwZSBkaXNjOwotICAgIHVuaW9uIHsKLSAgICAgICAgcnBjX2xvY190aW1lX2Rvd25sb2FkX3NvdXJjZV9zX3R5cGUgdGltZV9kb3dubG9hZDsKLSAgICAgICAgcnBjX2xvY19wcmVkaWN0ZWRfb3JiaXRzX2RhdGFfc291cmNlX3NfdHlwZSBkYXRhX2Rvd25sb2FkOwotICAgICAgICBycGNfbG9jX3Bvc19pbmpfcmVxdWVzdF9zX3R5cGUgcG9zX2luamVjdGlvbjsKLSAgICB9IHJwY19sb2NfYXNzaXN0X2RhdGFfcmVxdWVzdF9wYXlsb2FkX3VfdHlwZV91OwotfTsKLXR5cGVkZWYgc3RydWN0IHJwY19sb2NfYXNzaXN0X2RhdGFfcmVxdWVzdF9wYXlsb2FkX3VfdHlwZSBycGNfbG9jX2Fzc2lzdF9kYXRhX3JlcXVlc3RfcGF5bG9hZF91X3R5cGU7Ci0KLXN0cnVjdCBycGNfbG9jX2Fzc2lzdF9kYXRhX3JlcXVlc3Rfc190eXBlIHsKLSAgICBycGNfbG9jX2Fzc2lzdF9kYXRhX3JlcXVlc3RfZV90eXBlIGV2ZW50OwotICAgIHJwY19sb2NfYXNzaXN0X2RhdGFfcmVxdWVzdF9wYXlsb2FkX3VfdHlwZSBwYXlsb2FkOwotfTsKLXR5cGVkZWYgc3RydWN0IHJwY19sb2NfYXNzaXN0X2RhdGFfcmVxdWVzdF9zX3R5cGUgcnBjX2xvY19hc3Npc3RfZGF0YV9yZXF1ZXN0X3NfdHlwZTsKLQotdHlwZWRlZiBycGNfdWludDMyIHJwY19sb2Nfc2VydmVyX2Nvbm5lY3Rpb25faGFuZGxlOwotCi1lbnVtIHJwY19sb2Nfc2VydmVyX3Byb3RvY29sX2VfdHlwZSB7Ci0gICAgUlBDX0xPQ19TRVJWRVJfUFJPVE9DT0xfREVGQVVMVCA9IDAsCi0gICAgUlBDX0xPQ19TRVJWRVJfUFJPVE9DT0xfU1VQTCA9IDEsCi0gICAgUlBDX0xPQ19TRVJWRVJfUFJPVE9DT0xfVlhfTVBDID0gMiwKLSAgICBSUENfTE9DX1NFUlZFUl9QUk9UT0NPTF9WWF9QREUgPSAzLAotICAgIFJQQ19MT0NfU0VSVkVSX1BST1RPQ09MX01BWCA9IDE2Nzc3MjE2LAotfTsKLXR5cGVkZWYgZW51bSBycGNfbG9jX3NlcnZlcl9wcm90b2NvbF9lX3R5cGUgcnBjX2xvY19zZXJ2ZXJfcHJvdG9jb2xfZV90eXBlOwotCi1lbnVtIHJwY19sb2Nfc2VydmVyX2Nvbm5lY3Rpb25fZV90eXBlIHsKLSAgICBSUENfTE9DX1NFUlZFUl9DT05ORUNUSU9OX0xCUyA9IDAsCi0gICAgUlBDX0xPQ19TRVJWRVJfQ09OTkVDVElPTl9XV0FOX0lOVEVSTkVUID0gMCArIDEsCi0gICAgUlBDX0xPQ19TRVJWRVJfQ09OTkVDVElPTl9NQVggPSAxNjc3NzIxNiwKLX07Ci10eXBlZGVmIGVudW0gcnBjX2xvY19zZXJ2ZXJfY29ubmVjdGlvbl9lX3R5cGUgcnBjX2xvY19zZXJ2ZXJfY29ubmVjdGlvbl9lX3R5cGU7Ci0KLWVudW0gcnBjX2xvY19zZXJ2ZXJfcmVxdWVzdF9lX3R5cGUgewotICAgIFJQQ19MT0NfU0VSVkVSX1JFUVVFU1RfT1BFTiA9IDEsCi0gICAgUlBDX0xPQ19TRVJWRVJfUkVRVUVTVF9DTE9TRSA9IDIsCi0gICAgUlBDX0xPQ19TRVJWRVJfUkVRVUVTVF9NVUxUSV9PUEVOID0gMywKLSAgICBSUENfTE9DX1NFUlZFUl9SRVFVRVNUX01BWCA9IDI2ODQzNTQ1NiwKLX07Ci10eXBlZGVmIGVudW0gcnBjX2xvY19zZXJ2ZXJfcmVxdWVzdF9lX3R5cGUgcnBjX2xvY19zZXJ2ZXJfcmVxdWVzdF9lX3R5cGU7Ci0KLXN0cnVjdCBycGNfbG9jX3NlcnZlcl9vcGVuX3JlcV9zX3R5cGUgewotICAgIHJwY19sb2Nfc2VydmVyX2Nvbm5lY3Rpb25faGFuZGxlIGNvbm5faGFuZGxlOwotICAgIHJwY19sb2Nfc2VydmVyX3Byb3RvY29sX2VfdHlwZSBwcm90b2NvbDsKLX07Ci10eXBlZGVmIHN0cnVjdCBycGNfbG9jX3NlcnZlcl9vcGVuX3JlcV9zX3R5cGUgcnBjX2xvY19zZXJ2ZXJfb3Blbl9yZXFfc190eXBlOwotCi1zdHJ1Y3QgcnBjX2xvY19zZXJ2ZXJfbXVsdGlfb3Blbl9yZXFfc190eXBlIHsKLSAgICBycGNfbG9jX3NlcnZlcl9jb25uZWN0aW9uX2hhbmRsZSBjb25uX2hhbmRsZTsKLSAgICBycGNfbG9jX3NlcnZlcl9wcm90b2NvbF9lX3R5cGUgcHJvdG9jb2w7Ci0gICAgcnBjX2xvY19zZXJ2ZXJfY29ubmVjdGlvbl9lX3R5cGUgY29ubmVjdGlvbl90eXBlOwotfTsKLXR5cGVkZWYgc3RydWN0IHJwY19sb2Nfc2VydmVyX211bHRpX29wZW5fcmVxX3NfdHlwZSBycGNfbG9jX3NlcnZlcl9tdWx0aV9vcGVuX3JlcV9zX3R5cGU7Ci0KLXN0cnVjdCBycGNfbG9jX3NlcnZlcl9jbG9zZV9yZXFfc190eXBlIHsKLSAgICBycGNfbG9jX3NlcnZlcl9jb25uZWN0aW9uX2hhbmRsZSBjb25uX2hhbmRsZTsKLX07Ci10eXBlZGVmIHN0cnVjdCBycGNfbG9jX3NlcnZlcl9jbG9zZV9yZXFfc190eXBlIHJwY19sb2Nfc2VydmVyX2Nsb3NlX3JlcV9zX3R5cGU7Ci0KLXN0cnVjdCBycGNfbG9jX3NlcnZlcl9yZXF1ZXN0X3VfdHlwZSB7Ci0gICAgcnBjX2xvY19zZXJ2ZXJfcmVxdWVzdF9lX3R5cGUgZGlzYzsKLSAgICB1bmlvbiB7Ci0gICAgICAgIHJwY19sb2Nfc2VydmVyX29wZW5fcmVxX3NfdHlwZSBvcGVuX3JlcTsKLSAgICAgICAgcnBjX2xvY19zZXJ2ZXJfY2xvc2VfcmVxX3NfdHlwZSBjbG9zZV9yZXE7Ci0gICAgICAgIHJwY19sb2Nfc2VydmVyX211bHRpX29wZW5fcmVxX3NfdHlwZSBtdWx0aV9vcGVuX3JlcTsKLSAgICB9IHJwY19sb2Nfc2VydmVyX3JlcXVlc3RfdV90eXBlX3U7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgcnBjX2xvY19zZXJ2ZXJfcmVxdWVzdF91X3R5cGUgcnBjX2xvY19zZXJ2ZXJfcmVxdWVzdF91X3R5cGU7Ci0KLXN0cnVjdCBycGNfbG9jX3NlcnZlcl9yZXF1ZXN0X3NfdHlwZSB7Ci0gICAgcnBjX2xvY19zZXJ2ZXJfcmVxdWVzdF9lX3R5cGUgZXZlbnQ7Ci0gICAgcnBjX2xvY19zZXJ2ZXJfcmVxdWVzdF91X3R5cGUgcGF5bG9hZDsKLX07Ci10eXBlZGVmIHN0cnVjdCBycGNfbG9jX3NlcnZlcl9yZXF1ZXN0X3NfdHlwZSBycGNfbG9jX3NlcnZlcl9yZXF1ZXN0X3NfdHlwZTsKLQotZW51bSBycGNfbG9jX3F3aXBfcmVxdWVzdF9lX3R5cGUgewotICAgIFJQQ19MT0NfUVdJUF9TVEFSVF9QRVJJT0RJQ19ISV9GUkVRX0ZJWEVTID0gMCwKLSAgICBSUENfTE9DX1FXSVBfU1RBUlRfUEVSSU9ESUNfS0VFUF9XQVJNID0gMCArIDEsCi0gICAgUlBDX0xPQ19RV0lQX1NUT1BfUEVSSU9ESUNfRklYRVMgPSAwICsgMiwKLSAgICBSUENfTE9DX1FXSVBfU1VTUEVORCA9IDAgKyAzLAotICAgIFJQQ19MT0NfUVdJUF9SRVFVRVNUX01BWCA9IDI2ODQzNTQ1NiwKLX07Ci10eXBlZGVmIGVudW0gcnBjX2xvY19xd2lwX3JlcXVlc3RfZV90eXBlIHJwY19sb2NfcXdpcF9yZXF1ZXN0X2VfdHlwZTsKLQotc3RydWN0IHJwY19sb2NfcXdpcF9yZXF1ZXN0X3NfdHlwZSB7Ci0gICAgcnBjX2xvY19xd2lwX3JlcXVlc3RfZV90eXBlIHJlcXVlc3RfdHlwZTsKLSAgICBycGNfdWludDE2IHRiZl9tczsKLX07Ci10eXBlZGVmIHN0cnVjdCBycGNfbG9jX3F3aXBfcmVxdWVzdF9zX3R5cGUgcnBjX2xvY19xd2lwX3JlcXVlc3Rfc190eXBlOwotCi1zdHJ1Y3QgcnBjX2xvY19yZXNlcnZlZF9wYXlsb2FkX3NfdHlwZSB7Ci0gICAgcnBjX3VpbnQxNiBkYXRhX3NpemU7Ci0gICAgc3RydWN0IHsKLSAgICAgICAgdV9pbnQgZGF0YV9sZW47Ci0gICAgICAgIGNoYXIgKmRhdGFfdmFsOwotICAgIH0gZGF0YTsKLX07Ci10eXBlZGVmIHN0cnVjdCBycGNfbG9jX3Jlc2VydmVkX3BheWxvYWRfc190eXBlIHJwY19sb2NfcmVzZXJ2ZWRfcGF5bG9hZF9zX3R5cGU7Ci0KLWVudW0gcnBjX2xvY19pb2N0bF9lX3R5cGUgewotICAgIFJQQ19MT0NfSU9DVExfR0VUX0FQSV9WRVJTSU9OID0gMSwKLSAgICBSUENfTE9DX0lPQ1RMX1NFVF9GSVhfQ1JJVEVSSUEgPSAyLAotICAgIFJQQ19MT0NfSU9DVExfR0VUX0ZJWF9DUklURVJJQSA9IDMsCi0gICAgUlBDX0xPQ19JT0NUTF9TRVJWSUNFX1NUQVJUX0lOREVYID0gNDAwLAotICAgIFJQQ19MT0NfSU9DVExfSU5GT1JNX05JX1VTRVJfUkVTUE9OU0UgPSA0MDAsCi0gICAgUlBDX0xPQ19JT0NUTF9JTkpFQ1RfUFJFRElDVEVEX09SQklUU19EQVRBID0gNDAxLAotICAgIFJQQ19MT0NfSU9DVExfUVVFUllfUFJFRElDVEVEX09SQklUU19EQVRBX1ZBTElESVRZID0gNDAyLAotICAgIFJQQ19MT0NfSU9DVExfUVVFUllfUFJFRElDVEVEX09SQklUU19EQVRBX1NPVVJDRSA9IDQwMywKLSAgICBSUENfTE9DX0lPQ1RMX1NFVF9QUkVESUNURURfT1JCSVRTX0RBVEFfQVVUT19ET1dOTE9BRCA9IDQwNCwKLSAgICBSUENfTE9DX0lPQ1RMX0lOSkVDVF9VVENfVElNRSA9IDQwNSwKLSAgICBSUENfTE9DX0lPQ1RMX0lOSkVDVF9SVENfVkFMVUUgPSA0MDYsCi0gICAgUlBDX0xPQ19JT0NUTF9JTkpFQ1RfUE9TSVRJT04gPSA0MDcsCi0gICAgUlBDX0xPQ19JT0NUTF9RVUVSWV9FTkdJTkVfU1RBVEUgPSA0MDgsCi0gICAgUlBDX0xPQ19JT0NUTF9JTkZPUk1fU0VSVkVSX09QRU5fU1RBVFVTID0gNDA5LAotICAgIFJQQ19MT0NfSU9DVExfSU5GT1JNX1NFUlZFUl9DTE9TRV9TVEFUVVMgPSA0MTAsCi0gICAgUlBDX0xPQ19JT0NUTF9TRU5EX1dJUEVSX1BPU0lUSU9OX1JFUE9SVCA9IDQxMSwKLSAgICBSUENfTE9DX0lPQ1RMX05PVElGWV9XSVBFUl9TVEFUVVMgPSA0MTIsCi0gICAgUlBDX0xPQ19JT0NUTF9BQ0NFU1NfRUZTX0RBVEEgPSA0MTMsCi0gICAgUlBDX0xPQ19JT0NUTF9FUlJPUl9FU1RJTUFURV9DT05GSUcgPSA0MTQsCi0gICAgUlBDX0xPQ19JT0NUTF9JTkZPUk1fU0VSVkVSX01VTFRJX09QRU5fU1RBVFVTID0gNDE1LAotICAgIFJQQ19MT0NfSU9DVExfTlZfU0VUVElOR1NfU1RBUlRfSU5ERVggPSA4MDAsCi0gICAgUlBDX0xPQ19JT0NUTF9TRVRfRU5HSU5FX0xPQ0sgPSA4MDAsCi0gICAgUlBDX0xPQ19JT0NUTF9HRVRfRU5HSU5FX0xPQ0sgPSA4MDEsCi0gICAgUlBDX0xPQ19JT0NUTF9TRVRfU0JBU19DT05GSUcgPSA4MDIsCi0gICAgUlBDX0xPQ19JT0NUTF9HRVRfU0JBU19DT05GSUcgPSA4MDMsCi0gICAgUlBDX0xPQ19JT0NUTF9TRVRfTk1FQV9UWVBFUyA9IDgwNCwKLSAgICBSUENfTE9DX0lPQ1RMX0dFVF9OTUVBX1RZUEVTID0gODA1LAotICAgIFJQQ19MT0NfSU9DVExfU0VUX0NETUFfUERFX1NFUlZFUl9BRERSID0gODA2LAotICAgIFJQQ19MT0NfSU9DVExfR0VUX0NETUFfUERFX1NFUlZFUl9BRERSID0gODA3LAotICAgIFJQQ19MT0NfSU9DVExfU0VUX0NETUFfTVBDX1NFUlZFUl9BRERSID0gODA4LAotICAgIFJQQ19MT0NfSU9DVExfR0VUX0NETUFfTVBDX1NFUlZFUl9BRERSID0gODA5LAotICAgIFJQQ19MT0NfSU9DVExfU0VUX1VNVFNfU0xQX1NFUlZFUl9BRERSID0gODEwLAotICAgIFJQQ19MT0NfSU9DVExfR0VUX1VNVFNfU0xQX1NFUlZFUl9BRERSID0gODExLAotICAgIFJQQ19MT0NfSU9DVExfU0VUX09OX0RFTUFORF9MUE0gPSA4MTIsCi0gICAgUlBDX0xPQ19JT0NUTF9HRVRfT05fREVNQU5EX0xQTSA9IDgxMywKLSAgICBSUENfTE9DX0lPQ1RMX1NFVF9YVFJBX1RfU0VTU0lPTl9DT05UUk9MID0gODE0LAotICAgIFJQQ19MT0NfSU9DVExfR0VUX1hUUkFfVF9TRVNTSU9OX0NPTlRST0wgPSA4MTUsCi0gICAgUlBDX0xPQ19JT0NUTF9TRVRfTEJTX0FQTl9QUk9GSUxFID0gODE2LAotICAgIFJQQ19MT0NfSU9DVExfR0VUX0xCU19BUE5fUFJPRklMRSA9IDgxNywKLSAgICBSUENfTE9DX0lPQ1RMX1NFVF9YVFJBX0FQTl9QUk9GSUxFID0gODE4LAotICAgIFJQQ19MT0NfSU9DVExfR0VUX1hUUkFfQVBOX1BST0ZJTEUgPSA4MTksCi0gICAgUlBDX0xPQ19JT0NUTF9TRVRfREFUQV9FTkFCTEUgPSA4MjAsCi0gICAgUlBDX0xPQ19JT0NUTF9TRVRfU1VQTF9WRVJTSU9OID0gODIxLAotICAgIFJQQ19MT0NfSU9DVExfR0VUX1NVUExfVkVSU0lPTiA9IDgyMiwKLSAgICBSUENfTE9DX0lPQ1RMX1BST1BSSUVUQVJZX1NUQVJUX0lOREVYID0gMTAwMCwKLSAgICBSUENfTE9DX0lPQ1RMX0RFTEVURV9BU1NJU1RfREFUQSA9IDEwMDAsCi0gICAgUlBDX0xPQ19JT0NUTF9TRVRfQ1VTVE9NX1BERV9TRVJWRVJfQUREUiA9IDEwMDEsCi0gICAgUlBDX0xPQ19JT0NUTF9HRVRfQ1VTVE9NX1BERV9TRVJWRVJfQUREUiA9IDEwMDIsCi0gICAgUlBDX0xPQ19JT0NUTF9SRVNFUlZFRF9DTUQgPSA4MDAwLAotICAgIFJQQ19MT0NfSU9DVExfVEhJUkRfUEFSVFlfU1RBUlRfSU5ERVggPSAxMDczNzQxODI0LAotfTsKLXR5cGVkZWYgZW51bSBycGNfbG9jX2lvY3RsX2VfdHlwZSBycGNfbG9jX2lvY3RsX2VfdHlwZTsKLQotc3RydWN0IHJwY19sb2NfYXBpX3ZlcnNpb25fc190eXBlIHsKLSAgICB1X2NoYXIgbWFqb3I7Ci0gICAgdV9jaGFyIG1pbm9yOwotfTsKLXR5cGVkZWYgc3RydWN0IHJwY19sb2NfYXBpX3ZlcnNpb25fc190eXBlIHJwY19sb2NfYXBpX3ZlcnNpb25fc190eXBlOwotCi1lbnVtIHJwY19sb2NfZml4X3JlY3VycmVuY2VfZV90eXBlIHsKLSAgICBSUENfTE9DX1BFUklPRElDX0ZJWCA9IDEsCi0gICAgUlBDX0xPQ19TSU5HTEVfRklYID0gMiwKLSAgICBSUENfTE9DX0ZJWF9TRVNTSU9OX1RZUEVfTUFYID0gMjY4NDM1NDU2LAotfTsKLXR5cGVkZWYgZW51bSBycGNfbG9jX2ZpeF9yZWN1cnJlbmNlX2VfdHlwZSBycGNfbG9jX2ZpeF9yZWN1cnJlbmNlX2VfdHlwZTsKLQotZW51bSBycGNfbG9jX29wZXJhdGlvbl9tb2RlX2VfdHlwZSB7Ci0gICAgUlBDX0xPQ19PUEVSX01PREVfREVGQVVMVCA9IDEsCi0gICAgUlBDX0xPQ19PUEVSX01PREVfTVNCID0gMiwKLSAgICBSUENfTE9DX09QRVJfTU9ERV9NU0EgPSAzLAotICAgIFJQQ19MT0NfT1BFUl9NT0RFX1NUQU5EQUxPTkUgPSA0LAotICAgIFJQQ19MT0NfT1BFUl9NT0RFX1NQRUVEX09QVElNQUwgPSA1LAotICAgIFJQQ19MT0NfT1BFUl9NT0RFX0FDQ1VSQUNZX09QVElNQUwgPSA2LAotICAgIFJQQ19MT0NfT1BFUl9NT0RFX0RBVEFfT1BUSU1BTCA9IDcsCi0gICAgUlBDX0xPQ19PUEVSX01PREVfQ0VMTF9JRCA9IDgsCi0gICAgUlBDX0xPQ19PUEVSX01PREVfTUFYID0gMjY4NDM1NDU2LAotfTsKLXR5cGVkZWYgZW51bSBycGNfbG9jX29wZXJhdGlvbl9tb2RlX2VfdHlwZSBycGNfbG9jX29wZXJhdGlvbl9tb2RlX2VfdHlwZTsKLQotZW51bSBycGNfbG9jX25vdGlmeV9lX3R5cGUgewotICAgIFJQQ19MT0NfTk9USUZZX09OX0lOVEVSVkFMID0gMSwKLSAgICBSUENfTE9DX05PVElGWV9PTl9ESVNUQU5DRSA9IDIsCi0gICAgUlBDX0xPQ19OT1RJRllfT05fQU5ZID0gMywKLSAgICBSUENfTE9DX05PVElGWV9PTl9BTEwgPSA0LAotICAgIFJQQ19MT0NfTk9USUZZX1RZUEVfTUFYID0gMjY4NDM1NDU2LAotfTsKLXR5cGVkZWYgZW51bSBycGNfbG9jX25vdGlmeV9lX3R5cGUgcnBjX2xvY19ub3RpZnlfZV90eXBlOwotCi1zdHJ1Y3QgcnBjX2xvY19maXhfY3JpdGVyaWFfc190eXBlIHsKLSAgICBycGNfdWludDMyIHZhbGlkX21hc2s7Ci0gICAgcnBjX2xvY19maXhfcmVjdXJyZW5jZV9lX3R5cGUgcmVjdXJyZW5jZV90eXBlOwotICAgIHJwY19sb2Nfb3BlcmF0aW9uX21vZGVfZV90eXBlIHByZWZlcnJlZF9vcGVyYXRpb25fbW9kZTsKLSAgICBycGNfdWludDMyIHByZWZlcnJlZF9hY2N1cmFjeTsKLSAgICBycGNfdWludDMyIHByZWZlcnJlZF9yZXNwb25zZV90aW1lOwotICAgIHJwY19ib29sZWFuIGludGVybWVkaWF0ZV9wb3NfcmVwb3J0X2VuYWJsZWQ7Ci0gICAgcnBjX2xvY19ub3RpZnlfZV90eXBlIG5vdGlmeV90eXBlOwotICAgIHJwY191aW50MzIgbWluX2ludGVydmFsOwotICAgIGZsb2F0IG1pbl9kaXN0YW5jZTsKLSAgICBycGNfdWludDMyIG1pbl9kaXN0X3NhbXBsZV9pbnRlcnZhbDsKLX07Ci10eXBlZGVmIHN0cnVjdCBycGNfbG9jX2ZpeF9jcml0ZXJpYV9zX3R5cGUgcnBjX2xvY19maXhfY3JpdGVyaWFfc190eXBlOwotCi1lbnVtIHJwY19sb2NfbmlfdXNlcl9yZXNwX2VfdHlwZSB7Ci0gICAgUlBDX0xPQ19OSV9MQ1NfTk9USUZZX1ZFUklGWV9BQ0NFUFQgPSAxLAotICAgIFJQQ19MT0NfTklfTENTX05PVElGWV9WRVJJRllfREVOWSA9IDIsCi0gICAgUlBDX0xPQ19OSV9MQ1NfTk9USUZZX1ZFUklGWV9OT1JFU1AgPSAzLAotICAgIFJQQ19MT0NfTklfTENTX05PVElGWV9WRVJJRllfTUFYID0gMjY4NDM1NDU2LAotfTsKLXR5cGVkZWYgZW51bSBycGNfbG9jX25pX3VzZXJfcmVzcF9lX3R5cGUgcnBjX2xvY19uaV91c2VyX3Jlc3BfZV90eXBlOwotCi1zdHJ1Y3QgcnBjX2xvY191c2VyX3ZlcmlmeV9zX3R5cGUgewotICAgIHJwY19sb2NfbmlfdXNlcl9yZXNwX2VfdHlwZSB1c2VyX3Jlc3A7Ci0gICAgcnBjX2xvY19uaV9ldmVudF9zX3R5cGUgbmlfZXZlbnRfcGFzc19iYWNrOwotfTsKLXR5cGVkZWYgc3RydWN0IHJwY19sb2NfdXNlcl92ZXJpZnlfc190eXBlIHJwY19sb2NfdXNlcl92ZXJpZnlfc190eXBlOwotCi1lbnVtIHJwY19sb2NfcHJlZGljdGVkX29yYml0c19kYXRhX2Zvcm1hdF9lX3R5cGUgewotICAgIFJQQ19MT0NfUFJFRElDVEVEX09SQklUU19YVFJBID0gMCwKLSAgICBSUENfTE9DX1BSRURJQ1RFRF9PUkJJVFNfRk9STUFUX01BWCA9IDI2ODQzNTQ1NiwKLX07Ci10eXBlZGVmIGVudW0gcnBjX2xvY19wcmVkaWN0ZWRfb3JiaXRzX2RhdGFfZm9ybWF0X2VfdHlwZSBycGNfbG9jX3ByZWRpY3RlZF9vcmJpdHNfZGF0YV9mb3JtYXRfZV90eXBlOwotCi1zdHJ1Y3QgcnBjX2xvY19wcmVkaWN0ZWRfb3JiaXRzX2RhdGFfc190eXBlIHsKLSAgICBycGNfbG9jX3ByZWRpY3RlZF9vcmJpdHNfZGF0YV9mb3JtYXRfZV90eXBlIGZvcm1hdF90eXBlOwotICAgIHJwY191aW50MzIgdG90YWxfc2l6ZTsKLSAgICBycGNfdWludDggdG90YWxfcGFydHM7Ci0gICAgcnBjX3VpbnQ4IHBhcnQ7Ci0gICAgcnBjX3VpbnQxNiBwYXJ0X2xlbjsKLSAgICBzdHJ1Y3QgewotICAgICAgICB1X2ludCBkYXRhX3B0cl9sZW47Ci0gICAgICAgIGNoYXIgKmRhdGFfcHRyX3ZhbDsKLSAgICB9IGRhdGFfcHRyOwotfTsKLXR5cGVkZWYgc3RydWN0IHJwY19sb2NfcHJlZGljdGVkX29yYml0c19kYXRhX3NfdHlwZSBycGNfbG9jX3ByZWRpY3RlZF9vcmJpdHNfZGF0YV9zX3R5cGU7Ci0KLXN0cnVjdCBycGNfbG9jX3ByZWRpY3RlZF9vcmJpdHNfZGF0YV92YWxpZGl0eV9yZXBvcnRfc190eXBlIHsKLSAgICBycGNfdWludDY0IHN0YXJ0X3RpbWVfdXRjOwotICAgIHJwY191aW50MTYgdmFsaWRfZHVyYXRpb25faHJzOwotfTsKLXR5cGVkZWYgc3RydWN0IHJwY19sb2NfcHJlZGljdGVkX29yYml0c19kYXRhX3ZhbGlkaXR5X3JlcG9ydF9zX3R5cGUgcnBjX2xvY19wcmVkaWN0ZWRfb3JiaXRzX2RhdGFfdmFsaWRpdHlfcmVwb3J0X3NfdHlwZTsKLQotc3RydWN0IHJwY19sb2NfcHJlZGljdGVkX29yYml0c19hdXRvX2Rvd25sb2FkX2NvbmZpZ19zX3R5cGUgewotICAgIHJwY19ib29sZWFuIGVuYWJsZTsKLSAgICB1X2NoYXIgYXV0b19jaGVja19ldmVyeV9ocnM7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgcnBjX2xvY19wcmVkaWN0ZWRfb3JiaXRzX2F1dG9fZG93bmxvYWRfY29uZmlnX3NfdHlwZSBycGNfbG9jX3ByZWRpY3RlZF9vcmJpdHNfYXV0b19kb3dubG9hZF9jb25maWdfc190eXBlOwotCi1zdHJ1Y3QgcnBjX2xvY19hc3Npc3RfZGF0YV90aW1lX3NfdHlwZSB7Ci0gICAgcnBjX3VpbnQ2NCB0aW1lX3V0YzsKLSAgICBycGNfdWludDMyIHVuY2VydGFpbnR5OwotfTsKLXR5cGVkZWYgc3RydWN0IHJwY19sb2NfYXNzaXN0X2RhdGFfdGltZV9zX3R5cGUgcnBjX2xvY19hc3Npc3RfZGF0YV90aW1lX3NfdHlwZTsKLQotdHlwZWRlZiBycGNfdWludDY0IHJwY19sb2NfYXNzaXN0X3Bvc192YWxpZF9tYXNrX3R5cGU7Ci0KLXN0cnVjdCBycGNfbG9jX2Fzc2lzdF9kYXRhX3Bvc19zX3R5cGUgewotICAgIHJwY19sb2NfYXNzaXN0X3Bvc192YWxpZF9tYXNrX3R5cGUgdmFsaWRfbWFzazsKLSAgICBycGNfdWludDY0IHRpbWVzdGFtcF91dGM7Ci0gICAgZG91YmxlIGxhdGl0dWRlOwotICAgIGRvdWJsZSBsb25naXR1ZGU7Ci0gICAgZmxvYXQgYWx0aXR1ZGVfd3J0X2VsbGlwc29pZDsKLSAgICBmbG9hdCBhbHRpdHVkZV93cnRfbWVhbl9zZWFfbGV2ZWw7Ci0gICAgZmxvYXQgaG9yX3VuY19jaXJjdWxhcjsKLSAgICBmbG9hdCB2ZXJ0X3VuYzsKLSAgICB1X2NoYXIgY29uZmlkZW5jZV9ob3Jpem9udGFsOwotICAgIHVfY2hhciBjb25maWRlbmNlX3ZlcnRpY2FsOwotICAgIHJwY19pbnQzMiB0aW1lc3RhbXBfYWdlOwotfTsKLXR5cGVkZWYgc3RydWN0IHJwY19sb2NfYXNzaXN0X2RhdGFfcG9zX3NfdHlwZSBycGNfbG9jX2Fzc2lzdF9kYXRhX3Bvc19zX3R5cGU7Ci0KLWVudW0gcnBjX2xvY19zZXJ2ZXJfb3Blbl9zdGF0dXNfZV90eXBlIHsKLSAgICBSUENfTE9DX1NFUlZFUl9PUEVOX1NVQ0NFU1MgPSAxLAotICAgIFJQQ19MT0NfU0VSVkVSX09QRU5fRkFJTCA9IDIsCi0gICAgUlBDX0xPQ19TRVJWRVJfT1BFTl9TVEFUVVNfTUFYID0gMjY4NDM1NDU2LAotfTsKLXR5cGVkZWYgZW51bSBycGNfbG9jX3NlcnZlcl9vcGVuX3N0YXR1c19lX3R5cGUgcnBjX2xvY19zZXJ2ZXJfb3Blbl9zdGF0dXNfZV90eXBlOwotCi1lbnVtIHJwY19sb2Nfc2VydmVyX3BkcF90eXBlX2VfdHlwZSB7Ci0gICAgUlBDX0xPQ19TRVJWRVJfUERQX0lQID0gMCwKLSAgICBSUENfTE9DX1NFUlZFUl9QRFBfUFBQID0gMCArIDEsCi0gICAgUlBDX0xPQ19TRVJWRVJfUERQX0lQVjYgPSAwICsgMiwKLSAgICBSUENfTE9DX1NFUlZFUl9QRFBfSVBWNFY2ID0gMCArIDMsCi0gICAgUlBDX0xPQ19TRVJWRVJfUERQX01BWCA9IDI2ODQzNTQ1NiwKLX07Ci10eXBlZGVmIGVudW0gcnBjX2xvY19zZXJ2ZXJfcGRwX3R5cGVfZV90eXBlIHJwY19sb2Nfc2VydmVyX3BkcF90eXBlX2VfdHlwZTsKLQotc3RydWN0IHJwY19sb2Nfc2VydmVyX29wZW5fc3RhdHVzX3NfdHlwZSB7Ci0gICAgcnBjX2xvY19zZXJ2ZXJfY29ubmVjdGlvbl9oYW5kbGUgY29ubl9oYW5kbGU7Ci0gICAgcnBjX2xvY19zZXJ2ZXJfb3Blbl9zdGF0dXNfZV90eXBlIG9wZW5fc3RhdHVzOwotICAgIGNoYXIgYXBuX25hbWVbMTAwXTsKLX07Ci10eXBlZGVmIHN0cnVjdCBycGNfbG9jX3NlcnZlcl9vcGVuX3N0YXR1c19zX3R5cGUgcnBjX2xvY19zZXJ2ZXJfb3Blbl9zdGF0dXNfc190eXBlOwotCi1zdHJ1Y3QgcnBjX2xvY19zZXJ2ZXJfbXVsdGlfb3Blbl9zdGF0dXNfc190eXBlIHsKLSAgICBycGNfbG9jX3NlcnZlcl9jb25uZWN0aW9uX2hhbmRsZSBjb25uX2hhbmRsZTsKLSAgICBycGNfbG9jX3NlcnZlcl9vcGVuX3N0YXR1c19lX3R5cGUgb3Blbl9zdGF0dXM7Ci0gICAgcnBjX2xvY19zZXJ2ZXJfcGRwX3R5cGVfZV90eXBlIHBkcF90eXBlOwotICAgIGNoYXIgYXBuX25hbWVbMTAwXTsKLX07Ci10eXBlZGVmIHN0cnVjdCBycGNfbG9jX3NlcnZlcl9tdWx0aV9vcGVuX3N0YXR1c19zX3R5cGUgcnBjX2xvY19zZXJ2ZXJfbXVsdGlfb3Blbl9zdGF0dXNfc190eXBlOwotCi1lbnVtIHJwY19sb2Nfc2VydmVyX2Nsb3NlX3N0YXR1c19lX3R5cGUgewotICAgIFJQQ19MT0NfU0VSVkVSX0NMT1NFX1NVQ0NFU1MgPSAxLAotICAgIFJQQ19MT0NfU0VSVkVSX0NMT1NFX0ZBSUwgPSAyLAotICAgIFJQQ19MT0NfU0VSVkVSX0NMT1NFX1NUQVRVU19NQVggPSAyNjg0MzU0NTYsCi19OwotdHlwZWRlZiBlbnVtIHJwY19sb2Nfc2VydmVyX2Nsb3NlX3N0YXR1c19lX3R5cGUgcnBjX2xvY19zZXJ2ZXJfY2xvc2Vfc3RhdHVzX2VfdHlwZTsKLQotc3RydWN0IHJwY19sb2Nfc2VydmVyX2Nsb3NlX3N0YXR1c19zX3R5cGUgewotICAgIHJwY19sb2Nfc2VydmVyX2Nvbm5lY3Rpb25faGFuZGxlIGNvbm5faGFuZGxlOwotICAgIHJwY19sb2Nfc2VydmVyX2Nsb3NlX3N0YXR1c19lX3R5cGUgY2xvc2Vfc3RhdHVzOwotfTsKLXR5cGVkZWYgc3RydWN0IHJwY19sb2Nfc2VydmVyX2Nsb3NlX3N0YXR1c19zX3R5cGUgcnBjX2xvY19zZXJ2ZXJfY2xvc2Vfc3RhdHVzX3NfdHlwZTsKLQotc3RydWN0IHJwY19sb2Nfd2lwZXJfZml4X3RpbWVfc190eXBlIHsKLSAgICBycGNfdWludDMyIHNsb3dfY2xvY2tfY291bnQ7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgcnBjX2xvY193aXBlcl9maXhfdGltZV9zX3R5cGUgcnBjX2xvY193aXBlcl9maXhfdGltZV9zX3R5cGU7Ci0KLXN0cnVjdCBycGNfbG9jX3dpcGVyX2ZpeF9wb3Nfc190eXBlIHsKLSAgICBycGNfaW50MzIgbGF0OwotICAgIHJwY19pbnQzMiBsb247Ci0gICAgcnBjX3VpbnQxNiBIRVBFOwotICAgIHJwY191aW50OCBudW1fb2ZfYXBzX3VzZWQ7Ci0gICAgcnBjX3VpbnQ4IGZpeF9lcnJvcl9jb2RlOwotfTsKLXR5cGVkZWYgc3RydWN0IHJwY19sb2Nfd2lwZXJfZml4X3Bvc19zX3R5cGUgcnBjX2xvY193aXBlcl9maXhfcG9zX3NfdHlwZTsKLQotc3RydWN0IHJwY19sb2Nfd2lwZXJfYXBfaW5mb19zX3R5cGUgewotICAgIGNoYXIgbWFjX2FkZHJbNl07Ci0gICAgcnBjX2ludDMyIHJzc2k7Ci0gICAgcnBjX3VpbnQxNiBjaGFubmVsOwotICAgIHJwY191aW50OCBhcF9xdWFsaWZpZXI7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgcnBjX2xvY193aXBlcl9hcF9pbmZvX3NfdHlwZSBycGNfbG9jX3dpcGVyX2FwX2luZm9fc190eXBlOwotCi1zdHJ1Y3QgcnBjX2xvY193aXBlcl9hcF9zZXRfc190eXBlIHsKLSAgICBycGNfdWludDggbnVtX29mX2FwczsKLSAgICBycGNfbG9jX3dpcGVyX2FwX2luZm9fc190eXBlIGFwX2luZm9bNTBdOwotfTsKLXR5cGVkZWYgc3RydWN0IHJwY19sb2Nfd2lwZXJfYXBfc2V0X3NfdHlwZSBycGNfbG9jX3dpcGVyX2FwX3NldF9zX3R5cGU7Ci0KLXN0cnVjdCBycGNfbG9jX3dpcGVyX3Bvc2l0aW9uX3JlcG9ydF9zX3R5cGUgewotICAgIHJwY191aW50OCB3aXBlcl92YWxpZF9pbmZvX2ZsYWc7Ci0gICAgcnBjX2xvY193aXBlcl9maXhfdGltZV9zX3R5cGUgd2lwZXJfZml4X3RpbWU7Ci0gICAgcnBjX2xvY193aXBlcl9maXhfcG9zX3NfdHlwZSB3aXBlcl9maXhfcG9zaXRpb247Ci0gICAgcnBjX2xvY193aXBlcl9hcF9zZXRfc190eXBlIHdpcGVyX2FwX3NldDsKLX07Ci10eXBlZGVmIHN0cnVjdCBycGNfbG9jX3dpcGVyX3Bvc2l0aW9uX3JlcG9ydF9zX3R5cGUgcnBjX2xvY193aXBlcl9wb3NpdGlvbl9yZXBvcnRfc190eXBlOwotCi1lbnVtIHJwY19sb2Nfd2lwZXJfc3RhdHVzX2VfdHlwZSB7Ci0gICAgUlBDX0xPQ19XSVBFUl9TVEFUVVNfQVZBSUxBQkxFID0gMSwKLSAgICBSUENfTE9DX1dJUEVSX1NUQVRVU19VTkFWQUlMQUJMRSA9IDIsCi0gICAgUlBDX0xPQ19XSVBFUl9TVEFUVVNfRV9TSVpFID0gMjY4NDM1NDU2LAotfTsKLXR5cGVkZWYgZW51bSBycGNfbG9jX3dpcGVyX3N0YXR1c19lX3R5cGUgcnBjX2xvY193aXBlcl9zdGF0dXNfZV90eXBlOwotCi1lbnVtIHJwY19sb2NfZnNfb3BlcmF0aW9uX2VfdHlwZSB7Ci0gICAgUlBDX0xPQ19GU19DUkVBVEVfV1JJVEVfRklMRSA9IDEsCi0gICAgUlBDX0xPQ19GU19BUFBFTkRfRklMRSA9IDIsCi0gICAgUlBDX0xPQ19GU19ERUxFVEVfRklMRSA9IDMsCi0gICAgUlBDX0xPQ19GU19SRUFEX0ZJTEUgPSA0LAotICAgIFJQQ19MT0NfRlNfTUFYID0gMjY4NDM1NDU2LAotfTsKLXR5cGVkZWYgZW51bSBycGNfbG9jX2ZzX29wZXJhdGlvbl9lX3R5cGUgcnBjX2xvY19mc19vcGVyYXRpb25fZV90eXBlOwotCi1zdHJ1Y3QgcnBjX2xvY19lZnNfZGF0YV9zX3R5cGUgewotICAgIGNoYXIgZmlsZW5hbWVbNjRdOwotICAgIHJwY19sb2NfZnNfb3BlcmF0aW9uX2VfdHlwZSBvcGVyYXRpb247Ci0gICAgcnBjX3VpbnQzMiB0b3RhbF9zaXplOwotICAgIHN0cnVjdCB7Ci0gICAgICAgIHVfaW50IGRhdGFfcHRyX2xlbjsKLSAgICAgICAgY2hhciAqZGF0YV9wdHJfdmFsOwotICAgIH0gZGF0YV9wdHI7Ci0gICAgcnBjX3VpbnQzMiBwYXJ0X2xlbjsKLSAgICBycGNfdWludDggcGFydDsKLSAgICBycGNfdWludDggdG90YWxfcGFydHM7Ci0gICAgcnBjX3VpbnQzMiByZXNlcnZlZDsKLX07Ci10eXBlZGVmIHN0cnVjdCBycGNfbG9jX2Vmc19kYXRhX3NfdHlwZSBycGNfbG9jX2Vmc19kYXRhX3NfdHlwZTsKLQotZW51bSBycGNfbG9jX2Vycm9yX2VzdGltYXRlX2NvbmZpZ19lX3R5cGUgewotICAgIFJQQ19MT0NfRVJST1JfRVNUSU1BVEVfQ09ORklHX1NFVCA9IDEsCi0gICAgUlBDX0xPQ19FUlJPUl9FU1RJTUFURV9DT05GSUdfQ0xFQVIgPSAyLAotICAgIFJQQ19MT0NfRVJST1JfRVNUSU1BVEVfTUFYID0gMjY4NDM1NDU2LAotfTsKLXR5cGVkZWYgZW51bSBycGNfbG9jX2Vycm9yX2VzdGltYXRlX2NvbmZpZ19lX3R5cGUgcnBjX2xvY19lcnJvcl9lc3RpbWF0ZV9jb25maWdfZV90eXBlOwotCi1zdHJ1Y3QgcnBjX2xvY19hcG5fcHJvZmlsZXNfdHlwZSB7Ci0gICAgcnBjX3VpbnQzMiBzcnZfc3lzdGVtX3R5cGU7Ci0gICAgcnBjX3VpbnQzMiBwZHBfdHlwZTsKLSAgICBycGNfdWludDMyIHJlc2VydmVkOwotICAgIGNoYXIgYXBuX25hbWVbMTAwXTsKLX07Ci10eXBlZGVmIHN0cnVjdCBycGNfbG9jX2Fwbl9wcm9maWxlc190eXBlIHJwY19sb2NfYXBuX3Byb2ZpbGVzX3R5cGU7Ci0KLWVudW0gcnBjX2xvY19sb2NrX2VfdHlwZSB7Ci0gICAgUlBDX0xPQ19MT0NLX05PTkUgPSAxLAotICAgIFJQQ19MT0NfTE9DS19NSSA9IDIsCi0gICAgUlBDX0xPQ19MT0NLX01UID0gMywKLSAgICBSUENfTE9DX0xPQ0tfQUxMID0gNCwKLSAgICBSUENfTE9DX0xPQ0tfTUFYID0gMjY4NDM1NDU2LAotfTsKLXR5cGVkZWYgZW51bSBycGNfbG9jX2xvY2tfZV90eXBlIHJwY19sb2NfbG9ja19lX3R5cGU7Ci0KLXR5cGVkZWYgcnBjX3VpbnQzMiBycGNfbG9jX25tZWFfc2VudGVuY2VfdHlwZTsKLQotdHlwZWRlZiBycGNfdWludDMyIHJwY19sb2NfYXNzaXN0X2RhdGFfdHlwZTsKLQotc3RydWN0IHJwY19sb2NfYXNzaXN0X2RhdGFfZGVsZXRlX3NfdHlwZSB7Ci0gICAgcnBjX2xvY19hc3Npc3RfZGF0YV90eXBlIHR5cGU7Ci0gICAgcnBjX3VpbnQzMiByZXNlcnZlZFs4XTsKLX07Ci10eXBlZGVmIHN0cnVjdCBycGNfbG9jX2Fzc2lzdF9kYXRhX2RlbGV0ZV9zX3R5cGUgcnBjX2xvY19hc3Npc3RfZGF0YV9kZWxldGVfc190eXBlOwotCi1zdHJ1Y3QgcnBjX2xvY19pb2N0bF9kYXRhX3VfdHlwZSB7Ci0gICAgcnBjX2xvY19pb2N0bF9lX3R5cGUgZGlzYzsKLSAgICB1bmlvbiB7Ci0gICAgICAgIHJwY19sb2NfZml4X2NyaXRlcmlhX3NfdHlwZSBmaXhfY3JpdGVyaWE7Ci0gICAgICAgIHJwY19sb2NfdXNlcl92ZXJpZnlfc190eXBlIHVzZXJfdmVyaWZ5X3Jlc3A7Ci0gICAgICAgIHJwY19sb2NfcHJlZGljdGVkX29yYml0c19kYXRhX3NfdHlwZSBwcmVkaWN0ZWRfb3JiaXRzX2RhdGE7Ci0gICAgICAgIHJwY19sb2NfcHJlZGljdGVkX29yYml0c19hdXRvX2Rvd25sb2FkX2NvbmZpZ19zX3R5cGUgcHJlZGljdGVkX29yYml0c19hdXRvX2Rvd25sb2FkOwotICAgICAgICBycGNfbG9jX2Fzc2lzdF9kYXRhX3RpbWVfc190eXBlIGFzc2lzdGFuY2VfZGF0YV90aW1lOwotICAgICAgICBycGNfbG9jX2Fzc2lzdF9kYXRhX3Bvc19zX3R5cGUgYXNzaXN0YW5jZV9kYXRhX3Bvc2l0aW9uOwotICAgICAgICBycGNfbG9jX3NlcnZlcl9vcGVuX3N0YXR1c19zX3R5cGUgY29ubl9vcGVuX3N0YXR1czsKLSAgICAgICAgcnBjX2xvY19zZXJ2ZXJfY2xvc2Vfc3RhdHVzX3NfdHlwZSBjb25uX2Nsb3NlX3N0YXR1czsKLSAgICAgICAgcnBjX2xvY193aXBlcl9wb3NpdGlvbl9yZXBvcnRfc190eXBlIHdpcGVyX3BvczsKLSAgICAgICAgcnBjX2xvY193aXBlcl9zdGF0dXNfZV90eXBlIHdpcGVyX3N0YXR1czsKLSAgICAgICAgcnBjX2xvY19sb2NrX2VfdHlwZSBlbmdpbmVfbG9jazsKLSAgICAgICAgcnBjX2Jvb2xlYW4gc2Jhc19tb2RlOwotICAgICAgICBycGNfbG9jX25tZWFfc2VudGVuY2VfdHlwZSBubWVhX3R5cGVzOwotICAgICAgICBycGNfYm9vbGVhbiBvbl9kZW1hbmRfbHBtOwotICAgICAgICBycGNfbG9jX3NlcnZlcl9pbmZvX3NfdHlwZSBzZXJ2ZXJfYWRkcjsKLSAgICAgICAgcnBjX2xvY19hc3Npc3RfZGF0YV9kZWxldGVfc190eXBlIGFzc2lzdF9kYXRhX2RlbGV0ZTsKLSAgICAgICAgcnBjX2xvY19lZnNfZGF0YV9zX3R5cGUgZWZzX2RhdGE7Ci0gICAgICAgIHJwY19sb2NfZXJyb3JfZXN0aW1hdGVfY29uZmlnX2VfdHlwZSBlcnJvcl9lc3RpbWF0ZV9jb25maWc7Ci0gICAgICAgIHJwY191aW50OCB4dHJhX3Rfc2Vzc2lvbl9jb250cm9sOwotICAgICAgICBycGNfbG9jX2Fwbl9wcm9maWxlc190eXBlIGFwbl9wcm9maWxlc1s2XTsKLSAgICAgICAgcnBjX2Jvb2xlYW4gZGF0YV9lbmFibGU7Ci0gICAgICAgIHJwY191aW50MzIgc3VwbF92ZXJzaW9uOwotICAgICAgICBycGNfbG9jX3NlcnZlcl9tdWx0aV9vcGVuX3N0YXR1c19zX3R5cGUgbXVsdGlfY29ubl9vcGVuX3N0YXR1czsKLSAgICAgICAgcnBjX2xvY19yZXNlcnZlZF9wYXlsb2FkX3NfdHlwZSByZXNlcnZlZDsKLSAgICB9IHJwY19sb2NfaW9jdGxfZGF0YV91X3R5cGVfdTsKLX07Ci10eXBlZGVmIHN0cnVjdCBycGNfbG9jX2lvY3RsX2RhdGFfdV90eXBlIHJwY19sb2NfaW9jdGxfZGF0YV91X3R5cGU7Ci0KLXN0cnVjdCBycGNfbG9jX2lvY3RsX2NhbGxiYWNrX2RhdGFfdV90eXBlIHsKLSAgICBycGNfbG9jX2lvY3RsX2VfdHlwZSBkaXNjOwotICAgIHVuaW9uIHsKLSAgICAgICAgcnBjX2xvY19hcGlfdmVyc2lvbl9zX3R5cGUgYXBpX3ZlcnNpb247Ci0gICAgICAgIHJwY19sb2NfZml4X2NyaXRlcmlhX3NfdHlwZSBmaXhfY3JpdGVyaWE7Ci0gICAgICAgIHJwY19sb2NfbG9ja19lX3R5cGUgZW5naW5lX2xvY2s7Ci0gICAgICAgIHJwY19ib29sZWFuIHNiYXNfbW9kZTsKLSAgICAgICAgcnBjX2xvY19ubWVhX3NlbnRlbmNlX3R5cGUgbm1lYV90eXBlczsKLSAgICAgICAgcnBjX2Jvb2xlYW4gb25fZGVtYW5kX2xwbTsKLSAgICAgICAgcnBjX2xvY19zZXJ2ZXJfaW5mb19zX3R5cGUgc2VydmVyX2FkZHI7Ci0gICAgICAgIHJwY19sb2NfcHJlZGljdGVkX29yYml0c19kYXRhX3NvdXJjZV9zX3R5cGUgcHJlZGljdGVkX29yYml0c19kYXRhX3NvdXJjZTsKLSAgICAgICAgcnBjX2xvY19wcmVkaWN0ZWRfb3JiaXRzX2RhdGFfdmFsaWRpdHlfcmVwb3J0X3NfdHlwZSBwcmVkaWN0ZWRfb3JiaXRzX2RhdGFfdmFsaWRpdHk7Ci0gICAgICAgIHJwY191aW50OCB4dHJhX3Rfc2Vzc2lvbl9jb250cm9sOwotICAgICAgICBycGNfbG9jX2Fwbl9wcm9maWxlc190eXBlIGFwbl9wcm9maWxlc1s2XTsKLSAgICAgICAgcnBjX3VpbnQzMiBzdXBsX3ZlcnNpb247Ci0gICAgfSBycGNfbG9jX2lvY3RsX2NhbGxiYWNrX2RhdGFfdV90eXBlX3U7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgcnBjX2xvY19pb2N0bF9jYWxsYmFja19kYXRhX3VfdHlwZSBycGNfbG9jX2lvY3RsX2NhbGxiYWNrX2RhdGFfdV90eXBlOwotCi1zdHJ1Y3QgcnBjX2xvY19pb2N0bF9jYWxsYmFja19zX3R5cGUgewotICAgIHJwY19sb2NfaW9jdGxfZV90eXBlIHR5cGU7Ci0gICAgcnBjX2ludDMyIHN0YXR1czsKLSAgICBycGNfbG9jX2lvY3RsX2NhbGxiYWNrX2RhdGFfdV90eXBlIGRhdGE7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgcnBjX2xvY19pb2N0bF9jYWxsYmFja19zX3R5cGUgcnBjX2xvY19pb2N0bF9jYWxsYmFja19zX3R5cGU7Ci0KLXN0cnVjdCBycGNfbG9jX2V2ZW50X3BheWxvYWRfdV90eXBlIHsKLSAgICB1X3F1YWRfdCBkaXNjOwotICAgIHVuaW9uIHsKLSAgICAgICAgcnBjX2xvY19wYXJzZWRfcG9zaXRpb25fc190eXBlIHBhcnNlZF9sb2NhdGlvbl9yZXBvcnQ7Ci0gICAgICAgIHJwY19sb2NfZ25zc19pbmZvX3NfdHlwZSBnbnNzX3JlcG9ydDsKLSAgICAgICAgcnBjX2xvY19ubWVhX3JlcG9ydF9zX3R5cGUgbm1lYV9yZXBvcnQ7Ci0gICAgICAgIHJwY19sb2NfbmlfZXZlbnRfc190eXBlIG5pX3JlcXVlc3Q7Ci0gICAgICAgIHJwY19sb2NfYXNzaXN0X2RhdGFfcmVxdWVzdF9zX3R5cGUgYXNzaXN0X2RhdGFfcmVxdWVzdDsKLSAgICAgICAgcnBjX2xvY19zZXJ2ZXJfcmVxdWVzdF9zX3R5cGUgbG9jX3NlcnZlcl9yZXF1ZXN0OwotICAgICAgICBycGNfbG9jX2lvY3RsX2NhbGxiYWNrX3NfdHlwZSBpb2N0bF9yZXBvcnQ7Ci0gICAgICAgIHJwY19sb2Nfc3RhdHVzX2V2ZW50X3NfdHlwZSBzdGF0dXNfcmVwb3J0OwotICAgICAgICBycGNfbG9jX3F3aXBfcmVxdWVzdF9zX3R5cGUgcXdpcF9yZXF1ZXN0OwotICAgICAgICBycGNfbG9jX3Jlc2VydmVkX3BheWxvYWRfc190eXBlIHJlc2VydmVkOwotICAgIH0gcnBjX2xvY19ldmVudF9wYXlsb2FkX3VfdHlwZV91OwotfTsKLXR5cGVkZWYgc3RydWN0IHJwY19sb2NfZXZlbnRfcGF5bG9hZF91X3R5cGUgcnBjX2xvY19ldmVudF9wYXlsb2FkX3VfdHlwZTsKLQotLyogdGhlIHhkciBmdW5jdGlvbnMgKi8KLQotI2lmIGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoX19jcGx1c3BsdXMpCi1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19jbGllbnRfaGFuZGxlX3R5cGUgKFhEUiAqLCBycGNfbG9jX2NsaWVudF9oYW5kbGVfdHlwZSopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2NfZXZlbnRfbWFza190eXBlIChYRFIgKiwgcnBjX2xvY19ldmVudF9tYXNrX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX3Bvc2l0aW9uX3ZhbGlkX21hc2tfdHlwZSAoWERSICosIHJwY19sb2NfcG9zaXRpb25fdmFsaWRfbWFza190eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19wb3NfdGVjaG5vbG9neV9tYXNrX3R5cGUgKFhEUiAqLCBycGNfbG9jX3Bvc190ZWNobm9sb2d5X21hc2tfdHlwZSopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2Nfc2Vzc2lvbl9zdGF0dXNfZV90eXBlIChYRFIgKiwgcnBjX2xvY19zZXNzaW9uX3N0YXR1c19lX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX2NhbGVuZGFyX3RpbWVfc190eXBlIChYRFIgKiwgcnBjX2xvY19jYWxlbmRhcl90aW1lX3NfdHlwZSopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2NfcGFyc2VkX3Bvc2l0aW9uX3NfdHlwZSAoWERSICosIHJwY19sb2NfcGFyc2VkX3Bvc2l0aW9uX3NfdHlwZSopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2Nfc3Zfc3lzdGVtX2VfdHlwZSAoWERSICosIHJwY19sb2Nfc3Zfc3lzdGVtX2VfdHlwZSopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2Nfc3Zfc3RhdHVzX2VfdHlwZSAoWERSICosIHJwY19sb2Nfc3Zfc3RhdHVzX2VfdHlwZSopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2Nfc3ZfaW5mb192YWxpZF9tYXNrX3R5cGUgKFhEUiAqLCBycGNfbG9jX3N2X2luZm9fdmFsaWRfbWFza190eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19zdl9pbmZvX3NfdHlwZSAoWERSICosIHJwY19sb2Nfc3ZfaW5mb19zX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX2duc3NfaW5mb192YWxpZF9tYXNrX3R5cGUgKFhEUiAqLCBycGNfbG9jX2duc3NfaW5mb192YWxpZF9tYXNrX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX2duc3NfaW5mb19zX3R5cGUgKFhEUiAqLCBycGNfbG9jX2duc3NfaW5mb19zX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX25tZWFfcmVwb3J0X3NfdHlwZSAoWERSICosIHJwY19sb2Nfbm1lYV9yZXBvcnRfc190eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19zdGF0dXNfZXZlbnRfZV90eXBlIChYRFIgKiwgcnBjX2xvY19zdGF0dXNfZXZlbnRfZV90eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19lbmdpbmVfc3RhdGVfZV90eXBlIChYRFIgKiwgcnBjX2xvY19lbmdpbmVfc3RhdGVfZV90eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19maXhfc2Vzc2lvbl9zdGF0ZV9lX3R5cGUgKFhEUiAqLCBycGNfbG9jX2ZpeF9zZXNzaW9uX3N0YXRlX2VfdHlwZSopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2Nfc3RhdHVzX2V2ZW50X3BheWxvYWRfdV90eXBlIChYRFIgKiwgcnBjX2xvY19zdGF0dXNfZXZlbnRfcGF5bG9hZF91X3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX3N0YXR1c19ldmVudF9zX3R5cGUgKFhEUiAqLCBycGNfbG9jX3N0YXR1c19ldmVudF9zX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX3NlcnZlcl9hZGRyX2VfdHlwZSAoWERSICosIHJwY19sb2Nfc2VydmVyX2FkZHJfZV90eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19zZXJ2ZXJfYWRkcl9pcHY0X3R5cGUgKFhEUiAqLCBycGNfbG9jX3NlcnZlcl9hZGRyX2lwdjRfdHlwZSopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2Nfc2VydmVyX2FkZHJfdXJsX3R5cGUgKFhEUiAqLCBycGNfbG9jX3NlcnZlcl9hZGRyX3VybF90eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19zZXJ2ZXJfYWRkcl9pcHY2X3R5cGUgKFhEUiAqLCBycGNfbG9jX3NlcnZlcl9hZGRyX2lwdjZfdHlwZSopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2Nfc2VydmVyX2FkZHJfdV90eXBlIChYRFIgKiwgcnBjX2xvY19zZXJ2ZXJfYWRkcl91X3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX3NlcnZlcl9pbmZvX3NfdHlwZSAoWERSICosIHJwY19sb2Nfc2VydmVyX2luZm9fc190eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19uaV9ub3RpZnlfdmVyaWZ5X2VfdHlwZSAoWERSICosIHJwY19sb2Nfbmlfbm90aWZ5X3ZlcmlmeV9lX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX25pX2V2ZW50X2VfdHlwZSAoWERSICosIHJwY19sb2NfbmlfZXZlbnRfZV90eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19uaV9kYXRhY29kaW5nX3NjaGVtZV9lX3R5cGUgKFhEUiAqLCBycGNfbG9jX25pX2RhdGFjb2Rpbmdfc2NoZW1lX2VfdHlwZSopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2NfbmlfdnhfcmVxdWVzdGVyX2lkX2VuY29kaW5nX3NjaGVtZV9lX3R5cGUgKFhEUiAqLCBycGNfbG9jX25pX3Z4X3JlcXVlc3Rlcl9pZF9lbmNvZGluZ19zY2hlbWVfZV90eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19uaV92eF9wb3NfbW9kZV9lX3R5cGUgKFhEUiAqLCBycGNfbG9jX25pX3Z4X3Bvc19tb2RlX2VfdHlwZSopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2NfbmlfdnhfcmVxdWVzdGVyX2lkX3NfdHlwZSAoWERSICosIHJwY19sb2NfbmlfdnhfcmVxdWVzdGVyX2lkX3NfdHlwZSopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2Nfbmlfdnhfbm90aWZ5X3ZlcmlmeV9yZXFfc190eXBlIChYRFIgKiwgcnBjX2xvY19uaV92eF9ub3RpZnlfdmVyaWZ5X3JlcV9zX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX25pX3N1cGxfcG9zX21ldGhvZF9lX3R5cGUgKFhEUiAqLCBycGNfbG9jX25pX3N1cGxfcG9zX21ldGhvZF9lX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX25pX3N1cGxfc2xwX3Nlc3Npb25faWRfc190eXBlIChYRFIgKiwgcnBjX2xvY19uaV9zdXBsX3NscF9zZXNzaW9uX2lkX3NfdHlwZSopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2NfbmlfcmVxdWVzdG9yX2lkX3NfdHlwZSAoWERSICosIHJwY19sb2NfbmlfcmVxdWVzdG9yX2lkX3NfdHlwZSopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2Nfbmlfc3VwbF9jbGllbnRfbmFtZV9zX3R5cGUgKFhEUiAqLCBycGNfbG9jX25pX3N1cGxfY2xpZW50X25hbWVfc190eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19uaV9zdXBsX3FvcF9zX3R5cGUgKFhEUiAqLCBycGNfbG9jX25pX3N1cGxfcW9wX3NfdHlwZSopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2Nfbmlfc3VwbF9ub3RpZnlfdmVyaWZ5X3JlcV9zX3R5cGUgKFhEUiAqLCBycGNfbG9jX25pX3N1cGxfbm90aWZ5X3ZlcmlmeV9yZXFfc190eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19uaV9leHRfY2xpZW50X2FkZHJlc3Nfc190eXBlIChYRFIgKiwgcnBjX2xvY19uaV9leHRfY2xpZW50X2FkZHJlc3Nfc190eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19uaV9sb2NhdGlvbl90eXBlX2VfdHlwZSAoWERSICosIHJwY19sb2NfbmlfbG9jYXRpb25fdHlwZV9lX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX25pX2RlZmVycmVkX2xvY2F0aW9uX3NfdHlwZSAoWERSICosIHJwY19sb2NfbmlfZGVmZXJyZWRfbG9jYXRpb25fc190eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19uaV9jb2Rld29yZF9zdHJpbmdfc190eXBlIChYRFIgKiwgcnBjX2xvY19uaV9jb2Rld29yZF9zdHJpbmdfc190eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19uaV9zZXJ2aWNlX3R5cGVfaWRfc190eXBlIChYRFIgKiwgcnBjX2xvY19uaV9zZXJ2aWNlX3R5cGVfaWRfc190eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19uaV91bXRzX2NwX25vdGlmeV92ZXJpZnlfcmVxX3NfdHlwZSAoWERSICosIHJwY19sb2NfbmlfdW10c19jcF9ub3RpZnlfdmVyaWZ5X3JlcV9zX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX25pX3NlcnZpY2VfaW50ZXJhY3Rpb25fZV90eXBlIChYRFIgKiwgcnBjX2xvY19uaV9zZXJ2aWNlX2ludGVyYWN0aW9uX2VfdHlwZSopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2Nfbmlfdnhfc2VydmljZV9pbnRlcmFjdGlvbl9yZXFfc190eXBlIChYRFIgKiwgcnBjX2xvY19uaV92eF9zZXJ2aWNlX2ludGVyYWN0aW9uX3JlcV9zX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX25pX2V2ZW50X3BheWxvYWRfdV90eXBlIChYRFIgKiwgcnBjX2xvY19uaV9ldmVudF9wYXlsb2FkX3VfdHlwZSopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2NfbmlfZXZlbnRfc190eXBlIChYRFIgKiwgcnBjX2xvY19uaV9ldmVudF9zX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX2Fzc2lzdF9kYXRhX3JlcXVlc3RfZV90eXBlIChYRFIgKiwgcnBjX2xvY19hc3Npc3RfZGF0YV9yZXF1ZXN0X2VfdHlwZSopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19zdHJ1Y3RfbG9jX3RpbWVfZG93bmxvYWRfc291cmNlX3NfdHlwZV9zZXJ2ZXJzX3B0ciAoWERSICosIHJwY19zdHJ1Y3RfbG9jX3RpbWVfZG93bmxvYWRfc291cmNlX3NfdHlwZV9zZXJ2ZXJzX3B0ciopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19zdHJ1Y3RfbG9jX3RpbWVfZG93bmxvYWRfc291cmNlX3NfdHlwZV9zZXJ2ZXJzIChYRFIgKiwgcnBjX3N0cnVjdF9sb2NfdGltZV9kb3dubG9hZF9zb3VyY2Vfc190eXBlX3NlcnZlcnMpOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2NfdGltZV9kb3dubG9hZF9zb3VyY2Vfc190eXBlIChYRFIgKiwgcnBjX2xvY190aW1lX2Rvd25sb2FkX3NvdXJjZV9zX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfc3RydWN0X2xvY19wcmVkaWN0ZWRfb3JiaXRzX2RhdGFfc291cmNlX3NfdHlwZV9zZXJ2ZXJzX3B0ciAoWERSICosIHJwY19zdHJ1Y3RfbG9jX3ByZWRpY3RlZF9vcmJpdHNfZGF0YV9zb3VyY2Vfc190eXBlX3NlcnZlcnNfcHRyKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX3N0cnVjdF9sb2NfcHJlZGljdGVkX29yYml0c19kYXRhX3NvdXJjZV9zX3R5cGVfc2VydmVycyAoWERSICosIHJwY19zdHJ1Y3RfbG9jX3ByZWRpY3RlZF9vcmJpdHNfZGF0YV9zb3VyY2Vfc190eXBlX3NlcnZlcnMpOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2NfcHJlZGljdGVkX29yYml0c19kYXRhX3NvdXJjZV9zX3R5cGUgKFhEUiAqLCBycGNfbG9jX3ByZWRpY3RlZF9vcmJpdHNfZGF0YV9zb3VyY2Vfc190eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19wb3NfaW5qX3JlcXVlc3Rfc190eXBlIChYRFIgKiwgcnBjX2xvY19wb3NfaW5qX3JlcXVlc3Rfc190eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19hc3Npc3RfZGF0YV9yZXF1ZXN0X3BheWxvYWRfdV90eXBlIChYRFIgKiwgcnBjX2xvY19hc3Npc3RfZGF0YV9yZXF1ZXN0X3BheWxvYWRfdV90eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19hc3Npc3RfZGF0YV9yZXF1ZXN0X3NfdHlwZSAoWERSICosIHJwY19sb2NfYXNzaXN0X2RhdGFfcmVxdWVzdF9zX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX3NlcnZlcl9jb25uZWN0aW9uX2hhbmRsZSAoWERSICosIHJwY19sb2Nfc2VydmVyX2Nvbm5lY3Rpb25faGFuZGxlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19zZXJ2ZXJfcHJvdG9jb2xfZV90eXBlIChYRFIgKiwgcnBjX2xvY19zZXJ2ZXJfcHJvdG9jb2xfZV90eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19zZXJ2ZXJfY29ubmVjdGlvbl9lX3R5cGUgKFhEUiAqLCBycGNfbG9jX3NlcnZlcl9jb25uZWN0aW9uX2VfdHlwZSopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2Nfc2VydmVyX3JlcXVlc3RfZV90eXBlIChYRFIgKiwgcnBjX2xvY19zZXJ2ZXJfcmVxdWVzdF9lX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX3NlcnZlcl9vcGVuX3JlcV9zX3R5cGUgKFhEUiAqLCBycGNfbG9jX3NlcnZlcl9vcGVuX3JlcV9zX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX3NlcnZlcl9tdWx0aV9vcGVuX3JlcV9zX3R5cGUgKFhEUiAqLCBycGNfbG9jX3NlcnZlcl9tdWx0aV9vcGVuX3JlcV9zX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX3NlcnZlcl9jbG9zZV9yZXFfc190eXBlIChYRFIgKiwgcnBjX2xvY19zZXJ2ZXJfY2xvc2VfcmVxX3NfdHlwZSopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2Nfc2VydmVyX3JlcXVlc3RfdV90eXBlIChYRFIgKiwgcnBjX2xvY19zZXJ2ZXJfcmVxdWVzdF91X3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX3NlcnZlcl9yZXF1ZXN0X3NfdHlwZSAoWERSICosIHJwY19sb2Nfc2VydmVyX3JlcXVlc3Rfc190eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19xd2lwX3JlcXVlc3RfZV90eXBlIChYRFIgKiwgcnBjX2xvY19xd2lwX3JlcXVlc3RfZV90eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19xd2lwX3JlcXVlc3Rfc190eXBlIChYRFIgKiwgcnBjX2xvY19xd2lwX3JlcXVlc3Rfc190eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19yZXNlcnZlZF9wYXlsb2FkX3NfdHlwZSAoWERSICosIHJwY19sb2NfcmVzZXJ2ZWRfcGF5bG9hZF9zX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX2lvY3RsX2VfdHlwZSAoWERSICosIHJwY19sb2NfaW9jdGxfZV90eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19hcGlfdmVyc2lvbl9zX3R5cGUgKFhEUiAqLCBycGNfbG9jX2FwaV92ZXJzaW9uX3NfdHlwZSopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2NfZml4X3JlY3VycmVuY2VfZV90eXBlIChYRFIgKiwgcnBjX2xvY19maXhfcmVjdXJyZW5jZV9lX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX29wZXJhdGlvbl9tb2RlX2VfdHlwZSAoWERSICosIHJwY19sb2Nfb3BlcmF0aW9uX21vZGVfZV90eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19ub3RpZnlfZV90eXBlIChYRFIgKiwgcnBjX2xvY19ub3RpZnlfZV90eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19maXhfY3JpdGVyaWFfc190eXBlIChYRFIgKiwgcnBjX2xvY19maXhfY3JpdGVyaWFfc190eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19uaV91c2VyX3Jlc3BfZV90eXBlIChYRFIgKiwgcnBjX2xvY19uaV91c2VyX3Jlc3BfZV90eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY191c2VyX3ZlcmlmeV9zX3R5cGUgKFhEUiAqLCBycGNfbG9jX3VzZXJfdmVyaWZ5X3NfdHlwZSopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2NfcHJlZGljdGVkX29yYml0c19kYXRhX2Zvcm1hdF9lX3R5cGUgKFhEUiAqLCBycGNfbG9jX3ByZWRpY3RlZF9vcmJpdHNfZGF0YV9mb3JtYXRfZV90eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19wcmVkaWN0ZWRfb3JiaXRzX2RhdGFfc190eXBlIChYRFIgKiwgcnBjX2xvY19wcmVkaWN0ZWRfb3JiaXRzX2RhdGFfc190eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19wcmVkaWN0ZWRfb3JiaXRzX2RhdGFfdmFsaWRpdHlfcmVwb3J0X3NfdHlwZSAoWERSICosIHJwY19sb2NfcHJlZGljdGVkX29yYml0c19kYXRhX3ZhbGlkaXR5X3JlcG9ydF9zX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX3ByZWRpY3RlZF9vcmJpdHNfYXV0b19kb3dubG9hZF9jb25maWdfc190eXBlIChYRFIgKiwgcnBjX2xvY19wcmVkaWN0ZWRfb3JiaXRzX2F1dG9fZG93bmxvYWRfY29uZmlnX3NfdHlwZSopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2NfYXNzaXN0X2RhdGFfdGltZV9zX3R5cGUgKFhEUiAqLCBycGNfbG9jX2Fzc2lzdF9kYXRhX3RpbWVfc190eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19hc3Npc3RfcG9zX3ZhbGlkX21hc2tfdHlwZSAoWERSICosIHJwY19sb2NfYXNzaXN0X3Bvc192YWxpZF9tYXNrX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX2Fzc2lzdF9kYXRhX3Bvc19zX3R5cGUgKFhEUiAqLCBycGNfbG9jX2Fzc2lzdF9kYXRhX3Bvc19zX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX3NlcnZlcl9vcGVuX3N0YXR1c19lX3R5cGUgKFhEUiAqLCBycGNfbG9jX3NlcnZlcl9vcGVuX3N0YXR1c19lX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX3NlcnZlcl9wZHBfdHlwZV9lX3R5cGUgKFhEUiAqLCBycGNfbG9jX3NlcnZlcl9wZHBfdHlwZV9lX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX3NlcnZlcl9vcGVuX3N0YXR1c19zX3R5cGUgKFhEUiAqLCBycGNfbG9jX3NlcnZlcl9vcGVuX3N0YXR1c19zX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX3NlcnZlcl9tdWx0aV9vcGVuX3N0YXR1c19zX3R5cGUgKFhEUiAqLCBycGNfbG9jX3NlcnZlcl9tdWx0aV9vcGVuX3N0YXR1c19zX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX3NlcnZlcl9jbG9zZV9zdGF0dXNfZV90eXBlIChYRFIgKiwgcnBjX2xvY19zZXJ2ZXJfY2xvc2Vfc3RhdHVzX2VfdHlwZSopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2Nfc2VydmVyX2Nsb3NlX3N0YXR1c19zX3R5cGUgKFhEUiAqLCBycGNfbG9jX3NlcnZlcl9jbG9zZV9zdGF0dXNfc190eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY193aXBlcl9maXhfdGltZV9zX3R5cGUgKFhEUiAqLCBycGNfbG9jX3dpcGVyX2ZpeF90aW1lX3NfdHlwZSopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2Nfd2lwZXJfZml4X3Bvc19zX3R5cGUgKFhEUiAqLCBycGNfbG9jX3dpcGVyX2ZpeF9wb3Nfc190eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY193aXBlcl9hcF9pbmZvX3NfdHlwZSAoWERSICosIHJwY19sb2Nfd2lwZXJfYXBfaW5mb19zX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX3dpcGVyX2FwX3NldF9zX3R5cGUgKFhEUiAqLCBycGNfbG9jX3dpcGVyX2FwX3NldF9zX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX3dpcGVyX3Bvc2l0aW9uX3JlcG9ydF9zX3R5cGUgKFhEUiAqLCBycGNfbG9jX3dpcGVyX3Bvc2l0aW9uX3JlcG9ydF9zX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX3dpcGVyX3N0YXR1c19lX3R5cGUgKFhEUiAqLCBycGNfbG9jX3dpcGVyX3N0YXR1c19lX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX2ZzX29wZXJhdGlvbl9lX3R5cGUgKFhEUiAqLCBycGNfbG9jX2ZzX29wZXJhdGlvbl9lX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX2Vmc19kYXRhX3NfdHlwZSAoWERSICosIHJwY19sb2NfZWZzX2RhdGFfc190eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19lcnJvcl9lc3RpbWF0ZV9jb25maWdfZV90eXBlIChYRFIgKiwgcnBjX2xvY19lcnJvcl9lc3RpbWF0ZV9jb25maWdfZV90eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19hcG5fcHJvZmlsZXNfdHlwZSAoWERSICosIHJwY19sb2NfYXBuX3Byb2ZpbGVzX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX2xvY2tfZV90eXBlIChYRFIgKiwgcnBjX2xvY19sb2NrX2VfdHlwZSopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2Nfbm1lYV9zZW50ZW5jZV90eXBlIChYRFIgKiwgcnBjX2xvY19ubWVhX3NlbnRlbmNlX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX2Fzc2lzdF9kYXRhX3R5cGUgKFhEUiAqLCBycGNfbG9jX2Fzc2lzdF9kYXRhX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX2Fzc2lzdF9kYXRhX2RlbGV0ZV9zX3R5cGUgKFhEUiAqLCBycGNfbG9jX2Fzc2lzdF9kYXRhX2RlbGV0ZV9zX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX2lvY3RsX2RhdGFfdV90eXBlIChYRFIgKiwgcnBjX2xvY19pb2N0bF9kYXRhX3VfdHlwZSopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2NfaW9jdGxfY2FsbGJhY2tfZGF0YV91X3R5cGUgKFhEUiAqLCBycGNfbG9jX2lvY3RsX2NhbGxiYWNrX2RhdGFfdV90eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19pb2N0bF9jYWxsYmFja19zX3R5cGUgKFhEUiAqLCBycGNfbG9jX2lvY3RsX2NhbGxiYWNrX3NfdHlwZSopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2NfZXZlbnRfcGF5bG9hZF91X3R5cGUgKFhEUiAqLCBycGNfbG9jX2V2ZW50X3BheWxvYWRfdV90eXBlKik7Ci0KLSNlbHNlIC8qIEsmUiBDICovCi1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX2NsaWVudF9oYW5kbGVfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2NfZXZlbnRfbWFza190eXBlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19wb3NpdGlvbl92YWxpZF9tYXNrX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX3Bvc190ZWNobm9sb2d5X21hc2tfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2Nfc2Vzc2lvbl9zdGF0dXNfZV90eXBlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19jYWxlbmRhcl90aW1lX3NfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2NfcGFyc2VkX3Bvc2l0aW9uX3NfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2Nfc3Zfc3lzdGVtX2VfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2Nfc3Zfc3RhdHVzX2VfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2Nfc3ZfaW5mb192YWxpZF9tYXNrX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX3N2X2luZm9fc190eXBlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19nbnNzX2luZm9fdmFsaWRfbWFza190eXBlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19nbnNzX2luZm9fc190eXBlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19ubWVhX3JlcG9ydF9zX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX3N0YXR1c19ldmVudF9lX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX2VuZ2luZV9zdGF0ZV9lX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX2ZpeF9zZXNzaW9uX3N0YXRlX2VfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2Nfc3RhdHVzX2V2ZW50X3BheWxvYWRfdV90eXBlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19zdGF0dXNfZXZlbnRfc190eXBlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19zZXJ2ZXJfYWRkcl9lX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX3NlcnZlcl9hZGRyX2lwdjRfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2Nfc2VydmVyX2FkZHJfdXJsX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX3NlcnZlcl9hZGRyX2lwdjZfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2Nfc2VydmVyX2FkZHJfdV90eXBlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19zZXJ2ZXJfaW5mb19zX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX25pX25vdGlmeV92ZXJpZnlfZV90eXBlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19uaV9ldmVudF9lX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX25pX2RhdGFjb2Rpbmdfc2NoZW1lX2VfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2NfbmlfdnhfcmVxdWVzdGVyX2lkX2VuY29kaW5nX3NjaGVtZV9lX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX25pX3Z4X3Bvc19tb2RlX2VfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2NfbmlfdnhfcmVxdWVzdGVyX2lkX3NfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2Nfbmlfdnhfbm90aWZ5X3ZlcmlmeV9yZXFfc190eXBlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19uaV9zdXBsX3Bvc19tZXRob2RfZV90eXBlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19uaV9zdXBsX3NscF9zZXNzaW9uX2lkX3NfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2NfbmlfcmVxdWVzdG9yX2lkX3NfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2Nfbmlfc3VwbF9jbGllbnRfbmFtZV9zX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX25pX3N1cGxfcW9wX3NfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2Nfbmlfc3VwbF9ub3RpZnlfdmVyaWZ5X3JlcV9zX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX25pX2V4dF9jbGllbnRfYWRkcmVzc19zX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX25pX2xvY2F0aW9uX3R5cGVfZV90eXBlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19uaV9kZWZlcnJlZF9sb2NhdGlvbl9zX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX25pX2NvZGV3b3JkX3N0cmluZ19zX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX25pX3NlcnZpY2VfdHlwZV9pZF9zX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX25pX3VtdHNfY3Bfbm90aWZ5X3ZlcmlmeV9yZXFfc190eXBlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19uaV9zZXJ2aWNlX2ludGVyYWN0aW9uX2VfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2Nfbmlfdnhfc2VydmljZV9pbnRlcmFjdGlvbl9yZXFfc190eXBlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19uaV9ldmVudF9wYXlsb2FkX3VfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2NfbmlfZXZlbnRfc190eXBlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19hc3Npc3RfZGF0YV9yZXF1ZXN0X2VfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19zdHJ1Y3RfbG9jX3RpbWVfZG93bmxvYWRfc291cmNlX3NfdHlwZV9zZXJ2ZXJzX3B0ciAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19zdHJ1Y3RfbG9jX3RpbWVfZG93bmxvYWRfc291cmNlX3NfdHlwZV9zZXJ2ZXJzICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY190aW1lX2Rvd25sb2FkX3NvdXJjZV9zX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfc3RydWN0X2xvY19wcmVkaWN0ZWRfb3JiaXRzX2RhdGFfc291cmNlX3NfdHlwZV9zZXJ2ZXJzX3B0ciAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19zdHJ1Y3RfbG9jX3ByZWRpY3RlZF9vcmJpdHNfZGF0YV9zb3VyY2Vfc190eXBlX3NlcnZlcnMgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX3ByZWRpY3RlZF9vcmJpdHNfZGF0YV9zb3VyY2Vfc190eXBlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19wb3NfaW5qX3JlcXVlc3Rfc190eXBlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19hc3Npc3RfZGF0YV9yZXF1ZXN0X3BheWxvYWRfdV90eXBlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19hc3Npc3RfZGF0YV9yZXF1ZXN0X3NfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2Nfc2VydmVyX2Nvbm5lY3Rpb25faGFuZGxlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19zZXJ2ZXJfcHJvdG9jb2xfZV90eXBlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19zZXJ2ZXJfY29ubmVjdGlvbl9lX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX3NlcnZlcl9yZXF1ZXN0X2VfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2Nfc2VydmVyX29wZW5fcmVxX3NfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2Nfc2VydmVyX211bHRpX29wZW5fcmVxX3NfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2Nfc2VydmVyX2Nsb3NlX3JlcV9zX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX3NlcnZlcl9yZXF1ZXN0X3VfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2Nfc2VydmVyX3JlcXVlc3Rfc190eXBlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19xd2lwX3JlcXVlc3RfZV90eXBlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19xd2lwX3JlcXVlc3Rfc190eXBlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19yZXNlcnZlZF9wYXlsb2FkX3NfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2NfaW9jdGxfZV90eXBlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19hcGlfdmVyc2lvbl9zX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX2ZpeF9yZWN1cnJlbmNlX2VfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2Nfb3BlcmF0aW9uX21vZGVfZV90eXBlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19ub3RpZnlfZV90eXBlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19maXhfY3JpdGVyaWFfc190eXBlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19uaV91c2VyX3Jlc3BfZV90eXBlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY191c2VyX3ZlcmlmeV9zX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX3ByZWRpY3RlZF9vcmJpdHNfZGF0YV9mb3JtYXRfZV90eXBlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19wcmVkaWN0ZWRfb3JiaXRzX2RhdGFfc190eXBlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19wcmVkaWN0ZWRfb3JiaXRzX2RhdGFfdmFsaWRpdHlfcmVwb3J0X3NfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2NfcHJlZGljdGVkX29yYml0c19hdXRvX2Rvd25sb2FkX2NvbmZpZ19zX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX2Fzc2lzdF9kYXRhX3RpbWVfc190eXBlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19hc3Npc3RfcG9zX3ZhbGlkX21hc2tfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2NfYXNzaXN0X2RhdGFfcG9zX3NfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2Nfc2VydmVyX29wZW5fc3RhdHVzX2VfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2Nfc2VydmVyX3BkcF90eXBlX2VfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2Nfc2VydmVyX29wZW5fc3RhdHVzX3NfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2Nfc2VydmVyX211bHRpX29wZW5fc3RhdHVzX3NfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2Nfc2VydmVyX2Nsb3NlX3N0YXR1c19lX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX3NlcnZlcl9jbG9zZV9zdGF0dXNfc190eXBlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY193aXBlcl9maXhfdGltZV9zX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX3dpcGVyX2ZpeF9wb3Nfc190eXBlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY193aXBlcl9hcF9pbmZvX3NfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2Nfd2lwZXJfYXBfc2V0X3NfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2Nfd2lwZXJfcG9zaXRpb25fcmVwb3J0X3NfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2Nfd2lwZXJfc3RhdHVzX2VfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2NfZnNfb3BlcmF0aW9uX2VfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2NfZWZzX2RhdGFfc190eXBlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19lcnJvcl9lc3RpbWF0ZV9jb25maWdfZV90eXBlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19hcG5fcHJvZmlsZXNfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2NfbG9ja19lX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX25tZWFfc2VudGVuY2VfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2NfYXNzaXN0X2RhdGFfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2NfYXNzaXN0X2RhdGFfZGVsZXRlX3NfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2NfaW9jdGxfZGF0YV91X3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX2lvY3RsX2NhbGxiYWNrX2RhdGFfdV90eXBlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19pb2N0bF9jYWxsYmFja19zX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX2V2ZW50X3BheWxvYWRfdV90eXBlICgpOwotCi0jZW5kaWYgLyogSyZSIEMgKi8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmIC8qICFfTE9DX0FQSV9DT01NT05fUlBDX0hfUlBDR0VOICovCmRpZmYgLS1naXQgYS9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaS1ycGMtNTAwMDEvbGlibG9jX2FwaS1ycGMtc3R1Yi9pbmMvbG9jX2FwaV9ycGNnZW5fcnBjLmggYi9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaS1ycGMtNTAwMDEvbGlibG9jX2FwaS1ycGMtc3R1Yi9pbmMvbG9jX2FwaV9ycGNnZW5fcnBjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxMzg0MzIuLjAwMDAwMDAKLS0tIGEvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGktcnBjLTUwMDAxL2xpYmxvY19hcGktcnBjLXN0dWIvaW5jL2xvY19hcGlfcnBjZ2VuX3JwYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjg4ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMSwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKLSAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAotICogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAotICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgotICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCi0gKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQotICogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgotICogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0vKgotICogUGxlYXNlIGRvIG5vdCBlZGl0IHRoaXMgZmlsZS4KLSAqIEl0IHdhcyBnZW5lcmF0ZWQgdXNpbmcgcnBjZ2VuLgotICovCi0KLSNpZm5kZWYgX0xPQ19BUElfUlBDX0hfUlBDR0VOCi0jZGVmaW5lIF9MT0NfQVBJX1JQQ19IX1JQQ0dFTgotCi0jaW5jbHVkZSAibGlicnBjLmgiCi0jaW5jbHVkZSAiY29tbW9uZGVmc19ycGNnZW5fcnBjLmgiCi0jaW5jbHVkZSAibG9jX2FwaV9ycGNnZW5fY29tbW9uX3JwYy5oIgotCi0jaW5jbHVkZSA8cHRocmVhZC5oPgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHVfaW50IHJwY19sb2NfYXBpX2FwaV92ZXJzaW9uc19yZXR1cm5fdHlwZV9sZW47Ci0gICAgcnBjX3VpbnQzMiAqcnBjX2xvY19hcGlfYXBpX3ZlcnNpb25zX3JldHVybl90eXBlX3ZhbDsKLX0gcnBjX2xvY19hcGlfYXBpX3ZlcnNpb25zX3JldHVybl90eXBlOwotCi10eXBlZGVmIHJwY191aW50MzIgcnBjX2xvY19ldmVudF9jYl9mX3R5cGU7Ci0KLXN0cnVjdCBycGNfbG9jX29wZW5fYXJncyB7Ci0gICAgcnBjX2xvY19ldmVudF9tYXNrX3R5cGUgZXZlbnRfcmVnX21hc2s7Ci0gICAgcnBjX2xvY19ldmVudF9jYl9mX3R5cGUgZXZlbnRfY2FsbGJhY2s7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgcnBjX2xvY19vcGVuX2FyZ3MgcnBjX2xvY19vcGVuX2FyZ3M7Ci0KLXN0cnVjdCBycGNfbG9jX2Nsb3NlX2FyZ3MgewotICAgIHJwY19sb2NfY2xpZW50X2hhbmRsZV90eXBlIGhhbmRsZTsKLX07Ci10eXBlZGVmIHN0cnVjdCBycGNfbG9jX2Nsb3NlX2FyZ3MgcnBjX2xvY19jbG9zZV9hcmdzOwotCi1zdHJ1Y3QgcnBjX2xvY19zdGFydF9maXhfYXJncyB7Ci0gICAgcnBjX2xvY19jbGllbnRfaGFuZGxlX3R5cGUgaGFuZGxlOwotfTsKLXR5cGVkZWYgc3RydWN0IHJwY19sb2Nfc3RhcnRfZml4X2FyZ3MgcnBjX2xvY19zdGFydF9maXhfYXJnczsKLQotc3RydWN0IHJwY19sb2Nfc3RvcF9maXhfYXJncyB7Ci0gICAgcnBjX2xvY19jbGllbnRfaGFuZGxlX3R5cGUgaGFuZGxlOwotfTsKLXR5cGVkZWYgc3RydWN0IHJwY19sb2Nfc3RvcF9maXhfYXJncyBycGNfbG9jX3N0b3BfZml4X2FyZ3M7Ci0KLXN0cnVjdCBycGNfbG9jX2lvY3RsX2FyZ3MgewotICAgIHJwY19sb2NfY2xpZW50X2hhbmRsZV90eXBlIGhhbmRsZTsKLSAgICBycGNfbG9jX2lvY3RsX2VfdHlwZSBpb2N0bF90eXBlOwotICAgIHJwY19sb2NfaW9jdGxfZGF0YV91X3R5cGUgKmlvY3RsX2RhdGE7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgcnBjX2xvY19pb2N0bF9hcmdzIHJwY19sb2NfaW9jdGxfYXJnczsKLQotc3RydWN0IHJwY19sb2NfYXBpX2FwaV92ZXJzaW9uX3NfYXJncyB7Ci0gICAgcnBjX2Jvb2xlYW4gbGVuX25vdF9udWxsOwotfTsKLXR5cGVkZWYgc3RydWN0IHJwY19sb2NfYXBpX2FwaV92ZXJzaW9uX3NfYXJncyBycGNfbG9jX2FwaV9hcGlfdmVyc2lvbl9zX2FyZ3M7Ci0KLXN0cnVjdCBycGNfbG9jX2FwaV9ycGNfZ2x1ZV9jb2RlX2luZm9fcmVtb3RlX3JldHMgewotICAgIHJwY191aW50MzIgdG9vbHZlcnM7Ci0gICAgcnBjX3VpbnQzMiBmZWF0dXJlczsKLSAgICBycGNfdWludDMyIHByb2doYXNoOwotICAgIHJwY191aW50MzIgY2Jwcm9naGFzaDsKLX07Ci10eXBlZGVmIHN0cnVjdCBycGNfbG9jX2FwaV9ycGNfZ2x1ZV9jb2RlX2luZm9fcmVtb3RlX3JldHMgcnBjX2xvY19hcGlfcnBjX2dsdWVfY29kZV9pbmZvX3JlbW90ZV9yZXRzOwotCi1zdHJ1Y3QgcnBjX2xvY19vcGVuX3JldHMgewotICAgIHJwY19sb2NfY2xpZW50X2hhbmRsZV90eXBlIGxvY19vcGVuX3Jlc3VsdDsKLX07Ci10eXBlZGVmIHN0cnVjdCBycGNfbG9jX29wZW5fcmV0cyBycGNfbG9jX29wZW5fcmV0czsKLQotc3RydWN0IHJwY19sb2NfY2xvc2VfcmV0cyB7Ci0gICAgcnBjX2ludDMyIGxvY19jbG9zZV9yZXN1bHQ7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgcnBjX2xvY19jbG9zZV9yZXRzIHJwY19sb2NfY2xvc2VfcmV0czsKLQotc3RydWN0IHJwY19sb2Nfc3RhcnRfZml4X3JldHMgewotICAgIHJwY19pbnQzMiBsb2Nfc3RhcnRfZml4X3Jlc3VsdDsKLX07Ci10eXBlZGVmIHN0cnVjdCBycGNfbG9jX3N0YXJ0X2ZpeF9yZXRzIHJwY19sb2Nfc3RhcnRfZml4X3JldHM7Ci0KLXN0cnVjdCBycGNfbG9jX3N0b3BfZml4X3JldHMgewotICAgIHJwY19pbnQzMiBsb2Nfc3RvcF9maXhfcmVzdWx0OwotfTsKLXR5cGVkZWYgc3RydWN0IHJwY19sb2Nfc3RvcF9maXhfcmV0cyBycGNfbG9jX3N0b3BfZml4X3JldHM7Ci0KLXN0cnVjdCBycGNfbG9jX2lvY3RsX3JldHMgewotICAgIHJwY19pbnQzMiBsb2NfaW9jdGxfcmVzdWx0OwotfTsKLXR5cGVkZWYgc3RydWN0IHJwY19sb2NfaW9jdGxfcmV0cyBycGNfbG9jX2lvY3RsX3JldHM7Ci0KLXN0cnVjdCBycGNfbG9jX2FwaV9hcGlfdmVyc2lvbnNfcmV0cyB7Ci0gICAgcnBjX2xvY19hcGlfYXBpX3ZlcnNpb25zX3JldHVybl90eXBlIGxvY19hcGlfYXBpX3ZlcnNpb25zX3Jlc3VsdDsKLSAgICBycGNfdWludDMyICpsZW47Ci19OwotdHlwZWRlZiBzdHJ1Y3QgcnBjX2xvY19hcGlfYXBpX3ZlcnNpb25zX3JldHMgcnBjX2xvY19hcGlfYXBpX3ZlcnNpb25zX3JldHM7Ci0jZGVmaW5lIExPQ19BUElWRVJTIDB4MDAwNTAwMDYKLQotI2RlZmluZSBMT0NfQVBJUFJPRyAweDMwMDAwMDhDCi0jZGVmaW5lIExPQ19BUElWRVJTXzAwMDEgMHgwMDA1MDAwMQotCi0jaWYgZGVmaW5lZChfX1NURENfXykgfHwgZGVmaW5lZChfX2NwbHVzcGx1cykKLSNkZWZpbmUgcnBjX2xvY19hcGlfbnVsbCAwCi1leHRlcm4gIGVudW0gY2xudF9zdGF0IHJwY19sb2NfYXBpX251bGxfMHgwMDA1MDAwMSh2b2lkICosIHZvaWQgKiwgQ0xJRU5UICopOwotZXh0ZXJuICBib29sX3QgcnBjX2xvY19hcGlfbnVsbF8weDAwMDUwMDAxX3N2Yyh2b2lkICosIHZvaWQgKiwgc3RydWN0IHN2Y19yZXEgKik7Ci0jZGVmaW5lIHJwY19sb2NfYXBpX3JwY19nbHVlX2NvZGVfaW5mb19yZW1vdGUgMQotZXh0ZXJuICBlbnVtIGNsbnRfc3RhdCBycGNfbG9jX2FwaV9ycGNfZ2x1ZV9jb2RlX2luZm9fcmVtb3RlXzB4MDAwNTAwMDEodm9pZCAqLCBycGNfbG9jX2FwaV9ycGNfZ2x1ZV9jb2RlX2luZm9fcmVtb3RlX3JldHMgKiwgQ0xJRU5UICopOwotZXh0ZXJuICBib29sX3QgcnBjX2xvY19hcGlfcnBjX2dsdWVfY29kZV9pbmZvX3JlbW90ZV8weDAwMDUwMDAxX3N2Yyh2b2lkICosIHJwY19sb2NfYXBpX3JwY19nbHVlX2NvZGVfaW5mb19yZW1vdGVfcmV0cyAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKLSNkZWZpbmUgcnBjX2xvY19vcGVuIDIKLWV4dGVybiAgZW51bSBjbG50X3N0YXQgcnBjX2xvY19vcGVuXzB4MDAwNTAwMDEocnBjX2xvY19vcGVuX2FyZ3MgKiwgcnBjX2xvY19vcGVuX3JldHMgKiwgQ0xJRU5UICopOwotZXh0ZXJuICBib29sX3QgcnBjX2xvY19vcGVuXzB4MDAwNTAwMDFfc3ZjKHJwY19sb2Nfb3Blbl9hcmdzICosIHJwY19sb2Nfb3Blbl9yZXRzICosIHN0cnVjdCBzdmNfcmVxICopOwotI2RlZmluZSBycGNfbG9jX2Nsb3NlIDMKLWV4dGVybiAgZW51bSBjbG50X3N0YXQgcnBjX2xvY19jbG9zZV8weDAwMDUwMDAxKHJwY19sb2NfY2xvc2VfYXJncyAqLCBycGNfbG9jX2Nsb3NlX3JldHMgKiwgQ0xJRU5UICopOwotZXh0ZXJuICBib29sX3QgcnBjX2xvY19jbG9zZV8weDAwMDUwMDAxX3N2YyhycGNfbG9jX2Nsb3NlX2FyZ3MgKiwgcnBjX2xvY19jbG9zZV9yZXRzICosIHN0cnVjdCBzdmNfcmVxICopOwotI2RlZmluZSBycGNfbG9jX3N0YXJ0X2ZpeCA0Ci1leHRlcm4gIGVudW0gY2xudF9zdGF0IHJwY19sb2Nfc3RhcnRfZml4XzB4MDAwNTAwMDEocnBjX2xvY19zdGFydF9maXhfYXJncyAqLCBycGNfbG9jX3N0YXJ0X2ZpeF9yZXRzICosIENMSUVOVCAqKTsKLWV4dGVybiAgYm9vbF90IHJwY19sb2Nfc3RhcnRfZml4XzB4MDAwNTAwMDFfc3ZjKHJwY19sb2Nfc3RhcnRfZml4X2FyZ3MgKiwgcnBjX2xvY19zdGFydF9maXhfcmV0cyAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKLSNkZWZpbmUgcnBjX2xvY19zdG9wX2ZpeCA1Ci1leHRlcm4gIGVudW0gY2xudF9zdGF0IHJwY19sb2Nfc3RvcF9maXhfMHgwMDA1MDAwMShycGNfbG9jX3N0b3BfZml4X2FyZ3MgKiwgcnBjX2xvY19zdG9wX2ZpeF9yZXRzICosIENMSUVOVCAqKTsKLWV4dGVybiAgYm9vbF90IHJwY19sb2Nfc3RvcF9maXhfMHgwMDA1MDAwMV9zdmMocnBjX2xvY19zdG9wX2ZpeF9hcmdzICosIHJwY19sb2Nfc3RvcF9maXhfcmV0cyAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKLSNkZWZpbmUgcnBjX2xvY19pb2N0bCA2Ci1leHRlcm4gIGVudW0gY2xudF9zdGF0IHJwY19sb2NfaW9jdGxfMHgwMDA1MDAwMShycGNfbG9jX2lvY3RsX2FyZ3MgKiwgcnBjX2xvY19pb2N0bF9yZXRzICosIENMSUVOVCAqKTsKLWV4dGVybiAgYm9vbF90IHJwY19sb2NfaW9jdGxfMHgwMDA1MDAwMV9zdmMocnBjX2xvY19pb2N0bF9hcmdzICosIHJwY19sb2NfaW9jdGxfcmV0cyAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKLSNkZWZpbmUgcnBjX2xvY19hcGlfYXBpX3ZlcnNpb25zIDB4RkZGRkZGRkYKLWV4dGVybiAgZW51bSBjbG50X3N0YXQgcnBjX2xvY19hcGlfYXBpX3ZlcnNpb25zXzB4MDAwNTAwMDEodm9pZCAqLCBycGNfbG9jX2FwaV9hcGlfdmVyc2lvbnNfcmV0cyAqLCBDTElFTlQgKik7Ci1leHRlcm4gIGJvb2xfdCBycGNfbG9jX2FwaV9hcGlfdmVyc2lvbnNfMHgwMDA1MDAwMV9zdmModm9pZCAqLCBycGNfbG9jX2FwaV9hcGlfdmVyc2lvbnNfcmV0cyAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKLWV4dGVybiBpbnQgbG9jX2FwaXByb2dfMHgwMDA1MDAwMV9mcmVlcmVzdWx0IChTVkNYUFJUICosIHhkcnByb2NfdCwgY2FkZHJfdCk7Ci0KLSNlbHNlIC8qIEsmUiBDICovCi0jZGVmaW5lIHJwY19sb2NfYXBpX251bGwgMAotZXh0ZXJuICBlbnVtIGNsbnRfc3RhdCBycGNfbG9jX2FwaV9udWxsXzB4MDAwNTAwMDEoKTsKLWV4dGVybiAgYm9vbF90IHJwY19sb2NfYXBpX251bGxfMHgwMDA1MDAwMV9zdmMoKTsKLSNkZWZpbmUgcnBjX2xvY19hcGlfcnBjX2dsdWVfY29kZV9pbmZvX3JlbW90ZSAxCi1leHRlcm4gIGVudW0gY2xudF9zdGF0IHJwY19sb2NfYXBpX3JwY19nbHVlX2NvZGVfaW5mb19yZW1vdGVfMHgwMDA1MDAwMSgpOwotZXh0ZXJuICBib29sX3QgcnBjX2xvY19hcGlfcnBjX2dsdWVfY29kZV9pbmZvX3JlbW90ZV8weDAwMDUwMDAxX3N2YygpOwotI2RlZmluZSBycGNfbG9jX29wZW4gMgotZXh0ZXJuICBlbnVtIGNsbnRfc3RhdCBycGNfbG9jX29wZW5fMHgwMDA1MDAwMSgpOwotZXh0ZXJuICBib29sX3QgcnBjX2xvY19vcGVuXzB4MDAwNTAwMDFfc3ZjKCk7Ci0jZGVmaW5lIHJwY19sb2NfY2xvc2UgMwotZXh0ZXJuICBlbnVtIGNsbnRfc3RhdCBycGNfbG9jX2Nsb3NlXzB4MDAwNTAwMDEoKTsKLWV4dGVybiAgYm9vbF90IHJwY19sb2NfY2xvc2VfMHgwMDA1MDAwMV9zdmMoKTsKLSNkZWZpbmUgcnBjX2xvY19zdGFydF9maXggNAotZXh0ZXJuICBlbnVtIGNsbnRfc3RhdCBycGNfbG9jX3N0YXJ0X2ZpeF8weDAwMDUwMDAxKCk7Ci1leHRlcm4gIGJvb2xfdCBycGNfbG9jX3N0YXJ0X2ZpeF8weDAwMDUwMDAxX3N2YygpOwotI2RlZmluZSBycGNfbG9jX3N0b3BfZml4IDUKLWV4dGVybiAgZW51bSBjbG50X3N0YXQgcnBjX2xvY19zdG9wX2ZpeF8weDAwMDUwMDAxKCk7Ci1leHRlcm4gIGJvb2xfdCBycGNfbG9jX3N0b3BfZml4XzB4MDAwNTAwMDFfc3ZjKCk7Ci0jZGVmaW5lIHJwY19sb2NfaW9jdGwgNgotZXh0ZXJuICBlbnVtIGNsbnRfc3RhdCBycGNfbG9jX2lvY3RsXzB4MDAwNTAwMDEoKTsKLWV4dGVybiAgYm9vbF90IHJwY19sb2NfaW9jdGxfMHgwMDA1MDAwMV9zdmMoKTsKLSNkZWZpbmUgcnBjX2xvY19hcGlfYXBpX3ZlcnNpb25zIDB4RkZGRkZGRkYKLWV4dGVybiAgZW51bSBjbG50X3N0YXQgcnBjX2xvY19hcGlfYXBpX3ZlcnNpb25zXzB4MDAwNTAwMDEoKTsKLWV4dGVybiAgYm9vbF90IHJwY19sb2NfYXBpX2FwaV92ZXJzaW9uc18weDAwMDUwMDAxX3N2YygpOwotZXh0ZXJuIGludCBsb2NfYXBpcHJvZ18weDAwMDUwMDAxX2ZyZWVyZXN1bHQgKCk7Ci0jZW5kaWYgLyogSyZSIEMgKi8KLSNkZWZpbmUgTE9DX0FQSVZFUlNfMDAwMiAweDAwMDUwMDAyCi0KLSNpZiBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKF9fY3BsdXNwbHVzKQotZXh0ZXJuICBlbnVtIGNsbnRfc3RhdCBycGNfbG9jX2FwaV9udWxsXzB4MDAwNTAwMDIodm9pZCAqLCB2b2lkICosIENMSUVOVCAqKTsKLWV4dGVybiAgYm9vbF90IHJwY19sb2NfYXBpX251bGxfMHgwMDA1MDAwMl9zdmModm9pZCAqLCB2b2lkICosIHN0cnVjdCBzdmNfcmVxICopOwotZXh0ZXJuIGludCBsb2NfYXBpcHJvZ18weDAwMDUwMDAyX2ZyZWVyZXN1bHQgKFNWQ1hQUlQgKiwgeGRycHJvY190LCBjYWRkcl90KTsKLQotI2Vsc2UgLyogSyZSIEMgKi8KLWV4dGVybiAgZW51bSBjbG50X3N0YXQgcnBjX2xvY19hcGlfbnVsbF8weDAwMDUwMDAyKCk7Ci1leHRlcm4gIGJvb2xfdCBycGNfbG9jX2FwaV9udWxsXzB4MDAwNTAwMDJfc3ZjKCk7Ci1leHRlcm4gaW50IGxvY19hcGlwcm9nXzB4MDAwNTAwMDJfZnJlZXJlc3VsdCAoKTsKLSNlbmRpZiAvKiBLJlIgQyAqLwotI2RlZmluZSBMT0NfQVBJVkVSU18wMDAzIDB4MDAwNTAwMDMKLQotI2lmIGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoX19jcGx1c3BsdXMpCi1leHRlcm4gIGVudW0gY2xudF9zdGF0IHJwY19sb2NfYXBpX251bGxfMHgwMDA1MDAwMyh2b2lkICosIHZvaWQgKiwgQ0xJRU5UICopOwotZXh0ZXJuICBib29sX3QgcnBjX2xvY19hcGlfbnVsbF8weDAwMDUwMDAzX3N2Yyh2b2lkICosIHZvaWQgKiwgc3RydWN0IHN2Y19yZXEgKik7Ci1leHRlcm4gaW50IGxvY19hcGlwcm9nXzB4MDAwNTAwMDNfZnJlZXJlc3VsdCAoU1ZDWFBSVCAqLCB4ZHJwcm9jX3QsIGNhZGRyX3QpOwotCi0jZWxzZSAvKiBLJlIgQyAqLwotZXh0ZXJuICBlbnVtIGNsbnRfc3RhdCBycGNfbG9jX2FwaV9udWxsXzB4MDAwNTAwMDMoKTsKLWV4dGVybiAgYm9vbF90IHJwY19sb2NfYXBpX251bGxfMHgwMDA1MDAwM19zdmMoKTsKLWV4dGVybiBpbnQgbG9jX2FwaXByb2dfMHgwMDA1MDAwM19mcmVlcmVzdWx0ICgpOwotI2VuZGlmIC8qIEsmUiBDICovCi0jZGVmaW5lIExPQ19BUElWRVJTXzAwMDQgMHgwMDA1MDAwNAotCi0jaWYgZGVmaW5lZChfX1NURENfXykgfHwgZGVmaW5lZChfX2NwbHVzcGx1cykKLWV4dGVybiAgZW51bSBjbG50X3N0YXQgcnBjX2xvY19hcGlfbnVsbF8weDAwMDUwMDA0KHZvaWQgKiwgdm9pZCAqLCBDTElFTlQgKik7Ci1leHRlcm4gIGJvb2xfdCBycGNfbG9jX2FwaV9udWxsXzB4MDAwNTAwMDRfc3ZjKHZvaWQgKiwgdm9pZCAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKLWV4dGVybiBpbnQgbG9jX2FwaXByb2dfMHgwMDA1MDAwNF9mcmVlcmVzdWx0IChTVkNYUFJUICosIHhkcnByb2NfdCwgY2FkZHJfdCk7Ci0KLSNlbHNlIC8qIEsmUiBDICovCi1leHRlcm4gIGVudW0gY2xudF9zdGF0IHJwY19sb2NfYXBpX251bGxfMHgwMDA1MDAwNCgpOwotZXh0ZXJuICBib29sX3QgcnBjX2xvY19hcGlfbnVsbF8weDAwMDUwMDA0X3N2YygpOwotZXh0ZXJuIGludCBsb2NfYXBpcHJvZ18weDAwMDUwMDA0X2ZyZWVyZXN1bHQgKCk7Ci0jZW5kaWYgLyogSyZSIEMgKi8KLSNkZWZpbmUgTE9DX0FQSVZFUlNfMDAwNSAweDAwMDUwMDA1Ci0KLSNpZiBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKF9fY3BsdXNwbHVzKQotZXh0ZXJuICBlbnVtIGNsbnRfc3RhdCBycGNfbG9jX2FwaV9udWxsXzB4MDAwNTAwMDUodm9pZCAqLCB2b2lkICosIENMSUVOVCAqKTsKLWV4dGVybiAgYm9vbF90IHJwY19sb2NfYXBpX251bGxfMHgwMDA1MDAwNV9zdmModm9pZCAqLCB2b2lkICosIHN0cnVjdCBzdmNfcmVxICopOwotZXh0ZXJuIGludCBsb2NfYXBpcHJvZ18weDAwMDUwMDA1X2ZyZWVyZXN1bHQgKFNWQ1hQUlQgKiwgeGRycHJvY190LCBjYWRkcl90KTsKLQotI2Vsc2UgLyogSyZSIEMgKi8KLWV4dGVybiAgZW51bSBjbG50X3N0YXQgcnBjX2xvY19hcGlfbnVsbF8weDAwMDUwMDA1KCk7Ci1leHRlcm4gIGJvb2xfdCBycGNfbG9jX2FwaV9udWxsXzB4MDAwNTAwMDVfc3ZjKCk7Ci1leHRlcm4gaW50IGxvY19hcGlwcm9nXzB4MDAwNTAwMDVfZnJlZXJlc3VsdCAoKTsKLSNlbmRpZiAvKiBLJlIgQyAqLwotI2RlZmluZSBMT0NfQVBJVkVSU18wMDA2IDB4MDAwNTAwMDYKLQotI2lmIGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoX19jcGx1c3BsdXMpCi1leHRlcm4gIGVudW0gY2xudF9zdGF0IHJwY19sb2NfYXBpX251bGxfMHgwMDA1MDAwNih2b2lkICosIHZvaWQgKiwgQ0xJRU5UICopOwotZXh0ZXJuICBib29sX3QgcnBjX2xvY19hcGlfbnVsbF8weDAwMDUwMDA2X3N2Yyh2b2lkICosIHZvaWQgKiwgc3RydWN0IHN2Y19yZXEgKik7Ci1leHRlcm4gaW50IGxvY19hcGlwcm9nXzB4MDAwNTAwMDZfZnJlZXJlc3VsdCAoU1ZDWFBSVCAqLCB4ZHJwcm9jX3QsIGNhZGRyX3QpOwotCi0jZWxzZSAvKiBLJlIgQyAqLwotZXh0ZXJuICBlbnVtIGNsbnRfc3RhdCBycGNfbG9jX2FwaV9udWxsXzB4MDAwNTAwMDYoKTsKLWV4dGVybiAgYm9vbF90IHJwY19sb2NfYXBpX251bGxfMHgwMDA1MDAwNl9zdmMoKTsKLWV4dGVybiBpbnQgbG9jX2FwaXByb2dfMHgwMDA1MDAwNl9mcmVlcmVzdWx0ICgpOwotI2VuZGlmIC8qIEsmUiBDICovCi0KLS8qIHRoZSB4ZHIgZnVuY3Rpb25zICovCi0KLSNpZiBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKF9fY3BsdXNwbHVzKQotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2NfYXBpX2FwaV92ZXJzaW9uc19yZXR1cm5fdHlwZSAoWERSICosIHJwY19sb2NfYXBpX2FwaV92ZXJzaW9uc19yZXR1cm5fdHlwZSopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2NfZXZlbnRfY2JfZl90eXBlIChYRFIgKiwgcnBjX2xvY19ldmVudF9jYl9mX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX29wZW5fYXJncyAoWERSICosIHJwY19sb2Nfb3Blbl9hcmdzKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19jbG9zZV9hcmdzIChYRFIgKiwgcnBjX2xvY19jbG9zZV9hcmdzKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19zdGFydF9maXhfYXJncyAoWERSICosIHJwY19sb2Nfc3RhcnRfZml4X2FyZ3MqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX3N0b3BfZml4X2FyZ3MgKFhEUiAqLCBycGNfbG9jX3N0b3BfZml4X2FyZ3MqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX2lvY3RsX2FyZ3MgKFhEUiAqLCBycGNfbG9jX2lvY3RsX2FyZ3MqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX2FwaV9hcGlfdmVyc2lvbl9zX2FyZ3MgKFhEUiAqLCBycGNfbG9jX2FwaV9hcGlfdmVyc2lvbl9zX2FyZ3MqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX2FwaV9ycGNfZ2x1ZV9jb2RlX2luZm9fcmVtb3RlX3JldHMgKFhEUiAqLCBycGNfbG9jX2FwaV9ycGNfZ2x1ZV9jb2RlX2luZm9fcmVtb3RlX3JldHMqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX29wZW5fcmV0cyAoWERSICosIHJwY19sb2Nfb3Blbl9yZXRzKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19jbG9zZV9yZXRzIChYRFIgKiwgcnBjX2xvY19jbG9zZV9yZXRzKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19zdGFydF9maXhfcmV0cyAoWERSICosIHJwY19sb2Nfc3RhcnRfZml4X3JldHMqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX3N0b3BfZml4X3JldHMgKFhEUiAqLCBycGNfbG9jX3N0b3BfZml4X3JldHMqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX2lvY3RsX3JldHMgKFhEUiAqLCBycGNfbG9jX2lvY3RsX3JldHMqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX2FwaV9hcGlfdmVyc2lvbnNfcmV0cyAoWERSICosIHJwY19sb2NfYXBpX2FwaV92ZXJzaW9uc19yZXRzKik7Ci0KLSNlbHNlIC8qIEsmUiBDICovCi1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX2FwaV9hcGlfdmVyc2lvbnNfcmV0dXJuX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX2V2ZW50X2NiX2ZfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2Nfb3Blbl9hcmdzICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19jbG9zZV9hcmdzICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19zdGFydF9maXhfYXJncyAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2Nfc3RvcF9maXhfYXJncyAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2NfaW9jdGxfYXJncyAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2NfYXBpX2FwaV92ZXJzaW9uX3NfYXJncyAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2NfYXBpX3JwY19nbHVlX2NvZGVfaW5mb19yZW1vdGVfcmV0cyAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2Nfb3Blbl9yZXRzICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19jbG9zZV9yZXRzICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19zdGFydF9maXhfcmV0cyAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2Nfc3RvcF9maXhfcmV0cyAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2NfaW9jdGxfcmV0cyAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2NfYXBpX2FwaV92ZXJzaW9uc19yZXRzICgpOwotCi0jZW5kaWYgLyogSyZSIEMgKi8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmIC8qICFfTE9DX0FQSV9SUENfSF9SUENHRU4gKi8KZGlmZiAtLWdpdCBhL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpLXJwYy01MDAwMS9saWJsb2NfYXBpLXJwYy1zdHViL2luYy9sb2NfYXBpY2JfYXBwaW5pdC5oIGIvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGktcnBjLTUwMDAxL2xpYmxvY19hcGktcnBjLXN0dWIvaW5jL2xvY19hcGljYl9hcHBpbml0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3NWM0ZjAuLjAwMDAwMDAKLS0tIGEvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGktcnBjLTUwMDAxL2xpYmxvY19hcGktcnBjLXN0dWIvaW5jL2xvY19hcGljYl9hcHBpbml0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTEsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCi0gKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKLSAqICAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKLSAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAotICogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKLSAqIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KLSAqIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0vKiBJbml0aWFsaXphdGlvbiBmdW5jdGlvbiBmb3IgY2FsbGJhY2tzICovCi1pbnQgbG9jX2FwaWNiX2FwcF9pbml0KCk7Ci0KLXZvaWQgbG9jX2FwaWNiX2FwcF9kZWluaXQoKTsKLQpkaWZmIC0tZ2l0IGEvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGktcnBjLTUwMDAxL2xpYmxvY19hcGktcnBjLXN0dWIvc3JjL2xvY19hcGlfcnBjZ2VuX2NiX3N2Yy5jIGIvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGktcnBjLTUwMDAxL2xpYmxvY19hcGktcnBjLXN0dWIvc3JjL2xvY19hcGlfcnBjZ2VuX2NiX3N2Yy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWY1ODUyLi4wMDAwMDAwCi0tLSBhL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpLXJwYy01MDAwMS9saWJsb2NfYXBpLXJwYy1zdHViL3NyYy9sb2NfYXBpX3JwY2dlbl9jYl9zdmMuYworKysgL2Rldi9udWxsCkBAIC0xLDMyNyArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTEsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCi0gKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKLSAqICAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKLSAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAotICogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKLSAqIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KLSAqIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotLyoKLSAqIFBsZWFzZSBkbyBub3QgZWRpdCB0aGlzIGZpbGUuCi0gKiBJdCB3YXMgZ2VuZXJhdGVkIHVzaW5nIHJwY2dlbi4KLSAqLwotCi0jaW5jbHVkZSAibG9jX2FwaV9ycGNnZW5fY2JfcnBjLmgiCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxycGMvcG1hcF9jbG50Lmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8bWVtb3J5Lmg+Ci0jaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KLQotI2lmbmRlZiBTSUdfUEYKLSNkZWZpbmUgU0lHX1BGIHZvaWQoKikoaW50KQotI2VuZGlmCi0KLXZvaWQKLWxvY19hcGljYnByb2dfMHgwMDA1MDAwMShzdHJ1Y3Qgc3ZjX3JlcSAqcnFzdHAsIHJlZ2lzdGVyIFNWQ1hQUlQgKnRyYW5zcCkKLXsKLSAgICB1bmlvbiB7Ci0gICAgICAgIHJwY19sb2NfZXZlbnRfY2JfZl90eXBlX2FyZ3MgcnBjX2xvY19ldmVudF9jYl9mX3R5cGVfMHgwMDA1MDAwMV9hcmc7Ci0gICAgfSBhcmd1bWVudDsKLSAgICB1bmlvbiB7Ci0gICAgICAgIHJwY19sb2NfZXZlbnRfY2JfZl90eXBlX3JldHMgcnBjX2xvY19ldmVudF9jYl9mX3R5cGVfMHgwMDA1MDAwMV9yZXM7Ci0gICAgfSByZXN1bHQ7Ci0gICAgYm9vbF90IHJldHZhbDsKLSAgICB4ZHJwcm9jX3QgX3hkcl9hcmd1bWVudCwgX3hkcl9yZXN1bHQ7Ci0gICAgYm9vbF90ICgqbG9jYWwpKGNoYXIgKiwgdm9pZCAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKLQotICAgIHN3aXRjaCAocnFzdHAtPnJxX3Byb2MpIHsKLSAgICBjYXNlIE5VTExQUk9DOgotICAgICAgICAodm9pZCkgc3ZjX3NlbmRyZXBseSAodHJhbnNwLCAoeGRycHJvY190KSB4ZHJfdm9pZCwgKGNoYXIgKilOVUxMKTsKLSAgICAgICAgcmV0dXJuOwotCi0gICAgY2FzZSBycGNfbG9jX2V2ZW50X2NiX2ZfdHlwZToKLSAgICAgICAgX3hkcl9hcmd1bWVudCA9ICh4ZHJwcm9jX3QpIHhkcl9ycGNfbG9jX2V2ZW50X2NiX2ZfdHlwZV9hcmdzOwotICAgICAgICBfeGRyX3Jlc3VsdCA9ICh4ZHJwcm9jX3QpIHhkcl9ycGNfbG9jX2V2ZW50X2NiX2ZfdHlwZV9yZXRzOwotICAgICAgICBsb2NhbCA9IChib29sX3QgKCopIChjaGFyICosIHZvaWQgKiwgIHN0cnVjdCBzdmNfcmVxICopKXJwY19sb2NfZXZlbnRfY2JfZl90eXBlXzB4MDAwNTAwMDFfc3ZjOwotICAgICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAgIHN2Y2Vycl9ub3Byb2MgKHRyYW5zcCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbWVtc2V0ICgoY2hhciAqKSZhcmd1bWVudCwgMCwgc2l6ZW9mIChhcmd1bWVudCkpOwotICAgIGlmICghc3ZjX2dldGFyZ3MgKHRyYW5zcCwgKHhkcnByb2NfdCkgX3hkcl9hcmd1bWVudCwgKGNhZGRyX3QpICZhcmd1bWVudCkpIHsKLSAgICAgICAgc3ZjZXJyX2RlY29kZSAodHJhbnNwKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICByZXR2YWwgPSAoYm9vbF90KSAoKmxvY2FsKSgoY2hhciAqKSZhcmd1bWVudCwgKHZvaWQgKikmcmVzdWx0LCBycXN0cCk7Ci0gICAgaWYgKHJldHZhbCA+IDAgJiYgIXN2Y19zZW5kcmVwbHkodHJhbnNwLCAoeGRycHJvY190KSBfeGRyX3Jlc3VsdCwgKGNoYXIgKikmcmVzdWx0KSkgewotICAgICAgICBzdmNlcnJfc3lzdGVtZXJyICh0cmFuc3ApOwotICAgIH0KLSAgICBpZiAoIXN2Y19mcmVlYXJncyAodHJhbnNwLCAoeGRycHJvY190KSBfeGRyX2FyZ3VtZW50LCAoY2FkZHJfdCkgJmFyZ3VtZW50KSkgewotICAgICAgICBmcHJpbnRmIChzdGRlcnIsICIlcyIsICJ1bmFibGUgdG8gZnJlZSBhcmd1bWVudHMiKTsKLSAgICAgICAgZXhpdCAoMSk7Ci0gICAgfQotICAgIGlmICghbG9jX2FwaWNicHJvZ18weDAwMDUwMDAxX2ZyZWVyZXN1bHQgKHRyYW5zcCwgX3hkcl9yZXN1bHQsIChjYWRkcl90KSAmcmVzdWx0KSkKLSAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXMiLCAidW5hYmxlIHRvIGZyZWUgcmVzdWx0cyIpOwotCi0gICAgcmV0dXJuOwotfQotCi12b2lkCi1sb2NfYXBpY2Jwcm9nXzB4MDAwNTAwMDIoc3RydWN0IHN2Y19yZXEgKnJxc3RwLCByZWdpc3RlciBTVkNYUFJUICp0cmFuc3ApCi17Ci0gICAgdW5pb24gewotICAgICAgICBpbnQgZmlsbDsKLSAgICB9IGFyZ3VtZW50OwotICAgIHVuaW9uIHsKLSAgICAgICAgaW50IHJwY19sb2NfYXBpX2NiX251bGxfMHgwMDA1MDAwMl9yZXM7Ci0gICAgfSByZXN1bHQ7Ci0gICAgYm9vbF90IHJldHZhbDsKLSAgICB4ZHJwcm9jX3QgX3hkcl9hcmd1bWVudCwgX3hkcl9yZXN1bHQ7Ci0gICAgYm9vbF90ICgqbG9jYWwpKGNoYXIgKiwgdm9pZCAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKLQotICAgIHN3aXRjaCAocnFzdHAtPnJxX3Byb2MpIHsKLSAgICBjYXNlIE5VTExQUk9DOgotICAgICAgICAodm9pZCkgc3ZjX3NlbmRyZXBseSAodHJhbnNwLCAoeGRycHJvY190KSB4ZHJfdm9pZCwgKGNoYXIgKilOVUxMKTsKLSAgICAgICAgcmV0dXJuOwotCi0gICAgY2FzZSBycGNfbG9jX2FwaV9jYl9udWxsOgotICAgICAgICBfeGRyX2FyZ3VtZW50ID0gKHhkcnByb2NfdCkgeGRyX3ZvaWQ7Ci0gICAgICAgIF94ZHJfcmVzdWx0ID0gKHhkcnByb2NfdCkgeGRyX2ludDsKLSAgICAgICAgbG9jYWwgPSAoYm9vbF90ICgqKSAoY2hhciAqLCB2b2lkICosICBzdHJ1Y3Qgc3ZjX3JlcSAqKSlycGNfbG9jX2FwaV9jYl9udWxsXzB4MDAwNTAwMDJfc3ZjOwotICAgICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAgIHN2Y2Vycl9ub3Byb2MgKHRyYW5zcCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbWVtc2V0ICgoY2hhciAqKSZhcmd1bWVudCwgMCwgc2l6ZW9mIChhcmd1bWVudCkpOwotICAgIGlmICghc3ZjX2dldGFyZ3MgKHRyYW5zcCwgKHhkcnByb2NfdCkgX3hkcl9hcmd1bWVudCwgKGNhZGRyX3QpICZhcmd1bWVudCkpIHsKLSAgICAgICAgc3ZjZXJyX2RlY29kZSAodHJhbnNwKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICByZXR2YWwgPSAoYm9vbF90KSAoKmxvY2FsKSgoY2hhciAqKSZhcmd1bWVudCwgKHZvaWQgKikmcmVzdWx0LCBycXN0cCk7Ci0gICAgaWYgKHJldHZhbCA+IDAgJiYgIXN2Y19zZW5kcmVwbHkodHJhbnNwLCAoeGRycHJvY190KSBfeGRyX3Jlc3VsdCwgKGNoYXIgKikmcmVzdWx0KSkgewotICAgICAgICBzdmNlcnJfc3lzdGVtZXJyICh0cmFuc3ApOwotICAgIH0KLSAgICBpZiAoIXN2Y19mcmVlYXJncyAodHJhbnNwLCAoeGRycHJvY190KSBfeGRyX2FyZ3VtZW50LCAoY2FkZHJfdCkgJmFyZ3VtZW50KSkgewotICAgICAgICBmcHJpbnRmIChzdGRlcnIsICIlcyIsICJ1bmFibGUgdG8gZnJlZSBhcmd1bWVudHMiKTsKLSAgICAgICAgZXhpdCAoMSk7Ci0gICAgfQotICAgIGlmICghbG9jX2FwaWNicHJvZ18weDAwMDUwMDAyX2ZyZWVyZXN1bHQgKHRyYW5zcCwgX3hkcl9yZXN1bHQsIChjYWRkcl90KSAmcmVzdWx0KSkKLSAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXMiLCAidW5hYmxlIHRvIGZyZWUgcmVzdWx0cyIpOwotCi0gICAgcmV0dXJuOwotfQotCi12b2lkCi1sb2NfYXBpY2Jwcm9nXzB4MDAwNTAwMDMoc3RydWN0IHN2Y19yZXEgKnJxc3RwLCByZWdpc3RlciBTVkNYUFJUICp0cmFuc3ApCi17Ci0gICAgdW5pb24gewotICAgICAgICBpbnQgZmlsbDsKLSAgICB9IGFyZ3VtZW50OwotICAgIHVuaW9uIHsKLSAgICAgICAgaW50IHJwY19sb2NfYXBpX2NiX251bGxfMHgwMDA1MDAwM19yZXM7Ci0gICAgfSByZXN1bHQ7Ci0gICAgYm9vbF90IHJldHZhbDsKLSAgICB4ZHJwcm9jX3QgX3hkcl9hcmd1bWVudCwgX3hkcl9yZXN1bHQ7Ci0gICAgYm9vbF90ICgqbG9jYWwpKGNoYXIgKiwgdm9pZCAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKLQotICAgIHN3aXRjaCAocnFzdHAtPnJxX3Byb2MpIHsKLSAgICBjYXNlIE5VTExQUk9DOgotICAgICAgICAodm9pZCkgc3ZjX3NlbmRyZXBseSAodHJhbnNwLCAoeGRycHJvY190KSB4ZHJfdm9pZCwgKGNoYXIgKilOVUxMKTsKLSAgICAgICAgcmV0dXJuOwotCi0gICAgY2FzZSBycGNfbG9jX2FwaV9jYl9udWxsOgotICAgICAgICBfeGRyX2FyZ3VtZW50ID0gKHhkcnByb2NfdCkgeGRyX3ZvaWQ7Ci0gICAgICAgIF94ZHJfcmVzdWx0ID0gKHhkcnByb2NfdCkgeGRyX2ludDsKLSAgICAgICAgbG9jYWwgPSAoYm9vbF90ICgqKSAoY2hhciAqLCB2b2lkICosICBzdHJ1Y3Qgc3ZjX3JlcSAqKSlycGNfbG9jX2FwaV9jYl9udWxsXzB4MDAwNTAwMDNfc3ZjOwotICAgICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAgIHN2Y2Vycl9ub3Byb2MgKHRyYW5zcCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbWVtc2V0ICgoY2hhciAqKSZhcmd1bWVudCwgMCwgc2l6ZW9mIChhcmd1bWVudCkpOwotICAgIGlmICghc3ZjX2dldGFyZ3MgKHRyYW5zcCwgKHhkcnByb2NfdCkgX3hkcl9hcmd1bWVudCwgKGNhZGRyX3QpICZhcmd1bWVudCkpIHsKLSAgICAgICAgc3ZjZXJyX2RlY29kZSAodHJhbnNwKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICByZXR2YWwgPSAoYm9vbF90KSAoKmxvY2FsKSgoY2hhciAqKSZhcmd1bWVudCwgKHZvaWQgKikmcmVzdWx0LCBycXN0cCk7Ci0gICAgaWYgKHJldHZhbCA+IDAgJiYgIXN2Y19zZW5kcmVwbHkodHJhbnNwLCAoeGRycHJvY190KSBfeGRyX3Jlc3VsdCwgKGNoYXIgKikmcmVzdWx0KSkgewotICAgICAgICBzdmNlcnJfc3lzdGVtZXJyICh0cmFuc3ApOwotICAgIH0KLSAgICBpZiAoIXN2Y19mcmVlYXJncyAodHJhbnNwLCAoeGRycHJvY190KSBfeGRyX2FyZ3VtZW50LCAoY2FkZHJfdCkgJmFyZ3VtZW50KSkgewotICAgICAgICBmcHJpbnRmIChzdGRlcnIsICIlcyIsICJ1bmFibGUgdG8gZnJlZSBhcmd1bWVudHMiKTsKLSAgICAgICAgZXhpdCAoMSk7Ci0gICAgfQotICAgIGlmICghbG9jX2FwaWNicHJvZ18weDAwMDUwMDAzX2ZyZWVyZXN1bHQgKHRyYW5zcCwgX3hkcl9yZXN1bHQsIChjYWRkcl90KSAmcmVzdWx0KSkKLSAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXMiLCAidW5hYmxlIHRvIGZyZWUgcmVzdWx0cyIpOwotCi0gICAgcmV0dXJuOwotfQotCi12b2lkCi1sb2NfYXBpY2Jwcm9nXzB4MDAwNTAwMDQoc3RydWN0IHN2Y19yZXEgKnJxc3RwLCByZWdpc3RlciBTVkNYUFJUICp0cmFuc3ApCi17Ci0gICAgdW5pb24gewotICAgICAgICBpbnQgZmlsbDsKLSAgICB9IGFyZ3VtZW50OwotICAgIHVuaW9uIHsKLSAgICAgICAgaW50IHJwY19sb2NfYXBpX2NiX251bGxfMHgwMDA1MDAwNF9yZXM7Ci0gICAgfSByZXN1bHQ7Ci0gICAgYm9vbF90IHJldHZhbDsKLSAgICB4ZHJwcm9jX3QgX3hkcl9hcmd1bWVudCwgX3hkcl9yZXN1bHQ7Ci0gICAgYm9vbF90ICgqbG9jYWwpKGNoYXIgKiwgdm9pZCAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKLQotICAgIHN3aXRjaCAocnFzdHAtPnJxX3Byb2MpIHsKLSAgICBjYXNlIE5VTExQUk9DOgotICAgICAgICAodm9pZCkgc3ZjX3NlbmRyZXBseSAodHJhbnNwLCAoeGRycHJvY190KSB4ZHJfdm9pZCwgKGNoYXIgKilOVUxMKTsKLSAgICAgICAgcmV0dXJuOwotCi0gICAgY2FzZSBycGNfbG9jX2FwaV9jYl9udWxsOgotICAgICAgICBfeGRyX2FyZ3VtZW50ID0gKHhkcnByb2NfdCkgeGRyX3ZvaWQ7Ci0gICAgICAgIF94ZHJfcmVzdWx0ID0gKHhkcnByb2NfdCkgeGRyX2ludDsKLSAgICAgICAgbG9jYWwgPSAoYm9vbF90ICgqKSAoY2hhciAqLCB2b2lkICosICBzdHJ1Y3Qgc3ZjX3JlcSAqKSlycGNfbG9jX2FwaV9jYl9udWxsXzB4MDAwNTAwMDRfc3ZjOwotICAgICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAgIHN2Y2Vycl9ub3Byb2MgKHRyYW5zcCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbWVtc2V0ICgoY2hhciAqKSZhcmd1bWVudCwgMCwgc2l6ZW9mIChhcmd1bWVudCkpOwotICAgIGlmICghc3ZjX2dldGFyZ3MgKHRyYW5zcCwgKHhkcnByb2NfdCkgX3hkcl9hcmd1bWVudCwgKGNhZGRyX3QpICZhcmd1bWVudCkpIHsKLSAgICAgICAgc3ZjZXJyX2RlY29kZSAodHJhbnNwKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICByZXR2YWwgPSAoYm9vbF90KSAoKmxvY2FsKSgoY2hhciAqKSZhcmd1bWVudCwgKHZvaWQgKikmcmVzdWx0LCBycXN0cCk7Ci0gICAgaWYgKHJldHZhbCA+IDAgJiYgIXN2Y19zZW5kcmVwbHkodHJhbnNwLCAoeGRycHJvY190KSBfeGRyX3Jlc3VsdCwgKGNoYXIgKikmcmVzdWx0KSkgewotICAgICAgICBzdmNlcnJfc3lzdGVtZXJyICh0cmFuc3ApOwotICAgIH0KLSAgICBpZiAoIXN2Y19mcmVlYXJncyAodHJhbnNwLCAoeGRycHJvY190KSBfeGRyX2FyZ3VtZW50LCAoY2FkZHJfdCkgJmFyZ3VtZW50KSkgewotICAgICAgICBmcHJpbnRmIChzdGRlcnIsICIlcyIsICJ1bmFibGUgdG8gZnJlZSBhcmd1bWVudHMiKTsKLSAgICAgICAgZXhpdCAoMSk7Ci0gICAgfQotICAgIGlmICghbG9jX2FwaWNicHJvZ18weDAwMDUwMDA0X2ZyZWVyZXN1bHQgKHRyYW5zcCwgX3hkcl9yZXN1bHQsIChjYWRkcl90KSAmcmVzdWx0KSkKLSAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXMiLCAidW5hYmxlIHRvIGZyZWUgcmVzdWx0cyIpOwotCi0gICAgcmV0dXJuOwotfQotCi12b2lkCi1sb2NfYXBpY2Jwcm9nXzB4MDAwNTAwMDUoc3RydWN0IHN2Y19yZXEgKnJxc3RwLCByZWdpc3RlciBTVkNYUFJUICp0cmFuc3ApCi17Ci0gICAgdW5pb24gewotICAgICAgICBpbnQgZmlsbDsKLSAgICB9IGFyZ3VtZW50OwotICAgIHVuaW9uIHsKLSAgICAgICAgaW50IHJwY19sb2NfYXBpX2NiX251bGxfMHgwMDA1MDAwNV9yZXM7Ci0gICAgfSByZXN1bHQ7Ci0gICAgYm9vbF90IHJldHZhbDsKLSAgICB4ZHJwcm9jX3QgX3hkcl9hcmd1bWVudCwgX3hkcl9yZXN1bHQ7Ci0gICAgYm9vbF90ICgqbG9jYWwpKGNoYXIgKiwgdm9pZCAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKLQotICAgIHN3aXRjaCAocnFzdHAtPnJxX3Byb2MpIHsKLSAgICBjYXNlIE5VTExQUk9DOgotICAgICAgICAodm9pZCkgc3ZjX3NlbmRyZXBseSAodHJhbnNwLCAoeGRycHJvY190KSB4ZHJfdm9pZCwgKGNoYXIgKilOVUxMKTsKLSAgICAgICAgcmV0dXJuOwotCi0gICAgY2FzZSBycGNfbG9jX2FwaV9jYl9udWxsOgotICAgICAgICBfeGRyX2FyZ3VtZW50ID0gKHhkcnByb2NfdCkgeGRyX3ZvaWQ7Ci0gICAgICAgIF94ZHJfcmVzdWx0ID0gKHhkcnByb2NfdCkgeGRyX2ludDsKLSAgICAgICAgbG9jYWwgPSAoYm9vbF90ICgqKSAoY2hhciAqLCB2b2lkICosICBzdHJ1Y3Qgc3ZjX3JlcSAqKSlycGNfbG9jX2FwaV9jYl9udWxsXzB4MDAwNTAwMDVfc3ZjOwotICAgICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAgIHN2Y2Vycl9ub3Byb2MgKHRyYW5zcCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbWVtc2V0ICgoY2hhciAqKSZhcmd1bWVudCwgMCwgc2l6ZW9mIChhcmd1bWVudCkpOwotICAgIGlmICghc3ZjX2dldGFyZ3MgKHRyYW5zcCwgKHhkcnByb2NfdCkgX3hkcl9hcmd1bWVudCwgKGNhZGRyX3QpICZhcmd1bWVudCkpIHsKLSAgICAgICAgc3ZjZXJyX2RlY29kZSAodHJhbnNwKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICByZXR2YWwgPSAoYm9vbF90KSAoKmxvY2FsKSgoY2hhciAqKSZhcmd1bWVudCwgKHZvaWQgKikmcmVzdWx0LCBycXN0cCk7Ci0gICAgaWYgKHJldHZhbCA+IDAgJiYgIXN2Y19zZW5kcmVwbHkodHJhbnNwLCAoeGRycHJvY190KSBfeGRyX3Jlc3VsdCwgKGNoYXIgKikmcmVzdWx0KSkgewotICAgICAgICBzdmNlcnJfc3lzdGVtZXJyICh0cmFuc3ApOwotICAgIH0KLSAgICBpZiAoIXN2Y19mcmVlYXJncyAodHJhbnNwLCAoeGRycHJvY190KSBfeGRyX2FyZ3VtZW50LCAoY2FkZHJfdCkgJmFyZ3VtZW50KSkgewotICAgICAgICBmcHJpbnRmIChzdGRlcnIsICIlcyIsICJ1bmFibGUgdG8gZnJlZSBhcmd1bWVudHMiKTsKLSAgICAgICAgZXhpdCAoMSk7Ci0gICAgfQotICAgIGlmICghbG9jX2FwaWNicHJvZ18weDAwMDUwMDA1X2ZyZWVyZXN1bHQgKHRyYW5zcCwgX3hkcl9yZXN1bHQsIChjYWRkcl90KSAmcmVzdWx0KSkKLSAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXMiLCAidW5hYmxlIHRvIGZyZWUgcmVzdWx0cyIpOwotCi0gICAgcmV0dXJuOwotfQotCi12b2lkCi1sb2NfYXBpY2Jwcm9nXzB4MDAwNTAwMDYoc3RydWN0IHN2Y19yZXEgKnJxc3RwLCByZWdpc3RlciBTVkNYUFJUICp0cmFuc3ApCi17Ci0gICAgdW5pb24gewotICAgICAgICBpbnQgZmlsbDsKLSAgICB9IGFyZ3VtZW50OwotICAgIHVuaW9uIHsKLSAgICAgICAgaW50IHJwY19sb2NfYXBpX2NiX251bGxfMHgwMDA1MDAwNl9yZXM7Ci0gICAgfSByZXN1bHQ7Ci0gICAgYm9vbF90IHJldHZhbDsKLSAgICB4ZHJwcm9jX3QgX3hkcl9hcmd1bWVudCwgX3hkcl9yZXN1bHQ7Ci0gICAgYm9vbF90ICgqbG9jYWwpKGNoYXIgKiwgdm9pZCAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKLQotICAgIHN3aXRjaCAocnFzdHAtPnJxX3Byb2MpIHsKLSAgICBjYXNlIE5VTExQUk9DOgotICAgICAgICAodm9pZCkgc3ZjX3NlbmRyZXBseSAodHJhbnNwLCAoeGRycHJvY190KSB4ZHJfdm9pZCwgKGNoYXIgKilOVUxMKTsKLSAgICAgICAgcmV0dXJuOwotCi0gICAgY2FzZSBycGNfbG9jX2FwaV9jYl9udWxsOgotICAgICAgICBfeGRyX2FyZ3VtZW50ID0gKHhkcnByb2NfdCkgeGRyX3ZvaWQ7Ci0gICAgICAgIF94ZHJfcmVzdWx0ID0gKHhkcnByb2NfdCkgeGRyX2ludDsKLSAgICAgICAgbG9jYWwgPSAoYm9vbF90ICgqKSAoY2hhciAqLCB2b2lkICosICBzdHJ1Y3Qgc3ZjX3JlcSAqKSlycGNfbG9jX2FwaV9jYl9udWxsXzB4MDAwNTAwMDZfc3ZjOwotICAgICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAgIHN2Y2Vycl9ub3Byb2MgKHRyYW5zcCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbWVtc2V0ICgoY2hhciAqKSZhcmd1bWVudCwgMCwgc2l6ZW9mIChhcmd1bWVudCkpOwotICAgIGlmICghc3ZjX2dldGFyZ3MgKHRyYW5zcCwgKHhkcnByb2NfdCkgX3hkcl9hcmd1bWVudCwgKGNhZGRyX3QpICZhcmd1bWVudCkpIHsKLSAgICAgICAgc3ZjZXJyX2RlY29kZSAodHJhbnNwKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICByZXR2YWwgPSAoYm9vbF90KSAoKmxvY2FsKSgoY2hhciAqKSZhcmd1bWVudCwgKHZvaWQgKikmcmVzdWx0LCBycXN0cCk7Ci0gICAgaWYgKHJldHZhbCA+IDAgJiYgIXN2Y19zZW5kcmVwbHkodHJhbnNwLCAoeGRycHJvY190KSBfeGRyX3Jlc3VsdCwgKGNoYXIgKikmcmVzdWx0KSkgewotICAgICAgICBzdmNlcnJfc3lzdGVtZXJyICh0cmFuc3ApOwotICAgIH0KLSAgICBpZiAoIXN2Y19mcmVlYXJncyAodHJhbnNwLCAoeGRycHJvY190KSBfeGRyX2FyZ3VtZW50LCAoY2FkZHJfdCkgJmFyZ3VtZW50KSkgewotICAgICAgICBmcHJpbnRmIChzdGRlcnIsICIlcyIsICJ1bmFibGUgdG8gZnJlZSBhcmd1bWVudHMiKTsKLSAgICAgICAgZXhpdCAoMSk7Ci0gICAgfQotICAgIGlmICghbG9jX2FwaWNicHJvZ18weDAwMDUwMDA2X2ZyZWVyZXN1bHQgKHRyYW5zcCwgX3hkcl9yZXN1bHQsIChjYWRkcl90KSAmcmVzdWx0KSkKLSAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXMiLCAidW5hYmxlIHRvIGZyZWUgcmVzdWx0cyIpOwotCi0gICAgcmV0dXJuOwotfQpkaWZmIC0tZ2l0IGEvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGktcnBjLTUwMDAxL2xpYmxvY19hcGktcnBjLXN0dWIvc3JjL2xvY19hcGlfcnBjZ2VuX2NiX3hkci5jIGIvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGktcnBjLTUwMDAxL2xpYmxvY19hcGktcnBjLXN0dWIvc3JjL2xvY19hcGlfcnBjZ2VuX2NiX3hkci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDE3MWRjLi4wMDAwMDAwCi0tLSBhL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpLXJwYy01MDAwMS9saWJsb2NfYXBpLXJwYy1zdHViL3NyYy9sb2NfYXBpX3JwY2dlbl9jYl94ZHIuYworKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMSwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKLSAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAotICogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAotICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgotICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCi0gKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQotICogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgotICogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0vKgotICogUGxlYXNlIGRvIG5vdCBlZGl0IHRoaXMgZmlsZS4KLSAqIEl0IHdhcyBnZW5lcmF0ZWQgdXNpbmcgcnBjZ2VuLgotICovCi0KLSNpbmNsdWRlICJsb2NfYXBpX3JwY2dlbl9jYl9ycGMuaCIKLQotYm9vbF90Ci14ZHJfcnBjX2xvY19ldmVudF9jYl9mX3R5cGVfYXJncyAoWERSICp4ZHJzLCBycGNfbG9jX2V2ZW50X2NiX2ZfdHlwZV9hcmdzICpvYmpwKQotewotOwotCi0gICAgIGlmICgheGRyX3JwY191aW50MzIgKHhkcnMsICZvYmpwLT5jYl9pZCkpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgIGlmICgheGRyX3JwY19sb2NfY2xpZW50X2hhbmRsZV90eXBlICh4ZHJzLCAmb2JqcC0+bG9jX2hhbmRsZSkpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgIGlmICgheGRyX3JwY19sb2NfZXZlbnRfbWFza190eXBlICh4ZHJzLCAmb2JqcC0+bG9jX2V2ZW50KSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgaWYgKCF4ZHJfcG9pbnRlciAoeGRycywgKGNoYXIgKiopJm9ianAtPmxvY19ldmVudF9wYXlsb2FkLCBzaXplb2YgKHJwY19sb2NfZXZlbnRfcGF5bG9hZF91X3R5cGUpLCAoeGRycHJvY190KSB4ZHJfcnBjX2xvY19ldmVudF9wYXlsb2FkX3VfdHlwZSkpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2NfZXZlbnRfY2JfZl90eXBlX3JldHMgKFhEUiAqeGRycywgcnBjX2xvY19ldmVudF9jYl9mX3R5cGVfcmV0cyAqb2JqcCkKLXsKLTsKLQotICAgICBpZiAoIXhkcl9ycGNfaW50MzIgKHhkcnMsICZvYmpwLT5sb2NfZXZlbnRfY2JfZl90eXBlX3Jlc3VsdCkpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgcmV0dXJuIFRSVUU7Ci19CmRpZmYgLS1naXQgYS9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaS1ycGMtNTAwMDEvbGlibG9jX2FwaS1ycGMtc3R1Yi9zcmMvbG9jX2FwaV9ycGNnZW5fY2xudC5jIGIvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGktcnBjLTUwMDAxL2xpYmxvY19hcGktcnBjLXN0dWIvc3JjL2xvY19hcGlfcnBjZ2VuX2NsbnQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2UzOTU3Ni4uMDAwMDAwMAotLS0gYS9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaS1ycGMtNTAwMDEvbGlibG9jX2FwaS1ycGMtc3R1Yi9zcmMvbG9jX2FwaV9ycGNnZW5fY2xudC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMSwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKLSAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAotICogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAotICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgotICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCi0gKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQotICogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgotICogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0vKgotICogUGxlYXNlIGRvIG5vdCBlZGl0IHRoaXMgZmlsZS4KLSAqIEl0IHdhcyBnZW5lcmF0ZWQgdXNpbmcgcnBjZ2VuLgotICovCi0KLSNpbmNsdWRlIDxtZW1vcnkuaD4gLyogZm9yIG1lbXNldCAqLwotI2luY2x1ZGUgImxvY19hcGlfcnBjZ2VuX3JwYy5oIgotCi0vKiBEZWZhdWx0IHRpbWVvdXQgY2FuIGJlIGNoYW5nZWQgdXNpbmcgY2xudF9jb250cm9sKCkgKi8KLXN0YXRpYyBzdHJ1Y3QgdGltZXZhbCBUSU1FT1VUID0geyAyNSwgMCB9OwotCi1lbnVtIGNsbnRfc3RhdAotcnBjX2xvY19hcGlfbnVsbF8weDAwMDUwMDAxKHZvaWQgKmFyZ3AsIHZvaWQgKmNsbnRfcmVzLCBDTElFTlQgKmNsbnQpCi17Ci0gICAgcmV0dXJuIChjbG50X2NhbGwoY2xudCwgcnBjX2xvY19hcGlfbnVsbCwKLSAgICAgICAgKHhkcnByb2NfdCkgeGRyX3ZvaWQsIChjYWRkcl90KSBhcmdwLAotICAgICAgICAoeGRycHJvY190KSB4ZHJfdm9pZCwgKGNhZGRyX3QpIGNsbnRfcmVzLAotICAgICAgICBUSU1FT1VUKSk7Ci19Ci0KLWVudW0gY2xudF9zdGF0Ci1ycGNfbG9jX2FwaV9ycGNfZ2x1ZV9jb2RlX2luZm9fcmVtb3RlXzB4MDAwNTAwMDEodm9pZCAqYXJncCwgcnBjX2xvY19hcGlfcnBjX2dsdWVfY29kZV9pbmZvX3JlbW90ZV9yZXRzICpjbG50X3JlcywgQ0xJRU5UICpjbG50KQotewotICAgIHJldHVybiAoY2xudF9jYWxsKGNsbnQsIHJwY19sb2NfYXBpX3JwY19nbHVlX2NvZGVfaW5mb19yZW1vdGUsCi0gICAgICAgICh4ZHJwcm9jX3QpIHhkcl92b2lkLCAoY2FkZHJfdCkgYXJncCwKLSAgICAgICAgKHhkcnByb2NfdCkgeGRyX3JwY19sb2NfYXBpX3JwY19nbHVlX2NvZGVfaW5mb19yZW1vdGVfcmV0cywgKGNhZGRyX3QpIGNsbnRfcmVzLAotICAgICAgICBUSU1FT1VUKSk7Ci19Ci0KLWVudW0gY2xudF9zdGF0Ci1ycGNfbG9jX29wZW5fMHgwMDA1MDAwMShycGNfbG9jX29wZW5fYXJncyAqYXJncCwgcnBjX2xvY19vcGVuX3JldHMgKmNsbnRfcmVzLCBDTElFTlQgKmNsbnQpCi17Ci0gICAgcmV0dXJuIChjbG50X2NhbGwoY2xudCwgcnBjX2xvY19vcGVuLAotICAgICAgICAoeGRycHJvY190KSB4ZHJfcnBjX2xvY19vcGVuX2FyZ3MsIChjYWRkcl90KSBhcmdwLAotICAgICAgICAoeGRycHJvY190KSB4ZHJfcnBjX2xvY19vcGVuX3JldHMsIChjYWRkcl90KSBjbG50X3JlcywKLSAgICAgICAgVElNRU9VVCkpOwotfQotCi1lbnVtIGNsbnRfc3RhdAotcnBjX2xvY19jbG9zZV8weDAwMDUwMDAxKHJwY19sb2NfY2xvc2VfYXJncyAqYXJncCwgcnBjX2xvY19jbG9zZV9yZXRzICpjbG50X3JlcywgQ0xJRU5UICpjbG50KQotewotICAgIHJldHVybiAoY2xudF9jYWxsKGNsbnQsIHJwY19sb2NfY2xvc2UsCi0gICAgICAgICh4ZHJwcm9jX3QpIHhkcl9ycGNfbG9jX2Nsb3NlX2FyZ3MsIChjYWRkcl90KSBhcmdwLAotICAgICAgICAoeGRycHJvY190KSB4ZHJfcnBjX2xvY19jbG9zZV9yZXRzLCAoY2FkZHJfdCkgY2xudF9yZXMsCi0gICAgICAgIFRJTUVPVVQpKTsKLX0KLQotZW51bSBjbG50X3N0YXQKLXJwY19sb2Nfc3RhcnRfZml4XzB4MDAwNTAwMDEocnBjX2xvY19zdGFydF9maXhfYXJncyAqYXJncCwgcnBjX2xvY19zdGFydF9maXhfcmV0cyAqY2xudF9yZXMsIENMSUVOVCAqY2xudCkKLXsKLSAgICByZXR1cm4gKGNsbnRfY2FsbChjbG50LCBycGNfbG9jX3N0YXJ0X2ZpeCwKLSAgICAgICAgKHhkcnByb2NfdCkgeGRyX3JwY19sb2Nfc3RhcnRfZml4X2FyZ3MsIChjYWRkcl90KSBhcmdwLAotICAgICAgICAoeGRycHJvY190KSB4ZHJfcnBjX2xvY19zdGFydF9maXhfcmV0cywgKGNhZGRyX3QpIGNsbnRfcmVzLAotICAgICAgICBUSU1FT1VUKSk7Ci19Ci0KLWVudW0gY2xudF9zdGF0Ci1ycGNfbG9jX3N0b3BfZml4XzB4MDAwNTAwMDEocnBjX2xvY19zdG9wX2ZpeF9hcmdzICphcmdwLCBycGNfbG9jX3N0b3BfZml4X3JldHMgKmNsbnRfcmVzLCBDTElFTlQgKmNsbnQpCi17Ci0gICAgcmV0dXJuIChjbG50X2NhbGwoY2xudCwgcnBjX2xvY19zdG9wX2ZpeCwKLSAgICAgICAgKHhkcnByb2NfdCkgeGRyX3JwY19sb2Nfc3RvcF9maXhfYXJncywgKGNhZGRyX3QpIGFyZ3AsCi0gICAgICAgICh4ZHJwcm9jX3QpIHhkcl9ycGNfbG9jX3N0b3BfZml4X3JldHMsIChjYWRkcl90KSBjbG50X3JlcywKLSAgICAgICAgVElNRU9VVCkpOwotfQotCi1lbnVtIGNsbnRfc3RhdAotcnBjX2xvY19pb2N0bF8weDAwMDUwMDAxKHJwY19sb2NfaW9jdGxfYXJncyAqYXJncCwgcnBjX2xvY19pb2N0bF9yZXRzICpjbG50X3JlcywgQ0xJRU5UICpjbG50KQotewotICAgIHJldHVybiAoY2xudF9jYWxsKGNsbnQsIHJwY19sb2NfaW9jdGwsCi0gICAgICAgICh4ZHJwcm9jX3QpIHhkcl9ycGNfbG9jX2lvY3RsX2FyZ3MsIChjYWRkcl90KSBhcmdwLAotICAgICAgICAoeGRycHJvY190KSB4ZHJfcnBjX2xvY19pb2N0bF9yZXRzLCAoY2FkZHJfdCkgY2xudF9yZXMsCi0gICAgICAgIFRJTUVPVVQpKTsKLX0KLQotZW51bSBjbG50X3N0YXQKLXJwY19sb2NfYXBpX2FwaV92ZXJzaW9uc18weDAwMDUwMDAxKHZvaWQgKmFyZ3AsIHJwY19sb2NfYXBpX2FwaV92ZXJzaW9uc19yZXRzICpjbG50X3JlcywgQ0xJRU5UICpjbG50KQotewotICAgIHJldHVybiAoY2xudF9jYWxsKGNsbnQsIHJwY19sb2NfYXBpX2FwaV92ZXJzaW9ucywKLSAgICAgICAgKHhkcnByb2NfdCkgeGRyX3ZvaWQsIChjYWRkcl90KSBhcmdwLAotICAgICAgICAoeGRycHJvY190KSB4ZHJfcnBjX2xvY19hcGlfYXBpX3ZlcnNpb25zX3JldHMsIChjYWRkcl90KSBjbG50X3JlcywKLSAgICAgICAgVElNRU9VVCkpOwotfQotCi1lbnVtIGNsbnRfc3RhdAotcnBjX2xvY19hcGlfbnVsbF8weDAwMDUwMDAyKHZvaWQgKmFyZ3AsIHZvaWQgKmNsbnRfcmVzLCBDTElFTlQgKmNsbnQpCi17Ci0gICAgcmV0dXJuIChjbG50X2NhbGwoY2xudCwgcnBjX2xvY19hcGlfbnVsbCwKLSAgICAgICAgKHhkcnByb2NfdCkgeGRyX3ZvaWQsIChjYWRkcl90KSBhcmdwLAotICAgICAgICAoeGRycHJvY190KSB4ZHJfdm9pZCwgKGNhZGRyX3QpIGNsbnRfcmVzLAotICAgICAgICBUSU1FT1VUKSk7Ci19Ci0KLWVudW0gY2xudF9zdGF0Ci1ycGNfbG9jX2FwaV9udWxsXzB4MDAwNTAwMDModm9pZCAqYXJncCwgdm9pZCAqY2xudF9yZXMsIENMSUVOVCAqY2xudCkKLXsKLSAgICByZXR1cm4gKGNsbnRfY2FsbChjbG50LCBycGNfbG9jX2FwaV9udWxsLAotICAgICAgICAoeGRycHJvY190KSB4ZHJfdm9pZCwgKGNhZGRyX3QpIGFyZ3AsCi0gICAgICAgICh4ZHJwcm9jX3QpIHhkcl92b2lkLCAoY2FkZHJfdCkgY2xudF9yZXMsCi0gICAgICAgIFRJTUVPVVQpKTsKLX0KLQotZW51bSBjbG50X3N0YXQKLXJwY19sb2NfYXBpX251bGxfMHgwMDA1MDAwNCh2b2lkICphcmdwLCB2b2lkICpjbG50X3JlcywgQ0xJRU5UICpjbG50KQotewotICAgIHJldHVybiAoY2xudF9jYWxsKGNsbnQsIHJwY19sb2NfYXBpX251bGwsCi0gICAgICAgICh4ZHJwcm9jX3QpIHhkcl92b2lkLCAoY2FkZHJfdCkgYXJncCwKLSAgICAgICAgKHhkcnByb2NfdCkgeGRyX3ZvaWQsIChjYWRkcl90KSBjbG50X3JlcywKLSAgICAgICAgVElNRU9VVCkpOwotfQotCi1lbnVtIGNsbnRfc3RhdAotcnBjX2xvY19hcGlfbnVsbF8weDAwMDUwMDA1KHZvaWQgKmFyZ3AsIHZvaWQgKmNsbnRfcmVzLCBDTElFTlQgKmNsbnQpCi17Ci0gICAgcmV0dXJuIChjbG50X2NhbGwoY2xudCwgcnBjX2xvY19hcGlfbnVsbCwKLSAgICAgICAgKHhkcnByb2NfdCkgeGRyX3ZvaWQsIChjYWRkcl90KSBhcmdwLAotICAgICAgICAoeGRycHJvY190KSB4ZHJfdm9pZCwgKGNhZGRyX3QpIGNsbnRfcmVzLAotICAgICAgICBUSU1FT1VUKSk7Ci19Ci0KLWVudW0gY2xudF9zdGF0Ci1ycGNfbG9jX2FwaV9udWxsXzB4MDAwNTAwMDYodm9pZCAqYXJncCwgdm9pZCAqY2xudF9yZXMsIENMSUVOVCAqY2xudCkKLXsKLSAgICByZXR1cm4gKGNsbnRfY2FsbChjbG50LCBycGNfbG9jX2FwaV9udWxsLAotICAgICAgICAoeGRycHJvY190KSB4ZHJfdm9pZCwgKGNhZGRyX3QpIGFyZ3AsCi0gICAgICAgICh4ZHJwcm9jX3QpIHhkcl92b2lkLCAoY2FkZHJfdCkgY2xudF9yZXMsCi0gICAgICAgIFRJTUVPVVQpKTsKLX0KZGlmZiAtLWdpdCBhL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpLXJwYy01MDAwMS9saWJsb2NfYXBpLXJwYy1zdHViL3NyYy9sb2NfYXBpX3JwY2dlbl9jb21tb25feGRyLmMgYi9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaS1ycGMtNTAwMDEvbGlibG9jX2FwaS1ycGMtc3R1Yi9zcmMvbG9jX2FwaV9ycGNnZW5fY29tbW9uX3hkci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWJlOGY0Li4wMDAwMDAwCi0tLSBhL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpLXJwYy01MDAwMS9saWJsb2NfYXBpLXJwYy1zdHViL3NyYy9sb2NfYXBpX3JwY2dlbl9jb21tb25feGRyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzc1ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMSwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKLSAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAotICogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAotICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgotICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCi0gKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQotICogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgotICogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0vKgotICogUGxlYXNlIGRvIG5vdCBlZGl0IHRoaXMgZmlsZS4KLSAqIEl0IHdhcyBnZW5lcmF0ZWQgdXNpbmcgcnBjZ2VuLgotICovCi0KLSNpbmNsdWRlICJsb2NfYXBpX3JwY2dlbl9jb21tb25fcnBjLmgiCi0KLWJvb2xfdAoteGRyX3JwY19sb2NfY2xpZW50X2hhbmRsZV90eXBlIChYRFIgKnhkcnMsIHJwY19sb2NfY2xpZW50X2hhbmRsZV90eXBlICpvYmpwKQotewotICAgIHJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotICAgICBpZiAoIXhkcl9ycGNfaW50MzIgKHhkcnMsIG9ianApKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIHJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfbG9jX2V2ZW50X21hc2tfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX2V2ZW50X21hc2tfdHlwZSAqb2JqcCkKLXsKLSAgICByZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLSAgICAgaWYgKCF4ZHJfcnBjX3VpbnQ2NCAoeGRycywgb2JqcCkpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2NfcG9zaXRpb25fdmFsaWRfbWFza190eXBlIChYRFIgKnhkcnMsIHJwY19sb2NfcG9zaXRpb25fdmFsaWRfbWFza190eXBlICpvYmpwKQotewotICAgIHJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotICAgICBpZiAoIXhkcl9ycGNfdWludDY0ICh4ZHJzLCBvYmpwKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19wb3NfdGVjaG5vbG9neV9tYXNrX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19wb3NfdGVjaG5vbG9neV9tYXNrX3R5cGUgKm9ianApCi17Ci0gICAgcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0gICAgIGlmICgheGRyX3JwY191aW50MzIgKHhkcnMsIG9ianApKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIHJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfbG9jX3Nlc3Npb25fc3RhdHVzX2VfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX3Nlc3Npb25fc3RhdHVzX2VfdHlwZSAqb2JqcCkKLXsKLSAgICByZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLSAgICAgaWYgKCF4ZHJfZW51bSAoeGRycywgKGVudW1fdCAqKSBvYmpwKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19jYWxlbmRhcl90aW1lX3NfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX2NhbGVuZGFyX3RpbWVfc190eXBlICpvYmpwKQotewotICAgIHJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotICAgICBpZiAoIXhkcl9ycGNfdWludDE2ICh4ZHJzLCAmb2JqcC0+eWVhcikpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgIGlmICgheGRyX3VfY2hhciAoeGRycywgJm9ianAtPm1vbnRoKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgaWYgKCF4ZHJfdV9jaGFyICh4ZHJzLCAmb2JqcC0+ZGF5X29mX3dlZWspKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICBpZiAoIXhkcl91X2NoYXIgKHhkcnMsICZvYmpwLT5kYXkpKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICBpZiAoIXhkcl91X2NoYXIgKHhkcnMsICZvYmpwLT5ob3VyKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgaWYgKCF4ZHJfdV9jaGFyICh4ZHJzLCAmb2JqcC0+bWludXRlKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgaWYgKCF4ZHJfdV9jaGFyICh4ZHJzLCAmb2JqcC0+c2Vjb25kKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgaWYgKCF4ZHJfcnBjX3VpbnQxNiAoeGRycywgJm9ianAtPm1pbGxpc2Vjb25kKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19wYXJzZWRfcG9zaXRpb25fc190eXBlIChYRFIgKnhkcnMsIHJwY19sb2NfcGFyc2VkX3Bvc2l0aW9uX3NfdHlwZSAqb2JqcCkKLXsKLSAgICByZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLSAgICAgaWYgKCF4ZHJfcnBjX2xvY19wb3NpdGlvbl92YWxpZF9tYXNrX3R5cGUgKHhkcnMsICZvYmpwLT52YWxpZF9tYXNrKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgaWYgKCF4ZHJfcnBjX2xvY19zZXNzaW9uX3N0YXR1c19lX3R5cGUgKHhkcnMsICZvYmpwLT5zZXNzaW9uX3N0YXR1cykpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgIGlmICgheGRyX3JwY19sb2NfY2FsZW5kYXJfdGltZV9zX3R5cGUgKHhkcnMsICZvYmpwLT50aW1lc3RhbXBfY2FsZW5kYXIpKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICBpZiAoIXhkcl9ycGNfdWludDY0ICh4ZHJzLCAmb2JqcC0+dGltZXN0YW1wX3V0YykpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgIGlmICgheGRyX3JwY191aW50OCAoeGRycywgJm9ianAtPmxlYXBfc2Vjb25kcykpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgIGlmICgheGRyX2Zsb2F0ICh4ZHJzLCAmb2JqcC0+dGltZV91bmMpKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICBpZiAoIXhkcl9kb3VibGUgKHhkcnMsICZvYmpwLT5sYXRpdHVkZSkpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgIGlmICgheGRyX2RvdWJsZSAoeGRycywgJm9ianAtPmxvbmdpdHVkZSkpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgIGlmICgheGRyX2Zsb2F0ICh4ZHJzLCAmb2JqcC0+YWx0aXR1ZGVfd3J0X2VsbGlwc29pZCkpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgIGlmICgheGRyX2Zsb2F0ICh4ZHJzLCAmb2JqcC0+YWx0aXR1ZGVfd3J0X21lYW5fc2VhX2xldmVsKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgaWYgKCF4ZHJfZmxvYXQgKHhkcnMsICZvYmpwLT5zcGVlZF9ob3Jpem9udGFsKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgaWYgKCF4ZHJfZmxvYXQgKHhkcnMsICZvYmpwLT5zcGVlZF92ZXJ0aWNhbCkpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgIGlmICgheGRyX2Zsb2F0ICh4ZHJzLCAmb2JqcC0+aGVhZGluZykpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgIGlmICgheGRyX2Zsb2F0ICh4ZHJzLCAmb2JqcC0+aG9yX3VuY19jaXJjdWxhcikpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgIGlmICgheGRyX2Zsb2F0ICh4ZHJzLCAmb2JqcC0+aG9yX3VuY19lbGxpcHNlX3NlbWlfbWFqb3IpKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICBpZiAoIXhkcl9mbG9hdCAoeGRycywgJm9ianAtPmhvcl91bmNfZWxsaXBzZV9zZW1pX21pbm9yKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgaWYgKCF4ZHJfZmxvYXQgKHhkcnMsICZvYmpwLT5ob3JfdW5jX2VsbGlwc2Vfb3JpZW50X2F6aW11dGgpKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICBpZiAoIXhkcl9mbG9hdCAoeGRycywgJm9ianAtPnZlcnRfdW5jKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgaWYgKCF4ZHJfZmxvYXQgKHhkcnMsICZvYmpwLT5zcGVlZF91bmMpKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICBpZiAoIXhkcl9mbG9hdCAoeGRycywgJm9ianAtPmhlYWRpbmdfdW5jKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgaWYgKCF4ZHJfdV9jaGFyICh4ZHJzLCAmb2JqcC0+Y29uZmlkZW5jZV9ob3Jpem9udGFsKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgaWYgKCF4ZHJfdV9jaGFyICh4ZHJzLCAmb2JqcC0+Y29uZmlkZW5jZV92ZXJ0aWNhbCkpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgIGlmICgheGRyX2Zsb2F0ICh4ZHJzLCAmb2JqcC0+bWFnbmV0aWNfZGV2aWF0aW9uKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgaWYgKCF4ZHJfcnBjX2xvY19wb3NfdGVjaG5vbG9neV9tYXNrX3R5cGUgKHhkcnMsICZvYmpwLT50ZWNobm9sb2d5X21hc2spKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIHJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfbG9jX3N2X3N5c3RlbV9lX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19zdl9zeXN0ZW1fZV90eXBlICpvYmpwKQotewotICAgIHJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotICAgICBpZiAoIXhkcl9lbnVtICh4ZHJzLCAoZW51bV90ICopIG9ianApKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIHJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfbG9jX3N2X3N0YXR1c19lX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19zdl9zdGF0dXNfZV90eXBlICpvYmpwKQotewotICAgIHJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotICAgICBpZiAoIXhkcl9lbnVtICh4ZHJzLCAoZW51bV90ICopIG9ianApKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIHJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfbG9jX3N2X2luZm9fdmFsaWRfbWFza190eXBlIChYRFIgKnhkcnMsIHJwY19sb2Nfc3ZfaW5mb192YWxpZF9tYXNrX3R5cGUgKm9ianApCi17Ci0gICAgcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0gICAgIGlmICgheGRyX3JwY191aW50MzIgKHhkcnMsIG9ianApKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIHJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfbG9jX3N2X2luZm9fc190eXBlIChYRFIgKnhkcnMsIHJwY19sb2Nfc3ZfaW5mb19zX3R5cGUgKm9ianApCi17Ci0gICAgcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0gICAgIGlmICgheGRyX3JwY19sb2Nfc3ZfaW5mb192YWxpZF9tYXNrX3R5cGUgKHhkcnMsICZvYmpwLT52YWxpZF9tYXNrKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgaWYgKCF4ZHJfcnBjX2xvY19zdl9zeXN0ZW1fZV90eXBlICh4ZHJzLCAmb2JqcC0+c3lzdGVtKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgaWYgKCF4ZHJfcnBjX3VpbnQ4ICh4ZHJzLCAmb2JqcC0+cHJuKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgaWYgKCF4ZHJfcnBjX3VpbnQ4ICh4ZHJzLCAmb2JqcC0+aGVhbHRoX3N0YXR1cykpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgIGlmICgheGRyX3JwY19sb2Nfc3Zfc3RhdHVzX2VfdHlwZSAoeGRycywgJm9ianAtPnByb2Nlc3Nfc3RhdHVzKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgaWYgKCF4ZHJfcnBjX2Jvb2xlYW4gKHhkcnMsICZvYmpwLT5oYXNfZXBoKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgaWYgKCF4ZHJfcnBjX2Jvb2xlYW4gKHhkcnMsICZvYmpwLT5oYXNfYWxtKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgaWYgKCF4ZHJfZmxvYXQgKHhkcnMsICZvYmpwLT5lbGV2YXRpb24pKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICBpZiAoIXhkcl9mbG9hdCAoeGRycywgJm9ianAtPmF6aW11dGgpKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICBpZiAoIXhkcl9mbG9hdCAoeGRycywgJm9ianAtPnNucikpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2NfZ25zc19pbmZvX3ZhbGlkX21hc2tfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX2duc3NfaW5mb192YWxpZF9tYXNrX3R5cGUgKm9ianApCi17Ci0gICAgcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0gICAgIGlmICgheGRyX3JwY191aW50MzIgKHhkcnMsIG9ianApKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIHJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfbG9jX2duc3NfaW5mb19zX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19nbnNzX2luZm9fc190eXBlICpvYmpwKQotewotICAgIHJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotICAgICBpZiAoIXhkcl9ycGNfbG9jX2duc3NfaW5mb192YWxpZF9tYXNrX3R5cGUgKHhkcnMsICZvYmpwLT52YWxpZF9tYXNrKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgaWYgKCF4ZHJfZmxvYXQgKHhkcnMsICZvYmpwLT5wb3NpdGlvbl9kb3ApKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICBpZiAoIXhkcl9mbG9hdCAoeGRycywgJm9ianAtPmhvcml6b250YWxfZG9wKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgaWYgKCF4ZHJfZmxvYXQgKHhkcnMsICZvYmpwLT52ZXJ0aWNhbF9kb3ApKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICBpZiAoIXhkcl9ycGNfYm9vbGVhbiAoeGRycywgJm9ianAtPmFsdGl0dWRlX2Fzc3VtZWQpKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICBpZiAoIXhkcl9ycGNfdWludDE2ICh4ZHJzLCAmb2JqcC0+c3ZfY291bnQpKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICBpZiAoIXhkcl9hcnJheSAoeGRycywgKGNoYXIgKiopJm9ianAtPnN2X2xpc3Quc3ZfbGlzdF92YWwsICh1X2ludCAqKSAmb2JqcC0+c3ZfbGlzdC5zdl9saXN0X2xlbiwgODAsCi0gICAgICAgIHNpemVvZiAocnBjX2xvY19zdl9pbmZvX3NfdHlwZSksICh4ZHJwcm9jX3QpIHhkcl9ycGNfbG9jX3N2X2luZm9fc190eXBlKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19ubWVhX3JlcG9ydF9zX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19ubWVhX3JlcG9ydF9zX3R5cGUgKm9ianApCi17Ci0gICAgcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0gICAgaW50IGk7Ci0gICAgIGlmICgheGRyX3JwY191aW50MTYgKHhkcnMsICZvYmpwLT5sZW5ndGgpKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICBpZiAoIXhkcl9vcGFxdWUgKHhkcnMsIG9ianAtPm5tZWFfc2VudGVuY2VzLCAyMDApKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIHJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfbG9jX3N0YXR1c19ldmVudF9lX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19zdGF0dXNfZXZlbnRfZV90eXBlICpvYmpwKQotewotICAgIHJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotICAgICBpZiAoIXhkcl9lbnVtICh4ZHJzLCAoZW51bV90ICopIG9ianApKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIHJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfbG9jX2VuZ2luZV9zdGF0ZV9lX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19lbmdpbmVfc3RhdGVfZV90eXBlICpvYmpwKQotewotICAgIHJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotICAgICBpZiAoIXhkcl9lbnVtICh4ZHJzLCAoZW51bV90ICopIG9ianApKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIHJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfbG9jX2ZpeF9zZXNzaW9uX3N0YXRlX2VfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX2ZpeF9zZXNzaW9uX3N0YXRlX2VfdHlwZSAqb2JqcCkKLXsKLSAgICByZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLSAgICAgaWYgKCF4ZHJfZW51bSAoeGRycywgKGVudW1fdCAqKSBvYmpwKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19zdGF0dXNfZXZlbnRfcGF5bG9hZF91X3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19zdGF0dXNfZXZlbnRfcGF5bG9hZF91X3R5cGUgKm9ianApCi17Ci0gICAgcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0gICAgIGlmICgheGRyX3JwY19sb2Nfc3RhdHVzX2V2ZW50X2VfdHlwZSAoeGRycywgJm9ianAtPmRpc2MpKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIHN3aXRjaCAob2JqcC0+ZGlzYykgewotICAgIGNhc2UgUlBDX0xPQ19TVEFUVVNfRVZFTlRfRU5HSU5FX1NUQVRFOgotICAgICAgICAgaWYgKCF4ZHJfcnBjX2xvY19lbmdpbmVfc3RhdGVfZV90eXBlICh4ZHJzLCAmb2JqcC0+cnBjX2xvY19zdGF0dXNfZXZlbnRfcGF5bG9hZF91X3R5cGVfdS5lbmdpbmVfc3RhdGUpKQotICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSUENfTE9DX1NUQVRVU19FVkVOVF9GSVhfU0VTU0lPTl9TVEFURToKLSAgICAgICAgIGlmICgheGRyX3JwY19sb2NfZml4X3Nlc3Npb25fc3RhdGVfZV90eXBlICh4ZHJzLCAmb2JqcC0+cnBjX2xvY19zdGF0dXNfZXZlbnRfcGF5bG9hZF91X3R5cGVfdS5maXhfc2Vzc2lvbl9zdGF0ZSkpCi0gICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2Nfc3RhdHVzX2V2ZW50X3NfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX3N0YXR1c19ldmVudF9zX3R5cGUgKm9ianApCi17Ci0gICAgcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0gICAgIGlmICgheGRyX3JwY19sb2Nfc3RhdHVzX2V2ZW50X2VfdHlwZSAoeGRycywgJm9ianAtPmV2ZW50KSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgaWYgKCF4ZHJfcnBjX2xvY19zdGF0dXNfZXZlbnRfcGF5bG9hZF91X3R5cGUgKHhkcnMsICZvYmpwLT5wYXlsb2FkKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19zZXJ2ZXJfYWRkcl9lX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19zZXJ2ZXJfYWRkcl9lX3R5cGUgKm9ianApCi17Ci0gICAgcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0gICAgIGlmICgheGRyX2VudW0gKHhkcnMsIChlbnVtX3QgKikgb2JqcCkpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2Nfc2VydmVyX2FkZHJfaXB2NF90eXBlIChYRFIgKnhkcnMsIHJwY19sb2Nfc2VydmVyX2FkZHJfaXB2NF90eXBlICpvYmpwKQotewotICAgIHJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotICAgICBpZiAoIXhkcl9ycGNfdWludDMyICh4ZHJzLCAmb2JqcC0+YWRkcikpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgIGlmICgheGRyX3JwY191aW50MTYgKHhkcnMsICZvYmpwLT5wb3J0KSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19zZXJ2ZXJfYWRkcl91cmxfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX3NlcnZlcl9hZGRyX3VybF90eXBlICpvYmpwKQotewotICAgIHJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotICAgIGludCBpOwotICAgICBpZiAoIXhkcl9ycGNfdWludDE2ICh4ZHJzLCAmb2JqcC0+bGVuZ3RoKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgaWYgKCF4ZHJfb3BhcXVlICh4ZHJzLCBvYmpwLT5hZGRyLCAyNTYpKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIHJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfbG9jX3NlcnZlcl9hZGRyX2lwdjZfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX3NlcnZlcl9hZGRyX2lwdjZfdHlwZSAqb2JqcCkKLXsKLSAgICByZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLSAgICBpbnQgaTsKLSAgICAgaWYgKCF4ZHJfdmVjdG9yICh4ZHJzLCAoY2hhciAqKW9ianAtPmFkZHIsIDgsCi0gICAgICAgIHNpemVvZiAocnBjX3VpbnQxNiksICh4ZHJwcm9jX3QpIHhkcl9ycGNfdWludDE2KSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgaWYgKCF4ZHJfcnBjX3VpbnQzMiAoeGRycywgJm9ianAtPnBvcnQpKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIHJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfbG9jX3NlcnZlcl9hZGRyX3VfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX3NlcnZlcl9hZGRyX3VfdHlwZSAqb2JqcCkKLXsKLSAgICByZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLSAgICAgaWYgKCF4ZHJfcnBjX2xvY19zZXJ2ZXJfYWRkcl9lX3R5cGUgKHhkcnMsICZvYmpwLT5kaXNjKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICBzd2l0Y2ggKG9ianAtPmRpc2MpIHsKLSAgICBjYXNlIFJQQ19MT0NfU0VSVkVSX0FERFJfSVBWNDoKLSAgICAgICAgIGlmICgheGRyX3JwY19sb2Nfc2VydmVyX2FkZHJfaXB2NF90eXBlICh4ZHJzLCAmb2JqcC0+cnBjX2xvY19zZXJ2ZXJfYWRkcl91X3R5cGVfdS5pcHY0KSkKLSAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUlBDX0xPQ19TRVJWRVJfQUREUl9VUkw6Ci0gICAgICAgICBpZiAoIXhkcl9ycGNfbG9jX3NlcnZlcl9hZGRyX3VybF90eXBlICh4ZHJzLCAmb2JqcC0+cnBjX2xvY19zZXJ2ZXJfYWRkcl91X3R5cGVfdS51cmwpKQotICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSUENfTE9DX1NFUlZFUl9BRERSX0lQVjY6Ci0gICAgICAgICBpZiAoIXhkcl9ycGNfbG9jX3NlcnZlcl9hZGRyX2lwdjZfdHlwZSAoeGRycywgJm9ianAtPnJwY19sb2Nfc2VydmVyX2FkZHJfdV90eXBlX3UuaXB2NikpCi0gICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2Nfc2VydmVyX2luZm9fc190eXBlIChYRFIgKnhkcnMsIHJwY19sb2Nfc2VydmVyX2luZm9fc190eXBlICpvYmpwKQotewotICAgIHJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotICAgICBpZiAoIXhkcl9ycGNfbG9jX3NlcnZlcl9hZGRyX2VfdHlwZSAoeGRycywgJm9ianAtPmFkZHJfdHlwZSkpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgIGlmICgheGRyX3JwY19sb2Nfc2VydmVyX2FkZHJfdV90eXBlICh4ZHJzLCAmb2JqcC0+YWRkcl9pbmZvKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19uaV9ub3RpZnlfdmVyaWZ5X2VfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX25pX25vdGlmeV92ZXJpZnlfZV90eXBlICpvYmpwKQotewotICAgIHJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotICAgICBpZiAoIXhkcl9lbnVtICh4ZHJzLCAoZW51bV90ICopIG9ianApKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIHJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfbG9jX25pX2V2ZW50X2VfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX25pX2V2ZW50X2VfdHlwZSAqb2JqcCkKLXsKLSAgICByZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLSAgICAgaWYgKCF4ZHJfZW51bSAoeGRycywgKGVudW1fdCAqKSBvYmpwKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19uaV9kYXRhY29kaW5nX3NjaGVtZV9lX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19uaV9kYXRhY29kaW5nX3NjaGVtZV9lX3R5cGUgKm9ianApCi17Ci0gICAgcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0gICAgIGlmICgheGRyX2VudW0gKHhkcnMsIChlbnVtX3QgKikgb2JqcCkpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2NfbmlfdnhfcmVxdWVzdGVyX2lkX2VuY29kaW5nX3NjaGVtZV9lX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19uaV92eF9yZXF1ZXN0ZXJfaWRfZW5jb2Rpbmdfc2NoZW1lX2VfdHlwZSAqb2JqcCkKLXsKLSAgICByZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLSAgICAgaWYgKCF4ZHJfZW51bSAoeGRycywgKGVudW1fdCAqKSBvYmpwKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19uaV92eF9wb3NfbW9kZV9lX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19uaV92eF9wb3NfbW9kZV9lX3R5cGUgKm9ianApCi17Ci0gICAgcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0gICAgIGlmICgheGRyX2VudW0gKHhkcnMsIChlbnVtX3QgKikgb2JqcCkpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2NfbmlfdnhfcmVxdWVzdGVyX2lkX3NfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX25pX3Z4X3JlcXVlc3Rlcl9pZF9zX3R5cGUgKm9ianApCi17Ci0gICAgcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0gICAgaW50IGk7Ci0gICAgIGlmICgheGRyX3VfY2hhciAoeGRycywgJm9ianAtPnJlcXVlc3Rlcl9pZF9sZW5ndGgpKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICBpZiAoIXhkcl9vcGFxdWUgKHhkcnMsIG9ianAtPnJlcXVlc3Rlcl9pZCwgMjAwKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19uaV92eF9ub3RpZnlfdmVyaWZ5X3JlcV9zX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19uaV92eF9ub3RpZnlfdmVyaWZ5X3JlcV9zX3R5cGUgKm9ianApCi17Ci0gICAgcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0gICAgIGlmICgheGRyX3JwY19sb2Nfbmlfbm90aWZ5X3ZlcmlmeV9lX3R5cGUgKHhkcnMsICZvYmpwLT5ub3RpZmljYXRpb25fcHJpdl90eXBlKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgaWYgKCF4ZHJfdV9jaGFyICh4ZHJzLCAmb2JqcC0+cG9zX3Fvc19pbmNsKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgaWYgKCF4ZHJfdV9jaGFyICh4ZHJzLCAmb2JqcC0+cG9zX3FvcykpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgIGlmICgheGRyX3JwY191aW50MzIgKHhkcnMsICZvYmpwLT5udW1fZml4ZXMpKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICBpZiAoIXhkcl9ycGNfdWludDMyICh4ZHJzLCAmb2JqcC0+dGJmKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgaWYgKCF4ZHJfcnBjX2xvY19uaV92eF9wb3NfbW9kZV9lX3R5cGUgKHhkcnMsICZvYmpwLT5wb3NfbW9kZSkpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgIGlmICgheGRyX3JwY19sb2NfbmlfdnhfcmVxdWVzdGVyX2lkX2VuY29kaW5nX3NjaGVtZV9lX3R5cGUgKHhkcnMsICZvYmpwLT5lbmNvZGluZ19zY2hlbWUpKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICBpZiAoIXhkcl9ycGNfbG9jX25pX3Z4X3JlcXVlc3Rlcl9pZF9zX3R5cGUgKHhkcnMsICZvYmpwLT5yZXF1ZXN0ZXJfaWQpKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICBpZiAoIXhkcl9ycGNfdWludDE2ICh4ZHJzLCAmb2JqcC0+dXNlcl9yZXNwX3RpbWVyX3ZhbCkpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2Nfbmlfc3VwbF9wb3NfbWV0aG9kX2VfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX25pX3N1cGxfcG9zX21ldGhvZF9lX3R5cGUgKm9ianApCi17Ci0gICAgcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0gICAgIGlmICgheGRyX2VudW0gKHhkcnMsIChlbnVtX3QgKikgb2JqcCkpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2Nfbmlfc3VwbF9zbHBfc2Vzc2lvbl9pZF9zX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19uaV9zdXBsX3NscF9zZXNzaW9uX2lkX3NfdHlwZSAqb2JqcCkKLXsKLSAgICByZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLSAgICBpbnQgaTsKLSAgICAgaWYgKCF4ZHJfdV9jaGFyICh4ZHJzLCAmb2JqcC0+cHJlc2VuY2UpKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICBpZiAoIXhkcl9vcGFxdWUgKHhkcnMsIG9ianAtPnNlc3Npb25faWQsIDQpKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICBpZiAoIXhkcl9ycGNfbG9jX3NlcnZlcl9pbmZvX3NfdHlwZSAoeGRycywgJm9ianAtPnNscF9hZGRyZXNzKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19uaV9yZXF1ZXN0b3JfaWRfc190eXBlIChYRFIgKnhkcnMsIHJwY19sb2NfbmlfcmVxdWVzdG9yX2lkX3NfdHlwZSAqb2JqcCkKLXsKLSAgICByZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLSAgICBpbnQgaTsKLSAgICAgaWYgKCF4ZHJfdV9jaGFyICh4ZHJzLCAmb2JqcC0+ZGF0YV9jb2Rpbmdfc2NoZW1lKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgaWYgKCF4ZHJfb3BhcXVlICh4ZHJzLCBvYmpwLT5yZXF1ZXN0b3JfaWRfc3RyaW5nLCAyMDApKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICBpZiAoIXhkcl91X2NoYXIgKHhkcnMsICZvYmpwLT5zdHJpbmdfbGVuKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19uaV9zdXBsX2NsaWVudF9uYW1lX3NfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX25pX3N1cGxfY2xpZW50X25hbWVfc190eXBlICpvYmpwKQotewotICAgIHJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotICAgIGludCBpOwotICAgICBpZiAoIXhkcl91X2NoYXIgKHhkcnMsICZvYmpwLT5kYXRhX2NvZGluZ19zY2hlbWUpKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICBpZiAoIXhkcl9vcGFxdWUgKHhkcnMsIG9ianAtPmNsaWVudF9uYW1lX3N0cmluZywgNjQpKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICBpZiAoIXhkcl91X2NoYXIgKHhkcnMsICZvYmpwLT5zdHJpbmdfbGVuKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19uaV9zdXBsX3FvcF9zX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19uaV9zdXBsX3FvcF9zX3R5cGUgKm9ianApCi17Ci0gICAgcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0gICAgIGlmICgheGRyX3VfY2hhciAoeGRycywgJm9ianAtPmJpdF9tYXNrKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgaWYgKCF4ZHJfdV9jaGFyICh4ZHJzLCAmb2JqcC0+aG9yYWNjKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgaWYgKCF4ZHJfdV9jaGFyICh4ZHJzLCAmb2JqcC0+dmVyYWNjKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgaWYgKCF4ZHJfcnBjX3VpbnQxNiAoeGRycywgJm9ianAtPm1heExvY0FnZSkpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgIGlmICgheGRyX3VfY2hhciAoeGRycywgJm9ianAtPmRlbGF5KSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19uaV9zdXBsX25vdGlmeV92ZXJpZnlfcmVxX3NfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX25pX3N1cGxfbm90aWZ5X3ZlcmlmeV9yZXFfc190eXBlICpvYmpwKQotewotICAgIHJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotICAgIGludCBpOwotICAgICBpZiAoIXhkcl9ycGNfbG9jX25pX25vdGlmeV92ZXJpZnlfZV90eXBlICh4ZHJzLCAmb2JqcC0+bm90aWZpY2F0aW9uX3ByaXZfdHlwZSkpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgIGlmICgheGRyX3JwY191aW50MTYgKHhkcnMsICZvYmpwLT5mbGFncykpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgIGlmICgheGRyX3JwY19sb2Nfbmlfc3VwbF9zbHBfc2Vzc2lvbl9pZF9zX3R5cGUgKHhkcnMsICZvYmpwLT5zdXBsX3NscF9zZXNzaW9uX2lkKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgaWYgKCF4ZHJfb3BhcXVlICh4ZHJzLCBvYmpwLT5zdXBsX2hhc2gsIDgpKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICBpZiAoIXhkcl9ycGNfbG9jX25pX2RhdGFjb2Rpbmdfc2NoZW1lX2VfdHlwZSAoeGRycywgJm9ianAtPmRhdGFjb2Rpbmdfc2NoZW1lKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgaWYgKCF4ZHJfcnBjX2xvY19uaV9zdXBsX3Bvc19tZXRob2RfZV90eXBlICh4ZHJzLCAmb2JqcC0+cG9zX21ldGhvZCkpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgIGlmICgheGRyX3JwY19sb2NfbmlfcmVxdWVzdG9yX2lkX3NfdHlwZSAoeGRycywgJm9ianAtPnJlcXVlc3Rvcl9pZCkpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgIGlmICgheGRyX3JwY19sb2Nfbmlfc3VwbF9jbGllbnRfbmFtZV9zX3R5cGUgKHhkcnMsICZvYmpwLT5jbGllbnRfbmFtZSkpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgIGlmICgheGRyX3JwY19sb2Nfbmlfc3VwbF9xb3Bfc190eXBlICh4ZHJzLCAmb2JqcC0+c3VwbF9xb3ApKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICBpZiAoIXhkcl9ycGNfdWludDE2ICh4ZHJzLCAmb2JqcC0+dXNlcl9yZXNwb25zZV90aW1lcikpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2NfbmlfZXh0X2NsaWVudF9hZGRyZXNzX3NfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX25pX2V4dF9jbGllbnRfYWRkcmVzc19zX3R5cGUgKm9ianApCi17Ci0gICAgcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0gICAgaW50IGk7Ci0gICAgIGlmICgheGRyX3VfY2hhciAoeGRycywgJm9ianAtPmV4dF9jbGllbnRfYWRkcmVzc19sZW4pKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICBpZiAoIXhkcl9vcGFxdWUgKHhkcnMsIG9ianAtPmV4dF9jbGllbnRfYWRkcmVzcywgMjApKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIHJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfbG9jX25pX2xvY2F0aW9uX3R5cGVfZV90eXBlIChYRFIgKnhkcnMsIHJwY19sb2NfbmlfbG9jYXRpb25fdHlwZV9lX3R5cGUgKm9ianApCi17Ci0gICAgcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0gICAgIGlmICgheGRyX2VudW0gKHhkcnMsIChlbnVtX3QgKikgb2JqcCkpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2NfbmlfZGVmZXJyZWRfbG9jYXRpb25fc190eXBlIChYRFIgKnhkcnMsIHJwY19sb2NfbmlfZGVmZXJyZWRfbG9jYXRpb25fc190eXBlICpvYmpwKQotewotICAgIHJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotICAgICBpZiAoIXhkcl91X2NoYXIgKHhkcnMsICZvYmpwLT51bnVzZWRfYml0cykpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgIGlmICgheGRyX3VfY2hhciAoeGRycywgJm9ianAtPm1zX2F2YWlsYWJsZSkpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2NfbmlfY29kZXdvcmRfc3RyaW5nX3NfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX25pX2NvZGV3b3JkX3N0cmluZ19zX3R5cGUgKm9ianApCi17Ci0gICAgcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0gICAgaW50IGk7Ci0gICAgIGlmICgheGRyX3VfY2hhciAoeGRycywgJm9ianAtPmRhdGFfY29kaW5nX3NjaGVtZSkpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgIGlmICgheGRyX29wYXF1ZSAoeGRycywgb2JqcC0+bGNzX2NvZGV3b3JkX3N0cmluZywgMjApKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICBpZiAoIXhkcl91X2NoYXIgKHhkcnMsICZvYmpwLT5zdHJpbmdfbGVuKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19uaV9zZXJ2aWNlX3R5cGVfaWRfc190eXBlIChYRFIgKnhkcnMsIHJwY19sb2Nfbmlfc2VydmljZV90eXBlX2lkX3NfdHlwZSAqb2JqcCkKLXsKLSAgICByZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLSAgICAgaWYgKCF4ZHJfdV9jaGFyICh4ZHJzLCAmb2JqcC0+bGNzX3NlcnZpY2VfdHlwZV9pZCkpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2NfbmlfdW10c19jcF9ub3RpZnlfdmVyaWZ5X3JlcV9zX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19uaV91bXRzX2NwX25vdGlmeV92ZXJpZnlfcmVxX3NfdHlwZSAqb2JqcCkKLXsKLSAgICByZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLSAgICBpbnQgaTsKLSAgICAgaWYgKCF4ZHJfcnBjX2xvY19uaV9ub3RpZnlfdmVyaWZ5X2VfdHlwZSAoeGRycywgJm9ianAtPm5vdGlmaWNhdGlvbl9wcml2X3R5cGUpKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICBpZiAoIXhkcl91X2NoYXIgKHhkcnMsICZvYmpwLT5pbnZva2VfaWQpKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICBpZiAoIXhkcl9ycGNfdWludDE2ICh4ZHJzLCAmb2JqcC0+ZmxhZ3MpKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICBpZiAoIXhkcl91X2NoYXIgKHhkcnMsICZvYmpwLT5ub3RpZmljYXRpb25fbGVuZ3RoKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgaWYgKCF4ZHJfb3BhcXVlICh4ZHJzLCBvYmpwLT5ub3RpZmljYXRpb25fdGV4dCwgNjQpKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICBpZiAoIXhkcl9ycGNfbG9jX25pX2RhdGFjb2Rpbmdfc2NoZW1lX2VfdHlwZSAoeGRycywgJm9ianAtPmRhdGFjb2Rpbmdfc2NoZW1lKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgaWYgKCF4ZHJfcnBjX2xvY19uaV9leHRfY2xpZW50X2FkZHJlc3Nfc190eXBlICh4ZHJzLCAmb2JqcC0+ZXh0X2NsaWVudF9hZGRyZXNzX2RhdGEpKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICBpZiAoIXhkcl9ycGNfbG9jX25pX2xvY2F0aW9uX3R5cGVfZV90eXBlICh4ZHJzLCAmb2JqcC0+bG9jYXRpb25fdHlwZSkpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgIGlmICgheGRyX3JwY19sb2NfbmlfZGVmZXJyZWRfbG9jYXRpb25fc190eXBlICh4ZHJzLCAmb2JqcC0+ZGVmZXJyZWRfbG9jYXRpb24pKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICBpZiAoIXhkcl9ycGNfbG9jX25pX3JlcXVlc3Rvcl9pZF9zX3R5cGUgKHhkcnMsICZvYmpwLT5yZXF1ZXN0b3JfaWQpKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICBpZiAoIXhkcl9ycGNfbG9jX25pX2NvZGV3b3JkX3N0cmluZ19zX3R5cGUgKHhkcnMsICZvYmpwLT5jb2Rld29yZF9zdHJpbmcpKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICBpZiAoIXhkcl9ycGNfbG9jX25pX3NlcnZpY2VfdHlwZV9pZF9zX3R5cGUgKHhkcnMsICZvYmpwLT5zZXJ2aWNlX3R5cGVfaWQpKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICBpZiAoIXhkcl9ycGNfdWludDE2ICh4ZHJzLCAmb2JqcC0+dXNlcl9yZXNwb25zZV90aW1lcikpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2Nfbmlfc2VydmljZV9pbnRlcmFjdGlvbl9lX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19uaV9zZXJ2aWNlX2ludGVyYWN0aW9uX2VfdHlwZSAqb2JqcCkKLXsKLSAgICByZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLSAgICAgaWYgKCF4ZHJfZW51bSAoeGRycywgKGVudW1fdCAqKSBvYmpwKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19uaV92eF9zZXJ2aWNlX2ludGVyYWN0aW9uX3JlcV9zX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19uaV92eF9zZXJ2aWNlX2ludGVyYWN0aW9uX3JlcV9zX3R5cGUgKm9ianApCi17Ci0gICAgcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0gICAgIGlmICgheGRyX3JwY19sb2Nfbmlfdnhfbm90aWZ5X3ZlcmlmeV9yZXFfc190eXBlICh4ZHJzLCAmb2JqcC0+bmlfdnhfcmVxKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgaWYgKCF4ZHJfcnBjX2xvY19uaV9zZXJ2aWNlX2ludGVyYWN0aW9uX2VfdHlwZSAoeGRycywgJm9ianAtPnNlcnZpY2VfaW50ZXJhdGlvbl90eXBlKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19uaV9ldmVudF9wYXlsb2FkX3VfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX25pX2V2ZW50X3BheWxvYWRfdV90eXBlICpvYmpwKQotewotICAgIHJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotICAgICBpZiAoIXhkcl9ycGNfbG9jX25pX2V2ZW50X2VfdHlwZSAoeGRycywgJm9ianAtPmRpc2MpKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIHN3aXRjaCAob2JqcC0+ZGlzYykgewotICAgIGNhc2UgUlBDX0xPQ19OSV9FVkVOVF9WWF9OT1RJRllfVkVSSUZZX1JFUToKLSAgICAgICAgIGlmICgheGRyX3JwY19sb2Nfbmlfdnhfbm90aWZ5X3ZlcmlmeV9yZXFfc190eXBlICh4ZHJzLCAmb2JqcC0+cnBjX2xvY19uaV9ldmVudF9wYXlsb2FkX3VfdHlwZV91LnZ4X3JlcSkpCi0gICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFJQQ19MT0NfTklfRVZFTlRfU1VQTF9OT1RJRllfVkVSSUZZX1JFUToKLSAgICAgICAgIGlmICgheGRyX3JwY19sb2Nfbmlfc3VwbF9ub3RpZnlfdmVyaWZ5X3JlcV9zX3R5cGUgKHhkcnMsICZvYmpwLT5ycGNfbG9jX25pX2V2ZW50X3BheWxvYWRfdV90eXBlX3Uuc3VwbF9yZXEpKQotICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSUENfTE9DX05JX0VWRU5UX1VNVFNfQ1BfTk9USUZZX1ZFUklGWV9SRVE6Ci0gICAgICAgICBpZiAoIXhkcl9ycGNfbG9jX25pX3VtdHNfY3Bfbm90aWZ5X3ZlcmlmeV9yZXFfc190eXBlICh4ZHJzLCAmb2JqcC0+cnBjX2xvY19uaV9ldmVudF9wYXlsb2FkX3VfdHlwZV91LnVtdHNfY3BfcmVxKSkKLSAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUlBDX0xPQ19OSV9FVkVOVF9WWF9TRVJWSUNFX0lOVEVSQUNUSU9OX1JFUToKLSAgICAgICAgIGlmICgheGRyX3JwY19sb2Nfbmlfdnhfc2VydmljZV9pbnRlcmFjdGlvbl9yZXFfc190eXBlICh4ZHJzLCAmb2JqcC0+cnBjX2xvY19uaV9ldmVudF9wYXlsb2FkX3VfdHlwZV91LnNlcnZpY2VfaW50ZXJhY3Rpb25fcmVxKSkKLSAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19uaV9ldmVudF9zX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19uaV9ldmVudF9zX3R5cGUgKm9ianApCi17Ci0gICAgcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0gICAgIGlmICgheGRyX3JwY19sb2NfbmlfZXZlbnRfZV90eXBlICh4ZHJzLCAmb2JqcC0+ZXZlbnQpKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICBpZiAoIXhkcl9ycGNfbG9jX25pX2V2ZW50X3BheWxvYWRfdV90eXBlICh4ZHJzLCAmb2JqcC0+cGF5bG9hZCkpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2NfYXNzaXN0X2RhdGFfcmVxdWVzdF9lX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19hc3Npc3RfZGF0YV9yZXF1ZXN0X2VfdHlwZSAqb2JqcCkKLXsKLSAgICByZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLSAgICAgaWYgKCF4ZHJfZW51bSAoeGRycywgKGVudW1fdCAqKSBvYmpwKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX3N0cnVjdF9sb2NfdGltZV9kb3dubG9hZF9zb3VyY2Vfc190eXBlX3NlcnZlcnNfcHRyIChYRFIgKnhkcnMsIHJwY19zdHJ1Y3RfbG9jX3RpbWVfZG93bmxvYWRfc291cmNlX3NfdHlwZV9zZXJ2ZXJzX3B0ciAqb2JqcCkKLXsKLSAgICByZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLSAgICAgaWYgKCF4ZHJfc3RyaW5nICh4ZHJzLCBvYmpwLCAyNTYpKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIHJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfc3RydWN0X2xvY190aW1lX2Rvd25sb2FkX3NvdXJjZV9zX3R5cGVfc2VydmVycyAoWERSICp4ZHJzLCBycGNfc3RydWN0X2xvY190aW1lX2Rvd25sb2FkX3NvdXJjZV9zX3R5cGVfc2VydmVycyBvYmpwKQotewotICAgIHJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotICAgICBpZiAoIXhkcl92ZWN0b3IgKHhkcnMsIChjaGFyICopb2JqcCwgMywKLSAgICAgICAgc2l6ZW9mIChycGNfc3RydWN0X2xvY190aW1lX2Rvd25sb2FkX3NvdXJjZV9zX3R5cGVfc2VydmVyc19wdHIpLCAoeGRycHJvY190KSB4ZHJfcnBjX3N0cnVjdF9sb2NfdGltZV9kb3dubG9hZF9zb3VyY2Vfc190eXBlX3NlcnZlcnNfcHRyKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY190aW1lX2Rvd25sb2FkX3NvdXJjZV9zX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY190aW1lX2Rvd25sb2FkX3NvdXJjZV9zX3R5cGUgKm9ianApCi17Ci0gICAgcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0gICAgIGlmICgheGRyX3JwY191aW50MzIgKHhkcnMsICZvYmpwLT5kZWxheV90aHJlc2hvbGQpKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICBpZiAoIXhkcl9ycGNfc3RydWN0X2xvY190aW1lX2Rvd25sb2FkX3NvdXJjZV9zX3R5cGVfc2VydmVycyAoeGRycywgb2JqcC0+c2VydmVycykpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19zdHJ1Y3RfbG9jX3ByZWRpY3RlZF9vcmJpdHNfZGF0YV9zb3VyY2Vfc190eXBlX3NlcnZlcnNfcHRyIChYRFIgKnhkcnMsIHJwY19zdHJ1Y3RfbG9jX3ByZWRpY3RlZF9vcmJpdHNfZGF0YV9zb3VyY2Vfc190eXBlX3NlcnZlcnNfcHRyICpvYmpwKQotewotICAgIHJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotICAgICBpZiAoIXhkcl9zdHJpbmcgKHhkcnMsIG9ianAsIDI1NikpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19zdHJ1Y3RfbG9jX3ByZWRpY3RlZF9vcmJpdHNfZGF0YV9zb3VyY2Vfc190eXBlX3NlcnZlcnMgKFhEUiAqeGRycywgcnBjX3N0cnVjdF9sb2NfcHJlZGljdGVkX29yYml0c19kYXRhX3NvdXJjZV9zX3R5cGVfc2VydmVycyBvYmpwKQotewotICAgIHJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotICAgICBpZiAoIXhkcl92ZWN0b3IgKHhkcnMsIChjaGFyICopb2JqcCwgMywKLSAgICAgICAgc2l6ZW9mIChycGNfc3RydWN0X2xvY19wcmVkaWN0ZWRfb3JiaXRzX2RhdGFfc291cmNlX3NfdHlwZV9zZXJ2ZXJzX3B0ciksICh4ZHJwcm9jX3QpIHhkcl9ycGNfc3RydWN0X2xvY19wcmVkaWN0ZWRfb3JiaXRzX2RhdGFfc291cmNlX3NfdHlwZV9zZXJ2ZXJzX3B0cikpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2NfcHJlZGljdGVkX29yYml0c19kYXRhX3NvdXJjZV9zX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19wcmVkaWN0ZWRfb3JiaXRzX2RhdGFfc291cmNlX3NfdHlwZSAqb2JqcCkKLXsKLSAgICByZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLSAgICAgaWYgKCF4ZHJfcnBjX3VpbnQzMiAoeGRycywgJm9ianAtPm1heF9maWxlX3NpemUpKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICBpZiAoIXhkcl9ycGNfdWludDMyICh4ZHJzLCAmb2JqcC0+bWF4X3BhcnRfc2l6ZSkpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgIGlmICgheGRyX3JwY19zdHJ1Y3RfbG9jX3ByZWRpY3RlZF9vcmJpdHNfZGF0YV9zb3VyY2Vfc190eXBlX3NlcnZlcnMgKHhkcnMsIG9ianAtPnNlcnZlcnMpKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIHJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfbG9jX3Bvc19pbmpfcmVxdWVzdF9zX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19wb3NfaW5qX3JlcXVlc3Rfc190eXBlICpvYmpwKQotewotICAgIHJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotICAgICBpZiAoIXhkcl9ycGNfdWludDMyICh4ZHJzLCAmb2JqcC0+ZmxhZ3MpKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICBpZiAoIXhkcl9kb3VibGUgKHhkcnMsICZvYmpwLT5sYXRpdHVkZSkpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgIGlmICgheGRyX2RvdWJsZSAoeGRycywgJm9ianAtPmxvbmdpdHVkZSkpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgIGlmICgheGRyX3JwY191aW50MzIgKHhkcnMsICZvYmpwLT5wb3NpdGlvbl91bmNlcnRhaW50eSkpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgIGlmICgheGRyX3JwY191aW50NjQgKHhkcnMsICZvYmpwLT50aW1lc3RhbXApKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIHJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfbG9jX2Fzc2lzdF9kYXRhX3JlcXVlc3RfcGF5bG9hZF91X3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19hc3Npc3RfZGF0YV9yZXF1ZXN0X3BheWxvYWRfdV90eXBlICpvYmpwKQotewotICAgIHJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotICAgICBpZiAoIXhkcl9ycGNfbG9jX2Fzc2lzdF9kYXRhX3JlcXVlc3RfZV90eXBlICh4ZHJzLCAmb2JqcC0+ZGlzYykpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgc3dpdGNoIChvYmpwLT5kaXNjKSB7Ci0gICAgY2FzZSBSUENfTE9DX0FTU0lTVF9EQVRBX1RJTUVfUkVROgotICAgICAgICAgaWYgKCF4ZHJfcnBjX2xvY190aW1lX2Rvd25sb2FkX3NvdXJjZV9zX3R5cGUgKHhkcnMsICZvYmpwLT5ycGNfbG9jX2Fzc2lzdF9kYXRhX3JlcXVlc3RfcGF5bG9hZF91X3R5cGVfdS50aW1lX2Rvd25sb2FkKSkKLSAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUlBDX0xPQ19BU1NJU1RfREFUQV9QUkVESUNURURfT1JCSVRTX1JFUToKLSAgICAgICAgIGlmICgheGRyX3JwY19sb2NfcHJlZGljdGVkX29yYml0c19kYXRhX3NvdXJjZV9zX3R5cGUgKHhkcnMsICZvYmpwLT5ycGNfbG9jX2Fzc2lzdF9kYXRhX3JlcXVlc3RfcGF5bG9hZF91X3R5cGVfdS5kYXRhX2Rvd25sb2FkKSkKLSAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUlBDX0xPQ19BU1NJU1RfREFUQV9QT1NJVElPTl9JTkpFQ1RJT05fUkVROgotICAgICAgICAgaWYgKCF4ZHJfcnBjX2xvY19wb3NfaW5qX3JlcXVlc3Rfc190eXBlICh4ZHJzLCAmb2JqcC0+cnBjX2xvY19hc3Npc3RfZGF0YV9yZXF1ZXN0X3BheWxvYWRfdV90eXBlX3UucG9zX2luamVjdGlvbikpCi0gICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2NfYXNzaXN0X2RhdGFfcmVxdWVzdF9zX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19hc3Npc3RfZGF0YV9yZXF1ZXN0X3NfdHlwZSAqb2JqcCkKLXsKLSAgICByZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLSAgICAgaWYgKCF4ZHJfcnBjX2xvY19hc3Npc3RfZGF0YV9yZXF1ZXN0X2VfdHlwZSAoeGRycywgJm9ianAtPmV2ZW50KSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgaWYgKCF4ZHJfcnBjX2xvY19hc3Npc3RfZGF0YV9yZXF1ZXN0X3BheWxvYWRfdV90eXBlICh4ZHJzLCAmb2JqcC0+cGF5bG9hZCkpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2Nfc2VydmVyX2Nvbm5lY3Rpb25faGFuZGxlIChYRFIgKnhkcnMsIHJwY19sb2Nfc2VydmVyX2Nvbm5lY3Rpb25faGFuZGxlICpvYmpwKQotewotICAgIHJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotICAgICBpZiAoIXhkcl9ycGNfdWludDMyICh4ZHJzLCBvYmpwKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19zZXJ2ZXJfcHJvdG9jb2xfZV90eXBlIChYRFIgKnhkcnMsIHJwY19sb2Nfc2VydmVyX3Byb3RvY29sX2VfdHlwZSAqb2JqcCkKLXsKLSAgICByZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLSAgICAgaWYgKCF4ZHJfZW51bSAoeGRycywgKGVudW1fdCAqKSBvYmpwKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19zZXJ2ZXJfY29ubmVjdGlvbl9lX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19zZXJ2ZXJfY29ubmVjdGlvbl9lX3R5cGUgKm9ianApCi17Ci0gICAgcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0gICAgIGlmICgheGRyX2VudW0gKHhkcnMsIChlbnVtX3QgKikgb2JqcCkpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2Nfc2VydmVyX3JlcXVlc3RfZV90eXBlIChYRFIgKnhkcnMsIHJwY19sb2Nfc2VydmVyX3JlcXVlc3RfZV90eXBlICpvYmpwKQotewotICAgIHJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotICAgICBpZiAoIXhkcl9lbnVtICh4ZHJzLCAoZW51bV90ICopIG9ianApKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIHJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfbG9jX3NlcnZlcl9vcGVuX3JlcV9zX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19zZXJ2ZXJfb3Blbl9yZXFfc190eXBlICpvYmpwKQotewotICAgIHJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotICAgICBpZiAoIXhkcl9ycGNfbG9jX3NlcnZlcl9jb25uZWN0aW9uX2hhbmRsZSAoeGRycywgJm9ianAtPmNvbm5faGFuZGxlKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgaWYgKCF4ZHJfcnBjX2xvY19zZXJ2ZXJfcHJvdG9jb2xfZV90eXBlICh4ZHJzLCAmb2JqcC0+cHJvdG9jb2wpKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIHJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfbG9jX3NlcnZlcl9tdWx0aV9vcGVuX3JlcV9zX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19zZXJ2ZXJfbXVsdGlfb3Blbl9yZXFfc190eXBlICpvYmpwKQotewotICAgIHJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotICAgICBpZiAoIXhkcl9ycGNfbG9jX3NlcnZlcl9jb25uZWN0aW9uX2hhbmRsZSAoeGRycywgJm9ianAtPmNvbm5faGFuZGxlKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgaWYgKCF4ZHJfcnBjX2xvY19zZXJ2ZXJfcHJvdG9jb2xfZV90eXBlICh4ZHJzLCAmb2JqcC0+cHJvdG9jb2wpKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICBpZiAoIXhkcl9ycGNfbG9jX3NlcnZlcl9jb25uZWN0aW9uX2VfdHlwZSAoeGRycywgJm9ianAtPmNvbm5lY3Rpb25fdHlwZSkpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2Nfc2VydmVyX2Nsb3NlX3JlcV9zX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19zZXJ2ZXJfY2xvc2VfcmVxX3NfdHlwZSAqb2JqcCkKLXsKLSAgICByZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLSAgICAgaWYgKCF4ZHJfcnBjX2xvY19zZXJ2ZXJfY29ubmVjdGlvbl9oYW5kbGUgKHhkcnMsICZvYmpwLT5jb25uX2hhbmRsZSkpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2Nfc2VydmVyX3JlcXVlc3RfdV90eXBlIChYRFIgKnhkcnMsIHJwY19sb2Nfc2VydmVyX3JlcXVlc3RfdV90eXBlICpvYmpwKQotewotICAgIHJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotICAgICBpZiAoIXhkcl9ycGNfbG9jX3NlcnZlcl9yZXF1ZXN0X2VfdHlwZSAoeGRycywgJm9ianAtPmRpc2MpKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIHN3aXRjaCAob2JqcC0+ZGlzYykgewotICAgIGNhc2UgUlBDX0xPQ19TRVJWRVJfUkVRVUVTVF9PUEVOOgotICAgICAgICAgaWYgKCF4ZHJfcnBjX2xvY19zZXJ2ZXJfb3Blbl9yZXFfc190eXBlICh4ZHJzLCAmb2JqcC0+cnBjX2xvY19zZXJ2ZXJfcmVxdWVzdF91X3R5cGVfdS5vcGVuX3JlcSkpCi0gICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFJQQ19MT0NfU0VSVkVSX1JFUVVFU1RfQ0xPU0U6Ci0gICAgICAgICBpZiAoIXhkcl9ycGNfbG9jX3NlcnZlcl9jbG9zZV9yZXFfc190eXBlICh4ZHJzLCAmb2JqcC0+cnBjX2xvY19zZXJ2ZXJfcmVxdWVzdF91X3R5cGVfdS5jbG9zZV9yZXEpKQotICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSUENfTE9DX1NFUlZFUl9SRVFVRVNUX01VTFRJX09QRU46Ci0gICAgICAgICBpZiAoIXhkcl9ycGNfbG9jX3NlcnZlcl9tdWx0aV9vcGVuX3JlcV9zX3R5cGUgKHhkcnMsICZvYmpwLT5ycGNfbG9jX3NlcnZlcl9yZXF1ZXN0X3VfdHlwZV91Lm11bHRpX29wZW5fcmVxKSkKLSAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19zZXJ2ZXJfcmVxdWVzdF9zX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19zZXJ2ZXJfcmVxdWVzdF9zX3R5cGUgKm9ianApCi17Ci0gICAgcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0gICAgIGlmICgheGRyX3JwY19sb2Nfc2VydmVyX3JlcXVlc3RfZV90eXBlICh4ZHJzLCAmb2JqcC0+ZXZlbnQpKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICBpZiAoIXhkcl9ycGNfbG9jX3NlcnZlcl9yZXF1ZXN0X3VfdHlwZSAoeGRycywgJm9ianAtPnBheWxvYWQpKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIHJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfbG9jX3F3aXBfcmVxdWVzdF9lX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19xd2lwX3JlcXVlc3RfZV90eXBlICpvYmpwKQotewotICAgIHJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotICAgICBpZiAoIXhkcl9lbnVtICh4ZHJzLCAoZW51bV90ICopIG9ianApKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIHJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfbG9jX3F3aXBfcmVxdWVzdF9zX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19xd2lwX3JlcXVlc3Rfc190eXBlICpvYmpwKQotewotICAgIHJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotICAgICBpZiAoIXhkcl9ycGNfbG9jX3F3aXBfcmVxdWVzdF9lX3R5cGUgKHhkcnMsICZvYmpwLT5yZXF1ZXN0X3R5cGUpKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICBpZiAoIXhkcl9ycGNfdWludDE2ICh4ZHJzLCAmb2JqcC0+dGJmX21zKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19yZXNlcnZlZF9wYXlsb2FkX3NfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX3Jlc2VydmVkX3BheWxvYWRfc190eXBlICpvYmpwKQotewotICAgIHJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotICAgICBpZiAoIXhkcl9ycGNfdWludDE2ICh4ZHJzLCAmb2JqcC0+ZGF0YV9zaXplKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgaWYgKCF4ZHJfYnl0ZXMgKHhkcnMsIChjaGFyICoqKSZvYmpwLT5kYXRhLmRhdGFfdmFsLCAodV9pbnQgKikgJm9ianAtPmRhdGEuZGF0YV9sZW4sIH4wKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19pb2N0bF9lX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19pb2N0bF9lX3R5cGUgKm9ianApCi17Ci0gICAgcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0gICAgIGlmICgheGRyX2VudW0gKHhkcnMsIChlbnVtX3QgKikgb2JqcCkpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2NfYXBpX3ZlcnNpb25fc190eXBlIChYRFIgKnhkcnMsIHJwY19sb2NfYXBpX3ZlcnNpb25fc190eXBlICpvYmpwKQotewotICAgIHJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotICAgICBpZiAoIXhkcl91X2NoYXIgKHhkcnMsICZvYmpwLT5tYWpvcikpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgIGlmICgheGRyX3VfY2hhciAoeGRycywgJm9ianAtPm1pbm9yKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19maXhfcmVjdXJyZW5jZV9lX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19maXhfcmVjdXJyZW5jZV9lX3R5cGUgKm9ianApCi17Ci0gICAgcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0gICAgIGlmICgheGRyX2VudW0gKHhkcnMsIChlbnVtX3QgKikgb2JqcCkpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2Nfb3BlcmF0aW9uX21vZGVfZV90eXBlIChYRFIgKnhkcnMsIHJwY19sb2Nfb3BlcmF0aW9uX21vZGVfZV90eXBlICpvYmpwKQotewotICAgIHJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotICAgICBpZiAoIXhkcl9lbnVtICh4ZHJzLCAoZW51bV90ICopIG9ianApKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIHJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfbG9jX25vdGlmeV9lX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19ub3RpZnlfZV90eXBlICpvYmpwKQotewotICAgIHJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotICAgICBpZiAoIXhkcl9lbnVtICh4ZHJzLCAoZW51bV90ICopIG9ianApKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIHJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfbG9jX2ZpeF9jcml0ZXJpYV9zX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19maXhfY3JpdGVyaWFfc190eXBlICpvYmpwKQotewotICAgIHJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotICAgICBpZiAoIXhkcl9ycGNfdWludDMyICh4ZHJzLCAmb2JqcC0+dmFsaWRfbWFzaykpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgIGlmICgheGRyX3JwY19sb2NfZml4X3JlY3VycmVuY2VfZV90eXBlICh4ZHJzLCAmb2JqcC0+cmVjdXJyZW5jZV90eXBlKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgaWYgKCF4ZHJfcnBjX2xvY19vcGVyYXRpb25fbW9kZV9lX3R5cGUgKHhkcnMsICZvYmpwLT5wcmVmZXJyZWRfb3BlcmF0aW9uX21vZGUpKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICBpZiAoIXhkcl9ycGNfdWludDMyICh4ZHJzLCAmb2JqcC0+cHJlZmVycmVkX2FjY3VyYWN5KSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgaWYgKCF4ZHJfcnBjX3VpbnQzMiAoeGRycywgJm9ianAtPnByZWZlcnJlZF9yZXNwb25zZV90aW1lKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgaWYgKCF4ZHJfcnBjX2Jvb2xlYW4gKHhkcnMsICZvYmpwLT5pbnRlcm1lZGlhdGVfcG9zX3JlcG9ydF9lbmFibGVkKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgaWYgKCF4ZHJfcnBjX2xvY19ub3RpZnlfZV90eXBlICh4ZHJzLCAmb2JqcC0+bm90aWZ5X3R5cGUpKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICBpZiAoIXhkcl9ycGNfdWludDMyICh4ZHJzLCAmb2JqcC0+bWluX2ludGVydmFsKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgaWYgKCF4ZHJfZmxvYXQgKHhkcnMsICZvYmpwLT5taW5fZGlzdGFuY2UpKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICBpZiAoIXhkcl9ycGNfdWludDMyICh4ZHJzLCAmb2JqcC0+bWluX2Rpc3Rfc2FtcGxlX2ludGVydmFsKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19uaV91c2VyX3Jlc3BfZV90eXBlIChYRFIgKnhkcnMsIHJwY19sb2NfbmlfdXNlcl9yZXNwX2VfdHlwZSAqb2JqcCkKLXsKLSAgICByZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLSAgICAgaWYgKCF4ZHJfZW51bSAoeGRycywgKGVudW1fdCAqKSBvYmpwKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY191c2VyX3ZlcmlmeV9zX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY191c2VyX3ZlcmlmeV9zX3R5cGUgKm9ianApCi17Ci0gICAgcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0gICAgIGlmICgheGRyX3JwY19sb2NfbmlfdXNlcl9yZXNwX2VfdHlwZSAoeGRycywgJm9ianAtPnVzZXJfcmVzcCkpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgIGlmICgheGRyX3JwY19sb2NfbmlfZXZlbnRfc190eXBlICh4ZHJzLCAmb2JqcC0+bmlfZXZlbnRfcGFzc19iYWNrKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19wcmVkaWN0ZWRfb3JiaXRzX2RhdGFfZm9ybWF0X2VfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX3ByZWRpY3RlZF9vcmJpdHNfZGF0YV9mb3JtYXRfZV90eXBlICpvYmpwKQotewotICAgIHJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotICAgICBpZiAoIXhkcl9lbnVtICh4ZHJzLCAoZW51bV90ICopIG9ianApKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIHJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfbG9jX3ByZWRpY3RlZF9vcmJpdHNfZGF0YV9zX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19wcmVkaWN0ZWRfb3JiaXRzX2RhdGFfc190eXBlICpvYmpwKQotewotICAgIHJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotICAgICBpZiAoIXhkcl9ycGNfbG9jX3ByZWRpY3RlZF9vcmJpdHNfZGF0YV9mb3JtYXRfZV90eXBlICh4ZHJzLCAmb2JqcC0+Zm9ybWF0X3R5cGUpKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICBpZiAoIXhkcl9ycGNfdWludDMyICh4ZHJzLCAmb2JqcC0+dG90YWxfc2l6ZSkpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgIGlmICgheGRyX3JwY191aW50OCAoeGRycywgJm9ianAtPnRvdGFsX3BhcnRzKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgaWYgKCF4ZHJfcnBjX3VpbnQ4ICh4ZHJzLCAmb2JqcC0+cGFydCkpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgIGlmICgheGRyX3JwY191aW50MTYgKHhkcnMsICZvYmpwLT5wYXJ0X2xlbikpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgIGlmICgheGRyX2J5dGVzICh4ZHJzLCAoY2hhciAqKikmb2JqcC0+ZGF0YV9wdHIuZGF0YV9wdHJfdmFsLCAodV9pbnQgKikgJm9ianAtPmRhdGFfcHRyLmRhdGFfcHRyX2xlbiwgfjApKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIHJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfbG9jX3ByZWRpY3RlZF9vcmJpdHNfZGF0YV92YWxpZGl0eV9yZXBvcnRfc190eXBlIChYRFIgKnhkcnMsIHJwY19sb2NfcHJlZGljdGVkX29yYml0c19kYXRhX3ZhbGlkaXR5X3JlcG9ydF9zX3R5cGUgKm9ianApCi17Ci0gICAgcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0gICAgIGlmICgheGRyX3JwY191aW50NjQgKHhkcnMsICZvYmpwLT5zdGFydF90aW1lX3V0YykpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgIGlmICgheGRyX3JwY191aW50MTYgKHhkcnMsICZvYmpwLT52YWxpZF9kdXJhdGlvbl9ocnMpKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIHJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfbG9jX3ByZWRpY3RlZF9vcmJpdHNfYXV0b19kb3dubG9hZF9jb25maWdfc190eXBlIChYRFIgKnhkcnMsIHJwY19sb2NfcHJlZGljdGVkX29yYml0c19hdXRvX2Rvd25sb2FkX2NvbmZpZ19zX3R5cGUgKm9ianApCi17Ci0gICAgcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0gICAgIGlmICgheGRyX3JwY19ib29sZWFuICh4ZHJzLCAmb2JqcC0+ZW5hYmxlKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgaWYgKCF4ZHJfdV9jaGFyICh4ZHJzLCAmb2JqcC0+YXV0b19jaGVja19ldmVyeV9ocnMpKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIHJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfbG9jX2Fzc2lzdF9kYXRhX3RpbWVfc190eXBlIChYRFIgKnhkcnMsIHJwY19sb2NfYXNzaXN0X2RhdGFfdGltZV9zX3R5cGUgKm9ianApCi17Ci0gICAgcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0gICAgIGlmICgheGRyX3JwY191aW50NjQgKHhkcnMsICZvYmpwLT50aW1lX3V0YykpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgIGlmICgheGRyX3JwY191aW50MzIgKHhkcnMsICZvYmpwLT51bmNlcnRhaW50eSkpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2NfYXNzaXN0X3Bvc192YWxpZF9tYXNrX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19hc3Npc3RfcG9zX3ZhbGlkX21hc2tfdHlwZSAqb2JqcCkKLXsKLSAgICByZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLSAgICAgaWYgKCF4ZHJfcnBjX3VpbnQ2NCAoeGRycywgb2JqcCkpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2NfYXNzaXN0X2RhdGFfcG9zX3NfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX2Fzc2lzdF9kYXRhX3Bvc19zX3R5cGUgKm9ianApCi17Ci0gICAgcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0gICAgIGlmICgheGRyX3JwY19sb2NfYXNzaXN0X3Bvc192YWxpZF9tYXNrX3R5cGUgKHhkcnMsICZvYmpwLT52YWxpZF9tYXNrKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgaWYgKCF4ZHJfcnBjX3VpbnQ2NCAoeGRycywgJm9ianAtPnRpbWVzdGFtcF91dGMpKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICBpZiAoIXhkcl9kb3VibGUgKHhkcnMsICZvYmpwLT5sYXRpdHVkZSkpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgIGlmICgheGRyX2RvdWJsZSAoeGRycywgJm9ianAtPmxvbmdpdHVkZSkpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgIGlmICgheGRyX2Zsb2F0ICh4ZHJzLCAmb2JqcC0+YWx0aXR1ZGVfd3J0X2VsbGlwc29pZCkpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgIGlmICgheGRyX2Zsb2F0ICh4ZHJzLCAmb2JqcC0+YWx0aXR1ZGVfd3J0X21lYW5fc2VhX2xldmVsKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgaWYgKCF4ZHJfZmxvYXQgKHhkcnMsICZvYmpwLT5ob3JfdW5jX2NpcmN1bGFyKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgaWYgKCF4ZHJfZmxvYXQgKHhkcnMsICZvYmpwLT52ZXJ0X3VuYykpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgIGlmICgheGRyX3VfY2hhciAoeGRycywgJm9ianAtPmNvbmZpZGVuY2VfaG9yaXpvbnRhbCkpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgIGlmICgheGRyX3VfY2hhciAoeGRycywgJm9ianAtPmNvbmZpZGVuY2VfdmVydGljYWwpKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICBpZiAoIXhkcl9ycGNfaW50MzIgKHhkcnMsICZvYmpwLT50aW1lc3RhbXBfYWdlKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19zZXJ2ZXJfb3Blbl9zdGF0dXNfZV90eXBlIChYRFIgKnhkcnMsIHJwY19sb2Nfc2VydmVyX29wZW5fc3RhdHVzX2VfdHlwZSAqb2JqcCkKLXsKLSAgICByZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLSAgICAgaWYgKCF4ZHJfZW51bSAoeGRycywgKGVudW1fdCAqKSBvYmpwKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19zZXJ2ZXJfcGRwX3R5cGVfZV90eXBlIChYRFIgKnhkcnMsIHJwY19sb2Nfc2VydmVyX3BkcF90eXBlX2VfdHlwZSAqb2JqcCkKLXsKLSAgICByZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLSAgICAgaWYgKCF4ZHJfZW51bSAoeGRycywgKGVudW1fdCAqKSBvYmpwKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19zZXJ2ZXJfb3Blbl9zdGF0dXNfc190eXBlIChYRFIgKnhkcnMsIHJwY19sb2Nfc2VydmVyX29wZW5fc3RhdHVzX3NfdHlwZSAqb2JqcCkKLXsKLSAgICByZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLSAgICBpbnQgaTsKLSAgICAgaWYgKCF4ZHJfcnBjX2xvY19zZXJ2ZXJfY29ubmVjdGlvbl9oYW5kbGUgKHhkcnMsICZvYmpwLT5jb25uX2hhbmRsZSkpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgIGlmICgheGRyX3JwY19sb2Nfc2VydmVyX29wZW5fc3RhdHVzX2VfdHlwZSAoeGRycywgJm9ianAtPm9wZW5fc3RhdHVzKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgaWYgKCF4ZHJfb3BhcXVlICh4ZHJzLCBvYmpwLT5hcG5fbmFtZSwgMTAwKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19zZXJ2ZXJfbXVsdGlfb3Blbl9zdGF0dXNfc190eXBlIChYRFIgKnhkcnMsIHJwY19sb2Nfc2VydmVyX211bHRpX29wZW5fc3RhdHVzX3NfdHlwZSAqb2JqcCkKLXsKLSAgICByZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLSAgICBpbnQgaTsKLSAgICAgaWYgKCF4ZHJfcnBjX2xvY19zZXJ2ZXJfY29ubmVjdGlvbl9oYW5kbGUgKHhkcnMsICZvYmpwLT5jb25uX2hhbmRsZSkpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgIGlmICgheGRyX3JwY19sb2Nfc2VydmVyX29wZW5fc3RhdHVzX2VfdHlwZSAoeGRycywgJm9ianAtPm9wZW5fc3RhdHVzKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgaWYgKCF4ZHJfcnBjX2xvY19zZXJ2ZXJfcGRwX3R5cGVfZV90eXBlICh4ZHJzLCAmb2JqcC0+cGRwX3R5cGUpKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICBpZiAoIXhkcl9vcGFxdWUgKHhkcnMsIG9ianAtPmFwbl9uYW1lLCAxMDApKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIHJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfbG9jX3NlcnZlcl9jbG9zZV9zdGF0dXNfZV90eXBlIChYRFIgKnhkcnMsIHJwY19sb2Nfc2VydmVyX2Nsb3NlX3N0YXR1c19lX3R5cGUgKm9ianApCi17Ci0gICAgcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0gICAgIGlmICgheGRyX2VudW0gKHhkcnMsIChlbnVtX3QgKikgb2JqcCkpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2Nfc2VydmVyX2Nsb3NlX3N0YXR1c19zX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19zZXJ2ZXJfY2xvc2Vfc3RhdHVzX3NfdHlwZSAqb2JqcCkKLXsKLSAgICByZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLSAgICAgaWYgKCF4ZHJfcnBjX2xvY19zZXJ2ZXJfY29ubmVjdGlvbl9oYW5kbGUgKHhkcnMsICZvYmpwLT5jb25uX2hhbmRsZSkpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgIGlmICgheGRyX3JwY19sb2Nfc2VydmVyX2Nsb3NlX3N0YXR1c19lX3R5cGUgKHhkcnMsICZvYmpwLT5jbG9zZV9zdGF0dXMpKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIHJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfbG9jX3dpcGVyX2ZpeF90aW1lX3NfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX3dpcGVyX2ZpeF90aW1lX3NfdHlwZSAqb2JqcCkKLXsKLSAgICByZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLSAgICAgaWYgKCF4ZHJfcnBjX3VpbnQzMiAoeGRycywgJm9ianAtPnNsb3dfY2xvY2tfY291bnQpKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIHJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfbG9jX3dpcGVyX2ZpeF9wb3Nfc190eXBlIChYRFIgKnhkcnMsIHJwY19sb2Nfd2lwZXJfZml4X3Bvc19zX3R5cGUgKm9ianApCi17Ci0gICAgcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0gICAgIGlmICgheGRyX3JwY19pbnQzMiAoeGRycywgJm9ianAtPmxhdCkpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgIGlmICgheGRyX3JwY19pbnQzMiAoeGRycywgJm9ianAtPmxvbikpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgIGlmICgheGRyX3JwY191aW50MTYgKHhkcnMsICZvYmpwLT5IRVBFKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgaWYgKCF4ZHJfcnBjX3VpbnQ4ICh4ZHJzLCAmb2JqcC0+bnVtX29mX2Fwc191c2VkKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgaWYgKCF4ZHJfcnBjX3VpbnQ4ICh4ZHJzLCAmb2JqcC0+Zml4X2Vycm9yX2NvZGUpKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIHJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfbG9jX3dpcGVyX2FwX2luZm9fc190eXBlIChYRFIgKnhkcnMsIHJwY19sb2Nfd2lwZXJfYXBfaW5mb19zX3R5cGUgKm9ianApCi17Ci0gICAgcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0gICAgaW50IGk7Ci0gICAgIGlmICgheGRyX29wYXF1ZSAoeGRycywgb2JqcC0+bWFjX2FkZHIsIDYpKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICBpZiAoIXhkcl9ycGNfaW50MzIgKHhkcnMsICZvYmpwLT5yc3NpKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgaWYgKCF4ZHJfcnBjX3VpbnQxNiAoeGRycywgJm9ianAtPmNoYW5uZWwpKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICBpZiAoIXhkcl9ycGNfdWludDggKHhkcnMsICZvYmpwLT5hcF9xdWFsaWZpZXIpKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIHJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfbG9jX3dpcGVyX2FwX3NldF9zX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY193aXBlcl9hcF9zZXRfc190eXBlICpvYmpwKQotewotICAgIHJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotICAgIGludCBpOwotICAgICBpZiAoIXhkcl9ycGNfdWludDggKHhkcnMsICZvYmpwLT5udW1fb2ZfYXBzKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgaWYgKCF4ZHJfdmVjdG9yICh4ZHJzLCAoY2hhciAqKW9ianAtPmFwX2luZm8sIDUwLAotICAgICAgICBzaXplb2YgKHJwY19sb2Nfd2lwZXJfYXBfaW5mb19zX3R5cGUpLCAoeGRycHJvY190KSB4ZHJfcnBjX2xvY193aXBlcl9hcF9pbmZvX3NfdHlwZSkpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2Nfd2lwZXJfcG9zaXRpb25fcmVwb3J0X3NfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX3dpcGVyX3Bvc2l0aW9uX3JlcG9ydF9zX3R5cGUgKm9ianApCi17Ci0gICAgcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0gICAgIGlmICgheGRyX3JwY191aW50OCAoeGRycywgJm9ianAtPndpcGVyX3ZhbGlkX2luZm9fZmxhZykpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgIGlmICgheGRyX3JwY19sb2Nfd2lwZXJfZml4X3RpbWVfc190eXBlICh4ZHJzLCAmb2JqcC0+d2lwZXJfZml4X3RpbWUpKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICBpZiAoIXhkcl9ycGNfbG9jX3dpcGVyX2ZpeF9wb3Nfc190eXBlICh4ZHJzLCAmb2JqcC0+d2lwZXJfZml4X3Bvc2l0aW9uKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgaWYgKCF4ZHJfcnBjX2xvY193aXBlcl9hcF9zZXRfc190eXBlICh4ZHJzLCAmb2JqcC0+d2lwZXJfYXBfc2V0KSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY193aXBlcl9zdGF0dXNfZV90eXBlIChYRFIgKnhkcnMsIHJwY19sb2Nfd2lwZXJfc3RhdHVzX2VfdHlwZSAqb2JqcCkKLXsKLSAgICByZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLSAgICAgaWYgKCF4ZHJfZW51bSAoeGRycywgKGVudW1fdCAqKSBvYmpwKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19mc19vcGVyYXRpb25fZV90eXBlIChYRFIgKnhkcnMsIHJwY19sb2NfZnNfb3BlcmF0aW9uX2VfdHlwZSAqb2JqcCkKLXsKLSAgICByZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLSAgICAgaWYgKCF4ZHJfZW51bSAoeGRycywgKGVudW1fdCAqKSBvYmpwKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19lZnNfZGF0YV9zX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19lZnNfZGF0YV9zX3R5cGUgKm9ianApCi17Ci0gICAgcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0gICAgaW50IGk7Ci0gICAgIGlmICgheGRyX29wYXF1ZSAoeGRycywgb2JqcC0+ZmlsZW5hbWUsIDY0KSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgaWYgKCF4ZHJfcnBjX2xvY19mc19vcGVyYXRpb25fZV90eXBlICh4ZHJzLCAmb2JqcC0+b3BlcmF0aW9uKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgaWYgKCF4ZHJfcnBjX3VpbnQzMiAoeGRycywgJm9ianAtPnRvdGFsX3NpemUpKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICBpZiAoIXhkcl9ieXRlcyAoeGRycywgKGNoYXIgKiopJm9ianAtPmRhdGFfcHRyLmRhdGFfcHRyX3ZhbCwgKHVfaW50ICopICZvYmpwLT5kYXRhX3B0ci5kYXRhX3B0cl9sZW4sIH4wKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgaWYgKCF4ZHJfcnBjX3VpbnQzMiAoeGRycywgJm9ianAtPnBhcnRfbGVuKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgaWYgKCF4ZHJfcnBjX3VpbnQ4ICh4ZHJzLCAmb2JqcC0+cGFydCkpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgIGlmICgheGRyX3JwY191aW50OCAoeGRycywgJm9ianAtPnRvdGFsX3BhcnRzKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgaWYgKCF4ZHJfcnBjX3VpbnQzMiAoeGRycywgJm9ianAtPnJlc2VydmVkKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19lcnJvcl9lc3RpbWF0ZV9jb25maWdfZV90eXBlIChYRFIgKnhkcnMsIHJwY19sb2NfZXJyb3JfZXN0aW1hdGVfY29uZmlnX2VfdHlwZSAqb2JqcCkKLXsKLSAgICByZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLSAgICAgaWYgKCF4ZHJfZW51bSAoeGRycywgKGVudW1fdCAqKSBvYmpwKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19hcG5fcHJvZmlsZXNfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX2Fwbl9wcm9maWxlc190eXBlICpvYmpwKQotewotICAgIHJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotICAgIGludCBpOwotICAgICBpZiAoIXhkcl9ycGNfdWludDMyICh4ZHJzLCAmb2JqcC0+c3J2X3N5c3RlbV90eXBlKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgaWYgKCF4ZHJfcnBjX3VpbnQzMiAoeGRycywgJm9ianAtPnBkcF90eXBlKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgaWYgKCF4ZHJfcnBjX3VpbnQzMiAoeGRycywgJm9ianAtPnJlc2VydmVkKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgaWYgKCF4ZHJfb3BhcXVlICh4ZHJzLCBvYmpwLT5hcG5fbmFtZSwgMTAwKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19sb2NrX2VfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX2xvY2tfZV90eXBlICpvYmpwKQotewotICAgIHJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotICAgICBpZiAoIXhkcl9lbnVtICh4ZHJzLCAoZW51bV90ICopIG9ianApKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIHJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfbG9jX25tZWFfc2VudGVuY2VfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX25tZWFfc2VudGVuY2VfdHlwZSAqb2JqcCkKLXsKLSAgICByZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLSAgICAgaWYgKCF4ZHJfcnBjX3VpbnQzMiAoeGRycywgb2JqcCkpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2NfYXNzaXN0X2RhdGFfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX2Fzc2lzdF9kYXRhX3R5cGUgKm9ianApCi17Ci0gICAgcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0gICAgIGlmICgheGRyX3JwY191aW50MzIgKHhkcnMsIG9ianApKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIHJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfbG9jX2Fzc2lzdF9kYXRhX2RlbGV0ZV9zX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19hc3Npc3RfZGF0YV9kZWxldGVfc190eXBlICpvYmpwKQotewotICAgIHJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotICAgIGludCBpOwotICAgICBpZiAoIXhkcl9ycGNfbG9jX2Fzc2lzdF9kYXRhX3R5cGUgKHhkcnMsICZvYmpwLT50eXBlKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgaWYgKCF4ZHJfdmVjdG9yICh4ZHJzLCAoY2hhciAqKW9ianAtPnJlc2VydmVkLCA4LAotICAgICAgICBzaXplb2YgKHJwY191aW50MzIpLCAoeGRycHJvY190KSB4ZHJfcnBjX3VpbnQzMikpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2NfaW9jdGxfZGF0YV91X3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19pb2N0bF9kYXRhX3VfdHlwZSAqb2JqcCkKLXsKLSAgICByZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLSAgICAgaWYgKCF4ZHJfcnBjX2xvY19pb2N0bF9lX3R5cGUgKHhkcnMsICZvYmpwLT5kaXNjKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICBzd2l0Y2ggKG9ianAtPmRpc2MpIHsKLSAgICBjYXNlIFJQQ19MT0NfSU9DVExfU0VUX0ZJWF9DUklURVJJQToKLSAgICAgICAgIGlmICgheGRyX3JwY19sb2NfZml4X2NyaXRlcmlhX3NfdHlwZSAoeGRycywgJm9ianAtPnJwY19sb2NfaW9jdGxfZGF0YV91X3R5cGVfdS5maXhfY3JpdGVyaWEpKQotICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSUENfTE9DX0lPQ1RMX0lORk9STV9OSV9VU0VSX1JFU1BPTlNFOgotICAgICAgICAgaWYgKCF4ZHJfcnBjX2xvY191c2VyX3ZlcmlmeV9zX3R5cGUgKHhkcnMsICZvYmpwLT5ycGNfbG9jX2lvY3RsX2RhdGFfdV90eXBlX3UudXNlcl92ZXJpZnlfcmVzcCkpCi0gICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFJQQ19MT0NfSU9DVExfSU5KRUNUX1BSRURJQ1RFRF9PUkJJVFNfREFUQToKLSAgICAgICAgIGlmICgheGRyX3JwY19sb2NfcHJlZGljdGVkX29yYml0c19kYXRhX3NfdHlwZSAoeGRycywgJm9ianAtPnJwY19sb2NfaW9jdGxfZGF0YV91X3R5cGVfdS5wcmVkaWN0ZWRfb3JiaXRzX2RhdGEpKQotICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSUENfTE9DX0lPQ1RMX1NFVF9QUkVESUNURURfT1JCSVRTX0RBVEFfQVVUT19ET1dOTE9BRDoKLSAgICAgICAgIGlmICgheGRyX3JwY19sb2NfcHJlZGljdGVkX29yYml0c19hdXRvX2Rvd25sb2FkX2NvbmZpZ19zX3R5cGUgKHhkcnMsICZvYmpwLT5ycGNfbG9jX2lvY3RsX2RhdGFfdV90eXBlX3UucHJlZGljdGVkX29yYml0c19hdXRvX2Rvd25sb2FkKSkKLSAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUlBDX0xPQ19JT0NUTF9JTkpFQ1RfVVRDX1RJTUU6Ci0gICAgICAgICBpZiAoIXhkcl9ycGNfbG9jX2Fzc2lzdF9kYXRhX3RpbWVfc190eXBlICh4ZHJzLCAmb2JqcC0+cnBjX2xvY19pb2N0bF9kYXRhX3VfdHlwZV91LmFzc2lzdGFuY2VfZGF0YV90aW1lKSkKLSAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUlBDX0xPQ19JT0NUTF9JTkpFQ1RfUE9TSVRJT046Ci0gICAgICAgICBpZiAoIXhkcl9ycGNfbG9jX2Fzc2lzdF9kYXRhX3Bvc19zX3R5cGUgKHhkcnMsICZvYmpwLT5ycGNfbG9jX2lvY3RsX2RhdGFfdV90eXBlX3UuYXNzaXN0YW5jZV9kYXRhX3Bvc2l0aW9uKSkKLSAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUlBDX0xPQ19JT0NUTF9JTkZPUk1fU0VSVkVSX09QRU5fU1RBVFVTOgotICAgICAgICAgaWYgKCF4ZHJfcnBjX2xvY19zZXJ2ZXJfb3Blbl9zdGF0dXNfc190eXBlICh4ZHJzLCAmb2JqcC0+cnBjX2xvY19pb2N0bF9kYXRhX3VfdHlwZV91LmNvbm5fb3Blbl9zdGF0dXMpKQotICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSUENfTE9DX0lPQ1RMX0lORk9STV9TRVJWRVJfQ0xPU0VfU1RBVFVTOgotICAgICAgICAgaWYgKCF4ZHJfcnBjX2xvY19zZXJ2ZXJfY2xvc2Vfc3RhdHVzX3NfdHlwZSAoeGRycywgJm9ianAtPnJwY19sb2NfaW9jdGxfZGF0YV91X3R5cGVfdS5jb25uX2Nsb3NlX3N0YXR1cykpCi0gICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFJQQ19MT0NfSU9DVExfU0VORF9XSVBFUl9QT1NJVElPTl9SRVBPUlQ6Ci0gICAgICAgICBpZiAoIXhkcl9ycGNfbG9jX3dpcGVyX3Bvc2l0aW9uX3JlcG9ydF9zX3R5cGUgKHhkcnMsICZvYmpwLT5ycGNfbG9jX2lvY3RsX2RhdGFfdV90eXBlX3Uud2lwZXJfcG9zKSkKLSAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUlBDX0xPQ19JT0NUTF9OT1RJRllfV0lQRVJfU1RBVFVTOgotICAgICAgICAgaWYgKCF4ZHJfcnBjX2xvY193aXBlcl9zdGF0dXNfZV90eXBlICh4ZHJzLCAmb2JqcC0+cnBjX2xvY19pb2N0bF9kYXRhX3VfdHlwZV91LndpcGVyX3N0YXR1cykpCi0gICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFJQQ19MT0NfSU9DVExfU0VUX0VOR0lORV9MT0NLOgotICAgICAgICAgaWYgKCF4ZHJfcnBjX2xvY19sb2NrX2VfdHlwZSAoeGRycywgJm9ianAtPnJwY19sb2NfaW9jdGxfZGF0YV91X3R5cGVfdS5lbmdpbmVfbG9jaykpCi0gICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFJQQ19MT0NfSU9DVExfU0VUX1NCQVNfQ09ORklHOgotICAgICAgICAgaWYgKCF4ZHJfcnBjX2Jvb2xlYW4gKHhkcnMsICZvYmpwLT5ycGNfbG9jX2lvY3RsX2RhdGFfdV90eXBlX3Uuc2Jhc19tb2RlKSkKLSAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUlBDX0xPQ19JT0NUTF9TRVRfTk1FQV9UWVBFUzoKLSAgICAgICAgIGlmICgheGRyX3JwY19sb2Nfbm1lYV9zZW50ZW5jZV90eXBlICh4ZHJzLCAmb2JqcC0+cnBjX2xvY19pb2N0bF9kYXRhX3VfdHlwZV91Lm5tZWFfdHlwZXMpKQotICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSUENfTE9DX0lPQ1RMX1NFVF9PTl9ERU1BTkRfTFBNOgotICAgICAgICAgaWYgKCF4ZHJfcnBjX2Jvb2xlYW4gKHhkcnMsICZvYmpwLT5ycGNfbG9jX2lvY3RsX2RhdGFfdV90eXBlX3Uub25fZGVtYW5kX2xwbSkpCi0gICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFJQQ19MT0NfSU9DVExfU0VUX0NETUFfUERFX1NFUlZFUl9BRERSOgotICAgIGNhc2UgUlBDX0xPQ19JT0NUTF9TRVRfQ0RNQV9NUENfU0VSVkVSX0FERFI6Ci0gICAgY2FzZSBSUENfTE9DX0lPQ1RMX1NFVF9VTVRTX1NMUF9TRVJWRVJfQUREUjoKLSAgICBjYXNlIFJQQ19MT0NfSU9DVExfU0VUX0NVU1RPTV9QREVfU0VSVkVSX0FERFI6Ci0gICAgICAgICBpZiAoIXhkcl9ycGNfbG9jX3NlcnZlcl9pbmZvX3NfdHlwZSAoeGRycywgJm9ianAtPnJwY19sb2NfaW9jdGxfZGF0YV91X3R5cGVfdS5zZXJ2ZXJfYWRkcikpCi0gICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFJQQ19MT0NfSU9DVExfREVMRVRFX0FTU0lTVF9EQVRBOgotICAgICAgICAgaWYgKCF4ZHJfcnBjX2xvY19hc3Npc3RfZGF0YV9kZWxldGVfc190eXBlICh4ZHJzLCAmb2JqcC0+cnBjX2xvY19pb2N0bF9kYXRhX3VfdHlwZV91LmFzc2lzdF9kYXRhX2RlbGV0ZSkpCi0gICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFJQQ19MT0NfSU9DVExfQUNDRVNTX0VGU19EQVRBOgotICAgICAgICAgaWYgKCF4ZHJfcnBjX2xvY19lZnNfZGF0YV9zX3R5cGUgKHhkcnMsICZvYmpwLT5ycGNfbG9jX2lvY3RsX2RhdGFfdV90eXBlX3UuZWZzX2RhdGEpKQotICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSUENfTE9DX0lPQ1RMX0VSUk9SX0VTVElNQVRFX0NPTkZJRzoKLSAgICAgICAgIGlmICgheGRyX3JwY19sb2NfZXJyb3JfZXN0aW1hdGVfY29uZmlnX2VfdHlwZSAoeGRycywgJm9ianAtPnJwY19sb2NfaW9jdGxfZGF0YV91X3R5cGVfdS5lcnJvcl9lc3RpbWF0ZV9jb25maWcpKQotICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSUENfTE9DX0lPQ1RMX1NFVF9YVFJBX1RfU0VTU0lPTl9DT05UUk9MOgotICAgICAgICAgaWYgKCF4ZHJfcnBjX3VpbnQ4ICh4ZHJzLCAmb2JqcC0+cnBjX2xvY19pb2N0bF9kYXRhX3VfdHlwZV91Lnh0cmFfdF9zZXNzaW9uX2NvbnRyb2wpKQotICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSUENfTE9DX0lPQ1RMX1NFVF9MQlNfQVBOX1BST0ZJTEU6Ci0gICAgY2FzZSBSUENfTE9DX0lPQ1RMX1NFVF9YVFJBX0FQTl9QUk9GSUxFOgotICAgICAgICAgaWYgKCF4ZHJfdmVjdG9yICh4ZHJzLCAoY2hhciAqKW9ianAtPnJwY19sb2NfaW9jdGxfZGF0YV91X3R5cGVfdS5hcG5fcHJvZmlsZXMsIDYsCi0gICAgICAgICAgICBzaXplb2YgKHJwY19sb2NfYXBuX3Byb2ZpbGVzX3R5cGUpLCAoeGRycHJvY190KSB4ZHJfcnBjX2xvY19hcG5fcHJvZmlsZXNfdHlwZSkpCi0gICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFJQQ19MT0NfSU9DVExfU0VUX0RBVEFfRU5BQkxFOgotICAgICAgICAgaWYgKCF4ZHJfcnBjX2Jvb2xlYW4gKHhkcnMsICZvYmpwLT5ycGNfbG9jX2lvY3RsX2RhdGFfdV90eXBlX3UuZGF0YV9lbmFibGUpKQotICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSUENfTE9DX0lPQ1RMX1NFVF9TVVBMX1ZFUlNJT046Ci0gICAgICAgICBpZiAoIXhkcl9ycGNfdWludDMyICh4ZHJzLCAmb2JqcC0+cnBjX2xvY19pb2N0bF9kYXRhX3VfdHlwZV91LnN1cGxfdmVyc2lvbikpCi0gICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFJQQ19MT0NfSU9DVExfSU5GT1JNX1NFUlZFUl9NVUxUSV9PUEVOX1NUQVRVUzoKLSAgICAgICAgIGlmICgheGRyX3JwY19sb2Nfc2VydmVyX211bHRpX29wZW5fc3RhdHVzX3NfdHlwZSAoeGRycywgJm9ianAtPnJwY19sb2NfaW9jdGxfZGF0YV91X3R5cGVfdS5tdWx0aV9jb25uX29wZW5fc3RhdHVzKSkKLSAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUlBDX0xPQ19JT0NUTF9SRVNFUlZFRF9DTUQ6Ci0gICAgICAgICBpZiAoIXhkcl9ycGNfbG9jX3Jlc2VydmVkX3BheWxvYWRfc190eXBlICh4ZHJzLCAmb2JqcC0+cnBjX2xvY19pb2N0bF9kYXRhX3VfdHlwZV91LnJlc2VydmVkKSkKLSAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19pb2N0bF9jYWxsYmFja19kYXRhX3VfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX2lvY3RsX2NhbGxiYWNrX2RhdGFfdV90eXBlICpvYmpwKQotewotICAgIHJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotICAgICBpZiAoIXhkcl9ycGNfbG9jX2lvY3RsX2VfdHlwZSAoeGRycywgJm9ianAtPmRpc2MpKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIHN3aXRjaCAob2JqcC0+ZGlzYykgewotICAgIGNhc2UgUlBDX0xPQ19JT0NUTF9HRVRfQVBJX1ZFUlNJT046Ci0gICAgICAgICBpZiAoIXhkcl9ycGNfbG9jX2FwaV92ZXJzaW9uX3NfdHlwZSAoeGRycywgJm9ianAtPnJwY19sb2NfaW9jdGxfY2FsbGJhY2tfZGF0YV91X3R5cGVfdS5hcGlfdmVyc2lvbikpCi0gICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFJQQ19MT0NfSU9DVExfR0VUX0ZJWF9DUklURVJJQToKLSAgICAgICAgIGlmICgheGRyX3JwY19sb2NfZml4X2NyaXRlcmlhX3NfdHlwZSAoeGRycywgJm9ianAtPnJwY19sb2NfaW9jdGxfY2FsbGJhY2tfZGF0YV91X3R5cGVfdS5maXhfY3JpdGVyaWEpKQotICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSUENfTE9DX0lPQ1RMX0dFVF9FTkdJTkVfTE9DSzoKLSAgICAgICAgIGlmICgheGRyX3JwY19sb2NfbG9ja19lX3R5cGUgKHhkcnMsICZvYmpwLT5ycGNfbG9jX2lvY3RsX2NhbGxiYWNrX2RhdGFfdV90eXBlX3UuZW5naW5lX2xvY2spKQotICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSUENfTE9DX0lPQ1RMX0dFVF9TQkFTX0NPTkZJRzoKLSAgICAgICAgIGlmICgheGRyX3JwY19ib29sZWFuICh4ZHJzLCAmb2JqcC0+cnBjX2xvY19pb2N0bF9jYWxsYmFja19kYXRhX3VfdHlwZV91LnNiYXNfbW9kZSkpCi0gICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFJQQ19MT0NfSU9DVExfR0VUX05NRUFfVFlQRVM6Ci0gICAgICAgICBpZiAoIXhkcl9ycGNfbG9jX25tZWFfc2VudGVuY2VfdHlwZSAoeGRycywgJm9ianAtPnJwY19sb2NfaW9jdGxfY2FsbGJhY2tfZGF0YV91X3R5cGVfdS5ubWVhX3R5cGVzKSkKLSAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUlBDX0xPQ19JT0NUTF9HRVRfT05fREVNQU5EX0xQTToKLSAgICAgICAgIGlmICgheGRyX3JwY19ib29sZWFuICh4ZHJzLCAmb2JqcC0+cnBjX2xvY19pb2N0bF9jYWxsYmFja19kYXRhX3VfdHlwZV91Lm9uX2RlbWFuZF9scG0pKQotICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSUENfTE9DX0lPQ1RMX0dFVF9DRE1BX1BERV9TRVJWRVJfQUREUjoKLSAgICBjYXNlIFJQQ19MT0NfSU9DVExfR0VUX0NETUFfTVBDX1NFUlZFUl9BRERSOgotICAgIGNhc2UgUlBDX0xPQ19JT0NUTF9HRVRfVU1UU19TTFBfU0VSVkVSX0FERFI6Ci0gICAgY2FzZSBSUENfTE9DX0lPQ1RMX0dFVF9DVVNUT01fUERFX1NFUlZFUl9BRERSOgotICAgICAgICAgaWYgKCF4ZHJfcnBjX2xvY19zZXJ2ZXJfaW5mb19zX3R5cGUgKHhkcnMsICZvYmpwLT5ycGNfbG9jX2lvY3RsX2NhbGxiYWNrX2RhdGFfdV90eXBlX3Uuc2VydmVyX2FkZHIpKQotICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSUENfTE9DX0lPQ1RMX1FVRVJZX1BSRURJQ1RFRF9PUkJJVFNfREFUQV9TT1VSQ0U6Ci0gICAgICAgICBpZiAoIXhkcl9ycGNfbG9jX3ByZWRpY3RlZF9vcmJpdHNfZGF0YV9zb3VyY2Vfc190eXBlICh4ZHJzLCAmb2JqcC0+cnBjX2xvY19pb2N0bF9jYWxsYmFja19kYXRhX3VfdHlwZV91LnByZWRpY3RlZF9vcmJpdHNfZGF0YV9zb3VyY2UpKQotICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSUENfTE9DX0lPQ1RMX1FVRVJZX1BSRURJQ1RFRF9PUkJJVFNfREFUQV9WQUxJRElUWToKLSAgICAgICAgIGlmICgheGRyX3JwY19sb2NfcHJlZGljdGVkX29yYml0c19kYXRhX3ZhbGlkaXR5X3JlcG9ydF9zX3R5cGUgKHhkcnMsICZvYmpwLT5ycGNfbG9jX2lvY3RsX2NhbGxiYWNrX2RhdGFfdV90eXBlX3UucHJlZGljdGVkX29yYml0c19kYXRhX3ZhbGlkaXR5KSkKLSAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUlBDX0xPQ19JT0NUTF9HRVRfWFRSQV9UX1NFU1NJT05fQ09OVFJPTDoKLSAgICAgICAgIGlmICgheGRyX3JwY191aW50OCAoeGRycywgJm9ianAtPnJwY19sb2NfaW9jdGxfY2FsbGJhY2tfZGF0YV91X3R5cGVfdS54dHJhX3Rfc2Vzc2lvbl9jb250cm9sKSkKLSAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUlBDX0xPQ19JT0NUTF9HRVRfTEJTX0FQTl9QUk9GSUxFOgotICAgIGNhc2UgUlBDX0xPQ19JT0NUTF9HRVRfWFRSQV9BUE5fUFJPRklMRToKLSAgICAgICAgIGlmICgheGRyX3ZlY3RvciAoeGRycywgKGNoYXIgKilvYmpwLT5ycGNfbG9jX2lvY3RsX2NhbGxiYWNrX2RhdGFfdV90eXBlX3UuYXBuX3Byb2ZpbGVzLCA2LAotICAgICAgICAgICAgc2l6ZW9mIChycGNfbG9jX2Fwbl9wcm9maWxlc190eXBlKSwgKHhkcnByb2NfdCkgeGRyX3JwY19sb2NfYXBuX3Byb2ZpbGVzX3R5cGUpKQotICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSUENfTE9DX0lPQ1RMX0dFVF9TVVBMX1ZFUlNJT046Ci0gICAgICAgICBpZiAoIXhkcl9ycGNfdWludDMyICh4ZHJzLCAmb2JqcC0+cnBjX2xvY19pb2N0bF9jYWxsYmFja19kYXRhX3VfdHlwZV91LnN1cGxfdmVyc2lvbikpCi0gICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2NfaW9jdGxfY2FsbGJhY2tfc190eXBlIChYRFIgKnhkcnMsIHJwY19sb2NfaW9jdGxfY2FsbGJhY2tfc190eXBlICpvYmpwKQotewotICAgIHJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotICAgICBpZiAoIXhkcl9ycGNfbG9jX2lvY3RsX2VfdHlwZSAoeGRycywgJm9ianAtPnR5cGUpKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICBpZiAoIXhkcl9ycGNfaW50MzIgKHhkcnMsICZvYmpwLT5zdGF0dXMpKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICBpZiAoIXhkcl9ycGNfbG9jX2lvY3RsX2NhbGxiYWNrX2RhdGFfdV90eXBlICh4ZHJzLCAmb2JqcC0+ZGF0YSkpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2NfZXZlbnRfcGF5bG9hZF91X3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19ldmVudF9wYXlsb2FkX3VfdHlwZSAqb2JqcCkKLXsKLSAgICByZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLSAgICAgaWYgKCF4ZHJfdV9xdWFkX3QgKHhkcnMsICZvYmpwLT5kaXNjKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICBzd2l0Y2ggKG9ianAtPmRpc2MpIHsKLSAgICBjYXNlIFJQQ19MT0NfRVZFTlRfUEFSU0VEX1BPU0lUSU9OX1JFUE9SVDoKLSAgICAgICAgIGlmICgheGRyX3JwY19sb2NfcGFyc2VkX3Bvc2l0aW9uX3NfdHlwZSAoeGRycywgJm9ianAtPnJwY19sb2NfZXZlbnRfcGF5bG9hZF91X3R5cGVfdS5wYXJzZWRfbG9jYXRpb25fcmVwb3J0KSkKLSAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUlBDX0xPQ19FVkVOVF9TQVRFTExJVEVfUkVQT1JUOgotICAgICAgICAgaWYgKCF4ZHJfcnBjX2xvY19nbnNzX2luZm9fc190eXBlICh4ZHJzLCAmb2JqcC0+cnBjX2xvY19ldmVudF9wYXlsb2FkX3VfdHlwZV91Lmduc3NfcmVwb3J0KSkKLSAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUlBDX0xPQ19FVkVOVF9OTUVBX1BPU0lUSU9OX1JFUE9SVDoKLSAgICBjYXNlIFJQQ19MT0NfRVZFTlRfTk1FQV8xSFpfUkVQT1JUOgotICAgICAgICAgaWYgKCF4ZHJfcnBjX2xvY19ubWVhX3JlcG9ydF9zX3R5cGUgKHhkcnMsICZvYmpwLT5ycGNfbG9jX2V2ZW50X3BheWxvYWRfdV90eXBlX3Uubm1lYV9yZXBvcnQpKQotICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSUENfTE9DX0VWRU5UX05JX05PVElGWV9WRVJJRllfUkVRVUVTVDoKLSAgICAgICAgIGlmICgheGRyX3JwY19sb2NfbmlfZXZlbnRfc190eXBlICh4ZHJzLCAmb2JqcC0+cnBjX2xvY19ldmVudF9wYXlsb2FkX3VfdHlwZV91Lm5pX3JlcXVlc3QpKQotICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSUENfTE9DX0VWRU5UX0FTU0lTVEFOQ0VfREFUQV9SRVFVRVNUOgotICAgICAgICAgaWYgKCF4ZHJfcnBjX2xvY19hc3Npc3RfZGF0YV9yZXF1ZXN0X3NfdHlwZSAoeGRycywgJm9ianAtPnJwY19sb2NfZXZlbnRfcGF5bG9hZF91X3R5cGVfdS5hc3Npc3RfZGF0YV9yZXF1ZXN0KSkKLSAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUlBDX0xPQ19FVkVOVF9MT0NBVElPTl9TRVJWRVJfUkVRVUVTVDoKLSAgICAgICAgIGlmICgheGRyX3JwY19sb2Nfc2VydmVyX3JlcXVlc3Rfc190eXBlICh4ZHJzLCAmb2JqcC0+cnBjX2xvY19ldmVudF9wYXlsb2FkX3VfdHlwZV91LmxvY19zZXJ2ZXJfcmVxdWVzdCkpCi0gICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFJQQ19MT0NfRVZFTlRfSU9DVExfUkVQT1JUOgotICAgICAgICAgaWYgKCF4ZHJfcnBjX2xvY19pb2N0bF9jYWxsYmFja19zX3R5cGUgKHhkcnMsICZvYmpwLT5ycGNfbG9jX2V2ZW50X3BheWxvYWRfdV90eXBlX3UuaW9jdGxfcmVwb3J0KSkKLSAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUlBDX0xPQ19FVkVOVF9TVEFUVVNfUkVQT1JUOgotICAgICAgICAgaWYgKCF4ZHJfcnBjX2xvY19zdGF0dXNfZXZlbnRfc190eXBlICh4ZHJzLCAmb2JqcC0+cnBjX2xvY19ldmVudF9wYXlsb2FkX3VfdHlwZV91LnN0YXR1c19yZXBvcnQpKQotICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSUENfTE9DX0VWRU5UX1dQU19ORUVERURfUkVRVUVTVDoKLSAgICAgICAgIGlmICgheGRyX3JwY19sb2NfcXdpcF9yZXF1ZXN0X3NfdHlwZSAoeGRycywgJm9ianAtPnJwY19sb2NfZXZlbnRfcGF5bG9hZF91X3R5cGVfdS5xd2lwX3JlcXVlc3QpKQotICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSUENfTE9DX0VWRU5UX1JFU0VSVkVEOgotICAgICAgICAgaWYgKCF4ZHJfcnBjX2xvY19yZXNlcnZlZF9wYXlsb2FkX3NfdHlwZSAoeGRycywgJm9ianAtPnJwY19sb2NfZXZlbnRfcGF5bG9hZF91X3R5cGVfdS5yZXNlcnZlZCkpCi0gICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7Ci19CmRpZmYgLS1naXQgYS9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaS1ycGMtNTAwMDEvbGlibG9jX2FwaS1ycGMtc3R1Yi9zcmMvbG9jX2FwaV9ycGNnZW5feGRyLmMgYi9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaS1ycGMtNTAwMDEvbGlibG9jX2FwaS1ycGMtc3R1Yi9zcmMvbG9jX2FwaV9ycGNnZW5feGRyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwZmRjYWIuLjAwMDAwMDAKLS0tIGEvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGktcnBjLTUwMDAxL2xpYmxvY19hcGktcnBjLXN0dWIvc3JjL2xvY19hcGlfcnBjZ2VuX3hkci5jCisrKyAvZGV2L251bGwKQEAgLTEsMTk5ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMSwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKLSAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAotICogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAotICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgotICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCi0gKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQotICogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgotICogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0vKgotICogUGxlYXNlIGRvIG5vdCBlZGl0IHRoaXMgZmlsZS4KLSAqIEl0IHdhcyBnZW5lcmF0ZWQgdXNpbmcgcnBjZ2VuLgotICovCi0KLSNpbmNsdWRlICJsb2NfYXBpX3JwY2dlbl9ycGMuaCIKLQotYm9vbF90Ci14ZHJfcnBjX2xvY19hcGlfYXBpX3ZlcnNpb25zX3JldHVybl90eXBlIChYRFIgKnhkcnMsIHJwY19sb2NfYXBpX2FwaV92ZXJzaW9uc19yZXR1cm5fdHlwZSAqb2JqcCkKLXsKLTsKLQotICAgICBpZiAoIXhkcl9hcnJheSAoeGRycywgKGNoYXIgKiopJm9ianAtPnJwY19sb2NfYXBpX2FwaV92ZXJzaW9uc19yZXR1cm5fdHlwZV92YWwsICh1X2ludCAqKSAmb2JqcC0+cnBjX2xvY19hcGlfYXBpX3ZlcnNpb25zX3JldHVybl90eXBlX2xlbiwgfjAsCi0gICAgICAgIHNpemVvZiAocnBjX3VpbnQzMiksICh4ZHJwcm9jX3QpIHhkcl9ycGNfdWludDMyKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19ldmVudF9jYl9mX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19ldmVudF9jYl9mX3R5cGUgKm9ianApCi17Ci07Ci0KLSAgICAgaWYgKCF4ZHJfcnBjX3VpbnQzMiAoeGRycywgb2JqcCkpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2Nfb3Blbl9hcmdzIChYRFIgKnhkcnMsIHJwY19sb2Nfb3Blbl9hcmdzICpvYmpwKQotewotOwotCi0gICAgIGlmICgheGRyX3JwY19sb2NfZXZlbnRfbWFza190eXBlICh4ZHJzLCAmb2JqcC0+ZXZlbnRfcmVnX21hc2spKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICBpZiAoIXhkcl9ycGNfbG9jX2V2ZW50X2NiX2ZfdHlwZSAoeGRycywgJm9ianAtPmV2ZW50X2NhbGxiYWNrKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19jbG9zZV9hcmdzIChYRFIgKnhkcnMsIHJwY19sb2NfY2xvc2VfYXJncyAqb2JqcCkKLXsKLTsKLQotICAgICBpZiAoIXhkcl9ycGNfbG9jX2NsaWVudF9oYW5kbGVfdHlwZSAoeGRycywgJm9ianAtPmhhbmRsZSkpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2Nfc3RhcnRfZml4X2FyZ3MgKFhEUiAqeGRycywgcnBjX2xvY19zdGFydF9maXhfYXJncyAqb2JqcCkKLXsKLTsKLQotICAgICBpZiAoIXhkcl9ycGNfbG9jX2NsaWVudF9oYW5kbGVfdHlwZSAoeGRycywgJm9ianAtPmhhbmRsZSkpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2Nfc3RvcF9maXhfYXJncyAoWERSICp4ZHJzLCBycGNfbG9jX3N0b3BfZml4X2FyZ3MgKm9ianApCi17Ci07Ci0KLSAgICAgaWYgKCF4ZHJfcnBjX2xvY19jbGllbnRfaGFuZGxlX3R5cGUgKHhkcnMsICZvYmpwLT5oYW5kbGUpKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIHJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfbG9jX2lvY3RsX2FyZ3MgKFhEUiAqeGRycywgcnBjX2xvY19pb2N0bF9hcmdzICpvYmpwKQotewotOwotCi0gICAgIGlmICgheGRyX3JwY19sb2NfY2xpZW50X2hhbmRsZV90eXBlICh4ZHJzLCAmb2JqcC0+aGFuZGxlKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgaWYgKCF4ZHJfcnBjX2xvY19pb2N0bF9lX3R5cGUgKHhkcnMsICZvYmpwLT5pb2N0bF90eXBlKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgaWYgKCF4ZHJfcG9pbnRlciAoeGRycywgKGNoYXIgKiopJm9ianAtPmlvY3RsX2RhdGEsIHNpemVvZiAocnBjX2xvY19pb2N0bF9kYXRhX3VfdHlwZSksICh4ZHJwcm9jX3QpIHhkcl9ycGNfbG9jX2lvY3RsX2RhdGFfdV90eXBlKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19hcGlfYXBpX3ZlcnNpb25fc19hcmdzIChYRFIgKnhkcnMsIHJwY19sb2NfYXBpX2FwaV92ZXJzaW9uX3NfYXJncyAqb2JqcCkKLXsKLTsKLQotICAgICBpZiAoIXhkcl9ycGNfYm9vbGVhbiAoeGRycywgJm9ianAtPmxlbl9ub3RfbnVsbCkpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2NfYXBpX3JwY19nbHVlX2NvZGVfaW5mb19yZW1vdGVfcmV0cyAoWERSICp4ZHJzLCBycGNfbG9jX2FwaV9ycGNfZ2x1ZV9jb2RlX2luZm9fcmVtb3RlX3JldHMgKm9ianApCi17Ci07Ci0KLSAgICAgaWYgKCF4ZHJfcnBjX3VpbnQzMiAoeGRycywgJm9ianAtPnRvb2x2ZXJzKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgaWYgKCF4ZHJfcnBjX3VpbnQzMiAoeGRycywgJm9ianAtPmZlYXR1cmVzKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgaWYgKCF4ZHJfcnBjX3VpbnQzMiAoeGRycywgJm9ianAtPnByb2doYXNoKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgaWYgKCF4ZHJfcnBjX3VpbnQzMiAoeGRycywgJm9ianAtPmNicHJvZ2hhc2gpKQotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIHJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfbG9jX29wZW5fcmV0cyAoWERSICp4ZHJzLCBycGNfbG9jX29wZW5fcmV0cyAqb2JqcCkKLXsKLTsKLQotICAgICBpZiAoIXhkcl9ycGNfbG9jX2NsaWVudF9oYW5kbGVfdHlwZSAoeGRycywgJm9ianAtPmxvY19vcGVuX3Jlc3VsdCkpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2NfY2xvc2VfcmV0cyAoWERSICp4ZHJzLCBycGNfbG9jX2Nsb3NlX3JldHMgKm9ianApCi17Ci07Ci0KLSAgICAgaWYgKCF4ZHJfcnBjX2ludDMyICh4ZHJzLCAmb2JqcC0+bG9jX2Nsb3NlX3Jlc3VsdCkpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2Nfc3RhcnRfZml4X3JldHMgKFhEUiAqeGRycywgcnBjX2xvY19zdGFydF9maXhfcmV0cyAqb2JqcCkKLXsKLTsKLQotICAgICBpZiAoIXhkcl9ycGNfaW50MzIgKHhkcnMsICZvYmpwLT5sb2Nfc3RhcnRfZml4X3Jlc3VsdCkpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2Nfc3RvcF9maXhfcmV0cyAoWERSICp4ZHJzLCBycGNfbG9jX3N0b3BfZml4X3JldHMgKm9ianApCi17Ci07Ci0KLSAgICAgaWYgKCF4ZHJfcnBjX2ludDMyICh4ZHJzLCAmb2JqcC0+bG9jX3N0b3BfZml4X3Jlc3VsdCkpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2NfaW9jdGxfcmV0cyAoWERSICp4ZHJzLCBycGNfbG9jX2lvY3RsX3JldHMgKm9ianApCi17Ci07Ci0KLSAgICAgaWYgKCF4ZHJfcnBjX2ludDMyICh4ZHJzLCAmb2JqcC0+bG9jX2lvY3RsX3Jlc3VsdCkpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2NfYXBpX2FwaV92ZXJzaW9uc19yZXRzIChYRFIgKnhkcnMsIHJwY19sb2NfYXBpX2FwaV92ZXJzaW9uc19yZXRzICpvYmpwKQotewotOwotCi0gICAgIGlmICgheGRyX3JwY19sb2NfYXBpX2FwaV92ZXJzaW9uc19yZXR1cm5fdHlwZSAoeGRycywgJm9ianAtPmxvY19hcGlfYXBpX3ZlcnNpb25zX3Jlc3VsdCkpCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgIGlmICgheGRyX3BvaW50ZXIgKHhkcnMsIChjaGFyICoqKSZvYmpwLT5sZW4sIHNpemVvZiAocnBjX3VpbnQzMiksICh4ZHJwcm9jX3QpIHhkcl9ycGNfdWludDMyKSkKLSAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICByZXR1cm4gVFJVRTsKLX0KZGlmZiAtLWdpdCBhL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpLXJwYy01MDAwMS9saWJsb2NfYXBpLXJwYy1zdHViL3NyYy9sb2NfYXBpY2JfYXBwaW5pdC5jIGIvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGktcnBjLTUwMDAxL2xpYmxvY19hcGktcnBjLXN0dWIvc3JjL2xvY19hcGljYl9hcHBpbml0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0NjllYjAuLjAwMDAwMDAKLS0tIGEvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGktcnBjLTUwMDAxL2xpYmxvY19hcGktcnBjLXN0dWIvc3JjL2xvY19hcGljYl9hcHBpbml0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTEsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCi0gKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKLSAqICAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKLSAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAotICogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKLSAqIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KLSAqIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotI2luY2x1ZGUgImxpYnJwYy5oIgotI2luY2x1ZGUgImxvY19hcGlfcnBjZ2VuX3JwYy5oIgotI2luY2x1ZGUgImxvY19hcGlfcnBjZ2VuX2NiX3JwYy5oIgotCi0KLSNkZWZpbmUgUlBDX0ZVTkNfVkVSU0lPTl9CQVNFKGEsYikgYSAjIyBiCi0jZGVmaW5lIFJQQ19DQl9GVU5DX1ZFUlMoYSxiKSBSUENfRlVOQ19WRVJTSU9OX0JBU0UoYSxiKQotCi0KLXN0YXRpYyBTVkNYUFJUKiBzdnJQb3J0ID0gTlVMTDsKLQotZXh0ZXJuIHZvaWQgUlBDX0NCX0ZVTkNfVkVSUyhsb2NfYXBpY2Jwcm9nXyxMT0NfQVBJQ0JWRVJTXzAwMDEpKHN0cnVjdCBzdmNfcmVxICpycXN0cCwgcmVnaXN0ZXIgU1ZDWFBSVCAqdHJhbnNwKTsKLQotaW50IGxvY19hcGljYl9hcHBfaW5pdCh2b2lkKQotewotCi0gIC8qIFJlZ2lzdGVyIGEgY2FsbGJhY2sgc2VydmVyIHRvIHVzZSB0aGUgbG9jX2FwaWNicHJvZ18weDAwMDEwMDAxICAqLwotICBpZiAoc3ZyUG9ydCA9PSBOVUxMKSB7Ci0gICAgICAgIHN2clBvcnQgPSBzdmNydHJfY3JlYXRlKCk7Ci0gIH0KLSAgaWYgKCFzdnJQb3J0KSByZXR1cm4gLTE7Ci0KLSAgeHBydF9yZWdpc3RlcihzdnJQb3J0KTsKLQotCi0KLSAgaWYoc3ZjX3JlZ2lzdGVyKHN2clBvcnQsIExPQ19BUElDQlBST0csTE9DX0FQSUNCVkVSU18wMDAxLCBSUENfQ0JfRlVOQ19WRVJTKGxvY19hcGljYnByb2dfLExPQ19BUElDQlZFUlNfMDAwMSksMCkpCi0gIHsKLSAgICAgcmV0dXJuIDA7Ci0gIH0KLSAgZWxzZQotICB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci19Ci12b2lkIGxvY19hcGljYl9hcHBfZGVpbml0KHZvaWQpCi17Ci0KLSAgIGlmIChzdnJQb3J0ID09IE5VTEwpCi0gICB7Ci0gICAgICByZXR1cm47Ci0gICB9Ci0KLQotICBzdmNfdW5yZWdpc3RlcihzdnJQb3J0LCBMT0NfQVBJQ0JQUk9HLExPQ19BUElDQlZFUlNfMDAwMSk7Ci19CmRpZmYgLS1naXQgYS9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaS1ycGMtNTAwMDEvbGlibG9jX2FwaS1ycGMtc3R1Yi94ZHIvbG9jX2FwaS54ZHIgYi9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaS1ycGMtNTAwMDEvbGlibG9jX2FwaS1ycGMtc3R1Yi94ZHIvbG9jX2FwaS54ZHIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyZGNhNTYuLjAwMDAwMDAKLS0tIGEvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGktcnBjLTUwMDAxL2xpYmxvY19hcGktcnBjLXN0dWIveGRyL2xvY19hcGkueGRyCisrKyAvZGV2L251bGwKQEAgLTEsMjYxICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMS0yMDEyLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZwotICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCi0gKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uLCBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAotICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgotICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCi0gKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQotICogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgotICogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0vKiBMT0NfQVBJIFRPT0wgVkVSU0lPTjogNC40OCAqLwotLyogR0VORVJBVEVEOiBUVUUgSlVOIDE0IDIwMTEgKi8KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCBPIEMgXyBBIFAgSSAuIFggRCBSCi0KLUdFTkVSQUwgREVTQ1JJUFRJT04KLSAgVGhpcyBpcyBhbiBBVVRPIEdFTkVSQVRFRCBmaWxlIHRoYXQgcHJvdmlkZXMgYW4geGRyIGNvbXBhdGlibGUgZGVmaW5pdGlvbiBvZgotICB0aGUgbG9jX2FwaSBBUEkuCi0KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFZGl0IEhpc3RvcnkKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVVRPIEdFTkVSQVRFRAotCi1HZW5lcmF0ZWQgYnkgZm9sbG93aW5nIHZlcnNpb25zIG9mIEh0b3JwYyBtb2R1bGVzOgotSWQ6IC8vc291cmNlL3Fjb20vcWN0L2NvcmUvbXByb2MvdG9vbHMvcmVsLzJoMDkvaHRvcnBjL2h0b3JwYy5wbCMxCi1JZDogLy9zb3VyY2UvcWNvbS9xY3QvY29yZS9tcHJvYy90b29scy9yZWwvMmgwOS9odG9ycGMvbGliL0h0b3JwYy9TdGFydC5wbSMxCi1JZDogLy9zb3VyY2UvcWNvbS9xY3QvY29yZS9tcHJvYy90b29scy9yZWwvMmgwOS9odG9ycGMvbGliL0h0b3JwYy9IdG94ZHIucG0jMQotSWQ6IC8vc291cmNlL3Fjb20vcWN0L2NvcmUvbXByb2MvdG9vbHMvcmVsLzJoMDkvaHRvcnBjL2xpYi9IdG9ycGMvWERSLnBtIzMKLUlkOiAvL3NvdXJjZS9xY29tL3FjdC9jb3JlL21wcm9jL3Rvb2xzL3JlbC8yaDA5L2h0b3JwYy9saWIvSHRvcnBjL091dHB1dC5wbSM1Ci1JZDogLy9zb3VyY2UvcWNvbS9xY3QvY29yZS9tcHJvYy90b29scy9yZWwvMmgwOS9odG9ycGMvbGliL0h0b3JwYy9QYXJzZXIucG0jMQotSWQ6IC8vc291cmNlL3Fjb20vcWN0L2NvcmUvbXByb2MvdG9vbHMvcmVsLzJoMDkvaHRvcnBjL2xpYi9IdG9ycGMvTWV0YWNvbW1lbnRzLnBtIzEKLUlkOiAvL3NvdXJjZS9xY29tL3FjdC9jb3JlL21wcm9jL3Rvb2xzL3JlbC8yaDA5L2h0b3JwYy9saWIvSHRvcnBjL1N5bWJvbFRhYmxlLnBtIzEKLQotbG9jX2FwaSBEZWZpbml0aW9uIEZpbGUocyk6Ci1JZDogLy9zb3VyY2UvcWNvbS9xY3QvbW9kZW0vYXBpL2dwcy9tYWluL2xhdGVzdC9sb2NfYXBpLmgjMjQKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSRIZWFkZXIkCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLQotCi10eXBlZGVmIHJwY191aW50MzIgcnBjX2xvY19hcGlfYXBpX3ZlcnNpb25zX3JldHVybl90eXBlPD47Ci0KLS8qCi0gKiBEZWNsYXJlIGFuIHJwY191aW50MzIgdHlwZSBmb3IgZWFjaCBjYWxsYmFjayB0eXBlIGluIHRoZSBBUEkKLSAqLwotdHlwZWRlZiBycGNfdWludDMyIHJwY19sb2NfZXZlbnRfY2JfZl90eXBlOwotCi0KLQotLyoKLSAqIFRoZXNlIGFyZSBzdHJ1Y3QgZGVjbGFyYXRpb25zIGZvciB0aGUgZnVuY3Rpb24gYXJndW1lbnRzCi0gKi8KLQotc3RydWN0IHJwY19sb2Nfb3Blbl9hcmdzIHsKLSAgcnBjX2xvY19ldmVudF9tYXNrX3R5cGUgZXZlbnRfcmVnX21hc2s7Ci0gIHJwY19sb2NfZXZlbnRfY2JfZl90eXBlIGV2ZW50X2NhbGxiYWNrOwotfTsKLQotc3RydWN0IHJwY19sb2NfY2xvc2VfYXJncyB7Ci0gIHJwY19sb2NfY2xpZW50X2hhbmRsZV90eXBlIGhhbmRsZTsKLX07Ci0KLXN0cnVjdCBycGNfbG9jX3N0YXJ0X2ZpeF9hcmdzIHsKLSAgcnBjX2xvY19jbGllbnRfaGFuZGxlX3R5cGUgaGFuZGxlOwotfTsKLQotc3RydWN0IHJwY19sb2Nfc3RvcF9maXhfYXJncyB7Ci0gIHJwY19sb2NfY2xpZW50X2hhbmRsZV90eXBlIGhhbmRsZTsKLX07Ci0KLXN0cnVjdCBycGNfbG9jX2lvY3RsX2FyZ3MgewotICBycGNfbG9jX2NsaWVudF9oYW5kbGVfdHlwZSBoYW5kbGU7Ci0gIHJwY19sb2NfaW9jdGxfZV90eXBlIGlvY3RsX3R5cGU7Ci0gIHJwY19sb2NfaW9jdGxfZGF0YV91X3R5cGUgKmlvY3RsX2RhdGE7Ci19OwotCi0KLQotc3RydWN0IHJwY19sb2NfYXBpX2FwaV92ZXJzaW9uX3NfYXJncyB7Ci0gIHJwY19ib29sZWFuIGxlbl9ub3RfbnVsbDsKLX07Ci0KLS8qCi0gKiBUaGVzZSBhcmUgc3RydWN0IGRlY2xhcmF0aW9ucyBmb3IgdGhlIGZ1bmN0aW9uIHJlc3VsdHMKLSAqLwotCi1zdHJ1Y3QgcnBjX2xvY19hcGlfcnBjX2dsdWVfY29kZV9pbmZvX3JlbW90ZV9yZXRzIHsKLSAgcnBjX3VpbnQzMiB0b29sdmVyczsgICAvKiBUb29sIHZlcnNpb24gKi8KLSAgcnBjX3VpbnQzMiBmZWF0dXJlczsgICAvKiBGZWF0dXJlcyB0dXJuZWQgb24gaW4gdGhlIGNvZGUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICogMHgwMDAwMDAwMSAgICBPTkNSUEMgU2VydmVyIENsZWFudXAgU3VwcG9ydAotICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBycGNfdWludDMyIHByb2doYXNoOyAgIC8qIFVuaXF1ZSBoYXNoIHZhbHVlIGZvciB0aGUgQVBJIFhEUiBkZWZpbml0aW9uICovCi0gIHJwY191aW50MzIgY2Jwcm9naGFzaDsgLyogVW5pcXVlIGhhc2ggdmFsdWUgZm9yIHRoZSBDYWxsYmFja3MnIFhEUiBkZWZpbml0aW9uICovCi19OwotCi1zdHJ1Y3QgcnBjX2xvY19vcGVuX3JldHMgewotICBycGNfbG9jX2NsaWVudF9oYW5kbGVfdHlwZSBsb2Nfb3Blbl9yZXN1bHQ7Ci19OwotCi1zdHJ1Y3QgcnBjX2xvY19jbG9zZV9yZXRzIHsKLSAgcnBjX2ludDMyIGxvY19jbG9zZV9yZXN1bHQ7Ci19OwotCi1zdHJ1Y3QgcnBjX2xvY19zdGFydF9maXhfcmV0cyB7Ci0gIHJwY19pbnQzMiBsb2Nfc3RhcnRfZml4X3Jlc3VsdDsKLX07Ci0KLXN0cnVjdCBycGNfbG9jX3N0b3BfZml4X3JldHMgewotICBycGNfaW50MzIgbG9jX3N0b3BfZml4X3Jlc3VsdDsKLX07Ci0KLXN0cnVjdCBycGNfbG9jX2lvY3RsX3JldHMgewotICBycGNfaW50MzIgbG9jX2lvY3RsX3Jlc3VsdDsKLX07Ci0KLSBzdHJ1Y3QgcnBjX2xvY19hcGlfYXBpX3ZlcnNpb25zX3JldHMgewotICBycGNfbG9jX2FwaV9hcGlfdmVyc2lvbnNfcmV0dXJuX3R5cGUgbG9jX2FwaV9hcGlfdmVyc2lvbnNfcmVzdWx0OwotICBycGNfdWludDMyICpsZW47Ci19OwotCi0vKgotICogWERSIGRlZmluaXRpb24gb2YgdGhlIExPQ19BUEkgcHJvZ3JhbSAoIHZlcnMuIDB4MDAwNTAwMDYgKQotICovCi0KLXByb2dyYW0gTE9DX0FQSVBST0cgewotICB2ZXJzaW9uIExPQ19BUElWRVJTXzAwMDEgewotCi0Jdm9pZAotCQlycGNfbG9jX2FwaV9udWxsKCB2b2lkICkgPSAwOwotCi0JcnBjX2xvY19hcGlfcnBjX2dsdWVfY29kZV9pbmZvX3JlbW90ZV9yZXRzCi0JCXJwY19sb2NfYXBpX3JwY19nbHVlX2NvZGVfaW5mb19yZW1vdGUoIHZvaWQgKSA9IDE7Ci0KLQlycGNfbG9jX29wZW5fcmV0cwotCQlycGNfbG9jX29wZW4oIHJwY19sb2Nfb3Blbl9hcmdzICkgPSAyOwotCi0JcnBjX2xvY19jbG9zZV9yZXRzCi0JCXJwY19sb2NfY2xvc2UoIHJwY19sb2NfY2xvc2VfYXJncyApID0gMzsKLQotCXJwY19sb2Nfc3RhcnRfZml4X3JldHMKLQkJcnBjX2xvY19zdGFydF9maXgoIHJwY19sb2Nfc3RhcnRfZml4X2FyZ3MgKSA9IDQ7Ci0KLQlycGNfbG9jX3N0b3BfZml4X3JldHMKLQkJcnBjX2xvY19zdG9wX2ZpeCggcnBjX2xvY19zdG9wX2ZpeF9hcmdzICkgPSA1OwotCi0JcnBjX2xvY19pb2N0bF9yZXRzCi0JCXJwY19sb2NfaW9jdGwoIHJwY19sb2NfaW9jdGxfYXJncyApID0gNjsKLQotCXJwY19sb2NfYXBpX2FwaV92ZXJzaW9uc19yZXRzCi0JCXJwY19sb2NfYXBpX2FwaV92ZXJzaW9ucyggdm9pZCApID0gMHhGRkZGRkZGRjsKLQotCi0KLQotICB9ID0gMHgwMDA1MDAwMTsKLQotdmVyc2lvbiBMT0NfQVBJVkVSU18wMDAyIHsKLQotLyogRm9sbG93aW5nIGVsZW1lbnRzIGFkZGVkIGluIGVudW0gcnBjX2xvY19hc3Npc3RfZGF0YV9yZXF1ZXN0X2VfdHlwZSBpbiAweDAwMDUwMDAyCi1SUENfTE9DX0FTU0lTVF9EQVRBX1BPU0lUSU9OX0lOSkVDVElPTl9SRVEKLSovCi0vKiBGb2xsb3dpbmcgZWxlbWVudHMgYWRkZWQgaW4gZW51bSBycGNfbG9jX2lvY3RsX2VfdHlwZSBpbiAweDAwMDUwMDAyCi1SUENfTE9DX0lPQ1RMX0dFVF9YVFJBX1RfU0VTU0lPTl9DT05UUk9MCi1SUENfTE9DX0lPQ1RMX1JFU0VSVkVEX0NNRAotUlBDX0xPQ19JT0NUTF9TRVRfWFRSQV9UX1NFU1NJT05fQ09OVFJPTAotKi8KLQotCXZvaWQKLQlycGNfbG9jX2FwaV9udWxsKCB2b2lkICkgPSAwOwotCi0gICAgICB9ID0gMHgwMDA1MDAwMjsKLQotdmVyc2lvbiBMT0NfQVBJVkVSU18wMDAzIHsKLQotLyogRm9sbG93aW5nIGVsZW1lbnRzIGFkZGVkIGluIGVudW0gcnBjX2xvY19pb2N0bF9lX3R5cGUgaW4gMHgwMDA1MDAwMwotUlBDX0xPQ19JT0NUTF9TRVRfREFUQV9FTkFCTEUKLVJQQ19MT0NfSU9DVExfU0VUX0xCU19BUE5fUFJPRklMRQotUlBDX0xPQ19JT0NUTF9HRVRfWFRSQV9BUE5fUFJPRklMRQotUlBDX0xPQ19JT0NUTF9HRVRfTEJTX0FQTl9QUk9GSUxFCi1SUENfTE9DX0lPQ1RMX1NFVF9YVFJBX0FQTl9QUk9GSUxFCi0qLwotCi0Jdm9pZAotCXJwY19sb2NfYXBpX251bGwoIHZvaWQgKSA9IDA7Ci0KLSAgICAgIH0gPSAweDAwMDUwMDAzOwotCi12ZXJzaW9uIExPQ19BUElWRVJTXzAwMDQgewotCi0vKiBGb2xsb3dpbmcgZWxlbWVudHMgYWRkZWQgaW4gZW51bSBycGNfbG9jX2lvY3RsX2VfdHlwZSBpbiAweDAwMDUwMDA0Ci1SUENfTE9DX0lPQ1RMX0dFVF9TVVBMX1ZFUlNJT04KLVJQQ19MT0NfSU9DVExfU0VUX1NVUExfVkVSU0lPTgotKi8KLQotCXZvaWQKLQlycGNfbG9jX2FwaV9udWxsKCB2b2lkICkgPSAwOwotCi0gICAgICB9ID0gMHgwMDA1MDAwNDsKLQotdmVyc2lvbiBMT0NfQVBJVkVSU18wMDA1IHsKLQotLyogRm9sbG93aW5nIGVsZW1lbnRzIGFkZGVkIGluIGVudW0gcnBjX2xvY19zZXJ2ZXJfYWRkcl9lX3R5cGUgaW4gMHgwMDA1MDAwNQotUlBDX0xPQ19TRVJWRVJfQUREUl9JUFY2Ci0qLwotLyogRm9sbG93aW5nIGVsZW1lbnRzIGFkZGVkIGluIGVudW0gcnBjX2xvY19pb2N0bF9lX3R5cGUgaW4gMHgwMDA1MDAwNQotUlBDX0xPQ19JT0NUTF9FUlJPUl9FU1RJTUFURV9DT05GSUcKLSovCi0KLQl2b2lkCi0JcnBjX2xvY19hcGlfbnVsbCggdm9pZCApID0gMDsKLQotICAgICAgfSA9IDB4MDAwNTAwMDU7Ci0KLQotCi0gICAgdmVyc2lvbiBMT0NfQVBJVkVSU18wMDA2IHsKLQotLyogRm9sbG93aW5nIGVsZW1lbnRzIGFkZGVkIGluIGVudW0gcnBjX2xvY19pb2N0bF9lX3R5cGUgaW4gMHgwMDA1MDAwNgotUlBDX0xPQ19JT0NUTF9JTkZPUk1fU0VSVkVSX01VTFRJX09QRU5fU1RBVFVTCi0qLwotLyogRm9sbG93aW5nIGVsZW1lbnRzIGFkZGVkIGluIGVudW0gcnBjX2xvY19zZXJ2ZXJfcmVxdWVzdF9lX3R5cGUgaW4gMHgwMDA1MDAwNgotUlBDX0xPQ19TRVJWRVJfUkVRVUVTVF9NVUxUSV9PUEVOCi0qLwotCi0Jdm9pZAotCXJwY19sb2NfYXBpX251bGwoIHZvaWQgKSA9IDA7Ci0KLSAgICAgIH0gPSAweDAwMDUwMDA2OwotCi0KLX0gPSAweDMwMDAwMDhDOwotCi1jb25zdCBMT0NfQVBJVkVSUyA9IDB4MDAwNTAwMDY7CmRpZmYgLS1naXQgYS9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaS1ycGMtNTAwMDEvbGlibG9jX2FwaS1ycGMtc3R1Yi94ZHIvbG9jX2FwaV9jYi54ZHIgYi9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaS1ycGMtNTAwMDEvbGlibG9jX2FwaS1ycGMtc3R1Yi94ZHIvbG9jX2FwaV9jYi54ZHIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3NTZjNmMuLjAwMDAwMDAKLS0tIGEvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGktcnBjLTUwMDAxL2xpYmxvY19hcGktcnBjLXN0dWIveGRyL2xvY19hcGlfY2IueGRyCisrKyAvZGV2L251bGwKQEAgLTEsMTg3ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMS0yMDEyLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZwotICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCi0gKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uLCBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAotICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgotICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCi0gKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQotICogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgotICogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0vKiBMT0NfQVBJIFRPT0wgVkVSU0lPTjogNC40OCAqLwotLyogR0VORVJBVEVEOiBUVUUgSlVOIDE0IDIwMTEgKi8KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgTCBPIEMgXyBBIFAgSSBfIEMgQiAuIFggRCBSCi0KLUdFTkVSQUwgREVTQ1JJUFRJT04KLSAgVGhpcyBpcyBhbiBBVVRPIEdFTkVSQVRFRCBmaWxlIHRoYXQgcHJvdmlkZXMgYW4geGRyIGNvbXBhdGlibGUgZGVmaW5pdGlvbiBvZgotICBhbiBhcGkgdGhhdCByZXByZXNlbnRzIHRoZSBncm91cGluZyBvZiB0aGUgZGlmZmVyZW50IGNhbGxiYWNrIGZ1bmN0aW9ucyB0aGUKLSAgbG9jX2FwaSBBUEkgc3VwcG9ydHMuCi0KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFZGl0IEhpc3RvcnkKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVVRPIEdFTkVSQVRFRAotCi1HZW5lcmF0ZWQgYnkgZm9sbG93aW5nIHZlcnNpb25zIG9mIEh0b3JwYyBtb2R1bGVzOgotSWQ6IC8vc291cmNlL3Fjb20vcWN0L2NvcmUvbXByb2MvdG9vbHMvcmVsLzJoMDkvaHRvcnBjL2h0b3JwYy5wbCMxCi1JZDogLy9zb3VyY2UvcWNvbS9xY3QvY29yZS9tcHJvYy90b29scy9yZWwvMmgwOS9odG9ycGMvbGliL0h0b3JwYy9TdGFydC5wbSMxCi1JZDogLy9zb3VyY2UvcWNvbS9xY3QvY29yZS9tcHJvYy90b29scy9yZWwvMmgwOS9odG9ycGMvbGliL0h0b3JwYy9IdG94ZHIucG0jMQotSWQ6IC8vc291cmNlL3Fjb20vcWN0L2NvcmUvbXByb2MvdG9vbHMvcmVsLzJoMDkvaHRvcnBjL2xpYi9IdG9ycGMvWERSLnBtIzMKLUlkOiAvL3NvdXJjZS9xY29tL3FjdC9jb3JlL21wcm9jL3Rvb2xzL3JlbC8yaDA5L2h0b3JwYy9saWIvSHRvcnBjL091dHB1dC5wbSM1Ci1JZDogLy9zb3VyY2UvcWNvbS9xY3QvY29yZS9tcHJvYy90b29scy9yZWwvMmgwOS9odG9ycGMvbGliL0h0b3JwYy9QYXJzZXIucG0jMQotSWQ6IC8vc291cmNlL3Fjb20vcWN0L2NvcmUvbXByb2MvdG9vbHMvcmVsLzJoMDkvaHRvcnBjL2xpYi9IdG9ycGMvTWV0YWNvbW1lbnRzLnBtIzEKLUlkOiAvL3NvdXJjZS9xY29tL3FjdC9jb3JlL21wcm9jL3Rvb2xzL3JlbC8yaDA5L2h0b3JwYy9saWIvSHRvcnBjL1N5bWJvbFRhYmxlLnBtIzEKLQotbG9jX2FwaSBEZWZpbml0aW9uIEZpbGUocyk6Ci1JZDogLy9zb3VyY2UvcWNvbS9xY3QvbW9kZW0vYXBpL2dwcy9tYWluL2xhdGVzdC9sb2NfYXBpLmgjMjQKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSRIZWFkZXIkCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLQotCi0KLS8qCi0gKiBUaGVzZSBhcmUgc3RydWN0IGRlY2xhcmF0aW9ucyBmb3IgdGhlIGZ1bmN0aW9uIGFyZ3VtZW50cwotICovCi0KLXN0cnVjdCBycGNfbG9jX2V2ZW50X2NiX2ZfdHlwZV9hcmdzIHsKLSAgcnBjX3VpbnQzMiBjYl9pZDsKLSAgcnBjX2xvY19jbGllbnRfaGFuZGxlX3R5cGUgbG9jX2hhbmRsZTsKLSAgcnBjX2xvY19ldmVudF9tYXNrX3R5cGUgbG9jX2V2ZW50OwotICBycGNfbG9jX2V2ZW50X3BheWxvYWRfdV90eXBlICpsb2NfZXZlbnRfcGF5bG9hZDsKLX07Ci0KLQotCi0KLQotLyoKLSAqIFRoZXNlIGFyZSBzdHJ1Y3QgZGVjbGFyYXRpb3MgZm9yIHRoZSBmdW5jdGlvbiByZXN1bHRzCi0gKi8KLQotc3RydWN0IHJwY19sb2NfZXZlbnRfY2JfZl90eXBlX3JldHMgewotICBycGNfaW50MzIgbG9jX2V2ZW50X2NiX2ZfdHlwZV9yZXN1bHQ7Ci19OwotCi0KLQotLyoKLSAqIFhEUiBkZWZpbml0aW9uIG9mIHRoZSBMT0NfQVBJIGNhbGxiYWNrIHByb2dyYW0gKCB2ZXJzLiAweDAwMDUwMDA2ICkKLSAqLwotCi1wcm9ncmFtIExPQ19BUElDQlBST0cgewotICB2ZXJzaW9uIExPQ19BUElDQlZFUlNfMDAwMSB7Ci0KLQlycGNfbG9jX2V2ZW50X2NiX2ZfdHlwZV9yZXRzCi0JCXJwY19sb2NfZXZlbnRfY2JfZl90eXBlKCBycGNfbG9jX2V2ZW50X2NiX2ZfdHlwZV9hcmdzICkgPSAxOwotCi0KLQotCi0gIH0gPSAweDAwMDUwMDAxOwotCi12ZXJzaW9uIExPQ19BUElDQlZFUlNfMDAwMiB7Ci0KLS8qIEZvbGxvd2luZyBlbGVtZW50cyBhZGRlZCBpbiBlbnVtIHJwY19sb2NfYXNzaXN0X2RhdGFfcmVxdWVzdF9lX3R5cGUgaW4gMHgwMDA1MDAwMgotUlBDX0xPQ19BU1NJU1RfREFUQV9QT1NJVElPTl9JTkpFQ1RJT05fUkVRCi0qLwotLyogRm9sbG93aW5nIGVsZW1lbnRzIGFkZGVkIGluIGVudW0gcnBjX2xvY19pb2N0bF9lX3R5cGUgaW4gMHgwMDA1MDAwMgotUlBDX0xPQ19JT0NUTF9HRVRfWFRSQV9UX1NFU1NJT05fQ09OVFJPTAotUlBDX0xPQ19JT0NUTF9SRVNFUlZFRF9DTUQKLVJQQ19MT0NfSU9DVExfU0VUX1hUUkFfVF9TRVNTSU9OX0NPTlRST0wKLSovCi0KLQlpbnQKLQlycGNfbG9jX2FwaV9jYl9udWxsKCB2b2lkICkgPSAweGZmZmZmZjAwOwotCi0gICAgICB9ID0gMHgwMDA1MDAwMjsKLQotdmVyc2lvbiBMT0NfQVBJQ0JWRVJTXzAwMDMgewotCi0vKiBGb2xsb3dpbmcgZWxlbWVudHMgYWRkZWQgaW4gZW51bSBycGNfbG9jX2lvY3RsX2VfdHlwZSBpbiAweDAwMDUwMDAzCi1SUENfTE9DX0lPQ1RMX1NFVF9EQVRBX0VOQUJMRQotUlBDX0xPQ19JT0NUTF9TRVRfTEJTX0FQTl9QUk9GSUxFCi1SUENfTE9DX0lPQ1RMX0dFVF9YVFJBX0FQTl9QUk9GSUxFCi1SUENfTE9DX0lPQ1RMX0dFVF9MQlNfQVBOX1BST0ZJTEUKLVJQQ19MT0NfSU9DVExfU0VUX1hUUkFfQVBOX1BST0ZJTEUKLSovCi0KLQlpbnQKLQlycGNfbG9jX2FwaV9jYl9udWxsKCB2b2lkICkgPSAweGZmZmZmZjAwOwotCi0gICAgICB9ID0gMHgwMDA1MDAwMzsKLQotdmVyc2lvbiBMT0NfQVBJQ0JWRVJTXzAwMDQgewotCi0vKiBGb2xsb3dpbmcgZWxlbWVudHMgYWRkZWQgaW4gZW51bSBycGNfbG9jX2lvY3RsX2VfdHlwZSBpbiAweDAwMDUwMDA0Ci1SUENfTE9DX0lPQ1RMX0dFVF9TVVBMX1ZFUlNJT04KLVJQQ19MT0NfSU9DVExfU0VUX1NVUExfVkVSU0lPTgotKi8KLQotCWludAotCXJwY19sb2NfYXBpX2NiX251bGwoIHZvaWQgKSA9IDB4ZmZmZmZmMDA7Ci0KLSAgICAgIH0gPSAweDAwMDUwMDA0OwotCi12ZXJzaW9uIExPQ19BUElDQlZFUlNfMDAwNSB7Ci0KLS8qIEZvbGxvd2luZyBlbGVtZW50cyBhZGRlZCBpbiBlbnVtIHJwY19sb2Nfc2VydmVyX2FkZHJfZV90eXBlIGluIDB4MDAwNTAwMDUKLVJQQ19MT0NfU0VSVkVSX0FERFJfSVBWNgotKi8KLS8qIEZvbGxvd2luZyBlbGVtZW50cyBhZGRlZCBpbiBlbnVtIHJwY19sb2NfaW9jdGxfZV90eXBlIGluIDB4MDAwNTAwMDUKLVJQQ19MT0NfSU9DVExfRVJST1JfRVNUSU1BVEVfQ09ORklHCi0qLwotCi0JaW50Ci0JcnBjX2xvY19hcGlfY2JfbnVsbCggdm9pZCApID0gMHhmZmZmZmYwMDsKLQotICAgICAgfSA9IDB4MDAwNTAwMDU7Ci0KLQotCi0gICAgdmVyc2lvbiBMT0NfQVBJQ0JWRVJTXzAwMDYgewotCi0vKiBGb2xsb3dpbmcgZWxlbWVudHMgYWRkZWQgaW4gZW51bSBycGNfbG9jX2lvY3RsX2VfdHlwZSBpbiAweDAwMDUwMDA2Ci1SUENfTE9DX0lPQ1RMX0lORk9STV9TRVJWRVJfTVVMVElfT1BFTl9TVEFUVVMKLSovCi0vKiBGb2xsb3dpbmcgZWxlbWVudHMgYWRkZWQgaW4gZW51bSBycGNfbG9jX3NlcnZlcl9yZXF1ZXN0X2VfdHlwZSBpbiAweDAwMDUwMDA2Ci1SUENfTE9DX1NFUlZFUl9SRVFVRVNUX01VTFRJX09QRU4KLSovCi0KLQlpbnQKLQlycGNfbG9jX2FwaV9jYl9udWxsKCB2b2lkICkgPSAweGZmZmZmZjAwOwotCi0gICAgICB9ID0gMHgwMDA1MDAwNjsKLQotCi19ID0gMHgzMTAwMDA4QzsKLQotY29uc3QgTE9DX0FQSUNCVkVSUyA9IDB4MDAwNTAwMDY7CmRpZmYgLS1naXQgYS9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaS1ycGMtNTAwMDEvbGlibG9jX2FwaS1ycGMtc3R1Yi94ZHIvbG9jX2FwaV9jb21tb24ueGRyIGIvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGktcnBjLTUwMDAxL2xpYmxvY19hcGktcnBjLXN0dWIveGRyL2xvY19hcGlfY29tbW9uLnhkcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA1OWM2Ni4uMDAwMDAwMAotLS0gYS9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaS1ycGMtNTAwMDEvbGlibG9jX2FwaS1ycGMtc3R1Yi94ZHIvbG9jX2FwaV9jb21tb24ueGRyCisrKyAvZGV2L251bGwKQEAgLTEsMTAyMSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxMiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKLSAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAotICogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiwgbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKLSAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAotICogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKLSAqIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KLSAqIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotLyogTE9DX0FQSSBUT09MIFZFUlNJT046IDQuNDggKi8KLS8qIEdFTkVSQVRFRDogVFVFIEpVTiAxNCAyMDExICovCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgICAgICAgICAgICAgICAgICAgTCBPIEMgXyBBIFAgSSBfIEMgTyBNIE0gTyBOIC4gWCBEIFIKLQotR0VORVJBTCBERVNDUklQVElPTgotICBUaGlzIGlzIGFuIEFVVE8gR0VORVJBVEVEIGZpbGUgdGhhdCBwcm92aWRlcyBhbiB4ZHIgY29tcGF0aWJsZSBkZWZpbml0aW9uIG9mCi0gIGFuIGFwaSB0aGF0IHJlcHJlc2VudHMgdGhlIGdyb3VwaW5nIG9mIHRoZSBkaWZmZXJlbnQgY2FsbGJhY2sgZnVuY3Rpb25zIHRoZQotICBsb2NfYXBpIEFQSSBzdXBwb3J0cy4KLQotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVkaXQgSGlzdG9yeQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVVE8gR0VORVJBVEVECi0KLUdlbmVyYXRlZCBieSBmb2xsb3dpbmcgdmVyc2lvbnMgb2YgSHRvcnBjIG1vZHVsZXM6Ci1JZDogLy9zb3VyY2UvcWNvbS9xY3QvY29yZS9tcHJvYy90b29scy9yZWwvMmgwOS9odG9ycGMvaHRvcnBjLnBsIzEKLUlkOiAvL3NvdXJjZS9xY29tL3FjdC9jb3JlL21wcm9jL3Rvb2xzL3JlbC8yaDA5L2h0b3JwYy9saWIvSHRvcnBjL1N0YXJ0LnBtIzEKLUlkOiAvL3NvdXJjZS9xY29tL3FjdC9jb3JlL21wcm9jL3Rvb2xzL3JlbC8yaDA5L2h0b3JwYy9saWIvSHRvcnBjL0h0b3hkci5wbSMxCi1JZDogLy9zb3VyY2UvcWNvbS9xY3QvY29yZS9tcHJvYy90b29scy9yZWwvMmgwOS9odG9ycGMvbGliL0h0b3JwYy9YRFIucG0jMwotSWQ6IC8vc291cmNlL3Fjb20vcWN0L2NvcmUvbXByb2MvdG9vbHMvcmVsLzJoMDkvaHRvcnBjL2xpYi9IdG9ycGMvT3V0cHV0LnBtIzUKLUlkOiAvL3NvdXJjZS9xY29tL3FjdC9jb3JlL21wcm9jL3Rvb2xzL3JlbC8yaDA5L2h0b3JwYy9saWIvSHRvcnBjL1BhcnNlci5wbSMxCi1JZDogLy9zb3VyY2UvcWNvbS9xY3QvY29yZS9tcHJvYy90b29scy9yZWwvMmgwOS9odG9ycGMvbGliL0h0b3JwYy9NZXRhY29tbWVudHMucG0jMQotSWQ6IC8vc291cmNlL3Fjb20vcWN0L2NvcmUvbXByb2MvdG9vbHMvcmVsLzJoMDkvaHRvcnBjL2xpYi9IdG9ycGMvU3ltYm9sVGFibGUucG0jMQotCi1sb2NfYXBpIERlZmluaXRpb24gRmlsZShzKToKLUlkOiAvL3NvdXJjZS9xY29tL3FjdC9tb2RlbS9hcGkvZ3BzL21haW4vbGF0ZXN0L2xvY19hcGkuaCMyNAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotJEhlYWRlciQKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotCi0KLWNvbnN0IExPQ19BUElfVE9PTFZFUlMgPSAweDAwMDQwMDMwOwotY29uc3QgTE9DX0FQSV9GRUFUVVJFUyA9IDB4MDAwMDAwMDE7Ci0KLWNvbnN0IFJQQ19MT0NfRVZFTlRfU1RBVFVTX1JFUE9SVCA9IDB4MDAwMDAxMDA7Ci0KLWNvbnN0IFJQQ19MT0NfRVZFTlRfQVNTSVNUQU5DRV9EQVRBX1JFUVVFU1QgPSAweDAwMDAwMDIwOwotCi1jb25zdCBSUENfTE9DX0VWRU5UX1dQU19ORUVERURfUkVRVUVTVCA9IDB4MDAwMDAyMDA7Ci0KLWNvbnN0IFJQQ19MT0NfRVZFTlRfU0FURUxMSVRFX1JFUE9SVCA9IDB4MDAwMDAwMDI7Ci0KLWNvbnN0IFJQQ19MT0NfRVZFTlRfUEFSU0VEX1BPU0lUSU9OX1JFUE9SVCA9IDB4MDAwMDAwMDE7Ci0KLWNvbnN0IFJQQ19MT0NfRVZFTlRfUkVTRVJWRUQgPSAweDgwMDAwMDAwMDAwMDAwMDA7Ci0KLWNvbnN0IFJQQ19MT0NfRVZFTlRfTE9DQVRJT05fU0VSVkVSX1JFUVVFU1QgPSAweDAwMDAwMDQwOwotCi1jb25zdCBSUENfTE9DX0VWRU5UX05NRUFfUE9TSVRJT05fUkVQT1JUID0gMHgwMDAwMDAwODsKLQotY29uc3QgUlBDX0xPQ19FVkVOVF9JT0NUTF9SRVBPUlQgPSAweDAwMDAwMDgwOwotCi1jb25zdCBSUENfTE9DX0VWRU5UX05NRUFfMUhaX1JFUE9SVCA9IDB4MDAwMDAwMDQ7Ci0KLWNvbnN0IFJQQ19MT0NfRVZFTlRfTklfTk9USUZZX1ZFUklGWV9SRVFVRVNUID0gMHgwMDAwMDAxMDsKLQotY29uc3QgUlBDX0xPQ19BUElfQ0JfTlVMTF9WRVJTSU9OID0gMHgwMDA1MDAwMjsKLWNvbnN0IFJQQ19MT0NfRVZFTlRfQ0JfRl9UWVBFX1ZFUlNJT04gPSAweDAwMDUwMDAxOwotY29uc3QgUlBDX0xPQ19BUElfQVBJX1ZFUlNJT05TX1ZFUlNJT04gPSAweDAwMDUwMDAxOwotY29uc3QgUlBDX0xPQ19TVE9QX0ZJWF9WRVJTSU9OID0gMHgwMDA1MDAwMTsKLWNvbnN0IFJQQ19MT0NfU1RBUlRfRklYX1ZFUlNJT04gPSAweDAwMDUwMDAxOwotY29uc3QgUlBDX0xPQ19JT0NUTF9WRVJTSU9OID0gMHgwMDA1MDAwMTsKLWNvbnN0IFJQQ19MT0NfQ0xPU0VfVkVSU0lPTiA9IDB4MDAwNTAwMDE7Ci1jb25zdCBSUENfTE9DX0FQSV9SUENfR0xVRV9DT0RFX0lORk9fUkVNT1RFX1ZFUlNJT04gPSAweDAwMDUwMDAxOwotY29uc3QgUlBDX0xPQ19PUEVOX1ZFUlNJT04gPSAweDAwMDUwMDAxOwotY29uc3QgUlBDX0xPQ19BUElfTlVMTF9WRVJTSU9OID0gMHgwMDA1MDAwMTsKLWNvbnN0IFJQQ19MT0NfQVBJX0FQSV9NQUpPUl9OVU0gPSAweDAwMDU7Ci1jb25zdCBSUENfTE9DX0FQSUFQSV9WRVJTSU9OX0lTX0hBU0hLRVkgPSAwOwotCi10eXBlZGVmIHJwY19pbnQzMiBycGNfbG9jX2NsaWVudF9oYW5kbGVfdHlwZTsKLQotdHlwZWRlZiBycGNfdWludDY0IHJwY19sb2NfZXZlbnRfbWFza190eXBlOwotCi10eXBlZGVmIHJwY191aW50NjQgcnBjX2xvY19wb3NpdGlvbl92YWxpZF9tYXNrX3R5cGU7Ci0KLXR5cGVkZWYgcnBjX3VpbnQzMiBycGNfbG9jX3Bvc190ZWNobm9sb2d5X21hc2tfdHlwZTsKLQotZW51bSBycGNfbG9jX3Nlc3Npb25fc3RhdHVzX2VfdHlwZSB7Ci0gIFJQQ19MT0NfU0VTU19TVEFUVVNfU1VDQ0VTUyA9IDAsCi0gIFJQQ19MT0NfU0VTU19TVEFUVVNfSU5fUFJPR0VTUyA9IDEsCi0gIFJQQ19MT0NfU0VTU19TVEFUVVNfR0VORVJBTF9GQUlMVVJFID0gMiwKLSAgUlBDX0xPQ19TRVNTX1NUQVRVU19USU1FT1VUID0gMywKLSAgUlBDX0xPQ19TRVNTX1NUQVRVU19VU0VSX0VORCA9IDQsCi0gIFJQQ19MT0NfU0VTU19TVEFUVVNfQkFEX1BBUkFNRVRFUiA9IDUsCi0gIFJQQ19MT0NfU0VTU19TVEFUVVNfUEhPTkVfT0ZGTElORSA9IDYsCi0gIFJQQ19MT0NfU0VTU19TVEFUVVNfRU5HSU5FX0xPQ0tFRCA9IDcsCi0gIFJQQ19MT0NfU0VTU19TVEFUVVNfTUFYID0gMjY4NDM1NDU2Ci19OwotCi1zdHJ1Y3QgcnBjX2xvY19jYWxlbmRhcl90aW1lX3NfdHlwZSB7Ci0gIHJwY191aW50MTYgeWVhcjsKLSAgdW5zaWduZWQgY2hhciBtb250aDsKLSAgdW5zaWduZWQgY2hhciBkYXlfb2Zfd2VlazsKLSAgdW5zaWduZWQgY2hhciBkYXk7Ci0gIHVuc2lnbmVkIGNoYXIgaG91cjsKLSAgdW5zaWduZWQgY2hhciBtaW51dGU7Ci0gIHVuc2lnbmVkIGNoYXIgc2Vjb25kOwotICBycGNfdWludDE2IG1pbGxpc2Vjb25kOwotfTsKLQotc3RydWN0IHJwY19sb2NfcGFyc2VkX3Bvc2l0aW9uX3NfdHlwZSB7Ci0gIHJwY19sb2NfcG9zaXRpb25fdmFsaWRfbWFza190eXBlIHZhbGlkX21hc2s7Ci0gIHJwY19sb2Nfc2Vzc2lvbl9zdGF0dXNfZV90eXBlIHNlc3Npb25fc3RhdHVzOwotICBycGNfbG9jX2NhbGVuZGFyX3RpbWVfc190eXBlIHRpbWVzdGFtcF9jYWxlbmRhcjsKLSAgcnBjX3VpbnQ2NCB0aW1lc3RhbXBfdXRjOwotICBycGNfdWludDggbGVhcF9zZWNvbmRzOwotICBmbG9hdCB0aW1lX3VuYzsKLSAgZG91YmxlIGxhdGl0dWRlOwotICBkb3VibGUgbG9uZ2l0dWRlOwotICBmbG9hdCBhbHRpdHVkZV93cnRfZWxsaXBzb2lkOwotICBmbG9hdCBhbHRpdHVkZV93cnRfbWVhbl9zZWFfbGV2ZWw7Ci0gIGZsb2F0IHNwZWVkX2hvcml6b250YWw7Ci0gIGZsb2F0IHNwZWVkX3ZlcnRpY2FsOwotICBmbG9hdCBoZWFkaW5nOwotICBmbG9hdCBob3JfdW5jX2NpcmN1bGFyOwotICBmbG9hdCBob3JfdW5jX2VsbGlwc2Vfc2VtaV9tYWpvcjsKLSAgZmxvYXQgaG9yX3VuY19lbGxpcHNlX3NlbWlfbWlub3I7Ci0gIGZsb2F0IGhvcl91bmNfZWxsaXBzZV9vcmllbnRfYXppbXV0aDsKLSAgZmxvYXQgdmVydF91bmM7Ci0gIGZsb2F0IHNwZWVkX3VuYzsKLSAgZmxvYXQgaGVhZGluZ191bmM7Ci0gIHVuc2lnbmVkIGNoYXIgY29uZmlkZW5jZV9ob3Jpem9udGFsOwotICB1bnNpZ25lZCBjaGFyIGNvbmZpZGVuY2VfdmVydGljYWw7Ci0gIGZsb2F0IG1hZ25ldGljX2RldmlhdGlvbjsKLSAgcnBjX2xvY19wb3NfdGVjaG5vbG9neV9tYXNrX3R5cGUgdGVjaG5vbG9neV9tYXNrOwotfTsKLQotZW51bSBycGNfbG9jX3N2X3N5c3RlbV9lX3R5cGUgewotICBSUENfTE9DX1NWX1NZU1RFTV9HUFMgPSAxLAotICBSUENfTE9DX1NWX1NZU1RFTV9HQUxJTEVPID0gMiwKLSAgUlBDX0xPQ19TVl9TWVNURU1fU0JBUyA9IDMsCi0gIFJQQ19MT0NfU1ZfU1lTVEVNX0NPTVBBU1MgPSA0LAotICBSUENfTE9DX1NWX1NZU1RFTV9HTE9OQVNTID0gNSwKLSAgUlBDX0xPQ19TVl9TWVNURU1fTUFYID0gMjY4NDM1NDU2Ci19OwotCi1lbnVtIHJwY19sb2Nfc3Zfc3RhdHVzX2VfdHlwZSB7Ci0gIFJQQ19MT0NfU1ZfU1RBVFVTX0lETEUgPSAxLAotICBSUENfTE9DX1NWX1NUQVRVU19TRUFSQ0ggPSAyLAotICBSUENfTE9DX1NWX1NUQVRVU19UUkFDSyA9IDMsCi0gIFJQQ19MT0NfU1ZfU1RBVFVTX01BWCA9IDI2ODQzNTQ1NgotfTsKLQotdHlwZWRlZiBycGNfdWludDMyIHJwY19sb2Nfc3ZfaW5mb192YWxpZF9tYXNrX3R5cGU7Ci0KLXN0cnVjdCBycGNfbG9jX3N2X2luZm9fc190eXBlIHsKLSAgcnBjX2xvY19zdl9pbmZvX3ZhbGlkX21hc2tfdHlwZSB2YWxpZF9tYXNrOwotICBycGNfbG9jX3N2X3N5c3RlbV9lX3R5cGUgc3lzdGVtOwotICBycGNfdWludDggcHJuOwotICBycGNfdWludDggaGVhbHRoX3N0YXR1czsKLSAgcnBjX2xvY19zdl9zdGF0dXNfZV90eXBlIHByb2Nlc3Nfc3RhdHVzOwotICBycGNfYm9vbGVhbiBoYXNfZXBoOwotICBycGNfYm9vbGVhbiBoYXNfYWxtOwotICBmbG9hdCBlbGV2YXRpb247Ci0gIGZsb2F0IGF6aW11dGg7Ci0gIGZsb2F0IHNucjsKLX07Ci0KLXR5cGVkZWYgcnBjX3VpbnQzMiBycGNfbG9jX2duc3NfaW5mb192YWxpZF9tYXNrX3R5cGU7Ci0KLXN0cnVjdCBycGNfbG9jX2duc3NfaW5mb19zX3R5cGUgewotICBycGNfbG9jX2duc3NfaW5mb192YWxpZF9tYXNrX3R5cGUgdmFsaWRfbWFzazsKLSAgZmxvYXQgcG9zaXRpb25fZG9wOwotICBmbG9hdCBob3Jpem9udGFsX2RvcDsKLSAgZmxvYXQgdmVydGljYWxfZG9wOwotICBycGNfYm9vbGVhbiBhbHRpdHVkZV9hc3N1bWVkOwotICBycGNfdWludDE2IHN2X2NvdW50OwotICAgIHJwY19sb2Nfc3ZfaW5mb19zX3R5cGUgc3ZfbGlzdDw4MD47IC8qIEVWQUw6W0xPQ19BUElfTUFYX1NWX0NPVU5UXSovCi19OwotCi1zdHJ1Y3QgcnBjX2xvY19ubWVhX3JlcG9ydF9zX3R5cGUgewotICBycGNfdWludDE2IGxlbmd0aDsKLSAgb3BhcXVlIG5tZWFfc2VudGVuY2VzWzIwMF07Ci19OwotCi1lbnVtIHJwY19sb2Nfc3RhdHVzX2V2ZW50X2VfdHlwZSB7Ci0gIFJQQ19MT0NfU1RBVFVTX0VWRU5UX0VOR0lORV9TVEFURSA9IDEsCi0gIFJQQ19MT0NfU1RBVFVTX0VWRU5UX0ZJWF9TRVNTSU9OX1NUQVRFID0gMiwKLSAgUlBDX0xPQ19TVEFUVVNfRVZFTlRfTUFYID0gMjY4NDM1NDU2Ci19OwotCi1lbnVtIHJwY19sb2NfZW5naW5lX3N0YXRlX2VfdHlwZSB7Ci0gIFJQQ19MT0NfRU5HSU5FX1NUQVRFX09OID0gMSwKLSAgUlBDX0xPQ19FTkdJTkVfU1RBVEVfT0ZGID0gMiwKLSAgUlBDX0xPQ19FTkdJTkVfU1RBVEVfTUFYID0gMjY4NDM1NDU2Ci19OwotCi1lbnVtIHJwY19sb2NfZml4X3Nlc3Npb25fc3RhdGVfZV90eXBlIHsKLSAgUlBDX0xPQ19GSVhfU0VTU0lPTl9TVEFURV9CRUdJTiA9IDEsCi0gIFJQQ19MT0NfRklYX1NFU1NJT05fU1RBVEVfRU5EID0gMiwKLSAgUlBDX0xPQ19GSVhfU0VTU0lPTl9TVEFURV9NQVggPSAyNjg0MzU0NTYKLX07Ci0KLXVuaW9uIHJwY19sb2Nfc3RhdHVzX2V2ZW50X3BheWxvYWRfdV90eXBlIHN3aXRjaCAocnBjX2xvY19zdGF0dXNfZXZlbnRfZV90eXBlIGRpc2MpIHsKLSAgY2FzZSBSUENfTE9DX1NUQVRVU19FVkVOVF9FTkdJTkVfU1RBVEU6Ci0gICAgcnBjX2xvY19lbmdpbmVfc3RhdGVfZV90eXBlIGVuZ2luZV9zdGF0ZTsKLSAgY2FzZSBSUENfTE9DX1NUQVRVU19FVkVOVF9GSVhfU0VTU0lPTl9TVEFURToKLSAgICBycGNfbG9jX2ZpeF9zZXNzaW9uX3N0YXRlX2VfdHlwZSBmaXhfc2Vzc2lvbl9zdGF0ZTsKLSAgZGVmYXVsdDoKLSAgICB2b2lkOwotfTsKLQotc3RydWN0IHJwY19sb2Nfc3RhdHVzX2V2ZW50X3NfdHlwZSB7Ci0gIHJwY19sb2Nfc3RhdHVzX2V2ZW50X2VfdHlwZSBldmVudDsKLSAgcnBjX2xvY19zdGF0dXNfZXZlbnRfcGF5bG9hZF91X3R5cGUgcGF5bG9hZDsKLX07Ci0KLWVudW0gcnBjX2xvY19zZXJ2ZXJfYWRkcl9lX3R5cGUgewotICBSUENfTE9DX1NFUlZFUl9BRERSX0lQVjQgPSAxLAotICBSUENfTE9DX1NFUlZFUl9BRERSX1VSTCA9IDIsCi0gIFJQQ19MT0NfU0VSVkVSX0FERFJfSVBWNiA9IDMsCi0gIFJQQ19MT0NfU0VSVkVSX0FERFJfTUFYID0gMjY4NDM1NDU2Ci19OwotCi1zdHJ1Y3QgcnBjX2xvY19zZXJ2ZXJfYWRkcl9pcHY0X3R5cGUgewotICBycGNfdWludDMyIGFkZHI7Ci0gIHJwY191aW50MTYgcG9ydDsKLX07Ci0KLXN0cnVjdCBycGNfbG9jX3NlcnZlcl9hZGRyX3VybF90eXBlIHsKLSAgcnBjX3VpbnQxNiBsZW5ndGg7Ci0gIG9wYXF1ZSBhZGRyWzI1Nl07Ci19OwotCi1zdHJ1Y3QgcnBjX2xvY19zZXJ2ZXJfYWRkcl9pcHY2X3R5cGUgewotICBycGNfdWludDE2IGFkZHJbOF07Ci0gIHJwY191aW50MzIgcG9ydDsKLX07Ci0KLXVuaW9uIHJwY19sb2Nfc2VydmVyX2FkZHJfdV90eXBlIHN3aXRjaCAocnBjX2xvY19zZXJ2ZXJfYWRkcl9lX3R5cGUgZGlzYykgewotICBjYXNlIFJQQ19MT0NfU0VSVkVSX0FERFJfSVBWNDoKLSAgICBycGNfbG9jX3NlcnZlcl9hZGRyX2lwdjRfdHlwZSBpcHY0OwotICBjYXNlIFJQQ19MT0NfU0VSVkVSX0FERFJfVVJMOgotICAgIHJwY19sb2Nfc2VydmVyX2FkZHJfdXJsX3R5cGUgdXJsOwotICBjYXNlIFJQQ19MT0NfU0VSVkVSX0FERFJfSVBWNjoKLSAgICBycGNfbG9jX3NlcnZlcl9hZGRyX2lwdjZfdHlwZSBpcHY2OwotICBkZWZhdWx0OgotICAgIHZvaWQ7Ci19OwotCi1zdHJ1Y3QgcnBjX2xvY19zZXJ2ZXJfaW5mb19zX3R5cGUgewotICBycGNfbG9jX3NlcnZlcl9hZGRyX2VfdHlwZSBhZGRyX3R5cGU7Ci0gIHJwY19sb2Nfc2VydmVyX2FkZHJfdV90eXBlIGFkZHJfaW5mbzsKLX07Ci0KLWVudW0gcnBjX2xvY19uaV9ub3RpZnlfdmVyaWZ5X2VfdHlwZSB7Ci0gIFJQQ19MT0NfTklfVVNFUl9OT19OT1RJRllfTk9fVkVSSUZZID0gMSwKLSAgUlBDX0xPQ19OSV9VU0VSX05PVElGWV9PTkxZID0gMiwKLSAgUlBDX0xPQ19OSV9VU0VSX05PVElGWV9WRVJJRllfQUxMT1dfTk9fUkVTUCA9IDMsCi0gIFJQQ19MT0NfTklfVVNFUl9OT1RJRllfVkVSSUZZX05PVF9BTExPV19OT19SRVNQID0gNCwKLSAgUlBDX0xPQ19OSV9VU0VSX1BSSVZBQ1lfT1ZFUlJJREUgPSA1LAotICBSUENfTE9DX05JX1VTRVJfTk9USUZZX1ZFUklUWV9UWVBFX01BWCA9IDI2ODQzNTQ1NgotfTsKLQotZW51bSBycGNfbG9jX25pX2V2ZW50X2VfdHlwZSB7Ci0gIFJQQ19MT0NfTklfRVZFTlRfVlhfTk9USUZZX1ZFUklGWV9SRVEgPSAxLAotICBSUENfTE9DX05JX0VWRU5UX1NVUExfTk9USUZZX1ZFUklGWV9SRVEgPSAyLAotICBSUENfTE9DX05JX0VWRU5UX1VNVFNfQ1BfTk9USUZZX1ZFUklGWV9SRVEgPSAzLAotICBSUENfTE9DX05JX0VWRU5UX1ZYX1NFUlZJQ0VfSU5URVJBQ1RJT05fUkVRID0gNCwKLSAgUlBDX0xPQ19OSV9FVkVOVF9NQVggPSAyNjg0MzU0NTYKLX07Ci0KLWVudW0gcnBjX2xvY19uaV9kYXRhY29kaW5nX3NjaGVtZV9lX3R5cGUgewotICBSUENfTE9DX05JX1BSRVNVUExfSVNPNjQ2SVJWID0gMCwKLSAgUlBDX0xPQ19OSV9QUkVTVVBMX0lTTzg4NTkgPSAxLAotICBSUENfTE9DX05JX1BSRVNVUExfVVRGOCA9IDIsCi0gIFJQQ19MT0NfTklfUFJFU1VQTF9VVEYxNiA9IDMsCi0gIFJQQ19MT0NfTklfUFJFU1VQTF9VQ1MyID0gNCwKLSAgUlBDX0xPQ19OSV9QUkVTVVBMX0dTTV9ERUZBVUxUID0gNSwKLSAgUlBDX0xPQ19OSV9QUkVTVVBMX1NISUZUX0pJUyA9IDYsCi0gIFJQQ19MT0NfTklfUFJFU1VQTF9KSVMgPSA3LAotICBSUENfTE9DX05JX1BSRVNVUExfRVVDID0gOCwKLSAgUlBDX0xPQ19OSV9QUkVTVVBMX0dCMjMxMiA9IDksCi0gIFJQQ19MT0NfTklfUFJFU1VQTF9DTlMxMTY0MyA9IDEwLAotICBSUENfTE9DX05JX1BSRVNVUExfS1NDMTAwMSA9IDExLAotICBSUENfTE9DX05JX1BSRVNVUExfRU5DT0RJTkdfVU5LTk9XTiA9IDIxNDc0ODM2NDcsCi0gIFJQQ19MT0NfTklfU1NfR0VSTUFOID0gMTIsCi0gIFJQQ19MT0NfTklfU1NfRU5HTElTSCA9IDEzLAotICBSUENfTE9DX05JX1NTX0lUQUxJQU4gPSAxNCwKLSAgUlBDX0xPQ19OSV9TU19GUkVOQ0ggPSAxNSwKLSAgUlBDX0xPQ19OSV9TU19TUEFOSVNIID0gMTYsCi0gIFJQQ19MT0NfTklfU1NfRFVUQ0ggPSAxNywKLSAgUlBDX0xPQ19OSV9TU19TV0VESVNIID0gMTgsCi0gIFJQQ19MT0NfTklfU1NfREFOSVNIID0gMTksCi0gIFJQQ19MT0NfTklfU1NfUE9SVFVHVUVTRSA9IDIwLAotICBSUENfTE9DX05JX1NTX0ZJTk5JU0ggPSAyMSwKLSAgUlBDX0xPQ19OSV9TU19OT1JXRUdJQU4gPSAyMiwKLSAgUlBDX0xPQ19OSV9TU19HUkVFSyA9IDIzLAotICBSUENfTE9DX05JX1NTX1RVUktJU0ggPSAyNCwKLSAgUlBDX0xPQ19OSV9TU19IVU5HQVJJQU4gPSAyNSwKLSAgUlBDX0xPQ19OSV9TU19QT0xJU0ggPSAyNiwKLSAgUlBDX0xPQ19OSV9TU19MQU5HVUFHRV9VTlNQRUMgPSAyNywKLSAgUlBDX0xPQ19OSV9TVVBMX1VURjggPSAyOCwKLSAgUlBDX0xPQ19OSV9TVVBMX1VDUzIgPSAyOSwKLSAgUlBDX0xPQ19OSV9TVVBMX0dTTV9ERUZBVUxUID0gMzAsCi0gIFJQQ19MT0NfTklfU1VQTF9FTkNPRElOR19VTktOT1dOID0gMjE0NzQ4MzY0NwotfTsKLQotZW51bSBycGNfbG9jX25pX3Z4X3JlcXVlc3Rlcl9pZF9lbmNvZGluZ19zY2hlbWVfZV90eXBlIHsKLSAgUlBDX0xPQ19OSV9WWF9PQ1RFVCA9IDAsCi0gIFJQQ19MT0NfTklfVlhfRVhOX1BST1RPQ09MX01TRyA9IDEsCi0gIFJQQ19MT0NfTklfVlhfQVNDSUkgPSAyLAotICBSUENfTE9DX05JX1ZYX0lBNSA9IDMsCi0gIFJQQ19MT0NfTklfVlhfVU5JQ09ERSA9IDQsCi0gIFJQQ19MT0NfTklfVlhfU0hJRlRfSklTID0gNSwKLSAgUlBDX0xPQ19OSV9WWF9LT1JFQU4gPSA2LAotICBSUENfTE9DX05JX1ZYX0xBVElOX0hFQlJFVyA9IDcsCi0gIFJQQ19MT0NfTklfVlhfTEFUSU4gPSA4LAotICBSUENfTE9DX05JX1ZYX0dTTSA9IDksCi0gIFJQQ19MT0NfTklfVlhfRU5DT0RJTkdfVFlQRV9NQVggPSAyNjg0MzU0NTYKLX07Ci0KLWVudW0gcnBjX2xvY19uaV92eF9wb3NfbW9kZV9lX3R5cGUgewotICBSUENfTE9DX1ZYX01TX0FTU0lTVEVEX09OTFkgPSAxLAotICBSUENfTE9DX1ZYX01TX0JBU0VEX09OTFkgPSAyLAotICBSUENfTE9DX1ZYX01TX0FTU0lTVEVEX1BSRUZfTVNCQVNFRF9BTExXRCA9IDMsCi0gIFJQQ19MT0NfVlhfTVNfQkFTRURfUFJFRl9BU1NJU1RFRF9BTExXRCA9IDQsCi0gIFJQQ19MT0NfVlhfUE9TX01PREVfTUFYID0gMjY4NDM1NDU2Ci19OwotCi1zdHJ1Y3QgcnBjX2xvY19uaV92eF9yZXF1ZXN0ZXJfaWRfc190eXBlIHsKLSAgdW5zaWduZWQgY2hhciByZXF1ZXN0ZXJfaWRfbGVuZ3RoOwotICBvcGFxdWUgcmVxdWVzdGVyX2lkWzIwMF07Ci19OwotCi1zdHJ1Y3QgcnBjX2xvY19uaV92eF9ub3RpZnlfdmVyaWZ5X3JlcV9zX3R5cGUgewotICBycGNfbG9jX25pX25vdGlmeV92ZXJpZnlfZV90eXBlIG5vdGlmaWNhdGlvbl9wcml2X3R5cGU7Ci0gIHVuc2lnbmVkIGNoYXIgcG9zX3Fvc19pbmNsOwotICB1bnNpZ25lZCBjaGFyIHBvc19xb3M7Ci0gIHJwY191aW50MzIgbnVtX2ZpeGVzOwotICBycGNfdWludDMyIHRiZjsKLSAgcnBjX2xvY19uaV92eF9wb3NfbW9kZV9lX3R5cGUgcG9zX21vZGU7Ci0gIHJwY19sb2NfbmlfdnhfcmVxdWVzdGVyX2lkX2VuY29kaW5nX3NjaGVtZV9lX3R5cGUgZW5jb2Rpbmdfc2NoZW1lOwotICBycGNfbG9jX25pX3Z4X3JlcXVlc3Rlcl9pZF9zX3R5cGUgcmVxdWVzdGVyX2lkOwotICBycGNfdWludDE2IHVzZXJfcmVzcF90aW1lcl92YWw7Ci19OwotCi1lbnVtIHJwY19sb2Nfbmlfc3VwbF9wb3NfbWV0aG9kX2VfdHlwZSB7Ci0gIFJQQ19MT0NfTklfUE9TTUVUSE9EX0FHUFNfU0VUQVNTSVNURUQgPSAxLAotICBSUENfTE9DX05JX1BPU01FVEhPRF9BR1BTX1NFVEJBU0VEID0gMiwKLSAgUlBDX0xPQ19OSV9QT1NNRVRIT0RfQUdQU19TRVRBU1NJU1RFRF9QUkVGID0gMywKLSAgUlBDX0xPQ19OSV9QT1NNRVRIT0RfQUdQU19TRVRCQVNFRF9QUkVGID0gNCwKLSAgUlBDX0xPQ19OSV9QT1NNRVRIT0RfQVVUT05PTU9VU19HUFMgPSA1LAotICBSUENfTE9DX05JX1BPU01FVEhPRF9BRkxUID0gNiwKLSAgUlBDX0xPQ19OSV9QT1NNRVRIT0RfRUNJRCA9IDcsCi0gIFJQQ19MT0NfTklfUE9TTUVUSE9EX0VPVEQgPSA4LAotICBSUENfTE9DX05JX1BPU01FVEhPRF9PVERPQSA9IDksCi0gIFJQQ19MT0NfTklfUE9TTUVUSE9EX05PX1BPU0lUSU9OID0gMTAsCi0gIFJQQ19MT0NfTklfUE9TTUVUSE9EX01BWCA9IDI2ODQzNTQ1NgotfTsKLQotc3RydWN0IHJwY19sb2Nfbmlfc3VwbF9zbHBfc2Vzc2lvbl9pZF9zX3R5cGUgewotICB1bnNpZ25lZCBjaGFyIHByZXNlbmNlOwotICBvcGFxdWUgc2Vzc2lvbl9pZFs0XTsKLSAgcnBjX2xvY19zZXJ2ZXJfaW5mb19zX3R5cGUgc2xwX2FkZHJlc3M7Ci19OwotCi1zdHJ1Y3QgcnBjX2xvY19uaV9yZXF1ZXN0b3JfaWRfc190eXBlIHsKLSAgdW5zaWduZWQgY2hhciBkYXRhX2NvZGluZ19zY2hlbWU7Ci0gIG9wYXF1ZSByZXF1ZXN0b3JfaWRfc3RyaW5nWzIwMF07Ci0gIHVuc2lnbmVkIGNoYXIgc3RyaW5nX2xlbjsKLX07Ci0KLXN0cnVjdCBycGNfbG9jX25pX3N1cGxfY2xpZW50X25hbWVfc190eXBlIHsKLSAgdW5zaWduZWQgY2hhciBkYXRhX2NvZGluZ19zY2hlbWU7Ci0gIG9wYXF1ZSBjbGllbnRfbmFtZV9zdHJpbmdbNjRdOwotICB1bnNpZ25lZCBjaGFyIHN0cmluZ19sZW47Ci19OwotCi1zdHJ1Y3QgcnBjX2xvY19uaV9zdXBsX3FvcF9zX3R5cGUgewotICB1bnNpZ25lZCBjaGFyIGJpdF9tYXNrOwotICB1bnNpZ25lZCBjaGFyIGhvcmFjYzsKLSAgdW5zaWduZWQgY2hhciB2ZXJhY2M7Ci0gIHJwY191aW50MTYgbWF4TG9jQWdlOwotICB1bnNpZ25lZCBjaGFyIGRlbGF5OwotfTsKLQotc3RydWN0IHJwY19sb2Nfbmlfc3VwbF9ub3RpZnlfdmVyaWZ5X3JlcV9zX3R5cGUgewotICBycGNfbG9jX25pX25vdGlmeV92ZXJpZnlfZV90eXBlIG5vdGlmaWNhdGlvbl9wcml2X3R5cGU7Ci0gIHJwY191aW50MTYgZmxhZ3M7Ci0gIHJwY19sb2Nfbmlfc3VwbF9zbHBfc2Vzc2lvbl9pZF9zX3R5cGUgc3VwbF9zbHBfc2Vzc2lvbl9pZDsKLSAgb3BhcXVlIHN1cGxfaGFzaFs4XTsKLSAgcnBjX2xvY19uaV9kYXRhY29kaW5nX3NjaGVtZV9lX3R5cGUgZGF0YWNvZGluZ19zY2hlbWU7Ci0gIHJwY19sb2Nfbmlfc3VwbF9wb3NfbWV0aG9kX2VfdHlwZSBwb3NfbWV0aG9kOwotICBycGNfbG9jX25pX3JlcXVlc3Rvcl9pZF9zX3R5cGUgcmVxdWVzdG9yX2lkOwotICBycGNfbG9jX25pX3N1cGxfY2xpZW50X25hbWVfc190eXBlIGNsaWVudF9uYW1lOwotICBycGNfbG9jX25pX3N1cGxfcW9wX3NfdHlwZSBzdXBsX3FvcDsKLSAgcnBjX3VpbnQxNiB1c2VyX3Jlc3BvbnNlX3RpbWVyOwotfTsKLQotc3RydWN0IHJwY19sb2NfbmlfZXh0X2NsaWVudF9hZGRyZXNzX3NfdHlwZSB7Ci0gIHVuc2lnbmVkIGNoYXIgZXh0X2NsaWVudF9hZGRyZXNzX2xlbjsKLSAgb3BhcXVlIGV4dF9jbGllbnRfYWRkcmVzc1syMF07Ci19OwotCi1lbnVtIHJwY19sb2NfbmlfbG9jYXRpb25fdHlwZV9lX3R5cGUgewotICBSUENfTE9DX05JX0xPQ0FUSU9OVFlQRV9DVVJSRU5UX0xPQ0FUSU9OID0gMSwKLSAgUlBDX0xPQ19OSV9MT0NBVElPTlRZUEVfQ1VSUkVOVF9PUl9MQVNUX0tOT1dOX0xPQ0FUSU9OID0gMiwKLSAgUlBDX0xPQ19OSV9MT0NBVElPTlRZUEVfSU5JVElBTF9MT0NBVElPTiA9IDMsCi0gIFJQQ19MT0NfTklfTE9DQVRJT05UWVBFX01BWCA9IDI2ODQzNTQ1NgotfTsKLQotc3RydWN0IHJwY19sb2NfbmlfZGVmZXJyZWRfbG9jYXRpb25fc190eXBlIHsKLSAgdW5zaWduZWQgY2hhciB1bnVzZWRfYml0czsKLSAgdW5zaWduZWQgY2hhciBtc19hdmFpbGFibGU7Ci19OwotCi1zdHJ1Y3QgcnBjX2xvY19uaV9jb2Rld29yZF9zdHJpbmdfc190eXBlIHsKLSAgdW5zaWduZWQgY2hhciBkYXRhX2NvZGluZ19zY2hlbWU7Ci0gIG9wYXF1ZSBsY3NfY29kZXdvcmRfc3RyaW5nWzIwXTsKLSAgdW5zaWduZWQgY2hhciBzdHJpbmdfbGVuOwotfTsKLQotc3RydWN0IHJwY19sb2Nfbmlfc2VydmljZV90eXBlX2lkX3NfdHlwZSB7Ci0gIHVuc2lnbmVkIGNoYXIgbGNzX3NlcnZpY2VfdHlwZV9pZDsKLX07Ci0KLXN0cnVjdCBycGNfbG9jX25pX3VtdHNfY3Bfbm90aWZ5X3ZlcmlmeV9yZXFfc190eXBlIHsKLSAgcnBjX2xvY19uaV9ub3RpZnlfdmVyaWZ5X2VfdHlwZSBub3RpZmljYXRpb25fcHJpdl90eXBlOwotICB1bnNpZ25lZCBjaGFyIGludm9rZV9pZDsKLSAgcnBjX3VpbnQxNiBmbGFnczsKLSAgdW5zaWduZWQgY2hhciBub3RpZmljYXRpb25fbGVuZ3RoOwotICBvcGFxdWUgbm90aWZpY2F0aW9uX3RleHRbNjRdOwotICBycGNfbG9jX25pX2RhdGFjb2Rpbmdfc2NoZW1lX2VfdHlwZSBkYXRhY29kaW5nX3NjaGVtZTsKLSAgcnBjX2xvY19uaV9leHRfY2xpZW50X2FkZHJlc3Nfc190eXBlIGV4dF9jbGllbnRfYWRkcmVzc19kYXRhOwotICBycGNfbG9jX25pX2xvY2F0aW9uX3R5cGVfZV90eXBlIGxvY2F0aW9uX3R5cGU7Ci0gIHJwY19sb2NfbmlfZGVmZXJyZWRfbG9jYXRpb25fc190eXBlIGRlZmVycmVkX2xvY2F0aW9uOwotICBycGNfbG9jX25pX3JlcXVlc3Rvcl9pZF9zX3R5cGUgcmVxdWVzdG9yX2lkOwotICBycGNfbG9jX25pX2NvZGV3b3JkX3N0cmluZ19zX3R5cGUgY29kZXdvcmRfc3RyaW5nOwotICBycGNfbG9jX25pX3NlcnZpY2VfdHlwZV9pZF9zX3R5cGUgc2VydmljZV90eXBlX2lkOwotICBycGNfdWludDE2IHVzZXJfcmVzcG9uc2VfdGltZXI7Ci19OwotCi1lbnVtIHJwY19sb2Nfbmlfc2VydmljZV9pbnRlcmFjdGlvbl9lX3R5cGUgewotICBSUENfTE9DX05JX1NFUlZJQ0VfSU5URVJBQ1RJT05fT05HT0lOR19OSV9JTkNPTUlOR19NTyA9IDEsCi0gIFJQQ19MT0NfTklfU0VSVklDRV9JTlRFUkFDVElPTl9NQVggPSAyNjg0MzU0NTYKLX07Ci0KLXN0cnVjdCBycGNfbG9jX25pX3Z4X3NlcnZpY2VfaW50ZXJhY3Rpb25fcmVxX3NfdHlwZSB7Ci0gIHJwY19sb2Nfbmlfdnhfbm90aWZ5X3ZlcmlmeV9yZXFfc190eXBlIG5pX3Z4X3JlcTsKLSAgcnBjX2xvY19uaV9zZXJ2aWNlX2ludGVyYWN0aW9uX2VfdHlwZSBzZXJ2aWNlX2ludGVyYXRpb25fdHlwZTsKLX07Ci0KLXVuaW9uIHJwY19sb2NfbmlfZXZlbnRfcGF5bG9hZF91X3R5cGUgc3dpdGNoIChycGNfbG9jX25pX2V2ZW50X2VfdHlwZSBkaXNjKSB7Ci0gIGNhc2UgUlBDX0xPQ19OSV9FVkVOVF9WWF9OT1RJRllfVkVSSUZZX1JFUToKLSAgICBycGNfbG9jX25pX3Z4X25vdGlmeV92ZXJpZnlfcmVxX3NfdHlwZSB2eF9yZXE7Ci0gIGNhc2UgUlBDX0xPQ19OSV9FVkVOVF9TVVBMX05PVElGWV9WRVJJRllfUkVROgotICAgIHJwY19sb2Nfbmlfc3VwbF9ub3RpZnlfdmVyaWZ5X3JlcV9zX3R5cGUgc3VwbF9yZXE7Ci0gIGNhc2UgUlBDX0xPQ19OSV9FVkVOVF9VTVRTX0NQX05PVElGWV9WRVJJRllfUkVROgotICAgIHJwY19sb2NfbmlfdW10c19jcF9ub3RpZnlfdmVyaWZ5X3JlcV9zX3R5cGUgdW10c19jcF9yZXE7Ci0gIGNhc2UgUlBDX0xPQ19OSV9FVkVOVF9WWF9TRVJWSUNFX0lOVEVSQUNUSU9OX1JFUToKLSAgICBycGNfbG9jX25pX3Z4X3NlcnZpY2VfaW50ZXJhY3Rpb25fcmVxX3NfdHlwZSBzZXJ2aWNlX2ludGVyYWN0aW9uX3JlcTsKLSAgZGVmYXVsdDoKLSAgICB2b2lkOwotfTsKLQotc3RydWN0IHJwY19sb2NfbmlfZXZlbnRfc190eXBlIHsKLSAgcnBjX2xvY19uaV9ldmVudF9lX3R5cGUgZXZlbnQ7Ci0gIHJwY19sb2NfbmlfZXZlbnRfcGF5bG9hZF91X3R5cGUgcGF5bG9hZDsKLX07Ci0KLWVudW0gcnBjX2xvY19hc3Npc3RfZGF0YV9yZXF1ZXN0X2VfdHlwZSB7Ci0gIFJQQ19MT0NfQVNTSVNUX0RBVEFfVElNRV9SRVEgPSAxLAotICBSUENfTE9DX0FTU0lTVF9EQVRBX1BSRURJQ1RFRF9PUkJJVFNfUkVRID0gMiwKLSAgUlBDX0xPQ19BU1NJU1RfREFUQV9QT1NJVElPTl9JTkpFQ1RJT05fUkVRID0gMywKLSAgUlBDX0xPQ19BU1NJU1RfREFUQV9NQVggPSAyNjg0MzU0NTYKLX07Ci0KLXR5cGVkZWYgc3RyaW5nIHJwY19zdHJ1Y3RfbG9jX3RpbWVfZG93bmxvYWRfc291cmNlX3NfdHlwZV9zZXJ2ZXJzX3B0cjwyNTY+OyAvKiBFVkFMOltMT0NfQVBJX01BWF9TRVJWRVJfQUREUl9MRU5HVEhdKi8KLQotdHlwZWRlZiBycGNfc3RydWN0X2xvY190aW1lX2Rvd25sb2FkX3NvdXJjZV9zX3R5cGVfc2VydmVyc19wdHIgcnBjX3N0cnVjdF9sb2NfdGltZV9kb3dubG9hZF9zb3VyY2Vfc190eXBlX3NlcnZlcnNbM107Ci0KLXN0cnVjdCBycGNfbG9jX3RpbWVfZG93bmxvYWRfc291cmNlX3NfdHlwZSB7Ci0gIHJwY191aW50MzIgZGVsYXlfdGhyZXNob2xkOwotICBycGNfc3RydWN0X2xvY190aW1lX2Rvd25sb2FkX3NvdXJjZV9zX3R5cGVfc2VydmVycyBzZXJ2ZXJzOwotfTsKLQotdHlwZWRlZiBzdHJpbmcgcnBjX3N0cnVjdF9sb2NfcHJlZGljdGVkX29yYml0c19kYXRhX3NvdXJjZV9zX3R5cGVfc2VydmVyc19wdHI8TE9DX0FQSV9NQVhfU0VSVkVSX0FERFJfTEVOR1RIPjsKLQotdHlwZWRlZiBycGNfc3RydWN0X2xvY19wcmVkaWN0ZWRfb3JiaXRzX2RhdGFfc291cmNlX3NfdHlwZV9zZXJ2ZXJzX3B0ciBycGNfc3RydWN0X2xvY19wcmVkaWN0ZWRfb3JiaXRzX2RhdGFfc291cmNlX3NfdHlwZV9zZXJ2ZXJzWzNdOwotCi1zdHJ1Y3QgcnBjX2xvY19wcmVkaWN0ZWRfb3JiaXRzX2RhdGFfc291cmNlX3NfdHlwZSB7Ci0gIHJwY191aW50MzIgbWF4X2ZpbGVfc2l6ZTsKLSAgcnBjX3VpbnQzMiBtYXhfcGFydF9zaXplOwotICBycGNfc3RydWN0X2xvY19wcmVkaWN0ZWRfb3JiaXRzX2RhdGFfc291cmNlX3NfdHlwZV9zZXJ2ZXJzIHNlcnZlcnM7Ci19OwotCi1zdHJ1Y3QgcnBjX2xvY19wb3NfaW5qX3JlcXVlc3Rfc190eXBlIHsKLSAgcnBjX3VpbnQzMiBmbGFnczsKLSAgZG91YmxlIGxhdGl0dWRlOwotICBkb3VibGUgbG9uZ2l0dWRlOwotICBycGNfdWludDMyIHBvc2l0aW9uX3VuY2VydGFpbnR5OwotICBycGNfdWludDY0IHRpbWVzdGFtcDsKLX07Ci0KLXVuaW9uIHJwY19sb2NfYXNzaXN0X2RhdGFfcmVxdWVzdF9wYXlsb2FkX3VfdHlwZSBzd2l0Y2ggKHJwY19sb2NfYXNzaXN0X2RhdGFfcmVxdWVzdF9lX3R5cGUgZGlzYykgewotICBjYXNlIFJQQ19MT0NfQVNTSVNUX0RBVEFfVElNRV9SRVE6Ci0gICAgcnBjX2xvY190aW1lX2Rvd25sb2FkX3NvdXJjZV9zX3R5cGUgdGltZV9kb3dubG9hZDsKLSAgY2FzZSBSUENfTE9DX0FTU0lTVF9EQVRBX1BSRURJQ1RFRF9PUkJJVFNfUkVROgotICAgIHJwY19sb2NfcHJlZGljdGVkX29yYml0c19kYXRhX3NvdXJjZV9zX3R5cGUgZGF0YV9kb3dubG9hZDsKLSAgY2FzZSBSUENfTE9DX0FTU0lTVF9EQVRBX1BPU0lUSU9OX0lOSkVDVElPTl9SRVE6Ci0gICAgcnBjX2xvY19wb3NfaW5qX3JlcXVlc3Rfc190eXBlIHBvc19pbmplY3Rpb247Ci0gIGRlZmF1bHQ6Ci0gICAgdm9pZDsKLX07Ci0KLXN0cnVjdCBycGNfbG9jX2Fzc2lzdF9kYXRhX3JlcXVlc3Rfc190eXBlIHsKLSAgcnBjX2xvY19hc3Npc3RfZGF0YV9yZXF1ZXN0X2VfdHlwZSBldmVudDsKLSAgcnBjX2xvY19hc3Npc3RfZGF0YV9yZXF1ZXN0X3BheWxvYWRfdV90eXBlIHBheWxvYWQ7Ci19OwotCi10eXBlZGVmIHJwY191aW50MzIgcnBjX2xvY19zZXJ2ZXJfY29ubmVjdGlvbl9oYW5kbGU7Ci0KLWVudW0gcnBjX2xvY19zZXJ2ZXJfcHJvdG9jb2xfZV90eXBlIHsKLSAgUlBDX0xPQ19TRVJWRVJfUFJPVE9DT0xfREVGQVVMVCA9IDAsCi0gIFJQQ19MT0NfU0VSVkVSX1BST1RPQ09MX1NVUEwgPSAxLAotICBSUENfTE9DX1NFUlZFUl9QUk9UT0NPTF9WWF9NUEMgPSAyLAotICBSUENfTE9DX1NFUlZFUl9QUk9UT0NPTF9WWF9QREUgPSAzLAotICBSUENfTE9DX1NFUlZFUl9QUk9UT0NPTF9NQVggPSAxNjc3NzIxNgotfTsKLQotZW51bSBycGNfbG9jX3NlcnZlcl9jb25uZWN0aW9uX2VfdHlwZSB7Ci0gIFJQQ19MT0NfU0VSVkVSX0NPTk5FQ1RJT05fTEJTID0gMCwKLSAgUlBDX0xPQ19TRVJWRVJfQ09OTkVDVElPTl9XV0FOX0lOVEVSTkVULAotICBSUENfTE9DX1NFUlZFUl9DT05ORUNUSU9OX01BWCA9IDE2Nzc3MjE2Ci19OwotCi1lbnVtIHJwY19sb2Nfc2VydmVyX3JlcXVlc3RfZV90eXBlIHsKLSAgUlBDX0xPQ19TRVJWRVJfUkVRVUVTVF9PUEVOID0gMSwKLSAgUlBDX0xPQ19TRVJWRVJfUkVRVUVTVF9DTE9TRSA9IDIsCi0gIFJQQ19MT0NfU0VSVkVSX1JFUVVFU1RfTVVMVElfT1BFTiA9IDMsCi0gIFJQQ19MT0NfU0VSVkVSX1JFUVVFU1RfTUFYID0gMjY4NDM1NDU2Ci19OwotCi1zdHJ1Y3QgcnBjX2xvY19zZXJ2ZXJfb3Blbl9yZXFfc190eXBlIHsKLSAgcnBjX2xvY19zZXJ2ZXJfY29ubmVjdGlvbl9oYW5kbGUgY29ubl9oYW5kbGU7Ci0gIHJwY19sb2Nfc2VydmVyX3Byb3RvY29sX2VfdHlwZSBwcm90b2NvbDsKLX07Ci0KLXN0cnVjdCBycGNfbG9jX3NlcnZlcl9tdWx0aV9vcGVuX3JlcV9zX3R5cGUgewotICBycGNfbG9jX3NlcnZlcl9jb25uZWN0aW9uX2hhbmRsZSBjb25uX2hhbmRsZTsKLSAgcnBjX2xvY19zZXJ2ZXJfcHJvdG9jb2xfZV90eXBlIHByb3RvY29sOwotICBycGNfbG9jX3NlcnZlcl9jb25uZWN0aW9uX2VfdHlwZSBjb25uZWN0aW9uX3R5cGU7Ci19OwotCi1zdHJ1Y3QgcnBjX2xvY19zZXJ2ZXJfY2xvc2VfcmVxX3NfdHlwZSB7Ci0gIHJwY19sb2Nfc2VydmVyX2Nvbm5lY3Rpb25faGFuZGxlIGNvbm5faGFuZGxlOwotfTsKLQotdW5pb24gcnBjX2xvY19zZXJ2ZXJfcmVxdWVzdF91X3R5cGUgc3dpdGNoIChycGNfbG9jX3NlcnZlcl9yZXF1ZXN0X2VfdHlwZSBkaXNjKSB7Ci0gIGNhc2UgUlBDX0xPQ19TRVJWRVJfUkVRVUVTVF9PUEVOOgotICAgIHJwY19sb2Nfc2VydmVyX29wZW5fcmVxX3NfdHlwZSBvcGVuX3JlcTsKLSAgY2FzZSBSUENfTE9DX1NFUlZFUl9SRVFVRVNUX0NMT1NFOgotICAgIHJwY19sb2Nfc2VydmVyX2Nsb3NlX3JlcV9zX3R5cGUgY2xvc2VfcmVxOwotICBjYXNlIFJQQ19MT0NfU0VSVkVSX1JFUVVFU1RfTVVMVElfT1BFTjoKLSAgICBycGNfbG9jX3NlcnZlcl9tdWx0aV9vcGVuX3JlcV9zX3R5cGUgbXVsdGlfb3Blbl9yZXE7Ci0gIGRlZmF1bHQ6Ci0gICAgdm9pZDsKLX07Ci0KLXN0cnVjdCBycGNfbG9jX3NlcnZlcl9yZXF1ZXN0X3NfdHlwZSB7Ci0gIHJwY19sb2Nfc2VydmVyX3JlcXVlc3RfZV90eXBlIGV2ZW50OwotICBycGNfbG9jX3NlcnZlcl9yZXF1ZXN0X3VfdHlwZSBwYXlsb2FkOwotfTsKLQotZW51bSBycGNfbG9jX3F3aXBfcmVxdWVzdF9lX3R5cGUgewotICBSUENfTE9DX1FXSVBfU1RBUlRfUEVSSU9ESUNfSElfRlJFUV9GSVhFUyA9IDAsCi0gIFJQQ19MT0NfUVdJUF9TVEFSVF9QRVJJT0RJQ19LRUVQX1dBUk0sCi0gIFJQQ19MT0NfUVdJUF9TVE9QX1BFUklPRElDX0ZJWEVTLAotICBSUENfTE9DX1FXSVBfU1VTUEVORCwKLSAgUlBDX0xPQ19RV0lQX1JFUVVFU1RfTUFYID0gMjY4NDM1NDU2Ci19OwotCi1zdHJ1Y3QgcnBjX2xvY19xd2lwX3JlcXVlc3Rfc190eXBlIHsKLSAgcnBjX2xvY19xd2lwX3JlcXVlc3RfZV90eXBlIHJlcXVlc3RfdHlwZTsKLSAgcnBjX3VpbnQxNiB0YmZfbXM7Ci19OwotCi1zdHJ1Y3QgcnBjX2xvY19yZXNlcnZlZF9wYXlsb2FkX3NfdHlwZSB7Ci0gIHJwY191aW50MTYgZGF0YV9zaXplOwotICBvcGFxdWUgZGF0YTw+OwotfTsKLQotZW51bSBycGNfbG9jX2lvY3RsX2VfdHlwZSB7Ci0gIFJQQ19MT0NfSU9DVExfR0VUX0FQSV9WRVJTSU9OID0gMSwKLSAgUlBDX0xPQ19JT0NUTF9TRVRfRklYX0NSSVRFUklBID0gMiwKLSAgUlBDX0xPQ19JT0NUTF9HRVRfRklYX0NSSVRFUklBID0gMywKLSAgUlBDX0xPQ19JT0NUTF9TRVJWSUNFX1NUQVJUX0lOREVYID0gNDAwLAotICBSUENfTE9DX0lPQ1RMX0lORk9STV9OSV9VU0VSX1JFU1BPTlNFID0gNDAwLAotICBSUENfTE9DX0lPQ1RMX0lOSkVDVF9QUkVESUNURURfT1JCSVRTX0RBVEEgPSA0MDEsCi0gIFJQQ19MT0NfSU9DVExfUVVFUllfUFJFRElDVEVEX09SQklUU19EQVRBX1ZBTElESVRZID0gNDAyLAotICBSUENfTE9DX0lPQ1RMX1FVRVJZX1BSRURJQ1RFRF9PUkJJVFNfREFUQV9TT1VSQ0UgPSA0MDMsCi0gIFJQQ19MT0NfSU9DVExfU0VUX1BSRURJQ1RFRF9PUkJJVFNfREFUQV9BVVRPX0RPV05MT0FEID0gNDA0LAotICBSUENfTE9DX0lPQ1RMX0lOSkVDVF9VVENfVElNRSA9IDQwNSwKLSAgUlBDX0xPQ19JT0NUTF9JTkpFQ1RfUlRDX1ZBTFVFID0gNDA2LAotICBSUENfTE9DX0lPQ1RMX0lOSkVDVF9QT1NJVElPTiA9IDQwNywKLSAgUlBDX0xPQ19JT0NUTF9RVUVSWV9FTkdJTkVfU1RBVEUgPSA0MDgsCi0gIFJQQ19MT0NfSU9DVExfSU5GT1JNX1NFUlZFUl9PUEVOX1NUQVRVUyA9IDQwOSwKLSAgUlBDX0xPQ19JT0NUTF9JTkZPUk1fU0VSVkVSX0NMT1NFX1NUQVRVUyA9IDQxMCwKLSAgUlBDX0xPQ19JT0NUTF9TRU5EX1dJUEVSX1BPU0lUSU9OX1JFUE9SVCA9IDQxMSwKLSAgUlBDX0xPQ19JT0NUTF9OT1RJRllfV0lQRVJfU1RBVFVTID0gNDEyLAotICBSUENfTE9DX0lPQ1RMX0FDQ0VTU19FRlNfREFUQSA9IDQxMywKLSAgUlBDX0xPQ19JT0NUTF9FUlJPUl9FU1RJTUFURV9DT05GSUcgPSA0MTQsCi0gIFJQQ19MT0NfSU9DVExfSU5GT1JNX1NFUlZFUl9NVUxUSV9PUEVOX1NUQVRVUyA9IDQxNSwKLSAgUlBDX0xPQ19JT0NUTF9OVl9TRVRUSU5HU19TVEFSVF9JTkRFWCA9IDgwMCwKLSAgUlBDX0xPQ19JT0NUTF9TRVRfRU5HSU5FX0xPQ0sgPSA4MDAsCi0gIFJQQ19MT0NfSU9DVExfR0VUX0VOR0lORV9MT0NLID0gODAxLAotICBSUENfTE9DX0lPQ1RMX1NFVF9TQkFTX0NPTkZJRyA9IDgwMiwKLSAgUlBDX0xPQ19JT0NUTF9HRVRfU0JBU19DT05GSUcgPSA4MDMsCi0gIFJQQ19MT0NfSU9DVExfU0VUX05NRUFfVFlQRVMgPSA4MDQsCi0gIFJQQ19MT0NfSU9DVExfR0VUX05NRUFfVFlQRVMgPSA4MDUsCi0gIFJQQ19MT0NfSU9DVExfU0VUX0NETUFfUERFX1NFUlZFUl9BRERSID0gODA2LAotICBSUENfTE9DX0lPQ1RMX0dFVF9DRE1BX1BERV9TRVJWRVJfQUREUiA9IDgwNywKLSAgUlBDX0xPQ19JT0NUTF9TRVRfQ0RNQV9NUENfU0VSVkVSX0FERFIgPSA4MDgsCi0gIFJQQ19MT0NfSU9DVExfR0VUX0NETUFfTVBDX1NFUlZFUl9BRERSID0gODA5LAotICBSUENfTE9DX0lPQ1RMX1NFVF9VTVRTX1NMUF9TRVJWRVJfQUREUiA9IDgxMCwKLSAgUlBDX0xPQ19JT0NUTF9HRVRfVU1UU19TTFBfU0VSVkVSX0FERFIgPSA4MTEsCi0gIFJQQ19MT0NfSU9DVExfU0VUX09OX0RFTUFORF9MUE0gPSA4MTIsCi0gIFJQQ19MT0NfSU9DVExfR0VUX09OX0RFTUFORF9MUE0gPSA4MTMsCi0gIFJQQ19MT0NfSU9DVExfU0VUX1hUUkFfVF9TRVNTSU9OX0NPTlRST0wgPSA4MTQsCi0gIFJQQ19MT0NfSU9DVExfR0VUX1hUUkFfVF9TRVNTSU9OX0NPTlRST0wgPSA4MTUsCi0gIFJQQ19MT0NfSU9DVExfU0VUX0xCU19BUE5fUFJPRklMRSA9IDgxNiwKLSAgUlBDX0xPQ19JT0NUTF9HRVRfTEJTX0FQTl9QUk9GSUxFID0gODE3LAotICBSUENfTE9DX0lPQ1RMX1NFVF9YVFJBX0FQTl9QUk9GSUxFID0gODE4LAotICBSUENfTE9DX0lPQ1RMX0dFVF9YVFJBX0FQTl9QUk9GSUxFID0gODE5LAotICBSUENfTE9DX0lPQ1RMX1NFVF9EQVRBX0VOQUJMRSA9IDgyMCwKLSAgUlBDX0xPQ19JT0NUTF9TRVRfU1VQTF9WRVJTSU9OID0gODIxLAotICBSUENfTE9DX0lPQ1RMX0dFVF9TVVBMX1ZFUlNJT04gPSA4MjIsCi0gIFJQQ19MT0NfSU9DVExfUFJPUFJJRVRBUllfU1RBUlRfSU5ERVggPSAxMDAwLAotICBSUENfTE9DX0lPQ1RMX0RFTEVURV9BU1NJU1RfREFUQSA9IDEwMDAsCi0gIFJQQ19MT0NfSU9DVExfU0VUX0NVU1RPTV9QREVfU0VSVkVSX0FERFIgPSAxMDAxLAotICBSUENfTE9DX0lPQ1RMX0dFVF9DVVNUT01fUERFX1NFUlZFUl9BRERSID0gMTAwMiwKLSAgUlBDX0xPQ19JT0NUTF9SRVNFUlZFRF9DTUQgPSA4MDAwLAotICBSUENfTE9DX0lPQ1RMX1RISVJEX1BBUlRZX1NUQVJUX0lOREVYID0gMTA3Mzc0MTgyNAotfTsKLQotc3RydWN0IHJwY19sb2NfYXBpX3ZlcnNpb25fc190eXBlIHsKLSAgdW5zaWduZWQgY2hhciBtYWpvcjsKLSAgdW5zaWduZWQgY2hhciBtaW5vcjsKLX07Ci0KLWVudW0gcnBjX2xvY19maXhfcmVjdXJyZW5jZV9lX3R5cGUgewotICBSUENfTE9DX1BFUklPRElDX0ZJWCA9IDEsCi0gIFJQQ19MT0NfU0lOR0xFX0ZJWCA9IDIsCi0gIFJQQ19MT0NfRklYX1NFU1NJT05fVFlQRV9NQVggPSAyNjg0MzU0NTYKLX07Ci0KLWVudW0gcnBjX2xvY19vcGVyYXRpb25fbW9kZV9lX3R5cGUgewotICBSUENfTE9DX09QRVJfTU9ERV9ERUZBVUxUID0gMSwKLSAgUlBDX0xPQ19PUEVSX01PREVfTVNCID0gMiwKLSAgUlBDX0xPQ19PUEVSX01PREVfTVNBID0gMywKLSAgUlBDX0xPQ19PUEVSX01PREVfU1RBTkRBTE9ORSA9IDQsCi0gIFJQQ19MT0NfT1BFUl9NT0RFX1NQRUVEX09QVElNQUwgPSA1LAotICBSUENfTE9DX09QRVJfTU9ERV9BQ0NVUkFDWV9PUFRJTUFMID0gNiwKLSAgUlBDX0xPQ19PUEVSX01PREVfREFUQV9PUFRJTUFMID0gNywKLSAgUlBDX0xPQ19PUEVSX01PREVfQ0VMTF9JRCA9IDgsCi0gIFJQQ19MT0NfT1BFUl9NT0RFX01BWCA9IDI2ODQzNTQ1NgotfTsKLQotZW51bSBycGNfbG9jX25vdGlmeV9lX3R5cGUgewotICBSUENfTE9DX05PVElGWV9PTl9JTlRFUlZBTCA9IDEsCi0gIFJQQ19MT0NfTk9USUZZX09OX0RJU1RBTkNFID0gMiwKLSAgUlBDX0xPQ19OT1RJRllfT05fQU5ZID0gMywKLSAgUlBDX0xPQ19OT1RJRllfT05fQUxMID0gNCwKLSAgUlBDX0xPQ19OT1RJRllfVFlQRV9NQVggPSAyNjg0MzU0NTYKLX07Ci0KLXN0cnVjdCBycGNfbG9jX2ZpeF9jcml0ZXJpYV9zX3R5cGUgewotICBycGNfdWludDMyIHZhbGlkX21hc2s7Ci0gIHJwY19sb2NfZml4X3JlY3VycmVuY2VfZV90eXBlIHJlY3VycmVuY2VfdHlwZTsKLSAgcnBjX2xvY19vcGVyYXRpb25fbW9kZV9lX3R5cGUgcHJlZmVycmVkX29wZXJhdGlvbl9tb2RlOwotICBycGNfdWludDMyIHByZWZlcnJlZF9hY2N1cmFjeTsKLSAgcnBjX3VpbnQzMiBwcmVmZXJyZWRfcmVzcG9uc2VfdGltZTsKLSAgcnBjX2Jvb2xlYW4gaW50ZXJtZWRpYXRlX3Bvc19yZXBvcnRfZW5hYmxlZDsKLSAgcnBjX2xvY19ub3RpZnlfZV90eXBlIG5vdGlmeV90eXBlOwotICBycGNfdWludDMyIG1pbl9pbnRlcnZhbDsKLSAgZmxvYXQgbWluX2Rpc3RhbmNlOwotICBycGNfdWludDMyIG1pbl9kaXN0X3NhbXBsZV9pbnRlcnZhbDsKLX07Ci0KLWVudW0gcnBjX2xvY19uaV91c2VyX3Jlc3BfZV90eXBlIHsKLSAgUlBDX0xPQ19OSV9MQ1NfTk9USUZZX1ZFUklGWV9BQ0NFUFQgPSAxLAotICBSUENfTE9DX05JX0xDU19OT1RJRllfVkVSSUZZX0RFTlkgPSAyLAotICBSUENfTE9DX05JX0xDU19OT1RJRllfVkVSSUZZX05PUkVTUCA9IDMsCi0gIFJQQ19MT0NfTklfTENTX05PVElGWV9WRVJJRllfTUFYID0gMjY4NDM1NDU2Ci19OwotCi1zdHJ1Y3QgcnBjX2xvY191c2VyX3ZlcmlmeV9zX3R5cGUgewotICBycGNfbG9jX25pX3VzZXJfcmVzcF9lX3R5cGUgdXNlcl9yZXNwOwotICBycGNfbG9jX25pX2V2ZW50X3NfdHlwZSBuaV9ldmVudF9wYXNzX2JhY2s7Ci19OwotCi1lbnVtIHJwY19sb2NfcHJlZGljdGVkX29yYml0c19kYXRhX2Zvcm1hdF9lX3R5cGUgewotICBSUENfTE9DX1BSRURJQ1RFRF9PUkJJVFNfWFRSQSA9IDAsCi0gIFJQQ19MT0NfUFJFRElDVEVEX09SQklUU19GT1JNQVRfTUFYID0gMjY4NDM1NDU2Ci19OwotCi1zdHJ1Y3QgcnBjX2xvY19wcmVkaWN0ZWRfb3JiaXRzX2RhdGFfc190eXBlIHsKLSAgcnBjX2xvY19wcmVkaWN0ZWRfb3JiaXRzX2RhdGFfZm9ybWF0X2VfdHlwZSBmb3JtYXRfdHlwZTsKLSAgcnBjX3VpbnQzMiB0b3RhbF9zaXplOwotICBycGNfdWludDggdG90YWxfcGFydHM7Ci0gIHJwY191aW50OCBwYXJ0OwotICBycGNfdWludDE2IHBhcnRfbGVuOwotICBvcGFxdWUgZGF0YV9wdHI8PjsKLX07Ci0KLXN0cnVjdCBycGNfbG9jX3ByZWRpY3RlZF9vcmJpdHNfZGF0YV92YWxpZGl0eV9yZXBvcnRfc190eXBlIHsKLSAgcnBjX3VpbnQ2NCBzdGFydF90aW1lX3V0YzsKLSAgcnBjX3VpbnQxNiB2YWxpZF9kdXJhdGlvbl9ocnM7Ci19OwotCi1zdHJ1Y3QgcnBjX2xvY19wcmVkaWN0ZWRfb3JiaXRzX2F1dG9fZG93bmxvYWRfY29uZmlnX3NfdHlwZSB7Ci0gIHJwY19ib29sZWFuIGVuYWJsZTsKLSAgdW5zaWduZWQgY2hhciBhdXRvX2NoZWNrX2V2ZXJ5X2hyczsKLX07Ci0KLXN0cnVjdCBycGNfbG9jX2Fzc2lzdF9kYXRhX3RpbWVfc190eXBlIHsKLSAgcnBjX3VpbnQ2NCB0aW1lX3V0YzsKLSAgcnBjX3VpbnQzMiB1bmNlcnRhaW50eTsKLX07Ci0KLXR5cGVkZWYgcnBjX3VpbnQ2NCBycGNfbG9jX2Fzc2lzdF9wb3NfdmFsaWRfbWFza190eXBlOwotCi1zdHJ1Y3QgcnBjX2xvY19hc3Npc3RfZGF0YV9wb3Nfc190eXBlIHsKLSAgcnBjX2xvY19hc3Npc3RfcG9zX3ZhbGlkX21hc2tfdHlwZSB2YWxpZF9tYXNrOwotICBycGNfdWludDY0IHRpbWVzdGFtcF91dGM7Ci0gIGRvdWJsZSBsYXRpdHVkZTsKLSAgZG91YmxlIGxvbmdpdHVkZTsKLSAgZmxvYXQgYWx0aXR1ZGVfd3J0X2VsbGlwc29pZDsKLSAgZmxvYXQgYWx0aXR1ZGVfd3J0X21lYW5fc2VhX2xldmVsOwotICBmbG9hdCBob3JfdW5jX2NpcmN1bGFyOwotICBmbG9hdCB2ZXJ0X3VuYzsKLSAgdW5zaWduZWQgY2hhciBjb25maWRlbmNlX2hvcml6b250YWw7Ci0gIHVuc2lnbmVkIGNoYXIgY29uZmlkZW5jZV92ZXJ0aWNhbDsKLSAgcnBjX2ludDMyIHRpbWVzdGFtcF9hZ2U7Ci19OwotCi1lbnVtIHJwY19sb2Nfc2VydmVyX29wZW5fc3RhdHVzX2VfdHlwZSB7Ci0gIFJQQ19MT0NfU0VSVkVSX09QRU5fU1VDQ0VTUyA9IDEsCi0gIFJQQ19MT0NfU0VSVkVSX09QRU5fRkFJTCA9IDIsCi0gIFJQQ19MT0NfU0VSVkVSX09QRU5fU1RBVFVTX01BWCA9IDI2ODQzNTQ1NgotfTsKLQotZW51bSBycGNfbG9jX3NlcnZlcl9wZHBfdHlwZV9lX3R5cGUgewotICBSUENfTE9DX1NFUlZFUl9QRFBfSVAgPSAwLAotICBSUENfTE9DX1NFUlZFUl9QRFBfUFBQLAotICBSUENfTE9DX1NFUlZFUl9QRFBfSVBWNiwKLSAgUlBDX0xPQ19TRVJWRVJfUERQX0lQVjRWNiwKLSAgUlBDX0xPQ19TRVJWRVJfUERQX01BWCA9IDI2ODQzNTQ1NgotfTsKLQotc3RydWN0IHJwY19sb2Nfc2VydmVyX29wZW5fc3RhdHVzX3NfdHlwZSB7Ci0gIHJwY19sb2Nfc2VydmVyX2Nvbm5lY3Rpb25faGFuZGxlIGNvbm5faGFuZGxlOwotICBycGNfbG9jX3NlcnZlcl9vcGVuX3N0YXR1c19lX3R5cGUgb3Blbl9zdGF0dXM7Ci0gIG9wYXF1ZSBhcG5fbmFtZVsxMDBdOwotfTsKLQotc3RydWN0IHJwY19sb2Nfc2VydmVyX211bHRpX29wZW5fc3RhdHVzX3NfdHlwZSB7Ci0gIHJwY19sb2Nfc2VydmVyX2Nvbm5lY3Rpb25faGFuZGxlIGNvbm5faGFuZGxlOwotICBycGNfbG9jX3NlcnZlcl9vcGVuX3N0YXR1c19lX3R5cGUgb3Blbl9zdGF0dXM7Ci0gIHJwY19sb2Nfc2VydmVyX3BkcF90eXBlX2VfdHlwZSBwZHBfdHlwZTsKLSAgb3BhcXVlIGFwbl9uYW1lWzEwMF07Ci19OwotCi1lbnVtIHJwY19sb2Nfc2VydmVyX2Nsb3NlX3N0YXR1c19lX3R5cGUgewotICBSUENfTE9DX1NFUlZFUl9DTE9TRV9TVUNDRVNTID0gMSwKLSAgUlBDX0xPQ19TRVJWRVJfQ0xPU0VfRkFJTCA9IDIsCi0gIFJQQ19MT0NfU0VSVkVSX0NMT1NFX1NUQVRVU19NQVggPSAyNjg0MzU0NTYKLX07Ci0KLXN0cnVjdCBycGNfbG9jX3NlcnZlcl9jbG9zZV9zdGF0dXNfc190eXBlIHsKLSAgcnBjX2xvY19zZXJ2ZXJfY29ubmVjdGlvbl9oYW5kbGUgY29ubl9oYW5kbGU7Ci0gIHJwY19sb2Nfc2VydmVyX2Nsb3NlX3N0YXR1c19lX3R5cGUgY2xvc2Vfc3RhdHVzOwotfTsKLQotc3RydWN0IHJwY19sb2Nfd2lwZXJfZml4X3RpbWVfc190eXBlIHsKLSAgcnBjX3VpbnQzMiBzbG93X2Nsb2NrX2NvdW50OwotfTsKLQotc3RydWN0IHJwY19sb2Nfd2lwZXJfZml4X3Bvc19zX3R5cGUgewotICBycGNfaW50MzIgbGF0OwotICBycGNfaW50MzIgbG9uOwotICBycGNfdWludDE2IEhFUEU7Ci0gIHJwY191aW50OCBudW1fb2ZfYXBzX3VzZWQ7Ci0gIHJwY191aW50OCBmaXhfZXJyb3JfY29kZTsKLX07Ci0KLXN0cnVjdCBycGNfbG9jX3dpcGVyX2FwX2luZm9fc190eXBlIHsKLSAgb3BhcXVlIG1hY19hZGRyWzZdOwotICBycGNfaW50MzIgcnNzaTsKLSAgcnBjX3VpbnQxNiBjaGFubmVsOwotICBycGNfdWludDggYXBfcXVhbGlmaWVyOwotfTsKLQotc3RydWN0IHJwY19sb2Nfd2lwZXJfYXBfc2V0X3NfdHlwZSB7Ci0gIHJwY191aW50OCBudW1fb2ZfYXBzOwotICBycGNfbG9jX3dpcGVyX2FwX2luZm9fc190eXBlIGFwX2luZm9bNTBdOwotfTsKLQotc3RydWN0IHJwY19sb2Nfd2lwZXJfcG9zaXRpb25fcmVwb3J0X3NfdHlwZSB7Ci0gIHJwY191aW50OCB3aXBlcl92YWxpZF9pbmZvX2ZsYWc7Ci0gIHJwY19sb2Nfd2lwZXJfZml4X3RpbWVfc190eXBlIHdpcGVyX2ZpeF90aW1lOwotICBycGNfbG9jX3dpcGVyX2ZpeF9wb3Nfc190eXBlIHdpcGVyX2ZpeF9wb3NpdGlvbjsKLSAgcnBjX2xvY193aXBlcl9hcF9zZXRfc190eXBlIHdpcGVyX2FwX3NldDsKLX07Ci0KLWVudW0gcnBjX2xvY193aXBlcl9zdGF0dXNfZV90eXBlIHsKLSAgUlBDX0xPQ19XSVBFUl9TVEFUVVNfQVZBSUxBQkxFID0gMSwKLSAgUlBDX0xPQ19XSVBFUl9TVEFUVVNfVU5BVkFJTEFCTEUgPSAyLAotICBSUENfTE9DX1dJUEVSX1NUQVRVU19FX1NJWkUgPSAyNjg0MzU0NTYKLX07Ci0KLWVudW0gcnBjX2xvY19mc19vcGVyYXRpb25fZV90eXBlIHsKLSAgUlBDX0xPQ19GU19DUkVBVEVfV1JJVEVfRklMRSA9IDEsCi0gIFJQQ19MT0NfRlNfQVBQRU5EX0ZJTEUgPSAyLAotICBSUENfTE9DX0ZTX0RFTEVURV9GSUxFID0gMywKLSAgUlBDX0xPQ19GU19SRUFEX0ZJTEUgPSA0LAotICBSUENfTE9DX0ZTX01BWCA9IDI2ODQzNTQ1NgotfTsKLQotc3RydWN0IHJwY19sb2NfZWZzX2RhdGFfc190eXBlIHsKLSAgb3BhcXVlIGZpbGVuYW1lWzY0XTsKLSAgcnBjX2xvY19mc19vcGVyYXRpb25fZV90eXBlIG9wZXJhdGlvbjsKLSAgcnBjX3VpbnQzMiB0b3RhbF9zaXplOwotICBvcGFxdWUgZGF0YV9wdHI8PjsKLSAgcnBjX3VpbnQzMiBwYXJ0X2xlbjsKLSAgcnBjX3VpbnQ4IHBhcnQ7Ci0gIHJwY191aW50OCB0b3RhbF9wYXJ0czsKLSAgcnBjX3VpbnQzMiByZXNlcnZlZDsKLX07Ci0KLWVudW0gcnBjX2xvY19lcnJvcl9lc3RpbWF0ZV9jb25maWdfZV90eXBlIHsKLSAgUlBDX0xPQ19FUlJPUl9FU1RJTUFURV9DT05GSUdfU0VUID0gMSwKLSAgUlBDX0xPQ19FUlJPUl9FU1RJTUFURV9DT05GSUdfQ0xFQVIgPSAyLAotICBSUENfTE9DX0VSUk9SX0VTVElNQVRFX01BWCA9IDI2ODQzNTQ1NgotfTsKLQotc3RydWN0IHJwY19sb2NfYXBuX3Byb2ZpbGVzX3R5cGUgewotICBycGNfdWludDMyIHNydl9zeXN0ZW1fdHlwZTsKLSAgcnBjX3VpbnQzMiBwZHBfdHlwZTsKLSAgcnBjX3VpbnQzMiByZXNlcnZlZDsKLSAgb3BhcXVlIGFwbl9uYW1lWzEwMF07Ci19OwotCi1lbnVtIHJwY19sb2NfbG9ja19lX3R5cGUgewotICBSUENfTE9DX0xPQ0tfTk9ORSA9IDEsCi0gIFJQQ19MT0NfTE9DS19NSSA9IDIsCi0gIFJQQ19MT0NfTE9DS19NVCA9IDMsCi0gIFJQQ19MT0NfTE9DS19BTEwgPSA0LAotICBSUENfTE9DX0xPQ0tfTUFYID0gMjY4NDM1NDU2Ci19OwotCi10eXBlZGVmIHJwY191aW50MzIgcnBjX2xvY19ubWVhX3NlbnRlbmNlX3R5cGU7Ci0KLXR5cGVkZWYgcnBjX3VpbnQzMiBycGNfbG9jX2Fzc2lzdF9kYXRhX3R5cGU7Ci0KLXN0cnVjdCBycGNfbG9jX2Fzc2lzdF9kYXRhX2RlbGV0ZV9zX3R5cGUgewotICBycGNfbG9jX2Fzc2lzdF9kYXRhX3R5cGUgdHlwZTsKLSAgcnBjX3VpbnQzMiByZXNlcnZlZFs4XTsKLX07Ci0KLXVuaW9uIHJwY19sb2NfaW9jdGxfZGF0YV91X3R5cGUgc3dpdGNoIChycGNfbG9jX2lvY3RsX2VfdHlwZSBkaXNjKSB7Ci0gIGNhc2UgUlBDX0xPQ19JT0NUTF9TRVRfRklYX0NSSVRFUklBOgotICAgIHJwY19sb2NfZml4X2NyaXRlcmlhX3NfdHlwZSBmaXhfY3JpdGVyaWE7Ci0gIGNhc2UgUlBDX0xPQ19JT0NUTF9JTkZPUk1fTklfVVNFUl9SRVNQT05TRToKLSAgICBycGNfbG9jX3VzZXJfdmVyaWZ5X3NfdHlwZSB1c2VyX3ZlcmlmeV9yZXNwOwotICBjYXNlIFJQQ19MT0NfSU9DVExfSU5KRUNUX1BSRURJQ1RFRF9PUkJJVFNfREFUQToKLSAgICBycGNfbG9jX3ByZWRpY3RlZF9vcmJpdHNfZGF0YV9zX3R5cGUgcHJlZGljdGVkX29yYml0c19kYXRhOwotICBjYXNlIFJQQ19MT0NfSU9DVExfU0VUX1BSRURJQ1RFRF9PUkJJVFNfREFUQV9BVVRPX0RPV05MT0FEOgotICAgIHJwY19sb2NfcHJlZGljdGVkX29yYml0c19hdXRvX2Rvd25sb2FkX2NvbmZpZ19zX3R5cGUgcHJlZGljdGVkX29yYml0c19hdXRvX2Rvd25sb2FkOwotICBjYXNlIFJQQ19MT0NfSU9DVExfSU5KRUNUX1VUQ19USU1FOgotICAgIHJwY19sb2NfYXNzaXN0X2RhdGFfdGltZV9zX3R5cGUgYXNzaXN0YW5jZV9kYXRhX3RpbWU7Ci0gIGNhc2UgUlBDX0xPQ19JT0NUTF9JTkpFQ1RfUE9TSVRJT046Ci0gICAgcnBjX2xvY19hc3Npc3RfZGF0YV9wb3Nfc190eXBlIGFzc2lzdGFuY2VfZGF0YV9wb3NpdGlvbjsKLSAgY2FzZSBSUENfTE9DX0lPQ1RMX0lORk9STV9TRVJWRVJfT1BFTl9TVEFUVVM6Ci0gICAgcnBjX2xvY19zZXJ2ZXJfb3Blbl9zdGF0dXNfc190eXBlIGNvbm5fb3Blbl9zdGF0dXM7Ci0gIGNhc2UgUlBDX0xPQ19JT0NUTF9JTkZPUk1fU0VSVkVSX0NMT1NFX1NUQVRVUzoKLSAgICBycGNfbG9jX3NlcnZlcl9jbG9zZV9zdGF0dXNfc190eXBlIGNvbm5fY2xvc2Vfc3RhdHVzOwotICBjYXNlIFJQQ19MT0NfSU9DVExfU0VORF9XSVBFUl9QT1NJVElPTl9SRVBPUlQ6Ci0gICAgcnBjX2xvY193aXBlcl9wb3NpdGlvbl9yZXBvcnRfc190eXBlIHdpcGVyX3BvczsKLSAgY2FzZSBSUENfTE9DX0lPQ1RMX05PVElGWV9XSVBFUl9TVEFUVVM6Ci0gICAgcnBjX2xvY193aXBlcl9zdGF0dXNfZV90eXBlIHdpcGVyX3N0YXR1czsKLSAgY2FzZSBSUENfTE9DX0lPQ1RMX1NFVF9FTkdJTkVfTE9DSzoKLSAgICBycGNfbG9jX2xvY2tfZV90eXBlIGVuZ2luZV9sb2NrOwotICBjYXNlIFJQQ19MT0NfSU9DVExfU0VUX1NCQVNfQ09ORklHOgotICAgIHJwY19ib29sZWFuIHNiYXNfbW9kZTsKLSAgY2FzZSBSUENfTE9DX0lPQ1RMX1NFVF9OTUVBX1RZUEVTOgotICAgIHJwY19sb2Nfbm1lYV9zZW50ZW5jZV90eXBlIG5tZWFfdHlwZXM7Ci0gIGNhc2UgUlBDX0xPQ19JT0NUTF9TRVRfT05fREVNQU5EX0xQTToKLSAgICBycGNfYm9vbGVhbiBvbl9kZW1hbmRfbHBtOwotICBjYXNlICBSUENfTE9DX0lPQ1RMX1NFVF9DRE1BX1BERV9TRVJWRVJfQUREUjoKLSAgY2FzZSAgUlBDX0xPQ19JT0NUTF9TRVRfQ0RNQV9NUENfU0VSVkVSX0FERFI6Ci0gIGNhc2UgIFJQQ19MT0NfSU9DVExfU0VUX1VNVFNfU0xQX1NFUlZFUl9BRERSOgotICBjYXNlICBSUENfTE9DX0lPQ1RMX1NFVF9DVVNUT01fUERFX1NFUlZFUl9BRERSOgotICAgIHJwY19sb2Nfc2VydmVyX2luZm9fc190eXBlIHNlcnZlcl9hZGRyOwotICBjYXNlIFJQQ19MT0NfSU9DVExfREVMRVRFX0FTU0lTVF9EQVRBOgotICAgIHJwY19sb2NfYXNzaXN0X2RhdGFfZGVsZXRlX3NfdHlwZSBhc3Npc3RfZGF0YV9kZWxldGU7Ci0gIGNhc2UgUlBDX0xPQ19JT0NUTF9BQ0NFU1NfRUZTX0RBVEE6Ci0gICAgcnBjX2xvY19lZnNfZGF0YV9zX3R5cGUgZWZzX2RhdGE7Ci0gIGNhc2UgUlBDX0xPQ19JT0NUTF9FUlJPUl9FU1RJTUFURV9DT05GSUc6Ci0gICAgcnBjX2xvY19lcnJvcl9lc3RpbWF0ZV9jb25maWdfZV90eXBlIGVycm9yX2VzdGltYXRlX2NvbmZpZzsKLSAgY2FzZSBSUENfTE9DX0lPQ1RMX1NFVF9YVFJBX1RfU0VTU0lPTl9DT05UUk9MOgotICAgIHJwY191aW50OCB4dHJhX3Rfc2Vzc2lvbl9jb250cm9sOwotICBjYXNlICBSUENfTE9DX0lPQ1RMX1NFVF9MQlNfQVBOX1BST0ZJTEU6Ci0gIGNhc2UgIFJQQ19MT0NfSU9DVExfU0VUX1hUUkFfQVBOX1BST0ZJTEU6Ci0gICAgcnBjX2xvY19hcG5fcHJvZmlsZXNfdHlwZSBhcG5fcHJvZmlsZXNbNl07Ci0gIGNhc2UgUlBDX0xPQ19JT0NUTF9TRVRfREFUQV9FTkFCTEU6Ci0gICAgcnBjX2Jvb2xlYW4gZGF0YV9lbmFibGU7Ci0gIGNhc2UgUlBDX0xPQ19JT0NUTF9TRVRfU1VQTF9WRVJTSU9OOgotICAgIHJwY191aW50MzIgc3VwbF92ZXJzaW9uOwotICBjYXNlIFJQQ19MT0NfSU9DVExfSU5GT1JNX1NFUlZFUl9NVUxUSV9PUEVOX1NUQVRVUzoKLSAgICBycGNfbG9jX3NlcnZlcl9tdWx0aV9vcGVuX3N0YXR1c19zX3R5cGUgbXVsdGlfY29ubl9vcGVuX3N0YXR1czsKLSAgY2FzZSBSUENfTE9DX0lPQ1RMX1JFU0VSVkVEX0NNRDoKLSAgICBycGNfbG9jX3Jlc2VydmVkX3BheWxvYWRfc190eXBlIHJlc2VydmVkOwotICBkZWZhdWx0OgotICAgIHZvaWQ7Ci19OwotCi11bmlvbiBycGNfbG9jX2lvY3RsX2NhbGxiYWNrX2RhdGFfdV90eXBlIHN3aXRjaCAocnBjX2xvY19pb2N0bF9lX3R5cGUgZGlzYykgewotICBjYXNlIFJQQ19MT0NfSU9DVExfR0VUX0FQSV9WRVJTSU9OOgotICAgIHJwY19sb2NfYXBpX3ZlcnNpb25fc190eXBlIGFwaV92ZXJzaW9uOwotICBjYXNlIFJQQ19MT0NfSU9DVExfR0VUX0ZJWF9DUklURVJJQToKLSAgICBycGNfbG9jX2ZpeF9jcml0ZXJpYV9zX3R5cGUgZml4X2NyaXRlcmlhOwotICBjYXNlIFJQQ19MT0NfSU9DVExfR0VUX0VOR0lORV9MT0NLOgotICAgIHJwY19sb2NfbG9ja19lX3R5cGUgZW5naW5lX2xvY2s7Ci0gIGNhc2UgUlBDX0xPQ19JT0NUTF9HRVRfU0JBU19DT05GSUc6Ci0gICAgcnBjX2Jvb2xlYW4gc2Jhc19tb2RlOwotICBjYXNlIFJQQ19MT0NfSU9DVExfR0VUX05NRUFfVFlQRVM6Ci0gICAgcnBjX2xvY19ubWVhX3NlbnRlbmNlX3R5cGUgbm1lYV90eXBlczsKLSAgY2FzZSBSUENfTE9DX0lPQ1RMX0dFVF9PTl9ERU1BTkRfTFBNOgotICAgIHJwY19ib29sZWFuIG9uX2RlbWFuZF9scG07Ci0gIGNhc2UgIFJQQ19MT0NfSU9DVExfR0VUX0NETUFfUERFX1NFUlZFUl9BRERSOgotICBjYXNlICBSUENfTE9DX0lPQ1RMX0dFVF9DRE1BX01QQ19TRVJWRVJfQUREUjoKLSAgY2FzZSAgUlBDX0xPQ19JT0NUTF9HRVRfVU1UU19TTFBfU0VSVkVSX0FERFI6Ci0gIGNhc2UgIFJQQ19MT0NfSU9DVExfR0VUX0NVU1RPTV9QREVfU0VSVkVSX0FERFI6Ci0gICAgcnBjX2xvY19zZXJ2ZXJfaW5mb19zX3R5cGUgc2VydmVyX2FkZHI7Ci0gIGNhc2UgUlBDX0xPQ19JT0NUTF9RVUVSWV9QUkVESUNURURfT1JCSVRTX0RBVEFfU09VUkNFOgotICAgIHJwY19sb2NfcHJlZGljdGVkX29yYml0c19kYXRhX3NvdXJjZV9zX3R5cGUgcHJlZGljdGVkX29yYml0c19kYXRhX3NvdXJjZTsKLSAgY2FzZSBSUENfTE9DX0lPQ1RMX1FVRVJZX1BSRURJQ1RFRF9PUkJJVFNfREFUQV9WQUxJRElUWToKLSAgICBycGNfbG9jX3ByZWRpY3RlZF9vcmJpdHNfZGF0YV92YWxpZGl0eV9yZXBvcnRfc190eXBlIHByZWRpY3RlZF9vcmJpdHNfZGF0YV92YWxpZGl0eTsKLSAgY2FzZSBSUENfTE9DX0lPQ1RMX0dFVF9YVFJBX1RfU0VTU0lPTl9DT05UUk9MOgotICAgIHJwY191aW50OCB4dHJhX3Rfc2Vzc2lvbl9jb250cm9sOwotICBjYXNlICBSUENfTE9DX0lPQ1RMX0dFVF9MQlNfQVBOX1BST0ZJTEU6Ci0gIGNhc2UgIFJQQ19MT0NfSU9DVExfR0VUX1hUUkFfQVBOX1BST0ZJTEU6Ci0gICAgcnBjX2xvY19hcG5fcHJvZmlsZXNfdHlwZSBhcG5fcHJvZmlsZXNbNl07Ci0gIGNhc2UgUlBDX0xPQ19JT0NUTF9HRVRfU1VQTF9WRVJTSU9OOgotICAgIHJwY191aW50MzIgc3VwbF92ZXJzaW9uOwotICBkZWZhdWx0OgotICAgIHZvaWQ7Ci19OwotCi1zdHJ1Y3QgcnBjX2xvY19pb2N0bF9jYWxsYmFja19zX3R5cGUgewotICBycGNfbG9jX2lvY3RsX2VfdHlwZSB0eXBlOwotICBycGNfaW50MzIgc3RhdHVzOwotICBycGNfbG9jX2lvY3RsX2NhbGxiYWNrX2RhdGFfdV90eXBlIGRhdGE7Ci19OwotCi11bmlvbiBycGNfbG9jX2V2ZW50X3BheWxvYWRfdV90eXBlIHN3aXRjaCAodW5zaWduZWQgaHlwZXIgZGlzYykgewotICBjYXNlIFJQQ19MT0NfRVZFTlRfUEFSU0VEX1BPU0lUSU9OX1JFUE9SVDoKLSAgICBycGNfbG9jX3BhcnNlZF9wb3NpdGlvbl9zX3R5cGUgcGFyc2VkX2xvY2F0aW9uX3JlcG9ydDsKLSAgY2FzZSBSUENfTE9DX0VWRU5UX1NBVEVMTElURV9SRVBPUlQ6Ci0gICAgcnBjX2xvY19nbnNzX2luZm9fc190eXBlIGduc3NfcmVwb3J0OwotICBjYXNlIFJQQ19MT0NfRVZFTlRfTk1FQV9QT1NJVElPTl9SRVBPUlQ6Ci0gIGNhc2UgUlBDX0xPQ19FVkVOVF9OTUVBXzFIWl9SRVBPUlQ6Ci0gICAgcnBjX2xvY19ubWVhX3JlcG9ydF9zX3R5cGUgbm1lYV9yZXBvcnQ7Ci0gIGNhc2UgUlBDX0xPQ19FVkVOVF9OSV9OT1RJRllfVkVSSUZZX1JFUVVFU1Q6Ci0gICAgcnBjX2xvY19uaV9ldmVudF9zX3R5cGUgbmlfcmVxdWVzdDsKLSAgY2FzZSBSUENfTE9DX0VWRU5UX0FTU0lTVEFOQ0VfREFUQV9SRVFVRVNUOgotICAgIHJwY19sb2NfYXNzaXN0X2RhdGFfcmVxdWVzdF9zX3R5cGUgYXNzaXN0X2RhdGFfcmVxdWVzdDsKLSAgY2FzZSBSUENfTE9DX0VWRU5UX0xPQ0FUSU9OX1NFUlZFUl9SRVFVRVNUOgotICAgIHJwY19sb2Nfc2VydmVyX3JlcXVlc3Rfc190eXBlIGxvY19zZXJ2ZXJfcmVxdWVzdDsKLSAgY2FzZSBSUENfTE9DX0VWRU5UX0lPQ1RMX1JFUE9SVDoKLSAgICBycGNfbG9jX2lvY3RsX2NhbGxiYWNrX3NfdHlwZSBpb2N0bF9yZXBvcnQ7Ci0gIGNhc2UgUlBDX0xPQ19FVkVOVF9TVEFUVVNfUkVQT1JUOgotICAgIHJwY19sb2Nfc3RhdHVzX2V2ZW50X3NfdHlwZSBzdGF0dXNfcmVwb3J0OwotICBjYXNlIFJQQ19MT0NfRVZFTlRfV1BTX05FRURFRF9SRVFVRVNUOgotICAgIHJwY19sb2NfcXdpcF9yZXF1ZXN0X3NfdHlwZSBxd2lwX3JlcXVlc3Q7Ci0gIGNhc2UgUlBDX0xPQ19FVkVOVF9SRVNFUlZFRDoKLSAgICBycGNfbG9jX3Jlc2VydmVkX3BheWxvYWRfc190eXBlIHJlc2VydmVkOwotICBkZWZhdWx0OgotICAgIHZvaWQ7Ci19OwotCmRpZmYgLS1naXQgYS9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaS1ycGMvQW5kcm9pZC5tayBiL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpLXJwYy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmU0Njk0Li4wMDAwMDAwCi0tLSBhL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpLXJwYy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotaWZuZXEgKCQoQlVJTERfVElOWV9BTkRST0lEKSx0cnVlKQotCi1pZm5lcSAoJChCT0FSRF9WRU5ET1JfUUNPTV9HUFNfTE9DX0FQSV9BTVNTX1ZFUlNJT04pLDUwMDAxKQotCi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1BTVNTX1ZFUlNJT046PSQoQk9BUkRfVkVORE9SX1FDT01fR1BTX0xPQ19BUElfQU1TU19WRVJTSU9OKQotUlBDX0lOQzo9aW5jLSQoQU1TU19WRVJTSU9OKQotCi1nZW5lcmF0ZWRfZmlsZXM6PSBcCi0JZ2VuLSQoQU1TU19WRVJTSU9OKS9sb2NfYXBpX2NsbnQuYwlcCi0JZ2VuLSQoQU1TU19WRVJTSU9OKS9sb2NfYXBpX2NiX3hkci5jCVwKLQlnZW4tJChBTVNTX1ZFUlNJT04pL2xvY19hcGlfY29tbW9uX3hkci5jIFwKLQlnZW4tJChBTVNTX1ZFUlNJT04pL2xvY19hcGlfY2Jfc3ZjLmMgXAotCWdlbi0kKEFNU1NfVkVSU0lPTikvbG9jX2FwaV94ZHIuYyBcCi0JZ2VuLSQoQU1TU19WRVJTSU9OKS9sb2NfYXBpX2ZpeHVwLmMgXAotCWdlbi0kKEFNU1NfVkVSU0lPTikvbG9jX2FwaV9ycGNfZ2x1ZS5jIFwKLQlzcmMvbG9jX2FwaWNiX2FwcGluaXQuYwotCi1MT0NBTF9TUkNfRklMRVM6PSAkKGdlbmVyYXRlZF9maWxlcykKLQotIyByZW1vdmVkIGZyb20gbGlicmFyeSBidWlsZCBzaW5jZSB0aGUgY2xpZW50IHNob3VsZCBpbXBsZW1lbnQgdGhpcyBjb2RlLgotIwlzcmMvbG9jX2FwaV9jYl9zZXJ2ZXIuYwotCi1MT0NBTF9DRkxBR1M6PS1mbm8tc2hvcnQtZW51bXMKLUxPQ0FMX0NGTEFHUys9LWluY2x1ZGUgJChSUENfSU5DKS9sb2NfYXBpX2NvbW1vbi5oCi1MT0NBTF9DRkxBR1MrPS1EREVCVUcKLSMgTE9DQUxfQ0ZMQUdTKz0tRERFQlVHIC1EVkVSQk9TRQotCi1MT0NBTF9DRkxBR1MrPS1EQUREX1hEUl9GTE9BVCAtREFERF9YRFJfQk9PTAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTOj0gbGlicnBjCi1MT0NBTF9TVEFUSUNfTElCUkFSSUVTOj0gbGliY29tbW9uZGVmcy1ycGMKLQotCi0KLUxPQ0FMX0NPUFlfSEVBREVSU19UTzo9IGxpYmxvY19hcGktcnBjL2luYwotTE9DQUxfQ09QWV9IRUFERVJTOj0gXAotCSQoUlBDX0lOQykvbG9jX2FwaV9jYi5oIFwKLQkkKFJQQ19JTkMpL2xvY19hcGlfY29tbW9uLmggXAotCSQoUlBDX0lOQykvbG9jX2FwaS5oIFwKLQkkKFJQQ19JTkMpL2xvY19hcGlfZml4dXAuaCBcCi0JJChSUENfSU5DKS9sb2NfYXBpY2JfYXBwaW5pdC5oIFwKLQlpbmMvZGVidWcuaCBcCi0JaW5jL2xvY19hcGlfcnBjX2dsdWUuaAotCi1MT0NBTF9DX0lOQ0xVREVTOj0gXAotCSQoTE9DQUxfUEFUSCkgXAotCSQoTE9DQUxfUEFUSCkvaW5jIFwKLQkkKExPQ0FMX1BBVEgpLyQoUlBDX0lOQykgXAotCSQoVEFSR0VUX09VVF9IRUFERVJTKS9saWJjb21tb25kZWZzLXJwYyBcCi0JJChUQVJHRVRfT1VUX0hFQURFUlMpL2xpYnJwYwotCi1MT0NBTF9NT0RVTEU6PSBsaWJsb2NfYXBpLXJwYwotTE9DQUxfTU9EVUxFX09XTkVSIDo9IHFjb20KLQotaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQotCi1lbmRpZgotZW5kaWYKZGlmZiAtLWdpdCBhL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpLXJwYy9nZW4tMTI0MC9NYWtlZmlsZS54ZHIgYi9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaS1ycGMvZ2VuLTEyNDAvTWFrZWZpbGUueGRyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDljZjZjLi4wMDAwMDAwCi0tLSBhL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpLXJwYy9nZW4tMTI0MC9NYWtlZmlsZS54ZHIKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi1DTElFTlRTOj0gbG9jX2FwaQotU0VSVkVSUzo9IGxvY19hcGlfY2IKLUNPTU1PTjo9IGxvY19hcGlfY29tbW9uCi1SUENfSU5DOj0gaW5jLSQoQU1TU19WRVJTSU9OKQotCi1hbGw6ICQoQ0xJRU5UUykgJChTRVJWRVJTKSAkKENPTU1PTikgZml4dXAKLQotJChDTElFTlRTKSAkKFNFUlZFUlMpICQoQ09NTU9OKTo6IHhkciA9ICQoQDo9LnhkcikgCi0KLSQoQ0xJRU5UUykgJChTRVJWRVJTKSAkKENPTU1PTik6OgotCXJwY2dlbiAtaCAtTSAkKHhkcikgLW8gLi4vJChSUENfSU5DKS8kKGFkZHN1ZmZpeCAuaCwgJEApCi0JcnBjZ2VuIC1jIC1NICQoeGRyKSAtbyAkKGFkZHN1ZmZpeCBfeGRyLmMsICRAKQotCi0kKENMSUVOVFMpOjoKLQlycGNnZW4gLWwgLU0gJCh4ZHIpIC1vICQoYWRkc3VmZml4IF9jbG50LmMsICRAKQotCi0kKFNFUlZFUlMpOjoKLQlycGNnZW4gLW0gLU0gJCh4ZHIpIC1vICQoYWRkc3VmZml4IF9zdmMuYywgJEApCi0KLWZpeHVwOgotCW12IC4uLyQoUlBDX0lOQykvbG9jX2FwaV9jb21tb24uaCAuLi8kKFJQQ19JTkMpL2xvY19hcGlfY29tbW9uLmguYmFrCi0Jc2VkIC4uLyQoUlBDX0lOQykvbG9jX2FwaV9jb21tb24uaC5iYWsgLWUgIi8jaW5jbHVkZSA8cnBjL2EjaW5jbHVkZSBcImxvY19hcGlfZml4dXAuaFwiIiA+IC4uLyQoUlBDX0lOQykvbG9jX2FwaV9jb21tb24uaAotCXJtIC1mIC4uLyQoUlBDX0lOQykvbG9jX2FwaV9jb21tb24uaC5iYWsKLQotY2xlYW46Ci0Jcm0gLWYgJChhZGRzdWZmaXggX2NsbnQuYywgJChDTElFTlRTKSkKLQlybSAtZiAkKGFkZHN1ZmZpeCBfc3ZjLmMsICQoU0VSVkVSUykpCi0Jcm0gLWYgJChhZGRzdWZmaXggX3hkci5jLCAkKENMSUVOVFMpICQoU0VSVkVSUykgJChDT01NT04pKQotCXJtIC1mICQoYWRkcHJlZml4IC4uLyQoUlBDX0lOQykvLCAkKGFkZHN1ZmZpeCAuaCwgJChDTElFTlRTKSAkKFNFUlZFUlMpICQoQ09NTU9OKSkpCmRpZmYgLS1naXQgYS9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaS1ycGMvZ2VuLTEyNDAvbG9jX2FwaS54ZHIgYi9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaS1ycGMvZ2VuLTEyNDAvbG9jX2FwaS54ZHIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ZDYwYWEuLjAwMDAwMDAKLS0tIGEvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGktcnBjL2dlbi0xMjQwL2xvY19hcGkueGRyCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8qIExPQ19BUEkgVE9PTCBWRVJTSU9OOiA0LjM2ICovCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwgTyBDIF8gQSBQIEkgLiBYIEQgUgotCi1HRU5FUkFMIERFU0NSSVBUSU9OCi0gIFRoaXMgaXMgYW4gQVVUTyBHRU5FUkFURUQgZmlsZSB0aGF0IHByb3ZpZGVzIGFuIHhkciBjb21wYXRpYmxlIGRlZmluaXRpb24gb2YKLSAgdGhlIGxvY19hcGkgQVBJLgotCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICBDb3B5cmlnaHQgKGMpIDIwMTAgUVVBTENPTU0gSW5jb3Jwb3JhdGVkLgotICBBbGwgUmlnaHRzIFJlc2VydmVkLiBRVUFMQ09NTSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLgotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFZGl0IEhpc3RvcnkKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVVRPIEdFTkVSQVRFRAotCi1HZW5lcmF0ZWQgYnkgZm9sbG93aW5nIHZlcnNpb25zIG9mIEh0b3JwYyBtb2R1bGVzOgotSWQ6IC8vc291cmNlL3Fjb20vcWN0L2NvcmUvbXByb2MvdG9vbHMvcmVsLzA0LjAxL2h0b3JwYy9odG9ycGMucGwjMjAgCi1JZDogLy9zb3VyY2UvcWNvbS9xY3QvY29yZS9tcHJvYy90b29scy9yZWwvMDQuMDEvaHRvcnBjL2xpYi9IdG9ycGMvU3RhcnQucG0jMyAKLUlkOiAvL3NvdXJjZS9xY29tL3FjdC9jb3JlL21wcm9jL3Rvb2xzL3JlbC8wNC4wMS9odG9ycGMvbGliL0h0b3JwYy9IdG94ZHIucG0jMSAKLUlkOiAvL3NvdXJjZS9xY29tL3FjdC9jb3JlL21wcm9jL3Rvb2xzL3JlbC8wNC4wMS9odG9ycGMvbGliL0h0b3JwYy9YRFIucG0jNyAKLUlkOiAvL3NvdXJjZS9xY29tL3FjdC9jb3JlL21wcm9jL3Rvb2xzL3JlbC8wNC4wMS9odG9ycGMvbGliL0h0b3JwYy9PdXRwdXQucG0jMjkgCi1JZDogLy9zb3VyY2UvcWNvbS9xY3QvY29yZS9tcHJvYy90b29scy9yZWwvMDQuMDEvaHRvcnBjL2xpYi9IdG9ycGMvUGFyc2VyLnBtIzIgCi1JZDogLy9zb3VyY2UvcWNvbS9xY3QvY29yZS9tcHJvYy90b29scy9yZWwvMDQuMDEvaHRvcnBjL2xpYi9IdG9ycGMvTWV0YWNvbW1lbnRzLnBtIzYgCi1JZDogLy9zb3VyY2UvcWNvbS9xY3QvY29yZS9tcHJvYy90b29scy9yZWwvMDQuMDEvaHRvcnBjL2xpYi9IdG9ycGMvU3ltYm9sVGFibGUucG0jMyAgCi0KLWxvY19hcGkgRGVmaW5pdGlvbiBGaWxlKHMpOgotSWQ6IC8vc291cmNlL3Fjb20vcWN0L21vZGVtL2FwaS9ncHMvbWFpbi9sYXRlc3QvbG9jX2FwaS5oIzE2Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0kSGVhZGVyJCAKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotCi0KLXR5cGVkZWYgcnBjX3VpbnQzMiBycGNfbG9jX2FwaV9hcGlfdmVyc2lvbnNfcmV0dXJuX3R5cGU8PjsKLQotLyoKLSAqIERlY2xhcmUgYW4gcnBjX3VpbnQzMiB0eXBlIGZvciBlYWNoIGNhbGxiYWNrIHR5cGUgaW4gdGhlIEFQSQotICovCi10eXBlZGVmIHJwY191aW50MzIgcnBjX2xvY19ldmVudF9jYl9mX3R5cGU7Ci0KLQotCi0vKgotICogVGhlc2UgYXJlIHN0cnVjdCBkZWNsYXJhdGlvbnMgZm9yIHRoZSBmdW5jdGlvbiBhcmd1bWVudHMKLSAqLwotCi1zdHJ1Y3QgcnBjX2xvY19vcGVuX2FyZ3MgewotICBycGNfbG9jX2V2ZW50X21hc2tfdHlwZSBldmVudF9yZWdfbWFzazsKLSAgcnBjX2xvY19ldmVudF9jYl9mX3R5cGUgZXZlbnRfY2FsbGJhY2s7Ci19OwotCi1zdHJ1Y3QgcnBjX2xvY19jbG9zZV9hcmdzIHsKLSAgcnBjX2xvY19jbGllbnRfaGFuZGxlX3R5cGUgaGFuZGxlOwotfTsKLQotc3RydWN0IHJwY19sb2Nfc3RhcnRfZml4X2FyZ3MgewotICBycGNfbG9jX2NsaWVudF9oYW5kbGVfdHlwZSBoYW5kbGU7Ci19OwotCi1zdHJ1Y3QgcnBjX2xvY19zdG9wX2ZpeF9hcmdzIHsKLSAgcnBjX2xvY19jbGllbnRfaGFuZGxlX3R5cGUgaGFuZGxlOwotfTsKLQotc3RydWN0IHJwY19sb2NfaW9jdGxfYXJncyB7Ci0gIHJwY19sb2NfY2xpZW50X2hhbmRsZV90eXBlIGhhbmRsZTsKLSAgcnBjX2xvY19pb2N0bF9lX3R5cGUgaW9jdGxfdHlwZTsKLSAgcnBjX2xvY19pb2N0bF9kYXRhX3VfdHlwZSAqaW9jdGxfZGF0YTsKLX07Ci0KLQotCi1zdHJ1Y3QgcnBjX2xvY19hcGlfYXBpX3ZlcnNpb25fc19hcmdzIHsKLSAgcnBjX2Jvb2xlYW4gbGVuX25vdF9udWxsOwotfTsKLQotLyoKLSAqIFRoZXNlIGFyZSBzdHJ1Y3QgZGVjbGFyYXRpb25zIGZvciB0aGUgZnVuY3Rpb24gcmVzdWx0cwotICovCi0KLXN0cnVjdCBycGNfbG9jX2FwaV9ycGNfZ2x1ZV9jb2RlX2luZm9fcmVtb3RlX3JldHMgewotICBycGNfdWludDMyIHRvb2x2ZXJzOyAgIC8qIFRvb2wgdmVyc2lvbiAqLwotICBycGNfdWludDMyIGZlYXR1cmVzOyAgIC8qIEZlYXR1cmVzIHR1cm5lZCBvbiBpbiB0aGUgY29kZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgKiAweDAwMDAwMDAxICAgIE9OQ1JQQyBTZXJ2ZXIgQ2xlYW51cCBTdXBwb3J0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHJwY191aW50MzIgcHJvZ2hhc2g7ICAgLyogVW5pcXVlIGhhc2ggdmFsdWUgZm9yIHRoZSBBUEkgWERSIGRlZmluaXRpb24gKi8KLSAgcnBjX3VpbnQzMiBjYnByb2doYXNoOyAvKiBVbmlxdWUgaGFzaCB2YWx1ZSBmb3IgdGhlIENhbGxiYWNrcycgWERSIGRlZmluaXRpb24gKi8KLX07Ci0KLXN0cnVjdCBycGNfbG9jX29wZW5fcmV0cyB7Ci0gIHJwY19sb2NfY2xpZW50X2hhbmRsZV90eXBlIGxvY19vcGVuX3Jlc3VsdDsKLX07Ci0KLXN0cnVjdCBycGNfbG9jX2Nsb3NlX3JldHMgewotICBycGNfaW50MzIgbG9jX2Nsb3NlX3Jlc3VsdDsKLX07Ci0KLXN0cnVjdCBycGNfbG9jX3N0YXJ0X2ZpeF9yZXRzIHsKLSAgcnBjX2ludDMyIGxvY19zdGFydF9maXhfcmVzdWx0OwotfTsKLQotc3RydWN0IHJwY19sb2Nfc3RvcF9maXhfcmV0cyB7Ci0gIHJwY19pbnQzMiBsb2Nfc3RvcF9maXhfcmVzdWx0OwotfTsKLQotc3RydWN0IHJwY19sb2NfaW9jdGxfcmV0cyB7Ci0gIHJwY19pbnQzMiBsb2NfaW9jdGxfcmVzdWx0OwotfTsKLQotIHN0cnVjdCBycGNfbG9jX2FwaV9hcGlfdmVyc2lvbnNfcmV0cyB7Ci0gIHJwY19sb2NfYXBpX2FwaV92ZXJzaW9uc19yZXR1cm5fdHlwZSBsb2NfYXBpX2FwaV92ZXJzaW9uc19yZXN1bHQ7Ci0gIHJwY191aW50MzIgKmxlbjsKLX07Ci0KLS8qCi0gKiBYRFIgZGVmaW5pdGlvbiBvZiB0aGUgTE9DX0FQSSBwcm9ncmFtICggdmVycy4gMHgwMDA0MDAwMiApCi0gKi8KLQotcHJvZ3JhbSBMT0NfQVBJUFJPRyB7Ci0gIHZlcnNpb24gTE9DX0FQSVZFUlNfMDAwMSB7Ci0KLQl2b2lkCi0JCXJwY19sb2NfYXBpX251bGwoIHZvaWQgKSA9IDA7Ci0KLQlycGNfbG9jX2FwaV9ycGNfZ2x1ZV9jb2RlX2luZm9fcmVtb3RlX3JldHMKLQkJcnBjX2xvY19hcGlfcnBjX2dsdWVfY29kZV9pbmZvX3JlbW90ZSggdm9pZCApID0gMTsKLQotCXJwY19sb2Nfb3Blbl9yZXRzCi0JCXJwY19sb2Nfb3BlbiggcnBjX2xvY19vcGVuX2FyZ3MgKSA9IDI7Ci0KLQlycGNfbG9jX2Nsb3NlX3JldHMKLQkJcnBjX2xvY19jbG9zZSggcnBjX2xvY19jbG9zZV9hcmdzICkgPSAzOwotCi0JcnBjX2xvY19zdGFydF9maXhfcmV0cwotCQlycGNfbG9jX3N0YXJ0X2ZpeCggcnBjX2xvY19zdGFydF9maXhfYXJncyApID0gNDsKLQotCXJwY19sb2Nfc3RvcF9maXhfcmV0cwotCQlycGNfbG9jX3N0b3BfZml4KCBycGNfbG9jX3N0b3BfZml4X2FyZ3MgKSA9IDU7Ci0KLQlycGNfbG9jX2lvY3RsX3JldHMKLQkJcnBjX2xvY19pb2N0bCggcnBjX2xvY19pb2N0bF9hcmdzICkgPSA2OwotCi0JcnBjX2xvY19hcGlfYXBpX3ZlcnNpb25zX3JldHMKLQkJcnBjX2xvY19hcGlfYXBpX3ZlcnNpb25zKCB2b2lkICkgPSAweEZGRkZGRkZGOwotCi0KLQotCi0gIH0gPSAweDAwMDQwMDAxOwotCi0KLQotICAgIHZlcnNpb24gTE9DX0FQSVZFUlNfMDAwMiB7Ci0KLS8qIEZvbGxvd2luZyBlbGVtZW50cyBhZGRlZCBpbiBlbnVtIHJwY19sb2NfbmlfZXZlbnRfZV90eXBlIGluIDB4MDAwNDAwMDIgCi1SUENfTE9DX05JX0VWRU5UX1ZYX1NFUlZJQ0VfSU5URVJBQ1RJT05fUkVRCi0qLwotCi0Jdm9pZAotCXJwY19sb2NfYXBpX251bGwoIHZvaWQgKSA9IDA7Ci0KLSAgICAgIH0gPSAweDAwMDQwMDAyOwotCi0KLX0gPSAweDMwMDAwMDhjOwotCi1jb25zdCBMT0NfQVBJVkVSUyA9IDB4MDAwNDAwMDI7CmRpZmYgLS1naXQgYS9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaS1ycGMvZ2VuLTEyNDAvbG9jX2FwaV9jYi54ZHIgYi9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaS1ycGMvZ2VuLTEyNDAvbG9jX2FwaV9jYi54ZHIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiZDRlMTUuLjAwMDAwMDAKLS0tIGEvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGktcnBjL2dlbi0xMjQwL2xvY19hcGlfY2IueGRyCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyogTE9DX0FQSSBUT09MIFZFUlNJT046IDQuMzYgKi8KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgTCBPIEMgXyBBIFAgSSBfIEMgQiAuIFggRCBSCi0KLUdFTkVSQUwgREVTQ1JJUFRJT04KLSAgVGhpcyBpcyBhbiBBVVRPIEdFTkVSQVRFRCBmaWxlIHRoYXQgcHJvdmlkZXMgYW4geGRyIGNvbXBhdGlibGUgZGVmaW5pdGlvbiBvZgotICBhbiBhcGkgdGhhdCByZXByZXNlbnRzIHRoZSBncm91cGluZyBvZiB0aGUgZGlmZmVyZW50IGNhbGxiYWNrIGZ1bmN0aW9ucyB0aGUKLSAgbG9jX2FwaSBBUEkgc3VwcG9ydHMuCi0KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIENvcHlyaWdodCAoYykgMjAxMCBRVUFMQ09NTSBJbmNvcnBvcmF0ZWQuCi0gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIFFVQUxDT01NIFByb3ByaWV0YXJ5IGFuZCBDb25maWRlbnRpYWwuCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVkaXQgSGlzdG9yeQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVVE8gR0VORVJBVEVECi0KLUdlbmVyYXRlZCBieSBmb2xsb3dpbmcgdmVyc2lvbnMgb2YgSHRvcnBjIG1vZHVsZXM6Ci1JZDogLy9zb3VyY2UvcWNvbS9xY3QvY29yZS9tcHJvYy90b29scy9yZWwvMDQuMDEvaHRvcnBjL2h0b3JwYy5wbCMyMCAKLUlkOiAvL3NvdXJjZS9xY29tL3FjdC9jb3JlL21wcm9jL3Rvb2xzL3JlbC8wNC4wMS9odG9ycGMvbGliL0h0b3JwYy9TdGFydC5wbSMzIAotSWQ6IC8vc291cmNlL3Fjb20vcWN0L2NvcmUvbXByb2MvdG9vbHMvcmVsLzA0LjAxL2h0b3JwYy9saWIvSHRvcnBjL0h0b3hkci5wbSMxIAotSWQ6IC8vc291cmNlL3Fjb20vcWN0L2NvcmUvbXByb2MvdG9vbHMvcmVsLzA0LjAxL2h0b3JwYy9saWIvSHRvcnBjL1hEUi5wbSM3IAotSWQ6IC8vc291cmNlL3Fjb20vcWN0L2NvcmUvbXByb2MvdG9vbHMvcmVsLzA0LjAxL2h0b3JwYy9saWIvSHRvcnBjL091dHB1dC5wbSMyOSAKLUlkOiAvL3NvdXJjZS9xY29tL3FjdC9jb3JlL21wcm9jL3Rvb2xzL3JlbC8wNC4wMS9odG9ycGMvbGliL0h0b3JwYy9QYXJzZXIucG0jMiAKLUlkOiAvL3NvdXJjZS9xY29tL3FjdC9jb3JlL21wcm9jL3Rvb2xzL3JlbC8wNC4wMS9odG9ycGMvbGliL0h0b3JwYy9NZXRhY29tbWVudHMucG0jNiAKLUlkOiAvL3NvdXJjZS9xY29tL3FjdC9jb3JlL21wcm9jL3Rvb2xzL3JlbC8wNC4wMS9odG9ycGMvbGliL0h0b3JwYy9TeW1ib2xUYWJsZS5wbSMzICAKLQotbG9jX2FwaSBEZWZpbml0aW9uIEZpbGUocyk6Ci1JZDogLy9zb3VyY2UvcWNvbS9xY3QvbW9kZW0vYXBpL2dwcy9tYWluL2xhdGVzdC9sb2NfYXBpLmgjMTYKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSRIZWFkZXIkIAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi0KLQotCi0vKgotICogVGhlc2UgYXJlIHN0cnVjdCBkZWNsYXJhdGlvbnMgZm9yIHRoZSBmdW5jdGlvbiBhcmd1bWVudHMKLSAqLwotCi1zdHJ1Y3QgcnBjX2xvY19ldmVudF9jYl9mX3R5cGVfYXJncyB7Ci0gIHJwY191aW50MzIgY2JfaWQ7Ci0gIHJwY19sb2NfY2xpZW50X2hhbmRsZV90eXBlIGxvY19oYW5kbGU7Ci0gIHJwY19sb2NfZXZlbnRfbWFza190eXBlIGxvY19ldmVudDsKLSAgcnBjX2xvY19ldmVudF9wYXlsb2FkX3VfdHlwZSAqbG9jX2V2ZW50X3BheWxvYWQ7Ci19OwotCi0KLQotCi0KLS8qCi0gKiBUaGVzZSBhcmUgc3RydWN0IGRlY2xhcmF0aW9zIGZvciB0aGUgZnVuY3Rpb24gcmVzdWx0cwotICovCi0KLXN0cnVjdCBycGNfbG9jX2V2ZW50X2NiX2ZfdHlwZV9yZXRzIHsKLSAgcnBjX2ludDMyIGxvY19ldmVudF9jYl9mX3R5cGVfcmVzdWx0OwotfTsKLQotCi0KLS8qCi0gKiBYRFIgZGVmaW5pdGlvbiBvZiB0aGUgTE9DX0FQSSBjYWxsYmFjayBwcm9ncmFtICggdmVycy4gMHgwMDA0MDAwMiApCi0gKi8KLQotcHJvZ3JhbSBMT0NfQVBJQ0JQUk9HIHsKLSAgdmVyc2lvbiBMT0NfQVBJQ0JWRVJTXzAwMDEgewotCi0JcnBjX2xvY19ldmVudF9jYl9mX3R5cGVfcmV0cwotCQlycGNfbG9jX2V2ZW50X2NiX2ZfdHlwZSggcnBjX2xvY19ldmVudF9jYl9mX3R5cGVfYXJncyApID0gMTsKLQotCi0KLQotICB9ID0gMHgwMDA0MDAwMTsKLQotCi19ID0gMHgzMTAwMDA4YzsKLQotY29uc3QgTE9DX0FQSUNCVkVSUyA9IDB4MDAwNDAwMDI7CmRpZmYgLS1naXQgYS9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaS1ycGMvZ2VuLTEyNDAvbG9jX2FwaV9jYl9zdmMuYyBiL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpLXJwYy9nZW4tMTI0MC9sb2NfYXBpX2NiX3N2Yy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmEwZDE1Li4wMDAwMDAwCi0tLSBhL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpLXJwYy9nZW4tMTI0MC9sb2NfYXBpX2NiX3N2Yy5jCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoKLSAqIFBsZWFzZSBkbyBub3QgZWRpdCB0aGlzIGZpbGUuCi0gKiBJdCB3YXMgZ2VuZXJhdGVkIHVzaW5nIHJwY2dlbi4KLSAqLwotCi0jaW5jbHVkZSAibG9jX2FwaV9jYi5oIgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8cnBjL3BtYXBfY2xudC5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPG1lbW9yeS5oPgotI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLSNpbmNsdWRlIDxuZXRpbmV0L2luLmg+Ci0KLSNpZm5kZWYgU0lHX1BGCi0jZGVmaW5lIFNJR19QRiB2b2lkKCopKGludCkKLSNlbmRpZgotCi12b2lkCi1sb2NfYXBpY2Jwcm9nXzB4MDAwNDAwMDEoc3RydWN0IHN2Y19yZXEgKnJxc3RwLCByZWdpc3RlciBTVkNYUFJUICp0cmFuc3ApCi17Ci0JdW5pb24gewotCQlycGNfbG9jX2V2ZW50X2NiX2ZfdHlwZV9hcmdzIHJwY19sb2NfZXZlbnRfY2JfZl90eXBlXzB4MDAwNDAwMDFfYXJnOwotCX0gYXJndW1lbnQ7Ci0JdW5pb24gewotCQlycGNfbG9jX2V2ZW50X2NiX2ZfdHlwZV9yZXRzIHJwY19sb2NfZXZlbnRfY2JfZl90eXBlXzB4MDAwNDAwMDFfcmVzOwotCX0gcmVzdWx0OwotCWJvb2xfdCByZXR2YWw7Ci0JeGRycHJvY190IF94ZHJfYXJndW1lbnQsIF94ZHJfcmVzdWx0OwotCWJvb2xfdCAoKmxvY2FsKShjaGFyICosIHZvaWQgKiwgc3RydWN0IHN2Y19yZXEgKik7Ci0KLQlzd2l0Y2ggKHJxc3RwLT5ycV9wcm9jKSB7Ci0JY2FzZSBOVUxMUFJPQzoKLQkJKHZvaWQpIHN2Y19zZW5kcmVwbHkgKHRyYW5zcCwgKHhkcnByb2NfdCkgeGRyX3ZvaWQsIChjaGFyICopTlVMTCk7Ci0JCXJldHVybjsKLQotCWNhc2UgcnBjX2xvY19ldmVudF9jYl9mX3R5cGU6Ci0JCV94ZHJfYXJndW1lbnQgPSAoeGRycHJvY190KSB4ZHJfcnBjX2xvY19ldmVudF9jYl9mX3R5cGVfYXJnczsKLQkJX3hkcl9yZXN1bHQgPSAoeGRycHJvY190KSB4ZHJfcnBjX2xvY19ldmVudF9jYl9mX3R5cGVfcmV0czsKLQkJbG9jYWwgPSAoYm9vbF90ICgqKSAoY2hhciAqLCB2b2lkICosICBzdHJ1Y3Qgc3ZjX3JlcSAqKSlycGNfbG9jX2V2ZW50X2NiX2ZfdHlwZV8weDAwMDQwMDAxX3N2YzsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlzdmNlcnJfbm9wcm9jICh0cmFuc3ApOwotCQlyZXR1cm47Ci0JfQotCW1lbXNldCAoKGNoYXIgKikmYXJndW1lbnQsIDAsIHNpemVvZiAoYXJndW1lbnQpKTsKLQlpZiAoIXN2Y19nZXRhcmdzICh0cmFuc3AsICh4ZHJwcm9jX3QpIF94ZHJfYXJndW1lbnQsIChjYWRkcl90KSAmYXJndW1lbnQpKSB7Ci0JCXN2Y2Vycl9kZWNvZGUgKHRyYW5zcCk7Ci0JCXJldHVybjsKLQl9Ci0JcmV0dmFsID0gKGJvb2xfdCkgKCpsb2NhbCkoKGNoYXIgKikmYXJndW1lbnQsICh2b2lkICopJnJlc3VsdCwgcnFzdHApOwotCWlmIChyZXR2YWwgPiAwICYmICFzdmNfc2VuZHJlcGx5KHRyYW5zcCwgKHhkcnByb2NfdCkgX3hkcl9yZXN1bHQsIChjaGFyICopJnJlc3VsdCkpIHsKLQkJc3ZjZXJyX3N5c3RlbWVyciAodHJhbnNwKTsKLQl9Ci0JaWYgKCFzdmNfZnJlZWFyZ3MgKHRyYW5zcCwgKHhkcnByb2NfdCkgX3hkcl9hcmd1bWVudCwgKGNhZGRyX3QpICZhcmd1bWVudCkpIHsKLQkJZnByaW50ZiAoc3RkZXJyLCAiJXMiLCAidW5hYmxlIHRvIGZyZWUgYXJndW1lbnRzIik7Ci0JCWV4aXQgKDEpOwotCX0KLQlpZiAoIWxvY19hcGljYnByb2dfMHgwMDA0MDAwMV9mcmVlcmVzdWx0ICh0cmFuc3AsIF94ZHJfcmVzdWx0LCAoY2FkZHJfdCkgJnJlc3VsdCkpCi0JCWZwcmludGYgKHN0ZGVyciwgIiVzIiwgInVuYWJsZSB0byBmcmVlIHJlc3VsdHMiKTsKLQotCXJldHVybjsKLX0KZGlmZiAtLWdpdCBhL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpLXJwYy9nZW4tMTI0MC9sb2NfYXBpX2NiX3hkci5jIGIvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGktcnBjL2dlbi0xMjQwL2xvY19hcGlfY2JfeGRyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkNzc5NWUuLjAwMDAwMDAKLS0tIGEvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGktcnBjL2dlbi0xMjQwL2xvY19hcGlfY2JfeGRyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKgotICogUGxlYXNlIGRvIG5vdCBlZGl0IHRoaXMgZmlsZS4KLSAqIEl0IHdhcyBnZW5lcmF0ZWQgdXNpbmcgcnBjZ2VuLgotICovCi0KLSNpbmNsdWRlICJsb2NfYXBpX2NiLmgiCi0KLWJvb2xfdAoteGRyX3JwY19sb2NfZXZlbnRfY2JfZl90eXBlX2FyZ3MgKFhEUiAqeGRycywgcnBjX2xvY19ldmVudF9jYl9mX3R5cGVfYXJncyAqb2JqcCkKLXsKLQlyZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLQkgaWYgKCF4ZHJfcnBjX3VpbnQzMiAoeGRycywgJm9ianAtPmNiX2lkKSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfcnBjX2xvY19jbGllbnRfaGFuZGxlX3R5cGUgKHhkcnMsICZvYmpwLT5sb2NfaGFuZGxlKSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfcnBjX2xvY19ldmVudF9tYXNrX3R5cGUgKHhkcnMsICZvYmpwLT5sb2NfZXZlbnQpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9wb2ludGVyICh4ZHJzLCAoY2hhciAqKikmb2JqcC0+bG9jX2V2ZW50X3BheWxvYWQsIHNpemVvZiAocnBjX2xvY19ldmVudF9wYXlsb2FkX3VfdHlwZSksICh4ZHJwcm9jX3QpIHhkcl9ycGNfbG9jX2V2ZW50X3BheWxvYWRfdV90eXBlKSkKLQkJIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19ldmVudF9jYl9mX3R5cGVfcmV0cyAoWERSICp4ZHJzLCBycGNfbG9jX2V2ZW50X2NiX2ZfdHlwZV9yZXRzICpvYmpwKQotewotCXJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotCSBpZiAoIXhkcl9ycGNfaW50MzIgKHhkcnMsICZvYmpwLT5sb2NfZXZlbnRfY2JfZl90eXBlX3Jlc3VsdCkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JcmV0dXJuIFRSVUU7Ci19CmRpZmYgLS1naXQgYS9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaS1ycGMvZ2VuLTEyNDAvbG9jX2FwaV9jbG50LmMgYi9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaS1ycGMvZ2VuLTEyNDAvbG9jX2FwaV9jbG50LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjYTFlOGQuLjAwMDAwMDAKLS0tIGEvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGktcnBjL2dlbi0xMjQwL2xvY19hcGlfY2xudC5jCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoKLSAqIFBsZWFzZSBkbyBub3QgZWRpdCB0aGlzIGZpbGUuCi0gKiBJdCB3YXMgZ2VuZXJhdGVkIHVzaW5nIHJwY2dlbi4KLSAqLwotCi0jaW5jbHVkZSA8bWVtb3J5Lmg+IC8qIGZvciBtZW1zZXQgKi8KLSNpbmNsdWRlICJsb2NfYXBpLmgiCi0KLS8qIERlZmF1bHQgdGltZW91dCBjYW4gYmUgY2hhbmdlZCB1c2luZyBjbG50X2NvbnRyb2woKSAqLwotc3RhdGljIHN0cnVjdCB0aW1ldmFsIFRJTUVPVVQgPSB7IDI1LCAwIH07Ci0KLWVudW0gY2xudF9zdGF0IAotcnBjX2xvY19hcGlfbnVsbF8weDAwMDQwMDAxKHZvaWQgKmFyZ3AsIHZvaWQgKmNsbnRfcmVzLCBDTElFTlQgKmNsbnQpCi17Ci0JcmV0dXJuIChjbG50X2NhbGwoY2xudCwgcnBjX2xvY19hcGlfbnVsbCwKLQkJKHhkcnByb2NfdCkgeGRyX3ZvaWQsIChjYWRkcl90KSBhcmdwLAotCQkoeGRycHJvY190KSB4ZHJfdm9pZCwgKGNhZGRyX3QpIGNsbnRfcmVzLAotCQlUSU1FT1VUKSk7Ci19Ci0KLWVudW0gY2xudF9zdGF0IAotcnBjX2xvY19hcGlfcnBjX2dsdWVfY29kZV9pbmZvX3JlbW90ZV8weDAwMDQwMDAxKHZvaWQgKmFyZ3AsIHJwY19sb2NfYXBpX3JwY19nbHVlX2NvZGVfaW5mb19yZW1vdGVfcmV0cyAqY2xudF9yZXMsIENMSUVOVCAqY2xudCkKLXsKLQlyZXR1cm4gKGNsbnRfY2FsbChjbG50LCBycGNfbG9jX2FwaV9ycGNfZ2x1ZV9jb2RlX2luZm9fcmVtb3RlLAotCQkoeGRycHJvY190KSB4ZHJfdm9pZCwgKGNhZGRyX3QpIGFyZ3AsCi0JCSh4ZHJwcm9jX3QpIHhkcl9ycGNfbG9jX2FwaV9ycGNfZ2x1ZV9jb2RlX2luZm9fcmVtb3RlX3JldHMsIChjYWRkcl90KSBjbG50X3JlcywKLQkJVElNRU9VVCkpOwotfQotCi1lbnVtIGNsbnRfc3RhdCAKLXJwY19sb2Nfb3Blbl8weDAwMDQwMDAxKHJwY19sb2Nfb3Blbl9hcmdzICphcmdwLCBycGNfbG9jX29wZW5fcmV0cyAqY2xudF9yZXMsIENMSUVOVCAqY2xudCkKLXsKLQlyZXR1cm4gKGNsbnRfY2FsbChjbG50LCBycGNfbG9jX29wZW4sCi0JCSh4ZHJwcm9jX3QpIHhkcl9ycGNfbG9jX29wZW5fYXJncywgKGNhZGRyX3QpIGFyZ3AsCi0JCSh4ZHJwcm9jX3QpIHhkcl9ycGNfbG9jX29wZW5fcmV0cywgKGNhZGRyX3QpIGNsbnRfcmVzLAotCQlUSU1FT1VUKSk7Ci19Ci0KLWVudW0gY2xudF9zdGF0IAotcnBjX2xvY19jbG9zZV8weDAwMDQwMDAxKHJwY19sb2NfY2xvc2VfYXJncyAqYXJncCwgcnBjX2xvY19jbG9zZV9yZXRzICpjbG50X3JlcywgQ0xJRU5UICpjbG50KQotewotCXJldHVybiAoY2xudF9jYWxsKGNsbnQsIHJwY19sb2NfY2xvc2UsCi0JCSh4ZHJwcm9jX3QpIHhkcl9ycGNfbG9jX2Nsb3NlX2FyZ3MsIChjYWRkcl90KSBhcmdwLAotCQkoeGRycHJvY190KSB4ZHJfcnBjX2xvY19jbG9zZV9yZXRzLCAoY2FkZHJfdCkgY2xudF9yZXMsCi0JCVRJTUVPVVQpKTsKLX0KLQotZW51bSBjbG50X3N0YXQgCi1ycGNfbG9jX3N0YXJ0X2ZpeF8weDAwMDQwMDAxKHJwY19sb2Nfc3RhcnRfZml4X2FyZ3MgKmFyZ3AsIHJwY19sb2Nfc3RhcnRfZml4X3JldHMgKmNsbnRfcmVzLCBDTElFTlQgKmNsbnQpCi17Ci0JcmV0dXJuIChjbG50X2NhbGwoY2xudCwgcnBjX2xvY19zdGFydF9maXgsCi0JCSh4ZHJwcm9jX3QpIHhkcl9ycGNfbG9jX3N0YXJ0X2ZpeF9hcmdzLCAoY2FkZHJfdCkgYXJncCwKLQkJKHhkcnByb2NfdCkgeGRyX3JwY19sb2Nfc3RhcnRfZml4X3JldHMsIChjYWRkcl90KSBjbG50X3JlcywKLQkJVElNRU9VVCkpOwotfQotCi1lbnVtIGNsbnRfc3RhdCAKLXJwY19sb2Nfc3RvcF9maXhfMHgwMDA0MDAwMShycGNfbG9jX3N0b3BfZml4X2FyZ3MgKmFyZ3AsIHJwY19sb2Nfc3RvcF9maXhfcmV0cyAqY2xudF9yZXMsIENMSUVOVCAqY2xudCkKLXsKLQlyZXR1cm4gKGNsbnRfY2FsbChjbG50LCBycGNfbG9jX3N0b3BfZml4LAotCQkoeGRycHJvY190KSB4ZHJfcnBjX2xvY19zdG9wX2ZpeF9hcmdzLCAoY2FkZHJfdCkgYXJncCwKLQkJKHhkcnByb2NfdCkgeGRyX3JwY19sb2Nfc3RvcF9maXhfcmV0cywgKGNhZGRyX3QpIGNsbnRfcmVzLAotCQlUSU1FT1VUKSk7Ci19Ci0KLWVudW0gY2xudF9zdGF0IAotcnBjX2xvY19pb2N0bF8weDAwMDQwMDAxKHJwY19sb2NfaW9jdGxfYXJncyAqYXJncCwgcnBjX2xvY19pb2N0bF9yZXRzICpjbG50X3JlcywgQ0xJRU5UICpjbG50KQotewotCXJldHVybiAoY2xudF9jYWxsKGNsbnQsIHJwY19sb2NfaW9jdGwsCi0JCSh4ZHJwcm9jX3QpIHhkcl9ycGNfbG9jX2lvY3RsX2FyZ3MsIChjYWRkcl90KSBhcmdwLAotCQkoeGRycHJvY190KSB4ZHJfcnBjX2xvY19pb2N0bF9yZXRzLCAoY2FkZHJfdCkgY2xudF9yZXMsCi0JCVRJTUVPVVQpKTsKLX0KLQotZW51bSBjbG50X3N0YXQgCi1ycGNfbG9jX2FwaV9hcGlfdmVyc2lvbnNfMHgwMDA0MDAwMSh2b2lkICphcmdwLCBycGNfbG9jX2FwaV9hcGlfdmVyc2lvbnNfcmV0cyAqY2xudF9yZXMsIENMSUVOVCAqY2xudCkKLXsKLQlyZXR1cm4gKGNsbnRfY2FsbChjbG50LCBycGNfbG9jX2FwaV9hcGlfdmVyc2lvbnMsCi0JCSh4ZHJwcm9jX3QpIHhkcl92b2lkLCAoY2FkZHJfdCkgYXJncCwKLQkJKHhkcnByb2NfdCkgeGRyX3JwY19sb2NfYXBpX2FwaV92ZXJzaW9uc19yZXRzLCAoY2FkZHJfdCkgY2xudF9yZXMsCi0JCVRJTUVPVVQpKTsKLX0KLQotZW51bSBjbG50X3N0YXQgCi1ycGNfbG9jX2FwaV9udWxsXzB4MDAwNDAwMDIodm9pZCAqYXJncCwgdm9pZCAqY2xudF9yZXMsIENMSUVOVCAqY2xudCkKLXsKLQlyZXR1cm4gKGNsbnRfY2FsbChjbG50LCBycGNfbG9jX2FwaV9udWxsLAotCQkoeGRycHJvY190KSB4ZHJfdm9pZCwgKGNhZGRyX3QpIGFyZ3AsCi0JCSh4ZHJwcm9jX3QpIHhkcl92b2lkLCAoY2FkZHJfdCkgY2xudF9yZXMsCi0JCVRJTUVPVVQpKTsKLX0KZGlmZiAtLWdpdCBhL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpLXJwYy9nZW4tMTI0MC9sb2NfYXBpX2NvbW1vbi54ZHIgYi9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaS1ycGMvZ2VuLTEyNDAvbG9jX2FwaV9jb21tb24ueGRyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTAxNjA3Li4wMDAwMDAwCi0tLSBhL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpLXJwYy9nZW4tMTI0MC9sb2NfYXBpX2NvbW1vbi54ZHIKKysrIC9kZXYvbnVsbApAQCAtMSw5MDYgKzAsMCBAQAotLyogTE9DX0FQSSBUT09MIFZFUlNJT046IDQuMzYgKi8KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgICAgICAgICAgICAgICAgICBMIE8gQyBfIEEgUCBJIF8gQyBPIE0gTSBPIE4gLiBYIEQgUgotCi1HRU5FUkFMIERFU0NSSVBUSU9OCi0gIFRoaXMgaXMgYW4gQVVUTyBHRU5FUkFURUQgZmlsZSB0aGF0IHByb3ZpZGVzIGFuIHhkciBjb21wYXRpYmxlIGRlZmluaXRpb24gb2YKLSAgYW4gYXBpIHRoYXQgcmVwcmVzZW50cyB0aGUgZ3JvdXBpbmcgb2YgdGhlIGRpZmZlcmVudCBjYWxsYmFjayBmdW5jdGlvbnMgdGhlCi0gIGxvY19hcGkgQVBJIHN1cHBvcnRzLgotCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICBDb3B5cmlnaHQgKGMpIDIwMTAgUVVBTENPTU0gSW5jb3Jwb3JhdGVkLgotICBBbGwgUmlnaHRzIFJlc2VydmVkLiBRVUFMQ09NTSBQcm9wcmlldGFyeSBhbmQgQ29uZmlkZW50aWFsLgotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFZGl0IEhpc3RvcnkKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVVRPIEdFTkVSQVRFRAotCi1HZW5lcmF0ZWQgYnkgZm9sbG93aW5nIHZlcnNpb25zIG9mIEh0b3JwYyBtb2R1bGVzOgotSWQ6IC8vc291cmNlL3Fjb20vcWN0L2NvcmUvbXByb2MvdG9vbHMvcmVsLzA0LjAxL2h0b3JwYy9odG9ycGMucGwjMjAgCi1JZDogLy9zb3VyY2UvcWNvbS9xY3QvY29yZS9tcHJvYy90b29scy9yZWwvMDQuMDEvaHRvcnBjL2xpYi9IdG9ycGMvU3RhcnQucG0jMyAKLUlkOiAvL3NvdXJjZS9xY29tL3FjdC9jb3JlL21wcm9jL3Rvb2xzL3JlbC8wNC4wMS9odG9ycGMvbGliL0h0b3JwYy9IdG94ZHIucG0jMSAKLUlkOiAvL3NvdXJjZS9xY29tL3FjdC9jb3JlL21wcm9jL3Rvb2xzL3JlbC8wNC4wMS9odG9ycGMvbGliL0h0b3JwYy9YRFIucG0jNyAKLUlkOiAvL3NvdXJjZS9xY29tL3FjdC9jb3JlL21wcm9jL3Rvb2xzL3JlbC8wNC4wMS9odG9ycGMvbGliL0h0b3JwYy9PdXRwdXQucG0jMjkgCi1JZDogLy9zb3VyY2UvcWNvbS9xY3QvY29yZS9tcHJvYy90b29scy9yZWwvMDQuMDEvaHRvcnBjL2xpYi9IdG9ycGMvUGFyc2VyLnBtIzIgCi1JZDogLy9zb3VyY2UvcWNvbS9xY3QvY29yZS9tcHJvYy90b29scy9yZWwvMDQuMDEvaHRvcnBjL2xpYi9IdG9ycGMvTWV0YWNvbW1lbnRzLnBtIzYgCi1JZDogLy9zb3VyY2UvcWNvbS9xY3QvY29yZS9tcHJvYy90b29scy9yZWwvMDQuMDEvaHRvcnBjL2xpYi9IdG9ycGMvU3ltYm9sVGFibGUucG0jMyAgCi0KLWxvY19hcGkgRGVmaW5pdGlvbiBGaWxlKHMpOgotSWQ6IC8vc291cmNlL3Fjb20vcWN0L21vZGVtL2FwaS9ncHMvbWFpbi9sYXRlc3QvbG9jX2FwaS5oIzE2Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0kSGVhZGVyJCAKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotCi0KLWNvbnN0IExPQ19BUElfVE9PTFZFUlMgPSAweDAwMDQwMDI0OwotY29uc3QgTE9DX0FQSV9GRUFUVVJFUyA9IDB4MDAwMDAwMDE7Ci0KLWNvbnN0IFJQQ19MT0NfRVZFTlRfTklfTk9USUZZX1ZFUklGWV9SRVFVRVNUID0gMHgwMDAwMDAxMDsKLQotY29uc3QgUlBDX0xPQ19FVkVOVF9XUFNfTkVFREVEX1JFUVVFU1QgPSAweDAwMDAwMjAwOwotCi1jb25zdCBSUENfTE9DX0VWRU5UX0lPQ1RMX1JFUE9SVCA9IDB4MDAwMDAwODA7Ci0KLWNvbnN0IFJQQ19MT0NfRVZFTlRfTE9DQVRJT05fU0VSVkVSX1JFUVVFU1QgPSAweDAwMDAwMDQwOwotCi1jb25zdCBSUENfTE9DX0VWRU5UX1JFU0VSVkVEID0gMHg4MDAwMDAwMDAwMDAwMDAwOwotCi1jb25zdCBSUENfTE9DX0VWRU5UX1BBUlNFRF9QT1NJVElPTl9SRVBPUlQgPSAweDAwMDAwMDAxOwotCi1jb25zdCBSUENfTE9DX0VWRU5UX0FTU0lTVEFOQ0VfREFUQV9SRVFVRVNUID0gMHgwMDAwMDAyMDsKLQotY29uc3QgUlBDX0xPQ19FVkVOVF9OTUVBX1BPU0lUSU9OX1JFUE9SVCA9IDB4MDAwMDAwMDg7Ci0KLWNvbnN0IFJQQ19MT0NfRVZFTlRfU0FURUxMSVRFX1JFUE9SVCA9IDB4MDAwMDAwMDI7Ci0KLWNvbnN0IFJQQ19MT0NfRVZFTlRfU1RBVFVTX1JFUE9SVCA9IDB4MDAwMDAxMDA7Ci0KLWNvbnN0IFJQQ19MT0NfRVZFTlRfQ0JfRl9UWVBFX1ZFUlNJT04gPSAweDAwMDQwMDAxOwotY29uc3QgUlBDX0xPQ19PUEVOX1ZFUlNJT04gPSAweDAwMDQwMDAxOwotY29uc3QgUlBDX0xPQ19BUElfUlBDX0dMVUVfQ09ERV9JTkZPX1JFTU9URV9WRVJTSU9OID0gMHgwMDA0MDAwMTsKLWNvbnN0IFJQQ19MT0NfQVBJX05VTExfVkVSU0lPTiA9IDB4MDAwNDAwMDE7Ci1jb25zdCBSUENfTE9DX1NUT1BfRklYX1ZFUlNJT04gPSAweDAwMDQwMDAxOwotY29uc3QgUlBDX0xPQ19JT0NUTF9WRVJTSU9OID0gMHgwMDA0MDAwMTsKLWNvbnN0IFJQQ19MT0NfU1RBUlRfRklYX1ZFUlNJT04gPSAweDAwMDQwMDAxOwotY29uc3QgUlBDX0xPQ19DTE9TRV9WRVJTSU9OID0gMHgwMDA0MDAwMTsKLWNvbnN0IFJQQ19MT0NfQVBJX0FQSV9WRVJTSU9OU19WRVJTSU9OID0gMHgwMDA0MDAwMTsKLWNvbnN0IFJQQ19MT0NfQVBJX0FQSV9NQUpPUl9OVU0gPSAweDAwMDQ7Ci1jb25zdCBSUENfTE9DX0FQSUFQSV9WRVJTSU9OX0lTX0hBU0hLRVkgPSAwOwotCi10eXBlZGVmIGJvb2wgcnBjX2Jvb2xlYW47Ci0KLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBycGNfdWludDMyOwotCi10eXBlZGVmIHVuc2lnbmVkIHNob3J0IHJwY191aW50MTY7Ci0KLXR5cGVkZWYgdW5zaWduZWQgY2hhciBycGNfdWludDg7Ci0KLXR5cGVkZWYgbG9uZyBycGNfaW50MzI7Ci0KLXR5cGVkZWYgdW5zaWduZWQgY2hhciBycGNfYnl0ZTsKLQotdHlwZWRlZiB1bnNpZ25lZCBoeXBlciBycGNfdWludDY0OwotCi10eXBlZGVmIHJwY19pbnQzMiBycGNfbG9jX2NsaWVudF9oYW5kbGVfdHlwZTsKLQotdHlwZWRlZiBycGNfdWludDY0IHJwY19sb2NfZXZlbnRfbWFza190eXBlOwotCi10eXBlZGVmIHJwY191aW50NjQgcnBjX2xvY19wb3NpdGlvbl92YWxpZF9tYXNrX3R5cGU7Ci0KLXR5cGVkZWYgcnBjX3VpbnQzMiBycGNfbG9jX3Bvc190ZWNobm9sb2d5X21hc2tfdHlwZTsKLQotZW51bSBycGNfbG9jX3Nlc3Npb25fc3RhdHVzX2VfdHlwZSB7Ci0gIFJQQ19MT0NfU0VTU19TVEFUVVNfU1VDQ0VTUyA9IDAsCi0gIFJQQ19MT0NfU0VTU19TVEFUVVNfSU5fUFJPR0VTUyA9IDEsCi0gIFJQQ19MT0NfU0VTU19TVEFUVVNfR0VORVJBTF9GQUlMVVJFID0gMiwKLSAgUlBDX0xPQ19TRVNTX1NUQVRVU19USU1FT1VUID0gMywKLSAgUlBDX0xPQ19TRVNTX1NUQVRVU19VU0VSX0VORCA9IDQsCi0gIFJQQ19MT0NfU0VTU19TVEFUVVNfQkFEX1BBUkFNRVRFUiA9IDUsCi0gIFJQQ19MT0NfU0VTU19TVEFUVVNfUEhPTkVfT0ZGTElORSA9IDYsCi0gIFJQQ19MT0NfU0VTU19TVEFUVVNfRU5HSU5FX0xPQ0tFRCA9IDcsCi0gIFJQQ19MT0NfU0VTU19TVEFUVVNfTUFYID0gMjY4NDM1NDU2Ci19OwotCi1zdHJ1Y3QgcnBjX2xvY19jYWxlbmRhcl90aW1lX3NfdHlwZSB7Ci0gIHJwY191aW50MTYgeWVhcjsKLSAgdW5zaWduZWQgY2hhciBtb250aDsKLSAgdW5zaWduZWQgY2hhciBkYXlfb2Zfd2VlazsKLSAgdW5zaWduZWQgY2hhciBkYXk7Ci0gIHVuc2lnbmVkIGNoYXIgaG91cjsKLSAgdW5zaWduZWQgY2hhciBtaW51dGU7Ci0gIHVuc2lnbmVkIGNoYXIgc2Vjb25kOwotICBycGNfdWludDE2IG1pbGxpc2Vjb25kOwotfTsKLQotc3RydWN0IHJwY19sb2NfcGFyc2VkX3Bvc2l0aW9uX3NfdHlwZSB7Ci0gIHJwY19sb2NfcG9zaXRpb25fdmFsaWRfbWFza190eXBlIHZhbGlkX21hc2s7Ci0gIHJwY19sb2Nfc2Vzc2lvbl9zdGF0dXNfZV90eXBlIHNlc3Npb25fc3RhdHVzOwotICBycGNfbG9jX2NhbGVuZGFyX3RpbWVfc190eXBlIHRpbWVzdGFtcF9jYWxlbmRhcjsKLSAgcnBjX3VpbnQ2NCB0aW1lc3RhbXBfdXRjOwotICBycGNfdWludDggbGVhcF9zZWNvbmRzOwotICBmbG9hdCB0aW1lX3VuYzsKLSAgZG91YmxlIGxhdGl0dWRlOwotICBkb3VibGUgbG9uZ2l0dWRlOwotICBmbG9hdCBhbHRpdHVkZV93cnRfZWxsaXBzb2lkOwotICBmbG9hdCBhbHRpdHVkZV93cnRfbWVhbl9zZWFfbGV2ZWw7Ci0gIGZsb2F0IHNwZWVkX2hvcml6b250YWw7Ci0gIGZsb2F0IHNwZWVkX3ZlcnRpY2FsOwotICBmbG9hdCBoZWFkaW5nOwotICBmbG9hdCBob3JfdW5jX2NpcmN1bGFyOwotICBmbG9hdCBob3JfdW5jX2VsbGlwc2Vfc2VtaV9tYWpvcjsKLSAgZmxvYXQgaG9yX3VuY19lbGxpcHNlX3NlbWlfbWlub3I7Ci0gIGZsb2F0IGhvcl91bmNfZWxsaXBzZV9vcmllbnRfYXppbXV0aDsKLSAgZmxvYXQgdmVydF91bmM7Ci0gIGZsb2F0IHNwZWVkX3VuYzsKLSAgZmxvYXQgaGVhZGluZ191bmM7Ci0gIHVuc2lnbmVkIGNoYXIgY29uZmlkZW5jZV9ob3Jpem9udGFsOwotICB1bnNpZ25lZCBjaGFyIGNvbmZpZGVuY2VfdmVydGljYWw7Ci0gIGZsb2F0IG1hZ25ldGljX2RldmlhdGlvbjsKLSAgcnBjX2xvY19wb3NfdGVjaG5vbG9neV9tYXNrX3R5cGUgdGVjaG5vbG9neV9tYXNrOwotfTsKLQotZW51bSBycGNfbG9jX3N2X3N5c3RlbV9lX3R5cGUgewotICBSUENfTE9DX1NWX1NZU1RFTV9HUFMgPSAxLAotICBSUENfTE9DX1NWX1NZU1RFTV9HQUxJTEVPID0gMiwKLSAgUlBDX0xPQ19TVl9TWVNURU1fU0JBUyA9IDMsCi0gIFJQQ19MT0NfU1ZfU1lTVEVNX0NPTVBBU1MgPSA0LAotICBSUENfTE9DX1NWX1NZU1RFTV9HTE9OQVNTID0gNSwKLSAgUlBDX0xPQ19TVl9TWVNURU1fTUFYID0gMjY4NDM1NDU2Ci19OwotCi1lbnVtIHJwY19sb2Nfc3Zfc3RhdHVzX2VfdHlwZSB7Ci0gIFJQQ19MT0NfU1ZfU1RBVFVTX0lETEUgPSAxLAotICBSUENfTE9DX1NWX1NUQVRVU19TRUFSQ0ggPSAyLAotICBSUENfTE9DX1NWX1NUQVRVU19UUkFDSyA9IDMsCi0gIFJQQ19MT0NfU1ZfU1RBVFVTX01BWCA9IDI2ODQzNTQ1NgotfTsKLQotdHlwZWRlZiBycGNfdWludDMyIHJwY19sb2Nfc3ZfaW5mb192YWxpZF9tYXNrX3R5cGU7Ci0KLXN0cnVjdCBycGNfbG9jX3N2X2luZm9fc190eXBlIHsKLSAgcnBjX2xvY19zdl9pbmZvX3ZhbGlkX21hc2tfdHlwZSB2YWxpZF9tYXNrOwotICBycGNfbG9jX3N2X3N5c3RlbV9lX3R5cGUgc3lzdGVtOwotICBycGNfdWludDggcHJuOwotICBycGNfdWludDggaGVhbHRoX3N0YXR1czsKLSAgcnBjX2xvY19zdl9zdGF0dXNfZV90eXBlIHByb2Nlc3Nfc3RhdHVzOwotICBycGNfYm9vbGVhbiBoYXNfZXBoOwotICBycGNfYm9vbGVhbiBoYXNfYWxtOwotICBmbG9hdCBlbGV2YXRpb247Ci0gIGZsb2F0IGF6aW11dGg7Ci0gIGZsb2F0IHNucjsKLX07Ci0KLXR5cGVkZWYgcnBjX3VpbnQzMiBycGNfbG9jX2duc3NfaW5mb192YWxpZF9tYXNrX3R5cGU7Ci0KLXN0cnVjdCBycGNfbG9jX2duc3NfaW5mb19zX3R5cGUgewotICBycGNfbG9jX2duc3NfaW5mb192YWxpZF9tYXNrX3R5cGUgdmFsaWRfbWFzazsKLSAgZmxvYXQgcG9zaXRpb25fZG9wOwotICBmbG9hdCBob3Jpem9udGFsX2RvcDsKLSAgZmxvYXQgdmVydGljYWxfZG9wOwotICBycGNfYm9vbGVhbiBhbHRpdHVkZV9hc3N1bWVkOwotICBycGNfdWludDE2IHN2X2NvdW50OwotICAgIHJwY19sb2Nfc3ZfaW5mb19zX3R5cGUgc3ZfbGlzdDw4MD47IC8qIEVWQUw6W0xPQ19BUElfTUFYX1NWX0NPVU5UXSovICAKLX07Ci0KLXN0cnVjdCBycGNfbG9jX25tZWFfcmVwb3J0X3NfdHlwZSB7Ci0gIHJwY191aW50MTYgbGVuZ3RoOwotICAgIG9wYXF1ZSBubWVhX3NlbnRlbmNlc1sxMjAwXTsgLyogRVZBTDpbMTIwMF0qLyAgCi19OwotCi1lbnVtIHJwY19sb2Nfc3RhdHVzX2V2ZW50X2VfdHlwZSB7Ci0gIFJQQ19MT0NfU1RBVFVTX0VWRU5UX0VOR0lORV9TVEFURSA9IDEsCi0gIFJQQ19MT0NfU1RBVFVTX0VWRU5UX0ZJWF9TRVNTSU9OX1NUQVRFID0gMiwKLSAgUlBDX0xPQ19TVEFUVVNfRVZFTlRfTUFYID0gMjY4NDM1NDU2Ci19OwotCi1lbnVtIHJwY19sb2NfZW5naW5lX3N0YXRlX2VfdHlwZSB7Ci0gIFJQQ19MT0NfRU5HSU5FX1NUQVRFX09OID0gMSwKLSAgUlBDX0xPQ19FTkdJTkVfU1RBVEVfT0ZGID0gMiwKLSAgUlBDX0xPQ19FTkdJTkVfU1RBVEVfTUFYID0gMjY4NDM1NDU2Ci19OwotCi1lbnVtIHJwY19sb2NfZml4X3Nlc3Npb25fc3RhdGVfZV90eXBlIHsKLSAgUlBDX0xPQ19GSVhfU0VTU0lPTl9TVEFURV9CRUdJTiA9IDEsCi0gIFJQQ19MT0NfRklYX1NFU1NJT05fU1RBVEVfRU5EID0gMiwKLSAgUlBDX0xPQ19GSVhfU0VTU0lPTl9TVEFURV9NQVggPSAyNjg0MzU0NTYKLX07Ci0KLXVuaW9uIHJwY19sb2Nfc3RhdHVzX2V2ZW50X3BheWxvYWRfdV90eXBlIHN3aXRjaCAocnBjX2xvY19zdGF0dXNfZXZlbnRfZV90eXBlIGRpc2MpIHsKLSAgY2FzZSBSUENfTE9DX1NUQVRVU19FVkVOVF9FTkdJTkVfU1RBVEU6Ci0gICAgcnBjX2xvY19lbmdpbmVfc3RhdGVfZV90eXBlIGVuZ2luZV9zdGF0ZTsKLSAgY2FzZSBSUENfTE9DX1NUQVRVU19FVkVOVF9GSVhfU0VTU0lPTl9TVEFURToKLSAgICBycGNfbG9jX2ZpeF9zZXNzaW9uX3N0YXRlX2VfdHlwZSBmaXhfc2Vzc2lvbl9zdGF0ZTsKLSAgZGVmYXVsdDoKLSAgICB2b2lkOwotfTsKLQotc3RydWN0IHJwY19sb2Nfc3RhdHVzX2V2ZW50X3NfdHlwZSB7Ci0gIHJwY19sb2Nfc3RhdHVzX2V2ZW50X2VfdHlwZSBldmVudDsKLSAgcnBjX2xvY19zdGF0dXNfZXZlbnRfcGF5bG9hZF91X3R5cGUgcGF5bG9hZDsKLX07Ci0KLWVudW0gcnBjX2xvY19zZXJ2ZXJfYWRkcl9lX3R5cGUgewotICBSUENfTE9DX1NFUlZFUl9BRERSX0lQVjQgPSAxLAotICBSUENfTE9DX1NFUlZFUl9BRERSX1VSTCA9IDIsCi0gIFJQQ19MT0NfU0VSVkVSX0FERFJfTUFYID0gMjY4NDM1NDU2Ci19OwotCi1zdHJ1Y3QgcnBjX2xvY19zZXJ2ZXJfYWRkcl9pcHY0X3R5cGUgewotICBycGNfdWludDMyIGFkZHI7Ci0gIHJwY191aW50MTYgcG9ydDsKLX07Ci0KLXN0cnVjdCBycGNfbG9jX3NlcnZlcl9hZGRyX3VybF90eXBlIHsKLSAgcnBjX3VpbnQxNiBsZW5ndGg7Ci0gICAgb3BhcXVlIGFkZHJbMjU2XTsgLyogRVZBTDpbMjU2XSovICAKLX07Ci0KLXVuaW9uIHJwY19sb2Nfc2VydmVyX2FkZHJfdV90eXBlIHN3aXRjaCAocnBjX2xvY19zZXJ2ZXJfYWRkcl9lX3R5cGUgZGlzYykgewotICBjYXNlIFJQQ19MT0NfU0VSVkVSX0FERFJfSVBWNDoKLSAgICBycGNfbG9jX3NlcnZlcl9hZGRyX2lwdjRfdHlwZSBpcHY0OwotICBjYXNlIFJQQ19MT0NfU0VSVkVSX0FERFJfVVJMOgotICAgIHJwY19sb2Nfc2VydmVyX2FkZHJfdXJsX3R5cGUgdXJsOwotICBkZWZhdWx0OgotICAgIHZvaWQ7Ci19OwotCi1zdHJ1Y3QgcnBjX2xvY19zZXJ2ZXJfaW5mb19zX3R5cGUgewotICBycGNfbG9jX3NlcnZlcl9hZGRyX2VfdHlwZSBhZGRyX3R5cGU7Ci0gIHJwY19sb2Nfc2VydmVyX2FkZHJfdV90eXBlIGFkZHJfaW5mbzsKLX07Ci0KLWVudW0gcnBjX2xvY19uaV9ub3RpZnlfdmVyaWZ5X2VfdHlwZSB7Ci0gIFJQQ19MT0NfTklfVVNFUl9OT19OT1RJRllfTk9fVkVSSUZZID0gMSwKLSAgUlBDX0xPQ19OSV9VU0VSX05PVElGWV9PTkxZID0gMiwKLSAgUlBDX0xPQ19OSV9VU0VSX05PVElGWV9WRVJJRllfQUxMT1dfTk9fUkVTUCA9IDMsCi0gIFJQQ19MT0NfTklfVVNFUl9OT1RJRllfVkVSSUZZX05PVF9BTExPV19OT19SRVNQID0gNCwKLSAgUlBDX0xPQ19OSV9VU0VSX1BSSVZBQ1lfT1ZFUlJJREUgPSA1LAotICBSUENfTE9DX05JX1VTRVJfTk9USUZZX1ZFUklUWV9UWVBFX01BWCA9IDI2ODQzNTQ1NgotfTsKLQotZW51bSBycGNfbG9jX25pX2V2ZW50X2VfdHlwZSB7Ci0gIFJQQ19MT0NfTklfRVZFTlRfVlhfTk9USUZZX1ZFUklGWV9SRVEgPSAxLAotICBSUENfTE9DX05JX0VWRU5UX1NVUExfTk9USUZZX1ZFUklGWV9SRVEgPSAyLAotICBSUENfTE9DX05JX0VWRU5UX1VNVFNfQ1BfTk9USUZZX1ZFUklGWV9SRVEgPSAzLAotICBSUENfTE9DX05JX0VWRU5UX1ZYX1NFUlZJQ0VfSU5URVJBQ1RJT05fUkVRID0gNCwKLSAgUlBDX0xPQ19OSV9FVkVOVF9NQVggPSAyNjg0MzU0NTYKLX07Ci0KLWVudW0gcnBjX2xvY19uaV9kYXRhY29kaW5nX3NjaGVtZV9lX3R5cGUgewotICBSUENfTE9DX05JX1BSRVNVUExfSVNPNjQ2SVJWID0gMCwKLSAgUlBDX0xPQ19OSV9QUkVTVVBMX0lTTzg4NTkgPSAxLAotICBSUENfTE9DX05JX1BSRVNVUExfVVRGOCA9IDIsCi0gIFJQQ19MT0NfTklfUFJFU1VQTF9VVEYxNiA9IDMsCi0gIFJQQ19MT0NfTklfUFJFU1VQTF9VQ1MyID0gNCwKLSAgUlBDX0xPQ19OSV9QUkVTVVBMX0dTTV9ERUZBVUxUID0gNSwKLSAgUlBDX0xPQ19OSV9QUkVTVVBMX1NISUZUX0pJUyA9IDYsCi0gIFJQQ19MT0NfTklfUFJFU1VQTF9KSVMgPSA3LAotICBSUENfTE9DX05JX1BSRVNVUExfRVVDID0gOCwKLSAgUlBDX0xPQ19OSV9QUkVTVVBMX0dCMjMxMiA9IDksCi0gIFJQQ19MT0NfTklfUFJFU1VQTF9DTlMxMTY0MyA9IDEwLAotICBSUENfTE9DX05JX1BSRVNVUExfS1NDMTAwMSA9IDExLAotICBSUENfTE9DX05JX1BSRVNVUExfRU5DT0RJTkdfVU5LTk9XTiA9IDIxNDc0ODM2NDcsCi0gIFJQQ19MT0NfTklfU1NfR0VSTUFOID0gMTIsCi0gIFJQQ19MT0NfTklfU1NfRU5HTElTSCA9IDEzLAotICBSUENfTE9DX05JX1NTX0lUQUxJQU4gPSAxNCwKLSAgUlBDX0xPQ19OSV9TU19GUkVOQ0ggPSAxNSwKLSAgUlBDX0xPQ19OSV9TU19TUEFOSVNIID0gMTYsCi0gIFJQQ19MT0NfTklfU1NfRFVUQ0ggPSAxNywKLSAgUlBDX0xPQ19OSV9TU19TV0VESVNIID0gMTgsCi0gIFJQQ19MT0NfTklfU1NfREFOSVNIID0gMTksCi0gIFJQQ19MT0NfTklfU1NfUE9SVFVHVUVTRSA9IDIwLAotICBSUENfTE9DX05JX1NTX0ZJTk5JU0ggPSAyMSwKLSAgUlBDX0xPQ19OSV9TU19OT1JXRUdJQU4gPSAyMiwKLSAgUlBDX0xPQ19OSV9TU19HUkVFSyA9IDIzLAotICBSUENfTE9DX05JX1NTX1RVUktJU0ggPSAyNCwKLSAgUlBDX0xPQ19OSV9TU19IVU5HQVJJQU4gPSAyNSwKLSAgUlBDX0xPQ19OSV9TU19QT0xJU0ggPSAyNiwKLSAgUlBDX0xPQ19OSV9TU19MQU5HVUFHRV9VTlNQRUMgPSAyNywKLSAgUlBDX0xPQ19OSV9TVVBMX1VURjggPSAyOCwKLSAgUlBDX0xPQ19OSV9TVVBMX1VDUzIgPSAyOSwKLSAgUlBDX0xPQ19OSV9TVVBMX0dTTV9ERUZBVUxUID0gMzAsCi0gIFJQQ19MT0NfTklfU1VQTF9FTkNPRElOR19VTktOT1dOID0gMjE0NzQ4MzY0NwotfTsKLQotZW51bSBycGNfbG9jX25pX3Z4X3JlcXVlc3Rlcl9pZF9lbmNvZGluZ19zY2hlbWVfZV90eXBlIHsKLSAgUlBDX0xPQ19OSV9WWF9PQ1RFVCA9IDAsCi0gIFJQQ19MT0NfTklfVlhfRVhOX1BST1RPQ09MX01TRyA9IDEsCi0gIFJQQ19MT0NfTklfVlhfQVNDSUkgPSAyLAotICBSUENfTE9DX05JX1ZYX0lBNSA9IDMsCi0gIFJQQ19MT0NfTklfVlhfVU5JQ09ERSA9IDQsCi0gIFJQQ19MT0NfTklfVlhfU0hJRlRfSklTID0gNSwKLSAgUlBDX0xPQ19OSV9WWF9LT1JFQU4gPSA2LAotICBSUENfTE9DX05JX1ZYX0xBVElOX0hFQlJFVyA9IDcsCi0gIFJQQ19MT0NfTklfVlhfTEFUSU4gPSA4LAotICBSUENfTE9DX05JX1ZYX0dTTSA9IDksCi0gIFJQQ19MT0NfTklfVlhfRU5DT0RJTkdfVFlQRV9NQVggPSAyNjg0MzU0NTYKLX07Ci0KLWVudW0gcnBjX2xvY19uaV92eF9wb3NfbW9kZV9lX3R5cGUgewotICBSUENfTE9DX1ZYX01TX0FTU0lTVEVEX09OTFkgPSAxLAotICBSUENfTE9DX1ZYX01TX0JBU0VEX09OTFkgPSAyLAotICBSUENfTE9DX1ZYX01TX0FTU0lTVEVEX1BSRUZfTVNCQVNFRF9BTExXRCA9IDMsCi0gIFJQQ19MT0NfVlhfTVNfQkFTRURfUFJFRl9BU1NJU1RFRF9BTExXRCA9IDQsCi0gIFJQQ19MT0NfVlhfUE9TX01PREVfTUFYID0gMjY4NDM1NDU2Ci19OwotCi1zdHJ1Y3QgcnBjX2xvY19uaV92eF9yZXF1ZXN0ZXJfaWRfc190eXBlIHsKLSAgdW5zaWduZWQgY2hhciByZXF1ZXN0ZXJfaWRfbGVuZ3RoOwotICAgIG9wYXF1ZSByZXF1ZXN0ZXJfaWRbMjAwXTsgLyogRVZBTDpbMjAwXSovICAKLX07Ci0KLXN0cnVjdCBycGNfbG9jX25pX3Z4X25vdGlmeV92ZXJpZnlfcmVxX3NfdHlwZSB7Ci0gIHJwY19sb2Nfbmlfbm90aWZ5X3ZlcmlmeV9lX3R5cGUgbm90aWZpY2F0aW9uX3ByaXZfdHlwZTsKLSAgdW5zaWduZWQgY2hhciBwb3NfcW9zX2luY2w7Ci0gIHVuc2lnbmVkIGNoYXIgcG9zX3FvczsKLSAgcnBjX3VpbnQzMiBudW1fZml4ZXM7Ci0gIHJwY191aW50MzIgdGJmOwotICBycGNfbG9jX25pX3Z4X3Bvc19tb2RlX2VfdHlwZSBwb3NfbW9kZTsKLSAgcnBjX2xvY19uaV92eF9yZXF1ZXN0ZXJfaWRfZW5jb2Rpbmdfc2NoZW1lX2VfdHlwZSBlbmNvZGluZ19zY2hlbWU7Ci0gIHJwY19sb2NfbmlfdnhfcmVxdWVzdGVyX2lkX3NfdHlwZSByZXF1ZXN0ZXJfaWQ7Ci0gIHJwY191aW50MTYgdXNlcl9yZXNwX3RpbWVyX3ZhbDsKLX07Ci0KLWVudW0gcnBjX2xvY19uaV9zdXBsX3Bvc19tZXRob2RfZV90eXBlIHsKLSAgUlBDX0xPQ19OSV9QT1NNRVRIT0RfQUdQU19TRVRBU1NJU1RFRCA9IDEsCi0gIFJQQ19MT0NfTklfUE9TTUVUSE9EX0FHUFNfU0VUQkFTRUQgPSAyLAotICBSUENfTE9DX05JX1BPU01FVEhPRF9BR1BTX1NFVEFTU0lTVEVEX1BSRUYgPSAzLAotICBSUENfTE9DX05JX1BPU01FVEhPRF9BR1BTX1NFVEJBU0VEX1BSRUYgPSA0LAotICBSUENfTE9DX05JX1BPU01FVEhPRF9BVVRPTk9NT1VTX0dQUyA9IDUsCi0gIFJQQ19MT0NfTklfUE9TTUVUSE9EX0FGTFQgPSA2LAotICBSUENfTE9DX05JX1BPU01FVEhPRF9FQ0lEID0gNywKLSAgUlBDX0xPQ19OSV9QT1NNRVRIT0RfRU9URCA9IDgsCi0gIFJQQ19MT0NfTklfUE9TTUVUSE9EX09URE9BID0gOSwKLSAgUlBDX0xPQ19OSV9QT1NNRVRIT0RfTk9fUE9TSVRJT04gPSAxMCwKLSAgUlBDX0xPQ19OSV9QT1NNRVRIT0RfTUFYID0gMjY4NDM1NDU2Ci19OwotCi1zdHJ1Y3QgcnBjX2xvY19uaV9zdXBsX3NscF9zZXNzaW9uX2lkX3NfdHlwZSB7Ci0gIHVuc2lnbmVkIGNoYXIgcHJlc2VuY2U7Ci0gICAgb3BhcXVlIHNlc3Npb25faWRbNF07IC8qIEVWQUw6WzRdKi8gIAotICBycGNfbG9jX3NlcnZlcl9pbmZvX3NfdHlwZSBzbHBfYWRkcmVzczsKLX07Ci0KLXN0cnVjdCBycGNfbG9jX25pX3JlcXVlc3Rvcl9pZF9zX3R5cGUgewotICB1bnNpZ25lZCBjaGFyIGRhdGFfY29kaW5nX3NjaGVtZTsKLSAgICBvcGFxdWUgcmVxdWVzdG9yX2lkX3N0cmluZ1syMDBdOyAvKiBFVkFMOlsyMDBdKi8gIAotICB1bnNpZ25lZCBjaGFyIHN0cmluZ19sZW47Ci19OwotCi1zdHJ1Y3QgcnBjX2xvY19uaV9zdXBsX2NsaWVudF9uYW1lX3NfdHlwZSB7Ci0gIHVuc2lnbmVkIGNoYXIgZGF0YV9jb2Rpbmdfc2NoZW1lOwotICAgIG9wYXF1ZSBjbGllbnRfbmFtZV9zdHJpbmdbNjRdOyAvKiBFVkFMOls2NF0qLyAgCi0gIHVuc2lnbmVkIGNoYXIgc3RyaW5nX2xlbjsKLX07Ci0KLXN0cnVjdCBycGNfbG9jX25pX3N1cGxfcW9wX3NfdHlwZSB7Ci0gIHVuc2lnbmVkIGNoYXIgYml0X21hc2s7Ci0gIHVuc2lnbmVkIGNoYXIgaG9yYWNjOwotICB1bnNpZ25lZCBjaGFyIHZlcmFjYzsKLSAgcnBjX3VpbnQxNiBtYXhMb2NBZ2U7Ci0gIHVuc2lnbmVkIGNoYXIgZGVsYXk7Ci19OwotCi1zdHJ1Y3QgcnBjX2xvY19uaV9zdXBsX25vdGlmeV92ZXJpZnlfcmVxX3NfdHlwZSB7Ci0gIHJwY19sb2Nfbmlfbm90aWZ5X3ZlcmlmeV9lX3R5cGUgbm90aWZpY2F0aW9uX3ByaXZfdHlwZTsKLSAgcnBjX3VpbnQxNiBmbGFnczsKLSAgcnBjX2xvY19uaV9zdXBsX3NscF9zZXNzaW9uX2lkX3NfdHlwZSBzdXBsX3NscF9zZXNzaW9uX2lkOwotICAgIG9wYXF1ZSBzdXBsX2hhc2hbOF07IC8qIEVWQUw6WzhdKi8gIAotICBycGNfbG9jX25pX2RhdGFjb2Rpbmdfc2NoZW1lX2VfdHlwZSBkYXRhY29kaW5nX3NjaGVtZTsKLSAgcnBjX2xvY19uaV9zdXBsX3Bvc19tZXRob2RfZV90eXBlIHBvc19tZXRob2Q7Ci0gIHJwY19sb2NfbmlfcmVxdWVzdG9yX2lkX3NfdHlwZSByZXF1ZXN0b3JfaWQ7Ci0gIHJwY19sb2Nfbmlfc3VwbF9jbGllbnRfbmFtZV9zX3R5cGUgY2xpZW50X25hbWU7Ci0gIHJwY19sb2Nfbmlfc3VwbF9xb3Bfc190eXBlIHN1cGxfcW9wOwotICBycGNfdWludDE2IHVzZXJfcmVzcG9uc2VfdGltZXI7Ci19OwotCi1zdHJ1Y3QgcnBjX2xvY19uaV9leHRfY2xpZW50X2FkZHJlc3Nfc190eXBlIHsKLSAgdW5zaWduZWQgY2hhciBleHRfY2xpZW50X2FkZHJlc3NfbGVuOwotICAgIG9wYXF1ZSBleHRfY2xpZW50X2FkZHJlc3NbMjBdOyAvKiBFVkFMOlsyMF0qLyAgCi19OwotCi1lbnVtIHJwY19sb2NfbmlfbG9jYXRpb25fdHlwZV9lX3R5cGUgewotICBSUENfTE9DX05JX0xPQ0FUSU9OVFlQRV9DVVJSRU5UX0xPQ0FUSU9OID0gMSwKLSAgUlBDX0xPQ19OSV9MT0NBVElPTlRZUEVfQ1VSUkVOVF9PUl9MQVNUX0tOT1dOX0xPQ0FUSU9OID0gMiwKLSAgUlBDX0xPQ19OSV9MT0NBVElPTlRZUEVfSU5JVElBTF9MT0NBVElPTiA9IDMsCi0gIFJQQ19MT0NfTklfTE9DQVRJT05UWVBFX01BWCA9IDI2ODQzNTQ1NgotfTsKLQotc3RydWN0IHJwY19sb2NfbmlfZGVmZXJyZWRfbG9jYXRpb25fc190eXBlIHsKLSAgdW5zaWduZWQgY2hhciB1bnVzZWRfYml0czsKLSAgdW5zaWduZWQgY2hhciBtc19hdmFpbGFibGU7Ci19OwotCi1zdHJ1Y3QgcnBjX2xvY19uaV9jb2Rld29yZF9zdHJpbmdfc190eXBlIHsKLSAgdW5zaWduZWQgY2hhciBkYXRhX2NvZGluZ19zY2hlbWU7Ci0gICAgb3BhcXVlIGxjc19jb2Rld29yZF9zdHJpbmdbMjBdOyAvKiBFVkFMOlsyMF0qLyAgCi0gIHVuc2lnbmVkIGNoYXIgc3RyaW5nX2xlbjsKLX07Ci0KLXN0cnVjdCBycGNfbG9jX25pX3NlcnZpY2VfdHlwZV9pZF9zX3R5cGUgewotICB1bnNpZ25lZCBjaGFyIGxjc19zZXJ2aWNlX3R5cGVfaWQ7Ci19OwotCi1zdHJ1Y3QgcnBjX2xvY19uaV91bXRzX2NwX25vdGlmeV92ZXJpZnlfcmVxX3NfdHlwZSB7Ci0gIHJwY19sb2Nfbmlfbm90aWZ5X3ZlcmlmeV9lX3R5cGUgbm90aWZpY2F0aW9uX3ByaXZfdHlwZTsKLSAgdW5zaWduZWQgY2hhciBpbnZva2VfaWQ7Ci0gIHJwY191aW50MTYgZmxhZ3M7Ci0gIHVuc2lnbmVkIGNoYXIgbm90aWZpY2F0aW9uX2xlbmd0aDsKLSAgICBvcGFxdWUgbm90aWZpY2F0aW9uX3RleHRbNjRdOyAvKiBFVkFMOls2NF0qLyAgCi0gIHJwY19sb2NfbmlfZGF0YWNvZGluZ19zY2hlbWVfZV90eXBlIGRhdGFjb2Rpbmdfc2NoZW1lOwotICBycGNfbG9jX25pX2V4dF9jbGllbnRfYWRkcmVzc19zX3R5cGUgZXh0X2NsaWVudF9hZGRyZXNzX2RhdGE7Ci0gIHJwY19sb2NfbmlfbG9jYXRpb25fdHlwZV9lX3R5cGUgbG9jYXRpb25fdHlwZTsKLSAgcnBjX2xvY19uaV9kZWZlcnJlZF9sb2NhdGlvbl9zX3R5cGUgZGVmZXJyZWRfbG9jYXRpb247Ci0gIHJwY19sb2NfbmlfcmVxdWVzdG9yX2lkX3NfdHlwZSByZXF1ZXN0b3JfaWQ7Ci0gIHJwY19sb2NfbmlfY29kZXdvcmRfc3RyaW5nX3NfdHlwZSBjb2Rld29yZF9zdHJpbmc7Ci0gIHJwY19sb2Nfbmlfc2VydmljZV90eXBlX2lkX3NfdHlwZSBzZXJ2aWNlX3R5cGVfaWQ7Ci0gIHJwY191aW50MTYgdXNlcl9yZXNwb25zZV90aW1lcjsKLX07Ci0KLWVudW0gcnBjX2xvY19uaV9zZXJ2aWNlX2ludGVyYWN0aW9uX2VfdHlwZSB7Ci0gIFJQQ19MT0NfTklfU0VSVklDRV9JTlRFUkFDVElPTl9PTkdPSU5HX05JX0lOQ09NSU5HX01PID0gMSwKLSAgUlBDX0xPQ19OSV9TRVJWSUNFX0lOVEVSQUNUSU9OX01BWCA9IDI2ODQzNTQ1NgotfTsKLQotc3RydWN0IHJwY19sb2Nfbmlfdnhfc2VydmljZV9pbnRlcmFjdGlvbl9yZXFfc190eXBlIHsKLSAgcnBjX2xvY19uaV92eF9ub3RpZnlfdmVyaWZ5X3JlcV9zX3R5cGUgbmlfdnhfcmVxOwotICBycGNfbG9jX25pX3NlcnZpY2VfaW50ZXJhY3Rpb25fZV90eXBlIHNlcnZpY2VfaW50ZXJhdGlvbl90eXBlOwotfTsKLQotdW5pb24gcnBjX2xvY19uaV9ldmVudF9wYXlsb2FkX3VfdHlwZSBzd2l0Y2ggKHJwY19sb2NfbmlfZXZlbnRfZV90eXBlIGRpc2MpIHsKLSAgY2FzZSBSUENfTE9DX05JX0VWRU5UX1ZYX05PVElGWV9WRVJJRllfUkVROgotICAgIHJwY19sb2Nfbmlfdnhfbm90aWZ5X3ZlcmlmeV9yZXFfc190eXBlIHZ4X3JlcTsKLSAgY2FzZSBSUENfTE9DX05JX0VWRU5UX1NVUExfTk9USUZZX1ZFUklGWV9SRVE6Ci0gICAgcnBjX2xvY19uaV9zdXBsX25vdGlmeV92ZXJpZnlfcmVxX3NfdHlwZSBzdXBsX3JlcTsKLSAgY2FzZSBSUENfTE9DX05JX0VWRU5UX1VNVFNfQ1BfTk9USUZZX1ZFUklGWV9SRVE6Ci0gICAgcnBjX2xvY19uaV91bXRzX2NwX25vdGlmeV92ZXJpZnlfcmVxX3NfdHlwZSB1bXRzX2NwX3JlcTsKLSAgY2FzZSBSUENfTE9DX05JX0VWRU5UX1ZYX1NFUlZJQ0VfSU5URVJBQ1RJT05fUkVROgotICAgIHJwY19sb2Nfbmlfdnhfc2VydmljZV9pbnRlcmFjdGlvbl9yZXFfc190eXBlIHNlcnZpY2VfaW50ZXJhY3Rpb25fcmVxOwotICBkZWZhdWx0OgotICAgIHZvaWQ7Ci19OwotCi1zdHJ1Y3QgcnBjX2xvY19uaV9ldmVudF9zX3R5cGUgewotICBycGNfbG9jX25pX2V2ZW50X2VfdHlwZSBldmVudDsKLSAgcnBjX2xvY19uaV9ldmVudF9wYXlsb2FkX3VfdHlwZSBwYXlsb2FkOwotfTsKLQotZW51bSBycGNfbG9jX2Fzc2lzdF9kYXRhX3JlcXVlc3RfZV90eXBlIHsKLSAgUlBDX0xPQ19BU1NJU1RfREFUQV9USU1FX1JFUSA9IDEsCi0gIFJQQ19MT0NfQVNTSVNUX0RBVEFfUFJFRElDVEVEX09SQklUU19SRVEgPSAyLAotICBSUENfTE9DX0FTU0lTVF9EQVRBX01BWCA9IDI2ODQzNTQ1NgotfTsKLQotICB0eXBlZGVmIHN0cmluZyBycGNfc3RydWN0X2xvY190aW1lX2Rvd25sb2FkX3NvdXJjZV9zX3R5cGVfc2VydmVyc19wdHI8MjU2PjsgLyogRVZBTDpbTE9DX0FQSV9NQVhfU0VSVkVSX0FERFJfTEVOR1RIXSovICAKLQotICB0eXBlZGVmIHJwY19zdHJ1Y3RfbG9jX3RpbWVfZG93bmxvYWRfc291cmNlX3NfdHlwZV9zZXJ2ZXJzX3B0ciBycGNfc3RydWN0X2xvY190aW1lX2Rvd25sb2FkX3NvdXJjZV9zX3R5cGVfc2VydmVyc1szXTsgLyogRVZBTDpbM10qLyAgCi0KLXN0cnVjdCBycGNfbG9jX3RpbWVfZG93bmxvYWRfc291cmNlX3NfdHlwZSB7Ci0gIHJwY191aW50MzIgZGVsYXlfdGhyZXNob2xkOwotICBycGNfc3RydWN0X2xvY190aW1lX2Rvd25sb2FkX3NvdXJjZV9zX3R5cGVfc2VydmVycyBzZXJ2ZXJzOwotfTsKLQotICB0eXBlZGVmIHN0cmluZyBycGNfc3RydWN0X2xvY19wcmVkaWN0ZWRfb3JiaXRzX2RhdGFfc291cmNlX3NfdHlwZV9zZXJ2ZXJzX3B0cjwyNTY+OyAvKiBFVkFMOltMT0NfQVBJX01BWF9TRVJWRVJfQUREUl9MRU5HVEhdKi8gIAotCi0gIHR5cGVkZWYgcnBjX3N0cnVjdF9sb2NfcHJlZGljdGVkX29yYml0c19kYXRhX3NvdXJjZV9zX3R5cGVfc2VydmVyc19wdHIgcnBjX3N0cnVjdF9sb2NfcHJlZGljdGVkX29yYml0c19kYXRhX3NvdXJjZV9zX3R5cGVfc2VydmVyc1szXTsgLyogRVZBTDpbM10qLyAgCi0KLXN0cnVjdCBycGNfbG9jX3ByZWRpY3RlZF9vcmJpdHNfZGF0YV9zb3VyY2Vfc190eXBlIHsKLSAgcnBjX3VpbnQzMiBtYXhfZmlsZV9zaXplOwotICBycGNfdWludDMyIG1heF9wYXJ0X3NpemU7Ci0gIHJwY19zdHJ1Y3RfbG9jX3ByZWRpY3RlZF9vcmJpdHNfZGF0YV9zb3VyY2Vfc190eXBlX3NlcnZlcnMgc2VydmVyczsKLX07Ci0KLXVuaW9uIHJwY19sb2NfYXNzaXN0X2RhdGFfcmVxdWVzdF9wYXlsb2FkX3VfdHlwZSBzd2l0Y2ggKHJwY19sb2NfYXNzaXN0X2RhdGFfcmVxdWVzdF9lX3R5cGUgZGlzYykgewotICBjYXNlIFJQQ19MT0NfQVNTSVNUX0RBVEFfVElNRV9SRVE6Ci0gICAgcnBjX2xvY190aW1lX2Rvd25sb2FkX3NvdXJjZV9zX3R5cGUgdGltZV9kb3dubG9hZDsKLSAgY2FzZSBSUENfTE9DX0FTU0lTVF9EQVRBX1BSRURJQ1RFRF9PUkJJVFNfUkVROgotICAgIHJwY19sb2NfcHJlZGljdGVkX29yYml0c19kYXRhX3NvdXJjZV9zX3R5cGUgZGF0YV9kb3dubG9hZDsKLSAgZGVmYXVsdDoKLSAgICB2b2lkOwotfTsKLQotc3RydWN0IHJwY19sb2NfYXNzaXN0X2RhdGFfcmVxdWVzdF9zX3R5cGUgewotICBycGNfbG9jX2Fzc2lzdF9kYXRhX3JlcXVlc3RfZV90eXBlIGV2ZW50OwotICBycGNfbG9jX2Fzc2lzdF9kYXRhX3JlcXVlc3RfcGF5bG9hZF91X3R5cGUgcGF5bG9hZDsKLX07Ci0KLXR5cGVkZWYgcnBjX3VpbnQzMiBycGNfbG9jX3NlcnZlcl9jb25uZWN0aW9uX2hhbmRsZTsKLQotZW51bSBycGNfbG9jX3NlcnZlcl9wcm90b2NvbF9lX3R5cGUgewotICBSUENfTE9DX1NFUlZFUl9QUk9UT0NPTF9ERUZBVUxUID0gMCwKLSAgUlBDX0xPQ19TRVJWRVJfUFJPVE9DT0xfU1VQTCA9IDEsCi0gIFJQQ19MT0NfU0VSVkVSX1BST1RPQ09MX1ZYX01QQyA9IDIsCi0gIFJQQ19MT0NfU0VSVkVSX1BST1RPQ09MX1ZYX1BERSA9IDMsCi0gIFJQQ19MT0NfU0VSVkVSX1BST1RPQ09MX01BWCA9IDE2Nzc3MjE2Ci19OwotCi1lbnVtIHJwY19sb2Nfc2VydmVyX3JlcXVlc3RfZV90eXBlIHsKLSAgUlBDX0xPQ19TRVJWRVJfUkVRVUVTVF9PUEVOID0gMSwKLSAgUlBDX0xPQ19TRVJWRVJfUkVRVUVTVF9DTE9TRSA9IDIsCi0gIFJQQ19MT0NfU0VSVkVSX1JFUVVFU1RfTUFYID0gMjY4NDM1NDU2Ci19OwotCi1zdHJ1Y3QgcnBjX2xvY19zZXJ2ZXJfb3Blbl9yZXFfc190eXBlIHsKLSAgcnBjX2xvY19zZXJ2ZXJfY29ubmVjdGlvbl9oYW5kbGUgY29ubl9oYW5kbGU7Ci0gIHJwY19sb2Nfc2VydmVyX3Byb3RvY29sX2VfdHlwZSBwcm90b2NvbDsKLX07Ci0KLXN0cnVjdCBycGNfbG9jX3NlcnZlcl9jbG9zZV9yZXFfc190eXBlIHsKLSAgcnBjX2xvY19zZXJ2ZXJfY29ubmVjdGlvbl9oYW5kbGUgY29ubl9oYW5kbGU7Ci19OwotCi11bmlvbiBycGNfbG9jX3NlcnZlcl9yZXF1ZXN0X3VfdHlwZSBzd2l0Y2ggKHJwY19sb2Nfc2VydmVyX3JlcXVlc3RfZV90eXBlIGRpc2MpIHsKLSAgY2FzZSBSUENfTE9DX1NFUlZFUl9SRVFVRVNUX09QRU46Ci0gICAgcnBjX2xvY19zZXJ2ZXJfb3Blbl9yZXFfc190eXBlIG9wZW5fcmVxOwotICBjYXNlIFJQQ19MT0NfU0VSVkVSX1JFUVVFU1RfQ0xPU0U6Ci0gICAgcnBjX2xvY19zZXJ2ZXJfY2xvc2VfcmVxX3NfdHlwZSBjbG9zZV9yZXE7Ci0gIGRlZmF1bHQ6Ci0gICAgdm9pZDsKLX07Ci0KLXN0cnVjdCBycGNfbG9jX3NlcnZlcl9yZXF1ZXN0X3NfdHlwZSB7Ci0gIHJwY19sb2Nfc2VydmVyX3JlcXVlc3RfZV90eXBlIGV2ZW50OwotICBycGNfbG9jX3NlcnZlcl9yZXF1ZXN0X3VfdHlwZSBwYXlsb2FkOwotfTsKLQotZW51bSBycGNfbG9jX3F3aXBfcmVxdWVzdF9lX3R5cGUgewotICBSUENfTE9DX1FXSVBfU1RBUlRfUEVSSU9ESUNfSElfRlJFUV9GSVhFUyA9IDAsCi0gIFJQQ19MT0NfUVdJUF9TVEFSVF9QRVJJT0RJQ19LRUVQX1dBUk0sCi0gIFJQQ19MT0NfUVdJUF9TVE9QX1BFUklPRElDX0ZJWEVTLAotICBSUENfTE9DX1FXSVBfU1VTUEVORCwKLSAgUlBDX0xPQ19RV0lQX1JFUVVFU1RfTUFYID0gMjY4NDM1NDU2Ci19OwotCi1zdHJ1Y3QgcnBjX2xvY19xd2lwX3JlcXVlc3Rfc190eXBlIHsKLSAgcnBjX2xvY19xd2lwX3JlcXVlc3RfZV90eXBlIHJlcXVlc3RfdHlwZTsKLSAgcnBjX3VpbnQxNiB0YmZfbXM7Ci19OwotCi1zdHJ1Y3QgcnBjX2xvY19yZXNlcnZlZF9wYXlsb2FkX3NfdHlwZSB7Ci0gIHJwY191aW50MTYgZGF0YV9zaXplOwotICBvcGFxdWUgZGF0YTw+OwotfTsKLQotZW51bSBycGNfbG9jX2lvY3RsX2VfdHlwZSB7Ci0gIFJQQ19MT0NfSU9DVExfR0VUX0FQSV9WRVJTSU9OID0gMSwKLSAgUlBDX0xPQ19JT0NUTF9TRVRfRklYX0NSSVRFUklBID0gMiwKLSAgUlBDX0xPQ19JT0NUTF9HRVRfRklYX0NSSVRFUklBID0gMywKLSAgUlBDX0xPQ19JT0NUTF9TRVJWSUNFX1NUQVJUX0lOREVYID0gNDAwLAotICBSUENfTE9DX0lPQ1RMX0lORk9STV9OSV9VU0VSX1JFU1BPTlNFID0gNDAwLAotICBSUENfTE9DX0lPQ1RMX0lOSkVDVF9QUkVESUNURURfT1JCSVRTX0RBVEEgPSA0MDEsCi0gIFJQQ19MT0NfSU9DVExfUVVFUllfUFJFRElDVEVEX09SQklUU19EQVRBX1ZBTElESVRZID0gNDAyLAotICBSUENfTE9DX0lPQ1RMX1FVRVJZX1BSRURJQ1RFRF9PUkJJVFNfREFUQV9TT1VSQ0UgPSA0MDMsCi0gIFJQQ19MT0NfSU9DVExfU0VUX1BSRURJQ1RFRF9PUkJJVFNfREFUQV9BVVRPX0RPV05MT0FEID0gNDA0LAotICBSUENfTE9DX0lPQ1RMX0lOSkVDVF9VVENfVElNRSA9IDQwNSwKLSAgUlBDX0xPQ19JT0NUTF9JTkpFQ1RfUlRDX1ZBTFVFID0gNDA2LAotICBSUENfTE9DX0lPQ1RMX0lOSkVDVF9QT1NJVElPTiA9IDQwNywKLSAgUlBDX0xPQ19JT0NUTF9RVUVSWV9FTkdJTkVfU1RBVEUgPSA0MDgsCi0gIFJQQ19MT0NfSU9DVExfSU5GT1JNX1NFUlZFUl9PUEVOX1NUQVRVUyA9IDQwOSwKLSAgUlBDX0xPQ19JT0NUTF9JTkZPUk1fU0VSVkVSX0NMT1NFX1NUQVRVUyA9IDQxMCwKLSAgUlBDX0xPQ19JT0NUTF9TRU5EX1dJUEVSX1BPU0lUSU9OX1JFUE9SVCA9IDQxMSwKLSAgUlBDX0xPQ19JT0NUTF9OT1RJRllfV0lQRVJfU1RBVFVTID0gNDEyLAotICBSUENfTE9DX0lPQ1RMX0FDQ0VTU19FRlNfREFUQSA9IDQxMywKLSAgUlBDX0xPQ19JT0NUTF9OVl9TRVRUSU5HU19TVEFSVF9JTkRFWCA9IDgwMCwKLSAgUlBDX0xPQ19JT0NUTF9TRVRfRU5HSU5FX0xPQ0sgPSA4MDAsCi0gIFJQQ19MT0NfSU9DVExfR0VUX0VOR0lORV9MT0NLID0gODAxLAotICBSUENfTE9DX0lPQ1RMX1NFVF9TQkFTX0NPTkZJRyA9IDgwMiwKLSAgUlBDX0xPQ19JT0NUTF9HRVRfU0JBU19DT05GSUcgPSA4MDMsCi0gIFJQQ19MT0NfSU9DVExfU0VUX05NRUFfVFlQRVMgPSA4MDQsCi0gIFJQQ19MT0NfSU9DVExfR0VUX05NRUFfVFlQRVMgPSA4MDUsCi0gIFJQQ19MT0NfSU9DVExfU0VUX0NETUFfUERFX1NFUlZFUl9BRERSID0gODA2LAotICBSUENfTE9DX0lPQ1RMX0dFVF9DRE1BX1BERV9TRVJWRVJfQUREUiA9IDgwNywKLSAgUlBDX0xPQ19JT0NUTF9TRVRfQ0RNQV9NUENfU0VSVkVSX0FERFIgPSA4MDgsCi0gIFJQQ19MT0NfSU9DVExfR0VUX0NETUFfTVBDX1NFUlZFUl9BRERSID0gODA5LAotICBSUENfTE9DX0lPQ1RMX1NFVF9VTVRTX1NMUF9TRVJWRVJfQUREUiA9IDgxMCwKLSAgUlBDX0xPQ19JT0NUTF9HRVRfVU1UU19TTFBfU0VSVkVSX0FERFIgPSA4MTEsCi0gIFJQQ19MT0NfSU9DVExfU0VUX09OX0RFTUFORF9MUE0gPSA4MTIsCi0gIFJQQ19MT0NfSU9DVExfR0VUX09OX0RFTUFORF9MUE0gPSA4MTMsCi0gIFJQQ19MT0NfSU9DVExfUFJPUFJJRVRBUllfU1RBUlRfSU5ERVggPSAxMDAwLAotICBSUENfTE9DX0lPQ1RMX0RFTEVURV9BU1NJU1RfREFUQSA9IDEwMDAsCi0gIFJQQ19MT0NfSU9DVExfU0VUX0NVU1RPTV9QREVfU0VSVkVSX0FERFIgPSAxMDAxLAotICBSUENfTE9DX0lPQ1RMX0dFVF9DVVNUT01fUERFX1NFUlZFUl9BRERSID0gMTAwMiwKLSAgUlBDX0xPQ19JT0NUTF9USElSRF9QQVJUWV9TVEFSVF9JTkRFWCA9IDEwNzM3NDE4MjQKLX07Ci0KLXN0cnVjdCBycGNfbG9jX2FwaV92ZXJzaW9uX3NfdHlwZSB7Ci0gIHVuc2lnbmVkIGNoYXIgbWFqb3I7Ci0gIHVuc2lnbmVkIGNoYXIgbWlub3I7Ci19OwotCi1lbnVtIHJwY19sb2NfZml4X3JlY3VycmVuY2VfZV90eXBlIHsKLSAgUlBDX0xPQ19QRVJJT0RJQ19GSVggPSAxLAotICBSUENfTE9DX1NJTkdMRV9GSVggPSAyLAotICBSUENfTE9DX0ZJWF9TRVNTSU9OX1RZUEVfTUFYID0gMjY4NDM1NDU2Ci19OwotCi1lbnVtIHJwY19sb2Nfb3BlcmF0aW9uX21vZGVfZV90eXBlIHsKLSAgUlBDX0xPQ19PUEVSX01PREVfREVGQVVMVCA9IDEsCi0gIFJQQ19MT0NfT1BFUl9NT0RFX01TQiA9IDIsCi0gIFJQQ19MT0NfT1BFUl9NT0RFX01TQSA9IDMsCi0gIFJQQ19MT0NfT1BFUl9NT0RFX1NUQU5EQUxPTkUgPSA0LAotICBSUENfTE9DX09QRVJfTU9ERV9TUEVFRF9PUFRJTUFMID0gNSwKLSAgUlBDX0xPQ19PUEVSX01PREVfQUNDVVJBQ1lfT1BUSU1BTCA9IDYsCi0gIFJQQ19MT0NfT1BFUl9NT0RFX0RBVEFfT1BUSU1BTCA9IDcsCi0gIFJQQ19MT0NfT1BFUl9NT0RFX0NFTExfSUQgPSA4LAotICBSUENfTE9DX09QRVJfTU9ERV9NQVggPSAyNjg0MzU0NTYKLX07Ci0KLWVudW0gcnBjX2xvY19ub3RpZnlfZV90eXBlIHsKLSAgUlBDX0xPQ19OT1RJRllfT05fSU5URVJWQUwgPSAxLAotICBSUENfTE9DX05PVElGWV9PTl9ESVNUQU5DRSA9IDIsCi0gIFJQQ19MT0NfTk9USUZZX09OX0FOWSA9IDMsCi0gIFJQQ19MT0NfTk9USUZZX09OX0FMTCA9IDQsCi0gIFJQQ19MT0NfTk9USUZZX1RZUEVfTUFYID0gMjY4NDM1NDU2Ci19OwotCi1zdHJ1Y3QgcnBjX2xvY19maXhfY3JpdGVyaWFfc190eXBlIHsKLSAgcnBjX3VpbnQzMiB2YWxpZF9tYXNrOwotICBycGNfbG9jX2ZpeF9yZWN1cnJlbmNlX2VfdHlwZSByZWN1cnJlbmNlX3R5cGU7Ci0gIHJwY19sb2Nfb3BlcmF0aW9uX21vZGVfZV90eXBlIHByZWZlcnJlZF9vcGVyYXRpb25fbW9kZTsKLSAgcnBjX3VpbnQzMiBwcmVmZXJyZWRfYWNjdXJhY3k7Ci0gIHJwY191aW50MzIgcHJlZmVycmVkX3Jlc3BvbnNlX3RpbWU7Ci0gIHJwY19ib29sZWFuIGludGVybWVkaWF0ZV9wb3NfcmVwb3J0X2VuYWJsZWQ7Ci0gIHJwY19sb2Nfbm90aWZ5X2VfdHlwZSBub3RpZnlfdHlwZTsKLSAgcnBjX3VpbnQzMiBtaW5faW50ZXJ2YWw7Ci0gIGZsb2F0IG1pbl9kaXN0YW5jZTsKLSAgcnBjX3VpbnQzMiBtaW5fZGlzdF9zYW1wbGVfaW50ZXJ2YWw7Ci19OwotCi1lbnVtIHJwY19sb2NfbmlfdXNlcl9yZXNwX2VfdHlwZSB7Ci0gIFJQQ19MT0NfTklfTENTX05PVElGWV9WRVJJRllfQUNDRVBUID0gMSwKLSAgUlBDX0xPQ19OSV9MQ1NfTk9USUZZX1ZFUklGWV9ERU5ZID0gMiwKLSAgUlBDX0xPQ19OSV9MQ1NfTk9USUZZX1ZFUklGWV9OT1JFU1AgPSAzLAotICBSUENfTE9DX05JX0xDU19OT1RJRllfVkVSSUZZX01BWCA9IDI2ODQzNTQ1NgotfTsKLQotc3RydWN0IHJwY19sb2NfdXNlcl92ZXJpZnlfc190eXBlIHsKLSAgcnBjX2xvY19uaV91c2VyX3Jlc3BfZV90eXBlIHVzZXJfcmVzcDsKLSAgcnBjX2xvY19uaV9ldmVudF9zX3R5cGUgbmlfZXZlbnRfcGFzc19iYWNrOwotfTsKLQotZW51bSBycGNfbG9jX3ByZWRpY3RlZF9vcmJpdHNfZGF0YV9mb3JtYXRfZV90eXBlIHsKLSAgUlBDX0xPQ19QUkVESUNURURfT1JCSVRTX1hUUkEgPSAwLAotICBSUENfTE9DX1BSRURJQ1RFRF9PUkJJVFNfRk9STUFUX01BWCA9IDI2ODQzNTQ1NgotfTsKLQotc3RydWN0IHJwY19sb2NfcHJlZGljdGVkX29yYml0c19kYXRhX3NfdHlwZSB7Ci0gIHJwY19sb2NfcHJlZGljdGVkX29yYml0c19kYXRhX2Zvcm1hdF9lX3R5cGUgZm9ybWF0X3R5cGU7Ci0gIHJwY191aW50MzIgdG90YWxfc2l6ZTsKLSAgcnBjX3VpbnQ4IHRvdGFsX3BhcnRzOwotICBycGNfdWludDggcGFydDsKLSAgcnBjX3VpbnQxNiBwYXJ0X2xlbjsKLSAgb3BhcXVlIGRhdGFfcHRyPD47Ci19OwotCi1zdHJ1Y3QgcnBjX2xvY19wcmVkaWN0ZWRfb3JiaXRzX2RhdGFfdmFsaWRpdHlfcmVwb3J0X3NfdHlwZSB7Ci0gIHJwY191aW50NjQgc3RhcnRfdGltZV91dGM7Ci0gIHJwY191aW50MTYgdmFsaWRfZHVyYXRpb25faHJzOwotfTsKLQotc3RydWN0IHJwY19sb2NfcHJlZGljdGVkX29yYml0c19hdXRvX2Rvd25sb2FkX2NvbmZpZ19zX3R5cGUgewotICBycGNfYm9vbGVhbiBlbmFibGU7Ci0gIHVuc2lnbmVkIGNoYXIgYXV0b19jaGVja19ldmVyeV9ocnM7Ci19OwotCi1zdHJ1Y3QgcnBjX2xvY19hc3Npc3RfZGF0YV90aW1lX3NfdHlwZSB7Ci0gIHJwY191aW50NjQgdGltZV91dGM7Ci0gIHJwY191aW50MzIgdW5jZXJ0YWludHk7Ci19OwotCi10eXBlZGVmIHJwY191aW50NjQgcnBjX2xvY19hc3Npc3RfcG9zX3ZhbGlkX21hc2tfdHlwZTsKLQotc3RydWN0IHJwY19sb2NfYXNzaXN0X2RhdGFfcG9zX3NfdHlwZSB7Ci0gIHJwY19sb2NfYXNzaXN0X3Bvc192YWxpZF9tYXNrX3R5cGUgdmFsaWRfbWFzazsKLSAgcnBjX3VpbnQ2NCB0aW1lc3RhbXBfdXRjOwotICBkb3VibGUgbGF0aXR1ZGU7Ci0gIGRvdWJsZSBsb25naXR1ZGU7Ci0gIGZsb2F0IGFsdGl0dWRlX3dydF9lbGxpcHNvaWQ7Ci0gIGZsb2F0IGFsdGl0dWRlX3dydF9tZWFuX3NlYV9sZXZlbDsKLSAgZmxvYXQgaG9yX3VuY19jaXJjdWxhcjsKLSAgZmxvYXQgdmVydF91bmM7Ci0gIHVuc2lnbmVkIGNoYXIgY29uZmlkZW5jZV9ob3Jpem9udGFsOwotICB1bnNpZ25lZCBjaGFyIGNvbmZpZGVuY2VfdmVydGljYWw7Ci0gIHJwY19pbnQzMiB0aW1lc3RhbXBfYWdlOwotfTsKLQotZW51bSBycGNfbG9jX3NlcnZlcl9vcGVuX3N0YXR1c19lX3R5cGUgewotICBSUENfTE9DX1NFUlZFUl9PUEVOX1NVQ0NFU1MgPSAxLAotICBSUENfTE9DX1NFUlZFUl9PUEVOX0ZBSUwgPSAyLAotICBSUENfTE9DX1NFUlZFUl9PUEVOX1NUQVRVU19NQVggPSAyNjg0MzU0NTYKLX07Ci0KLXN0cnVjdCBycGNfbG9jX3NlcnZlcl9vcGVuX3N0YXR1c19zX3R5cGUgewotICBycGNfbG9jX3NlcnZlcl9jb25uZWN0aW9uX2hhbmRsZSBjb25uX2hhbmRsZTsKLSAgcnBjX2xvY19zZXJ2ZXJfb3Blbl9zdGF0dXNfZV90eXBlIG9wZW5fc3RhdHVzOwotICAgIG9wYXF1ZSBhcG5fbmFtZVsxMDBdOyAvKiBFVkFMOlsxMDBdKi8gIAotfTsKLQotZW51bSBycGNfbG9jX3NlcnZlcl9jbG9zZV9zdGF0dXNfZV90eXBlIHsKLSAgUlBDX0xPQ19TRVJWRVJfQ0xPU0VfU1VDQ0VTUyA9IDEsCi0gIFJQQ19MT0NfU0VSVkVSX0NMT1NFX0ZBSUwgPSAyLAotICBSUENfTE9DX1NFUlZFUl9DTE9TRV9TVEFUVVNfTUFYID0gMjY4NDM1NDU2Ci19OwotCi1zdHJ1Y3QgcnBjX2xvY19zZXJ2ZXJfY2xvc2Vfc3RhdHVzX3NfdHlwZSB7Ci0gIHJwY19sb2Nfc2VydmVyX2Nvbm5lY3Rpb25faGFuZGxlIGNvbm5faGFuZGxlOwotICBycGNfbG9jX3NlcnZlcl9jbG9zZV9zdGF0dXNfZV90eXBlIGNsb3NlX3N0YXR1czsKLX07Ci0KLXN0cnVjdCBycGNfbG9jX3dpcGVyX2ZpeF90aW1lX3NfdHlwZSB7Ci0gIHJwY191aW50MzIgc2xvd19jbG9ja19jb3VudDsKLX07Ci0KLXN0cnVjdCBycGNfbG9jX3dpcGVyX2ZpeF9wb3Nfc190eXBlIHsKLSAgcnBjX2ludDMyIGxhdDsKLSAgcnBjX2ludDMyIGxvbjsKLSAgcnBjX3VpbnQxNiBIRVBFOwotICBycGNfdWludDggbnVtX29mX2Fwc191c2VkOwotICBycGNfdWludDggZml4X2Vycm9yX2NvZGU7Ci19OwotCi1zdHJ1Y3QgcnBjX2xvY193aXBlcl9hcF9pbmZvX3NfdHlwZSB7Ci0gICAgb3BhcXVlIG1hY19hZGRyWzZdOyAvKiBFVkFMOls2XSovICAKLSAgcnBjX2ludDMyIHJzc2k7Ci0gIHJwY191aW50MTYgY2hhbm5lbDsKLSAgcnBjX3VpbnQ4IGFwX3F1YWxpZmllcjsKLX07Ci0KLXN0cnVjdCBycGNfbG9jX3dpcGVyX2FwX3NldF9zX3R5cGUgewotICBycGNfdWludDggbnVtX29mX2FwczsKLSAgICBycGNfbG9jX3dpcGVyX2FwX2luZm9fc190eXBlIGFwX2luZm9bNTBdOyAvKiBFVkFMOls1MF0qLyAgCi19OwotCi1zdHJ1Y3QgcnBjX2xvY193aXBlcl9wb3NpdGlvbl9yZXBvcnRfc190eXBlIHsKLSAgcnBjX3VpbnQ4IHdpcGVyX3ZhbGlkX2luZm9fZmxhZzsKLSAgcnBjX2xvY193aXBlcl9maXhfdGltZV9zX3R5cGUgd2lwZXJfZml4X3RpbWU7Ci0gIHJwY19sb2Nfd2lwZXJfZml4X3Bvc19zX3R5cGUgd2lwZXJfZml4X3Bvc2l0aW9uOwotICBycGNfbG9jX3dpcGVyX2FwX3NldF9zX3R5cGUgd2lwZXJfYXBfc2V0OwotfTsKLQotZW51bSBycGNfbG9jX3dpcGVyX3N0YXR1c19lX3R5cGUgewotICBSUENfTE9DX1dJUEVSX1NUQVRVU19BVkFJTEFCTEUgPSAxLAotICBSUENfTE9DX1dJUEVSX1NUQVRVU19VTkFWQUlMQUJMRSA9IDIsCi0gIFJQQ19MT0NfV0lQRVJfU1RBVFVTX0VfU0laRSA9IDI2ODQzNTQ1NgotfTsKLQotZW51bSBycGNfbG9jX2ZzX29wZXJhdGlvbl9lX3R5cGUgewotICBSUENfTE9DX0ZTX0NSRUFURV9XUklURV9GSUxFID0gMSwKLSAgUlBDX0xPQ19GU19BUFBFTkRfRklMRSA9IDIsCi0gIFJQQ19MT0NfRlNfREVMRVRFX0ZJTEUgPSAzLAotICBSUENfTE9DX0ZTX1JFQURfRklMRSA9IDQsCi0gIFJQQ19MT0NfRlNfTUFYID0gMjY4NDM1NDU2Ci19OwotCi1zdHJ1Y3QgcnBjX2xvY19lZnNfZGF0YV9zX3R5cGUgewotICAgIG9wYXF1ZSBmaWxlbmFtZVs2NF07IC8qIEVWQUw6WzY0XSovICAKLSAgcnBjX2xvY19mc19vcGVyYXRpb25fZV90eXBlIG9wZXJhdGlvbjsKLSAgcnBjX3VpbnQzMiB0b3RhbF9zaXplOwotICBvcGFxdWUgZGF0YV9wdHI8PjsKLSAgcnBjX3VpbnQzMiBwYXJ0X2xlbjsKLSAgcnBjX3VpbnQ4IHBhcnQ7Ci0gIHJwY191aW50OCB0b3RhbF9wYXJ0czsKLSAgcnBjX3VpbnQzMiByZXNlcnZlZDsKLX07Ci0KLWVudW0gcnBjX2xvY19sb2NrX2VfdHlwZSB7Ci0gIFJQQ19MT0NfTE9DS19OT05FID0gMSwKLSAgUlBDX0xPQ19MT0NLX01JID0gMiwKLSAgUlBDX0xPQ19MT0NLX01UID0gMywKLSAgUlBDX0xPQ19MT0NLX0FMTCA9IDQsCi0gIFJQQ19MT0NfTE9DS19NQVggPSAyNjg0MzU0NTYKLX07Ci0KLXR5cGVkZWYgcnBjX3VpbnQzMiBycGNfbG9jX25tZWFfc2VudGVuY2VfdHlwZTsKLQotdHlwZWRlZiBycGNfdWludDMyIHJwY19sb2NfYXNzaXN0X2RhdGFfdHlwZTsKLQotc3RydWN0IHJwY19sb2NfYXNzaXN0X2RhdGFfZGVsZXRlX3NfdHlwZSB7Ci0gIHJwY19sb2NfYXNzaXN0X2RhdGFfdHlwZSB0eXBlOwotICAgIHJwY191aW50MzIgcmVzZXJ2ZWRbOF07IC8qIEVWQUw6WzhdKi8gIAotfTsKLQotdW5pb24gcnBjX2xvY19pb2N0bF9kYXRhX3VfdHlwZSBzd2l0Y2ggKHJwY19sb2NfaW9jdGxfZV90eXBlIGRpc2MpIHsKLSAgY2FzZSBSUENfTE9DX0lPQ1RMX1NFVF9GSVhfQ1JJVEVSSUE6Ci0gICAgcnBjX2xvY19maXhfY3JpdGVyaWFfc190eXBlIGZpeF9jcml0ZXJpYTsKLSAgY2FzZSBSUENfTE9DX0lPQ1RMX0lORk9STV9OSV9VU0VSX1JFU1BPTlNFOgotICAgIHJwY19sb2NfdXNlcl92ZXJpZnlfc190eXBlIHVzZXJfdmVyaWZ5X3Jlc3A7Ci0gIGNhc2UgUlBDX0xPQ19JT0NUTF9JTkpFQ1RfUFJFRElDVEVEX09SQklUU19EQVRBOgotICAgIHJwY19sb2NfcHJlZGljdGVkX29yYml0c19kYXRhX3NfdHlwZSBwcmVkaWN0ZWRfb3JiaXRzX2RhdGE7Ci0gIGNhc2UgUlBDX0xPQ19JT0NUTF9TRVRfUFJFRElDVEVEX09SQklUU19EQVRBX0FVVE9fRE9XTkxPQUQ6Ci0gICAgcnBjX2xvY19wcmVkaWN0ZWRfb3JiaXRzX2F1dG9fZG93bmxvYWRfY29uZmlnX3NfdHlwZSBwcmVkaWN0ZWRfb3JiaXRzX2F1dG9fZG93bmxvYWQ7Ci0gIGNhc2UgUlBDX0xPQ19JT0NUTF9JTkpFQ1RfVVRDX1RJTUU6Ci0gICAgcnBjX2xvY19hc3Npc3RfZGF0YV90aW1lX3NfdHlwZSBhc3Npc3RhbmNlX2RhdGFfdGltZTsKLSAgY2FzZSBSUENfTE9DX0lPQ1RMX0lOSkVDVF9QT1NJVElPTjoKLSAgICBycGNfbG9jX2Fzc2lzdF9kYXRhX3Bvc19zX3R5cGUgYXNzaXN0YW5jZV9kYXRhX3Bvc2l0aW9uOwotICBjYXNlIFJQQ19MT0NfSU9DVExfSU5GT1JNX1NFUlZFUl9PUEVOX1NUQVRVUzoKLSAgICBycGNfbG9jX3NlcnZlcl9vcGVuX3N0YXR1c19zX3R5cGUgY29ubl9vcGVuX3N0YXR1czsKLSAgY2FzZSBSUENfTE9DX0lPQ1RMX0lORk9STV9TRVJWRVJfQ0xPU0VfU1RBVFVTOgotICAgIHJwY19sb2Nfc2VydmVyX2Nsb3NlX3N0YXR1c19zX3R5cGUgY29ubl9jbG9zZV9zdGF0dXM7Ci0gIGNhc2UgUlBDX0xPQ19JT0NUTF9TRU5EX1dJUEVSX1BPU0lUSU9OX1JFUE9SVDoKLSAgICBycGNfbG9jX3dpcGVyX3Bvc2l0aW9uX3JlcG9ydF9zX3R5cGUgd2lwZXJfcG9zOwotICBjYXNlIFJQQ19MT0NfSU9DVExfTk9USUZZX1dJUEVSX1NUQVRVUzoKLSAgICBycGNfbG9jX3dpcGVyX3N0YXR1c19lX3R5cGUgd2lwZXJfc3RhdHVzOwotICBjYXNlIFJQQ19MT0NfSU9DVExfU0VUX0VOR0lORV9MT0NLOgotICAgIHJwY19sb2NfbG9ja19lX3R5cGUgZW5naW5lX2xvY2s7Ci0gIGNhc2UgUlBDX0xPQ19JT0NUTF9TRVRfU0JBU19DT05GSUc6Ci0gICAgcnBjX2Jvb2xlYW4gc2Jhc19tb2RlOwotICBjYXNlIFJQQ19MT0NfSU9DVExfU0VUX05NRUFfVFlQRVM6Ci0gICAgcnBjX2xvY19ubWVhX3NlbnRlbmNlX3R5cGUgbm1lYV90eXBlczsKLSAgY2FzZSBSUENfTE9DX0lPQ1RMX1NFVF9PTl9ERU1BTkRfTFBNOgotICAgIHJwY19ib29sZWFuIG9uX2RlbWFuZF9scG07Ci0gIGNhc2UgIFJQQ19MT0NfSU9DVExfU0VUX0NETUFfUERFX1NFUlZFUl9BRERSOgotICBjYXNlICBSUENfTE9DX0lPQ1RMX1NFVF9DRE1BX01QQ19TRVJWRVJfQUREUjoKLSAgY2FzZSAgUlBDX0xPQ19JT0NUTF9TRVRfVU1UU19TTFBfU0VSVkVSX0FERFI6Ci0gIGNhc2UgIFJQQ19MT0NfSU9DVExfU0VUX0NVU1RPTV9QREVfU0VSVkVSX0FERFI6Ci0gICAgcnBjX2xvY19zZXJ2ZXJfaW5mb19zX3R5cGUgc2VydmVyX2FkZHI7Ci0gIGNhc2UgUlBDX0xPQ19JT0NUTF9ERUxFVEVfQVNTSVNUX0RBVEE6Ci0gICAgcnBjX2xvY19hc3Npc3RfZGF0YV9kZWxldGVfc190eXBlIGFzc2lzdF9kYXRhX2RlbGV0ZTsKLSAgY2FzZSBSUENfTE9DX0lPQ1RMX0FDQ0VTU19FRlNfREFUQToKLSAgICBycGNfbG9jX2Vmc19kYXRhX3NfdHlwZSBlZnNfZGF0YTsKLSAgZGVmYXVsdDoKLSAgICB2b2lkOwotfTsKLQotdW5pb24gcnBjX2xvY19pb2N0bF9jYWxsYmFja19kYXRhX3VfdHlwZSBzd2l0Y2ggKHJwY19sb2NfaW9jdGxfZV90eXBlIGRpc2MpIHsKLSAgY2FzZSBSUENfTE9DX0lPQ1RMX0dFVF9BUElfVkVSU0lPTjoKLSAgICBycGNfbG9jX2FwaV92ZXJzaW9uX3NfdHlwZSBhcGlfdmVyc2lvbjsKLSAgY2FzZSBSUENfTE9DX0lPQ1RMX0dFVF9GSVhfQ1JJVEVSSUE6Ci0gICAgcnBjX2xvY19maXhfY3JpdGVyaWFfc190eXBlIGZpeF9jcml0ZXJpYTsKLSAgY2FzZSBSUENfTE9DX0lPQ1RMX0dFVF9FTkdJTkVfTE9DSzoKLSAgICBycGNfbG9jX2xvY2tfZV90eXBlIGVuZ2luZV9sb2NrOwotICBjYXNlIFJQQ19MT0NfSU9DVExfR0VUX1NCQVNfQ09ORklHOgotICAgIHJwY19ib29sZWFuIHNiYXNfbW9kZTsKLSAgY2FzZSBSUENfTE9DX0lPQ1RMX0dFVF9OTUVBX1RZUEVTOgotICAgIHJwY19sb2Nfbm1lYV9zZW50ZW5jZV90eXBlIG5tZWFfdHlwZXM7Ci0gIGNhc2UgUlBDX0xPQ19JT0NUTF9HRVRfT05fREVNQU5EX0xQTToKLSAgICBycGNfYm9vbGVhbiBvbl9kZW1hbmRfbHBtOwotICBjYXNlICBSUENfTE9DX0lPQ1RMX0dFVF9DRE1BX1BERV9TRVJWRVJfQUREUjoKLSAgY2FzZSAgUlBDX0xPQ19JT0NUTF9HRVRfQ0RNQV9NUENfU0VSVkVSX0FERFI6Ci0gIGNhc2UgIFJQQ19MT0NfSU9DVExfR0VUX1VNVFNfU0xQX1NFUlZFUl9BRERSOgotICBjYXNlICBSUENfTE9DX0lPQ1RMX0dFVF9DVVNUT01fUERFX1NFUlZFUl9BRERSOgotICAgIHJwY19sb2Nfc2VydmVyX2luZm9fc190eXBlIHNlcnZlcl9hZGRyOwotICBjYXNlIFJQQ19MT0NfSU9DVExfUVVFUllfUFJFRElDVEVEX09SQklUU19EQVRBX1NPVVJDRToKLSAgICBycGNfbG9jX3ByZWRpY3RlZF9vcmJpdHNfZGF0YV9zb3VyY2Vfc190eXBlIHByZWRpY3RlZF9vcmJpdHNfZGF0YV9zb3VyY2U7Ci0gIGNhc2UgUlBDX0xPQ19JT0NUTF9RVUVSWV9QUkVESUNURURfT1JCSVRTX0RBVEFfVkFMSURJVFk6Ci0gICAgcnBjX2xvY19wcmVkaWN0ZWRfb3JiaXRzX2RhdGFfdmFsaWRpdHlfcmVwb3J0X3NfdHlwZSBwcmVkaWN0ZWRfb3JiaXRzX2RhdGFfdmFsaWRpdHk7Ci0gIGRlZmF1bHQ6Ci0gICAgdm9pZDsKLX07Ci0KLXN0cnVjdCBycGNfbG9jX2lvY3RsX2NhbGxiYWNrX3NfdHlwZSB7Ci0gIHJwY19sb2NfaW9jdGxfZV90eXBlIHR5cGU7Ci0gIHJwY19pbnQzMiBzdGF0dXM7Ci0gIHJwY19sb2NfaW9jdGxfY2FsbGJhY2tfZGF0YV91X3R5cGUgZGF0YTsKLX07Ci0KLXVuaW9uIHJwY19sb2NfZXZlbnRfcGF5bG9hZF91X3R5cGUgc3dpdGNoICh1bnNpZ25lZCBoeXBlciBkaXNjKSB7Ci0gIGNhc2UgUlBDX0xPQ19FVkVOVF9QQVJTRURfUE9TSVRJT05fUkVQT1JUOgotICAgIHJwY19sb2NfcGFyc2VkX3Bvc2l0aW9uX3NfdHlwZSBwYXJzZWRfbG9jYXRpb25fcmVwb3J0OwotICBjYXNlIFJQQ19MT0NfRVZFTlRfU0FURUxMSVRFX1JFUE9SVDoKLSAgICBycGNfbG9jX2duc3NfaW5mb19zX3R5cGUgZ25zc19yZXBvcnQ7Ci0gIGNhc2UgUlBDX0xPQ19FVkVOVF9OTUVBX1BPU0lUSU9OX1JFUE9SVDoKLSAgICBycGNfbG9jX25tZWFfcmVwb3J0X3NfdHlwZSBubWVhX3JlcG9ydDsKLSAgY2FzZSBSUENfTE9DX0VWRU5UX05JX05PVElGWV9WRVJJRllfUkVRVUVTVDoKLSAgICBycGNfbG9jX25pX2V2ZW50X3NfdHlwZSBuaV9yZXF1ZXN0OwotICBjYXNlIFJQQ19MT0NfRVZFTlRfQVNTSVNUQU5DRV9EQVRBX1JFUVVFU1Q6Ci0gICAgcnBjX2xvY19hc3Npc3RfZGF0YV9yZXF1ZXN0X3NfdHlwZSBhc3Npc3RfZGF0YV9yZXF1ZXN0OwotICBjYXNlIFJQQ19MT0NfRVZFTlRfTE9DQVRJT05fU0VSVkVSX1JFUVVFU1Q6Ci0gICAgcnBjX2xvY19zZXJ2ZXJfcmVxdWVzdF9zX3R5cGUgbG9jX3NlcnZlcl9yZXF1ZXN0OwotICBjYXNlIFJQQ19MT0NfRVZFTlRfSU9DVExfUkVQT1JUOgotICAgIHJwY19sb2NfaW9jdGxfY2FsbGJhY2tfc190eXBlIGlvY3RsX3JlcG9ydDsKLSAgY2FzZSBSUENfTE9DX0VWRU5UX1NUQVRVU19SRVBPUlQ6Ci0gICAgcnBjX2xvY19zdGF0dXNfZXZlbnRfc190eXBlIHN0YXR1c19yZXBvcnQ7Ci0gIGNhc2UgUlBDX0xPQ19FVkVOVF9XUFNfTkVFREVEX1JFUVVFU1Q6Ci0gICAgcnBjX2xvY19xd2lwX3JlcXVlc3Rfc190eXBlIHF3aXBfcmVxdWVzdDsKLSAgY2FzZSBSUENfTE9DX0VWRU5UX1JFU0VSVkVEOgotICAgIHJwY19sb2NfcmVzZXJ2ZWRfcGF5bG9hZF9zX3R5cGUgcmVzZXJ2ZWQ7Ci0gIGRlZmF1bHQ6Ci0gICAgdm9pZDsKLX07Ci0KZGlmZiAtLWdpdCBhL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpLXJwYy9nZW4tMTI0MC9sb2NfYXBpX2NvbW1vbl94ZHIuYyBiL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpLXJwYy9nZW4tMTI0MC9sb2NfYXBpX2NvbW1vbl94ZHIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M4NjBiZi4uMDAwMDAwMAotLS0gYS9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaS1ycGMvZ2VuLTEyNDAvbG9jX2FwaV9jb21tb25feGRyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUwICswLDAgQEAKLS8qCi0gKiBQbGVhc2UgZG8gbm90IGVkaXQgdGhpcyBmaWxlLgotICogSXQgd2FzIGdlbmVyYXRlZCB1c2luZyBycGNnZW4uCi0gKi8KLQotI2luY2x1ZGUgImxvY19hcGlfY29tbW9uLmgiCi0KLWJvb2xfdAoteGRyX3JwY19ib29sZWFuIChYRFIgKnhkcnMsIHJwY19ib29sZWFuICpvYmpwKQotewotCXJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotCSBpZiAoIXhkcl9ib29sICh4ZHJzLCBvYmpwKSkKLQkJIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX3VpbnQzMiAoWERSICp4ZHJzLCBycGNfdWludDMyICpvYmpwKQotewotCXJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotCSBpZiAoIXhkcl91X2xvbmcgKHhkcnMsIG9ianApKQotCQkgcmV0dXJuIEZBTFNFOwotCXJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfdWludDE2IChYRFIgKnhkcnMsIHJwY191aW50MTYgKm9ianApCi17Ci0JcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0JIGlmICgheGRyX3Vfc2hvcnQgKHhkcnMsIG9ianApKQotCQkgcmV0dXJuIEZBTFNFOwotCXJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfdWludDggKFhEUiAqeGRycywgcnBjX3VpbnQ4ICpvYmpwKQotewotCXJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotCSBpZiAoIXhkcl91X2NoYXIgKHhkcnMsIG9ianApKQotCQkgcmV0dXJuIEZBTFNFOwotCXJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfaW50MzIgKFhEUiAqeGRycywgcnBjX2ludDMyICpvYmpwKQotewotCXJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotCSBpZiAoIXhkcl9sb25nICh4ZHJzLCBvYmpwKSkKLQkJIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2J5dGUgKFhEUiAqeGRycywgcnBjX2J5dGUgKm9ianApCi17Ci0JcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0JIGlmICgheGRyX3VfY2hhciAoeGRycywgb2JqcCkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY191aW50NjQgKFhEUiAqeGRycywgcnBjX3VpbnQ2NCAqb2JqcCkKLXsKLQlyZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLQkgaWYgKCF4ZHJfdV9xdWFkX3QgKHhkcnMsIG9ianApKQotCQkgcmV0dXJuIEZBTFNFOwotCXJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfbG9jX2NsaWVudF9oYW5kbGVfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX2NsaWVudF9oYW5kbGVfdHlwZSAqb2JqcCkKLXsKLQlyZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLQkgaWYgKCF4ZHJfcnBjX2ludDMyICh4ZHJzLCBvYmpwKSkKLQkJIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19ldmVudF9tYXNrX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19ldmVudF9tYXNrX3R5cGUgKm9ianApCi17Ci0JcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0JIGlmICgheGRyX3JwY191aW50NjQgKHhkcnMsIG9ianApKQotCQkgcmV0dXJuIEZBTFNFOwotCXJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfbG9jX3Bvc2l0aW9uX3ZhbGlkX21hc2tfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX3Bvc2l0aW9uX3ZhbGlkX21hc2tfdHlwZSAqb2JqcCkKLXsKLQlyZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLQkgaWYgKCF4ZHJfcnBjX3VpbnQ2NCAoeGRycywgb2JqcCkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2NfcG9zX3RlY2hub2xvZ3lfbWFza190eXBlIChYRFIgKnhkcnMsIHJwY19sb2NfcG9zX3RlY2hub2xvZ3lfbWFza190eXBlICpvYmpwKQotewotCXJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotCSBpZiAoIXhkcl9ycGNfdWludDMyICh4ZHJzLCBvYmpwKSkKLQkJIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19zZXNzaW9uX3N0YXR1c19lX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19zZXNzaW9uX3N0YXR1c19lX3R5cGUgKm9ianApCi17Ci0JcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0JIGlmICgheGRyX2VudW0gKHhkcnMsIChlbnVtX3QgKikgb2JqcCkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2NfY2FsZW5kYXJfdGltZV9zX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19jYWxlbmRhcl90aW1lX3NfdHlwZSAqb2JqcCkKLXsKLQlyZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLQkgaWYgKCF4ZHJfcnBjX3VpbnQxNiAoeGRycywgJm9ianAtPnllYXIpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl91X2NoYXIgKHhkcnMsICZvYmpwLT5tb250aCkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX3VfY2hhciAoeGRycywgJm9ianAtPmRheV9vZl93ZWVrKSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfdV9jaGFyICh4ZHJzLCAmb2JqcC0+ZGF5KSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfdV9jaGFyICh4ZHJzLCAmb2JqcC0+aG91cikpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX3VfY2hhciAoeGRycywgJm9ianAtPm1pbnV0ZSkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX3VfY2hhciAoeGRycywgJm9ianAtPnNlY29uZCkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX3JwY191aW50MTYgKHhkcnMsICZvYmpwLT5taWxsaXNlY29uZCkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2NfcGFyc2VkX3Bvc2l0aW9uX3NfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX3BhcnNlZF9wb3NpdGlvbl9zX3R5cGUgKm9ianApCi17Ci0JcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0JIGlmICgheGRyX3JwY19sb2NfcG9zaXRpb25fdmFsaWRfbWFza190eXBlICh4ZHJzLCAmb2JqcC0+dmFsaWRfbWFzaykpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX3JwY19sb2Nfc2Vzc2lvbl9zdGF0dXNfZV90eXBlICh4ZHJzLCAmb2JqcC0+c2Vzc2lvbl9zdGF0dXMpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9ycGNfbG9jX2NhbGVuZGFyX3RpbWVfc190eXBlICh4ZHJzLCAmb2JqcC0+dGltZXN0YW1wX2NhbGVuZGFyKSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfcnBjX3VpbnQ2NCAoeGRycywgJm9ianAtPnRpbWVzdGFtcF91dGMpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9ycGNfdWludDggKHhkcnMsICZvYmpwLT5sZWFwX3NlY29uZHMpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9mbG9hdCAoeGRycywgJm9ianAtPnRpbWVfdW5jKSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfZG91YmxlICh4ZHJzLCAmb2JqcC0+bGF0aXR1ZGUpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9kb3VibGUgKHhkcnMsICZvYmpwLT5sb25naXR1ZGUpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9mbG9hdCAoeGRycywgJm9ianAtPmFsdGl0dWRlX3dydF9lbGxpcHNvaWQpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9mbG9hdCAoeGRycywgJm9ianAtPmFsdGl0dWRlX3dydF9tZWFuX3NlYV9sZXZlbCkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX2Zsb2F0ICh4ZHJzLCAmb2JqcC0+c3BlZWRfaG9yaXpvbnRhbCkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX2Zsb2F0ICh4ZHJzLCAmb2JqcC0+c3BlZWRfdmVydGljYWwpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9mbG9hdCAoeGRycywgJm9ianAtPmhlYWRpbmcpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9mbG9hdCAoeGRycywgJm9ianAtPmhvcl91bmNfY2lyY3VsYXIpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9mbG9hdCAoeGRycywgJm9ianAtPmhvcl91bmNfZWxsaXBzZV9zZW1pX21ham9yKSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfZmxvYXQgKHhkcnMsICZvYmpwLT5ob3JfdW5jX2VsbGlwc2Vfc2VtaV9taW5vcikpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX2Zsb2F0ICh4ZHJzLCAmb2JqcC0+aG9yX3VuY19lbGxpcHNlX29yaWVudF9hemltdXRoKSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfZmxvYXQgKHhkcnMsICZvYmpwLT52ZXJ0X3VuYykpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX2Zsb2F0ICh4ZHJzLCAmb2JqcC0+c3BlZWRfdW5jKSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfZmxvYXQgKHhkcnMsICZvYmpwLT5oZWFkaW5nX3VuYykpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX3VfY2hhciAoeGRycywgJm9ianAtPmNvbmZpZGVuY2VfaG9yaXpvbnRhbCkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX3VfY2hhciAoeGRycywgJm9ianAtPmNvbmZpZGVuY2VfdmVydGljYWwpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9mbG9hdCAoeGRycywgJm9ianAtPm1hZ25ldGljX2RldmlhdGlvbikpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX3JwY19sb2NfcG9zX3RlY2hub2xvZ3lfbWFza190eXBlICh4ZHJzLCAmb2JqcC0+dGVjaG5vbG9neV9tYXNrKSkKLQkJIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19zdl9zeXN0ZW1fZV90eXBlIChYRFIgKnhkcnMsIHJwY19sb2Nfc3Zfc3lzdGVtX2VfdHlwZSAqb2JqcCkKLXsKLQlyZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLQkgaWYgKCF4ZHJfZW51bSAoeGRycywgKGVudW1fdCAqKSBvYmpwKSkKLQkJIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19zdl9zdGF0dXNfZV90eXBlIChYRFIgKnhkcnMsIHJwY19sb2Nfc3Zfc3RhdHVzX2VfdHlwZSAqb2JqcCkKLXsKLQlyZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLQkgaWYgKCF4ZHJfZW51bSAoeGRycywgKGVudW1fdCAqKSBvYmpwKSkKLQkJIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19zdl9pbmZvX3ZhbGlkX21hc2tfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX3N2X2luZm9fdmFsaWRfbWFza190eXBlICpvYmpwKQotewotCXJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotCSBpZiAoIXhkcl9ycGNfdWludDMyICh4ZHJzLCBvYmpwKSkKLQkJIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19zdl9pbmZvX3NfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX3N2X2luZm9fc190eXBlICpvYmpwKQotewotCXJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotCSBpZiAoIXhkcl9ycGNfbG9jX3N2X2luZm9fdmFsaWRfbWFza190eXBlICh4ZHJzLCAmb2JqcC0+dmFsaWRfbWFzaykpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX3JwY19sb2Nfc3Zfc3lzdGVtX2VfdHlwZSAoeGRycywgJm9ianAtPnN5c3RlbSkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX3JwY191aW50OCAoeGRycywgJm9ianAtPnBybikpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX3JwY191aW50OCAoeGRycywgJm9ianAtPmhlYWx0aF9zdGF0dXMpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9ycGNfbG9jX3N2X3N0YXR1c19lX3R5cGUgKHhkcnMsICZvYmpwLT5wcm9jZXNzX3N0YXR1cykpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX3JwY19ib29sZWFuICh4ZHJzLCAmb2JqcC0+aGFzX2VwaCkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX3JwY19ib29sZWFuICh4ZHJzLCAmb2JqcC0+aGFzX2FsbSkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX2Zsb2F0ICh4ZHJzLCAmb2JqcC0+ZWxldmF0aW9uKSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfZmxvYXQgKHhkcnMsICZvYmpwLT5hemltdXRoKSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfZmxvYXQgKHhkcnMsICZvYmpwLT5zbnIpKQotCQkgcmV0dXJuIEZBTFNFOwotCXJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfbG9jX2duc3NfaW5mb192YWxpZF9tYXNrX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19nbnNzX2luZm9fdmFsaWRfbWFza190eXBlICpvYmpwKQotewotCXJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotCSBpZiAoIXhkcl9ycGNfdWludDMyICh4ZHJzLCBvYmpwKSkKLQkJIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19nbnNzX2luZm9fc190eXBlIChYRFIgKnhkcnMsIHJwY19sb2NfZ25zc19pbmZvX3NfdHlwZSAqb2JqcCkKLXsKLQlyZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLQkgaWYgKCF4ZHJfcnBjX2xvY19nbnNzX2luZm9fdmFsaWRfbWFza190eXBlICh4ZHJzLCAmb2JqcC0+dmFsaWRfbWFzaykpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX2Zsb2F0ICh4ZHJzLCAmb2JqcC0+cG9zaXRpb25fZG9wKSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfZmxvYXQgKHhkcnMsICZvYmpwLT5ob3Jpem9udGFsX2RvcCkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX2Zsb2F0ICh4ZHJzLCAmb2JqcC0+dmVydGljYWxfZG9wKSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfcnBjX2Jvb2xlYW4gKHhkcnMsICZvYmpwLT5hbHRpdHVkZV9hc3N1bWVkKSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfcnBjX3VpbnQxNiAoeGRycywgJm9ianAtPnN2X2NvdW50KSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfYXJyYXkgKHhkcnMsIChjaGFyICoqKSZvYmpwLT5zdl9saXN0LnN2X2xpc3RfdmFsLCAodV9pbnQgKikgJm9ianAtPnN2X2xpc3Quc3ZfbGlzdF9sZW4sIDgwLAotCQlzaXplb2YgKHJwY19sb2Nfc3ZfaW5mb19zX3R5cGUpLCAoeGRycHJvY190KSB4ZHJfcnBjX2xvY19zdl9pbmZvX3NfdHlwZSkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2Nfbm1lYV9yZXBvcnRfc190eXBlIChYRFIgKnhkcnMsIHJwY19sb2Nfbm1lYV9yZXBvcnRfc190eXBlICpvYmpwKQotewotCXJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotCWludCBpOwotCSBpZiAoIXhkcl9ycGNfdWludDE2ICh4ZHJzLCAmb2JqcC0+bGVuZ3RoKSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfb3BhcXVlICh4ZHJzLCBvYmpwLT5ubWVhX3NlbnRlbmNlcywgMTIwMCkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2Nfc3RhdHVzX2V2ZW50X2VfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX3N0YXR1c19ldmVudF9lX3R5cGUgKm9ianApCi17Ci0JcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0JIGlmICgheGRyX2VudW0gKHhkcnMsIChlbnVtX3QgKikgb2JqcCkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2NfZW5naW5lX3N0YXRlX2VfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX2VuZ2luZV9zdGF0ZV9lX3R5cGUgKm9ianApCi17Ci0JcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0JIGlmICgheGRyX2VudW0gKHhkcnMsIChlbnVtX3QgKikgb2JqcCkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2NfZml4X3Nlc3Npb25fc3RhdGVfZV90eXBlIChYRFIgKnhkcnMsIHJwY19sb2NfZml4X3Nlc3Npb25fc3RhdGVfZV90eXBlICpvYmpwKQotewotCXJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotCSBpZiAoIXhkcl9lbnVtICh4ZHJzLCAoZW51bV90ICopIG9ianApKQotCQkgcmV0dXJuIEZBTFNFOwotCXJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfbG9jX3N0YXR1c19ldmVudF9wYXlsb2FkX3VfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX3N0YXR1c19ldmVudF9wYXlsb2FkX3VfdHlwZSAqb2JqcCkKLXsKLQlyZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLQkgaWYgKCF4ZHJfcnBjX2xvY19zdGF0dXNfZXZlbnRfZV90eXBlICh4ZHJzLCAmb2JqcC0+ZGlzYykpCi0JCSByZXR1cm4gRkFMU0U7Ci0Jc3dpdGNoIChvYmpwLT5kaXNjKSB7Ci0JY2FzZSBSUENfTE9DX1NUQVRVU19FVkVOVF9FTkdJTkVfU1RBVEU6Ci0JCSBpZiAoIXhkcl9ycGNfbG9jX2VuZ2luZV9zdGF0ZV9lX3R5cGUgKHhkcnMsICZvYmpwLT5ycGNfbG9jX3N0YXR1c19ldmVudF9wYXlsb2FkX3VfdHlwZV91LmVuZ2luZV9zdGF0ZSkpCi0JCQkgcmV0dXJuIEZBTFNFOwotCQlicmVhazsKLQljYXNlIFJQQ19MT0NfU1RBVFVTX0VWRU5UX0ZJWF9TRVNTSU9OX1NUQVRFOgotCQkgaWYgKCF4ZHJfcnBjX2xvY19maXhfc2Vzc2lvbl9zdGF0ZV9lX3R5cGUgKHhkcnMsICZvYmpwLT5ycGNfbG9jX3N0YXR1c19ldmVudF9wYXlsb2FkX3VfdHlwZV91LmZpeF9zZXNzaW9uX3N0YXRlKSkKLQkJCSByZXR1cm4gRkFMU0U7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19zdGF0dXNfZXZlbnRfc190eXBlIChYRFIgKnhkcnMsIHJwY19sb2Nfc3RhdHVzX2V2ZW50X3NfdHlwZSAqb2JqcCkKLXsKLQlyZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLQkgaWYgKCF4ZHJfcnBjX2xvY19zdGF0dXNfZXZlbnRfZV90eXBlICh4ZHJzLCAmb2JqcC0+ZXZlbnQpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9ycGNfbG9jX3N0YXR1c19ldmVudF9wYXlsb2FkX3VfdHlwZSAoeGRycywgJm9ianAtPnBheWxvYWQpKQotCQkgcmV0dXJuIEZBTFNFOwotCXJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfbG9jX3NlcnZlcl9hZGRyX2VfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX3NlcnZlcl9hZGRyX2VfdHlwZSAqb2JqcCkKLXsKLQlyZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLQkgaWYgKCF4ZHJfZW51bSAoeGRycywgKGVudW1fdCAqKSBvYmpwKSkKLQkJIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19zZXJ2ZXJfYWRkcl9pcHY0X3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19zZXJ2ZXJfYWRkcl9pcHY0X3R5cGUgKm9ianApCi17Ci0JcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0JIGlmICgheGRyX3JwY191aW50MzIgKHhkcnMsICZvYmpwLT5hZGRyKSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfcnBjX3VpbnQxNiAoeGRycywgJm9ianAtPnBvcnQpKQotCQkgcmV0dXJuIEZBTFNFOwotCXJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfbG9jX3NlcnZlcl9hZGRyX3VybF90eXBlIChYRFIgKnhkcnMsIHJwY19sb2Nfc2VydmVyX2FkZHJfdXJsX3R5cGUgKm9ianApCi17Ci0JcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0JaW50IGk7Ci0JIGlmICgheGRyX3JwY191aW50MTYgKHhkcnMsICZvYmpwLT5sZW5ndGgpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9vcGFxdWUgKHhkcnMsIG9ianAtPmFkZHIsIDI1NikpCi0JCSByZXR1cm4gRkFMU0U7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2Nfc2VydmVyX2FkZHJfdV90eXBlIChYRFIgKnhkcnMsIHJwY19sb2Nfc2VydmVyX2FkZHJfdV90eXBlICpvYmpwKQotewotCXJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotCSBpZiAoIXhkcl9ycGNfbG9jX3NlcnZlcl9hZGRyX2VfdHlwZSAoeGRycywgJm9ianAtPmRpc2MpKQotCQkgcmV0dXJuIEZBTFNFOwotCXN3aXRjaCAob2JqcC0+ZGlzYykgewotCWNhc2UgUlBDX0xPQ19TRVJWRVJfQUREUl9JUFY0OgotCQkgaWYgKCF4ZHJfcnBjX2xvY19zZXJ2ZXJfYWRkcl9pcHY0X3R5cGUgKHhkcnMsICZvYmpwLT5ycGNfbG9jX3NlcnZlcl9hZGRyX3VfdHlwZV91LmlwdjQpKQotCQkJIHJldHVybiBGQUxTRTsKLQkJYnJlYWs7Ci0JY2FzZSBSUENfTE9DX1NFUlZFUl9BRERSX1VSTDoKLQkJIGlmICgheGRyX3JwY19sb2Nfc2VydmVyX2FkZHJfdXJsX3R5cGUgKHhkcnMsICZvYmpwLT5ycGNfbG9jX3NlcnZlcl9hZGRyX3VfdHlwZV91LnVybCkpCi0JCQkgcmV0dXJuIEZBTFNFOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2Nfc2VydmVyX2luZm9fc190eXBlIChYRFIgKnhkcnMsIHJwY19sb2Nfc2VydmVyX2luZm9fc190eXBlICpvYmpwKQotewotCXJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotCSBpZiAoIXhkcl9ycGNfbG9jX3NlcnZlcl9hZGRyX2VfdHlwZSAoeGRycywgJm9ianAtPmFkZHJfdHlwZSkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX3JwY19sb2Nfc2VydmVyX2FkZHJfdV90eXBlICh4ZHJzLCAmb2JqcC0+YWRkcl9pbmZvKSkKLQkJIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19uaV9ub3RpZnlfdmVyaWZ5X2VfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX25pX25vdGlmeV92ZXJpZnlfZV90eXBlICpvYmpwKQotewotCXJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotCSBpZiAoIXhkcl9lbnVtICh4ZHJzLCAoZW51bV90ICopIG9ianApKQotCQkgcmV0dXJuIEZBTFNFOwotCXJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfbG9jX25pX2V2ZW50X2VfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX25pX2V2ZW50X2VfdHlwZSAqb2JqcCkKLXsKLQlyZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLQkgaWYgKCF4ZHJfZW51bSAoeGRycywgKGVudW1fdCAqKSBvYmpwKSkKLQkJIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19uaV9kYXRhY29kaW5nX3NjaGVtZV9lX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19uaV9kYXRhY29kaW5nX3NjaGVtZV9lX3R5cGUgKm9ianApCi17Ci0JcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0JIGlmICgheGRyX2VudW0gKHhkcnMsIChlbnVtX3QgKikgb2JqcCkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2NfbmlfdnhfcmVxdWVzdGVyX2lkX2VuY29kaW5nX3NjaGVtZV9lX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19uaV92eF9yZXF1ZXN0ZXJfaWRfZW5jb2Rpbmdfc2NoZW1lX2VfdHlwZSAqb2JqcCkKLXsKLQlyZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLQkgaWYgKCF4ZHJfZW51bSAoeGRycywgKGVudW1fdCAqKSBvYmpwKSkKLQkJIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19uaV92eF9wb3NfbW9kZV9lX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19uaV92eF9wb3NfbW9kZV9lX3R5cGUgKm9ianApCi17Ci0JcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0JIGlmICgheGRyX2VudW0gKHhkcnMsIChlbnVtX3QgKikgb2JqcCkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2NfbmlfdnhfcmVxdWVzdGVyX2lkX3NfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX25pX3Z4X3JlcXVlc3Rlcl9pZF9zX3R5cGUgKm9ianApCi17Ci0JcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0JaW50IGk7Ci0JIGlmICgheGRyX3VfY2hhciAoeGRycywgJm9ianAtPnJlcXVlc3Rlcl9pZF9sZW5ndGgpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9vcGFxdWUgKHhkcnMsIG9ianAtPnJlcXVlc3Rlcl9pZCwgMjAwKSkKLQkJIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19uaV92eF9ub3RpZnlfdmVyaWZ5X3JlcV9zX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19uaV92eF9ub3RpZnlfdmVyaWZ5X3JlcV9zX3R5cGUgKm9ianApCi17Ci0JcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0JIGlmICgheGRyX3JwY19sb2Nfbmlfbm90aWZ5X3ZlcmlmeV9lX3R5cGUgKHhkcnMsICZvYmpwLT5ub3RpZmljYXRpb25fcHJpdl90eXBlKSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfdV9jaGFyICh4ZHJzLCAmb2JqcC0+cG9zX3Fvc19pbmNsKSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfdV9jaGFyICh4ZHJzLCAmb2JqcC0+cG9zX3FvcykpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX3JwY191aW50MzIgKHhkcnMsICZvYmpwLT5udW1fZml4ZXMpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9ycGNfdWludDMyICh4ZHJzLCAmb2JqcC0+dGJmKSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfcnBjX2xvY19uaV92eF9wb3NfbW9kZV9lX3R5cGUgKHhkcnMsICZvYmpwLT5wb3NfbW9kZSkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX3JwY19sb2NfbmlfdnhfcmVxdWVzdGVyX2lkX2VuY29kaW5nX3NjaGVtZV9lX3R5cGUgKHhkcnMsICZvYmpwLT5lbmNvZGluZ19zY2hlbWUpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9ycGNfbG9jX25pX3Z4X3JlcXVlc3Rlcl9pZF9zX3R5cGUgKHhkcnMsICZvYmpwLT5yZXF1ZXN0ZXJfaWQpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9ycGNfdWludDE2ICh4ZHJzLCAmb2JqcC0+dXNlcl9yZXNwX3RpbWVyX3ZhbCkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2Nfbmlfc3VwbF9wb3NfbWV0aG9kX2VfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX25pX3N1cGxfcG9zX21ldGhvZF9lX3R5cGUgKm9ianApCi17Ci0JcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0JIGlmICgheGRyX2VudW0gKHhkcnMsIChlbnVtX3QgKikgb2JqcCkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2Nfbmlfc3VwbF9zbHBfc2Vzc2lvbl9pZF9zX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19uaV9zdXBsX3NscF9zZXNzaW9uX2lkX3NfdHlwZSAqb2JqcCkKLXsKLQlyZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLQlpbnQgaTsKLQkgaWYgKCF4ZHJfdV9jaGFyICh4ZHJzLCAmb2JqcC0+cHJlc2VuY2UpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9vcGFxdWUgKHhkcnMsIG9ianAtPnNlc3Npb25faWQsIDQpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9ycGNfbG9jX3NlcnZlcl9pbmZvX3NfdHlwZSAoeGRycywgJm9ianAtPnNscF9hZGRyZXNzKSkKLQkJIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19uaV9yZXF1ZXN0b3JfaWRfc190eXBlIChYRFIgKnhkcnMsIHJwY19sb2NfbmlfcmVxdWVzdG9yX2lkX3NfdHlwZSAqb2JqcCkKLXsKLQlyZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLQlpbnQgaTsKLQkgaWYgKCF4ZHJfdV9jaGFyICh4ZHJzLCAmb2JqcC0+ZGF0YV9jb2Rpbmdfc2NoZW1lKSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfb3BhcXVlICh4ZHJzLCBvYmpwLT5yZXF1ZXN0b3JfaWRfc3RyaW5nLCAyMDApKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl91X2NoYXIgKHhkcnMsICZvYmpwLT5zdHJpbmdfbGVuKSkKLQkJIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19uaV9zdXBsX2NsaWVudF9uYW1lX3NfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX25pX3N1cGxfY2xpZW50X25hbWVfc190eXBlICpvYmpwKQotewotCXJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotCWludCBpOwotCSBpZiAoIXhkcl91X2NoYXIgKHhkcnMsICZvYmpwLT5kYXRhX2NvZGluZ19zY2hlbWUpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9vcGFxdWUgKHhkcnMsIG9ianAtPmNsaWVudF9uYW1lX3N0cmluZywgNjQpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl91X2NoYXIgKHhkcnMsICZvYmpwLT5zdHJpbmdfbGVuKSkKLQkJIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19uaV9zdXBsX3FvcF9zX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19uaV9zdXBsX3FvcF9zX3R5cGUgKm9ianApCi17Ci0JcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0JIGlmICgheGRyX3VfY2hhciAoeGRycywgJm9ianAtPmJpdF9tYXNrKSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfdV9jaGFyICh4ZHJzLCAmb2JqcC0+aG9yYWNjKSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfdV9jaGFyICh4ZHJzLCAmb2JqcC0+dmVyYWNjKSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfcnBjX3VpbnQxNiAoeGRycywgJm9ianAtPm1heExvY0FnZSkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX3VfY2hhciAoeGRycywgJm9ianAtPmRlbGF5KSkKLQkJIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19uaV9zdXBsX25vdGlmeV92ZXJpZnlfcmVxX3NfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX25pX3N1cGxfbm90aWZ5X3ZlcmlmeV9yZXFfc190eXBlICpvYmpwKQotewotCXJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotCWludCBpOwotCSBpZiAoIXhkcl9ycGNfbG9jX25pX25vdGlmeV92ZXJpZnlfZV90eXBlICh4ZHJzLCAmb2JqcC0+bm90aWZpY2F0aW9uX3ByaXZfdHlwZSkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX3JwY191aW50MTYgKHhkcnMsICZvYmpwLT5mbGFncykpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX3JwY19sb2Nfbmlfc3VwbF9zbHBfc2Vzc2lvbl9pZF9zX3R5cGUgKHhkcnMsICZvYmpwLT5zdXBsX3NscF9zZXNzaW9uX2lkKSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfb3BhcXVlICh4ZHJzLCBvYmpwLT5zdXBsX2hhc2gsIDgpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9ycGNfbG9jX25pX2RhdGFjb2Rpbmdfc2NoZW1lX2VfdHlwZSAoeGRycywgJm9ianAtPmRhdGFjb2Rpbmdfc2NoZW1lKSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfcnBjX2xvY19uaV9zdXBsX3Bvc19tZXRob2RfZV90eXBlICh4ZHJzLCAmb2JqcC0+cG9zX21ldGhvZCkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX3JwY19sb2NfbmlfcmVxdWVzdG9yX2lkX3NfdHlwZSAoeGRycywgJm9ianAtPnJlcXVlc3Rvcl9pZCkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX3JwY19sb2Nfbmlfc3VwbF9jbGllbnRfbmFtZV9zX3R5cGUgKHhkcnMsICZvYmpwLT5jbGllbnRfbmFtZSkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX3JwY19sb2Nfbmlfc3VwbF9xb3Bfc190eXBlICh4ZHJzLCAmb2JqcC0+c3VwbF9xb3ApKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9ycGNfdWludDE2ICh4ZHJzLCAmb2JqcC0+dXNlcl9yZXNwb25zZV90aW1lcikpCi0JCSByZXR1cm4gRkFMU0U7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2NfbmlfZXh0X2NsaWVudF9hZGRyZXNzX3NfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX25pX2V4dF9jbGllbnRfYWRkcmVzc19zX3R5cGUgKm9ianApCi17Ci0JcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0JaW50IGk7Ci0JIGlmICgheGRyX3VfY2hhciAoeGRycywgJm9ianAtPmV4dF9jbGllbnRfYWRkcmVzc19sZW4pKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9vcGFxdWUgKHhkcnMsIG9ianAtPmV4dF9jbGllbnRfYWRkcmVzcywgMjApKQotCQkgcmV0dXJuIEZBTFNFOwotCXJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfbG9jX25pX2xvY2F0aW9uX3R5cGVfZV90eXBlIChYRFIgKnhkcnMsIHJwY19sb2NfbmlfbG9jYXRpb25fdHlwZV9lX3R5cGUgKm9ianApCi17Ci0JcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0JIGlmICgheGRyX2VudW0gKHhkcnMsIChlbnVtX3QgKikgb2JqcCkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2NfbmlfZGVmZXJyZWRfbG9jYXRpb25fc190eXBlIChYRFIgKnhkcnMsIHJwY19sb2NfbmlfZGVmZXJyZWRfbG9jYXRpb25fc190eXBlICpvYmpwKQotewotCXJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotCSBpZiAoIXhkcl91X2NoYXIgKHhkcnMsICZvYmpwLT51bnVzZWRfYml0cykpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX3VfY2hhciAoeGRycywgJm9ianAtPm1zX2F2YWlsYWJsZSkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2NfbmlfY29kZXdvcmRfc3RyaW5nX3NfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX25pX2NvZGV3b3JkX3N0cmluZ19zX3R5cGUgKm9ianApCi17Ci0JcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0JaW50IGk7Ci0JIGlmICgheGRyX3VfY2hhciAoeGRycywgJm9ianAtPmRhdGFfY29kaW5nX3NjaGVtZSkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX29wYXF1ZSAoeGRycywgb2JqcC0+bGNzX2NvZGV3b3JkX3N0cmluZywgMjApKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl91X2NoYXIgKHhkcnMsICZvYmpwLT5zdHJpbmdfbGVuKSkKLQkJIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19uaV9zZXJ2aWNlX3R5cGVfaWRfc190eXBlIChYRFIgKnhkcnMsIHJwY19sb2Nfbmlfc2VydmljZV90eXBlX2lkX3NfdHlwZSAqb2JqcCkKLXsKLQlyZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLQkgaWYgKCF4ZHJfdV9jaGFyICh4ZHJzLCAmb2JqcC0+bGNzX3NlcnZpY2VfdHlwZV9pZCkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2NfbmlfdW10c19jcF9ub3RpZnlfdmVyaWZ5X3JlcV9zX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19uaV91bXRzX2NwX25vdGlmeV92ZXJpZnlfcmVxX3NfdHlwZSAqb2JqcCkKLXsKLQlyZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLQlpbnQgaTsKLQkgaWYgKCF4ZHJfcnBjX2xvY19uaV9ub3RpZnlfdmVyaWZ5X2VfdHlwZSAoeGRycywgJm9ianAtPm5vdGlmaWNhdGlvbl9wcml2X3R5cGUpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl91X2NoYXIgKHhkcnMsICZvYmpwLT5pbnZva2VfaWQpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9ycGNfdWludDE2ICh4ZHJzLCAmb2JqcC0+ZmxhZ3MpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl91X2NoYXIgKHhkcnMsICZvYmpwLT5ub3RpZmljYXRpb25fbGVuZ3RoKSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfb3BhcXVlICh4ZHJzLCBvYmpwLT5ub3RpZmljYXRpb25fdGV4dCwgNjQpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9ycGNfbG9jX25pX2RhdGFjb2Rpbmdfc2NoZW1lX2VfdHlwZSAoeGRycywgJm9ianAtPmRhdGFjb2Rpbmdfc2NoZW1lKSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfcnBjX2xvY19uaV9leHRfY2xpZW50X2FkZHJlc3Nfc190eXBlICh4ZHJzLCAmb2JqcC0+ZXh0X2NsaWVudF9hZGRyZXNzX2RhdGEpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9ycGNfbG9jX25pX2xvY2F0aW9uX3R5cGVfZV90eXBlICh4ZHJzLCAmb2JqcC0+bG9jYXRpb25fdHlwZSkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX3JwY19sb2NfbmlfZGVmZXJyZWRfbG9jYXRpb25fc190eXBlICh4ZHJzLCAmb2JqcC0+ZGVmZXJyZWRfbG9jYXRpb24pKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9ycGNfbG9jX25pX3JlcXVlc3Rvcl9pZF9zX3R5cGUgKHhkcnMsICZvYmpwLT5yZXF1ZXN0b3JfaWQpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9ycGNfbG9jX25pX2NvZGV3b3JkX3N0cmluZ19zX3R5cGUgKHhkcnMsICZvYmpwLT5jb2Rld29yZF9zdHJpbmcpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9ycGNfbG9jX25pX3NlcnZpY2VfdHlwZV9pZF9zX3R5cGUgKHhkcnMsICZvYmpwLT5zZXJ2aWNlX3R5cGVfaWQpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9ycGNfdWludDE2ICh4ZHJzLCAmb2JqcC0+dXNlcl9yZXNwb25zZV90aW1lcikpCi0JCSByZXR1cm4gRkFMU0U7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2Nfbmlfc2VydmljZV9pbnRlcmFjdGlvbl9lX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19uaV9zZXJ2aWNlX2ludGVyYWN0aW9uX2VfdHlwZSAqb2JqcCkKLXsKLQlyZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLQkgaWYgKCF4ZHJfZW51bSAoeGRycywgKGVudW1fdCAqKSBvYmpwKSkKLQkJIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19uaV92eF9zZXJ2aWNlX2ludGVyYWN0aW9uX3JlcV9zX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19uaV92eF9zZXJ2aWNlX2ludGVyYWN0aW9uX3JlcV9zX3R5cGUgKm9ianApCi17Ci0JcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0JIGlmICgheGRyX3JwY19sb2Nfbmlfdnhfbm90aWZ5X3ZlcmlmeV9yZXFfc190eXBlICh4ZHJzLCAmb2JqcC0+bmlfdnhfcmVxKSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfcnBjX2xvY19uaV9zZXJ2aWNlX2ludGVyYWN0aW9uX2VfdHlwZSAoeGRycywgJm9ianAtPnNlcnZpY2VfaW50ZXJhdGlvbl90eXBlKSkKLQkJIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19uaV9ldmVudF9wYXlsb2FkX3VfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX25pX2V2ZW50X3BheWxvYWRfdV90eXBlICpvYmpwKQotewotCXJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotCSBpZiAoIXhkcl9ycGNfbG9jX25pX2V2ZW50X2VfdHlwZSAoeGRycywgJm9ianAtPmRpc2MpKQotCQkgcmV0dXJuIEZBTFNFOwotCXN3aXRjaCAob2JqcC0+ZGlzYykgewotCWNhc2UgUlBDX0xPQ19OSV9FVkVOVF9WWF9OT1RJRllfVkVSSUZZX1JFUToKLQkJIGlmICgheGRyX3JwY19sb2Nfbmlfdnhfbm90aWZ5X3ZlcmlmeV9yZXFfc190eXBlICh4ZHJzLCAmb2JqcC0+cnBjX2xvY19uaV9ldmVudF9wYXlsb2FkX3VfdHlwZV91LnZ4X3JlcSkpCi0JCQkgcmV0dXJuIEZBTFNFOwotCQlicmVhazsKLQljYXNlIFJQQ19MT0NfTklfRVZFTlRfU1VQTF9OT1RJRllfVkVSSUZZX1JFUToKLQkJIGlmICgheGRyX3JwY19sb2Nfbmlfc3VwbF9ub3RpZnlfdmVyaWZ5X3JlcV9zX3R5cGUgKHhkcnMsICZvYmpwLT5ycGNfbG9jX25pX2V2ZW50X3BheWxvYWRfdV90eXBlX3Uuc3VwbF9yZXEpKQotCQkJIHJldHVybiBGQUxTRTsKLQkJYnJlYWs7Ci0JY2FzZSBSUENfTE9DX05JX0VWRU5UX1VNVFNfQ1BfTk9USUZZX1ZFUklGWV9SRVE6Ci0JCSBpZiAoIXhkcl9ycGNfbG9jX25pX3VtdHNfY3Bfbm90aWZ5X3ZlcmlmeV9yZXFfc190eXBlICh4ZHJzLCAmb2JqcC0+cnBjX2xvY19uaV9ldmVudF9wYXlsb2FkX3VfdHlwZV91LnVtdHNfY3BfcmVxKSkKLQkJCSByZXR1cm4gRkFMU0U7Ci0JCWJyZWFrOwotCWNhc2UgUlBDX0xPQ19OSV9FVkVOVF9WWF9TRVJWSUNFX0lOVEVSQUNUSU9OX1JFUToKLQkJIGlmICgheGRyX3JwY19sb2Nfbmlfdnhfc2VydmljZV9pbnRlcmFjdGlvbl9yZXFfc190eXBlICh4ZHJzLCAmb2JqcC0+cnBjX2xvY19uaV9ldmVudF9wYXlsb2FkX3VfdHlwZV91LnNlcnZpY2VfaW50ZXJhY3Rpb25fcmVxKSkKLQkJCSByZXR1cm4gRkFMU0U7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19uaV9ldmVudF9zX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19uaV9ldmVudF9zX3R5cGUgKm9ianApCi17Ci0JcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0JIGlmICgheGRyX3JwY19sb2NfbmlfZXZlbnRfZV90eXBlICh4ZHJzLCAmb2JqcC0+ZXZlbnQpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9ycGNfbG9jX25pX2V2ZW50X3BheWxvYWRfdV90eXBlICh4ZHJzLCAmb2JqcC0+cGF5bG9hZCkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2NfYXNzaXN0X2RhdGFfcmVxdWVzdF9lX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19hc3Npc3RfZGF0YV9yZXF1ZXN0X2VfdHlwZSAqb2JqcCkKLXsKLQlyZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLQkgaWYgKCF4ZHJfZW51bSAoeGRycywgKGVudW1fdCAqKSBvYmpwKSkKLQkJIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX3N0cnVjdF9sb2NfdGltZV9kb3dubG9hZF9zb3VyY2Vfc190eXBlX3NlcnZlcnNfcHRyIChYRFIgKnhkcnMsIHJwY19zdHJ1Y3RfbG9jX3RpbWVfZG93bmxvYWRfc291cmNlX3NfdHlwZV9zZXJ2ZXJzX3B0ciAqb2JqcCkKLXsKLQlyZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLQkgaWYgKCF4ZHJfc3RyaW5nICh4ZHJzLCBvYmpwLCAyNTYpKQotCQkgcmV0dXJuIEZBTFNFOwotCXJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfc3RydWN0X2xvY190aW1lX2Rvd25sb2FkX3NvdXJjZV9zX3R5cGVfc2VydmVycyAoWERSICp4ZHJzLCBycGNfc3RydWN0X2xvY190aW1lX2Rvd25sb2FkX3NvdXJjZV9zX3R5cGVfc2VydmVycyBvYmpwKQotewotCXJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotCSBpZiAoIXhkcl92ZWN0b3IgKHhkcnMsIChjaGFyICopb2JqcCwgMywKLQkJc2l6ZW9mIChycGNfc3RydWN0X2xvY190aW1lX2Rvd25sb2FkX3NvdXJjZV9zX3R5cGVfc2VydmVyc19wdHIpLCAoeGRycHJvY190KSB4ZHJfcnBjX3N0cnVjdF9sb2NfdGltZV9kb3dubG9hZF9zb3VyY2Vfc190eXBlX3NlcnZlcnNfcHRyKSkKLQkJIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY190aW1lX2Rvd25sb2FkX3NvdXJjZV9zX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY190aW1lX2Rvd25sb2FkX3NvdXJjZV9zX3R5cGUgKm9ianApCi17Ci0JcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0JIGlmICgheGRyX3JwY191aW50MzIgKHhkcnMsICZvYmpwLT5kZWxheV90aHJlc2hvbGQpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9ycGNfc3RydWN0X2xvY190aW1lX2Rvd25sb2FkX3NvdXJjZV9zX3R5cGVfc2VydmVycyAoeGRycywgb2JqcC0+c2VydmVycykpCi0JCSByZXR1cm4gRkFMU0U7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19zdHJ1Y3RfbG9jX3ByZWRpY3RlZF9vcmJpdHNfZGF0YV9zb3VyY2Vfc190eXBlX3NlcnZlcnNfcHRyIChYRFIgKnhkcnMsIHJwY19zdHJ1Y3RfbG9jX3ByZWRpY3RlZF9vcmJpdHNfZGF0YV9zb3VyY2Vfc190eXBlX3NlcnZlcnNfcHRyICpvYmpwKQotewotCXJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotCSBpZiAoIXhkcl9zdHJpbmcgKHhkcnMsIG9ianAsIDI1NikpCi0JCSByZXR1cm4gRkFMU0U7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19zdHJ1Y3RfbG9jX3ByZWRpY3RlZF9vcmJpdHNfZGF0YV9zb3VyY2Vfc190eXBlX3NlcnZlcnMgKFhEUiAqeGRycywgcnBjX3N0cnVjdF9sb2NfcHJlZGljdGVkX29yYml0c19kYXRhX3NvdXJjZV9zX3R5cGVfc2VydmVycyBvYmpwKQotewotCXJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotCSBpZiAoIXhkcl92ZWN0b3IgKHhkcnMsIChjaGFyICopb2JqcCwgMywKLQkJc2l6ZW9mIChycGNfc3RydWN0X2xvY19wcmVkaWN0ZWRfb3JiaXRzX2RhdGFfc291cmNlX3NfdHlwZV9zZXJ2ZXJzX3B0ciksICh4ZHJwcm9jX3QpIHhkcl9ycGNfc3RydWN0X2xvY19wcmVkaWN0ZWRfb3JiaXRzX2RhdGFfc291cmNlX3NfdHlwZV9zZXJ2ZXJzX3B0cikpCi0JCSByZXR1cm4gRkFMU0U7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2NfcHJlZGljdGVkX29yYml0c19kYXRhX3NvdXJjZV9zX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19wcmVkaWN0ZWRfb3JiaXRzX2RhdGFfc291cmNlX3NfdHlwZSAqb2JqcCkKLXsKLQlyZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLQkgaWYgKCF4ZHJfcnBjX3VpbnQzMiAoeGRycywgJm9ianAtPm1heF9maWxlX3NpemUpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9ycGNfdWludDMyICh4ZHJzLCAmb2JqcC0+bWF4X3BhcnRfc2l6ZSkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX3JwY19zdHJ1Y3RfbG9jX3ByZWRpY3RlZF9vcmJpdHNfZGF0YV9zb3VyY2Vfc190eXBlX3NlcnZlcnMgKHhkcnMsIG9ianAtPnNlcnZlcnMpKQotCQkgcmV0dXJuIEZBTFNFOwotCXJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfbG9jX2Fzc2lzdF9kYXRhX3JlcXVlc3RfcGF5bG9hZF91X3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19hc3Npc3RfZGF0YV9yZXF1ZXN0X3BheWxvYWRfdV90eXBlICpvYmpwKQotewotCXJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotCSBpZiAoIXhkcl9ycGNfbG9jX2Fzc2lzdF9kYXRhX3JlcXVlc3RfZV90eXBlICh4ZHJzLCAmb2JqcC0+ZGlzYykpCi0JCSByZXR1cm4gRkFMU0U7Ci0Jc3dpdGNoIChvYmpwLT5kaXNjKSB7Ci0JY2FzZSBSUENfTE9DX0FTU0lTVF9EQVRBX1RJTUVfUkVROgotCQkgaWYgKCF4ZHJfcnBjX2xvY190aW1lX2Rvd25sb2FkX3NvdXJjZV9zX3R5cGUgKHhkcnMsICZvYmpwLT5ycGNfbG9jX2Fzc2lzdF9kYXRhX3JlcXVlc3RfcGF5bG9hZF91X3R5cGVfdS50aW1lX2Rvd25sb2FkKSkKLQkJCSByZXR1cm4gRkFMU0U7Ci0JCWJyZWFrOwotCWNhc2UgUlBDX0xPQ19BU1NJU1RfREFUQV9QUkVESUNURURfT1JCSVRTX1JFUToKLQkJIGlmICgheGRyX3JwY19sb2NfcHJlZGljdGVkX29yYml0c19kYXRhX3NvdXJjZV9zX3R5cGUgKHhkcnMsICZvYmpwLT5ycGNfbG9jX2Fzc2lzdF9kYXRhX3JlcXVlc3RfcGF5bG9hZF91X3R5cGVfdS5kYXRhX2Rvd25sb2FkKSkKLQkJCSByZXR1cm4gRkFMU0U7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19hc3Npc3RfZGF0YV9yZXF1ZXN0X3NfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX2Fzc2lzdF9kYXRhX3JlcXVlc3Rfc190eXBlICpvYmpwKQotewotCXJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotCSBpZiAoIXhkcl9ycGNfbG9jX2Fzc2lzdF9kYXRhX3JlcXVlc3RfZV90eXBlICh4ZHJzLCAmb2JqcC0+ZXZlbnQpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9ycGNfbG9jX2Fzc2lzdF9kYXRhX3JlcXVlc3RfcGF5bG9hZF91X3R5cGUgKHhkcnMsICZvYmpwLT5wYXlsb2FkKSkKLQkJIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19zZXJ2ZXJfY29ubmVjdGlvbl9oYW5kbGUgKFhEUiAqeGRycywgcnBjX2xvY19zZXJ2ZXJfY29ubmVjdGlvbl9oYW5kbGUgKm9ianApCi17Ci0JcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0JIGlmICgheGRyX3JwY191aW50MzIgKHhkcnMsIG9ianApKQotCQkgcmV0dXJuIEZBTFNFOwotCXJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfbG9jX3NlcnZlcl9wcm90b2NvbF9lX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19zZXJ2ZXJfcHJvdG9jb2xfZV90eXBlICpvYmpwKQotewotCXJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotCSBpZiAoIXhkcl9lbnVtICh4ZHJzLCAoZW51bV90ICopIG9ianApKQotCQkgcmV0dXJuIEZBTFNFOwotCXJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfbG9jX3NlcnZlcl9yZXF1ZXN0X2VfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX3NlcnZlcl9yZXF1ZXN0X2VfdHlwZSAqb2JqcCkKLXsKLQlyZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLQkgaWYgKCF4ZHJfZW51bSAoeGRycywgKGVudW1fdCAqKSBvYmpwKSkKLQkJIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19zZXJ2ZXJfb3Blbl9yZXFfc190eXBlIChYRFIgKnhkcnMsIHJwY19sb2Nfc2VydmVyX29wZW5fcmVxX3NfdHlwZSAqb2JqcCkKLXsKLQlyZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLQkgaWYgKCF4ZHJfcnBjX2xvY19zZXJ2ZXJfY29ubmVjdGlvbl9oYW5kbGUgKHhkcnMsICZvYmpwLT5jb25uX2hhbmRsZSkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX3JwY19sb2Nfc2VydmVyX3Byb3RvY29sX2VfdHlwZSAoeGRycywgJm9ianAtPnByb3RvY29sKSkKLQkJIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19zZXJ2ZXJfY2xvc2VfcmVxX3NfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX3NlcnZlcl9jbG9zZV9yZXFfc190eXBlICpvYmpwKQotewotCXJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotCSBpZiAoIXhkcl9ycGNfbG9jX3NlcnZlcl9jb25uZWN0aW9uX2hhbmRsZSAoeGRycywgJm9ianAtPmNvbm5faGFuZGxlKSkKLQkJIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19zZXJ2ZXJfcmVxdWVzdF91X3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19zZXJ2ZXJfcmVxdWVzdF91X3R5cGUgKm9ianApCi17Ci0JcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0JIGlmICgheGRyX3JwY19sb2Nfc2VydmVyX3JlcXVlc3RfZV90eXBlICh4ZHJzLCAmb2JqcC0+ZGlzYykpCi0JCSByZXR1cm4gRkFMU0U7Ci0Jc3dpdGNoIChvYmpwLT5kaXNjKSB7Ci0JY2FzZSBSUENfTE9DX1NFUlZFUl9SRVFVRVNUX09QRU46Ci0JCSBpZiAoIXhkcl9ycGNfbG9jX3NlcnZlcl9vcGVuX3JlcV9zX3R5cGUgKHhkcnMsICZvYmpwLT5ycGNfbG9jX3NlcnZlcl9yZXF1ZXN0X3VfdHlwZV91Lm9wZW5fcmVxKSkKLQkJCSByZXR1cm4gRkFMU0U7Ci0JCWJyZWFrOwotCWNhc2UgUlBDX0xPQ19TRVJWRVJfUkVRVUVTVF9DTE9TRToKLQkJIGlmICgheGRyX3JwY19sb2Nfc2VydmVyX2Nsb3NlX3JlcV9zX3R5cGUgKHhkcnMsICZvYmpwLT5ycGNfbG9jX3NlcnZlcl9yZXF1ZXN0X3VfdHlwZV91LmNsb3NlX3JlcSkpCi0JCQkgcmV0dXJuIEZBTFNFOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2Nfc2VydmVyX3JlcXVlc3Rfc190eXBlIChYRFIgKnhkcnMsIHJwY19sb2Nfc2VydmVyX3JlcXVlc3Rfc190eXBlICpvYmpwKQotewotCXJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotCSBpZiAoIXhkcl9ycGNfbG9jX3NlcnZlcl9yZXF1ZXN0X2VfdHlwZSAoeGRycywgJm9ianAtPmV2ZW50KSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfcnBjX2xvY19zZXJ2ZXJfcmVxdWVzdF91X3R5cGUgKHhkcnMsICZvYmpwLT5wYXlsb2FkKSkKLQkJIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19xd2lwX3JlcXVlc3RfZV90eXBlIChYRFIgKnhkcnMsIHJwY19sb2NfcXdpcF9yZXF1ZXN0X2VfdHlwZSAqb2JqcCkKLXsKLQlyZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLQkgaWYgKCF4ZHJfZW51bSAoeGRycywgKGVudW1fdCAqKSBvYmpwKSkKLQkJIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19xd2lwX3JlcXVlc3Rfc190eXBlIChYRFIgKnhkcnMsIHJwY19sb2NfcXdpcF9yZXF1ZXN0X3NfdHlwZSAqb2JqcCkKLXsKLQlyZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLQkgaWYgKCF4ZHJfcnBjX2xvY19xd2lwX3JlcXVlc3RfZV90eXBlICh4ZHJzLCAmb2JqcC0+cmVxdWVzdF90eXBlKSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfcnBjX3VpbnQxNiAoeGRycywgJm9ianAtPnRiZl9tcykpCi0JCSByZXR1cm4gRkFMU0U7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2NfcmVzZXJ2ZWRfcGF5bG9hZF9zX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19yZXNlcnZlZF9wYXlsb2FkX3NfdHlwZSAqb2JqcCkKLXsKLQlyZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLQkgaWYgKCF4ZHJfcnBjX3VpbnQxNiAoeGRycywgJm9ianAtPmRhdGFfc2l6ZSkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX2J5dGVzICh4ZHJzLCAoY2hhciAqKikmb2JqcC0+ZGF0YS5kYXRhX3ZhbCwgKHVfaW50ICopICZvYmpwLT5kYXRhLmRhdGFfbGVuLCB+MCkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2NfaW9jdGxfZV90eXBlIChYRFIgKnhkcnMsIHJwY19sb2NfaW9jdGxfZV90eXBlICpvYmpwKQotewotCXJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotCSBpZiAoIXhkcl9lbnVtICh4ZHJzLCAoZW51bV90ICopIG9ianApKQotCQkgcmV0dXJuIEZBTFNFOwotCXJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfbG9jX2FwaV92ZXJzaW9uX3NfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX2FwaV92ZXJzaW9uX3NfdHlwZSAqb2JqcCkKLXsKLQlyZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLQkgaWYgKCF4ZHJfdV9jaGFyICh4ZHJzLCAmb2JqcC0+bWFqb3IpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl91X2NoYXIgKHhkcnMsICZvYmpwLT5taW5vcikpCi0JCSByZXR1cm4gRkFMU0U7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2NfZml4X3JlY3VycmVuY2VfZV90eXBlIChYRFIgKnhkcnMsIHJwY19sb2NfZml4X3JlY3VycmVuY2VfZV90eXBlICpvYmpwKQotewotCXJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotCSBpZiAoIXhkcl9lbnVtICh4ZHJzLCAoZW51bV90ICopIG9ianApKQotCQkgcmV0dXJuIEZBTFNFOwotCXJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfbG9jX29wZXJhdGlvbl9tb2RlX2VfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX29wZXJhdGlvbl9tb2RlX2VfdHlwZSAqb2JqcCkKLXsKLQlyZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLQkgaWYgKCF4ZHJfZW51bSAoeGRycywgKGVudW1fdCAqKSBvYmpwKSkKLQkJIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19ub3RpZnlfZV90eXBlIChYRFIgKnhkcnMsIHJwY19sb2Nfbm90aWZ5X2VfdHlwZSAqb2JqcCkKLXsKLQlyZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLQkgaWYgKCF4ZHJfZW51bSAoeGRycywgKGVudW1fdCAqKSBvYmpwKSkKLQkJIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19maXhfY3JpdGVyaWFfc190eXBlIChYRFIgKnhkcnMsIHJwY19sb2NfZml4X2NyaXRlcmlhX3NfdHlwZSAqb2JqcCkKLXsKLQlyZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLQkgaWYgKCF4ZHJfcnBjX3VpbnQzMiAoeGRycywgJm9ianAtPnZhbGlkX21hc2spKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9ycGNfbG9jX2ZpeF9yZWN1cnJlbmNlX2VfdHlwZSAoeGRycywgJm9ianAtPnJlY3VycmVuY2VfdHlwZSkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX3JwY19sb2Nfb3BlcmF0aW9uX21vZGVfZV90eXBlICh4ZHJzLCAmb2JqcC0+cHJlZmVycmVkX29wZXJhdGlvbl9tb2RlKSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfcnBjX3VpbnQzMiAoeGRycywgJm9ianAtPnByZWZlcnJlZF9hY2N1cmFjeSkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX3JwY191aW50MzIgKHhkcnMsICZvYmpwLT5wcmVmZXJyZWRfcmVzcG9uc2VfdGltZSkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX3JwY19ib29sZWFuICh4ZHJzLCAmb2JqcC0+aW50ZXJtZWRpYXRlX3Bvc19yZXBvcnRfZW5hYmxlZCkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX3JwY19sb2Nfbm90aWZ5X2VfdHlwZSAoeGRycywgJm9ianAtPm5vdGlmeV90eXBlKSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfcnBjX3VpbnQzMiAoeGRycywgJm9ianAtPm1pbl9pbnRlcnZhbCkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX2Zsb2F0ICh4ZHJzLCAmb2JqcC0+bWluX2Rpc3RhbmNlKSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfcnBjX3VpbnQzMiAoeGRycywgJm9ianAtPm1pbl9kaXN0X3NhbXBsZV9pbnRlcnZhbCkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2NfbmlfdXNlcl9yZXNwX2VfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX25pX3VzZXJfcmVzcF9lX3R5cGUgKm9ianApCi17Ci0JcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0JIGlmICgheGRyX2VudW0gKHhkcnMsIChlbnVtX3QgKikgb2JqcCkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2NfdXNlcl92ZXJpZnlfc190eXBlIChYRFIgKnhkcnMsIHJwY19sb2NfdXNlcl92ZXJpZnlfc190eXBlICpvYmpwKQotewotCXJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotCSBpZiAoIXhkcl9ycGNfbG9jX25pX3VzZXJfcmVzcF9lX3R5cGUgKHhkcnMsICZvYmpwLT51c2VyX3Jlc3ApKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9ycGNfbG9jX25pX2V2ZW50X3NfdHlwZSAoeGRycywgJm9ianAtPm5pX2V2ZW50X3Bhc3NfYmFjaykpCi0JCSByZXR1cm4gRkFMU0U7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2NfcHJlZGljdGVkX29yYml0c19kYXRhX2Zvcm1hdF9lX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19wcmVkaWN0ZWRfb3JiaXRzX2RhdGFfZm9ybWF0X2VfdHlwZSAqb2JqcCkKLXsKLQlyZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLQkgaWYgKCF4ZHJfZW51bSAoeGRycywgKGVudW1fdCAqKSBvYmpwKSkKLQkJIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19wcmVkaWN0ZWRfb3JiaXRzX2RhdGFfc190eXBlIChYRFIgKnhkcnMsIHJwY19sb2NfcHJlZGljdGVkX29yYml0c19kYXRhX3NfdHlwZSAqb2JqcCkKLXsKLQlyZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLQkgaWYgKCF4ZHJfcnBjX2xvY19wcmVkaWN0ZWRfb3JiaXRzX2RhdGFfZm9ybWF0X2VfdHlwZSAoeGRycywgJm9ianAtPmZvcm1hdF90eXBlKSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfcnBjX3VpbnQzMiAoeGRycywgJm9ianAtPnRvdGFsX3NpemUpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9ycGNfdWludDggKHhkcnMsICZvYmpwLT50b3RhbF9wYXJ0cykpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX3JwY191aW50OCAoeGRycywgJm9ianAtPnBhcnQpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9ycGNfdWludDE2ICh4ZHJzLCAmb2JqcC0+cGFydF9sZW4pKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9ieXRlcyAoeGRycywgKGNoYXIgKiopJm9ianAtPmRhdGFfcHRyLmRhdGFfcHRyX3ZhbCwgKHVfaW50ICopICZvYmpwLT5kYXRhX3B0ci5kYXRhX3B0cl9sZW4sIH4wKSkKLQkJIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19wcmVkaWN0ZWRfb3JiaXRzX2RhdGFfdmFsaWRpdHlfcmVwb3J0X3NfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX3ByZWRpY3RlZF9vcmJpdHNfZGF0YV92YWxpZGl0eV9yZXBvcnRfc190eXBlICpvYmpwKQotewotCXJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotCSBpZiAoIXhkcl9ycGNfdWludDY0ICh4ZHJzLCAmb2JqcC0+c3RhcnRfdGltZV91dGMpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9ycGNfdWludDE2ICh4ZHJzLCAmb2JqcC0+dmFsaWRfZHVyYXRpb25faHJzKSkKLQkJIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19wcmVkaWN0ZWRfb3JiaXRzX2F1dG9fZG93bmxvYWRfY29uZmlnX3NfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX3ByZWRpY3RlZF9vcmJpdHNfYXV0b19kb3dubG9hZF9jb25maWdfc190eXBlICpvYmpwKQotewotCXJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotCSBpZiAoIXhkcl9ycGNfYm9vbGVhbiAoeGRycywgJm9ianAtPmVuYWJsZSkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX3VfY2hhciAoeGRycywgJm9ianAtPmF1dG9fY2hlY2tfZXZlcnlfaHJzKSkKLQkJIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19hc3Npc3RfZGF0YV90aW1lX3NfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX2Fzc2lzdF9kYXRhX3RpbWVfc190eXBlICpvYmpwKQotewotCXJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotCSBpZiAoIXhkcl9ycGNfdWludDY0ICh4ZHJzLCAmb2JqcC0+dGltZV91dGMpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9ycGNfdWludDMyICh4ZHJzLCAmb2JqcC0+dW5jZXJ0YWludHkpKQotCQkgcmV0dXJuIEZBTFNFOwotCXJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfbG9jX2Fzc2lzdF9wb3NfdmFsaWRfbWFza190eXBlIChYRFIgKnhkcnMsIHJwY19sb2NfYXNzaXN0X3Bvc192YWxpZF9tYXNrX3R5cGUgKm9ianApCi17Ci0JcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0JIGlmICgheGRyX3JwY191aW50NjQgKHhkcnMsIG9ianApKQotCQkgcmV0dXJuIEZBTFNFOwotCXJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfbG9jX2Fzc2lzdF9kYXRhX3Bvc19zX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19hc3Npc3RfZGF0YV9wb3Nfc190eXBlICpvYmpwKQotewotCXJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotCSBpZiAoIXhkcl9ycGNfbG9jX2Fzc2lzdF9wb3NfdmFsaWRfbWFza190eXBlICh4ZHJzLCAmb2JqcC0+dmFsaWRfbWFzaykpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX3JwY191aW50NjQgKHhkcnMsICZvYmpwLT50aW1lc3RhbXBfdXRjKSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfZG91YmxlICh4ZHJzLCAmb2JqcC0+bGF0aXR1ZGUpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9kb3VibGUgKHhkcnMsICZvYmpwLT5sb25naXR1ZGUpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9mbG9hdCAoeGRycywgJm9ianAtPmFsdGl0dWRlX3dydF9lbGxpcHNvaWQpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9mbG9hdCAoeGRycywgJm9ianAtPmFsdGl0dWRlX3dydF9tZWFuX3NlYV9sZXZlbCkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX2Zsb2F0ICh4ZHJzLCAmb2JqcC0+aG9yX3VuY19jaXJjdWxhcikpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX2Zsb2F0ICh4ZHJzLCAmb2JqcC0+dmVydF91bmMpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl91X2NoYXIgKHhkcnMsICZvYmpwLT5jb25maWRlbmNlX2hvcml6b250YWwpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl91X2NoYXIgKHhkcnMsICZvYmpwLT5jb25maWRlbmNlX3ZlcnRpY2FsKSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfcnBjX2ludDMyICh4ZHJzLCAmb2JqcC0+dGltZXN0YW1wX2FnZSkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2Nfc2VydmVyX29wZW5fc3RhdHVzX2VfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX3NlcnZlcl9vcGVuX3N0YXR1c19lX3R5cGUgKm9ianApCi17Ci0JcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0JIGlmICgheGRyX2VudW0gKHhkcnMsIChlbnVtX3QgKikgb2JqcCkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2Nfc2VydmVyX29wZW5fc3RhdHVzX3NfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX3NlcnZlcl9vcGVuX3N0YXR1c19zX3R5cGUgKm9ianApCi17Ci0JcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0JaW50IGk7Ci0JIGlmICgheGRyX3JwY19sb2Nfc2VydmVyX2Nvbm5lY3Rpb25faGFuZGxlICh4ZHJzLCAmb2JqcC0+Y29ubl9oYW5kbGUpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9ycGNfbG9jX3NlcnZlcl9vcGVuX3N0YXR1c19lX3R5cGUgKHhkcnMsICZvYmpwLT5vcGVuX3N0YXR1cykpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX29wYXF1ZSAoeGRycywgb2JqcC0+YXBuX25hbWUsIDEwMCkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2Nfc2VydmVyX2Nsb3NlX3N0YXR1c19lX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19zZXJ2ZXJfY2xvc2Vfc3RhdHVzX2VfdHlwZSAqb2JqcCkKLXsKLQlyZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLQkgaWYgKCF4ZHJfZW51bSAoeGRycywgKGVudW1fdCAqKSBvYmpwKSkKLQkJIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19zZXJ2ZXJfY2xvc2Vfc3RhdHVzX3NfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX3NlcnZlcl9jbG9zZV9zdGF0dXNfc190eXBlICpvYmpwKQotewotCXJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotCSBpZiAoIXhkcl9ycGNfbG9jX3NlcnZlcl9jb25uZWN0aW9uX2hhbmRsZSAoeGRycywgJm9ianAtPmNvbm5faGFuZGxlKSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfcnBjX2xvY19zZXJ2ZXJfY2xvc2Vfc3RhdHVzX2VfdHlwZSAoeGRycywgJm9ianAtPmNsb3NlX3N0YXR1cykpCi0JCSByZXR1cm4gRkFMU0U7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2Nfd2lwZXJfZml4X3RpbWVfc190eXBlIChYRFIgKnhkcnMsIHJwY19sb2Nfd2lwZXJfZml4X3RpbWVfc190eXBlICpvYmpwKQotewotCXJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotCSBpZiAoIXhkcl9ycGNfdWludDMyICh4ZHJzLCAmb2JqcC0+c2xvd19jbG9ja19jb3VudCkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2Nfd2lwZXJfZml4X3Bvc19zX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY193aXBlcl9maXhfcG9zX3NfdHlwZSAqb2JqcCkKLXsKLQlyZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLQkgaWYgKCF4ZHJfcnBjX2ludDMyICh4ZHJzLCAmb2JqcC0+bGF0KSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfcnBjX2ludDMyICh4ZHJzLCAmb2JqcC0+bG9uKSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfcnBjX3VpbnQxNiAoeGRycywgJm9ianAtPkhFUEUpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9ycGNfdWludDggKHhkcnMsICZvYmpwLT5udW1fb2ZfYXBzX3VzZWQpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9ycGNfdWludDggKHhkcnMsICZvYmpwLT5maXhfZXJyb3JfY29kZSkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2Nfd2lwZXJfYXBfaW5mb19zX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY193aXBlcl9hcF9pbmZvX3NfdHlwZSAqb2JqcCkKLXsKLQlyZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLQlpbnQgaTsKLQkgaWYgKCF4ZHJfb3BhcXVlICh4ZHJzLCBvYmpwLT5tYWNfYWRkciwgNikpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX3JwY19pbnQzMiAoeGRycywgJm9ianAtPnJzc2kpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9ycGNfdWludDE2ICh4ZHJzLCAmb2JqcC0+Y2hhbm5lbCkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX3JwY191aW50OCAoeGRycywgJm9ianAtPmFwX3F1YWxpZmllcikpCi0JCSByZXR1cm4gRkFMU0U7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2Nfd2lwZXJfYXBfc2V0X3NfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX3dpcGVyX2FwX3NldF9zX3R5cGUgKm9ianApCi17Ci0JcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0JaW50IGk7Ci0JIGlmICgheGRyX3JwY191aW50OCAoeGRycywgJm9ianAtPm51bV9vZl9hcHMpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl92ZWN0b3IgKHhkcnMsIChjaGFyICopb2JqcC0+YXBfaW5mbywgNTAsCi0JCXNpemVvZiAocnBjX2xvY193aXBlcl9hcF9pbmZvX3NfdHlwZSksICh4ZHJwcm9jX3QpIHhkcl9ycGNfbG9jX3dpcGVyX2FwX2luZm9fc190eXBlKSkKLQkJIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY193aXBlcl9wb3NpdGlvbl9yZXBvcnRfc190eXBlIChYRFIgKnhkcnMsIHJwY19sb2Nfd2lwZXJfcG9zaXRpb25fcmVwb3J0X3NfdHlwZSAqb2JqcCkKLXsKLQlyZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLQkgaWYgKCF4ZHJfcnBjX3VpbnQ4ICh4ZHJzLCAmb2JqcC0+d2lwZXJfdmFsaWRfaW5mb19mbGFnKSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfcnBjX2xvY193aXBlcl9maXhfdGltZV9zX3R5cGUgKHhkcnMsICZvYmpwLT53aXBlcl9maXhfdGltZSkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX3JwY19sb2Nfd2lwZXJfZml4X3Bvc19zX3R5cGUgKHhkcnMsICZvYmpwLT53aXBlcl9maXhfcG9zaXRpb24pKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9ycGNfbG9jX3dpcGVyX2FwX3NldF9zX3R5cGUgKHhkcnMsICZvYmpwLT53aXBlcl9hcF9zZXQpKQotCQkgcmV0dXJuIEZBTFNFOwotCXJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfbG9jX3dpcGVyX3N0YXR1c19lX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY193aXBlcl9zdGF0dXNfZV90eXBlICpvYmpwKQotewotCXJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotCSBpZiAoIXhkcl9lbnVtICh4ZHJzLCAoZW51bV90ICopIG9ianApKQotCQkgcmV0dXJuIEZBTFNFOwotCXJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfbG9jX2ZzX29wZXJhdGlvbl9lX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19mc19vcGVyYXRpb25fZV90eXBlICpvYmpwKQotewotCXJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotCSBpZiAoIXhkcl9lbnVtICh4ZHJzLCAoZW51bV90ICopIG9ianApKQotCQkgcmV0dXJuIEZBTFNFOwotCXJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfbG9jX2Vmc19kYXRhX3NfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX2Vmc19kYXRhX3NfdHlwZSAqb2JqcCkKLXsKLQlyZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLQlpbnQgaTsKLQkgaWYgKCF4ZHJfb3BhcXVlICh4ZHJzLCBvYmpwLT5maWxlbmFtZSwgNjQpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9ycGNfbG9jX2ZzX29wZXJhdGlvbl9lX3R5cGUgKHhkcnMsICZvYmpwLT5vcGVyYXRpb24pKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9ycGNfdWludDMyICh4ZHJzLCAmb2JqcC0+dG90YWxfc2l6ZSkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX2J5dGVzICh4ZHJzLCAoY2hhciAqKikmb2JqcC0+ZGF0YV9wdHIuZGF0YV9wdHJfdmFsLCAodV9pbnQgKikgJm9ianAtPmRhdGFfcHRyLmRhdGFfcHRyX2xlbiwgfjApKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9ycGNfdWludDMyICh4ZHJzLCAmb2JqcC0+cGFydF9sZW4pKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9ycGNfdWludDggKHhkcnMsICZvYmpwLT5wYXJ0KSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfcnBjX3VpbnQ4ICh4ZHJzLCAmb2JqcC0+dG90YWxfcGFydHMpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9ycGNfdWludDMyICh4ZHJzLCAmb2JqcC0+cmVzZXJ2ZWQpKQotCQkgcmV0dXJuIEZBTFNFOwotCXJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfbG9jX2xvY2tfZV90eXBlIChYRFIgKnhkcnMsIHJwY19sb2NfbG9ja19lX3R5cGUgKm9ianApCi17Ci0JcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0JIGlmICgheGRyX2VudW0gKHhkcnMsIChlbnVtX3QgKikgb2JqcCkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2Nfbm1lYV9zZW50ZW5jZV90eXBlIChYRFIgKnhkcnMsIHJwY19sb2Nfbm1lYV9zZW50ZW5jZV90eXBlICpvYmpwKQotewotCXJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotCSBpZiAoIXhkcl9ycGNfdWludDMyICh4ZHJzLCBvYmpwKSkKLQkJIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19hc3Npc3RfZGF0YV90eXBlIChYRFIgKnhkcnMsIHJwY19sb2NfYXNzaXN0X2RhdGFfdHlwZSAqb2JqcCkKLXsKLQlyZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLQkgaWYgKCF4ZHJfcnBjX3VpbnQzMiAoeGRycywgb2JqcCkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2NfYXNzaXN0X2RhdGFfZGVsZXRlX3NfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX2Fzc2lzdF9kYXRhX2RlbGV0ZV9zX3R5cGUgKm9ianApCi17Ci0JcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0JaW50IGk7Ci0JIGlmICgheGRyX3JwY19sb2NfYXNzaXN0X2RhdGFfdHlwZSAoeGRycywgJm9ianAtPnR5cGUpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl92ZWN0b3IgKHhkcnMsIChjaGFyICopb2JqcC0+cmVzZXJ2ZWQsIDgsCi0JCXNpemVvZiAocnBjX3VpbnQzMiksICh4ZHJwcm9jX3QpIHhkcl9ycGNfdWludDMyKSkKLQkJIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19pb2N0bF9kYXRhX3VfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX2lvY3RsX2RhdGFfdV90eXBlICpvYmpwKQotewotCXJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotCSBpZiAoIXhkcl9ycGNfbG9jX2lvY3RsX2VfdHlwZSAoeGRycywgJm9ianAtPmRpc2MpKQotCQkgcmV0dXJuIEZBTFNFOwotCXN3aXRjaCAob2JqcC0+ZGlzYykgewotCWNhc2UgUlBDX0xPQ19JT0NUTF9TRVRfRklYX0NSSVRFUklBOgotCQkgaWYgKCF4ZHJfcnBjX2xvY19maXhfY3JpdGVyaWFfc190eXBlICh4ZHJzLCAmb2JqcC0+cnBjX2xvY19pb2N0bF9kYXRhX3VfdHlwZV91LmZpeF9jcml0ZXJpYSkpCi0JCQkgcmV0dXJuIEZBTFNFOwotCQlicmVhazsKLQljYXNlIFJQQ19MT0NfSU9DVExfSU5GT1JNX05JX1VTRVJfUkVTUE9OU0U6Ci0JCSBpZiAoIXhkcl9ycGNfbG9jX3VzZXJfdmVyaWZ5X3NfdHlwZSAoeGRycywgJm9ianAtPnJwY19sb2NfaW9jdGxfZGF0YV91X3R5cGVfdS51c2VyX3ZlcmlmeV9yZXNwKSkKLQkJCSByZXR1cm4gRkFMU0U7Ci0JCWJyZWFrOwotCWNhc2UgUlBDX0xPQ19JT0NUTF9JTkpFQ1RfUFJFRElDVEVEX09SQklUU19EQVRBOgotCQkgaWYgKCF4ZHJfcnBjX2xvY19wcmVkaWN0ZWRfb3JiaXRzX2RhdGFfc190eXBlICh4ZHJzLCAmb2JqcC0+cnBjX2xvY19pb2N0bF9kYXRhX3VfdHlwZV91LnByZWRpY3RlZF9vcmJpdHNfZGF0YSkpCi0JCQkgcmV0dXJuIEZBTFNFOwotCQlicmVhazsKLQljYXNlIFJQQ19MT0NfSU9DVExfU0VUX1BSRURJQ1RFRF9PUkJJVFNfREFUQV9BVVRPX0RPV05MT0FEOgotCQkgaWYgKCF4ZHJfcnBjX2xvY19wcmVkaWN0ZWRfb3JiaXRzX2F1dG9fZG93bmxvYWRfY29uZmlnX3NfdHlwZSAoeGRycywgJm9ianAtPnJwY19sb2NfaW9jdGxfZGF0YV91X3R5cGVfdS5wcmVkaWN0ZWRfb3JiaXRzX2F1dG9fZG93bmxvYWQpKQotCQkJIHJldHVybiBGQUxTRTsKLQkJYnJlYWs7Ci0JY2FzZSBSUENfTE9DX0lPQ1RMX0lOSkVDVF9VVENfVElNRToKLQkJIGlmICgheGRyX3JwY19sb2NfYXNzaXN0X2RhdGFfdGltZV9zX3R5cGUgKHhkcnMsICZvYmpwLT5ycGNfbG9jX2lvY3RsX2RhdGFfdV90eXBlX3UuYXNzaXN0YW5jZV9kYXRhX3RpbWUpKQotCQkJIHJldHVybiBGQUxTRTsKLQkJYnJlYWs7Ci0JY2FzZSBSUENfTE9DX0lPQ1RMX0lOSkVDVF9QT1NJVElPTjoKLQkJIGlmICgheGRyX3JwY19sb2NfYXNzaXN0X2RhdGFfcG9zX3NfdHlwZSAoeGRycywgJm9ianAtPnJwY19sb2NfaW9jdGxfZGF0YV91X3R5cGVfdS5hc3Npc3RhbmNlX2RhdGFfcG9zaXRpb24pKQotCQkJIHJldHVybiBGQUxTRTsKLQkJYnJlYWs7Ci0JY2FzZSBSUENfTE9DX0lPQ1RMX0lORk9STV9TRVJWRVJfT1BFTl9TVEFUVVM6Ci0JCSBpZiAoIXhkcl9ycGNfbG9jX3NlcnZlcl9vcGVuX3N0YXR1c19zX3R5cGUgKHhkcnMsICZvYmpwLT5ycGNfbG9jX2lvY3RsX2RhdGFfdV90eXBlX3UuY29ubl9vcGVuX3N0YXR1cykpCi0JCQkgcmV0dXJuIEZBTFNFOwotCQlicmVhazsKLQljYXNlIFJQQ19MT0NfSU9DVExfSU5GT1JNX1NFUlZFUl9DTE9TRV9TVEFUVVM6Ci0JCSBpZiAoIXhkcl9ycGNfbG9jX3NlcnZlcl9jbG9zZV9zdGF0dXNfc190eXBlICh4ZHJzLCAmb2JqcC0+cnBjX2xvY19pb2N0bF9kYXRhX3VfdHlwZV91LmNvbm5fY2xvc2Vfc3RhdHVzKSkKLQkJCSByZXR1cm4gRkFMU0U7Ci0JCWJyZWFrOwotCWNhc2UgUlBDX0xPQ19JT0NUTF9TRU5EX1dJUEVSX1BPU0lUSU9OX1JFUE9SVDoKLQkJIGlmICgheGRyX3JwY19sb2Nfd2lwZXJfcG9zaXRpb25fcmVwb3J0X3NfdHlwZSAoeGRycywgJm9ianAtPnJwY19sb2NfaW9jdGxfZGF0YV91X3R5cGVfdS53aXBlcl9wb3MpKQotCQkJIHJldHVybiBGQUxTRTsKLQkJYnJlYWs7Ci0JY2FzZSBSUENfTE9DX0lPQ1RMX05PVElGWV9XSVBFUl9TVEFUVVM6Ci0JCSBpZiAoIXhkcl9ycGNfbG9jX3dpcGVyX3N0YXR1c19lX3R5cGUgKHhkcnMsICZvYmpwLT5ycGNfbG9jX2lvY3RsX2RhdGFfdV90eXBlX3Uud2lwZXJfc3RhdHVzKSkKLQkJCSByZXR1cm4gRkFMU0U7Ci0JCWJyZWFrOwotCWNhc2UgUlBDX0xPQ19JT0NUTF9TRVRfRU5HSU5FX0xPQ0s6Ci0JCSBpZiAoIXhkcl9ycGNfbG9jX2xvY2tfZV90eXBlICh4ZHJzLCAmb2JqcC0+cnBjX2xvY19pb2N0bF9kYXRhX3VfdHlwZV91LmVuZ2luZV9sb2NrKSkKLQkJCSByZXR1cm4gRkFMU0U7Ci0JCWJyZWFrOwotCWNhc2UgUlBDX0xPQ19JT0NUTF9TRVRfU0JBU19DT05GSUc6Ci0JCSBpZiAoIXhkcl9ycGNfYm9vbGVhbiAoeGRycywgJm9ianAtPnJwY19sb2NfaW9jdGxfZGF0YV91X3R5cGVfdS5zYmFzX21vZGUpKQotCQkJIHJldHVybiBGQUxTRTsKLQkJYnJlYWs7Ci0JY2FzZSBSUENfTE9DX0lPQ1RMX1NFVF9OTUVBX1RZUEVTOgotCQkgaWYgKCF4ZHJfcnBjX2xvY19ubWVhX3NlbnRlbmNlX3R5cGUgKHhkcnMsICZvYmpwLT5ycGNfbG9jX2lvY3RsX2RhdGFfdV90eXBlX3Uubm1lYV90eXBlcykpCi0JCQkgcmV0dXJuIEZBTFNFOwotCQlicmVhazsKLQljYXNlIFJQQ19MT0NfSU9DVExfU0VUX09OX0RFTUFORF9MUE06Ci0JCSBpZiAoIXhkcl9ycGNfYm9vbGVhbiAoeGRycywgJm9ianAtPnJwY19sb2NfaW9jdGxfZGF0YV91X3R5cGVfdS5vbl9kZW1hbmRfbHBtKSkKLQkJCSByZXR1cm4gRkFMU0U7Ci0JCWJyZWFrOwotCWNhc2UgUlBDX0xPQ19JT0NUTF9TRVRfQ0RNQV9QREVfU0VSVkVSX0FERFI6Ci0JY2FzZSBSUENfTE9DX0lPQ1RMX1NFVF9DRE1BX01QQ19TRVJWRVJfQUREUjoKLQljYXNlIFJQQ19MT0NfSU9DVExfU0VUX1VNVFNfU0xQX1NFUlZFUl9BRERSOgotCWNhc2UgUlBDX0xPQ19JT0NUTF9TRVRfQ1VTVE9NX1BERV9TRVJWRVJfQUREUjoKLQkJIGlmICgheGRyX3JwY19sb2Nfc2VydmVyX2luZm9fc190eXBlICh4ZHJzLCAmb2JqcC0+cnBjX2xvY19pb2N0bF9kYXRhX3VfdHlwZV91LnNlcnZlcl9hZGRyKSkKLQkJCSByZXR1cm4gRkFMU0U7Ci0JCWJyZWFrOwotCWNhc2UgUlBDX0xPQ19JT0NUTF9ERUxFVEVfQVNTSVNUX0RBVEE6Ci0JCSBpZiAoIXhkcl9ycGNfbG9jX2Fzc2lzdF9kYXRhX2RlbGV0ZV9zX3R5cGUgKHhkcnMsICZvYmpwLT5ycGNfbG9jX2lvY3RsX2RhdGFfdV90eXBlX3UuYXNzaXN0X2RhdGFfZGVsZXRlKSkKLQkJCSByZXR1cm4gRkFMU0U7Ci0JCWJyZWFrOwotCWNhc2UgUlBDX0xPQ19JT0NUTF9BQ0NFU1NfRUZTX0RBVEE6Ci0JCSBpZiAoIXhkcl9ycGNfbG9jX2Vmc19kYXRhX3NfdHlwZSAoeGRycywgJm9ianAtPnJwY19sb2NfaW9jdGxfZGF0YV91X3R5cGVfdS5lZnNfZGF0YSkpCi0JCQkgcmV0dXJuIEZBTFNFOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2NfaW9jdGxfY2FsbGJhY2tfZGF0YV91X3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19pb2N0bF9jYWxsYmFja19kYXRhX3VfdHlwZSAqb2JqcCkKLXsKLQlyZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLQkgaWYgKCF4ZHJfcnBjX2xvY19pb2N0bF9lX3R5cGUgKHhkcnMsICZvYmpwLT5kaXNjKSkKLQkJIHJldHVybiBGQUxTRTsKLQlzd2l0Y2ggKG9ianAtPmRpc2MpIHsKLQljYXNlIFJQQ19MT0NfSU9DVExfR0VUX0FQSV9WRVJTSU9OOgotCQkgaWYgKCF4ZHJfcnBjX2xvY19hcGlfdmVyc2lvbl9zX3R5cGUgKHhkcnMsICZvYmpwLT5ycGNfbG9jX2lvY3RsX2NhbGxiYWNrX2RhdGFfdV90eXBlX3UuYXBpX3ZlcnNpb24pKQotCQkJIHJldHVybiBGQUxTRTsKLQkJYnJlYWs7Ci0JY2FzZSBSUENfTE9DX0lPQ1RMX0dFVF9GSVhfQ1JJVEVSSUE6Ci0JCSBpZiAoIXhkcl9ycGNfbG9jX2ZpeF9jcml0ZXJpYV9zX3R5cGUgKHhkcnMsICZvYmpwLT5ycGNfbG9jX2lvY3RsX2NhbGxiYWNrX2RhdGFfdV90eXBlX3UuZml4X2NyaXRlcmlhKSkKLQkJCSByZXR1cm4gRkFMU0U7Ci0JCWJyZWFrOwotCWNhc2UgUlBDX0xPQ19JT0NUTF9HRVRfRU5HSU5FX0xPQ0s6Ci0JCSBpZiAoIXhkcl9ycGNfbG9jX2xvY2tfZV90eXBlICh4ZHJzLCAmb2JqcC0+cnBjX2xvY19pb2N0bF9jYWxsYmFja19kYXRhX3VfdHlwZV91LmVuZ2luZV9sb2NrKSkKLQkJCSByZXR1cm4gRkFMU0U7Ci0JCWJyZWFrOwotCWNhc2UgUlBDX0xPQ19JT0NUTF9HRVRfU0JBU19DT05GSUc6Ci0JCSBpZiAoIXhkcl9ycGNfYm9vbGVhbiAoeGRycywgJm9ianAtPnJwY19sb2NfaW9jdGxfY2FsbGJhY2tfZGF0YV91X3R5cGVfdS5zYmFzX21vZGUpKQotCQkJIHJldHVybiBGQUxTRTsKLQkJYnJlYWs7Ci0JY2FzZSBSUENfTE9DX0lPQ1RMX0dFVF9OTUVBX1RZUEVTOgotCQkgaWYgKCF4ZHJfcnBjX2xvY19ubWVhX3NlbnRlbmNlX3R5cGUgKHhkcnMsICZvYmpwLT5ycGNfbG9jX2lvY3RsX2NhbGxiYWNrX2RhdGFfdV90eXBlX3Uubm1lYV90eXBlcykpCi0JCQkgcmV0dXJuIEZBTFNFOwotCQlicmVhazsKLQljYXNlIFJQQ19MT0NfSU9DVExfR0VUX09OX0RFTUFORF9MUE06Ci0JCSBpZiAoIXhkcl9ycGNfYm9vbGVhbiAoeGRycywgJm9ianAtPnJwY19sb2NfaW9jdGxfY2FsbGJhY2tfZGF0YV91X3R5cGVfdS5vbl9kZW1hbmRfbHBtKSkKLQkJCSByZXR1cm4gRkFMU0U7Ci0JCWJyZWFrOwotCWNhc2UgUlBDX0xPQ19JT0NUTF9HRVRfQ0RNQV9QREVfU0VSVkVSX0FERFI6Ci0JY2FzZSBSUENfTE9DX0lPQ1RMX0dFVF9DRE1BX01QQ19TRVJWRVJfQUREUjoKLQljYXNlIFJQQ19MT0NfSU9DVExfR0VUX1VNVFNfU0xQX1NFUlZFUl9BRERSOgotCWNhc2UgUlBDX0xPQ19JT0NUTF9HRVRfQ1VTVE9NX1BERV9TRVJWRVJfQUREUjoKLQkJIGlmICgheGRyX3JwY19sb2Nfc2VydmVyX2luZm9fc190eXBlICh4ZHJzLCAmb2JqcC0+cnBjX2xvY19pb2N0bF9jYWxsYmFja19kYXRhX3VfdHlwZV91LnNlcnZlcl9hZGRyKSkKLQkJCSByZXR1cm4gRkFMU0U7Ci0JCWJyZWFrOwotCWNhc2UgUlBDX0xPQ19JT0NUTF9RVUVSWV9QUkVESUNURURfT1JCSVRTX0RBVEFfU09VUkNFOgotCQkgaWYgKCF4ZHJfcnBjX2xvY19wcmVkaWN0ZWRfb3JiaXRzX2RhdGFfc291cmNlX3NfdHlwZSAoeGRycywgJm9ianAtPnJwY19sb2NfaW9jdGxfY2FsbGJhY2tfZGF0YV91X3R5cGVfdS5wcmVkaWN0ZWRfb3JiaXRzX2RhdGFfc291cmNlKSkKLQkJCSByZXR1cm4gRkFMU0U7Ci0JCWJyZWFrOwotCWNhc2UgUlBDX0xPQ19JT0NUTF9RVUVSWV9QUkVESUNURURfT1JCSVRTX0RBVEFfVkFMSURJVFk6Ci0JCSBpZiAoIXhkcl9ycGNfbG9jX3ByZWRpY3RlZF9vcmJpdHNfZGF0YV92YWxpZGl0eV9yZXBvcnRfc190eXBlICh4ZHJzLCAmb2JqcC0+cnBjX2xvY19pb2N0bF9jYWxsYmFja19kYXRhX3VfdHlwZV91LnByZWRpY3RlZF9vcmJpdHNfZGF0YV92YWxpZGl0eSkpCi0JCQkgcmV0dXJuIEZBTFNFOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2NfaW9jdGxfY2FsbGJhY2tfc190eXBlIChYRFIgKnhkcnMsIHJwY19sb2NfaW9jdGxfY2FsbGJhY2tfc190eXBlICpvYmpwKQotewotCXJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotCSBpZiAoIXhkcl9ycGNfbG9jX2lvY3RsX2VfdHlwZSAoeGRycywgJm9ianAtPnR5cGUpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9ycGNfaW50MzIgKHhkcnMsICZvYmpwLT5zdGF0dXMpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9ycGNfbG9jX2lvY3RsX2NhbGxiYWNrX2RhdGFfdV90eXBlICh4ZHJzLCAmb2JqcC0+ZGF0YSkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2NfZXZlbnRfcGF5bG9hZF91X3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19ldmVudF9wYXlsb2FkX3VfdHlwZSAqb2JqcCkKLXsKLQlyZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLQkgaWYgKCF4ZHJfdV9xdWFkX3QgKHhkcnMsICZvYmpwLT5kaXNjKSkKLQkJIHJldHVybiBGQUxTRTsKLQlzd2l0Y2ggKG9ianAtPmRpc2MpIHsKLQljYXNlIFJQQ19MT0NfRVZFTlRfUEFSU0VEX1BPU0lUSU9OX1JFUE9SVDoKLQkJIGlmICgheGRyX3JwY19sb2NfcGFyc2VkX3Bvc2l0aW9uX3NfdHlwZSAoeGRycywgJm9ianAtPnJwY19sb2NfZXZlbnRfcGF5bG9hZF91X3R5cGVfdS5wYXJzZWRfbG9jYXRpb25fcmVwb3J0KSkKLQkJCSByZXR1cm4gRkFMU0U7Ci0JCWJyZWFrOwotCWNhc2UgUlBDX0xPQ19FVkVOVF9TQVRFTExJVEVfUkVQT1JUOgotCQkgaWYgKCF4ZHJfcnBjX2xvY19nbnNzX2luZm9fc190eXBlICh4ZHJzLCAmb2JqcC0+cnBjX2xvY19ldmVudF9wYXlsb2FkX3VfdHlwZV91Lmduc3NfcmVwb3J0KSkKLQkJCSByZXR1cm4gRkFMU0U7Ci0JCWJyZWFrOwotCWNhc2UgUlBDX0xPQ19FVkVOVF9OTUVBX1BPU0lUSU9OX1JFUE9SVDoKLQkJIGlmICgheGRyX3JwY19sb2Nfbm1lYV9yZXBvcnRfc190eXBlICh4ZHJzLCAmb2JqcC0+cnBjX2xvY19ldmVudF9wYXlsb2FkX3VfdHlwZV91Lm5tZWFfcmVwb3J0KSkKLQkJCSByZXR1cm4gRkFMU0U7Ci0JCWJyZWFrOwotCWNhc2UgUlBDX0xPQ19FVkVOVF9OSV9OT1RJRllfVkVSSUZZX1JFUVVFU1Q6Ci0JCSBpZiAoIXhkcl9ycGNfbG9jX25pX2V2ZW50X3NfdHlwZSAoeGRycywgJm9ianAtPnJwY19sb2NfZXZlbnRfcGF5bG9hZF91X3R5cGVfdS5uaV9yZXF1ZXN0KSkKLQkJCSByZXR1cm4gRkFMU0U7Ci0JCWJyZWFrOwotCWNhc2UgUlBDX0xPQ19FVkVOVF9BU1NJU1RBTkNFX0RBVEFfUkVRVUVTVDoKLQkJIGlmICgheGRyX3JwY19sb2NfYXNzaXN0X2RhdGFfcmVxdWVzdF9zX3R5cGUgKHhkcnMsICZvYmpwLT5ycGNfbG9jX2V2ZW50X3BheWxvYWRfdV90eXBlX3UuYXNzaXN0X2RhdGFfcmVxdWVzdCkpCi0JCQkgcmV0dXJuIEZBTFNFOwotCQlicmVhazsKLQljYXNlIFJQQ19MT0NfRVZFTlRfTE9DQVRJT05fU0VSVkVSX1JFUVVFU1Q6Ci0JCSBpZiAoIXhkcl9ycGNfbG9jX3NlcnZlcl9yZXF1ZXN0X3NfdHlwZSAoeGRycywgJm9ianAtPnJwY19sb2NfZXZlbnRfcGF5bG9hZF91X3R5cGVfdS5sb2Nfc2VydmVyX3JlcXVlc3QpKQotCQkJIHJldHVybiBGQUxTRTsKLQkJYnJlYWs7Ci0JY2FzZSBSUENfTE9DX0VWRU5UX0lPQ1RMX1JFUE9SVDoKLQkJIGlmICgheGRyX3JwY19sb2NfaW9jdGxfY2FsbGJhY2tfc190eXBlICh4ZHJzLCAmb2JqcC0+cnBjX2xvY19ldmVudF9wYXlsb2FkX3VfdHlwZV91LmlvY3RsX3JlcG9ydCkpCi0JCQkgcmV0dXJuIEZBTFNFOwotCQlicmVhazsKLQljYXNlIFJQQ19MT0NfRVZFTlRfU1RBVFVTX1JFUE9SVDoKLQkJIGlmICgheGRyX3JwY19sb2Nfc3RhdHVzX2V2ZW50X3NfdHlwZSAoeGRycywgJm9ianAtPnJwY19sb2NfZXZlbnRfcGF5bG9hZF91X3R5cGVfdS5zdGF0dXNfcmVwb3J0KSkKLQkJCSByZXR1cm4gRkFMU0U7Ci0JCWJyZWFrOwotCWNhc2UgUlBDX0xPQ19FVkVOVF9XUFNfTkVFREVEX1JFUVVFU1Q6Ci0JCSBpZiAoIXhkcl9ycGNfbG9jX3F3aXBfcmVxdWVzdF9zX3R5cGUgKHhkcnMsICZvYmpwLT5ycGNfbG9jX2V2ZW50X3BheWxvYWRfdV90eXBlX3UucXdpcF9yZXF1ZXN0KSkKLQkJCSByZXR1cm4gRkFMU0U7Ci0JCWJyZWFrOwotCWNhc2UgUlBDX0xPQ19FVkVOVF9SRVNFUlZFRDoKLQkJIGlmICgheGRyX3JwY19sb2NfcmVzZXJ2ZWRfcGF5bG9hZF9zX3R5cGUgKHhkcnMsICZvYmpwLT5ycGNfbG9jX2V2ZW50X3BheWxvYWRfdV90eXBlX3UucmVzZXJ2ZWQpKQotCQkJIHJldHVybiBGQUxTRTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCXJldHVybiBUUlVFOwotfQpkaWZmIC0tZ2l0IGEvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGktcnBjL2dlbi0xMjQwL2xvY19hcGlfZml4dXAuYyBiL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpLXJwYy9nZW4tMTI0MC9sb2NfYXBpX2ZpeHVwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlNTEyZjUuLjAwMDAwMDAKLS0tIGEvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGktcnBjL2dlbi0xMjQwL2xvY19hcGlfZml4dXAuYworKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgICAgICAgICAgICAgICAgICAgIEwgTyBDIF8gQSBQIEkgXyBGIEkgWCBVIFAgLiBDCi0KLUdFTkVSQUwgREVTQ1JJUFRJT04KLSAgVGhpcyBmaWxlIGFkZHMgQVBJIGNvbnN0YW50cyB0aGF0IGFyZSBub3QgYXV0b21hdGljYWxseSB0cmFuc21pdHRlZCB0bwotICB0aGUgUlBDIHN0dWJzLCBhbmQgaXQgYWxzbyBmaXhlcyBvdGhlciBSUEMtcmVsYXRlZCBwcm9ibGVtcy4KLQotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUNvcHlyaWdodCAoYykgMjAwOSwgUVVBTENPTU0gVVNBLCBJTkMuCi0KLUFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLQottyAgICAgICAgIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0KLbcgICAgICAgICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uIAotCi23ICAgICAgICAgTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgUVVBTENPTU0gVVNBLCBJTkMuICBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAKLQotVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLSNpbmNsdWRlIDxycGMvcnBjLmg+Ci0KLSNpbmNsdWRlICJsb2NfYXBpX2ZpeHVwLmgiCi0KLSNpZmRlZiBBRERfWERSX0ZMT0FUCi0KLWludAoteGRyX2Zsb2F0KHhkcnAsIGZwKQotICAgICAgICBYRFIgKnhkcnA7IAotICAgICAgICBmbG9hdCAqZnA7Ci17Ci0gICAgICAgIHJldHVybiB4ZHJfbG9uZyh4ZHJwLCAobG9uZyopZnApOwotfSAgICAKLQotaW50ICAKLXhkcl9kb3VibGUoeGRycCwgZHApCi0gICAgICAgIFhEUiAqeGRycDsKLSAgICAgICAgZG91YmxlICpkcDsgCi17Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHhkcl9sb25nKHhkcnAsIChsb25nKilkcCArIDEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHhkcl9sb25nKHhkcnAsIChsb25nKilkcCk7Ci19IAotCi0jZW5kaWYgLyogQUREX1hEUl9GTE9BVCAqLwpkaWZmIC0tZ2l0IGEvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGktcnBjL2dlbi0xMjQwL2xvY19hcGlfcnBjX2dsdWUuYyBiL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpLXJwYy9nZW4tMTI0MC9sb2NfYXBpX3JwY19nbHVlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiYWNhOGIuLjAwMDAwMDAKLS0tIGEvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGktcnBjL2dlbi0xMjQwL2xvY19hcGlfcnBjX2dsdWUuYworKysgL2Rldi9udWxsCkBAIC0xLDMzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gIEBmaWxlICBsb2NfYXBpX3JwY19nbHVlLmMKLSAgQGJyaWVmIEFuZHJvaWQgTG9jIEFQSSBnbHVlIGNvZGUgdXNpbmcgcnBjZ2VuLgotCi0gIERFU0NSSVBUSU9OCi0gIExvYyBBUEkgZ2x1ZSBjb2RlIGZvciBBbmRyb2lkCi0KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUNvcHlyaWdodCAoYykgMjAwOSwgUVVBTENPTU0gVVNBLCBJTkMuCi0KLUFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLQottyAgICAgICAgIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0KLbcgICAgICAgICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uIAotCi23ICAgICAgICAgTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgUVVBTENPTU0gVVNBLCBJTkMuICBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAKLQotVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICAgICAgICAgICAgICAgICAgICAgRURJVCBISVNUT1JZIEZPUiBNT0RVTEUKLQotICBUaGlzIHNlY3Rpb24gY29udGFpbnMgY29tbWVudHMgZGVzY3JpYmluZyBjaGFuZ2VzIG1hZGUgdG8gdGhlIG1vZHVsZS4KLSAgTm90aWNlIHRoYXQgY2hhbmdlcyBhcmUgbGlzdGVkIGluIHJldmVyc2UgY2hyb25vbG9naWNhbCBvcmRlci4KLQotd2hlbiAgICAgICB3aG8gICAgICB3aGF0LCB3aGVyZSwgd2h5IAotLS0tLS0tLS0gICAtLS0gICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAotMDMvMDUvMjAwOSAgIGR4ICAgICAgIEluaXRpYWwgdmVyc2lvbgotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8gCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgICAgICAgICAgICAgICAgICBJTkNMVURFIEZJTEVTIEZPUiBNT0RVTEUKLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0vLyNkZWZpbmUgTE9HX05EREVCVUcgMAotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxwdGhyZWFkLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzeXMvc2VsZWN0Lmg+Ci0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8c3lzL21tYW4uaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLQotI2luY2x1ZGUgPHJwYy9ycGMuaD4KLSNpbmNsdWRlIDxycGMvY2xudC5oPgotCi0vKiBJbmNsdWRlIFJQQyBoZWFkZXJzICovCi0jaW5jbHVkZSAibG9jX2FwaV9ycGNfZ2x1ZS5oIgotCi0vKiBDYWxsYmFjayBpbml0ICovCi0jaW5jbHVkZSAibG9jX2FwaWNiX2FwcGluaXQuaCIKLQotLyogTG9nZ2luZyAqLwotI2RlZmluZSBMT0dfVEFHICJsaWJfYXBpX3JwY19nbHVlIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0vKiBDb21tZW50IHRoaXMgb3V0IHRvIGVuYWJsZSBsb2dnaW5nICovCi0jdW5kZWYgTE9HRAotI2RlZmluZSBMT0dEKC4uLikge30KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgRXh0ZXJuYWwgZGVjbGFyYXRpb25zCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotQ0xJRU5UKiBsb2NfYXBpX2NsbnQgPSBOVUxMOwotCi0vKiBDYWxsYmFjayBJRCBhbmQgcG9pbnRlciAqLwotI2RlZmluZSBMT0NfQVBJX0NCX0lEIDEgCi1sb2NfZXZlbnRfY2JfZl90eXBlICpsb2NfYXBpX3NhdmVkX2NiID0gTlVMTDsgIC8qIHRoZSBvbmx5IGNhbGxiYWNrIG9mIExvYyBBUEkgY2xpZW50ICovCi0KLSNkZWZpbmUgUlBDX0ZVTkNfVkVSU0lPTl9CQVNFKGEsYikgYSAjIyBiCi0jZGVmaW5lIFJQQ19GVU5DX1ZFUlNJT04oYSxiKSBSUENfRlVOQ19WRVJTSU9OX0JBU0UoYSxiKQotCi0jZGVmaW5lIExPQ19HTFVFX0NIRUNLX0lOSVQocmV0X3R5cGUpIFwKLSAgIGlmIChsb2NfYXBpX2NsbnQgPT0gTlVMTCkgeyByZXR1cm4gKHJldF90eXBlKSBSUENfTE9DX0FQSV9SUENfRkFJTFVSRTsgfQotCi0jZGVmaW5lIExPQ19HTFVFX0NIRUNLX1JFU1VMVChzdGF0LCByZXRfdHlwZSkgXAotICAgaWYgKHN0YXQgIT0gUlBDX1NVQ0NFU1MpIHsgcmV0dXJuIChyZXRfdHlwZSkgUlBDX0xPQ19BUElfUlBDX0ZBSUxVUkU7IH0gICAKLQotLyogQ2FsbGJhY2sgZnVuY3Rpb25zICovCi0vKiBSZXR1cm5zIDEgaWYgc3VjY2Vzc2Z1bCAqLwotYm9vbF90IHJwY19sb2NfZXZlbnRfY2JfZl90eXBlXzB4MDAwNDAwMDFfc3ZjKAotICAgICAgICBycGNfbG9jX2V2ZW50X2NiX2ZfdHlwZV9hcmdzICphcmdwLAotICAgICAgICBycGNfbG9jX2V2ZW50X2NiX2ZfdHlwZV9yZXRzICpyZXQsCi0gICAgICAgIHN0cnVjdCBzdmNfcmVxICpyZXEpCi17Ci0gICAgLyogQ2FsbGJhY2sgbm90IHJlZ2lzdGVyZWQsIG9yIHVuZXhwZWN0ZWQgSUQgKHNob3VsZG4ndCBoYXBwZW4pICovCi0gICAgaWYgKGxvY19hcGlfc2F2ZWRfY2IgPT0gTlVMTCB8fCBhcmdwLT5jYl9pZCAhPSBMT0NfQVBJX0NCX0lEKQotICAgIHsKLSAgICAgICAgTE9HRCgiV2FybmluZzogTm8gY2FsbGJhY2sgaGFuZGxlci5cbiIpOwotICAgICAgICByZXQtPmxvY19ldmVudF9jYl9mX3R5cGVfcmVzdWx0ID0gMDsKLSAgICAgICAgcmV0dXJuIDE7IC8qIHNpbXBseSByZXR1cm4gKi8KLSAgICB9Ci0KLSAgICBMT0dEKCJwcm9jOiAleCAgcHJvZzogJXggIHZlcnM6ICV4XG4iLAotICAgICAgICAgICAgKGludCkgcmVxLT5ycV9wcm9jLAotICAgICAgICAgICAgKGludCkgcmVxLT5ycV9wcm9nLAotICAgICAgICAgICAgKGludCkgcmVxLT5ycV92ZXJzKTsKLQotICAgIExPR0QoIkNhbGxiYWNrIHJlY2VpdmVkOiAleCAoaGFuZGxlPSVkIHJldF9wdHI9JWQpXG4iLAotICAgICAgICAgICAgKGludCkgYXJncC0+bG9jX2V2ZW50LAotICAgICAgICAgICAgKGludCkgYXJncC0+bG9jX2hhbmRsZSwKLSAgICAgICAgICAgIChpbnQpIHJldCk7Ci0KLSAgICAvKiBGb3J3YXJkIGNhbGxiYWNrIHRvIHJlYWwgY2FsbGJhY2sgcHJvY2VkdXJlICovCi0gICAgcnBjX2xvY19jbGllbnRfaGFuZGxlX3R5cGUgICAgICAgIGxvY19oYW5kbGUgPSBhcmdwLT5sb2NfaGFuZGxlOwotICAgIHJwY19sb2NfZXZlbnRfbWFza190eXBlICAgICAgICAgICBsb2NfZXZlbnQgID0gYXJncC0+bG9jX2V2ZW50OwotICAgIGNvbnN0IHJwY19sb2NfZXZlbnRfcGF5bG9hZF91X3R5cGUqICBsb2NfZXZlbnRfcGF5bG9hZCA9Ci0gICAgICAgIChjb25zdCBycGNfbG9jX2V2ZW50X3BheWxvYWRfdV90eXBlKikgYXJncC0+bG9jX2V2ZW50X3BheWxvYWQ7Ci0KLSAgICBpbnQzMiByYyA9IGxvY19hcGlfc2F2ZWRfY2IobG9jX2hhbmRsZSwgbG9jX2V2ZW50LCBsb2NfZXZlbnRfcGF5bG9hZCk7Ci0gICAgcmV0LT5sb2NfZXZlbnRfY2JfZl90eXBlX3Jlc3VsdCA9IHJjOwotCi0gICAgcmV0dXJuIDE7IC8qIG9rICovCi19Ci0KLWludCBsb2NfYXBpY2Jwcm9nX2ZyZWVyZXN1bHQgKFNWQ1hQUlQgKnRyYW5zcCwgeGRycHJvY190IHhkcl9yZXN1bHQsIGNhZGRyX3QgcmVzdWx0KQotewotICAgIHhkcl9mcmVlICh4ZHJfcmVzdWx0LCByZXN1bHQpOwotCi0gICAgLyoKLSAgICAgKiBJbnNlcnQgYWRkaXRpb25hbCBmcmVlaW5nIGNvZGUgaGVyZSwgaWYgbmVlZGVkCi0gICAgICovCi0gICAgLy8gTE9HRCgiKioqKiogbG9jX2FwaWNicHJvZ19mcmVlcmVzdWx0XG4iKTsKLQotICAgIHJldHVybiAxOwotfQotCi1pbnQgbG9jX2FwaWNicHJvZ18weDAwMDQwMDAxX2ZyZWVyZXN1bHQgKFNWQ1hQUlQgKnRyYW5zcCwgeGRycHJvY190IHhkcl9yZXN1bHQsIGNhZGRyX3QgcmVzdWx0KQotewotICAgIHJldHVybiBsb2NfYXBpY2Jwcm9nX2ZyZWVyZXN1bHQgKHRyYW5zcCwgeGRyX3Jlc3VsdCwgcmVzdWx0KTsKLX0KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotRlVOQ1RJT04gbG9jX2FwaV9nbHVlX2luaXQKLQotREVTQ1JJUFRJT04KLSAgIEluaXRpYXRlcyB0aGUgUlBDIGNsaWVudAotCi1SRVRVUk4gVkFMVUUKLSAgIDEgZm9yIHN1Y2Nlc3MKLSAgIDAgZm9yIGZhaWx1cmUKLSAgIAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLWludCBsb2NfYXBpX2dsdWVfaW5pdCh2b2lkKQotewotICAgIGlmIChsb2NfYXBpX2NsbnQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIC8qIFByaW50IG1zZyAqLwotICAgICAgICBMT0dEKCJUcnlpbmcgdG8gY3JlYXRlIFJQQyBjbGllbnQuLi5cbiIpOwotICAgICAgICBsb2NfYXBpX2NsbnQgPSBjbG50X2NyZWF0ZShOVUxMLCBMT0NfQVBJUFJPRywgTE9DX0FQSVZFUlMsIE5VTEwpOwotICAgICAgICBMT0dEKCJDcmVhdGVkIGxvY19hcGlfY2xudCAtLS0tICV4XG4iLCAodW5zaWduZWQgaW50KWxvY19hcGlfY2xudCk7Ci0KLSAgICAgICAgaWYgKGxvY19hcGlfY2xudCA9PSBOVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yOiBjYW5ub3QgY3JlYXRlIFJQQyBjbGllbnQuXG4iKTsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogSW5pdCBSUEMgY2FsbGJhY2tzICovCi0gICAgICAgIGludCByYyA9IGxvY19hcGljYl9hcHBfaW5pdCgpOwotICAgICAgICBpZiAocmMgPj0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgTE9HRCgiTG9jIEFQSSBjYWxsYmFjayBpbml0aWFsaXplZC5cbiIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJMb2MgQVBJIGNhbGxiYWNrIGluaXRpYWxpemF0aW9uIGZhaWxlZC5cbiIpOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gMTsKLX0KLQotcnBjX2xvY19jbGllbnRfaGFuZGxlX3R5cGUgbG9jX29wZW4gKAotICAgICAgICBycGNfbG9jX2V2ZW50X21hc2tfdHlwZSAgZXZlbnRfcmVnX21hc2ssCi0gICAgICAgIGxvY19ldmVudF9jYl9mX3R5cGUgICAgICAqZXZlbnRfY2FsbGJhY2sKLSAgICApCi17Ci0gICAgTE9DX0dMVUVfQ0hFQ0tfSU5JVChycGNfbG9jX2NsaWVudF9oYW5kbGVfdHlwZSk7Ci0KLSAgICBycGNfbG9jX29wZW5fYXJncyBhcmdzOwotICAgIGFyZ3MuZXZlbnRfcmVnX21hc2sgPSBldmVudF9yZWdfbWFzazsKLSAgICBhcmdzLmV2ZW50X2NhbGxiYWNrID0gTE9DX0FQSV9DQl9JRDsKLSAgICBsb2NfYXBpX3NhdmVkX2NiID0gZXZlbnRfY2FsbGJhY2s7Ci0KLSAgICBycGNfbG9jX29wZW5fcmV0cyByZXRzOwotICAgIGVudW0gY2xudF9zdGF0IHN0YXQgPSBSUENfU1VDQ0VTUzsKLQotICAgIHN0YXQgPSBSUENfRlVOQ19WRVJTSU9OKHJwY19sb2Nfb3Blbl8sIC8qIExPQ19BUElWRVJTICovIDB4MDAwNDAwMDEpKCZhcmdzLCAmcmV0cywgbG9jX2FwaV9jbG50KTsKLSAgICBMT0NfR0xVRV9DSEVDS19SRVNVTFQoc3RhdCwgaW50MzIpOwotCi0gICAgcmV0dXJuIChycGNfbG9jX2NsaWVudF9oYW5kbGVfdHlwZSkgcmV0cy5sb2Nfb3Blbl9yZXN1bHQ7Ci19Ci0KLWludDMyIGxvY19jbG9zZShycGNfbG9jX2NsaWVudF9oYW5kbGVfdHlwZSBoYW5kbGUpCi17Ci0gICAgTE9DX0dMVUVfQ0hFQ0tfSU5JVChpbnQzMik7Ci0KLSAgICBycGNfbG9jX2Nsb3NlX2FyZ3MgYXJnczsKLSAgICBhcmdzLmhhbmRsZSA9IGhhbmRsZTsKLQotICAgIHJwY19sb2NfY2xvc2VfcmV0cyByZXRzOwotICAgIGVudW0gY2xudF9zdGF0IHN0YXQgPSBSUENfU1VDQ0VTUzsKLQotICAgIHN0YXQgPSBSUENfRlVOQ19WRVJTSU9OKHJwY19sb2NfY2xvc2VfLCAvKiBMT0NfQVBJVkVSUyAqLyAweDAwMDQwMDAxKSgmYXJncywgJnJldHMsIGxvY19hcGlfY2xudCk7Ci0gICAgTE9DX0dMVUVfQ0hFQ0tfUkVTVUxUKHN0YXQsIGludDMyKTsKLQotICAgIHJldHVybiAoaW50MzIpIHJldHMubG9jX2Nsb3NlX3Jlc3VsdDsKLX0KLQotaW50MzIgbG9jX3N0YXJ0X2ZpeChycGNfbG9jX2NsaWVudF9oYW5kbGVfdHlwZSBoYW5kbGUpCi17Ci0gICAgTE9DX0dMVUVfQ0hFQ0tfSU5JVChpbnQzMik7Ci0KLSAgICBycGNfbG9jX3N0YXJ0X2ZpeF9hcmdzIGFyZ3M7Ci0gICAgYXJncy5oYW5kbGUgPSBoYW5kbGU7Ci0KLSAgICBycGNfbG9jX3N0YXJ0X2ZpeF9yZXRzIHJldHM7Ci0gICAgZW51bSBjbG50X3N0YXQgc3RhdCA9IFJQQ19TVUNDRVNTOwotCi0gICAgc3RhdCA9IFJQQ19GVU5DX1ZFUlNJT04ocnBjX2xvY19zdGFydF9maXhfLCAvKiBMT0NfQVBJVkVSUyAqLyAweDAwMDQwMDAxKSgmYXJncywgJnJldHMsIGxvY19hcGlfY2xudCk7Ci0gICAgTE9DX0dMVUVfQ0hFQ0tfUkVTVUxUKHN0YXQsIGludDMyKTsKLQotICAgIHJldHVybiAoaW50MzIpIHJldHMubG9jX3N0YXJ0X2ZpeF9yZXN1bHQ7Ci19Ci0KLWludDMyIGxvY19zdG9wX2ZpeChycGNfbG9jX2NsaWVudF9oYW5kbGVfdHlwZSBoYW5kbGUpCi17Ci0gICAgTE9DX0dMVUVfQ0hFQ0tfSU5JVChpbnQzMik7Ci0KLSAgICBycGNfbG9jX3N0b3BfZml4X2FyZ3MgYXJnczsKLSAgICBhcmdzLmhhbmRsZSA9IGhhbmRsZTsKLQotICAgIHJwY19sb2Nfc3RvcF9maXhfcmV0cyByZXRzOwotICAgIGVudW0gY2xudF9zdGF0IHN0YXQgPSBSUENfU1VDQ0VTUzsKLQotICAgIHN0YXQgPSBSUENfRlVOQ19WRVJTSU9OKHJwY19sb2Nfc3RvcF9maXhfLCAvKiBMT0NfQVBJVkVSUyAqLyAweDAwMDQwMDAxKSgmYXJncywgJnJldHMsIGxvY19hcGlfY2xudCk7Ci0gICAgTE9DX0dMVUVfQ0hFQ0tfUkVTVUxUKHN0YXQsIGludDMyKTsKLQotICAgIHJldHVybiAoaW50MzIpIHJldHMubG9jX3N0b3BfZml4X3Jlc3VsdDsKLX0KLQotaW50MzIgbG9jX2lvY3RsKAotICAgIHJwY19sb2NfY2xpZW50X2hhbmRsZV90eXBlICAgICAgICAgICBoYW5kbGUsCi0gICAgcnBjX2xvY19pb2N0bF9lX3R5cGUgICAgICAgICAgICAgICAgIGlvY3RsX3R5cGUsCi0gICAgcnBjX2xvY19pb2N0bF9kYXRhX3VfdHlwZSogICAgICAgICAgIGlvY3RsX2RhdGEKLSAgICApCi17Ci0gICAgTE9DX0dMVUVfQ0hFQ0tfSU5JVChpbnQzMik7Ci0KLSAgICBycGNfbG9jX2lvY3RsX2FyZ3MgYXJnczsKLSAgICBhcmdzLmhhbmRsZSA9IGhhbmRsZTsKLSAgICBhcmdzLmlvY3RsX2RhdGEgPSBpb2N0bF9kYXRhOwotICAgIGFyZ3MuaW9jdGxfdHlwZSA9IGlvY3RsX3R5cGU7Ci0gICAgaWYgKGlvY3RsX2RhdGEgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIC8qIEFzc2lnbiBpb2N0bCB1bmlvbiBkaXNjcmltaW5hdG9yICovCi0gICAgICAgIGlvY3RsX2RhdGEtPmRpc2MgPSBpb2N0bF90eXBlOwotCi0gICAgICAgIC8qIEluIGNhc2UgdGhlIHVzZXIgaGFzbid0IGZpbGxlZCBpbiBvdGhlciBkaXNjIGZpZWxkcywKLSAgICAgICAgICAgYXV0b21hdGljYWxseSBmaWxsIHRoZW0gaW4gaGVyZSAqLwotICAgICAgICBzd2l0Y2ggKGlvY3RsX3R5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgUlBDX0xPQ19JT0NUTF9HRVRfQVBJX1ZFUlNJT046Ci0gICAgICAgICAgICBjYXNlIFJQQ19MT0NfSU9DVExfU0VUX0ZJWF9DUklURVJJQToKLSAgICAgICAgICAgIGNhc2UgUlBDX0xPQ19JT0NUTF9HRVRfRklYX0NSSVRFUklBOgotICAgICAgICAgICAgY2FzZSBSUENfTE9DX0lPQ1RMX0lORk9STV9OSV9VU0VSX1JFU1BPTlNFOgotICAgICAgICAgICAgY2FzZSBSUENfTE9DX0lPQ1RMX0lOSkVDVF9QUkVESUNURURfT1JCSVRTX0RBVEE6Ci0gICAgICAgICAgICBjYXNlIFJQQ19MT0NfSU9DVExfUVVFUllfUFJFRElDVEVEX09SQklUU19EQVRBX1ZBTElESVRZOgotICAgICAgICAgICAgY2FzZSBSUENfTE9DX0lPQ1RMX1FVRVJZX1BSRURJQ1RFRF9PUkJJVFNfREFUQV9TT1VSQ0U6Ci0gICAgICAgICAgICBjYXNlIFJQQ19MT0NfSU9DVExfU0VUX1BSRURJQ1RFRF9PUkJJVFNfREFUQV9BVVRPX0RPV05MT0FEOgotICAgICAgICAgICAgY2FzZSBSUENfTE9DX0lPQ1RMX0lOSkVDVF9VVENfVElNRToKLSAgICAgICAgICAgIGNhc2UgUlBDX0xPQ19JT0NUTF9JTkpFQ1RfUlRDX1ZBTFVFOgotICAgICAgICAgICAgY2FzZSBSUENfTE9DX0lPQ1RMX0lOSkVDVF9QT1NJVElPTjoKLSAgICAgICAgICAgIGNhc2UgUlBDX0xPQ19JT0NUTF9RVUVSWV9FTkdJTkVfU1RBVEU6Ci0gICAgICAgICAgICBjYXNlIFJQQ19MT0NfSU9DVExfSU5GT1JNX1NFUlZFUl9PUEVOX1NUQVRVUzoKLSAgICAgICAgICAgIGNhc2UgUlBDX0xPQ19JT0NUTF9JTkZPUk1fU0VSVkVSX0NMT1NFX1NUQVRVUzoKLSAgICAgICAgICAgIGNhc2UgUlBDX0xPQ19JT0NUTF9TRVRfRU5HSU5FX0xPQ0s6Ci0gICAgICAgICAgICBjYXNlIFJQQ19MT0NfSU9DVExfR0VUX0VOR0lORV9MT0NLOgotICAgICAgICAgICAgY2FzZSBSUENfTE9DX0lPQ1RMX1NFVF9TQkFTX0NPTkZJRzoKLSAgICAgICAgICAgIGNhc2UgUlBDX0xPQ19JT0NUTF9HRVRfU0JBU19DT05GSUc6Ci0gICAgICAgICAgICBjYXNlIFJQQ19MT0NfSU9DVExfU0VUX05NRUFfVFlQRVM6Ci0gICAgICAgICAgICBjYXNlIFJQQ19MT0NfSU9DVExfR0VUX05NRUFfVFlQRVM6Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFJQQ19MT0NfSU9DVExfU0VUX0NETUFfUERFX1NFUlZFUl9BRERSOgotICAgICAgICAgICAgY2FzZSBSUENfTE9DX0lPQ1RMX1NFVF9DRE1BX01QQ19TRVJWRVJfQUREUjoKLSAgICAgICAgICAgIGNhc2UgUlBDX0xPQ19JT0NUTF9TRVRfVU1UU19TTFBfU0VSVkVSX0FERFI6Ci0gICAgICAgICAgICAgICAgYXJncy5pb2N0bF9kYXRhLT5ycGNfbG9jX2lvY3RsX2RhdGFfdV90eXBlX3Uuc2VydmVyX2FkZHIuYWRkcl9pbmZvLmRpc2MgPQotICAgICAgICAgICAgICAgICAgICBhcmdzLmlvY3RsX2RhdGEtPnJwY19sb2NfaW9jdGxfZGF0YV91X3R5cGVfdS5zZXJ2ZXJfYWRkci5hZGRyX3R5cGU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFJQQ19MT0NfSU9DVExfR0VUX0NETUFfUERFX1NFUlZFUl9BRERSOgotICAgICAgICAgICAgY2FzZSBSUENfTE9DX0lPQ1RMX0dFVF9DRE1BX01QQ19TRVJWRVJfQUREUjoKLSAgICAgICAgICAgIGNhc2UgUlBDX0xPQ19JT0NUTF9HRVRfVU1UU19TTFBfU0VSVkVSX0FERFI6Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFJQQ19MT0NfSU9DVExfU0VUX09OX0RFTUFORF9MUE06Ci0gICAgICAgICAgICBjYXNlIFJQQ19MT0NfSU9DVExfR0VUX09OX0RFTUFORF9MUE06Ci0gICAgICAgICAgICBjYXNlIFJQQ19MT0NfSU9DVExfREVMRVRFX0FTU0lTVF9EQVRBOgotICAgICAgICAgICAgY2FzZSBSUENfTE9DX0lPQ1RMX1NFVF9DVVNUT01fUERFX1NFUlZFUl9BRERSOgotICAgICAgICAgICAgY2FzZSBSUENfTE9DX0lPQ1RMX0dFVF9DVVNUT01fUERFX1NFUlZFUl9BRERSOgotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfSAvKiBzd2l0Y2ggKi8KLSAgICB9IC8qIGlvY3RsX2RhdGEgIT0gTlVMTCAqLwotCi0gICAgcnBjX2xvY19pb2N0bF9yZXRzIHJldHM7Ci0gICAgZW51bSBjbG50X3N0YXQgc3RhdCA9IFJQQ19TVUNDRVNTOwotCi0gICAgc3RhdCA9IFJQQ19GVU5DX1ZFUlNJT04ocnBjX2xvY19pb2N0bF8sIC8qIExPQ19BUElWRVJTICovIDB4MDAwNDAwMDEpKCZhcmdzLCAmcmV0cywgbG9jX2FwaV9jbG50KTsKLSAgICBMT0NfR0xVRV9DSEVDS19SRVNVTFQoc3RhdCwgaW50MzIpOwotCi0gICAgcmV0dXJuIChpbnQzMikgcmV0cy5sb2NfaW9jdGxfcmVzdWx0OwotfQotCi0vKiBSZXR1cm5zIDAgaWYgZXJyb3IgKi8KLWludDMyIGxvY19hcGlfbnVsbCh2b2lkKQotewotICAgIExPQ19HTFVFX0NIRUNLX0lOSVQoaW50MzIpOwotCi0gICAgaW50MzIgcmV0czsKLSAgICBlbnVtIGNsbnRfc3RhdCBzdGF0ID0gUlBDX1NVQ0NFU1M7Ci0KLSAgICBzdGF0ID0gUlBDX0ZVTkNfVkVSU0lPTihycGNfbG9jX2FwaV9udWxsXywgTE9DX0FQSVZFUlMpKE5VTEwsICZyZXRzLCBsb2NfYXBpX2NsbnQpOwotICAgIExPQ19HTFVFX0NIRUNLX1JFU1VMVChzdGF0LCBpbnQzMik7Ci0KLSAgICByZXR1cm4gKGludDMyKSByZXRzOwotfQpkaWZmIC0tZ2l0IGEvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGktcnBjL2dlbi0xMjQwL2xvY19hcGlfeGRyLmMgYi9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaS1ycGMvZ2VuLTEyNDAvbG9jX2FwaV94ZHIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM1ZjZiMS4uMDAwMDAwMAotLS0gYS9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaS1ycGMvZ2VuLTEyNDAvbG9jX2FwaV94ZHIuYworKysgL2Rldi9udWxsCkBAIC0xLDE3MSArMCwwIEBACi0vKgotICogUGxlYXNlIGRvIG5vdCBlZGl0IHRoaXMgZmlsZS4KLSAqIEl0IHdhcyBnZW5lcmF0ZWQgdXNpbmcgcnBjZ2VuLgotICovCi0KLSNpbmNsdWRlICJsb2NfYXBpLmgiCi0KLWJvb2xfdAoteGRyX3JwY19sb2NfYXBpX2FwaV92ZXJzaW9uc19yZXR1cm5fdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX2FwaV9hcGlfdmVyc2lvbnNfcmV0dXJuX3R5cGUgKm9ianApCi17Ci0JcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0JIGlmICgheGRyX2FycmF5ICh4ZHJzLCAoY2hhciAqKikmb2JqcC0+cnBjX2xvY19hcGlfYXBpX3ZlcnNpb25zX3JldHVybl90eXBlX3ZhbCwgKHVfaW50ICopICZvYmpwLT5ycGNfbG9jX2FwaV9hcGlfdmVyc2lvbnNfcmV0dXJuX3R5cGVfbGVuLCB+MCwKLQkJc2l6ZW9mIChycGNfdWludDMyKSwgKHhkcnByb2NfdCkgeGRyX3JwY191aW50MzIpKQotCQkgcmV0dXJuIEZBTFNFOwotCXJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfbG9jX2V2ZW50X2NiX2ZfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX2V2ZW50X2NiX2ZfdHlwZSAqb2JqcCkKLXsKLQlyZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLQkgaWYgKCF4ZHJfcnBjX3VpbnQzMiAoeGRycywgb2JqcCkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2Nfb3Blbl9hcmdzIChYRFIgKnhkcnMsIHJwY19sb2Nfb3Blbl9hcmdzICpvYmpwKQotewotCXJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotCSBpZiAoIXhkcl9ycGNfbG9jX2V2ZW50X21hc2tfdHlwZSAoeGRycywgJm9ianAtPmV2ZW50X3JlZ19tYXNrKSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfcnBjX2xvY19ldmVudF9jYl9mX3R5cGUgKHhkcnMsICZvYmpwLT5ldmVudF9jYWxsYmFjaykpCi0JCSByZXR1cm4gRkFMU0U7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2NfY2xvc2VfYXJncyAoWERSICp4ZHJzLCBycGNfbG9jX2Nsb3NlX2FyZ3MgKm9ianApCi17Ci0JcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0JIGlmICgheGRyX3JwY19sb2NfY2xpZW50X2hhbmRsZV90eXBlICh4ZHJzLCAmb2JqcC0+aGFuZGxlKSkKLQkJIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19zdGFydF9maXhfYXJncyAoWERSICp4ZHJzLCBycGNfbG9jX3N0YXJ0X2ZpeF9hcmdzICpvYmpwKQotewotCXJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotCSBpZiAoIXhkcl9ycGNfbG9jX2NsaWVudF9oYW5kbGVfdHlwZSAoeGRycywgJm9ianAtPmhhbmRsZSkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2Nfc3RvcF9maXhfYXJncyAoWERSICp4ZHJzLCBycGNfbG9jX3N0b3BfZml4X2FyZ3MgKm9ianApCi17Ci0JcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0JIGlmICgheGRyX3JwY19sb2NfY2xpZW50X2hhbmRsZV90eXBlICh4ZHJzLCAmb2JqcC0+aGFuZGxlKSkKLQkJIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19pb2N0bF9hcmdzIChYRFIgKnhkcnMsIHJwY19sb2NfaW9jdGxfYXJncyAqb2JqcCkKLXsKLQlyZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLQkgaWYgKCF4ZHJfcnBjX2xvY19jbGllbnRfaGFuZGxlX3R5cGUgKHhkcnMsICZvYmpwLT5oYW5kbGUpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9ycGNfbG9jX2lvY3RsX2VfdHlwZSAoeGRycywgJm9ianAtPmlvY3RsX3R5cGUpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9wb2ludGVyICh4ZHJzLCAoY2hhciAqKikmb2JqcC0+aW9jdGxfZGF0YSwgc2l6ZW9mIChycGNfbG9jX2lvY3RsX2RhdGFfdV90eXBlKSwgKHhkcnByb2NfdCkgeGRyX3JwY19sb2NfaW9jdGxfZGF0YV91X3R5cGUpKQotCQkgcmV0dXJuIEZBTFNFOwotCXJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfbG9jX2FwaV9hcGlfdmVyc2lvbl9zX2FyZ3MgKFhEUiAqeGRycywgcnBjX2xvY19hcGlfYXBpX3ZlcnNpb25fc19hcmdzICpvYmpwKQotewotCXJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotCSBpZiAoIXhkcl9ycGNfYm9vbGVhbiAoeGRycywgJm9ianAtPmxlbl9ub3RfbnVsbCkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2NfYXBpX3JwY19nbHVlX2NvZGVfaW5mb19yZW1vdGVfcmV0cyAoWERSICp4ZHJzLCBycGNfbG9jX2FwaV9ycGNfZ2x1ZV9jb2RlX2luZm9fcmVtb3RlX3JldHMgKm9ianApCi17Ci0JcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0JIGlmICgheGRyX3JwY191aW50MzIgKHhkcnMsICZvYmpwLT50b29sdmVycykpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX3JwY191aW50MzIgKHhkcnMsICZvYmpwLT5mZWF0dXJlcykpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX3JwY191aW50MzIgKHhkcnMsICZvYmpwLT5wcm9naGFzaCkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX3JwY191aW50MzIgKHhkcnMsICZvYmpwLT5jYnByb2doYXNoKSkKLQkJIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19vcGVuX3JldHMgKFhEUiAqeGRycywgcnBjX2xvY19vcGVuX3JldHMgKm9ianApCi17Ci0JcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0JIGlmICgheGRyX3JwY19sb2NfY2xpZW50X2hhbmRsZV90eXBlICh4ZHJzLCAmb2JqcC0+bG9jX29wZW5fcmVzdWx0KSkKLQkJIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19jbG9zZV9yZXRzIChYRFIgKnhkcnMsIHJwY19sb2NfY2xvc2VfcmV0cyAqb2JqcCkKLXsKLQlyZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLQkgaWYgKCF4ZHJfcnBjX2ludDMyICh4ZHJzLCAmb2JqcC0+bG9jX2Nsb3NlX3Jlc3VsdCkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2Nfc3RhcnRfZml4X3JldHMgKFhEUiAqeGRycywgcnBjX2xvY19zdGFydF9maXhfcmV0cyAqb2JqcCkKLXsKLQlyZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLQkgaWYgKCF4ZHJfcnBjX2ludDMyICh4ZHJzLCAmb2JqcC0+bG9jX3N0YXJ0X2ZpeF9yZXN1bHQpKQotCQkgcmV0dXJuIEZBTFNFOwotCXJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfbG9jX3N0b3BfZml4X3JldHMgKFhEUiAqeGRycywgcnBjX2xvY19zdG9wX2ZpeF9yZXRzICpvYmpwKQotewotCXJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotCSBpZiAoIXhkcl9ycGNfaW50MzIgKHhkcnMsICZvYmpwLT5sb2Nfc3RvcF9maXhfcmVzdWx0KSkKLQkJIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19pb2N0bF9yZXRzIChYRFIgKnhkcnMsIHJwY19sb2NfaW9jdGxfcmV0cyAqb2JqcCkKLXsKLQlyZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLQkgaWYgKCF4ZHJfcnBjX2ludDMyICh4ZHJzLCAmb2JqcC0+bG9jX2lvY3RsX3Jlc3VsdCkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2NfYXBpX2FwaV92ZXJzaW9uc19yZXRzIChYRFIgKnhkcnMsIHJwY19sb2NfYXBpX2FwaV92ZXJzaW9uc19yZXRzICpvYmpwKQotewotCXJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotCSBpZiAoIXhkcl9ycGNfbG9jX2FwaV9hcGlfdmVyc2lvbnNfcmV0dXJuX3R5cGUgKHhkcnMsICZvYmpwLT5sb2NfYXBpX2FwaV92ZXJzaW9uc19yZXN1bHQpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9wb2ludGVyICh4ZHJzLCAoY2hhciAqKikmb2JqcC0+bGVuLCBzaXplb2YgKHJwY191aW50MzIpLCAoeGRycHJvY190KSB4ZHJfcnBjX3VpbnQzMikpCi0JCSByZXR1cm4gRkFMU0U7Ci0JcmV0dXJuIFRSVUU7Ci19CmRpZmYgLS1naXQgYS9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaS1ycGMvZ2VuLTMyMDAvTWFrZWZpbGUueGRyIGIvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGktcnBjL2dlbi0zMjAwL01ha2VmaWxlLnhkcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ5Y2Y2Yy4uMDAwMDAwMAotLS0gYS9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaS1ycGMvZ2VuLTMyMDAvTWFrZWZpbGUueGRyCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotQ0xJRU5UUzo9IGxvY19hcGkKLVNFUlZFUlM6PSBsb2NfYXBpX2NiCi1DT01NT046PSBsb2NfYXBpX2NvbW1vbgotUlBDX0lOQzo9IGluYy0kKEFNU1NfVkVSU0lPTikKLQotYWxsOiAkKENMSUVOVFMpICQoU0VSVkVSUykgJChDT01NT04pIGZpeHVwCi0KLSQoQ0xJRU5UUykgJChTRVJWRVJTKSAkKENPTU1PTik6OiB4ZHIgPSAkKEA6PS54ZHIpIAotCi0kKENMSUVOVFMpICQoU0VSVkVSUykgJChDT01NT04pOjoKLQlycGNnZW4gLWggLU0gJCh4ZHIpIC1vIC4uLyQoUlBDX0lOQykvJChhZGRzdWZmaXggLmgsICRAKQotCXJwY2dlbiAtYyAtTSAkKHhkcikgLW8gJChhZGRzdWZmaXggX3hkci5jLCAkQCkKLQotJChDTElFTlRTKTo6Ci0JcnBjZ2VuIC1sIC1NICQoeGRyKSAtbyAkKGFkZHN1ZmZpeCBfY2xudC5jLCAkQCkKLQotJChTRVJWRVJTKTo6Ci0JcnBjZ2VuIC1tIC1NICQoeGRyKSAtbyAkKGFkZHN1ZmZpeCBfc3ZjLmMsICRAKQotCi1maXh1cDoKLQltdiAuLi8kKFJQQ19JTkMpL2xvY19hcGlfY29tbW9uLmggLi4vJChSUENfSU5DKS9sb2NfYXBpX2NvbW1vbi5oLmJhawotCXNlZCAuLi8kKFJQQ19JTkMpL2xvY19hcGlfY29tbW9uLmguYmFrIC1lICIvI2luY2x1ZGUgPHJwYy9hI2luY2x1ZGUgXCJsb2NfYXBpX2ZpeHVwLmhcIiIgPiAuLi8kKFJQQ19JTkMpL2xvY19hcGlfY29tbW9uLmgKLQlybSAtZiAuLi8kKFJQQ19JTkMpL2xvY19hcGlfY29tbW9uLmguYmFrCi0KLWNsZWFuOgotCXJtIC1mICQoYWRkc3VmZml4IF9jbG50LmMsICQoQ0xJRU5UUykpCi0Jcm0gLWYgJChhZGRzdWZmaXggX3N2Yy5jLCAkKFNFUlZFUlMpKQotCXJtIC1mICQoYWRkc3VmZml4IF94ZHIuYywgJChDTElFTlRTKSAkKFNFUlZFUlMpICQoQ09NTU9OKSkKLQlybSAtZiAkKGFkZHByZWZpeCAuLi8kKFJQQ19JTkMpLywgJChhZGRzdWZmaXggLmgsICQoQ0xJRU5UUykgJChTRVJWRVJTKSAkKENPTU1PTikpKQpkaWZmIC0tZ2l0IGEvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGktcnBjL2dlbi0zMjAwL2xvY19hcGkueGRyIGIvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGktcnBjL2dlbi0zMjAwL2xvY19hcGkueGRyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODEyNjZiLi4wMDAwMDAwCi0tLSBhL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpLXJwYy9nZW4tMzIwMC9sb2NfYXBpLnhkcgorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0vKiBMT0NfQVBJIFRPT0wgVkVSU0lPTjogMy4yOCAqLwotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIE8gQyBfIEEgUCBJIC4gWCBEIFIKLQotR0VORVJBTCBERVNDUklQVElPTgotICBUaGlzIGlzIGFuIEFVVE8gR0VORVJBVEVEIGZpbGUgdGhhdCBwcm92aWRlcyBhbiB4ZHIgY29tcGF0aWJsZSBkZWZpbml0aW9uIG9mCi0gIHRoZSBsb2NfYXBpIEFQSS4KLQotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUNvcHlyaWdodCAoYykgMjAwOSwgUVVBTENPTU0gVVNBLCBJTkMuCi0KLUFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLQottyAgICAgICAgIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0KLbcgICAgICAgICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uIAotCi23ICAgICAgICAgTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgUVVBTENPTU0gVVNBLCBJTkMuICBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAKLQotVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWRpdCBIaXN0b3J5Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVUTyBHRU5FUkFURUQKLQotR2VuZXJhdGVkIGJ5IGZvbGxvd2luZyB2ZXJzaW9ucyBvZiBIdG9ycGMgbW9kdWxlczoKLUlkOiAvL3NvdXJjZS9xY29tL3FjdC9jb3JlL21wcm9jL3Rvb2xzL3JlbC8wMy4wMS9odG9ycGMvaHRvcnBjLnBsIzkgCi1JZDogLy9zb3VyY2UvcWNvbS9xY3QvY29yZS9tcHJvYy90b29scy9yZWwvMDMuMDEvaHRvcnBjL2xpYi9IdG9ycGMvU3RhcnQucG0jNCAKLUlkOiAvL3NvdXJjZS9xY29tL3FjdC9jb3JlL21wcm9jL3Rvb2xzL3JlbC8wMy4wMS9odG9ycGMvbGliL0h0b3JwYy9IdG94ZHIucG0jMSAKLUlkOiAvL3NvdXJjZS9xY29tL3FjdC9jb3JlL21wcm9jL3Rvb2xzL3JlbC8wMy4wMS9odG9ycGMvbGliL0h0b3JwYy9YRFIucG0jNyAKLUlkOiAvL3NvdXJjZS9xY29tL3FjdC9jb3JlL21wcm9jL3Rvb2xzL3JlbC8wMy4wMS9odG9ycGMvbGliL0h0b3JwYy9PdXRwdXQucG0jMjYgCi1JZDogLy9zb3VyY2UvcWNvbS9xY3QvY29yZS9tcHJvYy90b29scy9yZWwvMDMuMDEvaHRvcnBjL2xpYi9IdG9ycGMvUGFyc2VyLnBtIzMgCi1JZDogLy9zb3VyY2UvcWNvbS9xY3QvY29yZS9tcHJvYy90b29scy9yZWwvMDMuMDEvaHRvcnBjL2xpYi9IdG9ycGMvTWV0YWNvbW1lbnRzLnBtIzIgCi1JZDogLy9zb3VyY2UvcWNvbS9xY3QvY29yZS9tcHJvYy90b29scy9yZWwvMDMuMDEvaHRvcnBjL2xpYi9IdG9ycGMvU3ltYm9sVGFibGUucG0jNCAKLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotJEhlYWRlciQgCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLQotCi10eXBlZGVmIHJwY191aW50MzIgcnBjX2xvY19hcGlfYXBpX3ZlcnNpb25zX3JldHVybl90eXBlPD47Ci0KLS8qCi0gKiBEZWNsYXJlIGFuIHJwY191aW50MzIgdHlwZSBmb3IgZWFjaCBjYWxsYmFjayB0eXBlIGluIHRoZSBBUEkKLSAqLwotdHlwZWRlZiBycGNfdWludDMyIHJwY19sb2NfZXZlbnRfY2JfZl90eXBlOwotCi0KLQotLyoKLSAqIFRoZXNlIGFyZSBzdHJ1Y3QgZGVjbGFyYXRpb25zIGZvciB0aGUgZnVuY3Rpb24gYXJndW1lbnRzCi0gKi8KLQotc3RydWN0IHJwY19sb2Nfb3Blbl9hcmdzIHsKLSAgcnBjX2xvY19ldmVudF9tYXNrX3R5cGUgZXZlbnRfcmVnX21hc2s7Ci0gIHJwY19sb2NfZXZlbnRfY2JfZl90eXBlIGV2ZW50X2NhbGxiYWNrOwotfTsKLQotc3RydWN0IHJwY19sb2NfY2xvc2VfYXJncyB7Ci0gIHJwY19sb2NfY2xpZW50X2hhbmRsZV90eXBlIGhhbmRsZTsKLX07Ci0KLXN0cnVjdCBycGNfbG9jX3N0YXJ0X2ZpeF9hcmdzIHsKLSAgcnBjX2xvY19jbGllbnRfaGFuZGxlX3R5cGUgaGFuZGxlOwotfTsKLQotc3RydWN0IHJwY19sb2Nfc3RvcF9maXhfYXJncyB7Ci0gIHJwY19sb2NfY2xpZW50X2hhbmRsZV90eXBlIGhhbmRsZTsKLX07Ci0KLXN0cnVjdCBycGNfbG9jX2lvY3RsX2FyZ3MgewotICBycGNfbG9jX2NsaWVudF9oYW5kbGVfdHlwZSBoYW5kbGU7Ci0gIHJwY19sb2NfaW9jdGxfZV90eXBlIGlvY3RsX3R5cGU7Ci0gIHJwY19sb2NfaW9jdGxfZGF0YV91X3R5cGUgKmlvY3RsX2RhdGE7Ci19OwotCi0KLQotc3RydWN0IHJwY19sb2NfYXBpX2FwaV92ZXJzaW9uX3NfYXJncyB7Ci0gIHJwY19ib29sZWFuIGxlbl9ub3RfbnVsbDsKLX07Ci0KLS8qCi0gKiBUaGVzZSBhcmUgc3RydWN0IGRlY2xhcmF0aW9ucyBmb3IgdGhlIGZ1bmN0aW9uIHJlc3VsdHMKLSAqLwotCi1zdHJ1Y3QgcnBjX2xvY19hcGlfcnBjX2dsdWVfY29kZV9pbmZvX3JlbW90ZV9yZXRzIHsKLSAgcnBjX3VpbnQzMiB0b29sdmVyczsgICAvKiBUb29sIHZlcnNpb24gKi8KLSAgcnBjX3VpbnQzMiBmZWF0dXJlczsgICAvKiBGZWF0dXJlcyB0dXJuZWQgb24gaW4gdGhlIGNvZGUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICogMHgwMDAwMDAwMSAgICBPTkNSUEMgU2VydmVyIENsZWFudXAgU3VwcG9ydAotICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBycGNfdWludDMyIHByb2doYXNoOyAgIC8qIFVuaXF1ZSBoYXNoIHZhbHVlIGZvciB0aGUgQVBJIFhEUiBkZWZpbml0aW9uICovCi0gIHJwY191aW50MzIgY2Jwcm9naGFzaDsgLyogVW5pcXVlIGhhc2ggdmFsdWUgZm9yIHRoZSBDYWxsYmFja3MnIFhEUiBkZWZpbml0aW9uICovCi19OwotCi1zdHJ1Y3QgcnBjX2xvY19vcGVuX3JldHMgewotICBycGNfbG9jX2NsaWVudF9oYW5kbGVfdHlwZSBsb2Nfb3Blbl9yZXN1bHQ7Ci19OwotCi1zdHJ1Y3QgcnBjX2xvY19jbG9zZV9yZXRzIHsKLSAgcnBjX2ludDMyIGxvY19jbG9zZV9yZXN1bHQ7Ci19OwotCi1zdHJ1Y3QgcnBjX2xvY19zdGFydF9maXhfcmV0cyB7Ci0gIHJwY19pbnQzMiBsb2Nfc3RhcnRfZml4X3Jlc3VsdDsKLX07Ci0KLXN0cnVjdCBycGNfbG9jX3N0b3BfZml4X3JldHMgewotICBycGNfaW50MzIgbG9jX3N0b3BfZml4X3Jlc3VsdDsKLX07Ci0KLXN0cnVjdCBycGNfbG9jX2lvY3RsX3JldHMgewotICBycGNfaW50MzIgbG9jX2lvY3RsX3Jlc3VsdDsKLX07Ci0KLSBzdHJ1Y3QgcnBjX2xvY19hcGlfYXBpX3ZlcnNpb25zX3JldHMgewotICBycGNfbG9jX2FwaV9hcGlfdmVyc2lvbnNfcmV0dXJuX3R5cGUgbG9jX2FwaV9hcGlfdmVyc2lvbnNfcmVzdWx0OwotICBycGNfdWludDMyICpsZW47Ci19OwotCi0vKgotICogWERSIGRlZmluaXRpb24gb2YgdGhlIExPQ19BUEkgcHJvZ3JhbSAoIHZlcnMuIDB4MDAwMTAwMDEgKQotICovCi0KLXByb2dyYW0gTE9DX0FQSVBST0cgewotICB2ZXJzaW9uIExPQ19BUElWRVJTXzAwMDEgewotCi0gICAgdm9pZAotICAgICAgcnBjX2xvY19hcGlfbnVsbCggdm9pZCApID0gMDsKLQotICAgIHJwY19sb2NfYXBpX3JwY19nbHVlX2NvZGVfaW5mb19yZW1vdGVfcmV0cwotICAgICAgcnBjX2xvY19hcGlfcnBjX2dsdWVfY29kZV9pbmZvX3JlbW90ZSggdm9pZCApID0gMTsKLQotICAgIHJwY19sb2Nfb3Blbl9yZXRzCi0gICAgICBycGNfbG9jX29wZW4oIHJwY19sb2Nfb3Blbl9hcmdzICkgPSAyOwotCi0gICAgcnBjX2xvY19jbG9zZV9yZXRzCi0gICAgICBycGNfbG9jX2Nsb3NlKCBycGNfbG9jX2Nsb3NlX2FyZ3MgKSA9IDM7Ci0KLSAgICBycGNfbG9jX3N0YXJ0X2ZpeF9yZXRzCi0gICAgICBycGNfbG9jX3N0YXJ0X2ZpeCggcnBjX2xvY19zdGFydF9maXhfYXJncyApID0gNDsKLQotICAgIHJwY19sb2Nfc3RvcF9maXhfcmV0cwotICAgICAgcnBjX2xvY19zdG9wX2ZpeCggcnBjX2xvY19zdG9wX2ZpeF9hcmdzICkgPSA1OwotCi0gICAgcnBjX2xvY19pb2N0bF9yZXRzCi0gICAgICBycGNfbG9jX2lvY3RsKCBycGNfbG9jX2lvY3RsX2FyZ3MgKSA9IDY7Ci0KLSAgICAgIHJwY19sb2NfYXBpX2FwaV92ZXJzaW9uc19yZXRzCi0gICAgICBycGNfbG9jX2FwaV9hcGlfdmVyc2lvbnMoIHZvaWQgKSA9IDB4RkZGRkZGRkY7Ci0KLQotICB9ID0gMHgwMDAxMDAwMTsKLX0gPSAweDMwMDAwMDhjOwotCi1jb25zdCBMT0NfQVBJVkVSUyA9IDB4MDAwMTAwMDE7CmRpZmYgLS1naXQgYS9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaS1ycGMvZ2VuLTMyMDAvbG9jX2FwaV9jYi54ZHIgYi9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaS1ycGMvZ2VuLTMyMDAvbG9jX2FwaV9jYi54ZHIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmNTM1MDQuLjAwMDAwMDAKLS0tIGEvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGktcnBjL2dlbi0zMjAwL2xvY19hcGlfY2IueGRyCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyogTE9DX0FQSSBUT09MIFZFUlNJT046IDMuMjggKi8KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgTCBPIEMgXyBBIFAgSSBfIEMgQiAuIFggRCBSCi0KLUdFTkVSQUwgREVTQ1JJUFRJT04KLSAgVGhpcyBpcyBhbiBBVVRPIEdFTkVSQVRFRCBmaWxlIHRoYXQgcHJvdmlkZXMgYW4geGRyIGNvbXBhdGlibGUgZGVmaW5pdGlvbiBvZgotICBhbiBhcGkgdGhhdCByZXByZXNlbnRzIHRoZSBncm91cGluZyBvZiB0aGUgZGlmZmVyZW50IGNhbGxiYWNrIGZ1bmN0aW9ucyB0aGUKLSAgbG9jX2FwaSBBUEkgc3VwcG9ydHMuCi0KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Db3B5cmlnaHQgKGMpIDIwMDksIFFVQUxDT01NIFVTQSwgSU5DLgotCi1BbGwgcmlnaHRzIHJlc2VydmVkLgotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0KLbcgICAgICAgICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotCi23ICAgICAgICAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAKLQottyAgICAgICAgIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFFVQUxDT01NIFVTQSwgSU5DLiAgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gCi0KLVRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVkaXQgSGlzdG9yeQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVVE8gR0VORVJBVEVECi0KLUdlbmVyYXRlZCBieSBmb2xsb3dpbmcgdmVyc2lvbnMgb2YgSHRvcnBjIG1vZHVsZXM6Ci1JZDogLy9zb3VyY2UvcWNvbS9xY3QvY29yZS9tcHJvYy90b29scy9yZWwvMDMuMDEvaHRvcnBjL2h0b3JwYy5wbCM5IAotSWQ6IC8vc291cmNlL3Fjb20vcWN0L2NvcmUvbXByb2MvdG9vbHMvcmVsLzAzLjAxL2h0b3JwYy9saWIvSHRvcnBjL1N0YXJ0LnBtIzQgCi1JZDogLy9zb3VyY2UvcWNvbS9xY3QvY29yZS9tcHJvYy90b29scy9yZWwvMDMuMDEvaHRvcnBjL2xpYi9IdG9ycGMvSHRveGRyLnBtIzEgCi1JZDogLy9zb3VyY2UvcWNvbS9xY3QvY29yZS9tcHJvYy90b29scy9yZWwvMDMuMDEvaHRvcnBjL2xpYi9IdG9ycGMvWERSLnBtIzcgCi1JZDogLy9zb3VyY2UvcWNvbS9xY3QvY29yZS9tcHJvYy90b29scy9yZWwvMDMuMDEvaHRvcnBjL2xpYi9IdG9ycGMvT3V0cHV0LnBtIzI2IAotSWQ6IC8vc291cmNlL3Fjb20vcWN0L2NvcmUvbXByb2MvdG9vbHMvcmVsLzAzLjAxL2h0b3JwYy9saWIvSHRvcnBjL1BhcnNlci5wbSMzIAotSWQ6IC8vc291cmNlL3Fjb20vcWN0L2NvcmUvbXByb2MvdG9vbHMvcmVsLzAzLjAxL2h0b3JwYy9saWIvSHRvcnBjL01ldGFjb21tZW50cy5wbSMyIAotSWQ6IC8vc291cmNlL3Fjb20vcWN0L2NvcmUvbXByb2MvdG9vbHMvcmVsLzAzLjAxL2h0b3JwYy9saWIvSHRvcnBjL1N5bWJvbFRhYmxlLnBtIzQgCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSRIZWFkZXIkIAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi0KLQotCi0vKgotICogVGhlc2UgYXJlIHN0cnVjdCBkZWNsYXJhdGlvbnMgZm9yIHRoZSBmdW5jdGlvbiBhcmd1bWVudHMKLSAqLwotCi1zdHJ1Y3QgcnBjX2xvY19ldmVudF9jYl9mX3R5cGVfYXJncyB7Ci0gIHJwY191aW50MzIgY2JfaWQ7Ci0gIHJwY19sb2NfY2xpZW50X2hhbmRsZV90eXBlIGxvY19oYW5kbGU7Ci0gIHJwY19sb2NfZXZlbnRfbWFza190eXBlIGxvY19ldmVudDsKLSAgcnBjX2xvY19ldmVudF9wYXlsb2FkX3VfdHlwZSAqbG9jX2V2ZW50X3BheWxvYWQ7Ci19OwotCi0KLQotCi0KLS8qCi0gKiBUaGVzZSBhcmUgc3RydWN0IGRlY2xhcmF0aW9zIGZvciB0aGUgZnVuY3Rpb24gcmVzdWx0cwotICovCi0KLXN0cnVjdCBycGNfbG9jX2V2ZW50X2NiX2ZfdHlwZV9yZXRzIHsKLSAgcnBjX2ludDMyIGxvY19ldmVudF9jYl9mX3R5cGVfcmVzdWx0OwotfTsKLQotCi0KLS8qCi0gKiBYRFIgZGVmaW5pdGlvbiBvZiB0aGUgTE9DX0FQSSBjYWxsYmFjayBwcm9ncmFtICggdmVycy4gMHgwMDAxMDAwMSApCi0gKi8KLQotcHJvZ3JhbSBMT0NfQVBJQ0JQUk9HIHsKLSAgdmVyc2lvbiBMT0NfQVBJQ0JWRVJTXzAwMDEgewotCi0gICAgcnBjX2xvY19ldmVudF9jYl9mX3R5cGVfcmV0cwotICAgICAgcnBjX2xvY19ldmVudF9jYl9mX3R5cGUoIHJwY19sb2NfZXZlbnRfY2JfZl90eXBlX2FyZ3MgKSA9IDE7Ci0KLQotICB9ID0gMHgwMDAxMDAwMTsKLX0gPSAweDMxMDAwMDhjOwotCi1jb25zdCBMT0NfQVBJQ0JWRVJTID0gMHgwMDAxMDAwMTsKZGlmZiAtLWdpdCBhL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpLXJwYy9nZW4tMzIwMC9sb2NfYXBpX2NiX3N2Yy5jIGIvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGktcnBjL2dlbi0zMjAwL2xvY19hcGlfY2Jfc3ZjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxYWExOTkuLjAwMDAwMDAKLS0tIGEvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGktcnBjL2dlbi0zMjAwL2xvY19hcGlfY2Jfc3ZjLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKgotICogUGxlYXNlIGRvIG5vdCBlZGl0IHRoaXMgZmlsZS4KLSAqIEl0IHdhcyBnZW5lcmF0ZWQgdXNpbmcgcnBjZ2VuLgotICovCi0KLSNpbmNsdWRlICJsb2NfYXBpX2NiLmgiCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxycGMvcG1hcF9jbG50Lmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8bWVtb3J5Lmg+Ci0jaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KLQotI2lmbmRlZiBTSUdfUEYKLSNkZWZpbmUgU0lHX1BGIHZvaWQoKikoaW50KQotI2VuZGlmCi0KLXZvaWQKLWxvY19hcGljYnByb2dfMHgwMDAxMDAwMShzdHJ1Y3Qgc3ZjX3JlcSAqcnFzdHAsIHJlZ2lzdGVyIFNWQ1hQUlQgKnRyYW5zcCkKLXsKLQl1bmlvbiB7Ci0JCXJwY19sb2NfZXZlbnRfY2JfZl90eXBlX2FyZ3MgcnBjX2xvY19ldmVudF9jYl9mX3R5cGVfMHgwMDAxMDAwMV9hcmc7Ci0JfSBhcmd1bWVudDsKLQl1bmlvbiB7Ci0JCXJwY19sb2NfZXZlbnRfY2JfZl90eXBlX3JldHMgcnBjX2xvY19ldmVudF9jYl9mX3R5cGVfMHgwMDAxMDAwMV9yZXM7Ci0JfSByZXN1bHQ7Ci0JYm9vbF90IHJldHZhbDsKLQl4ZHJwcm9jX3QgX3hkcl9hcmd1bWVudCwgX3hkcl9yZXN1bHQ7Ci0JYm9vbF90ICgqbG9jYWwpKGNoYXIgKiwgdm9pZCAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKLQotCXN3aXRjaCAocnFzdHAtPnJxX3Byb2MpIHsKLQljYXNlIE5VTExQUk9DOgotCQkodm9pZCkgc3ZjX3NlbmRyZXBseSAodHJhbnNwLCAoeGRycHJvY190KSB4ZHJfdm9pZCwgKGNoYXIgKilOVUxMKTsKLQkJcmV0dXJuOwotCi0JY2FzZSBycGNfbG9jX2V2ZW50X2NiX2ZfdHlwZToKLQkJX3hkcl9hcmd1bWVudCA9ICh4ZHJwcm9jX3QpIHhkcl9ycGNfbG9jX2V2ZW50X2NiX2ZfdHlwZV9hcmdzOwotCQlfeGRyX3Jlc3VsdCA9ICh4ZHJwcm9jX3QpIHhkcl9ycGNfbG9jX2V2ZW50X2NiX2ZfdHlwZV9yZXRzOwotCQlsb2NhbCA9IChib29sX3QgKCopIChjaGFyICosIHZvaWQgKiwgIHN0cnVjdCBzdmNfcmVxICopKXJwY19sb2NfZXZlbnRfY2JfZl90eXBlXzB4MDAwMTAwMDFfc3ZjOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXN2Y2Vycl9ub3Byb2MgKHRyYW5zcCk7Ci0JCXJldHVybjsKLQl9Ci0JbWVtc2V0ICgoY2hhciAqKSZhcmd1bWVudCwgMCwgc2l6ZW9mIChhcmd1bWVudCkpOwotCWlmICghc3ZjX2dldGFyZ3MgKHRyYW5zcCwgKHhkcnByb2NfdCkgX3hkcl9hcmd1bWVudCwgKGNhZGRyX3QpICZhcmd1bWVudCkpIHsKLQkJc3ZjZXJyX2RlY29kZSAodHJhbnNwKTsKLQkJcmV0dXJuOwotCX0KLQlyZXR2YWwgPSAoYm9vbF90KSAoKmxvY2FsKSgoY2hhciAqKSZhcmd1bWVudCwgKHZvaWQgKikmcmVzdWx0LCBycXN0cCk7Ci0JaWYgKHJldHZhbCA+IDAgJiYgIXN2Y19zZW5kcmVwbHkodHJhbnNwLCAoeGRycHJvY190KSBfeGRyX3Jlc3VsdCwgKGNoYXIgKikmcmVzdWx0KSkgewotCQlzdmNlcnJfc3lzdGVtZXJyICh0cmFuc3ApOwotCX0KLQlpZiAoIXN2Y19mcmVlYXJncyAodHJhbnNwLCAoeGRycHJvY190KSBfeGRyX2FyZ3VtZW50LCAoY2FkZHJfdCkgJmFyZ3VtZW50KSkgewotCQlmcHJpbnRmIChzdGRlcnIsICIlcyIsICJ1bmFibGUgdG8gZnJlZSBhcmd1bWVudHMiKTsKLQkJZXhpdCAoMSk7Ci0JfQotCWlmICghbG9jX2FwaWNicHJvZ18weDAwMDEwMDAxX2ZyZWVyZXN1bHQgKHRyYW5zcCwgX3hkcl9yZXN1bHQsIChjYWRkcl90KSAmcmVzdWx0KSkKLQkJZnByaW50ZiAoc3RkZXJyLCAiJXMiLCAidW5hYmxlIHRvIGZyZWUgcmVzdWx0cyIpOwotCi0JcmV0dXJuOwotfQpkaWZmIC0tZ2l0IGEvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGktcnBjL2dlbi0zMjAwL2xvY19hcGlfY2JfeGRyLmMgYi9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaS1ycGMvZ2VuLTMyMDAvbG9jX2FwaV9jYl94ZHIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ3Nzk1ZS4uMDAwMDAwMAotLS0gYS9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaS1ycGMvZ2VuLTMyMDAvbG9jX2FwaV9jYl94ZHIuYworKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qCi0gKiBQbGVhc2UgZG8gbm90IGVkaXQgdGhpcyBmaWxlLgotICogSXQgd2FzIGdlbmVyYXRlZCB1c2luZyBycGNnZW4uCi0gKi8KLQotI2luY2x1ZGUgImxvY19hcGlfY2IuaCIKLQotYm9vbF90Ci14ZHJfcnBjX2xvY19ldmVudF9jYl9mX3R5cGVfYXJncyAoWERSICp4ZHJzLCBycGNfbG9jX2V2ZW50X2NiX2ZfdHlwZV9hcmdzICpvYmpwKQotewotCXJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotCSBpZiAoIXhkcl9ycGNfdWludDMyICh4ZHJzLCAmb2JqcC0+Y2JfaWQpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9ycGNfbG9jX2NsaWVudF9oYW5kbGVfdHlwZSAoeGRycywgJm9ianAtPmxvY19oYW5kbGUpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9ycGNfbG9jX2V2ZW50X21hc2tfdHlwZSAoeGRycywgJm9ianAtPmxvY19ldmVudCkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX3BvaW50ZXIgKHhkcnMsIChjaGFyICoqKSZvYmpwLT5sb2NfZXZlbnRfcGF5bG9hZCwgc2l6ZW9mIChycGNfbG9jX2V2ZW50X3BheWxvYWRfdV90eXBlKSwgKHhkcnByb2NfdCkgeGRyX3JwY19sb2NfZXZlbnRfcGF5bG9hZF91X3R5cGUpKQotCQkgcmV0dXJuIEZBTFNFOwotCXJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfbG9jX2V2ZW50X2NiX2ZfdHlwZV9yZXRzIChYRFIgKnhkcnMsIHJwY19sb2NfZXZlbnRfY2JfZl90eXBlX3JldHMgKm9ianApCi17Ci0JcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0JIGlmICgheGRyX3JwY19pbnQzMiAoeGRycywgJm9ianAtPmxvY19ldmVudF9jYl9mX3R5cGVfcmVzdWx0KSkKLQkJIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KZGlmZiAtLWdpdCBhL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpLXJwYy9nZW4tMzIwMC9sb2NfYXBpX2NsbnQuYyBiL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpLXJwYy9nZW4tMzIwMC9sb2NfYXBpX2NsbnQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk4MTRkNC4uMDAwMDAwMAotLS0gYS9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaS1ycGMvZ2VuLTMyMDAvbG9jX2FwaV9jbG50LmMKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKgotICogUGxlYXNlIGRvIG5vdCBlZGl0IHRoaXMgZmlsZS4KLSAqIEl0IHdhcyBnZW5lcmF0ZWQgdXNpbmcgcnBjZ2VuLgotICovCi0KLSNpbmNsdWRlIDxtZW1vcnkuaD4gLyogZm9yIG1lbXNldCAqLwotI2luY2x1ZGUgImxvY19hcGkuaCIKLQotLyogRGVmYXVsdCB0aW1lb3V0IGNhbiBiZSBjaGFuZ2VkIHVzaW5nIGNsbnRfY29udHJvbCgpICovCi1zdGF0aWMgc3RydWN0IHRpbWV2YWwgVElNRU9VVCA9IHsgMjUsIDAgfTsKLQotZW51bSBjbG50X3N0YXQgCi1ycGNfbG9jX2FwaV9udWxsXzB4MDAwMTAwMDEodm9pZCAqYXJncCwgdm9pZCAqY2xudF9yZXMsIENMSUVOVCAqY2xudCkKLXsKLQlyZXR1cm4gKGNsbnRfY2FsbChjbG50LCBycGNfbG9jX2FwaV9udWxsLAotCQkoeGRycHJvY190KSB4ZHJfdm9pZCwgKGNhZGRyX3QpIGFyZ3AsCi0JCSh4ZHJwcm9jX3QpIHhkcl92b2lkLCAoY2FkZHJfdCkgY2xudF9yZXMsCi0JCVRJTUVPVVQpKTsKLX0KLQotZW51bSBjbG50X3N0YXQgCi1ycGNfbG9jX2FwaV9ycGNfZ2x1ZV9jb2RlX2luZm9fcmVtb3RlXzB4MDAwMTAwMDEodm9pZCAqYXJncCwgcnBjX2xvY19hcGlfcnBjX2dsdWVfY29kZV9pbmZvX3JlbW90ZV9yZXRzICpjbG50X3JlcywgQ0xJRU5UICpjbG50KQotewotCXJldHVybiAoY2xudF9jYWxsKGNsbnQsIHJwY19sb2NfYXBpX3JwY19nbHVlX2NvZGVfaW5mb19yZW1vdGUsCi0JCSh4ZHJwcm9jX3QpIHhkcl92b2lkLCAoY2FkZHJfdCkgYXJncCwKLQkJKHhkcnByb2NfdCkgeGRyX3JwY19sb2NfYXBpX3JwY19nbHVlX2NvZGVfaW5mb19yZW1vdGVfcmV0cywgKGNhZGRyX3QpIGNsbnRfcmVzLAotCQlUSU1FT1VUKSk7Ci19Ci0KLWVudW0gY2xudF9zdGF0IAotcnBjX2xvY19vcGVuXzB4MDAwMTAwMDEocnBjX2xvY19vcGVuX2FyZ3MgKmFyZ3AsIHJwY19sb2Nfb3Blbl9yZXRzICpjbG50X3JlcywgQ0xJRU5UICpjbG50KQotewotCXJldHVybiAoY2xudF9jYWxsKGNsbnQsIHJwY19sb2Nfb3BlbiwKLQkJKHhkcnByb2NfdCkgeGRyX3JwY19sb2Nfb3Blbl9hcmdzLCAoY2FkZHJfdCkgYXJncCwKLQkJKHhkcnByb2NfdCkgeGRyX3JwY19sb2Nfb3Blbl9yZXRzLCAoY2FkZHJfdCkgY2xudF9yZXMsCi0JCVRJTUVPVVQpKTsKLX0KLQotZW51bSBjbG50X3N0YXQgCi1ycGNfbG9jX2Nsb3NlXzB4MDAwMTAwMDEocnBjX2xvY19jbG9zZV9hcmdzICphcmdwLCBycGNfbG9jX2Nsb3NlX3JldHMgKmNsbnRfcmVzLCBDTElFTlQgKmNsbnQpCi17Ci0JcmV0dXJuIChjbG50X2NhbGwoY2xudCwgcnBjX2xvY19jbG9zZSwKLQkJKHhkcnByb2NfdCkgeGRyX3JwY19sb2NfY2xvc2VfYXJncywgKGNhZGRyX3QpIGFyZ3AsCi0JCSh4ZHJwcm9jX3QpIHhkcl9ycGNfbG9jX2Nsb3NlX3JldHMsIChjYWRkcl90KSBjbG50X3JlcywKLQkJVElNRU9VVCkpOwotfQotCi1lbnVtIGNsbnRfc3RhdCAKLXJwY19sb2Nfc3RhcnRfZml4XzB4MDAwMTAwMDEocnBjX2xvY19zdGFydF9maXhfYXJncyAqYXJncCwgcnBjX2xvY19zdGFydF9maXhfcmV0cyAqY2xudF9yZXMsIENMSUVOVCAqY2xudCkKLXsKLQlyZXR1cm4gKGNsbnRfY2FsbChjbG50LCBycGNfbG9jX3N0YXJ0X2ZpeCwKLQkJKHhkcnByb2NfdCkgeGRyX3JwY19sb2Nfc3RhcnRfZml4X2FyZ3MsIChjYWRkcl90KSBhcmdwLAotCQkoeGRycHJvY190KSB4ZHJfcnBjX2xvY19zdGFydF9maXhfcmV0cywgKGNhZGRyX3QpIGNsbnRfcmVzLAotCQlUSU1FT1VUKSk7Ci19Ci0KLWVudW0gY2xudF9zdGF0IAotcnBjX2xvY19zdG9wX2ZpeF8weDAwMDEwMDAxKHJwY19sb2Nfc3RvcF9maXhfYXJncyAqYXJncCwgcnBjX2xvY19zdG9wX2ZpeF9yZXRzICpjbG50X3JlcywgQ0xJRU5UICpjbG50KQotewotCXJldHVybiAoY2xudF9jYWxsKGNsbnQsIHJwY19sb2Nfc3RvcF9maXgsCi0JCSh4ZHJwcm9jX3QpIHhkcl9ycGNfbG9jX3N0b3BfZml4X2FyZ3MsIChjYWRkcl90KSBhcmdwLAotCQkoeGRycHJvY190KSB4ZHJfcnBjX2xvY19zdG9wX2ZpeF9yZXRzLCAoY2FkZHJfdCkgY2xudF9yZXMsCi0JCVRJTUVPVVQpKTsKLX0KLQotZW51bSBjbG50X3N0YXQgCi1ycGNfbG9jX2lvY3RsXzB4MDAwMTAwMDEocnBjX2xvY19pb2N0bF9hcmdzICphcmdwLCBycGNfbG9jX2lvY3RsX3JldHMgKmNsbnRfcmVzLCBDTElFTlQgKmNsbnQpCi17Ci0JcmV0dXJuIChjbG50X2NhbGwoY2xudCwgcnBjX2xvY19pb2N0bCwKLQkJKHhkcnByb2NfdCkgeGRyX3JwY19sb2NfaW9jdGxfYXJncywgKGNhZGRyX3QpIGFyZ3AsCi0JCSh4ZHJwcm9jX3QpIHhkcl9ycGNfbG9jX2lvY3RsX3JldHMsIChjYWRkcl90KSBjbG50X3JlcywKLQkJVElNRU9VVCkpOwotfQotCi1lbnVtIGNsbnRfc3RhdCAKLXJwY19sb2NfYXBpX2FwaV92ZXJzaW9uc18weDAwMDEwMDAxKHZvaWQgKmFyZ3AsIHJwY19sb2NfYXBpX2FwaV92ZXJzaW9uc19yZXRzICpjbG50X3JlcywgQ0xJRU5UICpjbG50KQotewotCXJldHVybiAoY2xudF9jYWxsKGNsbnQsIHJwY19sb2NfYXBpX2FwaV92ZXJzaW9ucywKLQkJKHhkcnByb2NfdCkgeGRyX3ZvaWQsIChjYWRkcl90KSBhcmdwLAotCQkoeGRycHJvY190KSB4ZHJfcnBjX2xvY19hcGlfYXBpX3ZlcnNpb25zX3JldHMsIChjYWRkcl90KSBjbG50X3JlcywKLQkJVElNRU9VVCkpOwotfQpkaWZmIC0tZ2l0IGEvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGktcnBjL2dlbi0zMjAwL2xvY19hcGlfY29tbW9uLnhkciBiL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpLXJwYy9nZW4tMzIwMC9sb2NfYXBpX2NvbW1vbi54ZHIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlZjYzNTcuLjAwMDAwMDAKLS0tIGEvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGktcnBjL2dlbi0zMjAwL2xvY19hcGlfY29tbW9uLnhkcgorKysgL2Rldi9udWxsCkBAIC0xLDgwMyArMCwwIEBACi0vKiBMT0NfQVBJIFRPT0wgVkVSU0lPTjogMy4yOCAqLwotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICAgICAgICAgICAgICAgICAgIEwgTyBDIF8gQSBQIEkgXyBDIE8gTSBNIE8gTiAuIFggRCBSCi0KLUdFTkVSQUwgREVTQ1JJUFRJT04KLSAgVGhpcyBpcyBhbiBBVVRPIEdFTkVSQVRFRCBmaWxlIHRoYXQgcHJvdmlkZXMgYW4geGRyIGNvbXBhdGlibGUgZGVmaW5pdGlvbiBvZgotICBhbiBhcGkgdGhhdCByZXByZXNlbnRzIHRoZSBncm91cGluZyBvZiB0aGUgZGlmZmVyZW50IGNhbGxiYWNrIGZ1bmN0aW9ucyB0aGUKLSAgbG9jX2FwaSBBUEkgc3VwcG9ydHMuCi0KLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Db3B5cmlnaHQgKGMpIDIwMDksIFFVQUxDT01NIFVTQSwgSU5DLgotCi1BbGwgcmlnaHRzIHJlc2VydmVkLgotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0KLbcgICAgICAgICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotCi23ICAgICAgICAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAKLQottyAgICAgICAgIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFFVQUxDT01NIFVTQSwgSU5DLiAgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gCi0KLVRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVkaXQgSGlzdG9yeQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVVE8gR0VORVJBVEVECi0KLUdlbmVyYXRlZCBieSBmb2xsb3dpbmcgdmVyc2lvbnMgb2YgSHRvcnBjIG1vZHVsZXM6Ci1JZDogLy9zb3VyY2UvcWNvbS9xY3QvY29yZS9tcHJvYy90b29scy9yZWwvMDMuMDEvaHRvcnBjL2h0b3JwYy5wbCM5IAotSWQ6IC8vc291cmNlL3Fjb20vcWN0L2NvcmUvbXByb2MvdG9vbHMvcmVsLzAzLjAxL2h0b3JwYy9saWIvSHRvcnBjL1N0YXJ0LnBtIzQgCi1JZDogLy9zb3VyY2UvcWNvbS9xY3QvY29yZS9tcHJvYy90b29scy9yZWwvMDMuMDEvaHRvcnBjL2xpYi9IdG9ycGMvSHRveGRyLnBtIzEgCi1JZDogLy9zb3VyY2UvcWNvbS9xY3QvY29yZS9tcHJvYy90b29scy9yZWwvMDMuMDEvaHRvcnBjL2xpYi9IdG9ycGMvWERSLnBtIzcgCi1JZDogLy9zb3VyY2UvcWNvbS9xY3QvY29yZS9tcHJvYy90b29scy9yZWwvMDMuMDEvaHRvcnBjL2xpYi9IdG9ycGMvT3V0cHV0LnBtIzI2IAotSWQ6IC8vc291cmNlL3Fjb20vcWN0L2NvcmUvbXByb2MvdG9vbHMvcmVsLzAzLjAxL2h0b3JwYy9saWIvSHRvcnBjL1BhcnNlci5wbSMzIAotSWQ6IC8vc291cmNlL3Fjb20vcWN0L2NvcmUvbXByb2MvdG9vbHMvcmVsLzAzLjAxL2h0b3JwYy9saWIvSHRvcnBjL01ldGFjb21tZW50cy5wbSMyIAotSWQ6IC8vc291cmNlL3Fjb20vcWN0L2NvcmUvbXByb2MvdG9vbHMvcmVsLzAzLjAxL2h0b3JwYy9saWIvSHRvcnBjL1N5bWJvbFRhYmxlLnBtIzQgCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSRIZWFkZXIkIAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi0KLQotCi1jb25zdCBSUENfTE9DX0VWRU5UX05JX05PVElGWV9WRVJJRllfUkVRVUVTVCA9IDB4MDAwMDAwMTA7Ci0KLWNvbnN0IFJQQ19MT0NfRVZFTlRfSU9DVExfUkVQT1JUID0gMHgwMDAwMDA4MDsKLQotY29uc3QgUlBDX0xPQ19FVkVOVF9MT0NBVElPTl9TRVJWRVJfUkVRVUVTVCA9IDB4MDAwMDAwNDA7Ci0KLWNvbnN0IFJQQ19MT0NfRVZFTlRfUkVTRVJWRUQgPSAweDgwMDAwMDAwMDAwMDAwMDA7Ci0KLWNvbnN0IFJQQ19MT0NfRVZFTlRfUEFSU0VEX1BPU0lUSU9OX1JFUE9SVCA9IDB4MDAwMDAwMDE7Ci0KLWNvbnN0IFJQQ19MT0NfRVZFTlRfQVNTSVNUQU5DRV9EQVRBX1JFUVVFU1QgPSAweDAwMDAwMDIwOwotCi1jb25zdCBSUENfTE9DX0VWRU5UX05NRUFfUE9TSVRJT05fUkVQT1JUID0gMHgwMDAwMDAwODsKLQotY29uc3QgUlBDX0xPQ19FVkVOVF9TQVRFTExJVEVfUkVQT1JUID0gMHgwMDAwMDAwMjsKLQotY29uc3QgUlBDX0xPQ19FVkVOVF9TVEFUVVNfUkVQT1JUID0gMHgwMDAwMDEwMDsKLQotY29uc3QgUlBDX0xPQ19PUEVOX1ZFUlNJT04gPSAweDAwMDEwMDAxOwotY29uc3QgUlBDX0xPQ19DTE9TRV9WRVJTSU9OID0gMHgwMDAxMDAwMTsKLWNvbnN0IFJQQ19MT0NfU1RBUlRfRklYX1ZFUlNJT04gPSAweDAwMDEwMDAxOwotY29uc3QgUlBDX0xPQ19TVE9QX0ZJWF9WRVJTSU9OID0gMHgwMDAxMDAwMTsKLWNvbnN0IFJQQ19MT0NfSU9DVExfVkVSU0lPTiA9IDB4MDAwMTAwMDE7Ci1jb25zdCBSUENfTE9DX0VWRU5UX0NCX0ZfVFlQRV9WRVJTSU9OID0gMHgwMDAxMDAwMTsKLWNvbnN0IFJQQ19MT0NfQVBJQVBJX1ZFUlNJT05fSVNfSEFTSEtFWSA9IDA7Ci1jb25zdCBSUENfTE9DX0FQSV9BUElfTUFKT1JfTlVNID0gMHgwMDAxOwotdHlwZWRlZiBib29sIHJwY19ib29sZWFuOwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIHJwY191aW50MzI7Ci0KLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgcnBjX3VpbnQxNjsKLQotdHlwZWRlZiB1bnNpZ25lZCBjaGFyIHJwY191aW50ODsKLQotdHlwZWRlZiBsb25nIHJwY19pbnQzMjsKLQotdHlwZWRlZiB1bnNpZ25lZCBjaGFyIHJwY19ieXRlOwotCi10eXBlZGVmIHVuc2lnbmVkIGh5cGVyIHJwY191aW50NjQ7Ci0KLXR5cGVkZWYgcnBjX2ludDMyIHJwY19sb2NfY2xpZW50X2hhbmRsZV90eXBlOwotCi10eXBlZGVmIHJwY191aW50NjQgcnBjX2xvY19ldmVudF9tYXNrX3R5cGU7Ci0KLXR5cGVkZWYgcnBjX3VpbnQ2NCBycGNfbG9jX3Bvc2l0aW9uX3ZhbGlkX21hc2tfdHlwZTsKLQotdHlwZWRlZiBycGNfdWludDMyIHJwY19sb2NfcG9zX3RlY2hub2xvZ3lfbWFza190eXBlOwotCi1lbnVtIHJwY19sb2Nfc2Vzc2lvbl9zdGF0dXNfZV90eXBlIHsKLSAgUlBDX0xPQ19TRVNTX1NUQVRVU19TVUNDRVNTID0gMCwKLSAgUlBDX0xPQ19TRVNTX1NUQVRVU19JTl9QUk9HRVNTID0gMSwKLSAgUlBDX0xPQ19TRVNTX1NUQVRVU19HRU5FUkFMX0ZBSUxVUkUgPSAyLAotICBSUENfTE9DX1NFU1NfU1RBVFVTX1RJTUVPVVQgPSAzLAotICBSUENfTE9DX1NFU1NfU1RBVFVTX1VTRVJfRU5EID0gNCwKLSAgUlBDX0xPQ19TRVNTX1NUQVRVU19CQURfUEFSQU1FVEVSID0gNSwKLSAgUlBDX0xPQ19TRVNTX1NUQVRVU19QSE9ORV9PRkZMSU5FID0gNiwKLSAgUlBDX0xPQ19TRVNTX1NUQVRVU19FTkdJTkVfTE9DS0VEID0gNywKLSAgUlBDX0xPQ19TRVNTX1NUQVRVU19NQVggPSAyNjg0MzU0NTYKLX07Ci0KLXN0cnVjdCBycGNfbG9jX2NhbGVuZGFyX3RpbWVfc190eXBlIHsKLSAgcnBjX3VpbnQxNiB5ZWFyOwotICB1bnNpZ25lZCBjaGFyIG1vbnRoOwotICB1bnNpZ25lZCBjaGFyIGRheV9vZl93ZWVrOwotICB1bnNpZ25lZCBjaGFyIGRheTsKLSAgdW5zaWduZWQgY2hhciBob3VyOwotICB1bnNpZ25lZCBjaGFyIG1pbnV0ZTsKLSAgdW5zaWduZWQgY2hhciBzZWNvbmQ7Ci0gIHJwY191aW50MTYgbWlsbGlzZWNvbmQ7Ci19OwotCi1zdHJ1Y3QgcnBjX2xvY19wYXJzZWRfcG9zaXRpb25fc190eXBlIHsKLSAgcnBjX2xvY19wb3NpdGlvbl92YWxpZF9tYXNrX3R5cGUgdmFsaWRfbWFzazsKLSAgcnBjX2xvY19zZXNzaW9uX3N0YXR1c19lX3R5cGUgc2Vzc2lvbl9zdGF0dXM7Ci0gIHJwY19sb2NfY2FsZW5kYXJfdGltZV9zX3R5cGUgdGltZXN0YW1wX2NhbGVuZGFyOwotICBycGNfdWludDY0IHRpbWVzdGFtcF91dGM7Ci0gIHJwY191aW50OCBsZWFwX3NlY29uZHM7Ci0gIGZsb2F0IHRpbWVfdW5jOwotICBkb3VibGUgbGF0aXR1ZGU7Ci0gIGRvdWJsZSBsb25naXR1ZGU7Ci0gIGZsb2F0IGFsdGl0dWRlX3dydF9lbGxpcHNvaWQ7Ci0gIGZsb2F0IGFsdGl0dWRlX3dydF9tZWFuX3NlYV9sZXZlbDsKLSAgZmxvYXQgc3BlZWRfaG9yaXpvbnRhbDsKLSAgZmxvYXQgc3BlZWRfdmVydGljYWw7Ci0gIGZsb2F0IGhlYWRpbmc7Ci0gIGZsb2F0IGhvcl91bmNfY2lyY3VsYXI7Ci0gIGZsb2F0IGhvcl91bmNfZWxsaXBzZV9zZW1pX21ham9yOwotICBmbG9hdCBob3JfdW5jX2VsbGlwc2Vfc2VtaV9taW5vcjsKLSAgZmxvYXQgaG9yX3VuY19lbGxpcHNlX29yaWVudF9hemltdXRoOwotICBmbG9hdCB2ZXJ0X3VuYzsKLSAgZmxvYXQgc3BlZWRfdW5jOwotICBmbG9hdCBoZWFkaW5nX3VuYzsKLSAgdW5zaWduZWQgY2hhciBjb25maWRlbmNlX2hvcml6b250YWw7Ci0gIHVuc2lnbmVkIGNoYXIgY29uZmlkZW5jZV92ZXJ0aWNhbDsKLSAgZmxvYXQgbWFnbmV0aWNfZGV2aWF0aW9uOwotICBycGNfbG9jX3Bvc190ZWNobm9sb2d5X21hc2tfdHlwZSB0ZWNobm9sb2d5X21hc2s7Ci19OwotCi1lbnVtIHJwY19sb2Nfc3Zfc3lzdGVtX2VfdHlwZSB7Ci0gIFJQQ19MT0NfU1ZfU1lTVEVNX0dQUyA9IDEsCi0gIFJQQ19MT0NfU1ZfU1lTVEVNX0dBTElMRU8gPSAyLAotICBSUENfTE9DX1NWX1NZU1RFTV9TQkFTID0gMywKLSAgUlBDX0xPQ19TVl9TWVNURU1fQ09NUEFTUyA9IDQsCi0gIFJQQ19MT0NfU1ZfU1lTVEVNX0dMT05BU1MgPSA1LAotICBSUENfTE9DX1NWX1NZU1RFTV9NQVggPSAyNjg0MzU0NTYKLX07Ci0KLWVudW0gcnBjX2xvY19zdl9zdGF0dXNfZV90eXBlIHsKLSAgUlBDX0xPQ19TVl9TVEFUVVNfSURMRSA9IDEsCi0gIFJQQ19MT0NfU1ZfU1RBVFVTX1NFQVJDSCA9IDIsCi0gIFJQQ19MT0NfU1ZfU1RBVFVTX1RSQUNLID0gMywKLSAgUlBDX0xPQ19TVl9TVEFUVVNfTUFYID0gMjY4NDM1NDU2Ci19OwotCi10eXBlZGVmIHJwY191aW50MzIgcnBjX2xvY19zdl9pbmZvX3ZhbGlkX21hc2tfdHlwZTsKLQotc3RydWN0IHJwY19sb2Nfc3ZfaW5mb19zX3R5cGUgewotICBycGNfbG9jX3N2X2luZm9fdmFsaWRfbWFza190eXBlIHZhbGlkX21hc2s7Ci0gIHJwY19sb2Nfc3Zfc3lzdGVtX2VfdHlwZSBzeXN0ZW07Ci0gIHJwY191aW50OCBwcm47Ci0gIHJwY191aW50OCBoZWFsdGhfc3RhdHVzOwotICBycGNfbG9jX3N2X3N0YXR1c19lX3R5cGUgcHJvY2Vzc19zdGF0dXM7Ci0gIHJwY19ib29sZWFuIGhhc19lcGg7Ci0gIHJwY19ib29sZWFuIGhhc19hbG07Ci0gIGZsb2F0IGVsZXZhdGlvbjsKLSAgZmxvYXQgYXppbXV0aDsKLSAgZmxvYXQgc25yOwotfTsKLQotdHlwZWRlZiBycGNfdWludDMyIHJwY19sb2NfZ25zc19pbmZvX3ZhbGlkX21hc2tfdHlwZTsKLQotc3RydWN0IHJwY19sb2NfZ25zc19pbmZvX3NfdHlwZSB7Ci0gIHJwY19sb2NfZ25zc19pbmZvX3ZhbGlkX21hc2tfdHlwZSB2YWxpZF9tYXNrOwotICBmbG9hdCBwb3NpdGlvbl9kb3A7Ci0gIGZsb2F0IGhvcml6b250YWxfZG9wOwotICBmbG9hdCB2ZXJ0aWNhbF9kb3A7Ci0gIHJwY19ib29sZWFuIGFsdGl0dWRlX2Fzc3VtZWQ7Ci0gIHJwY191aW50MTYgc3ZfY291bnQ7Ci0gIHJwY19sb2Nfc3ZfaW5mb19zX3R5cGUgc3ZfbGlzdDxSUENfTE9DX0FQSV9NQVhfU1ZfQ09VTlQ+OwotfTsKLQotc3RydWN0IHJwY19sb2Nfbm1lYV9yZXBvcnRfc190eXBlIHsKLSAgcnBjX3VpbnQxNiBsZW5ndGg7Ci0gIG9wYXF1ZSBubWVhX3NlbnRlbmNlczxSUENfTE9DX0FQSV9NQVhfTk1FQV9TVFJJTkdfTEVOR1RIPjsKLX07Ci0KLWVudW0gcnBjX2xvY19zdGF0dXNfZXZlbnRfZV90eXBlIHsKLSAgUlBDX0xPQ19TVEFUVVNfRVZFTlRfRU5HSU5FX1NUQVRFID0gMSwKLSAgUlBDX0xPQ19TVEFUVVNfRVZFTlRfTUFYID0gMjY4NDM1NDU2Ci19OwotCi1lbnVtIHJwY19sb2NfZW5naW5lX3N0YXRlX2VfdHlwZSB7Ci0gIFJQQ19MT0NfRU5HSU5FX1NUQVRFX09OID0gMSwKLSAgUlBDX0xPQ19FTkdJTkVfU1RBVEVfT0ZGID0gMiwKLSAgUlBDX0xPQ19FTkdJTkVfU1RBVEVfTUFYID0gMjY4NDM1NDU2Ci19OwotCi11bmlvbiBycGNfbG9jX3N0YXR1c19ldmVudF9wYXlsb2FkX3VfdHlwZSBzd2l0Y2ggKHJwY19sb2Nfc3RhdHVzX2V2ZW50X2VfdHlwZSBkaXNjKSB7Ci0gIGNhc2UgUlBDX0xPQ19TVEFUVVNfRVZFTlRfRU5HSU5FX1NUQVRFOgotICAgIHJwY19sb2NfZW5naW5lX3N0YXRlX2VfdHlwZSBlbmdpbmVfc3RhdGU7Ci0gIGRlZmF1bHQ6Ci0gICAgdm9pZDsKLX07Ci0KLXN0cnVjdCBycGNfbG9jX3N0YXR1c19ldmVudF9zX3R5cGUgewotICBycGNfbG9jX3N0YXR1c19ldmVudF9lX3R5cGUgZXZlbnQ7Ci0gIHJwY19sb2Nfc3RhdHVzX2V2ZW50X3BheWxvYWRfdV90eXBlIHBheWxvYWQ7Ci19OwotCi1lbnVtIHJwY19sb2Nfc2VydmVyX2FkZHJfZV90eXBlIHsKLSAgUlBDX0xPQ19TRVJWRVJfQUREUl9JUFY0ID0gMSwKLSAgUlBDX0xPQ19TRVJWRVJfQUREUl9VUkwgPSAyLAotICBSUENfTE9DX1NFUlZFUl9BRERSX01BWCA9IDI2ODQzNTQ1NgotfTsKLQotc3RydWN0IHJwY19sb2Nfc2VydmVyX2FkZHJfaXB2NF90eXBlIHsKLSAgcnBjX3VpbnQzMiBhZGRyOwotICBycGNfdWludDE2IHBvcnQ7Ci19OwotCi1zdHJ1Y3QgcnBjX2xvY19zZXJ2ZXJfYWRkcl91cmxfdHlwZSB7Ci0gIHJwY191aW50MTYgbGVuZ3RoOwotICBvcGFxdWUgYWRkcjxSUENfTE9DX0FQSV9NQVhfU0VSVkVSX0FERFJfTEVOR1RIPjsKLX07Ci0KLXVuaW9uIHJwY19sb2Nfc2VydmVyX2FkZHJfdV90eXBlIHN3aXRjaCAocnBjX2xvY19zZXJ2ZXJfYWRkcl9lX3R5cGUgZGlzYykgewotICBjYXNlIFJQQ19MT0NfU0VSVkVSX0FERFJfSVBWNDoKLSAgICBycGNfbG9jX3NlcnZlcl9hZGRyX2lwdjRfdHlwZSBpcHY0OwotICBjYXNlIFJQQ19MT0NfU0VSVkVSX0FERFJfVVJMOgotICAgIHJwY19sb2Nfc2VydmVyX2FkZHJfdXJsX3R5cGUgdXJsOwotICBkZWZhdWx0OgotICAgIHZvaWQ7Ci19OwotCi1zdHJ1Y3QgcnBjX2xvY19zZXJ2ZXJfaW5mb19zX3R5cGUgewotICBycGNfbG9jX3NlcnZlcl9hZGRyX2VfdHlwZSBhZGRyX3R5cGU7Ci0gIHJwY19sb2Nfc2VydmVyX2FkZHJfdV90eXBlIGFkZHJfaW5mbzsKLX07Ci0KLWVudW0gcnBjX2xvY19uaV9ub3RpZnlfdmVyaWZ5X2VfdHlwZSB7Ci0gIFJQQ19MT0NfTklfVVNFUl9OT19OT1RJRllfTk9fVkVSSUZZID0gMSwKLSAgUlBDX0xPQ19OSV9VU0VSX05PVElGWV9PTkxZID0gMiwKLSAgUlBDX0xPQ19OSV9VU0VSX05PVElGWV9WRVJJRllfQUxMT1dfTk9fUkVTUCA9IDMsCi0gIFJQQ19MT0NfTklfVVNFUl9OT1RJRllfVkVSSUZZX05PVF9BTExPV19OT19SRVNQID0gNCwKLSAgUlBDX0xPQ19OSV9VU0VSX1BSSVZBQ1lfT1ZFUlJJREUgPSA1LAotICBSUENfTE9DX05JX1VTRVJfTk9USUZZX1ZFUklUWV9UWVBFX01BWCA9IDI2ODQzNTQ1NgotfTsKLQotZW51bSBycGNfbG9jX25pX2V2ZW50X2VfdHlwZSB7Ci0gIFJQQ19MT0NfTklfRVZFTlRfVlhfTk9USUZZX1ZFUklGWV9SRVEgPSAxLAotICBSUENfTE9DX05JX0VWRU5UX1NVUExfTk9USUZZX1ZFUklGWV9SRVEgPSAyLAotICBSUENfTE9DX05JX0VWRU5UX1VNVFNfQ1BfTk9USUZZX1ZFUklGWV9SRVEgPSAzLAotICBSUENfTE9DX05JX0VWRU5UX01BWCA9IDI2ODQzNTQ1NgotfTsKLQotZW51bSBycGNfbG9jX25pX2RhdGFjb2Rpbmdfc2NoZW1lX2VfdHlwZSB7Ci0gIFJQQ19MT0NfTklfUFJFU1VQTF9JU082NDZJUlYgPSAwLAotICBSUENfTE9DX05JX1BSRVNVUExfSVNPODg1OSA9IDEsCi0gIFJQQ19MT0NfTklfUFJFU1VQTF9VVEY4ID0gMiwKLSAgUlBDX0xPQ19OSV9QUkVTVVBMX1VURjE2ID0gMywKLSAgUlBDX0xPQ19OSV9QUkVTVVBMX1VDUzIgPSA0LAotICBSUENfTE9DX05JX1BSRVNVUExfR1NNX0RFRkFVTFQgPSA1LAotICBSUENfTE9DX05JX1BSRVNVUExfU0hJRlRfSklTID0gNiwKLSAgUlBDX0xPQ19OSV9QUkVTVVBMX0pJUyA9IDcsCi0gIFJQQ19MT0NfTklfUFJFU1VQTF9FVUMgPSA4LAotICBSUENfTE9DX05JX1BSRVNVUExfR0IyMzEyID0gOSwKLSAgUlBDX0xPQ19OSV9QUkVTVVBMX0NOUzExNjQzID0gMTAsCi0gIFJQQ19MT0NfTklfUFJFU1VQTF9LU0MxMDAxID0gMTEsCi0gIFJQQ19MT0NfTklfUFJFU1VQTF9FTkNPRElOR19VTktOT1dOID0gMjE0NzQ4MzY0NywKLSAgUlBDX0xPQ19OSV9TU19HRVJNQU4gPSAxMiwKLSAgUlBDX0xPQ19OSV9TU19FTkdMSVNIID0gMTMsCi0gIFJQQ19MT0NfTklfU1NfSVRBTElBTiA9IDE0LAotICBSUENfTE9DX05JX1NTX0ZSRU5DSCA9IDE1LAotICBSUENfTE9DX05JX1NTX1NQQU5JU0ggPSAxNiwKLSAgUlBDX0xPQ19OSV9TU19EVVRDSCA9IDE3LAotICBSUENfTE9DX05JX1NTX1NXRURJU0ggPSAxOCwKLSAgUlBDX0xPQ19OSV9TU19EQU5JU0ggPSAxOSwKLSAgUlBDX0xPQ19OSV9TU19QT1JUVUdVRVNFID0gMjAsCi0gIFJQQ19MT0NfTklfU1NfRklOTklTSCA9IDIxLAotICBSUENfTE9DX05JX1NTX05PUldFR0lBTiA9IDIyLAotICBSUENfTE9DX05JX1NTX0dSRUVLID0gMjMsCi0gIFJQQ19MT0NfTklfU1NfVFVSS0lTSCA9IDI0LAotICBSUENfTE9DX05JX1NTX0hVTkdBUklBTiA9IDI1LAotICBSUENfTE9DX05JX1NTX1BPTElTSCA9IDI2LAotICBSUENfTE9DX05JX1NTX0xBTkdVQUdFX1VOU1BFQyA9IDI3LAotICBSUENfTE9DX05JX1NVUExfVVRGOCA9IDI4LAotICBSUENfTE9DX05JX1NVUExfVUNTMiA9IDI5LAotICBSUENfTE9DX05JX1NVUExfR1NNX0RFRkFVTFQgPSAzMCwKLSAgUlBDX0xPQ19OSV9TVVBMX0VOQ09ESU5HX1VOS05PV04gPSAyMTQ3NDgzNjQ3Ci19OwotCi1lbnVtIHJwY19sb2NfbmlfdnhfcmVxdWVzdGVyX2lkX2VuY29kaW5nX3NjaGVtZV9lX3R5cGUgewotICBSUENfTE9DX05JX1ZYX09DVEVUID0gMCwKLSAgUlBDX0xPQ19OSV9WWF9FWE5fUFJPVE9DT0xfTVNHID0gMSwKLSAgUlBDX0xPQ19OSV9WWF9BU0NJSSA9IDIsCi0gIFJQQ19MT0NfTklfVlhfSUE1ID0gMywKLSAgUlBDX0xPQ19OSV9WWF9VTklDT0RFID0gNCwKLSAgUlBDX0xPQ19OSV9WWF9TSElGVF9KSVMgPSA1LAotICBSUENfTE9DX05JX1ZYX0tPUkVBTiA9IDYsCi0gIFJQQ19MT0NfTklfVlhfTEFUSU5fSEVCUkVXID0gNywKLSAgUlBDX0xPQ19OSV9WWF9MQVRJTiA9IDgsCi0gIFJQQ19MT0NfTklfVlhfR1NNID0gOSwKLSAgUlBDX0xPQ19OSV9WWF9FTkNPRElOR19UWVBFX01BWCA9IDI2ODQzNTQ1NgotfTsKLQotZW51bSBycGNfbG9jX25pX3Z4X3Bvc19tb2RlX2VfdHlwZSB7Ci0gIFJQQ19MT0NfVlhfTVNfQVNTSVNURURfT05MWSA9IDEsCi0gIFJQQ19MT0NfVlhfTVNfQkFTRURfT05MWSA9IDIsCi0gIFJQQ19MT0NfVlhfTVNfQVNTSVNURURfUFJFRl9NU0JBU0VEX0FMTFdEID0gMywKLSAgUlBDX0xPQ19WWF9NU19CQVNFRF9QUkVGX0FTU0lTVEVEX0FMTFdEID0gNCwKLSAgUlBDX0xPQ19WWF9QT1NfTU9ERV9NQVggPSAyNjg0MzU0NTYKLX07Ci0KLXN0cnVjdCBycGNfbG9jX25pX3Z4X3JlcXVlc3Rlcl9pZF9zX3R5cGUgewotICB1bnNpZ25lZCBjaGFyIHJlcXVlc3Rlcl9pZF9sZW5ndGg7Ci0gIG9wYXF1ZSByZXF1ZXN0ZXJfaWRbMjAwXTsKLX07Ci0KLXN0cnVjdCBycGNfbG9jX25pX3Z4X25vdGlmeV92ZXJpZnlfcmVxX3NfdHlwZSB7Ci0gIHJwY19sb2Nfbmlfbm90aWZ5X3ZlcmlmeV9lX3R5cGUgbm90aWZpY2F0aW9uX3ByaXZfdHlwZTsKLSAgdW5zaWduZWQgY2hhciBwb3NfcW9zX2luY2w7Ci0gIHVuc2lnbmVkIGNoYXIgcG9zX3FvczsKLSAgcnBjX3VpbnQzMiBudW1fZml4ZXM7Ci0gIHJwY191aW50MzIgdGJmOwotICBycGNfbG9jX25pX3Z4X3Bvc19tb2RlX2VfdHlwZSBwb3NfbW9kZTsKLSAgcnBjX2xvY19uaV92eF9yZXF1ZXN0ZXJfaWRfZW5jb2Rpbmdfc2NoZW1lX2VfdHlwZSBlbmNvZGluZ19zY2hlbWU7Ci0gIHJwY19sb2NfbmlfdnhfcmVxdWVzdGVyX2lkX3NfdHlwZSByZXF1ZXN0ZXJfaWQ7Ci0gIHJwY191aW50MTYgdXNlcl9yZXNwX3RpbWVyX3ZhbDsKLX07Ci0KLWVudW0gcnBjX2xvY19uaV9zdXBsX3Bvc19tZXRob2RfZV90eXBlIHsKLSAgUlBDX0xPQ19OSV9QT1NNRVRIT0RfQUdQU19TRVRBU1NJU1RFRCA9IDEsCi0gIFJQQ19MT0NfTklfUE9TTUVUSE9EX0FHUFNfU0VUQkFTRUQgPSAyLAotICBSUENfTE9DX05JX1BPU01FVEhPRF9BR1BTX1NFVEFTU0lTVEVEX1BSRUYgPSAzLAotICBSUENfTE9DX05JX1BPU01FVEhPRF9BR1BTX1NFVEJBU0VEX1BSRUYgPSA0LAotICBSUENfTE9DX05JX1BPU01FVEhPRF9BVVRPTk9NT1VTX0dQUyA9IDUsCi0gIFJQQ19MT0NfTklfUE9TTUVUSE9EX0FGTFQgPSA2LAotICBSUENfTE9DX05JX1BPU01FVEhPRF9FQ0lEID0gNywKLSAgUlBDX0xPQ19OSV9QT1NNRVRIT0RfRU9URCA9IDgsCi0gIFJQQ19MT0NfTklfUE9TTUVUSE9EX09URE9BID0gOSwKLSAgUlBDX0xPQ19OSV9QT1NNRVRIT0RfTk9fUE9TSVRJT04gPSAxMCwKLSAgUlBDX0xPQ19OSV9QT1NNRVRIT0RfTUFYID0gMjY4NDM1NDU2Ci19OwotCi1zdHJ1Y3QgcnBjX2xvY19uaV9zdXBsX3NscF9zZXNzaW9uX2lkX3NfdHlwZSB7Ci0gIHVuc2lnbmVkIGNoYXIgcHJlc2VuY2U7Ci0gIG9wYXF1ZSBzZXNzaW9uX2lkWzRdOwotICBycGNfbG9jX3NlcnZlcl9pbmZvX3NfdHlwZSBzbHBfYWRkcmVzczsKLX07Ci0KLXN0cnVjdCBycGNfbG9jX25pX3JlcXVlc3Rvcl9pZF9zX3R5cGUgewotICB1bnNpZ25lZCBjaGFyIGRhdGFfY29kaW5nX3NjaGVtZTsKLSAgb3BhcXVlIHJlcXVlc3Rvcl9pZF9zdHJpbmc8UlBDX0xPQ19OSV9NQVhfUkVRVUVTVE9SX0lEX0xFTkdUSD47Ci0gIHVuc2lnbmVkIGNoYXIgc3RyaW5nX2xlbjsKLX07Ci0KLXN0cnVjdCBycGNfbG9jX25pX3N1cGxfY2xpZW50X25hbWVfc190eXBlIHsKLSAgdW5zaWduZWQgY2hhciBkYXRhX2NvZGluZ19zY2hlbWU7Ci0gIG9wYXF1ZSBjbGllbnRfbmFtZV9zdHJpbmc8UlBDX0xPQ19OSV9NQVhfQ0xJRU5UX05BTUVfTEVOR1RIPjsKLSAgdW5zaWduZWQgY2hhciBzdHJpbmdfbGVuOwotfTsKLQotc3RydWN0IHJwY19sb2Nfbmlfc3VwbF9xb3Bfc190eXBlIHsKLSAgdW5zaWduZWQgY2hhciBiaXRfbWFzazsKLSAgdW5zaWduZWQgY2hhciBob3JhY2M7Ci0gIHVuc2lnbmVkIGNoYXIgdmVyYWNjOwotICB1bnNpZ25lZCBjaGFyIG1heExvY0FnZTsKLSAgdW5zaWduZWQgY2hhciBkZWxheTsKLX07Ci0KLXN0cnVjdCBycGNfbG9jX25pX3N1cGxfbm90aWZ5X3ZlcmlmeV9yZXFfc190eXBlIHsKLSAgcnBjX2xvY19uaV9ub3RpZnlfdmVyaWZ5X2VfdHlwZSBub3RpZmljYXRpb25fcHJpdl90eXBlOwotICBycGNfdWludDE2IGZsYWdzOwotICBycGNfbG9jX25pX3N1cGxfc2xwX3Nlc3Npb25faWRfc190eXBlIHN1cGxfc2xwX3Nlc3Npb25faWQ7Ci0gIG9wYXF1ZSBzdXBsX2hhc2hbOF07Ci0gIHJwY19sb2NfbmlfZGF0YWNvZGluZ19zY2hlbWVfZV90eXBlIGRhdGFjb2Rpbmdfc2NoZW1lOwotICBycGNfbG9jX25pX3N1cGxfcG9zX21ldGhvZF9lX3R5cGUgcG9zX21ldGhvZDsKLSAgcnBjX2xvY19uaV9yZXF1ZXN0b3JfaWRfc190eXBlIHJlcXVlc3Rvcl9pZDsKLSAgcnBjX2xvY19uaV9zdXBsX2NsaWVudF9uYW1lX3NfdHlwZSBjbGllbnRfbmFtZTsKLSAgcnBjX2xvY19uaV9zdXBsX3FvcF9zX3R5cGUgc3VwbF9xb3A7Ci0gIHJwY191aW50MTYgdXNlcl9yZXNwb25zZV90aW1lcjsKLX07Ci0KLXN0cnVjdCBycGNfbG9jX25pX2V4dF9jbGllbnRfYWRkcmVzc19zX3R5cGUgewotICB1bnNpZ25lZCBjaGFyIGV4dF9jbGllbnRfYWRkcmVzc19sZW47Ci0gIG9wYXF1ZSBleHRfY2xpZW50X2FkZHJlc3M8UlBDX0xPQ19OSV9NQVhfRVhUX0NMSUVOVF9BRERSRVNTPjsKLX07Ci0KLWVudW0gcnBjX2xvY19uaV9sb2NhdGlvbl90eXBlX2VfdHlwZSB7Ci0gIFJQQ19MT0NfTklfTE9DQVRJT05UWVBFX0NVUlJFTlRfTE9DQVRJT04gPSAxLAotICBSUENfTE9DX05JX0xPQ0FUSU9OVFlQRV9DVVJSRU5UX09SX0xBU1RfS05PV05fTE9DQVRJT04gPSAyLAotICBSUENfTE9DX05JX0xPQ0FUSU9OVFlQRV9JTklUSUFMX0xPQ0FUSU9OID0gMywKLSAgUlBDX0xPQ19OSV9MT0NBVElPTlRZUEVfTUFYID0gMjY4NDM1NDU2Ci19OwotCi1zdHJ1Y3QgcnBjX2xvY19uaV9kZWZlcnJlZF9sb2NhdGlvbl9zX3R5cGUgewotICB1bnNpZ25lZCBjaGFyIHVudXNlZF9iaXRzOwotICB1bnNpZ25lZCBjaGFyIG1zX2F2YWlsYWJsZTsKLX07Ci0KLXN0cnVjdCBycGNfbG9jX25pX2NvZGV3b3JkX3N0cmluZ19zX3R5cGUgewotICB1bnNpZ25lZCBjaGFyIGRhdGFfY29kaW5nX3NjaGVtZTsKLSAgb3BhcXVlIGxjc19jb2Rld29yZF9zdHJpbmc8UlBDX0xPQ19OSV9DT0RFV09SRF9MRU5HVEg+OwotICB1bnNpZ25lZCBjaGFyIHN0cmluZ19sZW47Ci19OwotCi1zdHJ1Y3QgcnBjX2xvY19uaV9zZXJ2aWNlX3R5cGVfaWRfc190eXBlIHsKLSAgdW5zaWduZWQgY2hhciBsY3Nfc2VydmljZV90eXBlX2lkOwotfTsKLQotc3RydWN0IHJwY19sb2NfbmlfdW10c19jcF9ub3RpZnlfdmVyaWZ5X3JlcV9zX3R5cGUgewotICBycGNfbG9jX25pX25vdGlmeV92ZXJpZnlfZV90eXBlIG5vdGlmaWNhdGlvbl9wcml2X3R5cGU7Ci0gIHVuc2lnbmVkIGNoYXIgaW52b2tlX2lkOwotICBycGNfdWludDE2IGZsYWdzOwotICB1bnNpZ25lZCBjaGFyIG5vdGlmaWNhdGlvbl9sZW5ndGg7Ci0gIG9wYXF1ZSBub3RpZmljYXRpb25fdGV4dDxSUENfTE9DX05JX01BWF9DTElFTlRfTkFNRV9MRU5HVEg+OwotICBycGNfbG9jX25pX2RhdGFjb2Rpbmdfc2NoZW1lX2VfdHlwZSBkYXRhY29kaW5nX3NjaGVtZTsKLSAgcnBjX2xvY19uaV9leHRfY2xpZW50X2FkZHJlc3Nfc190eXBlIGV4dF9jbGllbnRfYWRkcmVzc19kYXRhOwotICBycGNfbG9jX25pX2xvY2F0aW9uX3R5cGVfZV90eXBlIGxvY2F0aW9uX3R5cGU7Ci0gIHJwY19sb2NfbmlfZGVmZXJyZWRfbG9jYXRpb25fc190eXBlIGRlZmVycmVkX2xvY2F0aW9uOwotICBycGNfbG9jX25pX3JlcXVlc3Rvcl9pZF9zX3R5cGUgcmVxdWVzdG9yX2lkOwotICBycGNfbG9jX25pX2NvZGV3b3JkX3N0cmluZ19zX3R5cGUgY29kZXdvcmRfc3RyaW5nOwotICBycGNfbG9jX25pX3NlcnZpY2VfdHlwZV9pZF9zX3R5cGUgc2VydmljZV90eXBlX2lkOwotICBycGNfdWludDE2IHVzZXJfcmVzcG9uc2VfdGltZXI7Ci19OwotCi11bmlvbiBycGNfbG9jX25pX2V2ZW50X3BheWxvYWRfdV90eXBlIHN3aXRjaCAocnBjX2xvY19uaV9ldmVudF9lX3R5cGUgZGlzYykgewotICBjYXNlIFJQQ19MT0NfTklfRVZFTlRfVlhfTk9USUZZX1ZFUklGWV9SRVE6Ci0gICAgcnBjX2xvY19uaV92eF9ub3RpZnlfdmVyaWZ5X3JlcV9zX3R5cGUgdnhfcmVxOwotICBjYXNlIFJQQ19MT0NfTklfRVZFTlRfU1VQTF9OT1RJRllfVkVSSUZZX1JFUToKLSAgICBycGNfbG9jX25pX3N1cGxfbm90aWZ5X3ZlcmlmeV9yZXFfc190eXBlIHN1cGxfcmVxOwotICBjYXNlIFJQQ19MT0NfTklfRVZFTlRfVU1UU19DUF9OT1RJRllfVkVSSUZZX1JFUToKLSAgICBycGNfbG9jX25pX3VtdHNfY3Bfbm90aWZ5X3ZlcmlmeV9yZXFfc190eXBlIHVtdHNfY3BfcmVxOwotICBkZWZhdWx0OgotICAgIHZvaWQ7Ci19OwotCi1zdHJ1Y3QgcnBjX2xvY19uaV9ldmVudF9zX3R5cGUgewotICBycGNfbG9jX25pX2V2ZW50X2VfdHlwZSBldmVudDsKLSAgcnBjX2xvY19uaV9ldmVudF9wYXlsb2FkX3VfdHlwZSBwYXlsb2FkOwotfTsKLQotZW51bSBycGNfbG9jX2Fzc2lzdF9kYXRhX3JlcXVlc3RfZV90eXBlIHsKLSAgUlBDX0xPQ19BU1NJU1RfREFUQV9USU1FX1JFUSA9IDEsCi0gIFJQQ19MT0NfQVNTSVNUX0RBVEFfUFJFRElDVEVEX09SQklUU19SRVEgPSAyLAotICBSUENfTE9DX0FTU0lTVF9EQVRBX01BWCA9IDI2ODQzNTQ1NgotfTsKLQotdHlwZWRlZiBzdHJpbmcgcnBjX3N0cnVjdF9sb2NfdGltZV9kb3dubG9hZF9zb3VyY2Vfc190eXBlX3NlcnZlcnNfcHRyPFJQQ19MT0NfQVBJX01BWF9TRVJWRVJfQUREUl9MRU5HVEg+OwotCi10eXBlZGVmIHJwY19zdHJ1Y3RfbG9jX3RpbWVfZG93bmxvYWRfc291cmNlX3NfdHlwZV9zZXJ2ZXJzX3B0ciBycGNfc3RydWN0X2xvY190aW1lX2Rvd25sb2FkX3NvdXJjZV9zX3R5cGVfc2VydmVyc1szXTsKLQotc3RydWN0IHJwY19sb2NfdGltZV9kb3dubG9hZF9zb3VyY2Vfc190eXBlIHsKLSAgcnBjX3VpbnQzMiBkZWxheV90aHJlc2hvbGQ7Ci0gIHJwY19zdHJ1Y3RfbG9jX3RpbWVfZG93bmxvYWRfc291cmNlX3NfdHlwZV9zZXJ2ZXJzIHNlcnZlcnM7Ci19OwotCi10eXBlZGVmIHN0cmluZyBycGNfc3RydWN0X2xvY19wcmVkaWN0ZWRfb3JiaXRzX2RhdGFfc291cmNlX3NfdHlwZV9zZXJ2ZXJzX3B0cjxSUENfTE9DX0FQSV9NQVhfU0VSVkVSX0FERFJfTEVOR1RIPjsKLQotdHlwZWRlZiBycGNfc3RydWN0X2xvY19wcmVkaWN0ZWRfb3JiaXRzX2RhdGFfc291cmNlX3NfdHlwZV9zZXJ2ZXJzX3B0ciBycGNfc3RydWN0X2xvY19wcmVkaWN0ZWRfb3JiaXRzX2RhdGFfc291cmNlX3NfdHlwZV9zZXJ2ZXJzWzNdOwotCi1zdHJ1Y3QgcnBjX2xvY19wcmVkaWN0ZWRfb3JiaXRzX2RhdGFfc291cmNlX3NfdHlwZSB7Ci0gIHJwY191aW50MzIgbWF4X2ZpbGVfc2l6ZTsKLSAgcnBjX3VpbnQzMiBtYXhfcGFydF9zaXplOwotICBycGNfc3RydWN0X2xvY19wcmVkaWN0ZWRfb3JiaXRzX2RhdGFfc291cmNlX3NfdHlwZV9zZXJ2ZXJzIHNlcnZlcnM7Ci19OwotCi11bmlvbiBycGNfbG9jX2Fzc2lzdF9kYXRhX3JlcXVlc3RfcGF5bG9hZF91X3R5cGUgc3dpdGNoIChycGNfbG9jX2Fzc2lzdF9kYXRhX3JlcXVlc3RfZV90eXBlIGRpc2MpIHsKLSAgY2FzZSBSUENfTE9DX0FTU0lTVF9EQVRBX1RJTUVfUkVROgotICAgIHJwY19sb2NfdGltZV9kb3dubG9hZF9zb3VyY2Vfc190eXBlIHRpbWVfZG93bmxvYWQ7Ci0gIGNhc2UgUlBDX0xPQ19BU1NJU1RfREFUQV9QUkVESUNURURfT1JCSVRTX1JFUToKLSAgICBycGNfbG9jX3ByZWRpY3RlZF9vcmJpdHNfZGF0YV9zb3VyY2Vfc190eXBlIGRhdGFfZG93bmxvYWQ7Ci0gIGRlZmF1bHQ6Ci0gICAgdm9pZDsKLX07Ci0KLXN0cnVjdCBycGNfbG9jX2Fzc2lzdF9kYXRhX3JlcXVlc3Rfc190eXBlIHsKLSAgcnBjX2xvY19hc3Npc3RfZGF0YV9yZXF1ZXN0X2VfdHlwZSBldmVudDsKLSAgcnBjX2xvY19hc3Npc3RfZGF0YV9yZXF1ZXN0X3BheWxvYWRfdV90eXBlIHBheWxvYWQ7Ci19OwotCi10eXBlZGVmIHJwY191aW50MzIgcnBjX2xvY19zZXJ2ZXJfY29ubmVjdGlvbl9oYW5kbGU7Ci0KLWVudW0gcnBjX2xvY19zZXJ2ZXJfcHJvdG9jb2xfZV90eXBlIHsKLSAgUlBDX0xPQ19TRVJWRVJfUFJPVE9DT0xfREVGQVVMVCA9IDAsCi0gIFJQQ19MT0NfU0VSVkVSX1BST1RPQ09MX1NVUEwgPSAxLAotICBSUENfTE9DX1NFUlZFUl9QUk9UT0NPTF9WWF9NUEMgPSAyLAotICBSUENfTE9DX1NFUlZFUl9QUk9UT0NPTF9WWF9QREUgPSAzLAotICBSUENfTE9DX1NFUlZFUl9QUk9UT0NPTF9NQVggPSAxNjc3NzIxNgotfTsKLQotZW51bSBycGNfbG9jX3NlcnZlcl9yZXF1ZXN0X2VfdHlwZSB7Ci0gIFJQQ19MT0NfU0VSVkVSX1JFUVVFU1RfT1BFTiA9IDEsCi0gIFJQQ19MT0NfU0VSVkVSX1JFUVVFU1RfQ0xPU0UgPSAyLAotICBSUENfTE9DX1NFUlZFUl9SRVFVRVNUX01BWCA9IDI2ODQzNTQ1NgotfTsKLQotc3RydWN0IHJwY19sb2Nfc2VydmVyX29wZW5fcmVxX3NfdHlwZSB7Ci0gIHJwY19sb2Nfc2VydmVyX2Nvbm5lY3Rpb25faGFuZGxlIGNvbm5faGFuZGxlOwotICBycGNfbG9jX3NlcnZlcl9wcm90b2NvbF9lX3R5cGUgcHJvdG9jb2w7Ci19OwotCi1zdHJ1Y3QgcnBjX2xvY19zZXJ2ZXJfY2xvc2VfcmVxX3NfdHlwZSB7Ci0gIHJwY19sb2Nfc2VydmVyX2Nvbm5lY3Rpb25faGFuZGxlIGNvbm5faGFuZGxlOwotfTsKLQotdW5pb24gcnBjX2xvY19zZXJ2ZXJfcmVxdWVzdF91X3R5cGUgc3dpdGNoIChycGNfbG9jX3NlcnZlcl9yZXF1ZXN0X2VfdHlwZSBkaXNjKSB7Ci0gIGNhc2UgUlBDX0xPQ19TRVJWRVJfUkVRVUVTVF9PUEVOOgotICAgIHJwY19sb2Nfc2VydmVyX29wZW5fcmVxX3NfdHlwZSBvcGVuX3JlcTsKLSAgY2FzZSBSUENfTE9DX1NFUlZFUl9SRVFVRVNUX0NMT1NFOgotICAgIHJwY19sb2Nfc2VydmVyX2Nsb3NlX3JlcV9zX3R5cGUgY2xvc2VfcmVxOwotICBkZWZhdWx0OgotICAgIHZvaWQ7Ci19OwotCi1zdHJ1Y3QgcnBjX2xvY19zZXJ2ZXJfcmVxdWVzdF9zX3R5cGUgewotICBycGNfbG9jX3NlcnZlcl9yZXF1ZXN0X2VfdHlwZSBldmVudDsKLSAgcnBjX2xvY19zZXJ2ZXJfcmVxdWVzdF91X3R5cGUgcGF5bG9hZDsKLX07Ci0KLXN0cnVjdCBycGNfbG9jX3Jlc2VydmVkX3BheWxvYWRfc190eXBlIHsKLSAgcnBjX3VpbnQxNiBkYXRhX3NpemU7Ci0gIG9wYXF1ZSBkYXRhPD47Ci19OwotCi1lbnVtIHJwY19sb2NfaW9jdGxfZV90eXBlIHsKLSAgUlBDX0xPQ19JT0NUTF9HRVRfQVBJX1ZFUlNJT04gPSAxLAotICBSUENfTE9DX0lPQ1RMX1NFVF9GSVhfQ1JJVEVSSUEgPSAyLAotICBSUENfTE9DX0lPQ1RMX0dFVF9GSVhfQ1JJVEVSSUEgPSAzLAotICBSUENfTE9DX0lPQ1RMX1NFUlZJQ0VfU1RBUlRfSU5ERVggPSA0MDAsCi0gIFJQQ19MT0NfSU9DVExfSU5GT1JNX05JX1VTRVJfUkVTUE9OU0UgPSA0MDAsCi0gIFJQQ19MT0NfSU9DVExfSU5KRUNUX1BSRURJQ1RFRF9PUkJJVFNfREFUQSA9IDQwMSwKLSAgUlBDX0xPQ19JT0NUTF9RVUVSWV9QUkVESUNURURfT1JCSVRTX0RBVEFfVkFMSURJVFkgPSA0MDIsCi0gIFJQQ19MT0NfSU9DVExfUVVFUllfUFJFRElDVEVEX09SQklUU19EQVRBX1NPVVJDRSA9IDQwMywKLSAgUlBDX0xPQ19JT0NUTF9TRVRfUFJFRElDVEVEX09SQklUU19EQVRBX0FVVE9fRE9XTkxPQUQgPSA0MDQsCi0gIFJQQ19MT0NfSU9DVExfSU5KRUNUX1VUQ19USU1FID0gNDA1LAotICBSUENfTE9DX0lPQ1RMX0lOSkVDVF9SVENfVkFMVUUgPSA0MDYsCi0gIFJQQ19MT0NfSU9DVExfSU5KRUNUX1BPU0lUSU9OID0gNDA3LAotICBSUENfTE9DX0lPQ1RMX1FVRVJZX0VOR0lORV9TVEFURSA9IDQwOCwKLSAgUlBDX0xPQ19JT0NUTF9JTkZPUk1fU0VSVkVSX09QRU5fU1RBVFVTID0gNDA5LAotICBSUENfTE9DX0lPQ1RMX0lORk9STV9TRVJWRVJfQ0xPU0VfU1RBVFVTID0gNDEwLAotICBSUENfTE9DX0lPQ1RMX05WX1NFVFRJTkdTX1NUQVJUX0lOREVYID0gODAwLAotICBSUENfTE9DX0lPQ1RMX1NFVF9FTkdJTkVfTE9DSyA9IDgwMCwKLSAgUlBDX0xPQ19JT0NUTF9HRVRfRU5HSU5FX0xPQ0sgPSA4MDEsCi0gIFJQQ19MT0NfSU9DVExfU0VUX1NCQVNfQ09ORklHID0gODAyLAotICBSUENfTE9DX0lPQ1RMX0dFVF9TQkFTX0NPTkZJRyA9IDgwMywKLSAgUlBDX0xPQ19JT0NUTF9TRVRfTk1FQV9UWVBFUyA9IDgwNCwKLSAgUlBDX0xPQ19JT0NUTF9HRVRfTk1FQV9UWVBFUyA9IDgwNSwKLSAgUlBDX0xPQ19JT0NUTF9TRVRfQ0RNQV9QREVfU0VSVkVSX0FERFIgPSA4MDYsCi0gIFJQQ19MT0NfSU9DVExfR0VUX0NETUFfUERFX1NFUlZFUl9BRERSID0gODA3LAotICBSUENfTE9DX0lPQ1RMX1NFVF9DRE1BX01QQ19TRVJWRVJfQUREUiA9IDgwOCwKLSAgUlBDX0xPQ19JT0NUTF9HRVRfQ0RNQV9NUENfU0VSVkVSX0FERFIgPSA4MDksCi0gIFJQQ19MT0NfSU9DVExfU0VUX1VNVFNfU0xQX1NFUlZFUl9BRERSID0gODEwLAotICBSUENfTE9DX0lPQ1RMX0dFVF9VTVRTX1NMUF9TRVJWRVJfQUREUiA9IDgxMSwKLSAgUlBDX0xPQ19JT0NUTF9TRVRfT05fREVNQU5EX0xQTSA9IDgxMiwKLSAgUlBDX0xPQ19JT0NUTF9HRVRfT05fREVNQU5EX0xQTSA9IDgxMywKLSAgUlBDX0xPQ19JT0NUTF9QUk9QUklFVEFSWV9TVEFSVF9JTkRFWCA9IDEwMDAsCi0gIFJQQ19MT0NfSU9DVExfREVMRVRFX0FTU0lTVF9EQVRBID0gMTAwMCwKLSAgUlBDX0xPQ19JT0NUTF9TRVRfQ1VTVE9NX1BERV9TRVJWRVJfQUREUiA9IDEwMDEsCi0gIFJQQ19MT0NfSU9DVExfR0VUX0NVU1RPTV9QREVfU0VSVkVSX0FERFIgPSAxMDAyLAotICBSUENfTE9DX0lPQ1RMX1RISVJEX1BBUlRZX1NUQVJUX0lOREVYID0gMTA3Mzc0MTgyNAotfTsKLQotc3RydWN0IHJwY19sb2NfYXBpX3ZlcnNpb25fc190eXBlIHsKLSAgdW5zaWduZWQgY2hhciBtYWpvcjsKLSAgdW5zaWduZWQgY2hhciBtaW5vcjsKLX07Ci0KLWVudW0gcnBjX2xvY19maXhfcmVjdXJyZW5jZV9lX3R5cGUgewotICBSUENfTE9DX1BFUklPRElDX0ZJWCA9IDEsCi0gIFJQQ19MT0NfU0lOR0xFX0ZJWCA9IDIsCi0gIFJQQ19MT0NfRklYX1NFU1NJT05fVFlQRV9NQVggPSAyNjg0MzU0NTYKLX07Ci0KLWVudW0gcnBjX2xvY19vcGVyYXRpb25fbW9kZV9lX3R5cGUgewotICBSUENfTE9DX09QRVJfTU9ERV9ERUZBVUxUID0gMSwKLSAgUlBDX0xPQ19PUEVSX01PREVfTVNCID0gMiwKLSAgUlBDX0xPQ19PUEVSX01PREVfTVNBID0gMywKLSAgUlBDX0xPQ19PUEVSX01PREVfU1RBTkRBTE9ORSA9IDQsCi0gIFJQQ19MT0NfT1BFUl9NT0RFX1NQRUVEX09QVElNQUwgPSA1LAotICBSUENfTE9DX09QRVJfTU9ERV9BQ0NVUkFDWV9PUFRJTUFMID0gNiwKLSAgUlBDX0xPQ19PUEVSX01PREVfREFUQV9PUFRJTUFMID0gNywKLSAgUlBDX0xPQ19PUEVSX01PREVfTUFYID0gMjY4NDM1NDU2Ci19OwotCi1lbnVtIHJwY19sb2Nfbm90aWZ5X2VfdHlwZSB7Ci0gIFJQQ19MT0NfTk9USUZZX09OX0lOVEVSVkFMID0gMSwKLSAgUlBDX0xPQ19OT1RJRllfT05fRElTVEFOQ0UgPSAyLAotICBSUENfTE9DX05PVElGWV9PTl9BTlkgPSAzLAotICBSUENfTE9DX05PVElGWV9PTl9BTEwgPSA0LAotICBSUENfTE9DX05PVElGWV9UWVBFX01BWCA9IDI2ODQzNTQ1NgotfTsKLQotc3RydWN0IHJwY19sb2NfZml4X2NyaXRlcmlhX3NfdHlwZSB7Ci0gIHJwY191aW50MzIgdmFsaWRfbWFzazsKLSAgcnBjX2xvY19maXhfcmVjdXJyZW5jZV9lX3R5cGUgcmVjdXJyZW5jZV90eXBlOwotICBycGNfbG9jX29wZXJhdGlvbl9tb2RlX2VfdHlwZSBwcmVmZXJyZWRfb3BlcmF0aW9uX21vZGU7Ci0gIHJwY191aW50MzIgcHJlZmVycmVkX2FjY3VyYWN5OwotICBycGNfdWludDMyIHByZWZlcnJlZF9yZXNwb25zZV90aW1lOwotICBycGNfYm9vbGVhbiBpbnRlcm1lZGlhdGVfcG9zX3JlcG9ydF9lbmFibGVkOwotICBycGNfbG9jX25vdGlmeV9lX3R5cGUgbm90aWZ5X3R5cGU7Ci0gIHJwY191aW50MzIgbWluX2ludGVydmFsOwotICBmbG9hdCBtaW5fZGlzdGFuY2U7Ci0gIHJwY191aW50MzIgbWluX2Rpc3Rfc2FtcGxlX2ludGVydmFsOwotfTsKLQotZW51bSBycGNfbG9jX25pX3VzZXJfcmVzcF9lX3R5cGUgewotICBSUENfTE9DX05JX0xDU19OT1RJRllfVkVSSUZZX0FDQ0VQVCA9IDEsCi0gIFJQQ19MT0NfTklfTENTX05PVElGWV9WRVJJRllfREVOWSA9IDIsCi0gIFJQQ19MT0NfTklfTENTX05PVElGWV9WRVJJRllfTk9SRVNQID0gMywKLSAgUlBDX0xPQ19OSV9MQ1NfTk9USUZZX1ZFUklGWV9NQVggPSAyNjg0MzU0NTYKLX07Ci0KLXN0cnVjdCBycGNfbG9jX3VzZXJfdmVyaWZ5X3NfdHlwZSB7Ci0gIHJwY19sb2NfbmlfdXNlcl9yZXNwX2VfdHlwZSB1c2VyX3Jlc3A7Ci0gIHJwY19sb2NfbmlfZXZlbnRfc190eXBlIG5pX2V2ZW50X3Bhc3NfYmFjazsKLX07Ci0KLWVudW0gcnBjX2xvY19wcmVkaWN0ZWRfb3JiaXRzX2RhdGFfZm9ybWF0X2VfdHlwZSB7Ci0gIFJQQ19MT0NfUFJFRElDVEVEX09SQklUU19YVFJBID0gMCwKLSAgUlBDX0xPQ19QUkVESUNURURfT1JCSVRTX0ZPUk1BVF9NQVggPSAyNjg0MzU0NTYKLX07Ci0KLXN0cnVjdCBycGNfbG9jX3ByZWRpY3RlZF9vcmJpdHNfZGF0YV9zX3R5cGUgewotICBycGNfbG9jX3ByZWRpY3RlZF9vcmJpdHNfZGF0YV9mb3JtYXRfZV90eXBlIGZvcm1hdF90eXBlOwotICBycGNfdWludDMyIHRvdGFsX3NpemU7Ci0gIHJwY191aW50OCB0b3RhbF9wYXJ0czsKLSAgcnBjX3VpbnQ4IHBhcnQ7Ci0gIHJwY191aW50MTYgcGFydF9sZW47Ci0gIG9wYXF1ZSBkYXRhX3B0cjw+OwotfTsKLQotc3RydWN0IHJwY19sb2NfcHJlZGljdGVkX29yYml0c19kYXRhX3ZhbGlkaXR5X3JlcG9ydF9zX3R5cGUgewotICBycGNfdWludDY0IHN0YXJ0X3RpbWVfdXRjOwotICBycGNfdWludDE2IHZhbGlkX2R1cmF0aW9uX2hyczsKLX07Ci0KLXN0cnVjdCBycGNfbG9jX3ByZWRpY3RlZF9vcmJpdHNfYXV0b19kb3dubG9hZF9jb25maWdfc190eXBlIHsKLSAgcnBjX2Jvb2xlYW4gZW5hYmxlOwotICB1bnNpZ25lZCBjaGFyIGF1dG9fY2hlY2tfZXZlcnlfaHJzOwotfTsKLQotc3RydWN0IHJwY19sb2NfYXNzaXN0X2RhdGFfdGltZV9zX3R5cGUgewotICBycGNfdWludDY0IHRpbWVfdXRjOwotICBycGNfdWludDMyIHVuY2VydGFpbnR5OwotfTsKLQotdHlwZWRlZiBycGNfdWludDY0IHJwY19sb2NfYXNzaXN0X3Bvc192YWxpZF9tYXNrX3R5cGU7Ci0KLXN0cnVjdCBycGNfbG9jX2Fzc2lzdF9kYXRhX3Bvc19zX3R5cGUgewotICBycGNfbG9jX2Fzc2lzdF9wb3NfdmFsaWRfbWFza190eXBlIHZhbGlkX21hc2s7Ci0gIHJwY191aW50NjQgdGltZXN0YW1wX3V0YzsKLSAgZG91YmxlIGxhdGl0dWRlOwotICBkb3VibGUgbG9uZ2l0dWRlOwotICBmbG9hdCBhbHRpdHVkZV93cnRfZWxsaXBzb2lkOwotICBmbG9hdCBhbHRpdHVkZV93cnRfbWVhbl9zZWFfbGV2ZWw7Ci0gIGZsb2F0IGhvcl91bmNfY2lyY3VsYXI7Ci0gIGZsb2F0IHZlcnRfdW5jOwotICB1bnNpZ25lZCBjaGFyIGNvbmZpZGVuY2VfaG9yaXpvbnRhbDsKLSAgdW5zaWduZWQgY2hhciBjb25maWRlbmNlX3ZlcnRpY2FsOwotfTsKLQotZW51bSBycGNfbG9jX3NlcnZlcl9vcGVuX3N0YXR1c19lX3R5cGUgewotICBSUENfTE9DX1NFUlZFUl9PUEVOX1NVQ0NFU1MgPSAxLAotICBSUENfTE9DX1NFUlZFUl9PUEVOX0ZBSUwgPSAyLAotICBSUENfTE9DX1NFUlZFUl9PUEVOX1NUQVRVU19NQVggPSAyNjg0MzU0NTYKLX07Ci0KLXN0cnVjdCBycGNfbG9jX3NlcnZlcl9vcGVuX3N0YXR1c19zX3R5cGUgewotICBycGNfbG9jX3NlcnZlcl9jb25uZWN0aW9uX2hhbmRsZSBjb25uX2hhbmRsZTsKLSAgcnBjX2xvY19zZXJ2ZXJfb3Blbl9zdGF0dXNfZV90eXBlIG9wZW5fc3RhdHVzOwotICBzdHJpbmcgYXBuX25hbWU8PjsKLX07Ci0KLWVudW0gcnBjX2xvY19zZXJ2ZXJfY2xvc2Vfc3RhdHVzX2VfdHlwZSB7Ci0gIFJQQ19MT0NfU0VSVkVSX0NMT1NFX1NVQ0NFU1MgPSAxLAotICBSUENfTE9DX1NFUlZFUl9DTE9TRV9GQUlMID0gMiwKLSAgUlBDX0xPQ19TRVJWRVJfQ0xPU0VfU1RBVFVTX01BWCA9IDI2ODQzNTQ1NgotfTsKLQotc3RydWN0IHJwY19sb2Nfc2VydmVyX2Nsb3NlX3N0YXR1c19zX3R5cGUgewotICBycGNfbG9jX3NlcnZlcl9jb25uZWN0aW9uX2hhbmRsZSBjb25uX2hhbmRsZTsKLSAgcnBjX2xvY19zZXJ2ZXJfY2xvc2Vfc3RhdHVzX2VfdHlwZSBjbG9zZV9zdGF0dXM7Ci19OwotCi1lbnVtIHJwY19sb2NfbG9ja19lX3R5cGUgewotICBSUENfTE9DX0xPQ0tfTk9ORSA9IDEsCi0gIFJQQ19MT0NfTE9DS19NSSA9IDIsCi0gIFJQQ19MT0NfTE9DS19NVCA9IDMsCi0gIFJQQ19MT0NfTE9DS19BTEwgPSA0LAotICBSUENfTE9DX0xPQ0tfTUFYID0gMjY4NDM1NDU2Ci19OwotCi10eXBlZGVmIHJwY191aW50MzIgcnBjX2xvY19ubWVhX3NlbnRlbmNlX3R5cGU7Ci0KLXR5cGVkZWYgcnBjX3VpbnQzMiBycGNfbG9jX2Fzc2lzdF9kYXRhX3R5cGU7Ci0KLXN0cnVjdCBycGNfbG9jX2Fzc2lzdF9kYXRhX2RlbGV0ZV9zX3R5cGUgewotICBycGNfbG9jX2Fzc2lzdF9kYXRhX3R5cGUgdHlwZTsKLSAgcnBjX3VpbnQzMiByZXNlcnZlZFs4XTsKLX07Ci0KLXVuaW9uIHJwY19sb2NfaW9jdGxfZGF0YV91X3R5cGUgc3dpdGNoIChycGNfbG9jX2lvY3RsX2VfdHlwZSBkaXNjKSB7Ci0gIGNhc2UgUlBDX0xPQ19JT0NUTF9TRVRfRklYX0NSSVRFUklBOgotICAgIHJwY19sb2NfZml4X2NyaXRlcmlhX3NfdHlwZSBmaXhfY3JpdGVyaWE7Ci0gIGNhc2UgUlBDX0xPQ19JT0NUTF9JTkZPUk1fTklfVVNFUl9SRVNQT05TRToKLSAgICBycGNfbG9jX3VzZXJfdmVyaWZ5X3NfdHlwZSB1c2VyX3ZlcmlmeV9yZXNwOwotICBjYXNlIFJQQ19MT0NfSU9DVExfSU5KRUNUX1BSRURJQ1RFRF9PUkJJVFNfREFUQToKLSAgICBycGNfbG9jX3ByZWRpY3RlZF9vcmJpdHNfZGF0YV9zX3R5cGUgcHJlZGljdGVkX29yYml0c19kYXRhOwotICBjYXNlIFJQQ19MT0NfSU9DVExfU0VUX1BSRURJQ1RFRF9PUkJJVFNfREFUQV9BVVRPX0RPV05MT0FEOgotICAgIHJwY19sb2NfcHJlZGljdGVkX29yYml0c19hdXRvX2Rvd25sb2FkX2NvbmZpZ19zX3R5cGUgcHJlZGljdGVkX29yYml0c19hdXRvX2Rvd25sb2FkOwotICBjYXNlIFJQQ19MT0NfSU9DVExfSU5KRUNUX1VUQ19USU1FOgotICAgIHJwY19sb2NfYXNzaXN0X2RhdGFfdGltZV9zX3R5cGUgYXNzaXN0YW5jZV9kYXRhX3RpbWU7Ci0gIGNhc2UgUlBDX0xPQ19JT0NUTF9JTkpFQ1RfUE9TSVRJT046Ci0gICAgcnBjX2xvY19hc3Npc3RfZGF0YV9wb3Nfc190eXBlIGFzc2lzdGFuY2VfZGF0YV9wb3NpdGlvbjsKLSAgY2FzZSBSUENfTE9DX0lPQ1RMX0lORk9STV9TRVJWRVJfT1BFTl9TVEFUVVM6Ci0gICAgcnBjX2xvY19zZXJ2ZXJfb3Blbl9zdGF0dXNfc190eXBlIGNvbm5fb3Blbl9zdGF0dXM7Ci0gIGNhc2UgUlBDX0xPQ19JT0NUTF9JTkZPUk1fU0VSVkVSX0NMT1NFX1NUQVRVUzoKLSAgICBycGNfbG9jX3NlcnZlcl9jbG9zZV9zdGF0dXNfc190eXBlIGNvbm5fY2xvc2Vfc3RhdHVzOwotICBjYXNlIFJQQ19MT0NfSU9DVExfU0VUX0VOR0lORV9MT0NLOgotICAgIHJwY19sb2NfbG9ja19lX3R5cGUgZW5naW5lX2xvY2s7Ci0gIGNhc2UgUlBDX0xPQ19JT0NUTF9TRVRfU0JBU19DT05GSUc6Ci0gICAgcnBjX2Jvb2xlYW4gc2Jhc19tb2RlOwotICBjYXNlIFJQQ19MT0NfSU9DVExfU0VUX05NRUFfVFlQRVM6Ci0gICAgcnBjX2xvY19ubWVhX3NlbnRlbmNlX3R5cGUgbm1lYV90eXBlczsKLSAgY2FzZSBSUENfTE9DX0lPQ1RMX1NFVF9PTl9ERU1BTkRfTFBNOgotICAgIHJwY19ib29sZWFuIG9uX2RlbWFuZF9scG07Ci0gIGNhc2UgIFJQQ19MT0NfSU9DVExfU0VUX0NETUFfUERFX1NFUlZFUl9BRERSOgotICBjYXNlICBSUENfTE9DX0lPQ1RMX1NFVF9DRE1BX01QQ19TRVJWRVJfQUREUjoKLSAgY2FzZSAgUlBDX0xPQ19JT0NUTF9TRVRfVU1UU19TTFBfU0VSVkVSX0FERFI6Ci0gIGNhc2UgIFJQQ19MT0NfSU9DVExfU0VUX0NVU1RPTV9QREVfU0VSVkVSX0FERFI6Ci0gICAgcnBjX2xvY19zZXJ2ZXJfaW5mb19zX3R5cGUgc2VydmVyX2FkZHI7Ci0gIGNhc2UgUlBDX0xPQ19JT0NUTF9ERUxFVEVfQVNTSVNUX0RBVEE6Ci0gICAgcnBjX2xvY19hc3Npc3RfZGF0YV9kZWxldGVfc190eXBlIGFzc2lzdF9kYXRhX2RlbGV0ZTsKLSAgZGVmYXVsdDoKLSAgICB2b2lkOwotfTsKLQotdW5pb24gcnBjX2xvY19pb2N0bF9jYWxsYmFja19kYXRhX3VfdHlwZSBzd2l0Y2ggKHJwY19sb2NfaW9jdGxfZV90eXBlIGRpc2MpIHsKLSAgY2FzZSBSUENfTE9DX0lPQ1RMX0dFVF9BUElfVkVSU0lPTjoKLSAgICBycGNfbG9jX2FwaV92ZXJzaW9uX3NfdHlwZSBhcGlfdmVyc2lvbjsKLSAgY2FzZSBSUENfTE9DX0lPQ1RMX0dFVF9GSVhfQ1JJVEVSSUE6Ci0gICAgcnBjX2xvY19maXhfY3JpdGVyaWFfc190eXBlIGZpeF9jcml0ZXJpYTsKLSAgY2FzZSBSUENfTE9DX0lPQ1RMX0dFVF9FTkdJTkVfTE9DSzoKLSAgICBycGNfbG9jX2xvY2tfZV90eXBlIGVuZ2luZV9sb2NrOwotICBjYXNlIFJQQ19MT0NfSU9DVExfR0VUX1NCQVNfQ09ORklHOgotICAgIHJwY19ib29sZWFuIHNiYXNfbW9kZTsKLSAgY2FzZSBSUENfTE9DX0lPQ1RMX0dFVF9OTUVBX1RZUEVTOgotICAgIHJwY19sb2Nfbm1lYV9zZW50ZW5jZV90eXBlIG5tZWFfdHlwZXM7Ci0gIGNhc2UgUlBDX0xPQ19JT0NUTF9HRVRfT05fREVNQU5EX0xQTToKLSAgICBycGNfYm9vbGVhbiBvbl9kZW1hbmRfbHBtOwotICBjYXNlICBSUENfTE9DX0lPQ1RMX0dFVF9DRE1BX1BERV9TRVJWRVJfQUREUjoKLSAgY2FzZSAgUlBDX0xPQ19JT0NUTF9HRVRfQ0RNQV9NUENfU0VSVkVSX0FERFI6Ci0gIGNhc2UgIFJQQ19MT0NfSU9DVExfR0VUX1VNVFNfU0xQX1NFUlZFUl9BRERSOgotICAgIHJwY19sb2Nfc2VydmVyX2luZm9fc190eXBlIHNlcnZlcl9hZGRyOwotICBjYXNlIFJQQ19MT0NfSU9DVExfUVVFUllfUFJFRElDVEVEX09SQklUU19EQVRBX1NPVVJDRToKLSAgICBycGNfbG9jX3ByZWRpY3RlZF9vcmJpdHNfZGF0YV9zb3VyY2Vfc190eXBlIHByZWRpY3RlZF9vcmJpdHNfZGF0YV9zb3VyY2U7Ci0gIGNhc2UgUlBDX0xPQ19JT0NUTF9RVUVSWV9QUkVESUNURURfT1JCSVRTX0RBVEFfVkFMSURJVFk6Ci0gICAgcnBjX2xvY19wcmVkaWN0ZWRfb3JiaXRzX2RhdGFfdmFsaWRpdHlfcmVwb3J0X3NfdHlwZSBwcmVkaWN0ZWRfb3JiaXRzX2RhdGFfdmFsaWRpdHk7Ci0gIGRlZmF1bHQ6Ci0gICAgdm9pZDsKLX07Ci0KLXN0cnVjdCBycGNfbG9jX2lvY3RsX2NhbGxiYWNrX3NfdHlwZSB7Ci0gIHJwY19sb2NfaW9jdGxfZV90eXBlIHR5cGU7Ci0gIHJwY19pbnQzMiBzdGF0dXM7Ci0gIHJwY19sb2NfaW9jdGxfY2FsbGJhY2tfZGF0YV91X3R5cGUgZGF0YTsKLX07Ci0KLXVuaW9uIHJwY19sb2NfZXZlbnRfcGF5bG9hZF91X3R5cGUgc3dpdGNoICh1bnNpZ25lZCBoeXBlciBkaXNjKSB7Ci0gIGNhc2UgUlBDX0xPQ19FVkVOVF9QQVJTRURfUE9TSVRJT05fUkVQT1JUOgotICAgIHJwY19sb2NfcGFyc2VkX3Bvc2l0aW9uX3NfdHlwZSBwYXJzZWRfbG9jYXRpb25fcmVwb3J0OwotICBjYXNlIFJQQ19MT0NfRVZFTlRfU0FURUxMSVRFX1JFUE9SVDoKLSAgICBycGNfbG9jX2duc3NfaW5mb19zX3R5cGUgZ25zc19yZXBvcnQ7Ci0gIGNhc2UgUlBDX0xPQ19FVkVOVF9OTUVBX1BPU0lUSU9OX1JFUE9SVDoKLSAgICBycGNfbG9jX25tZWFfcmVwb3J0X3NfdHlwZSBubWVhX3JlcG9ydDsKLSAgY2FzZSBSUENfTE9DX0VWRU5UX05JX05PVElGWV9WRVJJRllfUkVRVUVTVDoKLSAgICBycGNfbG9jX25pX2V2ZW50X3NfdHlwZSBuaV9yZXF1ZXN0OwotICBjYXNlIFJQQ19MT0NfRVZFTlRfQVNTSVNUQU5DRV9EQVRBX1JFUVVFU1Q6Ci0gICAgcnBjX2xvY19hc3Npc3RfZGF0YV9yZXF1ZXN0X3NfdHlwZSBhc3Npc3RfZGF0YV9yZXF1ZXN0OwotICBjYXNlIFJQQ19MT0NfRVZFTlRfTE9DQVRJT05fU0VSVkVSX1JFUVVFU1Q6Ci0gICAgcnBjX2xvY19zZXJ2ZXJfcmVxdWVzdF9zX3R5cGUgbG9jX3NlcnZlcl9yZXF1ZXN0OwotICBjYXNlIFJQQ19MT0NfRVZFTlRfSU9DVExfUkVQT1JUOgotICAgIHJwY19sb2NfaW9jdGxfY2FsbGJhY2tfc190eXBlIGlvY3RsX3JlcG9ydDsKLSAgY2FzZSBSUENfTE9DX0VWRU5UX1NUQVRVU19SRVBPUlQ6Ci0gICAgcnBjX2xvY19zdGF0dXNfZXZlbnRfc190eXBlIHN0YXR1c19yZXBvcnQ7Ci0gIGNhc2UgUlBDX0xPQ19FVkVOVF9SRVNFUlZFRDoKLSAgICBycGNfbG9jX3Jlc2VydmVkX3BheWxvYWRfc190eXBlIHJlc2VydmVkOwotICBkZWZhdWx0OgotICAgIHZvaWQ7Ci19OwotCi1jb25zdCBSUENfTE9DX0FQSV9OVUxMX1ZFUlNJT04gPSAweDAwMDEwMDAxOwotY29uc3QgUlBDX0xPQ19BUElfUlBDX0dMVUVfQ09ERV9JTkZPX1JFTU9URV9WRVJTSU9OID0gMHgwMDAxMDAwMTsKZGlmZiAtLWdpdCBhL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpLXJwYy9nZW4tMzIwMC9sb2NfYXBpX2NvbW1vbl94ZHIuYyBiL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpLXJwYy9nZW4tMzIwMC9sb2NfYXBpX2NvbW1vbl94ZHIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2IzN2I5Yy4uMDAwMDAwMAotLS0gYS9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaS1ycGMvZ2VuLTMyMDAvbG9jX2FwaV9jb21tb25feGRyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQxICswLDAgQEAKLS8qCi0gKiBQbGVhc2UgZG8gbm90IGVkaXQgdGhpcyBmaWxlLgotICogSXQgd2FzIGdlbmVyYXRlZCB1c2luZyBycGNnZW4uCi0gKi8KLQotI2luY2x1ZGUgImxvY19hcGlfY29tbW9uLmgiCi0KLWJvb2xfdAoteGRyX3JwY19ib29sZWFuIChYRFIgKnhkcnMsIHJwY19ib29sZWFuICpvYmpwKQotewotCXJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotCSBpZiAoIXhkcl9ib29sICh4ZHJzLCBvYmpwKSkKLQkJIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX3VpbnQzMiAoWERSICp4ZHJzLCBycGNfdWludDMyICpvYmpwKQotewotCXJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotCSBpZiAoIXhkcl91X2xvbmcgKHhkcnMsIG9ianApKQotCQkgcmV0dXJuIEZBTFNFOwotCXJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfdWludDE2IChYRFIgKnhkcnMsIHJwY191aW50MTYgKm9ianApCi17Ci0JcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0JIGlmICgheGRyX3Vfc2hvcnQgKHhkcnMsIG9ianApKQotCQkgcmV0dXJuIEZBTFNFOwotCXJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfdWludDggKFhEUiAqeGRycywgcnBjX3VpbnQ4ICpvYmpwKQotewotCXJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotCSBpZiAoIXhkcl91X2NoYXIgKHhkcnMsIG9ianApKQotCQkgcmV0dXJuIEZBTFNFOwotCXJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfaW50MzIgKFhEUiAqeGRycywgcnBjX2ludDMyICpvYmpwKQotewotCXJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotCSBpZiAoIXhkcl9sb25nICh4ZHJzLCBvYmpwKSkKLQkJIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2J5dGUgKFhEUiAqeGRycywgcnBjX2J5dGUgKm9ianApCi17Ci0JcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0JIGlmICgheGRyX3VfY2hhciAoeGRycywgb2JqcCkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY191aW50NjQgKFhEUiAqeGRycywgcnBjX3VpbnQ2NCAqb2JqcCkKLXsKLQlyZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLQkgaWYgKCF4ZHJfdV9xdWFkX3QgKHhkcnMsIG9ianApKQotCQkgcmV0dXJuIEZBTFNFOwotCXJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfbG9jX2NsaWVudF9oYW5kbGVfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX2NsaWVudF9oYW5kbGVfdHlwZSAqb2JqcCkKLXsKLQlyZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLQkgaWYgKCF4ZHJfcnBjX2ludDMyICh4ZHJzLCBvYmpwKSkKLQkJIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19ldmVudF9tYXNrX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19ldmVudF9tYXNrX3R5cGUgKm9ianApCi17Ci0JcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0JIGlmICgheGRyX3JwY191aW50NjQgKHhkcnMsIG9ianApKQotCQkgcmV0dXJuIEZBTFNFOwotCXJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfbG9jX3Bvc2l0aW9uX3ZhbGlkX21hc2tfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX3Bvc2l0aW9uX3ZhbGlkX21hc2tfdHlwZSAqb2JqcCkKLXsKLQlyZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLQkgaWYgKCF4ZHJfcnBjX3VpbnQ2NCAoeGRycywgb2JqcCkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2NfcG9zX3RlY2hub2xvZ3lfbWFza190eXBlIChYRFIgKnhkcnMsIHJwY19sb2NfcG9zX3RlY2hub2xvZ3lfbWFza190eXBlICpvYmpwKQotewotCXJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotCSBpZiAoIXhkcl9ycGNfdWludDMyICh4ZHJzLCBvYmpwKSkKLQkJIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19zZXNzaW9uX3N0YXR1c19lX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19zZXNzaW9uX3N0YXR1c19lX3R5cGUgKm9ianApCi17Ci0JcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0JIGlmICgheGRyX2VudW0gKHhkcnMsIChlbnVtX3QgKikgb2JqcCkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2NfY2FsZW5kYXJfdGltZV9zX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19jYWxlbmRhcl90aW1lX3NfdHlwZSAqb2JqcCkKLXsKLQlyZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLQkgaWYgKCF4ZHJfcnBjX3VpbnQxNiAoeGRycywgJm9ianAtPnllYXIpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl91X2NoYXIgKHhkcnMsICZvYmpwLT5tb250aCkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX3VfY2hhciAoeGRycywgJm9ianAtPmRheV9vZl93ZWVrKSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfdV9jaGFyICh4ZHJzLCAmb2JqcC0+ZGF5KSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfdV9jaGFyICh4ZHJzLCAmb2JqcC0+aG91cikpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX3VfY2hhciAoeGRycywgJm9ianAtPm1pbnV0ZSkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX3VfY2hhciAoeGRycywgJm9ianAtPnNlY29uZCkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX3JwY191aW50MTYgKHhkcnMsICZvYmpwLT5taWxsaXNlY29uZCkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2NfcGFyc2VkX3Bvc2l0aW9uX3NfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX3BhcnNlZF9wb3NpdGlvbl9zX3R5cGUgKm9ianApCi17Ci0JcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0JIGlmICgheGRyX3JwY19sb2NfcG9zaXRpb25fdmFsaWRfbWFza190eXBlICh4ZHJzLCAmb2JqcC0+dmFsaWRfbWFzaykpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX3JwY19sb2Nfc2Vzc2lvbl9zdGF0dXNfZV90eXBlICh4ZHJzLCAmb2JqcC0+c2Vzc2lvbl9zdGF0dXMpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9ycGNfbG9jX2NhbGVuZGFyX3RpbWVfc190eXBlICh4ZHJzLCAmb2JqcC0+dGltZXN0YW1wX2NhbGVuZGFyKSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfcnBjX3VpbnQ2NCAoeGRycywgJm9ianAtPnRpbWVzdGFtcF91dGMpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9ycGNfdWludDggKHhkcnMsICZvYmpwLT5sZWFwX3NlY29uZHMpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9mbG9hdCAoeGRycywgJm9ianAtPnRpbWVfdW5jKSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfZG91YmxlICh4ZHJzLCAmb2JqcC0+bGF0aXR1ZGUpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9kb3VibGUgKHhkcnMsICZvYmpwLT5sb25naXR1ZGUpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9mbG9hdCAoeGRycywgJm9ianAtPmFsdGl0dWRlX3dydF9lbGxpcHNvaWQpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9mbG9hdCAoeGRycywgJm9ianAtPmFsdGl0dWRlX3dydF9tZWFuX3NlYV9sZXZlbCkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX2Zsb2F0ICh4ZHJzLCAmb2JqcC0+c3BlZWRfaG9yaXpvbnRhbCkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX2Zsb2F0ICh4ZHJzLCAmb2JqcC0+c3BlZWRfdmVydGljYWwpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9mbG9hdCAoeGRycywgJm9ianAtPmhlYWRpbmcpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9mbG9hdCAoeGRycywgJm9ianAtPmhvcl91bmNfY2lyY3VsYXIpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9mbG9hdCAoeGRycywgJm9ianAtPmhvcl91bmNfZWxsaXBzZV9zZW1pX21ham9yKSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfZmxvYXQgKHhkcnMsICZvYmpwLT5ob3JfdW5jX2VsbGlwc2Vfc2VtaV9taW5vcikpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX2Zsb2F0ICh4ZHJzLCAmb2JqcC0+aG9yX3VuY19lbGxpcHNlX29yaWVudF9hemltdXRoKSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfZmxvYXQgKHhkcnMsICZvYmpwLT52ZXJ0X3VuYykpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX2Zsb2F0ICh4ZHJzLCAmb2JqcC0+c3BlZWRfdW5jKSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfZmxvYXQgKHhkcnMsICZvYmpwLT5oZWFkaW5nX3VuYykpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX3VfY2hhciAoeGRycywgJm9ianAtPmNvbmZpZGVuY2VfaG9yaXpvbnRhbCkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX3VfY2hhciAoeGRycywgJm9ianAtPmNvbmZpZGVuY2VfdmVydGljYWwpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9mbG9hdCAoeGRycywgJm9ianAtPm1hZ25ldGljX2RldmlhdGlvbikpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX3JwY19sb2NfcG9zX3RlY2hub2xvZ3lfbWFza190eXBlICh4ZHJzLCAmb2JqcC0+dGVjaG5vbG9neV9tYXNrKSkKLQkJIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19zdl9zeXN0ZW1fZV90eXBlIChYRFIgKnhkcnMsIHJwY19sb2Nfc3Zfc3lzdGVtX2VfdHlwZSAqb2JqcCkKLXsKLQlyZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLQkgaWYgKCF4ZHJfZW51bSAoeGRycywgKGVudW1fdCAqKSBvYmpwKSkKLQkJIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19zdl9zdGF0dXNfZV90eXBlIChYRFIgKnhkcnMsIHJwY19sb2Nfc3Zfc3RhdHVzX2VfdHlwZSAqb2JqcCkKLXsKLQlyZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLQkgaWYgKCF4ZHJfZW51bSAoeGRycywgKGVudW1fdCAqKSBvYmpwKSkKLQkJIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19zdl9pbmZvX3ZhbGlkX21hc2tfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX3N2X2luZm9fdmFsaWRfbWFza190eXBlICpvYmpwKQotewotCXJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotCSBpZiAoIXhkcl9ycGNfdWludDMyICh4ZHJzLCBvYmpwKSkKLQkJIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19zdl9pbmZvX3NfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX3N2X2luZm9fc190eXBlICpvYmpwKQotewotCXJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotCSBpZiAoIXhkcl9ycGNfbG9jX3N2X2luZm9fdmFsaWRfbWFza190eXBlICh4ZHJzLCAmb2JqcC0+dmFsaWRfbWFzaykpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX3JwY19sb2Nfc3Zfc3lzdGVtX2VfdHlwZSAoeGRycywgJm9ianAtPnN5c3RlbSkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX3JwY191aW50OCAoeGRycywgJm9ianAtPnBybikpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX3JwY191aW50OCAoeGRycywgJm9ianAtPmhlYWx0aF9zdGF0dXMpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9ycGNfbG9jX3N2X3N0YXR1c19lX3R5cGUgKHhkcnMsICZvYmpwLT5wcm9jZXNzX3N0YXR1cykpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX3JwY19ib29sZWFuICh4ZHJzLCAmb2JqcC0+aGFzX2VwaCkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX3JwY19ib29sZWFuICh4ZHJzLCAmb2JqcC0+aGFzX2FsbSkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX2Zsb2F0ICh4ZHJzLCAmb2JqcC0+ZWxldmF0aW9uKSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfZmxvYXQgKHhkcnMsICZvYmpwLT5hemltdXRoKSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfZmxvYXQgKHhkcnMsICZvYmpwLT5zbnIpKQotCQkgcmV0dXJuIEZBTFNFOwotCXJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfbG9jX2duc3NfaW5mb192YWxpZF9tYXNrX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19nbnNzX2luZm9fdmFsaWRfbWFza190eXBlICpvYmpwKQotewotCXJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotCSBpZiAoIXhkcl9ycGNfdWludDMyICh4ZHJzLCBvYmpwKSkKLQkJIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19nbnNzX2luZm9fc190eXBlIChYRFIgKnhkcnMsIHJwY19sb2NfZ25zc19pbmZvX3NfdHlwZSAqb2JqcCkKLXsKLQlyZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLQkgaWYgKCF4ZHJfcnBjX2xvY19nbnNzX2luZm9fdmFsaWRfbWFza190eXBlICh4ZHJzLCAmb2JqcC0+dmFsaWRfbWFzaykpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX2Zsb2F0ICh4ZHJzLCAmb2JqcC0+cG9zaXRpb25fZG9wKSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfZmxvYXQgKHhkcnMsICZvYmpwLT5ob3Jpem9udGFsX2RvcCkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX2Zsb2F0ICh4ZHJzLCAmb2JqcC0+dmVydGljYWxfZG9wKSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfcnBjX2Jvb2xlYW4gKHhkcnMsICZvYmpwLT5hbHRpdHVkZV9hc3N1bWVkKSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfcnBjX3VpbnQxNiAoeGRycywgJm9ianAtPnN2X2NvdW50KSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfYXJyYXkgKHhkcnMsIChjaGFyICoqKSZvYmpwLT5zdl9saXN0LnN2X2xpc3RfdmFsLCAodV9pbnQgKikgJm9ianAtPnN2X2xpc3Quc3ZfbGlzdF9sZW4sIFJQQ19MT0NfQVBJX01BWF9TVl9DT1VOVCwKLQkJc2l6ZW9mIChycGNfbG9jX3N2X2luZm9fc190eXBlKSwgKHhkcnByb2NfdCkgeGRyX3JwY19sb2Nfc3ZfaW5mb19zX3R5cGUpKQotCQkgcmV0dXJuIEZBTFNFOwotCXJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfbG9jX25tZWFfcmVwb3J0X3NfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX25tZWFfcmVwb3J0X3NfdHlwZSAqb2JqcCkKLXsKLQlyZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLQkgaWYgKCF4ZHJfcnBjX3VpbnQxNiAoeGRycywgJm9ianAtPmxlbmd0aCkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX2J5dGVzICh4ZHJzLCAoY2hhciAqKikmb2JqcC0+bm1lYV9zZW50ZW5jZXMubm1lYV9zZW50ZW5jZXNfdmFsLCAodV9pbnQgKikgJm9ianAtPm5tZWFfc2VudGVuY2VzLm5tZWFfc2VudGVuY2VzX2xlbiwgUlBDX0xPQ19BUElfTUFYX05NRUFfU1RSSU5HX0xFTkdUSCkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2Nfc3RhdHVzX2V2ZW50X2VfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX3N0YXR1c19ldmVudF9lX3R5cGUgKm9ianApCi17Ci0JcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0JIGlmICgheGRyX2VudW0gKHhkcnMsIChlbnVtX3QgKikgb2JqcCkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2NfZW5naW5lX3N0YXRlX2VfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX2VuZ2luZV9zdGF0ZV9lX3R5cGUgKm9ianApCi17Ci0JcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0JIGlmICgheGRyX2VudW0gKHhkcnMsIChlbnVtX3QgKikgb2JqcCkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2Nfc3RhdHVzX2V2ZW50X3BheWxvYWRfdV90eXBlIChYRFIgKnhkcnMsIHJwY19sb2Nfc3RhdHVzX2V2ZW50X3BheWxvYWRfdV90eXBlICpvYmpwKQotewotCXJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotCSBpZiAoIXhkcl9ycGNfbG9jX3N0YXR1c19ldmVudF9lX3R5cGUgKHhkcnMsICZvYmpwLT5kaXNjKSkKLQkJIHJldHVybiBGQUxTRTsKLQlzd2l0Y2ggKG9ianAtPmRpc2MpIHsKLQljYXNlIFJQQ19MT0NfU1RBVFVTX0VWRU5UX0VOR0lORV9TVEFURToKLQkJIGlmICgheGRyX3JwY19sb2NfZW5naW5lX3N0YXRlX2VfdHlwZSAoeGRycywgJm9ianAtPnJwY19sb2Nfc3RhdHVzX2V2ZW50X3BheWxvYWRfdV90eXBlX3UuZW5naW5lX3N0YXRlKSkKLQkJCSByZXR1cm4gRkFMU0U7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19zdGF0dXNfZXZlbnRfc190eXBlIChYRFIgKnhkcnMsIHJwY19sb2Nfc3RhdHVzX2V2ZW50X3NfdHlwZSAqb2JqcCkKLXsKLQlyZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLQkgaWYgKCF4ZHJfcnBjX2xvY19zdGF0dXNfZXZlbnRfZV90eXBlICh4ZHJzLCAmb2JqcC0+ZXZlbnQpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9ycGNfbG9jX3N0YXR1c19ldmVudF9wYXlsb2FkX3VfdHlwZSAoeGRycywgJm9ianAtPnBheWxvYWQpKQotCQkgcmV0dXJuIEZBTFNFOwotCXJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfbG9jX3NlcnZlcl9hZGRyX2VfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX3NlcnZlcl9hZGRyX2VfdHlwZSAqb2JqcCkKLXsKLQlyZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLQkgaWYgKCF4ZHJfZW51bSAoeGRycywgKGVudW1fdCAqKSBvYmpwKSkKLQkJIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19zZXJ2ZXJfYWRkcl9pcHY0X3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19zZXJ2ZXJfYWRkcl9pcHY0X3R5cGUgKm9ianApCi17Ci0JcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0JIGlmICgheGRyX3JwY191aW50MzIgKHhkcnMsICZvYmpwLT5hZGRyKSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfcnBjX3VpbnQxNiAoeGRycywgJm9ianAtPnBvcnQpKQotCQkgcmV0dXJuIEZBTFNFOwotCXJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfbG9jX3NlcnZlcl9hZGRyX3VybF90eXBlIChYRFIgKnhkcnMsIHJwY19sb2Nfc2VydmVyX2FkZHJfdXJsX3R5cGUgKm9ianApCi17Ci0JcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0JIGlmICgheGRyX3JwY191aW50MTYgKHhkcnMsICZvYmpwLT5sZW5ndGgpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9ieXRlcyAoeGRycywgKGNoYXIgKiopJm9ianAtPmFkZHIuYWRkcl92YWwsICh1X2ludCAqKSAmb2JqcC0+YWRkci5hZGRyX2xlbiwgUlBDX0xPQ19BUElfTUFYX1NFUlZFUl9BRERSX0xFTkdUSCkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2Nfc2VydmVyX2FkZHJfdV90eXBlIChYRFIgKnhkcnMsIHJwY19sb2Nfc2VydmVyX2FkZHJfdV90eXBlICpvYmpwKQotewotCXJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotCSBpZiAoIXhkcl9ycGNfbG9jX3NlcnZlcl9hZGRyX2VfdHlwZSAoeGRycywgJm9ianAtPmRpc2MpKQotCQkgcmV0dXJuIEZBTFNFOwotCXN3aXRjaCAob2JqcC0+ZGlzYykgewotCWNhc2UgUlBDX0xPQ19TRVJWRVJfQUREUl9JUFY0OgotCQkgaWYgKCF4ZHJfcnBjX2xvY19zZXJ2ZXJfYWRkcl9pcHY0X3R5cGUgKHhkcnMsICZvYmpwLT5ycGNfbG9jX3NlcnZlcl9hZGRyX3VfdHlwZV91LmlwdjQpKQotCQkJIHJldHVybiBGQUxTRTsKLQkJYnJlYWs7Ci0JY2FzZSBSUENfTE9DX1NFUlZFUl9BRERSX1VSTDoKLQkJIGlmICgheGRyX3JwY19sb2Nfc2VydmVyX2FkZHJfdXJsX3R5cGUgKHhkcnMsICZvYmpwLT5ycGNfbG9jX3NlcnZlcl9hZGRyX3VfdHlwZV91LnVybCkpCi0JCQkgcmV0dXJuIEZBTFNFOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2Nfc2VydmVyX2luZm9fc190eXBlIChYRFIgKnhkcnMsIHJwY19sb2Nfc2VydmVyX2luZm9fc190eXBlICpvYmpwKQotewotCXJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotCSBpZiAoIXhkcl9ycGNfbG9jX3NlcnZlcl9hZGRyX2VfdHlwZSAoeGRycywgJm9ianAtPmFkZHJfdHlwZSkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX3JwY19sb2Nfc2VydmVyX2FkZHJfdV90eXBlICh4ZHJzLCAmb2JqcC0+YWRkcl9pbmZvKSkKLQkJIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19uaV9ub3RpZnlfdmVyaWZ5X2VfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX25pX25vdGlmeV92ZXJpZnlfZV90eXBlICpvYmpwKQotewotCXJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotCSBpZiAoIXhkcl9lbnVtICh4ZHJzLCAoZW51bV90ICopIG9ianApKQotCQkgcmV0dXJuIEZBTFNFOwotCXJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfbG9jX25pX2V2ZW50X2VfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX25pX2V2ZW50X2VfdHlwZSAqb2JqcCkKLXsKLQlyZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLQkgaWYgKCF4ZHJfZW51bSAoeGRycywgKGVudW1fdCAqKSBvYmpwKSkKLQkJIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19uaV9kYXRhY29kaW5nX3NjaGVtZV9lX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19uaV9kYXRhY29kaW5nX3NjaGVtZV9lX3R5cGUgKm9ianApCi17Ci0JcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0JIGlmICgheGRyX2VudW0gKHhkcnMsIChlbnVtX3QgKikgb2JqcCkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2NfbmlfdnhfcmVxdWVzdGVyX2lkX2VuY29kaW5nX3NjaGVtZV9lX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19uaV92eF9yZXF1ZXN0ZXJfaWRfZW5jb2Rpbmdfc2NoZW1lX2VfdHlwZSAqb2JqcCkKLXsKLQlyZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLQkgaWYgKCF4ZHJfZW51bSAoeGRycywgKGVudW1fdCAqKSBvYmpwKSkKLQkJIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19uaV92eF9wb3NfbW9kZV9lX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19uaV92eF9wb3NfbW9kZV9lX3R5cGUgKm9ianApCi17Ci0JcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0JIGlmICgheGRyX2VudW0gKHhkcnMsIChlbnVtX3QgKikgb2JqcCkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2NfbmlfdnhfcmVxdWVzdGVyX2lkX3NfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX25pX3Z4X3JlcXVlc3Rlcl9pZF9zX3R5cGUgKm9ianApCi17Ci0JcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0JaW50IGk7Ci0JIGlmICgheGRyX3VfY2hhciAoeGRycywgJm9ianAtPnJlcXVlc3Rlcl9pZF9sZW5ndGgpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9vcGFxdWUgKHhkcnMsIG9ianAtPnJlcXVlc3Rlcl9pZCwgMjAwKSkKLQkJIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19uaV92eF9ub3RpZnlfdmVyaWZ5X3JlcV9zX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19uaV92eF9ub3RpZnlfdmVyaWZ5X3JlcV9zX3R5cGUgKm9ianApCi17Ci0JcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0JIGlmICgheGRyX3JwY19sb2Nfbmlfbm90aWZ5X3ZlcmlmeV9lX3R5cGUgKHhkcnMsICZvYmpwLT5ub3RpZmljYXRpb25fcHJpdl90eXBlKSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfdV9jaGFyICh4ZHJzLCAmb2JqcC0+cG9zX3Fvc19pbmNsKSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfdV9jaGFyICh4ZHJzLCAmb2JqcC0+cG9zX3FvcykpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX3JwY191aW50MzIgKHhkcnMsICZvYmpwLT5udW1fZml4ZXMpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9ycGNfdWludDMyICh4ZHJzLCAmb2JqcC0+dGJmKSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfcnBjX2xvY19uaV92eF9wb3NfbW9kZV9lX3R5cGUgKHhkcnMsICZvYmpwLT5wb3NfbW9kZSkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX3JwY19sb2NfbmlfdnhfcmVxdWVzdGVyX2lkX2VuY29kaW5nX3NjaGVtZV9lX3R5cGUgKHhkcnMsICZvYmpwLT5lbmNvZGluZ19zY2hlbWUpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9ycGNfbG9jX25pX3Z4X3JlcXVlc3Rlcl9pZF9zX3R5cGUgKHhkcnMsICZvYmpwLT5yZXF1ZXN0ZXJfaWQpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9ycGNfdWludDE2ICh4ZHJzLCAmb2JqcC0+dXNlcl9yZXNwX3RpbWVyX3ZhbCkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2Nfbmlfc3VwbF9wb3NfbWV0aG9kX2VfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX25pX3N1cGxfcG9zX21ldGhvZF9lX3R5cGUgKm9ianApCi17Ci0JcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0JIGlmICgheGRyX2VudW0gKHhkcnMsIChlbnVtX3QgKikgb2JqcCkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2Nfbmlfc3VwbF9zbHBfc2Vzc2lvbl9pZF9zX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19uaV9zdXBsX3NscF9zZXNzaW9uX2lkX3NfdHlwZSAqb2JqcCkKLXsKLQlyZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLQlpbnQgaTsKLQkgaWYgKCF4ZHJfdV9jaGFyICh4ZHJzLCAmb2JqcC0+cHJlc2VuY2UpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9vcGFxdWUgKHhkcnMsIG9ianAtPnNlc3Npb25faWQsIDQpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9ycGNfbG9jX3NlcnZlcl9pbmZvX3NfdHlwZSAoeGRycywgJm9ianAtPnNscF9hZGRyZXNzKSkKLQkJIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19uaV9yZXF1ZXN0b3JfaWRfc190eXBlIChYRFIgKnhkcnMsIHJwY19sb2NfbmlfcmVxdWVzdG9yX2lkX3NfdHlwZSAqb2JqcCkKLXsKLQlyZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLQkgaWYgKCF4ZHJfdV9jaGFyICh4ZHJzLCAmb2JqcC0+ZGF0YV9jb2Rpbmdfc2NoZW1lKSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfYnl0ZXMgKHhkcnMsIChjaGFyICoqKSZvYmpwLT5yZXF1ZXN0b3JfaWRfc3RyaW5nLnJlcXVlc3Rvcl9pZF9zdHJpbmdfdmFsLCAodV9pbnQgKikgJm9ianAtPnJlcXVlc3Rvcl9pZF9zdHJpbmcucmVxdWVzdG9yX2lkX3N0cmluZ19sZW4sIFJQQ19MT0NfTklfTUFYX1JFUVVFU1RPUl9JRF9MRU5HVEgpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl91X2NoYXIgKHhkcnMsICZvYmpwLT5zdHJpbmdfbGVuKSkKLQkJIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19uaV9zdXBsX2NsaWVudF9uYW1lX3NfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX25pX3N1cGxfY2xpZW50X25hbWVfc190eXBlICpvYmpwKQotewotCXJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotCSBpZiAoIXhkcl91X2NoYXIgKHhkcnMsICZvYmpwLT5kYXRhX2NvZGluZ19zY2hlbWUpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9ieXRlcyAoeGRycywgKGNoYXIgKiopJm9ianAtPmNsaWVudF9uYW1lX3N0cmluZy5jbGllbnRfbmFtZV9zdHJpbmdfdmFsLCAodV9pbnQgKikgJm9ianAtPmNsaWVudF9uYW1lX3N0cmluZy5jbGllbnRfbmFtZV9zdHJpbmdfbGVuLCBSUENfTE9DX05JX01BWF9DTElFTlRfTkFNRV9MRU5HVEgpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl91X2NoYXIgKHhkcnMsICZvYmpwLT5zdHJpbmdfbGVuKSkKLQkJIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19uaV9zdXBsX3FvcF9zX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19uaV9zdXBsX3FvcF9zX3R5cGUgKm9ianApCi17Ci0JcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0JIGlmICgheGRyX3VfY2hhciAoeGRycywgJm9ianAtPmJpdF9tYXNrKSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfdV9jaGFyICh4ZHJzLCAmb2JqcC0+aG9yYWNjKSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfdV9jaGFyICh4ZHJzLCAmb2JqcC0+dmVyYWNjKSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfdV9jaGFyICh4ZHJzLCAmb2JqcC0+bWF4TG9jQWdlKSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfdV9jaGFyICh4ZHJzLCAmb2JqcC0+ZGVsYXkpKQotCQkgcmV0dXJuIEZBTFNFOwotCXJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfbG9jX25pX3N1cGxfbm90aWZ5X3ZlcmlmeV9yZXFfc190eXBlIChYRFIgKnhkcnMsIHJwY19sb2Nfbmlfc3VwbF9ub3RpZnlfdmVyaWZ5X3JlcV9zX3R5cGUgKm9ianApCi17Ci0JcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0JaW50IGk7Ci0JIGlmICgheGRyX3JwY19sb2Nfbmlfbm90aWZ5X3ZlcmlmeV9lX3R5cGUgKHhkcnMsICZvYmpwLT5ub3RpZmljYXRpb25fcHJpdl90eXBlKSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfcnBjX3VpbnQxNiAoeGRycywgJm9ianAtPmZsYWdzKSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfcnBjX2xvY19uaV9zdXBsX3NscF9zZXNzaW9uX2lkX3NfdHlwZSAoeGRycywgJm9ianAtPnN1cGxfc2xwX3Nlc3Npb25faWQpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9vcGFxdWUgKHhkcnMsIG9ianAtPnN1cGxfaGFzaCwgOCkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX3JwY19sb2NfbmlfZGF0YWNvZGluZ19zY2hlbWVfZV90eXBlICh4ZHJzLCAmb2JqcC0+ZGF0YWNvZGluZ19zY2hlbWUpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9ycGNfbG9jX25pX3N1cGxfcG9zX21ldGhvZF9lX3R5cGUgKHhkcnMsICZvYmpwLT5wb3NfbWV0aG9kKSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfcnBjX2xvY19uaV9yZXF1ZXN0b3JfaWRfc190eXBlICh4ZHJzLCAmb2JqcC0+cmVxdWVzdG9yX2lkKSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfcnBjX2xvY19uaV9zdXBsX2NsaWVudF9uYW1lX3NfdHlwZSAoeGRycywgJm9ianAtPmNsaWVudF9uYW1lKSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfcnBjX2xvY19uaV9zdXBsX3FvcF9zX3R5cGUgKHhkcnMsICZvYmpwLT5zdXBsX3FvcCkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX3JwY191aW50MTYgKHhkcnMsICZvYmpwLT51c2VyX3Jlc3BvbnNlX3RpbWVyKSkKLQkJIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19uaV9leHRfY2xpZW50X2FkZHJlc3Nfc190eXBlIChYRFIgKnhkcnMsIHJwY19sb2NfbmlfZXh0X2NsaWVudF9hZGRyZXNzX3NfdHlwZSAqb2JqcCkKLXsKLQlyZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLQkgaWYgKCF4ZHJfdV9jaGFyICh4ZHJzLCAmb2JqcC0+ZXh0X2NsaWVudF9hZGRyZXNzX2xlbikpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX2J5dGVzICh4ZHJzLCAoY2hhciAqKikmb2JqcC0+ZXh0X2NsaWVudF9hZGRyZXNzLmV4dF9jbGllbnRfYWRkcmVzc192YWwsICh1X2ludCAqKSAmb2JqcC0+ZXh0X2NsaWVudF9hZGRyZXNzLmV4dF9jbGllbnRfYWRkcmVzc19sZW4sIFJQQ19MT0NfTklfTUFYX0VYVF9DTElFTlRfQUREUkVTUykpCi0JCSByZXR1cm4gRkFMU0U7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2NfbmlfbG9jYXRpb25fdHlwZV9lX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19uaV9sb2NhdGlvbl90eXBlX2VfdHlwZSAqb2JqcCkKLXsKLQlyZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLQkgaWYgKCF4ZHJfZW51bSAoeGRycywgKGVudW1fdCAqKSBvYmpwKSkKLQkJIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19uaV9kZWZlcnJlZF9sb2NhdGlvbl9zX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19uaV9kZWZlcnJlZF9sb2NhdGlvbl9zX3R5cGUgKm9ianApCi17Ci0JcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0JIGlmICgheGRyX3VfY2hhciAoeGRycywgJm9ianAtPnVudXNlZF9iaXRzKSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfdV9jaGFyICh4ZHJzLCAmb2JqcC0+bXNfYXZhaWxhYmxlKSkKLQkJIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19uaV9jb2Rld29yZF9zdHJpbmdfc190eXBlIChYRFIgKnhkcnMsIHJwY19sb2NfbmlfY29kZXdvcmRfc3RyaW5nX3NfdHlwZSAqb2JqcCkKLXsKLQlyZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLQkgaWYgKCF4ZHJfdV9jaGFyICh4ZHJzLCAmb2JqcC0+ZGF0YV9jb2Rpbmdfc2NoZW1lKSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfYnl0ZXMgKHhkcnMsIChjaGFyICoqKSZvYmpwLT5sY3NfY29kZXdvcmRfc3RyaW5nLmxjc19jb2Rld29yZF9zdHJpbmdfdmFsLCAodV9pbnQgKikgJm9ianAtPmxjc19jb2Rld29yZF9zdHJpbmcubGNzX2NvZGV3b3JkX3N0cmluZ19sZW4sIFJQQ19MT0NfTklfQ09ERVdPUkRfTEVOR1RIKSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfdV9jaGFyICh4ZHJzLCAmb2JqcC0+c3RyaW5nX2xlbikpCi0JCSByZXR1cm4gRkFMU0U7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2Nfbmlfc2VydmljZV90eXBlX2lkX3NfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX25pX3NlcnZpY2VfdHlwZV9pZF9zX3R5cGUgKm9ianApCi17Ci0JcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0JIGlmICgheGRyX3VfY2hhciAoeGRycywgJm9ianAtPmxjc19zZXJ2aWNlX3R5cGVfaWQpKQotCQkgcmV0dXJuIEZBTFNFOwotCXJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfbG9jX25pX3VtdHNfY3Bfbm90aWZ5X3ZlcmlmeV9yZXFfc190eXBlIChYRFIgKnhkcnMsIHJwY19sb2NfbmlfdW10c19jcF9ub3RpZnlfdmVyaWZ5X3JlcV9zX3R5cGUgKm9ianApCi17Ci0JcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0JIGlmICgheGRyX3JwY19sb2Nfbmlfbm90aWZ5X3ZlcmlmeV9lX3R5cGUgKHhkcnMsICZvYmpwLT5ub3RpZmljYXRpb25fcHJpdl90eXBlKSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfdV9jaGFyICh4ZHJzLCAmb2JqcC0+aW52b2tlX2lkKSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfcnBjX3VpbnQxNiAoeGRycywgJm9ianAtPmZsYWdzKSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfdV9jaGFyICh4ZHJzLCAmb2JqcC0+bm90aWZpY2F0aW9uX2xlbmd0aCkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX2J5dGVzICh4ZHJzLCAoY2hhciAqKikmb2JqcC0+bm90aWZpY2F0aW9uX3RleHQubm90aWZpY2F0aW9uX3RleHRfdmFsLCAodV9pbnQgKikgJm9ianAtPm5vdGlmaWNhdGlvbl90ZXh0Lm5vdGlmaWNhdGlvbl90ZXh0X2xlbiwgUlBDX0xPQ19OSV9NQVhfQ0xJRU5UX05BTUVfTEVOR1RIKSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfcnBjX2xvY19uaV9kYXRhY29kaW5nX3NjaGVtZV9lX3R5cGUgKHhkcnMsICZvYmpwLT5kYXRhY29kaW5nX3NjaGVtZSkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX3JwY19sb2NfbmlfZXh0X2NsaWVudF9hZGRyZXNzX3NfdHlwZSAoeGRycywgJm9ianAtPmV4dF9jbGllbnRfYWRkcmVzc19kYXRhKSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfcnBjX2xvY19uaV9sb2NhdGlvbl90eXBlX2VfdHlwZSAoeGRycywgJm9ianAtPmxvY2F0aW9uX3R5cGUpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9ycGNfbG9jX25pX2RlZmVycmVkX2xvY2F0aW9uX3NfdHlwZSAoeGRycywgJm9ianAtPmRlZmVycmVkX2xvY2F0aW9uKSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfcnBjX2xvY19uaV9yZXF1ZXN0b3JfaWRfc190eXBlICh4ZHJzLCAmb2JqcC0+cmVxdWVzdG9yX2lkKSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfcnBjX2xvY19uaV9jb2Rld29yZF9zdHJpbmdfc190eXBlICh4ZHJzLCAmb2JqcC0+Y29kZXdvcmRfc3RyaW5nKSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfcnBjX2xvY19uaV9zZXJ2aWNlX3R5cGVfaWRfc190eXBlICh4ZHJzLCAmb2JqcC0+c2VydmljZV90eXBlX2lkKSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfcnBjX3VpbnQxNiAoeGRycywgJm9ianAtPnVzZXJfcmVzcG9uc2VfdGltZXIpKQotCQkgcmV0dXJuIEZBTFNFOwotCXJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfbG9jX25pX2V2ZW50X3BheWxvYWRfdV90eXBlIChYRFIgKnhkcnMsIHJwY19sb2NfbmlfZXZlbnRfcGF5bG9hZF91X3R5cGUgKm9ianApCi17Ci0JcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0JIGlmICgheGRyX3JwY19sb2NfbmlfZXZlbnRfZV90eXBlICh4ZHJzLCAmb2JqcC0+ZGlzYykpCi0JCSByZXR1cm4gRkFMU0U7Ci0Jc3dpdGNoIChvYmpwLT5kaXNjKSB7Ci0JY2FzZSBSUENfTE9DX05JX0VWRU5UX1ZYX05PVElGWV9WRVJJRllfUkVROgotCQkgaWYgKCF4ZHJfcnBjX2xvY19uaV92eF9ub3RpZnlfdmVyaWZ5X3JlcV9zX3R5cGUgKHhkcnMsICZvYmpwLT5ycGNfbG9jX25pX2V2ZW50X3BheWxvYWRfdV90eXBlX3UudnhfcmVxKSkKLQkJCSByZXR1cm4gRkFMU0U7Ci0JCWJyZWFrOwotCWNhc2UgUlBDX0xPQ19OSV9FVkVOVF9TVVBMX05PVElGWV9WRVJJRllfUkVROgotCQkgaWYgKCF4ZHJfcnBjX2xvY19uaV9zdXBsX25vdGlmeV92ZXJpZnlfcmVxX3NfdHlwZSAoeGRycywgJm9ianAtPnJwY19sb2NfbmlfZXZlbnRfcGF5bG9hZF91X3R5cGVfdS5zdXBsX3JlcSkpCi0JCQkgcmV0dXJuIEZBTFNFOwotCQlicmVhazsKLQljYXNlIFJQQ19MT0NfTklfRVZFTlRfVU1UU19DUF9OT1RJRllfVkVSSUZZX1JFUToKLQkJIGlmICgheGRyX3JwY19sb2NfbmlfdW10c19jcF9ub3RpZnlfdmVyaWZ5X3JlcV9zX3R5cGUgKHhkcnMsICZvYmpwLT5ycGNfbG9jX25pX2V2ZW50X3BheWxvYWRfdV90eXBlX3UudW10c19jcF9yZXEpKQotCQkJIHJldHVybiBGQUxTRTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCXJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfbG9jX25pX2V2ZW50X3NfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX25pX2V2ZW50X3NfdHlwZSAqb2JqcCkKLXsKLQlyZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLQkgaWYgKCF4ZHJfcnBjX2xvY19uaV9ldmVudF9lX3R5cGUgKHhkcnMsICZvYmpwLT5ldmVudCkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX3JwY19sb2NfbmlfZXZlbnRfcGF5bG9hZF91X3R5cGUgKHhkcnMsICZvYmpwLT5wYXlsb2FkKSkKLQkJIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19hc3Npc3RfZGF0YV9yZXF1ZXN0X2VfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX2Fzc2lzdF9kYXRhX3JlcXVlc3RfZV90eXBlICpvYmpwKQotewotCXJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotCSBpZiAoIXhkcl9lbnVtICh4ZHJzLCAoZW51bV90ICopIG9ianApKQotCQkgcmV0dXJuIEZBTFNFOwotCXJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfc3RydWN0X2xvY190aW1lX2Rvd25sb2FkX3NvdXJjZV9zX3R5cGVfc2VydmVyc19wdHIgKFhEUiAqeGRycywgcnBjX3N0cnVjdF9sb2NfdGltZV9kb3dubG9hZF9zb3VyY2Vfc190eXBlX3NlcnZlcnNfcHRyICpvYmpwKQotewotCXJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotCSBpZiAoIXhkcl9zdHJpbmcgKHhkcnMsIG9ianAsIFJQQ19MT0NfQVBJX01BWF9TRVJWRVJfQUREUl9MRU5HVEgpKQotCQkgcmV0dXJuIEZBTFNFOwotCXJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfc3RydWN0X2xvY190aW1lX2Rvd25sb2FkX3NvdXJjZV9zX3R5cGVfc2VydmVycyAoWERSICp4ZHJzLCBycGNfc3RydWN0X2xvY190aW1lX2Rvd25sb2FkX3NvdXJjZV9zX3R5cGVfc2VydmVycyBvYmpwKQotewotCXJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotCSBpZiAoIXhkcl92ZWN0b3IgKHhkcnMsIChjaGFyICopb2JqcCwgMywKLQkJc2l6ZW9mIChycGNfc3RydWN0X2xvY190aW1lX2Rvd25sb2FkX3NvdXJjZV9zX3R5cGVfc2VydmVyc19wdHIpLCAoeGRycHJvY190KSB4ZHJfcnBjX3N0cnVjdF9sb2NfdGltZV9kb3dubG9hZF9zb3VyY2Vfc190eXBlX3NlcnZlcnNfcHRyKSkKLQkJIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY190aW1lX2Rvd25sb2FkX3NvdXJjZV9zX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY190aW1lX2Rvd25sb2FkX3NvdXJjZV9zX3R5cGUgKm9ianApCi17Ci0JcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0JIGlmICgheGRyX3JwY191aW50MzIgKHhkcnMsICZvYmpwLT5kZWxheV90aHJlc2hvbGQpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9ycGNfc3RydWN0X2xvY190aW1lX2Rvd25sb2FkX3NvdXJjZV9zX3R5cGVfc2VydmVycyAoeGRycywgb2JqcC0+c2VydmVycykpCi0JCSByZXR1cm4gRkFMU0U7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19zdHJ1Y3RfbG9jX3ByZWRpY3RlZF9vcmJpdHNfZGF0YV9zb3VyY2Vfc190eXBlX3NlcnZlcnNfcHRyIChYRFIgKnhkcnMsIHJwY19zdHJ1Y3RfbG9jX3ByZWRpY3RlZF9vcmJpdHNfZGF0YV9zb3VyY2Vfc190eXBlX3NlcnZlcnNfcHRyICpvYmpwKQotewotCXJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotCSBpZiAoIXhkcl9zdHJpbmcgKHhkcnMsIG9ianAsIFJQQ19MT0NfQVBJX01BWF9TRVJWRVJfQUREUl9MRU5HVEgpKQotCQkgcmV0dXJuIEZBTFNFOwotCXJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfc3RydWN0X2xvY19wcmVkaWN0ZWRfb3JiaXRzX2RhdGFfc291cmNlX3NfdHlwZV9zZXJ2ZXJzIChYRFIgKnhkcnMsIHJwY19zdHJ1Y3RfbG9jX3ByZWRpY3RlZF9vcmJpdHNfZGF0YV9zb3VyY2Vfc190eXBlX3NlcnZlcnMgb2JqcCkKLXsKLQlyZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLQkgaWYgKCF4ZHJfdmVjdG9yICh4ZHJzLCAoY2hhciAqKW9ianAsIDMsCi0JCXNpemVvZiAocnBjX3N0cnVjdF9sb2NfcHJlZGljdGVkX29yYml0c19kYXRhX3NvdXJjZV9zX3R5cGVfc2VydmVyc19wdHIpLCAoeGRycHJvY190KSB4ZHJfcnBjX3N0cnVjdF9sb2NfcHJlZGljdGVkX29yYml0c19kYXRhX3NvdXJjZV9zX3R5cGVfc2VydmVyc19wdHIpKQotCQkgcmV0dXJuIEZBTFNFOwotCXJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfbG9jX3ByZWRpY3RlZF9vcmJpdHNfZGF0YV9zb3VyY2Vfc190eXBlIChYRFIgKnhkcnMsIHJwY19sb2NfcHJlZGljdGVkX29yYml0c19kYXRhX3NvdXJjZV9zX3R5cGUgKm9ianApCi17Ci0JcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0JIGlmICgheGRyX3JwY191aW50MzIgKHhkcnMsICZvYmpwLT5tYXhfZmlsZV9zaXplKSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfcnBjX3VpbnQzMiAoeGRycywgJm9ianAtPm1heF9wYXJ0X3NpemUpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9ycGNfc3RydWN0X2xvY19wcmVkaWN0ZWRfb3JiaXRzX2RhdGFfc291cmNlX3NfdHlwZV9zZXJ2ZXJzICh4ZHJzLCBvYmpwLT5zZXJ2ZXJzKSkKLQkJIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19hc3Npc3RfZGF0YV9yZXF1ZXN0X3BheWxvYWRfdV90eXBlIChYRFIgKnhkcnMsIHJwY19sb2NfYXNzaXN0X2RhdGFfcmVxdWVzdF9wYXlsb2FkX3VfdHlwZSAqb2JqcCkKLXsKLQlyZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLQkgaWYgKCF4ZHJfcnBjX2xvY19hc3Npc3RfZGF0YV9yZXF1ZXN0X2VfdHlwZSAoeGRycywgJm9ianAtPmRpc2MpKQotCQkgcmV0dXJuIEZBTFNFOwotCXN3aXRjaCAob2JqcC0+ZGlzYykgewotCWNhc2UgUlBDX0xPQ19BU1NJU1RfREFUQV9USU1FX1JFUToKLQkJIGlmICgheGRyX3JwY19sb2NfdGltZV9kb3dubG9hZF9zb3VyY2Vfc190eXBlICh4ZHJzLCAmb2JqcC0+cnBjX2xvY19hc3Npc3RfZGF0YV9yZXF1ZXN0X3BheWxvYWRfdV90eXBlX3UudGltZV9kb3dubG9hZCkpCi0JCQkgcmV0dXJuIEZBTFNFOwotCQlicmVhazsKLQljYXNlIFJQQ19MT0NfQVNTSVNUX0RBVEFfUFJFRElDVEVEX09SQklUU19SRVE6Ci0JCSBpZiAoIXhkcl9ycGNfbG9jX3ByZWRpY3RlZF9vcmJpdHNfZGF0YV9zb3VyY2Vfc190eXBlICh4ZHJzLCAmb2JqcC0+cnBjX2xvY19hc3Npc3RfZGF0YV9yZXF1ZXN0X3BheWxvYWRfdV90eXBlX3UuZGF0YV9kb3dubG9hZCkpCi0JCQkgcmV0dXJuIEZBTFNFOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2NfYXNzaXN0X2RhdGFfcmVxdWVzdF9zX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19hc3Npc3RfZGF0YV9yZXF1ZXN0X3NfdHlwZSAqb2JqcCkKLXsKLQlyZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLQkgaWYgKCF4ZHJfcnBjX2xvY19hc3Npc3RfZGF0YV9yZXF1ZXN0X2VfdHlwZSAoeGRycywgJm9ianAtPmV2ZW50KSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfcnBjX2xvY19hc3Npc3RfZGF0YV9yZXF1ZXN0X3BheWxvYWRfdV90eXBlICh4ZHJzLCAmb2JqcC0+cGF5bG9hZCkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2Nfc2VydmVyX2Nvbm5lY3Rpb25faGFuZGxlIChYRFIgKnhkcnMsIHJwY19sb2Nfc2VydmVyX2Nvbm5lY3Rpb25faGFuZGxlICpvYmpwKQotewotCXJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotCSBpZiAoIXhkcl9ycGNfdWludDMyICh4ZHJzLCBvYmpwKSkKLQkJIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19zZXJ2ZXJfcHJvdG9jb2xfZV90eXBlIChYRFIgKnhkcnMsIHJwY19sb2Nfc2VydmVyX3Byb3RvY29sX2VfdHlwZSAqb2JqcCkKLXsKLQlyZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLQkgaWYgKCF4ZHJfZW51bSAoeGRycywgKGVudW1fdCAqKSBvYmpwKSkKLQkJIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19zZXJ2ZXJfcmVxdWVzdF9lX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19zZXJ2ZXJfcmVxdWVzdF9lX3R5cGUgKm9ianApCi17Ci0JcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0JIGlmICgheGRyX2VudW0gKHhkcnMsIChlbnVtX3QgKikgb2JqcCkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2Nfc2VydmVyX29wZW5fcmVxX3NfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX3NlcnZlcl9vcGVuX3JlcV9zX3R5cGUgKm9ianApCi17Ci0JcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0JIGlmICgheGRyX3JwY19sb2Nfc2VydmVyX2Nvbm5lY3Rpb25faGFuZGxlICh4ZHJzLCAmb2JqcC0+Y29ubl9oYW5kbGUpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9ycGNfbG9jX3NlcnZlcl9wcm90b2NvbF9lX3R5cGUgKHhkcnMsICZvYmpwLT5wcm90b2NvbCkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2Nfc2VydmVyX2Nsb3NlX3JlcV9zX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19zZXJ2ZXJfY2xvc2VfcmVxX3NfdHlwZSAqb2JqcCkKLXsKLQlyZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLQkgaWYgKCF4ZHJfcnBjX2xvY19zZXJ2ZXJfY29ubmVjdGlvbl9oYW5kbGUgKHhkcnMsICZvYmpwLT5jb25uX2hhbmRsZSkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2Nfc2VydmVyX3JlcXVlc3RfdV90eXBlIChYRFIgKnhkcnMsIHJwY19sb2Nfc2VydmVyX3JlcXVlc3RfdV90eXBlICpvYmpwKQotewotCXJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotCSBpZiAoIXhkcl9ycGNfbG9jX3NlcnZlcl9yZXF1ZXN0X2VfdHlwZSAoeGRycywgJm9ianAtPmRpc2MpKQotCQkgcmV0dXJuIEZBTFNFOwotCXN3aXRjaCAob2JqcC0+ZGlzYykgewotCWNhc2UgUlBDX0xPQ19TRVJWRVJfUkVRVUVTVF9PUEVOOgotCQkgaWYgKCF4ZHJfcnBjX2xvY19zZXJ2ZXJfb3Blbl9yZXFfc190eXBlICh4ZHJzLCAmb2JqcC0+cnBjX2xvY19zZXJ2ZXJfcmVxdWVzdF91X3R5cGVfdS5vcGVuX3JlcSkpCi0JCQkgcmV0dXJuIEZBTFNFOwotCQlicmVhazsKLQljYXNlIFJQQ19MT0NfU0VSVkVSX1JFUVVFU1RfQ0xPU0U6Ci0JCSBpZiAoIXhkcl9ycGNfbG9jX3NlcnZlcl9jbG9zZV9yZXFfc190eXBlICh4ZHJzLCAmb2JqcC0+cnBjX2xvY19zZXJ2ZXJfcmVxdWVzdF91X3R5cGVfdS5jbG9zZV9yZXEpKQotCQkJIHJldHVybiBGQUxTRTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCXJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfbG9jX3NlcnZlcl9yZXF1ZXN0X3NfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX3NlcnZlcl9yZXF1ZXN0X3NfdHlwZSAqb2JqcCkKLXsKLQlyZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLQkgaWYgKCF4ZHJfcnBjX2xvY19zZXJ2ZXJfcmVxdWVzdF9lX3R5cGUgKHhkcnMsICZvYmpwLT5ldmVudCkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX3JwY19sb2Nfc2VydmVyX3JlcXVlc3RfdV90eXBlICh4ZHJzLCAmb2JqcC0+cGF5bG9hZCkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2NfcmVzZXJ2ZWRfcGF5bG9hZF9zX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19yZXNlcnZlZF9wYXlsb2FkX3NfdHlwZSAqb2JqcCkKLXsKLQlyZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLQkgaWYgKCF4ZHJfcnBjX3VpbnQxNiAoeGRycywgJm9ianAtPmRhdGFfc2l6ZSkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX2J5dGVzICh4ZHJzLCAoY2hhciAqKikmb2JqcC0+ZGF0YS5kYXRhX3ZhbCwgKHVfaW50ICopICZvYmpwLT5kYXRhLmRhdGFfbGVuLCB+MCkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2NfaW9jdGxfZV90eXBlIChYRFIgKnhkcnMsIHJwY19sb2NfaW9jdGxfZV90eXBlICpvYmpwKQotewotCXJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotCSBpZiAoIXhkcl9lbnVtICh4ZHJzLCAoZW51bV90ICopIG9ianApKQotCQkgcmV0dXJuIEZBTFNFOwotCXJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfbG9jX2FwaV92ZXJzaW9uX3NfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX2FwaV92ZXJzaW9uX3NfdHlwZSAqb2JqcCkKLXsKLQlyZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLQkgaWYgKCF4ZHJfdV9jaGFyICh4ZHJzLCAmb2JqcC0+bWFqb3IpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl91X2NoYXIgKHhkcnMsICZvYmpwLT5taW5vcikpCi0JCSByZXR1cm4gRkFMU0U7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2NfZml4X3JlY3VycmVuY2VfZV90eXBlIChYRFIgKnhkcnMsIHJwY19sb2NfZml4X3JlY3VycmVuY2VfZV90eXBlICpvYmpwKQotewotCXJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotCSBpZiAoIXhkcl9lbnVtICh4ZHJzLCAoZW51bV90ICopIG9ianApKQotCQkgcmV0dXJuIEZBTFNFOwotCXJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfbG9jX29wZXJhdGlvbl9tb2RlX2VfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX29wZXJhdGlvbl9tb2RlX2VfdHlwZSAqb2JqcCkKLXsKLQlyZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLQkgaWYgKCF4ZHJfZW51bSAoeGRycywgKGVudW1fdCAqKSBvYmpwKSkKLQkJIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19ub3RpZnlfZV90eXBlIChYRFIgKnhkcnMsIHJwY19sb2Nfbm90aWZ5X2VfdHlwZSAqb2JqcCkKLXsKLQlyZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLQkgaWYgKCF4ZHJfZW51bSAoeGRycywgKGVudW1fdCAqKSBvYmpwKSkKLQkJIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19maXhfY3JpdGVyaWFfc190eXBlIChYRFIgKnhkcnMsIHJwY19sb2NfZml4X2NyaXRlcmlhX3NfdHlwZSAqb2JqcCkKLXsKLQlyZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLQkgaWYgKCF4ZHJfcnBjX3VpbnQzMiAoeGRycywgJm9ianAtPnZhbGlkX21hc2spKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9ycGNfbG9jX2ZpeF9yZWN1cnJlbmNlX2VfdHlwZSAoeGRycywgJm9ianAtPnJlY3VycmVuY2VfdHlwZSkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX3JwY19sb2Nfb3BlcmF0aW9uX21vZGVfZV90eXBlICh4ZHJzLCAmb2JqcC0+cHJlZmVycmVkX29wZXJhdGlvbl9tb2RlKSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfcnBjX3VpbnQzMiAoeGRycywgJm9ianAtPnByZWZlcnJlZF9hY2N1cmFjeSkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX3JwY191aW50MzIgKHhkcnMsICZvYmpwLT5wcmVmZXJyZWRfcmVzcG9uc2VfdGltZSkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX3JwY19ib29sZWFuICh4ZHJzLCAmb2JqcC0+aW50ZXJtZWRpYXRlX3Bvc19yZXBvcnRfZW5hYmxlZCkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX3JwY19sb2Nfbm90aWZ5X2VfdHlwZSAoeGRycywgJm9ianAtPm5vdGlmeV90eXBlKSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfcnBjX3VpbnQzMiAoeGRycywgJm9ianAtPm1pbl9pbnRlcnZhbCkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX2Zsb2F0ICh4ZHJzLCAmb2JqcC0+bWluX2Rpc3RhbmNlKSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfcnBjX3VpbnQzMiAoeGRycywgJm9ianAtPm1pbl9kaXN0X3NhbXBsZV9pbnRlcnZhbCkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2NfbmlfdXNlcl9yZXNwX2VfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX25pX3VzZXJfcmVzcF9lX3R5cGUgKm9ianApCi17Ci0JcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0JIGlmICgheGRyX2VudW0gKHhkcnMsIChlbnVtX3QgKikgb2JqcCkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2NfdXNlcl92ZXJpZnlfc190eXBlIChYRFIgKnhkcnMsIHJwY19sb2NfdXNlcl92ZXJpZnlfc190eXBlICpvYmpwKQotewotCXJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotCSBpZiAoIXhkcl9ycGNfbG9jX25pX3VzZXJfcmVzcF9lX3R5cGUgKHhkcnMsICZvYmpwLT51c2VyX3Jlc3ApKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9ycGNfbG9jX25pX2V2ZW50X3NfdHlwZSAoeGRycywgJm9ianAtPm5pX2V2ZW50X3Bhc3NfYmFjaykpCi0JCSByZXR1cm4gRkFMU0U7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2NfcHJlZGljdGVkX29yYml0c19kYXRhX2Zvcm1hdF9lX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19wcmVkaWN0ZWRfb3JiaXRzX2RhdGFfZm9ybWF0X2VfdHlwZSAqb2JqcCkKLXsKLQlyZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLQkgaWYgKCF4ZHJfZW51bSAoeGRycywgKGVudW1fdCAqKSBvYmpwKSkKLQkJIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19wcmVkaWN0ZWRfb3JiaXRzX2RhdGFfc190eXBlIChYRFIgKnhkcnMsIHJwY19sb2NfcHJlZGljdGVkX29yYml0c19kYXRhX3NfdHlwZSAqb2JqcCkKLXsKLQlyZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLQkgaWYgKCF4ZHJfcnBjX2xvY19wcmVkaWN0ZWRfb3JiaXRzX2RhdGFfZm9ybWF0X2VfdHlwZSAoeGRycywgJm9ianAtPmZvcm1hdF90eXBlKSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfcnBjX3VpbnQzMiAoeGRycywgJm9ianAtPnRvdGFsX3NpemUpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9ycGNfdWludDggKHhkcnMsICZvYmpwLT50b3RhbF9wYXJ0cykpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX3JwY191aW50OCAoeGRycywgJm9ianAtPnBhcnQpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9ycGNfdWludDE2ICh4ZHJzLCAmb2JqcC0+cGFydF9sZW4pKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9ieXRlcyAoeGRycywgKGNoYXIgKiopJm9ianAtPmRhdGFfcHRyLmRhdGFfcHRyX3ZhbCwgKHVfaW50ICopICZvYmpwLT5kYXRhX3B0ci5kYXRhX3B0cl9sZW4sIH4wKSkKLQkJIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19wcmVkaWN0ZWRfb3JiaXRzX2RhdGFfdmFsaWRpdHlfcmVwb3J0X3NfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX3ByZWRpY3RlZF9vcmJpdHNfZGF0YV92YWxpZGl0eV9yZXBvcnRfc190eXBlICpvYmpwKQotewotCXJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotCSBpZiAoIXhkcl9ycGNfdWludDY0ICh4ZHJzLCAmb2JqcC0+c3RhcnRfdGltZV91dGMpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9ycGNfdWludDE2ICh4ZHJzLCAmb2JqcC0+dmFsaWRfZHVyYXRpb25faHJzKSkKLQkJIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19wcmVkaWN0ZWRfb3JiaXRzX2F1dG9fZG93bmxvYWRfY29uZmlnX3NfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX3ByZWRpY3RlZF9vcmJpdHNfYXV0b19kb3dubG9hZF9jb25maWdfc190eXBlICpvYmpwKQotewotCXJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotCSBpZiAoIXhkcl9ycGNfYm9vbGVhbiAoeGRycywgJm9ianAtPmVuYWJsZSkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX3VfY2hhciAoeGRycywgJm9ianAtPmF1dG9fY2hlY2tfZXZlcnlfaHJzKSkKLQkJIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19hc3Npc3RfZGF0YV90aW1lX3NfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX2Fzc2lzdF9kYXRhX3RpbWVfc190eXBlICpvYmpwKQotewotCXJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotCSBpZiAoIXhkcl9ycGNfdWludDY0ICh4ZHJzLCAmb2JqcC0+dGltZV91dGMpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9ycGNfdWludDMyICh4ZHJzLCAmb2JqcC0+dW5jZXJ0YWludHkpKQotCQkgcmV0dXJuIEZBTFNFOwotCXJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfbG9jX2Fzc2lzdF9wb3NfdmFsaWRfbWFza190eXBlIChYRFIgKnhkcnMsIHJwY19sb2NfYXNzaXN0X3Bvc192YWxpZF9tYXNrX3R5cGUgKm9ianApCi17Ci0JcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0JIGlmICgheGRyX3JwY191aW50NjQgKHhkcnMsIG9ianApKQotCQkgcmV0dXJuIEZBTFNFOwotCXJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfbG9jX2Fzc2lzdF9kYXRhX3Bvc19zX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19hc3Npc3RfZGF0YV9wb3Nfc190eXBlICpvYmpwKQotewotCXJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotCSBpZiAoIXhkcl9ycGNfbG9jX2Fzc2lzdF9wb3NfdmFsaWRfbWFza190eXBlICh4ZHJzLCAmb2JqcC0+dmFsaWRfbWFzaykpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX3JwY191aW50NjQgKHhkcnMsICZvYmpwLT50aW1lc3RhbXBfdXRjKSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfZG91YmxlICh4ZHJzLCAmb2JqcC0+bGF0aXR1ZGUpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9kb3VibGUgKHhkcnMsICZvYmpwLT5sb25naXR1ZGUpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9mbG9hdCAoeGRycywgJm9ianAtPmFsdGl0dWRlX3dydF9lbGxpcHNvaWQpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9mbG9hdCAoeGRycywgJm9ianAtPmFsdGl0dWRlX3dydF9tZWFuX3NlYV9sZXZlbCkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX2Zsb2F0ICh4ZHJzLCAmb2JqcC0+aG9yX3VuY19jaXJjdWxhcikpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX2Zsb2F0ICh4ZHJzLCAmb2JqcC0+dmVydF91bmMpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl91X2NoYXIgKHhkcnMsICZvYmpwLT5jb25maWRlbmNlX2hvcml6b250YWwpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl91X2NoYXIgKHhkcnMsICZvYmpwLT5jb25maWRlbmNlX3ZlcnRpY2FsKSkKLQkJIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19zZXJ2ZXJfb3Blbl9zdGF0dXNfZV90eXBlIChYRFIgKnhkcnMsIHJwY19sb2Nfc2VydmVyX29wZW5fc3RhdHVzX2VfdHlwZSAqb2JqcCkKLXsKLQlyZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLQkgaWYgKCF4ZHJfZW51bSAoeGRycywgKGVudW1fdCAqKSBvYmpwKSkKLQkJIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19zZXJ2ZXJfb3Blbl9zdGF0dXNfc190eXBlIChYRFIgKnhkcnMsIHJwY19sb2Nfc2VydmVyX29wZW5fc3RhdHVzX3NfdHlwZSAqb2JqcCkKLXsKLQlyZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLQkgaWYgKCF4ZHJfcnBjX2xvY19zZXJ2ZXJfY29ubmVjdGlvbl9oYW5kbGUgKHhkcnMsICZvYmpwLT5jb25uX2hhbmRsZSkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX3JwY19sb2Nfc2VydmVyX29wZW5fc3RhdHVzX2VfdHlwZSAoeGRycywgJm9ianAtPm9wZW5fc3RhdHVzKSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfc3RyaW5nICh4ZHJzLCAmb2JqcC0+YXBuX25hbWUsIH4wKSkKLQkJIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19zZXJ2ZXJfY2xvc2Vfc3RhdHVzX2VfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX3NlcnZlcl9jbG9zZV9zdGF0dXNfZV90eXBlICpvYmpwKQotewotCXJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotCSBpZiAoIXhkcl9lbnVtICh4ZHJzLCAoZW51bV90ICopIG9ianApKQotCQkgcmV0dXJuIEZBTFNFOwotCXJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfbG9jX3NlcnZlcl9jbG9zZV9zdGF0dXNfc190eXBlIChYRFIgKnhkcnMsIHJwY19sb2Nfc2VydmVyX2Nsb3NlX3N0YXR1c19zX3R5cGUgKm9ianApCi17Ci0JcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0JIGlmICgheGRyX3JwY19sb2Nfc2VydmVyX2Nvbm5lY3Rpb25faGFuZGxlICh4ZHJzLCAmb2JqcC0+Y29ubl9oYW5kbGUpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9ycGNfbG9jX3NlcnZlcl9jbG9zZV9zdGF0dXNfZV90eXBlICh4ZHJzLCAmb2JqcC0+Y2xvc2Vfc3RhdHVzKSkKLQkJIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19sb2NrX2VfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX2xvY2tfZV90eXBlICpvYmpwKQotewotCXJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotCSBpZiAoIXhkcl9lbnVtICh4ZHJzLCAoZW51bV90ICopIG9ianApKQotCQkgcmV0dXJuIEZBTFNFOwotCXJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfbG9jX25tZWFfc2VudGVuY2VfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX25tZWFfc2VudGVuY2VfdHlwZSAqb2JqcCkKLXsKLQlyZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLQkgaWYgKCF4ZHJfcnBjX3VpbnQzMiAoeGRycywgb2JqcCkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2NfYXNzaXN0X2RhdGFfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX2Fzc2lzdF9kYXRhX3R5cGUgKm9ianApCi17Ci0JcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0JIGlmICgheGRyX3JwY191aW50MzIgKHhkcnMsIG9ianApKQotCQkgcmV0dXJuIEZBTFNFOwotCXJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfbG9jX2Fzc2lzdF9kYXRhX2RlbGV0ZV9zX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19hc3Npc3RfZGF0YV9kZWxldGVfc190eXBlICpvYmpwKQotewotCXJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotCWludCBpOwotCSBpZiAoIXhkcl9ycGNfbG9jX2Fzc2lzdF9kYXRhX3R5cGUgKHhkcnMsICZvYmpwLT50eXBlKSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfdmVjdG9yICh4ZHJzLCAoY2hhciAqKW9ianAtPnJlc2VydmVkLCA4LAotCQlzaXplb2YgKHJwY191aW50MzIpLCAoeGRycHJvY190KSB4ZHJfcnBjX3VpbnQzMikpCi0JCSByZXR1cm4gRkFMU0U7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2NfaW9jdGxfZGF0YV91X3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19pb2N0bF9kYXRhX3VfdHlwZSAqb2JqcCkKLXsKLQlyZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLQkgaWYgKCF4ZHJfcnBjX2xvY19pb2N0bF9lX3R5cGUgKHhkcnMsICZvYmpwLT5kaXNjKSkKLQkJIHJldHVybiBGQUxTRTsKLQlzd2l0Y2ggKG9ianAtPmRpc2MpIHsKLQljYXNlIFJQQ19MT0NfSU9DVExfU0VUX0ZJWF9DUklURVJJQToKLQkJIGlmICgheGRyX3JwY19sb2NfZml4X2NyaXRlcmlhX3NfdHlwZSAoeGRycywgJm9ianAtPnJwY19sb2NfaW9jdGxfZGF0YV91X3R5cGVfdS5maXhfY3JpdGVyaWEpKQotCQkJIHJldHVybiBGQUxTRTsKLQkJYnJlYWs7Ci0JY2FzZSBSUENfTE9DX0lPQ1RMX0lORk9STV9OSV9VU0VSX1JFU1BPTlNFOgotCQkgaWYgKCF4ZHJfcnBjX2xvY191c2VyX3ZlcmlmeV9zX3R5cGUgKHhkcnMsICZvYmpwLT5ycGNfbG9jX2lvY3RsX2RhdGFfdV90eXBlX3UudXNlcl92ZXJpZnlfcmVzcCkpCi0JCQkgcmV0dXJuIEZBTFNFOwotCQlicmVhazsKLQljYXNlIFJQQ19MT0NfSU9DVExfSU5KRUNUX1BSRURJQ1RFRF9PUkJJVFNfREFUQToKLQkJIGlmICgheGRyX3JwY19sb2NfcHJlZGljdGVkX29yYml0c19kYXRhX3NfdHlwZSAoeGRycywgJm9ianAtPnJwY19sb2NfaW9jdGxfZGF0YV91X3R5cGVfdS5wcmVkaWN0ZWRfb3JiaXRzX2RhdGEpKQotCQkJIHJldHVybiBGQUxTRTsKLQkJYnJlYWs7Ci0JY2FzZSBSUENfTE9DX0lPQ1RMX1NFVF9QUkVESUNURURfT1JCSVRTX0RBVEFfQVVUT19ET1dOTE9BRDoKLQkJIGlmICgheGRyX3JwY19sb2NfcHJlZGljdGVkX29yYml0c19hdXRvX2Rvd25sb2FkX2NvbmZpZ19zX3R5cGUgKHhkcnMsICZvYmpwLT5ycGNfbG9jX2lvY3RsX2RhdGFfdV90eXBlX3UucHJlZGljdGVkX29yYml0c19hdXRvX2Rvd25sb2FkKSkKLQkJCSByZXR1cm4gRkFMU0U7Ci0JCWJyZWFrOwotCWNhc2UgUlBDX0xPQ19JT0NUTF9JTkpFQ1RfVVRDX1RJTUU6Ci0JCSBpZiAoIXhkcl9ycGNfbG9jX2Fzc2lzdF9kYXRhX3RpbWVfc190eXBlICh4ZHJzLCAmb2JqcC0+cnBjX2xvY19pb2N0bF9kYXRhX3VfdHlwZV91LmFzc2lzdGFuY2VfZGF0YV90aW1lKSkKLQkJCSByZXR1cm4gRkFMU0U7Ci0JCWJyZWFrOwotCWNhc2UgUlBDX0xPQ19JT0NUTF9JTkpFQ1RfUE9TSVRJT046Ci0JCSBpZiAoIXhkcl9ycGNfbG9jX2Fzc2lzdF9kYXRhX3Bvc19zX3R5cGUgKHhkcnMsICZvYmpwLT5ycGNfbG9jX2lvY3RsX2RhdGFfdV90eXBlX3UuYXNzaXN0YW5jZV9kYXRhX3Bvc2l0aW9uKSkKLQkJCSByZXR1cm4gRkFMU0U7Ci0JCWJyZWFrOwotCWNhc2UgUlBDX0xPQ19JT0NUTF9JTkZPUk1fU0VSVkVSX09QRU5fU1RBVFVTOgotCQkgaWYgKCF4ZHJfcnBjX2xvY19zZXJ2ZXJfb3Blbl9zdGF0dXNfc190eXBlICh4ZHJzLCAmb2JqcC0+cnBjX2xvY19pb2N0bF9kYXRhX3VfdHlwZV91LmNvbm5fb3Blbl9zdGF0dXMpKQotCQkJIHJldHVybiBGQUxTRTsKLQkJYnJlYWs7Ci0JY2FzZSBSUENfTE9DX0lPQ1RMX0lORk9STV9TRVJWRVJfQ0xPU0VfU1RBVFVTOgotCQkgaWYgKCF4ZHJfcnBjX2xvY19zZXJ2ZXJfY2xvc2Vfc3RhdHVzX3NfdHlwZSAoeGRycywgJm9ianAtPnJwY19sb2NfaW9jdGxfZGF0YV91X3R5cGVfdS5jb25uX2Nsb3NlX3N0YXR1cykpCi0JCQkgcmV0dXJuIEZBTFNFOwotCQlicmVhazsKLQljYXNlIFJQQ19MT0NfSU9DVExfU0VUX0VOR0lORV9MT0NLOgotCQkgaWYgKCF4ZHJfcnBjX2xvY19sb2NrX2VfdHlwZSAoeGRycywgJm9ianAtPnJwY19sb2NfaW9jdGxfZGF0YV91X3R5cGVfdS5lbmdpbmVfbG9jaykpCi0JCQkgcmV0dXJuIEZBTFNFOwotCQlicmVhazsKLQljYXNlIFJQQ19MT0NfSU9DVExfU0VUX1NCQVNfQ09ORklHOgotCQkgaWYgKCF4ZHJfcnBjX2Jvb2xlYW4gKHhkcnMsICZvYmpwLT5ycGNfbG9jX2lvY3RsX2RhdGFfdV90eXBlX3Uuc2Jhc19tb2RlKSkKLQkJCSByZXR1cm4gRkFMU0U7Ci0JCWJyZWFrOwotCWNhc2UgUlBDX0xPQ19JT0NUTF9TRVRfTk1FQV9UWVBFUzoKLQkJIGlmICgheGRyX3JwY19sb2Nfbm1lYV9zZW50ZW5jZV90eXBlICh4ZHJzLCAmb2JqcC0+cnBjX2xvY19pb2N0bF9kYXRhX3VfdHlwZV91Lm5tZWFfdHlwZXMpKQotCQkJIHJldHVybiBGQUxTRTsKLQkJYnJlYWs7Ci0JY2FzZSBSUENfTE9DX0lPQ1RMX1NFVF9PTl9ERU1BTkRfTFBNOgotCQkgaWYgKCF4ZHJfcnBjX2Jvb2xlYW4gKHhkcnMsICZvYmpwLT5ycGNfbG9jX2lvY3RsX2RhdGFfdV90eXBlX3Uub25fZGVtYW5kX2xwbSkpCi0JCQkgcmV0dXJuIEZBTFNFOwotCQlicmVhazsKLQljYXNlIFJQQ19MT0NfSU9DVExfU0VUX0NETUFfUERFX1NFUlZFUl9BRERSOgotCWNhc2UgUlBDX0xPQ19JT0NUTF9TRVRfQ0RNQV9NUENfU0VSVkVSX0FERFI6Ci0JY2FzZSBSUENfTE9DX0lPQ1RMX1NFVF9VTVRTX1NMUF9TRVJWRVJfQUREUjoKLQljYXNlIFJQQ19MT0NfSU9DVExfU0VUX0NVU1RPTV9QREVfU0VSVkVSX0FERFI6Ci0JCSBpZiAoIXhkcl9ycGNfbG9jX3NlcnZlcl9pbmZvX3NfdHlwZSAoeGRycywgJm9ianAtPnJwY19sb2NfaW9jdGxfZGF0YV91X3R5cGVfdS5zZXJ2ZXJfYWRkcikpCi0JCQkgcmV0dXJuIEZBTFNFOwotCQlicmVhazsKLQljYXNlIFJQQ19MT0NfSU9DVExfREVMRVRFX0FTU0lTVF9EQVRBOgotCQkgaWYgKCF4ZHJfcnBjX2xvY19hc3Npc3RfZGF0YV9kZWxldGVfc190eXBlICh4ZHJzLCAmb2JqcC0+cnBjX2xvY19pb2N0bF9kYXRhX3VfdHlwZV91LmFzc2lzdF9kYXRhX2RlbGV0ZSkpCi0JCQkgcmV0dXJuIEZBTFNFOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2NfaW9jdGxfY2FsbGJhY2tfZGF0YV91X3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19pb2N0bF9jYWxsYmFja19kYXRhX3VfdHlwZSAqb2JqcCkKLXsKLQlyZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLQkgaWYgKCF4ZHJfcnBjX2xvY19pb2N0bF9lX3R5cGUgKHhkcnMsICZvYmpwLT5kaXNjKSkKLQkJIHJldHVybiBGQUxTRTsKLQlzd2l0Y2ggKG9ianAtPmRpc2MpIHsKLQljYXNlIFJQQ19MT0NfSU9DVExfR0VUX0FQSV9WRVJTSU9OOgotCQkgaWYgKCF4ZHJfcnBjX2xvY19hcGlfdmVyc2lvbl9zX3R5cGUgKHhkcnMsICZvYmpwLT5ycGNfbG9jX2lvY3RsX2NhbGxiYWNrX2RhdGFfdV90eXBlX3UuYXBpX3ZlcnNpb24pKQotCQkJIHJldHVybiBGQUxTRTsKLQkJYnJlYWs7Ci0JY2FzZSBSUENfTE9DX0lPQ1RMX0dFVF9GSVhfQ1JJVEVSSUE6Ci0JCSBpZiAoIXhkcl9ycGNfbG9jX2ZpeF9jcml0ZXJpYV9zX3R5cGUgKHhkcnMsICZvYmpwLT5ycGNfbG9jX2lvY3RsX2NhbGxiYWNrX2RhdGFfdV90eXBlX3UuZml4X2NyaXRlcmlhKSkKLQkJCSByZXR1cm4gRkFMU0U7Ci0JCWJyZWFrOwotCWNhc2UgUlBDX0xPQ19JT0NUTF9HRVRfRU5HSU5FX0xPQ0s6Ci0JCSBpZiAoIXhkcl9ycGNfbG9jX2xvY2tfZV90eXBlICh4ZHJzLCAmb2JqcC0+cnBjX2xvY19pb2N0bF9jYWxsYmFja19kYXRhX3VfdHlwZV91LmVuZ2luZV9sb2NrKSkKLQkJCSByZXR1cm4gRkFMU0U7Ci0JCWJyZWFrOwotCWNhc2UgUlBDX0xPQ19JT0NUTF9HRVRfU0JBU19DT05GSUc6Ci0JCSBpZiAoIXhkcl9ycGNfYm9vbGVhbiAoeGRycywgJm9ianAtPnJwY19sb2NfaW9jdGxfY2FsbGJhY2tfZGF0YV91X3R5cGVfdS5zYmFzX21vZGUpKQotCQkJIHJldHVybiBGQUxTRTsKLQkJYnJlYWs7Ci0JY2FzZSBSUENfTE9DX0lPQ1RMX0dFVF9OTUVBX1RZUEVTOgotCQkgaWYgKCF4ZHJfcnBjX2xvY19ubWVhX3NlbnRlbmNlX3R5cGUgKHhkcnMsICZvYmpwLT5ycGNfbG9jX2lvY3RsX2NhbGxiYWNrX2RhdGFfdV90eXBlX3Uubm1lYV90eXBlcykpCi0JCQkgcmV0dXJuIEZBTFNFOwotCQlicmVhazsKLQljYXNlIFJQQ19MT0NfSU9DVExfR0VUX09OX0RFTUFORF9MUE06Ci0JCSBpZiAoIXhkcl9ycGNfYm9vbGVhbiAoeGRycywgJm9ianAtPnJwY19sb2NfaW9jdGxfY2FsbGJhY2tfZGF0YV91X3R5cGVfdS5vbl9kZW1hbmRfbHBtKSkKLQkJCSByZXR1cm4gRkFMU0U7Ci0JCWJyZWFrOwotCWNhc2UgUlBDX0xPQ19JT0NUTF9HRVRfQ0RNQV9QREVfU0VSVkVSX0FERFI6Ci0JY2FzZSBSUENfTE9DX0lPQ1RMX0dFVF9DRE1BX01QQ19TRVJWRVJfQUREUjoKLQljYXNlIFJQQ19MT0NfSU9DVExfR0VUX1VNVFNfU0xQX1NFUlZFUl9BRERSOgotCQkgaWYgKCF4ZHJfcnBjX2xvY19zZXJ2ZXJfaW5mb19zX3R5cGUgKHhkcnMsICZvYmpwLT5ycGNfbG9jX2lvY3RsX2NhbGxiYWNrX2RhdGFfdV90eXBlX3Uuc2VydmVyX2FkZHIpKQotCQkJIHJldHVybiBGQUxTRTsKLQkJYnJlYWs7Ci0JY2FzZSBSUENfTE9DX0lPQ1RMX1FVRVJZX1BSRURJQ1RFRF9PUkJJVFNfREFUQV9TT1VSQ0U6Ci0JCSBpZiAoIXhkcl9ycGNfbG9jX3ByZWRpY3RlZF9vcmJpdHNfZGF0YV9zb3VyY2Vfc190eXBlICh4ZHJzLCAmb2JqcC0+cnBjX2xvY19pb2N0bF9jYWxsYmFja19kYXRhX3VfdHlwZV91LnByZWRpY3RlZF9vcmJpdHNfZGF0YV9zb3VyY2UpKQotCQkJIHJldHVybiBGQUxTRTsKLQkJYnJlYWs7Ci0JY2FzZSBSUENfTE9DX0lPQ1RMX1FVRVJZX1BSRURJQ1RFRF9PUkJJVFNfREFUQV9WQUxJRElUWToKLQkJIGlmICgheGRyX3JwY19sb2NfcHJlZGljdGVkX29yYml0c19kYXRhX3ZhbGlkaXR5X3JlcG9ydF9zX3R5cGUgKHhkcnMsICZvYmpwLT5ycGNfbG9jX2lvY3RsX2NhbGxiYWNrX2RhdGFfdV90eXBlX3UucHJlZGljdGVkX29yYml0c19kYXRhX3ZhbGlkaXR5KSkKLQkJCSByZXR1cm4gRkFMU0U7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19pb2N0bF9jYWxsYmFja19zX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19pb2N0bF9jYWxsYmFja19zX3R5cGUgKm9ianApCi17Ci0JcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0JIGlmICgheGRyX3JwY19sb2NfaW9jdGxfZV90eXBlICh4ZHJzLCAmb2JqcC0+dHlwZSkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX3JwY19pbnQzMiAoeGRycywgJm9ianAtPnN0YXR1cykpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX3JwY19sb2NfaW9jdGxfY2FsbGJhY2tfZGF0YV91X3R5cGUgKHhkcnMsICZvYmpwLT5kYXRhKSkKLQkJIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19ldmVudF9wYXlsb2FkX3VfdHlwZSAoWERSICp4ZHJzLCBycGNfbG9jX2V2ZW50X3BheWxvYWRfdV90eXBlICpvYmpwKQotewotCXJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotCSBpZiAoIXhkcl91X3F1YWRfdCAoeGRycywgJm9ianAtPmRpc2MpKQotCQkgcmV0dXJuIEZBTFNFOwotCXN3aXRjaCAob2JqcC0+ZGlzYykgewotCWNhc2UgUlBDX0xPQ19FVkVOVF9QQVJTRURfUE9TSVRJT05fUkVQT1JUOgotCQkgaWYgKCF4ZHJfcnBjX2xvY19wYXJzZWRfcG9zaXRpb25fc190eXBlICh4ZHJzLCAmb2JqcC0+cnBjX2xvY19ldmVudF9wYXlsb2FkX3VfdHlwZV91LnBhcnNlZF9sb2NhdGlvbl9yZXBvcnQpKQotCQkJIHJldHVybiBGQUxTRTsKLQkJYnJlYWs7Ci0JY2FzZSBSUENfTE9DX0VWRU5UX1NBVEVMTElURV9SRVBPUlQ6Ci0JCSBpZiAoIXhkcl9ycGNfbG9jX2duc3NfaW5mb19zX3R5cGUgKHhkcnMsICZvYmpwLT5ycGNfbG9jX2V2ZW50X3BheWxvYWRfdV90eXBlX3UuZ25zc19yZXBvcnQpKQotCQkJIHJldHVybiBGQUxTRTsKLQkJYnJlYWs7Ci0JY2FzZSBSUENfTE9DX0VWRU5UX05NRUFfUE9TSVRJT05fUkVQT1JUOgotCQkgaWYgKCF4ZHJfcnBjX2xvY19ubWVhX3JlcG9ydF9zX3R5cGUgKHhkcnMsICZvYmpwLT5ycGNfbG9jX2V2ZW50X3BheWxvYWRfdV90eXBlX3Uubm1lYV9yZXBvcnQpKQotCQkJIHJldHVybiBGQUxTRTsKLQkJYnJlYWs7Ci0JY2FzZSBSUENfTE9DX0VWRU5UX05JX05PVElGWV9WRVJJRllfUkVRVUVTVDoKLQkJIGlmICgheGRyX3JwY19sb2NfbmlfZXZlbnRfc190eXBlICh4ZHJzLCAmb2JqcC0+cnBjX2xvY19ldmVudF9wYXlsb2FkX3VfdHlwZV91Lm5pX3JlcXVlc3QpKQotCQkJIHJldHVybiBGQUxTRTsKLQkJYnJlYWs7Ci0JY2FzZSBSUENfTE9DX0VWRU5UX0FTU0lTVEFOQ0VfREFUQV9SRVFVRVNUOgotCQkgaWYgKCF4ZHJfcnBjX2xvY19hc3Npc3RfZGF0YV9yZXF1ZXN0X3NfdHlwZSAoeGRycywgJm9ianAtPnJwY19sb2NfZXZlbnRfcGF5bG9hZF91X3R5cGVfdS5hc3Npc3RfZGF0YV9yZXF1ZXN0KSkKLQkJCSByZXR1cm4gRkFMU0U7Ci0JCWJyZWFrOwotCWNhc2UgUlBDX0xPQ19FVkVOVF9MT0NBVElPTl9TRVJWRVJfUkVRVUVTVDoKLQkJIGlmICgheGRyX3JwY19sb2Nfc2VydmVyX3JlcXVlc3Rfc190eXBlICh4ZHJzLCAmb2JqcC0+cnBjX2xvY19ldmVudF9wYXlsb2FkX3VfdHlwZV91LmxvY19zZXJ2ZXJfcmVxdWVzdCkpCi0JCQkgcmV0dXJuIEZBTFNFOwotCQlicmVhazsKLQljYXNlIFJQQ19MT0NfRVZFTlRfSU9DVExfUkVQT1JUOgotCQkgaWYgKCF4ZHJfcnBjX2xvY19pb2N0bF9jYWxsYmFja19zX3R5cGUgKHhkcnMsICZvYmpwLT5ycGNfbG9jX2V2ZW50X3BheWxvYWRfdV90eXBlX3UuaW9jdGxfcmVwb3J0KSkKLQkJCSByZXR1cm4gRkFMU0U7Ci0JCWJyZWFrOwotCWNhc2UgUlBDX0xPQ19FVkVOVF9TVEFUVVNfUkVQT1JUOgotCQkgaWYgKCF4ZHJfcnBjX2xvY19zdGF0dXNfZXZlbnRfc190eXBlICh4ZHJzLCAmb2JqcC0+cnBjX2xvY19ldmVudF9wYXlsb2FkX3VfdHlwZV91LnN0YXR1c19yZXBvcnQpKQotCQkJIHJldHVybiBGQUxTRTsKLQkJYnJlYWs7Ci0JY2FzZSBSUENfTE9DX0VWRU5UX1JFU0VSVkVEOgotCQkgaWYgKCF4ZHJfcnBjX2xvY19yZXNlcnZlZF9wYXlsb2FkX3NfdHlwZSAoeGRycywgJm9ianAtPnJwY19sb2NfZXZlbnRfcGF5bG9hZF91X3R5cGVfdS5yZXNlcnZlZCkpCi0JCQkgcmV0dXJuIEZBTFNFOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0JcmV0dXJuIFRSVUU7Ci19CmRpZmYgLS1naXQgYS9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaS1ycGMvZ2VuLTMyMDAvbG9jX2FwaV9maXh1cC5jIGIvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGktcnBjL2dlbi0zMjAwL2xvY19hcGlfZml4dXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU1MTJmNS4uMDAwMDAwMAotLS0gYS9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaS1ycGMvZ2VuLTMyMDAvbG9jX2FwaV9maXh1cC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICAgICAgICAgICAgICAgICAgICAgTCBPIEMgXyBBIFAgSSBfIEYgSSBYIFUgUCAuIEMKLQotR0VORVJBTCBERVNDUklQVElPTgotICBUaGlzIGZpbGUgYWRkcyBBUEkgY29uc3RhbnRzIHRoYXQgYXJlIG5vdCBhdXRvbWF0aWNhbGx5IHRyYW5zbWl0dGVkIHRvCi0gIHRoZSBSUEMgc3R1YnMsIGFuZCBpdCBhbHNvIGZpeGVzIG90aGVyIFJQQy1yZWxhdGVkIHByb2JsZW1zLgotCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQ29weXJpZ2h0IChjKSAyMDA5LCBRVUFMQ09NTSBVU0EsIElOQy4KLQotQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotCi23ICAgICAgICAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLQottyAgICAgICAgIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gCi0KLbcgICAgICAgICBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBRVUFMQ09NTSBVU0EsIElOQy4gIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIAotCi1USElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotI2luY2x1ZGUgPHJwYy9ycGMuaD4KLQotI2luY2x1ZGUgImxvY19hcGlfZml4dXAuaCIKLQotI2lmZGVmIEFERF9YRFJfRkxPQVQKLQotaW50Ci14ZHJfZmxvYXQoeGRycCwgZnApCi0gICAgICAgIFhEUiAqeGRycDsgCi0gICAgICAgIGZsb2F0ICpmcDsKLXsKLSAgICAgICAgcmV0dXJuIHhkcl9sb25nKHhkcnAsIChsb25nKilmcCk7Ci19ICAgIAotCi1pbnQgIAoteGRyX2RvdWJsZSh4ZHJwLCBkcCkKLSAgICAgICAgWERSICp4ZHJwOwotICAgICAgICBkb3VibGUgKmRwOyAKLXsKLSAgICAgICAgICAgICAgICByZXR1cm4geGRyX2xvbmcoeGRycCwgKGxvbmcqKWRwICsgMSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgeGRyX2xvbmcoeGRycCwgKGxvbmcqKWRwKTsKLX0gCi0KLSNlbmRpZiAvKiBBRERfWERSX0ZMT0FUICovCmRpZmYgLS1naXQgYS9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaS1ycGMvZ2VuLTMyMDAvbG9jX2FwaV9ycGNfZ2x1ZS5jIGIvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGktcnBjL2dlbi0zMjAwL2xvY19hcGlfcnBjX2dsdWUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGMxNzEyMi4uMDAwMDAwMAotLS0gYS9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaS1ycGMvZ2VuLTMyMDAvbG9jX2FwaV9ycGNfZ2x1ZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgQGZpbGUgIGxvY19hcGlfcnBjX2dsdWUuYwotICBAYnJpZWYgQW5kcm9pZCBMb2MgQVBJIGdsdWUgY29kZSB1c2luZyBycGNnZW4uCi0KLSAgREVTQ1JJUFRJT04KLSAgTG9jIEFQSSBnbHVlIGNvZGUgZm9yIEFuZHJvaWQKLQotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQ29weXJpZ2h0IChjKSAyMDA5LCBRVUFMQ09NTSBVU0EsIElOQy4KLQotQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotCi23ICAgICAgICAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLQottyAgICAgICAgIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gCi0KLbcgICAgICAgICBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBRVUFMQ09NTSBVU0EsIElOQy4gIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIAotCi1USElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgICAgICAgICAgICAgICAgICAgICBFRElUIEhJU1RPUlkgRk9SIE1PRFVMRQotCi0gIFRoaXMgc2VjdGlvbiBjb250YWlucyBjb21tZW50cyBkZXNjcmliaW5nIGNoYW5nZXMgbWFkZSB0byB0aGUgbW9kdWxlLgotICBOb3RpY2UgdGhhdCBjaGFuZ2VzIGFyZSBsaXN0ZWQgaW4gcmV2ZXJzZSBjaHJvbm9sb2dpY2FsIG9yZGVyLgotCi13aGVuICAgICAgIHdobyAgICAgIHdoYXQsIHdoZXJlLCB3aHkgCi0tLS0tLS0tLSAgIC0tLSAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCi0wMy8wNS8yMDA5ICAgZHggICAgICAgSW5pdGlhbCB2ZXJzaW9uCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLyAKLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICAgICAgICAgICAgICAgICAgIElOQ0xVREUgRklMRVMgRk9SIE1PRFVMRQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLS8vI2RlZmluZSBMT0dfTkRERUJVRyAwCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHB0aHJlYWQuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN5cy9zZWxlY3QuaD4KLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPGFzc2VydC5oPgotCi0jaW5jbHVkZSA8cnBjL3JwYy5oPgotI2luY2x1ZGUgPHJwYy9jbG50Lmg+Ci0KLS8qIEluY2x1ZGUgUlBDIGhlYWRlcnMgKi8KLSNpbmNsdWRlICJsb2NfYXBpX3JwY19nbHVlLmgiCi0KLS8qIENhbGxiYWNrIGluaXQgKi8KLSNpbmNsdWRlICJsb2NfYXBpY2JfYXBwaW5pdC5oIgotCi0vKiBMb2dnaW5nICovCi0jZGVmaW5lIExPR19UQUcgImxpYl9hcGlfcnBjX2dsdWUiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLS8qIENvbW1lbnQgdGhpcyBvdXQgdG8gZW5hYmxlIGxvZ2dpbmcgKi8KLSN1bmRlZiBMT0dECi0jZGVmaW5lIExPR0QoLi4uKSB7fQotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICBFeHRlcm5hbCBkZWNsYXJhdGlvbnMKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi1DTElFTlQqIGxvY19hcGlfY2xudCA9IE5VTEw7Ci0KLS8qIENhbGxiYWNrIElEIGFuZCBwb2ludGVyICovCi0jZGVmaW5lIExPQ19BUElfQ0JfSUQgMSAKLWxvY19ldmVudF9jYl9mX3R5cGUgKmxvY19hcGlfc2F2ZWRfY2IgPSBOVUxMOyAgLyogdGhlIG9ubHkgY2FsbGJhY2sgb2YgTG9jIEFQSSBjbGllbnQgKi8KLQotI2RlZmluZSBSUENfRlVOQ19WRVJTSU9OX0JBU0UoYSxiKSBhICMjIGIKLSNkZWZpbmUgUlBDX0ZVTkNfVkVSU0lPTihhLGIpIFJQQ19GVU5DX1ZFUlNJT05fQkFTRShhLGIpCi0KLSNkZWZpbmUgTE9DX0dMVUVfQ0hFQ0tfSU5JVChyZXRfdHlwZSkgXAotICAgaWYgKGxvY19hcGlfY2xudCA9PSBOVUxMKSB7IHJldHVybiAocmV0X3R5cGUpIFJQQ19MT0NfQVBJX1JQQ19GQUlMVVJFOyB9Ci0KLSNkZWZpbmUgTE9DX0dMVUVfQ0hFQ0tfUkVTVUxUKHN0YXQsIHJldF90eXBlKSBcCi0gICBpZiAoc3RhdCAhPSBSUENfU1VDQ0VTUykgeyByZXR1cm4gKHJldF90eXBlKSBSUENfTE9DX0FQSV9SUENfRkFJTFVSRTsgfSAgIAotCi0vKiBDYWxsYmFjayBmdW5jdGlvbnMgKi8KLS8qIFJldHVybnMgMSBpZiBzdWNjZXNzZnVsICovCi1ib29sX3QgcnBjX2xvY19ldmVudF9jYl9mX3R5cGVfMHgwMDAxMDAwMV9zdmMoCi0gICAgICAgIHJwY19sb2NfZXZlbnRfY2JfZl90eXBlX2FyZ3MgKmFyZ3AsCi0gICAgICAgIHJwY19sb2NfZXZlbnRfY2JfZl90eXBlX3JldHMgKnJldCwKLSAgICAgICAgc3RydWN0IHN2Y19yZXEgKnJlcSkKLXsKLSAgICAvKiBDYWxsYmFjayBub3QgcmVnaXN0ZXJlZCwgb3IgdW5leHBlY3RlZCBJRCAoc2hvdWxkbid0IGhhcHBlbikgKi8KLSAgICBpZiAobG9jX2FwaV9zYXZlZF9jYiA9PSBOVUxMIHx8IGFyZ3AtPmNiX2lkICE9IExPQ19BUElfQ0JfSUQpCi0gICAgewotICAgICAgICBMT0dEKCJXYXJuaW5nOiBObyBjYWxsYmFjayBoYW5kbGVyLlxuIik7Ci0gICAgICAgIHJldC0+bG9jX2V2ZW50X2NiX2ZfdHlwZV9yZXN1bHQgPSAwOwotICAgICAgICByZXR1cm4gMTsgLyogc2ltcGx5IHJldHVybiAqLwotICAgIH0KLQotICAgIExPR0QoInByb2M6ICV4ICBwcm9nOiAleCAgdmVyczogJXhcbiIsCi0gICAgICAgICAgICAoaW50KSByZXEtPnJxX3Byb2MsCi0gICAgICAgICAgICAoaW50KSByZXEtPnJxX3Byb2csCi0gICAgICAgICAgICAoaW50KSByZXEtPnJxX3ZlcnMpOwotCi0gICAgTE9HRCgiQ2FsbGJhY2sgcmVjZWl2ZWQ6ICV4IChoYW5kbGU9JWQgcmV0X3B0cj0lZClcbiIsCi0gICAgICAgICAgICAoaW50KSBhcmdwLT5sb2NfZXZlbnQsCi0gICAgICAgICAgICAoaW50KSBhcmdwLT5sb2NfaGFuZGxlLAotICAgICAgICAgICAgKGludCkgcmV0KTsKLQotICAgIC8qIEZvcndhcmQgY2FsbGJhY2sgdG8gcmVhbCBjYWxsYmFjayBwcm9jZWR1cmUgKi8KLSAgICBycGNfbG9jX2NsaWVudF9oYW5kbGVfdHlwZSAgICAgICAgbG9jX2hhbmRsZSA9IGFyZ3AtPmxvY19oYW5kbGU7Ci0gICAgcnBjX2xvY19ldmVudF9tYXNrX3R5cGUgICAgICAgICAgIGxvY19ldmVudCAgPSBhcmdwLT5sb2NfZXZlbnQ7Ci0gICAgY29uc3QgcnBjX2xvY19ldmVudF9wYXlsb2FkX3VfdHlwZSogIGxvY19ldmVudF9wYXlsb2FkID0KLSAgICAgICAgKGNvbnN0IHJwY19sb2NfZXZlbnRfcGF5bG9hZF91X3R5cGUqKSBhcmdwLT5sb2NfZXZlbnRfcGF5bG9hZDsKLQotICAgIGludDMyIHJjID0gbG9jX2FwaV9zYXZlZF9jYihsb2NfaGFuZGxlLCBsb2NfZXZlbnQsIGxvY19ldmVudF9wYXlsb2FkKTsKLSAgICByZXQtPmxvY19ldmVudF9jYl9mX3R5cGVfcmVzdWx0ID0gcmM7Ci0KLSAgICByZXR1cm4gMTsgLyogb2sgKi8KLX0KLQotaW50IGxvY19hcGljYnByb2dfZnJlZXJlc3VsdCAoU1ZDWFBSVCAqdHJhbnNwLCB4ZHJwcm9jX3QgeGRyX3Jlc3VsdCwgY2FkZHJfdCByZXN1bHQpCi17Ci0gICAgeGRyX2ZyZWUgKHhkcl9yZXN1bHQsIHJlc3VsdCk7Ci0KLSAgICAvKgotICAgICAqIEluc2VydCBhZGRpdGlvbmFsIGZyZWVpbmcgY29kZSBoZXJlLCBpZiBuZWVkZWQKLSAgICAgKi8KLSAgICAvLyBMT0dEKCIqKioqKiBsb2NfYXBpY2Jwcm9nX2ZyZWVyZXN1bHRcbiIpOwotCi0gICAgcmV0dXJuIDE7Ci19Ci0KLWludCBsb2NfYXBpY2Jwcm9nXzB4MDAwMTAwMDFfZnJlZXJlc3VsdCAoU1ZDWFBSVCAqdHJhbnNwLCB4ZHJwcm9jX3QgeGRyX3Jlc3VsdCwgY2FkZHJfdCByZXN1bHQpCi17Ci0gICAgcmV0dXJuIGxvY19hcGljYnByb2dfZnJlZXJlc3VsdCAodHJhbnNwLCB4ZHJfcmVzdWx0LCByZXN1bHQpOwotfQotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1GVU5DVElPTiBsb2NfYXBpX2dsdWVfaW5pdAotCi1ERVNDUklQVElPTgotICAgSW5pdGlhdGVzIHRoZSBSUEMgY2xpZW50Ci0KLVJFVFVSTiBWQUxVRQotICAgMSBmb3Igc3VjY2VzcwotICAgMCBmb3IgZmFpbHVyZQotICAgCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotaW50IGxvY19hcGlfZ2x1ZV9pbml0KHZvaWQpCi17Ci0gICAgaWYgKGxvY19hcGlfY2xudCA9PSBOVUxMKQotICAgIHsKLSAgICAgICAgLyogUHJpbnQgbXNnICovCi0gICAgICAgIExPR0QoIlRyeWluZyB0byBjcmVhdGUgUlBDIGNsaWVudC4uLlxuIik7Ci0gICAgICAgIGxvY19hcGlfY2xudCA9IGNsbnRfY3JlYXRlKE5VTEwsIExPQ19BUElQUk9HLCAvKkxPQ19BUElWRVJTKi8gMHgwMDAxMDAwMCwgTlVMTCk7Ci0gICAgICAgIExPR0QoIkNyZWF0ZWQgbG9jX2FwaV9jbG50IC0tLS0gJXhcbiIsICh1bnNpZ25lZCBpbnQpbG9jX2FwaV9jbG50KTsKLQotICAgICAgICBpZiAobG9jX2FwaV9jbG50ID09IE5VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3I6IGNhbm5vdCBjcmVhdGUgUlBDIGNsaWVudC5cbiIpOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBJbml0IFJQQyBjYWxsYmFja3MgKi8KLSAgICAgICAgaW50IHJjID0gbG9jX2FwaWNiX2FwcF9pbml0KCk7Ci0gICAgICAgIGlmIChyYyA+PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBMT0dEKCJMb2MgQVBJIGNhbGxiYWNrIGluaXRpYWxpemVkLlxuIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkxvYyBBUEkgY2FsbGJhY2sgaW5pdGlhbGl6YXRpb24gZmFpbGVkLlxuIik7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiAxOwotfQotCi1ycGNfbG9jX2NsaWVudF9oYW5kbGVfdHlwZSBsb2Nfb3BlbiAoCi0gICAgICAgIHJwY19sb2NfZXZlbnRfbWFza190eXBlICBldmVudF9yZWdfbWFzaywKLSAgICAgICAgbG9jX2V2ZW50X2NiX2ZfdHlwZSAgICAgICpldmVudF9jYWxsYmFjawotICAgICkKLXsKLSAgICBMT0NfR0xVRV9DSEVDS19JTklUKHJwY19sb2NfY2xpZW50X2hhbmRsZV90eXBlKTsKLQotICAgIHJwY19sb2Nfb3Blbl9hcmdzIGFyZ3M7Ci0gICAgYXJncy5ldmVudF9yZWdfbWFzayA9IGV2ZW50X3JlZ19tYXNrOwotICAgIGFyZ3MuZXZlbnRfY2FsbGJhY2sgPSBMT0NfQVBJX0NCX0lEOwotICAgIGxvY19hcGlfc2F2ZWRfY2IgPSBldmVudF9jYWxsYmFjazsKLQotICAgIHJwY19sb2Nfb3Blbl9yZXRzIHJldHM7Ci0gICAgZW51bSBjbG50X3N0YXQgc3RhdCA9IFJQQ19TVUNDRVNTOwotCi0gICAgc3RhdCA9IFJQQ19GVU5DX1ZFUlNJT04ocnBjX2xvY19vcGVuXywgTE9DX0FQSVZFUlMpKCZhcmdzLCAmcmV0cywgbG9jX2FwaV9jbG50KTsKLSAgICBMT0NfR0xVRV9DSEVDS19SRVNVTFQoc3RhdCwgaW50MzIpOwotCi0gICAgcmV0dXJuIChycGNfbG9jX2NsaWVudF9oYW5kbGVfdHlwZSkgcmV0cy5sb2Nfb3Blbl9yZXN1bHQ7Ci19Ci0KLWludDMyIGxvY19jbG9zZShycGNfbG9jX2NsaWVudF9oYW5kbGVfdHlwZSBoYW5kbGUpCi17Ci0gICAgTE9DX0dMVUVfQ0hFQ0tfSU5JVChpbnQzMik7Ci0KLSAgICBycGNfbG9jX2Nsb3NlX2FyZ3MgYXJnczsKLSAgICBhcmdzLmhhbmRsZSA9IGhhbmRsZTsKLQotICAgIHJwY19sb2NfY2xvc2VfcmV0cyByZXRzOwotICAgIGVudW0gY2xudF9zdGF0IHN0YXQgPSBSUENfU1VDQ0VTUzsKLQotICAgIHN0YXQgPSBSUENfRlVOQ19WRVJTSU9OKHJwY19sb2NfY2xvc2VfLCBMT0NfQVBJVkVSUykoJmFyZ3MsICZyZXRzLCBsb2NfYXBpX2NsbnQpOwotICAgIExPQ19HTFVFX0NIRUNLX1JFU1VMVChzdGF0LCBpbnQzMik7Ci0KLSAgICByZXR1cm4gKGludDMyKSByZXRzLmxvY19jbG9zZV9yZXN1bHQ7Ci19Ci0KLWludDMyIGxvY19zdGFydF9maXgocnBjX2xvY19jbGllbnRfaGFuZGxlX3R5cGUgaGFuZGxlKQotewotICAgIExPQ19HTFVFX0NIRUNLX0lOSVQoaW50MzIpOwotCi0gICAgcnBjX2xvY19zdGFydF9maXhfYXJncyBhcmdzOwotICAgIGFyZ3MuaGFuZGxlID0gaGFuZGxlOwotCi0gICAgcnBjX2xvY19zdGFydF9maXhfcmV0cyByZXRzOwotICAgIGVudW0gY2xudF9zdGF0IHN0YXQgPSBSUENfU1VDQ0VTUzsKLQotICAgIHN0YXQgPSBSUENfRlVOQ19WRVJTSU9OKHJwY19sb2Nfc3RhcnRfZml4XywgTE9DX0FQSVZFUlMpKCZhcmdzLCAmcmV0cywgbG9jX2FwaV9jbG50KTsKLSAgICBMT0NfR0xVRV9DSEVDS19SRVNVTFQoc3RhdCwgaW50MzIpOwotCi0gICAgcmV0dXJuIChpbnQzMikgcmV0cy5sb2Nfc3RhcnRfZml4X3Jlc3VsdDsKLX0KLQotaW50MzIgbG9jX3N0b3BfZml4KHJwY19sb2NfY2xpZW50X2hhbmRsZV90eXBlIGhhbmRsZSkKLXsKLSAgICBMT0NfR0xVRV9DSEVDS19JTklUKGludDMyKTsKLQotICAgIHJwY19sb2Nfc3RvcF9maXhfYXJncyBhcmdzOwotICAgIGFyZ3MuaGFuZGxlID0gaGFuZGxlOwotCi0gICAgcnBjX2xvY19zdG9wX2ZpeF9yZXRzIHJldHM7Ci0gICAgZW51bSBjbG50X3N0YXQgc3RhdCA9IFJQQ19TVUNDRVNTOwotCi0gICAgc3RhdCA9IFJQQ19GVU5DX1ZFUlNJT04ocnBjX2xvY19zdG9wX2ZpeF8sIExPQ19BUElWRVJTKSgmYXJncywgJnJldHMsIGxvY19hcGlfY2xudCk7Ci0gICAgTE9DX0dMVUVfQ0hFQ0tfUkVTVUxUKHN0YXQsIGludDMyKTsKLQotICAgIHJldHVybiAoaW50MzIpIHJldHMubG9jX3N0b3BfZml4X3Jlc3VsdDsKLX0KLQotaW50MzIgbG9jX2lvY3RsKAotICAgIHJwY19sb2NfY2xpZW50X2hhbmRsZV90eXBlICAgICAgICAgICBoYW5kbGUsCi0gICAgcnBjX2xvY19pb2N0bF9lX3R5cGUgICAgICAgICAgICAgICAgIGlvY3RsX3R5cGUsCi0gICAgcnBjX2xvY19pb2N0bF9kYXRhX3VfdHlwZSogICAgICAgICAgIGlvY3RsX2RhdGEKLSAgICApCi17Ci0gICAgTE9DX0dMVUVfQ0hFQ0tfSU5JVChpbnQzMik7Ci0KLSAgICBycGNfbG9jX2lvY3RsX2FyZ3MgYXJnczsKLSAgICBhcmdzLmhhbmRsZSA9IGhhbmRsZTsKLSAgICBhcmdzLmlvY3RsX2RhdGEgPSBpb2N0bF9kYXRhOwotICAgIGFyZ3MuaW9jdGxfdHlwZSA9IGlvY3RsX3R5cGU7Ci0gICAgaWYgKGlvY3RsX2RhdGEgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIC8qIEFzc2lnbiBpb2N0bCB1bmlvbiBkaXNjcmltaW5hdG9yICovCi0gICAgICAgIGlvY3RsX2RhdGEtPmRpc2MgPSBpb2N0bF90eXBlOwotCi0gICAgICAgIC8qIEluIGNhc2UgdGhlIHVzZXIgaGFzbid0IGZpbGxlZCBpbiBvdGhlciBkaXNjIGZpZWxkcywKLSAgICAgICAgICAgYXV0b21hdGljYWxseSBmaWxsIHRoZW0gaW4gaGVyZSAqLwotICAgICAgICBzd2l0Y2ggKGlvY3RsX3R5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgUlBDX0xPQ19JT0NUTF9HRVRfQVBJX1ZFUlNJT046Ci0gICAgICAgICAgICBjYXNlIFJQQ19MT0NfSU9DVExfU0VUX0ZJWF9DUklURVJJQToKLSAgICAgICAgICAgIGNhc2UgUlBDX0xPQ19JT0NUTF9HRVRfRklYX0NSSVRFUklBOgotICAgICAgICAgICAgY2FzZSBSUENfTE9DX0lPQ1RMX0lORk9STV9OSV9VU0VSX1JFU1BPTlNFOgotICAgICAgICAgICAgY2FzZSBSUENfTE9DX0lPQ1RMX0lOSkVDVF9QUkVESUNURURfT1JCSVRTX0RBVEE6Ci0gICAgICAgICAgICBjYXNlIFJQQ19MT0NfSU9DVExfUVVFUllfUFJFRElDVEVEX09SQklUU19EQVRBX1ZBTElESVRZOgotICAgICAgICAgICAgY2FzZSBSUENfTE9DX0lPQ1RMX1FVRVJZX1BSRURJQ1RFRF9PUkJJVFNfREFUQV9TT1VSQ0U6Ci0gICAgICAgICAgICBjYXNlIFJQQ19MT0NfSU9DVExfU0VUX1BSRURJQ1RFRF9PUkJJVFNfREFUQV9BVVRPX0RPV05MT0FEOgotICAgICAgICAgICAgY2FzZSBSUENfTE9DX0lPQ1RMX0lOSkVDVF9VVENfVElNRToKLSAgICAgICAgICAgIGNhc2UgUlBDX0xPQ19JT0NUTF9JTkpFQ1RfUlRDX1ZBTFVFOgotICAgICAgICAgICAgY2FzZSBSUENfTE9DX0lPQ1RMX0lOSkVDVF9QT1NJVElPTjoKLSAgICAgICAgICAgIGNhc2UgUlBDX0xPQ19JT0NUTF9RVUVSWV9FTkdJTkVfU1RBVEU6Ci0gICAgICAgICAgICBjYXNlIFJQQ19MT0NfSU9DVExfSU5GT1JNX1NFUlZFUl9PUEVOX1NUQVRVUzoKLSAgICAgICAgICAgIGNhc2UgUlBDX0xPQ19JT0NUTF9JTkZPUk1fU0VSVkVSX0NMT1NFX1NUQVRVUzoKLSAgICAgICAgICAgIGNhc2UgUlBDX0xPQ19JT0NUTF9TRVRfRU5HSU5FX0xPQ0s6Ci0gICAgICAgICAgICBjYXNlIFJQQ19MT0NfSU9DVExfR0VUX0VOR0lORV9MT0NLOgotICAgICAgICAgICAgY2FzZSBSUENfTE9DX0lPQ1RMX1NFVF9TQkFTX0NPTkZJRzoKLSAgICAgICAgICAgIGNhc2UgUlBDX0xPQ19JT0NUTF9HRVRfU0JBU19DT05GSUc6Ci0gICAgICAgICAgICBjYXNlIFJQQ19MT0NfSU9DVExfU0VUX05NRUFfVFlQRVM6Ci0gICAgICAgICAgICBjYXNlIFJQQ19MT0NfSU9DVExfR0VUX05NRUFfVFlQRVM6Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFJQQ19MT0NfSU9DVExfU0VUX0NETUFfUERFX1NFUlZFUl9BRERSOgotICAgICAgICAgICAgY2FzZSBSUENfTE9DX0lPQ1RMX1NFVF9DRE1BX01QQ19TRVJWRVJfQUREUjoKLSAgICAgICAgICAgIGNhc2UgUlBDX0xPQ19JT0NUTF9TRVRfVU1UU19TTFBfU0VSVkVSX0FERFI6Ci0gICAgICAgICAgICAgICAgYXJncy5pb2N0bF9kYXRhLT5ycGNfbG9jX2lvY3RsX2RhdGFfdV90eXBlX3Uuc2VydmVyX2FkZHIuYWRkcl9pbmZvLmRpc2MgPQotICAgICAgICAgICAgICAgICAgICBhcmdzLmlvY3RsX2RhdGEtPnJwY19sb2NfaW9jdGxfZGF0YV91X3R5cGVfdS5zZXJ2ZXJfYWRkci5hZGRyX3R5cGU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFJQQ19MT0NfSU9DVExfR0VUX0NETUFfUERFX1NFUlZFUl9BRERSOgotICAgICAgICAgICAgY2FzZSBSUENfTE9DX0lPQ1RMX0dFVF9DRE1BX01QQ19TRVJWRVJfQUREUjoKLSAgICAgICAgICAgIGNhc2UgUlBDX0xPQ19JT0NUTF9HRVRfVU1UU19TTFBfU0VSVkVSX0FERFI6Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFJQQ19MT0NfSU9DVExfU0VUX09OX0RFTUFORF9MUE06Ci0gICAgICAgICAgICBjYXNlIFJQQ19MT0NfSU9DVExfR0VUX09OX0RFTUFORF9MUE06Ci0gICAgICAgICAgICBjYXNlIFJQQ19MT0NfSU9DVExfREVMRVRFX0FTU0lTVF9EQVRBOgotICAgICAgICAgICAgY2FzZSBSUENfTE9DX0lPQ1RMX1NFVF9DVVNUT01fUERFX1NFUlZFUl9BRERSOgotICAgICAgICAgICAgY2FzZSBSUENfTE9DX0lPQ1RMX0dFVF9DVVNUT01fUERFX1NFUlZFUl9BRERSOgotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfSAvKiBzd2l0Y2ggKi8KLSAgICB9IC8qIGlvY3RsX2RhdGEgIT0gTlVMTCAqLwotCi0gICAgcnBjX2xvY19pb2N0bF9yZXRzIHJldHM7Ci0gICAgZW51bSBjbG50X3N0YXQgc3RhdCA9IFJQQ19TVUNDRVNTOwotCi0gICAgc3RhdCA9IFJQQ19GVU5DX1ZFUlNJT04ocnBjX2xvY19pb2N0bF8sIExPQ19BUElWRVJTKSgmYXJncywgJnJldHMsIGxvY19hcGlfY2xudCk7Ci0gICAgTE9DX0dMVUVfQ0hFQ0tfUkVTVUxUKHN0YXQsIGludDMyKTsKLQotICAgIHJldHVybiAoaW50MzIpIHJldHMubG9jX2lvY3RsX3Jlc3VsdDsKLX0KLQotLyogUmV0dXJucyAwIGlmIGVycm9yICovCi1pbnQzMiBsb2NfYXBpX251bGwodm9pZCkKLXsKLSAgICBMT0NfR0xVRV9DSEVDS19JTklUKGludDMyKTsKLQotICAgIGludDMyIHJldHM7Ci0gICAgZW51bSBjbG50X3N0YXQgc3RhdCA9IFJQQ19TVUNDRVNTOwotCi0gICAgc3RhdCA9IFJQQ19GVU5DX1ZFUlNJT04ocnBjX2xvY19hcGlfbnVsbF8sIExPQ19BUElWRVJTKShOVUxMLCAmcmV0cywgbG9jX2FwaV9jbG50KTsKLSAgICBMT0NfR0xVRV9DSEVDS19SRVNVTFQoc3RhdCwgaW50MzIpOwotCi0gICAgcmV0dXJuIChpbnQzMikgcmV0czsKLX0KZGlmZiAtLWdpdCBhL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpLXJwYy9nZW4tMzIwMC9sb2NfYXBpX3hkci5jIGIvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGktcnBjL2dlbi0zMjAwL2xvY19hcGlfeGRyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzNWY2YjEuLjAwMDAwMDAKLS0tIGEvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGktcnBjL2dlbi0zMjAwL2xvY19hcGlfeGRyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotLyoKLSAqIFBsZWFzZSBkbyBub3QgZWRpdCB0aGlzIGZpbGUuCi0gKiBJdCB3YXMgZ2VuZXJhdGVkIHVzaW5nIHJwY2dlbi4KLSAqLwotCi0jaW5jbHVkZSAibG9jX2FwaS5oIgotCi1ib29sX3QKLXhkcl9ycGNfbG9jX2FwaV9hcGlfdmVyc2lvbnNfcmV0dXJuX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19hcGlfYXBpX3ZlcnNpb25zX3JldHVybl90eXBlICpvYmpwKQotewotCXJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotCSBpZiAoIXhkcl9hcnJheSAoeGRycywgKGNoYXIgKiopJm9ianAtPnJwY19sb2NfYXBpX2FwaV92ZXJzaW9uc19yZXR1cm5fdHlwZV92YWwsICh1X2ludCAqKSAmb2JqcC0+cnBjX2xvY19hcGlfYXBpX3ZlcnNpb25zX3JldHVybl90eXBlX2xlbiwgfjAsCi0JCXNpemVvZiAocnBjX3VpbnQzMiksICh4ZHJwcm9jX3QpIHhkcl9ycGNfdWludDMyKSkKLQkJIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19ldmVudF9jYl9mX3R5cGUgKFhEUiAqeGRycywgcnBjX2xvY19ldmVudF9jYl9mX3R5cGUgKm9ianApCi17Ci0JcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0JIGlmICgheGRyX3JwY191aW50MzIgKHhkcnMsIG9ianApKQotCQkgcmV0dXJuIEZBTFNFOwotCXJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfbG9jX29wZW5fYXJncyAoWERSICp4ZHJzLCBycGNfbG9jX29wZW5fYXJncyAqb2JqcCkKLXsKLQlyZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLQkgaWYgKCF4ZHJfcnBjX2xvY19ldmVudF9tYXNrX3R5cGUgKHhkcnMsICZvYmpwLT5ldmVudF9yZWdfbWFzaykpCi0JCSByZXR1cm4gRkFMU0U7Ci0JIGlmICgheGRyX3JwY19sb2NfZXZlbnRfY2JfZl90eXBlICh4ZHJzLCAmb2JqcC0+ZXZlbnRfY2FsbGJhY2spKQotCQkgcmV0dXJuIEZBTFNFOwotCXJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfbG9jX2Nsb3NlX2FyZ3MgKFhEUiAqeGRycywgcnBjX2xvY19jbG9zZV9hcmdzICpvYmpwKQotewotCXJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotCSBpZiAoIXhkcl9ycGNfbG9jX2NsaWVudF9oYW5kbGVfdHlwZSAoeGRycywgJm9ianAtPmhhbmRsZSkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2Nfc3RhcnRfZml4X2FyZ3MgKFhEUiAqeGRycywgcnBjX2xvY19zdGFydF9maXhfYXJncyAqb2JqcCkKLXsKLQlyZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLQkgaWYgKCF4ZHJfcnBjX2xvY19jbGllbnRfaGFuZGxlX3R5cGUgKHhkcnMsICZvYmpwLT5oYW5kbGUpKQotCQkgcmV0dXJuIEZBTFNFOwotCXJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfbG9jX3N0b3BfZml4X2FyZ3MgKFhEUiAqeGRycywgcnBjX2xvY19zdG9wX2ZpeF9hcmdzICpvYmpwKQotewotCXJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotCSBpZiAoIXhkcl9ycGNfbG9jX2NsaWVudF9oYW5kbGVfdHlwZSAoeGRycywgJm9ianAtPmhhbmRsZSkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2NfaW9jdGxfYXJncyAoWERSICp4ZHJzLCBycGNfbG9jX2lvY3RsX2FyZ3MgKm9ianApCi17Ci0JcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0JIGlmICgheGRyX3JwY19sb2NfY2xpZW50X2hhbmRsZV90eXBlICh4ZHJzLCAmb2JqcC0+aGFuZGxlKSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfcnBjX2xvY19pb2N0bF9lX3R5cGUgKHhkcnMsICZvYmpwLT5pb2N0bF90eXBlKSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfcG9pbnRlciAoeGRycywgKGNoYXIgKiopJm9ianAtPmlvY3RsX2RhdGEsIHNpemVvZiAocnBjX2xvY19pb2N0bF9kYXRhX3VfdHlwZSksICh4ZHJwcm9jX3QpIHhkcl9ycGNfbG9jX2lvY3RsX2RhdGFfdV90eXBlKSkKLQkJIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19hcGlfYXBpX3ZlcnNpb25fc19hcmdzIChYRFIgKnhkcnMsIHJwY19sb2NfYXBpX2FwaV92ZXJzaW9uX3NfYXJncyAqb2JqcCkKLXsKLQlyZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLQkgaWYgKCF4ZHJfcnBjX2Jvb2xlYW4gKHhkcnMsICZvYmpwLT5sZW5fbm90X251bGwpKQotCQkgcmV0dXJuIEZBTFNFOwotCXJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfbG9jX2FwaV9ycGNfZ2x1ZV9jb2RlX2luZm9fcmVtb3RlX3JldHMgKFhEUiAqeGRycywgcnBjX2xvY19hcGlfcnBjX2dsdWVfY29kZV9pbmZvX3JlbW90ZV9yZXRzICpvYmpwKQotewotCXJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotCSBpZiAoIXhkcl9ycGNfdWludDMyICh4ZHJzLCAmb2JqcC0+dG9vbHZlcnMpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9ycGNfdWludDMyICh4ZHJzLCAmb2JqcC0+ZmVhdHVyZXMpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9ycGNfdWludDMyICh4ZHJzLCAmb2JqcC0+cHJvZ2hhc2gpKQotCQkgcmV0dXJuIEZBTFNFOwotCSBpZiAoIXhkcl9ycGNfdWludDMyICh4ZHJzLCAmb2JqcC0+Y2Jwcm9naGFzaCkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2Nfb3Blbl9yZXRzIChYRFIgKnhkcnMsIHJwY19sb2Nfb3Blbl9yZXRzICpvYmpwKQotewotCXJlZ2lzdGVyIGludDMyX3QgKmJ1ZjsKLQotCSBpZiAoIXhkcl9ycGNfbG9jX2NsaWVudF9oYW5kbGVfdHlwZSAoeGRycywgJm9ianAtPmxvY19vcGVuX3Jlc3VsdCkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2NfY2xvc2VfcmV0cyAoWERSICp4ZHJzLCBycGNfbG9jX2Nsb3NlX3JldHMgKm9ianApCi17Ci0JcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0JIGlmICgheGRyX3JwY19pbnQzMiAoeGRycywgJm9ianAtPmxvY19jbG9zZV9yZXN1bHQpKQotCQkgcmV0dXJuIEZBTFNFOwotCXJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfbG9jX3N0YXJ0X2ZpeF9yZXRzIChYRFIgKnhkcnMsIHJwY19sb2Nfc3RhcnRfZml4X3JldHMgKm9ianApCi17Ci0JcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0JIGlmICgheGRyX3JwY19pbnQzMiAoeGRycywgJm9ianAtPmxvY19zdGFydF9maXhfcmVzdWx0KSkKLQkJIHJldHVybiBGQUxTRTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotYm9vbF90Ci14ZHJfcnBjX2xvY19zdG9wX2ZpeF9yZXRzIChYRFIgKnhkcnMsIHJwY19sb2Nfc3RvcF9maXhfcmV0cyAqb2JqcCkKLXsKLQlyZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLQkgaWYgKCF4ZHJfcnBjX2ludDMyICh4ZHJzLCAmb2JqcC0+bG9jX3N0b3BfZml4X3Jlc3VsdCkpCi0JCSByZXR1cm4gRkFMU0U7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLWJvb2xfdAoteGRyX3JwY19sb2NfaW9jdGxfcmV0cyAoWERSICp4ZHJzLCBycGNfbG9jX2lvY3RsX3JldHMgKm9ianApCi17Ci0JcmVnaXN0ZXIgaW50MzJfdCAqYnVmOwotCi0JIGlmICgheGRyX3JwY19pbnQzMiAoeGRycywgJm9ianAtPmxvY19pb2N0bF9yZXN1bHQpKQotCQkgcmV0dXJuIEZBTFNFOwotCXJldHVybiBUUlVFOwotfQotCi1ib29sX3QKLXhkcl9ycGNfbG9jX2FwaV9hcGlfdmVyc2lvbnNfcmV0cyAoWERSICp4ZHJzLCBycGNfbG9jX2FwaV9hcGlfdmVyc2lvbnNfcmV0cyAqb2JqcCkKLXsKLQlyZWdpc3RlciBpbnQzMl90ICpidWY7Ci0KLQkgaWYgKCF4ZHJfcnBjX2xvY19hcGlfYXBpX3ZlcnNpb25zX3JldHVybl90eXBlICh4ZHJzLCAmb2JqcC0+bG9jX2FwaV9hcGlfdmVyc2lvbnNfcmVzdWx0KSkKLQkJIHJldHVybiBGQUxTRTsKLQkgaWYgKCF4ZHJfcG9pbnRlciAoeGRycywgKGNoYXIgKiopJm9ianAtPmxlbiwgc2l6ZW9mIChycGNfdWludDMyKSwgKHhkcnByb2NfdCkgeGRyX3JwY191aW50MzIpKQotCQkgcmV0dXJuIEZBTFNFOwotCXJldHVybiBUUlVFOwotfQpkaWZmIC0tZ2l0IGEvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGktcnBjL2luYy0xMjQwL2xvY19hcGkuaCBiL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpLXJwYy9pbmMtMTI0MC9sb2NfYXBpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwMjY0OGMuLjAwMDAwMDAKLS0tIGEvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGktcnBjL2luYy0xMjQwL2xvY19hcGkuaAorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0vKgotICogUGxlYXNlIGRvIG5vdCBlZGl0IHRoaXMgZmlsZS4KLSAqIEl0IHdhcyBnZW5lcmF0ZWQgdXNpbmcgcnBjZ2VuLgotICovCi0KLSNpZm5kZWYgX0xPQ19BUElfSF9SUENHRU4KLSNkZWZpbmUgX0xPQ19BUElfSF9SUENHRU4KLQotI2luY2x1ZGUgPHJwYy9ycGMuaD4KLQotI2luY2x1ZGUgPHB0aHJlYWQuaD4KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0KLXR5cGVkZWYgc3RydWN0IHsKLQl1X2ludCBycGNfbG9jX2FwaV9hcGlfdmVyc2lvbnNfcmV0dXJuX3R5cGVfbGVuOwotCXJwY191aW50MzIgKnJwY19sb2NfYXBpX2FwaV92ZXJzaW9uc19yZXR1cm5fdHlwZV92YWw7Ci19IHJwY19sb2NfYXBpX2FwaV92ZXJzaW9uc19yZXR1cm5fdHlwZTsKLQotdHlwZWRlZiBycGNfdWludDMyIHJwY19sb2NfZXZlbnRfY2JfZl90eXBlOwotCi1zdHJ1Y3QgcnBjX2xvY19vcGVuX2FyZ3MgewotCXJwY19sb2NfZXZlbnRfbWFza190eXBlIGV2ZW50X3JlZ19tYXNrOwotCXJwY19sb2NfZXZlbnRfY2JfZl90eXBlIGV2ZW50X2NhbGxiYWNrOwotfTsKLXR5cGVkZWYgc3RydWN0IHJwY19sb2Nfb3Blbl9hcmdzIHJwY19sb2Nfb3Blbl9hcmdzOwotCi1zdHJ1Y3QgcnBjX2xvY19jbG9zZV9hcmdzIHsKLQlycGNfbG9jX2NsaWVudF9oYW5kbGVfdHlwZSBoYW5kbGU7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgcnBjX2xvY19jbG9zZV9hcmdzIHJwY19sb2NfY2xvc2VfYXJnczsKLQotc3RydWN0IHJwY19sb2Nfc3RhcnRfZml4X2FyZ3MgewotCXJwY19sb2NfY2xpZW50X2hhbmRsZV90eXBlIGhhbmRsZTsKLX07Ci10eXBlZGVmIHN0cnVjdCBycGNfbG9jX3N0YXJ0X2ZpeF9hcmdzIHJwY19sb2Nfc3RhcnRfZml4X2FyZ3M7Ci0KLXN0cnVjdCBycGNfbG9jX3N0b3BfZml4X2FyZ3MgewotCXJwY19sb2NfY2xpZW50X2hhbmRsZV90eXBlIGhhbmRsZTsKLX07Ci10eXBlZGVmIHN0cnVjdCBycGNfbG9jX3N0b3BfZml4X2FyZ3MgcnBjX2xvY19zdG9wX2ZpeF9hcmdzOwotCi1zdHJ1Y3QgcnBjX2xvY19pb2N0bF9hcmdzIHsKLQlycGNfbG9jX2NsaWVudF9oYW5kbGVfdHlwZSBoYW5kbGU7Ci0JcnBjX2xvY19pb2N0bF9lX3R5cGUgaW9jdGxfdHlwZTsKLQlycGNfbG9jX2lvY3RsX2RhdGFfdV90eXBlICppb2N0bF9kYXRhOwotfTsKLXR5cGVkZWYgc3RydWN0IHJwY19sb2NfaW9jdGxfYXJncyBycGNfbG9jX2lvY3RsX2FyZ3M7Ci0KLXN0cnVjdCBycGNfbG9jX2FwaV9hcGlfdmVyc2lvbl9zX2FyZ3MgewotCXJwY19ib29sZWFuIGxlbl9ub3RfbnVsbDsKLX07Ci10eXBlZGVmIHN0cnVjdCBycGNfbG9jX2FwaV9hcGlfdmVyc2lvbl9zX2FyZ3MgcnBjX2xvY19hcGlfYXBpX3ZlcnNpb25fc19hcmdzOwotCi1zdHJ1Y3QgcnBjX2xvY19hcGlfcnBjX2dsdWVfY29kZV9pbmZvX3JlbW90ZV9yZXRzIHsKLQlycGNfdWludDMyIHRvb2x2ZXJzOwotCXJwY191aW50MzIgZmVhdHVyZXM7Ci0JcnBjX3VpbnQzMiBwcm9naGFzaDsKLQlycGNfdWludDMyIGNicHJvZ2hhc2g7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgcnBjX2xvY19hcGlfcnBjX2dsdWVfY29kZV9pbmZvX3JlbW90ZV9yZXRzIHJwY19sb2NfYXBpX3JwY19nbHVlX2NvZGVfaW5mb19yZW1vdGVfcmV0czsKLQotc3RydWN0IHJwY19sb2Nfb3Blbl9yZXRzIHsKLQlycGNfbG9jX2NsaWVudF9oYW5kbGVfdHlwZSBsb2Nfb3Blbl9yZXN1bHQ7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgcnBjX2xvY19vcGVuX3JldHMgcnBjX2xvY19vcGVuX3JldHM7Ci0KLXN0cnVjdCBycGNfbG9jX2Nsb3NlX3JldHMgewotCXJwY19pbnQzMiBsb2NfY2xvc2VfcmVzdWx0OwotfTsKLXR5cGVkZWYgc3RydWN0IHJwY19sb2NfY2xvc2VfcmV0cyBycGNfbG9jX2Nsb3NlX3JldHM7Ci0KLXN0cnVjdCBycGNfbG9jX3N0YXJ0X2ZpeF9yZXRzIHsKLQlycGNfaW50MzIgbG9jX3N0YXJ0X2ZpeF9yZXN1bHQ7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgcnBjX2xvY19zdGFydF9maXhfcmV0cyBycGNfbG9jX3N0YXJ0X2ZpeF9yZXRzOwotCi1zdHJ1Y3QgcnBjX2xvY19zdG9wX2ZpeF9yZXRzIHsKLQlycGNfaW50MzIgbG9jX3N0b3BfZml4X3Jlc3VsdDsKLX07Ci10eXBlZGVmIHN0cnVjdCBycGNfbG9jX3N0b3BfZml4X3JldHMgcnBjX2xvY19zdG9wX2ZpeF9yZXRzOwotCi1zdHJ1Y3QgcnBjX2xvY19pb2N0bF9yZXRzIHsKLQlycGNfaW50MzIgbG9jX2lvY3RsX3Jlc3VsdDsKLX07Ci10eXBlZGVmIHN0cnVjdCBycGNfbG9jX2lvY3RsX3JldHMgcnBjX2xvY19pb2N0bF9yZXRzOwotCi1zdHJ1Y3QgcnBjX2xvY19hcGlfYXBpX3ZlcnNpb25zX3JldHMgewotCXJwY19sb2NfYXBpX2FwaV92ZXJzaW9uc19yZXR1cm5fdHlwZSBsb2NfYXBpX2FwaV92ZXJzaW9uc19yZXN1bHQ7Ci0JcnBjX3VpbnQzMiAqbGVuOwotfTsKLXR5cGVkZWYgc3RydWN0IHJwY19sb2NfYXBpX2FwaV92ZXJzaW9uc19yZXRzIHJwY19sb2NfYXBpX2FwaV92ZXJzaW9uc19yZXRzOwotI2RlZmluZSBMT0NfQVBJVkVSUyAweDAwMDQwMDAyCi0KLSNkZWZpbmUgTE9DX0FQSVBST0cgMHgzMDAwMDA4YwotI2RlZmluZSBMT0NfQVBJVkVSU18wMDAxIDB4MDAwNDAwMDEKLQotI2lmIGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoX19jcGx1c3BsdXMpCi0jZGVmaW5lIHJwY19sb2NfYXBpX251bGwgMAotZXh0ZXJuICBlbnVtIGNsbnRfc3RhdCBycGNfbG9jX2FwaV9udWxsXzB4MDAwNDAwMDEodm9pZCAqLCB2b2lkICosIENMSUVOVCAqKTsKLWV4dGVybiAgYm9vbF90IHJwY19sb2NfYXBpX251bGxfMHgwMDA0MDAwMV9zdmModm9pZCAqLCB2b2lkICosIHN0cnVjdCBzdmNfcmVxICopOwotI2RlZmluZSBycGNfbG9jX2FwaV9ycGNfZ2x1ZV9jb2RlX2luZm9fcmVtb3RlIDEKLWV4dGVybiAgZW51bSBjbG50X3N0YXQgcnBjX2xvY19hcGlfcnBjX2dsdWVfY29kZV9pbmZvX3JlbW90ZV8weDAwMDQwMDAxKHZvaWQgKiwgcnBjX2xvY19hcGlfcnBjX2dsdWVfY29kZV9pbmZvX3JlbW90ZV9yZXRzICosIENMSUVOVCAqKTsKLWV4dGVybiAgYm9vbF90IHJwY19sb2NfYXBpX3JwY19nbHVlX2NvZGVfaW5mb19yZW1vdGVfMHgwMDA0MDAwMV9zdmModm9pZCAqLCBycGNfbG9jX2FwaV9ycGNfZ2x1ZV9jb2RlX2luZm9fcmVtb3RlX3JldHMgKiwgc3RydWN0IHN2Y19yZXEgKik7Ci0jZGVmaW5lIHJwY19sb2Nfb3BlbiAyCi1leHRlcm4gIGVudW0gY2xudF9zdGF0IHJwY19sb2Nfb3Blbl8weDAwMDQwMDAxKHJwY19sb2Nfb3Blbl9hcmdzICosIHJwY19sb2Nfb3Blbl9yZXRzICosIENMSUVOVCAqKTsKLWV4dGVybiAgYm9vbF90IHJwY19sb2Nfb3Blbl8weDAwMDQwMDAxX3N2YyhycGNfbG9jX29wZW5fYXJncyAqLCBycGNfbG9jX29wZW5fcmV0cyAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKLSNkZWZpbmUgcnBjX2xvY19jbG9zZSAzCi1leHRlcm4gIGVudW0gY2xudF9zdGF0IHJwY19sb2NfY2xvc2VfMHgwMDA0MDAwMShycGNfbG9jX2Nsb3NlX2FyZ3MgKiwgcnBjX2xvY19jbG9zZV9yZXRzICosIENMSUVOVCAqKTsKLWV4dGVybiAgYm9vbF90IHJwY19sb2NfY2xvc2VfMHgwMDA0MDAwMV9zdmMocnBjX2xvY19jbG9zZV9hcmdzICosIHJwY19sb2NfY2xvc2VfcmV0cyAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKLSNkZWZpbmUgcnBjX2xvY19zdGFydF9maXggNAotZXh0ZXJuICBlbnVtIGNsbnRfc3RhdCBycGNfbG9jX3N0YXJ0X2ZpeF8weDAwMDQwMDAxKHJwY19sb2Nfc3RhcnRfZml4X2FyZ3MgKiwgcnBjX2xvY19zdGFydF9maXhfcmV0cyAqLCBDTElFTlQgKik7Ci1leHRlcm4gIGJvb2xfdCBycGNfbG9jX3N0YXJ0X2ZpeF8weDAwMDQwMDAxX3N2YyhycGNfbG9jX3N0YXJ0X2ZpeF9hcmdzICosIHJwY19sb2Nfc3RhcnRfZml4X3JldHMgKiwgc3RydWN0IHN2Y19yZXEgKik7Ci0jZGVmaW5lIHJwY19sb2Nfc3RvcF9maXggNQotZXh0ZXJuICBlbnVtIGNsbnRfc3RhdCBycGNfbG9jX3N0b3BfZml4XzB4MDAwNDAwMDEocnBjX2xvY19zdG9wX2ZpeF9hcmdzICosIHJwY19sb2Nfc3RvcF9maXhfcmV0cyAqLCBDTElFTlQgKik7Ci1leHRlcm4gIGJvb2xfdCBycGNfbG9jX3N0b3BfZml4XzB4MDAwNDAwMDFfc3ZjKHJwY19sb2Nfc3RvcF9maXhfYXJncyAqLCBycGNfbG9jX3N0b3BfZml4X3JldHMgKiwgc3RydWN0IHN2Y19yZXEgKik7Ci0jZGVmaW5lIHJwY19sb2NfaW9jdGwgNgotZXh0ZXJuICBlbnVtIGNsbnRfc3RhdCBycGNfbG9jX2lvY3RsXzB4MDAwNDAwMDEocnBjX2xvY19pb2N0bF9hcmdzICosIHJwY19sb2NfaW9jdGxfcmV0cyAqLCBDTElFTlQgKik7Ci1leHRlcm4gIGJvb2xfdCBycGNfbG9jX2lvY3RsXzB4MDAwNDAwMDFfc3ZjKHJwY19sb2NfaW9jdGxfYXJncyAqLCBycGNfbG9jX2lvY3RsX3JldHMgKiwgc3RydWN0IHN2Y19yZXEgKik7Ci0jZGVmaW5lIHJwY19sb2NfYXBpX2FwaV92ZXJzaW9ucyAweEZGRkZGRkZGCi1leHRlcm4gIGVudW0gY2xudF9zdGF0IHJwY19sb2NfYXBpX2FwaV92ZXJzaW9uc18weDAwMDQwMDAxKHZvaWQgKiwgcnBjX2xvY19hcGlfYXBpX3ZlcnNpb25zX3JldHMgKiwgQ0xJRU5UICopOwotZXh0ZXJuICBib29sX3QgcnBjX2xvY19hcGlfYXBpX3ZlcnNpb25zXzB4MDAwNDAwMDFfc3ZjKHZvaWQgKiwgcnBjX2xvY19hcGlfYXBpX3ZlcnNpb25zX3JldHMgKiwgc3RydWN0IHN2Y19yZXEgKik7Ci1leHRlcm4gaW50IGxvY19hcGlwcm9nXzB4MDAwNDAwMDFfZnJlZXJlc3VsdCAoU1ZDWFBSVCAqLCB4ZHJwcm9jX3QsIGNhZGRyX3QpOwotCi0jZWxzZSAvKiBLJlIgQyAqLwotI2RlZmluZSBycGNfbG9jX2FwaV9udWxsIDAKLWV4dGVybiAgZW51bSBjbG50X3N0YXQgcnBjX2xvY19hcGlfbnVsbF8weDAwMDQwMDAxKCk7Ci1leHRlcm4gIGJvb2xfdCBycGNfbG9jX2FwaV9udWxsXzB4MDAwNDAwMDFfc3ZjKCk7Ci0jZGVmaW5lIHJwY19sb2NfYXBpX3JwY19nbHVlX2NvZGVfaW5mb19yZW1vdGUgMQotZXh0ZXJuICBlbnVtIGNsbnRfc3RhdCBycGNfbG9jX2FwaV9ycGNfZ2x1ZV9jb2RlX2luZm9fcmVtb3RlXzB4MDAwNDAwMDEoKTsKLWV4dGVybiAgYm9vbF90IHJwY19sb2NfYXBpX3JwY19nbHVlX2NvZGVfaW5mb19yZW1vdGVfMHgwMDA0MDAwMV9zdmMoKTsKLSNkZWZpbmUgcnBjX2xvY19vcGVuIDIKLWV4dGVybiAgZW51bSBjbG50X3N0YXQgcnBjX2xvY19vcGVuXzB4MDAwNDAwMDEoKTsKLWV4dGVybiAgYm9vbF90IHJwY19sb2Nfb3Blbl8weDAwMDQwMDAxX3N2YygpOwotI2RlZmluZSBycGNfbG9jX2Nsb3NlIDMKLWV4dGVybiAgZW51bSBjbG50X3N0YXQgcnBjX2xvY19jbG9zZV8weDAwMDQwMDAxKCk7Ci1leHRlcm4gIGJvb2xfdCBycGNfbG9jX2Nsb3NlXzB4MDAwNDAwMDFfc3ZjKCk7Ci0jZGVmaW5lIHJwY19sb2Nfc3RhcnRfZml4IDQKLWV4dGVybiAgZW51bSBjbG50X3N0YXQgcnBjX2xvY19zdGFydF9maXhfMHgwMDA0MDAwMSgpOwotZXh0ZXJuICBib29sX3QgcnBjX2xvY19zdGFydF9maXhfMHgwMDA0MDAwMV9zdmMoKTsKLSNkZWZpbmUgcnBjX2xvY19zdG9wX2ZpeCA1Ci1leHRlcm4gIGVudW0gY2xudF9zdGF0IHJwY19sb2Nfc3RvcF9maXhfMHgwMDA0MDAwMSgpOwotZXh0ZXJuICBib29sX3QgcnBjX2xvY19zdG9wX2ZpeF8weDAwMDQwMDAxX3N2YygpOwotI2RlZmluZSBycGNfbG9jX2lvY3RsIDYKLWV4dGVybiAgZW51bSBjbG50X3N0YXQgcnBjX2xvY19pb2N0bF8weDAwMDQwMDAxKCk7Ci1leHRlcm4gIGJvb2xfdCBycGNfbG9jX2lvY3RsXzB4MDAwNDAwMDFfc3ZjKCk7Ci0jZGVmaW5lIHJwY19sb2NfYXBpX2FwaV92ZXJzaW9ucyAweEZGRkZGRkZGCi1leHRlcm4gIGVudW0gY2xudF9zdGF0IHJwY19sb2NfYXBpX2FwaV92ZXJzaW9uc18weDAwMDQwMDAxKCk7Ci1leHRlcm4gIGJvb2xfdCBycGNfbG9jX2FwaV9hcGlfdmVyc2lvbnNfMHgwMDA0MDAwMV9zdmMoKTsKLWV4dGVybiBpbnQgbG9jX2FwaXByb2dfMHgwMDA0MDAwMV9mcmVlcmVzdWx0ICgpOwotI2VuZGlmIC8qIEsmUiBDICovCi0jZGVmaW5lIExPQ19BUElWRVJTXzAwMDIgMHgwMDA0MDAwMgotCi0jaWYgZGVmaW5lZChfX1NURENfXykgfHwgZGVmaW5lZChfX2NwbHVzcGx1cykKLWV4dGVybiAgZW51bSBjbG50X3N0YXQgcnBjX2xvY19hcGlfbnVsbF8weDAwMDQwMDAyKHZvaWQgKiwgdm9pZCAqLCBDTElFTlQgKik7Ci1leHRlcm4gIGJvb2xfdCBycGNfbG9jX2FwaV9udWxsXzB4MDAwNDAwMDJfc3ZjKHZvaWQgKiwgdm9pZCAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKLWV4dGVybiBpbnQgbG9jX2FwaXByb2dfMHgwMDA0MDAwMl9mcmVlcmVzdWx0IChTVkNYUFJUICosIHhkcnByb2NfdCwgY2FkZHJfdCk7Ci0KLSNlbHNlIC8qIEsmUiBDICovCi1leHRlcm4gIGVudW0gY2xudF9zdGF0IHJwY19sb2NfYXBpX251bGxfMHgwMDA0MDAwMigpOwotZXh0ZXJuICBib29sX3QgcnBjX2xvY19hcGlfbnVsbF8weDAwMDQwMDAyX3N2YygpOwotZXh0ZXJuIGludCBsb2NfYXBpcHJvZ18weDAwMDQwMDAyX2ZyZWVyZXN1bHQgKCk7Ci0jZW5kaWYgLyogSyZSIEMgKi8KLQotLyogdGhlIHhkciBmdW5jdGlvbnMgKi8KLQotI2lmIGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoX19jcGx1c3BsdXMpCi1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19hcGlfYXBpX3ZlcnNpb25zX3JldHVybl90eXBlIChYRFIgKiwgcnBjX2xvY19hcGlfYXBpX3ZlcnNpb25zX3JldHVybl90eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19ldmVudF9jYl9mX3R5cGUgKFhEUiAqLCBycGNfbG9jX2V2ZW50X2NiX2ZfdHlwZSopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2Nfb3Blbl9hcmdzIChYRFIgKiwgcnBjX2xvY19vcGVuX2FyZ3MqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX2Nsb3NlX2FyZ3MgKFhEUiAqLCBycGNfbG9jX2Nsb3NlX2FyZ3MqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX3N0YXJ0X2ZpeF9hcmdzIChYRFIgKiwgcnBjX2xvY19zdGFydF9maXhfYXJncyopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2Nfc3RvcF9maXhfYXJncyAoWERSICosIHJwY19sb2Nfc3RvcF9maXhfYXJncyopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2NfaW9jdGxfYXJncyAoWERSICosIHJwY19sb2NfaW9jdGxfYXJncyopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2NfYXBpX2FwaV92ZXJzaW9uX3NfYXJncyAoWERSICosIHJwY19sb2NfYXBpX2FwaV92ZXJzaW9uX3NfYXJncyopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2NfYXBpX3JwY19nbHVlX2NvZGVfaW5mb19yZW1vdGVfcmV0cyAoWERSICosIHJwY19sb2NfYXBpX3JwY19nbHVlX2NvZGVfaW5mb19yZW1vdGVfcmV0cyopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2Nfb3Blbl9yZXRzIChYRFIgKiwgcnBjX2xvY19vcGVuX3JldHMqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX2Nsb3NlX3JldHMgKFhEUiAqLCBycGNfbG9jX2Nsb3NlX3JldHMqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX3N0YXJ0X2ZpeF9yZXRzIChYRFIgKiwgcnBjX2xvY19zdGFydF9maXhfcmV0cyopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2Nfc3RvcF9maXhfcmV0cyAoWERSICosIHJwY19sb2Nfc3RvcF9maXhfcmV0cyopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2NfaW9jdGxfcmV0cyAoWERSICosIHJwY19sb2NfaW9jdGxfcmV0cyopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2NfYXBpX2FwaV92ZXJzaW9uc19yZXRzIChYRFIgKiwgcnBjX2xvY19hcGlfYXBpX3ZlcnNpb25zX3JldHMqKTsKLQotI2Vsc2UgLyogSyZSIEMgKi8KLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2NfYXBpX2FwaV92ZXJzaW9uc19yZXR1cm5fdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2NfZXZlbnRfY2JfZl90eXBlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19vcGVuX2FyZ3MgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX2Nsb3NlX2FyZ3MgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX3N0YXJ0X2ZpeF9hcmdzICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19zdG9wX2ZpeF9hcmdzICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19pb2N0bF9hcmdzICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19hcGlfYXBpX3ZlcnNpb25fc19hcmdzICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19hcGlfcnBjX2dsdWVfY29kZV9pbmZvX3JlbW90ZV9yZXRzICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19vcGVuX3JldHMgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX2Nsb3NlX3JldHMgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX3N0YXJ0X2ZpeF9yZXRzICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19zdG9wX2ZpeF9yZXRzICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19pb2N0bF9yZXRzICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19hcGlfYXBpX3ZlcnNpb25zX3JldHMgKCk7Ci0KLSNlbmRpZiAvKiBLJlIgQyAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYgLyogIV9MT0NfQVBJX0hfUlBDR0VOICovCmRpZmYgLS1naXQgYS9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaS1ycGMvaW5jLTEyNDAvbG9jX2FwaV9jYi5oIGIvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGktcnBjL2luYy0xMjQwL2xvY19hcGlfY2IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdhYzA4NC4uMDAwMDAwMAotLS0gYS9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaS1ycGMvaW5jLTEyNDAvbG9jX2FwaV9jYi5oCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoKLSAqIFBsZWFzZSBkbyBub3QgZWRpdCB0aGlzIGZpbGUuCi0gKiBJdCB3YXMgZ2VuZXJhdGVkIHVzaW5nIHJwY2dlbi4KLSAqLwotCi0jaWZuZGVmIF9MT0NfQVBJX0NCX0hfUlBDR0VOCi0jZGVmaW5lIF9MT0NfQVBJX0NCX0hfUlBDR0VOCi0KLSNpbmNsdWRlIDxycGMvcnBjLmg+Ci0KLSNpbmNsdWRlIDxwdGhyZWFkLmg+Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotCi1zdHJ1Y3QgcnBjX2xvY19ldmVudF9jYl9mX3R5cGVfYXJncyB7Ci0JcnBjX3VpbnQzMiBjYl9pZDsKLQlycGNfbG9jX2NsaWVudF9oYW5kbGVfdHlwZSBsb2NfaGFuZGxlOwotCXJwY19sb2NfZXZlbnRfbWFza190eXBlIGxvY19ldmVudDsKLQlycGNfbG9jX2V2ZW50X3BheWxvYWRfdV90eXBlICpsb2NfZXZlbnRfcGF5bG9hZDsKLX07Ci10eXBlZGVmIHN0cnVjdCBycGNfbG9jX2V2ZW50X2NiX2ZfdHlwZV9hcmdzIHJwY19sb2NfZXZlbnRfY2JfZl90eXBlX2FyZ3M7Ci0KLXN0cnVjdCBycGNfbG9jX2V2ZW50X2NiX2ZfdHlwZV9yZXRzIHsKLQlycGNfaW50MzIgbG9jX2V2ZW50X2NiX2ZfdHlwZV9yZXN1bHQ7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgcnBjX2xvY19ldmVudF9jYl9mX3R5cGVfcmV0cyBycGNfbG9jX2V2ZW50X2NiX2ZfdHlwZV9yZXRzOwotI2RlZmluZSBMT0NfQVBJQ0JWRVJTIDB4MDAwNDAwMDIKLQotI2RlZmluZSBMT0NfQVBJQ0JQUk9HIDB4MzEwMDAwOGMKLSNkZWZpbmUgTE9DX0FQSUNCVkVSU18wMDAxIDB4MDAwNDAwMDEKLQotI2lmIGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoX19jcGx1c3BsdXMpCi0jZGVmaW5lIHJwY19sb2NfZXZlbnRfY2JfZl90eXBlIDEKLWV4dGVybiAgZW51bSBjbG50X3N0YXQgcnBjX2xvY19ldmVudF9jYl9mX3R5cGVfMHgwMDA0MDAwMShycGNfbG9jX2V2ZW50X2NiX2ZfdHlwZV9hcmdzICosIHJwY19sb2NfZXZlbnRfY2JfZl90eXBlX3JldHMgKiwgQ0xJRU5UICopOwotZXh0ZXJuICBib29sX3QgcnBjX2xvY19ldmVudF9jYl9mX3R5cGVfMHgwMDA0MDAwMV9zdmMocnBjX2xvY19ldmVudF9jYl9mX3R5cGVfYXJncyAqLCBycGNfbG9jX2V2ZW50X2NiX2ZfdHlwZV9yZXRzICosIHN0cnVjdCBzdmNfcmVxICopOwotZXh0ZXJuIGludCBsb2NfYXBpY2Jwcm9nXzB4MDAwNDAwMDFfZnJlZXJlc3VsdCAoU1ZDWFBSVCAqLCB4ZHJwcm9jX3QsIGNhZGRyX3QpOwotCi0jZWxzZSAvKiBLJlIgQyAqLwotI2RlZmluZSBycGNfbG9jX2V2ZW50X2NiX2ZfdHlwZSAxCi1leHRlcm4gIGVudW0gY2xudF9zdGF0IHJwY19sb2NfZXZlbnRfY2JfZl90eXBlXzB4MDAwNDAwMDEoKTsKLWV4dGVybiAgYm9vbF90IHJwY19sb2NfZXZlbnRfY2JfZl90eXBlXzB4MDAwNDAwMDFfc3ZjKCk7Ci1leHRlcm4gaW50IGxvY19hcGljYnByb2dfMHgwMDA0MDAwMV9mcmVlcmVzdWx0ICgpOwotI2VuZGlmIC8qIEsmUiBDICovCi0KLS8qIHRoZSB4ZHIgZnVuY3Rpb25zICovCi0KLSNpZiBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKF9fY3BsdXNwbHVzKQotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2NfZXZlbnRfY2JfZl90eXBlX2FyZ3MgKFhEUiAqLCBycGNfbG9jX2V2ZW50X2NiX2ZfdHlwZV9hcmdzKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19ldmVudF9jYl9mX3R5cGVfcmV0cyAoWERSICosIHJwY19sb2NfZXZlbnRfY2JfZl90eXBlX3JldHMqKTsKLQotI2Vsc2UgLyogSyZSIEMgKi8KLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2NfZXZlbnRfY2JfZl90eXBlX2FyZ3MgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX2V2ZW50X2NiX2ZfdHlwZV9yZXRzICgpOwotCi0jZW5kaWYgLyogSyZSIEMgKi8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmIC8qICFfTE9DX0FQSV9DQl9IX1JQQ0dFTiAqLwpkaWZmIC0tZ2l0IGEvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGktcnBjL2luYy0xMjQwL2xvY19hcGlfY29tbW9uLmggYi9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaS1ycGMvaW5jLTEyNDAvbG9jX2FwaV9jb21tb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZmM2JhZi4uMDAwMDAwMAotLS0gYS9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaS1ycGMvaW5jLTEyNDAvbG9jX2FwaV9jb21tb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDExNTQgKzAsMCBAQAotLyoKLSAqIFBsZWFzZSBkbyBub3QgZWRpdCB0aGlzIGZpbGUuCi0gKiBJdCB3YXMgZ2VuZXJhdGVkIHVzaW5nIHJwY2dlbi4KLSAqLwotCi0jaWZuZGVmIF9MT0NfQVBJX0NPTU1PTl9IX1JQQ0dFTgotI2RlZmluZSBfTE9DX0FQSV9DT01NT05fSF9SUENHRU4KLQotI2luY2x1ZGUgPHJwYy9ycGMuaD4KLSNpbmNsdWRlICJsb2NfYXBpX2ZpeHVwLmgiCi0KLSNpbmNsdWRlIDxwdGhyZWFkLmg+Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotI2RlZmluZSBMT0NfQVBJX1RPT0xWRVJTIDB4MDAwNDAwMjQKLSNkZWZpbmUgTE9DX0FQSV9GRUFUVVJFUyAweDAwMDAwMDAxCi0jZGVmaW5lIFJQQ19MT0NfRVZFTlRfTklfTk9USUZZX1ZFUklGWV9SRVFVRVNUIDB4MDAwMDAwMTAKLSNkZWZpbmUgUlBDX0xPQ19FVkVOVF9XUFNfTkVFREVEX1JFUVVFU1QgMHgwMDAwMDIwMAotI2RlZmluZSBSUENfTE9DX0VWRU5UX0lPQ1RMX1JFUE9SVCAweDAwMDAwMDgwCi0jZGVmaW5lIFJQQ19MT0NfRVZFTlRfTE9DQVRJT05fU0VSVkVSX1JFUVVFU1QgMHgwMDAwMDA0MAotI2RlZmluZSBSUENfTE9DX0VWRU5UX1JFU0VSVkVEIDB4ODAwMDAwMDAwMDAwMDAwMAotI2RlZmluZSBSUENfTE9DX0VWRU5UX1BBUlNFRF9QT1NJVElPTl9SRVBPUlQgMHgwMDAwMDAwMQotI2RlZmluZSBSUENfTE9DX0VWRU5UX0FTU0lTVEFOQ0VfREFUQV9SRVFVRVNUIDB4MDAwMDAwMjAKLSNkZWZpbmUgUlBDX0xPQ19FVkVOVF9OTUVBX1BPU0lUSU9OX1JFUE9SVCAweDAwMDAwMDA4Ci0jZGVmaW5lIFJQQ19MT0NfRVZFTlRfU0FURUxMSVRFX1JFUE9SVCAweDAwMDAwMDAyCi0jZGVmaW5lIFJQQ19MT0NfRVZFTlRfU1RBVFVTX1JFUE9SVCAweDAwMDAwMTAwCi0jZGVmaW5lIFJQQ19MT0NfRVZFTlRfQ0JfRl9UWVBFX1ZFUlNJT04gMHgwMDA0MDAwMQotI2RlZmluZSBSUENfTE9DX09QRU5fVkVSU0lPTiAweDAwMDQwMDAxCi0jZGVmaW5lIFJQQ19MT0NfQVBJX1JQQ19HTFVFX0NPREVfSU5GT19SRU1PVEVfVkVSU0lPTiAweDAwMDQwMDAxCi0jZGVmaW5lIFJQQ19MT0NfQVBJX05VTExfVkVSU0lPTiAweDAwMDQwMDAxCi0jZGVmaW5lIFJQQ19MT0NfU1RPUF9GSVhfVkVSU0lPTiAweDAwMDQwMDAxCi0jZGVmaW5lIFJQQ19MT0NfSU9DVExfVkVSU0lPTiAweDAwMDQwMDAxCi0jZGVmaW5lIFJQQ19MT0NfU1RBUlRfRklYX1ZFUlNJT04gMHgwMDA0MDAwMQotI2RlZmluZSBSUENfTE9DX0NMT1NFX1ZFUlNJT04gMHgwMDA0MDAwMQotI2RlZmluZSBSUENfTE9DX0FQSV9BUElfVkVSU0lPTlNfVkVSU0lPTiAweDAwMDQwMDAxCi0jZGVmaW5lIFJQQ19MT0NfQVBJX0FQSV9NQUpPUl9OVU0gMHgwMDA0Ci0jZGVmaW5lIFJQQ19MT0NfQVBJQVBJX1ZFUlNJT05fSVNfSEFTSEtFWSAwCi0KLXR5cGVkZWYgYm9vbF90IHJwY19ib29sZWFuOwotCi10eXBlZGVmIHVfbG9uZyBycGNfdWludDMyOwotCi10eXBlZGVmIHVfc2hvcnQgcnBjX3VpbnQxNjsKLQotdHlwZWRlZiB1X2NoYXIgcnBjX3VpbnQ4OwotCi10eXBlZGVmIGxvbmcgcnBjX2ludDMyOwotCi10eXBlZGVmIHVfY2hhciBycGNfYnl0ZTsKLQotdHlwZWRlZiB1X3F1YWRfdCBycGNfdWludDY0OwotCi10eXBlZGVmIHJwY19pbnQzMiBycGNfbG9jX2NsaWVudF9oYW5kbGVfdHlwZTsKLQotdHlwZWRlZiBycGNfdWludDY0IHJwY19sb2NfZXZlbnRfbWFza190eXBlOwotCi10eXBlZGVmIHJwY191aW50NjQgcnBjX2xvY19wb3NpdGlvbl92YWxpZF9tYXNrX3R5cGU7Ci0KLXR5cGVkZWYgcnBjX3VpbnQzMiBycGNfbG9jX3Bvc190ZWNobm9sb2d5X21hc2tfdHlwZTsKLQotZW51bSBycGNfbG9jX3Nlc3Npb25fc3RhdHVzX2VfdHlwZSB7Ci0JUlBDX0xPQ19TRVNTX1NUQVRVU19TVUNDRVNTID0gMCwKLQlSUENfTE9DX1NFU1NfU1RBVFVTX0lOX1BST0dFU1MgPSAxLAotCVJQQ19MT0NfU0VTU19TVEFUVVNfR0VORVJBTF9GQUlMVVJFID0gMiwKLQlSUENfTE9DX1NFU1NfU1RBVFVTX1RJTUVPVVQgPSAzLAotCVJQQ19MT0NfU0VTU19TVEFUVVNfVVNFUl9FTkQgPSA0LAotCVJQQ19MT0NfU0VTU19TVEFUVVNfQkFEX1BBUkFNRVRFUiA9IDUsCi0JUlBDX0xPQ19TRVNTX1NUQVRVU19QSE9ORV9PRkZMSU5FID0gNiwKLQlSUENfTE9DX1NFU1NfU1RBVFVTX0VOR0lORV9MT0NLRUQgPSA3LAotCVJQQ19MT0NfU0VTU19TVEFUVVNfTUFYID0gMjY4NDM1NDU2LAotfTsKLXR5cGVkZWYgZW51bSBycGNfbG9jX3Nlc3Npb25fc3RhdHVzX2VfdHlwZSBycGNfbG9jX3Nlc3Npb25fc3RhdHVzX2VfdHlwZTsKLQotc3RydWN0IHJwY19sb2NfY2FsZW5kYXJfdGltZV9zX3R5cGUgewotCXJwY191aW50MTYgeWVhcjsKLQl1X2NoYXIgbW9udGg7Ci0JdV9jaGFyIGRheV9vZl93ZWVrOwotCXVfY2hhciBkYXk7Ci0JdV9jaGFyIGhvdXI7Ci0JdV9jaGFyIG1pbnV0ZTsKLQl1X2NoYXIgc2Vjb25kOwotCXJwY191aW50MTYgbWlsbGlzZWNvbmQ7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgcnBjX2xvY19jYWxlbmRhcl90aW1lX3NfdHlwZSBycGNfbG9jX2NhbGVuZGFyX3RpbWVfc190eXBlOwotCi1zdHJ1Y3QgcnBjX2xvY19wYXJzZWRfcG9zaXRpb25fc190eXBlIHsKLQlycGNfbG9jX3Bvc2l0aW9uX3ZhbGlkX21hc2tfdHlwZSB2YWxpZF9tYXNrOwotCXJwY19sb2Nfc2Vzc2lvbl9zdGF0dXNfZV90eXBlIHNlc3Npb25fc3RhdHVzOwotCXJwY19sb2NfY2FsZW5kYXJfdGltZV9zX3R5cGUgdGltZXN0YW1wX2NhbGVuZGFyOwotCXJwY191aW50NjQgdGltZXN0YW1wX3V0YzsKLQlycGNfdWludDggbGVhcF9zZWNvbmRzOwotCWZsb2F0IHRpbWVfdW5jOwotCWRvdWJsZSBsYXRpdHVkZTsKLQlkb3VibGUgbG9uZ2l0dWRlOwotCWZsb2F0IGFsdGl0dWRlX3dydF9lbGxpcHNvaWQ7Ci0JZmxvYXQgYWx0aXR1ZGVfd3J0X21lYW5fc2VhX2xldmVsOwotCWZsb2F0IHNwZWVkX2hvcml6b250YWw7Ci0JZmxvYXQgc3BlZWRfdmVydGljYWw7Ci0JZmxvYXQgaGVhZGluZzsKLQlmbG9hdCBob3JfdW5jX2NpcmN1bGFyOwotCWZsb2F0IGhvcl91bmNfZWxsaXBzZV9zZW1pX21ham9yOwotCWZsb2F0IGhvcl91bmNfZWxsaXBzZV9zZW1pX21pbm9yOwotCWZsb2F0IGhvcl91bmNfZWxsaXBzZV9vcmllbnRfYXppbXV0aDsKLQlmbG9hdCB2ZXJ0X3VuYzsKLQlmbG9hdCBzcGVlZF91bmM7Ci0JZmxvYXQgaGVhZGluZ191bmM7Ci0JdV9jaGFyIGNvbmZpZGVuY2VfaG9yaXpvbnRhbDsKLQl1X2NoYXIgY29uZmlkZW5jZV92ZXJ0aWNhbDsKLQlmbG9hdCBtYWduZXRpY19kZXZpYXRpb247Ci0JcnBjX2xvY19wb3NfdGVjaG5vbG9neV9tYXNrX3R5cGUgdGVjaG5vbG9neV9tYXNrOwotfTsKLXR5cGVkZWYgc3RydWN0IHJwY19sb2NfcGFyc2VkX3Bvc2l0aW9uX3NfdHlwZSBycGNfbG9jX3BhcnNlZF9wb3NpdGlvbl9zX3R5cGU7Ci0KLWVudW0gcnBjX2xvY19zdl9zeXN0ZW1fZV90eXBlIHsKLQlSUENfTE9DX1NWX1NZU1RFTV9HUFMgPSAxLAotCVJQQ19MT0NfU1ZfU1lTVEVNX0dBTElMRU8gPSAyLAotCVJQQ19MT0NfU1ZfU1lTVEVNX1NCQVMgPSAzLAotCVJQQ19MT0NfU1ZfU1lTVEVNX0NPTVBBU1MgPSA0LAotCVJQQ19MT0NfU1ZfU1lTVEVNX0dMT05BU1MgPSA1LAotCVJQQ19MT0NfU1ZfU1lTVEVNX01BWCA9IDI2ODQzNTQ1NiwKLX07Ci10eXBlZGVmIGVudW0gcnBjX2xvY19zdl9zeXN0ZW1fZV90eXBlIHJwY19sb2Nfc3Zfc3lzdGVtX2VfdHlwZTsKLQotZW51bSBycGNfbG9jX3N2X3N0YXR1c19lX3R5cGUgewotCVJQQ19MT0NfU1ZfU1RBVFVTX0lETEUgPSAxLAotCVJQQ19MT0NfU1ZfU1RBVFVTX1NFQVJDSCA9IDIsCi0JUlBDX0xPQ19TVl9TVEFUVVNfVFJBQ0sgPSAzLAotCVJQQ19MT0NfU1ZfU1RBVFVTX01BWCA9IDI2ODQzNTQ1NiwKLX07Ci10eXBlZGVmIGVudW0gcnBjX2xvY19zdl9zdGF0dXNfZV90eXBlIHJwY19sb2Nfc3Zfc3RhdHVzX2VfdHlwZTsKLQotdHlwZWRlZiBycGNfdWludDMyIHJwY19sb2Nfc3ZfaW5mb192YWxpZF9tYXNrX3R5cGU7Ci0KLXN0cnVjdCBycGNfbG9jX3N2X2luZm9fc190eXBlIHsKLQlycGNfbG9jX3N2X2luZm9fdmFsaWRfbWFza190eXBlIHZhbGlkX21hc2s7Ci0JcnBjX2xvY19zdl9zeXN0ZW1fZV90eXBlIHN5c3RlbTsKLQlycGNfdWludDggcHJuOwotCXJwY191aW50OCBoZWFsdGhfc3RhdHVzOwotCXJwY19sb2Nfc3Zfc3RhdHVzX2VfdHlwZSBwcm9jZXNzX3N0YXR1czsKLQlycGNfYm9vbGVhbiBoYXNfZXBoOwotCXJwY19ib29sZWFuIGhhc19hbG07Ci0JZmxvYXQgZWxldmF0aW9uOwotCWZsb2F0IGF6aW11dGg7Ci0JZmxvYXQgc25yOwotfTsKLXR5cGVkZWYgc3RydWN0IHJwY19sb2Nfc3ZfaW5mb19zX3R5cGUgcnBjX2xvY19zdl9pbmZvX3NfdHlwZTsKLQotdHlwZWRlZiBycGNfdWludDMyIHJwY19sb2NfZ25zc19pbmZvX3ZhbGlkX21hc2tfdHlwZTsKLQotc3RydWN0IHJwY19sb2NfZ25zc19pbmZvX3NfdHlwZSB7Ci0JcnBjX2xvY19nbnNzX2luZm9fdmFsaWRfbWFza190eXBlIHZhbGlkX21hc2s7Ci0JZmxvYXQgcG9zaXRpb25fZG9wOwotCWZsb2F0IGhvcml6b250YWxfZG9wOwotCWZsb2F0IHZlcnRpY2FsX2RvcDsKLQlycGNfYm9vbGVhbiBhbHRpdHVkZV9hc3N1bWVkOwotCXJwY191aW50MTYgc3ZfY291bnQ7Ci0Jc3RydWN0IHsKLQkJdV9pbnQgc3ZfbGlzdF9sZW47Ci0JCXJwY19sb2Nfc3ZfaW5mb19zX3R5cGUgKnN2X2xpc3RfdmFsOwotCX0gc3ZfbGlzdDsKLX07Ci10eXBlZGVmIHN0cnVjdCBycGNfbG9jX2duc3NfaW5mb19zX3R5cGUgcnBjX2xvY19nbnNzX2luZm9fc190eXBlOwotCi1zdHJ1Y3QgcnBjX2xvY19ubWVhX3JlcG9ydF9zX3R5cGUgewotCXJwY191aW50MTYgbGVuZ3RoOwotCWNoYXIgbm1lYV9zZW50ZW5jZXNbMTIwMF07Ci19OwotdHlwZWRlZiBzdHJ1Y3QgcnBjX2xvY19ubWVhX3JlcG9ydF9zX3R5cGUgcnBjX2xvY19ubWVhX3JlcG9ydF9zX3R5cGU7Ci0KLWVudW0gcnBjX2xvY19zdGF0dXNfZXZlbnRfZV90eXBlIHsKLQlSUENfTE9DX1NUQVRVU19FVkVOVF9FTkdJTkVfU1RBVEUgPSAxLAotCVJQQ19MT0NfU1RBVFVTX0VWRU5UX0ZJWF9TRVNTSU9OX1NUQVRFID0gMiwKLQlSUENfTE9DX1NUQVRVU19FVkVOVF9NQVggPSAyNjg0MzU0NTYsCi19OwotdHlwZWRlZiBlbnVtIHJwY19sb2Nfc3RhdHVzX2V2ZW50X2VfdHlwZSBycGNfbG9jX3N0YXR1c19ldmVudF9lX3R5cGU7Ci0KLWVudW0gcnBjX2xvY19lbmdpbmVfc3RhdGVfZV90eXBlIHsKLQlSUENfTE9DX0VOR0lORV9TVEFURV9PTiA9IDEsCi0JUlBDX0xPQ19FTkdJTkVfU1RBVEVfT0ZGID0gMiwKLQlSUENfTE9DX0VOR0lORV9TVEFURV9NQVggPSAyNjg0MzU0NTYsCi19OwotdHlwZWRlZiBlbnVtIHJwY19sb2NfZW5naW5lX3N0YXRlX2VfdHlwZSBycGNfbG9jX2VuZ2luZV9zdGF0ZV9lX3R5cGU7Ci0KLWVudW0gcnBjX2xvY19maXhfc2Vzc2lvbl9zdGF0ZV9lX3R5cGUgewotCVJQQ19MT0NfRklYX1NFU1NJT05fU1RBVEVfQkVHSU4gPSAxLAotCVJQQ19MT0NfRklYX1NFU1NJT05fU1RBVEVfRU5EID0gMiwKLQlSUENfTE9DX0ZJWF9TRVNTSU9OX1NUQVRFX01BWCA9IDI2ODQzNTQ1NiwKLX07Ci10eXBlZGVmIGVudW0gcnBjX2xvY19maXhfc2Vzc2lvbl9zdGF0ZV9lX3R5cGUgcnBjX2xvY19maXhfc2Vzc2lvbl9zdGF0ZV9lX3R5cGU7Ci0KLXN0cnVjdCBycGNfbG9jX3N0YXR1c19ldmVudF9wYXlsb2FkX3VfdHlwZSB7Ci0JcnBjX2xvY19zdGF0dXNfZXZlbnRfZV90eXBlIGRpc2M7Ci0JdW5pb24gewotCQlycGNfbG9jX2VuZ2luZV9zdGF0ZV9lX3R5cGUgZW5naW5lX3N0YXRlOwotCQlycGNfbG9jX2ZpeF9zZXNzaW9uX3N0YXRlX2VfdHlwZSBmaXhfc2Vzc2lvbl9zdGF0ZTsKLQl9IHJwY19sb2Nfc3RhdHVzX2V2ZW50X3BheWxvYWRfdV90eXBlX3U7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgcnBjX2xvY19zdGF0dXNfZXZlbnRfcGF5bG9hZF91X3R5cGUgcnBjX2xvY19zdGF0dXNfZXZlbnRfcGF5bG9hZF91X3R5cGU7Ci0KLXN0cnVjdCBycGNfbG9jX3N0YXR1c19ldmVudF9zX3R5cGUgewotCXJwY19sb2Nfc3RhdHVzX2V2ZW50X2VfdHlwZSBldmVudDsKLQlycGNfbG9jX3N0YXR1c19ldmVudF9wYXlsb2FkX3VfdHlwZSBwYXlsb2FkOwotfTsKLXR5cGVkZWYgc3RydWN0IHJwY19sb2Nfc3RhdHVzX2V2ZW50X3NfdHlwZSBycGNfbG9jX3N0YXR1c19ldmVudF9zX3R5cGU7Ci0KLWVudW0gcnBjX2xvY19zZXJ2ZXJfYWRkcl9lX3R5cGUgewotCVJQQ19MT0NfU0VSVkVSX0FERFJfSVBWNCA9IDEsCi0JUlBDX0xPQ19TRVJWRVJfQUREUl9VUkwgPSAyLAotCVJQQ19MT0NfU0VSVkVSX0FERFJfTUFYID0gMjY4NDM1NDU2LAotfTsKLXR5cGVkZWYgZW51bSBycGNfbG9jX3NlcnZlcl9hZGRyX2VfdHlwZSBycGNfbG9jX3NlcnZlcl9hZGRyX2VfdHlwZTsKLQotc3RydWN0IHJwY19sb2Nfc2VydmVyX2FkZHJfaXB2NF90eXBlIHsKLQlycGNfdWludDMyIGFkZHI7Ci0JcnBjX3VpbnQxNiBwb3J0OwotfTsKLXR5cGVkZWYgc3RydWN0IHJwY19sb2Nfc2VydmVyX2FkZHJfaXB2NF90eXBlIHJwY19sb2Nfc2VydmVyX2FkZHJfaXB2NF90eXBlOwotCi1zdHJ1Y3QgcnBjX2xvY19zZXJ2ZXJfYWRkcl91cmxfdHlwZSB7Ci0JcnBjX3VpbnQxNiBsZW5ndGg7Ci0JY2hhciBhZGRyWzI1Nl07Ci19OwotdHlwZWRlZiBzdHJ1Y3QgcnBjX2xvY19zZXJ2ZXJfYWRkcl91cmxfdHlwZSBycGNfbG9jX3NlcnZlcl9hZGRyX3VybF90eXBlOwotCi1zdHJ1Y3QgcnBjX2xvY19zZXJ2ZXJfYWRkcl91X3R5cGUgewotCXJwY19sb2Nfc2VydmVyX2FkZHJfZV90eXBlIGRpc2M7Ci0JdW5pb24gewotCQlycGNfbG9jX3NlcnZlcl9hZGRyX2lwdjRfdHlwZSBpcHY0OwotCQlycGNfbG9jX3NlcnZlcl9hZGRyX3VybF90eXBlIHVybDsKLQl9IHJwY19sb2Nfc2VydmVyX2FkZHJfdV90eXBlX3U7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgcnBjX2xvY19zZXJ2ZXJfYWRkcl91X3R5cGUgcnBjX2xvY19zZXJ2ZXJfYWRkcl91X3R5cGU7Ci0KLXN0cnVjdCBycGNfbG9jX3NlcnZlcl9pbmZvX3NfdHlwZSB7Ci0JcnBjX2xvY19zZXJ2ZXJfYWRkcl9lX3R5cGUgYWRkcl90eXBlOwotCXJwY19sb2Nfc2VydmVyX2FkZHJfdV90eXBlIGFkZHJfaW5mbzsKLX07Ci10eXBlZGVmIHN0cnVjdCBycGNfbG9jX3NlcnZlcl9pbmZvX3NfdHlwZSBycGNfbG9jX3NlcnZlcl9pbmZvX3NfdHlwZTsKLQotZW51bSBycGNfbG9jX25pX25vdGlmeV92ZXJpZnlfZV90eXBlIHsKLQlSUENfTE9DX05JX1VTRVJfTk9fTk9USUZZX05PX1ZFUklGWSA9IDEsCi0JUlBDX0xPQ19OSV9VU0VSX05PVElGWV9PTkxZID0gMiwKLQlSUENfTE9DX05JX1VTRVJfTk9USUZZX1ZFUklGWV9BTExPV19OT19SRVNQID0gMywKLQlSUENfTE9DX05JX1VTRVJfTk9USUZZX1ZFUklGWV9OT1RfQUxMT1dfTk9fUkVTUCA9IDQsCi0JUlBDX0xPQ19OSV9VU0VSX1BSSVZBQ1lfT1ZFUlJJREUgPSA1LAotCVJQQ19MT0NfTklfVVNFUl9OT1RJRllfVkVSSVRZX1RZUEVfTUFYID0gMjY4NDM1NDU2LAotfTsKLXR5cGVkZWYgZW51bSBycGNfbG9jX25pX25vdGlmeV92ZXJpZnlfZV90eXBlIHJwY19sb2Nfbmlfbm90aWZ5X3ZlcmlmeV9lX3R5cGU7Ci0KLWVudW0gcnBjX2xvY19uaV9ldmVudF9lX3R5cGUgewotCVJQQ19MT0NfTklfRVZFTlRfVlhfTk9USUZZX1ZFUklGWV9SRVEgPSAxLAotCVJQQ19MT0NfTklfRVZFTlRfU1VQTF9OT1RJRllfVkVSSUZZX1JFUSA9IDIsCi0JUlBDX0xPQ19OSV9FVkVOVF9VTVRTX0NQX05PVElGWV9WRVJJRllfUkVRID0gMywKLQlSUENfTE9DX05JX0VWRU5UX1ZYX1NFUlZJQ0VfSU5URVJBQ1RJT05fUkVRID0gNCwKLQlSUENfTE9DX05JX0VWRU5UX01BWCA9IDI2ODQzNTQ1NiwKLX07Ci10eXBlZGVmIGVudW0gcnBjX2xvY19uaV9ldmVudF9lX3R5cGUgcnBjX2xvY19uaV9ldmVudF9lX3R5cGU7Ci0KLWVudW0gcnBjX2xvY19uaV9kYXRhY29kaW5nX3NjaGVtZV9lX3R5cGUgewotCVJQQ19MT0NfTklfUFJFU1VQTF9JU082NDZJUlYgPSAwLAotCVJQQ19MT0NfTklfUFJFU1VQTF9JU084ODU5ID0gMSwKLQlSUENfTE9DX05JX1BSRVNVUExfVVRGOCA9IDIsCi0JUlBDX0xPQ19OSV9QUkVTVVBMX1VURjE2ID0gMywKLQlSUENfTE9DX05JX1BSRVNVUExfVUNTMiA9IDQsCi0JUlBDX0xPQ19OSV9QUkVTVVBMX0dTTV9ERUZBVUxUID0gNSwKLQlSUENfTE9DX05JX1BSRVNVUExfU0hJRlRfSklTID0gNiwKLQlSUENfTE9DX05JX1BSRVNVUExfSklTID0gNywKLQlSUENfTE9DX05JX1BSRVNVUExfRVVDID0gOCwKLQlSUENfTE9DX05JX1BSRVNVUExfR0IyMzEyID0gOSwKLQlSUENfTE9DX05JX1BSRVNVUExfQ05TMTE2NDMgPSAxMCwKLQlSUENfTE9DX05JX1BSRVNVUExfS1NDMTAwMSA9IDExLAotCVJQQ19MT0NfTklfUFJFU1VQTF9FTkNPRElOR19VTktOT1dOID0gMjE0NzQ4MzY0NywKLQlSUENfTE9DX05JX1NTX0dFUk1BTiA9IDEyLAotCVJQQ19MT0NfTklfU1NfRU5HTElTSCA9IDEzLAotCVJQQ19MT0NfTklfU1NfSVRBTElBTiA9IDE0LAotCVJQQ19MT0NfTklfU1NfRlJFTkNIID0gMTUsCi0JUlBDX0xPQ19OSV9TU19TUEFOSVNIID0gMTYsCi0JUlBDX0xPQ19OSV9TU19EVVRDSCA9IDE3LAotCVJQQ19MT0NfTklfU1NfU1dFRElTSCA9IDE4LAotCVJQQ19MT0NfTklfU1NfREFOSVNIID0gMTksCi0JUlBDX0xPQ19OSV9TU19QT1JUVUdVRVNFID0gMjAsCi0JUlBDX0xPQ19OSV9TU19GSU5OSVNIID0gMjEsCi0JUlBDX0xPQ19OSV9TU19OT1JXRUdJQU4gPSAyMiwKLQlSUENfTE9DX05JX1NTX0dSRUVLID0gMjMsCi0JUlBDX0xPQ19OSV9TU19UVVJLSVNIID0gMjQsCi0JUlBDX0xPQ19OSV9TU19IVU5HQVJJQU4gPSAyNSwKLQlSUENfTE9DX05JX1NTX1BPTElTSCA9IDI2LAotCVJQQ19MT0NfTklfU1NfTEFOR1VBR0VfVU5TUEVDID0gMjcsCi0JUlBDX0xPQ19OSV9TVVBMX1VURjggPSAyOCwKLQlSUENfTE9DX05JX1NVUExfVUNTMiA9IDI5LAotCVJQQ19MT0NfTklfU1VQTF9HU01fREVGQVVMVCA9IDMwLAotCVJQQ19MT0NfTklfU1VQTF9FTkNPRElOR19VTktOT1dOID0gMjE0NzQ4MzY0NywKLX07Ci10eXBlZGVmIGVudW0gcnBjX2xvY19uaV9kYXRhY29kaW5nX3NjaGVtZV9lX3R5cGUgcnBjX2xvY19uaV9kYXRhY29kaW5nX3NjaGVtZV9lX3R5cGU7Ci0KLWVudW0gcnBjX2xvY19uaV92eF9yZXF1ZXN0ZXJfaWRfZW5jb2Rpbmdfc2NoZW1lX2VfdHlwZSB7Ci0JUlBDX0xPQ19OSV9WWF9PQ1RFVCA9IDAsCi0JUlBDX0xPQ19OSV9WWF9FWE5fUFJPVE9DT0xfTVNHID0gMSwKLQlSUENfTE9DX05JX1ZYX0FTQ0lJID0gMiwKLQlSUENfTE9DX05JX1ZYX0lBNSA9IDMsCi0JUlBDX0xPQ19OSV9WWF9VTklDT0RFID0gNCwKLQlSUENfTE9DX05JX1ZYX1NISUZUX0pJUyA9IDUsCi0JUlBDX0xPQ19OSV9WWF9LT1JFQU4gPSA2LAotCVJQQ19MT0NfTklfVlhfTEFUSU5fSEVCUkVXID0gNywKLQlSUENfTE9DX05JX1ZYX0xBVElOID0gOCwKLQlSUENfTE9DX05JX1ZYX0dTTSA9IDksCi0JUlBDX0xPQ19OSV9WWF9FTkNPRElOR19UWVBFX01BWCA9IDI2ODQzNTQ1NiwKLX07Ci10eXBlZGVmIGVudW0gcnBjX2xvY19uaV92eF9yZXF1ZXN0ZXJfaWRfZW5jb2Rpbmdfc2NoZW1lX2VfdHlwZSBycGNfbG9jX25pX3Z4X3JlcXVlc3Rlcl9pZF9lbmNvZGluZ19zY2hlbWVfZV90eXBlOwotCi1lbnVtIHJwY19sb2NfbmlfdnhfcG9zX21vZGVfZV90eXBlIHsKLQlSUENfTE9DX1ZYX01TX0FTU0lTVEVEX09OTFkgPSAxLAotCVJQQ19MT0NfVlhfTVNfQkFTRURfT05MWSA9IDIsCi0JUlBDX0xPQ19WWF9NU19BU1NJU1RFRF9QUkVGX01TQkFTRURfQUxMV0QgPSAzLAotCVJQQ19MT0NfVlhfTVNfQkFTRURfUFJFRl9BU1NJU1RFRF9BTExXRCA9IDQsCi0JUlBDX0xPQ19WWF9QT1NfTU9ERV9NQVggPSAyNjg0MzU0NTYsCi19OwotdHlwZWRlZiBlbnVtIHJwY19sb2NfbmlfdnhfcG9zX21vZGVfZV90eXBlIHJwY19sb2NfbmlfdnhfcG9zX21vZGVfZV90eXBlOwotCi1zdHJ1Y3QgcnBjX2xvY19uaV92eF9yZXF1ZXN0ZXJfaWRfc190eXBlIHsKLQl1X2NoYXIgcmVxdWVzdGVyX2lkX2xlbmd0aDsKLQljaGFyIHJlcXVlc3Rlcl9pZFsyMDBdOwotfTsKLXR5cGVkZWYgc3RydWN0IHJwY19sb2NfbmlfdnhfcmVxdWVzdGVyX2lkX3NfdHlwZSBycGNfbG9jX25pX3Z4X3JlcXVlc3Rlcl9pZF9zX3R5cGU7Ci0KLXN0cnVjdCBycGNfbG9jX25pX3Z4X25vdGlmeV92ZXJpZnlfcmVxX3NfdHlwZSB7Ci0JcnBjX2xvY19uaV9ub3RpZnlfdmVyaWZ5X2VfdHlwZSBub3RpZmljYXRpb25fcHJpdl90eXBlOwotCXVfY2hhciBwb3NfcW9zX2luY2w7Ci0JdV9jaGFyIHBvc19xb3M7Ci0JcnBjX3VpbnQzMiBudW1fZml4ZXM7Ci0JcnBjX3VpbnQzMiB0YmY7Ci0JcnBjX2xvY19uaV92eF9wb3NfbW9kZV9lX3R5cGUgcG9zX21vZGU7Ci0JcnBjX2xvY19uaV92eF9yZXF1ZXN0ZXJfaWRfZW5jb2Rpbmdfc2NoZW1lX2VfdHlwZSBlbmNvZGluZ19zY2hlbWU7Ci0JcnBjX2xvY19uaV92eF9yZXF1ZXN0ZXJfaWRfc190eXBlIHJlcXVlc3Rlcl9pZDsKLQlycGNfdWludDE2IHVzZXJfcmVzcF90aW1lcl92YWw7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgcnBjX2xvY19uaV92eF9ub3RpZnlfdmVyaWZ5X3JlcV9zX3R5cGUgcnBjX2xvY19uaV92eF9ub3RpZnlfdmVyaWZ5X3JlcV9zX3R5cGU7Ci0KLWVudW0gcnBjX2xvY19uaV9zdXBsX3Bvc19tZXRob2RfZV90eXBlIHsKLQlSUENfTE9DX05JX1BPU01FVEhPRF9BR1BTX1NFVEFTU0lTVEVEID0gMSwKLQlSUENfTE9DX05JX1BPU01FVEhPRF9BR1BTX1NFVEJBU0VEID0gMiwKLQlSUENfTE9DX05JX1BPU01FVEhPRF9BR1BTX1NFVEFTU0lTVEVEX1BSRUYgPSAzLAotCVJQQ19MT0NfTklfUE9TTUVUSE9EX0FHUFNfU0VUQkFTRURfUFJFRiA9IDQsCi0JUlBDX0xPQ19OSV9QT1NNRVRIT0RfQVVUT05PTU9VU19HUFMgPSA1LAotCVJQQ19MT0NfTklfUE9TTUVUSE9EX0FGTFQgPSA2LAotCVJQQ19MT0NfTklfUE9TTUVUSE9EX0VDSUQgPSA3LAotCVJQQ19MT0NfTklfUE9TTUVUSE9EX0VPVEQgPSA4LAotCVJQQ19MT0NfTklfUE9TTUVUSE9EX09URE9BID0gOSwKLQlSUENfTE9DX05JX1BPU01FVEhPRF9OT19QT1NJVElPTiA9IDEwLAotCVJQQ19MT0NfTklfUE9TTUVUSE9EX01BWCA9IDI2ODQzNTQ1NiwKLX07Ci10eXBlZGVmIGVudW0gcnBjX2xvY19uaV9zdXBsX3Bvc19tZXRob2RfZV90eXBlIHJwY19sb2Nfbmlfc3VwbF9wb3NfbWV0aG9kX2VfdHlwZTsKLQotc3RydWN0IHJwY19sb2Nfbmlfc3VwbF9zbHBfc2Vzc2lvbl9pZF9zX3R5cGUgewotCXVfY2hhciBwcmVzZW5jZTsKLQljaGFyIHNlc3Npb25faWRbNF07Ci0JcnBjX2xvY19zZXJ2ZXJfaW5mb19zX3R5cGUgc2xwX2FkZHJlc3M7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgcnBjX2xvY19uaV9zdXBsX3NscF9zZXNzaW9uX2lkX3NfdHlwZSBycGNfbG9jX25pX3N1cGxfc2xwX3Nlc3Npb25faWRfc190eXBlOwotCi1zdHJ1Y3QgcnBjX2xvY19uaV9yZXF1ZXN0b3JfaWRfc190eXBlIHsKLQl1X2NoYXIgZGF0YV9jb2Rpbmdfc2NoZW1lOwotCWNoYXIgcmVxdWVzdG9yX2lkX3N0cmluZ1syMDBdOwotCXVfY2hhciBzdHJpbmdfbGVuOwotfTsKLXR5cGVkZWYgc3RydWN0IHJwY19sb2NfbmlfcmVxdWVzdG9yX2lkX3NfdHlwZSBycGNfbG9jX25pX3JlcXVlc3Rvcl9pZF9zX3R5cGU7Ci0KLXN0cnVjdCBycGNfbG9jX25pX3N1cGxfY2xpZW50X25hbWVfc190eXBlIHsKLQl1X2NoYXIgZGF0YV9jb2Rpbmdfc2NoZW1lOwotCWNoYXIgY2xpZW50X25hbWVfc3RyaW5nWzY0XTsKLQl1X2NoYXIgc3RyaW5nX2xlbjsKLX07Ci10eXBlZGVmIHN0cnVjdCBycGNfbG9jX25pX3N1cGxfY2xpZW50X25hbWVfc190eXBlIHJwY19sb2Nfbmlfc3VwbF9jbGllbnRfbmFtZV9zX3R5cGU7Ci0KLXN0cnVjdCBycGNfbG9jX25pX3N1cGxfcW9wX3NfdHlwZSB7Ci0JdV9jaGFyIGJpdF9tYXNrOwotCXVfY2hhciBob3JhY2M7Ci0JdV9jaGFyIHZlcmFjYzsKLQlycGNfdWludDE2IG1heExvY0FnZTsKLQl1X2NoYXIgZGVsYXk7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgcnBjX2xvY19uaV9zdXBsX3FvcF9zX3R5cGUgcnBjX2xvY19uaV9zdXBsX3FvcF9zX3R5cGU7Ci0KLXN0cnVjdCBycGNfbG9jX25pX3N1cGxfbm90aWZ5X3ZlcmlmeV9yZXFfc190eXBlIHsKLQlycGNfbG9jX25pX25vdGlmeV92ZXJpZnlfZV90eXBlIG5vdGlmaWNhdGlvbl9wcml2X3R5cGU7Ci0JcnBjX3VpbnQxNiBmbGFnczsKLQlycGNfbG9jX25pX3N1cGxfc2xwX3Nlc3Npb25faWRfc190eXBlIHN1cGxfc2xwX3Nlc3Npb25faWQ7Ci0JY2hhciBzdXBsX2hhc2hbOF07Ci0JcnBjX2xvY19uaV9kYXRhY29kaW5nX3NjaGVtZV9lX3R5cGUgZGF0YWNvZGluZ19zY2hlbWU7Ci0JcnBjX2xvY19uaV9zdXBsX3Bvc19tZXRob2RfZV90eXBlIHBvc19tZXRob2Q7Ci0JcnBjX2xvY19uaV9yZXF1ZXN0b3JfaWRfc190eXBlIHJlcXVlc3Rvcl9pZDsKLQlycGNfbG9jX25pX3N1cGxfY2xpZW50X25hbWVfc190eXBlIGNsaWVudF9uYW1lOwotCXJwY19sb2Nfbmlfc3VwbF9xb3Bfc190eXBlIHN1cGxfcW9wOwotCXJwY191aW50MTYgdXNlcl9yZXNwb25zZV90aW1lcjsKLX07Ci10eXBlZGVmIHN0cnVjdCBycGNfbG9jX25pX3N1cGxfbm90aWZ5X3ZlcmlmeV9yZXFfc190eXBlIHJwY19sb2Nfbmlfc3VwbF9ub3RpZnlfdmVyaWZ5X3JlcV9zX3R5cGU7Ci0KLXN0cnVjdCBycGNfbG9jX25pX2V4dF9jbGllbnRfYWRkcmVzc19zX3R5cGUgewotCXVfY2hhciBleHRfY2xpZW50X2FkZHJlc3NfbGVuOwotCWNoYXIgZXh0X2NsaWVudF9hZGRyZXNzWzIwXTsKLX07Ci10eXBlZGVmIHN0cnVjdCBycGNfbG9jX25pX2V4dF9jbGllbnRfYWRkcmVzc19zX3R5cGUgcnBjX2xvY19uaV9leHRfY2xpZW50X2FkZHJlc3Nfc190eXBlOwotCi1lbnVtIHJwY19sb2NfbmlfbG9jYXRpb25fdHlwZV9lX3R5cGUgewotCVJQQ19MT0NfTklfTE9DQVRJT05UWVBFX0NVUlJFTlRfTE9DQVRJT04gPSAxLAotCVJQQ19MT0NfTklfTE9DQVRJT05UWVBFX0NVUlJFTlRfT1JfTEFTVF9LTk9XTl9MT0NBVElPTiA9IDIsCi0JUlBDX0xPQ19OSV9MT0NBVElPTlRZUEVfSU5JVElBTF9MT0NBVElPTiA9IDMsCi0JUlBDX0xPQ19OSV9MT0NBVElPTlRZUEVfTUFYID0gMjY4NDM1NDU2LAotfTsKLXR5cGVkZWYgZW51bSBycGNfbG9jX25pX2xvY2F0aW9uX3R5cGVfZV90eXBlIHJwY19sb2NfbmlfbG9jYXRpb25fdHlwZV9lX3R5cGU7Ci0KLXN0cnVjdCBycGNfbG9jX25pX2RlZmVycmVkX2xvY2F0aW9uX3NfdHlwZSB7Ci0JdV9jaGFyIHVudXNlZF9iaXRzOwotCXVfY2hhciBtc19hdmFpbGFibGU7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgcnBjX2xvY19uaV9kZWZlcnJlZF9sb2NhdGlvbl9zX3R5cGUgcnBjX2xvY19uaV9kZWZlcnJlZF9sb2NhdGlvbl9zX3R5cGU7Ci0KLXN0cnVjdCBycGNfbG9jX25pX2NvZGV3b3JkX3N0cmluZ19zX3R5cGUgewotCXVfY2hhciBkYXRhX2NvZGluZ19zY2hlbWU7Ci0JY2hhciBsY3NfY29kZXdvcmRfc3RyaW5nWzIwXTsKLQl1X2NoYXIgc3RyaW5nX2xlbjsKLX07Ci10eXBlZGVmIHN0cnVjdCBycGNfbG9jX25pX2NvZGV3b3JkX3N0cmluZ19zX3R5cGUgcnBjX2xvY19uaV9jb2Rld29yZF9zdHJpbmdfc190eXBlOwotCi1zdHJ1Y3QgcnBjX2xvY19uaV9zZXJ2aWNlX3R5cGVfaWRfc190eXBlIHsKLQl1X2NoYXIgbGNzX3NlcnZpY2VfdHlwZV9pZDsKLX07Ci10eXBlZGVmIHN0cnVjdCBycGNfbG9jX25pX3NlcnZpY2VfdHlwZV9pZF9zX3R5cGUgcnBjX2xvY19uaV9zZXJ2aWNlX3R5cGVfaWRfc190eXBlOwotCi1zdHJ1Y3QgcnBjX2xvY19uaV91bXRzX2NwX25vdGlmeV92ZXJpZnlfcmVxX3NfdHlwZSB7Ci0JcnBjX2xvY19uaV9ub3RpZnlfdmVyaWZ5X2VfdHlwZSBub3RpZmljYXRpb25fcHJpdl90eXBlOwotCXVfY2hhciBpbnZva2VfaWQ7Ci0JcnBjX3VpbnQxNiBmbGFnczsKLQl1X2NoYXIgbm90aWZpY2F0aW9uX2xlbmd0aDsKLQljaGFyIG5vdGlmaWNhdGlvbl90ZXh0WzY0XTsKLQlycGNfbG9jX25pX2RhdGFjb2Rpbmdfc2NoZW1lX2VfdHlwZSBkYXRhY29kaW5nX3NjaGVtZTsKLQlycGNfbG9jX25pX2V4dF9jbGllbnRfYWRkcmVzc19zX3R5cGUgZXh0X2NsaWVudF9hZGRyZXNzX2RhdGE7Ci0JcnBjX2xvY19uaV9sb2NhdGlvbl90eXBlX2VfdHlwZSBsb2NhdGlvbl90eXBlOwotCXJwY19sb2NfbmlfZGVmZXJyZWRfbG9jYXRpb25fc190eXBlIGRlZmVycmVkX2xvY2F0aW9uOwotCXJwY19sb2NfbmlfcmVxdWVzdG9yX2lkX3NfdHlwZSByZXF1ZXN0b3JfaWQ7Ci0JcnBjX2xvY19uaV9jb2Rld29yZF9zdHJpbmdfc190eXBlIGNvZGV3b3JkX3N0cmluZzsKLQlycGNfbG9jX25pX3NlcnZpY2VfdHlwZV9pZF9zX3R5cGUgc2VydmljZV90eXBlX2lkOwotCXJwY191aW50MTYgdXNlcl9yZXNwb25zZV90aW1lcjsKLX07Ci10eXBlZGVmIHN0cnVjdCBycGNfbG9jX25pX3VtdHNfY3Bfbm90aWZ5X3ZlcmlmeV9yZXFfc190eXBlIHJwY19sb2NfbmlfdW10c19jcF9ub3RpZnlfdmVyaWZ5X3JlcV9zX3R5cGU7Ci0KLWVudW0gcnBjX2xvY19uaV9zZXJ2aWNlX2ludGVyYWN0aW9uX2VfdHlwZSB7Ci0JUlBDX0xPQ19OSV9TRVJWSUNFX0lOVEVSQUNUSU9OX09OR09JTkdfTklfSU5DT01JTkdfTU8gPSAxLAotCVJQQ19MT0NfTklfU0VSVklDRV9JTlRFUkFDVElPTl9NQVggPSAyNjg0MzU0NTYsCi19OwotdHlwZWRlZiBlbnVtIHJwY19sb2Nfbmlfc2VydmljZV9pbnRlcmFjdGlvbl9lX3R5cGUgcnBjX2xvY19uaV9zZXJ2aWNlX2ludGVyYWN0aW9uX2VfdHlwZTsKLQotc3RydWN0IHJwY19sb2Nfbmlfdnhfc2VydmljZV9pbnRlcmFjdGlvbl9yZXFfc190eXBlIHsKLQlycGNfbG9jX25pX3Z4X25vdGlmeV92ZXJpZnlfcmVxX3NfdHlwZSBuaV92eF9yZXE7Ci0JcnBjX2xvY19uaV9zZXJ2aWNlX2ludGVyYWN0aW9uX2VfdHlwZSBzZXJ2aWNlX2ludGVyYXRpb25fdHlwZTsKLX07Ci10eXBlZGVmIHN0cnVjdCBycGNfbG9jX25pX3Z4X3NlcnZpY2VfaW50ZXJhY3Rpb25fcmVxX3NfdHlwZSBycGNfbG9jX25pX3Z4X3NlcnZpY2VfaW50ZXJhY3Rpb25fcmVxX3NfdHlwZTsKLQotc3RydWN0IHJwY19sb2NfbmlfZXZlbnRfcGF5bG9hZF91X3R5cGUgewotCXJwY19sb2NfbmlfZXZlbnRfZV90eXBlIGRpc2M7Ci0JdW5pb24gewotCQlycGNfbG9jX25pX3Z4X25vdGlmeV92ZXJpZnlfcmVxX3NfdHlwZSB2eF9yZXE7Ci0JCXJwY19sb2Nfbmlfc3VwbF9ub3RpZnlfdmVyaWZ5X3JlcV9zX3R5cGUgc3VwbF9yZXE7Ci0JCXJwY19sb2NfbmlfdW10c19jcF9ub3RpZnlfdmVyaWZ5X3JlcV9zX3R5cGUgdW10c19jcF9yZXE7Ci0JCXJwY19sb2Nfbmlfdnhfc2VydmljZV9pbnRlcmFjdGlvbl9yZXFfc190eXBlIHNlcnZpY2VfaW50ZXJhY3Rpb25fcmVxOwotCX0gcnBjX2xvY19uaV9ldmVudF9wYXlsb2FkX3VfdHlwZV91OwotfTsKLXR5cGVkZWYgc3RydWN0IHJwY19sb2NfbmlfZXZlbnRfcGF5bG9hZF91X3R5cGUgcnBjX2xvY19uaV9ldmVudF9wYXlsb2FkX3VfdHlwZTsKLQotc3RydWN0IHJwY19sb2NfbmlfZXZlbnRfc190eXBlIHsKLQlycGNfbG9jX25pX2V2ZW50X2VfdHlwZSBldmVudDsKLQlycGNfbG9jX25pX2V2ZW50X3BheWxvYWRfdV90eXBlIHBheWxvYWQ7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgcnBjX2xvY19uaV9ldmVudF9zX3R5cGUgcnBjX2xvY19uaV9ldmVudF9zX3R5cGU7Ci0KLWVudW0gcnBjX2xvY19hc3Npc3RfZGF0YV9yZXF1ZXN0X2VfdHlwZSB7Ci0JUlBDX0xPQ19BU1NJU1RfREFUQV9USU1FX1JFUSA9IDEsCi0JUlBDX0xPQ19BU1NJU1RfREFUQV9QUkVESUNURURfT1JCSVRTX1JFUSA9IDIsCi0JUlBDX0xPQ19BU1NJU1RfREFUQV9NQVggPSAyNjg0MzU0NTYsCi19OwotdHlwZWRlZiBlbnVtIHJwY19sb2NfYXNzaXN0X2RhdGFfcmVxdWVzdF9lX3R5cGUgcnBjX2xvY19hc3Npc3RfZGF0YV9yZXF1ZXN0X2VfdHlwZTsKLQotdHlwZWRlZiBjaGFyICpycGNfc3RydWN0X2xvY190aW1lX2Rvd25sb2FkX3NvdXJjZV9zX3R5cGVfc2VydmVyc19wdHI7Ci0KLXR5cGVkZWYgcnBjX3N0cnVjdF9sb2NfdGltZV9kb3dubG9hZF9zb3VyY2Vfc190eXBlX3NlcnZlcnNfcHRyIHJwY19zdHJ1Y3RfbG9jX3RpbWVfZG93bmxvYWRfc291cmNlX3NfdHlwZV9zZXJ2ZXJzWzNdOwotCi1zdHJ1Y3QgcnBjX2xvY190aW1lX2Rvd25sb2FkX3NvdXJjZV9zX3R5cGUgewotCXJwY191aW50MzIgZGVsYXlfdGhyZXNob2xkOwotCXJwY19zdHJ1Y3RfbG9jX3RpbWVfZG93bmxvYWRfc291cmNlX3NfdHlwZV9zZXJ2ZXJzIHNlcnZlcnM7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgcnBjX2xvY190aW1lX2Rvd25sb2FkX3NvdXJjZV9zX3R5cGUgcnBjX2xvY190aW1lX2Rvd25sb2FkX3NvdXJjZV9zX3R5cGU7Ci0KLXR5cGVkZWYgY2hhciAqcnBjX3N0cnVjdF9sb2NfcHJlZGljdGVkX29yYml0c19kYXRhX3NvdXJjZV9zX3R5cGVfc2VydmVyc19wdHI7Ci0KLXR5cGVkZWYgcnBjX3N0cnVjdF9sb2NfcHJlZGljdGVkX29yYml0c19kYXRhX3NvdXJjZV9zX3R5cGVfc2VydmVyc19wdHIgcnBjX3N0cnVjdF9sb2NfcHJlZGljdGVkX29yYml0c19kYXRhX3NvdXJjZV9zX3R5cGVfc2VydmVyc1szXTsKLQotc3RydWN0IHJwY19sb2NfcHJlZGljdGVkX29yYml0c19kYXRhX3NvdXJjZV9zX3R5cGUgewotCXJwY191aW50MzIgbWF4X2ZpbGVfc2l6ZTsKLQlycGNfdWludDMyIG1heF9wYXJ0X3NpemU7Ci0JcnBjX3N0cnVjdF9sb2NfcHJlZGljdGVkX29yYml0c19kYXRhX3NvdXJjZV9zX3R5cGVfc2VydmVycyBzZXJ2ZXJzOwotfTsKLXR5cGVkZWYgc3RydWN0IHJwY19sb2NfcHJlZGljdGVkX29yYml0c19kYXRhX3NvdXJjZV9zX3R5cGUgcnBjX2xvY19wcmVkaWN0ZWRfb3JiaXRzX2RhdGFfc291cmNlX3NfdHlwZTsKLQotc3RydWN0IHJwY19sb2NfYXNzaXN0X2RhdGFfcmVxdWVzdF9wYXlsb2FkX3VfdHlwZSB7Ci0JcnBjX2xvY19hc3Npc3RfZGF0YV9yZXF1ZXN0X2VfdHlwZSBkaXNjOwotCXVuaW9uIHsKLQkJcnBjX2xvY190aW1lX2Rvd25sb2FkX3NvdXJjZV9zX3R5cGUgdGltZV9kb3dubG9hZDsKLQkJcnBjX2xvY19wcmVkaWN0ZWRfb3JiaXRzX2RhdGFfc291cmNlX3NfdHlwZSBkYXRhX2Rvd25sb2FkOwotCX0gcnBjX2xvY19hc3Npc3RfZGF0YV9yZXF1ZXN0X3BheWxvYWRfdV90eXBlX3U7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgcnBjX2xvY19hc3Npc3RfZGF0YV9yZXF1ZXN0X3BheWxvYWRfdV90eXBlIHJwY19sb2NfYXNzaXN0X2RhdGFfcmVxdWVzdF9wYXlsb2FkX3VfdHlwZTsKLQotc3RydWN0IHJwY19sb2NfYXNzaXN0X2RhdGFfcmVxdWVzdF9zX3R5cGUgewotCXJwY19sb2NfYXNzaXN0X2RhdGFfcmVxdWVzdF9lX3R5cGUgZXZlbnQ7Ci0JcnBjX2xvY19hc3Npc3RfZGF0YV9yZXF1ZXN0X3BheWxvYWRfdV90eXBlIHBheWxvYWQ7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgcnBjX2xvY19hc3Npc3RfZGF0YV9yZXF1ZXN0X3NfdHlwZSBycGNfbG9jX2Fzc2lzdF9kYXRhX3JlcXVlc3Rfc190eXBlOwotCi10eXBlZGVmIHJwY191aW50MzIgcnBjX2xvY19zZXJ2ZXJfY29ubmVjdGlvbl9oYW5kbGU7Ci0KLWVudW0gcnBjX2xvY19zZXJ2ZXJfcHJvdG9jb2xfZV90eXBlIHsKLQlSUENfTE9DX1NFUlZFUl9QUk9UT0NPTF9ERUZBVUxUID0gMCwKLQlSUENfTE9DX1NFUlZFUl9QUk9UT0NPTF9TVVBMID0gMSwKLQlSUENfTE9DX1NFUlZFUl9QUk9UT0NPTF9WWF9NUEMgPSAyLAotCVJQQ19MT0NfU0VSVkVSX1BST1RPQ09MX1ZYX1BERSA9IDMsCi0JUlBDX0xPQ19TRVJWRVJfUFJPVE9DT0xfTUFYID0gMTY3NzcyMTYsCi19OwotdHlwZWRlZiBlbnVtIHJwY19sb2Nfc2VydmVyX3Byb3RvY29sX2VfdHlwZSBycGNfbG9jX3NlcnZlcl9wcm90b2NvbF9lX3R5cGU7Ci0KLWVudW0gcnBjX2xvY19zZXJ2ZXJfcmVxdWVzdF9lX3R5cGUgewotCVJQQ19MT0NfU0VSVkVSX1JFUVVFU1RfT1BFTiA9IDEsCi0JUlBDX0xPQ19TRVJWRVJfUkVRVUVTVF9DTE9TRSA9IDIsCi0JUlBDX0xPQ19TRVJWRVJfUkVRVUVTVF9NQVggPSAyNjg0MzU0NTYsCi19OwotdHlwZWRlZiBlbnVtIHJwY19sb2Nfc2VydmVyX3JlcXVlc3RfZV90eXBlIHJwY19sb2Nfc2VydmVyX3JlcXVlc3RfZV90eXBlOwotCi1zdHJ1Y3QgcnBjX2xvY19zZXJ2ZXJfb3Blbl9yZXFfc190eXBlIHsKLQlycGNfbG9jX3NlcnZlcl9jb25uZWN0aW9uX2hhbmRsZSBjb25uX2hhbmRsZTsKLQlycGNfbG9jX3NlcnZlcl9wcm90b2NvbF9lX3R5cGUgcHJvdG9jb2w7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgcnBjX2xvY19zZXJ2ZXJfb3Blbl9yZXFfc190eXBlIHJwY19sb2Nfc2VydmVyX29wZW5fcmVxX3NfdHlwZTsKLQotc3RydWN0IHJwY19sb2Nfc2VydmVyX2Nsb3NlX3JlcV9zX3R5cGUgewotCXJwY19sb2Nfc2VydmVyX2Nvbm5lY3Rpb25faGFuZGxlIGNvbm5faGFuZGxlOwotfTsKLXR5cGVkZWYgc3RydWN0IHJwY19sb2Nfc2VydmVyX2Nsb3NlX3JlcV9zX3R5cGUgcnBjX2xvY19zZXJ2ZXJfY2xvc2VfcmVxX3NfdHlwZTsKLQotc3RydWN0IHJwY19sb2Nfc2VydmVyX3JlcXVlc3RfdV90eXBlIHsKLQlycGNfbG9jX3NlcnZlcl9yZXF1ZXN0X2VfdHlwZSBkaXNjOwotCXVuaW9uIHsKLQkJcnBjX2xvY19zZXJ2ZXJfb3Blbl9yZXFfc190eXBlIG9wZW5fcmVxOwotCQlycGNfbG9jX3NlcnZlcl9jbG9zZV9yZXFfc190eXBlIGNsb3NlX3JlcTsKLQl9IHJwY19sb2Nfc2VydmVyX3JlcXVlc3RfdV90eXBlX3U7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgcnBjX2xvY19zZXJ2ZXJfcmVxdWVzdF91X3R5cGUgcnBjX2xvY19zZXJ2ZXJfcmVxdWVzdF91X3R5cGU7Ci0KLXN0cnVjdCBycGNfbG9jX3NlcnZlcl9yZXF1ZXN0X3NfdHlwZSB7Ci0JcnBjX2xvY19zZXJ2ZXJfcmVxdWVzdF9lX3R5cGUgZXZlbnQ7Ci0JcnBjX2xvY19zZXJ2ZXJfcmVxdWVzdF91X3R5cGUgcGF5bG9hZDsKLX07Ci10eXBlZGVmIHN0cnVjdCBycGNfbG9jX3NlcnZlcl9yZXF1ZXN0X3NfdHlwZSBycGNfbG9jX3NlcnZlcl9yZXF1ZXN0X3NfdHlwZTsKLQotZW51bSBycGNfbG9jX3F3aXBfcmVxdWVzdF9lX3R5cGUgewotCVJQQ19MT0NfUVdJUF9TVEFSVF9QRVJJT0RJQ19ISV9GUkVRX0ZJWEVTID0gMCwKLQlSUENfTE9DX1FXSVBfU1RBUlRfUEVSSU9ESUNfS0VFUF9XQVJNID0gMCArIDEsCi0JUlBDX0xPQ19RV0lQX1NUT1BfUEVSSU9ESUNfRklYRVMgPSAwICsgMiwKLQlSUENfTE9DX1FXSVBfU1VTUEVORCA9IDAgKyAzLAotCVJQQ19MT0NfUVdJUF9SRVFVRVNUX01BWCA9IDI2ODQzNTQ1NiwKLX07Ci10eXBlZGVmIGVudW0gcnBjX2xvY19xd2lwX3JlcXVlc3RfZV90eXBlIHJwY19sb2NfcXdpcF9yZXF1ZXN0X2VfdHlwZTsKLQotc3RydWN0IHJwY19sb2NfcXdpcF9yZXF1ZXN0X3NfdHlwZSB7Ci0JcnBjX2xvY19xd2lwX3JlcXVlc3RfZV90eXBlIHJlcXVlc3RfdHlwZTsKLQlycGNfdWludDE2IHRiZl9tczsKLX07Ci10eXBlZGVmIHN0cnVjdCBycGNfbG9jX3F3aXBfcmVxdWVzdF9zX3R5cGUgcnBjX2xvY19xd2lwX3JlcXVlc3Rfc190eXBlOwotCi1zdHJ1Y3QgcnBjX2xvY19yZXNlcnZlZF9wYXlsb2FkX3NfdHlwZSB7Ci0JcnBjX3VpbnQxNiBkYXRhX3NpemU7Ci0Jc3RydWN0IHsKLQkJdV9pbnQgZGF0YV9sZW47Ci0JCWNoYXIgKmRhdGFfdmFsOwotCX0gZGF0YTsKLX07Ci10eXBlZGVmIHN0cnVjdCBycGNfbG9jX3Jlc2VydmVkX3BheWxvYWRfc190eXBlIHJwY19sb2NfcmVzZXJ2ZWRfcGF5bG9hZF9zX3R5cGU7Ci0KLWVudW0gcnBjX2xvY19pb2N0bF9lX3R5cGUgewotCVJQQ19MT0NfSU9DVExfR0VUX0FQSV9WRVJTSU9OID0gMSwKLQlSUENfTE9DX0lPQ1RMX1NFVF9GSVhfQ1JJVEVSSUEgPSAyLAotCVJQQ19MT0NfSU9DVExfR0VUX0ZJWF9DUklURVJJQSA9IDMsCi0JUlBDX0xPQ19JT0NUTF9TRVJWSUNFX1NUQVJUX0lOREVYID0gNDAwLAotCVJQQ19MT0NfSU9DVExfSU5GT1JNX05JX1VTRVJfUkVTUE9OU0UgPSA0MDAsCi0JUlBDX0xPQ19JT0NUTF9JTkpFQ1RfUFJFRElDVEVEX09SQklUU19EQVRBID0gNDAxLAotCVJQQ19MT0NfSU9DVExfUVVFUllfUFJFRElDVEVEX09SQklUU19EQVRBX1ZBTElESVRZID0gNDAyLAotCVJQQ19MT0NfSU9DVExfUVVFUllfUFJFRElDVEVEX09SQklUU19EQVRBX1NPVVJDRSA9IDQwMywKLQlSUENfTE9DX0lPQ1RMX1NFVF9QUkVESUNURURfT1JCSVRTX0RBVEFfQVVUT19ET1dOTE9BRCA9IDQwNCwKLQlSUENfTE9DX0lPQ1RMX0lOSkVDVF9VVENfVElNRSA9IDQwNSwKLQlSUENfTE9DX0lPQ1RMX0lOSkVDVF9SVENfVkFMVUUgPSA0MDYsCi0JUlBDX0xPQ19JT0NUTF9JTkpFQ1RfUE9TSVRJT04gPSA0MDcsCi0JUlBDX0xPQ19JT0NUTF9RVUVSWV9FTkdJTkVfU1RBVEUgPSA0MDgsCi0JUlBDX0xPQ19JT0NUTF9JTkZPUk1fU0VSVkVSX09QRU5fU1RBVFVTID0gNDA5LAotCVJQQ19MT0NfSU9DVExfSU5GT1JNX1NFUlZFUl9DTE9TRV9TVEFUVVMgPSA0MTAsCi0JUlBDX0xPQ19JT0NUTF9TRU5EX1dJUEVSX1BPU0lUSU9OX1JFUE9SVCA9IDQxMSwKLQlSUENfTE9DX0lPQ1RMX05PVElGWV9XSVBFUl9TVEFUVVMgPSA0MTIsCi0JUlBDX0xPQ19JT0NUTF9BQ0NFU1NfRUZTX0RBVEEgPSA0MTMsCi0JUlBDX0xPQ19JT0NUTF9OVl9TRVRUSU5HU19TVEFSVF9JTkRFWCA9IDgwMCwKLQlSUENfTE9DX0lPQ1RMX1NFVF9FTkdJTkVfTE9DSyA9IDgwMCwKLQlSUENfTE9DX0lPQ1RMX0dFVF9FTkdJTkVfTE9DSyA9IDgwMSwKLQlSUENfTE9DX0lPQ1RMX1NFVF9TQkFTX0NPTkZJRyA9IDgwMiwKLQlSUENfTE9DX0lPQ1RMX0dFVF9TQkFTX0NPTkZJRyA9IDgwMywKLQlSUENfTE9DX0lPQ1RMX1NFVF9OTUVBX1RZUEVTID0gODA0LAotCVJQQ19MT0NfSU9DVExfR0VUX05NRUFfVFlQRVMgPSA4MDUsCi0JUlBDX0xPQ19JT0NUTF9TRVRfQ0RNQV9QREVfU0VSVkVSX0FERFIgPSA4MDYsCi0JUlBDX0xPQ19JT0NUTF9HRVRfQ0RNQV9QREVfU0VSVkVSX0FERFIgPSA4MDcsCi0JUlBDX0xPQ19JT0NUTF9TRVRfQ0RNQV9NUENfU0VSVkVSX0FERFIgPSA4MDgsCi0JUlBDX0xPQ19JT0NUTF9HRVRfQ0RNQV9NUENfU0VSVkVSX0FERFIgPSA4MDksCi0JUlBDX0xPQ19JT0NUTF9TRVRfVU1UU19TTFBfU0VSVkVSX0FERFIgPSA4MTAsCi0JUlBDX0xPQ19JT0NUTF9HRVRfVU1UU19TTFBfU0VSVkVSX0FERFIgPSA4MTEsCi0JUlBDX0xPQ19JT0NUTF9TRVRfT05fREVNQU5EX0xQTSA9IDgxMiwKLQlSUENfTE9DX0lPQ1RMX0dFVF9PTl9ERU1BTkRfTFBNID0gODEzLAotCVJQQ19MT0NfSU9DVExfUFJPUFJJRVRBUllfU1RBUlRfSU5ERVggPSAxMDAwLAotCVJQQ19MT0NfSU9DVExfREVMRVRFX0FTU0lTVF9EQVRBID0gMTAwMCwKLQlSUENfTE9DX0lPQ1RMX1NFVF9DVVNUT01fUERFX1NFUlZFUl9BRERSID0gMTAwMSwKLQlSUENfTE9DX0lPQ1RMX0dFVF9DVVNUT01fUERFX1NFUlZFUl9BRERSID0gMTAwMiwKLQlSUENfTE9DX0lPQ1RMX1RISVJEX1BBUlRZX1NUQVJUX0lOREVYID0gMTA3Mzc0MTgyNCwKLX07Ci10eXBlZGVmIGVudW0gcnBjX2xvY19pb2N0bF9lX3R5cGUgcnBjX2xvY19pb2N0bF9lX3R5cGU7Ci0KLXN0cnVjdCBycGNfbG9jX2FwaV92ZXJzaW9uX3NfdHlwZSB7Ci0JdV9jaGFyIG1ham9yOwotCXVfY2hhciBtaW5vcjsKLX07Ci10eXBlZGVmIHN0cnVjdCBycGNfbG9jX2FwaV92ZXJzaW9uX3NfdHlwZSBycGNfbG9jX2FwaV92ZXJzaW9uX3NfdHlwZTsKLQotZW51bSBycGNfbG9jX2ZpeF9yZWN1cnJlbmNlX2VfdHlwZSB7Ci0JUlBDX0xPQ19QRVJJT0RJQ19GSVggPSAxLAotCVJQQ19MT0NfU0lOR0xFX0ZJWCA9IDIsCi0JUlBDX0xPQ19GSVhfU0VTU0lPTl9UWVBFX01BWCA9IDI2ODQzNTQ1NiwKLX07Ci10eXBlZGVmIGVudW0gcnBjX2xvY19maXhfcmVjdXJyZW5jZV9lX3R5cGUgcnBjX2xvY19maXhfcmVjdXJyZW5jZV9lX3R5cGU7Ci0KLWVudW0gcnBjX2xvY19vcGVyYXRpb25fbW9kZV9lX3R5cGUgewotCVJQQ19MT0NfT1BFUl9NT0RFX0RFRkFVTFQgPSAxLAotCVJQQ19MT0NfT1BFUl9NT0RFX01TQiA9IDIsCi0JUlBDX0xPQ19PUEVSX01PREVfTVNBID0gMywKLQlSUENfTE9DX09QRVJfTU9ERV9TVEFOREFMT05FID0gNCwKLQlSUENfTE9DX09QRVJfTU9ERV9TUEVFRF9PUFRJTUFMID0gNSwKLQlSUENfTE9DX09QRVJfTU9ERV9BQ0NVUkFDWV9PUFRJTUFMID0gNiwKLQlSUENfTE9DX09QRVJfTU9ERV9EQVRBX09QVElNQUwgPSA3LAotCVJQQ19MT0NfT1BFUl9NT0RFX0NFTExfSUQgPSA4LAotCVJQQ19MT0NfT1BFUl9NT0RFX01BWCA9IDI2ODQzNTQ1NiwKLX07Ci10eXBlZGVmIGVudW0gcnBjX2xvY19vcGVyYXRpb25fbW9kZV9lX3R5cGUgcnBjX2xvY19vcGVyYXRpb25fbW9kZV9lX3R5cGU7Ci0KLWVudW0gcnBjX2xvY19ub3RpZnlfZV90eXBlIHsKLQlSUENfTE9DX05PVElGWV9PTl9JTlRFUlZBTCA9IDEsCi0JUlBDX0xPQ19OT1RJRllfT05fRElTVEFOQ0UgPSAyLAotCVJQQ19MT0NfTk9USUZZX09OX0FOWSA9IDMsCi0JUlBDX0xPQ19OT1RJRllfT05fQUxMID0gNCwKLQlSUENfTE9DX05PVElGWV9UWVBFX01BWCA9IDI2ODQzNTQ1NiwKLX07Ci10eXBlZGVmIGVudW0gcnBjX2xvY19ub3RpZnlfZV90eXBlIHJwY19sb2Nfbm90aWZ5X2VfdHlwZTsKLQotc3RydWN0IHJwY19sb2NfZml4X2NyaXRlcmlhX3NfdHlwZSB7Ci0JcnBjX3VpbnQzMiB2YWxpZF9tYXNrOwotCXJwY19sb2NfZml4X3JlY3VycmVuY2VfZV90eXBlIHJlY3VycmVuY2VfdHlwZTsKLQlycGNfbG9jX29wZXJhdGlvbl9tb2RlX2VfdHlwZSBwcmVmZXJyZWRfb3BlcmF0aW9uX21vZGU7Ci0JcnBjX3VpbnQzMiBwcmVmZXJyZWRfYWNjdXJhY3k7Ci0JcnBjX3VpbnQzMiBwcmVmZXJyZWRfcmVzcG9uc2VfdGltZTsKLQlycGNfYm9vbGVhbiBpbnRlcm1lZGlhdGVfcG9zX3JlcG9ydF9lbmFibGVkOwotCXJwY19sb2Nfbm90aWZ5X2VfdHlwZSBub3RpZnlfdHlwZTsKLQlycGNfdWludDMyIG1pbl9pbnRlcnZhbDsKLQlmbG9hdCBtaW5fZGlzdGFuY2U7Ci0JcnBjX3VpbnQzMiBtaW5fZGlzdF9zYW1wbGVfaW50ZXJ2YWw7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgcnBjX2xvY19maXhfY3JpdGVyaWFfc190eXBlIHJwY19sb2NfZml4X2NyaXRlcmlhX3NfdHlwZTsKLQotZW51bSBycGNfbG9jX25pX3VzZXJfcmVzcF9lX3R5cGUgewotCVJQQ19MT0NfTklfTENTX05PVElGWV9WRVJJRllfQUNDRVBUID0gMSwKLQlSUENfTE9DX05JX0xDU19OT1RJRllfVkVSSUZZX0RFTlkgPSAyLAotCVJQQ19MT0NfTklfTENTX05PVElGWV9WRVJJRllfTk9SRVNQID0gMywKLQlSUENfTE9DX05JX0xDU19OT1RJRllfVkVSSUZZX01BWCA9IDI2ODQzNTQ1NiwKLX07Ci10eXBlZGVmIGVudW0gcnBjX2xvY19uaV91c2VyX3Jlc3BfZV90eXBlIHJwY19sb2NfbmlfdXNlcl9yZXNwX2VfdHlwZTsKLQotc3RydWN0IHJwY19sb2NfdXNlcl92ZXJpZnlfc190eXBlIHsKLQlycGNfbG9jX25pX3VzZXJfcmVzcF9lX3R5cGUgdXNlcl9yZXNwOwotCXJwY19sb2NfbmlfZXZlbnRfc190eXBlIG5pX2V2ZW50X3Bhc3NfYmFjazsKLX07Ci10eXBlZGVmIHN0cnVjdCBycGNfbG9jX3VzZXJfdmVyaWZ5X3NfdHlwZSBycGNfbG9jX3VzZXJfdmVyaWZ5X3NfdHlwZTsKLQotZW51bSBycGNfbG9jX3ByZWRpY3RlZF9vcmJpdHNfZGF0YV9mb3JtYXRfZV90eXBlIHsKLQlSUENfTE9DX1BSRURJQ1RFRF9PUkJJVFNfWFRSQSA9IDAsCi0JUlBDX0xPQ19QUkVESUNURURfT1JCSVRTX0ZPUk1BVF9NQVggPSAyNjg0MzU0NTYsCi19OwotdHlwZWRlZiBlbnVtIHJwY19sb2NfcHJlZGljdGVkX29yYml0c19kYXRhX2Zvcm1hdF9lX3R5cGUgcnBjX2xvY19wcmVkaWN0ZWRfb3JiaXRzX2RhdGFfZm9ybWF0X2VfdHlwZTsKLQotc3RydWN0IHJwY19sb2NfcHJlZGljdGVkX29yYml0c19kYXRhX3NfdHlwZSB7Ci0JcnBjX2xvY19wcmVkaWN0ZWRfb3JiaXRzX2RhdGFfZm9ybWF0X2VfdHlwZSBmb3JtYXRfdHlwZTsKLQlycGNfdWludDMyIHRvdGFsX3NpemU7Ci0JcnBjX3VpbnQ4IHRvdGFsX3BhcnRzOwotCXJwY191aW50OCBwYXJ0OwotCXJwY191aW50MTYgcGFydF9sZW47Ci0Jc3RydWN0IHsKLQkJdV9pbnQgZGF0YV9wdHJfbGVuOwotCQljaGFyICpkYXRhX3B0cl92YWw7Ci0JfSBkYXRhX3B0cjsKLX07Ci10eXBlZGVmIHN0cnVjdCBycGNfbG9jX3ByZWRpY3RlZF9vcmJpdHNfZGF0YV9zX3R5cGUgcnBjX2xvY19wcmVkaWN0ZWRfb3JiaXRzX2RhdGFfc190eXBlOwotCi1zdHJ1Y3QgcnBjX2xvY19wcmVkaWN0ZWRfb3JiaXRzX2RhdGFfdmFsaWRpdHlfcmVwb3J0X3NfdHlwZSB7Ci0JcnBjX3VpbnQ2NCBzdGFydF90aW1lX3V0YzsKLQlycGNfdWludDE2IHZhbGlkX2R1cmF0aW9uX2hyczsKLX07Ci10eXBlZGVmIHN0cnVjdCBycGNfbG9jX3ByZWRpY3RlZF9vcmJpdHNfZGF0YV92YWxpZGl0eV9yZXBvcnRfc190eXBlIHJwY19sb2NfcHJlZGljdGVkX29yYml0c19kYXRhX3ZhbGlkaXR5X3JlcG9ydF9zX3R5cGU7Ci0KLXN0cnVjdCBycGNfbG9jX3ByZWRpY3RlZF9vcmJpdHNfYXV0b19kb3dubG9hZF9jb25maWdfc190eXBlIHsKLQlycGNfYm9vbGVhbiBlbmFibGU7Ci0JdV9jaGFyIGF1dG9fY2hlY2tfZXZlcnlfaHJzOwotfTsKLXR5cGVkZWYgc3RydWN0IHJwY19sb2NfcHJlZGljdGVkX29yYml0c19hdXRvX2Rvd25sb2FkX2NvbmZpZ19zX3R5cGUgcnBjX2xvY19wcmVkaWN0ZWRfb3JiaXRzX2F1dG9fZG93bmxvYWRfY29uZmlnX3NfdHlwZTsKLQotc3RydWN0IHJwY19sb2NfYXNzaXN0X2RhdGFfdGltZV9zX3R5cGUgewotCXJwY191aW50NjQgdGltZV91dGM7Ci0JcnBjX3VpbnQzMiB1bmNlcnRhaW50eTsKLX07Ci10eXBlZGVmIHN0cnVjdCBycGNfbG9jX2Fzc2lzdF9kYXRhX3RpbWVfc190eXBlIHJwY19sb2NfYXNzaXN0X2RhdGFfdGltZV9zX3R5cGU7Ci0KLXR5cGVkZWYgcnBjX3VpbnQ2NCBycGNfbG9jX2Fzc2lzdF9wb3NfdmFsaWRfbWFza190eXBlOwotCi1zdHJ1Y3QgcnBjX2xvY19hc3Npc3RfZGF0YV9wb3Nfc190eXBlIHsKLQlycGNfbG9jX2Fzc2lzdF9wb3NfdmFsaWRfbWFza190eXBlIHZhbGlkX21hc2s7Ci0JcnBjX3VpbnQ2NCB0aW1lc3RhbXBfdXRjOwotCWRvdWJsZSBsYXRpdHVkZTsKLQlkb3VibGUgbG9uZ2l0dWRlOwotCWZsb2F0IGFsdGl0dWRlX3dydF9lbGxpcHNvaWQ7Ci0JZmxvYXQgYWx0aXR1ZGVfd3J0X21lYW5fc2VhX2xldmVsOwotCWZsb2F0IGhvcl91bmNfY2lyY3VsYXI7Ci0JZmxvYXQgdmVydF91bmM7Ci0JdV9jaGFyIGNvbmZpZGVuY2VfaG9yaXpvbnRhbDsKLQl1X2NoYXIgY29uZmlkZW5jZV92ZXJ0aWNhbDsKLQlycGNfaW50MzIgdGltZXN0YW1wX2FnZTsKLX07Ci10eXBlZGVmIHN0cnVjdCBycGNfbG9jX2Fzc2lzdF9kYXRhX3Bvc19zX3R5cGUgcnBjX2xvY19hc3Npc3RfZGF0YV9wb3Nfc190eXBlOwotCi1lbnVtIHJwY19sb2Nfc2VydmVyX29wZW5fc3RhdHVzX2VfdHlwZSB7Ci0JUlBDX0xPQ19TRVJWRVJfT1BFTl9TVUNDRVNTID0gMSwKLQlSUENfTE9DX1NFUlZFUl9PUEVOX0ZBSUwgPSAyLAotCVJQQ19MT0NfU0VSVkVSX09QRU5fU1RBVFVTX01BWCA9IDI2ODQzNTQ1NiwKLX07Ci10eXBlZGVmIGVudW0gcnBjX2xvY19zZXJ2ZXJfb3Blbl9zdGF0dXNfZV90eXBlIHJwY19sb2Nfc2VydmVyX29wZW5fc3RhdHVzX2VfdHlwZTsKLQotc3RydWN0IHJwY19sb2Nfc2VydmVyX29wZW5fc3RhdHVzX3NfdHlwZSB7Ci0JcnBjX2xvY19zZXJ2ZXJfY29ubmVjdGlvbl9oYW5kbGUgY29ubl9oYW5kbGU7Ci0JcnBjX2xvY19zZXJ2ZXJfb3Blbl9zdGF0dXNfZV90eXBlIG9wZW5fc3RhdHVzOwotCWNoYXIgYXBuX25hbWVbMTAwXTsKLX07Ci10eXBlZGVmIHN0cnVjdCBycGNfbG9jX3NlcnZlcl9vcGVuX3N0YXR1c19zX3R5cGUgcnBjX2xvY19zZXJ2ZXJfb3Blbl9zdGF0dXNfc190eXBlOwotCi1lbnVtIHJwY19sb2Nfc2VydmVyX2Nsb3NlX3N0YXR1c19lX3R5cGUgewotCVJQQ19MT0NfU0VSVkVSX0NMT1NFX1NVQ0NFU1MgPSAxLAotCVJQQ19MT0NfU0VSVkVSX0NMT1NFX0ZBSUwgPSAyLAotCVJQQ19MT0NfU0VSVkVSX0NMT1NFX1NUQVRVU19NQVggPSAyNjg0MzU0NTYsCi19OwotdHlwZWRlZiBlbnVtIHJwY19sb2Nfc2VydmVyX2Nsb3NlX3N0YXR1c19lX3R5cGUgcnBjX2xvY19zZXJ2ZXJfY2xvc2Vfc3RhdHVzX2VfdHlwZTsKLQotc3RydWN0IHJwY19sb2Nfc2VydmVyX2Nsb3NlX3N0YXR1c19zX3R5cGUgewotCXJwY19sb2Nfc2VydmVyX2Nvbm5lY3Rpb25faGFuZGxlIGNvbm5faGFuZGxlOwotCXJwY19sb2Nfc2VydmVyX2Nsb3NlX3N0YXR1c19lX3R5cGUgY2xvc2Vfc3RhdHVzOwotfTsKLXR5cGVkZWYgc3RydWN0IHJwY19sb2Nfc2VydmVyX2Nsb3NlX3N0YXR1c19zX3R5cGUgcnBjX2xvY19zZXJ2ZXJfY2xvc2Vfc3RhdHVzX3NfdHlwZTsKLQotc3RydWN0IHJwY19sb2Nfd2lwZXJfZml4X3RpbWVfc190eXBlIHsKLQlycGNfdWludDMyIHNsb3dfY2xvY2tfY291bnQ7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgcnBjX2xvY193aXBlcl9maXhfdGltZV9zX3R5cGUgcnBjX2xvY193aXBlcl9maXhfdGltZV9zX3R5cGU7Ci0KLXN0cnVjdCBycGNfbG9jX3dpcGVyX2ZpeF9wb3Nfc190eXBlIHsKLQlycGNfaW50MzIgbGF0OwotCXJwY19pbnQzMiBsb247Ci0JcnBjX3VpbnQxNiBIRVBFOwotCXJwY191aW50OCBudW1fb2ZfYXBzX3VzZWQ7Ci0JcnBjX3VpbnQ4IGZpeF9lcnJvcl9jb2RlOwotfTsKLXR5cGVkZWYgc3RydWN0IHJwY19sb2Nfd2lwZXJfZml4X3Bvc19zX3R5cGUgcnBjX2xvY193aXBlcl9maXhfcG9zX3NfdHlwZTsKLQotc3RydWN0IHJwY19sb2Nfd2lwZXJfYXBfaW5mb19zX3R5cGUgewotCWNoYXIgbWFjX2FkZHJbNl07Ci0JcnBjX2ludDMyIHJzc2k7Ci0JcnBjX3VpbnQxNiBjaGFubmVsOwotCXJwY191aW50OCBhcF9xdWFsaWZpZXI7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgcnBjX2xvY193aXBlcl9hcF9pbmZvX3NfdHlwZSBycGNfbG9jX3dpcGVyX2FwX2luZm9fc190eXBlOwotCi1zdHJ1Y3QgcnBjX2xvY193aXBlcl9hcF9zZXRfc190eXBlIHsKLQlycGNfdWludDggbnVtX29mX2FwczsKLQlycGNfbG9jX3dpcGVyX2FwX2luZm9fc190eXBlIGFwX2luZm9bNTBdOwotfTsKLXR5cGVkZWYgc3RydWN0IHJwY19sb2Nfd2lwZXJfYXBfc2V0X3NfdHlwZSBycGNfbG9jX3dpcGVyX2FwX3NldF9zX3R5cGU7Ci0KLXN0cnVjdCBycGNfbG9jX3dpcGVyX3Bvc2l0aW9uX3JlcG9ydF9zX3R5cGUgewotCXJwY191aW50OCB3aXBlcl92YWxpZF9pbmZvX2ZsYWc7Ci0JcnBjX2xvY193aXBlcl9maXhfdGltZV9zX3R5cGUgd2lwZXJfZml4X3RpbWU7Ci0JcnBjX2xvY193aXBlcl9maXhfcG9zX3NfdHlwZSB3aXBlcl9maXhfcG9zaXRpb247Ci0JcnBjX2xvY193aXBlcl9hcF9zZXRfc190eXBlIHdpcGVyX2FwX3NldDsKLX07Ci10eXBlZGVmIHN0cnVjdCBycGNfbG9jX3dpcGVyX3Bvc2l0aW9uX3JlcG9ydF9zX3R5cGUgcnBjX2xvY193aXBlcl9wb3NpdGlvbl9yZXBvcnRfc190eXBlOwotCi1lbnVtIHJwY19sb2Nfd2lwZXJfc3RhdHVzX2VfdHlwZSB7Ci0JUlBDX0xPQ19XSVBFUl9TVEFUVVNfQVZBSUxBQkxFID0gMSwKLQlSUENfTE9DX1dJUEVSX1NUQVRVU19VTkFWQUlMQUJMRSA9IDIsCi0JUlBDX0xPQ19XSVBFUl9TVEFUVVNfRV9TSVpFID0gMjY4NDM1NDU2LAotfTsKLXR5cGVkZWYgZW51bSBycGNfbG9jX3dpcGVyX3N0YXR1c19lX3R5cGUgcnBjX2xvY193aXBlcl9zdGF0dXNfZV90eXBlOwotCi1lbnVtIHJwY19sb2NfZnNfb3BlcmF0aW9uX2VfdHlwZSB7Ci0JUlBDX0xPQ19GU19DUkVBVEVfV1JJVEVfRklMRSA9IDEsCi0JUlBDX0xPQ19GU19BUFBFTkRfRklMRSA9IDIsCi0JUlBDX0xPQ19GU19ERUxFVEVfRklMRSA9IDMsCi0JUlBDX0xPQ19GU19SRUFEX0ZJTEUgPSA0LAotCVJQQ19MT0NfRlNfTUFYID0gMjY4NDM1NDU2LAotfTsKLXR5cGVkZWYgZW51bSBycGNfbG9jX2ZzX29wZXJhdGlvbl9lX3R5cGUgcnBjX2xvY19mc19vcGVyYXRpb25fZV90eXBlOwotCi1zdHJ1Y3QgcnBjX2xvY19lZnNfZGF0YV9zX3R5cGUgewotCWNoYXIgZmlsZW5hbWVbNjRdOwotCXJwY19sb2NfZnNfb3BlcmF0aW9uX2VfdHlwZSBvcGVyYXRpb247Ci0JcnBjX3VpbnQzMiB0b3RhbF9zaXplOwotCXN0cnVjdCB7Ci0JCXVfaW50IGRhdGFfcHRyX2xlbjsKLQkJY2hhciAqZGF0YV9wdHJfdmFsOwotCX0gZGF0YV9wdHI7Ci0JcnBjX3VpbnQzMiBwYXJ0X2xlbjsKLQlycGNfdWludDggcGFydDsKLQlycGNfdWludDggdG90YWxfcGFydHM7Ci0JcnBjX3VpbnQzMiByZXNlcnZlZDsKLX07Ci10eXBlZGVmIHN0cnVjdCBycGNfbG9jX2Vmc19kYXRhX3NfdHlwZSBycGNfbG9jX2Vmc19kYXRhX3NfdHlwZTsKLQotZW51bSBycGNfbG9jX2xvY2tfZV90eXBlIHsKLQlSUENfTE9DX0xPQ0tfTk9ORSA9IDEsCi0JUlBDX0xPQ19MT0NLX01JID0gMiwKLQlSUENfTE9DX0xPQ0tfTVQgPSAzLAotCVJQQ19MT0NfTE9DS19BTEwgPSA0LAotCVJQQ19MT0NfTE9DS19NQVggPSAyNjg0MzU0NTYsCi19OwotdHlwZWRlZiBlbnVtIHJwY19sb2NfbG9ja19lX3R5cGUgcnBjX2xvY19sb2NrX2VfdHlwZTsKLQotdHlwZWRlZiBycGNfdWludDMyIHJwY19sb2Nfbm1lYV9zZW50ZW5jZV90eXBlOwotCi10eXBlZGVmIHJwY191aW50MzIgcnBjX2xvY19hc3Npc3RfZGF0YV90eXBlOwotCi1zdHJ1Y3QgcnBjX2xvY19hc3Npc3RfZGF0YV9kZWxldGVfc190eXBlIHsKLQlycGNfbG9jX2Fzc2lzdF9kYXRhX3R5cGUgdHlwZTsKLQlycGNfdWludDMyIHJlc2VydmVkWzhdOwotfTsKLXR5cGVkZWYgc3RydWN0IHJwY19sb2NfYXNzaXN0X2RhdGFfZGVsZXRlX3NfdHlwZSBycGNfbG9jX2Fzc2lzdF9kYXRhX2RlbGV0ZV9zX3R5cGU7Ci0KLXN0cnVjdCBycGNfbG9jX2lvY3RsX2RhdGFfdV90eXBlIHsKLQlycGNfbG9jX2lvY3RsX2VfdHlwZSBkaXNjOwotCXVuaW9uIHsKLQkJcnBjX2xvY19maXhfY3JpdGVyaWFfc190eXBlIGZpeF9jcml0ZXJpYTsKLQkJcnBjX2xvY191c2VyX3ZlcmlmeV9zX3R5cGUgdXNlcl92ZXJpZnlfcmVzcDsKLQkJcnBjX2xvY19wcmVkaWN0ZWRfb3JiaXRzX2RhdGFfc190eXBlIHByZWRpY3RlZF9vcmJpdHNfZGF0YTsKLQkJcnBjX2xvY19wcmVkaWN0ZWRfb3JiaXRzX2F1dG9fZG93bmxvYWRfY29uZmlnX3NfdHlwZSBwcmVkaWN0ZWRfb3JiaXRzX2F1dG9fZG93bmxvYWQ7Ci0JCXJwY19sb2NfYXNzaXN0X2RhdGFfdGltZV9zX3R5cGUgYXNzaXN0YW5jZV9kYXRhX3RpbWU7Ci0JCXJwY19sb2NfYXNzaXN0X2RhdGFfcG9zX3NfdHlwZSBhc3Npc3RhbmNlX2RhdGFfcG9zaXRpb247Ci0JCXJwY19sb2Nfc2VydmVyX29wZW5fc3RhdHVzX3NfdHlwZSBjb25uX29wZW5fc3RhdHVzOwotCQlycGNfbG9jX3NlcnZlcl9jbG9zZV9zdGF0dXNfc190eXBlIGNvbm5fY2xvc2Vfc3RhdHVzOwotCQlycGNfbG9jX3dpcGVyX3Bvc2l0aW9uX3JlcG9ydF9zX3R5cGUgd2lwZXJfcG9zOwotCQlycGNfbG9jX3dpcGVyX3N0YXR1c19lX3R5cGUgd2lwZXJfc3RhdHVzOwotCQlycGNfbG9jX2xvY2tfZV90eXBlIGVuZ2luZV9sb2NrOwotCQlycGNfYm9vbGVhbiBzYmFzX21vZGU7Ci0JCXJwY19sb2Nfbm1lYV9zZW50ZW5jZV90eXBlIG5tZWFfdHlwZXM7Ci0JCXJwY19ib29sZWFuIG9uX2RlbWFuZF9scG07Ci0JCXJwY19sb2Nfc2VydmVyX2luZm9fc190eXBlIHNlcnZlcl9hZGRyOwotCQlycGNfbG9jX2Fzc2lzdF9kYXRhX2RlbGV0ZV9zX3R5cGUgYXNzaXN0X2RhdGFfZGVsZXRlOwotCQlycGNfbG9jX2Vmc19kYXRhX3NfdHlwZSBlZnNfZGF0YTsKLQl9IHJwY19sb2NfaW9jdGxfZGF0YV91X3R5cGVfdTsKLX07Ci10eXBlZGVmIHN0cnVjdCBycGNfbG9jX2lvY3RsX2RhdGFfdV90eXBlIHJwY19sb2NfaW9jdGxfZGF0YV91X3R5cGU7Ci0KLXN0cnVjdCBycGNfbG9jX2lvY3RsX2NhbGxiYWNrX2RhdGFfdV90eXBlIHsKLQlycGNfbG9jX2lvY3RsX2VfdHlwZSBkaXNjOwotCXVuaW9uIHsKLQkJcnBjX2xvY19hcGlfdmVyc2lvbl9zX3R5cGUgYXBpX3ZlcnNpb247Ci0JCXJwY19sb2NfZml4X2NyaXRlcmlhX3NfdHlwZSBmaXhfY3JpdGVyaWE7Ci0JCXJwY19sb2NfbG9ja19lX3R5cGUgZW5naW5lX2xvY2s7Ci0JCXJwY19ib29sZWFuIHNiYXNfbW9kZTsKLQkJcnBjX2xvY19ubWVhX3NlbnRlbmNlX3R5cGUgbm1lYV90eXBlczsKLQkJcnBjX2Jvb2xlYW4gb25fZGVtYW5kX2xwbTsKLQkJcnBjX2xvY19zZXJ2ZXJfaW5mb19zX3R5cGUgc2VydmVyX2FkZHI7Ci0JCXJwY19sb2NfcHJlZGljdGVkX29yYml0c19kYXRhX3NvdXJjZV9zX3R5cGUgcHJlZGljdGVkX29yYml0c19kYXRhX3NvdXJjZTsKLQkJcnBjX2xvY19wcmVkaWN0ZWRfb3JiaXRzX2RhdGFfdmFsaWRpdHlfcmVwb3J0X3NfdHlwZSBwcmVkaWN0ZWRfb3JiaXRzX2RhdGFfdmFsaWRpdHk7Ci0JfSBycGNfbG9jX2lvY3RsX2NhbGxiYWNrX2RhdGFfdV90eXBlX3U7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgcnBjX2xvY19pb2N0bF9jYWxsYmFja19kYXRhX3VfdHlwZSBycGNfbG9jX2lvY3RsX2NhbGxiYWNrX2RhdGFfdV90eXBlOwotCi1zdHJ1Y3QgcnBjX2xvY19pb2N0bF9jYWxsYmFja19zX3R5cGUgewotCXJwY19sb2NfaW9jdGxfZV90eXBlIHR5cGU7Ci0JcnBjX2ludDMyIHN0YXR1czsKLQlycGNfbG9jX2lvY3RsX2NhbGxiYWNrX2RhdGFfdV90eXBlIGRhdGE7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgcnBjX2xvY19pb2N0bF9jYWxsYmFja19zX3R5cGUgcnBjX2xvY19pb2N0bF9jYWxsYmFja19zX3R5cGU7Ci0KLXN0cnVjdCBycGNfbG9jX2V2ZW50X3BheWxvYWRfdV90eXBlIHsKLQl1X3F1YWRfdCBkaXNjOwotCXVuaW9uIHsKLQkJcnBjX2xvY19wYXJzZWRfcG9zaXRpb25fc190eXBlIHBhcnNlZF9sb2NhdGlvbl9yZXBvcnQ7Ci0JCXJwY19sb2NfZ25zc19pbmZvX3NfdHlwZSBnbnNzX3JlcG9ydDsKLQkJcnBjX2xvY19ubWVhX3JlcG9ydF9zX3R5cGUgbm1lYV9yZXBvcnQ7Ci0JCXJwY19sb2NfbmlfZXZlbnRfc190eXBlIG5pX3JlcXVlc3Q7Ci0JCXJwY19sb2NfYXNzaXN0X2RhdGFfcmVxdWVzdF9zX3R5cGUgYXNzaXN0X2RhdGFfcmVxdWVzdDsKLQkJcnBjX2xvY19zZXJ2ZXJfcmVxdWVzdF9zX3R5cGUgbG9jX3NlcnZlcl9yZXF1ZXN0OwotCQlycGNfbG9jX2lvY3RsX2NhbGxiYWNrX3NfdHlwZSBpb2N0bF9yZXBvcnQ7Ci0JCXJwY19sb2Nfc3RhdHVzX2V2ZW50X3NfdHlwZSBzdGF0dXNfcmVwb3J0OwotCQlycGNfbG9jX3F3aXBfcmVxdWVzdF9zX3R5cGUgcXdpcF9yZXF1ZXN0OwotCQlycGNfbG9jX3Jlc2VydmVkX3BheWxvYWRfc190eXBlIHJlc2VydmVkOwotCX0gcnBjX2xvY19ldmVudF9wYXlsb2FkX3VfdHlwZV91OwotfTsKLXR5cGVkZWYgc3RydWN0IHJwY19sb2NfZXZlbnRfcGF5bG9hZF91X3R5cGUgcnBjX2xvY19ldmVudF9wYXlsb2FkX3VfdHlwZTsKLQotLyogdGhlIHhkciBmdW5jdGlvbnMgKi8KLQotI2lmIGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoX19jcGx1c3BsdXMpCi1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2Jvb2xlYW4gKFhEUiAqLCBycGNfYm9vbGVhbiopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY191aW50MzIgKFhEUiAqLCBycGNfdWludDMyKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX3VpbnQxNiAoWERSICosIHJwY191aW50MTYqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfdWludDggKFhEUiAqLCBycGNfdWludDgqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfaW50MzIgKFhEUiAqLCBycGNfaW50MzIqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfYnl0ZSAoWERSICosIHJwY19ieXRlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX3VpbnQ2NCAoWERSICosIHJwY191aW50NjQqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX2NsaWVudF9oYW5kbGVfdHlwZSAoWERSICosIHJwY19sb2NfY2xpZW50X2hhbmRsZV90eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19ldmVudF9tYXNrX3R5cGUgKFhEUiAqLCBycGNfbG9jX2V2ZW50X21hc2tfdHlwZSopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2NfcG9zaXRpb25fdmFsaWRfbWFza190eXBlIChYRFIgKiwgcnBjX2xvY19wb3NpdGlvbl92YWxpZF9tYXNrX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX3Bvc190ZWNobm9sb2d5X21hc2tfdHlwZSAoWERSICosIHJwY19sb2NfcG9zX3RlY2hub2xvZ3lfbWFza190eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19zZXNzaW9uX3N0YXR1c19lX3R5cGUgKFhEUiAqLCBycGNfbG9jX3Nlc3Npb25fc3RhdHVzX2VfdHlwZSopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2NfY2FsZW5kYXJfdGltZV9zX3R5cGUgKFhEUiAqLCBycGNfbG9jX2NhbGVuZGFyX3RpbWVfc190eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19wYXJzZWRfcG9zaXRpb25fc190eXBlIChYRFIgKiwgcnBjX2xvY19wYXJzZWRfcG9zaXRpb25fc190eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19zdl9zeXN0ZW1fZV90eXBlIChYRFIgKiwgcnBjX2xvY19zdl9zeXN0ZW1fZV90eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19zdl9zdGF0dXNfZV90eXBlIChYRFIgKiwgcnBjX2xvY19zdl9zdGF0dXNfZV90eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19zdl9pbmZvX3ZhbGlkX21hc2tfdHlwZSAoWERSICosIHJwY19sb2Nfc3ZfaW5mb192YWxpZF9tYXNrX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX3N2X2luZm9fc190eXBlIChYRFIgKiwgcnBjX2xvY19zdl9pbmZvX3NfdHlwZSopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2NfZ25zc19pbmZvX3ZhbGlkX21hc2tfdHlwZSAoWERSICosIHJwY19sb2NfZ25zc19pbmZvX3ZhbGlkX21hc2tfdHlwZSopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2NfZ25zc19pbmZvX3NfdHlwZSAoWERSICosIHJwY19sb2NfZ25zc19pbmZvX3NfdHlwZSopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2Nfbm1lYV9yZXBvcnRfc190eXBlIChYRFIgKiwgcnBjX2xvY19ubWVhX3JlcG9ydF9zX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX3N0YXR1c19ldmVudF9lX3R5cGUgKFhEUiAqLCBycGNfbG9jX3N0YXR1c19ldmVudF9lX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX2VuZ2luZV9zdGF0ZV9lX3R5cGUgKFhEUiAqLCBycGNfbG9jX2VuZ2luZV9zdGF0ZV9lX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX2ZpeF9zZXNzaW9uX3N0YXRlX2VfdHlwZSAoWERSICosIHJwY19sb2NfZml4X3Nlc3Npb25fc3RhdGVfZV90eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19zdGF0dXNfZXZlbnRfcGF5bG9hZF91X3R5cGUgKFhEUiAqLCBycGNfbG9jX3N0YXR1c19ldmVudF9wYXlsb2FkX3VfdHlwZSopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2Nfc3RhdHVzX2V2ZW50X3NfdHlwZSAoWERSICosIHJwY19sb2Nfc3RhdHVzX2V2ZW50X3NfdHlwZSopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2Nfc2VydmVyX2FkZHJfZV90eXBlIChYRFIgKiwgcnBjX2xvY19zZXJ2ZXJfYWRkcl9lX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX3NlcnZlcl9hZGRyX2lwdjRfdHlwZSAoWERSICosIHJwY19sb2Nfc2VydmVyX2FkZHJfaXB2NF90eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19zZXJ2ZXJfYWRkcl91cmxfdHlwZSAoWERSICosIHJwY19sb2Nfc2VydmVyX2FkZHJfdXJsX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX3NlcnZlcl9hZGRyX3VfdHlwZSAoWERSICosIHJwY19sb2Nfc2VydmVyX2FkZHJfdV90eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19zZXJ2ZXJfaW5mb19zX3R5cGUgKFhEUiAqLCBycGNfbG9jX3NlcnZlcl9pbmZvX3NfdHlwZSopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2Nfbmlfbm90aWZ5X3ZlcmlmeV9lX3R5cGUgKFhEUiAqLCBycGNfbG9jX25pX25vdGlmeV92ZXJpZnlfZV90eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19uaV9ldmVudF9lX3R5cGUgKFhEUiAqLCBycGNfbG9jX25pX2V2ZW50X2VfdHlwZSopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2NfbmlfZGF0YWNvZGluZ19zY2hlbWVfZV90eXBlIChYRFIgKiwgcnBjX2xvY19uaV9kYXRhY29kaW5nX3NjaGVtZV9lX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX25pX3Z4X3JlcXVlc3Rlcl9pZF9lbmNvZGluZ19zY2hlbWVfZV90eXBlIChYRFIgKiwgcnBjX2xvY19uaV92eF9yZXF1ZXN0ZXJfaWRfZW5jb2Rpbmdfc2NoZW1lX2VfdHlwZSopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2NfbmlfdnhfcG9zX21vZGVfZV90eXBlIChYRFIgKiwgcnBjX2xvY19uaV92eF9wb3NfbW9kZV9lX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX25pX3Z4X3JlcXVlc3Rlcl9pZF9zX3R5cGUgKFhEUiAqLCBycGNfbG9jX25pX3Z4X3JlcXVlc3Rlcl9pZF9zX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX25pX3Z4X25vdGlmeV92ZXJpZnlfcmVxX3NfdHlwZSAoWERSICosIHJwY19sb2Nfbmlfdnhfbm90aWZ5X3ZlcmlmeV9yZXFfc190eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19uaV9zdXBsX3Bvc19tZXRob2RfZV90eXBlIChYRFIgKiwgcnBjX2xvY19uaV9zdXBsX3Bvc19tZXRob2RfZV90eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19uaV9zdXBsX3NscF9zZXNzaW9uX2lkX3NfdHlwZSAoWERSICosIHJwY19sb2Nfbmlfc3VwbF9zbHBfc2Vzc2lvbl9pZF9zX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX25pX3JlcXVlc3Rvcl9pZF9zX3R5cGUgKFhEUiAqLCBycGNfbG9jX25pX3JlcXVlc3Rvcl9pZF9zX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX25pX3N1cGxfY2xpZW50X25hbWVfc190eXBlIChYRFIgKiwgcnBjX2xvY19uaV9zdXBsX2NsaWVudF9uYW1lX3NfdHlwZSopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2Nfbmlfc3VwbF9xb3Bfc190eXBlIChYRFIgKiwgcnBjX2xvY19uaV9zdXBsX3FvcF9zX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX25pX3N1cGxfbm90aWZ5X3ZlcmlmeV9yZXFfc190eXBlIChYRFIgKiwgcnBjX2xvY19uaV9zdXBsX25vdGlmeV92ZXJpZnlfcmVxX3NfdHlwZSopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2NfbmlfZXh0X2NsaWVudF9hZGRyZXNzX3NfdHlwZSAoWERSICosIHJwY19sb2NfbmlfZXh0X2NsaWVudF9hZGRyZXNzX3NfdHlwZSopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2NfbmlfbG9jYXRpb25fdHlwZV9lX3R5cGUgKFhEUiAqLCBycGNfbG9jX25pX2xvY2F0aW9uX3R5cGVfZV90eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19uaV9kZWZlcnJlZF9sb2NhdGlvbl9zX3R5cGUgKFhEUiAqLCBycGNfbG9jX25pX2RlZmVycmVkX2xvY2F0aW9uX3NfdHlwZSopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2NfbmlfY29kZXdvcmRfc3RyaW5nX3NfdHlwZSAoWERSICosIHJwY19sb2NfbmlfY29kZXdvcmRfc3RyaW5nX3NfdHlwZSopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2Nfbmlfc2VydmljZV90eXBlX2lkX3NfdHlwZSAoWERSICosIHJwY19sb2Nfbmlfc2VydmljZV90eXBlX2lkX3NfdHlwZSopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2NfbmlfdW10c19jcF9ub3RpZnlfdmVyaWZ5X3JlcV9zX3R5cGUgKFhEUiAqLCBycGNfbG9jX25pX3VtdHNfY3Bfbm90aWZ5X3ZlcmlmeV9yZXFfc190eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19uaV9zZXJ2aWNlX2ludGVyYWN0aW9uX2VfdHlwZSAoWERSICosIHJwY19sb2Nfbmlfc2VydmljZV9pbnRlcmFjdGlvbl9lX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX25pX3Z4X3NlcnZpY2VfaW50ZXJhY3Rpb25fcmVxX3NfdHlwZSAoWERSICosIHJwY19sb2Nfbmlfdnhfc2VydmljZV9pbnRlcmFjdGlvbl9yZXFfc190eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19uaV9ldmVudF9wYXlsb2FkX3VfdHlwZSAoWERSICosIHJwY19sb2NfbmlfZXZlbnRfcGF5bG9hZF91X3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX25pX2V2ZW50X3NfdHlwZSAoWERSICosIHJwY19sb2NfbmlfZXZlbnRfc190eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19hc3Npc3RfZGF0YV9yZXF1ZXN0X2VfdHlwZSAoWERSICosIHJwY19sb2NfYXNzaXN0X2RhdGFfcmVxdWVzdF9lX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfc3RydWN0X2xvY190aW1lX2Rvd25sb2FkX3NvdXJjZV9zX3R5cGVfc2VydmVyc19wdHIgKFhEUiAqLCBycGNfc3RydWN0X2xvY190aW1lX2Rvd25sb2FkX3NvdXJjZV9zX3R5cGVfc2VydmVyc19wdHIqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfc3RydWN0X2xvY190aW1lX2Rvd25sb2FkX3NvdXJjZV9zX3R5cGVfc2VydmVycyAoWERSICosIHJwY19zdHJ1Y3RfbG9jX3RpbWVfZG93bmxvYWRfc291cmNlX3NfdHlwZV9zZXJ2ZXJzKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX3RpbWVfZG93bmxvYWRfc291cmNlX3NfdHlwZSAoWERSICosIHJwY19sb2NfdGltZV9kb3dubG9hZF9zb3VyY2Vfc190eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX3N0cnVjdF9sb2NfcHJlZGljdGVkX29yYml0c19kYXRhX3NvdXJjZV9zX3R5cGVfc2VydmVyc19wdHIgKFhEUiAqLCBycGNfc3RydWN0X2xvY19wcmVkaWN0ZWRfb3JiaXRzX2RhdGFfc291cmNlX3NfdHlwZV9zZXJ2ZXJzX3B0ciopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19zdHJ1Y3RfbG9jX3ByZWRpY3RlZF9vcmJpdHNfZGF0YV9zb3VyY2Vfc190eXBlX3NlcnZlcnMgKFhEUiAqLCBycGNfc3RydWN0X2xvY19wcmVkaWN0ZWRfb3JiaXRzX2RhdGFfc291cmNlX3NfdHlwZV9zZXJ2ZXJzKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX3ByZWRpY3RlZF9vcmJpdHNfZGF0YV9zb3VyY2Vfc190eXBlIChYRFIgKiwgcnBjX2xvY19wcmVkaWN0ZWRfb3JiaXRzX2RhdGFfc291cmNlX3NfdHlwZSopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2NfYXNzaXN0X2RhdGFfcmVxdWVzdF9wYXlsb2FkX3VfdHlwZSAoWERSICosIHJwY19sb2NfYXNzaXN0X2RhdGFfcmVxdWVzdF9wYXlsb2FkX3VfdHlwZSopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2NfYXNzaXN0X2RhdGFfcmVxdWVzdF9zX3R5cGUgKFhEUiAqLCBycGNfbG9jX2Fzc2lzdF9kYXRhX3JlcXVlc3Rfc190eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19zZXJ2ZXJfY29ubmVjdGlvbl9oYW5kbGUgKFhEUiAqLCBycGNfbG9jX3NlcnZlcl9jb25uZWN0aW9uX2hhbmRsZSopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2Nfc2VydmVyX3Byb3RvY29sX2VfdHlwZSAoWERSICosIHJwY19sb2Nfc2VydmVyX3Byb3RvY29sX2VfdHlwZSopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2Nfc2VydmVyX3JlcXVlc3RfZV90eXBlIChYRFIgKiwgcnBjX2xvY19zZXJ2ZXJfcmVxdWVzdF9lX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX3NlcnZlcl9vcGVuX3JlcV9zX3R5cGUgKFhEUiAqLCBycGNfbG9jX3NlcnZlcl9vcGVuX3JlcV9zX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX3NlcnZlcl9jbG9zZV9yZXFfc190eXBlIChYRFIgKiwgcnBjX2xvY19zZXJ2ZXJfY2xvc2VfcmVxX3NfdHlwZSopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2Nfc2VydmVyX3JlcXVlc3RfdV90eXBlIChYRFIgKiwgcnBjX2xvY19zZXJ2ZXJfcmVxdWVzdF91X3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX3NlcnZlcl9yZXF1ZXN0X3NfdHlwZSAoWERSICosIHJwY19sb2Nfc2VydmVyX3JlcXVlc3Rfc190eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19xd2lwX3JlcXVlc3RfZV90eXBlIChYRFIgKiwgcnBjX2xvY19xd2lwX3JlcXVlc3RfZV90eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19xd2lwX3JlcXVlc3Rfc190eXBlIChYRFIgKiwgcnBjX2xvY19xd2lwX3JlcXVlc3Rfc190eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19yZXNlcnZlZF9wYXlsb2FkX3NfdHlwZSAoWERSICosIHJwY19sb2NfcmVzZXJ2ZWRfcGF5bG9hZF9zX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX2lvY3RsX2VfdHlwZSAoWERSICosIHJwY19sb2NfaW9jdGxfZV90eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19hcGlfdmVyc2lvbl9zX3R5cGUgKFhEUiAqLCBycGNfbG9jX2FwaV92ZXJzaW9uX3NfdHlwZSopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2NfZml4X3JlY3VycmVuY2VfZV90eXBlIChYRFIgKiwgcnBjX2xvY19maXhfcmVjdXJyZW5jZV9lX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX29wZXJhdGlvbl9tb2RlX2VfdHlwZSAoWERSICosIHJwY19sb2Nfb3BlcmF0aW9uX21vZGVfZV90eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19ub3RpZnlfZV90eXBlIChYRFIgKiwgcnBjX2xvY19ub3RpZnlfZV90eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19maXhfY3JpdGVyaWFfc190eXBlIChYRFIgKiwgcnBjX2xvY19maXhfY3JpdGVyaWFfc190eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19uaV91c2VyX3Jlc3BfZV90eXBlIChYRFIgKiwgcnBjX2xvY19uaV91c2VyX3Jlc3BfZV90eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY191c2VyX3ZlcmlmeV9zX3R5cGUgKFhEUiAqLCBycGNfbG9jX3VzZXJfdmVyaWZ5X3NfdHlwZSopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2NfcHJlZGljdGVkX29yYml0c19kYXRhX2Zvcm1hdF9lX3R5cGUgKFhEUiAqLCBycGNfbG9jX3ByZWRpY3RlZF9vcmJpdHNfZGF0YV9mb3JtYXRfZV90eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19wcmVkaWN0ZWRfb3JiaXRzX2RhdGFfc190eXBlIChYRFIgKiwgcnBjX2xvY19wcmVkaWN0ZWRfb3JiaXRzX2RhdGFfc190eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19wcmVkaWN0ZWRfb3JiaXRzX2RhdGFfdmFsaWRpdHlfcmVwb3J0X3NfdHlwZSAoWERSICosIHJwY19sb2NfcHJlZGljdGVkX29yYml0c19kYXRhX3ZhbGlkaXR5X3JlcG9ydF9zX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX3ByZWRpY3RlZF9vcmJpdHNfYXV0b19kb3dubG9hZF9jb25maWdfc190eXBlIChYRFIgKiwgcnBjX2xvY19wcmVkaWN0ZWRfb3JiaXRzX2F1dG9fZG93bmxvYWRfY29uZmlnX3NfdHlwZSopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2NfYXNzaXN0X2RhdGFfdGltZV9zX3R5cGUgKFhEUiAqLCBycGNfbG9jX2Fzc2lzdF9kYXRhX3RpbWVfc190eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19hc3Npc3RfcG9zX3ZhbGlkX21hc2tfdHlwZSAoWERSICosIHJwY19sb2NfYXNzaXN0X3Bvc192YWxpZF9tYXNrX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX2Fzc2lzdF9kYXRhX3Bvc19zX3R5cGUgKFhEUiAqLCBycGNfbG9jX2Fzc2lzdF9kYXRhX3Bvc19zX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX3NlcnZlcl9vcGVuX3N0YXR1c19lX3R5cGUgKFhEUiAqLCBycGNfbG9jX3NlcnZlcl9vcGVuX3N0YXR1c19lX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX3NlcnZlcl9vcGVuX3N0YXR1c19zX3R5cGUgKFhEUiAqLCBycGNfbG9jX3NlcnZlcl9vcGVuX3N0YXR1c19zX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX3NlcnZlcl9jbG9zZV9zdGF0dXNfZV90eXBlIChYRFIgKiwgcnBjX2xvY19zZXJ2ZXJfY2xvc2Vfc3RhdHVzX2VfdHlwZSopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2Nfc2VydmVyX2Nsb3NlX3N0YXR1c19zX3R5cGUgKFhEUiAqLCBycGNfbG9jX3NlcnZlcl9jbG9zZV9zdGF0dXNfc190eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY193aXBlcl9maXhfdGltZV9zX3R5cGUgKFhEUiAqLCBycGNfbG9jX3dpcGVyX2ZpeF90aW1lX3NfdHlwZSopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2Nfd2lwZXJfZml4X3Bvc19zX3R5cGUgKFhEUiAqLCBycGNfbG9jX3dpcGVyX2ZpeF9wb3Nfc190eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY193aXBlcl9hcF9pbmZvX3NfdHlwZSAoWERSICosIHJwY19sb2Nfd2lwZXJfYXBfaW5mb19zX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX3dpcGVyX2FwX3NldF9zX3R5cGUgKFhEUiAqLCBycGNfbG9jX3dpcGVyX2FwX3NldF9zX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX3dpcGVyX3Bvc2l0aW9uX3JlcG9ydF9zX3R5cGUgKFhEUiAqLCBycGNfbG9jX3dpcGVyX3Bvc2l0aW9uX3JlcG9ydF9zX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX3dpcGVyX3N0YXR1c19lX3R5cGUgKFhEUiAqLCBycGNfbG9jX3dpcGVyX3N0YXR1c19lX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX2ZzX29wZXJhdGlvbl9lX3R5cGUgKFhEUiAqLCBycGNfbG9jX2ZzX29wZXJhdGlvbl9lX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX2Vmc19kYXRhX3NfdHlwZSAoWERSICosIHJwY19sb2NfZWZzX2RhdGFfc190eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19sb2NrX2VfdHlwZSAoWERSICosIHJwY19sb2NfbG9ja19lX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX25tZWFfc2VudGVuY2VfdHlwZSAoWERSICosIHJwY19sb2Nfbm1lYV9zZW50ZW5jZV90eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19hc3Npc3RfZGF0YV90eXBlIChYRFIgKiwgcnBjX2xvY19hc3Npc3RfZGF0YV90eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19hc3Npc3RfZGF0YV9kZWxldGVfc190eXBlIChYRFIgKiwgcnBjX2xvY19hc3Npc3RfZGF0YV9kZWxldGVfc190eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19pb2N0bF9kYXRhX3VfdHlwZSAoWERSICosIHJwY19sb2NfaW9jdGxfZGF0YV91X3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX2lvY3RsX2NhbGxiYWNrX2RhdGFfdV90eXBlIChYRFIgKiwgcnBjX2xvY19pb2N0bF9jYWxsYmFja19kYXRhX3VfdHlwZSopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2NfaW9jdGxfY2FsbGJhY2tfc190eXBlIChYRFIgKiwgcnBjX2xvY19pb2N0bF9jYWxsYmFja19zX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX2V2ZW50X3BheWxvYWRfdV90eXBlIChYRFIgKiwgcnBjX2xvY19ldmVudF9wYXlsb2FkX3VfdHlwZSopOwotCi0jZWxzZSAvKiBLJlIgQyAqLwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2Jvb2xlYW4gKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfdWludDMyICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX3VpbnQxNiAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY191aW50OCAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19pbnQzMiAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19ieXRlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX3VpbnQ2NCAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2NfY2xpZW50X2hhbmRsZV90eXBlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19ldmVudF9tYXNrX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX3Bvc2l0aW9uX3ZhbGlkX21hc2tfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2NfcG9zX3RlY2hub2xvZ3lfbWFza190eXBlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19zZXNzaW9uX3N0YXR1c19lX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX2NhbGVuZGFyX3RpbWVfc190eXBlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19wYXJzZWRfcG9zaXRpb25fc190eXBlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19zdl9zeXN0ZW1fZV90eXBlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19zdl9zdGF0dXNfZV90eXBlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19zdl9pbmZvX3ZhbGlkX21hc2tfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2Nfc3ZfaW5mb19zX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX2duc3NfaW5mb192YWxpZF9tYXNrX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX2duc3NfaW5mb19zX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX25tZWFfcmVwb3J0X3NfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2Nfc3RhdHVzX2V2ZW50X2VfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2NfZW5naW5lX3N0YXRlX2VfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2NfZml4X3Nlc3Npb25fc3RhdGVfZV90eXBlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19zdGF0dXNfZXZlbnRfcGF5bG9hZF91X3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX3N0YXR1c19ldmVudF9zX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX3NlcnZlcl9hZGRyX2VfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2Nfc2VydmVyX2FkZHJfaXB2NF90eXBlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19zZXJ2ZXJfYWRkcl91cmxfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2Nfc2VydmVyX2FkZHJfdV90eXBlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19zZXJ2ZXJfaW5mb19zX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX25pX25vdGlmeV92ZXJpZnlfZV90eXBlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19uaV9ldmVudF9lX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX25pX2RhdGFjb2Rpbmdfc2NoZW1lX2VfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2NfbmlfdnhfcmVxdWVzdGVyX2lkX2VuY29kaW5nX3NjaGVtZV9lX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX25pX3Z4X3Bvc19tb2RlX2VfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2NfbmlfdnhfcmVxdWVzdGVyX2lkX3NfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2Nfbmlfdnhfbm90aWZ5X3ZlcmlmeV9yZXFfc190eXBlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19uaV9zdXBsX3Bvc19tZXRob2RfZV90eXBlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19uaV9zdXBsX3NscF9zZXNzaW9uX2lkX3NfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2NfbmlfcmVxdWVzdG9yX2lkX3NfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2Nfbmlfc3VwbF9jbGllbnRfbmFtZV9zX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX25pX3N1cGxfcW9wX3NfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2Nfbmlfc3VwbF9ub3RpZnlfdmVyaWZ5X3JlcV9zX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX25pX2V4dF9jbGllbnRfYWRkcmVzc19zX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX25pX2xvY2F0aW9uX3R5cGVfZV90eXBlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19uaV9kZWZlcnJlZF9sb2NhdGlvbl9zX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX25pX2NvZGV3b3JkX3N0cmluZ19zX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX25pX3NlcnZpY2VfdHlwZV9pZF9zX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX25pX3VtdHNfY3Bfbm90aWZ5X3ZlcmlmeV9yZXFfc190eXBlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19uaV9zZXJ2aWNlX2ludGVyYWN0aW9uX2VfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2Nfbmlfdnhfc2VydmljZV9pbnRlcmFjdGlvbl9yZXFfc190eXBlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19uaV9ldmVudF9wYXlsb2FkX3VfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2NfbmlfZXZlbnRfc190eXBlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19hc3Npc3RfZGF0YV9yZXF1ZXN0X2VfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19zdHJ1Y3RfbG9jX3RpbWVfZG93bmxvYWRfc291cmNlX3NfdHlwZV9zZXJ2ZXJzX3B0ciAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19zdHJ1Y3RfbG9jX3RpbWVfZG93bmxvYWRfc291cmNlX3NfdHlwZV9zZXJ2ZXJzICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY190aW1lX2Rvd25sb2FkX3NvdXJjZV9zX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfc3RydWN0X2xvY19wcmVkaWN0ZWRfb3JiaXRzX2RhdGFfc291cmNlX3NfdHlwZV9zZXJ2ZXJzX3B0ciAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19zdHJ1Y3RfbG9jX3ByZWRpY3RlZF9vcmJpdHNfZGF0YV9zb3VyY2Vfc190eXBlX3NlcnZlcnMgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX3ByZWRpY3RlZF9vcmJpdHNfZGF0YV9zb3VyY2Vfc190eXBlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19hc3Npc3RfZGF0YV9yZXF1ZXN0X3BheWxvYWRfdV90eXBlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19hc3Npc3RfZGF0YV9yZXF1ZXN0X3NfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2Nfc2VydmVyX2Nvbm5lY3Rpb25faGFuZGxlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19zZXJ2ZXJfcHJvdG9jb2xfZV90eXBlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19zZXJ2ZXJfcmVxdWVzdF9lX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX3NlcnZlcl9vcGVuX3JlcV9zX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX3NlcnZlcl9jbG9zZV9yZXFfc190eXBlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19zZXJ2ZXJfcmVxdWVzdF91X3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX3NlcnZlcl9yZXF1ZXN0X3NfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2NfcXdpcF9yZXF1ZXN0X2VfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2NfcXdpcF9yZXF1ZXN0X3NfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2NfcmVzZXJ2ZWRfcGF5bG9hZF9zX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX2lvY3RsX2VfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2NfYXBpX3ZlcnNpb25fc190eXBlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19maXhfcmVjdXJyZW5jZV9lX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX29wZXJhdGlvbl9tb2RlX2VfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2Nfbm90aWZ5X2VfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2NfZml4X2NyaXRlcmlhX3NfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2NfbmlfdXNlcl9yZXNwX2VfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2NfdXNlcl92ZXJpZnlfc190eXBlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19wcmVkaWN0ZWRfb3JiaXRzX2RhdGFfZm9ybWF0X2VfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2NfcHJlZGljdGVkX29yYml0c19kYXRhX3NfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2NfcHJlZGljdGVkX29yYml0c19kYXRhX3ZhbGlkaXR5X3JlcG9ydF9zX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX3ByZWRpY3RlZF9vcmJpdHNfYXV0b19kb3dubG9hZF9jb25maWdfc190eXBlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19hc3Npc3RfZGF0YV90aW1lX3NfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2NfYXNzaXN0X3Bvc192YWxpZF9tYXNrX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX2Fzc2lzdF9kYXRhX3Bvc19zX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX3NlcnZlcl9vcGVuX3N0YXR1c19lX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX3NlcnZlcl9vcGVuX3N0YXR1c19zX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX3NlcnZlcl9jbG9zZV9zdGF0dXNfZV90eXBlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19zZXJ2ZXJfY2xvc2Vfc3RhdHVzX3NfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2Nfd2lwZXJfZml4X3RpbWVfc190eXBlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY193aXBlcl9maXhfcG9zX3NfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2Nfd2lwZXJfYXBfaW5mb19zX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX3dpcGVyX2FwX3NldF9zX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX3dpcGVyX3Bvc2l0aW9uX3JlcG9ydF9zX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX3dpcGVyX3N0YXR1c19lX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX2ZzX29wZXJhdGlvbl9lX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX2Vmc19kYXRhX3NfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2NfbG9ja19lX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX25tZWFfc2VudGVuY2VfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2NfYXNzaXN0X2RhdGFfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2NfYXNzaXN0X2RhdGFfZGVsZXRlX3NfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2NfaW9jdGxfZGF0YV91X3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX2lvY3RsX2NhbGxiYWNrX2RhdGFfdV90eXBlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19pb2N0bF9jYWxsYmFja19zX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX2V2ZW50X3BheWxvYWRfdV90eXBlICgpOwotCi0jZW5kaWYgLyogSyZSIEMgKi8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmIC8qICFfTE9DX0FQSV9DT01NT05fSF9SUENHRU4gKi8KZGlmZiAtLWdpdCBhL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpLXJwYy9pbmMtMTI0MC9sb2NfYXBpX2ZpeHVwLmggYi9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaS1ycGMvaW5jLTEyNDAvbG9jX2FwaV9maXh1cC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjJlYjM2Li4wMDAwMDAwCi0tLSBhL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpLXJwYy9pbmMtMTI0MC9sb2NfYXBpX2ZpeHVwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICBAZmlsZTogIGxvY19hcGlfZml4dXAuaAotICBAYnJpZWY6ICBMb2MgQVBJIEFuZHJvaWQgUlBDIGFtZW5kbWVudCBoZWFkZXIKLQotICBERVNDUklQVElPTgotICAgICBMb2MgQVBJIEFuZHJvaWQgUlBDIGFtZW5kbWVudCBoZWFkZXIKLQotICBJTklUSUFMSVpBVElPTiBBTkQgU0VRVUVOQ0lORyBSRVFVSVJFTUVOVFMKLQotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQ29weXJpZ2h0IChjKSAyMDA5LCBRVUFMQ09NTSBVU0EsIElOQy4KLQotQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotCi23ICAgICAgICAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLQottyAgICAgICAgIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gCi0KLbcgICAgICAgICBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBRVUFMQ09NTSBVU0EsIElOQy4gIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIAotCi1USElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiAgTE9DX0FQSV9GSVhVUF9ICi0jZGVmaW5lIExPQ19BUElfRklYVVBfSAotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLXsKLSNlbmRpZgotCi0jaWZuZGVmIE5VTExQUk9DCi0jZGVmaW5lIE5VTExQUk9DIDAKLSNlbmRpZiAvKiBOVUxMUFJPQyAqLwotCi0jaWZkZWYgQUREX1hEUl9GTE9BVAotCi1leHRlcm4gYm9vbF90IHhkcl9mbG9hdCAoWERSICpfX3hkcnMsIGZsb2F0ICpfX2ZwKTsKLWV4dGVybiBib29sX3QgeGRyX2RvdWJsZSAoWERSICpfX3hkcnMsIGRvdWJsZSAqX19kcCk7Ci0KLSNlbmRpZiAvKiBBRERfWERSX0ZMT0FUICovCi0KLSNpZmRlZiBBRERfWERSX0JPT0wKLWV4dGVybiBib29sX3QgeGRyX2Jvb2woWERSICpfX3hkcnMsIGludCAqX19icCk7Ci0jZW5kaWYgLyogQUREX1hEUl9CT09MICovCi0KLSNkZWZpbmUgUlBDX0xPQ19BUElfTUFKT1JfVkVSU0lPTl9OVU1CRVIgICAxCi0jZGVmaW5lIFJQQ19MT0NfQVBJX01JTk9SX1ZFUlNJT05fTlVNQkVSICAgMAotCi0vLyBSZXR1cm4gdmFsdWUgZm9yIGxvY19vcGVuIGluIGNhc2Ugb2YgZmFpbHVyZS4KLSNkZWZpbmUgUlBDX0xPQ19DTElFTlRfSEFORExFX0lOVkFMSUQgICAgIC0xCi0KLS8vIFJldHVybiB2YWx1ZSBvZiBsb2MgYXBpIGNhbGxzIGZvciBsb2NfY2xvc2UsIGxvY19zdGFydF9maXgsIGxvY19zdG9wX2ZpeCBhbmQgbG9jX2lvY3RsCi0vLyBUaGVzZSBhcmUgYWxzbyB0aGUgc3RhdHVzIGZvciB0aGUgaW9jdGwgY2FsbGJhY2sKLSNkZWZpbmUgUlBDX0xPQ19BUElfU1VDQ0VTUyAgICAgICAgICAgMAotI2RlZmluZSBSUENfTE9DX0FQSV9HRU5FUkFMX0ZBSUxVUkUgICAxCi0jZGVmaW5lIFJQQ19MT0NfQVBJX1VOU1VQUE9SVEVEICAgICAgIDIKLSNkZWZpbmUgUlBDX0xPQ19BUElfSU5WQUxJRF9IQU5ETEUgICAgNAotI2RlZmluZSBSUENfTE9DX0FQSV9JTlZBTElEX1BBUkFNRVRFUiA1Ci0jZGVmaW5lIFJQQ19MT0NfQVBJX0VOR0lORV9CVVNZICAgICAgIDYKLSNkZWZpbmUgUlBDX0xPQ19BUElfUEhPTkVfT0ZGTElORSAgICAgNwotI2RlZmluZSBSUENfTE9DX0FQSV9USU1FT1VUICAgICAgICAgICA4Ci0KLS8vIFNwZWNpYWwgcmV0dXJuIHZhbHVlIGZvciBsb2MgYXBpIGNhbGxzIGluIGNhc2Ugb2YgUkNQIGZhaWx1cmUKLSNkZWZpbmUgUlBDX0xPQ19BUElfUlBDX0ZBSUxVUkUgICAgICAgKC0xMjM0KQotCi0jZGVmaW5lIFJQQ19MT0NfQVBJX01BWF9TVl9DT1VOVCAgICAgICAgICAgICAgICAgICAgICA4MAotI2RlZmluZSBSUENfTE9DX0FQSV9NQVhfTk1FQV9TVFJJTkdfTEVOR1RIICAgICAgICAgICAgMTIwMAotCi0vLyBNYXhpbXVtIHNlcnZlciBhZGRyZXNzIHRoYXQgd2lsbCBiZSB1c2VkIGluIGxvY2F0aW9uIEFQSQotI2RlZmluZSBSUENfTE9DX0FQSV9NQVhfU0VSVkVSX0FERFJfTEVOR1RIICAgICAgICAgICAgMjU2Ci0jZGVmaW5lIFJQQ19MT0NfQVBJX01BWF9OVU1fUFJFRElDVEVEX09SQklUU19TRVJWRVJTICAzCi0jZGVmaW5lIFJQQ19MT0NfQVBJX01BWF9OVU1fTlRQX1NFUlZFUlMgICAgICAgICAgICAgICAzCi0KLSNkZWZpbmUgUlBDX0xPQ19FVkVOVF9QQVJTRURfUE9TSVRJT05fUkVQT1JUICAgICAgICAgICAgIDB4MDAwMDAwMDEgLy8gUG9zaXRpb24gcmVwb3J0IGNvbWVzIGluIGxvY19wYXJzZWRfcG9zaXRpb25fc190eXBlCi0jZGVmaW5lIFJQQ19MT0NfRVZFTlRfU0FURUxMSVRFX1JFUE9SVCAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyIC8vIFNhdGVsbGl0ZSBpbiB2aWV3IHJlcG9ydAotI2RlZmluZSBSUENfTE9DX0VWRU5UX05NRUFfMUhaX1JFUE9SVCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNCAvLyBOTUVBIHJlcG9ydCBhdCAxSFogcmF0ZQotI2RlZmluZSBSUENfTE9DX0VWRU5UX05NRUFfUE9TSVRJT05fUkVQT1JUICAgICAgICAgICAgICAgMHgwMDAwMDAwOCAvLyBOTUVBIHJlcG9ydCBhdCBwb3NpdGlvbiByZXBvcnQgcmF0ZQotI2RlZmluZSBSUENfTE9DX0VWRU5UX05JX05PVElGWV9WRVJJRllfUkVRVUVTVCAgICAgICAgICAgMHgwMDAwMDAxMCAvLyBOSSBub3RpZmljYXRpb24vdmVyaWZpY2F0aW9uIHJlcXVlc3QKLSNkZWZpbmUgUlBDX0xPQ19FVkVOVF9BU1NJU1RBTkNFX0RBVEFfUkVRVUVTVCAgICAgICAgICAgIDB4MDAwMDAwMjAgLy8gQXNzaXN0YW5jZSBkYXRhLCBlZzogdGltZSwgcHJlZGljdGVkIG9yYml0cyByZXF1ZXN0Ci0jZGVmaW5lIFJQQ19MT0NfRVZFTlRfTE9DQVRJT05fU0VSVkVSX1JFUVVFU1QgICAgICAgICAgICAweDAwMDAwMDQwIC8vIFJlcXVlc3QgZm9yIGxvY2F0aW9uIHNlcnZlcgotI2RlZmluZSBSUENfTE9DX0VWRU5UX0lPQ1RMX1JFUE9SVCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MCAvLyBDYWxsYmFjayByZXBvcnQgZm9yIGxvY19pb2N0bAotI2RlZmluZSBSUENfTE9DX0VWRU5UX1NUQVRVU19SRVBPUlQgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMCAvLyBNaXNjIHN0YXR1cyByZXBvcnQ6IGVnLCBlbmdpbmUgc3RhdGUKLQotCi0jZGVmaW5lIFJQQ19MT0NfUE9TX1ZBTElEX1NFU1NJT05fU1RBVFVTICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIFJQQ19MT0NfUE9TX1ZBTElEX1RJTUVTVEFNUF9DQUxFTkRBUiAgICAgICAgICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIFJQQ19MT0NfUE9TX1ZBTElEX1RJTUVTVEFNUF9VVEMgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0Ci0jZGVmaW5lIFJQQ19MT0NfUE9TX1ZBTElEX0xFQVBfU0VDT05EUyAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4Ci0jZGVmaW5lIFJQQ19MT0NfUE9TX1ZBTElEX1RJTUVfVU5DICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwCi0jZGVmaW5lIFJQQ19MT0NfUE9TX1ZBTElEX0xBVElUVURFICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwCi0jZGVmaW5lIFJQQ19MT0NfUE9TX1ZBTElEX0xPTkdJVFVERSAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDQwCi0jZGVmaW5lIFJQQ19MT0NfUE9TX1ZBTElEX0FMVElUVURFX1dSVF9FTExJUFNPSUQgICAgICAgICAweDAwMDAwMDgwCi0jZGVmaW5lIFJQQ19MT0NfUE9TX1ZBTElEX0FMVElUVURFX1dSVF9NRUFOX1NFQV9MRVZFTCAgICAweDAwMDAwMTAwCi0jZGVmaW5lIFJQQ19MT0NfUE9TX1ZBTElEX1NQRUVEX0hPUklaT05UQUwgICAgICAgICAgICAgICAweDAwMDAwMjAwCi0jZGVmaW5lIFJQQ19MT0NfUE9TX1ZBTElEX1NQRUVEX1ZFUlRJQ0FMICAgICAgICAgICAgICAgICAweDAwMDAwNDAwCi0jZGVmaW5lIFJQQ19MT0NfUE9TX1ZBTElEX0hFQURJTkcgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwODAwCi0jZGVmaW5lIFJQQ19MT0NfUE9TX1ZBTElEX0hPUl9VTkNfQ0lSQ1VMQVIgICAgICAgICAgICAgICAweDAwMDAxMDAwCi0jZGVmaW5lIFJQQ19MT0NfUE9TX1ZBTElEX0hPUl9VTkNfRUxMSV9TRU1JX01BSiAgICAgICAgICAweDAwMDAyMDAwCi0jZGVmaW5lIFJQQ19MT0NfUE9TX1ZBTElEX0hPUl9VTkNfRUxMSV9TRU1JX01JTiAgICAgICAgICAweDAwMDA0MDAwCi0jZGVmaW5lIFJQQ19MT0NfUE9TX1ZBTElEX0hPUl9VTkNfRUxMSV9PUklFTlRfQVpJTVVUSCAgICAweDAwMDA4MDAwCi0jZGVmaW5lIFJQQ19MT0NfUE9TX1ZBTElEX1ZFUlRJQ0FMX1VOQyAgICAgICAgICAgICAgICAgICAweDAwMDEwMDAwCi0jZGVmaW5lIFJQQ19MT0NfUE9TX1ZBTElEX1NQRUVEX1VOQyAgICAgICAgICAgICAgICAgICAgICAweDAwMDIwMDAwCi0jZGVmaW5lIFJQQ19MT0NfUE9TX1ZBTElEX0hFQURJTkdfVU5DICAgICAgICAgICAgICAgICAgICAweDAwMDQwMDAwCi0jZGVmaW5lIFJQQ19MT0NfUE9TX1ZBTElEX0NPTkZJREVOQ0VfSE9SSVpPTlRBTCAgICAgICAgICAweDAwMDgwMDAwCi0jZGVmaW5lIFJQQ19MT0NfUE9TX1ZBTElEX0NPTkZJREVOQ0VfVkVSVElDQUwgICAgICAgICAgICAweDAwMTAwMDAwCi0jZGVmaW5lIFJQQ19MT0NfUE9TX1ZBTElEX01BR05FVElDX1ZBUklBVElPTiAgICAgICAgICAgICAweDAwMjAwMDAwCi0jZGVmaW5lIFJQQ19MT0NfUE9TX1ZBTElEX1RFQ0hOT0xPR1lfTUFTSyAgICAgICAgICAgICAgICAweDAwNDAwMDAwCi0KLSNkZWZpbmUgUlBDX0xPQ19QT1NfVEVDSF9TQVRFTExJVEUgMHgwMDAwMDAwMQotI2RlZmluZSBSUENfTE9DX1BPU19URUNIX0NFTExJRCAgICAweDAwMDAwMDAyCi0jZGVmaW5lIFJQQ19MT0NfUE9TX1RFQ0hfV0lGSSAgICAgIDB4MDAwMDAwMDQKLQotI2RlZmluZSBSUENfTE9DX1NWX0lORk9fVkFMSURfU1lTVEVNICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBSUENfTE9DX1NWX0lORk9fVkFMSURfUFJOICAgICAgICAgICAgMHgwMDAwMDAwMgotI2RlZmluZSBSUENfTE9DX1NWX0lORk9fVkFMSURfSEVBTFRIX1NUQVRVUyAgMHgwMDAwMDAwNAotI2RlZmluZSBSUENfTE9DX1NWX0lORk9fVkFMSURfUFJPQ0VTU19TVEFUVVMgMHgwMDAwMDAwOAotI2RlZmluZSBSUENfTE9DX1NWX0lORk9fVkFMSURfSEFTX0VQSCAgICAgICAgMHgwMDAwMDAxMAotI2RlZmluZSBSUENfTE9DX1NWX0lORk9fVkFMSURfSEFTX0FMTSAgICAgICAgMHgwMDAwMDAyMAotI2RlZmluZSBSUENfTE9DX1NWX0lORk9fVkFMSURfRUxFVkFUSU9OICAgICAgMHgwMDAwMDA0MAotI2RlZmluZSBSUENfTE9DX1NWX0lORk9fVkFMSURfQVpJTVVUSCAgICAgICAgMHgwMDAwMDA4MAotI2RlZmluZSBSUENfTE9DX1NWX0lORk9fVkFMSURfU05SICAgICAgICAgICAgMHgwMDAwMDEwMAotCi0jZGVmaW5lIFJQQ19MT0NfR05TU19JTkZPX1ZBTElEX1BPU19ET1AgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgUlBDX0xPQ19HTlNTX0lORk9fVkFMSURfSE9SX0RPUCAgICAgICAgICAgMHgwMDAwMDAwMgotI2RlZmluZSBSUENfTE9DX0dOU1NfSU5GT19WQUxJRF9WRVJUX0RPUCAgICAgICAgICAweDAwMDAwMDA0Ci0jZGVmaW5lIFJQQ19MT0NfR05TU19JTkZPX1ZBTElEX0FMVElUVURFX0FTU1VNRUQgIDB4MDAwMDAwMDgKLSNkZWZpbmUgUlBDX0xPQ19HTlNTX0lORk9fVkFMSURfU1ZfQ09VTlQgICAgICAgICAgMHgwMDAwMDAxMAotI2RlZmluZSBSUENfTE9DX0dOU1NfSU5GT19WQUxJRF9TVl9MSVNUICAgICAgICAgICAweDAwMDAwMDIwCi0KLSNkZWZpbmUgUlBDX0xPQ19OSV9NQVhfUkVRVUVTVE9SX0lEX0xFTkdUSCAgICAgICAgICAyMDAKLSNkZWZpbmUgUlBDX0xPQ19OSV9TVVBMX0hBU0hfTEVOR1RIICAgICAgICAgICAgICAgICA4Ci0jZGVmaW5lIFJQQ19MT0NfTklfU1VQTF9TTFBfU0VTU0lPTl9JRF9CWVRFX0xFTkdUSCAgNAotI2RlZmluZSBSUENfTE9DX05JX01BWF9DTElFTlRfTkFNRV9MRU5HVEggICAgICAgICAgIDY0Ci0jZGVmaW5lIFJQQ19MT0NfTklfTUFYX0VYVF9DTElFTlRfQUREUkVTUyAgICAgICAgICAgMjAKLSNkZWZpbmUgUlBDX0xPQ19OSV9DT0RFV09SRF9MRU5HVEggICAgICAgICAgICAgICAgICAyMAotCi0jZGVmaW5lIFJQQ19MT0NfTklfU1VQTF9RT1BfVkFMSUQgICAgICAgICAweDAxCi0jZGVmaW5lIFJQQ19MT0NfTklfU1VQTF9RT1BfVkVSQUNDX1ZBTElEICAweDAyCi0jZGVmaW5lIFJQQ19MT0NfTklfU1VQTF9RT1BfTUFYQUdFX1ZBTElEICAweDA0Ci0jZGVmaW5lIFJQQ19MT0NfTklfU1VQTF9RT1BfREVMQVlfVkFMSUQgICAweDA4Ci0KLSNkZWZpbmUgUlBDX0xPQ19GSVhfQ1JJVF9WQUxJRF9SRUNVUlJFTkNFX1RZUEUgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIFJQQ19MT0NfRklYX0NSSVRfVkFMSURfUFJFRkVSUkVEX09QRVJBVElPTl9NT0RFICAgICAgICAgMHgwMDAwMDAwMgotI2RlZmluZSBSUENfTE9DX0ZJWF9DUklUX1ZBTElEX1BSRUZFUlJFRF9BQ0NVUkFDWSAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKLSNkZWZpbmUgUlBDX0xPQ19GSVhfQ1JJVF9WQUxJRF9QUkVGRVJSRURfUkVTUE9OU0VfVElNRSAgICAgICAgICAweDAwMDAwMDA4Ci0jZGVmaW5lIFJQQ19MT0NfRklYX0NSSVRfVkFMSURfSU5URVJNRURJQVRFX1BPU19SRVBPUlRfRU5BQkxFRCAgMHgwMDAwMDAxMAotI2RlZmluZSBSUENfTE9DX0ZJWF9DUklUX1ZBTElEX05PVElGWV9UWVBFICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKLSNkZWZpbmUgUlBDX0xPQ19GSVhfQ1JJVF9WQUxJRF9NSU5fSU5URVJWQUwgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDQwCi0jZGVmaW5lIFJQQ19MT0NfRklYX0NSSVRfVkFMSURfTUlOX0RJU1RBTkNFICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MAotI2RlZmluZSBSUENfTE9DX0ZJWF9DUklUX1ZBTElEX01JTl9ESVNUX1NBTVBMRV9JTlRFUlZBTCAgICAgICAgIDB4MDAwMDAxMDAKLQotI2RlZmluZSBSUENfTE9DX0FTU0lTVF9QT1NfVkFMSURfVElNRVNUQU1QX1VUQyAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIFJQQ19MT0NfQVNTSVNUX1BPU19WQUxJRF9MQVRJVFVERSAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKLSNkZWZpbmUgUlBDX0xPQ19BU1NJU1RfUE9TX1ZBTElEX0xPTkdJVFVERSAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAotI2RlZmluZSBSUENfTE9DX0FTU0lTVF9QT1NfVkFMSURfQUxUSVRVREVfV1JUX0VMTElQU09JRCAgICAgICAweDAwMDAwMDA4Ci0jZGVmaW5lIFJQQ19MT0NfQVNTSVNUX1BPU19WQUxJRF9BTFRJVFVERV9XUlRfTUVBTl9TRUFfTEVWRUwgIDB4MDAwMDAwMTAKLSNkZWZpbmUgUlBDX0xPQ19BU1NJU1RfUE9TX1ZBTElEX0hPUl9VTkNfQ0lSQ1VMQVIgICAgICAgICAgICAgMHgwMDAwMDAyMAotI2RlZmluZSBSUENfTE9DX0FTU0lTVF9QT1NfVkFMSURfVkVSVF9VTkMgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDQwCi0jZGVmaW5lIFJQQ19MT0NfQVNTSVNUX1BPU19WQUxJRF9DT05GSURFTkNFX0hPUklaT05UQUwgICAgICAgIDB4MDAwMDAwODAKLSNkZWZpbmUgUlBDX0xPQ19BU1NJU1RfUE9TX1ZBTElEX0NPTkZJREVOQ0VfVkVSVElDQUwgICAgICAgICAgMHgwMDAwMDEwMAotCi0jZGVmaW5lIFJQQ19MT0NfQVNTSVNUX0RBVEFfQUxMICAgICAgICAgMHhGRkZGRkZGRgotCi0jZGVmaW5lIFJQQ19MT0NfTk1FQV9NQVNLX0FMTCAgICAweGZmZmYKLSNkZWZpbmUgUlBDX0xPQ19OTUVBX01BU0tfR0dBICAgIDB4MDAwMQotI2RlZmluZSBSUENfTE9DX05NRUFfTUFTS19STUMgICAgMHgwMDAyCi0jZGVmaW5lIFJQQ19MT0NfTk1FQV9NQVNLX0dTViAgICAweDAwMDQKLSNkZWZpbmUgUlBDX0xPQ19OTUVBX01BU0tfR1NBICAgIDB4MDAwOAotI2RlZmluZSBSUENfTE9DX05NRUFfTUFTS19WVEcgICAgMHgwMDEwCi0KLS8qIGZsYWdzIGZvciBub3RpZmljYXRpb24gKi8KLSNkZWZpbmUgIFJQQ19MT0NfTklfQ0xJRU5UX05BTUVfUFJFU0VOVCAgICAgICAgICAgICAweDAwMDEKLSNkZWZpbmUgIFJQQ19MT0NfTklfQ0xJRU5UX0VYVEFERFJfUFJFU0VOVCAgICAgICAgICAweDAwMDIKLSNkZWZpbmUgIFJQQ19MT0NfTklfREVGX0xPQ0FUSU9OX1RZUEVfUFJFU0VOVCAgICAgICAweDAwMTAKLSNkZWZpbmUgIFJQQ19MT0NfTklfUkVRVUVTVE9SX0lEX1BSRVNFTlQgICAgICAgICAgICAweDAwMjAKLSNkZWZpbmUgIFJQQ19MT0NfTklfQ09ERVdPUkRfUFJFU0VOVCAgICAgICAgICAgICAgICAweDAwNDAKLSNkZWZpbmUgIFJQQ19MT0NfTklfU0VSVklDRV9UWVBFX0lEX1BSRVNFTlQgICAgICAgICAweDAwODAKLSNkZWZpbmUgIFJQQ19MT0NfTklfRU5DT0RJTkdfVFlQRV9QUkVTRU5UICAgICAgICAgICAweDAxMDAKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmIC8qIExPQ19BUElfRklYVVBfSCAqLwpkaWZmIC0tZ2l0IGEvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGktcnBjL2luYy0xMjQwL2xvY19hcGljYl9hcHBpbml0LmggYi9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaS1ycGMvaW5jLTEyNDAvbG9jX2FwaWNiX2FwcGluaXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJkNGUxNS4uMDAwMDAwMAotLS0gYS9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaS1ycGMvaW5jLTEyNDAvbG9jX2FwaWNiX2FwcGluaXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUNvcHlyaWdodCAoYykgMjAwOSwgUVVBTENPTU0gVVNBLCBJTkMuCi0KLUFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLQottyAgICAgICAgIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0KLbcgICAgICAgICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uIAotCi23ICAgICAgICAgTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgUVVBTENPTU0gVVNBLCBJTkMuICBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAKLQotVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8gCi0KLSNpZm5kZWYgTE9DX0FQSUNCX0FQUElOSVRfSAotI2RlZmluZSBMT0NfQVBJQ0JfQVBQSU5JVF9ICi0KLSNpZmRlZiBfX2NwbHVzcGx1cyAKLWV4dGVybiAiQyIgCi17IAotI2VuZGlmCi0KLSAvKiBJbml0aWFsaXphdGlvbiBmdW5jdGlvbiBmb3IgY2FsbGJhY2tzICovCi1leHRlcm4gaW50IGxvY19hcGljYl9hcHBfaW5pdCgpOyAKLWV4dGVybiB2b2lkIGxvY19hcGljYl9hcHBfZGVpbml0KCk7IAotCi0jaWZkZWYgX19jcGx1c3BsdXMgCi19Ci0jZW5kaWYKLQotI2VuZGlmIC8qIExPQ19BUElDQl9BUFBJTklUX0ggKi8KZGlmZiAtLWdpdCBhL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpLXJwYy9pbmMtMzIwMC9sb2NfYXBpLmggYi9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaS1ycGMvaW5jLTMyMDAvbG9jX2FwaS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTk4YWNhLi4wMDAwMDAwCi0tLSBhL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpLXJwYy9pbmMtMzIwMC9sb2NfYXBpLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOTggKzAsMCBAQAotLyoKLSAqIFBsZWFzZSBkbyBub3QgZWRpdCB0aGlzIGZpbGUuCi0gKiBJdCB3YXMgZ2VuZXJhdGVkIHVzaW5nIHJwY2dlbi4KLSAqLwotCi0jaWZuZGVmIF9MT0NfQVBJX0hfUlBDR0VOCi0jZGVmaW5lIF9MT0NfQVBJX0hfUlBDR0VOCi0KLSNpbmNsdWRlIDxycGMvcnBjLmg+Ci0KLSNpbmNsdWRlIDxwdGhyZWFkLmg+Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotCi10eXBlZGVmIHN0cnVjdCB7Ci0JdV9pbnQgcnBjX2xvY19hcGlfYXBpX3ZlcnNpb25zX3JldHVybl90eXBlX2xlbjsKLQlycGNfdWludDMyICpycGNfbG9jX2FwaV9hcGlfdmVyc2lvbnNfcmV0dXJuX3R5cGVfdmFsOwotfSBycGNfbG9jX2FwaV9hcGlfdmVyc2lvbnNfcmV0dXJuX3R5cGU7Ci0KLXR5cGVkZWYgcnBjX3VpbnQzMiBycGNfbG9jX2V2ZW50X2NiX2ZfdHlwZTsKLQotc3RydWN0IHJwY19sb2Nfb3Blbl9hcmdzIHsKLQlycGNfbG9jX2V2ZW50X21hc2tfdHlwZSBldmVudF9yZWdfbWFzazsKLQlycGNfbG9jX2V2ZW50X2NiX2ZfdHlwZSBldmVudF9jYWxsYmFjazsKLX07Ci10eXBlZGVmIHN0cnVjdCBycGNfbG9jX29wZW5fYXJncyBycGNfbG9jX29wZW5fYXJnczsKLQotc3RydWN0IHJwY19sb2NfY2xvc2VfYXJncyB7Ci0JcnBjX2xvY19jbGllbnRfaGFuZGxlX3R5cGUgaGFuZGxlOwotfTsKLXR5cGVkZWYgc3RydWN0IHJwY19sb2NfY2xvc2VfYXJncyBycGNfbG9jX2Nsb3NlX2FyZ3M7Ci0KLXN0cnVjdCBycGNfbG9jX3N0YXJ0X2ZpeF9hcmdzIHsKLQlycGNfbG9jX2NsaWVudF9oYW5kbGVfdHlwZSBoYW5kbGU7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgcnBjX2xvY19zdGFydF9maXhfYXJncyBycGNfbG9jX3N0YXJ0X2ZpeF9hcmdzOwotCi1zdHJ1Y3QgcnBjX2xvY19zdG9wX2ZpeF9hcmdzIHsKLQlycGNfbG9jX2NsaWVudF9oYW5kbGVfdHlwZSBoYW5kbGU7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgcnBjX2xvY19zdG9wX2ZpeF9hcmdzIHJwY19sb2Nfc3RvcF9maXhfYXJnczsKLQotc3RydWN0IHJwY19sb2NfaW9jdGxfYXJncyB7Ci0JcnBjX2xvY19jbGllbnRfaGFuZGxlX3R5cGUgaGFuZGxlOwotCXJwY19sb2NfaW9jdGxfZV90eXBlIGlvY3RsX3R5cGU7Ci0JcnBjX2xvY19pb2N0bF9kYXRhX3VfdHlwZSAqaW9jdGxfZGF0YTsKLX07Ci10eXBlZGVmIHN0cnVjdCBycGNfbG9jX2lvY3RsX2FyZ3MgcnBjX2xvY19pb2N0bF9hcmdzOwotCi1zdHJ1Y3QgcnBjX2xvY19hcGlfYXBpX3ZlcnNpb25fc19hcmdzIHsKLQlycGNfYm9vbGVhbiBsZW5fbm90X251bGw7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgcnBjX2xvY19hcGlfYXBpX3ZlcnNpb25fc19hcmdzIHJwY19sb2NfYXBpX2FwaV92ZXJzaW9uX3NfYXJnczsKLQotc3RydWN0IHJwY19sb2NfYXBpX3JwY19nbHVlX2NvZGVfaW5mb19yZW1vdGVfcmV0cyB7Ci0JcnBjX3VpbnQzMiB0b29sdmVyczsKLQlycGNfdWludDMyIGZlYXR1cmVzOwotCXJwY191aW50MzIgcHJvZ2hhc2g7Ci0JcnBjX3VpbnQzMiBjYnByb2doYXNoOwotfTsKLXR5cGVkZWYgc3RydWN0IHJwY19sb2NfYXBpX3JwY19nbHVlX2NvZGVfaW5mb19yZW1vdGVfcmV0cyBycGNfbG9jX2FwaV9ycGNfZ2x1ZV9jb2RlX2luZm9fcmVtb3RlX3JldHM7Ci0KLXN0cnVjdCBycGNfbG9jX29wZW5fcmV0cyB7Ci0JcnBjX2xvY19jbGllbnRfaGFuZGxlX3R5cGUgbG9jX29wZW5fcmVzdWx0OwotfTsKLXR5cGVkZWYgc3RydWN0IHJwY19sb2Nfb3Blbl9yZXRzIHJwY19sb2Nfb3Blbl9yZXRzOwotCi1zdHJ1Y3QgcnBjX2xvY19jbG9zZV9yZXRzIHsKLQlycGNfaW50MzIgbG9jX2Nsb3NlX3Jlc3VsdDsKLX07Ci10eXBlZGVmIHN0cnVjdCBycGNfbG9jX2Nsb3NlX3JldHMgcnBjX2xvY19jbG9zZV9yZXRzOwotCi1zdHJ1Y3QgcnBjX2xvY19zdGFydF9maXhfcmV0cyB7Ci0JcnBjX2ludDMyIGxvY19zdGFydF9maXhfcmVzdWx0OwotfTsKLXR5cGVkZWYgc3RydWN0IHJwY19sb2Nfc3RhcnRfZml4X3JldHMgcnBjX2xvY19zdGFydF9maXhfcmV0czsKLQotc3RydWN0IHJwY19sb2Nfc3RvcF9maXhfcmV0cyB7Ci0JcnBjX2ludDMyIGxvY19zdG9wX2ZpeF9yZXN1bHQ7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgcnBjX2xvY19zdG9wX2ZpeF9yZXRzIHJwY19sb2Nfc3RvcF9maXhfcmV0czsKLQotc3RydWN0IHJwY19sb2NfaW9jdGxfcmV0cyB7Ci0JcnBjX2ludDMyIGxvY19pb2N0bF9yZXN1bHQ7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgcnBjX2xvY19pb2N0bF9yZXRzIHJwY19sb2NfaW9jdGxfcmV0czsKLQotc3RydWN0IHJwY19sb2NfYXBpX2FwaV92ZXJzaW9uc19yZXRzIHsKLQlycGNfbG9jX2FwaV9hcGlfdmVyc2lvbnNfcmV0dXJuX3R5cGUgbG9jX2FwaV9hcGlfdmVyc2lvbnNfcmVzdWx0OwotCXJwY191aW50MzIgKmxlbjsKLX07Ci10eXBlZGVmIHN0cnVjdCBycGNfbG9jX2FwaV9hcGlfdmVyc2lvbnNfcmV0cyBycGNfbG9jX2FwaV9hcGlfdmVyc2lvbnNfcmV0czsKLSNkZWZpbmUgTE9DX0FQSVZFUlMgMHgwMDAxMDAwMQotCi0jZGVmaW5lIExPQ19BUElQUk9HIDB4MzAwMDAwOGMKLSNkZWZpbmUgTE9DX0FQSVZFUlNfMDAwMSAweDAwMDEwMDAxCi0KLSNpZiBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKF9fY3BsdXNwbHVzKQotI2RlZmluZSBycGNfbG9jX2FwaV9udWxsIDAKLWV4dGVybiAgZW51bSBjbG50X3N0YXQgcnBjX2xvY19hcGlfbnVsbF8weDAwMDEwMDAxKHZvaWQgKiwgdm9pZCAqLCBDTElFTlQgKik7Ci1leHRlcm4gIGJvb2xfdCBycGNfbG9jX2FwaV9udWxsXzB4MDAwMTAwMDFfc3ZjKHZvaWQgKiwgdm9pZCAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKLSNkZWZpbmUgcnBjX2xvY19hcGlfcnBjX2dsdWVfY29kZV9pbmZvX3JlbW90ZSAxCi1leHRlcm4gIGVudW0gY2xudF9zdGF0IHJwY19sb2NfYXBpX3JwY19nbHVlX2NvZGVfaW5mb19yZW1vdGVfMHgwMDAxMDAwMSh2b2lkICosIHJwY19sb2NfYXBpX3JwY19nbHVlX2NvZGVfaW5mb19yZW1vdGVfcmV0cyAqLCBDTElFTlQgKik7Ci1leHRlcm4gIGJvb2xfdCBycGNfbG9jX2FwaV9ycGNfZ2x1ZV9jb2RlX2luZm9fcmVtb3RlXzB4MDAwMTAwMDFfc3ZjKHZvaWQgKiwgcnBjX2xvY19hcGlfcnBjX2dsdWVfY29kZV9pbmZvX3JlbW90ZV9yZXRzICosIHN0cnVjdCBzdmNfcmVxICopOwotI2RlZmluZSBycGNfbG9jX29wZW4gMgotZXh0ZXJuICBlbnVtIGNsbnRfc3RhdCBycGNfbG9jX29wZW5fMHgwMDAxMDAwMShycGNfbG9jX29wZW5fYXJncyAqLCBycGNfbG9jX29wZW5fcmV0cyAqLCBDTElFTlQgKik7Ci1leHRlcm4gIGJvb2xfdCBycGNfbG9jX29wZW5fMHgwMDAxMDAwMV9zdmMocnBjX2xvY19vcGVuX2FyZ3MgKiwgcnBjX2xvY19vcGVuX3JldHMgKiwgc3RydWN0IHN2Y19yZXEgKik7Ci0jZGVmaW5lIHJwY19sb2NfY2xvc2UgMwotZXh0ZXJuICBlbnVtIGNsbnRfc3RhdCBycGNfbG9jX2Nsb3NlXzB4MDAwMTAwMDEocnBjX2xvY19jbG9zZV9hcmdzICosIHJwY19sb2NfY2xvc2VfcmV0cyAqLCBDTElFTlQgKik7Ci1leHRlcm4gIGJvb2xfdCBycGNfbG9jX2Nsb3NlXzB4MDAwMTAwMDFfc3ZjKHJwY19sb2NfY2xvc2VfYXJncyAqLCBycGNfbG9jX2Nsb3NlX3JldHMgKiwgc3RydWN0IHN2Y19yZXEgKik7Ci0jZGVmaW5lIHJwY19sb2Nfc3RhcnRfZml4IDQKLWV4dGVybiAgZW51bSBjbG50X3N0YXQgcnBjX2xvY19zdGFydF9maXhfMHgwMDAxMDAwMShycGNfbG9jX3N0YXJ0X2ZpeF9hcmdzICosIHJwY19sb2Nfc3RhcnRfZml4X3JldHMgKiwgQ0xJRU5UICopOwotZXh0ZXJuICBib29sX3QgcnBjX2xvY19zdGFydF9maXhfMHgwMDAxMDAwMV9zdmMocnBjX2xvY19zdGFydF9maXhfYXJncyAqLCBycGNfbG9jX3N0YXJ0X2ZpeF9yZXRzICosIHN0cnVjdCBzdmNfcmVxICopOwotI2RlZmluZSBycGNfbG9jX3N0b3BfZml4IDUKLWV4dGVybiAgZW51bSBjbG50X3N0YXQgcnBjX2xvY19zdG9wX2ZpeF8weDAwMDEwMDAxKHJwY19sb2Nfc3RvcF9maXhfYXJncyAqLCBycGNfbG9jX3N0b3BfZml4X3JldHMgKiwgQ0xJRU5UICopOwotZXh0ZXJuICBib29sX3QgcnBjX2xvY19zdG9wX2ZpeF8weDAwMDEwMDAxX3N2YyhycGNfbG9jX3N0b3BfZml4X2FyZ3MgKiwgcnBjX2xvY19zdG9wX2ZpeF9yZXRzICosIHN0cnVjdCBzdmNfcmVxICopOwotI2RlZmluZSBycGNfbG9jX2lvY3RsIDYKLWV4dGVybiAgZW51bSBjbG50X3N0YXQgcnBjX2xvY19pb2N0bF8weDAwMDEwMDAxKHJwY19sb2NfaW9jdGxfYXJncyAqLCBycGNfbG9jX2lvY3RsX3JldHMgKiwgQ0xJRU5UICopOwotZXh0ZXJuICBib29sX3QgcnBjX2xvY19pb2N0bF8weDAwMDEwMDAxX3N2YyhycGNfbG9jX2lvY3RsX2FyZ3MgKiwgcnBjX2xvY19pb2N0bF9yZXRzICosIHN0cnVjdCBzdmNfcmVxICopOwotI2RlZmluZSBycGNfbG9jX2FwaV9hcGlfdmVyc2lvbnMgMHhGRkZGRkZGRgotZXh0ZXJuICBlbnVtIGNsbnRfc3RhdCBycGNfbG9jX2FwaV9hcGlfdmVyc2lvbnNfMHgwMDAxMDAwMSh2b2lkICosIHJwY19sb2NfYXBpX2FwaV92ZXJzaW9uc19yZXRzICosIENMSUVOVCAqKTsKLWV4dGVybiAgYm9vbF90IHJwY19sb2NfYXBpX2FwaV92ZXJzaW9uc18weDAwMDEwMDAxX3N2Yyh2b2lkICosIHJwY19sb2NfYXBpX2FwaV92ZXJzaW9uc19yZXRzICosIHN0cnVjdCBzdmNfcmVxICopOwotZXh0ZXJuIGludCBsb2NfYXBpcHJvZ18weDAwMDEwMDAxX2ZyZWVyZXN1bHQgKFNWQ1hQUlQgKiwgeGRycHJvY190LCBjYWRkcl90KTsKLQotI2Vsc2UgLyogSyZSIEMgKi8KLSNkZWZpbmUgcnBjX2xvY19hcGlfbnVsbCAwCi1leHRlcm4gIGVudW0gY2xudF9zdGF0IHJwY19sb2NfYXBpX251bGxfMHgwMDAxMDAwMSgpOwotZXh0ZXJuICBib29sX3QgcnBjX2xvY19hcGlfbnVsbF8weDAwMDEwMDAxX3N2YygpOwotI2RlZmluZSBycGNfbG9jX2FwaV9ycGNfZ2x1ZV9jb2RlX2luZm9fcmVtb3RlIDEKLWV4dGVybiAgZW51bSBjbG50X3N0YXQgcnBjX2xvY19hcGlfcnBjX2dsdWVfY29kZV9pbmZvX3JlbW90ZV8weDAwMDEwMDAxKCk7Ci1leHRlcm4gIGJvb2xfdCBycGNfbG9jX2FwaV9ycGNfZ2x1ZV9jb2RlX2luZm9fcmVtb3RlXzB4MDAwMTAwMDFfc3ZjKCk7Ci0jZGVmaW5lIHJwY19sb2Nfb3BlbiAyCi1leHRlcm4gIGVudW0gY2xudF9zdGF0IHJwY19sb2Nfb3Blbl8weDAwMDEwMDAxKCk7Ci1leHRlcm4gIGJvb2xfdCBycGNfbG9jX29wZW5fMHgwMDAxMDAwMV9zdmMoKTsKLSNkZWZpbmUgcnBjX2xvY19jbG9zZSAzCi1leHRlcm4gIGVudW0gY2xudF9zdGF0IHJwY19sb2NfY2xvc2VfMHgwMDAxMDAwMSgpOwotZXh0ZXJuICBib29sX3QgcnBjX2xvY19jbG9zZV8weDAwMDEwMDAxX3N2YygpOwotI2RlZmluZSBycGNfbG9jX3N0YXJ0X2ZpeCA0Ci1leHRlcm4gIGVudW0gY2xudF9zdGF0IHJwY19sb2Nfc3RhcnRfZml4XzB4MDAwMTAwMDEoKTsKLWV4dGVybiAgYm9vbF90IHJwY19sb2Nfc3RhcnRfZml4XzB4MDAwMTAwMDFfc3ZjKCk7Ci0jZGVmaW5lIHJwY19sb2Nfc3RvcF9maXggNQotZXh0ZXJuICBlbnVtIGNsbnRfc3RhdCBycGNfbG9jX3N0b3BfZml4XzB4MDAwMTAwMDEoKTsKLWV4dGVybiAgYm9vbF90IHJwY19sb2Nfc3RvcF9maXhfMHgwMDAxMDAwMV9zdmMoKTsKLSNkZWZpbmUgcnBjX2xvY19pb2N0bCA2Ci1leHRlcm4gIGVudW0gY2xudF9zdGF0IHJwY19sb2NfaW9jdGxfMHgwMDAxMDAwMSgpOwotZXh0ZXJuICBib29sX3QgcnBjX2xvY19pb2N0bF8weDAwMDEwMDAxX3N2YygpOwotI2RlZmluZSBycGNfbG9jX2FwaV9hcGlfdmVyc2lvbnMgMHhGRkZGRkZGRgotZXh0ZXJuICBlbnVtIGNsbnRfc3RhdCBycGNfbG9jX2FwaV9hcGlfdmVyc2lvbnNfMHgwMDAxMDAwMSgpOwotZXh0ZXJuICBib29sX3QgcnBjX2xvY19hcGlfYXBpX3ZlcnNpb25zXzB4MDAwMTAwMDFfc3ZjKCk7Ci1leHRlcm4gaW50IGxvY19hcGlwcm9nXzB4MDAwMTAwMDFfZnJlZXJlc3VsdCAoKTsKLSNlbmRpZiAvKiBLJlIgQyAqLwotCi0vKiB0aGUgeGRyIGZ1bmN0aW9ucyAqLwotCi0jaWYgZGVmaW5lZChfX1NURENfXykgfHwgZGVmaW5lZChfX2NwbHVzcGx1cykKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX2FwaV9hcGlfdmVyc2lvbnNfcmV0dXJuX3R5cGUgKFhEUiAqLCBycGNfbG9jX2FwaV9hcGlfdmVyc2lvbnNfcmV0dXJuX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX2V2ZW50X2NiX2ZfdHlwZSAoWERSICosIHJwY19sb2NfZXZlbnRfY2JfZl90eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19vcGVuX2FyZ3MgKFhEUiAqLCBycGNfbG9jX29wZW5fYXJncyopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2NfY2xvc2VfYXJncyAoWERSICosIHJwY19sb2NfY2xvc2VfYXJncyopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2Nfc3RhcnRfZml4X2FyZ3MgKFhEUiAqLCBycGNfbG9jX3N0YXJ0X2ZpeF9hcmdzKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19zdG9wX2ZpeF9hcmdzIChYRFIgKiwgcnBjX2xvY19zdG9wX2ZpeF9hcmdzKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19pb2N0bF9hcmdzIChYRFIgKiwgcnBjX2xvY19pb2N0bF9hcmdzKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19hcGlfYXBpX3ZlcnNpb25fc19hcmdzIChYRFIgKiwgcnBjX2xvY19hcGlfYXBpX3ZlcnNpb25fc19hcmdzKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19hcGlfcnBjX2dsdWVfY29kZV9pbmZvX3JlbW90ZV9yZXRzIChYRFIgKiwgcnBjX2xvY19hcGlfcnBjX2dsdWVfY29kZV9pbmZvX3JlbW90ZV9yZXRzKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19vcGVuX3JldHMgKFhEUiAqLCBycGNfbG9jX29wZW5fcmV0cyopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2NfY2xvc2VfcmV0cyAoWERSICosIHJwY19sb2NfY2xvc2VfcmV0cyopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2Nfc3RhcnRfZml4X3JldHMgKFhEUiAqLCBycGNfbG9jX3N0YXJ0X2ZpeF9yZXRzKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19zdG9wX2ZpeF9yZXRzIChYRFIgKiwgcnBjX2xvY19zdG9wX2ZpeF9yZXRzKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19pb2N0bF9yZXRzIChYRFIgKiwgcnBjX2xvY19pb2N0bF9yZXRzKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19hcGlfYXBpX3ZlcnNpb25zX3JldHMgKFhEUiAqLCBycGNfbG9jX2FwaV9hcGlfdmVyc2lvbnNfcmV0cyopOwotCi0jZWxzZSAvKiBLJlIgQyAqLwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19hcGlfYXBpX3ZlcnNpb25zX3JldHVybl90eXBlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19ldmVudF9jYl9mX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX29wZW5fYXJncyAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2NfY2xvc2VfYXJncyAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2Nfc3RhcnRfZml4X2FyZ3MgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX3N0b3BfZml4X2FyZ3MgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX2lvY3RsX2FyZ3MgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX2FwaV9hcGlfdmVyc2lvbl9zX2FyZ3MgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX2FwaV9ycGNfZ2x1ZV9jb2RlX2luZm9fcmVtb3RlX3JldHMgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX29wZW5fcmV0cyAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2NfY2xvc2VfcmV0cyAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2Nfc3RhcnRfZml4X3JldHMgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX3N0b3BfZml4X3JldHMgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX2lvY3RsX3JldHMgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX2FwaV9hcGlfdmVyc2lvbnNfcmV0cyAoKTsKLQotI2VuZGlmIC8qIEsmUiBDICovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZiAvKiAhX0xPQ19BUElfSF9SUENHRU4gKi8KZGlmZiAtLWdpdCBhL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpLXJwYy9pbmMtMzIwMC9sb2NfYXBpX2NiLmggYi9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaS1ycGMvaW5jLTMyMDAvbG9jX2FwaV9jYi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjJmOGY5Li4wMDAwMDAwCi0tLSBhL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpLXJwYy9pbmMtMzIwMC9sb2NfYXBpX2NiLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKgotICogUGxlYXNlIGRvIG5vdCBlZGl0IHRoaXMgZmlsZS4KLSAqIEl0IHdhcyBnZW5lcmF0ZWQgdXNpbmcgcnBjZ2VuLgotICovCi0KLSNpZm5kZWYgX0xPQ19BUElfQ0JfSF9SUENHRU4KLSNkZWZpbmUgX0xPQ19BUElfQ0JfSF9SUENHRU4KLQotI2luY2x1ZGUgPHJwYy9ycGMuaD4KLQotI2luY2x1ZGUgPHB0aHJlYWQuaD4KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0KLXN0cnVjdCBycGNfbG9jX2V2ZW50X2NiX2ZfdHlwZV9hcmdzIHsKLQlycGNfdWludDMyIGNiX2lkOwotCXJwY19sb2NfY2xpZW50X2hhbmRsZV90eXBlIGxvY19oYW5kbGU7Ci0JcnBjX2xvY19ldmVudF9tYXNrX3R5cGUgbG9jX2V2ZW50OwotCXJwY19sb2NfZXZlbnRfcGF5bG9hZF91X3R5cGUgKmxvY19ldmVudF9wYXlsb2FkOwotfTsKLXR5cGVkZWYgc3RydWN0IHJwY19sb2NfZXZlbnRfY2JfZl90eXBlX2FyZ3MgcnBjX2xvY19ldmVudF9jYl9mX3R5cGVfYXJnczsKLQotc3RydWN0IHJwY19sb2NfZXZlbnRfY2JfZl90eXBlX3JldHMgewotCXJwY19pbnQzMiBsb2NfZXZlbnRfY2JfZl90eXBlX3Jlc3VsdDsKLX07Ci10eXBlZGVmIHN0cnVjdCBycGNfbG9jX2V2ZW50X2NiX2ZfdHlwZV9yZXRzIHJwY19sb2NfZXZlbnRfY2JfZl90eXBlX3JldHM7Ci0jZGVmaW5lIExPQ19BUElDQlZFUlMgMHgwMDAxMDAwMQotCi0jZGVmaW5lIExPQ19BUElDQlBST0cgMHgzMTAwMDA4YwotI2RlZmluZSBMT0NfQVBJQ0JWRVJTXzAwMDEgMHgwMDAxMDAwMQotCi0jaWYgZGVmaW5lZChfX1NURENfXykgfHwgZGVmaW5lZChfX2NwbHVzcGx1cykKLSNkZWZpbmUgcnBjX2xvY19ldmVudF9jYl9mX3R5cGUgMQotZXh0ZXJuICBlbnVtIGNsbnRfc3RhdCBycGNfbG9jX2V2ZW50X2NiX2ZfdHlwZV8weDAwMDEwMDAxKHJwY19sb2NfZXZlbnRfY2JfZl90eXBlX2FyZ3MgKiwgcnBjX2xvY19ldmVudF9jYl9mX3R5cGVfcmV0cyAqLCBDTElFTlQgKik7Ci1leHRlcm4gIGJvb2xfdCBycGNfbG9jX2V2ZW50X2NiX2ZfdHlwZV8weDAwMDEwMDAxX3N2YyhycGNfbG9jX2V2ZW50X2NiX2ZfdHlwZV9hcmdzICosIHJwY19sb2NfZXZlbnRfY2JfZl90eXBlX3JldHMgKiwgc3RydWN0IHN2Y19yZXEgKik7Ci1leHRlcm4gaW50IGxvY19hcGljYnByb2dfMHgwMDAxMDAwMV9mcmVlcmVzdWx0IChTVkNYUFJUICosIHhkcnByb2NfdCwgY2FkZHJfdCk7Ci0KLSNlbHNlIC8qIEsmUiBDICovCi0jZGVmaW5lIHJwY19sb2NfZXZlbnRfY2JfZl90eXBlIDEKLWV4dGVybiAgZW51bSBjbG50X3N0YXQgcnBjX2xvY19ldmVudF9jYl9mX3R5cGVfMHgwMDAxMDAwMSgpOwotZXh0ZXJuICBib29sX3QgcnBjX2xvY19ldmVudF9jYl9mX3R5cGVfMHgwMDAxMDAwMV9zdmMoKTsKLWV4dGVybiBpbnQgbG9jX2FwaWNicHJvZ18weDAwMDEwMDAxX2ZyZWVyZXN1bHQgKCk7Ci0jZW5kaWYgLyogSyZSIEMgKi8KLQotLyogdGhlIHhkciBmdW5jdGlvbnMgKi8KLQotI2lmIGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoX19jcGx1c3BsdXMpCi1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19ldmVudF9jYl9mX3R5cGVfYXJncyAoWERSICosIHJwY19sb2NfZXZlbnRfY2JfZl90eXBlX2FyZ3MqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX2V2ZW50X2NiX2ZfdHlwZV9yZXRzIChYRFIgKiwgcnBjX2xvY19ldmVudF9jYl9mX3R5cGVfcmV0cyopOwotCi0jZWxzZSAvKiBLJlIgQyAqLwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19ldmVudF9jYl9mX3R5cGVfYXJncyAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2NfZXZlbnRfY2JfZl90eXBlX3JldHMgKCk7Ci0KLSNlbmRpZiAvKiBLJlIgQyAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYgLyogIV9MT0NfQVBJX0NCX0hfUlBDR0VOICovCmRpZmYgLS1naXQgYS9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaS1ycGMvaW5jLTMyMDAvbG9jX2FwaV9jb21tb24uaCBiL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpLXJwYy9pbmMtMzIwMC9sb2NfYXBpX2NvbW1vbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGJlMDc5Li4wMDAwMDAwCi0tLSBhL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpLXJwYy9pbmMtMzIwMC9sb2NfYXBpX2NvbW1vbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAzMSArMCwwIEBACi0vKgotICogUGxlYXNlIGRvIG5vdCBlZGl0IHRoaXMgZmlsZS4KLSAqIEl0IHdhcyBnZW5lcmF0ZWQgdXNpbmcgcnBjZ2VuLgotICovCi0KLSNpZm5kZWYgX0xPQ19BUElfQ09NTU9OX0hfUlBDR0VOCi0jZGVmaW5lIF9MT0NfQVBJX0NPTU1PTl9IX1JQQ0dFTgotCi0jaW5jbHVkZSA8cnBjL3JwYy5oPgotI2luY2x1ZGUgImxvY19hcGlfZml4dXAuaCIKLQotI2luY2x1ZGUgPHB0aHJlYWQuaD4KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0jZGVmaW5lIFJQQ19MT0NfRVZFTlRfTklfTk9USUZZX1ZFUklGWV9SRVFVRVNUIDB4MDAwMDAwMTAKLSNkZWZpbmUgUlBDX0xPQ19FVkVOVF9JT0NUTF9SRVBPUlQgMHgwMDAwMDA4MAotI2RlZmluZSBSUENfTE9DX0VWRU5UX0xPQ0FUSU9OX1NFUlZFUl9SRVFVRVNUIDB4MDAwMDAwNDAKLSNkZWZpbmUgUlBDX0xPQ19FVkVOVF9SRVNFUlZFRCAweDgwMDAwMDAwMDAwMDAwMDAKLSNkZWZpbmUgUlBDX0xPQ19FVkVOVF9QQVJTRURfUE9TSVRJT05fUkVQT1JUIDB4MDAwMDAwMDEKLSNkZWZpbmUgUlBDX0xPQ19FVkVOVF9BU1NJU1RBTkNFX0RBVEFfUkVRVUVTVCAweDAwMDAwMDIwCi0jZGVmaW5lIFJQQ19MT0NfRVZFTlRfTk1FQV9QT1NJVElPTl9SRVBPUlQgMHgwMDAwMDAwOAotI2RlZmluZSBSUENfTE9DX0VWRU5UX1NBVEVMTElURV9SRVBPUlQgMHgwMDAwMDAwMgotI2RlZmluZSBSUENfTE9DX0VWRU5UX1NUQVRVU19SRVBPUlQgMHgwMDAwMDEwMAotI2RlZmluZSBSUENfTE9DX09QRU5fVkVSU0lPTiAweDAwMDEwMDAxCi0jZGVmaW5lIFJQQ19MT0NfQ0xPU0VfVkVSU0lPTiAweDAwMDEwMDAxCi0jZGVmaW5lIFJQQ19MT0NfU1RBUlRfRklYX1ZFUlNJT04gMHgwMDAxMDAwMQotI2RlZmluZSBSUENfTE9DX1NUT1BfRklYX1ZFUlNJT04gMHgwMDAxMDAwMQotI2RlZmluZSBSUENfTE9DX0lPQ1RMX1ZFUlNJT04gMHgwMDAxMDAwMQotI2RlZmluZSBSUENfTE9DX0VWRU5UX0NCX0ZfVFlQRV9WRVJTSU9OIDB4MDAwMTAwMDEKLSNkZWZpbmUgUlBDX0xPQ19BUElBUElfVkVSU0lPTl9JU19IQVNIS0VZIDAKLSNkZWZpbmUgUlBDX0xPQ19BUElfQVBJX01BSk9SX05VTSAweDAwMDEKLQotdHlwZWRlZiBib29sX3QgcnBjX2Jvb2xlYW47Ci0KLXR5cGVkZWYgdV9sb25nIHJwY191aW50MzI7Ci0KLXR5cGVkZWYgdV9zaG9ydCBycGNfdWludDE2OwotCi10eXBlZGVmIHVfY2hhciBycGNfdWludDg7Ci0KLXR5cGVkZWYgbG9uZyBycGNfaW50MzI7Ci0KLXR5cGVkZWYgdV9jaGFyIHJwY19ieXRlOwotCi10eXBlZGVmIHVfcXVhZF90IHJwY191aW50NjQ7Ci0KLXR5cGVkZWYgcnBjX2ludDMyIHJwY19sb2NfY2xpZW50X2hhbmRsZV90eXBlOwotCi10eXBlZGVmIHJwY191aW50NjQgcnBjX2xvY19ldmVudF9tYXNrX3R5cGU7Ci0KLXR5cGVkZWYgcnBjX3VpbnQ2NCBycGNfbG9jX3Bvc2l0aW9uX3ZhbGlkX21hc2tfdHlwZTsKLQotdHlwZWRlZiBycGNfdWludDMyIHJwY19sb2NfcG9zX3RlY2hub2xvZ3lfbWFza190eXBlOwotCi1lbnVtIHJwY19sb2Nfc2Vzc2lvbl9zdGF0dXNfZV90eXBlIHsKLQlSUENfTE9DX1NFU1NfU1RBVFVTX1NVQ0NFU1MgPSAwLAotCVJQQ19MT0NfU0VTU19TVEFUVVNfSU5fUFJPR0VTUyA9IDEsCi0JUlBDX0xPQ19TRVNTX1NUQVRVU19HRU5FUkFMX0ZBSUxVUkUgPSAyLAotCVJQQ19MT0NfU0VTU19TVEFUVVNfVElNRU9VVCA9IDMsCi0JUlBDX0xPQ19TRVNTX1NUQVRVU19VU0VSX0VORCA9IDQsCi0JUlBDX0xPQ19TRVNTX1NUQVRVU19CQURfUEFSQU1FVEVSID0gNSwKLQlSUENfTE9DX1NFU1NfU1RBVFVTX1BIT05FX09GRkxJTkUgPSA2LAotCVJQQ19MT0NfU0VTU19TVEFUVVNfRU5HSU5FX0xPQ0tFRCA9IDcsCi0JUlBDX0xPQ19TRVNTX1NUQVRVU19NQVggPSAyNjg0MzU0NTYsCi19OwotdHlwZWRlZiBlbnVtIHJwY19sb2Nfc2Vzc2lvbl9zdGF0dXNfZV90eXBlIHJwY19sb2Nfc2Vzc2lvbl9zdGF0dXNfZV90eXBlOwotCi1zdHJ1Y3QgcnBjX2xvY19jYWxlbmRhcl90aW1lX3NfdHlwZSB7Ci0JcnBjX3VpbnQxNiB5ZWFyOwotCXVfY2hhciBtb250aDsKLQl1X2NoYXIgZGF5X29mX3dlZWs7Ci0JdV9jaGFyIGRheTsKLQl1X2NoYXIgaG91cjsKLQl1X2NoYXIgbWludXRlOwotCXVfY2hhciBzZWNvbmQ7Ci0JcnBjX3VpbnQxNiBtaWxsaXNlY29uZDsKLX07Ci10eXBlZGVmIHN0cnVjdCBycGNfbG9jX2NhbGVuZGFyX3RpbWVfc190eXBlIHJwY19sb2NfY2FsZW5kYXJfdGltZV9zX3R5cGU7Ci0KLXN0cnVjdCBycGNfbG9jX3BhcnNlZF9wb3NpdGlvbl9zX3R5cGUgewotCXJwY19sb2NfcG9zaXRpb25fdmFsaWRfbWFza190eXBlIHZhbGlkX21hc2s7Ci0JcnBjX2xvY19zZXNzaW9uX3N0YXR1c19lX3R5cGUgc2Vzc2lvbl9zdGF0dXM7Ci0JcnBjX2xvY19jYWxlbmRhcl90aW1lX3NfdHlwZSB0aW1lc3RhbXBfY2FsZW5kYXI7Ci0JcnBjX3VpbnQ2NCB0aW1lc3RhbXBfdXRjOwotCXJwY191aW50OCBsZWFwX3NlY29uZHM7Ci0JZmxvYXQgdGltZV91bmM7Ci0JZG91YmxlIGxhdGl0dWRlOwotCWRvdWJsZSBsb25naXR1ZGU7Ci0JZmxvYXQgYWx0aXR1ZGVfd3J0X2VsbGlwc29pZDsKLQlmbG9hdCBhbHRpdHVkZV93cnRfbWVhbl9zZWFfbGV2ZWw7Ci0JZmxvYXQgc3BlZWRfaG9yaXpvbnRhbDsKLQlmbG9hdCBzcGVlZF92ZXJ0aWNhbDsKLQlmbG9hdCBoZWFkaW5nOwotCWZsb2F0IGhvcl91bmNfY2lyY3VsYXI7Ci0JZmxvYXQgaG9yX3VuY19lbGxpcHNlX3NlbWlfbWFqb3I7Ci0JZmxvYXQgaG9yX3VuY19lbGxpcHNlX3NlbWlfbWlub3I7Ci0JZmxvYXQgaG9yX3VuY19lbGxpcHNlX29yaWVudF9hemltdXRoOwotCWZsb2F0IHZlcnRfdW5jOwotCWZsb2F0IHNwZWVkX3VuYzsKLQlmbG9hdCBoZWFkaW5nX3VuYzsKLQl1X2NoYXIgY29uZmlkZW5jZV9ob3Jpem9udGFsOwotCXVfY2hhciBjb25maWRlbmNlX3ZlcnRpY2FsOwotCWZsb2F0IG1hZ25ldGljX2RldmlhdGlvbjsKLQlycGNfbG9jX3Bvc190ZWNobm9sb2d5X21hc2tfdHlwZSB0ZWNobm9sb2d5X21hc2s7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgcnBjX2xvY19wYXJzZWRfcG9zaXRpb25fc190eXBlIHJwY19sb2NfcGFyc2VkX3Bvc2l0aW9uX3NfdHlwZTsKLQotZW51bSBycGNfbG9jX3N2X3N5c3RlbV9lX3R5cGUgewotCVJQQ19MT0NfU1ZfU1lTVEVNX0dQUyA9IDEsCi0JUlBDX0xPQ19TVl9TWVNURU1fR0FMSUxFTyA9IDIsCi0JUlBDX0xPQ19TVl9TWVNURU1fU0JBUyA9IDMsCi0JUlBDX0xPQ19TVl9TWVNURU1fQ09NUEFTUyA9IDQsCi0JUlBDX0xPQ19TVl9TWVNURU1fR0xPTkFTUyA9IDUsCi0JUlBDX0xPQ19TVl9TWVNURU1fTUFYID0gMjY4NDM1NDU2LAotfTsKLXR5cGVkZWYgZW51bSBycGNfbG9jX3N2X3N5c3RlbV9lX3R5cGUgcnBjX2xvY19zdl9zeXN0ZW1fZV90eXBlOwotCi1lbnVtIHJwY19sb2Nfc3Zfc3RhdHVzX2VfdHlwZSB7Ci0JUlBDX0xPQ19TVl9TVEFUVVNfSURMRSA9IDEsCi0JUlBDX0xPQ19TVl9TVEFUVVNfU0VBUkNIID0gMiwKLQlSUENfTE9DX1NWX1NUQVRVU19UUkFDSyA9IDMsCi0JUlBDX0xPQ19TVl9TVEFUVVNfTUFYID0gMjY4NDM1NDU2LAotfTsKLXR5cGVkZWYgZW51bSBycGNfbG9jX3N2X3N0YXR1c19lX3R5cGUgcnBjX2xvY19zdl9zdGF0dXNfZV90eXBlOwotCi10eXBlZGVmIHJwY191aW50MzIgcnBjX2xvY19zdl9pbmZvX3ZhbGlkX21hc2tfdHlwZTsKLQotc3RydWN0IHJwY19sb2Nfc3ZfaW5mb19zX3R5cGUgewotCXJwY19sb2Nfc3ZfaW5mb192YWxpZF9tYXNrX3R5cGUgdmFsaWRfbWFzazsKLQlycGNfbG9jX3N2X3N5c3RlbV9lX3R5cGUgc3lzdGVtOwotCXJwY191aW50OCBwcm47Ci0JcnBjX3VpbnQ4IGhlYWx0aF9zdGF0dXM7Ci0JcnBjX2xvY19zdl9zdGF0dXNfZV90eXBlIHByb2Nlc3Nfc3RhdHVzOwotCXJwY19ib29sZWFuIGhhc19lcGg7Ci0JcnBjX2Jvb2xlYW4gaGFzX2FsbTsKLQlmbG9hdCBlbGV2YXRpb247Ci0JZmxvYXQgYXppbXV0aDsKLQlmbG9hdCBzbnI7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgcnBjX2xvY19zdl9pbmZvX3NfdHlwZSBycGNfbG9jX3N2X2luZm9fc190eXBlOwotCi10eXBlZGVmIHJwY191aW50MzIgcnBjX2xvY19nbnNzX2luZm9fdmFsaWRfbWFza190eXBlOwotCi1zdHJ1Y3QgcnBjX2xvY19nbnNzX2luZm9fc190eXBlIHsKLQlycGNfbG9jX2duc3NfaW5mb192YWxpZF9tYXNrX3R5cGUgdmFsaWRfbWFzazsKLQlmbG9hdCBwb3NpdGlvbl9kb3A7Ci0JZmxvYXQgaG9yaXpvbnRhbF9kb3A7Ci0JZmxvYXQgdmVydGljYWxfZG9wOwotCXJwY19ib29sZWFuIGFsdGl0dWRlX2Fzc3VtZWQ7Ci0JcnBjX3VpbnQxNiBzdl9jb3VudDsKLQlzdHJ1Y3QgewotCQl1X2ludCBzdl9saXN0X2xlbjsKLQkJcnBjX2xvY19zdl9pbmZvX3NfdHlwZSAqc3ZfbGlzdF92YWw7Ci0JfSBzdl9saXN0OwotfTsKLXR5cGVkZWYgc3RydWN0IHJwY19sb2NfZ25zc19pbmZvX3NfdHlwZSBycGNfbG9jX2duc3NfaW5mb19zX3R5cGU7Ci0KLXN0cnVjdCBycGNfbG9jX25tZWFfcmVwb3J0X3NfdHlwZSB7Ci0JcnBjX3VpbnQxNiBsZW5ndGg7Ci0Jc3RydWN0IHsKLQkJdV9pbnQgbm1lYV9zZW50ZW5jZXNfbGVuOwotCQljaGFyICpubWVhX3NlbnRlbmNlc192YWw7Ci0JfSBubWVhX3NlbnRlbmNlczsKLX07Ci10eXBlZGVmIHN0cnVjdCBycGNfbG9jX25tZWFfcmVwb3J0X3NfdHlwZSBycGNfbG9jX25tZWFfcmVwb3J0X3NfdHlwZTsKLQotZW51bSBycGNfbG9jX3N0YXR1c19ldmVudF9lX3R5cGUgewotCVJQQ19MT0NfU1RBVFVTX0VWRU5UX0VOR0lORV9TVEFURSA9IDEsCi0JUlBDX0xPQ19TVEFUVVNfRVZFTlRfTUFYID0gMjY4NDM1NDU2LAotfTsKLXR5cGVkZWYgZW51bSBycGNfbG9jX3N0YXR1c19ldmVudF9lX3R5cGUgcnBjX2xvY19zdGF0dXNfZXZlbnRfZV90eXBlOwotCi1lbnVtIHJwY19sb2NfZW5naW5lX3N0YXRlX2VfdHlwZSB7Ci0JUlBDX0xPQ19FTkdJTkVfU1RBVEVfT04gPSAxLAotCVJQQ19MT0NfRU5HSU5FX1NUQVRFX09GRiA9IDIsCi0JUlBDX0xPQ19FTkdJTkVfU1RBVEVfTUFYID0gMjY4NDM1NDU2LAotfTsKLXR5cGVkZWYgZW51bSBycGNfbG9jX2VuZ2luZV9zdGF0ZV9lX3R5cGUgcnBjX2xvY19lbmdpbmVfc3RhdGVfZV90eXBlOwotCi1zdHJ1Y3QgcnBjX2xvY19zdGF0dXNfZXZlbnRfcGF5bG9hZF91X3R5cGUgewotCXJwY19sb2Nfc3RhdHVzX2V2ZW50X2VfdHlwZSBkaXNjOwotCXVuaW9uIHsKLQkJcnBjX2xvY19lbmdpbmVfc3RhdGVfZV90eXBlIGVuZ2luZV9zdGF0ZTsKLQl9IHJwY19sb2Nfc3RhdHVzX2V2ZW50X3BheWxvYWRfdV90eXBlX3U7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgcnBjX2xvY19zdGF0dXNfZXZlbnRfcGF5bG9hZF91X3R5cGUgcnBjX2xvY19zdGF0dXNfZXZlbnRfcGF5bG9hZF91X3R5cGU7Ci0KLXN0cnVjdCBycGNfbG9jX3N0YXR1c19ldmVudF9zX3R5cGUgewotCXJwY19sb2Nfc3RhdHVzX2V2ZW50X2VfdHlwZSBldmVudDsKLQlycGNfbG9jX3N0YXR1c19ldmVudF9wYXlsb2FkX3VfdHlwZSBwYXlsb2FkOwotfTsKLXR5cGVkZWYgc3RydWN0IHJwY19sb2Nfc3RhdHVzX2V2ZW50X3NfdHlwZSBycGNfbG9jX3N0YXR1c19ldmVudF9zX3R5cGU7Ci0KLWVudW0gcnBjX2xvY19zZXJ2ZXJfYWRkcl9lX3R5cGUgewotCVJQQ19MT0NfU0VSVkVSX0FERFJfSVBWNCA9IDEsCi0JUlBDX0xPQ19TRVJWRVJfQUREUl9VUkwgPSAyLAotCVJQQ19MT0NfU0VSVkVSX0FERFJfTUFYID0gMjY4NDM1NDU2LAotfTsKLXR5cGVkZWYgZW51bSBycGNfbG9jX3NlcnZlcl9hZGRyX2VfdHlwZSBycGNfbG9jX3NlcnZlcl9hZGRyX2VfdHlwZTsKLQotc3RydWN0IHJwY19sb2Nfc2VydmVyX2FkZHJfaXB2NF90eXBlIHsKLQlycGNfdWludDMyIGFkZHI7Ci0JcnBjX3VpbnQxNiBwb3J0OwotfTsKLXR5cGVkZWYgc3RydWN0IHJwY19sb2Nfc2VydmVyX2FkZHJfaXB2NF90eXBlIHJwY19sb2Nfc2VydmVyX2FkZHJfaXB2NF90eXBlOwotCi1zdHJ1Y3QgcnBjX2xvY19zZXJ2ZXJfYWRkcl91cmxfdHlwZSB7Ci0JcnBjX3VpbnQxNiBsZW5ndGg7Ci0Jc3RydWN0IHsKLQkJdV9pbnQgYWRkcl9sZW47Ci0JCWNoYXIgKmFkZHJfdmFsOwotCX0gYWRkcjsKLX07Ci10eXBlZGVmIHN0cnVjdCBycGNfbG9jX3NlcnZlcl9hZGRyX3VybF90eXBlIHJwY19sb2Nfc2VydmVyX2FkZHJfdXJsX3R5cGU7Ci0KLXN0cnVjdCBycGNfbG9jX3NlcnZlcl9hZGRyX3VfdHlwZSB7Ci0JcnBjX2xvY19zZXJ2ZXJfYWRkcl9lX3R5cGUgZGlzYzsKLQl1bmlvbiB7Ci0JCXJwY19sb2Nfc2VydmVyX2FkZHJfaXB2NF90eXBlIGlwdjQ7Ci0JCXJwY19sb2Nfc2VydmVyX2FkZHJfdXJsX3R5cGUgdXJsOwotCX0gcnBjX2xvY19zZXJ2ZXJfYWRkcl91X3R5cGVfdTsKLX07Ci10eXBlZGVmIHN0cnVjdCBycGNfbG9jX3NlcnZlcl9hZGRyX3VfdHlwZSBycGNfbG9jX3NlcnZlcl9hZGRyX3VfdHlwZTsKLQotc3RydWN0IHJwY19sb2Nfc2VydmVyX2luZm9fc190eXBlIHsKLQlycGNfbG9jX3NlcnZlcl9hZGRyX2VfdHlwZSBhZGRyX3R5cGU7Ci0JcnBjX2xvY19zZXJ2ZXJfYWRkcl91X3R5cGUgYWRkcl9pbmZvOwotfTsKLXR5cGVkZWYgc3RydWN0IHJwY19sb2Nfc2VydmVyX2luZm9fc190eXBlIHJwY19sb2Nfc2VydmVyX2luZm9fc190eXBlOwotCi1lbnVtIHJwY19sb2Nfbmlfbm90aWZ5X3ZlcmlmeV9lX3R5cGUgewotCVJQQ19MT0NfTklfVVNFUl9OT19OT1RJRllfTk9fVkVSSUZZID0gMSwKLQlSUENfTE9DX05JX1VTRVJfTk9USUZZX09OTFkgPSAyLAotCVJQQ19MT0NfTklfVVNFUl9OT1RJRllfVkVSSUZZX0FMTE9XX05PX1JFU1AgPSAzLAotCVJQQ19MT0NfTklfVVNFUl9OT1RJRllfVkVSSUZZX05PVF9BTExPV19OT19SRVNQID0gNCwKLQlSUENfTE9DX05JX1VTRVJfUFJJVkFDWV9PVkVSUklERSA9IDUsCi0JUlBDX0xPQ19OSV9VU0VSX05PVElGWV9WRVJJVFlfVFlQRV9NQVggPSAyNjg0MzU0NTYsCi19OwotdHlwZWRlZiBlbnVtIHJwY19sb2Nfbmlfbm90aWZ5X3ZlcmlmeV9lX3R5cGUgcnBjX2xvY19uaV9ub3RpZnlfdmVyaWZ5X2VfdHlwZTsKLQotZW51bSBycGNfbG9jX25pX2V2ZW50X2VfdHlwZSB7Ci0JUlBDX0xPQ19OSV9FVkVOVF9WWF9OT1RJRllfVkVSSUZZX1JFUSA9IDEsCi0JUlBDX0xPQ19OSV9FVkVOVF9TVVBMX05PVElGWV9WRVJJRllfUkVRID0gMiwKLQlSUENfTE9DX05JX0VWRU5UX1VNVFNfQ1BfTk9USUZZX1ZFUklGWV9SRVEgPSAzLAotCVJQQ19MT0NfTklfRVZFTlRfTUFYID0gMjY4NDM1NDU2LAotfTsKLXR5cGVkZWYgZW51bSBycGNfbG9jX25pX2V2ZW50X2VfdHlwZSBycGNfbG9jX25pX2V2ZW50X2VfdHlwZTsKLQotZW51bSBycGNfbG9jX25pX2RhdGFjb2Rpbmdfc2NoZW1lX2VfdHlwZSB7Ci0JUlBDX0xPQ19OSV9QUkVTVVBMX0lTTzY0NklSViA9IDAsCi0JUlBDX0xPQ19OSV9QUkVTVVBMX0lTTzg4NTkgPSAxLAotCVJQQ19MT0NfTklfUFJFU1VQTF9VVEY4ID0gMiwKLQlSUENfTE9DX05JX1BSRVNVUExfVVRGMTYgPSAzLAotCVJQQ19MT0NfTklfUFJFU1VQTF9VQ1MyID0gNCwKLQlSUENfTE9DX05JX1BSRVNVUExfR1NNX0RFRkFVTFQgPSA1LAotCVJQQ19MT0NfTklfUFJFU1VQTF9TSElGVF9KSVMgPSA2LAotCVJQQ19MT0NfTklfUFJFU1VQTF9KSVMgPSA3LAotCVJQQ19MT0NfTklfUFJFU1VQTF9FVUMgPSA4LAotCVJQQ19MT0NfTklfUFJFU1VQTF9HQjIzMTIgPSA5LAotCVJQQ19MT0NfTklfUFJFU1VQTF9DTlMxMTY0MyA9IDEwLAotCVJQQ19MT0NfTklfUFJFU1VQTF9LU0MxMDAxID0gMTEsCi0JUlBDX0xPQ19OSV9QUkVTVVBMX0VOQ09ESU5HX1VOS05PV04gPSAyMTQ3NDgzNjQ3LAotCVJQQ19MT0NfTklfU1NfR0VSTUFOID0gMTIsCi0JUlBDX0xPQ19OSV9TU19FTkdMSVNIID0gMTMsCi0JUlBDX0xPQ19OSV9TU19JVEFMSUFOID0gMTQsCi0JUlBDX0xPQ19OSV9TU19GUkVOQ0ggPSAxNSwKLQlSUENfTE9DX05JX1NTX1NQQU5JU0ggPSAxNiwKLQlSUENfTE9DX05JX1NTX0RVVENIID0gMTcsCi0JUlBDX0xPQ19OSV9TU19TV0VESVNIID0gMTgsCi0JUlBDX0xPQ19OSV9TU19EQU5JU0ggPSAxOSwKLQlSUENfTE9DX05JX1NTX1BPUlRVR1VFU0UgPSAyMCwKLQlSUENfTE9DX05JX1NTX0ZJTk5JU0ggPSAyMSwKLQlSUENfTE9DX05JX1NTX05PUldFR0lBTiA9IDIyLAotCVJQQ19MT0NfTklfU1NfR1JFRUsgPSAyMywKLQlSUENfTE9DX05JX1NTX1RVUktJU0ggPSAyNCwKLQlSUENfTE9DX05JX1NTX0hVTkdBUklBTiA9IDI1LAotCVJQQ19MT0NfTklfU1NfUE9MSVNIID0gMjYsCi0JUlBDX0xPQ19OSV9TU19MQU5HVUFHRV9VTlNQRUMgPSAyNywKLQlSUENfTE9DX05JX1NVUExfVVRGOCA9IDI4LAotCVJQQ19MT0NfTklfU1VQTF9VQ1MyID0gMjksCi0JUlBDX0xPQ19OSV9TVVBMX0dTTV9ERUZBVUxUID0gMzAsCi0JUlBDX0xPQ19OSV9TVVBMX0VOQ09ESU5HX1VOS05PV04gPSAyMTQ3NDgzNjQ3LAotfTsKLXR5cGVkZWYgZW51bSBycGNfbG9jX25pX2RhdGFjb2Rpbmdfc2NoZW1lX2VfdHlwZSBycGNfbG9jX25pX2RhdGFjb2Rpbmdfc2NoZW1lX2VfdHlwZTsKLQotZW51bSBycGNfbG9jX25pX3Z4X3JlcXVlc3Rlcl9pZF9lbmNvZGluZ19zY2hlbWVfZV90eXBlIHsKLQlSUENfTE9DX05JX1ZYX09DVEVUID0gMCwKLQlSUENfTE9DX05JX1ZYX0VYTl9QUk9UT0NPTF9NU0cgPSAxLAotCVJQQ19MT0NfTklfVlhfQVNDSUkgPSAyLAotCVJQQ19MT0NfTklfVlhfSUE1ID0gMywKLQlSUENfTE9DX05JX1ZYX1VOSUNPREUgPSA0LAotCVJQQ19MT0NfTklfVlhfU0hJRlRfSklTID0gNSwKLQlSUENfTE9DX05JX1ZYX0tPUkVBTiA9IDYsCi0JUlBDX0xPQ19OSV9WWF9MQVRJTl9IRUJSRVcgPSA3LAotCVJQQ19MT0NfTklfVlhfTEFUSU4gPSA4LAotCVJQQ19MT0NfTklfVlhfR1NNID0gOSwKLQlSUENfTE9DX05JX1ZYX0VOQ09ESU5HX1RZUEVfTUFYID0gMjY4NDM1NDU2LAotfTsKLXR5cGVkZWYgZW51bSBycGNfbG9jX25pX3Z4X3JlcXVlc3Rlcl9pZF9lbmNvZGluZ19zY2hlbWVfZV90eXBlIHJwY19sb2NfbmlfdnhfcmVxdWVzdGVyX2lkX2VuY29kaW5nX3NjaGVtZV9lX3R5cGU7Ci0KLWVudW0gcnBjX2xvY19uaV92eF9wb3NfbW9kZV9lX3R5cGUgewotCVJQQ19MT0NfVlhfTVNfQVNTSVNURURfT05MWSA9IDEsCi0JUlBDX0xPQ19WWF9NU19CQVNFRF9PTkxZID0gMiwKLQlSUENfTE9DX1ZYX01TX0FTU0lTVEVEX1BSRUZfTVNCQVNFRF9BTExXRCA9IDMsCi0JUlBDX0xPQ19WWF9NU19CQVNFRF9QUkVGX0FTU0lTVEVEX0FMTFdEID0gNCwKLQlSUENfTE9DX1ZYX1BPU19NT0RFX01BWCA9IDI2ODQzNTQ1NiwKLX07Ci10eXBlZGVmIGVudW0gcnBjX2xvY19uaV92eF9wb3NfbW9kZV9lX3R5cGUgcnBjX2xvY19uaV92eF9wb3NfbW9kZV9lX3R5cGU7Ci0KLXN0cnVjdCBycGNfbG9jX25pX3Z4X3JlcXVlc3Rlcl9pZF9zX3R5cGUgewotCXVfY2hhciByZXF1ZXN0ZXJfaWRfbGVuZ3RoOwotCWNoYXIgcmVxdWVzdGVyX2lkWzIwMF07Ci19OwotdHlwZWRlZiBzdHJ1Y3QgcnBjX2xvY19uaV92eF9yZXF1ZXN0ZXJfaWRfc190eXBlIHJwY19sb2NfbmlfdnhfcmVxdWVzdGVyX2lkX3NfdHlwZTsKLQotc3RydWN0IHJwY19sb2Nfbmlfdnhfbm90aWZ5X3ZlcmlmeV9yZXFfc190eXBlIHsKLQlycGNfbG9jX25pX25vdGlmeV92ZXJpZnlfZV90eXBlIG5vdGlmaWNhdGlvbl9wcml2X3R5cGU7Ci0JdV9jaGFyIHBvc19xb3NfaW5jbDsKLQl1X2NoYXIgcG9zX3FvczsKLQlycGNfdWludDMyIG51bV9maXhlczsKLQlycGNfdWludDMyIHRiZjsKLQlycGNfbG9jX25pX3Z4X3Bvc19tb2RlX2VfdHlwZSBwb3NfbW9kZTsKLQlycGNfbG9jX25pX3Z4X3JlcXVlc3Rlcl9pZF9lbmNvZGluZ19zY2hlbWVfZV90eXBlIGVuY29kaW5nX3NjaGVtZTsKLQlycGNfbG9jX25pX3Z4X3JlcXVlc3Rlcl9pZF9zX3R5cGUgcmVxdWVzdGVyX2lkOwotCXJwY191aW50MTYgdXNlcl9yZXNwX3RpbWVyX3ZhbDsKLX07Ci10eXBlZGVmIHN0cnVjdCBycGNfbG9jX25pX3Z4X25vdGlmeV92ZXJpZnlfcmVxX3NfdHlwZSBycGNfbG9jX25pX3Z4X25vdGlmeV92ZXJpZnlfcmVxX3NfdHlwZTsKLQotZW51bSBycGNfbG9jX25pX3N1cGxfcG9zX21ldGhvZF9lX3R5cGUgewotCVJQQ19MT0NfTklfUE9TTUVUSE9EX0FHUFNfU0VUQVNTSVNURUQgPSAxLAotCVJQQ19MT0NfTklfUE9TTUVUSE9EX0FHUFNfU0VUQkFTRUQgPSAyLAotCVJQQ19MT0NfTklfUE9TTUVUSE9EX0FHUFNfU0VUQVNTSVNURURfUFJFRiA9IDMsCi0JUlBDX0xPQ19OSV9QT1NNRVRIT0RfQUdQU19TRVRCQVNFRF9QUkVGID0gNCwKLQlSUENfTE9DX05JX1BPU01FVEhPRF9BVVRPTk9NT1VTX0dQUyA9IDUsCi0JUlBDX0xPQ19OSV9QT1NNRVRIT0RfQUZMVCA9IDYsCi0JUlBDX0xPQ19OSV9QT1NNRVRIT0RfRUNJRCA9IDcsCi0JUlBDX0xPQ19OSV9QT1NNRVRIT0RfRU9URCA9IDgsCi0JUlBDX0xPQ19OSV9QT1NNRVRIT0RfT1RET0EgPSA5LAotCVJQQ19MT0NfTklfUE9TTUVUSE9EX05PX1BPU0lUSU9OID0gMTAsCi0JUlBDX0xPQ19OSV9QT1NNRVRIT0RfTUFYID0gMjY4NDM1NDU2LAotfTsKLXR5cGVkZWYgZW51bSBycGNfbG9jX25pX3N1cGxfcG9zX21ldGhvZF9lX3R5cGUgcnBjX2xvY19uaV9zdXBsX3Bvc19tZXRob2RfZV90eXBlOwotCi1zdHJ1Y3QgcnBjX2xvY19uaV9zdXBsX3NscF9zZXNzaW9uX2lkX3NfdHlwZSB7Ci0JdV9jaGFyIHByZXNlbmNlOwotCWNoYXIgc2Vzc2lvbl9pZFs0XTsKLQlycGNfbG9jX3NlcnZlcl9pbmZvX3NfdHlwZSBzbHBfYWRkcmVzczsKLX07Ci10eXBlZGVmIHN0cnVjdCBycGNfbG9jX25pX3N1cGxfc2xwX3Nlc3Npb25faWRfc190eXBlIHJwY19sb2Nfbmlfc3VwbF9zbHBfc2Vzc2lvbl9pZF9zX3R5cGU7Ci0KLXN0cnVjdCBycGNfbG9jX25pX3JlcXVlc3Rvcl9pZF9zX3R5cGUgewotCXVfY2hhciBkYXRhX2NvZGluZ19zY2hlbWU7Ci0Jc3RydWN0IHsKLQkJdV9pbnQgcmVxdWVzdG9yX2lkX3N0cmluZ19sZW47Ci0JCWNoYXIgKnJlcXVlc3Rvcl9pZF9zdHJpbmdfdmFsOwotCX0gcmVxdWVzdG9yX2lkX3N0cmluZzsKLQl1X2NoYXIgc3RyaW5nX2xlbjsKLX07Ci10eXBlZGVmIHN0cnVjdCBycGNfbG9jX25pX3JlcXVlc3Rvcl9pZF9zX3R5cGUgcnBjX2xvY19uaV9yZXF1ZXN0b3JfaWRfc190eXBlOwotCi1zdHJ1Y3QgcnBjX2xvY19uaV9zdXBsX2NsaWVudF9uYW1lX3NfdHlwZSB7Ci0JdV9jaGFyIGRhdGFfY29kaW5nX3NjaGVtZTsKLQlzdHJ1Y3QgewotCQl1X2ludCBjbGllbnRfbmFtZV9zdHJpbmdfbGVuOwotCQljaGFyICpjbGllbnRfbmFtZV9zdHJpbmdfdmFsOwotCX0gY2xpZW50X25hbWVfc3RyaW5nOwotCXVfY2hhciBzdHJpbmdfbGVuOwotfTsKLXR5cGVkZWYgc3RydWN0IHJwY19sb2Nfbmlfc3VwbF9jbGllbnRfbmFtZV9zX3R5cGUgcnBjX2xvY19uaV9zdXBsX2NsaWVudF9uYW1lX3NfdHlwZTsKLQotc3RydWN0IHJwY19sb2Nfbmlfc3VwbF9xb3Bfc190eXBlIHsKLQl1X2NoYXIgYml0X21hc2s7Ci0JdV9jaGFyIGhvcmFjYzsKLQl1X2NoYXIgdmVyYWNjOwotCXVfY2hhciBtYXhMb2NBZ2U7Ci0JdV9jaGFyIGRlbGF5OwotfTsKLXR5cGVkZWYgc3RydWN0IHJwY19sb2Nfbmlfc3VwbF9xb3Bfc190eXBlIHJwY19sb2Nfbmlfc3VwbF9xb3Bfc190eXBlOwotCi1zdHJ1Y3QgcnBjX2xvY19uaV9zdXBsX25vdGlmeV92ZXJpZnlfcmVxX3NfdHlwZSB7Ci0JcnBjX2xvY19uaV9ub3RpZnlfdmVyaWZ5X2VfdHlwZSBub3RpZmljYXRpb25fcHJpdl90eXBlOwotCXJwY191aW50MTYgZmxhZ3M7Ci0JcnBjX2xvY19uaV9zdXBsX3NscF9zZXNzaW9uX2lkX3NfdHlwZSBzdXBsX3NscF9zZXNzaW9uX2lkOwotCWNoYXIgc3VwbF9oYXNoWzhdOwotCXJwY19sb2NfbmlfZGF0YWNvZGluZ19zY2hlbWVfZV90eXBlIGRhdGFjb2Rpbmdfc2NoZW1lOwotCXJwY19sb2Nfbmlfc3VwbF9wb3NfbWV0aG9kX2VfdHlwZSBwb3NfbWV0aG9kOwotCXJwY19sb2NfbmlfcmVxdWVzdG9yX2lkX3NfdHlwZSByZXF1ZXN0b3JfaWQ7Ci0JcnBjX2xvY19uaV9zdXBsX2NsaWVudF9uYW1lX3NfdHlwZSBjbGllbnRfbmFtZTsKLQlycGNfbG9jX25pX3N1cGxfcW9wX3NfdHlwZSBzdXBsX3FvcDsKLQlycGNfdWludDE2IHVzZXJfcmVzcG9uc2VfdGltZXI7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgcnBjX2xvY19uaV9zdXBsX25vdGlmeV92ZXJpZnlfcmVxX3NfdHlwZSBycGNfbG9jX25pX3N1cGxfbm90aWZ5X3ZlcmlmeV9yZXFfc190eXBlOwotCi1zdHJ1Y3QgcnBjX2xvY19uaV9leHRfY2xpZW50X2FkZHJlc3Nfc190eXBlIHsKLQl1X2NoYXIgZXh0X2NsaWVudF9hZGRyZXNzX2xlbjsKLQlzdHJ1Y3QgewotCQl1X2ludCBleHRfY2xpZW50X2FkZHJlc3NfbGVuOwotCQljaGFyICpleHRfY2xpZW50X2FkZHJlc3NfdmFsOwotCX0gZXh0X2NsaWVudF9hZGRyZXNzOwotfTsKLXR5cGVkZWYgc3RydWN0IHJwY19sb2NfbmlfZXh0X2NsaWVudF9hZGRyZXNzX3NfdHlwZSBycGNfbG9jX25pX2V4dF9jbGllbnRfYWRkcmVzc19zX3R5cGU7Ci0KLWVudW0gcnBjX2xvY19uaV9sb2NhdGlvbl90eXBlX2VfdHlwZSB7Ci0JUlBDX0xPQ19OSV9MT0NBVElPTlRZUEVfQ1VSUkVOVF9MT0NBVElPTiA9IDEsCi0JUlBDX0xPQ19OSV9MT0NBVElPTlRZUEVfQ1VSUkVOVF9PUl9MQVNUX0tOT1dOX0xPQ0FUSU9OID0gMiwKLQlSUENfTE9DX05JX0xPQ0FUSU9OVFlQRV9JTklUSUFMX0xPQ0FUSU9OID0gMywKLQlSUENfTE9DX05JX0xPQ0FUSU9OVFlQRV9NQVggPSAyNjg0MzU0NTYsCi19OwotdHlwZWRlZiBlbnVtIHJwY19sb2NfbmlfbG9jYXRpb25fdHlwZV9lX3R5cGUgcnBjX2xvY19uaV9sb2NhdGlvbl90eXBlX2VfdHlwZTsKLQotc3RydWN0IHJwY19sb2NfbmlfZGVmZXJyZWRfbG9jYXRpb25fc190eXBlIHsKLQl1X2NoYXIgdW51c2VkX2JpdHM7Ci0JdV9jaGFyIG1zX2F2YWlsYWJsZTsKLX07Ci10eXBlZGVmIHN0cnVjdCBycGNfbG9jX25pX2RlZmVycmVkX2xvY2F0aW9uX3NfdHlwZSBycGNfbG9jX25pX2RlZmVycmVkX2xvY2F0aW9uX3NfdHlwZTsKLQotc3RydWN0IHJwY19sb2NfbmlfY29kZXdvcmRfc3RyaW5nX3NfdHlwZSB7Ci0JdV9jaGFyIGRhdGFfY29kaW5nX3NjaGVtZTsKLQlzdHJ1Y3QgewotCQl1X2ludCBsY3NfY29kZXdvcmRfc3RyaW5nX2xlbjsKLQkJY2hhciAqbGNzX2NvZGV3b3JkX3N0cmluZ192YWw7Ci0JfSBsY3NfY29kZXdvcmRfc3RyaW5nOwotCXVfY2hhciBzdHJpbmdfbGVuOwotfTsKLXR5cGVkZWYgc3RydWN0IHJwY19sb2NfbmlfY29kZXdvcmRfc3RyaW5nX3NfdHlwZSBycGNfbG9jX25pX2NvZGV3b3JkX3N0cmluZ19zX3R5cGU7Ci0KLXN0cnVjdCBycGNfbG9jX25pX3NlcnZpY2VfdHlwZV9pZF9zX3R5cGUgewotCXVfY2hhciBsY3Nfc2VydmljZV90eXBlX2lkOwotfTsKLXR5cGVkZWYgc3RydWN0IHJwY19sb2Nfbmlfc2VydmljZV90eXBlX2lkX3NfdHlwZSBycGNfbG9jX25pX3NlcnZpY2VfdHlwZV9pZF9zX3R5cGU7Ci0KLXN0cnVjdCBycGNfbG9jX25pX3VtdHNfY3Bfbm90aWZ5X3ZlcmlmeV9yZXFfc190eXBlIHsKLQlycGNfbG9jX25pX25vdGlmeV92ZXJpZnlfZV90eXBlIG5vdGlmaWNhdGlvbl9wcml2X3R5cGU7Ci0JdV9jaGFyIGludm9rZV9pZDsKLQlycGNfdWludDE2IGZsYWdzOwotCXVfY2hhciBub3RpZmljYXRpb25fbGVuZ3RoOwotCXN0cnVjdCB7Ci0JCXVfaW50IG5vdGlmaWNhdGlvbl90ZXh0X2xlbjsKLQkJY2hhciAqbm90aWZpY2F0aW9uX3RleHRfdmFsOwotCX0gbm90aWZpY2F0aW9uX3RleHQ7Ci0JcnBjX2xvY19uaV9kYXRhY29kaW5nX3NjaGVtZV9lX3R5cGUgZGF0YWNvZGluZ19zY2hlbWU7Ci0JcnBjX2xvY19uaV9leHRfY2xpZW50X2FkZHJlc3Nfc190eXBlIGV4dF9jbGllbnRfYWRkcmVzc19kYXRhOwotCXJwY19sb2NfbmlfbG9jYXRpb25fdHlwZV9lX3R5cGUgbG9jYXRpb25fdHlwZTsKLQlycGNfbG9jX25pX2RlZmVycmVkX2xvY2F0aW9uX3NfdHlwZSBkZWZlcnJlZF9sb2NhdGlvbjsKLQlycGNfbG9jX25pX3JlcXVlc3Rvcl9pZF9zX3R5cGUgcmVxdWVzdG9yX2lkOwotCXJwY19sb2NfbmlfY29kZXdvcmRfc3RyaW5nX3NfdHlwZSBjb2Rld29yZF9zdHJpbmc7Ci0JcnBjX2xvY19uaV9zZXJ2aWNlX3R5cGVfaWRfc190eXBlIHNlcnZpY2VfdHlwZV9pZDsKLQlycGNfdWludDE2IHVzZXJfcmVzcG9uc2VfdGltZXI7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgcnBjX2xvY19uaV91bXRzX2NwX25vdGlmeV92ZXJpZnlfcmVxX3NfdHlwZSBycGNfbG9jX25pX3VtdHNfY3Bfbm90aWZ5X3ZlcmlmeV9yZXFfc190eXBlOwotCi1zdHJ1Y3QgcnBjX2xvY19uaV9ldmVudF9wYXlsb2FkX3VfdHlwZSB7Ci0JcnBjX2xvY19uaV9ldmVudF9lX3R5cGUgZGlzYzsKLQl1bmlvbiB7Ci0JCXJwY19sb2Nfbmlfdnhfbm90aWZ5X3ZlcmlmeV9yZXFfc190eXBlIHZ4X3JlcTsKLQkJcnBjX2xvY19uaV9zdXBsX25vdGlmeV92ZXJpZnlfcmVxX3NfdHlwZSBzdXBsX3JlcTsKLQkJcnBjX2xvY19uaV91bXRzX2NwX25vdGlmeV92ZXJpZnlfcmVxX3NfdHlwZSB1bXRzX2NwX3JlcTsKLQl9IHJwY19sb2NfbmlfZXZlbnRfcGF5bG9hZF91X3R5cGVfdTsKLX07Ci10eXBlZGVmIHN0cnVjdCBycGNfbG9jX25pX2V2ZW50X3BheWxvYWRfdV90eXBlIHJwY19sb2NfbmlfZXZlbnRfcGF5bG9hZF91X3R5cGU7Ci0KLXN0cnVjdCBycGNfbG9jX25pX2V2ZW50X3NfdHlwZSB7Ci0JcnBjX2xvY19uaV9ldmVudF9lX3R5cGUgZXZlbnQ7Ci0JcnBjX2xvY19uaV9ldmVudF9wYXlsb2FkX3VfdHlwZSBwYXlsb2FkOwotfTsKLXR5cGVkZWYgc3RydWN0IHJwY19sb2NfbmlfZXZlbnRfc190eXBlIHJwY19sb2NfbmlfZXZlbnRfc190eXBlOwotCi1lbnVtIHJwY19sb2NfYXNzaXN0X2RhdGFfcmVxdWVzdF9lX3R5cGUgewotCVJQQ19MT0NfQVNTSVNUX0RBVEFfVElNRV9SRVEgPSAxLAotCVJQQ19MT0NfQVNTSVNUX0RBVEFfUFJFRElDVEVEX09SQklUU19SRVEgPSAyLAotCVJQQ19MT0NfQVNTSVNUX0RBVEFfTUFYID0gMjY4NDM1NDU2LAotfTsKLXR5cGVkZWYgZW51bSBycGNfbG9jX2Fzc2lzdF9kYXRhX3JlcXVlc3RfZV90eXBlIHJwY19sb2NfYXNzaXN0X2RhdGFfcmVxdWVzdF9lX3R5cGU7Ci0KLXR5cGVkZWYgY2hhciAqcnBjX3N0cnVjdF9sb2NfdGltZV9kb3dubG9hZF9zb3VyY2Vfc190eXBlX3NlcnZlcnNfcHRyOwotCi10eXBlZGVmIHJwY19zdHJ1Y3RfbG9jX3RpbWVfZG93bmxvYWRfc291cmNlX3NfdHlwZV9zZXJ2ZXJzX3B0ciBycGNfc3RydWN0X2xvY190aW1lX2Rvd25sb2FkX3NvdXJjZV9zX3R5cGVfc2VydmVyc1szXTsKLQotc3RydWN0IHJwY19sb2NfdGltZV9kb3dubG9hZF9zb3VyY2Vfc190eXBlIHsKLQlycGNfdWludDMyIGRlbGF5X3RocmVzaG9sZDsKLQlycGNfc3RydWN0X2xvY190aW1lX2Rvd25sb2FkX3NvdXJjZV9zX3R5cGVfc2VydmVycyBzZXJ2ZXJzOwotfTsKLXR5cGVkZWYgc3RydWN0IHJwY19sb2NfdGltZV9kb3dubG9hZF9zb3VyY2Vfc190eXBlIHJwY19sb2NfdGltZV9kb3dubG9hZF9zb3VyY2Vfc190eXBlOwotCi10eXBlZGVmIGNoYXIgKnJwY19zdHJ1Y3RfbG9jX3ByZWRpY3RlZF9vcmJpdHNfZGF0YV9zb3VyY2Vfc190eXBlX3NlcnZlcnNfcHRyOwotCi10eXBlZGVmIHJwY19zdHJ1Y3RfbG9jX3ByZWRpY3RlZF9vcmJpdHNfZGF0YV9zb3VyY2Vfc190eXBlX3NlcnZlcnNfcHRyIHJwY19zdHJ1Y3RfbG9jX3ByZWRpY3RlZF9vcmJpdHNfZGF0YV9zb3VyY2Vfc190eXBlX3NlcnZlcnNbM107Ci0KLXN0cnVjdCBycGNfbG9jX3ByZWRpY3RlZF9vcmJpdHNfZGF0YV9zb3VyY2Vfc190eXBlIHsKLQlycGNfdWludDMyIG1heF9maWxlX3NpemU7Ci0JcnBjX3VpbnQzMiBtYXhfcGFydF9zaXplOwotCXJwY19zdHJ1Y3RfbG9jX3ByZWRpY3RlZF9vcmJpdHNfZGF0YV9zb3VyY2Vfc190eXBlX3NlcnZlcnMgc2VydmVyczsKLX07Ci10eXBlZGVmIHN0cnVjdCBycGNfbG9jX3ByZWRpY3RlZF9vcmJpdHNfZGF0YV9zb3VyY2Vfc190eXBlIHJwY19sb2NfcHJlZGljdGVkX29yYml0c19kYXRhX3NvdXJjZV9zX3R5cGU7Ci0KLXN0cnVjdCBycGNfbG9jX2Fzc2lzdF9kYXRhX3JlcXVlc3RfcGF5bG9hZF91X3R5cGUgewotCXJwY19sb2NfYXNzaXN0X2RhdGFfcmVxdWVzdF9lX3R5cGUgZGlzYzsKLQl1bmlvbiB7Ci0JCXJwY19sb2NfdGltZV9kb3dubG9hZF9zb3VyY2Vfc190eXBlIHRpbWVfZG93bmxvYWQ7Ci0JCXJwY19sb2NfcHJlZGljdGVkX29yYml0c19kYXRhX3NvdXJjZV9zX3R5cGUgZGF0YV9kb3dubG9hZDsKLQl9IHJwY19sb2NfYXNzaXN0X2RhdGFfcmVxdWVzdF9wYXlsb2FkX3VfdHlwZV91OwotfTsKLXR5cGVkZWYgc3RydWN0IHJwY19sb2NfYXNzaXN0X2RhdGFfcmVxdWVzdF9wYXlsb2FkX3VfdHlwZSBycGNfbG9jX2Fzc2lzdF9kYXRhX3JlcXVlc3RfcGF5bG9hZF91X3R5cGU7Ci0KLXN0cnVjdCBycGNfbG9jX2Fzc2lzdF9kYXRhX3JlcXVlc3Rfc190eXBlIHsKLQlycGNfbG9jX2Fzc2lzdF9kYXRhX3JlcXVlc3RfZV90eXBlIGV2ZW50OwotCXJwY19sb2NfYXNzaXN0X2RhdGFfcmVxdWVzdF9wYXlsb2FkX3VfdHlwZSBwYXlsb2FkOwotfTsKLXR5cGVkZWYgc3RydWN0IHJwY19sb2NfYXNzaXN0X2RhdGFfcmVxdWVzdF9zX3R5cGUgcnBjX2xvY19hc3Npc3RfZGF0YV9yZXF1ZXN0X3NfdHlwZTsKLQotdHlwZWRlZiBycGNfdWludDMyIHJwY19sb2Nfc2VydmVyX2Nvbm5lY3Rpb25faGFuZGxlOwotCi1lbnVtIHJwY19sb2Nfc2VydmVyX3Byb3RvY29sX2VfdHlwZSB7Ci0JUlBDX0xPQ19TRVJWRVJfUFJPVE9DT0xfREVGQVVMVCA9IDAsCi0JUlBDX0xPQ19TRVJWRVJfUFJPVE9DT0xfU1VQTCA9IDEsCi0JUlBDX0xPQ19TRVJWRVJfUFJPVE9DT0xfVlhfTVBDID0gMiwKLQlSUENfTE9DX1NFUlZFUl9QUk9UT0NPTF9WWF9QREUgPSAzLAotCVJQQ19MT0NfU0VSVkVSX1BST1RPQ09MX01BWCA9IDE2Nzc3MjE2LAotfTsKLXR5cGVkZWYgZW51bSBycGNfbG9jX3NlcnZlcl9wcm90b2NvbF9lX3R5cGUgcnBjX2xvY19zZXJ2ZXJfcHJvdG9jb2xfZV90eXBlOwotCi1lbnVtIHJwY19sb2Nfc2VydmVyX3JlcXVlc3RfZV90eXBlIHsKLQlSUENfTE9DX1NFUlZFUl9SRVFVRVNUX09QRU4gPSAxLAotCVJQQ19MT0NfU0VSVkVSX1JFUVVFU1RfQ0xPU0UgPSAyLAotCVJQQ19MT0NfU0VSVkVSX1JFUVVFU1RfTUFYID0gMjY4NDM1NDU2LAotfTsKLXR5cGVkZWYgZW51bSBycGNfbG9jX3NlcnZlcl9yZXF1ZXN0X2VfdHlwZSBycGNfbG9jX3NlcnZlcl9yZXF1ZXN0X2VfdHlwZTsKLQotc3RydWN0IHJwY19sb2Nfc2VydmVyX29wZW5fcmVxX3NfdHlwZSB7Ci0JcnBjX2xvY19zZXJ2ZXJfY29ubmVjdGlvbl9oYW5kbGUgY29ubl9oYW5kbGU7Ci0JcnBjX2xvY19zZXJ2ZXJfcHJvdG9jb2xfZV90eXBlIHByb3RvY29sOwotfTsKLXR5cGVkZWYgc3RydWN0IHJwY19sb2Nfc2VydmVyX29wZW5fcmVxX3NfdHlwZSBycGNfbG9jX3NlcnZlcl9vcGVuX3JlcV9zX3R5cGU7Ci0KLXN0cnVjdCBycGNfbG9jX3NlcnZlcl9jbG9zZV9yZXFfc190eXBlIHsKLQlycGNfbG9jX3NlcnZlcl9jb25uZWN0aW9uX2hhbmRsZSBjb25uX2hhbmRsZTsKLX07Ci10eXBlZGVmIHN0cnVjdCBycGNfbG9jX3NlcnZlcl9jbG9zZV9yZXFfc190eXBlIHJwY19sb2Nfc2VydmVyX2Nsb3NlX3JlcV9zX3R5cGU7Ci0KLXN0cnVjdCBycGNfbG9jX3NlcnZlcl9yZXF1ZXN0X3VfdHlwZSB7Ci0JcnBjX2xvY19zZXJ2ZXJfcmVxdWVzdF9lX3R5cGUgZGlzYzsKLQl1bmlvbiB7Ci0JCXJwY19sb2Nfc2VydmVyX29wZW5fcmVxX3NfdHlwZSBvcGVuX3JlcTsKLQkJcnBjX2xvY19zZXJ2ZXJfY2xvc2VfcmVxX3NfdHlwZSBjbG9zZV9yZXE7Ci0JfSBycGNfbG9jX3NlcnZlcl9yZXF1ZXN0X3VfdHlwZV91OwotfTsKLXR5cGVkZWYgc3RydWN0IHJwY19sb2Nfc2VydmVyX3JlcXVlc3RfdV90eXBlIHJwY19sb2Nfc2VydmVyX3JlcXVlc3RfdV90eXBlOwotCi1zdHJ1Y3QgcnBjX2xvY19zZXJ2ZXJfcmVxdWVzdF9zX3R5cGUgewotCXJwY19sb2Nfc2VydmVyX3JlcXVlc3RfZV90eXBlIGV2ZW50OwotCXJwY19sb2Nfc2VydmVyX3JlcXVlc3RfdV90eXBlIHBheWxvYWQ7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgcnBjX2xvY19zZXJ2ZXJfcmVxdWVzdF9zX3R5cGUgcnBjX2xvY19zZXJ2ZXJfcmVxdWVzdF9zX3R5cGU7Ci0KLXN0cnVjdCBycGNfbG9jX3Jlc2VydmVkX3BheWxvYWRfc190eXBlIHsKLQlycGNfdWludDE2IGRhdGFfc2l6ZTsKLQlzdHJ1Y3QgewotCQl1X2ludCBkYXRhX2xlbjsKLQkJY2hhciAqZGF0YV92YWw7Ci0JfSBkYXRhOwotfTsKLXR5cGVkZWYgc3RydWN0IHJwY19sb2NfcmVzZXJ2ZWRfcGF5bG9hZF9zX3R5cGUgcnBjX2xvY19yZXNlcnZlZF9wYXlsb2FkX3NfdHlwZTsKLQotZW51bSBycGNfbG9jX2lvY3RsX2VfdHlwZSB7Ci0JUlBDX0xPQ19JT0NUTF9HRVRfQVBJX1ZFUlNJT04gPSAxLAotCVJQQ19MT0NfSU9DVExfU0VUX0ZJWF9DUklURVJJQSA9IDIsCi0JUlBDX0xPQ19JT0NUTF9HRVRfRklYX0NSSVRFUklBID0gMywKLQlSUENfTE9DX0lPQ1RMX1NFUlZJQ0VfU1RBUlRfSU5ERVggPSA0MDAsCi0JUlBDX0xPQ19JT0NUTF9JTkZPUk1fTklfVVNFUl9SRVNQT05TRSA9IDQwMCwKLQlSUENfTE9DX0lPQ1RMX0lOSkVDVF9QUkVESUNURURfT1JCSVRTX0RBVEEgPSA0MDEsCi0JUlBDX0xPQ19JT0NUTF9RVUVSWV9QUkVESUNURURfT1JCSVRTX0RBVEFfVkFMSURJVFkgPSA0MDIsCi0JUlBDX0xPQ19JT0NUTF9RVUVSWV9QUkVESUNURURfT1JCSVRTX0RBVEFfU09VUkNFID0gNDAzLAotCVJQQ19MT0NfSU9DVExfU0VUX1BSRURJQ1RFRF9PUkJJVFNfREFUQV9BVVRPX0RPV05MT0FEID0gNDA0LAotCVJQQ19MT0NfSU9DVExfSU5KRUNUX1VUQ19USU1FID0gNDA1LAotCVJQQ19MT0NfSU9DVExfSU5KRUNUX1JUQ19WQUxVRSA9IDQwNiwKLQlSUENfTE9DX0lPQ1RMX0lOSkVDVF9QT1NJVElPTiA9IDQwNywKLQlSUENfTE9DX0lPQ1RMX1FVRVJZX0VOR0lORV9TVEFURSA9IDQwOCwKLQlSUENfTE9DX0lPQ1RMX0lORk9STV9TRVJWRVJfT1BFTl9TVEFUVVMgPSA0MDksCi0JUlBDX0xPQ19JT0NUTF9JTkZPUk1fU0VSVkVSX0NMT1NFX1NUQVRVUyA9IDQxMCwKLQlSUENfTE9DX0lPQ1RMX05WX1NFVFRJTkdTX1NUQVJUX0lOREVYID0gODAwLAotCVJQQ19MT0NfSU9DVExfU0VUX0VOR0lORV9MT0NLID0gODAwLAotCVJQQ19MT0NfSU9DVExfR0VUX0VOR0lORV9MT0NLID0gODAxLAotCVJQQ19MT0NfSU9DVExfU0VUX1NCQVNfQ09ORklHID0gODAyLAotCVJQQ19MT0NfSU9DVExfR0VUX1NCQVNfQ09ORklHID0gODAzLAotCVJQQ19MT0NfSU9DVExfU0VUX05NRUFfVFlQRVMgPSA4MDQsCi0JUlBDX0xPQ19JT0NUTF9HRVRfTk1FQV9UWVBFUyA9IDgwNSwKLQlSUENfTE9DX0lPQ1RMX1NFVF9DRE1BX1BERV9TRVJWRVJfQUREUiA9IDgwNiwKLQlSUENfTE9DX0lPQ1RMX0dFVF9DRE1BX1BERV9TRVJWRVJfQUREUiA9IDgwNywKLQlSUENfTE9DX0lPQ1RMX1NFVF9DRE1BX01QQ19TRVJWRVJfQUREUiA9IDgwOCwKLQlSUENfTE9DX0lPQ1RMX0dFVF9DRE1BX01QQ19TRVJWRVJfQUREUiA9IDgwOSwKLQlSUENfTE9DX0lPQ1RMX1NFVF9VTVRTX1NMUF9TRVJWRVJfQUREUiA9IDgxMCwKLQlSUENfTE9DX0lPQ1RMX0dFVF9VTVRTX1NMUF9TRVJWRVJfQUREUiA9IDgxMSwKLQlSUENfTE9DX0lPQ1RMX1NFVF9PTl9ERU1BTkRfTFBNID0gODEyLAotCVJQQ19MT0NfSU9DVExfR0VUX09OX0RFTUFORF9MUE0gPSA4MTMsCi0JUlBDX0xPQ19JT0NUTF9QUk9QUklFVEFSWV9TVEFSVF9JTkRFWCA9IDEwMDAsCi0JUlBDX0xPQ19JT0NUTF9ERUxFVEVfQVNTSVNUX0RBVEEgPSAxMDAwLAotCVJQQ19MT0NfSU9DVExfU0VUX0NVU1RPTV9QREVfU0VSVkVSX0FERFIgPSAxMDAxLAotCVJQQ19MT0NfSU9DVExfR0VUX0NVU1RPTV9QREVfU0VSVkVSX0FERFIgPSAxMDAyLAotCVJQQ19MT0NfSU9DVExfVEhJUkRfUEFSVFlfU1RBUlRfSU5ERVggPSAxMDczNzQxODI0LAotfTsKLXR5cGVkZWYgZW51bSBycGNfbG9jX2lvY3RsX2VfdHlwZSBycGNfbG9jX2lvY3RsX2VfdHlwZTsKLQotc3RydWN0IHJwY19sb2NfYXBpX3ZlcnNpb25fc190eXBlIHsKLQl1X2NoYXIgbWFqb3I7Ci0JdV9jaGFyIG1pbm9yOwotfTsKLXR5cGVkZWYgc3RydWN0IHJwY19sb2NfYXBpX3ZlcnNpb25fc190eXBlIHJwY19sb2NfYXBpX3ZlcnNpb25fc190eXBlOwotCi1lbnVtIHJwY19sb2NfZml4X3JlY3VycmVuY2VfZV90eXBlIHsKLQlSUENfTE9DX1BFUklPRElDX0ZJWCA9IDEsCi0JUlBDX0xPQ19TSU5HTEVfRklYID0gMiwKLQlSUENfTE9DX0ZJWF9TRVNTSU9OX1RZUEVfTUFYID0gMjY4NDM1NDU2LAotfTsKLXR5cGVkZWYgZW51bSBycGNfbG9jX2ZpeF9yZWN1cnJlbmNlX2VfdHlwZSBycGNfbG9jX2ZpeF9yZWN1cnJlbmNlX2VfdHlwZTsKLQotZW51bSBycGNfbG9jX29wZXJhdGlvbl9tb2RlX2VfdHlwZSB7Ci0JUlBDX0xPQ19PUEVSX01PREVfREVGQVVMVCA9IDEsCi0JUlBDX0xPQ19PUEVSX01PREVfTVNCID0gMiwKLQlSUENfTE9DX09QRVJfTU9ERV9NU0EgPSAzLAotCVJQQ19MT0NfT1BFUl9NT0RFX1NUQU5EQUxPTkUgPSA0LAotCVJQQ19MT0NfT1BFUl9NT0RFX1NQRUVEX09QVElNQUwgPSA1LAotCVJQQ19MT0NfT1BFUl9NT0RFX0FDQ1VSQUNZX09QVElNQUwgPSA2LAotCVJQQ19MT0NfT1BFUl9NT0RFX0RBVEFfT1BUSU1BTCA9IDcsCi0JUlBDX0xPQ19PUEVSX01PREVfTUFYID0gMjY4NDM1NDU2LAotfTsKLXR5cGVkZWYgZW51bSBycGNfbG9jX29wZXJhdGlvbl9tb2RlX2VfdHlwZSBycGNfbG9jX29wZXJhdGlvbl9tb2RlX2VfdHlwZTsKLQotZW51bSBycGNfbG9jX25vdGlmeV9lX3R5cGUgewotCVJQQ19MT0NfTk9USUZZX09OX0lOVEVSVkFMID0gMSwKLQlSUENfTE9DX05PVElGWV9PTl9ESVNUQU5DRSA9IDIsCi0JUlBDX0xPQ19OT1RJRllfT05fQU5ZID0gMywKLQlSUENfTE9DX05PVElGWV9PTl9BTEwgPSA0LAotCVJQQ19MT0NfTk9USUZZX1RZUEVfTUFYID0gMjY4NDM1NDU2LAotfTsKLXR5cGVkZWYgZW51bSBycGNfbG9jX25vdGlmeV9lX3R5cGUgcnBjX2xvY19ub3RpZnlfZV90eXBlOwotCi1zdHJ1Y3QgcnBjX2xvY19maXhfY3JpdGVyaWFfc190eXBlIHsKLQlycGNfdWludDMyIHZhbGlkX21hc2s7Ci0JcnBjX2xvY19maXhfcmVjdXJyZW5jZV9lX3R5cGUgcmVjdXJyZW5jZV90eXBlOwotCXJwY19sb2Nfb3BlcmF0aW9uX21vZGVfZV90eXBlIHByZWZlcnJlZF9vcGVyYXRpb25fbW9kZTsKLQlycGNfdWludDMyIHByZWZlcnJlZF9hY2N1cmFjeTsKLQlycGNfdWludDMyIHByZWZlcnJlZF9yZXNwb25zZV90aW1lOwotCXJwY19ib29sZWFuIGludGVybWVkaWF0ZV9wb3NfcmVwb3J0X2VuYWJsZWQ7Ci0JcnBjX2xvY19ub3RpZnlfZV90eXBlIG5vdGlmeV90eXBlOwotCXJwY191aW50MzIgbWluX2ludGVydmFsOwotCWZsb2F0IG1pbl9kaXN0YW5jZTsKLQlycGNfdWludDMyIG1pbl9kaXN0X3NhbXBsZV9pbnRlcnZhbDsKLX07Ci10eXBlZGVmIHN0cnVjdCBycGNfbG9jX2ZpeF9jcml0ZXJpYV9zX3R5cGUgcnBjX2xvY19maXhfY3JpdGVyaWFfc190eXBlOwotCi1lbnVtIHJwY19sb2NfbmlfdXNlcl9yZXNwX2VfdHlwZSB7Ci0JUlBDX0xPQ19OSV9MQ1NfTk9USUZZX1ZFUklGWV9BQ0NFUFQgPSAxLAotCVJQQ19MT0NfTklfTENTX05PVElGWV9WRVJJRllfREVOWSA9IDIsCi0JUlBDX0xPQ19OSV9MQ1NfTk9USUZZX1ZFUklGWV9OT1JFU1AgPSAzLAotCVJQQ19MT0NfTklfTENTX05PVElGWV9WRVJJRllfTUFYID0gMjY4NDM1NDU2LAotfTsKLXR5cGVkZWYgZW51bSBycGNfbG9jX25pX3VzZXJfcmVzcF9lX3R5cGUgcnBjX2xvY19uaV91c2VyX3Jlc3BfZV90eXBlOwotCi1zdHJ1Y3QgcnBjX2xvY191c2VyX3ZlcmlmeV9zX3R5cGUgewotCXJwY19sb2NfbmlfdXNlcl9yZXNwX2VfdHlwZSB1c2VyX3Jlc3A7Ci0JcnBjX2xvY19uaV9ldmVudF9zX3R5cGUgbmlfZXZlbnRfcGFzc19iYWNrOwotfTsKLXR5cGVkZWYgc3RydWN0IHJwY19sb2NfdXNlcl92ZXJpZnlfc190eXBlIHJwY19sb2NfdXNlcl92ZXJpZnlfc190eXBlOwotCi1lbnVtIHJwY19sb2NfcHJlZGljdGVkX29yYml0c19kYXRhX2Zvcm1hdF9lX3R5cGUgewotCVJQQ19MT0NfUFJFRElDVEVEX09SQklUU19YVFJBID0gMCwKLQlSUENfTE9DX1BSRURJQ1RFRF9PUkJJVFNfRk9STUFUX01BWCA9IDI2ODQzNTQ1NiwKLX07Ci10eXBlZGVmIGVudW0gcnBjX2xvY19wcmVkaWN0ZWRfb3JiaXRzX2RhdGFfZm9ybWF0X2VfdHlwZSBycGNfbG9jX3ByZWRpY3RlZF9vcmJpdHNfZGF0YV9mb3JtYXRfZV90eXBlOwotCi1zdHJ1Y3QgcnBjX2xvY19wcmVkaWN0ZWRfb3JiaXRzX2RhdGFfc190eXBlIHsKLQlycGNfbG9jX3ByZWRpY3RlZF9vcmJpdHNfZGF0YV9mb3JtYXRfZV90eXBlIGZvcm1hdF90eXBlOwotCXJwY191aW50MzIgdG90YWxfc2l6ZTsKLQlycGNfdWludDggdG90YWxfcGFydHM7Ci0JcnBjX3VpbnQ4IHBhcnQ7Ci0JcnBjX3VpbnQxNiBwYXJ0X2xlbjsKLQlzdHJ1Y3QgewotCQl1X2ludCBkYXRhX3B0cl9sZW47Ci0JCWNoYXIgKmRhdGFfcHRyX3ZhbDsKLQl9IGRhdGFfcHRyOwotfTsKLXR5cGVkZWYgc3RydWN0IHJwY19sb2NfcHJlZGljdGVkX29yYml0c19kYXRhX3NfdHlwZSBycGNfbG9jX3ByZWRpY3RlZF9vcmJpdHNfZGF0YV9zX3R5cGU7Ci0KLXN0cnVjdCBycGNfbG9jX3ByZWRpY3RlZF9vcmJpdHNfZGF0YV92YWxpZGl0eV9yZXBvcnRfc190eXBlIHsKLQlycGNfdWludDY0IHN0YXJ0X3RpbWVfdXRjOwotCXJwY191aW50MTYgdmFsaWRfZHVyYXRpb25faHJzOwotfTsKLXR5cGVkZWYgc3RydWN0IHJwY19sb2NfcHJlZGljdGVkX29yYml0c19kYXRhX3ZhbGlkaXR5X3JlcG9ydF9zX3R5cGUgcnBjX2xvY19wcmVkaWN0ZWRfb3JiaXRzX2RhdGFfdmFsaWRpdHlfcmVwb3J0X3NfdHlwZTsKLQotc3RydWN0IHJwY19sb2NfcHJlZGljdGVkX29yYml0c19hdXRvX2Rvd25sb2FkX2NvbmZpZ19zX3R5cGUgewotCXJwY19ib29sZWFuIGVuYWJsZTsKLQl1X2NoYXIgYXV0b19jaGVja19ldmVyeV9ocnM7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgcnBjX2xvY19wcmVkaWN0ZWRfb3JiaXRzX2F1dG9fZG93bmxvYWRfY29uZmlnX3NfdHlwZSBycGNfbG9jX3ByZWRpY3RlZF9vcmJpdHNfYXV0b19kb3dubG9hZF9jb25maWdfc190eXBlOwotCi1zdHJ1Y3QgcnBjX2xvY19hc3Npc3RfZGF0YV90aW1lX3NfdHlwZSB7Ci0JcnBjX3VpbnQ2NCB0aW1lX3V0YzsKLQlycGNfdWludDMyIHVuY2VydGFpbnR5OwotfTsKLXR5cGVkZWYgc3RydWN0IHJwY19sb2NfYXNzaXN0X2RhdGFfdGltZV9zX3R5cGUgcnBjX2xvY19hc3Npc3RfZGF0YV90aW1lX3NfdHlwZTsKLQotdHlwZWRlZiBycGNfdWludDY0IHJwY19sb2NfYXNzaXN0X3Bvc192YWxpZF9tYXNrX3R5cGU7Ci0KLXN0cnVjdCBycGNfbG9jX2Fzc2lzdF9kYXRhX3Bvc19zX3R5cGUgewotCXJwY19sb2NfYXNzaXN0X3Bvc192YWxpZF9tYXNrX3R5cGUgdmFsaWRfbWFzazsKLQlycGNfdWludDY0IHRpbWVzdGFtcF91dGM7Ci0JZG91YmxlIGxhdGl0dWRlOwotCWRvdWJsZSBsb25naXR1ZGU7Ci0JZmxvYXQgYWx0aXR1ZGVfd3J0X2VsbGlwc29pZDsKLQlmbG9hdCBhbHRpdHVkZV93cnRfbWVhbl9zZWFfbGV2ZWw7Ci0JZmxvYXQgaG9yX3VuY19jaXJjdWxhcjsKLQlmbG9hdCB2ZXJ0X3VuYzsKLQl1X2NoYXIgY29uZmlkZW5jZV9ob3Jpem9udGFsOwotCXVfY2hhciBjb25maWRlbmNlX3ZlcnRpY2FsOwotfTsKLXR5cGVkZWYgc3RydWN0IHJwY19sb2NfYXNzaXN0X2RhdGFfcG9zX3NfdHlwZSBycGNfbG9jX2Fzc2lzdF9kYXRhX3Bvc19zX3R5cGU7Ci0KLWVudW0gcnBjX2xvY19zZXJ2ZXJfb3Blbl9zdGF0dXNfZV90eXBlIHsKLQlSUENfTE9DX1NFUlZFUl9PUEVOX1NVQ0NFU1MgPSAxLAotCVJQQ19MT0NfU0VSVkVSX09QRU5fRkFJTCA9IDIsCi0JUlBDX0xPQ19TRVJWRVJfT1BFTl9TVEFUVVNfTUFYID0gMjY4NDM1NDU2LAotfTsKLXR5cGVkZWYgZW51bSBycGNfbG9jX3NlcnZlcl9vcGVuX3N0YXR1c19lX3R5cGUgcnBjX2xvY19zZXJ2ZXJfb3Blbl9zdGF0dXNfZV90eXBlOwotCi1zdHJ1Y3QgcnBjX2xvY19zZXJ2ZXJfb3Blbl9zdGF0dXNfc190eXBlIHsKLQlycGNfbG9jX3NlcnZlcl9jb25uZWN0aW9uX2hhbmRsZSBjb25uX2hhbmRsZTsKLQlycGNfbG9jX3NlcnZlcl9vcGVuX3N0YXR1c19lX3R5cGUgb3Blbl9zdGF0dXM7Ci0JY2hhciAqYXBuX25hbWU7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgcnBjX2xvY19zZXJ2ZXJfb3Blbl9zdGF0dXNfc190eXBlIHJwY19sb2Nfc2VydmVyX29wZW5fc3RhdHVzX3NfdHlwZTsKLQotZW51bSBycGNfbG9jX3NlcnZlcl9jbG9zZV9zdGF0dXNfZV90eXBlIHsKLQlSUENfTE9DX1NFUlZFUl9DTE9TRV9TVUNDRVNTID0gMSwKLQlSUENfTE9DX1NFUlZFUl9DTE9TRV9GQUlMID0gMiwKLQlSUENfTE9DX1NFUlZFUl9DTE9TRV9TVEFUVVNfTUFYID0gMjY4NDM1NDU2LAotfTsKLXR5cGVkZWYgZW51bSBycGNfbG9jX3NlcnZlcl9jbG9zZV9zdGF0dXNfZV90eXBlIHJwY19sb2Nfc2VydmVyX2Nsb3NlX3N0YXR1c19lX3R5cGU7Ci0KLXN0cnVjdCBycGNfbG9jX3NlcnZlcl9jbG9zZV9zdGF0dXNfc190eXBlIHsKLQlycGNfbG9jX3NlcnZlcl9jb25uZWN0aW9uX2hhbmRsZSBjb25uX2hhbmRsZTsKLQlycGNfbG9jX3NlcnZlcl9jbG9zZV9zdGF0dXNfZV90eXBlIGNsb3NlX3N0YXR1czsKLX07Ci10eXBlZGVmIHN0cnVjdCBycGNfbG9jX3NlcnZlcl9jbG9zZV9zdGF0dXNfc190eXBlIHJwY19sb2Nfc2VydmVyX2Nsb3NlX3N0YXR1c19zX3R5cGU7Ci0KLWVudW0gcnBjX2xvY19sb2NrX2VfdHlwZSB7Ci0JUlBDX0xPQ19MT0NLX05PTkUgPSAxLAotCVJQQ19MT0NfTE9DS19NSSA9IDIsCi0JUlBDX0xPQ19MT0NLX01UID0gMywKLQlSUENfTE9DX0xPQ0tfQUxMID0gNCwKLQlSUENfTE9DX0xPQ0tfTUFYID0gMjY4NDM1NDU2LAotfTsKLXR5cGVkZWYgZW51bSBycGNfbG9jX2xvY2tfZV90eXBlIHJwY19sb2NfbG9ja19lX3R5cGU7Ci0KLXR5cGVkZWYgcnBjX3VpbnQzMiBycGNfbG9jX25tZWFfc2VudGVuY2VfdHlwZTsKLQotdHlwZWRlZiBycGNfdWludDMyIHJwY19sb2NfYXNzaXN0X2RhdGFfdHlwZTsKLQotc3RydWN0IHJwY19sb2NfYXNzaXN0X2RhdGFfZGVsZXRlX3NfdHlwZSB7Ci0JcnBjX2xvY19hc3Npc3RfZGF0YV90eXBlIHR5cGU7Ci0JcnBjX3VpbnQzMiByZXNlcnZlZFs4XTsKLX07Ci10eXBlZGVmIHN0cnVjdCBycGNfbG9jX2Fzc2lzdF9kYXRhX2RlbGV0ZV9zX3R5cGUgcnBjX2xvY19hc3Npc3RfZGF0YV9kZWxldGVfc190eXBlOwotCi1zdHJ1Y3QgcnBjX2xvY19pb2N0bF9kYXRhX3VfdHlwZSB7Ci0JcnBjX2xvY19pb2N0bF9lX3R5cGUgZGlzYzsKLQl1bmlvbiB7Ci0JCXJwY19sb2NfZml4X2NyaXRlcmlhX3NfdHlwZSBmaXhfY3JpdGVyaWE7Ci0JCXJwY19sb2NfdXNlcl92ZXJpZnlfc190eXBlIHVzZXJfdmVyaWZ5X3Jlc3A7Ci0JCXJwY19sb2NfcHJlZGljdGVkX29yYml0c19kYXRhX3NfdHlwZSBwcmVkaWN0ZWRfb3JiaXRzX2RhdGE7Ci0JCXJwY19sb2NfcHJlZGljdGVkX29yYml0c19hdXRvX2Rvd25sb2FkX2NvbmZpZ19zX3R5cGUgcHJlZGljdGVkX29yYml0c19hdXRvX2Rvd25sb2FkOwotCQlycGNfbG9jX2Fzc2lzdF9kYXRhX3RpbWVfc190eXBlIGFzc2lzdGFuY2VfZGF0YV90aW1lOwotCQlycGNfbG9jX2Fzc2lzdF9kYXRhX3Bvc19zX3R5cGUgYXNzaXN0YW5jZV9kYXRhX3Bvc2l0aW9uOwotCQlycGNfbG9jX3NlcnZlcl9vcGVuX3N0YXR1c19zX3R5cGUgY29ubl9vcGVuX3N0YXR1czsKLQkJcnBjX2xvY19zZXJ2ZXJfY2xvc2Vfc3RhdHVzX3NfdHlwZSBjb25uX2Nsb3NlX3N0YXR1czsKLQkJcnBjX2xvY19sb2NrX2VfdHlwZSBlbmdpbmVfbG9jazsKLQkJcnBjX2Jvb2xlYW4gc2Jhc19tb2RlOwotCQlycGNfbG9jX25tZWFfc2VudGVuY2VfdHlwZSBubWVhX3R5cGVzOwotCQlycGNfYm9vbGVhbiBvbl9kZW1hbmRfbHBtOwotCQlycGNfbG9jX3NlcnZlcl9pbmZvX3NfdHlwZSBzZXJ2ZXJfYWRkcjsKLQkJcnBjX2xvY19hc3Npc3RfZGF0YV9kZWxldGVfc190eXBlIGFzc2lzdF9kYXRhX2RlbGV0ZTsKLQl9IHJwY19sb2NfaW9jdGxfZGF0YV91X3R5cGVfdTsKLX07Ci10eXBlZGVmIHN0cnVjdCBycGNfbG9jX2lvY3RsX2RhdGFfdV90eXBlIHJwY19sb2NfaW9jdGxfZGF0YV91X3R5cGU7Ci0KLXN0cnVjdCBycGNfbG9jX2lvY3RsX2NhbGxiYWNrX2RhdGFfdV90eXBlIHsKLQlycGNfbG9jX2lvY3RsX2VfdHlwZSBkaXNjOwotCXVuaW9uIHsKLQkJcnBjX2xvY19hcGlfdmVyc2lvbl9zX3R5cGUgYXBpX3ZlcnNpb247Ci0JCXJwY19sb2NfZml4X2NyaXRlcmlhX3NfdHlwZSBmaXhfY3JpdGVyaWE7Ci0JCXJwY19sb2NfbG9ja19lX3R5cGUgZW5naW5lX2xvY2s7Ci0JCXJwY19ib29sZWFuIHNiYXNfbW9kZTsKLQkJcnBjX2xvY19ubWVhX3NlbnRlbmNlX3R5cGUgbm1lYV90eXBlczsKLQkJcnBjX2Jvb2xlYW4gb25fZGVtYW5kX2xwbTsKLQkJcnBjX2xvY19zZXJ2ZXJfaW5mb19zX3R5cGUgc2VydmVyX2FkZHI7Ci0JCXJwY19sb2NfcHJlZGljdGVkX29yYml0c19kYXRhX3NvdXJjZV9zX3R5cGUgcHJlZGljdGVkX29yYml0c19kYXRhX3NvdXJjZTsKLQkJcnBjX2xvY19wcmVkaWN0ZWRfb3JiaXRzX2RhdGFfdmFsaWRpdHlfcmVwb3J0X3NfdHlwZSBwcmVkaWN0ZWRfb3JiaXRzX2RhdGFfdmFsaWRpdHk7Ci0JfSBycGNfbG9jX2lvY3RsX2NhbGxiYWNrX2RhdGFfdV90eXBlX3U7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgcnBjX2xvY19pb2N0bF9jYWxsYmFja19kYXRhX3VfdHlwZSBycGNfbG9jX2lvY3RsX2NhbGxiYWNrX2RhdGFfdV90eXBlOwotCi1zdHJ1Y3QgcnBjX2xvY19pb2N0bF9jYWxsYmFja19zX3R5cGUgewotCXJwY19sb2NfaW9jdGxfZV90eXBlIHR5cGU7Ci0JcnBjX2ludDMyIHN0YXR1czsKLQlycGNfbG9jX2lvY3RsX2NhbGxiYWNrX2RhdGFfdV90eXBlIGRhdGE7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgcnBjX2xvY19pb2N0bF9jYWxsYmFja19zX3R5cGUgcnBjX2xvY19pb2N0bF9jYWxsYmFja19zX3R5cGU7Ci0KLXN0cnVjdCBycGNfbG9jX2V2ZW50X3BheWxvYWRfdV90eXBlIHsKLQl1X3F1YWRfdCBkaXNjOwotCXVuaW9uIHsKLQkJcnBjX2xvY19wYXJzZWRfcG9zaXRpb25fc190eXBlIHBhcnNlZF9sb2NhdGlvbl9yZXBvcnQ7Ci0JCXJwY19sb2NfZ25zc19pbmZvX3NfdHlwZSBnbnNzX3JlcG9ydDsKLQkJcnBjX2xvY19ubWVhX3JlcG9ydF9zX3R5cGUgbm1lYV9yZXBvcnQ7Ci0JCXJwY19sb2NfbmlfZXZlbnRfc190eXBlIG5pX3JlcXVlc3Q7Ci0JCXJwY19sb2NfYXNzaXN0X2RhdGFfcmVxdWVzdF9zX3R5cGUgYXNzaXN0X2RhdGFfcmVxdWVzdDsKLQkJcnBjX2xvY19zZXJ2ZXJfcmVxdWVzdF9zX3R5cGUgbG9jX3NlcnZlcl9yZXF1ZXN0OwotCQlycGNfbG9jX2lvY3RsX2NhbGxiYWNrX3NfdHlwZSBpb2N0bF9yZXBvcnQ7Ci0JCXJwY19sb2Nfc3RhdHVzX2V2ZW50X3NfdHlwZSBzdGF0dXNfcmVwb3J0OwotCQlycGNfbG9jX3Jlc2VydmVkX3BheWxvYWRfc190eXBlIHJlc2VydmVkOwotCX0gcnBjX2xvY19ldmVudF9wYXlsb2FkX3VfdHlwZV91OwotfTsKLXR5cGVkZWYgc3RydWN0IHJwY19sb2NfZXZlbnRfcGF5bG9hZF91X3R5cGUgcnBjX2xvY19ldmVudF9wYXlsb2FkX3VfdHlwZTsKLSNkZWZpbmUgUlBDX0xPQ19BUElfTlVMTF9WRVJTSU9OIDB4MDAwMTAwMDEKLSNkZWZpbmUgUlBDX0xPQ19BUElfUlBDX0dMVUVfQ09ERV9JTkZPX1JFTU9URV9WRVJTSU9OIDB4MDAwMTAwMDEKLQotLyogdGhlIHhkciBmdW5jdGlvbnMgKi8KLQotI2lmIGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoX19jcGx1c3BsdXMpCi1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2Jvb2xlYW4gKFhEUiAqLCBycGNfYm9vbGVhbiopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY191aW50MzIgKFhEUiAqLCBycGNfdWludDMyKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX3VpbnQxNiAoWERSICosIHJwY191aW50MTYqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfdWludDggKFhEUiAqLCBycGNfdWludDgqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfaW50MzIgKFhEUiAqLCBycGNfaW50MzIqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfYnl0ZSAoWERSICosIHJwY19ieXRlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX3VpbnQ2NCAoWERSICosIHJwY191aW50NjQqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX2NsaWVudF9oYW5kbGVfdHlwZSAoWERSICosIHJwY19sb2NfY2xpZW50X2hhbmRsZV90eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19ldmVudF9tYXNrX3R5cGUgKFhEUiAqLCBycGNfbG9jX2V2ZW50X21hc2tfdHlwZSopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2NfcG9zaXRpb25fdmFsaWRfbWFza190eXBlIChYRFIgKiwgcnBjX2xvY19wb3NpdGlvbl92YWxpZF9tYXNrX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX3Bvc190ZWNobm9sb2d5X21hc2tfdHlwZSAoWERSICosIHJwY19sb2NfcG9zX3RlY2hub2xvZ3lfbWFza190eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19zZXNzaW9uX3N0YXR1c19lX3R5cGUgKFhEUiAqLCBycGNfbG9jX3Nlc3Npb25fc3RhdHVzX2VfdHlwZSopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2NfY2FsZW5kYXJfdGltZV9zX3R5cGUgKFhEUiAqLCBycGNfbG9jX2NhbGVuZGFyX3RpbWVfc190eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19wYXJzZWRfcG9zaXRpb25fc190eXBlIChYRFIgKiwgcnBjX2xvY19wYXJzZWRfcG9zaXRpb25fc190eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19zdl9zeXN0ZW1fZV90eXBlIChYRFIgKiwgcnBjX2xvY19zdl9zeXN0ZW1fZV90eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19zdl9zdGF0dXNfZV90eXBlIChYRFIgKiwgcnBjX2xvY19zdl9zdGF0dXNfZV90eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19zdl9pbmZvX3ZhbGlkX21hc2tfdHlwZSAoWERSICosIHJwY19sb2Nfc3ZfaW5mb192YWxpZF9tYXNrX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX3N2X2luZm9fc190eXBlIChYRFIgKiwgcnBjX2xvY19zdl9pbmZvX3NfdHlwZSopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2NfZ25zc19pbmZvX3ZhbGlkX21hc2tfdHlwZSAoWERSICosIHJwY19sb2NfZ25zc19pbmZvX3ZhbGlkX21hc2tfdHlwZSopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2NfZ25zc19pbmZvX3NfdHlwZSAoWERSICosIHJwY19sb2NfZ25zc19pbmZvX3NfdHlwZSopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2Nfbm1lYV9yZXBvcnRfc190eXBlIChYRFIgKiwgcnBjX2xvY19ubWVhX3JlcG9ydF9zX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX3N0YXR1c19ldmVudF9lX3R5cGUgKFhEUiAqLCBycGNfbG9jX3N0YXR1c19ldmVudF9lX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX2VuZ2luZV9zdGF0ZV9lX3R5cGUgKFhEUiAqLCBycGNfbG9jX2VuZ2luZV9zdGF0ZV9lX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX3N0YXR1c19ldmVudF9wYXlsb2FkX3VfdHlwZSAoWERSICosIHJwY19sb2Nfc3RhdHVzX2V2ZW50X3BheWxvYWRfdV90eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19zdGF0dXNfZXZlbnRfc190eXBlIChYRFIgKiwgcnBjX2xvY19zdGF0dXNfZXZlbnRfc190eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19zZXJ2ZXJfYWRkcl9lX3R5cGUgKFhEUiAqLCBycGNfbG9jX3NlcnZlcl9hZGRyX2VfdHlwZSopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2Nfc2VydmVyX2FkZHJfaXB2NF90eXBlIChYRFIgKiwgcnBjX2xvY19zZXJ2ZXJfYWRkcl9pcHY0X3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX3NlcnZlcl9hZGRyX3VybF90eXBlIChYRFIgKiwgcnBjX2xvY19zZXJ2ZXJfYWRkcl91cmxfdHlwZSopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2Nfc2VydmVyX2FkZHJfdV90eXBlIChYRFIgKiwgcnBjX2xvY19zZXJ2ZXJfYWRkcl91X3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX3NlcnZlcl9pbmZvX3NfdHlwZSAoWERSICosIHJwY19sb2Nfc2VydmVyX2luZm9fc190eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19uaV9ub3RpZnlfdmVyaWZ5X2VfdHlwZSAoWERSICosIHJwY19sb2Nfbmlfbm90aWZ5X3ZlcmlmeV9lX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX25pX2V2ZW50X2VfdHlwZSAoWERSICosIHJwY19sb2NfbmlfZXZlbnRfZV90eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19uaV9kYXRhY29kaW5nX3NjaGVtZV9lX3R5cGUgKFhEUiAqLCBycGNfbG9jX25pX2RhdGFjb2Rpbmdfc2NoZW1lX2VfdHlwZSopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2NfbmlfdnhfcmVxdWVzdGVyX2lkX2VuY29kaW5nX3NjaGVtZV9lX3R5cGUgKFhEUiAqLCBycGNfbG9jX25pX3Z4X3JlcXVlc3Rlcl9pZF9lbmNvZGluZ19zY2hlbWVfZV90eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19uaV92eF9wb3NfbW9kZV9lX3R5cGUgKFhEUiAqLCBycGNfbG9jX25pX3Z4X3Bvc19tb2RlX2VfdHlwZSopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2NfbmlfdnhfcmVxdWVzdGVyX2lkX3NfdHlwZSAoWERSICosIHJwY19sb2NfbmlfdnhfcmVxdWVzdGVyX2lkX3NfdHlwZSopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2Nfbmlfdnhfbm90aWZ5X3ZlcmlmeV9yZXFfc190eXBlIChYRFIgKiwgcnBjX2xvY19uaV92eF9ub3RpZnlfdmVyaWZ5X3JlcV9zX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX25pX3N1cGxfcG9zX21ldGhvZF9lX3R5cGUgKFhEUiAqLCBycGNfbG9jX25pX3N1cGxfcG9zX21ldGhvZF9lX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX25pX3N1cGxfc2xwX3Nlc3Npb25faWRfc190eXBlIChYRFIgKiwgcnBjX2xvY19uaV9zdXBsX3NscF9zZXNzaW9uX2lkX3NfdHlwZSopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2NfbmlfcmVxdWVzdG9yX2lkX3NfdHlwZSAoWERSICosIHJwY19sb2NfbmlfcmVxdWVzdG9yX2lkX3NfdHlwZSopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2Nfbmlfc3VwbF9jbGllbnRfbmFtZV9zX3R5cGUgKFhEUiAqLCBycGNfbG9jX25pX3N1cGxfY2xpZW50X25hbWVfc190eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19uaV9zdXBsX3FvcF9zX3R5cGUgKFhEUiAqLCBycGNfbG9jX25pX3N1cGxfcW9wX3NfdHlwZSopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2Nfbmlfc3VwbF9ub3RpZnlfdmVyaWZ5X3JlcV9zX3R5cGUgKFhEUiAqLCBycGNfbG9jX25pX3N1cGxfbm90aWZ5X3ZlcmlmeV9yZXFfc190eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19uaV9leHRfY2xpZW50X2FkZHJlc3Nfc190eXBlIChYRFIgKiwgcnBjX2xvY19uaV9leHRfY2xpZW50X2FkZHJlc3Nfc190eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19uaV9sb2NhdGlvbl90eXBlX2VfdHlwZSAoWERSICosIHJwY19sb2NfbmlfbG9jYXRpb25fdHlwZV9lX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX25pX2RlZmVycmVkX2xvY2F0aW9uX3NfdHlwZSAoWERSICosIHJwY19sb2NfbmlfZGVmZXJyZWRfbG9jYXRpb25fc190eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19uaV9jb2Rld29yZF9zdHJpbmdfc190eXBlIChYRFIgKiwgcnBjX2xvY19uaV9jb2Rld29yZF9zdHJpbmdfc190eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19uaV9zZXJ2aWNlX3R5cGVfaWRfc190eXBlIChYRFIgKiwgcnBjX2xvY19uaV9zZXJ2aWNlX3R5cGVfaWRfc190eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19uaV91bXRzX2NwX25vdGlmeV92ZXJpZnlfcmVxX3NfdHlwZSAoWERSICosIHJwY19sb2NfbmlfdW10c19jcF9ub3RpZnlfdmVyaWZ5X3JlcV9zX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX25pX2V2ZW50X3BheWxvYWRfdV90eXBlIChYRFIgKiwgcnBjX2xvY19uaV9ldmVudF9wYXlsb2FkX3VfdHlwZSopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2NfbmlfZXZlbnRfc190eXBlIChYRFIgKiwgcnBjX2xvY19uaV9ldmVudF9zX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX2Fzc2lzdF9kYXRhX3JlcXVlc3RfZV90eXBlIChYRFIgKiwgcnBjX2xvY19hc3Npc3RfZGF0YV9yZXF1ZXN0X2VfdHlwZSopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19zdHJ1Y3RfbG9jX3RpbWVfZG93bmxvYWRfc291cmNlX3NfdHlwZV9zZXJ2ZXJzX3B0ciAoWERSICosIHJwY19zdHJ1Y3RfbG9jX3RpbWVfZG93bmxvYWRfc291cmNlX3NfdHlwZV9zZXJ2ZXJzX3B0ciopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19zdHJ1Y3RfbG9jX3RpbWVfZG93bmxvYWRfc291cmNlX3NfdHlwZV9zZXJ2ZXJzIChYRFIgKiwgcnBjX3N0cnVjdF9sb2NfdGltZV9kb3dubG9hZF9zb3VyY2Vfc190eXBlX3NlcnZlcnMpOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2NfdGltZV9kb3dubG9hZF9zb3VyY2Vfc190eXBlIChYRFIgKiwgcnBjX2xvY190aW1lX2Rvd25sb2FkX3NvdXJjZV9zX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfc3RydWN0X2xvY19wcmVkaWN0ZWRfb3JiaXRzX2RhdGFfc291cmNlX3NfdHlwZV9zZXJ2ZXJzX3B0ciAoWERSICosIHJwY19zdHJ1Y3RfbG9jX3ByZWRpY3RlZF9vcmJpdHNfZGF0YV9zb3VyY2Vfc190eXBlX3NlcnZlcnNfcHRyKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX3N0cnVjdF9sb2NfcHJlZGljdGVkX29yYml0c19kYXRhX3NvdXJjZV9zX3R5cGVfc2VydmVycyAoWERSICosIHJwY19zdHJ1Y3RfbG9jX3ByZWRpY3RlZF9vcmJpdHNfZGF0YV9zb3VyY2Vfc190eXBlX3NlcnZlcnMpOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2NfcHJlZGljdGVkX29yYml0c19kYXRhX3NvdXJjZV9zX3R5cGUgKFhEUiAqLCBycGNfbG9jX3ByZWRpY3RlZF9vcmJpdHNfZGF0YV9zb3VyY2Vfc190eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19hc3Npc3RfZGF0YV9yZXF1ZXN0X3BheWxvYWRfdV90eXBlIChYRFIgKiwgcnBjX2xvY19hc3Npc3RfZGF0YV9yZXF1ZXN0X3BheWxvYWRfdV90eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19hc3Npc3RfZGF0YV9yZXF1ZXN0X3NfdHlwZSAoWERSICosIHJwY19sb2NfYXNzaXN0X2RhdGFfcmVxdWVzdF9zX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX3NlcnZlcl9jb25uZWN0aW9uX2hhbmRsZSAoWERSICosIHJwY19sb2Nfc2VydmVyX2Nvbm5lY3Rpb25faGFuZGxlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19zZXJ2ZXJfcHJvdG9jb2xfZV90eXBlIChYRFIgKiwgcnBjX2xvY19zZXJ2ZXJfcHJvdG9jb2xfZV90eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19zZXJ2ZXJfcmVxdWVzdF9lX3R5cGUgKFhEUiAqLCBycGNfbG9jX3NlcnZlcl9yZXF1ZXN0X2VfdHlwZSopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2Nfc2VydmVyX29wZW5fcmVxX3NfdHlwZSAoWERSICosIHJwY19sb2Nfc2VydmVyX29wZW5fcmVxX3NfdHlwZSopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2Nfc2VydmVyX2Nsb3NlX3JlcV9zX3R5cGUgKFhEUiAqLCBycGNfbG9jX3NlcnZlcl9jbG9zZV9yZXFfc190eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19zZXJ2ZXJfcmVxdWVzdF91X3R5cGUgKFhEUiAqLCBycGNfbG9jX3NlcnZlcl9yZXF1ZXN0X3VfdHlwZSopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2Nfc2VydmVyX3JlcXVlc3Rfc190eXBlIChYRFIgKiwgcnBjX2xvY19zZXJ2ZXJfcmVxdWVzdF9zX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX3Jlc2VydmVkX3BheWxvYWRfc190eXBlIChYRFIgKiwgcnBjX2xvY19yZXNlcnZlZF9wYXlsb2FkX3NfdHlwZSopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2NfaW9jdGxfZV90eXBlIChYRFIgKiwgcnBjX2xvY19pb2N0bF9lX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX2FwaV92ZXJzaW9uX3NfdHlwZSAoWERSICosIHJwY19sb2NfYXBpX3ZlcnNpb25fc190eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19maXhfcmVjdXJyZW5jZV9lX3R5cGUgKFhEUiAqLCBycGNfbG9jX2ZpeF9yZWN1cnJlbmNlX2VfdHlwZSopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2Nfb3BlcmF0aW9uX21vZGVfZV90eXBlIChYRFIgKiwgcnBjX2xvY19vcGVyYXRpb25fbW9kZV9lX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX25vdGlmeV9lX3R5cGUgKFhEUiAqLCBycGNfbG9jX25vdGlmeV9lX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX2ZpeF9jcml0ZXJpYV9zX3R5cGUgKFhEUiAqLCBycGNfbG9jX2ZpeF9jcml0ZXJpYV9zX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX25pX3VzZXJfcmVzcF9lX3R5cGUgKFhEUiAqLCBycGNfbG9jX25pX3VzZXJfcmVzcF9lX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX3VzZXJfdmVyaWZ5X3NfdHlwZSAoWERSICosIHJwY19sb2NfdXNlcl92ZXJpZnlfc190eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19wcmVkaWN0ZWRfb3JiaXRzX2RhdGFfZm9ybWF0X2VfdHlwZSAoWERSICosIHJwY19sb2NfcHJlZGljdGVkX29yYml0c19kYXRhX2Zvcm1hdF9lX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX3ByZWRpY3RlZF9vcmJpdHNfZGF0YV9zX3R5cGUgKFhEUiAqLCBycGNfbG9jX3ByZWRpY3RlZF9vcmJpdHNfZGF0YV9zX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX3ByZWRpY3RlZF9vcmJpdHNfZGF0YV92YWxpZGl0eV9yZXBvcnRfc190eXBlIChYRFIgKiwgcnBjX2xvY19wcmVkaWN0ZWRfb3JiaXRzX2RhdGFfdmFsaWRpdHlfcmVwb3J0X3NfdHlwZSopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2NfcHJlZGljdGVkX29yYml0c19hdXRvX2Rvd25sb2FkX2NvbmZpZ19zX3R5cGUgKFhEUiAqLCBycGNfbG9jX3ByZWRpY3RlZF9vcmJpdHNfYXV0b19kb3dubG9hZF9jb25maWdfc190eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19hc3Npc3RfZGF0YV90aW1lX3NfdHlwZSAoWERSICosIHJwY19sb2NfYXNzaXN0X2RhdGFfdGltZV9zX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX2Fzc2lzdF9wb3NfdmFsaWRfbWFza190eXBlIChYRFIgKiwgcnBjX2xvY19hc3Npc3RfcG9zX3ZhbGlkX21hc2tfdHlwZSopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2NfYXNzaXN0X2RhdGFfcG9zX3NfdHlwZSAoWERSICosIHJwY19sb2NfYXNzaXN0X2RhdGFfcG9zX3NfdHlwZSopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2Nfc2VydmVyX29wZW5fc3RhdHVzX2VfdHlwZSAoWERSICosIHJwY19sb2Nfc2VydmVyX29wZW5fc3RhdHVzX2VfdHlwZSopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2Nfc2VydmVyX29wZW5fc3RhdHVzX3NfdHlwZSAoWERSICosIHJwY19sb2Nfc2VydmVyX29wZW5fc3RhdHVzX3NfdHlwZSopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2Nfc2VydmVyX2Nsb3NlX3N0YXR1c19lX3R5cGUgKFhEUiAqLCBycGNfbG9jX3NlcnZlcl9jbG9zZV9zdGF0dXNfZV90eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19zZXJ2ZXJfY2xvc2Vfc3RhdHVzX3NfdHlwZSAoWERSICosIHJwY19sb2Nfc2VydmVyX2Nsb3NlX3N0YXR1c19zX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX2xvY2tfZV90eXBlIChYRFIgKiwgcnBjX2xvY19sb2NrX2VfdHlwZSopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2Nfbm1lYV9zZW50ZW5jZV90eXBlIChYRFIgKiwgcnBjX2xvY19ubWVhX3NlbnRlbmNlX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX2Fzc2lzdF9kYXRhX3R5cGUgKFhEUiAqLCBycGNfbG9jX2Fzc2lzdF9kYXRhX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX2Fzc2lzdF9kYXRhX2RlbGV0ZV9zX3R5cGUgKFhEUiAqLCBycGNfbG9jX2Fzc2lzdF9kYXRhX2RlbGV0ZV9zX3R5cGUqKTsKLWV4dGVybiAgYm9vbF90IHhkcl9ycGNfbG9jX2lvY3RsX2RhdGFfdV90eXBlIChYRFIgKiwgcnBjX2xvY19pb2N0bF9kYXRhX3VfdHlwZSopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2NfaW9jdGxfY2FsbGJhY2tfZGF0YV91X3R5cGUgKFhEUiAqLCBycGNfbG9jX2lvY3RsX2NhbGxiYWNrX2RhdGFfdV90eXBlKik7Ci1leHRlcm4gIGJvb2xfdCB4ZHJfcnBjX2xvY19pb2N0bF9jYWxsYmFja19zX3R5cGUgKFhEUiAqLCBycGNfbG9jX2lvY3RsX2NhbGxiYWNrX3NfdHlwZSopOwotZXh0ZXJuICBib29sX3QgeGRyX3JwY19sb2NfZXZlbnRfcGF5bG9hZF91X3R5cGUgKFhEUiAqLCBycGNfbG9jX2V2ZW50X3BheWxvYWRfdV90eXBlKik7Ci0KLSNlbHNlIC8qIEsmUiBDICovCi1leHRlcm4gYm9vbF90IHhkcl9ycGNfYm9vbGVhbiAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY191aW50MzIgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfdWludDE2ICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX3VpbnQ4ICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2ludDMyICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2J5dGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfdWludDY0ICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19jbGllbnRfaGFuZGxlX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX2V2ZW50X21hc2tfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2NfcG9zaXRpb25fdmFsaWRfbWFza190eXBlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19wb3NfdGVjaG5vbG9neV9tYXNrX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX3Nlc3Npb25fc3RhdHVzX2VfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2NfY2FsZW5kYXJfdGltZV9zX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX3BhcnNlZF9wb3NpdGlvbl9zX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX3N2X3N5c3RlbV9lX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX3N2X3N0YXR1c19lX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX3N2X2luZm9fdmFsaWRfbWFza190eXBlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19zdl9pbmZvX3NfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2NfZ25zc19pbmZvX3ZhbGlkX21hc2tfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2NfZ25zc19pbmZvX3NfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2Nfbm1lYV9yZXBvcnRfc190eXBlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19zdGF0dXNfZXZlbnRfZV90eXBlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19lbmdpbmVfc3RhdGVfZV90eXBlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19zdGF0dXNfZXZlbnRfcGF5bG9hZF91X3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX3N0YXR1c19ldmVudF9zX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX3NlcnZlcl9hZGRyX2VfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2Nfc2VydmVyX2FkZHJfaXB2NF90eXBlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19zZXJ2ZXJfYWRkcl91cmxfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2Nfc2VydmVyX2FkZHJfdV90eXBlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19zZXJ2ZXJfaW5mb19zX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX25pX25vdGlmeV92ZXJpZnlfZV90eXBlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19uaV9ldmVudF9lX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX25pX2RhdGFjb2Rpbmdfc2NoZW1lX2VfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2NfbmlfdnhfcmVxdWVzdGVyX2lkX2VuY29kaW5nX3NjaGVtZV9lX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX25pX3Z4X3Bvc19tb2RlX2VfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2NfbmlfdnhfcmVxdWVzdGVyX2lkX3NfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2Nfbmlfdnhfbm90aWZ5X3ZlcmlmeV9yZXFfc190eXBlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19uaV9zdXBsX3Bvc19tZXRob2RfZV90eXBlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19uaV9zdXBsX3NscF9zZXNzaW9uX2lkX3NfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2NfbmlfcmVxdWVzdG9yX2lkX3NfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2Nfbmlfc3VwbF9jbGllbnRfbmFtZV9zX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX25pX3N1cGxfcW9wX3NfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2Nfbmlfc3VwbF9ub3RpZnlfdmVyaWZ5X3JlcV9zX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX25pX2V4dF9jbGllbnRfYWRkcmVzc19zX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX25pX2xvY2F0aW9uX3R5cGVfZV90eXBlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19uaV9kZWZlcnJlZF9sb2NhdGlvbl9zX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX25pX2NvZGV3b3JkX3N0cmluZ19zX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX25pX3NlcnZpY2VfdHlwZV9pZF9zX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX25pX3VtdHNfY3Bfbm90aWZ5X3ZlcmlmeV9yZXFfc190eXBlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19uaV9ldmVudF9wYXlsb2FkX3VfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2NfbmlfZXZlbnRfc190eXBlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19hc3Npc3RfZGF0YV9yZXF1ZXN0X2VfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19zdHJ1Y3RfbG9jX3RpbWVfZG93bmxvYWRfc291cmNlX3NfdHlwZV9zZXJ2ZXJzX3B0ciAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19zdHJ1Y3RfbG9jX3RpbWVfZG93bmxvYWRfc291cmNlX3NfdHlwZV9zZXJ2ZXJzICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY190aW1lX2Rvd25sb2FkX3NvdXJjZV9zX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfc3RydWN0X2xvY19wcmVkaWN0ZWRfb3JiaXRzX2RhdGFfc291cmNlX3NfdHlwZV9zZXJ2ZXJzX3B0ciAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19zdHJ1Y3RfbG9jX3ByZWRpY3RlZF9vcmJpdHNfZGF0YV9zb3VyY2Vfc190eXBlX3NlcnZlcnMgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX3ByZWRpY3RlZF9vcmJpdHNfZGF0YV9zb3VyY2Vfc190eXBlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19hc3Npc3RfZGF0YV9yZXF1ZXN0X3BheWxvYWRfdV90eXBlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19hc3Npc3RfZGF0YV9yZXF1ZXN0X3NfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2Nfc2VydmVyX2Nvbm5lY3Rpb25faGFuZGxlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19zZXJ2ZXJfcHJvdG9jb2xfZV90eXBlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19zZXJ2ZXJfcmVxdWVzdF9lX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX3NlcnZlcl9vcGVuX3JlcV9zX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX3NlcnZlcl9jbG9zZV9yZXFfc190eXBlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19zZXJ2ZXJfcmVxdWVzdF91X3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX3NlcnZlcl9yZXF1ZXN0X3NfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2NfcmVzZXJ2ZWRfcGF5bG9hZF9zX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX2lvY3RsX2VfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2NfYXBpX3ZlcnNpb25fc190eXBlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19maXhfcmVjdXJyZW5jZV9lX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX29wZXJhdGlvbl9tb2RlX2VfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2Nfbm90aWZ5X2VfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2NfZml4X2NyaXRlcmlhX3NfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2NfbmlfdXNlcl9yZXNwX2VfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2NfdXNlcl92ZXJpZnlfc190eXBlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19wcmVkaWN0ZWRfb3JiaXRzX2RhdGFfZm9ybWF0X2VfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2NfcHJlZGljdGVkX29yYml0c19kYXRhX3NfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2NfcHJlZGljdGVkX29yYml0c19kYXRhX3ZhbGlkaXR5X3JlcG9ydF9zX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX3ByZWRpY3RlZF9vcmJpdHNfYXV0b19kb3dubG9hZF9jb25maWdfc190eXBlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19hc3Npc3RfZGF0YV90aW1lX3NfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2NfYXNzaXN0X3Bvc192YWxpZF9tYXNrX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX2Fzc2lzdF9kYXRhX3Bvc19zX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX3NlcnZlcl9vcGVuX3N0YXR1c19lX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX3NlcnZlcl9vcGVuX3N0YXR1c19zX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX3NlcnZlcl9jbG9zZV9zdGF0dXNfZV90eXBlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19zZXJ2ZXJfY2xvc2Vfc3RhdHVzX3NfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2NfbG9ja19lX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX25tZWFfc2VudGVuY2VfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2NfYXNzaXN0X2RhdGFfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2NfYXNzaXN0X2RhdGFfZGVsZXRlX3NfdHlwZSAoKTsKLWV4dGVybiBib29sX3QgeGRyX3JwY19sb2NfaW9jdGxfZGF0YV91X3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX2lvY3RsX2NhbGxiYWNrX2RhdGFfdV90eXBlICgpOwotZXh0ZXJuIGJvb2xfdCB4ZHJfcnBjX2xvY19pb2N0bF9jYWxsYmFja19zX3R5cGUgKCk7Ci1leHRlcm4gYm9vbF90IHhkcl9ycGNfbG9jX2V2ZW50X3BheWxvYWRfdV90eXBlICgpOwotCi0jZW5kaWYgLyogSyZSIEMgKi8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmIC8qICFfTE9DX0FQSV9DT01NT05fSF9SUENHRU4gKi8KZGlmZiAtLWdpdCBhL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpLXJwYy9pbmMtMzIwMC9sb2NfYXBpX2ZpeHVwLmggYi9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaS1ycGMvaW5jLTMyMDAvbG9jX2FwaV9maXh1cC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjJlYjM2Li4wMDAwMDAwCi0tLSBhL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpLXJwYy9pbmMtMzIwMC9sb2NfYXBpX2ZpeHVwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICBAZmlsZTogIGxvY19hcGlfZml4dXAuaAotICBAYnJpZWY6ICBMb2MgQVBJIEFuZHJvaWQgUlBDIGFtZW5kbWVudCBoZWFkZXIKLQotICBERVNDUklQVElPTgotICAgICBMb2MgQVBJIEFuZHJvaWQgUlBDIGFtZW5kbWVudCBoZWFkZXIKLQotICBJTklUSUFMSVpBVElPTiBBTkQgU0VRVUVOQ0lORyBSRVFVSVJFTUVOVFMKLQotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQ29weXJpZ2h0IChjKSAyMDA5LCBRVUFMQ09NTSBVU0EsIElOQy4KLQotQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotCi23ICAgICAgICAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLQottyAgICAgICAgIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gCi0KLbcgICAgICAgICBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBRVUFMQ09NTSBVU0EsIElOQy4gIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIAotCi1USElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiAgTE9DX0FQSV9GSVhVUF9ICi0jZGVmaW5lIExPQ19BUElfRklYVVBfSAotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLXsKLSNlbmRpZgotCi0jaWZuZGVmIE5VTExQUk9DCi0jZGVmaW5lIE5VTExQUk9DIDAKLSNlbmRpZiAvKiBOVUxMUFJPQyAqLwotCi0jaWZkZWYgQUREX1hEUl9GTE9BVAotCi1leHRlcm4gYm9vbF90IHhkcl9mbG9hdCAoWERSICpfX3hkcnMsIGZsb2F0ICpfX2ZwKTsKLWV4dGVybiBib29sX3QgeGRyX2RvdWJsZSAoWERSICpfX3hkcnMsIGRvdWJsZSAqX19kcCk7Ci0KLSNlbmRpZiAvKiBBRERfWERSX0ZMT0FUICovCi0KLSNpZmRlZiBBRERfWERSX0JPT0wKLWV4dGVybiBib29sX3QgeGRyX2Jvb2woWERSICpfX3hkcnMsIGludCAqX19icCk7Ci0jZW5kaWYgLyogQUREX1hEUl9CT09MICovCi0KLSNkZWZpbmUgUlBDX0xPQ19BUElfTUFKT1JfVkVSU0lPTl9OVU1CRVIgICAxCi0jZGVmaW5lIFJQQ19MT0NfQVBJX01JTk9SX1ZFUlNJT05fTlVNQkVSICAgMAotCi0vLyBSZXR1cm4gdmFsdWUgZm9yIGxvY19vcGVuIGluIGNhc2Ugb2YgZmFpbHVyZS4KLSNkZWZpbmUgUlBDX0xPQ19DTElFTlRfSEFORExFX0lOVkFMSUQgICAgIC0xCi0KLS8vIFJldHVybiB2YWx1ZSBvZiBsb2MgYXBpIGNhbGxzIGZvciBsb2NfY2xvc2UsIGxvY19zdGFydF9maXgsIGxvY19zdG9wX2ZpeCBhbmQgbG9jX2lvY3RsCi0vLyBUaGVzZSBhcmUgYWxzbyB0aGUgc3RhdHVzIGZvciB0aGUgaW9jdGwgY2FsbGJhY2sKLSNkZWZpbmUgUlBDX0xPQ19BUElfU1VDQ0VTUyAgICAgICAgICAgMAotI2RlZmluZSBSUENfTE9DX0FQSV9HRU5FUkFMX0ZBSUxVUkUgICAxCi0jZGVmaW5lIFJQQ19MT0NfQVBJX1VOU1VQUE9SVEVEICAgICAgIDIKLSNkZWZpbmUgUlBDX0xPQ19BUElfSU5WQUxJRF9IQU5ETEUgICAgNAotI2RlZmluZSBSUENfTE9DX0FQSV9JTlZBTElEX1BBUkFNRVRFUiA1Ci0jZGVmaW5lIFJQQ19MT0NfQVBJX0VOR0lORV9CVVNZICAgICAgIDYKLSNkZWZpbmUgUlBDX0xPQ19BUElfUEhPTkVfT0ZGTElORSAgICAgNwotI2RlZmluZSBSUENfTE9DX0FQSV9USU1FT1VUICAgICAgICAgICA4Ci0KLS8vIFNwZWNpYWwgcmV0dXJuIHZhbHVlIGZvciBsb2MgYXBpIGNhbGxzIGluIGNhc2Ugb2YgUkNQIGZhaWx1cmUKLSNkZWZpbmUgUlBDX0xPQ19BUElfUlBDX0ZBSUxVUkUgICAgICAgKC0xMjM0KQotCi0jZGVmaW5lIFJQQ19MT0NfQVBJX01BWF9TVl9DT1VOVCAgICAgICAgICAgICAgICAgICAgICA4MAotI2RlZmluZSBSUENfTE9DX0FQSV9NQVhfTk1FQV9TVFJJTkdfTEVOR1RIICAgICAgICAgICAgMTIwMAotCi0vLyBNYXhpbXVtIHNlcnZlciBhZGRyZXNzIHRoYXQgd2lsbCBiZSB1c2VkIGluIGxvY2F0aW9uIEFQSQotI2RlZmluZSBSUENfTE9DX0FQSV9NQVhfU0VSVkVSX0FERFJfTEVOR1RIICAgICAgICAgICAgMjU2Ci0jZGVmaW5lIFJQQ19MT0NfQVBJX01BWF9OVU1fUFJFRElDVEVEX09SQklUU19TRVJWRVJTICAzCi0jZGVmaW5lIFJQQ19MT0NfQVBJX01BWF9OVU1fTlRQX1NFUlZFUlMgICAgICAgICAgICAgICAzCi0KLSNkZWZpbmUgUlBDX0xPQ19FVkVOVF9QQVJTRURfUE9TSVRJT05fUkVQT1JUICAgICAgICAgICAgIDB4MDAwMDAwMDEgLy8gUG9zaXRpb24gcmVwb3J0IGNvbWVzIGluIGxvY19wYXJzZWRfcG9zaXRpb25fc190eXBlCi0jZGVmaW5lIFJQQ19MT0NfRVZFTlRfU0FURUxMSVRFX1JFUE9SVCAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyIC8vIFNhdGVsbGl0ZSBpbiB2aWV3IHJlcG9ydAotI2RlZmluZSBSUENfTE9DX0VWRU5UX05NRUFfMUhaX1JFUE9SVCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNCAvLyBOTUVBIHJlcG9ydCBhdCAxSFogcmF0ZQotI2RlZmluZSBSUENfTE9DX0VWRU5UX05NRUFfUE9TSVRJT05fUkVQT1JUICAgICAgICAgICAgICAgMHgwMDAwMDAwOCAvLyBOTUVBIHJlcG9ydCBhdCBwb3NpdGlvbiByZXBvcnQgcmF0ZQotI2RlZmluZSBSUENfTE9DX0VWRU5UX05JX05PVElGWV9WRVJJRllfUkVRVUVTVCAgICAgICAgICAgMHgwMDAwMDAxMCAvLyBOSSBub3RpZmljYXRpb24vdmVyaWZpY2F0aW9uIHJlcXVlc3QKLSNkZWZpbmUgUlBDX0xPQ19FVkVOVF9BU1NJU1RBTkNFX0RBVEFfUkVRVUVTVCAgICAgICAgICAgIDB4MDAwMDAwMjAgLy8gQXNzaXN0YW5jZSBkYXRhLCBlZzogdGltZSwgcHJlZGljdGVkIG9yYml0cyByZXF1ZXN0Ci0jZGVmaW5lIFJQQ19MT0NfRVZFTlRfTE9DQVRJT05fU0VSVkVSX1JFUVVFU1QgICAgICAgICAgICAweDAwMDAwMDQwIC8vIFJlcXVlc3QgZm9yIGxvY2F0aW9uIHNlcnZlcgotI2RlZmluZSBSUENfTE9DX0VWRU5UX0lPQ1RMX1JFUE9SVCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MCAvLyBDYWxsYmFjayByZXBvcnQgZm9yIGxvY19pb2N0bAotI2RlZmluZSBSUENfTE9DX0VWRU5UX1NUQVRVU19SRVBPUlQgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMCAvLyBNaXNjIHN0YXR1cyByZXBvcnQ6IGVnLCBlbmdpbmUgc3RhdGUKLQotCi0jZGVmaW5lIFJQQ19MT0NfUE9TX1ZBTElEX1NFU1NJT05fU1RBVFVTICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIFJQQ19MT0NfUE9TX1ZBTElEX1RJTUVTVEFNUF9DQUxFTkRBUiAgICAgICAgICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIFJQQ19MT0NfUE9TX1ZBTElEX1RJTUVTVEFNUF9VVEMgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0Ci0jZGVmaW5lIFJQQ19MT0NfUE9TX1ZBTElEX0xFQVBfU0VDT05EUyAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4Ci0jZGVmaW5lIFJQQ19MT0NfUE9TX1ZBTElEX1RJTUVfVU5DICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwCi0jZGVmaW5lIFJQQ19MT0NfUE9TX1ZBTElEX0xBVElUVURFICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwCi0jZGVmaW5lIFJQQ19MT0NfUE9TX1ZBTElEX0xPTkdJVFVERSAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDQwCi0jZGVmaW5lIFJQQ19MT0NfUE9TX1ZBTElEX0FMVElUVURFX1dSVF9FTExJUFNPSUQgICAgICAgICAweDAwMDAwMDgwCi0jZGVmaW5lIFJQQ19MT0NfUE9TX1ZBTElEX0FMVElUVURFX1dSVF9NRUFOX1NFQV9MRVZFTCAgICAweDAwMDAwMTAwCi0jZGVmaW5lIFJQQ19MT0NfUE9TX1ZBTElEX1NQRUVEX0hPUklaT05UQUwgICAgICAgICAgICAgICAweDAwMDAwMjAwCi0jZGVmaW5lIFJQQ19MT0NfUE9TX1ZBTElEX1NQRUVEX1ZFUlRJQ0FMICAgICAgICAgICAgICAgICAweDAwMDAwNDAwCi0jZGVmaW5lIFJQQ19MT0NfUE9TX1ZBTElEX0hFQURJTkcgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwODAwCi0jZGVmaW5lIFJQQ19MT0NfUE9TX1ZBTElEX0hPUl9VTkNfQ0lSQ1VMQVIgICAgICAgICAgICAgICAweDAwMDAxMDAwCi0jZGVmaW5lIFJQQ19MT0NfUE9TX1ZBTElEX0hPUl9VTkNfRUxMSV9TRU1JX01BSiAgICAgICAgICAweDAwMDAyMDAwCi0jZGVmaW5lIFJQQ19MT0NfUE9TX1ZBTElEX0hPUl9VTkNfRUxMSV9TRU1JX01JTiAgICAgICAgICAweDAwMDA0MDAwCi0jZGVmaW5lIFJQQ19MT0NfUE9TX1ZBTElEX0hPUl9VTkNfRUxMSV9PUklFTlRfQVpJTVVUSCAgICAweDAwMDA4MDAwCi0jZGVmaW5lIFJQQ19MT0NfUE9TX1ZBTElEX1ZFUlRJQ0FMX1VOQyAgICAgICAgICAgICAgICAgICAweDAwMDEwMDAwCi0jZGVmaW5lIFJQQ19MT0NfUE9TX1ZBTElEX1NQRUVEX1VOQyAgICAgICAgICAgICAgICAgICAgICAweDAwMDIwMDAwCi0jZGVmaW5lIFJQQ19MT0NfUE9TX1ZBTElEX0hFQURJTkdfVU5DICAgICAgICAgICAgICAgICAgICAweDAwMDQwMDAwCi0jZGVmaW5lIFJQQ19MT0NfUE9TX1ZBTElEX0NPTkZJREVOQ0VfSE9SSVpPTlRBTCAgICAgICAgICAweDAwMDgwMDAwCi0jZGVmaW5lIFJQQ19MT0NfUE9TX1ZBTElEX0NPTkZJREVOQ0VfVkVSVElDQUwgICAgICAgICAgICAweDAwMTAwMDAwCi0jZGVmaW5lIFJQQ19MT0NfUE9TX1ZBTElEX01BR05FVElDX1ZBUklBVElPTiAgICAgICAgICAgICAweDAwMjAwMDAwCi0jZGVmaW5lIFJQQ19MT0NfUE9TX1ZBTElEX1RFQ0hOT0xPR1lfTUFTSyAgICAgICAgICAgICAgICAweDAwNDAwMDAwCi0KLSNkZWZpbmUgUlBDX0xPQ19QT1NfVEVDSF9TQVRFTExJVEUgMHgwMDAwMDAwMQotI2RlZmluZSBSUENfTE9DX1BPU19URUNIX0NFTExJRCAgICAweDAwMDAwMDAyCi0jZGVmaW5lIFJQQ19MT0NfUE9TX1RFQ0hfV0lGSSAgICAgIDB4MDAwMDAwMDQKLQotI2RlZmluZSBSUENfTE9DX1NWX0lORk9fVkFMSURfU1lTVEVNICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBSUENfTE9DX1NWX0lORk9fVkFMSURfUFJOICAgICAgICAgICAgMHgwMDAwMDAwMgotI2RlZmluZSBSUENfTE9DX1NWX0lORk9fVkFMSURfSEVBTFRIX1NUQVRVUyAgMHgwMDAwMDAwNAotI2RlZmluZSBSUENfTE9DX1NWX0lORk9fVkFMSURfUFJPQ0VTU19TVEFUVVMgMHgwMDAwMDAwOAotI2RlZmluZSBSUENfTE9DX1NWX0lORk9fVkFMSURfSEFTX0VQSCAgICAgICAgMHgwMDAwMDAxMAotI2RlZmluZSBSUENfTE9DX1NWX0lORk9fVkFMSURfSEFTX0FMTSAgICAgICAgMHgwMDAwMDAyMAotI2RlZmluZSBSUENfTE9DX1NWX0lORk9fVkFMSURfRUxFVkFUSU9OICAgICAgMHgwMDAwMDA0MAotI2RlZmluZSBSUENfTE9DX1NWX0lORk9fVkFMSURfQVpJTVVUSCAgICAgICAgMHgwMDAwMDA4MAotI2RlZmluZSBSUENfTE9DX1NWX0lORk9fVkFMSURfU05SICAgICAgICAgICAgMHgwMDAwMDEwMAotCi0jZGVmaW5lIFJQQ19MT0NfR05TU19JTkZPX1ZBTElEX1BPU19ET1AgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgUlBDX0xPQ19HTlNTX0lORk9fVkFMSURfSE9SX0RPUCAgICAgICAgICAgMHgwMDAwMDAwMgotI2RlZmluZSBSUENfTE9DX0dOU1NfSU5GT19WQUxJRF9WRVJUX0RPUCAgICAgICAgICAweDAwMDAwMDA0Ci0jZGVmaW5lIFJQQ19MT0NfR05TU19JTkZPX1ZBTElEX0FMVElUVURFX0FTU1VNRUQgIDB4MDAwMDAwMDgKLSNkZWZpbmUgUlBDX0xPQ19HTlNTX0lORk9fVkFMSURfU1ZfQ09VTlQgICAgICAgICAgMHgwMDAwMDAxMAotI2RlZmluZSBSUENfTE9DX0dOU1NfSU5GT19WQUxJRF9TVl9MSVNUICAgICAgICAgICAweDAwMDAwMDIwCi0KLSNkZWZpbmUgUlBDX0xPQ19OSV9NQVhfUkVRVUVTVE9SX0lEX0xFTkdUSCAgICAgICAgICAyMDAKLSNkZWZpbmUgUlBDX0xPQ19OSV9TVVBMX0hBU0hfTEVOR1RIICAgICAgICAgICAgICAgICA4Ci0jZGVmaW5lIFJQQ19MT0NfTklfU1VQTF9TTFBfU0VTU0lPTl9JRF9CWVRFX0xFTkdUSCAgNAotI2RlZmluZSBSUENfTE9DX05JX01BWF9DTElFTlRfTkFNRV9MRU5HVEggICAgICAgICAgIDY0Ci0jZGVmaW5lIFJQQ19MT0NfTklfTUFYX0VYVF9DTElFTlRfQUREUkVTUyAgICAgICAgICAgMjAKLSNkZWZpbmUgUlBDX0xPQ19OSV9DT0RFV09SRF9MRU5HVEggICAgICAgICAgICAgICAgICAyMAotCi0jZGVmaW5lIFJQQ19MT0NfTklfU1VQTF9RT1BfVkFMSUQgICAgICAgICAweDAxCi0jZGVmaW5lIFJQQ19MT0NfTklfU1VQTF9RT1BfVkVSQUNDX1ZBTElEICAweDAyCi0jZGVmaW5lIFJQQ19MT0NfTklfU1VQTF9RT1BfTUFYQUdFX1ZBTElEICAweDA0Ci0jZGVmaW5lIFJQQ19MT0NfTklfU1VQTF9RT1BfREVMQVlfVkFMSUQgICAweDA4Ci0KLSNkZWZpbmUgUlBDX0xPQ19GSVhfQ1JJVF9WQUxJRF9SRUNVUlJFTkNFX1RZUEUgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIFJQQ19MT0NfRklYX0NSSVRfVkFMSURfUFJFRkVSUkVEX09QRVJBVElPTl9NT0RFICAgICAgICAgMHgwMDAwMDAwMgotI2RlZmluZSBSUENfTE9DX0ZJWF9DUklUX1ZBTElEX1BSRUZFUlJFRF9BQ0NVUkFDWSAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKLSNkZWZpbmUgUlBDX0xPQ19GSVhfQ1JJVF9WQUxJRF9QUkVGRVJSRURfUkVTUE9OU0VfVElNRSAgICAgICAgICAweDAwMDAwMDA4Ci0jZGVmaW5lIFJQQ19MT0NfRklYX0NSSVRfVkFMSURfSU5URVJNRURJQVRFX1BPU19SRVBPUlRfRU5BQkxFRCAgMHgwMDAwMDAxMAotI2RlZmluZSBSUENfTE9DX0ZJWF9DUklUX1ZBTElEX05PVElGWV9UWVBFICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKLSNkZWZpbmUgUlBDX0xPQ19GSVhfQ1JJVF9WQUxJRF9NSU5fSU5URVJWQUwgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDQwCi0jZGVmaW5lIFJQQ19MT0NfRklYX0NSSVRfVkFMSURfTUlOX0RJU1RBTkNFICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MAotI2RlZmluZSBSUENfTE9DX0ZJWF9DUklUX1ZBTElEX01JTl9ESVNUX1NBTVBMRV9JTlRFUlZBTCAgICAgICAgIDB4MDAwMDAxMDAKLQotI2RlZmluZSBSUENfTE9DX0FTU0lTVF9QT1NfVkFMSURfVElNRVNUQU1QX1VUQyAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIFJQQ19MT0NfQVNTSVNUX1BPU19WQUxJRF9MQVRJVFVERSAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKLSNkZWZpbmUgUlBDX0xPQ19BU1NJU1RfUE9TX1ZBTElEX0xPTkdJVFVERSAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAotI2RlZmluZSBSUENfTE9DX0FTU0lTVF9QT1NfVkFMSURfQUxUSVRVREVfV1JUX0VMTElQU09JRCAgICAgICAweDAwMDAwMDA4Ci0jZGVmaW5lIFJQQ19MT0NfQVNTSVNUX1BPU19WQUxJRF9BTFRJVFVERV9XUlRfTUVBTl9TRUFfTEVWRUwgIDB4MDAwMDAwMTAKLSNkZWZpbmUgUlBDX0xPQ19BU1NJU1RfUE9TX1ZBTElEX0hPUl9VTkNfQ0lSQ1VMQVIgICAgICAgICAgICAgMHgwMDAwMDAyMAotI2RlZmluZSBSUENfTE9DX0FTU0lTVF9QT1NfVkFMSURfVkVSVF9VTkMgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDQwCi0jZGVmaW5lIFJQQ19MT0NfQVNTSVNUX1BPU19WQUxJRF9DT05GSURFTkNFX0hPUklaT05UQUwgICAgICAgIDB4MDAwMDAwODAKLSNkZWZpbmUgUlBDX0xPQ19BU1NJU1RfUE9TX1ZBTElEX0NPTkZJREVOQ0VfVkVSVElDQUwgICAgICAgICAgMHgwMDAwMDEwMAotCi0jZGVmaW5lIFJQQ19MT0NfQVNTSVNUX0RBVEFfQUxMICAgICAgICAgMHhGRkZGRkZGRgotCi0jZGVmaW5lIFJQQ19MT0NfTk1FQV9NQVNLX0FMTCAgICAweGZmZmYKLSNkZWZpbmUgUlBDX0xPQ19OTUVBX01BU0tfR0dBICAgIDB4MDAwMQotI2RlZmluZSBSUENfTE9DX05NRUFfTUFTS19STUMgICAgMHgwMDAyCi0jZGVmaW5lIFJQQ19MT0NfTk1FQV9NQVNLX0dTViAgICAweDAwMDQKLSNkZWZpbmUgUlBDX0xPQ19OTUVBX01BU0tfR1NBICAgIDB4MDAwOAotI2RlZmluZSBSUENfTE9DX05NRUFfTUFTS19WVEcgICAgMHgwMDEwCi0KLS8qIGZsYWdzIGZvciBub3RpZmljYXRpb24gKi8KLSNkZWZpbmUgIFJQQ19MT0NfTklfQ0xJRU5UX05BTUVfUFJFU0VOVCAgICAgICAgICAgICAweDAwMDEKLSNkZWZpbmUgIFJQQ19MT0NfTklfQ0xJRU5UX0VYVEFERFJfUFJFU0VOVCAgICAgICAgICAweDAwMDIKLSNkZWZpbmUgIFJQQ19MT0NfTklfREVGX0xPQ0FUSU9OX1RZUEVfUFJFU0VOVCAgICAgICAweDAwMTAKLSNkZWZpbmUgIFJQQ19MT0NfTklfUkVRVUVTVE9SX0lEX1BSRVNFTlQgICAgICAgICAgICAweDAwMjAKLSNkZWZpbmUgIFJQQ19MT0NfTklfQ09ERVdPUkRfUFJFU0VOVCAgICAgICAgICAgICAgICAweDAwNDAKLSNkZWZpbmUgIFJQQ19MT0NfTklfU0VSVklDRV9UWVBFX0lEX1BSRVNFTlQgICAgICAgICAweDAwODAKLSNkZWZpbmUgIFJQQ19MT0NfTklfRU5DT0RJTkdfVFlQRV9QUkVTRU5UICAgICAgICAgICAweDAxMDAKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmIC8qIExPQ19BUElfRklYVVBfSCAqLwpkaWZmIC0tZ2l0IGEvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGktcnBjL2luYy0zMjAwL2xvY19hcGljYl9hcHBpbml0LmggYi9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaS1ycGMvaW5jLTMyMDAvbG9jX2FwaWNiX2FwcGluaXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJkNGUxNS4uMDAwMDAwMAotLS0gYS9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaS1ycGMvaW5jLTMyMDAvbG9jX2FwaWNiX2FwcGluaXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUNvcHlyaWdodCAoYykgMjAwOSwgUVVBTENPTU0gVVNBLCBJTkMuCi0KLUFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLQottyAgICAgICAgIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0KLbcgICAgICAgICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uIAotCi23ICAgICAgICAgTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgUVVBTENPTU0gVVNBLCBJTkMuICBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAKLQotVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8gCi0KLSNpZm5kZWYgTE9DX0FQSUNCX0FQUElOSVRfSAotI2RlZmluZSBMT0NfQVBJQ0JfQVBQSU5JVF9ICi0KLSNpZmRlZiBfX2NwbHVzcGx1cyAKLWV4dGVybiAiQyIgCi17IAotI2VuZGlmCi0KLSAvKiBJbml0aWFsaXphdGlvbiBmdW5jdGlvbiBmb3IgY2FsbGJhY2tzICovCi1leHRlcm4gaW50IGxvY19hcGljYl9hcHBfaW5pdCgpOyAKLWV4dGVybiB2b2lkIGxvY19hcGljYl9hcHBfZGVpbml0KCk7IAotCi0jaWZkZWYgX19jcGx1c3BsdXMgCi19Ci0jZW5kaWYKLQotI2VuZGlmIC8qIExPQ19BUElDQl9BUFBJTklUX0ggKi8KZGlmZiAtLWdpdCBhL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpLXJwYy9pbmMvZGVidWcuaCBiL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpLXJwYy9pbmMvZGVidWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTcxYjIzYS4uMDAwMDAwMAotLS0gYS9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaS1ycGMvaW5jL2RlYnVnLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKgotQ29weXJpZ2h0IChjKSAyMDA5LCBRVUFMQ09NTSBVU0EsIElOQy4KLQotQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotCi23ICAgICAgICAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLQottyAgICAgICAgIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gCi0KLbcgICAgICAgICBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBRVUFMQ09NTSBVU0EsIElOQy4gIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIAotCi1USElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotKi8KLQotI2lmbmRlZiBERUJVR19ICi0jZGVmaW5lIERFQlVHX0gKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNkZWZpbmUgTE9HX1RBRyAibGliZ3BzLXJwYyIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2RlZmluZSBQUklOVCh4Li4uKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBmcHJpbnRmKHN0ZG91dCwgIiVzKCVkKSAiLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsgXAotICAgICAgICBmcHJpbnRmKHN0ZG91dCwgIyN4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBMT0dEKHgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSB3aGlsZSgwKQotCi0jaWZkZWYgREVCVUcKLSNkZWZpbmUgRCBQUklOVAotI2Vsc2UKLSNkZWZpbmUgRCh4Li4uKSBkbyB7IH0gd2hpbGUoMCkKLSNlbmRpZgotCi0jaWZkZWYgVkVSQk9TRQotI2RlZmluZSBWIFBSSU5UCi0jZWxzZQotI2RlZmluZSBWKHguLi4pIGRvIHsgfSB3aGlsZSgwKQotI2VuZGlmCi0KLSNkZWZpbmUgRSh4Li4uKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICIlcyglZCkgIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7IFwKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICMjeCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgTE9HRSh4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9IHdoaWxlKDApCi0KLSNkZWZpbmUgRkFJTElGKGNvbmQsIG1zZy4uLikgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGlmIChfX2J1aWx0aW5fZXhwZWN0IChjb25kLCAwKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczolczooJWQpOiAiLCBfX0ZJTEVfXywgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7IFwKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAjI21zZyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBMT0dFKCMjbXNnKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9IHdoaWxlKDApCi0KLSNlbmRpZi8qREVCVUdfSCovCmRpZmYgLS1naXQgYS9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaS1ycGMvaW5jL2xvY19hcGlfcnBjX2dsdWUuaCBiL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpLXJwYy9pbmMvbG9jX2FwaV9ycGNfZ2x1ZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjk3MmJkLi4wMDAwMDAwCi0tLSBhL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpLXJwYy9pbmMvbG9jX2FwaV9ycGNfZ2x1ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgQGZpbGU6ICBsb2NfYXBpX3JwY19nbHVlLmgKLSAgQGJyaWVmOiAgTG9jIEFQSSBBbmRyb2lkIGdsdWUgY29kZSBoZWFkZXIKLQotICBERVNDUklQVElPTgotICAgICBMb2MgQVBJIEFuZHJvaWQgZ2x1ZSBjb2RlIGhlYWRlcgotCi0gIElOSVRJQUxJWkFUSU9OIEFORCBTRVFVRU5DSU5HIFJFUVVJUkVNRU5UUwotCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Db3B5cmlnaHQgKGMpIDIwMDksIFFVQUxDT01NIFVTQSwgSU5DLgotCi1BbGwgcmlnaHRzIHJlc2VydmVkLgotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0KLbcgICAgICAgICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotCi23ICAgICAgICAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAKLQottyAgICAgICAgIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFFVQUxDT01NIFVTQSwgSU5DLiAgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gCi0KLVRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICAgICAgICAgICAgICAgICAgICAgRURJVCBISVNUT1JZIEZPUiBNT0RVTEUKLQotICBUaGlzIHNlY3Rpb24gY29udGFpbnMgY29tbWVudHMgZGVzY3JpYmluZyBjaGFuZ2VzIG1hZGUgdG8gdGhlIG1vZHVsZS4KLSAgTm90aWNlIHRoYXQgY2hhbmdlcyBhcmUgbGlzdGVkIGluIHJldmVyc2UgY2hyb25vbG9naWNhbCBvcmRlci4KLQotd2hlbiAgICAgICB3aG8gICAgICB3aGF0LCB3aGVyZSwgd2h5Ci0tLS0tLS0tLSAgIC0tLSAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTAzLzE3LzA5ICAgZHggICAgICAgSW5pdGlhbCB2ZXJzaW9uCi0KLSRJZDogLy9zb3VyY2UvcWNvbS9xY3QvbW9kZW0vZ3BzL2NncHMvZGV2L2xvY2F0aW9ubWlkZGxld2FyZS9sb2NhcGkvYXBwLWxpbnV4L3NvdXJjZS90ZXN0L2xvY19hcGlfdGVzdC9sb2NfYXBpX2NiX2xvZy5oIzQgJAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLSNpZm5kZWYgTE9DX0FQSV9SUENfR0xVRV9ICi0jZGVmaW5lIExPQ19BUElfUlBDX0dMVUVfSAotCi0vKiBJbmNsdWRlIFJQQyBoZWFkZXJzICovCi0jaW5jbHVkZSAibG9jX2FwaV9jb21tb24uaCIKLSNpbmNsdWRlICJsb2NfYXBpLmgiCi0jaW5jbHVkZSAibG9jX2FwaV9jYi5oIgotI2luY2x1ZGUgImxvY19hcGlfZml4dXAuaCIKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi17Ci0jZW5kaWYKLQotLyogQm9vbGVhbiAqLwotLyogT3RoZXIgZGF0YSB0eXBlcyBpbiBjb21kZWYuaCBhcmUgZGVmaW5lZCBpbiBycGMgc3R1YnMsIHNvIGZpeCBpdCBoZXJlICovCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgYm9vbGVhbjsKLSNkZWZpbmUgVFJVRSAxCi0jZGVmaW5lIEZBTFNFIDAKLQotZXh0ZXJuIGludCBsb2NfYXBpX2dsdWVfaW5pdCh2b2lkKTsKLWV4dGVybiBpbnQgbG9jX2FwaV9udWxsKHZvaWQpOwotCi10eXBlZGVmIGludDMyIChsb2NfZXZlbnRfY2JfZl90eXBlKSgKLSAgICAgIHJwY19sb2NfY2xpZW50X2hhbmRsZV90eXBlICAgICAgICAgICAgbG9jX2hhbmRsZSwgICAgICAgICAgICAgLyogaGFuZGxlIG9mIHRoZSBjbGllbnQgKi8KLSAgICAgIHJwY19sb2NfZXZlbnRfbWFza190eXBlICAgICAgICAgICAgICAgbG9jX2V2ZW50LCAgICAgICAgICAgICAgLyogZXZlbnQgbWFzayAgICAgICAgICAgKi8KLSAgICAgIGNvbnN0IHJwY19sb2NfZXZlbnRfcGF5bG9hZF91X3R5cGUqICAgbG9jX2V2ZW50X3BheWxvYWQgICAgICAgLyogcGF5bG9hZCAgICAgICAgICAgICAgKi8KLSk7Ci0KLWV4dGVybiBycGNfbG9jX2NsaWVudF9oYW5kbGVfdHlwZSBsb2Nfb3BlbigKLSAgICAgIHJwY19sb2NfZXZlbnRfbWFza190eXBlICAgICAgIGV2ZW50X3JlZ19tYXNrLAotICAgICAgbG9jX2V2ZW50X2NiX2ZfdHlwZSAgICAgICAqZXZlbnRfY2FsbGJhY2sKLSk7Ci0KLWV4dGVybiBpbnQzMiBsb2NfY2xvc2UKLSgKLSAgICAgIHJwY19sb2NfY2xpZW50X2hhbmRsZV90eXBlIGhhbmRsZQotKTsKLQotZXh0ZXJuIGludDMyIGxvY19zdGFydF9maXgKLSgKLSAgICAgIHJwY19sb2NfY2xpZW50X2hhbmRsZV90eXBlIGhhbmRsZQotKTsKLQotZXh0ZXJuIGludDMyIGxvY19zdG9wX2ZpeAotKAotICAgICAgcnBjX2xvY19jbGllbnRfaGFuZGxlX3R5cGUgaGFuZGxlCi0pOwotCi1leHRlcm4gaW50MzIgbG9jX2lvY3RsCi0oCi0gICAgICBycGNfbG9jX2NsaWVudF9oYW5kbGVfdHlwZSAgICAgICAgICAgaGFuZGxlLAotICAgICAgcnBjX2xvY19pb2N0bF9lX3R5cGUgICAgICAgICAgICAgICAgIGlvY3RsX3R5cGUsCi0gICAgICBycGNfbG9jX2lvY3RsX2RhdGFfdV90eXBlKiAgICAgICAgICAgaW9jdGxfZGF0YQotKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmIC8qIExPQ19BUElfUlBDX0dMVUVfSCAqLwpkaWZmIC0tZ2l0IGEvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGktcnBjL3NyYy9sb2NfYXBpY2JfYXBwaW5pdC5jIGIvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGktcnBjL3NyYy9sb2NfYXBpY2JfYXBwaW5pdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZmNmZDZjLi4wMDAwMDAwCi0tLSBhL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpLXJwYy9zcmMvbG9jX2FwaWNiX2FwcGluaXQuYworKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUNvcHlyaWdodCAoYykgMjAwOSwgUVVBTENPTU0gVVNBLCBJTkMuCi0KLUFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLQottyAgICAgICAgIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0KLbcgICAgICAgICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uIAotCi23ICAgICAgICAgTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgUVVBTENPTU0gVVNBLCBJTkMuICBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAKLQotVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8gCi0jaW5jbHVkZSAicnBjL3JwYy5oIgotI2luY2x1ZGUgImxvY19hcGlfY29tbW9uLmgiCi0jaW5jbHVkZSAibG9jX2FwaS5oIgotI2luY2x1ZGUgImxvY19hcGlfY2IuaCIKLSNpbmNsdWRlICJsb2NfYXBpX2ZpeHVwLmgiCi0KLSNpbmNsdWRlICJsb2NfYXBpY2JfYXBwaW5pdC5oIgotCi0jZGVmaW5lIFJQQ19GVU5DX1ZFUlNJT05fQkFTRShhLGIpIGEgIyMgYgotI2RlZmluZSBSUENfQ0JfRlVOQ19WRVJTKGEsYikgUlBDX0ZVTkNfVkVSU0lPTl9CQVNFKGEsYikKLQotc3RhdGljIFNWQ1hQUlQqIHN2clBvcnQgPSBOVUxMOwotCi1leHRlcm4gdm9pZCBSUENfQ0JfRlVOQ19WRVJTKGxvY19hcGljYnByb2dfLExPQ19BUElDQlZFUlNfMDAwMSkoc3RydWN0IHN2Y19yZXEgKnJxc3RwLCByZWdpc3RlciBTVkNYUFJUICp0cmFuc3ApOwotCi1pbnQgbG9jX2FwaWNiX2FwcF9pbml0KHZvaWQpCi17Ci0gICAgLyogUmVnaXN0ZXIgYSBjYWxsYmFjayBzZXJ2ZXIgdG8gdXNlIHRoZSBsb2NfYXBpY2Jwcm9nXyogZnVuY3Rpb24gICovCi0gICAgaWYgKHN2clBvcnQgPT0gTlVMTCkgewotICAgICAgICBzdnJQb3J0ID0gc3ZjcnRyX2NyZWF0ZSgpOwotICAgIH0KLSAgICBpZiAoIXN2clBvcnQpIHJldHVybiAtMTsKLQotICAgIHhwcnRfcmVnaXN0ZXIoc3ZyUG9ydCk7Ci0gICAgaWYoc3ZjX3JlZ2lzdGVyKHN2clBvcnQsIExPQ19BUElDQlBST0csIExPQ19BUElDQlZFUlNfMDAwMSwgUlBDX0NCX0ZVTkNfVkVSUyhsb2NfYXBpY2Jwcm9nXyxMT0NfQVBJQ0JWRVJTXzAwMDEpLDApKQotICAgIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci19Ci0KLXZvaWQgbG9jX2FwaWNiX2FwcF9kZWluaXQodm9pZCkKLXsKLSAgICBpZiAoc3ZyUG9ydCA9PSBOVUxMKQotICAgIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICB4cHJ0X3VucmVnaXN0ZXIoc3ZyUG9ydCk7Ci0gICAgc3ZjX2Rlc3Ryb3koc3ZyUG9ydCk7Ci0gICAgLy9zdmNfdW5yZWdpc3RlcihzdnJQb3J0LCBMT0NfQVBJQ0JQUk9HLCBMT0NfQVBJQ0JWRVJTXzAwMDEpOwotICAgIHN2clBvcnQgPSBOVUxMOwotfQpkaWZmIC0tZ2l0IGEvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGlfNTAwMDEvQW5kcm9pZC5tayBiL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpXzUwMDAxL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzOGJlZmEuLjAwMDAwMDAKLS0tIGEvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGlfNTAwMDEvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi1pZm5lcSAoJChCVUlMRF9USU5ZX0FORFJPSUQpLHRydWUpCi0jQ29tcGlsZSB0aGlzIGxpYnJhcnkgb25seSBmb3IgYnVpbGRzIHdpdGggdGhlIGxhdGVzdCBtb2RlbSBpbWFnZQotCi1MT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEUgOj0gbGlibG9jX2VuZwotTE9DQUxfTU9EVUxFX09XTkVSIDo9IHFjb20KLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0gICAgbGlidXRpbHMgXAotICAgIGxpYmN1dGlscyBcCi0gICAgbGliZGwgXAotICAgIGxpYmxvZyBcCi0gICAgbGlibG9jX2NvcmUgXAotICAgIGxpYmdwcy51dGlscwotCi1MT0NBTF9TUkNfRklMRVMgKz0gXAotICAgIGxvY19lbmcuY3BwIFwKLSAgICBsb2NfZW5nX2FncHMuY3BwIFwKLSAgICBsb2NfZW5nX3h0cmEuY3BwIFwKLSAgICBsb2NfZW5nX25pLmNwcCBcCi0gICAgbG9jX2VuZ19sb2cuY3BwIFwKLSAgICBsb2NfZW5nX25tZWEuY3BwIFwKLSAgICBMb2NFbmdBZGFwdGVyLmNwcAotCi1MT0NBTF9TUkNfRklMRVMgKz0gXAotICAgIGxvY19lbmdfZG1uX2Nvbm4uY3BwIFwKLSAgICBsb2NfZW5nX2Rtbl9jb25uX2hhbmRsZXIuY3BwIFwKLSAgICBsb2NfZW5nX2Rtbl9jb25uX3RocmVhZF9oZWxwZXIuYyBcCi0gICAgbG9jX2VuZ19kbW5fY29ubl9nbHVlX21zZy5jIFwKLSAgICBsb2NfZW5nX2Rtbl9jb25uX2dsdWVfcGlwZS5jCi0KLUxPQ0FMX0NGTEFHUyArPSBcCi0gICAgIC1mbm8tc2hvcnQtZW51bXMgXAotICAgICAtRF9BTkRST0lEXyBcCi0gICAgIC1Xbm8tdW51c2VkLXBhcmFtZXRlcgotCi1MT0NBTF9DX0lOQ0xVREVTOj0gXAotICAgICQoVEFSR0VUX09VVF9IRUFERVJTKS9ncHMudXRpbHMgXAotICAgICQoVEFSR0VUX09VVF9IRUFERVJTKS9saWJsb2NfY29yZQotCi1MT0NBTF9DT1BZX0hFQURFUlNfVE86PSBsaWJsb2NfZW5nLwotTE9DQUxfQ09QWV9IRUFERVJTOj0gXAotICAgTG9jRW5nQWRhcHRlci5oIFwKLSAgIGxvYy5oIFwKLSAgIGxvY19lbmcuaCBcCi0gICBsb2NfZW5nX3h0cmEuaCBcCi0gICBsb2NfZW5nX25pLmggXAotICAgbG9jX2VuZ19hZ3BzLmggXAotICAgbG9jX2VuZ19tc2cuaCBcCi0gICBsb2NfZW5nX2xvZy5oCi0KLUxPQ0FMX1BSRUxJTktfTU9EVUxFIDo9IGZhbHNlCi0KLWluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX01PRFVMRSA6PSBncHMuJChCT0FSRF9WRU5ET1JfUUNPTV9HUFNfTE9DX0FQSV9IQVJEV0FSRSkKLUxPQ0FMX01PRFVMRV9PV05FUiA6PSBxY29tCi0KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCi0KLSMjIExpYnMKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0gICAgbGlidXRpbHMgXAotICAgIGxpYmN1dGlscyBcCi0gICAgbGlibG9nIFwKLSAgICBsaWJsb2NfZW5nIFwKLSAgICBsaWJsb2NfY29yZSBcCi0gICAgbGliZ3BzLnV0aWxzIFwKLSAgICBsaWJkbAotCi1MT0NBTF9TUkNfRklMRVMgKz0gXAotICAgIGxvYy5jcHAgXAotICAgIGdwcy5jCi0KLUxPQ0FMX0NGTEFHUyArPSBcCi0gICAgLWZuby1zaG9ydC1lbnVtcyBcCi0gICAgLURfQU5EUk9JRF8KLQotaWZlcSAoJChUQVJHRVRfVVNFU19RQ09NX0JTUCksIHRydWUpCi1MT0NBTF9DRkxBR1MgKz0gLURUQVJHRVRfVVNFU19RQ09NX0JTUAotZW5kaWYKLQotIyMgSW5jbHVkZXMKLUxPQ0FMX0NfSU5DTFVERVM6PSBcCi0gICAgJChUQVJHRVRfT1VUX0hFQURFUlMpL2dwcy51dGlscyBcCi0gICAgJChUQVJHRVRfT1VUX0hFQURFUlMpL2xpYmxvY19jb3JlCi0KLWlmbmVxICgkKGZpbHRlciBtc204MDg0LCQoVEFSR0VUX0JPQVJEX1BMQVRGT1JNKSksKQotICBMT0NBTF9DRkxBR1MgKz0gLURQTEFURk9STV9NU004MDg0Ci1lbmRpZgotCi1MT0NBTF9QUkVMSU5LX01PRFVMRSA6PSBmYWxzZQotTE9DQUxfTU9EVUxFX1JFTEFUSVZFX1BBVEggOj0gaHcKLQotaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQotCi1lbmRpZiAjIG5vdCBCVUlMRF9USU5ZX0FORFJPSUQKZGlmZiAtLWdpdCBhL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpXzUwMDAxL0xvY0VuZ0FkYXB0ZXIuY3BwIGIvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGlfNTAwMDEvTG9jRW5nQWRhcHRlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2YTE1MGQuLjAwMDAwMDAKLS0tIGEvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGlfNTAwMDEvTG9jRW5nQWRhcHRlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzODAgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDExLTIwMTQsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCi0gKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKLSAqICAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24sIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCi0gKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKLSAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCi0gKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCi0gKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLSNkZWZpbmUgTE9HX05EREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJMb2NTdmNfRW5nQWRhcHRlciIKLQotI2luY2x1ZGUgPExvY0VuZ0FkYXB0ZXIuaD4KLSNpbmNsdWRlICJsb2NfZW5nX21zZy5oIgotI2luY2x1ZGUgImxvY19sb2cuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGxvY19jb3JlOwotCi1Mb2NJbnRlcm5hbEFkYXB0ZXI6OkxvY0ludGVybmFsQWRhcHRlcihMb2NFbmdBZGFwdGVyKiBhZGFwdGVyKSA6Ci0gICAgTG9jQWRhcHRlckJhc2UoYWRhcHRlci0+Z2V0TXNnVGFzaygpKSwKLSAgICBtTG9jRW5nQWRhcHRlcihhZGFwdGVyKQotewotfQotdm9pZCBMb2NJbnRlcm5hbEFkYXB0ZXI6OnNldFBvc2l0aW9uTW9kZUludChMb2NQb3NNb2RlJiBwb3NNb2RlKSB7Ci0gICAgc2VuZE1zZyhuZXcgTG9jRW5nUG9zaXRpb25Nb2RlKG1Mb2NFbmdBZGFwdGVyLCBwb3NNb2RlKSk7Ci19Ci12b2lkIExvY0ludGVybmFsQWRhcHRlcjo6c3RhcnRGaXhJbnQoKSB7Ci0gICAgc2VuZE1zZyhuZXcgTG9jRW5nU3RhcnRGaXgobUxvY0VuZ0FkYXB0ZXIpKTsKLX0KLXZvaWQgTG9jSW50ZXJuYWxBZGFwdGVyOjpzdG9wRml4SW50KCkgewotICAgIHNlbmRNc2cobmV3IExvY0VuZ1N0b3BGaXgobUxvY0VuZ0FkYXB0ZXIpKTsKLX0KLXZvaWQgTG9jSW50ZXJuYWxBZGFwdGVyOjpnZXRacHBJbnQoKSB7Ci0gICAgc2VuZE1zZyhuZXcgTG9jRW5nR2V0WnBwKG1Mb2NFbmdBZGFwdGVyKSk7Ci19Ci0KLXZvaWQgTG9jSW50ZXJuYWxBZGFwdGVyOjpzaHV0ZG93bigpIHsKLSAgICBzZW5kTXNnKG5ldyBMb2NFbmdTaHV0ZG93bihtTG9jRW5nQWRhcHRlcikpOwotfQotCi1Mb2NFbmdBZGFwdGVyOjpMb2NFbmdBZGFwdGVyKExPQ19BUElfQURBUFRFUl9FVkVOVF9NQVNLX1QgbWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogb3duZXIsIENvbnRleHRCYXNlKiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNc2dUYXNrOjp0Q3JlYXRlIHRDcmVhdG9yKSA6Ci0gICAgTG9jQWRhcHRlckJhc2UobWFzaywKLSAgICAgICAgICAgICAgICAgICAvL0dldCB0aGUgQUZXIGNvbnRleHQgaWYgVnpXIGNvbnRleHQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gaW50aWFsaXplZCBpbgotICAgICAgICAgICAgICAgICAgIC8vbG9jX2V4dAotICAgICAgICAgICAgICAgICAgIGNvbnRleHQgPT0gTlVMTD8KLSAgICAgICAgICAgICAgICAgICBMb2NEdWFsQ29udGV4dDo6Z2V0TG9jRmdDb250ZXh0KHRDcmVhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jRHVhbENvbnRleHQ6Om1Mb2NhdGlvbkhhbE5hbWUpCi0gICAgICAgICAgICAgICAgICAgOmNvbnRleHQpLAotICAgIG1Pd25lcihvd25lciksIG1JbnRlcm5hbEFkYXB0ZXIobmV3IExvY0ludGVybmFsQWRhcHRlcih0aGlzKSksCi0gICAgbVVscChuZXcgVWxwUHJveHlCYXNlKCkpLCBtTmF2aWdhdGluZyhmYWxzZSksCi0gICAgbVN1cHBvcnRzQWdwc1JlcXVlc3RzKGZhbHNlKSwKLSAgICBtU3VwcG9ydHNQb3NpdGlvbkluamVjdGlvbihmYWxzZSksIG1Qb3dlclZvdGUoMCkKLXsKLSAgICBtZW1zZXQoJm1GaXhDcml0ZXJpYSwgMCwgc2l6ZW9mKG1GaXhDcml0ZXJpYSkpOwotICAgIG1GaXhDcml0ZXJpYS5tb2RlID0gTE9DX1BPU0lUSU9OX01PREVfSU5WQUxJRDsKLSAgICBMT0NfTE9HRCgiTG9jRW5nQWRhcHRlciBjcmVhdGVkIik7Ci19Ci0KLWlubGluZQotTG9jRW5nQWRhcHRlcjo6fkxvY0VuZ0FkYXB0ZXIoKQotewotICAgIGRlbGV0ZSBtSW50ZXJuYWxBZGFwdGVyOwotICAgIExPQ19MT0dWKCJMb2NFbmdBZGFwdGVyIGRlbGV0ZWQiKTsKLX0KLQotdm9pZCBMb2NJbnRlcm5hbEFkYXB0ZXI6OnNldFVscFByb3h5KFVscFByb3h5QmFzZSogdWxwKSB7Ci0gICAgc3RydWN0IExvY1NldFVscFByb3h5IDogcHVibGljIExvY01zZyB7Ci0gICAgICAgIExvY0FkYXB0ZXJCYXNlKiBtQWRhcHRlcjsKLSAgICAgICAgVWxwUHJveHlCYXNlKiBtVWxwOwotICAgICAgICBpbmxpbmUgTG9jU2V0VWxwUHJveHkoTG9jQWRhcHRlckJhc2UqIGFkYXB0ZXIsIFVscFByb3h5QmFzZSogdWxwKSA6Ci0gICAgICAgICAgICBMb2NNc2coKSwgbUFkYXB0ZXIoYWRhcHRlciksIG1VbHAodWxwKSB7Ci0gICAgICAgIH0KLSAgICAgICAgdmlydHVhbCB2b2lkIHByb2MoKSBjb25zdCB7Ci0gICAgICAgICAgICBMT0NfTE9HVigiJXNdIHVscCAlcCBhZGFwdGVyICVwIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICBtVWxwLCBtQWRhcHRlcik7Ci0gICAgICAgICAgICBtQWRhcHRlci0+c2V0VWxwUHJveHkobVVscCk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgc2VuZE1zZyhuZXcgTG9jU2V0VWxwUHJveHkobUxvY0VuZ0FkYXB0ZXIsIHVscCkpOwotfQotCi12b2lkIExvY0VuZ0FkYXB0ZXI6OnNldFVscFByb3h5KFVscFByb3h5QmFzZSogdWxwKQotewotICAgIGlmICh1bHAgPT0gbVVscCkgewotICAgICAgICAvL1RoaXMgdGFrZXMgY2FyZSBvZiB0aGUgY2FzZSB3aGVuIGRvdWJsZSBpbml0YWxpemF0aW9uIGhhcHBlbnMKLSAgICAgICAgLy9hbmQgd2UgZ2V0IHRoZSBzYW1lIG9iamVjdCBiYWNrIGZvciBVbHBQcm94eUJhc2UgLiBEbyBub3RoaW5nCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBMT0NfTE9HVigiJXNdICVwIiwgX19mdW5jX18sIHVscCk7Ci0gICAgaWYgKE5VTEwgPT0gdWxwKSB7Ci0gICAgICAgIExPQ19MT0dFKCIlczolZF06IHVscCBwb2ludGVyIGlzIE5VTEwiLCBfX2Z1bmNfXywgX19MSU5FX18pOwotICAgICAgICB1bHAgPSBuZXcgVWxwUHJveHlCYXNlKCk7Ci0gICAgfQotCi0gICAgaWYgKExPQ19QT1NJVElPTl9NT0RFX0lOVkFMSUQgIT0gbVVscC0+bVBvc01vZGUubW9kZSkgewotICAgICAgICAvLyBuZWVkIHRvIHNlbmQgdGhpcyBtb2RlIGFuZCBzdGFydCBtc2cgdG8gVUxQCi0gICAgICAgIHVscC0+c2VuZEZpeE1vZGUobVVscC0+bVBvc01vZGUpOwotICAgIH0KLQotICAgIGlmKG1VbHAtPm1GaXhTZXQpIHsKLSAgICAgICAgdWxwLT5zZW5kU3RhcnRGaXgoKTsKLSAgICB9Ci0KLSAgICBkZWxldGUgbVVscDsKLSAgICBtVWxwID0gdWxwOwotfQotCi1pbnQgTG9jRW5nQWRhcHRlcjo6c2V0R3BzTG9ja01zZyhMT0NfR1BTX0xPQ0tfTUFTSyBsb2NrTWFzaykKLXsKLSAgICBzdHJ1Y3QgTG9jRW5nQWRhcHRlckdwc0xvY2sgOiBwdWJsaWMgTG9jTXNnIHsKLSAgICAgICAgTG9jRW5nQWRhcHRlciogbUFkYXB0ZXI7Ci0gICAgICAgIExPQ19HUFNfTE9DS19NQVNLIG1Mb2NrTWFzazsKLSAgICAgICAgaW5saW5lIExvY0VuZ0FkYXB0ZXJHcHNMb2NrKExvY0VuZ0FkYXB0ZXIqIGFkYXB0ZXIsIExPQ19HUFNfTE9DS19NQVNLIGxvY2tNYXNrKSA6Ci0gICAgICAgICAgICBMb2NNc2coKSwgbUFkYXB0ZXIoYWRhcHRlciksIG1Mb2NrTWFzayhsb2NrTWFzaykKLSAgICAgICAgewotICAgICAgICAgICAgbG9jYWxsb2coKTsKLSAgICAgICAgfQotICAgICAgICBpbmxpbmUgdmlydHVhbCB2b2lkIHByb2MoKSBjb25zdCB7Ci0gICAgICAgICAgICBtQWRhcHRlci0+c2V0R3BzTG9jayhtTG9ja01hc2spOwotICAgICAgICB9Ci0gICAgICAgIGlubGluZSAgdm9pZCBsb2NhbGxvZygpIGNvbnN0IHsKLSAgICAgICAgICAgIExPQ19MT0dWKCJMb2NFbmdBZGFwdGVyR3BzTG9jayAtIG1Mb2NrTWFzazogJXgiLCBtTG9ja01hc2spOwotICAgICAgICB9Ci0gICAgICAgIGlubGluZSB2aXJ0dWFsIHZvaWQgbG9nKCkgY29uc3QgewotICAgICAgICAgICAgbG9jYWxsb2coKTsKLSAgICAgICAgfQotICAgIH07Ci0gICAgc2VuZE1zZyhuZXcgTG9jRW5nQWRhcHRlckdwc0xvY2sodGhpcywgbG9ja01hc2spKTsKLSAgICByZXR1cm4gMDsKLX0KLQotdm9pZCBMb2NFbmdBZGFwdGVyOjpyZXF1ZXN0UG93ZXJWb3RlKCkKLXsKLSAgICBpZiAoZ2V0UG93ZXJWb3RlUmlnaHQoKSkgewotICAgICAgICAvKiBQb3dlciB2b3Rpbmcgd2l0aG91dCBlbmdpbmUgbG9jazoKLSAgICAgICAgICogMTAxOiB2b3RlIGRvd24sIDEwMi0xMDQgLSB2b3RlIHVwCi0gICAgICAgICAqIFRoZXNlIGNvZGVzIGFyZSB1c2VkIG5vdCB0byBjb25mdXNlIHdpdGggYWN0dWFsIGVuZ2luZSBsb2NrCi0gICAgICAgICAqIGZ1bmN0aW9uYWxpdHksIHRoYXQgY2FuJ3QgYmUgdXNlZCBpbiBTU1Igc2NlbmFyaW8sIGFzIGl0Ci0gICAgICAgICAqIGNvbmZsaWN0cyB3aXRoIGluaXRpYWxpemF0aW9uIHNlcXVlbmNlLgotICAgICAgICAgKi8KLSAgICAgICAgYm9vbCBwb3dlclVwID0gZ2V0UG93ZXJWb3RlKCk7Ci0gICAgICAgIExPQ19MT0dWKCJMb2NFbmdBZGFwdGVyVm90ZVBvd2VyIC0gVm90ZSBQb3dlcjogJWQiLCAoaW50KXBvd2VyVXApOwotICAgICAgICBzZXRHcHNMb2NrKHBvd2VyVXAgPyAxMDMgOiAxMDEpOwotICAgIH0KLX0KLQotdm9pZCBMb2NJbnRlcm5hbEFkYXB0ZXI6OnJlcG9ydFBvc2l0aW9uKFVscExvY2F0aW9uICZsb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcHNMb2NhdGlvbkV4dGVuZGVkICZsb2NhdGlvbkV4dGVuZGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGxvY2F0aW9uRXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gbG9jX3Nlc3Nfc3RhdHVzIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NQb3NUZWNoTWFzayBsb2NfdGVjaG5vbG9neV9tYXNrKQotewotICAgIHNlbmRNc2cobmV3IExvY0VuZ1JlcG9ydFBvc2l0aW9uKG1Mb2NFbmdBZGFwdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uRXh0ZW5kZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb25FeHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY190ZWNobm9sb2d5X21hc2spKTsKLX0KLQotCi12b2lkIExvY0VuZ0FkYXB0ZXI6OnJlcG9ydFBvc2l0aW9uKFVscExvY2F0aW9uICZsb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3BzTG9jYXRpb25FeHRlbmRlZCAmbG9jYXRpb25FeHRlbmRlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogbG9jYXRpb25FeHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gbG9jX3Nlc3Nfc3RhdHVzIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jUG9zVGVjaE1hc2sgbG9jX3RlY2hub2xvZ3lfbWFzaykKLXsKLSAgICBpZiAoISBtVWxwLT5yZXBvcnRQb3NpdGlvbihsb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbkV4dGVuZGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uRXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NfdGVjaG5vbG9neV9tYXNrICkpIHsKLSAgICAgICAgbUludGVybmFsQWRhcHRlci0+cmVwb3J0UG9zaXRpb24obG9jYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uRXh0ZW5kZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uRXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY190ZWNobm9sb2d5X21hc2spOwotICAgIH0KLX0KLQotdm9pZCBMb2NJbnRlcm5hbEFkYXB0ZXI6OnJlcG9ydFN2KEdwc1N2U3RhdHVzICZzdlN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcHNMb2NhdGlvbkV4dGVuZGVkICZsb2NhdGlvbkV4dGVuZGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHN2RXh0KXsKLSAgICBzZW5kTXNnKG5ldyBMb2NFbmdSZXBvcnRTdihtTG9jRW5nQWRhcHRlciwgc3ZTdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb25FeHRlbmRlZCwgc3ZFeHQpKTsKLX0KLQotdm9pZCBMb2NFbmdBZGFwdGVyOjpyZXBvcnRTdihHcHNTdlN0YXR1cyAmc3ZTdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdwc0xvY2F0aW9uRXh0ZW5kZWQgJmxvY2F0aW9uRXh0ZW5kZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHN2RXh0KQotewotCi0gICAgLy8gV2Ugd2FudCB0byBzZW5kIFNWIGluZm8gdG8gVUxQIHRvIGhlbHAgaXQgaW4gZGV0ZXJtaW5pbmcgR05TUwotICAgIC8vIHNpZ25hbCBzdHJlbmd0aCBVTFAgd2lsbCBmb3J3YXJkIHRoZSBTViByZXBvcnRzIHRvIEhBTCB3aXRob3V0Ci0gICAgLy8gYW55IG1vZGlmaWNhdGlvbnMKLSAgICBpZiAoISBtVWxwLT5yZXBvcnRTdihzdlN0YXR1cywgbG9jYXRpb25FeHRlbmRlZCwgc3ZFeHQpKSB7Ci0gICAgICAgIG1JbnRlcm5hbEFkYXB0ZXItPnJlcG9ydFN2KHN2U3RhdHVzLCBsb2NhdGlvbkV4dGVuZGVkLCBzdkV4dCk7Ci0gICAgfQotfQotCi12b2lkIExvY0VuZ0FkYXB0ZXI6OnNldEluU2Vzc2lvbihib29sIGluU2Vzc2lvbikKLXsKLSAgICBtTmF2aWdhdGluZyA9IGluU2Vzc2lvbjsKLSAgICBtTG9jQXBpLT5zZXRJblNlc3Npb24oaW5TZXNzaW9uKTsKLSAgICBpZiAoIW1OYXZpZ2F0aW5nKSB7Ci0gICAgICAgIG1GaXhDcml0ZXJpYS5tb2RlID0gTE9DX1BPU0lUSU9OX01PREVfSU5WQUxJRDsKLSAgICB9Ci19Ci0KLXZvaWQgTG9jSW50ZXJuYWxBZGFwdGVyOjpyZXBvcnRTdGF0dXMoR3BzU3RhdHVzVmFsdWUgc3RhdHVzKQotewotICAgIHNlbmRNc2cobmV3IExvY0VuZ1JlcG9ydFN0YXR1cyhtTG9jRW5nQWRhcHRlciwgc3RhdHVzKSk7Ci19Ci0KLXZvaWQgTG9jRW5nQWRhcHRlcjo6cmVwb3J0U3RhdHVzKEdwc1N0YXR1c1ZhbHVlIHN0YXR1cykKLXsKLSAgICBpZiAoIW1VbHAtPnJlcG9ydFN0YXR1cyhzdGF0dXMpKSB7Ci0gICAgICAgIG1JbnRlcm5hbEFkYXB0ZXItPnJlcG9ydFN0YXR1cyhzdGF0dXMpOwotICAgIH0KLX0KLQotaW5saW5lCi12b2lkIExvY0VuZ0FkYXB0ZXI6OnJlcG9ydE5tZWEoY29uc3QgY2hhciogbm1lYSwgaW50IGxlbmd0aCkKLXsKLSAgICBzZW5kTXNnKG5ldyBMb2NFbmdSZXBvcnRObWVhKG1Pd25lciwgbm1lYSwgbGVuZ3RoKSk7Ci19Ci0KLWlubGluZQotYm9vbCBMb2NFbmdBZGFwdGVyOjpyZXBvcnRYdHJhU2VydmVyKGNvbnN0IGNoYXIqIHVybDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdXJsMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB1cmwzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBtYXhsZW5ndGgpCi17Ci0gICAgaWYgKG1TdXBwb3J0c0FncHNSZXF1ZXN0cykgewotICAgICAgICBzZW5kTXNnKG5ldyBMb2NFbmdSZXBvcnRYdHJhU2VydmVyKG1Pd25lciwgdXJsMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmwyLCB1cmwzLCBtYXhsZW5ndGgpKTsKLSAgICB9Ci0gICAgcmV0dXJuIG1TdXBwb3J0c0FncHNSZXF1ZXN0czsKLX0KLQotaW5saW5lCi1ib29sIExvY0VuZ0FkYXB0ZXI6OnJlcXVlc3RBVEwoaW50IGNvbm5IYW5kbGUsIEFHcHNUeXBlIGFncHNfdHlwZSkKLXsKLSAgICBpZiAobVN1cHBvcnRzQWdwc1JlcXVlc3RzKSB7Ci0gICAgICAgIHNlbmRNc2cobmV3IExvY0VuZ1JlcXVlc3RBVEwobU93bmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5IYW5kbGUsIGFncHNfdHlwZSkpOwotICAgIH0KLSAgICByZXR1cm4gbVN1cHBvcnRzQWdwc1JlcXVlc3RzOwotfQotCi1pbmxpbmUKLWJvb2wgTG9jRW5nQWRhcHRlcjo6cmVsZWFzZUFUTChpbnQgY29ubkhhbmRsZSkKLXsKLSAgICBpZiAobVN1cHBvcnRzQWdwc1JlcXVlc3RzKSB7Ci0gICAgICAgIHNlbmRNc2cobmV3IExvY0VuZ1JlbGVhc2VBVEwobU93bmVyLCBjb25uSGFuZGxlKSk7Ci0gICAgfQotICAgIHJldHVybiBtU3VwcG9ydHNBZ3BzUmVxdWVzdHM7Ci19Ci0KLWlubGluZQotYm9vbCBMb2NFbmdBZGFwdGVyOjpyZXF1ZXN0WHRyYURhdGEoKQotewotICAgIGlmIChtU3VwcG9ydHNBZ3BzUmVxdWVzdHMpIHsKLSAgICAgICAgc2VuZE1zZyhuZXcgTG9jRW5nUmVxdWVzdFh0cmEobU93bmVyKSk7Ci0gICAgfQotICAgIHJldHVybiBtU3VwcG9ydHNBZ3BzUmVxdWVzdHM7Ci19Ci0KLWlubGluZQotYm9vbCBMb2NFbmdBZGFwdGVyOjpyZXF1ZXN0VGltZSgpCi17Ci0gICAgaWYgKG1TdXBwb3J0c0FncHNSZXF1ZXN0cykgewotICAgICAgICBzZW5kTXNnKG5ldyBMb2NFbmdSZXF1ZXN0VGltZShtT3duZXIpKTsKLSAgICB9Ci0gICAgcmV0dXJuIG1TdXBwb3J0c0FncHNSZXF1ZXN0czsKLX0KLQotaW5saW5lCi1ib29sIExvY0VuZ0FkYXB0ZXI6OnJlcXVlc3ROaU5vdGlmeShHcHNOaU5vdGlmaWNhdGlvbiAmbm90aWYsIGNvbnN0IHZvaWQqIGRhdGEpCi17Ci0gICAgaWYgKG1TdXBwb3J0c0FncHNSZXF1ZXN0cykgewotICAgICAgICBub3RpZi5zaXplID0gc2l6ZW9mKG5vdGlmKTsKLSAgICAgICAgbm90aWYudGltZW91dCA9IExPQ19OSV9OT19SRVNQT05TRV9USU1FOwotCi0gICAgICAgIHNlbmRNc2cobmV3IExvY0VuZ1JlcXVlc3ROaShtT3duZXIsIG5vdGlmLCBkYXRhKSk7Ci0gICAgfQotICAgIHJldHVybiBtU3VwcG9ydHNBZ3BzUmVxdWVzdHM7Ci19Ci0KLWlubGluZQotYm9vbCBMb2NFbmdBZGFwdGVyOjpyZXF1ZXN0U3VwbEVTKGludCBjb25uSGFuZGxlKQotewotICAgIGlmIChtU3VwcG9ydHNBZ3BzUmVxdWVzdHMpCi0gICAgICAgIHNlbmRNc2cobmV3IExvY0VuZ1JlcXVlc3RTdXBsRXMobU93bmVyLCBjb25uSGFuZGxlKSk7Ci0gICAgcmV0dXJuIG1TdXBwb3J0c0FncHNSZXF1ZXN0czsKLX0KLQotaW5saW5lCi1ib29sIExvY0VuZ0FkYXB0ZXI6OnJlcG9ydERhdGFDYWxsT3BlbmVkKCkKLXsKLSAgICBpZihtU3VwcG9ydHNBZ3BzUmVxdWVzdHMpCi0gICAgICAgIHNlbmRNc2cobmV3IExvY0VuZ1N1cGxFc09wZW5lZChtT3duZXIpKTsKLSAgICByZXR1cm4gbVN1cHBvcnRzQWdwc1JlcXVlc3RzOwotfQotCi1pbmxpbmUKLWJvb2wgTG9jRW5nQWRhcHRlcjo6cmVwb3J0RGF0YUNhbGxDbG9zZWQoKQotewotICAgIGlmKG1TdXBwb3J0c0FncHNSZXF1ZXN0cykKLSAgICAgICAgc2VuZE1zZyhuZXcgTG9jRW5nU3VwbEVzQ2xvc2VkKG1Pd25lcikpOwotICAgIHJldHVybiBtU3VwcG9ydHNBZ3BzUmVxdWVzdHM7Ci19Ci0KLWlubGluZQotdm9pZCBMb2NFbmdBZGFwdGVyOjpoYW5kbGVFbmdpbmVEb3duRXZlbnQoKQotewotICAgIHNlbmRNc2cobmV3IExvY0VuZ0Rvd24obU93bmVyKSk7Ci19Ci0KLWlubGluZQotdm9pZCBMb2NFbmdBZGFwdGVyOjpoYW5kbGVFbmdpbmVVcEV2ZW50KCkKLXsKLSAgICBzZW5kTXNnKG5ldyBMb2NFbmdVcChtT3duZXIpKTsKLX0KLQotdm9pZCBMb2NFbmdBZGFwdGVyOjpyZXBvcnRHcHNNZWFzdXJlbWVudERhdGEoR3BzRGF0YSAmZ3BzTWVhc3VyZW1lbnREYXRhKQotewotICAgIHNlbmRNc2cobmV3IExvY0VuZ1JlcG9ydEdwc01lYXN1cmVtZW50KG1Pd25lciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncHNNZWFzdXJlbWVudERhdGEpKTsKLX0KLQotLyoKLSAgVXBkYXRlIFJlZ2lzdHJhdGlvbiBNYXNrCi0gKi8KLXZvaWQgTG9jRW5nQWRhcHRlcjo6dXBkYXRlUmVnaXN0cmF0aW9uTWFzayhMT0NfQVBJX0FEQVBURVJfRVZFTlRfTUFTS19UIGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY19yZWdpc3RyYXRpb25fbWFza19zdGF0dXMgaXNFbmFibGVkKQotewotICAgIExPQ19MT0dEKCJlbnRlcmluZyAlcyIsIF9fZnVuY19fKTsKLSAgICBpbnQgcmVzdWx0ID0gTE9DX0FQSV9BREFQVEVSX0VSUl9GQUlMVVJFOwotICAgIHJlc3VsdCA9IG1Mb2NBcGktPnVwZGF0ZVJlZ2lzdHJhdGlvbk1hc2soZXZlbnQsIGlzRW5hYmxlZCk7Ci0gICAgaWYgKHJlc3VsdCA9PSBMT0NfQVBJX0FEQVBURVJfRVJSX1NVQ0NFU1MpIHsKLSAgICAgICAgTE9DX0xPR0QoIiVzXSB1cGRhdGUgcmVnaXN0cmF0aW9uIG1hc2sgc3VjY2VlZC4iLCBfX2Z1bmNfXyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgTE9DX0xPR0UoIiVzXSB1cGRhdGUgcmVnaXN0cmF0aW9uIG1hc2sgZmFpbGVkLiIsIF9fZnVuY19fKTsKLSAgICB9Ci19Ci0KLS8qCi0gIFNldCBHbnNzIENvbnN0ZWxsYXRpb24gQ29uZmlnCi0gKi8KLWJvb2wgTG9jRW5nQWRhcHRlcjo6Z25zc0NvbnN0ZWxsYXRpb25Db25maWcoKQotewotICAgIExPQ19MT0dEKCJlbnRlcmluZyAlcyIsIF9fZnVuY19fKTsKLSAgICBib29sIHJlc3VsdCA9IGZhbHNlOwotICAgIHJlc3VsdCA9IG1Mb2NBcGktPmduc3NDb25zdGVsbGF0aW9uQ29uZmlnKCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KZGlmZiAtLWdpdCBhL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpXzUwMDAxL0xvY0VuZ0FkYXB0ZXIuaCBiL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpXzUwMDAxL0xvY0VuZ0FkYXB0ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU1ZGYzYy4uMDAwMDAwMAotLS0gYS9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaV81MDAwMS9Mb2NFbmdBZGFwdGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNTIgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDExLTIwMTQsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCi0gKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKLSAqICAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24sIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCi0gKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKLSAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCi0gKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCi0gKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLSNpZm5kZWYgTE9DX0FQSV9FTkdfQURBUFRFUl9ICi0jZGVmaW5lIExPQ19BUElfRU5HX0FEQVBURVJfSAotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxoYXJkd2FyZS9ncHMuaD4KLSNpbmNsdWRlIDxsb2MuaD4KLSNpbmNsdWRlIDxsb2NfZW5nX2xvZy5oPgotI2luY2x1ZGUgPGxvZ191dGlsLmg+Ci0jaW5jbHVkZSA8TG9jQWRhcHRlckJhc2UuaD4KLSNpbmNsdWRlIDxMb2NEdWFsQ29udGV4dC5oPgotI2luY2x1ZGUgPFVscFByb3h5QmFzZS5oPgotI2luY2x1ZGUgPHBsYXRmb3JtX2xpYl9pbmNsdWRlcy5oPgotCi0jZGVmaW5lIE1BWF9VUkxfTEVOIDI1NgotCi11c2luZyBuYW1lc3BhY2UgbG9jX2NvcmU7Ci0KLWNsYXNzIExvY0VuZ0FkYXB0ZXI7Ci0KLWNsYXNzIExvY0ludGVybmFsQWRhcHRlciA6IHB1YmxpYyBMb2NBZGFwdGVyQmFzZSB7Ci0gICAgTG9jRW5nQWRhcHRlciogbUxvY0VuZ0FkYXB0ZXI7Ci1wdWJsaWM6Ci0gICAgTG9jSW50ZXJuYWxBZGFwdGVyKExvY0VuZ0FkYXB0ZXIqIGFkYXB0ZXIpOwotCi0gICAgdmlydHVhbCB2b2lkIHJlcG9ydFBvc2l0aW9uKFVscExvY2F0aW9uICZsb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3BzTG9jYXRpb25FeHRlbmRlZCAmbG9jYXRpb25FeHRlbmRlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogbG9jYXRpb25FeHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gbG9jX3Nlc3Nfc3RhdHVzIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jUG9zVGVjaE1hc2sgbG9jX3RlY2hub2xvZ3lfbWFzayk7Ci0gICAgdmlydHVhbCB2b2lkIHJlcG9ydFN2KEdwc1N2U3RhdHVzICZzdlN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgR3BzTG9jYXRpb25FeHRlbmRlZCAmbG9jYXRpb25FeHRlbmRlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogc3ZFeHQpOwotICAgIHZpcnR1YWwgdm9pZCByZXBvcnRTdGF0dXMoR3BzU3RhdHVzVmFsdWUgc3RhdHVzKTsKLSAgICB2aXJ0dWFsIHZvaWQgc2V0UG9zaXRpb25Nb2RlSW50KExvY1Bvc01vZGUmIHBvc01vZGUpOwotICAgIHZpcnR1YWwgdm9pZCBzdGFydEZpeEludCgpOwotICAgIHZpcnR1YWwgdm9pZCBzdG9wRml4SW50KCk7Ci0gICAgdmlydHVhbCB2b2lkIGdldFpwcEludCgpOwotICAgIHZpcnR1YWwgdm9pZCBzZXRVbHBQcm94eShVbHBQcm94eUJhc2UqIHVscCk7Ci0gICAgdmlydHVhbCB2b2lkIHNodXRkb3duKCk7Ci19OwotCi10eXBlZGVmIHZvaWQgKCpsb2NfbXNnX3NlbmRlcikodm9pZCogbG9jX2VuZ19kYXRhX3AsIHZvaWQqIG1zZ3ApOwotCi1jbGFzcyBMb2NFbmdBZGFwdGVyIDogcHVibGljIExvY0FkYXB0ZXJCYXNlIHsKLSAgICB2b2lkKiBtT3duZXI7Ci0gICAgTG9jSW50ZXJuYWxBZGFwdGVyKiBtSW50ZXJuYWxBZGFwdGVyOwotICAgIFVscFByb3h5QmFzZSogbVVscDsKLSAgICBMb2NQb3NNb2RlIG1GaXhDcml0ZXJpYTsKLSAgICBib29sIG1OYXZpZ2F0aW5nOwotICAgIC8vIG1Qb3dlclZvdGUgaXMgZW5jb2RlZCBhcwotICAgIC8vIG1Qb3dlclZvdGUgJiAweDIwIC0tIHBvd2VyVm90ZVJpZ2h0Ci0gICAgLy8gbVBvd2VyVm90ZSAmIDB4MTAgLS0gcG93ZXIgT24gLyBPZmYKLSAgICB1bnNpZ25lZCBpbnQgbVBvd2VyVm90ZTsKLSAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IFBPV0VSX1ZPVEVfUklHSFQgPSAweDIwOwotICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgUE9XRVJfVk9URV9WQUxVRSA9IDB4MTA7Ci0KLXB1YmxpYzoKLSAgICBib29sIG1TdXBwb3J0c0FncHNSZXF1ZXN0czsKLSAgICBib29sIG1TdXBwb3J0c1Bvc2l0aW9uSW5qZWN0aW9uOwotCi0gICAgTG9jRW5nQWRhcHRlcihMT0NfQVBJX0FEQVBURVJfRVZFTlRfTUFTS19UIG1hc2ssCi0gICAgICAgICAgICAgICAgICB2b2lkKiBvd25lciwgQ29udGV4dEJhc2UqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICBNc2dUYXNrOjp0Q3JlYXRlIHRDcmVhdG9yKTsKLSAgICB2aXJ0dWFsIH5Mb2NFbmdBZGFwdGVyKCk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgc2V0VWxwUHJveHkoVWxwUHJveHlCYXNlKiB1bHApOwotICAgIGlubGluZSB2b2lkIHJlcXVlc3RVbHAodW5zaWduZWQgbG9uZyBjYXBhYmlsaXRpZXMpIHsKLSAgICAgICAgbUNvbnRleHQtPnJlcXVlc3RVbHAobUludGVybmFsQWRhcHRlciwgY2FwYWJpbGl0aWVzKTsKLSAgICB9Ci0gICAgaW5saW5lIExvY0ludGVybmFsQWRhcHRlciogZ2V0SW50ZXJuYWxBZGFwdGVyKCkgeyByZXR1cm4gbUludGVybmFsQWRhcHRlcjsgfQotICAgIGlubGluZSBVbHBQcm94eUJhc2UqIGdldFVscFByb3h5KCkgeyByZXR1cm4gbVVscDsgfQotICAgIGlubGluZSB2b2lkKiBnZXRPd25lcigpIHsgcmV0dXJuIG1Pd25lcjsgfQotICAgIGlubGluZSBib29sIGhhc0FncHNFeHRlbmRlZENhcGFiaWxpdGllcygpIHsKLSAgICAgICAgcmV0dXJuIG1Db250ZXh0LT5oYXNBZ3BzRXh0ZW5kZWRDYXBhYmlsaXRpZXMoKTsKLSAgICB9Ci0gICAgaW5saW5lIGJvb2wgaGFzQ1BJRXh0ZW5kZWRDYXBhYmlsaXRpZXMoKSB7Ci0gICAgICAgIHJldHVybiBtQ29udGV4dC0+aGFzQ1BJRXh0ZW5kZWRDYXBhYmlsaXRpZXMoKTsKLSAgICB9Ci0gICAgaW5saW5lIGNvbnN0IE1zZ1Rhc2sqIGdldE1zZ1Rhc2soKSB7IHJldHVybiBtTXNnVGFzazsgfQotCi0gICAgaW5saW5lIGVudW0gbG9jX2FwaV9hZGFwdGVyX2VycgotICAgICAgICBzdGFydEZpeCgpCi0gICAgewotICAgICAgICByZXR1cm4gbUxvY0FwaS0+c3RhcnRGaXgobUZpeENyaXRlcmlhKTsKLSAgICB9Ci0gICAgaW5saW5lIGVudW0gbG9jX2FwaV9hZGFwdGVyX2VycgotICAgICAgICBzdG9wRml4KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtTG9jQXBpLT5zdG9wRml4KCk7Ci0gICAgfQotICAgIGlubGluZSBlbnVtIGxvY19hcGlfYWRhcHRlcl9lcnIKLSAgICAgICAgZGVsZXRlQWlkaW5nRGF0YShHcHNBaWRpbmdEYXRhIGYpCi0gICAgewotICAgICAgICByZXR1cm4gbUxvY0FwaS0+ZGVsZXRlQWlkaW5nRGF0YShmKTsKLSAgICB9Ci0gICAgaW5saW5lIGVudW0gbG9jX2FwaV9hZGFwdGVyX2VycgotICAgICAgICBlbmFibGVEYXRhKGludCBlbmFibGUpCi0gICAgewotICAgICAgICByZXR1cm4gbUxvY0FwaS0+ZW5hYmxlRGF0YShlbmFibGUpOwotICAgIH0KLSAgICBpbmxpbmUgZW51bSBsb2NfYXBpX2FkYXB0ZXJfZXJyCi0gICAgICAgIHNldEFQTihjaGFyKiBhcG4sIGludCBsZW4pCi0gICAgewotICAgICAgICByZXR1cm4gbUxvY0FwaS0+c2V0QVBOKGFwbiwgbGVuKTsKLSAgICB9Ci0gICAgaW5saW5lIGVudW0gbG9jX2FwaV9hZGFwdGVyX2VycgotICAgICAgICBpbmplY3RQb3NpdGlvbihkb3VibGUgbGF0aXR1ZGUsIGRvdWJsZSBsb25naXR1ZGUsIGZsb2F0IGFjY3VyYWN5KQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1Mb2NBcGktPmluamVjdFBvc2l0aW9uKGxhdGl0dWRlLCBsb25naXR1ZGUsIGFjY3VyYWN5KTsKLSAgICB9Ci0gICAgaW5saW5lIGVudW0gbG9jX2FwaV9hZGFwdGVyX2VycgotICAgICAgICBzZXRUaW1lKEdwc1V0Y1RpbWUgdGltZSwgaW50NjRfdCB0aW1lUmVmZXJlbmNlLCBpbnQgdW5jZXJ0YWludHkpCi0gICAgewotICAgICAgICByZXR1cm4gbUxvY0FwaS0+c2V0VGltZSh0aW1lLCB0aW1lUmVmZXJlbmNlLCB1bmNlcnRhaW50eSk7Ci0gICAgfQotICAgIGlubGluZSBlbnVtIGxvY19hcGlfYWRhcHRlcl9lcnIKLSAgICAgICAgc2V0WHRyYURhdGEoY2hhciogZGF0YSwgaW50IGxlbmd0aCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtTG9jQXBpLT5zZXRYdHJhRGF0YShkYXRhLCBsZW5ndGgpOwotICAgIH0KLSAgICBpbmxpbmUgZW51bSBsb2NfYXBpX2FkYXB0ZXJfZXJyCi0gICAgICAgIHJlcXVlc3RYdHJhU2VydmVyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtTG9jQXBpLT5yZXF1ZXN0WHRyYVNlcnZlcigpOwotICAgIH0KLSAgICBpbmxpbmUgZW51bSBsb2NfYXBpX2FkYXB0ZXJfZXJyCi0gICAgICAgIGF0bE9wZW5TdGF0dXMoaW50IGhhbmRsZSwgaW50IGlzX3N1Y2MsIGNoYXIqIGFwbiwgQUdwc0JlYXJlclR5cGUgYmVhcmVyLCBBR3BzVHlwZSBhZ3BzVHlwZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtTG9jQXBpLT5hdGxPcGVuU3RhdHVzKGhhbmRsZSwgaXNfc3VjYywgYXBuLCBiZWFyZXIsIGFncHNUeXBlKTsKLSAgICB9Ci0gICAgaW5saW5lIGVudW0gbG9jX2FwaV9hZGFwdGVyX2VycgotICAgICAgICBhdGxDbG9zZVN0YXR1cyhpbnQgaGFuZGxlLCBpbnQgaXNfc3VjYykKLSAgICB7Ci0gICAgICAgIHJldHVybiBtTG9jQXBpLT5hdGxDbG9zZVN0YXR1cyhoYW5kbGUsIGlzX3N1Y2MpOwotICAgIH0KLSAgICBpbmxpbmUgZW51bSBsb2NfYXBpX2FkYXB0ZXJfZXJyCi0gICAgICAgIHNldFBvc2l0aW9uTW9kZShjb25zdCBMb2NQb3NNb2RlICpwb3NNb2RlKQotICAgIHsKLSAgICAgICAgaWYgKE5VTEwgIT0gcG9zTW9kZSkgewotICAgICAgICAgICAgbUZpeENyaXRlcmlhID0gKnBvc01vZGU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1Mb2NBcGktPnNldFBvc2l0aW9uTW9kZShtRml4Q3JpdGVyaWEpOwotICAgIH0KLSAgICBpbmxpbmUgZW51bSBsb2NfYXBpX2FkYXB0ZXJfZXJyCi0gICAgICAgIHNldFNlcnZlcihjb25zdCBjaGFyKiB1cmwsIGludCBsZW4pCi0gICAgewotICAgICAgICByZXR1cm4gbUxvY0FwaS0+c2V0U2VydmVyKHVybCwgbGVuKTsKLSAgICB9Ci0gICAgaW5saW5lIGVudW0gbG9jX2FwaV9hZGFwdGVyX2VycgotICAgICAgICBzZXRTZXJ2ZXIodW5zaWduZWQgaW50IGlwLCBpbnQgcG9ydCwKLSAgICAgICAgICAgICAgICAgIExvY1NlcnZlclR5cGUgdHlwZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtTG9jQXBpLT5zZXRTZXJ2ZXIoaXAsIHBvcnQsIHR5cGUpOwotICAgIH0KLSAgICBpbmxpbmUgZW51bSBsb2NfYXBpX2FkYXB0ZXJfZXJyCi0gICAgICAgIGluZm9ybU5pUmVzcG9uc2UoR3BzVXNlclJlc3BvbnNlVHlwZSB1c2VyUmVzcG9uc2UsIGNvbnN0IHZvaWQqIHBhc3NUaHJvdWdoRGF0YSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtTG9jQXBpLT5pbmZvcm1OaVJlc3BvbnNlKHVzZXJSZXNwb25zZSwgcGFzc1Rocm91Z2hEYXRhKTsKLSAgICB9Ci0gICAgaW5saW5lIGVudW0gbG9jX2FwaV9hZGFwdGVyX2VycgotICAgICAgICBzZXRTVVBMVmVyc2lvbih1aW50MzJfdCB2ZXJzaW9uKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1Mb2NBcGktPnNldFNVUExWZXJzaW9uKHZlcnNpb24pOwotICAgIH0KLSAgICBpbmxpbmUgZW51bSBsb2NfYXBpX2FkYXB0ZXJfZXJyCi0gICAgICAgIHNldExQUENvbmZpZyh1aW50MzJfdCBwcm9maWxlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1Mb2NBcGktPnNldExQUENvbmZpZyhwcm9maWxlKTsKLSAgICB9Ci0gICAgaW5saW5lIGVudW0gbG9jX2FwaV9hZGFwdGVyX2VycgotICAgICAgICBzZXRTZW5zb3JDb250cm9sQ29uZmlnKGludCBzZW5zb3JVc2FnZSwgaW50IHNlbnNvclByb3ZpZGVyKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1Mb2NBcGktPnNldFNlbnNvckNvbnRyb2xDb25maWcoc2Vuc29yVXNhZ2UsIHNlbnNvclByb3ZpZGVyKTsKLSAgICB9Ci0gICAgaW5saW5lIGVudW0gbG9jX2FwaV9hZGFwdGVyX2VycgotICAgICAgICBzZXRTZW5zb3JQcm9wZXJ0aWVzKGJvb2wgZ3lyb0JpYXNWYXJpYW5jZVJhbmRvbVdhbGtfdmFsaWQsIGZsb2F0IGd5cm9CaWFzVmFyaWFuY2VSYW5kb21XYWxrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYWNjZWxCaWFzVmFyaWFuY2VSYW5kb21XYWxrX3ZhbGlkLCBmbG9hdCBhY2NlbEJpYXNWYXJpYW5jZVJhbmRvbVdhbGssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhbmdsZUJpYXNWYXJpYW5jZVJhbmRvbVdhbGtfdmFsaWQsIGZsb2F0IGFuZ2xlQmlhc1ZhcmlhbmNlUmFuZG9tV2FsaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJhdGVCaWFzVmFyaWFuY2VSYW5kb21XYWxrX3ZhbGlkLCBmbG9hdCByYXRlQmlhc1ZhcmlhbmNlUmFuZG9tV2FsaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHZlbG9jaXR5Qmlhc1ZhcmlhbmNlUmFuZG9tV2Fsa192YWxpZCwgZmxvYXQgdmVsb2NpdHlCaWFzVmFyaWFuY2VSYW5kb21XYWxrKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1Mb2NBcGktPnNldFNlbnNvclByb3BlcnRpZXMoZ3lyb0JpYXNWYXJpYW5jZVJhbmRvbVdhbGtfdmFsaWQsIGd5cm9CaWFzVmFyaWFuY2VSYW5kb21XYWxrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2VsQmlhc1ZhcmlhbmNlUmFuZG9tV2Fsa192YWxpZCwgYWNjZWxCaWFzVmFyaWFuY2VSYW5kb21XYWxrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZ2xlQmlhc1ZhcmlhbmNlUmFuZG9tV2Fsa192YWxpZCwgYW5nbGVCaWFzVmFyaWFuY2VSYW5kb21XYWxrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdGVCaWFzVmFyaWFuY2VSYW5kb21XYWxrX3ZhbGlkLCByYXRlQmlhc1ZhcmlhbmNlUmFuZG9tV2FsaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWxvY2l0eUJpYXNWYXJpYW5jZVJhbmRvbVdhbGtfdmFsaWQsIHZlbG9jaXR5Qmlhc1ZhcmlhbmNlUmFuZG9tV2Fsayk7Ci0gICAgfQotICAgIGlubGluZSB2aXJ0dWFsIGVudW0gbG9jX2FwaV9hZGFwdGVyX2VycgotICAgICAgICBzZXRTZW5zb3JQZXJmQ29udHJvbENvbmZpZyhpbnQgY29udHJvbE1vZGUsIGludCBhY2NlbFNhbXBsZXNQZXJCYXRjaCwgaW50IGFjY2VsQmF0Y2hlc1BlclNlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZ3lyb1NhbXBsZXNQZXJCYXRjaCwgaW50IGd5cm9CYXRjaGVzUGVyU2VjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhY2NlbFNhbXBsZXNQZXJCYXRjaEhpZ2gsIGludCBhY2NlbEJhdGNoZXNQZXJTZWNIaWdoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBneXJvU2FtcGxlc1BlckJhdGNoSGlnaCwgaW50IGd5cm9CYXRjaGVzUGVyU2VjSGlnaCwgaW50IGFsZ29yaXRobUNvbmZpZykKLSAgICB7Ci0gICAgICAgIHJldHVybiBtTG9jQXBpLT5zZXRTZW5zb3JQZXJmQ29udHJvbENvbmZpZyhjb250cm9sTW9kZSwgYWNjZWxTYW1wbGVzUGVyQmF0Y2gsIGFjY2VsQmF0Y2hlc1BlclNlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3lyb1NhbXBsZXNQZXJCYXRjaCwgZ3lyb0JhdGNoZXNQZXJTZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2VsU2FtcGxlc1BlckJhdGNoSGlnaCwgYWNjZWxCYXRjaGVzUGVyU2VjSGlnaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3lyb1NhbXBsZXNQZXJCYXRjaEhpZ2gsIGd5cm9CYXRjaGVzUGVyU2VjSGlnaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxnb3JpdGhtQ29uZmlnKTsKLSAgICB9Ci0gICAgaW5saW5lIHZpcnR1YWwgZW51bSBsb2NfYXBpX2FkYXB0ZXJfZXJyCi0gICAgICAgIHNldEV4dFBvd2VyQ29uZmlnKGludCBpc0JhdHRlcnlDaGFyZ2luZykKLSAgICB7Ci0gICAgICAgIHJldHVybiBtTG9jQXBpLT5zZXRFeHRQb3dlckNvbmZpZyhpc0JhdHRlcnlDaGFyZ2luZyk7Ci0gICAgfQotICAgIGlubGluZSB2aXJ0dWFsIGVudW0gbG9jX2FwaV9hZGFwdGVyX2VycgotICAgICAgICBzZXRBR0xPTkFTU1Byb3RvY29sKHVuc2lnbmVkIGxvbmcgYUdsb25hc3NQcm90b2NvbCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtTG9jQXBpLT5zZXRBR0xPTkFTU1Byb3RvY29sKGFHbG9uYXNzUHJvdG9jb2wpOwotICAgIH0KLSAgICBpbmxpbmUgdmlydHVhbCBpbnQgaW5pdERhdGFTZXJ2aWNlQ2xpZW50KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtTG9jQXBpLT5pbml0RGF0YVNlcnZpY2VDbGllbnQoKTsKLSAgICB9Ci0gICAgaW5saW5lIHZpcnR1YWwgaW50IG9wZW5BbmRTdGFydERhdGFDYWxsKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtTG9jQXBpLT5vcGVuQW5kU3RhcnREYXRhQ2FsbCgpOwotICAgIH0KLSAgICBpbmxpbmUgdmlydHVhbCB2b2lkIHN0b3BEYXRhQ2FsbCgpCi0gICAgewotICAgICAgICBtTG9jQXBpLT5zdG9wRGF0YUNhbGwoKTsKLSAgICB9Ci0gICAgaW5saW5lIHZpcnR1YWwgdm9pZCBjbG9zZURhdGFDYWxsKCkKLSAgICB7Ci0gICAgICAgIG1Mb2NBcGktPmNsb3NlRGF0YUNhbGwoKTsKLSAgICB9Ci0gICAgaW5saW5lIGVudW0gbG9jX2FwaV9hZGFwdGVyX2VycgotICAgICAgICBnZXRacHAoR3BzTG9jYXRpb24gJnpwcExvYywgTG9jUG9zVGVjaE1hc2sgJnRlY2hfbWFzaykKLSAgICB7Ci0gICAgICAgIHJldHVybiBtTG9jQXBpLT5nZXRCZXN0QXZhaWxhYmxlWnBwRml4KHpwcExvYywgdGVjaF9tYXNrKTsKLSAgICB9Ci0KLSAgICBpbmxpbmUgdmlydHVhbCB2b2lkIGluc3RhbGxBR3BzQ2VydChjb25zdCBEZXJFbmNvZGVkQ2VydGlmaWNhdGUqIHBEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2xvdEJpdE1hc2spCi0gICAgewotICAgICAgICBtTG9jQXBpLT5pbnN0YWxsQUdwc0NlcnQocERhdGEsIGxlbmd0aCwgc2xvdEJpdE1hc2spOwotICAgIH0KLQotICAgIHZpcnR1YWwgdm9pZCBoYW5kbGVFbmdpbmVEb3duRXZlbnQoKTsKLSAgICB2aXJ0dWFsIHZvaWQgaGFuZGxlRW5naW5lVXBFdmVudCgpOwotICAgIHZpcnR1YWwgdm9pZCByZXBvcnRQb3NpdGlvbihVbHBMb2NhdGlvbiAmbG9jYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdwc0xvY2F0aW9uRXh0ZW5kZWQgJmxvY2F0aW9uRXh0ZW5kZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGxvY2F0aW9uRXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIGxvY19zZXNzX3N0YXR1cyBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY1Bvc1RlY2hNYXNrIGxvY190ZWNobm9sb2d5X21hc2spOwotICAgIHZpcnR1YWwgdm9pZCByZXBvcnRTdihHcHNTdlN0YXR1cyAmc3ZTdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEdwc0xvY2F0aW9uRXh0ZW5kZWQgJmxvY2F0aW9uRXh0ZW5kZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHN2RXh0KTsKLSAgICB2aXJ0dWFsIHZvaWQgcmVwb3J0U3RhdHVzKEdwc1N0YXR1c1ZhbHVlIHN0YXR1cyk7Ci0gICAgdmlydHVhbCB2b2lkIHJlcG9ydE5tZWEoY29uc3QgY2hhciogbm1lYSwgaW50IGxlbmd0aCk7Ci0gICAgdmlydHVhbCBib29sIHJlcG9ydFh0cmFTZXJ2ZXIoY29uc3QgY2hhciogdXJsMSwgY29uc3QgY2hhciogdXJsMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB1cmwzLCBjb25zdCBpbnQgbWF4bGVuZ3RoKTsKLSAgICB2aXJ0dWFsIGJvb2wgcmVxdWVzdFh0cmFEYXRhKCk7Ci0gICAgdmlydHVhbCBib29sIHJlcXVlc3RUaW1lKCk7Ci0gICAgdmlydHVhbCBib29sIHJlcXVlc3RBVEwoaW50IGNvbm5IYW5kbGUsIEFHcHNUeXBlIGFncHNfdHlwZSk7Ci0gICAgdmlydHVhbCBib29sIHJlbGVhc2VBVEwoaW50IGNvbm5IYW5kbGUpOwotICAgIHZpcnR1YWwgYm9vbCByZXF1ZXN0TmlOb3RpZnkoR3BzTmlOb3RpZmljYXRpb24gJm5vdGlmeSwgY29uc3Qgdm9pZCogZGF0YSk7Ci0gICAgdmlydHVhbCBib29sIHJlcXVlc3RTdXBsRVMoaW50IGNvbm5IYW5kbGUpOwotICAgIHZpcnR1YWwgYm9vbCByZXBvcnREYXRhQ2FsbE9wZW5lZCgpOwotICAgIHZpcnR1YWwgYm9vbCByZXBvcnREYXRhQ2FsbENsb3NlZCgpOwotICAgIHZpcnR1YWwgdm9pZCByZXBvcnRHcHNNZWFzdXJlbWVudERhdGEoR3BzRGF0YSAmZ3BzTWVhc3VyZW1lbnREYXRhKTsKLQotICAgIGlubGluZSBjb25zdCBMb2NQb3NNb2RlJiBnZXRQb3NpdGlvbk1vZGUoKSBjb25zdAotICAgIHtyZXR1cm4gbUZpeENyaXRlcmlhO30KLSAgICBpbmxpbmUgdmlydHVhbCBib29sIGlzSW5TZXNzaW9uKCkKLSAgICB7IHJldHVybiBtTmF2aWdhdGluZzsgfQotICAgIHZvaWQgc2V0SW5TZXNzaW9uKGJvb2wgaW5TZXNzaW9uKTsKLQotICAgIC8vIFBlcm1pdC9wcm9oaWJpdCBwb3dlciB2b3RpbmcKLSAgICBpbmxpbmUgdm9pZCBzZXRQb3dlclZvdGVSaWdodChib29sIHBvd2VyVm90ZVJpZ2h0KSB7Ci0gICAgICAgIG1Qb3dlclZvdGUgPSBwb3dlclZvdGVSaWdodCA/IChtUG93ZXJWb3RlIHwgUE9XRVJfVk9URV9SSUdIVCkgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobVBvd2VyVm90ZSAmIH5QT1dFUl9WT1RFX1JJR0hUKTsKLSAgICB9Ci0gICAgaW5saW5lIGJvb2wgZ2V0UG93ZXJWb3RlUmlnaHQoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiAobVBvd2VyVm90ZSAmIFBPV0VSX1ZPVEVfUklHSFQpICE9IDAgOwotICAgIH0KLSAgICAvLyBTZXQgdGhlIHBvd2VyIHZvdGluZyB1cC9kb3duIGFuZCBkbyBhY3R1YWwgb3BlcmF0aW9uIGlmIHBlcm1pdHRlZAotICAgIGlubGluZSB2b2lkIHNldFBvd2VyVm90ZShib29sIHBvd2VyT24pIHsKLSAgICAgICAgbVBvd2VyVm90ZSA9IHBvd2VyT24gPyAobVBvd2VyVm90ZSB8IFBPV0VSX1ZPVEVfVkFMVUUpIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobVBvd2VyVm90ZSAmIH5QT1dFUl9WT1RFX1ZBTFVFKTsKLSAgICAgICAgcmVxdWVzdFBvd2VyVm90ZSgpOwotICAgIH0KLSAgICBpbmxpbmUgYm9vbCBnZXRQb3dlclZvdGUoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiAobVBvd2VyVm90ZSAmIFBPV0VSX1ZPVEVfVkFMVUUpICE9IDAgOwotICAgIH0KLSAgICAvLyBEbyBwb3dlciB2b3RpbmcgYWNjb3JkaW5nIHRvIGxhc3Qgc2V0dGluZ3MgaWYgcGVybWl0dGVkCi0gICAgdm9pZCByZXF1ZXN0UG93ZXJWb3RlKCk7Ci0KLSAgICAvKlZhbHVlcyBmb3IgbG9jawotICAgICAgMSA9IERvIG5vdCBsb2NrIGFueSBwb3NpdGlvbiBzZXNzaW9ucwotICAgICAgMiA9IExvY2sgTUkgcG9zaXRpb24gc2Vzc2lvbnMKLSAgICAgIDMgPSBMb2NrIE1UIHBvc2l0aW9uIHNlc3Npb25zCi0gICAgICA0ID0gTG9jayBhbGwgcG9zaXRpb24gc2Vzc2lvbnMKLSAgICAqLwotICAgIGlubGluZSBpbnQgc2V0R3BzTG9jayhMT0NfR1BTX0xPQ0tfTUFTSyBsb2NrKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1Mb2NBcGktPnNldEdwc0xvY2sobG9jayk7Ci0gICAgfQotCi0gICAgaW50IHNldEdwc0xvY2tNc2coTE9DX0dQU19MT0NLX01BU0sgbG9jayk7Ci0KLSAgICAvKgotICAgICAgUmV0dXJucwotICAgICAgQ3VycmVudCB2YWx1ZSBvZiBHUFMgbG9jayBvbiBzdWNjZXNzCi0gICAgICAtMSBvbiBmYWlsdXJlCi0gICAgICovCi0gICAgaW5saW5lIGludCBnZXRHcHNMb2NrKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtTG9jQXBpLT5nZXRHcHNMb2NrKCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgIFVwZGF0ZSBSZWdpc3RyYXRpb24gTWFzawotICAgICAqLwotICAgIHZvaWQgdXBkYXRlUmVnaXN0cmF0aW9uTWFzayhMT0NfQVBJX0FEQVBURVJfRVZFTlRfTUFTS19UIGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NfcmVnaXN0cmF0aW9uX21hc2tfc3RhdHVzIGlzRW5hYmxlZCk7Ci0KLSAgICAvKgotICAgICAgU2V0IEduc3MgQ29uc3RlbGxhdGlvbiBDb25maWcKLSAgICAgKi8KLSAgICBib29sIGduc3NDb25zdGVsbGF0aW9uQ29uZmlnKCk7Ci19OwotCi0jZW5kaWYgLy9MT0NfQVBJX0VOR19BREFQVEVSX0gKZGlmZiAtLWdpdCBhL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpXzUwMDAxL01ha2VmaWxlLmFtIGIvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGlfNTAwMDEvTWFrZWZpbGUuYW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNzQzNTcuLjAwMDAwMDAKLS0tIGEvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGlfNTAwMDEvTWFrZWZpbGUuYW0KKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi1BTV9DRkxBR1MgPSBcCi0gICAgIC1JLi4vLi4vdXRpbHMgXAotICAgICAtSS4uLy4uL3BsYXRmb3JtX2xpYl9hYnN0cmFjdGlvbnMgXAotICAgICAtZm5vLXNob3J0LWVudW1zIFwKLSAgICAgLURGRUFUVVJFX0dOU1NfQklUX0FQSQotCi1saWJsb2NfYWRhcHRlcl9zb19sYV9TT1VSQ0VTID0gbG9jX2VuZ19sb2cuY3BwIExvY0VuZ0FkYXB0ZXIuY3BwCi0KLWlmIFVTRV9HTElCCi1saWJsb2NfYWRhcHRlcl9zb19sYV9DRkxBR1MgPSAtRFVTRV9HTElCICQoQU1fQ0ZMQUdTKSBAR0xJQl9DRkxBR1NACi1saWJsb2NfYWRhcHRlcl9zb19sYV9MREZMQUdTID0gLWxzdGRjKysgLWxwdGhyZWFkIEBHTElCX0xJQlNAIC1zaGFyZWQgLXZlcnNpb24taW5mbyAxOjA6MAotbGlibG9jX2FkYXB0ZXJfc29fbGFfQ1BQRkxBR1MgPSAtRFVTRV9HTElCICQoQU1fQ0ZMQUdTKSAkKEFNX0NQUEZMQUdTKSBAR0xJQl9DRkxBR1NACi1lbHNlCi1saWJsb2NfYWRhcHRlcl9zb19sYV9DRkxBR1MgPSAkKEFNX0NGTEFHUykKLWxpYmxvY19hZGFwdGVyX3NvX2xhX0xERkxBR1MgPSAtbHB0aHJlYWQgLXNoYXJlZCAtdmVyc2lvbi1pbmZvIDE6MDowCi1saWJsb2NfYWRhcHRlcl9zb19sYV9DUFBGTEFHUyA9ICQoQU1fQ0ZMQUdTKSAkKEFNX0NQUEZMQUdTKQotZW5kaWYKLWxpYmxvY19hZGFwdGVyX3NvX2xhX0xJQkFERCA9IC1sc3RkYysrIC1sY3V0aWxzIC4uLy4uL3V0aWxzL2xpYmdwc191dGlsc19zby5sYQotCi0KLWxpYmxvY19lbmdfc29fbGFfU09VUkNFUyA9IFwKLSAgICBsb2NfZW5nLmNwcCBcCi0gICAgbG9jX2VuZ19hZ3BzLmNwcCBcCi0gICAgbG9jX2VuZ194dHJhLmNwcCBcCi0gICAgbG9jX2VuZ19uaS5jcHAgXAotICAgIGxvY19lbmdfbG9nLmNwcCBcCi0gICAgbG9jX2VuZ19kbW5fY29ubi5jcHAgXAotICAgIGxvY19lbmdfZG1uX2Nvbm5faGFuZGxlci5jcHAgXAotICAgIGxvY19lbmdfZG1uX2Nvbm5fdGhyZWFkX2hlbHBlci5jIFwKLSAgICBsb2NfZW5nX2Rtbl9jb25uX2dsdWVfbXNnLmMgXAotICAgIGxvY19lbmdfZG1uX2Nvbm5fZ2x1ZV9waXBlLmMKLQotCi1pZiBVU0VfR0xJQgotbGlibG9jX2VuZ19zb19sYV9DRkxBR1MgPSAtRFVTRV9HTElCICQoQU1fQ0ZMQUdTKSBAR0xJQl9DRkxBR1NACi1saWJsb2NfZW5nX3NvX2xhX0xERkxBR1MgPSAtbHN0ZGMrKyAtbHB0aHJlYWQgQEdMSUJfTElCU0AgLXNoYXJlZCAtdmVyc2lvbi1pbmZvIDE6MDowCi1saWJsb2NfZW5nX3NvX2xhX0NQUEZMQUdTID0gLURVU0VfR0xJQiAkKEFNX0NGTEFHUykgJChBTV9DUFBGTEFHUykgQEdMSUJfQ0ZMQUdTQAotZWxzZQotbGlibG9jX2VuZ19zb19sYV9DRkxBR1MgPSAkKEFNX0NGTEFHUykKLWxpYmxvY19lbmdfc29fbGFfTERGTEFHUyA9IC1scHRocmVhZCAtc2hhcmVkIC12ZXJzaW9uLWluZm8gMTowOjAKLWxpYmxvY19lbmdfc29fbGFfQ1BQRkxBR1MgPSAkKEFNX0NGTEFHUykgJChBTV9DUFBGTEFHUykKLWVuZGlmCi0KLWxpYmxvY19lbmdfc29fbGFfTElCQUREID0gLWxzdGRjKysgLWxjdXRpbHMgLWxkbCAuLi8uLi91dGlscy9saWJncHNfdXRpbHNfc28ubGEgbGlibG9jX2FkYXB0ZXJfc28ubGEKLQotCi1saWJncHNfZGVmYXVsdF9zb19sYV9TT1VSQ0VTID0gXAotICAgICAgbG9jLmNwcCBcCi0gICAgICBncHMuYwotCi1pZiBVU0VfR0xJQgotbGliZ3BzX2RlZmF1bHRfc29fbGFfQ0ZMQUdTID0gLURVU0VfR0xJQiAkKEFNX0NGTEFHUykgQEdMSUJfQ0ZMQUdTQAotbGliZ3BzX2RlZmF1bHRfc29fbGFfTERGTEFHUyA9IC1sc3RkYysrIC1scHRocmVhZCBAR0xJQl9MSUJTQCAtc2hhcmVkIC12ZXJzaW9uLWluZm8gMTowOjAKLWxpYmdwc19kZWZhdWx0X3NvX2xhX0NQUEZMQUdTID0gLURVU0VfR0xJQiAkKEFNX0NGTEFHUykgJChBTV9DUFBGTEFHUykgQEdMSUJfQ0ZMQUdTQAotZWxzZQotbGliZ3BzX2RlZmF1bHRfc29fbGFfQ0ZMQUdTID0gJChBTV9DRkxBR1MpCi1saWJncHNfZGVmYXVsdF9zb19sYV9MREZMQUdTID0gLWxwdGhyZWFkIC1zaGFyZWQgLXZlcnNpb24taW5mbyAxOjA6MAotbGliZ3BzX2RlZmF1bHRfc29fbGFfQ1BQRkxBR1MgPSAkKEFNX0NGTEFHUykgJChBTV9DUFBGTEFHUykKLWVuZGlmCi0KLWxpYmdwc19kZWZhdWx0X3NvX2xhX0xJQkFERCA9IC1sc3RkYysrIC1sY3V0aWxzIC4uLy4uL3V0aWxzL2xpYmdwc191dGlsc19zby5sYSAtbGRsIGxpYmxvY19lbmdfc28ubGEKLQotbGlicmFyeV9pbmNsdWRlX0hFQURFUlMgPSBcCi0gICBMb2NFbmdBZGFwdGVyLmggXAotICAgbG9jLmggXAotICAgbG9jX2VuZy5oIFwKLSAgIGxvY19lbmdfeHRyYS5oIFwKLSAgIGxvY19lbmdfbmkuaCBcCi0gICBsb2NfZW5nX2FncHMuaCBcCi0gICBsb2NfZW5nX21zZy5oIFwKLSAgIGxvY19lbmdfbG9nLmgKLQotbGlicmFyeV9pbmNsdWRlZGlyID0gJChwa2dpbmNsdWRlZGlyKS9saWJsb2NfYXBpXzUwMDAxCi0KLSNDcmVhdGUgYW5kIEluc3RhbGwgbGlicmFyaWVzCi1saWJfTFRMSUJSQVJJRVMgPSBsaWJsb2NfYWRhcHRlcl9zby5sYSBsaWJsb2NfZW5nX3NvLmxhIGxpYmdwc19kZWZhdWx0X3NvLmxhCmRpZmYgLS1naXQgYS9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaV81MDAwMS9ncHMuYyBiL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpXzUwMDAxL2dwcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjU5NmFhLi4wMDAwMDAwCi0tLSBhL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpXzUwMDAxL2dwcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDExIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCi0gKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKLSAqICAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKLSAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAotICogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKLSAqIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KLSAqIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaW5jbHVkZSA8aGFyZHdhcmUvZ3BzLmg+Ci0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotZXh0ZXJuIGNvbnN0IEdwc0ludGVyZmFjZSogZ2V0X2dwc19pbnRlcmZhY2UoKTsKLQotY29uc3QgR3BzSW50ZXJmYWNlKiBncHNfX2dldF9ncHNfaW50ZXJmYWNlKHN0cnVjdCBncHNfZGV2aWNlX3QqIGRldikKLXsKLSAgICByZXR1cm4gZ2V0X2dwc19pbnRlcmZhY2UoKTsKLX0KLQotc3RhdGljIGludCBvcGVuX2dwcyhjb25zdCBzdHJ1Y3QgaHdfbW9kdWxlX3QqIG1vZHVsZSwgY2hhciBjb25zdCogbmFtZSwKLSAgICAgICAgc3RydWN0IGh3X2RldmljZV90KiogZGV2aWNlKQotewotICAgIHN0cnVjdCBncHNfZGV2aWNlX3QgKmRldiA9IChzdHJ1Y3QgZ3BzX2RldmljZV90ICopIG1hbGxvYyhzaXplb2Yoc3RydWN0IGdwc19kZXZpY2VfdCkpOwotCi0gICAgaWYoZGV2ID09IE5VTEwpCi0gICAgICAgIHJldHVybiAtMTsKLQotICAgIG1lbXNldChkZXYsIDAsIHNpemVvZigqZGV2KSk7Ci0KLSAgICBkZXYtPmNvbW1vbi50YWcgPSBIQVJEV0FSRV9ERVZJQ0VfVEFHOwotICAgIGRldi0+Y29tbW9uLnZlcnNpb24gPSAwOwotICAgIGRldi0+Y29tbW9uLm1vZHVsZSA9IChzdHJ1Y3QgaHdfbW9kdWxlX3QqKW1vZHVsZTsKLSAgICBkZXYtPmdldF9ncHNfaW50ZXJmYWNlID0gZ3BzX19nZXRfZ3BzX2ludGVyZmFjZTsKLQotICAgICpkZXZpY2UgPSAoc3RydWN0IGh3X2RldmljZV90KilkZXY7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaHdfbW9kdWxlX21ldGhvZHNfdCBncHNfbW9kdWxlX21ldGhvZHMgPSB7Ci0gICAgLm9wZW4gPSBvcGVuX2dwcwotfTsKLQotc3RydWN0IGh3X21vZHVsZV90IEhBTF9NT0RVTEVfSU5GT19TWU0gPSB7Ci0gICAgLnRhZyA9IEhBUkRXQVJFX01PRFVMRV9UQUcsCi0gICAgLm1vZHVsZV9hcGlfdmVyc2lvbiA9IDEsCi0gICAgLmhhbF9hcGlfdmVyc2lvbiA9IDAsCi0gICAgLmlkID0gR1BTX0hBUkRXQVJFX01PRFVMRV9JRCwKLSAgICAubmFtZSA9ICJsb2NfYXBpIEdQUyBNb2R1bGUiLAotICAgIC5hdXRob3IgPSAiUXVhbGNvbW0gVVNBLCBJbmMuIiwKLSAgICAubWV0aG9kcyA9ICZncHNfbW9kdWxlX21ldGhvZHMsCi19OwpkaWZmIC0tZ2l0IGEvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGlfNTAwMDEvbG9jLmNwcCBiL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpXzUwMDAxL2xvYy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2NjMwZDUuLjAwMDAwMDAKLS0tIGEvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGlfNTAwMDEvbG9jLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDExODQgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDExLTIwMTQsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCi0gKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKLSAqICAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24sIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCi0gKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKLSAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCi0gKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCi0gKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2RlZmluZSBMT0dfTkRERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIkxvY1N2Y19hZnciCi0KLSNpbmNsdWRlIDxoYXJkd2FyZS9ncHMuaD4KLSNpbmNsdWRlIDxncHNfZXh0ZW5kZWQuaD4KLSNpbmNsdWRlIDxsb2NfZW5nLmg+Ci0jaW5jbHVkZSA8bG9jX3RhcmdldC5oPgotI2luY2x1ZGUgPGxvY19sb2cuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8ZGxmY24uaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxMb2NEdWFsQ29udGV4dC5oPgotI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+Ci0KLXVzaW5nIG5hbWVzcGFjZSBsb2NfY29yZTsKLQotLy9HbG9iYWxzIGRlZm5zCi1zdGF0aWMgZ3BzX2xvY2F0aW9uX2NhbGxiYWNrIGdwc19sb2NfY2IgPSBOVUxMOwotc3RhdGljIGdwc19zdl9zdGF0dXNfY2FsbGJhY2sgZ3BzX3N2X2NiID0gTlVMTDsKLXN0YXRpYyBhZ3BzX3N0YXR1c19jYWxsYmFjayBhZ3BzX3N0YXR1c19jYiA9IE5VTEw7Ci0KLXN0YXRpYyB2b2lkIGxvY2FsX2xvY19jYihVbHBMb2NhdGlvbiogbG9jYXRpb24sIHZvaWQqIGxvY0V4dCk7Ci1zdGF0aWMgdm9pZCBsb2NhbF9zdl9jYihHcHNTdlN0YXR1cyogc3Zfc3RhdHVzLCB2b2lkKiBzdkV4dCk7Ci1zdGF0aWMgdm9pZCBsb2NfYWdwc19zdGF0dXNfY2IoQUdwc1N0YXR1cyogc3RhdHVzKTsKLQotc3RhdGljIGNvbnN0IEdwc0dlb2ZlbmNpbmdJbnRlcmZhY2UqIGdldF9nZW9mZW5jZV9pbnRlcmZhY2Uodm9pZCk7Ci0KLS8vIEZ1bmN0aW9uIGRlY2xhcmF0aW9ucyBmb3Igc0xvY0VuZ0ludGVyZmFjZQotc3RhdGljIGludCAgbG9jX2luaXQoR3BzQ2FsbGJhY2tzKiBjYWxsYmFja3MpOwotc3RhdGljIGludCAgbG9jX3N0YXJ0KCk7Ci1zdGF0aWMgaW50ICBsb2Nfc3RvcCgpOwotc3RhdGljIHZvaWQgbG9jX2NsZWFudXAoKTsKLXN0YXRpYyBpbnQgIGxvY19pbmplY3RfdGltZShHcHNVdGNUaW1lIHRpbWUsIGludDY0X3QgdGltZVJlZmVyZW5jZSwgaW50IHVuY2VydGFpbnR5KTsKLXN0YXRpYyBpbnQgIGxvY19pbmplY3RfbG9jYXRpb24oZG91YmxlIGxhdGl0dWRlLCBkb3VibGUgbG9uZ2l0dWRlLCBmbG9hdCBhY2N1cmFjeSk7Ci1zdGF0aWMgdm9pZCBsb2NfZGVsZXRlX2FpZGluZ19kYXRhKEdwc0FpZGluZ0RhdGEgZik7Ci1zdGF0aWMgaW50ICBsb2Nfc2V0X3Bvc2l0aW9uX21vZGUoR3BzUG9zaXRpb25Nb2RlIG1vZGUsIEdwc1Bvc2l0aW9uUmVjdXJyZW5jZSByZWN1cnJlbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1pbl9pbnRlcnZhbCwgdWludDMyX3QgcHJlZmVycmVkX2FjY3VyYWN5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZWZlcnJlZF90aW1lKTsKLXN0YXRpYyBjb25zdCB2b2lkKiBsb2NfZ2V0X2V4dGVuc2lvbihjb25zdCBjaGFyKiBuYW1lKTsKLXN0YXRpYyB2b2lkIGxvY19jbG9zZV9tZG1fbm9kZSgpOwotLy8gRGVmaW5lcyB0aGUgR3BzSW50ZXJmYWNlIGluIGdwcy5oCi1zdGF0aWMgY29uc3QgR3BzSW50ZXJmYWNlIHNMb2NFbmdJbnRlcmZhY2UgPQotewotICAgc2l6ZW9mKEdwc0ludGVyZmFjZSksCi0gICBsb2NfaW5pdCwKLSAgIGxvY19zdGFydCwKLSAgIGxvY19zdG9wLAotICAgbG9jX2NsZWFudXAsCi0gICBsb2NfaW5qZWN0X3RpbWUsCi0gICBsb2NfaW5qZWN0X2xvY2F0aW9uLAotICAgbG9jX2RlbGV0ZV9haWRpbmdfZGF0YSwKLSAgIGxvY19zZXRfcG9zaXRpb25fbW9kZSwKLSAgIGxvY19nZXRfZXh0ZW5zaW9uCi19OwotCi0vLyBGdW5jdGlvbiBkZWNsYXJhdGlvbnMgZm9yIHNMb2NFbmdBR3BzSW50ZXJmYWNlCi1zdGF0aWMgdm9pZCBsb2NfYWdwc19pbml0KEFHcHNDYWxsYmFja3MqIGNhbGxiYWNrcyk7Ci1zdGF0aWMgaW50ICBsb2NfYWdwc19vcGVuKGNvbnN0IGNoYXIqIGFwbik7Ci1zdGF0aWMgaW50ICBsb2NfYWdwc19jbG9zZWQoKTsKLXN0YXRpYyBpbnQgIGxvY19hZ3BzX29wZW5fZmFpbGVkKCk7Ci1zdGF0aWMgaW50ICBsb2NfYWdwc19zZXRfc2VydmVyKEFHcHNUeXBlIHR5cGUsIGNvbnN0IGNoYXIgKmhvc3RuYW1lLCBpbnQgcG9ydCk7Ci1zdGF0aWMgaW50ICBsb2NfYWdwc19vcGVuX3dpdGhfYXBuaXB0eXBlKCBjb25zdCBjaGFyKiBhcG4sIEFwbklwVHlwZSBhcG5JcFR5cGUpOwotCi1zdGF0aWMgY29uc3QgQUdwc0ludGVyZmFjZSBzTG9jRW5nQUdwc0ludGVyZmFjZSA9Ci17Ci0gICBzaXplb2YoQUdwc0ludGVyZmFjZSksCi0gICBsb2NfYWdwc19pbml0LAotICAgbG9jX2FncHNfb3BlbiwKLSAgIGxvY19hZ3BzX2Nsb3NlZCwKLSAgIGxvY19hZ3BzX29wZW5fZmFpbGVkLAotICAgbG9jX2FncHNfc2V0X3NlcnZlciwKLSAgIGxvY19hZ3BzX29wZW5fd2l0aF9hcG5pcHR5cGUKLX07Ci0KLXN0YXRpYyBpbnQgbG9jX3h0cmFfaW5pdChHcHNYdHJhQ2FsbGJhY2tzKiBjYWxsYmFja3MpOwotc3RhdGljIGludCBsb2NfeHRyYV9pbmplY3RfZGF0YShjaGFyKiBkYXRhLCBpbnQgbGVuZ3RoKTsKLQotc3RhdGljIGNvbnN0IEdwc1h0cmFJbnRlcmZhY2Ugc0xvY0VuZ1hUUkFJbnRlcmZhY2UgPQotewotICAgIHNpemVvZihHcHNYdHJhSW50ZXJmYWNlKSwKLSAgICBsb2NfeHRyYV9pbml0LAotICAgIGxvY194dHJhX2luamVjdF9kYXRhCi19OwotCi1zdGF0aWMgdm9pZCBsb2NfbmlfaW5pdChHcHNOaUNhbGxiYWNrcyAqY2FsbGJhY2tzKTsKLXN0YXRpYyB2b2lkIGxvY19uaV9yZXNwb25kKGludCBub3RpZl9pZCwgR3BzVXNlclJlc3BvbnNlVHlwZSB1c2VyX3Jlc3BvbnNlKTsKLQotc3RhdGljIGNvbnN0IEdwc05pSW50ZXJmYWNlIHNMb2NFbmdOaUludGVyZmFjZSA9Ci17Ci0gICBzaXplb2YoR3BzTmlJbnRlcmZhY2UpLAotICAgbG9jX25pX2luaXQsCi0gICBsb2NfbmlfcmVzcG9uZCwKLX07Ci0KLS8vIEZvciBzaHV0dGluZyBkb3duIE1ETSBpbiBmdXNpb24gZGV2aWNlcwotc3RhdGljIGludCBtZG1fZmQgPSAtMTsKLXN0YXRpYyBpbnQgbG9jX2dwc19tZWFzdXJlbWVudF9pbml0KEdwc01lYXN1cmVtZW50Q2FsbGJhY2tzKiBjYWxsYmFja3MpOwotc3RhdGljIHZvaWQgbG9jX2dwc19tZWFzdXJlbWVudF9jbG9zZSgpOwotCi1zdGF0aWMgY29uc3QgR3BzTWVhc3VyZW1lbnRJbnRlcmZhY2Ugc0xvY0VuZ0dwc01lYXN1cmVtZW50SW50ZXJmYWNlID0KLXsKLSAgICBzaXplb2YoR3BzTWVhc3VyZW1lbnRJbnRlcmZhY2UpLAotICAgIGxvY19ncHNfbWVhc3VyZW1lbnRfaW5pdCwKLSAgICBsb2NfZ3BzX21lYXN1cmVtZW50X2Nsb3NlCi19OwotCi1zdGF0aWMgdm9pZCBsb2NfYWdwc19yaWxfaW5pdCggQUdwc1JpbENhbGxiYWNrcyogY2FsbGJhY2tzICk7Ci1zdGF0aWMgdm9pZCBsb2NfYWdwc19yaWxfc2V0X3JlZl9sb2NhdGlvbihjb25zdCBBR3BzUmVmTG9jYXRpb24gKmFncHNfcmVmbG9jYXRpb24sIHNpemVfdCBzel9zdHJ1Y3QpOwotc3RhdGljIHZvaWQgbG9jX2FncHNfcmlsX3NldF9zZXRfaWQoQUdwc1NldElEVHlwZSB0eXBlLCBjb25zdCBjaGFyKiBzZXRpZCk7Ci1zdGF0aWMgdm9pZCBsb2NfYWdwc19yaWxfbmlfbWVzc2FnZSh1aW50OF90ICptc2csIHNpemVfdCBsZW4pOwotc3RhdGljIHZvaWQgbG9jX2FncHNfcmlsX3VwZGF0ZV9uZXR3b3JrX3N0YXRlKGludCBjb25uZWN0ZWQsIGludCB0eXBlLCBpbnQgcm9hbWluZywgY29uc3QgY2hhciogZXh0cmFfaW5mbyk7Ci1zdGF0aWMgdm9pZCBsb2NfYWdwc19yaWxfdXBkYXRlX25ldHdvcmtfYXZhaWxhYmlsaXR5KGludCBhdmFpYWJsZSwgY29uc3QgY2hhciogYXBuKTsKLQotc3RhdGljIGNvbnN0IEFHcHNSaWxJbnRlcmZhY2Ugc0xvY0VuZ0FHcHNSaWxJbnRlcmZhY2UgPQotewotICAgc2l6ZW9mKEFHcHNSaWxJbnRlcmZhY2UpLAotICAgbG9jX2FncHNfcmlsX2luaXQsCi0gICBsb2NfYWdwc19yaWxfc2V0X3JlZl9sb2NhdGlvbiwKLSAgIGxvY19hZ3BzX3JpbF9zZXRfc2V0X2lkLAotICAgbG9jX2FncHNfcmlsX25pX21lc3NhZ2UsCi0gICBsb2NfYWdwc19yaWxfdXBkYXRlX25ldHdvcmtfc3RhdGUsCi0gICBsb2NfYWdwc19yaWxfdXBkYXRlX25ldHdvcmtfYXZhaWxhYmlsaXR5Ci19OwotCi1zdGF0aWMgaW50IGxvY19hZ3BzX2luc3RhbGxfY2VydGlmaWNhdGVzKGNvbnN0IERlckVuY29kZWRDZXJ0aWZpY2F0ZSogY2VydGlmaWNhdGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuZ3RoKTsKLXN0YXRpYyBpbnQgbG9jX2FncHNfcmV2b2tlX2NlcnRpZmljYXRlcyhjb25zdCBTaGExQ2VydGlmaWNhdGVGaW5nZXJwcmludCogZmluZ2VycHJpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW5ndGgpOwotCi1zdGF0aWMgY29uc3QgU3VwbENlcnRpZmljYXRlSW50ZXJmYWNlIHNMb2NFbmdBR3BzQ2VydEludGVyZmFjZSA9Ci17Ci0gICAgc2l6ZW9mKFN1cGxDZXJ0aWZpY2F0ZUludGVyZmFjZSksCi0gICAgbG9jX2FncHNfaW5zdGFsbF9jZXJ0aWZpY2F0ZXMsCi0gICAgbG9jX2FncHNfcmV2b2tlX2NlcnRpZmljYXRlcwotfTsKLQotc3RhdGljIHZvaWQgbG9jX2NvbmZpZ3VyYXRpb25fdXBkYXRlKGNvbnN0IGNoYXIqIGNvbmZpZ19kYXRhLCBpbnQzMl90IGxlbmd0aCk7Ci0KLXN0YXRpYyBjb25zdCBHbnNzQ29uZmlndXJhdGlvbkludGVyZmFjZSBzTG9jRW5nQ29uZmlnSW50ZXJmYWNlID0KLXsKLSAgICBzaXplb2YoR25zc0NvbmZpZ3VyYXRpb25JbnRlcmZhY2UpLAotICAgIGxvY19jb25maWd1cmF0aW9uX3VwZGF0ZQotfTsKLQotc3RhdGljIGxvY19lbmdfZGF0YV9zX3R5cGUgbG9jX2Fmd19kYXRhOwotc3RhdGljIGludCBnc3NfZmQgPSAtMTsKLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLUZVTkNUSU9OICAgIGdwc19nZXRfaGFyZHdhcmVfaW50ZXJmYWNlCi0KLURFU0NSSVBUSU9OCi0gICBSZXR1cm5zIHRoZSBHUFMgaGFyZHdhcmUgaW50ZXJhZmFjZSBiYXNlZCBvbiBMT0MgQVBJCi0gICBpZiBHUFMgaXMgZW5hYmxlZC4KLQotREVQRU5ERU5DSUVTCi0gICBOb25lCi0KLVJFVFVSTiBWQUxVRQotICAgMDogc3VjY2VzcwotCi1TSURFIEVGRkVDVFMKLSAgIE4vQQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotY29uc3QgR3BzSW50ZXJmYWNlKiBncHNfZ2V0X2hhcmR3YXJlX2ludGVyZmFjZSAoKQotewotICAgIEVOVFJZX0xPR19DQUxMRkxPVygpOwotICAgIGNvbnN0IEdwc0ludGVyZmFjZSogcmV0X3ZhbDsKLQotICAgIGNoYXIgcHJvcEJ1ZltQUk9QRVJUWV9WQUxVRV9NQVhdOwotCi0gICAgbG9jX2VuZ19yZWFkX2NvbmZpZygpOwotCi0gICAgLy8gY2hlY2sgdG8gc2VlIGlmIEdQUyBzaG91bGQgYmUgZGlzYWJsZWQKLSAgICBwcm9wZXJ0eV9nZXQoImdwcy5kaXNhYmxlIiwgcHJvcEJ1ZiwgIiIpOwotICAgIGlmIChwcm9wQnVmWzBdID09ICcxJykKLSAgICB7Ci0gICAgICAgIExPQ19MT0dEKCJncHNfZ2V0X2ludGVyZmFjZSByZXR1cm5pbmcgTlVMTCBiZWNhdXNlIGdwcy5kaXNhYmxlPTFcbiIpOwotICAgICAgICByZXRfdmFsID0gTlVMTDsKLSAgICB9IGVsc2UgewotICAgICAgICByZXRfdmFsID0gJnNMb2NFbmdJbnRlcmZhY2U7Ci0gICAgfQotCi0gICAgbG9jX2VuZ19yZWFkX2NvbmZpZygpOwotCi0gICAgRVhJVF9MT0coJXAsIHJldF92YWwpOwotICAgIHJldHVybiByZXRfdmFsOwotfQotCi0vLyBmb3IgZ3BzLmMKLWV4dGVybiAiQyIgY29uc3QgR3BzSW50ZXJmYWNlKiBnZXRfZ3BzX2ludGVyZmFjZSgpCi17Ci0gICAgdW5zaWduZWQgaW50IHRhcmdldCA9IFRBUkdFVF9ERUZBVUxUOwotICAgIGxvY19lbmdfcmVhZF9jb25maWcoKTsKLQotICAgIHRhcmdldCA9IGxvY19nZXRfdGFyZ2V0KCk7Ci0gICAgTE9DX0xPR0QoIlRhcmdldCBuYW1lIGNoZWNrIHJldHVybmVkICVzIiwgbG9jX2dldF90YXJnZXRfbmFtZSh0YXJnZXQpKTsKLQotICAgIGludCBnbnNzVHlwZSA9IGdldFRhcmdldEduc3NUeXBlKHRhcmdldCk7Ci0gICAgc3dpdGNoIChnbnNzVHlwZSkKLSAgICB7Ci0gICAgY2FzZSBHTlNTX0dTUzoKLSAgICAgICAgLy9BUFE4MDY0Ci0gICAgICAgIGdwc19jb25mLkNBUEFCSUxJVElFUyAmPSB+KEdQU19DQVBBQklMSVRZX01TQSB8IEdQU19DQVBBQklMSVRZX01TQik7Ci0gICAgICAgIGdzc19mZCA9IG9wZW4oIi9kZXYvZ3NzIiwgT19SRE9OTFkpOwotICAgICAgICBpZiAoZ3NzX2ZkIDwgMCkgewotICAgICAgICAgICAgTE9DX0xPR0UoIkdTUyBvcGVuIGZhaWxlZDogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBMT0NfTE9HRCgiR1NTIG9wZW4gc3VjY2VzcyEgQ0FQQUJJTElUSUVTICUwbHhcbiIsCi0gICAgICAgICAgICAgICAgICAgICBncHNfY29uZi5DQVBBQklMSVRJRVMpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgR05TU19OT05FOgotICAgICAgICAvL01QUTgwNjQKLSAgICAgICAgTE9DX0xPR0UoIk5vIEdQUyBIVyBvbiB0aGlzIHRhcmdldC4gTm90IHJldHVybmluZyBpbnRlcmZhY2UuIik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIGNhc2UgR05TU19RQ0ExNTMwOgotICAgICAgICAvLyBxY2ExNTMwIGNoaXAgaXMgcHJlc2VudAotICAgICAgICBncHNfY29uZi5DQVBBQklMSVRJRVMgJj0gfihHUFNfQ0FQQUJJTElUWV9NU0EgfCBHUFNfQ0FQQUJJTElUWV9NU0IpOwotICAgICAgICBMT0NfTE9HRCgicWNhMTUzMCBwcmVzZW50OiBDQVBBQklMSVRJRVMgJTBseFxuIiwgZ3BzX2NvbmYuQ0FQQUJJTElUSUVTKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHJldHVybiAmc0xvY0VuZ0ludGVyZmFjZTsKLX0KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLUZVTkNUSU9OICAgIGxvY19pbml0Ci0KLURFU0NSSVBUSU9OCi0gICBJbml0aWFsaXplIHRoZSBsb2NhdGlvbiBlbmdpbmUsIHRoaXMgaW5jbHVkZSBzZXR0aW5nIHVwIGdsb2JhbCBkYXRhcwotICAgYW5kIHJlZ2lzdGVycyBsb2NhdGlvbiBlbmdpZW4gd2l0aCBsb2MgYXBpIHNlcnZpY2UuCi0KLURFUEVOREVOQ0lFUwotICAgTm9uZQotCi1SRVRVUk4gVkFMVUUKLSAgIDA6IHN1Y2Nlc3MKLQotU0lERSBFRkZFQ1RTCi0gICBOL0F4Ci0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi1zdGF0aWMgaW50IGxvY19pbml0KEdwc0NhbGxiYWNrcyogY2FsbGJhY2tzKQotewotICAgIGludCByZXRWYWwgPSAtMTsKLSAgICBpbnQgaSA9IDA7Ci0gICAgRU5UUllfTE9HKCk7Ci0gICAgTE9DX0FQSV9BREFQVEVSX0VWRU5UX01BU0tfVCBldmVudDsKLQotICAgIGlmIChOVUxMID09IGNhbGxiYWNrcykgewotICAgICAgICBMT0NfTE9HRSgibG9jX2luaXQgZmFpbGVkLiBjYiA9IE5VTExcbiIpOwotICAgICAgICBFWElUX0xPRyglZCwgcmV0VmFsKTsKLSAgICAgICAgcmV0dXJuIHJldFZhbDsKLSAgICB9Ci0KLSAgICBldmVudCA9IExPQ19BUElfQURBUFRFUl9CSVRfUEFSU0VEX1BPU0lUSU9OX1JFUE9SVCB8Ci0gICAgICAgICAgICBMT0NfQVBJX0FEQVBURVJfQklUX1NBVEVMTElURV9SRVBPUlQgfAotICAgICAgICAgICAgTE9DX0FQSV9BREFQVEVSX0JJVF9MT0NBVElPTl9TRVJWRVJfUkVRVUVTVCB8Ci0gICAgICAgICAgICBMT0NfQVBJX0FEQVBURVJfQklUX0FTU0lTVEFOQ0VfREFUQV9SRVFVRVNUIHwKLSAgICAgICAgICAgIExPQ19BUElfQURBUFRFUl9CSVRfSU9DVExfUkVQT1JUIHwKLSAgICAgICAgICAgIExPQ19BUElfQURBUFRFUl9CSVRfU1RBVFVTX1JFUE9SVCB8Ci0gICAgICAgICAgICBMT0NfQVBJX0FEQVBURVJfQklUX05NRUFfMUhaX1JFUE9SVCB8Ci0gICAgICAgICAgICBMT0NfQVBJX0FEQVBURVJfQklUX05JX05PVElGWV9WRVJJRllfUkVRVUVTVDsKLQotICAgIExvY0NhbGxiYWNrcyBjbGllbnRDYWxsYmFja3MgPSB7bG9jYWxfbG9jX2NiLCAvKiBsb2NhdGlvbl9jYiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzLT5zdGF0dXNfY2IsIC8qIHN0YXR1c19jYiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxfc3ZfY2IsIC8qIHN2X3N0YXR1c19jYiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzLT5ubWVhX2NiLCAvKiBubWVhX2NiICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja3MtPnNldF9jYXBhYmlsaXRpZXNfY2IsIC8qIHNldF9jYXBhYmlsaXRpZXNfY2IgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrcy0+YWNxdWlyZV93YWtlbG9ja19jYiwgLyogYWNxdWlyZV93YWtlbG9ja19jYiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzLT5yZWxlYXNlX3dha2Vsb2NrX2NiLCAvKiByZWxlYXNlX3dha2Vsb2NrX2NiICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja3MtPmNyZWF0ZV90aHJlYWRfY2IsIC8qIGNyZWF0ZV90aHJlYWRfY2IgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIC8qIGxvY2F0aW9uX2V4dF9wYXJzZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIC8qIHN2X2V4dF9wYXJzZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrcy0+cmVxdWVzdF91dGNfdGltZV9jYiwgLyogcmVxdWVzdF91dGNfdGltZV9jYiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jX2Nsb3NlX21kbV9ub2RlICAvKmxvY19zaHV0ZG93bl9jYiovfTsKLQotICAgIGdwc19sb2NfY2IgPSBjYWxsYmFja3MtPmxvY2F0aW9uX2NiOwotICAgIGdwc19zdl9jYiA9IGNhbGxiYWNrcy0+c3Zfc3RhdHVzX2NiOwotCi0gICAgcmV0VmFsID0gbG9jX2VuZ19pbml0KGxvY19hZndfZGF0YSwgJmNsaWVudENhbGxiYWNrcywgZXZlbnQsIE5VTEwpOwotICAgIGxvY19hZndfZGF0YS5hZGFwdGVyLT5tU3VwcG9ydHNBZ3BzUmVxdWVzdHMgPSAhbG9jX2Fmd19kYXRhLmFkYXB0ZXItPmhhc0FncHNFeHRlbmRlZENhcGFiaWxpdGllcygpOwotICAgIGxvY19hZndfZGF0YS5hZGFwdGVyLT5tU3VwcG9ydHNQb3NpdGlvbkluamVjdGlvbiA9ICFsb2NfYWZ3X2RhdGEuYWRhcHRlci0+aGFzQ1BJRXh0ZW5kZWRDYXBhYmlsaXRpZXMoKTsKLSAgICBsb2NfYWZ3X2RhdGEuYWRhcHRlci0+c2V0R3BzTG9ja01zZygwKTsKLSAgICBsb2NfYWZ3X2RhdGEuYWRhcHRlci0+cmVxdWVzdFVscChncHNfY29uZi5DQVBBQklMSVRJRVMpOwotCi0gICAgaWYocmV0VmFsKSB7Ci0gICAgICAgIExPQ19MT0dFKCJsb2NfZW5nX2luaXQoKSBmYWlsISIpOwotICAgICAgICBnb3RvIGVycjsKLSAgICB9Ci0KLSAgICBsb2NfYWZ3X2RhdGEuYWRhcHRlci0+c2V0UG93ZXJWb3RlUmlnaHQobG9jX2dldF90YXJnZXQoKSA9PSBUQVJHRVRfUUNBMTUzMCk7Ci0gICAgbG9jX2Fmd19kYXRhLmFkYXB0ZXItPnNldFBvd2VyVm90ZSh0cnVlKTsKLQotICAgIExPQ19MT0dEKCJsb2NfZW5nX2luaXQoKSBzdWNjZXNzISIpOwotCi0jaWZkZWYgUExBVEZPUk1fTVNNODA4NAotICAgIGlmIChtZG1fZmQgPCAwKSB7Ci0gICAgICAgIGludCAoKm9wZW5fZmlyc3RfZXh0ZXJuYWxfbW9kZW0pKHZvaWQpOwotICAgICAgICBjb25zdCBjaGFyICpuYW1lID0gImxpYmRldGVjdG1vZGVtLnNvIjsKLSAgICAgICAgY29uc3QgY2hhciAqZnVuYyA9ICJvcGVuX2ZpcnN0X2V4dGVybmFsX21vZGVtIjsKLSAgICAgICAgY29uc3QgY2hhciAqZXJyb3I7Ci0KLSAgICAgICAgdm9pZCAqbGliID0gOjpkbG9wZW4obmFtZSwgUlRMRF9OT1cpOwotICAgICAgICBlcnJvciA9IDo6ZGxlcnJvcigpOwotICAgICAgICBpZiAoIWxpYikgewotICAgICAgICAgICAgTE9DX0xPR0UoIiVzOiBjb3VsZCBub3QgZmluZCAlczogJXMiLCBfX2Z1bmNfXywgbmFtZSwgZXJyb3IpOwotICAgICAgICAgICAgZ290byBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBvcGVuX2ZpcnN0X2V4dGVybmFsX21vZGVtID0gTlVMTDsKLSAgICAgICAgKih2b2lkICoqKSgmb3Blbl9maXJzdF9leHRlcm5hbF9tb2RlbSkgPSA6OmRsc3ltKGxpYiwgZnVuYyk7Ci0gICAgICAgIGVycm9yID0gOjpkbGVycm9yKCk7Ci0KLSAgICAgICAgaWYgKCFvcGVuX2ZpcnN0X2V4dGVybmFsX21vZGVtKSB7Ci0gICAgICAgICAgICBMT0NfTE9HRSgiJXM6IGNvdWxkIG5vdCBmaW5kIHN5bWJvbCAlcyBpbiAlczogJXMiLAotICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGZ1bmMsIG5hbWUsIGVycm9yKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGVycm5vID0gMDsKLSAgICAgICAgICAgIG1kbV9mZCA9IG9wZW5fZmlyc3RfZXh0ZXJuYWxfbW9kZW0oKTsKLSAgICAgICAgICAgIGlmIChtZG1fZmQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgTE9DX0xPR0UoIiVzOiAlcyBmYWlsZWQ6ICVzXG4iLCBfX2Z1bmNfXywgZnVuYywgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIExPQ19MT0dEKCIlczogZXh0ZXJuYWwgcG93ZXIgdXAgbW9kZW0gb3BlbmVkIHN1Y2Nlc3NmdWxseVxuIiwgX19mdW5jX18pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGRsY2xvc2UobGliKTsKLSAgICB9IGVsc2UgewotICAgICAgICBMT0NfTE9HRCgicG93ZXJ1cF9ub2RlIGhhcyBiZWVuIG9wZW5lZCBiZWZvcmUiKTsKLSAgICB9Ci0jZW5kaWYgLy9QTEFURk9STV9NU004MDg0Ci1lcnI6Ci0gICAgRVhJVF9MT0coJWQsIHJldFZhbCk7Ci0gICAgcmV0dXJuIHJldFZhbDsKLX0KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLUZVTkNUSU9OICAgIGxvY19jbG9zZV9tZG1fbm9kZQotCi1ERVNDUklQVElPTgotICAgY2xvc2VzIG1kbV9mZCB3aGljaCBpcyB0aGUgbW9kZW0gcG93ZXJ1cCBub2RlIG9idGFpbmVkIGluIGxvY19pbml0Ci0KLURFUEVOREVOQ0lFUwotICAgTm9uZQotCi1SRVRVUk4gVkFMVUUKLSAgIE5vbmUKLQotU0lERSBFRkZFQ1RTCi0gICBOL0EKLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLXN0YXRpYyB2b2lkIGxvY19jbG9zZV9tZG1fbm9kZSgpCi17Ci0gICAgRU5UUllfTE9HKCk7Ci0gICAgaWYgKG1kbV9mZCA+PSAwKSB7Ci0gICAgICAgIExPQ19MT0dEKCJjbG9zaW5nIHRoZSBwb3dlcnVwIG5vZGUiKTsKLSAgICAgICAgY2xvc2UobWRtX2ZkKTsKLSAgICAgICAgbWRtX2ZkID0gLTE7Ci0gICAgICAgIExPQ19MT0dEKCJmaW5pc2hlZCBjbG9zaW5nIHRoZSBwb3dlcnVwIG5vZGUiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBMT0NfTE9HRCgicG93ZXJ1cCBub2RlIGhhcyBub3QgYmVlbiBvcGVuZWQgeWV0LiIpOwotICAgIH0KLQotICAgIEVYSVRfTE9HKCVzLCBWT0lEX1JFVCk7Ci19Ci0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1GVU5DVElPTiAgICBsb2NfY2xlYW51cAotCi1ERVNDUklQVElPTgotICAgQ2xlYW5zIGxvY2F0aW9uIGVuZ2luZS4gVGhlIGxvY2F0aW9uIGNsaWVudCBoYW5kbGUgd2lsbCBiZSByZWxlYXNlZC4KLQotREVQRU5ERU5DSUVTCi0gICBOb25lCi0KLVJFVFVSTiBWQUxVRQotICAgTm9uZQotCi1TSURFIEVGRkVDVFMKLSAgIE4vQQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotc3RhdGljIHZvaWQgbG9jX2NsZWFudXAoKQotewotICAgIEVOVFJZX0xPRygpOwotCi0gICAgbG9jX2Fmd19kYXRhLmFkYXB0ZXItPnNldFBvd2VyVm90ZShmYWxzZSk7Ci0gICAgbG9jX2Fmd19kYXRhLmFkYXB0ZXItPnNldEdwc0xvY2tNc2coZ3BzX2NvbmYuR1BTX0xPQ0spOwotCi0gICAgbG9jX2VuZ19jbGVhbnVwKGxvY19hZndfZGF0YSk7Ci0gICAgbG9jX2Nsb3NlX21kbV9ub2RlKCk7Ci0gICAgZ3BzX2xvY19jYiA9IE5VTEw7Ci0gICAgZ3BzX3N2X2NiID0gTlVMTDsKLQotICAgIEVYSVRfTE9HKCVzLCBWT0lEX1JFVCk7Ci19Ci0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1GVU5DVElPTiAgICBsb2Nfc3RhcnQKLQotREVTQ1JJUFRJT04KLSAgIFN0YXJ0cyB0aGUgdHJhY2tpbmcgc2Vzc2lvbgotCi1ERVBFTkRFTkNJRVMKLSAgIE5vbmUKLQotUkVUVVJOIFZBTFVFCi0gICAwOiBzdWNjZXNzCi0KLVNJREUgRUZGRUNUUwotICAgTi9BCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi1zdGF0aWMgaW50IGxvY19zdGFydCgpCi17Ci0gICAgRU5UUllfTE9HKCk7Ci0gICAgaW50IHJldF92YWwgPSBsb2NfZW5nX3N0YXJ0KGxvY19hZndfZGF0YSk7Ci0KLSAgICBFWElUX0xPRyglZCwgcmV0X3ZhbCk7Ci0gICAgcmV0dXJuIHJldF92YWw7Ci19Ci0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1GVU5DVElPTiAgICBsb2Nfc3RvcAotCi1ERVNDUklQVElPTgotICAgU3RvcHMgdGhlIHRyYWNraW5nIHNlc3Npb24KLQotREVQRU5ERU5DSUVTCi0gICBOb25lCi0KLVJFVFVSTiBWQUxVRQotICAgMDogc3VjY2VzcwotCi1TSURFIEVGRkVDVFMKLSAgIE4vQQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotc3RhdGljIGludCBsb2Nfc3RvcCgpCi17Ci0gICAgRU5UUllfTE9HKCk7Ci0gICAgaW50IHJldF92YWwgPSAtMTsKLSAgICByZXRfdmFsID0gbG9jX2VuZ19zdG9wKGxvY19hZndfZGF0YSk7Ci0KLSAgICBFWElUX0xPRyglZCwgcmV0X3ZhbCk7Ci0gICAgcmV0dXJuIHJldF92YWw7Ci19Ci0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1GVU5DVElPTiAgICBsb2Nfc2V0X3Bvc2l0aW9uX21vZGUKLQotREVTQ1JJUFRJT04KLSAgIFNldHMgdGhlIG1vZGUgYW5kIGZpeCBmcmVxdWVuY3kgZm9yIHRoZSB0cmFja2luZyBzZXNzaW9uLgotCi1ERVBFTkRFTkNJRVMKLSAgIE5vbmUKLQotUkVUVVJOIFZBTFVFCi0gICAwOiBzdWNjZXNzCi0KLVNJREUgRUZGRUNUUwotICAgTi9BCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi1zdGF0aWMgaW50ICBsb2Nfc2V0X3Bvc2l0aW9uX21vZGUoR3BzUG9zaXRpb25Nb2RlIG1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3BzUG9zaXRpb25SZWN1cnJlbmNlIHJlY3VycmVuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWluX2ludGVydmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZWZlcnJlZF9hY2N1cmFjeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVmZXJyZWRfdGltZSkKLXsKLSAgICBFTlRSWV9MT0coKTsKLSAgICBpbnQgcmV0X3ZhbCA9IC0xOwotICAgIExvY1Bvc2l0aW9uTW9kZSBsb2NNb2RlOwotICAgIHN3aXRjaCAobW9kZSkgewotICAgIGNhc2UgR1BTX1BPU0lUSU9OX01PREVfTVNfQkFTRUQ6Ci0gICAgICAgIGxvY01vZGUgPSBMT0NfUE9TSVRJT05fTU9ERV9NU19CQVNFRDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHUFNfUE9TSVRJT05fTU9ERV9NU19BU1NJU1RFRDoKLSAgICAgICAgbG9jTW9kZSA9IExPQ19QT1NJVElPTl9NT0RFX01TX0FTU0lTVEVEOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBsb2NNb2RlID0gTE9DX1BPU0lUSU9OX01PREVfU1RBTkRBTE9ORTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgTG9jUG9zTW9kZSBwYXJhbXMobG9jTW9kZSwgcmVjdXJyZW5jZSwgbWluX2ludGVydmFsLAotICAgICAgICAgICAgICAgICAgICAgIHByZWZlcnJlZF9hY2N1cmFjeSwgcHJlZmVycmVkX3RpbWUsIE5VTEwsIE5VTEwpOwotICAgIHJldF92YWwgPSBsb2NfZW5nX3NldF9wb3NpdGlvbl9tb2RlKGxvY19hZndfZGF0YSwgcGFyYW1zKTsKLQotICAgIEVYSVRfTE9HKCVkLCByZXRfdmFsKTsKLSAgICByZXR1cm4gcmV0X3ZhbDsKLX0KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLUZVTkNUSU9OICAgIGxvY19pbmplY3RfdGltZQotCi1ERVNDUklQVElPTgotICAgVGhpcyBpcyB1c2VkIGJ5IEphdmEgbmF0aXZlIGZ1bmN0aW9uIHRvIGRvIHRpbWUgaW5qZWN0aW9uLgotCi1ERVBFTkRFTkNJRVMKLSAgIE5vbmUKLQotUkVUVVJOIFZBTFVFCi0gICAwCi0KLVNJREUgRUZGRUNUUwotICAgTi9BCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi1zdGF0aWMgaW50IGxvY19pbmplY3RfdGltZShHcHNVdGNUaW1lIHRpbWUsIGludDY0X3QgdGltZVJlZmVyZW5jZSwgaW50IHVuY2VydGFpbnR5KQotewotICAgIEVOVFJZX0xPRygpOwotICAgIGludCByZXRfdmFsID0gMDsKLQotICAgIHJldF92YWwgPSBsb2NfZW5nX2luamVjdF90aW1lKGxvY19hZndfZGF0YSwgdGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lUmVmZXJlbmNlLCB1bmNlcnRhaW50eSk7Ci0KLSAgICBFWElUX0xPRyglZCwgcmV0X3ZhbCk7Ci0gICAgcmV0dXJuIHJldF92YWw7Ci19Ci0KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLUZVTkNUSU9OICAgIGxvY19pbmplY3RfbG9jYXRpb24KLQotREVTQ1JJUFRJT04KLSAgIFRoaXMgaXMgdXNlZCBieSBKYXZhIG5hdGl2ZSBmdW5jdGlvbiB0byBkbyBsb2NhdGlvbiBpbmplY3Rpb24uCi0KLURFUEVOREVOQ0lFUwotICAgTm9uZQotCi1SRVRVUk4gVkFMVUUKLSAgIDAgICAgICAgICAgOiBTdWNjZXNzZnVsCi0gICBlcnJvciBjb2RlIDogRmFpbHVyZQotCi1TSURFIEVGRkVDVFMKLSAgIE4vQQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLXN0YXRpYyBpbnQgbG9jX2luamVjdF9sb2NhdGlvbihkb3VibGUgbGF0aXR1ZGUsIGRvdWJsZSBsb25naXR1ZGUsIGZsb2F0IGFjY3VyYWN5KQotewotICAgIHN0YXRpYyBib29sIGluaXRpYWxpemVkID0gZmFsc2U7Ci0gICAgc3RhdGljIGJvb2wgZW5hYmxlX2NwaSA9IHRydWU7Ci0gICAgRU5UUllfTE9HKCk7Ci0KLSAgICBpZiAoYWNjdXJhY3kgPCAxMDAwKQotICAgIHsKLSAgICAgIGFjY3VyYWN5ID0gMTAwMDsKLSAgICB9Ci0KLSAgICBpbnQgcmV0X3ZhbCA9IDA7Ci0gICAgcmV0X3ZhbCA9IGxvY19lbmdfaW5qZWN0X2xvY2F0aW9uKGxvY19hZndfZGF0YSwgbGF0aXR1ZGUsIGxvbmdpdHVkZSwgYWNjdXJhY3kpOwotCi0gICAgaWYoIWluaXRpYWxpemVkKQotICAgIHsKLSAgICAgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOwotICAgICAgICBtZW1zZXQodmFsdWUsIDAsIHNpemVvZih2YWx1ZSkpOwotICAgICAgICAodm9pZClwcm9wZXJ0eV9nZXQoInBlcnNpc3QuZ3BzLnFjX25scF9pbl91c2UiLCB2YWx1ZSwgIjAiKTsKLSAgICAgICAgaWYoMCA9PSBzdHJjbXAodmFsdWUsICIxIikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVuYWJsZV9jcGkgPSBmYWxzZTsKLSAgICAgICAgICAgIExPQ19MT0dJKCJHUFMgSEFMIGNvYXJzZSBwb3NpdGlvbiBpbmplY3Rpb24gZGlzYWJsZWQiKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIExPQ19MT0dJKCJHUFMgSEFMIGNvYXJzZSBwb3NpdGlvbiBpbmplY3Rpb24gZW5hYmxlZCIpOwotICAgICAgICB9Ci0gICAgICAgIGluaXRpYWxpemVkID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBpZihlbmFibGVfY3BpKQotICAgIHsKLSAgICAgIHJldF92YWwgPSBsb2NfZW5nX2luamVjdF9sb2NhdGlvbihsb2NfYWZ3X2RhdGEsIGxhdGl0dWRlLCBsb25naXR1ZGUsIGFjY3VyYWN5KTsKLSAgICB9Ci0gICAgRVhJVF9MT0coJWQsIHJldF92YWwpOwotICAgIHJldHVybiByZXRfdmFsOwotfQotCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1GVU5DVElPTiAgICBsb2NfZGVsZXRlX2FpZGluZ19kYXRhCi0KLURFU0NSSVBUSU9OCi0gICBUaGlzIGlzIHVzZWQgYnkgSmF2YSBuYXRpdmUgZnVuY3Rpb24gdG8gZGVsZXRlIHRoZSBhaWRpbmcgZGF0YS4gVGhlIGZ1bmN0aW9uCi0gICB1cGRhdGVzIHRoZSBnbG9iYWwgdmFyaWFibGUgZm9yIHRoZSBhaWRpbmcgZGF0YSB0byBiZSBkZWxldGVkLiBJZiB0aGUgR1BTCi0gICBlbmdpbmUgaXMgb2ZmLCB0aGUgYWlkaW5nIGRhdGEgd2lsbCBiZSBkZWxldGVkLiBPdGhlcndpc2UsIHRoZSBhY3R1YWwgYWN0aW9uCi0gICB3aWxsIGhhcHBlbiB3aGVuIGdwcyBlbmdpbmUgaXMgdHVybmVkIG9mZi4KLQotREVQRU5ERU5DSUVTCi0gICBBc3N1bWVzIHRoZSBhaWRpbmcgZGF0YSB0eXBlIHNwZWNpZmllZCBpbiBHcHNBaWRpbmdEYXRhIG1hdGNoZXMgd2l0aAotICAgTE9DIEFQSSBzcGVjaWZpY2F0aW9uLgotCi1SRVRVUk4gVkFMVUUKLSAgIE5vbmUKLQotU0lERSBFRkZFQ1RTCi0gICBOL0EKLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLXN0YXRpYyB2b2lkIGxvY19kZWxldGVfYWlkaW5nX2RhdGEoR3BzQWlkaW5nRGF0YSBmKQotewotICAgIEVOVFJZX0xPRygpOwotICAgIGxvY19lbmdfZGVsZXRlX2FpZGluZ19kYXRhKGxvY19hZndfZGF0YSwgZik7Ci0KLSAgICBFWElUX0xPRyglcywgVk9JRF9SRVQpOwotfQotCi1jb25zdCBHcHNHZW9mZW5jaW5nSW50ZXJmYWNlKiBnZXRfZ2VvZmVuY2VfaW50ZXJmYWNlKHZvaWQpCi17Ci0gICAgRU5UUllfTE9HKCk7Ci0gICAgdm9pZCAqaGFuZGxlOwotICAgIGNvbnN0IGNoYXIgKmVycm9yOwotICAgIHR5cGVkZWYgY29uc3QgR3BzR2VvZmVuY2luZ0ludGVyZmFjZSogKCpnZXRfZ3BzX2dlb2ZlbmNlX2ludGVyZmFjZV9mdW5jdGlvbikgKHZvaWQpOwotICAgIGdldF9ncHNfZ2VvZmVuY2VfaW50ZXJmYWNlX2Z1bmN0aW9uIGdldF9ncHNfZ2VvZmVuY2VfaW50ZXJmYWNlOwotICAgIHN0YXRpYyBjb25zdCBHcHNHZW9mZW5jaW5nSW50ZXJmYWNlKiBnZW9mZW5jZV9pbnRlcmZhY2UgPSBOVUxMOwotCi0gICAgZGxlcnJvcigpOyAgICAvKiBDbGVhciBhbnkgZXhpc3RpbmcgZXJyb3IgKi8KLQotICAgIGhhbmRsZSA9IGRsb3BlbiAoImxpYmdlb2ZlbmNlLnNvIiwgUlRMRF9OT1cpOwotCi0gICAgaWYgKCFoYW5kbGUpCi0gICAgewotICAgICAgICBpZiAoKGVycm9yID0gZGxlcnJvcigpKSAhPSBOVUxMKSAgewotICAgICAgICAgICAgTE9DX0xPR0UgKCIlcywgZGxvcGVuIGZvciBsaWJnZW9mZW5jZS5zbyBmYWlsZWQsIGVycm9yID0gJXNcbiIsIF9fZnVuY19fLCBlcnJvcik7Ci0gICAgICAgICAgIH0KLSAgICAgICAgZ290byBleGl0OwotICAgIH0KLSAgICBkbGVycm9yKCk7ICAgIC8qIENsZWFyIGFueSBleGlzdGluZyBlcnJvciAqLwotICAgIGdldF9ncHNfZ2VvZmVuY2VfaW50ZXJmYWNlID0gKGdldF9ncHNfZ2VvZmVuY2VfaW50ZXJmYWNlX2Z1bmN0aW9uKWRsc3ltKGhhbmRsZSwgImdwc19nZW9mZW5jZV9nZXRfaW50ZXJmYWNlIik7Ci0gICAgaWYgKChlcnJvciA9IGRsZXJyb3IoKSkgIT0gTlVMTCkgIHsKLSAgICAgICAgTE9DX0xPR0UgKCIlcywgZGxzeW0gZm9yIGdldF9ncHNfZ2VvZmVuY2VfaW50ZXJmYWNlIGZhaWxlZCwgZXJyb3IgPSAlc1xuIiwgX19mdW5jX18sIGVycm9yKTsKLSAgICAgICAgZ290byBleGl0OwotICAgICB9Ci0KLSAgICBnZW9mZW5jZV9pbnRlcmZhY2UgPSBnZXRfZ3BzX2dlb2ZlbmNlX2ludGVyZmFjZSgpOwotCi1leGl0OgotICAgIEVYSVRfTE9HKCVkLCBnZW9mZW5jZV9pbnRlcmZhY2UgPT0gTlVMTCk7Ci0gICAgcmV0dXJuIGdlb2ZlbmNlX2ludGVyZmFjZTsKLX0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1GVU5DVElPTiAgICBsb2NfZ2V0X2V4dGVuc2lvbgotCi1ERVNDUklQVElPTgotICAgR2V0IHRoZSBncHMgZXh0ZW5zaW9uIHRvIHN1cHBvcnQgWFRSQS4KLQotREVQRU5ERU5DSUVTCi0gICBOL0EKLQotUkVUVVJOIFZBTFVFCi0gICBUaGUgR1BTIGV4dGVuc2lvbiBpbnRlcmZhY2UuCi0KLVNJREUgRUZGRUNUUwotICAgTi9BCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi1jb25zdCB2b2lkKiBsb2NfZ2V0X2V4dGVuc2lvbihjb25zdCBjaGFyKiBuYW1lKQotewotICAgIEVOVFJZX0xPRygpOwotICAgIGNvbnN0IHZvaWQqIHJldF92YWwgPSBOVUxMOwotCi0gICBMT0NfTE9HRCgiJXM6JWRdIEZvciBJbnRlcmZhY2UgPSAlc1xuIixfX2Z1bmNfXywgX19MSU5FX18sIG5hbWUpOwotICAgaWYgKHN0cmNtcChuYW1lLCBHUFNfWFRSQV9JTlRFUkZBQ0UpID09IDApCi0gICB7Ci0gICAgICAgcmV0X3ZhbCA9ICZzTG9jRW5nWFRSQUludGVyZmFjZTsKLSAgIH0KLSAgIGVsc2UgaWYgKHN0cmNtcChuYW1lLCBBR1BTX0lOVEVSRkFDRSkgPT0gMCkKLSAgIHsKLSAgICAgICByZXRfdmFsID0gJnNMb2NFbmdBR3BzSW50ZXJmYWNlOwotICAgfQotICAgZWxzZSBpZiAoc3RyY21wKG5hbWUsIEdQU19OSV9JTlRFUkZBQ0UpID09IDApCi0gICB7Ci0gICAgICAgcmV0X3ZhbCA9ICZzTG9jRW5nTmlJbnRlcmZhY2U7Ci0gICB9Ci0gICBlbHNlIGlmIChzdHJjbXAobmFtZSwgQUdQU19SSUxfSU5URVJGQUNFKSA9PSAwKQotICAgewotICAgICAgIGNoYXIgYmFzZWJhbmRbUFJPUEVSVFlfVkFMVUVfTUFYXTsKLSAgICAgICBwcm9wZXJ0eV9nZXQoInJvLmJhc2ViYW5kIiwgYmFzZWJhbmQsICJtc20iKTsKLSAgICAgICBpZiAoc3RyY21wKGJhc2ViYW5kLCAiY3NmYiIpID09IDApCi0gICAgICAgewotICAgICAgICAgICByZXRfdmFsID0gJnNMb2NFbmdBR3BzUmlsSW50ZXJmYWNlOwotICAgICAgIH0KLSAgIH0KLSAgIGVsc2UgaWYgKHN0cmNtcChuYW1lLCBHUFNfR0VPRkVOQ0lOR19JTlRFUkZBQ0UpID09IDApCi0gICB7Ci0gICAgICAgaWYgKChncHNfY29uZi5DQVBBQklMSVRJRVMgfCBHUFNfQ0FQQUJJTElUWV9HRU9GRU5DSU5HKSA9PSBncHNfY29uZi5DQVBBQklMSVRJRVMgKXsKLSAgICAgICAgICAgcmV0X3ZhbCA9IGdldF9nZW9mZW5jZV9pbnRlcmZhY2UoKTsKLSAgICAgICB9Ci0gICB9Ci0gICBlbHNlIGlmIChzdHJjbXAobmFtZSwgU1VQTF9DRVJUSUZJQ0FURV9JTlRFUkZBQ0UpID09IDApCi0gICB7Ci0gICAgICAgcmV0X3ZhbCA9ICZzTG9jRW5nQUdwc0NlcnRJbnRlcmZhY2U7Ci0gICB9Ci0gICBlbHNlIGlmIChzdHJjbXAobmFtZSwgR05TU19DT05GSUdVUkFUSU9OX0lOVEVSRkFDRSkgPT0gMCkKLSAgIHsKLSAgICAgICByZXRfdmFsID0gJnNMb2NFbmdDb25maWdJbnRlcmZhY2U7Ci0gICB9Ci0gICBlbHNlIGlmIChzdHJjbXAobmFtZSwgR1BTX01FQVNVUkVNRU5UX0lOVEVSRkFDRSkgPT0gMCkKLSAgIHsKLSAgICAgICByZXRfdmFsID0gJnNMb2NFbmdHcHNNZWFzdXJlbWVudEludGVyZmFjZTsKLSAgIH0KLSAgIGVsc2UKLSAgIHsKLSAgICAgIExPQ19MT0dFICgiZ2V0X2V4dGVuc2lvbjogSW52YWxpZCBpbnRlcmZhY2UgcGFzc2VkIGluXG4iKTsKLSAgIH0KLSAgICBFWElUX0xPRyglcCwgcmV0X3ZhbCk7Ci0gICAgcmV0dXJuIHJldF92YWw7Ci19Ci0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1GVU5DVElPTiAgICBsb2NfYWdwc19pbml0Ci0KLURFU0NSSVBUSU9OCi0gICBJbml0aWFsaXplIHRoZSBBR3BzIGludGVyZmFjZS4KLQotREVQRU5ERU5DSUVTCi0gICBOT05FCi0KLVJFVFVSTiBWQUxVRQotICAgMAotCi1TSURFIEVGRkVDVFMKLSAgIE4vQQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotc3RhdGljIHZvaWQgbG9jX2FncHNfaW5pdChBR3BzQ2FsbGJhY2tzKiBjYWxsYmFja3MpCi17Ci0gICAgRU5UUllfTE9HKCk7Ci0gICAgaWYgKGFncHNfc3RhdHVzX2NiID09IE5VTEwpIHsKLSAgICAgICAgYWdwc19zdGF0dXNfY2IgPSBjYWxsYmFja3MtPnN0YXR1c19jYjsKLSAgICAgICAgY2FsbGJhY2tzLT5zdGF0dXNfY2IgPSBsb2NfYWdwc19zdGF0dXNfY2I7Ci0gICAgfQotICAgIGxvY19lbmdfYWdwc19pbml0KGxvY19hZndfZGF0YSwgKEFHcHNFeHRDYWxsYmFja3MqKWNhbGxiYWNrcyk7Ci0gICAgRVhJVF9MT0coJXMsIFZPSURfUkVUKTsKLX0KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLUZVTkNUSU9OICAgIGxvY19hZ3BzX29wZW4KLQotREVTQ1JJUFRJT04KLSAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gb24tZGVtYW5kIGRhdGEgY29ubmVjdGlvbiBvcGVuaW5nIGlzIHN1Y2Nlc3NmdWwuCi1JdCBzaG91bGQgaW5mb3JtIEFSTSA5IGFib3V0IHRoZSBkYXRhIG9wZW4gcmVzdWx0LgotCi1ERVBFTkRFTkNJRVMKLSAgIE5PTkUKLQotUkVUVVJOIFZBTFVFCi0gICAwCi0KLVNJREUgRUZGRUNUUwotICAgTi9BCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi1zdGF0aWMgaW50IGxvY19hZ3BzX29wZW4oY29uc3QgY2hhciogYXBuKQotewotICAgIEVOVFJZX0xPRygpOwotICAgIEFHcHNUeXBlIGFncHNUeXBlID0gQUdQU19UWVBFX1NVUEw7Ci0gICAgQUdwc0JlYXJlclR5cGUgYmVhcmVyVHlwZSA9IEFHUFNfQVBOX0JFQVJFUl9JUFY0OwotICAgIGludCByZXRfdmFsID0gbG9jX2VuZ19hZ3BzX29wZW4obG9jX2Fmd19kYXRhLCBhZ3BzVHlwZSwgYXBuLCBiZWFyZXJUeXBlKTsKLQotICAgIEVYSVRfTE9HKCVkLCByZXRfdmFsKTsKLSAgICByZXR1cm4gcmV0X3ZhbDsKLX0KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLUZVTkNUSU9OICAgIGxvY19hZ3BzX29wZW5fd2l0aF9hcG5pcHR5cGUKLQotREVTQ1JJUFRJT04KLSAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gb24tZGVtYW5kIGRhdGEgY29ubmVjdGlvbiBvcGVuaW5nIGlzIHN1Y2Nlc3NmdWwuCi1JdCBzaG91bGQgaW5mb3JtIEFSTSA5IGFib3V0IHRoZSBkYXRhIG9wZW4gcmVzdWx0LgotCi1ERVBFTkRFTkNJRVMKLSAgIE5PTkUKLQotUkVUVVJOIFZBTFVFCi0gICAwCi0KLVNJREUgRUZGRUNUUwotICAgTi9BCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi1zdGF0aWMgaW50ICBsb2NfYWdwc19vcGVuX3dpdGhfYXBuaXB0eXBlKGNvbnN0IGNoYXIqIGFwbiwgQXBuSXBUeXBlIGFwbklwVHlwZSkKLXsKLSAgICBFTlRSWV9MT0coKTsKLSAgICBBR3BzVHlwZSBhZ3BzVHlwZSA9IEFHUFNfVFlQRV9TVVBMOwotICAgIEFHcHNCZWFyZXJUeXBlIGJlYXJlclR5cGU7Ci0KLSAgICBzd2l0Y2ggKGFwbklwVHlwZSkgewotICAgICAgICBjYXNlIEFQTl9JUF9JUFY0OgotICAgICAgICAgICAgYmVhcmVyVHlwZSA9IEFHUFNfQVBOX0JFQVJFUl9JUFY0OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQVBOX0lQX0lQVjY6Ci0gICAgICAgICAgICBiZWFyZXJUeXBlID0gQUdQU19BUE5fQkVBUkVSX0lQVjY7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBBUE5fSVBfSVBWNFY2OgotICAgICAgICAgICAgYmVhcmVyVHlwZSA9IEFHUFNfQVBOX0JFQVJFUl9JUFY0VjY7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJlYXJlclR5cGUgPSBBR1BTX0FQTl9CRUFSRVJfSU5WQUxJRDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGludCByZXRfdmFsID0gbG9jX2VuZ19hZ3BzX29wZW4obG9jX2Fmd19kYXRhLCBhZ3BzVHlwZSwgYXBuLCBiZWFyZXJUeXBlKTsKLQotICAgIEVYSVRfTE9HKCVkLCByZXRfdmFsKTsKLSAgICByZXR1cm4gcmV0X3ZhbDsKLX0KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLUZVTkNUSU9OICAgIGxvY19hZ3BzX2Nsb3NlZAotCi1ERVNDUklQVElPTgotICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBvbi1kZW1hbmQgZGF0YSBjb25uZWN0aW9uIGNsb3NpbmcgaXMgZG9uZS4KLUl0IHNob3VsZCBpbmZvcm0gQVJNIDkgYWJvdXQgdGhlIGRhdGEgY2xvc2UgcmVzdWx0LgotCi1ERVBFTkRFTkNJRVMKLSAgIE5PTkUKLQotUkVUVVJOIFZBTFVFCi0gICAwCi0KLVNJREUgRUZGRUNUUwotICAgTi9BCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi1zdGF0aWMgaW50IGxvY19hZ3BzX2Nsb3NlZCgpCi17Ci0gICAgRU5UUllfTE9HKCk7Ci0gICAgQUdwc1R5cGUgYWdwc1R5cGUgPSBBR1BTX1RZUEVfU1VQTDsKLSAgICBpbnQgcmV0X3ZhbCA9IGxvY19lbmdfYWdwc19jbG9zZWQobG9jX2Fmd19kYXRhLCBhZ3BzVHlwZSk7Ci0KLSAgICBFWElUX0xPRyglZCwgcmV0X3ZhbCk7Ci0gICAgcmV0dXJuIHJldF92YWw7Ci19Ci0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1GVU5DVElPTiAgICBsb2NfYWdwc19vcGVuX2ZhaWxlZAotCi1ERVNDUklQVElPTgotICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBvbi1kZW1hbmQgZGF0YSBjb25uZWN0aW9uIG9wZW5pbmcgaGFzIGZhaWxlZC4KLUl0IHNob3VsZCBpbmZvcm0gQVJNIDkgYWJvdXQgdGhlIGRhdGEgb3BlbiByZXN1bHQuCi0KLURFUEVOREVOQ0lFUwotICAgTk9ORQotCi1SRVRVUk4gVkFMVUUKLSAgIDAKLQotU0lERSBFRkZFQ1RTCi0gICBOL0EKLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLWludCBsb2NfYWdwc19vcGVuX2ZhaWxlZCgpCi17Ci0gICAgRU5UUllfTE9HKCk7Ci0gICAgQUdwc1R5cGUgYWdwc1R5cGUgPSBBR1BTX1RZUEVfU1VQTDsKLSAgICBpbnQgcmV0X3ZhbCA9IGxvY19lbmdfYWdwc19vcGVuX2ZhaWxlZChsb2NfYWZ3X2RhdGEsIGFncHNUeXBlKTsKLQotICAgIEVYSVRfTE9HKCVkLCByZXRfdmFsKTsKLSAgICByZXR1cm4gcmV0X3ZhbDsKLX0KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLUZVTkNUSU9OICAgIGxvY19hZ3BzX3NldF9zZXJ2ZXIKLQotREVTQ1JJUFRJT04KLSAgIElmIGxvY19lbmdfc2V0X3NlcnZlciBpcyBjYWxsZWQgYmVmb3JlIGxvY19lbmdfaW5pdCwgaXQgZG9lc24ndCB3b3JrLiBUaGlzCi0gICBwcm94eSBidWZmZXJzIHNlcnZlciBzZXR0aW5ncyBhbmQgY2FsbHMgbG9jX2VuZ19zZXRfc2VydmVyIHdoZW4gdGhlIGNsaWVudCBpcwotICAgb3Blbi4KLQotREVQRU5ERU5DSUVTCi0gICBOT05FCi0KLVJFVFVSTiBWQUxVRQotICAgMAotCi1TSURFIEVGRkVDVFMKLSAgIE4vQQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotc3RhdGljIGludCBsb2NfYWdwc19zZXRfc2VydmVyKEFHcHNUeXBlIHR5cGUsIGNvbnN0IGNoYXIqIGhvc3RuYW1lLCBpbnQgcG9ydCkKLXsKLSAgICBFTlRSWV9MT0coKTsKLSAgICBMb2NTZXJ2ZXJUeXBlIHNlcnZlclR5cGU7Ci0gICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgY2FzZSBBR1BTX1RZUEVfU1VQTDoKLSAgICAgICAgc2VydmVyVHlwZSA9IExPQ19BR1BTX1NVUExfU0VSVkVSOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEFHUFNfVFlQRV9DMks6Ci0gICAgICAgIHNlcnZlclR5cGUgPSBMT0NfQUdQU19DRE1BX1BERV9TRVJWRVI7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIHNlcnZlclR5cGUgPSBMT0NfQUdQU19TVVBMX1NFUlZFUjsKLSAgICB9Ci0gICAgaW50IHJldF92YWwgPSBsb2NfZW5nX3NldF9zZXJ2ZXJfcHJveHkobG9jX2Fmd19kYXRhLCBzZXJ2ZXJUeXBlLCBob3N0bmFtZSwgcG9ydCk7Ci0KLSAgICBFWElUX0xPRyglZCwgcmV0X3ZhbCk7Ci0gICAgcmV0dXJuIHJldF92YWw7Ci19Ci0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1GVU5DVElPTmY1NzEKLSAgICBsb2NfeHRyYV9pbml0Ci0KLURFU0NSSVBUSU9OCi0gICBJbml0aWFsaXplIFhUUkEgbW9kdWxlLgotCi1ERVBFTkRFTkNJRVMKLSAgIE5vbmUKLQotUkVUVVJOIFZBTFVFCi0gICAwOiBzdWNjZXNzCi0KLVNJREUgRUZGRUNUUwotICAgTi9BCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi1zdGF0aWMgaW50IGxvY194dHJhX2luaXQoR3BzWHRyYUNhbGxiYWNrcyogY2FsbGJhY2tzKQotewotICAgIEVOVFJZX0xPRygpOwotICAgIEdwc1h0cmFFeHRDYWxsYmFja3MgZXh0X2NhbGxiYWNrczsKLSAgICBleHRfY2FsbGJhY2tzLmRvd25sb2FkX3JlcXVlc3RfY2IgPSBjYWxsYmFja3MtPmRvd25sb2FkX3JlcXVlc3RfY2I7Ci0gICAgZXh0X2NhbGxiYWNrcy5jcmVhdGVfdGhyZWFkX2NiID0gY2FsbGJhY2tzLT5jcmVhdGVfdGhyZWFkX2NiOwotICAgIGV4dF9jYWxsYmFja3MucmVwb3J0X3h0cmFfc2VydmVyX2NiID0gTlVMTDsKLSAgICBpbnQgcmV0X3ZhbCA9IGxvY19lbmdfeHRyYV9pbml0KGxvY19hZndfZGF0YSwgJmV4dF9jYWxsYmFja3MpOwotCi0gICAgRVhJVF9MT0coJWQsIHJldF92YWwpOwotICAgIHJldHVybiByZXRfdmFsOwotfQotCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1GVU5DVElPTiAgICBsb2NfeHRyYV9pbmplY3RfZGF0YQotCi1ERVNDUklQVElPTgotICAgSW5pdGlhbGl6ZSBYVFJBIG1vZHVsZS4KLQotREVQRU5ERU5DSUVTCi0gICBOb25lCi0KLVJFVFVSTiBWQUxVRQotICAgMDogc3VjY2VzcwotCi1TSURFIEVGRkVDVFMKLSAgIE4vQQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotc3RhdGljIGludCBsb2NfeHRyYV9pbmplY3RfZGF0YShjaGFyKiBkYXRhLCBpbnQgbGVuZ3RoKQotewotICAgIEVOVFJZX0xPRygpOwotICAgIGludCByZXRfdmFsID0gLTE7Ci0gICAgaWYoIChkYXRhICE9IE5VTEwpICYmICgodW5zaWduZWQgaW50KWxlbmd0aCA8PSBYVFJBX0RBVEFfTUFYX1NJWkUpKQotICAgICAgICByZXRfdmFsID0gbG9jX2VuZ194dHJhX2luamVjdF9kYXRhKGxvY19hZndfZGF0YSwgZGF0YSwgbGVuZ3RoKTsKLSAgICBlbHNlCi0gICAgICAgIExPQ19MT0dFKCIlcywgQ291bGQgbm90IGluamVjdCBYVFJBIGRhdGEuIEJ1ZmZlciBhZGRyZXNzOiAlcCwgbGVuZ3RoOiAlZCIsCi0gICAgICAgICAgICAgICAgX19mdW5jX18sIGRhdGEsIGxlbmd0aCk7Ci0gICAgRVhJVF9MT0coJWQsIHJldF92YWwpOwotICAgIHJldHVybiByZXRfdmFsOwotfQotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotRlVOQ1RJT04gICAgbG9jX2dwc19tZWFzdXJlbWVudF9pbml0Ci0KLURFU0NSSVBUSU9OCi0gICBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSBncHMgbWVhc3VyZW1lbnQgaW50ZXJmYWNlCi0KLURFUEVOREVOQ0lFUwotICAgTk9ORQotCi1SRVRVUk4gVkFMVUUKLSAgIE5vbmUKLQotU0lERSBFRkZFQ1RTCi0gICBOL0EKLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLXN0YXRpYyBpbnQgbG9jX2dwc19tZWFzdXJlbWVudF9pbml0KEdwc01lYXN1cmVtZW50Q2FsbGJhY2tzKiBjYWxsYmFja3MpCi17Ci0gICAgRU5UUllfTE9HKCk7Ci0gICAgaW50IHJldF92YWwgPSBsb2NfZW5nX2dwc19tZWFzdXJlbWVudF9pbml0KGxvY19hZndfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzKTsKLQotICAgIEVYSVRfTE9HKCVkLCByZXRfdmFsKTsKLSAgICByZXR1cm4gcmV0X3ZhbDsKLX0KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLUZVTkNUSU9OICAgIGxvY19ncHNfbWVhc3VyZW1lbnRfY2xvc2UKLQotREVTQ1JJUFRJT04KLSAgIFRoaXMgZnVuY3Rpb24gY2xvc2VzIHRoZSBncHMgbWVhc3VyZW1lbnQgaW50ZXJmYWNlCi0KLURFUEVOREVOQ0lFUwotICAgTk9ORQotCi1SRVRVUk4gVkFMVUUKLSAgIE5vbmUKLQotU0lERSBFRkZFQ1RTCi0gICBOL0EKLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLXN0YXRpYyB2b2lkIGxvY19ncHNfbWVhc3VyZW1lbnRfY2xvc2UoKQotewotICAgIEVOVFJZX0xPRygpOwotICAgIGxvY19lbmdfZ3BzX21lYXN1cmVtZW50X2Nsb3NlKGxvY19hZndfZGF0YSk7Ci0KLSAgICBFWElUX0xPRyglcywgVk9JRF9SRVQpOwotfQotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotRlVOQ1RJT04gICAgbG9jX25pX2luaXQKLQotREVTQ1JJUFRJT04KLSAgIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIE5JIGludGVyZmFjZQotCi1ERVBFTkRFTkNJRVMKLSAgIE5PTkUKLQotUkVUVVJOIFZBTFVFCi0gICBOb25lCi0KLVNJREUgRUZGRUNUUwotICAgTi9BCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi12b2lkIGxvY19uaV9pbml0KEdwc05pQ2FsbGJhY2tzICpjYWxsYmFja3MpCi17Ci0gICAgRU5UUllfTE9HKCk7Ci0gICAgbG9jX2VuZ19uaV9pbml0KGxvY19hZndfZGF0YSwoR3BzTmlFeHRDYWxsYmFja3MqKSBjYWxsYmFja3MpOwotICAgIEVYSVRfTE9HKCVzLCBWT0lEX1JFVCk7Ci19Ci0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1GVU5DVElPTiAgICBsb2NfbmlfcmVzcG9uZAotCi1ERVNDUklQVElPTgotICAgVGhpcyBmdW5jdGlvbiBzZW5kcyBhbiBOSSByZXNwb25kIHRvIHRoZSBtb2RlbSBwcm9jZXNzb3IKLQotREVQRU5ERU5DSUVTCi0gICBOT05FCi0KLVJFVFVSTiBWQUxVRQotICAgTm9uZQotCi1TSURFIEVGRkVDVFMKLSAgIE4vQQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotdm9pZCBsb2NfbmlfcmVzcG9uZChpbnQgbm90aWZfaWQsIEdwc1VzZXJSZXNwb25zZVR5cGUgdXNlcl9yZXNwb25zZSkKLXsKLSAgICBFTlRSWV9MT0coKTsKLSAgICBsb2NfZW5nX25pX3Jlc3BvbmQobG9jX2Fmd19kYXRhLCBub3RpZl9pZCwgdXNlcl9yZXNwb25zZSk7Ci0gICAgRVhJVF9MT0coJXMsIFZPSURfUkVUKTsKLX0KLQotLy8gQmVsb3cgc3R1YiBmdW5jdGlvbnMgYXJlIG1lbWJlcnMgb2Ygc0xvY0VuZ0FHcHNSaWxJbnRlcmZhY2UKLXN0YXRpYyB2b2lkIGxvY19hZ3BzX3JpbF9pbml0KCBBR3BzUmlsQ2FsbGJhY2tzKiBjYWxsYmFja3MgKSB7fQotc3RhdGljIHZvaWQgbG9jX2FncHNfcmlsX3NldF9yZWZfbG9jYXRpb24oY29uc3QgQUdwc1JlZkxvY2F0aW9uICphZ3BzX3JlZmxvY2F0aW9uLCBzaXplX3Qgc3pfc3RydWN0KSB7fQotc3RhdGljIHZvaWQgbG9jX2FncHNfcmlsX3NldF9zZXRfaWQoQUdwc1NldElEVHlwZSB0eXBlLCBjb25zdCBjaGFyKiBzZXRpZCkge30KLXN0YXRpYyB2b2lkIGxvY19hZ3BzX3JpbF9uaV9tZXNzYWdlKHVpbnQ4X3QgKm1zZywgc2l6ZV90IGxlbikge30KLXN0YXRpYyB2b2lkIGxvY19hZ3BzX3JpbF91cGRhdGVfbmV0d29ya19zdGF0ZShpbnQgY29ubmVjdGVkLCBpbnQgdHlwZSwgaW50IHJvYW1pbmcsIGNvbnN0IGNoYXIqIGV4dHJhX2luZm8pIHt9Ci0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1GVU5DVElPTiAgICBsb2NfYWdwc19yaWxfdXBkYXRlX25ldHdvcmtfYXZhaWxhYmlsaXR5Ci0KLURFU0NSSVBUSU9OCi0gICBTZXRzIGRhdGEgY2FsbCBhbGxvdyB2cyBkaXNhbGxvdyBmbGFnIHRvIG1vZGVtCi0gICBUaGlzIGlzIHRoZSBvbmx5IG1lbWJlciBvZiBzTG9jRW5nQUdwc1JpbEludGVyZmFjZSBpbXBsZW1lbnRlZC4KLQotREVQRU5ERU5DSUVTCi0gICBOb25lCi0KLVJFVFVSTiBWQUxVRQotICAgMDogc3VjY2VzcwotCi1TSURFIEVGRkVDVFMKLSAgIE4vQQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotc3RhdGljIHZvaWQgbG9jX2FncHNfcmlsX3VwZGF0ZV9uZXR3b3JrX2F2YWlsYWJpbGl0eShpbnQgYXZhaWxhYmxlLCBjb25zdCBjaGFyKiBhcG4pCi17Ci0gICAgRU5UUllfTE9HKCk7Ci0gICAgbG9jX2VuZ19hZ3BzX3JpbF91cGRhdGVfbmV0d29ya19hdmFpbGFiaWxpdHkobG9jX2Fmd19kYXRhLCBhdmFpbGFibGUsIGFwbik7Ci0gICAgRVhJVF9MT0coJXMsIFZPSURfUkVUKTsKLX0KLQotc3RhdGljIGludCBsb2NfYWdwc19pbnN0YWxsX2NlcnRpZmljYXRlcyhjb25zdCBEZXJFbmNvZGVkQ2VydGlmaWNhdGUqIGNlcnRpZmljYXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbmd0aCkKLXsKLSAgICBFTlRSWV9MT0coKTsKLSAgICBpbnQgcmV0X3ZhbCA9IGxvY19lbmdfYWdwc19pbnN0YWxsX2NlcnRpZmljYXRlcyhsb2NfYWZ3X2RhdGEsIGNlcnRpZmljYXRlcywgbGVuZ3RoKTsKLSAgICBFWElUX0xPRyglZCwgcmV0X3ZhbCk7Ci0gICAgcmV0dXJuIHJldF92YWw7Ci19Ci1zdGF0aWMgaW50IGxvY19hZ3BzX3Jldm9rZV9jZXJ0aWZpY2F0ZXMoY29uc3QgU2hhMUNlcnRpZmljYXRlRmluZ2VycHJpbnQqIGZpbmdlcnByaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuZ3RoKQotewotICAgIEVOVFJZX0xPRygpOwotICAgIExPQ19MT0dFKCJhZ3BzX3Jldm9rZV9jZXJ0aWZpY2F0ZXMgbm90IHN1cHBvcnRlZCIpOwotICAgIGludCByZXRfdmFsID0gQUdQU19DRVJUSUZJQ0FURV9FUlJPUl9HRU5FUklDOwotICAgIEVYSVRfTE9HKCVkLCByZXRfdmFsKTsKLSAgICByZXR1cm4gcmV0X3ZhbDsKLX0KLQotc3RhdGljIHZvaWQgbG9jX2NvbmZpZ3VyYXRpb25fdXBkYXRlKGNvbnN0IGNoYXIqIGNvbmZpZ19kYXRhLCBpbnQzMl90IGxlbmd0aCkKLXsKLSAgICBFTlRSWV9MT0coKTsKLSAgICBsb2NfZW5nX2NvbmZpZ3VyYXRpb25fdXBkYXRlKGxvY19hZndfZGF0YSwgY29uZmlnX2RhdGEsIGxlbmd0aCk7Ci0gICAgRVhJVF9MT0coJXMsIFZPSURfUkVUKTsKLX0KLQotc3RhdGljIHZvaWQgbG9jYWxfbG9jX2NiKFVscExvY2F0aW9uKiBsb2NhdGlvbiwgdm9pZCogbG9jRXh0KQotewotICAgIEVOVFJZX0xPRygpOwotICAgIGlmIChOVUxMICE9IGxvY2F0aW9uKSB7Ci0gICAgICAgIENBTExCQUNLX0xPR19DQUxMRkxPVygibG9jYXRpb25fY2IgLSBmcm9tIiwgJWQsIGxvY2F0aW9uLT5wb3NpdGlvbl9zb3VyY2UpOwotCi0gICAgICAgIGlmIChOVUxMICE9IGdwc19sb2NfY2IpIHsKLSAgICAgICAgICAgIGdwc19sb2NfY2IoJmxvY2F0aW9uLT5ncHNMb2NhdGlvbik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgRVhJVF9MT0coJXMsIFZPSURfUkVUKTsKLX0KLQotc3RhdGljIHZvaWQgbG9jYWxfc3ZfY2IoR3BzU3ZTdGF0dXMqIHN2X3N0YXR1cywgdm9pZCogc3ZFeHQpCi17Ci0gICAgRU5UUllfTE9HKCk7Ci0gICAgaWYgKE5VTEwgIT0gZ3BzX3N2X2NiKSB7Ci0gICAgICAgIENBTExCQUNLX0xPR19DQUxMRkxPVygic3Zfc3RhdHVzX2NiIC0iLCAlZCwgc3Zfc3RhdHVzLT5udW1fc3ZzKTsKLSAgICAgICAgZ3BzX3N2X2NiKHN2X3N0YXR1cyk7Ci0gICAgfQotICAgIEVYSVRfTE9HKCVzLCBWT0lEX1JFVCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGxvY19hZ3BzX3N0YXR1c19jYihBR3BzU3RhdHVzKiBzdGF0dXMpCi17Ci0gICAgRU5UUllfTE9HKCk7Ci0KLSAgICBpZiAoTlVMTCAhPSBhZ3BzX3N0YXR1c19jYikgewotICAgICAgICBzaXplX3QgcmVhbFNpemUgPSBzaXplb2YoQUdwc1N0YXR1cyk7Ci0gICAgICAgIExPQ19MT0dEKCJhZ3BzX3N0YXR1cyBzaXplPSVkIHJlYWwtc2l6ZT0lZCIsIHN0YXR1cy0+c2l6ZSwgcmVhbFNpemUpOwotICAgICAgICBzdGF0dXMtPnNpemUgPSByZWFsU2l6ZTsKLSAgICAgICAgYWdwc19zdGF0dXNfY2Ioc3RhdHVzKTsKLSAgICB9Ci0gICAgRVhJVF9MT0coJXMsIFZPSURfUkVUKTsKLX0KLQpkaWZmIC0tZ2l0IGEvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGlfNTAwMDEvbG9jLmggYi9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaV81MDAwMS9sb2MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJmY2JlMC4uMDAwMDAwMAotLS0gYS9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaV81MDAwMS9sb2MuaAorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMS0yMDEzLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZwotICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCi0gKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uLCBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAotICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgotICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCi0gKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQotICogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgotICogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpZm5kZWYgX19MT0NfSF9fCi0jZGVmaW5lIF9fTE9DX0hfXwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvZ3BzLmg+Ci0jaW5jbHVkZSA8Z3BzX2V4dGVuZGVkLmg+Ci0KLSNkZWZpbmUgWFRSQV9EQVRBX01BWF9TSVpFIDEwMDAwMCAvKmJ5dGVzKi8KLQotdHlwZWRlZiB2b2lkICgqbG9jX2xvY2F0aW9uX2NiX2V4dCkgKFVscExvY2F0aW9uKiBsb2NhdGlvbiwgdm9pZCogbG9jRXh0KTsKLXR5cGVkZWYgdm9pZCAoKmxvY19zdl9zdGF0dXNfY2JfZXh0KSAoR3BzU3ZTdGF0dXMqIHN2X3N0YXR1cywgdm9pZCogc3ZFeHQpOwotdHlwZWRlZiB2b2lkKiAoKmxvY19leHRfcGFyc2VyKSh2b2lkKiBkYXRhKTsKLXR5cGVkZWYgdm9pZCAoKmxvY19zaHV0ZG93bl9jYikgKHZvaWQpOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgbG9jX2xvY2F0aW9uX2NiX2V4dCBsb2NhdGlvbl9jYjsKLSAgICBncHNfc3RhdHVzX2NhbGxiYWNrIHN0YXR1c19jYjsKLSAgICBsb2Nfc3Zfc3RhdHVzX2NiX2V4dCBzdl9zdGF0dXNfY2I7Ci0gICAgZ3BzX25tZWFfY2FsbGJhY2sgbm1lYV9jYjsKLSAgICBncHNfc2V0X2NhcGFiaWxpdGllcyBzZXRfY2FwYWJpbGl0aWVzX2NiOwotICAgIGdwc19hY3F1aXJlX3dha2Vsb2NrIGFjcXVpcmVfd2FrZWxvY2tfY2I7Ci0gICAgZ3BzX3JlbGVhc2Vfd2FrZWxvY2sgcmVsZWFzZV93YWtlbG9ja19jYjsKLSAgICBncHNfY3JlYXRlX3RocmVhZCBjcmVhdGVfdGhyZWFkX2NiOwotICAgIGxvY19leHRfcGFyc2VyIGxvY2F0aW9uX2V4dF9wYXJzZXI7Ci0gICAgbG9jX2V4dF9wYXJzZXIgc3ZfZXh0X3BhcnNlcjsKLSAgICBncHNfcmVxdWVzdF91dGNfdGltZSByZXF1ZXN0X3V0Y190aW1lX2NiOwotICAgIGxvY19zaHV0ZG93bl9jYiBzaHV0ZG93bl9jYjsKLX0gTG9jQ2FsbGJhY2tzOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jZW5kaWYgLy9fX0xPQ19IX18KZGlmZiAtLWdpdCBhL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpXzUwMDAxL2xvY19lbmcuY3BwIGIvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGlfNTAwMDEvbG9jX2VuZy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiYTVmZmEuLjAwMDAwMDAKLS0tIGEvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGlfNTAwMDEvbG9jX2VuZy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzMDI0ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAwOS0yMDE0LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZwotICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCi0gKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uLCBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAotICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgotICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCi0gKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQotICogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgotICogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNkZWZpbmUgTE9HX05EREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJMb2NTdmNfZW5nIgotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxkbGZjbi5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8bWF0aC5oPgotI2luY2x1ZGUgPHB0aHJlYWQuaD4KLSNpbmNsdWRlIDxhcnBhL2luZXQuaD4KLSNpbmNsdWRlIDxuZXRpbmV0L2luLmg+ICAgICAgICAgLyogc3RydWN0IHNvY2thZGRyX2luICovCi0jaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jaW5jbHVkZSA8bmV0ZGIuaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0jaW5jbHVkZSA8bmV3PgotI2luY2x1ZGUgPExvY0VuZ0FkYXB0ZXIuaD4KLQotI2luY2x1ZGUgPGN1dGlscy9zY2hlZF9wb2xpY3kuaD4KLSNpZm5kZWYgVVNFX0dMSUIKLSNpbmNsdWRlIDx1dGlscy9TeXN0ZW1DbG9jay5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2VuZGlmIC8qIFVTRV9HTElCICovCi0KLSNpZmRlZiBVU0VfR0xJQgotI2luY2x1ZGUgPGdsaWIuaD4KLSNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgotI2VuZGlmIC8qIFVTRV9HTElCICovCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPGxvY19lbmcuaD4KLSNpbmNsdWRlIDxsb2NfZW5nX25pLmg+Ci0jaW5jbHVkZSA8bG9jX2VuZ19kbW5fY29ubi5oPgotI2luY2x1ZGUgPGxvY19lbmdfZG1uX2Nvbm5faGFuZGxlci5oPgotI2luY2x1ZGUgPGxvY19lbmdfbXNnLmg+Ci0jaW5jbHVkZSA8bG9jX2VuZ19ubWVhLmg+Ci0jaW5jbHVkZSA8bXNnX3EuaD4KLSNpbmNsdWRlIDxsb2MuaD4KLSNpbmNsdWRlICJsb2dfdXRpbC5oIgotI2luY2x1ZGUgInBsYXRmb3JtX2xpYl9pbmNsdWRlcy5oIgotI2luY2x1ZGUgImxvY19jb3JlX2xvZy5oIgotI2luY2x1ZGUgImxvY19lbmdfbG9nLmgiCi0KLSNkZWZpbmUgU1VDQ0VTUyBUUlVFCi0jZGVmaW5lIEZBSUxVUkUgRkFMU0UKLQotI2lmbmRlZiBHUFNfQ09ORl9GSUxFCi0jZGVmaW5lIEdQU19DT05GX0ZJTEUgICAgICAgICAgICAiL2V0Yy9ncHMuY29uZiIgICAvLz8/PyBwbGF0Zm9ybSBpbmRlcGVuZGVudAotI2VuZGlmCi0KLSNpZm5kZWYgU0FQX0NPTkZfRklMRQotI2RlZmluZSBTQVBfQ09ORl9GSUxFICAgICAgICAgICAgIi9ldGMvc2FwLmNvbmYiCi0jZW5kaWYKLQotI2RlZmluZSBYVFJBMV9HUFNPTkVYVFJBICAgICAgICAgInh0cmExLmdwc29uZXh0cmEubmV0IgotCi11c2luZyBuYW1lc3BhY2UgbG9jX2NvcmU7Ci0KLWJvb2xlYW4gY29uZmlnQWxyZWFkeVJlYWQgPSBmYWxzZTsKLXVuc2lnbmVkIGludCBhZ3BzU3RhdHVzID0gMDsKLWxvY19ncHNfY2ZnX3NfdHlwZSBncHNfY29uZjsKLWxvY19zYXBfY2ZnX3NfdHlwZSBzYXBfY29uZjsKLQotLyogUGFyYW1ldGVyIHNwZWMgdGFibGUgKi8KLXN0YXRpYyBsb2NfcGFyYW1fc190eXBlIGdwc19jb25mX3RhYmxlW10gPQotewotICB7IkdQU19MT0NLIiwgICAgICAgICAgICAgICAgICAgICAgICZncHNfY29uZi5HUFNfTE9DSywgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICduJ30sCi0gIHsiU1VQTF9WRVIiLCAgICAgICAgICAgICAgICAgICAgICAgJmdwc19jb25mLlNVUExfVkVSLCAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgJ24nfSwKLSAgeyJMUFBfUFJPRklMRSIsICAgICAgICAgICAgICAgICAgICAmZ3BzX2NvbmYuTFBQX1BST0ZJTEUsICAgICAgICAgICAgICAgICAgICBOVUxMLCAnbid9LAotICB7IkFfR0xPTkFTU19QT1NfUFJPVE9DT0xfU0VMRUNUIiwgICZncHNfY29uZi5BX0dMT05BU1NfUE9TX1BST1RPQ09MX1NFTEVDVCwgIE5VTEwsICduJ30sCi0gIHsiQUdQU19DRVJUX1dSSVRBQkxFX01BU0siLCAgICAgICAgJmdwc19jb25mLkFHUFNfQ0VSVF9XUklUQUJMRV9NQVNLLCAgICAgICAgTlVMTCwgJ24nfSwKLSAgeyJJTlRFUk1FRElBVEVfUE9TIiwgICAgICAgICAgICAgICAmZ3BzX2NvbmYuSU5URVJNRURJQVRFX1BPUywgICAgICAgICAgICAgICBOVUxMLCAnbid9LAotICB7IkFDQ1VSQUNZX1RIUkVTIiwgICAgICAgICAgICAgICAgICZncHNfY29uZi5BQ0NVUkFDWV9USFJFUywgICAgICAgICAgICAgICAgIE5VTEwsICduJ30sCi0gIHsiTk1FQV9QUk9WSURFUiIsICAgICAgICAgICAgICAgICAgJmdwc19jb25mLk5NRUFfUFJPVklERVIsICAgICAgICAgICAgICAgICAgTlVMTCwgJ24nfSwKLSAgeyJDQVBBQklMSVRJRVMiLCAgICAgICAgICAgICAgICAgICAmZ3BzX2NvbmYuQ0FQQUJJTElUSUVTLCAgICAgICAgICAgICAgICAgICBOVUxMLCAnbid9LAotfTsKLQotc3RhdGljIGxvY19wYXJhbV9zX3R5cGUgc2FwX2NvbmZfdGFibGVbXSA9Ci17Ci0gIHsiR1lST19CSUFTX1JBTkRPTV9XQUxLIiwgICAgICAgICAgJnNhcF9jb25mLkdZUk9fQklBU19SQU5ET01fV0FMSywgICAgICAgICAgJnNhcF9jb25mLkdZUk9fQklBU19SQU5ET01fV0FMS19WQUxJRCwgJ2YnfSwKLSAgeyJBQ0NFTF9SQU5ET01fV0FMS19TUEVDVFJBTF9ERU5TSVRZIiwgICAgICZzYXBfY29uZi5BQ0NFTF9SQU5ET01fV0FMS19TUEVDVFJBTF9ERU5TSVRZLCAgICAmc2FwX2NvbmYuQUNDRUxfUkFORE9NX1dBTEtfU1BFQ1RSQUxfREVOU0lUWV9WQUxJRCwgJ2YnfSwKLSAgeyJBTkdMRV9SQU5ET01fV0FMS19TUEVDVFJBTF9ERU5TSVRZIiwgICAgICZzYXBfY29uZi5BTkdMRV9SQU5ET01fV0FMS19TUEVDVFJBTF9ERU5TSVRZLCAgICAmc2FwX2NvbmYuQU5HTEVfUkFORE9NX1dBTEtfU1BFQ1RSQUxfREVOU0lUWV9WQUxJRCwgJ2YnfSwKLSAgeyJSQVRFX1JBTkRPTV9XQUxLX1NQRUNUUkFMX0RFTlNJVFkiLCAgICAgICZzYXBfY29uZi5SQVRFX1JBTkRPTV9XQUxLX1NQRUNUUkFMX0RFTlNJVFksICAgICAmc2FwX2NvbmYuUkFURV9SQU5ET01fV0FMS19TUEVDVFJBTF9ERU5TSVRZX1ZBTElELCAnZid9LAotICB7IlZFTE9DSVRZX1JBTkRPTV9XQUxLX1NQRUNUUkFMX0RFTlNJVFkiLCAgJnNhcF9jb25mLlZFTE9DSVRZX1JBTkRPTV9XQUxLX1NQRUNUUkFMX0RFTlNJVFksICZzYXBfY29uZi5WRUxPQ0lUWV9SQU5ET01fV0FMS19TUEVDVFJBTF9ERU5TSVRZX1ZBTElELCAnZid9LAotICB7IlNFTlNPUl9BQ0NFTF9CQVRDSEVTX1BFUl9TRUMiLCAgICZzYXBfY29uZi5TRU5TT1JfQUNDRUxfQkFUQ0hFU19QRVJfU0VDLCAgIE5VTEwsICduJ30sCi0gIHsiU0VOU09SX0FDQ0VMX1NBTVBMRVNfUEVSX0JBVENIIiwgJnNhcF9jb25mLlNFTlNPUl9BQ0NFTF9TQU1QTEVTX1BFUl9CQVRDSCwgTlVMTCwgJ24nfSwKLSAgeyJTRU5TT1JfR1lST19CQVRDSEVTX1BFUl9TRUMiLCAgICAmc2FwX2NvbmYuU0VOU09SX0dZUk9fQkFUQ0hFU19QRVJfU0VDLCAgICBOVUxMLCAnbid9LAotICB7IlNFTlNPUl9HWVJPX1NBTVBMRVNfUEVSX0JBVENIIiwgICZzYXBfY29uZi5TRU5TT1JfR1lST19TQU1QTEVTX1BFUl9CQVRDSCwgIE5VTEwsICduJ30sCi0gIHsiU0VOU09SX0FDQ0VMX0JBVENIRVNfUEVSX1NFQ19ISUdIIiwgICAmc2FwX2NvbmYuU0VOU09SX0FDQ0VMX0JBVENIRVNfUEVSX1NFQ19ISUdILCAgIE5VTEwsICduJ30sCi0gIHsiU0VOU09SX0FDQ0VMX1NBTVBMRVNfUEVSX0JBVENIX0hJR0giLCAmc2FwX2NvbmYuU0VOU09SX0FDQ0VMX1NBTVBMRVNfUEVSX0JBVENIX0hJR0gsIE5VTEwsICduJ30sCi0gIHsiU0VOU09SX0dZUk9fQkFUQ0hFU19QRVJfU0VDX0hJR0giLCAgICAmc2FwX2NvbmYuU0VOU09SX0dZUk9fQkFUQ0hFU19QRVJfU0VDX0hJR0gsICAgIE5VTEwsICduJ30sCi0gIHsiU0VOU09SX0dZUk9fU0FNUExFU19QRVJfQkFUQ0hfSElHSCIsICAmc2FwX2NvbmYuU0VOU09SX0dZUk9fU0FNUExFU19QRVJfQkFUQ0hfSElHSCwgIE5VTEwsICduJ30sCi0gIHsiU0VOU09SX0NPTlRST0xfTU9ERSIsICAgICAgICAgICAgJnNhcF9jb25mLlNFTlNPUl9DT05UUk9MX01PREUsICAgICAgICAgICAgTlVMTCwgJ24nfSwKLSAgeyJTRU5TT1JfVVNBR0UiLCAgICAgICAgICAgICAgICAgICAmc2FwX2NvbmYuU0VOU09SX1VTQUdFLCAgICAgICAgICAgICAgICAgICBOVUxMLCAnbid9LAotICB7IlNFTlNPUl9BTEdPUklUSE1fQ09ORklHX01BU0siLCAgICZzYXBfY29uZi5TRU5TT1JfQUxHT1JJVEhNX0NPTkZJR19NQVNLLCAgIE5VTEwsICduJ30sCi0gIHsiU0VOU09SX1BST1ZJREVSIiwgICAgICAgICAgICAgICAgJnNhcF9jb25mLlNFTlNPUl9QUk9WSURFUiwgICAgICAgICAgICAgICAgTlVMTCwgJ24nfSwKLSAgeyJYVFJBX1NFUlZFUl8xIiwgICAgICAgICAgICAgICAgICAmZ3BzX2NvbmYuWFRSQV9TRVJWRVJfMSwgICAgICAgICAgICAgICAgICBOVUxMLCAncyd9LAotICB7IlhUUkFfU0VSVkVSXzIiLCAgICAgICAgICAgICAgICAgICZncHNfY29uZi5YVFJBX1NFUlZFUl8yLCAgICAgICAgICAgICAgICAgIE5VTEwsICdzJ30sCi0gIHsiWFRSQV9TRVJWRVJfMyIsICAgICAgICAgICAgICAgICAgJmdwc19jb25mLlhUUkFfU0VSVkVSXzMsICAgICAgICAgICAgICAgICAgTlVMTCwgJ3MnfQotfTsKLQotc3RhdGljIHZvaWQgbG9jX2RlZmF1bHRfcGFyYW1ldGVycyh2b2lkKQotewotICAgLyogZGVmYXVsdHMgKi8KLSAgIGdwc19jb25mLklOVEVSTUVESUFURV9QT1MgPSAwOwotICAgZ3BzX2NvbmYuQUNDVVJBQ1lfVEhSRVMgPSAwOwotICAgZ3BzX2NvbmYuTk1FQV9QUk9WSURFUiA9IDA7Ci0gICBncHNfY29uZi5HUFNfTE9DSyA9IDA7Ci0gICBncHNfY29uZi5TVVBMX1ZFUiA9IDB4MTAwMDA7Ci0gICBncHNfY29uZi5DQVBBQklMSVRJRVMgPSAweDc7Ci0KLSAgIHNhcF9jb25mLkdZUk9fQklBU19SQU5ET01fV0FMSyA9IDA7Ci0gICBzYXBfY29uZi5TRU5TT1JfQUNDRUxfQkFUQ0hFU19QRVJfU0VDID0gMjsKLSAgIHNhcF9jb25mLlNFTlNPUl9BQ0NFTF9TQU1QTEVTX1BFUl9CQVRDSCA9IDU7Ci0gICBzYXBfY29uZi5TRU5TT1JfR1lST19CQVRDSEVTX1BFUl9TRUMgPSAyOwotICAgc2FwX2NvbmYuU0VOU09SX0dZUk9fU0FNUExFU19QRVJfQkFUQ0ggPSA1OwotICAgc2FwX2NvbmYuU0VOU09SX0FDQ0VMX0JBVENIRVNfUEVSX1NFQ19ISUdIID0gNDsKLSAgIHNhcF9jb25mLlNFTlNPUl9BQ0NFTF9TQU1QTEVTX1BFUl9CQVRDSF9ISUdIID0gMjU7Ci0gICBzYXBfY29uZi5TRU5TT1JfR1lST19CQVRDSEVTX1BFUl9TRUNfSElHSCA9IDQ7Ci0gICBzYXBfY29uZi5TRU5TT1JfR1lST19TQU1QTEVTX1BFUl9CQVRDSF9ISUdIID0gMjU7Ci0gICBzYXBfY29uZi5TRU5TT1JfQ09OVFJPTF9NT0RFID0gMDsgLyogQVVUTyAqLwotICAgc2FwX2NvbmYuU0VOU09SX1VTQUdFID0gMDsgLyogRW5hYmxlZCAqLwotICAgc2FwX2NvbmYuU0VOU09SX0FMR09SSVRITV9DT05GSUdfTUFTSyA9IDA7IC8qIElOUyBEaXNhYmxlZCA9IEZBTFNFKi8KLQotICAgLyogVmFsdWVzIE1VU1QgYmUgc2V0IGJ5IE9FTXMgaW4gY29uZmlndXJhdGlvbiBmb3Igc2Vuc29yLWFzc2lzdGVkCi0gICAgICBuYXZpZ2F0aW9uIHRvIHdvcmsuIFRoZXJlIGFyZSBOTyBkZWZhdWx0IHZhbHVlcyAqLwotICAgc2FwX2NvbmYuQUNDRUxfUkFORE9NX1dBTEtfU1BFQ1RSQUxfREVOU0lUWSA9IDA7Ci0gICBzYXBfY29uZi5BTkdMRV9SQU5ET01fV0FMS19TUEVDVFJBTF9ERU5TSVRZID0gMDsKLSAgIHNhcF9jb25mLlJBVEVfUkFORE9NX1dBTEtfU1BFQ1RSQUxfREVOU0lUWSA9IDA7Ci0gICBzYXBfY29uZi5WRUxPQ0lUWV9SQU5ET01fV0FMS19TUEVDVFJBTF9ERU5TSVRZID0gMDsKLQotICAgc2FwX2NvbmYuR1lST19CSUFTX1JBTkRPTV9XQUxLX1ZBTElEID0gMDsKLSAgIHNhcF9jb25mLkFDQ0VMX1JBTkRPTV9XQUxLX1NQRUNUUkFMX0RFTlNJVFlfVkFMSUQgPSAwOwotICAgc2FwX2NvbmYuQU5HTEVfUkFORE9NX1dBTEtfU1BFQ1RSQUxfREVOU0lUWV9WQUxJRCA9IDA7Ci0gICBzYXBfY29uZi5SQVRFX1JBTkRPTV9XQUxLX1NQRUNUUkFMX0RFTlNJVFlfVkFMSUQgPSAwOwotICAgc2FwX2NvbmYuVkVMT0NJVFlfUkFORE9NX1dBTEtfU1BFQ1RSQUxfREVOU0lUWV9WQUxJRCA9IDA7Ci0KLSAgICAgIC8qIExURSBQb3NpdGlvbmluZyBQcm9maWxlIGNvbmZpZ3VyYXRpb24gaXMgZGlzYWJsZSBieSBkZWZhdWx0Ki8KLSAgIGdwc19jb25mLkxQUF9QUk9GSUxFID0gMDsKLQotICAgLypCeSBkZWZhdWx0IG5vIHBvc2l0aW9uaW5nIHByb3RvY29sIGlzIHNlbGVjdGVkIG9uIEEtR0xPTkFTUyBzeXN0ZW0qLwotICAgZ3BzX2NvbmYuQV9HTE9OQVNTX1BPU19QUk9UT0NPTF9TRUxFQ1QgPSAwOwotCi0gICAvKiBkZWZhdWx0IHByb3ZpZGVyIGlzIFNTQyAqLwotICAgc2FwX2NvbmYuU0VOU09SX1BST1ZJREVSID0gMTsKLQotICAgLyogTm9uZSBvZiB0aGUgMTAgc2xvdHMgZm9yIGFncHMgY2VydGlmaWNhdGVzIGFyZSB3cml0YWJsZSBieSBkZWZhdWx0ICovCi0gICBncHNfY29uZi5BR1BTX0NFUlRfV1JJVEFCTEVfTUFTSyA9IDA7Ci19Ci0KLS8vIDJuZCBoYWxmIG9mIGluaXQoKSwgc2luZ2xlZCBvdXQgZm9yCi0vLyBtb2RlbSByZXN0YXJ0IHRvIHVzZS4KLXN0YXRpYyBpbnQgbG9jX2VuZ19yZWluaXQobG9jX2VuZ19kYXRhX3NfdHlwZSAmbG9jX2VuZ19kYXRhKTsKLXN0YXRpYyB2b2lkIGxvY19lbmdfYWdwc19yZWluaXQobG9jX2VuZ19kYXRhX3NfdHlwZSAmbG9jX2VuZ19kYXRhKTsKLQotc3RhdGljIGludCBsb2NfZW5nX3NldF9zZXJ2ZXIobG9jX2VuZ19kYXRhX3NfdHlwZSAmbG9jX2VuZ19kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jU2VydmVyVHlwZSB0eXBlLCBjb25zdCBjaGFyICpob3N0bmFtZSwgaW50IHBvcnQpOwotLy8gSW50ZXJuYWwgZnVuY3Rpb25zCi1zdGF0aWMgdm9pZCBsb2NfaW5mb3JtX2dwc19zdGF0dXMobG9jX2VuZ19kYXRhX3NfdHlwZSAmbG9jX2VuZ19kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdwc1N0YXR1c1ZhbHVlIHN0YXR1cyk7Ci1zdGF0aWMgdm9pZCBsb2NfZW5nX3JlcG9ydF9zdGF0dXMobG9jX2VuZ19kYXRhX3NfdHlwZSAmbG9jX2VuZ19kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdwc1N0YXR1c1ZhbHVlIHN0YXR1cyk7Ci1zdGF0aWMgdm9pZCBsb2NfZW5nX3Byb2Nlc3NfY29ubl9yZXF1ZXN0KGxvY19lbmdfZGF0YV9zX3R5cGUgJmxvY19lbmdfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbm5IYW5kbGUsIEFHcHNUeXBlIGFncHNfdHlwZSk7Ci1zdGF0aWMgdm9pZCBsb2NfZW5nX2FncHNfY2xvc2Vfc3RhdHVzKGxvY19lbmdfZGF0YV9zX3R5cGUgJmxvY19lbmdfZGF0YSwgaW50IGlzX3N1Y2MpOwotc3RhdGljIHZvaWQgbG9jX2VuZ19oYW5kbGVfZW5naW5lX2Rvd24obG9jX2VuZ19kYXRhX3NfdHlwZSAmbG9jX2VuZ19kYXRhKSA7Ci1zdGF0aWMgdm9pZCBsb2NfZW5nX2hhbmRsZV9lbmdpbmVfdXAobG9jX2VuZ19kYXRhX3NfdHlwZSAmbG9jX2VuZ19kYXRhKSA7Ci0KLXN0YXRpYyBpbnQgbG9jX2VuZ19zdGFydF9oYW5kbGVyKGxvY19lbmdfZGF0YV9zX3R5cGUgJmxvY19lbmdfZGF0YSk7Ci1zdGF0aWMgaW50IGxvY19lbmdfc3RvcF9oYW5kbGVyKGxvY19lbmdfZGF0YV9zX3R5cGUgJmxvY19lbmdfZGF0YSk7Ci1zdGF0aWMgaW50IGxvY19lbmdfZ2V0X3pwcF9oYW5kbGVyKGxvY19lbmdfZGF0YV9zX3R5cGUgJmxvY19lbmdfZGF0YSk7Ci1zdGF0aWMgdm9pZCBsb2NfZW5nX2hhbmRsZV9zaHV0ZG93bihsb2NfZW5nX2RhdGFfc190eXBlICZsb2NfZW5nX2RhdGEpOwotc3RhdGljIHZvaWQgZGVsZXRlQWlkaW5nRGF0YShsb2NfZW5nX2RhdGFfc190eXBlICZsb2dFbmcpOwotc3RhdGljIEFncHNTdGF0ZU1hY2hpbmUqCi1nZXRBZ3BzU3RhdGVNYWNoaW5lKGxvY19lbmdfZGF0YV9zX3R5cGUmIGxvZ0VuZywgQUdwc0V4dFR5cGUgYWdwc1R5cGUpOwotc3RhdGljIGludCBkYXRhQ2FsbENiKHZvaWQgKmNiX2RhdGEpOwotc3RhdGljIHZvaWQgdXBkYXRlX2FpZGluZ19kYXRhX2Zvcl9kZWxldGlvbihsb2NfZW5nX2RhdGFfc190eXBlJiBsb2NfZW5nX2RhdGEpIHsKLSAgICBpZiAobG9jX2VuZ19kYXRhLmVuZ2luZV9zdGF0dXMgIT0gR1BTX1NUQVRVU19FTkdJTkVfT04gJiYKLSAgICAgICAgbG9jX2VuZ19kYXRhLmFpZGluZ19kYXRhX2Zvcl9kZWxldGlvbiAhPSAwKQotICAgIHsKLSAgICAgICAgbG9jX2VuZ19kYXRhLmFkYXB0ZXItPmRlbGV0ZUFpZGluZ0RhdGEobG9jX2VuZ19kYXRhLmFpZGluZ19kYXRhX2Zvcl9kZWxldGlvbik7Ci0gICAgICAgIGxvY19lbmdfZGF0YS5haWRpbmdfZGF0YV9mb3JfZGVsZXRpb24gPSAwOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQqIG5vUHJvYyh2b2lkKiBkYXRhKQotewotICAgIHJldHVybiBOVUxMOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGRlZmluaXRpb25zIG9mIHRoZSBzdGF0aWMgbWVzc2FnZXMgdXNlZCBpbiB0aGUgZmlsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8vICAgICAgICBjYXNlIExPQ19FTkdfTVNHX1JFUVVFU1RfTkk6Ci1Mb2NFbmdSZXF1ZXN0Tmk6OkxvY0VuZ1JlcXVlc3ROaSh2b2lkKiBsb2NFbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcHNOaU5vdGlmaWNhdGlvbiAmbm90aWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBkYXRhKSA6Ci0gICAgTG9jTXNnKCksIG1Mb2NFbmcobG9jRW5nKSwgbU5vdGlmeShub3RpZiksIG1QYXlsb2FkKGRhdGEpIHsKLSAgICBsb2NhbGxvZygpOwotfQotdm9pZCBMb2NFbmdSZXF1ZXN0Tmk6OnByb2MoKSBjb25zdCB7Ci0gICAgbG9jX2VuZ19uaV9yZXF1ZXN0X2hhbmRsZXIoKigobG9jX2VuZ19kYXRhX3NfdHlwZSopbUxvY0VuZyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1Ob3RpZnksIG1QYXlsb2FkKTsKLX0KLXZvaWQgTG9jRW5nUmVxdWVzdE5pOjpsb2NhbGxvZygpIGNvbnN0Ci17Ci0gICAgTE9DX0xPR1YoImlkOiAlZFxuICB0eXBlOiAlc1xuICBmbGFnczogJWRcbiAgdGltZSBvdXQ6ICVkXG4gICIKLSAgICAgICAgICAgICAiZGVmYXVsdCByZXNwb25zZTogJXNcbiAgcmVxdWVzdG9yIGlkIGVuY29kaW5nOiAlc1xuIgotICAgICAgICAgICAgICIgIHRleHQgZW5jb2Rpbmc6ICVzXG4gIHBhc3NUaHJvdWdoRGF0YTogJXAiLAotICAgICAgICAgICAgIG1Ob3RpZnkubm90aWZpY2F0aW9uX2lkLAotICAgICAgICAgICAgIGxvY19nZXRfbmlfdHlwZV9uYW1lKG1Ob3RpZnkubmlfdHlwZSksCi0gICAgICAgICAgICAgbU5vdGlmeS5ub3RpZnlfZmxhZ3MsCi0gICAgICAgICAgICAgbU5vdGlmeS50aW1lb3V0LAotICAgICAgICAgICAgIGxvY19nZXRfbmlfcmVzcG9uc2VfbmFtZShtTm90aWZ5LmRlZmF1bHRfcmVzcG9uc2UpLAotICAgICAgICAgICAgIGxvY19nZXRfbmlfZW5jb2RpbmdfbmFtZShtTm90aWZ5LnJlcXVlc3Rvcl9pZF9lbmNvZGluZyksCi0gICAgICAgICAgICAgbG9jX2dldF9uaV9lbmNvZGluZ19uYW1lKG1Ob3RpZnkudGV4dF9lbmNvZGluZyksCi0gICAgICAgICAgICAgbVBheWxvYWQpOwotfQotaW5saW5lIHZvaWQgTG9jRW5nUmVxdWVzdE5pOjpsb2coKSBjb25zdCB7Ci0gICAgbG9jYWxsb2coKTsKLX0KLQotLy8gICAgICAgIGNhc2UgTE9DX0VOR19NU0dfSU5GT1JNX05JX1JFU1BPTlNFOgotLy8gaW4gbG9jX2VuZ19uaS5jcHAKLQotLy8gICAgICAgIGNhc2UgTE9DX0VOR19NU0dfU1RBUlRfRklYOgotTG9jRW5nU3RhcnRGaXg6OkxvY0VuZ1N0YXJ0Rml4KExvY0VuZ0FkYXB0ZXIqIGFkYXB0ZXIpIDoKLSAgICBMb2NNc2coKSwgbUFkYXB0ZXIoYWRhcHRlcikKLXsKLSAgICBsb2NhbGxvZygpOwotfQotaW5saW5lIHZvaWQgTG9jRW5nU3RhcnRGaXg6OnByb2MoKSBjb25zdAotewotICAgIGxvY19lbmdfZGF0YV9zX3R5cGUqIGxvY0VuZyA9IChsb2NfZW5nX2RhdGFfc190eXBlKiltQWRhcHRlci0+Z2V0T3duZXIoKTsKLSAgICBsb2NfZW5nX3N0YXJ0X2hhbmRsZXIoKmxvY0VuZyk7Ci19Ci1pbmxpbmUgdm9pZCBMb2NFbmdTdGFydEZpeDo6bG9jYWxsb2coKSBjb25zdAotewotICAgIExPQ19MT0dWKCJMb2NFbmdTdGFydEZpeCIpOwotfQotaW5saW5lIHZvaWQgTG9jRW5nU3RhcnRGaXg6OmxvZygpIGNvbnN0Ci17Ci0gICAgbG9jYWxsb2coKTsKLX0KLXZvaWQgTG9jRW5nU3RhcnRGaXg6OnNlbmQoKSBjb25zdCB7Ci0gICAgbUFkYXB0ZXItPnNlbmRNc2codGhpcyk7Ci19Ci0KLS8vICAgICAgICBjYXNlIExPQ19FTkdfTVNHX1NUT1BfRklYOgotTG9jRW5nU3RvcEZpeDo6TG9jRW5nU3RvcEZpeChMb2NFbmdBZGFwdGVyKiBhZGFwdGVyKSA6Ci0gICAgTG9jTXNnKCksIG1BZGFwdGVyKGFkYXB0ZXIpCi17Ci0gICAgbG9jYWxsb2coKTsKLX0KLWlubGluZSB2b2lkIExvY0VuZ1N0b3BGaXg6OnByb2MoKSBjb25zdAotewotICAgIGxvY19lbmdfZGF0YV9zX3R5cGUqIGxvY0VuZyA9IChsb2NfZW5nX2RhdGFfc190eXBlKiltQWRhcHRlci0+Z2V0T3duZXIoKTsKLSAgICBsb2NfZW5nX3N0b3BfaGFuZGxlcigqbG9jRW5nKTsKLX0KLWlubGluZSB2b2lkIExvY0VuZ1N0b3BGaXg6OmxvY2FsbG9nKCkgY29uc3QKLXsKLSAgICBMT0NfTE9HVigiTG9jRW5nU3RvcEZpeCIpOwotfQotaW5saW5lIHZvaWQgTG9jRW5nU3RvcEZpeDo6bG9nKCkgY29uc3QKLXsKLSAgICBsb2NhbGxvZygpOwotfQotdm9pZCBMb2NFbmdTdG9wRml4OjpzZW5kKCkgY29uc3QgewotICAgIG1BZGFwdGVyLT5zZW5kTXNnKHRoaXMpOwotfQotCi0vLyAgICAgICAgY2FzZSBMT0NfRU5HX01TR19TRVRfUE9TSVRJT05fTU9ERToKLUxvY0VuZ1Bvc2l0aW9uTW9kZTo6TG9jRW5nUG9zaXRpb25Nb2RlKExvY0VuZ0FkYXB0ZXIqIGFkYXB0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NQb3NNb2RlICZtb2RlKSA6Ci0gICAgTG9jTXNnKCksIG1BZGFwdGVyKGFkYXB0ZXIpLCBtUG9zTW9kZShtb2RlKQotewotICAgIG1Qb3NNb2RlLmxvZ3YoKTsKLX0KLWlubGluZSB2b2lkIExvY0VuZ1Bvc2l0aW9uTW9kZTo6cHJvYygpIGNvbnN0IHsKLSAgICBtQWRhcHRlci0+c2V0UG9zaXRpb25Nb2RlKCZtUG9zTW9kZSk7Ci19Ci1pbmxpbmUgdm9pZCBMb2NFbmdQb3NpdGlvbk1vZGU6OmxvZygpIGNvbnN0IHsKLSAgICBtUG9zTW9kZS5sb2d2KCk7Ci19Ci12b2lkIExvY0VuZ1Bvc2l0aW9uTW9kZTo6c2VuZCgpIGNvbnN0IHsKLSAgICBtQWRhcHRlci0+c2VuZE1zZyh0aGlzKTsKLX0KLQotTG9jRW5nR2V0WnBwOjpMb2NFbmdHZXRacHAoTG9jRW5nQWRhcHRlciogYWRhcHRlcikgOgotICAgIExvY01zZygpLCBtQWRhcHRlcihhZGFwdGVyKQotewotICAgIGxvY2FsbG9nKCk7Ci19Ci1pbmxpbmUgdm9pZCBMb2NFbmdHZXRacHA6OnByb2MoKSBjb25zdAotewotICAgIGxvY19lbmdfZGF0YV9zX3R5cGUqIGxvY0VuZyA9IChsb2NfZW5nX2RhdGFfc190eXBlKiltQWRhcHRlci0+Z2V0T3duZXIoKTsKLSAgICBsb2NfZW5nX2dldF96cHBfaGFuZGxlcigqbG9jRW5nKTsKLX0KLWlubGluZSB2b2lkIExvY0VuZ0dldFpwcDo6bG9jYWxsb2coKSBjb25zdAotewotICAgIExPQ19MT0dWKCJMb2NFbmdHZXRacHAiKTsKLX0KLWlubGluZSB2b2lkIExvY0VuZ0dldFpwcDo6bG9nKCkgY29uc3QKLXsKLSAgICBsb2NhbGxvZygpOwotfQotdm9pZCBMb2NFbmdHZXRacHA6OnNlbmQoKSBjb25zdCB7Ci0gICAgbUFkYXB0ZXItPnNlbmRNc2codGhpcyk7Ci19Ci0KLQotTG9jRW5nU2h1dGRvd246OkxvY0VuZ1NodXRkb3duKExvY0VuZ0FkYXB0ZXIqIGFkYXB0ZXIpIDoKLSAgICBMb2NNc2coKSwgbUFkYXB0ZXIoYWRhcHRlcikKLXsKLSAgICBsb2NhbGxvZygpOwotfQotaW5saW5lIHZvaWQgTG9jRW5nU2h1dGRvd246OnByb2MoKSBjb25zdAotewotICAgIGxvY19lbmdfZGF0YV9zX3R5cGUqIGxvY0VuZyA9IChsb2NfZW5nX2RhdGFfc190eXBlKiltQWRhcHRlci0+Z2V0T3duZXIoKTsKLSAgICBMT0NfTE9HRCgiJXM6JWRdOiBDYWxsaW5nIGxvY19lbmdfaGFuZGxlX3NodXRkb3duIiwgX19mdW5jX18sIF9fTElORV9fKTsKLSAgICBsb2NfZW5nX2hhbmRsZV9zaHV0ZG93bigqbG9jRW5nKTsKLX0KLWlubGluZSB2b2lkIExvY0VuZ1NodXRkb3duOjpsb2NhbGxvZygpIGNvbnN0Ci17Ci0gICAgTE9DX0xPR1YoIkxvY0VuZ1NodXRkb3duIik7Ci19Ci1pbmxpbmUgdm9pZCBMb2NFbmdTaHV0ZG93bjo6bG9nKCkgY29uc3QKLXsKLSAgICBsb2NhbGxvZygpOwotfQotCi0vLyAgICAgICAgY2FzZSBMT0NfRU5HX01TR19TRVRfVElNRToKLXN0cnVjdCBMb2NFbmdTZXRUaW1lIDogcHVibGljIExvY01zZyB7Ci0gICAgTG9jRW5nQWRhcHRlciogbUFkYXB0ZXI7Ci0gICAgY29uc3QgR3BzVXRjVGltZSBtVGltZTsKLSAgICBjb25zdCBpbnQ2NF90IG1UaW1lUmVmZXJlbmNlOwotICAgIGNvbnN0IGludCBtVW5jZXJ0YWludHk7Ci0gICAgaW5saW5lIExvY0VuZ1NldFRpbWUoTG9jRW5nQWRhcHRlciogYWRhcHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBHcHNVdGNUaW1lIHQsIGludDY0X3QgdGYsIGludCB1bmMpIDoKLSAgICAgICAgTG9jTXNnKCksIG1BZGFwdGVyKGFkYXB0ZXIpLAotICAgICAgICBtVGltZSh0KSwgbVRpbWVSZWZlcmVuY2UodGYpLCBtVW5jZXJ0YWludHkodW5jKQotICAgIHsKLSAgICAgICAgbG9jYWxsb2coKTsKLSAgICB9Ci0gICAgaW5saW5lIHZpcnR1YWwgdm9pZCBwcm9jKCkgY29uc3QgewotICAgICAgICBtQWRhcHRlci0+c2V0VGltZShtVGltZSwgbVRpbWVSZWZlcmVuY2UsIG1VbmNlcnRhaW50eSk7Ci0gICAgfQotICAgIGlubGluZSB2b2lkIGxvY2FsbG9nKCkgY29uc3QgewotICAgICAgICBMT0NfTE9HVigidGltZTogJWxsZFxuICB0aW1lUmVmZXJlbmNlOiAlbGxkXG4gIHVuY2VydGFpbnR5OiAlZCIsCi0gICAgICAgICAgICAgICAgIG1UaW1lLCBtVGltZVJlZmVyZW5jZSwgbVVuY2VydGFpbnR5KTsKLSAgICB9Ci0gICAgaW5saW5lIHZpcnR1YWwgdm9pZCBsb2coKSBjb25zdCB7Ci0gICAgICAgIGxvY2FsbG9nKCk7Ci0gICAgfQotfTsKLQotIC8vICAgICAgIGNhc2UgTE9DX0VOR19NU0dfSU5KRUNUX0xPQ0FUSU9OOgotc3RydWN0IExvY0VuZ0luamVjdExvY2F0aW9uIDogcHVibGljIExvY01zZyB7Ci0gICAgTG9jRW5nQWRhcHRlciogbUFkYXB0ZXI7Ci0gICAgY29uc3QgZG91YmxlIG1MYXRpdHVkZTsKLSAgICBjb25zdCBkb3VibGUgbUxvbmdpdHVkZTsKLSAgICBjb25zdCBmbG9hdCBtQWNjdXJhY3k7Ci0gICAgaW5saW5lIExvY0VuZ0luamVjdExvY2F0aW9uKExvY0VuZ0FkYXB0ZXIqIGFkYXB0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBsYXQsIGRvdWJsZSBsb24sIGZsb2F0IGFjY3VyKSA6Ci0gICAgICAgIExvY01zZygpLCBtQWRhcHRlcihhZGFwdGVyKSwKLSAgICAgICAgbUxhdGl0dWRlKGxhdCksIG1Mb25naXR1ZGUobG9uKSwgbUFjY3VyYWN5KGFjY3VyKQotICAgIHsKLSAgICAgICAgbG9jYWxsb2coKTsKLSAgICB9Ci0gICAgaW5saW5lIHZpcnR1YWwgdm9pZCBwcm9jKCkgY29uc3QgewotICAgICAgICBtQWRhcHRlci0+aW5qZWN0UG9zaXRpb24obUxhdGl0dWRlLCBtTG9uZ2l0dWRlLCBtQWNjdXJhY3kpOwotICAgIH0KLSAgICBpbmxpbmUgdm9pZCBsb2NhbGxvZygpIGNvbnN0IHsKLSAgICAgICAgTE9DX0xPR1YoImxhdGl0dWRlOiAlZlxuICBsb25naXR1ZGU6ICVmXG4gIGFjY3VyYWN5OiAlZiIsCi0gICAgICAgICAgICAgICAgIG1MYXRpdHVkZSwgbUxvbmdpdHVkZSwgbUFjY3VyYWN5KTsKLSAgICB9Ci0gICAgaW5saW5lIHZpcnR1YWwgdm9pZCBsb2coKSBjb25zdCB7Ci0gICAgICAgIGxvY2FsbG9nKCk7Ci0gICAgfQotfTsKLQotLy8gICAgICAgIGNhc2UgTE9DX0VOR19NU0dfU0VUX1NFUlZFUl9JUFY0Ogotc3RydWN0IExvY0VuZ1NldFNlcnZlcklwdjQgOiBwdWJsaWMgTG9jTXNnIHsKLSAgICBMb2NFbmdBZGFwdGVyKiBtQWRhcHRlcjsKLSAgICBjb25zdCB1bnNpZ25lZCBpbnQgbU5sQWRkcjsKLSAgICBjb25zdCBpbnQgbVBvcnQ7Ci0gICAgY29uc3QgTG9jU2VydmVyVHlwZSBtU2VydmVyVHlwZTsKLSAgICBpbmxpbmUgTG9jRW5nU2V0U2VydmVySXB2NChMb2NFbmdBZGFwdGVyKiBhZGFwdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBpcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NTZXJ2ZXJUeXBlIHR5cGUpIDoKLSAgICAgICAgTG9jTXNnKCksIG1BZGFwdGVyKGFkYXB0ZXIpLAotICAgICAgICBtTmxBZGRyKGlwKSwgbVBvcnQocG9ydCksIG1TZXJ2ZXJUeXBlKHR5cGUpCi0gICAgewotICAgICAgICBsb2NhbGxvZygpOwotICAgIH0KLSAgICBpbmxpbmUgdmlydHVhbCB2b2lkIHByb2MoKSBjb25zdCB7Ci0gICAgICAgIG1BZGFwdGVyLT5zZXRTZXJ2ZXIobU5sQWRkciwgbVBvcnQsIG1TZXJ2ZXJUeXBlKTsKLSAgICB9Ci0gICAgaW5saW5lIHZvaWQgbG9jYWxsb2coKSBjb25zdCB7Ci0gICAgICAgIExPQ19MT0dWKCJMb2NFbmdTZXRTZXJ2ZXJJcHY0IC0gYWRkcjogJXgsIHBvcnQ6ICVkLCB0eXBlOiAlcyIsCi0gICAgICAgICAgICAgICAgIG1ObEFkZHIsIG1Qb3J0LCBsb2NfZ2V0X3NlcnZlcl90eXBlX25hbWUobVNlcnZlclR5cGUpKTsKLSAgICB9Ci0gICAgaW5saW5lIHZpcnR1YWwgdm9pZCBsb2coKSBjb25zdCB7Ci0gICAgICAgIGxvY2FsbG9nKCk7Ci0gICAgfQotfTsKLQotLy8gICAgICAgIGNhc2UgTE9DX0VOR19NU0dfU0VUX1NFUlZFUl9VUkw6Ci1zdHJ1Y3QgTG9jRW5nU2V0U2VydmVyVXJsIDogcHVibGljIExvY01zZyB7Ci0gICAgTG9jRW5nQWRhcHRlciogbUFkYXB0ZXI7Ci0gICAgY29uc3QgaW50IG1MZW47Ci0gICAgY2hhciogbVVybDsKLSAgICBpbmxpbmUgTG9jRW5nU2V0U2VydmVyVXJsKExvY0VuZ0FkYXB0ZXIqIGFkYXB0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiB1cmxTdHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdXJsX2xlbikgOgotICAgICAgICBMb2NNc2coKSwgbUFkYXB0ZXIoYWRhcHRlciksCi0gICAgICAgIG1MZW4odXJsX2xlbiksIG1VcmwobmV3IGNoYXJbbUxlbisxXSkKLSAgICB7Ci0gICAgICAgIG1lbWNweSgodm9pZCopbVVybCwgKHZvaWQqKXVybFN0cmluZywgdXJsX2xlbik7Ci0gICAgICAgIG1VcmxbbUxlbl0gPSAwOwotICAgICAgICBsb2NhbGxvZygpOwotICAgIH0KLSAgICBpbmxpbmUgfkxvY0VuZ1NldFNlcnZlclVybCgpCi0gICAgewotICAgICAgICBkZWxldGVbXSBtVXJsOwotICAgIH0KLSAgICBpbmxpbmUgdmlydHVhbCB2b2lkIHByb2MoKSBjb25zdCB7Ci0gICAgICAgIG1BZGFwdGVyLT5zZXRTZXJ2ZXIobVVybCwgbUxlbik7Ci0gICAgfQotICAgIGlubGluZSB2b2lkIGxvY2FsbG9nKCkgY29uc3QgewotICAgICAgICBMT0NfTE9HVigiTG9jRW5nU2V0U2VydmVyVXJsIC0gdXJsOiAlcyIsIG1VcmwpOwotICAgIH0KLSAgICBpbmxpbmUgdmlydHVhbCB2b2lkIGxvZygpIGNvbnN0IHsKLSAgICAgICAgbG9jYWxsb2coKTsKLSAgICB9Ci19OwotCi0vLyAgICAgICAgY2FzZSBMT0NfRU5HX01TR19BX0dMT05BU1NfUFJPVE9DT0w6Ci1zdHJ1Y3QgTG9jRW5nQUdsb25hc3NQcm90b2NvbCA6IHB1YmxpYyBMb2NNc2cgewotICAgIExvY0VuZ0FkYXB0ZXIqIG1BZGFwdGVyOwotICAgIGNvbnN0IHVuc2lnbmVkIGxvbmcgbUFHbG9uYXNzUHJvdG9jbDsKLSAgICBpbmxpbmUgTG9jRW5nQUdsb25hc3NQcm90b2NvbChMb2NFbmdBZGFwdGVyKiBhZGFwdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgcHJvdG9jb2wpIDoKLSAgICAgICAgTG9jTXNnKCksIG1BZGFwdGVyKGFkYXB0ZXIpLCBtQUdsb25hc3NQcm90b2NsKHByb3RvY29sKQotICAgIHsKLSAgICAgICAgbG9jYWxsb2coKTsKLSAgICB9Ci0gICAgaW5saW5lIHZpcnR1YWwgdm9pZCBwcm9jKCkgY29uc3QgewotICAgICAgICBtQWRhcHRlci0+c2V0QUdMT05BU1NQcm90b2NvbChtQUdsb25hc3NQcm90b2NsKTsKLSAgICB9Ci0gICAgaW5saW5lICB2b2lkIGxvY2FsbG9nKCkgY29uc3QgewotICAgICAgICBMT0NfTE9HVigiQS1HTE9OQVNTIHByb3RvY29sOiAweCVseCIsIG1BR2xvbmFzc1Byb3RvY2wpOwotICAgIH0KLSAgICBpbmxpbmUgdmlydHVhbCB2b2lkIGxvZygpIGNvbnN0IHsKLSAgICAgICAgbG9jYWxsb2coKTsKLSAgICB9Ci19OwotCi0vLyAgICAgICAgY2FzZSBMT0NfRU5HX01TR19TVVBMX1ZFUlNJT046Ci1zdHJ1Y3QgTG9jRW5nU3VwbFZlciA6IHB1YmxpYyBMb2NNc2cgewotICAgIExvY0VuZ0FkYXB0ZXIqIG1BZGFwdGVyOwotICAgIGNvbnN0IGludCBtU3VwbFZlcjsKLSAgICBpbmxpbmUgTG9jRW5nU3VwbFZlcihMb2NFbmdBZGFwdGVyKiBhZGFwdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdXBsVmVyKSA6Ci0gICAgICAgIExvY01zZygpLCBtQWRhcHRlcihhZGFwdGVyKSwgbVN1cGxWZXIoc3VwbFZlcikKLSAgICB7Ci0gICAgICAgIGxvY2FsbG9nKCk7Ci0gICAgfQotICAgIGlubGluZSB2aXJ0dWFsIHZvaWQgcHJvYygpIGNvbnN0IHsKLSAgICAgICAgbUFkYXB0ZXItPnNldFNVUExWZXJzaW9uKG1TdXBsVmVyKTsKLSAgICB9Ci0gICAgaW5saW5lICB2b2lkIGxvY2FsbG9nKCkgY29uc3QgewotICAgICAgICBMT0NfTE9HVigiU1VQTCBWZXJzaW9uOiAlZCIsIG1TdXBsVmVyKTsKLSAgICB9Ci0gICAgaW5saW5lIHZpcnR1YWwgdm9pZCBsb2coKSBjb25zdCB7Ci0gICAgICAgIGxvY2FsbG9nKCk7Ci0gICAgfQotfTsKLQotLy8gICAgICAgIGNhc2UgTE9DX0VOR19NU0dfTFBQX0NPTkZJRzoKLXN0cnVjdCBMb2NFbmdMcHBDb25maWcgOiBwdWJsaWMgTG9jTXNnIHsKLSAgICBMb2NFbmdBZGFwdGVyKiBtQWRhcHRlcjsKLSAgICBjb25zdCBpbnQgbUxwcENvbmZpZzsKLSAgICBpbmxpbmUgTG9jRW5nTHBwQ29uZmlnKExvY0VuZ0FkYXB0ZXIqIGFkYXB0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbHBwQ29uZmlnKSA6Ci0gICAgICAgIExvY01zZygpLCBtQWRhcHRlcihhZGFwdGVyKSwgbUxwcENvbmZpZyhscHBDb25maWcpCi0gICAgewotICAgICAgICBsb2NhbGxvZygpOwotICAgIH0KLSAgICBpbmxpbmUgdmlydHVhbCB2b2lkIHByb2MoKSBjb25zdCB7Ci0gICAgICAgIG1BZGFwdGVyLT5zZXRMUFBDb25maWcobUxwcENvbmZpZyk7Ci0gICAgfQotICAgIGlubGluZSB2b2lkIGxvY2FsbG9nKCkgY29uc3QgewotICAgICAgICBMT0NfTE9HVigiTG9jRW5nTHBwQ29uZmlnIC0gcHJvZmlsZTogJWQiLCBtTHBwQ29uZmlnKTsKLSAgICB9Ci0gICAgaW5saW5lIHZpcnR1YWwgdm9pZCBsb2coKSBjb25zdCB7Ci0gICAgICAgIGxvY2FsbG9nKCk7Ci0gICAgfQotfTsKLQotLy8gICAgICAgIGNhc2UgTE9DX0VOR19NU0dfU0VUX1NFTlNPUl9DT05UUk9MX0NPTkZJRzoKLXN0cnVjdCBMb2NFbmdTZW5zb3JDb250cm9sQ29uZmlnIDogcHVibGljIExvY01zZyB7Ci0gICAgTG9jRW5nQWRhcHRlciogbUFkYXB0ZXI7Ci0gICAgY29uc3QgaW50IG1TZW5zb3JzRGlzYWJsZWQ7Ci0gICAgY29uc3QgaW50IG1TZW5zb3JQcm92aWRlcjsKLSAgICBpbmxpbmUgTG9jRW5nU2Vuc29yQ29udHJvbENvbmZpZyhMb2NFbmdBZGFwdGVyKiBhZGFwdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZW5zb3JzRGlzYWJsZWQsIGludCBzZW5zb3JQcm92aWRlcikgOgotICAgICAgICBMb2NNc2coKSwgbUFkYXB0ZXIoYWRhcHRlciksIG1TZW5zb3JzRGlzYWJsZWQoc2Vuc29yc0Rpc2FibGVkKSwKLSAgICAgICAgbVNlbnNvclByb3ZpZGVyKHNlbnNvclByb3ZpZGVyKQotICAgIHsKLSAgICAgICAgbG9jYWxsb2coKTsKLSAgICB9Ci0gICAgaW5saW5lIHZpcnR1YWwgdm9pZCBwcm9jKCkgY29uc3QgewotICAgICAgICBtQWRhcHRlci0+c2V0U2Vuc29yQ29udHJvbENvbmZpZyhtU2Vuc29yc0Rpc2FibGVkLCBtU2Vuc29yUHJvdmlkZXIpOwotICAgIH0KLSAgICBpbmxpbmUgIHZvaWQgbG9jYWxsb2coKSBjb25zdCB7Ci0gICAgICAgIExPQ19MT0dWKCJMb2NFbmdTZW5zb3JDb250cm9sQ29uZmlnIC0gU2Vuc29ycyBEaXNhYmxlZDogJWQsIFNlbnNvciBQcm92aWRlcjogJWQiLAotICAgICAgICAgICAgICAgICBtU2Vuc29yc0Rpc2FibGVkLCBtU2Vuc29yUHJvdmlkZXIpOwotICAgIH0KLSAgICBpbmxpbmUgdmlydHVhbCB2b2lkIGxvZygpIGNvbnN0IHsKLSAgICAgICAgbG9jYWxsb2coKTsKLSAgICB9Ci19OwotCi0vLyAgICAgICAgY2FzZSBMT0NfRU5HX01TR19TRVRfU0VOU09SX1BST1BFUlRJRVM6Ci1zdHJ1Y3QgTG9jRW5nU2Vuc29yUHJvcGVydGllcyA6IHB1YmxpYyBMb2NNc2cgewotICAgIExvY0VuZ0FkYXB0ZXIqIG1BZGFwdGVyOwotICAgIGNvbnN0IGJvb2wgbUd5cm9CaWFzVmFyaWFuY2VSYW5kb21XYWxrVmFsaWQ7Ci0gICAgY29uc3QgZmxvYXQgbUd5cm9CaWFzVmFyaWFuY2VSYW5kb21XYWxrOwotICAgIGNvbnN0IGJvb2wgbUFjY2VsUmFuZG9tV2Fsa1ZhbGlkOwotICAgIGNvbnN0IGZsb2F0IG1BY2NlbFJhbmRvbVdhbGs7Ci0gICAgY29uc3QgYm9vbCBtQW5nbGVSYW5kb21XYWxrVmFsaWQ7Ci0gICAgY29uc3QgZmxvYXQgbUFuZ2xlUmFuZG9tV2FsazsKLSAgICBjb25zdCBib29sIG1SYXRlUmFuZG9tV2Fsa1ZhbGlkOwotICAgIGNvbnN0IGZsb2F0IG1SYXRlUmFuZG9tV2FsazsKLSAgICBjb25zdCBib29sIG1WZWxvY2l0eVJhbmRvbVdhbGtWYWxpZDsKLSAgICBjb25zdCBmbG9hdCBtVmVsb2NpdHlSYW5kb21XYWxrOwotICAgIGlubGluZSBMb2NFbmdTZW5zb3JQcm9wZXJ0aWVzKExvY0VuZ0FkYXB0ZXIqIGFkYXB0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBneXJvQmlhc1JhbmRvbVdhbGtfdmFsaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZ3lyb0JpYXNSYW5kb21XYWxrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYWNjZWxSYW5kb21XYWxrX3ZhbGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFjY2VsUmFuZG9tV2FsaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGFuZ2xlUmFuZG9tV2Fsa192YWxpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbmdsZVJhbmRvbVdhbGssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByYXRlUmFuZG9tV2Fsa192YWxpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCByYXRlUmFuZG9tV2FsaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHZlbG9jaXR5UmFuZG9tV2Fsa192YWxpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB2ZWxvY2l0eVJhbmRvbVdhbGspIDoKLSAgICAgICAgTG9jTXNnKCksIG1BZGFwdGVyKGFkYXB0ZXIpLAotICAgICAgICBtR3lyb0JpYXNWYXJpYW5jZVJhbmRvbVdhbGtWYWxpZChneXJvQmlhc1JhbmRvbVdhbGtfdmFsaWQpLAotICAgICAgICBtR3lyb0JpYXNWYXJpYW5jZVJhbmRvbVdhbGsoZ3lyb0JpYXNSYW5kb21XYWxrKSwKLSAgICAgICAgbUFjY2VsUmFuZG9tV2Fsa1ZhbGlkKGFjY2VsUmFuZG9tV2Fsa192YWxpZCksCi0gICAgICAgIG1BY2NlbFJhbmRvbVdhbGsoYWNjZWxSYW5kb21XYWxrKSwKLSAgICAgICAgbUFuZ2xlUmFuZG9tV2Fsa1ZhbGlkKGFuZ2xlUmFuZG9tV2Fsa192YWxpZCksCi0gICAgICAgIG1BbmdsZVJhbmRvbVdhbGsoYW5nbGVSYW5kb21XYWxrKSwKLSAgICAgICAgbVJhdGVSYW5kb21XYWxrVmFsaWQocmF0ZVJhbmRvbVdhbGtfdmFsaWQpLAotICAgICAgICBtUmF0ZVJhbmRvbVdhbGsocmF0ZVJhbmRvbVdhbGspLAotICAgICAgICBtVmVsb2NpdHlSYW5kb21XYWxrVmFsaWQodmVsb2NpdHlSYW5kb21XYWxrX3ZhbGlkKSwKLSAgICAgICAgbVZlbG9jaXR5UmFuZG9tV2Fsayh2ZWxvY2l0eVJhbmRvbVdhbGspCi0gICAgewotICAgICAgICBsb2NhbGxvZygpOwotICAgIH0KLSAgICBpbmxpbmUgdmlydHVhbCB2b2lkIHByb2MoKSBjb25zdCB7Ci0gICAgICAgIG1BZGFwdGVyLT5zZXRTZW5zb3JQcm9wZXJ0aWVzKG1HeXJvQmlhc1ZhcmlhbmNlUmFuZG9tV2Fsa1ZhbGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtR3lyb0JpYXNWYXJpYW5jZVJhbmRvbVdhbGssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BY2NlbFJhbmRvbVdhbGtWYWxpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFjY2VsUmFuZG9tV2FsaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFuZ2xlUmFuZG9tV2Fsa1ZhbGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQW5nbGVSYW5kb21XYWxrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUmF0ZVJhbmRvbVdhbGtWYWxpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJhdGVSYW5kb21XYWxrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVmVsb2NpdHlSYW5kb21XYWxrVmFsaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1WZWxvY2l0eVJhbmRvbVdhbGspOwotICAgIH0KLSAgICBpbmxpbmUgIHZvaWQgbG9jYWxsb2coKSBjb25zdCB7Ci0gICAgICAgIExPQ19MT0dWKCJTZW5zb3IgcHJvcGVydGllcyB2YWxpZGl0eSwgR3lybyBSYW5kb20gd2FsazogJWQgIgotICAgICAgICAgICAgICAgICAiQWNjZWwgUmFuZG9tIFdhbGs6ICVkICIKLSAgICAgICAgICAgICAgICAgIkFuZ2xlIFJhbmRvbSBXYWxrOiAlZCBSYXRlIFJhbmRvbSBXYWxrOiAlZCAiCi0gICAgICAgICAgICAgICAgICJWZWxvY2l0eSBSYW5kb20gV2FsazogJWRcbiIKLSAgICAgICAgICAgICAgICAgIlNlbnNvciBwcm9wZXJ0aWVzLCBHeXJvIFJhbmRvbSB3YWxrOiAlZiAiCi0gICAgICAgICAgICAgICAgICJBY2NlbCBSYW5kb20gV2FsazogJWYgIgotICAgICAgICAgICAgICAgICAiQW5nbGUgUmFuZG9tIFdhbGs6ICVmIFJhdGUgUmFuZG9tIFdhbGs6ICVmICIKLSAgICAgICAgICAgICAgICAgIlZlbG9jaXR5IFJhbmRvbSBXYWxrOiAlZiIsCi0gICAgICAgICAgICAgICAgIG1HeXJvQmlhc1ZhcmlhbmNlUmFuZG9tV2Fsa1ZhbGlkLAotICAgICAgICAgICAgICAgICBtQWNjZWxSYW5kb21XYWxrVmFsaWQsCi0gICAgICAgICAgICAgICAgIG1BbmdsZVJhbmRvbVdhbGtWYWxpZCwKLSAgICAgICAgICAgICAgICAgbVJhdGVSYW5kb21XYWxrVmFsaWQsCi0gICAgICAgICAgICAgICAgIG1WZWxvY2l0eVJhbmRvbVdhbGtWYWxpZCwKLSAgICAgICAgICAgICAgICAgbUd5cm9CaWFzVmFyaWFuY2VSYW5kb21XYWxrLAotICAgICAgICAgICAgICAgICBtQWNjZWxSYW5kb21XYWxrLAotICAgICAgICAgICAgICAgICBtQW5nbGVSYW5kb21XYWxrLAotICAgICAgICAgICAgICAgICBtUmF0ZVJhbmRvbVdhbGssCi0gICAgICAgICAgICAgICAgIG1WZWxvY2l0eVJhbmRvbVdhbGsKLSAgICAgICAgICAgICk7Ci0gICAgfQotICAgIGlubGluZSB2aXJ0dWFsIHZvaWQgbG9nKCkgY29uc3QgewotICAgICAgICBsb2NhbGxvZygpOwotICAgIH0KLX07Ci0KLS8vICAgICAgICBjYXNlIExPQ19FTkdfTVNHX1NFVF9TRU5TT1JfUEVSRl9DT05UUk9MX0NPTkZJRzoKLXN0cnVjdCBMb2NFbmdTZW5zb3JQZXJmQ29udHJvbENvbmZpZyA6IHB1YmxpYyBMb2NNc2cgewotICAgIExvY0VuZ0FkYXB0ZXIqIG1BZGFwdGVyOwotICAgIGNvbnN0IGludCBtQ29udHJvbE1vZGU7Ci0gICAgY29uc3QgaW50IG1BY2NlbFNhbXBsZXNQZXJCYXRjaDsKLSAgICBjb25zdCBpbnQgbUFjY2VsQmF0Y2hlc1BlclNlYzsKLSAgICBjb25zdCBpbnQgbUd5cm9TYW1wbGVzUGVyQmF0Y2g7Ci0gICAgY29uc3QgaW50IG1HeXJvQmF0Y2hlc1BlclNlYzsKLSAgICBjb25zdCBpbnQgbUFjY2VsU2FtcGxlc1BlckJhdGNoSGlnaDsKLSAgICBjb25zdCBpbnQgbUFjY2VsQmF0Y2hlc1BlclNlY0hpZ2g7Ci0gICAgY29uc3QgaW50IG1HeXJvU2FtcGxlc1BlckJhdGNoSGlnaDsKLSAgICBjb25zdCBpbnQgbUd5cm9CYXRjaGVzUGVyU2VjSGlnaDsKLSAgICBjb25zdCBpbnQgbUFsZ29yaXRobUNvbmZpZzsKLSAgICBpbmxpbmUgTG9jRW5nU2Vuc29yUGVyZkNvbnRyb2xDb25maWcoTG9jRW5nQWRhcHRlciogYWRhcHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbnRyb2xNb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWNjZWxTYW1wbGVzUGVyQmF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhY2NlbEJhdGNoZXNQZXJTZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBneXJvU2FtcGxlc1BlckJhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZ3lyb0JhdGNoZXNQZXJTZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhY2NlbFNhbXBsZXNQZXJCYXRjaEhpZ2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhY2NlbEJhdGNoZXNQZXJTZWNIaWdoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZ3lyb1NhbXBsZXNQZXJCYXRjaEhpZ2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBneXJvQmF0Y2hlc1BlclNlY0hpZ2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbGdvcml0aG1Db25maWcpIDoKLSAgICAgICAgTG9jTXNnKCksIG1BZGFwdGVyKGFkYXB0ZXIpLAotICAgICAgICBtQ29udHJvbE1vZGUoY29udHJvbE1vZGUpLAotICAgICAgICBtQWNjZWxTYW1wbGVzUGVyQmF0Y2goYWNjZWxTYW1wbGVzUGVyQmF0Y2gpLAotICAgICAgICBtQWNjZWxCYXRjaGVzUGVyU2VjKGFjY2VsQmF0Y2hlc1BlclNlYyksCi0gICAgICAgIG1HeXJvU2FtcGxlc1BlckJhdGNoKGd5cm9TYW1wbGVzUGVyQmF0Y2gpLAotICAgICAgICBtR3lyb0JhdGNoZXNQZXJTZWMoZ3lyb0JhdGNoZXNQZXJTZWMpLAotICAgICAgICBtQWNjZWxTYW1wbGVzUGVyQmF0Y2hIaWdoKGFjY2VsU2FtcGxlc1BlckJhdGNoSGlnaCksCi0gICAgICAgIG1BY2NlbEJhdGNoZXNQZXJTZWNIaWdoKGFjY2VsQmF0Y2hlc1BlclNlY0hpZ2gpLAotICAgICAgICBtR3lyb1NhbXBsZXNQZXJCYXRjaEhpZ2goZ3lyb1NhbXBsZXNQZXJCYXRjaEhpZ2gpLAotICAgICAgICBtR3lyb0JhdGNoZXNQZXJTZWNIaWdoKGd5cm9CYXRjaGVzUGVyU2VjSGlnaCksCi0gICAgICAgIG1BbGdvcml0aG1Db25maWcoYWxnb3JpdGhtQ29uZmlnKQotICAgIHsKLSAgICAgICAgbG9jYWxsb2coKTsKLSAgICB9Ci0gICAgaW5saW5lIHZpcnR1YWwgdm9pZCBwcm9jKCkgY29uc3QgewotICAgICAgICBtQWRhcHRlci0+c2V0U2Vuc29yUGVyZkNvbnRyb2xDb25maWcobUNvbnRyb2xNb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFjY2VsU2FtcGxlc1BlckJhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFjY2VsQmF0Y2hlc1BlclNlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1HeXJvU2FtcGxlc1BlckJhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUd5cm9CYXRjaGVzUGVyU2VjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFjY2VsU2FtcGxlc1BlckJhdGNoSGlnaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BY2NlbEJhdGNoZXNQZXJTZWNIaWdoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUd5cm9TYW1wbGVzUGVyQmF0Y2hIaWdoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUd5cm9CYXRjaGVzUGVyU2VjSGlnaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BbGdvcml0aG1Db25maWcpOwotICAgIH0KLSAgICBpbmxpbmUgdm9pZCBsb2NhbGxvZygpIGNvbnN0IHsKLSAgICAgICAgTE9DX0xPR1YoIlNlbnNvciBQZXJmIENvbnRyb2wgQ29uZmlnIChwZXJmb3JtYW5jZUNvbnRyb2xNb2RlKSgldSkgIgotICAgICAgICAgICAgICAgICAiYWNjZWwoI3NtcCwjYmF0Y2hlcykgKCV1LCV1KSAiCi0gICAgICAgICAgICAgICAgICJneXJvKCNzbXAsI2JhdGNoZXMpICgldSwldSksICIKLSAgICAgICAgICAgICAgICAgImFjY2VsX2hpZ2goI3NtcCwjYmF0Y2hlcykgKCV1LCV1KSAiCi0gICAgICAgICAgICAgICAgICJneXJvX2hpZ2goI3NtcCwjYmF0Y2hlcykgKCV1LCV1KSwgIgotICAgICAgICAgICAgICAgICAiYWxnb3JpdGhtQ29uZmlnKCV1KVxuIiwKLSAgICAgICAgICAgICAgICAgbUNvbnRyb2xNb2RlLAotICAgICAgICAgICAgICAgICBtQWNjZWxTYW1wbGVzUGVyQmF0Y2gsIG1BY2NlbEJhdGNoZXNQZXJTZWMsCi0gICAgICAgICAgICAgICAgIG1HeXJvU2FtcGxlc1BlckJhdGNoLCBtR3lyb0JhdGNoZXNQZXJTZWMsCi0gICAgICAgICAgICAgICAgIG1BY2NlbFNhbXBsZXNQZXJCYXRjaEhpZ2gsIG1BY2NlbEJhdGNoZXNQZXJTZWNIaWdoLAotICAgICAgICAgICAgICAgICBtR3lyb1NhbXBsZXNQZXJCYXRjaEhpZ2gsIG1HeXJvQmF0Y2hlc1BlclNlY0hpZ2gsCi0gICAgICAgICAgICAgICAgIG1BbGdvcml0aG1Db25maWcpOwotICAgIH0KLSAgICBpbmxpbmUgdmlydHVhbCB2b2lkIGxvZygpIGNvbnN0IHsKLSAgICAgICAgbG9jYWxsb2coKTsKLSAgICB9Ci19OwotCi0vLyAgICAgICAgY2FzZSBMT0NfRU5HX01TR19FWFRfUE9XRVJfQ09ORklHOgotc3RydWN0IExvY0VuZ0V4dFBvd2VyQ29uZmlnIDogcHVibGljIExvY01zZyB7Ci0gICAgTG9jRW5nQWRhcHRlciogbUFkYXB0ZXI7Ci0gICAgY29uc3QgaW50IG1Jc0JhdHRlcnlDaGFyZ2luZzsKLSAgICBpbmxpbmUgTG9jRW5nRXh0UG93ZXJDb25maWcoTG9jRW5nQWRhcHRlciogYWRhcHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlzQmF0dGVyeUNoYXJnaW5nKSA6Ci0gICAgICAgIExvY01zZygpLCBtQWRhcHRlcihhZGFwdGVyKSwKLSAgICAgICAgbUlzQmF0dGVyeUNoYXJnaW5nKGlzQmF0dGVyeUNoYXJnaW5nKQotICAgIHsKLSAgICAgICAgbG9jYWxsb2coKTsKLSAgICB9Ci0gICAgaW5saW5lIHZpcnR1YWwgdm9pZCBwcm9jKCkgY29uc3QgewotICAgICAgICBtQWRhcHRlci0+c2V0RXh0UG93ZXJDb25maWcobUlzQmF0dGVyeUNoYXJnaW5nKTsKLSAgICB9Ci0gICAgaW5saW5lIHZvaWQgbG9jYWxsb2coKSBjb25zdCB7Ci0gICAgICAgIExPQ19MT0dWKCJMb2NFbmdFeHRQb3dlckNvbmZpZyAtIGlzQmF0dGVyeUNoYXJnaW5nOiAlZCIsCi0gICAgICAgICAgICAgICAgIG1Jc0JhdHRlcnlDaGFyZ2luZyk7Ci0gICAgfQotICAgIGlubGluZSB2aXJ0dWFsIHZvaWQgbG9nKCkgY29uc3QgewotICAgICAgICBsb2NhbGxvZygpOwotICAgIH0KLX07Ci0KLS8vICAgICAgICBjYXNlIExPQ19FTkdfTVNHX1JFUE9SVF9QT1NJVElPTjoKLUxvY0VuZ1JlcG9ydFBvc2l0aW9uOjpMb2NFbmdSZXBvcnRQb3NpdGlvbihMb2NBZGFwdGVyQmFzZSogYWRhcHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbHBMb2NhdGlvbiAmbG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdwc0xvY2F0aW9uRXh0ZW5kZWQgJmxvY0V4dGVuZGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGxvY0V4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIGxvY19zZXNzX3N0YXR1cyBzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NQb3NUZWNoTWFzayB0ZWNobm9sb2d5KSA6Ci0gICAgTG9jTXNnKCksIG1BZGFwdGVyKGFkYXB0ZXIpLCBtTG9jYXRpb24obG9jKSwKLSAgICBtTG9jYXRpb25FeHRlbmRlZChsb2NFeHRlbmRlZCksCi0gICAgbUxvY2F0aW9uRXh0KCgobG9jX2VuZ19kYXRhX3NfdHlwZSopCi0gICAgICAgICAgICAgICAgICAoKExvY0VuZ0FkYXB0ZXIqKQotICAgICAgICAgICAgICAgICAgIChtQWRhcHRlcikpLT5nZXRPd25lcigpKS0+bG9jYXRpb25fZXh0X3BhcnNlcihsb2NFeHQpKSwKLSAgICBtU3RhdHVzKHN0KSwgbVRlY2hNYXNrKHRlY2hub2xvZ3kpCi17Ci0gICAgbG9jYWxsb2coKTsKLX0KLXZvaWQgTG9jRW5nUmVwb3J0UG9zaXRpb246OnByb2MoKSBjb25zdCB7Ci0gICAgTG9jRW5nQWRhcHRlciogYWRhcHRlciA9IChMb2NFbmdBZGFwdGVyKiltQWRhcHRlcjsKLSAgICBsb2NfZW5nX2RhdGFfc190eXBlKiBsb2NFbmcgPSAobG9jX2VuZ19kYXRhX3NfdHlwZSopYWRhcHRlci0+Z2V0T3duZXIoKTsKLQotICAgIGlmIChsb2NFbmctPm11dGVfc2Vzc2lvbl9zdGF0ZSAhPSBMT0NfTVVURV9TRVNTX0lOX1NFU1NJT04pIHsKLSAgICAgICAgYm9vbCByZXBvcnRlZCA9IGZhbHNlOwotICAgICAgICBpZiAobG9jRW5nLT5sb2NhdGlvbl9jYiAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBpZiAoTE9DX1NFU1NfRkFJTFVSRSA9PSBtU3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgLy8gaW4gY2FzZSB3ZSB3YW50IHRvIGhhbmRsZSB0aGUgZmFpbHVyZSBjYXNlCi0gICAgICAgICAgICAgICAgbG9jRW5nLT5sb2NhdGlvbl9jYihOVUxMLCBOVUxMKTsKLSAgICAgICAgICAgICAgICByZXBvcnRlZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyB3aGF0J3MgaW4gdGhlIGVsc2UgaWYgaXMuLi4gKGxpbmUgYnkgbGluZSkKLSAgICAgICAgICAgIC8vIDEuIHRoaXMgaXMgYSBmaW5hbCBmaXg7IGFuZAotICAgICAgICAgICAgLy8gICAxLjEgaXQgaXMgYSBTYXRlbGxpdGUgZml4OyBvcgotICAgICAgICAgICAgLy8gICAxLjIgaXQgaXMgYSBzZW5zb3IgZml4Ci0gICAgICAgICAgICAvLyAyLiAobXVzdCBiZSBpbnRlcm1lZGlhdGUgZml4Li4uIGltcGxpY2l0KQotICAgICAgICAgICAgLy8gICAyLjEgd2UgYWNjZXB0ZSBpbnRlcm1lZGlhdGU7IGFuZAotICAgICAgICAgICAgLy8gICAyLjIgaXQgaXMgTk9UIHRoZSBjYXNlIHRoYXQKLSAgICAgICAgICAgIC8vICAgMi4yLjEgdGhlcmUgaXMgaW5hY2N1cmFjeTsgYW5kCi0gICAgICAgICAgICAvLyAgIDIuMi4yIHdlIGNhcmUgYWJvdXQgaW5hY2N1cmFjeTsgYW5kCi0gICAgICAgICAgICAvLyAgIDIuMi4zIHRoZSBpbmFjY3VyYWN5IGV4Y2VlZHMgb3VyIHRvbGVyYW5jZQotICAgICAgICAgICAgZWxzZSBpZiAoKExPQ19TRVNTX1NVQ0NFU1MgPT0gbVN0YXR1cyAmJgotICAgICAgICAgICAgICAgICAgICAgICgoTE9DX1BPU19URUNIX01BU0tfU0FURUxMSVRFIHwKLSAgICAgICAgICAgICAgICAgICAgICAgIExPQ19QT1NfVEVDSF9NQVNLX1NFTlNPUlMgICB8Ci0gICAgICAgICAgICAgICAgICAgICAgICBMT0NfUE9TX1RFQ0hfTUFTS19IWUJSSUQpICYKLSAgICAgICAgICAgICAgICAgICAgICAgbVRlY2hNYXNrKSkgfHwKLSAgICAgICAgICAgICAgICAgICAgIChMT0NfU0VTU19JTlRFUk1FRElBVEUgPT0gbG9jRW5nLT5pbnRlcm1lZGlhdGVGaXggJiYKLSAgICAgICAgICAgICAgICAgICAgICAhKChtTG9jYXRpb24uZ3BzTG9jYXRpb24uZmxhZ3MgJgotICAgICAgICAgICAgICAgICAgICAgICAgIEdQU19MT0NBVElPTl9IQVNfQUNDVVJBQ1kpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAoZ3BzX2NvbmYuQUNDVVJBQ1lfVEhSRVMgIT0gMCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIChtTG9jYXRpb24uZ3BzTG9jYXRpb24uYWNjdXJhY3kgPgotICAgICAgICAgICAgICAgICAgICAgICAgIGdwc19jb25mLkFDQ1VSQUNZX1RIUkVTKSkpKSB7Ci0gICAgICAgICAgICAgICAgbG9jRW5nLT5sb2NhdGlvbl9jYigoVWxwTG9jYXRpb24qKSYobUxvY2F0aW9uKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiltTG9jYXRpb25FeHQpOwotICAgICAgICAgICAgICAgIHJlcG9ydGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGlmIHdlIGhhdmUgcmVwb3J0ZWQgdGhpcyBmaXgKLSAgICAgICAgaWYgKHJlcG9ydGVkICYmCi0gICAgICAgICAgICAvLyBhbmQgaWYgdGhpcyBpcyBhIHNpbmdsZXNob3QKLSAgICAgICAgICAgIEdQU19QT1NJVElPTl9SRUNVUlJFTkNFX1NJTkdMRSA9PQotICAgICAgICAgICAgbG9jRW5nLT5hZGFwdGVyLT5nZXRQb3NpdGlvbk1vZGUoKS5yZWN1cnJlbmNlKSB7Ci0gICAgICAgICAgICBpZiAoTE9DX1NFU1NfSU5URVJNRURJQVRFID09IG1TdGF0dXMpIHsKLSAgICAgICAgICAgICAgICAvLyBtb2RlbSBjb3VsZCBiZSBzdGlsbCB3b3JraW5nIGZvciBhIGZpbmFsIGZpeCwKLSAgICAgICAgICAgICAgICAvLyBhbHRob3VnaCB3ZSBubyBsb25nZXIgbmVlZCBpdC4gIFNvIHN0b3BGaXgoKS4KLSAgICAgICAgICAgICAgICBsb2NFbmctPmFkYXB0ZXItPnN0b3BGaXgoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIHR1cm4gb2ZmIHRoZSBzZXNzaW9uIGZsYWcuCi0gICAgICAgICAgICBsb2NFbmctPmFkYXB0ZXItPnNldEluU2Vzc2lvbihmYWxzZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobG9jRW5nLT5nZW5lcmF0ZU5tZWEgJiYKLSAgICAgICAgICAgIG1Mb2NhdGlvbi5wb3NpdGlvbl9zb3VyY2UgPT0gVUxQX0xPQ0FUSU9OX0lTX0ZST01fR05TUyAmJgotICAgICAgICAgICAgbVRlY2hNYXNrICYgKExPQ19QT1NfVEVDSF9NQVNLX1NBVEVMTElURSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgTE9DX1BPU19URUNIX01BU0tfU0VOU09SUyB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgTE9DX1BPU19URUNIX01BU0tfSFlCUklEKSkKLSAgICAgICAgewotICAgICAgICAgICAgdW5zaWduZWQgY2hhciBnZW5lcmF0ZV9ubWVhID0gcmVwb3J0ZWQgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtU3RhdHVzICE9IExPQ19TRVNTX0ZBSUxVUkUpOwotICAgICAgICAgICAgbG9jX2VuZ19ubWVhX2dlbmVyYXRlX3Bvcyhsb2NFbmcsIG1Mb2NhdGlvbiwgbUxvY2F0aW9uRXh0ZW5kZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlX25tZWEpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gRnJlZSB0aGUgYWxsb2NhdGVkIG1lbW9yeSBmb3IgcmF3RGF0YQotICAgICAgICBVbHBMb2NhdGlvbiogZ3AgPSAoVWxwTG9jYXRpb24qKSYobUxvY2F0aW9uKTsKLSAgICAgICAgaWYgKGdwICE9IE5VTEwgJiYgZ3AtPnJhd0RhdGEgIT0gTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgZGVsZXRlIChjaGFyKilncC0+cmF3RGF0YTsKLSAgICAgICAgICAgIGdwLT5yYXdEYXRhID0gTlVMTDsKLSAgICAgICAgICAgIGdwLT5yYXdEYXRhU2l6ZSA9IDA7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci12b2lkIExvY0VuZ1JlcG9ydFBvc2l0aW9uOjpsb2NhbGxvZygpIGNvbnN0IHsKLSAgICBMT0NfTE9HVigiZmxhZ3M6ICVkXG4gIHNvdXJjZTogJWRcbiAgbGF0aXR1ZGU6ICVmXG4gIGxvbmdpdHVkZTogJWZcbiAgIgotICAgICAgICAgICAgICJhbHRpdHVkZTogJWZcbiAgc3BlZWQ6ICVmXG4gIGJlYXJpbmc6ICVmXG4gIGFjY3VyYWN5OiAlZlxuICAiCi0gICAgICAgICAgICAgInRpbWVzdGFtcDogJWxsZFxuICByYXdEYXRhU2l6ZTogJWRcbiAgcmF3RGF0YTogJXBcbiAgU2Vzc2lvbiIKLSAgICAgICAgICAgICAiIHN0YXR1czogJWRcbiBUZWNobm9sb2d5IG1hc2s6ICV1IiwKLSAgICAgICAgICAgICBtTG9jYXRpb24uZ3BzTG9jYXRpb24uZmxhZ3MsIG1Mb2NhdGlvbi5wb3NpdGlvbl9zb3VyY2UsCi0gICAgICAgICAgICAgbUxvY2F0aW9uLmdwc0xvY2F0aW9uLmxhdGl0dWRlLCBtTG9jYXRpb24uZ3BzTG9jYXRpb24ubG9uZ2l0dWRlLAotICAgICAgICAgICAgIG1Mb2NhdGlvbi5ncHNMb2NhdGlvbi5hbHRpdHVkZSwgbUxvY2F0aW9uLmdwc0xvY2F0aW9uLnNwZWVkLAotICAgICAgICAgICAgIG1Mb2NhdGlvbi5ncHNMb2NhdGlvbi5iZWFyaW5nLCBtTG9jYXRpb24uZ3BzTG9jYXRpb24uYWNjdXJhY3ksCi0gICAgICAgICAgICAgbUxvY2F0aW9uLmdwc0xvY2F0aW9uLnRpbWVzdGFtcCwgbUxvY2F0aW9uLnJhd0RhdGFTaXplLAotICAgICAgICAgICAgIG1Mb2NhdGlvbi5yYXdEYXRhLCBtU3RhdHVzLCBtVGVjaE1hc2spOwotfQotdm9pZCBMb2NFbmdSZXBvcnRQb3NpdGlvbjo6bG9nKCkgY29uc3QgewotICAgIGxvY2FsbG9nKCk7Ci19Ci12b2lkIExvY0VuZ1JlcG9ydFBvc2l0aW9uOjpzZW5kKCkgY29uc3QgewotICAgIG1BZGFwdGVyLT5zZW5kTXNnKHRoaXMpOwotfQotCi0KLS8vICAgICAgICBjYXNlIExPQ19FTkdfTVNHX1JFUE9SVF9TVjoKLUxvY0VuZ1JlcG9ydFN2OjpMb2NFbmdSZXBvcnRTdihMb2NBZGFwdGVyQmFzZSogYWRhcHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcHNTdlN0YXR1cyAmc3YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3BzTG9jYXRpb25FeHRlbmRlZCAmbG9jRXh0ZW5kZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogc3ZFeHQpIDoKLSAgICBMb2NNc2coKSwgbUFkYXB0ZXIoYWRhcHRlciksIG1TdlN0YXR1cyhzdiksCi0gICAgbUxvY2F0aW9uRXh0ZW5kZWQobG9jRXh0ZW5kZWQpLAotICAgIG1TdkV4dCgoKGxvY19lbmdfZGF0YV9zX3R5cGUqKQotICAgICAgICAgICAgKChMb2NFbmdBZGFwdGVyKikKLSAgICAgICAgICAgICAobUFkYXB0ZXIpKS0+Z2V0T3duZXIoKSktPnN2X2V4dF9wYXJzZXIoc3ZFeHQpKQotewotICAgIGxvY2FsbG9nKCk7Ci19Ci12b2lkIExvY0VuZ1JlcG9ydFN2Ojpwcm9jKCkgY29uc3QgewotICAgIExvY0VuZ0FkYXB0ZXIqIGFkYXB0ZXIgPSAoTG9jRW5nQWRhcHRlciopbUFkYXB0ZXI7Ci0gICAgbG9jX2VuZ19kYXRhX3NfdHlwZSogbG9jRW5nID0gKGxvY19lbmdfZGF0YV9zX3R5cGUqKWFkYXB0ZXItPmdldE93bmVyKCk7Ci0KLSAgICBpZiAobG9jRW5nLT5tdXRlX3Nlc3Npb25fc3RhdGUgIT0gTE9DX01VVEVfU0VTU19JTl9TRVNTSU9OKQotICAgIHsKLSAgICAgICAgaWYgKGxvY0VuZy0+c3Zfc3RhdHVzX2NiICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGxvY0VuZy0+c3Zfc3RhdHVzX2NiKChHcHNTdlN0YXR1cyopJihtU3ZTdGF0dXMpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW1TdkV4dCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobG9jRW5nLT5nZW5lcmF0ZU5tZWEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvY19lbmdfbm1lYV9nZW5lcmF0ZV9zdihsb2NFbmcsIG1TdlN0YXR1cywgbUxvY2F0aW9uRXh0ZW5kZWQpOwotICAgICAgICB9Ci0gICAgfQotfQotdm9pZCBMb2NFbmdSZXBvcnRTdjo6bG9jYWxsb2coKSBjb25zdCB7Ci0gICAgTE9DX0xPR1YoIm51bSBzdjogJWRcbiAgZXBoZW1lcmlzIG1hc2s6ICVkeG4gIGFsbWFuYWMgbWFzazogJXhcbiAgIgotICAgICAgICAgICAgICJ1c2VkIGluIGZpeCBtYXNrOiAleFxuICAgICAgc3Y6IHBybiAgICAgICAgIHNuciAgICAgICAiCi0gICAgICAgICAgICAgImVsZXZhdGlvbiAgICAgIGF6aW11dGgiLAotICAgICAgICAgICAgIG1TdlN0YXR1cy5udW1fc3ZzLCBtU3ZTdGF0dXMuZXBoZW1lcmlzX21hc2ssCi0gICAgICAgICAgICAgbVN2U3RhdHVzLmFsbWFuYWNfbWFzaywgbVN2U3RhdHVzLnVzZWRfaW5fZml4X21hc2spOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbVN2U3RhdHVzLm51bV9zdnMgJiYgaSA8IEdQU19NQVhfU1ZTOyBpKyspIHsKLSAgICAgICAgTE9DX0xPR1YoIiAgICVkOiAgICVkICAgICVmICAgICVmICAgICVmXG4gICIsCi0gICAgICAgICAgICAgICAgIGksCi0gICAgICAgICAgICAgICAgIG1TdlN0YXR1cy5zdl9saXN0W2ldLnBybiwKLSAgICAgICAgICAgICAgICAgbVN2U3RhdHVzLnN2X2xpc3RbaV0uc25yLAotICAgICAgICAgICAgICAgICBtU3ZTdGF0dXMuc3ZfbGlzdFtpXS5lbGV2YXRpb24sCi0gICAgICAgICAgICAgICAgIG1TdlN0YXR1cy5zdl9saXN0W2ldLmF6aW11dGgpOwotICAgIH0KLX0KLWlubGluZSB2b2lkIExvY0VuZ1JlcG9ydFN2Ojpsb2coKSBjb25zdCB7Ci0gICAgbG9jYWxsb2coKTsKLX0KLXZvaWQgTG9jRW5nUmVwb3J0U3Y6OnNlbmQoKSBjb25zdCB7Ci0gICAgbUFkYXB0ZXItPnNlbmRNc2codGhpcyk7Ci19Ci0KLS8vICAgICAgICBjYXNlIExPQ19FTkdfTVNHX1JFUE9SVF9TVEFUVVM6Ci1Mb2NFbmdSZXBvcnRTdGF0dXM6OkxvY0VuZ1JlcG9ydFN0YXR1cyhMb2NBZGFwdGVyQmFzZSogYWRhcHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdwc1N0YXR1c1ZhbHVlIGVuZ2luZVN0YXR1cykgOgotICAgIExvY01zZygpLCAgbUFkYXB0ZXIoYWRhcHRlciksIG1TdGF0dXMoZW5naW5lU3RhdHVzKQotewotICAgIGxvY2FsbG9nKCk7Ci19Ci1pbmxpbmUgdm9pZCBMb2NFbmdSZXBvcnRTdGF0dXM6OnByb2MoKSBjb25zdAotewotICAgIExvY0VuZ0FkYXB0ZXIqIGFkYXB0ZXIgPSAoTG9jRW5nQWRhcHRlciopbUFkYXB0ZXI7Ci0gICAgbG9jX2VuZ19kYXRhX3NfdHlwZSogbG9jRW5nID0gKGxvY19lbmdfZGF0YV9zX3R5cGUqKWFkYXB0ZXItPmdldE93bmVyKCk7Ci0KLSAgICBsb2NfZW5nX3JlcG9ydF9zdGF0dXMoKmxvY0VuZywgbVN0YXR1cyk7Ci0gICAgdXBkYXRlX2FpZGluZ19kYXRhX2Zvcl9kZWxldGlvbigqbG9jRW5nKTsKLX0KLWlubGluZSB2b2lkIExvY0VuZ1JlcG9ydFN0YXR1czo6bG9jYWxsb2coKSBjb25zdCB7Ci0gICAgTE9DX0xPR1YoIkxvY0VuZ1JlcG9ydFN0YXR1cyIpOwotfQotaW5saW5lIHZvaWQgTG9jRW5nUmVwb3J0U3RhdHVzOjpsb2coKSBjb25zdCB7Ci0gICAgbG9jYWxsb2coKTsKLX0KLQotLy8gICAgICAgIGNhc2UgTE9DX0VOR19NU0dfUkVQT1JUX05NRUE6Ci1Mb2NFbmdSZXBvcnRObWVhOjpMb2NFbmdSZXBvcnRObWVhKHZvaWQqIGxvY0VuZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZGF0YSwgaW50IGxlbikgOgotICAgIExvY01zZygpLCBtTG9jRW5nKGxvY0VuZyksIG1ObWVhKG5ldyBjaGFyW2xlbl0pLCBtTGVuKGxlbikKLXsKLSAgICBtZW1jcHkoKHZvaWQqKW1ObWVhLCAodm9pZCopZGF0YSwgbGVuKTsKLSAgICBsb2NhbGxvZygpOwotfQotdm9pZCBMb2NFbmdSZXBvcnRObWVhOjpwcm9jKCkgY29uc3QgewotICAgIGxvY19lbmdfZGF0YV9zX3R5cGUqIGxvY0VuZyA9IChsb2NfZW5nX2RhdGFfc190eXBlKikgbUxvY0VuZzsKLQotICAgIHN0cnVjdCB0aW1ldmFsIHR2OwotICAgIGdldHRpbWVvZmRheSgmdHYsIChzdHJ1Y3QgdGltZXpvbmUgKikgTlVMTCk7Ci0gICAgaW50NjRfdCBub3cgPSB0di50dl9zZWMgKiAxMDAwTEwgKyB0di50dl91c2VjIC8gMTAwMDsKLSAgICBDQUxMQkFDS19MT0dfQ0FMTEZMT1coIm5tZWFfY2IiLCAlZCwgbUxlbik7Ci0KLSAgICBpZiAobG9jRW5nLT5ubWVhX2NiICE9IE5VTEwpCi0gICAgICAgIGxvY0VuZy0+bm1lYV9jYihub3csIG1ObWVhLCBtTGVuKTsKLX0KLWlubGluZSB2b2lkIExvY0VuZ1JlcG9ydE5tZWE6OmxvY2FsbG9nKCkgY29uc3QgewotICAgIExPQ19MT0dWKCJMb2NFbmdSZXBvcnRObWVhIik7Ci19Ci1pbmxpbmUgdm9pZCBMb2NFbmdSZXBvcnRObWVhOjpsb2coKSBjb25zdCB7Ci0gICAgbG9jYWxsb2coKTsKLX0KLQotLy8gICAgICAgIGNhc2UgTE9DX0VOR19NU0dfUkVQT1JUX1hUUkFfU0VSVkVSOgotTG9jRW5nUmVwb3J0WHRyYVNlcnZlcjo6TG9jRW5nUmVwb3J0WHRyYVNlcnZlcih2b2lkKiBsb2NFbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVybDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVybDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVybDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBtYXhsZW5ndGgpIDoKLSAgICBMb2NNc2coKSwgbUxvY0VuZyhsb2NFbmcpLCBtTWF4TGVuKG1heGxlbmd0aCksCi0gICAgbVNlcnZlcnMobmV3IGNoYXJbMyoobU1heExlbisxKV0pCi17Ci0gICAgY2hhciAqIGNwdHIgPSBtU2VydmVyczsKLSAgICBtZW1zZXQobVNlcnZlcnMsIDAsIDMqKG1NYXhMZW4rMSkpOwotCi0gICAgLy8gT3ZlcnJpZGUgbW9kZW0gVVJMcyB3aXRoIHVuY29tbWVudGVkIGdwcy5jb25mIHVybHMKLSAgICBpZiggZ3BzX2NvbmYuWFRSQV9TRVJWRVJfMVswXSAhPSAnXDAnICkgewotICAgICAgICB1cmwxID0gJmdwc19jb25mLlhUUkFfU0VSVkVSXzFbMF07Ci0gICAgfQotICAgIGlmKCBncHNfY29uZi5YVFJBX1NFUlZFUl8yWzBdICE9ICdcMCcgKSB7Ci0gICAgICAgIHVybDIgPSAmZ3BzX2NvbmYuWFRSQV9TRVJWRVJfMlswXTsKLSAgICB9Ci0gICAgaWYoIGdwc19jb25mLlhUUkFfU0VSVkVSXzNbMF0gIT0gJ1wwJyApIHsKLSAgICAgICAgdXJsMyA9ICZncHNfY29uZi5YVFJBX1NFUlZFUl8zWzBdOwotICAgIH0KLSAgICAvLyBjb3B5IG5vbiB4dHJhMS5ncHNvbmV4dHJhLm5ldCBVUkxzIGludG8gdGhlIGZvcndhcmRpbmcgYnVmZmVyLgotICAgIGlmKCBOVUxMID09IHN0cmNhc2VzdHIodXJsMSwgWFRSQTFfR1BTT05FWFRSQSkgKSB7Ci0gICAgICAgIHN0cmxjcHkoY3B0ciwgdXJsMSwgbU1heExlbiArIDEpOwotICAgICAgICBjcHRyICs9IG1NYXhMZW4gKyAxOwotICAgIH0KLSAgICBpZiggTlVMTCA9PSBzdHJjYXNlc3RyKHVybDIsIFhUUkExX0dQU09ORVhUUkEpICkgewotICAgICAgICBzdHJsY3B5KGNwdHIsIHVybDIsIG1NYXhMZW4gKyAxKTsKLSAgICAgICAgY3B0ciArPSBtTWF4TGVuICsgMTsKLSAgICB9Ci0gICAgaWYoIE5VTEwgPT0gc3RyY2FzZXN0cih1cmwzLCBYVFJBMV9HUFNPTkVYVFJBKSApIHsKLSAgICAgICAgc3RybGNweShjcHRyLCB1cmwzLCBtTWF4TGVuICsgMSk7Ci0gICAgfQotICAgIGxvY2FsbG9nKCk7Ci19Ci12b2lkIExvY0VuZ1JlcG9ydFh0cmFTZXJ2ZXI6OnByb2MoKSBjb25zdCB7Ci0gICAgbG9jX2VuZ194dHJhX2RhdGFfc190eXBlKiBsb2NFbmdYdHJhID0KLSAgICAgICAgJigoKGxvY19lbmdfZGF0YV9zX3R5cGUqKW1Mb2NFbmcpLT54dHJhX21vZHVsZV9kYXRhKTsKLQotICAgIGlmIChsb2NFbmdYdHJhLT5yZXBvcnRfeHRyYV9zZXJ2ZXJfY2IgIT0gTlVMTCkgewotICAgICAgICBDQUxMQkFDS19MT0dfQ0FMTEZMT1coInJlcG9ydF94dHJhX3NlcnZlcl9jYiIsICVzLCBtU2VydmVycyk7Ci0gICAgICAgIGxvY0VuZ1h0cmEtPnJlcG9ydF94dHJhX3NlcnZlcl9jYihtU2VydmVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYobVNlcnZlcnNbbU1heExlbisxXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKG1TZXJ2ZXJzWyhtTWF4TGVuKzEpPDwxXSkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIExPQ19MT0dFKCJDYWxsYmFjayBmdW5jdGlvbiBmb3IgcmVxdWVzdCB4dHJhIGlzIE5VTEwiKTsKLSAgICB9Ci19Ci1pbmxpbmUgdm9pZCBMb2NFbmdSZXBvcnRYdHJhU2VydmVyOjpsb2NhbGxvZygpIGNvbnN0IHsKLSAgICBMT0NfTE9HVigiTG9jRW5nUmVwb3J0WHRyYVNlcnZlcnM6IHNlcnZlcjE6ICVzXG4gIHNlcnZlcjI6ICVzXG4iCi0gICAgICAgICAgICAgIiAgc2VydmVyMzogJXNcbiIsCi0gICAgICAgICAgICAgbVNlcnZlcnMsICZtU2VydmVyc1ttTWF4TGVuKzFdLCAmbVNlcnZlcnNbKG1NYXhMZW4rMSk8PDFdKTsKLX0KLWlubGluZSB2b2lkIExvY0VuZ1JlcG9ydFh0cmFTZXJ2ZXI6OmxvZygpIGNvbnN0IHsKLSAgICBsb2NhbGxvZygpOwotfQotCi0vLyAgICAgICAgY2FzZSBMT0NfRU5HX01TR19SRVFVRVNUX0JJVDoKLS8vICAgICAgICBjYXNlIExPQ19FTkdfTVNHX1JFTEVBU0VfQklUOgotTG9jRW5nUmVxUmVsQklUOjpMb2NFbmdSZXFSZWxCSVQodm9pZCogbG9jRW5nLCBBR3BzRXh0VHlwZSB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlwdjQsIGNoYXIqIGlwdjYsIGJvb2wgaXNSZXEpIDoKLSAgICBMb2NNc2coKSwgbUxvY0VuZyhsb2NFbmcpLCBtVHlwZSh0eXBlKSwgbUlQdjRBZGRyKGlwdjQpLAotICAgIG1JUHY2QWRkcihpcHY2ID8gbmV3IGNoYXJbMTZdIDogTlVMTCksIG1Jc1JlcShpc1JlcSkgewotICAgIGlmIChOVUxMICE9IGlwdjYpCi0gICAgICAgIG1lbWNweShtSVB2NkFkZHIsIGlwdjYsIDE2KTsKLSAgICBsb2NhbGxvZygpOwotfQotaW5saW5lIExvY0VuZ1JlcVJlbEJJVDo6fkxvY0VuZ1JlcVJlbEJJVCgpIHsKLSAgICBpZiAobUlQdjZBZGRyKSB7Ci0gICAgICAgIGRlbGV0ZVtdIG1JUHY2QWRkcjsKLSAgICB9Ci19Ci12b2lkIExvY0VuZ1JlcVJlbEJJVDo6cHJvYygpIGNvbnN0IHsKLSAgICBsb2NfZW5nX2RhdGFfc190eXBlKiBsb2NFbmcgPSAobG9jX2VuZ19kYXRhX3NfdHlwZSopbUxvY0VuZzsKLSAgICBCSVRTdWJzY3JpYmVyIHMoZ2V0QWdwc1N0YXRlTWFjaGluZSgqbG9jRW5nLCBtVHlwZSksCi0gICAgICAgICAgICAgICAgICAgIG1JUHY0QWRkciwgbUlQdjZBZGRyKTsKLSAgICBBZ3BzU3RhdGVNYWNoaW5lKiBzbSA9IChBZ3BzU3RhdGVNYWNoaW5lKilzLm1TdGF0ZU1hY2hpbmU7Ci0KLSAgICBpZiAobUlzUmVxKSB7Ci0gICAgICAgIHNtLT5zdWJzY3JpYmVSc3JjKChTdWJzY3JpYmVyKikmcyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc20tPnVuc3Vic2NyaWJlUnNyYygoU3Vic2NyaWJlciopJnMpOwotICAgIH0KLX0KLWlubGluZSB2b2lkIExvY0VuZ1JlcVJlbEJJVDo6bG9jYWxsb2coKSBjb25zdCB7Ci0gICAgTE9DX0xPR1YoIkxvY0VuZ1JlcXVlc3RCSVQgLSBpcHY0OiAlZC4lZC4lZC4lZCwgaXB2NjogJXMiLAotICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyKW1JUHY0QWRkciwKLSAgICAgICAgICAgICAodW5zaWduZWQgY2hhcikobUlQdjRBZGRyPj44KSwKLSAgICAgICAgICAgICAodW5zaWduZWQgY2hhcikobUlQdjRBZGRyPj4xNiksCi0gICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIpKG1JUHY0QWRkcj4+MjQpLAotICAgICAgICAgICAgIE5VTEwgIT0gbUlQdjZBZGRyID8gbUlQdjZBZGRyIDogIiIpOwotfQotaW5saW5lIHZvaWQgTG9jRW5nUmVxUmVsQklUOjpsb2coKSBjb25zdCB7Ci0gICAgbG9jYWxsb2coKTsKLX0KLXZvaWQgTG9jRW5nUmVxUmVsQklUOjpzZW5kKCkgY29uc3QgewotICAgIGxvY19lbmdfZGF0YV9zX3R5cGUqIGxvY0VuZyA9IChsb2NfZW5nX2RhdGFfc190eXBlKiltTG9jRW5nOwotICAgIGxvY0VuZy0+YWRhcHRlci0+c2VuZE1zZyh0aGlzKTsKLX0KLQotLy8gICAgICAgIGNhc2UgTE9DX0VOR19NU0dfUkVMRUFTRV9CSVQ6Ci1zdHJ1Y3QgTG9jRW5nUmVsZWFzZUJJVCA6IHB1YmxpYyBMb2NNc2cgewotICAgIGNvbnN0IEJJVFN1YnNjcmliZXIgbVN1YnNjcmliZXI7Ci0gICAgaW5saW5lIExvY0VuZ1JlbGVhc2VCSVQoY29uc3QgQWdwc1N0YXRlTWFjaGluZSogc3RhdGVNYWNoaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBpcHY0LCBjaGFyKiBpcHY2KSA6Ci0gICAgICAgIExvY01zZygpLAotICAgICAgICBtU3Vic2NyaWJlcihzdGF0ZU1hY2hpbmUsIGlwdjQsIGlwdjYpCi0gICAgewotICAgICAgICBsb2NhbGxvZygpOwotICAgIH0KLSAgICBpbmxpbmUgdmlydHVhbCB2b2lkIHByb2MoKSBjb25zdAotICAgIHsKLSAgICAgICAgQWdwc1N0YXRlTWFjaGluZSogc20gPSAoQWdwc1N0YXRlTWFjaGluZSopbVN1YnNjcmliZXIubVN0YXRlTWFjaGluZTsKLSAgICAgICAgc20tPnVuc3Vic2NyaWJlUnNyYygoU3Vic2NyaWJlciopJm1TdWJzY3JpYmVyKTsKLSAgICB9Ci0gICAgaW5saW5lIHZvaWQgbG9jYWxsb2coKSBjb25zdCB7Ci0gICAgICAgIExPQ19MT0dWKCJMb2NFbmdSZWxlYXNlQklUIC0gaXB2NDogJWQuJWQuJWQuJWQsIGlwdjY6ICVzIiwKLSAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIpKG1TdWJzY3JpYmVyLklEPj4yNCksCi0gICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyKShtU3Vic2NyaWJlci5JRD4+MTYpLAotICAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhcikobVN1YnNjcmliZXIuSUQ+PjgpLAotICAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhciltU3Vic2NyaWJlci5JRCwKLSAgICAgICAgICAgICAgICAgTlVMTCAhPSBtU3Vic2NyaWJlci5tSVB2NkFkZHIgPyBtU3Vic2NyaWJlci5tSVB2NkFkZHIgOiAiIik7Ci0gICAgfQotICAgIHZpcnR1YWwgdm9pZCBsb2coKSBjb25zdCB7Ci0gICAgICAgIGxvY2FsbG9nKCk7Ci0gICAgfQotfTsKLQotLy8gICAgICAgIExvY0VuZ1N1cGxFc09wZW5lZAotTG9jRW5nU3VwbEVzT3BlbmVkOjpMb2NFbmdTdXBsRXNPcGVuZWQodm9pZCogbG9jRW5nKSA6Ci0gICAgTG9jTXNnKCksIG1Mb2NFbmcobG9jRW5nKSB7Ci0gICAgbG9jYWxsb2coKTsKLX0KLXZvaWQgTG9jRW5nU3VwbEVzT3BlbmVkOjpwcm9jKCkgY29uc3QgewotICAgIGxvY19lbmdfZGF0YV9zX3R5cGUqIGxvY0VuZyA9IChsb2NfZW5nX2RhdGFfc190eXBlKiltTG9jRW5nOwotICAgIGlmIChsb2NFbmctPmRzX25pZikgewotICAgICAgICBBZ3BzU3RhdGVNYWNoaW5lKiBzbSA9IGxvY0VuZy0+ZHNfbmlmOwotICAgICAgICBzbS0+b25Sc3JjRXZlbnQoUlNSQ19HUkFOVEVEKTsKLSAgICB9Ci19Ci12b2lkIExvY0VuZ1N1cGxFc09wZW5lZDo6bG9jYWxsb2coKSBjb25zdCB7Ci0gICAgTE9DX0xPR1YoIkxvY0VuZ1N1cGxFc09wZW5lZCIpOwotfQotdm9pZCBMb2NFbmdTdXBsRXNPcGVuZWQ6OmxvZygpIGNvbnN0IHsKLSAgICBsb2NhbGxvZygpOwotfQotCi0vLyAgICAgICAgTG9jRW5nU3VwbEVzQ2xvc2VkCi1Mb2NFbmdTdXBsRXNDbG9zZWQ6OkxvY0VuZ1N1cGxFc0Nsb3NlZCh2b2lkKiBsb2NFbmcpIDoKLSAgICBMb2NNc2coKSwgbUxvY0VuZyhsb2NFbmcpIHsKLSAgICBsb2NhbGxvZygpOwotfQotdm9pZCBMb2NFbmdTdXBsRXNDbG9zZWQ6OnByb2MoKSBjb25zdCB7Ci0gICAgbG9jX2VuZ19kYXRhX3NfdHlwZSogbG9jRW5nID0gKGxvY19lbmdfZGF0YV9zX3R5cGUqKW1Mb2NFbmc7Ci0gICAgaWYgKGxvY0VuZy0+ZHNfbmlmKSB7Ci0gICAgICAgIEFncHNTdGF0ZU1hY2hpbmUqIHNtID0gbG9jRW5nLT5kc19uaWY7Ci0gICAgICAgIHNtLT5vblJzcmNFdmVudChSU1JDX1JFTEVBU0VEKTsKLSAgICB9Ci19Ci12b2lkIExvY0VuZ1N1cGxFc0Nsb3NlZDo6bG9jYWxsb2coKSBjb25zdCB7Ci0gICAgTE9DX0xPR1YoIkxvY0VuZ1N1cGxFc0Nsb3NlZCIpOwotfQotdm9pZCBMb2NFbmdTdXBsRXNDbG9zZWQ6OmxvZygpIGNvbnN0IHsKLSAgICBsb2NhbGxvZygpOwotfQotCi0KLS8vICAgICAgICBjYXNlIExPQ19FTkdfTVNHX1JFUVVFU1RfU1VQTF9FUzoKLUxvY0VuZ1JlcXVlc3RTdXBsRXM6OkxvY0VuZ1JlcXVlc3RTdXBsRXModm9pZCogbG9jRW5nLCBpbnQgaWQpIDoKLSAgICBMb2NNc2coKSwgbUxvY0VuZyhsb2NFbmcpLCBtSUQoaWQpIHsKLSAgICBsb2NhbGxvZygpOwotfQotdm9pZCBMb2NFbmdSZXF1ZXN0U3VwbEVzOjpwcm9jKCkgY29uc3QgewotICAgIGxvY19lbmdfZGF0YV9zX3R5cGUqIGxvY0VuZyA9IChsb2NfZW5nX2RhdGFfc190eXBlKiltTG9jRW5nOwotICAgIGlmIChsb2NFbmctPmRzX25pZikgewotICAgICAgICBBZ3BzU3RhdGVNYWNoaW5lKiBzbSA9IGxvY0VuZy0+ZHNfbmlmOwotICAgICAgICBEU1N1YnNjcmliZXIgcyhzbSwgbUlEKTsKLSAgICAgICAgc20tPnN1YnNjcmliZVJzcmMoKFN1YnNjcmliZXIqKSZzKTsKLSAgICB9IGVsc2UgewotICAgICAgICBsb2NFbmctPmFkYXB0ZXItPmF0bE9wZW5TdGF0dXMobUlELCAwLCBOVUxMLCAtMSwgLTEpOwotICAgIH0KLX0KLWlubGluZSB2b2lkIExvY0VuZ1JlcXVlc3RTdXBsRXM6OmxvY2FsbG9nKCkgY29uc3QgewotICAgIExPQ19MT0dWKCJMb2NFbmdSZXF1ZXN0U3VwbEVzIik7Ci19Ci1pbmxpbmUgdm9pZCBMb2NFbmdSZXF1ZXN0U3VwbEVzOjpsb2coKSBjb25zdCB7Ci0gICAgbG9jYWxsb2coKTsKLX0KLQotLy8gICAgICAgIGNhc2UgTE9DX0VOR19NU0dfUkVRVUVTVF9BVEw6Ci1Mb2NFbmdSZXF1ZXN0QVRMOjpMb2NFbmdSZXF1ZXN0QVRMKHZvaWQqIGxvY0VuZywgaW50IGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBR3BzRXh0VHlwZSBhZ3BzX3R5cGUpIDoKLSAgICBMb2NNc2coKSwgbUxvY0VuZyhsb2NFbmcpLCBtSUQoaWQpLCBtVHlwZShhZ3BzX3R5cGUpIHsKLSAgICBsb2NhbGxvZygpOwotfQotdm9pZCBMb2NFbmdSZXF1ZXN0QVRMOjpwcm9jKCkgY29uc3QgewotICAgIGxvY19lbmdfZGF0YV9zX3R5cGUqIGxvY0VuZyA9IChsb2NfZW5nX2RhdGFfc190eXBlKiltTG9jRW5nOwotICAgIEFncHNTdGF0ZU1hY2hpbmUqIHNtID0gKEFncHNTdGF0ZU1hY2hpbmUqKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0QWdwc1N0YXRlTWFjaGluZSgqbG9jRW5nLCBtVHlwZSk7Ci0gICAgaWYgKHNtKSB7Ci0gICAgICAgIEFUTFN1YnNjcmliZXIgcyhtSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICBzbSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvY0VuZy0+YWRhcHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFHUFNfVFlQRV9JTlZBTElEID09IG1UeXBlKTsKLSAgICAgICAgc20tPnN1YnNjcmliZVJzcmMoKFN1YnNjcmliZXIqKSZzKTsKLSAgICB9IGVsc2UgewotICAgICAgICBsb2NFbmctPmFkYXB0ZXItPmF0bE9wZW5TdGF0dXMobUlELCAwLCBOVUxMLCAtMSwgbVR5cGUpOwotICAgIH0KLX0KLWlubGluZSB2b2lkIExvY0VuZ1JlcXVlc3RBVEw6OmxvY2FsbG9nKCkgY29uc3QgewotICAgIExPQ19MT0dWKCJMb2NFbmdSZXF1ZXN0QVRMIik7Ci19Ci1pbmxpbmUgdm9pZCBMb2NFbmdSZXF1ZXN0QVRMOjpsb2coKSBjb25zdCB7Ci0gICAgbG9jYWxsb2coKTsKLX0KLQotLy8gICAgICAgIGNhc2UgTE9DX0VOR19NU0dfUkVMRUFTRV9BVEw6Ci1Mb2NFbmdSZWxlYXNlQVRMOjpMb2NFbmdSZWxlYXNlQVRMKHZvaWQqIGxvY0VuZywgaW50IGlkKSA6Ci0gICAgTG9jTXNnKCksIG1Mb2NFbmcobG9jRW5nKSwgbUlEKGlkKSB7Ci0gICAgbG9jYWxsb2coKTsKLX0KLXZvaWQgTG9jRW5nUmVsZWFzZUFUTDo6cHJvYygpIGNvbnN0IHsKLSAgICBsb2NfZW5nX2RhdGFfc190eXBlKiBsb2NFbmcgPSAobG9jX2VuZ19kYXRhX3NfdHlwZSopbUxvY0VuZzsKLQotICAgaWYgKGxvY0VuZy0+YWduc3NfbmlmKSB7Ci0gICAgICAgIEFUTFN1YnNjcmliZXIgczEobUlELCBsb2NFbmctPmFnbnNzX25pZiwgbG9jRW5nLT5hZGFwdGVyLCBmYWxzZSk7Ci0gICAgICAgIGlmIChsb2NFbmctPmFnbnNzX25pZi0+dW5zdWJzY3JpYmVSc3JjKChTdWJzY3JpYmVyKikmczEpKSB7Ci0gICAgICAgICAgICBMT0NfTE9HRCgiJXM6JWRdOiBVbnN1YnNjcmliZWQgZnJvbSBhZ25zc19uaWYiLAotICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIF9fTElORV9fKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChsb2NFbmctPmludGVybmV0X25pZikgewotICAgICAgICBBVExTdWJzY3JpYmVyIHMyKG1JRCwgbG9jRW5nLT5pbnRlcm5ldF9uaWYsIGxvY0VuZy0+YWRhcHRlciwgZmFsc2UpOwotICAgICAgICBpZiAobG9jRW5nLT5pbnRlcm5ldF9uaWYtPnVuc3Vic2NyaWJlUnNyYygoU3Vic2NyaWJlciopJnMyKSkgewotICAgICAgICAgICAgTE9DX0xPR0QoIiVzOiVkXTogVW5zdWJzY3JpYmVkIGZyb20gaW50ZXJuZXRfbmlmIiwKLSAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAobG9jRW5nLT5kc19uaWYpIHsKLSAgICAgICAgRFNTdWJzY3JpYmVyIHMzKGxvY0VuZy0+ZHNfbmlmLCBtSUQpOwotICAgICAgICBpZiAobG9jRW5nLT5kc19uaWYtPnVuc3Vic2NyaWJlUnNyYygoU3Vic2NyaWJlciopJnMzKSkgewotICAgICAgICAgICAgTE9DX0xPR0QoIiVzOiVkXTogVW5zdWJzY3JpYmVkIGZyb20gZHNfbmlmIiwKLSAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBMT0NfTE9HVygiJXM6JWRdOiBDb3VsZCBub3QgcmVsZWFzZSBBVEwuICIKLSAgICAgICAgICAgICAiTm8gc3Vic2NyaWJlcnMgZm91bmRcbiIsCi0gICAgICAgICAgICAgX19mdW5jX18sIF9fTElORV9fKTsKLSAgICBsb2NFbmctPmFkYXB0ZXItPmF0bENsb3NlU3RhdHVzKG1JRCwgMCk7Ci19Ci1pbmxpbmUgdm9pZCBMb2NFbmdSZWxlYXNlQVRMOjpsb2NhbGxvZygpIGNvbnN0IHsKLSAgICBMT0NfTE9HVigiTG9jRW5nUmVsZWFzZUFUTCIpOwotfQotaW5saW5lIHZvaWQgTG9jRW5nUmVsZWFzZUFUTDo6bG9nKCkgY29uc3QgewotICAgIGxvY2FsbG9nKCk7Ci19Ci0KLS8vICAgICAgICBjYXNlIExPQ19FTkdfTVNHX1JFUVVFU1RfV0lGSToKLS8vICAgICAgICBjYXNlIExPQ19FTkdfTVNHX1JFTEVBU0VfV0lGSToKLUxvY0VuZ1JlcVJlbFdpZmk6OkxvY0VuZ1JlcVJlbFdpZmkodm9pZCogbG9jRW5nLCBBR3BzRXh0VHlwZSB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NfaWZfcmVxX3NlbmRlcl9pZF9lX3R5cGUgc2VuZGVyX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiBzLCBjaGFyKiBwLCBib29sIGlzUmVxKSA6Ci0gICAgTG9jTXNnKCksIG1Mb2NFbmcobG9jRW5nKSwgbVR5cGUodHlwZSksIG1TZW5kZXJJZChzZW5kZXJfaWQpLAotICAgIG1TU0lEKE5VTEwgPT0gcyA/IE5VTEwgOiBuZXcgY2hhcltTU0lEX0JVRl9TSVpFXSksCi0gICAgbVBhc3N3b3JkKE5VTEwgPT0gcCA/IE5VTEwgOiBuZXcgY2hhcltTU0lEX0JVRl9TSVpFXSksCi0gICAgbUlzUmVxKGlzUmVxKSB7Ci0gICAgaWYgKE5VTEwgIT0gcykKLSAgICAgICAgc3RybGNweShtU1NJRCwgcywgU1NJRF9CVUZfU0laRSk7Ci0gICAgaWYgKE5VTEwgIT0gcCkKLSAgICAgICAgc3RybGNweShtUGFzc3dvcmQsIHAsIFNTSURfQlVGX1NJWkUpOwotICAgIGxvY2FsbG9nKCk7Ci19Ci1Mb2NFbmdSZXFSZWxXaWZpOjp+TG9jRW5nUmVxUmVsV2lmaSgpIHsKLSAgICBpZiAoTlVMTCAhPSBtU1NJRCkgewotICAgICAgICBkZWxldGVbXSBtU1NJRDsKLSAgICB9Ci0gICAgaWYgKE5VTEwgIT0gbVBhc3N3b3JkKSB7Ci0gICAgICAgIGRlbGV0ZVtdIG1QYXNzd29yZDsKLSAgICB9Ci19Ci12b2lkIExvY0VuZ1JlcVJlbFdpZmk6OnByb2MoKSBjb25zdCB7Ci0gICAgbG9jX2VuZ19kYXRhX3NfdHlwZSogbG9jRW5nID0gKGxvY19lbmdfZGF0YV9zX3R5cGUqKW1Mb2NFbmc7Ci0gICAgaWYgKGxvY0VuZy0+d2lmaV9uaWYpIHsKLSAgICAgICAgV0lGSVN1YnNjcmliZXIgcyhsb2NFbmctPndpZmlfbmlmLCBtU1NJRCwgbVBhc3N3b3JkLCBtU2VuZGVySWQpOwotICAgICAgICBpZiAobUlzUmVxKSB7Ci0gICAgICAgICAgICBsb2NFbmctPndpZmlfbmlmLT5zdWJzY3JpYmVSc3JjKChTdWJzY3JpYmVyKikmcyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBsb2NFbmctPndpZmlfbmlmLT51bnN1YnNjcmliZVJzcmMoKFN1YnNjcmliZXIqKSZzKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGxvY0VuZy0+YWRhcHRlci0+YXRsT3BlblN0YXR1cyhtU2VuZGVySWQsIDAsIE5VTEwsIC0xLCBtVHlwZSk7Ci0gICAgfQotfQotaW5saW5lIHZvaWQgTG9jRW5nUmVxUmVsV2lmaTo6bG9jYWxsb2coKSBjb25zdCB7Ci0gICAgTE9DX0xPR1YoIiVzIC0gc2VuZGVySWQ6ICVkLCBzc2lkOiAlcywgcGFzc3dvcmQ6ICVzIiwKLSAgICAgICAgICAgICBtSXNSZXEgPyAiTG9jRW5nUmVxdWVzdFdpZmkiIDogIkxvY0VuZ1JlbGVhc2VXaWZpIiwKLSAgICAgICAgICAgICBtU2VuZGVySWQsCi0gICAgICAgICAgICAgTlVMTCAhPSBtU1NJRCA/IG1TU0lEIDogIiIsCi0gICAgICAgICAgICAgTlVMTCAhPSBtUGFzc3dvcmQgPyBtUGFzc3dvcmQgOiAiIik7Ci19Ci1pbmxpbmUgdm9pZCBMb2NFbmdSZXFSZWxXaWZpOjpsb2coKSBjb25zdCB7Ci0gICAgbG9jYWxsb2coKTsKLX0KLXZvaWQgTG9jRW5nUmVxUmVsV2lmaTo6c2VuZCgpIGNvbnN0IHsKLSAgICBsb2NfZW5nX2RhdGFfc190eXBlKiBsb2NFbmcgPSAobG9jX2VuZ19kYXRhX3NfdHlwZSopbUxvY0VuZzsKLSAgICBsb2NFbmctPmFkYXB0ZXItPnNlbmRNc2codGhpcyk7Ci19Ci0KLS8vICAgICAgICBjYXNlIExPQ19FTkdfTVNHX1JFUVVFU1RfWFRSQV9EQVRBOgotTG9jRW5nUmVxdWVzdFh0cmE6OkxvY0VuZ1JlcXVlc3RYdHJhKHZvaWQqIGxvY0VuZykgOgotICAgIG1Mb2NFbmcobG9jRW5nKSB7Ci0gICAgbG9jYWxsb2coKTsKLX0KLXZvaWQgTG9jRW5nUmVxdWVzdFh0cmE6OnByb2MoKSBjb25zdAotewotICAgIGxvY19lbmdfeHRyYV9kYXRhX3NfdHlwZSogbG9jRW5nWHRyYSA9Ci0gICAgICAgICYoKChsb2NfZW5nX2RhdGFfc190eXBlKiltTG9jRW5nKS0+eHRyYV9tb2R1bGVfZGF0YSk7Ci0KLSAgICBpZiAobG9jRW5nWHRyYS0+ZG93bmxvYWRfcmVxdWVzdF9jYiAhPSBOVUxMKSB7Ci0gICAgICAgIENBTExCQUNLX0xPR19DQUxMRkxPVygiZG93bmxvYWRfcmVxdWVzdF9jYiIsICVwLCBtTG9jRW5nKTsKLSAgICAgICAgbG9jRW5nWHRyYS0+ZG93bmxvYWRfcmVxdWVzdF9jYigpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIExPQ19MT0dFKCJDYWxsYmFjayBmdW5jdGlvbiBmb3IgcmVxdWVzdCB4dHJhIGlzIE5VTEwiKTsKLSAgICB9Ci19Ci1pbmxpbmUgdm9pZCBMb2NFbmdSZXF1ZXN0WHRyYTo6bG9jYWxsb2coKSBjb25zdCB7Ci0gICAgTE9DX0xPR1YoIkxvY0VuZ1JlcVh0cmEiKTsKLX0KLWlubGluZSB2b2lkIExvY0VuZ1JlcXVlc3RYdHJhOjpsb2coKSBjb25zdCB7Ci0gICAgbG9jYWxsb2coKTsKLX0KLQotLy8gICAgICAgIGNhc2UgTE9DX0VOR19NU0dfUkVRVUVTVF9USU1FOgotTG9jRW5nUmVxdWVzdFRpbWU6OkxvY0VuZ1JlcXVlc3RUaW1lKHZvaWQqIGxvY0VuZykgOgotICAgIExvY01zZygpLCBtTG9jRW5nKGxvY0VuZykKLXsKLSAgICBsb2NhbGxvZygpOwotfQotdm9pZCBMb2NFbmdSZXF1ZXN0VGltZTo6cHJvYygpIGNvbnN0IHsKLSAgICBsb2NfZW5nX2RhdGFfc190eXBlKiBsb2NFbmcgPSAobG9jX2VuZ19kYXRhX3NfdHlwZSopbUxvY0VuZzsKLSAgICBpZiAoZ3BzX2NvbmYuQ0FQQUJJTElUSUVTICYgR1BTX0NBUEFCSUxJVFlfT05fREVNQU5EX1RJTUUpIHsKLSAgICAgICAgaWYgKGxvY0VuZy0+cmVxdWVzdF91dGNfdGltZV9jYiAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBsb2NFbmctPnJlcXVlc3RfdXRjX3RpbWVfY2IoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExPQ19MT0dFKCJDYWxsYmFjayBmdW5jdGlvbiBmb3IgcmVxdWVzdCB0aW1lIGlzIE5VTEwiKTsKLSAgICAgICAgfQotICAgIH0KLX0KLWlubGluZSB2b2lkIExvY0VuZ1JlcXVlc3RUaW1lOjpsb2NhbGxvZygpIGNvbnN0IHsKLSAgICBMT0NfTE9HVigiTG9jRW5nUmVxVGltZSIpOwotfQotaW5saW5lIHZvaWQgTG9jRW5nUmVxdWVzdFRpbWU6OmxvZygpIGNvbnN0IHsKLSAgICBsb2NhbGxvZygpOwotfQotCi0vLyAgICAgICAgY2FzZSBMT0NfRU5HX01TR19ERUxFVEVfQUlESU5HX0RBVEE6Ci1zdHJ1Y3QgTG9jRW5nRGVsQWlkRGF0YSA6IHB1YmxpYyBMb2NNc2cgewotICAgIGxvY19lbmdfZGF0YV9zX3R5cGUqIG1Mb2NFbmc7Ci0gICAgY29uc3QgR3BzQWlkaW5nRGF0YSBtVHlwZTsKLSAgICBpbmxpbmUgTG9jRW5nRGVsQWlkRGF0YShsb2NfZW5nX2RhdGFfc190eXBlKiBsb2NFbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgR3BzQWlkaW5nRGF0YSBmKSA6Ci0gICAgICAgIExvY01zZygpLCBtTG9jRW5nKGxvY0VuZyksIG1UeXBlKGYpCi0gICAgewotICAgICAgICBsb2NhbGxvZygpOwotICAgIH0KLSAgICBpbmxpbmUgdmlydHVhbCB2b2lkIHByb2MoKSBjb25zdCB7Ci0gICAgICAgIG1Mb2NFbmctPmFpZGluZ19kYXRhX2Zvcl9kZWxldGlvbiA9IG1UeXBlOwotICAgICAgICB1cGRhdGVfYWlkaW5nX2RhdGFfZm9yX2RlbGV0aW9uKCptTG9jRW5nKTsKLSAgICB9Ci0gICAgaW5saW5lIHZvaWQgbG9jYWxsb2coKSBjb25zdCB7Ci0gICAgICAgIExPQ19MT0dWKCJhaWRpbmcgZGF0YSBtc2FrICVkIiwgbVR5cGUpOwotICAgIH0KLSAgICB2aXJ0dWFsIHZvaWQgbG9nKCkgY29uc3QgewotICAgICAgICBsb2NhbGxvZygpOwotICAgIH0KLX07Ci0KLS8vICAgICAgICBjYXNlIExPQ19FTkdfTVNHX0VOQUJMRV9EQVRBOgotc3RydWN0IExvY0VuZ0VuYWJsZURhdGEgOiBwdWJsaWMgTG9jTXNnIHsKLSAgICBMb2NFbmdBZGFwdGVyKiBtQWRhcHRlcjsKLSAgICBjb25zdCBpbnQgbUVuYWJsZTsKLSAgICBjaGFyKiBtQVBOOwotICAgIGNvbnN0IGludCBtTGVuOwotICAgIGlubGluZSBMb2NFbmdFbmFibGVEYXRhKExvY0VuZ0FkYXB0ZXIqIGFkYXB0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbmFtZSwgaW50IGxlbiwgaW50IGVuYWJsZSkgOgotICAgICAgICBMb2NNc2coKSwgbUFkYXB0ZXIoYWRhcHRlciksCi0gICAgICAgIG1FbmFibGUoZW5hYmxlKSwgbUFQTihOVUxMKSwgbUxlbihsZW4pCi0gICAgewotICAgICAgICBpZiAoTlVMTCAhPSBuYW1lKSB7Ci0gICAgICAgICAgICBtQVBOID0gbmV3IGNoYXJbbGVuKzFdOwotICAgICAgICAgICAgbWVtY3B5KCh2b2lkKiltQVBOLCAodm9pZCopbmFtZSwgbGVuKTsKLSAgICAgICAgICAgIG1BUE5bbGVuXSA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgbG9jYWxsb2coKTsKLSAgICB9Ci0gICAgaW5saW5lIH5Mb2NFbmdFbmFibGVEYXRhKCkgewotICAgICAgICBpZiAoTlVMTCAhPSBtQVBOKSB7Ci0gICAgICAgICAgICBkZWxldGVbXSBtQVBOOwotICAgICAgICB9Ci0gICAgfQotICAgIGlubGluZSB2aXJ0dWFsIHZvaWQgcHJvYygpIGNvbnN0IHsKLSAgICAgICAgbUFkYXB0ZXItPmVuYWJsZURhdGEobUVuYWJsZSk7Ci0gICAgICAgIGlmIChOVUxMICE9IG1BUE4pIHsKLSAgICAgICAgICAgIG1BZGFwdGVyLT5zZXRBUE4obUFQTiwgbUxlbik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaW5saW5lIHZvaWQgbG9jYWxsb2coKSBjb25zdCB7Ci0gICAgICAgIExPQ19MT0dWKCJhcG46ICVzXG4gIGVuYWJsZTogJWQiLAotICAgICAgICAgICAgICAgICAoTlVMTCA9PSBtQVBOKSA/ICJOVUxMIiA6IG1BUE4sIG1FbmFibGUpOwotICAgIH0KLSAgICBpbmxpbmUgdmlydHVhbCB2b2lkIGxvZygpIGNvbnN0IHsKLSAgICAgICAgbG9jYWxsb2coKTsKLSAgICB9Ci19OwotCi0vLyAgICAgICAgY2FzZSBMT0NfRU5HX01TR19JTkpFQ1RfWFRSQV9EQVRBOgotLy8gbG9jX2VuZ194dHJhLmNwcAotCi0vLyAgICAgICAgY2FzZSBMT0NfRU5HX01TR19TRVRfQ0FQQUJJTElUSUVTOgotc3RydWN0IExvY0VuZ1NldENhcGFiaWxpdGllcyA6IHB1YmxpYyBMb2NNc2cgewotICAgIGxvY19lbmdfZGF0YV9zX3R5cGUqIG1Mb2NFbmc7Ci0gICAgaW5saW5lIExvY0VuZ1NldENhcGFiaWxpdGllcyhsb2NfZW5nX2RhdGFfc190eXBlKiBsb2NFbmcpIDoKLSAgICAgICAgTG9jTXNnKCksIG1Mb2NFbmcobG9jRW5nKQotICAgIHsKLSAgICAgICAgbG9jYWxsb2coKTsKLSAgICB9Ci0gICAgaW5saW5lIHZpcnR1YWwgdm9pZCBwcm9jKCkgY29uc3QgewotICAgICAgICBpZiAoTlVMTCAhPSBtTG9jRW5nLT5zZXRfY2FwYWJpbGl0aWVzX2NiKSB7Ci0gICAgICAgICAgICBMT0NfTE9HVigiY2FsbGluZyBzZXRfY2FwYWJpbGl0aWVzX2NiIDB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgZ3BzX2NvbmYuQ0FQQUJJTElUSUVTKTsKLSAgICAgICAgICAgIG1Mb2NFbmctPnNldF9jYXBhYmlsaXRpZXNfY2IoZ3BzX2NvbmYuQ0FQQUJJTElUSUVTKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExPQ19MT0dWKCJzZXRfY2FwYWJpbGl0aWVzX2NiIGlzIE5VTEwuXG4iKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpbmxpbmUgdm9pZCBsb2NhbGxvZygpIGNvbnN0Ci0gICAgewotICAgICAgICBMT0NfTE9HVigiTG9jRW5nU2V0Q2FwYWJpbGl0aWVzIik7Ci0gICAgfQotICAgIGlubGluZSB2aXJ0dWFsIHZvaWQgbG9nKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIGxvY2FsbG9nKCk7Ci0gICAgfQotfTsKLQotLy8gICAgICAgIGNhc2UgTE9DX0VOR19NU0dfTE9DX0lOSVQ6Ci1zdHJ1Y3QgTG9jRW5nSW5pdCA6IHB1YmxpYyBMb2NNc2cgewotICAgIGxvY19lbmdfZGF0YV9zX3R5cGUqIG1Mb2NFbmc7Ci0gICAgaW5saW5lIExvY0VuZ0luaXQobG9jX2VuZ19kYXRhX3NfdHlwZSogbG9jRW5nKSA6Ci0gICAgICAgIExvY01zZygpLCBtTG9jRW5nKGxvY0VuZykKLSAgICB7Ci0gICAgICAgIGxvY2FsbG9nKCk7Ci0gICAgfQotICAgIGlubGluZSB2aXJ0dWFsIHZvaWQgcHJvYygpIGNvbnN0IHsKLSAgICAgICAgbG9jX2VuZ19yZWluaXQoKm1Mb2NFbmcpOwotICAgICAgICAvLyBzZXQgdGhlIGNhcGFiaWxpdGllcwotICAgICAgICBtTG9jRW5nLT5hZGFwdGVyLT5zZW5kTXNnKG5ldyBMb2NFbmdTZXRDYXBhYmlsaXRpZXMobUxvY0VuZykpOwotICAgIH0KLSAgICBpbmxpbmUgdm9pZCBsb2NhbGxvZygpIGNvbnN0Ci0gICAgewotICAgICAgICBMT0NfTE9HVigiTG9jRW5nSW5pdCIpOwotICAgIH0KLSAgICBpbmxpbmUgdmlydHVhbCB2b2lkIGxvZygpIGNvbnN0Ci0gICAgewotICAgICAgICBsb2NhbGxvZygpOwotICAgIH0KLX07Ci0KLS8vICAgICAgICBjYXNlIExPQ19FTkdfTVNHX1JFUVVFU1RfWFRSQV9TRVJWRVI6Ci0vLyBsb2NfZW5nX3h0cmEuY3BwCi0KLS8vICAgICAgICBjYXNlIExPQ19FTkdfTVNHX0FUTF9PUEVOX1NVQ0NFU1M6Ci1zdHJ1Y3QgTG9jRW5nQXRsT3BlblN1Y2Nlc3MgOiBwdWJsaWMgTG9jTXNnIHsKLSAgICBBZ3BzU3RhdGVNYWNoaW5lKiBtU3RhdGVNYWNoaW5lOwotICAgIGNvbnN0IGludCBtTGVuOwotICAgIGNoYXIqIG1BUE47Ci0gICAgY29uc3QgQUdwc0JlYXJlclR5cGUgbUJlYXJlclR5cGU7Ci0gICAgaW5saW5lIExvY0VuZ0F0bE9wZW5TdWNjZXNzKEFncHNTdGF0ZU1hY2hpbmUqIHN0YXRlbWFjaGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUdwc0JlYXJlclR5cGUgYnR5cGUpIDoKLSAgICAgICAgTG9jTXNnKCksCi0gICAgICAgIG1TdGF0ZU1hY2hpbmUoc3RhdGVtYWNoaW5lKSwgbUxlbihsZW4pLAotICAgICAgICBtQVBOKG5ldyBjaGFyW2xlbisxXSksIG1CZWFyZXJUeXBlKGJ0eXBlKQotICAgIHsKLSAgICAgICAgbWVtY3B5KCh2b2lkKiltQVBOLCAodm9pZCopbmFtZSwgbGVuKTsKLSAgICAgICAgbUFQTltsZW5dID0gMDsKLSAgICAgICAgbG9jYWxsb2coKTsKLSAgICB9Ci0gICAgaW5saW5lIH5Mb2NFbmdBdGxPcGVuU3VjY2VzcygpCi0gICAgewotICAgICAgICBkZWxldGVbXSBtQVBOOwotICAgIH0KLSAgICBpbmxpbmUgdmlydHVhbCB2b2lkIHByb2MoKSBjb25zdCB7Ci0gICAgICAgIG1TdGF0ZU1hY2hpbmUtPnNldEJlYXJlcihtQmVhcmVyVHlwZSk7Ci0gICAgICAgIG1TdGF0ZU1hY2hpbmUtPnNldEFQTihtQVBOLCBtTGVuKTsKLSAgICAgICAgbVN0YXRlTWFjaGluZS0+b25Sc3JjRXZlbnQoUlNSQ19HUkFOVEVEKTsKLSAgICB9Ci0gICAgaW5saW5lIHZvaWQgbG9jYWxsb2coKSBjb25zdCB7Ci0gICAgICAgIExPQ19MT0dWKCJMb2NFbmdBdGxPcGVuU3VjY2VzcyBhZ3BzIHR5cGU6ICVzXG4gIGFwbjogJXNcbiIKLSAgICAgICAgICAgICAgICAgIiAgYmVhcmVyIHR5cGU6ICVzIiwKLSAgICAgICAgICAgICAgICAgbG9jX2dldF9hZ3BzX3R5cGVfbmFtZShtU3RhdGVNYWNoaW5lLT5nZXRUeXBlKCkpLAotICAgICAgICAgICAgICAgICBtQVBOLAotICAgICAgICAgICAgICAgICBsb2NfZ2V0X2FncHNfYmVhcl9uYW1lKG1CZWFyZXJUeXBlKSk7Ci0gICAgfQotICAgIGlubGluZSB2aXJ0dWFsIHZvaWQgbG9nKCkgY29uc3QgewotICAgICAgICBsb2NhbGxvZygpOwotICAgIH0KLX07Ci0KLS8vICAgICAgICBjYXNlIExPQ19FTkdfTVNHX0FUTF9DTE9TRUQ6Ci1zdHJ1Y3QgTG9jRW5nQXRsQ2xvc2VkIDogcHVibGljIExvY01zZyB7Ci0gICAgQWdwc1N0YXRlTWFjaGluZSogbVN0YXRlTWFjaGluZTsKLSAgICBpbmxpbmUgTG9jRW5nQXRsQ2xvc2VkKEFncHNTdGF0ZU1hY2hpbmUqIHN0YXRlbWFjaGluZSkgOgotICAgICAgICBMb2NNc2coKSwgbVN0YXRlTWFjaGluZShzdGF0ZW1hY2hpbmUpIHsKLSAgICAgICAgbG9jYWxsb2coKTsKLSAgICB9Ci0gICAgaW5saW5lIHZpcnR1YWwgdm9pZCBwcm9jKCkgY29uc3QgewotICAgICAgICBtU3RhdGVNYWNoaW5lLT5vblJzcmNFdmVudChSU1JDX1JFTEVBU0VEKTsKLSAgICB9Ci0gICAgaW5saW5lIHZvaWQgbG9jYWxsb2coKSBjb25zdCB7Ci0gICAgICAgIExPQ19MT0dWKCJMb2NFbmdBdGxDbG9zZWQiKTsKLSAgICB9Ci0gICAgaW5saW5lIHZpcnR1YWwgdm9pZCBsb2coKSBjb25zdCB7Ci0gICAgICAgIGxvY2FsbG9nKCk7Ci0gICAgfQotfTsKLQotLy8gICAgICAgIGNhc2UgTE9DX0VOR19NU0dfQVRMX09QRU5fRkFJTEVEOgotc3RydWN0IExvY0VuZ0F0bE9wZW5GYWlsZWQgOiBwdWJsaWMgTG9jTXNnIHsKLSAgICBBZ3BzU3RhdGVNYWNoaW5lKiBtU3RhdGVNYWNoaW5lOwotICAgIGlubGluZSBMb2NFbmdBdGxPcGVuRmFpbGVkKEFncHNTdGF0ZU1hY2hpbmUqIHN0YXRlbWFjaGluZSkgOgotICAgICAgICBMb2NNc2coKSwgbVN0YXRlTWFjaGluZShzdGF0ZW1hY2hpbmUpIHsKLSAgICAgICAgbG9jYWxsb2coKTsKLSAgICB9Ci0gICAgaW5saW5lIHZpcnR1YWwgdm9pZCBwcm9jKCkgY29uc3QgewotICAgICAgICBtU3RhdGVNYWNoaW5lLT5vblJzcmNFdmVudChSU1JDX0RFTklFRCk7Ci0gICAgfQotICAgIGlubGluZSB2b2lkIGxvY2FsbG9nKCkgY29uc3QgewotICAgICAgICBMT0NfTE9HVigiTG9jRW5nQXRsT3BlbkZhaWxlZCIpOwotICAgIH0KLSAgICBpbmxpbmUgdmlydHVhbCB2b2lkIGxvZygpIGNvbnN0IHsKLSAgICAgICAgbG9jYWxsb2coKTsKLSAgICB9Ci19OwotCi0vLyAgICAgICAgY2FzZSBMT0NfRU5HX01TR19FTkdJTkVfRE9XTjoKLUxvY0VuZ0Rvd246OkxvY0VuZ0Rvd24odm9pZCogbG9jRW5nKSA6Ci0gICAgTG9jTXNnKCksIG1Mb2NFbmcobG9jRW5nKSB7Ci0gICAgbG9jYWxsb2coKTsKLX0KLWlubGluZSB2b2lkIExvY0VuZ0Rvd246OnByb2MoKSBjb25zdCB7Ci0gICAgbG9jX2VuZ19kYXRhX3NfdHlwZSogbG9jRW5nID0gKGxvY19lbmdfZGF0YV9zX3R5cGUqKW1Mb2NFbmc7Ci0gICAgbG9jX2VuZ19oYW5kbGVfZW5naW5lX2Rvd24oKmxvY0VuZyk7Ci19Ci1pbmxpbmUgdm9pZCBMb2NFbmdEb3duOjpsb2NhbGxvZygpIGNvbnN0IHsKLSAgICBMT0NfTE9HVigiTG9jRW5nRG93biIpOwotfQotaW5saW5lIHZvaWQgTG9jRW5nRG93bjo6bG9nKCkgY29uc3QgewotICAgIGxvY2FsbG9nKCk7Ci19Ci0KLS8vICAgICAgICBjYXNlIExPQ19FTkdfTVNHX0VOR0lORV9VUDoKLUxvY0VuZ1VwOjpMb2NFbmdVcCh2b2lkKiBsb2NFbmcpIDoKLSAgICBMb2NNc2coKSwgbUxvY0VuZyhsb2NFbmcpIHsKLSAgICBsb2NhbGxvZygpOwotfQotaW5saW5lIHZvaWQgTG9jRW5nVXA6OnByb2MoKSBjb25zdCB7Ci0gICAgbG9jX2VuZ19kYXRhX3NfdHlwZSogbG9jRW5nID0gKGxvY19lbmdfZGF0YV9zX3R5cGUqKW1Mb2NFbmc7Ci0gICAgbG9jX2VuZ19oYW5kbGVfZW5naW5lX3VwKCpsb2NFbmcpOwotfQotaW5saW5lIHZvaWQgTG9jRW5nVXA6OmxvY2FsbG9nKCkgY29uc3QgewotICAgIExPQ19MT0dWKCJMb2NFbmdVcCIpOwotfQotaW5saW5lIHZvaWQgTG9jRW5nVXA6OmxvZygpIGNvbnN0IHsKLSAgICBsb2NhbGxvZygpOwotfQotCi1zdHJ1Y3QgTG9jRW5nRGF0YUNsaWVudEluaXQgOiBwdWJsaWMgTG9jTXNnIHsKLSAgICBsb2NfZW5nX2RhdGFfc190eXBlKiBtTG9jRW5nOwotICAgIGlubGluZSBMb2NFbmdEYXRhQ2xpZW50SW5pdChsb2NfZW5nX2RhdGFfc190eXBlKiBsb2NFbmcpIDoKLSAgICAgICAgTG9jTXNnKCksIG1Mb2NFbmcobG9jRW5nKSB7Ci0gICAgICAgIGxvY2FsbG9nKCk7Ci0gICAgfQotICAgIHZpcnR1YWwgdm9pZCBwcm9jKCkgY29uc3QgewotICAgICAgICBsb2NfZW5nX2RhdGFfc190eXBlICpsb2NFbmcgPSAobG9jX2VuZ19kYXRhX3NfdHlwZSAqKW1Mb2NFbmc7Ci0gICAgICAgIGlmKCFsb2NFbmctPmFkYXB0ZXItPmluaXREYXRhU2VydmljZUNsaWVudCgpKSB7Ci0gICAgICAgICAgICBsb2NFbmctPmRzX25pZiA9IG5ldyBEU1N0YXRlTWFjaGluZShzZXJ2aWNlclR5cGVFeHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopZGF0YUNhbGxDYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jRW5nLT5hZGFwdGVyKTsKLSAgICAgICAgfQotICAgIH0KLSAgICB2b2lkIGxvY2FsbG9nKCkgY29uc3QgewotICAgICAgICBMT0NfTE9HVigiTG9jRW5nRGF0YUNsaWVudEluaXRcbiIpOwotICAgIH0KLSAgICB2aXJ0dWFsIHZvaWQgbG9nKCkgY29uc3QgewotICAgICAgICBsb2NhbGxvZygpOwotICAgIH0KLX07Ci0KLXN0cnVjdCBMb2NFbmdJbnN0YWxsQUdwc0NlcnQgOiBwdWJsaWMgTG9jTXNnIHsKLSAgICBMb2NFbmdBZGFwdGVyKiBtcEFkYXB0ZXI7Ci0gICAgY29uc3Qgc2l6ZV90IG1OdW1iZXJPZkNlcnRzOwotICAgIGNvbnN0IHVpbnQzMl90IG1TbG90Qml0TWFzazsKLSAgICBEZXJFbmNvZGVkQ2VydGlmaWNhdGUqIG1wRGF0YTsKLSAgICBpbmxpbmUgTG9jRW5nSW5zdGFsbEFHcHNDZXJ0KExvY0VuZ0FkYXB0ZXIqIGFkYXB0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXJFbmNvZGVkQ2VydGlmaWNhdGUqIHBEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG51bWJlck9mQ2VydHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzbG90Qml0TWFzaykgOgotICAgICAgICBMb2NNc2coKSwgbXBBZGFwdGVyKGFkYXB0ZXIpLAotICAgICAgICBtTnVtYmVyT2ZDZXJ0cyhudW1iZXJPZkNlcnRzKSwgbVNsb3RCaXRNYXNrKHNsb3RCaXRNYXNrKSwKLSAgICAgICAgbXBEYXRhKG5ldyBEZXJFbmNvZGVkQ2VydGlmaWNhdGVbbU51bWJlck9mQ2VydHNdKQotICAgIHsKLSAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgbU51bWJlck9mQ2VydHM7IGkrKykgewotICAgICAgICAgICAgbXBEYXRhW2ldLmRhdGEgPSBuZXcgdV9jaGFyW3BEYXRhW2ldLmxlbmd0aF07Ci0gICAgICAgICAgICBpZiAobXBEYXRhW2ldLmRhdGEpIHsKLSAgICAgICAgICAgICAgICBtZW1jcHkobXBEYXRhW2ldLmRhdGEsICh2b2lkKilwRGF0YVtpXS5kYXRhLCBwRGF0YVtpXS5sZW5ndGgpOwotICAgICAgICAgICAgICAgIG1wRGF0YVtpXS5sZW5ndGggPSBwRGF0YVtpXS5sZW5ndGg7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIExPQ19MT0dFKCJtYWxsb2MgZmFpbGVkIGZvciBjZXJ0IyVkIiwgaSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbG9jYWxsb2coKTsKLSAgICB9Ci0gICAgaW5saW5lIH5Mb2NFbmdJbnN0YWxsQUdwc0NlcnQoKQotICAgIHsKLSAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgbU51bWJlck9mQ2VydHM7IGkrKykgewotICAgICAgICAgICAgaWYgKG1wRGF0YVtpXS5kYXRhKSB7Ci0gICAgICAgICAgICAgICAgZGVsZXRlW10gbXBEYXRhW2ldLmRhdGE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZGVsZXRlW10gbXBEYXRhOwotICAgIH0KLSAgICBpbmxpbmUgdmlydHVhbCB2b2lkIHByb2MoKSBjb25zdCB7Ci0gICAgICAgIG1wQWRhcHRlci0+aW5zdGFsbEFHcHNDZXJ0KG1wRGF0YSwgbU51bWJlck9mQ2VydHMsIG1TbG90Qml0TWFzayk7Ci0gICAgfQotICAgIGlubGluZSB2b2lkIGxvY2FsbG9nKCkgY29uc3QgewotICAgICAgICBMT0NfTE9HVigiTG9jRW5nSW5zdGFsbEFHcHNDZXJ0IC0gY2VydHM9JXUgbWFzaz0ldSIsCi0gICAgICAgICAgICAgICAgIG1OdW1iZXJPZkNlcnRzLCBtU2xvdEJpdE1hc2spOwotICAgIH0KLSAgICBpbmxpbmUgdmlydHVhbCB2b2lkIGxvZygpIGNvbnN0IHsKLSAgICAgICAgbG9jYWxsb2coKTsKLSAgICB9Ci19OwotCi1zdHJ1Y3QgTG9jRW5nVXBkYXRlUmVnaXN0cmF0aW9uTWFzayA6IHB1YmxpYyBMb2NNc2cgewotICAgIGxvY19lbmdfZGF0YV9zX3R5cGUqIG1Mb2NFbmc7Ci0gICAgTE9DX0FQSV9BREFQVEVSX0VWRU5UX01BU0tfVCBtTWFzazsKLSAgICBsb2NfcmVnaXN0cmF0aW9uX21hc2tfc3RhdHVzIG1Jc0VuYWJsZWQ7Ci0gICAgaW5saW5lIExvY0VuZ1VwZGF0ZVJlZ2lzdHJhdGlvbk1hc2sobG9jX2VuZ19kYXRhX3NfdHlwZSogbG9jRW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPQ19BUElfQURBUFRFUl9FVkVOVF9NQVNLX1QgbWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NfcmVnaXN0cmF0aW9uX21hc2tfc3RhdHVzIGlzRW5hYmxlZCkgOgotICAgICAgICBMb2NNc2coKSwgbUxvY0VuZyhsb2NFbmcpLCBtTWFzayhtYXNrKSwgbUlzRW5hYmxlZChpc0VuYWJsZWQpIHsKLSAgICAgICAgbG9jYWxsb2coKTsKLSAgICB9Ci0gICAgaW5saW5lIHZpcnR1YWwgdm9pZCBwcm9jKCkgY29uc3QgewotICAgICAgICBsb2NfZW5nX2RhdGFfc190eXBlICpsb2NFbmcgPSAobG9jX2VuZ19kYXRhX3NfdHlwZSAqKW1Mb2NFbmc7Ci0gICAgICAgIGxvY0VuZy0+YWRhcHRlci0+dXBkYXRlUmVnaXN0cmF0aW9uTWFzayhtTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Jc0VuYWJsZWQpOwotICAgIH0KLSAgICB2b2lkIGxvY2FsbG9nKCkgY29uc3QgewotICAgICAgICBMT0NfTE9HVigiTG9jRW5nVXBkYXRlUmVnaXN0cmF0aW9uTWFza1xuIik7Ci0gICAgfQotICAgIHZpcnR1YWwgdm9pZCBsb2coKSBjb25zdCB7Ci0gICAgICAgIGxvY2FsbG9nKCk7Ci0gICAgfQotfTsKLQotc3RydWN0IExvY0VuZ0duc3NDb25zdGVsbGF0aW9uQ29uZmlnIDogcHVibGljIExvY01zZyB7Ci0gICAgTG9jRW5nQWRhcHRlciogbUFkYXB0ZXI7Ci0gICAgaW5saW5lIExvY0VuZ0duc3NDb25zdGVsbGF0aW9uQ29uZmlnKExvY0VuZ0FkYXB0ZXIqIGFkYXB0ZXIpIDoKLSAgICAgICAgTG9jTXNnKCksIG1BZGFwdGVyKGFkYXB0ZXIpIHsKLSAgICAgICAgbG9jYWxsb2coKTsKLSAgICB9Ci0gICAgaW5saW5lIHZpcnR1YWwgdm9pZCBwcm9jKCkgY29uc3QgewotICAgICAgICBpZiAobUFkYXB0ZXItPmduc3NDb25zdGVsbGF0aW9uQ29uZmlnKCkpIHsKLSAgICAgICAgICAgIExPQ19MT0dWKCJNb2RlbSBzdXBwb3J0cyBHTlNTIG1lYXN1cmVtZW50c1xuIik7Ci0gICAgICAgICAgICBncHNfY29uZi5DQVBBQklMSVRJRVMgfD0gR1BTX0NBUEFCSUxJVFlfTUVBU1VSRU1FTlRTOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTE9DX0xPR1YoIk1vZGVtIGRvZXMgbm90IHN1cHBvcnQgR05TUyBtZWFzdXJlbWVudHNcbiIpOwotICAgICAgICB9Ci0gICAgfQotICAgIHZvaWQgbG9jYWxsb2coKSBjb25zdCB7Ci0gICAgICAgIExPQ19MT0dWKCJMb2NFbmdHbnNzQ29uc3RlbGxhdGlvbkNvbmZpZ1xuIik7Ci0gICAgfQotICAgIHZpcnR1YWwgdm9pZCBsb2coKSBjb25zdCB7Ci0gICAgICAgIGxvY2FsbG9nKCk7Ci0gICAgfQotfTsKLQotLy8gICAgICAgIGNhc2UgTE9DX0VOR19NU0dfUkVQT1JUX0dOU1NfTUVBU1VSRU1FTlQ6Ci1Mb2NFbmdSZXBvcnRHcHNNZWFzdXJlbWVudDo6TG9jRW5nUmVwb3J0R3BzTWVhc3VyZW1lbnQodm9pZCogbG9jRW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdwc0RhdGEgJmdwc0RhdGEpIDoKLSAgICBMb2NNc2coKSwgbUxvY0VuZyhsb2NFbmcpLCBtR3BzRGF0YShncHNEYXRhKQotewotICAgIGxvY2FsbG9nKCk7Ci19Ci12b2lkIExvY0VuZ1JlcG9ydEdwc01lYXN1cmVtZW50Ojpwcm9jKCkgY29uc3QgewotICAgIGxvY19lbmdfZGF0YV9zX3R5cGUqIGxvY0VuZyA9IChsb2NfZW5nX2RhdGFfc190eXBlKikgbUxvY0VuZzsKLSAgICBpZiAobG9jRW5nLT5tdXRlX3Nlc3Npb25fc3RhdGUgIT0gTE9DX01VVEVfU0VTU19JTl9TRVNTSU9OKQotICAgIHsKLSAgICAgICAgaWYgKGxvY0VuZy0+Z3BzX21lYXN1cmVtZW50X2NiICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGxvY0VuZy0+Z3BzX21lYXN1cmVtZW50X2NiKChHcHNEYXRhKikmKG1HcHNEYXRhKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci12b2lkIExvY0VuZ1JlcG9ydEdwc01lYXN1cmVtZW50Ojpsb2NhbGxvZygpIGNvbnN0IHsKLSAgICBJRl9MT0NfTE9HViB7Ci0gICAgICAgIExPQ19MT0dWKCIlczolZF06IFJlY2VpdmVkIGluIEdQUyBIQUwuIgotICAgICAgICAgICAgICAgICAiR05TUyBNZWFzdXJlbWVudHMgY291bnQ6ICVkIFxuIiwKLSAgICAgICAgICAgICAgICAgX19mdW5jX18sIF9fTElORV9fLCBtR3BzRGF0YS5tZWFzdXJlbWVudF9jb3VudCk7Ci0gICAgICAgIGZvciAoaW50IGkgPTA7IGk8IG1HcHNEYXRhLm1lYXN1cmVtZW50X2NvdW50ICYmIGkgPCBHUFNfTUFYX1NWUzsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgTE9DX0xPR1YoIiBHTlNTIG1lYXN1cmVtZW50IGRhdGEgaW4gR1BTIEhBTDogXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgIiBHUFNfSEFMID0+IE1lYXN1cmVtZW50IElEIHwgcHJuIHwgdGltZV9vZmZzZXRfbnMgfCBzdGF0ZSB8IgotICAgICAgICAgICAgICAgICAgICAgICAgICIgcmVjZWl2ZWRfZ3BzX3Rvd19uc3wgY19uMF9kYmh6IHwgcHNldWRvcmFuZ2VfcmF0ZV9tcHMgfCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAiIHBzZXVkb3JhbmdlX3JhdGVfdW5jZXJ0YWludHlfbXBzIHwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgIiBhY2N1bXVsYXRlZF9kZWx0YV9yYW5nZV9zdGF0ZSB8IGZsYWdzIFxuIgotICAgICAgICAgICAgICAgICAgICAgICAgICIgR1BTX0hBTCA9PiAlZCB8ICVkIHwgJWYgfCAlZCB8ICVsbGQgfCAlZiB8ICVmIHwgJWYgfCAlZCB8ICVkIFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpLAotICAgICAgICAgICAgICAgICAgICAgICAgIG1HcHNEYXRhLm1lYXN1cmVtZW50c1tpXS5wcm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgbUdwc0RhdGEubWVhc3VyZW1lbnRzW2ldLnRpbWVfb2Zmc2V0X25zLAotICAgICAgICAgICAgICAgICAgICAgICAgIG1HcHNEYXRhLm1lYXN1cmVtZW50c1tpXS5zdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBtR3BzRGF0YS5tZWFzdXJlbWVudHNbaV0ucmVjZWl2ZWRfZ3BzX3Rvd19ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICBtR3BzRGF0YS5tZWFzdXJlbWVudHNbaV0uY19uMF9kYmh6LAotICAgICAgICAgICAgICAgICAgICAgICAgIG1HcHNEYXRhLm1lYXN1cmVtZW50c1tpXS5wc2V1ZG9yYW5nZV9yYXRlX21wcywKLSAgICAgICAgICAgICAgICAgICAgICAgICBtR3BzRGF0YS5tZWFzdXJlbWVudHNbaV0ucHNldWRvcmFuZ2VfcmF0ZV91bmNlcnRhaW50eV9tcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgbUdwc0RhdGEubWVhc3VyZW1lbnRzW2ldLmFjY3VtdWxhdGVkX2RlbHRhX3JhbmdlX3N0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgIG1HcHNEYXRhLm1lYXN1cmVtZW50c1tpXS5mbGFncyk7Ci0gICAgICAgIH0KLSAgICAgICAgTE9DX0xPR1YoIiBHUFNfSEFMID0+IENsb2NrcyBJbmZvOiB0eXBlIHwgdGltZV9ucyBcbiIKLSAgICAgICAgICAgICAgICAgIiBHUFNfSEFMID0+IENsb2NrcyBJbmZvOiAlZCB8ICVsbGQiLCBtR3BzRGF0YS5jbG9jay50eXBlLAotICAgICAgICAgICAgICAgICBtR3BzRGF0YS5jbG9jay50aW1lX25zKTsKLSAgICB9Ci19Ci1pbmxpbmUgdm9pZCBMb2NFbmdSZXBvcnRHcHNNZWFzdXJlbWVudDo6bG9nKCkgY29uc3QgewotICAgIGxvY2FsbG9nKCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogSW5pdGlhbGl6YXRpb24gY2hlY2tpbmcgbWFjcm9zCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBTVEFURV9DSEVDSyhjdHgsIHgsIHJldCkgXAotICAgIGlmICghKGN0eCkpICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgLyogTm90IGludGlhbGl6ZWQsIGFib3J0ICovXAotICAgICAgTE9DX0xPR0UoIiVzOiBsb2dfZW5nIHN0YXRlIGVycm9yOiAlcyIsIF9fZnVuY19fLCB4KTsgXAotICAgICAgRVhJVF9MT0coJXMsIHgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgcmV0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0jZGVmaW5lIElOSVRfQ0hFQ0soY3R4LCByZXQpIFNUQVRFX0NIRUNLKGN0eCwgImluc3RhbmNlIG5vdCBpbml0aWFsaXplZCIsIHJldCkKLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLUZVTkNUSU9OICAgIGxvY19lbmdfaW5pdAotCi1ERVNDUklQVElPTgotICAgSW5pdGlhbGl6ZSB0aGUgbG9jYXRpb24gZW5naW5lLCB0aGlzIGluY2x1ZGUgc2V0dGluZyB1cCBnbG9iYWwgZGF0YXMKLSAgIGFuZCByZWdpc3RlcnMgbG9jYXRpb24gZW5naWVuIHdpdGggbG9jIGFwaSBzZXJ2aWNlLgotCi1ERVBFTkRFTkNJRVMKLSAgIE5vbmUKLQotUkVUVVJOIFZBTFVFCi0gICAwOiBzdWNjZXNzCi0KLVNJREUgRUZGRUNUUwotICAgTi9BCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi1pbnQgbG9jX2VuZ19pbml0KGxvY19lbmdfZGF0YV9zX3R5cGUgJmxvY19lbmdfZGF0YSwgTG9jQ2FsbGJhY2tzKiBjYWxsYmFja3MsCi0gICAgICAgICAgICAgICAgIExPQ19BUElfQURBUFRFUl9FVkVOVF9NQVNLX1QgZXZlbnQsIENvbnRleHRCYXNlKiBjb250ZXh0KQotCi17Ci0gICAgaW50IHJldF92YWwgPSAwOwotCi0gICAgRU5UUllfTE9HX0NBTExGTE9XKCk7Ci0gICAgaWYgKE5VTEwgPT0gY2FsbGJhY2tzIHx8IDAgPT0gZXZlbnQpIHsKLSAgICAgICAgTE9DX0xPR0UoImxvY19lbmdfaW5pdDogYmFkIHBhcmFtZXRlcnMgY2IgJXAgZU1hc2sgJWQiLCBjYWxsYmFja3MsIGV2ZW50KTsKLSAgICAgICAgcmV0X3ZhbCA9IC0xOwotICAgICAgICBFWElUX0xPRyglZCwgcmV0X3ZhbCk7Ci0gICAgICAgIHJldHVybiByZXRfdmFsOwotICAgIH0KLQotICAgIFNUQVRFX0NIRUNLKChOVUxMID09IGxvY19lbmdfZGF0YS5hZGFwdGVyKSwKLSAgICAgICAgICAgICAgICAiaW5zdGFuY2UgYWxyZWFkeSBpbml0aWFsaXplZCIsIHJldHVybiAwKTsKLQotICAgIG1lbXNldCgmbG9jX2VuZ19kYXRhLCAwLCBzaXplb2YgKGxvY19lbmdfZGF0YSkpOwotCi0gICAgLy8gU2F2ZSBjYWxsYmFja3MKLSAgICBsb2NfZW5nX2RhdGEubG9jYXRpb25fY2IgID0gY2FsbGJhY2tzLT5sb2NhdGlvbl9jYjsKLSAgICBsb2NfZW5nX2RhdGEuc3Zfc3RhdHVzX2NiID0gY2FsbGJhY2tzLT5zdl9zdGF0dXNfY2I7Ci0gICAgbG9jX2VuZ19kYXRhLnN0YXR1c19jYiAgICA9IGNhbGxiYWNrcy0+c3RhdHVzX2NiOwotICAgIGxvY19lbmdfZGF0YS5ubWVhX2NiICAgICAgPSBjYWxsYmFja3MtPm5tZWFfY2I7Ci0gICAgbG9jX2VuZ19kYXRhLnNldF9jYXBhYmlsaXRpZXNfY2IgPSBjYWxsYmFja3MtPnNldF9jYXBhYmlsaXRpZXNfY2I7Ci0gICAgbG9jX2VuZ19kYXRhLmFjcXVpcmVfd2FrZWxvY2tfY2IgPSBjYWxsYmFja3MtPmFjcXVpcmVfd2FrZWxvY2tfY2I7Ci0gICAgbG9jX2VuZ19kYXRhLnJlbGVhc2Vfd2FrZWxvY2tfY2IgPSBjYWxsYmFja3MtPnJlbGVhc2Vfd2FrZWxvY2tfY2I7Ci0gICAgbG9jX2VuZ19kYXRhLnJlcXVlc3RfdXRjX3RpbWVfY2IgPSBjYWxsYmFja3MtPnJlcXVlc3RfdXRjX3RpbWVfY2I7Ci0gICAgbG9jX2VuZ19kYXRhLmxvY2F0aW9uX2V4dF9wYXJzZXIgPSBjYWxsYmFja3MtPmxvY2F0aW9uX2V4dF9wYXJzZXIgPwotICAgICAgICBjYWxsYmFja3MtPmxvY2F0aW9uX2V4dF9wYXJzZXIgOiBub1Byb2M7Ci0gICAgbG9jX2VuZ19kYXRhLnN2X2V4dF9wYXJzZXIgPSBjYWxsYmFja3MtPnN2X2V4dF9wYXJzZXIgPwotICAgICAgICBjYWxsYmFja3MtPnN2X2V4dF9wYXJzZXIgOiBub1Byb2M7Ci0gICAgbG9jX2VuZ19kYXRhLmludGVybWVkaWF0ZUZpeCA9IGdwc19jb25mLklOVEVSTUVESUFURV9QT1M7Ci0gICAgbG9jX2VuZ19kYXRhLnNodXRkb3duX2NiID0gY2FsbGJhY2tzLT5zaHV0ZG93bl9jYjsKLSAgICAvLyBpbml0aWFsIHN0YXRlcyB0YWtlbiBjYXJlIG9mIGJ5IHRoZSBtZW1zZXQgYWJvdmUKLSAgICAvLyBsb2NfZW5nX2RhdGEuZW5naW5lX3N0YXR1cyAtLSBHUFNfU1RBVFVTX05PTkU7Ci0gICAgLy8gbG9jX2VuZ19kYXRhLmZpeF9zZXNzaW9uX3N0YXR1cyAtLSBHUFNfU1RBVFVTX05PTkU7Ci0gICAgLy8gbG9jX2VuZ19kYXRhLm11dGVfc2Vzc2lvbl9zdGF0ZSAtLSBMT0NfTVVURV9TRVNTX05PTkU7Ci0KLSAgICBpZiAoKGV2ZW50ICYgTE9DX0FQSV9BREFQVEVSX0JJVF9OTUVBXzFIWl9SRVBPUlQpICYmIChncHNfY29uZi5OTUVBX1BST1ZJREVSID09IE5NRUFfUFJPVklERVJfQVApKQotICAgIHsKLSAgICAgICAgZXZlbnQgPSBldmVudCBeIExPQ19BUElfQURBUFRFUl9CSVRfTk1FQV8xSFpfUkVQT1JUOyAvLyB1bnJlZ2lzdGVyIGZvciBtb2RlbSBOTUVBIHJlcG9ydAotICAgICAgICBsb2NfZW5nX2RhdGEuZ2VuZXJhdGVObWVhID0gdHJ1ZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgbG9jX2VuZ19kYXRhLmdlbmVyYXRlTm1lYSA9IGZhbHNlOwotICAgIH0KLQotICAgIGxvY19lbmdfZGF0YS5hZGFwdGVyID0KLSAgICAgICAgbmV3IExvY0VuZ0FkYXB0ZXIoZXZlbnQsICZsb2NfZW5nX2RhdGEsIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChNc2dUYXNrOjp0Q3JlYXRlKWNhbGxiYWNrcy0+Y3JlYXRlX3RocmVhZF9jYik7Ci0KLSAgICBMT0NfTE9HRCgibG9jX2VuZ19pbml0IGNyZWF0ZWQgY2xpZW50LCBpZCA9ICVwXG4iLAotICAgICAgICAgICAgIGxvY19lbmdfZGF0YS5hZGFwdGVyKTsKLSAgICBsb2NfZW5nX2RhdGEuYWRhcHRlci0+c2VuZE1zZyhuZXcgTG9jRW5nSW5pdCgmbG9jX2VuZ19kYXRhKSk7Ci0KLSAgICBFWElUX0xPRyglZCwgcmV0X3ZhbCk7Ci0gICAgcmV0dXJuIHJldF92YWw7Ci19Ci0KLXN0YXRpYyBpbnQgbG9jX2VuZ19yZWluaXQobG9jX2VuZ19kYXRhX3NfdHlwZSAmbG9jX2VuZ19kYXRhKQotewotICAgIEVOVFJZX0xPRygpOwotICAgIGludCByZXRfdmFsID0gTE9DX0FQSV9BREFQVEVSX0VSUl9TVUNDRVNTOwotCi0gICAgaWYgKExPQ19BUElfQURBUFRFUl9FUlJfU1VDQ0VTUyA9PSByZXRfdmFsKSB7Ci0gICAgICAgIExPQ19MT0dEKCJsb2NfZW5nX3JlaW5pdCByZWluaXQoKSBzdWNjZXNzZnVsIik7Ci0KLSAgICAgICAgTG9jRW5nQWRhcHRlciogYWRhcHRlciA9IGxvY19lbmdfZGF0YS5hZGFwdGVyOwotICAgICAgICBhZGFwdGVyLT5zZW5kTXNnKG5ldyBMb2NFbmdHbnNzQ29uc3RlbGxhdGlvbkNvbmZpZyhhZGFwdGVyKSk7Ci0gICAgICAgIGFkYXB0ZXItPnNlbmRNc2cobmV3IExvY0VuZ1N1cGxWZXIoYWRhcHRlciwgZ3BzX2NvbmYuU1VQTF9WRVIpKTsKLSAgICAgICAgYWRhcHRlci0+c2VuZE1zZyhuZXcgTG9jRW5nTHBwQ29uZmlnKGFkYXB0ZXIsIGdwc19jb25mLkxQUF9QUk9GSUxFKSk7Ci0gICAgICAgIGFkYXB0ZXItPnNlbmRNc2cobmV3IExvY0VuZ1NlbnNvckNvbnRyb2xDb25maWcoYWRhcHRlciwgc2FwX2NvbmYuU0VOU09SX1VTQUdFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhcF9jb25mLlNFTlNPUl9QUk9WSURFUikpOwotICAgICAgICBhZGFwdGVyLT5zZW5kTXNnKG5ldyBMb2NFbmdBR2xvbmFzc1Byb3RvY29sKGFkYXB0ZXIsIGdwc19jb25mLkFfR0xPTkFTU19QT1NfUFJPVE9DT0xfU0VMRUNUKSk7Ci0KLSAgICAgICAgLyogTWFrZSBzdXJlIGF0IGxlYXN0IG9uZSBvZiB0aGUgc2Vuc29yIHByb3BlcnR5IGlzIHNwZWNpZmllZCBieSB0aGUgdXNlciBpbiB0aGUgZ3BzLmNvbmYgZmlsZS4gKi8KLSAgICAgICAgaWYoIHNhcF9jb25mLkdZUk9fQklBU19SQU5ET01fV0FMS19WQUxJRCB8fAotICAgICAgICAgICAgc2FwX2NvbmYuQUNDRUxfUkFORE9NX1dBTEtfU1BFQ1RSQUxfREVOU0lUWV9WQUxJRCB8fAotICAgICAgICAgICAgc2FwX2NvbmYuQU5HTEVfUkFORE9NX1dBTEtfU1BFQ1RSQUxfREVOU0lUWV9WQUxJRCB8fAotICAgICAgICAgICAgc2FwX2NvbmYuUkFURV9SQU5ET01fV0FMS19TUEVDVFJBTF9ERU5TSVRZX1ZBTElEIHx8Ci0gICAgICAgICAgICBzYXBfY29uZi5WRUxPQ0lUWV9SQU5ET01fV0FMS19TUEVDVFJBTF9ERU5TSVRZX1ZBTElEICkKLSAgICAgICAgewotICAgICAgICAgICAgYWRhcHRlci0+c2VuZE1zZyhuZXcgTG9jRW5nU2Vuc29yUHJvcGVydGllcyhhZGFwdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYXBfY29uZi5HWVJPX0JJQVNfUkFORE9NX1dBTEtfVkFMSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhcF9jb25mLkdZUk9fQklBU19SQU5ET01fV0FMSywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FwX2NvbmYuQUNDRUxfUkFORE9NX1dBTEtfU1BFQ1RSQUxfREVOU0lUWV9WQUxJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FwX2NvbmYuQUNDRUxfUkFORE9NX1dBTEtfU1BFQ1RSQUxfREVOU0lUWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FwX2NvbmYuQU5HTEVfUkFORE9NX1dBTEtfU1BFQ1RSQUxfREVOU0lUWV9WQUxJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FwX2NvbmYuQU5HTEVfUkFORE9NX1dBTEtfU1BFQ1RSQUxfREVOU0lUWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FwX2NvbmYuUkFURV9SQU5ET01fV0FMS19TUEVDVFJBTF9ERU5TSVRZX1ZBTElELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYXBfY29uZi5SQVRFX1JBTkRPTV9XQUxLX1NQRUNUUkFMX0RFTlNJVFksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhcF9jb25mLlZFTE9DSVRZX1JBTkRPTV9XQUxLX1NQRUNUUkFMX0RFTlNJVFlfVkFMSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhcF9jb25mLlZFTE9DSVRZX1JBTkRPTV9XQUxLX1NQRUNUUkFMX0RFTlNJVFkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGFkYXB0ZXItPnNlbmRNc2cobmV3IExvY0VuZ1NlbnNvclBlcmZDb250cm9sQ29uZmlnKGFkYXB0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhcF9jb25mLlNFTlNPUl9DT05UUk9MX01PREUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhcF9jb25mLlNFTlNPUl9BQ0NFTF9TQU1QTEVTX1BFUl9CQVRDSCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FwX2NvbmYuU0VOU09SX0FDQ0VMX0JBVENIRVNfUEVSX1NFQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FwX2NvbmYuU0VOU09SX0dZUk9fU0FNUExFU19QRVJfQkFUQ0gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhcF9jb25mLlNFTlNPUl9HWVJPX0JBVENIRVNfUEVSX1NFQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FwX2NvbmYuU0VOU09SX0FDQ0VMX1NBTVBMRVNfUEVSX0JBVENIX0hJR0gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhcF9jb25mLlNFTlNPUl9BQ0NFTF9CQVRDSEVTX1BFUl9TRUNfSElHSCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FwX2NvbmYuU0VOU09SX0dZUk9fU0FNUExFU19QRVJfQkFUQ0hfSElHSCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FwX2NvbmYuU0VOU09SX0dZUk9fQkFUQ0hFU19QRVJfU0VDX0hJR0gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhcF9jb25mLlNFTlNPUl9BTEdPUklUSE1fQ09ORklHX01BU0spKTsKLQotICAgICAgICBhZGFwdGVyLT5zZW5kTXNnKG5ldyBMb2NFbmdFbmFibGVEYXRhKGFkYXB0ZXIsIE5VTEwsIDAsIChhZ3BzU3RhdHVzID8gMTowKSkpOwotICAgIH0KLQotICAgIEVYSVRfTE9HKCVkLCByZXRfdmFsKTsKLSAgICByZXR1cm4gcmV0X3ZhbDsKLX0KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLUZVTkNUSU9OICAgIGxvY19lbmdfY2xlYW51cAotCi1ERVNDUklQVElPTgotICAgQ2xlYW5zIGxvY2F0aW9uIGVuZ2luZS4gVGhlIGxvY2F0aW9uIGNsaWVudCBoYW5kbGUgd2lsbCBiZSByZWxlYXNlZC4KLQotREVQRU5ERU5DSUVTCi0gICBOb25lCi0KLVJFVFVSTiBWQUxVRQotICAgTm9uZQotCi1TSURFIEVGRkVDVFMKLSAgIE4vQQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotdm9pZCBsb2NfZW5nX2NsZWFudXAobG9jX2VuZ19kYXRhX3NfdHlwZSAmbG9jX2VuZ19kYXRhKQotewotICAgIEVOVFJZX0xPR19DQUxMRkxPVygpOwotICAgIElOSVRfQ0hFQ0sobG9jX2VuZ19kYXRhLmFkYXB0ZXIsIHJldHVybik7Ci0KLSAgICAvLyBYVFJBIGhhcyBubyBzdGF0ZSwgc28gd2UgYXJlIGZpbmUgd2l0aCBpdC4KLQotICAgIC8vIHdlIG5lZWQgdG8gY2hlY2sgYW5kIGNsZWFyIE5JCi0jaWYgMAotICAgIC8vIHdlIG5lZWQgdG8gY2hlY2sgYW5kIGNsZWFyIEFUTAotICAgIGlmIChOVUxMICE9IGxvY19lbmdfZGF0YS5hZ25zc19uaWYpIHsKLSAgICAgICAgZGVsZXRlIGxvY19lbmdfZGF0YS5hZ25zc19uaWY7Ci0gICAgICAgIGxvY19lbmdfZGF0YS5hZ25zc19uaWYgPSBOVUxMOwotICAgIH0KLSAgICBpZiAoTlVMTCAhPSBsb2NfZW5nX2RhdGEuaW50ZXJuZXRfbmlmKSB7Ci0gICAgICAgIGRlbGV0ZSBsb2NfZW5nX2RhdGEuaW50ZXJuZXRfbmlmOwotICAgICAgICBsb2NfZW5nX2RhdGEuaW50ZXJuZXRfbmlmID0gTlVMTDsKLSAgICB9Ci0jZW5kaWYKLSAgICBpZiAobG9jX2VuZ19kYXRhLmFkYXB0ZXItPmlzSW5TZXNzaW9uKCkpCi0gICAgewotICAgICAgICBMT0NfTE9HRCgibG9jX2VuZ19jbGVhbnVwOiBmaXggbm90IHN0b3BwZWQuIHN0b3AgaXQgbm93LiIpOwotICAgICAgICBsb2NfZW5nX3N0b3AobG9jX2VuZ19kYXRhKTsKLSAgICB9Ci0KLSNpZiAwIC8vIGNhbid0IGFmZm9yZCB0byBhY3R1YWxseSBjbGVhbiB1cCwgZm9yIG1hbnkgcmVhc29uLgotCi0gICAgTE9DX0xPR0QoImxvY19lbmdfaW5pdDogY2xpZW50IG9wZW5lZC4gY2xvc2UgaXQgbm93LiIpOwotICAgIGRlbGV0ZSBsb2NfZW5nX2RhdGEuYWRhcHRlcjsKLSAgICBsb2NfZW5nX2RhdGEuYWRhcHRlciA9IE5VTEw7Ci0KLSAgICBsb2NfZW5nX2Rtbl9jb25uX2xvY19hcGlfc2VydmVyX3VuYmxvY2soKTsKLSAgICBsb2NfZW5nX2Rtbl9jb25uX2xvY19hcGlfc2VydmVyX2pvaW4oKTsKLQotI2VuZGlmCi0KLSAgICBFWElUX0xPRyglcywgVk9JRF9SRVQpOwotfQotCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1GVU5DVElPTiAgICBsb2NfZW5nX3N0YXJ0Ci0KLURFU0NSSVBUSU9OCi0gICBTdGFydHMgdGhlIHRyYWNraW5nIHNlc3Npb24KLQotREVQRU5ERU5DSUVTCi0gICBOb25lCi0KLVJFVFVSTiBWQUxVRQotICAgMDogc3VjY2VzcwotCi1TSURFIEVGRkVDVFMKLSAgIE4vQQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotaW50IGxvY19lbmdfc3RhcnQobG9jX2VuZ19kYXRhX3NfdHlwZSAmbG9jX2VuZ19kYXRhKQotewotICAgRU5UUllfTE9HX0NBTExGTE9XKCk7Ci0gICBJTklUX0NIRUNLKGxvY19lbmdfZGF0YS5hZGFwdGVyLCByZXR1cm4gLTEpOwotCi0gICBpZighIGxvY19lbmdfZGF0YS5hZGFwdGVyLT5nZXRVbHBQcm94eSgpLT5zZW5kU3RhcnRGaXgoKSkKLSAgIHsKLSAgICAgICBsb2NfZW5nX2RhdGEuYWRhcHRlci0+c2VuZE1zZyhuZXcgTG9jRW5nU3RhcnRGaXgobG9jX2VuZ19kYXRhLmFkYXB0ZXIpKTsKLSAgIH0KLQotICAgRVhJVF9MT0coJWQsIDApOwotICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbG9jX2VuZ19zdGFydF9oYW5kbGVyKGxvY19lbmdfZGF0YV9zX3R5cGUgJmxvY19lbmdfZGF0YSkKLXsKLSAgIEVOVFJZX0xPRygpOwotICAgaW50IHJldF92YWwgPSBMT0NfQVBJX0FEQVBURVJfRVJSX1NVQ0NFU1M7Ci0KLSAgIGlmICghbG9jX2VuZ19kYXRhLmFkYXB0ZXItPmlzSW5TZXNzaW9uKCkpIHsKLSAgICAgICByZXRfdmFsID0gbG9jX2VuZ19kYXRhLmFkYXB0ZXItPnN0YXJ0Rml4KCk7Ci0KLSAgICAgICBpZiAocmV0X3ZhbCA9PSBMT0NfQVBJX0FEQVBURVJfRVJSX1NVQ0NFU1MgfHwKLSAgICAgICAgICAgcmV0X3ZhbCA9PSBMT0NfQVBJX0FEQVBURVJfRVJSX0VOR0lORV9ET1dOKQotICAgICAgIHsKLSAgICAgICAgICAgbG9jX2VuZ19kYXRhLmFkYXB0ZXItPnNldEluU2Vzc2lvbihUUlVFKTsKLSAgICAgICAgICAgbG9jX2luZm9ybV9ncHNfc3RhdHVzKGxvY19lbmdfZGF0YSwgR1BTX1NUQVRVU19TRVNTSU9OX0JFR0lOKTsKLSAgICAgICB9Ci0gICB9Ci0KLSAgIEVYSVRfTE9HKCVkLCByZXRfdmFsKTsKLSAgIHJldHVybiByZXRfdmFsOwotfQotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotRlVOQ1RJT04gICAgbG9jX2VuZ19zdG9wX3dyYXBwZXIKLQotREVTQ1JJUFRJT04KLSAgIFN0b3BzIHRoZSB0cmFja2luZyBzZXNzaW9uCi0KLURFUEVOREVOQ0lFUwotICAgTm9uZQotCi1SRVRVUk4gVkFMVUUKLSAgIDA6IHN1Y2Nlc3MKLQotU0lERSBFRkZFQ1RTCi0gICBOL0EKLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLWludCBsb2NfZW5nX3N0b3AobG9jX2VuZ19kYXRhX3NfdHlwZSAmbG9jX2VuZ19kYXRhKQotewotICAgIEVOVFJZX0xPR19DQUxMRkxPVygpOwotICAgIElOSVRfQ0hFQ0sobG9jX2VuZ19kYXRhLmFkYXB0ZXIsIHJldHVybiAtMSk7Ci0KLSAgICBpZighIGxvY19lbmdfZGF0YS5hZGFwdGVyLT5nZXRVbHBQcm94eSgpLT5zZW5kU3RvcEZpeCgpKQotICAgIHsKLSAgICAgICAgbG9jX2VuZ19kYXRhLmFkYXB0ZXItPnNlbmRNc2cobmV3IExvY0VuZ1N0b3BGaXgobG9jX2VuZ19kYXRhLmFkYXB0ZXIpKTsKLSAgICB9Ci0KLSAgICBFWElUX0xPRyglZCwgMCk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbG9jX2VuZ19zdG9wX2hhbmRsZXIobG9jX2VuZ19kYXRhX3NfdHlwZSAmbG9jX2VuZ19kYXRhKQotewotICAgRU5UUllfTE9HKCk7Ci0gICBpbnQgcmV0X3ZhbCA9IExPQ19BUElfQURBUFRFUl9FUlJfU1VDQ0VTUzsKLQotICAgaWYgKGxvY19lbmdfZGF0YS5hZGFwdGVyLT5pc0luU2Vzc2lvbigpKSB7Ci0KLSAgICAgICByZXRfdmFsID0gbG9jX2VuZ19kYXRhLmFkYXB0ZXItPnN0b3BGaXgoKTsKLSAgICAgICBpZiAocmV0X3ZhbCA9PSBMT0NfQVBJX0FEQVBURVJfRVJSX1NVQ0NFU1MpCi0gICAgICAgewotICAgICAgICAgICBsb2NfaW5mb3JtX2dwc19zdGF0dXMobG9jX2VuZ19kYXRhLCBHUFNfU1RBVFVTX1NFU1NJT05fRU5EKTsKLSAgICAgICB9Ci0KLSAgICAgICBsb2NfZW5nX2RhdGEuYWRhcHRlci0+c2V0SW5TZXNzaW9uKEZBTFNFKTsKLSAgIH0KLQotICAgIEVYSVRfTE9HKCVkLCByZXRfdmFsKTsKLSAgICByZXR1cm4gcmV0X3ZhbDsKLX0KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLUZVTkNUSU9OICAgIGxvY19lbmdfbXV0ZV9vbmVfc2Vzc2lvbgotCi1ERVNDUklQVElPTgotICAgTXV0ZXMgb25lIHNlc3Npb24KLQotREVQRU5ERU5DSUVTCi0gICBOb25lCi0KLVJFVFVSTiBWQUxVRQotICAgMDogU3VjY2VzcwotCi1TSURFIEVGRkVDVFMKLSAgIE4vQQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotdm9pZCBsb2NfZW5nX211dGVfb25lX3Nlc3Npb24obG9jX2VuZ19kYXRhX3NfdHlwZSAmbG9jX2VuZ19kYXRhKQotewotICAgIEVOVFJZX0xPRygpOwotICAgIGxvY19lbmdfZGF0YS5tdXRlX3Nlc3Npb25fc3RhdGUgPSBMT0NfTVVURV9TRVNTX1dBSVQ7Ci0gICAgRVhJVF9MT0coJXMsIFZPSURfUkVUKTsKLX0KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLUZVTkNUSU9OICAgIGxvY19lbmdfc2V0X3Bvc2l0aW9uX21vZGUKLQotREVTQ1JJUFRJT04KLSAgIFNldHMgdGhlIG1vZGUgYW5kIGZpeCBmcmVxdWVuY3kgZm9yIHRoZSB0cmFja2luZyBzZXNzaW9uLgotCi1ERVBFTkRFTkNJRVMKLSAgIE5vbmUKLQotUkVUVVJOIFZBTFVFCi0gICAwOiBzdWNjZXNzCi0KLVNJREUgRUZGRUNUUwotICAgTi9BCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi1pbnQgbG9jX2VuZ19zZXRfcG9zaXRpb25fbW9kZShsb2NfZW5nX2RhdGFfc190eXBlICZsb2NfZW5nX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NQb3NNb2RlICZwYXJhbXMpCi17Ci0gICAgRU5UUllfTE9HX0NBTExGTE9XKCk7Ci0gICAgSU5JVF9DSEVDSyhsb2NfZW5nX2RhdGEuYWRhcHRlciwgcmV0dXJuIC0xKTsKLQotICAgIGludCBnbnNzVHlwZSA9IGdldFRhcmdldEduc3NUeXBlKGxvY19nZXRfdGFyZ2V0KCkpOwotCi0gICAgLy8gVGhlIHBvc2l0aW9uIG1vZGUgZm9yIEdTUy9RQ0ExNTMwIGNhbiBvbmx5IGJlIHN0YW5kYWxvbmUKLSAgICBib29sIGlzMTUzMCA9IGduc3NUeXBlID09IEdOU1NfUUNBMTUzMDsKLSAgICBib29sIGlzQVBRID0gZ25zc1R5cGUgPT0gR05TU19HU1M7Ci0gICAgaWYgKChpc0FQUSB8fCBpczE1MzApICYmIHBhcmFtcy5tb2RlICE9IExPQ19QT1NJVElPTl9NT0RFX1NUQU5EQUxPTkUpIHsKLSAgICAgICAgcGFyYW1zLm1vZGUgPSBMT0NfUE9TSVRJT05fTU9ERV9TVEFOREFMT05FOwotICAgICAgICBMT0NfTE9HRCgiUG9zaXRpb24gbW9kZSBjaGFuZ2VkIHRvIHN0YW5kYWxvbmUgZm9yIHRhcmdldCB3aXRoIEdTUy9xY2ExNTMwLiIpOwotICAgIH0KLQotICAgIGlmKCEgbG9jX2VuZ19kYXRhLmFkYXB0ZXItPmdldFVscFByb3h5KCktPnNlbmRGaXhNb2RlKHBhcmFtcykpCi0gICAgewotICAgICAgICBMb2NFbmdBZGFwdGVyKiBhZGFwdGVyID0gbG9jX2VuZ19kYXRhLmFkYXB0ZXI7Ci0gICAgICAgIGFkYXB0ZXItPnNlbmRNc2cobmV3IExvY0VuZ1Bvc2l0aW9uTW9kZShhZGFwdGVyLCBwYXJhbXMpKTsKLSAgICB9Ci0KLSAgICBFWElUX0xPRyglZCwgMCk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1GVU5DVElPTiAgICBsb2NfZW5nX2luamVjdF90aW1lCi0KLURFU0NSSVBUSU9OCi0gICBUaGlzIGlzIHVzZWQgYnkgSmF2YSBuYXRpdmUgZnVuY3Rpb24gdG8gZG8gdGltZSBpbmplY3Rpb24uCi0KLURFUEVOREVOQ0lFUwotICAgTm9uZQotCi1SRVRVUk4gVkFMVUUKLSAgIDAKLQotU0lERSBFRkZFQ1RTCi0gICBOL0EKLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLWludCBsb2NfZW5nX2luamVjdF90aW1lKGxvY19lbmdfZGF0YV9zX3R5cGUgJmxvY19lbmdfZGF0YSwgR3BzVXRjVGltZSB0aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lUmVmZXJlbmNlLCBpbnQgdW5jZXJ0YWludHkpCi17Ci0gICAgRU5UUllfTE9HX0NBTExGTE9XKCk7Ci0gICAgSU5JVF9DSEVDSyhsb2NfZW5nX2RhdGEuYWRhcHRlciwgcmV0dXJuIC0xKTsKLSAgICBMb2NFbmdBZGFwdGVyKiBhZGFwdGVyID0gbG9jX2VuZ19kYXRhLmFkYXB0ZXI7Ci0KLSAgICBhZGFwdGVyLT5zZW5kTXNnKG5ldyBMb2NFbmdTZXRUaW1lKGFkYXB0ZXIsIHRpbWUsIHRpbWVSZWZlcmVuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmNlcnRhaW50eSkpOwotCi0gICAgRVhJVF9MT0coJWQsIDApOwotICAgIHJldHVybiAwOwotfQotCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1GVU5DVElPTiAgICBsb2NfZW5nX2luamVjdF9sb2NhdGlvbgotCi1ERVNDUklQVElPTgotICAgVGhpcyBpcyB1c2VkIGJ5IEphdmEgbmF0aXZlIGZ1bmN0aW9uIHRvIGRvIGxvY2F0aW9uIGluamVjdGlvbi4KLQotREVQRU5ERU5DSUVTCi0gICBOb25lCi0KLVJFVFVSTiBWQUxVRQotICAgMCAgICAgICAgICA6IFN1Y2Nlc3NmdWwKLSAgIGVycm9yIGNvZGUgOiBGYWlsdXJlCi0KLVNJREUgRUZGRUNUUwotICAgTi9BCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotaW50IGxvY19lbmdfaW5qZWN0X2xvY2F0aW9uKGxvY19lbmdfZGF0YV9zX3R5cGUgJmxvY19lbmdfZGF0YSwgZG91YmxlIGxhdGl0dWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBsb25naXR1ZGUsIGZsb2F0IGFjY3VyYWN5KQotewotICAgIEVOVFJZX0xPR19DQUxMRkxPVygpOwotICAgIElOSVRfQ0hFQ0sobG9jX2VuZ19kYXRhLmFkYXB0ZXIsIHJldHVybiAtMSk7Ci0gICAgTG9jRW5nQWRhcHRlciogYWRhcHRlciA9IGxvY19lbmdfZGF0YS5hZGFwdGVyOwotICAgIGlmKGFkYXB0ZXItPm1TdXBwb3J0c1Bvc2l0aW9uSW5qZWN0aW9uKQotICAgIHsKLSAgICAgICAgYWRhcHRlci0+c2VuZE1zZyhuZXcgTG9jRW5nSW5qZWN0TG9jYXRpb24oYWRhcHRlciwgbGF0aXR1ZGUsIGxvbmdpdHVkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjdXJhY3kpKTsKLSAgICB9Ci0KLSAgICBFWElUX0xPRyglZCwgMCk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLUZVTkNUSU9OICAgIGxvY19lbmdfZGVsZXRlX2FpZGluZ19kYXRhCi0KLURFU0NSSVBUSU9OCi0gICBUaGlzIGlzIHVzZWQgYnkgSmF2YSBuYXRpdmUgZnVuY3Rpb24gdG8gZGVsZXRlIHRoZSBhaWRpbmcgZGF0YS4gVGhlIGZ1bmN0aW9uCi0gICB1cGRhdGVzIHRoZSBnbG9iYWwgdmFyaWFibGUgZm9yIHRoZSBhaWRpbmcgZGF0YSB0byBiZSBkZWxldGVkLiBJZiB0aGUgR1BTCi0gICBlbmdpbmUgaXMgb2ZmLCB0aGUgYWlkaW5nIGRhdGEgd2lsbCBiZSBkZWxldGVkLiBPdGhlcndpc2UsIHRoZSBhY3R1YWwgYWN0aW9uCi0gICB3aWxsIGhhcHBlbiB3aGVuIGdwcyBlbmdpbmUgaXMgdHVybmVkIG9mZi4KLQotREVQRU5ERU5DSUVTCi0gICBBc3N1bWVzIHRoZSBhaWRpbmcgZGF0YSB0eXBlIHNwZWNpZmllZCBpbiBHcHNBaWRpbmdEYXRhIG1hdGNoZXMgd2l0aAotICAgTE9DIEFQSSBzcGVjaWZpY2F0aW9uLgotCi1SRVRVUk4gVkFMVUUKLSAgIE5vbmUKLQotU0lERSBFRkZFQ1RTCi0gICBOL0EKLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLXZvaWQgbG9jX2VuZ19kZWxldGVfYWlkaW5nX2RhdGEobG9jX2VuZ19kYXRhX3NfdHlwZSAmbG9jX2VuZ19kYXRhLCBHcHNBaWRpbmdEYXRhIGYpCi17Ci0gICAgRU5UUllfTE9HX0NBTExGTE9XKCk7Ci0gICAgSU5JVF9DSEVDSyhsb2NfZW5nX2RhdGEuYWRhcHRlciwgcmV0dXJuKTsKLQotICAgIGxvY19lbmdfZGF0YS5hZGFwdGVyLT5zZW5kTXNnKG5ldyBMb2NFbmdEZWxBaWREYXRhKCZsb2NfZW5nX2RhdGEsIGYpKTsKLQotICAgIEVYSVRfTE9HKCVzLCBWT0lEX1JFVCk7Ci19Ci0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUZVTkNUSU9OICAgIGxvY19pbmZvcm1fZ3BzX3N0YXRlCi0KLURFU0NSSVBUSU9OCi0gICBJbmZvcm1zIHRoZSBHUFMgUHJvdmlkZXIgYWJvdXQgdGhlIEdQUyBzdGF0dXMKLQotREVQRU5ERU5DSUVTCi0gICBOb25lCi0KLVJFVFVSTiBWQUxVRQotICAgTm9uZQotCi1TSURFIEVGRkVDVFMKLSAgIE4vQQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotc3RhdGljIHZvaWQgbG9jX2luZm9ybV9ncHNfc3RhdHVzKGxvY19lbmdfZGF0YV9zX3R5cGUgJmxvY19lbmdfZGF0YSwgR3BzU3RhdHVzVmFsdWUgc3RhdHVzKQotewotICAgIEVOVFJZX0xPRygpOwotCi0gICAgaWYgKGxvY19lbmdfZGF0YS5zdGF0dXNfY2IpCi0gICAgewotICAgICAgICBHcHNTdGF0dXMgZ3MgPSB7IHNpemVvZihncyksc3RhdHVzIH07Ci0gICAgICAgIENBTExCQUNLX0xPR19DQUxMRkxPVygic3RhdHVzX2NiIiwgJXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NfZ2V0X2dwc19zdGF0dXNfbmFtZShncy5zdGF0dXMpKTsKLSAgICAgICAgbG9jX2VuZ19kYXRhLnN0YXR1c19jYigmZ3MpOwotICAgIH0KLQotICAgIEVYSVRfTE9HKCVzLCBWT0lEX1JFVCk7Ci19Ci0KLXN0YXRpYyBpbnQgbG9jX2VuZ19nZXRfenBwX2hhbmRsZXIobG9jX2VuZ19kYXRhX3NfdHlwZSAmbG9jX2VuZ19kYXRhKQotewotICAgRU5UUllfTE9HKCk7Ci0gICBpbnQgcmV0X3ZhbCA9IExPQ19BUElfQURBUFRFUl9FUlJfU1VDQ0VTUzsKLSAgIFVscExvY2F0aW9uIGxvY2F0aW9uOwotICAgTG9jUG9zVGVjaE1hc2sgdGVjaF9tYXNrID0gTE9DX1BPU19URUNIX01BU0tfREVGQVVMVDsKLSAgIEdwc0xvY2F0aW9uRXh0ZW5kZWQgbG9jYXRpb25FeHRlbmRlZDsKLSAgIG1lbXNldCgmbG9jYXRpb25FeHRlbmRlZCwgMCwgc2l6ZW9mIChHcHNMb2NhdGlvbkV4dGVuZGVkKSk7Ci0gICBsb2NhdGlvbkV4dGVuZGVkLnNpemUgPSBzaXplb2YobG9jYXRpb25FeHRlbmRlZCk7Ci0gICBtZW1zZXQoJmxvY2F0aW9uLCAwLCBzaXplb2YgbG9jYXRpb24pOwotCi0gICByZXRfdmFsID0gbG9jX2VuZ19kYXRhLmFkYXB0ZXItPmdldFpwcChsb2NhdGlvbi5ncHNMb2NhdGlvbiwgdGVjaF9tYXNrKTsKLSAgLy9NYXJrIHRoZSBsb2NhdGlvbiBzb3VyY2UgYXMgZnJvbSBaUFAKLSAgbG9jYXRpb24uZ3BzTG9jYXRpb24uZmxhZ3MgfD0gTE9DQVRJT05fSEFTX1NPVVJDRV9JTkZPOwotICBsb2NhdGlvbi5wb3NpdGlvbl9zb3VyY2UgPSBVTFBfTE9DQVRJT05fSVNfRlJPTV9aUFA7Ci0KLSAgbG9jX2VuZ19kYXRhLmFkYXB0ZXItPmdldFVscFByb3h5KCktPnJlcG9ydFBvc2l0aW9uKGxvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uRXh0ZW5kZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0NfU0VTU19TVUNDRVNTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlY2hfbWFzayk7Ci0KLSAgRVhJVF9MT0coJWQsIHJldF92YWwpOwotICByZXR1cm4gcmV0X3ZhbDsKLX0KLQotLyoKLSAgQ2FsbGJhY2sgZnVuY3Rpb24gcGFzc2VkIHRvIERhdGEgU2VydmljZXMgU3RhdGUgTWFjaGluZQotICBUaGlzIGJlY29tZXMgcGFydCBvZiB0aGUgc3RhdGUgbWFjaGluZSdzIHNlcnZpY2VyIGFuZAotICBpcyB1c2VkIHRvIHNlbmQgcmVxdWVzdHMgdG8gdGhlIGRhdGEgc2VydmljZXMgY2xpZW50Ci0qLwotc3RhdGljIGludCBkYXRhQ2FsbENiKHZvaWQgKmNiX2RhdGEpCi17Ci0gICAgTE9DX0xPR0QoIkVudGVyIGRhdGFDYWxsQ2JcbiIpOwotICAgIGludCByZXQ9MDsKLSAgICBpZihjYl9kYXRhICE9IE5VTEwpIHsKLSAgICAgICAgZHNDYkRhdGEgKmNiRGF0YSA9IChkc0NiRGF0YSAqKWNiX2RhdGE7Ci0gICAgICAgIExvY0VuZ0FkYXB0ZXIgKmxvY0FkYXB0ZXIgPSAoTG9jRW5nQWRhcHRlciAqKWNiRGF0YS0+bUFkYXB0ZXI7Ci0gICAgICAgIGlmKGNiRGF0YS0+YWN0aW9uID09IEdQU19SRVFVRVNUX0FHUFNfREFUQV9DT05OKSB7Ci0gICAgICAgICAgICBMT0NfTE9HRCgiZGF0YUNhbGxDYiBHUFNfUkVRVUVTVF9BR1BTX0RBVEFfQ09OTlxuIik7Ci0gICAgICAgICAgICByZXQgPSAgbG9jQWRhcHRlci0+b3BlbkFuZFN0YXJ0RGF0YUNhbGwoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKGNiRGF0YS0+YWN0aW9uID09IEdQU19SRUxFQVNFX0FHUFNfREFUQV9DT05OKSB7Ci0gICAgICAgICAgICBMT0NfTE9HRCgiZGF0YUNhbGxDYiBHUFNfUkVMRUFTRV9BR1BTX0RBVEFfQ09OTlxuIik7Ci0gICAgICAgICAgICBsb2NBZGFwdGVyLT5zdG9wRGF0YUNhbGwoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgTE9DX0xPR0UoIk5VTEwgYXJndW1lbnQgcmVjZWl2ZWQuIEZhaWxpbmcuXG4iKTsKLSAgICAgICAgcmV0ID0gLTE7Ci0gICAgICAgIGdvdG8gZXJyOwotICAgIH0KLQotZXJyOgotICAgIExPQ19MT0dEKCJFeGl0IGRhdGFDYWxsQ2IgcmV0ID0gJWRcbiIsIHJldCk7Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLUZVTkNUSU9OICAgIGxvY19lbmdfYWdwc19yZWluaXQKLQotREVTQ1JJUFRJT04KLSAgIDJuZCBoYWxmIG9mIGxvY19lbmdfYWdwc19pbml0KCksIHNpbmdsZWQgb3V0IGZvciBtb2RlbSByZXN0YXJ0IHRvIHVzZS4KLQotREVQRU5ERU5DSUVTCi0gICBOT05FCi0KLVJFVFVSTiBWQUxVRQotICAgMAotCi1TSURFIEVGRkVDVFMKLSAgIE4vQQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotc3RhdGljIHZvaWQgbG9jX2VuZ19hZ3BzX3JlaW5pdChsb2NfZW5nX2RhdGFfc190eXBlICZsb2NfZW5nX2RhdGEpCi17Ci0gICAgRU5UUllfTE9HKCk7Ci0KLSAgICAvLyBTZXQgc2VydmVyIGFkZHJlc3NlcyB3aGljaCBjYW1lIGJlZm9yZSBpbml0Ci0gICAgaWYgKGxvY19lbmdfZGF0YS5zdXBsX2hvc3Rfc2V0KQotICAgIHsKLSAgICAgICAgbG9jX2VuZ19zZXRfc2VydmVyKGxvY19lbmdfZGF0YSwgTE9DX0FHUFNfU1VQTF9TRVJWRVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NfZW5nX2RhdGEuc3VwbF9ob3N0X2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY19lbmdfZGF0YS5zdXBsX3BvcnRfYnVmKTsKLSAgICB9Ci0KLSAgICBpZiAobG9jX2VuZ19kYXRhLmMya19ob3N0X3NldCkKLSAgICB7Ci0gICAgICAgIGxvY19lbmdfc2V0X3NlcnZlcihsb2NfZW5nX2RhdGEsIExPQ19BR1BTX0NETUFfUERFX1NFUlZFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY19lbmdfZGF0YS5jMmtfaG9zdF9idWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NfZW5nX2RhdGEuYzJrX3BvcnRfYnVmKTsKLSAgICB9Ci0gICAgRVhJVF9MT0coJXMsIFZPSURfUkVUKTsKLX0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1GVU5DVElPTiAgICBsb2NfZW5nX2FncHNfaW5pdAotCi1ERVNDUklQVElPTgotICAgSW5pdGlhbGl6ZSB0aGUgQUdwcyBpbnRlcmZhY2UuCi0KLURFUEVOREVOQ0lFUwotICAgTk9ORQotCi1SRVRVUk4gVkFMVUUKLSAgIDAKLQotU0lERSBFRkZFQ1RTCi0gICBOL0EKLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLXZvaWQgbG9jX2VuZ19hZ3BzX2luaXQobG9jX2VuZ19kYXRhX3NfdHlwZSAmbG9jX2VuZ19kYXRhLCBBR3BzRXh0Q2FsbGJhY2tzKiBjYWxsYmFja3MpCi17Ci0gICAgRU5UUllfTE9HX0NBTExGTE9XKCk7Ci0gICAgSU5JVF9DSEVDSyhsb2NfZW5nX2RhdGEuYWRhcHRlciwgcmV0dXJuKTsKLSAgICBTVEFURV9DSEVDSygoTlVMTCA9PSBsb2NfZW5nX2RhdGEuYWdwc19zdGF0dXNfY2IpLAotICAgICAgICAgICAgICAgICJhZ3BzIGluc3RhbmNlIGFscmVhZHkgaW5pdGlhbGl6ZWQiLAotICAgICAgICAgICAgICAgIHJldHVybik7Ci0gICAgaWYgKGNhbGxiYWNrcyA9PSBOVUxMKSB7Ci0gICAgICAgIExPQ19MT0dFKCJsb2NfZW5nX2FncHNfaW5pdDogYmFkIHBhcmFtZXRlcnMgY2IgJXAiLCBjYWxsYmFja3MpOwotICAgICAgICBFWElUX0xPRyglcywgVk9JRF9SRVQpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIExvY0VuZ0FkYXB0ZXIqIGFkYXB0ZXIgPSBsb2NfZW5nX2RhdGEuYWRhcHRlcjsKLSAgICBsb2NfZW5nX2RhdGEuYWdwc19zdGF0dXNfY2IgPSBjYWxsYmFja3MtPnN0YXR1c19jYjsKLQotICAgIGxvY19lbmdfZGF0YS5pbnRlcm5ldF9uaWYgPSBuZXcgQWdwc1N0YXRlTWFjaGluZShzZXJ2aWNlclR5cGVBZ3BzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWxvY19lbmdfZGF0YS5hZ3BzX3N0YXR1c19jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUdQU19UWVBFX1dXQU5fQU5ZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7Ci0gICAgbG9jX2VuZ19kYXRhLndpZmlfbmlmID0gbmV3IEFncHNTdGF0ZU1hY2hpbmUoc2VydmljZXJUeXBlQWdwcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWxvY19lbmdfZGF0YS5hZ3BzX3N0YXR1c19jYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBR1BTX1RZUEVfV0lGSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKLQotICAgIGludCBnbnNzVHlwZSA9IGdldFRhcmdldEduc3NUeXBlKGxvY19nZXRfdGFyZ2V0KCkpOwotICAgIGJvb2wgaXNBUFEgPSAoZ25zc1R5cGUgPT0gR05TU19HU1MpOwotICAgIGJvb2wgaXMxNTMwID0gKGduc3NUeXBlID09IEdOU1NfUUNBMTUzMCk7Ci0gICAgaWYgKCFpc0FQUSAmJiAhaXMxNTMwKSB7Ci0gICAgICAgIGxvY19lbmdfZGF0YS5hZ25zc19uaWYgPSBuZXcgQWdwc1N0YXRlTWFjaGluZShzZXJ2aWNlclR5cGVBZ3BzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilsb2NfZW5nX2RhdGEuYWdwc19zdGF0dXNfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBR1BTX1RZUEVfU1VQTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKLQotICAgICAgICBpZiAoYWRhcHRlci0+bVN1cHBvcnRzQWdwc1JlcXVlc3RzKSB7Ci0gICAgICAgICAgICBsb2NfZW5nX2RhdGEuYWRhcHRlci0+c2VuZE1zZyhuZXcgTG9jRW5nRGF0YUNsaWVudEluaXQoJmxvY19lbmdfZGF0YSkpOwotCi0gICAgICAgICAgICBsb2NfZW5nX2Rtbl9jb25uX2xvY19hcGlfc2VydmVyX2xhdW5jaChjYWxsYmFja3MtPmNyZWF0ZV90aHJlYWRfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCAmbG9jX2VuZ19kYXRhKTsKLSAgICAgICAgfQotICAgICAgICBsb2NfZW5nX2FncHNfcmVpbml0KGxvY19lbmdfZGF0YSk7Ci0gICAgfQotCi0gICAgRVhJVF9MT0coJXMsIFZPSURfUkVUKTsKLX0KLQotc3RhdGljIHZvaWQgZGVsZXRlQWlkaW5nRGF0YShsb2NfZW5nX2RhdGFfc190eXBlICZsb2dFbmcpIHsKLSAgICBpZiAobG9nRW5nLmVuZ2luZV9zdGF0dXMgIT0gR1BTX1NUQVRVU19FTkdJTkVfT04gJiYKLSAgICAgICAgbG9nRW5nLmFpZGluZ19kYXRhX2Zvcl9kZWxldGlvbiAhPSAwKSB7Ci0gICAgICAgIGxvZ0VuZy5hZGFwdGVyLT5kZWxldGVBaWRpbmdEYXRhKGxvZ0VuZy5haWRpbmdfZGF0YV9mb3JfZGVsZXRpb24pOwotICAgICAgICBsb2dFbmcuYWlkaW5nX2RhdGFfZm9yX2RlbGV0aW9uID0gMDsKLSAgICB9Ci19Ci0KLXN0YXRpYyBBZ3BzU3RhdGVNYWNoaW5lKgotZ2V0QWdwc1N0YXRlTWFjaGluZShsb2NfZW5nX2RhdGFfc190eXBlICZsb2NFbmcsIEFHcHNFeHRUeXBlIGFncHNUeXBlKSB7Ci0gICAgQWdwc1N0YXRlTWFjaGluZSogc3RhdGVNYWNoaW5lOwotICAgIHN3aXRjaCAoYWdwc1R5cGUpIHsKLSAgICBjYXNlIEFHUFNfVFlQRV9XSUZJOiB7Ci0gICAgICAgIHN0YXRlTWFjaGluZSA9IGxvY0VuZy53aWZpX25pZjsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgQUdQU19UWVBFX0lOVkFMSUQ6Ci0gICAgY2FzZSBBR1BTX1RZUEVfU1VQTDogewotICAgICAgICBzdGF0ZU1hY2hpbmUgPSBsb2NFbmcuYWduc3NfbmlmOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBBR1BTX1RZUEVfU1VQTF9FUzogewotICAgICAgICBzdGF0ZU1hY2hpbmUgPSBsb2NFbmcuZHNfbmlmOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgc3RhdGVNYWNoaW5lICA9IGxvY0VuZy5pbnRlcm5ldF9uaWY7Ci0gICAgfQotICAgIHJldHVybiBzdGF0ZU1hY2hpbmU7Ci19Ci0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1GVU5DVElPTiAgICBsb2NfZW5nX2FncHNfb3BlbgotCi1ERVNDUklQVElPTgotICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBvbi1kZW1hbmQgZGF0YSBjb25uZWN0aW9uIG9wZW5pbmcgaXMgc3VjY2Vzc2Z1bC4KLUl0IHNob3VsZCBpbmZvcm0gZW5naW5lIGFib3V0IHRoZSBkYXRhIG9wZW4gcmVzdWx0LgotCi1ERVBFTkRFTkNJRVMKLSAgIE5PTkUKLQotUkVUVVJOIFZBTFVFCi0gICAwCi0KLVNJREUgRUZGRUNUUwotICAgTi9BCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi1pbnQgbG9jX2VuZ19hZ3BzX29wZW4obG9jX2VuZ19kYXRhX3NfdHlwZSAmbG9jX2VuZ19kYXRhLCBBR3BzRXh0VHlwZSBhZ3BzVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFwbiwgQUdwc0JlYXJlclR5cGUgYmVhcmVyVHlwZSkKLXsKLSAgICBFTlRSWV9MT0dfQ0FMTEZMT1coKTsKLSAgICBJTklUX0NIRUNLKGxvY19lbmdfZGF0YS5hZGFwdGVyICYmIGxvY19lbmdfZGF0YS5hZ3BzX3N0YXR1c19jYiwKLSAgICAgICAgICAgICAgIHJldHVybiAtMSk7Ci0KLSAgICBpZiAoYXBuID09IE5VTEwpCi0gICAgewotICAgICAgICBMT0NfTE9HRSgiQVBOIE5hbWUgTlVMTFxuIik7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIExPQ19MT0dEKCJsb2NfZW5nX2FncHNfb3BlbiBBUE4gbmFtZSA9IFslc10iLCBhcG4pOwotCi0gICAgaW50IGFwbl9sZW4gPSBzbWFsbGVyX29mKHN0cmxlbiAoYXBuKSwgTUFYX0FQTl9MRU4pOwotICAgIEFncHNTdGF0ZU1hY2hpbmUqIHNtID0gZ2V0QWdwc1N0YXRlTWFjaGluZShsb2NfZW5nX2RhdGEsIGFncHNUeXBlKTsKLQotICAgIGxvY19lbmdfZGF0YS5hZGFwdGVyLT5zZW5kTXNnKAotICAgICAgICBuZXcgTG9jRW5nQXRsT3BlblN1Y2Nlc3Moc20sIGFwbiwgYXBuX2xlbiwgYmVhcmVyVHlwZSkpOwotCi0gICAgRVhJVF9MT0coJWQsIDApOwotICAgIHJldHVybiAwOwotfQotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotRlVOQ1RJT04gICAgbG9jX2VuZ19hZ3BzX2Nsb3NlZAotCi1ERVNDUklQVElPTgotICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBvbi1kZW1hbmQgZGF0YSBjb25uZWN0aW9uIGNsb3NpbmcgaXMgZG9uZS4KLUl0IHNob3VsZCBpbmZvcm0gZW5naW5lIGFib3V0IHRoZSBkYXRhIGNsb3NlIHJlc3VsdC4KLQotREVQRU5ERU5DSUVTCi0gICBOT05FCi0KLVJFVFVSTiBWQUxVRQotICAgMAotCi1TSURFIEVGRkVDVFMKLSAgIE4vQQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotaW50IGxvY19lbmdfYWdwc19jbG9zZWQobG9jX2VuZ19kYXRhX3NfdHlwZSAmbG9jX2VuZ19kYXRhLCBBR3BzRXh0VHlwZSBhZ3BzVHlwZSkKLXsKLSAgICBFTlRSWV9MT0dfQ0FMTEZMT1coKTsKLSAgICBJTklUX0NIRUNLKGxvY19lbmdfZGF0YS5hZGFwdGVyICYmIGxvY19lbmdfZGF0YS5hZ3BzX3N0YXR1c19jYiwKLSAgICAgICAgICAgICAgIHJldHVybiAtMSk7Ci0KLSAgICBBZ3BzU3RhdGVNYWNoaW5lKiBzbSA9IGdldEFncHNTdGF0ZU1hY2hpbmUobG9jX2VuZ19kYXRhLCBhZ3BzVHlwZSk7Ci0gICAgbG9jX2VuZ19kYXRhLmFkYXB0ZXItPnNlbmRNc2cobmV3IExvY0VuZ0F0bENsb3NlZChzbSkpOwotCi0gICAgRVhJVF9MT0coJWQsIDApOwotICAgIHJldHVybiAwOwotfQotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotRlVOQ1RJT04gICAgbG9jX2VuZ19hZ3BzX29wZW5fZmFpbGVkCi0KLURFU0NSSVBUSU9OCi0gICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIG9uLWRlbWFuZCBkYXRhIGNvbm5lY3Rpb24gb3BlbmluZyBoYXMgZmFpbGVkLgotSXQgc2hvdWxkIGluZm9ybSBlbmdpbmUgYWJvdXQgdGhlIGRhdGEgb3BlbiByZXN1bHQuCi0KLURFUEVOREVOQ0lFUwotICAgTk9ORQotCi1SRVRVUk4gVkFMVUUKLSAgIDAKLQotU0lERSBFRkZFQ1RTCi0gICBOL0EKLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLWludCBsb2NfZW5nX2FncHNfb3Blbl9mYWlsZWQobG9jX2VuZ19kYXRhX3NfdHlwZSAmbG9jX2VuZ19kYXRhLCBBR3BzRXh0VHlwZSBhZ3BzVHlwZSkKLXsKLSAgICBFTlRSWV9MT0dfQ0FMTEZMT1coKTsKLSAgICBJTklUX0NIRUNLKGxvY19lbmdfZGF0YS5hZGFwdGVyICYmIGxvY19lbmdfZGF0YS5hZ3BzX3N0YXR1c19jYiwKLSAgICAgICAgICAgICAgIHJldHVybiAtMSk7Ci0KLSAgICBBZ3BzU3RhdGVNYWNoaW5lKiBzbSA9IGdldEFncHNTdGF0ZU1hY2hpbmUobG9jX2VuZ19kYXRhLCBhZ3BzVHlwZSk7Ci0gICAgbG9jX2VuZ19kYXRhLmFkYXB0ZXItPnNlbmRNc2cobmV3IExvY0VuZ0F0bE9wZW5GYWlsZWQoc20pKTsKLQotICAgIEVYSVRfTE9HKCVkLCAwKTsKLSAgICByZXR1cm4gMDsKLX0KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotRlVOQ1RJT04gcmVzb2x2ZV9pbl9hZGRyCi0KLURFU0NSSVBUSU9OCi0gICBUcmFuc2xhdGVzIGEgaG9zdG5hbWUgdG8gaW5fYWRkciBzdHJ1Y3QKLQotREVQRU5ERU5DSUVTCi0gICBuL2EKLQotUkVUVVJOIFZBTFVFCi0gICBUUlVFIGlmIHN1Y2Nlc3NmdWwKLQotU0lERSBFRkZFQ1RTCi0gICBuL2EKLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLXN0YXRpYyBib29sZWFuIHJlc29sdmVfaW5fYWRkcihjb25zdCBjaGFyICpob3N0X2FkZHIsIHN0cnVjdCBpbl9hZGRyICppbl9hZGRyX3B0cikKLXsKLSAgICBFTlRSWV9MT0coKTsKLSAgICBib29sZWFuIHJldF92YWwgPSBUUlVFOwotCi0gICAgc3RydWN0IGhvc3RlbnQgICAgICAgICAgICAgKmhwOwotICAgIGhwID0gZ2V0aG9zdGJ5bmFtZShob3N0X2FkZHIpOwotICAgIGlmIChocCAhPSBOVUxMKSAvKiBETlMgT0sgKi8KLSAgICB7Ci0gICAgICAgIG1lbWNweShpbl9hZGRyX3B0ciwgaHAtPmhfYWRkcl9saXN0WzBdLCBocC0+aF9sZW5ndGgpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiBUcnkgSVAgcmVwcmVzZW50YXRpb24gKi8KLSAgICAgICAgaWYgKGluZXRfYXRvbihob3N0X2FkZHIsIGluX2FkZHJfcHRyKSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBJUCBub3QgdmFsaWQgKi8KLSAgICAgICAgICAgIExPQ19MT0dFKCJETlMgcXVlcnkgb24gJyVzJyBmYWlsZWRcbiIsIGhvc3RfYWRkcik7Ci0gICAgICAgICAgICByZXRfdmFsID0gRkFMU0U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBFWElUX0xPRyglcywgbG9jX2xvZ2dlcl9ib29sU3RyW3JldF92YWwhPTBdKTsKLSAgICByZXR1cm4gcmV0X3ZhbDsKLX0KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLUZVTkNUSU9OICAgIGxvY19lbmdfc2V0X3NlcnZlcgotCi1ERVNDUklQVElPTgotICAgVGhpcyBpcyB1c2VkIHRvIHNldCB0aGUgZGVmYXVsdCBBR1BTIHNlcnZlci4gU2VydmVyIGFkZHJlc3MgaXMgb2J0YWluZWQKLSAgIGZyb20gZ3BzLmNvbmYuCi0KLURFUEVOREVOQ0lFUwotICAgTk9ORQotCi1SRVRVUk4gVkFMVUUKLSAgIDAKLQotU0lERSBFRkZFQ1RTCi0gICBOL0EKLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLXN0YXRpYyBpbnQgbG9jX2VuZ19zZXRfc2VydmVyKGxvY19lbmdfZGF0YV9zX3R5cGUgJmxvY19lbmdfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY1NlcnZlclR5cGUgdHlwZSwgY29uc3QgY2hhciogaG9zdG5hbWUsIGludCBwb3J0KQotewotICAgIEVOVFJZX0xPRygpOwotICAgIGludCByZXQgPSAwOwotICAgIExvY0VuZ0FkYXB0ZXIqIGFkYXB0ZXIgPSBsb2NfZW5nX2RhdGEuYWRhcHRlcjsKLQotICAgIGlmIChMT0NfQUdQU19TVVBMX1NFUlZFUiA9PSB0eXBlKSB7Ci0gICAgICAgIGNoYXIgdXJsW01BWF9VUkxfTEVOXTsKLSAgICAgICAgdW5zaWduZWQgaW50IGxlbiA9IDA7Ci0gICAgICAgIGNvbnN0IGNoYXIgbm9ob3N0W10gPSAiTk9ORSI7Ci0gICAgICAgIGlmIChob3N0bmFtZSA9PSBOVUxMIHx8Ci0gICAgICAgICAgICBzdHJuY2FzZWNtcChub2hvc3QsIGhvc3RuYW1lLCBzaXplb2Yobm9ob3N0KSkgPT0gMCkgewotICAgICAgICAgICAgdXJsWzBdID0gTlVMTDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGxlbiA9IHNucHJpbnRmKHVybCwgc2l6ZW9mKHVybCksICIlczoldSIsIGhvc3RuYW1lLCAodW5zaWduZWQpIHBvcnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNpemVvZih1cmwpID4gbGVuKSB7Ci0gICAgICAgICAgICBhZGFwdGVyLT5zZW5kTXNnKG5ldyBMb2NFbmdTZXRTZXJ2ZXJVcmwoYWRhcHRlciwgdXJsLCBsZW4pKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoTE9DX0FHUFNfQ0RNQV9QREVfU0VSVkVSID09IHR5cGUgfHwKLSAgICAgICAgICAgICAgIExPQ19BR1BTX0NVU1RPTV9QREVfU0VSVkVSID09IHR5cGUgfHwKLSAgICAgICAgICAgICAgIExPQ19BR1BTX01QQ19TRVJWRVIgPT0gdHlwZSkgewotICAgICAgICBzdHJ1Y3QgaW5fYWRkciBhZGRyOwotICAgICAgICBpZiAoIXJlc29sdmVfaW5fYWRkcihob3N0bmFtZSwgJmFkZHIpKQotICAgICAgICB7Ci0gICAgICAgICAgICBMT0NfTE9HRSgibG9jX2VuZ19zZXRfc2VydmVyLCBob3N0bmFtZSAlcyBjYW5ub3QgYmUgcmVzb2x2ZWQuXG4iLCBob3N0bmFtZSk7Ci0gICAgICAgICAgICByZXQgPSAtMjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHVuc2lnbmVkIGludCBpcCA9IGh0b25sKGFkZHIuc19hZGRyKTsKLSAgICAgICAgICAgIGFkYXB0ZXItPnNlbmRNc2cobmV3IExvY0VuZ1NldFNlcnZlcklwdjQoYWRhcHRlciwgaXAsIHBvcnQsIHR5cGUpKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIExPQ19MT0dFKCJsb2NfZW5nX3NldF9zZXJ2ZXIsIHR5cGUgJWQgY2Fubm90IGJlIHJlc29sdmVkLlxuIiwgdHlwZSk7Ci0gICAgfQotCi0gICAgRVhJVF9MT0coJWQsIHJldCk7Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLUZVTkNUSU9OICAgIGxvY19lbmdfc2V0X3NlcnZlcl9wcm94eQotCi1ERVNDUklQVElPTgotICAgSWYgbG9jX2VuZ19zZXRfc2VydmVyIGlzIGNhbGxlZCBiZWZvcmUgbG9jX2VuZ19pbml0LCBpdCBkb2Vzbid0IHdvcmsuIFRoaXMKLSAgIHByb3h5IGJ1ZmZlcnMgc2VydmVyIHNldHRpbmdzIGFuZCBjYWxscyBsb2NfZW5nX3NldF9zZXJ2ZXIgd2hlbiB0aGUgY2xpZW50IGlzCi0gICBvcGVuLgotCi1ERVBFTkRFTkNJRVMKLSAgIE5PTkUKLQotUkVUVVJOIFZBTFVFCi0gICAwCi0KLVNJREUgRUZGRUNUUwotICAgTi9BCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi1pbnQgbG9jX2VuZ19zZXRfc2VydmVyX3Byb3h5KGxvY19lbmdfZGF0YV9zX3R5cGUgJmxvY19lbmdfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jU2VydmVyVHlwZSB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBob3N0bmFtZSwgaW50IHBvcnQpCi17Ci0gICAgRU5UUllfTE9HX0NBTExGTE9XKCk7Ci0gICAgaW50IHJldF92YWwgPSAwOwotCi0gICAgTE9DX0xPR1YoInNhdmUgdGhlIGFkZHJlc3MsIHR5cGU6ICVkLCBob3N0bmFtZTogJXMsIHBvcnQ6ICVkIiwKLSAgICAgICAgICAgICAoaW50KSB0eXBlLCBob3N0bmFtZSwgcG9ydCk7Ci0gICAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlIExPQ19BR1BTX1NVUExfU0VSVkVSOgotICAgICAgICBzdHJsY3B5KGxvY19lbmdfZGF0YS5zdXBsX2hvc3RfYnVmLCBob3N0bmFtZSwKLSAgICAgICAgICAgICAgICBzaXplb2YobG9jX2VuZ19kYXRhLnN1cGxfaG9zdF9idWYpKTsKLSAgICAgICAgbG9jX2VuZ19kYXRhLnN1cGxfcG9ydF9idWYgPSBwb3J0OwotICAgICAgICBsb2NfZW5nX2RhdGEuc3VwbF9ob3N0X3NldCA9IDE7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTE9DX0FHUFNfQ0RNQV9QREVfU0VSVkVSOgotICAgICAgICBzdHJsY3B5KGxvY19lbmdfZGF0YS5jMmtfaG9zdF9idWYsIGhvc3RuYW1lLAotICAgICAgICAgICAgICAgIHNpemVvZihsb2NfZW5nX2RhdGEuYzJrX2hvc3RfYnVmKSk7Ci0gICAgICAgIGxvY19lbmdfZGF0YS5jMmtfcG9ydF9idWYgPSBwb3J0OwotICAgICAgICBsb2NfZW5nX2RhdGEuYzJrX2hvc3Rfc2V0ID0gMTsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgTE9DX0xPR0UoImxvY19lbmdfc2V0X3NlcnZlcl9wcm94eSwgdW5rbm93biBzZXJ2ZXIgdHlwZSA9ICVkIiwgKGludCkgdHlwZSk7Ci0gICAgfQotCi0gICAgaWYgKE5VTEwgIT0gbG9jX2VuZ19kYXRhLmFkYXB0ZXIpCi0gICAgewotICAgICAgICByZXRfdmFsID0gbG9jX2VuZ19zZXRfc2VydmVyKGxvY19lbmdfZGF0YSwgdHlwZSwgaG9zdG5hbWUsIHBvcnQpOwotICAgIH0KLQotICAgIEVYSVRfTE9HKCVkLCByZXRfdmFsKTsKLSAgICByZXR1cm4gcmV0X3ZhbDsKLX0KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLUZVTkNUSU9OICAgIGxvY19lbmdfYWdwc19yaWxfdXBkYXRlX25ldHdvcmtfYXZhaWxhYmlsaXR5Ci0KLURFU0NSSVBUSU9OCi0gICBTZXRzIGRhdGEgY2FsbCBhbGxvdyB2cyBkaXNhbGxvdyBmbGFnIHRvIG1vZGVtCi0gICBUaGlzIGlzIHRoZSBvbmx5IG1lbWJlciBvZiBzTG9jRW5nQUdwc1JpbEludGVyZmFjZSBpbXBsZW1lbnRlZC4KLQotREVQRU5ERU5DSUVTCi0gICBOb25lCi0KLVJFVFVSTiBWQUxVRQotICAgMDogc3VjY2VzcwotCi1TSURFIEVGRkVDVFMKLSAgIE4vQQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotdm9pZCBsb2NfZW5nX2FncHNfcmlsX3VwZGF0ZV9uZXR3b3JrX2F2YWlsYWJpbGl0eShsb2NfZW5nX2RhdGFfc190eXBlICZsb2NfZW5nX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhdmFpbGFibGUsIGNvbnN0IGNoYXIqIGFwbikKLXsKLSAgICBFTlRSWV9MT0dfQ0FMTEZMT1coKTsKLQotICAgIC8vVGhpcyBpcyB0byBzdG9yZSB0aGUgc3RhdHVzIG9mIGRhdGEgYXZhaWxhYmlsaXR5IG92ZXIgdGhlIG5ldHdvcmsuCi0gICAgLy9JZiBHUFMgaXMgbm90IGVuYWJsZWQsIHRoZSBJTklUX0NIRUNLIHdpbGwgZmFpbCBhbmQgdGhlIG1vZGVtIHdpbGwKLSAgICAvL25vdCBiZSB1cGRhdGVkIHdpdGggdGhlIG5ldHdvcmsncyBhdmFpbGFiaWxpdHkuIFNpbmNlIHRoZSBkYXRhIHN0YXR1cwotICAgIC8vY2FuIGNoYW5nZSBiZWZvcmUgR1BTIGlzIGVuYWJsZWQgdGhlLCBzdG9yaW5nIHRoZSBzdGF0dXMgd2lsbCBlbmFibGUKLSAgICAvL3VzIHRvIGluZm9ybSB0aGUgbW9kZW0gYWZ0ZXIgR1BTIGlzIGVuYWJsZWQKLSAgICBhZ3BzU3RhdHVzID0gYXZhaWxhYmxlOwotCi0gICAgSU5JVF9DSEVDSyhsb2NfZW5nX2RhdGEuYWRhcHRlciwgcmV0dXJuKTsKLSAgICBpZiAoYXBuICE9IE5VTEwpCi0gICAgewotICAgICAgICBMT0NfTE9HRCgibG9jX2VuZ19hZ3BzX3JpbF91cGRhdGVfbmV0d29ya19hdmFpbGFiaWxpdHk6IEFQTiBOYW1lID0gWyVzXVxuIiwgYXBuKTsKLSAgICAgICAgaW50IGFwbl9sZW4gPSBzbWFsbGVyX29mKHN0cmxlbiAoYXBuKSwgTUFYX0FQTl9MRU4pOwotICAgICAgICBMb2NFbmdBZGFwdGVyKiBhZGFwdGVyID0gbG9jX2VuZ19kYXRhLmFkYXB0ZXI7Ci0gICAgICAgIGFkYXB0ZXItPnNlbmRNc2cobmV3IExvY0VuZ0VuYWJsZURhdGEoYWRhcHRlciwgYXBuLCAgYXBuX2xlbiwgYXZhaWxhYmxlKSk7Ci0gICAgfQotICAgIEVYSVRfTE9HKCVzLCBWT0lEX1JFVCk7Ci19Ci0KLWludCBsb2NfZW5nX2FncHNfaW5zdGFsbF9jZXJ0aWZpY2F0ZXMobG9jX2VuZ19kYXRhX3NfdHlwZSAmbG9jX2VuZ19kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXJFbmNvZGVkQ2VydGlmaWNhdGUqIGNlcnRpZmljYXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG51bWJlck9mQ2VydHMpCi17Ci0gICAgRU5UUllfTE9HX0NBTExGTE9XKCk7Ci0gICAgaW50IHJldF92YWwgPSBBR1BTX0NFUlRJRklDQVRFX09QRVJBVElPTl9TVUNDRVNTOwotCi0gICAgdWludDMyX3Qgc2xvdEJpdE1hc2sgPSBncHNfY29uZi5BR1BTX0NFUlRfV1JJVEFCTEVfTUFTSzsKLSAgICB1aW50MzJfdCBzbG90Q291bnQgPSAwOwotICAgIGZvciAodWludDMyX3Qgc2xvdEJpdE1hc2tDb3VudGVyPXNsb3RCaXRNYXNrOyBzbG90Qml0TWFza0NvdW50ZXI7IHNsb3RDb3VudCsrKSB7Ci0gICAgICAgIHNsb3RCaXRNYXNrQ291bnRlciAmPSBzbG90Qml0TWFza0NvdW50ZXIgLSAxOwotICAgIH0KLSAgICBMT0NfTE9HRCgiU2xvdEJpdE1hc2s9JXUgU2xvdENvdW50PSV1IE51bWJlck9mQ2VydHM9JXUiLAotICAgICAgICAgICAgIHNsb3RCaXRNYXNrLCBzbG90Q291bnQsIG51bWJlck9mQ2VydHMpOwotCi0gICAgTG9jRW5nQWRhcHRlciogYWRhcHRlciA9IGxvY19lbmdfZGF0YS5hZGFwdGVyOwotCi0gICAgaWYgKG51bWJlck9mQ2VydHMgPT0gMCkgewotICAgICAgICBMT0NfTE9HRSgiTm8gY2VydHMgdG8gaW5zdGFsbCwgc2luY2UgbnVtYmVyT2ZDZXJ0cyBpcyB6ZXJvIik7Ci0gICAgICAgIHJldF92YWwgPSBBR1BTX0NFUlRJRklDQVRFX09QRVJBVElPTl9TVUNDRVNTOwotICAgIH0gZWxzZSBpZiAoIWFkYXB0ZXIpIHsKLSAgICAgICAgTE9DX0xPR0UoImFkYXB0ZXIgaXMgbnVsbCEiKTsKLSAgICAgICAgcmV0X3ZhbCA9IEFHUFNfQ0VSVElGSUNBVEVfRVJST1JfR0VORVJJQzsKLSAgICB9IGVsc2UgaWYgKHNsb3RDb3VudCA8IG51bWJlck9mQ2VydHMpIHsKLSAgICAgICAgTE9DX0xPR0UoIk5vdCBlbm91Z2ggY2VydCBzbG90cyAoJXUpIHRvIGluc3RhbGwgJXUgY2VydHMhIiwKLSAgICAgICAgICAgICAgICAgc2xvdENvdW50LCBudW1iZXJPZkNlcnRzKTsKLSAgICAgICAgcmV0X3ZhbCA9IEFHUFNfQ0VSVElGSUNBVEVfRVJST1JfVE9PX01BTllfQ0VSVElGSUNBVEVTOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZvciAoaW50IGk9MDsgaSA8IG51bWJlck9mQ2VydHM7ICsraSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGNlcnRpZmljYXRlc1tpXS5sZW5ndGggPiBBR1BTX0NFUlRJRklDQVRFX01BWF9MRU5HVEgpIHsKLSAgICAgICAgICAgICAgICBMT0NfTE9HRSgiY2VydCMoJXUpIGxlbmd0aCBvZiAldSBpcyB0b28gYmlnISBncmVhdGVyIHRoYW4gJXUiLAotICAgICAgICAgICAgICAgICAgICAgICAgY2VydGlmaWNhdGVzW2ldLmxlbmd0aCwgQUdQU19DRVJUSUZJQ0FURV9NQVhfTEVOR1RIKTsKLSAgICAgICAgICAgICAgICByZXRfdmFsID0gQUdQU19DRVJUSUZJQ0FURV9FUlJPUl9HRU5FUklDOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHJldF92YWwgPT0gQUdQU19DRVJUSUZJQ0FURV9PUEVSQVRJT05fU1VDQ0VTUykgewotICAgICAgICAgICAgYWRhcHRlci0+c2VuZE1zZyhuZXcgTG9jRW5nSW5zdGFsbEFHcHNDZXJ0KGFkYXB0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydGlmaWNhdGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlck9mQ2VydHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvdEJpdE1hc2spKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEVYSVRfTE9HKCVkLCByZXRfdmFsKTsKLSAgICByZXR1cm4gcmV0X3ZhbDsKLX0KLQotdm9pZCBsb2NfZW5nX2NvbmZpZ3VyYXRpb25fdXBkYXRlIChsb2NfZW5nX2RhdGFfc190eXBlICZsb2NfZW5nX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNvbmZpZ19kYXRhLCBpbnQzMl90IGxlbmd0aCkKLXsKLSAgICBFTlRSWV9MT0dfQ0FMTEZMT1coKTsKLQotICAgIGlmIChjb25maWdfZGF0YSAmJiBsZW5ndGggPiAwKSB7Ci0gICAgICAgIGxvY19ncHNfY2ZnX3NfdHlwZSBncHNfY29uZl90bXAgPSBncHNfY29uZjsKLSAgICAgICAgVVRJTF9VUERBVEVfQ09ORihjb25maWdfZGF0YSwgbGVuZ3RoLCBncHNfY29uZl90YWJsZSk7Ci0gICAgICAgIExvY0VuZ0FkYXB0ZXIqIGFkYXB0ZXIgPSBsb2NfZW5nX2RhdGEuYWRhcHRlcjsKLQotICAgICAgICAvLyBpdCBpcyBwb3NzaWJsZSB0aGF0IEhBTCBpcyBub3QgaW5pdCdlZCBhdCB0aGlzIHRpbWUKLSAgICAgICAgaWYgKGFkYXB0ZXIpIHsKLSAgICAgICAgICAgIGlmIChncHNfY29uZl90bXAuU1VQTF9WRVIgIT0gZ3BzX2NvbmYuU1VQTF9WRVIpIHsKLSAgICAgICAgICAgICAgICBhZGFwdGVyLT5zZW5kTXNnKG5ldyBMb2NFbmdTdXBsVmVyKGFkYXB0ZXIsIGdwc19jb25mLlNVUExfVkVSKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZ3BzX2NvbmZfdG1wLkxQUF9QUk9GSUxFICE9IGdwc19jb25mLkxQUF9QUk9GSUxFKSB7Ci0gICAgICAgICAgICAgICAgYWRhcHRlci0+c2VuZE1zZyhuZXcgTG9jRW5nTHBwQ29uZmlnKGFkYXB0ZXIsIGdwc19jb25mLkxQUF9QUk9GSUxFKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZ3BzX2NvbmZfdG1wLkFfR0xPTkFTU19QT1NfUFJPVE9DT0xfU0VMRUNUICE9IGdwc19jb25mLkFfR0xPTkFTU19QT1NfUFJPVE9DT0xfU0VMRUNUKSB7Ci0gICAgICAgICAgICAgICAgYWRhcHRlci0+c2VuZE1zZyhuZXcgTG9jRW5nQUdsb25hc3NQcm90b2NvbChhZGFwdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3BzX2NvbmYuQV9HTE9OQVNTX1BPU19QUk9UT0NPTF9TRUxFQ1QpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGdwc19jb25mX3RtcC5TVVBMX1ZFUiA9IGdwc19jb25mLlNVUExfVkVSOwotICAgICAgICBncHNfY29uZl90bXAuTFBQX1BST0ZJTEUgPSBncHNfY29uZi5MUFBfUFJPRklMRTsKLSAgICAgICAgZ3BzX2NvbmZfdG1wLkFfR0xPTkFTU19QT1NfUFJPVE9DT0xfU0VMRUNUID0gZ3BzX2NvbmYuQV9HTE9OQVNTX1BPU19QUk9UT0NPTF9TRUxFQ1Q7Ci0gICAgICAgIGdwc19jb25mX3RtcC5HUFNfTE9DSyA9IGdwc19jb25mLkdQU19MT0NLOwotICAgICAgICBncHNfY29uZiA9IGdwc19jb25mX3RtcDsKLSAgICB9Ci0KLSAgICBFWElUX0xPRyglcywgVk9JRF9SRVQpOwotfQotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotRlVOQ1RJT04gICAgbG9jX2VuZ19yZXBvcnRfc3RhdHVzCi0KLURFU0NSSVBUSU9OCi0gICBSZXBvcnRzIEdQUyBlbmdpbmUgc3RhdGUgdG8gSmF2YSBsYXllci4KLQotREVQRU5ERU5DSUVTCi0gICBOL0EKLQotUkVUVVJOIFZBTFVFCi0gICBOL0EKLQotU0lERSBFRkZFQ1RTCi0gICBOL0EKLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLXN0YXRpYyB2b2lkIGxvY19lbmdfcmVwb3J0X3N0YXR1cyAobG9jX2VuZ19kYXRhX3NfdHlwZSAmbG9jX2VuZ19kYXRhLCBHcHNTdGF0dXNWYWx1ZSBzdGF0dXMpCi17Ci0gICAgRU5UUllfTE9HKCk7Ci0gICAgLy8gU3dpdGNoIGZyb20gV0FJVCB0byBNVVRFLCBmb3IgImVuZ2luZSBvbiIgb3IgInNlc3Npb24gYmVnaW4iIGV2ZW50Ci0gICAgaWYgKHN0YXR1cyA9PSBHUFNfU1RBVFVTX1NFU1NJT05fQkVHSU4gfHwgc3RhdHVzID09IEdQU19TVEFUVVNfRU5HSU5FX09OKQotICAgIHsKLSAgICAgICAgaWYgKGxvY19lbmdfZGF0YS5tdXRlX3Nlc3Npb25fc3RhdGUgPT0gTE9DX01VVEVfU0VTU19XQUlUKQotICAgICAgICB7Ci0gICAgICAgICAgICBMT0NfTE9HRCgibG9jX2VuZ19yZXBvcnRfc3RhdHVzOiBtdXRlX3Nlc3Npb25fc3RhdGUgY2hhbmdlZCBmcm9tIFdBSVQgdG8gSU4gU0VTU0lPTiIpOwotICAgICAgICAgICAgbG9jX2VuZ19kYXRhLm11dGVfc2Vzc2lvbl9zdGF0ZSA9IExPQ19NVVRFX1NFU1NfSU5fU0VTU0lPTjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFN3aXRjaCBvZmYgTVVURSBzZXNzaW9uCi0gICAgaWYgKGxvY19lbmdfZGF0YS5tdXRlX3Nlc3Npb25fc3RhdGUgPT0gTE9DX01VVEVfU0VTU19JTl9TRVNTSU9OICYmCi0gICAgICAgIChzdGF0dXMgPT0gR1BTX1NUQVRVU19TRVNTSU9OX0VORCB8fCBzdGF0dXMgPT0gR1BTX1NUQVRVU19FTkdJTkVfT0ZGKSkKLSAgICB7Ci0gICAgICAgIExPQ19MT0dEKCJsb2NfZW5nX3JlcG9ydF9zdGF0dXM6IG11dGVfc2Vzc2lvbl9zdGF0ZSBjaGFuZ2VkIGZyb20gSU4gU0VTU0lPTiB0byBOT05FIik7Ci0gICAgICAgIGxvY19lbmdfZGF0YS5tdXRlX3Nlc3Npb25fc3RhdGUgPSBMT0NfTVVURV9TRVNTX05PTkU7Ci0gICAgfQotCi0gICAgLy8gU2Vzc2lvbiBFbmQgaXMgbm90IHJlcG9ydGVkIGR1cmluZyBBbmRyb2lkIG5hdmlnYXRpbmcgc3RhdGUKLSAgICBib29sZWFuIG5hdmlnYXRpbmcgPSBsb2NfZW5nX2RhdGEuYWRhcHRlci0+aXNJblNlc3Npb24oKTsKLSAgICBpZiAoc3RhdHVzICE9IEdQU19TVEFUVVNfTk9ORSAmJgotICAgICAgICAhKHN0YXR1cyA9PSBHUFNfU1RBVFVTX1NFU1NJT05fRU5EICYmIG5hdmlnYXRpbmcpICYmCi0gICAgICAgICEoc3RhdHVzID09IEdQU19TVEFUVVNfU0VTU0lPTl9CRUdJTiAmJiAhbmF2aWdhdGluZykpCi0gICAgewotICAgICAgICBpZiAobG9jX2VuZ19kYXRhLm11dGVfc2Vzc2lvbl9zdGF0ZSAhPSBMT0NfTVVURV9TRVNTX0lOX1NFU1NJT04pCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIEluZm9ybSBHcHNMb2NhdGlvblByb3ZpZGVyIGFib3V0IG1OYXZpZ2F0aW5nIHN0YXR1cwotICAgICAgICAgICAgbG9jX2luZm9ybV9ncHNfc3RhdHVzKGxvY19lbmdfZGF0YSwgc3RhdHVzKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIExPQ19MT0dEKCJsb2NfZW5nX3JlcG9ydF9zdGF0dXM6IG11dGluZyB0aGUgc3RhdHVzIHJlcG9ydC4iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIE9ubHkga2VlcHMgRU5HSU5FIE9OL09GRiBpbiBlbmdpbmVfc3RhdHVzCi0gICAgaWYgKHN0YXR1cyA9PSBHUFNfU1RBVFVTX0VOR0lORV9PTiB8fCBzdGF0dXMgPT0gR1BTX1NUQVRVU19FTkdJTkVfT0ZGKQotICAgIHsKLSAgICAgICAgbG9jX2VuZ19kYXRhLmVuZ2luZV9zdGF0dXMgPSBzdGF0dXM7Ci0gICAgfQotCi0gICAgLy8gT25seSBrZWVwcyBTRVNTSU9OIEJFR0lOL0VORCBpbiBmaXhfc2Vzc2lvbl9zdGF0dXMKLSAgICBpZiAoc3RhdHVzID09IEdQU19TVEFUVVNfU0VTU0lPTl9CRUdJTiB8fCBzdGF0dXMgPT0gR1BTX1NUQVRVU19TRVNTSU9OX0VORCkKLSAgICB7Ci0gICAgICAgIGxvY19lbmdfZGF0YS5maXhfc2Vzc2lvbl9zdGF0dXMgPSBzdGF0dXM7Ci0gICAgfQotICAgIEVYSVRfTE9HKCVzLCBWT0lEX1JFVCk7Ci19Ci0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1GVU5DVElPTiBsb2NfZW5nX2hhbmRsZV9lbmdpbmVfZG93bgotICAgICAgICAgbG9jX2VuZ19oYW5kbGVfZW5naW5lX3VwCi0KLURFU0NSSVBUSU9OCi0gICBDYWxscyB0aGlzIGZ1bmN0aW9uIHdoZW4gaXQgaXMgZGV0ZWN0ZWQgdGhhdCBtb2RlbSByZXN0YXJ0IGlzIGhhcHBlbmluZy4KLSAgIEVpdGhlciB3ZSBkZXRlY3RlZCB0aGUgbW9kZW0gaXMgZG93biBvciByZWNlaXZlZCBtb2RlbSB1cCBldmVudC4KLSAgIFRoaXMgbXVzdCBiZSBjYWxsZWQgZnJvbSB0aGUgZGVmZXJyZWQgdGhyZWFkIHRvIGF2b2lkIHJhY2UgY29uZGl0aW9uLgotCi1ERVBFTkRFTkNJRVMKLSAgIE5vbmUKLQotUkVUVVJOIFZBTFVFCi0gICBOb25lCi0KLVNJREUgRUZGRUNUUwotICAgTi9BCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi12b2lkIGxvY19lbmdfaGFuZGxlX2VuZ2luZV9kb3duKGxvY19lbmdfZGF0YV9zX3R5cGUgJmxvY19lbmdfZGF0YSkKLXsKLSAgICBFTlRSWV9MT0coKTsKLSAgICBsb2NfZW5nX25pX3Jlc2V0X29uX2VuZ2luZV9yZXN0YXJ0KGxvY19lbmdfZGF0YSk7Ci0gICAgbG9jX2VuZ19yZXBvcnRfc3RhdHVzKGxvY19lbmdfZGF0YSwgR1BTX1NUQVRVU19FTkdJTkVfT0ZGKTsKLSAgICBFWElUX0xPRyglcywgVk9JRF9SRVQpOwotfQotCi12b2lkIGxvY19lbmdfaGFuZGxlX2VuZ2luZV91cChsb2NfZW5nX2RhdGFfc190eXBlICZsb2NfZW5nX2RhdGEpCi17Ci0gICAgRU5UUllfTE9HKCk7Ci0gICAgbG9jX2VuZ19yZWluaXQobG9jX2VuZ19kYXRhKTsKLQotICAgIGxvY19lbmdfZGF0YS5hZGFwdGVyLT5yZXF1ZXN0UG93ZXJWb3RlKCk7Ci0KLSAgICBpZiAobG9jX2VuZ19kYXRhLmFncHNfc3RhdHVzX2NiICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKGxvY19lbmdfZGF0YS5hZ25zc19uaWYpCi0gICAgICAgICAgICBsb2NfZW5nX2RhdGEuYWduc3NfbmlmLT5kcm9wQWxsU3Vic2NyaWJlcnMoKTsKLSAgICAgICAgaWYgKGxvY19lbmdfZGF0YS5pbnRlcm5ldF9uaWYpCi0gICAgICAgICAgICBsb2NfZW5nX2RhdGEuaW50ZXJuZXRfbmlmLT5kcm9wQWxsU3Vic2NyaWJlcnMoKTsKLQotICAgICAgICBsb2NfZW5nX2FncHNfcmVpbml0KGxvY19lbmdfZGF0YSk7Ci0gICAgfQotCi0gICAgbG9jX2VuZ19yZXBvcnRfc3RhdHVzKGxvY19lbmdfZGF0YSwgR1BTX1NUQVRVU19FTkdJTkVfT04pOwotCi0gICAgLy8gbW9kZW0gaXMgYmFjayB1cC4gIElmIHdlIGNyYXNoZWQgaW4gdGhlIG1pZGRsZSBvZiBuYXZpZ2F0aW5nLCB3ZSByZXN0YXJ0LgotICAgIGlmIChsb2NfZW5nX2RhdGEuYWRhcHRlci0+aXNJblNlc3Npb24oKSkgewotICAgICAgICAvLyBUaGlzIHNldHMgdGhlIGNvcHkgaW4gYWRhcHRlciB0byBtb2RlbQotICAgICAgICBsb2NfZW5nX2RhdGEuYWRhcHRlci0+c2V0UG9zaXRpb25Nb2RlKE5VTEwpOwotICAgICAgICBsb2NfZW5nX2RhdGEuYWRhcHRlci0+c2V0SW5TZXNzaW9uKGZhbHNlKTsKLSAgICAgICAgbG9jX2VuZ19zdGFydF9oYW5kbGVyKGxvY19lbmdfZGF0YSk7Ci0gICAgfQotICAgIEVYSVRfTE9HKCVzLCBWT0lEX1JFVCk7Ci19Ci0KLSNpZmRlZiBVU0VfR0xJQgotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLUZVTkNUSU9OIHNldF9zY2hlZF9wb2xpY3kKLQotREVTQ1JJUFRJT04KLSAgIExvY2FsIGNvcHkgb2YgdGhpcyBmdW5jdGlvbiB3aGljaCBieXBhc3NlcyBhbmRyb2lkIHNldF9zY2hlZF9wb2xpY3kKLQotREVQRU5ERU5DSUVTCi0gICBOb25lCi0KLVJFVFVSTiBWQUxVRQotICAgMAotCi1TSURFIEVGRkVDVFMKLSAgIE4vQQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotc3RhdGljIGludCBzZXRfc2NoZWRfcG9saWN5KGludCB0aWQsIFNjaGVkUG9saWN5IHBvbGljeSkKLXsKLSAgICByZXR1cm4gMDsKLX0KLSNlbmRpZiAvKiBVU0VfR0xJQiAqLwotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotRlVOQ1RJT04gICAgbG9jX2VuZ19yZWFkX2NvbmZpZwotCi1ERVNDUklQVElPTgotICAgSW5pdGlhdGVzIHRoZSByZWFkaW5nIG9mIHRoZSBncHMgY29uZmlnIGZpbGUgc3RvcmVkIGluIC9ldGMgZGlyCi0KLURFUEVOREVOQ0lFUwotICAgTm9uZQotCi1SRVRVUk4gVkFMVUUKLSAgIDA6IHN1Y2Nlc3MKLQotU0lERSBFRkZFQ1RTCi0gICBOL0EKLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLWludCBsb2NfZW5nX3JlYWRfY29uZmlnKHZvaWQpCi17Ci0gICAgRU5UUllfTE9HX0NBTExGTE9XKCk7Ci0gICAgaWYoY29uZmlnQWxyZWFkeVJlYWQgPT0gZmFsc2UpCi0gICAgewotICAgICAgLy8gSW5pdGlhbGl6ZSBvdXIgZGVmYXVsdHMgYmVmb3JlIHJlYWRpbmcgb2YgY29uZmlndXJhdGlvbiBmaWxlIG92ZXJ3cml0ZXMgdGhlbS4KLSAgICAgIGxvY19kZWZhdWx0X3BhcmFtZXRlcnMoKTsKLSAgICAgIC8vIFdlIG9ubHkgd2FudCB0byBwYXJzZSB0aGUgY29uZiBmaWxlIG9uY2UuIFRoaXMgaXMgYSBnb29kIHBsYWNlIHRvIGVuc3VyZSB0aGF0LgotICAgICAgLy8gSW4gZmFjdCBvbmUgZGF5IHRoZSBjb25mIGZpbGUgc2hvdWxkIGdvIGludG8gY29udGV4dC4KLSAgICAgIFVUSUxfUkVBRF9DT05GKEdQU19DT05GX0ZJTEUsIGdwc19jb25mX3RhYmxlKTsKLSAgICAgIFVUSUxfUkVBRF9DT05GKFNBUF9DT05GX0ZJTEUsIHNhcF9jb25mX3RhYmxlKTsKLSAgICAgIGNvbmZpZ0FscmVhZHlSZWFkID0gdHJ1ZTsKLSAgICB9IGVsc2UgewotICAgICAgTE9DX0xPR1YoIkdQUyBDb25maWcgZmlsZSBoYXMgYWxyZWFkeSBiZWVuIHJlYWRcbiIpOwotICAgIH0KLQotICAgIEVYSVRfTE9HKCVkLCAwKTsKLSAgICByZXR1cm4gMDsKLX0KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLUZVTkNUSU9OICAgIGxvY19lbmdfaGFuZGxlX3NodXRkb3duCi0KLURFU0NSSVBUSU9OCi0gICBDYWxscyB0aGUgc2h1dGRvd24gY2FsbGJhY2sgZnVuY3Rpb24gaW4gdGhlIGxvYyBpbnRlcmZhY2UgdG8gY2xvc2UKLSAgIHRoZSBtb2RlbSBub2RlCi0KLURFUEVOREVOQ0lFUwotICAgTm9uZQotCi1SRVRVUk4gVkFMVUUKLSAgIDA6IHN1Y2Nlc3MKLQotU0lERSBFRkZFQ1RTCi0gICBOL0EKLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLXZvaWQgbG9jX2VuZ19oYW5kbGVfc2h1dGRvd24obG9jX2VuZ19kYXRhX3NfdHlwZSAmbG9jRW5nKQotewotICAgIEVOVFJZX0xPRygpOwotICAgIGxvY0VuZy5zaHV0ZG93bl9jYigpOwotICAgIEVYSVRfTE9HKCVkLCAwKTsKLX0KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLUZVTkNUSU9OICAgIGxvY19lbmdfZ3BzX21lYXN1cmVtZW50X2luaXQKLQotREVTQ1JJUFRJT04KLSAgIEluaXRpYWxpemUgZ3BzIG1lYXN1cmVtZW50IG1vZHVsZS4KLQotREVQRU5ERU5DSUVTCi0gICBOL0EKLQotUkVUVVJOIFZBTFVFCi0gICAwOiBzdWNjZXNzCi0KLVNJREUgRUZGRUNUUwotICAgTi9BCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi1pbnQgbG9jX2VuZ19ncHNfbWVhc3VyZW1lbnRfaW5pdChsb2NfZW5nX2RhdGFfc190eXBlICZsb2NfZW5nX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcHNNZWFzdXJlbWVudENhbGxiYWNrcyogY2FsbGJhY2tzKQotewotICAgIEVOVFJZX0xPR19DQUxMRkxPVygpOwotCi0gICAgU1RBVEVfQ0hFQ0soKE5VTEwgPT0gbG9jX2VuZ19kYXRhLmdwc19tZWFzdXJlbWVudF9jYiksCi0gICAgICAgICAgICAgICAgImdwcyBtZWFzdXJlbWVudCBhbHJlYWR5IGluaXRpYWxpemVkIiwKLSAgICAgICAgICAgICAgICByZXR1cm4gR1BTX01FQVNVUkVNRU5UX0VSUk9SX0FMUkVBRFlfSU5JVCk7Ci0gICAgU1RBVEVfQ0hFQ0soKGNhbGxiYWNrcyAhPSBOVUxMKSwKLSAgICAgICAgICAgICAgICAiY2FsbGJhY2tzIGNhbiBub3QgYmUgTlVMTCIsCi0gICAgICAgICAgICAgICAgcmV0dXJuIEdQU19NRUFTVVJFTUVOVF9FUlJPUl9HRU5FUklDKTsKLSAgICBTVEFURV9DSEVDSyhsb2NfZW5nX2RhdGEuYWRhcHRlciwKLSAgICAgICAgICAgICAgICAiR3BzSW50ZXJmYWNlIG11c3QgYmUgaW5pdGlhbGl6ZWQgZmlyc3QiLAotICAgICAgICAgICAgICAgIHJldHVybiBHUFNfTUVBU1VSRU1FTlRfRVJST1JfR0VORVJJQyk7Ci0KLSAgICAvLyB1cGRhdGVkIHRoZSBtYXNrCi0gICAgTE9DX0FQSV9BREFQVEVSX0VWRU5UX01BU0tfVCBldmVudCA9IExPQ19BUElfQURBUFRFUl9CSVRfR05TU19NRUFTVVJFTUVOVDsKLSAgICBsb2NfZW5nX2RhdGEuYWRhcHRlci0+c2VuZE1zZyhuZXcgTG9jRW5nVXBkYXRlUmVnaXN0cmF0aW9uTWFzaygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxvY19lbmdfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPQ19SRUdJU1RSQVRJT05fTUFTS19FTkFCTEVEKSk7Ci0gICAgLy8gc2V0IHVwIHRoZSBjYWxsYmFjawotICAgIGxvY19lbmdfZGF0YS5ncHNfbWVhc3VyZW1lbnRfY2IgPSBjYWxsYmFja3MtPm1lYXN1cmVtZW50X2NhbGxiYWNrOwotICAgIExPQ19MT0dEICgiJXMsIGV2ZW50IG1hc2tzIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5IiwgX19mdW5jX18pOwotCi0gICAgcmV0dXJuIEdQU19NRUFTVVJFTUVOVF9PUEVSQVRJT05fU1VDQ0VTUzsKLX0KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLUZVTkNUSU9OICAgIGxvY19lbmdfZ3BzX21lYXN1cmVtZW50X2Nsb3NlCi0KLURFU0NSSVBUSU9OCi0gICBDbG9zZSBncHMgbWVhc3VyZW1lbnQgbW9kdWxlLgotCi1ERVBFTkRFTkNJRVMKLSAgIE4vQQotCi1SRVRVUk4gVkFMVUUKLSAgIE4vQQotCi1TSURFIEVGRkVDVFMKLSAgIE4vQQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotdm9pZCBsb2NfZW5nX2dwc19tZWFzdXJlbWVudF9jbG9zZShsb2NfZW5nX2RhdGFfc190eXBlICZsb2NfZW5nX2RhdGEpCi17Ci0gICAgRU5UUllfTE9HX0NBTExGTE9XKCk7Ci0KLSAgICBJTklUX0NIRUNLKGxvY19lbmdfZGF0YS5hZGFwdGVyLCByZXR1cm4pOwotCi0gICAgLy8gdXBkYXRlZCB0aGUgbWFzawotICAgIExPQ19BUElfQURBUFRFUl9FVkVOVF9NQVNLX1QgZXZlbnQgPSBMT0NfQVBJX0FEQVBURVJfQklUX0dOU1NfTUVBU1VSRU1FTlQ7Ci0gICAgbG9jX2VuZ19kYXRhLmFkYXB0ZXItPnNlbmRNc2cobmV3IExvY0VuZ1VwZGF0ZVJlZ2lzdHJhdGlvbk1hc2soCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxvY19lbmdfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0NfUkVHSVNUUkFUSU9OX01BU0tfRElTQUJMRUQpKTsKLSAgICAvLyBzZXQgdXAgdGhlIGNhbGxiYWNrCi0gICAgbG9jX2VuZ19kYXRhLmdwc19tZWFzdXJlbWVudF9jYiA9IE5VTEw7Ci0gICAgRVhJVF9MT0coJWQsIDApOwotfQpkaWZmIC0tZ2l0IGEvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGlfNTAwMDEvbG9jX2VuZy5oIGIvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGlfNTAwMDEvbG9jX2VuZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTU0OTUzLi4wMDAwMDAwCi0tLSBhL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpXzUwMDAxL2xvY19lbmcuaAorKysgL2Rldi9udWxsCkBAIC0xLDI3MiArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMDktMjAxMywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKLSAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAotICogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiwgbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKLSAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAotICogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKLSAqIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KLSAqIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaWZuZGVmIExPQ19FTkdfSAotI2RlZmluZSBMT0NfRU5HX0gKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0vLyBVbmNvbW1lbnQgdG8ga2VlcCBhbGwgTE9HIG1lc3NhZ2VzIChMT0dELCBMT0dJLCBMT0dWLCBldGMuKQotI2RlZmluZSBNQVhfTlVNX0FUTF9DT05ORUNUSU9OUyAgMgotCi0vLyBEZWZpbmUgYm9vbGVhbiB0eXBlIHRvIGJlIHVzZWQgYnkgbGliZ3BzIG9uIGxvYyBhcGkgbW9kdWxlCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgYm9vbGVhbjsKLQotI2lmbmRlZiBUUlVFCi0jZGVmaW5lIFRSVUUgMQotI2VuZGlmCi0KLSNpZm5kZWYgRkFMU0UKLSNkZWZpbmUgRkFMU0UgMAotI2VuZGlmCi0KLSNpbmNsdWRlIDxsb2MuaD4KLSNpbmNsdWRlIDxsb2NfZW5nX3h0cmEuaD4KLSNpbmNsdWRlIDxsb2NfZW5nX25pLmg+Ci0jaW5jbHVkZSA8bG9jX2VuZ19hZ3BzLmg+Ci0jaW5jbHVkZSA8bG9jX2NmZy5oPgotI2luY2x1ZGUgPGxvY19sb2cuaD4KLSNpbmNsdWRlIDxsb2dfdXRpbC5oPgotI2luY2x1ZGUgPGxvY19lbmdfYWdwcy5oPgotI2luY2x1ZGUgPExvY0VuZ0FkYXB0ZXIuaD4KLQotLy8gVGhlIGRhdGEgY29ubmVjdGlvbiBtaW5pbWFsIG9wZW4gdGltZQotI2RlZmluZSBEQVRBX09QRU5fTUlOX1RJTUUgICAgICAgIDEgIC8qIHNlYyAqLwotCi0vLyBUaGUgc3lzdGVtIHNlZXMgR1BTIGVuZ2luZSB0dXJucyBvZmYgYWZ0ZXIgaW5hY3RpdmUgZm9yIHRoaXMgcGVyaW9kIG9mIHRpbWUKLSNkZWZpbmUgR1BTX0FVVE9fT0ZGX1RJTUUgICAgICAgICAyICAvKiBzZWNzICovCi0jZGVmaW5lIFNVQ0NFU1MgICAgICAgICAgICAgIFRSVUUKLSNkZWZpbmUgRkFJTFVSRSAgICAgICAgICAgICAgICAgRkFMU0UKLSNkZWZpbmUgSU5WQUxJRF9BVExfQ09OTkVDVElPTl9IQU5ETEUgLTEKLQotI2RlZmluZSBNQVhfWFRSQV9TRVJWRVJfVVJMX0xFTkdUSCAyNTYKLQotZW51bSBsb2Nfbm1lYV9wcm92aWRlcl9lX3R5cGUgewotICAgIE5NRUFfUFJPVklERVJfQVAgPSAwLCAvLyBBcHBsaWNhdGlvbiBQcm9jZXNzb3IgUHJvdmlkZXIgb2YgTk1FQQotICAgIE5NRUFfUFJPVklERVJfTVAgLy8gTW9kZW0gUHJvY2Vzc29yIFByb3ZpZGVyIG9mIE5NRUEKLX07Ci0KLWVudW0gbG9jX211dGVfc2Vzc2lvbl9lX3R5cGUgewotICAgTE9DX01VVEVfU0VTU19OT05FID0gMCwKLSAgIExPQ19NVVRFX1NFU1NfV0FJVCwKLSAgIExPQ19NVVRFX1NFU1NfSU5fU0VTU0lPTgotfTsKLQotLy8gTW9kdWxlIGRhdGEKLXR5cGVkZWYgc3RydWN0IGxvY19lbmdfZGF0YV9zCi17Ci0gICAgTG9jRW5nQWRhcHRlciAgICAgICAgICAgICAgICAgICphZGFwdGVyOwotICAgIGxvY19sb2NhdGlvbl9jYl9leHQgICAgICAgICAgICBsb2NhdGlvbl9jYjsKLSAgICBncHNfc3RhdHVzX2NhbGxiYWNrICAgICAgICAgICAgc3RhdHVzX2NiOwotICAgIGxvY19zdl9zdGF0dXNfY2JfZXh0ICAgICAgICAgICBzdl9zdGF0dXNfY2I7Ci0gICAgYWdwc19zdGF0dXNfZXh0ZW5kZWQgICAgICAgICAgIGFncHNfc3RhdHVzX2NiOwotICAgIGdwc19ubWVhX2NhbGxiYWNrICAgICAgICAgICAgICBubWVhX2NiOwotICAgIGdwc19uaV9ub3RpZnlfY2FsbGJhY2sgICAgICAgICBuaV9ub3RpZnlfY2I7Ci0gICAgZ3BzX3NldF9jYXBhYmlsaXRpZXMgICAgICAgICAgIHNldF9jYXBhYmlsaXRpZXNfY2I7Ci0gICAgZ3BzX2FjcXVpcmVfd2FrZWxvY2sgICAgICAgICAgIGFjcXVpcmVfd2FrZWxvY2tfY2I7Ci0gICAgZ3BzX3JlbGVhc2Vfd2FrZWxvY2sgICAgICAgICAgIHJlbGVhc2Vfd2FrZWxvY2tfY2I7Ci0gICAgZ3BzX3JlcXVlc3RfdXRjX3RpbWUgICAgICAgICAgIHJlcXVlc3RfdXRjX3RpbWVfY2I7Ci0gICAgZ3BzX21lYXN1cmVtZW50X2NhbGxiYWNrICAgICAgIGdwc19tZWFzdXJlbWVudF9jYjsKLSAgICBib29sZWFuICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJtZWRpYXRlRml4OwotICAgIEFHcHNTdGF0dXNWYWx1ZSAgICAgICAgICAgICAgICBhZ3BzX3N0YXR1czsKLSAgICBsb2NfZW5nX3h0cmFfZGF0YV9zX3R5cGUgICAgICAgeHRyYV9tb2R1bGVfZGF0YTsKLSAgICBsb2NfZW5nX25pX2RhdGFfc190eXBlICAgICAgICAgbG9jX2VuZ19uaV9kYXRhOwotCi0gICAgLy8gQUdQUyBzdGF0ZSBtYWNoaW5lcwotICAgIEFncHNTdGF0ZU1hY2hpbmUqICAgICAgICAgICAgICBhZ25zc19uaWY7Ci0gICAgQWdwc1N0YXRlTWFjaGluZSogICAgICAgICAgICAgIGludGVybmV0X25pZjsKLSAgICBBZ3BzU3RhdGVNYWNoaW5lKiAgICAgICAgICAgICAgd2lmaV9uaWY7Ci0gICAgLy9TdGF0ZSBtYWNoaW5lIGZvciBEYXRhIFNlcnZpY2VzCi0gICAgQWdwc1N0YXRlTWFjaGluZSogICAgICAgICAgICAgIGRzX25pZjsKLQotICAgIC8vIEdQUyBlbmdpbmUgc3RhdHVzCi0gICAgR3BzU3RhdHVzVmFsdWUgICAgICAgICAgICAgICAgIGVuZ2luZV9zdGF0dXM7Ci0gICAgR3BzU3RhdHVzVmFsdWUgICAgICAgICAgICAgICAgIGZpeF9zZXNzaW9uX3N0YXR1czsKLQotICAgIC8vIEFpZGluZyBkYXRhIGluZm9ybWF0aW9uIHRvIGJlIGRlbGV0ZWQsIGFpZGluZyBkYXRhIGNhbiBvbmx5IGJlIGRlbGV0ZWQgd2hlbiBHUFMgZW5naW5lIGlzIG9mZgotICAgIEdwc0FpZGluZ0RhdGEgICAgICAgICAgICAgICAgICBhaWRpbmdfZGF0YV9mb3JfZGVsZXRpb247Ci0KLSAgICAvLyBGb3IgbXV0aW5nIHNlc3Npb24gYnJvYWRjYXN0Ci0gICAgbG9jX211dGVfc2Vzc2lvbl9lX3R5cGUgICAgICAgIG11dGVfc2Vzc2lvbl9zdGF0ZTsKLQotICAgIC8vIEZvciBubWVhIGdlbmVyYXRpb24KLSAgICBib29sZWFuIGdlbmVyYXRlTm1lYTsKLSAgICB1aW50MzJfdCBzdl91c2VkX21hc2s7Ci0gICAgZmxvYXQgaGRvcDsKLSAgICBmbG9hdCBwZG9wOwotICAgIGZsb2F0IHZkb3A7Ci0KLSAgICAvLyBBZGRyZXNzIGJ1ZmZlcnMsIGZvciBhZGRyZXNzaW5nIHNldHRpbmcgYmVmb3JlIGluaXQKLSAgICBpbnQgICAgc3VwbF9ob3N0X3NldDsKLSAgICBjaGFyICAgc3VwbF9ob3N0X2J1ZlsxMDFdOwotICAgIGludCAgICBzdXBsX3BvcnRfYnVmOwotICAgIGludCAgICBjMmtfaG9zdF9zZXQ7Ci0gICAgY2hhciAgIGMya19ob3N0X2J1ZlsxMDFdOwotICAgIGludCAgICBjMmtfcG9ydF9idWY7Ci0gICAgaW50ICAgIG1wY19ob3N0X3NldDsKLSAgICBjaGFyICAgbXBjX2hvc3RfYnVmWzEwMV07Ci0gICAgaW50ICAgIG1wY19wb3J0X2J1ZjsKLQotICAgIGxvY19leHRfcGFyc2VyIGxvY2F0aW9uX2V4dF9wYXJzZXI7Ci0gICAgbG9jX2V4dF9wYXJzZXIgc3ZfZXh0X3BhcnNlcjsKLSAgICBsb2Nfc2h1dGRvd25fY2Igc2h1dGRvd25fY2I7Ci19IGxvY19lbmdfZGF0YV9zX3R5cGU7Ci0KLS8qIEdQUy5jb25mIHN1cHBvcnQgKi8KLS8qIE5PVEU6IHRoZSBpbXBsZW1lbnRhaXRvbiBvZiB0aGUgcGFyc2VyIGNhc3RzIG51bWJlcgotICAgZmllbGRzIHRvIDMyIGJpdC4gVG8gZW5zdXJlIGFsbCAnbicgZmllbGRzIHdvcmtpbmcsCi0gICB0aGV5IG11c3QgYWxsIGJlIDMyIGJpdCBmaWVsZHMuICovCi10eXBlZGVmIHN0cnVjdCBsb2NfZ3BzX2NmZ19zCi17Ci0gICAgdWludDMyX3QgICAgICAgSU5URVJNRURJQVRFX1BPUzsKLSAgICB1aW50MzJfdCAgICAgICBBQ0NVUkFDWV9USFJFUzsKLSAgICB1aW50MzJfdCAgICAgICBTVVBMX1ZFUjsKLSAgICB1aW50MzJfdCAgICAgICBDQVBBQklMSVRJRVM7Ci0gICAgdWludDMyX3QgICAgICAgTFBQX1BST0ZJTEU7Ci0gICAgdWludDMyX3QgICAgICAgTk1FQV9QUk9WSURFUjsKLSAgICB1aW50MzJfdCAgICAgICBHUFNfTE9DSzsKLSAgICB1aW50MzJfdCAgICAgICBBX0dMT05BU1NfUE9TX1BST1RPQ09MX1NFTEVDVDsKLSAgICB1aW50MzJfdCAgICAgICBBR1BTX0NFUlRfV1JJVEFCTEVfTUFTSzsKLSAgICBjaGFyICAgICAgICAgICBYVFJBX1NFUlZFUl8xW01BWF9YVFJBX1NFUlZFUl9VUkxfTEVOR1RIXTsKLSAgICBjaGFyICAgICAgICAgICBYVFJBX1NFUlZFUl8yW01BWF9YVFJBX1NFUlZFUl9VUkxfTEVOR1RIXTsKLSAgICBjaGFyICAgICAgICAgICBYVFJBX1NFUlZFUl8zW01BWF9YVFJBX1NFUlZFUl9VUkxfTEVOR1RIXTsKLX0gbG9jX2dwc19jZmdfc190eXBlOwotCi0vKiBOT1RFOiB0aGUgaW1wbGVtZW50YWl0b24gb2YgdGhlIHBhcnNlciBjYXN0cyBudW1iZXIKLSAgIGZpZWxkcyB0byAzMiBiaXQuIFRvIGVuc3VyZSBhbGwgJ24nIGZpZWxkcyB3b3JraW5nLAotICAgdGhleSBtdXN0IGFsbCBiZSAzMiBiaXQgZmllbGRzLiAqLwotLyogTWVhbndoaWxlLCAqX3ZhbGlkIGZpZWxkcyBhcmUgOCBiaXQgZmllbGRzLCBhbmQgJ2YnCi0gICBmaWVsZHMgYXJlIGRvdWJsZS4gUmlnaWQgYXMgdGhleSBhcmUsIGl0IGlzIHRoZQotICAgdGhlIHN0YXR1cyBxdW8sIHVudGlsIHRoZSBwYXJzaW5nIG1lY2hhbmlzbSBpcwotICAgY2hhbmdlLCB0aGF0IGlzLiAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICB1aW50OF90ICAgICAgICBHWVJPX0JJQVNfUkFORE9NX1dBTEtfVkFMSUQ7Ci0gICAgZG91YmxlICAgICAgICAgR1lST19CSUFTX1JBTkRPTV9XQUxLOwotICAgIHVpbnQzMl90ICAgICAgIFNFTlNPUl9BQ0NFTF9CQVRDSEVTX1BFUl9TRUM7Ci0gICAgdWludDMyX3QgICAgICAgU0VOU09SX0FDQ0VMX1NBTVBMRVNfUEVSX0JBVENIOwotICAgIHVpbnQzMl90ICAgICAgIFNFTlNPUl9HWVJPX0JBVENIRVNfUEVSX1NFQzsKLSAgICB1aW50MzJfdCAgICAgICBTRU5TT1JfR1lST19TQU1QTEVTX1BFUl9CQVRDSDsKLSAgICB1aW50MzJfdCAgICAgICBTRU5TT1JfQUNDRUxfQkFUQ0hFU19QRVJfU0VDX0hJR0g7Ci0gICAgdWludDMyX3QgICAgICAgU0VOU09SX0FDQ0VMX1NBTVBMRVNfUEVSX0JBVENIX0hJR0g7Ci0gICAgdWludDMyX3QgICAgICAgU0VOU09SX0dZUk9fQkFUQ0hFU19QRVJfU0VDX0hJR0g7Ci0gICAgdWludDMyX3QgICAgICAgU0VOU09SX0dZUk9fU0FNUExFU19QRVJfQkFUQ0hfSElHSDsKLSAgICB1aW50MzJfdCAgICAgICBTRU5TT1JfQ09OVFJPTF9NT0RFOwotICAgIHVpbnQzMl90ICAgICAgIFNFTlNPUl9VU0FHRTsKLSAgICB1aW50MzJfdCAgICAgICBTRU5TT1JfQUxHT1JJVEhNX0NPTkZJR19NQVNLOwotICAgIHVpbnQ4X3QgICAgICAgIEFDQ0VMX1JBTkRPTV9XQUxLX1NQRUNUUkFMX0RFTlNJVFlfVkFMSUQ7Ci0gICAgZG91YmxlICAgICAgICAgQUNDRUxfUkFORE9NX1dBTEtfU1BFQ1RSQUxfREVOU0lUWTsKLSAgICB1aW50OF90ICAgICAgICBBTkdMRV9SQU5ET01fV0FMS19TUEVDVFJBTF9ERU5TSVRZX1ZBTElEOwotICAgIGRvdWJsZSAgICAgICAgIEFOR0xFX1JBTkRPTV9XQUxLX1NQRUNUUkFMX0RFTlNJVFk7Ci0gICAgdWludDhfdCAgICAgICAgUkFURV9SQU5ET01fV0FMS19TUEVDVFJBTF9ERU5TSVRZX1ZBTElEOwotICAgIGRvdWJsZSAgICAgICAgIFJBVEVfUkFORE9NX1dBTEtfU1BFQ1RSQUxfREVOU0lUWTsKLSAgICB1aW50OF90ICAgICAgICBWRUxPQ0lUWV9SQU5ET01fV0FMS19TUEVDVFJBTF9ERU5TSVRZX1ZBTElEOwotICAgIGRvdWJsZSAgICAgICAgIFZFTE9DSVRZX1JBTkRPTV9XQUxLX1NQRUNUUkFMX0RFTlNJVFk7Ci0gICAgdWludDMyX3QgICAgICAgU0VOU09SX1BST1ZJREVSOwotfSBsb2Nfc2FwX2NmZ19zX3R5cGU7Ci0KLWV4dGVybiBsb2NfZ3BzX2NmZ19zX3R5cGUgZ3BzX2NvbmY7Ci1leHRlcm4gbG9jX3NhcF9jZmdfc190eXBlIHNhcF9jb25mOwotCi1pbnQgIGxvY19lbmdfaW5pdChsb2NfZW5nX2RhdGFfc190eXBlICZsb2NfZW5nX2RhdGEsCi0gICAgICAgICAgICAgICAgICBMb2NDYWxsYmFja3MqIGNhbGxiYWNrcywKLSAgICAgICAgICAgICAgICAgIExPQ19BUElfQURBUFRFUl9FVkVOVF9NQVNLX1QgZXZlbnQsCi0gICAgICAgICAgICAgICAgICBDb250ZXh0QmFzZSogY29udGV4dCk7Ci1pbnQgIGxvY19lbmdfc3RhcnQobG9jX2VuZ19kYXRhX3NfdHlwZSAmbG9jX2VuZ19kYXRhKTsKLWludCAgbG9jX2VuZ19zdG9wKGxvY19lbmdfZGF0YV9zX3R5cGUgJmxvY19lbmdfZGF0YSk7Ci12b2lkIGxvY19lbmdfY2xlYW51cChsb2NfZW5nX2RhdGFfc190eXBlICZsb2NfZW5nX2RhdGEpOwotaW50ICBsb2NfZW5nX2luamVjdF90aW1lKGxvY19lbmdfZGF0YV9zX3R5cGUgJmxvY19lbmdfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBHcHNVdGNUaW1lIHRpbWUsIGludDY0X3QgdGltZVJlZmVyZW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdW5jZXJ0YWludHkpOwotaW50ICBsb2NfZW5nX2luamVjdF9sb2NhdGlvbihsb2NfZW5nX2RhdGFfc190eXBlICZsb2NfZW5nX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBsYXRpdHVkZSwgZG91YmxlIGxvbmdpdHVkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYWNjdXJhY3kpOwotdm9pZCBsb2NfZW5nX2RlbGV0ZV9haWRpbmdfZGF0YShsb2NfZW5nX2RhdGFfc190eXBlICZsb2NfZW5nX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdwc0FpZGluZ0RhdGEgZik7Ci1pbnQgIGxvY19lbmdfc2V0X3Bvc2l0aW9uX21vZGUobG9jX2VuZ19kYXRhX3NfdHlwZSAmbG9jX2VuZ19kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY1Bvc01vZGUgJnBhcmFtcyk7Ci1jb25zdCB2b2lkKiBsb2NfZW5nX2dldF9leHRlbnNpb24obG9jX2VuZ19kYXRhX3NfdHlwZSAmbG9jX2VuZ19kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG5hbWUpOwotdm9pZCBsb2NfZW5nX2FncHNfaW5pdChsb2NfZW5nX2RhdGFfc190eXBlICZsb2NfZW5nX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgIEFHcHNFeHRDYWxsYmFja3MqIGNhbGxiYWNrcyk7Ci1pbnQgIGxvY19lbmdfYWdwc19vcGVuKGxvY19lbmdfZGF0YV9zX3R5cGUgJmxvY19lbmdfZGF0YSwgQUdwc0V4dFR5cGUgYWdwc1R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYXBuLCBBR3BzQmVhcmVyVHlwZSBiZWFyZXJUeXBlKTsKLWludCAgbG9jX2VuZ19hZ3BzX2Nsb3NlZChsb2NfZW5nX2RhdGFfc190eXBlICZsb2NfZW5nX2RhdGEsIEFHcHNFeHRUeXBlIGFncHNUeXBlKTsKLWludCAgbG9jX2VuZ19hZ3BzX29wZW5fZmFpbGVkKGxvY19lbmdfZGF0YV9zX3R5cGUgJmxvY19lbmdfZGF0YSwgQUdwc0V4dFR5cGUgYWdwc1R5cGUpOwotCi1pbnQgIGxvY19lbmdfc2V0X3NlcnZlcl9wcm94eShsb2NfZW5nX2RhdGFfc190eXBlICZsb2NfZW5nX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NTZXJ2ZXJUeXBlIHR5cGUsIGNvbnN0IGNoYXIgKmhvc3RuYW1lLCBpbnQgcG9ydCk7Ci0KLQotdm9pZCBsb2NfZW5nX2FncHNfcmlsX3VwZGF0ZV9uZXR3b3JrX2F2YWlsYWJpbGl0eShsb2NfZW5nX2RhdGFfc190eXBlICZsb2NfZW5nX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhdmFpYWJsZSwgY29uc3QgY2hhciogYXBuKTsKLQotCi1ib29sIGxvY19lbmdfaW5qZWN0X3Jhd19jb21tYW5kKGxvY19lbmdfZGF0YV9zX3R5cGUgJmxvY19lbmdfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogY29tbWFuZCwgaW50IGxlbmd0aCk7Ci0KLQotdm9pZCBsb2NfZW5nX211dGVfb25lX3Nlc3Npb24obG9jX2VuZ19kYXRhX3NfdHlwZSAmbG9jX2VuZ19kYXRhKTsKLQotaW50IGxvY19lbmdfeHRyYV9pbml0IChsb2NfZW5nX2RhdGFfc190eXBlICZsb2NfZW5nX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgIEdwc1h0cmFFeHRDYWxsYmFja3MqIGNhbGxiYWNrcyk7Ci0KLWludCBsb2NfZW5nX3h0cmFfaW5qZWN0X2RhdGEobG9jX2VuZ19kYXRhX3NfdHlwZSAmbG9jX2VuZ19kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiBkYXRhLCBpbnQgbGVuZ3RoKTsKLQotaW50IGxvY19lbmdfeHRyYV9yZXF1ZXN0X3NlcnZlcihsb2NfZW5nX2RhdGFfc190eXBlICZsb2NfZW5nX2RhdGEpOwotCi1leHRlcm4gdm9pZCBsb2NfZW5nX25pX2luaXQobG9jX2VuZ19kYXRhX3NfdHlwZSAmbG9jX2VuZ19kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdwc05pRXh0Q2FsbGJhY2tzICpjYWxsYmFja3MpOwotZXh0ZXJuIHZvaWQgbG9jX2VuZ19uaV9yZXNwb25kKGxvY19lbmdfZGF0YV9zX3R5cGUgJmxvY19lbmdfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbm90aWZfaWQsIEdwc1VzZXJSZXNwb25zZVR5cGUgdXNlcl9yZXNwb25zZSk7Ci1leHRlcm4gdm9pZCBsb2NfZW5nX25pX3JlcXVlc3RfaGFuZGxlcihsb2NfZW5nX2RhdGFfc190eXBlICZsb2NfZW5nX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdwc05pTm90aWZpY2F0aW9uICpub3RpZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogcGFzc1Rocm91Z2gpOwotZXh0ZXJuIHZvaWQgbG9jX2VuZ19uaV9yZXNldF9vbl9lbmdpbmVfcmVzdGFydChsb2NfZW5nX2RhdGFfc190eXBlICZsb2NfZW5nX2RhdGEpOwotCi1pbnQgbG9jX2VuZ19yZWFkX2NvbmZpZyh2b2lkKTsKLQotaW50IGxvY19lbmdfYWdwc19pbnN0YWxsX2NlcnRpZmljYXRlcyhsb2NfZW5nX2RhdGFfc190eXBlICZsb2NfZW5nX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlckVuY29kZWRDZXJ0aWZpY2F0ZSogY2VydGlmaWNhdGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuZ3RoKTsKLQotdm9pZCBsb2NfZW5nX2NvbmZpZ3VyYXRpb25fdXBkYXRlIChsb2NfZW5nX2RhdGFfc190eXBlICZsb2NfZW5nX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNvbmZpZ19kYXRhLCBpbnQzMl90IGxlbmd0aCk7Ci1pbnQgbG9jX2VuZ19ncHNfbWVhc3VyZW1lbnRfaW5pdChsb2NfZW5nX2RhdGFfc190eXBlICZsb2NfZW5nX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcHNNZWFzdXJlbWVudENhbGxiYWNrcyogY2FsbGJhY2tzKTsKLXZvaWQgbG9jX2VuZ19ncHNfbWVhc3VyZW1lbnRfY2xvc2UobG9jX2VuZ19kYXRhX3NfdHlwZSAmbG9jX2VuZ19kYXRhKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotI2VuZGlmIC8vIExPQ19FTkdfSApkaWZmIC0tZ2l0IGEvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGlfNTAwMDEvbG9jX2VuZ19hZ3BzLmNwcCBiL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpXzUwMDAxL2xvY19lbmdfYWdwcy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5MGQ1ZDMuLjAwMDAwMDAKLS0tIGEvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGlfNTAwMDEvbG9jX2VuZ19hZ3BzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDk3MSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxMywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKLSAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAotICogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiwgbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKLSAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAotICogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKLSAqIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KLSAqIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jZGVmaW5lIExPR19ORERFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiTG9jU3ZjX2VuZyIKLQotI2luY2x1ZGUgPGxvY19lbmdfYWdwcy5oPgotI2luY2x1ZGUgPGxvY19lbmdfbG9nLmg+Ci0jaW5jbHVkZSA8bG9nX3V0aWwuaD4KLSNpbmNsdWRlIDxwbGF0Zm9ybV9saWJfaW5jbHVkZXMuaD4KLSNpbmNsdWRlIDxsb2NfZW5nX2Rtbl9jb25uX2hhbmRsZXIuaD4KLSNpbmNsdWRlIDxsb2NfZW5nX2Rtbl9jb25uLmg+Ci0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLQotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBDIGNhbGxiYWNrcwotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLS8vIFRoaXMgaXMgZ2l2ZW4gdG8gbGlua2VkX2xpc3RfYWRkIGFzIHRoZSBkZWFsbG9jIGNhbGxiYWNrCi0vLyBkYXRhIC0tIGFuIGluc3RhbmNlIG9mIFN1YnNjcmliZXIKLXN0YXRpYyB2b2lkIGRlbGV0ZU9iaih2b2lkKiBkYXRhKQotewotICAgIGRlbGV0ZSAoU3Vic2NyaWJlciopZGF0YTsKLX0KLQotLy8gVGhpcyBpcyBnaXZlbiB0byBsaW5rZWRfbGlzdF9zZWFyY2goKSBhcyB0aGUgY29tcGFyaXNvbiBjYWxsYmFjawotLy8gd2hlbiB0aGUgc3RhdGUgbWFuY2hpbmUgbmVlZHMgdG8gcHJvY2VzcyBmb3IgcGFydGljdWxhciBzdWJzY3JpYmVyCi0vLyBmcm9tQ2FsbGVyIC0tIGNhbGxlciBwcm92aWRlcyB0aGlzIG9iagotLy8gZnJvbUxpc3QgLS0gbGlua2VkX2xpc3Rfc2VhcmNoKCkgZnVuY3Rpb24gdGFrZSB0aGlzIG9uZSBmcm9tIGxpc3QKLXN0YXRpYyBib29sIGhhc1N1YnNjcmliZXIodm9pZCogZnJvbUNhbGxlciwgdm9pZCogZnJvbUxpc3QpCi17Ci0gICAgTm90aWZpY2F0aW9uKiBub3RpZmljYXRpb24gPSAoTm90aWZpY2F0aW9uKilmcm9tQ2FsbGVyOwotICAgIFN1YnNjcmliZXIqIHMxID0gKFN1YnNjcmliZXIqKWZyb21MaXN0OwotCi0gICAgcmV0dXJuIHMxLT5mb3JNZSgqbm90aWZpY2F0aW9uKTsKLX0KLQotLy8gVGhpcyBpcyBndmllbiB0byBsaW5rZWRfbGlzdF9zZWFyY2goKSB0byBub3RpZnkgc3Vic2NyaWJlciBvYmpzCi0vLyB3aGVuIHRoZSBzdGF0ZSBtYWNoaW5lIG5lZWRzIHRvIGluZm9ybSBhbGwgc3Vic2NyaWJlcnMgb2YgcmVzb3VyY2UKLS8vIHN0YXR1cyBjaGFuZ2VzLCBlLmcuIHdoZW4gcmVzb3VyY2UgaXMgR1JBTlRFRC4KLS8vIGZyb21DYWxsZXIgLS0gY2FsbGVyIHByb3ZpZGVzIHRoaXMgcHRyIHRvIGEgTm90aWZpY2F0aW9uIG9iai4KLS8vIGZyb21MaXN0IC0tIGxpbmtlZF9saXN0X3NlYXJjaCgpIGZ1bmN0aW9uIHRha2UgdGhpcyBvbmUgZnJvbSBsaXN0Ci1zdGF0aWMgYm9vbCBub3RpZnlTdWJzY3JpYmVyKHZvaWQqIGZyb21DYWxsZXIsIHZvaWQqIGZyb21MaXN0KQotewotICAgIE5vdGlmaWNhdGlvbiogbm90aWZpY2F0aW9uID0gKE5vdGlmaWNhdGlvbiopZnJvbUNhbGxlcjsKLSAgICBTdWJzY3JpYmVyKiBzMSA9IChTdWJzY3JpYmVyKilmcm9tTGlzdDsKLQotICAgIC8vIHdlIG5vdGlmeSBldmVyeSBzdWJzY3JpYmVyIGluZGlzY3JpbWluYXRpdmVseQotICAgIC8vIGVhY2ggc3Vic2NyaWJlciBkZWNpZGVzIGlmIHRoaXMgbm90aWZpY2F0aW9uIGlzIGludGVyZXN0aW5nLgotICAgIHJldHVybiBzMS0+bm90aWZ5UnNyY1N0YXR1cygqbm90aWZpY2F0aW9uKSAmJgotICAgICAgICAgICAvLyBpZiB3ZSBkbyBub3Qgd2FudCB0byBkZWxldGUgdGhlIHN1YnNjcmliZXIgZnJvbSB0aGUKLSAgICAgICAgICAgLy8gdGhlIGxpc3QsIHdlIG11c3Qgc2V0IHRoaXMgdG8gZmFsc2Ugc28gdGhpcyBmdW5jdGlvbgotICAgICAgICAgICAvLyByZXR1cm5zIGZhbHNlCi0gICAgICAgICAgIG5vdGlmaWNhdGlvbi0+cG9zdE5vdGlmeURlbGV0ZTsKLX0KLQotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBOb3RpZmljYXRpb24KLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotY29uc3QgaW50IE5vdGlmaWNhdGlvbjo6QlJPQURDQVNUX0FMTCA9IDB4ODAwMDAwMDA7Ci1jb25zdCBpbnQgTm90aWZpY2F0aW9uOjpCUk9BRENBU1RfQUNUSVZFID0gMHg4MDAwMDAwMTsKLWNvbnN0IGludCBOb3RpZmljYXRpb246OkJST0FEQ0FTVF9JTkFDVElWRSA9IDB4ODAwMDAwMDI7Ci1jb25zdCB1bnNpZ25lZCBjaGFyIERTU3RhdGVNYWNoaW5lOjpNQVhfU1RBUlRfREFUQV9DQUxMX1JFVFJJRVMgPSA0OwotY29uc3QgdW5zaWduZWQgaW50IERTU3RhdGVNYWNoaW5lOjpEQVRBX0NBTExfUkVUUllfREVMQVlfTVNFQyA9IDUwMDsKLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gU3Vic2NyaWJlcjogIEJJVFN1YnNjcmliZXIgLyBBVExTdWJzY3JpYmVyIC8gV0lGSVN1YnNjcmliZXIKLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotYm9vbCBTdWJzY3JpYmVyOjpmb3JNZShOb3RpZmljYXRpb24gJm5vdGlmaWNhdGlvbikKLXsKLSAgICBpZiAoTlVMTCAhPSBub3RpZmljYXRpb24ucmN2ZXIpIHsKLSAgICAgICAgcmV0dXJuIGVxdWFscyhub3RpZmljYXRpb24ucmN2ZXIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBOb3RpZmljYXRpb246OkJST0FEQ0FTVF9BTEwgPT0gbm90aWZpY2F0aW9uLmdyb3VwSUQgfHwKLSAgICAgICAgICAgIChOb3RpZmljYXRpb246OkJST0FEQ0FTVF9BQ1RJVkUgPT0gbm90aWZpY2F0aW9uLmdyb3VwSUQgJiYKLSAgICAgICAgICAgICAhaXNJbmFjdGl2ZSgpKSB8fAotICAgICAgICAgICAgKE5vdGlmaWNhdGlvbjo6QlJPQURDQVNUX0lOQUNUSVZFID09IG5vdGlmaWNhdGlvbi5ncm91cElEICYmCi0gICAgICAgICAgICAgaXNJbmFjdGl2ZSgpKTsKLSAgICB9Ci19Ci1ib29sIEJJVFN1YnNjcmliZXI6OmVxdWFscyhjb25zdCBTdWJzY3JpYmVyICpzKSBjb25zdAotewotICAgIEJJVFN1YnNjcmliZXIqIGJpdFMgPSAoQklUU3Vic2NyaWJlciopczsKLQotICAgIHJldHVybiAoSUQgPT0gYml0Uy0+SUQgJiYKLSAgICAgICAgICAgIChJTkFERFJfTk9ORSAhPSAodW5zaWduZWQgaW50KUlEIHx8Ci0gICAgICAgICAgICAgMCA9PSBzdHJuY21wKG1JUHY2QWRkciwgYml0Uy0+bUlQdjZBZGRyLCBzaXplb2YobUlQdjZBZGRyKSkpKTsKLX0KLQotYm9vbCBCSVRTdWJzY3JpYmVyOjpub3RpZnlSc3JjU3RhdHVzKE5vdGlmaWNhdGlvbiAmbm90aWZpY2F0aW9uKQotewotICAgIGJvb2wgbm90aWZ5ID0gZm9yTWUobm90aWZpY2F0aW9uKTsKLQotICAgIGlmIChub3RpZnkpIHsKLSAgICAgICAgc3dpdGNoKG5vdGlmaWNhdGlvbi5yc3JjU3RhdHVzKQotICAgICAgICB7Ci0gICAgICAgIGNhc2UgUlNSQ19VTlNVQlNDUklCRToKLSAgICAgICAgY2FzZSBSU1JDX1JFTEVBU0VEOgotICAgICAgICAgICAgbG9jX2VuZ19kbW5fY29ubl9sb2NfYXBpX3NlcnZlcl9kYXRhX2Nvbm4oCi0gICAgICAgICAgICAgICAgTE9DX0VOR19JRl9SRVFVRVNUX1NFTkRFUl9JRF9HUFNPTkVfREFFTU9OLAotICAgICAgICAgICAgICAgIEdQU09ORV9MT0NfQVBJX0lGX1JFTEVBU0VfU1VDQ0VTUyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBSU1JDX0RFTklFRDoKLSAgICAgICAgICAgIGxvY19lbmdfZG1uX2Nvbm5fbG9jX2FwaV9zZXJ2ZXJfZGF0YV9jb25uKAotICAgICAgICAgICAgICAgIExPQ19FTkdfSUZfUkVRVUVTVF9TRU5ERVJfSURfR1BTT05FX0RBRU1PTiwKLSAgICAgICAgICAgICAgICBHUFNPTkVfTE9DX0FQSV9JRl9GQUlMVVJFKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFJTUkNfR1JBTlRFRDoKLSAgICAgICAgICAgIGxvY19lbmdfZG1uX2Nvbm5fbG9jX2FwaV9zZXJ2ZXJfZGF0YV9jb25uKAotICAgICAgICAgICAgICAgIExPQ19FTkdfSUZfUkVRVUVTVF9TRU5ERVJfSURfR1BTT05FX0RBRU1PTiwKLSAgICAgICAgICAgICAgICBHUFNPTkVfTE9DX0FQSV9JRl9SRVFVRVNUX1NVQ0NFU1MpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBub3RpZnkgPSBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBub3RpZnk7Ci19Ci0KLWJvb2wgQVRMU3Vic2NyaWJlcjo6bm90aWZ5UnNyY1N0YXR1cyhOb3RpZmljYXRpb24gJm5vdGlmaWNhdGlvbikKLXsKLSAgICBib29sIG5vdGlmeSA9IGZvck1lKG5vdGlmaWNhdGlvbik7Ci0KLSAgICBpZiAobm90aWZ5KSB7Ci0gICAgICAgIHN3aXRjaChub3RpZmljYXRpb24ucnNyY1N0YXR1cykKLSAgICAgICAgewotICAgICAgICBjYXNlIFJTUkNfVU5TVUJTQ1JJQkU6Ci0gICAgICAgIGNhc2UgUlNSQ19SRUxFQVNFRDoKLSAgICAgICAgICAgICgoTG9jRW5nQWRhcHRlciopbUxvY0FkYXB0ZXIpLT5hdGxDbG9zZVN0YXR1cyhJRCwgMSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBSU1JDX0RFTklFRDoKLSAgICAgICAgewotICAgICAgICAgICAgQUdwc0V4dFR5cGUgdHlwZSA9IG1CYWNrd2FyZENvbXBhdGlibGVNb2RlID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFHUFNfVFlQRV9JTlZBTElEIDogbVN0YXRlTWFjaGluZS0+Z2V0VHlwZSgpOwotICAgICAgICAgICAgKChMb2NFbmdBZGFwdGVyKiltTG9jQWRhcHRlciktPmF0bE9wZW5TdGF0dXMoSUQsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyKiltU3RhdGVNYWNoaW5lLT5nZXRBUE4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXRlTWFjaGluZS0+Z2V0QmVhcmVyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUpOwotICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBSU1JDX0dSQU5URUQ6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIEFHcHNFeHRUeXBlIHR5cGUgPSBtQmFja3dhcmRDb21wYXRpYmxlTW9kZSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBR1BTX1RZUEVfSU5WQUxJRCA6IG1TdGF0ZU1hY2hpbmUtPmdldFR5cGUoKTsKLSAgICAgICAgICAgICgoTG9jRW5nQWRhcHRlciopbUxvY0FkYXB0ZXIpLT5hdGxPcGVuU3RhdHVzKElELCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciopbVN0YXRlTWFjaGluZS0+Z2V0QVBOKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdGF0ZU1hY2hpbmUtPmdldEJlYXJlcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlKTsKLSAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBub3RpZnkgPSBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBub3RpZnk7Ci19Ci0KLWJvb2wgV0lGSVN1YnNjcmliZXI6Om5vdGlmeVJzcmNTdGF0dXMoTm90aWZpY2F0aW9uICZub3RpZmljYXRpb24pCi17Ci0gICAgYm9vbCBub3RpZnkgPSBmb3JNZShub3RpZmljYXRpb24pOwotCi0gICAgaWYgKG5vdGlmeSkgewotICAgICAgICBzd2l0Y2gobm90aWZpY2F0aW9uLnJzcmNTdGF0dXMpCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSBSU1JDX1VOU1VCU0NSSUJFOgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUlNSQ19SRUxFQVNFRDoKLSAgICAgICAgICAgIGxvY19lbmdfZG1uX2Nvbm5fbG9jX2FwaV9zZXJ2ZXJfZGF0YV9jb25uKAotICAgICAgICAgICAgICAgIHNlbmRlcklkLAotICAgICAgICAgICAgICAgIEdQU09ORV9MT0NfQVBJX0lGX1JFTEVBU0VfU1VDQ0VTUyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBSU1JDX0RFTklFRDoKLSAgICAgICAgICAgIGxvY19lbmdfZG1uX2Nvbm5fbG9jX2FwaV9zZXJ2ZXJfZGF0YV9jb25uKAotICAgICAgICAgICAgICAgIHNlbmRlcklkLAotICAgICAgICAgICAgICAgIEdQU09ORV9MT0NfQVBJX0lGX0ZBSUxVUkUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUlNSQ19HUkFOVEVEOgotICAgICAgICAgICAgbG9jX2VuZ19kbW5fY29ubl9sb2NfYXBpX3NlcnZlcl9kYXRhX2Nvbm4oCi0gICAgICAgICAgICAgICAgc2VuZGVySWQsCi0gICAgICAgICAgICAgICAgR1BTT05FX0xPQ19BUElfSUZfUkVRVUVTVF9TVUNDRVNTKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgbm90aWZ5ID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gbm90aWZ5OwotfQotYm9vbCBEU1N1YnNjcmliZXI6Om5vdGlmeVJzcmNTdGF0dXMoTm90aWZpY2F0aW9uICZub3RpZmljYXRpb24pCi17Ci0gICAgYm9vbCBub3RpZnkgPSBmb3JNZShub3RpZmljYXRpb24pOwotICAgIExPQ19MT0dEKCJEU1N1YnNjcmliZXI6Om5vdGlmeVJzcmNTdGF0dXMuIG5vdGlmeTolZCBcbiIsKGludCkobm90aWZ5KSk7Ci0gICAgaWYobm90aWZ5KSB7Ci0gICAgICAgIHN3aXRjaChub3RpZmljYXRpb24ucnNyY1N0YXR1cykgewotICAgICAgICBjYXNlIFJTUkNfVU5TVUJTQ1JJQkU6Ci0gICAgICAgIGNhc2UgUlNSQ19SRUxFQVNFRDoKLSAgICAgICAgY2FzZSBSU1JDX0RFTklFRDoKLSAgICAgICAgY2FzZSBSU1JDX0dSQU5URUQ6Ci0gICAgICAgICAgICAoKERTU3RhdGVNYWNoaW5lICopbVN0YXRlTWFjaGluZSktPmluZm9ybVN0YXR1cyhub3RpZmljYXRpb24ucnNyY1N0YXR1cywgSUQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBub3RpZnkgPSBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbm90aWZ5OwotfQotdm9pZCBEU1N1YnNjcmliZXIgOjogc2V0SW5hY3RpdmUoKQotewotICAgIG1Jc0luYWN0aXZlID0gdHJ1ZTsKLSAgICAoKERTU3RhdGVNYWNoaW5lICopbVN0YXRlTWFjaGluZSktPmluZm9ybVN0YXR1cyhSU1JDX1VOU1VCU0NSSUJFLCBJRCk7Ci19Ci0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIEFncHNTdGF0ZTogIEFncHNSZWxlYXNlZFN0YXRlIC8gQWdwc1BlbmRpbmdTdGF0ZSAvIEFncHNBY3F1aXJlZFN0YXRlCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotLy8gQWdwc1JlbGVhc2VkU3RhdGUKLWNsYXNzIEFncHNSZWxlYXNlZFN0YXRlIDogcHVibGljIEFncHNTdGF0ZQotewotICAgIGZyaWVuZCBjbGFzcyBBZ3BzU3RhdGVNYWNoaW5lOwotCi0gICAgaW5saW5lIEFncHNSZWxlYXNlZFN0YXRlKEFncHNTdGF0ZU1hY2hpbmUqIHN0YXRlTWFjaGluZSkgOgotICAgICAgICBBZ3BzU3RhdGUoc3RhdGVNYWNoaW5lKQotICAgIHsgbVJlbGVhc2VkU3RhdGUgPSB0aGlzOyB9Ci0KLSAgICBpbmxpbmUgfkFncHNSZWxlYXNlZFN0YXRlKCkge30KLXB1YmxpYzoKLSAgICB2aXJ0dWFsIEFncHNTdGF0ZSogb25Sc3JjRXZlbnQoQWdwc1JzcmNTdGF0dXMgZXZlbnQsIHZvaWQqIGRhdGEpOwotICAgIGlubGluZSB2aXJ0dWFsIGNoYXIqIHdob2FtaSgpIHtyZXR1cm4gKGNoYXIqKSJBZ3BzUmVsZWFzZWRTdGF0ZSI7fQotfTsKLQotQWdwc1N0YXRlKiBBZ3BzUmVsZWFzZWRTdGF0ZTo6b25Sc3JjRXZlbnQoQWdwc1JzcmNTdGF0dXMgZXZlbnQsIHZvaWQqIGRhdGEpCi17Ci0gICAgTE9DX0xPR0QoIkFncHNSZWxlYXNlZFN0YXRlOjpvblJzcmNFdmVudDsgZXZlbnQ6JWRcbiIsIChpbnQpZXZlbnQpOwotICAgIGlmIChtU3RhdGVNYWNoaW5lLT5oYXNTdWJzY3JpYmVycygpKSB7Ci0gICAgICAgIExPQ19MT0dFKCJFcnJvcjogJXMgc3Vic2NyaWJlciBsaXN0IG5vdCBlbXB0eSEhISIsIHdob2FtaSgpKTsKLSAgICAgICAgLy8gSSBkb24ndCBrbm93IGhvdyB0byByZWNvdmVyIGZyb20gaXQuICBJIGFtIGFkZGluZyB0aGlzIHJhdGhlcgotICAgICAgICAvLyBmb3IgZGVidWdnaW5nIHB1cnBvc2UuCi0gICAgfQotCi0gICAgQWdwc1N0YXRlKiBuZXh0U3RhdGUgPSB0aGlzOwotICAgIHN3aXRjaCAoZXZlbnQpCi0gICAgewotICAgIGNhc2UgUlNSQ19TVUJTQ1JJQkU6Ci0gICAgewotICAgICAgICAvLyBubyBub3RpZmljYXRpb24gdW50aWwgd2UgZ2V0IFJTUkNfR1JBTlRFRAotICAgICAgICAvLyBidXQgd2UgbmVlZCB0byBhZGQgc3Vic2NyaWJlciB0byB0aGUgbGlzdAotICAgICAgICBtU3RhdGVNYWNoaW5lLT5hZGRTdWJzY3JpYmVyKChTdWJzY3JpYmVyKilkYXRhKTsKLSAgICAgICAgLy8gcmVxdWVzdCBmcm9tIGNvbm5lY2l2aXR5IHNlcnZpY2UgZm9yIE5JRgotICAgICAgICAvL1RoZSBpZiBjb25kaXRpb24gaXMgYWRkZWQgc28gdGhhdCBpZiB0aGUgZGF0YSBjYWxsIHNldHVwIGZhaWxzCi0gICAgICAgIC8vZm9yIERTIFN0YXRlIE1hY2hpbmUsIHdlIHdhbnQgdG8gcmV0cnkgaW4gcmVsZWFzZWQgc3RhdGUuCi0gICAgICAgIC8vZm9yIEFHcHMgU3RhdGUgTWFjaGluZSwgc2VuZFJzcmNSZXF1ZXN0KCkgd2lsbCBhbHdheXMgcmV0dXJuIHN1Y2Nlc3MKLSAgICAgICAgaWYoIW1TdGF0ZU1hY2hpbmUtPnNlbmRSc3JjUmVxdWVzdChHUFNfUkVRVUVTVF9BR1BTX0RBVEFfQ09OTikpIHsKLSAgICAgICAgICAgIC8vIG1vdmUgdGhlIHN0YXRlIHRvIFBFTkRJTkcKLSAgICAgICAgICAgIG5leHRTdGF0ZSA9IG1QZW5kaW5nU3RhdGU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJTUkNfVU5TVUJTQ1JJQkU6Ci0gICAgewotICAgICAgICAvLyB0aGUgbGlzdCBzaG91bGQgcmVhbGx5IGJlIGVtcHR5LCBub3RoaW5nIHRvIHJlbW92ZS4KLSAgICAgICAgLy8gYnV0IHdlIG1pZ2h0IGFzIHdlbGwganVzdCB0ZWxsIHRoZSBjbGllbnQgaXQgaXMKLSAgICAgICAgLy8gdW5zdWJzY3JpYmVkLiAgRmFsc2UgdG9sZXJhbmNlLCByaWdodD8KLSAgICAgICAgU3Vic2NyaWJlciogc3Vic2NyaWJlciA9IChTdWJzY3JpYmVyKikgZGF0YTsKLSAgICAgICAgTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbihzdWJzY3JpYmVyLCBldmVudCwgZmFsc2UpOwotICAgICAgICBzdWJzY3JpYmVyLT5ub3RpZnlSc3JjU3RhdHVzKG5vdGlmaWNhdGlvbik7Ci0gICAgfQotICAgICAgICAvLyBicmVhazsKLSAgICBjYXNlIFJTUkNfR1JBTlRFRDoKLSAgICBjYXNlIFJTUkNfUkVMRUFTRUQ6Ci0gICAgY2FzZSBSU1JDX0RFTklFRDoKLSAgICBkZWZhdWx0OgotICAgICAgICBMT0NfTE9HVygiJXM6IHVucmVjb2duaXplZCBldmVudCAlZCIsIHdob2FtaSgpLCBldmVudCk7Ci0gICAgICAgIC8vIG5vIHN0YXRlIGNoYW5nZS4KLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgTE9DX0xPR0QoIm9uUnNyY0V2ZW50LCBvbGQgc3RhdGUgJXMsIG5ldyBzdGF0ZSAlcywgZXZlbnQgJWQiLAotICAgICAgICAgICAgIHdob2FtaSgpLCBuZXh0U3RhdGUtPndob2FtaSgpLCBldmVudCk7Ci0gICAgcmV0dXJuIG5leHRTdGF0ZTsKLX0KLQotLy8gQWdwc1BlbmRpbmdTdGF0ZQotY2xhc3MgQWdwc1BlbmRpbmdTdGF0ZSA6IHB1YmxpYyBBZ3BzU3RhdGUKLXsKLSAgICBmcmllbmQgY2xhc3MgQWdwc1N0YXRlTWFjaGluZTsKLQotICAgIGlubGluZSBBZ3BzUGVuZGluZ1N0YXRlKEFncHNTdGF0ZU1hY2hpbmUqIHN0YXRlTWFjaGluZSkgOgotICAgICAgICBBZ3BzU3RhdGUoc3RhdGVNYWNoaW5lKQotICAgIHsgbVBlbmRpbmdTdGF0ZSA9IHRoaXM7IH0KLQotICAgIGlubGluZSB+QWdwc1BlbmRpbmdTdGF0ZSgpIHt9Ci1wdWJsaWM6Ci0gICAgdmlydHVhbCBBZ3BzU3RhdGUqIG9uUnNyY0V2ZW50KEFncHNSc3JjU3RhdHVzIGV2ZW50LCB2b2lkKiBkYXRhKTsKLSAgICBpbmxpbmUgdmlydHVhbCBjaGFyKiB3aG9hbWkoKSB7cmV0dXJuIChjaGFyKikiQWdwc1BlbmRpbmdTdGF0ZSI7fQotfTsKLQotQWdwc1N0YXRlKiBBZ3BzUGVuZGluZ1N0YXRlOjpvblJzcmNFdmVudChBZ3BzUnNyY1N0YXR1cyBldmVudCwgdm9pZCogZGF0YSkKLXsKLSAgICBBZ3BzU3RhdGUqIG5leHRTdGF0ZSA9IHRoaXM7OwotICAgIExPQ19MT0dEKCJBZ3BzUGVuZGluZ1N0YXRlOjpvblJzcmNFdmVudDsgZXZlbnQ6JWRcbiIsIChpbnQpZXZlbnQpOwotICAgIHN3aXRjaCAoZXZlbnQpCi0gICAgewotICAgIGNhc2UgUlNSQ19TVUJTQ1JJQkU6Ci0gICAgewotICAgICAgICAvLyBhbHJlYWR5IHJlcXVlc3RlZCBmb3IgTklGIHJlc291cmNlLAotICAgICAgICAvLyBkbyBub3RoaW5nIHVudGlsIHdlIGdldCBSU1JDX0dSQU5URUQgaW5kaWNhdGlvbgotICAgICAgICAvLyBidXQgd2UgbmVlZCB0byBhZGQgc3Vic2NyaWJlciB0byB0aGUgbGlzdAotICAgICAgICBtU3RhdGVNYWNoaW5lLT5hZGRTdWJzY3JpYmVyKChTdWJzY3JpYmVyKilkYXRhKTsKLSAgICAgICAgLy8gbm8gc3RhdGUgY2hhbmdlLgotICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJTUkNfVU5TVUJTQ1JJQkU6Ci0gICAgewotICAgICAgICBTdWJzY3JpYmVyKiBzdWJzY3JpYmVyID0gKFN1YnNjcmliZXIqKSBkYXRhOwotICAgICAgICBpZiAoc3Vic2NyaWJlci0+d2FpdEZvckNsb3NlQ29tcGxldGUoKSkgewotICAgICAgICAgICAgc3Vic2NyaWJlci0+c2V0SW5hY3RpdmUoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIGF1dG8gbm90aWZ5IHRoaXMgc3Vic2NyaWJlciBvZiB0aGUgdW5zdWJzY3JpYmUKLSAgICAgICAgICAgIE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24oc3Vic2NyaWJlciwgZXZlbnQsIHRydWUpOwotICAgICAgICAgICAgbVN0YXRlTWFjaGluZS0+bm90aWZ5U3Vic2NyaWJlcnMobm90aWZpY2F0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIG5vdyBjaGVjayBpZiB0aGVyZSBpcyBhbnkgc3Vic2NyaWJlcnMgbGVmdAotICAgICAgICBpZiAoIW1TdGF0ZU1hY2hpbmUtPmhhc1N1YnNjcmliZXJzKCkpIHsKLSAgICAgICAgICAgIC8vIG5vIG1vcmUgc3Vic2NyaWJlcnMsIG1vdmUgdG8gUkVMRUFTRUQgc3RhdGUKLSAgICAgICAgICAgIG5leHRTdGF0ZSA9IG1SZWxlYXNlZFN0YXRlOwotCi0gICAgICAgICAgICAvLyB0ZWxsIGNvbm5lY2l2aXR5IHNlcnZpY2Ugd2UgY2FuIHJlbGVhc2UgTklGCi0gICAgICAgICAgICBtU3RhdGVNYWNoaW5lLT5zZW5kUnNyY1JlcXVlc3QoR1BTX1JFTEVBU0VfQUdQU19EQVRBX0NPTk4pOwotICAgICAgICB9IGVsc2UgaWYgKCFtU3RhdGVNYWNoaW5lLT5oYXNBY3RpdmVTdWJzY3JpYmVycygpKSB7Ci0gICAgICAgICAgICAvLyBvbmx5IGluYWN0aXZlIHN1YnNjcmliZXJzLCBtb3ZlIHRvIFJFTEVBU0lORyBzdGF0ZQotICAgICAgICAgICAgbmV4dFN0YXRlID0gbVJlbGVhc2luZ1N0YXRlOwotCi0gICAgICAgICAgICAvLyB0ZWxsIGNvbm5lY2l2aXR5IHNlcnZpY2Ugd2UgY2FuIHJlbGVhc2UgTklGCi0gICAgICAgICAgICBtU3RhdGVNYWNoaW5lLT5zZW5kUnNyY1JlcXVlc3QoR1BTX1JFTEVBU0VfQUdQU19EQVRBX0NPTk4pOwotICAgICAgICB9Ci0gICAgfQotICAgIGJyZWFrOwotCi0gICAgY2FzZSBSU1JDX0dSQU5URUQ6Ci0gICAgewotICAgICAgICBuZXh0U3RhdGUgPSBtQWNxdWlyZWRTdGF0ZTsKLSAgICAgICAgTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbihOb3RpZmljYXRpb246OkJST0FEQ0FTVF9BQ1RJVkUsIGV2ZW50LCBmYWxzZSk7Ci0gICAgICAgIC8vIG5vdGlmeSBhbGwgc3Vic2NyaWJlcnMgTklGIHJlc291cmNlIEdSQU5URUQKLSAgICAgICAgLy8gYnkgc2V0dGluZyBmYWxzZSwgd2Uga2VlcCBzdWJzY3JpYmVycyBvbiB0aGUgbGlua2VkIGxpc3QKLSAgICAgICAgbVN0YXRlTWFjaGluZS0+bm90aWZ5U3Vic2NyaWJlcnMobm90aWZpY2F0aW9uKTsKLSAgICB9Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSU1JDX1JFTEVBU0VEOgotICAgICAgICAvLyBubyBzdGF0ZSBjaGFuZ2UuCi0gICAgICAgIC8vIHdlIGFyZSBleHBlY3RpbmcgZWl0aGVyIEdSQU5URUQgb3IgREVOSUVELiAgSGFuZGxpbmcgUkVMRUFTRUQKLSAgICAgICAgLy8gbWF5IGxpa2UgYnJlYWsgb3VyIHN0YXRlIG1hY2hpbmUgaW4gcmFjZSBjb25kaXRpb25zLgotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgUlNSQ19ERU5JRUQ6Ci0gICAgewotICAgICAgICBuZXh0U3RhdGUgPSBtUmVsZWFzZWRTdGF0ZTsKLSAgICAgICAgTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbihOb3RpZmljYXRpb246OkJST0FEQ0FTVF9BTEwsIGV2ZW50LCB0cnVlKTsKLSAgICAgICAgLy8gbm90aWZ5IGFsbCBzdWJzY3JpYmVycyBOSUYgcmVzb3VyY2UgUkVMRUFTRUQgb3IgREVOSUVECi0gICAgICAgIC8vIGJ5IHNldHRpbmcgdHJ1ZSwgd2UgcmVtb3ZlIHN1YnNjcmliZXJzIGZyb20gdGhlIGxpbmtlZCBsaXN0Ci0gICAgICAgIG1TdGF0ZU1hY2hpbmUtPm5vdGlmeVN1YnNjcmliZXJzKG5vdGlmaWNhdGlvbik7Ci0gICAgfQotICAgICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAgIExPQ19MT0dFKCIlczogdW5yZWNvZ25pemVkIGV2ZW50ICVkIiwgd2hvYW1pKCksIGV2ZW50KTsKLSAgICAgICAgLy8gbm8gc3RhdGUgY2hhbmdlLgotICAgIH0KLQotICAgIExPQ19MT0dEKCJvblJzcmNFdmVudCwgb2xkIHN0YXRlICVzLCBuZXcgc3RhdGUgJXMsIGV2ZW50ICVkIiwKLSAgICAgICAgICAgICB3aG9hbWkoKSwgbmV4dFN0YXRlLT53aG9hbWkoKSwgZXZlbnQpOwotICAgIHJldHVybiBuZXh0U3RhdGU7Ci19Ci0KLQotY2xhc3MgQWdwc0FjcXVpcmVkU3RhdGUgOiBwdWJsaWMgQWdwc1N0YXRlCi17Ci0gICAgZnJpZW5kIGNsYXNzIEFncHNTdGF0ZU1hY2hpbmU7Ci0KLSAgICBpbmxpbmUgQWdwc0FjcXVpcmVkU3RhdGUoQWdwc1N0YXRlTWFjaGluZSogc3RhdGVNYWNoaW5lKSA6Ci0gICAgICAgIEFncHNTdGF0ZShzdGF0ZU1hY2hpbmUpCi0gICAgeyBtQWNxdWlyZWRTdGF0ZSA9IHRoaXM7IH0KLQotICAgIGlubGluZSB+QWdwc0FjcXVpcmVkU3RhdGUoKSB7fQotcHVibGljOgotICAgIHZpcnR1YWwgQWdwc1N0YXRlKiBvblJzcmNFdmVudChBZ3BzUnNyY1N0YXR1cyBldmVudCwgdm9pZCogZGF0YSk7Ci0gICAgaW5saW5lIHZpcnR1YWwgY2hhciogd2hvYW1pKCkgeyByZXR1cm4gKGNoYXIqKSJBZ3BzQWNxdWlyZWRTdGF0ZSI7IH0KLX07Ci0KLQotQWdwc1N0YXRlKiBBZ3BzQWNxdWlyZWRTdGF0ZTo6b25Sc3JjRXZlbnQoQWdwc1JzcmNTdGF0dXMgZXZlbnQsIHZvaWQqIGRhdGEpCi17Ci0gICAgQWdwc1N0YXRlKiBuZXh0U3RhdGUgPSB0aGlzOwotICAgIExPQ19MT0dEKCJBZ3BzQWNxdWlyZWRTdGF0ZTo6b25Sc3JjRXZlbnQ7IGV2ZW50OiVkXG4iLCAoaW50KWV2ZW50KTsKLSAgICBzd2l0Y2ggKGV2ZW50KQotICAgIHsKLSAgICBjYXNlIFJTUkNfU1VCU0NSSUJFOgotICAgIHsKLSAgICAgICAgLy8gd2UgYWxyZWFkeSBoYXZlIHRoZSBOSUYgcmVzb3VyY2UsIHNpbXBseSBub3RpZnkgc3Vic2NyaWJlcgotICAgICAgICBTdWJzY3JpYmVyKiBzdWJzY3JpYmVyID0gKFN1YnNjcmliZXIqKSBkYXRhOwotICAgICAgICAvLyB3ZSBoYXZlIHJzcmMgaW4gaGFuZCwgc28gZ3JhbnQgaXQgcmlnaHQgYXdheQotICAgICAgICBOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKHN1YnNjcmliZXIsIFJTUkNfR1JBTlRFRCwgZmFsc2UpOwotICAgICAgICBzdWJzY3JpYmVyLT5ub3RpZnlSc3JjU3RhdHVzKG5vdGlmaWNhdGlvbik7Ci0gICAgICAgIC8vIGFkZCBzdWJzY3JpYmVyIHRvIHRoZSBsaXN0Ci0gICAgICAgIG1TdGF0ZU1hY2hpbmUtPmFkZFN1YnNjcmliZXIoc3Vic2NyaWJlcik7Ci0gICAgICAgIC8vIG5vIHN0YXRlIGNoYW5nZS4KLSAgICB9Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSU1JDX1VOU1VCU0NSSUJFOgotICAgIHsKLSAgICAgICAgU3Vic2NyaWJlciogc3Vic2NyaWJlciA9IChTdWJzY3JpYmVyKikgZGF0YTsKLSAgICAgICAgaWYgKHN1YnNjcmliZXItPndhaXRGb3JDbG9zZUNvbXBsZXRlKCkpIHsKLSAgICAgICAgICAgIHN1YnNjcmliZXItPnNldEluYWN0aXZlKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBhdXRvIG5vdGlmeSB0aGlzIHN1YnNjcmliZXIgb2YgdGhlIHVuc3Vic2NyaWJlCi0gICAgICAgICAgICBOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKHN1YnNjcmliZXIsIGV2ZW50LCB0cnVlKTsKLSAgICAgICAgICAgIG1TdGF0ZU1hY2hpbmUtPm5vdGlmeVN1YnNjcmliZXJzKG5vdGlmaWNhdGlvbik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBub3cgY2hlY2sgaWYgdGhlcmUgaXMgYW55IHN1YnNjcmliZXJzIGxlZnQKLSAgICAgICAgaWYgKCFtU3RhdGVNYWNoaW5lLT5oYXNTdWJzY3JpYmVycygpKSB7Ci0gICAgICAgICAgICAvLyBubyBtb3JlIHN1YnNjcmliZXJzLCBtb3ZlIHRvIFJFTEVBU0VEIHN0YXRlCi0gICAgICAgICAgICBuZXh0U3RhdGUgPSBtUmVsZWFzZWRTdGF0ZTsKLQotICAgICAgICAgICAgLy8gdGVsbCBjb25uZWNpdml0eSBzZXJ2aWNlIHdlIGNhbiByZWxlYXNlIE5JRgotICAgICAgICAgICAgbVN0YXRlTWFjaGluZS0+c2VuZFJzcmNSZXF1ZXN0KEdQU19SRUxFQVNFX0FHUFNfREFUQV9DT05OKTsKLSAgICAgICAgfSBlbHNlIGlmICghbVN0YXRlTWFjaGluZS0+aGFzQWN0aXZlU3Vic2NyaWJlcnMoKSkgewotICAgICAgICAgICAgLy8gb25seSBpbmFjdGl2ZSBzdWJzY3JpYmVycywgbW92ZSB0byBSRUxFQVNJTkcgc3RhdGUKLSAgICAgICAgICAgIG5leHRTdGF0ZSA9IG1SZWxlYXNpbmdTdGF0ZTsKLQotICAgICAgICAgICAgLy8gdGVsbCBjb25uZWNpdml0eSBzZXJ2aWNlIHdlIGNhbiByZWxlYXNlIE5JRgotICAgICAgICAgICAgbVN0YXRlTWFjaGluZS0+c2VuZFJzcmNSZXF1ZXN0KEdQU19SRUxFQVNFX0FHUFNfREFUQV9DT05OKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJTUkNfR1JBTlRFRDoKLSAgICAgICAgTE9DX0xPR1coIiVzOiAlZCwgUlNSQ19HUkFOVEVEIGFscmVhZHkgcmVjZWl2ZWQiLCB3aG9hbWkoKSwgZXZlbnQpOwotICAgICAgICAvLyBubyBzdGF0ZSBjaGFuZ2UuCi0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSU1JDX1JFTEVBU0VEOgotICAgIHsKLSAgICAgICAgTE9DX0xPR1coIiVzOiAlZCwgYSBmb3JjZSByc3JjIHJlbGVhc2UiLCB3aG9hbWkoKSwgZXZlbnQpOwotICAgICAgICBuZXh0U3RhdGUgPSBtUmVsZWFzZWRTdGF0ZTsKLSAgICAgICAgTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbihOb3RpZmljYXRpb246OkJST0FEQ0FTVF9BTEwsIGV2ZW50LCB0cnVlKTsKLSAgICAgICAgLy8gYnkgc2V0dGluZyB0cnVlLCB3ZSByZW1vdmUgc3Vic2NyaWJlcnMgZnJvbSB0aGUgbGlua2VkIGxpc3QKLSAgICAgICAgbVN0YXRlTWFjaGluZS0+bm90aWZ5U3Vic2NyaWJlcnMobm90aWZpY2F0aW9uKTsKLSAgICB9Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSU1JDX0RFTklFRDoKLSAgICAgICAgLy8gbm8gc3RhdGUgY2hhbmdlLgotICAgICAgICAvLyB3ZSBhcmUgZXhwZWN0aW5nIFJFTEVBU0VELiAgSGFuZGxpbmcgREVOSUVECi0gICAgICAgIC8vIG1heSBsaWtlIGJyZWFrIG91ciBzdGF0ZSBtYWNoaW5lIGluIHJhY2UgY29uZGl0aW9ucy4KLSAgICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgICBMT0NfTE9HRSgiJXM6IHVucmVjb2duaXplZCBldmVudCAlZCIsIHdob2FtaSgpLCBldmVudCk7Ci0gICAgICAgIC8vIG5vIHN0YXRlIGNoYW5nZS4KLSAgICB9Ci0KLSAgICBMT0NfTE9HRCgib25Sc3JjRXZlbnQsIG9sZCBzdGF0ZSAlcywgbmV3IHN0YXRlICVzLCBldmVudCAlZCIsCi0gICAgICAgICAgICAgd2hvYW1pKCksIG5leHRTdGF0ZS0+d2hvYW1pKCksIGV2ZW50KTsKLSAgICByZXR1cm4gbmV4dFN0YXRlOwotfQotCi0vLyBBZ3BzUGVuZGluZ1N0YXRlCi1jbGFzcyBBZ3BzUmVsZWFzaW5nU3RhdGUgOiBwdWJsaWMgQWdwc1N0YXRlCi17Ci0gICAgZnJpZW5kIGNsYXNzIEFncHNTdGF0ZU1hY2hpbmU7Ci0KLSAgICBpbmxpbmUgQWdwc1JlbGVhc2luZ1N0YXRlKEFncHNTdGF0ZU1hY2hpbmUqIHN0YXRlTWFjaGluZSkgOgotICAgICAgICBBZ3BzU3RhdGUoc3RhdGVNYWNoaW5lKQotICAgIHsgbVJlbGVhc2luZ1N0YXRlID0gdGhpczsgfQotCi0gICAgaW5saW5lIH5BZ3BzUmVsZWFzaW5nU3RhdGUoKSB7fQotcHVibGljOgotICAgIHZpcnR1YWwgQWdwc1N0YXRlKiBvblJzcmNFdmVudChBZ3BzUnNyY1N0YXR1cyBldmVudCwgdm9pZCogZGF0YSk7Ci0gICAgaW5saW5lIHZpcnR1YWwgY2hhciogd2hvYW1pKCkge3JldHVybiAoY2hhciopIkFncHNSZWxlYXNpbmdTdGF0ZSI7fQotfTsKLQotQWdwc1N0YXRlKiBBZ3BzUmVsZWFzaW5nU3RhdGU6Om9uUnNyY0V2ZW50KEFncHNSc3JjU3RhdHVzIGV2ZW50LCB2b2lkKiBkYXRhKQotewotICAgIEFncHNTdGF0ZSogbmV4dFN0YXRlID0gdGhpczs7Ci0gICAgTE9DX0xPR0QoIkFncHNSZWxlYXNpbmdTdGF0ZTo6b25Sc3JjRXZlbnQ7IGV2ZW50OiVkXG4iLCAoaW50KWV2ZW50KTsKLQotICAgc3dpdGNoIChldmVudCkKLSAgICB7Ci0gICAgY2FzZSBSU1JDX1NVQlNDUklCRToKLSAgICB7Ci0gICAgICAgIC8vIGFscmVhZHkgcmVxdWVzdGVkIGZvciBOSUYgcmVzb3VyY2UsCi0gICAgICAgIC8vIGRvIG5vdGhpbmcgdW50aWwgd2UgZ2V0IFJTUkNfR1JBTlRFRCBpbmRpY2F0aW9uCi0gICAgICAgIC8vIGJ1dCB3ZSBuZWVkIHRvIGFkZCBzdWJzY3JpYmVyIHRvIHRoZSBsaXN0Ci0gICAgICAgIG1TdGF0ZU1hY2hpbmUtPmFkZFN1YnNjcmliZXIoKFN1YnNjcmliZXIqKWRhdGEpOwotICAgICAgICAvLyBubyBzdGF0ZSBjaGFuZ2UuCi0gICAgfQotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgUlNSQ19VTlNVQlNDUklCRToKLSAgICB7Ci0gICAgICAgIFN1YnNjcmliZXIqIHN1YnNjcmliZXIgPSAoU3Vic2NyaWJlciopIGRhdGE7Ci0gICAgICAgIGlmIChzdWJzY3JpYmVyLT53YWl0Rm9yQ2xvc2VDb21wbGV0ZSgpKSB7Ci0gICAgICAgICAgICBzdWJzY3JpYmVyLT5zZXRJbmFjdGl2ZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gYXV0byBub3RpZnkgdGhpcyBzdWJzY3JpYmVyIG9mIHRoZSB1bnN1YnNjcmliZQotICAgICAgICAgICAgTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbihzdWJzY3JpYmVyLCBldmVudCwgdHJ1ZSk7Ci0gICAgICAgICAgICBtU3RhdGVNYWNoaW5lLT5ub3RpZnlTdWJzY3JpYmVycyhub3RpZmljYXRpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gbm93IGNoZWNrIGlmIHRoZXJlIGlzIGFueSBzdWJzY3JpYmVycyBsZWZ0Ci0gICAgICAgIGlmICghbVN0YXRlTWFjaGluZS0+aGFzU3Vic2NyaWJlcnMoKSkgewotICAgICAgICAgICAgLy8gbm8gbW9yZSBzdWJzY3JpYmVycywgbW92ZSB0byBSRUxFQVNFRCBzdGF0ZQotICAgICAgICAgICAgbmV4dFN0YXRlID0gbVJlbGVhc2VkU3RhdGU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSU1JDX0RFTklFRDoKLSAgICAgICAgLy8gQSByYWNlIGNvbmRpdGlvbiBzdWJzY3JpYmVyIHVuc3Vic2NyaWJlcyBiZWZvcmUgQUZXIGRlbmllcyByZXNvdXJjZS4KLSAgICBjYXNlIFJTUkNfUkVMRUFTRUQ6Ci0gICAgewotICAgICAgICBuZXh0U3RhdGUgPSBtQWNxdWlyZWRTdGF0ZTsKLSAgICAgICAgTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbihOb3RpZmljYXRpb246OkJST0FEQ0FTVF9JTkFDVElWRSwgZXZlbnQsIHRydWUpOwotICAgICAgICAvLyBub3RpZnkgYWxsIHN1YnNjcmliZXJzIHRoYXQgYXJlIGFjdGl2ZSBOSUYgcmVzb3VyY2UgUkVMRUFTRQotICAgICAgICAvLyBieSBzZXR0aW5nIGZhbHNlLCB3ZSBrZWVwIHN1YnNjcmliZXJzIG9uIHRoZSBsaW5rZWQgbGlzdAotICAgICAgICBtU3RhdGVNYWNoaW5lLT5ub3RpZnlTdWJzY3JpYmVycyhub3RpZmljYXRpb24pOwotCi0gICAgICAgIGlmIChtU3RhdGVNYWNoaW5lLT5oYXNBY3RpdmVTdWJzY3JpYmVycygpKSB7Ci0gICAgICAgICAgICBuZXh0U3RhdGUgPSBtUGVuZGluZ1N0YXRlOwotICAgICAgICAgICAgLy8gcmVxdWVzdCBmcm9tIGNvbm5lY2l2aXR5IHNlcnZpY2UgZm9yIE5JRgotICAgICAgICAgICAgbVN0YXRlTWFjaGluZS0+c2VuZFJzcmNSZXF1ZXN0KEdQU19SRVFVRVNUX0FHUFNfREFUQV9DT05OKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG5leHRTdGF0ZSA9IG1SZWxlYXNlZFN0YXRlOwotICAgICAgICB9Ci0gICAgfQotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgUlNSQ19HUkFOVEVEOgotICAgIGRlZmF1bHQ6Ci0gICAgICAgIExPQ19MT0dFKCIlczogdW5yZWNvZ25pemVkIGV2ZW50ICVkIiwgd2hvYW1pKCksIGV2ZW50KTsKLSAgICAgICAgLy8gbm8gc3RhdGUgY2hhbmdlLgotICAgIH0KLQotICAgIExPQ19MT0dEKCJvblJzcmNFdmVudCwgb2xkIHN0YXRlICVzLCBuZXcgc3RhdGUgJXMsIGV2ZW50ICVkIiwKLSAgICAgICAgICAgICB3aG9hbWkoKSwgbmV4dFN0YXRlLT53aG9hbWkoKSwgZXZlbnQpOwotICAgIHJldHVybiBuZXh0U3RhdGU7Ci19Ci0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vU2VydmljZXIKLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotU2VydmljZXIqIFNlcnZpY2VyIDo6IGdldFNlcnZpY2VyKHNlcnZpY2VyVHlwZSB0eXBlLCB2b2lkICpjYl9mdW5jKQotewotICAgIExPQ19MT0dEKCIgRW50ZXIgZ2V0U2VydmljZXIgdHlwZTolZFxuIiwgKGludCl0eXBlKTsKLSAgICBzd2l0Y2godHlwZSkgewotICAgIGNhc2Ugc2VydmljZXJUeXBlTm9DYlBhcmFtOgotICAgICAgICByZXR1cm4gKG5ldyBTZXJ2aWNlcihjYl9mdW5jKSk7Ci0gICAgY2FzZSBzZXJ2aWNlclR5cGVFeHQ6Ci0gICAgICAgIHJldHVybiAobmV3IEV4dFNlcnZpY2VyKGNiX2Z1bmMpKTsKLSAgICBjYXNlIHNlcnZpY2VyVHlwZUFncHM6Ci0gICAgICAgIHJldHVybiAobmV3IEFHcHNTZXJ2aWNlcihjYl9mdW5jKSk7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotfQotCi1pbnQgU2VydmljZXIgOjogcmVxdWVzdFJzcmModm9pZCAqY2JfZGF0YSkKLXsKLSAgICBjYWxsYmFjaygpOwotICAgIHJldHVybiAwOwotfQotCi1pbnQgRXh0U2VydmljZXIgOjogcmVxdWVzdFJzcmModm9pZCAqY2JfZGF0YSkKLXsKLSAgICBpbnQgcmV0PS0xOwotICAgIExPQ19MT0dEKCJFbnRlciBFeHRTZXJ2aWNlciA6OiByZXF1ZXN0UnNyY1xuIik7Ci0gICAgcmV0ID0gY2FsbGJhY2tFeHQoY2JfZGF0YSk7Ci0gICAgTE9DX0xPR0QoIkV4aXQgRXh0U2VydmljZXIgOjogcmVxdWVzdFJzcmNcbiIpOwotICAgIHJldHVybihyZXQpOwotfQotCi1pbnQgQUdwc1NlcnZpY2VyIDo6IHJlcXVlc3RSc3JjKHZvaWQgKmNiX2RhdGEpCi17Ci0gICAgY2FsbGJhY2tBR3BzKChBR3BzU3RhdHVzICopY2JfZGF0YSk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gQWdwc1N0YXRlTWFjaGluZQotLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUFncHNTdGF0ZU1hY2hpbmU6OkFncHNTdGF0ZU1hY2hpbmUoc2VydmljZXJUeXBlIHNlcnZUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjYl9mdW5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBR3BzRXh0VHlwZSB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGVuZm9yY2VTaW5nbGVTdWJzY3JpYmVyKSA6Ci0gICAgbVN0YXRlUHRyKG5ldyBBZ3BzUmVsZWFzZWRTdGF0ZSh0aGlzKSksbVR5cGUodHlwZSksCi0gICAgbUFQTihOVUxMKSwKLSAgICBtQVBOTGVuKDApLAotICAgIG1CZWFyZXIoQUdQU19BUE5fQkVBUkVSX0lOVkFMSUQpLAotICAgIG1FbmZvcmNlU2luZ2xlU3Vic2NyaWJlcihlbmZvcmNlU2luZ2xlU3Vic2NyaWJlciksCi0gICAgbVNlcnZpY2VyKFNlcnZpY2VyIDo6IGdldFNlcnZpY2VyKHNlcnZUeXBlLCAodm9pZCAqKWNiX2Z1bmMpKQotewotICAgIGxpbmtlZF9saXN0X2luaXQoJm1TdWJzY3JpYmVycyk7Ci0KLSAgICAvLyBzZXR0aW5nIHVwIG1SZWxlYXNlZFN0YXRlCi0gICAgbVN0YXRlUHRyLT5tUGVuZGluZ1N0YXRlID0gbmV3IEFncHNQZW5kaW5nU3RhdGUodGhpcyk7Ci0gICAgbVN0YXRlUHRyLT5tQWNxdWlyZWRTdGF0ZSA9IG5ldyBBZ3BzQWNxdWlyZWRTdGF0ZSh0aGlzKTsKLSAgICBtU3RhdGVQdHItPm1SZWxlYXNpbmdTdGF0ZSA9IG5ldyBBZ3BzUmVsZWFzaW5nU3RhdGUodGhpcyk7Ci0KLSAgICAvLyBzZXR0aW5nIHVwIG1BY3F1aXJlZFN0YXRlCi0gICAgbVN0YXRlUHRyLT5tQWNxdWlyZWRTdGF0ZS0+bVJlbGVhc2VkU3RhdGUgPSBtU3RhdGVQdHI7Ci0gICAgbVN0YXRlUHRyLT5tQWNxdWlyZWRTdGF0ZS0+bVBlbmRpbmdTdGF0ZSA9IG1TdGF0ZVB0ci0+bVBlbmRpbmdTdGF0ZTsKLSAgICBtU3RhdGVQdHItPm1BY3F1aXJlZFN0YXRlLT5tUmVsZWFzaW5nU3RhdGUgPSBtU3RhdGVQdHItPm1SZWxlYXNpbmdTdGF0ZTsKLQotICAgIC8vIHNldHRpbmcgdXAgbVBlbmRpbmdTdGF0ZQotICAgIG1TdGF0ZVB0ci0+bVBlbmRpbmdTdGF0ZS0+bUFjcXVpcmVkU3RhdGUgPSBtU3RhdGVQdHItPm1BY3F1aXJlZFN0YXRlOwotICAgIG1TdGF0ZVB0ci0+bVBlbmRpbmdTdGF0ZS0+bVJlbGVhc2VkU3RhdGUgPSBtU3RhdGVQdHI7Ci0gICAgbVN0YXRlUHRyLT5tUGVuZGluZ1N0YXRlLT5tUmVsZWFzaW5nU3RhdGUgPSBtU3RhdGVQdHItPm1SZWxlYXNpbmdTdGF0ZTsKLQotICAgIC8vIHNldHRpbmcgdXAgbVJlbGVhc2luZ1N0YXRlCi0gICAgbVN0YXRlUHRyLT5tUmVsZWFzaW5nU3RhdGUtPm1SZWxlYXNlZFN0YXRlID0gbVN0YXRlUHRyOwotICAgIG1TdGF0ZVB0ci0+bVJlbGVhc2luZ1N0YXRlLT5tUGVuZGluZ1N0YXRlID0gbVN0YXRlUHRyLT5tUGVuZGluZ1N0YXRlOwotICAgIG1TdGF0ZVB0ci0+bVJlbGVhc2luZ1N0YXRlLT5tQWNxdWlyZWRTdGF0ZSA9IG1TdGF0ZVB0ci0+bUFjcXVpcmVkU3RhdGU7Ci19Ci0KLUFncHNTdGF0ZU1hY2hpbmU6On5BZ3BzU3RhdGVNYWNoaW5lKCkKLXsKLSAgICBkcm9wQWxsU3Vic2NyaWJlcnMoKTsKLQotICAgIC8vIGZyZWUgdGhlIDMgc3RhdGVzLiAgV2UgbXVzdCByZWFkIG91dCBhbGwgMyBwb2ludGVycyBmaXJzdC4KLSAgICAvLyBPdGhlcndpc2Ugd2UgcnVuIHRoZSByaXNrIG9mIGdldHRpbmcgcG9pbnRlcnMgZnJvbSBhbHJlYWR5Ci0gICAgLy8gZnJlZWQgbWVtb3J5LgotICAgIEFncHNTdGF0ZSogYWNxdWlyZWRTdGF0ZSA9IG1TdGF0ZVB0ci0+bUFjcXVpcmVkU3RhdGU7Ci0gICAgQWdwc1N0YXRlKiByZWxlYXNlZFN0YXRlID0gbVN0YXRlUHRyLT5tUmVsZWFzZWRTdGF0ZTsKLSAgICBBZ3BzU3RhdGUqIHBlbmRpbmRTdGF0ZSA9IG1TdGF0ZVB0ci0+bVBlbmRpbmdTdGF0ZTsKLSAgICBBZ3BzU3RhdGUqIHJlbGVhc2luZ1N0YXRlID0gbVN0YXRlUHRyLT5tUmVsZWFzaW5nU3RhdGU7Ci0KLSAgICBkZWxldGUgYWNxdWlyZWRTdGF0ZTsKLSAgICBkZWxldGUgcmVsZWFzZWRTdGF0ZTsKLSAgICBkZWxldGUgcGVuZGluZFN0YXRlOwotICAgIGRlbGV0ZSByZWxlYXNpbmdTdGF0ZTsKLSAgICBkZWxldGUgbVNlcnZpY2VyOwotICAgIGxpbmtlZF9saXN0X2Rlc3Ryb3koJm1TdWJzY3JpYmVycyk7Ci0KLSAgICBpZiAoTlVMTCAhPSBtQVBOKSB7Ci0gICAgICAgIGRlbGV0ZVtdIG1BUE47Ci0gICAgICAgIG1BUE4gPSBOVUxMOwotICAgIH0KLX0KLQotdm9pZCBBZ3BzU3RhdGVNYWNoaW5lOjpzZXRBUE4oY29uc3QgY2hhciogYXBuLCB1bnNpZ25lZCBpbnQgbGVuKQotewotICAgIGlmIChOVUxMICE9IG1BUE4pIHsKLSAgICAgICAgZGVsZXRlIG1BUE47Ci0gICAgfQotCi0gICAgaWYgKE5VTEwgIT0gYXBuKSB7Ci0gICAgICAgIG1BUE4gPSBuZXcgY2hhcltsZW4rMV07Ci0gICAgICAgIG1lbWNweShtQVBOLCBhcG4sIGxlbik7Ci0gICAgICAgIG1BUE5bbGVuXSA9IE5VTEw7Ci0KLSAgICAgICAgbUFQTkxlbiA9IGxlbjsKLSAgICB9IGVsc2UgewotICAgICAgICBtQVBOID0gTlVMTDsKLSAgICAgICAgbUFQTkxlbiA9IDA7Ci0gICAgfQotfQotCi12b2lkIEFncHNTdGF0ZU1hY2hpbmU6Om9uUnNyY0V2ZW50KEFncHNSc3JjU3RhdHVzIGV2ZW50KQotewotICAgIHN3aXRjaCAoZXZlbnQpCi0gICAgewotICAgIGNhc2UgUlNSQ19HUkFOVEVEOgotICAgIGNhc2UgUlNSQ19SRUxFQVNFRDoKLSAgICBjYXNlIFJTUkNfREVOSUVEOgotICAgICAgICBtU3RhdGVQdHIgPSBtU3RhdGVQdHItPm9uUnNyY0V2ZW50KGV2ZW50LCBOVUxMKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgTE9DX0xPR1coIkFncHNTdGF0ZU1hY2hpbmU6IHVucmVjb2duaXplZCBldmVudCAlZCIsIGV2ZW50KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi12b2lkIEFncHNTdGF0ZU1hY2hpbmU6Om5vdGlmeVN1YnNjcmliZXJzKE5vdGlmaWNhdGlvbiYgbm90aWZpY2F0aW9uKSBjb25zdAotewotICAgIGlmIChub3RpZmljYXRpb24ucG9zdE5vdGlmeURlbGV0ZSkgewotICAgICAgICAvLyBqdXN0IGFueSBub24gTlVMTCB2YWx1ZSB0byBnZXQgc3RhcnRlZAotICAgICAgICBTdWJzY3JpYmVyKiBzID0gKFN1YnNjcmliZXIqKX4wOwotICAgICAgICB3aGlsZSAoTlVMTCAhPSBzKSB7Ci0gICAgICAgICAgICBzID0gTlVMTDsKLSAgICAgICAgICAgIC8vIGlmIHRoZSBsYXN0IHBhcmFtIHNldHMgdG8gdHJ1ZSwgX3NlYXJjaCB3aWxsIGRlbGV0ZQotICAgICAgICAgICAgLy8gdGhlIG5vZGUgZnJvbSB0aGUgbGlzdCBmb3IgdXMuICBCdXQgdGhlIHByb2JsZW0gaXMKLSAgICAgICAgICAgIC8vIG9uY2UgdGhhdCBpcyBkb25lLCBfc2VhcmNoIHJldHVybnMsIGxlYXZpbmcgdGhlCi0gICAgICAgICAgICAvLyByZXN0IG9mIHRoZSBsaXN0IHVucHJvY2Vzc2VkLiAgU28gd2UgbmVlZCBhIGxvb3AuCi0gICAgICAgICAgICBsaW5rZWRfbGlzdF9zZWFyY2gobVN1YnNjcmliZXJzLCAodm9pZCoqKSZzLCBub3RpZnlTdWJzY3JpYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKikmbm90aWZpY2F0aW9uLCB0cnVlKTsKLSAgICAgICAgICAgIGRlbGV0ZSBzOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gbm8gbG9vcCBuZWVkZWQgaWYgaXQgdGhlIGxhc3QgcGFyYW0gc2V0cyB0byBmYWxzZSwgd2hpY2gKLSAgICAgICAgLy8gbWVhbiBub3RoaW5nIGdldHMgZGVsZXRlZCBmcm9tIHRoZSBsaXN0LgotICAgICAgICBsaW5rZWRfbGlzdF9zZWFyY2gobVN1YnNjcmliZXJzLCBOVUxMLCBub3RpZnlTdWJzY3JpYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKSZub3RpZmljYXRpb24sIGZhbHNlKTsKLSAgICB9Ci19Ci0KLXZvaWQgQWdwc1N0YXRlTWFjaGluZTo6YWRkU3Vic2NyaWJlcihTdWJzY3JpYmVyKiBzdWJzY3JpYmVyKSBjb25zdAotewotICAgIFN1YnNjcmliZXIqIHMgPSBOVUxMOwotICAgIE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24oKGNvbnN0IFN1YnNjcmliZXIqKXN1YnNjcmliZXIpOwotICAgIGxpbmtlZF9saXN0X3NlYXJjaChtU3Vic2NyaWJlcnMsICh2b2lkKiopJnMsCi0gICAgICAgICAgICAgICAgICAgICAgIGhhc1N1YnNjcmliZXIsICh2b2lkKikmbm90aWZpY2F0aW9uLCBmYWxzZSk7Ci0KLSAgICBpZiAoTlVMTCA9PSBzKSB7Ci0gICAgICAgIGxpbmtlZF9saXN0X2FkZChtU3Vic2NyaWJlcnMsIHN1YnNjcmliZXItPmNsb25lKCksIGRlbGV0ZU9iaik7Ci0gICAgfQotfQotCi1pbnQgQWdwc1N0YXRlTWFjaGluZTo6c2VuZFJzcmNSZXF1ZXN0KEFHcHNTdGF0dXNWYWx1ZSBhY3Rpb24pIGNvbnN0Ci17Ci0gICAgU3Vic2NyaWJlciogcyA9IE5VTEw7Ci0gICAgTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbihOb3RpZmljYXRpb246OkJST0FEQ0FTVF9BQ1RJVkUpOwotICAgIGxpbmtlZF9saXN0X3NlYXJjaChtU3Vic2NyaWJlcnMsICh2b2lkKiopJnMsIGhhc1N1YnNjcmliZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICh2b2lkKikmbm90aWZpY2F0aW9uLCBmYWxzZSk7Ci0KLSAgICBpZiAoKE5VTEwgPT0gcykgPT0gKEdQU19SRUxFQVNFX0FHUFNfREFUQV9DT05OID09IGFjdGlvbikpIHsKLSAgICAgICAgQUdwc0V4dFN0YXR1cyBuaWZSZXF1ZXN0OwotICAgICAgICBuaWZSZXF1ZXN0LnNpemUgPSBzaXplb2YobmlmUmVxdWVzdCk7Ci0gICAgICAgIG5pZlJlcXVlc3QudHlwZSA9IG1UeXBlOwotICAgICAgICBuaWZSZXF1ZXN0LnN0YXR1cyA9IGFjdGlvbjsKLQotICAgICAgICBpZiAocyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBuaWZSZXF1ZXN0LmlwdjRfYWRkciA9IElOQUREUl9OT05FOwotICAgICAgICAgICAgbWVtc2V0KCZuaWZSZXF1ZXN0LmFkZHIsIDAsICBzaXplb2YobmlmUmVxdWVzdC5hZGRyKSk7Ci0gICAgICAgICAgICBuaWZSZXF1ZXN0LmFkZHIuc3NfZmFtaWx5ID0gQUZfSU5FVDY7Ci0gICAgICAgICAgICBuaWZSZXF1ZXN0LnNzaWRbMF0gPSAnXDAnOwotICAgICAgICAgICAgbmlmUmVxdWVzdC5wYXNzd29yZFswXSA9ICdcMCc7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzLT5zZXRJUEFkZHJlc3NlcyhuaWZSZXF1ZXN0LmFkZHIpOwotICAgICAgICAgICAgcy0+c2V0V2lmaUluZm8obmlmUmVxdWVzdC5zc2lkLCBuaWZSZXF1ZXN0LnBhc3N3b3JkKTsKLSAgICAgICAgfQotCi0gICAgICAgIENBTExCQUNLX0xPR19DQUxMRkxPVygiYWdwc19jYiIsICVzLCBsb2NfZ2V0X2FncHNfc3RhdHVzX25hbWUoYWN0aW9uKSk7Ci0gICAgICAgIG1TZXJ2aWNlci0+cmVxdWVzdFJzcmMoKHZvaWQgKikmbmlmUmVxdWVzdCk7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi12b2lkIEFncHNTdGF0ZU1hY2hpbmU6OnN1YnNjcmliZVJzcmMoU3Vic2NyaWJlciAqc3Vic2NyaWJlcikKLXsKLSAgaWYgKG1FbmZvcmNlU2luZ2xlU3Vic2NyaWJlciAmJiBoYXNTdWJzY3JpYmVycygpKSB7Ci0gICAgICBOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKE5vdGlmaWNhdGlvbjo6QlJPQURDQVNUX0FMTCwgUlNSQ19ERU5JRUQsIHRydWUpOwotICAgICAgbm90aWZ5U3Vic2NyaWJlcigmbm90aWZpY2F0aW9uLCBzdWJzY3JpYmVyKTsKLSAgfSBlbHNlIHsKLSAgICAgIG1TdGF0ZVB0ciA9IG1TdGF0ZVB0ci0+b25Sc3JjRXZlbnQoUlNSQ19TVUJTQ1JJQkUsICh2b2lkKilzdWJzY3JpYmVyKTsKLSAgfQotfQotCi1ib29sIEFncHNTdGF0ZU1hY2hpbmU6OnVuc3Vic2NyaWJlUnNyYyhTdWJzY3JpYmVyICpzdWJzY3JpYmVyKQotewotICAgIFN1YnNjcmliZXIqIHMgPSBOVUxMOwotICAgIE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24oKGNvbnN0IFN1YnNjcmliZXIqKXN1YnNjcmliZXIpOwotICAgIGxpbmtlZF9saXN0X3NlYXJjaChtU3Vic2NyaWJlcnMsICh2b2lkKiopJnMsCi0gICAgICAgICAgICAgICAgICAgICAgIGhhc1N1YnNjcmliZXIsICh2b2lkKikmbm90aWZpY2F0aW9uLCBmYWxzZSk7Ci0KLSAgICBpZiAoTlVMTCAhPSBzKSB7Ci0gICAgICAgIG1TdGF0ZVB0ciA9IG1TdGF0ZVB0ci0+b25Sc3JjRXZlbnQoUlNSQ19VTlNVQlNDUklCRSwgKHZvaWQqKXMpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIEFncHNTdGF0ZU1hY2hpbmU6Omhhc0FjdGl2ZVN1YnNjcmliZXJzKCkgY29uc3QKLXsKLSAgICBTdWJzY3JpYmVyKiBzID0gTlVMTDsKLSAgICBOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKE5vdGlmaWNhdGlvbjo6QlJPQURDQVNUX0FDVElWRSk7Ci0gICAgbGlua2VkX2xpc3Rfc2VhcmNoKG1TdWJzY3JpYmVycywgKHZvaWQqKikmcywKLSAgICAgICAgICAgICAgICAgICAgICAgaGFzU3Vic2NyaWJlciwgKHZvaWQqKSZub3RpZmljYXRpb24sIGZhbHNlKTsKLSAgICByZXR1cm4gTlVMTCAhPSBzOwotfQotCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIERTU3RhdGVNYWNoaW5lCi0vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLXZvaWQgZGVsYXlfY2FsbGJhY2sodm9pZCAqY2FsbGJhY2tEYXRhLCBpbnQgcmVzdWx0KQotewotICAgIGlmKGNhbGxiYWNrRGF0YSkgewotICAgICAgICBEU1N0YXRlTWFjaGluZSAqRFNTTUluc3RhbmNlID0gKERTU3RhdGVNYWNoaW5lICopY2FsbGJhY2tEYXRhOwotICAgICAgICBEU1NNSW5zdGFuY2UtPnJldHJ5Q2FsbGJhY2soKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIExPQ19MT0dFKCIgTlVMTCBhcmd1bWVudCByZWNlaXZlZC4gRmFpbGluZy5cbiIpOwotICAgICAgICBnb3RvIGVycjsKLSAgICB9Ci1lcnI6Ci0gICAgcmV0dXJuOwotfQotCi1EU1N0YXRlTWFjaGluZSA6OiBEU1N0YXRlTWFjaGluZShzZXJ2aWNlclR5cGUgdHlwZSwgdm9pZCAqY2JfZnVuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY0VuZ0FkYXB0ZXIqIGFkYXB0ZXJIYW5kbGUpOgotICAgIEFncHNTdGF0ZU1hY2hpbmUodHlwZSwgY2JfZnVuYywgQUdQU19UWVBFX0lOVkFMSUQsZmFsc2UpLAotICAgIG1Mb2NBZGFwdGVyKGFkYXB0ZXJIYW5kbGUpCi17Ci0gICAgTE9DX0xPR0QoIiVzOiVkXTogTmV3IERTU3RhdGVNYWNoaW5lXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotICAgIG1SZXRyaWVzID0gMDsKLX0KLQotdm9pZCBEU1N0YXRlTWFjaGluZSA6OiByZXRyeUNhbGxiYWNrKHZvaWQpCi17Ci0gICAgRFNTdWJzY3JpYmVyICpzdWJzY3JpYmVyID0gTlVMTDsKLSAgICBOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKE5vdGlmaWNhdGlvbjo6QlJPQURDQVNUX0FDVElWRSk7Ci0gICAgbGlua2VkX2xpc3Rfc2VhcmNoKG1TdWJzY3JpYmVycywgKHZvaWQqKikmc3Vic2NyaWJlciwgaGFzU3Vic2NyaWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKSZub3RpZmljYXRpb24sIGZhbHNlKTsKLSAgICBpZihzdWJzY3JpYmVyKQotICAgICAgICBtTG9jQWRhcHRlci0+cmVxdWVzdFN1cGxFUyhzdWJzY3JpYmVyLT5JRCk7Ci0gICAgZWxzZQotICAgICAgICBMT0NfTE9HRSgiRFNTdGF0ZU1hY2hpbmUgOjogcmV0cnlDYWxsYmFjazogTm8gc3Vic2NyaWJlciBmb3VuZC4iIFwKLSAgICAgICAgICAgICAgICAgIkNhbm5vdCByZXRyeSBkYXRhIGNhbGxcbiIpOwotICAgIHJldHVybjsKLX0KLQotaW50IERTU3RhdGVNYWNoaW5lIDo6IHNlbmRSc3JjUmVxdWVzdChBR3BzU3RhdHVzVmFsdWUgYWN0aW9uKSBjb25zdAotewotICAgIERTU3Vic2NyaWJlciogcyA9IE5VTEw7Ci0gICAgZHNDYkRhdGEgY2JEYXRhOwotICAgIGludCByZXQ9LTE7Ci0gICAgaW50IGNvbm5IYW5kbGU9LTE7Ci0gICAgTE9DX0xPR0QoIkVudGVyIERTU3RhdGVNYWNoaW5lIDo6IHNlbmRSc3JjUmVxdWVzdFxuIik7Ci0gICAgTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbihOb3RpZmljYXRpb246OkJST0FEQ0FTVF9BQ1RJVkUpOwotICAgIGxpbmtlZF9saXN0X3NlYXJjaChtU3Vic2NyaWJlcnMsICh2b2lkKiopJnMsIGhhc1N1YnNjcmliZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICh2b2lkKikmbm90aWZpY2F0aW9uLCBmYWxzZSk7Ci0gICAgaWYocykgewotICAgICAgICBjb25uSGFuZGxlID0gcy0+SUQ7Ci0gICAgICAgIExPQ19MT0dEKCJEU1N0YXRlTWFjaGluZSA6OiBzZW5kUnNyY1JlcXVlc3QgLSBzdWJzY3JpYmVyIGZvdW5kXG4iKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgICBMT0NfTE9HRCgiRFNTdGF0ZU1hY2hpbmUgOjogc2VuZFJzcmNSZXF1ZXN0IC0gTm8gc3Vic2NyaWJlciBmb3VuZFxuIik7Ci0KLSAgICBjYkRhdGEuYWN0aW9uID0gYWN0aW9uOwotICAgIGNiRGF0YS5tQWRhcHRlciA9IG1Mb2NBZGFwdGVyOwotICAgIHJldCA9IG1TZXJ2aWNlci0+cmVxdWVzdFJzcmMoKHZvaWQgKikmY2JEYXRhKTsKLSAgICAvL09ubHkgdGhlIHJlcXVlc3QgdG8gc3RhcnQgZGF0YSBjYWxsIHJldHVybnMgYSBzdWNjZXNzL2ZhaWx1cmUKLSAgICAvL1RoZSByZXF1ZXN0IHRvIHN0b3AgZGF0YSBjYWxsIHdpbGwgYWx3YXlzIHN1Y2NlZWQKLSAgICAvL0hlbmNlLCB0aGUgYmVsb3cgYmxvY2sgd2lsbCBvbmx5IGJlIGV4ZWN1dGVkIHdoZW4gdGhlCi0gICAgLy9yZXF1ZXN0IHRvIHN0YXJ0IHRoZSBkYXRhIGNhbGwgZmFpbHMKLSAgICBzd2l0Y2gocmV0KSB7Ci0gICAgY2FzZSBMT0NfQVBJX0FEQVBURVJfRVJSX0VOR0lORV9CVVNZOgotICAgICAgICBMT0NfTE9HRCgiRFNTdGF0ZU1hY2hpbmUgOjogc2VuZFJzcmNSZXF1ZXN0IC0gRmFpbHVyZSByZXR1cm5lZDogJWRcbiIscmV0KTsKLSAgICAgICAgKChEU1N0YXRlTWFjaGluZSAqKXRoaXMpLT5pbmNSZXRyaWVzKCk7Ci0gICAgICAgIGlmKG1SZXRyaWVzID4gTUFYX1NUQVJUX0RBVEFfQ0FMTF9SRVRSSUVTKSB7Ci0gICAgICAgICAgICBMT0NfTE9HRSgiIEZhaWxlZCB0byBzdGFydCBEYXRhIGNhbGwuIEZhbGxiYWNrIHRvIG5vcm1hbCBBVEwgU1VQTFxuIik7Ci0gICAgICAgICAgICBpbmZvcm1TdGF0dXMoUlNSQ19ERU5JRUQsIGNvbm5IYW5kbGUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgaWYobG9jX3RpbWVyX3N0YXJ0KERBVEFfQ0FMTF9SRVRSWV9ERUxBWV9NU0VDLCBkZWxheV9jYWxsYmFjaywgKHZvaWQgKil0aGlzKSkgewotICAgICAgICAgICAgICAgIExPQ19MT0dFKCJFcnJvcjogQ291bGQgbm90IHN0YXJ0IGRlbGF5IHRocmVhZFxuIik7Ci0gICAgICAgICAgICAgICAgcmV0ID0gLTE7Ci0gICAgICAgICAgICAgICAgZ290byBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBMT0NfQVBJX0FEQVBURVJfRVJSX1VOU1VQUE9SVEVEOgotICAgICAgICBMT0NfTE9HRSgiTm8gcHJvZmlsZSBmb3VuZCBmb3IgZW1lcmdlbmN5IGNhbGwuIEZhbGxiYWNrIHRvIG5vcm1hbCBTVVBMIEFUTFxuIik7Ci0gICAgICAgIGluZm9ybVN0YXR1cyhSU1JDX0RFTklFRCwgY29ubkhhbmRsZSk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTE9DX0FQSV9BREFQVEVSX0VSUl9TVUNDRVNTOgotICAgICAgICBMT0NfTE9HRCgiJXM6JWRdOiBSZXF1ZXN0IHRvIHN0YXJ0IGRhdGEgY2FsbCBzZW50XG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIC0xOgotICAgICAgICAvL09uZSBvZiB0aGUgd2F5cyB0aGlzIGNhc2UgY2FuIGJlIGVuY291bnRlcmVkIGlzIGlmIHRoZSBjYWxsYmFjayBmdW5jdGlvbgotICAgICAgICAvL3JlY2VpdmVzIGEgbnVsbCBhcmd1bWVudCwgaXQganVzdCBleGl0cyB3aXRoIC0xIGVycm9yCi0gICAgICAgIExPQ19MT0dFKCJFcnJvcjogU29tZXRoaW5nIHdlbnQgd3Jvbmcgc29tZXdoZXJlLiBGYWxsaW5nIGJhY2sgdG8gbm9ybWFsIFNVUEwgQVRMXG4iKTsKLSAgICAgICAgaW5mb3JtU3RhdHVzKFJTUkNfREVOSUVELCBjb25uSGFuZGxlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgTE9DX0xPR0UoIiVzOiVkXTogVW5yZWNvZ25pemVkIHJldHVybiB2YWx1ZVxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLSAgICB9Ci1lcnI6Ci0gICAgTE9DX0xPR0QoIkVYSVQgRFNTdGF0ZU1hY2hpbmUgOjogc2VuZFJzcmNSZXF1ZXN0OyByZXQgPSAlZFxuIiwgcmV0KTsKLSAgICByZXR1cm4gcmV0OwotfQotCi12b2lkIERTU3RhdGVNYWNoaW5lIDo6IG9uUnNyY0V2ZW50KEFncHNSc3JjU3RhdHVzIGV2ZW50KQotewotICAgIHZvaWQqIGN1cnJTdGF0ZSA9ICh2b2lkICopbVN0YXRlUHRyOwotICAgIExPQ19MT0dEKCJFbnRlciBEU1N0YXRlTWFjaGluZSA6OiBvblJzcmNFdmVudC4gZXZlbnQgPSAlZFxuIiwgKGludClldmVudCk7Ci0gICAgc3dpdGNoIChldmVudCkKLSAgICB7Ci0gICAgY2FzZSBSU1JDX0dSQU5URUQ6Ci0gICAgICAgIExPQ19MT0dEKCJEU1N0YXRlTWFjaGluZSA6OiBvblJzcmNFdmVudCBSU1JDX0dSQU5URURcbiIpOwotICAgICAgICBtU3RhdGVQdHIgPSBtU3RhdGVQdHItPm9uUnNyY0V2ZW50KGV2ZW50LCBOVUxMKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSU1JDX1JFTEVBU0VEOgotICAgICAgICBMT0NfTE9HRCgiRFNTdGF0ZU1hY2hpbmUgOjogb25Sc3JjRXZlbnQgUlNSQ19SRUxFQVNFRFxuIik7Ci0gICAgICAgIG1TdGF0ZVB0ciA9IG1TdGF0ZVB0ci0+b25Sc3JjRXZlbnQoZXZlbnQsIE5VTEwpOwotICAgICAgICAvL1RvIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB3ZSBnZXQgYSBSU1JDX1JFTEVBU0VEIGluCi0gICAgICAgIC8vcGVuZGluZyBzdGF0ZSwgd2UgdHJhbnNsYXRlIHRoYXQgdG8gYSBSU1JDX0RFTklFRCBzdGF0ZQotICAgICAgICAvL3NpbmNlIHRoZSBjYWxsYmFjayBmcm9tIERTSSBpcyBlaXRoZXIgUlNSQ19HUkFOVEVEIG9yIFJTUkNfUkVMRUFTRUQKLSAgICAgICAgLy9mb3Igd2hlbiB0aGUgY2FsbCBpcyBjb25uZWN0ZWQgb3IgZGlzY29ubmVjdGVkIHJlc3BlY3RpdmVseS4KLSAgICAgICAgaWYoKHZvaWQgKiltU3RhdGVQdHIgIT0gY3VyclN0YXRlKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgZXZlbnQgPSBSU1JDX0RFTklFRDsKLSAgICAgICAgICAgIExPQ19MT0dFKCIgU3dpdGNoaW5nIGV2ZW50IHRvIFJTUkNfREVOSUVEXG4iKTsKLSAgICAgICAgfQotICAgIGNhc2UgUlNSQ19ERU5JRUQ6Ci0gICAgICAgIG1TdGF0ZVB0ciA9IG1TdGF0ZVB0ci0+b25Sc3JjRXZlbnQoZXZlbnQsIE5VTEwpOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBMT0NfTE9HVygiQWdwc1N0YXRlTWFjaGluZTogdW5yZWNvZ25pemVkIGV2ZW50ICVkIiwgZXZlbnQpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgTE9DX0xPR0QoIkV4aXQgRFNTdGF0ZU1hY2hpbmUgOjogb25Sc3JjRXZlbnQuIGV2ZW50ID0gJWRcbiIsIChpbnQpZXZlbnQpOwotfQotCi12b2lkIERTU3RhdGVNYWNoaW5lIDo6IGluZm9ybVN0YXR1cyhBZ3BzUnNyY1N0YXR1cyBzdGF0dXMsIGludCBJRCkgY29uc3QKLXsKLSAgICBMT0NfTE9HRCgiRFNTdGF0ZU1hY2hpbmUgOjogaW5mb3JtU3RhdHVzLiBTdGF0dXM9JWRcbiIsKGludClzdGF0dXMpOwotICAgIHN3aXRjaChzdGF0dXMpIHsKLSAgICBjYXNlIFJTUkNfVU5TVUJTQ1JJQkU6Ci0gICAgICAgIG1Mb2NBZGFwdGVyLT5hdGxDbG9zZVN0YXR1cyhJRCwgMSk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUlNSQ19SRUxFQVNFRDoKLSAgICAgICAgbUxvY0FkYXB0ZXItPmNsb3NlRGF0YUNhbGwoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSU1JDX0RFTklFRDoKLSAgICAgICAgKChEU1N0YXRlTWFjaGluZSAqKXRoaXMpLT5tUmV0cmllcyA9IDA7Ci0gICAgICAgIG1Mb2NBZGFwdGVyLT5yZXF1ZXN0QVRMKElELCBBR1BTX1RZUEVfU1VQTCk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUlNSQ19HUkFOVEVEOgotICAgICAgICBtTG9jQWRhcHRlci0+YXRsT3BlblN0YXR1cyhJRCwgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUdQU19BUE5fQkVBUkVSX0lOVkFMSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFHUFNfVFlQRV9JTlZBTElEKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgTE9DX0xPR1coIkRTU3RhdGVNYWNoaW5lIDo6IGluZm9ybVN0YXR1cyAtIHVua25vd24gc3RhdHVzIik7Ci0gICAgfQotICAgIHJldHVybjsKLX0KZGlmZiAtLWdpdCBhL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpXzUwMDAxL2xvY19lbmdfYWdwcy5oIGIvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGlfNTAwMDEvbG9jX2VuZ19hZ3BzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1NTg2NDQuLjAwMDAwMDAKLS0tIGEvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGlfNTAwMDEvbG9jX2VuZ19hZ3BzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MzIgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDExLTIwMTMsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCi0gKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKLSAqICAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24sIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCi0gKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKLSAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCi0gKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCi0gKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2lmbmRlZiBfX0xPQ19FTkdfQUdQU19IX18KLSNkZWZpbmUgX19MT0NfRU5HX0FHUFNfSF9fCi0KLSNpbmNsdWRlIDxzdGRib29sLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxhcnBhL2luZXQuaD4KLSNpbmNsdWRlIDxoYXJkd2FyZS9ncHMuaD4KLSNpbmNsdWRlIDxncHNfZXh0ZW5kZWQuaD4KLSNpbmNsdWRlIDxsb2NfY29yZV9sb2cuaD4KLSNpbmNsdWRlIDxsaW5rZWRfbGlzdC5oPgotI2luY2x1ZGUgPGxvY190aW1lci5oPgotI2luY2x1ZGUgPExvY0VuZ0FkYXB0ZXIuaD4KLQotLy8gZm9yd2FyZCBkZWNsYXJhdGlvbgotY2xhc3MgQWdwc1N0YXRlTWFjaGluZTsKLWNsYXNzIFN1YnNjcmliZXI7Ci0KLS8vIE5JRiByZXNvdXJjZSBldmVudHMKLXR5cGVkZWYgZW51bSB7Ci0gICAgUlNSQ19TVUJTQ1JJQkUsCi0gICAgUlNSQ19VTlNVQlNDUklCRSwKLSAgICBSU1JDX0dSQU5URUQsCi0gICAgUlNSQ19SRUxFQVNFRCwKLSAgICBSU1JDX0RFTklFRCwKLSAgICBSU1JDX1NUQVRVU19NQVgKLX0gQWdwc1JzcmNTdGF0dXM7Ci0KLXR5cGVkZWYgZW51bSB7Ci0gICAgc2VydmljZXJUeXBlTm9DYlBhcmFtLAotICAgIHNlcnZpY2VyVHlwZUFncHMsCi0gICAgc2VydmljZXJUeXBlRXh0Ci19c2VydmljZXJUeXBlOwotCi0vL0RTIENhbGxiYWNrIHN0cnVjdAotdHlwZWRlZiBzdHJ1Y3QgewotICAgIExvY0VuZ0FkYXB0ZXIgKm1BZGFwdGVyOwotICAgIEFHcHNTdGF0dXNWYWx1ZSBhY3Rpb247Ci19ZHNDYkRhdGE7Ci0KLS8vIGluZm9ybWF0aW9uIGJ1bmRsZSBmb3Igc3Vic2NyaWJlcnMKLXN0cnVjdCBOb3RpZmljYXRpb24gewotICAgIC8vIGdvZXMgdG8gZXZlcnkgc3Vic2NyaWJlcgotICAgIHN0YXRpYyBjb25zdCBpbnQgQlJPQURDQVNUX0FMTDsKLSAgICAvLyBnb2VzIHRvIGV2ZXJ5IEFDVElWRSBzdWJzY3JpYmVyCi0gICAgc3RhdGljIGNvbnN0IGludCBCUk9BRENBU1RfQUNUSVZFOwotICAgIC8vIGdvZXMgdG8gZXZlcnkgSU5BQ1RJVkUgc3Vic2NyaWJlcgotICAgIHN0YXRpYyBjb25zdCBpbnQgQlJPQURDQVNUX0lOQUNUSVZFOwotCi0gICAgLy8gZ28gdG8gYSBzcGVjaWZpYyBzdWJzY3JpYmVyCi0gICAgY29uc3QgU3Vic2NyaWJlciogcmN2ZXI7Ci0gICAgLy8gYnJvYWRjYXN0Ci0gICAgY29uc3QgaW50IGdyb3VwSUQ7Ci0gICAgLy8gdGhlIG5ldyByZXNvdXJjZSBzdGF0dXMgZXZlbnQKLSAgICBjb25zdCBBZ3BzUnNyY1N0YXR1cyByc3JjU3RhdHVzOwotICAgIC8vIHNob3VsZCB0aGUgc3Vic2NyaWJlciBiZSBkZWxldGVkIGFmdGVyIHRoZSBub3RpZmljYXRpb24KLSAgICBjb25zdCBib29sIHBvc3ROb3RpZnlEZWxldGU7Ci0KLSAgICAvLyBjb252ZW5pZW50IGNvbnN0cnVjdG9yCi0gICAgaW5saW5lIE5vdGlmaWNhdGlvbihjb25zdCBpbnQgYnJvYWRjYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWdwc1JzcmNTdGF0dXMgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9vbCBkZWxldGVBZnRlcndhcmRzKSA6Ci0gICAgICAgIHJjdmVyKE5VTEwpLCBncm91cElEKGJyb2FkY2FzdCksIHJzcmNTdGF0dXMoc3RhdHVzKSwKLSAgICAgICAgcG9zdE5vdGlmeURlbGV0ZShkZWxldGVBZnRlcndhcmRzKSB7fQotCi0gICAgLy8gY29udmVuaWVudCBjb25zdHJ1Y3RvcgotICAgIGlubGluZSBOb3RpZmljYXRpb24oY29uc3QgU3Vic2NyaWJlciogc3Vic2NyaWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFncHNSc3JjU3RhdHVzIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvb2wgZGVsZXRlQWZ0ZXJ3YXJkcykgOgotICAgICAgICByY3ZlcihzdWJzY3JpYmVyKSwgZ3JvdXBJRCgtMSksIHJzcmNTdGF0dXMoc3RhdHVzKSwKLSAgICAgICAgcG9zdE5vdGlmeURlbGV0ZShkZWxldGVBZnRlcndhcmRzKSB7fQotCi0gICAgLy8gY29udmVuaWVudCBjb25zdHJ1Y3RvcgotICAgIGlubGluZSBOb3RpZmljYXRpb24oY29uc3QgaW50IGJyb2FkY2FzdCkgOgotICAgICAgICByY3ZlcihOVUxMKSwgZ3JvdXBJRChicm9hZGNhc3QpLCByc3JjU3RhdHVzKFJTUkNfU1RBVFVTX01BWCksCi0gICAgICAgIHBvc3ROb3RpZnlEZWxldGUoZmFsc2UpIHt9Ci0KLSAgICAvLyBjb252ZW5pZW50IGNvbnN0cnVjdG9yCi0gICAgaW5saW5lIE5vdGlmaWNhdGlvbihjb25zdCBTdWJzY3JpYmVyKiBzdWJzY3JpYmVyKSA6Ci0gICAgICAgIHJjdmVyKHN1YnNjcmliZXIpLCBncm91cElEKC0xKSwgcnNyY1N0YXR1cyhSU1JDX1NUQVRVU19NQVgpLAotICAgICAgICBwb3N0Tm90aWZ5RGVsZXRlKGZhbHNlKSB7fQotfTsKLQotY2xhc3MgQWdwc1N0YXRlIHsKLSAgICAvLyBhbGxvd3MgQWdwc1N0YXRlTWFjaGluZSB0byBhY2Nlc3MgcHJpdmF0ZSBkYXRhCi0gICAgLy8gbm8gY2xhc3MgbWVtYmVycyBhcmUgcHVibGljLiAgV2UgZG9uJ3Qgd2FudAotICAgIC8vIGFueW9uZSBidXQgc3RhdGUgbWFjaGluZSB0byB1c2Ugc3RhdGUuCi0gICAgZnJpZW5kIGNsYXNzIEFncHNTdGF0ZU1hY2hpbmU7Ci0gICAgZnJpZW5kIGNsYXNzIERTU3RhdGVNYWNoaW5lOwotICAgIC8vIHN0YXRlIHRyYW5zaXRpb25zIGFyZSBkb25lIGhlcmUuCi0gICAgLy8gRWFjaCBzdGF0ZSBpbXBsZW1lbnRzIGl0cyBvd24gdHJhbnNpdGlvbnMgKG9mIGNvdXJzZSkuCi0gICAgaW5saW5lIHZpcnR1YWwgQWdwc1N0YXRlKiBvblJzcmNFdmVudChBZ3BzUnNyY1N0YXR1cyBldmVudCwgdm9pZCogZGF0YSkgPSAwOwotCi1wcm90ZWN0ZWQ6Ci0gICAgLy8gaGFuZGxlIGJhY2sgdG8gc3RhdGUgbWFjaGluZQotICAgIGNvbnN0IEFncHNTdGF0ZU1hY2hpbmUqIG1TdGF0ZU1hY2hpbmU7Ci0gICAgLy8gZWFjaCBzdGF0ZSBoYXMgcG9pbnRlcnMgdG8gYWxsIDMgc3RhdGVzCi0gICAgLy8gb25lIG9mIHdoaWNoIGlzIHRvIGl0c2VsZi4KLSAgICBBZ3BzU3RhdGUqIG1SZWxlYXNlZFN0YXRlOwotICAgIEFncHNTdGF0ZSogbUFjcXVpcmVkU3RhdGU7Ci0gICAgQWdwc1N0YXRlKiBtUGVuZGluZ1N0YXRlOwotICAgIEFncHNTdGF0ZSogbVJlbGVhc2luZ1N0YXRlOwotCi0gICAgaW5saW5lIEFncHNTdGF0ZShjb25zdCBBZ3BzU3RhdGVNYWNoaW5lICpzdGF0ZU1hY2hpbmUpIDoKLSAgICAgICAgbVN0YXRlTWFjaGluZShzdGF0ZU1hY2hpbmUpLAotICAgICAgICBtUmVsZWFzZWRTdGF0ZShOVUxMKSwKLSAgICAgICAgbUFjcXVpcmVkU3RhdGUoTlVMTCksCi0gICAgICAgIG1QZW5kaW5nU3RhdGUoTlVMTCksCi0gICAgICAgIG1SZWxlYXNpbmdTdGF0ZShOVUxMKSB7fQotICAgIHZpcnR1YWwgfkFncHNTdGF0ZSgpIHt9Ci0KLXB1YmxpYzoKLSAgICAvLyBmb3IgbG9nZ2luZyBwdXJwb3NlCi0gICAgaW5saW5lIHZpcnR1YWwgY2hhciogd2hvYW1pKCkgPSAwOwotfTsKLQotY2xhc3MgU2VydmljZXIgewotICAgIHZvaWQgKCpjYWxsYmFjaykodm9pZCk7Ci1wdWJsaWM6Ci0gICAgc3RhdGljIFNlcnZpY2VyKiBnZXRTZXJ2aWNlcihzZXJ2aWNlclR5cGUgdHlwZSwgdm9pZCAqY2JfZnVuYyk7Ci0gICAgdmlydHVhbCBpbnQgcmVxdWVzdFJzcmModm9pZCAqY2JfZGF0YSk7Ci0gICAgU2VydmljZXIoKSB7fQotICAgIFNlcnZpY2VyKHZvaWQgKmNiX2Z1bmMpCi0gICAgeyBjYWxsYmFjayA9ICh2b2lkKCopKHZvaWQpKShjYl9mdW5jKTsgfQotICAgIHZpcnR1YWwgflNlcnZpY2VyKCl7fQotICAgIGlubGluZSB2aXJ0dWFsIGNoYXIgKndob2FtaSgpIHtyZXR1cm4gKGNoYXIqKSJTZXJ2aWNlciI7fQotfTsKLQotY2xhc3MgRXh0U2VydmljZXIgOiBwdWJsaWMgU2VydmljZXIgewotICAgIGludCAoKmNhbGxiYWNrRXh0KSh2b2lkICpjYl9kYXRhKTsKLXB1YmxpYzoKLSAgICBpbnQgcmVxdWVzdFJzcmModm9pZCAqY2JfZGF0YSk7Ci0gICAgRXh0U2VydmljZXIoKSB7fQotICAgIEV4dFNlcnZpY2VyKHZvaWQgKmNiX2Z1bmMpCi0gICAgeyBjYWxsYmFja0V4dCA9IChpbnQoKikodm9pZCAqKSkoY2JfZnVuYyk7IH0KLSAgICB2aXJ0dWFsIH5FeHRTZXJ2aWNlcigpe30KLSAgICBpbmxpbmUgdmlydHVhbCBjaGFyICp3aG9hbWkoKSB7cmV0dXJuIChjaGFyKikiRXh0U2VydmljZXIiO30KLX07Ci0KLWNsYXNzIEFHcHNTZXJ2aWNlciA6IHB1YmxpYyBTZXJ2aWNlciB7Ci0gICAgdm9pZCAoKmNhbGxiYWNrQUdwcykoQUdwc1N0YXR1cyogc3RhdHVzKTsKLXB1YmxpYzoKLSAgICBpbnQgcmVxdWVzdFJzcmModm9pZCAqY2JfZGF0YSk7Ci0gICAgQUdwc1NlcnZpY2VyKCkge30KLSAgICBBR3BzU2VydmljZXIodm9pZCAqY2JfZnVuYykKLSAgICB7IGNhbGxiYWNrQUdwcyA9ICh2b2lkKCopKEFHcHNTdGF0dXMgKikpKGNiX2Z1bmMpOyB9Ci0gICAgdmlydHVhbCB+QUdwc1NlcnZpY2VyKCl7fQotICAgIGlubGluZSB2aXJ0dWFsIGNoYXIgKndob2FtaSgpIHtyZXR1cm4gKGNoYXIqKSJBR3BzU2VydmljZXIiO30KLX07Ci0KLWNsYXNzIEFncHNTdGF0ZU1hY2hpbmUgewotcHJvdGVjdGVkOgotICAgIC8vIGEgbGlua2VkIGxpc3Qgb2Ygc3Vic2NyaWJlcnMuCi0gICAgdm9pZCogbVN1YnNjcmliZXJzOwotICAgIC8vaGFuZGxlIHRvIHdob2V2ZXIgcHJvdmlkZXMgdGhlIHNlcnZpY2UKLSAgICBTZXJ2aWNlciAqbVNlcnZpY2VyOwotICAgIC8vIGFsbG93cyBBZ3BzU3RhdGUgdG8gYWNjZXNzIHByaXZhdGUgZGF0YQotICAgIC8vIGVhY2ggc3RhdGUgaXMgcmVhbGx5IGludGVybmFsIGRhdGEgdG8gdGhlCi0gICAgLy8gc3RhdGUgbWFjaGluZSwgc28gaXQgc2hvdWxkIGJlIGFibGUgdG8KLSAgICAvLyBhY2Nlc3MgYW55dGhpbmcgd2l0aGluIHRoZSBzdGF0ZSBtYWNoaW5lLgotICAgIGZyaWVuZCBjbGFzcyBBZ3BzU3RhdGU7Ci0gICAgLy8gcG9pbnRlciB0byB0aGUgY3VycmVudCBzdGF0ZS4KLSAgICBBZ3BzU3RhdGUqIG1TdGF0ZVB0cjsKLXByaXZhdGU6Ci0gICAgLy8gTklGIHR5cGU6IEFHTlNTIG9yIElOVEVSTkVULgotICAgIGNvbnN0IEFHcHNFeHRUeXBlIG1UeXBlOwotICAgIC8vIGFwbiB0byB0aGUgTklGLiAgRWFjaCBzdGF0ZSBtYWNoaW5lIHRyYWNrcwotICAgIC8vIHJlc291cmNlIHN0YXRlIG9mIGEgcGFydGljdWxhciBOSUYuICBGb3IgZWFjaAotICAgIC8vIE5JRiwgdGhlcmUgaXMgYWxzbyBhbiBhY3RpdmUgQVBOLgotICAgIGNoYXIqIG1BUE47Ci0gICAgLy8gZm9yIGNvbnZlbmllbmNlLCB3ZSBkb24ndCBkbyBzdHJsZW4gZWFjaCB0aW1lLgotICAgIHVuc2lnbmVkIGludCBtQVBOTGVuOwotICAgIC8vIGJlYXIKLSAgICBBR3BzQmVhcmVyVHlwZSBtQmVhcmVyOwotICAgIC8vIGlwdjQgYWRkcmVzcyBmb3Igcm91dGluZwotICAgIGJvb2wgbUVuZm9yY2VTaW5nbGVTdWJzY3JpYmVyOwotCi1wdWJsaWM6Ci0gICAgQWdwc1N0YXRlTWFjaGluZShzZXJ2aWNlclR5cGUgc2VydlR5cGUsIHZvaWQgKmNiX2Z1bmMsCi0gICAgICAgICAgICAgICAgICAgICBBR3BzRXh0VHlwZSB0eXBlLCBib29sIGVuZm9yY2VTaW5nbGVTdWJzY3JpYmVyKTsKLSAgICB2aXJ0dWFsIH5BZ3BzU3RhdGVNYWNoaW5lKCk7Ci0KLSAgICAvLyBzZWxmIGV4cGxhbmF0b3J5IG1ldGhvZHMgYmVsb3cKLSAgICB2b2lkIHNldEFQTihjb25zdCBjaGFyKiBhcG4sIHVuc2lnbmVkIGludCBsZW4pOwotICAgIGlubGluZSBjb25zdCBjaGFyKiBnZXRBUE4oKSBjb25zdCB7IHJldHVybiAoY29uc3QgY2hhciopbUFQTjsgfQotICAgIGlubGluZSB2b2lkIHNldEJlYXJlcihBR3BzQmVhcmVyVHlwZSBiZWFyZXIpIHsgbUJlYXJlciA9IGJlYXJlcjsgfQotICAgIGlubGluZSBBR3BzQmVhcmVyVHlwZSBnZXRCZWFyZXIoKSBjb25zdCB7IHJldHVybiBtQmVhcmVyOyB9Ci0gICAgaW5saW5lIEFHcHNFeHRUeXBlIGdldFR5cGUoKSBjb25zdCB7IHJldHVybiAoQUdwc0V4dFR5cGUpbVR5cGU7IH0KLQotICAgIC8vIHNvbWVvbmUsIGEgQVRMIGNsaWVudCBvciBCSVQsIGlzIGFza2luZyBmb3IgTklGCi0gICAgdm9pZCBzdWJzY3JpYmVSc3JjKFN1YnNjcmliZXIgKnN1YnNjcmliZXIpOwotCi0gICAgLy8gc29tZW9uZSwgYSBBVEwgY2xpZW50IG9yIEJJVCwgaXMgZG9uZSB3aXRoIE5JRgotICAgIGJvb2wgdW5zdWJzY3JpYmVSc3JjKFN1YnNjcmliZXIgKnN1YnNjcmliZXIpOwotCi0gICAgLy8gYWRkIGEgc3Vic2NyaWJlciBpbiB0aGUgbGlua2VkIGxpc3QsIGlmIG5vdCBhbHJlYWR5IHRoZXJlLgotICAgIHZvaWQgYWRkU3Vic2NyaWJlcihTdWJzY3JpYmVyKiBzdWJzY3JpYmVyKSBjb25zdDsKLQotICAgIHZpcnR1YWwgdm9pZCBvblJzcmNFdmVudChBZ3BzUnNyY1N0YXR1cyBldmVudCk7Ci0KLSAgICAvLyBwdXQgdGhlIGRhdGEgdG9nZXRoZXIgYW5kIHNlbmQgdGhlIEZXCi0gICAgdmlydHVhbCBpbnQgc2VuZFJzcmNSZXF1ZXN0KEFHcHNTdGF0dXNWYWx1ZSBhY3Rpb24pIGNvbnN0OwotCi0gICAgLy9pZiBsaXN0IGlzIGVtcHR5LCBsaW5rZWRfbGlzdF9lbXB0eSByZXR1cm5zIDEKLSAgICAvL2Vsc2UgaWYgbGlzdCBpcyBub3QgZW1wdHksIHJldHVybnMgMAotICAgIC8vc28gaGFzU3Vic2NyaWJlcnMoKSByZXR1cm5zIDEgaWYgbGlzdCBpcyBub3QgZW1wdHkKLSAgICAvL2FuZCByZXR1cm5zIDAgaWYgbGlzdCBpcyBlbXB0eQotICAgIGlubGluZSBib29sIGhhc1N1YnNjcmliZXJzKCkgY29uc3QKLSAgICB7IHJldHVybiAhbGlua2VkX2xpc3RfZW1wdHkobVN1YnNjcmliZXJzKTsgfQotCi0gICAgYm9vbCBoYXNBY3RpdmVTdWJzY3JpYmVycygpIGNvbnN0OwotCi0gICAgaW5saW5lIHZvaWQgZHJvcEFsbFN1YnNjcmliZXJzKCkgY29uc3QKLSAgICB7IGxpbmtlZF9saXN0X2ZsdXNoKG1TdWJzY3JpYmVycyk7IH0KLQotICAgIC8vIHByaXZhdGUuIE9ubHkgYSBzdGF0ZSBnZXRzIHRvIGNhbGwgdGhpcy4KLSAgICB2b2lkIG5vdGlmeVN1YnNjcmliZXJzKE5vdGlmaWNhdGlvbiYgbm90aWZpY2F0aW9uKSBjb25zdDsKLQotfTsKLQotY2xhc3MgRFNTdGF0ZU1hY2hpbmUgOiBwdWJsaWMgQWdwc1N0YXRlTWFjaGluZSB7Ci0gICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgTUFYX1NUQVJUX0RBVEFfQ0FMTF9SRVRSSUVTOwotICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgREFUQV9DQUxMX1JFVFJZX0RFTEFZX01TRUM7Ci0gICAgTG9jRW5nQWRhcHRlciogbUxvY0FkYXB0ZXI7Ci0gICAgdW5zaWduZWQgY2hhciBtUmV0cmllczsKLXB1YmxpYzoKLSAgICBEU1N0YXRlTWFjaGluZShzZXJ2aWNlclR5cGUgdHlwZSwKLSAgICAgICAgICAgICAgICAgICB2b2lkICpjYl9mdW5jLAotICAgICAgICAgICAgICAgICAgIExvY0VuZ0FkYXB0ZXIqIGFkYXB0ZXJIYW5kbGUpOwotICAgIGludCBzZW5kUnNyY1JlcXVlc3QoQUdwc1N0YXR1c1ZhbHVlIGFjdGlvbikgY29uc3Q7Ci0gICAgdm9pZCBvblJzcmNFdmVudChBZ3BzUnNyY1N0YXR1cyBldmVudCk7Ci0gICAgdm9pZCByZXRyeUNhbGxiYWNrKCk7Ci0gICAgdm9pZCBpbmZvcm1TdGF0dXMoQWdwc1JzcmNTdGF0dXMgc3RhdHVzLCBpbnQgSUQpIGNvbnN0OwotICAgIGlubGluZSB2b2lkIGluY1JldHJpZXMoKSB7bVJldHJpZXMrKzt9Ci0gICAgaW5saW5lIHZpcnR1YWwgY2hhciAqd2hvYW1pKCkge3JldHVybiAoY2hhciopIkRTU3RhdGVNYWNoaW5lIjt9Ci19OwotCi0vLyBlYWNoIHN1YnNjcmliZXIgaXMgYSBBR1BTIGNsaWVudC4gIEluIHRoZSBjYXNlIG9mIEFUTCwgdGhlcmUgY291bGQgYmUKLS8vIG11bHRpcGxlIGNsaWVudHMgZnJvbSBtb2RlbS4gIEluIHRoZSBjYXNlIG9mIEJJVCwgdGhlcmUgaXMgb25seSBvbmUKLS8vIGNpbGVudCBmcm9tIEJJVCBkYWVtb24uCi1zdHJ1Y3QgU3Vic2NyaWJlciB7Ci0gICAgY29uc3QgdWludDMyX3QgSUQ7Ci0gICAgY29uc3QgQWdwc1N0YXRlTWFjaGluZSogbVN0YXRlTWFjaGluZTsKLSAgICBpbmxpbmUgU3Vic2NyaWJlcihjb25zdCBpbnQgaWQsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWdwc1N0YXRlTWFjaGluZSogc3RhdGVNYWNoaW5lKSA6Ci0gICAgICAgIElEKGlkKSwgbVN0YXRlTWFjaGluZShzdGF0ZU1hY2hpbmUpIHt9Ci0gICAgaW5saW5lIHZpcnR1YWwgflN1YnNjcmliZXIoKSB7fQotCi0gICAgdmlydHVhbCB2b2lkIHNldElQQWRkcmVzc2VzKHVpbnQzMl90ICZ2NCwgY2hhciogdjYpID0gMDsKLSAgICB2aXJ0dWFsIHZvaWQgc2V0SVBBZGRyZXNzZXMoc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UmIGFkZHIpID0gMDsKLSAgICBpbmxpbmUgdmlydHVhbCB2b2lkIHNldFdpZmlJbmZvKGNoYXIqIHNzaWQsIGNoYXIqIHBhc3N3b3JkKQotICAgIHsgc3NpZFswXSA9IDA7IHBhc3N3b3JkWzBdID0gMDsgfQotCi0gICAgaW5saW5lIHZpcnR1YWwgYm9vbCBlcXVhbHMoY29uc3QgU3Vic2NyaWJlciAqcykgY29uc3QKLSAgICB7IHJldHVybiBJRCA9PSBzLT5JRDsgfQotCi0gICAgLy8gbm90aWZpZXMgYSBzdWJzY3JpYmVyIGEgbmV3IE5JRiByZXNvdXJjZSBzdGF0dXMsIHVzdWFsbHkKLSAgICAvLyBlaXRoZXIgR1JBTlRFLCBERU5JRUQsIG9yIFJFTEVBU0VECi0gICAgdmlydHVhbCBib29sIG5vdGlmeVJzcmNTdGF0dXMoTm90aWZpY2F0aW9uICZub3RpZmljYXRpb24pID0gMDsKLQotICAgIHZpcnR1YWwgYm9vbCB3YWl0Rm9yQ2xvc2VDb21wbGV0ZSgpIHsgcmV0dXJuIGZhbHNlOyB9Ci0gICAgdmlydHVhbCB2b2lkIHNldEluYWN0aXZlKCkge30KLSAgICB2aXJ0dWFsIGJvb2wgaXNJbmFjdGl2ZSgpIHsgcmV0dXJuIGZhbHNlOyB9Ci0KLSAgICB2aXJ0dWFsIFN1YnNjcmliZXIqIGNsb25lKCkgPSAwOwotICAgIC8vIGNoZWNrcyBpZiB0aGlzIG5vdGlmaWNhdGlvbiBpcyBmb3IgbWUsIGkuZS4KLSAgICAvLyBlaXRoZXIgaGFzIG15IGlkLCBvciBoYXMgYSBicm9hZGNhc3QgaWQuCi0gICAgYm9vbCBmb3JNZShOb3RpZmljYXRpb24gJm5vdGlmaWNhdGlvbik7Ci19OwotCi0vLyBCSVRTdWJzY3JpYmVyLCBjcmVhdGVkIHdpdGggcmVxdWVzdHMgZnJvbSBCSVQgZGFlbW9uCi1zdHJ1Y3QgQklUU3Vic2NyaWJlciA6IHB1YmxpYyBTdWJzY3JpYmVyIHsKLSAgICBjaGFyIG1JUHY2QWRkclsxNl07Ci0KLSAgICBpbmxpbmUgQklUU3Vic2NyaWJlcihjb25zdCBBZ3BzU3RhdGVNYWNoaW5lKiBzdGF0ZU1hY2hpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGlwdjQsIGNoYXIqIGlwdjYpIDoKLSAgICAgICAgU3Vic2NyaWJlcihpcHY0LCBzdGF0ZU1hY2hpbmUpCi0gICAgewotICAgICAgICBpZiAoTlVMTCA9PSBpcHY2KSB7Ci0gICAgICAgICAgICBtSVB2NkFkZHJbMF0gPSAwOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbWVtY3B5KG1JUHY2QWRkciwgaXB2Niwgc2l6ZW9mKG1JUHY2QWRkcikpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdmlydHVhbCBib29sIG5vdGlmeVJzcmNTdGF0dXMoTm90aWZpY2F0aW9uICZub3RpZmljYXRpb24pOwotCi0gICAgaW5saW5lIHZpcnR1YWwgdm9pZCBzZXRJUEFkZHJlc3Nlcyh1aW50MzJfdCAmdjQsIGNoYXIqIHY2KQotICAgIHsgdjQgPSBJRDsgbWVtY3B5KHY2LCBtSVB2NkFkZHIsIHNpemVvZihtSVB2NkFkZHIpKTsgfQotCi0gICAgaW5saW5lIHZpcnR1YWwgdm9pZCBzZXRJUEFkZHJlc3NlcyhzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSYgYWRkcikKLSAgICB7IGFkZHIuc3NfZmFtaWx5ID0gQUZfSU5FVDY7Lyp0b2RvOiBjb252ZXJ0IG1JUHY2QWRkciBpbnRvIGFkZHIgKi8gfQotCi0gICAgdmlydHVhbCBTdWJzY3JpYmVyKiBjbG9uZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IEJJVFN1YnNjcmliZXIobVN0YXRlTWFjaGluZSwgSUQsIG1JUHY2QWRkcik7Ci0gICAgfQotCi0gICAgdmlydHVhbCBib29sIGVxdWFscyhjb25zdCBTdWJzY3JpYmVyICpzKSBjb25zdDsKLSAgICBpbmxpbmUgdmlydHVhbCB+QklUU3Vic2NyaWJlcigpe30KLX07Ci0KLS8vIEFUTFN1YnNjcmliZXIsIGNyZWF0ZWQgd2l0aCByZXF1ZXN0cyBmcm9tIEFUTAotc3RydWN0IEFUTFN1YnNjcmliZXIgOiBwdWJsaWMgU3Vic2NyaWJlciB7Ci0gICAgY29uc3QgTG9jRW5nQWRhcHRlciogbUxvY0FkYXB0ZXI7Ci0gICAgY29uc3QgYm9vbCBtQmFja3dhcmRDb21wYXRpYmxlTW9kZTsKLSAgICBpbmxpbmUgQVRMU3Vic2NyaWJlcihjb25zdCBpbnQgaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWdwc1N0YXRlTWFjaGluZSogc3RhdGVNYWNoaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY0VuZ0FkYXB0ZXIqIGFkYXB0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9vbCBjb21wYXRpYmxlTW9kZSkgOgotICAgICAgICBTdWJzY3JpYmVyKGlkLCBzdGF0ZU1hY2hpbmUpLCBtTG9jQWRhcHRlcihhZGFwdGVyKSwKLSAgICAgICAgbUJhY2t3YXJkQ29tcGF0aWJsZU1vZGUoY29tcGF0aWJsZU1vZGUpe30KLSAgICB2aXJ0dWFsIGJvb2wgbm90aWZ5UnNyY1N0YXR1cyhOb3RpZmljYXRpb24gJm5vdGlmaWNhdGlvbik7Ci0KLSAgICBpbmxpbmUgdmlydHVhbCB2b2lkIHNldElQQWRkcmVzc2VzKHVpbnQzMl90ICZ2NCwgY2hhciogdjYpCi0gICAgeyB2NCA9IElOQUREUl9OT05FOyB2NlswXSA9IDA7IH0KLQotICAgIGlubGluZSB2aXJ0dWFsIHZvaWQgc2V0SVBBZGRyZXNzZXMoc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UmIGFkZHIpCi0gICAgeyBtZW1zZXQoJmFkZHIsIDAsICBzaXplb2YoYWRkcikpOwotICAgICAgYWRkci5zc19mYW1pbHkgPSBBRl9JTkVUNjsgfQotCi0gICAgaW5saW5lIHZpcnR1YWwgU3Vic2NyaWJlciogY2xvbmUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBBVExTdWJzY3JpYmVyKElELCBtU3RhdGVNYWNoaW5lLCBtTG9jQWRhcHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CYWNrd2FyZENvbXBhdGlibGVNb2RlKTsKLSAgICB9Ci0gICAgaW5saW5lIHZpcnR1YWwgfkFUTFN1YnNjcmliZXIoKXt9Ci19OwotCi0vLyBXSUZJU3Vic2NyaWJlciwgY3JlYXRlZCB3aXRoIHJlcXVlc3RzIGZyb20gTVNBUE0gb3IgUXVJUEMKLXN0cnVjdCBXSUZJU3Vic2NyaWJlciA6IHB1YmxpYyBTdWJzY3JpYmVyIHsKLSAgICBjaGFyICogbVNTSUQ7Ci0gICAgY2hhciAqIG1QYXNzd29yZDsKLSAgICBsb2NfaWZfcmVxX3NlbmRlcl9pZF9lX3R5cGUgc2VuZGVySWQ7Ci0gICAgYm9vbCBtSXNJbmFjdGl2ZTsKLSAgICBpbmxpbmUgV0lGSVN1YnNjcmliZXIoY29uc3QgQWdwc1N0YXRlTWFjaGluZSogc3RhdGVNYWNoaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKiBzc2lkLCBjaGFyICogcGFzc3dvcmQsIGxvY19pZl9yZXFfc2VuZGVyX2lkX2VfdHlwZSBzZW5kZXJfaWQpIDoKLSAgICAgICAgU3Vic2NyaWJlcihzZW5kZXJfaWQsIHN0YXRlTWFjaGluZSksCi0gICAgICAgIG1TU0lEKE5VTEwgPT0gc3NpZCA/IE5VTEwgOiBuZXcgY2hhcltTU0lEX0JVRl9TSVpFXSksCi0gICAgICAgIG1QYXNzd29yZChOVUxMID09IHBhc3N3b3JkID8gTlVMTCA6IG5ldyBjaGFyW1NTSURfQlVGX1NJWkVdKSwKLSAgICAgICAgc2VuZGVySWQoc2VuZGVyX2lkKQotICAgIHsKLSAgICAgIGlmIChOVUxMICE9IG1TU0lEKQotICAgICAgICAgIHN0cmxjcHkobVNTSUQsIHNzaWQsIFNTSURfQlVGX1NJWkUpOwotICAgICAgaWYgKE5VTEwgIT0gbVBhc3N3b3JkKQotICAgICAgICAgIHN0cmxjcHkobVBhc3N3b3JkLCBwYXNzd29yZCwgU1NJRF9CVUZfU0laRSk7Ci0gICAgICBtSXNJbmFjdGl2ZSA9IGZhbHNlOwotICAgIH0KLQotICAgIHZpcnR1YWwgYm9vbCBub3RpZnlSc3JjU3RhdHVzKE5vdGlmaWNhdGlvbiAmbm90aWZpY2F0aW9uKTsKLQotICAgIGlubGluZSB2aXJ0dWFsIHZvaWQgc2V0SVBBZGRyZXNzZXModWludDMyX3QgJnY0LCBjaGFyKiB2Nikge30KLQotICAgIGlubGluZSB2aXJ0dWFsIHZvaWQgc2V0SVBBZGRyZXNzZXMoc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UmIGFkZHIpCi0gICAgeyBhZGRyLnNzX2ZhbWlseSA9IEFGX0lORVQ2OyB9Ci0KLSAgICBpbmxpbmUgdmlydHVhbCB2b2lkIHNldFdpZmlJbmZvKGNoYXIqIHNzaWQsIGNoYXIqIHBhc3N3b3JkKQotICAgIHsKLSAgICAgIGlmIChOVUxMICE9IG1TU0lEKQotICAgICAgICAgIHN0cmxjcHkoc3NpZCwgbVNTSUQsIFNTSURfQlVGX1NJWkUpOwotICAgICAgZWxzZQotICAgICAgICAgIHNzaWRbMF0gPSAnXDAnOwotICAgICAgaWYgKE5VTEwgIT0gbVBhc3N3b3JkKQotICAgICAgICAgIHN0cmxjcHkocGFzc3dvcmQsIG1QYXNzd29yZCwgU1NJRF9CVUZfU0laRSk7Ci0gICAgICBlbHNlCi0gICAgICAgICAgcGFzc3dvcmRbMF0gPSAnXDAnOwotICAgIH0KLQotICAgIGlubGluZSB2aXJ0dWFsIGJvb2wgd2FpdEZvckNsb3NlQ29tcGxldGUoKSB7IHJldHVybiB0cnVlOyB9Ci0KLSAgICBpbmxpbmUgdmlydHVhbCB2b2lkIHNldEluYWN0aXZlKCkgeyBtSXNJbmFjdGl2ZSA9IHRydWU7IH0KLSAgICBpbmxpbmUgdmlydHVhbCBib29sIGlzSW5hY3RpdmUoKSB7IHJldHVybiBtSXNJbmFjdGl2ZTsgfQotCi0gICAgdmlydHVhbCBTdWJzY3JpYmVyKiBjbG9uZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IFdJRklTdWJzY3JpYmVyKG1TdGF0ZU1hY2hpbmUsIG1TU0lELCBtUGFzc3dvcmQsIHNlbmRlcklkKTsKLSAgICB9Ci0gICAgaW5saW5lIHZpcnR1YWwgfldJRklTdWJzY3JpYmVyKCl7fQotfTsKLQotc3RydWN0IERTU3Vic2NyaWJlciA6IHB1YmxpYyBTdWJzY3JpYmVyIHsKLSAgICBib29sIG1Jc0luYWN0aXZlOwotICAgIGlubGluZSBEU1N1YnNjcmliZXIoY29uc3QgQWdwc1N0YXRlTWFjaGluZSAqc3RhdGVNYWNoaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBpZCkgOgotICAgICAgICBTdWJzY3JpYmVyKGlkLCBzdGF0ZU1hY2hpbmUpCi0gICAgewotICAgICAgICBtSXNJbmFjdGl2ZSA9IGZhbHNlOwotICAgIH0KLSAgICBpbmxpbmUgdmlydHVhbCB2b2lkIHNldElQQWRkcmVzc2VzKHVpbnQzMl90ICZ2NCwgY2hhciogdjYpIHt9Ci0gICAgaW5saW5lIHZpcnR1YWwgdm9pZCBzZXRJUEFkZHJlc3NlcyhzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSYgYWRkcikKLSAgICB7IGFkZHIuc3NfZmFtaWx5ID0gQUZfSU5FVDY7IH0KLSAgICB2aXJ0dWFsIFN1YnNjcmliZXIqIGNsb25lKCkKLSAgICB7cmV0dXJuIG5ldyBEU1N1YnNjcmliZXIobVN0YXRlTWFjaGluZSwgSUQpO30KLSAgICB2aXJ0dWFsIGJvb2wgbm90aWZ5UnNyY1N0YXR1cyhOb3RpZmljYXRpb24gJm5vdGlmaWNhdGlvbik7Ci0gICAgaW5saW5lIHZpcnR1YWwgYm9vbCB3YWl0Rm9yQ2xvc2VDb21wbGV0ZSgpIHsgcmV0dXJuIHRydWU7IH0KLSAgICB2aXJ0dWFsIHZvaWQgc2V0SW5hY3RpdmUoKTsKLSAgICBpbmxpbmUgdmlydHVhbCBib29sIGlzSW5hY3RpdmUoKQotICAgIHsgcmV0dXJuIG1Jc0luYWN0aXZlOyB9Ci0gICAgaW5saW5lIHZpcnR1YWwgfkRTU3Vic2NyaWJlcigpe30KLSAgICBpbmxpbmUgdmlydHVhbCBjaGFyICp3aG9hbWkoKSB7cmV0dXJuIChjaGFyKikiRFNTdWJzY3JpYmVyIjt9Ci19OwotCi0jZW5kaWYgLy9fX0xPQ19FTkdfQUdQU19IX18KZGlmZiAtLWdpdCBhL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpXzUwMDAxL2xvY19lbmdfZG1uX2Nvbm4uY3BwIGIvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGlfNTAwMDEvbG9jX2VuZ19kbW5fY29ubi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyNTdkZmYuLjAwMDAwMDAKLS0tIGEvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGlfNTAwMDEvbG9jX2VuZ19kbW5fY29ubi5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyNzAgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDExLTIwMTIsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCi0gKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKLSAqICAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24sIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCi0gKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKLSAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCi0gKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCi0gKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RhdC5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPGdycC5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0KLSNpbmNsdWRlICJsb2dfdXRpbC5oIgotI2luY2x1ZGUgInBsYXRmb3JtX2xpYl9pbmNsdWRlcy5oIgotI2luY2x1ZGUgImxvY19lbmdfZG1uX2Nvbm5fZ2x1ZV9tc2cuaCIKLSNpbmNsdWRlICJsb2NfZW5nX2Rtbl9jb25uX2hhbmRsZXIuaCIKLSNpbmNsdWRlICJsb2NfZW5nX2Rtbl9jb25uLmgiCi0jaW5jbHVkZSAibG9jX2VuZ19tc2cuaCIKLQotc3RhdGljIGludCBsb2NfYXBpX3NlcnZlcl9tc2dxaWQ7Ci1zdGF0aWMgaW50IGxvY19hcGlfcmVzcF9tc2dxaWQ7Ci1zdGF0aWMgaW50IHF1aXBjX21zZ3FpZDsKLXN0YXRpYyBpbnQgbXNhcG1fbXNncWlkOwotc3RhdGljIGludCBtc2FwdV9tc2dxaWQ7Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogZ2xvYmFsX2xvY19hcGlfcV9wYXRoID0gR1BTT05FX0xPQ19BUElfUV9QQVRIOwotc3RhdGljIGNvbnN0IGNoYXIgKiBnbG9iYWxfbG9jX2FwaV9yZXNwX3FfcGF0aCA9IEdQU09ORV9MT0NfQVBJX1JFU1BfUV9QQVRIOwotc3RhdGljIGNvbnN0IGNoYXIgKiBnbG9iYWxfcXVpcGNfY3RybF9xX3BhdGggPSBRVUlQQ19DVFJMX1FfUEFUSDsKLXN0YXRpYyBjb25zdCBjaGFyICogZ2xvYmFsX21zYXBtX2N0cmxfcV9wYXRoID0gTVNBUE1fQ1RSTF9RX1BBVEg7Ci1zdGF0aWMgY29uc3QgY2hhciAqIGdsb2JhbF9tc2FwdV9jdHJsX3FfcGF0aCA9IE1TQVBVX0NUUkxfUV9QQVRIOwotCi1zdGF0aWMgaW50IGxvY19hcGlfc2VydmVyX3Byb2NfaW5pdCh2b2lkICpjb250ZXh0KQotewotICAgIGxvY19hcGlfc2VydmVyX21zZ3FpZCA9IGxvY19lbmdfZG1uX2Nvbm5fZ2x1ZV9tc2dnZXQoZ2xvYmFsX2xvY19hcGlfcV9wYXRoLCBPX1JEV1IpOwotICAgIC8vY2hhbmdlIG1vZGUvZ3JvdXAgZm9yIHRoZSBnbG9iYWxfbG9jX2FwaV9xX3BhdGggcGlwZQotICAgIGludCByZXN1bHQgPSBjaG1vZCAoZ2xvYmFsX2xvY19hcGlfcV9wYXRoLCAwNjYwKTsKLSAgICBpZiAocmVzdWx0ICE9IDApCi0gICAgewotICAgICAgICBMT0NfTE9HRSgiZmFpbGVkIHRvIGNoYW5nZSBtb2RlIGZvciAlcywgZXJyb3IgPSAlc1xuIiwgZ2xvYmFsX2xvY19hcGlfcV9wYXRoLCBzdHJlcnJvcihlcnJubykpOwotICAgIH0KLQotICAgIHN0cnVjdCBncm91cCAqIGdwc19ncm91cCA9IGdldGdybmFtKCJncHMiKTsKLSAgICBpZiAoZ3BzX2dyb3VwICE9IE5VTEwpCi0gICAgewotICAgICAgIHJlc3VsdCA9IGNob3duIChnbG9iYWxfbG9jX2FwaV9xX3BhdGgsIC0xLCBncHNfZ3JvdXAtPmdyX2dpZCk7Ci0gICAgICAgaWYgKHJlc3VsdCAhPSAwKQotICAgICAgIHsKLSAgICAgICAgICBMT0NfTE9HRSgiY2hvd24gZm9yIHBpcGUgZmFpbGVkLCBwaXBlICVzLCBnaWQgPSAlZCwgcmVzdWx0ID0gJWQsIGVycm9yID0gJXNcbiIsCi0gICAgICAgICAgICAgICAgICAgZ2xvYmFsX2xvY19hcGlfcV9wYXRoLCBncHNfZ3JvdXAtPmdyX2dpZCwgcmVzdWx0LCBzdHJlcnJvcihlcnJubykpOwotICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICBMT0NfTE9HRSgiZ2V0Z3JuYW0gZm9yIGdwcyBmYWlsZWQsIGVycm9yIGNvZGUgPSAlZFxuIiwgIGVycm5vKTsKLSAgICB9Ci0KLSAgICBsb2NfYXBpX3Jlc3BfbXNncWlkID0gbG9jX2VuZ19kbW5fY29ubl9nbHVlX21zZ2dldChnbG9iYWxfbG9jX2FwaV9yZXNwX3FfcGF0aCwgT19SRFdSKTsKLQotICAgIC8vY2hhbmdlIG1vZGUvZ3JvdXAgZm9yIHRoZSBnbG9iYWxfbG9jX2FwaV9yZXNwX3FfcGF0aCBwaXBlCi0gICAgcmVzdWx0ID0gY2htb2QgKGdsb2JhbF9sb2NfYXBpX3Jlc3BfcV9wYXRoLCAwNjYwKTsKLSAgICBpZiAocmVzdWx0ICE9IDApCi0gICAgewotICAgICAgICBMT0NfTE9HRSgiZmFpbGVkIHRvIGNoYW5nZSBtb2RlIGZvciAlcywgZXJyb3IgPSAlc1xuIiwgZ2xvYmFsX2xvY19hcGlfcmVzcF9xX3BhdGgsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgfQotCi0gICAgaWYgKGdwc19ncm91cCAhPSBOVUxMKQotICAgIHsKLSAgICAgICByZXN1bHQgPSBjaG93biAoZ2xvYmFsX2xvY19hcGlfcmVzcF9xX3BhdGgsIC0xLCBncHNfZ3JvdXAtPmdyX2dpZCk7Ci0gICAgICAgaWYgKHJlc3VsdCAhPSAwKQotICAgICAgIHsKLSAgICAgICAgICBMT0NfTE9HRSgiY2hvd24gZm9yIHBpcGUgZmFpbGVkLCBwaXBlICVzLCBnaWQgPSAlZCwgcmVzdWx0ID0gJWQsIGVycm9yID0gJXNcbiIsCi0gICAgICAgICAgICAgICAgICAgZ2xvYmFsX2xvY19hcGlfcmVzcF9xX3BhdGgsCi0gICAgICAgICAgICAgICAgICAgZ3BzX2dyb3VwLT5ncl9naWQsIHJlc3VsdCwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICB9Ci0gICAgfQotCi0gICAgcXVpcGNfbXNncWlkID0gbG9jX2VuZ19kbW5fY29ubl9nbHVlX21zZ2dldChnbG9iYWxfcXVpcGNfY3RybF9xX3BhdGgsIE9fUkRXUik7Ci0gICAgbXNhcG1fbXNncWlkID0gbG9jX2VuZ19kbW5fY29ubl9nbHVlX21zZ2dldChnbG9iYWxfbXNhcG1fY3RybF9xX3BhdGggLCBPX1JEV1IpOwotICAgIG1zYXB1X21zZ3FpZCA9IGxvY19lbmdfZG1uX2Nvbm5fZ2x1ZV9tc2dnZXQoZ2xvYmFsX21zYXB1X2N0cmxfcV9wYXRoICwgT19SRFdSKTsKLQotICAgIExPQ19MT0dEKCIlczolZF0gbG9jX2FwaV9zZXJ2ZXJfbXNncWlkID0gJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgbG9jX2FwaV9zZXJ2ZXJfbXNncWlkKTsKLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBsb2NfYXBpX3NlcnZlcl9wcm9jX3ByZSh2b2lkICpjb250ZXh0KQotewotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGxvY19hcGlfc2VydmVyX3Byb2Modm9pZCAqY29udGV4dCkKLXsKLSAgICBpbnQgbGVuZ3RoLCBzejsKLSAgICBpbnQgcmVzdWx0ID0gMDsKLSAgICBzdGF0aWMgaW50IGNudCA9IDA7Ci0gICAgc3RydWN0IGN0cmxfbXNnYnVmICogcF9jbXNnYnVmOwotICAgIHN0cnVjdCBjdHJsX21zZ2J1ZiBjbXNnX3Jlc3A7Ci0KLSAgICBzeiA9IHNpemVvZihzdHJ1Y3QgY3RybF9tc2didWYpICsgMjU2OwotICAgIHBfY21zZ2J1ZiA9IChzdHJ1Y3QgY3RybF9tc2didWYgKikgbWFsbG9jKHN6KTsKLQotICAgIGlmICghcF9jbXNnYnVmKSB7Ci0gICAgICAgIExPQ19MT0dFKCIlczolZF0gT3V0IG9mIG1lbW9yeVxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIGNudCArKzsKLSAgICBMT0NfTE9HRCgiJXM6JWRdICVkIGxpc3RlbmluZyBvbiAlcy4uLlxuIiwgX19mdW5jX18sIF9fTElORV9fLCBjbnQsIChjaGFyICopIGNvbnRleHQpOwotICAgIGxlbmd0aCA9IGxvY19lbmdfZG1uX2Nvbm5fZ2x1ZV9tc2dyY3YobG9jX2FwaV9zZXJ2ZXJfbXNncWlkLCBwX2Ntc2didWYsIHN6KTsKLSAgICBpZiAobGVuZ3RoIDw9IDApIHsKLSAgICAgICAgZnJlZShwX2Ntc2didWYpOwotICAgICAgICBMT0NfTE9HRSgiJXM6JWRdIGZhaWwgcmVjZWl2aW5nIG1zZyBmcm9tIGdwc29uZV9kYWVtb24sIHJldHJ5IGxhdGVyXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotICAgICAgICB1c2xlZXAoMTAwMCk7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBMT0NfTE9HRCgiJXM6JWRdIHJlY2VpdmVkIGN0cmxfdHlwZSA9ICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIHBfY21zZ2J1Zi0+Y3RybF90eXBlKTsKLSAgICBzd2l0Y2gocF9jbXNnYnVmLT5jdHJsX3R5cGUpIHsKLSAgICAgICAgY2FzZSBHUFNPTkVfTE9DX0FQSV9JRl9SRVFVRVNUOgotICAgICAgICAgICAgcmVzdWx0ID0gbG9jX2VuZ19kbW5fY29ubl9sb2NfYXBpX3NlcnZlcl9pZl9yZXF1ZXN0X2hhbmRsZXIocF9jbXNnYnVmLCBsZW5ndGgpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBHUFNPTkVfTE9DX0FQSV9JRl9SRUxFQVNFOgotICAgICAgICAgICAgcmVzdWx0ID0gbG9jX2VuZ19kbW5fY29ubl9sb2NfYXBpX3NlcnZlcl9pZl9yZWxlYXNlX2hhbmRsZXIocF9jbXNnYnVmLCBsZW5ndGgpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBHUFNPTkVfVU5CTE9DSzoKLSAgICAgICAgICAgIExPQ19MT0dEKCIlczolZF0gR1BTT05FX1VOQkxPQ0tcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTE9DX0xPR0UoIiVzOiVkXSB1bnN1cHBvcnRlZCBjdHJsX3R5cGUgPSAlZFxuIiwKLSAgICAgICAgICAgICAgICBfX2Z1bmNfXywgX19MSU5FX18sIHBfY21zZ2J1Zi0+Y3RybF90eXBlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGZyZWUocF9jbXNnYnVmKTsKLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBsb2NfYXBpX3NlcnZlcl9wcm9jX3Bvc3Qodm9pZCAqY29udGV4dCkKLXsKLSAgICBMT0NfTE9HRCgiJXM6JWRdXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotICAgIGxvY19lbmdfZG1uX2Nvbm5fZ2x1ZV9tc2dyZW1vdmUoIGdsb2JhbF9sb2NfYXBpX3FfcGF0aCwgbG9jX2FwaV9zZXJ2ZXJfbXNncWlkKTsKLSAgICBsb2NfZW5nX2Rtbl9jb25uX2dsdWVfbXNncmVtb3ZlKCBnbG9iYWxfbG9jX2FwaV9yZXNwX3FfcGF0aCwgbG9jX2FwaV9yZXNwX21zZ3FpZCk7Ci0gICAgbG9jX2VuZ19kbW5fY29ubl9nbHVlX21zZ3JlbW92ZSggZ2xvYmFsX3F1aXBjX2N0cmxfcV9wYXRoLCBxdWlwY19tc2dxaWQpOwotICAgIGxvY19lbmdfZG1uX2Nvbm5fZ2x1ZV9tc2dyZW1vdmUoIGdsb2JhbF9tc2FwbV9jdHJsX3FfcGF0aCwgbXNhcG1fbXNncWlkKTsKLSAgICBsb2NfZW5nX2Rtbl9jb25uX2dsdWVfbXNncmVtb3ZlKCBnbG9iYWxfbXNhcHVfY3RybF9xX3BhdGgsIG1zYXB1X21zZ3FpZCk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbG9jX2VuZ19kbW5fY29ubl91bmJsb2NrX3Byb2Modm9pZCkKLXsKLSAgICBzdHJ1Y3QgY3RybF9tc2didWYgY21zZ2J1ZjsKLSAgICBjbXNnYnVmLmN0cmxfdHlwZSA9IEdQU09ORV9VTkJMT0NLOwotICAgIExPQ19MT0dEKCIlczolZF1cbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0gICAgbG9jX2VuZ19kbW5fY29ubl9nbHVlX21zZ3NuZChsb2NfYXBpX3NlcnZlcl9tc2dxaWQsICYgY21zZ2J1Ziwgc2l6ZW9mKGNtc2didWYpKTsKLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBsb2NfZW5nX2Rtbl9jb25uX3RoZWxwZXIgdGhlbHBlcjsKLQotaW50IGxvY19lbmdfZG1uX2Nvbm5fbG9jX2FwaV9zZXJ2ZXJfbGF1bmNoKHRoZWxwZXJfY3JlYXRlX3RocmVhZCAgIGNyZWF0ZV90aHJlYWRfY2IsCi0gICAgY29uc3QgY2hhciAqIGxvY19hcGlfcV9wYXRoLCBjb25zdCBjaGFyICogcmVzcF9xX3BhdGgsIHZvaWQgKmFncHNfaGFuZGxlKQotewotICAgIGludCByZXN1bHQ7Ci0KLSAgICBsb2NfYXBpX2hhbmRsZSA9IGFncHNfaGFuZGxlOwotCi0gICAgaWYgKGxvY19hcGlfcV9wYXRoKSBnbG9iYWxfbG9jX2FwaV9xX3BhdGggPSBsb2NfYXBpX3FfcGF0aDsKLSAgICBpZiAocmVzcF9xX3BhdGgpICAgIGdsb2JhbF9sb2NfYXBpX3Jlc3BfcV9wYXRoID0gcmVzcF9xX3BhdGg7Ci0KLSAgICByZXN1bHQgPSBsb2NfZW5nX2Rtbl9jb25uX2xhdW5jaF90aGVscGVyKCAmdGhlbHBlciwKLSAgICAgICAgbG9jX2FwaV9zZXJ2ZXJfcHJvY19pbml0LAotICAgICAgICBsb2NfYXBpX3NlcnZlcl9wcm9jX3ByZSwKLSAgICAgICAgbG9jX2FwaV9zZXJ2ZXJfcHJvYywKLSAgICAgICAgbG9jX2FwaV9zZXJ2ZXJfcHJvY19wb3N0LAotICAgICAgICBjcmVhdGVfdGhyZWFkX2NiLAotICAgICAgICAoY2hhciAqKSBnbG9iYWxfbG9jX2FwaV9xX3BhdGgpOwotICAgIGlmIChyZXN1bHQgIT0gMCkgewotICAgICAgICBMT0NfTE9HRSgiJXM6JWRdXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi1pbnQgbG9jX2VuZ19kbW5fY29ubl9sb2NfYXBpX3NlcnZlcl91bmJsb2NrKHZvaWQpCi17Ci0gICAgbG9jX2VuZ19kbW5fY29ubl91bmJsb2NrX3RoZWxwZXIoJnRoZWxwZXIpOwotICAgIGxvY19lbmdfZG1uX2Nvbm5fdW5ibG9ja19wcm9jKCk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLWludCBsb2NfZW5nX2Rtbl9jb25uX2xvY19hcGlfc2VydmVyX2pvaW4odm9pZCkKLXsKLSAgICBsb2NfZW5nX2Rtbl9jb25uX2pvaW5fdGhlbHBlcigmdGhlbHBlcik7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLWludCBsb2NfZW5nX2Rtbl9jb25uX2xvY19hcGlfc2VydmVyX2RhdGFfY29ubihpbnQgc2VuZGVyX2lkLCBpbnQgc3RhdHVzKSB7Ci0gIHN0cnVjdCBjdHJsX21zZ2J1ZiBjbXNnYnVmOwotICBMT0NfTE9HRCgiJXM6JWRdIHF1aXBjX21zZ3FpZCA9ICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIHF1aXBjX21zZ3FpZCk7Ci0gIGNtc2didWYuY3RybF90eXBlID0gR1BTT05FX0xPQ19BUElfUkVTUE9OU0U7Ci0gIGNtc2didWYuY21zZy5jbXNnX3Jlc3BvbnNlLnJlc3VsdCA9IHN0YXR1czsKLSAgc3dpdGNoIChzZW5kZXJfaWQpIHsKLSAgICBjYXNlIExPQ19FTkdfSUZfUkVRVUVTVF9TRU5ERVJfSURfUVVJUEM6IHsKLSAgICAgIExPQ19MT0dEKCIlczolZF0gc2VuZGVyX2lkID0gTE9DX0VOR19JRl9SRVFVRVNUX1NFTkRFUl9JRF9RVUlQQyIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0gICAgICBpZiAobG9jX2VuZ19kbW5fY29ubl9nbHVlX21zZ3NuZChxdWlwY19tc2dxaWQsICYgY21zZ2J1Ziwgc2l6ZW9mKHN0cnVjdCBjdHJsX21zZ2J1ZikpIDwgMCkgewotICAgICAgICBMT0NfTE9HRCgiJXM6JWRdIGVycm9yISBjb25uX2dsdWVfbXNnc25kIGZhaWxlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgTE9DX0VOR19JRl9SRVFVRVNUX1NFTkRFUl9JRF9NU0FQTTogewotICAgICAgTE9DX0xPR0QoIiVzOiVkXSBzZW5kZXJfaWQgPSBMT0NfRU5HX0lGX1JFUVVFU1RfU0VOREVSX0lEX01TQVBNIiwgX19mdW5jX18sIF9fTElORV9fKTsKLSAgICAgIGlmIChsb2NfZW5nX2Rtbl9jb25uX2dsdWVfbXNnc25kKG1zYXBtX21zZ3FpZCwgJiBjbXNnYnVmLCBzaXplb2Yoc3RydWN0IGN0cmxfbXNnYnVmKSkgPCAwKSB7Ci0gICAgICAgIExPQ19MT0dEKCIlczolZF0gZXJyb3IhIGNvbm5fZ2x1ZV9tc2dzbmQgZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBMT0NfRU5HX0lGX1JFUVVFU1RfU0VOREVSX0lEX01TQVBVOiB7Ci0gICAgICBMT0NfTE9HRCgiJXM6JWRdIHNlbmRlcl9pZCA9IExPQ19FTkdfSUZfUkVRVUVTVF9TRU5ERVJfSURfTVNBUFUiLCBfX2Z1bmNfXywgX19MSU5FX18pOwotICAgICAgaWYgKGxvY19lbmdfZG1uX2Nvbm5fZ2x1ZV9tc2dzbmQobXNhcHVfbXNncWlkLCAmIGNtc2didWYsIHNpemVvZihzdHJ1Y3QgY3RybF9tc2didWYpKSA8IDApIHsKLSAgICAgICAgTE9DX0xPR0QoIiVzOiVkXSBlcnJvciEgY29ubl9nbHVlX21zZ3NuZCBmYWlsZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIExPQ19FTkdfSUZfUkVRVUVTVF9TRU5ERVJfSURfR1BTT05FX0RBRU1PTjogewotICAgICAgTE9DX0xPR0QoIiVzOiVkXSBzZW5kZXJfaWQgPSBMT0NfRU5HX0lGX1JFUVVFU1RfU0VOREVSX0lEX0dQU09ORV9EQUVNT04iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotICAgICAgaWYgKGxvY19lbmdfZG1uX2Nvbm5fZ2x1ZV9tc2dzbmQobG9jX2FwaV9yZXNwX21zZ3FpZCwgJiBjbXNnYnVmLCBzaXplb2Yoc3RydWN0IGN0cmxfbXNnYnVmKSkgPCAwKSB7Ci0gICAgICAgIExPQ19MT0dEKCIlczolZF0gZXJyb3IhIGNvbm5fZ2x1ZV9tc2dzbmQgZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgZGVmYXVsdDogewotICAgICAgTE9DX0xPR0QoIiVzOiVkXSBpbnZhbGlkIHNlbmRlciBJRCEiLCBfX2Z1bmNfXywgX19MSU5FX18pOwotICAgIH0KLSAgfQotICByZXR1cm4gMDsKLX0KLQpkaWZmIC0tZ2l0IGEvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGlfNTAwMDEvbG9jX2VuZ19kbW5fY29ubi5oIGIvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGlfNTAwMDEvbG9jX2VuZ19kbW5fY29ubi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDhjMTQyLi4wMDAwMDAwCi0tLSBhL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpXzUwMDAxL2xvY19lbmdfZG1uX2Nvbm4uaAorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMS0yMDEyLDIwMTQgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKLSAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAotICogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiwgbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKLSAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAotICogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKLSAqIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KLSAqIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotI2lmbmRlZiBMT0NfRU5HX0RBVEFfU0VSVkVSX0gKLSNkZWZpbmUgTE9DX0VOR19EQVRBX1NFUlZFUl9ICi0KLSNpbmNsdWRlICJsb2NfZW5nX2Rtbl9jb25uX3RocmVhZF9oZWxwZXIuaCIKLQotI2lmZGVmIF9BTkRST0lEXwotCi0jZGVmaW5lIEdQU09ORV9MT0NfQVBJX1FfUEFUSCAiL2RhdGEvbWlzYy9sb2NhdGlvbi9ncHNvbmVfZC9ncHNvbmVfbG9jX2FwaV9xIgotI2RlZmluZSBHUFNPTkVfTE9DX0FQSV9SRVNQX1FfUEFUSCAiL2RhdGEvbWlzYy9sb2NhdGlvbi9ncHNvbmVfZC9ncHNvbmVfbG9jX2FwaV9yZXNwX3EiCi0jZGVmaW5lIFFVSVBDX0NUUkxfUV9QQVRIICIvZGF0YS9taXNjL2xvY2F0aW9uL2dwc29uZV9kL3F1aXBjX2N0cmxfcSIKLSNkZWZpbmUgTVNBUE1fQ1RSTF9RX1BBVEggIi9kYXRhL21pc2MvbG9jYXRpb24vZ3Bzb25lX2QvbXNhcG1fY3RybF9xIgotI2RlZmluZSBNU0FQVV9DVFJMX1FfUEFUSCAiL2RhdGEvbWlzYy9sb2NhdGlvbi9ncHNvbmVfZC9tc2FwdV9jdHJsX3EiCi0KLSNlbHNlCi0KLSNkZWZpbmUgR1BTT05FX0xPQ19BUElfUV9QQVRIICIvdG1wL2dwc29uZV9sb2NfYXBpX3EiCi0jZGVmaW5lIEdQU09ORV9MT0NfQVBJX1JFU1BfUV9QQVRIICIvdG1wL2dwc29uZV9sb2NfYXBpX3Jlc3BfcSIKLSNkZWZpbmUgUVVJUENfQ1RSTF9RX1BBVEggIi90bXAvcXVpcGNfY3RybF9xIgotI2RlZmluZSBNU0FQTV9DVFJMX1FfUEFUSCAiL3RtcC9tc2FwbV9jdHJsX3EiCi0jZGVmaW5lIE1TQVBVX0NUUkxfUV9QQVRIICIvdG1wL21zYXB1X2N0cmxfcSIKLQotI2VuZGlmCi0KLWludCBsb2NfZW5nX2Rtbl9jb25uX2xvY19hcGlfc2VydmVyX2xhdW5jaCh0aGVscGVyX2NyZWF0ZV90aHJlYWQgICBjcmVhdGVfdGhyZWFkX2NiLAotICAgIGNvbnN0IGNoYXIgKiBsb2NfYXBpX3FfcGF0aCwgY29uc3QgY2hhciAqIGN0cmxfcV9wYXRoLCB2b2lkICphZ3BzX2hhbmRsZSk7Ci1pbnQgbG9jX2VuZ19kbW5fY29ubl9sb2NfYXBpX3NlcnZlcl91bmJsb2NrKHZvaWQpOwotaW50IGxvY19lbmdfZG1uX2Nvbm5fbG9jX2FwaV9zZXJ2ZXJfam9pbih2b2lkKTsKLWludCBsb2NfZW5nX2Rtbl9jb25uX2xvY19hcGlfc2VydmVyX2RhdGFfY29ubihpbnQsIGludCk7Ci0KLSNlbmRpZiAvKiBMT0NfRU5HX0RBVEFfU0VSVkVSX0ggKi8KLQpkaWZmIC0tZ2l0IGEvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGlfNTAwMDEvbG9jX2VuZ19kbW5fY29ubl9nbHVlX21zZy5jIGIvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGlfNTAwMDEvbG9jX2VuZ19kbW5fY29ubl9nbHVlX21zZy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTA3NmZmLi4wMDAwMDAwCi0tLSBhL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpXzUwMDAxL2xvY19lbmdfZG1uX2Nvbm5fZ2x1ZV9tc2cuYworKysgL2Rldi9udWxsCkBAIC0xLDIyMyArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTEsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCi0gKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKLSAqICAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKLSAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAotICogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKLSAqIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KLSAqIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLQotI2luY2x1ZGUgImxvZ191dGlsLmgiCi0jaW5jbHVkZSAicGxhdGZvcm1fbGliX2luY2x1ZGVzLmgiCi0jaW5jbHVkZSAibG9jX2VuZ19kbW5fY29ubl9nbHVlX21zZy5oIgotI2luY2x1ZGUgImxvY19lbmdfZG1uX2Nvbm5faGFuZGxlci5oIgotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotRlVOQ1RJT04gICAgbG9jX2VuZ19kbW5fY29ubl9nbHVlX21zZ2dldAotCi1ERVNDUklQVElPTgotICAgVGhpcyBmdW5jdGlvbiBnZXQgYSBtZXNzYWdlIHF1ZXVlCi0KLSAgIHFfcGF0aCAtIG5hbWUgcGF0aCBvZiB0aGUgbWVzc2FnZSBxdWV1ZQotICAgbW9kZSAtCi0KLURFUEVOREVOQ0lFUwotICAgTm9uZQotCi1SRVRVUk4gVkFMVUUKLSAgIG1lc3NhZ2UgcXVldWUgaWQKLQotU0lERSBFRkZFQ1RTCi0gICBOL0EKLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLWludCBsb2NfZW5nX2Rtbl9jb25uX2dsdWVfbXNnZ2V0KGNvbnN0IGNoYXIgKiBxX3BhdGgsIGludCBtb2RlKQotewotICAgIGludCBtc2dxaWQ7Ci0gICAgbXNncWlkID0gbG9jX2VuZ19kbW5fY29ubl9nbHVlX3BpcGVnZXQocV9wYXRoLCBtb2RlKTsKLSAgICByZXR1cm4gbXNncWlkOwotfQotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotRlVOQ1RJT04gICAgbG9jX2VuZ19kbW5fY29ubl9nbHVlX21zZ3JlbW92ZQotCi1ERVNDUklQVElPTgotICAgcmVtb3ZlIGEgbWVzc2FnZSBxdWV1ZQotCi0gICBxX3BhdGggLSBuYW1lIHBhdGggb2YgdGhlIG1lc3NhZ2UgcXVldWUKLSAgIG1zZ3FpZCAtIG1lc3NhZ2UgcXVldWUgaWQKLQotREVQRU5ERU5DSUVTCi0gICBOb25lCi0KLVJFVFVSTiBWQUxVRQotICAgMDogc3VjY2VzcyBvciBuZWdhdGl2ZSB2YWx1ZSBmb3IgZmFpbHVyZQotCi1TSURFIEVGRkVDVFMKLSAgIE4vQQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotaW50IGxvY19lbmdfZG1uX2Nvbm5fZ2x1ZV9tc2dyZW1vdmUoY29uc3QgY2hhciAqIHFfcGF0aCwgaW50IG1zZ3FpZCkKLXsKLSAgICBpbnQgcmVzdWx0OwotICAgIHJlc3VsdCA9IGxvY19lbmdfZG1uX2Nvbm5fZ2x1ZV9waXBlcmVtb3ZlKHFfcGF0aCwgbXNncWlkKTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotRlVOQ1RJT04gICAgbG9jX2VuZ19kbW5fY29ubl9nbHVlX21zZ3NuZAotCi1ERVNDUklQVElPTgotICAgU2VuZCBhIG1lc3NhZ2UKLQotICAgbXNncWlkIC0gbWVzc2FnZSBxdWV1ZSBpZAotICAgbXNncCAtIHBvaW50ZXIgdG8gdGhlIG1lc3NhZ2UgdG8gYmUgc2VudAotICAgbXNnc3ogLSBzaXplIG9mIHRoZSBtZXNzYWdlCi0KLURFUEVOREVOQ0lFUwotICAgTm9uZQotCi1SRVRVUk4gVkFMVUUKLSAgIG51bWJlciBvZiBieXRlcyBzZW50IG91dCBvciBuZWdhdGl2ZSB2YWx1ZSBmb3IgZmFpbHVyZQotCi1TSURFIEVGRkVDVFMKLSAgIE4vQQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotaW50IGxvY19lbmdfZG1uX2Nvbm5fZ2x1ZV9tc2dzbmQoaW50IG1zZ3FpZCwgY29uc3Qgdm9pZCAqIG1zZ3AsIHNpemVfdCBtc2dzeikKLXsKLSAgICBpbnQgcmVzdWx0OwotICAgIHN0cnVjdCBjdHJsX21zZ2J1ZiAqcG1zZyA9IChzdHJ1Y3QgY3RybF9tc2didWYgKikgbXNncDsKLSAgICBwbXNnLT5tc2dzeiA9IG1zZ3N6OwotCi0gICAgcmVzdWx0ID0gbG9jX2VuZ19kbW5fY29ubl9nbHVlX3BpcGV3cml0ZShtc2dxaWQsIG1zZ3AsIG1zZ3N6KTsKLSAgICBpZiAocmVzdWx0ICE9IChpbnQpIG1zZ3N6KSB7Ci0gICAgICAgIExPQ19MT0dFKCIlczolZF0gcGlwZSBicm9rZW4gJWQsIG1zZ3N6ID0gJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgcmVzdWx0LCAoaW50KSBtc2dzeik7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotRlVOQ1RJT04gICAgbG9jX2VuZ19kbW5fY29ubl9nbHVlX21zZ3JjdgotCi1ERVNDUklQVElPTgotICAgcmVjZWl2ZSBhIG1lc3NhZ2UKLQotICAgbXNncWlkIC0gbWVzc2FnZSBxdWV1ZSBpZAotICAgbXNncCAtIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byBob2xkIHRoZSBtZXNzYWdlCi0gICBtc2dzeiAtIHNpemUgb2YgdGhlIGJ1ZmZlcgotCi1ERVBFTkRFTkNJRVMKLSAgIE5vbmUKLQotUkVUVVJOIFZBTFVFCi0gICBudW1iZXIgb2YgYnl0ZXMgcmVjZWl2ZWQgb3IgbmVnYXRpdmUgdmFsdWUgZm9yIGZhaWx1cmUKLQotU0lERSBFRkZFQ1RTCi0gICBOL0EKLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLWludCBsb2NfZW5nX2Rtbl9jb25uX2dsdWVfbXNncmN2KGludCBtc2dxaWQsIHZvaWQgKm1zZ3AsIHNpemVfdCBtc2didWZzeikKLXsKLSAgICBpbnQgcmVzdWx0OwotICAgIHN0cnVjdCBjdHJsX21zZ2J1ZiAqcG1zZyA9IChzdHJ1Y3QgY3RybF9tc2didWYgKikgbXNncDsKLQotICAgIHJlc3VsdCA9IGxvY19lbmdfZG1uX2Nvbm5fZ2x1ZV9waXBlcmVhZChtc2dxaWQsICYocG1zZy0+bXNnc3opLCBzaXplb2YocG1zZy0+bXNnc3opKTsKLSAgICBpZiAocmVzdWx0ICE9IHNpemVvZihwbXNnLT5tc2dzeikpIHsKLSAgICAgICAgTE9DX0xPR0UoIiVzOiVkXSBwaXBlIGJyb2tlbiAlZFxuIiwgX19mdW5jX18sIF9fTElORV9fLCByZXN1bHQpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgaWYgKG1zZ2J1ZnN6IDwgcG1zZy0+bXNnc3opIHsKLSAgICAgICAgTE9DX0xPR0UoIiVzOiVkXSBtc2didWYgaXMgdG9vIHNtYWxsICVkIDwgJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgKGludCkgbXNnYnVmc3osIChpbnQpIHBtc2ctPm1zZ3N6KTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIHJlc3VsdCA9IGxvY19lbmdfZG1uX2Nvbm5fZ2x1ZV9waXBlcmVhZChtc2dxaWQsICh1aW50OF90ICopIG1zZ3AgKyBzaXplb2YocG1zZy0+bXNnc3opLCBwbXNnLT5tc2dzeiAtIHNpemVvZihwbXNnLT5tc2dzeikpOwotICAgIGlmIChyZXN1bHQgIT0gKGludCkgKHBtc2ctPm1zZ3N6IC0gc2l6ZW9mKHBtc2ctPm1zZ3N6KSkpIHsKLSAgICAgICAgTE9DX0xPR0UoIiVzOiVkXSBwaXBlIGJyb2tlbiAlZCwgbXNnc3ogPSAlZFxuIiwgX19mdW5jX18sIF9fTElORV9fLCByZXN1bHQsIChpbnQpIHBtc2ctPm1zZ3N6KTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIHJldHVybiBwbXNnLT5tc2dzejsKLX0KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLUZVTkNUSU9OICAgIGxvY19lbmdfZG1uX2Nvbm5fZ2x1ZV9tc2d1bmJsb2NrCi0KLURFU0NSSVBUSU9OCi0gICB1bmJsb2NrIGEgbWVzc2FnZSBxdWV1ZQotCi0gICBtc2dxaWQgLSBtZXNzYWdlIHF1ZXVlIGlkCi0KLURFUEVOREVOQ0lFUwotICAgTm9uZQotCi1SRVRVUk4gVkFMVUUKLSAgIDA6IHN1Y2Nlc3MKLQotU0lERSBFRkZFQ1RTCi0gICBOL0EKLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLWludCBsb2NfZW5nX2Rtbl9jb25uX2dsdWVfbXNndW5ibG9jayhpbnQgbXNncWlkKQotewotICAgIHJldHVybiBsb2NfZW5nX2Rtbl9jb25uX2dsdWVfcGlwZXVuYmxvY2sobXNncWlkKTsKLX0KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLUZVTkNUSU9OICAgIGxvY19lbmdfZG1uX2Nvbm5fZ2x1ZV9tc2dmbHVzaAotCi1ERVNDUklQVElPTgotICAgZmx1c2ggb3V0IHRoZSBtZXNzYWdlIGluIGEgcXVldWUKLQotICAgbXNncWlkIC0gbWVzc2FnZSBxdWV1ZSBpZAotCi1ERVBFTkRFTkNJRVMKLSAgIE5vbmUKLQotUkVUVVJOIFZBTFVFCi0gICBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhcmUgZmx1c2hlZCBvdXQuCi0KLVNJREUgRUZGRUNUUwotICAgTi9BCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi1pbnQgbG9jX2VuZ19kbW5fY29ubl9nbHVlX21zZ2ZsdXNoKGludCBtc2dxaWQpCi17Ci0gICAgaW50IGxlbmd0aDsKLSAgICBjaGFyIGJ1ZlsxMjhdOwotCi0gICAgZG8gewotICAgICAgICBsZW5ndGggPSBsb2NfZW5nX2Rtbl9jb25uX2dsdWVfcGlwZXJlYWQobXNncWlkLCBidWYsIDEyOCk7Ci0gICAgICAgIExPQ19MT0dEKCIlczolZF0gJXNcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgYnVmKTsKLSAgICB9IHdoaWxlKGxlbmd0aCk7Ci0gICAgcmV0dXJuIGxlbmd0aDsKLX0KLQpkaWZmIC0tZ2l0IGEvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGlfNTAwMDEvbG9jX2VuZ19kbW5fY29ubl9nbHVlX21zZy5oIGIvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGlfNTAwMDEvbG9jX2VuZ19kbW5fY29ubl9nbHVlX21zZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjg1Yzg3Li4wMDAwMDAwCi0tLSBhL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpXzUwMDAxL2xvY19lbmdfZG1uX2Nvbm5fZ2x1ZV9tc2cuaAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMSwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKLSAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAotICogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAotICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgotICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCi0gKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQotICogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgotICogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0jaWZuZGVmIExPQ19FTkdfRE1OX0NPTk5fR0xVRV9NU0dfSAotI2RlZmluZSBMT0NfRU5HX0RNTl9DT05OX0dMVUVfTVNHX0gKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgImxvY19lbmdfZG1uX2Nvbm5fZ2x1ZV9waXBlLmgiCi0KLWludCBsb2NfZW5nX2Rtbl9jb25uX2dsdWVfbXNnZ2V0KGNvbnN0IGNoYXIgKiBxX3BhdGgsIGludCBtb2RlKTsKLWludCBsb2NfZW5nX2Rtbl9jb25uX2dsdWVfbXNncmVtb3ZlKGNvbnN0IGNoYXIgKiBxX3BhdGgsIGludCBtc2dxaWQpOwotaW50IGxvY19lbmdfZG1uX2Nvbm5fZ2x1ZV9tc2dzbmQoaW50IG1zZ3FpZCwgY29uc3Qgdm9pZCAqIG1zZ3AsIHNpemVfdCBtc2dzeik7Ci1pbnQgbG9jX2VuZ19kbW5fY29ubl9nbHVlX21zZ3JjdihpbnQgbXNncWlkLCB2b2lkICptc2dwLCBzaXplX3QgbXNnc3opOwotaW50IGxvY19lbmdfZG1uX2Nvbm5fZ2x1ZV9tc2dmbHVzaChpbnQgbXNncWlkKTsKLWludCBsb2NfZW5nX2Rtbl9jb25uX2dsdWVfbXNndW5ibG9jayhpbnQgbXNncWlkKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotI2VuZGlmIC8qIExPQ19FTkdfRE1OX0NPTk5fR0xVRV9NU0dfSCAqLwpkaWZmIC0tZ2l0IGEvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGlfNTAwMDEvbG9jX2VuZ19kbW5fY29ubl9nbHVlX3BpcGUuYyBiL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpXzUwMDAxL2xvY19lbmdfZG1uX2Nvbm5fZ2x1ZV9waXBlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmZmNhZDAuLjAwMDAwMDAKLS0tIGEvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGlfNTAwMDEvbG9jX2VuZ19kbW5fY29ubl9nbHVlX3BpcGUuYworKysgL2Rldi9udWxsCkBAIC0xLDIxNCArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxMiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKLSAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAotICogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiwgbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKLSAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAotICogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKLSAqIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KLSAqIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0KLS8vICNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLS8vICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0KLSNpbmNsdWRlICJsb2NfZW5nX2Rtbl9jb25uX2dsdWVfcGlwZS5oIgotI2luY2x1ZGUgImxvZ191dGlsLmgiCi0jaW5jbHVkZSAicGxhdGZvcm1fbGliX2luY2x1ZGVzLmgiCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotRlVOQ1RJT04gICAgbG9jX2VuZ19kbW5fY29ubl9nbHVlX3BpcGVnZXQKLQotREVTQ1JJUFRJT04KLSAgIGNyZWF0ZSBhIG5hbWVkIHBpcGUuCi0KLSAgIHBpcGVfbmFtZSAtIHBpcGUgbmFtZSBwYXRoCi0gICBtb2RlIC0gbW9kZQotCi1ERVBFTkRFTkNJRVMKLSAgIE5vbmUKLQotUkVUVVJOIFZBTFVFCi0gICAwOiBzdWNjZXNzIG9yIG5lZ2F0aXZlIHZhbHVlIGZvciBmYWlsdXJlCi0KLVNJREUgRUZGRUNUUwotICAgTi9BCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi1pbnQgbG9jX2VuZ19kbW5fY29ubl9nbHVlX3BpcGVnZXQoY29uc3QgY2hhciAqIHBpcGVfbmFtZSwgaW50IG1vZGUpCi17Ci0gICAgaW50IGZkOwotICAgIGludCByZXN1bHQ7Ci0KLSAgICBMT0NfTE9HRCgiJXMsIG1vZGUgPSAlZFxuIiwgcGlwZV9uYW1lLCBtb2RlKTsKLSAgICByZXN1bHQgPSBta2ZpZm8ocGlwZV9uYW1lLCAwNjYwKTsKLQotICAgIGlmICgocmVzdWx0ID09IC0xKSAmJiAoZXJybm8gIT0gRUVYSVNUKSkgewotICAgICAgICBMT0NfTE9HRSgiZmFpbGVkOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvLyBUaGUgbW9kZSBpbiBta2ZpZm8gaXMgbm90IGhvbm91cmVkIGFuZCBkb2VzIG5vdCBwcm92aWRlIHRoZQotICAgIC8vIGdyb3VwIHBlcm1pc3Npb25zLiBEb2luZyBjaG1vZCB0byBhZGQgZ3JvdXAgcGVybWlzc2lvbnMuCi0gICAgcmVzdWx0ID0gY2htb2QgKHBpcGVfbmFtZSwgMDY2MCk7Ci0gICAgaWYgKHJlc3VsdCAhPSAwKXsKLSAgICAgICAgTE9DX0xPR0UgKCIlcyBmYWlsZWQgdG8gY2hhbmdlIG1vZGUgZm9yICVzLCBlcnJvciA9ICVzXG4iLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgcGlwZV9uYW1lLCBzdHJlcnJvcihlcnJubykpOwotICAgIH0KLQotICAgIGZkID0gb3BlbihwaXBlX25hbWUsIG1vZGUpOwotICAgIGlmIChmZCA8PSAwKQotICAgIHsKLSAgICAgICAgTE9DX0xPR0UoImZhaWxlZDogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgfQotICAgIExPQ19MT0dEKCJmZCA9ICVkLCAlc1xuIiwgZmQsIHBpcGVfbmFtZSk7Ci0gICAgcmV0dXJuIGZkOwotfQotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotRlVOQ1RJT04gICAgbG9jX2VuZ19kbW5fY29ubl9nbHVlX3BpcGVyZW1vdmUKLQotREVTQ1JJUFRJT04KLSAgIHJlbW92ZSBhIHBpcGUKLQotICAgIHBpcGVfbmFtZSAtIHBpcGUgbmFtZSBwYXRoCi0gICAgZmQgLSBmZCBmb3IgdGhlIHBpcGUKLQotREVQRU5ERU5DSUVTCi0gICBOb25lCi0KLVJFVFVSTiBWQUxVRQotICAgMDogc3VjY2VzcwotCi1TSURFIEVGRkVDVFMKLSAgIE4vQQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotaW50IGxvY19lbmdfZG1uX2Nvbm5fZ2x1ZV9waXBlcmVtb3ZlKGNvbnN0IGNoYXIgKiBwaXBlX25hbWUsIGludCBmZCkKLXsKLSAgICBjbG9zZShmZCk7Ci0gICAgaWYgKHBpcGVfbmFtZSkgdW5saW5rKHBpcGVfbmFtZSk7Ci0gICAgTE9DX0xPR0QoImZkID0gJWQsICVzXG4iLCBmZCwgcGlwZV9uYW1lKTsKLSAgICByZXR1cm4gMDsKLX0KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLUZVTkNUSU9OICAgIGxvY19lbmdfZG1uX2Nvbm5fZ2x1ZV9waXBld3JpdGUKLQotREVTQ1JJUFRJT04KLSAgIHdyaXRlIHRvIGEgcGlwZQotCi0gICBmZCAtIGZkIG9mIGEgcGlwZQotICAgYnVmIC0gYnVmZmVyIGZvciB0aGUgZGF0YSB0byB3cml0ZQotICAgc3ogLSBzaXplIG9mIHRoZSBkYXRhIGluIGJ1ZmZlcgotCi1ERVBFTkRFTkNJRVMKLSAgIE5vbmUKLQotUkVUVVJOIFZBTFVFCi0gICBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiBvciBuZWdhdGl2ZSB2YWx1ZSBmb3IgZmFpbHVyZQotCi1TSURFIEVGRkVDVFMKLSAgIE4vQQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotaW50IGxvY19lbmdfZG1uX2Nvbm5fZ2x1ZV9waXBld3JpdGUoaW50IGZkLCBjb25zdCB2b2lkICogYnVmLCBzaXplX3Qgc3opCi17Ci0gICAgaW50IHJlc3VsdDsKLQotICAgIHJlc3VsdCA9IHdyaXRlKGZkLCBidWYsIHN6KTsKLQotICAgIC8qIEB0b2RvIGNoZWNrIGZvciBub24gRUlOVFIgJiBFQUdBSU4sIHNoYWxsIG5vdCBkbyBzZWxlY3QgYWdhaW4sIHNlbGVjdF90dXQgTGF3IDcpICovCi0KLSAgICAvKiBMT0NfTE9HRCgiZmQgPSAlZCwgYnVmID0gMHglbHgsIHNpemUgPSAlZCwgcmVzdWx0ID0gJWRcbiIsIGZkLCAobG9uZykgYnVmLCAoaW50KSBzeiwgKGludCkgcmVzdWx0KTsgKi8KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotRlVOQ1RJT04gICAgbG9jX2VuZ19kbW5fY29ubl9nbHVlX3BpcGVyZWFkCi0KLURFU0NSSVBUSU9OCi0gICByZWFkIGZyb20gYSBwaXBlCi0KLSAgIGZkIC0gZmQgZm9yIHRoZSBwaXBlCi0gICBidWYgLSBidWZmZXIgdG8gaG9sZCB0aGUgZGF0YSByZWFkIGZyb20gcGlwZQotICAgc3ogLSBzaXplIG9mIHRoZSBidWZmZXIKLQotREVQRU5ERU5DSUVTCi0gICBOb25lCi0KLVJFVFVSTiBWQUxVRQotICAgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgZnJvbSBwaXBlIG9yIG5lZ2F0aXZlIHZhbHVlIGZvciBmYWlsdXJlCi0KLVNJREUgRUZGRUNUUwotICAgTi9BCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi1pbnQgbG9jX2VuZ19kbW5fY29ubl9nbHVlX3BpcGVyZWFkKGludCBmZCwgdm9pZCAqIGJ1Ziwgc2l6ZV90IHN6KQotewotICAgIGludCBsZW47Ci0KLSAgICBsZW4gPSByZWFkKGZkLCBidWYsIHN6KTsKLQotICAgIC8qIEB0b2RvIGNoZWNrIGZvciBub24gRUlOVFIgJiBFQUdBSU4sIHNoYWxsIG5vdCBkbyBzZWxlY3QgYWdhaW4sIHNlbGVjdF90dXQgTGF3IDcpICovCi0KLSAgICAvKiBMT0NfTE9HRCgiZmQgPSAlZCwgYnVmID0gMHglbHgsIHNpemUgPSAlZCwgbGVuID0gJWRcbiIsIGZkLCAobG9uZykgYnVmLCAoaW50KSBzeiwgbGVuKTsgKi8KLSAgICByZXR1cm4gbGVuOwotfQotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotRlVOQ1RJT04gICAgbG9jX2VuZ19kbW5fY29ubl9nbHVlX3BpcGV1bmJsb2NrCi0KLURFU0NSSVBUSU9OCi0gICB1bmJsb2NrIGEgcGlwZQotCi0gICBmZCAtIGZkIGZvciB0aGUgcGlwZQotCi1ERVBFTkRFTkNJRVMKLSAgIE5vbmUKLQotUkVUVVJOIFZBTFVFCi0gICAwIGZvciBzdWNjZXNzIG9yIG5lZ2F0aXZlIHZhbHVlIGZvciBmYWlsdXJlCi0KLVNJREUgRUZGRUNUUwotICAgTi9BCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi1pbnQgbG9jX2VuZ19kbW5fY29ubl9nbHVlX3BpcGV1bmJsb2NrKGludCBmZCkKLXsKLSAgICBpbnQgcmVzdWx0OwotICAgIHN0cnVjdCBmbG9jayBmbG9ja192OwotICAgIExPQ19MT0dEKCJcbiIpOwotLy8gICAgcmVzdWx0ID0gZmNudGwoZmQsIEZfU0VURkwsIGZjbnRsKGZkLCBGX0dFVEZMLCAwKSB8IE9fTkRFTEFZKTsKLSAgICBmbG9ja192LmxfdHlwZSA9IEZfVU5MQ0s7Ci0gICAgZmxvY2tfdi5sX2xlbiA9IDMyOwotICAgIHJlc3VsdCA9IGZjbnRsKGZkLCBGX1NFVExLLCAmZmxvY2tfdik7Ci0gICAgaWYgKHJlc3VsdCA8IDApIHsKLSAgICAgICAgTE9DX0xPR0UoImZjbnRsIGZhaWx1cmUsICVzXG4iLCBzdHJlcnJvcihlcnJubykpOwotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci19CmRpZmYgLS1naXQgYS9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaV81MDAwMS9sb2NfZW5nX2Rtbl9jb25uX2dsdWVfcGlwZS5oIGIvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGlfNTAwMDEvbG9jX2VuZ19kbW5fY29ubl9nbHVlX3BpcGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJmYTNhMC4uMDAwMDAwMAotLS0gYS9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaV81MDAwMS9sb2NfZW5nX2Rtbl9jb25uX2dsdWVfcGlwZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDExLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZwotICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCi0gKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCi0gKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKLSAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCi0gKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCi0gKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLSNpZm5kZWYgTE9DX0VOR19ETU5fQ09OTl9HTFVFX1BJUEVfSAotI2RlZmluZSBMT0NfRU5HX0RNTl9DT05OX0dMVUVfUElQRV9ICi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0KLWludCBsb2NfZW5nX2Rtbl9jb25uX2dsdWVfcGlwZWdldChjb25zdCBjaGFyICogcGlwZV9uYW1lLCBpbnQgbW9kZSk7Ci1pbnQgbG9jX2VuZ19kbW5fY29ubl9nbHVlX3BpcGVyZW1vdmUoY29uc3QgY2hhciAqIHBpcGVfbmFtZSwgaW50IGZkKTsKLWludCBsb2NfZW5nX2Rtbl9jb25uX2dsdWVfcGlwZXdyaXRlKGludCBmZCwgY29uc3Qgdm9pZCAqIGJ1Ziwgc2l6ZV90IHN6KTsKLWludCBsb2NfZW5nX2Rtbl9jb25uX2dsdWVfcGlwZXJlYWQoaW50IGZkLCB2b2lkICogYnVmLCBzaXplX3Qgc3opOwotCi1pbnQgbG9jX2VuZ19kbW5fY29ubl9nbHVlX3BpcGVmbHVzaChpbnQgZmQpOwotaW50IGxvY19lbmdfZG1uX2Nvbm5fZ2x1ZV9waXBldW5ibG9jayhpbnQgZmQpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jZW5kaWYgLyogTE9DX0VOR19ETU5fQ09OTl9HTFVFX1BJUEVfSCAqLwpkaWZmIC0tZ2l0IGEvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGlfNTAwMDEvbG9jX2VuZ19kbW5fY29ubl9oYW5kbGVyLmNwcCBiL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpXzUwMDAxL2xvY19lbmdfZG1uX2Nvbm5faGFuZGxlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkZDUzZjIuLjAwMDAwMDAKLS0tIGEvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGlfNTAwMDEvbG9jX2VuZ19kbW5fY29ubl9oYW5kbGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDIzNyArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxMiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKLSAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAotICogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiwgbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKLSAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAotICogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKLSAqIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KLSAqIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlICJsb2dfdXRpbC5oIgotI2luY2x1ZGUgInBsYXRmb3JtX2xpYl9pbmNsdWRlcy5oIgotI2luY2x1ZGUgImxvY19lbmdfbXNnLmgiCi0jaW5jbHVkZSAibG9jX2VuZ19kbW5fY29ubi5oIgotI2luY2x1ZGUgImxvY19lbmdfZG1uX2Nvbm5faGFuZGxlci5oIgotCi12b2lkKiBsb2NfYXBpX2hhbmRsZSA9IE5VTEw7Ci0KLWludCBsb2NfZW5nX2Rtbl9jb25uX2xvY19hcGlfc2VydmVyX2lmX3JlcXVlc3RfaGFuZGxlcihzdHJ1Y3QgY3RybF9tc2didWYgKnBtc2csIGludCBsZW4pCi17Ci0gICAgTE9DX0xPR0QoIiVzOiVkXVxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLSNpZm5kZWYgREVCVUdfRE1OX0xPQ19BUEkKLSAgICBpZiAoTlVMTCA9PSBsb2NfYXBpX2hhbmRsZSkgewotICAgICAgICBMT0NfTE9HRSgiJXM6JWRdIE5PIGFncHMgZGF0YSBoYW5kbGVcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLQotICAgIGlmIChOVUxMICE9IGxvY19hcGlfaGFuZGxlKSB7Ci0gICAgICAgIEFHcHNFeHRUeXBlIHR5cGU7Ci0gICAgICAgIHN3aXRjaCAocG1zZy0+Y21zZy5jbXNnX2lmX3JlcXVlc3QudHlwZSkgewotICAgICAgICAgIGNhc2UgSUZfUkVRVUVTVF9UWVBFX1NVUEw6Ci0gICAgICAgICAgewotICAgICAgICAgICAgTE9DX0xPR0QoIklGX1JFUVVFU1RfVFlQRV9TVVBMIik7Ci0gICAgICAgICAgICB0eXBlID0gQUdQU19UWVBFX1NVUEw7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSBJRl9SRVFVRVNUX1RZUEVfV0lGSToKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBMT0NfTE9HRCgiSUZfUkVRVUVTVF9UWVBFX1dJRkkiKTsKLSAgICAgICAgICAgIHR5cGUgPSBBR1BTX1RZUEVfV0lGSTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIElGX1JFUVVFU1RfVFlQRV9BTlk6Ci0gICAgICAgICAgewotICAgICAgICAgICAgTE9DX0xPR0QoIklGX1JFUVVFU1RfVFlQRV9BTlkiKTsKLSAgICAgICAgICAgIHR5cGUgPSBBR1BTX1RZUEVfQU5ZOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgewotICAgICAgICAgICAgTE9DX0xPR0QoImludmFsaWQgSUZfUkVRVUVTVF9UWVBFISIpOwotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBzd2l0Y2ggKHBtc2ctPmNtc2cuY21zZ19pZl9yZXF1ZXN0LnNlbmRlcl9pZCkgewotICAgICAgICAgIGNhc2UgSUZfUkVRVUVTVF9TRU5ERVJfSURfUVVJUEM6Ci0gICAgICAgICAgewotICAgICAgICAgICAgTE9DX0xPR0QoIklGX1JFUVVFU1RfU0VOREVSX0lEX1FVSVBDIik7Ci0gICAgICAgICAgICBMb2NFbmdSZXFSZWxXaWZpKiBtc2cgPQotICAgICAgICAgICAgICAgIG5ldyBMb2NFbmdSZXFSZWxXaWZpKGxvY19hcGlfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9DX0VOR19JRl9SRVFVRVNUX1NFTkRFUl9JRF9RVUlQQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciopcG1zZy0+Y21zZy5jbXNnX2lmX3JlcXVlc3Quc3NpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciopcG1zZy0+Y21zZy5jbXNnX2lmX3JlcXVlc3QucGFzc3dvcmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7Ci0gICAgICAgICAgICBtc2ctPnNlbmQoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIElGX1JFUVVFU1RfU0VOREVSX0lEX01TQVBNOgotICAgICAgICAgIHsKLSAgICAgICAgICAgIExPQ19MT0dEKCJJRl9SRVFVRVNUX1NFTkRFUl9JRF9NU0FQTSIpOwotICAgICAgICAgICAgTG9jRW5nUmVxUmVsV2lmaSogbXNnID0KLSAgICAgICAgICAgICAgICBuZXcgTG9jRW5nUmVxUmVsV2lmaShsb2NfYXBpX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPQ19FTkdfSUZfUkVRVUVTVF9TRU5ERVJfSURfTVNBUE0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIqKXBtc2ctPmNtc2cuY21zZ19pZl9yZXF1ZXN0LnNzaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIqKXBtc2ctPmNtc2cuY21zZ19pZl9yZXF1ZXN0LnBhc3N3b3JkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOwotICAgICAgICAgICAgbXNnLT5zZW5kKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSBJRl9SRVFVRVNUX1NFTkRFUl9JRF9NU0FQVToKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBMT0NfTE9HRCgiSUZfUkVRVUVTVF9TRU5ERVJfSURfTVNBUFUiKTsKLSAgICAgICAgICAgIExvY0VuZ1JlcVJlbFdpZmkqIG1zZyA9Ci0gICAgICAgICAgICAgICAgbmV3IExvY0VuZ1JlcVJlbFdpZmkobG9jX2FwaV9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0NfRU5HX0lGX1JFUVVFU1RfU0VOREVSX0lEX01TQVBVLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyKilwbXNnLT5jbXNnLmNtc2dfaWZfcmVxdWVzdC5zc2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyKilwbXNnLT5jbXNnLmNtc2dfaWZfcmVxdWVzdC5wYXNzd29yZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKLSAgICAgICAgICAgIG1zZy0+c2VuZCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgSUZfUkVRVUVTVF9TRU5ERVJfSURfR1BTT05FX0RBRU1PTjoKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBMT0NfTE9HRCgiSUZfUkVRVUVTVF9TRU5ERVJfSURfR1BTT05FX0RBRU1PTiIpOwotICAgICAgICAgICAgTG9jRW5nUmVxUmVsQklUKiBtc2cgPQotICAgICAgICAgICAgICAgIG5ldyBMb2NFbmdSZXFSZWxCSVQobG9jX2FwaV9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG1zZy0+Y21zZy5jbXNnX2lmX3JlcXVlc3QuaXB2NF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIqKXBtc2ctPmNtc2cuY21zZ19pZl9yZXF1ZXN0LmlwdjZfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOwotICAgICAgICAgICAgbXNnLT5zZW5kKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBMT0NfTE9HRCgiaW52YWxpZCBJRl9SRVFVRVNUX1NFTkRFUl9JRCEiKTsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSNlbHNlCi0gICBsb2NfZW5nX2Rtbl9jb25uX2xvY19hcGlfc2VydmVyX2RhdGFfY29ubihMT0NfRU5HX0lGX1JFUVVFU1RfU0VOREVSX0lEX0dQU09ORV9EQUVNT04sIEdQU09ORV9MT0NfQVBJX0lGX1JFUVVFU1RfU1VDQ0VTUyk7Ci0jZW5kaWYKLSAgICByZXR1cm4gMDsKLX0KLQotaW50IGxvY19lbmdfZG1uX2Nvbm5fbG9jX2FwaV9zZXJ2ZXJfaWZfcmVsZWFzZV9oYW5kbGVyKHN0cnVjdCBjdHJsX21zZ2J1ZiAqcG1zZywgaW50IGxlbikKLXsKLSAgICBMT0NfTE9HRCgiJXM6JWRdXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotI2lmbmRlZiBERUJVR19ETU5fTE9DX0FQSQotICAgIEFHcHNFeHRUeXBlIHR5cGU7Ci0gICAgc3dpdGNoIChwbXNnLT5jbXNnLmNtc2dfaWZfcmVxdWVzdC50eXBlKSB7Ci0gICAgICBjYXNlIElGX1JFUVVFU1RfVFlQRV9TVVBMOgotICAgICAgewotICAgICAgICBMT0NfTE9HRCgiSUZfUkVRVUVTVF9UWVBFX1NVUEwiKTsKLSAgICAgICAgdHlwZSA9IEFHUFNfVFlQRV9TVVBMOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgSUZfUkVRVUVTVF9UWVBFX1dJRkk6Ci0gICAgICB7Ci0gICAgICAgIExPQ19MT0dEKCJJRl9SRVFVRVNUX1RZUEVfV0lGSSIpOwotICAgICAgICB0eXBlID0gQUdQU19UWVBFX1dJRkk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBJRl9SRVFVRVNUX1RZUEVfQU5ZOgotICAgICAgewotICAgICAgICBMT0NfTE9HRCgiSUZfUkVRVUVTVF9UWVBFX0FOWSIpOwotICAgICAgICB0eXBlID0gQUdQU19UWVBFX0FOWTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBkZWZhdWx0OgotICAgICAgewotICAgICAgICBMT0NfTE9HRCgiaW52YWxpZCBJRl9SRVFVRVNUX1RZUEUhIik7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICAgIH0KLSAgICB9Ci0gICAgc3dpdGNoIChwbXNnLT5jbXNnLmNtc2dfaWZfcmVxdWVzdC5zZW5kZXJfaWQpIHsKLSAgICAgIGNhc2UgSUZfUkVRVUVTVF9TRU5ERVJfSURfUVVJUEM6Ci0gICAgICB7Ci0gICAgICAgIExPQ19MT0dEKCJJRl9SRVFVRVNUX1NFTkRFUl9JRF9RVUlQQyIpOwotICAgICAgICBMb2NFbmdSZXFSZWxXaWZpKiBtc2cgPQotICAgICAgICAgICAgbmV3IExvY0VuZ1JlcVJlbFdpZmkobG9jX2FwaV9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9DX0VOR19JRl9SRVFVRVNUX1NFTkRFUl9JRF9RVUlQQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyKilwbXNnLT5jbXNnLmNtc2dfaWZfcmVxdWVzdC5zc2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIqKXBtc2ctPmNtc2cuY21zZ19pZl9yZXF1ZXN0LnBhc3N3b3JkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOwotICAgICAgICBtc2ctPnNlbmQoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIElGX1JFUVVFU1RfU0VOREVSX0lEX01TQVBNOgotICAgICAgewotICAgICAgICBMT0NfTE9HRCgiSUZfUkVRVUVTVF9TRU5ERVJfSURfTVNBUE0iKTsKLSAgICAgICAgTG9jRW5nUmVxUmVsV2lmaSogbXNnID0KLSAgICAgICAgICAgIG5ldyBMb2NFbmdSZXFSZWxXaWZpKGxvY19hcGlfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPQ19FTkdfSUZfUkVRVUVTVF9TRU5ERVJfSURfTVNBUE0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciopcG1zZy0+Y21zZy5jbXNnX2lmX3JlcXVlc3Quc3NpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyKilwbXNnLT5jbXNnLmNtc2dfaWZfcmVxdWVzdC5wYXNzd29yZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKLSAgICAgICAgbXNnLT5zZW5kKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBJRl9SRVFVRVNUX1NFTkRFUl9JRF9NU0FQVToKLSAgICAgIHsKLSAgICAgICAgTE9DX0xPR0QoIklGX1JFUVVFU1RfU0VOREVSX0lEX01TQVBVIik7Ci0gICAgICAgIExvY0VuZ1JlcVJlbFdpZmkqIG1zZyA9Ci0gICAgICAgICAgICBuZXcgTG9jRW5nUmVxUmVsV2lmaShsb2NfYXBpX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0NfRU5HX0lGX1JFUVVFU1RfU0VOREVSX0lEX01TQVBVLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIqKXBtc2ctPmNtc2cuY21zZ19pZl9yZXF1ZXN0LnNzaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciopcG1zZy0+Y21zZy5jbXNnX2lmX3JlcXVlc3QucGFzc3dvcmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7Ci0gICAgICAgIG1zZy0+c2VuZCgpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgSUZfUkVRVUVTVF9TRU5ERVJfSURfR1BTT05FX0RBRU1PTjoKLSAgICAgIHsKLSAgICAgICAgTE9DX0xPR0QoIklGX1JFUVVFU1RfU0VOREVSX0lEX0dQU09ORV9EQUVNT04iKTsKLSAgICAgICAgTG9jRW5nUmVxUmVsQklUKiBtc2cgPQotICAgICAgICAgICAgbmV3IExvY0VuZ1JlcVJlbEJJVChsb2NfYXBpX2hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG1zZy0+Y21zZy5jbXNnX2lmX3JlcXVlc3QuaXB2NF9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciopcG1zZy0+Y21zZy5jbXNnX2lmX3JlcXVlc3QuaXB2Nl9hZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7Ci0gICAgICAgIG1zZy0+c2VuZCgpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICB7Ci0gICAgICAgIExPQ19MT0dEKCJpbnZhbGlkIElGX1JFUVVFU1RfU0VOREVSX0lEISIpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgICB9Ci0gICAgfQotI2Vsc2UKLSAgIGxvY19lbmdfZG1uX2Nvbm5fbG9jX2FwaV9zZXJ2ZXJfZGF0YV9jb25uKExPQ19FTkdfSUZfUkVRVUVTVF9TRU5ERVJfSURfR1BTT05FX0RBRU1PTiwgR1BTT05FX0xPQ19BUElfSUZfUkVMRUFTRV9TVUNDRVNTKTsKLSNlbmRpZgotICAgIHJldHVybiAwOwotfQotCmRpZmYgLS1naXQgYS9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaV81MDAwMS9sb2NfZW5nX2Rtbl9jb25uX2hhbmRsZXIuaCBiL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpXzUwMDAxL2xvY19lbmdfZG1uX2Nvbm5faGFuZGxlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzBlZGQ1Li4wMDAwMDAwCi0tLSBhL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpXzUwMDAxL2xvY19lbmdfZG1uX2Nvbm5faGFuZGxlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMS0yMDEyLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZwotICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCi0gKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uLCBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAotICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgotICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCi0gKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQotICogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgotICogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0jaWZuZGVmIExPQ19FTkdfREFUQV9TRVJWRVJfSEFORExFUgotI2RlZmluZSBMT0NfRU5HX0RBVEFfU0VSVkVSX0hBTkRMRVIKLQotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8YXJwYS9pbmV0Lmg+Ci0KLS8vZm9yIFNTSURfQlVGX1NJWkUKLSNpbmNsdWRlIDxoYXJkd2FyZS9ncHMuaD4KLQotI2lmbmRlZiBTU0lEX0JVRl9TSVpFCi0gICAgI2RlZmluZSBTU0lEX0JVRl9TSVpFICgzMisxKQotI2VuZGlmCi0KLWVudW0gewotICAgIC8qIDB4MCAtIDB4RUYgaXMgcmVzZXJ2ZWQgZm9yIGRhZW1vbiBpbnRlcm5hbCAqLwotICAgIEdQU09ORV9MT0NfQVBJX0lGX1JFUVVFU1QgICA9IDB4RjAsCi0gICAgR1BTT05FX0xPQ19BUElfSUZfUkVMRUFTRSwKLSAgICBHUFNPTkVfTE9DX0FQSV9SRVNQT05TRSwKLSAgICBHUFNPTkVfVU5CTE9DSywKLX07Ci0KLWVudW0gewotICAgIEdQU09ORV9MT0NfQVBJX0lGX1JFUVVFU1RfU1VDQ0VTUyA9IDB4RjAsCi0gICAgR1BTT05FX0xPQ19BUElfSUZfUkVMRUFTRV9TVUNDRVNTLAotICAgIEdQU09ORV9MT0NfQVBJX0lGX0ZBSUxVUkUsCi19OwotCi0KLXN0cnVjdCBjdHJsX21zZ19yZXNwb25zZSB7Ci0gICAgaW50IHJlc3VsdDsKLX07Ci0KLXN0cnVjdCBjdHJsX21zZ191bmJsb2NrIHsKLSAgICBpbnQgcmVzZXJ2ZWQ7Ci19OwotCi10eXBlZGVmIGVudW0gewotICBJRl9SRVFVRVNUX1RZUEVfU1VQTCA9IDAsCi0gIElGX1JFUVVFU1RfVFlQRV9XSUZJLAotICBJRl9SRVFVRVNUX1RZUEVfQU5ZCi19IGN0cmxfaWZfcmVxX3R5cGVfZV90eXBlOwotCi10eXBlZGVmIGVudW0gewotICBJRl9SRVFVRVNUX1NFTkRFUl9JRF9RVUlQQyA9IDAsCi0gIElGX1JFUVVFU1RfU0VOREVSX0lEX01TQVBNLAotICBJRl9SRVFVRVNUX1NFTkRFUl9JRF9NU0FQVSwKLSAgSUZfUkVRVUVTVF9TRU5ERVJfSURfR1BTT05FX0RBRU1PTiwKLSAgSUZfUkVRVUVTVF9TRU5ERVJfSURfTU9ERU0KLX0gY3RybF9pZl9yZXFfc2VuZGVyX2lkX2VfdHlwZTsKLQotc3RydWN0IGN0cmxfbXNnX2lmX3JlcXVlc3QgewotICAgIGN0cmxfaWZfcmVxX3R5cGVfZV90eXBlIHR5cGU7Ci0gICAgY3RybF9pZl9yZXFfc2VuZGVyX2lkX2VfdHlwZSBzZW5kZXJfaWQ7Ci0gICAgdW5zaWduZWQgbG9uZyBpcHY0X2FkZHI7Ci0gICAgdW5zaWduZWQgY2hhciBpcHY2X2FkZHJbMTZdOwotICAgIGNoYXIgc3NpZFtTU0lEX0JVRl9TSVpFXTsKLSAgICBjaGFyIHBhc3N3b3JkW1NTSURfQlVGX1NJWkVdOwotfTsKLQotLyogZG8gbm90IGNoYW5nZSB0aGlzIHN0cnVjdHVyZSAqLwotc3RydWN0IGN0cmxfbXNnYnVmIHsKLSAgICBzaXplX3QgbXNnc3o7Ci0gICAgdWludDE2X3QgcmVzZXJ2ZWQxOwotICAgIHVpbnQzMl90IHJlc2VydmVkMjsKLSAgICB1aW50OF90IGN0cmxfdHlwZTsKLSAgICB1bmlvbiB7Ci0gICAgICAgIHN0cnVjdCBjdHJsX21zZ19yZXNwb25zZSAgIGNtc2dfcmVzcG9uc2U7Ci0gICAgICAgIHN0cnVjdCBjdHJsX21zZ191bmJsb2NrICAgIGNtc2dfdW5ibG9jazsKLSAgICAgICAgc3RydWN0IGN0cmxfbXNnX2lmX3JlcXVlc3QgY21zZ19pZl9yZXF1ZXN0OwotICAgIH0gY21zZzsKLX07Ci0KLWV4dGVybiB2b2lkKiBsb2NfYXBpX2hhbmRsZTsKLQotaW50IGxvY19lbmdfZG1uX2Nvbm5fbG9jX2FwaV9zZXJ2ZXJfaWZfcmVxdWVzdF9oYW5kbGVyKHN0cnVjdCBjdHJsX21zZ2J1ZiAqcG1zZywgaW50IGxlbik7Ci1pbnQgbG9jX2VuZ19kbW5fY29ubl9sb2NfYXBpX3NlcnZlcl9pZl9yZWxlYXNlX2hhbmRsZXIoc3RydWN0IGN0cmxfbXNnYnVmICpwbXNnLCBpbnQgbGVuKTsKLQotI2VuZGlmIC8qIExPQ19FTkdfREFUQV9TRVJWRVJfSEFORExFUiAqLwpkaWZmIC0tZ2l0IGEvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGlfNTAwMDEvbG9jX2VuZ19kbW5fY29ubl90aHJlYWRfaGVscGVyLmMgYi9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaV81MDAwMS9sb2NfZW5nX2Rtbl9jb25uX3RocmVhZF9oZWxwZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWZlZDlkNC4uMDAwMDAwMAotLS0gYS9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaV81MDAwMS9sb2NfZW5nX2Rtbl9jb25uX3RocmVhZF9oZWxwZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDM5OSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTEsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCi0gKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKLSAqICAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKLSAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAotICogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKLSAqIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KLSAqIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpbmNsdWRlICJsb2dfdXRpbC5oIgotI2luY2x1ZGUgInBsYXRmb3JtX2xpYl9pbmNsdWRlcy5oIgotI2luY2x1ZGUgImxvY19lbmdfZG1uX2Nvbm5fdGhyZWFkX2hlbHBlci5oIgotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotRlVOQ1RJT04gICAgdGhlbHBlcl9zaWduYWxfaW5pdAotCi1ERVNDUklQVElPTgotICAgVGhpcyBmdW5jdGlvbiB3aWxsIGluaXRpYWxpemUgdGhlIGNvbmRpdGlvbmFsIHZhcmlhYmxlIHJlc291cmNlcy4KLQotICAgdGhlbHBlciAtIHRoZWxwZXIgaW5zdGFuY2UKLQotREVQRU5ERU5DSUVTCi0gICBOb25lCi0KLVJFVFVSTiBWQUxVRQotICAgMDogc3VjY2VzcyBvciBuZWdhdGl2ZSB2YWx1ZSBmb3IgZmFpbHVyZQotCi1TSURFIEVGRkVDVFMKLSAgIE4vQQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotaW50IHRoZWxwZXJfc2lnbmFsX2luaXQoc3RydWN0IGxvY19lbmdfZG1uX2Nvbm5fdGhlbHBlciAqIHRoZWxwZXIpCi17Ci0gICAgaW50IHJlc3VsdDsKLSAgICB0aGVscGVyLT50aHJlYWRfZXhpdCAgPSAwOwotICAgIHRoZWxwZXItPnRocmVhZF9yZWFkeSA9IDA7Ci0gICAgcmVzdWx0ID0gcHRocmVhZF9jb25kX2luaXQoICZ0aGVscGVyLT50aHJlYWRfY29uZCwgTlVMTCk7Ci0gICAgaWYgKHJlc3VsdCkgewotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHJlc3VsdCA9IHB0aHJlYWRfbXV0ZXhfaW5pdCgmdGhlbHBlci0+dGhyZWFkX211dGV4LCBOVUxMKTsKLSAgICBpZiAocmVzdWx0KSB7Ci0gICAgICAgIHB0aHJlYWRfY29uZF9kZXN0cm95KCZ0aGVscGVyLT50aHJlYWRfY29uZCk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1GVU5DVElPTgotCi1ERVNDUklQVElPTgotICAgVGhpcyBmdW5jdGlvbiB3aWxsIGRlc3Ryb3kgdGhlIGNvbmRpdGlvbmFsIHZhcmlhYmxlIHJlc291cmNlcwotCi0gICAgdGhlbHBlciAtIHBvaW50ZXIgdG8gdGhlbHBlciBpbnN0YW5jZQotCi1ERVBFTkRFTkNJRVMKLSAgIE5vbmUKLQotUkVUVVJOIFZBTFVFCi0gICAwOiBzdWNjZXNzIG9yIG5lZ2F0aXZlIHZhbHVlIGZvciBmYWlsdXJlCi0KLVNJREUgRUZGRUNUUwotICAgTi9BCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi1pbnQgdGhlbHBlcl9zaWduYWxfZGVzdHJveShzdHJ1Y3QgbG9jX2VuZ19kbW5fY29ubl90aGVscGVyICogdGhlbHBlcikKLXsKLSAgICBpbnQgcmVzdWx0LCByZXRfcmVzdWx0ID0gMDsKLSAgICByZXN1bHQgPSBwdGhyZWFkX2NvbmRfZGVzdHJveSggJnRoZWxwZXItPnRocmVhZF9jb25kKTsKLSAgICBpZiAocmVzdWx0KSB7Ci0gICAgICAgIHJldF9yZXN1bHQgPSByZXN1bHQ7Ci0gICAgfQotCi0gICAgcmVzdWx0ID0gcHRocmVhZF9tdXRleF9kZXN0cm95KCZ0aGVscGVyLT50aHJlYWRfbXV0ZXgpOwotICAgIGlmIChyZXN1bHQpIHsKLSAgICAgICAgcmV0X3Jlc3VsdCA9IHJlc3VsdDsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmV0X3Jlc3VsdDsKLX0KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLUZVTkNUSU9OICAgIHRoZWxwZXJfc2lnbmFsX3dhaXQKLQotREVTQ1JJUFRJT04KLSAgIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBibG9ja2VkIG9uIHRoZSBjb25kaXRpb25hbCB2YXJpYWJsZSB1bnRpbCB0aGVscGVyX3NpZ25hbF9yZWFkeQotICAgaXMgY2FsbGVkCi0KLSAgICB0aGVscGVyIC0gcG9pbnRlciB0byB0aGVscGVyIGluc3RhbmNlCi0KLURFUEVOREVOQ0lFUwotICAgTm9uZQotCi1SRVRVUk4gVkFMVUUKLSAgIDA6IHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgdmFsdWUgZm9yIGZhaWx1cmUKLQotU0lERSBFRkZFQ1RTCi0gICBOL0EKLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLWludCB0aGVscGVyX3NpZ25hbF93YWl0KHN0cnVjdCBsb2NfZW5nX2Rtbl9jb25uX3RoZWxwZXIgKiB0aGVscGVyKQotewotICAgIGludCByZXN1bHQgPSAwOwotCi0gICAgcHRocmVhZF9tdXRleF9sb2NrKCZ0aGVscGVyLT50aHJlYWRfbXV0ZXgpOwotICAgIGlmICghdGhlbHBlci0+dGhyZWFkX3JlYWR5ICYmICF0aGVscGVyLT50aHJlYWRfZXhpdCkgewotICAgICAgICByZXN1bHQgPSBwdGhyZWFkX2NvbmRfd2FpdCgmdGhlbHBlci0+dGhyZWFkX2NvbmQsICZ0aGVscGVyLT50aHJlYWRfbXV0ZXgpOwotICAgIH0KLQotICAgIGlmICh0aGVscGVyLT50aHJlYWRfZXhpdCkgewotICAgICAgICByZXN1bHQgPSAtMTsKLSAgICB9Ci0gICAgcHRocmVhZF9tdXRleF91bmxvY2soJnRoZWxwZXItPnRocmVhZF9tdXRleCk7Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotRlVOQ1RJT04gICAgIHRoZWxwZXJfc2lnbmFsX3JlYWR5Ci0KLURFU0NSSVBUSU9OCi0gICBUaGlzIGZ1bmN0aW9uIHdpbGwgd2FrZSB1cCB0aGUgY29uZGl0aW9uYWwgdmFyaWFibGUKLQotICAgIHRoZWxwZXIgLSBwb2ludGVyIHRvIHRoZWxwZXIgaW5zdGFuY2UKLQotREVQRU5ERU5DSUVTCi0gICBOb25lCi0KLVJFVFVSTiBWQUxVRQotICAgMDogc3VjY2VzcyBvciBuZWdhdGl2ZSB2YWx1ZSBmb3IgZmFpbHVyZQotCi1TSURFIEVGRkVDVFMKLSAgIE4vQQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotaW50IHRoZWxwZXJfc2lnbmFsX3JlYWR5KHN0cnVjdCBsb2NfZW5nX2Rtbl9jb25uX3RoZWxwZXIgKiB0aGVscGVyKQotewotICAgIGludCByZXN1bHQ7Ci0KLSAgICBMT0NfTE9HRCgiJXM6JWRdIDB4JWx4XG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIChsb25nKSB0aGVscGVyKTsKLQotICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmdGhlbHBlci0+dGhyZWFkX211dGV4KTsKLSAgICB0aGVscGVyLT50aHJlYWRfcmVhZHkgPSAxOwotICAgIHJlc3VsdCA9IHB0aHJlYWRfY29uZF9zaWduYWwoJnRoZWxwZXItPnRocmVhZF9jb25kKTsKLSAgICBwdGhyZWFkX211dGV4X3VubG9jaygmdGhlbHBlci0+dGhyZWFkX211dGV4KTsKLQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1GVU5DVElPTiAgICAgdGhlbHBlcl9zaWduYWxfYmxvY2sKLQotREVTQ1JJUFRJT04KLSAgIFRoaXMgZnVuY3Rpb24gd2lsbCBzZXQgdGhlIHRocmVhZCByZWFkeSB0byAwIHRvIGJsb2NrIHRoZSB0aGVscGVyX3NpZ25hbF93YWl0Ci0KLSAgICB0aGVscGVyIC0gcG9pbnRlciB0byB0aGVscGVyIGluc3RhbmNlCi0KLURFUEVOREVOQ0lFUwotICAgTm9uZQotCi1SRVRVUk4gVkFMVUUKLSAgIGlmIHRocmVhZF9yZWFkeSBpcyBzZXQKLQotU0lERSBFRkZFQ1RTCi0gICBOL0EKLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLWludCB0aGVscGVyX3NpZ25hbF9ibG9jayhzdHJ1Y3QgbG9jX2VuZ19kbW5fY29ubl90aGVscGVyICogdGhlbHBlcikKLXsKLSAgICBpbnQgcmVzdWx0ID0gdGhlbHBlci0+dGhyZWFkX3JlYWR5OwotCi0gICAgTE9DX0xPR0QoIiVzOiVkXSAweCVseFxuIiwgX19mdW5jX18sIF9fTElORV9fLCAobG9uZykgdGhlbHBlcik7Ci0KLSAgICBwdGhyZWFkX211dGV4X2xvY2soJnRoZWxwZXItPnRocmVhZF9tdXRleCk7Ci0gICAgdGhlbHBlci0+dGhyZWFkX3JlYWR5ID0gMDsKLSAgICBwdGhyZWFkX211dGV4X3VubG9jaygmdGhlbHBlci0+dGhyZWFkX211dGV4KTsKLQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1GVU5DVElPTiAgICB0aGVscGVyX21haW4KLQotREVTQ1JJUFRJT04KLSAgIFRoaXMgZnVuY3Rpb24gaXMgdGhlIG1haW4gdGhyZWFkLiBJdCB3aWxsIGJlIGxhdW5jaGVkIGFzIGEgY2hpbGQgdGhyZWFkCi0KLSAgICBkYXRhIC0gcG9pbnRlciB0byB0aGUgaW5zdGFuY2UKLQotREVQRU5ERU5DSUVTCi0gICBOb25lCi0KLVJFVFVSTiBWQUxVRQotICAgTlVMTAotCi1TSURFIEVGRkVDVFMKLSAgIE4vQQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotc3RhdGljIHZvaWQgKiB0aGVscGVyX21haW4odm9pZCAqZGF0YSkKLXsKLSAgICBpbnQgcmVzdWx0ID0gMDsKLSAgICBzdHJ1Y3QgbG9jX2VuZ19kbW5fY29ubl90aGVscGVyICogdGhlbHBlciA9IChzdHJ1Y3QgbG9jX2VuZ19kbW5fY29ubl90aGVscGVyICopIGRhdGE7Ci0KLSAgICBpZiAodGhlbHBlci0+dGhyZWFkX3Byb2NfaW5pdCkgewotICAgICAgICByZXN1bHQgPSB0aGVscGVyLT50aHJlYWRfcHJvY19pbml0KHRoZWxwZXItPnRocmVhZF9jb250ZXh0KTsKLSAgICAgICAgaWYgKHJlc3VsdCA8IDApIHsKLSAgICAgICAgICAgIHRoZWxwZXItPnRocmVhZF9leGl0ID0gMTsKLSAgICAgICAgICAgIHRoZWxwZXJfc2lnbmFsX3JlYWR5KHRoZWxwZXIpOwotICAgICAgICAgICAgTE9DX0xPR0UoIiVzOiVkXSBlcnJvcjogMHglbHhcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgKGxvbmcpIHRoZWxwZXIpOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB0aGVscGVyX3NpZ25hbF9yZWFkeSh0aGVscGVyKTsKLQotICAgIGlmICh0aGVscGVyLT50aHJlYWRfcHJvY19wcmUpIHsKLSAgICAgICAgcmVzdWx0ID0gdGhlbHBlci0+dGhyZWFkX3Byb2NfcHJlKHRoZWxwZXItPnRocmVhZF9jb250ZXh0KTsKLSAgICAgICAgaWYgKHJlc3VsdCA8IDApIHsKLSAgICAgICAgICAgIHRoZWxwZXItPnRocmVhZF9leGl0ID0gMTsKLSAgICAgICAgICAgIExPQ19MT0dFKCIlczolZF0gZXJyb3I6IDB4JWx4XG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIChsb25nKSB0aGVscGVyKTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZG8gewotICAgICAgICBpZiAodGhlbHBlci0+dGhyZWFkX3Byb2MpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IHRoZWxwZXItPnRocmVhZF9wcm9jKHRoZWxwZXItPnRocmVhZF9jb250ZXh0KTsKLSAgICAgICAgICAgIGlmIChyZXN1bHQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgdGhlbHBlci0+dGhyZWFkX2V4aXQgPSAxOwotICAgICAgICAgICAgICAgIExPQ19MT0dFKCIlczolZF0gZXJyb3I6IDB4JWx4XG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIChsb25nKSB0aGVscGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gd2hpbGUgKHRoZWxwZXItPnRocmVhZF9leGl0ID09IDApOwotCi0gICAgaWYgKHRoZWxwZXItPnRocmVhZF9wcm9jX3Bvc3QpIHsKLSAgICAgICAgcmVzdWx0ID0gdGhlbHBlci0+dGhyZWFkX3Byb2NfcG9zdCh0aGVscGVyLT50aHJlYWRfY29udGV4dCk7Ci0gICAgfQotCi0gICAgaWYgKHJlc3VsdCAhPSAwKSB7Ci0gICAgICAgIExPQ19MT0dFKCIlczolZF0gZXJyb3I6IDB4JWx4XG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIChsb25nKSB0aGVscGVyKTsKLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyB2b2lkIHRoZWxwZXJfbWFpbl8yKHZvaWQgKmRhdGEpCi17Ci0gICAgdGhlbHBlcl9tYWluKGRhdGEpOwotICAgIHJldHVybjsKLX0KLQotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotRlVOQ1RJT04gICAgbG9jX2VuZ19kbW5fY29ubl9sYXVuY2hfdGhlbHBlcgotCi1ERVNDUklQVElPTgotICAgVGhpcyBmdW5jdGlvbiB3aWxsIGluaXRpYWxpemUgdGhlIHRocmVhZCBjb250ZXh0IGFuZCBsYXVuY2ggdGhlIHRoZWxwZXJfbWFpbgotCi0gICAgdGhlbHBlciAtIHBvaW50ZXIgdG8gdGhlbHBlciBpbnN0YW5jZQotICAgIHRocmVhZF9wcm9jX2luaXQgLSBUaGUgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24gcG9pbnRlcgotICAgIHRocmVhZF9wcm9jX3ByZSAgLSBUaGUgZnVuY3Rpb24gdG8gY2FsbCBiZWZvcmUgdGFzayBsb29wIGFuZCBhZnRlciBpbml0aWFsaXphdGlvbgotICAgIHRocmVhZF9wcm9jICAgICAgLSBUaGUgdGFzayBsb29wCi0gICAgdGhyZWFkX3Byb2NfcG9zdCAtIFRoZSBmdW5jdGlvbiB0byBjYWxsIGFmdGVyIHRoZSB0YXNrIGxvb3AKLSAgICBjb250ZXh0ICAgICAgICAgIC0gdGhlIGNvbnRleHQgZm9yIHRoZSBhYm92ZSBmb3VyIGZ1bmN0aW9ucwotCi1ERVBFTkRFTkNJRVMKLSAgIE5vbmUKLQotUkVUVVJOIFZBTFVFCi0gICAwOiBzdWNjZXNzIG9yIG5lZ2F0aXZlIHZhbHVlIGZvciBmYWlsdXJlCi0KLVNJREUgRUZGRUNUUwotICAgTi9BCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi1pbnQgbG9jX2VuZ19kbW5fY29ubl9sYXVuY2hfdGhlbHBlcihzdHJ1Y3QgbG9jX2VuZ19kbW5fY29ubl90aGVscGVyICogdGhlbHBlciwKLSAgICBpbnQgKCp0aHJlYWRfcHJvY19pbml0KSAodm9pZCAqIGNvbnRleHQpLAotICAgIGludCAoKnRocmVhZF9wcm9jX3ByZSkgKHZvaWQgKiBjb250ZXh0KSwKLSAgICBpbnQgKCp0aHJlYWRfcHJvYykgKHZvaWQgKiBjb250ZXh0KSwKLSAgICBpbnQgKCp0aHJlYWRfcHJvY19wb3N0KSAodm9pZCAqIGNvbnRleHQpLAotICAgIHRoZWxwZXJfY3JlYXRlX3RocmVhZCAgIGNyZWF0ZV90aHJlYWRfY2IsCi0gICAgdm9pZCAqIGNvbnRleHQpCi17Ci0gICAgaW50IHJlc3VsdDsKLQotICAgIHRoZWxwZXJfc2lnbmFsX2luaXQodGhlbHBlcik7Ci0KLSAgICBpZiAoY29udGV4dCkgewotICAgICAgICB0aGVscGVyLT50aHJlYWRfY29udGV4dCAgICA9IGNvbnRleHQ7Ci0gICAgfQotCi0gICAgdGhlbHBlci0+dGhyZWFkX3Byb2NfaW5pdCAgPSB0aHJlYWRfcHJvY19pbml0OwotICAgIHRoZWxwZXItPnRocmVhZF9wcm9jX3ByZSAgID0gdGhyZWFkX3Byb2NfcHJlOwotICAgIHRoZWxwZXItPnRocmVhZF9wcm9jICAgICAgID0gdGhyZWFkX3Byb2M7Ci0gICAgdGhlbHBlci0+dGhyZWFkX3Byb2NfcG9zdCAgPSB0aHJlYWRfcHJvY19wb3N0OwotCi0gICAgTE9DX0xPR0QoIiVzOiVkXSAweCVseCBjYWxsIHB0aHJlYWRfY3JlYXRlXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIChsb25nKSB0aGVscGVyKTsKLSAgICBpZiAoY3JlYXRlX3RocmVhZF9jYikgewotICAgICAgICByZXN1bHQgPSAwOwotICAgICAgICB0aGVscGVyLT50aHJlYWRfaWQgPSBjcmVhdGVfdGhyZWFkX2NiKCJsb2NfZW5nX2Rtbl9jb25uIiwKLSAgICAgICAgICAgIHRoZWxwZXJfbWFpbl8yLCAodm9pZCAqKXRoZWxwZXIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlc3VsdCA9IHB0aHJlYWRfY3JlYXRlKCZ0aGVscGVyLT50aHJlYWRfaWQsIE5VTEwsCi0gICAgICAgICAgICB0aGVscGVyX21haW4sICh2b2lkICopdGhlbHBlcik7Ci0gICAgfQotCi0gICAgaWYgKHJlc3VsdCAhPSAwKSB7Ci0gICAgICAgIExPQ19MT0dFKCIlczolZF0gMHglbHhcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgKGxvbmcpIHRoZWxwZXIpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgTE9DX0xPR0QoIiVzOiVkXSAweCVseCBwdGhyZWFkX2NyZWF0ZSBkb25lXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIChsb25nKSB0aGVscGVyKTsKLQotICAgIHRoZWxwZXJfc2lnbmFsX3dhaXQodGhlbHBlcik7Ci0KLSAgICBMT0NfTE9HRCgiJXM6JWRdIDB4JWx4IHB0aHJlYWQgcmVhZHlcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgKGxvbmcpIHRoZWxwZXIpOwotICAgIHJldHVybiB0aGVscGVyLT50aHJlYWRfZXhpdDsKLX0KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLUZVTkNUSU9OICAgIGxvY19lbmdfZG1uX2Nvbm5fdW5ibG9ja190aGVscGVyCi0KLURFU0NSSVBUSU9OCi0gICBUaGlzIGZ1bmN0aW9uIHVuYmxvY2tzIHRoZWxwZXJfbWFpbiB0byByZWxlYXNlIHRoZSB0aHJlYWQKLQotICAgIHRoZWxwZXIgLSBwb2ludGVyIHRvIHRoZWxwZXIgaW5zdGFuY2UKLQotREVQRU5ERU5DSUVTCi0gICBOb25lCi0KLVJFVFVSTiBWQUxVRQotICAgMDogc3VjY2VzcwotCi1TSURFIEVGRkVDVFMKLSAgIE4vQQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotaW50IGxvY19lbmdfZG1uX2Nvbm5fdW5ibG9ja190aGVscGVyKHN0cnVjdCBsb2NfZW5nX2Rtbl9jb25uX3RoZWxwZXIgKiB0aGVscGVyKQotewotICAgIExPQ19MT0dEKCIlczolZF0gMHglbHhcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgKGxvbmcpIHRoZWxwZXIpOwotICAgIHRoZWxwZXItPnRocmVhZF9leGl0ID0gMTsKLSAgICByZXR1cm4gMDsKLX0KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLUZVTkNUSU9OICAgIGxvY19lbmdfZG1uX2Nvbm5fam9pbl90aGVscGVyCi0KLSAgICB0aGVscGVyIC0gcG9pbnRlciB0byB0aGVscGVyIGluc3RhbmNlCi0KLURFU0NSSVBUSU9OCi0gICBUaGlzIGZ1bmN0aW9uIHdpbGwgd2FpdCBmb3IgdGhlIHRocmVhZCBvZiB0aGVscGVyX21haW4gdG8gZmluaXNoCi0KLURFUEVOREVOQ0lFUwotICAgTm9uZQotCi1SRVRVUk4gVkFMVUUKLSAgIDA6IHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgdmFsdWUgZm9yIGZhaWx1cmUKLQotU0lERSBFRkZFQ1RTCi0gICBOL0EKLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLWludCBsb2NfZW5nX2Rtbl9jb25uX2pvaW5fdGhlbHBlcihzdHJ1Y3QgbG9jX2VuZ19kbW5fY29ubl90aGVscGVyICogdGhlbHBlcikKLXsKLSAgICBpbnQgcmVzdWx0OwotCi0gICAgTE9DX0xPR0QoIiVzOiVkXSAweCVseFxuIiwgX19mdW5jX18sIF9fTElORV9fLCAobG9uZykgdGhlbHBlcik7Ci0gICAgcmVzdWx0ID0gcHRocmVhZF9qb2luKHRoZWxwZXItPnRocmVhZF9pZCwgTlVMTCk7Ci0gICAgaWYgKHJlc3VsdCAhPSAwKSB7Ci0gICAgICAgIExPQ19MT0dFKCIlczolZF0gMHglbHhcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgKGxvbmcpIHRoZWxwZXIpOwotICAgIH0KLSAgICBMT0NfTE9HRCgiJXM6JWRdIDB4JWx4XG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIChsb25nKSB0aGVscGVyKTsKLQotICAgIHRoZWxwZXJfc2lnbmFsX2Rlc3Ryb3kodGhlbHBlcik7Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCmRpZmYgLS1naXQgYS9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaV81MDAwMS9sb2NfZW5nX2Rtbl9jb25uX3RocmVhZF9oZWxwZXIuaCBiL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpXzUwMDAxL2xvY19lbmdfZG1uX2Nvbm5fdGhyZWFkX2hlbHBlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWU1OThiLi4wMDAwMDAwCi0tLSBhL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpXzUwMDAxL2xvY19lbmdfZG1uX2Nvbm5fdGhyZWFkX2hlbHBlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDExLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZwotICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCi0gKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCi0gKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKLSAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCi0gKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCi0gKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLSNpZm5kZWYgX19MT0NfRU5HX0RNTl9DT05OX1RIUkVBRF9IRUxQRVJfSF9fCi0jZGVmaW5lIF9fTE9DX0VOR19ETU5fQ09OTl9USFJFQURfSEVMUEVSX0hfXwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLSNpbmNsdWRlIDxwdGhyZWFkLmg+Ci0KLXN0cnVjdCBsb2NfZW5nX2Rtbl9jb25uX3RoZWxwZXIgewotICAgIHVuc2lnbmVkIGNoYXIgICB0aHJlYWRfZXhpdDsKLSAgICB1bnNpZ25lZCBjaGFyICAgdGhyZWFkX3JlYWR5OwotICAgIHB0aHJlYWRfY29uZF90ICB0aHJlYWRfY29uZDsKLSAgICBwdGhyZWFkX211dGV4X3QgdGhyZWFkX211dGV4OwotICAgIHB0aHJlYWRfdCAgICAgICB0aHJlYWRfaWQ7Ci0gICAgdm9pZCAqICAgICAgICAgIHRocmVhZF9jb250ZXh0OwotICAgIGludCAgICAgICAgICAgICAoKnRocmVhZF9wcm9jX2luaXQpICh2b2lkICogY29udGV4dCk7Ci0gICAgaW50ICAgICAgICAgICAgICgqdGhyZWFkX3Byb2NfcHJlKSAgKHZvaWQgKiBjb250ZXh0KTsKLSAgICBpbnQgICAgICAgICAgICAgKCp0aHJlYWRfcHJvYykgICAgICAodm9pZCAqIGNvbnRleHQpOwotICAgIGludCAgICAgICAgICAgICAoKnRocmVhZF9wcm9jX3Bvc3QpICh2b2lkICogY29udGV4dCk7Ci19OwotCi10eXBlZGVmIHB0aHJlYWRfdCAoKiB0aGVscGVyX2NyZWF0ZV90aHJlYWQpKGNvbnN0IGNoYXIqIG5hbWUsIHZvaWQgKCpzdGFydCkodm9pZCAqKSwgdm9pZCogYXJnKTsKLWludCBsb2NfZW5nX2Rtbl9jb25uX2xhdW5jaF90aGVscGVyKHN0cnVjdCBsb2NfZW5nX2Rtbl9jb25uX3RoZWxwZXIgKiB0aGVscGVyLAotICAgIGludCAoKnRocmVhZF9wcm9jX2luaXQpICh2b2lkICogY29udGV4dCksCi0gICAgaW50ICgqdGhyZWFkX3Byb2NfcHJlKSAgKHZvaWQgKiBjb250ZXh0KSwKLSAgICBpbnQgKCp0aHJlYWRfcHJvYykgICAgICAodm9pZCAqIGNvbnRleHQpLAotICAgIGludCAoKnRocmVhZF9wcm9jX3Bvc3QpICh2b2lkICogY29udGV4dCksCi0gICAgdGhlbHBlcl9jcmVhdGVfdGhyZWFkICAgY3JlYXRlX3RocmVhZF9jYiwKLSAgICB2b2lkICogY29udGV4dCk7Ci0KLWludCBsb2NfZW5nX2Rtbl9jb25uX3VuYmxvY2tfdGhlbHBlcihzdHJ1Y3QgbG9jX2VuZ19kbW5fY29ubl90aGVscGVyICogdGhlbHBlcik7Ci1pbnQgbG9jX2VuZ19kbW5fY29ubl9qb2luX3RoZWxwZXIoc3RydWN0IGxvY19lbmdfZG1uX2Nvbm5fdGhlbHBlciAqIHRoZWxwZXIpOwotCi0vKiBpZiBvbmx5IG5lZWQgdG8gdXNlIHNpZ25hbCAqLwotaW50IHRoZWxwZXJfc2lnbmFsX2luaXQoc3RydWN0IGxvY19lbmdfZG1uX2Nvbm5fdGhlbHBlciAqIHRoZWxwZXIpOwotaW50IHRoZWxwZXJfc2lnbmFsX2Rlc3Ryb3koc3RydWN0IGxvY19lbmdfZG1uX2Nvbm5fdGhlbHBlciAqIHRoZWxwZXIpOwotaW50IHRoZWxwZXJfc2lnbmFsX3dhaXQoc3RydWN0IGxvY19lbmdfZG1uX2Nvbm5fdGhlbHBlciAqIHRoZWxwZXIpOwotaW50IHRoZWxwZXJfc2lnbmFsX3JlYWR5KHN0cnVjdCBsb2NfZW5nX2Rtbl9jb25uX3RoZWxwZXIgKiB0aGVscGVyKTsKLWludCB0aGVscGVyX3NpZ25hbF9ibG9jayhzdHJ1Y3QgbG9jX2VuZ19kbW5fY29ubl90aGVscGVyICogdGhlbHBlcik7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLSNlbmRpZiAvKiBfX0xPQ19FTkdfRE1OX0NPTk5fVEhSRUFEX0hFTFBFUl9IX18gKi8KZGlmZiAtLWdpdCBhL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpXzUwMDAxL2xvY19lbmdfbG9nLmNwcCBiL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpXzUwMDAxL2xvY19lbmdfbG9nLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2EzNDE2Ny4uMDAwMDAwMAotLS0gYS9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaV81MDAwMS9sb2NfZW5nX2xvZy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxMywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKLSAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAotICogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiwgbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKLSAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAotICogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKLSAqIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KLSAqIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jZGVmaW5lIExPR19ORERFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiTG9jU3ZjX2VuZyIKLQotI2luY2x1ZGUgImxvY19sb2cuaCIKLSNpbmNsdWRlICJsb2NfZW5nX2xvZy5oIgotCmRpZmYgLS1naXQgYS9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaV81MDAwMS9sb2NfZW5nX2xvZy5oIGIvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGlfNTAwMDEvbG9jX2VuZ19sb2cuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTY4YmQ4NC4uMDAwMDAwMAotLS0gYS9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaV81MDAwMS9sb2NfZW5nX2xvZy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDExLTIwMTMsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCi0gKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKLSAqICAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24sIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCi0gKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKLSAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCi0gKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCi0gKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2lmbmRlZiBMT0NfRU5HX0xPR19ICi0jZGVmaW5lIExPQ19FTkdfTE9HX0gKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi17Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZiAvKiBMT0NfRU5HX0xPR19IICovCmRpZmYgLS1naXQgYS9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaV81MDAwMS9sb2NfZW5nX21zZy5oIGIvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGlfNTAwMDEvbG9jX2VuZ19tc2cuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNjNDhmYi4uMDAwMDAwMAotLS0gYS9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaV81MDAwMS9sb2NfZW5nX21zZy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzEzICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMS0yMDEzLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZwotICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCi0gKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uLCBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAotICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgotICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCi0gKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQotICogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgotICogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0jaWZuZGVmIExPQ19FTkdfTVNHX0gKLSNkZWZpbmUgTE9DX0VOR19NU0dfSAotCi0KLSNpbmNsdWRlIDxoYXJkd2FyZS9ncHMuaD4KLSNpbmNsdWRlIDxncHNfZXh0ZW5kZWQuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxsb2dfdXRpbC5oPgotI2luY2x1ZGUgPGxvY19lbmdfbG9nLmg+Ci0jaW5jbHVkZSA8bG9jX2VuZy5oPgotI2luY2x1ZGUgPE1zZ1Rhc2suaD4KLSNpbmNsdWRlIDxMb2NFbmdBZGFwdGVyLmg+Ci0KLSNpZm5kZWYgU1NJRF9CVUZfU0laRQotICAgICNkZWZpbmUgU1NJRF9CVUZfU0laRSAoMzIrMSkKLSNlbmRpZgotI2lmZGVmIFVTRV9HTElCCi0KLSNpbmNsdWRlIDxnbGliLmg+Ci0KLSNlbmRpZiAvKiBVU0VfR0xJQiAqLwotI2luY2x1ZGUgInBsYXRmb3JtX2xpYl9pbmNsdWRlcy5oIgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLXVzaW5nIG5hbWVzcGFjZSBsb2NfY29yZTsKLQotc3RydWN0IExvY0VuZ1Bvc2l0aW9uTW9kZSA6IHB1YmxpYyBMb2NNc2cgewotICAgIExvY0VuZ0FkYXB0ZXIqIG1BZGFwdGVyOwotICAgIGNvbnN0IExvY1Bvc01vZGUgbVBvc01vZGU7Ci0gICAgTG9jRW5nUG9zaXRpb25Nb2RlKExvY0VuZ0FkYXB0ZXIqIGFkYXB0ZXIsIExvY1Bvc01vZGUgJm1vZGUpOwotICAgIHZpcnR1YWwgdm9pZCBwcm9jKCkgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkIGxvZygpIGNvbnN0OwotICAgIHZvaWQgc2VuZCgpIGNvbnN0OwotfTsKLQotCi1zdHJ1Y3QgTG9jRW5nU3RhcnRGaXggOiBwdWJsaWMgTG9jTXNnIHsKLSAgICBMb2NFbmdBZGFwdGVyKiBtQWRhcHRlcjsKLSAgICBMb2NFbmdTdGFydEZpeChMb2NFbmdBZGFwdGVyKiBhZGFwdGVyKTsKLSAgICB2aXJ0dWFsIHZvaWQgcHJvYygpIGNvbnN0OwotICAgIHZvaWQgbG9jYWxsb2coKSBjb25zdDsKLSAgICB2aXJ0dWFsIHZvaWQgbG9nKCkgY29uc3Q7Ci0gICAgdm9pZCBzZW5kKCkgY29uc3Q7Ci19OwotCi1zdHJ1Y3QgTG9jRW5nU3RvcEZpeCA6IHB1YmxpYyBMb2NNc2cgewotICAgIExvY0VuZ0FkYXB0ZXIqIG1BZGFwdGVyOwotICAgIExvY0VuZ1N0b3BGaXgoTG9jRW5nQWRhcHRlciogYWRhcHRlcik7Ci0gICAgdmlydHVhbCB2b2lkIHByb2MoKSBjb25zdDsKLSAgICB2b2lkIGxvY2FsbG9nKCkgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkIGxvZygpIGNvbnN0OwotICAgIHZvaWQgc2VuZCgpIGNvbnN0OwotfTsKLQotc3RydWN0IExvY0VuZ1JlcG9ydFBvc2l0aW9uIDogcHVibGljIExvY01zZyB7Ci0gICAgTG9jQWRhcHRlckJhc2UqIG1BZGFwdGVyOwotICAgIGNvbnN0IFVscExvY2F0aW9uIG1Mb2NhdGlvbjsKLSAgICBjb25zdCBHcHNMb2NhdGlvbkV4dGVuZGVkIG1Mb2NhdGlvbkV4dGVuZGVkOwotICAgIGNvbnN0IHZvaWQqIG1Mb2NhdGlvbkV4dDsKLSAgICBjb25zdCBlbnVtIGxvY19zZXNzX3N0YXR1cyBtU3RhdHVzOwotICAgIGNvbnN0IExvY1Bvc1RlY2hNYXNrIG1UZWNoTWFzazsKLSAgICBMb2NFbmdSZXBvcnRQb3NpdGlvbihMb2NBZGFwdGVyQmFzZSogYWRhcHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBVbHBMb2NhdGlvbiAmbG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgIEdwc0xvY2F0aW9uRXh0ZW5kZWQgJmxvY0V4dGVuZGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGxvY0V4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIGxvY19zZXNzX3N0YXR1cyBzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBMb2NQb3NUZWNoTWFzayB0ZWNobm9sb2d5KTsKLSAgICB2aXJ0dWFsIHZvaWQgcHJvYygpIGNvbnN0OwotICAgIHZvaWQgbG9jYWxsb2coKSBjb25zdDsKLSAgICB2aXJ0dWFsIHZvaWQgbG9nKCkgY29uc3Q7Ci0gICAgdm9pZCBzZW5kKCkgY29uc3Q7Ci19OwotCi1zdHJ1Y3QgTG9jRW5nUmVwb3J0U3YgOiBwdWJsaWMgTG9jTXNnIHsKLSAgICBMb2NBZGFwdGVyQmFzZSogbUFkYXB0ZXI7Ci0gICAgY29uc3QgR3BzU3ZTdGF0dXMgbVN2U3RhdHVzOwotICAgIGNvbnN0IEdwc0xvY2F0aW9uRXh0ZW5kZWQgbUxvY2F0aW9uRXh0ZW5kZWQ7Ci0gICAgY29uc3Qgdm9pZCogbVN2RXh0OwotICAgIExvY0VuZ1JlcG9ydFN2KExvY0FkYXB0ZXJCYXNlKiBhZGFwdGVyLAotICAgICAgICAgICAgICAgICAgIEdwc1N2U3RhdHVzICZzdiwKLSAgICAgICAgICAgICAgICAgICBHcHNMb2NhdGlvbkV4dGVuZGVkICZsb2NFeHRlbmRlZCwKLSAgICAgICAgICAgICAgICAgICB2b2lkKiBzdkV4dGVuZGVkKTsKLSAgICB2aXJ0dWFsIHZvaWQgcHJvYygpIGNvbnN0OwotICAgIHZvaWQgbG9jYWxsb2coKSBjb25zdDsKLSAgICB2aXJ0dWFsIHZvaWQgbG9nKCkgY29uc3Q7Ci0gICAgdm9pZCBzZW5kKCkgY29uc3Q7Ci19OwotCi1zdHJ1Y3QgTG9jRW5nUmVwb3J0U3RhdHVzIDogcHVibGljIExvY01zZyB7Ci0gICAgTG9jQWRhcHRlckJhc2UqIG1BZGFwdGVyOwotICAgIGNvbnN0IEdwc1N0YXR1c1ZhbHVlIG1TdGF0dXM7Ci0gICAgTG9jRW5nUmVwb3J0U3RhdHVzKExvY0FkYXB0ZXJCYXNlKiBhZGFwdGVyLAotICAgICAgICAgICAgICAgICAgICAgICBHcHNTdGF0dXNWYWx1ZSBlbmdpbmVTdGF0dXMpOwotICAgIHZpcnR1YWwgdm9pZCBwcm9jKCkgY29uc3Q7Ci0gICAgdm9pZCBsb2NhbGxvZygpIGNvbnN0OwotICAgIHZpcnR1YWwgdm9pZCBsb2coKSBjb25zdDsKLX07Ci0KLXN0cnVjdCBMb2NFbmdSZXBvcnRObWVhIDogcHVibGljIExvY01zZyB7Ci0gICAgdm9pZCogbUxvY0VuZzsKLSAgICBjaGFyKiBjb25zdCBtTm1lYTsKLSAgICBjb25zdCBpbnQgbUxlbjsKLSAgICBMb2NFbmdSZXBvcnRObWVhKHZvaWQqIGxvY0VuZywKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGRhdGEsIGludCBsZW4pOwotICAgIGlubGluZSB2aXJ0dWFsIH5Mb2NFbmdSZXBvcnRObWVhKCkKLSAgICB7Ci0gICAgICAgIGRlbGV0ZVtdIG1ObWVhOwotICAgIH0KLSAgICB2aXJ0dWFsIHZvaWQgcHJvYygpIGNvbnN0OwotICAgIHZvaWQgbG9jYWxsb2coKSBjb25zdDsKLSAgICB2aXJ0dWFsIHZvaWQgbG9nKCkgY29uc3Q7Ci19OwotCi1zdHJ1Y3QgTG9jRW5nUmVwb3J0WHRyYVNlcnZlciA6IHB1YmxpYyBMb2NNc2cgewotICAgIHZvaWQqIG1Mb2NFbmc7Ci0gICAgaW50IG1NYXhMZW47Ci0gICAgY2hhciAqbVNlcnZlcnM7Ci0gICAgTG9jRW5nUmVwb3J0WHRyYVNlcnZlcih2b2lkKiBsb2NFbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp1cmwxLCBjb25zdCBjaGFyICp1cmwyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdXJsMywgY29uc3QgaW50IG1heGxlbmd0aCk7Ci0gICAgaW5saW5lIHZpcnR1YWwgfkxvY0VuZ1JlcG9ydFh0cmFTZXJ2ZXIoKQotICAgIHsKLSAgICAgICAgZGVsZXRlW10gbVNlcnZlcnM7Ci0gICAgfQotICAgIHZpcnR1YWwgdm9pZCBwcm9jKCkgY29uc3Q7Ci0gICAgdm9pZCBsb2NhbGxvZygpIGNvbnN0OwotICAgIHZpcnR1YWwgdm9pZCBsb2coKSBjb25zdDsKLX07Ci0KLXN0cnVjdCBMb2NFbmdTdXBsRXNPcGVuZWQgOiBwdWJsaWMgTG9jTXNnIHsKLSAgICB2b2lkKiBtTG9jRW5nOwotICAgIExvY0VuZ1N1cGxFc09wZW5lZCh2b2lkKiBsb2NFbmcpOwotICAgIHZpcnR1YWwgdm9pZCBwcm9jKCkgY29uc3Q7Ci0gICAgdm9pZCBsb2NhbGxvZygpIGNvbnN0OwotICAgIHZpcnR1YWwgdm9pZCBsb2coKSBjb25zdDsKLX07Ci0KLXN0cnVjdCBMb2NFbmdTdXBsRXNDbG9zZWQgOiBwdWJsaWMgTG9jTXNnIHsKLSAgICB2b2lkKiBtTG9jRW5nOwotICAgIExvY0VuZ1N1cGxFc0Nsb3NlZCh2b2lkKiBsb2NFbmcpOwotICAgIHZpcnR1YWwgdm9pZCBwcm9jKCkgY29uc3Q7Ci0gICAgdm9pZCBsb2NhbGxvZygpIGNvbnN0OwotICAgIHZpcnR1YWwgdm9pZCBsb2coKSBjb25zdDsKLX07Ci0KLXN0cnVjdCBMb2NFbmdSZXF1ZXN0U3VwbEVzIDogcHVibGljIExvY01zZyB7Ci0gICAgdm9pZCogbUxvY0VuZzsKLSAgICBjb25zdCBpbnQgbUlEOwotICAgIExvY0VuZ1JlcXVlc3RTdXBsRXModm9pZCogbG9jRW5nLCBpbnQgaWQpOwotICAgIHZpcnR1YWwgdm9pZCBwcm9jKCkgY29uc3Q7Ci0gICAgdm9pZCBsb2NhbGxvZygpIGNvbnN0OwotICAgIHZpcnR1YWwgdm9pZCBsb2coKSBjb25zdDsKLX07Ci0KLXN0cnVjdCBMb2NFbmdSZXF1ZXN0QVRMIDogcHVibGljIExvY01zZyB7Ci0gICAgdm9pZCogbUxvY0VuZzsKLSAgICBjb25zdCBpbnQgbUlEOwotICAgIGNvbnN0IEFHcHNFeHRUeXBlIG1UeXBlOwotICAgIExvY0VuZ1JlcXVlc3RBVEwodm9pZCogbG9jRW5nLCBpbnQgaWQsCi0gICAgICAgICAgICAgICAgICAgICBBR3BzRXh0VHlwZSBhZ3BzX3R5cGUpOwotICAgIHZpcnR1YWwgdm9pZCBwcm9jKCkgY29uc3Q7Ci0gICAgdm9pZCBsb2NhbGxvZygpIGNvbnN0OwotICAgIHZpcnR1YWwgdm9pZCBsb2coKSBjb25zdDsKLX07Ci0KLXN0cnVjdCBMb2NFbmdSZWxlYXNlQVRMIDogcHVibGljIExvY01zZyB7Ci0gICAgdm9pZCogbUxvY0VuZzsKLSAgICBjb25zdCBpbnQgbUlEOwotICAgIExvY0VuZ1JlbGVhc2VBVEwodm9pZCogbG9jRW5nLCBpbnQgaWQpOwotICAgIHZpcnR1YWwgdm9pZCBwcm9jKCkgY29uc3Q7Ci0gICAgdm9pZCBsb2NhbGxvZygpIGNvbnN0OwotICAgIHZpcnR1YWwgdm9pZCBsb2coKSBjb25zdDsKLX07Ci0KLXN0cnVjdCBMb2NFbmdSZXFSZWxCSVQgOiBwdWJsaWMgTG9jTXNnIHsKLSAgICB2b2lkKiBtTG9jRW5nOwotICAgIGNvbnN0IEFHcHNFeHRUeXBlIG1UeXBlOwotICAgIGNvbnN0IGludCBtSVB2NEFkZHI7Ci0gICAgY2hhciogY29uc3QgbUlQdjZBZGRyOwotICAgIGNvbnN0IGJvb2wgbUlzUmVxOwotICAgIExvY0VuZ1JlcVJlbEJJVCh2b2lkKiBpbnN0YW5jZSwgQUdwc0V4dFR5cGUgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgaW50IGlwdjQsIGNoYXIqIGlwdjYsIGJvb2wgaXNSZXEpOwotICAgIHZpcnR1YWwgfkxvY0VuZ1JlcVJlbEJJVCgpOwotICAgIHZpcnR1YWwgdm9pZCBwcm9jKCkgY29uc3Q7Ci0gICAgdm9pZCBsb2NhbGxvZygpIGNvbnN0OwotICAgIHZpcnR1YWwgdm9pZCBsb2coKSBjb25zdDsKLSAgICB2b2lkIHNlbmQoKSBjb25zdDsKLX07Ci0KLXN0cnVjdCBMb2NFbmdSZXFSZWxXaWZpIDogcHVibGljIExvY01zZyB7Ci0gICAgdm9pZCogbUxvY0VuZzsKLSAgICBjb25zdCBBR3BzRXh0VHlwZSBtVHlwZTsKLSAgICBjb25zdCBsb2NfaWZfcmVxX3NlbmRlcl9pZF9lX3R5cGUgbVNlbmRlcklkOwotICAgIGNoYXIqIGNvbnN0IG1TU0lEOwotICAgIGNoYXIqIGNvbnN0IG1QYXNzd29yZDsKLSAgICBjb25zdCBib29sIG1Jc1JlcTsKLSAgICBMb2NFbmdSZXFSZWxXaWZpKHZvaWQqIGxvY0VuZywgQUdwc0V4dFR5cGUgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgIGxvY19pZl9yZXFfc2VuZGVyX2lkX2VfdHlwZSBzZW5kZXJfaWQsCi0gICAgICAgICAgICAgICAgICAgICBjaGFyKiBzLCBjaGFyKiBwLCBib29sIGlzUmVxKTsKLSAgICB2aXJ0dWFsIH5Mb2NFbmdSZXFSZWxXaWZpKCk7Ci0gICAgdmlydHVhbCB2b2lkIHByb2MoKSBjb25zdDsKLSAgICB2b2lkIGxvY2FsbG9nKCkgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkIGxvZygpIGNvbnN0OwotICAgIHZvaWQgc2VuZCgpIGNvbnN0OwotfTsKLQotc3RydWN0IExvY0VuZ1JlcXVlc3RYdHJhIDogcHVibGljIExvY01zZyB7Ci0gICAgdm9pZCogbUxvY0VuZzsKLSAgICBMb2NFbmdSZXF1ZXN0WHRyYSh2b2lkKiBsb2NFbmcpOwotICAgIHZpcnR1YWwgdm9pZCBwcm9jKCkgY29uc3Q7Ci0gICAgdm9pZCBsb2NhbGxvZygpIGNvbnN0OwotICAgIHZpcnR1YWwgdm9pZCBsb2coKSBjb25zdDsKLX07Ci0KLXN0cnVjdCBMb2NFbmdSZXF1ZXN0VGltZSA6IHB1YmxpYyBMb2NNc2cgewotICAgIHZvaWQqIG1Mb2NFbmc7Ci0gICAgTG9jRW5nUmVxdWVzdFRpbWUodm9pZCogbG9jRW5nKTsKLSAgICB2aXJ0dWFsIHZvaWQgcHJvYygpIGNvbnN0OwotICAgIHZvaWQgbG9jYWxsb2coKSBjb25zdDsKLSAgICB2aXJ0dWFsIHZvaWQgbG9nKCkgY29uc3Q7Ci19OwotCi1zdHJ1Y3QgTG9jRW5nUmVxdWVzdE5pIDogcHVibGljIExvY01zZyB7Ci0gICAgdm9pZCogbUxvY0VuZzsKLSAgICBjb25zdCBHcHNOaU5vdGlmaWNhdGlvbiBtTm90aWZ5OwotICAgIGNvbnN0IHZvaWQgKm1QYXlsb2FkOwotICAgIExvY0VuZ1JlcXVlc3ROaSh2b2lkKiBsb2NFbmcsCi0gICAgICAgICAgICAgICAgICAgIEdwc05pTm90aWZpY2F0aW9uICZub3RpZiwKLSAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogZGF0YSk7Ci0gICAgdmlydHVhbCB2b2lkIHByb2MoKSBjb25zdDsKLSAgICB2b2lkIGxvY2FsbG9nKCkgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkIGxvZygpIGNvbnN0OwotfTsKLQotc3RydWN0IExvY0VuZ0Rvd24gOiBwdWJsaWMgTG9jTXNnIHsKLSAgICB2b2lkKiBtTG9jRW5nOwotICAgIExvY0VuZ0Rvd24odm9pZCogbG9jRW5nKTsKLSAgICB2aXJ0dWFsIHZvaWQgcHJvYygpIGNvbnN0OwotICAgIHZvaWQgbG9jYWxsb2coKSBjb25zdDsKLSAgICB2aXJ0dWFsIHZvaWQgbG9nKCkgY29uc3Q7Ci19OwotCi1zdHJ1Y3QgTG9jRW5nVXAgOiBwdWJsaWMgTG9jTXNnIHsKLSAgICB2b2lkKiBtTG9jRW5nOwotICAgIExvY0VuZ1VwKHZvaWQqIGxvY0VuZyk7Ci0gICAgdmlydHVhbCB2b2lkIHByb2MoKSBjb25zdDsKLSAgICB2b2lkIGxvY2FsbG9nKCkgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkIGxvZygpIGNvbnN0OwotfTsKLQotc3RydWN0IExvY0VuZ0dldFpwcCA6IHB1YmxpYyBMb2NNc2cgewotICAgIExvY0VuZ0FkYXB0ZXIqIG1BZGFwdGVyOwotICAgIExvY0VuZ0dldFpwcChMb2NFbmdBZGFwdGVyKiBhZGFwdGVyKTsKLSAgICB2aXJ0dWFsIHZvaWQgcHJvYygpIGNvbnN0OwotICAgIHZvaWQgbG9jYWxsb2coKSBjb25zdDsKLSAgICB2aXJ0dWFsIHZvaWQgbG9nKCkgY29uc3Q7Ci0gICAgdm9pZCBzZW5kKCkgY29uc3Q7Ci19OwotCi1zdHJ1Y3QgTG9jRW5nUmVwb3J0R3BzTWVhc3VyZW1lbnQgOiBwdWJsaWMgTG9jTXNnIHsKLSAgICB2b2lkKiBtTG9jRW5nOwotICAgIGNvbnN0IEdwc0RhdGEgbUdwc0RhdGE7Ci0gICAgTG9jRW5nUmVwb3J0R3BzTWVhc3VyZW1lbnQodm9pZCogbG9jRW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdwc0RhdGEgJmdwc0RhdGEpOwotICAgIHZpcnR1YWwgdm9pZCBwcm9jKCkgY29uc3Q7Ci0gICAgdm9pZCBsb2NhbGxvZygpIGNvbnN0OwotICAgIHZpcnR1YWwgdm9pZCBsb2coKSBjb25zdDsKLX07Ci0KLXN0cnVjdCBMb2NFbmdTaHV0ZG93biA6IHB1YmxpYyBMb2NNc2cgewotICAgIExvY0VuZ0FkYXB0ZXIqIG1BZGFwdGVyOwotICAgIExvY0VuZ1NodXRkb3duKExvY0VuZ0FkYXB0ZXIqIGFkYXB0ZXIpOwotICAgIHZpcnR1YWwgdm9pZCBwcm9jKCkgY29uc3Q7Ci0gICAgdm9pZCBsb2NhbGxvZygpIGNvbnN0OwotICAgIHZpcnR1YWwgdm9pZCBsb2coKSBjb25zdDsKLX07Ci0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jZW5kaWYgLyogTE9DX0VOR19NU0dfSCAqLwpkaWZmIC0tZ2l0IGEvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGlfNTAwMDEvbG9jX2VuZ19uaS5jcHAgYi9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaV81MDAwMS9sb2NfZW5nX25pLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU5N2I5OC4uMDAwMDAwMAotLS0gYS9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaV81MDAwMS9sb2NfZW5nX25pLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQxNCArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMDktMjAxNCwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKLSAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAotICogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiwgbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKLSAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAotICogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKLSAqIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KLSAqIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jZGVmaW5lIExPR19ORERFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiTG9jU3ZjX2VuZyIKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNpbmNsdWRlIDxwdGhyZWFkLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlIDxNc2dUYXNrLmg+Ci0KLSNpbmNsdWRlIDxsb2NfZW5nLmg+Ci0KLSNpbmNsdWRlICJsb2dfdXRpbC5oIgotI2luY2x1ZGUgInBsYXRmb3JtX2xpYl9pbmNsdWRlcy5oIgotCi11c2luZyBuYW1lc3BhY2UgbG9jX2NvcmU7Ci0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFUQSBERUNMQVJBVElPTgotICoKLSAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlVOQ1RJT04gREVDTEFSQVRJT05TCi0gKgotICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLXN0YXRpYyB2b2lkKiBuaV90aHJlYWRfcHJvYyh2b2lkICphcmdzKTsKLQotc3RydWN0IExvY0VuZ0luZm9ybU5pUmVzcG9uc2UgOiBwdWJsaWMgTG9jTXNnIHsKLSAgICBMb2NFbmdBZGFwdGVyKiBtQWRhcHRlcjsKLSAgICBjb25zdCBHcHNVc2VyUmVzcG9uc2VUeXBlIG1SZXNwb25zZTsKLSAgICBjb25zdCB2b2lkICptUGF5bG9hZDsKLSAgICBpbmxpbmUgTG9jRW5nSW5mb3JtTmlSZXNwb25zZShMb2NFbmdBZGFwdGVyKiBhZGFwdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdwc1VzZXJSZXNwb25zZVR5cGUgcmVzcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBkYXRhKSA6Ci0gICAgICAgIExvY01zZygpLCBtQWRhcHRlcihhZGFwdGVyKSwKLSAgICAgICAgbVJlc3BvbnNlKHJlc3ApLCBtUGF5bG9hZChkYXRhKQotICAgIHsKLSAgICAgICAgbG9jYWxsb2coKTsKLSAgICB9Ci0gICAgaW5saW5lIH5Mb2NFbmdJbmZvcm1OaVJlc3BvbnNlKCkKLSAgICB7Ci0gICAgICAgIC8vIHRoaXMgaXMgYSBiaXQgd2VpcmQgc2luY2UgbVBheWxvYWQgaXMgbm90Ci0gICAgICAgIC8vIGFsbG9jYXRlZCBieSB0aGlzIGNsYXNzLiAgQnV0IHRoZXJlIGlzIG5vIGJldHRlciB3YXkuCi0gICAgICAgIC8vIG1QYXlsb2FkIGFjdHVhbGx5IHdvbid0IGJlIE5VTEwgaGVyZS4KLSAgICAgICAgZnJlZSgodm9pZCopbVBheWxvYWQpOwotICAgIH0KLSAgICBpbmxpbmUgdmlydHVhbCB2b2lkIHByb2MoKSBjb25zdAotICAgIHsKLSAgICAgICAgbUFkYXB0ZXItPmluZm9ybU5pUmVzcG9uc2UobVJlc3BvbnNlLCBtUGF5bG9hZCk7Ci0gICAgfQotICAgIGlubGluZSB2b2lkIGxvY2FsbG9nKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIExPQ19MT0dWKCJMb2NFbmdJbmZvcm1OaVJlc3BvbnNlIC0gIgotICAgICAgICAgICAgICAgICAicmVzcG9uc2U6ICVzXG4gIG1QYXlsb2FkOiAlcCIsCi0gICAgICAgICAgICAgICAgIGxvY19nZXRfbmlfcmVzcG9uc2VfbmFtZShtUmVzcG9uc2UpLAotICAgICAgICAgICAgICAgICBtUGF5bG9hZCk7Ci0gICAgfQotICAgIGlubGluZSB2aXJ0dWFsIHZvaWQgbG9nKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIGxvY2FsbG9nKCk7Ci0gICAgfQotfTsKLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotRlVOQ1RJT04gbG9jX2VuZ19uaV9yZXF1ZXN0X2hhbmRsZXIKLQotREVTQ1JJUFRJT04KLSAgIERpc3BsYXlzIHRoZSBOSSByZXF1ZXN0IGFuZCBhd2FpdHMgdXNlciBpbnB1dC4gSWYgYSBwcmV2aW91cyByZXF1ZXN0IGlzCi0gICBpbiBzZXNzaW9uLCBpdCBpcyBpZ25vcmVkLgotCi1SRVRVUk4gVkFMVUUKLSAgIG5vbmUKLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLXZvaWQgbG9jX2VuZ19uaV9yZXF1ZXN0X2hhbmRsZXIobG9jX2VuZ19kYXRhX3NfdHlwZSAmbG9jX2VuZ19kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdwc05pTm90aWZpY2F0aW9uICpub3RpZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBwYXNzVGhyb3VnaCkKLXsKLSAgICBFTlRSWV9MT0coKTsKLSAgICBjaGFyIGxjc19hZGRyWzMyXTsgLy8gRGVjb2RlZCBMQ1MgYWRkcmVzcyBmb3IgVU1UUyBDUCBOSQotICAgIGxvY19lbmdfbmlfZGF0YV9zX3R5cGUqIGxvY19lbmdfbmlfZGF0YV9wID0gJmxvY19lbmdfZGF0YS5sb2NfZW5nX25pX2RhdGE7Ci0gICAgbG9jX2VuZ19uaV9zZXNzaW9uX3NfdHlwZSogcFNlc3Npb24gPSBOVUxMOwotCi0gICAgaWYgKE5VTEwgPT0gbG9jX2VuZ19kYXRhLm5pX25vdGlmeV9jYikgewotICAgICAgICBFWElUX0xPRyglcywgImxvY19lbmdfbmlfaW5pdCBoYXNuJ3QgaGFwcGVuZWQgeWV0LiIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKG5vdGlmLT5uaV90eXBlID09IEdQU19OSV9UWVBFX0VNRVJHRU5DWV9TVVBMKSB7Ci0gICAgICAgIGlmIChOVUxMICE9IGxvY19lbmdfbmlfZGF0YV9wLT5zZXNzaW9uRXMucmF3UmVxdWVzdCkgewotICAgICAgICAgICAgTE9DX0xPR1coImxvY19lbmdfbmlfcmVxdWVzdF9oYW5kbGVyLCBzdXBsIGVzIE5JIGluIHByb2dyZXNzLCBuZXcgc3VwbCBlcyBOSSBpZ25vcmVkLCB0eXBlOiAlZCIsCi0gICAgICAgICAgICAgICAgICAgICBub3RpZi0+bmlfdHlwZSk7Ci0gICAgICAgICAgICBpZiAoTlVMTCAhPSBwYXNzVGhyb3VnaCkgewotICAgICAgICAgICAgICAgIGZyZWUoKHZvaWQqKXBhc3NUaHJvdWdoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHBTZXNzaW9uID0gJmxvY19lbmdfbmlfZGF0YV9wLT5zZXNzaW9uRXM7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBpZiAoTlVMTCAhPSBsb2NfZW5nX25pX2RhdGFfcC0+c2Vzc2lvbi5yYXdSZXF1ZXN0IHx8Ci0gICAgICAgICAgICBOVUxMICE9IGxvY19lbmdfbmlfZGF0YV9wLT5zZXNzaW9uRXMucmF3UmVxdWVzdCkgewotICAgICAgICAgICAgTE9DX0xPR1coImxvY19lbmdfbmlfcmVxdWVzdF9oYW5kbGVyLCBzdXBsIE5JIGluIHByb2dyZXNzLCBuZXcgc3VwbCBOSSBpZ25vcmVkLCB0eXBlOiAlZCIsCi0gICAgICAgICAgICAgICAgICAgICBub3RpZi0+bmlfdHlwZSk7Ci0gICAgICAgICAgICBpZiAoTlVMTCAhPSBwYXNzVGhyb3VnaCkgewotICAgICAgICAgICAgICAgIGZyZWUoKHZvaWQqKXBhc3NUaHJvdWdoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHBTZXNzaW9uID0gJmxvY19lbmdfbmlfZGF0YV9wLT5zZXNzaW9uOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBpZiAocFNlc3Npb24pIHsKLSAgICAgICAgLyogU2F2ZSByZXF1ZXN0ICovCi0gICAgICAgIHBTZXNzaW9uLT5yYXdSZXF1ZXN0ID0gKHZvaWQqKXBhc3NUaHJvdWdoOwotICAgICAgICBwU2Vzc2lvbi0+cmVxSUQgPSArK2xvY19lbmdfbmlfZGF0YV9wLT5yZXFJRENvdW50ZXI7Ci0gICAgICAgIHBTZXNzaW9uLT5hZGFwdGVyID0gbG9jX2VuZ19kYXRhLmFkYXB0ZXI7Ci0KLSAgICAgICAgLyogRmlsbCBpbiBub3RpZmljYXRpb24gKi8KLSAgICAgICAgKChHcHNOaU5vdGlmaWNhdGlvbiopbm90aWYpLT5ub3RpZmljYXRpb25faWQgPSBwU2Vzc2lvbi0+cmVxSUQ7Ci0KLSAgICAgICAgaWYgKG5vdGlmLT5ub3RpZnlfZmxhZ3MgPT0gR1BTX05JX1BSSVZBQ1lfT1ZFUlJJREUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvY19lbmdfbXV0ZV9vbmVfc2Vzc2lvbihsb2NfZW5nX2RhdGEpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogTG9nIHJlcXVlc3RvciBJRCBhbmQgdGV4dCBmb3IgZGVidWdnaW5nICovCi0gICAgICAgIExPQ19MT0dJKCJOb3RpZmljYXRpb246IG5vdGlmX3R5cGU6ICVkLCB0aW1lb3V0OiAlZCwgZGVmYXVsdF9yZXNwOiAlZCIsIG5vdGlmLT5uaV90eXBlLCBub3RpZi0+dGltZW91dCwgbm90aWYtPmRlZmF1bHRfcmVzcG9uc2UpOwotICAgICAgICBMT0NfTE9HSSgiICAgICAgICAgICAgICByZXF1ZXN0b3JfaWQ6ICVzIChlbmNvZGluZzogJWQpIiwgbm90aWYtPnJlcXVlc3Rvcl9pZCwgbm90aWYtPnJlcXVlc3Rvcl9pZF9lbmNvZGluZyk7Ci0gICAgICAgIExPQ19MT0dJKCIgICAgICAgICAgICAgIHRleHQ6ICVzIHRleHQgKGVuY29kaW5nOiAlZCkiLCBub3RpZi0+dGV4dCwgbm90aWYtPnRleHRfZW5jb2RpbmcpOwotICAgICAgICBpZiAobm90aWYtPmV4dHJhc1swXSkKLSAgICAgICAgewotICAgICAgICAgICAgTE9DX0xPR0koIiAgICAgICAgICAgICAgZXh0cmFzOiAlcyIsIG5vdGlmLT5leHRyYXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogRm9yIHJvYnVzdG5lc3MsIHNwYXduIGEgdGhyZWFkIGF0IHRoaXMgcG9pbnQgdG8gdGltZW91dCB0byBjbGVhciB1cCB0aGUgbm90aWZpY2F0aW9uIHN0YXR1cywgZXZlbiB0aG91Z2gKLSAgICAgICAgICogdGhlIE9FTSBsYXllciBpbiBqYXZhIGRvZXMgbm90IGRvIHNvLgotICAgICAgICAgKiovCi0gICAgICAgIHBTZXNzaW9uLT5yZXNwVGltZUxlZnQgPSA1ICsgKG5vdGlmLT50aW1lb3V0ICE9IDAgPyBub3RpZi0+dGltZW91dCA6IExPQ19OSV9OT19SRVNQT05TRV9USU1FKTsKLSAgICAgICAgTE9DX0xPR0koIkF1dG9tYXRpY2FsbHkgc2VuZHMgJ25vIHJlc3BvbnNlJyBpbiAlZCBzZWNvbmRzICh0byBjbGVhciBzdGF0dXMpXG4iLCBwU2Vzc2lvbi0+cmVzcFRpbWVMZWZ0KTsKLQotICAgICAgICBpbnQgcmMgPSAwOwotICAgICAgICByYyA9IHB0aHJlYWRfY3JlYXRlKCZwU2Vzc2lvbi0+dGhyZWFkLCBOVUxMLCBuaV90aHJlYWRfcHJvYywgcFNlc3Npb24pOwotICAgICAgICBpZiAocmMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIExPQ19MT0dFKCJMb2MgTkkgdGhyZWFkIGlzIG5vdCBjcmVhdGVkLlxuIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmMgPSBwdGhyZWFkX2RldGFjaChwU2Vzc2lvbi0+dGhyZWFkKTsKLSAgICAgICAgaWYgKHJjKQotICAgICAgICB7Ci0gICAgICAgICAgICBMT0NfTE9HRSgiTG9jIE5JIHRocmVhZCBpcyBub3QgZGV0YWNoZWQuXG4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIENBTExCQUNLX0xPR19DQUxMRkxPVygibmlfbm90aWZ5X2NiIC0gaWQiLCAlZCwgbm90aWYtPm5vdGlmaWNhdGlvbl9pZCk7Ci0gICAgICAgIGxvY19lbmdfZGF0YS5uaV9ub3RpZnlfY2IoKEdwc05pTm90aWZpY2F0aW9uKilub3RpZik7Ci0gICAgfQotICAgIEVYSVRfTE9HKCVzLCBWT0lEX1JFVCk7Ci19Ci0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUZVTkNUSU9OIG5pX3RocmVhZF9wcm9jCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi1zdGF0aWMgdm9pZCogbmlfdGhyZWFkX3Byb2Modm9pZCAqYXJncykKLXsKLSAgICBFTlRSWV9MT0coKTsKLQotICAgIGxvY19lbmdfbmlfc2Vzc2lvbl9zX3R5cGUqIHBTZXNzaW9uID0gKGxvY19lbmdfbmlfc2Vzc2lvbl9zX3R5cGUqKWFyZ3M7Ci0gICAgaW50IHJjID0gMDsgICAgICAgICAgLyogcmV0dXJuIGNvZGUgZnJvbSBwdGhyZWFkIGNhbGxzICovCi0KLSAgICBzdHJ1Y3QgdGltZXZhbCBwcmVzZW50X3RpbWU7Ci0gICAgc3RydWN0IHRpbWVzcGVjIGV4cGlyZV90aW1lOwotCi0gICAgTE9DX0xPR0QoIlN0YXJ0aW5nIExvYyBOSSB0aHJlYWQuLi5cbiIpOwotICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmcFNlc3Npb24tPnRMb2NrKTsKLSAgICAvKiBDYWxjdWxhdGUgYWJzb2x1dGUgZXhwaXJlIHRpbWUgKi8KLSAgICBnZXR0aW1lb2ZkYXkoJnByZXNlbnRfdGltZSwgTlVMTCk7Ci0gICAgZXhwaXJlX3RpbWUudHZfc2VjICA9IHByZXNlbnRfdGltZS50dl9zZWMgKyBwU2Vzc2lvbi0+cmVzcFRpbWVMZWZ0OwotICAgIGV4cGlyZV90aW1lLnR2X25zZWMgPSBwcmVzZW50X3RpbWUudHZfdXNlYyAqIDEwMDA7Ci0gICAgTE9DX0xPR0QoIm5pX3RocmVhZF9wcm9jLVRpbWUgb3V0IHNldCBmb3IgYWJzIHRpbWUgJWxkIHdpdGggZGVsYXkgJWQgc2VjXG4iLAotICAgICAgICAgICAgIChsb25nKSBleHBpcmVfdGltZS50dl9zZWMsIHBTZXNzaW9uLT5yZXNwVGltZUxlZnQgKTsKLQotICAgIHdoaWxlICghcFNlc3Npb24tPnJlc3BSZWN2ZCkKLSAgICB7Ci0gICAgICAgIHJjID0gcHRocmVhZF9jb25kX3RpbWVkd2FpdCgmcFNlc3Npb24tPnRDb25kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBTZXNzaW9uLT50TG9jaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZleHBpcmVfdGltZSk7Ci0gICAgICAgIGlmIChyYyA9PSBFVElNRURPVVQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBTZXNzaW9uLT5yZXNwID0gR1BTX05JX1JFU1BPTlNFX05PUkVTUDsKLSAgICAgICAgICAgIExPQ19MT0dEKCJuaV90aHJlYWRfcHJvYy1UaHJlYWQgdGltZSBvdXQgYWZ0ZXIgdmFsdGluZyBmb3Igc3BlY2lmaWVkIHRpbWUuIFJldCBWYWwgJWRcbiIscmMgKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIExPQ19MT0dEKCJuaV90aHJlYWRfcHJvYy1KYXZhIGxheWVyIGhhcyBzZW50IHVzIGEgdXNlciByZXNwb25zZSBhbmQgcmV0dXJuIHZhbHVlIGZyb20gIgotICAgICAgICAgICAgICJwdGhyZWFkX2NvbmRfdGltZWR3YWl0ID0gJWRcbiIscmMgKTsKLSAgICBwU2Vzc2lvbi0+cmVzcFJlY3ZkID0gRkFMU0U7IC8qIFJlc2V0IHRoZSB1c2VyIHJlc3BvbnNlIGZsYWcgZm9yIHRoZSBuZXh0IHNlc3Npb24qLwotCi0gICAgTE9DX0xPR0QoInBTZXNzaW9uLT5yZXNwIGlzICVkXG4iLHBTZXNzaW9uLT5yZXNwKTsKLQotICAgIC8vIGFkZGluZyB0aGlzIGNoZWNrIHRvIHN1cHBvcnQgbW9kZW0gcmVzdGFydCwgaW4gd2hpY2ggY2FzZSwgd2UgbmVlZCB0aGUgdGhyZWFkCi0gICAgLy8gdG8gZXhpdCB3aXRob3V0IGNhbGxpbmcgc2VuZGluZyBkYXRhLiBXZSBtYWRlIHN1cmUgdGhhdCByYXdSZXF1ZXN0IGlzIE5VTEwgaW4KLSAgICAvLyBsb2NfZW5nX25pX3Jlc2V0X29uX2VuZ2luZV9yZXN0YXJ0KCkKLSAgICBMb2NFbmdBZGFwdGVyKiBhZGFwdGVyID0gcFNlc3Npb24tPmFkYXB0ZXI7Ci0gICAgTG9jRW5nSW5mb3JtTmlSZXNwb25zZSAqbXNnID0gTlVMTDsKLQotICAgIGlmIChOVUxMICE9IHBTZXNzaW9uLT5yYXdSZXF1ZXN0KSB7Ci0gICAgICAgIGlmIChwU2Vzc2lvbi0+cmVzcCAhPSBHUFNfTklfUkVTUE9OU0VfSUdOT1JFKSB7Ci0gICAgICAgICAgICBMT0NfTE9HRCgicFNlc3Npb24tPnJlc3AgIT0gR1BTX05JX1JFU1BPTlNFX0lHTk9SRSBcbiIpOwotICAgICAgICAgICAgbXNnID0gbmV3IExvY0VuZ0luZm9ybU5pUmVzcG9uc2UoYWRhcHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZXNzaW9uLT5yZXNwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNlc3Npb24tPnJhd1JlcXVlc3QpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTE9DX0xPR0QoInRoaXMgaXMgdGhlIGlnbm9yZSByZXBseSBmb3IgU1VQTCBFU1xuIik7Ci0gICAgICAgICAgICBmcmVlKHBTZXNzaW9uLT5yYXdSZXF1ZXN0KTsKLSAgICAgICAgfQotICAgICAgICBwU2Vzc2lvbi0+cmF3UmVxdWVzdCA9IE5VTEw7Ci0gICAgfQotICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZwU2Vzc2lvbi0+dExvY2spOwotCi0gICAgcFNlc3Npb24tPnJlc3BUaW1lTGVmdCA9IDA7Ci0gICAgcFNlc3Npb24tPnJlcUlEID0gMDsKLQotICAgIGlmIChOVUxMICE9IG1zZykgewotICAgICAgICBMT0NfTE9HRCgibmlfdGhyZWFkX3Byb2M6IGFkYXB0ZXItPnNlbmRNc2cobXNnKVxuIik7Ci0gICAgICAgIGFkYXB0ZXItPnNlbmRNc2cobXNnKTsKLSAgICB9Ci0KLSAgICBFWElUX0xPRyglcywgVk9JRF9SRVQpOwotICAgIHJldHVybiBOVUxMOwotfQotCi12b2lkIGxvY19lbmdfbmlfcmVzZXRfb25fZW5naW5lX3Jlc3RhcnQobG9jX2VuZ19kYXRhX3NfdHlwZSAmbG9jX2VuZ19kYXRhKQotewotICAgIEVOVFJZX0xPRygpOwotICAgIGxvY19lbmdfbmlfZGF0YV9zX3R5cGUqIGxvY19lbmdfbmlfZGF0YV9wID0gJmxvY19lbmdfZGF0YS5sb2NfZW5nX25pX2RhdGE7Ci0KLSAgICBpZiAoTlVMTCA9PSBsb2NfZW5nX2RhdGEubmlfbm90aWZ5X2NiKSB7Ci0gICAgICAgIEVYSVRfTE9HKCVzLCAibG9jX2VuZ19uaV9pbml0IGhhc24ndCBoYXBwZW5lZCB5ZXQuIik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBvbmx5IGlmIG1vZGVtIGhhcyByZXF1ZXN0ZWQgYnV0IHRoZW4gZGllZC4KLSAgICBpZiAoTlVMTCAhPSBsb2NfZW5nX25pX2RhdGFfcC0+c2Vzc2lvbkVzLnJhd1JlcXVlc3QpIHsKLSAgICAgICAgZnJlZShsb2NfZW5nX25pX2RhdGFfcC0+c2Vzc2lvbkVzLnJhd1JlcXVlc3QpOwotICAgICAgICBsb2NfZW5nX25pX2RhdGFfcC0+c2Vzc2lvbkVzLnJhd1JlcXVlc3QgPSBOVUxMOwotCi0gICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbG9jX2VuZ19uaV9kYXRhX3AtPnNlc3Npb25Fcy50TG9jayk7Ci0gICAgICAgIC8vIHRoZSBnb2FsIGlzIHRvIHdha2UgdXAgbmlfdGhyZWFkX3Byb2MKLSAgICAgICAgLy8gYW5kIGxldCBpdCBleGl0LgotICAgICAgICBsb2NfZW5nX25pX2RhdGFfcC0+c2Vzc2lvbkVzLnJlc3BSZWN2ZCA9IFRSVUU7Ci0gICAgICAgIHB0aHJlYWRfY29uZF9zaWduYWwoJmxvY19lbmdfbmlfZGF0YV9wLT5zZXNzaW9uRXMudENvbmQpOwotICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbG9jX2VuZ19uaV9kYXRhX3AtPnNlc3Npb25Fcy50TG9jayk7Ci0gICAgfQotCi0gICAgaWYgKE5VTEwgIT0gbG9jX2VuZ19uaV9kYXRhX3AtPnNlc3Npb24ucmF3UmVxdWVzdCkgewotICAgICAgICBmcmVlKGxvY19lbmdfbmlfZGF0YV9wLT5zZXNzaW9uLnJhd1JlcXVlc3QpOwotICAgICAgICBsb2NfZW5nX25pX2RhdGFfcC0+c2Vzc2lvbi5yYXdSZXF1ZXN0ID0gTlVMTDsKLQotICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJmxvY19lbmdfbmlfZGF0YV9wLT5zZXNzaW9uLnRMb2NrKTsKLSAgICAgICAgLy8gdGhlIGdvYWwgaXMgdG8gd2FrZSB1cCBuaV90aHJlYWRfcHJvYwotICAgICAgICAvLyBhbmQgbGV0IGl0IGV4aXQuCi0gICAgICAgIGxvY19lbmdfbmlfZGF0YV9wLT5zZXNzaW9uLnJlc3BSZWN2ZCA9IFRSVUU7Ci0gICAgICAgIHB0aHJlYWRfY29uZF9zaWduYWwoJmxvY19lbmdfbmlfZGF0YV9wLT5zZXNzaW9uLnRDb25kKTsKLSAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmxvY19lbmdfbmlfZGF0YV9wLT5zZXNzaW9uLnRMb2NrKTsKLSAgICB9Ci0KLSAgICBFWElUX0xPRyglcywgVk9JRF9SRVQpOwotfQotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotRlVOQ1RJT04gICAgbG9jX2VuZ19uaV9pbml0Ci0KLURFU0NSSVBUSU9OCi0gICBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSBOSSBpbnRlcmZhY2UKLQotREVQRU5ERU5DSUVTCi0gICBOT05FCi0KLVJFVFVSTiBWQUxVRQotICAgTm9uZQotCi1TSURFIEVGRkVDVFMKLSAgIE4vQQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotdm9pZCBsb2NfZW5nX25pX2luaXQobG9jX2VuZ19kYXRhX3NfdHlwZSAmbG9jX2VuZ19kYXRhLCBHcHNOaUV4dENhbGxiYWNrcyAqY2FsbGJhY2tzKQotewotICAgIEVOVFJZX0xPR19DQUxMRkxPVygpOwotCi0gICAgaWYoY2FsbGJhY2tzID09IE5VTEwpCi0gICAgICAgIEVYSVRfTE9HKCVzLCAibG9jX2VuZ19uaV9pbml0OiBmYWlsZWQsIGNiIGlzIE5VTEwiKTsKLSAgICBlbHNlIGlmIChOVUxMID09IGNhbGxiYWNrcy0+bm90aWZ5X2NiKSB7Ci0gICAgICAgIEVYSVRfTE9HKCVzLCAibG9jX2VuZ19uaV9pbml0OiBmYWlsZWQsIG5vIGNiLiIpOwotICAgIH0gZWxzZSBpZiAoTlVMTCAhPSBsb2NfZW5nX2RhdGEubmlfbm90aWZ5X2NiKSB7Ci0gICAgICAgIEVYSVRfTE9HKCVzLCAibG9jX2VuZ19uaV9pbml0OiBhbHJlYWR5IGluaXRlZC4iKTsKLSAgICB9IGVsc2UgewotICAgICAgICBsb2NfZW5nX25pX2RhdGFfc190eXBlKiBsb2NfZW5nX25pX2RhdGFfcCA9ICZsb2NfZW5nX2RhdGEubG9jX2VuZ19uaV9kYXRhOwotICAgICAgICBsb2NfZW5nX25pX2RhdGFfcC0+c2Vzc2lvbkVzLnJlc3BUaW1lTGVmdCA9IDA7Ci0gICAgICAgIGxvY19lbmdfbmlfZGF0YV9wLT5zZXNzaW9uRXMucmVzcFJlY3ZkID0gRkFMU0U7Ci0gICAgICAgIGxvY19lbmdfbmlfZGF0YV9wLT5zZXNzaW9uRXMucmF3UmVxdWVzdCA9IE5VTEw7Ci0gICAgICAgIGxvY19lbmdfbmlfZGF0YV9wLT5zZXNzaW9uRXMucmVxSUQgPSAwOwotICAgICAgICBwdGhyZWFkX2NvbmRfaW5pdCgmbG9jX2VuZ19uaV9kYXRhX3AtPnNlc3Npb25Fcy50Q29uZCwgTlVMTCk7Ci0gICAgICAgIHB0aHJlYWRfbXV0ZXhfaW5pdCgmbG9jX2VuZ19uaV9kYXRhX3AtPnNlc3Npb25Fcy50TG9jaywgTlVMTCk7Ci0KLSAgICAgICAgbG9jX2VuZ19uaV9kYXRhX3AtPnNlc3Npb24ucmVzcFRpbWVMZWZ0ID0gMDsKLSAgICAgICAgbG9jX2VuZ19uaV9kYXRhX3AtPnNlc3Npb24ucmVzcFJlY3ZkID0gRkFMU0U7Ci0gICAgICAgIGxvY19lbmdfbmlfZGF0YV9wLT5zZXNzaW9uLnJhd1JlcXVlc3QgPSBOVUxMOwotICAgICAgICBsb2NfZW5nX25pX2RhdGFfcC0+c2Vzc2lvbi5yZXFJRCA9IDA7Ci0gICAgICAgIHB0aHJlYWRfY29uZF9pbml0KCZsb2NfZW5nX25pX2RhdGFfcC0+c2Vzc2lvbi50Q29uZCwgTlVMTCk7Ci0gICAgICAgIHB0aHJlYWRfbXV0ZXhfaW5pdCgmbG9jX2VuZ19uaV9kYXRhX3AtPnNlc3Npb24udExvY2ssIE5VTEwpOwotCi0gICAgICAgIGxvY19lbmdfZGF0YS5uaV9ub3RpZnlfY2IgPSBjYWxsYmFja3MtPm5vdGlmeV9jYjsKLSAgICAgICAgRVhJVF9MT0coJXMsIFZPSURfUkVUKTsKLSAgICB9Ci19Ci0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1GVU5DVElPTiAgICBsb2NfZW5nX25pX3Jlc3BvbmQKLQotREVTQ1JJUFRJT04KLSAgIFRoaXMgZnVuY3Rpb24gcmVjZWl2ZXMgdXNlciByZXNwb25zZSBmcm9tIHVwcGVyIGxheWVyIGZyYW1ld29yawotCi1ERVBFTkRFTkNJRVMKLSAgIE5PTkUKLQotUkVUVVJOIFZBTFVFCi0gICBOb25lCi0KLVNJREUgRUZGRUNUUwotICAgTi9BCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi12b2lkIGxvY19lbmdfbmlfcmVzcG9uZChsb2NfZW5nX2RhdGFfc190eXBlICZsb2NfZW5nX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgbm90aWZfaWQsIEdwc1VzZXJSZXNwb25zZVR5cGUgdXNlcl9yZXNwb25zZSkKLXsKLSAgICBFTlRSWV9MT0dfQ0FMTEZMT1coKTsKLSAgICBsb2NfZW5nX25pX2RhdGFfc190eXBlKiBsb2NfZW5nX25pX2RhdGFfcCA9ICZsb2NfZW5nX2RhdGEubG9jX2VuZ19uaV9kYXRhOwotICAgIGxvY19lbmdfbmlfc2Vzc2lvbl9zX3R5cGUqIHBTZXNzaW9uID0gTlVMTDsKLQotICAgIGlmIChOVUxMID09IGxvY19lbmdfZGF0YS5uaV9ub3RpZnlfY2IpIHsKLSAgICAgICAgRVhJVF9MT0coJXMsICJsb2NfZW5nX25pX2luaXQgaGFzbid0IGhhcHBlbmVkIHlldC4iKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChub3RpZl9pZCA9PSBsb2NfZW5nX25pX2RhdGFfcC0+c2Vzc2lvbkVzLnJlcUlEICYmCi0gICAgICAgIE5VTEwgIT0gbG9jX2VuZ19uaV9kYXRhX3AtPnNlc3Npb25Fcy5yYXdSZXF1ZXN0KSB7Ci0gICAgICAgIHBTZXNzaW9uID0gJmxvY19lbmdfbmlfZGF0YV9wLT5zZXNzaW9uRXM7Ci0gICAgICAgIC8vIGlnbm9yZSBhbnkgU1VQTCBOSSBub24tRXMgc2Vzc2lvbiBpZiBhIFNVUEwgTkkgRVMgaXMgYWNjZXB0ZWQKLSAgICAgICAgaWYgKHVzZXJfcmVzcG9uc2UgPT0gR1BTX05JX1JFU1BPTlNFX0FDQ0VQVCAmJgotICAgICAgICAgICAgTlVMTCAhPSBsb2NfZW5nX25pX2RhdGFfcC0+c2Vzc2lvbi5yYXdSZXF1ZXN0KSB7Ci0gICAgICAgICAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZsb2NfZW5nX25pX2RhdGFfcC0+c2Vzc2lvbi50TG9jayk7Ci0gICAgICAgICAgICAgICAgbG9jX2VuZ19uaV9kYXRhX3AtPnNlc3Npb24ucmVzcCA9IEdQU19OSV9SRVNQT05TRV9JR05PUkU7Ci0gICAgICAgICAgICAgICAgbG9jX2VuZ19uaV9kYXRhX3AtPnNlc3Npb24ucmVzcFJlY3ZkID0gVFJVRTsKLSAgICAgICAgICAgICAgICBwdGhyZWFkX2NvbmRfc2lnbmFsKCZsb2NfZW5nX25pX2RhdGFfcC0+c2Vzc2lvbi50Q29uZCk7Ci0gICAgICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmxvY19lbmdfbmlfZGF0YV9wLT5zZXNzaW9uLnRMb2NrKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAobm90aWZfaWQgPT0gbG9jX2VuZ19uaV9kYXRhX3AtPnNlc3Npb24ucmVxSUQgJiYKLSAgICAgICAgTlVMTCAhPSBsb2NfZW5nX25pX2RhdGFfcC0+c2Vzc2lvbi5yYXdSZXF1ZXN0KSB7Ci0gICAgICAgIHBTZXNzaW9uID0gJmxvY19lbmdfbmlfZGF0YV9wLT5zZXNzaW9uOwotICAgIH0KLQotICAgIGlmIChwU2Vzc2lvbikgewotICAgICAgICBMT0NfTE9HSSgibG9jX2VuZ19uaV9yZXNwb25kOiBzZW5kIHVzZXIgcmVzcG9uc2UgJWQgZm9yIG5vdGlmICVkIiwgdXNlcl9yZXNwb25zZSwgbm90aWZfaWQpOwotICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJnBTZXNzaW9uLT50TG9jayk7Ci0gICAgICAgIHBTZXNzaW9uLT5yZXNwID0gdXNlcl9yZXNwb25zZTsKLSAgICAgICAgcFNlc3Npb24tPnJlc3BSZWN2ZCA9IFRSVUU7Ci0gICAgICAgIHB0aHJlYWRfY29uZF9zaWduYWwoJnBTZXNzaW9uLT50Q29uZCk7Ci0gICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZwU2Vzc2lvbi0+dExvY2spOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgTE9DX0xPR0UoImxvY19lbmdfbmlfcmVzcG9uZDogbm90aWZfaWQgJWQgbm90IGFuIGFjdGl2ZSBzZXNzaW9uIiwgbm90aWZfaWQpOwotICAgIH0KLQotICAgIEVYSVRfTE9HKCVzLCBWT0lEX1JFVCk7Ci19CmRpZmYgLS1naXQgYS9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaV81MDAwMS9sb2NfZW5nX25pLmggYi9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaV81MDAwMS9sb2NfZW5nX25pLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2OGY1Y2QuLjAwMDAwMDAKLS0tIGEvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGlfNTAwMDEvbG9jX2VuZ19uaS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDA5LDIwMTEsMjAxNCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZwotICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCi0gKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCi0gKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKLSAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCi0gKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCi0gKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2lmbmRlZiBMT0NfRU5HX05JX0gKLSNkZWZpbmUgTE9DX0VOR19OSV9ICi0KLSNpbmNsdWRlIDxzdGRib29sLmg+Ci0jaW5jbHVkZSA8TG9jRW5nQWRhcHRlci5oPgotCi0jZGVmaW5lIExPQ19OSV9OT19SRVNQT05TRV9USU1FICAgICAgICAgICAgMjAgICAgICAgICAgICAgICAgICAgICAgLyogc2VjcyAqLwotI2RlZmluZSBMT0NfTklfTk9USUZfS0VZX0FERFJFU1MgICAgICAgICAgICJBZGRyZXNzIgotI2RlZmluZSBHUFNfTklfUkVTUE9OU0VfSUdOT1JFICAgICAgICAgICAgIDQKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHB0aHJlYWRfdCAgICAgICAgICAgICAgIHRocmVhZDsgICAgICAgICAgICAvKiBOSSB0aHJlYWQgKi8KLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICByZXNwVGltZUxlZnQ7ICAgICAgIC8qIGV4YW1pbmUgdGltZSBmb3IgTkkgcmVzcG9uc2UgKi8KLSAgICBib29sICAgICAgICAgICAgICAgICAgICByZXNwUmVjdmQ7ICAgLyogTkkgVXNlciByZXBvbnNlIHJlY2VpdmVkIG9yIG5vdCBmcm9tIEphdmEgbGF5ZXIqLwotICAgIHZvaWQqICAgICAgICAgICAgICAgICAgIHJhd1JlcXVlc3Q7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgcmVxSUQ7ICAgICAgICAgLyogSUQgdG8gY2hlY2sgYWdhaW5zdCByZXNwb25zZSAqLwotICAgIEdwc1VzZXJSZXNwb25zZVR5cGUgICAgIHJlc3A7Ci0gICAgcHRocmVhZF9jb25kX3QgICAgICAgICAgdENvbmQ7Ci0gICAgcHRocmVhZF9tdXRleF90ICAgICAgICAgdExvY2s7Ci0gICAgTG9jRW5nQWRhcHRlciogICAgICAgICAgYWRhcHRlcjsKLX0gbG9jX2VuZ19uaV9zZXNzaW9uX3NfdHlwZTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGxvY19lbmdfbmlfc2Vzc2lvbl9zX3R5cGUgc2Vzc2lvbjsgICAgLyogU1VQTCBOSSBTZXNzaW9uICovCi0gICAgbG9jX2VuZ19uaV9zZXNzaW9uX3NfdHlwZSBzZXNzaW9uRXM7ICAvKiBFbWVyZ2VuY3kgU1VQTCBOSSBTZXNzaW9uICovCi0gICAgaW50IHJlcUlEQ291bnRlcjsKLX0gbG9jX2VuZ19uaV9kYXRhX3NfdHlwZTsKLQotCi0jZW5kaWYgLyogTE9DX0VOR19OSV9IICovCmRpZmYgLS1naXQgYS9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaV81MDAwMS9sb2NfZW5nX25tZWEuY3BwIGIvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGlfNTAwMDEvbG9jX2VuZ19ubWVhLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQyZWRhMS4uMDAwMDAwMAotLS0gYS9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaV81MDAwMS9sb2NfZW5nX25tZWEuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsODMzICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKLSAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAotICogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAotICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgotICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCi0gKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQotICogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgotICogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNkZWZpbmUgTE9HX05EREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJMb2NTdmNfZW5nX25tZWEiCi0jZGVmaW5lIEdQU19QUk5fU1RBUlQgMQotI2RlZmluZSBHUFNfUFJOX0VORCAgIDMyCi0jZGVmaW5lIEdMT05BU1NfUFJOX1NUQVJUIDY1Ci0jZGVmaW5lIEdMT05BU1NfUFJOX0VORCAgIDk2Ci0jaW5jbHVkZSA8bG9jX2VuZy5oPgotI2luY2x1ZGUgPGxvY19lbmdfbm1lYS5oPgotI2luY2x1ZGUgPG1hdGguaD4KLSNpbmNsdWRlICJsb2dfdXRpbC5oIgotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotRlVOQ1RJT04gICAgbG9jX2VuZ19ubWVhX3NlbmQKLQotREVTQ1JJUFRJT04KLSAgIHNlbmQgb3V0IE5NRUEgc2VudGVuY2UKLQotREVQRU5ERU5DSUVTCi0gICBOT05FCi0KLVJFVFVSTiBWQUxVRQotICAgVG90YWwgbGVuZ3RoIG9mIHRoZSBubWVhIHNlbnRlbmNlCi0KLVNJREUgRUZGRUNUUwotICAgTi9BCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi12b2lkIGxvY19lbmdfbm1lYV9zZW5kKGNoYXIgKnBObWVhLCBpbnQgbGVuZ3RoLCBsb2NfZW5nX2RhdGFfc190eXBlICpsb2NfZW5nX2RhdGFfcCkKLXsKLSAgICBzdHJ1Y3QgdGltZXZhbCB0djsKLSAgICBnZXR0aW1lb2ZkYXkoJnR2LCAoc3RydWN0IHRpbWV6b25lICopIE5VTEwpOwotICAgIGludDY0X3Qgbm93ID0gdHYudHZfc2VjICogMTAwMExMICsgdHYudHZfdXNlYyAvIDEwMDA7Ci0gICAgQ0FMTEJBQ0tfTE9HX0NBTExGTE9XKCJubWVhX2NiIiwgJXAsIHBObWVhKTsKLSAgICBpZiAobG9jX2VuZ19kYXRhX3AtPm5tZWFfY2IgIT0gTlVMTCkKLSAgICAgICAgbG9jX2VuZ19kYXRhX3AtPm5tZWFfY2Iobm93LCBwTm1lYSwgbGVuZ3RoKTsKLSAgICBMT0NfTE9HRCgiTk1FQSA8JXMiLCBwTm1lYSk7Ci19Ci0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1GVU5DVElPTiAgICBsb2NfZW5nX25tZWFfcHV0X2NoZWNrc3VtCi0KLURFU0NSSVBUSU9OCi0gICBHZW5lcmF0ZSBOTUVBIHNlbnRlbmNlcyBnZW5lcmF0ZWQgYmFzZWQgb24gcG9zaXRpb24gcmVwb3J0Ci0KLURFUEVOREVOQ0lFUwotICAgTk9ORQotCi1SRVRVUk4gVkFMVUUKLSAgIFRvdGFsIGxlbmd0aCBvZiB0aGUgbm1lYSBzZW50ZW5jZQotCi1TSURFIEVGRkVDVFMKLSAgIE4vQQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotaW50IGxvY19lbmdfbm1lYV9wdXRfY2hlY2tzdW0oY2hhciAqcE5tZWEsIGludCBtYXhTaXplKQotewotICAgIHVpbnQ4X3QgY2hlY2tzdW0gPSAwOwotICAgIGludCBsZW5ndGggPSAwOwotCi0gICAgcE5tZWErKzsgLy9za2lwIHRoZSAkCi0gICAgd2hpbGUgKCpwTm1lYSAhPSAnXDAnKQotICAgIHsKLSAgICAgICAgY2hlY2tzdW0gXj0gKnBObWVhKys7Ci0gICAgICAgIGxlbmd0aCsrOwotICAgIH0KLQotICAgIGludCBjaGVja3N1bUxlbmd0aCA9IHNucHJpbnRmKHBObWVhLChtYXhTaXplLWxlbmd0aC0xKSwiKiUwMlhcclxuIiwgY2hlY2tzdW0pOwotICAgIHJldHVybiAobGVuZ3RoICsgY2hlY2tzdW1MZW5ndGgpOwotfQotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotRlVOQ1RJT04gICAgbG9jX2VuZ19ubWVhX2dlbmVyYXRlX3BvcwotCi1ERVNDUklQVElPTgotICAgR2VuZXJhdGUgTk1FQSBzZW50ZW5jZXMgZ2VuZXJhdGVkIGJhc2VkIG9uIHBvc2l0aW9uIHJlcG9ydAotCi1ERVBFTkRFTkNJRVMKLSAgIE5PTkUKLQotUkVUVVJOIFZBTFVFCi0gICAwCi0KLVNJREUgRUZGRUNUUwotICAgTi9BCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi12b2lkIGxvY19lbmdfbm1lYV9nZW5lcmF0ZV9wb3MobG9jX2VuZ19kYXRhX3NfdHlwZSAqbG9jX2VuZ19kYXRhX3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVWxwTG9jYXRpb24gJmxvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdwc0xvY2F0aW9uRXh0ZW5kZWQgJmxvY2F0aW9uRXh0ZW5kZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBnZW5lcmF0ZV9ubWVhKQotewotICAgIEVOVFJZX0xPRygpOwotCi0gICAgY2hhciBzZW50ZW5jZVtOTUVBX1NFTlRFTkNFX01BWF9MRU5HVEhdID0gezB9OwotICAgIGNoYXIqIHBNYXJrZXIgPSBzZW50ZW5jZTsKLSAgICBpbnQgbGVuZ3RoUmVtYWluaW5nID0gc2l6ZW9mKHNlbnRlbmNlKTsKLSAgICBpbnQgbGVuZ3RoID0gMDsKLQotICAgIHRpbWVfdCB1dGNUaW1lKGxvY2F0aW9uLmdwc0xvY2F0aW9uLnRpbWVzdGFtcC8xMDAwKTsKLSAgICB0bSAqIHBUbSA9IGdtdGltZSgmdXRjVGltZSk7Ci0gICAgaW50IHV0Y1llYXIgPSBwVG0tPnRtX3llYXIgJSAxMDA7IC8vIDIgZGlnaXQgeWVhcgotICAgIGludCB1dGNNb250aCA9IHBUbS0+dG1fbW9uICsgMTsgLy8gdG1fbW9uIHN0YXJ0cyBhdCB6ZXJvCi0gICAgaW50IHV0Y0RheSA9IHBUbS0+dG1fbWRheTsKLSAgICBpbnQgdXRjSG91cnMgPSBwVG0tPnRtX2hvdXI7Ci0gICAgaW50IHV0Y01pbnV0ZXMgPSBwVG0tPnRtX21pbjsKLSAgICBpbnQgdXRjU2Vjb25kcyA9IHBUbS0+dG1fc2VjOwotCi0gICAgaWYgKGdlbmVyYXRlX25tZWEpIHsKLSAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIC0tLS0tLSRHUEdTQS0tLS0tLQotICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICB1aW50MzJfdCBzdlVzZWRDb3VudCA9IDA7Ci0gICAgICAgIHVpbnQzMl90IHN2VXNlZExpc3RbMzJdID0gezB9OwotICAgICAgICB1aW50MzJfdCBtYXNrID0gbG9jX2VuZ19kYXRhX3AtPnN2X3VzZWRfbWFzazsKLSAgICAgICAgZm9yICh1aW50OF90IGkgPSAxOyBtYXNrID4gMCAmJiBzdlVzZWRDb3VudCA8IDMyOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChtYXNrICYgMSkKLSAgICAgICAgICAgICAgICBzdlVzZWRMaXN0W3N2VXNlZENvdW50KytdID0gaTsKLSAgICAgICAgICAgIG1hc2sgPSBtYXNrID4+IDE7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gY2xlYXIgdGhlIGNhY2hlIHNvIHRoZXkgY2FuJ3QgYmUgdXNlZCBhZ2FpbgotICAgICAgICBsb2NfZW5nX2RhdGFfcC0+c3ZfdXNlZF9tYXNrID0gMDsKLQotICAgICAgICBjaGFyIGZpeFR5cGU7Ci0gICAgICAgIGlmIChzdlVzZWRDb3VudCA9PSAwKQotICAgICAgICAgICAgZml4VHlwZSA9ICcxJzsgLy8gbm8gZml4Ci0gICAgICAgIGVsc2UgaWYgKHN2VXNlZENvdW50IDw9IDMpCi0gICAgICAgICAgICBmaXhUeXBlID0gJzInOyAvLyAyRCBmaXgKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZml4VHlwZSA9ICczJzsgLy8gM0QgZml4Ci0KLSAgICAgICAgbGVuZ3RoID0gc25wcmludGYocE1hcmtlciwgbGVuZ3RoUmVtYWluaW5nLCAiJEdQR1NBLEEsJWMsIiwgZml4VHlwZSk7Ci0KLSAgICAgICAgaWYgKGxlbmd0aCA8IDAgfHwgbGVuZ3RoID49IGxlbmd0aFJlbWFpbmluZykKLSAgICAgICAgewotICAgICAgICAgICAgTE9DX0xPR0UoIk5NRUEgRXJyb3IgaW4gc3RyaW5nIGZvcm1hdHRpbmciKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBwTWFya2VyICs9IGxlbmd0aDsKLSAgICAgICAgbGVuZ3RoUmVtYWluaW5nIC09IGxlbmd0aDsKLQotICAgICAgICBmb3IgKHVpbnQ4X3QgaSA9IDA7IGkgPCAxMjsgaSsrKSAvLyBvbmx5IHRoZSBmaXJzdCAxMiBzdiBnbyBpbiBzZW50ZW5jZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoaSA8IHN2VXNlZENvdW50KQotICAgICAgICAgICAgICAgIGxlbmd0aCA9IHNucHJpbnRmKHBNYXJrZXIsIGxlbmd0aFJlbWFpbmluZywgIiUwMmQsIiwgc3ZVc2VkTGlzdFtpXSk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgbGVuZ3RoID0gc25wcmludGYocE1hcmtlciwgbGVuZ3RoUmVtYWluaW5nLCAiLCIpOwotCi0gICAgICAgICAgICBpZiAobGVuZ3RoIDwgMCB8fCBsZW5ndGggPj0gbGVuZ3RoUmVtYWluaW5nKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIExPQ19MT0dFKCJOTUVBIEVycm9yIGluIHN0cmluZyBmb3JtYXR0aW5nIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcE1hcmtlciArPSBsZW5ndGg7Ci0gICAgICAgICAgICBsZW5ndGhSZW1haW5pbmcgLT0gbGVuZ3RoOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxvY2F0aW9uRXh0ZW5kZWQuZmxhZ3MgJiBHUFNfTE9DQVRJT05fRVhURU5ERURfSEFTX0RPUCkKLSAgICAgICAgeyAgIC8vIGRvcCBpcyBpbiBsb2NhdGlvbkV4dGVuZGVkLCAoUU1JKQotICAgICAgICAgICAgbGVuZ3RoID0gc25wcmludGYocE1hcmtlciwgbGVuZ3RoUmVtYWluaW5nLCAiJS4xZiwlLjFmLCUuMWYiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb25FeHRlbmRlZC5wZG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb25FeHRlbmRlZC5oZG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb25FeHRlbmRlZC52ZG9wKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChsb2NfZW5nX2RhdGFfcC0+cGRvcCA+IDAgJiYgbG9jX2VuZ19kYXRhX3AtPmhkb3AgPiAwICYmIGxvY19lbmdfZGF0YV9wLT52ZG9wID4gMCkKLSAgICAgICAgeyAgIC8vIGRvcCB3YXMgY2FjaGVkIGZyb20gc3YgcmVwb3J0IChSUEMpCi0gICAgICAgICAgICBsZW5ndGggPSBzbnByaW50ZihwTWFya2VyLCBsZW5ndGhSZW1haW5pbmcsICIlLjFmLCUuMWYsJS4xZiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NfZW5nX2RhdGFfcC0+cGRvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY19lbmdfZGF0YV9wLT5oZG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jX2VuZ19kYXRhX3AtPnZkb3ApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgeyAgIC8vIG5vIGRvcAotICAgICAgICAgICAgbGVuZ3RoID0gc25wcmludGYocE1hcmtlciwgbGVuZ3RoUmVtYWluaW5nLCAiLCwiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGxlbmd0aCA9IGxvY19lbmdfbm1lYV9wdXRfY2hlY2tzdW0oc2VudGVuY2UsIHNpemVvZihzZW50ZW5jZSkpOwotICAgICAgICBsb2NfZW5nX25tZWFfc2VuZChzZW50ZW5jZSwgbGVuZ3RoLCBsb2NfZW5nX2RhdGFfcCk7Ci0KLSAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIC0tLS0tLSRHUFZURy0tLS0tLQotICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICBwTWFya2VyID0gc2VudGVuY2U7Ci0gICAgICAgIGxlbmd0aFJlbWFpbmluZyA9IHNpemVvZihzZW50ZW5jZSk7Ci0KLSAgICAgICAgaWYgKGxvY2F0aW9uLmdwc0xvY2F0aW9uLmZsYWdzICYgR1BTX0xPQ0FUSU9OX0hBU19CRUFSSU5HKQotICAgICAgICB7Ci0gICAgICAgICAgICBmbG9hdCBtYWdUcmFjayA9IGxvY2F0aW9uLmdwc0xvY2F0aW9uLmJlYXJpbmc7Ci0gICAgICAgICAgICBpZiAobG9jYXRpb25FeHRlbmRlZC5mbGFncyAmIEdQU19MT0NBVElPTl9FWFRFTkRFRF9IQVNfTUFHX0RFVikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmbG9hdCBtYWdUcmFjayA9IGxvY2F0aW9uLmdwc0xvY2F0aW9uLmJlYXJpbmcgLSBsb2NhdGlvbkV4dGVuZGVkLm1hZ25ldGljRGV2aWF0aW9uOwotICAgICAgICAgICAgICAgIGlmIChtYWdUcmFjayA8IDAuMCkKLSAgICAgICAgICAgICAgICAgICAgbWFnVHJhY2sgKz0gMzYwLjA7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAobWFnVHJhY2sgPiAzNjAuMCkKLSAgICAgICAgICAgICAgICAgICAgbWFnVHJhY2sgLT0gMzYwLjA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGxlbmd0aCA9IHNucHJpbnRmKHBNYXJrZXIsIGxlbmd0aFJlbWFpbmluZywgIiRHUFZURywlLjFsZixULCUuMWxmLE0sIiwgbG9jYXRpb24uZ3BzTG9jYXRpb24uYmVhcmluZywgbWFnVHJhY2spOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgbGVuZ3RoID0gc25wcmludGYocE1hcmtlciwgbGVuZ3RoUmVtYWluaW5nLCAiJEdQVlRHLCxULCxNLCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxlbmd0aCA8IDAgfHwgbGVuZ3RoID49IGxlbmd0aFJlbWFpbmluZykKLSAgICAgICAgewotICAgICAgICAgICAgTE9DX0xPR0UoIk5NRUEgRXJyb3IgaW4gc3RyaW5nIGZvcm1hdHRpbmciKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBwTWFya2VyICs9IGxlbmd0aDsKLSAgICAgICAgbGVuZ3RoUmVtYWluaW5nIC09IGxlbmd0aDsKLQotICAgICAgICBpZiAobG9jYXRpb24uZ3BzTG9jYXRpb24uZmxhZ3MgJiBHUFNfTE9DQVRJT05fSEFTX1NQRUVEKQotICAgICAgICB7Ci0gICAgICAgICAgICBmbG9hdCBzcGVlZEtub3RzID0gbG9jYXRpb24uZ3BzTG9jYXRpb24uc3BlZWQgKiAoMzYwMC4wLzE4NTIuMCk7Ci0gICAgICAgICAgICBmbG9hdCBzcGVlZEttUGVySG91ciA9IGxvY2F0aW9uLmdwc0xvY2F0aW9uLnNwZWVkICogMy42OwotCi0gICAgICAgICAgICBsZW5ndGggPSBzbnByaW50ZihwTWFya2VyLCBsZW5ndGhSZW1haW5pbmcsICIlLjFsZixOLCUuMWxmLEssIiwgc3BlZWRLbm90cywgc3BlZWRLbVBlckhvdXIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgbGVuZ3RoID0gc25wcmludGYocE1hcmtlciwgbGVuZ3RoUmVtYWluaW5nLCAiLE4sLEssIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobGVuZ3RoIDwgMCB8fCBsZW5ndGggPj0gbGVuZ3RoUmVtYWluaW5nKQotICAgICAgICB7Ci0gICAgICAgICAgICBMT0NfTE9HRSgiTk1FQSBFcnJvciBpbiBzdHJpbmcgZm9ybWF0dGluZyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHBNYXJrZXIgKz0gbGVuZ3RoOwotICAgICAgICBsZW5ndGhSZW1haW5pbmcgLT0gbGVuZ3RoOwotCi0gICAgICAgIGlmICghKGxvY2F0aW9uLmdwc0xvY2F0aW9uLmZsYWdzICYgR1BTX0xPQ0FUSU9OX0hBU19MQVRfTE9ORykpCi0gICAgICAgICAgICBsZW5ndGggPSBzbnByaW50ZihwTWFya2VyLCBsZW5ndGhSZW1haW5pbmcsICIlYyIsICdOJyk7IC8vIE4gbWVhbnMgbm8gZml4Ci0gICAgICAgIGVsc2UgaWYgKExPQ19QT1NJVElPTl9NT0RFX1NUQU5EQUxPTkUgPT0gbG9jX2VuZ19kYXRhX3AtPmFkYXB0ZXItPmdldFBvc2l0aW9uTW9kZSgpLm1vZGUpCi0gICAgICAgICAgICBsZW5ndGggPSBzbnByaW50ZihwTWFya2VyLCBsZW5ndGhSZW1haW5pbmcsICIlYyIsICdBJyk7IC8vIEEgbWVhbnMgYXV0b25vbW91cwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBsZW5ndGggPSBzbnByaW50ZihwTWFya2VyLCBsZW5ndGhSZW1haW5pbmcsICIlYyIsICdEJyk7IC8vIEQgbWVhbnMgZGlmZmVyZW50aWFsCi0KLSAgICAgICAgbGVuZ3RoID0gbG9jX2VuZ19ubWVhX3B1dF9jaGVja3N1bShzZW50ZW5jZSwgc2l6ZW9mKHNlbnRlbmNlKSk7Ci0gICAgICAgIGxvY19lbmdfbm1lYV9zZW5kKHNlbnRlbmNlLCBsZW5ndGgsIGxvY19lbmdfZGF0YV9wKTsKLQotICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gLS0tLS0tJEdQUk1DLS0tLS0tCi0gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgIHBNYXJrZXIgPSBzZW50ZW5jZTsKLSAgICAgICAgbGVuZ3RoUmVtYWluaW5nID0gc2l6ZW9mKHNlbnRlbmNlKTsKLQotICAgICAgICBsZW5ndGggPSBzbnByaW50ZihwTWFya2VyLCBsZW5ndGhSZW1haW5pbmcsICIkR1BSTUMsJTAyZCUwMmQlMDJkLEEsIiAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHV0Y0hvdXJzLCB1dGNNaW51dGVzLCB1dGNTZWNvbmRzKTsKLQotICAgICAgICBpZiAobGVuZ3RoIDwgMCB8fCBsZW5ndGggPj0gbGVuZ3RoUmVtYWluaW5nKQotICAgICAgICB7Ci0gICAgICAgICAgICBMT0NfTE9HRSgiTk1FQSBFcnJvciBpbiBzdHJpbmcgZm9ybWF0dGluZyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHBNYXJrZXIgKz0gbGVuZ3RoOwotICAgICAgICBsZW5ndGhSZW1haW5pbmcgLT0gbGVuZ3RoOwotCi0gICAgICAgIGlmIChsb2NhdGlvbi5ncHNMb2NhdGlvbi5mbGFncyAmIEdQU19MT0NBVElPTl9IQVNfTEFUX0xPTkcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRvdWJsZSBsYXRpdHVkZSA9IGxvY2F0aW9uLmdwc0xvY2F0aW9uLmxhdGl0dWRlOwotICAgICAgICAgICAgZG91YmxlIGxvbmdpdHVkZSA9IGxvY2F0aW9uLmdwc0xvY2F0aW9uLmxvbmdpdHVkZTsKLSAgICAgICAgICAgIGNoYXIgbGF0SGVtaXNwaGVyZTsKLSAgICAgICAgICAgIGNoYXIgbG9uSGVtaXNwaGVyZTsKLSAgICAgICAgICAgIGRvdWJsZSBsYXRNaW51dGVzOwotICAgICAgICAgICAgZG91YmxlIGxvbk1pbnV0ZXM7Ci0KLSAgICAgICAgICAgIGlmIChsYXRpdHVkZSA+IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbGF0SGVtaXNwaGVyZSA9ICdOJzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsYXRIZW1pc3BoZXJlID0gJ1MnOwotICAgICAgICAgICAgICAgIGxhdGl0dWRlICo9IC0xLjA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChsb25naXR1ZGUgPCAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvbkhlbWlzcGhlcmUgPSAnVyc7Ci0gICAgICAgICAgICAgICAgbG9uZ2l0dWRlICo9IC0xLjA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9uSGVtaXNwaGVyZSA9ICdFJzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbGF0TWludXRlcyA9IGZtb2QobGF0aXR1ZGUgKiA2MC4wICwgNjAuMCk7Ci0gICAgICAgICAgICBsb25NaW51dGVzID0gZm1vZChsb25naXR1ZGUgKiA2MC4wICwgNjAuMCk7Ci0KLSAgICAgICAgICAgIGxlbmd0aCA9IHNucHJpbnRmKHBNYXJrZXIsIGxlbmd0aFJlbWFpbmluZywgIiUwMmQlMDkuNmxmLCVjLCUwM2QlMDkuNmxmLCVjLCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDhfdClmbG9vcihsYXRpdHVkZSksIGxhdE1pbnV0ZXMsIGxhdEhlbWlzcGhlcmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDhfdClmbG9vcihsb25naXR1ZGUpLGxvbk1pbnV0ZXMsIGxvbkhlbWlzcGhlcmUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgbGVuZ3RoID0gc25wcmludGYocE1hcmtlciwgbGVuZ3RoUmVtYWluaW5nLCIsLCwsIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobGVuZ3RoIDwgMCB8fCBsZW5ndGggPj0gbGVuZ3RoUmVtYWluaW5nKQotICAgICAgICB7Ci0gICAgICAgICAgICBMT0NfTE9HRSgiTk1FQSBFcnJvciBpbiBzdHJpbmcgZm9ybWF0dGluZyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHBNYXJrZXIgKz0gbGVuZ3RoOwotICAgICAgICBsZW5ndGhSZW1haW5pbmcgLT0gbGVuZ3RoOwotCi0gICAgICAgIGlmIChsb2NhdGlvbi5ncHNMb2NhdGlvbi5mbGFncyAmIEdQU19MT0NBVElPTl9IQVNfU1BFRUQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZsb2F0IHNwZWVkS25vdHMgPSBsb2NhdGlvbi5ncHNMb2NhdGlvbi5zcGVlZCAqICgzNjAwLjAvMTg1Mi4wKTsKLSAgICAgICAgICAgIGxlbmd0aCA9IHNucHJpbnRmKHBNYXJrZXIsIGxlbmd0aFJlbWFpbmluZywgIiUuMWxmLCIsIHNwZWVkS25vdHMpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgbGVuZ3RoID0gc25wcmludGYocE1hcmtlciwgbGVuZ3RoUmVtYWluaW5nLCAiLCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxlbmd0aCA8IDAgfHwgbGVuZ3RoID49IGxlbmd0aFJlbWFpbmluZykKLSAgICAgICAgewotICAgICAgICAgICAgTE9DX0xPR0UoIk5NRUEgRXJyb3IgaW4gc3RyaW5nIGZvcm1hdHRpbmciKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBwTWFya2VyICs9IGxlbmd0aDsKLSAgICAgICAgbGVuZ3RoUmVtYWluaW5nIC09IGxlbmd0aDsKLQotICAgICAgICBpZiAobG9jYXRpb24uZ3BzTG9jYXRpb24uZmxhZ3MgJiBHUFNfTE9DQVRJT05fSEFTX0JFQVJJTkcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxlbmd0aCA9IHNucHJpbnRmKHBNYXJrZXIsIGxlbmd0aFJlbWFpbmluZywgIiUuMWxmLCIsIGxvY2F0aW9uLmdwc0xvY2F0aW9uLmJlYXJpbmcpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgbGVuZ3RoID0gc25wcmludGYocE1hcmtlciwgbGVuZ3RoUmVtYWluaW5nLCAiLCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxlbmd0aCA8IDAgfHwgbGVuZ3RoID49IGxlbmd0aFJlbWFpbmluZykKLSAgICAgICAgewotICAgICAgICAgICAgTE9DX0xPR0UoIk5NRUEgRXJyb3IgaW4gc3RyaW5nIGZvcm1hdHRpbmciKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBwTWFya2VyICs9IGxlbmd0aDsKLSAgICAgICAgbGVuZ3RoUmVtYWluaW5nIC09IGxlbmd0aDsKLQotICAgICAgICBsZW5ndGggPSBzbnByaW50ZihwTWFya2VyLCBsZW5ndGhSZW1haW5pbmcsICIlMi4yZCUyLjJkJTIuMmQsIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdXRjRGF5LCB1dGNNb250aCwgdXRjWWVhcik7Ci0KLSAgICAgICAgaWYgKGxlbmd0aCA8IDAgfHwgbGVuZ3RoID49IGxlbmd0aFJlbWFpbmluZykKLSAgICAgICAgewotICAgICAgICAgICAgTE9DX0xPR0UoIk5NRUEgRXJyb3IgaW4gc3RyaW5nIGZvcm1hdHRpbmciKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBwTWFya2VyICs9IGxlbmd0aDsKLSAgICAgICAgbGVuZ3RoUmVtYWluaW5nIC09IGxlbmd0aDsKLQotICAgICAgICBpZiAobG9jYXRpb25FeHRlbmRlZC5mbGFncyAmIEdQU19MT0NBVElPTl9FWFRFTkRFRF9IQVNfTUFHX0RFVikKLSAgICAgICAgewotICAgICAgICAgICAgZmxvYXQgbWFnbmV0aWNWYXJpYXRpb24gPSBsb2NhdGlvbkV4dGVuZGVkLm1hZ25ldGljRGV2aWF0aW9uOwotICAgICAgICAgICAgY2hhciBkaXJlY3Rpb247Ci0gICAgICAgICAgICBpZiAobWFnbmV0aWNWYXJpYXRpb24gPCAwLjApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gJ1cnOwotICAgICAgICAgICAgICAgIG1hZ25ldGljVmFyaWF0aW9uICo9IC0xLjA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gJ0UnOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBsZW5ndGggPSBzbnByaW50ZihwTWFya2VyLCBsZW5ndGhSZW1haW5pbmcsICIlLjFsZiwlYywiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFnbmV0aWNWYXJpYXRpb24sIGRpcmVjdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBsZW5ndGggPSBzbnByaW50ZihwTWFya2VyLCBsZW5ndGhSZW1haW5pbmcsICIsLCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxlbmd0aCA8IDAgfHwgbGVuZ3RoID49IGxlbmd0aFJlbWFpbmluZykKLSAgICAgICAgewotICAgICAgICAgICAgTE9DX0xPR0UoIk5NRUEgRXJyb3IgaW4gc3RyaW5nIGZvcm1hdHRpbmciKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBwTWFya2VyICs9IGxlbmd0aDsKLSAgICAgICAgbGVuZ3RoUmVtYWluaW5nIC09IGxlbmd0aDsKLQotICAgICAgICBpZiAoIShsb2NhdGlvbi5ncHNMb2NhdGlvbi5mbGFncyAmIEdQU19MT0NBVElPTl9IQVNfTEFUX0xPTkcpKQotICAgICAgICAgICAgbGVuZ3RoID0gc25wcmludGYocE1hcmtlciwgbGVuZ3RoUmVtYWluaW5nLCAiJWMiLCAnTicpOyAvLyBOIG1lYW5zIG5vIGZpeAotICAgICAgICBlbHNlIGlmIChMT0NfUE9TSVRJT05fTU9ERV9TVEFOREFMT05FID09IGxvY19lbmdfZGF0YV9wLT5hZGFwdGVyLT5nZXRQb3NpdGlvbk1vZGUoKS5tb2RlKQotICAgICAgICAgICAgbGVuZ3RoID0gc25wcmludGYocE1hcmtlciwgbGVuZ3RoUmVtYWluaW5nLCAiJWMiLCAnQScpOyAvLyBBIG1lYW5zIGF1dG9ub21vdXMKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgbGVuZ3RoID0gc25wcmludGYocE1hcmtlciwgbGVuZ3RoUmVtYWluaW5nLCAiJWMiLCAnRCcpOyAvLyBEIG1lYW5zIGRpZmZlcmVudGlhbAotCi0gICAgICAgIGxlbmd0aCA9IGxvY19lbmdfbm1lYV9wdXRfY2hlY2tzdW0oc2VudGVuY2UsIHNpemVvZihzZW50ZW5jZSkpOwotICAgICAgICBsb2NfZW5nX25tZWFfc2VuZChzZW50ZW5jZSwgbGVuZ3RoLCBsb2NfZW5nX2RhdGFfcCk7Ci0KLSAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIC0tLS0tLSRHUEdHQS0tLS0tLQotICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICBwTWFya2VyID0gc2VudGVuY2U7Ci0gICAgICAgIGxlbmd0aFJlbWFpbmluZyA9IHNpemVvZihzZW50ZW5jZSk7Ci0KLSAgICAgICAgbGVuZ3RoID0gc25wcmludGYocE1hcmtlciwgbGVuZ3RoUmVtYWluaW5nLCAiJEdQR0dBLCUwMmQlMDJkJTAyZCwiICwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdXRjSG91cnMsIHV0Y01pbnV0ZXMsIHV0Y1NlY29uZHMpOwotCi0gICAgICAgIGlmIChsZW5ndGggPCAwIHx8IGxlbmd0aCA+PSBsZW5ndGhSZW1haW5pbmcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIExPQ19MT0dFKCJOTUVBIEVycm9yIGluIHN0cmluZyBmb3JtYXR0aW5nIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgcE1hcmtlciArPSBsZW5ndGg7Ci0gICAgICAgIGxlbmd0aFJlbWFpbmluZyAtPSBsZW5ndGg7Ci0KLSAgICAgICAgaWYgKGxvY2F0aW9uLmdwc0xvY2F0aW9uLmZsYWdzICYgR1BTX0xPQ0FUSU9OX0hBU19MQVRfTE9ORykKLSAgICAgICAgewotICAgICAgICAgICAgZG91YmxlIGxhdGl0dWRlID0gbG9jYXRpb24uZ3BzTG9jYXRpb24ubGF0aXR1ZGU7Ci0gICAgICAgICAgICBkb3VibGUgbG9uZ2l0dWRlID0gbG9jYXRpb24uZ3BzTG9jYXRpb24ubG9uZ2l0dWRlOwotICAgICAgICAgICAgY2hhciBsYXRIZW1pc3BoZXJlOwotICAgICAgICAgICAgY2hhciBsb25IZW1pc3BoZXJlOwotICAgICAgICAgICAgZG91YmxlIGxhdE1pbnV0ZXM7Ci0gICAgICAgICAgICBkb3VibGUgbG9uTWludXRlczsKLQotICAgICAgICAgICAgaWYgKGxhdGl0dWRlID4gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsYXRIZW1pc3BoZXJlID0gJ04nOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxhdEhlbWlzcGhlcmUgPSAnUyc7Ci0gICAgICAgICAgICAgICAgbGF0aXR1ZGUgKj0gLTEuMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGxvbmdpdHVkZSA8IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9uSGVtaXNwaGVyZSA9ICdXJzsKLSAgICAgICAgICAgICAgICBsb25naXR1ZGUgKj0gLTEuMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb25IZW1pc3BoZXJlID0gJ0UnOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBsYXRNaW51dGVzID0gZm1vZChsYXRpdHVkZSAqIDYwLjAgLCA2MC4wKTsKLSAgICAgICAgICAgIGxvbk1pbnV0ZXMgPSBmbW9kKGxvbmdpdHVkZSAqIDYwLjAgLCA2MC4wKTsKLQotICAgICAgICAgICAgbGVuZ3RoID0gc25wcmludGYocE1hcmtlciwgbGVuZ3RoUmVtYWluaW5nLCAiJTAyZCUwOS42bGYsJWMsJTAzZCUwOS42bGYsJWMsIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50OF90KWZsb29yKGxhdGl0dWRlKSwgbGF0TWludXRlcywgbGF0SGVtaXNwaGVyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50OF90KWZsb29yKGxvbmdpdHVkZSksbG9uTWludXRlcywgbG9uSGVtaXNwaGVyZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBsZW5ndGggPSBzbnByaW50ZihwTWFya2VyLCBsZW5ndGhSZW1haW5pbmcsIiwsLCwiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChsZW5ndGggPCAwIHx8IGxlbmd0aCA+PSBsZW5ndGhSZW1haW5pbmcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIExPQ19MT0dFKCJOTUVBIEVycm9yIGluIHN0cmluZyBmb3JtYXR0aW5nIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgcE1hcmtlciArPSBsZW5ndGg7Ci0gICAgICAgIGxlbmd0aFJlbWFpbmluZyAtPSBsZW5ndGg7Ci0KLSAgICAgICAgY2hhciBncHNRdWFsaXR5OwotICAgICAgICBpZiAoIShsb2NhdGlvbi5ncHNMb2NhdGlvbi5mbGFncyAmIEdQU19MT0NBVElPTl9IQVNfTEFUX0xPTkcpKQotICAgICAgICAgICAgZ3BzUXVhbGl0eSA9ICcwJzsgLy8gMCBtZWFucyBubyBmaXgKLSAgICAgICAgZWxzZSBpZiAoTE9DX1BPU0lUSU9OX01PREVfU1RBTkRBTE9ORSA9PSBsb2NfZW5nX2RhdGFfcC0+YWRhcHRlci0+Z2V0UG9zaXRpb25Nb2RlKCkubW9kZSkKLSAgICAgICAgICAgIGdwc1F1YWxpdHkgPSAnMSc7IC8vIDEgbWVhbnMgR1BTIGZpeAotICAgICAgICBlbHNlCi0gICAgICAgICAgICBncHNRdWFsaXR5ID0gJzInOyAvLyAyIG1lYW5zIERHUFMgZml4Ci0KLSAgICAgICAgaWYgKGxvY2F0aW9uRXh0ZW5kZWQuZmxhZ3MgJiBHUFNfTE9DQVRJT05fRVhURU5ERURfSEFTX0RPUCkKLSAgICAgICAgeyAgIC8vIGRvcCBpcyBpbiBsb2NhdGlvbkV4dGVuZGVkLCAoUU1JKQotICAgICAgICAgICAgbGVuZ3RoID0gc25wcmludGYocE1hcmtlciwgbGVuZ3RoUmVtYWluaW5nLCAiJWMsJTAyZCwlLjFmLCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncHNRdWFsaXR5LCBzdlVzZWRDb3VudCwgbG9jYXRpb25FeHRlbmRlZC5oZG9wKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChsb2NfZW5nX2RhdGFfcC0+cGRvcCA+IDAgJiYgbG9jX2VuZ19kYXRhX3AtPmhkb3AgPiAwICYmIGxvY19lbmdfZGF0YV9wLT52ZG9wID4gMCkKLSAgICAgICAgeyAgIC8vIGRvcCB3YXMgY2FjaGVkIGZyb20gc3YgcmVwb3J0IChSUEMpCi0gICAgICAgICAgICBsZW5ndGggPSBzbnByaW50ZihwTWFya2VyLCBsZW5ndGhSZW1haW5pbmcsICIlYywlMDJkLCUuMWYsIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwc1F1YWxpdHksIHN2VXNlZENvdW50LCBsb2NfZW5nX2RhdGFfcC0+aGRvcCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7ICAgLy8gbm8gaGRvcAotICAgICAgICAgICAgbGVuZ3RoID0gc25wcmludGYocE1hcmtlciwgbGVuZ3RoUmVtYWluaW5nLCAiJWMsJTAyZCwsIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwc1F1YWxpdHksIHN2VXNlZENvdW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChsZW5ndGggPCAwIHx8IGxlbmd0aCA+PSBsZW5ndGhSZW1haW5pbmcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIExPQ19MT0dFKCJOTUVBIEVycm9yIGluIHN0cmluZyBmb3JtYXR0aW5nIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgcE1hcmtlciArPSBsZW5ndGg7Ci0gICAgICAgIGxlbmd0aFJlbWFpbmluZyAtPSBsZW5ndGg7Ci0KLSAgICAgICAgaWYgKGxvY2F0aW9uRXh0ZW5kZWQuZmxhZ3MgJiBHUFNfTE9DQVRJT05fRVhURU5ERURfSEFTX0FMVElUVURFX01FQU5fU0VBX0xFVkVMKQotICAgICAgICB7Ci0gICAgICAgICAgICBsZW5ndGggPSBzbnByaW50ZihwTWFya2VyLCBsZW5ndGhSZW1haW5pbmcsICIlLjFsZixNLCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbkV4dGVuZGVkLmFsdGl0dWRlTWVhblNlYUxldmVsKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxlbmd0aCA9IHNucHJpbnRmKHBNYXJrZXIsIGxlbmd0aFJlbWFpbmluZywiLCwiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChsZW5ndGggPCAwIHx8IGxlbmd0aCA+PSBsZW5ndGhSZW1haW5pbmcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIExPQ19MT0dFKCJOTUVBIEVycm9yIGluIHN0cmluZyBmb3JtYXR0aW5nIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgcE1hcmtlciArPSBsZW5ndGg7Ci0gICAgICAgIGxlbmd0aFJlbWFpbmluZyAtPSBsZW5ndGg7Ci0KLSAgICAgICAgaWYgKChsb2NhdGlvbi5ncHNMb2NhdGlvbi5mbGFncyAmIEdQU19MT0NBVElPTl9IQVNfQUxUSVRVREUpICYmCi0gICAgICAgICAgICAobG9jYXRpb25FeHRlbmRlZC5mbGFncyAmIEdQU19MT0NBVElPTl9FWFRFTkRFRF9IQVNfQUxUSVRVREVfTUVBTl9TRUFfTEVWRUwpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsZW5ndGggPSBzbnByaW50ZihwTWFya2VyLCBsZW5ndGhSZW1haW5pbmcsICIlLjFsZixNLCwiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24uZ3BzTG9jYXRpb24uYWx0aXR1ZGUgLSBsb2NhdGlvbkV4dGVuZGVkLmFsdGl0dWRlTWVhblNlYUxldmVsKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxlbmd0aCA9IHNucHJpbnRmKHBNYXJrZXIsIGxlbmd0aFJlbWFpbmluZywiLCwsIik7Ci0gICAgICAgIH0KLQotICAgICAgICBsZW5ndGggPSBsb2NfZW5nX25tZWFfcHV0X2NoZWNrc3VtKHNlbnRlbmNlLCBzaXplb2Yoc2VudGVuY2UpKTsKLSAgICAgICAgbG9jX2VuZ19ubWVhX3NlbmQoc2VudGVuY2UsIGxlbmd0aCwgbG9jX2VuZ19kYXRhX3ApOwotCi0gICAgfQotICAgIC8vU2VuZCBibGFuayBOTUVBIHJlcG9ydHMgZm9yIG5vbi1maW5hbCBmaXhlcwotICAgIGVsc2UgewotICAgICAgICBzdHJsY3B5KHNlbnRlbmNlLCAiJEdQR1NBLEEsMSwsLCwsLCwsLCwsLCwsLCIsIHNpemVvZihzZW50ZW5jZSkpOwotICAgICAgICBsZW5ndGggPSBsb2NfZW5nX25tZWFfcHV0X2NoZWNrc3VtKHNlbnRlbmNlLCBzaXplb2Yoc2VudGVuY2UpKTsKLSAgICAgICAgbG9jX2VuZ19ubWVhX3NlbmQoc2VudGVuY2UsIGxlbmd0aCwgbG9jX2VuZ19kYXRhX3ApOwotCi0gICAgICAgIHN0cmxjcHkoc2VudGVuY2UsICIkR1BWVEcsLFQsLE0sLE4sLEssTiIsIHNpemVvZihzZW50ZW5jZSkpOwotICAgICAgICBsZW5ndGggPSBsb2NfZW5nX25tZWFfcHV0X2NoZWNrc3VtKHNlbnRlbmNlLCBzaXplb2Yoc2VudGVuY2UpKTsKLSAgICAgICAgbG9jX2VuZ19ubWVhX3NlbmQoc2VudGVuY2UsIGxlbmd0aCwgbG9jX2VuZ19kYXRhX3ApOwotCi0gICAgICAgIHN0cmxjcHkoc2VudGVuY2UsICIkR1BSTUMsLFYsLCwsLCwsLCwsTiIsIHNpemVvZihzZW50ZW5jZSkpOwotICAgICAgICBsZW5ndGggPSBsb2NfZW5nX25tZWFfcHV0X2NoZWNrc3VtKHNlbnRlbmNlLCBzaXplb2Yoc2VudGVuY2UpKTsKLSAgICAgICAgbG9jX2VuZ19ubWVhX3NlbmQoc2VudGVuY2UsIGxlbmd0aCwgbG9jX2VuZ19kYXRhX3ApOwotCi0gICAgICAgIHN0cmxjcHkoc2VudGVuY2UsICIkR1BHR0EsLCwsLCwwLCwsLCwsLCwiLCBzaXplb2Yoc2VudGVuY2UpKTsKLSAgICAgICAgbGVuZ3RoID0gbG9jX2VuZ19ubWVhX3B1dF9jaGVja3N1bShzZW50ZW5jZSwgc2l6ZW9mKHNlbnRlbmNlKSk7Ci0gICAgICAgIGxvY19lbmdfbm1lYV9zZW5kKHNlbnRlbmNlLCBsZW5ndGgsIGxvY19lbmdfZGF0YV9wKTsKLSAgICB9Ci0gICAgLy8gY2xlYXIgdGhlIGRvcCBjYWNoZSBzbyB0aGV5IGNhbid0IGJlIHVzZWQgYWdhaW4KLSAgICBsb2NfZW5nX2RhdGFfcC0+cGRvcCA9IDA7Ci0gICAgbG9jX2VuZ19kYXRhX3AtPmhkb3AgPSAwOwotICAgIGxvY19lbmdfZGF0YV9wLT52ZG9wID0gMDsKLQotICAgIEVYSVRfTE9HKCVkLCAwKTsKLX0KLQotCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1GVU5DVElPTiAgICBsb2NfZW5nX25tZWFfZ2VuZXJhdGVfc3YKLQotREVTQ1JJUFRJT04KLSAgIEdlbmVyYXRlIE5NRUEgc2VudGVuY2VzIGdlbmVyYXRlZCBiYXNlZCBvbiBzdiByZXBvcnQKLQotREVQRU5ERU5DSUVTCi0gICBOT05FCi0KLVJFVFVSTiBWQUxVRQotICAgMAotCi1TSURFIEVGRkVDVFMKLSAgIE4vQQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotdm9pZCBsb2NfZW5nX25tZWFfZ2VuZXJhdGVfc3YobG9jX2VuZ19kYXRhX3NfdHlwZSAqbG9jX2VuZ19kYXRhX3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHcHNTdlN0YXR1cyAmc3ZTdGF0dXMsIGNvbnN0IEdwc0xvY2F0aW9uRXh0ZW5kZWQgJmxvY2F0aW9uRXh0ZW5kZWQpCi17Ci0gICAgRU5UUllfTE9HKCk7Ci0KLSAgICBjaGFyIHNlbnRlbmNlW05NRUFfU0VOVEVOQ0VfTUFYX0xFTkdUSF0gPSB7MH07Ci0gICAgY2hhciogcE1hcmtlciA9IHNlbnRlbmNlOwotICAgIGludCBsZW5ndGhSZW1haW5pbmcgPSBzaXplb2Yoc2VudGVuY2UpOwotICAgIGludCBsZW5ndGggPSAwOwotICAgIGludCBzdkNvdW50ID0gc3ZTdGF0dXMubnVtX3N2czsKLSAgICBpbnQgc2VudGVuY2VDb3VudCA9IDA7Ci0gICAgaW50IHNlbnRlbmNlTnVtYmVyID0gMTsKLSAgICBpbnQgc3ZOdW1iZXIgPSAxOwotICAgIGludCBncHNDb3VudCA9IDA7Ci0gICAgaW50IGdsbkNvdW50ID0gMDsKLQotICAgIC8vQ291bnQgR1BTIFNWcyBmb3Igc2FwYXJhdGluZyBHUFMgZnJvbSBHTE9OQVNTIGFuZCB0aHJvdyBvdGhlcnMKLQotICAgIGZvcihzdk51bWJlcj0xOyBzdk51bWJlciA8PSBzdkNvdW50OyBzdk51bWJlcisrKSB7Ci0gICAgICAgIGlmKCAoc3ZTdGF0dXMuc3ZfbGlzdFtzdk51bWJlci0xXS5wcm4gPj0gR1BTX1BSTl9TVEFSVCkmJgotICAgICAgICAgICAgKHN2U3RhdHVzLnN2X2xpc3Rbc3ZOdW1iZXItMV0ucHJuIDw9IEdQU19QUk5fRU5EKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdwc0NvdW50Kys7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggKHN2U3RhdHVzLnN2X2xpc3Rbc3ZOdW1iZXItMV0ucHJuID49IEdMT05BU1NfUFJOX1NUQVJUKSAmJgotICAgICAgICAgICAgICAgICAoc3ZTdGF0dXMuc3ZfbGlzdFtzdk51bWJlci0xXS5wcm4gPD0gR0xPTkFTU19QUk5fRU5EKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdsbkNvdW50Kys7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAvLyAtLS0tLS0kR1BHU1YtLS0tLS0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIGlmIChncHNDb3VudCA8PSAwKQotICAgIHsKLSAgICAgICAgLy8gbm8gc3ZzIGluIHZpZXcsIHNvIGp1c3Qgc2VuZCBhIGJsYW5rICRHUEdTViBzZW50ZW5jZQotICAgICAgICBzdHJsY3B5KHNlbnRlbmNlLCAiJEdQR1NWLDEsMSwwLCIsIHNpemVvZihzZW50ZW5jZSkpOwotICAgICAgICBsZW5ndGggPSBsb2NfZW5nX25tZWFfcHV0X2NoZWNrc3VtKHNlbnRlbmNlLCBzaXplb2Yoc2VudGVuY2UpKTsKLSAgICAgICAgbG9jX2VuZ19ubWVhX3NlbmQoc2VudGVuY2UsIGxlbmd0aCwgbG9jX2VuZ19kYXRhX3ApOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBzdk51bWJlciA9IDE7Ci0gICAgICAgIHNlbnRlbmNlTnVtYmVyID0gMTsKLSAgICAgICAgc2VudGVuY2VDb3VudCA9IGdwc0NvdW50LzQgKyAoZ3BzQ291bnQgJSA0ICE9IDApOwotCi0gICAgICAgIHdoaWxlIChzZW50ZW5jZU51bWJlciA8PSBzZW50ZW5jZUNvdW50KQotICAgICAgICB7Ci0gICAgICAgICAgICBwTWFya2VyID0gc2VudGVuY2U7Ci0gICAgICAgICAgICBsZW5ndGhSZW1haW5pbmcgPSBzaXplb2Yoc2VudGVuY2UpOwotCi0gICAgICAgICAgICBsZW5ndGggPSBzbnByaW50ZihwTWFya2VyLCBsZW5ndGhSZW1haW5pbmcsICIkR1BHU1YsJWQsJWQsJTAyZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHNlbnRlbmNlQ291bnQsIHNlbnRlbmNlTnVtYmVyLCBncHNDb3VudCk7Ci0KLSAgICAgICAgICAgIGlmIChsZW5ndGggPCAwIHx8IGxlbmd0aCA+PSBsZW5ndGhSZW1haW5pbmcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTE9DX0xPR0UoIk5NRUEgRXJyb3IgaW4gc3RyaW5nIGZvcm1hdHRpbmciKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwTWFya2VyICs9IGxlbmd0aDsKLSAgICAgICAgICAgIGxlbmd0aFJlbWFpbmluZyAtPSBsZW5ndGg7Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGk9MDsgKHN2TnVtYmVyIDw9IHN2Q291bnQpICYmIChpIDwgNCk7ICBzdk51bWJlcisrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKCAoc3ZTdGF0dXMuc3ZfbGlzdFtzdk51bWJlci0xXS5wcm4gPj0gR1BTX1BSTl9TVEFSVCkgJiYKLSAgICAgICAgICAgICAgICAgICAgKHN2U3RhdHVzLnN2X2xpc3Rbc3ZOdW1iZXItMV0ucHJuIDw9IEdQU19QUk5fRU5EKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSBzbnByaW50ZihwTWFya2VyLCBsZW5ndGhSZW1haW5pbmcsIiwlMDJkLCUwMmQsJTAzZCwiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN2U3RhdHVzLnN2X2xpc3Rbc3ZOdW1iZXItMV0ucHJuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKDAuNSArIHN2U3RhdHVzLnN2X2xpc3Rbc3ZOdW1iZXItMV0uZWxldmF0aW9uKSwgLy9mbG9hdCB0byBpbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSgwLjUgKyBzdlN0YXR1cy5zdl9saXN0W3N2TnVtYmVyLTFdLmF6aW11dGgpKTsgLy9mbG9hdCB0byBpbnQKLQotICAgICAgICAgICAgICAgICAgICBpZiAobGVuZ3RoIDwgMCB8fCBsZW5ndGggPj0gbGVuZ3RoUmVtYWluaW5nKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMT0NfTE9HRSgiTk1FQSBFcnJvciBpbiBzdHJpbmcgZm9ybWF0dGluZyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBNYXJrZXIgKz0gbGVuZ3RoOwotICAgICAgICAgICAgICAgICAgICBsZW5ndGhSZW1haW5pbmcgLT0gbGVuZ3RoOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChzdlN0YXR1cy5zdl9saXN0W3N2TnVtYmVyLTFdLnNuciA+IDApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9IHNucHJpbnRmKHBNYXJrZXIsIGxlbmd0aFJlbWFpbmluZywiJTAyZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKDAuNSArIHN2U3RhdHVzLnN2X2xpc3Rbc3ZOdW1iZXItMV0uc25yKSk7IC8vZmxvYXQgdG8gaW50Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPCAwIHx8IGxlbmd0aCA+PSBsZW5ndGhSZW1haW5pbmcpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9DX0xPR0UoIk5NRUEgRXJyb3IgaW4gc3RyaW5nIGZvcm1hdHRpbmciKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwTWFya2VyICs9IGxlbmd0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aFJlbWFpbmluZyAtPSBsZW5ndGg7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbGVuZ3RoID0gbG9jX2VuZ19ubWVhX3B1dF9jaGVja3N1bShzZW50ZW5jZSwgc2l6ZW9mKHNlbnRlbmNlKSk7Ci0gICAgICAgICAgICBsb2NfZW5nX25tZWFfc2VuZChzZW50ZW5jZSwgbGVuZ3RoLCBsb2NfZW5nX2RhdGFfcCk7Ci0gICAgICAgICAgICBzZW50ZW5jZU51bWJlcisrOwotCi0gICAgICAgIH0gIC8vd2hpbGUKLQotICAgIH0gLy9pZgotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gLS0tLS0tJEdMR1NWLS0tLS0tCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBpZiAoZ2xuQ291bnQgPD0gMCkKLSAgICB7Ci0gICAgICAgIC8vIG5vIHN2cyBpbiB2aWV3LCBzbyBqdXN0IHNlbmQgYSBibGFuayAkR0xHU1Ygc2VudGVuY2UKLSAgICAgICAgc3RybGNweShzZW50ZW5jZSwgIiRHTEdTViwxLDEsMCwiLCBzaXplb2Yoc2VudGVuY2UpKTsKLSAgICAgICAgbGVuZ3RoID0gbG9jX2VuZ19ubWVhX3B1dF9jaGVja3N1bShzZW50ZW5jZSwgc2l6ZW9mKHNlbnRlbmNlKSk7Ci0gICAgICAgIGxvY19lbmdfbm1lYV9zZW5kKHNlbnRlbmNlLCBsZW5ndGgsIGxvY19lbmdfZGF0YV9wKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgc3ZOdW1iZXIgPSAxOwotICAgICAgICBzZW50ZW5jZU51bWJlciA9IDE7Ci0gICAgICAgIHNlbnRlbmNlQ291bnQgPSBnbG5Db3VudC80ICsgKGdsbkNvdW50ICUgNCAhPSAwKTsKLQotICAgICAgICB3aGlsZSAoc2VudGVuY2VOdW1iZXIgPD0gc2VudGVuY2VDb3VudCkKLSAgICAgICAgewotICAgICAgICAgICAgcE1hcmtlciA9IHNlbnRlbmNlOwotICAgICAgICAgICAgbGVuZ3RoUmVtYWluaW5nID0gc2l6ZW9mKHNlbnRlbmNlKTsKLQotICAgICAgICAgICAgbGVuZ3RoID0gc25wcmludGYocE1hcmtlciwgbGVuZ3RoUmVtYWluaW5nLCAiJEdMR1NWLCVkLCVkLCUwMmQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzZW50ZW5jZUNvdW50LCBzZW50ZW5jZU51bWJlciwgZ2xuQ291bnQpOwotCi0gICAgICAgICAgICBpZiAobGVuZ3RoIDwgMCB8fCBsZW5ndGggPj0gbGVuZ3RoUmVtYWluaW5nKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIExPQ19MT0dFKCJOTUVBIEVycm9yIGluIHN0cmluZyBmb3JtYXR0aW5nIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcE1hcmtlciArPSBsZW5ndGg7Ci0gICAgICAgICAgICBsZW5ndGhSZW1haW5pbmcgLT0gbGVuZ3RoOwotCi0gICAgICAgICAgICBmb3IgKGludCBpPTA7IChzdk51bWJlciA8PSBzdkNvdW50KSAmJiAoaSA8IDQpOyAgc3ZOdW1iZXIrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiggKHN2U3RhdHVzLnN2X2xpc3Rbc3ZOdW1iZXItMV0ucHJuID49IEdMT05BU1NfUFJOX1NUQVJUKSAmJgotICAgICAgICAgICAgICAgICAgICAoc3ZTdGF0dXMuc3ZfbGlzdFtzdk51bWJlci0xXS5wcm4gPD0gR0xPTkFTU19QUk5fRU5EKSApICAgICAgewotCi0gICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9IHNucHJpbnRmKHBNYXJrZXIsIGxlbmd0aFJlbWFpbmluZywiLCUwMmQsJTAyZCwlMDNkLCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ZTdGF0dXMuc3ZfbGlzdFtzdk51bWJlci0xXS5wcm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoMC41ICsgc3ZTdGF0dXMuc3ZfbGlzdFtzdk51bWJlci0xXS5lbGV2YXRpb24pLCAvL2Zsb2F0IHRvIGludAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKDAuNSArIHN2U3RhdHVzLnN2X2xpc3Rbc3ZOdW1iZXItMV0uYXppbXV0aCkpOyAvL2Zsb2F0IHRvIGludAotCi0gICAgICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPCAwIHx8IGxlbmd0aCA+PSBsZW5ndGhSZW1haW5pbmcpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExPQ19MT0dFKCJOTUVBIEVycm9yIGluIHN0cmluZyBmb3JtYXR0aW5nIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcE1hcmtlciArPSBsZW5ndGg7Ci0gICAgICAgICAgICAgICAgICAgIGxlbmd0aFJlbWFpbmluZyAtPSBsZW5ndGg7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHN2U3RhdHVzLnN2X2xpc3Rbc3ZOdW1iZXItMV0uc25yID4gMCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gc25wcmludGYocE1hcmtlciwgbGVuZ3RoUmVtYWluaW5nLCIlMDJkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoMC41ICsgc3ZTdGF0dXMuc3ZfbGlzdFtzdk51bWJlci0xXS5zbnIpKTsgLy9mbG9hdCB0byBpbnQKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA8IDAgfHwgbGVuZ3RoID49IGxlbmd0aFJlbWFpbmluZykKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0NfTE9HRSgiTk1FQSBFcnJvciBpbiBzdHJpbmcgZm9ybWF0dGluZyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBNYXJrZXIgKz0gbGVuZ3RoOwotICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoUmVtYWluaW5nIC09IGxlbmd0aDsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBsZW5ndGggPSBsb2NfZW5nX25tZWFfcHV0X2NoZWNrc3VtKHNlbnRlbmNlLCBzaXplb2Yoc2VudGVuY2UpKTsKLSAgICAgICAgICAgIGxvY19lbmdfbm1lYV9zZW5kKHNlbnRlbmNlLCBsZW5ndGgsIGxvY19lbmdfZGF0YV9wKTsKLSAgICAgICAgICAgIHNlbnRlbmNlTnVtYmVyKys7Ci0KLSAgICAgICAgfSAgLy93aGlsZQotCi0gICAgfS8vaWYKLQotICAgIGlmIChzdlN0YXR1cy51c2VkX2luX2ZpeF9tYXNrID09IDApCi0gICAgeyAgIC8vIE5vIHN2IHVzZWQsIHNvIHRoZXJlIHdpbGwgYmUgbm8gcG9zaXRpb24gcmVwb3J0LCBzbyBzZW5kCi0gICAgICAgIC8vIGJsYW5rIE5NRUEgc2VudGVuY2VzCi0gICAgICAgIHN0cmxjcHkoc2VudGVuY2UsICIkR1BHU0EsQSwxLCwsLCwsLCwsLCwsLCwsIiwgc2l6ZW9mKHNlbnRlbmNlKSk7Ci0gICAgICAgIGxlbmd0aCA9IGxvY19lbmdfbm1lYV9wdXRfY2hlY2tzdW0oc2VudGVuY2UsIHNpemVvZihzZW50ZW5jZSkpOwotICAgICAgICBsb2NfZW5nX25tZWFfc2VuZChzZW50ZW5jZSwgbGVuZ3RoLCBsb2NfZW5nX2RhdGFfcCk7Ci0KLSAgICAgICAgc3RybGNweShzZW50ZW5jZSwgIiRHUFZURywsVCwsTSwsTiwsSyxOIiwgc2l6ZW9mKHNlbnRlbmNlKSk7Ci0gICAgICAgIGxlbmd0aCA9IGxvY19lbmdfbm1lYV9wdXRfY2hlY2tzdW0oc2VudGVuY2UsIHNpemVvZihzZW50ZW5jZSkpOwotICAgICAgICBsb2NfZW5nX25tZWFfc2VuZChzZW50ZW5jZSwgbGVuZ3RoLCBsb2NfZW5nX2RhdGFfcCk7Ci0KLSAgICAgICAgc3RybGNweShzZW50ZW5jZSwgIiRHUFJNQywsViwsLCwsLCwsLCxOIiwgc2l6ZW9mKHNlbnRlbmNlKSk7Ci0gICAgICAgIGxlbmd0aCA9IGxvY19lbmdfbm1lYV9wdXRfY2hlY2tzdW0oc2VudGVuY2UsIHNpemVvZihzZW50ZW5jZSkpOwotICAgICAgICBsb2NfZW5nX25tZWFfc2VuZChzZW50ZW5jZSwgbGVuZ3RoLCBsb2NfZW5nX2RhdGFfcCk7Ci0KLSAgICAgICAgc3RybGNweShzZW50ZW5jZSwgIiRHUEdHQSwsLCwsLDAsLCwsLCwsLCIsIHNpemVvZihzZW50ZW5jZSkpOwotICAgICAgICBsZW5ndGggPSBsb2NfZW5nX25tZWFfcHV0X2NoZWNrc3VtKHNlbnRlbmNlLCBzaXplb2Yoc2VudGVuY2UpKTsKLSAgICAgICAgbG9jX2VuZ19ubWVhX3NlbmQoc2VudGVuY2UsIGxlbmd0aCwgbG9jX2VuZ19kYXRhX3ApOwotICAgIH0KLSAgICBlbHNlCi0gICAgeyAgIC8vIGNhY2hlIHRoZSB1c2VkIGluIGZpeCBtYXNrLCBhcyBpdCB3aWxsIGJlIG5lZWRlZCB0byBzZW5kICRHUEdTQQotICAgICAgICAvLyBkdXJpbmcgdGhlIHBvc2l0aW9uIHJlcG9ydAotICAgICAgICBsb2NfZW5nX2RhdGFfcC0+c3ZfdXNlZF9tYXNrID0gc3ZTdGF0dXMudXNlZF9pbl9maXhfbWFzazsKLQotICAgICAgICAvLyBGb3IgUlBDLCB0aGUgRE9QIGFyZSBzZW50IGR1cmluZyBzdiByZXBvcnQsIHNvIGNhY2hlIHRoZW0KLSAgICAgICAgLy8gbm93IHRvIGJlIHNlbnQgZHVyaW5nIHBvc2l0aW9uIHJlcG9ydC4KLSAgICAgICAgLy8gRm9yIFFNSSwgdGhlIERPUCB3aWxsIGJlIGluIHBvc2l0aW9uIHJlcG9ydC4KLSAgICAgICAgaWYgKGxvY2F0aW9uRXh0ZW5kZWQuZmxhZ3MgJiBHUFNfTE9DQVRJT05fRVhURU5ERURfSEFTX0RPUCkKLSAgICAgICAgewotICAgICAgICAgICAgbG9jX2VuZ19kYXRhX3AtPnBkb3AgPSBsb2NhdGlvbkV4dGVuZGVkLnBkb3A7Ci0gICAgICAgICAgICBsb2NfZW5nX2RhdGFfcC0+aGRvcCA9IGxvY2F0aW9uRXh0ZW5kZWQuaGRvcDsKLSAgICAgICAgICAgIGxvY19lbmdfZGF0YV9wLT52ZG9wID0gbG9jYXRpb25FeHRlbmRlZC52ZG9wOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgbG9jX2VuZ19kYXRhX3AtPnBkb3AgPSAwOwotICAgICAgICAgICAgbG9jX2VuZ19kYXRhX3AtPmhkb3AgPSAwOwotICAgICAgICAgICAgbG9jX2VuZ19kYXRhX3AtPnZkb3AgPSAwOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBFWElUX0xPRyglZCwgMCk7Ci19CmRpZmYgLS1naXQgYS9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaV81MDAwMS9sb2NfZW5nX25tZWEuaCBiL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpXzUwMDAxL2xvY19lbmdfbm1lYS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGM2ZGJiLi4wMDAwMDAwCi0tLSBhL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpXzUwMDAxL2xvY19lbmdfbm1lYS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDEyLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZwotICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCi0gKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCi0gKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKLSAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCi0gKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCi0gKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2lmbmRlZiBMT0NfRU5HX05NRUFfSAotI2RlZmluZSBMT0NfRU5HX05NRUFfSAotCi0jaW5jbHVkZSA8aGFyZHdhcmUvZ3BzLmg+Ci0KLSNkZWZpbmUgTk1FQV9TRU5URU5DRV9NQVhfTEVOR1RIIDIwMAotCi12b2lkIGxvY19lbmdfbm1lYV9zZW5kKGNoYXIgKnBObWVhLCBpbnQgbGVuZ3RoLCBsb2NfZW5nX2RhdGFfc190eXBlICpsb2NfZW5nX2RhdGFfcCk7Ci1pbnQgbG9jX2VuZ19ubWVhX3B1dF9jaGVja3N1bShjaGFyICpwTm1lYSwgaW50IG1heFNpemUpOwotdm9pZCBsb2NfZW5nX25tZWFfZ2VuZXJhdGVfc3YobG9jX2VuZ19kYXRhX3NfdHlwZSAqbG9jX2VuZ19kYXRhX3AsIGNvbnN0IEdwc1N2U3RhdHVzICZzdlN0YXR1cywgY29uc3QgR3BzTG9jYXRpb25FeHRlbmRlZCAmbG9jYXRpb25FeHRlbmRlZCk7Ci12b2lkIGxvY19lbmdfbm1lYV9nZW5lcmF0ZV9wb3MobG9jX2VuZ19kYXRhX3NfdHlwZSAqbG9jX2VuZ19kYXRhX3AsIGNvbnN0IFVscExvY2F0aW9uICZsb2NhdGlvbiwgY29uc3QgR3BzTG9jYXRpb25FeHRlbmRlZCAmbG9jYXRpb25FeHRlbmRlZCwgdW5zaWduZWQgY2hhciBnZW5lcmF0ZV9ubWVhKTsKLQotI2VuZGlmIC8vIExPQ19FTkdfTk1FQV9ICmRpZmYgLS1naXQgYS9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaV81MDAwMS9sb2NfZW5nX3h0cmEuY3BwIGIvbXNtODk3NC9sb2NfYXBpL2xpYmxvY19hcGlfNTAwMDEvbG9jX2VuZ194dHJhLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU4MjI4Ni4uMDAwMDAwMAotLS0gYS9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaV81MDAwMS9sb2NfZW5nX3h0cmEuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAwOS0yMDEzLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZwotICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCi0gKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uLCBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAotICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgotICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCi0gKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQotICogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgotICogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNkZWZpbmUgTE9HX05EREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJMb2NTdmNfZW5nIgotCi0jaW5jbHVkZSA8bG9jX2VuZy5oPgotI2luY2x1ZGUgPE1zZ1Rhc2suaD4KLSNpbmNsdWRlICJsb2dfdXRpbC5oIgotI2luY2x1ZGUgInBsYXRmb3JtX2xpYl9pbmNsdWRlcy5oIgotCi11c2luZyBuYW1lc3BhY2UgbG9jX2NvcmU7Ci0KLXN0cnVjdCBMb2NFbmdSZXF1ZXN0WHRyYVNlcnZlciA6IHB1YmxpYyBMb2NNc2cgewotICAgIExvY0VuZ0FkYXB0ZXIqIG1BZGFwdGVyOwotICAgIGlubGluZSBMb2NFbmdSZXF1ZXN0WHRyYVNlcnZlcihMb2NFbmdBZGFwdGVyKiBhZGFwdGVyKSA6Ci0gICAgICAgIExvY01zZygpLCBtQWRhcHRlcihhZGFwdGVyKQotICAgIHsKLSAgICAgICAgbG9jYWxsb2coKTsKLSAgICB9Ci0gICAgaW5saW5lIHZpcnR1YWwgdm9pZCBwcm9jKCkgY29uc3QgewotICAgICAgICBtQWRhcHRlci0+cmVxdWVzdFh0cmFTZXJ2ZXIoKTsKLSAgICB9Ci0gICAgaW5saW5lIHZvaWQgbG9jYWxsb2coKSBjb25zdCB7Ci0gICAgICAgIExPQ19MT0dWKCJMb2NFbmdSZXF1ZXN0WHRyYVNlcnZlciIpOwotICAgIH0KLSAgICBpbmxpbmUgdmlydHVhbCB2b2lkIGxvZygpIGNvbnN0IHsKLSAgICAgICAgbG9jYWxsb2coKTsKLSAgICB9Ci19OwotCi1zdHJ1Y3QgTG9jRW5nSW5qZWN0WHRyYURhdGEgOiBwdWJsaWMgTG9jTXNnIHsKLSAgICBMb2NFbmdBZGFwdGVyKiBtQWRhcHRlcjsKLSAgICBjaGFyKiBtRGF0YTsKLSAgICBjb25zdCBpbnQgbUxlbjsKLSAgICBpbmxpbmUgTG9jRW5nSW5qZWN0WHRyYURhdGEoTG9jRW5nQWRhcHRlciogYWRhcHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogZGF0YSwgaW50IGxlbik6Ci0gICAgICAgIExvY01zZygpLCBtQWRhcHRlcihhZGFwdGVyKSwKLSAgICAgICAgbURhdGEobmV3IGNoYXJbbGVuXSksIG1MZW4obGVuKQotICAgIHsKLSAgICAgICAgbWVtY3B5KCh2b2lkKiltRGF0YSwgKHZvaWQqKWRhdGEsIGxlbik7Ci0gICAgICAgIGxvY2FsbG9nKCk7Ci0gICAgfQotICAgIGlubGluZSB+TG9jRW5nSW5qZWN0WHRyYURhdGEoKQotICAgIHsKLSAgICAgICAgZGVsZXRlW10gbURhdGE7Ci0gICAgfQotICAgIGlubGluZSB2aXJ0dWFsIHZvaWQgcHJvYygpIGNvbnN0IHsKLSAgICAgICAgbUFkYXB0ZXItPnNldFh0cmFEYXRhKG1EYXRhLCBtTGVuKTsKLSAgICB9Ci0gICAgaW5saW5lICB2b2lkIGxvY2FsbG9nKCkgY29uc3QgewotICAgICAgICBMT0NfTE9HVigibGVuZ3RoOiAlZFxuICBkYXRhOiAlcCIsIG1MZW4sIG1EYXRhKTsKLSAgICB9Ci0gICAgaW5saW5lIHZpcnR1YWwgdm9pZCBsb2coKSBjb25zdCB7Ci0gICAgICAgIGxvY2FsbG9nKCk7Ci0gICAgfQotfTsKLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLUZVTkNUSU9OICAgIGxvY19lbmdfeHRyYV9pbml0Ci0KLURFU0NSSVBUSU9OCi0gICBJbml0aWFsaXplIFhUUkEgbW9kdWxlLgotCi1ERVBFTkRFTkNJRVMKLSAgIE4vQQotCi1SRVRVUk4gVkFMVUUKLSAgIDA6IHN1Y2Nlc3MKLQotU0lERSBFRkZFQ1RTCi0gICBOL0EKLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLWludCBsb2NfZW5nX3h0cmFfaW5pdCAobG9jX2VuZ19kYXRhX3NfdHlwZSAmbG9jX2VuZ19kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICBHcHNYdHJhRXh0Q2FsbGJhY2tzKiBjYWxsYmFja3MpCi17Ci0gICAgaW50IHJldF92YWwgPSAtMTsKLSAgICBsb2NfZW5nX3h0cmFfZGF0YV9zX3R5cGUgKnh0cmFfbW9kdWxlX2RhdGFfcHRyOwotCi0gICAgaWYoY2FsbGJhY2tzID09IE5VTEwpIHsKLSAgICAgICAgTE9DX0xPR0UoImxvY19lbmdfeHRyYV9pbml0OiBmYWlsZWQsIGNiIGlzIE5VTEwiKTsKLSAgICB9IGVsc2UgewotICAgICAgICB4dHJhX21vZHVsZV9kYXRhX3B0ciA9ICZsb2NfZW5nX2RhdGEueHRyYV9tb2R1bGVfZGF0YTsKLSAgICAgICAgeHRyYV9tb2R1bGVfZGF0YV9wdHItPmRvd25sb2FkX3JlcXVlc3RfY2IgPSBjYWxsYmFja3MtPmRvd25sb2FkX3JlcXVlc3RfY2I7Ci0gICAgICAgIHh0cmFfbW9kdWxlX2RhdGFfcHRyLT5yZXBvcnRfeHRyYV9zZXJ2ZXJfY2IgPSBjYWxsYmFja3MtPnJlcG9ydF94dHJhX3NlcnZlcl9jYjsKLQotICAgICAgICByZXRfdmFsID0gMDsKLSAgICB9Ci0gICAgcmV0dXJuIHJldF92YWw7Ci19Ci0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1GVU5DVElPTiAgICBsb2NfZW5nX3h0cmFfaW5qZWN0X2RhdGEKLQotREVTQ1JJUFRJT04KLSAgIEluamVjdHMgWFRSQSBmaWxlIGludG8gdGhlIGVuZ2luZSBidXQgYnVmZmVycyB0aGUgZGF0YSBpZiBlbmdpbmUgaXMgYnVzeS4KLQotREVQRU5ERU5DSUVTCi0gICBOL0EKLQotUkVUVVJOIFZBTFVFCi0gICAwOiBzdWNjZXNzCi0gICA+MDogZmFpbHVyZQotCi1TSURFIEVGRkVDVFMKLSAgIE4vQQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotaW50IGxvY19lbmdfeHRyYV9pbmplY3RfZGF0YShsb2NfZW5nX2RhdGFfc190eXBlICZsb2NfZW5nX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIGRhdGEsIGludCBsZW5ndGgpCi17Ci0gICAgTG9jRW5nQWRhcHRlciogYWRhcHRlciA9IGxvY19lbmdfZGF0YS5hZGFwdGVyOwotICAgIGFkYXB0ZXItPnNlbmRNc2cobmV3IExvY0VuZ0luamVjdFh0cmFEYXRhKGFkYXB0ZXIsIGRhdGEsIGxlbmd0aCkpOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotRlVOQ1RJT04gICAgbG9jX2VuZ194dHJhX3JlcXVlc3Rfc2VydmVyCi0KLURFU0NSSVBUSU9OCi0gICBSZXF1ZXN0IHRoZSBYdHJhIHNlcnZlciB1cmwgZnJvbSB0aGUgbW9kZW0KLQotREVQRU5ERU5DSUVTCi0gICBOL0EKLQotUkVUVVJOIFZBTFVFCi0gICBsZW5ndGggb2Ygc2VydmVyIHN0cmluZwotCi1TSURFIEVGRkVDVFMKLSAgIE4vQQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotaW50IGxvY19lbmdfeHRyYV9yZXF1ZXN0X3NlcnZlcihsb2NfZW5nX2RhdGFfc190eXBlICZsb2NfZW5nX2RhdGEpCi17Ci0gICAgTG9jRW5nQWRhcHRlciogYWRhcHRlciA9IGxvY19lbmdfZGF0YS5hZGFwdGVyOwotICAgIGFkYXB0ZXItPnNlbmRNc2cobmV3IExvY0VuZ1JlcXVlc3RYdHJhU2VydmVyKGFkYXB0ZXIpKTsKLQotICAgIHJldHVybiAwOwotCi19CmRpZmYgLS1naXQgYS9tc204OTc0L2xvY19hcGkvbGlibG9jX2FwaV81MDAwMS9sb2NfZW5nX3h0cmEuaCBiL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpXzUwMDAxL2xvY19lbmdfeHRyYS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzVmNDk3Li4wMDAwMDAwCi0tLSBhL21zbTg5NzQvbG9jX2FwaS9saWJsb2NfYXBpXzUwMDAxL2xvY19lbmdfeHRyYS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDA5LDIwMTEgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKLSAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAotICogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAotICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgotICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCi0gKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQotICogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgotICogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpZm5kZWYgTE9DX0VOR19YVFJBX0gKLSNkZWZpbmUgTE9DX0VOR19YVFJBX0gKLQotI2luY2x1ZGUgPGhhcmR3YXJlL2dwcy5oPgotCi0vLyBNb2R1bGUgZGF0YQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgIC8vIGxvY19lbmdfaW9jdGxfY2JfZGF0YV9zX3R5cGUgICBpb2N0bF9jYl9kYXRhOwotICAgZ3BzX3h0cmFfZG93bmxvYWRfcmVxdWVzdCAgICAgIGRvd25sb2FkX3JlcXVlc3RfY2I7Ci0gICByZXBvcnRfeHRyYV9zZXJ2ZXIgICAgICAgICAgICAgcmVwb3J0X3h0cmFfc2VydmVyX2NiOwotCi0gICAvLyBYVFJBIGRhdGEgYnVmZmVyCi0gICBjaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAqeHRyYV9kYXRhX2Zvcl9pbmplY3Rpb247ICAvLyBOVUxMIGlmIG5vIHBlbmRpbmcgZGF0YQotICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHh0cmFfZGF0YV9sZW47Ci19IGxvY19lbmdfeHRyYV9kYXRhX3NfdHlwZTsKLQotI2VuZGlmIC8vIExPQ19FTkdfWFRSQV9ICmRpZmYgLS1naXQgYS9tc204OTc0L3BsYXRmb3JtX2xpYl9hYnN0cmFjdGlvbnMvZWxhcHNlZF9taWxsaXNfc2luY2VfYm9vdC5jcHAgYi9tc204OTc0L3BsYXRmb3JtX2xpYl9hYnN0cmFjdGlvbnMvZWxhcHNlZF9taWxsaXNfc2luY2VfYm9vdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4Y2I5M2EuLjAwMDAwMDAKLS0tIGEvbXNtODk3NC9wbGF0Zm9ybV9saWJfYWJzdHJhY3Rpb25zL2VsYXBzZWRfbWlsbGlzX3NpbmNlX2Jvb3QuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDEzLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZwotICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCi0gKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCi0gKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKLSAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCi0gKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCi0gKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNpbmNsdWRlICJwbGF0Zm9ybV9saWJfdGltZS5oIgotCi1pbnQ2NF90IHN5c3RlbVRpbWUoaW50IGNsb2NrKQotewotICAgIHN0cnVjdCB0aW1ldmFsIHQ7Ci0gICAgdC50dl9zZWMgPSB0LnR2X3VzZWMgPSAwOwotICAgIGdldHRpbWVvZmRheSgmdCwgTlVMTCk7Ci0gICAgcmV0dXJuIHQudHZfc2VjKjEwMDAwMDBMTCArIHQudHZfdXNlYzsKLX0KLQotCi1pbnQ2NF90IGVsYXBzZWRNaWxsaXNTaW5jZUJvb3QoKQotewotICAgIGludDY0X3QgdF91cyA9IHN5c3RlbVRpbWUoMCk7Ci0gICAgcmV0dXJuIChpbnQ2NF90KSB0X3VzIC8gMTAwMExMOwotfQpkaWZmIC0tZ2l0IGEvbXNtODk3NC9wbGF0Zm9ybV9saWJfYWJzdHJhY3Rpb25zL3BsYXRmb3JtX2xpYl9pbmNsdWRlcy5oIGIvbXNtODk3NC9wbGF0Zm9ybV9saWJfYWJzdHJhY3Rpb25zL3BsYXRmb3JtX2xpYl9pbmNsdWRlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODU4Njc0Li4wMDAwMDAwCi0tLSBhL21zbTg5NzQvcGxhdGZvcm1fbGliX2Fic3RyYWN0aW9ucy9wbGF0Zm9ybV9saWJfaW5jbHVkZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKLSAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAotICogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAotICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgotICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCi0gKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQotICogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgotICogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2lmbmRlZiBfUExBVEZPUk1fTElCX0lOQ0xVREVTX0hfCi0jZGVmaW5lIF9QTEFURk9STV9MSUJfSU5DTFVERVNfSF8KLQotI2luY2x1ZGUgInBsYXRmb3JtX2xpYl90aW1lLmgiCi0jaW5jbHVkZSAicGxhdGZvcm1fbGliX21hY3Jvcy5oIgotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL21zbTg5NzQvcGxhdGZvcm1fbGliX2Fic3RyYWN0aW9ucy9wbGF0Zm9ybV9saWJfbWFjcm9zLmggYi9tc204OTc0L3BsYXRmb3JtX2xpYl9hYnN0cmFjdGlvbnMvcGxhdGZvcm1fbGliX21hY3Jvcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzQ4ZGQ5Li4wMDAwMDAwCi0tLSBhL21zbTg5NzQvcGxhdGZvcm1fbGliX2Fic3RyYWN0aW9ucy9wbGF0Zm9ybV9saWJfbWFjcm9zLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTMsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCi0gKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKLSAqICAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKLSAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAotICogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKLSAqIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KLSAqIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpZm5kZWYgX19QTEFURk9STV9MSUJfTUFDUk9TX0hfXwotI2RlZmluZSBfX1BMQVRGT1JNX0xJQl9NQUNST1NfSF9fCi0KLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotCi0jZGVmaW5lIFRTX1BSSU5URihmb3JtYXQsIHguLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHN0cnVjdCB0aW1ldmFsIHR2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHN0cnVjdCB0aW1lem9uZSB0ejsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGludCBoaCwgbW0sIHNzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGdldHRpbWVvZmRheSgmdHYsICZ0eik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGhoID0gdHYudHZfc2VjLzM2MDAlMjQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIG1tID0gKHR2LnR2X3NlYyUzNjAwKS82MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHNzID0gdHYudHZfc2VjJTYwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGZwcmludGYoc3Rkb3V0LCIlMDJkOiUwMmQ6JTAyZC4lMDZsZF0iIGZvcm1hdCAiXG4iLCBoaCwgbW0sIHNzLCB0di50dl91c2VjLCMjeCk7ICAgIFwKLX0KLQotCi0jaWZkZWYgVVNFX0dMSUIKLQotI2RlZmluZSBzdHJsY2F0IGdfc3RybGNhdAotI2RlZmluZSBzdHJsY3B5IGdfc3RybGNweQotCi0jZGVmaW5lIEFMT0dFKGZvcm1hdCwgeC4uLikgVFNfUFJJTlRGKCJFLyVzICglZCk6ICIgZm9ybWF0ICwgTE9HX1RBRywgZ2V0cGlkKCksICMjeCkKLSNkZWZpbmUgQUxPR1coZm9ybWF0LCB4Li4uKSBUU19QUklOVEYoIlcvJXMgKCVkKTogIiBmb3JtYXQgLCBMT0dfVEFHLCBnZXRwaWQoKSwgIyN4KQotI2RlZmluZSBBTE9HSShmb3JtYXQsIHguLi4pIFRTX1BSSU5URigiSS8lcyAoJWQpOiAiIGZvcm1hdCAsIExPR19UQUcsIGdldHBpZCgpLCAjI3gpCi0jZGVmaW5lIEFMT0dEKGZvcm1hdCwgeC4uLikgVFNfUFJJTlRGKCJELyVzICglZCk6ICIgZm9ybWF0ICwgTE9HX1RBRywgZ2V0cGlkKCksICMjeCkKLSNkZWZpbmUgQUxPR1YoZm9ybWF0LCB4Li4uKSBUU19QUklOVEYoIlYvJXMgKCVkKTogIiBmb3JtYXQgLCBMT0dfVEFHLCBnZXRwaWQoKSwgIyN4KQotCi0jZGVmaW5lIEdFVFRJRF9QTEFURk9STV9MSUJfQUJTVFJBQ1RJT04gKHN5c2NhbGwoU1lTX2dldHRpZCkpCi0KLSNkZWZpbmUgTE9DX0VYVF9DUkVBVEVfVEhSRUFEX0NCX1BMQVRGT1JNX0xJQl9BQlNUUkFDVElPTiBjcmVhdGVQdGhyZWFkCi0jZGVmaW5lIEVMQVBTRURfTUlMTElTX1NJTkNFX0JPT1RfUExBVEZPUk1fTElCX0FCU1RSQUNUSU9OIChlbGFwc2VkTWlsbGlzU2luY2VCb290KCkpCi0KLQotI2Vsc2UKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotcGlkX3QgZ2V0dGlkKHZvaWQpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZGVmaW5lIEdFVFRJRF9QTEFURk9STV9MSUJfQUJTVFJBQ1RJT04gKGdldHRpZCgpKQotI2RlZmluZSBMT0NfRVhUX0NSRUFURV9USFJFQURfQ0JfUExBVEZPUk1fTElCX0FCU1RSQUNUSU9OIGFuZHJvaWQ6OkFuZHJvaWRSdW50aW1lOjpjcmVhdGVKYXZhVGhyZWFkCi0jZGVmaW5lIEVMQVBTRURfTUlMTElTX1NJTkNFX0JPT1RfUExBVEZPUk1fTElCX0FCU1RSQUNUSU9OICAoYW5kcm9pZDo6ZWxhcHNlZFJlYWx0aW1lKCkpCi0KLSNlbmRpZgotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL21zbTg5NzQvcGxhdGZvcm1fbGliX2Fic3RyYWN0aW9ucy9wbGF0Zm9ybV9saWJfdGltZS5oIGIvbXNtODk3NC9wbGF0Zm9ybV9saWJfYWJzdHJhY3Rpb25zL3BsYXRmb3JtX2xpYl90aW1lLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlMDEzYWYuLjAwMDAwMDAKLS0tIGEvbXNtODk3NC9wbGF0Zm9ybV9saWJfYWJzdHJhY3Rpb25zL3BsYXRmb3JtX2xpYl90aW1lLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTMsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCi0gKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKLSAqICAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKLSAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAotICogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKLSAqIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KLSAqIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpZm5kZWYgX1BMQVRGT1JNX0xJQl9USU1FX0hfCi0jZGVmaW5lIF9QTEFURk9STV9MSUJfVElNRV9IXwotCi1pbnQ2NF90IHN5c3RlbVRpbWUoaW50IGNsb2NrKTsKLWludDY0X3QgZWxhcHNlZE1pbGxpc1NpbmNlQm9vdCgpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL21zbTg5NzQvdXRpbHMvQW5kcm9pZC5tayBiL21zbTg5NzQvdXRpbHMvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjM0ZTEwMS4uMDAwMDAwMAotLS0gYS9tc204OTc0L3V0aWxzL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi1pZm5lcSAoJChCT0FSRF9WRU5ET1JfUUNPTV9HUFNfTE9DX0FQSV9IQVJEV0FSRSksKQotaWZuZXEgKCQoQlVJTERfVElOWV9BTkRST0lEKSx0cnVlKQotI0NvbXBpbGUgdGhpcyBsaWJyYXJ5IG9ubHkgZm9yIGJ1aWxkcyB3aXRoIHRoZSBsYXRlc3QgbW9kZW0gaW1hZ2UKLQotTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotIyMgTGlicwotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0gICAgbGlidXRpbHMgXAotICAgIGxpYmN1dGlscyBcCi0gICAgbGlibG9nCi0KLUxPQ0FMX1NSQ19GSUxFUyArPSBcCi0gICAgbG9jX2xvZy5jcHAgXAotICAgIGxvY19jZmcuY3BwIFwKLSAgICBtc2dfcS5jIFwKLSAgICBsaW5rZWRfbGlzdC5jIFwKLSAgICBsb2NfdGFyZ2V0LmNwcCBcCi0gICAgbG9jX3RpbWVyLmMgXAotICAgIC4uL3BsYXRmb3JtX2xpYl9hYnN0cmFjdGlvbnMvZWxhcHNlZF9taWxsaXNfc2luY2VfYm9vdC5jcHAgXAotICAgIGxvY19taXNjX3V0aWxzLmNwcAotCi1MT0NBTF9DRkxBR1MgKz0gXAotICAgICAtZm5vLXNob3J0LWVudW1zIFwKLSAgICAgLURfQU5EUk9JRF8KLQotaWZlcSAoJChUQVJHRVRfQlVJTERfVkFSSUFOVCksdXNlcikKLSAgIExPQ0FMX0NGTEFHUyArPSAtRFRBUkdFVF9CVUlMRF9WQVJJQU5UX1VTRVIKLWVuZGlmCi0KLUxPQ0FMX0xERkxBR1MgKz0gLVdsLC0tZXhwb3J0LWR5bmFtaWMKLQotIyMgSW5jbHVkZXMKLUxPQ0FMX0NfSU5DTFVERVM6PSBcCi0gICAgJChMT0NBTF9QQVRIKS8uLi9wbGF0Zm9ybV9saWJfYWJzdHJhY3Rpb25zCi0KLUxPQ0FMX0NPUFlfSEVBREVSU19UTzo9IGdwcy51dGlscy8KLUxPQ0FMX0NPUFlfSEVBREVSUzo9IFwKLSAgIGxvY19sb2cuaCBcCi0gICBsb2NfY2ZnLmggXAotICAgbG9nX3V0aWwuaCBcCi0gICBsaW5rZWRfbGlzdC5oIFwKLSAgIG1zZ19xLmggXAotICAgbG9jX3RhcmdldC5oIFwKLSAgIGxvY190aW1lci5oIFwKLSAgIC4uL3BsYXRmb3JtX2xpYl9hYnN0cmFjdGlvbnMvcGxhdGZvcm1fbGliX2luY2x1ZGVzLmggXAotICAgLi4vcGxhdGZvcm1fbGliX2Fic3RyYWN0aW9ucy9wbGF0Zm9ybV9saWJfdGltZS5oIFwKLSAgIC4uL3BsYXRmb3JtX2xpYl9hYnN0cmFjdGlvbnMvcGxhdGZvcm1fbGliX21hY3Jvcy5oIFwKLSAgIGxvY19taXNjX3V0aWxzLmgKLQotTE9DQUxfTU9EVUxFIDo9IGxpYmdwcy51dGlscwotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotCi1MT0NBTF9QUkVMSU5LX01PRFVMRSA6PSBmYWxzZQotCi1pbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCi1lbmRpZiAjIG5vdCBCVUlMRF9USU5ZX0FORFJPSUQKLWVuZGlmICMgQk9BUkRfVkVORE9SX1FDT01fR1BTX0xPQ19BUElfSEFSRFdBUkUKZGlmZiAtLWdpdCBhL21zbTg5NzQvdXRpbHMvTWFrZWZpbGUuYW0gYi9tc204OTc0L3V0aWxzL01ha2VmaWxlLmFtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTkzNWYwLi4wMDAwMDAwCi0tLSBhL21zbTg5NzQvdXRpbHMvTWFrZWZpbGUuYW0KKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi1BTV9DRkxBR1MgPSAtV3VuZGVmIFwKLSAgICAgICAgIC1NRCBcCi0gICAgICAgICAtV25vLXRyaWdyYXBocyBcCi0gICAgICAgICAtZyAtTzAgXAotICAgICAgICAgLWZuby1pbmxpbmUgXAotICAgICAgICAgLWZuby1zaG9ydC1lbnVtcyBcCi0gICAgICAgICAtZnBpYyBcCi0gICAgICAgICAtSS4uL3BsYXRmb3JtX2xpYl9hYnN0cmFjdGlvbnMKLQotbGliZ3BzX3V0aWxzX3NvX2xhX2hfc291cmNlcyA9IGxvZ191dGlsLmggXAotICAgICAgICAgICAgbXNnX3EuaCBcCi0gICAgICAgICAgICBsaW5rZWRfbGlzdC5oIFwKLSAgICAgICAgICAgIGxvY19jZmcuaCBcCi0gICAgICAgICAgICBsb2NfbG9nLmggXAotICAgICAgICAgICAgLi4vcGxhdGZvcm1fbGliX2Fic3RyYWN0aW9ucy9wbGF0Zm9ybV9saWJfaW5jbHVkZXMuaCBcCi0gICAgICAgICAgICAuLi9wbGF0Zm9ybV9saWJfYWJzdHJhY3Rpb25zL3BsYXRmb3JtX2xpYl90aW1lLmggXAotICAgICAgICAgICAgLi4vcGxhdGZvcm1fbGliX2Fic3RyYWN0aW9ucy9wbGF0Zm9ybV9saWJfbWFjcm9zLmgKLQotbGliZ3BzX3V0aWxzX3NvX2xhX2Nfc291cmNlcyA9IGxpbmtlZF9saXN0LmMgXAotICAgICAgICAgICAgbXNnX3EuYyBcCi0gICAgICAgICAgICBsb2NfY2ZnLmNwcCBcCi0gICAgICAgICAgICBsb2NfbG9nLmNwcCBcCi0gICAgICAgICAgICAuLi9wbGF0Zm9ybV9saWJfYWJzdHJhY3Rpb25zL2VsYXBzZWRfbWlsbGlzX3NpbmNlX2Jvb3QuY3BwCi0KLWxpYnJhcnlfaW5jbHVkZWRpciA9ICQocGtnaW5jbHVkZWRpcikvdXRpbHMKLQotbGlicmFyeV9pbmNsdWRlX0hFQURFUlMgPSAkKGxpYmdwc191dGlsc19zb19sYV9oX3NvdXJjZXMpCi0KLWxpYmdwc191dGlsc19zb19sYV9TT1VSQ0VTID0gJChsaWJncHNfdXRpbHNfc29fbGFfY19zb3VyY2VzKQotCi1pZiBVU0VfR0xJQgotbGliZ3BzX3V0aWxzX3NvX2xhX0NGTEFHUyA9IC1EVVNFX0dMSUIgJChBTV9DRkxBR1MpIEBHTElCX0NGTEFHU0AKLWxpYmdwc191dGlsc19zb19sYV9MREZMQUdTID0gLWxzdGRjKysgLWxwdGhyZWFkIEBHTElCX0xJQlNAIC1zaGFyZWQgLXZlcnNpb24taW5mbyAxOjA6MAotbGliZ3BzX3V0aWxzX3NvX2xhX0NQUEZMQUdTID0gLURVU0VfR0xJQiAkKEFNX0NGTEFHUykgJChBTV9DUFBGTEFHUykgQEdMSUJfQ0ZMQUdTQAotZWxzZQotbGliZ3BzX3V0aWxzX3NvX2xhX0NGTEFHUyA9ICQoQU1fQ0ZMQUdTKQotbGliZ3BzX3V0aWxzX3NvX2xhX0xERkxBR1MgPSAtbHB0aHJlYWQgLXNoYXJlZCAtdmVyc2lvbi1pbmZvIDE6MDowCi1saWJncHNfdXRpbHNfc29fbGFfQ1BQRkxBR1MgPSAkKEFNX0NGTEFHUykgJChBTV9DUFBGTEFHUykKLWVuZGlmCi0KLWxpYmdwc191dGlsc19zb19sYV9MSUJBREQgPSAtbHN0ZGMrKyAtbGN1dGlscwotCi0jQ3JlYXRlIGFuZCBJbnN0YWxsIGxpYnJhcmllcwotbGliX0xUTElCUkFSSUVTID0gbGliZ3BzX3V0aWxzX3NvLmxhCmRpZmYgLS1naXQgYS9tc204OTc0L3V0aWxzL2xpbmtlZF9saXN0LmMgYi9tc204OTc0L3V0aWxzL2xpbmtlZF9saXN0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlZjhjYmMuLjAwMDAwMDAKLS0tIGEvbXNtODk3NC91dGlscy9saW5rZWRfbGlzdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMSwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKLSAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAotICogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAotICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgotICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCi0gKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQotICogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgotICogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImxpbmtlZF9saXN0LmgiCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2RlZmluZSBMT0dfVEFHICJMb2NTdmNfdXRpbHNfbGwiCi0jaW5jbHVkZSAibG9nX3V0aWwuaCIKLSNpbmNsdWRlICJwbGF0Zm9ybV9saWJfaW5jbHVkZXMuaCIKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotdHlwZWRlZiBzdHJ1Y3QgbGlzdF9lbGVtZW50IHsKLSAgIHN0cnVjdCBsaXN0X2VsZW1lbnQqIG5leHQ7Ci0gICBzdHJ1Y3QgbGlzdF9lbGVtZW50KiBwcmV2OwotICAgdm9pZCogZGF0YV9wdHI7Ci0gICB2b2lkICgqZGVhbGxvY19mdW5jKSh2b2lkKik7Ci19bGlzdF9lbGVtZW50OwotCi10eXBlZGVmIHN0cnVjdCBsaXN0X3N0YXRlIHsKLSAgIGxpc3RfZWxlbWVudCogcF9oZWFkOwotICAgbGlzdF9lbGVtZW50KiBwX3RhaWw7Ci19IGxpc3Rfc3RhdGU7Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEVORCBJTlRFUk5BTCBGVU5DVElPTlMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gIEZVTkNUSU9OOiAgIGxpbmtlZF9saXN0X2luaXQKLQotICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotbGlua2VkX2xpc3RfZXJyX3R5cGUgbGlua2VkX2xpc3RfaW5pdCh2b2lkKiogbGlzdF9kYXRhKQotewotICAgaWYoIGxpc3RfZGF0YSA9PSBOVUxMICkKLSAgIHsKLSAgICAgIExPQ19MT0dFKCIlczogSW52YWxpZCBsaXN0IHBhcmFtZXRlciFcbiIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICByZXR1cm4gZUxJTktFRF9MSVNUX0lOVkFMSURfUEFSQU1FVEVSOwotICAgfQotCi0gICBsaXN0X3N0YXRlKiB0bXBfbGlzdDsKLSAgIHRtcF9saXN0ID0gKGxpc3Rfc3RhdGUqKWNhbGxvYygxLCBzaXplb2YobGlzdF9zdGF0ZSkpOwotICAgaWYoIHRtcF9saXN0ID09IE5VTEwgKQotICAgewotICAgICAgTE9DX0xPR0UoIiVzOiBVbmFibGUgdG8gYWxsb2NhdGUgc3BhY2UgZm9yIGxpc3QhXG4iLCBfX0ZVTkNUSU9OX18pOwotICAgICAgcmV0dXJuIGVMSU5LRURfTElTVF9GQUlMVVJFX0dFTkVSQUw7Ci0gICB9Ci0KLSAgIHRtcF9saXN0LT5wX2hlYWQgPSBOVUxMOwotICAgdG1wX2xpc3QtPnBfdGFpbCA9IE5VTEw7Ci0KLSAgICpsaXN0X2RhdGEgPSB0bXBfbGlzdDsKLQotICAgcmV0dXJuIGVMSU5LRURfTElTVF9TVUNDRVNTOwotfQotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gIEZVTkNUSU9OOiAgIGxpbmtlZF9saXN0X2Rlc3Ryb3kKLQotICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotbGlua2VkX2xpc3RfZXJyX3R5cGUgbGlua2VkX2xpc3RfZGVzdHJveSh2b2lkKiogbGlzdF9kYXRhKQotewotICAgaWYoIGxpc3RfZGF0YSA9PSBOVUxMICkKLSAgIHsKLSAgICAgIExPQ19MT0dFKCIlczogSW52YWxpZCBsaXN0IHBhcmFtZXRlciFcbiIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICByZXR1cm4gZUxJTktFRF9MSVNUX0lOVkFMSURfSEFORExFOwotICAgfQotCi0gICBsaXN0X3N0YXRlKiBwX2xpc3QgPSAobGlzdF9zdGF0ZSopKmxpc3RfZGF0YTsKLQotICAgbGlua2VkX2xpc3RfZmx1c2gocF9saXN0KTsKLQotICAgZnJlZSgqbGlzdF9kYXRhKTsKLSAgICpsaXN0X2RhdGEgPSBOVUxMOwotCi0gICByZXR1cm4gZUxJTktFRF9MSVNUX1NVQ0NFU1M7Ci19Ci0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgRlVOQ1RJT046ICAgbGlua2VkX2xpc3RfYWRkCi0KLSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLWxpbmtlZF9saXN0X2Vycl90eXBlIGxpbmtlZF9saXN0X2FkZCh2b2lkKiBsaXN0X2RhdGEsIHZvaWQgKmRhdGFfb2JqLCB2b2lkICgqZGVhbGxvYykodm9pZCopKQotewotICAgTE9DX0xPR0QoIiVzOiBBZGRpbmcgdG8gbGlzdCBkYXRhX29iaiA9IDB4JXBcbiIsIF9fRlVOQ1RJT05fXywgZGF0YV9vYmopOwotICAgaWYoIGxpc3RfZGF0YSA9PSBOVUxMICkKLSAgIHsKLSAgICAgIExPQ19MT0dFKCIlczogSW52YWxpZCBsaXN0IHBhcmFtZXRlciFcbiIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICByZXR1cm4gZUxJTktFRF9MSVNUX0lOVkFMSURfSEFORExFOwotICAgfQotCi0gICBpZiggZGF0YV9vYmogPT0gTlVMTCApCi0gICB7Ci0gICAgICBMT0NfTE9HRSgiJXM6IEludmFsaWQgaW5wdXQgcGFyYW1ldGVyIVxuIiwgX19GVU5DVElPTl9fKTsKLSAgICAgIHJldHVybiBlTElOS0VEX0xJU1RfSU5WQUxJRF9QQVJBTUVURVI7Ci0gICB9Ci0KLSAgIGxpc3Rfc3RhdGUqIHBfbGlzdCA9IChsaXN0X3N0YXRlKilsaXN0X2RhdGE7Ci0gICBsaXN0X2VsZW1lbnQqIGVsZW0gPSAobGlzdF9lbGVtZW50KiltYWxsb2Moc2l6ZW9mKGxpc3RfZWxlbWVudCkpOwotICAgaWYoIGVsZW0gPT0gTlVMTCApCi0gICB7Ci0gICAgICBMT0NfTE9HRSgiJXM6IE1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZFxuIiwgX19GVU5DVElPTl9fKTsKLSAgICAgIHJldHVybiBlTElOS0VEX0xJU1RfRkFJTFVSRV9HRU5FUkFMOwotICAgfQotCi0gICAvKiBDb3B5IGRhdGEgdG8gbmV3bHkgY3JlYXRlZCBlbGVtZW50ICovCi0gICBlbGVtLT5kYXRhX3B0ciA9IGRhdGFfb2JqOwotICAgZWxlbS0+bmV4dCA9IE5VTEw7Ci0gICBlbGVtLT5wcmV2ID0gTlVMTDsKLSAgIGVsZW0tPmRlYWxsb2NfZnVuYyA9IGRlYWxsb2M7Ci0KLSAgIC8qIFJlcGxhY2UgaGVhZCBlbGVtZW50ICovCi0gICBsaXN0X2VsZW1lbnQqIHRtcCA9IHBfbGlzdC0+cF9oZWFkOwotICAgcF9saXN0LT5wX2hlYWQgPSBlbGVtOwotICAgLyogUG9pbnQgbmV4dCB0byB0aGUgcHJldmlvdXMgaGVhZCBlbGVtZW50ICovCi0gICBwX2xpc3QtPnBfaGVhZC0+bmV4dCA9IHRtcDsKLQotICAgaWYoIHRtcCAhPSBOVUxMICkKLSAgIHsKLSAgICAgIHRtcC0+cHJldiA9IHBfbGlzdC0+cF9oZWFkOwotICAgfQotICAgZWxzZQotICAgewotICAgICAgcF9saXN0LT5wX3RhaWwgPSBwX2xpc3QtPnBfaGVhZDsKLSAgIH0KLQotICAgcmV0dXJuIGVMSU5LRURfTElTVF9TVUNDRVNTOwotfQotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gIEZVTkNUSU9OOiAgIGxpbmtlZF9saXN0X3JlbW92ZQotCi0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi1saW5rZWRfbGlzdF9lcnJfdHlwZSBsaW5rZWRfbGlzdF9yZW1vdmUodm9pZCogbGlzdF9kYXRhLCB2b2lkICoqZGF0YV9vYmopCi17Ci0gICBMT0NfTE9HRCgiJXM6IFJlbW92aW5nIGZyb20gbGlzdFxuIiwgX19GVU5DVElPTl9fKTsKLSAgIGlmKCBsaXN0X2RhdGEgPT0gTlVMTCApCi0gICB7Ci0gICAgICBMT0NfTE9HRSgiJXM6IEludmFsaWQgbGlzdCBwYXJhbWV0ZXIhXG4iLCBfX0ZVTkNUSU9OX18pOwotICAgICAgcmV0dXJuIGVMSU5LRURfTElTVF9JTlZBTElEX0hBTkRMRTsKLSAgIH0KLQotICAgaWYoIGRhdGFfb2JqID09IE5VTEwgKQotICAgewotICAgICAgTE9DX0xPR0UoIiVzOiBJbnZhbGlkIGlucHV0IHBhcmFtZXRlciFcbiIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICByZXR1cm4gZUxJTktFRF9MSVNUX0lOVkFMSURfUEFSQU1FVEVSOwotICAgfQotCi0gICBsaXN0X3N0YXRlKiBwX2xpc3QgPSAobGlzdF9zdGF0ZSopbGlzdF9kYXRhOwotICAgaWYoIHBfbGlzdC0+cF90YWlsID09IE5VTEwgKQotICAgewotICAgICAgcmV0dXJuIGVMSU5LRURfTElTVF9VTkFWQUlMQUJMRV9SRVNPVVJDRTsKLSAgIH0KLQotICAgbGlzdF9lbGVtZW50KiB0bXAgPSBwX2xpc3QtPnBfdGFpbDsKLQotICAgLyogUmVwbGFjZSB0YWlsIGVsZW1lbnQgKi8KLSAgIHBfbGlzdC0+cF90YWlsID0gdG1wLT5wcmV2OwotCi0gICBpZiggcF9saXN0LT5wX3RhaWwgIT0gTlVMTCApCi0gICB7Ci0gICAgICBwX2xpc3QtPnBfdGFpbC0+bmV4dCA9IE5VTEw7Ci0gICB9Ci0gICBlbHNlCi0gICB7Ci0gICAgICBwX2xpc3QtPnBfaGVhZCA9IHBfbGlzdC0+cF90YWlsOwotICAgfQotCi0gICAvKiBDb3B5IGRhdGEgdG8gb3V0cHV0IHBhcmFtICovCi0gICAqZGF0YV9vYmogPSB0bXAtPmRhdGFfcHRyOwotCi0gICAvKiBGcmVlIGFsbG9jYXRlZCBsaXN0IGVsZW1lbnQgKi8KLSAgIGZyZWUodG1wKTsKLQotICAgcmV0dXJuIGVMSU5LRURfTElTVF9TVUNDRVNTOwotfQotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gIEZVTkNUSU9OOiAgIGxpbmtlZF9saXN0X2VtcHR5Ci0KLSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLWludCBsaW5rZWRfbGlzdF9lbXB0eSh2b2lkKiBsaXN0X2RhdGEpCi17Ci0gICBpZiggbGlzdF9kYXRhID09IE5VTEwgKQotICAgewotICAgICAgTE9DX0xPR0UoIiVzOiBJbnZhbGlkIGxpc3QgcGFyYW1ldGVyIVxuIiwgX19GVU5DVElPTl9fKTsKLSAgICAgIHJldHVybiAoaW50KWVMSU5LRURfTElTVF9JTlZBTElEX0hBTkRMRTsKLSAgIH0KLSAgIGVsc2UKLSAgIHsKLSAgICAgIGxpc3Rfc3RhdGUqIHBfbGlzdCA9IChsaXN0X3N0YXRlKilsaXN0X2RhdGE7Ci0gICAgICByZXR1cm4gcF9saXN0LT5wX2hlYWQgPT0gTlVMTCA/IDEgOiAwOwotICAgfQotfQotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gIEZVTkNUSU9OOiAgIGxpbmtlZF9saXN0X2ZsdXNoCi0KLSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLWxpbmtlZF9saXN0X2Vycl90eXBlIGxpbmtlZF9saXN0X2ZsdXNoKHZvaWQqIGxpc3RfZGF0YSkKLXsKLSAgIGlmKCBsaXN0X2RhdGEgPT0gTlVMTCApCi0gICB7Ci0gICAgICBMT0NfTE9HRSgiJXM6IEludmFsaWQgbGlzdCBwYXJhbWV0ZXIhXG4iLCBfX0ZVTkNUSU9OX18pOwotICAgICAgcmV0dXJuIGVMSU5LRURfTElTVF9JTlZBTElEX0hBTkRMRTsKLSAgIH0KLQotICAgbGlzdF9zdGF0ZSogcF9saXN0ID0gKGxpc3Rfc3RhdGUqKWxpc3RfZGF0YTsKLQotICAgLyogUmVtb3ZlIGFsbCBkeW5hbWljYWxseSBhbGxvY2F0ZWQgZWxlbWVudHMgKi8KLSAgIHdoaWxlKCBwX2xpc3QtPnBfaGVhZCAhPSBOVUxMICkKLSAgIHsKLSAgICAgIGxpc3RfZWxlbWVudCogdG1wID0gcF9saXN0LT5wX2hlYWQtPm5leHQ7Ci0KLSAgICAgIC8qIEZyZWUgZGF0YSBwb2ludGVyIGlmIHRvbGQgdG8gZG8gc28uICovCi0gICAgICBpZiggcF9saXN0LT5wX2hlYWQtPmRlYWxsb2NfZnVuYyAhPSBOVUxMICkKLSAgICAgIHsKLSAgICAgICAgIHBfbGlzdC0+cF9oZWFkLT5kZWFsbG9jX2Z1bmMocF9saXN0LT5wX2hlYWQtPmRhdGFfcHRyKTsKLSAgICAgIH0KLQotICAgICAgLyogRnJlZSBsaXN0IGVsZW1lbnQgKi8KLSAgICAgIGZyZWUocF9saXN0LT5wX2hlYWQpOwotCi0gICAgICBwX2xpc3QtPnBfaGVhZCA9IHRtcDsKLSAgIH0KLQotICAgcF9saXN0LT5wX3RhaWwgPSBOVUxMOwotCi0gICByZXR1cm4gZUxJTktFRF9MSVNUX1NVQ0NFU1M7Ci19Ci0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgRlVOQ1RJT046ICAgbGlua2VkX2xpc3Rfc2VhcmNoCi0KLSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLWxpbmtlZF9saXN0X2Vycl90eXBlIGxpbmtlZF9saXN0X3NlYXJjaCh2b2lkKiBsaXN0X2RhdGEsIHZvaWQgKipkYXRhX3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAoKmVxdWFsKSh2b2lkKiBkYXRhXzAsIHZvaWQqIGRhdGEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGRhdGFfMCwgYm9vbCBybV9pZl9mb3VuZCkKLXsKLSAgIExPQ19MT0dEKCIlczogU2VhcmNoIHRoZSBsaXN0XG4iLCBfX0ZVTkNUSU9OX18pOwotICAgaWYoIGxpc3RfZGF0YSA9PSBOVUxMIHx8IE5VTEwgPT0gZXF1YWwgKQotICAgewotICAgICAgTE9DX0xPR0UoIiVzOiBJbnZhbGlkIGxpc3QgcGFyYW1ldGVyISBsaXN0X2RhdGEgJXAgZXF1YWwgJXBcbiIsCi0gICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGxpc3RfZGF0YSwgZXF1YWwpOwotICAgICAgcmV0dXJuIGVMSU5LRURfTElTVF9JTlZBTElEX0hBTkRMRTsKLSAgIH0KLQotICAgbGlzdF9zdGF0ZSogcF9saXN0ID0gKGxpc3Rfc3RhdGUqKWxpc3RfZGF0YTsKLSAgIGlmKCBwX2xpc3QtPnBfdGFpbCA9PSBOVUxMICkKLSAgIHsKLSAgICAgIHJldHVybiBlTElOS0VEX0xJU1RfVU5BVkFJTEFCTEVfUkVTT1VSQ0U7Ci0gICB9Ci0KLSAgIGxpc3RfZWxlbWVudCogdG1wID0gcF9saXN0LT5wX2hlYWQ7Ci0KLSAgIGlmIChOVUxMICE9IGRhdGFfcCkgewotICAgICAqZGF0YV9wID0gTlVMTDsKLSAgIH0KLQotICAgd2hpbGUgKE5VTEwgIT0gdG1wKSB7Ci0gICAgIGlmICgoKmVxdWFsKShkYXRhXzAsIHRtcC0+ZGF0YV9wdHIpKSB7Ci0gICAgICAgaWYgKE5VTEwgIT0gZGF0YV9wKSB7Ci0gICAgICAgICAqZGF0YV9wID0gdG1wLT5kYXRhX3B0cjsKLSAgICAgICB9Ci0KLSAgICAgICBpZiAocm1faWZfZm91bmQpIHsKLSAgICAgICAgIGlmIChOVUxMID09IHRtcC0+cHJldikgewotICAgICAgICAgICBwX2xpc3QtPnBfaGVhZCA9IHRtcC0+bmV4dDsKLSAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgIHRtcC0+cHJldi0+bmV4dCA9IHRtcC0+bmV4dDsKLSAgICAgICAgIH0KLQotICAgICAgICAgaWYgKE5VTEwgPT0gdG1wLT5uZXh0KSB7Ci0gICAgICAgICAgIHBfbGlzdC0+cF90YWlsID0gdG1wLT5wcmV2OwotICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgdG1wLT5uZXh0LT5wcmV2ID0gdG1wLT5wcmV2OwotICAgICAgICAgfQotCi0gICAgICAgICB0bXAtPnByZXYgPSB0bXAtPm5leHQgPSBOVUxMOwotCi0gICAgICAgICAvLyBkZWFsbG9jIGRhdGEgaWYgaXQgaXMgbm90IGNvcGllZCBvdXQgJiYgY2FsbGVyCi0gICAgICAgICAvLyBoYXMgZ2l2ZW4gdXMgYSBkZWFsbG9jIGZ1bmN0aW9uIHBvaW50ZXIuCi0gICAgICAgICBpZiAoTlVMTCA9PSBkYXRhX3AgJiYgTlVMTCAhPSB0bXAtPmRlYWxsb2NfZnVuYykgewotICAgICAgICAgICAgIHRtcC0+ZGVhbGxvY19mdW5jKHRtcC0+ZGF0YV9wdHIpOwotICAgICAgICAgfQotICAgICAgICAgZnJlZSh0bXApOwotICAgICAgIH0KLQotICAgICAgIHRtcCA9IE5VTEw7Ci0gICAgIH0gZWxzZSB7Ci0gICAgICAgdG1wID0gdG1wLT5uZXh0OwotICAgICB9Ci0gICB9Ci0KLSAgIHJldHVybiBlTElOS0VEX0xJU1RfU1VDQ0VTUzsKLX0KLQpkaWZmIC0tZ2l0IGEvbXNtODk3NC91dGlscy9saW5rZWRfbGlzdC5oIGIvbXNtODk3NC91dGlscy9saW5rZWRfbGlzdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODVmMDlhLi4wMDAwMDAwCi0tLSBhL21zbTg5NzQvdXRpbHMvbGlua2VkX2xpc3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDIxNyArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTEsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCi0gKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKLSAqICAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKLSAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAotICogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKLSAqIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KLSAqIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0jaWZuZGVmIF9fTElOS0VEX0xJU1RfSF9fCi0jZGVmaW5lIF9fTElOS0VEX0xJU1RfSF9fCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotI2luY2x1ZGUgPHN0ZGJvb2wuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotLyoqIExpbmtlZCBMaXN0IFJldHVybiBDb2RlcyAqLwotdHlwZWRlZiBlbnVtCi17Ci0gIGVMSU5LRURfTElTVF9TVUNDRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCi0gICAgIC8qKjwgUmVxdWVzdCB3YXMgc3VjY2Vzc2Z1bC4gKi8KLSAgZUxJTktFRF9MSVNUX0ZBSUxVUkVfR0VORVJBTCAgICAgICAgICAgICAgICAgICAgID0gLTEsCi0gICAgIC8qKjwgRmFpbGVkIGJlY2F1c2Ugb2YgYSBnZW5lcmFsIGZhaWx1cmUuICovCi0gIGVMSU5LRURfTElTVF9JTlZBTElEX1BBUkFNRVRFUiAgICAgICAgICAgICAgICAgICA9IC0yLAotICAgICAvKio8IEZhaWxlZCBiZWNhdXNlIHRoZSByZXF1ZXN0IGNvbnRhaW5lZCBpbnZhbGlkIHBhcmFtZXRlcnMuICovCi0gIGVMSU5LRURfTElTVF9JTlZBTElEX0hBTkRMRSAgICAgICAgICAgICAgICAgICAgICA9IC0zLAotICAgICAvKio8IEZhaWxlZCBiZWNhdXNlIGFuIGludmFsaWQgaGFuZGxlIHdhcyBzcGVjaWZpZWQuICovCi0gIGVMSU5LRURfTElTVF9VTkFWQUlMQUJMRV9SRVNPVVJDRSAgICAgICAgICAgICAgICA9IC00LAotICAgICAvKio8IEZhaWxlZCBiZWNhdXNlIGFuIHRoZXJlIHdlcmUgbm90IGVub3VnaCByZXNvdXJjZXMuICovCi0gIGVMSU5LRURfTElTVF9JTlNVRkZJQ0lFTlRfQlVGRkVSICAgICAgICAgICAgICAgICA9IC01LAotICAgICAvKio8IEZhaWxlZCBiZWNhdXNlIGFuIHRoZSBzdXBwbGllZCBidWZmZXIgd2FzIHRvbyBzbWFsbC4gKi8KLX1saW5rZWRfbGlzdF9lcnJfdHlwZTsKLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLUZVTkNUSU9OICAgIGxpbmtlZF9saXN0X2luaXQKLQotREVTQ1JJUFRJT04KLSAgIEluaXRpYWxpemVzIGludGVybmFsIHN0cnVjdHVyZXMgZm9yIGxpbmtlZCBsaXN0LgotCi0gICBsaXN0X2RhdGE6IFN0YXRlIG9mIGxpc3QgdG8gYmUgaW5pdGlhbGl6ZWQuCi0KLURFUEVOREVOQ0lFUwotICAgTi9BCi0KLVJFVFVSTiBWQUxVRQotICAgTG9vayBhdCBlcnJvciBjb2RlcyBhYm92ZS4KLQotU0lERSBFRkZFQ1RTCi0gICBOL0EKLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLWxpbmtlZF9saXN0X2Vycl90eXBlIGxpbmtlZF9saXN0X2luaXQodm9pZCoqIGxpc3RfZGF0YSk7Ci0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1GVU5DVElPTiAgICBsaW5rZWRfbGlzdF9kZXN0cm95Ci0KLURFU0NSSVBUSU9OCi0gICBEZXN0cm95cyBpbnRlcm5hbCBzdHJ1Y3R1cmVzIGZvciBsaW5rZWQgbGlzdC4KLQotICAgcF9saXN0X2RhdGE6IFN0YXRlIG9mIGxpc3QgdG8gYmUgZGVzdHJveWVkLgotCi1ERVBFTkRFTkNJRVMKLSAgIE4vQQotCi1SRVRVUk4gVkFMVUUKLSAgIExvb2sgYXQgZXJyb3IgY29kZXMgYWJvdmUuCi0KLVNJREUgRUZGRUNUUwotICAgTi9BCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi1saW5rZWRfbGlzdF9lcnJfdHlwZSBsaW5rZWRfbGlzdF9kZXN0cm95KHZvaWQqKiBsaXN0X2RhdGEpOwotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotRlVOQ1RJT04gICAgbGlua2VkX2xpc3RfYWRkCi0KLURFU0NSSVBUSU9OCi0gICBBZGRzIGFuIGVsZW1lbnQgdG8gdGhlIGhlYWQgb2YgdGhlIGxpbmtlZCBsaXN0LiBUaGUgcGFzc2VkIGluIGRhdGEgcG9pbnRlcgotICAgaXMgbm90IG1vZGlmaWVkIG9yIGZyZWVkLiBQYXNzZWQgaW4gZGF0YV9vYmogaXMgZXhwZWN0ZWQgdG8gbGl2ZSB0aHJvdWdob3V0Ci0gICB0aGUgdXNlIG9mIHRoZSBsaW5rZWRfbGlzdCAoaS5lLiBkYXRhIGlzIG5vdCBhbGxvY2F0ZWQgaW50ZXJuYWxseSkKLQotICAgcF9saXN0X2RhdGE6ICBMaXN0IHRvIGFkZCBkYXRhIHRvIHRoZSBoZWFkIG9mLgotICAgZGF0YV9vYmo6ICAgICBQb2ludGVyIHRvIGRhdGEgdG8gYWRkIGludG8gbGlzdAotICAgZGVhbGxvYzogICAgICBGdW5jdGlvbiB1c2VkIHRvIGRlYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIGVsZW1lbnQuIFBhc3MgTlVMTAotICAgICAgICAgICAgICAgICBpZiB5b3UgZG8gbm90IHdhbnQgZGF0YSBkZWFsbG9jYXRlZCBkdXJpbmcgYSBmbHVzaCBvcGVyYXRpb24KLQotREVQRU5ERU5DSUVTCi0gICBOL0EKLQotUkVUVVJOIFZBTFVFCi0gICBMb29rIGF0IGVycm9yIGNvZGVzIGFib3ZlLgotCi1TSURFIEVGRkVDVFMKLSAgIE4vQQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotbGlua2VkX2xpc3RfZXJyX3R5cGUgbGlua2VkX2xpc3RfYWRkKHZvaWQqIGxpc3RfZGF0YSwgdm9pZCAqZGF0YV9vYmosIHZvaWQgKCpkZWFsbG9jKSh2b2lkKikpOwotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotRlVOQ1RJT04gICAgbGlua2VkX2xpc3RfcmVtb3ZlCi0KLURFU0NSSVBUSU9OCi0gICBSZXRyaWV2ZXMgZGF0YSBmcm9tIHRoZSBsaXN0IHRhaWwuIGRhdGFfb2JqIGlzIHRoZSB0YWlsIGVsZW1lbnQgZnJvbSB0aGUgbGlzdAotICAgcGFzc2VkIGluIGJ5IGxpbmtlZF9saXN0X2FkZC4KLQotICAgcF9saXN0X2RhdGE6ICBMaXN0IHRvIHJlbW92ZSB0aGUgdGFpbCBmcm9tLgotICAgZGF0YV9vYmo6ICAgICBQb2ludGVyIHRvIGRhdGEgcmVtb3ZlZCBmcm9tIGxpc3QKLQotREVQRU5ERU5DSUVTCi0gICBOL0EKLQotUkVUVVJOIFZBTFVFCi0gICBMb29rIGF0IGVycm9yIGNvZGVzIGFib3ZlLgotCi1TSURFIEVGRkVDVFMKLSAgIE4vQQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotbGlua2VkX2xpc3RfZXJyX3R5cGUgbGlua2VkX2xpc3RfcmVtb3ZlKHZvaWQqIGxpc3RfZGF0YSwgdm9pZCAqKmRhdGFfb2JqKTsKLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLUZVTkNUSU9OICAgIGxpbmtlZF9saXN0X2VtcHR5Ci0KLURFU0NSSVBUSU9OCi0gICBUZWxscyB3aGV0aGVyIHRoZSBsaXN0IGN1cnJlbnRseSBjb250YWlucyBhbnkgZWxlbWVudHMKLQotICAgcF9saXN0X2RhdGE6ICBMaXN0IHRvIGNoZWNrIGlmIGVtcHR5LgotCi1ERVBFTkRFTkNJRVMKLSAgIE4vQQotCi1SRVRVUk4gVkFMVUUKLSAgIDAvRkFMU0UgOiBMaXN0IGNvbnRhaW5zIGVsZW1lbnRzCi0gICAxL1RSVUUgIDogTGlzdCBpcyBFbXB0eQotICAgT3RoZXJ3aXNlIGxvb2sgYXQgZXJyb3IgY29kZXMgYWJvdmUuCi0KLVNJREUgRUZGRUNUUwotICAgTi9BCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi1pbnQgbGlua2VkX2xpc3RfZW1wdHkodm9pZCogbGlzdF9kYXRhKTsKLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLUZVTkNUSU9OICAgIGxpbmtlZF9saXN0X2ZsdXNoCi0KLURFU0NSSVBUSU9OCi0gICBSZW1vdmVzIGFsbCBlbGVtZW50cyBmcm9tIHRoZSBsaXN0IGFuZCBkZWFsbG9jYXRlcyB0aGVtIHVzaW5nIHRoZSBwcm92aWRlZAotICAgZGVhbGxvYyBmdW5jdGlvbiB3aGlsZSBhZGRpbmcgZWxlbWVudHMuCi0KLSAgIHBfbGlzdF9kYXRhOiAgTGlzdCB0byByZW1vdmUgYWxsIGVsZW1lbnRzIGZyb20uCi0KLURFUEVOREVOQ0lFUwotICAgTi9BCi0KLVJFVFVSTiBWQUxVRQotICAgTG9vayBhdCBlcnJvciBjb2RlcyBhYm92ZS4KLQotU0lERSBFRkZFQ1RTCi0gICBOL0EKLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLWxpbmtlZF9saXN0X2Vycl90eXBlIGxpbmtlZF9saXN0X2ZsdXNoKHZvaWQqIGxpc3RfZGF0YSk7Ci0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1GVU5DVElPTiAgICBsaW5rZWRfbGlzdF9zZWFyY2gKLQotREVTQ1JJUFRJT04KLSAgIFNlYXJjaGVzIGZvciBhbiBlbGVtZW50IGluIHRoZSBsaW5rZWQgbGlzdC4KLQotICAgcF9saXN0X2RhdGE6ICBMaXN0IGhhbmRsZS4KLSAgIGRhdGFfcDogICAgICAgdG8gYmUgc3RvcmVkIHdpdGggdGhlIGRhdGEgZm91bmQ7IE5VbGwgaWYgbm8gbWF0Y2guCi0gICAgICAgICAgICAgICAgIGlmIGRhdGFfcCBwYXNzZWQgaW4gYXMgTlVMTCwgdGhlbiBubyB3cml0ZSB0byBpdC4KLSAgIGVxdWFsOiAgICAgICAgRnVuY3Rpb24gcHRyIHRha2VzIGluIGEgbGlzdCBlbGVtZW50LCBhbmQgcmV0dXJucwotICAgICAgICAgICAgICAgICBpbmRpY2F0aW9uIGlmIHRoaXMgdGhlIG9uZSBsb29raW5nIGZvci4KLSAgIGRhdGFfMDogICAgICAgVGhlIGRhdGEgYmVpbmcgY29tcGFyZWQgYWdhaW5zdC4KLSAgIHJtX2lmX2ZvdW5kOiAgU2hvdWxkIGRhdGEgYmUgcmVtb3ZlZCBpZiBmb3VuZD8KLQotREVQRU5ERU5DSUVTCi0gICBOL0EKLQotUkVUVVJOIFZBTFVFCi0gICBMb29rIGF0IGVycm9yIGNvZGVzIGFib3ZlLgotCi1TSURFIEVGRkVDVFMKLSAgIE4vQQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotbGlua2VkX2xpc3RfZXJyX3R5cGUgbGlua2VkX2xpc3Rfc2VhcmNoKHZvaWQqIGxpc3RfZGF0YSwgdm9pZCAqKmRhdGFfcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICgqZXF1YWwpKHZvaWQqIGRhdGFfMCwgdm9pZCogZGF0YSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogZGF0YV8wLCBib29sIHJtX2lmX2ZvdW5kKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotI2VuZGlmIC8qIF9fTElOS0VEX0xJU1RfSF9fICovCmRpZmYgLS1naXQgYS9tc204OTc0L3V0aWxzL2xvY19jZmcuY3BwIGIvbXNtODk3NC91dGlscy9sb2NfY2ZnLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ3ODJkYy4uMDAwMDAwMAotLS0gYS9tc204OTc0L3V0aWxzL2xvY19jZmcuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDAxICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMS0yMDE0LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZwotICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCi0gKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uLCBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAotICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgotICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCi0gKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQotICogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgotICogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNkZWZpbmUgTE9HX05EREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJMb2NTdmNfdXRpbHNfY2ZnIgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxwdGhyZWFkLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0jaW5jbHVkZSA8bG9jX2NmZy5oPgotI2luY2x1ZGUgPGxvZ191dGlsLmg+Ci0jaW5jbHVkZSA8bG9jX21pc2NfdXRpbHMuaD4KLSNpZmRlZiBVU0VfR0xJQgotI2luY2x1ZGUgPGdsaWIuaD4KLSNlbmRpZgotI2luY2x1ZGUgInBsYXRmb3JtX2xpYl9pbmNsdWRlcy5oIgotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogICAgICAgICAgICAgICAgICAgICAgICAgIEdMT0JBTCBEQVRBIERFQ0xBUkFUSU9OCi0gKgotICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotLyogUGFyYW1ldGVyIGRhdGEgKi8KLXN0YXRpYyBpbnQgREVCVUdfTEVWRUwgPSAweGZmOwotc3RhdGljIGludCBUSU1FU1RBTVAgPSAwOwotCi0vKiBQYXJhbWV0ZXIgc3BlYyB0YWJsZSAqLwotc3RhdGljIGxvY19wYXJhbV9zX3R5cGUgbG9jX3BhcmFtX3RhYmxlW10gPQotewotICAgIHsiREVCVUdfTEVWRUwiLCAgICAmREVCVUdfTEVWRUwsIE5VTEwsICAgICduJ30sCi0gICAgeyJUSU1FU1RBTVAiLCAgICAgICZUSU1FU1RBTVAsICAgTlVMTCwgICAgJ24nfSwKLX07Ci1pbnQgbG9jX3BhcmFtX251bSA9IHNpemVvZihsb2NfcGFyYW1fdGFibGUpIC8gc2l6ZW9mKGxvY19wYXJhbV9zX3R5cGUpOwotCi10eXBlZGVmIHN0cnVjdCBsb2NfcGFyYW1fdl90eXBlCi17Ci0gICAgY2hhciogcGFyYW1fbmFtZTsKLSAgICBjaGFyKiBwYXJhbV9zdHJfdmFsdWU7Ci0gICAgaW50IHBhcmFtX2ludF92YWx1ZTsKLSAgICBkb3VibGUgcGFyYW1fZG91YmxlX3ZhbHVlOwotfWxvY19wYXJhbV92X3R5cGU7Ci0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1GVU5DVElPTiBsb2Nfc2V0X2NvbmZpZ19lbnRyeQotCi1ERVNDUklQVElPTgotICAgUG90ZW50aWFsbHkgc2V0cyBhIGdpdmVuIGNvbmZpZ3VyYXRpb24gdGFibGUgZW50cnkgYmFzZWQgb24gdGhlIHBhc3NlZCBpbgotICAgY29uZmlndXJhdGlvbiB2YWx1ZS4gVGhpcyBpcyBkb25lIGJ5IHVzaW5nIGEgc3RyaW5nIGNvbXBhcmlzb24gb2YgdGhlCi0gICBwYXJhbWV0ZXIgbmFtZXMgYW5kIHRob3NlIGZvdW5kIGluIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuCi0KLVBBUkFNRVRFUlM6Ci0gICBjb25maWdfZW50cnk6IGNvbmZpZ3VyYXRpb24gZW50cnkgaW4gdGhlIHRhYmxlIHRvIHBvc3NpYmx5IHNldAotICAgY29uZmlnX3ZhbHVlOiB2YWx1ZSB0byBzdG9yZSBpbiB0aGUgZW50cnkgaWYgdGhlIHBhcmFtZXRlciBuYW1lcyBtYXRjaAotCi1ERVBFTkRFTkNJRVMKLSAgIE4vQQotCi1SRVRVUk4gVkFMVUUKLSAgIE5vbmUKLQotU0lERSBFRkZFQ1RTCi0gICBOL0EKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi1pbnQgbG9jX3NldF9jb25maWdfZW50cnkobG9jX3BhcmFtX3NfdHlwZSogY29uZmlnX2VudHJ5LCBsb2NfcGFyYW1fdl90eXBlKiBjb25maWdfdmFsdWUpCi17Ci0gICAgaW50IHJldD0tMTsKLSAgICBpZihOVUxMID09IGNvbmZpZ19lbnRyeSB8fCBOVUxMID09IGNvbmZpZ192YWx1ZSkKLSAgICB7Ci0gICAgICAgIExPQ19MT0dFKCIlczogSU5WQUxJRCBjb25maWcgZW50cnkgb3IgcGFyYW1ldGVyIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0KLSAgICBpZiAoc3RyY21wKGNvbmZpZ19lbnRyeS0+cGFyYW1fbmFtZSwgY29uZmlnX3ZhbHVlLT5wYXJhbV9uYW1lKSA9PSAwICYmCi0gICAgICAgIGNvbmZpZ19lbnRyeS0+cGFyYW1fcHRyKQotICAgIHsKLSAgICAgICAgc3dpdGNoIChjb25maWdfZW50cnktPnBhcmFtX3R5cGUpCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSAncyc6Ci0gICAgICAgICAgICBpZiAoc3RyY21wKGNvbmZpZ192YWx1ZS0+cGFyYW1fc3RyX3ZhbHVlLCAiTlVMTCIpID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKigoY2hhciopY29uZmlnX2VudHJ5LT5wYXJhbV9wdHIpID0gJ1wwJzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHN0cmxjcHkoKGNoYXIqKSBjb25maWdfZW50cnktPnBhcmFtX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ192YWx1ZS0+cGFyYW1fc3RyX3ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgTE9DX01BWF9QQVJBTV9TVFJJTkcgKyAxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qIExvZyBJTkkgdmFsdWVzICovCi0gICAgICAgICAgICBMT0NfTE9HRCgiJXM6IFBBUkFNICVzID0gJXMiLCBfX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICAgICAgICAgICBjb25maWdfZW50cnktPnBhcmFtX25hbWUsIChjaGFyKiljb25maWdfZW50cnktPnBhcmFtX3B0cik7Ci0KLSAgICAgICAgICAgIGlmKE5VTEwgIT0gY29uZmlnX2VudHJ5LT5wYXJhbV9zZXQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKihjb25maWdfZW50cnktPnBhcmFtX3NldCkgPSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0ID0gMDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICduJzoKLSAgICAgICAgICAgICooKGludCAqKWNvbmZpZ19lbnRyeS0+cGFyYW1fcHRyKSA9IGNvbmZpZ192YWx1ZS0+cGFyYW1faW50X3ZhbHVlOwotICAgICAgICAgICAgLyogTG9nIElOSSB2YWx1ZXMgKi8KLSAgICAgICAgICAgIExPQ19MT0dEKCIlczogUEFSQU0gJXMgPSAlZCIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ19lbnRyeS0+cGFyYW1fbmFtZSwgY29uZmlnX3ZhbHVlLT5wYXJhbV9pbnRfdmFsdWUpOwotCi0gICAgICAgICAgICBpZihOVUxMICE9IGNvbmZpZ19lbnRyeS0+cGFyYW1fc2V0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICooY29uZmlnX2VudHJ5LT5wYXJhbV9zZXQpID0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldCA9IDA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnZic6Ci0gICAgICAgICAgICAqKChkb3VibGUgKiljb25maWdfZW50cnktPnBhcmFtX3B0cikgPSBjb25maWdfdmFsdWUtPnBhcmFtX2RvdWJsZV92YWx1ZTsKLSAgICAgICAgICAgIC8qIExvZyBJTkkgdmFsdWVzICovCi0gICAgICAgICAgICBMT0NfTE9HRCgiJXM6IFBBUkFNICVzID0gJWYiLCBfX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICAgICAgICAgICBjb25maWdfZW50cnktPnBhcmFtX25hbWUsIGNvbmZpZ192YWx1ZS0+cGFyYW1fZG91YmxlX3ZhbHVlKTsKLQotICAgICAgICAgICAgaWYoTlVMTCAhPSBjb25maWdfZW50cnktPnBhcmFtX3NldCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAqKGNvbmZpZ19lbnRyeS0+cGFyYW1fc2V0KSA9IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXQgPSAwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBMT0NfTE9HRSgiJXM6IFBBUkFNICVzIHBhcmFtZXRlciB0eXBlIG11c3QgYmUgbiwgZiwgb3IgcyIsCi0gICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNvbmZpZ19lbnRyeS0+cGFyYW1fbmFtZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLUZVTkNUSU9OIGxvY19maWxsX2NvbmZfaXRlbQotCi1ERVNDUklQVElPTgotICAgVGFrZXMgYSBsaW5lIG9mIGNvbmZpZ3VyYXRpb24gaXRlbSBhbmQgc2V0cyBkZWZpbmVkIHZhbHVlcyBiYXNlZCBvbgotICAgdGhlIHBhc3NlZCBpbiBjb25maWd1cmF0aW9uIHRhYmxlLiBUaGlzIHRhYmxlIG1hcHMgc3RyaW5ncyB0byB2YWx1ZXMgdG8KLSAgIHNldCBhbG9uZyB3aXRoIHRoZSB0eXBlIG9mIGVhY2ggb2YgdGhlc2UgdmFsdWVzLgotCi1QQVJBTUVURVJTOgotICAgaW5wdXRfYnVmIDogYnVmZmVyIGNvbnRhbmlzIGNvbmZpZyBpdGVtCi0gICBjb25maWdfdGFibGU6IHRhYmxlIGRlZmluaXRpb24gb2Ygc3RyaW5ncyB0byBwbGFjZXMgdG8gc3RvcmUgaW5mb3JtYXRpb24KLSAgIHRhYmxlX2xlbmd0aDogbGVuZ3RoIG9mIHRoZSBjb25maWd1cmF0aW9uIHRhYmxlCi0KLURFUEVOREVOQ0lFUwotICAgTi9BCi0KLVJFVFVSTiBWQUxVRQotICAgMDogTnVtYmVyIG9mIHJlY29yZHMgaW4gdGhlIGNvbmZpZ190YWJsZSBmaWxsZWQgd2l0aCBpbnB1dF9idWYKLQotU0lERSBFRkZFQ1RTCi0gICBOL0EKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi1pbnQgbG9jX2ZpbGxfY29uZl9pdGVtKGNoYXIqIGlucHV0X2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgbG9jX3BhcmFtX3NfdHlwZSogY29uZmlnX3RhYmxlLCB1aW50MzJfdCB0YWJsZV9sZW5ndGgpCi17Ci0gICAgaW50IHJldCA9IDA7Ci0KLSAgICBpZiAoaW5wdXRfYnVmICYmIGNvbmZpZ190YWJsZSkgewotICAgICAgICBjaGFyICpsYXN0czsKLSAgICAgICAgbG9jX3BhcmFtX3ZfdHlwZSBjb25maWdfdmFsdWU7Ci0gICAgICAgIG1lbXNldCgmY29uZmlnX3ZhbHVlLCAwLCBzaXplb2YoY29uZmlnX3ZhbHVlKSk7Ci0KLSAgICAgICAgLyogU2VwYXJhdGUgdmFyaWFibGUgYW5kIHZhbHVlICovCi0gICAgICAgIGNvbmZpZ192YWx1ZS5wYXJhbV9uYW1lID0gc3RydG9rX3IoaW5wdXRfYnVmLCAiPSIsICZsYXN0cyk7Ci0gICAgICAgIC8qIHNraXAgbGluZXMgdGhhdCBkbyBub3QgY29udGFpbiAiPSIgKi8KLSAgICAgICAgaWYgKGNvbmZpZ192YWx1ZS5wYXJhbV9uYW1lKSB7Ci0gICAgICAgICAgICBjb25maWdfdmFsdWUucGFyYW1fc3RyX3ZhbHVlID0gc3RydG9rX3IoTlVMTCwgIj0iLCAmbGFzdHMpOwotCi0gICAgICAgICAgICAvKiBza2lwIGxpbmVzIHRoYXQgZG8gbm90IGNvbnRhaW4gdHdvIG9wZXJhbmRzICovCi0gICAgICAgICAgICBpZiAoY29uZmlnX3ZhbHVlLnBhcmFtX3N0cl92YWx1ZSkgewotICAgICAgICAgICAgICAgIC8qIFRyaW0gbGVhZGluZyBhbmQgdHJhaWxpbmcgc3BhY2VzICovCi0gICAgICAgICAgICAgICAgbG9jX3V0aWxfdHJpbV9zcGFjZShjb25maWdfdmFsdWUucGFyYW1fbmFtZSk7Ci0gICAgICAgICAgICAgICAgbG9jX3V0aWxfdHJpbV9zcGFjZShjb25maWdfdmFsdWUucGFyYW1fc3RyX3ZhbHVlKTsKLQotICAgICAgICAgICAgICAgIC8qIFBhcnNlIG51bWVyaWNhbCB2YWx1ZSAqLwotICAgICAgICAgICAgICAgIGlmICgoc3RybGVuKGNvbmZpZ192YWx1ZS5wYXJhbV9zdHJfdmFsdWUpID49MykgJiYKLSAgICAgICAgICAgICAgICAgICAgKGNvbmZpZ192YWx1ZS5wYXJhbV9zdHJfdmFsdWVbMF0gPT0gJzAnKSAmJgotICAgICAgICAgICAgICAgICAgICAodG9sb3dlcihjb25maWdfdmFsdWUucGFyYW1fc3RyX3ZhbHVlWzFdKSA9PSAneCcpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogaGV4ICovCi0gICAgICAgICAgICAgICAgICAgIGNvbmZpZ192YWx1ZS5wYXJhbV9pbnRfdmFsdWUgPSAoaW50KSBzdHJ0b2woJmNvbmZpZ192YWx1ZS5wYXJhbV9zdHJfdmFsdWVbMl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIqKikgTlVMTCwgMTYpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgY29uZmlnX3ZhbHVlLnBhcmFtX2RvdWJsZV92YWx1ZSA9IChkb3VibGUpIGF0b2YoY29uZmlnX3ZhbHVlLnBhcmFtX3N0cl92YWx1ZSk7IC8qIGZsb2F0ICovCi0gICAgICAgICAgICAgICAgICAgIGNvbmZpZ192YWx1ZS5wYXJhbV9pbnRfdmFsdWUgPSBhdG9pKGNvbmZpZ192YWx1ZS5wYXJhbV9zdHJfdmFsdWUpOyAvKiBkZWMgKi8KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBmb3IodWludDMyX3QgaSA9IDA7IE5VTEwgIT0gY29uZmlnX3RhYmxlICYmIGkgPCB0YWJsZV9sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCFsb2Nfc2V0X2NvbmZpZ19lbnRyeSgmY29uZmlnX3RhYmxlW2ldLCAmY29uZmlnX3ZhbHVlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0ICs9IDE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gcmV0OwotfQotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotRlVOQ1RJT04gbG9jX3JlYWRfY29uZl9yIChyZXBldGl0aXZlKQotCi1ERVNDUklQVElPTgotICAgUmVhZHMgdGhlIHNwZWNpZmllZCBjb25maWd1cmF0aW9uIGZpbGUgYW5kIHNldHMgZGVmaW5lZCB2YWx1ZXMgYmFzZWQgb24KLSAgIHRoZSBwYXNzZWQgaW4gY29uZmlndXJhdGlvbiB0YWJsZS4gVGhpcyB0YWJsZSBtYXBzIHN0cmluZ3MgdG8gdmFsdWVzIHRvCi0gICBzZXQgYWxvbmcgd2l0aCB0aGUgdHlwZSBvZiBlYWNoIG9mIHRoZXNlIHZhbHVlcy4KLSAgIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhpcyBhbmQgbG9jX3JlYWRfY29uZiBpcyB0aGF0IHRoaXMgZnVuY3Rpb24gcmV0dXJucwotICAgdGhlIGZpbGUgcG9pbnRlciBwb3NpdGlvbiBhdCB0aGUgZW5kIG9mIGZpbGxpbmcgYSBjb25maWcgdGFibGUuIEFsc28sIGl0Ci0gICByZWFkcyBhIGZpeGVkIG51bWJlciBvZiBwYXJhbWV0ZXJzIGF0IGEgdGltZSB3aGljaCBpcyBlcXVhbCB0byB0aGUgbGVuZ3RoCi0gICBvZiB0aGUgY29uZmlndXJhdGlvbiB0YWJsZS4gVGhpcyBmdW5jdGlvbmFsaXR5IGVuYWJsZXMgdGhlIGNhbGxlciB0bwotICAgcmVwZWF0ZWRseSBjYWxsIHRoZSBmdW5jdGlvbiB0byByZWFkIGRhdGEgZnJvbSB0aGUgc2FtZSBmaWxlLgotCi1QQVJBTUVURVJTOgotICAgY29uZl9mcCA6IGZpbGUgcG9pbnRlcgotICAgY29uZmlnX3RhYmxlOiB0YWJsZSBkZWZpbml0aW9uIG9mIHN0cmluZ3MgdG8gcGxhY2VzIHRvIHN0b3JlIGluZm9ybWF0aW9uCi0gICB0YWJsZV9sZW5ndGg6IGxlbmd0aCBvZiB0aGUgY29uZmlndXJhdGlvbiB0YWJsZQotCi1ERVBFTkRFTkNJRVMKLSAgIE4vQQotCi1SRVRVUk4gVkFMVUUKLSAgIDA6IFRhYmxlIGZpbGxlZCBzdWNjZXNzZnVsbHkKLSAgIDE6IE5vIG1vcmUgcGFyYW1ldGVycyB0byByZWFkCi0gIC0xOiBFcnJvciBmaWxsaW5nIHRhYmxlCi0KLVNJREUgRUZGRUNUUwotICAgTi9BCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotaW50IGxvY19yZWFkX2NvbmZfcihGSUxFICpjb25mX2ZwLCBsb2NfcGFyYW1fc190eXBlKiBjb25maWdfdGFibGUsIHVpbnQzMl90IHRhYmxlX2xlbmd0aCkKLXsKLSAgICBpbnQgcmV0PTA7Ci0KLSAgICB1bnNpZ25lZCBpbnQgbnVtX3BhcmFtcz10YWJsZV9sZW5ndGg7Ci0gICAgaWYoY29uZl9mcCA9PSBOVUxMKSB7Ci0gICAgICAgIExPQ19MT0dFKCIlczolZF06IEVSUk9SOiBGaWxlIHBvaW50ZXIgaXMgTlVMTFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLSAgICAgICAgcmV0ID0gLTE7Ci0gICAgICAgIGdvdG8gZXJyOwotICAgIH0KLQotICAgIC8qIENsZWFyIGFsbCB2YWxpZGl0eSBiaXRzICovCi0gICAgZm9yKHVpbnQzMl90IGkgPSAwOyBOVUxMICE9IGNvbmZpZ190YWJsZSAmJiBpIDwgdGFibGVfbGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgICBpZihOVUxMICE9IGNvbmZpZ190YWJsZVtpXS5wYXJhbV9zZXQpCi0gICAgICAgIHsKLSAgICAgICAgICAgICooY29uZmlnX3RhYmxlW2ldLnBhcmFtX3NldCkgPSAwOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgY2hhciBpbnB1dF9idWZbTE9DX01BWF9QQVJBTV9MSU5FXTsgIC8qIGRlY2xhcmUgYSBjaGFyIGFycmF5ICovCi0KLSAgICBMT0NfTE9HRCgiJXM6JWRdOiBudW1fcGFyYW1zOiAlZFxuIiwgX19mdW5jX18sIF9fTElORV9fLCBudW1fcGFyYW1zKTsKLSAgICB3aGlsZShudW1fcGFyYW1zKQotICAgIHsKLSAgICAgICAgaWYoIWZnZXRzKGlucHV0X2J1ZiwgTE9DX01BWF9QQVJBTV9MSU5FLCBjb25mX2ZwKSkgewotICAgICAgICAgICAgTE9DX0xPR0QoIiVzOiVkXTogZmdldHMgcmV0dXJuZWQgTlVMTFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgbnVtX3BhcmFtcyAtPSBsb2NfZmlsbF9jb25mX2l0ZW0oaW5wdXRfYnVmLCBjb25maWdfdGFibGUsIHRhYmxlX2xlbmd0aCk7Ci0gICAgfQotCi1lcnI6Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLUZVTkNUSU9OIGxvY191ZHBhdGVfY29uZgotCi1ERVNDUklQVElPTgotICAgUGFyc2VzIHRoZSBwYXNzZWQgaW4gYnVmZmVyIGZvciBjb25maWd1cmF0aW9uIGl0ZW1zLCBhbmQgdXBkYXRlIHRoZSB0YWJsZQotICAgdGhhdCBpcyBhbHNvIHBhc3NlZCBpbi4KLQotUmVhZHMgdGhlIHNwZWNpZmllZCBjb25maWd1cmF0aW9uIGZpbGUgYW5kIHNldHMgZGVmaW5lZCB2YWx1ZXMgYmFzZWQgb24KLSAgIHRoZSBwYXNzZWQgaW4gY29uZmlndXJhdGlvbiB0YWJsZS4gVGhpcyB0YWJsZSBtYXBzIHN0cmluZ3MgdG8gdmFsdWVzIHRvCi0gICBzZXQgYWxvbmcgd2l0aCB0aGUgdHlwZSBvZiBlYWNoIG9mIHRoZXNlIHZhbHVlcy4KLQotUEFSQU1FVEVSUzoKLSAgIGNvbmZfZGF0YTogY29uZmlndXJhdGlvbiBpdGVtcyBpbiBidWZmZXJhcyBhIHN0cmluZwotICAgbGVuZ3RoOiBzdHJsZW4oY29uZl9kYXRhKQotICAgY29uZmlnX3RhYmxlOiB0YWJsZSBkZWZpbml0aW9uIG9mIHN0cmluZ3MgdG8gcGxhY2VzIHRvIHN0b3JlIGluZm9ybWF0aW9uCi0gICB0YWJsZV9sZW5ndGg6IGxlbmd0aCBvZiB0aGUgY29uZmlndXJhdGlvbiB0YWJsZQotCi1ERVBFTkRFTkNJRVMKLSAgIE4vQQotCi1SRVRVUk4gVkFMVUUKLSAgIG51bWJlciBvZiB0aGUgcmVjb3JkcyBpbiB0aGUgdGFibGUgdGhhdCBpcyB1cGRhdGVkIGF0IHRpbWUgb2YgcmV0dXJuLgotCi1TSURFIEVGRkVDVFMKLSAgIE4vQQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLWludCBsb2NfdXBkYXRlX2NvbmYoY29uc3QgY2hhciogY29uZl9kYXRhLCBpbnQzMl90IGxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgbG9jX3BhcmFtX3NfdHlwZSogY29uZmlnX3RhYmxlLCB1aW50MzJfdCB0YWJsZV9sZW5ndGgpCi17Ci0gICAgaW50IHJldCA9IC0xOwotCi0gICAgaWYgKGNvbmZfZGF0YSAmJiBsZW5ndGggJiYgY29uZmlnX3RhYmxlICYmIHRhYmxlX2xlbmd0aCkgewotICAgICAgICAvLyBtYWtlIGEgY29weSwgc28gd2UgZG8gbm90IHRva2VuaXplIHRoZSBvcmlnaW5hbCBkYXRhCi0gICAgICAgIGNoYXIqIGNvbmZfY29weSA9IChjaGFyKiltYWxsb2MobGVuZ3RoKzEpOwotCi0gICAgICAgIGlmIChjb25mX2NvcHkgIT0gTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgbWVtY3B5KGNvbmZfY29weSwgY29uZl9kYXRhLCBsZW5ndGgpOwotICAgICAgICAgICAgLy8gd2UgaGFyZCBOVUxMIHRoZSBlbmQgb2Ygc3RyaW5nIHRvIGJlIHNhZmUKLSAgICAgICAgICAgIGNvbmZfY29weVtsZW5ndGhdID0gMDsKLQotICAgICAgICAgICAgLy8gc3RhcnQgd2l0aCBvbmUgcmVjb3JkIG9mZgotICAgICAgICAgICAgdWludDMyX3QgbnVtX3BhcmFtcyA9IHRhYmxlX2xlbmd0aCAtIDE7Ci0gICAgICAgICAgICBjaGFyKiBzYXZlcHRyID0gTlVMTDsKLSAgICAgICAgICAgIGNoYXIqIGlucHV0X2J1ZiA9IHN0cnRva19yKGNvbmZfY29weSwgIlxuIiwgJnNhdmVwdHIpOwotICAgICAgICAgICAgcmV0ID0gMDsKLQotICAgICAgICAgICAgTE9DX0xPR0QoIiVzOiVkXTogbnVtX3BhcmFtczogJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgbnVtX3BhcmFtcyk7Ci0gICAgICAgICAgICB3aGlsZShudW1fcGFyYW1zICYmIGlucHV0X2J1ZikgewotICAgICAgICAgICAgICAgIHJldCsrOwotICAgICAgICAgICAgICAgIG51bV9wYXJhbXMgLT0gbG9jX2ZpbGxfY29uZl9pdGVtKGlucHV0X2J1ZiwgY29uZmlnX3RhYmxlLCB0YWJsZV9sZW5ndGgpOwotICAgICAgICAgICAgICAgIGlucHV0X2J1ZiA9IHN0cnRva19yKE5VTEwsICJcbiIsICZzYXZlcHRyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZyZWUoY29uZl9jb3B5KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiByZXQ7Ci19Ci0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1GVU5DVElPTiBsb2NfcmVhZF9jb25mCi0KLURFU0NSSVBUSU9OCi0gICBSZWFkcyB0aGUgc3BlY2lmaWVkIGNvbmZpZ3VyYXRpb24gZmlsZSBhbmQgc2V0cyBkZWZpbmVkIHZhbHVlcyBiYXNlZCBvbgotICAgdGhlIHBhc3NlZCBpbiBjb25maWd1cmF0aW9uIHRhYmxlLiBUaGlzIHRhYmxlIG1hcHMgc3RyaW5ncyB0byB2YWx1ZXMgdG8KLSAgIHNldCBhbG9uZyB3aXRoIHRoZSB0eXBlIG9mIGVhY2ggb2YgdGhlc2UgdmFsdWVzLgotCi1QQVJBTUVURVJTOgotICAgY29uZl9maWxlX25hbWU6IGNvbmZpZ3VyYXRpb24gZmlsZSB0byByZWFkCi0gICBjb25maWdfdGFibGU6IHRhYmxlIGRlZmluaXRpb24gb2Ygc3RyaW5ncyB0byBwbGFjZXMgdG8gc3RvcmUgaW5mb3JtYXRpb24KLSAgIHRhYmxlX2xlbmd0aDogbGVuZ3RoIG9mIHRoZSBjb25maWd1cmF0aW9uIHRhYmxlCi0KLURFUEVOREVOQ0lFUwotICAgTi9BCi0KLVJFVFVSTiBWQUxVRQotICAgTm9uZQotCi1TSURFIEVGRkVDVFMKLSAgIE4vQQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLXZvaWQgbG9jX3JlYWRfY29uZihjb25zdCBjaGFyKiBjb25mX2ZpbGVfbmFtZSwgbG9jX3BhcmFtX3NfdHlwZSogY29uZmlnX3RhYmxlLAotICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHRhYmxlX2xlbmd0aCkKLXsKLSAgICBGSUxFICpjb25mX2ZwID0gTlVMTDsKLSAgICBjaGFyIGlucHV0X2J1ZltMT0NfTUFYX1BBUkFNX0xJTkVdOyAgLyogZGVjbGFyZSBhIGNoYXIgYXJyYXkgKi8KLSAgICBjaGFyICpsYXN0czsKLSAgICBsb2NfcGFyYW1fdl90eXBlIGNvbmZpZ192YWx1ZTsKLSAgICB1aW50MzJfdCBpOwotCi0gICAgaWYoKGNvbmZfZnAgPSBmb3Blbihjb25mX2ZpbGVfbmFtZSwgInIiKSkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIExPQ19MT0dEKCIlczogdXNpbmcgJXMiLCBfX0ZVTkNUSU9OX18sIGNvbmZfZmlsZV9uYW1lKTsKLSAgICAgICAgaWYodGFibGVfbGVuZ3RoICYmIGNvbmZpZ190YWJsZSkgewotICAgICAgICAgICAgbG9jX3JlYWRfY29uZl9yKGNvbmZfZnAsIGNvbmZpZ190YWJsZSwgdGFibGVfbGVuZ3RoKTsKLSAgICAgICAgICAgIHJld2luZChjb25mX2ZwKTsKLSAgICAgICAgfQotICAgICAgICBsb2NfcmVhZF9jb25mX3IoY29uZl9mcCwgbG9jX3BhcmFtX3RhYmxlLCBsb2NfcGFyYW1fbnVtKTsKLSAgICAgICAgZmNsb3NlKGNvbmZfZnApOwotICAgIH0KLSAgICAvKiBJbml0aWFsaXplIGxvZ2dpbmcgbWVjaGFuaXNtIHdpdGggcGFyc2VkIGRhdGEgKi8KLSAgICBsb2NfbG9nZ2VyX2luaXQoREVCVUdfTEVWRUwsIFRJTUVTVEFNUCk7Ci19CmRpZmYgLS1naXQgYS9tc204OTc0L3V0aWxzL2xvY19jZmcuaCBiL21zbTg5NzQvdXRpbHMvbG9jX2NmZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDI1ZTg2Li4wMDAwMDAwCi0tLSBhL21zbTg5NzQvdXRpbHMvbG9jX2NmZy5oCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDExLTIwMTQsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCi0gKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKLSAqICAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24sIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCi0gKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKLSAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCi0gKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCi0gKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2lmbmRlZiBMT0NfQ0ZHX0gKLSNkZWZpbmUgTE9DX0NGR19ICi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0jZGVmaW5lIExPQ19NQVhfUEFSQU1fTkFNRSAgICAgICAgICAgICAgICAgNDgKLSNkZWZpbmUgTE9DX01BWF9QQVJBTV9TVFJJTkcgICAgICAgICAgICAgICA4MAotI2RlZmluZSBMT0NfTUFYX1BBUkFNX0xJTkUgICAgICAgICAgICAgICAgIDgwCi0KLSNkZWZpbmUgVVRJTF9VUERBVEVfQ09ORihjb25mX2RhdGEsIGxlbiwgY29uZmlnX3RhYmxlKSBcCi0gICAgbG9jX3VwZGF0ZV9jb25mKChjb25mX2RhdGEpLCAobGVuKSwgKGNvbmZpZ190YWJsZSksIFwKLSAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGNvbmZpZ190YWJsZSkgLyBzaXplb2YoY29uZmlnX3RhYmxlWzBdKSkKLQotI2RlZmluZSBVVElMX1JFQURfQ09ORl9ERUZBVUxUKGZpbGVuYW1lKSBcCi0gICAgbG9jX3JlYWRfY29uZigoZmlsZW5hbWUpLCBOVUxMLCAwKTsKLQotI2RlZmluZSBVVElMX1JFQURfQ09ORihmaWxlbmFtZSwgY29uZmlnX3RhYmxlKSBcCi0gICAgbG9jX3JlYWRfY29uZigoZmlsZW5hbWUpLCAoY29uZmlnX3RhYmxlKSwgc2l6ZW9mKGNvbmZpZ190YWJsZSkgLyBzaXplb2YoY29uZmlnX3RhYmxlWzBdKSkKLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgTU9EVUxFIFRZUEUgREVDTEFSQVRJT04KLSAqCi0gKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtX25hbWVbTE9DX01BWF9QQVJBTV9OQU1FXTsKLSAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgKnBhcmFtX3B0cjsKLSAgdWludDhfdCAgICAgICAgICAgICAgICAgICAgICAgKnBhcmFtX3NldDsgICAvKiB3YXMgdGhpcyB2YWx1ZSBzZXQgYnkgY29uZmlnIGZpbGU/ICovCi0gIGNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbV90eXBlOyAgLyogJ24nIGZvciBudW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3MnIGZvciBzdHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2YnIGZvciBmbG9hdCAqLwotfSBsb2NfcGFyYW1fc190eXBlOwotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogICAgICAgICAgICAgICAgICAgICAgICAgIE1PRFVMRSBFWFRFUk5BTCBEQVRBCi0gKgotICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogICAgICAgICAgICAgICAgICAgICAgIE1PRFVMRSBFWFBPUlRFRCBGVU5DVElPTlMKLSAqCi0gKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotdm9pZCBsb2NfcmVhZF9jb25mKGNvbnN0IGNoYXIqIGNvbmZfZmlsZV9uYW1lLAotICAgICAgICAgICAgICAgICAgIGxvY19wYXJhbV9zX3R5cGUqIGNvbmZpZ190YWJsZSwKLSAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB0YWJsZV9sZW5ndGgpOwotaW50IGxvY19yZWFkX2NvbmZfcihGSUxFICpjb25mX2ZwLCBsb2NfcGFyYW1fc190eXBlKiBjb25maWdfdGFibGUsCi0gICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHRhYmxlX2xlbmd0aCk7Ci1pbnQgbG9jX3VwZGF0ZV9jb25mKGNvbnN0IGNoYXIqIGNvbmZfZGF0YSwgaW50MzJfdCBsZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgIGxvY19wYXJhbV9zX3R5cGUqIGNvbmZpZ190YWJsZSwgdWludDMyX3QgdGFibGVfbGVuZ3RoKTsKLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZiAvKiBMT0NfQ0ZHX0ggKi8KZGlmZiAtLWdpdCBhL21zbTg5NzQvdXRpbHMvbG9jX2xvZy5jcHAgYi9tc204OTc0L3V0aWxzL2xvY19sb2cuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTI5NjZlLi4wMDAwMDAwCi0tLSBhL21zbTg5NzQvdXRpbHMvbG9jX2xvZy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyNDAgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDExLTIwMTIsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCi0gKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKLSAqICAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24sIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCi0gKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKLSAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCi0gKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCi0gKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2RlZmluZSBMT0dfTkRERUJVRyAwCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jaW5jbHVkZSAibG9jX2xvZy5oIgotI2luY2x1ZGUgIm1zZ19xLmgiCi0jaWZkZWYgVVNFX0dMSUIKLSNpbmNsdWRlIDx0aW1lLmg+Ci0jZW5kaWYgLyogVVNFX0dMSUIgICovCi0jaW5jbHVkZSAibG9nX3V0aWwuaCIKLSNpbmNsdWRlICJwbGF0Zm9ybV9saWJfaW5jbHVkZXMuaCIKLQotI2RlZmluZSAgQlVGRkVSX1NJWkUgIDEyMAotCi0vLyBMb2dnaW5nIEltcHJvdmVtZW50cwotY29uc3QgY2hhciAqbG9jX2xvZ2dlcl9ib29sU3RyW109eyJGYWxzZSIsIlRydWUifTsKLWNvbnN0IGNoYXIgVk9JRF9SRVRbXSAgID0gIk5vbmUiOwotY29uc3QgY2hhciBGUk9NX0FGV1tdICAgPSAiPT09PiI7Ci1jb25zdCBjaGFyIFRPX01PREVNW10gICA9ICItLS0+IjsKLWNvbnN0IGNoYXIgRlJPTV9NT0RFTVtdID0gIjwtLS0iOwotY29uc3QgY2hhciBUT19BRldbXSAgICAgPSAiPD09PSI7Ci1jb25zdCBjaGFyIEVYSVRfVEFHW10gICA9ICJFeGl0aW5nIjsKLWNvbnN0IGNoYXIgRU5UUllfVEFHW10gID0gIkVudGVyaW5nIjsKLQotLyogTG9nZ2luZyBNZWNoYW5pc20gKi8KLWxvY19sb2dnZXJfc190eXBlIGxvY19sb2dnZXI7Ci0KLS8qIEdldCBuYW1lcyBmcm9tIHZhbHVlICovCi1jb25zdCBjaGFyKiBsb2NfZ2V0X25hbWVfZnJvbV9tYXNrKGxvY19uYW1lX3ZhbF9zX3R5cGUgdGFibGVbXSwgaW50IHRhYmxlX3NpemUsIGxvbmcgbWFzaykKLXsKLSAgIGludCBpOwotICAgZm9yIChpID0gMDsgaSA8IHRhYmxlX3NpemU7IGkrKykKLSAgIHsKLSAgICAgIGlmICh0YWJsZVtpXS52YWwgJiAobG9uZykgbWFzaykKLSAgICAgIHsKLSAgICAgICAgIHJldHVybiB0YWJsZVtpXS5uYW1lOwotICAgICAgfQotICAgfQotICAgcmV0dXJuIFVOS05PV05fU1RSOwotfQotCi0vKiBHZXQgbmFtZXMgZnJvbSB2YWx1ZSAqLwotY29uc3QgY2hhciogbG9jX2dldF9uYW1lX2Zyb21fdmFsKGxvY19uYW1lX3ZhbF9zX3R5cGUgdGFibGVbXSwgaW50IHRhYmxlX3NpemUsIGxvbmcgdmFsdWUpCi17Ci0gICBpbnQgaTsKLSAgIGZvciAoaSA9IDA7IGkgPCB0YWJsZV9zaXplOyBpKyspCi0gICB7Ci0gICAgICBpZiAodGFibGVbaV0udmFsID09IChsb25nKSB2YWx1ZSkKLSAgICAgIHsKLSAgICAgICAgIHJldHVybiB0YWJsZVtpXS5uYW1lOwotICAgICAgfQotICAgfQotICAgcmV0dXJuIFVOS05PV05fU1RSOwotfQotCi1zdGF0aWMgbG9jX25hbWVfdmFsX3NfdHlwZSBsb2NfbXNnX3Ffc3RhdHVzW10gPQotewotICAgIE5BTUVfVkFMKCBlTVNHX1FfU1VDQ0VTUyApLAotICAgIE5BTUVfVkFMKCBlTVNHX1FfRkFJTFVSRV9HRU5FUkFMICksCi0gICAgTkFNRV9WQUwoIGVNU0dfUV9JTlZBTElEX1BBUkFNRVRFUiApLAotICAgIE5BTUVfVkFMKCBlTVNHX1FfSU5WQUxJRF9IQU5ETEUgKSwKLSAgICBOQU1FX1ZBTCggZU1TR19RX1VOQVZBSUxBQkxFX1JFU09VUkNFICksCi0gICAgTkFNRV9WQUwoIGVNU0dfUV9JTlNVRkZJQ0lFTlRfQlVGRkVSICkKLX07Ci1zdGF0aWMgaW50IGxvY19tc2dfcV9zdGF0dXNfbnVtID0gc2l6ZW9mKGxvY19tc2dfcV9zdGF0dXMpIC8gc2l6ZW9mKGxvY19uYW1lX3ZhbF9zX3R5cGUpOwotCi0vKiBGaW5kIG1zZ19xIHN0YXR1cyBuYW1lICovCi1jb25zdCBjaGFyKiBsb2NfZ2V0X21zZ19xX3N0YXR1cyhpbnQgc3RhdHVzKQotewotICAgcmV0dXJuIGxvY19nZXRfbmFtZV9mcm9tX3ZhbChsb2NfbXNnX3Ffc3RhdHVzLCBsb2NfbXNnX3Ffc3RhdHVzX251bSwgKGxvbmcpIHN0YXR1cyk7Ci19Ci0KLWNvbnN0IGNoYXIqIGxvZ19zdWNjX2ZhaWxfc3RyaW5nKGludCBpc19zdWNjKQotewotICAgcmV0dXJuIGlzX3N1Y2M/ICJzdWNjZXNzZnVsIiA6ICJmYWlsZWQiOwotfQotCi0vL1RhcmdldCBuYW1lcwotbG9jX25hbWVfdmFsX3NfdHlwZSB0YXJnZXRfbmFtZVtdID0KLXsKLSAgICBOQU1FX1ZBTChHTlNTX05PTkUpLAotICAgIE5BTUVfVkFMKEdOU1NfTVNNKSwKLSAgICBOQU1FX1ZBTChHTlNTX0dTUyksCi0gICAgTkFNRV9WQUwoR05TU19NRE0pLAotICAgIE5BTUVfVkFMKEdOU1NfUUNBMTUzMCksCi0gICAgTkFNRV9WQUwoR05TU19VTktOT1dOKQotfTsKLQotc3RhdGljIGludCB0YXJnZXRfbmFtZV9udW0gPSBzaXplb2YodGFyZ2V0X25hbWUpL3NpemVvZihsb2NfbmFtZV92YWxfc190eXBlKTsKLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotRlVOQ1RJT04gbG9jX2dldF90YXJnZXRfbmFtZQotCi1ERVNDUklQVElPTgotICAgUmV0dXJucyBwb2ludGVyIHRvIGEgc3RyaW5nIHRoYXQgY29udGFpbnMgbmFtZSBvZiB0aGUgdGFyZ2V0Ci0KLSAgIFhYOlhYOlhYLjAwMFwwCi0KLVJFVFVSTiBWQUxVRQotICAgVGhlIHRhcmdldCBuYW1lIHN0cmluZwotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotY29uc3QgY2hhciAqbG9jX2dldF90YXJnZXRfbmFtZSh1bnNpZ25lZCBpbnQgdGFyZ2V0KQotewotICAgIGludCBpbmRleCA9IDA7Ci0gICAgc3RhdGljIGNoYXIgcmV0W0JVRkZFUl9TSVpFXTsKLQotICAgIGluZGV4ID0gIGdldFRhcmdldEduc3NUeXBlKHRhcmdldCk7Ci0gICAgaWYoIGluZGV4ID49IHRhcmdldF9uYW1lX251bSB8fCBpbmRleCA8IDApCi0gICAgICAgIGluZGV4ID0gdGFyZ2V0X25hbWVfbnVtIC0gMTsKLQotICAgIGlmKCAodGFyZ2V0ICYgSEFTX1NTQykgPT0gSEFTX1NTQyApIHsKLSAgICAgICAgc25wcmludGYocmV0LCBzaXplb2YocmV0KSwgIiAlcyB3aXRoIFNTQyIsCi0gICAgICAgICAgIGxvY19nZXRfbmFtZV9mcm9tX3ZhbCh0YXJnZXRfbmFtZSwgdGFyZ2V0X25hbWVfbnVtLCAobG9uZylpbmRleCkgKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgc25wcmludGYocmV0LCBzaXplb2YocmV0KSwgIiAlcyAgd2l0aG91dCBTU0MiLAotICAgICAgICAgICBsb2NfZ2V0X25hbWVfZnJvbV92YWwodGFyZ2V0X25hbWUsIHRhcmdldF9uYW1lX251bSwgKGxvbmcpaW5kZXgpICk7Ci0gICAgfQotICAgIHJldHVybiByZXQ7Ci19Ci0KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotRlVOQ1RJT04gbG9jX2dldF90aW1lCi0KLURFU0NSSVBUSU9OCi0gICBMb2dzIGEgY2FsbGJhY2sgZXZlbnQgaGVhZGVyLgotICAgVGhlIHBvaW50ZXIgdGltZV9zdHJpbmcgc2hvdWxkIHBvaW50IHRvIGEgYnVmZmVyIG9mIGF0IGxlYXN0IDEzIGJ5dGVzOgotCi0gICBYWDpYWDpYWC4wMDBcMAotCi1SRVRVUk4gVkFMVUUKLSAgIFRoZSB0aW1lIHN0cmluZwotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotY2hhciAqbG9jX2dldF90aW1lKGNoYXIgKnRpbWVfc3RyaW5nLCB1bnNpZ25lZCBsb25nIGJ1Zl9zaXplKQotewotICAgc3RydWN0IHRpbWV2YWwgbm93OyAgICAgLyogc2VjIGFuZCB1c2VjICAgICAqLwotICAgc3RydWN0IHRtIG5vd190bTsgICAgICAgLyogYnJva2VuLWRvd24gdGltZSAqLwotICAgY2hhciBobXNfc3RyaW5nWzgwXTsgICAgLyogSEg6TU06U1MgICAgICAgICAqLwotCi0gICBnZXR0aW1lb2ZkYXkoJm5vdywgTlVMTCk7Ci0gICBsb2NhbHRpbWVfcigmbm93LnR2X3NlYywgJm5vd190bSk7Ci0KLSAgIHN0cmZ0aW1lKGhtc19zdHJpbmcsIHNpemVvZiBobXNfc3RyaW5nLCAiJUg6JU06JVMiLCAmbm93X3RtKTsKLSAgIHNucHJpbnRmKHRpbWVfc3RyaW5nLCBidWZfc2l6ZSwgIiVzLiUwM2QiLCBobXNfc3RyaW5nLCAoaW50KSAobm93LnR2X3VzZWMgLyAxMDAwKSk7Ci0KLSAgIHJldHVybiB0aW1lX3N0cmluZzsKLX0KLQotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotRlVOQ1RJT04gbG9jX2xvZ2dlcl9pbml0Ci0KLURFU0NSSVBUSU9OCi0gICBJbml0aWFsaXplcyB0aGUgc3RhdGUgb2YgREVCVUdfTEVWRUwgYW5kIFRJTUVTVEFNUAotCi1ERVBFTkRFTkNJRVMKLSAgIE4vQQotCi1SRVRVUk4gVkFMVUUKLSAgIE5vbmUKLQotU0lERSBFRkZFQ1RTCi0gICBOL0EKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi12b2lkIGxvY19sb2dnZXJfaW5pdCh1bnNpZ25lZCBsb25nIGRlYnVnLCB1bnNpZ25lZCBsb25nIHRpbWVzdGFtcCkKLXsKLSAgIGxvY19sb2dnZXIuREVCVUdfTEVWRUwgPSBkZWJ1ZzsKLSNpZmRlZiBUQVJHRVRfQlVJTERfVkFSSUFOVF9VU0VSCi0gICAvLyBmb3JjZSB1c2VyIGJ1aWxkcyB0byAyIG9yIGxlc3MKLSAgIGlmIChsb2NfbG9nZ2VyLkRFQlVHX0xFVkVMID4gMikgewotICAgICAgIGxvY19sb2dnZXIuREVCVUdfTEVWRUwgPSAyOwotICAgfQotI2VuZGlmCi0gICBsb2NfbG9nZ2VyLlRJTUVTVEFNUCAgID0gdGltZXN0YW1wOwotfQotCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1GVU5DVElPTiBnZXRfdGltZXN0YW1wCi0KLURFU0NSSVBUSU9OCi0gICBHZW5lcmF0ZXMgYSB0aW1lc3RhbXAgdXNpbmcgdGhlIGN1cnJlbnQgc3lzdGVtIHRpbWUKLQotREVQRU5ERU5DSUVTCi0gICBOL0EKLQotUkVUVVJOIFZBTFVFCi0gICBDaGFyIHBvaW50ZXIgdG8gdGhlIHBhcmFtZXRlciBzdHIKLQotU0lERSBFRkZFQ1RTCi0gICBOL0EKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi1jaGFyICogZ2V0X3RpbWVzdGFtcChjaGFyICpzdHIsIHVuc2lnbmVkIGxvbmcgYnVmX3NpemUpCi17Ci0gIHN0cnVjdCB0aW1ldmFsIHR2OwotICBzdHJ1Y3QgdGltZXpvbmUgdHo7Ci0gIGludCBoaCwgbW0sIHNzOwotICBnZXR0aW1lb2ZkYXkoJnR2LCAmdHopOwotICBoaCA9IHR2LnR2X3NlYy8zNjAwJTI0OwotICBtbSA9ICh0di50dl9zZWMlMzYwMCkvNjA7Ci0gIHNzID0gdHYudHZfc2VjJTYwOwotICBzbnByaW50ZihzdHIsIGJ1Zl9zaXplLCAiJTAyZDolMDJkOiUwMmQuJTA2bGQiLCBoaCwgbW0sIHNzLCB0di50dl91c2VjKTsKLSAgcmV0dXJuIHN0cjsKLX0KLQpkaWZmIC0tZ2l0IGEvbXNtODk3NC91dGlscy9sb2NfbG9nLmggYi9tc204OTc0L3V0aWxzL2xvY19sb2cuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJkYzYzNi4uMDAwMDAwMAotLS0gYS9tc204OTc0L3V0aWxzL2xvY19sb2cuaAorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMS0yMDEyLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZwotICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCi0gKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uLCBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAotICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgotICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCi0gKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQotICogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgotICogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpZm5kZWYgTE9DX0xPR19ICi0jZGVmaW5lIExPQ19MT0dfSAotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLXsKLSNlbmRpZgotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlICJsb2NfdGFyZ2V0LmgiCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICBjaGFyICAgICAgICAgICAgICAgICBuYW1lWzEyOF07Ci0gICBsb25nICAgICAgICAgICAgICAgICB2YWw7Ci19IGxvY19uYW1lX3ZhbF9zX3R5cGU7Ci0KLSNkZWZpbmUgTkFNRV9WQUwoeCkgeyIiICN4ICIiLCB4IH0KLQotI2RlZmluZSBVTktOT1dOX1NUUiAiVU5LTk9XTiIKLQotI2RlZmluZSBDSEVDS19NQVNLKHR5cGUsIHZhbHVlLCBtYXNrX3ZhciwgbWFzaykgXAotICAgKChtYXNrX3ZhciAmIG1hc2spID8gKHR5cGUpIHZhbHVlIDogKHR5cGUpICgtMSkpCi0KLS8qIEdldCBuYW1lcyBmcm9tIHZhbHVlICovCi1jb25zdCBjaGFyKiBsb2NfZ2V0X25hbWVfZnJvbV9tYXNrKGxvY19uYW1lX3ZhbF9zX3R5cGUgdGFibGVbXSwgaW50IHRhYmxlX3NpemUsIGxvbmcgbWFzayk7Ci1jb25zdCBjaGFyKiBsb2NfZ2V0X25hbWVfZnJvbV92YWwobG9jX25hbWVfdmFsX3NfdHlwZSB0YWJsZVtdLCBpbnQgdGFibGVfc2l6ZSwgbG9uZyB2YWx1ZSk7Ci1jb25zdCBjaGFyKiBsb2NfZ2V0X21zZ19xX3N0YXR1cyhpbnQgc3RhdHVzKTsKLWNvbnN0IGNoYXIqIGxvY19nZXRfdGFyZ2V0X25hbWUodW5zaWduZWQgaW50IHRhcmdldCk7Ci0KLWV4dGVybiBjb25zdCBjaGFyKiBsb2dfc3VjY19mYWlsX3N0cmluZyhpbnQgaXNfc3VjYyk7Ci0KLWV4dGVybiBjaGFyICpsb2NfZ2V0X3RpbWUoY2hhciAqdGltZV9zdHJpbmcsIHVuc2lnbmVkIGxvbmcgYnVmX3NpemUpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYgLyogTE9DX0xPR19IICovCmRpZmYgLS1naXQgYS9tc204OTc0L3V0aWxzL2xvY19taXNjX3V0aWxzLmNwcCBiL21zbTg5NzQvdXRpbHMvbG9jX21pc2NfdXRpbHMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTk2MzEzLi4wMDAwMDAwCi0tLSBhL21zbTg5NzQvdXRpbHMvbG9jX21pc2NfdXRpbHMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxNCwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKLSAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAotICogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiwgbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKLSAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAotICogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKLSAqIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KLSAqIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8bG9nX3V0aWwuaD4KLSNpbmNsdWRlIDxsb2NfbWlzY191dGlscy5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLSNkZWZpbmUgTE9HX05EREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJMb2NTdmNfbWlzY191dGlscyIKLQotaW50IGxvY191dGlsX3NwbGl0X3N0cmluZyhjaGFyICpyYXdfc3RyaW5nLCBjaGFyICoqc3BsaXRfc3RyaW5nc19wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXhfbnVtX3N1YnN0cmluZ3MsIGNoYXIgZGVsaW1pdGVyKQotewotICAgIGludCByYXdfc3RyaW5nX2luZGV4PTA7Ci0gICAgaW50IG51bV9zcGxpdF9zdHJpbmdzPTA7Ci0gICAgdW5zaWduZWQgY2hhciBlbmRfc3RyaW5nPTA7Ci0gICAgaW50IHJhd19zdHJpbmdfbGVuZ3RoPTA7Ci0KLSAgICBpZighcmF3X3N0cmluZyB8fCAhc3BsaXRfc3RyaW5nc19wdHIpIHsKLSAgICAgICAgTE9DX0xPR0UoIiVzOiVkXTogTlVMTCBwYXJhbWV0ZXJzIiwgX19mdW5jX18sIF9fTElORV9fKTsKLSAgICAgICAgbnVtX3NwbGl0X3N0cmluZ3MgPSAtMTsKLSAgICAgICAgZ290byBlcnI7Ci0gICAgfQotICAgIExPQ19MT0dEKCIlczolZF06IHJhdyBzdHJpbmc6ICVzXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIHJhd19zdHJpbmcpOwotICAgIHJhd19zdHJpbmdfbGVuZ3RoID0gc3RybGVuKHJhd19zdHJpbmcpICsgMTsKLSAgICBzcGxpdF9zdHJpbmdzX3B0cltudW1fc3BsaXRfc3RyaW5nc10gPSAmcmF3X3N0cmluZ1tyYXdfc3RyaW5nX2luZGV4XTsKLSAgICBmb3IocmF3X3N0cmluZ19pbmRleD0wOyByYXdfc3RyaW5nX2luZGV4IDwgcmF3X3N0cmluZ19sZW5ndGg7IHJhd19zdHJpbmdfaW5kZXgrKykgewotICAgICAgICBpZihyYXdfc3RyaW5nW3Jhd19zdHJpbmdfaW5kZXhdID09ICdcMCcpCi0gICAgICAgICAgICBlbmRfc3RyaW5nPTE7Ci0gICAgICAgIGlmKChyYXdfc3RyaW5nW3Jhd19zdHJpbmdfaW5kZXhdID09IGRlbGltaXRlcikgfHwgZW5kX3N0cmluZykgewotICAgICAgICAgICAgcmF3X3N0cmluZ1tyYXdfc3RyaW5nX2luZGV4XSA9ICdcMCc7Ci0gICAgICAgICAgICBMT0NfTE9HRCgiJXM6JWRdOiBzcGxpdCBzdHJpbmc6ICVzXG4iLAotICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIF9fTElORV9fLCBzcGxpdF9zdHJpbmdzX3B0cltudW1fc3BsaXRfc3RyaW5nc10pOwotICAgICAgICAgICAgbnVtX3NwbGl0X3N0cmluZ3MrKzsKLSAgICAgICAgICAgIGlmKCgocmF3X3N0cmluZ19pbmRleCArIDEpIDwgcmF3X3N0cmluZ19sZW5ndGgpICYmCi0gICAgICAgICAgICAgICAobnVtX3NwbGl0X3N0cmluZ3MgPCBtYXhfbnVtX3N1YnN0cmluZ3MpKSB7Ci0gICAgICAgICAgICAgICAgc3BsaXRfc3RyaW5nc19wdHJbbnVtX3NwbGl0X3N0cmluZ3NdID0gJnJhd19zdHJpbmdbcmF3X3N0cmluZ19pbmRleCsxXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmKGVuZF9zdHJpbmcpCi0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci1lcnI6Ci0gICAgTE9DX0xPR0QoIiVzOiVkXTogbnVtX3NwbGl0X3N0cmluZ3M6ICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIG51bV9zcGxpdF9zdHJpbmdzKTsKLSAgICByZXR1cm4gbnVtX3NwbGl0X3N0cmluZ3M7Ci19Ci0KLXZvaWQgbG9jX3V0aWxfdHJpbV9zcGFjZShjaGFyICpvcmdfc3RyaW5nKQotewotICAgIGNoYXIgKnNjYW5fcHRyLCAqd3JpdGVfcHRyOwotICAgIGNoYXIgKmZpcnN0X25vbnNwYWNlID0gTlVMTCwgKmxhc3Rfbm9uc3BhY2UgPSBOVUxMOwotCi0gICAgaWYob3JnX3N0cmluZyA9PSBOVUxMKSB7Ci0gICAgICAgIExPQ19MT0dFKCIlczolZF06IE5VTEwgcGFyYW1ldGVyIiwgX19mdW5jX18sIF9fTElORV9fKTsKLSAgICAgICAgZ290byBlcnI7Ci0gICAgfQotCi0gICAgc2Nhbl9wdHIgPSB3cml0ZV9wdHIgPSBvcmdfc3RyaW5nOwotCi0gICAgd2hpbGUgKCpzY2FuX3B0cikgewotICAgICAgICAvL0ZpbmQgdGhlIGZpcnN0IG5vbi1zcGFjZSBjaGFyYWN0ZXIKLSAgICAgICAgaWYgKCAhaXNzcGFjZSgqc2Nhbl9wdHIpICYmIGZpcnN0X25vbnNwYWNlID09IE5VTEwpIHsKLSAgICAgICAgICAgIGZpcnN0X25vbnNwYWNlID0gc2Nhbl9wdHI7Ci0gICAgICAgIH0KLSAgICAgICAgLy9PbmNlIHRoZSBmaXJzdCBub24tc3BhY2UgY2hhcmFjdGVyIGlzIGZvdW5kIGluIHRoZQotICAgICAgICAvL2Fib3ZlIGNoZWNrLCBrZWVwIHNoaWZ0aW5nIHRoZSBjaGFyYWN0ZXJzIHRvIHRoZSBsZWZ0Ci0gICAgICAgIC8vdG8gcmVwbGFjZSB0aGUgc3BhY2VzCi0gICAgICAgIGlmIChmaXJzdF9ub25zcGFjZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAqKHdyaXRlX3B0cisrKSA9ICpzY2FuX3B0cjsKLSAgICAgICAgICAgIC8vS2VlcCB0cmFjayBvZiB3aGljaCB3YXMgdGhlIGxhc3Qgbm9uLXNwYWNlIGNoYXJhY3RlcgotICAgICAgICAgICAgLy9lbmNvdW50ZXJlZAotICAgICAgICAgICAgLy9sYXN0X25vbnNwYWNlIHdpbGwgbm90IGJlIHVwZGF0ZWQgaW4gdGhlIGNhc2Ugd2hlcmUKLSAgICAgICAgICAgIC8vdGhlIHN0cmluZyBlbmRzIHdpdGggc3BhY2VzCi0gICAgICAgICAgICBpZiAoICFpc3NwYWNlKCpzY2FuX3B0cikpIHsKLSAgICAgICAgICAgICAgICBsYXN0X25vbnNwYWNlID0gd3JpdGVfcHRyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHNjYW5fcHRyKys7Ci0gICAgfQotICAgIC8vQWRkIE5VTEwgdGVybWluYXRvciBhZnRlciB0aGUgbGFzdCBub24tc3BhY2UgY2hhcmFjdGVyCi0gICAgaWYgKGxhc3Rfbm9uc3BhY2UpIHsgKmxhc3Rfbm9uc3BhY2UgPSAnXDAnOyB9Ci1lcnI6Ci0gICAgcmV0dXJuOwotfQpkaWZmIC0tZ2l0IGEvbXNtODk3NC91dGlscy9sb2NfbWlzY191dGlscy5oIGIvbXNtODk3NC91dGlscy9sb2NfbWlzY191dGlscy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDY2ZDg0Li4wMDAwMDAwCi0tLSBhL21zbTg5NzQvdXRpbHMvbG9jX21pc2NfdXRpbHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxNCwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKLSAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAotICogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiwgbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKLSAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAotICogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKLSAqIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KLSAqIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotI2lmbmRlZiBfTE9DX01JU0NfVVRJTFNfSF8KLSNkZWZpbmUgX0xPQ19NSVNDX1VUSUxTX0hfCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLUZVTkNUSU9OIGxvY19zcGxpdF9zdHJpbmcKLQotREVTQ1JJUFRJT046Ci0gICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHNwbGl0IGEgZGVsaW1pdGVyIHNlcGFyYXRlZCBzdHJpbmcgaW50bwotICAgIHN1Yi1zdHJpbmdzLiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGFsbG9jYXRlIG5ldyBtZW1vcnkgdG8gc3RvcmUgdGhlIHNwbGl0Ci0gICAgc3RyaW5ncy4gSW5zdGVhZCwgaXQgcGxhY2VzICdcMCcgaW4gcGxhY2VzIG9mIGRlbGltaXRlcnMgYW5kIGFzc2luZ3MgdGhlCi0gICAgc3RhcnRpbmcgYWRkcmVzcyBvZiB0aGUgc3Vic3RyaW5nIHdpdGhpbiB0aGUgcmF3IHN0cmluZyBhcyB0aGUgc3RyaW5nIGFkZHJlc3MKLSAgICBUaGUgaW5wdXQgcmF3X3N0cmluZyBubyBsb25nZXIgcmVtYWlucyB0byBiZSBhIGNvbGxlY3Rpb24gb2Ygc3ViLXN0cmluZ3MKLSAgICBhZnRlciB0aGlzIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkLgotICAgIFBsZWFzZSBtYWtlIGEgY29weSBvZiB0aGUgaW5wdXQgc3RyaW5nIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gaWYKLSAgICBuZWNlc3NhcnkKLQotUEFSQU1FVEVSUzoKLSAgICBjaGFyICpyYXdfc3RyaW5nOiBpcyB0aGUgb3JpZ2luYWwgc3RyaW5nIHdpdGggZGVsaW1pdGVyIHNlcGFyYXRlZCBzdWJzdHJpbmdzCi0gICAgY2hhciAqKnNwbGl0X3N0cmluZ3NfcHRyOiBpcyB0aGUgYXJyYXcgb2YgcG9pbnRlcnMgd2hpY2ggd2lsbCBob2xkIHRoZSBhZGRyZXNzZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIGluZGl2aWR1YWwgc3Vic3RyaW5ncwotICAgIGludCBtYXhfbnVtX3N1YnN0cmluZ3M6IGlzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBzdWJzdHJpbmdzIHRoYXQgYXJlIGV4cGVjdGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgdGhlIGNhbGxlci4gVGhlIGFycmF5IG9mIHBvaW50ZXJzIGluIHRoZSBhYm92ZSBwYXJhbWV0ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyB1c3VhbGx5IHRoaXMgbG9uZwotICAgIGNoYXIgZGVsaW1pdGVyOiBpcyB0aGUgZGVsaW1pdGVyIHRoYXQgc2VwYXJhdGVzIHRoZSBzdWJzdHJpbmdzLiBFeGFtcGxlczogJyAnLCAnOycKLQotREVQRU5ERU5DSUVTCi0gICAgTi9BCi0KLVJFVFVSTiBWQUxVRQotICAgIGludCBOdW1iZXIgb2Ygc3BsaXQgc3RyaW5ncwotCi1TSURFIEVGRkVDVFMKLSAgICBUaGUgaW5wdXQgcmF3X3N0cmluZyBubyBsb25nZXIgcmVtYWlucyBhIGRlbGltaXRlciBzZXBhcmF0ZWQgc2luZ2xlIHN0cmluZy4KLQotRVhBTVBMRQotICAgIGRlbGltaXRlciA9ICcgJyAvL3NwYWNlCi0gICAgcmF3X3N0cmluZyA9ICJoZWxsbyBuZXcgdXNlciIgLy9kZWxpbWl0ZXIgaXMgc3BhY2UgJyAnCi0gICAgYWRkcmVzc2VzICA9ICAwMTIzNDU2Nzg5YWJjZAotICAgIHNwbGl0X3N0cmluZ3NfcHRyWzBdID0gJnJhd19zdHJpbmdbMF07IC8vc3BsaXRfc3RyaW5nc19wdHJbMF0gY29udGFpbnMgImhlbGxvIgotICAgIHNwbGl0X3N0cmluZ3NfcHRyWzFdID0gJnJhd19zdHJpbmdbNl07IC8vc3BsaXRfc3RyaW5nc19wdHJbMV0gY29udGFpbnMgIm5ldyIKLSAgICBzcGxpdF9zdHJpbmdzX3B0clsyXSA9ICZyYXdfc3RyaW5nW2FdOyAvL3NwbGl0X3N0cmluZ3NfcHRyWzJdIGNvbnRhaW5zICJ1c2VyIgotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotaW50IGxvY191dGlsX3NwbGl0X3N0cmluZyhjaGFyICpyYXdfc3RyaW5nLCBjaGFyICoqc3BsaXRfc3RyaW5nc19wdHIsIGludCBtYXhfbnVtX3N1YnN0cmluZ3MsCi0gICAgICAgICAgICAgICAgICAgICBjaGFyIGRlbGltaXRlcik7Ci0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1GVU5DVElPTiB0cmltX3NwYWNlCi0KLURFU0NSSVBUSU9OCi0gICBSZW1vdmVzIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHNwYWNlcyBvZiB0aGUgc3RyaW5nCi0KLURFUEVOREVOQ0lFUwotICAgTi9BCi0KLVJFVFVSTiBWQUxVRQotICAgTm9uZQotCi1TSURFIEVGRkVDVFMKLSAgIE4vQQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLXZvaWQgbG9jX3V0aWxfdHJpbV9zcGFjZShjaGFyICpvcmdfc3RyaW5nKTsKLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZiAvL19MT0NfTUlTQ19VVElMU19IXwpkaWZmIC0tZ2l0IGEvbXNtODk3NC91dGlscy9sb2NfdGFyZ2V0LmNwcCBiL21zbTg5NzQvdXRpbHMvbG9jX3RhcmdldC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1YmQwNGQuLjAwMDAwMDAKLS0tIGEvbXNtODk3NC91dGlscy9sb2NfdGFyZ2V0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI0MSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNCwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKLSAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAotICogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAotICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgotICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCi0gKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQotICogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgotICogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2dwcy5oPgotI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+Ci0jaW5jbHVkZSAibG9jX3RhcmdldC5oIgotI2luY2x1ZGUgImxvY19sb2cuaCIKLSNpbmNsdWRlICJsb2dfdXRpbC5oIgotCi0jZGVmaW5lIEFQUTgwNjRfSURfMSAiMTA5IgotI2RlZmluZSBBUFE4MDY0X0lEXzIgIjE1MyIKLSNkZWZpbmUgTVBRODA2NF9JRF8xICIxMzAiCi0jZGVmaW5lIE1TTTg5MzBfSURfMSAiMTQyIgotI2RlZmluZSBNU004OTMwX0lEXzIgIjExNiIKLSNkZWZpbmUgQVBRODAzMF9JRF8xICIxNTciCi0jZGVmaW5lIEFQUTgwNzRfSURfMSAiMTg0IgotCi0jZGVmaW5lIExJTkVfTEVOIDEwMAotI2RlZmluZSBTVFJfTElRVUlEICAgICJMaXF1aWQiCi0jZGVmaW5lIFNUUl9TVVJGICAgICAgIlN1cmYiCi0jZGVmaW5lIFNUUl9NVFAgICAgICAgIk1UUCIKLSNkZWZpbmUgU1RSX0FQUSAgICAgICAiYXBxIgotI2RlZmluZSBJU19TVFJfRU5EKGMpICgoYykgPT0gJ1wwJyB8fCAoYykgPT0gJ1xuJyB8fCAoYykgPT0gJ1xyJykKLSNkZWZpbmUgTEVOR1RIKHMpIChzaXplb2YocykgLSAxKQotI2RlZmluZSBHUFNfQ0hFQ0tfTk9fRVJST1IgMAotI2RlZmluZSBHUFNfQ0hFQ0tfTk9fR1BTX0hXIDEKLS8qIFdoZW4gc3lzdGVtIHNlcnZlciBpcyBzdGFydGVkLCBpdCB1c2VzIDIwIHNlY29uZHMgYXMgQWN0aXZpdHlNYW5hZ2VyCi0gKiB0aW1lb3V0LiBBZnRlciB0aGF0IGl0IHNlbmRzIFNJR1NUT1Agc2lnbmFsIHRvIHByb2Nlc3MuCi0gKi8KLSNkZWZpbmUgUUNBMTUzMF9ERVRFQ1RfVElNRU9VVCAxNQotI2RlZmluZSBRQ0ExNTMwX0RFVEVDVF9QUkVTRU5UICJ5ZXMiCi0jZGVmaW5lIFFDQTE1MzBfREVURUNUX1BST0dSRVNTICJkZXRlY3QiCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgZ1RhcmdldCA9ICh1bnNpZ25lZCBpbnQpLTE7Ci0KLXN0YXRpYyBpbnQgcmVhZF9hX2xpbmUoY29uc3QgY2hhciAqIGZpbGVfcGF0aCwgY2hhciAqIGxpbmUsIGludCBsaW5lX3NpemUpCi17Ci0gICAgRklMRSAqZnA7Ci0gICAgaW50IHJlc3VsdCA9IDA7Ci0KLSAgICAqIGxpbmUgPSAnXDAnOwotICAgIGZwID0gZm9wZW4oZmlsZV9wYXRoLCAiciIgKTsKLSAgICBpZiggZnAgPT0gTlVMTCApIHsKLSAgICAgICAgTE9DX0xPR0UoIm9wZW4gZmFpbGVkOiAlczogJXNcbiIsIGZpbGVfcGF0aCwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgcmVzdWx0ID0gLTE7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaW50IGxlbjsKLSAgICAgICAgZmdldHMobGluZSwgbGluZV9zaXplLCBmcCk7Ci0gICAgICAgIGxlbiA9IHN0cmxlbihsaW5lKTsKLSAgICAgICAgbGVuID0gbGVuIDwgbGluZV9zaXplIC0gMT8gbGVuIDogbGluZV9zaXplIC0gMTsKLSAgICAgICAgbGluZVtsZW5dID0gJ1wwJzsKLSAgICAgICAgTE9DX0xPR0QoImNhdCAlczogJXMiLCBmaWxlX3BhdGgsIGxpbmUpOwotICAgICAgICBmY2xvc2UoZnApOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi0vKiEKLSAqIFxicmllZiBDaGVja3MgaWYgUUNBMTUzMCBpcyBhdmFsYWJsZS4KLSAqCi0gKiBGdW5jdGlvbiB2ZXJpZmllcyBpZiBxY2ExNTMwIFNvQyBpcyBjb25maWd1cmVkIG9uIHRoZSBkZXZpY2UuIFRoZSB0ZXN0IGlzCi0gKiBiYXNlZCBvbiBwcm9wZXJ0eSB2YWx1ZS4gRm9yIDE1MzAgc2NlbmFyaW8sIHRoZSB2YWx1ZSBzaGFsbCBiZSBvbmUgb2YgdGhlCi0gKiBmb2xsb3dpbmc6ICJ5ZXMiLCAibm8iLCAiZGV0ZWN0Ii4gQWxsIG90aGVyIHZhbHVlcyBhcmUgdHJlYXRlZCBlcXVhbGx5IHRvCi0gKiAibm8iLiBXaGVuIHRoZSB2YWx1ZSBpcyAiZGV0ZWN0IiB0aGUgc3lzdGVtIHdhaXRzIGZvciBTb0MgZGV0ZWN0aW9uIHRvCi0gKiBmaW5pc2ggYmVmb3JlIHJldHVybmluZyByZXN1bHQuCi0gKgotICogXHJldHZhbCB0cnVlIC0gUUNBMTUzMCBpcyBhdmFpbGFibGUuCi0gKiBccmV0dmFsIGZhbHNlIC0gUUNBMTUzMCBpcyBub3QgYXZhaWxhYmxlLgotICovCi1zdGF0aWMgYm9vbCBpc19xY2ExNTMwKHZvaWQpCi17Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgcWNhMTUzMF9wcm9wZXJ0eV9uYW1lW10gPSAic3lzLnFjYTE1MzAiOwotICAgIGJvb2wgcmVzID0gZmFsc2U7Ci0gICAgaW50IHJldCwgaTsKLSAgICBjaGFyIGJ1ZltQUk9QRVJUWV9WQUxVRV9NQVhdOwotCi0gICAgbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IFFDQTE1MzBfREVURUNUX1RJTUVPVVQ7ICsraSkKLSAgICB7Ci0gICAgICAgIHJldCA9IHByb3BlcnR5X2dldChxY2ExNTMwX3Byb3BlcnR5X25hbWUsIGJ1ZiwgTlVMTCk7Ci0gICAgICAgIGlmIChyZXQgPCAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBMT0NfTE9HViggInFjYTE1MzA6IHByb3BlcnR5ICVzIGlzIG5vdCBhY2Nlc3NpYmxlLCByZXQ9JWQiLAotICAgICAgICAgICAgICAgICAgcWNhMTUzMF9wcm9wZXJ0eV9uYW1lLAotICAgICAgICAgICAgICAgICAgcmV0KTsKLQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBMT0NfTE9HViggInFjYTE1MzA6IHByb3BlcnR5ICVzIGlzIHNldCB0byAlcyIsCi0gICAgICAgICAgICAgICAgICBxY2ExNTMwX3Byb3BlcnR5X25hbWUsCi0gICAgICAgICAgICAgICAgICBidWYpOwotCi0gICAgICAgIGlmICghbWVtY21wKGJ1ZiwgUUNBMTUzMF9ERVRFQ1RfUFJFU0VOVCwKLSAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFFDQTE1MzBfREVURUNUX1BSRVNFTlQpKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmVzID0gdHJ1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGlmICghbWVtY21wKGJ1ZiwgUUNBMTUzMF9ERVRFQ1RfUFJPR1JFU1MsCi0gICAgICAgICAgICAgICAgICAgIHNpemVvZihRQ0ExNTMwX0RFVEVDVF9QUk9HUkVTUykpKQotICAgICAgICB7Ci0gICAgICAgICAgICBMT0NfTE9HVigicWNhMTUzMDogU29DIGRldGVjdGlvbiBpcyBpbiBwcm9ncmVzcy4iKTsKLSAgICAgICAgICAgIHNsZWVwKDEpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgTE9DX0xPR0QoInFjYTE1MzA6IGRldGVjdGVkPSVzIiwgcmVzID8gInRydWUiIDogImZhbHNlIik7Ci0gICAgcmV0dXJuIHJlczsKLX0KLQotLypUaGUgY2hhcmFjdGVyIGFycmF5IHBhc3NlZCB0byB0aGlzIGZ1bmN0aW9uIHNob3VsZCBoYXZlIGxlbmd0aAotICBvZiBhdGxlYXN0IFBST1BFUlRZX1ZBTFVFX01BWCovCi12b2lkIGxvY19nZXRfdGFyZ2V0X2Jhc2ViYW5kKGNoYXIgKmJhc2ViYW5kLCBpbnQgYXJyYXlfbGVuZ3RoKQotewotICAgIGlmKGJhc2ViYW5kICYmIChhcnJheV9sZW5ndGggPj0gUFJPUEVSVFlfVkFMVUVfTUFYKSkgewotICAgICAgICBwcm9wZXJ0eV9nZXQoInJvLmJhc2ViYW5kIiwgYmFzZWJhbmQsICIiKTsKLSAgICAgICAgTE9DX0xPR0QoIiVzOiVkXTogQmFzZWJhbmQ6ICVzXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIGJhc2ViYW5kKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIExPQ19MT0dFKCIlczolZF06IE5VTEwgcGFyYW1ldGVyIG9yIGFycmF5IGxlbmd0aCBsZXNzIHRoYW4gUFJPUEVSVFlfVkFMVUVfTUFYXG4iLAotICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgX19MSU5FX18pOwotICAgIH0KLX0KLQotLypUaGUgY2hhcmFjdGVyIGFycmF5IHBhc3NlZCB0byB0aGlzIGZ1bmN0aW9uIHNob3VsZCBoYXZlIGxlbmd0aAotICBvZiBhdGxlYXN0IFBST1BFUlRZX1ZBTFVFX01BWCovCi12b2lkIGxvY19nZXRfcGxhdGZvcm1fbmFtZShjaGFyICpwbGF0Zm9ybV9uYW1lLCBpbnQgYXJyYXlfbGVuZ3RoKQotewotICAgIGlmKHBsYXRmb3JtX25hbWUgJiYgKGFycmF5X2xlbmd0aCA+PSBQUk9QRVJUWV9WQUxVRV9NQVgpKSB7Ci0gICAgICAgIHByb3BlcnR5X2dldCgicm8uYm9hcmQucGxhdGZvcm0iLCBwbGF0Zm9ybV9uYW1lLCAiIik7Ci0gICAgICAgIExPQ19MT0dEKCIlczolZF06IFRhcmdldCBuYW1lOiAlc1xuIiwgX19mdW5jX18sIF9fTElORV9fLCBwbGF0Zm9ybV9uYW1lKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIExPQ19MT0dFKCIlczolZF06IE51bGwgcGFyYW1ldGVyIG9yIGFycmF5IGxlbmd0aCBsZXNzIHRoYW4gUFJPUEVSVFlfVkFMVUVfTUFYXG4iLAotICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgX19MSU5FX18pOwotICAgIH0KLX0KLQotdW5zaWduZWQgaW50IGxvY19nZXRfdGFyZ2V0KHZvaWQpCi17Ci0gICAgaWYgKGdUYXJnZXQgIT0gKHVuc2lnbmVkIGludCktMSkKLSAgICAgICAgcmV0dXJuIGdUYXJnZXQ7Ci0KLSAgICBzdGF0aWMgY29uc3QgY2hhciBod19wbGF0Zm9ybVtdICAgICAgPSAiL3N5cy9kZXZpY2VzL3NvYzAvaHdfcGxhdGZvcm0iOwotICAgIHN0YXRpYyBjb25zdCBjaGFyIGlkW10gICAgICAgICAgICAgICA9ICIvc3lzL2RldmljZXMvc29jMC9zb2NfaWQiOwotICAgIHN0YXRpYyBjb25zdCBjaGFyIGh3X3BsYXRmb3JtX2RlcFtdICA9Ci0gICAgICAgICIvc3lzL2RldmljZXMvc3lzdGVtL3NvYy9zb2MwL2h3X3BsYXRmb3JtIjsKLSAgICBzdGF0aWMgY29uc3QgY2hhciBpZF9kZXBbXSAgICAgICAgICAgPSAiL3N5cy9kZXZpY2VzL3N5c3RlbS9zb2Mvc29jMC9pZCI7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgbWRtW10gICAgICAgICAgICAgID0gIi9kZXYvbWRtIjsgLy8gTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeQotCi0gICAgY2hhciByZF9od19wbGF0Zm9ybVtMSU5FX0xFTl07Ci0gICAgY2hhciByZF9pZFtMSU5FX0xFTl07Ci0gICAgY2hhciByZF9tZG1bTElORV9MRU5dOwotICAgIGNoYXIgYmFzZWJhbmRbTElORV9MRU5dOwotCi0gICAgaWYgKGlzX3FjYTE1MzAoKSkgewotICAgICAgICBnVGFyZ2V0ID0gVEFSR0VUX1FDQTE1MzA7Ci0gICAgICAgIGdvdG8gZGV0ZWN0ZWQ7Ci0gICAgfQotCi0gICAgbG9jX2dldF90YXJnZXRfYmFzZWJhbmQoYmFzZWJhbmQsIHNpemVvZihiYXNlYmFuZCkpOwotCi0gICAgaWYgKCFhY2Nlc3MoaHdfcGxhdGZvcm0sIEZfT0spKSB7Ci0gICAgICAgIHJlYWRfYV9saW5lKGh3X3BsYXRmb3JtLCByZF9od19wbGF0Zm9ybSwgTElORV9MRU4pOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlYWRfYV9saW5lKGh3X3BsYXRmb3JtX2RlcCwgcmRfaHdfcGxhdGZvcm0sIExJTkVfTEVOKTsKLSAgICB9Ci0gICAgaWYgKCFhY2Nlc3MoaWQsIEZfT0spKSB7Ci0gICAgICAgIHJlYWRfYV9saW5lKGlkLCByZF9pZCwgTElORV9MRU4pOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlYWRfYV9saW5lKGlkX2RlcCwgcmRfaWQsIExJTkVfTEVOKTsKLSAgICB9Ci0KLSAgICBpZiggIW1lbWNtcChiYXNlYmFuZCwgU1RSX0FQUSwgTEVOR1RIKFNUUl9BUFEpKSApewotICAgICAgICBpZiggIW1lbWNtcChyZF9pZCwgTVBRODA2NF9JRF8xLCBMRU5HVEgoTVBRODA2NF9JRF8xKSkKLSAgICAgICAgICAgICYmIElTX1NUUl9FTkQocmRfaWRbTEVOR1RIKE1QUTgwNjRfSURfMSldKSApCi0gICAgICAgICAgICBnVGFyZ2V0ID0gVEFSR0VUX01QUTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZ1RhcmdldCA9IFRBUkdFVF9BUFFfU0E7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBpZiggKCFtZW1jbXAocmRfaHdfcGxhdGZvcm0sIFNUUl9MSVFVSUQsIExFTkdUSChTVFJfTElRVUlEKSkKLSAgICAgICAgICAgICAmJiBJU19TVFJfRU5EKHJkX2h3X3BsYXRmb3JtW0xFTkdUSChTVFJfTElRVUlEKV0pKSB8fAotICAgICAgICAgICAgKCFtZW1jbXAocmRfaHdfcGxhdGZvcm0sIFNUUl9TVVJGLCAgIExFTkdUSChTVFJfU1VSRikpCi0gICAgICAgICAgICAgJiYgSVNfU1RSX0VORChyZF9od19wbGF0Zm9ybVtMRU5HVEgoU1RSX1NVUkYpXSkpIHx8Ci0gICAgICAgICAgICAoIW1lbWNtcChyZF9od19wbGF0Zm9ybSwgU1RSX01UUCwgICBMRU5HVEgoU1RSX01UUCkpCi0gICAgICAgICAgICAgJiYgSVNfU1RSX0VORChyZF9od19wbGF0Zm9ybVtMRU5HVEgoU1RSX01UUCldKSkpIHsKLQotICAgICAgICAgICAgaWYgKCFyZWFkX2FfbGluZSggbWRtLCByZF9tZG0sIExJTkVfTEVOKSkKLSAgICAgICAgICAgICAgICBnVGFyZ2V0ID0gVEFSR0VUX01ETTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKCAoIW1lbWNtcChyZF9pZCwgTVNNODkzMF9JRF8xLCBMRU5HVEgoTVNNODkzMF9JRF8xKSkKLSAgICAgICAgICAgICAgICAgICAmJiBJU19TVFJfRU5EKHJkX2lkW0xFTkdUSChNU004OTMwX0lEXzEpXSkpIHx8Ci0gICAgICAgICAgICAgICAgICAoIW1lbWNtcChyZF9pZCwgTVNNODkzMF9JRF8yLCBMRU5HVEgoTVNNODkzMF9JRF8yKSkKLSAgICAgICAgICAgICAgICAgICAmJiBJU19TVFJfRU5EKHJkX2lkW0xFTkdUSChNU004OTMwX0lEXzIpXSkpICkKLSAgICAgICAgICAgICBnVGFyZ2V0ID0gVEFSR0VUX01TTV9OT19TU0M7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgICBnVGFyZ2V0ID0gVEFSR0VUX1VOS05PV047Ci0gICAgfQotCi1kZXRlY3RlZDoKLSAgICBMT0NfTE9HRCgiSEFMOiAlcyByZXR1cm5lZCAlZCIsIF9fRlVOQ1RJT05fXywgZ1RhcmdldCk7Ci0gICAgcmV0dXJuIGdUYXJnZXQ7Ci19CmRpZmYgLS1naXQgYS9tc204OTc0L3V0aWxzL2xvY190YXJnZXQuaCBiL21zbTg5NzQvdXRpbHMvbG9jX3RhcmdldC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWE1MjVmLi4wMDAwMDAwCi0tLSBhL21zbTg5NzQvdXRpbHMvbG9jX3RhcmdldC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTQsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCi0gKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKLSAqICAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKLSAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAotICogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKLSAqIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KLSAqIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotI2lmbmRlZiBMT0NfVEFSR0VUX0gKLSNkZWZpbmUgTE9DX1RBUkdFVF9ICi0jZGVmaW5lIFRBUkdFVF9TRVQoZ25zcyxzc2MpICggKGduc3M8PDEpfHNzYyApCi0jZGVmaW5lIFRBUkdFVF9ERUZBVUxUICAgICAgIFRBUkdFVF9TRVQoR05TU19NU00sIEhBU19TU0MpCi0jZGVmaW5lIFRBUkdFVF9NRE0gICAgICAgICAgIFRBUkdFVF9TRVQoR05TU19NRE0sIEhBU19TU0MpCi0jZGVmaW5lIFRBUkdFVF9BUFFfU0EgICAgICAgIFRBUkdFVF9TRVQoR05TU19HU1MsIE5PX1NTQykKLSNkZWZpbmUgVEFSR0VUX01QUSAgICAgICAgICAgVEFSR0VUX1NFVChHTlNTX05PTkUsTk9fU1NDKQotI2RlZmluZSBUQVJHRVRfTVNNX05PX1NTQyAgICBUQVJHRVRfU0VUKEdOU1NfTVNNLCBOT19TU0MpCi0jZGVmaW5lIFRBUkdFVF9RQ0ExNTMwICAgICAgIFRBUkdFVF9TRVQoR05TU19RQ0ExNTMwLCBOT19TU0MpCi0jZGVmaW5lIFRBUkdFVF9VTktOT1dOICAgICAgIFRBUkdFVF9TRVQoR05TU19VTktOT1dOLCBOT19TU0MpCi0jZGVmaW5lIGdldFRhcmdldEduc3NUeXBlKHRhcmdldCkgICh0YXJnZXQ+PjEpCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotewotI2VuZGlmCi0KLXVuc2lnbmVkIGludCBsb2NfZ2V0X3RhcmdldCh2b2lkKTsKLQotLypUaGUgY2hhcmFjdGVyIGFycmF5IHBhc3NlZCB0byB0aGlzIGZ1bmN0aW9uIHNob3VsZCBoYXZlIGxlbmd0aAotICBvZiBhdGxlYXN0IFBST1BFUlRZX1ZBTFVFX01BWCovCi12b2lkIGxvY19nZXRfdGFyZ2V0X2Jhc2ViYW5kKGNoYXIgKmJhc2ViYW5kLCBpbnQgYXJyYXlfbGVuZ3RoKTsKLS8qVGhlIGNoYXJhY3RlciBhcnJheSBwYXNzZWQgdG8gdGhpcyBmdW5jdGlvbiBzaG91bGQgaGF2ZSBsZW5ndGgKLSAgb2YgYXRsZWFzdCBQUk9QRVJUWV9WQUxVRV9NQVgqLwotdm9pZCBsb2NfZ2V0X3BsYXRmb3JtX25hbWUoY2hhciAqcGxhdGZvcm1fbmFtZSwgaW50IGFycmF5X2xlbmd0aCk7Ci0KLS8qIFBsZWFzZSByZW1lbWJlciB0byB1cGRhdGUgJ3RhcmdldF9uYW1lJyBpbiBsb2NfbG9nLmNwcCwKLSAgIGlmIGRvIGFueSBjaGFuZ2VzIHRvIHRoaXMgZW51bS4gKi8KLXR5cGVkZWYgZW51bSB7Ci0gICAgR05TU19OT05FID0gMCwKLSAgICBHTlNTX01TTSwKLSAgICBHTlNTX0dTUywKLSAgICBHTlNTX01ETSwKLSAgICBHTlNTX1FDQTE1MzAsCi0gICAgR05TU19VTktOT1dOCi19R05TU19UQVJHRVQ7Ci0KLXR5cGVkZWYgZW51bSB7Ci0gICAgTk9fU1NDID0gMCwKLSAgICBIQVNfU1NDCi19U1NDX1RZUEU7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZiAvKkxPQ19UQVJHRVRfSCovCmRpZmYgLS1naXQgYS9tc204OTc0L3V0aWxzL2xvY190aW1lci5jIGIvbXNtODk3NC91dGlscy9sb2NfdGltZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU0MDA4ZS4uMDAwMDAwMAotLS0gYS9tc204OTc0L3V0aWxzL2xvY190aW1lci5jCisrKyAvZGV2L251bGwKQEAgLTEsMTg2ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKLSAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAotICogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiwgbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKLSAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAotICogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKLSAqIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KLSAqIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaW5jbHVkZTxzdGRpby5oPgotI2luY2x1ZGU8c3RkbGliLmg+Ci0jaW5jbHVkZTxzeXMvdGltZS5oPgotI2luY2x1ZGUgImxvY190aW1lci5oIgotI2luY2x1ZGU8dGltZS5oPgotI2luY2x1ZGU8ZXJybm8uaD4KLQotZW51bSB0aW1lcl9zdGF0ZSB7Ci0gICAgUkVBRFkgPSAxMDAsCi0gICAgV0FJVElORywKLSAgICBET05FLAotICAgIEFCT1JUCi19OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgbG9jX3RpbWVyX2NhbGxiYWNrIGNhbGxiYWNrX2Z1bmM7Ci0gICAgdm9pZCAqdXNlcl9kYXRhOwotICAgIHVuc2lnbmVkIGludCB0aW1lX21zZWM7Ci0gICAgcHRocmVhZF9jb25kX3QgdGltZXJfY29uZDsKLSAgICBwdGhyZWFkX211dGV4X3QgdGltZXJfbXV0ZXg7Ci0gICAgZW51bSB0aW1lcl9zdGF0ZSBzdGF0ZTsKLX10aW1lcl9kYXRhOwotCi1zdGF0aWMgdm9pZCAqdGltZXJfdGhyZWFkKHZvaWQgKnRocmVhZF9kYXRhKQotewotICAgIGludCByZXQgPSAtRVRJTUVET1VUOwotICAgIHN0cnVjdCB0aW1lc3BlYyB0czsKLSAgICBzdHJ1Y3QgdGltZXZhbCB0djsKLSAgICB0aW1lcl9kYXRhKiB0ID0gKHRpbWVyX2RhdGEqKXRocmVhZF9kYXRhOwotCi0gICAgTE9DX0xPR0QoIiVzOiVkXTogRW50ZXIuIERlbGF5ID0gJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgdC0+dGltZV9tc2VjKTsKLQotICAgIGdldHRpbWVvZmRheSgmdHYsIE5VTEwpOwotICAgIGNsb2NrX2dldHRpbWUoQ0xPQ0tfUkVBTFRJTUUsICZ0cyk7Ci0gICAgaWYodC0+dGltZV9tc2VjID49IDEwMDApIHsKLSAgICAgICAgdHMudHZfc2VjICs9IHQtPnRpbWVfbXNlYy8xMDAwOwotICAgICAgICB0LT50aW1lX21zZWMgPSB0LT50aW1lX21zZWMgJSAxMDAwOwotICAgIH0KLSAgICBpZih0LT50aW1lX21zZWMpCi0gICAgICAgIHRzLnR2X25zZWMgKz0gdC0+dGltZV9tc2VjICogMTAwMDAwMDsKLSAgICBpZih0cy50dl9uc2VjID4gOTk5OTk5OTk5KSB7Ci0gICAgICAgIExPQ19MT0dEKCIlczolZF06IExhcmdlIG5hbm9zZWNzXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotICAgICAgICB0cy50dl9zZWMgKz0gMTsKLSAgICAgICAgdHMudHZfbnNlYyAtPSAxMDAwMDAwMDAwOwotICAgIH0KLSAgICBMT0NfTE9HRCgiJXM6JWRdOiB0cy50dl9zZWM6JWQ7IHRzLnR2X25zZWM6JWRcbiIKLSAgICAgICAgICAgICAiXHQgQ3VycmVudCB0aW1lOiAlZCBzZWM7ICVkIG5zZWMiLAotICAgICAgICAgICAgIF9fZnVuY19fLCBfX0xJTkVfXywgKGludCl0cy50dl9zZWMsIChpbnQpdHMudHZfbnNlYywKLSAgICAgICAgICAgICAoaW50KXR2LnR2X3NlYywgKGludCl0di50dl91c2VjKjEwMDApOwotCi0gICAgcHRocmVhZF9tdXRleF9sb2NrKCYodC0+dGltZXJfbXV0ZXgpKTsKLSAgICBpZiAoUkVBRFkgPT0gdC0+c3RhdGUpIHsKLSAgICAgICAgdC0+c3RhdGUgPSBXQUlUSU5HOwotICAgICAgICByZXQgPSBwdGhyZWFkX2NvbmRfdGltZWR3YWl0KCZ0LT50aW1lcl9jb25kLCAmdC0+dGltZXJfbXV0ZXgsICZ0cyk7Ci0gICAgICAgIHQtPnN0YXRlID0gRE9ORTsKLSAgICB9Ci0gICAgcHRocmVhZF9tdXRleF91bmxvY2soJih0LT50aW1lcl9tdXRleCkpOwotCi0gICAgc3dpdGNoIChyZXQpIHsKLSAgICBjYXNlIEVUSU1FRE9VVDoKLSAgICAgICAgTE9DX0xPR1YoIiVzOiVkXTogbG9jX3RpbWVyIHRpbWVkIG91dCIsICBfX2Z1bmNfXywgX19MSU5FX18pOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDA6Ci0gICAgICAgIExPQ19MT0dWKCIlczolZF06IGxvY190aW1lciBzdG9wcGVkIiwgIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgLUVUSU1FRE9VVDoKLSAgICAgICAgTE9DX0xPR1YoIiVzOiVkXTogbG9jX3RpbWVyIGNhbmNlbGxlZCIsICBfX2Z1bmNfXywgX19MSU5FX18pOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBMT0NfTE9HRSgiJXM6JWRdOiBDYWxsIHRvIHB0aHJlYWQgdGltZWR3YWl0IGZhaWxlZDsgcmV0PSVkXG4iLAotICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgX19MSU5FX18sIHJldCk7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmdC0+dGltZXJfbXV0ZXgpOwotICAgIHB0aHJlYWRfY29uZF9kZXN0cm95KCZ0LT50aW1lcl9jb25kKTsKLQotICAgIGlmKEVUSU1FRE9VVCA9PSByZXQpCi0gICAgICAgIHQtPmNhbGxiYWNrX2Z1bmModC0+dXNlcl9kYXRhLCByZXQpOwotCi0gICAgZnJlZSh0KTsKLSAgICBMT0NfTE9HRCgiJXM6JWRdOiBFeGl0XG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotICAgIHJldHVybiBOVUxMOwotfQotCi12b2lkKiBsb2NfdGltZXJfc3RhcnQodW5zaWduZWQgaW50IG1zZWMsIGxvY190aW1lcl9jYWxsYmFjayBjYl9mdW5jLAotICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNhbGxlcl9kYXRhKQotewotICAgIHRpbWVyX2RhdGEgKnQ9TlVMTDsKLSAgICBwdGhyZWFkX2F0dHJfdCB0YXR0cjsKLSAgICBwdGhyZWFkX3QgaWQ7Ci0gICAgTE9DX0xPR0QoIiVzOiVkXTogRW50ZXJcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0gICAgaWYoY2JfZnVuYyA9PSBOVUxMIHx8IG1zZWMgPT0gMCkgewotICAgICAgICBMT0NfTE9HRSgiJXM6JWRdOiBFcnJvcjogV3JvbmcgcGFyYW1ldGVyc1xuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLSAgICAgICAgZ290byBfZXJyOwotICAgIH0KLSAgICB0ID0gKHRpbWVyX2RhdGEgKiljYWxsb2MoMSwgc2l6ZW9mKHRpbWVyX2RhdGEpKTsKLSAgICBpZih0ID09IE5VTEwpIHsKLSAgICAgICAgTE9DX0xPR0UoIiVzOiVkXTogQ291bGQgbm90IGFsbG9jYXRlIG1lbW9yeS4gRmFpbGluZy5cbiIsCi0gICAgICAgICAgICAgICAgIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0gICAgICAgIGdvdG8gX2VycjsKLSAgICB9Ci0KLSAgICBpZihwdGhyZWFkX2NvbmRfaW5pdCgmKHQtPnRpbWVyX2NvbmQpLCBOVUxMKSkgewotICAgICAgICBMT0NfTE9HRSgiJXM6JWRdOiBQdGhyZWFkIGNvbmQgaW5pdCBmYWlsZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0gICAgICAgIGdvdG8gdF9lcnI7Ci0gICAgfQotICAgIGlmKHB0aHJlYWRfbXV0ZXhfaW5pdCgmKHQtPnRpbWVyX211dGV4KSwgTlVMTCkpIHsKLSAgICAgICAgTE9DX0xPR0UoIiVzOiVkXTogUHRocmVhZCBtdXRleCBpbml0IGZhaWxlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLSAgICAgICAgZ290byBjb25kX2VycjsKLSAgICB9Ci0KLSAgICB0LT5jYWxsYmFja19mdW5jID0gY2JfZnVuYzsKLSAgICB0LT51c2VyX2RhdGEgPSBjYWxsZXJfZGF0YTsKLSAgICB0LT50aW1lX21zZWMgPSBtc2VjOwotICAgIHQtPnN0YXRlID0gUkVBRFk7Ci0KLSAgICBpZiAocHRocmVhZF9hdHRyX2luaXQoJnRhdHRyKSkgewotICAgICAgICBMT0NfTE9HRSgiJXM6JWRdOiBQdGhyZWFkIG11dGV4IGluaXQgZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotICAgICAgICBnb3RvIG11dGV4X2VycjsKLSAgICB9Ci0gICAgcHRocmVhZF9hdHRyX3NldGRldGFjaHN0YXRlKCZ0YXR0ciwgUFRIUkVBRF9DUkVBVEVfREVUQUNIRUQpOwotCi0gICAgaWYocHRocmVhZF9jcmVhdGUoJihpZCksICZ0YXR0ciwgdGltZXJfdGhyZWFkLCAodm9pZCAqKXQpKSB7Ci0gICAgICAgIExPQ19MT0dFKCIlczolZF06IENvdWxkIG5vdCBjcmVhdGUgdGhyZWFkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotICAgICAgICBnb3RvIGF0dHJfZXJyOwotICAgIH0KLQotICAgIExPQ19MT0dEKCIlczolZF06IENyZWF0ZWQgdGhyZWFkIHdpdGggaWQ6ICVkXG4iLAotICAgICAgICAgICAgIF9fZnVuY19fLCBfX0xJTkVfXywgKGludClpZCk7Ci0gICAgZ290byBfZXJyOwotCi1hdHRyX2VycjoKLSAgICBwdGhyZWFkX2F0dHJfZGVzdHJveSgmdGF0dHIpOwotbXV0ZXhfZXJyOgotICAgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmdC0+dGltZXJfbXV0ZXgpOwotY29uZF9lcnI6Ci0gICAgcHRocmVhZF9jb25kX2Rlc3Ryb3koJnQtPnRpbWVyX2NvbmQpOwotdF9lcnI6Ci0gICAgZnJlZSh0KTsKLV9lcnI6Ci0gICAgTE9DX0xPR0QoIiVzOiVkXTogRXhpdFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLSAgICByZXR1cm4gdDsKLX0KLQotdm9pZCBsb2NfdGltZXJfc3RvcCh2b2lkKiBoYW5kbGUpIHsKLSAgICB0aW1lcl9kYXRhKiB0ID0gKHRpbWVyX2RhdGEqKWhhbmRsZTsKLQotICAgIGlmIChOVUxMICE9IHQgJiYgKFJFQURZID09IHQtPnN0YXRlIHx8IFdBSVRJTkcgPT0gdC0+c3RhdGUpKSB7Ci0gICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmKHQtPnRpbWVyX211dGV4KSk7Ci0gICAgICAgIGlmIChSRUFEWSA9PSB0LT5zdGF0ZSB8fCBXQUlUSU5HID09IHQtPnN0YXRlKSB7Ci0gICAgICAgICAgICBwdGhyZWFkX2NvbmRfc2lnbmFsKCZ0LT50aW1lcl9jb25kKTsKLSAgICAgICAgICAgIHQtPnN0YXRlID0gQUJPUlQ7Ci0gICAgICAgIH0KLSAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJih0LT50aW1lcl9tdXRleCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21zbTg5NzQvdXRpbHMvbG9jX3RpbWVyLmggYi9tc204OTc0L3V0aWxzL2xvY190aW1lci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDM0ZDI3Li4wMDAwMDAwCi0tLSBhL21zbTg5NzQvdXRpbHMvbG9jX3RpbWVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTMsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCi0gKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKLSAqICAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24sIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCi0gKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKLSAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCi0gKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCi0gKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2lmbmRlZiBfX0xPQ19ERUxBWV9IX18KLSNkZWZpbmUgX19MT0NfREVMQVlfSF9fCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLSNpbmNsdWRlPHB0aHJlYWQuaD4KLSNpbmNsdWRlICJsb2dfdXRpbC5oIgotCi0vKgotICBSZXR1cm4gdmFsdWVzOgotICBTdWNjZXNzID0gMAotICBGYWlsdXJlID0gTm9uIHplcm8KLSovCi10eXBlZGVmIHZvaWQoKmxvY190aW1lcl9jYWxsYmFjaykodm9pZCAqdXNlcl9kYXRhLCBpbnQgcmVzdWx0KTsKLQotCi0vKgotICBSZXR1cm5zIHRoZSBoYW5kbGUsIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHN0b3AgdGhlIHRpbWVyCi0qLwotdm9pZCogbG9jX3RpbWVyX3N0YXJ0KHVuc2lnbmVkIGludCBkZWxheV9tc2VjLAotICAgICAgICAgICAgICAgICAgICAgIGxvY190aW1lcl9jYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICB2b2lkKiB1c2VyX2RhdGEpOwotCi0vKgotICBoYW5kbGUgYmVjb21lcyBpbnZhbGlkIHVwb24gdGhlIHJldHVybiBvZiB0aGUgY2FsbGJhY2sKLSovCi12b2lkIGxvY190aW1lcl9zdG9wKHZvaWQqIGhhbmRsZSk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLSNlbmRpZiAvL19fTE9DX0RFTEFZX0hfXwpkaWZmIC0tZ2l0IGEvbXNtODk3NC91dGlscy9sb2dfdXRpbC5oIGIvbXNtODk3NC91dGlscy9sb2dfdXRpbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmY2YjVhLi4wMDAwMDAwCi0tLSBhL21zbTg5NzQvdXRpbHMvbG9nX3V0aWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDE4MSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxNCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZwotICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCi0gKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCi0gKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKLSAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCi0gKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCi0gKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2lmbmRlZiBfX0xPR19VVElMX0hfXwotI2RlZmluZSBfX0xPR19VVElMX0hfXwotCi0jaWZuZGVmIFVTRV9HTElCCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jZW5kaWYgLyogVVNFX0dMSUIgKi8KLQotI2lmZGVmIFVTRV9HTElCCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaWZuZGVmIExPR19UQUcKLSNkZWZpbmUgTE9HX1RBRyAiR1BTX1VUSUxTIgotCi0jZW5kaWYgIC8vIExPR19UQUcKLQotI2VuZGlmIC8qIFVTRV9HTElCICovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotewotI2VuZGlmCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogICAgICAgICAgICAgICAgICAgICAgICAgTE9DIExPR0dFUiBUWVBFIERFQ0xBUkFUSU9OCi0gKgotICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLS8qIExPQyBMT0dHRVIgKi8KLXR5cGVkZWYgc3RydWN0IGxvY19sb2dnZXJfcwotewotICB1bnNpZ25lZCBsb25nICBERUJVR19MRVZFTDsKLSAgdW5zaWduZWQgbG9uZyAgVElNRVNUQU1QOwotfSBsb2NfbG9nZ2VyX3NfdHlwZTsKLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYVEVSTkFMIERBVEEKLSAqCi0gKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotZXh0ZXJuIGxvY19sb2dnZXJfc190eXBlIGxvY19sb2dnZXI7Ci0KLS8vIExvZ2dpbmcgSW1wcm92ZW1lbnRzCi1leHRlcm4gY29uc3QgY2hhciAqbG9jX2xvZ2dlcl9ib29sU3RyW107Ci0KLWV4dGVybiBjb25zdCBjaGFyICpib29sU3RyW107Ci1leHRlcm4gY29uc3QgY2hhciBWT0lEX1JFVFtdOwotZXh0ZXJuIGNvbnN0IGNoYXIgRlJPTV9BRldbXTsKLWV4dGVybiBjb25zdCBjaGFyIFRPX01PREVNW107Ci1leHRlcm4gY29uc3QgY2hhciBGUk9NX01PREVNW107Ci1leHRlcm4gY29uc3QgY2hhciBUT19BRldbXTsKLWV4dGVybiBjb25zdCBjaGFyIEVYSVRfVEFHW107Ci1leHRlcm4gY29uc3QgY2hhciBFTlRSWV9UQUdbXTsKLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIE1PRFVMRSBFWFBPUlRFRCBGVU5DVElPTlMKLSAqCi0gKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotZXh0ZXJuIHZvaWQgbG9jX2xvZ2dlcl9pbml0KHVuc2lnbmVkIGxvbmcgZGVidWcsIHVuc2lnbmVkIGxvbmcgdGltZXN0YW1wKTsKLWV4dGVybiBjaGFyKiBnZXRfdGltZXN0YW1wKGNoYXIqIHN0ciwgdW5zaWduZWQgbG9uZyBidWZfc2l6ZSk7Ci0KLSNpZm5kZWYgREVCVUdfRE1OX0xPQ19BUEkKLQotLyogTE9HR0lORyBNQUNST1MgKi8KLS8qbG9jX2xvZ2dlci5ERUJVR19MRVZFTCBpcyBpbml0aWFsaXplZCB0byAweGZmIGluIGxvY19jZmcuY3BwCi0gIGlmIHRoYXQgdmFsdWUgcmVtYWlucyB1bmNoYW5nZWQsIGl0IG1lYW5zIGdwcy5jb25mIGRpZCBub3QKLSAgcHJvdmlkZSBhIHZhbHVlIGFuZCB3ZSBkZWZhdWx0IHRvIHRoZSBpbml0aWFsIHZhbHVlIHRvIHVzZQotICBBbmRyb2lkJ3MgbG9nZ2luZyBsZXZlbHMqLwotI2RlZmluZSBJRl9MT0NfTE9HRSBpZigobG9jX2xvZ2dlci5ERUJVR19MRVZFTCA+PSAxKSAmJiAobG9jX2xvZ2dlci5ERUJVR19MRVZFTCA8PSA1KSkKLQotI2RlZmluZSBJRl9MT0NfTE9HVyBpZigobG9jX2xvZ2dlci5ERUJVR19MRVZFTCA+PSAyKSAmJiAobG9jX2xvZ2dlci5ERUJVR19MRVZFTCA8PSA1KSkKLQotI2RlZmluZSBJRl9MT0NfTE9HSSBpZigobG9jX2xvZ2dlci5ERUJVR19MRVZFTCA+PSAzKSAmJiAobG9jX2xvZ2dlci5ERUJVR19MRVZFTCA8PSA1KSkKLQotI2RlZmluZSBJRl9MT0NfTE9HRCBpZigobG9jX2xvZ2dlci5ERUJVR19MRVZFTCA+PSA0KSAmJiAobG9jX2xvZ2dlci5ERUJVR19MRVZFTCA8PSA1KSkKLQotI2RlZmluZSBJRl9MT0NfTE9HViBpZigobG9jX2xvZ2dlci5ERUJVR19MRVZFTCA+PSA1KSAmJiAobG9jX2xvZ2dlci5ERUJVR19MRVZFTCA8PSA1KSkKLQotI2RlZmluZSBMT0NfTE9HRSguLi4pIFwKLUlGX0xPQ19MT0dFIHsgQUxPR0UoIkUvIiBfX1ZBX0FSR1NfXyk7IH0gXAotZWxzZSBpZiAobG9jX2xvZ2dlci5ERUJVR19MRVZFTCA9PSAweGZmKSB7IEFMT0dFKCJFLyIgX19WQV9BUkdTX18pOyB9Ci0KLSNkZWZpbmUgTE9DX0xPR1coLi4uKSBcCi1JRl9MT0NfTE9HVyB7IEFMT0dFKCJXLyIgX19WQV9BUkdTX18pOyB9ICBcCi1lbHNlIGlmIChsb2NfbG9nZ2VyLkRFQlVHX0xFVkVMID09IDB4ZmYpIHsgQUxPR1coIlcvIiBfX1ZBX0FSR1NfXyk7IH0KLQotI2RlZmluZSBMT0NfTE9HSSguLi4pIFwKLUlGX0xPQ19MT0dJIHsgQUxPR0UoIkkvIiBfX1ZBX0FSR1NfXyk7IH0gICBcCi1lbHNlIGlmIChsb2NfbG9nZ2VyLkRFQlVHX0xFVkVMID09IDB4ZmYpIHsgQUxPR0koIkkvIiBfX1ZBX0FSR1NfXyk7IH0KLQotI2RlZmluZSBMT0NfTE9HRCguLi4pIFwKLUlGX0xPQ19MT0dEIHsgQUxPR0UoIkQvIiBfX1ZBX0FSR1NfXyk7IH0gICBcCi1lbHNlIGlmIChsb2NfbG9nZ2VyLkRFQlVHX0xFVkVMID09IDB4ZmYpIHsgQUxPR0QoIkQvIiBfX1ZBX0FSR1NfXyk7IH0KLQotI2RlZmluZSBMT0NfTE9HViguLi4pIFwKLUlGX0xPQ19MT0dWIHsgQUxPR0UoIlYvIiBfX1ZBX0FSR1NfXyk7IH0gICBcCi1lbHNlIGlmIChsb2NfbG9nZ2VyLkRFQlVHX0xFVkVMID09IDB4ZmYpIHsgQUxPR1YoIlYvIiBfX1ZBX0FSR1NfXyk7IH0KLQotI2Vsc2UgLyogREVCVUdfRE1OX0xPQ19BUEkgKi8KLQotI2RlZmluZSBMT0NfTE9HRSguLi4pIEFMT0dFKCJFLyIgX19WQV9BUkdTX18pCi0KLSNkZWZpbmUgTE9DX0xPR1coLi4uKSBBTE9HVygiVy8iIF9fVkFfQVJHU19fKQotCi0jZGVmaW5lIExPQ19MT0dJKC4uLikgQUxPR0koIkkvIiBfX1ZBX0FSR1NfXykKLQotI2RlZmluZSBMT0NfTE9HRCguLi4pIEFMT0dEKCJELyIgX19WQV9BUkdTX18pCi0KLSNkZWZpbmUgTE9DX0xPR1YoLi4uKSBBTE9HVigiVi8iIF9fVkFfQVJHU19fKQotCi0jZW5kaWYgLyogREVCVUdfRE1OX0xPQ19BUEkgKi8KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBMT0dHSU5HIElNUFJPVkVNRU5UIE1BQ1JPUwotICoKLSAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0jZGVmaW5lIExPR18oTE9DX0xPRywgSUQsIFdIQVQsIFNQRUMsIFZBTCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGlmIChsb2NfbG9nZ2VyLlRJTUVTVEFNUCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBjaGFyIHRzWzMyXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBMT0NfTE9HKCJbJXNdICVzICVzIGxpbmUgJWQgIiAjU1BFQywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICBnZXRfdGltZXN0YW1wKHRzLCBzaXplb2YodHMpKSwgSUQsIFdIQVQsIF9fTElORV9fLCBWQUwpOyBcCi0gICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBMT0NfTE9HKCIlcyAlcyBsaW5lICVkICIgI1NQRUMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICBJRCwgV0hBVCwgX19MSU5FX18sIFZBTCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSB3aGlsZSgwKQotCi0KLSNkZWZpbmUgTE9HX0koSUQsIFdIQVQsIFNQRUMsIFZBTCkgTE9HXyhMT0NfTE9HSSwgSUQsIFdIQVQsIFNQRUMsIFZBTCkKLSNkZWZpbmUgTE9HX1YoSUQsIFdIQVQsIFNQRUMsIFZBTCkgTE9HXyhMT0NfTE9HViwgSUQsIFdIQVQsIFNQRUMsIFZBTCkKLQotI2RlZmluZSBFTlRSWV9MT0coKSBMT0dfVihFTlRSWV9UQUcsIF9fZnVuY19fLCAlcywgIiIpCi0jZGVmaW5lIEVYSVRfTE9HKFNQRUMsIFZBTCkgTE9HX1YoRVhJVF9UQUcsIF9fZnVuY19fLCBTUEVDLCBWQUwpCi0KLQotLy8gVXNlZCBmb3IgbG9nZ2luZyBjYWxsZmxvdyBmcm9tIEFuZHJvaWQgRnJhbWV3b3JrCi0jZGVmaW5lIEVOVFJZX0xPR19DQUxMRkxPVygpIExPR19JKEZST01fQUZXLCBfX2Z1bmNfXywgJXMsICIiKQotLy8gVXNlZCBmb3IgbG9nZ2luZyBjYWxsZmxvdyB0byBNb2RlbQotI2RlZmluZSBFWElUX0xPR19DQUxMRkxPVyhTUEVDLCBWQUwpIExPR19JKFRPX01PREVNLCBfX2Z1bmNfXywgU1BFQywgVkFMKQotLy8gVXNlZCBmb3IgbG9nZ2luZyBjYWxsZmxvdyBmcm9tIE1vZGVtKFRPX01PREVNLCBfX2Z1bmNfXywgJXMsICIiKQotI2RlZmluZSBNT0RFTV9MT0dfQ0FMTEZMT1coU1BFQywgVkFMKSBMT0dfSShGUk9NX01PREVNLCBfX2Z1bmNfXywgU1BFQywgVkFMKQotLy8gVXNlZCBmb3IgbG9nZ2luZyBjYWxsZmxvdyB0byBBbmRyb2lkIEZyYW1ld29yawotI2RlZmluZSBDQUxMQkFDS19MT0dfQ0FMTEZMT1coQ0IsIFNQRUMsIFZBTCkgTE9HX0koVE9fQUZXLCBDQiwgU1BFQywgVkFMKQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYgLy8gX19MT0dfVVRJTF9IX18KZGlmZiAtLWdpdCBhL21zbTg5NzQvdXRpbHMvbXNnX3EuYyBiL21zbTg5NzQvdXRpbHMvbXNnX3EuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFiY2ZiMS4uMDAwMDAwMAotLS0gYS9tc204OTc0L3V0aWxzL21zZ19xLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMzYgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDExLTIwMTIsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCi0gKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKLSAqICAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24sIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCi0gKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKLSAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCi0gKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCi0gKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSAibXNnX3EuaCIKLQotI2RlZmluZSBMT0dfVEFHICJMb2NTdmNfdXRpbHNfcSIKLSNpbmNsdWRlICJsb2dfdXRpbC5oIgotI2luY2x1ZGUgInBsYXRmb3JtX2xpYl9pbmNsdWRlcy5oIgotI2luY2x1ZGUgImxpbmtlZF9saXN0LmgiCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxwdGhyZWFkLmg+Ci0KLXR5cGVkZWYgc3RydWN0IG1zZ19xIHsKLSAgIHZvaWQqIG1zZ19saXN0OyAgICAgICAgICAgICAgICAgIC8qIExpbmtlZCBsaXN0IHRvIHN0b3JlIGluZm9ybWF0aW9uICovCi0gICBwdGhyZWFkX2NvbmRfdCAgbGlzdF9jb25kOyAgICAgICAvKiBDb25kaXRpb24gdmFyaWFibGUgZm9yIHdhaXRpbmcgb24gbXNnIHF1ZXVlICovCi0gICBwdGhyZWFkX211dGV4X3QgbGlzdF9tdXRleDsgICAgICAvKiBNdXRleCBmb3IgZXhjbHVzaXZlIGFjY2VzcyB0byBtZXNzYWdlIHF1ZXVlICovCi0gICBpbnQgdW5ibG9ja2VkOyAgICAgICAgICAgICAgICAgICAvKiBIYXMgdGhpcyBtZXNzYWdlIHF1ZXVlIGJlZW4gdW5ibG9ja2VkPyAqLwotfSBtc2dfcTsKLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLUZVTkNUSU9OICAgIGNvbnZlcnRfbGlua2VkX2xpc3RfZXJyX3R5cGUKLQotREVTQ1JJUFRJT04KLSAgIENvbnZlcnRzIGZyb20gb25lIHNldCBvZiBlbnVtIHZhbHVlcyB0byBhbm90aGVyLgotCi0gICBsaW5rZWRfbGlzdF92YWw6IFZhbHVlIHRvIGNvbnZlcnQgdG8gbXNnX3FfZW51bV90eXBlCi0KLURFUEVOREVOQ0lFUwotICAgTi9BCi0KLVJFVFVSTiBWQUxVRQotICAgQ29ycmVzcG9uZGluZyBsaW5rZWRfbGlzdF9lbnVtX3R5cGUgaW4gbXNnX3FfZW51bV90eXBlCi0KLVNJREUgRUZGRUNUUwotICAgTi9BCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi1zdGF0aWMgbXNxX3FfZXJyX3R5cGUgY29udmVydF9saW5rZWRfbGlzdF9lcnJfdHlwZShsaW5rZWRfbGlzdF9lcnJfdHlwZSBsaW5rZWRfbGlzdF92YWwpCi17Ci0gICBzd2l0Y2goIGxpbmtlZF9saXN0X3ZhbCApCi0gICB7Ci0gICBjYXNlIGVMSU5LRURfTElTVF9TVUNDRVNTOgotICAgICAgcmV0dXJuIGVNU0dfUV9TVUNDRVNTOwotICAgY2FzZSBlTElOS0VEX0xJU1RfSU5WQUxJRF9QQVJBTUVURVI6Ci0gICAgICByZXR1cm4gZU1TR19RX0lOVkFMSURfUEFSQU1FVEVSOwotICAgY2FzZSBlTElOS0VEX0xJU1RfSU5WQUxJRF9IQU5ETEU6Ci0gICAgICByZXR1cm4gZU1TR19RX0lOVkFMSURfSEFORExFOwotICAgY2FzZSBlTElOS0VEX0xJU1RfVU5BVkFJTEFCTEVfUkVTT1VSQ0U6Ci0gICAgICByZXR1cm4gZU1TR19RX1VOQVZBSUxBQkxFX1JFU09VUkNFOwotICAgY2FzZSBlTElOS0VEX0xJU1RfSU5TVUZGSUNJRU5UX0JVRkZFUjoKLSAgICAgIHJldHVybiBlTVNHX1FfSU5TVUZGSUNJRU5UX0JVRkZFUjsKLQotICAgY2FzZSBlTElOS0VEX0xJU1RfRkFJTFVSRV9HRU5FUkFMOgotICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBlTVNHX1FfRkFJTFVSRV9HRU5FUkFMOwotICAgfQotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBFTkQgSU5URVJOQUwgRlVOQ1RJT05TIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICBGVU5DVElPTjogICBtc2dfcV9pbml0Ci0KLSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLW1zcV9xX2Vycl90eXBlIG1zZ19xX2luaXQodm9pZCoqIG1zZ19xX2RhdGEpCi17Ci0gICBpZiggbXNnX3FfZGF0YSA9PSBOVUxMICkKLSAgIHsKLSAgICAgIExPQ19MT0dFKCIlczogSW52YWxpZCBtc2dfcV9kYXRhIHBhcmFtZXRlciFcbiIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICByZXR1cm4gZU1TR19RX0lOVkFMSURfUEFSQU1FVEVSOwotICAgfQotCi0gICBtc2dfcSogdG1wX21zZ19xOwotICAgdG1wX21zZ19xID0gKG1zZ19xKiljYWxsb2MoMSwgc2l6ZW9mKG1zZ19xKSk7Ci0gICBpZiggdG1wX21zZ19xID09IE5VTEwgKQotICAgewotICAgICAgTE9DX0xPR0UoIiVzOiBVbmFibGUgdG8gYWxsb2NhdGUgc3BhY2UgZm9yIG1lc3NhZ2UgcXVldWUhXG4iLCBfX0ZVTkNUSU9OX18pOwotICAgICAgcmV0dXJuIGVNU0dfUV9GQUlMVVJFX0dFTkVSQUw7Ci0gICB9Ci0KLSAgIGlmKCBsaW5rZWRfbGlzdF9pbml0KCZ0bXBfbXNnX3EtPm1zZ19saXN0KSAhPSAwICkKLSAgIHsKLSAgICAgIExPQ19MT0dFKCIlczogVW5hYmxlIHRvIGluaXRpYWxpemUgc3RvcmFnZSBsaXN0IVxuIiwgX19GVU5DVElPTl9fKTsKLSAgICAgIGZyZWUodG1wX21zZ19xKTsKLSAgICAgIHJldHVybiBlTVNHX1FfRkFJTFVSRV9HRU5FUkFMOwotICAgfQotCi0gICBpZiggcHRocmVhZF9tdXRleF9pbml0KCZ0bXBfbXNnX3EtPmxpc3RfbXV0ZXgsIE5VTEwpICE9IDAgKQotICAgewotICAgICAgTE9DX0xPR0UoIiVzOiBVbmFibGUgdG8gaW5pdGlhbGl6ZSBsaXN0IG11dGV4IVxuIiwgX19GVU5DVElPTl9fKTsKLSAgICAgIGxpbmtlZF9saXN0X2Rlc3Ryb3koJnRtcF9tc2dfcS0+bXNnX2xpc3QpOwotICAgICAgZnJlZSh0bXBfbXNnX3EpOwotICAgICAgcmV0dXJuIGVNU0dfUV9GQUlMVVJFX0dFTkVSQUw7Ci0gICB9Ci0KLSAgIGlmKCBwdGhyZWFkX2NvbmRfaW5pdCgmdG1wX21zZ19xLT5saXN0X2NvbmQsIE5VTEwpICE9IDAgKQotICAgewotICAgICAgTE9DX0xPR0UoIiVzOiBVbmFibGUgdG8gaW5pdGlhbGl6ZSBtc2cgcSBjb25kIHZhciFcbiIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICBsaW5rZWRfbGlzdF9kZXN0cm95KCZ0bXBfbXNnX3EtPm1zZ19saXN0KTsKLSAgICAgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmdG1wX21zZ19xLT5saXN0X211dGV4KTsKLSAgICAgIGZyZWUodG1wX21zZ19xKTsKLSAgICAgIHJldHVybiBlTVNHX1FfRkFJTFVSRV9HRU5FUkFMOwotICAgfQotCi0gICB0bXBfbXNnX3EtPnVuYmxvY2tlZCA9IDA7Ci0KLSAgICptc2dfcV9kYXRhID0gdG1wX21zZ19xOwotCi0gICByZXR1cm4gZU1TR19RX1NVQ0NFU1M7Ci19Ci0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgRlVOQ1RJT046ICAgbXNnX3FfaW5pdDIKLQotICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotY29uc3Qgdm9pZCogbXNnX3FfaW5pdDIoKQotewotICB2b2lkKiBxID0gTlVMTDsKLSAgaWYgKGVNU0dfUV9TVUNDRVNTICE9IG1zZ19xX2luaXQoJnEpKSB7Ci0gICAgcSA9IE5VTEw7Ci0gIH0KLSAgcmV0dXJuIHE7Ci19Ci0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgRlVOQ1RJT046ICAgbXNnX3FfZGVzdHJveQotCi0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi1tc3FfcV9lcnJfdHlwZSBtc2dfcV9kZXN0cm95KHZvaWQqKiBtc2dfcV9kYXRhKQotewotICAgaWYoIG1zZ19xX2RhdGEgPT0gTlVMTCApCi0gICB7Ci0gICAgICBMT0NfTE9HRSgiJXM6IEludmFsaWQgbXNnX3FfZGF0YSBwYXJhbWV0ZXIhXG4iLCBfX0ZVTkNUSU9OX18pOwotICAgICAgcmV0dXJuIGVNU0dfUV9JTlZBTElEX0hBTkRMRTsKLSAgIH0KLQotICAgbXNnX3EqIHBfbXNnX3EgPSAobXNnX3EqKSptc2dfcV9kYXRhOwotCi0gICBsaW5rZWRfbGlzdF9kZXN0cm95KCZwX21zZ19xLT5tc2dfbGlzdCk7Ci0gICBwdGhyZWFkX211dGV4X2Rlc3Ryb3koJnBfbXNnX3EtPmxpc3RfbXV0ZXgpOwotICAgcHRocmVhZF9jb25kX2Rlc3Ryb3koJnBfbXNnX3EtPmxpc3RfY29uZCk7Ci0KLSAgIHBfbXNnX3EtPnVuYmxvY2tlZCA9IDA7Ci0KLSAgIGZyZWUoKm1zZ19xX2RhdGEpOwotICAgKm1zZ19xX2RhdGEgPSBOVUxMOwotCi0gICByZXR1cm4gZU1TR19RX1NVQ0NFU1M7Ci19Ci0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgRlVOQ1RJT046ICAgbXNnX3Ffc25kCi0KLSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLW1zcV9xX2Vycl90eXBlIG1zZ19xX3NuZCh2b2lkKiBtc2dfcV9kYXRhLCB2b2lkKiBtc2dfb2JqLCB2b2lkICgqZGVhbGxvYykodm9pZCopKQotewotICAgbXNxX3FfZXJyX3R5cGUgcnY7Ci0gICBpZiggbXNnX3FfZGF0YSA9PSBOVUxMICkKLSAgIHsKLSAgICAgIExPQ19MT0dFKCIlczogSW52YWxpZCBtc2dfcV9kYXRhIHBhcmFtZXRlciFcbiIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICByZXR1cm4gZU1TR19RX0lOVkFMSURfSEFORExFOwotICAgfQotICAgaWYoIG1zZ19vYmogPT0gTlVMTCApCi0gICB7Ci0gICAgICBMT0NfTE9HRSgiJXM6IEludmFsaWQgbXNnX29iaiBwYXJhbWV0ZXIhXG4iLCBfX0ZVTkNUSU9OX18pOwotICAgICAgcmV0dXJuIGVNU0dfUV9JTlZBTElEX1BBUkFNRVRFUjsKLSAgIH0KLQotICAgbXNnX3EqIHBfbXNnX3EgPSAobXNnX3EqKW1zZ19xX2RhdGE7Ci0KLSAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmcF9tc2dfcS0+bGlzdF9tdXRleCk7Ci0gICBMT0NfTE9HRCgiJXM6IFNlbmRpbmcgbWVzc2FnZSB3aXRoIGhhbmRsZSA9IDB4JXBcbiIsIF9fRlVOQ1RJT05fXywgbXNnX29iaik7Ci0KLSAgIGlmKCBwX21zZ19xLT51bmJsb2NrZWQgKQotICAgewotICAgICAgTE9DX0xPR0UoIiVzOiBNZXNzYWdlIHF1ZXVlIGhhcyBiZWVuIHVuYmxvY2tlZC5cbiIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmcF9tc2dfcS0+bGlzdF9tdXRleCk7Ci0gICAgICByZXR1cm4gZU1TR19RX1VOQVZBSUxBQkxFX1JFU09VUkNFOwotICAgfQotCi0gICBydiA9IGNvbnZlcnRfbGlua2VkX2xpc3RfZXJyX3R5cGUobGlua2VkX2xpc3RfYWRkKHBfbXNnX3EtPm1zZ19saXN0LCBtc2dfb2JqLCBkZWFsbG9jKSk7Ci0KLSAgIC8qIFNob3cgZGF0YSBpcyBpbiB0aGUgbWVzc2FnZSBxdWV1ZS4gKi8KLSAgIHB0aHJlYWRfY29uZF9zaWduYWwoJnBfbXNnX3EtPmxpc3RfY29uZCk7Ci0KLSAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZwX21zZ19xLT5saXN0X211dGV4KTsKLQotICAgTE9DX0xPR0QoIiVzOiBGaW5pc2hlZCBTZW5kaW5nIG1lc3NhZ2Ugd2l0aCBoYW5kbGUgPSAweCVwXG4iLCBfX0ZVTkNUSU9OX18sIG1zZ19vYmopOwotCi0gICByZXR1cm4gcnY7Ci19Ci0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgRlVOQ1RJT046ICAgbXNnX3FfcmN2Ci0KLSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLW1zcV9xX2Vycl90eXBlIG1zZ19xX3Jjdih2b2lkKiBtc2dfcV9kYXRhLCB2b2lkKiogbXNnX29iaikKLXsKLSAgIG1zcV9xX2Vycl90eXBlIHJ2OwotICAgaWYoIG1zZ19xX2RhdGEgPT0gTlVMTCApCi0gICB7Ci0gICAgICBMT0NfTE9HRSgiJXM6IEludmFsaWQgbXNnX3FfZGF0YSBwYXJhbWV0ZXIhXG4iLCBfX0ZVTkNUSU9OX18pOwotICAgICAgcmV0dXJuIGVNU0dfUV9JTlZBTElEX0hBTkRMRTsKLSAgIH0KLQotICAgaWYoIG1zZ19vYmogPT0gTlVMTCApCi0gICB7Ci0gICAgICBMT0NfTE9HRSgiJXM6IEludmFsaWQgbXNnX29iaiBwYXJhbWV0ZXIhXG4iLCBfX0ZVTkNUSU9OX18pOwotICAgICAgcmV0dXJuIGVNU0dfUV9JTlZBTElEX1BBUkFNRVRFUjsKLSAgIH0KLQotICAgbXNnX3EqIHBfbXNnX3EgPSAobXNnX3EqKW1zZ19xX2RhdGE7Ci0KLSAgIExPQ19MT0dEKCIlczogV2FpdGluZyBvbiBtZXNzYWdlXG4iLCBfX0ZVTkNUSU9OX18pOwotCi0gICBwdGhyZWFkX211dGV4X2xvY2soJnBfbXNnX3EtPmxpc3RfbXV0ZXgpOwotCi0gICBpZiggcF9tc2dfcS0+dW5ibG9ja2VkICkKLSAgIHsKLSAgICAgIExPQ19MT0dFKCIlczogTWVzc2FnZSBxdWV1ZSBoYXMgYmVlbiB1bmJsb2NrZWQuXG4iLCBfX0ZVTkNUSU9OX18pOwotICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJnBfbXNnX3EtPmxpc3RfbXV0ZXgpOwotICAgICAgcmV0dXJuIGVNU0dfUV9VTkFWQUlMQUJMRV9SRVNPVVJDRTsKLSAgIH0KLQotICAgLyogV2FpdCBmb3IgZGF0YSBpbiB0aGUgbWVzc2FnZSBxdWV1ZSAqLwotICAgd2hpbGUoIGxpbmtlZF9saXN0X2VtcHR5KHBfbXNnX3EtPm1zZ19saXN0KSAmJiAhcF9tc2dfcS0+dW5ibG9ja2VkICkKLSAgIHsKLSAgICAgIHB0aHJlYWRfY29uZF93YWl0KCZwX21zZ19xLT5saXN0X2NvbmQsICZwX21zZ19xLT5saXN0X211dGV4KTsKLSAgIH0KLQotICAgcnYgPSBjb252ZXJ0X2xpbmtlZF9saXN0X2Vycl90eXBlKGxpbmtlZF9saXN0X3JlbW92ZShwX21zZ19xLT5tc2dfbGlzdCwgbXNnX29iaikpOwotCi0gICBwdGhyZWFkX211dGV4X3VubG9jaygmcF9tc2dfcS0+bGlzdF9tdXRleCk7Ci0KLSAgIExPQ19MT0dEKCIlczogUmVjZWl2ZWQgbWVzc2FnZSAweCVwIHJ2ID0gJWRcbiIsIF9fRlVOQ1RJT05fXywgKm1zZ19vYmosIHJ2KTsKLQotICAgcmV0dXJuIHJ2OwotfQotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gIEZVTkNUSU9OOiAgIG1zZ19xX2ZsdXNoCi0KLSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLW1zcV9xX2Vycl90eXBlIG1zZ19xX2ZsdXNoKHZvaWQqIG1zZ19xX2RhdGEpCi17Ci0gICBtc3FfcV9lcnJfdHlwZSBydjsKLSAgIGlmICggbXNnX3FfZGF0YSA9PSBOVUxMICkKLSAgIHsKLSAgICAgIExPQ19MT0dFKCIlczogSW52YWxpZCBtc2dfcV9kYXRhIHBhcmFtZXRlciFcbiIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICByZXR1cm4gZU1TR19RX0lOVkFMSURfSEFORExFOwotICAgfQotCi0gICBtc2dfcSogcF9tc2dfcSA9IChtc2dfcSopbXNnX3FfZGF0YTsKLQotICAgTE9DX0xPR0QoIiVzOiBGbHVzaGluZyBNZXNzYWdlIFF1ZXVlXG4iLCBfX0ZVTkNUSU9OX18pOwotCi0gICBwdGhyZWFkX211dGV4X2xvY2soJnBfbXNnX3EtPmxpc3RfbXV0ZXgpOwotCi0gICAvKiBSZW1vdmUgYWxsIGVsZW1lbnRzIGZyb20gdGhlIGxpc3QgKi8KLSAgIHJ2ID0gY29udmVydF9saW5rZWRfbGlzdF9lcnJfdHlwZShsaW5rZWRfbGlzdF9mbHVzaChwX21zZ19xLT5tc2dfbGlzdCkpOwotCi0gICBwdGhyZWFkX211dGV4X3VubG9jaygmcF9tc2dfcS0+bGlzdF9tdXRleCk7Ci0KLSAgIExPQ19MT0dEKCIlczogTWVzc2FnZSBRdWV1ZSBmbHVzaGVkXG4iLCBfX0ZVTkNUSU9OX18pOwotCi0gICByZXR1cm4gcnY7Ci19Ci0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgRlVOQ1RJT046ICAgbXNnX3FfdW5ibG9jawotCi0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi1tc3FfcV9lcnJfdHlwZSBtc2dfcV91bmJsb2NrKHZvaWQqIG1zZ19xX2RhdGEpCi17Ci0gICBpZiAoIG1zZ19xX2RhdGEgPT0gTlVMTCApCi0gICB7Ci0gICAgICBMT0NfTE9HRSgiJXM6IEludmFsaWQgbXNnX3FfZGF0YSBwYXJhbWV0ZXIhXG4iLCBfX0ZVTkNUSU9OX18pOwotICAgICAgcmV0dXJuIGVNU0dfUV9JTlZBTElEX0hBTkRMRTsKLSAgIH0KLQotICAgbXNnX3EqIHBfbXNnX3EgPSAobXNnX3EqKW1zZ19xX2RhdGE7Ci0gICBwdGhyZWFkX211dGV4X2xvY2soJnBfbXNnX3EtPmxpc3RfbXV0ZXgpOwotCi0gICBpZiggcF9tc2dfcS0+dW5ibG9ja2VkICkKLSAgIHsKLSAgICAgIExPQ19MT0dFKCIlczogTWVzc2FnZSBxdWV1ZSBoYXMgYmVlbiB1bmJsb2NrZWQuXG4iLCBfX0ZVTkNUSU9OX18pOwotICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJnBfbXNnX3EtPmxpc3RfbXV0ZXgpOwotICAgICAgcmV0dXJuIGVNU0dfUV9VTkFWQUlMQUJMRV9SRVNPVVJDRTsKLSAgIH0KLQotICAgTE9DX0xPR0QoIiVzOiBVbmJsb2NraW5nIE1lc3NhZ2UgUXVldWVcbiIsIF9fRlVOQ1RJT05fXyk7Ci0gICAvKiBVbmJsb2NraW5nIG1lc3NhZ2UgcXVldWUgKi8KLSAgIHBfbXNnX3EtPnVuYmxvY2tlZCA9IDE7Ci0KLSAgIC8qIEFsbG93IGFsbCB0aGUgd2FpdGVycyB0byB3YWtlIHVwICovCi0gICBwdGhyZWFkX2NvbmRfYnJvYWRjYXN0KCZwX21zZ19xLT5saXN0X2NvbmQpOwotCi0gICBwdGhyZWFkX211dGV4X3VubG9jaygmcF9tc2dfcS0+bGlzdF9tdXRleCk7Ci0KLSAgIExPQ19MT0dEKCIlczogTWVzc2FnZSBRdWV1ZSB1bmJsb2NrZWRcbiIsIF9fRlVOQ1RJT05fXyk7Ci0KLSAgIHJldHVybiBlTVNHX1FfU1VDQ0VTUzsKLX0KZGlmZiAtLWdpdCBhL21zbTg5NzQvdXRpbHMvbXNnX3EuaCBiL21zbTg5NzQvdXRpbHMvbXNnX3EuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDUzYjhjZS4uMDAwMDAwMAotLS0gYS9tc204OTc0L3V0aWxzL21zZ19xLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMDcgKzAsMCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDExLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZwotICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCi0gKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCi0gKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKLSAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCi0gKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCi0gKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaWZuZGVmIF9fTVNHX1FfSF9fCi0jZGVmaW5lIF9fTVNHX1FfSF9fCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi0vKiogTGlua2VkIExpc3QgUmV0dXJuIENvZGVzICovCi10eXBlZGVmIGVudW0KLXsKLSAgZU1TR19RX1NVQ0NFU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKLSAgICAgLyoqPCBSZXF1ZXN0IHdhcyBzdWNjZXNzZnVsLiAqLwotICBlTVNHX1FfRkFJTFVSRV9HRU5FUkFMICAgICAgICAgICAgICAgICAgICAgPSAtMSwKLSAgICAgLyoqPCBGYWlsZWQgYmVjYXVzZSBvZiBhIGdlbmVyYWwgZmFpbHVyZS4gKi8KLSAgZU1TR19RX0lOVkFMSURfUEFSQU1FVEVSICAgICAgICAgICAgICAgICAgID0gLTIsCi0gICAgIC8qKjwgRmFpbGVkIGJlY2F1c2UgdGhlIHJlcXVlc3QgY29udGFpbmVkIGludmFsaWQgcGFyYW1ldGVycy4gKi8KLSAgZU1TR19RX0lOVkFMSURfSEFORExFICAgICAgICAgICAgICAgICAgICAgID0gLTMsCi0gICAgIC8qKjwgRmFpbGVkIGJlY2F1c2UgYW4gaW52YWxpZCBoYW5kbGUgd2FzIHNwZWNpZmllZC4gKi8KLSAgZU1TR19RX1VOQVZBSUxBQkxFX1JFU09VUkNFICAgICAgICAgICAgICAgID0gLTQsCi0gICAgIC8qKjwgRmFpbGVkIGJlY2F1c2UgYW4gdGhlcmUgd2VyZSBub3QgZW5vdWdoIHJlc291cmNlcy4gKi8KLSAgZU1TR19RX0lOU1VGRklDSUVOVF9CVUZGRVIgICAgICAgICAgICAgICAgID0gLTUsCi0gICAgIC8qKjwgRmFpbGVkIGJlY2F1c2UgYW4gdGhlIHN1cHBsaWVkIGJ1ZmZlciB3YXMgdG9vIHNtYWxsLiAqLwotfW1zcV9xX2Vycl90eXBlOwotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotRlVOQ1RJT04gICAgbXNnX3FfaW5pdAotCi1ERVNDUklQVElPTgotICAgSW5pdGlhbGl6ZXMgaW50ZXJuYWwgc3RydWN0dXJlcyBmb3IgbWVzc2FnZSBxdWV1ZS4KLQotICAgbXNnX3FfZGF0YTogcG9pbnRlciB0byBhbiBvcGFxdWUgUSBoYW5kbGUgdG8gYmUgcmV0dXJuZWQ7IE5VTEwgaWYgZmFpbHMKLQotREVQRU5ERU5DSUVTCi0gICBOL0EKLQotUkVUVVJOIFZBTFVFCi0gICBMb29rIGF0IGVycm9yIGNvZGVzIGFib3ZlLgotCi1TSURFIEVGRkVDVFMKLSAgIE4vQQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotbXNxX3FfZXJyX3R5cGUgbXNnX3FfaW5pdCh2b2lkKiogbXNnX3FfZGF0YSk7Ci0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1GVU5DVElPTiAgICBtc2dfcV9pbml0MgotCi1ERVNDUklQVElPTgotICAgSW5pdGlhbGl6ZXMgaW50ZXJuYWwgc3RydWN0dXJlcyBmb3IgbWVzc2FnZSBxdWV1ZS4KLQotREVQRU5ERU5DSUVTCi0gICBOL0EKLQotUkVUVVJOIFZBTFVFCi0gICBvcGFxdWUgaGFuZGxlIHRvIHRoZSBRIGNyZWF0ZWQ7IE5VTEwgaWYgY3JlYXRlIGZhaWxzCi0KLVNJREUgRUZGRUNUUwotICAgTi9BCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi1jb25zdCB2b2lkKiBtc2dfcV9pbml0MigpOwotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotRlVOQ1RJT04gICAgbXNnX3FfZGVzdHJveQotCi1ERVNDUklQVElPTgotICAgUmVsZWFzZXMgaW50ZXJuYWwgc3RydWN0dXJlcyBmb3IgbWVzc2FnZSBxdWV1ZS4KLQotICAgbXNnX3FfZGF0YTogU3RhdGUgb2YgbWVzc2FnZSBxdWV1ZSB0byBiZSByZWxlYXNlZC4KLQotREVQRU5ERU5DSUVTCi0gICBOL0EKLQotUkVUVVJOIFZBTFVFCi0gICBMb29rIGF0IGVycm9yIGNvZGVzIGFib3ZlLgotCi1TSURFIEVGRkVDVFMKLSAgIE4vQQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotbXNxX3FfZXJyX3R5cGUgbXNnX3FfZGVzdHJveSh2b2lkKiogbXNnX3FfZGF0YSk7Ci0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1GVU5DVElPTiAgICBtc2dfcV9zbmQKLQotREVTQ1JJUFRJT04KLSAgIFNlbmRzIGRhdGEgdG8gdGhlIG1lc3NhZ2UgcXVldWUuIFRoZSBwYXNzZWQgaW4gZGF0YSBwb2ludGVyCi0gICBpcyBub3QgbW9kaWZpZWQgb3IgZnJlZWQuIFBhc3NlZCBpbiBtc2dfb2JqIGlzIGV4cGVjdGVkIHRvIGxpdmUgdGhyb3VnaG91dAotICAgdGhlIHVzZSBvZiB0aGUgbXNnX3EgKGkuZS4gZGF0YSBpcyBub3QgYWxsb2NhdGVkIGludGVybmFsbHkpCi0KLSAgIG1zZ19xX2RhdGE6IE1lc3NhZ2UgUXVldWUgdG8gYWRkIHRoZSBlbGVtZW50IHRvLgotICAgbXNncDogICAgICAgUG9pbnRlciB0byBkYXRhIHRvIGFkZCBpbnRvIG1lc3NhZ2UgcXVldWUuCi0gICBkZWFsbG9jOiAgICBGdW5jdGlvbiB1c2VkIHRvIGRlYWxsb2NhdGUgbWVtb3J5IGZvciB0aGlzIGVsZW1lbnQuIFBhc3MgTlVMTAotICAgICAgICAgICAgICAgaWYgeW91IGRvIG5vdCB3YW50IGRhdGEgZGVhbGxvY2F0ZWQgZHVyaW5nIGEgZmx1c2ggb3BlcmF0aW9uCi0KLURFUEVOREVOQ0lFUwotICAgTi9BCi0KLVJFVFVSTiBWQUxVRQotICAgTG9vayBhdCBlcnJvciBjb2RlcyBhYm92ZS4KLQotU0lERSBFRkZFQ1RTCi0gICBOL0EKLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLW1zcV9xX2Vycl90eXBlIG1zZ19xX3NuZCh2b2lkKiBtc2dfcV9kYXRhLCB2b2lkKiBtc2dfb2JqLCB2b2lkICgqZGVhbGxvYykodm9pZCopKTsKLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLUZVTkNUSU9OICAgIG1zZ19xX3JjdgotCi1ERVNDUklQVElPTgotICAgUmV0cmlldmVzIGRhdGEgZnJvbSB0aGUgbWVzc2FnZSBxdWV1ZS4gbXNnX29iaiBpcyB0aGUgb2xkZXN0IG1lc3NhZ2UgcmVjZWl2ZWQKLSAgIGFuZCBwb2ludGVyIGlzIHNpbXBseSByZW1vdmVkIGZyb20gbWVzc2FnZSBxdWV1ZS4KLQotICAgbXNnX3FfZGF0YTogTWVzc2FnZSBRdWV1ZSB0byBjb3B5IGRhdGEgZnJvbSBpbnRvIG1zZ3AuCi0gICBtc2dfb2JqOiAgICBQb2ludGVyIHRvIHNwYWNlIHRvIGNvcHkgbXNnX3EgY29udGVudHMgdG8uCi0KLURFUEVOREVOQ0lFUwotICAgTi9BCi0KLVJFVFVSTiBWQUxVRQotICAgTG9vayBhdCBlcnJvciBjb2RlcyBhYm92ZS4KLQotU0lERSBFRkZFQ1RTCi0gICBOL0EKLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLW1zcV9xX2Vycl90eXBlIG1zZ19xX3Jjdih2b2lkKiBtc2dfcV9kYXRhLCB2b2lkKiogbXNnX29iaik7Ci0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1GVU5DVElPTiAgICBtc2dfcV9mbHVzaAotCi1ERVNDUklQVElPTgotICAgRnVuY3Rpb24gcmVtb3ZlcyBhbGwgZWxlbWVudHMgZnJvbSB0aGUgbWVzc2FnZSBxdWV1ZS4KLQotICAgbXNnX3FfZGF0YTogTWVzc2FnZSBRdWV1ZSB0byByZW1vdmUgZWxlbWVudHMgZnJvbS4KLQotREVQRU5ERU5DSUVTCi0gICBOL0EKLQotUkVUVVJOIFZBTFVFCi0gICBMb29rIGF0IGVycm9yIGNvZGVzIGFib3ZlLgotCi1TSURFIEVGRkVDVFMKLSAgIE4vQQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotbXNxX3FfZXJyX3R5cGUgbXNnX3FfZmx1c2godm9pZCogbXNnX3FfZGF0YSk7Ci0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1GVU5DVElPTiAgICBtc2dfcV91bmJsb2NrCi0KLURFU0NSSVBUSU9OCi0gICBUaGlzIGZ1bmN0aW9uIHdpbGwgc3RvcCB1c2Ugb2YgdGhlIG1lc3NhZ2UgcXVldWUuIEFsbCB3YWl0ZXJzIHdpbGwgd2FrZSB1cAotICAgYW5kIGxpa2VseSByZWNlaXZlIG5vdGhpbmcgZnJvbSB0aGUgcXVldWUgcmVzdWx0aW5nIGluIGEgbmVnYXRpdmUgcmV0dXJuCi0gICB2YWx1ZS4gVGhlIG1lc3NhZ2UgcXVldWUgY2FuIG5vIGxvbmdlciBiZSB1c2VkIHVudGlsIGl0IGlzIGRlc3Ryb3llZAotICAgYW5kIGluaXRpYWxpemVkIGFnYWluIGFmdGVyIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KLQotICAgbXNnX3FfZGF0YTogTWVzc2FnZSBxdWV1ZSB0byB1bmJsb2NrLgotCi1ERVBFTkRFTkNJRVMKLSAgIE4vQQotCi1SRVRVUk4gVkFMVUUKLSAgIExvb2sgYXQgZXJyb3IgY29kZXMgYWJvdmUuCi0KLVNJREUgRUZGRUNUUwotICAgTi9BCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi1tc3FfcV9lcnJfdHlwZSBtc2dfcV91bmJsb2NrKHZvaWQqIG1zZ19xX2RhdGEpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jZW5kaWYgLyogX19NU0dfUV9IX18gKi8K