Name: series-workflowpkk4z Phase: Running StartedAt: 2026-07-11 01:50:44 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflowpkk4z[0] Phase: Running StartedAt: 2026-07-11 01:50:44 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflowpkk4z[0].run-triage Phase: Running StartedAt: 2026-07-11 01:50:44 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflowpkk4z[0].run-triage(0) Phase: Running StartedAt: 2026-07-11 01:50:44 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "AI determined the patch has no functional impact", "targets": null, "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzExIDAyOjA1PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBudWxsLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGFkZHMga1RMUyBvZmZsb2FkIHN1cHBvcnQgdG8gdGhlIEJyb2FkY29tIE5ldFh0cmVtZS1DL0UgKGJueHQpIEV0aGVybmV0IGRyaXZlci4gU2luY2UgdGhpcyBpcyBhIGhhcmR3YXJlLXNwZWNpZmljIFBDSSBkcml2ZXIgdGhhdCByZXF1aXJlcyBjb21wbGV4IGZpcm13YXJlIChIV1JNKSBpbnRlcmFjdGlvbnMgdG8gaW5pdGlhbGl6ZSBhbmQgYnJpbmcgdXAgdGhlIG5ldHdvcmsgZGV2aWNlLCBpdCBpcyBpbXBvc3NpYmxlIHRvIHJlYWNoIHRoZSBtb2RpZmllZCBkYXRhIHBhdGggYW5kIFRMUyBvZmZsb2FkIGxvZ2ljIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyB3aXRob3V0IGEgZGVkaWNhdGVkIHNvZnR3YXJlIGVtdWxhdG9yLiBUaGVyZWZvcmUsIHRoaXMgY29kZSBjYW5ub3QgYmUgbWVhbmluZ2Z1bGx5IGZ1enplZC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MS8xPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTEgMDI6MDU8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPnJlYWQtcGF0Y2gtZGlmZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1BhdGNoRGlmZiYjMzQ7OiAmIzM0O2NvbW1pdCBlYTgyM2Y1MTVhZThjZTM4MDVhZGIyMWMzMjk2OWM5MWJjNzMyNTAyXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFNhdCBKdWwgMTEgMDI6MDU6NTQgMjAyNiAmIzQzOzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vS2NvbmZpZyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL0tjb25maWdcbmluZGV4IGYwYmFjMGRkMTQzOTAwLi5iMzNiNjZmMDM4Yjg4MiAxMDA2NDRcbi0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL0tjb25maWdcbiYjNDM7JiM0MzsmIzQzOyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL0tjb25maWdcbkBAIC0yNTUsNiAmIzQzOzI1NSwxNSBAQCBjb25maWcgQk5YVF9IV01PTlxuIFx0ICBTYXkgWSBpZiB5b3Ugd2FudCB0byBleHBvc2UgdGhlIHRoZXJtYWwgc2Vuc29yIGRhdGEgb24gTmV0WHRyZW1lLUMvRVxuIFx0ICBkZXZpY2VzLCB2aWEgdGhlIGh3bW9uIHN5c2ZzIGludGVyZmFjZS5cbiBcbiYjNDM7Y29uZmlnIEJOWFRfVExTXG4mIzQzO1x0Ym9vbCBcJiMzNDtCcm9hZGNvbSBOZXRYdHJlbWUtQy9FIFRMUyBvZmZsb2FkIHN1cHBvcnRcJiMzNDtcbiYjNDM7XHRkZWZhdWx0IHlcbiYjNDM7XHRkZXBlbmRzIG9uIEJOWFQgXHUwMDI2XHUwMDI2IFRMU19ERVZJQ0VcbiYjNDM7XHRkZXBlbmRzIG9uIFRMUz15IHx8IEJOWFQ9bVxuJiM0MztcdGhlbHBcbiYjNDM7XHQgIFNheSBZIGlmIHlvdSB3YW50IHRvIGVuYWJsZSBUcmFuc3BvcnQgTGF5ZXIgU2VjdXJpdHkgKFRMUykgaGFyZHdhcmVcbiYjNDM7XHQgIGVuY3J5cHRpb24gYW5kIGRlY3J5cHRpb24gb2ZmbG9hZCBvbiBzdXBwb3J0ZWQgTmV0WHRyZW1lLUMvRSBkZXZpY2VzLlxuJiM0MztcbiBjb25maWcgQk5HRVxuIFx0dHJpc3RhdGUgXCYjMzQ7QnJvYWRjb20gVGhvclVsdHJhIEV0aGVybmV0IGRldmljZSBzdXBwb3J0XCYjMzQ7XG4gXHRkZXBlbmRzIG9uIFBDSVxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvTWFrZWZpbGUgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibnh0L01ha2VmaWxlXG5pbmRleCBkZWJlZjc4YzhiNmQ2NC4uODhlNjgyNDhhYWQ0MjAgMTAwNjQ0XG4tLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibnh0L01ha2VmaWxlXG4mIzQzOyYjNDM7JiM0MzsgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibnh0L01ha2VmaWxlXG5AQCAtNSwzICYjNDM7NSw0IEBAIGJueHRfZW4teSA6PSBibnh0Lm8gYm54dF9od3JtLm8gYm54dF9zcmlvdi5vIGJueHRfZXRodG9vbC5vIGJueHRfZGNiLm8gYm54dF91bHAuXG4gYm54dF9lbi0kKENPTkZJR19CTlhUX0ZMT1dFUl9PRkZMT0FEKSAmIzQzOz0gYm54dF90Yy5vXG4gYm54dF9lbi0kKENPTkZJR19ERUJVR19GUykgJiM0Mzs9IGJueHRfZGVidWdmcy5vXG4gYm54dF9lbi0kKENPTkZJR19CTlhUX0hXTU9OKSAmIzQzOz0gYm54dF9od21vbi5vXG4mIzQzO2JueHRfZW4tJChDT05GSUdfQk5YVF9UTFMpICYjNDM7PSBibnh0X21wYy5vIGJueHRfY3J5cHRvLm8gYm54dF9rdGxzLm9cbmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibnh0L2JueHQuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dC5jXG5pbmRleCA3NTEzNjE4NzkzZGFmMy4uZjA4NGMxOWZmZGRkOGYgMTAwNjQ0XG4tLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibnh0L2JueHQuY1xuJiM0MzsmIzQzOyYjNDM7IGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9ibnh0LmNcbkBAIC03Niw2ICYjNDM7NzYsOSBAQFxuICNpbmNsdWRlIFwmIzM0O2JueHRfaHdtb24uaFwmIzM0O1xuICNpbmNsdWRlIFwmIzM0O2JueHRfZ3NvLmhcJiMzNDtcbiAjaW5jbHVkZSBcdTAwM2NuZXQvdHNvLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7Ym54dF9tcGMuaFwmIzM0O1xuJiM0MzsjaW5jbHVkZSBcJiMzNDtibnh0X2NyeXB0by5oXCYjMzQ7XG4mIzQzOyNpbmNsdWRlIFwmIzM0O2JueHRfa3Rscy5oXCYjMzQ7XG4gXG4gI2RlZmluZSBCTlhUX1RYX1RJTUVPVVRcdFx0KDUgKiBIWilcbiAjZGVmaW5lIEJOWFRfREVGX01TR19FTkFCTEVcdChORVRJRl9NU0dfRFJWIHwgTkVUSUZfTVNHX0hXIHwgXFxcbkBAIC0zOTIsNyAmIzQzOzM5NSw3IEBAIHN0YXRpYyB2b2lkIF9fYm54dF9xdWV1ZV9zcF93b3JrKHN0cnVjdCBibnh0ICpicClcbiBcdFx0c2NoZWR1bGVfd29yayhcdTAwMjZicC1cdTAwM2VzcF90YXNrKTtcbiB9XG4gXG4tc3RhdGljIHZvaWQgYm54dF9xdWV1ZV9zcF93b3JrKHN0cnVjdCBibnh0ICpicCwgdW5zaWduZWQgaW50IGV2ZW50KVxuJiM0Mzt2b2lkIGJueHRfcXVldWVfc3Bfd29yayhzdHJ1Y3QgYm54dCAqYnAsIHVuc2lnbmVkIGludCBldmVudClcbiB7XG4gXHRzZXRfYml0KGV2ZW50LCBcdTAwMjZicC1cdTAwM2VzcF9ldmVudCk7XG4gXHRfX2JueHRfcXVldWVfc3Bfd29yayhicCk7XG5AQCAtNDc4LDEzICYjNDM7NDgxLDE1IEBAIHN0YXRpYyBuZXRkZXZfdHhfdCBibnh0X3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldilcbiBcdGRtYV9hZGRyX3QgbWFwcGluZztcbiBcdHVuc2lnbmVkIGludCBsZW5ndGgsIHBhZCA9IDA7XG4gXHR1MzIgbGVuLCBmcmVlX3NpemUsIHZsYW5fdGFnX2ZsYWdzLCBjZmFfYWN0aW9uLCBmbGFncztcbiYjNDM7XHRzdHJ1Y3QgYm54dF9rdGxzX29mZmxvYWRfY3R4X3R4ICprY3R4X3R4ID0gTlVMTDtcbiYjNDM7XHR1MTYgcHJvZCwgc3RhcnRfcHJvZCwgbGFzdF9mcmFnLCB0eHRzX3Byb2Q7XG4gXHRzdHJ1Y3QgYm54dF9wdHBfY2ZnICpwdHAgPSBicC1cdTAwM2VwdHBfY2ZnO1xuIFx0c3RydWN0IHBjaV9kZXYgKnBkZXYgPSBicC1cdTAwM2VwZGV2O1xuLVx0dTE2IHByb2QsIGxhc3RfZnJhZywgdHh0c19wcm9kO1xuIFx0c3RydWN0IGJueHRfdHhfcmluZ19pbmZvICp0eHI7XG4gXHRzdHJ1Y3QgYm54dF9zd190eF9iZCAqdHhfYnVmO1xuIFx0X19sZTMyIGxmbGFncyA9IDA7XG4gXHRza2JfZnJhZ190ICpmcmFnO1xuJiM0MztcdHUzMiBraWQgPSAwO1xuIFxuIFx0aSA9IHNrYl9nZXRfcXVldWVfbWFwcGluZyhza2IpO1xuIFx0aWYgKHVubGlrZWx5KGkgXHUwMDNlPSBicC1cdTAwM2V0eF9ucl9yaW5ncykpIHtcbkBAIC00OTUsNyAmIzQzOzUwMCw2IEBAIHN0YXRpYyBuZXRkZXZfdHhfdCBibnh0X3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldilcbiBcbiBcdHR4cSA9IG5ldGRldl9nZXRfdHhfcXVldWUoZGV2LCBpKTtcbiBcdHR4ciA9IFx1MDAyNmJwLVx1MDAzZXR4X3JpbmdbYnAtXHUwMDNldHhfcmluZ19tYXBbaV1dO1xuLVx0cHJvZCA9IHR4ci1cdTAwM2V0eF9wcm9kO1xuIFxuICNpZiAoTUFYX1NLQl9GUkFHUyBcdTAwM2UgVFhfTUFYX0ZSQUdTKVxuIFx0aWYgKHNrYl9zaGluZm8oc2tiKS1cdTAwM2Vucl9mcmFncyBcdTAwM2UgVFhfTUFYX0ZSQUdTKSB7XG5AQCAtNTI0LDYgJiM0Mzs1MjgsMTQgQEAgc3RhdGljIG5ldGRldl90eF90IGJueHRfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KVxuIFx0XHRcdHJldHVybiBORVRERVZfVFhfQlVTWTtcbiBcdH1cbiBcbiYjNDM7XHRzdGFydF9wcm9kID0gdHhyLVx1MDAzZXR4X3Byb2Q7XG4mIzQzO1x0c2tiID0gYm54dF9rdGxzX3htaXQoYnAsIHR4ciwgc2tiLCBcdTAwMjZsZmxhZ3MsIFx1MDAyNmtpZCwgXHUwMDI2a2N0eF90eCk7XG4mIzQzO1x0aWYgKHVubGlrZWx5KCFza2IpKSB7XG4mIzQzO1x0XHRkZXZfY29yZV9zdGF0c190eF9kcm9wcGVkX2luYyhkZXYpO1xuJiM0MztcdFx0cmV0dXJuIE5FVERFVl9UWF9PSztcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHByb2QgPSB0eHItXHUwMDNldHhfcHJvZDtcbiBcdGxlbmd0aCA9IHNrYi1cdTAwM2VsZW47XG4gXHRsZW4gPSBza2JfaGVhZGxlbihza2IpO1xuIFx0bGFzdF9mcmFnID0gc2tiX3NoaW5mbyhza2IpLVx1MDAzZW5yX2ZyYWdzO1xuQEAgLTY3Miw3ICYjNDM7Njg0LDcgQEAgc3RhdGljIG5ldGRldl90eF90IGJueHRfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KVxuIFxuIFx0cHJvZCA9IE5FWFRfVFgocHJvZCk7XG4gXHR0eGJkMSA9IGJueHRfaW5pdF9leHRfYmQoYnAsIHR4ciwgcHJvZCwgbGZsYWdzLCB2bGFuX3RhZ19mbGFncyxcbi1cdFx0XHRcdCBjZmFfYWN0aW9uKTtcbiYjNDM7XHRcdFx0XHQgY2ZhX2FjdGlvbiwga2lkKTtcbiBcbiBcdGlmIChza2JfaXNfZ3NvKHNrYikpIHtcbiBcdFx0Ym9vbCB1ZHBfZ3NvID0gISEoc2tiX3NoaW5mbyhza2IpLVx1MDAzZWdzb190eXBlIFx1MDAyNiBTS0JfR1NPX1VEUF9MNCk7XG5AQCAtNjkzLDkgJiM0Mzs3MDUsMTAgQEAgc3RhdGljIG5ldGRldl90eF90IGJueHRfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KVxuIFxuIFx0XHR0eGJkMS1cdTAwM2V0eF9iZF9oc2l6ZV9sZmxhZ3MgfD0gY3B1X3RvX2xlMzIoVFhfQkRfRkxBR1NfTFNPIHxcbiBcdFx0XHRcdFx0VFhfQkRfRkxBR1NfVF9JUElEIHxcbi1cdFx0XHRcdFx0KGhkcl9sZW4gXHUwMDNjXHUwMDNjIChUWF9CRF9IU0laRV9TSElGVCAtIDEpKSk7XG4mIzQzO1x0XHRcdFx0XHQoKGhkcl9sZW4gXHUwMDNlXHUwMDNlIDEpIFx1MDAzY1x1MDAzYyBUWF9CRF9IU0laRV9TSElGVCkpO1xuIFx0XHRsZW5ndGggPSBza2Jfc2hpbmZvKHNrYiktXHUwMDNlZ3NvX3NpemU7XG4tXHRcdHR4YmQxLVx1MDAzZXR4X2JkX21zcyA9IGNwdV90b19sZTMyKGxlbmd0aCk7XG4mIzQzO1x0XHR0eGJkMS1cdTAwM2V0eF9iZF9raWRfbXNzID0gY3B1X3RvX2xlMzIoQk5YVF9UWF9LSURfSEkoa2lkKSB8XG4mIzQzO1x0XHRcdFx0XHRcdCAgIChsZW5ndGggXHUwMDI2IFRYX0JEX01TUykpO1xuIFx0XHRsZW5ndGggJiM0Mzs9IGhkcl9sZW47XG4gXHR9IGVsc2UgaWYgKHNrYi1cdTAwM2VpcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fUEFSVElBTCkge1xuIFx0XHR0eGJkMS1cdTAwM2V0eF9iZF9oc2l6ZV9sZmxhZ3MgfD1cbkBAIC03NDgsNiAmIzQzOzc2MSw5IEBAIHN0YXRpYyBuZXRkZXZfdHhfdCBibnh0X3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldilcbiBcdHByb2QgPSBORVhUX1RYKHByb2QpO1xuIFx0V1JJVEVfT05DRSh0eHItXHUwMDNldHhfcHJvZCwgcHJvZCk7XG4gXG4mIzQzO1x0LyogQ29tbWl0IHRoZSBrVExTIHN0YXRlIG5vdyB0aGF0IHRoZSBCRCBpcyBpbiB0aGUgcmluZy4gKi9cbiYjNDM7XHRibnh0X2t0bHNfeG1pdF9jb21taXQodHhyLCBrY3R4X3R4KTtcbiYjNDM7XG4gXHRpZiAoIW5ldGRldl94bWl0X21vcmUoKSB8fCBuZXRpZl94bWl0X3N0b3BwZWQodHhxKSkge1xuIFx0XHRibnh0X3R4cl9kYl9raWNrKGJwLCB0eHIsIHByb2QpO1xuIFx0fSBlbHNlIHtcbkBAIC04MDIsOSAmIzQzOzgxOCwxNiBAQCBzdGF0aWMgbmV0ZGV2X3R4X3QgYm54dF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpXG4gXHRcdFx0Lyogc2V0IFNLQiB0byBlcnIgc28gUFRQIHdvcmtlciB3aWxsIGNsZWFuIHVwICovXG4gXHRcdFx0cHRwLVx1MDAzZXR4dHNfcmVxW3R4dHNfcHJvZF0udHhfc2tiID0gRVJSX1BUUigtRUlPKTtcbiBcdH1cbiYjNDM7XHR0eHItXHUwMDNldHhfYnVmX3JpbmdbUklOR19UWChicCwgdHhyLVx1MDAzZXR4X3Byb2QpXS5za2IgPSBOVUxMO1xuJiM0MztcdC8qIFVud2luZCBhbnkga1RMUyBwcmVzeW5jIEJEcyAqL1xuJiM0MztcdGlmICh1bmxpa2VseSh0eHItXHUwMDNldHhfcHJvZCAhPSBzdGFydF9wcm9kKSkge1xuJiM0MztcdFx0dHhfYnVmID0gXHUwMDI2dHhyLVx1MDAzZXR4X2J1Zl9yaW5nW1JJTkdfVFgoYnAsIHN0YXJ0X3Byb2QpXTtcbiYjNDM7XHRcdHR4X2J1Zi1cdTAwM2Vpc19wdXNoID0gMDtcbiYjNDM7XHRcdHR4X2J1Zi1cdTAwM2VpbmxpbmVfZGF0YV9iZHMgPSAwO1xuJiM0MztcdFx0V1JJVEVfT05DRSh0eHItXHUwMDNldHhfcHJvZCwgc3RhcnRfcHJvZCk7XG4mIzQzO1x0fVxuIFx0aWYgKHR4ci1cdTAwM2VraWNrX3BlbmRpbmcpXG4gXHRcdGJueHRfdHhyX2RiX2tpY2soYnAsIHR4ciwgdHhyLVx1MDAzZXR4X3Byb2QpO1xuLVx0dHhyLVx1MDAzZXR4X2J1Zl9yaW5nW1JJTkdfVFgoYnAsIHR4ci1cdTAwM2V0eF9wcm9kKV0uc2tiID0gTlVMTDtcbiBcdGRldl9jb3JlX3N0YXRzX3R4X2Ryb3BwZWRfaW5jKGRldik7XG4gXHRyZXR1cm4gTkVUREVWX1RYX09LO1xuIH1cbkBAIC04MzMsNyAmIzQzOzg1Niw3IEBAIHN0YXRpYyBib29sIF9fYm54dF90eF9pbnQoc3RydWN0IGJueHQgKmJwLCBzdHJ1Y3QgYm54dF90eF9yaW5nX2luZm8gKnR4cixcbiBcdFx0aGVhZF9idWYgPSB0eF9idWY7XG4gXHRcdHNrYiA9IHR4X2J1Zi1cdTAwM2Vza2I7XG4gXG4tXHRcdGlmICh1bmxpa2VseSghc2tiKSkge1xuJiM0MztcdFx0aWYgKHVubGlrZWx5KCFza2IgXHUwMDI2XHUwMDI2ICF0eF9idWYtXHUwMDNlaXNfcHVzaCkpIHtcbiBcdFx0XHRibnh0X3NjaGVkX3Jlc2V0X3R4cihicCwgdHhyLCBjb25zKTtcbiBcdFx0XHRyZXR1cm4gcmM7XG4gXHRcdH1cbkBAIC04NDUsMTMgJiM0Mzs4NjgsMjIgQEAgc3RhdGljIGJvb2wgX19ibnh0X3R4X2ludChzdHJ1Y3QgYm54dCAqYnAsIHN0cnVjdCBibnh0X3R4X3JpbmdfaW5mbyAqdHhyLFxuIFx0XHR9XG4gXG4gXHRcdGNvbnMgPSBORVhUX1RYKGNvbnMpO1xuLVx0XHR0eF9wa3RzJiM0MzsmIzQzOztcbi1cdFx0dHhfYnl0ZXMgJiM0Mzs9IHNrYi1cdTAwM2VsZW47XG4mIzQzO1x0XHRpZiAoc2tiKSB7XG4mIzQzO1x0XHRcdHR4X3BrdHMmIzQzOyYjNDM7O1xuJiM0MztcdFx0XHR0eF9ieXRlcyAmIzQzOz0gc2tiLVx1MDAzZWxlbjtcbiYjNDM7XHRcdH1cbiBcdFx0dHhfYnVmLVx1MDAzZXNrYiA9IE5VTEw7XG4gXHRcdHR4X2J1Zi1cdTAwM2Vpc190c19wa3QgPSAwO1xuIFxuIFx0XHRpZiAodHhfYnVmLVx1MDAzZWlzX3B1c2gpIHtcbiBcdFx0XHR0eF9idWYtXHUwMDNlaXNfcHVzaCA9IDA7XG4mIzQzO1x0XHRcdGNvbnMgJiM0Mzs9IHR4X2J1Zi1cdTAwM2VpbmxpbmVfZGF0YV9iZHM7XG4mIzQzO1x0XHRcdHR4X2J1Zi1cdTAwM2VpbmxpbmVfZGF0YV9iZHMgPSAwO1xuJiM0MztcdFx0XHRpZiAoIXNrYikge1xuJiM0MztcdFx0XHRcdC8qIHByZXN5bmMgQkQgKi9cbiYjNDM7XHRcdFx0XHRjb25zID0gTkVYVF9UWChjb25zKTtcbiYjNDM7XHRcdFx0XHRjb250aW51ZTtcbiYjNDM7XHRcdFx0fVxuIFx0XHRcdGdvdG8gbmV4dF90eF9pbnQ7XG4gXHRcdH1cbiBcbkBAIC0zMTEzLDYgJiM0MzszMTQ1LDkgQEAgc3RhdGljIGludCBfX2JueHRfcG9sbF93b3JrKHN0cnVjdCBibnh0ICpicCwgc3RydWN0IGJueHRfY3BfcmluZ19pbmZvICpjcHIsXG4gXHRcdFx0XHRyeF9wa3RzJiM0MzsmIzQzOztcbiBcdFx0XHRlbHNlIGlmIChyYyA9PSAtRUJVU1kpXHQvKiBwYXJ0aWFsIGNvbXBsZXRpb24gKi9cbiBcdFx0XHRcdGJyZWFrO1xuJiM0MztcdFx0fSBlbHNlIGlmIChjbXBfdHlwZSA9PSBDTVBfVFlQRV9NUENfQ01QKSB7XG4mIzQzO1x0XHRcdGlmIChibnh0X21wY19jbXAoYnAsIGNwciwgXHUwMDI2cmF3X2NvbnMpKVxuJiM0MztcdFx0XHRcdGJyZWFrO1xuIFx0XHR9IGVsc2UgaWYgKHVubGlrZWx5KGNtcF90eXBlID09IENNUExfQkFTRV9UWVBFX0hXUk1fRE9ORSB8fFxuIFx0XHRcdFx0ICAgIGNtcF90eXBlID09IENNUExfQkFTRV9UWVBFX0hXUk1fRldEX1JFUSB8fFxuIFx0XHRcdFx0ICAgIGNtcF90eXBlID09IENNUExfQkFTRV9UWVBFX0hXUk1fQVNZTkNfRVZFTlQpKSB7XG5AQCAtMzY4NCw3ICYjNDM7MzcxOSw3IEBAIHN0YXRpYyBzaXplX3QgX19ibnh0X2NvcHlfcmluZyhzdHJ1Y3QgYm54dCAqYnAsIHN0cnVjdCBibnh0X3JpbmdfbWVtX2luZm8gKnJtZW0sXG4gXHRyZXR1cm4gdG90YWxfbGVuO1xuIH1cbiBcbi1zdGF0aWMgdm9pZCBibnh0X2ZyZWVfcmluZyhzdHJ1Y3QgYm54dCAqYnAsIHN0cnVjdCBibnh0X3JpbmdfbWVtX2luZm8gKnJtZW0pXG4mIzQzO3ZvaWQgYm54dF9mcmVlX3Jpbmcoc3RydWN0IGJueHQgKmJwLCBzdHJ1Y3QgYm54dF9yaW5nX21lbV9pbmZvICpybWVtKVxuIHtcbiBcdHN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gYnAtXHUwMDNlcGRldjtcbiBcdGludCBpO1xuQEAgLTM3MTcsNyAmIzQzOzM3NTIsNyBAQCBzdGF0aWMgdm9pZCBibnh0X2ZyZWVfcmluZyhzdHJ1Y3QgYm54dCAqYnAsIHN0cnVjdCBibnh0X3JpbmdfbWVtX2luZm8gKnJtZW0pXG4gXHR9XG4gfVxuIFxuLXN0YXRpYyBpbnQgYm54dF9hbGxvY19yaW5nKHN0cnVjdCBibnh0ICpicCwgc3RydWN0IGJueHRfcmluZ19tZW1faW5mbyAqcm1lbSlcbiYjNDM7aW50IGJueHRfYWxsb2NfcmluZyhzdHJ1Y3QgYm54dCAqYnAsIHN0cnVjdCBibnh0X3JpbmdfbWVtX2luZm8gKnJtZW0pXG4ge1xuIFx0c3RydWN0IHBjaV9kZXYgKnBkZXYgPSBicC1cdTAwM2VwZGV2O1xuIFx0dTY0IHZhbGlkX2JpdCA9IDA7XG5AQCAtNDA3OSw2ICYjNDM7NDExNCw4IEBAIHN0YXRpYyB2b2lkIGJueHRfZnJlZV90eF9yaW5ncyhzdHJ1Y3QgYm54dCAqYnApXG4gXG4gXHRcdGJueHRfZnJlZV90eF9pbmxpbmVfYnVmKHR4ciwgcGRldik7XG4gXG4mIzQzO1x0XHRibnh0X2t0bHNfZnJlZV90eF9yaW5nX3N0YXRzKHR4cik7XG4mIzQzO1xuIFx0XHRyaW5nID0gXHUwMDI2dHhyLVx1MDAzZXR4X3Jpbmdfc3RydWN0O1xuIFxuIFx0XHRibnh0X2ZyZWVfcmluZyhicCwgXHUwMDI2cmluZy1cdTAwM2VyaW5nX21lbSk7XG5AQCAtNDE1Myw3ICYjNDM7NDE5MCwxMCBAQCBzdGF0aWMgaW50IGJueHRfYWxsb2NfdHhfcmluZ3Moc3RydWN0IGJueHQgKmJwKVxuIFx0XHR9XG4gXHRcdHFpZHggPSBicC1cdTAwM2V0Y190b19xaWR4W2pdO1xuIFx0XHRyaW5nLVx1MDAzZXF1ZXVlX2lkID0gYnAtXHUwMDNlcV9pbmZvW3FpZHhdLnF1ZXVlX2lkO1xuLVx0XHRzcGluX2xvY2tfaW5pdChcdTAwMjZ0eHItXHUwMDNleGRwX3R4X2xvY2spO1xuJiM0MztcdFx0c3Bpbl9sb2NrX2luaXQoXHUwMDI2dHhyLVx1MDAzZXR4X2xvY2spO1xuJiM0MztcdFx0cmMgPSBibnh0X2t0bHNfYWxsb2NfdHhfcmluZ19zdGF0cyhicCwgdHhyKTtcbiYjNDM7XHRcdGlmIChyYylcbiYjNDM7XHRcdFx0cmV0dXJuIHJjO1xuIFx0XHRpZiAoaSBcdTAwM2MgYnAtXHUwMDNldHhfbnJfcmluZ3NfeGRwKVxuIFx0XHRcdGNvbnRpbnVlO1xuIFx0XHRpZiAoQk5YVF9SSU5HX1RPX1RDX09GRihicCwgaSkgPT0gKGJwLVx1MDAzZXR4X25yX3JpbmdzX3Blcl90YyAtIDEpKVxuQEAgLTQzMjQsNiAmIzQzOzQzNjQsOCBAQCBzdGF0aWMgaW50IGJueHRfYWxsb2NfY3BfcmluZ3Moc3RydWN0IGJueHQgKmJwKVxuIFx0XHRcdCAoIXNoIFx1MDAyNlx1MDAyNiBpIFx1MDAzZT0gYnAtXHUwMDNlcnhfbnJfcmluZ3MpKSB7XG4gXHRcdFx0Y3BfY291bnQgJiM0Mzs9IHRjcztcbiBcdFx0XHR0eCA9IDE7XG4mIzQzO1x0XHRcdGlmIChibnh0X25hcGlfaGFzX21wYyhicCwgaSkpXG4mIzQzO1x0XHRcdFx0Y3BfY291bnQmIzQzOyYjNDM7O1xuIFx0XHR9XG4gXG4gXHRcdGNwci1cdTAwM2VjcF9yaW5nX2FyciA9IGt6YWxsb2Nfb2JqcygqY3ByLCBjcF9jb3VudCk7XG5AQCAtNDM0NSw2ICYjNDM7NDM4NywxMSBAQCBzdGF0aWMgaW50IGJueHRfYWxsb2NfY3BfcmluZ3Moc3RydWN0IGJueHQgKmJwKVxuIFx0XHRcdH0gZWxzZSB7XG4gXHRcdFx0XHRpbnQgbiwgdGMgPSBrIC0gcng7XG4gXG4mIzQzO1x0XHRcdFx0LyogTVBDIHJpbmdzIGFyZSBhdCB0aGUgaGlnaGVzdCBrIGluZGljZXMgKi9cbiYjNDM7XHRcdFx0XHRpZiAodGMgXHUwMDNlPSB0Y3MpIHtcbiYjNDM7XHRcdFx0XHRcdGJueHRfc2V0X21wY19jcF9yaW5nKGJwLCBpLCBjcHIyKTtcbiYjNDM7XHRcdFx0XHRcdGNvbnRpbnVlO1xuJiM0MztcdFx0XHRcdH1cbiBcdFx0XHRcdG4gPSBCTlhUX1RDX1RPX1JJTkdfQkFTRShicCwgdGMpICYjNDM7IGo7XG4gXHRcdFx0XHRicC1cdTAwM2V0eF9yaW5nW25dLnR4X2NwciA9IGNwcjI7XG4gXHRcdFx0XHRjcHIyLVx1MDAzZWNwX3JpbmdfdHlwZSA9IEJOWFRfTlFfSERMX1RZUEVfVFg7XG5AQCAtNDQ3Nyw2ICYjNDM7NDUyNCw3IEBAIHN0YXRpYyB2b2lkIGJueHRfaW5pdF9yaW5nX3N0cnVjdChzdHJ1Y3QgYm54dCAqYnApXG4gXHRcdFx0cm1lbS1cdTAwM2V2bWVtID0gKHZvaWQgKiopXHUwMDI2dHhyLVx1MDAzZXR4X2J1Zl9yaW5nO1xuIFx0XHR9XG4gXHR9XG4mIzQzO1x0Ym54dF9pbml0X21wY19yaW5nX3N0cnVjdChicCk7XG4gfVxuIFxuIHN0YXRpYyB2b2lkIGJueHRfaW5pdF9yeGJkX3BhZ2VzKHN0cnVjdCBibnh0X3Jpbmdfc3RydWN0ICpyaW5nLCB1MzIgdHlwZSlcbkBAIC01NTUzLDYgJiM0Mzs1NjAxLDcgQEAgc3RhdGljIHZvaWQgYm54dF9pbml0X2wyX2ZsdHJfdGJsKHN0cnVjdCBibnh0ICpicClcbiBzdGF0aWMgdm9pZCBibnh0X2ZyZWVfbWVtKHN0cnVjdCBibnh0ICpicCwgYm9vbCBpcnFfcmVfaW5pdClcbiB7XG4gXHRibnh0X2ZyZWVfdm5pY19hdHRyaWJ1dGVzKGJwKTtcbiYjNDM7XHRibnh0X2ZyZWVfbXBjX3JpbmdzKGJwKTtcbiBcdGJueHRfZnJlZV90eF9yaW5ncyhicCk7XG4gXHRibnh0X2ZyZWVfcnhfcmluZ3MoYnApO1xuIFx0Ym54dF9mcmVlX2NwX3JpbmdzKGJwKTtcbkBAIC01NTY2LDYgJiM0Mzs1NjE1LDcgQEAgc3RhdGljIHZvaWQgYm54dF9mcmVlX21lbShzdHJ1Y3QgYm54dCAqYnAsIGJvb2wgaXJxX3JlX2luaXQpXG4gXHRcdFx0Ym54dF9mcmVlX3BvcnRfc3RhdHMoYnApO1xuIFx0XHRibnh0X2ZyZWVfcmluZ19ncnBzKGJwKTtcbiBcdFx0Ym54dF9mcmVlX3ZuaWNzKGJwKTtcbiYjNDM7XHRcdGJueHRfZnJlZV9tcGNzKGJwKTtcbiBcdFx0a2ZyZWUoYnAtXHUwMDNldHhfcmluZ19tYXApO1xuIFx0XHRicC1cdTAwM2V0eF9yaW5nX21hcCA9IE5VTEw7XG4gXHRcdGtmcmVlKGJwLVx1MDAzZXR4X3JpbmcpO1xuQEAgLTU2NzUsNiAmIzQzOzU3MjUsMTAgQEAgc3RhdGljIGludCBibnh0X2FsbG9jX21lbShzdHJ1Y3QgYm54dCAqYnAsIGJvb2wgaXJxX3JlX2luaXQpXG4gXHRcdFx0XHR0eHItXHUwMDNldHhfY3ByID0gXHUwMDI2Ym5hcGkyLVx1MDAzZWNwX3Jpbmc7XG4gXHRcdH1cbiBcbiYjNDM7XHRcdHJjID0gYm54dF9hbGxvY19tcGNzKGJwKTtcbiYjNDM7XHRcdGlmIChyYylcbiYjNDM7XHRcdFx0Z290byBhbGxvY19tZW1fZXJyO1xuJiM0MztcbiBcdFx0cmMgPSBibnh0X2FsbG9jX3N0YXRzKGJwKTtcbiBcdFx0aWYgKHJjKVxuIFx0XHRcdGdvdG8gYWxsb2NfbWVtX2VycjtcbkBAIC01NzAzLDYgJiM0Mzs1NzU3LDEwIEBAIHN0YXRpYyBpbnQgYm54dF9hbGxvY19tZW0oc3RydWN0IGJueHQgKmJwLCBib29sIGlycV9yZV9pbml0KVxuIFx0aWYgKHJjKVxuIFx0XHRnb3RvIGFsbG9jX21lbV9lcnI7XG4gXG4mIzQzO1x0cmMgPSBibnh0X2FsbG9jX21wY19yaW5ncyhicCk7XG4mIzQzO1x0aWYgKHJjKVxuJiM0MztcdFx0Z290byBhbGxvY19tZW1fZXJyO1xuJiM0MztcbiBcdHJjID0gYm54dF9hbGxvY19jcF9yaW5ncyhicCk7XG4gXHRpZiAocmMpXG4gXHRcdGdvdG8gYWxsb2NfbWVtX2VycjtcbkBAIC03MjU3LDEwICYjNDM7NzMxNSwxNSBAQCBzdGF0aWMgaW50IGh3cm1fcmluZ19hbGxvY19zZW5kX21zZyhzdHJ1Y3QgYm54dCAqYnAsXG4gXHRcdHJlcS1cdTAwM2VjbXBsX3JpbmdfaWQgPSBjcHVfdG9fbGUxNihibnh0X2NwX3JpbmdfZm9yX3R4KGJwLCB0eHIpKTtcbiBcdFx0cmVxLVx1MDAzZWxlbmd0aCA9IGNwdV90b19sZTMyKGJwLVx1MDAzZXR4X3JpbmdfbWFzayAmIzQzOyAxKTtcbiBcdFx0cmVxLVx1MDAzZXN0YXRfY3R4X2lkID0gY3B1X3RvX2xlMzIoZ3JwX2luZm8tXHUwMDNlZndfc3RhdHNfY3R4KTtcbi1cdFx0cmVxLVx1MDAzZXF1ZXVlX2lkID0gY3B1X3RvX2xlMTYocmluZy1cdTAwM2VxdWV1ZV9pZCk7XG4tXHRcdGlmIChicC1cdTAwM2VmbGFncyBcdTAwMjYgQk5YVF9GTEFHX1RYX0NPQUxfQ01QTClcbi1cdFx0XHRyZXEtXHUwMDNlY21wbF9jb2FsX2NudCA9XG4tXHRcdFx0XHRSSU5HX0FMTE9DX1JFUV9DTVBMX0NPQUxfQ05UX0NPQUxfNjQ7XG4mIzQzO1x0XHRpZiAocmluZy1cdTAwM2VxdWV1ZV9pZCA9PSBCTlhUX01QQ19RVUVVRV9JRCkge1xuJiM0MztcdFx0XHRyZXEtXHUwMDNlbXBjX2NobmxzX3R5cGUgPSByaW5nLVx1MDAzZW1wY19jaG5sX3R5cGU7XG4mIzQzO1x0XHRcdHJlcS1cdTAwM2VlbmFibGVzIHw9IGNwdV90b19sZTMyKFJJTkdfQUxMT0NfUkVRX0VOQUJMRVNfTVBDX0NITkxTX1RZUEUpO1xuJiM0MztcdFx0fSBlbHNlIHtcbiYjNDM7XHRcdFx0cmVxLVx1MDAzZXF1ZXVlX2lkID0gY3B1X3RvX2xlMTYocmluZy1cdTAwM2VxdWV1ZV9pZCk7XG4mIzQzO1x0XHRcdGlmIChicC1cdTAwM2VmbGFncyBcdTAwMjYgQk5YVF9GTEFHX1RYX0NPQUxfQ01QTClcbiYjNDM7XHRcdFx0XHRyZXEtXHUwMDNlY21wbF9jb2FsX2NudCA9XG4mIzQzO1x0XHRcdFx0XHRSSU5HX0FMTE9DX1JFUV9DTVBMX0NPQUxfQ05UX0NPQUxfNjQ7XG4mIzQzO1x0XHR9XG4gXHRcdGlmICgoYnAtXHUwMDNlZndfY2FwIFx1MDAyNiBCTlhUX0ZXX0NBUF9UWF9UU19DTVApIFx1MDAyNlx1MDAyNiBicC1cdTAwM2VwdHBfY2ZnKVxuIFx0XHRcdGZsYWdzIHw9IFJJTkdfQUxMT0NfUkVRX0ZMQUdTX1RYX1BLVF9UU19DTVBMX0VOQUJMRTtcbiBcdFx0cmVxLVx1MDAzZWZsYWdzID0gY3B1X3RvX2xlMTYoZmxhZ3MpO1xuQEAgLTc0NTUsOCAmIzQzOzc1MTgsNyBAQCBzdGF0aWMgaW50IGJueHRfaHdybV9yeF9hZ2dfcmluZ19hbGxvYyhzdHJ1Y3QgYm54dCAqYnAsXG4gXHRyZXR1cm4gMDtcbiB9XG4gXG4tc3RhdGljIGludCBibnh0X2h3cm1fY3BfcmluZ19hbGxvY19wNShzdHJ1Y3QgYm54dCAqYnAsXG4tXHRcdFx0XHQgICAgICBzdHJ1Y3QgYm54dF9jcF9yaW5nX2luZm8gKmNwcilcbiYjNDM7aW50IGJueHRfaHdybV9jcF9yaW5nX2FsbG9jX3A1KHN0cnVjdCBibnh0ICpicCwgc3RydWN0IGJueHRfY3BfcmluZ19pbmZvICpjcHIpXG4ge1xuIFx0Y29uc3QgdTMyIHR5cGUgPSBIV1JNX1JJTkdfQUxMT0NfQ01QTDtcbiBcdHN0cnVjdCBibnh0X25hcGkgKmJuYXBpID0gY3ByLVx1MDAzZWJuYXBpO1xuQEAgLTc0NzQsOCAmIzQzOzc1MzYsOCBAQCBzdGF0aWMgaW50IGJueHRfaHdybV9jcF9yaW5nX2FsbG9jX3A1KHN0cnVjdCBibnh0ICpicCxcbiBcdHJldHVybiAwO1xuIH1cbiBcbi1zdGF0aWMgaW50IGJueHRfaHdybV90eF9yaW5nX2FsbG9jKHN0cnVjdCBibnh0ICpicCxcbi1cdFx0XHRcdCAgIHN0cnVjdCBibnh0X3R4X3JpbmdfaW5mbyAqdHhyLCB1MzIgdHhfaWR4KVxuJiM0MztpbnQgYm54dF9od3JtX3R4X3JpbmdfYWxsb2Moc3RydWN0IGJueHQgKmJwLCBzdHJ1Y3QgYm54dF90eF9yaW5nX2luZm8gKnR4cixcbiYjNDM7XHRcdFx0ICAgIHUzMiB0eF9pZHgpXG4ge1xuIFx0c3RydWN0IGJueHRfcmluZ19zdHJ1Y3QgKnJpbmcgPSBcdTAwMjZ0eHItXHUwMDNldHhfcmluZ19zdHJ1Y3Q7XG4gXHRjb25zdCB1MzIgdHlwZSA9IEhXUk1fUklOR19BTExPQ19UWDtcbkBAIC03NTYwLDYgJiM0Mzs3NjIyLDkgQEAgc3RhdGljIGludCBibnh0X2h3cm1fcmluZ19hbGxvYyhzdHJ1Y3QgYm54dCAqYnApXG4gXHRcdFx0XHRnb3RvIGVycl9vdXQ7XG4gXHRcdH1cbiBcdH1cbiYjNDM7XG4mIzQzO1x0cmMgPSBibnh0X2h3cm1fbXBjX3JpbmdfYWxsb2MoYnApO1xuJiM0MztcbiBlcnJfb3V0OlxuIFx0cmV0dXJuIHJjO1xuIH1cbkBAIC03NjE3LDkgJiM0Mzs3NjgyLDggQEAgc3RhdGljIGludCBod3JtX3JpbmdfZnJlZV9zZW5kX21zZyhzdHJ1Y3QgYm54dCAqYnAsXG4gXHRyZXR1cm4gMDtcbiB9XG4gXG4tc3RhdGljIHZvaWQgYm54dF9od3JtX3R4X3JpbmdfZnJlZShzdHJ1Y3QgYm54dCAqYnAsXG4tXHRcdFx0XHQgICBzdHJ1Y3QgYm54dF90eF9yaW5nX2luZm8gKnR4cixcbi1cdFx0XHRcdCAgIGJvb2wgY2xvc2VfcGF0aClcbiYjNDM7dm9pZCBibnh0X2h3cm1fdHhfcmluZ19mcmVlKHN0cnVjdCBibnh0ICpicCwgc3RydWN0IGJueHRfdHhfcmluZ19pbmZvICp0eHIsXG4mIzQzO1x0XHRcdCAgICBib29sIGNsb3NlX3BhdGgpXG4ge1xuIFx0c3RydWN0IGJueHRfcmluZ19zdHJ1Y3QgKnJpbmcgPSBcdTAwMjZ0eHItXHUwMDNldHhfcmluZ19zdHJ1Y3Q7XG4gXHR1MzIgY21wbF9yaW5nX2lkO1xuQEAgLTc2NzgsOCAmIzQzOzc3NDIsNyBAQCBzdGF0aWMgdm9pZCBibnh0X2h3cm1fcnhfYWdnX3JpbmdfZnJlZShzdHJ1Y3QgYm54dCAqYnAsXG4gXHRicC1cdTAwM2VncnBfaW5mb1tncnBfaWR4XS5hZ2dfZndfcmluZ19pZCA9IElOVkFMSURfSFdfUklOR19JRDtcbiB9XG4gXG4tc3RhdGljIHZvaWQgYm54dF9od3JtX2NwX3JpbmdfZnJlZShzdHJ1Y3QgYm54dCAqYnAsXG4tXHRcdFx0XHQgICBzdHJ1Y3QgYm54dF9jcF9yaW5nX2luZm8gKmNwcilcbiYjNDM7dm9pZCBibnh0X2h3cm1fY3BfcmluZ19mcmVlKHN0cnVjdCBibnh0ICpicCwgc3RydWN0IGJueHRfY3BfcmluZ19pbmZvICpjcHIpXG4ge1xuIFx0c3RydWN0IGJueHRfcmluZ19zdHJ1Y3QgKnJpbmc7XG4gXG5AQCAtNzY5Miw3ICYjNDM7Nzc1NSw3IEBAIHN0YXRpYyB2b2lkIGJueHRfaHdybV9jcF9yaW5nX2ZyZWUoc3RydWN0IGJueHQgKmJwLFxuIFx0cmluZy1cdTAwM2Vmd19yaW5nX2lkID0gSU5WQUxJRF9IV19SSU5HX0lEO1xuIH1cbiBcbi1zdGF0aWMgdm9pZCBibnh0X2NsZWFyX29uZV9jcF9yaW5nKHN0cnVjdCBibnh0ICpicCwgc3RydWN0IGJueHRfY3BfcmluZ19pbmZvICpjcHIpXG4mIzQzO3ZvaWQgYm54dF9jbGVhcl9vbmVfY3BfcmluZyhzdHJ1Y3QgYm54dCAqYnAsIHN0cnVjdCBibnh0X2NwX3JpbmdfaW5mbyAqY3ByKVxuIHtcbiBcdHN0cnVjdCBibnh0X3Jpbmdfc3RydWN0ICpyaW5nID0gXHUwMDI2Y3ByLVx1MDAzZWNwX3Jpbmdfc3RydWN0O1xuIFx0aW50IGksIHNpemUgPSByaW5nLVx1MDAzZXJpbmdfbWVtLnBhZ2Vfc2l6ZTtcbkBAIC03NzEzLDYgJiM0Mzs3Nzc2LDggQEAgc3RhdGljIHZvaWQgYm54dF9od3JtX3JpbmdfZnJlZShzdHJ1Y3QgYm54dCAqYnAsIGJvb2wgY2xvc2VfcGF0aClcbiBcdGlmICghYnAtXHUwMDNlYm5hcGkpXG4gXHRcdHJldHVybjtcbiBcbiYjNDM7XHRibnh0X2h3cm1fbXBjX3JpbmdfZnJlZShicCwgY2xvc2VfcGF0aCk7XG4mIzQzO1xuIFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgYnAtXHUwMDNldHhfbnJfcmluZ3M7IGkmIzQzOyYjNDM7KVxuIFx0XHRibnh0X2h3cm1fdHhfcmluZ19mcmVlKGJwLCBcdTAwMjZicC1cdTAwM2V0eF9yaW5nW2ldLCBjbG9zZV9wYXRoKTtcbiBcbkBAIC03NzUxLDYgJiM0Mzs3ODE2LDExIEBAIHN0YXRpYyB2b2lkIGJueHRfaHdybV9yaW5nX2ZyZWUoc3RydWN0IGJueHQgKmJwLCBib29sIGNsb3NlX3BhdGgpXG4gXHR9XG4gfVxuIFxuJiM0MztpbnQgYm54dF90b3RhbF90eF9yaW5ncyhzdHJ1Y3QgYm54dCAqYnApXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gYnAtXHUwMDNldHhfbnJfcmluZ3MgJiM0MzsgYm54dF9tcGNfdHhfcmluZ3NfaW5fdXNlKGJwKTtcbiYjNDM7fVxuJiM0MztcbiBzdGF0aWMgaW50IF9fYm54dF90cmltX3JpbmdzKHN0cnVjdCBibnh0ICpicCwgaW50ICpyeCwgaW50ICp0eCwgaW50IG1heCxcbiBcdFx0XHQgICAgIGJvb2wgc2hhcmVkKTtcbiBzdGF0aWMgaW50IGJueHRfdHJpbV9yaW5ncyhzdHJ1Y3QgYm54dCAqYnAsIGludCAqcngsIGludCAqdHgsIGludCBtYXgsXG5AQCAtNzc1OSw2ICYjNDM7NzgyOSw3IEBAIHN0YXRpYyBpbnQgYm54dF90cmltX3JpbmdzKHN0cnVjdCBibnh0ICpicCwgaW50ICpyeCwgaW50ICp0eCwgaW50IG1heCxcbiBzdGF0aWMgaW50IGJueHRfaHdybV9nZXRfcmluZ3Moc3RydWN0IGJueHQgKmJwKVxuIHtcbiBcdHN0cnVjdCBibnh0X2h3X3Jlc2MgKmh3X3Jlc2MgPSBcdTAwMjZicC1cdTAwM2Vod19yZXNjO1xuJiM0MztcdHN0cnVjdCBibnh0X2h3X2NyeXB0b19yZXNjICpjcnlwdG9fcmVzYztcbiBcdHN0cnVjdCBod3JtX2Z1bmNfcWNmZ19vdXRwdXQgKnJlc3A7XG4gXHRzdHJ1Y3QgaHdybV9mdW5jX3FjZmdfaW5wdXQgKnJlcTtcbiBcdGludCByYztcbkBAIC03NzkxLDI1ICYjNDM7Nzg2MiwzOCBAQCBzdGF0aWMgaW50IGJueHRfaHdybV9nZXRfcmluZ3Moc3RydWN0IGJueHQgKmJwKVxuIFx0XHRzdGF0cyA9IGxlMTZfdG9fY3B1KHJlc3AtXHUwMDNlYWxsb2Nfc3RhdF9jdHgpO1xuIFx0XHRod19yZXNjLVx1MDAzZXJlc3ZfaXJxcyA9IGNwO1xuIFx0XHRpZiAoYnAtXHUwMDNlZmxhZ3MgXHUwMDI2IEJOWFRfRkxBR19DSElQX1A1X1BMVVMpIHtcbiYjNDM7XHRcdFx0aW50IG1wY190eCA9IGJueHRfbXBjX3R4X3JpbmdzX2luX3VzZShicCk7XG4mIzQzO1x0XHRcdGludCBtcGNfY3AgPSBibnh0X21wY19jcF9yaW5nc19pbl91c2UoYnApO1xuIFx0XHRcdGludCByeCA9IGh3X3Jlc2MtXHUwMDNlcmVzdl9yeF9yaW5ncztcbiBcdFx0XHRpbnQgdHggPSBod19yZXNjLVx1MDAzZXJlc3ZfdHhfcmluZ3M7XG4mIzQzO1x0XHRcdGludCBjcF9wNTtcbiBcbiYjNDM7XHRcdFx0aWYgKHR4IFx1MDAzYz0gbXBjX3R4IHx8IGNwIFx1MDAzYz0gbXBjX2NwKSB7XG4mIzQzO1x0XHRcdFx0cmMgPSAtRU5PTUVNO1xuJiM0MztcdFx0XHRcdGdvdG8gZ2V0X3JpbmdzX2V4aXQ7XG4mIzQzO1x0XHRcdH1cbiYjNDM7XHRcdFx0dHggLT0gbXBjX3R4O1xuJiM0MztcdFx0XHRjcF9wNSA9IGNwIC0gbXBjX2NwO1xuIFx0XHRcdGlmIChicC1cdTAwM2VmbGFncyBcdTAwMjYgQk5YVF9GTEFHX0FHR19SSU5HUylcbiBcdFx0XHRcdHJ4IFx1MDAzZVx1MDAzZT0gMTtcbi1cdFx0XHRpZiAoY3AgXHUwMDNjIChyeCAmIzQzOyB0eCkpIHtcbi1cdFx0XHRcdHJjID0gX19ibnh0X3RyaW1fcmluZ3MoYnAsIFx1MDAyNnJ4LCBcdTAwMjZ0eCwgY3AsIGZhbHNlKTtcbiYjNDM7XHRcdFx0aWYgKGNwX3A1IFx1MDAzYyAocnggJiM0MzsgdHgpKSB7XG4mIzQzO1x0XHRcdFx0cmMgPSBfX2JueHRfdHJpbV9yaW5ncyhicCwgXHUwMDI2cngsIFx1MDAyNnR4LCBjcF9wNSwgZmFsc2UpO1xuIFx0XHRcdFx0aWYgKHJjKVxuIFx0XHRcdFx0XHRnb3RvIGdldF9yaW5nc19leGl0O1xuIFx0XHRcdFx0aWYgKGJwLVx1MDAzZWZsYWdzIFx1MDAyNiBCTlhUX0ZMQUdfQUdHX1JJTkdTKVxuIFx0XHRcdFx0XHRyeCBcdTAwM2NcdTAwM2M9IDE7XG4gXHRcdFx0XHRod19yZXNjLVx1MDAzZXJlc3ZfcnhfcmluZ3MgPSByeDtcbi1cdFx0XHRcdGh3X3Jlc2MtXHUwMDNlcmVzdl90eF9yaW5ncyA9IHR4O1xuJiM0MztcdFx0XHRcdGh3X3Jlc2MtXHUwMDNlcmVzdl90eF9yaW5ncyA9IHR4ICYjNDM7IG1wY190eDtcbiBcdFx0XHR9XG4gXHRcdFx0aHdfcmVzYy1cdTAwM2VyZXN2X2lycXMgPSBsZTE2X3RvX2NwdShyZXNwLVx1MDAzZWFsbG9jX21zaXgpO1xuIFx0XHRcdGh3X3Jlc2MtXHUwMDNlcmVzdl9od19yaW5nX2dycHMgPSByeDtcbiBcdFx0fVxuIFx0XHRod19yZXNjLVx1MDAzZXJlc3ZfY3BfcmluZ3MgPSBjcDtcbiBcdFx0aHdfcmVzYy1cdTAwM2VyZXN2X3N0YXRfY3R4cyA9IHN0YXRzO1xuJiM0MztcbiYjNDM7XHRcdGNyeXB0b19yZXNjID0gXHUwMDI2aHdfcmVzYy1cdTAwM2VjcnlwdG9fcmVzYztcbiYjNDM7XHRcdGNyeXB0b19yZXNjLVx1MDAzZXJlc3ZfdHhfa2V5X2N0eHMgPSBsZTMyX3RvX2NwdShyZXNwLVx1MDAzZW51bV9rdGxzX3R4X2tleV9jdHhzKTtcbiYjNDM7XHRcdGNyeXB0b19yZXNjLVx1MDAzZXJlc3Zfcnhfa2V5X2N0eHMgPSBsZTMyX3RvX2NwdShyZXNwLVx1MDAzZW51bV9rdGxzX3J4X2tleV9jdHhzKTtcbiBcdH1cbiBnZXRfcmluZ3NfZXhpdDpcbiBcdGh3cm1fcmVxX2Ryb3AoYnAsIHJlcSk7XG5AQCAtNzg4MCw4ICYjNDM7Nzk2NCw5IEBAIF9fYm54dF9od3JtX3Jlc2VydmVfcGZfcmluZ3Moc3RydWN0IGJueHQgKmJwLCBzdHJ1Y3QgYm54dF9od19yaW5ncyAqaHdyKVxuIFx0XHR9XG4gXHRcdHJlcS1cdTAwM2VudW1fc3RhdF9jdHhzID0gY3B1X3RvX2xlMTYoaHdyLVx1MDAzZXN0YXQpO1xuIFx0XHRyZXEtXHUwMDNlbnVtX3ZuaWNzID0gY3B1X3RvX2xlMTYoaHdyLVx1MDAzZXZuaWMpO1xuJiM0MztcdFx0Ym54dF9od3JtX3Jlc2VydmVfcGZfa2V5X2N0eHMoYnAsIHJlcSk7XG4gXHR9XG4tXHRyZXEtXHUwMDNlZW5hYmxlcyA9IGNwdV90b19sZTMyKGVuYWJsZXMpO1xuJiM0MztcdHJlcS1cdTAwM2VlbmFibGVzIHw9IGNwdV90b19sZTMyKGVuYWJsZXMpO1xuIFx0cmV0dXJuIHJlcTtcbiB9XG4gXG5AQCAtNzk5NSw3ICYjNDM7ODA4MCw3IEBAIHN0YXRpYyBpbnQgYm54dF9jcF9yaW5nc19pbl91c2Uoc3RydWN0IGJueHQgKmJwKVxuIFx0XHRyZXR1cm4gYm54dF9ucV9yaW5nc19pbl91c2UoYnApO1xuIFxuIFx0Y3AgPSBicC1cdTAwM2V0eF9ucl9yaW5ncyAmIzQzOyBicC1cdTAwM2VyeF9ucl9yaW5ncztcbi1cdHJldHVybiBjcDtcbiYjNDM7XHRyZXR1cm4gY3AgJiM0MzsgYm54dF9tcGNfY3BfcmluZ3NfaW5fdXNlKGJwKTtcbiB9XG4gXG4gc3RhdGljIGludCBibnh0X2dldF9mdW5jX3N0YXRfY3R4cyhzdHJ1Y3QgYm54dCAqYnApXG5AQCAtODA1Myw3ICYjNDM7ODEzOCw3IEBAIHN0YXRpYyB2b2lkIGJueHRfZ2V0X3RvdGFsX3Jlc291cmNlcyhzdHJ1Y3QgYm54dCAqYnAsIHN0cnVjdCBibnh0X2h3X3JpbmdzICpod3IpXG4gXHRod3ItXHUwMDNlY3BfcDUgPSAwO1xuIFx0aWYgKGJwLVx1MDAzZWZsYWdzIFx1MDAyNiBCTlhUX0ZMQUdfQ0hJUF9QNV9QTFVTKVxuIFx0XHRod3ItXHUwMDNlY3BfcDUgPSBibnh0X2NwX3JpbmdzX2luX3VzZShicCk7XG4tXHRod3ItXHUwMDNldHggPSBicC1cdTAwM2V0eF9ucl9yaW5ncztcbiYjNDM7XHRod3ItXHUwMDNldHggPSBibnh0X3RvdGFsX3R4X3JpbmdzKGJwKTtcbiBcdGh3ci1cdTAwM2VyeCA9IGJwLVx1MDAzZXJ4X25yX3JpbmdzO1xuIFx0aHdyLVx1MDAzZWdycCA9IGh3ci1cdTAwM2VyeDtcbiBcdGh3ci1cdTAwM2V2bmljID0gYm54dF9nZXRfdG90YWxfdm5pY3MoYnAsIGh3ci1cdTAwM2VyeCk7XG5AQCAtODE1OSw4ICYjNDM7ODI0NCwxMCBAQCBzdGF0aWMgaW50IF9fYm54dF9yZXNlcnZlX3JpbmdzKHN0cnVjdCBibnh0ICpicClcbiBcdGh3ci5yeCA9IGJwLVx1MDAzZXJ4X25yX3JpbmdzO1xuIFx0aWYgKGJwLVx1MDAzZWZsYWdzIFx1MDAyNiBCTlhUX0ZMQUdfU0hBUkVEX1JJTkdTKVxuIFx0XHRzaCA9IHRydWU7XG4tXHRpZiAoYnAtXHUwMDNlZmxhZ3MgXHUwMDI2IEJOWFRfRkxBR19DSElQX1A1X1BMVVMpXG4tXHRcdGh3ci5jcF9wNSA9IGh3ci5yeCAmIzQzOyBod3IudHg7XG4mIzQzO1x0aWYgKGJwLVx1MDAzZWZsYWdzIFx1MDAyNiBCTlhUX0ZMQUdfQ0hJUF9QNV9QTFVTKSB7XG4mIzQzO1x0XHRod3IuY3BfcDUgPSBod3IucnggJiM0MzsgaHdyLnR4ICYjNDM7IGJueHRfbXBjX2NwX3JpbmdzX2luX3VzZShicCk7XG4mIzQzO1x0XHRod3IudHggJiM0Mzs9IGJueHRfbXBjX3R4X3JpbmdzX2luX3VzZShicCk7XG4mIzQzO1x0fVxuIFxuIFx0aHdyLnZuaWMgPSBibnh0X2dldF90b3RhbF92bmljcyhicCwgaHdyLnJ4KTtcbiBcbkBAIC04MTk3LDYgJiM0Mzs4Mjg0LDkgQEAgc3RhdGljIGludCBfX2JueHRfcmVzZXJ2ZV9yaW5ncyhzdHJ1Y3QgYm54dCAqYnApXG4gXHRpZiAoYm54dF91bHBfcmVnaXN0ZXJlZChlZGV2KSBcdTAwMjZcdTAwMjYgaHdyLnN0YXQgXHUwMDNlIGJueHRfZ2V0X3VscF9zdGF0X2N0eHMoYnApKVxuIFx0XHRod3Iuc3RhdCAtPSBibnh0X2dldF91bHBfc3RhdF9jdHhzKGJwKTtcbiBcdGh3ci5jcCA9IG1pbl90KGludCwgaHdyLmNwLCBod3Iuc3RhdCk7XG4mIzQzO1x0aHdyLnR4IC09IGJueHRfbXBjX3R4X3JpbmdzX2luX3VzZShicCk7XG4mIzQzO1x0aWYgKGh3ci50eCBcdTAwM2MgMClcbiYjNDM7XHRcdHJldHVybiAtRU5PTUVNO1xuIFx0cmMgPSBibnh0X3RyaW1fcmluZ3MoYnAsIFx1MDAyNnJ4X3JpbmdzLCBcdTAwMjZod3IudHgsIGh3ci5jcCwgc2gpO1xuIFx0aWYgKGJwLVx1MDAzZWZsYWdzIFx1MDAyNiBCTlhUX0ZMQUdfQUdHX1JJTkdTKVxuIFx0XHRod3IucnggPSByeF9yaW5ncyBcdTAwM2NcdTAwM2MgMTtcbkBAIC04Mjc4LDcgJiM0Mzs4MzY4LDcgQEAgc3RhdGljIGludCBibnh0X2h3cm1fY2hlY2tfdmZfcmluZ3Moc3RydWN0IGJueHQgKmJwLCBzdHJ1Y3QgYm54dF9od19yaW5ncyAqaHdyKVxuIHN0YXRpYyBpbnQgYm54dF9od3JtX2NoZWNrX3BmX3JpbmdzKHN0cnVjdCBibnh0ICpicCwgc3RydWN0IGJueHRfaHdfcmluZ3MgKmh3cilcbiB7XG4gXHRzdHJ1Y3QgaHdybV9mdW5jX2NmZ19pbnB1dCAqcmVxO1xuLVx0dTMyIGZsYWdzO1xuJiM0MztcdHUzMiBmbGFncywgZmxhZ3MyID0gMDtcbiBcbiBcdHJlcSA9IF9fYm54dF9od3JtX3Jlc2VydmVfcGZfcmluZ3MoYnAsIGh3cik7XG4gXHRmbGFncyA9IEZVTkNfQ0ZHX1JFUV9GTEFHU19UWF9BU1NFVFNfVEVTVDtcbkBAIC04MjkyLDkgJiM0Mzs4MzgyLDE0IEBAIHN0YXRpYyBpbnQgYm54dF9od3JtX2NoZWNrX3BmX3JpbmdzKHN0cnVjdCBibnh0ICpicCwgc3RydWN0IGJueHRfaHdfcmluZ3MgKmh3cilcbiBcdFx0XHRcdCBGVU5DX0NGR19SRVFfRkxBR1NfTlFfQVNTRVRTX1RFU1Q7XG4gXHRcdGVsc2VcbiBcdFx0XHRmbGFncyB8PSBGVU5DX0NGR19SRVFfRkxBR1NfUklOR19HUlBfQVNTRVRTX1RFU1Q7XG4mIzQzO1x0XHRpZiAocmVxLVx1MDAzZWVuYWJsZXMgXHUwMDI2XG4mIzQzO1x0XHQgICAgY3B1X3RvX2xlMzIoRlVOQ19DRkdfUkVRX0VOQUJMRVNfS1RMU19UWF9LRVlfQ1RYUyB8XG4mIzQzO1x0XHRcdFx0RlVOQ19DRkdfUkVRX0VOQUJMRVNfS1RMU19SWF9LRVlfQ1RYUykpXG4mIzQzO1x0XHRcdGZsYWdzMiB8PSBGVU5DX0NGR19SRVFfRkxBR1MyX0tUTFNfS0VZX0NUWF9BU1NFVFNfVEVTVDtcbiBcdH1cbiBcbiBcdHJlcS1cdTAwM2VmbGFncyA9IGNwdV90b19sZTMyKGZsYWdzKTtcbiYjNDM7XHRyZXEtXHUwMDNlZmxhZ3MyID0gY3B1X3RvX2xlMzIoZmxhZ3MyKTtcbiBcdHJldHVybiBod3JtX3JlcV9zZW5kX3NpbGVudChicCwgcmVxKTtcbiB9XG4gXG5AQCAtOTMzMSwxMiAmIzQzOzk0MjYsMzUgQEAgc3RhdGljIGludCBibnh0X2h3cm1fZnVuY19iYWNraW5nX3N0b3JlX2NmZ192MihzdHJ1Y3QgYm54dCAqYnAsXG4gXG4gc3RhdGljIGludCBibnh0X2JhY2tpbmdfc3RvcmVfY2ZnX3YyKHN0cnVjdCBibnh0ICpicClcbiB7XG4mIzQzO1x0c3RydWN0IGJueHRfY3J5cHRvX2luZm8gKmNyeXB0byA9IGJwLVx1MDAzZWNyeXB0b19pbmZvO1xuJiM0MztcdHN0cnVjdCBibnh0X21wY19pbmZvICptcGMgPSBicC1cdTAwM2VtcGNfaW5mbztcbiBcdHN0cnVjdCBibnh0X2N0eF9tZW1faW5mbyAqY3R4ID0gYnAtXHUwMDNlY3R4O1xuIFx0c3RydWN0IGJueHRfY3R4X21lbV90eXBlICpjdHhtO1xuIFx0dTE2IGxhc3RfdHlwZSA9IEJOWFRfQ1RYX0lOVjtcbiBcdGludCByYyA9IDA7XG4gXHR1MTYgdHlwZTtcbiBcbiYjNDM7XHRpZiAoQk5YVF9TVVBQT1JUU19LVExTKGJwKSkge1xuJiM0MztcdFx0Y3R4bSA9IFx1MDAyNmN0eC1cdTAwM2VjdHhfYXJyW0JOWFRfQ1RYX1RDS107XG4mIzQzO1x0XHRyYyA9IGJueHRfc2V0dXBfY3R4bV9wZ190YmxzKGJwLCBjdHhtLFxuJiM0MztcdFx0XHRcdFx0ICAgICBCTlhUX1RDSyhjcnlwdG8pLm1heF9jdHgsIDEpO1xuJiM0MztcdFx0aWYgKHJjKVxuJiM0MztcdFx0XHRyZXR1cm4gcmM7XG4mIzQzO1x0XHRjdHhtID0gXHUwMDI2Y3R4LVx1MDAzZWN0eF9hcnJbQk5YVF9DVFhfUkNLXTtcbiYjNDM7XHRcdHJjID0gYm54dF9zZXR1cF9jdHhtX3BnX3RibHMoYnAsIGN0eG0sXG4mIzQzO1x0XHRcdFx0XHQgICAgIEJOWFRfUkNLKGNyeXB0bykubWF4X2N0eCwgMSk7XG4mIzQzO1x0XHRpZiAocmMpXG4mIzQzO1x0XHRcdHJldHVybiByYztcbiYjNDM7XHRcdGxhc3RfdHlwZSA9IEJOWFRfQ1RYX1JDSztcbiYjNDM7XHR9XG4mIzQzO1x0aWYgKG1wYyBcdTAwMjZcdTAwMjYgbXBjLVx1MDAzZW1wY19jaG5sc19jYXApIHtcbiYjNDM7XHRcdGN0eG0gPSBcdTAwMjZjdHgtXHUwMDNlY3R4X2FycltCTlhUX0NUWF9NVFFNXTtcbiYjNDM7XHRcdHJjID0gYm54dF9zZXR1cF9jdHhtX3BnX3RibHMoYnAsIGN0eG0sIGN0eG0tXHUwMDNlbWF4X2VudHJpZXMsIDEpO1xuJiM0MztcdFx0aWYgKHJjKVxuJiM0MztcdFx0XHRyZXR1cm4gcmM7XG4mIzQzO1x0XHRsYXN0X3R5cGUgPSBCTlhUX0NUWF9NVFFNO1xuJiM0MztcdH1cbiYjNDM7XG4gXHRmb3IgKHR5cGUgPSBCTlhUX0NUWF9TUlQ7IHR5cGUgXHUwMDNjPSBCTlhUX0NUWF9RUEM7IHR5cGUmIzQzOyYjNDM7KSB7XG4gXHRcdGN0eG0gPSBcdTAwMjZjdHgtXHUwMDNlY3R4X2Fyclt0eXBlXTtcbiBcdFx0aWYgKCFibnh0X2JzX3RyYWNlX2F2YWlsKGJwLCB0eXBlKSlcbkBAIC05Njg1LDYgJiM0Mzs5ODAzLDcgQEAgaW50IGJueHRfaHdybV9mdW5jX3Jlc2NfcWNhcHMoc3RydWN0IGJueHQgKmJwLCBib29sIGFsbClcbiBcdHN0cnVjdCBod3JtX2Z1bmNfcmVzb3VyY2VfcWNhcHNfb3V0cHV0ICpyZXNwO1xuIFx0c3RydWN0IGh3cm1fZnVuY19yZXNvdXJjZV9xY2Fwc19pbnB1dCAqcmVxO1xuIFx0c3RydWN0IGJueHRfaHdfcmVzYyAqaHdfcmVzYyA9IFx1MDAyNmJwLVx1MDAzZWh3X3Jlc2M7XG4mIzQzO1x0c3RydWN0IGJueHRfaHdfY3J5cHRvX3Jlc2MgKmNyeXB0b19yZXNjO1xuIFx0aW50IHJjO1xuIFxuIFx0cmMgPSBod3JtX3JlcV9pbml0KGJwLCByZXEsIEhXUk1fRlVOQ19SRVNPVVJDRV9RQ0FQUyk7XG5AQCAtOTcyMiw2ICYjNDM7OTg0MSwxMiBAQCBpbnQgYm54dF9od3JtX2Z1bmNfcmVzY19xY2FwcyhzdHJ1Y3QgYm54dCAqYnAsIGJvb2wgYWxsKVxuIFx0ICAgIGh3X3Jlc2MtXHUwMDNlbWF4X3ZuaWNzICogQk5YVF9MQVJHRV9SU1NfVE9fVk5JQ19SQVRJTylcbiBcdFx0YnAtXHUwMDNlcnNzX2NhcCB8PSBCTlhUX1JTU19DQVBfTEFSR0VfUlNTX0NUWDtcbiBcbiYjNDM7XHRjcnlwdG9fcmVzYyA9IFx1MDAyNmh3X3Jlc2MtXHUwMDNlY3J5cHRvX3Jlc2M7XG4mIzQzO1x0Y3J5cHRvX3Jlc2MtXHUwMDNlbWluX3R4X2tleV9jdHhzID0gbGUzMl90b19jcHUocmVzcC1cdTAwM2VtaW5fa3Rsc190eF9rZXlfY3R4cyk7XG4mIzQzO1x0Y3J5cHRvX3Jlc2MtXHUwMDNlbWF4X3R4X2tleV9jdHhzID0gbGUzMl90b19jcHUocmVzcC1cdTAwM2VtYXhfa3Rsc190eF9rZXlfY3R4cyk7XG4mIzQzO1x0Y3J5cHRvX3Jlc2MtXHUwMDNlbWluX3J4X2tleV9jdHhzID0gbGUzMl90b19jcHUocmVzcC1cdTAwM2VtaW5fa3Rsc19yeF9rZXlfY3R4cyk7XG4mIzQzO1x0Y3J5cHRvX3Jlc2MtXHUwMDNlbWF4X3J4X2tleV9jdHhzID0gbGUzMl90b19jcHUocmVzcC1cdTAwM2VtYXhfa3Rsc19yeF9rZXlfY3R4cyk7XG4mIzQzO1xuIFx0aWYgKGJwLVx1MDAzZWZsYWdzIFx1MDAyNiBCTlhUX0ZMQUdfQ0hJUF9QNV9QTFVTKSB7XG4gXHRcdHUxNiBtYXhfbXNpeCA9IGxlMTZfdG9fY3B1KHJlc3AtXHUwMDNlbWF4X21zaXgpO1xuIFxuQEAgLTk4NzEsNiAmIzQzOzk5OTYsMTAgQEAgc3RhdGljIGludCBfX2JueHRfaHdybV9mdW5jX3FjYXBzKHN0cnVjdCBibnh0ICpicClcbiBcdFx0YnAtXHUwMDNlZndfY2FwIHw9IEJOWFRfRldfQ0FQX0JBQ0tJTkdfU1RPUkVfVjI7XG4gXHRpZiAoZmxhZ3NfZXh0IFx1MDAyNiBGVU5DX1FDQVBTX1JFU1BfRkxBR1NfRVhUX1RYX0NPQUxfQ01QTF9DQVApXG4gXHRcdGJwLVx1MDAzZWZsYWdzIHw9IEJOWFRfRkxBR19UWF9DT0FMX0NNUEw7XG4mIzQzO1x0aWYgKGZsYWdzX2V4dCBcdTAwMjYgRlVOQ19RQ0FQU19SRVNQX0ZMQUdTX0VYVF9LVExTX1NVUFBPUlRFRClcbiYjNDM7XHRcdGJueHRfYWxsb2NfY3J5cHRvX2luZm8oYnAsIHJlc3ApO1xuJiM0MztcdGVsc2VcbiYjNDM7XHRcdGJwLVx1MDAzZWZ3X2NhcCBcdTAwMjY9IH5CTlhUX0ZXX0NBUF9LVExTO1xuIFxuIFx0ZmxhZ3NfZXh0MiA9IGxlMzJfdG9fY3B1KHJlc3AtXHUwMDNlZmxhZ3NfZXh0Mik7XG4gXHRpZiAoZmxhZ3NfZXh0MiBcdTAwMjYgRlVOQ19RQ0FQU19SRVNQX0ZMQUdTX0VYVDJfUlhfQUxMX1BLVFNfVElNRVNUQU1QU19TVVBQT1JURUQpXG5AQCAtOTk0Myw2ICYjNDM7MTAwNzIsMTEgQEAgc3RhdGljIGludCBfX2JueHRfaHdybV9mdW5jX3FjYXBzKHN0cnVjdCBibnh0ICpicClcbiBcdH1cbiBcdGJwLVx1MDAzZXRzb19tYXhfc2VncyA9IGxlMTZfdG9fY3B1KHJlc3AtXHUwMDNlbWF4X3Rzb19zZWdzKTtcbiBcbiYjNDM7XHRpZiAocmVzcC1cdTAwM2VtcGNfY2hubHNfY2FwKVxuJiM0MztcdFx0Ym54dF9hbGxvY19tcGNfaW5mbyhicCwgcmVzcC1cdTAwM2VtcGNfY2hubHNfY2FwKTtcbiYjNDM7XHRlbHNlXG4mIzQzO1x0XHRibnh0X2ZyZWVfbXBjX2luZm8oYnApO1xuJiM0MztcbiBod3JtX2Z1bmNfcWNhcHNfZXhpdDpcbiBcdGh3cm1fcmVxX2Ryb3AoYnAsIHJlcSk7XG4gXHRyZXR1cm4gcmM7XG5AQCAtMTEzMjEsNiAmIzQzOzExNDU1LDcgQEAgc3RhdGljIGludCBibnh0X2luaXRfbmljKHN0cnVjdCBibnh0ICpicCwgYm9vbCBpcnFfcmVfaW5pdClcbiBcdGJueHRfaW5pdF9jcF9yaW5ncyhicCk7XG4gXHRibnh0X2luaXRfcnhfcmluZ3MoYnApO1xuIFx0Ym54dF9pbml0X3R4X3JpbmdzKGJwKTtcbiYjNDM7XHRibnh0X2luaXRfbXBjX3JpbmdzKGJwKTtcbiBcdGJueHRfaW5pdF9yaW5nX2dycHMoYnAsIGlycV9yZV9pbml0KTtcbiBcdGJueHRfaW5pdF92bmljcyhicCk7XG4gXG5AQCAtMTE1MDksMTQgJiM0MzsxMTY0NCwxNSBAQCB1bnNpZ25lZCBpbnQgYm54dF9nZXRfbWF4X2Z1bmNfY3BfcmluZ3Moc3RydWN0IGJueHQgKmJwKVxuIFx0cmV0dXJuIGJwLVx1MDAzZWh3X3Jlc2MubWF4X2NwX3JpbmdzO1xuIH1cbiBcbi1zdGF0aWMgdW5zaWduZWQgaW50IGJueHRfZ2V0X21heF9mdW5jX2NwX3JpbmdzX2Zvcl9lbihzdHJ1Y3QgYm54dCAqYnApXG4mIzQzO3N0YXRpYyB1bnNpZ25lZCBpbnQgYm54dF9nZXRfbWF4X2Z1bmNfY3BfcmluZ3NfZm9yX2VuKHN0cnVjdCBibnh0ICpicCxcbiYjNDM7XHRcdFx0XHRcdFx0ICAgICAgdW5zaWduZWQgaW50IG1wY19jcClcbiB7XG4gXHR1bnNpZ25lZCBpbnQgY3AgPSBicC1cdTAwM2Vod19yZXNjLm1heF9jcF9yaW5ncztcbiBcbiBcdGlmICghKGJwLVx1MDAzZWZsYWdzIFx1MDAyNiBCTlhUX0ZMQUdfQ0hJUF9QNV9QTFVTKSlcbiBcdFx0Y3AgLT0gYm54dF9nZXRfdWxwX21zaXhfbnVtKGJwKTtcbiBcbi1cdHJldHVybiBjcDtcbiYjNDM7XHRyZXR1cm4gbXBjX2NwIFx1MDAzZT0gY3AgPyAwIDogY3AgLSBtcGNfY3A7XG4gfVxuIFxuIHN0YXRpYyB1bnNpZ25lZCBpbnQgYm54dF9nZXRfbWF4X2Z1bmNfaXJxcyhzdHJ1Y3QgYm54dCAqYnApXG5AQCAtMTE1MzgsNyAmIzQzOzExNjc0LDcgQEAgdW5zaWduZWQgaW50IGJueHRfZ2V0X2F2YWlsX2NwX3JpbmdzX2Zvcl9lbihzdHJ1Y3QgYm54dCAqYnApXG4ge1xuIFx0dW5zaWduZWQgaW50IGNwO1xuIFxuLVx0Y3AgPSBibnh0X2dldF9tYXhfZnVuY19jcF9yaW5nc19mb3JfZW4oYnApO1xuJiM0MztcdGNwID0gYm54dF9nZXRfbWF4X2Z1bmNfY3BfcmluZ3NfZm9yX2VuKGJwLCBibnh0X21wY19jcF9yaW5nc19pbl91c2UoYnApKTtcbiBcdGlmIChicC1cdTAwM2VmbGFncyBcdTAwMjYgQk5YVF9GTEFHX0NISVBfUDVfUExVUylcbiBcdFx0cmV0dXJuIGNwIC0gYnAtXHUwMDNlcnhfbnJfcmluZ3MgLSBicC1cdTAwM2V0eF9ucl9yaW5ncztcbiBcdGVsc2VcbkBAIC0xMjgwMSw2ICYjNDM7MTI5MzcsOCBAQCBzdGF0aWMgaW50IGJueHRfaHdybV9pZl9jaGFuZ2Uoc3RydWN0IGJueHQgKmJwLCBib29sIHVwKVxuIFx0XHRcdFx0Ym54dF91bHBfaXJxX3N0b3AoYnApO1xuIFx0XHRcdGJueHRfZnJlZV9jdHhfbWVtKGJwLCBmYWxzZSk7XG4gXHRcdFx0Ym54dF9kY2JfZnJlZShicCk7XG4mIzQzO1x0XHRcdGlmIChmd19yZXNldCB8fCBjYXBzX2NoYW5nZSlcbiYjNDM7XHRcdFx0XHRibnh0X2NsZWFyX2NyeXB0byhicCk7XG4gXHRcdFx0cmMgPSBibnh0X2Z3X2luaXRfb25lKGJwKTtcbiBcdFx0XHRpZiAocmMpIHtcbiBcdFx0XHRcdGNsZWFyX2JpdChCTlhUX1NUQVRFX0ZXX1JFU0VUX0RFVCwgXHUwMDI2YnAtXHUwMDNlc3RhdGUpO1xuQEAgLTEzMTcwLDYgJiM0MzsxMzMwOCw3IEBAIHN0YXRpYyBpbnQgX19ibnh0X29wZW5fbmljKHN0cnVjdCBibnh0ICpicCwgYm9vbCBpcnFfcmVfaW5pdCwgYm9vbCBsaW5rX3JlX2luaXQpXG4gXHRcdHJldHVybiByYztcbiBcbiBcdGJueHRfYWRqX3R4X3JpbmdzKGJwKTtcbiYjNDM7XHRibnh0X3RyaW1fbXBjX3JpbmdzKGJwKTtcbiBcdHJjID0gYm54dF9hbGxvY19tZW0oYnAsIGlycV9yZV9pbml0KTtcbiBcdGlmIChyYykge1xuIFx0XHRuZXRkZXZfZXJyKGJwLVx1MDAzZWRldiwgXCYjMzQ7Ym54dF9hbGxvY19tZW0gZXJyOiAleFxcblwmIzM0OywgcmMpO1xuQEAgLTEzMjIyLDYgJiM0MzsxMzM2MSw3IEBAIHN0YXRpYyBpbnQgX19ibnh0X29wZW5fbmljKHN0cnVjdCBibnh0ICpicCwgYm9vbCBpcnFfcmVfaW5pdCwgYm9vbCBsaW5rX3JlX2luaXQpXG4gXHRcdHN0YXRpY19icmFuY2hfZGlzYWJsZShcdTAwMjZibnh0X3hkcF9sb2NraW5nX2tleSk7XG4gXHR9XG4gXHRzZXRfYml0KEJOWFRfU1RBVEVfT1BFTiwgXHUwMDI2YnAtXHUwMDNlc3RhdGUpO1xuJiM0MztcdGJueHRfa3Rsc193YWtlKGJwKTtcbiBcdGJueHRfZW5hYmxlX2ludChicCk7XG4gXHQvKiBFbmFibGUgVFggcXVldWVzICovXG4gXHRibnh0X3R4X2VuYWJsZShicCk7XG5AQCAtMTMzNjMsNyAmIzQzOzEzNTAzLDggQEAgc3RhdGljIGludCBibnh0X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldilcbiBzdGF0aWMgYm9vbCBibnh0X2Rydl9idXN5KHN0cnVjdCBibnh0ICpicClcbiB7XG4gXHRyZXR1cm4gKHRlc3RfYml0KEJOWFRfU1RBVEVfSU5fU1BfVEFTSywgXHUwMDI2YnAtXHUwMDNlc3RhdGUpIHx8XG4tXHRcdHRlc3RfYml0KEJOWFRfU1RBVEVfUkVBRF9TVEFUUywgXHUwMDI2YnAtXHUwMDNlc3RhdGUpKTtcbiYjNDM7XHRcdHRlc3RfYml0KEJOWFRfU1RBVEVfUkVBRF9TVEFUUywgXHUwMDI2YnAtXHUwMDNlc3RhdGUpIHx8XG4mIzQzO1x0XHRibnh0X2t0bHNfYnVzeShicCkpO1xuIH1cbiBcbiBzdGF0aWMgdm9pZCBibnh0X2dldF9yaW5nX3N0YXRzKHN0cnVjdCBibnh0ICpicCxcbkBAIC0xMzM4MSw5ICYjNDM7MTM1MjIsMjAgQEAgc3RhdGljIHZvaWQgX19ibnh0X2Nsb3NlX25pYyhzdHJ1Y3QgYm54dCAqYnAsIGJvb2wgaXJxX3JlX2luaXQsXG4gXG4gXHRjbGVhcl9iaXQoQk5YVF9TVEFURV9PUEVOLCBcdTAwMjZicC1cdTAwM2VzdGF0ZSk7XG4gXHRzbXBfbWJfX2FmdGVyX2F0b21pYygpO1xuJiM0MztcdC8qIFdha2UgYW55IGtUTFMgZGVsZXRlIHdhaXRpbmcgb24gYSByZWNvbmZpZyBzbyBpdCByZS1ldmFsdWF0ZXMgYW5kXG4mIzQzO1x0ICogZWl0aGVyIGtlZXBzIHdhaXRpbmcgZm9yIHRoZSByZW9wZW4gb3IgYWJvcnRzIChpZmRvd24gLyBGVyByZXNldCkuXG4mIzQzO1x0ICovXG4mIzQzO1x0Ym54dF9rdGxzX3dha2UoYnApO1xuIFx0d2hpbGUgKGJueHRfZHJ2X2J1c3koYnApKVxuIFx0XHRtc2xlZXAoMjApO1xuIFxuJiM0MztcdC8qIERlbGV0ZSBhbGwgY3J5cHRvIGNvbm5lY3Rpb25zIGFuZCBLSURzIG9ubHkgb24gaWZkb3duIGFuZCBGVyByZXNldCxcbiYjNDM7XHQgKiBub3QgZXRodG9vbCBjb25maWcgY2hhbmdlcy5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAoIW5ldGlmX3J1bm5pbmcoYnAtXHUwMDNlZGV2KSB8fFxuJiM0MztcdCAgICB0ZXN0X2JpdChCTlhUX1NUQVRFX0lOX0ZXX1JFU0VULCBcdTAwMjZicC1cdTAwM2VzdGF0ZSkpXG4mIzQzO1x0XHRibnh0X2NyeXB0b19kZWxfYWxsKGJwKTtcbiYjNDM7XG4gXHRpZiAoQk5YVF9TVVBQT1JUU19NVUxUSV9SU1NfQ1RYKGJwKSlcbiBcdFx0Ym54dF9jbGVhcl9yc3NfY3R4cyhicCk7XG4gXHQvKiBGbHVzaCByaW5ncyBhbmQgZGlzYWJsZSBpbnRlcnJ1cHRzICovXG5AQCAtMTQzMjAsNyAmIzQzOzE0NDcyLDcgQEAgc3RhdGljIGludCBibnh0X2h3cm1fcnhfcmluZ19yZXNldChzdHJ1Y3QgYm54dCAqYnAsIGludCByaW5nX25yKVxuIFx0cmV0dXJuIGh3cm1fcmVxX3NlbmRfc2lsZW50KGJwLCByZXEpO1xuIH1cbiBcbi1zdGF0aWMgdm9pZCBibnh0X3Jlc2V0X3Rhc2soc3RydWN0IGJueHQgKmJwLCBib29sIHNpbGVudClcbiYjNDM7dm9pZCBibnh0X3Jlc2V0X3Rhc2soc3RydWN0IGJueHQgKmJwLCBib29sIHNpbGVudClcbiB7XG4gXHRpZiAoIXNpbGVudClcbiBcdFx0Ym54dF9kYmdfZHVtcF9zdGF0ZXMoYnApO1xuQEAgLTE0NTM3LDYgJiM0MzsxNDY4OSw3IEBAIHN0YXRpYyB2b2lkIGJueHRfZndfcmVzZXRfY2xvc2Uoc3RydWN0IGJueHQgKmJwKVxuIFx0Ym54dF9od3JtX2Z1bmNfZHJ2X3Vucmd0cihicCk7XG4gXHRpZiAocGNpX2lzX2VuYWJsZWQoYnAtXHUwMDNlcGRldikpXG4gXHRcdHBjaV9kaXNhYmxlX2RldmljZShicC1cdTAwM2VwZGV2KTtcbiYjNDM7XHRibnh0X2NsZWFyX2NyeXB0byhicCk7XG4gXHRibnh0X2ZyZWVfY3R4X21lbShicCwgZmFsc2UpO1xuIH1cbiBcbkBAIC0xNDc2OCw2ICYjNDM7MTQ5MjEsMTMgQEAgc3RhdGljIHZvaWQgYm54dF91bHBfcmVzdGFydChzdHJ1Y3QgYm54dCAqYnApXG4gXHRibnh0X3VscF9zdGFydChicCk7XG4gfVxuIFxuJiM0MztzdGF0aWMgdm9pZCBibnh0X21wY19yaW5nX3Jlc2V0X3NwKHN0cnVjdCBibnh0ICpicClcbiYjNDM7e1xuJiM0MztcdGJueHRfcnRubF9sb2NrX3NwKGJwKTtcbiYjNDM7XHRibnh0X21wY19yaW5nX3Jlc2V0X3Rhc2soYnApO1xuJiM0MztcdGJueHRfcnRubF91bmxvY2tfc3AoYnApO1xuJiM0Mzt9XG4mIzQzO1xuIHN0YXRpYyB2b2lkIGJueHRfc3BfdGFzayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspXG4ge1xuIFx0c3RydWN0IGJueHQgKmJwID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBibnh0LCBzcF90YXNrKTtcbkBAIC0xNDg2MCw2ICYjNDM7MTUwMjAsOSBAQCBzdGF0aWMgdm9pZCBibnh0X3NwX3Rhc2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKVxuIFx0aWYgKHRlc3RfYW5kX2NsZWFyX2JpdChCTlhUX1JTVF9SSU5HX1NQX0VWRU5ULCBcdTAwMjZicC1cdTAwM2VzcF9ldmVudCkpXG4gXHRcdGJueHRfcnhfcmluZ19yZXNldChicCk7XG4gXG4mIzQzO1x0aWYgKHRlc3RfYW5kX2NsZWFyX2JpdChCTlhUX01QQ19SRVNFVF9TUF9FVkVOVCwgXHUwMDI2YnAtXHUwMDNlc3BfZXZlbnQpKVxuJiM0MztcdFx0Ym54dF9tcGNfcmluZ19yZXNldF9zcChicCk7XG4mIzQzO1xuIFx0aWYgKHRlc3RfYW5kX2NsZWFyX2JpdChCTlhUX0ZXX1JFU0VUX05PVElGWV9TUF9FVkVOVCwgXHUwMDI2YnAtXHUwMDNlc3BfZXZlbnQpKSB7XG4gXHRcdGlmICh0ZXN0X2JpdChCTlhUX1NUQVRFX0ZXX0ZBVEFMX0NPTkQsIFx1MDAyNmJwLVx1MDAzZXN0YXRlKSB8fFxuIFx0XHQgICAgdGVzdF9iaXQoQk5YVF9TVEFURV9GV19OT05fRkFUQUxfQ09ORCwgXHUwMDI2YnAtXHUwMDNlc3RhdGUpKVxuQEAgLTE0ODc4LDExICYjNDM7MTUwNDEsMTEgQEAgc3RhdGljIHZvaWQgYm54dF9zcF90YXNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaylcbiB9XG4gXG4gc3RhdGljIHZvaWQgX2JueHRfZ2V0X21heF9yaW5ncyhzdHJ1Y3QgYm54dCAqYnAsIGludCAqbWF4X3J4LCBpbnQgKm1heF90eCxcbi1cdFx0XHRcdGludCAqbWF4X2NwKTtcbiYjNDM7XHRcdFx0XHRpbnQgKm1heF9jcCwgaW50IG1wY190eCwgaW50IG1wY19jcCk7XG4gXG4gLyogVW5kZXIgbmV0ZGV2IGluc3RhbmNlIGxvY2sgKi9cbiBpbnQgYm54dF9jaGVja19yaW5ncyhzdHJ1Y3QgYm54dCAqYnAsIGludCB0eCwgaW50IHJ4LCBib29sIHNoLCBpbnQgdGNzLFxuLVx0XHQgICAgIGludCB0eF94ZHApXG4mIzQzO1x0XHQgICAgIGludCB0eF94ZHAsIGludCBtcGNfdHgsIGludCBtcGNfY3ApXG4ge1xuIFx0aW50IG1heF9yeCwgbWF4X3R4LCBtYXhfY3AsIHR4X3NldHMgPSAxLCB0eF9jcDtcbiBcdHN0cnVjdCBibnh0X2h3X3JpbmdzIGh3ciA9IHswfTtcbkBAIC0xNDg5Miw3ICYjNDM7MTUwNTUsNyBAQCBpbnQgYm54dF9jaGVja19yaW5ncyhzdHJ1Y3QgYm54dCAqYnAsIGludCB0eCwgaW50IHJ4LCBib29sIHNoLCBpbnQgdGNzLFxuIFx0aWYgKHRjcylcbiBcdFx0dHhfc2V0cyA9IHRjcztcbiBcbi1cdF9ibnh0X2dldF9tYXhfcmluZ3MoYnAsIFx1MDAyNm1heF9yeCwgXHUwMDI2bWF4X3R4LCBcdTAwMjZtYXhfY3ApO1xuJiM0MztcdF9ibnh0X2dldF9tYXhfcmluZ3MoYnAsIFx1MDAyNm1heF9yeCwgXHUwMDI2bWF4X3R4LCBcdTAwMjZtYXhfY3AsIG1wY190eCwgbXBjX2NwKTtcbiBcbiBcdGlmIChtYXhfcnggXHUwMDNjIHJ4X3JpbmdzKVxuIFx0XHRyZXR1cm4gLUVOT01FTTtcbkBAIC0xNDkxOCw4ICYjNDM7MTUwODEsMTAgQEAgaW50IGJueHRfY2hlY2tfcmluZ3Moc3RydWN0IGJueHQgKmJwLCBpbnQgdHgsIGludCByeCwgYm9vbCBzaCwgaW50IHRjcyxcbiBcdFx0aHdyLmdycCA9IHJ4O1xuIFx0XHRod3IucnNzX2N0eCA9IGJueHRfZ2V0X3RvdGFsX3Jzc19jdHhzKGJwLCBcdTAwMjZod3IpO1xuIFx0fVxuLVx0aWYgKGJwLVx1MDAzZWZsYWdzIFx1MDAyNiBCTlhUX0ZMQUdfQ0hJUF9QNV9QTFVTKVxuLVx0XHRod3IuY3BfcDUgPSBod3IudHggJiM0Mzsgcng7XG4mIzQzO1x0aWYgKGJwLVx1MDAzZWZsYWdzIFx1MDAyNiBCTlhUX0ZMQUdfQ0hJUF9QNV9QTFVTKSB7XG4mIzQzO1x0XHRod3IuY3BfcDUgPSBod3IudHggJiM0MzsgcnggJiM0MzsgbXBjX2NwO1xuJiM0MztcdFx0aHdyLnR4ICYjNDM7PSBtcGNfdHg7XG4mIzQzO1x0fVxuIFx0cmMgPSBibnh0X2h3cm1fY2hlY2tfcmluZ3MoYnAsIFx1MDAyNmh3cik7XG4gXHRpZiAoIXJjIFx1MDAyNlx1MDAyNiBwY2lfbXNpeF9jYW5fYWxsb2NfZHluKGJwLVx1MDAzZXBkZXYpKSB7XG4gXHRcdGlmICghYm54dF91bHBfcmVnaXN0ZXJlZChicC1cdTAwM2VlZGV2W0JOWFRfQVVYREVWX1JETUFdKSkge1xuQEAgLTE1NjQwLDcgJiM0MzsxNTgwNSw5IEBAIGludCBibnh0X3NldHVwX21xX3RjKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IHRjKVxuIFx0XHRzaCA9IHRydWU7XG4gXG4gXHRyYyA9IGJueHRfY2hlY2tfcmluZ3MoYnAsIGJwLVx1MDAzZXR4X25yX3JpbmdzX3Blcl90YywgYnAtXHUwMDNlcnhfbnJfcmluZ3MsXG4tXHRcdFx0ICAgICAgc2gsIHRjLCBicC1cdTAwM2V0eF9ucl9yaW5nc194ZHApO1xuJiM0MztcdFx0XHQgICAgICBzaCwgdGMsIGJwLVx1MDAzZXR4X25yX3JpbmdzX3hkcCxcbiYjNDM7XHRcdFx0ICAgICAgYm54dF9tcGNfdHhfcmluZ3NfaW5fdXNlKGJwKSxcbiYjNDM7XHRcdFx0ICAgICAgYm54dF9tcGNfY3BfcmluZ3NfaW5fdXNlKGJwKSk7XG4gXHRpZiAocmMpXG4gXHRcdHJldHVybiByYztcbiBcbkBAIC0xNjU0Nyw2ICYjNDM7MTY3MTQsOCBAQCBzdGF0aWMgdm9pZCBibnh0X3JlbW92ZV9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpXG4gXHRicC1cdTAwM2VwdHBfY2ZnID0gTlVMTDtcbiBcdGtmcmVlKGJwLVx1MDAzZWZ3X2hlYWx0aCk7XG4gXHRicC1cdTAwM2Vmd19oZWFsdGggPSBOVUxMO1xuJiM0MztcdGJueHRfZnJlZV9jcnlwdG9faW5mbyhicCk7XG4mIzQzO1x0Ym54dF9mcmVlX21wY19pbmZvKGJwKTtcbiBcdGJueHRfY2xlYW51cF9wY2koYnApO1xuIFx0Ym54dF9mcmVlX2N0eF9tZW0oYnAsIHRydWUpO1xuIFx0Ym54dF9mcmVlX2NyYXNoX2R1bXBfbWVtKGJwKTtcbkBAIC0xNjYxMSwxNCAmIzQzOzE2NzgwLDE0IEBAIHN0YXRpYyBpbnQgYm54dF9nZXRfbWF4X2lycShzdHJ1Y3QgcGNpX2RldiAqcGRldilcbiB9XG4gXG4gc3RhdGljIHZvaWQgX2JueHRfZ2V0X21heF9yaW5ncyhzdHJ1Y3QgYm54dCAqYnAsIGludCAqbWF4X3J4LCBpbnQgKm1heF90eCxcbi1cdFx0XHRcdGludCAqbWF4X2NwKVxuJiM0MztcdFx0XHRcdGludCAqbWF4X2NwLCBpbnQgbXBjX3R4LCBpbnQgbXBjX2NwKVxuIHtcbiBcdHN0cnVjdCBibnh0X2h3X3Jlc2MgKmh3X3Jlc2MgPSBcdTAwMjZicC1cdTAwM2Vod19yZXNjO1xuIFx0aW50IG1heF9yaW5nX2dycHMgPSAwLCBtYXhfaXJxO1xuIFxuLVx0Km1heF90eCA9IGh3X3Jlc2MtXHUwMDNlbWF4X3R4X3JpbmdzO1xuJiM0MztcdCptYXhfdHggPSBtYXgoMCwgKGludClod19yZXNjLVx1MDAzZW1heF90eF9yaW5ncyAtIG1wY190eCk7XG4gXHQqbWF4X3J4ID0gaHdfcmVzYy1cdTAwM2VtYXhfcnhfcmluZ3M7XG4tXHQqbWF4X2NwID0gYm54dF9nZXRfbWF4X2Z1bmNfY3BfcmluZ3NfZm9yX2VuKGJwKTtcbiYjNDM7XHQqbWF4X2NwID0gYm54dF9nZXRfbWF4X2Z1bmNfY3BfcmluZ3NfZm9yX2VuKGJwLCBtcGNfY3ApO1xuIFx0bWF4X2lycSA9IG1pbl90KGludCwgYm54dF9nZXRfbWF4X2Z1bmNfaXJxcyhicCkgLVxuIFx0XHRcdGJueHRfZ2V0X3VscF9tc2l4X251bV9pbl91c2UoYnApLFxuIFx0XHRcdGh3X3Jlc2MtXHUwMDNlbWF4X3N0YXRfY3R4cyAtXG5AQCAtMTY2NTAsNyAmIzQzOzE2ODE5LDggQEAgaW50IGJueHRfZ2V0X21heF9yaW5ncyhzdHJ1Y3QgYm54dCAqYnAsIGludCAqbWF4X3J4LCBpbnQgKm1heF90eCwgYm9vbCBzaGFyZWQpXG4ge1xuIFx0aW50IHJ4LCB0eCwgY3A7XG4gXG4tXHRfYm54dF9nZXRfbWF4X3JpbmdzKGJwLCBcdTAwMjZyeCwgXHUwMDI2dHgsIFx1MDAyNmNwKTtcbiYjNDM7XHRfYm54dF9nZXRfbWF4X3JpbmdzKGJwLCBcdTAwMjZyeCwgXHUwMDI2dHgsIFx1MDAyNmNwLCBibnh0X21wY190eF9yaW5nc19pbl91c2UoYnApLFxuJiM0MztcdFx0XHQgICAgYm54dF9tcGNfY3BfcmluZ3NfaW5fdXNlKGJwKSk7XG4gXHQqbWF4X3J4ID0gcng7XG4gXHQqbWF4X3R4ID0gdHg7XG4gXHRpZiAoIXJ4IHx8ICF0eCB8fCAhY3ApXG5AQCAtMTY3MTMsNiAmIzQzOzE2ODgzLDcgQEAgc3RhdGljIHZvaWQgYm54dF90cmltX2RmbHRfc2hfcmluZ3Moc3RydWN0IGJueHQgKmJwKVxuIFx0YnAtXHUwMDNlcnhfbnJfcmluZ3MgPSBicC1cdTAwM2VjcF9ucl9yaW5ncztcbiBcdGJwLVx1MDAzZXR4X25yX3JpbmdzX3Blcl90YyA9IGJwLVx1MDAzZWNwX25yX3JpbmdzO1xuIFx0YnAtXHUwMDNldHhfbnJfcmluZ3MgPSBibnh0X3R4X25yX3JpbmdzKGJwKTtcbiYjNDM7XHRibnh0X3RyaW1fbXBjX3JpbmdzKGJwKTtcbiB9XG4gXG4gc3RhdGljIHZvaWQgYm54dF9hZGpfZGZsdF9yaW5ncyhzdHJ1Y3QgYm54dCAqYnAsIGJvb2wgc2gpXG5AQCAtMTY3NjQsNiAmIzQzOzE2OTM1LDggQEAgc3RhdGljIGludCBibnh0X3NldF9kZmx0X3JpbmdzKHN0cnVjdCBibnh0ICpicCwgYm9vbCBzaClcbiBcdFx0Ym54dF9zZXRfZGZsdF91bHBfc3RhdF9jdHhzKGJwKTtcbiBcdH1cbiBcbiYjNDM7XHRibnh0X3NldF9kZmx0X21wY19yaW5ncyhicCk7XG4mIzQzO1xuIFx0cmMgPSBfX2JueHRfcmVzZXJ2ZV9yaW5ncyhicCk7XG4gXHRpZiAocmMgXHUwMDI2XHUwMDI2IHJjICE9IC1FTk9ERVYpXG4gXHRcdG5ldGRldl93YXJuKGJwLVx1MDAzZWRldiwgXCYjMzQ7VW5hYmxlIHRvIHJlc2VydmUgdHggcmluZ3NcXG5cJiMzNDspO1xuQEAgLTE2Nzc4LDYgJiM0MzsxNjk1MSwxMSBAQCBzdGF0aWMgaW50IGJueHRfc2V0X2RmbHRfcmluZ3Moc3RydWN0IGJueHQgKmJwLCBib29sIHNoKVxuIFx0XHRpZiAocmMgXHUwMDI2XHUwMDI2IHJjICE9IC1FTk9ERVYpXG4gXHRcdFx0bmV0ZGV2X3dhcm4oYnAtXHUwMDNlZGV2LCBcJiMzNDsybmQgcmluZ3MgcmVzZXJ2YXRpb24gZmFpbGVkLlxcblwmIzM0Oyk7XG4gXHRcdGJueHRfYWRqX3R4X3JpbmdzKGJwKTtcbiYjNDM7XHRcdC8qIFJlLWNhcCBNUEMgcmluZyBjb3VudHMgYWdhaW5zdCB0aGUgcmVkdWNlZCBUWCByaW5ncy5cbiYjNDM7XHRcdCAqIEFueSBleHRyYSByZXNlcnZlZCBNUEMgcmluZ3Mgd2lsbCBiZSByZWNvbmNpbGVkIG9uXG4mIzQzO1x0XHQgKiB0aGUgbmV4dCBvcGVuLlxuJiM0MztcdFx0ICovXG4mIzQzO1x0XHRibnh0X3RyaW1fbXBjX3JpbmdzKGJwKTtcbiBcdH1cbiBcdGlmIChCTlhUX0NISVBfVFlQRV9OSVRST19BMChicCkpIHtcbiBcdFx0YnAtXHUwMDNlcnhfbnJfcmluZ3MmIzQzOyYjNDM7O1xuQEAgLTE2ODEyLDYgJiM0MzsxNjk5MCw3IEBAIHN0YXRpYyBpbnQgYm54dF9pbml0X2RmbHRfcmluZ19tb2RlKHN0cnVjdCBibnh0ICpicClcbiBcdFx0Z290byBpbml0X2RmbHRfcmluZ19lcnI7XG4gXG4gXHRibnh0X2Fkal90eF9yaW5ncyhicCk7XG4mIzQzO1x0Ym54dF90cmltX21wY19yaW5ncyhicCk7XG4gXG4gXHRibnh0X3NldF9kZmx0X3JmcyhicCk7XG4gXG5AQCAtMTcxNTUsNiAmIzQzOzE3MzM0LDcgQEAgc3RhdGljIGludCBibnh0X2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KVxuIFx0ICogbGltaXRlZCBNU0lYLCBzbyB3ZSByZS1pbml0aWFsaXplIHRoZSBUWCByaW5ncyBwZXIgVEMuXG4gXHQgKi9cbiBcdGJwLVx1MDAzZXR4X25yX3JpbmdzX3Blcl90YyA9IGJwLVx1MDAzZXR4X25yX3JpbmdzO1xuJiM0MztcdGJueHRfdHJpbV9tcGNfcmluZ3MoYnApO1xuIFxuIFx0aWYgKEJOWFRfUEYoYnApKSB7XG4gXHRcdGlmICghYm54dF9wZl93cSkge1xuQEAgLTE3MTc2LDYgJiM0MzsxNzM1NiwxMiBAQCBzdGF0aWMgaW50IGJueHRfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpXG4gXHRyYyA9IGJueHRfZGxfcmVnaXN0ZXIoYnApO1xuIFx0aWYgKHJjKVxuIFx0XHRnb3RvIGluaXRfZXJyX2RsO1xuJiM0MztcdHJjID0gYm54dF9jcnlwdG9faW5pdChicCk7XG4mIzQzO1x0aWYgKHJjKSB7XG4mIzQzO1x0XHRibnh0X2ZyZWVfY3J5cHRvX2luZm8oYnApO1xuJiM0MztcdFx0bmV0ZGV2X3dhcm4oYnAtXHUwMDNlZGV2LCBcJiMzNDtGYWlsZWQgdG8gaW5pdGlhbGl6ZSBjcnlwdG8gb2ZmbG9hZCwgZXJyID0gJWRcXG5cJiMzNDssXG4mIzQzO1x0XHRcdCAgICByYyk7XG4mIzQzO1x0fVxuIFxuIFx0SU5JVF9MSVNUX0hFQUQoXHUwMDI2YnAtXHUwMDNldXNyX2ZsdHJfbGlzdCk7XG4gXG5AQCAtMTcyMTgsNiAmIzQzOzE3NDA0LDggQEAgc3RhdGljIGludCBibnh0X2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KVxuIFx0Ym54dF9ldGh0b29sX2ZyZWUoYnApO1xuIFx0a2ZyZWUoYnAtXHUwMDNlZndfaGVhbHRoKTtcbiBcdGJwLVx1MDAzZWZ3X2hlYWx0aCA9IE5VTEw7XG4mIzQzO1x0Ym54dF9mcmVlX2NyeXB0b19pbmZvKGJwKTtcbiYjNDM7XHRibnh0X2ZyZWVfbXBjX2luZm8oYnApO1xuIFx0Ym54dF9jbGVhbnVwX3BjaShicCk7XG4gXHRibnh0X2ZyZWVfY3R4X21lbShicCwgdHJ1ZSk7XG4gXHRibnh0X2ZyZWVfY3Jhc2hfZHVtcF9tZW0oYnApO1xuQEAgLTE3NDAwLDYgJiM0MzsxNzU4OCw3IEBAIHN0YXRpYyBwY2lfZXJzX3Jlc3VsdF90IGJueHRfaW9fZXJyb3JfZGV0ZWN0ZWQoc3RydWN0IHBjaV9kZXYgKnBkZXYsXG4gXG4gXHRpZiAocGNpX2lzX2VuYWJsZWQocGRldikpXG4gXHRcdHBjaV9kaXNhYmxlX2RldmljZShwZGV2KTtcbiYjNDM7XHRibnh0X2NsZWFyX2NyeXB0byhicCk7XG4gXHRibnh0X2ZyZWVfY3R4X21lbShicCwgZmFsc2UpO1xuIFx0bmV0ZGV2X3VubG9jayhuZXRkZXYpO1xuIFxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dC5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9ibnh0LmhcbmluZGV4IDYzMzVkZmMxNGM5ODViLi43MDk0N2JjYzMxMTZlZCAxMDA2NDRcbi0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dC5oXG4mIzQzOyYjNDM7JiM0MzsgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibnh0L2JueHQuaFxuQEAgLTQ3LDYgJiM0Mzs0Nyw3IEBAIHN0cnVjdCB0eF9iZCB7XG4gXHRfX2xlMzIgdHhfYmRfbGVuX2ZsYWdzX3R5cGU7XG4gXHQjZGVmaW5lIFRYX0JEX1RZUEVcdFx0XHRcdFx0KDB4M2YgXHUwMDNjXHUwMDNjIDApXG4gXHQgI2RlZmluZSBUWF9CRF9UWVBFX1NIT1JUX1RYX0JEXHRcdFx0XHQgKDB4MDAgXHUwMDNjXHUwMDNjIDApXG4mIzQzO1x0ICNkZWZpbmUgVFhfQkRfVFlQRV9NUENfVFhfQkRcdFx0XHRcdCAoMHgwOCBcdTAwM2NcdTAwM2MgMClcbiBcdCAjZGVmaW5lIFRYX0JEX1RZUEVfTE9OR19UWF9CRFx0XHRcdFx0ICgweDEwIFx1MDAzY1x1MDAzYyAwKVxuIFx0I2RlZmluZSBUWF9CRF9GTEFHU19QQUNLRVRfRU5EXHRcdFx0XHQoMSBcdTAwM2NcdTAwM2MgNilcbiBcdCNkZWZpbmUgVFhfQkRfRkxBR1NfTk9fQ01QTFx0XHRcdFx0KDEgXHUwMDNjXHUwMDNjIDcpXG5AQCAtMTAwLDEwICYjNDM7MTAxLDE4IEBAIHN0cnVjdCB0eF9iZF9leHQge1xuIFx0I2RlZmluZSBUWF9CRF9GTEFHU19MU09cdFx0XHRcdFx0KDEgXHUwMDNjXHUwMDNjIDUpXG4gXHQjZGVmaW5lIFRYX0JEX0ZMQUdTX0lQSURfRk1UXHRcdFx0XHQoMSBcdTAwM2NcdTAwM2MgNilcbiBcdCNkZWZpbmUgVFhfQkRfRkxBR1NfVF9JUElEXHRcdFx0XHQoMSBcdTAwM2NcdTAwM2MgNylcbiYjNDM7XHQjZGVmaW5lIFRYX0JEX0ZMQUdTX0NSWVBUT19FTlx0XHRcdFx0KDEgXHUwMDNjXHUwMDNjIDE1KVxuIFx0I2RlZmluZSBUWF9CRF9IU0laRVx0XHRcdFx0XHQoMHhmZiBcdTAwM2NcdTAwM2MgMTYpXG4gXHQgI2RlZmluZSBUWF9CRF9IU0laRV9TSElGVFx0XHRcdFx0IDE2XG4tXG4tXHRfX2xlMzIgdHhfYmRfbXNzO1xuJiM0MztcdCNkZWZpbmUgVFhfQkRfS0lEX0xPXHRcdFx0XHRcdCgweDdmIFx1MDAzY1x1MDAzYyAyNSlcbiYjNDM7XHQgI2RlZmluZSBUWF9CRF9LSURfTE9fTUFTS1x0XHRcdFx0IDB4N2ZcbiYjNDM7XHQgI2RlZmluZSBUWF9CRF9LSURfTE9fU0hJRlRcdFx0XHRcdCAyNVxuJiM0MztcbiYjNDM7XHRfX2xlMzIgdHhfYmRfa2lkX21zcztcbiYjNDM7XHQjZGVmaW5lIFRYX0JEX01TU1x0XHRcdFx0XHQweDdmZmZcbiYjNDM7XHQjZGVmaW5lIFRYX0JEX0tJRF9ISVx0XHRcdFx0XHQoMHgxZmZmZiBcdTAwM2NcdTAwM2MgMTUpXG4mIzQzO1x0ICNkZWZpbmUgVFhfQkRfS0lEX0hJX01BU0tcdFx0XHRcdCAweGZmZmY4MFxuJiM0MztcdCAjZGVmaW5lIFRYX0JEX0tJRF9ISV9TSElGVFx0XHRcdFx0IDhcbiBcdF9fbGUzMiB0eF9iZF9jZmFfYWN0aW9uO1xuIFx0I2RlZmluZSBUWF9CRF9DRkFfQUNUSU9OXHRcdFx0XHQoMHhmZmZmIFx1MDAzY1x1MDAzYyAxNilcbiBcdCAjZGVmaW5lIFRYX0JEX0NGQV9BQ1RJT05fU0hJRlRcdFx0XHRcdCAxNlxuQEAgLTEyMSw2ICYjNDM7MTMwLDE2IEBAIHN0cnVjdCB0eF9iZF9leHQge1xuIH07XG4gXG4gI2RlZmluZSBCTlhUX1RYX1BUUF9JU19TRVQobGZsYWdzKSAoKGxmbGFncykgXHUwMDI2IGNwdV90b19sZTMyKFRYX0JEX0ZMQUdTX1NUQU1QKSlcbiYjNDM7I2RlZmluZSBCTlhUX1RYX0tJRF9MTyhraWQpICgoKGtpZCkgXHUwMDI2IFRYX0JEX0tJRF9MT19NQVNLKSBcdTAwM2NcdTAwM2MgVFhfQkRfS0lEX0xPX1NISUZUKVxuJiM0MzsjZGVmaW5lIEJOWFRfVFhfS0lEX0hJKGtpZCkgKCgoa2lkKSBcdTAwMjYgVFhfQkRfS0lEX0hJX01BU0spIFx1MDAzY1x1MDAzYyBUWF9CRF9LSURfSElfU0hJRlQpXG4mIzQzO1xuJiM0MztzdHJ1Y3QgdHhfYmRfcHJlc3luYyB7XG4mIzQzO1x0X19sZTMyIHR4X2JkX2xlbl9mbGFnc190eXBlO1xuJiM0MztcdCAjZGVmaW5lIFRYX0JEX1RZUEVfUFJFU1lOQ19UWF9CRFx0XHRcdCAoMHgwOSBcdTAwM2NcdTAwM2MgMClcbiYjNDM7XHR1MzIgdHhfYmRfb3BhcXVlO1xuJiM0MztcdF9fbGUzMiB0eF9iZF9raWQ7XG4mIzQzO1x0dTMyIHR4X2JkX3VudXNlZDtcbiYjNDM7fTtcbiBcbiBzdHJ1Y3QgcnhfYmQge1xuIFx0X19sZTMyIHJ4X2JkX2xlbl9mbGFnc190eXBlO1xuQEAgLTE2MCw2ICYjNDM7MTc5LDcgQEAgc3RydWN0IHR4X2NtcCB7XG4gXHQgI2RlZmluZSBDTVBfVFlQRV9SWF9UUEFfQUdHX0NNUFx0XHRcdCAyMlxuIFx0ICNkZWZpbmUgQ01QX1RZUEVfUlhfTDJfVjNfQ01QXHRcdFx0XHQgMjNcbiBcdCAjZGVmaW5lIENNUF9UWVBFX1JYX0wyX1RQQV9TVEFSVF9WM19DTVBcdFx0IDI1XG4mIzQzO1x0ICNkZWZpbmUgQ01QX1RZUEVfTVBDX0NNUFx0XHRcdFx0IDMwXG4gXHQgI2RlZmluZSBDTVBfVFlQRV9TVEFUVVNfQ01QXHRcdFx0XHQgMzJcbiBcdCAjZGVmaW5lIENNUF9UWVBFX1JFTU9URV9EUklWRVJfUkVRXHRcdFx0IDM0XG4gXHQgI2RlZmluZSBDTVBfVFlQRV9SRU1PVEVfRFJJVkVSX1JFU1BcdFx0XHQgMzZcbkBAIC02ODYsNiAmIzQzOzcwNiw3IEBAIHN0cnVjdCBucWVfY24ge1xuICNkZWZpbmUgQk5YVF9OUV9IRExfVFlQRV9TSElGVFx0MjRcbiAjZGVmaW5lIEJOWFRfTlFfSERMX1RZUEVfUlhcdDB4MDBcbiAjZGVmaW5lIEJOWFRfTlFfSERMX1RZUEVfVFhcdDB4MDFcbiYjNDM7I2RlZmluZSBCTlhUX05RX0hETF9UWVBFX01QXHQweDAyXG4gXG4gI2RlZmluZSBCTlhUX05RX0hETF9JRFgoaGRsKVx0KChoZGwpIFx1MDAyNiBCTlhUX05RX0hETF9JRFhfTUFTSylcbiAjZGVmaW5lIEJOWFRfTlFfSERMX1RZUEUoaGRsKVx0KCgoaGRsKSBcdTAwMjYgQk5YVF9OUV9IRExfVFlQRV9NQVNLKSBcdTAwM2VcdTAwM2VcdFxcXG5AQCAtODk2LDYgJiM0Mzs5MTcsNyBAQCBzdHJ1Y3QgYm54dF9zd190eF9iZCB7XG4gXHR1OFx0XHRcdGlzX3B1c2g7XG4gXHR1OFx0XHRcdGlzX3N3X2dzbztcbiBcdHU4XHRcdFx0YWN0aW9uO1xuJiM0MztcdHU4XHRcdFx0aW5saW5lX2RhdGFfYmRzO1xuIFx0dW5zaWduZWQgc2hvcnRcdFx0bnJfZnJhZ3M7XG4gXHR1bmlvbiB7XG4gXHRcdHUxNlx0XHRcdHJ4X3Byb2Q7XG5AQCAtOTUxLDYgJiM0Mzs5NzMsOCBAQCBzdHJ1Y3QgYm54dF9yaW5nX3N0cnVjdCB7XG4gXHR9O1xuIFx0dTMyXHRcdFx0aGFuZGxlO1xuIFx0dThcdFx0XHRxdWV1ZV9pZDtcbiYjNDM7I2RlZmluZSBCTlhUX01QQ19RVUVVRV9JRFx0MHhmZlxuJiM0MztcdHU4XHRcdFx0bXBjX2NobmxfdHlwZTtcbiB9O1xuIFxuIHN0cnVjdCB0eF9wdXNoX2JkIHtcbkBAIC05OTEsMTIgJiM0MzsxMDE1LDE2IEBAIHN0cnVjdCBibnh0X3R4X3JpbmdfaW5mbyB7XG4gXHR1MTZcdFx0XHR0eF9jb25zO1xuIFx0dTE2XHRcdFx0dHhfaHdfY29ucztcbiBcdHUxNlx0XHRcdHR4cV9pbmRleDtcbiYjNDM7XHQvKiBpbmRleCBmb3IgdHhfcmluZ1tdIG9yIHR4X21wY19yaW5nW10gaW4gc3RydWN0IGJueHRfbmFwaSAqL1xuIFx0dThcdFx0XHR0eF9uYXBpX2lkeDtcbiBcdHU4XHRcdFx0a2lja19wZW5kaW5nO1xuIFx0c3RydWN0IGJueHRfZGJfaW5mb1x0dHhfZGI7XG4gXG4gXHRzdHJ1Y3QgdHhfYmRcdFx0KnR4X2Rlc2NfcmluZ1tNQVhfVFhfUEFHRVNdO1xuLVx0c3RydWN0IGJueHRfc3dfdHhfYmRcdCp0eF9idWZfcmluZztcbiYjNDM7XHR1bmlvbiB7XG4mIzQzO1x0XHRzdHJ1Y3QgYm54dF9zd190eF9iZFx0KnR4X2J1Zl9yaW5nO1xuJiM0MztcdFx0c3RydWN0IGJueHRfc3dfbXBjX3R4X2JkXHQqdHhfbXBjX2J1Zl9yaW5nO1xuJiM0MztcdH07XG4gXG4gXHRkbWFfYWRkcl90XHRcdHR4X2Rlc2NfbWFwcGluZ1tNQVhfVFhfUEFHRVNdO1xuIFxuQEAgLTEwMTQsOCAmIzQzOzEwNDIsMTEgQEAgc3RydWN0IGJueHRfdHhfcmluZ19pbmZvIHtcbiBcdHUzMlx0XHRcdGRldl9zdGF0ZTtcbiBcbiBcdHN0cnVjdCBibnh0X3Jpbmdfc3RydWN0XHR0eF9yaW5nX3N0cnVjdDtcbi1cdC8qIFN5bmNocm9uaXplIHNpbXVsdGFuZW91cyB4ZHBfeG1pdCBvbiBzYW1lIHJpbmcgKi9cbi1cdHNwaW5sb2NrX3RcdFx0eGRwX3R4X2xvY2s7XG4mIzQzO1x0LyogU3luY2hyb25pemUgc2ltdWx0YW5lb3VzIHhkcF94bWl0IG9uIHNhbWUgcmluZyBvciBmb3IgTVBDIHJpbmcgKi9cbiYjNDM7XHRzcGlubG9ja190XHRcdHR4X2xvY2s7XG4mIzQzO1xuJiM0MztcdC8qIFBlci1UWC1yaW5nIGtUTFMgY291bnRlcnM7IGFsbG9jYXRlZCBvbmx5IHdoZW4ga1RMUyBpcyBlbmFibGVkLiAqL1xuJiM0MztcdHN0cnVjdCBibnh0X3Rsc19zd19zdGF0cyAqdGxzX3N0YXRzO1xuIH07XG4gXG4gI2RlZmluZSBCTlhUX0xFR0FDWV9DT0FMX0NNUExfUEFSQU1TXHRcdFx0XHRcdFxcXG5AQCAtMTE1Nyw2ICYjNDM7MTE4OCwyMiBAQCBzdHJ1Y3QgYm54dF9jbW5fc3dfc3RhdHMge1xuIFx0dTY0XHRcdFx0bWlzc2VkX2lycXM7XG4gfTtcbiBcbiYjNDM7LyogRGF0YSBwbGFuZSBrVExTIGNvdW50ZXJzICovXG4mIzQzO2VudW0gYm54dF9rdGxzX2RhdGFfY291bnRlcnMge1xuJiM0MztcdEJOWFRfS1RMU19UWF9QS1RTID0gMCxcbiYjNDM7XHRCTlhUX0tUTFNfVFhfQllURVMsXG4mIzQzO1x0Qk5YVF9LVExTX1RYX09PT19QS1RTLFxuJiM0MztcdEJOWFRfS1RMU19UWF9PT09fRkFMTEJBQ0tfTk9fU1lOQyxcbiYjNDM7XHRCTlhUX0tUTFNfVFhfT09PX0ZBTExCQUNLX05PX1NQQUNFLFxuJiM0MztcdEJOWFRfS1RMU19UWF9PT09fRkFMTEJBQ0tfTk9fSERSLFxuJiM0MztcbiYjNDM7XHRCTlhUX0tUTFNfTUFYX0RBVEFfQ09VTlRFUlMsXG4mIzQzO307XG4mIzQzO1xuJiM0MztzdHJ1Y3QgYm54dF90bHNfc3dfc3RhdHMge1xuJiM0MztcdHU2NFx0Y291bnRlcnNbQk5YVF9LVExTX01BWF9EQVRBX0NPVU5URVJTXTtcbiYjNDM7fTtcbiYjNDM7XG4gc3RydWN0IGJueHRfc3dfc3RhdHMge1xuIFx0c3RydWN0IGJueHRfcnhfc3dfc3RhdHMgcng7XG4gXHRzdHJ1Y3QgYm54dF90eF9zd19zdGF0cyB0eDtcbkBAIC0xMjQyLDYgJiM0MzsxMjg5LDcgQEAgc3RydWN0IGJueHRfbmFwaSB7XG4gXHRzdHJ1Y3QgYm54dF9jcF9yaW5nX2luZm9cdGNwX3Jpbmc7XG4gXHRzdHJ1Y3QgYm54dF9yeF9yaW5nX2luZm9cdCpyeF9yaW5nO1xuIFx0c3RydWN0IGJueHRfdHhfcmluZ19pbmZvXHQqdHhfcmluZ1tCTlhUX01BWF9UWFJfUEVSX05BUEldO1xuJiM0MztcdHN0cnVjdCBibnh0X3R4X3JpbmdfaW5mb1x0Kip0eF9tcGNfcmluZztcbiBcbiBcdHZvaWRcdFx0XHQoKnR4X2ludCkoc3RydWN0IGJueHQgKiwgc3RydWN0IGJueHRfbmFwaSAqLFxuIFx0XHRcdFx0XHQgIGludCBidWRnZXQpO1xuQEAgLTEzNTUsNiAmIzQzOzE0MDMsMTUgQEAgc3RydWN0IGJueHRfaHdfcmluZ3Mge1xuIFx0aW50IHJzc19jdHg7XG4gfTtcbiBcbiYjNDM7c3RydWN0IGJueHRfaHdfY3J5cHRvX3Jlc2Mge1xuJiM0MztcdHUzMlx0bWluX3R4X2tleV9jdHhzO1xuJiM0MztcdHUzMlx0bWF4X3R4X2tleV9jdHhzO1xuJiM0MztcdHUzMlx0cmVzdl90eF9rZXlfY3R4cztcbiYjNDM7XHR1MzJcdG1pbl9yeF9rZXlfY3R4cztcbiYjNDM7XHR1MzJcdG1heF9yeF9rZXlfY3R4cztcbiYjNDM7XHR1MzJcdHJlc3Zfcnhfa2V5X2N0eHM7XG4mIzQzO307XG4mIzQzO1xuIHN0cnVjdCBibnh0X2h3X3Jlc2Mge1xuIFx0dTE2XHRtaW5fcnNzY29zX2N0eHM7XG4gXHR1MTZcdG1heF9yc3Njb3NfY3R4cztcbkBAIC0xMzg5LDYgJiM0MzsxNDQ2LDggQEAgc3RydWN0IGJueHRfaHdfcmVzYyB7XG4gXHR1MzJcdG1heF90eF93bV9mbG93cztcbiBcdHUzMlx0bWF4X3J4X2VtX2Zsb3dzO1xuIFx0dTMyXHRtYXhfcnhfd21fZmxvd3M7XG4mIzQzO1xuJiM0MztcdHN0cnVjdCBibnh0X2h3X2NyeXB0b19yZXNjXHRjcnlwdG9fcmVzYztcbiB9O1xuIFxuICNkZWZpbmUgQk5YVF9MQVJHRV9SU1NfVE9fVk5JQ19SQVRJT1x0N1xuQEAgLTI0NTIsNiAmIzQzOzI1MTEsMTAgQEAgc3RydWN0IGJueHQge1xuIFxuIFx0dThcdFx0XHR0cGhfbW9kZTtcbiBcbiYjNDM7XHRzdHJ1Y3QgYm54dF9tcGNfaW5mb1x0Km1wY19pbmZvO1xuJiM0MztcdHN0cnVjdCBibnh0X2NyeXB0b19pbmZvXHQqY3J5cHRvX2luZm87XG4mIzQzO1x0c3RydWN0IGJueHRfdGxzX2luZm9cdCprdGxzX2luZm87XG4mIzQzO1xuIFx0dW5zaWduZWQgaW50XHRcdGN1cnJlbnRfaW50ZXJ2YWw7XG4gI2RlZmluZSBCTlhUX1RJTUVSX0lOVEVSVkFMXHRIWlxuIFxuQEAgLTI1MzgsNiAmIzQzOzI2MDEsNyBAQCBzdHJ1Y3QgYm54dCB7XG4gXHQjZGVmaW5lIEJOWFRfRldfQ0FQX05QQVJfMV8yXHRcdFx0QklUX1VMTCg0MilcbiBcdCNkZWZpbmUgQk5YVF9GV19DQVBfTUlSUk9SX09OX1JPQ0VcdFx0QklUX1VMTCg0MylcbiBcdCNkZWZpbmUgQk5YVF9GV19DQVBfUFRQX1BUTVx0XHRcdEJJVF9VTEwoNDQpXG4mIzQzO1x0I2RlZmluZSBCTlhUX0ZXX0NBUF9LVExTXHRcdFx0QklUX1VMTCg0NSlcbiBcbiBcdHUzMlx0XHRcdGZ3X2RiZ19jYXA7XG4gXG5AQCAtMjU2Myw2ICYjNDM7MjYyNyw4IEBAIHN0cnVjdCBibnh0IHtcbiBcdCgoYnApLVx1MDAzZWZ3X2NhcCBcdTAwMjYgQk5YVF9GV19DQVBfU1dfTUFYX1JFU09VUkNFX0xJTUlUUylcbiAjZGVmaW5lIEJOWFRfTUlSUk9SX09OX1JPQ0VfQ0FQKGJwKVx0XFxcbiBcdCgoYnApLVx1MDAzZWZ3X2NhcCBcdTAwMjYgQk5YVF9GV19DQVBfTUlSUk9SX09OX1JPQ0UpXG4mIzQzOyNkZWZpbmUgQk5YVF9TVVBQT1JUU19LVExTKGJwKVx0XFxcbiYjNDM7XHQoKGJwKS1cdTAwM2Vmd19jYXAgXHUwMDI2IEJOWFRfRldfQ0FQX0tUTFMpXG4gXG4gXHR1MzJcdFx0XHRod3JtX3NwZWNfY29kZTtcbiBcdHUxNlx0XHRcdGh3cm1fY21kX3NlcTtcbkBAIC0yNjQ1LDYgJiM0MzsyNzExLDcgQEAgc3RydWN0IGJueHQge1xuICNkZWZpbmUgQk5YVF9USEVSTUFMX1RIUkVTSE9MRF9TUF9FVkVOVFx0MjJcbiAjZGVmaW5lIEJOWFRfRldfRUNIT19SRVFVRVNUX1NQX0VWRU5UXHQyM1xuICNkZWZpbmUgQk5YVF9SRVNUQVJUX1VMUF9TUF9FVkVOVFx0MjRcbiYjNDM7I2RlZmluZSBCTlhUX01QQ19SRVNFVF9TUF9FVkVOVFx0XHQyNVxuIFxuIFx0c3RydWN0IGRlbGF5ZWRfd29ya1x0ZndfcmVzZXRfdGFzaztcbiBcdGludFx0XHRcdGZ3X3Jlc2V0X3N0YXRlO1xuQEAgLTI4NTYsMTQgJiM0MzsyOTIzLDE0IEBAIHN0YXRpYyBpbmxpbmUgdTMyIGJueHRfdHhfYXZhaWwoc3RydWN0IGJueHQgKmJwLFxuIHN0YXRpYyBpbmxpbmUgc3RydWN0IHR4X2JkX2V4dCAqXG4gYm54dF9pbml0X2V4dF9iZChzdHJ1Y3QgYm54dCAqYnAsIHN0cnVjdCBibnh0X3R4X3JpbmdfaW5mbyAqdHhyLFxuIFx0XHQgdTE2IHByb2QsIF9fbGUzMiBsZmxhZ3MsIHUzMiB2bGFuX3RhZ19mbGFncyxcbi1cdFx0IHUzMiBjZmFfYWN0aW9uKVxuJiM0MztcdFx0IHUzMiBjZmFfYWN0aW9uLCB1MzIga2lkKVxuIHtcbiBcdHN0cnVjdCB0eF9iZF9leHQgKnR4YmQxO1xuIFxuIFx0dHhiZDEgPSAoc3RydWN0IHR4X2JkX2V4dCAqKVxuIFx0XHRcdTAwMjZ0eHItXHUwMDNldHhfZGVzY19yaW5nW1RYX1JJTkcoYnAsIHByb2QpXVtUWF9JRFgocHJvZCldO1xuIFx0dHhiZDEtXHUwMDNldHhfYmRfaHNpemVfbGZsYWdzID0gbGZsYWdzO1xuLVx0dHhiZDEtXHUwMDNldHhfYmRfbXNzID0gMDtcbiYjNDM7XHR0eGJkMS1cdTAwM2V0eF9iZF9raWRfbXNzID0gY3B1X3RvX2xlMzIoQk5YVF9UWF9LSURfSEkoa2lkKSk7XG4gXHR0eGJkMS1cdTAwM2V0eF9iZF9jZmFfbWV0YSA9IGNwdV90b19sZTMyKHZsYW5fdGFnX2ZsYWdzKTtcbiBcdHR4YmQxLVx1MDAzZXR4X2JkX2NmYV9hY3Rpb24gPVxuIFx0XHRjcHVfdG9fbGUzMihjZmFfYWN0aW9uIFx1MDAzY1x1MDAzYyBUWF9CRF9DRkFfQUNUSU9OX1NISUZUKTtcbkBAIC0yOTU3LDExICYjNDM7MzAyNCwxNCBAQCBzdGF0aWMgaW5saW5lIGVudW0gcGt0X2hhc2hfdHlwZXMgYm54dF9yc3NfZXh0X29wKHN0cnVjdCBibnh0ICpicCxcbiBleHRlcm4gY29uc3QgdTE2IGJueHRfYnN0b3JlX3RvX3RyYWNlW107XG4gZXh0ZXJuIGNvbnN0IHUxNiBibnh0X2xoaW50X2FycltdO1xuIFxuJiM0Mzt2b2lkIGJueHRfcXVldWVfc3Bfd29yayhzdHJ1Y3QgYm54dCAqYnAsIHVuc2lnbmVkIGludCBldmVudCk7XG4gaW50IGJueHRfYWxsb2NfcnhfZGF0YShzdHJ1Y3QgYm54dCAqYnAsIHN0cnVjdCBibnh0X3J4X3JpbmdfaW5mbyAqcnhyLFxuIFx0XHQgICAgICAgdTE2IHByb2QsIGdmcF90IGdmcCk7XG4gdm9pZCBibnh0X3JldXNlX3J4X2RhdGEoc3RydWN0IGJueHRfcnhfcmluZ19pbmZvICpyeHIsIHUxNiBjb25zLCB2b2lkICpkYXRhKTtcbiB1MzIgYm54dF9md19oZWFsdGhfcmVhZGwoc3RydWN0IGJueHQgKmJwLCBpbnQgcmVnX2lkeCk7XG4gYm9vbCBibnh0X2JzX3RyYWNlX2F2YWlsKHN0cnVjdCBibnh0ICpicCwgdTE2IHR5cGUpO1xuJiM0Mzt2b2lkIGJueHRfZnJlZV9yaW5nKHN0cnVjdCBibnh0ICpicCwgc3RydWN0IGJueHRfcmluZ19tZW1faW5mbyAqcm1lbSk7XG4mIzQzO2ludCBibnh0X2FsbG9jX3Jpbmcoc3RydWN0IGJueHQgKmJwLCBzdHJ1Y3QgYm54dF9yaW5nX21lbV9pbmZvICpybWVtKTtcbiB2b2lkIGJueHRfc2V0X3RwYV9mbGFncyhzdHJ1Y3QgYm54dCAqYnApO1xuIHZvaWQgYm54dF9zZXRfcmluZ19wYXJhbXMoc3RydWN0IGJueHQgKik7XG4gdm9pZCBibnh0X3NldF9yeF9za2JfbW9kZShzdHJ1Y3QgYm54dCAqYnAsIGJvb2wgcGFnZV9tb2RlKTtcbkBAIC0yOTkwLDYgJiM0MzszMDYwLDE0IEBAIGludCBibnh0X2h3cm1fdm5pY19jZmcoc3RydWN0IGJueHQgKmJwLCBzdHJ1Y3QgYm54dF92bmljX2luZm8gKnZuaWMpO1xuIGludCBibnh0X2h3cm1fdm5pY19hbGxvYyhzdHJ1Y3QgYm54dCAqYnAsIHN0cnVjdCBibnh0X3ZuaWNfaW5mbyAqdm5pYyxcbiBcdFx0XHQgdW5zaWduZWQgaW50IHN0YXJ0X3J4X3JpbmdfaWR4LFxuIFx0XHRcdCB1bnNpZ25lZCBpbnQgbnJfcmluZ3MpO1xuJiM0MztpbnQgYm54dF9od3JtX2NwX3JpbmdfYWxsb2NfcDUoc3RydWN0IGJueHQgKmJwLCBzdHJ1Y3QgYm54dF9jcF9yaW5nX2luZm8gKmNwcik7XG4mIzQzO2ludCBibnh0X2h3cm1fdHhfcmluZ19hbGxvYyhzdHJ1Y3QgYm54dCAqYnAsIHN0cnVjdCBibnh0X3R4X3JpbmdfaW5mbyAqdHhyLFxuJiM0MztcdFx0XHQgICAgdTMyIHR4X2lkeCk7XG4mIzQzO3ZvaWQgYm54dF9od3JtX3R4X3JpbmdfZnJlZShzdHJ1Y3QgYm54dCAqYnAsIHN0cnVjdCBibnh0X3R4X3JpbmdfaW5mbyAqdHhyLFxuJiM0MztcdFx0XHQgICAgYm9vbCBjbG9zZV9wYXRoKTtcbiYjNDM7dm9pZCBibnh0X2h3cm1fY3BfcmluZ19mcmVlKHN0cnVjdCBibnh0ICpicCwgc3RydWN0IGJueHRfY3BfcmluZ19pbmZvICpjcHIpO1xuJiM0Mzt2b2lkIGJueHRfY2xlYXJfb25lX2NwX3Jpbmcoc3RydWN0IGJueHQgKmJwLCBzdHJ1Y3QgYm54dF9jcF9yaW5nX2luZm8gKmNwcik7XG4mIzQzO2ludCBibnh0X3RvdGFsX3R4X3JpbmdzKHN0cnVjdCBibnh0ICpicCk7XG4gaW50IF9fYm54dF9od3JtX2dldF90eF9yaW5ncyhzdHJ1Y3QgYm54dCAqYnAsIHUxNiBmaWQsIGludCAqdHhfcmluZ3MpO1xuIGludCBibnh0X25xX3JpbmdzX2luX3VzZShzdHJ1Y3QgYm54dCAqYnApO1xuIGludCBibnh0X2h3cm1fc2V0X2NvYWwoc3RydWN0IGJueHQgKik7XG5AQCAtMzAzNSwxMCAmIzQzOzMxMTMsMTEgQEAgdm9pZCBibnh0X3N5bmNfcmluZ19zdGF0cyhzdHJ1Y3QgYm54dCAqYnApO1xuIGJvb2wgYm54dF9yZnNfY2FwYWJsZShzdHJ1Y3QgYm54dCAqYnAsIGJvb2wgbmV3X3Jzc19jdHgpO1xuIGludCBibnh0X2RiZ19od3JtX3JkX3JlZyhzdHJ1Y3QgYm54dCAqYnAsIHUzMiByZWdfb2ZmLCB1MTYgbnVtX3dvcmRzLFxuIFx0XHRcdCB1MzIgKnJlZ19idWYpO1xuJiM0Mzt2b2lkIGJueHRfcmVzZXRfdGFzayhzdHJ1Y3QgYm54dCAqYnAsIGJvb2wgc2lsZW50KTtcbiB2b2lkIGJueHRfZndfZXhjZXB0aW9uKHN0cnVjdCBibnh0ICpicCk7XG4gdm9pZCBibnh0X2Z3X3Jlc2V0KHN0cnVjdCBibnh0ICpicCk7XG4gaW50IGJueHRfY2hlY2tfcmluZ3Moc3RydWN0IGJueHQgKmJwLCBpbnQgdHgsIGludCByeCwgYm9vbCBzaCwgaW50IHRjcyxcbi1cdFx0ICAgICBpbnQgdHhfeGRwKTtcbiYjNDM7XHRcdCAgICAgaW50IHR4X3hkcCwgaW50IG1wY190eCwgaW50IG1wY19jcCk7XG4gaW50IGJueHRfZndfaW5pdF9vbmUoc3RydWN0IGJueHQgKmJwKTtcbiBib29sIGJueHRfaHdybV9yZXNldF9wZXJtaXR0ZWQoc3RydWN0IGJueHQgKmJwKTtcbiB2b2lkIGJueHRfc2V0X2NwX3JpbmdzKHN0cnVjdCBibnh0ICpicCwgYm9vbCBzaCk7XG5kaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9ibnh0X2NyeXB0by5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9ibnh0X2NyeXB0by5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMDAuLjI3YTk3OGJkMThlMjAzXG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibnh0L2JueHRfY3J5cHRvLmNcbkBAIC0wLDAgJiM0MzsxLDYxNyBAQFxuJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XG4mIzQzOy8qIENvcHlyaWdodCAoYykgMjAyNiBCcm9hZGNvbSBJbmMuICovXG4mIzQzO1xuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9zdGRkZWYuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC90eXBlcy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2tlcm5lbC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L3NsYWIuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9wY2kuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9ibnh0L2hzaS5oXHUwMDNlXG4mIzQzO1xuJiM0MzsjaW5jbHVkZSBcJiMzNDtibnh0LmhcJiMzNDtcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7Ym54dF9od3JtLmhcJiMzNDtcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7Ym54dF9tcGMuaFwmIzM0O1xuJiM0MzsjaW5jbHVkZSBcJiMzNDtibnh0X2t0bHMuaFwmIzM0O1xuJiM0MzsjaW5jbHVkZSBcJiMzNDtibnh0X2NyeXB0by5oXCYjMzQ7XG4mIzQzO1xuJiM0MztzdGF0aWMgdTMyIGJueHRfZ2V0X21heF9jcnlwdG9fa2V5X2N0eChzdHJ1Y3QgYm54dCAqYnAsIGludCBrZXlfdHlwZSlcbiYjNDM7e1xuJiM0MztcdHUzMiBmd19tYWogPSBCTlhUX0ZXX01BSihicCk7XG4mIzQzO1xuJiM0MztcdGlmIChrZXlfdHlwZSA9PSBCTlhUX1RYX0NSWVBUT19LRVlfVFlQRSlcbiYjNDM7XHRcdHJldHVybiAoZndfbWFqIFx1MDAzYyAyMzMpID8gQk5YVF9NQVhfVFhfQ1JZUFRPX0tFWVNfUFJFXzIzM0ZXIDpcbiYjNDM7XHRcdCAgICAgICBCTlhUX01BWF9UWF9DUllQVE9fS0VZUztcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIChmd19tYWogXHUwMDNjIDIzMykgPyBCTlhUX01BWF9SWF9DUllQVE9fS0VZU19QUkVfMjMzRlcgOlxuJiM0MztcdCAgICAgICBCTlhUX01BWF9SWF9DUllQVE9fS0VZUztcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIGJueHRfYWxsb2NfY3J5cHRvX2luZm8gLSBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBjcnlwdG8gb2ZmbG9hZCBjb250ZXh0XG4mIzQzOyAqIEBicDogcG9pbnRlciB0byBibnh0IGRldmljZVxuJiM0MzsgKiBAcmVzcDogcG9pbnRlciB0byBmaXJtd2FyZSBjYXBhYmlsaXR5IHJlc3BvbnNlXG4mIzQzOyAqXG4mIzQzOyAqIEFsbG9jYXRlcyB0aGUgbWFpbiBjcnlwdG8gaW5mbyBzdHJ1Y3R1cmVcbiYjNDM7ICpcbiYjNDM7ICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZHVyaW5nIGRldmljZSBpbml0aWFsaXphdGlvbiB3aGVuIGZpcm13YXJlXG4mIzQzOyAqIHJlcG9ydHMgY3J5cHRvIG9mZmxvYWQgY2FwYWJpbGl0eS4gSWYgYWxsb2NhdGlvbiBmYWlscywgY3J5cHRvIG9mZmxvYWRcbiYjNDM7ICogd2lsbCBub3QgYmUgYXZhaWxhYmxlIGJ1dCB0aGUgZGV2aWNlIHdpbGwgc3RpbGwgZnVuY3Rpb24uXG4mIzQzOyAqXG4mIzQzOyAqIENvbnRleHQ6IFByb2Nlc3MgY29udGV4dFxuJiM0MzsgKi9cbiYjNDM7dm9pZCBibnh0X2FsbG9jX2NyeXB0b19pbmZvKHN0cnVjdCBibnh0ICpicCxcbiYjNDM7XHRcdFx0ICAgIHN0cnVjdCBod3JtX2Z1bmNfcWNhcHNfb3V0cHV0ICpyZXNwKVxuJiM0Mzt7XG4mIzQzO1x0dTE2IG1heF9rZXlzID0gbGUxNl90b19jcHUocmVzcC1cdTAwM2VtYXhfa2V5X2N0eHNfYWxsb2MpO1xuJiM0MztcdHN0cnVjdCBibnh0X2NyeXB0b19pbmZvICpjcnlwdG8gPSBicC1cdTAwM2VjcnlwdG9faW5mbztcbiYjNDM7XHRzdHJ1Y3QgYm54dF9rY3R4ICprY3R4O1xuJiM0MztcdGNoYXIgbmFtZVs2NF07XG4mIzQzO1x0aW50IGk7XG4mIzQzO1xuJiM0MztcdGlmIChCTlhUX1ZGKGJwKSlcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XHRpZiAoIWNyeXB0bykge1xuJiM0MztcdFx0Y3J5cHRvID0ga3phbGxvY19vYmooKmNyeXB0byk7XG4mIzQzO1x0XHRpZiAoIWNyeXB0bykge1xuJiM0MztcdFx0XHRuZXRkZXZfd2FybihicC1cdTAwM2VkZXYsXG4mIzQzO1x0XHRcdFx0ICAgIFwmIzM0O1VuYWJsZSB0byBhbGxvY2F0ZSBjcnlwdG8gaW5mb1xcblwmIzM0Oyk7XG4mIzQzO1x0XHRcdHJldHVybjtcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdHNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgXCYjMzQ7Ym54dF9jcnlwdG8tJXNcJiMzNDssXG4mIzQzO1x0XHRcdCBkZXZfbmFtZShcdTAwMjZicC1cdTAwM2VwZGV2LVx1MDAzZWRldikpO1xuJiM0MztcdFx0Y3J5cHRvLVx1MDAzZW1wY19jYWNoZSA9XG4mIzQzO1x0XHRcdGttZW1fY2FjaGVfY3JlYXRlKG5hbWUsXG4mIzQzO1x0XHRcdFx0XHQgIHNpemVvZihzdHJ1Y3QgYm54dF9jcnlwdG9fY21kX2N0eCksXG4mIzQzO1x0XHRcdFx0XHQgIDAsIFNMQUJfSFdDQUNIRV9BTElHTiwgTlVMTCk7XG4mIzQzO1x0XHRpZiAoIWNyeXB0by1cdTAwM2VtcGNfY2FjaGUpXG4mIzQzO1x0XHRcdGdvdG8gYWxsb2NfZXJyO1xuJiM0MztcbiYjNDM7XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIEJOWFRfTUFYX0NSWVBUT19LRVlfVFlQRTsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdFx0a2N0eCA9IFx1MDAyNmNyeXB0by1cdTAwM2VrY3R4W2ldO1xuJiM0MztcdFx0XHRrY3R4LVx1MDAzZXR5cGUgPSBpO1xuJiM0MztcdFx0XHRJTklUX0xJU1RfSEVBRChcdTAwMjZrY3R4LVx1MDAzZWxpc3QpO1xuJiM0MztcdFx0XHRzcGluX2xvY2tfaW5pdChcdTAwMjZrY3R4LVx1MDAzZWxvY2spO1xuJiM0MztcdFx0XHRhdG9taWNfc2V0KFx1MDAyNmtjdHgtXHUwMDNlYWxsb2NfcGVuZGluZywgMCk7XG4mIzQzO1x0XHRcdGluaXRfd2FpdHF1ZXVlX2hlYWQoXHUwMDI2a2N0eC1cdTAwM2VhbGxvY19wZW5kaW5nX3dxKTtcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdGJwLVx1MDAzZWNyeXB0b19pbmZvID0gY3J5cHRvO1xuJiM0MztcdH1cbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBCTlhUX01BWF9DUllQVE9fS0VZX1RZUEU7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRrY3R4ID0gXHUwMDI2Y3J5cHRvLVx1MDAzZWtjdHhbaV07XG4mIzQzO1x0XHRrY3R4LVx1MDAzZW1heF9jdHggPSBibnh0X2dldF9tYXhfY3J5cHRvX2tleV9jdHgoYnAsIGkpO1xuJiM0MztcdH1cbiYjNDM7XHRjcnlwdG8tXHUwMDNlbWF4X2tleV9jdHhzX2FsbG9jID0gbWF4X2tleXM7XG4mIzQzO1x0aWYgKCFicC1cdTAwM2VrdGxzX2luZm8pXG4mIzQzO1x0XHRibnh0X2FsbG9jX2t0bHNfaW5mbyhicCk7XG4mIzQzO1x0aWYgKGJwLVx1MDAzZWt0bHNfaW5mbylcbiYjNDM7XHRcdGJwLVx1MDAzZWZ3X2NhcCB8PSBCTlhUX0ZXX0NBUF9LVExTO1xuJiM0MztcdHJldHVybjtcbiYjNDM7XG4mIzQzO2FsbG9jX2VycjpcbiYjNDM7XHRrZnJlZShjcnlwdG8pO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztpbnQgYm54dF9jcnlwdG9fZGVsKHN0cnVjdCBibnh0ICpicCwgdTggdHlwZSwgdTgga2luZCwgdTMyIGtpZClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBibnh0X3R4X3JpbmdfaW5mbyAqdHhyO1xuJiM0MztcdHN0cnVjdCBjZV9kZWxldGVfY21kIGNtZCA9IHt9O1xuJiM0MztcdHUzMiBkYXRhO1xuJiM0MztcbiYjNDM7XHRpZiAoQk5YVF9OT19GV19BQ0NFU1MoYnApKVxuJiM0MztcdFx0cmV0dXJuIDA7XG4mIzQzO1xuJiM0MztcdHR4ciA9IGJueHRfc2VsZWN0X21wY19yaW5nKGJwLCB0eXBlKTtcbiYjNDM7XHRpZiAoIXR4cilcbiYjNDM7XHRcdHJldHVybiAtRU5PREVWO1xuJiM0MztcdGlmIChraW5kID09IEJOWFRfQ1RYX0tJTkRfQ0tfVFgpXG4mIzQzO1x0XHRkYXRhID0gQ0VfREVMRVRFX0NNRF9DVFhfS0lORF9DS19UWDtcbiYjNDM7XHRlbHNlIGlmIChraW5kID09IEJOWFRfQ1RYX0tJTkRfQ0tfUlgpXG4mIzQzO1x0XHRkYXRhID0gQ0VfREVMRVRFX0NNRF9DVFhfS0lORF9DS19SWDtcbiYjNDM7XHRlbHNlXG4mIzQzO1x0XHRyZXR1cm4gLUVJTlZBTDtcbiYjNDM7XG4mIzQzO1x0ZGF0YSB8PSBDRV9ERUxFVEVfQ01EX09QQ09ERV9ERUwgfFxuJiM0MztcdFx0KEJOWFRfS0lEX0hXKGtpZCkgXHUwMDNjXHUwMDNjIENFX0RFTEVURV9DTURfS0lEX1NGVCk7XG4mIzQzO1xuJiM0MztcdGNtZC5jdHhfa2luZF9raWRfb3Bjb2RlID0gY3B1X3RvX2xlMzIoZGF0YSk7XG4mIzQzO1x0cmV0dXJuIGJueHRfeG1pdF9jcnlwdG9fY21kKGJwLCB0eHIsIFx1MDAyNmNtZCwgc2l6ZW9mKGNtZCksXG4mIzQzO1x0XHRcdFx0ICAgIEJOWFRfTVBDX1RNT19NU0VDUyk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIGJueHRfY3J5cHRvX2RlbF9hbGxfa2lkcyhzdHJ1Y3QgYm54dCAqYnAsIHN0cnVjdCBibnh0X2tpZF9pbmZvICpraWQpXG4mIzQzO3tcbiYjNDM7XHRpbnQgaSwgcmM7XG4mIzQzO1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIGtpZC1cdTAwM2Vjb3VudDsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGlmICghdGVzdF9iaXQoaSwga2lkLVx1MDAzZWlkcykpIHtcbiYjNDM7XHRcdFx0cmMgPSBibnh0X2NyeXB0b19kZWwoYnAsIGtpZC1cdTAwM2V0eXBlLCBraWQtXHUwMDNla2luZCxcbiYjNDM7XHRcdFx0XHRcdCAgICAga2lkLVx1MDAzZXN0YXJ0X2lkICYjNDM7IGkpO1xuJiM0MztcdFx0XHRpZiAoIXJjKVxuJiM0MztcdFx0XHRcdHNldF9iaXQoaSwga2lkLVx1MDAzZWlkcyk7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogYm54dF9jcnlwdG9fZGVsX2FsbCAtIERlbGV0ZSBhbGwgY3J5cHRvIGNvbm5lY3Rpb25zXG4mIzQzOyAqIEBicDogcG9pbnRlciB0byBibnh0IGRldmljZVxuJiM0MzsgKlxuJiM0MzsgKiBEZWxldGUgYWxsIGNyeXB0byBjb25uZWN0aW9ucyBhbmQgZnJlZSBhbGwgS0lEcyBmb3IgcmUtdXNlIGR1cmluZ1xuJiM0MzsgKiBzaHV0ZG93bi4gIEluY3JlbWVudCB0aGUgZXBvY2ggY291bnRlciB0byBpbnZhbGlkYXRlIGFueSBvdXRzdGFuZGluZ1xuJiM0MzsgKiBrZXkgcmVmZXJlbmNlcy5cbiYjNDM7ICpcbiYjNDM7ICogTG9ja2luZzogdGhlIGNhbGxlciBtdXN0IGhhdmUgY2xlYXJlZCBCTlhUX1NUQVRFX09QRU4gYW5kIHdhaXRlZCBmb3IgYWxsXG4mIzQzOyAqIGluLWZsaWdodCBrVExTIGNvbnRyb2wgb3BzIHRvIGRyYWluLiAgVW5kZXIgdGhlc2UgcHJlY29uZGl0aW9ucyB0aGVyZSBhcmVcbiYjNDM7ICogbm8gY29uY3VycmVudCByZWFkZXJzIG9yIHdyaXRlcnMgb2YgdGhlIEtJRCBsaXN0cywgc28gdGhlIGxpc3RzIGNhbiBiZVxuJiM0MzsgKiB3YWxrZWQgd2l0aG91dCByY3VfcmVhZF9sb2NrKCkgb3IgdGhlIGtjdHggbG9jay5cbiYjNDM7ICpcbiYjNDM7ICogQ29udGV4dDogUHJvY2VzcyBjb250ZXh0IGR1cmluZyBzaHV0ZG93bi9yZXNldFxuJiM0MzsgKi9cbiYjNDM7dm9pZCBibnh0X2NyeXB0b19kZWxfYWxsKHN0cnVjdCBibnh0ICpicClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBibnh0X2NyeXB0b19pbmZvICpjcnlwdG8gPSBicC1cdTAwM2VjcnlwdG9faW5mbztcbiYjNDM7XHRzdHJ1Y3QgYm54dF9raWRfaW5mbyAqa2lkO1xuJiM0MztcdHN0cnVjdCBibnh0X2tjdHggKmtjdHg7XG4mIzQzO1x0aW50IGk7XG4mIzQzO1xuJiM0MztcdGlmICghY3J5cHRvKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcbiYjNDM7XHQvKiBObyBjb25jdXJyZW50IGFjY2Vzczsgc2VlIHRoZSBsb2NraW5nIG5vdGUgYWJvdmUuICovXG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgQk5YVF9NQVhfQ1JZUFRPX0tFWV9UWVBFOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0a2N0eCA9IFx1MDAyNmNyeXB0by1cdTAwM2VrY3R4W2ldO1xuJiM0MztcdFx0bGlzdF9mb3JfZWFjaF9lbnRyeShraWQsIFx1MDAyNmtjdHgtXHUwMDNlbGlzdCwgbGlzdClcbiYjNDM7XHRcdFx0Ym54dF9jcnlwdG9fZGVsX2FsbF9raWRzKGJwLCBraWQpO1xuJiM0MztcdFx0a2N0eC1cdTAwM2VlcG9jaCA9IEJOWFRfTkVYVF9FUE9DSChrY3R4LVx1MDAzZWVwb2NoKTtcbiYjNDM7XHR9XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBibnh0X2NsZWFyX2NyeXB0byAtIENsZWFyIGFsbCBjcnlwdG8ga2V5IGNvbnRleHRzXG4mIzQzOyAqIEBicDogcG9pbnRlciB0byBibnh0IGRldmljZVxuJiM0MzsgKlxuJiM0MzsgKiBDbGVhcnMgYWxsIGtleSBjb250ZXh0IGFsbG9jYXRpb25zIGR1cmluZyBzaHV0ZG93biBvciBmaXJtd2FyZSByZXNldC5cbiYjNDM7ICogRnJlZXMgYWxsIGtleSBpbmZvIHN0cnVjdHVyZXMgYW5kIGJpdG1hcHMsIGFuZCBpbmNyZW1lbnRzIHRoZSBlcG9jaFxuJiM0MzsgKiBjb3VudGVyIHRvIGludmFsaWRhdGUgYW55IG91dHN0YW5kaW5nIGtleSByZWZlcmVuY2VzLlxuJiM0MzsgKlxuJiM0MzsgKiBMb2NraW5nOiB0aGUgY2FsbGVyIG11c3QgaGF2ZSBjbGVhcmVkIEJOWFRfU1RBVEVfT1BFTiBhbmQgd2FpdGVkIGZvciBhbGxcbiYjNDM7ICogaW4tZmxpZ2h0IGtUTFMgY29udHJvbCBvcHMgdG8gZHJhaW4uICBVbmRlciB0aGVzZSBwcmVjb25kaXRpb25zIHRoZXJlIGFyZVxuJiM0MzsgKiBubyBjb25jdXJyZW50IHJlYWRlcnMgb3Igd3JpdGVycyBvZiB0aGUgS0lEIGxpc3RzLCBzbyB0aGUgbGlzdHMgY2FuIGJlXG4mIzQzOyAqIHdhbGtlZCB3aXRob3V0IHJjdV9yZWFkX2xvY2soKSBvciB0aGUga2N0eCBsb2NrLlxuJiM0MzsgKlxuJiM0MzsgKiBDb250ZXh0OiBQcm9jZXNzIGNvbnRleHQgZHVyaW5nIHNodXRkb3duL3Jlc2V0XG4mIzQzOyAqL1xuJiM0Mzt2b2lkIGJueHRfY2xlYXJfY3J5cHRvKHN0cnVjdCBibnh0ICpicClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBibnh0X2NyeXB0b19pbmZvICpjcnlwdG8gPSBicC1cdTAwM2VjcnlwdG9faW5mbztcbiYjNDM7XHRzdHJ1Y3QgYm54dF9raWRfaW5mbyAqa2lkLCAqdG1wO1xuJiM0MztcdHN0cnVjdCBibnh0X2tjdHggKmtjdHg7XG4mIzQzO1x0aW50IGk7XG4mIzQzO1xuJiM0MztcdGlmICghY3J5cHRvKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcbiYjNDM7XHQvKiBObyBjb25jdXJyZW50IGFjY2Vzczsgc2VlIHRoZSBsb2NraW5nIG5vdGUgYWJvdmUuICovXG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgQk5YVF9NQVhfQ1JZUFRPX0tFWV9UWVBFOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0a2N0eCA9IFx1MDAyNmNyeXB0by1cdTAwM2VrY3R4W2ldO1xuJiM0MztcdFx0bGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGtpZCwgdG1wLCBcdTAwMjZrY3R4LVx1MDAzZWxpc3QsIGxpc3QpIHtcbiYjNDM7XHRcdFx0bGlzdF9kZWwoXHUwMDI2a2lkLVx1MDAzZWxpc3QpO1xuJiM0MztcdFx0XHRrZnJlZShraWQpO1xuJiM0MztcdFx0fVxuJiM0MztcdFx0a2N0eC1cdTAwM2V0b3RhbF9hbGxvYyA9IDA7XG4mIzQzO1x0XHRrY3R4LVx1MDAzZWVwb2NoID0gQk5YVF9ORVhUX0VQT0NIKGtjdHgtXHUwMDNlZXBvY2gpO1xuJiM0MztcdH1cbiYjNDM7fVxuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIGJueHRfZnJlZV9jcnlwdG9faW5mbyAtIEZyZWUgY3J5cHRvIG9mZmxvYWQgcmVzb3VyY2VzXG4mIzQzOyAqIEBicDogcG9pbnRlciB0byBibnh0IGRldmljZVxuJiM0MzsgKlxuJiM0MzsgKiBGcmVlcyBhbGwgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCBjcnlwdG8gb2ZmbG9hZC4gIENhbGwgdGhpcyBmdW5jdGlvblxuJiM0MzsgKiBvbmx5IHdoZW4gaXQgaXMgaWRsZSB3aXRoIG5vdGhpbmcgaW4tZmxpZ2h0LlxuJiM0MzsgKlxuJiM0MzsgKiBDb250ZXh0OiBQcm9jZXNzIGNvbnRleHQgZHVyaW5nIGRldmljZSBzaHV0ZG93bi9yZW1vdmFsXG4mIzQzOyAqL1xuJiM0Mzt2b2lkIGJueHRfZnJlZV9jcnlwdG9faW5mbyhzdHJ1Y3QgYm54dCAqYnApXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYm54dF9jcnlwdG9faW5mbyAqY3J5cHRvID0gYnAtXHUwMDNlY3J5cHRvX2luZm87XG4mIzQzO1xuJiM0MztcdGJueHRfZnJlZV9rdGxzX2luZm8oYnApO1xuJiM0MztcdGlmICghY3J5cHRvKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcdGJueHRfY2xlYXJfY3J5cHRvKGJwKTtcbiYjNDM7XHRrbWVtX2NhY2hlX2Rlc3Ryb3koY3J5cHRvLVx1MDAzZW1wY19jYWNoZSk7XG4mIzQzO1x0a2ZyZWUoY3J5cHRvKTtcbiYjNDM7XHRicC1cdTAwM2VjcnlwdG9faW5mbyA9IE5VTEw7XG4mIzQzO1x0YnAtXHUwMDNlZndfY2FwIFx1MDAyNj0gfkJOWFRfRldfQ0FQX0tUTFM7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBibnh0X2h3cm1fcmVzZXJ2ZV9wZl9rZXlfY3R4cyAtIFJlc2VydmUga2V5IGNvbnRleHRzIHdpdGggZmlybXdhcmVcbiYjNDM7ICogQGJwOiBwb2ludGVyIHRvIGJueHQgZGV2aWNlXG4mIzQzOyAqIEByZXE6IHBvaW50ZXIgdG8gSFdSTSBmdW5jdGlvbiBjb25maWcgcmVxdWVzdFxuJiM0MzsgKlxuJiM0MzsgKiBQb3B1bGF0ZXMgdGhlIGZpcm13YXJlIHJlcXVlc3Qgd2l0aCBrZXkgY29udGV4dCByZXNlcnZhdGlvbiBwYXJhbWV0ZXJzXG4mIzQzOyAqIGZvciBjcnlwdG8gb2ZmbG9hZCBiYXNlZCBvbiBjdXJyZW50IG1heCBzZXR0aW5ncyBhbmQgY2FwYWJpbGl0aWVzLlxuJiM0MzsgKlxuJiM0MzsgKiBDb250ZXh0OiBQcm9jZXNzIGNvbnRleHQgZHVyaW5nIGRldmljZSBjb25maWd1cmF0aW9uXG4mIzQzOyAqL1xuJiM0Mzt2b2lkIGJueHRfaHdybV9yZXNlcnZlX3BmX2tleV9jdHhzKHN0cnVjdCBibnh0ICpicCxcbiYjNDM7XHRcdFx0XHQgICBzdHJ1Y3QgaHdybV9mdW5jX2NmZ19pbnB1dCAqcmVxKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGJueHRfY3J5cHRvX2luZm8gKmNyeXB0byA9IGJwLVx1MDAzZWNyeXB0b19pbmZvO1xuJiM0MztcdHN0cnVjdCBibnh0X2h3X3Jlc2MgKmh3X3Jlc2MgPSBcdTAwMjZicC1cdTAwM2Vod19yZXNjO1xuJiM0MztcdHN0cnVjdCBibnh0X2h3X2NyeXB0b19yZXNjICpjcnlwdG9fcmVzYztcbiYjNDM7XHR1MzIgdHgsIHJ4O1xuJiM0MztcbiYjNDM7XHRpZiAoIWNyeXB0byB8fCAhQk5YVF9TVVBQT1JUU19LVExTKGJwKSlcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XG4mIzQzO1x0Y3J5cHRvX3Jlc2MgPSBcdTAwMjZod19yZXNjLVx1MDAzZWNyeXB0b19yZXNjO1xuJiM0MztcdHR4ID0gbWluKEJOWFRfVENLKGNyeXB0bykubWF4X2N0eCwgY3J5cHRvX3Jlc2MtXHUwMDNlbWF4X3R4X2tleV9jdHhzKTtcbiYjNDM7XHRyeCA9IG1pbihCTlhUX1JDSyhjcnlwdG8pLm1heF9jdHgsIGNyeXB0b19yZXNjLVx1MDAzZW1heF9yeF9rZXlfY3R4cyk7XG4mIzQzO1x0cmVxLVx1MDAzZW51bV9rdGxzX3R4X2tleV9jdHhzID0gY3B1X3RvX2xlMzIodHgpO1xuJiM0MztcdHJlcS1cdTAwM2VudW1fa3Rsc19yeF9rZXlfY3R4cyA9IGNwdV90b19sZTMyKHJ4KTtcbiYjNDM7XHRpZiAodHgpXG4mIzQzO1x0XHRyZXEtXHUwMDNlZW5hYmxlcyB8PSBjcHVfdG9fbGUzMihGVU5DX0NGR19SRVFfRU5BQkxFU19LVExTX1RYX0tFWV9DVFhTKTtcbiYjNDM7XHRpZiAocngpXG4mIzQzO1x0XHRyZXEtXHUwMDNlZW5hYmxlcyB8PSBjcHVfdG9fbGUzMihGVU5DX0NGR19SRVFfRU5BQkxFU19LVExTX1JYX0tFWV9DVFhTKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBibnh0X2tleV9jdHhfc3RvcmUoc3RydWN0IGJueHRfa2N0eCAqa2N0eCwgX19sZTMyICprZXlfYnVmLCB1MzIgbnVtLFxuJiM0MztcdFx0XHQgICAgICBib29sIGNvbnRpZywgdTgga2luZCwgdTMyICppZClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBibnh0X2tpZF9pbmZvICpraWQ7XG4mIzQzO1x0dTMyIGk7XG4mIzQzO1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG51bTsgKSB7XG4mIzQzO1x0XHRraWQgPSBremFsbG9jX29iaigqa2lkKTtcbiYjNDM7XHRcdC8qIElmIHdlIGNhbm5vdCBzdG9yZSB0aGUgSURzLCB0aGV5IHdpbGwgYmUgbG9zdCBhbmQgb25seVxuJiM0MztcdFx0ICogcmVjbGFpbWVkIGJ5IHRoZSBGVyBkdXJpbmcgcmVzZXQvcmVpbml0LlxuJiM0MztcdFx0ICovXG4mIzQzO1x0XHRpZiAoIWtpZClcbiYjNDM7XHRcdFx0cmV0dXJuIC1FTk9NRU07XG4mIzQzO1x0XHRraWQtXHUwMDNlc3RhcnRfaWQgPSBsZTMyX3RvX2NwdShrZXlfYnVmW2ldKTtcbiYjNDM7XHRcdGtpZC1cdTAwM2V0eXBlID0ga2N0eC1cdTAwM2V0eXBlO1xuJiM0MztcdFx0a2lkLVx1MDAzZWtpbmQgPSBraW5kO1xuJiM0MztcdFx0aWYgKGNvbnRpZylcbiYjNDM7XHRcdFx0a2lkLVx1MDAzZWNvdW50ID0gbnVtO1xuJiM0MztcdFx0ZWxzZVxuJiM0MztcdFx0XHRraWQtXHUwMDNlY291bnQgPSAxO1xuJiM0MztcdFx0Yml0bWFwX3NldChraWQtXHUwMDNlaWRzLCAwLCBraWQtXHUwMDNlY291bnQpO1xuJiM0MztcdFx0aWYgKGlkIFx1MDAyNlx1MDAyNiAhaSkge1xuJiM0MztcdFx0XHRjbGVhcl9iaXQoMCwga2lkLVx1MDAzZWlkcyk7XG4mIzQzO1x0XHRcdCppZCA9IEJOWFRfU0VUX0tJRChrY3R4LCBraWQtXHUwMDNlc3RhcnRfaWQpO1xuJiM0MztcdFx0fVxuJiM0MztcdFx0c3Bpbl9sb2NrKFx1MDAyNmtjdHgtXHUwMDNlbG9jayk7XG4mIzQzO1x0XHRsaXN0X2FkZF90YWlsX3JjdShcdTAwMjZraWQtXHUwMDNlbGlzdCwgXHUwMDI2a2N0eC1cdTAwM2VsaXN0KTtcbiYjNDM7XHRcdFdSSVRFX09OQ0Uoa2N0eC1cdTAwM2V0b3RhbF9hbGxvYyxcbiYjNDM7XHRcdFx0ICAgUkVBRF9PTkNFKGtjdHgtXHUwMDNldG90YWxfYWxsb2MpICYjNDM7IGtpZC1cdTAwM2Vjb3VudCk7XG4mIzQzO1x0XHRzcGluX3VubG9jayhcdTAwMjZrY3R4LVx1MDAzZWxvY2spO1xuJiM0MztcdFx0aSAmIzQzOz0ga2lkLVx1MDAzZWNvdW50O1xuJiM0MztcdH1cbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyogTm90ZSB0aGF0IHRoZSBkcml2ZXIgZG9lcyBub3QgZnJlZSB0aGUga2V5IGNvbnRleHRzLiAgVGhleSBhcmUgZnJlZWRcbiYjNDM7ICogYnkgdGhlIEZXIGR1cmluZyBGTFIgYW5kIEhXUk1fRlVOQ19SRVNFVC5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbnQgYm54dF9od3JtX2tleV9jdHhfYWxsb2Moc3RydWN0IGJueHQgKmJwLCBzdHJ1Y3QgYm54dF9rY3R4ICprY3R4LFxuJiM0MztcdFx0XHRcdCAgIHU4IGtpbmQsIHUzMiBudW0sIHUzMiAqaWQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYm54dF9jcnlwdG9faW5mbyAqY3J5cHRvID0gYnAtXHUwMDNlY3J5cHRvX2luZm87XG4mIzQzO1x0c3RydWN0IGh3cm1fZnVuY19rZXlfY3R4X2FsbG9jX291dHB1dCAqcmVzcDtcbiYjNDM7XHRzdHJ1Y3QgaHdybV9mdW5jX2tleV9jdHhfYWxsb2NfaW5wdXQgKnJlcTtcbiYjNDM7XHRkbWFfYWRkcl90IG1hcHBpbmc7XG4mIzQzO1x0aW50IHBlbmRpbmdfY291bnQ7XG4mIzQzO1x0X19sZTMyICprZXlfYnVmO1xuJiM0MztcdHUzMiBudW1fYWxsb2M7XG4mIzQzO1x0Ym9vbCBjb250aWc7XG4mIzQzO1x0aW50IHJjO1xuJiM0MztcbiYjNDM7XHRudW0gPSBtaW4zKG51bSwgY3J5cHRvLVx1MDAzZW1heF9rZXlfY3R4c19hbGxvYywgKHUzMilCTlhUX0tJRF9CQVRDSF9TSVpFKTtcbiYjNDM7XHRyYyA9IGh3cm1fcmVxX2luaXQoYnAsIHJlcSwgSFdSTV9GVU5DX0tFWV9DVFhfQUxMT0MpO1xuJiM0MztcdGlmIChyYylcbiYjNDM7XHRcdHJldHVybiByYztcbiYjNDM7XG4mIzQzO1x0a2V5X2J1ZiA9IGh3cm1fcmVxX2RtYV9zbGljZShicCwgcmVxLCBudW0gKiA0LCBcdTAwMjZtYXBwaW5nKTtcbiYjNDM7XHRpZiAoIWtleV9idWYpIHtcbiYjNDM7XHRcdHJjID0gLUVOT01FTTtcbiYjNDM7XHRcdGdvdG8ga2V5X2FsbG9jX2V4aXQ7XG4mIzQzO1x0fVxuJiM0MztcdHJlcS1cdTAwM2VkbWFfYnVmcl9zaXplX2J5dGVzID0gY3B1X3RvX2xlMzIobnVtICogNCk7XG4mIzQzO1x0cmVxLVx1MDAzZWhvc3RfZG1hX2FkZHIgPSBjcHVfdG9fbGU2NChtYXBwaW5nKTtcbiYjNDM7XHRyZXNwID0gaHdybV9yZXFfaG9sZChicCwgcmVxKTtcbiYjNDM7XG4mIzQzO1x0cmVxLVx1MDAzZWtleV9jdHhfdHlwZSA9IGtjdHgtXHUwMDNldHlwZTtcbiYjNDM7XHRyZXEtXHUwMDNlbnVtX2tleV9jdHhzID0gY3B1X3RvX2xlMTYobnVtKTtcbiYjNDM7XG4mIzQzO1x0cGVuZGluZ19jb3VudCA9IGF0b21pY19pbmNfcmV0dXJuKFx1MDAyNmtjdHgtXHUwMDNlYWxsb2NfcGVuZGluZyk7XG4mIzQzO1x0cmMgPSBod3JtX3JlcV9zZW5kKGJwLCByZXEpO1xuJiM0MztcdGF0b21pY19kZWMoXHUwMDI2a2N0eC1cdTAwM2VhbGxvY19wZW5kaW5nKTtcbiYjNDM7XHRpZiAocmMpXG4mIzQzO1x0XHRnb3RvIGtleV9hbGxvY19leGl0X3dha2U7XG4mIzQzO1xuJiM0MztcdG51bV9hbGxvYyA9IGxlMTZfdG9fY3B1KHJlc3AtXHUwMDNlbnVtX2tleV9jdHhzX2FsbG9jYXRlZCk7XG4mIzQzO1x0aWYgKG51bV9hbGxvYyBcdTAwM2UgbnVtKSB7XG4mIzQzO1x0XHRuZXRkZXZfd2FybihicC1cdTAwM2VkZXYsXG4mIzQzO1x0XHRcdCAgICBcJiMzNDtGVyBhbGxvY2F0ZWQgbW9yZSB0eXBlICVkIGtleXMgKCVkKSB0aGFuIHJlcXVlc3RlZCAoJWQpXFxuXCYjMzQ7LFxuJiM0MztcdFx0XHQgICAga2N0eC1cdTAwM2V0eXBlLCBudW1fYWxsb2MsIG51bSk7XG4mIzQzO1x0fSBlbHNlIGlmICghbnVtX2FsbG9jKSB7XG4mIzQzO1x0XHRuZXRkZXZfd2FybihicC1cdTAwM2VkZXYsXG4mIzQzO1x0XHRcdCAgICBcJiMzNDtGVyBhbGxvY2F0ZWQgMCB0eXBlICVkIGtleXNcXG5cJiMzNDssIGtjdHgtXHUwMDNldHlwZSk7XG4mIzQzO1x0XHRyYyA9IC1FTk9FTlQ7XG4mIzQzO1x0XHRnb3RvIGtleV9hbGxvY19leGl0X3dha2U7XG4mIzQzO1x0fSBlbHNlIHtcbiYjNDM7XHRcdG51bSA9IG51bV9hbGxvYztcbiYjNDM7XHR9XG4mIzQzO1x0Y29udGlnID0gcmVzcC1cdTAwM2VmbGFncyBcdTAwMjZcbiYjNDM7XHRcdCBGVU5DX0tFWV9DVFhfQUxMT0NfUkVTUF9GTEFHU19LRVlfQ1RYU19DT05USUdVT1VTO1xuJiM0MztcdHJjID0gYm54dF9rZXlfY3R4X3N0b3JlKGtjdHgsIGtleV9idWYsIG51bSwgY29udGlnLCBraW5kLCBpZCk7XG4mIzQzO1xuJiM0MztrZXlfYWxsb2NfZXhpdF93YWtlOlxuJiM0MztcdGlmIChwZW5kaW5nX2NvdW50IFx1MDAzZT0gQk5YVF9LQ1RYX0FMTE9DX1BFTkRJTkdfTUFYKVxuJiM0MztcdFx0d2FrZV91cF9hbGwoXHUwMDI2a2N0eC1cdTAwM2VhbGxvY19wZW5kaW5nX3dxKTtcbiYjNDM7a2V5X2FsbG9jX2V4aXQ6XG4mIzQzO1x0aHdybV9yZXFfZHJvcChicCwgcmVxKTtcbiYjNDM7XHRyZXR1cm4gcmM7XG4mIzQzO31cbiYjNDM7XG4mIzQzO2Jvb2wgYm54dF9raWRfdmFsaWQoc3RydWN0IGJueHRfa2N0eCAqa2N0eCwgdTMyIGlkKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGJueHRfa2lkX2luZm8gKmtpZDtcbiYjNDM7XHRib29sIHZhbGlkID0gZmFsc2U7XG4mIzQzO1x0dTMyIGVwb2NoO1xuJiM0MztcbiYjNDM7XHRlcG9jaCA9IEJOWFRfS0lEX0VQT0NIKGlkKTtcbiYjNDM7XHRpZiAoZXBvY2ggIT0ga2N0eC1cdTAwM2VlcG9jaClcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XG4mIzQzO1x0aWQgPSBCTlhUX0tJRF9IVyhpZCk7XG4mIzQzO1x0cmN1X3JlYWRfbG9jaygpO1xuJiM0MztcdGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGtpZCwgXHUwMDI2a2N0eC1cdTAwM2VsaXN0LCBsaXN0KSB7XG4mIzQzO1x0XHRpZiAoaWQgXHUwMDNlPSBraWQtXHUwMDNlc3RhcnRfaWQgXHUwMDI2XHUwMDI2IGlkIFx1MDAzYyBraWQtXHUwMDNlc3RhcnRfaWQgJiM0Mzsga2lkLVx1MDAzZWNvdW50KSB7XG4mIzQzO1x0XHRcdGlmICghdGVzdF9iaXQoaWQgLSBraWQtXHUwMDNlc3RhcnRfaWQsIGtpZC1cdTAwM2VpZHMpKSB7XG4mIzQzO1x0XHRcdFx0dmFsaWQgPSB0cnVlO1xuJiM0MztcdFx0XHRcdGJyZWFrO1xuJiM0MztcdFx0XHR9XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MztcdHJjdV9yZWFkX3VubG9jaygpO1xuJiM0MztcdHJldHVybiB2YWxpZDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBibnh0X2FsbG9jX29uZV9rY3R4KHN0cnVjdCBibnh0X2tjdHggKmtjdHgsIHU4IGtpbmQsIHUzMiAqaWQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYm54dF9raWRfaW5mbyAqa2lkO1xuJiM0MztcdGludCByYyA9IC1FTk9NRU07XG4mIzQzO1xuJiM0MztcdHJjdV9yZWFkX2xvY2soKTtcbiYjNDM7XHRsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShraWQsIFx1MDAyNmtjdHgtXHUwMDNlbGlzdCwgbGlzdCkge1xuJiM0MztcdFx0dTMyIGlkeCA9IDA7XG4mIzQzO1xuJiM0MztcdFx0aWYgKGtpZC1cdTAwM2VraW5kICE9IGtpbmQpXG4mIzQzO1x0XHRcdGNvbnRpbnVlO1xuJiM0MztcdFx0ZG8ge1xuJiM0MztcdFx0XHRpZHggPSBmaW5kX25leHRfYml0KGtpZC1cdTAwM2VpZHMsIGtpZC1cdTAwM2Vjb3VudCwgaWR4KTtcbiYjNDM7XHRcdFx0aWYgKGlkeCBcdTAwM2U9IGtpZC1cdTAwM2Vjb3VudClcbiYjNDM7XHRcdFx0XHRicmVhaztcbiYjNDM7XHRcdFx0aWYgKHRlc3RfYW5kX2NsZWFyX2JpdChpZHgsIGtpZC1cdTAwM2VpZHMpKSB7XG4mIzQzO1x0XHRcdFx0KmlkID0gQk5YVF9TRVRfS0lEKGtjdHgsIGtpZC1cdTAwM2VzdGFydF9pZCAmIzQzOyBpZHgpO1xuJiM0MztcdFx0XHRcdHJjID0gMDtcbiYjNDM7XHRcdFx0XHRnb3RvIGFsbG9jX2RvbmU7XG4mIzQzO1x0XHRcdH1cbiYjNDM7XHRcdH0gd2hpbGUgKDEpO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO2FsbG9jX2RvbmU6XG4mIzQzO1x0cmN1X3JlYWRfdW5sb2NrKCk7XG4mIzQzO1x0cmV0dXJuIHJjO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogYm54dF9mcmVlX29uZV9rY3R4IC0gRnJlZSBhIGtleSBjb250ZXh0IGZvciBsYXRlciByZS11c2VcbiYjNDM7ICogQGtjdHg6IHBvaW50ZXIgdG8gYm54dF9rY3R4IGtleSBjb250ZXh0IHN0cnVjdHVyZVxuJiM0MzsgKiBAaWQ6IEtleSBjb250ZXh0IElEXG4mIzQzOyAqXG4mIzQzOyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGZyZWUgYSBrZXkgY29udGV4dCBJRCB3aGVuIHRoZSBvZmZsb2FkXG4mIzQzOyAqIHVzaW5nIHRoZSBJRCBoYXMgc3VjY2Vzc2Z1bGx5IHRlcm1pbmF0ZWQgb3IgYWJvcnRlZC4gIElmIHRoZSBvZmZsb2FkXG4mIzQzOyAqIGNhbm5vdCBiZSB0ZXJtaW5hdGVkLCB0aGUgY2FsbGVyIHNob3VsZCBub3QgY2FsbCB0aGlzIGZ1bmN0aW9uIHRvIGZyZWVcbiYjNDM7ICogdGhlIElELiAgVGhlIElEIHdpbGwgb25seSBiZSByZWN5Y2xlZCBieSB0aGUgRlcgZHVyaW5nIHJlc2V0L3JlaW5pdC5cbiYjNDM7ICpcbiYjNDM7ICogVGhlIElEIGlzIG1hdGNoZWQgYnkgaXRzIGhhcmR3YXJlIGlkIG9ubHkgKGVwb2NoIHN0cmlwcGVkKSwgc28gdGhlIGNhbGxlclxuJiM0MzsgKiBtdXN0IGVuc3VyZSBpdCBpcyB2YWxpZCBmb3IgdGhlIGN1cnJlbnQgZXBvY2guXG4mIzQzOyAqL1xuJiM0Mzt2b2lkIGJueHRfZnJlZV9vbmVfa2N0eChzdHJ1Y3QgYm54dF9rY3R4ICprY3R4LCB1MzIgaWQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYm54dF9raWRfaW5mbyAqa2lkO1xuJiM0MztcbiYjNDM7XHRpZCA9IEJOWFRfS0lEX0hXKGlkKTtcbiYjNDM7XHRyY3VfcmVhZF9sb2NrKCk7XG4mIzQzO1x0bGlzdF9mb3JfZWFjaF9lbnRyeV9yY3Uoa2lkLCBcdTAwMjZrY3R4LVx1MDAzZWxpc3QsIGxpc3QpIHtcbiYjNDM7XHRcdGlmIChpZCBcdTAwM2U9IGtpZC1cdTAwM2VzdGFydF9pZCBcdTAwMjZcdTAwMjYgaWQgXHUwMDNjIGtpZC1cdTAwM2VzdGFydF9pZCAmIzQzOyBraWQtXHUwMDNlY291bnQpIHtcbiYjNDM7XHRcdFx0c2V0X2JpdChpZCAtIGtpZC1cdTAwM2VzdGFydF9pZCwga2lkLVx1MDAzZWlkcyk7XG4mIzQzO1x0XHRcdGJyZWFrO1xuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XHRyY3VfcmVhZF91bmxvY2soKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7I2RlZmluZSBCTlhUX0tDVFhfQUxMT0NfUkVUUllfTUFYXHQzXG4mIzQzO1xuJiM0MztpbnQgYm54dF9rZXlfY3R4X2FsbG9jX29uZShzdHJ1Y3QgYm54dCAqYnAsIHN0cnVjdCBibnh0X2tjdHggKmtjdHgsIHU4IGtpbmQsXG4mIzQzO1x0XHRcdCAgIHUzMiAqaWQpXG4mIzQzO3tcbiYjNDM7XHRpbnQgcmMsIHJldHJ5ID0gMDtcbiYjNDM7XG4mIzQzO1x0d2hpbGUgKHJldHJ5JiM0MzsmIzQzOyBcdTAwM2MgQk5YVF9LQ1RYX0FMTE9DX1JFVFJZX01BWCkge1xuJiM0MztcdFx0cmMgPSBibnh0X2FsbG9jX29uZV9rY3R4KGtjdHgsIGtpbmQsIGlkKTtcbiYjNDM7XHRcdGlmICghcmMpXG4mIzQzO1x0XHRcdHJldHVybiAwO1xuJiM0MztcbiYjNDM7XHRcdC8qIFdoZW4gYXBwcm9hY2hpbmcgdGhlIG1heCwgbXVsdGlwbGUgdGhyZWFkcyBtYXkgcHJvY2VlZFxuJiM0MztcdFx0ICogYW5kIGV4Y2VlZCB0aGUgbWF4LiAgU29tZSBtYXkgZmFpbCB0aGUgc2VyaWFsaXplZCBIV1JNIGNhbGxcbiYjNDM7XHRcdCAqIGxhdGVyIHdoZW4gdGhlIG1heCBpcyBleGNlZWRlZC5cbiYjNDM7XHRcdCAqL1xuJiM0MztcdFx0aWYgKChSRUFEX09OQ0Uoa2N0eC1cdTAwM2V0b3RhbF9hbGxvYykgJiM0MzsgQk5YVF9LSURfQkFUQ0hfU0laRSkgXHUwMDNlXG4mIzQzO1x0XHQgICAga2N0eC1cdTAwM2VtYXhfY3R4KVxuJiM0MztcdFx0XHRyZXR1cm4gLUVOT1NQQztcbiYjNDM7XG4mIzQzO1x0XHRpZiAoIUJOWFRfS0NUWF9BTExPQ19PSyhrY3R4KSkge1xuJiM0MztcdFx0XHR3YWl0X2V2ZW50KGtjdHgtXHUwMDNlYWxsb2NfcGVuZGluZ193cSxcbiYjNDM7XHRcdFx0XHQgICBCTlhUX0tDVFhfQUxMT0NfT0soa2N0eCkpO1xuJiM0MztcdFx0XHRjb250aW51ZTtcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdHJjID0gYm54dF9od3JtX2tleV9jdHhfYWxsb2MoYnAsIGtjdHgsIGtpbmQsXG4mIzQzO1x0XHRcdFx0XHQgICAgIEJOWFRfS0lEX0JBVENIX1NJWkUsIGlkKTtcbiYjNDM7XHRcdGlmICghcmMpXG4mIzQzO1x0XHRcdHJldHVybiAwO1xuJiM0MztcdH1cbiYjNDM7XHRyZXR1cm4gLUVBR0FJTjtcbiYjNDM7fVxuJiM0MztcbiYjNDM7I2RlZmluZSBCTlhUX1hNSVRfQ1JZUFRPX1JFVFJZX01BWFx0MTBcbiYjNDM7I2RlZmluZSBCTlhUX1hNSVRfQ1JZUFRPX01JTl9UTU9cdDEwMFxuJiM0MzsjZGVmaW5lIEJOWFRfWE1JVF9DUllQVE9fTUFYX1RNT1x0MTUwXG4mIzQzO1xuJiM0MztpbnQgYm54dF94bWl0X2NyeXB0b19jbWQoc3RydWN0IGJueHQgKmJwLCBzdHJ1Y3QgYm54dF90eF9yaW5nX2luZm8gKnR4cixcbiYjNDM7XHRcdFx0IHZvaWQgKmNtZCwgdW5zaWduZWQgaW50IGxlbiwgdW5zaWduZWQgaW50IHRtbylcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBibnh0X2NyeXB0b19pbmZvICpjcnlwdG8gPSBicC1cdTAwM2VjcnlwdG9faW5mbztcbiYjNDM7XHRzdHJ1Y3QgYm54dF9jcnlwdG9fY21kX2N0eCAqY3R4ID0gTlVMTDtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIHRtb19sZWZ0LCBoYW5kbGUgPSAwO1xuJiM0MztcdGludCByYywgcmV0cnkgPSAwO1xuJiM0MztcbiYjNDM7XHRpZiAodG1vKSB7XG4mIzQzO1x0XHR1MzIga2lkID0gQ0VfQ01EX0tJRChjbWQpO1xuJiM0MztcbiYjNDM7XHRcdGN0eCA9IGttZW1fY2FjaGVfYWxsb2MoY3J5cHRvLVx1MDAzZW1wY19jYWNoZSwgR0ZQX0tFUk5FTCk7XG4mIzQzO1x0XHRpZiAoIWN0eClcbiYjNDM7XHRcdFx0cmV0dXJuIC1FTk9NRU07XG4mIzQzO1x0XHRpbml0X2NvbXBsZXRpb24oXHUwMDI2Y3R4LVx1MDAzZWNtcCk7XG4mIzQzO1x0XHRoYW5kbGUgPSAodW5zaWduZWQgbG9uZyljdHg7XG4mIzQzO1x0XHRjdHgtXHUwMDNla2lkID0ga2lkO1xuJiM0MztcdFx0Y3R4LVx1MDAzZWNsaWVudCA9IHR4ci1cdTAwM2V0eF9yaW5nX3N0cnVjdC5tcGNfY2hubF90eXBlO1xuJiM0MztcdFx0Y3R4LVx1MDAzZXN0YXR1cyA9IDA7XG4mIzQzO1x0XHQvKiBPbmUgcmVmZXJlbmNlIGZvciB0aGlzIGNhbGxlciwgb25lIGZvciB0aGUgaGFuZGxlIHN0b3JlZCBpblxuJiM0MztcdFx0ICogdGhlIFRYIGJ1ZiByaW5nLiAgVGhlIGxhdHRlciBpcyBkcm9wcGVkIGJ5XG4mIzQzO1x0XHQgKiBibnh0X2NyeXB0b19tcGNfY21wKCkgd2hlbiB0aGUgY29tbWFuZCBpcyBjb21wbGV0ZWQgbm9ybWFsbHlcbiYjNDM7XHRcdCAqIG9yIGFmdGVyIHRpbWVvdXQuXG4mIzQzO1x0XHQgKi9cbiYjNDM7XHRcdHJlZmNvdW50X3NldChcdTAwMjZjdHgtXHUwMDNlcmVmY250LCAyKTtcbiYjNDM7XHRcdHJldHJ5ID0gQk5YVF9YTUlUX0NSWVBUT19SRVRSWV9NQVg7XG4mIzQzO1x0XHRtaWdodF9zbGVlcCgpO1xuJiM0MztcdH1cbiYjNDM7XHRkbyB7XG4mIzQzO1x0XHRzcGluX2xvY2tfYmgoXHUwMDI2dHhyLVx1MDAzZXR4X2xvY2spO1xuJiM0MztcdFx0cmMgPSBibnh0X3N0YXJ0X3htaXRfbXBjKGJwLCB0eHIsIGNtZCwgbGVuLCBoYW5kbGUpO1xuJiM0MztcdFx0c3Bpbl91bmxvY2tfYmgoXHUwMDI2dHhyLVx1MDAzZXR4X2xvY2spO1xuJiM0MztcdFx0aWYgKHJjID09IC1FQlVTWSBcdTAwMjZcdTAwMjYgdG1vIFx1MDAyNlx1MDAyNiByZXRyeSlcbiYjNDM7XHRcdFx0dXNsZWVwX3JhbmdlKEJOWFRfWE1JVF9DUllQVE9fTUlOX1RNTyxcbiYjNDM7XHRcdFx0XHQgICAgIEJOWFRfWE1JVF9DUllQVE9fTUFYX1RNTyk7XG4mIzQzO1x0XHRlbHNlXG4mIzQzO1x0XHRcdGJyZWFrO1xuJiM0MztcdH0gd2hpbGUgKHJldHJ5LS0pO1xuJiM0MztcdGlmIChyYyB8fCAhdG1vKSB7XG4mIzQzO1x0XHQvKiBUaGUgY29tcGxldGlvbiB3aWxsIG5ldmVyIGFycml2ZSwgZHJvcCBvbmUgcmVmZXJlbmNlICovXG4mIzQzO1x0XHRpZiAoY3R4KVxuJiM0MztcdFx0XHRyZWZjb3VudF9kZWMoXHUwMDI2Y3R4LVx1MDAzZXJlZmNudCk7XG4mIzQzO1x0XHRnb3RvIHhtaXRfZG9uZTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHRtb19sZWZ0ID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KFx1MDAyNmN0eC1cdTAwM2VjbXAsIG1zZWNzX3RvX2ppZmZpZXModG1vKSk7XG4mIzQzO1x0aWYgKCF0bW9fbGVmdCkge1xuJiM0MztcdFx0bmV0ZGV2X3dhcm4oYnAtXHUwMDNlZGV2LCBcJiMzNDtjcnlwdG8gTVAgY21kICUwOHggdGltZWQgb3V0XFxuXCYjMzQ7LFxuJiM0MztcdFx0XHQgICAgKigodTMyICopY21kKSk7XG4mIzQzO1x0XHRibnh0X21wY190aW1lb3V0KGJwLCB0eHIpO1xuJiM0MztcdFx0cmMgPSAtRVRJTUVET1VUO1xuJiM0MztcdFx0Z290byB4bWl0X2RvbmU7XG4mIzQzO1x0fVxuJiM0MztcdGlmIChjdHgtXHUwMDNlc3RhdHVzID09IEJOWFRfQ01EX0NUWF9DT01QTEVURUQgXHUwMDI2XHUwMDI2XG4mIzQzO1x0ICAgIENFX0NNUExfU1RBVFVTKFx1MDAyNmN0eC1cdTAwM2VjZV9jbXApID09IENFX0NNUExfU1RBVFVTX09LKVxuJiM0MztcdFx0cmMgPSAwO1xuJiM0MztcdGVsc2VcbiYjNDM7XHRcdHJjID0gLUVJTztcbiYjNDM7eG1pdF9kb25lOlxuJiM0MztcdGlmIChyYykge1xuJiM0MztcdFx0dTggc3RhdHVzID0gY3R4ID8gY3R4LVx1MDAzZXN0YXR1cyA6IDA7XG4mIzQzO1xuJiM0MztcdFx0bmV0ZGV2X3dhcm4oYnAtXHUwMDNlZGV2LFxuJiM0MztcdFx0XHQgICAgXCYjMzQ7TVBDIHRyYW5zbWl0IGZhaWxlZCwgcmluZyBpZHggJWQsIG9wIDB4JXgsIGtpZCAweCV4LCBzdGF0dXMgMHgleFxcblwmIzM0OyxcbiYjNDM7XHRcdFx0ICAgIHR4ci1cdTAwM2VibmFwaS1cdTAwM2VpbmRleCwgQ0VfQ01EX09QKGNtZCksIENFX0NNRF9LSUQoY21kKSxcbiYjNDM7XHRcdFx0ICAgIHN0YXR1cyk7XG4mIzQzO1x0fVxuJiM0MztcdGlmIChjdHggXHUwMDI2XHUwMDI2IHJlZmNvdW50X2RlY19hbmRfdGVzdChcdTAwMjZjdHgtXHUwMDNlcmVmY250KSlcbiYjNDM7XHRcdGttZW1fY2FjaGVfZnJlZShjcnlwdG8tXHUwMDNlbXBjX2NhY2hlLCBjdHgpO1xuJiM0MztcdHJldHVybiByYztcbiYjNDM7fVxuJiM0MztcbiYjNDM7aW50IGJueHRfY3J5cHRvX2luaXQoc3RydWN0IGJueHQgKmJwKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGJueHRfY3J5cHRvX2luZm8gKmNyeXB0byA9IGJwLVx1MDAzZWNyeXB0b19pbmZvO1xuJiM0MztcdHN0cnVjdCBibnh0X2h3X3Jlc2MgKmh3X3Jlc2MgPSBcdTAwMjZicC1cdTAwM2Vod19yZXNjO1xuJiM0MztcdHN0cnVjdCBibnh0X2h3X2NyeXB0b19yZXNjICpjcnlwdG9fcmVzYztcbiYjNDM7XHRpbnQgcmM7XG4mIzQzO1xuJiM0MztcdGlmICghY3J5cHRvIHx8ICFCTlhUX1NVUFBPUlRTX0tUTFMoYnApKVxuJiM0MztcdFx0cmV0dXJuIDA7XG4mIzQzO1xuJiM0MztcdGNyeXB0b19yZXNjID0gXHUwMDI2aHdfcmVzYy1cdTAwM2VjcnlwdG9fcmVzYztcbiYjNDM7XHRCTlhUX1RDSyhjcnlwdG8pLm1heF9jdHggPSBjcnlwdG9fcmVzYy1cdTAwM2VyZXN2X3R4X2tleV9jdHhzO1xuJiM0MztcdEJOWFRfUkNLKGNyeXB0bykubWF4X2N0eCA9IGNyeXB0b19yZXNjLVx1MDAzZXJlc3Zfcnhfa2V5X2N0eHM7XG4mIzQzO1xuJiM0MztcdGlmICghQk5YVF9UQ0soY3J5cHRvKS5tYXhfY3R4IHx8ICFCTlhUX1JDSyhjcnlwdG8pLm1heF9jdHgpXG4mIzQzO1x0XHRyZXR1cm4gLUVOT0RFVjtcbiYjNDM7XG4mIzQzO1x0cmMgPSBibnh0X2h3cm1fa2V5X2N0eF9hbGxvYyhicCwgXHUwMDI2Qk5YVF9UQ0soY3J5cHRvKSwgQk5YVF9DVFhfS0lORF9DS19UWCxcbiYjNDM7XHRcdFx0XHQgICAgIEJOWFRfS0lEX0JBVENIX1NJWkUsIE5VTEwpO1xuJiM0MztcdGlmIChyYylcbiYjNDM7XHRcdHJldHVybiByYztcbiYjNDM7XG4mIzQzO1x0cmMgPSBibnh0X2h3cm1fa2V5X2N0eF9hbGxvYyhicCwgXHUwMDI2Qk5YVF9SQ0soY3J5cHRvKSwgQk5YVF9DVFhfS0lORF9DS19SWCxcbiYjNDM7XHRcdFx0XHQgICAgIEJOWFRfS0lEX0JBVENIX1NJWkUsIE5VTEwpO1xuJiM0MztcdGlmIChyYylcbiYjNDM7XHRcdHJldHVybiByYztcbiYjNDM7XG4mIzQzO1x0Ym54dF9rdGxzX2luaXQoYnApO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0Mzt2b2lkIGJueHRfY3J5cHRvX21wY19jbXAoc3RydWN0IGJueHQgKmJwLCB1MzIgY2xpZW50LCB1bnNpZ25lZCBsb25nIGhhbmRsZSxcbiYjNDM7XHRcdFx0IHN0cnVjdCBibnh0X2NtcGxfZW50cnkgY21wbFtdLCB1MzIgZW50cmllcylcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBibnh0X2NyeXB0b19jbWRfY3R4ICpjdHg7XG4mIzQzO1x0c3RydWN0IGNlX2NtcGwgKmNtcCA9IE5VTEw7XG4mIzQzO1x0dTMyIGxlbiwga2lkO1xuJiM0MztcbiYjNDM7XHRpZiAobGlrZWx5KGNtcGwpKVxuJiM0MztcdFx0Y21wID0gY21wbFswXS5jbXBsO1xuJiM0MztcdGlmICghaGFuZGxlIHx8IGVudHJpZXMgIT0gMSkge1xuJiM0MztcdFx0aWYgKGVudHJpZXMgIT0gMSBcdTAwMjZcdTAwMjYgY21wbCkge1xuJiM0MztcdFx0XHRuZXRkZXZfd2FybihicC1cdTAwM2VkZXYsIFwmIzM0O0ludmFsaWQgZW50cmllcyAlZCB3aXRoIGhhbmRsZSAlbHggY21wbCAlMDh4IGluICVzKClcXG5cJiMzNDssXG4mIzQzO1x0XHRcdFx0ICAgIGVudHJpZXMsIGhhbmRsZSwgKih1MzIgKiljbXAsIF9fZnVuY19fKTtcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdGlmICghaGFuZGxlKVxuJiM0MztcdFx0XHRyZXR1cm47XG4mIzQzO1x0fVxuJiM0MztcdGN0eCA9ICh2b2lkICopaGFuZGxlO1xuJiM0MztcdGN0eC1cdTAwM2VzdGF0dXMgPSBCTlhUX0NNRF9DVFhfQ09NUExFVEVEO1xuJiM0MztcdGlmICh1bmxpa2VseSghY21wbCkpIHtcbiYjNDM7XHRcdGN0eC1cdTAwM2VzdGF0dXMgfD0gQk5YVF9DTURfQ1RYX1JFU0VUO1xuJiM0MztcdFx0Z290byBjbXBfZG9uZTtcbiYjNDM7XHR9XG4mIzQzO1x0a2lkID0gQ0VfQ01QTF9LSUQoY21wKTtcbiYjNDM7XHRpZiAoY3R4LVx1MDAzZWtpZCAhPSBraWQgfHwgY3R4LVx1MDAzZWNsaWVudCAhPSBjbGllbnQgfHwgZW50cmllcyAhPSAxKSB7XG4mIzQzO1x0XHRuZXRkZXZfd2FybihicC1cdTAwM2VkZXYsXG4mIzQzO1x0XHRcdCAgICBcJiMzNDtJbnZhbGlkIENFIGNtcGwgMHglMDh4IHdpdGggZW50cmllcyAlZCBmb3IgY2xpZW50ICVkIHdpdGggc3RhdHVzIDB4JXgsIGV4cGVjdGVkIGtpZCAweCV4IGFuZCBjbGllbnQgJWRcXG5cJiMzNDssXG4mIzQzO1x0XHRcdCAgICAqKHUzMiAqKWNtcCwgZW50cmllcywgY2xpZW50LCBjdHgtXHUwMDNlc3RhdHVzLCBjdHgtXHUwMDNla2lkLFxuJiM0MztcdFx0XHQgICAgY3R4LVx1MDAzZWNsaWVudCk7XG4mIzQzO1x0XHRjdHgtXHUwMDNlc3RhdHVzIHw9IEJOWFRfQ01EX0NUWF9FUlJPUjtcbiYjNDM7XHR9XG4mIzQzO1x0bGVuID0gbWluX3QodTMyLCBjbXBsWzBdLmxlbiwgc2l6ZW9mKGN0eC1cdTAwM2VjZV9jbXApKTtcbiYjNDM7XHRtZW1jcHkoXHUwMDI2Y3R4LVx1MDAzZWNlX2NtcCwgY21wbFswXS5jbXBsLCBsZW4pO1xuJiM0MztjbXBfZG9uZTpcbiYjNDM7XHRjb21wbGV0ZShcdTAwMjZjdHgtXHUwMDNlY21wKTtcbiYjNDM7XHRpZiAocmVmY291bnRfZGVjX2FuZF90ZXN0KFx1MDAyNmN0eC1cdTAwM2VyZWZjbnQpKVxuJiM0MztcdFx0a21lbV9jYWNoZV9mcmVlKGJwLVx1MDAzZWNyeXB0b19pbmZvLVx1MDAzZW1wY19jYWNoZSwgY3R4KTtcbiYjNDM7fVxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dF9jcnlwdG8uaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dF9jcnlwdG8uaFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAwLi5kNDc1OTA1OWE2ZDIzMFxuLS0tIC9kZXYvbnVsbFxuJiM0MzsmIzQzOyYjNDM7IGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9ibnh0X2NyeXB0by5oXG5AQCAtMCwwICYjNDM7MSwyMzAgQEBcbiYjNDM7LyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seSAqL1xuJiM0MzsvKiBDb3B5cmlnaHQgKGMpIDIwMjYgQnJvYWRjb20gSW5jLiAqL1xuJiM0MztcbiYjNDM7I2lmbmRlZiBCTlhUX0NSWVBUT19IXG4mIzQzOyNkZWZpbmUgQk5YVF9DUllQVE9fSFxuJiM0MztcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvcmVmY291bnQuaFx1MDAzZVxuJiM0MztcbiYjNDM7I2RlZmluZSBCTlhUX01BWF9UWF9DUllQVE9fS0VZU1x0XHQyMDQ4MDBcbiYjNDM7I2RlZmluZSBCTlhUX01BWF9SWF9DUllQVE9fS0VZU1x0XHQyMDQ4MDBcbiYjNDM7XG4mIzQzOyNkZWZpbmUgQk5YVF9NQVhfVFhfQ1JZUFRPX0tFWVNfUFJFXzIzM0ZXXHQ2NTUzNVxuJiM0MzsjZGVmaW5lIEJOWFRfTUFYX1JYX0NSWVBUT19LRVlTX1BSRV8yMzNGV1x0NjU1MzVcbiYjNDM7XG4mIzQzO2VudW0gYm54dF9jcnlwdG9fdHlwZSB7XG4mIzQzO1x0Qk5YVF9UWF9DUllQVE9fS0VZX1RZUEUgPSBGVU5DX0tFWV9DVFhfQUxMT0NfUkVRX0tFWV9DVFhfVFlQRV9UWCxcbiYjNDM7XHRCTlhUX1JYX0NSWVBUT19LRVlfVFlQRSA9IEZVTkNfS0VZX0NUWF9BTExPQ19SRVFfS0VZX0NUWF9UWVBFX1JYLFxuJiM0MztcdEJOWFRfTUFYX0NSWVBUT19LRVlfVFlQRSxcbiYjNDM7fTtcbiYjNDM7XG4mIzQzOy8qIE1heGltdW0ga2V5cyBzdXBwb3J0ZWQgYnkgbmV3ZXIgRlcgYWx3YXlzIG11bHRpcGxlcyBvZiAxMjggKi9cbiYjNDM7I2RlZmluZSBCTlhUX0tJRF9CQVRDSF9TSVpFXHQxMjhcbiYjNDM7XG4mIzQzO3N0cnVjdCBibnh0X2tpZF9pbmZvIHtcbiYjNDM7XHRzdHJ1Y3QgbGlzdF9oZWFkXHRsaXN0O1xuJiM0MztcdHU4XHRcdFx0dHlwZTtcbiYjNDM7XHR1OFx0XHRcdGtpbmQ7XG4mIzQzO1x0dTMyXHRcdFx0c3RhcnRfaWQ7XG4mIzQzO1x0dTMyXHRcdFx0Y291bnQ7XG4mIzQzO1x0REVDTEFSRV9CSVRNQVAoaWRzLCBCTlhUX0tJRF9CQVRDSF9TSVpFKTtcbiYjNDM7fTtcbiYjNDM7XG4mIzQzO3N0cnVjdCBibnh0X2tjdHgge1xuJiM0MztcdHN0cnVjdCBsaXN0X2hlYWRcdGxpc3Q7XG4mIzQzO1x0LyogdG8gc2VyaWFsaXplIHVwZGF0ZSB0byB0aGUgbGlua2VkIGxpc3QgYW5kIHRvdGFsX2FsbG9jICovXG4mIzQzO1x0c3BpbmxvY2tfdFx0XHRsb2NrO1xuJiM0MztcdHU4XHRcdFx0dHlwZTtcbiYjNDM7XHR1MTZcdFx0XHRlcG9jaDtcbiYjNDM7XHR1MzJcdFx0XHR0b3RhbF9hbGxvYztcbiYjNDM7XHR1MzJcdFx0XHRtYXhfY3R4O1xuJiM0MztcdGF0b21pY190XHRcdGFsbG9jX3BlbmRpbmc7XG4mIzQzOyNkZWZpbmUgQk5YVF9LQ1RYX0FMTE9DX1BFTkRJTkdfTUFYXHQ4XG4mIzQzO1x0d2FpdF9xdWV1ZV9oZWFkX3RcdGFsbG9jX3BlbmRpbmdfd3E7XG4mIzQzO307XG4mIzQzO1xuJiM0MzsjZGVmaW5lIEJOWFRfS0lEX0hXX01BU0tcdDB4MDAwZmZmZmZcbiYjNDM7I2RlZmluZSBCTlhUX0tJRF9IVyhraWQpXHQoKGtpZCkgXHUwMDI2IEJOWFRfS0lEX0hXX01BU0spXG4mIzQzOyNkZWZpbmUgQk5YVF9LSURfRVBPQ0hfTUFTS1x0MHhmZmYwMDAwMFxuJiM0MzsjZGVmaW5lIEJOWFRfS0lEX0VQT0NIX1NISUZUXHQyMFxuJiM0MzsjZGVmaW5lIEJOWFRfS0lEX0VQT0NIKGtpZClcdCgoKGtpZCkgXHUwMDI2IEJOWFRfS0lEX0VQT0NIX01BU0spIFx1MDAzZVx1MDAzZVx0XFxcbiYjNDM7XHRcdFx0XHQgQk5YVF9LSURfRVBPQ0hfU0hJRlQpXG4mIzQzO1xuJiM0MzsjZGVmaW5lIEJOWFRfTkVYVF9FUE9DSChlcG9jaClcdFxcXG4mIzQzO1x0KCgoZXBvY2gpICYjNDM7IDEpIFx1MDAyNiAoQk5YVF9LSURfRVBPQ0hfTUFTSyBcdTAwM2VcdTAwM2UgQk5YVF9LSURfRVBPQ0hfU0hJRlQpKVxuJiM0MztcbiYjNDM7I2RlZmluZSBCTlhUX1NFVF9LSUQoa2N0eCwga2lkKVx0XHRcdFx0XHRcdFxcXG4mIzQzO1x0KChraWQpIHwgKCh1MzIpKGtjdHgpLVx1MDAzZWVwb2NoIFx1MDAzY1x1MDAzYyBCTlhUX0tJRF9FUE9DSF9TSElGVCkpXG4mIzQzO1xuJiM0MzsjZGVmaW5lIEJOWFRfS0NUWF9BTExPQ19PSyhrY3R4KVx0XFxcbiYjNDM7XHQoYXRvbWljX3JlYWQoXHUwMDI2KChrY3R4KS1cdTAwM2VhbGxvY19wZW5kaW5nKSkgXHUwMDNjIEJOWFRfS0NUWF9BTExPQ19QRU5ESU5HX01BWClcbiYjNDM7XG4mIzQzO3N0cnVjdCBibnh0X2NyeXB0b19pbmZvIHtcbiYjNDM7XHR1MTZcdFx0XHRtYXhfa2V5X2N0eHNfYWxsb2M7XG4mIzQzO1xuJiM0MztcdHN0cnVjdCBibnh0X2tjdHhcdGtjdHhbQk5YVF9NQVhfQ1JZUFRPX0tFWV9UWVBFXTtcbiYjNDM7XG4mIzQzO1x0c3RydWN0IGttZW1fY2FjaGVcdCptcGNfY2FjaGU7XG4mIzQzO307XG4mIzQzO1xuJiM0MztzdHJ1Y3QgY2VfZGVsZXRlX2NtZCB7XG4mIzQzO1x0X19sZTMyICBjdHhfa2luZF9raWRfb3Bjb2RlO1xuJiM0MztcdCNkZWZpbmUgQ0VfREVMRVRFX0NNRF9PUENPREVfTUFTS1x0XHQweGZVTFxuJiM0MztcdCNkZWZpbmUgQ0VfREVMRVRFX0NNRF9PUENPREVfU0ZUXHRcdDBcbiYjNDM7XHQjZGVmaW5lIENFX0RFTEVURV9DTURfT1BDT0RFX0RFTFx0XHQgMHgyVUxcbiYjNDM7XHQjZGVmaW5lIENFX0RFTEVURV9DTURfS0lEX01BU0tcdFx0XHQweGZmZmZmMFVMXG4mIzQzO1x0I2RlZmluZSBDRV9ERUxFVEVfQ01EX0tJRF9TRlRcdFx0XHQ0XG4mIzQzO1x0I2RlZmluZSBDRV9ERUxFVEVfQ01EX0NUWF9LSU5EX01BU0tcdFx0MHgxZjAwMDAwMFVMXG4mIzQzO1x0I2RlZmluZSBDRV9ERUxFVEVfQ01EX0NUWF9LSU5EX1NGVFx0XHQyNFxuJiM0MztcdCNkZWZpbmUgQ0VfREVMRVRFX0NNRF9DVFhfS0lORF9DS19UWFx0XHQgKDB4MTFVTCBcdTAwM2NcdTAwM2MgMjQpXG4mIzQzO1x0I2RlZmluZSBDRV9ERUxFVEVfQ01EX0NUWF9LSU5EX0NLX1JYXHRcdCAoMHgxMlVMIFx1MDAzY1x1MDAzYyAyNClcbiYjNDM7fTtcbiYjNDM7XG4mIzQzOyNkZWZpbmUgQ0VfQ01EX09QX01BU0tcdFx0XHQweDAwMDAwZlVcbiYjNDM7I2RlZmluZSBDRV9DTURfS0lEX01BU0tcdFx0XHQweGZmZmZmMFVcbiYjNDM7I2RlZmluZSBDRV9DTURfS0lEX1NGVFx0XHRcdDRcbiYjNDM7XG4mIzQzOyNkZWZpbmUgQ0VfQ01EX09QKGNtZF9wKVx0XHRcdFx0XHRcXFxuJiM0MztcdChsZTMyX3RvX2NwdSgqKF9fbGUzMiAqKShjbWRfcCkpIFx1MDAyNiBDRV9DTURfT1BfTUFTSylcbiYjNDM7XG4mIzQzOyNkZWZpbmUgQ0VfQ01EX0tJRChjbWRfcClcdFx0XHRcdFx0XFxcbiYjNDM7XHQoKGxlMzJfdG9fY3B1KCooX19sZTMyICopKGNtZF9wKSkgXHUwMDI2IENFX0NNRF9LSURfTUFTSykgXHUwMDNlXHUwMDNlIENFX0NNRF9LSURfU0ZUKVxuJiM0MztcbiYjNDM7c3RydWN0IGNlX2NtcGwge1xuJiM0MztcdF9fbGUxNlx0Y2xpZW50X3N1YnR5cGVfdHlwZTtcbiYjNDM7XHQjZGVmaW5lIENFX0NNUExfVFlQRV9NQVNLXHRcdFx0MHgzZlVMXG4mIzQzO1x0I2RlZmluZSBDRV9DTVBMX1RZUEVfU0ZUXHRcdFx0MFxuJiM0MztcdCNkZWZpbmUgQ0VfQ01QTF9UWVBFX01JRF9QQVRIX1NIT1JUXHRcdCAweDFlVUxcbiYjNDM7XHQjZGVmaW5lIENFX0NNUExfU1VCVFlQRV9NQVNLXHRcdFx0MHhmMDBVTFxuJiM0MztcdCNkZWZpbmUgQ0VfQ01QTF9TVUJUWVBFX1NGVFx0XHRcdDhcbiYjNDM7XHQjZGVmaW5lIENFX0NNUExfU1VCVFlQRV9TT0xJQ0lURURcdFx0ICgweDBVTCBcdTAwM2NcdTAwM2MgOClcbiYjNDM7XHQjZGVmaW5lIENFX0NNUExfU1VCVFlQRV9FUlJcdFx0XHQgKDB4MVVMIFx1MDAzY1x1MDAzYyA4KVxuJiM0MztcdCNkZWZpbmUgQ0VfQ01QTF9TVUJUWVBFX1JFU1lOQ1x0XHRcdCAoMHgyVUwgXHUwMDNjXHUwMDNjIDgpXG4mIzQzO1x0I2RlZmluZSBDRV9DTVBMX01QX0NMSUVOVF9NQVNLXHRcdFx0MHhmMDAwVUxcbiYjNDM7XHQjZGVmaW5lIENFX0NNUExfTVBfQ0xJRU5UX1NGVFx0XHRcdDEyXG4mIzQzO1x0I2RlZmluZSBDRV9DTVBMX01QX0NMSUVOVF9UQ0VcdFx0XHQgKDB4MFVMIFx1MDAzY1x1MDAzYyAxMilcbiYjNDM7XHQjZGVmaW5lIENFX0NNUExfTVBfQ0xJRU5UX1JDRVx0XHRcdCAoMHgxVUwgXHUwMDNjXHUwMDNjIDEyKVxuJiM0MztcdF9fbGUxNlx0c3RhdHVzO1xuJiM0MztcdCNkZWZpbmUgQ0VfQ01QTF9TVEFUVVNfTUFTS1x0XHRcdDB4ZlVMXG4mIzQzO1x0I2RlZmluZSBDRV9DTVBMX1NUQVRVU19TRlRcdFx0XHQwXG4mIzQzO1x0I2RlZmluZSBDRV9DTVBMX1NUQVRVU19PS1x0XHRcdCAweDBVTFxuJiM0MztcdCNkZWZpbmUgQ0VfQ01QTF9TVEFUVVNfQ1RYX0xEX0VSUlx0XHQgMHgxVUxcbiYjNDM7XHQjZGVmaW5lIENFX0NNUExfU1RBVFVTX0ZJRF9DSEtfRVJSXHRcdCAweDJVTFxuJiM0MztcdCNkZWZpbmUgQ0VfQ01QTF9TVEFUVVNfQ1RYX1ZFUl9FUlJcdFx0IDB4M1VMXG4mIzQzO1x0I2RlZmluZSBDRV9DTVBMX1NUQVRVU19EU1RfSURfRVJSXHRcdCAweDRVTFxuJiM0MztcdCNkZWZpbmUgQ0VfQ01QTF9TVEFUVVNfTVBfQ01EX0VSUlx0XHQgMHg1VUxcbiYjNDM7XHR1MzJcdG9wYXF1ZTtcbiYjNDM7XHRfX2xlMzJcdHY7XG4mIzQzO1x0I2RlZmluZSBDRV9DTVBMX1YgICAgICAgICAgIDB4MVVMXG4mIzQzO1x0X19sZTMyXHRraWQ7XG4mIzQzO1x0I2RlZmluZSBDRV9DTVBMX0tJRF9NQVNLICAgIDB4ZmZmZmZVTFxuJiM0MztcdCNkZWZpbmUgQ0VfQ01QTF9LSURfU0ZUICAgICAwXG4mIzQzO307XG4mIzQzO1xuJiM0MzsjZGVmaW5lIENFX0NNUExfU1RBVFVTKGNlX2NtcGwpXHRcdFx0XHRcdFx0XFxcbiYjNDM7XHQobGUxNl90b19jcHUoKGNlX2NtcGwpLVx1MDAzZXN0YXR1cykgXHUwMDI2IENFX0NNUExfU1RBVFVTX01BU0spXG4mIzQzO1xuJiM0MzsjZGVmaW5lIENFX0NNUExfS0lEKGNlX2NtcGwpXHRcdFx0XHRcdFx0XFxcbiYjNDM7XHQobGUzMl90b19jcHUoKGNlX2NtcGwpLVx1MDAzZWtpZCkgXHUwMDI2IENFX0NNUExfS0lEX01BU0spXG4mIzQzO1xuJiM0MztzdHJ1Y3QgYm54dF9jcnlwdG9fY21kX2N0eCB7XG4mIzQzO1x0c3RydWN0IGNvbXBsZXRpb24gY21wO1xuJiM0MztcdHN0cnVjdCBjZV9jbXBsIGNlX2NtcDtcbiYjNDM7XHRyZWZjb3VudF90IHJlZmNudDtcbiYjNDM7XHR1MzIga2lkO1xuJiM0MztcdHUxNiBjbGllbnQ7XG4mIzQzO1x0dTggc3RhdHVzO1xuJiM0MzsjZGVmaW5lIEJOWFRfQ01EX0NUWF9DT01QTEVURURcdDB4MVxuJiM0MzsjZGVmaW5lIEJOWFRfQ01EX0NUWF9FUlJPUlx0MHgyXG4mIzQzOyNkZWZpbmUgQk5YVF9DTURfQ1RYX1JFU0VUXHQweDRcbiYjNDM7fTtcbiYjNDM7XG4mIzQzOyNkZWZpbmUgQk5YVF9UQ0soY3J5cHRvKVx0KChjcnlwdG8pLVx1MDAzZWtjdHhbQk5YVF9UWF9DUllQVE9fS0VZX1RZUEVdKVxuJiM0MzsjZGVmaW5lIEJOWFRfUkNLKGNyeXB0bylcdCgoY3J5cHRvKS1cdTAwM2VrY3R4W0JOWFRfUlhfQ1JZUFRPX0tFWV9UWVBFXSlcbiYjNDM7XG4mIzQzOyNkZWZpbmUgQk5YVF9DVFhfS0lORF9DS19UWFx0MHgxMVxuJiM0MzsjZGVmaW5lIEJOWFRfQ1RYX0tJTkRfQ0tfUlhcdDB4MTJcbiYjNDM7XG4mIzQzOyNpZmRlZiBDT05GSUdfQk5YVF9UTFNcbiYjNDM7dm9pZCBibnh0X2FsbG9jX2NyeXB0b19pbmZvKHN0cnVjdCBibnh0ICpicCxcbiYjNDM7XHRcdFx0ICAgIHN0cnVjdCBod3JtX2Z1bmNfcWNhcHNfb3V0cHV0ICpyZXNwKTtcbiYjNDM7aW50IGJueHRfY3J5cHRvX2RlbChzdHJ1Y3QgYm54dCAqYnAsIHU4IHR5cGUsIHU4IGtpbmQsIHUzMiBraWQpO1xuJiM0Mzt2b2lkIGJueHRfY3J5cHRvX2RlbF9hbGwoc3RydWN0IGJueHQgKmJwKTtcbiYjNDM7dm9pZCBibnh0X2NsZWFyX2NyeXB0byhzdHJ1Y3QgYm54dCAqYnApO1xuJiM0Mzt2b2lkIGJueHRfZnJlZV9jcnlwdG9faW5mbyhzdHJ1Y3QgYm54dCAqYnApO1xuJiM0Mzt2b2lkIGJueHRfaHdybV9yZXNlcnZlX3BmX2tleV9jdHhzKHN0cnVjdCBibnh0ICpicCxcbiYjNDM7XHRcdFx0XHQgICBzdHJ1Y3QgaHdybV9mdW5jX2NmZ19pbnB1dCAqcmVxKTtcbiYjNDM7Ym9vbCBibnh0X2tpZF92YWxpZChzdHJ1Y3QgYm54dF9rY3R4ICprY3R4LCB1MzIgaWQpO1xuJiM0Mzt2b2lkIGJueHRfZnJlZV9vbmVfa2N0eChzdHJ1Y3QgYm54dF9rY3R4ICprY3R4LCB1MzIgaWQpO1xuJiM0MztpbnQgYm54dF9rZXlfY3R4X2FsbG9jX29uZShzdHJ1Y3QgYm54dCAqYnAsIHN0cnVjdCBibnh0X2tjdHggKmtjdHgsIHU4IGtpbmQsXG4mIzQzO1x0XHRcdCAgIHUzMiAqaWQpO1xuJiM0MztpbnQgYm54dF94bWl0X2NyeXB0b19jbWQoc3RydWN0IGJueHQgKmJwLCBzdHJ1Y3QgYm54dF90eF9yaW5nX2luZm8gKnR4cixcbiYjNDM7XHRcdFx0IHZvaWQgKmNtZCwgdW5zaWduZWQgaW50IGxlbiwgdW5zaWduZWQgaW50IHRtbyk7XG4mIzQzO2ludCBibnh0X2NyeXB0b19pbml0KHN0cnVjdCBibnh0ICpicCk7XG4mIzQzO3ZvaWQgYm54dF9jcnlwdG9fbXBjX2NtcChzdHJ1Y3QgYm54dCAqYnAsIHUzMiBjbGllbnQsIHVuc2lnbmVkIGxvbmcgaGFuZGxlLFxuJiM0MztcdFx0XHQgc3RydWN0IGJueHRfY21wbF9lbnRyeSBjbXBsW10sIHUzMiBlbnRyaWVzKTtcbiYjNDM7I2Vsc2VcbiYjNDM7c3RhdGljIGlubGluZSB2b2lkIGJueHRfYWxsb2NfY3J5cHRvX2luZm8oc3RydWN0IGJueHQgKmJwLFxuJiM0MztcdFx0XHRcdFx0ICBzdHJ1Y3QgaHdybV9mdW5jX3FjYXBzX291dHB1dCAqcmVzcClcbiYjNDM7e1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW5saW5lIGludCBibnh0X2NyeXB0b19kZWwoc3RydWN0IGJueHQgKmJwLCB1OCB0eXBlLCB1OCBraW5kLCB1MzIga2lkKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIC1FT1BOT1RTVVBQO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW5saW5lIHZvaWQgYm54dF9jcnlwdG9fZGVsX2FsbChzdHJ1Y3QgYm54dCAqYnApXG4mIzQzO3tcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGlubGluZSB2b2lkIGJueHRfY2xlYXJfY3J5cHRvKHN0cnVjdCBibnh0ICpicClcbiYjNDM7e1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW5saW5lIHZvaWQgYm54dF9mcmVlX2NyeXB0b19pbmZvKHN0cnVjdCBibnh0ICpicClcbiYjNDM7e1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW5saW5lIHZvaWQgYm54dF9od3JtX3Jlc2VydmVfcGZfa2V5X2N0eHMoc3RydWN0IGJueHQgKmJwLFxuJiM0MztcdFx0XHRcdFx0XHQgc3RydWN0IGh3cm1fZnVuY19jZmdfaW5wdXQgKnJlcSlcbiYjNDM7e1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW5saW5lIGJvb2wgYm54dF9raWRfdmFsaWQoc3RydWN0IGJueHRfa2N0eCAqa2N0eCwgdTMyIGlkKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIGZhbHNlO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW5saW5lIHZvaWQgYm54dF9mcmVlX29uZV9rY3R4KHN0cnVjdCBibnh0X2tjdHggKmtjdHgsIHUzMiBpZClcbiYjNDM7e1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW5saW5lIGludCBibnh0X2tleV9jdHhfYWxsb2Nfb25lKHN0cnVjdCBibnh0ICpicCxcbiYjNDM7XHRcdFx0XHRcdCBzdHJ1Y3QgYm54dF9rY3R4ICprY3R4LCB1OCBraW5kLFxuJiM0MztcdFx0XHRcdFx0IHUzMiAqaWQpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gLUVPUE5PVFNVUFA7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbmxpbmUgaW50IGJueHRfeG1pdF9jcnlwdG9fY21kKHN0cnVjdCBibnh0ICpicCxcbiYjNDM7XHRcdFx0XHQgICAgICAgc3RydWN0IGJueHRfdHhfcmluZ19pbmZvICp0eHIsXG4mIzQzO1x0XHRcdFx0ICAgICAgIHZvaWQgKmNtZCwgdW5zaWduZWQgaW50IGxlbixcbiYjNDM7XHRcdFx0XHQgICAgICAgdW5zaWduZWQgaW50IHRtbylcbiYjNDM7e1xuJiM0MztcdHJldHVybiAtRU9QTk9UU1VQUDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGlubGluZSBpbnQgYm54dF9jcnlwdG9faW5pdChzdHJ1Y3QgYm54dCAqYnApXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGlubGluZSB2b2lkIGJueHRfY3J5cHRvX21wY19jbXAoc3RydWN0IGJueHQgKmJwLCB1MzIgY2xpZW50LFxuJiM0MztcdFx0XHRcdCAgICAgICB1bnNpZ25lZCBsb25nIGhhbmRsZSxcbiYjNDM7XHRcdFx0XHQgICAgICAgc3RydWN0IGJueHRfY21wbF9lbnRyeSBjbXBsW10sXG4mIzQzO1x0XHRcdFx0ICAgICAgIHUzMiBlbnRyaWVzKVxuJiM0Mzt7XG4mIzQzO31cbiYjNDM7I2VuZGlmXHQvKiBDT05GSUdfQk5YVF9UTFMgKi9cbiYjNDM7I2VuZGlmXHQvKiBCTlhUX0NSWVBUT19IICovXG5kaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9ibnh0X2V0aHRvb2wuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dF9ldGh0b29sLmNcbmluZGV4IDYyYmM5Y2FlNjEzYzM4Li5jZWU3NDM5OTZkM2YyMyAxMDA2NDRcbi0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dF9ldGh0b29sLmNcbiYjNDM7JiM0MzsmIzQzOyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dF9ldGh0b29sLmNcbkBAIC0zNyw2ICYjNDM7MzcsOCBAQFxuICNpbmNsdWRlIFwmIzM0O2JueHRfbnZtX2RlZnMuaFwmIzM0O1x0LyogTlZSQU0gY29udGVudCBjb25zdGFudCBhbmQgc3RydWN0dXJlIGRlZnMgKi9cbiAjaW5jbHVkZSBcJiMzNDtibnh0X2Z3X2hkci5oXCYjMzQ7XHQvKiBGaXJtd2FyZSBoZHIgY29uc3RhbnQgYW5kIHN0cnVjdHVyZSBkZWZzICovXG4gI2luY2x1ZGUgXCYjMzQ7Ym54dF9jb3JlZHVtcC5oXCYjMzQ7XG4mIzQzOyNpbmNsdWRlIFwmIzM0O2JueHRfbXBjLmhcJiMzNDtcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7Ym54dF9rdGxzLmhcJiMzNDtcbiBcbiAjZGVmaW5lIEJOWFRfTlZNX0VSUl9NU0coZGV2LCBleHRhY2ssIG1zZylcdFx0XHRcXFxuIFx0ZG8ge1x0XHRcdFx0XHRcdFx0XFxcbkBAIC0zNTMsNiAmIzQzOzM1NSwzMCBAQCBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgYm54dF9yaW5nX2Rydl9zdGF0c19hcnJbXSA9IHtcbiBcdFwmIzM0O3RvdGFsX21pc3NlZF9pcnFzXCYjMzQ7LFxuIH07XG4gXG4mIzQzOy8qIGtUTFMgZGF0YSBwbGFuZSBjb3VudGVyIHN0cmluZ3MgaW5kZXhlZCBieSBlbnVtIGJueHRfa3Rsc19kYXRhX2NvdW50ZXJzICovXG4mIzQzO3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBibnh0X2t0bHNfZGF0YV9zdGF0c1tdID0ge1xuJiM0MztcdFtCTlhUX0tUTFNfVFhfUEtUU11cdFx0PSBcJiMzNDt0eF90bHNfZW5jcnlwdGVkX3BhY2tldHNcJiMzNDssXG4mIzQzO1x0W0JOWFRfS1RMU19UWF9CWVRFU11cdFx0PSBcJiMzNDt0eF90bHNfZW5jcnlwdGVkX2J5dGVzXCYjMzQ7LFxuJiM0MztcdFtCTlhUX0tUTFNfVFhfT09PX1BLVFNdXHRcdFx0PSBcJiMzNDt0eF90bHNfb29vX3BhY2tldHNcJiMzNDssXG4mIzQzO1x0W0JOWFRfS1RMU19UWF9PT09fRkFMTEJBQ0tfTk9fU1lOQ11cdD0gXCYjMzQ7dHhfdGxzX29vb19mYWxsYmFja19ub19zeW5jXCYjMzQ7LFxuJiM0MztcdFtCTlhUX0tUTFNfVFhfT09PX0ZBTExCQUNLX05PX1NQQUNFXVx0PSBcJiMzNDt0eF90bHNfb29vX2ZhbGxiYWNrX25vX3NwYWNlXCYjMzQ7LFxuJiM0MztcdFtCTlhUX0tUTFNfVFhfT09PX0ZBTExCQUNLX05PX0hEUl1cdD0gXCYjMzQ7dHhfdGxzX29vb19mYWxsYmFja19ub19oZHJcJiMzNDssXG4mIzQzO307XG4mIzQzO1xuJiM0MzsvKiBrVExTIGNvbnRyb2wgcGxhbmUgY291bnRlciBzdHJpbmdzIGluZGV4ZWQgYnkgZW51bSBibnh0X2t0bHNfY3RybF9jb3VudGVycyAqL1xuJiM0MztzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgYm54dF9rdGxzX2N0cmxfc3RhdHNbXSA9IHtcbiYjNDM7XHRbQk5YVF9LVExTX1RYX0FERF1cdFx0XHQ9IFwmIzM0O3R4X3Rsc19hZGRcJiMzNDssXG4mIzQzO1x0W0JOWFRfS1RMU19UWF9ERUxdXHRcdFx0PSBcJiMzNDt0eF90bHNfZGVsXCYjMzQ7LFxuJiM0MztcdFtCTlhUX0tUTFNfRVJSX05PX01FTV1cdFx0XHQ9IFwmIzM0O3Rsc19lcnJfbm9fbWVtXCYjMzQ7LFxuJiM0MztcdFtCTlhUX0tUTFNfRVJSX05PX0NBUF1cdFx0XHQ9IFwmIzM0O3Rsc19lcnJfbm9fY2FwXCYjMzQ7LFxuJiM0MztcdFtCTlhUX0tUTFNfRVJSX0tFWV9DVFhfQUxMT0NdXHRcdD0gXCYjMzQ7dGxzX2Vycl9rZXlfY3R4X2FsbG9jXCYjMzQ7LFxuJiM0MztcdFtCTlhUX0tUTFNfRVJSX0NSWVBUT19DTURdXHRcdD0gXCYjMzQ7dGxzX2Vycl9jcnlwdG9fY21kXCYjMzQ7LFxuJiM0MztcdFtCTlhUX0tUTFNfRVJSX0RFVklDRV9CVVNZXVx0XHQ9IFwmIzM0O3Rsc19lcnJfZGV2aWNlX2J1c3lcJiMzNDssXG4mIzQzO1x0W0JOWFRfS1RMU19FUlJfSU5WQUxJRF9DSVBIRVJdXHRcdD0gXCYjMzQ7dGxzX2Vycl9pbnZhbGlkX2NpcGhlclwmIzM0OyxcbiYjNDM7XHRbQk5YVF9LVExTX0VSUl9TVEFURV9OT1RfT1BFTl1cdFx0PSBcJiMzNDt0bHNfZXJyX3N0YXRlX25vdF9vcGVuXCYjMzQ7LFxuJiM0MztcdFtCTlhUX0tUTFNfRVJSX1JFVFJZX0VYQ0VFREVEXVx0XHQ9IFwmIzM0O3Rsc19lcnJfcmV0cnlfZXhjZWVkZWRcJiMzNDssXG4mIzQzO307XG4mIzQzO1xuICNkZWZpbmUgTlVNX1JJTkdfUlhfU1dfU1RBVFNcdFx0QVJSQVlfU0laRShibnh0X3J4X3N3X3N0YXRzX3N0cilcbiAjZGVmaW5lIE5VTV9SSU5HX0NNTl9TV19TVEFUU1x0XHRBUlJBWV9TSVpFKGJueHRfY21uX3N3X3N0YXRzX3N0cilcbiAjZGVmaW5lIE5VTV9SSU5HX1JYX0hXX1NUQVRTXHRcdEFSUkFZX1NJWkUoYm54dF9yaW5nX3J4X3N0YXRzX3N0cilcbkBAIC01MzUsMTIgJiM0Mzs1NjEsMjEgQEAgc3RhdGljIGludCBibnh0X2dldF9udW1fcmluZ19zdGF0cyhzdHJ1Y3QgYm54dCAqYnApXG4gXHQgICAgICAgY21uICogYnAtXHUwMDNlY3BfbnJfcmluZ3M7XG4gfVxuIFxuJiM0MztzdGF0aWMgaW50IGJueHRfZ2V0X251bV9rdGxzX3N0YXRzKHN0cnVjdCBibnh0ICpicClcbiYjNDM7e1xuJiM0MztcdGlmICghYnAtXHUwMDNla3Rsc19pbmZvKVxuJiM0MztcdFx0cmV0dXJuIDA7XG4mIzQzO1x0cmV0dXJuIEFSUkFZX1NJWkUoYm54dF9rdGxzX2N0cmxfc3RhdHMpICYjNDM7XG4mIzQzO1x0ICAgICAgIEFSUkFZX1NJWkUoYm54dF9rdGxzX2RhdGFfc3RhdHMpO1xuJiM0Mzt9XG4mIzQzO1xuIHN0YXRpYyBpbnQgYm54dF9nZXRfbnVtX3N0YXRzKHN0cnVjdCBibnh0ICpicClcbiB7XG4gXHRpbnQgbnVtX3N0YXRzID0gYm54dF9nZXRfbnVtX3Jpbmdfc3RhdHMoYnApO1xuIFx0aW50IGxlbjtcbiBcbiBcdG51bV9zdGF0cyAmIzQzOz0gQk5YVF9OVU1fUklOR19EUlZfU1RBVFM7XG4mIzQzO1x0bnVtX3N0YXRzICYjNDM7PSBibnh0X2dldF9udW1fa3Rsc19zdGF0cyhicCk7XG4gXG4gXHRpZiAoYnAtXHUwMDNlZmxhZ3MgXHUwMDI2IEJOWFRfRkxBR19QT1JUX1NUQVRTKVxuIFx0XHRudW1fc3RhdHMgJiM0Mzs9IEJOWFRfTlVNX1BPUlRfU1RBVFM7XG5AQCAtNjUzLDYgJiM0Mzs2ODgsMTYgQEAgc3RhdGljIHZvaWQgYm54dF9nZXRfZXRodG9vbF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LFxuIFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgQk5YVF9OVU1fUklOR19EUlZfU1RBVFM7IGkmIzQzOyYjNDM7LCBqJiM0MzsmIzQzOywgY3VyciYjNDM7JiM0MzssIHByZXYmIzQzOyYjNDM7KVxuIFx0XHRidWZbal0gPSAqY3VyciAmIzQzOyAqcHJldjtcbiBcbiYjNDM7XHRpZiAoYnAtXHUwMDNla3Rsc19pbmZvKSB7XG4mIzQzO1x0XHRzdHJ1Y3QgYm54dF90bHNfaW5mbyAqa3RscyA9IGJwLVx1MDAzZWt0bHNfaW5mbztcbiYjNDM7XHRcdHN0cnVjdCBibnh0X3Rsc19zd19zdGF0cyB0bHNfc3RhdHMgPSB7fTtcbiYjNDM7XG4mIzQzO1x0XHRibnh0X2dldF9yaW5nX3Rsc19zdGF0cyhicCwgXHUwMDI2dGxzX3N0YXRzKTtcbiYjNDM7XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIEFSUkFZX1NJWkUoYm54dF9rdGxzX2RhdGFfc3RhdHMpOyBpJiM0MzsmIzQzOywgaiYjNDM7JiM0MzspXG4mIzQzO1x0XHRcdGJ1ZltqXSA9IHRsc19zdGF0cy5jb3VudGVyc1tpXTtcbiYjNDM7XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIEFSUkFZX1NJWkUoYm54dF9rdGxzX2N0cmxfc3RhdHMpOyBpJiM0MzsmIzQzOywgaiYjNDM7JiM0MzspXG4mIzQzO1x0XHRcdGJ1ZltqXSA9IGF0b21pYzY0X3JlYWQoXHUwMDI2a3Rscy1cdTAwM2Vjb3VudGVyc1tpXSk7XG4mIzQzO1x0fVxuIFx0aWYgKGJwLVx1MDAzZWZsYWdzIFx1MDAyNiBCTlhUX0ZMQUdfUE9SVF9TVEFUUykge1xuIFx0XHR1NjQgKnBvcnRfc3RhdHMgPSBicC1cdTAwM2Vwb3J0X3N0YXRzLnN3X3N0YXRzO1xuIFxuQEAgLTc2Myw2ICYjNDM7ODA4LDEyIEBAIHN0YXRpYyB2b2lkIGJueHRfZ2V0X3N0cmluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIHN0cmluZ3NldCwgdTggKmJ1ZilcbiBcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgQk5YVF9OVU1fUklOR19EUlZfU1RBVFM7IGkmIzQzOyYjNDM7KVxuIFx0XHRcdGV0aHRvb2xfcHV0cyhcdTAwMjZidWYsIGJueHRfcmluZ19kcnZfc3RhdHNfYXJyW2ldKTtcbiBcbiYjNDM7XHRcdGlmIChicC1cdTAwM2VrdGxzX2luZm8pIHtcbiYjNDM7XHRcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgQVJSQVlfU0laRShibnh0X2t0bHNfZGF0YV9zdGF0cyk7IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0XHRcdGV0aHRvb2xfcHV0cyhcdTAwMjZidWYsIGJueHRfa3Rsc19kYXRhX3N0YXRzW2ldKTtcbiYjNDM7XHRcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgQVJSQVlfU0laRShibnh0X2t0bHNfY3RybF9zdGF0cyk7IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0XHRcdGV0aHRvb2xfcHV0cyhcdTAwMjZidWYsIGJueHRfa3Rsc19jdHJsX3N0YXRzW2ldKTtcbiYjNDM7XHRcdH1cbiBcdFx0aWYgKGJwLVx1MDAzZWZsYWdzIFx1MDAyNiBCTlhUX0ZMQUdfUE9SVF9TVEFUUylcbiBcdFx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBCTlhUX05VTV9QT1JUX1NUQVRTOyBpJiM0MzsmIzQzOykge1xuIFx0XHRcdFx0c3RyID0gYm54dF9wb3J0X3N0YXRzX2FycltpXS5zdHJpbmc7XG5AQCAtOTU5LDYgJiM0MzsxMDEwLDcgQEAgc3RhdGljIGludCBibnh0X3NldF9jaGFubmVscyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LFxuIFx0c3RydWN0IGJueHQgKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTtcbiBcdGludCByZXFfdHhfcmluZ3MsIHJlcV9yeF9yaW5ncywgdGNzO1xuIFx0dTMyIG5ld190Ymxfc2l6ZSA9IDAsIG9sZF90Ymxfc2l6ZTtcbiYjNDM7XHRpbnQgbXBjX3Blcl90eXBlLCBtcGNfY3A7XG4gXHRib29sIHNoID0gZmFsc2U7XG4gXHRpbnQgdHhfeGRwID0gMDtcbiBcdGludCByYyA9IDA7XG5AQCAtOTkzLDcgJiM0MzsxMDQ1LDEyIEBAIHN0YXRpYyBpbnQgYm54dF9zZXRfY2hhbm5lbHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldixcbiBcdFx0dHhfeGRwID0gcmVxX3J4X3JpbmdzO1xuIFx0fVxuIFxuLVx0cmMgPSBibnh0X2NoZWNrX3JpbmdzKGJwLCByZXFfdHhfcmluZ3MsIHJlcV9yeF9yaW5ncywgc2gsIHRjcywgdHhfeGRwKTtcbiYjNDM7XHRibnh0X2NhbGNfZGZsdF9tcGNfcmluZ3MoYnAsXG4mIzQzO1x0XHRcdFx0IHJlcV90eF9yaW5ncyAqICh0Y3MgXHUwMDNlIDEgPyB0Y3MgOiAxKSAmIzQzOyB0eF94ZHAsXG4mIzQzO1x0XHRcdFx0IHJlcV90eF9yaW5ncywgcmVxX3J4X3JpbmdzLCBcdTAwMjZtcGNfcGVyX3R5cGUsXG4mIzQzO1x0XHRcdFx0IFx1MDAyNm1wY19jcCk7XG4mIzQzO1x0cmMgPSBibnh0X2NoZWNrX3JpbmdzKGJwLCByZXFfdHhfcmluZ3MsIHJlcV9yeF9yaW5ncywgc2gsIHRjcywgdHhfeGRwLFxuJiM0MztcdFx0XHQgICAgICBtcGNfcGVyX3R5cGUgKiBCTlhUX01QQ19UWVBFX01BWCwgbXBjX2NwKTtcbiBcdGlmIChyYykge1xuIFx0XHRuZXRkZXZfd2FybihkZXYsIFwmIzM0O1VuYWJsZSB0byBhbGxvY2F0ZSB0aGUgcmVxdWVzdGVkIHJpbmdzXFxuXCYjMzQ7KTtcbiBcdFx0cmV0dXJuIHJjO1xuQEAgLTEwNTEsNiAmIzQzOzExMDgsOCBAQCBzdGF0aWMgaW50IGJueHRfc2V0X2NoYW5uZWxzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsXG4gXG4gXHRibnh0X3NldF9jcF9yaW5ncyhicCwgc2gpO1xuIFxuJiM0MztcdGJueHRfc2V0X2RmbHRfbXBjX3JpbmdzKGJwKTtcbiYjNDM7XG4gXHQvKiBBZnRlciBjaGFuZ2luZyBudW1iZXIgb2YgcnggY2hhbm5lbHMsIHVwZGF0ZSBOVFVQTEUgZmVhdHVyZS4gKi9cbiBcdG5ldGRldl91cGRhdGVfZmVhdHVyZXMoZGV2KTtcbiBcdGlmIChuZXRpZl9ydW5uaW5nKGRldikpIHtcbmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibnh0L2JueHRfZ3NvLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibnh0L2JueHRfZ3NvLmNcbmluZGV4IGYzMTdmNjA0MTRlODEzLi5iNGMzN2E2YzlmMGZhOSAxMDA2NDRcbi0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dF9nc28uY1xuJiM0MzsmIzQzOyYjNDM7IGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9ibnh0X2dzby5jXG5AQCAtMTY4LDcgJiM0MzsxNjgsNyBAQCBuZXRkZXZfdHhfdCBibnh0X3N3X3VkcF9nc29feG1pdChzdHJ1Y3QgYm54dCAqYnAsXG4gXG4gXHRcdHByb2QgPSBORVhUX1RYKHByb2QpO1xuIFx0XHRibnh0X2luaXRfZXh0X2JkKGJwLCB0eHIsIHByb2QsIGNzdW0sXG4tXHRcdFx0XHQgdmxhbl90YWdfZmxhZ3MsIGNmYV9hY3Rpb24pO1xuJiM0MztcdFx0XHRcdCB2bGFuX3RhZ19mbGFncywgY2ZhX2FjdGlvbiwgMCk7XG4gXG4gXHRcdC8qIHNldCBkbWFfdW5tYXBfbGVuIG9uIHRoZSBMQVNUIEJEIHRvdWNoaW5nIGVhY2hcbiBcdFx0ICogcmVnaW9uLiBTaW5jZSBjb21wbGV0aW9ucyBhcmUgaW4tb3JkZXIsIHRoZSBsYXN0IHNlZ21lbnRcbmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibnh0L2JueHRfa3Rscy5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9ibnh0X2t0bHMuY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAwLi4wY2I0MzhjNWM1MDkxOFxuLS0tIC9kZXYvbnVsbFxuJiM0MzsmIzQzOyYjNDM7IGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9ibnh0X2t0bHMuY1xuQEAgLTAsMCAmIzQzOzEsNTc4IEBAXG4mIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcbiYjNDM7LyogQ29weXJpZ2h0IChjKSAyMDI2IEJyb2FkY29tIEluYy4gKi9cbiYjNDM7XG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L3RjcC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY25ldC90bHMuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9ibnh0L2hzaS5oXHUwMDNlXG4mIzQzO1xuJiM0MzsjaW5jbHVkZSBcJiMzNDtibnh0LmhcJiMzNDtcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7Ym54dF9tcGMuaFwmIzM0O1xuJiM0MzsjaW5jbHVkZSBcJiMzNDtibnh0X2NyeXB0by5oXCYjMzQ7XG4mIzQzOyNpbmNsdWRlIFwmIzM0O2JueHRfa3Rscy5oXCYjMzQ7XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogYm54dF9hbGxvY19rdGxzX2luZm8gLSBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBrVExTIG9mZmxvYWQgY29udGV4dFxuJiM0MzsgKiBAYnA6IHBvaW50ZXIgdG8gYm54dCBkZXZpY2VcbiYjNDM7ICpcbiYjNDM7ICogQWxsb2NhdGVzIHRoZSBtYWluIGtUTFMgY3J5cHRvIGluZm8gc3RydWN0dXJlXG4mIzQzOyAqXG4mIzQzOyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGR1cmluZyBkZXZpY2UgaW5pdGlhbGl6YXRpb24gd2hlbiBmaXJtd2FyZVxuJiM0MzsgKiByZXBvcnRzIGtUTFMgb2ZmbG9hZCBjYXBhYmlsaXR5LiBJZiBhbGxvY2F0aW9uIGZhaWxzLCBrVExTIG9mZmxvYWRcbiYjNDM7ICogd2lsbCBub3QgYmUgYXZhaWxhYmxlIGJ1dCB0aGUgZGV2aWNlIHdpbGwgc3RpbGwgZnVuY3Rpb24uXG4mIzQzOyAqXG4mIzQzOyAqIENvbnRleHQ6IFByb2Nlc3MgY29udGV4dFxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm46IHplcm8gb24gc3VjY2VzcywgbmVnYXRpdmUgZXJyb3IgY29kZSBvdGhlcndpc2U6XG4mIzQzOyAqXHRFTk9NRU06IG91dCBvZiBtZW1vcnlcbiYjNDM7ICovXG4mIzQzO2ludCBibnh0X2FsbG9jX2t0bHNfaW5mbyhzdHJ1Y3QgYm54dCAqYnApXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYm54dF90bHNfaW5mbyAqa3RscyA9IGJwLVx1MDAzZWt0bHNfaW5mbztcbiYjNDM7XG4mIzQzO1x0aWYgKEJOWFRfVkYoYnApKVxuJiM0MztcdFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xuJiM0MztcdGlmIChrdGxzKVxuJiM0MztcdFx0cmV0dXJuIDA7XG4mIzQzO1xuJiM0MztcdGt0bHMgPSBremFsbG9jX29iaigqa3Rscyk7XG4mIzQzO1x0aWYgKCFrdGxzKSB7XG4mIzQzO1x0XHRuZXRkZXZfd2FybihicC1cdTAwM2VkZXYsIFwmIzM0O1VuYWJsZSB0byBhbGxvY2F0ZSBrVExTIGluZm9cXG5cJiMzNDspO1xuJiM0MztcdFx0cmV0dXJuIC1FTk9NRU07XG4mIzQzO1x0fVxuJiM0MztcdGt0bHMtXHUwMDNlY291bnRlcnMgPSBremFsbG9jX29ianMoKmt0bHMtXHUwMDNlY291bnRlcnMsXG4mIzQzO1x0XHRcdFx0ICAgICAgQk5YVF9LVExTX01BWF9DVFJMX0NPVU5URVJTKTtcbiYjNDM7XHRpZiAoIWt0bHMtXHUwMDNlY291bnRlcnMpXG4mIzQzO1x0XHRnb3RvIGt0bHNfZXJyO1xuJiM0MztcbiYjNDM7XHRpbml0X3dhaXRxdWV1ZV9oZWFkKFx1MDAyNmt0bHMtXHUwMDNlb3Blbl93cSk7XG4mIzQzO1x0YnAtXHUwMDNla3Rsc19pbmZvID0ga3RscztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7XG4mIzQzO2t0bHNfZXJyOlxuJiM0MztcdGtmcmVlKGt0bHMtXHUwMDNlY291bnRlcnMpO1xuJiM0MztcdGtmcmVlKGt0bHMpO1xuJiM0MztcdHJldHVybiAtRU5PTUVNO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogYm54dF9mcmVlX2t0bHNfaW5mbyAtIEZyZWUga1RMUyBjcnlwdG8gb2ZmbG9hZCByZXNvdXJjZXNcbiYjNDM7ICogQGJwOiBwb2ludGVyIHRvIGJueHQgZGV2aWNlXG4mIzQzOyAqXG4mIzQzOyAqIEZyZWVzIGFsbCByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIGtUTFMgY3J5cHRvIG9mZmxvYWRcbiYjNDM7ICpcbiYjNDM7ICogQ29udGV4dDogUHJvY2VzcyBjb250ZXh0IGR1cmluZyBkZXZpY2Ugc2h1dGRvd24vcmVtb3ZhbFxuJiM0MzsgKi9cbiYjNDM7dm9pZCBibnh0X2ZyZWVfa3Rsc19pbmZvKHN0cnVjdCBibnh0ICpicClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBibnh0X3Rsc19pbmZvICprdGxzID0gYnAtXHUwMDNla3Rsc19pbmZvO1xuJiM0MztcbiYjNDM7XHRpZiAoIWt0bHMpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1x0a2ZyZWUoa3Rscy1cdTAwM2Vjb3VudGVycyk7XG4mIzQzO1x0a2ZyZWUoa3Rscyk7XG4mIzQzO1x0YnAtXHUwMDNla3Rsc19pbmZvID0gTlVMTDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyogQ29weSBpbiByZXZlcnNlIGJ5dGUgb3JkZXIgKi9cbiYjNDM7c3RhdGljIHZvaWQgYm54dF9jb3B5X3Rsc19tcF9kYXRhKHU4ICpkc3QsIHU4ICpzcmMsIGludCBieXRlcylcbiYjNDM7e1xuJiM0MztcdGludCBpO1xuJiM0MztcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBieXRlczsgaSYjNDM7JiM0MzspXG4mIzQzO1x0XHRkc3RbYnl0ZXMgLSBpIC0gMV0gPSBzcmNbaV07XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgYm54dF9jcnlwdG9fYWRkKHN0cnVjdCBibnh0ICpicCwgZW51bSB0bHNfb2ZmbG9hZF9jdHhfZGlyIGRpcmVjdGlvbixcbiYjNDM7XHRcdFx0ICAgc3RydWN0IHRsc19jcnlwdG9faW5mbyAqY3J5cHRvX2luZm8sIHUzMiB0Y3Bfc2VxX25vLFxuJiM0MztcdFx0XHQgICB1MzIga2lkKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGJueHRfdHhfcmluZ19pbmZvICp0eHI7XG4mIzQzO1x0c3RydWN0IGNlX2FkZF9jbWQgY21kID0gezB9O1xuJiM0MztcdHUzMiBkYXRhO1xuJiM0MztcdGludCByYztcbiYjNDM7XG4mIzQzO1x0aWYgKGRpcmVjdGlvbiA9PSBUTFNfT0ZGTE9BRF9DVFhfRElSX1RYKSB7XG4mIzQzO1x0XHR0eHIgPSBibnh0X3NlbGVjdF9tcGNfcmluZyhicCwgQk5YVF9NUENfVENFX1RZUEUpO1xuJiM0MztcdFx0Y21kLmN0eF9raW5kID0gQ0VfQUREX0NNRF9DVFhfS0lORF9DS19UWDtcbiYjNDM7XHR9IGVsc2Uge1xuJiM0MztcdFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xuJiM0MztcdH1cbiYjNDM7XHRpZiAoIXR4cilcbiYjNDM7XHRcdHJldHVybiAtRU5PREVWO1xuJiM0MztcbiYjNDM7XHRkYXRhID0gQ0VfQUREX0NNRF9PUENPREVfQUREIHwgKEJOWFRfS0lEX0hXKGtpZCkgXHUwMDNjXHUwMDNjIENFX0FERF9DTURfS0lEX1NGVCk7XG4mIzQzO1x0c3dpdGNoIChjcnlwdG9faW5mby1cdTAwM2VjaXBoZXJfdHlwZSkge1xuJiM0MztcdGNhc2UgVExTX0NJUEhFUl9BRVNfR0NNXzEyODoge1xuJiM0MztcdFx0c3RydWN0IHRsczEyX2NyeXB0b19pbmZvX2Flc19nY21fMTI4ICphZXM7XG4mIzQzO1xuJiM0MztcdFx0YWVzID0gKHZvaWQgKiljcnlwdG9faW5mbztcbiYjNDM7XHRcdGRhdGEgfD0gQ0VfQUREX0NNRF9BTEdPUklUSE1fQUVTX0dDTV8xMjg7XG4mIzQzO1x0XHRpZiAoY3J5cHRvX2luZm8tXHUwMDNldmVyc2lvbiA9PSBUTFNfMV8zX1ZFUlNJT04pXG4mIzQzO1x0XHRcdGRhdGEgfD0gQ0VfQUREX0NNRF9WRVJTSU9OX1RMUzFfMztcbiYjNDM7XHRcdG1lbWNweShcdTAwMjZjbWQuc2Vzc2lvbl9rZXksIGFlcy1cdTAwM2VrZXksIHNpemVvZihhZXMtXHUwMDNla2V5KSk7XG4mIzQzO1x0XHRtZW1jcHkoXHUwMDI2Y21kLnNhbHQsIGFlcy1cdTAwM2VzYWx0LCBzaXplb2YoYWVzLVx1MDAzZXNhbHQpKTtcbiYjNDM7XHRcdG1lbWNweShcdTAwMjZjbWQuYWRkbF9pdiwgYWVzLVx1MDAzZWl2LCBzaXplb2YoYWVzLVx1MDAzZWl2KSk7XG4mIzQzO1x0XHRibnh0X2NvcHlfdGxzX21wX2RhdGEoY21kLnJlY29yZF9zZXFfbnVtLCBhZXMtXHUwMDNlcmVjX3NlcSxcbiYjNDM7XHRcdFx0XHQgICAgICBzaXplb2YoYWVzLVx1MDAzZXJlY19zZXEpKTtcbiYjNDM7XHRcdGJyZWFrO1xuJiM0MztcdH1cbiYjNDM7XHRjYXNlIFRMU19DSVBIRVJfQUVTX0dDTV8yNTY6IHtcbiYjNDM7XHRcdHN0cnVjdCB0bHMxMl9jcnlwdG9faW5mb19hZXNfZ2NtXzI1NiAqYWVzO1xuJiM0MztcbiYjNDM7XHRcdGFlcyA9ICh2b2lkICopY3J5cHRvX2luZm87XG4mIzQzO1x0XHRkYXRhIHw9IENFX0FERF9DTURfQUxHT1JJVEhNX0FFU19HQ01fMjU2O1xuJiM0MztcdFx0aWYgKGNyeXB0b19pbmZvLVx1MDAzZXZlcnNpb24gPT0gVExTXzFfM19WRVJTSU9OKVxuJiM0MztcdFx0XHRkYXRhIHw9IENFX0FERF9DTURfVkVSU0lPTl9UTFMxXzM7XG4mIzQzO1x0XHRtZW1jcHkoXHUwMDI2Y21kLnNlc3Npb25fa2V5LCBhZXMtXHUwMDNla2V5LCBzaXplb2YoYWVzLVx1MDAzZWtleSkpO1xuJiM0MztcdFx0bWVtY3B5KFx1MDAyNmNtZC5zYWx0LCBhZXMtXHUwMDNlc2FsdCwgc2l6ZW9mKGFlcy1cdTAwM2VzYWx0KSk7XG4mIzQzO1x0XHRtZW1jcHkoXHUwMDI2Y21kLmFkZGxfaXYsIGFlcy1cdTAwM2Vpdiwgc2l6ZW9mKGFlcy1cdTAwM2VpdikpO1xuJiM0MztcdFx0Ym54dF9jb3B5X3Rsc19tcF9kYXRhKGNtZC5yZWNvcmRfc2VxX251bSwgYWVzLVx1MDAzZXJlY19zZXEsXG4mIzQzO1x0XHRcdFx0ICAgICAgc2l6ZW9mKGFlcy1cdTAwM2VyZWNfc2VxKSk7XG4mIzQzO1x0XHRicmVhaztcbiYjNDM7XHR9XG4mIzQzO1x0ZGVmYXVsdDpcbiYjNDM7XHRcdHJldHVybiAtRU9QTk9UU1VQUDtcbiYjNDM7XHR9XG4mIzQzO1x0Y21kLnZlcl9hbGdvX2tpZF9vcGNvZGUgPSBjcHVfdG9fbGUzMihkYXRhKTtcbiYjNDM7XHRjbWQucGt0X3RjcF9zZXFfbnVtID0gY3B1X3RvX2xlMzIodGNwX3NlcV9ubyk7XG4mIzQzO1x0Y21kLnRsc19oZWFkZXJfdGNwX3NlcV9udW0gPSBjbWQucGt0X3RjcF9zZXFfbnVtO1xuJiM0MztcdHJjID0gYm54dF94bWl0X2NyeXB0b19jbWQoYnAsIHR4ciwgXHUwMDI2Y21kLCBzaXplb2YoY21kKSxcbiYjNDM7XHRcdFx0XHQgIEJOWFRfTVBDX1RNT19NU0VDUyk7XG4mIzQzO1x0bWVtemVyb19leHBsaWNpdChcdTAwMjZjbWQsIHNpemVvZihjbWQpKTtcbiYjNDM7XHRyZXR1cm4gcmM7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBib29sIGJueHRfa3Rsc19jaXBoZXJfc3VwcG9ydGVkKHN0cnVjdCBibnh0ICpicCxcbiYjNDM7XHRcdFx0XHQgICAgICAgc3RydWN0IHRsc19jcnlwdG9faW5mbyAqY3J5cHRvX2luZm8pXG4mIzQzO3tcbiYjNDM7XHR1MTYgdHlwZSA9IGNyeXB0b19pbmZvLVx1MDAzZWNpcGhlcl90eXBlO1xuJiM0MztcdHUxNiB2ZXJzaW9uID0gY3J5cHRvX2luZm8tXHUwMDNldmVyc2lvbjtcbiYjNDM7XG4mIzQzO1x0aWYgKCh0eXBlID09IFRMU19DSVBIRVJfQUVTX0dDTV8xMjggfHxcbiYjNDM7XHQgICAgIHR5cGUgPT0gVExTX0NJUEhFUl9BRVNfR0NNXzI1NikgXHUwMDI2XHUwMDI2XG4mIzQzO1x0ICAgICh2ZXJzaW9uID09IFRMU18xXzJfVkVSU0lPTiB8fFxuJiM0MztcdCAgICAgdmVyc2lvbiA9PSBUTFNfMV8zX1ZFUlNJT04pKVxuJiM0MztcdFx0cmV0dXJuIHRydWU7XG4mIzQzO1x0cmV0dXJuIGZhbHNlO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBibnh0X3NldF9rdGxzX2N0eF90eChzdHJ1Y3QgdGxzX2NvbnRleHQgKnRsc19jdHgsXG4mIzQzO1x0XHRcdFx0IHN0cnVjdCBibnh0X2t0bHNfb2ZmbG9hZF9jdHhfdHggKmtjdHhfdHgpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYm54dF9rdGxzX3R4X2RyaXZlcl9zdGF0ZSAqdHggPVxuJiM0MztcdFx0X190bHNfZHJpdmVyX2N0eCh0bHNfY3R4LCBUTFNfT0ZGTE9BRF9DVFhfRElSX1RYKTtcbiYjNDM7XG4mIzQzO1x0dHgtXHUwMDNlY3R4X3R4ID0ga2N0eF90eDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHN0cnVjdCBibnh0X2t0bHNfb2ZmbG9hZF9jdHhfdHggKlxuJiM0Mztibnh0X2dldF9rdGxzX2N0eF90eChzdHJ1Y3QgdGxzX2NvbnRleHQgKnRsc19jdHgpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYm54dF9rdGxzX3R4X2RyaXZlcl9zdGF0ZSAqdHggPVxuJiM0MztcdFx0X190bHNfZHJpdmVyX2N0eCh0bHNfY3R4LCBUTFNfT0ZGTE9BRF9DVFhfRElSX1RYKTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHR4LVx1MDAzZWN0eF90eDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBibnh0X2t0bHNfZGV2X2FkZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc29jayAqc2ssXG4mIzQzO1x0XHRcdCAgICAgZW51bSB0bHNfb2ZmbG9hZF9jdHhfZGlyIGRpcmVjdGlvbixcbiYjNDM7XHRcdFx0ICAgICBzdHJ1Y3QgdGxzX2NyeXB0b19pbmZvICpjcnlwdG9faW5mbyxcbiYjNDM7XHRcdFx0ICAgICB1MzIgc3RhcnRfb2ZmbG9hZF90Y3Bfc24pXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYm54dF9rdGxzX29mZmxvYWRfY3R4X3R4ICprY3R4X3R4O1xuJiM0MztcdHN0cnVjdCBibnh0ICpicCA9IG5ldGRldl9wcml2KGRldik7XG4mIzQzO1x0c3RydWN0IGJueHRfY3J5cHRvX2luZm8gKmNyeXB0bztcbiYjNDM7XHRzdHJ1Y3QgdGxzX2NvbnRleHQgKnRsc19jdHg7XG4mIzQzO1x0c3RydWN0IGJueHRfdGxzX2luZm8gKmt0bHM7XG4mIzQzO1x0c3RydWN0IGJueHRfa2N0eCAqa2N0eDtcbiYjNDM7XHR1MzIga2lkO1xuJiM0MztcdGludCByYztcbiYjNDM7XG4mIzQzO1x0QlVJTERfQlVHX09OKHNpemVvZihzdHJ1Y3QgYm54dF9rdGxzX3R4X2RyaXZlcl9zdGF0ZSkgXHUwMDNlXG4mIzQzO1x0XHQgICAgIFRMU19EUklWRVJfU1RBVEVfU0laRV9UWCk7XG4mIzQzO1xuJiM0MztcdGt0bHMgPSBicC1cdTAwM2VrdGxzX2luZm87XG4mIzQzO1x0aWYgKGRpcmVjdGlvbiA9PSBUTFNfT0ZGTE9BRF9DVFhfRElSX1JYKVxuJiM0MztcdFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xuJiM0MztcbiYjNDM7XHRpZiAoIUJOWFRfU1VQUE9SVFNfS1RMUyhicCkpIHtcbiYjNDM7XHRcdGF0b21pYzY0X2luYyhcdTAwMjZrdGxzLVx1MDAzZWNvdW50ZXJzW0JOWFRfS1RMU19FUlJfTk9fQ0FQXSk7XG4mIzQzO1x0XHRyZXR1cm4gLUVPUE5PVFNVUFA7XG4mIzQzO1x0fVxuJiM0MztcdGF0b21pY19pbmMoXHUwMDI2a3Rscy1cdTAwM2VwZW5kaW5nKTtcbiYjNDM7XHQvKiBNYWtlIHN1cmUgYm54dF9jbG9zZV9uaWMoKSBzZWVzIHBlbmRpbmcgYmVmb3JlIHdlIGNoZWNrIHRoZVxuJiM0MztcdCAqIEJOWFRfU1RBVEVfT1BFTiBmbGFnLlxuJiM0MztcdCAqL1xuJiM0MztcdHNtcF9tYl9fYWZ0ZXJfYXRvbWljKCk7XG4mIzQzO1x0aWYgKCF0ZXN0X2JpdChCTlhUX1NUQVRFX09QRU4sIFx1MDAyNmJwLVx1MDAzZXN0YXRlKSkge1xuJiM0MztcdFx0YXRvbWljNjRfaW5jKFx1MDAyNmt0bHMtXHUwMDNlY291bnRlcnNbQk5YVF9LVExTX0VSUl9TVEFURV9OT1RfT1BFTl0pO1xuJiM0MztcdFx0cmMgPSAtRU5PREVWO1xuJiM0MztcdFx0Z290byBleGl0O1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aWYgKCFibnh0X2t0bHNfY2lwaGVyX3N1cHBvcnRlZChicCwgY3J5cHRvX2luZm8pKSB7XG4mIzQzO1x0XHRhdG9taWM2NF9pbmMoXHUwMDI2a3Rscy1cdTAwM2Vjb3VudGVyc1tCTlhUX0tUTFNfRVJSX0lOVkFMSURfQ0lQSEVSXSk7XG4mIzQzO1x0XHRyYyA9IC1FT1BOT1RTVVBQO1xuJiM0MztcdFx0Z290byBleGl0O1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0a2N0eF90eCA9IGt6YWxsb2Nfb2JqKCprY3R4X3R4KTtcbiYjNDM7XHRpZiAoIWtjdHhfdHgpIHtcbiYjNDM7XHRcdGF0b21pYzY0X2luYyhcdTAwMjZrdGxzLVx1MDAzZWNvdW50ZXJzW0JOWFRfS1RMU19FUlJfTk9fTUVNXSk7XG4mIzQzO1x0XHRyYyA9IC1FTk9NRU07XG4mIzQzO1x0XHRnb3RvIGV4aXQ7XG4mIzQzO1x0fVxuJiM0MztcdHRsc19jdHggPSB0bHNfZ2V0X2N0eChzayk7XG4mIzQzO1x0Y3J5cHRvID0gYnAtXHUwMDNlY3J5cHRvX2luZm87XG4mIzQzO1x0a2N0eCA9IFx1MDAyNmNyeXB0by1cdTAwM2VrY3R4W0JOWFRfVFhfQ1JZUFRPX0tFWV9UWVBFXTtcbiYjNDM7XHRyYyA9IGJueHRfa2V5X2N0eF9hbGxvY19vbmUoYnAsIGtjdHgsIEJOWFRfQ1RYX0tJTkRfQ0tfVFgsIFx1MDAyNmtpZCk7XG4mIzQzO1x0aWYgKHJjKSB7XG4mIzQzO1x0XHRhdG9taWM2NF9pbmMoXHUwMDI2a3Rscy1cdTAwM2Vjb3VudGVyc1tCTlhUX0tUTFNfRVJSX0tFWV9DVFhfQUxMT0NdKTtcbiYjNDM7XHRcdGdvdG8gZnJlZV9jdHg7XG4mIzQzO1x0fVxuJiM0MztcdHJjID0gYm54dF9jcnlwdG9fYWRkKGJwLCBkaXJlY3Rpb24sIGNyeXB0b19pbmZvLCBzdGFydF9vZmZsb2FkX3RjcF9zbixcbiYjNDM7XHRcdFx0ICAgICBraWQpO1xuJiM0MztcdGlmIChyYykge1xuJiM0MztcdFx0YXRvbWljNjRfaW5jKFx1MDAyNmt0bHMtXHUwMDNlY291bnRlcnNbQk5YVF9LVExTX0VSUl9DUllQVE9fQ01EXSk7XG4mIzQzO1x0XHRnb3RvIGZyZWVfa2N0eDtcbiYjNDM7XHR9XG4mIzQzO1x0a2N0eF90eC1cdTAwM2VraWQgPSBraWQ7XG4mIzQzO1x0a2N0eF90eC1cdTAwM2V0Y3Bfc2VxX25vID0gc3RhcnRfb2ZmbG9hZF90Y3Bfc247XG4mIzQzO1x0Ym54dF9zZXRfa3Rsc19jdHhfdHgodGxzX2N0eCwga2N0eF90eCk7XG4mIzQzO1x0YXRvbWljNjRfaW5jKFx1MDAyNmt0bHMtXHUwMDNlY291bnRlcnNbQk5YVF9LVExTX1RYX0FERF0pO1xuJiM0MztcdGdvdG8gZXhpdDtcbiYjNDM7XG4mIzQzO2ZyZWVfa2N0eDpcbiYjNDM7XHQvKiBUaGlzIEtJRCB3YXMganVzdCBhbGxvY2F0ZWQgd2hpbGUgaG9sZGluZyBrdGxzLVx1MDAzZXBlbmRpbmcsIHNvIGVwb2NoXG4mIzQzO1x0ICogY2hlY2sgaXMgdW5uZWNlc3NhcnkuXG4mIzQzO1x0ICovXG4mIzQzO1x0Ym54dF9mcmVlX29uZV9rY3R4KGtjdHgsIGtpZCk7XG4mIzQzO2ZyZWVfY3R4OlxuJiM0MztcdGtmcmVlKGtjdHhfdHgpO1xuJiM0MztleGl0OlxuJiM0MztcdGF0b21pY19kZWMoXHUwMDI2a3Rscy1cdTAwM2VwZW5kaW5nKTtcbiYjNDM7XHRyZXR1cm4gcmM7XG4mIzQzO31cbiYjNDM7XG4mIzQzOyNkZWZpbmUgS1RMU19SRVRSWV9NQVhcdFx0MTAwXG4mIzQzOyNkZWZpbmUgS1RMU19XQUlUX1RNT19NU1x0MTAwXG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBibnh0X2t0bHNfZGV2X2RlbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LFxuJiM0MztcdFx0XHQgICAgICBzdHJ1Y3QgdGxzX2NvbnRleHQgKnRsc19jdHgsXG4mIzQzO1x0XHRcdCAgICAgIGVudW0gdGxzX29mZmxvYWRfY3R4X2RpciBkaXJlY3Rpb24pXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYm54dF9rdGxzX29mZmxvYWRfY3R4X3R4ICprY3R4X3R4O1xuJiM0MztcdHN0cnVjdCBibnh0ICpicCA9IG5ldGRldl9wcml2KGRldik7XG4mIzQzO1x0c3RydWN0IGJueHRfY3J5cHRvX2luZm8gKmNyeXB0bztcbiYjNDM7XHRzdHJ1Y3QgYm54dF90bHNfaW5mbyAqa3RscztcbiYjNDM7XHRzdHJ1Y3QgYm54dF9rY3R4ICprY3R4O1xuJiM0MztcdGludCByZXRyeV9jbnQgPSAwO1xuJiM0MztcdHU4IGtpbmQ7XG4mIzQzO1x0dTMyIGtpZDtcbiYjNDM7XG4mIzQzO1x0a3RscyA9IGJwLVx1MDAzZWt0bHNfaW5mbztcbiYjNDM7XHRrY3R4X3R4ID0gYm54dF9nZXRfa3Rsc19jdHhfdHgodGxzX2N0eCk7XG4mIzQzO3JldHJ5OlxuJiM0MztcdGlmICghdGVzdF9iaXQoQk5YVF9TVEFURV9PUEVOLCBcdTAwMjZicC1cdTAwM2VzdGF0ZSkpIHtcbiYjNDM7XHRcdC8qIER1cmluZyBpZmRvd24gb3IgRlcgcmVzZXQsIGFsbCBjb25uZWN0aW9ucyB3aWxsIGJlIHRvcm5cbiYjNDM7XHRcdCAqIGRvd24gYnkgYm54dF9jcnlwdG9fZGVsX2FsbCgpIC8gRlVOQ19SRVNFVCwgc28gbm90aGluZyB0b1xuJiM0MztcdFx0ICogZG8gaGVyZS4gIE9ubHkgYSByZWNvbmZpZ3VyYXRpb24gaXMgdHJhbnNpZW50IGFuZFxuJiM0MztcdFx0ICogX19ibnh0X29wZW5fbmljKCkgd2lsbCBzZXQgQk5YVF9TVEFURV9PUEVOIGFnYWluIGFuZCB3YWtlIHVzLlxuJiM0MztcdFx0ICovXG4mIzQzO1x0XHRpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSB8fFxuJiM0MztcdFx0ICAgIHRlc3RfYml0KEJOWFRfU1RBVEVfSU5fRldfUkVTRVQsIFx1MDAyNmJwLVx1MDAzZXN0YXRlKSlcbiYjNDM7XHRcdFx0Z290byBmcmVlO1xuJiM0MztcdFx0LyogQm91bmQgdGhlIHdhaXQgc28gYSB3ZWRnZWQgcmVjb25maWcgY2FuJiMzOTt0IGJsb2NrIHRoZSBrVExTXG4mIzQzO1x0XHQgKiBkZXN0cnVjdCB3b3JrIGluZGVmaW5pdGVseS5cbiYjNDM7XHRcdCAqL1xuJiM0MztcdFx0aWYgKHJldHJ5X2NudCYjNDM7JiM0MzsgXHUwMDNlIEtUTFNfUkVUUllfTUFYKSB7XG4mIzQzO1x0XHRcdGF0b21pYzY0X2luYyhcdTAwMjZrdGxzLVx1MDAzZWNvdW50ZXJzW0JOWFRfS1RMU19FUlJfUkVUUllfRVhDRUVERURdKTtcbiYjNDM7XHRcdFx0bmV0ZGV2X3dhcm4oZGV2LCBcJiMzNDslcyB0aW1lZCBvdXQgd2FpdGluZyBmb3IgZGV2aWNlLCBzdGF0ZSAlbHhcXG5cJiMzNDssXG4mIzQzO1x0XHRcdFx0ICAgIF9fZnVuY19fLCBicC1cdTAwM2VzdGF0ZSk7XG4mIzQzO1x0XHRcdGdvdG8gZnJlZTtcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdHdhaXRfZXZlbnRfdGltZW91dChrdGxzLVx1MDAzZW9wZW5fd3EsXG4mIzQzO1x0XHRcdFx0ICAgdGVzdF9iaXQoQk5YVF9TVEFURV9PUEVOLCBcdTAwMjZicC1cdTAwM2VzdGF0ZSkgfHxcbiYjNDM7XHRcdFx0XHQgICAhbmV0aWZfcnVubmluZyhkZXYpIHx8XG4mIzQzO1x0XHRcdFx0ICAgdGVzdF9iaXQoQk5YVF9TVEFURV9JTl9GV19SRVNFVCwgXHUwMDI2YnAtXHUwMDNlc3RhdGUpLFxuJiM0MztcdFx0XHRcdCAgIG1zZWNzX3RvX2ppZmZpZXMoS1RMU19XQUlUX1RNT19NUykpO1xuJiM0MztcdFx0Z290byByZXRyeTtcbiYjNDM7XHR9XG4mIzQzO1x0YXRvbWljX2luYyhcdTAwMjZrdGxzLVx1MDAzZXBlbmRpbmcpO1xuJiM0MztcdC8qIE1ha2Ugc3VyZSBibnh0X2Nsb3NlX25pYygpIHNlZXMgcGVuZGluZyBiZWZvcmUgd2UgY2hlY2sgdGhlXG4mIzQzO1x0ICogQk5YVF9TVEFURV9PUEVOIGZsYWcuXG4mIzQzO1x0ICovXG4mIzQzO1x0c21wX21iX19hZnRlcl9hdG9taWMoKTtcbiYjNDM7XHRpZiAoIXRlc3RfYml0KEJOWFRfU1RBVEVfT1BFTiwgXHUwMDI2YnAtXHUwMDNlc3RhdGUpKSB7XG4mIzQzO1x0XHRhdG9taWNfZGVjKFx1MDAyNmt0bHMtXHUwMDNlcGVuZGluZyk7XG4mIzQzO1x0XHRnb3RvIHJldHJ5O1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0Y3J5cHRvID0gYnAtXHUwMDNlY3J5cHRvX2luZm87XG4mIzQzO1x0a2lkID0ga2N0eF90eC1cdTAwM2VraWQ7XG4mIzQzO1x0a2N0eCA9IFx1MDAyNmNyeXB0by1cdTAwM2VrY3R4W0JOWFRfVFhfQ1JZUFRPX0tFWV9UWVBFXTtcbiYjNDM7XHRraW5kID0gQk5YVF9DVFhfS0lORF9DS19UWDtcbiYjNDM7XHRhdG9taWM2NF9pbmMoXHUwMDI2a3Rscy1cdTAwM2Vjb3VudGVyc1tCTlhUX0tUTFNfVFhfREVMXSk7XG4mIzQzO1x0LyogVGhpcyBLSUQgd2FzIGFsbG9jYXRlZCBieSBhbiBlYXJsaWVyIGFkZCBhbmQgbWF5IGhhdmUgb3V0bGl2ZWQgYSBGV1xuJiM0MztcdCAqIHJlc2V0LCBzbyB2YWxpZGF0ZSBpdHMgZXBvY2ggYmVmb3JlIGRlbGV0aW5nL2ZyZWVpbmcgaXQuXG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKGJueHRfa2lkX3ZhbGlkKGtjdHgsIGtpZCkgXHUwMDI2XHUwMDI2XG4mIzQzO1x0ICAgICFibnh0X2NyeXB0b19kZWwoYnAsIGtjdHgtXHUwMDNldHlwZSwga2luZCwga2lkKSlcbiYjNDM7XHRcdGJueHRfZnJlZV9vbmVfa2N0eChrY3R4LCBraWQpO1xuJiM0MztcbiYjNDM7XHRhdG9taWNfZGVjKFx1MDAyNmt0bHMtXHUwMDNlcGVuZGluZyk7XG4mIzQzO2ZyZWU6XG4mIzQzO1x0Ym54dF9zZXRfa3Rsc19jdHhfdHgodGxzX2N0eCwgTlVMTCk7XG4mIzQzO1x0a2ZyZWUoa2N0eF90eCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBjb25zdCBzdHJ1Y3QgdGxzZGV2X29wcyBibnh0X2t0bHNfb3BzID0ge1xuJiM0MztcdC50bHNfZGV2X2FkZCA9IGJueHRfa3Rsc19kZXZfYWRkLFxuJiM0MztcdC50bHNfZGV2X2RlbCA9IGJueHRfa3Rsc19kZXZfZGVsLFxuJiM0Mzt9O1xuJiM0MztcbiYjNDM7aW50IGJueHRfa3Rsc19pbml0KHN0cnVjdCBibnh0ICpicClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBibnh0X3Rsc19pbmZvICprdGxzID0gYnAtXHUwMDNla3Rsc19pbmZvO1xuJiM0MztcdHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBicC1cdTAwM2VkZXY7XG4mIzQzO1xuJiM0MztcdGlmICgha3RscylcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcbiYjNDM7XHRkZXYtXHUwMDNldGxzZGV2X29wcyA9IFx1MDAyNmJueHRfa3Rsc19vcHM7XG4mIzQzO1x0ZGV2LVx1MDAzZWh3X2ZlYXR1cmVzIHw9IE5FVElGX0ZfSFdfVExTX1RYO1xuJiM0MztcdGRldi1cdTAwM2VmZWF0dXJlcyB8PSBORVRJRl9GX0hXX1RMU19UWDtcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgYm54dF9rdGxzX2luY190eF9zdGF0cyhzdHJ1Y3QgYm54dF90eF9yaW5nX2luZm8gKnR4ciwgdTMyIGJ5dGVzLFxuJiM0MztcdFx0XHRcdCAgIGJvb2wgb29vKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGJueHRfdGxzX3N3X3N0YXRzICpyaW5nX3N0YXRzID0gdHhyLVx1MDAzZXRsc19zdGF0cztcbiYjNDM7XG4mIzQzO1x0aWYgKCFyaW5nX3N0YXRzKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcdHJpbmdfc3RhdHMtXHUwMDNlY291bnRlcnNbQk5YVF9LVExTX1RYX1BLVFNdJiM0MzsmIzQzOztcbiYjNDM7XHRyaW5nX3N0YXRzLVx1MDAzZWNvdW50ZXJzW0JOWFRfS1RMU19UWF9CWVRFU10gJiM0Mzs9IGJ5dGVzO1xuJiM0MztcdGlmIChvb28pXG4mIzQzO1x0XHRyaW5nX3N0YXRzLVx1MDAzZWNvdW50ZXJzW0JOWFRfS1RMU19UWF9PT09fUEtUU10mIzQzOyYjNDM7O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBibnh0X2t0bHNfcHJlX3htaXQoc3RydWN0IGJueHQgKmJwLCBzdHJ1Y3QgYm54dF90eF9yaW5nX2luZm8gKnR4cixcbiYjNDM7XHRcdFx0ICAgICAgIHUzMiBraWQsIHN0cnVjdCBjcnlwdG9fcHJlZml4X2NtZCAqcHJlX2NtZClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBibnh0X3N3X3R4X2JkICp0eF9idWY7XG4mIzQzO1x0c3RydWN0IHR4X2JkX3ByZXN5bmMgKnBzYmQ7XG4mIzQzO1x0dTMyIGJkX3NwYWNlLCBzcGFjZTtcbiYjNDM7XHR1OCAqcGNtZDtcbiYjNDM7XHR1MTYgcHJvZDtcbiYjNDM7XG4mIzQzO1x0cHJvZCA9IHR4ci1cdTAwM2V0eF9wcm9kO1xuJiM0MztcdHR4X2J1ZiA9IFx1MDAyNnR4ci1cdTAwM2V0eF9idWZfcmluZ1tSSU5HX1RYKGJwLCBwcm9kKV07XG4mIzQzO1xuJiM0MztcdHBzYmQgPSAodm9pZCAqKVx1MDAyNnR4ci1cdTAwM2V0eF9kZXNjX3JpbmdbVFhfUklORyhicCwgcHJvZCldW1RYX0lEWChwcm9kKV07XG4mIzQzO1x0cHNiZC1cdTAwM2V0eF9iZF9sZW5fZmxhZ3NfdHlwZSA9IENSWVBUT19QUkVTWU5DX0JEX0NNRDtcbiYjNDM7XHRwc2JkLVx1MDAzZXR4X2JkX2tpZCA9IGNwdV90b19sZTMyKEJOWFRfS0lEX0hXKGtpZCkpO1xuJiM0MztcdHBzYmQtXHUwMDNldHhfYmRfb3BhcXVlID1cbiYjNDM7XHRcdFNFVF9UWF9PUEFRVUUoYnAsIHR4ciwgcHJvZCwgQ1JZUFRPX1BSRUZJWF9DTURfQkRTICYjNDM7IDEpO1xuJiM0MztcbiYjNDM7XHRwcm9kID0gTkVYVF9UWChwcm9kKTtcbiYjNDM7XHRwY21kID0gKHZvaWQgKilcdTAwMjZ0eHItXHUwMDNldHhfZGVzY19yaW5nW1RYX1JJTkcoYnAsIHByb2QpXVtUWF9JRFgocHJvZCldO1xuJiM0MztcdGJkX3NwYWNlID0gVFhfREVTQ19DTlQgLSBUWF9JRFgocHJvZCk7XG4mIzQzO1x0c3BhY2UgPSBiZF9zcGFjZSAqIHNpemVvZihzdHJ1Y3QgdHhfYmQpO1xuJiM0MztcdGlmIChzcGFjZSBcdTAwM2U9IENSWVBUT19QUkVGSVhfQ01EX1NJWkUpIHtcbiYjNDM7XHRcdG1lbWNweShwY21kLCBwcmVfY21kLCBDUllQVE9fUFJFRklYX0NNRF9TSVpFKTtcbiYjNDM7XHRcdHByb2QgJiM0Mzs9IENSWVBUT19QUkVGSVhfQ01EX0JEUztcbiYjNDM7XHR9IGVsc2Uge1xuJiM0MztcdFx0bWVtY3B5KHBjbWQsIHByZV9jbWQsIHNwYWNlKTtcbiYjNDM7XHRcdHByb2QgJiM0Mzs9IGJkX3NwYWNlO1xuJiM0MztcdFx0cGNtZCA9ICh2b2lkICopXHUwMDI2dHhyLVx1MDAzZXR4X2Rlc2NfcmluZ1tUWF9SSU5HKGJwLCBwcm9kKV1bVFhfSURYKHByb2QpXTtcbiYjNDM7XHRcdG1lbWNweShwY21kLCAodTggKilwcmVfY21kICYjNDM7IHNwYWNlLFxuJiM0MztcdFx0ICAgICAgIENSWVBUT19QUkVGSVhfQ01EX1NJWkUgLSBzcGFjZSk7XG4mIzQzO1x0XHRwcm9kICYjNDM7PSBDUllQVE9fUFJFRklYX0NNRF9CRFMgLSBiZF9zcGFjZTtcbiYjNDM7XHR9XG4mIzQzO1x0dHhyLVx1MDAzZXR4X3Byb2QgPSBwcm9kO1xuJiM0MztcdHR4X2J1Zi1cdTAwM2Vpc19wdXNoID0gMTtcbiYjNDM7XHQvKiBNaW51cyAxIHNpbmNlIHRoZSBoZWFkZXIgcHNiZCBpcyBhIHNpbmdsZSBlbnRyeSBzaG9ydCBCRCAqL1xuJiM0MztcdHR4X2J1Zi1cdTAwM2VpbmxpbmVfZGF0YV9iZHMgPSBDUllQVE9fUFJFRklYX0NNRF9CRFMgLSAxO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IGJueHRfa3Rsc190eF9vb28oc3RydWN0IGJueHQgKmJwLCBzdHJ1Y3QgYm54dF90eF9yaW5nX2luZm8gKnR4cixcbiYjNDM7XHRcdFx0ICAgIHN0cnVjdCBza19idWZmICpza2IsIHUzMiBwYXlsb2FkX2xlbiwgdTMyIHNlcSxcbiYjNDM7XHRcdFx0ICAgIHN0cnVjdCB0bHNfY29udGV4dCAqdGxzX2N0eClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBibnh0X3Rsc19zd19zdGF0cyAqcmluZ19zdGF0cyA9IHR4ci1cdTAwM2V0bHNfc3RhdHM7XG4mIzQzO1x0c3RydWN0IHRsc19vZmZsb2FkX2NvbnRleHRfdHggKnR4X3Rsc19jdHg7XG4mIzQzO1x0c3RydWN0IGJueHRfa3Rsc19vZmZsb2FkX2N0eF90eCAqa2N0eF90eDtcbiYjNDM7XHR1MzIgaGRyX3RjcF9zZXEsIGVuZF9zZXEsIHRvdGFsX2JkcztcbiYjNDM7XHRzdHJ1Y3QgY3J5cHRvX3ByZWZpeF9jbWQgcGNtZCA9IHt9O1xuJiM0MztcdHN0cnVjdCB0bHNfcmVjb3JkX2luZm8gKnJlY29yZDtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIGZsYWdzO1xuJiM0MztcdGJvb2wgZndkID0gZmFsc2U7XG4mIzQzO1x0X19sZTY0IGxlX3JlY19zbjtcbiYjNDM7XHR1NjQgcmVjX3NuO1xuJiM0MztcdHU4ICpoZHI7XG4mIzQzO1x0aW50IHJjO1xuJiM0MztcbiYjNDM7XHR0eF90bHNfY3R4ID0gdGxzX29mZmxvYWRfY3R4X3R4KHRsc19jdHgpO1xuJiM0MztcdGtjdHhfdHggPSBibnh0X2dldF9rdGxzX2N0eF90eCh0bHNfY3R4KTtcbiYjNDM7XHRlbmRfc2VxID0gc2VxICYjNDM7IHNrYi1cdTAwM2VsZW4gLSBza2JfdGNwX2FsbF9oZWFkZXJzKHNrYik7XG4mIzQzO1x0aWYgKHVubGlrZWx5KGFmdGVyKHNlcSwga2N0eF90eC1cdTAwM2V0Y3Bfc2VxX25vKSB8fFxuJiM0MztcdFx0ICAgICBhZnRlcihlbmRfc2VxLCBrY3R4X3R4LVx1MDAzZXRjcF9zZXFfbm8pKSkge1xuJiM0MztcdFx0ZndkID0gdHJ1ZTtcbiYjNDM7XHRcdHBjbWQuZmxhZ3MgPSBDUllQVE9fUFJFRklYX0NNRF9GTEFHU19VUERBVEVfSU5fT1JERVJfVkFSX0xFO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0c3Bpbl9sb2NrX2lycXNhdmUoXHUwMDI2dHhfdGxzX2N0eC1cdTAwM2Vsb2NrLCBmbGFncyk7XG4mIzQzO1x0cmVjb3JkID0gdGxzX2dldF9yZWNvcmQodHhfdGxzX2N0eCwgc2VxLCBcdTAwMjZyZWNfc24pO1xuJiM0MztcdGlmICghcmVjb3JkIHx8ICFyZWNvcmQtXHUwMDNlbnVtX2ZyYWdzKSB7XG4mIzQzO1x0XHRyYyA9IC1FUFJPVE87XG4mIzQzO1x0XHRyaW5nX3N0YXRzLVx1MDAzZWNvdW50ZXJzW0JOWFRfS1RMU19UWF9PT09fRkFMTEJBQ0tfTk9fU1lOQ10mIzQzOyYjNDM7O1xuJiM0MztcdFx0Z290byB1bmxvY2tfZXhpdDtcbiYjNDM7XHR9XG4mIzQzO1x0aGRyX3RjcF9zZXEgPSB0bHNfcmVjb3JkX3N0YXJ0X3NlcShyZWNvcmQpO1xuJiM0MztcdGhkciA9IHNrYl9mcmFnX2FkZHJlc3Nfc2FmZShcdTAwMjZyZWNvcmQtXHUwMDNlZnJhZ3NbMF0pO1xuJiM0MztcbiYjNDM7XHR0b3RhbF9iZHMgPSBDUllQVE9fUFJFU1lOQ19CRFMgJiM0Mzsgc2tiX3NoaW5mbyhza2IpLVx1MDAzZW5yX2ZyYWdzICYjNDM7IDI7XG4mIzQzO1x0aWYgKGJueHRfdHhfYXZhaWwoYnAsIHR4cikgXHUwMDNjIHRvdGFsX2Jkcykge1xuJiM0MztcdFx0cmMgPSAtRU5PU1BDO1xuJiM0MztcdFx0cmluZ19zdGF0cy1cdTAwM2Vjb3VudGVyc1tCTlhUX0tUTFNfVFhfT09PX0ZBTExCQUNLX05PX1NQQUNFXSYjNDM7JiM0Mzs7XG4mIzQzO1x0XHRnb3RvIHVubG9ja19leGl0O1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aWYgKGJlZm9yZShyZWNvcmQtXHUwMDNlZW5kX3NlcSAtIHRsc19jdHgtXHUwMDNlcHJvdF9pbmZvLnRhZ19zaXplLFxuJiM0MztcdFx0ICAgc2VxICYjNDM7IHBheWxvYWRfbGVuKSkge1xuJiM0MztcdFx0LyogcmV0cmFuc21pc3Npb24gaW5jbHVkZXMgdGFnIGJ5dGVzICovXG4mIzQzO1x0XHRyYyA9IC1FT1BOT1RTVVBQO1xuJiM0MztcdFx0Z290byB1bmxvY2tfZXhpdDtcbiYjNDM7XHR9XG4mIzQzO1x0cGNtZC5oZWFkZXJfdGNwX3NlcV9udW0gPSBjcHVfdG9fbGUzMihoZHJfdGNwX3NlcSk7XG4mIzQzO1x0cGNtZC5zdGFydF90Y3Bfc2VxX251bSA9IGNwdV90b19sZTMyKHNlcSk7XG4mIzQzO1x0cGNtZC5lbmRfdGNwX3NlcV9udW0gPSBjcHVfdG9fbGUzMihzZXEgJiM0MzsgcGF5bG9hZF9sZW4gLSAxKTtcbiYjNDM7XHRpZiAodGxzX2N0eC1cdTAwM2Vwcm90X2luZm8udmVyc2lvbiA9PSBUTFNfMV8yX1ZFUlNJT04pIHtcbiYjNDM7XHRcdHUzMiBub25jZV9ieXRlcyA9IHRsc19jdHgtXHUwMDNlcHJvdF9pbmZvLml2X3NpemU7XG4mIzQzO1x0XHR1MzIgcmV0cmFuc19vZmYgPSBzZXEgLSBoZHJfdGNwX3NlcTtcbiYjNDM7XG4mIzQzO1x0XHRpZiAoIWhkcikge1xuJiM0MztcdFx0XHRyYyA9IC1FTk9CVUZTO1xuJiM0MztcdFx0XHRyaW5nX3N0YXRzLVx1MDAzZWNvdW50ZXJzW0JOWFRfS1RMU19UWF9PT09fRkFMTEJBQ0tfTk9fSERSXSYjNDM7JiM0Mzs7XG4mIzQzO1x0XHRcdGdvdG8gdW5sb2NrX2V4aXQ7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHRpZiAocmV0cmFuc19vZmYgXHUwMDNlIDUgXHUwMDI2XHUwMDI2IHJldHJhbnNfb2ZmIFx1MDAzYyA1ICYjNDM7IG5vbmNlX2J5dGVzKVxuJiM0MztcdFx0XHRub25jZV9ieXRlcyA9IHJldHJhbnNfb2ZmIC0gNTtcbiYjNDM7XHRcdG1lbWNweShwY21kLmV4cGxpY2l0X25vbmNlLCBoZHIgJiM0MzsgNSwgbm9uY2VfYnl0ZXMpO1xuJiM0MztcdH1cbiYjNDM7XHRsZV9yZWNfc24gPSBjcHVfdG9fbGU2NChyZWNfc24pO1xuJiM0MztcdG1lbWNweShcdTAwMjZwY21kLnJlY29yZF9zZXFfbnVtWzBdLCBcdTAwMjZsZV9yZWNfc24sIHNpemVvZihsZV9yZWNfc24pKTtcbiYjNDM7XG4mIzQzO1x0cmMgPSAwO1xuJiM0MztcdGJueHRfa3Rsc19wcmVfeG1pdChicCwgdHhyLCBrY3R4X3R4LVx1MDAzZWtpZCwgXHUwMDI2cGNtZCk7XG4mIzQzO1xuJiM0MztcdGlmIChmd2QpIHtcbiYjNDM7XHRcdGtjdHhfdHgtXHUwMDNlbmV4dF90Y3Bfc2VxX25vID0gZW5kX3NlcTtcbiYjNDM7XHRcdGtjdHhfdHgtXHUwMDNlcGVuZGluZ19md2QgPSB0cnVlO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO3VubG9ja19leGl0OlxuJiM0MztcdHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoXHUwMDI2dHhfdGxzX2N0eC1cdTAwM2Vsb2NrLCBmbGFncyk7XG4mIzQzO1x0cmV0dXJuIHJjO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdHJ1Y3Qgc2tfYnVmZiAqYm54dF9rdGxzX3htaXQoc3RydWN0IGJueHQgKmJwLCBzdHJ1Y3QgYm54dF90eF9yaW5nX2luZm8gKnR4cixcbiYjNDM7XHRcdFx0ICAgICAgIHN0cnVjdCBza19idWZmICpza2IsIF9fbGUzMiAqbGZsYWdzLCB1MzIgKmtpZCxcbiYjNDM7XHRcdFx0ICAgICAgIHN0cnVjdCBibnh0X2t0bHNfb2ZmbG9hZF9jdHhfdHggKiprY3R4X3R4X3ApXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYm54dF90bHNfaW5mbyAqa3RscyA9IGJwLVx1MDAzZWt0bHNfaW5mbztcbiYjNDM7XHRzdHJ1Y3QgYm54dF9rdGxzX29mZmxvYWRfY3R4X3R4ICprY3R4X3R4O1xuJiM0MztcdHN0cnVjdCB0bHNfY29udGV4dCAqdGxzX2N0eDtcbiYjNDM7XHR1MzIgc2VxLCBwYXlsb2FkX2xlbjtcbiYjNDM7XHRpbnQgcmM7XG4mIzQzO1xuJiM0MztcdGlmICghSVNfRU5BQkxFRChDT05GSUdfVExTX0RFVklDRSkgfHwgIWt0bHMgfHxcbiYjNDM7XHQgICAgIXRsc19pc19za2JfdHhfZGV2aWNlX29mZmxvYWRlZChza2IpKVxuJiM0MztcdFx0cmV0dXJuIHNrYjtcbiYjNDM7XG4mIzQzO1x0c2VxID0gbnRvaGwodGNwX2hkcihza2IpLVx1MDAzZXNlcSk7XG4mIzQzO1x0dGxzX2N0eCA9IHRsc19nZXRfY3R4KHNrYi1cdTAwM2Vzayk7XG4mIzQzO1x0a2N0eF90eCA9IGJueHRfZ2V0X2t0bHNfY3R4X3R4KHRsc19jdHgpO1xuJiM0MztcdHBheWxvYWRfbGVuID0gc2tiLVx1MDAzZWxlbiAtIHNrYl90Y3BfYWxsX2hlYWRlcnMoc2tiKTtcbiYjNDM7XHRpZiAoIXBheWxvYWRfbGVuKVxuJiM0MztcdFx0cmV0dXJuIHNrYjtcbiYjNDM7XHRpZiAoa2N0eF90eC1cdTAwM2V0Y3Bfc2VxX25vID09IHNlcSkge1xuJiM0MztcdFx0LyogU3RhZ2UgdGhlIGFkdmFuY2Ugb25seS4gIHRjcF9zZXFfbm8gYW5kIHRoZSBjb3VudGVycyBhcmVcbiYjNDM7XHRcdCAqIGNvbW1pdHRlZCBieSBibnh0X2t0bHNfeG1pdF9jb21taXQoKSBvbmNlIHRoZSBCRCByZWFjaGVzIHRoZVxuJiM0MztcdFx0ICogcmluZy5cbiYjNDM7XHRcdCAqL1xuJiM0MztcdFx0a2N0eF90eC1cdTAwM2VuZXh0X3RjcF9zZXFfbm8gPSBzZXEgJiM0MzsgcGF5bG9hZF9sZW47XG4mIzQzO1x0XHRrY3R4X3R4LVx1MDAzZXBlbmRpbmdfYnl0ZXMgPSBwYXlsb2FkX2xlbjtcbiYjNDM7XHRcdGtjdHhfdHgtXHUwMDNlcGVuZGluZ19vb28gPSBmYWxzZTtcbiYjNDM7XHRcdGtjdHhfdHgtXHUwMDNlcGVuZGluZ19md2QgPSB0cnVlO1xuJiM0MztcdFx0KmtpZCA9IEJOWFRfS0lEX0hXKGtjdHhfdHgtXHUwMDNla2lkKTtcbiYjNDM7XHRcdCprY3R4X3R4X3AgPSBrY3R4X3R4O1xuJiM0MztcdFx0KmxmbGFncyB8PSBjcHVfdG9fbGUzMihUWF9CRF9GTEFHU19DUllQVE9fRU4gfFxuJiM0MztcdFx0XHRcdCAgICAgICBCTlhUX1RYX0tJRF9MTygqa2lkKSk7XG4mIzQzO1x0fSBlbHNlIHtcbiYjNDM7XHRcdGtjdHhfdHgtXHUwMDNlcGVuZGluZ19md2QgPSBmYWxzZTtcbiYjNDM7XHRcdHJjID0gYm54dF9rdGxzX3R4X29vbyhicCwgdHhyLCBza2IsIHBheWxvYWRfbGVuLCBzZXEsIHRsc19jdHgpO1xuJiM0MztcdFx0aWYgKHJjKVxuJiM0MztcdFx0XHRyZXR1cm4gdGxzX2VuY3J5cHRfc2tiKHNrYik7XG4mIzQzO1xuJiM0MztcdFx0a2N0eF90eC1cdTAwM2VwZW5kaW5nX2J5dGVzID0gcGF5bG9hZF9sZW47XG4mIzQzO1x0XHRrY3R4X3R4LVx1MDAzZXBlbmRpbmdfb29vID0gdHJ1ZTtcbiYjNDM7XHRcdCpraWQgPSBCTlhUX0tJRF9IVyhrY3R4X3R4LVx1MDAzZWtpZCk7XG4mIzQzO1x0XHQqa2N0eF90eF9wID0ga2N0eF90eDtcbiYjNDM7XHRcdCpsZmxhZ3MgfD0gY3B1X3RvX2xlMzIoVFhfQkRfRkxBR1NfQ1JZUFRPX0VOIHxcbiYjNDM7XHRcdFx0XHQgICAgICAgQk5YVF9UWF9LSURfTE8oKmtpZCkpO1xuJiM0MztcdFx0cmV0dXJuIHNrYjtcbiYjNDM7XHR9XG4mIzQzO1x0cmV0dXJuIHNrYjtcbiYjNDM7fVxuJiM0MztcbiYjNDM7dm9pZCBibnh0X2t0bHNfeG1pdF9jb21taXQoc3RydWN0IGJueHRfdHhfcmluZ19pbmZvICp0eHIsXG4mIzQzO1x0XHRcdCAgIHN0cnVjdCBibnh0X2t0bHNfb2ZmbG9hZF9jdHhfdHggKmtjdHhfdHgpXG4mIzQzO3tcbiYjNDM7XHRpZiAoIWtjdHhfdHgpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1x0aWYgKGtjdHhfdHgtXHUwMDNlcGVuZGluZ19md2QpXG4mIzQzO1x0XHRrY3R4X3R4LVx1MDAzZXRjcF9zZXFfbm8gPSBrY3R4X3R4LVx1MDAzZW5leHRfdGNwX3NlcV9ubztcbiYjNDM7XHRibnh0X2t0bHNfaW5jX3R4X3N0YXRzKHR4ciwga2N0eF90eC1cdTAwM2VwZW5kaW5nX2J5dGVzLFxuJiM0MztcdFx0XHQgICAgICAga2N0eF90eC1cdTAwM2VwZW5kaW5nX29vbyk7XG4mIzQzO1x0a2N0eF90eC1cdTAwM2VwZW5kaW5nX2J5dGVzID0gMDtcbiYjNDM7XHRrY3R4X3R4LVx1MDAzZXBlbmRpbmdfZndkID0gZmFsc2U7XG4mIzQzO1x0a2N0eF90eC1cdTAwM2VwZW5kaW5nX29vbyA9IGZhbHNlO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztpbnQgYm54dF9rdGxzX2FsbG9jX3R4X3Jpbmdfc3RhdHMoc3RydWN0IGJueHQgKmJwLCBzdHJ1Y3QgYm54dF90eF9yaW5nX2luZm8gKnR4cilcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBibnh0X3Rsc19zd19zdGF0cyAqcmluZ19zdGF0cztcbiYjNDM7XG4mIzQzO1x0aWYgKCFicC1cdTAwM2VrdGxzX2luZm8pXG4mIzQzO1x0XHRyZXR1cm4gMDtcbiYjNDM7XHRyaW5nX3N0YXRzID0ga3phbGxvY19vYmooKnJpbmdfc3RhdHMpO1xuJiM0MztcdGlmICghcmluZ19zdGF0cylcbiYjNDM7XHRcdHJldHVybiAtRU5PTUVNO1xuJiM0MztcdHR4ci1cdTAwM2V0bHNfc3RhdHMgPSByaW5nX3N0YXRzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0Mzt2b2lkIGJueHRfa3Rsc19mcmVlX3R4X3Jpbmdfc3RhdHMoc3RydWN0IGJueHRfdHhfcmluZ19pbmZvICp0eHIpXG4mIzQzO3tcbiYjNDM7XHRrZnJlZSh0eHItXHUwMDNldGxzX3N0YXRzKTtcbiYjNDM7XHR0eHItXHUwMDNldGxzX3N0YXRzID0gTlVMTDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7dm9pZCBibnh0X2dldF9yaW5nX3Rsc19zdGF0cyhzdHJ1Y3QgYm54dCAqYnAsIHN0cnVjdCBibnh0X3Rsc19zd19zdGF0cyAqc3RhdHMpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYm54dF90bHNfc3dfc3RhdHMgKnJpbmdfc3RhdHM7XG4mIzQzO1x0aW50IGksIGo7XG4mIzQzO1xuJiM0MztcdGlmICghYnAtXHUwMDNla3Rsc19pbmZvIHx8ICFicC1cdTAwM2V0eF9yaW5nKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIGJwLVx1MDAzZXR4X25yX3JpbmdzOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0cmluZ19zdGF0cyA9IGJwLVx1MDAzZXR4X3JpbmdbaV0udGxzX3N0YXRzO1xuJiM0MztcdFx0aWYgKCFyaW5nX3N0YXRzKVxuJiM0MztcdFx0XHRjb250aW51ZTtcbiYjNDM7XHRcdGZvciAoaiA9IDA7IGogXHUwMDNjIEJOWFRfS1RMU19NQVhfREFUQV9DT1VOVEVSUzsgaiYjNDM7JiM0MzspXG4mIzQzO1x0XHRcdHN0YXRzLVx1MDAzZWNvdW50ZXJzW2pdICYjNDM7PSByaW5nX3N0YXRzLVx1MDAzZWNvdW50ZXJzW2pdO1xuJiM0MztcdH1cbiYjNDM7fVxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dF9rdGxzLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibnh0L2JueHRfa3Rscy5oXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMDAuLjNlYzU2YjhmMDhkNDliXG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibnh0L2JueHRfa3Rscy5oXG5AQCAtMCwwICYjNDM7MSwxNzQgQEBcbiYjNDM7LyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seSAqL1xuJiM0MzsvKiBDb3B5cmlnaHQgKGMpIDIwMjYgQnJvYWRjb20gSW5jLiAqL1xuJiM0MztcbiYjNDM7I2lmbmRlZiBCTlhUX0tUTFNfSFxuJiM0MzsjZGVmaW5lIEJOWFRfS1RMU19IXG4mIzQzO1xuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC93YWl0LmhcdTAwM2VcbiYjNDM7XG4mIzQzOy8qIENvbnRyb2wgcGxhbmUgY291bnRlcnMgKi9cbiYjNDM7ZW51bSBibnh0X2t0bHNfY3RybF9jb3VudGVycyB7XG4mIzQzO1x0Qk5YVF9LVExTX1RYX0FERCA9IDAsXG4mIzQzO1x0Qk5YVF9LVExTX1RYX0RFTCxcbiYjNDM7XG4mIzQzO1x0LyogRXJyb3IgY291bnRlcnMgZm9yIGRlYnVnZ2luZyAqL1xuJiM0MztcdEJOWFRfS1RMU19FUlJfTk9fTUVNLFx0XHRcdC8qIE1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUgKi9cbiYjNDM7XHRCTlhUX0tUTFNfRVJSX05PX0NBUCxcdFx0XHQvKiBDYXBhYmlsaXR5IGxvc3QgYWZ0ZXIgRlcgcmVzZXQgKi9cbiYjNDM7XHRCTlhUX0tUTFNfRVJSX0tFWV9DVFhfQUxMT0MsXHRcdC8qIEtleSBjb250ZXh0IGFsbG9jIGZhaWx1cmUgKi9cbiYjNDM7XHRCTlhUX0tUTFNfRVJSX0NSWVBUT19DTUQsXHRcdC8qIENyeXB0byBjb21tYW5kIGZhaWx1cmUgKi9cbiYjNDM7XHRCTlhUX0tUTFNfRVJSX0RFVklDRV9CVVNZLFx0XHQvKiBEZXZpY2Ugbm90IHJlYWR5ICovXG4mIzQzO1x0Qk5YVF9LVExTX0VSUl9JTlZBTElEX0NJUEhFUixcdFx0LyogVW5zdXBwb3J0ZWQgY2lwaGVyICovXG4mIzQzO1x0Qk5YVF9LVExTX0VSUl9TVEFURV9OT1RfT1BFTixcdFx0LyogRGV2aWNlIG5vdCBvcGVuICovXG4mIzQzO1x0Qk5YVF9LVExTX0VSUl9SRVRSWV9FWENFRURFRCxcdFx0LyogUmV0cnkgbGltaXQgZXhjZWVkZWQgKi9cbiYjNDM7XG4mIzQzO1x0Qk5YVF9LVExTX01BWF9DVFJMX0NPVU5URVJTLFxuJiM0Mzt9O1xuJiM0MztcbiYjNDM7c3RydWN0IGJueHRfdGxzX2luZm8ge1xuJiM0MztcdGF0b21pY190XHRcdHBlbmRpbmc7XG4mIzQzO1xuJiM0MztcdC8qIFdva2VuIGZyb20gX19ibnh0X29wZW5fbmljKCkvX19ibnh0X2Nsb3NlX25pYygpIHdoZW5cbiYjNDM7XHQgKiBCTlhUX1NUQVRFX09QRU4gY2hhbmdlcywgc28gYSBrVExTIGRlbGV0ZSBjYW4gd2FpdCBvdXQgYSByaW5nXG4mIzQzO1x0ICogcmVjb25maWd1cmF0aW9uIGluc3RlYWQgb2YgcG9sbGluZyB0aGUgc3RhdGUgYml0LlxuJiM0MztcdCAqL1xuJiM0MztcdHdhaXRfcXVldWVfaGVhZF90XHRvcGVuX3dxO1xuJiM0MztcbiYjNDM7XHQvKiBBdG9taWMgY291bnRlcnMgZm9yIGNvbnRyb2wgcGF0aCAqL1xuJiM0MztcdGF0b21pYzY0X3RcdFx0KmNvdW50ZXJzO1xuJiM0Mzt9O1xuJiM0MztcbiYjNDM7c3RydWN0IGJueHRfa3Rsc19vZmZsb2FkX2N0eF90eCB7XG4mIzQzO1x0dTMyXHRcdHRjcF9zZXFfbm87XHQvKiB0Y3Agc2VxIG5vIGluIHN5bmMgd2l0aCBIVyAqL1xuJiM0MztcdHUzMlx0XHRuZXh0X3RjcF9zZXFfbm87Lyogc3RhZ2VkIHRjcCBzZXEgbm8gKi9cbiYjNDM7XHR1MzJcdFx0a2lkO1xuJiM0MztcdHUzMlx0XHRwZW5kaW5nX2J5dGVzO1x0Lyogc3RhZ2VkIHBheWxvYWQgYnl0ZXMgKi9cbiYjNDM7XHRib29sXHRcdHBlbmRpbmdfZndkO1xuJiM0MztcdGJvb2xcdFx0cGVuZGluZ19vb287XG4mIzQzO307XG4mIzQzO1xuJiM0MztzdHJ1Y3QgYm54dF9rdGxzX3R4X2RyaXZlcl9zdGF0ZSB7XG4mIzQzO1x0c3RydWN0IGJueHRfa3Rsc19vZmZsb2FkX2N0eF90eCAqY3R4X3R4O1xuJiM0Mzt9O1xuJiM0MztcbiYjNDM7c3RydWN0IGNlX2FkZF9jbWQge1xuJiM0MztcdF9fbGUzMlx0dmVyX2FsZ29fa2lkX29wY29kZTtcbiYjNDM7XHQjZGVmaW5lIENFX0FERF9DTURfT1BDT0RFX01BU0tcdFx0XHQweGZVTFxuJiM0MztcdCNkZWZpbmUgQ0VfQUREX0NNRF9PUENPREVfU0ZUXHRcdFx0MFxuJiM0MztcdCNkZWZpbmUgQ0VfQUREX0NNRF9PUENPREVfQUREXHRcdFx0IDB4MVVMXG4mIzQzO1x0I2RlZmluZSBDRV9BRERfQ01EX0tJRF9NQVNLXHRcdFx0MHhmZmZmZjBVTFxuJiM0MztcdCNkZWZpbmUgQ0VfQUREX0NNRF9LSURfU0ZUXHRcdFx0NFxuJiM0MztcdCNkZWZpbmUgQ0VfQUREX0NNRF9BTEdPUklUSE1fTUFTS1x0XHQweGYwMDAwMDBVTFxuJiM0MztcdCNkZWZpbmUgQ0VfQUREX0NNRF9BTEdPUklUSE1fU0ZUXHRcdDI0XG4mIzQzO1x0I2RlZmluZSBDRV9BRERfQ01EX0FMR09SSVRITV9BRVNfR0NNXzEyOFx0IDB4MTAwMDAwMFVMXG4mIzQzO1x0I2RlZmluZSBDRV9BRERfQ01EX0FMR09SSVRITV9BRVNfR0NNXzI1Nlx0IDB4MjAwMDAwMFVMXG4mIzQzO1x0I2RlZmluZSBDRV9BRERfQ01EX1ZFUlNJT05fTUFTS1x0XHRcdDB4ZjAwMDAwMDBVTFxuJiM0MztcdCNkZWZpbmUgQ0VfQUREX0NNRF9WRVJTSU9OX1NGVFx0XHRcdDI4XG4mIzQzO1x0I2RlZmluZSBDRV9BRERfQ01EX1ZFUlNJT05fVExTMV8yXHRcdCAoMHgwVUwgXHUwMDNjXHUwMDNjIDI4KVxuJiM0MztcdCNkZWZpbmUgQ0VfQUREX0NNRF9WRVJTSU9OX1RMUzFfM1x0XHQgKDB4MVVMIFx1MDAzY1x1MDAzYyAyOClcbiYjNDM7XHR1OFx0Y3R4X2tpbmQ7XG4mIzQzO1x0I2RlZmluZSBDRV9BRERfQ01EX0NUWF9LSU5EX01BU0tcdFx0MHgxZlVMXG4mIzQzO1x0I2RlZmluZSBDRV9BRERfQ01EX0NUWF9LSU5EX1NGVFx0XHRcdDBcbiYjNDM7XHQjZGVmaW5lIENFX0FERF9DTURfQ1RYX0tJTkRfQ0tfVFhcdFx0IDB4MTFVTFxuJiM0MztcdCNkZWZpbmUgQ0VfQUREX0NNRF9DVFhfS0lORF9DS19SWFx0XHQgMHgxMlVMXG4mIzQzO1x0dThcdHVudXNlZDBbM107XG4mIzQzO1x0dThcdHNhbHRbNF07XG4mIzQzO1x0dThcdHVudXNlZDFbNF07XG4mIzQzO1x0X19sZTMyXHRwa3RfdGNwX3NlcV9udW07XG4mIzQzO1x0X19sZTMyXHR0bHNfaGVhZGVyX3RjcF9zZXFfbnVtO1xuJiM0MztcdHU4XHRyZWNvcmRfc2VxX251bVs4XTtcbiYjNDM7XHR1OFx0c2Vzc2lvbl9rZXlbMzJdO1xuJiM0MztcdHU4XHRhZGRsX2l2WzhdO1xuJiM0Mzt9O1xuJiM0MztcbiYjNDM7c3RydWN0IGNyeXB0b19wcmVmaXhfY21kIHtcbiYjNDM7XHRfX2xlMzJcdGZsYWdzO1xuJiM0MztcdCNkZWZpbmUgQ1JZUFRPX1BSRUZJWF9DTURfRkxBR1NfVVBEQVRFX0lOX09SREVSX1ZBUlx0MHgxVUxcbiYjNDM7XHQjZGVmaW5lIENSWVBUT19QUkVGSVhfQ01EX0ZMQUdTX0ZVTExfUkVQTEFZX1JFVFJBTlx0MHgyVUxcbiYjNDM7XHRfX2xlMzJcdGhlYWRlcl90Y3Bfc2VxX251bTtcbiYjNDM7XHRfX2xlMzJcdHN0YXJ0X3RjcF9zZXFfbnVtO1xuJiM0MztcdF9fbGUzMlx0ZW5kX3RjcF9zZXFfbnVtO1xuJiM0MztcdHU4XHRleHBsaWNpdF9ub25jZVs4XTtcbiYjNDM7XHR1OFx0cmVjb3JkX3NlcV9udW1bOF07XG4mIzQzO307XG4mIzQzO1xuJiM0MzsjZGVmaW5lIENSWVBUT19QUkVGSVhfQ01EX0ZMQUdTX1VQREFURV9JTl9PUkRFUl9WQVJfTEVcdFxcXG4mIzQzO1x0Y3B1X3RvX2xlMzIoQ1JZUFRPX1BSRUZJWF9DTURfRkxBR1NfVVBEQVRFX0lOX09SREVSX1ZBUilcbiYjNDM7XG4mIzQzOyNkZWZpbmUgQ1JZUFRPX1BSRUZJWF9DTURfU0laRVx0KCh1MzIpc2l6ZW9mKHN0cnVjdCBjcnlwdG9fcHJlZml4X2NtZCkpXG4mIzQzOyNkZWZpbmUgQ1JZUFRPX1BSRUZJWF9DTURfQkRTXHQoQ1JZUFRPX1BSRUZJWF9DTURfU0laRSAvIHNpemVvZihzdHJ1Y3QgdHhfYmQpKVxuJiM0MzsjZGVmaW5lIENSWVBUT19QUkVTWU5DX0JEU1x0KENSWVBUT19QUkVGSVhfQ01EX0JEUyAmIzQzOyAxKVxuJiM0MztcbiYjNDM7I2RlZmluZSBDUllQVE9fUFJFU1lOQ19CRF9DTURcdFx0XHRcdFx0XHRcXFxuJiM0MztcdChjcHVfdG9fbGUzMigoQ1JZUFRPX1BSRUZJWF9DTURfU0laRSBcdTAwM2NcdTAwM2MgVFhfQkRfTEVOX1NISUZUKSB8XHRcXFxuJiM0MztcdFx0ICAgICBUWF9CRF9DTlQoQ1JZUFRPX1BSRVNZTkNfQkRTKSB8IFRYX0JEX1RZUEVfUFJFU1lOQ19UWF9CRCkpXG4mIzQzO1xuJiM0MztzdGF0aWMgaW5saW5lIGJvb2wgYm54dF9rdGxzX2J1c3koc3RydWN0IGJueHQgKmJwKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIGJwLVx1MDAzZWt0bHNfaW5mbyBcdTAwMjZcdTAwMjYgYXRvbWljX3JlYWQoXHUwMDI2YnAtXHUwMDNla3Rsc19pbmZvLVx1MDAzZXBlbmRpbmcpIFx1MDAzZSAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKiBXYWtlIGFueSBrVExTIGNvbnRyb2wgb3Agd2FpdGluZyBmb3IgYSBCTlhUX1NUQVRFX09QRU4gdHJhbnNpdGlvbi4gKi9cbiYjNDM7c3RhdGljIGlubGluZSB2b2lkIGJueHRfa3Rsc193YWtlKHN0cnVjdCBibnh0ICpicClcbiYjNDM7e1xuJiM0MztcdGlmIChicC1cdTAwM2VrdGxzX2luZm8pXG4mIzQzO1x0XHR3YWtlX3VwX2FsbChcdTAwMjZicC1cdTAwM2VrdGxzX2luZm8tXHUwMDNlb3Blbl93cSk7XG4mIzQzO31cbiYjNDM7XG4mIzQzOyNpZmRlZiBDT05GSUdfQk5YVF9UTFNcbiYjNDM7aW50IGJueHRfYWxsb2Nfa3Rsc19pbmZvKHN0cnVjdCBibnh0ICpicCk7XG4mIzQzO3ZvaWQgYm54dF9mcmVlX2t0bHNfaW5mbyhzdHJ1Y3QgYm54dCAqYnApO1xuJiM0MztpbnQgYm54dF9rdGxzX2luaXQoc3RydWN0IGJueHQgKmJwKTtcbiYjNDM7c3RydWN0IHNrX2J1ZmYgKmJueHRfa3Rsc194bWl0KHN0cnVjdCBibnh0ICpicCwgc3RydWN0IGJueHRfdHhfcmluZ19pbmZvICp0eHIsXG4mIzQzO1x0XHRcdCAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBfX2xlMzIgKmxmbGFncywgdTMyICpraWQsXG4mIzQzO1x0XHRcdCAgICAgICBzdHJ1Y3QgYm54dF9rdGxzX29mZmxvYWRfY3R4X3R4ICoqa2N0eF90eF9wKTtcbiYjNDM7dm9pZCBibnh0X2t0bHNfeG1pdF9jb21taXQoc3RydWN0IGJueHRfdHhfcmluZ19pbmZvICp0eHIsXG4mIzQzO1x0XHRcdCAgIHN0cnVjdCBibnh0X2t0bHNfb2ZmbG9hZF9jdHhfdHggKmtjdHhfdHgpO1xuJiM0MztpbnQgYm54dF9rdGxzX2FsbG9jX3R4X3Jpbmdfc3RhdHMoc3RydWN0IGJueHQgKmJwLFxuJiM0MztcdFx0XHRcdCAgc3RydWN0IGJueHRfdHhfcmluZ19pbmZvICp0eHIpO1xuJiM0Mzt2b2lkIGJueHRfa3Rsc19mcmVlX3R4X3Jpbmdfc3RhdHMoc3RydWN0IGJueHRfdHhfcmluZ19pbmZvICp0eHIpO1xuJiM0Mzt2b2lkIGJueHRfZ2V0X3JpbmdfdGxzX3N0YXRzKHN0cnVjdCBibnh0ICpicCwgc3RydWN0IGJueHRfdGxzX3N3X3N0YXRzICpzdGF0cyk7XG4mIzQzOyNlbHNlXG4mIzQzO3N0YXRpYyBpbmxpbmUgaW50IGJueHRfYWxsb2Nfa3Rsc19pbmZvKHN0cnVjdCBibnh0ICpicClcbiYjNDM7e1xuJiM0MztcdHJldHVybiAtRU9QTk9UU1VQUDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGlubGluZSB2b2lkIGJueHRfZnJlZV9rdGxzX2luZm8oc3RydWN0IGJueHQgKmJwKVxuJiM0Mzt7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbmxpbmUgaW50IGJueHRfa3Rsc19pbml0KHN0cnVjdCBibnh0ICpicClcbiYjNDM7e1xuJiM0MztcdHJldHVybiAtRU9QTk9UU1VQUDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGlubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqXG4mIzQzO2JueHRfa3Rsc194bWl0KHN0cnVjdCBibnh0ICpicCwgc3RydWN0IGJueHRfdHhfcmluZ19pbmZvICp0eHIsXG4mIzQzO1x0ICAgICAgIHN0cnVjdCBza19idWZmICpza2IsIF9fbGUzMiAqbGZsYWdzLCB1MzIgKmtpZCxcbiYjNDM7XHQgICAgICAgc3RydWN0IGJueHRfa3Rsc19vZmZsb2FkX2N0eF90eCAqKmtjdHhfdHhfcClcbiYjNDM7e1xuJiM0MztcdHJldHVybiBza2I7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbmxpbmUgdm9pZFxuJiM0Mztibnh0X2t0bHNfeG1pdF9jb21taXQoc3RydWN0IGJueHRfdHhfcmluZ19pbmZvICp0eHIsXG4mIzQzO1x0XHQgICAgICBzdHJ1Y3QgYm54dF9rdGxzX29mZmxvYWRfY3R4X3R4ICprY3R4X3R4KVxuJiM0Mzt7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbmxpbmUgaW50IGJueHRfa3Rsc19hbGxvY190eF9yaW5nX3N0YXRzKHN0cnVjdCBibnh0ICpicCxcbiYjNDM7XHRcdFx0XHRcdFx0c3RydWN0IGJueHRfdHhfcmluZ19pbmZvICp0eHIpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGlubGluZSB2b2lkIGJueHRfa3Rsc19mcmVlX3R4X3Jpbmdfc3RhdHMoc3RydWN0IGJueHRfdHhfcmluZ19pbmZvICp0eHIpXG4mIzQzO3tcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGlubGluZSB2b2lkIGJueHRfZ2V0X3JpbmdfdGxzX3N0YXRzKHN0cnVjdCBibnh0ICpicCxcbiYjNDM7XHRcdFx0XHRcdCAgIHN0cnVjdCBibnh0X3Rsc19zd19zdGF0cyAqc3RhdHMpXG4mIzQzO3tcbiYjNDM7fVxuJiM0MzsjZW5kaWZcdC8qIENPTkZJR19CTlhUX1RMUyAqL1xuJiM0MzsjZW5kaWZcdC8qIEJOWFRfS1RMU19IICovXG5kaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9ibnh0X21wYy5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9ibnh0X21wYy5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMDAuLjcxZWJlYjZmZjMzYTE1XG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibnh0L2JueHRfbXBjLmNcbkBAIC0wLDAgJiM0MzsxLDc4MyBAQFxuJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XG4mIzQzOy8qIENvcHlyaWdodCAoYykgMjAyNiBCcm9hZGNvbSBJbmMuICovXG4mIzQzO1xuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9zdGRkZWYuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC90eXBlcy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2tlcm5lbC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L3NsYWIuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9ibnh0L2hzaS5oXHUwMDNlXG4mIzQzO1xuJiM0MzsjaW5jbHVkZSBcJiMzNDtibnh0LmhcJiMzNDtcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7Ym54dF9tcGMuaFwmIzM0O1xuJiM0MzsjaW5jbHVkZSBcJiMzNDtibnh0X2NyeXB0by5oXCYjMzQ7XG4mIzQzO1xuJiM0Mzt2b2lkIGJueHRfYWxsb2NfbXBjX2luZm8oc3RydWN0IGJueHQgKmJwLCB1OCBtcGNfY2hubHNfY2FwKVxuJiM0Mzt7XG4mIzQzO1x0aWYgKCEoYnAtXHUwMDNlZmxhZ3MgXHUwMDI2IEJOWFRfRkxBR19DSElQX1A1X1BMVVMpKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcbiYjNDM7XHRpZiAoIWJwLVx1MDAzZW1wY19pbmZvKVxuJiM0MztcdFx0YnAtXHUwMDNlbXBjX2luZm8gPSBremFsbG9jX29iaigqYnAtXHUwMDNlbXBjX2luZm8pO1xuJiM0MztcdGlmIChicC1cdTAwM2VtcGNfaW5mbylcbiYjNDM7XHRcdGJwLVx1MDAzZW1wY19pbmZvLVx1MDAzZW1wY19jaG5sc19jYXAgPSBtcGNfY2hubHNfY2FwO1xuJiM0MztcdGVsc2VcbiYjNDM7XHRcdG5ldGRldl93YXJuKGJwLVx1MDAzZWRldiwgXCYjMzQ7VW5hYmxlIHRvIGFsbG9jYXRlIE1QQyBpbmZvXFxuXCYjMzQ7KTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7dm9pZCBibnh0X2ZyZWVfbXBjX2luZm8oc3RydWN0IGJueHQgKmJwKVxuJiM0Mzt7XG4mIzQzO1x0Ym54dF9mcmVlX21wY19yaW5ncyhicCk7XG4mIzQzO1x0Ym54dF9mcmVlX21wY3MoYnApO1xuJiM0MztcdGtmcmVlKGJwLVx1MDAzZW1wY19pbmZvKTtcbiYjNDM7XHRicC1cdTAwM2VtcGNfaW5mbyA9IE5VTEw7XG4mIzQzO31cbiYjNDM7XG4mIzQzO2ludCBibnh0X21wY190eF9yaW5nc19pbl91c2Uoc3RydWN0IGJueHQgKmJwKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGJueHRfbXBjX2luZm8gKm1wYyA9IGJwLVx1MDAzZW1wY19pbmZvO1xuJiM0MztcdGludCBpLCBtcGNfdHggPSAwO1xuJiM0MztcbiYjNDM7XHRpZiAoIW1wYylcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIEJOWFRfTVBDX1RZUEVfTUFYOyBpJiM0MzsmIzQzOylcbiYjNDM7XHRcdG1wY190eCAmIzQzOz0gbXBjLVx1MDAzZW1wY19yaW5nX2NvdW50W2ldO1xuJiM0MztcdHJldHVybiBtcGNfdHg7XG4mIzQzO31cbiYjNDM7XG4mIzQzO2ludCBibnh0X21wY19jcF9yaW5nc19pbl91c2Uoc3RydWN0IGJueHQgKmJwKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGJueHRfbXBjX2luZm8gKm1wYyA9IGJwLVx1MDAzZW1wY19pbmZvO1xuJiM0MztcbiYjNDM7XHRpZiAoIW1wYylcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcdHJldHVybiBtcGMtXHUwMDNlbXBjX2NwX3JpbmdzO1xuJiM0Mzt9XG4mIzQzO1xuJiM0Mztib29sIGJueHRfbmFwaV9oYXNfbXBjKHN0cnVjdCBibnh0ICpicCwgaW50IGkpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYm54dF9tcGNfaW5mbyAqbXBjID0gYnAtXHUwMDNlbXBjX2luZm87XG4mIzQzO1x0c3RydWN0IGJueHRfbmFwaSAqYm5hcGkgPSBicC1cdTAwM2VibmFwaVtpXTtcbiYjNDM7XHRzdHJ1Y3QgYm54dF90eF9yaW5nX2luZm8gKnR4cjtcbiYjNDM7XG4mIzQzO1x0aWYgKCFtcGMpXG4mIzQzO1x0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1xuJiM0MztcdHR4ciA9IGJuYXBpLVx1MDAzZXR4X3JpbmdbMF07XG4mIzQzO1x0aWYgKHR4ciBcdTAwMjZcdTAwMjYgIShibmFwaS1cdTAwM2VmbGFncyBcdTAwMjYgQk5YVF9OQVBJX0ZMQUdfWERQKSlcbiYjNDM7XHRcdHJldHVybiB0eHItXHUwMDNldHhxX2luZGV4IFx1MDAzYyBtcGMtXHUwMDNlbXBjX2NwX3JpbmdzO1xuJiM0MztcdHJldHVybiBmYWxzZTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7dm9pZCBibnh0X3NldF9tcGNfY3BfcmluZyhzdHJ1Y3QgYm54dCAqYnAsIGludCBibmFwaV9pZHgsXG4mIzQzO1x0XHRcdCAgc3RydWN0IGJueHRfY3BfcmluZ19pbmZvICpjcHIpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYm54dF9tcGNfaW5mbyAqbXBjID0gYnAtXHUwMDNlbXBjX2luZm87XG4mIzQzO1x0c3RydWN0IGJueHRfbmFwaSAqYm5hcGk7XG4mIzQzO1x0Ym9vbCBmb3VuZCA9IGZhbHNlO1xuJiM0MztcdGludCBpLCBqO1xuJiM0MztcbiYjNDM7XHRpZiAoIW1wYylcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XHRibmFwaSA9IGJwLVx1MDAzZWJuYXBpW2JuYXBpX2lkeF07XG4mIzQzO1x0LyogQ2hlY2sgYm90aCBUQ0UgYW5kIFJDRSBNUENzIGZvciB0aGUgbWF0Y2hpbmcgTkFQSSAqL1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIEJOWFRfTVBDX1RZUEVfTUFYOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0aW50IG51bSA9IG1wYy1cdTAwM2VtcGNfcmluZ19jb3VudFtpXTtcbiYjNDM7XG4mIzQzO1x0XHRmb3IgKGogPSAwOyBqIFx1MDAzYyBudW07IGomIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRcdHN0cnVjdCBibnh0X3R4X3JpbmdfaW5mbyAqdHhyID0gXHUwMDI2bXBjLVx1MDAzZW1wY19yaW5nc1tpXVtqXTtcbiYjNDM7XG4mIzQzO1x0XHRcdC8qIE9ubHkgMSByaW5nIHdpdGggaW5kZXggaiB3aWxsIHVzZSB0aGlzIE5BUEkgKi9cbiYjNDM7XHRcdFx0aWYgKHR4ci1cdTAwM2VibmFwaSA9PSBibmFwaSkge1xuJiM0MztcdFx0XHRcdHR4ci1cdTAwM2V0eF9jcHIgPSBjcHI7XG4mIzQzO1x0XHRcdFx0dHhyLVx1MDAzZXR4X25hcGlfaWR4ID0gaTtcbiYjNDM7XHRcdFx0XHRibmFwaS1cdTAwM2V0eF9tcGNfcmluZ1tpXSA9IHR4cjtcbiYjNDM7XHRcdFx0XHRmb3VuZCA9IHRydWU7XG4mIzQzO1x0XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHRcdH1cbiYjNDM7XHRcdH1cbiYjNDM7XHR9XG4mIzQzO1x0aWYgKCFmb3VuZClcbiYjNDM7XHRcdG5ldGRldl93YXJuX29uY2UoYnAtXHUwMDNlZGV2LCBcJiMzNDtObyBNUEMgbWF0Y2ggZm9yIG5hcGkgaW5kZXggJWRcXG5cJiMzNDssXG4mIzQzO1x0XHRcdFx0IGJuYXBpX2lkeCk7XG4mIzQzO1x0Y3ByLVx1MDAzZWNwX3JpbmdfdHlwZSA9IEJOWFRfTlFfSERMX1RZUEVfTVA7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3ZvaWQgYm54dF90cmltX21wY19yaW5ncyhzdHJ1Y3QgYm54dCAqYnApXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYm54dF9tcGNfaW5mbyAqbXBjID0gYnAtXHUwMDNlbXBjX2luZm87XG4mIzQzO1x0aW50IG1heCA9IGJwLVx1MDAzZXR4X25yX3JpbmdzX3Blcl90YztcbiYjNDM7XHR1OCBtYXhfY3AgPSAwO1xuJiM0MztcdGludCBpO1xuJiM0MztcbiYjNDM7XHRpZiAoIW1wYylcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgQk5YVF9NUENfVFlQRV9NQVg7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRtcGMtXHUwMDNlbXBjX3JpbmdfY291bnRbaV0gPSBtaW5fdChpbnQsIG1wYy1cdTAwM2VtcGNfcmluZ19jb3VudFtpXSxcbiYjNDM7XHRcdFx0XHRcdCAgICAgICBtYXgpO1xuJiM0MztcdFx0bWF4X2NwID0gbWF4KG1heF9jcCwgbXBjLVx1MDAzZW1wY19yaW5nX2NvdW50W2ldKTtcbiYjNDM7XHR9XG4mIzQzO1x0bXBjLVx1MDAzZW1wY19jcF9yaW5ncyA9IG1heF9jcDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7dm9pZCBibnh0X2NhbGNfZGZsdF9tcGNfcmluZ3Moc3RydWN0IGJueHQgKmJwLCBpbnQgdHhfbnJfcmluZ3MsXG4mIzQzO1x0XHRcdCAgICAgIGludCB0eF9ucl9yaW5nc19wZXJfdGMsIGludCByeF9ucl9yaW5ncyxcbiYjNDM7XHRcdFx0ICAgICAgaW50ICptcGNfcGVyX3R5cGUsIGludCAqbXBjX2NwKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGJueHRfaHdfcmVzYyAqaHdfcmVzYyA9IFx1MDAyNmJwLVx1MDAzZWh3X3Jlc2M7XG4mIzQzO1x0aW50IG1wY190Y2UsIGF2YWlsO1xuJiM0MztcbiYjNDM7XHQqbXBjX3Blcl90eXBlID0gMDtcbiYjNDM7XHQqbXBjX2NwID0gMDtcbiYjNDM7XG4mIzQzO1x0aWYgKCFCTlhUX01QQ19DUllQVE9fQ0FQQUJMRShicCkpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1xuJiM0MztcdGF2YWlsID0gaHdfcmVzYy1cdTAwM2VtYXhfdHhfcmluZ3MgLSB0eF9ucl9yaW5ncztcbiYjNDM7XHQvKiBkb24mIzM5O3QgdXNlIG1vcmUgdGhhbiA4MCUgKi9cbiYjNDM7XHRhdmFpbCA9IGF2YWlsICogNCAvIDU7XG4mIzQzO1xuJiM0MztcdGlmIChhdmFpbCBcdTAwM2MgKEJOWFRfTUlOX01QQ19UQ0UgJiM0MzsgQk5YVF9NSU5fTVBDX1JDRSkpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1xuJiM0MztcdG1wY190Y2UgPSBtaW5fdChpbnQsIGF2YWlsIC8gMiwgdHhfbnJfcmluZ3NfcGVyX3RjKTtcbiYjNDM7XHRtcGNfdGNlID0gbWluX3QoaW50LCBtcGNfdGNlLCBCTlhUX0RGTFRfTVBDX1RDRSk7XG4mIzQzO1xuJiM0MztcdGF2YWlsID0gaHdfcmVzYy1cdTAwM2VtYXhfY3BfcmluZ3MgLSB0eF9ucl9yaW5ncyAtIHJ4X25yX3JpbmdzO1xuJiM0MztcbiYjNDM7XHRpZiAoYXZhaWwgXHUwMDNjIEJOWFRfTUlOX01QQ19UQ0UgfHwgYXZhaWwgXHUwMDNjIEJOWFRfTUlOX01QQ19SQ0UpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1xuJiM0MztcdG1wY190Y2UgPSBtaW4obXBjX3RjZSwgYXZhaWwpO1xuJiM0MztcbiYjNDM7XHQvKiBUQ0UgYW5kIFJDRSBhcmUgc2l6ZWQgZXF1YWxseSwgc28gdGhlIHBlci10eXBlIGNvdW50IGlzIGFsc28gdGhlXG4mIzQzO1x0ICogTVBDIENQIHJpbmcgY291bnQgKG1heChtcGNfdGNlLCBtcGNfcmNlKSkuXG4mIzQzO1x0ICovXG4mIzQzO1x0Km1wY19wZXJfdHlwZSA9IG1wY190Y2U7XG4mIzQzO1x0Km1wY19jcCA9IG1wY190Y2U7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3ZvaWQgYm54dF9zZXRfZGZsdF9tcGNfcmluZ3Moc3RydWN0IGJueHQgKmJwKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGJueHRfbXBjX2luZm8gKm1wYyA9IGJwLVx1MDAzZW1wY19pbmZvO1xuJiM0MztcdGludCBwZXJfdHlwZSwgbXBjX2NwLCBpO1xuJiM0MztcbiYjNDM7XHRpZiAoIUJOWFRfTVBDX0NSWVBUT19DQVBBQkxFKGJwKSlcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XG4mIzQzO1x0Ym54dF9jYWxjX2RmbHRfbXBjX3JpbmdzKGJwLCBicC1cdTAwM2V0eF9ucl9yaW5ncywgYnAtXHUwMDNldHhfbnJfcmluZ3NfcGVyX3RjLFxuJiM0MztcdFx0XHRcdCBicC1cdTAwM2VyeF9ucl9yaW5ncywgXHUwMDI2cGVyX3R5cGUsIFx1MDAyNm1wY19jcCk7XG4mIzQzO1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIEJOWFRfTVBDX1RZUEVfTUFYOyBpJiM0MzsmIzQzOylcbiYjNDM7XHRcdG1wYy1cdTAwM2VtcGNfcmluZ19jb3VudFtpXSA9IHBlcl90eXBlO1xuJiM0MztcdG1wYy1cdTAwM2VtcGNfY3BfcmluZ3MgPSBtcGNfY3A7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3ZvaWQgYm54dF9pbml0X21wY19yaW5nX3N0cnVjdChzdHJ1Y3QgYm54dCAqYnApXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYm54dF9tcGNfaW5mbyAqbXBjID0gYnAtXHUwMDNlbXBjX2luZm87XG4mIzQzO1x0aW50IGksIGo7XG4mIzQzO1xuJiM0MztcdGlmICghQk5YVF9NUENfQ1JZUFRPX0NBUEFCTEUoYnApKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBCTlhUX01QQ19UWVBFX01BWDsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGludCBudW0gPSBtcGMtXHUwMDNlbXBjX3JpbmdfY291bnRbaV07XG4mIzQzO1xuJiM0MztcdFx0aWYgKCFtcGMtXHUwMDNlbXBjX3JpbmdzW2ldKVxuJiM0MztcdFx0XHRjb250aW51ZTtcbiYjNDM7XHRcdGZvciAoaiA9IDA7IGogXHUwMDNjIG51bTsgaiYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdFx0c3RydWN0IGJueHRfcmluZ19tZW1faW5mbyAqcm1lbTtcbiYjNDM7XHRcdFx0c3RydWN0IGJueHRfcmluZ19zdHJ1Y3QgKnJpbmc7XG4mIzQzO1x0XHRcdHN0cnVjdCBibnh0X3R4X3JpbmdfaW5mbyAqdHhyO1xuJiM0MztcbiYjNDM7XHRcdFx0dHhyID0gXHUwMDI2bXBjLVx1MDAzZW1wY19yaW5nc1tpXVtqXTtcbiYjNDM7XG4mIzQzO1x0XHRcdHR4ci1cdTAwM2V0eF9yaW5nX3N0cnVjdC5yaW5nX21lbS5mbGFncyA9XG4mIzQzO1x0XHRcdFx0Qk5YVF9STUVNX1JJTkdfUFRFX0ZMQUc7XG4mIzQzO1x0XHRcdHR4ci1cdTAwM2VibmFwaSA9IGJwLVx1MDAzZXR4X3JpbmdbYnAtXHUwMDNldHhfcmluZ19tYXBbal1dLmJuYXBpO1xuJiM0MztcdFx0XHR0eHItXHUwMDNldHhxX2luZGV4ID0gajtcbiYjNDM7XG4mIzQzO1x0XHRcdHJpbmcgPSBcdTAwMjZ0eHItXHUwMDNldHhfcmluZ19zdHJ1Y3Q7XG4mIzQzO1x0XHRcdHJtZW0gPSBcdTAwMjZyaW5nLVx1MDAzZXJpbmdfbWVtO1xuJiM0MztcdFx0XHRybWVtLVx1MDAzZW5yX3BhZ2VzID0gYnAtXHUwMDNldHhfbnJfcGFnZXM7XG4mIzQzO1x0XHRcdHJtZW0tXHUwMDNlcGFnZV9zaXplID0gSFdfVFhCRF9SSU5HX1NJWkU7XG4mIzQzO1x0XHRcdHJtZW0tXHUwMDNlcGdfYXJyID0gKHZvaWQgKiopdHhyLVx1MDAzZXR4X2Rlc2NfcmluZztcbiYjNDM7XHRcdFx0cm1lbS1cdTAwM2VkbWFfYXJyID0gdHhyLVx1MDAzZXR4X2Rlc2NfbWFwcGluZztcbiYjNDM7XHRcdFx0cm1lbS1cdTAwM2V2bWVtX3NpemUgPSBTV19NUENfVFhCRF9SSU5HX1NJWkUgKlxuJiM0MztcdFx0XHRcdFx0ICBicC1cdTAwM2V0eF9ucl9wYWdlcztcbiYjNDM7XHRcdFx0cm1lbS1cdTAwM2V2bWVtID0gKHZvaWQgKiopXHUwMDI2dHhyLVx1MDAzZXR4X21wY19idWZfcmluZztcbiYjNDM7XHRcdH1cbiYjNDM7XHR9XG4mIzQzO31cbiYjNDM7XG4mIzQzO2ludCBibnh0X2FsbG9jX21wY3Moc3RydWN0IGJueHQgKmJwKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGJueHRfbXBjX2luZm8gKm1wYyA9IGJwLVx1MDAzZW1wY19pbmZvO1xuJiM0MztcdGludCBpLCByYyA9IDA7XG4mIzQzO1xuJiM0MztcdGlmICghQk5YVF9NUENfQ1JZUFRPX0NBUEFCTEUoYnApKVxuJiM0MztcdFx0cmV0dXJuIDA7XG4mIzQzO1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIEJOWFRfTVBDX1RZUEVfTUFYOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0aW50IG51bSA9IG1wYy1cdTAwM2VtcGNfcmluZ19jb3VudFtpXTtcbiYjNDM7XHRcdHN0cnVjdCBibnh0X3R4X3JpbmdfaW5mbyAqdHhyO1xuJiM0MztcbiYjNDM7XHRcdGlmICghbnVtKVxuJiM0MztcdFx0XHRjb250aW51ZTtcbiYjNDM7XHRcdHR4ciA9IGt6YWxsb2Nfb2JqcygqdHhyLCBudW0pO1xuJiM0MztcdFx0aWYgKCF0eHIpIHtcbiYjNDM7XHRcdFx0cmMgPSAtRU5PTUVNO1xuJiM0MztcdFx0XHRnb3RvIGFsbG9jX21wY3NfZXhpdDtcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdG1wYy1cdTAwM2VtcGNfcmluZ3NbaV0gPSB0eHI7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBicC1cdTAwM2VjcF9ucl9yaW5nczsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdHN0cnVjdCBibnh0X25hcGkgKmJuYXBpID0gYnAtXHUwMDNlYm5hcGlbaV07XG4mIzQzO1xuJiM0MztcdFx0aWYgKCFibnh0X25hcGlfaGFzX21wYyhicCwgaSkpXG4mIzQzO1x0XHRcdGNvbnRpbnVlO1xuJiM0MztcdFx0Ym5hcGktXHUwMDNldHhfbXBjX3JpbmcgPSBremFsbG9jX29ianMoKmJuYXBpLVx1MDAzZXR4X21wY19yaW5nLFxuJiM0MztcdFx0XHRcdFx0XHQgIEJOWFRfTVBDX1RZUEVfTUFYKTtcbiYjNDM7XHRcdGlmICghYm5hcGktXHUwMDNldHhfbXBjX3JpbmcpIHtcbiYjNDM7XHRcdFx0cmMgPSAtRU5PTUVNO1xuJiM0MztcdFx0XHRnb3RvIGFsbG9jX21wY3NfZXhpdDtcbiYjNDM7XHRcdH1cbiYjNDM7XHR9XG4mIzQzO2FsbG9jX21wY3NfZXhpdDpcbiYjNDM7XHRpZiAocmMpXG4mIzQzO1x0XHRibnh0X2ZyZWVfbXBjcyhicCk7XG4mIzQzO1x0cmV0dXJuIHJjO1xuJiM0Mzt9XG4mIzQzO1xuJiM0Mzt2b2lkIGJueHRfZnJlZV9tcGNzKHN0cnVjdCBibnh0ICpicClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBibnh0X21wY19pbmZvICptcGMgPSBicC1cdTAwM2VtcGNfaW5mbztcbiYjNDM7XHRpbnQgaTtcbiYjNDM7XG4mIzQzO1x0aWYgKCFtcGMpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIEJOWFRfTVBDX1RZUEVfTUFYOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0a2ZyZWUobXBjLVx1MDAzZW1wY19yaW5nc1tpXSk7XG4mIzQzO1x0XHRtcGMtXHUwMDNlbXBjX3JpbmdzW2ldID0gTlVMTDtcbiYjNDM7XHR9XG4mIzQzO1x0aWYgKCFicC1cdTAwM2VibmFwaSlcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBicC1cdTAwM2VjcF9ucl9yaW5nczsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdHN0cnVjdCBibnh0X25hcGkgKmJuYXBpID0gYnAtXHUwMDNlYm5hcGlbaV07XG4mIzQzO1xuJiM0MztcdFx0a2ZyZWUoYm5hcGktXHUwMDNldHhfbXBjX3JpbmcpO1xuJiM0MztcdFx0Ym5hcGktXHUwMDNldHhfbXBjX3JpbmcgPSBOVUxMO1xuJiM0MztcdH1cbiYjNDM7fVxuJiM0MztcbiYjNDM7aW50IGJueHRfYWxsb2NfbXBjX3JpbmdzKHN0cnVjdCBibnh0ICpicClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBibnh0X21wY19pbmZvICptcGMgPSBicC1cdTAwM2VtcGNfaW5mbztcbiYjNDM7XHRpbnQgaSwgaiwgcmMgPSAwO1xuJiM0MztcbiYjNDM7XHRpZiAoIW1wYylcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBCTlhUX01QQ19UWVBFX01BWDsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGludCBudW0gPSBtcGMtXHUwMDNlbXBjX3JpbmdfY291bnRbaV07XG4mIzQzO1xuJiM0MztcdFx0Zm9yIChqID0gMDsgaiBcdTAwM2MgbnVtOyBqJiM0MzsmIzQzOykge1xuJiM0MztcdFx0XHRzdHJ1Y3QgYm54dF90eF9yaW5nX2luZm8gKnR4ciA9IFx1MDAyNm1wYy1cdTAwM2VtcGNfcmluZ3NbaV1bal07XG4mIzQzO1x0XHRcdHN0cnVjdCBibnh0X3Jpbmdfc3RydWN0ICpyaW5nO1xuJiM0MztcbiYjNDM7XHRcdFx0cmluZyA9IFx1MDAyNnR4ci1cdTAwM2V0eF9yaW5nX3N0cnVjdDtcbiYjNDM7XHRcdFx0cmMgPSBibnh0X2FsbG9jX3JpbmcoYnAsIFx1MDAyNnJpbmctXHUwMDNlcmluZ19tZW0pO1xuJiM0MztcdFx0XHRpZiAocmMpXG4mIzQzO1x0XHRcdFx0Z290byBhbGxvY19tcGNfcmluZ3NfZXhpdDtcbiYjNDM7XHRcdFx0cmluZy1cdTAwM2VxdWV1ZV9pZCA9IEJOWFRfTVBDX1FVRVVFX0lEO1xuJiM0MztcdFx0XHRyaW5nLVx1MDAzZW1wY19jaG5sX3R5cGUgPSBpO1xuJiM0MztcdFx0XHQvKiBmb3Igc3RhdHMgY29udGV4dCAqL1xuJiM0MztcdFx0XHRyaW5nLVx1MDAzZWdycF9pZHggPSB0eHItXHUwMDNlYm5hcGktXHUwMDNlaW5kZXg7XG4mIzQzO1x0XHRcdHNwaW5fbG9ja19pbml0KFx1MDAyNnR4ci1cdTAwM2V0eF9sb2NrKTtcbiYjNDM7XHRcdH1cbiYjNDM7XHR9XG4mIzQzO2FsbG9jX21wY19yaW5nc19leGl0OlxuJiM0MztcdGlmIChyYylcbiYjNDM7XHRcdGJueHRfZnJlZV9tcGNfcmluZ3MoYnApO1xuJiM0MztcdHJldHVybiByYztcbiYjNDM7fVxuJiM0MztcbiYjNDM7dm9pZCBibnh0X2ZyZWVfbXBjX3JpbmdzKHN0cnVjdCBibnh0ICpicClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBibnh0X21wY19pbmZvICptcGMgPSBicC1cdTAwM2VtcGNfaW5mbztcbiYjNDM7XHRpbnQgaSwgajtcbiYjNDM7XG4mIzQzO1x0aWYgKCFtcGMpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIEJOWFRfTVBDX1RZUEVfTUFYOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0aW50IG51bSA9IG1wYy1cdTAwM2VtcGNfcmluZ19jb3VudFtpXTtcbiYjNDM7XG4mIzQzO1x0XHRpZiAoIW1wYy1cdTAwM2VtcGNfcmluZ3NbaV0pXG4mIzQzO1x0XHRcdGNvbnRpbnVlO1xuJiM0MztcdFx0Zm9yIChqID0gMDsgaiBcdTAwM2MgbnVtOyBqJiM0MzsmIzQzOykge1xuJiM0MztcdFx0XHRzdHJ1Y3QgYm54dF90eF9yaW5nX2luZm8gKnR4ciA9IFx1MDAyNm1wYy1cdTAwM2VtcGNfcmluZ3NbaV1bal07XG4mIzQzO1x0XHRcdHN0cnVjdCBibnh0X3Jpbmdfc3RydWN0ICpyaW5nID0gXHUwMDI2dHhyLVx1MDAzZXR4X3Jpbmdfc3RydWN0O1xuJiM0MztcbiYjNDM7XHRcdFx0Ym54dF9mcmVlX3JpbmcoYnAsIFx1MDAyNnJpbmctXHUwMDNlcmluZ19tZW0pO1xuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7fVxuJiM0MztcbiYjNDM7dm9pZCBibnh0X2luaXRfbXBjX3JpbmdzKHN0cnVjdCBibnh0ICpicClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBibnh0X21wY19pbmZvICptcGMgPSBicC1cdTAwM2VtcGNfaW5mbztcbiYjNDM7XHRpbnQgaSwgajtcbiYjNDM7XG4mIzQzO1x0aWYgKCFtcGMpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIEJOWFRfTVBDX1RZUEVfTUFYOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0aW50IG51bSA9IG1wYy1cdTAwM2VtcGNfcmluZ19jb3VudFtpXTtcbiYjNDM7XG4mIzQzO1x0XHRmb3IgKGogPSAwOyBqIFx1MDAzYyBudW07IGomIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRcdHN0cnVjdCBibnh0X3R4X3JpbmdfaW5mbyAqdHhyID0gXHUwMDI2bXBjLVx1MDAzZW1wY19yaW5nc1tpXVtqXTtcbiYjNDM7XHRcdFx0c3RydWN0IGJueHRfcmluZ19zdHJ1Y3QgKnJpbmcgPSBcdTAwMjZ0eHItXHUwMDNldHhfcmluZ19zdHJ1Y3Q7XG4mIzQzO1xuJiM0MztcdFx0XHR0eHItXHUwMDNldHhfcHJvZCA9IDA7XG4mIzQzO1x0XHRcdHR4ci1cdTAwM2V0eF9jb25zID0gMDtcbiYjNDM7XHRcdFx0dHhyLVx1MDAzZXR4X2h3X2NvbnMgPSAwO1xuJiM0MztcdFx0XHRXUklURV9PTkNFKHR4ci1cdTAwM2VkZXZfc3RhdGUsIDApO1xuJiM0MztcdFx0XHRyaW5nLVx1MDAzZWZ3X3JpbmdfaWQgPSBJTlZBTElEX0hXX1JJTkdfSUQ7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IGJueHRfaHdybV9vbmVfbXBjX3JpbmdfYWxsb2Moc3RydWN0IGJueHQgKmJwLFxuJiM0MztcdFx0XHRcdFx0c3RydWN0IGJueHRfdHhfcmluZ19pbmZvICp0eHIpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYm54dF9jcF9yaW5nX2luZm8gKmNwciA9IHR4ci1cdTAwM2V0eF9jcHI7XG4mIzQzO1x0c3RydWN0IGJueHRfcmluZ19zdHJ1Y3QgKnJpbmc7XG4mIzQzO1x0aW50IHJjO1xuJiM0MztcbiYjNDM7XHRyaW5nID0gXHUwMDI2Y3ByLVx1MDAzZWNwX3Jpbmdfc3RydWN0O1xuJiM0MztcdGlmIChyaW5nLVx1MDAzZWZ3X3JpbmdfaWQgPT0gSU5WQUxJRF9IV19SSU5HX0lEKSB7XG4mIzQzO1x0XHRyYyA9IGJueHRfaHdybV9jcF9yaW5nX2FsbG9jX3A1KGJwLCBjcHIpO1xuJiM0MztcdFx0aWYgKHJjKVxuJiM0MztcdFx0XHRyZXR1cm4gcmM7XG4mIzQzO1x0fVxuJiM0MztcdC8qIHR4X2lkeCBub3QgdXNlZCBvbiBQNV9QTFVTLCBzbyBzZXQgaXQgdG8gMCAqL1xuJiM0MztcdHJldHVybiBibnh0X2h3cm1fdHhfcmluZ19hbGxvYyhicCwgdHhyLCAwKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7aW50IGJueHRfaHdybV9tcGNfcmluZ19hbGxvYyhzdHJ1Y3QgYm54dCAqYnApXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYm54dF9tcGNfaW5mbyAqbXBjID0gYnAtXHUwMDNlbXBjX2luZm87XG4mIzQzO1x0aW50IGksIGosIHJjID0gMDtcbiYjNDM7XG4mIzQzO1x0aWYgKCFtcGMpXG4mIzQzO1x0XHRyZXR1cm4gMDtcbiYjNDM7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgQk5YVF9NUENfVFlQRV9NQVg7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRpbnQgbnVtID0gbXBjLVx1MDAzZW1wY19yaW5nX2NvdW50W2ldO1xuJiM0MztcbiYjNDM7XHRcdGZvciAoaiA9IDA7IGogXHUwMDNjIG51bTsgaiYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdFx0c3RydWN0IGJueHRfdHhfcmluZ19pbmZvICp0eHIgPSBcdTAwMjZtcGMtXHUwMDNlbXBjX3JpbmdzW2ldW2pdO1xuJiM0MztcbiYjNDM7XHRcdFx0cmMgPSBibnh0X2h3cm1fb25lX21wY19yaW5nX2FsbG9jKGJwLCB0eHIpO1xuJiM0MztcdFx0XHRpZiAocmMpXG4mIzQzO1x0XHRcdFx0Z290byBtcGNfcmluZ19hbGxvY19leGl0O1xuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7bXBjX3JpbmdfYWxsb2NfZXhpdDpcbiYjNDM7XHRpZiAocmMpXG4mIzQzO1x0XHRibnh0X2h3cm1fbXBjX3JpbmdfZnJlZShicCwgZmFsc2UpO1xuJiM0MztcdHJldHVybiByYztcbiYjNDM7fVxuJiM0MztcbiYjNDM7dm9pZCBibnh0X2h3cm1fbXBjX3JpbmdfZnJlZShzdHJ1Y3QgYm54dCAqYnAsIGJvb2wgY2xvc2VfcGF0aClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBibnh0X21wY19pbmZvICptcGMgPSBicC1cdTAwM2VtcGNfaW5mbztcbiYjNDM7XHRzdHJ1Y3QgYm54dF9jcF9yaW5nX2luZm8gKmNwcjtcbiYjNDM7XHRpbnQgaSwgajtcbiYjNDM7XG4mIzQzO1x0aWYgKCFtcGMpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIEJOWFRfTVBDX1RZUEVfTUFYOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0Zm9yIChqID0gMDsgaiBcdTAwM2MgbXBjLVx1MDAzZW1wY19yaW5nX2NvdW50W2ldOyBqJiM0MzsmIzQzOylcbiYjNDM7XHRcdFx0Ym54dF9od3JtX3R4X3JpbmdfZnJlZShicCwgXHUwMDI2bXBjLVx1MDAzZW1wY19yaW5nc1tpXVtqXSxcbiYjNDM7XHRcdFx0XHRcdCAgICAgICBjbG9zZV9wYXRoKTtcbiYjNDM7XHR9XG4mIzQzO1x0LyogQ1AgcmluZ3MgbXVzdCBiZSBmcmVlZCBhdCB0aGUgZW5kIHRvIGd1YXJhbnRlZSB0aGF0IHRoZSBIV1JNX0RPTkVcbiYjNDM7XHQgKiByZXNwb25zZXMgZm9yIEhXUk1fUklOR19GUkVFIGNhbiBzdGlsbCBiZSBzZWVuIG9uIHRoZSBDUCByaW5ncy5cbiYjNDM7XHQgKi9cbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBCTlhUX01QQ19UWVBFX01BWDsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGZvciAoaiA9IDA7IGogXHUwMDNjIG1wYy1cdTAwM2VtcGNfcmluZ19jb3VudFtpXTsgaiYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdFx0Y3ByID0gbXBjLVx1MDAzZW1wY19yaW5nc1tpXVtqXS50eF9jcHI7XG4mIzQzO1x0XHRcdGlmIChjcHIgXHUwMDI2XHUwMDI2IGNwci1cdTAwM2VjcF9yaW5nX3N0cnVjdC5md19yaW5nX2lkICE9XG4mIzQzO1x0XHRcdCAgICBJTlZBTElEX0hXX1JJTkdfSUQpXG4mIzQzO1x0XHRcdFx0Ym54dF9od3JtX2NwX3JpbmdfZnJlZShicCwgY3ByKTtcbiYjNDM7XHRcdH1cbiYjNDM7XHR9XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0cnVjdCBibnh0X3R4X3JpbmdfaW5mbyAqYm54dF9zZWxlY3RfbXBjX3Jpbmcoc3RydWN0IGJueHQgKmJwLCBpbnQgcmluZ190eXBlKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGJueHRfbXBjX2luZm8gKm1wYyA9IGJwLVx1MDAzZW1wY19pbmZvO1xuJiM0MztcdGludCBuO1xuJiM0MztcbiYjNDM7XHRpZiAoIW1wYyB8fCByaW5nX3R5cGUgXHUwMDNlPSBCTlhUX01QQ19UWVBFX01BWCB8fFxuJiM0MztcdCAgICAhbXBjLVx1MDAzZW1wY19yaW5nX2NvdW50W3JpbmdfdHlwZV0pXG4mIzQzO1x0XHRyZXR1cm4gTlVMTDtcbiYjNDM7XG4mIzQzO1x0biA9IHJhd19zbXBfcHJvY2Vzc29yX2lkKCkgJSBtcGMtXHUwMDNlbXBjX3JpbmdfY291bnRbcmluZ190eXBlXTtcbiYjNDM7XHRyZXR1cm4gXHUwMDI2bXBjLVx1MDAzZW1wY19yaW5nc1tyaW5nX3R5cGVdW25dO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogYm54dF9zdGFydF94bWl0X21wYyAtIFRyYW5zbWl0IG1lc3NhZ2Ugb24gYW4gTVBDIHJpbmdcbiYjNDM7ICogQGJwOiBwb2ludGVyIHRvIGJueHQgZGV2aWNlXG4mIzQzOyAqIEB0eHI6IE1QQyBUWCByaW5nIHN0cnVjdHVyZSBwb2ludGVyXG4mIzQzOyAqIEBkYXRhOiBNUEMgbWVzc2FnZSBwb2ludGVyXG4mIzQzOyAqIEBsZW46IE1QQyBtZXNzYWdlIGxlbmd0aFxuJiM0MzsgKiBAaGFuZGxlOiBOb24temVybyBoYW5kbGUgcGFzc2VkIGJhY2sgZm9yIHRoZSBjb21wbGV0aW9uXG4mIzQzOyAqXG4mIzQzOyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHRyYW5zbWl0IGFuIE1QQyBtZXNzYWdlIG9uIGFuIE1QQyBUWCByaW5nLlxuJiM0MzsgKiBUaGUgY2FsbGVyIG11c3QgaG9sZCB0eHItXHUwMDNldHhfbG9jay4gIFdoZW4gc3VjY2Vzc2Z1bCwgdGhlIEhXIHdpbGwgcmV0dXJuXG4mIzQzOyAqIGEgY29tcGxldGlvbiBhbmQgYm54dF9jcnlwdG9fbXBjX2NtcCgpIHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIGhhbmRsZVxuJiM0MzsgKiBwYXNzZWQgYmFjay5cbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJuOiB6ZXJvIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIGVycm9yIGNvZGUgb3RoZXJ3aXNlOlxuJiM0MzsgKlx0RU5PREVWOiBNUEMgVFggcmluZyBpcyBzaHV0dGluZyBkb3duLlxuJiM0MzsgKlx0RUJVU1k6IE1QQyBUWCByaW5nIGlzIGZ1bGxcbiYjNDM7ICovXG4mIzQzO2ludCBibnh0X3N0YXJ0X3htaXRfbXBjKHN0cnVjdCBibnh0ICpicCwgc3RydWN0IGJueHRfdHhfcmluZ19pbmZvICp0eHIsXG4mIzQzO1x0XHRcdHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBsZW4sIHVuc2lnbmVkIGxvbmcgaGFuZGxlKVxuJiM0Mzt7XG4mIzQzO1x0dTMyIGJkcywgdG90YWxfYmRzLCBiZF9zcGFjZSwgZnJlZV9zaXplO1xuJiM0MztcdHN0cnVjdCBibnh0X3N3X21wY190eF9iZCAqdHhfYnVmO1xuJiM0MztcdHN0cnVjdCB0eF9iZCAqdHhiZDtcbiYjNDM7XHR1MTYgcHJvZDtcbiYjNDM7XG4mIzQzO1x0aWYgKFJFQURfT05DRSh0eHItXHUwMDNlZGV2X3N0YXRlKSA9PSBCTlhUX0RFVl9TVEFURV9DTE9TSU5HKVxuJiM0MztcdFx0cmV0dXJuIC1FTk9ERVY7XG4mIzQzO1xuJiM0MztcdGJkcyA9IERJVl9ST1VORF9VUChsZW4sIHNpemVvZigqdHhiZCkpO1xuJiM0MztcdHRvdGFsX2JkcyA9IGJkcyAmIzQzOyAxO1xuJiM0MztcdGZyZWVfc2l6ZSA9IGJueHRfdHhfYXZhaWwoYnAsIHR4cik7XG4mIzQzO1x0aWYgKGZyZWVfc2l6ZSBcdTAwM2MgdG90YWxfYmRzKVxuJiM0MztcdFx0cmV0dXJuIC1FQlVTWTtcbiYjNDM7XG4mIzQzO1x0cHJvZCA9IHR4ci1cdTAwM2V0eF9wcm9kO1xuJiM0MztcdHR4YmQgPSBcdTAwMjZ0eHItXHUwMDNldHhfZGVzY19yaW5nW1RYX1JJTkcoYnAsIHByb2QpXVtUWF9JRFgocHJvZCldO1xuJiM0MztcdHR4X2J1ZiA9IFx1MDAyNnR4ci1cdTAwM2V0eF9tcGNfYnVmX3JpbmdbUklOR19UWChicCwgcHJvZCldO1xuJiM0MztcdHR4X2J1Zi1cdTAwM2VoYW5kbGUgPSBoYW5kbGU7XG4mIzQzO1x0dHhfYnVmLVx1MDAzZWlubGluZV9iZHMgPSB0b3RhbF9iZHM7XG4mIzQzO1xuJiM0MztcdHR4YmQtXHUwMDNldHhfYmRfbGVuX2ZsYWdzX3R5cGUgPVxuJiM0MztcdFx0Y3B1X3RvX2xlMzIoKGxlbiBcdTAwM2NcdTAwM2MgVFhfQkRfTEVOX1NISUZUKSB8IFRYX0JEX1RZUEVfTVBDX1RYX0JEIHxcbiYjNDM7XHRcdFx0ICAgIFRYX0JEX0NOVCh0b3RhbF9iZHMpKTtcbiYjNDM7XHR0eGJkLVx1MDAzZXR4X2JkX29wYXF1ZSA9IFNFVF9UWF9PUEFRVUUoYnAsIHR4ciwgcHJvZCwgdG90YWxfYmRzKTtcbiYjNDM7XG4mIzQzO1x0cHJvZCA9IE5FWFRfVFgocHJvZCk7XG4mIzQzO1x0dHhiZCA9IFx1MDAyNnR4ci1cdTAwM2V0eF9kZXNjX3JpbmdbVFhfUklORyhicCwgcHJvZCldW1RYX0lEWChwcm9kKV07XG4mIzQzO1x0YmRfc3BhY2UgPSBUWF9ERVNDX0NOVCAtIFRYX0lEWChwcm9kKTtcbiYjNDM7XHRpZiAoYmRfc3BhY2UgXHUwMDNjIGJkcykge1xuJiM0MztcdFx0dW5zaWduZWQgaW50IGxlbjAgPSBiZF9zcGFjZSAqIHNpemVvZigqdHhiZCk7XG4mIzQzO1xuJiM0MztcdFx0bWVtY3B5KHR4YmQsIGRhdGEsIGxlbjApO1xuJiM0MztcdFx0cHJvZCAmIzQzOz0gYmRfc3BhY2U7XG4mIzQzO1x0XHR0eGJkID0gXHUwMDI2dHhyLVx1MDAzZXR4X2Rlc2NfcmluZ1tUWF9SSU5HKGJwLCBwcm9kKV1bVFhfSURYKHByb2QpXTtcbiYjNDM7XHRcdGJkcyAtPSBiZF9zcGFjZTtcbiYjNDM7XHRcdGxlbiAtPSBsZW4wO1xuJiM0MztcdFx0ZGF0YSAmIzQzOz0gbGVuMDtcbiYjNDM7XHR9XG4mIzQzO1x0bWVtY3B5KHR4YmQsIGRhdGEsIGxlbik7XG4mIzQzO1x0cHJvZCAmIzQzOz0gYmRzO1xuJiM0MztcdFdSSVRFX09OQ0UodHhyLVx1MDAzZXR4X3Byb2QsIHByb2QpO1xuJiM0MztcbiYjNDM7XHQvKiBTeW5jIEJEIGRhdGEgYmVmb3JlIHVwZGF0aW5nIGRvb3JiZWxsICovXG4mIzQzO1x0d21iKCk7XG4mIzQzO1x0Ym54dF9kYl93cml0ZShicCwgXHUwMDI2dHhyLVx1MDAzZXR4X2RiLCBwcm9kKTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qIFJldHVybnMgdHJ1ZSBpZiB0aGUgcmluZyBpcyBzdWNjZXNzZnVsbHkgbWFya2VkIGFzIGNsb3NpbmcuICBJdFxuJiM0MzsgKiBtZWFucyB0aGF0IHRoZXJlIHdpbGwgYmUgbm8gbW9yZSBNUEMgdHJhbnNtaXNzaW9ucyBhbmQgTkFQSSB3aWxsIG5vd1xuJiM0MzsgKiBjb21wbGV0ZSBhbnkgTVBDIGNvbXBsZXRpb25zIG9uIHRoZSBjb21wbGV0aW9uIHJpbmcgd2l0aCBOVUxMIGhhbmRsZXNcbiYjNDM7ICogdG8gc2lnbmFsIGFib3J0LlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGJvb2wgYm54dF9kaXNhYmxlX21wY19yaW5nKHN0cnVjdCBibnh0X21wY19pbmZvICptcGMsIGludCBtcGNfcmluZylcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBibnh0X3R4X3JpbmdfaW5mbyAqdHhyO1xuJiM0MztcdGJvb2wgZGlzYWJsZWQgPSBmYWxzZTtcbiYjNDM7XHRpbnQgaTtcbiYjNDM7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgQk5YVF9NUENfVFlQRV9NQVg7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRpZiAobXBjX3JpbmcgXHUwMDNlPSBtcGMtXHUwMDNlbXBjX3JpbmdfY291bnRbaV0pXG4mIzQzO1x0XHRcdGNvbnRpbnVlO1xuJiM0MztcdFx0dHhyID0gXHUwMDI2bXBjLVx1MDAzZW1wY19yaW5nc1tpXVttcGNfcmluZ107XG4mIzQzO1x0XHRzcGluX2xvY2tfYmgoXHUwMDI2dHhyLVx1MDAzZXR4X2xvY2spO1xuJiM0MztcdFx0aWYgKCFSRUFEX09OQ0UodHhyLVx1MDAzZWRldl9zdGF0ZSkpIHtcbiYjNDM7XHRcdFx0ZGlzYWJsZWQgPSB0cnVlO1xuJiM0MztcdFx0XHRXUklURV9PTkNFKHR4ci1cdTAwM2VkZXZfc3RhdGUsIEJOWFRfREVWX1NUQVRFX0NMT1NJTkcpO1xuJiM0MztcdFx0fVxuJiM0MztcdFx0c3Bpbl91bmxvY2tfYmgoXHUwMDI2dHhyLVx1MDAzZXR4X2xvY2spO1xuJiM0MztcdFx0aWYgKCFkaXNhYmxlZClcbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1x0fVxuJiM0MztcdC8qIE1ha2Ugc3VyZSBuYXBpIHBvbGxzIHNlZSBAZGV2X3N0YXRlIGNoYW5nZSAqL1xuJiM0MztcdGlmIChkaXNhYmxlZClcbiYjNDM7XHRcdHN5bmNocm9uaXplX25ldCgpO1xuJiM0MztcdHJldHVybiBkaXNhYmxlZDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgYm54dF9lbmFibGVfbXBjX3Jpbmcoc3RydWN0IGJueHRfbXBjX2luZm8gKm1wYywgaW50IG1wY19yaW5nKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGJueHRfdHhfcmluZ19pbmZvICp0eHI7XG4mIzQzO1x0aW50IGk7XG4mIzQzO1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIEJOWFRfTVBDX1RZUEVfTUFYOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0aWYgKG1wY19yaW5nIFx1MDAzZT0gbXBjLVx1MDAzZW1wY19yaW5nX2NvdW50W2ldKVxuJiM0MztcdFx0XHRjb250aW51ZTtcbiYjNDM7XHRcdHR4ciA9IFx1MDAyNm1wYy1cdTAwM2VtcGNfcmluZ3NbaV1bbXBjX3JpbmddO1xuJiM0MztcdFx0V1JJVEVfT05DRSh0eHItXHUwMDNlZGV2X3N0YXRlLCAwKTtcbiYjNDM7XHR9XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIGJueHRfY2xlYXJfb25lX21wY19lbnRyaWVzKHN0cnVjdCBibnh0ICpicCxcbiYjNDM7XHRcdFx0XHQgICAgICAgc3RydWN0IGJueHRfdHhfcmluZ19pbmZvICp0eHIpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYm54dF9zd19tcGNfdHhfYmQgKnR4X2J1ZjtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIGhhbmRsZTtcbiYjNDM7XHRpbnQgaSwgbWF4X2lkeDtcbiYjNDM7XHR1MzIgY2xpZW50O1xuJiM0MztcbiYjNDM7XHRtYXhfaWR4ID0gYnAtXHUwMDNldHhfbnJfcGFnZXMgKiBUWF9ERVNDX0NOVDtcbiYjNDM7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgbWF4X2lkeDsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdHR4X2J1ZiA9IFx1MDAyNnR4ci1cdTAwM2V0eF9tcGNfYnVmX3JpbmdbaV07XG4mIzQzO1x0XHRoYW5kbGUgPSB0eF9idWYtXHUwMDNlaGFuZGxlO1xuJiM0MztcdFx0aWYgKGhhbmRsZSkge1xuJiM0MztcdFx0XHRjbGllbnQgPSB0eHItXHUwMDNldHhfcmluZ19zdHJ1Y3QubXBjX2NobmxfdHlwZTtcbiYjNDM7XHRcdFx0Ym54dF9jcnlwdG9fbXBjX2NtcChicCwgY2xpZW50LCBoYW5kbGUsIE5VTEwsIDApO1xuJiM0MztcdFx0XHR0eF9idWYtXHUwMDNlaGFuZGxlID0gMDtcbiYjNDM7XHRcdH1cbiYjNDM7XHR9XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIGJueHRfbXBjX3Jpbmdfc3RvcChzdHJ1Y3QgYm54dCAqYnAsIHN0cnVjdCBibnh0X21wY19pbmZvICptcGMsXG4mIzQzO1x0XHRcdCAgICAgICBpbnQgbXBjX3JpbmcpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYm54dF90eF9yaW5nX2luZm8gKnR4cjtcbiYjNDM7XHRzdHJ1Y3QgYm54dF9jcF9yaW5nX2luZm8gKmNwcjtcbiYjNDM7XHRpbnQgaTtcbiYjNDM7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgQk5YVF9NUENfVFlQRV9NQVg7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRpZiAobXBjLVx1MDAzZW1wY19yaW5nX2NvdW50W2ldIFx1MDAzZSBtcGNfcmluZykge1xuJiM0MztcdFx0XHR0eHIgPSBcdTAwMjZtcGMtXHUwMDNlbXBjX3JpbmdzW2ldW21wY19yaW5nXTtcbiYjNDM7XHRcdFx0Ym54dF9od3JtX3R4X3JpbmdfZnJlZShicCwgdHhyLCB0cnVlKTtcbiYjNDM7XHRcdH1cbiYjNDM7XHR9XG4mIzQzO1x0LyogQ1AgcmluZyBtdXN0IGJlIGZyZWVkIGF0IHRoZSBlbmQgdG8gZ3VhcmFudGVlIHRoYXQgdGhlIEhXUk1fRE9ORVxuJiM0MztcdCAqIHJlc3BvbnNlcyBmb3IgSFdSTV9SSU5HX0ZSRUUgY2FuIHN0aWxsIGJlIHNlZW4gb24gdGhlIENQIHJpbmcuXG4mIzQzO1x0ICovXG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgQk5YVF9NUENfVFlQRV9NQVg7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRpZiAobXBjLVx1MDAzZW1wY19yaW5nX2NvdW50W2ldIFx1MDAzZSBtcGNfcmluZykge1xuJiM0MztcdFx0XHR0eHIgPSBcdTAwMjZtcGMtXHUwMDNlbXBjX3JpbmdzW2ldW21wY19yaW5nXTtcbiYjNDM7XHRcdFx0Y3ByID0gdHhyLVx1MDAzZXR4X2NwcjtcbiYjNDM7XHRcdFx0aWYgKGNwcilcbiYjNDM7XHRcdFx0XHRibnh0X2h3cm1fY3BfcmluZ19mcmVlKGJwLCBjcHIpO1xuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XHQvKiBObyBuZXcgRE1BIHRvIHRoZSBDUCByaW5nIGF0IHRoaXMgcG9pbnQsIGJ1dCB3ZSBuZWVkIHRvIHdhaXRcbiYjNDM7XHQgKiBmb3IgYW55IGluLWZsaWdodCBOQVBJIHBvbGwgdG8gZmluaXNoIGJlZm9yZSB3ZSB6ZXJvIHRoZVxuJiM0MztcdCAqIGNvbXBsZXRpb24gZW50cmllcyBpbiB0aGUgQ1AgcmluZy5cbiYjNDM7XHQgKi9cbiYjNDM7XHRzeW5jaHJvbml6ZV9uZXQoKTtcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBCTlhUX01QQ19UWVBFX01BWDsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGlmIChtcGMtXHUwMDNlbXBjX3JpbmdfY291bnRbaV0gXHUwMDNlIG1wY19yaW5nKSB7XG4mIzQzO1x0XHRcdHR4ciA9IFx1MDAyNm1wYy1cdTAwM2VtcGNfcmluZ3NbaV1bbXBjX3JpbmddO1xuJiM0MztcdFx0XHRjcHIgPSB0eHItXHUwMDNldHhfY3ByO1xuJiM0MztcdFx0XHRpZiAoY3ByKVxuJiM0MztcdFx0XHRcdGJueHRfY2xlYXJfb25lX2NwX3JpbmcoYnAsIGNwcik7XG4mIzQzO1x0XHRcdGJueHRfY2xlYXJfb25lX21wY19lbnRyaWVzKGJwLCB0eHIpO1xuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBibnh0X21wY19yaW5nX3N0YXJ0KHN0cnVjdCBibnh0ICpicCwgc3RydWN0IGJueHRfbXBjX2luZm8gKm1wYyxcbiYjNDM7XHRcdFx0ICAgICAgIGludCBtcGNfcmluZylcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBibnh0X3R4X3JpbmdfaW5mbyAqdHhyO1xuJiM0MztcdGludCBpLCByYztcbiYjNDM7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgQk5YVF9NUENfVFlQRV9NQVg7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRpZiAobXBjLVx1MDAzZW1wY19yaW5nX2NvdW50W2ldIFx1MDAzZSBtcGNfcmluZykge1xuJiM0MztcdFx0XHR0eHIgPSBcdTAwMjZtcGMtXHUwMDNlbXBjX3JpbmdzW2ldW21wY19yaW5nXTtcbiYjNDM7XHRcdFx0dHhyLVx1MDAzZXR4X3Byb2QgPSAwO1xuJiM0MztcdFx0XHR0eHItXHUwMDNldHhfY29ucyA9IDA7XG4mIzQzO1x0XHRcdHR4ci1cdTAwM2V0eF9od19jb25zID0gMDtcbiYjNDM7XHRcdFx0cmMgPSBibnh0X2h3cm1fb25lX21wY19yaW5nX2FsbG9jKGJwLCB0eHIpO1xuJiM0MztcdFx0XHRpZiAocmMpXG4mIzQzO1x0XHRcdFx0cmV0dXJuIHJjO1xuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyogQ2FsbGVkIGZyb20gYm54dF9zcF90YXNrKCkgd2l0aCBuZXRkZXZfbG9jayBoZWxkLiAgSWYgdGhlIGRldmljZSBpcyBub3RcbiYjNDM7ICogb3BlbiB0aGVyZSBpcyBub3RoaW5nIHRvIGRvOiB0aGUgb3BlbiBwYXRoIHdpbGwgcmUtYWxsb2NhdGUgYW5kXG4mIzQzOyAqIHJlLWluaXRpYWxpemUgYWxsIE1QQyByaW5ncy5cbiYjNDM7ICovXG4mIzQzO3ZvaWQgYm54dF9tcGNfcmluZ19yZXNldF90YXNrKHN0cnVjdCBibnh0ICpicClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBibnh0X21wY19pbmZvICptcGMgPSBicC1cdTAwM2VtcGNfaW5mbztcbiYjNDM7XHRzdHJ1Y3QgYm54dF90eF9yaW5nX2luZm8gKnR4cjtcbiYjNDM7XHRpbnQgaSwgajtcbiYjNDM7XG4mIzQzO1x0aWYgKCFtcGMgfHwgIXRlc3RfYml0KEJOWFRfU1RBVEVfT1BFTiwgXHUwMDI2YnAtXHUwMDNlc3RhdGUpKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBCTlhUX01QQ19UWVBFX01BWDsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGZvciAoaiA9IDA7IGogXHUwMDNjIG1wYy1cdTAwM2VtcGNfcmluZ19jb3VudFtpXTsgaiYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdFx0dHhyID0gXHUwMDI2bXBjLVx1MDAzZW1wY19yaW5nc1tpXVtqXTtcbiYjNDM7XHRcdFx0aWYgKFJFQURfT05DRSh0eHItXHUwMDNlZGV2X3N0YXRlKSAhPSBCTlhUX0RFVl9TVEFURV9DTE9TSU5HKVxuJiM0MztcdFx0XHRcdGNvbnRpbnVlO1xuJiM0MztcbiYjNDM7XHRcdFx0LyogUmVzZXRzIHRoZSB3aG9sZSByaW5nIChib3RoIHR5cGVzKSAqL1xuJiM0MztcdFx0XHRuZXRkZXZfd2FybihicC1cdTAwM2VkZXYsIFwmIzM0O1Jlc2V0dGluZyBNUEMgcmluZyAlZFxcblwmIzM0Oywgaik7XG4mIzQzO1x0XHRcdGJueHRfbXBjX3Jpbmdfc3RvcChicCwgbXBjLCBqKTtcbiYjNDM7XHRcdFx0aWYgKGJueHRfbXBjX3Jpbmdfc3RhcnQoYnAsIG1wYywgaikpIHtcbiYjNDM7XHRcdFx0XHRuZXRkZXZfZXJyKGJwLVx1MDAzZWRldiwgXCYjMzQ7RXJyb3Igc3RhcnRpbmcgTVBDIHJpbmcgJWQsIHJlc2V0dGluZyBkZXZpY2VcXG5cJiMzNDssXG4mIzQzO1x0XHRcdFx0XHQgICBqKTtcbiYjNDM7XHRcdFx0XHRibnh0X21wY19yaW5nX3N0b3AoYnAsIG1wYywgaik7XG4mIzQzO1x0XHRcdFx0Ym54dF9yZXNldF90YXNrKGJwLCB0cnVlKTtcbiYjNDM7XHRcdFx0XHQvKiBibnh0X3Jlc2V0X3Rhc2soKSB3aWxsIGNsZWFyIGV2ZXJ5dGhpbmcgKi9cbiYjNDM7XHRcdFx0XHRyZXR1cm47XG4mIzQzO1x0XHRcdH1cbiYjNDM7XHRcdFx0Ym54dF9lbmFibGVfbXBjX3JpbmcobXBjLCBqKTtcbiYjNDM7XHRcdH1cbiYjNDM7XHR9XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgYm54dF9tcGNfcmluZ19yZXNldChzdHJ1Y3QgYm54dCAqYnAsIGludCBtcGNfcmluZylcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBibnh0X21wY19pbmZvICptcGMgPSBicC1cdTAwM2VtcGNfaW5mbztcbiYjNDM7XHRzdHJ1Y3QgYm54dF90eF9yaW5nX2luZm8gKnR4cjtcbiYjNDM7XHRpbnQgaTtcbiYjNDM7XG4mIzQzO1x0aWYgKCFtcGMpXG4mIzQzO1x0XHRyZXR1cm4gMDtcbiYjNDM7XHRpZiAobXBjX3JpbmcgXHUwMDNlPSBtcGMtXHUwMDNlbXBjX2NwX3JpbmdzKVxuJiM0MztcdFx0cmV0dXJuIC1FSU5WQUw7XG4mIzQzO1xuJiM0MztcdGlmICghYm54dF9kaXNhYmxlX21wY19yaW5nKG1wYywgbXBjX3JpbmcpKVxuJiM0MztcdFx0cmV0dXJuIDA7XG4mIzQzO1xuJiM0MztcdC8qIENvbXBsZXRpb24gaGFuZGxlcyB3aWxsIG5vIGxvbmdlciBiZSBwcm9jZXNzZWQgYXQgdGhpcyBwb2ludFxuJiM0MztcdCAqIGZyb20gTkFQSSwgc28gd2UgY2FuIGNvbXBsZXRlIHRoZSBvdXRzdGFuZGluZyBjb21tYW5kcyBhbmRcbiYjNDM7XHQgKiByZWxlYXNlIHRoZSBjb21tYW5kIGNvbnRleHRzLlxuJiM0MztcdCAqL1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIEJOWFRfTVBDX1RZUEVfTUFYOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0aWYgKG1wYy1cdTAwM2VtcGNfcmluZ19jb3VudFtpXSBcdTAwM2UgbXBjX3JpbmcpIHtcbiYjNDM7XHRcdFx0dHhyID0gXHUwMDI2bXBjLVx1MDAzZW1wY19yaW5nc1tpXVttcGNfcmluZ107XG4mIzQzO1x0XHRcdGJueHRfY2xlYXJfb25lX21wY19lbnRyaWVzKGJwLCB0eHIpO1xuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0LyogSWYgdGhlIGRldmljZSBpcyBnb2luZyBkb3duLCB0aGUgcmVvcGVuIHdpbGwgcmUtYWxsb2NhdGUgYW5kXG4mIzQzO1x0ICogcmUtaW5pdGlhbGl6ZSBhbGwgTVBDIHJpbmdzLiAgT3RoZXJ3aXNlIGRlZmVyIHRoZSByZXNldCB0b1xuJiM0MztcdCAqIGJueHRfc3BfdGFzaygpIHRvIHNhZmVseSBob2xkIHRoZSBuZXRkZXZfbG9jay5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAodGVzdF9iaXQoQk5YVF9TVEFURV9PUEVOLCBcdTAwMjZicC1cdTAwM2VzdGF0ZSkpXG4mIzQzO1x0XHRibnh0X3F1ZXVlX3NwX3dvcmsoYnAsIEJOWFRfTVBDX1JFU0VUX1NQX0VWRU5UKTtcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7aW50IGJueHRfbXBjX3RpbWVvdXQoc3RydWN0IGJueHQgKmJwLCBzdHJ1Y3QgYm54dF90eF9yaW5nX2luZm8gKnR4cilcbiYjNDM7e1xuJiM0MztcdGlmICh0eHItXHUwMDNldHhfcmluZ19zdHJ1Y3QucXVldWVfaWQgPT0gQk5YVF9NUENfUVVFVUVfSUQpXG4mIzQzO1x0XHRyZXR1cm4gYm54dF9tcGNfcmluZ19yZXNldChicCwgdHhyLVx1MDAzZXR4cV9pbmRleCk7XG4mIzQzO1x0cmV0dXJuIC1FSU5WQUw7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBib29sIGJueHRfbXBjX3Vuc29saWNpdChzdHJ1Y3QgbXBjX2NtcCAqbXBjbXApXG4mIzQzO3tcbiYjNDM7XHR1MzIgY2xpZW50ID0gTVBDX0NNUF9DTElFTlRfVFlQRShtcGNtcCk7XG4mIzQzO1xuJiM0MztcdGlmIChjbGllbnQgIT0gTVBDX0NNUF9DTElFTlRfVENFIFx1MDAyNlx1MDAyNiBjbGllbnQgIT0gTVBDX0NNUF9DTElFTlRfUkNFKVxuJiM0MztcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcdHJldHVybiBNUENfQ01QX1VOU09MSUNJVF9TVUJUWVBFKG1wY21wKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7aW50IGJueHRfbXBjX2NtcChzdHJ1Y3QgYm54dCAqYnAsIHN0cnVjdCBibnh0X2NwX3JpbmdfaW5mbyAqY3ByLCB1MzIgKnJhd19jb25zKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGJueHRfY21wbF9lbnRyeSBjbXBsX2VudHJ5X2FyclsyXTtcbiYjNDM7XHRzdHJ1Y3QgYm54dF9uYXBpICpibmFwaSA9IGNwci1cdTAwM2VibmFwaTtcbiYjNDM7XHR1MTYgY29ucyA9IFJJTkdfQ01QKCpyYXdfY29ucyk7XG4mIzQzO1x0c3RydWN0IG1wY19jbXAgKm1wY21wLCAqbXBjbXAxO1xuJiM0MztcdHUzMiB0bXBfcmF3X2NvbnMgPSAqcmF3X2NvbnM7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBoYW5kbGUgPSAwO1xuJiM0MztcdHUzMiBjbGllbnQsIGNtcGxfbnVtO1xuJiM0MztcdHU4IHR5cGU7XG4mIzQzO1xuJiM0MztcdG1wY21wID0gKHN0cnVjdCBtcGNfY21wICopXG4mIzQzO1x0XHRcdTAwMjZjcHItXHUwMDNlY3BfZGVzY19yaW5nW0NQX1JJTkcoY29ucyldW0NQX0lEWChjb25zKV07XG4mIzQzO1x0dHlwZSA9IE1QQ19DTVBfQ01QX1RZUEUobXBjbXApO1xuJiM0MztcdGNtcGxfZW50cnlfYXJyWzBdLmNtcGwgPSBtcGNtcDtcbiYjNDM7XHRjbXBsX2VudHJ5X2FyclswXS5sZW4gPSBzaXplb2YoKm1wY21wKTtcbiYjNDM7XHRjbXBsX251bSA9IDE7XG4mIzQzO1x0aWYgKHR5cGUgPT0gTVBDX0NNUF9UWVBFX01JRF9QQVRIX0xPTkcpIHtcbiYjNDM7XHRcdHRtcF9yYXdfY29ucyA9IE5FWFRfUkFXX0NNUCh0bXBfcmF3X2NvbnMpO1xuJiM0MztcdFx0Y29ucyA9IFJJTkdfQ01QKHRtcF9yYXdfY29ucyk7XG4mIzQzO1x0XHRtcGNtcDEgPSAoc3RydWN0IG1wY19jbXAgKilcbiYjNDM7XHRcdFx0IFx1MDAyNmNwci1cdTAwM2VjcF9kZXNjX3JpbmdbQ1BfUklORyhjb25zKV1bQ1BfSURYKGNvbnMpXTtcbiYjNDM7XG4mIzQzO1x0XHRpZiAoIU1QQ19DTVBfVkFMSUQoYnAsIG1wY21wMSwgdG1wX3Jhd19jb25zKSlcbiYjNDM7XHRcdFx0cmV0dXJuIC1FQlVTWTtcbiYjNDM7XHRcdC8qIFRoZSB2YWxpZCB0ZXN0IG9mIHRoZSBlbnRyeSBtdXN0IGJlIGRvbmUgZmlyc3QgYmVmb3JlXG4mIzQzO1x0XHQgKiByZWFkaW5nIGFueSBmdXJ0aGVyLlxuJiM0MztcdFx0ICovXG4mIzQzO1x0XHRkbWFfcm1iKCk7XG4mIzQzO1x0XHRpZiAobXBjbXAxID09IG1wY21wICYjNDM7IDEpIHtcbiYjNDM7XHRcdFx0Y21wbF9lbnRyeV9hcnJbY21wbF9udW0gLSAxXS5sZW4gJiM0Mzs9IHNpemVvZigqbXBjbXAxKTtcbiYjNDM7XHRcdH0gZWxzZSB7XG4mIzQzO1x0XHRcdGNtcGxfZW50cnlfYXJyW2NtcGxfbnVtXS5jbXBsID0gbXBjbXAxO1xuJiM0MztcdFx0XHRjbXBsX2VudHJ5X2FycltjbXBsX251bV0ubGVuID0gc2l6ZW9mKCptcGNtcDEpO1xuJiM0MztcdFx0XHRjbXBsX251bSYjNDM7JiM0Mzs7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MztcdGNsaWVudCA9IE1QQ19DTVBfQ0xJRU5UX1RZUEUobXBjbXApIFx1MDAzZVx1MDAzZSBNUENfQ01QX0NMSUVOVF9TRlQ7XG4mIzQzO1x0aWYgKGNsaWVudCBcdTAwM2U9IEJOWFRfTVBDX1RZUEVfTUFYKVxuJiM0MztcdFx0Z290byBjbXBfZG9uZTtcbiYjNDM7XG4mIzQzO1x0aWYgKCFibnh0X21wY191bnNvbGljaXQobXBjbXApKSB7XG4mIzQzO1x0XHRzdHJ1Y3QgYm54dF9zd19tcGNfdHhfYmQgKm1wY19idWY7XG4mIzQzO1x0XHRzdHJ1Y3QgYm54dF90eF9yaW5nX2luZm8gKnR4cjtcbiYjNDM7XHRcdHUxNiB0eF9jb25zO1xuJiM0MztcdFx0dTMyIG9wYXF1ZTtcbiYjNDM7XG4mIzQzO1x0XHRvcGFxdWUgPSBtcGNtcC1cdTAwM2VtcGNfY21wX29wYXF1ZTtcbiYjNDM7XHRcdHR4ciA9IGJuYXBpLVx1MDAzZXR4X21wY19yaW5nW2NsaWVudF07XG4mIzQzO1x0XHR0eF9jb25zID0gdHhyLVx1MDAzZXR4X2NvbnM7XG4mIzQzO1x0XHRpZiAoVFhfT1BBUVVFX1JJTkcob3BhcXVlKSAhPSB0eHItXHUwMDNldHhfbmFwaV9pZHgpIHtcbiYjNDM7XHRcdFx0bmV0ZGV2X3dhcm4oYnAtXHUwMDNlZGV2LCBcJiMzNDtXcm9uZyBvcGFxdWUgJXgsIGV4cGVjdGVkIHJpbmcgJXgsIGNvbnMgaWR4ICV4XFxuXCYjMzQ7LFxuJiM0MztcdFx0XHRcdCAgICBvcGFxdWUsIHR4ci1cdTAwM2V0eF9uYXBpX2lkeCwgdHhyLVx1MDAzZXR4X2NvbnMpO1xuJiM0MztcdFx0XHRnb3RvIGNtcF9kb25lO1xuJiM0MztcdFx0fVxuJiM0MztcdFx0bXBjX2J1ZiA9IFx1MDAyNnR4ci1cdTAwM2V0eF9tcGNfYnVmX3JpbmdbUklOR19UWChicCwgdHhfY29ucyldO1xuJiM0MztcdFx0aWYgKCFSRUFEX09OQ0UodHhyLVx1MDAzZWRldl9zdGF0ZSkpIHtcbiYjNDM7XHRcdFx0aGFuZGxlID0gbXBjX2J1Zi1cdTAwM2VoYW5kbGU7XG4mIzQzO1x0XHRcdG1wY19idWYtXHUwMDNlaGFuZGxlID0gMDtcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdHR4X2NvbnMgJiM0Mzs9IG1wY19idWYtXHUwMDNlaW5saW5lX2JkcztcbiYjNDM7XHRcdFdSSVRFX09OQ0UodHhyLVx1MDAzZXR4X2NvbnMsIHR4X2NvbnMpO1xuJiM0MztcdFx0dHhyLVx1MDAzZXR4X2h3X2NvbnMgPSBSSU5HX1RYKGJwLCB0eF9jb25zKTtcbiYjNDM7XHR9XG4mIzQzO1x0Ym54dF9jcnlwdG9fbXBjX2NtcChicCwgY2xpZW50LCBoYW5kbGUsIGNtcGxfZW50cnlfYXJyLCBjbXBsX251bSk7XG4mIzQzO1xuJiM0MztjbXBfZG9uZTpcbiYjNDM7XHQqcmF3X2NvbnMgPSB0bXBfcmF3X2NvbnM7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibnh0L2JueHRfbXBjLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibnh0L2JueHRfbXBjLmhcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwMC4uYjBiMWU3ODNjZGM3N2Zcbi0tLSAvZGV2L251bGxcbiYjNDM7JiM0MzsmIzQzOyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dF9tcGMuaFxuQEAgLTAsMCAmIzQzOzEsMjI3IEBAXG4mIzQzOy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHkgKi9cbiYjNDM7LyogQ29weXJpZ2h0IChjKSAyMDI2IEJyb2FkY29tIEluYy4gKi9cbiYjNDM7XG4mIzQzOyNpZm5kZWYgQk5YVF9NUENfSFxuJiM0MzsjZGVmaW5lIEJOWFRfTVBDX0hcbiYjNDM7XG4mIzQzOy8qIE1pZCBwYXRoIGNoYW5uZWwgKE1QQykgZGVmaW5pdGlvbnMuICBBbiBNUEMgaXMgc3BlY2lhbCBUWC9jb21wbGV0aW9uXG4mIzQzOyAqIHJpbmcgcGFpciB0byBzZW5kL3JlY2VpdmUgY29udHJvbCBwbGFuZSBkYXRhIHRvIHRoZSBUQ0UgYW5kIFJDRVxuJiM0MzsgKiAoVHJhbnNtaXQvUmVjZWl2ZSBDcnlwdG8gRW5naW5lKSBIVyBibG9ja3MuXG4mIzQzOyAqL1xuJiM0MztcbiYjNDM7ZW51bSBibnh0X21wY190eXBlIHtcbiYjNDM7XHRCTlhUX01QQ19UQ0VfVFlQRSA9IFJJTkdfQUxMT0NfUkVRX01QQ19DSE5MU19UWVBFX1RDRSxcbiYjNDM7XHRCTlhUX01QQ19SQ0VfVFlQRSA9IFJJTkdfQUxMT0NfUkVRX01QQ19DSE5MU19UWVBFX1JDRSxcbiYjNDM7XHRCTlhUX01QQ19UWVBFX01BWCxcbiYjNDM7fTtcbiYjNDM7XG4mIzQzOyNkZWZpbmUgQk5YVF9NQVhfTVBDXHRcdDhcbiYjNDM7XG4mIzQzOyNkZWZpbmUgQk5YVF9NSU5fTVBDX1RDRVx0MVxuJiM0MzsjZGVmaW5lIEJOWFRfTUlOX01QQ19SQ0VcdDFcbiYjNDM7I2RlZmluZSBCTlhUX0RGTFRfTVBDX1RDRVx0Qk5YVF9NQVhfTVBDXG4mIzQzOyNkZWZpbmUgQk5YVF9ERkxUX01QQ19SQ0VcdEJOWFRfTUFYX01QQ1xuJiM0MztcbiYjNDM7I2RlZmluZSBCTlhUX01QQ19UTU9fTVNFQ1MgICAgICAxMDAwXG4mIzQzO1xuJiM0MztzdHJ1Y3QgYm54dF9tcGNfaW5mbyB7XG4mIzQzO1x0dThcdFx0XHRtcGNfY2hubHNfY2FwO1xuJiM0MztcdHU4XHRcdFx0bXBjX2NwX3JpbmdzO1xuJiM0MztcdHU4XHRcdFx0bXBjX3JpbmdfY291bnRbQk5YVF9NUENfVFlQRV9NQVhdO1xuJiM0MztcdHN0cnVjdCBibnh0X3R4X3JpbmdfaW5mbyAqbXBjX3JpbmdzW0JOWFRfTVBDX1RZUEVfTUFYXTtcbiYjNDM7fTtcbiYjNDM7XG4mIzQzO3N0cnVjdCBibnh0X3N3X21wY190eF9iZCB7XG4mIzQzO1x0dTggaW5saW5lX2JkcztcbiYjNDM7XHR1bnNpZ25lZCBsb25nIGhhbmRsZTtcbiYjNDM7fTtcbiYjNDM7XG4mIzQzOyNkZWZpbmUgU1dfTVBDX1RYQkRfUklOR19TSVpFIChzaXplb2Yoc3RydWN0IGJueHRfc3dfbXBjX3R4X2JkKSAqIFRYX0RFU0NfQ05UKVxuJiM0MztcbiYjNDM7c3RydWN0IGJueHRfY21wbF9lbnRyeSB7XG4mIzQzO1x0dm9pZCAqY21wbDtcbiYjNDM7XHR1MzIgbGVuO1xuJiM0Mzt9O1xuJiM0MztcbiYjNDM7c3RydWN0IG1wY19jbXAge1xuJiM0MztcdF9fbGUzMiBtcGNfY21wX2NsaWVudF9zdWJ0eXBlX3R5cGU7XG4mIzQzO1x0I2RlZmluZSBNUENfQ01QX1RZUEVcdFx0XHRcdFx0KDB4M2YgXHUwMDNjXHUwMDNjIDApXG4mIzQzO1x0ICNkZWZpbmUgTVBDX0NNUF9UWVBFX01JRF9QQVRIX1NIT1JUXHRcdFx0IDB4MWVcbiYjNDM7XHQgI2RlZmluZSBNUENfQ01QX1RZUEVfTUlEX1BBVEhfTE9OR1x0XHRcdCAweDFmXG4mIzQzO1x0I2RlZmluZSBNUENfQ01QX1NVQlRZUEVcdFx0XHRcdFx0MHhmMDBcbiYjNDM7XHQjZGVmaW5lIE1QQ19DTVBfU1VCVFlQRV9TRlRcdFx0XHRcdCA4XG4mIzQzO1x0ICNkZWZpbmUgTVBDX0NNUF9TVUJUWVBFX1NPTElDSVRFRFx0XHRcdCAoMHgwIFx1MDAzY1x1MDAzYyA4KVxuJiM0MztcdCAjZGVmaW5lIE1QQ19DTVBfU1VCVFlQRV9FUlJcdFx0XHRcdCAoMHgxIFx1MDAzY1x1MDAzYyA4KVxuJiM0MztcdCAjZGVmaW5lIE1QQ19DTVBfU1VCVFlQRV9SRVNZTkNcdFx0XHRcdCAoMHgyIFx1MDAzY1x1MDAzYyA4KVxuJiM0MztcdCNkZWZpbmUgTVBDX0NNUF9DTElFTlRcdFx0XHRcdFx0KDB4ZiBcdTAwM2NcdTAwM2MgMTIpXG4mIzQzO1x0ICNkZWZpbmUgTVBDX0NNUF9DTElFTlRfU0ZUXHRcdFx0XHQgMTJcbiYjNDM7XHQgI2RlZmluZSBNUENfQ01QX0NMSUVOVF9UQ0VcdFx0XHRcdCAoMHgwIFx1MDAzY1x1MDAzYyAxMilcbiYjNDM7XHQgI2RlZmluZSBNUENfQ01QX0NMSUVOVF9SQ0VcdFx0XHRcdCAoMHgxIFx1MDAzY1x1MDAzYyAxMilcbiYjNDM7XHQgI2RlZmluZSBNUENfQ01QX0NMSUVOVF9URV9DRkFcdFx0XHRcdCAoMHgyIFx1MDAzY1x1MDAzYyAxMilcbiYjNDM7XHQgI2RlZmluZSBNUENfQ01QX0NMSUVOVF9SRV9DRkFcdFx0XHRcdCAoMHgzIFx1MDAzY1x1MDAzYyAxMilcbiYjNDM7XHR1MzIgbXBjX2NtcF9vcGFxdWU7XG4mIzQzO1x0X19sZTMyIG1wY19jbXBfdjtcbiYjNDM7XHQjZGVmaW5lIE1QQ19DTVBfVlx0XHRcdFx0XHQoMSBcdTAwM2NcdTAwM2MgMClcbiYjNDM7XHRfX2xlMzIgbXBjX2NtcF9maWxsZXI7XG4mIzQzO307XG4mIzQzO1xuJiM0MzsjZGVmaW5lIE1QQ19DTVBfQ01QX1RZUEUobXBjbXApXHRcdFx0XHRcdFx0XFxcbiYjNDM7XHQobGUzMl90b19jcHUoKG1wY21wKS1cdTAwM2VtcGNfY21wX2NsaWVudF9zdWJ0eXBlX3R5cGUpIFx1MDAyNiBNUENfQ01QX1RZUEUpXG4mIzQzO1xuJiM0MzsjZGVmaW5lIE1QQ19DTVBfQ0xJRU5UX1RZUEUobXBjbXApXHRcdFx0XHRcdFxcXG4mIzQzO1x0KGxlMzJfdG9fY3B1KChtcGNtcCktXHUwMDNlbXBjX2NtcF9jbGllbnRfc3VidHlwZV90eXBlKSBcdTAwMjYgTVBDX0NNUF9DTElFTlQpXG4mIzQzO1xuJiM0MzsjZGVmaW5lIE1QQ19DTVBfVU5TT0xJQ0lUX1NVQlRZUEUobXBjbXApXHRcdFx0XHRcXFxuJiM0MztcdCgobGUzMl90b19jcHUoKG1wY21wKS1cdTAwM2VtcGNfY21wX2NsaWVudF9zdWJ0eXBlX3R5cGUpIFx1MDAyNlx0XHRcXFxuJiM0MztcdCBNUENfQ01QX1NVQlRZUEUpICE9IE1QQ19DTVBfU1VCVFlQRV9TT0xJQ0lURUQpXG4mIzQzO1xuJiM0MzsjZGVmaW5lIE1QQ19DTVBfVkFMSUQoYnAsIG1wY21wLCByYXdfY29ucylcdFx0XHRcdFxcXG4mIzQzO1x0KCEhKChtcGNtcCktXHUwMDNlbXBjX2NtcF92IFx1MDAyNiBjcHVfdG9fbGUzMihNUENfQ01QX1YpKSA9PVx0XHRcXFxuJiM0MztcdCAhKChyYXdfY29ucykgXHUwMDI2IChicCktXHUwMDNlY3BfYml0KSlcbiYjNDM7XG4mIzQzOyNkZWZpbmUgQk5YVF9NUENfQ1JZUFRPX0NBUCAgICBcXFxuJiM0MztcdChGVU5DX1FDQVBTX1JFU1BfTVBDX0NITkxTX0NBUF9UQ0UgfCBGVU5DX1FDQVBTX1JFU1BfTVBDX0NITkxTX0NBUF9SQ0UpXG4mIzQzO1xuJiM0MzsjZGVmaW5lIEJOWFRfTVBDX0NSWVBUT19DQVBBQkxFKGJwKVx0XHRcdFx0XHRcXFxuJiM0MztcdCgoYnApLVx1MDAzZW1wY19pbmZvID9cdFx0XHRcdFx0XHRcXFxuJiM0MztcdCAoKGJwKS1cdTAwM2VtcGNfaW5mby1cdTAwM2VtcGNfY2hubHNfY2FwIFx1MDAyNiBCTlhUX01QQ19DUllQVE9fQ0FQKSA9PVx0XFxcbiYjNDM7XHQgIEJOWFRfTVBDX0NSWVBUT19DQVAgOiBmYWxzZSlcbiYjNDM7XG4mIzQzOyNpZmRlZiBDT05GSUdfQk5YVF9UTFNcbiYjNDM7dm9pZCBibnh0X2FsbG9jX21wY19pbmZvKHN0cnVjdCBibnh0ICpicCwgdTggbXBjX2NobmxzX2NhcCk7XG4mIzQzO3ZvaWQgYm54dF9mcmVlX21wY19pbmZvKHN0cnVjdCBibnh0ICpicCk7XG4mIzQzO2ludCBibnh0X21wY190eF9yaW5nc19pbl91c2Uoc3RydWN0IGJueHQgKmJwKTtcbiYjNDM7aW50IGJueHRfbXBjX2NwX3JpbmdzX2luX3VzZShzdHJ1Y3QgYm54dCAqYnApO1xuJiM0Mztib29sIGJueHRfbmFwaV9oYXNfbXBjKHN0cnVjdCBibnh0ICpicCwgaW50IGkpO1xuJiM0Mzt2b2lkIGJueHRfc2V0X21wY19jcF9yaW5nKHN0cnVjdCBibnh0ICpicCwgaW50IGJuYXBpX2lkeCxcbiYjNDM7XHRcdFx0ICBzdHJ1Y3QgYm54dF9jcF9yaW5nX2luZm8gKmNwcik7XG4mIzQzO3ZvaWQgYm54dF90cmltX21wY19yaW5ncyhzdHJ1Y3QgYm54dCAqYnApO1xuJiM0Mzt2b2lkIGJueHRfY2FsY19kZmx0X21wY19yaW5ncyhzdHJ1Y3QgYm54dCAqYnAsIGludCB0eF9ucl9yaW5ncyxcbiYjNDM7XHRcdFx0ICAgICAgaW50IHR4X25yX3JpbmdzX3Blcl90YywgaW50IHJ4X25yX3JpbmdzLFxuJiM0MztcdFx0XHQgICAgICBpbnQgKm1wY19wZXJfdHlwZSwgaW50ICptcGNfY3ApO1xuJiM0Mzt2b2lkIGJueHRfc2V0X2RmbHRfbXBjX3JpbmdzKHN0cnVjdCBibnh0ICpicCk7XG4mIzQzO3ZvaWQgYm54dF9pbml0X21wY19yaW5nX3N0cnVjdChzdHJ1Y3QgYm54dCAqYnApO1xuJiM0MztpbnQgYm54dF9hbGxvY19tcGNzKHN0cnVjdCBibnh0ICpicCk7XG4mIzQzO3ZvaWQgYm54dF9mcmVlX21wY3Moc3RydWN0IGJueHQgKmJwKTtcbiYjNDM7aW50IGJueHRfYWxsb2NfbXBjX3JpbmdzKHN0cnVjdCBibnh0ICpicCk7XG4mIzQzO3ZvaWQgYm54dF9mcmVlX21wY19yaW5ncyhzdHJ1Y3QgYm54dCAqYnApO1xuJiM0Mzt2b2lkIGJueHRfaW5pdF9tcGNfcmluZ3Moc3RydWN0IGJueHQgKmJwKTtcbiYjNDM7aW50IGJueHRfaHdybV9tcGNfcmluZ19hbGxvYyhzdHJ1Y3QgYm54dCAqYnApO1xuJiM0Mzt2b2lkIGJueHRfaHdybV9tcGNfcmluZ19mcmVlKHN0cnVjdCBibnh0ICpicCwgYm9vbCBjbG9zZV9wYXRoKTtcbiYjNDM7c3RydWN0IGJueHRfdHhfcmluZ19pbmZvICpibnh0X3NlbGVjdF9tcGNfcmluZyhzdHJ1Y3QgYm54dCAqYnAsIGludCByaW5nX3R5cGUpO1xuJiM0MztpbnQgYm54dF9zdGFydF94bWl0X21wYyhzdHJ1Y3QgYm54dCAqYnAsIHN0cnVjdCBibnh0X3R4X3JpbmdfaW5mbyAqdHhyLFxuJiM0MztcdFx0XHR2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgbGVuLCB1bnNpZ25lZCBsb25nIGhhbmRsZSk7XG4mIzQzO3ZvaWQgYm54dF9tcGNfcmluZ19yZXNldF90YXNrKHN0cnVjdCBibnh0ICpicCk7XG4mIzQzO2ludCBibnh0X21wY190aW1lb3V0KHN0cnVjdCBibnh0ICpicCwgc3RydWN0IGJueHRfdHhfcmluZ19pbmZvICp0eHIpO1xuJiM0MztpbnQgYm54dF9tcGNfY21wKHN0cnVjdCBibnh0ICpicCwgc3RydWN0IGJueHRfY3BfcmluZ19pbmZvICpjcHIsIHUzMiAqcmF3X2NvbnMpO1xuJiM0MzsjZWxzZVxuJiM0MztzdGF0aWMgaW5saW5lIHZvaWQgYm54dF9hbGxvY19tcGNfaW5mbyhzdHJ1Y3QgYm54dCAqYnAsIHU4IG1wY19jaG5sc19jYXApXG4mIzQzO3tcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGlubGluZSB2b2lkIGJueHRfZnJlZV9tcGNfaW5mbyhzdHJ1Y3QgYm54dCAqYnApXG4mIzQzO3tcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGlubGluZSBpbnQgYm54dF9tcGNfdHhfcmluZ3NfaW5fdXNlKHN0cnVjdCBibnh0ICpicClcbiYjNDM7e1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW5saW5lIGludCBibnh0X21wY19jcF9yaW5nc19pbl91c2Uoc3RydWN0IGJueHQgKmJwKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbmxpbmUgYm9vbCBibnh0X25hcGlfaGFzX21wYyhzdHJ1Y3QgYm54dCAqYnAsIGludCBpKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIGZhbHNlO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW5saW5lIHZvaWQgYm54dF9zZXRfbXBjX2NwX3Jpbmcoc3RydWN0IGJueHQgKmJwLCBpbnQgYm5hcGlfaWR4LFxuJiM0MztcdFx0XHRcdFx0c3RydWN0IGJueHRfY3BfcmluZ19pbmZvICpjcHIpXG4mIzQzO3tcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGlubGluZSB2b2lkIGJueHRfdHJpbV9tcGNfcmluZ3Moc3RydWN0IGJueHQgKmJwKVxuJiM0Mzt7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbmxpbmUgdm9pZCBibnh0X2NhbGNfZGZsdF9tcGNfcmluZ3Moc3RydWN0IGJueHQgKmJwLCBpbnQgdHhfbnJfcmluZ3MsXG4mIzQzO1x0XHRcdFx0XHQgICAgaW50IHR4X25yX3JpbmdzX3Blcl90YyxcbiYjNDM7XHRcdFx0XHRcdCAgICBpbnQgcnhfbnJfcmluZ3MsIGludCAqbXBjX3Blcl90eXBlLFxuJiM0MztcdFx0XHRcdFx0ICAgIGludCAqbXBjX2NwKVxuJiM0Mzt7XG4mIzQzO1x0Km1wY19wZXJfdHlwZSA9IDA7XG4mIzQzO1x0Km1wY19jcCA9IDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbmxpbmUgdm9pZCBibnh0X3NldF9kZmx0X21wY19yaW5ncyhzdHJ1Y3QgYm54dCAqYnApXG4mIzQzO3tcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGlubGluZSB2b2lkIGJueHRfaW5pdF9tcGNfcmluZ19zdHJ1Y3Qoc3RydWN0IGJueHQgKmJwKVxuJiM0Mzt7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbmxpbmUgaW50IGJueHRfYWxsb2NfbXBjcyhzdHJ1Y3QgYm54dCAqYnApXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGlubGluZSB2b2lkIGJueHRfZnJlZV9tcGNzKHN0cnVjdCBibnh0ICpicClcbiYjNDM7e1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW5saW5lIGludCBibnh0X2FsbG9jX21wY19yaW5ncyhzdHJ1Y3QgYm54dCAqYnApXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGlubGluZSB2b2lkIGJueHRfZnJlZV9tcGNfcmluZ3Moc3RydWN0IGJueHQgKmJwKVxuJiM0Mzt7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbmxpbmUgdm9pZCBibnh0X2luaXRfbXBjX3JpbmdzKHN0cnVjdCBibnh0ICpicClcbiYjNDM7e1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW5saW5lIGludCBibnh0X2h3cm1fbXBjX3JpbmdfYWxsb2Moc3RydWN0IGJueHQgKmJwKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbmxpbmUgdm9pZCBibnh0X2h3cm1fbXBjX3JpbmdfZnJlZShzdHJ1Y3QgYm54dCAqYnAsIGJvb2wgY2xvc2VfcGF0aClcbiYjNDM7e1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW5saW5lIHN0cnVjdCBibnh0X3R4X3JpbmdfaW5mbyAqYm54dF9zZWxlY3RfbXBjX3Jpbmcoc3RydWN0IGJueHQgKmJwLFxuJiM0MztcdFx0XHRcdFx0XHRcdCAgICAgaW50IHJpbmdfdHlwZSlcbiYjNDM7e1xuJiM0MztcdHJldHVybiBOVUxMO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW5saW5lIGludCBibnh0X3N0YXJ0X3htaXRfbXBjKHN0cnVjdCBibnh0ICpicCxcbiYjNDM7XHRcdFx0XHQgICAgICBzdHJ1Y3QgYm54dF90eF9yaW5nX2luZm8gKnR4ciwgdm9pZCAqZGF0YSxcbiYjNDM7XHRcdFx0XHQgICAgICB1bnNpZ25lZCBpbnQgbGVuLCB1bnNpZ25lZCBsb25nIGhhbmRsZSlcbiYjNDM7e1xuJiM0MztcdHJldHVybiAtRU9QTk9UU1VQUDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGlubGluZSB2b2lkIGJueHRfbXBjX3JpbmdfcmVzZXRfdGFzayhzdHJ1Y3QgYm54dCAqYnApXG4mIzQzO3tcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGlubGluZSBpbnQgYm54dF9tcGNfdGltZW91dChzdHJ1Y3QgYm54dCAqYnAsXG4mIzQzO1x0XHRcdFx0ICAgc3RydWN0IGJueHRfdHhfcmluZ19pbmZvICp0eHIpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gLUVPUE5PVFNVUFA7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbmxpbmUgaW50IGJueHRfbXBjX2NtcChzdHJ1Y3QgYm54dCAqYnAsIHN0cnVjdCBibnh0X2NwX3JpbmdfaW5mbyAqY3ByLFxuJiM0MztcdFx0XHQgICAgICAgdTMyICpyYXdfY29ucylcbiYjNDM7e1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzOyNlbmRpZlx0LyogQ09ORklHX0JOWFRfVExTICovXG4mIzQzOyNlbmRpZlx0LyogQk5YVF9NUENfSCAqL1xuZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dF9zcmlvdi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9ibnh0X3NyaW92LmNcbmluZGV4IGVkY2MwMDJlNGNhMzU4Li5kNTcwNTk3MjJmNWJiMCAxMDA2NDRcbi0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dF9zcmlvdi5jXG4mIzQzOyYjNDM7JiM0MzsgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibnh0L2JueHRfc3Jpb3YuY1xuQEAgLTY0MCw3ICYjNDM7NjQwLDcgQEAgc3RhdGljIGludCBibnh0X2h3cm1fZnVuY192Zl9yZXNjX2NmZyhzdHJ1Y3QgYm54dCAqYnAsIGludCBudW1fdmZzLCBib29sIHJlc2V0KVxuIFx0XHR2Zl9yeF9yaW5ncyA9IGh3X3Jlc2MtXHUwMDNlbWF4X3J4X3JpbmdzIC0gYnAtXHUwMDNlcnhfbnJfcmluZ3MgKiAyO1xuIFx0ZWxzZVxuIFx0XHR2Zl9yeF9yaW5ncyA9IGh3X3Jlc2MtXHUwMDNlbWF4X3J4X3JpbmdzIC0gYnAtXHUwMDNlcnhfbnJfcmluZ3M7XG4tXHR2Zl90eF9yaW5ncyA9IGh3X3Jlc2MtXHUwMDNlbWF4X3R4X3JpbmdzIC0gYnAtXHUwMDNldHhfbnJfcmluZ3M7XG4mIzQzO1x0dmZfdHhfcmluZ3MgPSBod19yZXNjLVx1MDAzZW1heF90eF9yaW5ncyAtIGJueHRfdG90YWxfdHhfcmluZ3MoYnApO1xuIFx0dmZfdm5pY3MgPSBod19yZXNjLVx1MDAzZW1heF92bmljcyAtIGJwLVx1MDAzZW5yX3ZuaWNzO1xuIFx0dmZfcnNzID0gaHdfcmVzYy1cdTAwM2VtYXhfcnNzY29zX2N0eHMgLSBicC1cdTAwM2Vyc3Njb3NfbnJfY3R4cztcbiBcbkBAIC05MDMsOCAmIzQzOzkwMyw4IEBAIHN0YXRpYyBpbnQgYm54dF9zcmlvdl9lbmFibGUoc3RydWN0IGJueHQgKmJwLCBpbnQgKm51bV92ZnMpXG4gXHRcdCAgICBhdmFpbF9jcCBcdTAwM2MgbWluX3J4X3JpbmdzKVxuIFx0XHRcdHJ4X29rID0gMDtcbiBcbi1cdFx0aWYgKGh3X3Jlc2MtXHUwMDNlbWF4X3R4X3JpbmdzIC0gYnAtXHUwMDNldHhfbnJfcmluZ3MgXHUwMDNlPSBtaW5fdHhfcmluZ3MgXHUwMDI2XHUwMDI2XG4tXHRcdCAgICBhdmFpbF9jcCBcdTAwM2U9IG1pbl90eF9yaW5ncylcbiYjNDM7XHRcdGlmIChod19yZXNjLVx1MDAzZW1heF90eF9yaW5ncyAtIGJueHRfdG90YWxfdHhfcmluZ3MoYnApIFx1MDAzZT1cbiYjNDM7XHRcdCAgICBtaW5fdHhfcmluZ3MgXHUwMDI2XHUwMDI2IGF2YWlsX2NwIFx1MDAzZT0gbWluX3R4X3JpbmdzKVxuIFx0XHRcdHR4X29rID0gMTtcbiBcbiBcdFx0aWYgKGh3X3Jlc2MtXHUwMDNlbWF4X3Jzc2Nvc19jdHhzIC0gYnAtXHUwMDNlcnNzY29zX25yX2N0eHMgXHUwMDNlPVxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dF94ZHAuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dF94ZHAuY1xuaW5kZXggOWU1MDA5YmU4ZTk4OTguLmQxODczMTI0ODkzYTVmIDEwMDY0NFxuLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9ibnh0X3hkcC5jXG4mIzQzOyYjNDM7JiM0MzsgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibnh0L2JueHRfeGRwLmNcbkBAIC0xOSw2ICYjNDM7MTksNyBAQFxuICNpbmNsdWRlIFx1MDAzY25ldC9wYWdlX3Bvb2wvaGVscGVycy5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvYm54dC9oc2kuaFx1MDAzZVxuICNpbmNsdWRlIFwmIzM0O2JueHQuaFwmIzM0O1xuJiM0MzsjaW5jbHVkZSBcJiMzNDtibnh0X21wYy5oXCYjMzQ7XG4gI2luY2x1ZGUgXCYjMzQ7Ym54dF94ZHAuaFwmIzM0O1xuIFxuIERFRklORV9TVEFUSUNfS0VZX0ZBTFNFKGJueHRfeGRwX2xvY2tpbmdfa2V5KTtcbkBAIC0zNTEsNyAmIzQzOzM1Miw3IEBAIGludCBibnh0X3hkcF94bWl0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBudW1fZnJhbWVzLFxuIFx0XHRyZXR1cm4gLUVJTlZBTDtcbiBcbiBcdGlmIChzdGF0aWNfYnJhbmNoX3VubGlrZWx5KFx1MDAyNmJueHRfeGRwX2xvY2tpbmdfa2V5KSlcbi1cdFx0c3Bpbl9sb2NrKFx1MDAyNnR4ci1cdTAwM2V4ZHBfdHhfbG9jayk7XG4mIzQzO1x0XHRzcGluX2xvY2soXHUwMDI2dHhyLVx1MDAzZXR4X2xvY2spO1xuIFxuIFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnVtX2ZyYW1lczsgaSYjNDM7JiM0MzspIHtcbiBcdFx0c3RydWN0IHhkcF9mcmFtZSAqeGRwID0gZnJhbWVzW2ldO1xuQEAgLTM3Niw3ICYjNDM7Mzc3LDcgQEAgaW50IGJueHRfeGRwX3htaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG51bV9mcmFtZXMsXG4gXHR9XG4gXG4gXHRpZiAoc3RhdGljX2JyYW5jaF91bmxpa2VseShcdTAwMjZibnh0X3hkcF9sb2NraW5nX2tleSkpXG4tXHRcdHNwaW5fdW5sb2NrKFx1MDAyNnR4ci1cdTAwM2V4ZHBfdHhfbG9jayk7XG4mIzQzO1x0XHRzcGluX3VubG9jayhcdTAwMjZ0eHItXHUwMDNldHhfbG9jayk7XG4gXG4gXHRyZXR1cm4gbnhtaXQ7XG4gfVxuQEAgLTQxMCw3ICYjNDM7NDExLDggQEAgc3RhdGljIGludCBibnh0X3hkcF9zZXQoc3RydWN0IGJueHQgKmJwLCBzdHJ1Y3QgYnBmX3Byb2cgKnByb2cpXG4gXHRpZiAoIXRjKVxuIFx0XHR0YyA9IDE7XG4gXHRyYyA9IGJueHRfY2hlY2tfcmluZ3MoYnAsIGJwLVx1MDAzZXR4X25yX3JpbmdzX3Blcl90YywgYnAtXHUwMDNlcnhfbnJfcmluZ3MsXG4tXHRcdFx0ICAgICAgdHJ1ZSwgdGMsIHR4X3hkcCk7XG4mIzQzO1x0XHRcdCAgICAgIHRydWUsIHRjLCB0eF94ZHAsIGJueHRfbXBjX3R4X3JpbmdzX2luX3VzZShicCksXG4mIzQzO1x0XHRcdCAgICAgIGJueHRfbXBjX2NwX3JpbmdzX2luX3VzZShicCkpO1xuIFx0aWYgKHJjKSB7XG4gXHRcdG5ldGRldl93YXJuKGRldiwgXCYjMzQ7VW5hYmxlIHRvIHJlc2VydmUgZW5vdWdoIFRYIHJpbmdzIHRvIHN1cHBvcnQgWERQLlxcblwmIzM0Oyk7XG4gXHRcdHJldHVybiByYztcbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2JueHQvaHNpLmggYi9pbmNsdWRlL2xpbnV4L2JueHQvaHNpLmhcbmluZGV4IDc0YTZiZjI3OGQ4ODhjLi4wMzQ0NGI4MWJlYjBmMyAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgvYm54dC9oc2kuaFxuJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC9ibnh0L2hzaS5oXG5AQCAtMzgzNyw2ICYjNDM7MzgzNyw0MyBAQCBzdHJ1Y3QgaHdybV9mdW5jX3B0cF9leHRfcWNmZ19vdXRwdXQge1xuIFx0dThcdHZhbGlkO1xuIH07XG4gXG4mIzQzOy8qIGh3cm1fZnVuY19rZXlfY3R4X2FsbG9jX2lucHV0IChzaXplOjM4NGIvNDhCKSAqL1xuJiM0MztzdHJ1Y3QgaHdybV9mdW5jX2tleV9jdHhfYWxsb2NfaW5wdXQge1xuJiM0MztcdF9fbGUxNlx0cmVxX3R5cGU7XG4mIzQzO1x0X19sZTE2XHRjbXBsX3Jpbmc7XG4mIzQzO1x0X19sZTE2XHRzZXFfaWQ7XG4mIzQzO1x0X19sZTE2XHR0YXJnZXRfaWQ7XG4mIzQzO1x0X19sZTY0XHRyZXNwX2FkZHI7XG4mIzQzO1x0X19sZTE2XHRmaWQ7XG4mIzQzO1x0X19sZTE2XHRudW1fa2V5X2N0eHM7XG4mIzQzO1x0X19sZTMyXHRkbWFfYnVmcl9zaXplX2J5dGVzO1xuJiM0MztcdHU4XHRrZXlfY3R4X3R5cGU7XG4mIzQzO1x0I2RlZmluZSBGVU5DX0tFWV9DVFhfQUxMT0NfUkVRX0tFWV9DVFhfVFlQRV9UWCAgICAgIDB4MFVMXG4mIzQzO1x0I2RlZmluZSBGVU5DX0tFWV9DVFhfQUxMT0NfUkVRX0tFWV9DVFhfVFlQRV9SWCAgICAgIDB4MVVMXG4mIzQzO1x0I2RlZmluZSBGVU5DX0tFWV9DVFhfQUxMT0NfUkVRX0tFWV9DVFhfVFlQRV9RVUlDX1RYIDB4MlVMXG4mIzQzO1x0I2RlZmluZSBGVU5DX0tFWV9DVFhfQUxMT0NfUkVRX0tFWV9DVFhfVFlQRV9RVUlDX1JYIDB4M1VMXG4mIzQzO1x0I2RlZmluZSBGVU5DX0tFWV9DVFhfQUxMT0NfUkVRX0tFWV9DVFhfVFlQRV9MQVNUICAgRlVOQ19LRVlfQ1RYX0FMTE9DX1JFUV9LRVlfQ1RYX1RZUEVfUVVJQ19SWFxuJiM0MztcdHU4XHR1bnVzZWRfMFs3XTtcbiYjNDM7XHRfX2xlNjRcdGhvc3RfZG1hX2FkZHI7XG4mIzQzO1x0X19sZTMyXHRwYXJ0aXRpb25fc3RhcnRfeGlkO1xuJiM0MztcdHU4XHR1bnVzZWRfMVs0XTtcbiYjNDM7fTtcbiYjNDM7XG4mIzQzOy8qIGh3cm1fZnVuY19rZXlfY3R4X2FsbG9jX291dHB1dCAoc2l6ZToxOTJiLzI0QikgKi9cbiYjNDM7c3RydWN0IGh3cm1fZnVuY19rZXlfY3R4X2FsbG9jX291dHB1dCB7XG4mIzQzO1x0X19sZTE2XHRlcnJvcl9jb2RlO1xuJiM0MztcdF9fbGUxNlx0cmVxX3R5cGU7XG4mIzQzO1x0X19sZTE2XHRzZXFfaWQ7XG4mIzQzO1x0X19sZTE2XHRyZXNwX2xlbjtcbiYjNDM7XHRfX2xlMTZcdG51bV9rZXlfY3R4c19hbGxvY2F0ZWQ7XG4mIzQzO1x0dThcdGZsYWdzO1xuJiM0MztcdCNkZWZpbmUgRlVOQ19LRVlfQ1RYX0FMTE9DX1JFU1BfRkxBR1NfS0VZX0NUWFNfQ09OVElHVU9VUyAgICAgMHgxVUxcbiYjNDM7XHR1OFx0dW51c2VkXzA7XG4mIzQzO1x0X19sZTMyXHRwYXJ0aXRpb25fc3RhcnRfeGlkO1xuJiM0MztcdHU4XHR1bnVzZWRfMVs3XTtcbiYjNDM7XHR1OFx0dmFsaWQ7XG4mIzQzO307XG4mIzQzO1xuIC8qIGh3cm1fZnVuY19iYWNraW5nX3N0b3JlX2NmZ192Ml9pbnB1dCAoc2l6ZTo1MTJiLzY0QikgKi9cbiBzdHJ1Y3QgaHdybV9mdW5jX2JhY2tpbmdfc3RvcmVfY2ZnX3YyX2lucHV0IHtcbiBcdF9fbGUxNlx0cmVxX3R5cGU7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Mi8xPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTEgMDI6MDU8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IG51bGwsCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogW10sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggYWRkcyBrVExTIG9mZmxvYWQgc3VwcG9ydCB0byB0aGUgQnJvYWRjb20gTmV0WHRyZW1lLUMvRSAoYm54dCkgRXRoZXJuZXQgZHJpdmVyLiBTaW5jZSB0aGlzIGlzIGEgaGFyZHdhcmUtc3BlY2lmaWMgUENJIGRyaXZlciB0aGF0IHJlcXVpcmVzIGNvbXBsZXggZmlybXdhcmUgKEhXUk0pIGludGVyYWN0aW9ucyB0byBpbml0aWFsaXplIGFuZCBicmluZyB1cCB0aGUgbmV0d29yayBkZXZpY2UsIGl0IGlzIGltcG9zc2libGUgdG8gcmVhY2ggdGhlIG1vZGlmaWVkIGRhdGEgcGF0aCBhbmQgVExTIG9mZmxvYWQgbG9naWMgaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIHdpdGhvdXQgYSBkZWRpY2F0ZWQgc29mdHdhcmUgZW11bGF0b3IuIFRoZXJlZm9yZSwgdGhpcyBjb2RlIGNhbm5vdCBiZSBtZWFuaW5nZnVsbHkgZnV6emVkLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lCmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC4KCklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpbgp5b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHkKdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy4KClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6Ci0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy4KLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy4KLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuCi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLApldmVuIHdoZW4gdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGhhcmR3YXJlIChlLmcuLCB1c2IgZ2FkZ2V0LCBtYWM4MDIxMV9od3NpbSkuCgpJZiBpdCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZXMsIHVzZSB5b3VyIGNvZGUgc2VhcmNoCnRvb2xzIHRvIHZlcmlmeSB0aGUgY29kZSBjYW4gYmUgZXhlY3V0ZWQsIHRoZW4gcmV0dXJuIFdvcnRoRnV6emluZz10cnVlLgoKV2hlbiByZXR1cm5pbmcgV29ydGhGdXp6aW5nPXRydWUsIHlvdSBNVVNUIEFMU086CjEuIEV4dHJhY3QgYW55IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgaGVhdmlseSBmdXp6ZWQgaW50byBGb2N1c1N5bWJvbHMuCiAgIEF2b2lkIGxpc3RpbmcgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgdG8gcHJldmVudCBza2V3ZWQgdGVzdCBkaXN0cmlidXRpb25zLgoyLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS4KICAgR28gYW5kIGxvb2sgaW50byB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgY2hlY2sgZm9yIGlmZGVmcyBhcm91bmQgdGhlIGNvZGUsIGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLgogICBEbyBub3QgbGlzdCB0b28gZ2VuZXJpYyBjb25maWdzICh3ZSBhbHJlYWR5IGhhdmUgdGhlbSBlbmFibGVkKS4gT25seSBsaXN0IHRob3NlIHRoYXQKICAgc3BlY2lmaWNhbGx5IGNvdmVyIHRoZSBtb2RpZmllZCBjb2RlLiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3Mgb3V0cHV0IGFycmF5LAogICBhbmQgRE8gTk9UIGFkZCBhICYjMzk7Q09ORklHXyYjMzk7IHByZWZpeCAoZS5nLiwgcmV0dXJuICYjMzQ7TkVUX0lQVjQmIzM0OyBpbnN0ZWFkIG9mICYjMzQ7Q09ORklHX05FVF9JUFY0JiMzNDspLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgZWE4MjNmNTE1YWU4Y2UzODA1YWRiMjFjMzI5NjljOTFiYzczMjUwMgpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBTYXQgSnVsIDExIDAyOjA1OjU0IDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vS2NvbmZpZyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL0tjb25maWcKaW5kZXggZjBiYWMwZGQxNDM5MDAuLmIzM2I2NmYwMzhiODgyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9LY29uZmlnCiYjNDM7JiM0MzsmIzQzOyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL0tjb25maWcKQEAgLTI1NSw2ICYjNDM7MjU1LDE1IEBAIGNvbmZpZyBCTlhUX0hXTU9OCiAJICBTYXkgWSBpZiB5b3Ugd2FudCB0byBleHBvc2UgdGhlIHRoZXJtYWwgc2Vuc29yIGRhdGEgb24gTmV0WHRyZW1lLUMvRQogCSAgZGV2aWNlcywgdmlhIHRoZSBod21vbiBzeXNmcyBpbnRlcmZhY2UuCiAKJiM0Mztjb25maWcgQk5YVF9UTFMKJiM0MzsJYm9vbCAmIzM0O0Jyb2FkY29tIE5ldFh0cmVtZS1DL0UgVExTIG9mZmxvYWQgc3VwcG9ydCYjMzQ7CiYjNDM7CWRlZmF1bHQgeQomIzQzOwlkZXBlbmRzIG9uIEJOWFQgJmFtcDsmYW1wOyBUTFNfREVWSUNFCiYjNDM7CWRlcGVuZHMgb24gVExTPXkgfHwgQk5YVD1tCiYjNDM7CWhlbHAKJiM0MzsJICBTYXkgWSBpZiB5b3Ugd2FudCB0byBlbmFibGUgVHJhbnNwb3J0IExheWVyIFNlY3VyaXR5IChUTFMpIGhhcmR3YXJlCiYjNDM7CSAgZW5jcnlwdGlvbiBhbmQgZGVjcnlwdGlvbiBvZmZsb2FkIG9uIHN1cHBvcnRlZCBOZXRYdHJlbWUtQy9FIGRldmljZXMuCiYjNDM7CiBjb25maWcgQk5HRQogCXRyaXN0YXRlICYjMzQ7QnJvYWRjb20gVGhvclVsdHJhIEV0aGVybmV0IGRldmljZSBzdXBwb3J0JiMzNDsKIAlkZXBlbmRzIG9uIFBDSQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvTWFrZWZpbGUKaW5kZXggZGViZWY3OGM4YjZkNjQuLjg4ZTY4MjQ4YWFkNDIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibnh0L01ha2VmaWxlCiYjNDM7JiM0MzsmIzQzOyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvTWFrZWZpbGUKQEAgLTUsMyAmIzQzOzUsNCBAQCBibnh0X2VuLXkgOj0gYm54dC5vIGJueHRfaHdybS5vIGJueHRfc3Jpb3YubyBibnh0X2V0aHRvb2wubyBibnh0X2RjYi5vIGJueHRfdWxwLgogYm54dF9lbi0kKENPTkZJR19CTlhUX0ZMT1dFUl9PRkZMT0FEKSAmIzQzOz0gYm54dF90Yy5vCiBibnh0X2VuLSQoQ09ORklHX0RFQlVHX0ZTKSAmIzQzOz0gYm54dF9kZWJ1Z2ZzLm8KIGJueHRfZW4tJChDT05GSUdfQk5YVF9IV01PTikgJiM0Mzs9IGJueHRfaHdtb24ubwomIzQzO2JueHRfZW4tJChDT05GSUdfQk5YVF9UTFMpICYjNDM7PSBibnh0X21wYy5vIGJueHRfY3J5cHRvLm8gYm54dF9rdGxzLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9ibnh0LmMKaW5kZXggNzUxMzYxODc5M2RhZjMuLmYwODRjMTlmZmRkZDhmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibnh0L2JueHQuYwomIzQzOyYjNDM7JiM0MzsgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibnh0L2JueHQuYwpAQCAtNzYsNiAmIzQzOzc2LDkgQEAKICNpbmNsdWRlICYjMzQ7Ym54dF9od21vbi5oJiMzNDsKICNpbmNsdWRlICYjMzQ7Ym54dF9nc28uaCYjMzQ7CiAjaW5jbHVkZSAmbHQ7bmV0L3Rzby5oJmd0OwomIzQzOyNpbmNsdWRlICYjMzQ7Ym54dF9tcGMuaCYjMzQ7CiYjNDM7I2luY2x1ZGUgJiMzNDtibnh0X2NyeXB0by5oJiMzNDsKJiM0MzsjaW5jbHVkZSAmIzM0O2JueHRfa3Rscy5oJiMzNDsKIAogI2RlZmluZSBCTlhUX1RYX1RJTUVPVVQJCSg1ICogSFopCiAjZGVmaW5lIEJOWFRfREVGX01TR19FTkFCTEUJKE5FVElGX01TR19EUlYgfCBORVRJRl9NU0dfSFcgfCBcCkBAIC0zOTIsNyAmIzQzOzM5NSw3IEBAIHN0YXRpYyB2b2lkIF9fYm54dF9xdWV1ZV9zcF93b3JrKHN0cnVjdCBibnh0ICpicCkKIAkJc2NoZWR1bGVfd29yaygmYW1wO2JwLSZndDtzcF90YXNrKTsKIH0KIAotc3RhdGljIHZvaWQgYm54dF9xdWV1ZV9zcF93b3JrKHN0cnVjdCBibnh0ICpicCwgdW5zaWduZWQgaW50IGV2ZW50KQomIzQzO3ZvaWQgYm54dF9xdWV1ZV9zcF93b3JrKHN0cnVjdCBibnh0ICpicCwgdW5zaWduZWQgaW50IGV2ZW50KQogewogCXNldF9iaXQoZXZlbnQsICZhbXA7YnAtJmd0O3NwX2V2ZW50KTsKIAlfX2JueHRfcXVldWVfc3Bfd29yayhicCk7CkBAIC00NzgsMTMgJiM0Mzs0ODEsMTUgQEAgc3RhdGljIG5ldGRldl90eF90IGJueHRfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogCWRtYV9hZGRyX3QgbWFwcGluZzsKIAl1bnNpZ25lZCBpbnQgbGVuZ3RoLCBwYWQgPSAwOwogCXUzMiBsZW4sIGZyZWVfc2l6ZSwgdmxhbl90YWdfZmxhZ3MsIGNmYV9hY3Rpb24sIGZsYWdzOwomIzQzOwlzdHJ1Y3QgYm54dF9rdGxzX29mZmxvYWRfY3R4X3R4ICprY3R4X3R4ID0gTlVMTDsKJiM0MzsJdTE2IHByb2QsIHN0YXJ0X3Byb2QsIGxhc3RfZnJhZywgdHh0c19wcm9kOwogCXN0cnVjdCBibnh0X3B0cF9jZmcgKnB0cCA9IGJwLSZndDtwdHBfY2ZnOwogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gYnAtJmd0O3BkZXY7Ci0JdTE2IHByb2QsIGxhc3RfZnJhZywgdHh0c19wcm9kOwogCXN0cnVjdCBibnh0X3R4X3JpbmdfaW5mbyAqdHhyOwogCXN0cnVjdCBibnh0X3N3X3R4X2JkICp0eF9idWY7CiAJX19sZTMyIGxmbGFncyA9IDA7CiAJc2tiX2ZyYWdfdCAqZnJhZzsKJiM0MzsJdTMyIGtpZCA9IDA7CiAKIAlpID0gc2tiX2dldF9xdWV1ZV9tYXBwaW5nKHNrYik7CiAJaWYgKHVubGlrZWx5KGkgJmd0Oz0gYnAtJmd0O3R4X25yX3JpbmdzKSkgewpAQCAtNDk1LDcgJiM0Mzs1MDAsNiBAQCBzdGF0aWMgbmV0ZGV2X3R4X3QgYm54dF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiAKIAl0eHEgPSBuZXRkZXZfZ2V0X3R4X3F1ZXVlKGRldiwgaSk7CiAJdHhyID0gJmFtcDticC0mZ3Q7dHhfcmluZ1ticC0mZ3Q7dHhfcmluZ19tYXBbaV1dOwotCXByb2QgPSB0eHItJmd0O3R4X3Byb2Q7CiAKICNpZiAoTUFYX1NLQl9GUkFHUyAmZ3Q7IFRYX01BWF9GUkFHUykKIAlpZiAoc2tiX3NoaW5mbyhza2IpLSZndDtucl9mcmFncyAmZ3Q7IFRYX01BWF9GUkFHUykgewpAQCAtNTI0LDYgJiM0Mzs1MjgsMTQgQEAgc3RhdGljIG5ldGRldl90eF90IGJueHRfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogCQkJcmV0dXJuIE5FVERFVl9UWF9CVVNZOwogCX0KIAomIzQzOwlzdGFydF9wcm9kID0gdHhyLSZndDt0eF9wcm9kOwomIzQzOwlza2IgPSBibnh0X2t0bHNfeG1pdChicCwgdHhyLCBza2IsICZhbXA7bGZsYWdzLCAmYW1wO2tpZCwgJmFtcDtrY3R4X3R4KTsKJiM0MzsJaWYgKHVubGlrZWx5KCFza2IpKSB7CiYjNDM7CQlkZXZfY29yZV9zdGF0c190eF9kcm9wcGVkX2luYyhkZXYpOwomIzQzOwkJcmV0dXJuIE5FVERFVl9UWF9PSzsKJiM0MzsJfQomIzQzOwomIzQzOwlwcm9kID0gdHhyLSZndDt0eF9wcm9kOwogCWxlbmd0aCA9IHNrYi0mZ3Q7bGVuOwogCWxlbiA9IHNrYl9oZWFkbGVuKHNrYik7CiAJbGFzdF9mcmFnID0gc2tiX3NoaW5mbyhza2IpLSZndDtucl9mcmFnczsKQEAgLTY3Miw3ICYjNDM7Njg0LDcgQEAgc3RhdGljIG5ldGRldl90eF90IGJueHRfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogCiAJcHJvZCA9IE5FWFRfVFgocHJvZCk7CiAJdHhiZDEgPSBibnh0X2luaXRfZXh0X2JkKGJwLCB0eHIsIHByb2QsIGxmbGFncywgdmxhbl90YWdfZmxhZ3MsCi0JCQkJIGNmYV9hY3Rpb24pOwomIzQzOwkJCQkgY2ZhX2FjdGlvbiwga2lkKTsKIAogCWlmIChza2JfaXNfZ3NvKHNrYikpIHsKIAkJYm9vbCB1ZHBfZ3NvID0gISEoc2tiX3NoaW5mbyhza2IpLSZndDtnc29fdHlwZSAmYW1wOyBTS0JfR1NPX1VEUF9MNCk7CkBAIC02OTMsOSAmIzQzOzcwNSwxMCBAQCBzdGF0aWMgbmV0ZGV2X3R4X3QgYm54dF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiAKIAkJdHhiZDEtJmd0O3R4X2JkX2hzaXplX2xmbGFncyB8PSBjcHVfdG9fbGUzMihUWF9CRF9GTEFHU19MU08gfAogCQkJCQlUWF9CRF9GTEFHU19UX0lQSUQgfAotCQkJCQkoaGRyX2xlbiAmbHQ7Jmx0OyAoVFhfQkRfSFNJWkVfU0hJRlQgLSAxKSkpOwomIzQzOwkJCQkJKChoZHJfbGVuICZndDsmZ3Q7IDEpICZsdDsmbHQ7IFRYX0JEX0hTSVpFX1NISUZUKSk7CiAJCWxlbmd0aCA9IHNrYl9zaGluZm8oc2tiKS0mZ3Q7Z3NvX3NpemU7Ci0JCXR4YmQxLSZndDt0eF9iZF9tc3MgPSBjcHVfdG9fbGUzMihsZW5ndGgpOwomIzQzOwkJdHhiZDEtJmd0O3R4X2JkX2tpZF9tc3MgPSBjcHVfdG9fbGUzMihCTlhUX1RYX0tJRF9ISShraWQpIHwKJiM0MzsJCQkJCQkgICAobGVuZ3RoICZhbXA7IFRYX0JEX01TUykpOwogCQlsZW5ndGggJiM0Mzs9IGhkcl9sZW47CiAJfSBlbHNlIGlmIChza2ItJmd0O2lwX3N1bW1lZCA9PSBDSEVDS1NVTV9QQVJUSUFMKSB7CiAJCXR4YmQxLSZndDt0eF9iZF9oc2l6ZV9sZmxhZ3MgfD0KQEAgLTc0OCw2ICYjNDM7NzYxLDkgQEAgc3RhdGljIG5ldGRldl90eF90IGJueHRfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogCXByb2QgPSBORVhUX1RYKHByb2QpOwogCVdSSVRFX09OQ0UodHhyLSZndDt0eF9wcm9kLCBwcm9kKTsKIAomIzQzOwkvKiBDb21taXQgdGhlIGtUTFMgc3RhdGUgbm93IHRoYXQgdGhlIEJEIGlzIGluIHRoZSByaW5nLiAqLwomIzQzOwlibnh0X2t0bHNfeG1pdF9jb21taXQodHhyLCBrY3R4X3R4KTsKJiM0MzsKIAlpZiAoIW5ldGRldl94bWl0X21vcmUoKSB8fCBuZXRpZl94bWl0X3N0b3BwZWQodHhxKSkgewogCQlibnh0X3R4cl9kYl9raWNrKGJwLCB0eHIsIHByb2QpOwogCX0gZWxzZSB7CkBAIC04MDIsOSAmIzQzOzgxOCwxNiBAQCBzdGF0aWMgbmV0ZGV2X3R4X3QgYm54dF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiAJCQkvKiBzZXQgU0tCIHRvIGVyciBzbyBQVFAgd29ya2VyIHdpbGwgY2xlYW4gdXAgKi8KIAkJCXB0cC0mZ3Q7dHh0c19yZXFbdHh0c19wcm9kXS50eF9za2IgPSBFUlJfUFRSKC1FSU8pOwogCX0KJiM0MzsJdHhyLSZndDt0eF9idWZfcmluZ1tSSU5HX1RYKGJwLCB0eHItJmd0O3R4X3Byb2QpXS5za2IgPSBOVUxMOwomIzQzOwkvKiBVbndpbmQgYW55IGtUTFMgcHJlc3luYyBCRHMgKi8KJiM0MzsJaWYgKHVubGlrZWx5KHR4ci0mZ3Q7dHhfcHJvZCAhPSBzdGFydF9wcm9kKSkgewomIzQzOwkJdHhfYnVmID0gJmFtcDt0eHItJmd0O3R4X2J1Zl9yaW5nW1JJTkdfVFgoYnAsIHN0YXJ0X3Byb2QpXTsKJiM0MzsJCXR4X2J1Zi0mZ3Q7aXNfcHVzaCA9IDA7CiYjNDM7CQl0eF9idWYtJmd0O2lubGluZV9kYXRhX2JkcyA9IDA7CiYjNDM7CQlXUklURV9PTkNFKHR4ci0mZ3Q7dHhfcHJvZCwgc3RhcnRfcHJvZCk7CiYjNDM7CX0KIAlpZiAodHhyLSZndDtraWNrX3BlbmRpbmcpCiAJCWJueHRfdHhyX2RiX2tpY2soYnAsIHR4ciwgdHhyLSZndDt0eF9wcm9kKTsKLQl0eHItJmd0O3R4X2J1Zl9yaW5nW1JJTkdfVFgoYnAsIHR4ci0mZ3Q7dHhfcHJvZCldLnNrYiA9IE5VTEw7CiAJZGV2X2NvcmVfc3RhdHNfdHhfZHJvcHBlZF9pbmMoZGV2KTsKIAlyZXR1cm4gTkVUREVWX1RYX09LOwogfQpAQCAtODMzLDcgJiM0Mzs4NTYsNyBAQCBzdGF0aWMgYm9vbCBfX2JueHRfdHhfaW50KHN0cnVjdCBibnh0ICpicCwgc3RydWN0IGJueHRfdHhfcmluZ19pbmZvICp0eHIsCiAJCWhlYWRfYnVmID0gdHhfYnVmOwogCQlza2IgPSB0eF9idWYtJmd0O3NrYjsKIAotCQlpZiAodW5saWtlbHkoIXNrYikpIHsKJiM0MzsJCWlmICh1bmxpa2VseSghc2tiICZhbXA7JmFtcDsgIXR4X2J1Zi0mZ3Q7aXNfcHVzaCkpIHsKIAkJCWJueHRfc2NoZWRfcmVzZXRfdHhyKGJwLCB0eHIsIGNvbnMpOwogCQkJcmV0dXJuIHJjOwogCQl9CkBAIC04NDUsMTMgJiM0Mzs4NjgsMjIgQEAgc3RhdGljIGJvb2wgX19ibnh0X3R4X2ludChzdHJ1Y3QgYm54dCAqYnAsIHN0cnVjdCBibnh0X3R4X3JpbmdfaW5mbyAqdHhyLAogCQl9CiAKIAkJY29ucyA9IE5FWFRfVFgoY29ucyk7Ci0JCXR4X3BrdHMmIzQzOyYjNDM7OwotCQl0eF9ieXRlcyAmIzQzOz0gc2tiLSZndDtsZW47CiYjNDM7CQlpZiAoc2tiKSB7CiYjNDM7CQkJdHhfcGt0cyYjNDM7JiM0Mzs7CiYjNDM7CQkJdHhfYnl0ZXMgJiM0Mzs9IHNrYi0mZ3Q7bGVuOwomIzQzOwkJfQogCQl0eF9idWYtJmd0O3NrYiA9IE5VTEw7CiAJCXR4X2J1Zi0mZ3Q7aXNfdHNfcGt0ID0gMDsKIAogCQlpZiAodHhfYnVmLSZndDtpc19wdXNoKSB7CiAJCQl0eF9idWYtJmd0O2lzX3B1c2ggPSAwOwomIzQzOwkJCWNvbnMgJiM0Mzs9IHR4X2J1Zi0mZ3Q7aW5saW5lX2RhdGFfYmRzOwomIzQzOwkJCXR4X2J1Zi0mZ3Q7aW5saW5lX2RhdGFfYmRzID0gMDsKJiM0MzsJCQlpZiAoIXNrYikgewomIzQzOwkJCQkvKiBwcmVzeW5jIEJEICovCiYjNDM7CQkJCWNvbnMgPSBORVhUX1RYKGNvbnMpOwomIzQzOwkJCQljb250aW51ZTsKJiM0MzsJCQl9CiAJCQlnb3RvIG5leHRfdHhfaW50OwogCQl9CiAKQEAgLTMxMTMsNiAmIzQzOzMxNDUsOSBAQCBzdGF0aWMgaW50IF9fYm54dF9wb2xsX3dvcmsoc3RydWN0IGJueHQgKmJwLCBzdHJ1Y3QgYm54dF9jcF9yaW5nX2luZm8gKmNwciwKIAkJCQlyeF9wa3RzJiM0MzsmIzQzOzsKIAkJCWVsc2UgaWYgKHJjID09IC1FQlVTWSkJLyogcGFydGlhbCBjb21wbGV0aW9uICovCiAJCQkJYnJlYWs7CiYjNDM7CQl9IGVsc2UgaWYgKGNtcF90eXBlID09IENNUF9UWVBFX01QQ19DTVApIHsKJiM0MzsJCQlpZiAoYm54dF9tcGNfY21wKGJwLCBjcHIsICZhbXA7cmF3X2NvbnMpKQomIzQzOwkJCQlicmVhazsKIAkJfSBlbHNlIGlmICh1bmxpa2VseShjbXBfdHlwZSA9PSBDTVBMX0JBU0VfVFlQRV9IV1JNX0RPTkUgfHwKIAkJCQkgICAgY21wX3R5cGUgPT0gQ01QTF9CQVNFX1RZUEVfSFdSTV9GV0RfUkVRIHx8CiAJCQkJICAgIGNtcF90eXBlID09IENNUExfQkFTRV9UWVBFX0hXUk1fQVNZTkNfRVZFTlQpKSB7CkBAIC0zNjg0LDcgJiM0MzszNzE5LDcgQEAgc3RhdGljIHNpemVfdCBfX2JueHRfY29weV9yaW5nKHN0cnVjdCBibnh0ICpicCwgc3RydWN0IGJueHRfcmluZ19tZW1faW5mbyAqcm1lbSwKIAlyZXR1cm4gdG90YWxfbGVuOwogfQogCi1zdGF0aWMgdm9pZCBibnh0X2ZyZWVfcmluZyhzdHJ1Y3QgYm54dCAqYnAsIHN0cnVjdCBibnh0X3JpbmdfbWVtX2luZm8gKnJtZW0pCiYjNDM7dm9pZCBibnh0X2ZyZWVfcmluZyhzdHJ1Y3QgYm54dCAqYnAsIHN0cnVjdCBibnh0X3JpbmdfbWVtX2luZm8gKnJtZW0pCiB7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBicC0mZ3Q7cGRldjsKIAlpbnQgaTsKQEAgLTM3MTcsNyAmIzQzOzM3NTIsNyBAQCBzdGF0aWMgdm9pZCBibnh0X2ZyZWVfcmluZyhzdHJ1Y3QgYm54dCAqYnAsIHN0cnVjdCBibnh0X3JpbmdfbWVtX2luZm8gKnJtZW0pCiAJfQogfQogCi1zdGF0aWMgaW50IGJueHRfYWxsb2NfcmluZyhzdHJ1Y3QgYm54dCAqYnAsIHN0cnVjdCBibnh0X3JpbmdfbWVtX2luZm8gKnJtZW0pCiYjNDM7aW50IGJueHRfYWxsb2NfcmluZyhzdHJ1Y3QgYm54dCAqYnAsIHN0cnVjdCBibnh0X3JpbmdfbWVtX2luZm8gKnJtZW0pCiB7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBicC0mZ3Q7cGRldjsKIAl1NjQgdmFsaWRfYml0ID0gMDsKQEAgLTQwNzksNiAmIzQzOzQxMTQsOCBAQCBzdGF0aWMgdm9pZCBibnh0X2ZyZWVfdHhfcmluZ3Moc3RydWN0IGJueHQgKmJwKQogCiAJCWJueHRfZnJlZV90eF9pbmxpbmVfYnVmKHR4ciwgcGRldik7CiAKJiM0MzsJCWJueHRfa3Rsc19mcmVlX3R4X3Jpbmdfc3RhdHModHhyKTsKJiM0MzsKIAkJcmluZyA9ICZhbXA7dHhyLSZndDt0eF9yaW5nX3N0cnVjdDsKIAogCQlibnh0X2ZyZWVfcmluZyhicCwgJmFtcDtyaW5nLSZndDtyaW5nX21lbSk7CkBAIC00MTUzLDcgJiM0Mzs0MTkwLDEwIEBAIHN0YXRpYyBpbnQgYm54dF9hbGxvY190eF9yaW5ncyhzdHJ1Y3QgYm54dCAqYnApCiAJCX0KIAkJcWlkeCA9IGJwLSZndDt0Y190b19xaWR4W2pdOwogCQlyaW5nLSZndDtxdWV1ZV9pZCA9IGJwLSZndDtxX2luZm9bcWlkeF0ucXVldWVfaWQ7Ci0JCXNwaW5fbG9ja19pbml0KCZhbXA7dHhyLSZndDt4ZHBfdHhfbG9jayk7CiYjNDM7CQlzcGluX2xvY2tfaW5pdCgmYW1wO3R4ci0mZ3Q7dHhfbG9jayk7CiYjNDM7CQlyYyA9IGJueHRfa3Rsc19hbGxvY190eF9yaW5nX3N0YXRzKGJwLCB0eHIpOwomIzQzOwkJaWYgKHJjKQomIzQzOwkJCXJldHVybiByYzsKIAkJaWYgKGkgJmx0OyBicC0mZ3Q7dHhfbnJfcmluZ3NfeGRwKQogCQkJY29udGludWU7CiAJCWlmIChCTlhUX1JJTkdfVE9fVENfT0ZGKGJwLCBpKSA9PSAoYnAtJmd0O3R4X25yX3JpbmdzX3Blcl90YyAtIDEpKQpAQCAtNDMyNCw2ICYjNDM7NDM2NCw4IEBAIHN0YXRpYyBpbnQgYm54dF9hbGxvY19jcF9yaW5ncyhzdHJ1Y3QgYm54dCAqYnApCiAJCQkgKCFzaCAmYW1wOyZhbXA7IGkgJmd0Oz0gYnAtJmd0O3J4X25yX3JpbmdzKSkgewogCQkJY3BfY291bnQgJiM0Mzs9IHRjczsKIAkJCXR4ID0gMTsKJiM0MzsJCQlpZiAoYm54dF9uYXBpX2hhc19tcGMoYnAsIGkpKQomIzQzOwkJCQljcF9jb3VudCYjNDM7JiM0Mzs7CiAJCX0KIAogCQljcHItJmd0O2NwX3JpbmdfYXJyID0ga3phbGxvY19vYmpzKCpjcHIsIGNwX2NvdW50KTsKQEAgLTQzNDUsNiAmIzQzOzQzODcsMTEgQEAgc3RhdGljIGludCBibnh0X2FsbG9jX2NwX3JpbmdzKHN0cnVjdCBibnh0ICpicCkKIAkJCX0gZWxzZSB7CiAJCQkJaW50IG4sIHRjID0gayAtIHJ4OwogCiYjNDM7CQkJCS8qIE1QQyByaW5ncyBhcmUgYXQgdGhlIGhpZ2hlc3QgayBpbmRpY2VzICovCiYjNDM7CQkJCWlmICh0YyAmZ3Q7PSB0Y3MpIHsKJiM0MzsJCQkJCWJueHRfc2V0X21wY19jcF9yaW5nKGJwLCBpLCBjcHIyKTsKJiM0MzsJCQkJCWNvbnRpbnVlOwomIzQzOwkJCQl9CiAJCQkJbiA9IEJOWFRfVENfVE9fUklOR19CQVNFKGJwLCB0YykgJiM0MzsgajsKIAkJCQlicC0mZ3Q7dHhfcmluZ1tuXS50eF9jcHIgPSBjcHIyOwogCQkJCWNwcjItJmd0O2NwX3JpbmdfdHlwZSA9IEJOWFRfTlFfSERMX1RZUEVfVFg7CkBAIC00NDc3LDYgJiM0Mzs0NTI0LDcgQEAgc3RhdGljIHZvaWQgYm54dF9pbml0X3Jpbmdfc3RydWN0KHN0cnVjdCBibnh0ICpicCkKIAkJCXJtZW0tJmd0O3ZtZW0gPSAodm9pZCAqKikmYW1wO3R4ci0mZ3Q7dHhfYnVmX3Jpbmc7CiAJCX0KIAl9CiYjNDM7CWJueHRfaW5pdF9tcGNfcmluZ19zdHJ1Y3QoYnApOwogfQogCiBzdGF0aWMgdm9pZCBibnh0X2luaXRfcnhiZF9wYWdlcyhzdHJ1Y3QgYm54dF9yaW5nX3N0cnVjdCAqcmluZywgdTMyIHR5cGUpCkBAIC01NTUzLDYgJiM0Mzs1NjAxLDcgQEAgc3RhdGljIHZvaWQgYm54dF9pbml0X2wyX2ZsdHJfdGJsKHN0cnVjdCBibnh0ICpicCkKIHN0YXRpYyB2b2lkIGJueHRfZnJlZV9tZW0oc3RydWN0IGJueHQgKmJwLCBib29sIGlycV9yZV9pbml0KQogewogCWJueHRfZnJlZV92bmljX2F0dHJpYnV0ZXMoYnApOwomIzQzOwlibnh0X2ZyZWVfbXBjX3JpbmdzKGJwKTsKIAlibnh0X2ZyZWVfdHhfcmluZ3MoYnApOwogCWJueHRfZnJlZV9yeF9yaW5ncyhicCk7CiAJYm54dF9mcmVlX2NwX3JpbmdzKGJwKTsKQEAgLTU1NjYsNiAmIzQzOzU2MTUsNyBAQCBzdGF0aWMgdm9pZCBibnh0X2ZyZWVfbWVtKHN0cnVjdCBibnh0ICpicCwgYm9vbCBpcnFfcmVfaW5pdCkKIAkJCWJueHRfZnJlZV9wb3J0X3N0YXRzKGJwKTsKIAkJYm54dF9mcmVlX3JpbmdfZ3JwcyhicCk7CiAJCWJueHRfZnJlZV92bmljcyhicCk7CiYjNDM7CQlibnh0X2ZyZWVfbXBjcyhicCk7CiAJCWtmcmVlKGJwLSZndDt0eF9yaW5nX21hcCk7CiAJCWJwLSZndDt0eF9yaW5nX21hcCA9IE5VTEw7CiAJCWtmcmVlKGJwLSZndDt0eF9yaW5nKTsKQEAgLTU2NzUsNiAmIzQzOzU3MjUsMTAgQEAgc3RhdGljIGludCBibnh0X2FsbG9jX21lbShzdHJ1Y3QgYm54dCAqYnAsIGJvb2wgaXJxX3JlX2luaXQpCiAJCQkJdHhyLSZndDt0eF9jcHIgPSAmYW1wO2JuYXBpMi0mZ3Q7Y3BfcmluZzsKIAkJfQogCiYjNDM7CQlyYyA9IGJueHRfYWxsb2NfbXBjcyhicCk7CiYjNDM7CQlpZiAocmMpCiYjNDM7CQkJZ290byBhbGxvY19tZW1fZXJyOwomIzQzOwogCQlyYyA9IGJueHRfYWxsb2Nfc3RhdHMoYnApOwogCQlpZiAocmMpCiAJCQlnb3RvIGFsbG9jX21lbV9lcnI7CkBAIC01NzAzLDYgJiM0Mzs1NzU3LDEwIEBAIHN0YXRpYyBpbnQgYm54dF9hbGxvY19tZW0oc3RydWN0IGJueHQgKmJwLCBib29sIGlycV9yZV9pbml0KQogCWlmIChyYykKIAkJZ290byBhbGxvY19tZW1fZXJyOwogCiYjNDM7CXJjID0gYm54dF9hbGxvY19tcGNfcmluZ3MoYnApOwomIzQzOwlpZiAocmMpCiYjNDM7CQlnb3RvIGFsbG9jX21lbV9lcnI7CiYjNDM7CiAJcmMgPSBibnh0X2FsbG9jX2NwX3JpbmdzKGJwKTsKIAlpZiAocmMpCiAJCWdvdG8gYWxsb2NfbWVtX2VycjsKQEAgLTcyNTcsMTAgJiM0Mzs3MzE1LDE1IEBAIHN0YXRpYyBpbnQgaHdybV9yaW5nX2FsbG9jX3NlbmRfbXNnKHN0cnVjdCBibnh0ICpicCwKIAkJcmVxLSZndDtjbXBsX3JpbmdfaWQgPSBjcHVfdG9fbGUxNihibnh0X2NwX3JpbmdfZm9yX3R4KGJwLCB0eHIpKTsKIAkJcmVxLSZndDtsZW5ndGggPSBjcHVfdG9fbGUzMihicC0mZ3Q7dHhfcmluZ19tYXNrICYjNDM7IDEpOwogCQlyZXEtJmd0O3N0YXRfY3R4X2lkID0gY3B1X3RvX2xlMzIoZ3JwX2luZm8tJmd0O2Z3X3N0YXRzX2N0eCk7Ci0JCXJlcS0mZ3Q7cXVldWVfaWQgPSBjcHVfdG9fbGUxNihyaW5nLSZndDtxdWV1ZV9pZCk7Ci0JCWlmIChicC0mZ3Q7ZmxhZ3MgJmFtcDsgQk5YVF9GTEFHX1RYX0NPQUxfQ01QTCkKLQkJCXJlcS0mZ3Q7Y21wbF9jb2FsX2NudCA9Ci0JCQkJUklOR19BTExPQ19SRVFfQ01QTF9DT0FMX0NOVF9DT0FMXzY0OwomIzQzOwkJaWYgKHJpbmctJmd0O3F1ZXVlX2lkID09IEJOWFRfTVBDX1FVRVVFX0lEKSB7CiYjNDM7CQkJcmVxLSZndDttcGNfY2hubHNfdHlwZSA9IHJpbmctJmd0O21wY19jaG5sX3R5cGU7CiYjNDM7CQkJcmVxLSZndDtlbmFibGVzIHw9IGNwdV90b19sZTMyKFJJTkdfQUxMT0NfUkVRX0VOQUJMRVNfTVBDX0NITkxTX1RZUEUpOwomIzQzOwkJfSBlbHNlIHsKJiM0MzsJCQlyZXEtJmd0O3F1ZXVlX2lkID0gY3B1X3RvX2xlMTYocmluZy0mZ3Q7cXVldWVfaWQpOwomIzQzOwkJCWlmIChicC0mZ3Q7ZmxhZ3MgJmFtcDsgQk5YVF9GTEFHX1RYX0NPQUxfQ01QTCkKJiM0MzsJCQkJcmVxLSZndDtjbXBsX2NvYWxfY250ID0KJiM0MzsJCQkJCVJJTkdfQUxMT0NfUkVRX0NNUExfQ09BTF9DTlRfQ09BTF82NDsKJiM0MzsJCX0KIAkJaWYgKChicC0mZ3Q7ZndfY2FwICZhbXA7IEJOWFRfRldfQ0FQX1RYX1RTX0NNUCkgJmFtcDsmYW1wOyBicC0mZ3Q7cHRwX2NmZykKIAkJCWZsYWdzIHw9IFJJTkdfQUxMT0NfUkVRX0ZMQUdTX1RYX1BLVF9UU19DTVBMX0VOQUJMRTsKIAkJcmVxLSZndDtmbGFncyA9IGNwdV90b19sZTE2KGZsYWdzKTsKQEAgLTc0NTUsOCAmIzQzOzc1MTgsNyBAQCBzdGF0aWMgaW50IGJueHRfaHdybV9yeF9hZ2dfcmluZ19hbGxvYyhzdHJ1Y3QgYm54dCAqYnAsCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgYm54dF9od3JtX2NwX3JpbmdfYWxsb2NfcDUoc3RydWN0IGJueHQgKmJwLAotCQkJCSAgICAgIHN0cnVjdCBibnh0X2NwX3JpbmdfaW5mbyAqY3ByKQomIzQzO2ludCBibnh0X2h3cm1fY3BfcmluZ19hbGxvY19wNShzdHJ1Y3QgYm54dCAqYnAsIHN0cnVjdCBibnh0X2NwX3JpbmdfaW5mbyAqY3ByKQogewogCWNvbnN0IHUzMiB0eXBlID0gSFdSTV9SSU5HX0FMTE9DX0NNUEw7CiAJc3RydWN0IGJueHRfbmFwaSAqYm5hcGkgPSBjcHItJmd0O2JuYXBpOwpAQCAtNzQ3NCw4ICYjNDM7NzUzNiw4IEBAIHN0YXRpYyBpbnQgYm54dF9od3JtX2NwX3JpbmdfYWxsb2NfcDUoc3RydWN0IGJueHQgKmJwLAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGJueHRfaHdybV90eF9yaW5nX2FsbG9jKHN0cnVjdCBibnh0ICpicCwKLQkJCQkgICBzdHJ1Y3QgYm54dF90eF9yaW5nX2luZm8gKnR4ciwgdTMyIHR4X2lkeCkKJiM0MztpbnQgYm54dF9od3JtX3R4X3JpbmdfYWxsb2Moc3RydWN0IGJueHQgKmJwLCBzdHJ1Y3QgYm54dF90eF9yaW5nX2luZm8gKnR4ciwKJiM0MzsJCQkgICAgdTMyIHR4X2lkeCkKIHsKIAlzdHJ1Y3QgYm54dF9yaW5nX3N0cnVjdCAqcmluZyA9ICZhbXA7dHhyLSZndDt0eF9yaW5nX3N0cnVjdDsKIAljb25zdCB1MzIgdHlwZSA9IEhXUk1fUklOR19BTExPQ19UWDsKQEAgLTc1NjAsNiAmIzQzOzc2MjIsOSBAQCBzdGF0aWMgaW50IGJueHRfaHdybV9yaW5nX2FsbG9jKHN0cnVjdCBibnh0ICpicCkKIAkJCQlnb3RvIGVycl9vdXQ7CiAJCX0KIAl9CiYjNDM7CiYjNDM7CXJjID0gYm54dF9od3JtX21wY19yaW5nX2FsbG9jKGJwKTsKJiM0MzsKIGVycl9vdXQ6CiAJcmV0dXJuIHJjOwogfQpAQCAtNzYxNyw5ICYjNDM7NzY4Miw4IEBAIHN0YXRpYyBpbnQgaHdybV9yaW5nX2ZyZWVfc2VuZF9tc2coc3RydWN0IGJueHQgKmJwLAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBibnh0X2h3cm1fdHhfcmluZ19mcmVlKHN0cnVjdCBibnh0ICpicCwKLQkJCQkgICBzdHJ1Y3QgYm54dF90eF9yaW5nX2luZm8gKnR4ciwKLQkJCQkgICBib29sIGNsb3NlX3BhdGgpCiYjNDM7dm9pZCBibnh0X2h3cm1fdHhfcmluZ19mcmVlKHN0cnVjdCBibnh0ICpicCwgc3RydWN0IGJueHRfdHhfcmluZ19pbmZvICp0eHIsCiYjNDM7CQkJICAgIGJvb2wgY2xvc2VfcGF0aCkKIHsKIAlzdHJ1Y3QgYm54dF9yaW5nX3N0cnVjdCAqcmluZyA9ICZhbXA7dHhyLSZndDt0eF9yaW5nX3N0cnVjdDsKIAl1MzIgY21wbF9yaW5nX2lkOwpAQCAtNzY3OCw4ICYjNDM7Nzc0Miw3IEBAIHN0YXRpYyB2b2lkIGJueHRfaHdybV9yeF9hZ2dfcmluZ19mcmVlKHN0cnVjdCBibnh0ICpicCwKIAlicC0mZ3Q7Z3JwX2luZm9bZ3JwX2lkeF0uYWdnX2Z3X3JpbmdfaWQgPSBJTlZBTElEX0hXX1JJTkdfSUQ7CiB9CiAKLXN0YXRpYyB2b2lkIGJueHRfaHdybV9jcF9yaW5nX2ZyZWUoc3RydWN0IGJueHQgKmJwLAotCQkJCSAgIHN0cnVjdCBibnh0X2NwX3JpbmdfaW5mbyAqY3ByKQomIzQzO3ZvaWQgYm54dF9od3JtX2NwX3JpbmdfZnJlZShzdHJ1Y3QgYm54dCAqYnAsIHN0cnVjdCBibnh0X2NwX3JpbmdfaW5mbyAqY3ByKQogewogCXN0cnVjdCBibnh0X3Jpbmdfc3RydWN0ICpyaW5nOwogCkBAIC03NjkyLDcgJiM0Mzs3NzU1LDcgQEAgc3RhdGljIHZvaWQgYm54dF9od3JtX2NwX3JpbmdfZnJlZShzdHJ1Y3QgYm54dCAqYnAsCiAJcmluZy0mZ3Q7ZndfcmluZ19pZCA9IElOVkFMSURfSFdfUklOR19JRDsKIH0KIAotc3RhdGljIHZvaWQgYm54dF9jbGVhcl9vbmVfY3BfcmluZyhzdHJ1Y3QgYm54dCAqYnAsIHN0cnVjdCBibnh0X2NwX3JpbmdfaW5mbyAqY3ByKQomIzQzO3ZvaWQgYm54dF9jbGVhcl9vbmVfY3BfcmluZyhzdHJ1Y3QgYm54dCAqYnAsIHN0cnVjdCBibnh0X2NwX3JpbmdfaW5mbyAqY3ByKQogewogCXN0cnVjdCBibnh0X3Jpbmdfc3RydWN0ICpyaW5nID0gJmFtcDtjcHItJmd0O2NwX3Jpbmdfc3RydWN0OwogCWludCBpLCBzaXplID0gcmluZy0mZ3Q7cmluZ19tZW0ucGFnZV9zaXplOwpAQCAtNzcxMyw2ICYjNDM7Nzc3Niw4IEBAIHN0YXRpYyB2b2lkIGJueHRfaHdybV9yaW5nX2ZyZWUoc3RydWN0IGJueHQgKmJwLCBib29sIGNsb3NlX3BhdGgpCiAJaWYgKCFicC0mZ3Q7Ym5hcGkpCiAJCXJldHVybjsKIAomIzQzOwlibnh0X2h3cm1fbXBjX3JpbmdfZnJlZShicCwgY2xvc2VfcGF0aCk7CiYjNDM7CiAJZm9yIChpID0gMDsgaSAmbHQ7IGJwLSZndDt0eF9ucl9yaW5nczsgaSYjNDM7JiM0MzspCiAJCWJueHRfaHdybV90eF9yaW5nX2ZyZWUoYnAsICZhbXA7YnAtJmd0O3R4X3JpbmdbaV0sIGNsb3NlX3BhdGgpOwogCkBAIC03NzUxLDYgJiM0Mzs3ODE2LDExIEBAIHN0YXRpYyB2b2lkIGJueHRfaHdybV9yaW5nX2ZyZWUoc3RydWN0IGJueHQgKmJwLCBib29sIGNsb3NlX3BhdGgpCiAJfQogfQogCiYjNDM7aW50IGJueHRfdG90YWxfdHhfcmluZ3Moc3RydWN0IGJueHQgKmJwKQomIzQzO3sKJiM0MzsJcmV0dXJuIGJwLSZndDt0eF9ucl9yaW5ncyAmIzQzOyBibnh0X21wY190eF9yaW5nc19pbl91c2UoYnApOwomIzQzO30KJiM0MzsKIHN0YXRpYyBpbnQgX19ibnh0X3RyaW1fcmluZ3Moc3RydWN0IGJueHQgKmJwLCBpbnQgKnJ4LCBpbnQgKnR4LCBpbnQgbWF4LAogCQkJICAgICBib29sIHNoYXJlZCk7CiBzdGF0aWMgaW50IGJueHRfdHJpbV9yaW5ncyhzdHJ1Y3QgYm54dCAqYnAsIGludCAqcngsIGludCAqdHgsIGludCBtYXgsCkBAIC03NzU5LDYgJiM0Mzs3ODI5LDcgQEAgc3RhdGljIGludCBibnh0X3RyaW1fcmluZ3Moc3RydWN0IGJueHQgKmJwLCBpbnQgKnJ4LCBpbnQgKnR4LCBpbnQgbWF4LAogc3RhdGljIGludCBibnh0X2h3cm1fZ2V0X3JpbmdzKHN0cnVjdCBibnh0ICpicCkKIHsKIAlzdHJ1Y3QgYm54dF9od19yZXNjICpod19yZXNjID0gJmFtcDticC0mZ3Q7aHdfcmVzYzsKJiM0MzsJc3RydWN0IGJueHRfaHdfY3J5cHRvX3Jlc2MgKmNyeXB0b19yZXNjOwogCXN0cnVjdCBod3JtX2Z1bmNfcWNmZ19vdXRwdXQgKnJlc3A7CiAJc3RydWN0IGh3cm1fZnVuY19xY2ZnX2lucHV0ICpyZXE7CiAJaW50IHJjOwpAQCAtNzc5MSwyNSAmIzQzOzc4NjIsMzggQEAgc3RhdGljIGludCBibnh0X2h3cm1fZ2V0X3JpbmdzKHN0cnVjdCBibnh0ICpicCkKIAkJc3RhdHMgPSBsZTE2X3RvX2NwdShyZXNwLSZndDthbGxvY19zdGF0X2N0eCk7CiAJCWh3X3Jlc2MtJmd0O3Jlc3ZfaXJxcyA9IGNwOwogCQlpZiAoYnAtJmd0O2ZsYWdzICZhbXA7IEJOWFRfRkxBR19DSElQX1A1X1BMVVMpIHsKJiM0MzsJCQlpbnQgbXBjX3R4ID0gYm54dF9tcGNfdHhfcmluZ3NfaW5fdXNlKGJwKTsKJiM0MzsJCQlpbnQgbXBjX2NwID0gYm54dF9tcGNfY3BfcmluZ3NfaW5fdXNlKGJwKTsKIAkJCWludCByeCA9IGh3X3Jlc2MtJmd0O3Jlc3ZfcnhfcmluZ3M7CiAJCQlpbnQgdHggPSBod19yZXNjLSZndDtyZXN2X3R4X3JpbmdzOwomIzQzOwkJCWludCBjcF9wNTsKIAomIzQzOwkJCWlmICh0eCAmbHQ7PSBtcGNfdHggfHwgY3AgJmx0Oz0gbXBjX2NwKSB7CiYjNDM7CQkJCXJjID0gLUVOT01FTTsKJiM0MzsJCQkJZ290byBnZXRfcmluZ3NfZXhpdDsKJiM0MzsJCQl9CiYjNDM7CQkJdHggLT0gbXBjX3R4OwomIzQzOwkJCWNwX3A1ID0gY3AgLSBtcGNfY3A7CiAJCQlpZiAoYnAtJmd0O2ZsYWdzICZhbXA7IEJOWFRfRkxBR19BR0dfUklOR1MpCiAJCQkJcnggJmd0OyZndDs9IDE7Ci0JCQlpZiAoY3AgJmx0OyAocnggJiM0MzsgdHgpKSB7Ci0JCQkJcmMgPSBfX2JueHRfdHJpbV9yaW5ncyhicCwgJmFtcDtyeCwgJmFtcDt0eCwgY3AsIGZhbHNlKTsKJiM0MzsJCQlpZiAoY3BfcDUgJmx0OyAocnggJiM0MzsgdHgpKSB7CiYjNDM7CQkJCXJjID0gX19ibnh0X3RyaW1fcmluZ3MoYnAsICZhbXA7cngsICZhbXA7dHgsIGNwX3A1LCBmYWxzZSk7CiAJCQkJaWYgKHJjKQogCQkJCQlnb3RvIGdldF9yaW5nc19leGl0OwogCQkJCWlmIChicC0mZ3Q7ZmxhZ3MgJmFtcDsgQk5YVF9GTEFHX0FHR19SSU5HUykKIAkJCQkJcnggJmx0OyZsdDs9IDE7CiAJCQkJaHdfcmVzYy0mZ3Q7cmVzdl9yeF9yaW5ncyA9IHJ4OwotCQkJCWh3X3Jlc2MtJmd0O3Jlc3ZfdHhfcmluZ3MgPSB0eDsKJiM0MzsJCQkJaHdfcmVzYy0mZ3Q7cmVzdl90eF9yaW5ncyA9IHR4ICYjNDM7IG1wY190eDsKIAkJCX0KIAkJCWh3X3Jlc2MtJmd0O3Jlc3ZfaXJxcyA9IGxlMTZfdG9fY3B1KHJlc3AtJmd0O2FsbG9jX21zaXgpOwogCQkJaHdfcmVzYy0mZ3Q7cmVzdl9od19yaW5nX2dycHMgPSByeDsKIAkJfQogCQlod19yZXNjLSZndDtyZXN2X2NwX3JpbmdzID0gY3A7CiAJCWh3X3Jlc2MtJmd0O3Jlc3Zfc3RhdF9jdHhzID0gc3RhdHM7CiYjNDM7CiYjNDM7CQljcnlwdG9fcmVzYyA9ICZhbXA7aHdfcmVzYy0mZ3Q7Y3J5cHRvX3Jlc2M7CiYjNDM7CQljcnlwdG9fcmVzYy0mZ3Q7cmVzdl90eF9rZXlfY3R4cyA9IGxlMzJfdG9fY3B1KHJlc3AtJmd0O251bV9rdGxzX3R4X2tleV9jdHhzKTsKJiM0MzsJCWNyeXB0b19yZXNjLSZndDtyZXN2X3J4X2tleV9jdHhzID0gbGUzMl90b19jcHUocmVzcC0mZ3Q7bnVtX2t0bHNfcnhfa2V5X2N0eHMpOwogCX0KIGdldF9yaW5nc19leGl0OgogCWh3cm1fcmVxX2Ryb3AoYnAsIHJlcSk7CkBAIC03ODgwLDggJiM0Mzs3OTY0LDkgQEAgX19ibnh0X2h3cm1fcmVzZXJ2ZV9wZl9yaW5ncyhzdHJ1Y3QgYm54dCAqYnAsIHN0cnVjdCBibnh0X2h3X3JpbmdzICpod3IpCiAJCX0KIAkJcmVxLSZndDtudW1fc3RhdF9jdHhzID0gY3B1X3RvX2xlMTYoaHdyLSZndDtzdGF0KTsKIAkJcmVxLSZndDtudW1fdm5pY3MgPSBjcHVfdG9fbGUxNihod3ItJmd0O3ZuaWMpOwomIzQzOwkJYm54dF9od3JtX3Jlc2VydmVfcGZfa2V5X2N0eHMoYnAsIHJlcSk7CiAJfQotCXJlcS0mZ3Q7ZW5hYmxlcyA9IGNwdV90b19sZTMyKGVuYWJsZXMpOwomIzQzOwlyZXEtJmd0O2VuYWJsZXMgfD0gY3B1X3RvX2xlMzIoZW5hYmxlcyk7CiAJcmV0dXJuIHJlcTsKIH0KIApAQCAtNzk5NSw3ICYjNDM7ODA4MCw3IEBAIHN0YXRpYyBpbnQgYm54dF9jcF9yaW5nc19pbl91c2Uoc3RydWN0IGJueHQgKmJwKQogCQlyZXR1cm4gYm54dF9ucV9yaW5nc19pbl91c2UoYnApOwogCiAJY3AgPSBicC0mZ3Q7dHhfbnJfcmluZ3MgJiM0MzsgYnAtJmd0O3J4X25yX3JpbmdzOwotCXJldHVybiBjcDsKJiM0MzsJcmV0dXJuIGNwICYjNDM7IGJueHRfbXBjX2NwX3JpbmdzX2luX3VzZShicCk7CiB9CiAKIHN0YXRpYyBpbnQgYm54dF9nZXRfZnVuY19zdGF0X2N0eHMoc3RydWN0IGJueHQgKmJwKQpAQCAtODA1Myw3ICYjNDM7ODEzOCw3IEBAIHN0YXRpYyB2b2lkIGJueHRfZ2V0X3RvdGFsX3Jlc291cmNlcyhzdHJ1Y3QgYm54dCAqYnAsIHN0cnVjdCBibnh0X2h3X3JpbmdzICpod3IpCiAJaHdyLSZndDtjcF9wNSA9IDA7CiAJaWYgKGJwLSZndDtmbGFncyAmYW1wOyBCTlhUX0ZMQUdfQ0hJUF9QNV9QTFVTKQogCQlod3ItJmd0O2NwX3A1ID0gYm54dF9jcF9yaW5nc19pbl91c2UoYnApOwotCWh3ci0mZ3Q7dHggPSBicC0mZ3Q7dHhfbnJfcmluZ3M7CiYjNDM7CWh3ci0mZ3Q7dHggPSBibnh0X3RvdGFsX3R4X3JpbmdzKGJwKTsKIAlod3ItJmd0O3J4ID0gYnAtJmd0O3J4X25yX3JpbmdzOwogCWh3ci0mZ3Q7Z3JwID0gaHdyLSZndDtyeDsKIAlod3ItJmd0O3ZuaWMgPSBibnh0X2dldF90b3RhbF92bmljcyhicCwgaHdyLSZndDtyeCk7CkBAIC04MTU5LDggJiM0Mzs4MjQ0LDEwIEBAIHN0YXRpYyBpbnQgX19ibnh0X3Jlc2VydmVfcmluZ3Moc3RydWN0IGJueHQgKmJwKQogCWh3ci5yeCA9IGJwLSZndDtyeF9ucl9yaW5nczsKIAlpZiAoYnAtJmd0O2ZsYWdzICZhbXA7IEJOWFRfRkxBR19TSEFSRURfUklOR1MpCiAJCXNoID0gdHJ1ZTsKLQlpZiAoYnAtJmd0O2ZsYWdzICZhbXA7IEJOWFRfRkxBR19DSElQX1A1X1BMVVMpCi0JCWh3ci5jcF9wNSA9IGh3ci5yeCAmIzQzOyBod3IudHg7CiYjNDM7CWlmIChicC0mZ3Q7ZmxhZ3MgJmFtcDsgQk5YVF9GTEFHX0NISVBfUDVfUExVUykgewomIzQzOwkJaHdyLmNwX3A1ID0gaHdyLnJ4ICYjNDM7IGh3ci50eCAmIzQzOyBibnh0X21wY19jcF9yaW5nc19pbl91c2UoYnApOwomIzQzOwkJaHdyLnR4ICYjNDM7PSBibnh0X21wY190eF9yaW5nc19pbl91c2UoYnApOwomIzQzOwl9CiAKIAlod3Iudm5pYyA9IGJueHRfZ2V0X3RvdGFsX3ZuaWNzKGJwLCBod3IucngpOwogCkBAIC04MTk3LDYgJiM0Mzs4Mjg0LDkgQEAgc3RhdGljIGludCBfX2JueHRfcmVzZXJ2ZV9yaW5ncyhzdHJ1Y3QgYm54dCAqYnApCiAJaWYgKGJueHRfdWxwX3JlZ2lzdGVyZWQoZWRldikgJmFtcDsmYW1wOyBod3Iuc3RhdCAmZ3Q7IGJueHRfZ2V0X3VscF9zdGF0X2N0eHMoYnApKQogCQlod3Iuc3RhdCAtPSBibnh0X2dldF91bHBfc3RhdF9jdHhzKGJwKTsKIAlod3IuY3AgPSBtaW5fdChpbnQsIGh3ci5jcCwgaHdyLnN0YXQpOwomIzQzOwlod3IudHggLT0gYm54dF9tcGNfdHhfcmluZ3NfaW5fdXNlKGJwKTsKJiM0MzsJaWYgKGh3ci50eCAmbHQ7IDApCiYjNDM7CQlyZXR1cm4gLUVOT01FTTsKIAlyYyA9IGJueHRfdHJpbV9yaW5ncyhicCwgJmFtcDtyeF9yaW5ncywgJmFtcDtod3IudHgsIGh3ci5jcCwgc2gpOwogCWlmIChicC0mZ3Q7ZmxhZ3MgJmFtcDsgQk5YVF9GTEFHX0FHR19SSU5HUykKIAkJaHdyLnJ4ID0gcnhfcmluZ3MgJmx0OyZsdDsgMTsKQEAgLTgyNzgsNyAmIzQzOzgzNjgsNyBAQCBzdGF0aWMgaW50IGJueHRfaHdybV9jaGVja192Zl9yaW5ncyhzdHJ1Y3QgYm54dCAqYnAsIHN0cnVjdCBibnh0X2h3X3JpbmdzICpod3IpCiBzdGF0aWMgaW50IGJueHRfaHdybV9jaGVja19wZl9yaW5ncyhzdHJ1Y3QgYm54dCAqYnAsIHN0cnVjdCBibnh0X2h3X3JpbmdzICpod3IpCiB7CiAJc3RydWN0IGh3cm1fZnVuY19jZmdfaW5wdXQgKnJlcTsKLQl1MzIgZmxhZ3M7CiYjNDM7CXUzMiBmbGFncywgZmxhZ3MyID0gMDsKIAogCXJlcSA9IF9fYm54dF9od3JtX3Jlc2VydmVfcGZfcmluZ3MoYnAsIGh3cik7CiAJZmxhZ3MgPSBGVU5DX0NGR19SRVFfRkxBR1NfVFhfQVNTRVRTX1RFU1Q7CkBAIC04MjkyLDkgJiM0Mzs4MzgyLDE0IEBAIHN0YXRpYyBpbnQgYm54dF9od3JtX2NoZWNrX3BmX3JpbmdzKHN0cnVjdCBibnh0ICpicCwgc3RydWN0IGJueHRfaHdfcmluZ3MgKmh3cikKIAkJCQkgRlVOQ19DRkdfUkVRX0ZMQUdTX05RX0FTU0VUU19URVNUOwogCQllbHNlCiAJCQlmbGFncyB8PSBGVU5DX0NGR19SRVFfRkxBR1NfUklOR19HUlBfQVNTRVRTX1RFU1Q7CiYjNDM7CQlpZiAocmVxLSZndDtlbmFibGVzICZhbXA7CiYjNDM7CQkgICAgY3B1X3RvX2xlMzIoRlVOQ19DRkdfUkVRX0VOQUJMRVNfS1RMU19UWF9LRVlfQ1RYUyB8CiYjNDM7CQkJCUZVTkNfQ0ZHX1JFUV9FTkFCTEVTX0tUTFNfUlhfS0VZX0NUWFMpKQomIzQzOwkJCWZsYWdzMiB8PSBGVU5DX0NGR19SRVFfRkxBR1MyX0tUTFNfS0VZX0NUWF9BU1NFVFNfVEVTVDsKIAl9CiAKIAlyZXEtJmd0O2ZsYWdzID0gY3B1X3RvX2xlMzIoZmxhZ3MpOwomIzQzOwlyZXEtJmd0O2ZsYWdzMiA9IGNwdV90b19sZTMyKGZsYWdzMik7CiAJcmV0dXJuIGh3cm1fcmVxX3NlbmRfc2lsZW50KGJwLCByZXEpOwogfQogCkBAIC05MzMxLDEyICYjNDM7OTQyNiwzNSBAQCBzdGF0aWMgaW50IGJueHRfaHdybV9mdW5jX2JhY2tpbmdfc3RvcmVfY2ZnX3YyKHN0cnVjdCBibnh0ICpicCwKIAogc3RhdGljIGludCBibnh0X2JhY2tpbmdfc3RvcmVfY2ZnX3YyKHN0cnVjdCBibnh0ICpicCkKIHsKJiM0MzsJc3RydWN0IGJueHRfY3J5cHRvX2luZm8gKmNyeXB0byA9IGJwLSZndDtjcnlwdG9faW5mbzsKJiM0MzsJc3RydWN0IGJueHRfbXBjX2luZm8gKm1wYyA9IGJwLSZndDttcGNfaW5mbzsKIAlzdHJ1Y3QgYm54dF9jdHhfbWVtX2luZm8gKmN0eCA9IGJwLSZndDtjdHg7CiAJc3RydWN0IGJueHRfY3R4X21lbV90eXBlICpjdHhtOwogCXUxNiBsYXN0X3R5cGUgPSBCTlhUX0NUWF9JTlY7CiAJaW50IHJjID0gMDsKIAl1MTYgdHlwZTsKIAomIzQzOwlpZiAoQk5YVF9TVVBQT1JUU19LVExTKGJwKSkgewomIzQzOwkJY3R4bSA9ICZhbXA7Y3R4LSZndDtjdHhfYXJyW0JOWFRfQ1RYX1RDS107CiYjNDM7CQlyYyA9IGJueHRfc2V0dXBfY3R4bV9wZ190YmxzKGJwLCBjdHhtLAomIzQzOwkJCQkJICAgICBCTlhUX1RDSyhjcnlwdG8pLm1heF9jdHgsIDEpOwomIzQzOwkJaWYgKHJjKQomIzQzOwkJCXJldHVybiByYzsKJiM0MzsJCWN0eG0gPSAmYW1wO2N0eC0mZ3Q7Y3R4X2FycltCTlhUX0NUWF9SQ0tdOwomIzQzOwkJcmMgPSBibnh0X3NldHVwX2N0eG1fcGdfdGJscyhicCwgY3R4bSwKJiM0MzsJCQkJCSAgICAgQk5YVF9SQ0soY3J5cHRvKS5tYXhfY3R4LCAxKTsKJiM0MzsJCWlmIChyYykKJiM0MzsJCQlyZXR1cm4gcmM7CiYjNDM7CQlsYXN0X3R5cGUgPSBCTlhUX0NUWF9SQ0s7CiYjNDM7CX0KJiM0MzsJaWYgKG1wYyAmYW1wOyZhbXA7IG1wYy0mZ3Q7bXBjX2NobmxzX2NhcCkgewomIzQzOwkJY3R4bSA9ICZhbXA7Y3R4LSZndDtjdHhfYXJyW0JOWFRfQ1RYX01UUU1dOwomIzQzOwkJcmMgPSBibnh0X3NldHVwX2N0eG1fcGdfdGJscyhicCwgY3R4bSwgY3R4bS0mZ3Q7bWF4X2VudHJpZXMsIDEpOwomIzQzOwkJaWYgKHJjKQomIzQzOwkJCXJldHVybiByYzsKJiM0MzsJCWxhc3RfdHlwZSA9IEJOWFRfQ1RYX01UUU07CiYjNDM7CX0KJiM0MzsKIAlmb3IgKHR5cGUgPSBCTlhUX0NUWF9TUlQ7IHR5cGUgJmx0Oz0gQk5YVF9DVFhfUVBDOyB0eXBlJiM0MzsmIzQzOykgewogCQljdHhtID0gJmFtcDtjdHgtJmd0O2N0eF9hcnJbdHlwZV07CiAJCWlmICghYm54dF9ic190cmFjZV9hdmFpbChicCwgdHlwZSkpCkBAIC05Njg1LDYgJiM0Mzs5ODAzLDcgQEAgaW50IGJueHRfaHdybV9mdW5jX3Jlc2NfcWNhcHMoc3RydWN0IGJueHQgKmJwLCBib29sIGFsbCkKIAlzdHJ1Y3QgaHdybV9mdW5jX3Jlc291cmNlX3FjYXBzX291dHB1dCAqcmVzcDsKIAlzdHJ1Y3QgaHdybV9mdW5jX3Jlc291cmNlX3FjYXBzX2lucHV0ICpyZXE7CiAJc3RydWN0IGJueHRfaHdfcmVzYyAqaHdfcmVzYyA9ICZhbXA7YnAtJmd0O2h3X3Jlc2M7CiYjNDM7CXN0cnVjdCBibnh0X2h3X2NyeXB0b19yZXNjICpjcnlwdG9fcmVzYzsKIAlpbnQgcmM7CiAKIAlyYyA9IGh3cm1fcmVxX2luaXQoYnAsIHJlcSwgSFdSTV9GVU5DX1JFU09VUkNFX1FDQVBTKTsKQEAgLTk3MjIsNiAmIzQzOzk4NDEsMTIgQEAgaW50IGJueHRfaHdybV9mdW5jX3Jlc2NfcWNhcHMoc3RydWN0IGJueHQgKmJwLCBib29sIGFsbCkKIAkgICAgaHdfcmVzYy0mZ3Q7bWF4X3ZuaWNzICogQk5YVF9MQVJHRV9SU1NfVE9fVk5JQ19SQVRJTykKIAkJYnAtJmd0O3Jzc19jYXAgfD0gQk5YVF9SU1NfQ0FQX0xBUkdFX1JTU19DVFg7CiAKJiM0MzsJY3J5cHRvX3Jlc2MgPSAmYW1wO2h3X3Jlc2MtJmd0O2NyeXB0b19yZXNjOwomIzQzOwljcnlwdG9fcmVzYy0mZ3Q7bWluX3R4X2tleV9jdHhzID0gbGUzMl90b19jcHUocmVzcC0mZ3Q7bWluX2t0bHNfdHhfa2V5X2N0eHMpOwomIzQzOwljcnlwdG9fcmVzYy0mZ3Q7bWF4X3R4X2tleV9jdHhzID0gbGUzMl90b19jcHUocmVzcC0mZ3Q7bWF4X2t0bHNfdHhfa2V5X2N0eHMpOwomIzQzOwljcnlwdG9fcmVzYy0mZ3Q7bWluX3J4X2tleV9jdHhzID0gbGUzMl90b19jcHUocmVzcC0mZ3Q7bWluX2t0bHNfcnhfa2V5X2N0eHMpOwomIzQzOwljcnlwdG9fcmVzYy0mZ3Q7bWF4X3J4X2tleV9jdHhzID0gbGUzMl90b19jcHUocmVzcC0mZ3Q7bWF4X2t0bHNfcnhfa2V5X2N0eHMpOwomIzQzOwogCWlmIChicC0mZ3Q7ZmxhZ3MgJmFtcDsgQk5YVF9GTEFHX0NISVBfUDVfUExVUykgewogCQl1MTYgbWF4X21zaXggPSBsZTE2X3RvX2NwdShyZXNwLSZndDttYXhfbXNpeCk7CiAKQEAgLTk4NzEsNiAmIzQzOzk5OTYsMTAgQEAgc3RhdGljIGludCBfX2JueHRfaHdybV9mdW5jX3FjYXBzKHN0cnVjdCBibnh0ICpicCkKIAkJYnAtJmd0O2Z3X2NhcCB8PSBCTlhUX0ZXX0NBUF9CQUNLSU5HX1NUT1JFX1YyOwogCWlmIChmbGFnc19leHQgJmFtcDsgRlVOQ19RQ0FQU19SRVNQX0ZMQUdTX0VYVF9UWF9DT0FMX0NNUExfQ0FQKQogCQlicC0mZ3Q7ZmxhZ3MgfD0gQk5YVF9GTEFHX1RYX0NPQUxfQ01QTDsKJiM0MzsJaWYgKGZsYWdzX2V4dCAmYW1wOyBGVU5DX1FDQVBTX1JFU1BfRkxBR1NfRVhUX0tUTFNfU1VQUE9SVEVEKQomIzQzOwkJYm54dF9hbGxvY19jcnlwdG9faW5mbyhicCwgcmVzcCk7CiYjNDM7CWVsc2UKJiM0MzsJCWJwLSZndDtmd19jYXAgJmFtcDs9IH5CTlhUX0ZXX0NBUF9LVExTOwogCiAJZmxhZ3NfZXh0MiA9IGxlMzJfdG9fY3B1KHJlc3AtJmd0O2ZsYWdzX2V4dDIpOwogCWlmIChmbGFnc19leHQyICZhbXA7IEZVTkNfUUNBUFNfUkVTUF9GTEFHU19FWFQyX1JYX0FMTF9QS1RTX1RJTUVTVEFNUFNfU1VQUE9SVEVEKQpAQCAtOTk0Myw2ICYjNDM7MTAwNzIsMTEgQEAgc3RhdGljIGludCBfX2JueHRfaHdybV9mdW5jX3FjYXBzKHN0cnVjdCBibnh0ICpicCkKIAl9CiAJYnAtJmd0O3Rzb19tYXhfc2VncyA9IGxlMTZfdG9fY3B1KHJlc3AtJmd0O21heF90c29fc2Vncyk7CiAKJiM0MzsJaWYgKHJlc3AtJmd0O21wY19jaG5sc19jYXApCiYjNDM7CQlibnh0X2FsbG9jX21wY19pbmZvKGJwLCByZXNwLSZndDttcGNfY2hubHNfY2FwKTsKJiM0MzsJZWxzZQomIzQzOwkJYm54dF9mcmVlX21wY19pbmZvKGJwKTsKJiM0MzsKIGh3cm1fZnVuY19xY2Fwc19leGl0OgogCWh3cm1fcmVxX2Ryb3AoYnAsIHJlcSk7CiAJcmV0dXJuIHJjOwpAQCAtMTEzMjEsNiAmIzQzOzExNDU1LDcgQEAgc3RhdGljIGludCBibnh0X2luaXRfbmljKHN0cnVjdCBibnh0ICpicCwgYm9vbCBpcnFfcmVfaW5pdCkKIAlibnh0X2luaXRfY3BfcmluZ3MoYnApOwogCWJueHRfaW5pdF9yeF9yaW5ncyhicCk7CiAJYm54dF9pbml0X3R4X3JpbmdzKGJwKTsKJiM0MzsJYm54dF9pbml0X21wY19yaW5ncyhicCk7CiAJYm54dF9pbml0X3JpbmdfZ3JwcyhicCwgaXJxX3JlX2luaXQpOwogCWJueHRfaW5pdF92bmljcyhicCk7CiAKQEAgLTExNTA5LDE0ICYjNDM7MTE2NDQsMTUgQEAgdW5zaWduZWQgaW50IGJueHRfZ2V0X21heF9mdW5jX2NwX3JpbmdzKHN0cnVjdCBibnh0ICpicCkKIAlyZXR1cm4gYnAtJmd0O2h3X3Jlc2MubWF4X2NwX3JpbmdzOwogfQogCi1zdGF0aWMgdW5zaWduZWQgaW50IGJueHRfZ2V0X21heF9mdW5jX2NwX3JpbmdzX2Zvcl9lbihzdHJ1Y3QgYm54dCAqYnApCiYjNDM7c3RhdGljIHVuc2lnbmVkIGludCBibnh0X2dldF9tYXhfZnVuY19jcF9yaW5nc19mb3JfZW4oc3RydWN0IGJueHQgKmJwLAomIzQzOwkJCQkJCSAgICAgIHVuc2lnbmVkIGludCBtcGNfY3ApCiB7CiAJdW5zaWduZWQgaW50IGNwID0gYnAtJmd0O2h3X3Jlc2MubWF4X2NwX3JpbmdzOwogCiAJaWYgKCEoYnAtJmd0O2ZsYWdzICZhbXA7IEJOWFRfRkxBR19DSElQX1A1X1BMVVMpKQogCQljcCAtPSBibnh0X2dldF91bHBfbXNpeF9udW0oYnApOwogCi0JcmV0dXJuIGNwOwomIzQzOwlyZXR1cm4gbXBjX2NwICZndDs9IGNwID8gMCA6IGNwIC0gbXBjX2NwOwogfQogCiBzdGF0aWMgdW5zaWduZWQgaW50IGJueHRfZ2V0X21heF9mdW5jX2lycXMoc3RydWN0IGJueHQgKmJwKQpAQCAtMTE1MzgsNyAmIzQzOzExNjc0LDcgQEAgdW5zaWduZWQgaW50IGJueHRfZ2V0X2F2YWlsX2NwX3JpbmdzX2Zvcl9lbihzdHJ1Y3QgYm54dCAqYnApCiB7CiAJdW5zaWduZWQgaW50IGNwOwogCi0JY3AgPSBibnh0X2dldF9tYXhfZnVuY19jcF9yaW5nc19mb3JfZW4oYnApOwomIzQzOwljcCA9IGJueHRfZ2V0X21heF9mdW5jX2NwX3JpbmdzX2Zvcl9lbihicCwgYm54dF9tcGNfY3BfcmluZ3NfaW5fdXNlKGJwKSk7CiAJaWYgKGJwLSZndDtmbGFncyAmYW1wOyBCTlhUX0ZMQUdfQ0hJUF9QNV9QTFVTKQogCQlyZXR1cm4gY3AgLSBicC0mZ3Q7cnhfbnJfcmluZ3MgLSBicC0mZ3Q7dHhfbnJfcmluZ3M7CiAJZWxzZQpAQCAtMTI4MDEsNiAmIzQzOzEyOTM3LDggQEAgc3RhdGljIGludCBibnh0X2h3cm1faWZfY2hhbmdlKHN0cnVjdCBibnh0ICpicCwgYm9vbCB1cCkKIAkJCQlibnh0X3VscF9pcnFfc3RvcChicCk7CiAJCQlibnh0X2ZyZWVfY3R4X21lbShicCwgZmFsc2UpOwogCQkJYm54dF9kY2JfZnJlZShicCk7CiYjNDM7CQkJaWYgKGZ3X3Jlc2V0IHx8IGNhcHNfY2hhbmdlKQomIzQzOwkJCQlibnh0X2NsZWFyX2NyeXB0byhicCk7CiAJCQlyYyA9IGJueHRfZndfaW5pdF9vbmUoYnApOwogCQkJaWYgKHJjKSB7CiAJCQkJY2xlYXJfYml0KEJOWFRfU1RBVEVfRldfUkVTRVRfREVULCAmYW1wO2JwLSZndDtzdGF0ZSk7CkBAIC0xMzE3MCw2ICYjNDM7MTMzMDgsNyBAQCBzdGF0aWMgaW50IF9fYm54dF9vcGVuX25pYyhzdHJ1Y3QgYm54dCAqYnAsIGJvb2wgaXJxX3JlX2luaXQsIGJvb2wgbGlua19yZV9pbml0KQogCQlyZXR1cm4gcmM7CiAKIAlibnh0X2Fkal90eF9yaW5ncyhicCk7CiYjNDM7CWJueHRfdHJpbV9tcGNfcmluZ3MoYnApOwogCXJjID0gYm54dF9hbGxvY19tZW0oYnAsIGlycV9yZV9pbml0KTsKIAlpZiAocmMpIHsKIAkJbmV0ZGV2X2VycihicC0mZ3Q7ZGV2LCAmIzM0O2JueHRfYWxsb2NfbWVtIGVycjogJXhcbiYjMzQ7LCByYyk7CkBAIC0xMzIyMiw2ICYjNDM7MTMzNjEsNyBAQCBzdGF0aWMgaW50IF9fYm54dF9vcGVuX25pYyhzdHJ1Y3QgYm54dCAqYnAsIGJvb2wgaXJxX3JlX2luaXQsIGJvb2wgbGlua19yZV9pbml0KQogCQlzdGF0aWNfYnJhbmNoX2Rpc2FibGUoJmFtcDtibnh0X3hkcF9sb2NraW5nX2tleSk7CiAJfQogCXNldF9iaXQoQk5YVF9TVEFURV9PUEVOLCAmYW1wO2JwLSZndDtzdGF0ZSk7CiYjNDM7CWJueHRfa3Rsc193YWtlKGJwKTsKIAlibnh0X2VuYWJsZV9pbnQoYnApOwogCS8qIEVuYWJsZSBUWCBxdWV1ZXMgKi8KIAlibnh0X3R4X2VuYWJsZShicCk7CkBAIC0xMzM2Myw3ICYjNDM7MTM1MDMsOCBAQCBzdGF0aWMgaW50IGJueHRfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogc3RhdGljIGJvb2wgYm54dF9kcnZfYnVzeShzdHJ1Y3QgYm54dCAqYnApCiB7CiAJcmV0dXJuICh0ZXN0X2JpdChCTlhUX1NUQVRFX0lOX1NQX1RBU0ssICZhbXA7YnAtJmd0O3N0YXRlKSB8fAotCQl0ZXN0X2JpdChCTlhUX1NUQVRFX1JFQURfU1RBVFMsICZhbXA7YnAtJmd0O3N0YXRlKSk7CiYjNDM7CQl0ZXN0X2JpdChCTlhUX1NUQVRFX1JFQURfU1RBVFMsICZhbXA7YnAtJmd0O3N0YXRlKSB8fAomIzQzOwkJYm54dF9rdGxzX2J1c3koYnApKTsKIH0KIAogc3RhdGljIHZvaWQgYm54dF9nZXRfcmluZ19zdGF0cyhzdHJ1Y3QgYm54dCAqYnAsCkBAIC0xMzM4MSw5ICYjNDM7MTM1MjIsMjAgQEAgc3RhdGljIHZvaWQgX19ibnh0X2Nsb3NlX25pYyhzdHJ1Y3QgYm54dCAqYnAsIGJvb2wgaXJxX3JlX2luaXQsCiAKIAljbGVhcl9iaXQoQk5YVF9TVEFURV9PUEVOLCAmYW1wO2JwLSZndDtzdGF0ZSk7CiAJc21wX21iX19hZnRlcl9hdG9taWMoKTsKJiM0MzsJLyogV2FrZSBhbnkga1RMUyBkZWxldGUgd2FpdGluZyBvbiBhIHJlY29uZmlnIHNvIGl0IHJlLWV2YWx1YXRlcyBhbmQKJiM0MzsJICogZWl0aGVyIGtlZXBzIHdhaXRpbmcgZm9yIHRoZSByZW9wZW4gb3IgYWJvcnRzIChpZmRvd24gLyBGVyByZXNldCkuCiYjNDM7CSAqLwomIzQzOwlibnh0X2t0bHNfd2FrZShicCk7CiAJd2hpbGUgKGJueHRfZHJ2X2J1c3koYnApKQogCQltc2xlZXAoMjApOwogCiYjNDM7CS8qIERlbGV0ZSBhbGwgY3J5cHRvIGNvbm5lY3Rpb25zIGFuZCBLSURzIG9ubHkgb24gaWZkb3duIGFuZCBGVyByZXNldCwKJiM0MzsJICogbm90IGV0aHRvb2wgY29uZmlnIGNoYW5nZXMuCiYjNDM7CSAqLwomIzQzOwlpZiAoIW5ldGlmX3J1bm5pbmcoYnAtJmd0O2RldikgfHwKJiM0MzsJICAgIHRlc3RfYml0KEJOWFRfU1RBVEVfSU5fRldfUkVTRVQsICZhbXA7YnAtJmd0O3N0YXRlKSkKJiM0MzsJCWJueHRfY3J5cHRvX2RlbF9hbGwoYnApOwomIzQzOwogCWlmIChCTlhUX1NVUFBPUlRTX01VTFRJX1JTU19DVFgoYnApKQogCQlibnh0X2NsZWFyX3Jzc19jdHhzKGJwKTsKIAkvKiBGbHVzaCByaW5ncyBhbmQgZGlzYWJsZSBpbnRlcnJ1cHRzICovCkBAIC0xNDMyMCw3ICYjNDM7MTQ0NzIsNyBAQCBzdGF0aWMgaW50IGJueHRfaHdybV9yeF9yaW5nX3Jlc2V0KHN0cnVjdCBibnh0ICpicCwgaW50IHJpbmdfbnIpCiAJcmV0dXJuIGh3cm1fcmVxX3NlbmRfc2lsZW50KGJwLCByZXEpOwogfQogCi1zdGF0aWMgdm9pZCBibnh0X3Jlc2V0X3Rhc2soc3RydWN0IGJueHQgKmJwLCBib29sIHNpbGVudCkKJiM0Mzt2b2lkIGJueHRfcmVzZXRfdGFzayhzdHJ1Y3QgYm54dCAqYnAsIGJvb2wgc2lsZW50KQogewogCWlmICghc2lsZW50KQogCQlibnh0X2RiZ19kdW1wX3N0YXRlcyhicCk7CkBAIC0xNDUzNyw2ICYjNDM7MTQ2ODksNyBAQCBzdGF0aWMgdm9pZCBibnh0X2Z3X3Jlc2V0X2Nsb3NlKHN0cnVjdCBibnh0ICpicCkKIAlibnh0X2h3cm1fZnVuY19kcnZfdW5yZ3RyKGJwKTsKIAlpZiAocGNpX2lzX2VuYWJsZWQoYnAtJmd0O3BkZXYpKQogCQlwY2lfZGlzYWJsZV9kZXZpY2UoYnAtJmd0O3BkZXYpOwomIzQzOwlibnh0X2NsZWFyX2NyeXB0byhicCk7CiAJYm54dF9mcmVlX2N0eF9tZW0oYnAsIGZhbHNlKTsKIH0KIApAQCAtMTQ3NjgsNiAmIzQzOzE0OTIxLDEzIEBAIHN0YXRpYyB2b2lkIGJueHRfdWxwX3Jlc3RhcnQoc3RydWN0IGJueHQgKmJwKQogCWJueHRfdWxwX3N0YXJ0KGJwKTsKIH0KIAomIzQzO3N0YXRpYyB2b2lkIGJueHRfbXBjX3JpbmdfcmVzZXRfc3Aoc3RydWN0IGJueHQgKmJwKQomIzQzO3sKJiM0MzsJYm54dF9ydG5sX2xvY2tfc3AoYnApOwomIzQzOwlibnh0X21wY19yaW5nX3Jlc2V0X3Rhc2soYnApOwomIzQzOwlibnh0X3J0bmxfdW5sb2NrX3NwKGJwKTsKJiM0Mzt9CiYjNDM7CiBzdGF0aWMgdm9pZCBibnh0X3NwX3Rhc2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewogCXN0cnVjdCBibnh0ICpicCA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYm54dCwgc3BfdGFzayk7CkBAIC0xNDg2MCw2ICYjNDM7MTUwMjAsOSBAQCBzdGF0aWMgdm9pZCBibnh0X3NwX3Rhc2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoQk5YVF9SU1RfUklOR19TUF9FVkVOVCwgJmFtcDticC0mZ3Q7c3BfZXZlbnQpKQogCQlibnh0X3J4X3JpbmdfcmVzZXQoYnApOwogCiYjNDM7CWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoQk5YVF9NUENfUkVTRVRfU1BfRVZFTlQsICZhbXA7YnAtJmd0O3NwX2V2ZW50KSkKJiM0MzsJCWJueHRfbXBjX3JpbmdfcmVzZXRfc3AoYnApOwomIzQzOwogCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoQk5YVF9GV19SRVNFVF9OT1RJRllfU1BfRVZFTlQsICZhbXA7YnAtJmd0O3NwX2V2ZW50KSkgewogCQlpZiAodGVzdF9iaXQoQk5YVF9TVEFURV9GV19GQVRBTF9DT05ELCAmYW1wO2JwLSZndDtzdGF0ZSkgfHwKIAkJICAgIHRlc3RfYml0KEJOWFRfU1RBVEVfRldfTk9OX0ZBVEFMX0NPTkQsICZhbXA7YnAtJmd0O3N0YXRlKSkKQEAgLTE0ODc4LDExICYjNDM7MTUwNDEsMTEgQEAgc3RhdGljIHZvaWQgYm54dF9zcF90YXNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIH0KIAogc3RhdGljIHZvaWQgX2JueHRfZ2V0X21heF9yaW5ncyhzdHJ1Y3QgYm54dCAqYnAsIGludCAqbWF4X3J4LCBpbnQgKm1heF90eCwKLQkJCQlpbnQgKm1heF9jcCk7CiYjNDM7CQkJCWludCAqbWF4X2NwLCBpbnQgbXBjX3R4LCBpbnQgbXBjX2NwKTsKIAogLyogVW5kZXIgbmV0ZGV2IGluc3RhbmNlIGxvY2sgKi8KIGludCBibnh0X2NoZWNrX3JpbmdzKHN0cnVjdCBibnh0ICpicCwgaW50IHR4LCBpbnQgcngsIGJvb2wgc2gsIGludCB0Y3MsCi0JCSAgICAgaW50IHR4X3hkcCkKJiM0MzsJCSAgICAgaW50IHR4X3hkcCwgaW50IG1wY190eCwgaW50IG1wY19jcCkKIHsKIAlpbnQgbWF4X3J4LCBtYXhfdHgsIG1heF9jcCwgdHhfc2V0cyA9IDEsIHR4X2NwOwogCXN0cnVjdCBibnh0X2h3X3JpbmdzIGh3ciA9IHswfTsKQEAgLTE0ODkyLDcgJiM0MzsxNTA1NSw3IEBAIGludCBibnh0X2NoZWNrX3JpbmdzKHN0cnVjdCBibnh0ICpicCwgaW50IHR4LCBpbnQgcngsIGJvb2wgc2gsIGludCB0Y3MsCiAJaWYgKHRjcykKIAkJdHhfc2V0cyA9IHRjczsKIAotCV9ibnh0X2dldF9tYXhfcmluZ3MoYnAsICZhbXA7bWF4X3J4LCAmYW1wO21heF90eCwgJmFtcDttYXhfY3ApOwomIzQzOwlfYm54dF9nZXRfbWF4X3JpbmdzKGJwLCAmYW1wO21heF9yeCwgJmFtcDttYXhfdHgsICZhbXA7bWF4X2NwLCBtcGNfdHgsIG1wY19jcCk7CiAKIAlpZiAobWF4X3J4ICZsdDsgcnhfcmluZ3MpCiAJCXJldHVybiAtRU5PTUVNOwpAQCAtMTQ5MTgsOCAmIzQzOzE1MDgxLDEwIEBAIGludCBibnh0X2NoZWNrX3JpbmdzKHN0cnVjdCBibnh0ICpicCwgaW50IHR4LCBpbnQgcngsIGJvb2wgc2gsIGludCB0Y3MsCiAJCWh3ci5ncnAgPSByeDsKIAkJaHdyLnJzc19jdHggPSBibnh0X2dldF90b3RhbF9yc3NfY3R4cyhicCwgJmFtcDtod3IpOwogCX0KLQlpZiAoYnAtJmd0O2ZsYWdzICZhbXA7IEJOWFRfRkxBR19DSElQX1A1X1BMVVMpCi0JCWh3ci5jcF9wNSA9IGh3ci50eCAmIzQzOyByeDsKJiM0MzsJaWYgKGJwLSZndDtmbGFncyAmYW1wOyBCTlhUX0ZMQUdfQ0hJUF9QNV9QTFVTKSB7CiYjNDM7CQlod3IuY3BfcDUgPSBod3IudHggJiM0MzsgcnggJiM0MzsgbXBjX2NwOwomIzQzOwkJaHdyLnR4ICYjNDM7PSBtcGNfdHg7CiYjNDM7CX0KIAlyYyA9IGJueHRfaHdybV9jaGVja19yaW5ncyhicCwgJmFtcDtod3IpOwogCWlmICghcmMgJmFtcDsmYW1wOyBwY2lfbXNpeF9jYW5fYWxsb2NfZHluKGJwLSZndDtwZGV2KSkgewogCQlpZiAoIWJueHRfdWxwX3JlZ2lzdGVyZWQoYnAtJmd0O2VkZXZbQk5YVF9BVVhERVZfUkRNQV0pKSB7CkBAIC0xNTY0MCw3ICYjNDM7MTU4MDUsOSBAQCBpbnQgYm54dF9zZXR1cF9tcV90YyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCB0YykKIAkJc2ggPSB0cnVlOwogCiAJcmMgPSBibnh0X2NoZWNrX3JpbmdzKGJwLCBicC0mZ3Q7dHhfbnJfcmluZ3NfcGVyX3RjLCBicC0mZ3Q7cnhfbnJfcmluZ3MsCi0JCQkgICAgICBzaCwgdGMsIGJwLSZndDt0eF9ucl9yaW5nc194ZHApOwomIzQzOwkJCSAgICAgIHNoLCB0YywgYnAtJmd0O3R4X25yX3JpbmdzX3hkcCwKJiM0MzsJCQkgICAgICBibnh0X21wY190eF9yaW5nc19pbl91c2UoYnApLAomIzQzOwkJCSAgICAgIGJueHRfbXBjX2NwX3JpbmdzX2luX3VzZShicCkpOwogCWlmIChyYykKIAkJcmV0dXJuIHJjOwogCkBAIC0xNjU0Nyw2ICYjNDM7MTY3MTQsOCBAQCBzdGF0aWMgdm9pZCBibnh0X3JlbW92ZV9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCiAJYnAtJmd0O3B0cF9jZmcgPSBOVUxMOwogCWtmcmVlKGJwLSZndDtmd19oZWFsdGgpOwogCWJwLSZndDtmd19oZWFsdGggPSBOVUxMOwomIzQzOwlibnh0X2ZyZWVfY3J5cHRvX2luZm8oYnApOwomIzQzOwlibnh0X2ZyZWVfbXBjX2luZm8oYnApOwogCWJueHRfY2xlYW51cF9wY2koYnApOwogCWJueHRfZnJlZV9jdHhfbWVtKGJwLCB0cnVlKTsKIAlibnh0X2ZyZWVfY3Jhc2hfZHVtcF9tZW0oYnApOwpAQCAtMTY2MTEsMTQgJiM0MzsxNjc4MCwxNCBAQCBzdGF0aWMgaW50IGJueHRfZ2V0X21heF9pcnEoc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB9CiAKIHN0YXRpYyB2b2lkIF9ibnh0X2dldF9tYXhfcmluZ3Moc3RydWN0IGJueHQgKmJwLCBpbnQgKm1heF9yeCwgaW50ICptYXhfdHgsCi0JCQkJaW50ICptYXhfY3ApCiYjNDM7CQkJCWludCAqbWF4X2NwLCBpbnQgbXBjX3R4LCBpbnQgbXBjX2NwKQogewogCXN0cnVjdCBibnh0X2h3X3Jlc2MgKmh3X3Jlc2MgPSAmYW1wO2JwLSZndDtod19yZXNjOwogCWludCBtYXhfcmluZ19ncnBzID0gMCwgbWF4X2lycTsKIAotCSptYXhfdHggPSBod19yZXNjLSZndDttYXhfdHhfcmluZ3M7CiYjNDM7CSptYXhfdHggPSBtYXgoMCwgKGludClod19yZXNjLSZndDttYXhfdHhfcmluZ3MgLSBtcGNfdHgpOwogCSptYXhfcnggPSBod19yZXNjLSZndDttYXhfcnhfcmluZ3M7Ci0JKm1heF9jcCA9IGJueHRfZ2V0X21heF9mdW5jX2NwX3JpbmdzX2Zvcl9lbihicCk7CiYjNDM7CSptYXhfY3AgPSBibnh0X2dldF9tYXhfZnVuY19jcF9yaW5nc19mb3JfZW4oYnAsIG1wY19jcCk7CiAJbWF4X2lycSA9IG1pbl90KGludCwgYm54dF9nZXRfbWF4X2Z1bmNfaXJxcyhicCkgLQogCQkJYm54dF9nZXRfdWxwX21zaXhfbnVtX2luX3VzZShicCksCiAJCQlod19yZXNjLSZndDttYXhfc3RhdF9jdHhzIC0KQEAgLTE2NjUwLDcgJiM0MzsxNjgxOSw4IEBAIGludCBibnh0X2dldF9tYXhfcmluZ3Moc3RydWN0IGJueHQgKmJwLCBpbnQgKm1heF9yeCwgaW50ICptYXhfdHgsIGJvb2wgc2hhcmVkKQogewogCWludCByeCwgdHgsIGNwOwogCi0JX2JueHRfZ2V0X21heF9yaW5ncyhicCwgJmFtcDtyeCwgJmFtcDt0eCwgJmFtcDtjcCk7CiYjNDM7CV9ibnh0X2dldF9tYXhfcmluZ3MoYnAsICZhbXA7cngsICZhbXA7dHgsICZhbXA7Y3AsIGJueHRfbXBjX3R4X3JpbmdzX2luX3VzZShicCksCiYjNDM7CQkJICAgIGJueHRfbXBjX2NwX3JpbmdzX2luX3VzZShicCkpOwogCSptYXhfcnggPSByeDsKIAkqbWF4X3R4ID0gdHg7CiAJaWYgKCFyeCB8fCAhdHggfHwgIWNwKQpAQCAtMTY3MTMsNiAmIzQzOzE2ODgzLDcgQEAgc3RhdGljIHZvaWQgYm54dF90cmltX2RmbHRfc2hfcmluZ3Moc3RydWN0IGJueHQgKmJwKQogCWJwLSZndDtyeF9ucl9yaW5ncyA9IGJwLSZndDtjcF9ucl9yaW5nczsKIAlicC0mZ3Q7dHhfbnJfcmluZ3NfcGVyX3RjID0gYnAtJmd0O2NwX25yX3JpbmdzOwogCWJwLSZndDt0eF9ucl9yaW5ncyA9IGJueHRfdHhfbnJfcmluZ3MoYnApOwomIzQzOwlibnh0X3RyaW1fbXBjX3JpbmdzKGJwKTsKIH0KIAogc3RhdGljIHZvaWQgYm54dF9hZGpfZGZsdF9yaW5ncyhzdHJ1Y3QgYm54dCAqYnAsIGJvb2wgc2gpCkBAIC0xNjc2NCw2ICYjNDM7MTY5MzUsOCBAQCBzdGF0aWMgaW50IGJueHRfc2V0X2RmbHRfcmluZ3Moc3RydWN0IGJueHQgKmJwLCBib29sIHNoKQogCQlibnh0X3NldF9kZmx0X3VscF9zdGF0X2N0eHMoYnApOwogCX0KIAomIzQzOwlibnh0X3NldF9kZmx0X21wY19yaW5ncyhicCk7CiYjNDM7CiAJcmMgPSBfX2JueHRfcmVzZXJ2ZV9yaW5ncyhicCk7CiAJaWYgKHJjICZhbXA7JmFtcDsgcmMgIT0gLUVOT0RFVikKIAkJbmV0ZGV2X3dhcm4oYnAtJmd0O2RldiwgJiMzNDtVbmFibGUgdG8gcmVzZXJ2ZSB0eCByaW5nc1xuJiMzNDspOwpAQCAtMTY3NzgsNiAmIzQzOzE2OTUxLDExIEBAIHN0YXRpYyBpbnQgYm54dF9zZXRfZGZsdF9yaW5ncyhzdHJ1Y3QgYm54dCAqYnAsIGJvb2wgc2gpCiAJCWlmIChyYyAmYW1wOyZhbXA7IHJjICE9IC1FTk9ERVYpCiAJCQluZXRkZXZfd2FybihicC0mZ3Q7ZGV2LCAmIzM0OzJuZCByaW5ncyByZXNlcnZhdGlvbiBmYWlsZWQuXG4mIzM0Oyk7CiAJCWJueHRfYWRqX3R4X3JpbmdzKGJwKTsKJiM0MzsJCS8qIFJlLWNhcCBNUEMgcmluZyBjb3VudHMgYWdhaW5zdCB0aGUgcmVkdWNlZCBUWCByaW5ncy4KJiM0MzsJCSAqIEFueSBleHRyYSByZXNlcnZlZCBNUEMgcmluZ3Mgd2lsbCBiZSByZWNvbmNpbGVkIG9uCiYjNDM7CQkgKiB0aGUgbmV4dCBvcGVuLgomIzQzOwkJICovCiYjNDM7CQlibnh0X3RyaW1fbXBjX3JpbmdzKGJwKTsKIAl9CiAJaWYgKEJOWFRfQ0hJUF9UWVBFX05JVFJPX0EwKGJwKSkgewogCQlicC0mZ3Q7cnhfbnJfcmluZ3MmIzQzOyYjNDM7OwpAQCAtMTY4MTIsNiAmIzQzOzE2OTkwLDcgQEAgc3RhdGljIGludCBibnh0X2luaXRfZGZsdF9yaW5nX21vZGUoc3RydWN0IGJueHQgKmJwKQogCQlnb3RvIGluaXRfZGZsdF9yaW5nX2VycjsKIAogCWJueHRfYWRqX3R4X3JpbmdzKGJwKTsKJiM0MzsJYm54dF90cmltX21wY19yaW5ncyhicCk7CiAKIAlibnh0X3NldF9kZmx0X3JmcyhicCk7CiAKQEAgLTE3MTU1LDYgJiM0MzsxNzMzNCw3IEBAIHN0YXRpYyBpbnQgYm54dF9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKIAkgKiBsaW1pdGVkIE1TSVgsIHNvIHdlIHJlLWluaXRpYWxpemUgdGhlIFRYIHJpbmdzIHBlciBUQy4KIAkgKi8KIAlicC0mZ3Q7dHhfbnJfcmluZ3NfcGVyX3RjID0gYnAtJmd0O3R4X25yX3JpbmdzOwomIzQzOwlibnh0X3RyaW1fbXBjX3JpbmdzKGJwKTsKIAogCWlmIChCTlhUX1BGKGJwKSkgewogCQlpZiAoIWJueHRfcGZfd3EpIHsKQEAgLTE3MTc2LDYgJiM0MzsxNzM1NiwxMiBAQCBzdGF0aWMgaW50IGJueHRfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCiAJcmMgPSBibnh0X2RsX3JlZ2lzdGVyKGJwKTsKIAlpZiAocmMpCiAJCWdvdG8gaW5pdF9lcnJfZGw7CiYjNDM7CXJjID0gYm54dF9jcnlwdG9faW5pdChicCk7CiYjNDM7CWlmIChyYykgewomIzQzOwkJYm54dF9mcmVlX2NyeXB0b19pbmZvKGJwKTsKJiM0MzsJCW5ldGRldl93YXJuKGJwLSZndDtkZXYsICYjMzQ7RmFpbGVkIHRvIGluaXRpYWxpemUgY3J5cHRvIG9mZmxvYWQsIGVyciA9ICVkXG4mIzM0OywKJiM0MzsJCQkgICAgcmMpOwomIzQzOwl9CiAKIAlJTklUX0xJU1RfSEVBRCgmYW1wO2JwLSZndDt1c3JfZmx0cl9saXN0KTsKIApAQCAtMTcyMTgsNiAmIzQzOzE3NDA0LDggQEAgc3RhdGljIGludCBibnh0X2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQogCWJueHRfZXRodG9vbF9mcmVlKGJwKTsKIAlrZnJlZShicC0mZ3Q7ZndfaGVhbHRoKTsKIAlicC0mZ3Q7ZndfaGVhbHRoID0gTlVMTDsKJiM0MzsJYm54dF9mcmVlX2NyeXB0b19pbmZvKGJwKTsKJiM0MzsJYm54dF9mcmVlX21wY19pbmZvKGJwKTsKIAlibnh0X2NsZWFudXBfcGNpKGJwKTsKIAlibnh0X2ZyZWVfY3R4X21lbShicCwgdHJ1ZSk7CiAJYm54dF9mcmVlX2NyYXNoX2R1bXBfbWVtKGJwKTsKQEAgLTE3NDAwLDYgJiM0MzsxNzU4OCw3IEBAIHN0YXRpYyBwY2lfZXJzX3Jlc3VsdF90IGJueHRfaW9fZXJyb3JfZGV0ZWN0ZWQoc3RydWN0IHBjaV9kZXYgKnBkZXYsCiAKIAlpZiAocGNpX2lzX2VuYWJsZWQocGRldikpCiAJCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKJiM0MzsJYm54dF9jbGVhcl9jcnlwdG8oYnApOwogCWJueHRfZnJlZV9jdHhfbWVtKGJwLCBmYWxzZSk7CiAJbmV0ZGV2X3VubG9jayhuZXRkZXYpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibnh0L2JueHQuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dC5oCmluZGV4IDYzMzVkZmMxNGM5ODViLi43MDk0N2JjYzMxMTZlZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9ibnh0LmgKJiM0MzsmIzQzOyYjNDM7IGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9ibnh0LmgKQEAgLTQ3LDYgJiM0Mzs0Nyw3IEBAIHN0cnVjdCB0eF9iZCB7CiAJX19sZTMyIHR4X2JkX2xlbl9mbGFnc190eXBlOwogCSNkZWZpbmUgVFhfQkRfVFlQRQkJCQkJKDB4M2YgJmx0OyZsdDsgMCkKIAkgI2RlZmluZSBUWF9CRF9UWVBFX1NIT1JUX1RYX0JECQkJCSAoMHgwMCAmbHQ7Jmx0OyAwKQomIzQzOwkgI2RlZmluZSBUWF9CRF9UWVBFX01QQ19UWF9CRAkJCQkgKDB4MDggJmx0OyZsdDsgMCkKIAkgI2RlZmluZSBUWF9CRF9UWVBFX0xPTkdfVFhfQkQJCQkJICgweDEwICZsdDsmbHQ7IDApCiAJI2RlZmluZSBUWF9CRF9GTEFHU19QQUNLRVRfRU5ECQkJCSgxICZsdDsmbHQ7IDYpCiAJI2RlZmluZSBUWF9CRF9GTEFHU19OT19DTVBMCQkJCSgxICZsdDsmbHQ7IDcpCkBAIC0xMDAsMTAgJiM0MzsxMDEsMTggQEAgc3RydWN0IHR4X2JkX2V4dCB7CiAJI2RlZmluZSBUWF9CRF9GTEFHU19MU08JCQkJCSgxICZsdDsmbHQ7IDUpCiAJI2RlZmluZSBUWF9CRF9GTEFHU19JUElEX0ZNVAkJCQkoMSAmbHQ7Jmx0OyA2KQogCSNkZWZpbmUgVFhfQkRfRkxBR1NfVF9JUElECQkJCSgxICZsdDsmbHQ7IDcpCiYjNDM7CSNkZWZpbmUgVFhfQkRfRkxBR1NfQ1JZUFRPX0VOCQkJCSgxICZsdDsmbHQ7IDE1KQogCSNkZWZpbmUgVFhfQkRfSFNJWkUJCQkJCSgweGZmICZsdDsmbHQ7IDE2KQogCSAjZGVmaW5lIFRYX0JEX0hTSVpFX1NISUZUCQkJCSAxNgotCi0JX19sZTMyIHR4X2JkX21zczsKJiM0MzsJI2RlZmluZSBUWF9CRF9LSURfTE8JCQkJCSgweDdmICZsdDsmbHQ7IDI1KQomIzQzOwkgI2RlZmluZSBUWF9CRF9LSURfTE9fTUFTSwkJCQkgMHg3ZgomIzQzOwkgI2RlZmluZSBUWF9CRF9LSURfTE9fU0hJRlQJCQkJIDI1CiYjNDM7CiYjNDM7CV9fbGUzMiB0eF9iZF9raWRfbXNzOwomIzQzOwkjZGVmaW5lIFRYX0JEX01TUwkJCQkJMHg3ZmZmCiYjNDM7CSNkZWZpbmUgVFhfQkRfS0lEX0hJCQkJCQkoMHgxZmZmZiAmbHQ7Jmx0OyAxNSkKJiM0MzsJICNkZWZpbmUgVFhfQkRfS0lEX0hJX01BU0sJCQkJIDB4ZmZmZjgwCiYjNDM7CSAjZGVmaW5lIFRYX0JEX0tJRF9ISV9TSElGVAkJCQkgOAogCV9fbGUzMiB0eF9iZF9jZmFfYWN0aW9uOwogCSNkZWZpbmUgVFhfQkRfQ0ZBX0FDVElPTgkJCQkoMHhmZmZmICZsdDsmbHQ7IDE2KQogCSAjZGVmaW5lIFRYX0JEX0NGQV9BQ1RJT05fU0hJRlQJCQkJIDE2CkBAIC0xMjEsNiAmIzQzOzEzMCwxNiBAQCBzdHJ1Y3QgdHhfYmRfZXh0IHsKIH07CiAKICNkZWZpbmUgQk5YVF9UWF9QVFBfSVNfU0VUKGxmbGFncykgKChsZmxhZ3MpICZhbXA7IGNwdV90b19sZTMyKFRYX0JEX0ZMQUdTX1NUQU1QKSkKJiM0MzsjZGVmaW5lIEJOWFRfVFhfS0lEX0xPKGtpZCkgKCgoa2lkKSAmYW1wOyBUWF9CRF9LSURfTE9fTUFTSykgJmx0OyZsdDsgVFhfQkRfS0lEX0xPX1NISUZUKQomIzQzOyNkZWZpbmUgQk5YVF9UWF9LSURfSEkoa2lkKSAoKChraWQpICZhbXA7IFRYX0JEX0tJRF9ISV9NQVNLKSAmbHQ7Jmx0OyBUWF9CRF9LSURfSElfU0hJRlQpCiYjNDM7CiYjNDM7c3RydWN0IHR4X2JkX3ByZXN5bmMgewomIzQzOwlfX2xlMzIgdHhfYmRfbGVuX2ZsYWdzX3R5cGU7CiYjNDM7CSAjZGVmaW5lIFRYX0JEX1RZUEVfUFJFU1lOQ19UWF9CRAkJCSAoMHgwOSAmbHQ7Jmx0OyAwKQomIzQzOwl1MzIgdHhfYmRfb3BhcXVlOwomIzQzOwlfX2xlMzIgdHhfYmRfa2lkOwomIzQzOwl1MzIgdHhfYmRfdW51c2VkOwomIzQzO307CiAKIHN0cnVjdCByeF9iZCB7CiAJX19sZTMyIHJ4X2JkX2xlbl9mbGFnc190eXBlOwpAQCAtMTYwLDYgJiM0MzsxNzksNyBAQCBzdHJ1Y3QgdHhfY21wIHsKIAkgI2RlZmluZSBDTVBfVFlQRV9SWF9UUEFfQUdHX0NNUAkJCSAyMgogCSAjZGVmaW5lIENNUF9UWVBFX1JYX0wyX1YzX0NNUAkJCQkgMjMKIAkgI2RlZmluZSBDTVBfVFlQRV9SWF9MMl9UUEFfU1RBUlRfVjNfQ01QCQkgMjUKJiM0MzsJICNkZWZpbmUgQ01QX1RZUEVfTVBDX0NNUAkJCQkgMzAKIAkgI2RlZmluZSBDTVBfVFlQRV9TVEFUVVNfQ01QCQkJCSAzMgogCSAjZGVmaW5lIENNUF9UWVBFX1JFTU9URV9EUklWRVJfUkVRCQkJIDM0CiAJICNkZWZpbmUgQ01QX1RZUEVfUkVNT1RFX0RSSVZFUl9SRVNQCQkJIDM2CkBAIC02ODYsNiAmIzQzOzcwNiw3IEBAIHN0cnVjdCBucWVfY24gewogI2RlZmluZSBCTlhUX05RX0hETF9UWVBFX1NISUZUCTI0CiAjZGVmaW5lIEJOWFRfTlFfSERMX1RZUEVfUlgJMHgwMAogI2RlZmluZSBCTlhUX05RX0hETF9UWVBFX1RYCTB4MDEKJiM0MzsjZGVmaW5lIEJOWFRfTlFfSERMX1RZUEVfTVAJMHgwMgogCiAjZGVmaW5lIEJOWFRfTlFfSERMX0lEWChoZGwpCSgoaGRsKSAmYW1wOyBCTlhUX05RX0hETF9JRFhfTUFTSykKICNkZWZpbmUgQk5YVF9OUV9IRExfVFlQRShoZGwpCSgoKGhkbCkgJmFtcDsgQk5YVF9OUV9IRExfVFlQRV9NQVNLKSAmZ3Q7Jmd0OwlcCkBAIC04OTYsNiAmIzQzOzkxNyw3IEBAIHN0cnVjdCBibnh0X3N3X3R4X2JkIHsKIAl1OAkJCWlzX3B1c2g7CiAJdTgJCQlpc19zd19nc287CiAJdTgJCQlhY3Rpb247CiYjNDM7CXU4CQkJaW5saW5lX2RhdGFfYmRzOwogCXVuc2lnbmVkIHNob3J0CQlucl9mcmFnczsKIAl1bmlvbiB7CiAJCXUxNgkJCXJ4X3Byb2Q7CkBAIC05NTEsNiAmIzQzOzk3Myw4IEBAIHN0cnVjdCBibnh0X3Jpbmdfc3RydWN0IHsKIAl9OwogCXUzMgkJCWhhbmRsZTsKIAl1OAkJCXF1ZXVlX2lkOwomIzQzOyNkZWZpbmUgQk5YVF9NUENfUVVFVUVfSUQJMHhmZgomIzQzOwl1OAkJCW1wY19jaG5sX3R5cGU7CiB9OwogCiBzdHJ1Y3QgdHhfcHVzaF9iZCB7CkBAIC05OTEsMTIgJiM0MzsxMDE1LDE2IEBAIHN0cnVjdCBibnh0X3R4X3JpbmdfaW5mbyB7CiAJdTE2CQkJdHhfY29uczsKIAl1MTYJCQl0eF9od19jb25zOwogCXUxNgkJCXR4cV9pbmRleDsKJiM0MzsJLyogaW5kZXggZm9yIHR4X3JpbmdbXSBvciB0eF9tcGNfcmluZ1tdIGluIHN0cnVjdCBibnh0X25hcGkgKi8KIAl1OAkJCXR4X25hcGlfaWR4OwogCXU4CQkJa2lja19wZW5kaW5nOwogCXN0cnVjdCBibnh0X2RiX2luZm8JdHhfZGI7CiAKIAlzdHJ1Y3QgdHhfYmQJCSp0eF9kZXNjX3JpbmdbTUFYX1RYX1BBR0VTXTsKLQlzdHJ1Y3QgYm54dF9zd190eF9iZAkqdHhfYnVmX3Jpbmc7CiYjNDM7CXVuaW9uIHsKJiM0MzsJCXN0cnVjdCBibnh0X3N3X3R4X2JkCSp0eF9idWZfcmluZzsKJiM0MzsJCXN0cnVjdCBibnh0X3N3X21wY190eF9iZAkqdHhfbXBjX2J1Zl9yaW5nOwomIzQzOwl9OwogCiAJZG1hX2FkZHJfdAkJdHhfZGVzY19tYXBwaW5nW01BWF9UWF9QQUdFU107CiAKQEAgLTEwMTQsOCAmIzQzOzEwNDIsMTEgQEAgc3RydWN0IGJueHRfdHhfcmluZ19pbmZvIHsKIAl1MzIJCQlkZXZfc3RhdGU7CiAKIAlzdHJ1Y3QgYm54dF9yaW5nX3N0cnVjdAl0eF9yaW5nX3N0cnVjdDsKLQkvKiBTeW5jaHJvbml6ZSBzaW11bHRhbmVvdXMgeGRwX3htaXQgb24gc2FtZSByaW5nICovCi0Jc3BpbmxvY2tfdAkJeGRwX3R4X2xvY2s7CiYjNDM7CS8qIFN5bmNocm9uaXplIHNpbXVsdGFuZW91cyB4ZHBfeG1pdCBvbiBzYW1lIHJpbmcgb3IgZm9yIE1QQyByaW5nICovCiYjNDM7CXNwaW5sb2NrX3QJCXR4X2xvY2s7CiYjNDM7CiYjNDM7CS8qIFBlci1UWC1yaW5nIGtUTFMgY291bnRlcnM7IGFsbG9jYXRlZCBvbmx5IHdoZW4ga1RMUyBpcyBlbmFibGVkLiAqLwomIzQzOwlzdHJ1Y3QgYm54dF90bHNfc3dfc3RhdHMgKnRsc19zdGF0czsKIH07CiAKICNkZWZpbmUgQk5YVF9MRUdBQ1lfQ09BTF9DTVBMX1BBUkFNUwkJCQkJXApAQCAtMTE1Nyw2ICYjNDM7MTE4OCwyMiBAQCBzdHJ1Y3QgYm54dF9jbW5fc3dfc3RhdHMgewogCXU2NAkJCW1pc3NlZF9pcnFzOwogfTsKIAomIzQzOy8qIERhdGEgcGxhbmUga1RMUyBjb3VudGVycyAqLwomIzQzO2VudW0gYm54dF9rdGxzX2RhdGFfY291bnRlcnMgewomIzQzOwlCTlhUX0tUTFNfVFhfUEtUUyA9IDAsCiYjNDM7CUJOWFRfS1RMU19UWF9CWVRFUywKJiM0MzsJQk5YVF9LVExTX1RYX09PT19QS1RTLAomIzQzOwlCTlhUX0tUTFNfVFhfT09PX0ZBTExCQUNLX05PX1NZTkMsCiYjNDM7CUJOWFRfS1RMU19UWF9PT09fRkFMTEJBQ0tfTk9fU1BBQ0UsCiYjNDM7CUJOWFRfS1RMU19UWF9PT09fRkFMTEJBQ0tfTk9fSERSLAomIzQzOwomIzQzOwlCTlhUX0tUTFNfTUFYX0RBVEFfQ09VTlRFUlMsCiYjNDM7fTsKJiM0MzsKJiM0MztzdHJ1Y3QgYm54dF90bHNfc3dfc3RhdHMgewomIzQzOwl1NjQJY291bnRlcnNbQk5YVF9LVExTX01BWF9EQVRBX0NPVU5URVJTXTsKJiM0Mzt9OwomIzQzOwogc3RydWN0IGJueHRfc3dfc3RhdHMgewogCXN0cnVjdCBibnh0X3J4X3N3X3N0YXRzIHJ4OwogCXN0cnVjdCBibnh0X3R4X3N3X3N0YXRzIHR4OwpAQCAtMTI0Miw2ICYjNDM7MTI4OSw3IEBAIHN0cnVjdCBibnh0X25hcGkgewogCXN0cnVjdCBibnh0X2NwX3JpbmdfaW5mbwljcF9yaW5nOwogCXN0cnVjdCBibnh0X3J4X3JpbmdfaW5mbwkqcnhfcmluZzsKIAlzdHJ1Y3QgYm54dF90eF9yaW5nX2luZm8JKnR4X3JpbmdbQk5YVF9NQVhfVFhSX1BFUl9OQVBJXTsKJiM0MzsJc3RydWN0IGJueHRfdHhfcmluZ19pbmZvCSoqdHhfbXBjX3Jpbmc7CiAKIAl2b2lkCQkJKCp0eF9pbnQpKHN0cnVjdCBibnh0ICosIHN0cnVjdCBibnh0X25hcGkgKiwKIAkJCQkJICBpbnQgYnVkZ2V0KTsKQEAgLTEzNTUsNiAmIzQzOzE0MDMsMTUgQEAgc3RydWN0IGJueHRfaHdfcmluZ3MgewogCWludCByc3NfY3R4OwogfTsKIAomIzQzO3N0cnVjdCBibnh0X2h3X2NyeXB0b19yZXNjIHsKJiM0MzsJdTMyCW1pbl90eF9rZXlfY3R4czsKJiM0MzsJdTMyCW1heF90eF9rZXlfY3R4czsKJiM0MzsJdTMyCXJlc3ZfdHhfa2V5X2N0eHM7CiYjNDM7CXUzMgltaW5fcnhfa2V5X2N0eHM7CiYjNDM7CXUzMgltYXhfcnhfa2V5X2N0eHM7CiYjNDM7CXUzMglyZXN2X3J4X2tleV9jdHhzOwomIzQzO307CiYjNDM7CiBzdHJ1Y3QgYm54dF9od19yZXNjIHsKIAl1MTYJbWluX3Jzc2Nvc19jdHhzOwogCXUxNgltYXhfcnNzY29zX2N0eHM7CkBAIC0xMzg5LDYgJiM0MzsxNDQ2LDggQEAgc3RydWN0IGJueHRfaHdfcmVzYyB7CiAJdTMyCW1heF90eF93bV9mbG93czsKIAl1MzIJbWF4X3J4X2VtX2Zsb3dzOwogCXUzMgltYXhfcnhfd21fZmxvd3M7CiYjNDM7CiYjNDM7CXN0cnVjdCBibnh0X2h3X2NyeXB0b19yZXNjCWNyeXB0b19yZXNjOwogfTsKIAogI2RlZmluZSBCTlhUX0xBUkdFX1JTU19UT19WTklDX1JBVElPCTcKQEAgLTI0NTIsNiAmIzQzOzI1MTEsMTAgQEAgc3RydWN0IGJueHQgewogCiAJdTgJCQl0cGhfbW9kZTsKIAomIzQzOwlzdHJ1Y3QgYm54dF9tcGNfaW5mbwkqbXBjX2luZm87CiYjNDM7CXN0cnVjdCBibnh0X2NyeXB0b19pbmZvCSpjcnlwdG9faW5mbzsKJiM0MzsJc3RydWN0IGJueHRfdGxzX2luZm8JKmt0bHNfaW5mbzsKJiM0MzsKIAl1bnNpZ25lZCBpbnQJCWN1cnJlbnRfaW50ZXJ2YWw7CiAjZGVmaW5lIEJOWFRfVElNRVJfSU5URVJWQUwJSFoKIApAQCAtMjUzOCw2ICYjNDM7MjYwMSw3IEBAIHN0cnVjdCBibnh0IHsKIAkjZGVmaW5lIEJOWFRfRldfQ0FQX05QQVJfMV8yCQkJQklUX1VMTCg0MikKIAkjZGVmaW5lIEJOWFRfRldfQ0FQX01JUlJPUl9PTl9ST0NFCQlCSVRfVUxMKDQzKQogCSNkZWZpbmUgQk5YVF9GV19DQVBfUFRQX1BUTQkJCUJJVF9VTEwoNDQpCiYjNDM7CSNkZWZpbmUgQk5YVF9GV19DQVBfS1RMUwkJCUJJVF9VTEwoNDUpCiAKIAl1MzIJCQlmd19kYmdfY2FwOwogCkBAIC0yNTYzLDYgJiM0MzsyNjI3LDggQEAgc3RydWN0IGJueHQgewogCSgoYnApLSZndDtmd19jYXAgJmFtcDsgQk5YVF9GV19DQVBfU1dfTUFYX1JFU09VUkNFX0xJTUlUUykKICNkZWZpbmUgQk5YVF9NSVJST1JfT05fUk9DRV9DQVAoYnApCVwKIAkoKGJwKS0mZ3Q7ZndfY2FwICZhbXA7IEJOWFRfRldfQ0FQX01JUlJPUl9PTl9ST0NFKQomIzQzOyNkZWZpbmUgQk5YVF9TVVBQT1JUU19LVExTKGJwKQlcCiYjNDM7CSgoYnApLSZndDtmd19jYXAgJmFtcDsgQk5YVF9GV19DQVBfS1RMUykKIAogCXUzMgkJCWh3cm1fc3BlY19jb2RlOwogCXUxNgkJCWh3cm1fY21kX3NlcTsKQEAgLTI2NDUsNiAmIzQzOzI3MTEsNyBAQCBzdHJ1Y3QgYm54dCB7CiAjZGVmaW5lIEJOWFRfVEhFUk1BTF9USFJFU0hPTERfU1BfRVZFTlQJMjIKICNkZWZpbmUgQk5YVF9GV19FQ0hPX1JFUVVFU1RfU1BfRVZFTlQJMjMKICNkZWZpbmUgQk5YVF9SRVNUQVJUX1VMUF9TUF9FVkVOVAkyNAomIzQzOyNkZWZpbmUgQk5YVF9NUENfUkVTRVRfU1BfRVZFTlQJCTI1CiAKIAlzdHJ1Y3QgZGVsYXllZF93b3JrCWZ3X3Jlc2V0X3Rhc2s7CiAJaW50CQkJZndfcmVzZXRfc3RhdGU7CkBAIC0yODU2LDE0ICYjNDM7MjkyMywxNCBAQCBzdGF0aWMgaW5saW5lIHUzMiBibnh0X3R4X2F2YWlsKHN0cnVjdCBibnh0ICpicCwKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHR4X2JkX2V4dCAqCiBibnh0X2luaXRfZXh0X2JkKHN0cnVjdCBibnh0ICpicCwgc3RydWN0IGJueHRfdHhfcmluZ19pbmZvICp0eHIsCiAJCSB1MTYgcHJvZCwgX19sZTMyIGxmbGFncywgdTMyIHZsYW5fdGFnX2ZsYWdzLAotCQkgdTMyIGNmYV9hY3Rpb24pCiYjNDM7CQkgdTMyIGNmYV9hY3Rpb24sIHUzMiBraWQpCiB7CiAJc3RydWN0IHR4X2JkX2V4dCAqdHhiZDE7CiAKIAl0eGJkMSA9IChzdHJ1Y3QgdHhfYmRfZXh0ICopCiAJCSZhbXA7dHhyLSZndDt0eF9kZXNjX3JpbmdbVFhfUklORyhicCwgcHJvZCldW1RYX0lEWChwcm9kKV07CiAJdHhiZDEtJmd0O3R4X2JkX2hzaXplX2xmbGFncyA9IGxmbGFnczsKLQl0eGJkMS0mZ3Q7dHhfYmRfbXNzID0gMDsKJiM0MzsJdHhiZDEtJmd0O3R4X2JkX2tpZF9tc3MgPSBjcHVfdG9fbGUzMihCTlhUX1RYX0tJRF9ISShraWQpKTsKIAl0eGJkMS0mZ3Q7dHhfYmRfY2ZhX21ldGEgPSBjcHVfdG9fbGUzMih2bGFuX3RhZ19mbGFncyk7CiAJdHhiZDEtJmd0O3R4X2JkX2NmYV9hY3Rpb24gPQogCQljcHVfdG9fbGUzMihjZmFfYWN0aW9uICZsdDsmbHQ7IFRYX0JEX0NGQV9BQ1RJT05fU0hJRlQpOwpAQCAtMjk1NywxMSAmIzQzOzMwMjQsMTQgQEAgc3RhdGljIGlubGluZSBlbnVtIHBrdF9oYXNoX3R5cGVzIGJueHRfcnNzX2V4dF9vcChzdHJ1Y3QgYm54dCAqYnAsCiBleHRlcm4gY29uc3QgdTE2IGJueHRfYnN0b3JlX3RvX3RyYWNlW107CiBleHRlcm4gY29uc3QgdTE2IGJueHRfbGhpbnRfYXJyW107CiAKJiM0Mzt2b2lkIGJueHRfcXVldWVfc3Bfd29yayhzdHJ1Y3QgYm54dCAqYnAsIHVuc2lnbmVkIGludCBldmVudCk7CiBpbnQgYm54dF9hbGxvY19yeF9kYXRhKHN0cnVjdCBibnh0ICpicCwgc3RydWN0IGJueHRfcnhfcmluZ19pbmZvICpyeHIsCiAJCSAgICAgICB1MTYgcHJvZCwgZ2ZwX3QgZ2ZwKTsKIHZvaWQgYm54dF9yZXVzZV9yeF9kYXRhKHN0cnVjdCBibnh0X3J4X3JpbmdfaW5mbyAqcnhyLCB1MTYgY29ucywgdm9pZCAqZGF0YSk7CiB1MzIgYm54dF9md19oZWFsdGhfcmVhZGwoc3RydWN0IGJueHQgKmJwLCBpbnQgcmVnX2lkeCk7CiBib29sIGJueHRfYnNfdHJhY2VfYXZhaWwoc3RydWN0IGJueHQgKmJwLCB1MTYgdHlwZSk7CiYjNDM7dm9pZCBibnh0X2ZyZWVfcmluZyhzdHJ1Y3QgYm54dCAqYnAsIHN0cnVjdCBibnh0X3JpbmdfbWVtX2luZm8gKnJtZW0pOwomIzQzO2ludCBibnh0X2FsbG9jX3Jpbmcoc3RydWN0IGJueHQgKmJwLCBzdHJ1Y3QgYm54dF9yaW5nX21lbV9pbmZvICpybWVtKTsKIHZvaWQgYm54dF9zZXRfdHBhX2ZsYWdzKHN0cnVjdCBibnh0ICpicCk7CiB2b2lkIGJueHRfc2V0X3JpbmdfcGFyYW1zKHN0cnVjdCBibnh0ICopOwogdm9pZCBibnh0X3NldF9yeF9za2JfbW9kZShzdHJ1Y3QgYm54dCAqYnAsIGJvb2wgcGFnZV9tb2RlKTsKQEAgLTI5OTAsNiAmIzQzOzMwNjAsMTQgQEAgaW50IGJueHRfaHdybV92bmljX2NmZyhzdHJ1Y3QgYm54dCAqYnAsIHN0cnVjdCBibnh0X3ZuaWNfaW5mbyAqdm5pYyk7CiBpbnQgYm54dF9od3JtX3ZuaWNfYWxsb2Moc3RydWN0IGJueHQgKmJwLCBzdHJ1Y3QgYm54dF92bmljX2luZm8gKnZuaWMsCiAJCQkgdW5zaWduZWQgaW50IHN0YXJ0X3J4X3JpbmdfaWR4LAogCQkJIHVuc2lnbmVkIGludCBucl9yaW5ncyk7CiYjNDM7aW50IGJueHRfaHdybV9jcF9yaW5nX2FsbG9jX3A1KHN0cnVjdCBibnh0ICpicCwgc3RydWN0IGJueHRfY3BfcmluZ19pbmZvICpjcHIpOwomIzQzO2ludCBibnh0X2h3cm1fdHhfcmluZ19hbGxvYyhzdHJ1Y3QgYm54dCAqYnAsIHN0cnVjdCBibnh0X3R4X3JpbmdfaW5mbyAqdHhyLAomIzQzOwkJCSAgICB1MzIgdHhfaWR4KTsKJiM0Mzt2b2lkIGJueHRfaHdybV90eF9yaW5nX2ZyZWUoc3RydWN0IGJueHQgKmJwLCBzdHJ1Y3QgYm54dF90eF9yaW5nX2luZm8gKnR4ciwKJiM0MzsJCQkgICAgYm9vbCBjbG9zZV9wYXRoKTsKJiM0Mzt2b2lkIGJueHRfaHdybV9jcF9yaW5nX2ZyZWUoc3RydWN0IGJueHQgKmJwLCBzdHJ1Y3QgYm54dF9jcF9yaW5nX2luZm8gKmNwcik7CiYjNDM7dm9pZCBibnh0X2NsZWFyX29uZV9jcF9yaW5nKHN0cnVjdCBibnh0ICpicCwgc3RydWN0IGJueHRfY3BfcmluZ19pbmZvICpjcHIpOwomIzQzO2ludCBibnh0X3RvdGFsX3R4X3JpbmdzKHN0cnVjdCBibnh0ICpicCk7CiBpbnQgX19ibnh0X2h3cm1fZ2V0X3R4X3JpbmdzKHN0cnVjdCBibnh0ICpicCwgdTE2IGZpZCwgaW50ICp0eF9yaW5ncyk7CiBpbnQgYm54dF9ucV9yaW5nc19pbl91c2Uoc3RydWN0IGJueHQgKmJwKTsKIGludCBibnh0X2h3cm1fc2V0X2NvYWwoc3RydWN0IGJueHQgKik7CkBAIC0zMDM1LDEwICYjNDM7MzExMywxMSBAQCB2b2lkIGJueHRfc3luY19yaW5nX3N0YXRzKHN0cnVjdCBibnh0ICpicCk7CiBib29sIGJueHRfcmZzX2NhcGFibGUoc3RydWN0IGJueHQgKmJwLCBib29sIG5ld19yc3NfY3R4KTsKIGludCBibnh0X2RiZ19od3JtX3JkX3JlZyhzdHJ1Y3QgYm54dCAqYnAsIHUzMiByZWdfb2ZmLCB1MTYgbnVtX3dvcmRzLAogCQkJIHUzMiAqcmVnX2J1Zik7CiYjNDM7dm9pZCBibnh0X3Jlc2V0X3Rhc2soc3RydWN0IGJueHQgKmJwLCBib29sIHNpbGVudCk7CiB2b2lkIGJueHRfZndfZXhjZXB0aW9uKHN0cnVjdCBibnh0ICpicCk7CiB2b2lkIGJueHRfZndfcmVzZXQoc3RydWN0IGJueHQgKmJwKTsKIGludCBibnh0X2NoZWNrX3JpbmdzKHN0cnVjdCBibnh0ICpicCwgaW50IHR4LCBpbnQgcngsIGJvb2wgc2gsIGludCB0Y3MsCi0JCSAgICAgaW50IHR4X3hkcCk7CiYjNDM7CQkgICAgIGludCB0eF94ZHAsIGludCBtcGNfdHgsIGludCBtcGNfY3ApOwogaW50IGJueHRfZndfaW5pdF9vbmUoc3RydWN0IGJueHQgKmJwKTsKIGJvb2wgYm54dF9od3JtX3Jlc2V0X3Blcm1pdHRlZChzdHJ1Y3QgYm54dCAqYnApOwogdm9pZCBibnh0X3NldF9jcF9yaW5ncyhzdHJ1Y3QgYm54dCAqYnAsIGJvb2wgc2gpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9ibnh0X2NyeXB0by5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9ibnh0X2NyeXB0by5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwLi4yN2E5NzhiZDE4ZTIwMwotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dF9jcnlwdG8uYwpAQCAtMCwwICYjNDM7MSw2MTcgQEAKJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5CiYjNDM7LyogQ29weXJpZ2h0IChjKSAyMDI2IEJyb2FkY29tIEluYy4gKi8KJiM0MzsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvc3RkZGVmLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3R5cGVzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2tlcm5lbC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9zbGFiLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3BjaS5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9ibnh0L2hzaS5oJmd0OwomIzQzOwomIzQzOyNpbmNsdWRlICYjMzQ7Ym54dC5oJiMzNDsKJiM0MzsjaW5jbHVkZSAmIzM0O2JueHRfaHdybS5oJiMzNDsKJiM0MzsjaW5jbHVkZSAmIzM0O2JueHRfbXBjLmgmIzM0OwomIzQzOyNpbmNsdWRlICYjMzQ7Ym54dF9rdGxzLmgmIzM0OwomIzQzOyNpbmNsdWRlICYjMzQ7Ym54dF9jcnlwdG8uaCYjMzQ7CiYjNDM7CiYjNDM7c3RhdGljIHUzMiBibnh0X2dldF9tYXhfY3J5cHRvX2tleV9jdHgoc3RydWN0IGJueHQgKmJwLCBpbnQga2V5X3R5cGUpCiYjNDM7ewomIzQzOwl1MzIgZndfbWFqID0gQk5YVF9GV19NQUooYnApOwomIzQzOwomIzQzOwlpZiAoa2V5X3R5cGUgPT0gQk5YVF9UWF9DUllQVE9fS0VZX1RZUEUpCiYjNDM7CQlyZXR1cm4gKGZ3X21haiAmbHQ7IDIzMykgPyBCTlhUX01BWF9UWF9DUllQVE9fS0VZU19QUkVfMjMzRlcgOgomIzQzOwkJICAgICAgIEJOWFRfTUFYX1RYX0NSWVBUT19LRVlTOwomIzQzOwomIzQzOwlyZXR1cm4gKGZ3X21haiAmbHQ7IDIzMykgPyBCTlhUX01BWF9SWF9DUllQVE9fS0VZU19QUkVfMjMzRlcgOgomIzQzOwkgICAgICAgQk5YVF9NQVhfUlhfQ1JZUFRPX0tFWVM7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIGJueHRfYWxsb2NfY3J5cHRvX2luZm8gLSBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBjcnlwdG8gb2ZmbG9hZCBjb250ZXh0CiYjNDM7ICogQGJwOiBwb2ludGVyIHRvIGJueHQgZGV2aWNlCiYjNDM7ICogQHJlc3A6IHBvaW50ZXIgdG8gZmlybXdhcmUgY2FwYWJpbGl0eSByZXNwb25zZQomIzQzOyAqCiYjNDM7ICogQWxsb2NhdGVzIHRoZSBtYWluIGNyeXB0byBpbmZvIHN0cnVjdHVyZQomIzQzOyAqCiYjNDM7ICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZHVyaW5nIGRldmljZSBpbml0aWFsaXphdGlvbiB3aGVuIGZpcm13YXJlCiYjNDM7ICogcmVwb3J0cyBjcnlwdG8gb2ZmbG9hZCBjYXBhYmlsaXR5LiBJZiBhbGxvY2F0aW9uIGZhaWxzLCBjcnlwdG8gb2ZmbG9hZAomIzQzOyAqIHdpbGwgbm90IGJlIGF2YWlsYWJsZSBidXQgdGhlIGRldmljZSB3aWxsIHN0aWxsIGZ1bmN0aW9uLgomIzQzOyAqCiYjNDM7ICogQ29udGV4dDogUHJvY2VzcyBjb250ZXh0CiYjNDM7ICovCiYjNDM7dm9pZCBibnh0X2FsbG9jX2NyeXB0b19pbmZvKHN0cnVjdCBibnh0ICpicCwKJiM0MzsJCQkgICAgc3RydWN0IGh3cm1fZnVuY19xY2Fwc19vdXRwdXQgKnJlc3ApCiYjNDM7ewomIzQzOwl1MTYgbWF4X2tleXMgPSBsZTE2X3RvX2NwdShyZXNwLSZndDttYXhfa2V5X2N0eHNfYWxsb2MpOwomIzQzOwlzdHJ1Y3QgYm54dF9jcnlwdG9faW5mbyAqY3J5cHRvID0gYnAtJmd0O2NyeXB0b19pbmZvOwomIzQzOwlzdHJ1Y3QgYm54dF9rY3R4ICprY3R4OwomIzQzOwljaGFyIG5hbWVbNjRdOwomIzQzOwlpbnQgaTsKJiM0MzsKJiM0MzsJaWYgKEJOWFRfVkYoYnApKQomIzQzOwkJcmV0dXJuOwomIzQzOwlpZiAoIWNyeXB0bykgewomIzQzOwkJY3J5cHRvID0ga3phbGxvY19vYmooKmNyeXB0byk7CiYjNDM7CQlpZiAoIWNyeXB0bykgewomIzQzOwkJCW5ldGRldl93YXJuKGJwLSZndDtkZXYsCiYjNDM7CQkJCSAgICAmIzM0O1VuYWJsZSB0byBhbGxvY2F0ZSBjcnlwdG8gaW5mb1xuJiMzNDspOwomIzQzOwkJCXJldHVybjsKJiM0MzsJCX0KJiM0MzsJCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgJiMzNDtibnh0X2NyeXB0by0lcyYjMzQ7LAomIzQzOwkJCSBkZXZfbmFtZSgmYW1wO2JwLSZndDtwZGV2LSZndDtkZXYpKTsKJiM0MzsJCWNyeXB0by0mZ3Q7bXBjX2NhY2hlID0KJiM0MzsJCQlrbWVtX2NhY2hlX2NyZWF0ZShuYW1lLAomIzQzOwkJCQkJICBzaXplb2Yoc3RydWN0IGJueHRfY3J5cHRvX2NtZF9jdHgpLAomIzQzOwkJCQkJICAwLCBTTEFCX0hXQ0FDSEVfQUxJR04sIE5VTEwpOwomIzQzOwkJaWYgKCFjcnlwdG8tJmd0O21wY19jYWNoZSkKJiM0MzsJCQlnb3RvIGFsbG9jX2VycjsKJiM0MzsKJiM0MzsJCWZvciAoaSA9IDA7IGkgJmx0OyBCTlhUX01BWF9DUllQVE9fS0VZX1RZUEU7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQkJa2N0eCA9ICZhbXA7Y3J5cHRvLSZndDtrY3R4W2ldOwomIzQzOwkJCWtjdHgtJmd0O3R5cGUgPSBpOwomIzQzOwkJCUlOSVRfTElTVF9IRUFEKCZhbXA7a2N0eC0mZ3Q7bGlzdCk7CiYjNDM7CQkJc3Bpbl9sb2NrX2luaXQoJmFtcDtrY3R4LSZndDtsb2NrKTsKJiM0MzsJCQlhdG9taWNfc2V0KCZhbXA7a2N0eC0mZ3Q7YWxsb2NfcGVuZGluZywgMCk7CiYjNDM7CQkJaW5pdF93YWl0cXVldWVfaGVhZCgmYW1wO2tjdHgtJmd0O2FsbG9jX3BlbmRpbmdfd3EpOwomIzQzOwkJfQomIzQzOwkJYnAtJmd0O2NyeXB0b19pbmZvID0gY3J5cHRvOwomIzQzOwl9CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBCTlhUX01BWF9DUllQVE9fS0VZX1RZUEU7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlrY3R4ID0gJmFtcDtjcnlwdG8tJmd0O2tjdHhbaV07CiYjNDM7CQlrY3R4LSZndDttYXhfY3R4ID0gYm54dF9nZXRfbWF4X2NyeXB0b19rZXlfY3R4KGJwLCBpKTsKJiM0MzsJfQomIzQzOwljcnlwdG8tJmd0O21heF9rZXlfY3R4c19hbGxvYyA9IG1heF9rZXlzOwomIzQzOwlpZiAoIWJwLSZndDtrdGxzX2luZm8pCiYjNDM7CQlibnh0X2FsbG9jX2t0bHNfaW5mbyhicCk7CiYjNDM7CWlmIChicC0mZ3Q7a3Rsc19pbmZvKQomIzQzOwkJYnAtJmd0O2Z3X2NhcCB8PSBCTlhUX0ZXX0NBUF9LVExTOwomIzQzOwlyZXR1cm47CiYjNDM7CiYjNDM7YWxsb2NfZXJyOgomIzQzOwlrZnJlZShjcnlwdG8pOwomIzQzO30KJiM0MzsKJiM0MztpbnQgYm54dF9jcnlwdG9fZGVsKHN0cnVjdCBibnh0ICpicCwgdTggdHlwZSwgdTgga2luZCwgdTMyIGtpZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBibnh0X3R4X3JpbmdfaW5mbyAqdHhyOwomIzQzOwlzdHJ1Y3QgY2VfZGVsZXRlX2NtZCBjbWQgPSB7fTsKJiM0MzsJdTMyIGRhdGE7CiYjNDM7CiYjNDM7CWlmIChCTlhUX05PX0ZXX0FDQ0VTUyhicCkpCiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsKJiM0MzsJdHhyID0gYm54dF9zZWxlY3RfbXBjX3JpbmcoYnAsIHR5cGUpOwomIzQzOwlpZiAoIXR4cikKJiM0MzsJCXJldHVybiAtRU5PREVWOwomIzQzOwlpZiAoa2luZCA9PSBCTlhUX0NUWF9LSU5EX0NLX1RYKQomIzQzOwkJZGF0YSA9IENFX0RFTEVURV9DTURfQ1RYX0tJTkRfQ0tfVFg7CiYjNDM7CWVsc2UgaWYgKGtpbmQgPT0gQk5YVF9DVFhfS0lORF9DS19SWCkKJiM0MzsJCWRhdGEgPSBDRV9ERUxFVEVfQ01EX0NUWF9LSU5EX0NLX1JYOwomIzQzOwllbHNlCiYjNDM7CQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsKJiM0MzsJZGF0YSB8PSBDRV9ERUxFVEVfQ01EX09QQ09ERV9ERUwgfAomIzQzOwkJKEJOWFRfS0lEX0hXKGtpZCkgJmx0OyZsdDsgQ0VfREVMRVRFX0NNRF9LSURfU0ZUKTsKJiM0MzsKJiM0MzsJY21kLmN0eF9raW5kX2tpZF9vcGNvZGUgPSBjcHVfdG9fbGUzMihkYXRhKTsKJiM0MzsJcmV0dXJuIGJueHRfeG1pdF9jcnlwdG9fY21kKGJwLCB0eHIsICZhbXA7Y21kLCBzaXplb2YoY21kKSwKJiM0MzsJCQkJICAgIEJOWFRfTVBDX1RNT19NU0VDUyk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIGJueHRfY3J5cHRvX2RlbF9hbGxfa2lkcyhzdHJ1Y3QgYm54dCAqYnAsIHN0cnVjdCBibnh0X2tpZF9pbmZvICpraWQpCiYjNDM7ewomIzQzOwlpbnQgaSwgcmM7CiYjNDM7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBraWQtJmd0O2NvdW50OyBpJiM0MzsmIzQzOykgewomIzQzOwkJaWYgKCF0ZXN0X2JpdChpLCBraWQtJmd0O2lkcykpIHsKJiM0MzsJCQlyYyA9IGJueHRfY3J5cHRvX2RlbChicCwga2lkLSZndDt0eXBlLCBraWQtJmd0O2tpbmQsCiYjNDM7CQkJCQkgICAgIGtpZC0mZ3Q7c3RhcnRfaWQgJiM0MzsgaSk7CiYjNDM7CQkJaWYgKCFyYykKJiM0MzsJCQkJc2V0X2JpdChpLCBraWQtJmd0O2lkcyk7CiYjNDM7CQl9CiYjNDM7CX0KJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogYm54dF9jcnlwdG9fZGVsX2FsbCAtIERlbGV0ZSBhbGwgY3J5cHRvIGNvbm5lY3Rpb25zCiYjNDM7ICogQGJwOiBwb2ludGVyIHRvIGJueHQgZGV2aWNlCiYjNDM7ICoKJiM0MzsgKiBEZWxldGUgYWxsIGNyeXB0byBjb25uZWN0aW9ucyBhbmQgZnJlZSBhbGwgS0lEcyBmb3IgcmUtdXNlIGR1cmluZwomIzQzOyAqIHNodXRkb3duLiAgSW5jcmVtZW50IHRoZSBlcG9jaCBjb3VudGVyIHRvIGludmFsaWRhdGUgYW55IG91dHN0YW5kaW5nCiYjNDM7ICoga2V5IHJlZmVyZW5jZXMuCiYjNDM7ICoKJiM0MzsgKiBMb2NraW5nOiB0aGUgY2FsbGVyIG11c3QgaGF2ZSBjbGVhcmVkIEJOWFRfU1RBVEVfT1BFTiBhbmQgd2FpdGVkIGZvciBhbGwKJiM0MzsgKiBpbi1mbGlnaHQga1RMUyBjb250cm9sIG9wcyB0byBkcmFpbi4gIFVuZGVyIHRoZXNlIHByZWNvbmRpdGlvbnMgdGhlcmUgYXJlCiYjNDM7ICogbm8gY29uY3VycmVudCByZWFkZXJzIG9yIHdyaXRlcnMgb2YgdGhlIEtJRCBsaXN0cywgc28gdGhlIGxpc3RzIGNhbiBiZQomIzQzOyAqIHdhbGtlZCB3aXRob3V0IHJjdV9yZWFkX2xvY2soKSBvciB0aGUga2N0eCBsb2NrLgomIzQzOyAqCiYjNDM7ICogQ29udGV4dDogUHJvY2VzcyBjb250ZXh0IGR1cmluZyBzaHV0ZG93bi9yZXNldAomIzQzOyAqLwomIzQzO3ZvaWQgYm54dF9jcnlwdG9fZGVsX2FsbChzdHJ1Y3QgYm54dCAqYnApCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYm54dF9jcnlwdG9faW5mbyAqY3J5cHRvID0gYnAtJmd0O2NyeXB0b19pbmZvOwomIzQzOwlzdHJ1Y3QgYm54dF9raWRfaW5mbyAqa2lkOwomIzQzOwlzdHJ1Y3QgYm54dF9rY3R4ICprY3R4OwomIzQzOwlpbnQgaTsKJiM0MzsKJiM0MzsJaWYgKCFjcnlwdG8pCiYjNDM7CQlyZXR1cm47CiYjNDM7CiYjNDM7CS8qIE5vIGNvbmN1cnJlbnQgYWNjZXNzOyBzZWUgdGhlIGxvY2tpbmcgbm90ZSBhYm92ZS4gKi8KJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IEJOWFRfTUFYX0NSWVBUT19LRVlfVFlQRTsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCWtjdHggPSAmYW1wO2NyeXB0by0mZ3Q7a2N0eFtpXTsKJiM0MzsJCWxpc3RfZm9yX2VhY2hfZW50cnkoa2lkLCAmYW1wO2tjdHgtJmd0O2xpc3QsIGxpc3QpCiYjNDM7CQkJYm54dF9jcnlwdG9fZGVsX2FsbF9raWRzKGJwLCBraWQpOwomIzQzOwkJa2N0eC0mZ3Q7ZXBvY2ggPSBCTlhUX05FWFRfRVBPQ0goa2N0eC0mZ3Q7ZXBvY2gpOwomIzQzOwl9CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIGJueHRfY2xlYXJfY3J5cHRvIC0gQ2xlYXIgYWxsIGNyeXB0byBrZXkgY29udGV4dHMKJiM0MzsgKiBAYnA6IHBvaW50ZXIgdG8gYm54dCBkZXZpY2UKJiM0MzsgKgomIzQzOyAqIENsZWFycyBhbGwga2V5IGNvbnRleHQgYWxsb2NhdGlvbnMgZHVyaW5nIHNodXRkb3duIG9yIGZpcm13YXJlIHJlc2V0LgomIzQzOyAqIEZyZWVzIGFsbCBrZXkgaW5mbyBzdHJ1Y3R1cmVzIGFuZCBiaXRtYXBzLCBhbmQgaW5jcmVtZW50cyB0aGUgZXBvY2gKJiM0MzsgKiBjb3VudGVyIHRvIGludmFsaWRhdGUgYW55IG91dHN0YW5kaW5nIGtleSByZWZlcmVuY2VzLgomIzQzOyAqCiYjNDM7ICogTG9ja2luZzogdGhlIGNhbGxlciBtdXN0IGhhdmUgY2xlYXJlZCBCTlhUX1NUQVRFX09QRU4gYW5kIHdhaXRlZCBmb3IgYWxsCiYjNDM7ICogaW4tZmxpZ2h0IGtUTFMgY29udHJvbCBvcHMgdG8gZHJhaW4uICBVbmRlciB0aGVzZSBwcmVjb25kaXRpb25zIHRoZXJlIGFyZQomIzQzOyAqIG5vIGNvbmN1cnJlbnQgcmVhZGVycyBvciB3cml0ZXJzIG9mIHRoZSBLSUQgbGlzdHMsIHNvIHRoZSBsaXN0cyBjYW4gYmUKJiM0MzsgKiB3YWxrZWQgd2l0aG91dCByY3VfcmVhZF9sb2NrKCkgb3IgdGhlIGtjdHggbG9jay4KJiM0MzsgKgomIzQzOyAqIENvbnRleHQ6IFByb2Nlc3MgY29udGV4dCBkdXJpbmcgc2h1dGRvd24vcmVzZXQKJiM0MzsgKi8KJiM0Mzt2b2lkIGJueHRfY2xlYXJfY3J5cHRvKHN0cnVjdCBibnh0ICpicCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBibnh0X2NyeXB0b19pbmZvICpjcnlwdG8gPSBicC0mZ3Q7Y3J5cHRvX2luZm87CiYjNDM7CXN0cnVjdCBibnh0X2tpZF9pbmZvICpraWQsICp0bXA7CiYjNDM7CXN0cnVjdCBibnh0X2tjdHggKmtjdHg7CiYjNDM7CWludCBpOwomIzQzOwomIzQzOwlpZiAoIWNyeXB0bykKJiM0MzsJCXJldHVybjsKJiM0MzsKJiM0MzsJLyogTm8gY29uY3VycmVudCBhY2Nlc3M7IHNlZSB0aGUgbG9ja2luZyBub3RlIGFib3ZlLiAqLwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgQk5YVF9NQVhfQ1JZUFRPX0tFWV9UWVBFOyBpJiM0MzsmIzQzOykgewomIzQzOwkJa2N0eCA9ICZhbXA7Y3J5cHRvLSZndDtrY3R4W2ldOwomIzQzOwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGtpZCwgdG1wLCAmYW1wO2tjdHgtJmd0O2xpc3QsIGxpc3QpIHsKJiM0MzsJCQlsaXN0X2RlbCgmYW1wO2tpZC0mZ3Q7bGlzdCk7CiYjNDM7CQkJa2ZyZWUoa2lkKTsKJiM0MzsJCX0KJiM0MzsJCWtjdHgtJmd0O3RvdGFsX2FsbG9jID0gMDsKJiM0MzsJCWtjdHgtJmd0O2Vwb2NoID0gQk5YVF9ORVhUX0VQT0NIKGtjdHgtJmd0O2Vwb2NoKTsKJiM0MzsJfQomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBibnh0X2ZyZWVfY3J5cHRvX2luZm8gLSBGcmVlIGNyeXB0byBvZmZsb2FkIHJlc291cmNlcwomIzQzOyAqIEBicDogcG9pbnRlciB0byBibnh0IGRldmljZQomIzQzOyAqCiYjNDM7ICogRnJlZXMgYWxsIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggY3J5cHRvIG9mZmxvYWQuICBDYWxsIHRoaXMgZnVuY3Rpb24KJiM0MzsgKiBvbmx5IHdoZW4gaXQgaXMgaWRsZSB3aXRoIG5vdGhpbmcgaW4tZmxpZ2h0LgomIzQzOyAqCiYjNDM7ICogQ29udGV4dDogUHJvY2VzcyBjb250ZXh0IGR1cmluZyBkZXZpY2Ugc2h1dGRvd24vcmVtb3ZhbAomIzQzOyAqLwomIzQzO3ZvaWQgYm54dF9mcmVlX2NyeXB0b19pbmZvKHN0cnVjdCBibnh0ICpicCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBibnh0X2NyeXB0b19pbmZvICpjcnlwdG8gPSBicC0mZ3Q7Y3J5cHRvX2luZm87CiYjNDM7CiYjNDM7CWJueHRfZnJlZV9rdGxzX2luZm8oYnApOwomIzQzOwlpZiAoIWNyeXB0bykKJiM0MzsJCXJldHVybjsKJiM0MzsJYm54dF9jbGVhcl9jcnlwdG8oYnApOwomIzQzOwlrbWVtX2NhY2hlX2Rlc3Ryb3koY3J5cHRvLSZndDttcGNfY2FjaGUpOwomIzQzOwlrZnJlZShjcnlwdG8pOwomIzQzOwlicC0mZ3Q7Y3J5cHRvX2luZm8gPSBOVUxMOwomIzQzOwlicC0mZ3Q7ZndfY2FwICZhbXA7PSB+Qk5YVF9GV19DQVBfS1RMUzsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogYm54dF9od3JtX3Jlc2VydmVfcGZfa2V5X2N0eHMgLSBSZXNlcnZlIGtleSBjb250ZXh0cyB3aXRoIGZpcm13YXJlCiYjNDM7ICogQGJwOiBwb2ludGVyIHRvIGJueHQgZGV2aWNlCiYjNDM7ICogQHJlcTogcG9pbnRlciB0byBIV1JNIGZ1bmN0aW9uIGNvbmZpZyByZXF1ZXN0CiYjNDM7ICoKJiM0MzsgKiBQb3B1bGF0ZXMgdGhlIGZpcm13YXJlIHJlcXVlc3Qgd2l0aCBrZXkgY29udGV4dCByZXNlcnZhdGlvbiBwYXJhbWV0ZXJzCiYjNDM7ICogZm9yIGNyeXB0byBvZmZsb2FkIGJhc2VkIG9uIGN1cnJlbnQgbWF4IHNldHRpbmdzIGFuZCBjYXBhYmlsaXRpZXMuCiYjNDM7ICoKJiM0MzsgKiBDb250ZXh0OiBQcm9jZXNzIGNvbnRleHQgZHVyaW5nIGRldmljZSBjb25maWd1cmF0aW9uCiYjNDM7ICovCiYjNDM7dm9pZCBibnh0X2h3cm1fcmVzZXJ2ZV9wZl9rZXlfY3R4cyhzdHJ1Y3QgYm54dCAqYnAsCiYjNDM7CQkJCSAgIHN0cnVjdCBod3JtX2Z1bmNfY2ZnX2lucHV0ICpyZXEpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYm54dF9jcnlwdG9faW5mbyAqY3J5cHRvID0gYnAtJmd0O2NyeXB0b19pbmZvOwomIzQzOwlzdHJ1Y3QgYm54dF9od19yZXNjICpod19yZXNjID0gJmFtcDticC0mZ3Q7aHdfcmVzYzsKJiM0MzsJc3RydWN0IGJueHRfaHdfY3J5cHRvX3Jlc2MgKmNyeXB0b19yZXNjOwomIzQzOwl1MzIgdHgsIHJ4OwomIzQzOwomIzQzOwlpZiAoIWNyeXB0byB8fCAhQk5YVF9TVVBQT1JUU19LVExTKGJwKSkKJiM0MzsJCXJldHVybjsKJiM0MzsKJiM0MzsJY3J5cHRvX3Jlc2MgPSAmYW1wO2h3X3Jlc2MtJmd0O2NyeXB0b19yZXNjOwomIzQzOwl0eCA9IG1pbihCTlhUX1RDSyhjcnlwdG8pLm1heF9jdHgsIGNyeXB0b19yZXNjLSZndDttYXhfdHhfa2V5X2N0eHMpOwomIzQzOwlyeCA9IG1pbihCTlhUX1JDSyhjcnlwdG8pLm1heF9jdHgsIGNyeXB0b19yZXNjLSZndDttYXhfcnhfa2V5X2N0eHMpOwomIzQzOwlyZXEtJmd0O251bV9rdGxzX3R4X2tleV9jdHhzID0gY3B1X3RvX2xlMzIodHgpOwomIzQzOwlyZXEtJmd0O251bV9rdGxzX3J4X2tleV9jdHhzID0gY3B1X3RvX2xlMzIocngpOwomIzQzOwlpZiAodHgpCiYjNDM7CQlyZXEtJmd0O2VuYWJsZXMgfD0gY3B1X3RvX2xlMzIoRlVOQ19DRkdfUkVRX0VOQUJMRVNfS1RMU19UWF9LRVlfQ1RYUyk7CiYjNDM7CWlmIChyeCkKJiM0MzsJCXJlcS0mZ3Q7ZW5hYmxlcyB8PSBjcHVfdG9fbGUzMihGVU5DX0NGR19SRVFfRU5BQkxFU19LVExTX1JYX0tFWV9DVFhTKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBibnh0X2tleV9jdHhfc3RvcmUoc3RydWN0IGJueHRfa2N0eCAqa2N0eCwgX19sZTMyICprZXlfYnVmLCB1MzIgbnVtLAomIzQzOwkJCSAgICAgIGJvb2wgY29udGlnLCB1OCBraW5kLCB1MzIgKmlkKQomIzQzO3sKJiM0MzsJc3RydWN0IGJueHRfa2lkX2luZm8gKmtpZDsKJiM0MzsJdTMyIGk7CiYjNDM7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBudW07ICkgewomIzQzOwkJa2lkID0ga3phbGxvY19vYmooKmtpZCk7CiYjNDM7CQkvKiBJZiB3ZSBjYW5ub3Qgc3RvcmUgdGhlIElEcywgdGhleSB3aWxsIGJlIGxvc3QgYW5kIG9ubHkKJiM0MzsJCSAqIHJlY2xhaW1lZCBieSB0aGUgRlcgZHVyaW5nIHJlc2V0L3JlaW5pdC4KJiM0MzsJCSAqLwomIzQzOwkJaWYgKCFraWQpCiYjNDM7CQkJcmV0dXJuIC1FTk9NRU07CiYjNDM7CQlraWQtJmd0O3N0YXJ0X2lkID0gbGUzMl90b19jcHUoa2V5X2J1ZltpXSk7CiYjNDM7CQlraWQtJmd0O3R5cGUgPSBrY3R4LSZndDt0eXBlOwomIzQzOwkJa2lkLSZndDtraW5kID0ga2luZDsKJiM0MzsJCWlmIChjb250aWcpCiYjNDM7CQkJa2lkLSZndDtjb3VudCA9IG51bTsKJiM0MzsJCWVsc2UKJiM0MzsJCQlraWQtJmd0O2NvdW50ID0gMTsKJiM0MzsJCWJpdG1hcF9zZXQoa2lkLSZndDtpZHMsIDAsIGtpZC0mZ3Q7Y291bnQpOwomIzQzOwkJaWYgKGlkICZhbXA7JmFtcDsgIWkpIHsKJiM0MzsJCQljbGVhcl9iaXQoMCwga2lkLSZndDtpZHMpOwomIzQzOwkJCSppZCA9IEJOWFRfU0VUX0tJRChrY3R4LCBraWQtJmd0O3N0YXJ0X2lkKTsKJiM0MzsJCX0KJiM0MzsJCXNwaW5fbG9jaygmYW1wO2tjdHgtJmd0O2xvY2spOwomIzQzOwkJbGlzdF9hZGRfdGFpbF9yY3UoJmFtcDtraWQtJmd0O2xpc3QsICZhbXA7a2N0eC0mZ3Q7bGlzdCk7CiYjNDM7CQlXUklURV9PTkNFKGtjdHgtJmd0O3RvdGFsX2FsbG9jLAomIzQzOwkJCSAgIFJFQURfT05DRShrY3R4LSZndDt0b3RhbF9hbGxvYykgJiM0Mzsga2lkLSZndDtjb3VudCk7CiYjNDM7CQlzcGluX3VubG9jaygmYW1wO2tjdHgtJmd0O2xvY2spOwomIzQzOwkJaSAmIzQzOz0ga2lkLSZndDtjb3VudDsKJiM0MzsJfQomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogTm90ZSB0aGF0IHRoZSBkcml2ZXIgZG9lcyBub3QgZnJlZSB0aGUga2V5IGNvbnRleHRzLiAgVGhleSBhcmUgZnJlZWQKJiM0MzsgKiBieSB0aGUgRlcgZHVyaW5nIEZMUiBhbmQgSFdSTV9GVU5DX1JFU0VULgomIzQzOyAqLwomIzQzO3N0YXRpYyBpbnQgYm54dF9od3JtX2tleV9jdHhfYWxsb2Moc3RydWN0IGJueHQgKmJwLCBzdHJ1Y3QgYm54dF9rY3R4ICprY3R4LAomIzQzOwkJCQkgICB1OCBraW5kLCB1MzIgbnVtLCB1MzIgKmlkKQomIzQzO3sKJiM0MzsJc3RydWN0IGJueHRfY3J5cHRvX2luZm8gKmNyeXB0byA9IGJwLSZndDtjcnlwdG9faW5mbzsKJiM0MzsJc3RydWN0IGh3cm1fZnVuY19rZXlfY3R4X2FsbG9jX291dHB1dCAqcmVzcDsKJiM0MzsJc3RydWN0IGh3cm1fZnVuY19rZXlfY3R4X2FsbG9jX2lucHV0ICpyZXE7CiYjNDM7CWRtYV9hZGRyX3QgbWFwcGluZzsKJiM0MzsJaW50IHBlbmRpbmdfY291bnQ7CiYjNDM7CV9fbGUzMiAqa2V5X2J1ZjsKJiM0MzsJdTMyIG51bV9hbGxvYzsKJiM0MzsJYm9vbCBjb250aWc7CiYjNDM7CWludCByYzsKJiM0MzsKJiM0MzsJbnVtID0gbWluMyhudW0sIGNyeXB0by0mZ3Q7bWF4X2tleV9jdHhzX2FsbG9jLCAodTMyKUJOWFRfS0lEX0JBVENIX1NJWkUpOwomIzQzOwlyYyA9IGh3cm1fcmVxX2luaXQoYnAsIHJlcSwgSFdSTV9GVU5DX0tFWV9DVFhfQUxMT0MpOwomIzQzOwlpZiAocmMpCiYjNDM7CQlyZXR1cm4gcmM7CiYjNDM7CiYjNDM7CWtleV9idWYgPSBod3JtX3JlcV9kbWFfc2xpY2UoYnAsIHJlcSwgbnVtICogNCwgJmFtcDttYXBwaW5nKTsKJiM0MzsJaWYgKCFrZXlfYnVmKSB7CiYjNDM7CQlyYyA9IC1FTk9NRU07CiYjNDM7CQlnb3RvIGtleV9hbGxvY19leGl0OwomIzQzOwl9CiYjNDM7CXJlcS0mZ3Q7ZG1hX2J1ZnJfc2l6ZV9ieXRlcyA9IGNwdV90b19sZTMyKG51bSAqIDQpOwomIzQzOwlyZXEtJmd0O2hvc3RfZG1hX2FkZHIgPSBjcHVfdG9fbGU2NChtYXBwaW5nKTsKJiM0MzsJcmVzcCA9IGh3cm1fcmVxX2hvbGQoYnAsIHJlcSk7CiYjNDM7CiYjNDM7CXJlcS0mZ3Q7a2V5X2N0eF90eXBlID0ga2N0eC0mZ3Q7dHlwZTsKJiM0MzsJcmVxLSZndDtudW1fa2V5X2N0eHMgPSBjcHVfdG9fbGUxNihudW0pOwomIzQzOwomIzQzOwlwZW5kaW5nX2NvdW50ID0gYXRvbWljX2luY19yZXR1cm4oJmFtcDtrY3R4LSZndDthbGxvY19wZW5kaW5nKTsKJiM0MzsJcmMgPSBod3JtX3JlcV9zZW5kKGJwLCByZXEpOwomIzQzOwlhdG9taWNfZGVjKCZhbXA7a2N0eC0mZ3Q7YWxsb2NfcGVuZGluZyk7CiYjNDM7CWlmIChyYykKJiM0MzsJCWdvdG8ga2V5X2FsbG9jX2V4aXRfd2FrZTsKJiM0MzsKJiM0MzsJbnVtX2FsbG9jID0gbGUxNl90b19jcHUocmVzcC0mZ3Q7bnVtX2tleV9jdHhzX2FsbG9jYXRlZCk7CiYjNDM7CWlmIChudW1fYWxsb2MgJmd0OyBudW0pIHsKJiM0MzsJCW5ldGRldl93YXJuKGJwLSZndDtkZXYsCiYjNDM7CQkJICAgICYjMzQ7RlcgYWxsb2NhdGVkIG1vcmUgdHlwZSAlZCBrZXlzICglZCkgdGhhbiByZXF1ZXN0ZWQgKCVkKVxuJiMzNDssCiYjNDM7CQkJICAgIGtjdHgtJmd0O3R5cGUsIG51bV9hbGxvYywgbnVtKTsKJiM0MzsJfSBlbHNlIGlmICghbnVtX2FsbG9jKSB7CiYjNDM7CQluZXRkZXZfd2FybihicC0mZ3Q7ZGV2LAomIzQzOwkJCSAgICAmIzM0O0ZXIGFsbG9jYXRlZCAwIHR5cGUgJWQga2V5c1xuJiMzNDssIGtjdHgtJmd0O3R5cGUpOwomIzQzOwkJcmMgPSAtRU5PRU5UOwomIzQzOwkJZ290byBrZXlfYWxsb2NfZXhpdF93YWtlOwomIzQzOwl9IGVsc2UgewomIzQzOwkJbnVtID0gbnVtX2FsbG9jOwomIzQzOwl9CiYjNDM7CWNvbnRpZyA9IHJlc3AtJmd0O2ZsYWdzICZhbXA7CiYjNDM7CQkgRlVOQ19LRVlfQ1RYX0FMTE9DX1JFU1BfRkxBR1NfS0VZX0NUWFNfQ09OVElHVU9VUzsKJiM0MzsJcmMgPSBibnh0X2tleV9jdHhfc3RvcmUoa2N0eCwga2V5X2J1ZiwgbnVtLCBjb250aWcsIGtpbmQsIGlkKTsKJiM0MzsKJiM0MztrZXlfYWxsb2NfZXhpdF93YWtlOgomIzQzOwlpZiAocGVuZGluZ19jb3VudCAmZ3Q7PSBCTlhUX0tDVFhfQUxMT0NfUEVORElOR19NQVgpCiYjNDM7CQl3YWtlX3VwX2FsbCgmYW1wO2tjdHgtJmd0O2FsbG9jX3BlbmRpbmdfd3EpOwomIzQzO2tleV9hbGxvY19leGl0OgomIzQzOwlod3JtX3JlcV9kcm9wKGJwLCByZXEpOwomIzQzOwlyZXR1cm4gcmM7CiYjNDM7fQomIzQzOwomIzQzO2Jvb2wgYm54dF9raWRfdmFsaWQoc3RydWN0IGJueHRfa2N0eCAqa2N0eCwgdTMyIGlkKQomIzQzO3sKJiM0MzsJc3RydWN0IGJueHRfa2lkX2luZm8gKmtpZDsKJiM0MzsJYm9vbCB2YWxpZCA9IGZhbHNlOwomIzQzOwl1MzIgZXBvY2g7CiYjNDM7CiYjNDM7CWVwb2NoID0gQk5YVF9LSURfRVBPQ0goaWQpOwomIzQzOwlpZiAoZXBvY2ggIT0ga2N0eC0mZ3Q7ZXBvY2gpCiYjNDM7CQlyZXR1cm4gZmFsc2U7CiYjNDM7CiYjNDM7CWlkID0gQk5YVF9LSURfSFcoaWQpOwomIzQzOwlyY3VfcmVhZF9sb2NrKCk7CiYjNDM7CWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGtpZCwgJmFtcDtrY3R4LSZndDtsaXN0LCBsaXN0KSB7CiYjNDM7CQlpZiAoaWQgJmd0Oz0ga2lkLSZndDtzdGFydF9pZCAmYW1wOyZhbXA7IGlkICZsdDsga2lkLSZndDtzdGFydF9pZCAmIzQzOyBraWQtJmd0O2NvdW50KSB7CiYjNDM7CQkJaWYgKCF0ZXN0X2JpdChpZCAtIGtpZC0mZ3Q7c3RhcnRfaWQsIGtpZC0mZ3Q7aWRzKSkgewomIzQzOwkJCQl2YWxpZCA9IHRydWU7CiYjNDM7CQkJCWJyZWFrOwomIzQzOwkJCX0KJiM0MzsJCX0KJiM0MzsJfQomIzQzOwlyY3VfcmVhZF91bmxvY2soKTsKJiM0MzsJcmV0dXJuIHZhbGlkOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IGJueHRfYWxsb2Nfb25lX2tjdHgoc3RydWN0IGJueHRfa2N0eCAqa2N0eCwgdTgga2luZCwgdTMyICppZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBibnh0X2tpZF9pbmZvICpraWQ7CiYjNDM7CWludCByYyA9IC1FTk9NRU07CiYjNDM7CiYjNDM7CXJjdV9yZWFkX2xvY2soKTsKJiM0MzsJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3Uoa2lkLCAmYW1wO2tjdHgtJmd0O2xpc3QsIGxpc3QpIHsKJiM0MzsJCXUzMiBpZHggPSAwOwomIzQzOwomIzQzOwkJaWYgKGtpZC0mZ3Q7a2luZCAhPSBraW5kKQomIzQzOwkJCWNvbnRpbnVlOwomIzQzOwkJZG8gewomIzQzOwkJCWlkeCA9IGZpbmRfbmV4dF9iaXQoa2lkLSZndDtpZHMsIGtpZC0mZ3Q7Y291bnQsIGlkeCk7CiYjNDM7CQkJaWYgKGlkeCAmZ3Q7PSBraWQtJmd0O2NvdW50KQomIzQzOwkJCQlicmVhazsKJiM0MzsJCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KGlkeCwga2lkLSZndDtpZHMpKSB7CiYjNDM7CQkJCSppZCA9IEJOWFRfU0VUX0tJRChrY3R4LCBraWQtJmd0O3N0YXJ0X2lkICYjNDM7IGlkeCk7CiYjNDM7CQkJCXJjID0gMDsKJiM0MzsJCQkJZ290byBhbGxvY19kb25lOwomIzQzOwkJCX0KJiM0MzsJCX0gd2hpbGUgKDEpOwomIzQzOwl9CiYjNDM7CiYjNDM7YWxsb2NfZG9uZToKJiM0MzsJcmN1X3JlYWRfdW5sb2NrKCk7CiYjNDM7CXJldHVybiByYzsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogYm54dF9mcmVlX29uZV9rY3R4IC0gRnJlZSBhIGtleSBjb250ZXh0IGZvciBsYXRlciByZS11c2UKJiM0MzsgKiBAa2N0eDogcG9pbnRlciB0byBibnh0X2tjdHgga2V5IGNvbnRleHQgc3RydWN0dXJlCiYjNDM7ICogQGlkOiBLZXkgY29udGV4dCBJRAomIzQzOyAqCiYjNDM7ICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gZnJlZSBhIGtleSBjb250ZXh0IElEIHdoZW4gdGhlIG9mZmxvYWQKJiM0MzsgKiB1c2luZyB0aGUgSUQgaGFzIHN1Y2Nlc3NmdWxseSB0ZXJtaW5hdGVkIG9yIGFib3J0ZWQuICBJZiB0aGUgb2ZmbG9hZAomIzQzOyAqIGNhbm5vdCBiZSB0ZXJtaW5hdGVkLCB0aGUgY2FsbGVyIHNob3VsZCBub3QgY2FsbCB0aGlzIGZ1bmN0aW9uIHRvIGZyZWUKJiM0MzsgKiB0aGUgSUQuICBUaGUgSUQgd2lsbCBvbmx5IGJlIHJlY3ljbGVkIGJ5IHRoZSBGVyBkdXJpbmcgcmVzZXQvcmVpbml0LgomIzQzOyAqCiYjNDM7ICogVGhlIElEIGlzIG1hdGNoZWQgYnkgaXRzIGhhcmR3YXJlIGlkIG9ubHkgKGVwb2NoIHN0cmlwcGVkKSwgc28gdGhlIGNhbGxlcgomIzQzOyAqIG11c3QgZW5zdXJlIGl0IGlzIHZhbGlkIGZvciB0aGUgY3VycmVudCBlcG9jaC4KJiM0MzsgKi8KJiM0Mzt2b2lkIGJueHRfZnJlZV9vbmVfa2N0eChzdHJ1Y3QgYm54dF9rY3R4ICprY3R4LCB1MzIgaWQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYm54dF9raWRfaW5mbyAqa2lkOwomIzQzOwomIzQzOwlpZCA9IEJOWFRfS0lEX0hXKGlkKTsKJiM0MzsJcmN1X3JlYWRfbG9jaygpOwomIzQzOwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShraWQsICZhbXA7a2N0eC0mZ3Q7bGlzdCwgbGlzdCkgewomIzQzOwkJaWYgKGlkICZndDs9IGtpZC0mZ3Q7c3RhcnRfaWQgJmFtcDsmYW1wOyBpZCAmbHQ7IGtpZC0mZ3Q7c3RhcnRfaWQgJiM0Mzsga2lkLSZndDtjb3VudCkgewomIzQzOwkJCXNldF9iaXQoaWQgLSBraWQtJmd0O3N0YXJ0X2lkLCBraWQtJmd0O2lkcyk7CiYjNDM7CQkJYnJlYWs7CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsJcmN1X3JlYWRfdW5sb2NrKCk7CiYjNDM7fQomIzQzOwomIzQzOyNkZWZpbmUgQk5YVF9LQ1RYX0FMTE9DX1JFVFJZX01BWAkzCiYjNDM7CiYjNDM7aW50IGJueHRfa2V5X2N0eF9hbGxvY19vbmUoc3RydWN0IGJueHQgKmJwLCBzdHJ1Y3QgYm54dF9rY3R4ICprY3R4LCB1OCBraW5kLAomIzQzOwkJCSAgIHUzMiAqaWQpCiYjNDM7ewomIzQzOwlpbnQgcmMsIHJldHJ5ID0gMDsKJiM0MzsKJiM0MzsJd2hpbGUgKHJldHJ5JiM0MzsmIzQzOyAmbHQ7IEJOWFRfS0NUWF9BTExPQ19SRVRSWV9NQVgpIHsKJiM0MzsJCXJjID0gYm54dF9hbGxvY19vbmVfa2N0eChrY3R4LCBraW5kLCBpZCk7CiYjNDM7CQlpZiAoIXJjKQomIzQzOwkJCXJldHVybiAwOwomIzQzOwomIzQzOwkJLyogV2hlbiBhcHByb2FjaGluZyB0aGUgbWF4LCBtdWx0aXBsZSB0aHJlYWRzIG1heSBwcm9jZWVkCiYjNDM7CQkgKiBhbmQgZXhjZWVkIHRoZSBtYXguICBTb21lIG1heSBmYWlsIHRoZSBzZXJpYWxpemVkIEhXUk0gY2FsbAomIzQzOwkJICogbGF0ZXIgd2hlbiB0aGUgbWF4IGlzIGV4Y2VlZGVkLgomIzQzOwkJICovCiYjNDM7CQlpZiAoKFJFQURfT05DRShrY3R4LSZndDt0b3RhbF9hbGxvYykgJiM0MzsgQk5YVF9LSURfQkFUQ0hfU0laRSkgJmd0OwomIzQzOwkJICAgIGtjdHgtJmd0O21heF9jdHgpCiYjNDM7CQkJcmV0dXJuIC1FTk9TUEM7CiYjNDM7CiYjNDM7CQlpZiAoIUJOWFRfS0NUWF9BTExPQ19PSyhrY3R4KSkgewomIzQzOwkJCXdhaXRfZXZlbnQoa2N0eC0mZ3Q7YWxsb2NfcGVuZGluZ193cSwKJiM0MzsJCQkJICAgQk5YVF9LQ1RYX0FMTE9DX09LKGtjdHgpKTsKJiM0MzsJCQljb250aW51ZTsKJiM0MzsJCX0KJiM0MzsJCXJjID0gYm54dF9od3JtX2tleV9jdHhfYWxsb2MoYnAsIGtjdHgsIGtpbmQsCiYjNDM7CQkJCQkgICAgIEJOWFRfS0lEX0JBVENIX1NJWkUsIGlkKTsKJiM0MzsJCWlmICghcmMpCiYjNDM7CQkJcmV0dXJuIDA7CiYjNDM7CX0KJiM0MzsJcmV0dXJuIC1FQUdBSU47CiYjNDM7fQomIzQzOwomIzQzOyNkZWZpbmUgQk5YVF9YTUlUX0NSWVBUT19SRVRSWV9NQVgJMTAKJiM0MzsjZGVmaW5lIEJOWFRfWE1JVF9DUllQVE9fTUlOX1RNTwkxMDAKJiM0MzsjZGVmaW5lIEJOWFRfWE1JVF9DUllQVE9fTUFYX1RNTwkxNTAKJiM0MzsKJiM0MztpbnQgYm54dF94bWl0X2NyeXB0b19jbWQoc3RydWN0IGJueHQgKmJwLCBzdHJ1Y3QgYm54dF90eF9yaW5nX2luZm8gKnR4ciwKJiM0MzsJCQkgdm9pZCAqY21kLCB1bnNpZ25lZCBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgdG1vKQomIzQzO3sKJiM0MzsJc3RydWN0IGJueHRfY3J5cHRvX2luZm8gKmNyeXB0byA9IGJwLSZndDtjcnlwdG9faW5mbzsKJiM0MzsJc3RydWN0IGJueHRfY3J5cHRvX2NtZF9jdHggKmN0eCA9IE5VTEw7CiYjNDM7CXVuc2lnbmVkIGxvbmcgdG1vX2xlZnQsIGhhbmRsZSA9IDA7CiYjNDM7CWludCByYywgcmV0cnkgPSAwOwomIzQzOwomIzQzOwlpZiAodG1vKSB7CiYjNDM7CQl1MzIga2lkID0gQ0VfQ01EX0tJRChjbWQpOwomIzQzOwomIzQzOwkJY3R4ID0ga21lbV9jYWNoZV9hbGxvYyhjcnlwdG8tJmd0O21wY19jYWNoZSwgR0ZQX0tFUk5FTCk7CiYjNDM7CQlpZiAoIWN0eCkKJiM0MzsJCQlyZXR1cm4gLUVOT01FTTsKJiM0MzsJCWluaXRfY29tcGxldGlvbigmYW1wO2N0eC0mZ3Q7Y21wKTsKJiM0MzsJCWhhbmRsZSA9ICh1bnNpZ25lZCBsb25nKWN0eDsKJiM0MzsJCWN0eC0mZ3Q7a2lkID0ga2lkOwomIzQzOwkJY3R4LSZndDtjbGllbnQgPSB0eHItJmd0O3R4X3Jpbmdfc3RydWN0Lm1wY19jaG5sX3R5cGU7CiYjNDM7CQljdHgtJmd0O3N0YXR1cyA9IDA7CiYjNDM7CQkvKiBPbmUgcmVmZXJlbmNlIGZvciB0aGlzIGNhbGxlciwgb25lIGZvciB0aGUgaGFuZGxlIHN0b3JlZCBpbgomIzQzOwkJICogdGhlIFRYIGJ1ZiByaW5nLiAgVGhlIGxhdHRlciBpcyBkcm9wcGVkIGJ5CiYjNDM7CQkgKiBibnh0X2NyeXB0b19tcGNfY21wKCkgd2hlbiB0aGUgY29tbWFuZCBpcyBjb21wbGV0ZWQgbm9ybWFsbHkKJiM0MzsJCSAqIG9yIGFmdGVyIHRpbWVvdXQuCiYjNDM7CQkgKi8KJiM0MzsJCXJlZmNvdW50X3NldCgmYW1wO2N0eC0mZ3Q7cmVmY250LCAyKTsKJiM0MzsJCXJldHJ5ID0gQk5YVF9YTUlUX0NSWVBUT19SRVRSWV9NQVg7CiYjNDM7CQltaWdodF9zbGVlcCgpOwomIzQzOwl9CiYjNDM7CWRvIHsKJiM0MzsJCXNwaW5fbG9ja19iaCgmYW1wO3R4ci0mZ3Q7dHhfbG9jayk7CiYjNDM7CQlyYyA9IGJueHRfc3RhcnRfeG1pdF9tcGMoYnAsIHR4ciwgY21kLCBsZW4sIGhhbmRsZSk7CiYjNDM7CQlzcGluX3VubG9ja19iaCgmYW1wO3R4ci0mZ3Q7dHhfbG9jayk7CiYjNDM7CQlpZiAocmMgPT0gLUVCVVNZICZhbXA7JmFtcDsgdG1vICZhbXA7JmFtcDsgcmV0cnkpCiYjNDM7CQkJdXNsZWVwX3JhbmdlKEJOWFRfWE1JVF9DUllQVE9fTUlOX1RNTywKJiM0MzsJCQkJICAgICBCTlhUX1hNSVRfQ1JZUFRPX01BWF9UTU8pOwomIzQzOwkJZWxzZQomIzQzOwkJCWJyZWFrOwomIzQzOwl9IHdoaWxlIChyZXRyeS0tKTsKJiM0MzsJaWYgKHJjIHx8ICF0bW8pIHsKJiM0MzsJCS8qIFRoZSBjb21wbGV0aW9uIHdpbGwgbmV2ZXIgYXJyaXZlLCBkcm9wIG9uZSByZWZlcmVuY2UgKi8KJiM0MzsJCWlmIChjdHgpCiYjNDM7CQkJcmVmY291bnRfZGVjKCZhbXA7Y3R4LSZndDtyZWZjbnQpOwomIzQzOwkJZ290byB4bWl0X2RvbmU7CiYjNDM7CX0KJiM0MzsKJiM0MzsJdG1vX2xlZnQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmFtcDtjdHgtJmd0O2NtcCwgbXNlY3NfdG9famlmZmllcyh0bW8pKTsKJiM0MzsJaWYgKCF0bW9fbGVmdCkgewomIzQzOwkJbmV0ZGV2X3dhcm4oYnAtJmd0O2RldiwgJiMzNDtjcnlwdG8gTVAgY21kICUwOHggdGltZWQgb3V0XG4mIzM0OywKJiM0MzsJCQkgICAgKigodTMyICopY21kKSk7CiYjNDM7CQlibnh0X21wY190aW1lb3V0KGJwLCB0eHIpOwomIzQzOwkJcmMgPSAtRVRJTUVET1VUOwomIzQzOwkJZ290byB4bWl0X2RvbmU7CiYjNDM7CX0KJiM0MzsJaWYgKGN0eC0mZ3Q7c3RhdHVzID09IEJOWFRfQ01EX0NUWF9DT01QTEVURUQgJmFtcDsmYW1wOwomIzQzOwkgICAgQ0VfQ01QTF9TVEFUVVMoJmFtcDtjdHgtJmd0O2NlX2NtcCkgPT0gQ0VfQ01QTF9TVEFUVVNfT0spCiYjNDM7CQlyYyA9IDA7CiYjNDM7CWVsc2UKJiM0MzsJCXJjID0gLUVJTzsKJiM0Mzt4bWl0X2RvbmU6CiYjNDM7CWlmIChyYykgewomIzQzOwkJdTggc3RhdHVzID0gY3R4ID8gY3R4LSZndDtzdGF0dXMgOiAwOwomIzQzOwomIzQzOwkJbmV0ZGV2X3dhcm4oYnAtJmd0O2RldiwKJiM0MzsJCQkgICAgJiMzNDtNUEMgdHJhbnNtaXQgZmFpbGVkLCByaW5nIGlkeCAlZCwgb3AgMHgleCwga2lkIDB4JXgsIHN0YXR1cyAweCV4XG4mIzM0OywKJiM0MzsJCQkgICAgdHhyLSZndDtibmFwaS0mZ3Q7aW5kZXgsIENFX0NNRF9PUChjbWQpLCBDRV9DTURfS0lEKGNtZCksCiYjNDM7CQkJICAgIHN0YXR1cyk7CiYjNDM7CX0KJiM0MzsJaWYgKGN0eCAmYW1wOyZhbXA7IHJlZmNvdW50X2RlY19hbmRfdGVzdCgmYW1wO2N0eC0mZ3Q7cmVmY250KSkKJiM0MzsJCWttZW1fY2FjaGVfZnJlZShjcnlwdG8tJmd0O21wY19jYWNoZSwgY3R4KTsKJiM0MzsJcmV0dXJuIHJjOwomIzQzO30KJiM0MzsKJiM0MztpbnQgYm54dF9jcnlwdG9faW5pdChzdHJ1Y3QgYm54dCAqYnApCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYm54dF9jcnlwdG9faW5mbyAqY3J5cHRvID0gYnAtJmd0O2NyeXB0b19pbmZvOwomIzQzOwlzdHJ1Y3QgYm54dF9od19yZXNjICpod19yZXNjID0gJmFtcDticC0mZ3Q7aHdfcmVzYzsKJiM0MzsJc3RydWN0IGJueHRfaHdfY3J5cHRvX3Jlc2MgKmNyeXB0b19yZXNjOwomIzQzOwlpbnQgcmM7CiYjNDM7CiYjNDM7CWlmICghY3J5cHRvIHx8ICFCTlhUX1NVUFBPUlRTX0tUTFMoYnApKQomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CiYjNDM7CWNyeXB0b19yZXNjID0gJmFtcDtod19yZXNjLSZndDtjcnlwdG9fcmVzYzsKJiM0MzsJQk5YVF9UQ0soY3J5cHRvKS5tYXhfY3R4ID0gY3J5cHRvX3Jlc2MtJmd0O3Jlc3ZfdHhfa2V5X2N0eHM7CiYjNDM7CUJOWFRfUkNLKGNyeXB0bykubWF4X2N0eCA9IGNyeXB0b19yZXNjLSZndDtyZXN2X3J4X2tleV9jdHhzOwomIzQzOwomIzQzOwlpZiAoIUJOWFRfVENLKGNyeXB0bykubWF4X2N0eCB8fCAhQk5YVF9SQ0soY3J5cHRvKS5tYXhfY3R4KQomIzQzOwkJcmV0dXJuIC1FTk9ERVY7CiYjNDM7CiYjNDM7CXJjID0gYm54dF9od3JtX2tleV9jdHhfYWxsb2MoYnAsICZhbXA7Qk5YVF9UQ0soY3J5cHRvKSwgQk5YVF9DVFhfS0lORF9DS19UWCwKJiM0MzsJCQkJICAgICBCTlhUX0tJRF9CQVRDSF9TSVpFLCBOVUxMKTsKJiM0MzsJaWYgKHJjKQomIzQzOwkJcmV0dXJuIHJjOwomIzQzOwomIzQzOwlyYyA9IGJueHRfaHdybV9rZXlfY3R4X2FsbG9jKGJwLCAmYW1wO0JOWFRfUkNLKGNyeXB0byksIEJOWFRfQ1RYX0tJTkRfQ0tfUlgsCiYjNDM7CQkJCSAgICAgQk5YVF9LSURfQkFUQ0hfU0laRSwgTlVMTCk7CiYjNDM7CWlmIChyYykKJiM0MzsJCXJldHVybiByYzsKJiM0MzsKJiM0MzsJYm54dF9rdGxzX2luaXQoYnApOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7dm9pZCBibnh0X2NyeXB0b19tcGNfY21wKHN0cnVjdCBibnh0ICpicCwgdTMyIGNsaWVudCwgdW5zaWduZWQgbG9uZyBoYW5kbGUsCiYjNDM7CQkJIHN0cnVjdCBibnh0X2NtcGxfZW50cnkgY21wbFtdLCB1MzIgZW50cmllcykKJiM0Mzt7CiYjNDM7CXN0cnVjdCBibnh0X2NyeXB0b19jbWRfY3R4ICpjdHg7CiYjNDM7CXN0cnVjdCBjZV9jbXBsICpjbXAgPSBOVUxMOwomIzQzOwl1MzIgbGVuLCBraWQ7CiYjNDM7CiYjNDM7CWlmIChsaWtlbHkoY21wbCkpCiYjNDM7CQljbXAgPSBjbXBsWzBdLmNtcGw7CiYjNDM7CWlmICghaGFuZGxlIHx8IGVudHJpZXMgIT0gMSkgewomIzQzOwkJaWYgKGVudHJpZXMgIT0gMSAmYW1wOyZhbXA7IGNtcGwpIHsKJiM0MzsJCQluZXRkZXZfd2FybihicC0mZ3Q7ZGV2LCAmIzM0O0ludmFsaWQgZW50cmllcyAlZCB3aXRoIGhhbmRsZSAlbHggY21wbCAlMDh4IGluICVzKClcbiYjMzQ7LAomIzQzOwkJCQkgICAgZW50cmllcywgaGFuZGxlLCAqKHUzMiAqKWNtcCwgX19mdW5jX18pOwomIzQzOwkJfQomIzQzOwkJaWYgKCFoYW5kbGUpCiYjNDM7CQkJcmV0dXJuOwomIzQzOwl9CiYjNDM7CWN0eCA9ICh2b2lkICopaGFuZGxlOwomIzQzOwljdHgtJmd0O3N0YXR1cyA9IEJOWFRfQ01EX0NUWF9DT01QTEVURUQ7CiYjNDM7CWlmICh1bmxpa2VseSghY21wbCkpIHsKJiM0MzsJCWN0eC0mZ3Q7c3RhdHVzIHw9IEJOWFRfQ01EX0NUWF9SRVNFVDsKJiM0MzsJCWdvdG8gY21wX2RvbmU7CiYjNDM7CX0KJiM0MzsJa2lkID0gQ0VfQ01QTF9LSUQoY21wKTsKJiM0MzsJaWYgKGN0eC0mZ3Q7a2lkICE9IGtpZCB8fCBjdHgtJmd0O2NsaWVudCAhPSBjbGllbnQgfHwgZW50cmllcyAhPSAxKSB7CiYjNDM7CQluZXRkZXZfd2FybihicC0mZ3Q7ZGV2LAomIzQzOwkJCSAgICAmIzM0O0ludmFsaWQgQ0UgY21wbCAweCUwOHggd2l0aCBlbnRyaWVzICVkIGZvciBjbGllbnQgJWQgd2l0aCBzdGF0dXMgMHgleCwgZXhwZWN0ZWQga2lkIDB4JXggYW5kIGNsaWVudCAlZFxuJiMzNDssCiYjNDM7CQkJICAgICoodTMyICopY21wLCBlbnRyaWVzLCBjbGllbnQsIGN0eC0mZ3Q7c3RhdHVzLCBjdHgtJmd0O2tpZCwKJiM0MzsJCQkgICAgY3R4LSZndDtjbGllbnQpOwomIzQzOwkJY3R4LSZndDtzdGF0dXMgfD0gQk5YVF9DTURfQ1RYX0VSUk9SOwomIzQzOwl9CiYjNDM7CWxlbiA9IG1pbl90KHUzMiwgY21wbFswXS5sZW4sIHNpemVvZihjdHgtJmd0O2NlX2NtcCkpOwomIzQzOwltZW1jcHkoJmFtcDtjdHgtJmd0O2NlX2NtcCwgY21wbFswXS5jbXBsLCBsZW4pOwomIzQzO2NtcF9kb25lOgomIzQzOwljb21wbGV0ZSgmYW1wO2N0eC0mZ3Q7Y21wKTsKJiM0MzsJaWYgKHJlZmNvdW50X2RlY19hbmRfdGVzdCgmYW1wO2N0eC0mZ3Q7cmVmY250KSkKJiM0MzsJCWttZW1fY2FjaGVfZnJlZShicC0mZ3Q7Y3J5cHRvX2luZm8tJmd0O21wY19jYWNoZSwgY3R4KTsKJiM0Mzt9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibnh0L2JueHRfY3J5cHRvLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibnh0L2JueHRfY3J5cHRvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAuLmQ0NzU5MDU5YTZkMjMwCi0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9ibnh0X2NyeXB0by5oCkBAIC0wLDAgJiM0MzsxLDIzMCBAQAomIzQzOy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHkgKi8KJiM0MzsvKiBDb3B5cmlnaHQgKGMpIDIwMjYgQnJvYWRjb20gSW5jLiAqLwomIzQzOwomIzQzOyNpZm5kZWYgQk5YVF9DUllQVE9fSAomIzQzOyNkZWZpbmUgQk5YVF9DUllQVE9fSAomIzQzOwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9yZWZjb3VudC5oJmd0OwomIzQzOwomIzQzOyNkZWZpbmUgQk5YVF9NQVhfVFhfQ1JZUFRPX0tFWVMJCTIwNDgwMAomIzQzOyNkZWZpbmUgQk5YVF9NQVhfUlhfQ1JZUFRPX0tFWVMJCTIwNDgwMAomIzQzOwomIzQzOyNkZWZpbmUgQk5YVF9NQVhfVFhfQ1JZUFRPX0tFWVNfUFJFXzIzM0ZXCTY1NTM1CiYjNDM7I2RlZmluZSBCTlhUX01BWF9SWF9DUllQVE9fS0VZU19QUkVfMjMzRlcJNjU1MzUKJiM0MzsKJiM0MztlbnVtIGJueHRfY3J5cHRvX3R5cGUgewomIzQzOwlCTlhUX1RYX0NSWVBUT19LRVlfVFlQRSA9IEZVTkNfS0VZX0NUWF9BTExPQ19SRVFfS0VZX0NUWF9UWVBFX1RYLAomIzQzOwlCTlhUX1JYX0NSWVBUT19LRVlfVFlQRSA9IEZVTkNfS0VZX0NUWF9BTExPQ19SRVFfS0VZX0NUWF9UWVBFX1JYLAomIzQzOwlCTlhUX01BWF9DUllQVE9fS0VZX1RZUEUsCiYjNDM7fTsKJiM0MzsKJiM0MzsvKiBNYXhpbXVtIGtleXMgc3VwcG9ydGVkIGJ5IG5ld2VyIEZXIGFsd2F5cyBtdWx0aXBsZXMgb2YgMTI4ICovCiYjNDM7I2RlZmluZSBCTlhUX0tJRF9CQVRDSF9TSVpFCTEyOAomIzQzOwomIzQzO3N0cnVjdCBibnh0X2tpZF9pbmZvIHsKJiM0MzsJc3RydWN0IGxpc3RfaGVhZAlsaXN0OwomIzQzOwl1OAkJCXR5cGU7CiYjNDM7CXU4CQkJa2luZDsKJiM0MzsJdTMyCQkJc3RhcnRfaWQ7CiYjNDM7CXUzMgkJCWNvdW50OwomIzQzOwlERUNMQVJFX0JJVE1BUChpZHMsIEJOWFRfS0lEX0JBVENIX1NJWkUpOwomIzQzO307CiYjNDM7CiYjNDM7c3RydWN0IGJueHRfa2N0eCB7CiYjNDM7CXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKJiM0MzsJLyogdG8gc2VyaWFsaXplIHVwZGF0ZSB0byB0aGUgbGlua2VkIGxpc3QgYW5kIHRvdGFsX2FsbG9jICovCiYjNDM7CXNwaW5sb2NrX3QJCWxvY2s7CiYjNDM7CXU4CQkJdHlwZTsKJiM0MzsJdTE2CQkJZXBvY2g7CiYjNDM7CXUzMgkJCXRvdGFsX2FsbG9jOwomIzQzOwl1MzIJCQltYXhfY3R4OwomIzQzOwlhdG9taWNfdAkJYWxsb2NfcGVuZGluZzsKJiM0MzsjZGVmaW5lIEJOWFRfS0NUWF9BTExPQ19QRU5ESU5HX01BWAk4CiYjNDM7CXdhaXRfcXVldWVfaGVhZF90CWFsbG9jX3BlbmRpbmdfd3E7CiYjNDM7fTsKJiM0MzsKJiM0MzsjZGVmaW5lIEJOWFRfS0lEX0hXX01BU0sJMHgwMDBmZmZmZgomIzQzOyNkZWZpbmUgQk5YVF9LSURfSFcoa2lkKQkoKGtpZCkgJmFtcDsgQk5YVF9LSURfSFdfTUFTSykKJiM0MzsjZGVmaW5lIEJOWFRfS0lEX0VQT0NIX01BU0sJMHhmZmYwMDAwMAomIzQzOyNkZWZpbmUgQk5YVF9LSURfRVBPQ0hfU0hJRlQJMjAKJiM0MzsjZGVmaW5lIEJOWFRfS0lEX0VQT0NIKGtpZCkJKCgoa2lkKSAmYW1wOyBCTlhUX0tJRF9FUE9DSF9NQVNLKSAmZ3Q7Jmd0OwlcCiYjNDM7CQkJCSBCTlhUX0tJRF9FUE9DSF9TSElGVCkKJiM0MzsKJiM0MzsjZGVmaW5lIEJOWFRfTkVYVF9FUE9DSChlcG9jaCkJXAomIzQzOwkoKChlcG9jaCkgJiM0MzsgMSkgJmFtcDsgKEJOWFRfS0lEX0VQT0NIX01BU0sgJmd0OyZndDsgQk5YVF9LSURfRVBPQ0hfU0hJRlQpKQomIzQzOwomIzQzOyNkZWZpbmUgQk5YVF9TRVRfS0lEKGtjdHgsIGtpZCkJCQkJCQlcCiYjNDM7CSgoa2lkKSB8ICgodTMyKShrY3R4KS0mZ3Q7ZXBvY2ggJmx0OyZsdDsgQk5YVF9LSURfRVBPQ0hfU0hJRlQpKQomIzQzOwomIzQzOyNkZWZpbmUgQk5YVF9LQ1RYX0FMTE9DX09LKGtjdHgpCVwKJiM0MzsJKGF0b21pY19yZWFkKCZhbXA7KChrY3R4KS0mZ3Q7YWxsb2NfcGVuZGluZykpICZsdDsgQk5YVF9LQ1RYX0FMTE9DX1BFTkRJTkdfTUFYKQomIzQzOwomIzQzO3N0cnVjdCBibnh0X2NyeXB0b19pbmZvIHsKJiM0MzsJdTE2CQkJbWF4X2tleV9jdHhzX2FsbG9jOwomIzQzOwomIzQzOwlzdHJ1Y3QgYm54dF9rY3R4CWtjdHhbQk5YVF9NQVhfQ1JZUFRPX0tFWV9UWVBFXTsKJiM0MzsKJiM0MzsJc3RydWN0IGttZW1fY2FjaGUJKm1wY19jYWNoZTsKJiM0Mzt9OwomIzQzOwomIzQzO3N0cnVjdCBjZV9kZWxldGVfY21kIHsKJiM0MzsJX19sZTMyICBjdHhfa2luZF9raWRfb3Bjb2RlOwomIzQzOwkjZGVmaW5lIENFX0RFTEVURV9DTURfT1BDT0RFX01BU0sJCTB4ZlVMCiYjNDM7CSNkZWZpbmUgQ0VfREVMRVRFX0NNRF9PUENPREVfU0ZUCQkwCiYjNDM7CSNkZWZpbmUgQ0VfREVMRVRFX0NNRF9PUENPREVfREVMCQkgMHgyVUwKJiM0MzsJI2RlZmluZSBDRV9ERUxFVEVfQ01EX0tJRF9NQVNLCQkJMHhmZmZmZjBVTAomIzQzOwkjZGVmaW5lIENFX0RFTEVURV9DTURfS0lEX1NGVAkJCTQKJiM0MzsJI2RlZmluZSBDRV9ERUxFVEVfQ01EX0NUWF9LSU5EX01BU0sJCTB4MWYwMDAwMDBVTAomIzQzOwkjZGVmaW5lIENFX0RFTEVURV9DTURfQ1RYX0tJTkRfU0ZUCQkyNAomIzQzOwkjZGVmaW5lIENFX0RFTEVURV9DTURfQ1RYX0tJTkRfQ0tfVFgJCSAoMHgxMVVMICZsdDsmbHQ7IDI0KQomIzQzOwkjZGVmaW5lIENFX0RFTEVURV9DTURfQ1RYX0tJTkRfQ0tfUlgJCSAoMHgxMlVMICZsdDsmbHQ7IDI0KQomIzQzO307CiYjNDM7CiYjNDM7I2RlZmluZSBDRV9DTURfT1BfTUFTSwkJCTB4MDAwMDBmVQomIzQzOyNkZWZpbmUgQ0VfQ01EX0tJRF9NQVNLCQkJMHhmZmZmZjBVCiYjNDM7I2RlZmluZSBDRV9DTURfS0lEX1NGVAkJCTQKJiM0MzsKJiM0MzsjZGVmaW5lIENFX0NNRF9PUChjbWRfcCkJCQkJCVwKJiM0MzsJKGxlMzJfdG9fY3B1KCooX19sZTMyICopKGNtZF9wKSkgJmFtcDsgQ0VfQ01EX09QX01BU0spCiYjNDM7CiYjNDM7I2RlZmluZSBDRV9DTURfS0lEKGNtZF9wKQkJCQkJXAomIzQzOwkoKGxlMzJfdG9fY3B1KCooX19sZTMyICopKGNtZF9wKSkgJmFtcDsgQ0VfQ01EX0tJRF9NQVNLKSAmZ3Q7Jmd0OyBDRV9DTURfS0lEX1NGVCkKJiM0MzsKJiM0MztzdHJ1Y3QgY2VfY21wbCB7CiYjNDM7CV9fbGUxNgljbGllbnRfc3VidHlwZV90eXBlOwomIzQzOwkjZGVmaW5lIENFX0NNUExfVFlQRV9NQVNLCQkJMHgzZlVMCiYjNDM7CSNkZWZpbmUgQ0VfQ01QTF9UWVBFX1NGVAkJCTAKJiM0MzsJI2RlZmluZSBDRV9DTVBMX1RZUEVfTUlEX1BBVEhfU0hPUlQJCSAweDFlVUwKJiM0MzsJI2RlZmluZSBDRV9DTVBMX1NVQlRZUEVfTUFTSwkJCTB4ZjAwVUwKJiM0MzsJI2RlZmluZSBDRV9DTVBMX1NVQlRZUEVfU0ZUCQkJOAomIzQzOwkjZGVmaW5lIENFX0NNUExfU1VCVFlQRV9TT0xJQ0lURUQJCSAoMHgwVUwgJmx0OyZsdDsgOCkKJiM0MzsJI2RlZmluZSBDRV9DTVBMX1NVQlRZUEVfRVJSCQkJICgweDFVTCAmbHQ7Jmx0OyA4KQomIzQzOwkjZGVmaW5lIENFX0NNUExfU1VCVFlQRV9SRVNZTkMJCQkgKDB4MlVMICZsdDsmbHQ7IDgpCiYjNDM7CSNkZWZpbmUgQ0VfQ01QTF9NUF9DTElFTlRfTUFTSwkJCTB4ZjAwMFVMCiYjNDM7CSNkZWZpbmUgQ0VfQ01QTF9NUF9DTElFTlRfU0ZUCQkJMTIKJiM0MzsJI2RlZmluZSBDRV9DTVBMX01QX0NMSUVOVF9UQ0UJCQkgKDB4MFVMICZsdDsmbHQ7IDEyKQomIzQzOwkjZGVmaW5lIENFX0NNUExfTVBfQ0xJRU5UX1JDRQkJCSAoMHgxVUwgJmx0OyZsdDsgMTIpCiYjNDM7CV9fbGUxNglzdGF0dXM7CiYjNDM7CSNkZWZpbmUgQ0VfQ01QTF9TVEFUVVNfTUFTSwkJCTB4ZlVMCiYjNDM7CSNkZWZpbmUgQ0VfQ01QTF9TVEFUVVNfU0ZUCQkJMAomIzQzOwkjZGVmaW5lIENFX0NNUExfU1RBVFVTX09LCQkJIDB4MFVMCiYjNDM7CSNkZWZpbmUgQ0VfQ01QTF9TVEFUVVNfQ1RYX0xEX0VSUgkJIDB4MVVMCiYjNDM7CSNkZWZpbmUgQ0VfQ01QTF9TVEFUVVNfRklEX0NIS19FUlIJCSAweDJVTAomIzQzOwkjZGVmaW5lIENFX0NNUExfU1RBVFVTX0NUWF9WRVJfRVJSCQkgMHgzVUwKJiM0MzsJI2RlZmluZSBDRV9DTVBMX1NUQVRVU19EU1RfSURfRVJSCQkgMHg0VUwKJiM0MzsJI2RlZmluZSBDRV9DTVBMX1NUQVRVU19NUF9DTURfRVJSCQkgMHg1VUwKJiM0MzsJdTMyCW9wYXF1ZTsKJiM0MzsJX19sZTMyCXY7CiYjNDM7CSNkZWZpbmUgQ0VfQ01QTF9WICAgICAgICAgICAweDFVTAomIzQzOwlfX2xlMzIJa2lkOwomIzQzOwkjZGVmaW5lIENFX0NNUExfS0lEX01BU0sgICAgMHhmZmZmZlVMCiYjNDM7CSNkZWZpbmUgQ0VfQ01QTF9LSURfU0ZUICAgICAwCiYjNDM7fTsKJiM0MzsKJiM0MzsjZGVmaW5lIENFX0NNUExfU1RBVFVTKGNlX2NtcGwpCQkJCQkJXAomIzQzOwkobGUxNl90b19jcHUoKGNlX2NtcGwpLSZndDtzdGF0dXMpICZhbXA7IENFX0NNUExfU1RBVFVTX01BU0spCiYjNDM7CiYjNDM7I2RlZmluZSBDRV9DTVBMX0tJRChjZV9jbXBsKQkJCQkJCVwKJiM0MzsJKGxlMzJfdG9fY3B1KChjZV9jbXBsKS0mZ3Q7a2lkKSAmYW1wOyBDRV9DTVBMX0tJRF9NQVNLKQomIzQzOwomIzQzO3N0cnVjdCBibnh0X2NyeXB0b19jbWRfY3R4IHsKJiM0MzsJc3RydWN0IGNvbXBsZXRpb24gY21wOwomIzQzOwlzdHJ1Y3QgY2VfY21wbCBjZV9jbXA7CiYjNDM7CXJlZmNvdW50X3QgcmVmY250OwomIzQzOwl1MzIga2lkOwomIzQzOwl1MTYgY2xpZW50OwomIzQzOwl1OCBzdGF0dXM7CiYjNDM7I2RlZmluZSBCTlhUX0NNRF9DVFhfQ09NUExFVEVECTB4MQomIzQzOyNkZWZpbmUgQk5YVF9DTURfQ1RYX0VSUk9SCTB4MgomIzQzOyNkZWZpbmUgQk5YVF9DTURfQ1RYX1JFU0VUCTB4NAomIzQzO307CiYjNDM7CiYjNDM7I2RlZmluZSBCTlhUX1RDSyhjcnlwdG8pCSgoY3J5cHRvKS0mZ3Q7a2N0eFtCTlhUX1RYX0NSWVBUT19LRVlfVFlQRV0pCiYjNDM7I2RlZmluZSBCTlhUX1JDSyhjcnlwdG8pCSgoY3J5cHRvKS0mZ3Q7a2N0eFtCTlhUX1JYX0NSWVBUT19LRVlfVFlQRV0pCiYjNDM7CiYjNDM7I2RlZmluZSBCTlhUX0NUWF9LSU5EX0NLX1RYCTB4MTEKJiM0MzsjZGVmaW5lIEJOWFRfQ1RYX0tJTkRfQ0tfUlgJMHgxMgomIzQzOwomIzQzOyNpZmRlZiBDT05GSUdfQk5YVF9UTFMKJiM0Mzt2b2lkIGJueHRfYWxsb2NfY3J5cHRvX2luZm8oc3RydWN0IGJueHQgKmJwLAomIzQzOwkJCSAgICBzdHJ1Y3QgaHdybV9mdW5jX3FjYXBzX291dHB1dCAqcmVzcCk7CiYjNDM7aW50IGJueHRfY3J5cHRvX2RlbChzdHJ1Y3QgYm54dCAqYnAsIHU4IHR5cGUsIHU4IGtpbmQsIHUzMiBraWQpOwomIzQzO3ZvaWQgYm54dF9jcnlwdG9fZGVsX2FsbChzdHJ1Y3QgYm54dCAqYnApOwomIzQzO3ZvaWQgYm54dF9jbGVhcl9jcnlwdG8oc3RydWN0IGJueHQgKmJwKTsKJiM0Mzt2b2lkIGJueHRfZnJlZV9jcnlwdG9faW5mbyhzdHJ1Y3QgYm54dCAqYnApOwomIzQzO3ZvaWQgYm54dF9od3JtX3Jlc2VydmVfcGZfa2V5X2N0eHMoc3RydWN0IGJueHQgKmJwLAomIzQzOwkJCQkgICBzdHJ1Y3QgaHdybV9mdW5jX2NmZ19pbnB1dCAqcmVxKTsKJiM0Mztib29sIGJueHRfa2lkX3ZhbGlkKHN0cnVjdCBibnh0X2tjdHggKmtjdHgsIHUzMiBpZCk7CiYjNDM7dm9pZCBibnh0X2ZyZWVfb25lX2tjdHgoc3RydWN0IGJueHRfa2N0eCAqa2N0eCwgdTMyIGlkKTsKJiM0MztpbnQgYm54dF9rZXlfY3R4X2FsbG9jX29uZShzdHJ1Y3QgYm54dCAqYnAsIHN0cnVjdCBibnh0X2tjdHggKmtjdHgsIHU4IGtpbmQsCiYjNDM7CQkJICAgdTMyICppZCk7CiYjNDM7aW50IGJueHRfeG1pdF9jcnlwdG9fY21kKHN0cnVjdCBibnh0ICpicCwgc3RydWN0IGJueHRfdHhfcmluZ19pbmZvICp0eHIsCiYjNDM7CQkJIHZvaWQgKmNtZCwgdW5zaWduZWQgaW50IGxlbiwgdW5zaWduZWQgaW50IHRtbyk7CiYjNDM7aW50IGJueHRfY3J5cHRvX2luaXQoc3RydWN0IGJueHQgKmJwKTsKJiM0Mzt2b2lkIGJueHRfY3J5cHRvX21wY19jbXAoc3RydWN0IGJueHQgKmJwLCB1MzIgY2xpZW50LCB1bnNpZ25lZCBsb25nIGhhbmRsZSwKJiM0MzsJCQkgc3RydWN0IGJueHRfY21wbF9lbnRyeSBjbXBsW10sIHUzMiBlbnRyaWVzKTsKJiM0MzsjZWxzZQomIzQzO3N0YXRpYyBpbmxpbmUgdm9pZCBibnh0X2FsbG9jX2NyeXB0b19pbmZvKHN0cnVjdCBibnh0ICpicCwKJiM0MzsJCQkJCSAgc3RydWN0IGh3cm1fZnVuY19xY2Fwc19vdXRwdXQgKnJlc3ApCiYjNDM7ewomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW5saW5lIGludCBibnh0X2NyeXB0b19kZWwoc3RydWN0IGJueHQgKmJwLCB1OCB0eXBlLCB1OCBraW5kLCB1MzIga2lkKQomIzQzO3sKJiM0MzsJcmV0dXJuIC1FT1BOT1RTVVBQOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW5saW5lIHZvaWQgYm54dF9jcnlwdG9fZGVsX2FsbChzdHJ1Y3QgYm54dCAqYnApCiYjNDM7ewomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW5saW5lIHZvaWQgYm54dF9jbGVhcl9jcnlwdG8oc3RydWN0IGJueHQgKmJwKQomIzQzO3sKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGlubGluZSB2b2lkIGJueHRfZnJlZV9jcnlwdG9faW5mbyhzdHJ1Y3QgYm54dCAqYnApCiYjNDM7ewomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW5saW5lIHZvaWQgYm54dF9od3JtX3Jlc2VydmVfcGZfa2V5X2N0eHMoc3RydWN0IGJueHQgKmJwLAomIzQzOwkJCQkJCSBzdHJ1Y3QgaHdybV9mdW5jX2NmZ19pbnB1dCAqcmVxKQomIzQzO3sKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGlubGluZSBib29sIGJueHRfa2lkX3ZhbGlkKHN0cnVjdCBibnh0X2tjdHggKmtjdHgsIHUzMiBpZCkKJiM0Mzt7CiYjNDM7CXJldHVybiBmYWxzZTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGlubGluZSB2b2lkIGJueHRfZnJlZV9vbmVfa2N0eChzdHJ1Y3QgYm54dF9rY3R4ICprY3R4LCB1MzIgaWQpCiYjNDM7ewomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW5saW5lIGludCBibnh0X2tleV9jdHhfYWxsb2Nfb25lKHN0cnVjdCBibnh0ICpicCwKJiM0MzsJCQkJCSBzdHJ1Y3QgYm54dF9rY3R4ICprY3R4LCB1OCBraW5kLAomIzQzOwkJCQkJIHUzMiAqaWQpCiYjNDM7ewomIzQzOwlyZXR1cm4gLUVPUE5PVFNVUFA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbmxpbmUgaW50IGJueHRfeG1pdF9jcnlwdG9fY21kKHN0cnVjdCBibnh0ICpicCwKJiM0MzsJCQkJICAgICAgIHN0cnVjdCBibnh0X3R4X3JpbmdfaW5mbyAqdHhyLAomIzQzOwkJCQkgICAgICAgdm9pZCAqY21kLCB1bnNpZ25lZCBpbnQgbGVuLAomIzQzOwkJCQkgICAgICAgdW5zaWduZWQgaW50IHRtbykKJiM0Mzt7CiYjNDM7CXJldHVybiAtRU9QTk9UU1VQUDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGlubGluZSBpbnQgYm54dF9jcnlwdG9faW5pdChzdHJ1Y3QgYm54dCAqYnApCiYjNDM7ewomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGlubGluZSB2b2lkIGJueHRfY3J5cHRvX21wY19jbXAoc3RydWN0IGJueHQgKmJwLCB1MzIgY2xpZW50LAomIzQzOwkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBoYW5kbGUsCiYjNDM7CQkJCSAgICAgICBzdHJ1Y3QgYm54dF9jbXBsX2VudHJ5IGNtcGxbXSwKJiM0MzsJCQkJICAgICAgIHUzMiBlbnRyaWVzKQomIzQzO3sKJiM0Mzt9CiYjNDM7I2VuZGlmCS8qIENPTkZJR19CTlhUX1RMUyAqLwomIzQzOyNlbmRpZgkvKiBCTlhUX0NSWVBUT19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibnh0L2JueHRfZXRodG9vbC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9ibnh0X2V0aHRvb2wuYwppbmRleCA2MmJjOWNhZTYxM2MzOC4uY2VlNzQzOTk2ZDNmMjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dF9ldGh0b29sLmMKJiM0MzsmIzQzOyYjNDM7IGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9ibnh0X2V0aHRvb2wuYwpAQCAtMzcsNiAmIzQzOzM3LDggQEAKICNpbmNsdWRlICYjMzQ7Ym54dF9udm1fZGVmcy5oJiMzNDsJLyogTlZSQU0gY29udGVudCBjb25zdGFudCBhbmQgc3RydWN0dXJlIGRlZnMgKi8KICNpbmNsdWRlICYjMzQ7Ym54dF9md19oZHIuaCYjMzQ7CS8qIEZpcm13YXJlIGhkciBjb25zdGFudCBhbmQgc3RydWN0dXJlIGRlZnMgKi8KICNpbmNsdWRlICYjMzQ7Ym54dF9jb3JlZHVtcC5oJiMzNDsKJiM0MzsjaW5jbHVkZSAmIzM0O2JueHRfbXBjLmgmIzM0OwomIzQzOyNpbmNsdWRlICYjMzQ7Ym54dF9rdGxzLmgmIzM0OwogCiAjZGVmaW5lIEJOWFRfTlZNX0VSUl9NU0coZGV2LCBleHRhY2ssIG1zZykJCQlcCiAJZG8gewkJCQkJCQlcCkBAIC0zNTMsNiAmIzQzOzM1NSwzMCBAQCBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgYm54dF9yaW5nX2Rydl9zdGF0c19hcnJbXSA9IHsKIAkmIzM0O3RvdGFsX21pc3NlZF9pcnFzJiMzNDssCiB9OwogCiYjNDM7Lyoga1RMUyBkYXRhIHBsYW5lIGNvdW50ZXIgc3RyaW5ncyBpbmRleGVkIGJ5IGVudW0gYm54dF9rdGxzX2RhdGFfY291bnRlcnMgKi8KJiM0MztzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgYm54dF9rdGxzX2RhdGFfc3RhdHNbXSA9IHsKJiM0MzsJW0JOWFRfS1RMU19UWF9QS1RTXQkJPSAmIzM0O3R4X3Rsc19lbmNyeXB0ZWRfcGFja2V0cyYjMzQ7LAomIzQzOwlbQk5YVF9LVExTX1RYX0JZVEVTXQkJPSAmIzM0O3R4X3Rsc19lbmNyeXB0ZWRfYnl0ZXMmIzM0OywKJiM0MzsJW0JOWFRfS1RMU19UWF9PT09fUEtUU10JCQk9ICYjMzQ7dHhfdGxzX29vb19wYWNrZXRzJiMzNDssCiYjNDM7CVtCTlhUX0tUTFNfVFhfT09PX0ZBTExCQUNLX05PX1NZTkNdCT0gJiMzNDt0eF90bHNfb29vX2ZhbGxiYWNrX25vX3N5bmMmIzM0OywKJiM0MzsJW0JOWFRfS1RMU19UWF9PT09fRkFMTEJBQ0tfTk9fU1BBQ0VdCT0gJiMzNDt0eF90bHNfb29vX2ZhbGxiYWNrX25vX3NwYWNlJiMzNDssCiYjNDM7CVtCTlhUX0tUTFNfVFhfT09PX0ZBTExCQUNLX05PX0hEUl0JPSAmIzM0O3R4X3Rsc19vb29fZmFsbGJhY2tfbm9faGRyJiMzNDssCiYjNDM7fTsKJiM0MzsKJiM0MzsvKiBrVExTIGNvbnRyb2wgcGxhbmUgY291bnRlciBzdHJpbmdzIGluZGV4ZWQgYnkgZW51bSBibnh0X2t0bHNfY3RybF9jb3VudGVycyAqLwomIzQzO3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBibnh0X2t0bHNfY3RybF9zdGF0c1tdID0gewomIzQzOwlbQk5YVF9LVExTX1RYX0FERF0JCQk9ICYjMzQ7dHhfdGxzX2FkZCYjMzQ7LAomIzQzOwlbQk5YVF9LVExTX1RYX0RFTF0JCQk9ICYjMzQ7dHhfdGxzX2RlbCYjMzQ7LAomIzQzOwlbQk5YVF9LVExTX0VSUl9OT19NRU1dCQkJPSAmIzM0O3Rsc19lcnJfbm9fbWVtJiMzNDssCiYjNDM7CVtCTlhUX0tUTFNfRVJSX05PX0NBUF0JCQk9ICYjMzQ7dGxzX2Vycl9ub19jYXAmIzM0OywKJiM0MzsJW0JOWFRfS1RMU19FUlJfS0VZX0NUWF9BTExPQ10JCT0gJiMzNDt0bHNfZXJyX2tleV9jdHhfYWxsb2MmIzM0OywKJiM0MzsJW0JOWFRfS1RMU19FUlJfQ1JZUFRPX0NNRF0JCT0gJiMzNDt0bHNfZXJyX2NyeXB0b19jbWQmIzM0OywKJiM0MzsJW0JOWFRfS1RMU19FUlJfREVWSUNFX0JVU1ldCQk9ICYjMzQ7dGxzX2Vycl9kZXZpY2VfYnVzeSYjMzQ7LAomIzQzOwlbQk5YVF9LVExTX0VSUl9JTlZBTElEX0NJUEhFUl0JCT0gJiMzNDt0bHNfZXJyX2ludmFsaWRfY2lwaGVyJiMzNDssCiYjNDM7CVtCTlhUX0tUTFNfRVJSX1NUQVRFX05PVF9PUEVOXQkJPSAmIzM0O3Rsc19lcnJfc3RhdGVfbm90X29wZW4mIzM0OywKJiM0MzsJW0JOWFRfS1RMU19FUlJfUkVUUllfRVhDRUVERURdCQk9ICYjMzQ7dGxzX2Vycl9yZXRyeV9leGNlZWRlZCYjMzQ7LAomIzQzO307CiYjNDM7CiAjZGVmaW5lIE5VTV9SSU5HX1JYX1NXX1NUQVRTCQlBUlJBWV9TSVpFKGJueHRfcnhfc3dfc3RhdHNfc3RyKQogI2RlZmluZSBOVU1fUklOR19DTU5fU1dfU1RBVFMJCUFSUkFZX1NJWkUoYm54dF9jbW5fc3dfc3RhdHNfc3RyKQogI2RlZmluZSBOVU1fUklOR19SWF9IV19TVEFUUwkJQVJSQVlfU0laRShibnh0X3Jpbmdfcnhfc3RhdHNfc3RyKQpAQCAtNTM1LDEyICYjNDM7NTYxLDIxIEBAIHN0YXRpYyBpbnQgYm54dF9nZXRfbnVtX3Jpbmdfc3RhdHMoc3RydWN0IGJueHQgKmJwKQogCSAgICAgICBjbW4gKiBicC0mZ3Q7Y3BfbnJfcmluZ3M7CiB9CiAKJiM0MztzdGF0aWMgaW50IGJueHRfZ2V0X251bV9rdGxzX3N0YXRzKHN0cnVjdCBibnh0ICpicCkKJiM0Mzt7CiYjNDM7CWlmICghYnAtJmd0O2t0bHNfaW5mbykKJiM0MzsJCXJldHVybiAwOwomIzQzOwlyZXR1cm4gQVJSQVlfU0laRShibnh0X2t0bHNfY3RybF9zdGF0cykgJiM0MzsKJiM0MzsJICAgICAgIEFSUkFZX1NJWkUoYm54dF9rdGxzX2RhdGFfc3RhdHMpOwomIzQzO30KJiM0MzsKIHN0YXRpYyBpbnQgYm54dF9nZXRfbnVtX3N0YXRzKHN0cnVjdCBibnh0ICpicCkKIHsKIAlpbnQgbnVtX3N0YXRzID0gYm54dF9nZXRfbnVtX3Jpbmdfc3RhdHMoYnApOwogCWludCBsZW47CiAKIAludW1fc3RhdHMgJiM0Mzs9IEJOWFRfTlVNX1JJTkdfRFJWX1NUQVRTOwomIzQzOwludW1fc3RhdHMgJiM0Mzs9IGJueHRfZ2V0X251bV9rdGxzX3N0YXRzKGJwKTsKIAogCWlmIChicC0mZ3Q7ZmxhZ3MgJmFtcDsgQk5YVF9GTEFHX1BPUlRfU1RBVFMpCiAJCW51bV9zdGF0cyAmIzQzOz0gQk5YVF9OVU1fUE9SVF9TVEFUUzsKQEAgLTY1Myw2ICYjNDM7Njg4LDE2IEBAIHN0YXRpYyB2b2lkIGJueHRfZ2V0X2V0aHRvb2xfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAlmb3IgKGkgPSAwOyBpICZsdDsgQk5YVF9OVU1fUklOR19EUlZfU1RBVFM7IGkmIzQzOyYjNDM7LCBqJiM0MzsmIzQzOywgY3VyciYjNDM7JiM0MzssIHByZXYmIzQzOyYjNDM7KQogCQlidWZbal0gPSAqY3VyciAmIzQzOyAqcHJldjsKIAomIzQzOwlpZiAoYnAtJmd0O2t0bHNfaW5mbykgewomIzQzOwkJc3RydWN0IGJueHRfdGxzX2luZm8gKmt0bHMgPSBicC0mZ3Q7a3Rsc19pbmZvOwomIzQzOwkJc3RydWN0IGJueHRfdGxzX3N3X3N0YXRzIHRsc19zdGF0cyA9IHt9OwomIzQzOwomIzQzOwkJYm54dF9nZXRfcmluZ190bHNfc3RhdHMoYnAsICZhbXA7dGxzX3N0YXRzKTsKJiM0MzsJCWZvciAoaSA9IDA7IGkgJmx0OyBBUlJBWV9TSVpFKGJueHRfa3Rsc19kYXRhX3N0YXRzKTsgaSYjNDM7JiM0MzssIGomIzQzOyYjNDM7KQomIzQzOwkJCWJ1ZltqXSA9IHRsc19zdGF0cy5jb3VudGVyc1tpXTsKJiM0MzsJCWZvciAoaSA9IDA7IGkgJmx0OyBBUlJBWV9TSVpFKGJueHRfa3Rsc19jdHJsX3N0YXRzKTsgaSYjNDM7JiM0MzssIGomIzQzOyYjNDM7KQomIzQzOwkJCWJ1ZltqXSA9IGF0b21pYzY0X3JlYWQoJmFtcDtrdGxzLSZndDtjb3VudGVyc1tpXSk7CiYjNDM7CX0KIAlpZiAoYnAtJmd0O2ZsYWdzICZhbXA7IEJOWFRfRkxBR19QT1JUX1NUQVRTKSB7CiAJCXU2NCAqcG9ydF9zdGF0cyA9IGJwLSZndDtwb3J0X3N0YXRzLnN3X3N0YXRzOwogCkBAIC03NjMsNiAmIzQzOzgwOCwxMiBAQCBzdGF0aWMgdm9pZCBibnh0X2dldF9zdHJpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBzdHJpbmdzZXQsIHU4ICpidWYpCiAJCWZvciAoaSA9IDA7IGkgJmx0OyBCTlhUX05VTV9SSU5HX0RSVl9TVEFUUzsgaSYjNDM7JiM0MzspCiAJCQlldGh0b29sX3B1dHMoJmFtcDtidWYsIGJueHRfcmluZ19kcnZfc3RhdHNfYXJyW2ldKTsKIAomIzQzOwkJaWYgKGJwLSZndDtrdGxzX2luZm8pIHsKJiM0MzsJCQlmb3IgKGkgPSAwOyBpICZsdDsgQVJSQVlfU0laRShibnh0X2t0bHNfZGF0YV9zdGF0cyk7IGkmIzQzOyYjNDM7KQomIzQzOwkJCQlldGh0b29sX3B1dHMoJmFtcDtidWYsIGJueHRfa3Rsc19kYXRhX3N0YXRzW2ldKTsKJiM0MzsJCQlmb3IgKGkgPSAwOyBpICZsdDsgQVJSQVlfU0laRShibnh0X2t0bHNfY3RybF9zdGF0cyk7IGkmIzQzOyYjNDM7KQomIzQzOwkJCQlldGh0b29sX3B1dHMoJmFtcDtidWYsIGJueHRfa3Rsc19jdHJsX3N0YXRzW2ldKTsKJiM0MzsJCX0KIAkJaWYgKGJwLSZndDtmbGFncyAmYW1wOyBCTlhUX0ZMQUdfUE9SVF9TVEFUUykKIAkJCWZvciAoaSA9IDA7IGkgJmx0OyBCTlhUX05VTV9QT1JUX1NUQVRTOyBpJiM0MzsmIzQzOykgewogCQkJCXN0ciA9IGJueHRfcG9ydF9zdGF0c19hcnJbaV0uc3RyaW5nOwpAQCAtOTU5LDYgJiM0MzsxMDEwLDcgQEAgc3RhdGljIGludCBibnh0X3NldF9jaGFubmVscyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCXN0cnVjdCBibnh0ICpicCA9IG5ldGRldl9wcml2KGRldik7CiAJaW50IHJlcV90eF9yaW5ncywgcmVxX3J4X3JpbmdzLCB0Y3M7CiAJdTMyIG5ld190Ymxfc2l6ZSA9IDAsIG9sZF90Ymxfc2l6ZTsKJiM0MzsJaW50IG1wY19wZXJfdHlwZSwgbXBjX2NwOwogCWJvb2wgc2ggPSBmYWxzZTsKIAlpbnQgdHhfeGRwID0gMDsKIAlpbnQgcmMgPSAwOwpAQCAtOTkzLDcgJiM0MzsxMDQ1LDEyIEBAIHN0YXRpYyBpbnQgYm54dF9zZXRfY2hhbm5lbHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJdHhfeGRwID0gcmVxX3J4X3JpbmdzOwogCX0KIAotCXJjID0gYm54dF9jaGVja19yaW5ncyhicCwgcmVxX3R4X3JpbmdzLCByZXFfcnhfcmluZ3MsIHNoLCB0Y3MsIHR4X3hkcCk7CiYjNDM7CWJueHRfY2FsY19kZmx0X21wY19yaW5ncyhicCwKJiM0MzsJCQkJIHJlcV90eF9yaW5ncyAqICh0Y3MgJmd0OyAxID8gdGNzIDogMSkgJiM0MzsgdHhfeGRwLAomIzQzOwkJCQkgcmVxX3R4X3JpbmdzLCByZXFfcnhfcmluZ3MsICZhbXA7bXBjX3Blcl90eXBlLAomIzQzOwkJCQkgJmFtcDttcGNfY3ApOwomIzQzOwlyYyA9IGJueHRfY2hlY2tfcmluZ3MoYnAsIHJlcV90eF9yaW5ncywgcmVxX3J4X3JpbmdzLCBzaCwgdGNzLCB0eF94ZHAsCiYjNDM7CQkJICAgICAgbXBjX3Blcl90eXBlICogQk5YVF9NUENfVFlQRV9NQVgsIG1wY19jcCk7CiAJaWYgKHJjKSB7CiAJCW5ldGRldl93YXJuKGRldiwgJiMzNDtVbmFibGUgdG8gYWxsb2NhdGUgdGhlIHJlcXVlc3RlZCByaW5nc1xuJiMzNDspOwogCQlyZXR1cm4gcmM7CkBAIC0xMDUxLDYgJiM0MzsxMTA4LDggQEAgc3RhdGljIGludCBibnh0X3NldF9jaGFubmVscyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCiAJYm54dF9zZXRfY3BfcmluZ3MoYnAsIHNoKTsKIAomIzQzOwlibnh0X3NldF9kZmx0X21wY19yaW5ncyhicCk7CiYjNDM7CiAJLyogQWZ0ZXIgY2hhbmdpbmcgbnVtYmVyIG9mIHJ4IGNoYW5uZWxzLCB1cGRhdGUgTlRVUExFIGZlYXR1cmUuICovCiAJbmV0ZGV2X3VwZGF0ZV9mZWF0dXJlcyhkZXYpOwogCWlmIChuZXRpZl9ydW5uaW5nKGRldikpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dF9nc28uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dF9nc28uYwppbmRleCBmMzE3ZjYwNDE0ZTgxMy4uYjRjMzdhNmM5ZjBmYTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dF9nc28uYwomIzQzOyYjNDM7JiM0MzsgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibnh0L2JueHRfZ3NvLmMKQEAgLTE2OCw3ICYjNDM7MTY4LDcgQEAgbmV0ZGV2X3R4X3QgYm54dF9zd191ZHBfZ3NvX3htaXQoc3RydWN0IGJueHQgKmJwLAogCiAJCXByb2QgPSBORVhUX1RYKHByb2QpOwogCQlibnh0X2luaXRfZXh0X2JkKGJwLCB0eHIsIHByb2QsIGNzdW0sCi0JCQkJIHZsYW5fdGFnX2ZsYWdzLCBjZmFfYWN0aW9uKTsKJiM0MzsJCQkJIHZsYW5fdGFnX2ZsYWdzLCBjZmFfYWN0aW9uLCAwKTsKIAogCQkvKiBzZXQgZG1hX3VubWFwX2xlbiBvbiB0aGUgTEFTVCBCRCB0b3VjaGluZyBlYWNoCiAJCSAqIHJlZ2lvbi4gU2luY2UgY29tcGxldGlvbnMgYXJlIGluLW9yZGVyLCB0aGUgbGFzdCBzZWdtZW50CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibnh0L2JueHRfa3Rscy5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9ibnh0X2t0bHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMC4uMGNiNDM4YzVjNTA5MTgKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibnh0L2JueHRfa3Rscy5jCkBAIC0wLDAgJiM0MzsxLDU3OCBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHkKJiM0MzsvKiBDb3B5cmlnaHQgKGMpIDIwMjYgQnJvYWRjb20gSW5jLiAqLwomIzQzOwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC90Y3AuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bmV0L3Rscy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9ibnh0L2hzaS5oJmd0OwomIzQzOwomIzQzOyNpbmNsdWRlICYjMzQ7Ym54dC5oJiMzNDsKJiM0MzsjaW5jbHVkZSAmIzM0O2JueHRfbXBjLmgmIzM0OwomIzQzOyNpbmNsdWRlICYjMzQ7Ym54dF9jcnlwdG8uaCYjMzQ7CiYjNDM7I2luY2x1ZGUgJiMzNDtibnh0X2t0bHMuaCYjMzQ7CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogYm54dF9hbGxvY19rdGxzX2luZm8gLSBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBrVExTIG9mZmxvYWQgY29udGV4dAomIzQzOyAqIEBicDogcG9pbnRlciB0byBibnh0IGRldmljZQomIzQzOyAqCiYjNDM7ICogQWxsb2NhdGVzIHRoZSBtYWluIGtUTFMgY3J5cHRvIGluZm8gc3RydWN0dXJlCiYjNDM7ICoKJiM0MzsgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBkdXJpbmcgZGV2aWNlIGluaXRpYWxpemF0aW9uIHdoZW4gZmlybXdhcmUKJiM0MzsgKiByZXBvcnRzIGtUTFMgb2ZmbG9hZCBjYXBhYmlsaXR5LiBJZiBhbGxvY2F0aW9uIGZhaWxzLCBrVExTIG9mZmxvYWQKJiM0MzsgKiB3aWxsIG5vdCBiZSBhdmFpbGFibGUgYnV0IHRoZSBkZXZpY2Ugd2lsbCBzdGlsbCBmdW5jdGlvbi4KJiM0MzsgKgomIzQzOyAqIENvbnRleHQ6IFByb2Nlc3MgY29udGV4dAomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiB6ZXJvIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIGVycm9yIGNvZGUgb3RoZXJ3aXNlOgomIzQzOyAqCUVOT01FTTogb3V0IG9mIG1lbW9yeQomIzQzOyAqLwomIzQzO2ludCBibnh0X2FsbG9jX2t0bHNfaW5mbyhzdHJ1Y3QgYm54dCAqYnApCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYm54dF90bHNfaW5mbyAqa3RscyA9IGJwLSZndDtrdGxzX2luZm87CiYjNDM7CiYjNDM7CWlmIChCTlhUX1ZGKGJwKSkKJiM0MzsJCXJldHVybiAtRU9QTk9UU1VQUDsKJiM0MzsJaWYgKGt0bHMpCiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsKJiM0MzsJa3RscyA9IGt6YWxsb2Nfb2JqKCprdGxzKTsKJiM0MzsJaWYgKCFrdGxzKSB7CiYjNDM7CQluZXRkZXZfd2FybihicC0mZ3Q7ZGV2LCAmIzM0O1VuYWJsZSB0byBhbGxvY2F0ZSBrVExTIGluZm9cbiYjMzQ7KTsKJiM0MzsJCXJldHVybiAtRU5PTUVNOwomIzQzOwl9CiYjNDM7CWt0bHMtJmd0O2NvdW50ZXJzID0ga3phbGxvY19vYmpzKCprdGxzLSZndDtjb3VudGVycywKJiM0MzsJCQkJICAgICAgQk5YVF9LVExTX01BWF9DVFJMX0NPVU5URVJTKTsKJiM0MzsJaWYgKCFrdGxzLSZndDtjb3VudGVycykKJiM0MzsJCWdvdG8ga3Rsc19lcnI7CiYjNDM7CiYjNDM7CWluaXRfd2FpdHF1ZXVlX2hlYWQoJmFtcDtrdGxzLSZndDtvcGVuX3dxKTsKJiM0MzsJYnAtJmd0O2t0bHNfaW5mbyA9IGt0bHM7CiYjNDM7CXJldHVybiAwOwomIzQzOwomIzQzO2t0bHNfZXJyOgomIzQzOwlrZnJlZShrdGxzLSZndDtjb3VudGVycyk7CiYjNDM7CWtmcmVlKGt0bHMpOwomIzQzOwlyZXR1cm4gLUVOT01FTTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogYm54dF9mcmVlX2t0bHNfaW5mbyAtIEZyZWUga1RMUyBjcnlwdG8gb2ZmbG9hZCByZXNvdXJjZXMKJiM0MzsgKiBAYnA6IHBvaW50ZXIgdG8gYm54dCBkZXZpY2UKJiM0MzsgKgomIzQzOyAqIEZyZWVzIGFsbCByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIGtUTFMgY3J5cHRvIG9mZmxvYWQKJiM0MzsgKgomIzQzOyAqIENvbnRleHQ6IFByb2Nlc3MgY29udGV4dCBkdXJpbmcgZGV2aWNlIHNodXRkb3duL3JlbW92YWwKJiM0MzsgKi8KJiM0Mzt2b2lkIGJueHRfZnJlZV9rdGxzX2luZm8oc3RydWN0IGJueHQgKmJwKQomIzQzO3sKJiM0MzsJc3RydWN0IGJueHRfdGxzX2luZm8gKmt0bHMgPSBicC0mZ3Q7a3Rsc19pbmZvOwomIzQzOwomIzQzOwlpZiAoIWt0bHMpCiYjNDM7CQlyZXR1cm47CiYjNDM7CWtmcmVlKGt0bHMtJmd0O2NvdW50ZXJzKTsKJiM0MzsJa2ZyZWUoa3Rscyk7CiYjNDM7CWJwLSZndDtrdGxzX2luZm8gPSBOVUxMOwomIzQzO30KJiM0MzsKJiM0MzsvKiBDb3B5IGluIHJldmVyc2UgYnl0ZSBvcmRlciAqLwomIzQzO3N0YXRpYyB2b2lkIGJueHRfY29weV90bHNfbXBfZGF0YSh1OCAqZHN0LCB1OCAqc3JjLCBpbnQgYnl0ZXMpCiYjNDM7ewomIzQzOwlpbnQgaTsKJiM0MzsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IGJ5dGVzOyBpJiM0MzsmIzQzOykKJiM0MzsJCWRzdFtieXRlcyAtIGkgLSAxXSA9IHNyY1tpXTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBibnh0X2NyeXB0b19hZGQoc3RydWN0IGJueHQgKmJwLCBlbnVtIHRsc19vZmZsb2FkX2N0eF9kaXIgZGlyZWN0aW9uLAomIzQzOwkJCSAgIHN0cnVjdCB0bHNfY3J5cHRvX2luZm8gKmNyeXB0b19pbmZvLCB1MzIgdGNwX3NlcV9ubywKJiM0MzsJCQkgICB1MzIga2lkKQomIzQzO3sKJiM0MzsJc3RydWN0IGJueHRfdHhfcmluZ19pbmZvICp0eHI7CiYjNDM7CXN0cnVjdCBjZV9hZGRfY21kIGNtZCA9IHswfTsKJiM0MzsJdTMyIGRhdGE7CiYjNDM7CWludCByYzsKJiM0MzsKJiM0MzsJaWYgKGRpcmVjdGlvbiA9PSBUTFNfT0ZGTE9BRF9DVFhfRElSX1RYKSB7CiYjNDM7CQl0eHIgPSBibnh0X3NlbGVjdF9tcGNfcmluZyhicCwgQk5YVF9NUENfVENFX1RZUEUpOwomIzQzOwkJY21kLmN0eF9raW5kID0gQ0VfQUREX0NNRF9DVFhfS0lORF9DS19UWDsKJiM0MzsJfSBlbHNlIHsKJiM0MzsJCXJldHVybiAtRU9QTk9UU1VQUDsKJiM0MzsJfQomIzQzOwlpZiAoIXR4cikKJiM0MzsJCXJldHVybiAtRU5PREVWOwomIzQzOwomIzQzOwlkYXRhID0gQ0VfQUREX0NNRF9PUENPREVfQUREIHwgKEJOWFRfS0lEX0hXKGtpZCkgJmx0OyZsdDsgQ0VfQUREX0NNRF9LSURfU0ZUKTsKJiM0MzsJc3dpdGNoIChjcnlwdG9faW5mby0mZ3Q7Y2lwaGVyX3R5cGUpIHsKJiM0MzsJY2FzZSBUTFNfQ0lQSEVSX0FFU19HQ01fMTI4OiB7CiYjNDM7CQlzdHJ1Y3QgdGxzMTJfY3J5cHRvX2luZm9fYWVzX2djbV8xMjggKmFlczsKJiM0MzsKJiM0MzsJCWFlcyA9ICh2b2lkICopY3J5cHRvX2luZm87CiYjNDM7CQlkYXRhIHw9IENFX0FERF9DTURfQUxHT1JJVEhNX0FFU19HQ01fMTI4OwomIzQzOwkJaWYgKGNyeXB0b19pbmZvLSZndDt2ZXJzaW9uID09IFRMU18xXzNfVkVSU0lPTikKJiM0MzsJCQlkYXRhIHw9IENFX0FERF9DTURfVkVSU0lPTl9UTFMxXzM7CiYjNDM7CQltZW1jcHkoJmFtcDtjbWQuc2Vzc2lvbl9rZXksIGFlcy0mZ3Q7a2V5LCBzaXplb2YoYWVzLSZndDtrZXkpKTsKJiM0MzsJCW1lbWNweSgmYW1wO2NtZC5zYWx0LCBhZXMtJmd0O3NhbHQsIHNpemVvZihhZXMtJmd0O3NhbHQpKTsKJiM0MzsJCW1lbWNweSgmYW1wO2NtZC5hZGRsX2l2LCBhZXMtJmd0O2l2LCBzaXplb2YoYWVzLSZndDtpdikpOwomIzQzOwkJYm54dF9jb3B5X3Rsc19tcF9kYXRhKGNtZC5yZWNvcmRfc2VxX251bSwgYWVzLSZndDtyZWNfc2VxLAomIzQzOwkJCQkgICAgICBzaXplb2YoYWVzLSZndDtyZWNfc2VxKSk7CiYjNDM7CQlicmVhazsKJiM0MzsJfQomIzQzOwljYXNlIFRMU19DSVBIRVJfQUVTX0dDTV8yNTY6IHsKJiM0MzsJCXN0cnVjdCB0bHMxMl9jcnlwdG9faW5mb19hZXNfZ2NtXzI1NiAqYWVzOwomIzQzOwomIzQzOwkJYWVzID0gKHZvaWQgKiljcnlwdG9faW5mbzsKJiM0MzsJCWRhdGEgfD0gQ0VfQUREX0NNRF9BTEdPUklUSE1fQUVTX0dDTV8yNTY7CiYjNDM7CQlpZiAoY3J5cHRvX2luZm8tJmd0O3ZlcnNpb24gPT0gVExTXzFfM19WRVJTSU9OKQomIzQzOwkJCWRhdGEgfD0gQ0VfQUREX0NNRF9WRVJTSU9OX1RMUzFfMzsKJiM0MzsJCW1lbWNweSgmYW1wO2NtZC5zZXNzaW9uX2tleSwgYWVzLSZndDtrZXksIHNpemVvZihhZXMtJmd0O2tleSkpOwomIzQzOwkJbWVtY3B5KCZhbXA7Y21kLnNhbHQsIGFlcy0mZ3Q7c2FsdCwgc2l6ZW9mKGFlcy0mZ3Q7c2FsdCkpOwomIzQzOwkJbWVtY3B5KCZhbXA7Y21kLmFkZGxfaXYsIGFlcy0mZ3Q7aXYsIHNpemVvZihhZXMtJmd0O2l2KSk7CiYjNDM7CQlibnh0X2NvcHlfdGxzX21wX2RhdGEoY21kLnJlY29yZF9zZXFfbnVtLCBhZXMtJmd0O3JlY19zZXEsCiYjNDM7CQkJCSAgICAgIHNpemVvZihhZXMtJmd0O3JlY19zZXEpKTsKJiM0MzsJCWJyZWFrOwomIzQzOwl9CiYjNDM7CWRlZmF1bHQ6CiYjNDM7CQlyZXR1cm4gLUVPUE5PVFNVUFA7CiYjNDM7CX0KJiM0MzsJY21kLnZlcl9hbGdvX2tpZF9vcGNvZGUgPSBjcHVfdG9fbGUzMihkYXRhKTsKJiM0MzsJY21kLnBrdF90Y3Bfc2VxX251bSA9IGNwdV90b19sZTMyKHRjcF9zZXFfbm8pOwomIzQzOwljbWQudGxzX2hlYWRlcl90Y3Bfc2VxX251bSA9IGNtZC5wa3RfdGNwX3NlcV9udW07CiYjNDM7CXJjID0gYm54dF94bWl0X2NyeXB0b19jbWQoYnAsIHR4ciwgJmFtcDtjbWQsIHNpemVvZihjbWQpLAomIzQzOwkJCQkgIEJOWFRfTVBDX1RNT19NU0VDUyk7CiYjNDM7CW1lbXplcm9fZXhwbGljaXQoJmFtcDtjbWQsIHNpemVvZihjbWQpKTsKJiM0MzsJcmV0dXJuIHJjOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgYm9vbCBibnh0X2t0bHNfY2lwaGVyX3N1cHBvcnRlZChzdHJ1Y3QgYm54dCAqYnAsCiYjNDM7CQkJCSAgICAgICBzdHJ1Y3QgdGxzX2NyeXB0b19pbmZvICpjcnlwdG9faW5mbykKJiM0Mzt7CiYjNDM7CXUxNiB0eXBlID0gY3J5cHRvX2luZm8tJmd0O2NpcGhlcl90eXBlOwomIzQzOwl1MTYgdmVyc2lvbiA9IGNyeXB0b19pbmZvLSZndDt2ZXJzaW9uOwomIzQzOwomIzQzOwlpZiAoKHR5cGUgPT0gVExTX0NJUEhFUl9BRVNfR0NNXzEyOCB8fAomIzQzOwkgICAgIHR5cGUgPT0gVExTX0NJUEhFUl9BRVNfR0NNXzI1NikgJmFtcDsmYW1wOwomIzQzOwkgICAgKHZlcnNpb24gPT0gVExTXzFfMl9WRVJTSU9OIHx8CiYjNDM7CSAgICAgdmVyc2lvbiA9PSBUTFNfMV8zX1ZFUlNJT04pKQomIzQzOwkJcmV0dXJuIHRydWU7CiYjNDM7CXJldHVybiBmYWxzZTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgYm54dF9zZXRfa3Rsc19jdHhfdHgoc3RydWN0IHRsc19jb250ZXh0ICp0bHNfY3R4LAomIzQzOwkJCQkgc3RydWN0IGJueHRfa3Rsc19vZmZsb2FkX2N0eF90eCAqa2N0eF90eCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBibnh0X2t0bHNfdHhfZHJpdmVyX3N0YXRlICp0eCA9CiYjNDM7CQlfX3Rsc19kcml2ZXJfY3R4KHRsc19jdHgsIFRMU19PRkZMT0FEX0NUWF9ESVJfVFgpOwomIzQzOwomIzQzOwl0eC0mZ3Q7Y3R4X3R4ID0ga2N0eF90eDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHN0cnVjdCBibnh0X2t0bHNfb2ZmbG9hZF9jdHhfdHggKgomIzQzO2JueHRfZ2V0X2t0bHNfY3R4X3R4KHN0cnVjdCB0bHNfY29udGV4dCAqdGxzX2N0eCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBibnh0X2t0bHNfdHhfZHJpdmVyX3N0YXRlICp0eCA9CiYjNDM7CQlfX3Rsc19kcml2ZXJfY3R4KHRsc19jdHgsIFRMU19PRkZMT0FEX0NUWF9ESVJfVFgpOwomIzQzOwomIzQzOwlyZXR1cm4gdHgtJmd0O2N0eF90eDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBibnh0X2t0bHNfZGV2X2FkZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc29jayAqc2ssCiYjNDM7CQkJICAgICBlbnVtIHRsc19vZmZsb2FkX2N0eF9kaXIgZGlyZWN0aW9uLAomIzQzOwkJCSAgICAgc3RydWN0IHRsc19jcnlwdG9faW5mbyAqY3J5cHRvX2luZm8sCiYjNDM7CQkJICAgICB1MzIgc3RhcnRfb2ZmbG9hZF90Y3Bfc24pCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYm54dF9rdGxzX29mZmxvYWRfY3R4X3R4ICprY3R4X3R4OwomIzQzOwlzdHJ1Y3QgYm54dCAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOwomIzQzOwlzdHJ1Y3QgYm54dF9jcnlwdG9faW5mbyAqY3J5cHRvOwomIzQzOwlzdHJ1Y3QgdGxzX2NvbnRleHQgKnRsc19jdHg7CiYjNDM7CXN0cnVjdCBibnh0X3Rsc19pbmZvICprdGxzOwomIzQzOwlzdHJ1Y3QgYm54dF9rY3R4ICprY3R4OwomIzQzOwl1MzIga2lkOwomIzQzOwlpbnQgcmM7CiYjNDM7CiYjNDM7CUJVSUxEX0JVR19PTihzaXplb2Yoc3RydWN0IGJueHRfa3Rsc190eF9kcml2ZXJfc3RhdGUpICZndDsKJiM0MzsJCSAgICAgVExTX0RSSVZFUl9TVEFURV9TSVpFX1RYKTsKJiM0MzsKJiM0MzsJa3RscyA9IGJwLSZndDtrdGxzX2luZm87CiYjNDM7CWlmIChkaXJlY3Rpb24gPT0gVExTX09GRkxPQURfQ1RYX0RJUl9SWCkKJiM0MzsJCXJldHVybiAtRU9QTk9UU1VQUDsKJiM0MzsKJiM0MzsJaWYgKCFCTlhUX1NVUFBPUlRTX0tUTFMoYnApKSB7CiYjNDM7CQlhdG9taWM2NF9pbmMoJmFtcDtrdGxzLSZndDtjb3VudGVyc1tCTlhUX0tUTFNfRVJSX05PX0NBUF0pOwomIzQzOwkJcmV0dXJuIC1FT1BOT1RTVVBQOwomIzQzOwl9CiYjNDM7CWF0b21pY19pbmMoJmFtcDtrdGxzLSZndDtwZW5kaW5nKTsKJiM0MzsJLyogTWFrZSBzdXJlIGJueHRfY2xvc2VfbmljKCkgc2VlcyBwZW5kaW5nIGJlZm9yZSB3ZSBjaGVjayB0aGUKJiM0MzsJICogQk5YVF9TVEFURV9PUEVOIGZsYWcuCiYjNDM7CSAqLwomIzQzOwlzbXBfbWJfX2FmdGVyX2F0b21pYygpOwomIzQzOwlpZiAoIXRlc3RfYml0KEJOWFRfU1RBVEVfT1BFTiwgJmFtcDticC0mZ3Q7c3RhdGUpKSB7CiYjNDM7CQlhdG9taWM2NF9pbmMoJmFtcDtrdGxzLSZndDtjb3VudGVyc1tCTlhUX0tUTFNfRVJSX1NUQVRFX05PVF9PUEVOXSk7CiYjNDM7CQlyYyA9IC1FTk9ERVY7CiYjNDM7CQlnb3RvIGV4aXQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKCFibnh0X2t0bHNfY2lwaGVyX3N1cHBvcnRlZChicCwgY3J5cHRvX2luZm8pKSB7CiYjNDM7CQlhdG9taWM2NF9pbmMoJmFtcDtrdGxzLSZndDtjb3VudGVyc1tCTlhUX0tUTFNfRVJSX0lOVkFMSURfQ0lQSEVSXSk7CiYjNDM7CQlyYyA9IC1FT1BOT1RTVVBQOwomIzQzOwkJZ290byBleGl0OwomIzQzOwl9CiYjNDM7CiYjNDM7CWtjdHhfdHggPSBremFsbG9jX29iaigqa2N0eF90eCk7CiYjNDM7CWlmICgha2N0eF90eCkgewomIzQzOwkJYXRvbWljNjRfaW5jKCZhbXA7a3Rscy0mZ3Q7Y291bnRlcnNbQk5YVF9LVExTX0VSUl9OT19NRU1dKTsKJiM0MzsJCXJjID0gLUVOT01FTTsKJiM0MzsJCWdvdG8gZXhpdDsKJiM0MzsJfQomIzQzOwl0bHNfY3R4ID0gdGxzX2dldF9jdHgoc2spOwomIzQzOwljcnlwdG8gPSBicC0mZ3Q7Y3J5cHRvX2luZm87CiYjNDM7CWtjdHggPSAmYW1wO2NyeXB0by0mZ3Q7a2N0eFtCTlhUX1RYX0NSWVBUT19LRVlfVFlQRV07CiYjNDM7CXJjID0gYm54dF9rZXlfY3R4X2FsbG9jX29uZShicCwga2N0eCwgQk5YVF9DVFhfS0lORF9DS19UWCwgJmFtcDtraWQpOwomIzQzOwlpZiAocmMpIHsKJiM0MzsJCWF0b21pYzY0X2luYygmYW1wO2t0bHMtJmd0O2NvdW50ZXJzW0JOWFRfS1RMU19FUlJfS0VZX0NUWF9BTExPQ10pOwomIzQzOwkJZ290byBmcmVlX2N0eDsKJiM0MzsJfQomIzQzOwlyYyA9IGJueHRfY3J5cHRvX2FkZChicCwgZGlyZWN0aW9uLCBjcnlwdG9faW5mbywgc3RhcnRfb2ZmbG9hZF90Y3Bfc24sCiYjNDM7CQkJICAgICBraWQpOwomIzQzOwlpZiAocmMpIHsKJiM0MzsJCWF0b21pYzY0X2luYygmYW1wO2t0bHMtJmd0O2NvdW50ZXJzW0JOWFRfS1RMU19FUlJfQ1JZUFRPX0NNRF0pOwomIzQzOwkJZ290byBmcmVlX2tjdHg7CiYjNDM7CX0KJiM0MzsJa2N0eF90eC0mZ3Q7a2lkID0ga2lkOwomIzQzOwlrY3R4X3R4LSZndDt0Y3Bfc2VxX25vID0gc3RhcnRfb2ZmbG9hZF90Y3Bfc247CiYjNDM7CWJueHRfc2V0X2t0bHNfY3R4X3R4KHRsc19jdHgsIGtjdHhfdHgpOwomIzQzOwlhdG9taWM2NF9pbmMoJmFtcDtrdGxzLSZndDtjb3VudGVyc1tCTlhUX0tUTFNfVFhfQUREXSk7CiYjNDM7CWdvdG8gZXhpdDsKJiM0MzsKJiM0MztmcmVlX2tjdHg6CiYjNDM7CS8qIFRoaXMgS0lEIHdhcyBqdXN0IGFsbG9jYXRlZCB3aGlsZSBob2xkaW5nIGt0bHMtJmd0O3BlbmRpbmcsIHNvIGVwb2NoCiYjNDM7CSAqIGNoZWNrIGlzIHVubmVjZXNzYXJ5LgomIzQzOwkgKi8KJiM0MzsJYm54dF9mcmVlX29uZV9rY3R4KGtjdHgsIGtpZCk7CiYjNDM7ZnJlZV9jdHg6CiYjNDM7CWtmcmVlKGtjdHhfdHgpOwomIzQzO2V4aXQ6CiYjNDM7CWF0b21pY19kZWMoJmFtcDtrdGxzLSZndDtwZW5kaW5nKTsKJiM0MzsJcmV0dXJuIHJjOwomIzQzO30KJiM0MzsKJiM0MzsjZGVmaW5lIEtUTFNfUkVUUllfTUFYCQkxMDAKJiM0MzsjZGVmaW5lIEtUTFNfV0FJVF9UTU9fTVMJMTAwCiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgYm54dF9rdGxzX2Rldl9kZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKJiM0MzsJCQkgICAgICBzdHJ1Y3QgdGxzX2NvbnRleHQgKnRsc19jdHgsCiYjNDM7CQkJICAgICAgZW51bSB0bHNfb2ZmbG9hZF9jdHhfZGlyIGRpcmVjdGlvbikKJiM0Mzt7CiYjNDM7CXN0cnVjdCBibnh0X2t0bHNfb2ZmbG9hZF9jdHhfdHggKmtjdHhfdHg7CiYjNDM7CXN0cnVjdCBibnh0ICpicCA9IG5ldGRldl9wcml2KGRldik7CiYjNDM7CXN0cnVjdCBibnh0X2NyeXB0b19pbmZvICpjcnlwdG87CiYjNDM7CXN0cnVjdCBibnh0X3Rsc19pbmZvICprdGxzOwomIzQzOwlzdHJ1Y3QgYm54dF9rY3R4ICprY3R4OwomIzQzOwlpbnQgcmV0cnlfY250ID0gMDsKJiM0MzsJdTgga2luZDsKJiM0MzsJdTMyIGtpZDsKJiM0MzsKJiM0MzsJa3RscyA9IGJwLSZndDtrdGxzX2luZm87CiYjNDM7CWtjdHhfdHggPSBibnh0X2dldF9rdGxzX2N0eF90eCh0bHNfY3R4KTsKJiM0MztyZXRyeToKJiM0MzsJaWYgKCF0ZXN0X2JpdChCTlhUX1NUQVRFX09QRU4sICZhbXA7YnAtJmd0O3N0YXRlKSkgewomIzQzOwkJLyogRHVyaW5nIGlmZG93biBvciBGVyByZXNldCwgYWxsIGNvbm5lY3Rpb25zIHdpbGwgYmUgdG9ybgomIzQzOwkJICogZG93biBieSBibnh0X2NyeXB0b19kZWxfYWxsKCkgLyBGVU5DX1JFU0VULCBzbyBub3RoaW5nIHRvCiYjNDM7CQkgKiBkbyBoZXJlLiAgT25seSBhIHJlY29uZmlndXJhdGlvbiBpcyB0cmFuc2llbnQgYW5kCiYjNDM7CQkgKiBfX2JueHRfb3Blbl9uaWMoKSB3aWxsIHNldCBCTlhUX1NUQVRFX09QRU4gYWdhaW4gYW5kIHdha2UgdXMuCiYjNDM7CQkgKi8KJiM0MzsJCWlmICghbmV0aWZfcnVubmluZyhkZXYpIHx8CiYjNDM7CQkgICAgdGVzdF9iaXQoQk5YVF9TVEFURV9JTl9GV19SRVNFVCwgJmFtcDticC0mZ3Q7c3RhdGUpKQomIzQzOwkJCWdvdG8gZnJlZTsKJiM0MzsJCS8qIEJvdW5kIHRoZSB3YWl0IHNvIGEgd2VkZ2VkIHJlY29uZmlnIGNhbiYjMzk7dCBibG9jayB0aGUga1RMUwomIzQzOwkJICogZGVzdHJ1Y3Qgd29yayBpbmRlZmluaXRlbHkuCiYjNDM7CQkgKi8KJiM0MzsJCWlmIChyZXRyeV9jbnQmIzQzOyYjNDM7ICZndDsgS1RMU19SRVRSWV9NQVgpIHsKJiM0MzsJCQlhdG9taWM2NF9pbmMoJmFtcDtrdGxzLSZndDtjb3VudGVyc1tCTlhUX0tUTFNfRVJSX1JFVFJZX0VYQ0VFREVEXSk7CiYjNDM7CQkJbmV0ZGV2X3dhcm4oZGV2LCAmIzM0OyVzIHRpbWVkIG91dCB3YWl0aW5nIGZvciBkZXZpY2UsIHN0YXRlICVseFxuJiMzNDssCiYjNDM7CQkJCSAgICBfX2Z1bmNfXywgYnAtJmd0O3N0YXRlKTsKJiM0MzsJCQlnb3RvIGZyZWU7CiYjNDM7CQl9CiYjNDM7CQl3YWl0X2V2ZW50X3RpbWVvdXQoa3Rscy0mZ3Q7b3Blbl93cSwKJiM0MzsJCQkJICAgdGVzdF9iaXQoQk5YVF9TVEFURV9PUEVOLCAmYW1wO2JwLSZndDtzdGF0ZSkgfHwKJiM0MzsJCQkJICAgIW5ldGlmX3J1bm5pbmcoZGV2KSB8fAomIzQzOwkJCQkgICB0ZXN0X2JpdChCTlhUX1NUQVRFX0lOX0ZXX1JFU0VULCAmYW1wO2JwLSZndDtzdGF0ZSksCiYjNDM7CQkJCSAgIG1zZWNzX3RvX2ppZmZpZXMoS1RMU19XQUlUX1RNT19NUykpOwomIzQzOwkJZ290byByZXRyeTsKJiM0MzsJfQomIzQzOwlhdG9taWNfaW5jKCZhbXA7a3Rscy0mZ3Q7cGVuZGluZyk7CiYjNDM7CS8qIE1ha2Ugc3VyZSBibnh0X2Nsb3NlX25pYygpIHNlZXMgcGVuZGluZyBiZWZvcmUgd2UgY2hlY2sgdGhlCiYjNDM7CSAqIEJOWFRfU1RBVEVfT1BFTiBmbGFnLgomIzQzOwkgKi8KJiM0MzsJc21wX21iX19hZnRlcl9hdG9taWMoKTsKJiM0MzsJaWYgKCF0ZXN0X2JpdChCTlhUX1NUQVRFX09QRU4sICZhbXA7YnAtJmd0O3N0YXRlKSkgewomIzQzOwkJYXRvbWljX2RlYygmYW1wO2t0bHMtJmd0O3BlbmRpbmcpOwomIzQzOwkJZ290byByZXRyeTsKJiM0MzsJfQomIzQzOwomIzQzOwljcnlwdG8gPSBicC0mZ3Q7Y3J5cHRvX2luZm87CiYjNDM7CWtpZCA9IGtjdHhfdHgtJmd0O2tpZDsKJiM0MzsJa2N0eCA9ICZhbXA7Y3J5cHRvLSZndDtrY3R4W0JOWFRfVFhfQ1JZUFRPX0tFWV9UWVBFXTsKJiM0MzsJa2luZCA9IEJOWFRfQ1RYX0tJTkRfQ0tfVFg7CiYjNDM7CWF0b21pYzY0X2luYygmYW1wO2t0bHMtJmd0O2NvdW50ZXJzW0JOWFRfS1RMU19UWF9ERUxdKTsKJiM0MzsJLyogVGhpcyBLSUQgd2FzIGFsbG9jYXRlZCBieSBhbiBlYXJsaWVyIGFkZCBhbmQgbWF5IGhhdmUgb3V0bGl2ZWQgYSBGVwomIzQzOwkgKiByZXNldCwgc28gdmFsaWRhdGUgaXRzIGVwb2NoIGJlZm9yZSBkZWxldGluZy9mcmVlaW5nIGl0LgomIzQzOwkgKi8KJiM0MzsJaWYgKGJueHRfa2lkX3ZhbGlkKGtjdHgsIGtpZCkgJmFtcDsmYW1wOwomIzQzOwkgICAgIWJueHRfY3J5cHRvX2RlbChicCwga2N0eC0mZ3Q7dHlwZSwga2luZCwga2lkKSkKJiM0MzsJCWJueHRfZnJlZV9vbmVfa2N0eChrY3R4LCBraWQpOwomIzQzOwomIzQzOwlhdG9taWNfZGVjKCZhbXA7a3Rscy0mZ3Q7cGVuZGluZyk7CiYjNDM7ZnJlZToKJiM0MzsJYm54dF9zZXRfa3Rsc19jdHhfdHgodGxzX2N0eCwgTlVMTCk7CiYjNDM7CWtmcmVlKGtjdHhfdHgpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgY29uc3Qgc3RydWN0IHRsc2Rldl9vcHMgYm54dF9rdGxzX29wcyA9IHsKJiM0MzsJLnRsc19kZXZfYWRkID0gYm54dF9rdGxzX2Rldl9hZGQsCiYjNDM7CS50bHNfZGV2X2RlbCA9IGJueHRfa3Rsc19kZXZfZGVsLAomIzQzO307CiYjNDM7CiYjNDM7aW50IGJueHRfa3Rsc19pbml0KHN0cnVjdCBibnh0ICpicCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBibnh0X3Rsc19pbmZvICprdGxzID0gYnAtJmd0O2t0bHNfaW5mbzsKJiM0MzsJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGJwLSZndDtkZXY7CiYjNDM7CiYjNDM7CWlmICgha3RscykKJiM0MzsJCXJldHVybiAwOwomIzQzOwomIzQzOwlkZXYtJmd0O3Rsc2Rldl9vcHMgPSAmYW1wO2JueHRfa3Rsc19vcHM7CiYjNDM7CWRldi0mZ3Q7aHdfZmVhdHVyZXMgfD0gTkVUSUZfRl9IV19UTFNfVFg7CiYjNDM7CWRldi0mZ3Q7ZmVhdHVyZXMgfD0gTkVUSUZfRl9IV19UTFNfVFg7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCBibnh0X2t0bHNfaW5jX3R4X3N0YXRzKHN0cnVjdCBibnh0X3R4X3JpbmdfaW5mbyAqdHhyLCB1MzIgYnl0ZXMsCiYjNDM7CQkJCSAgIGJvb2wgb29vKQomIzQzO3sKJiM0MzsJc3RydWN0IGJueHRfdGxzX3N3X3N0YXRzICpyaW5nX3N0YXRzID0gdHhyLSZndDt0bHNfc3RhdHM7CiYjNDM7CiYjNDM7CWlmICghcmluZ19zdGF0cykKJiM0MzsJCXJldHVybjsKJiM0MzsJcmluZ19zdGF0cy0mZ3Q7Y291bnRlcnNbQk5YVF9LVExTX1RYX1BLVFNdJiM0MzsmIzQzOzsKJiM0MzsJcmluZ19zdGF0cy0mZ3Q7Y291bnRlcnNbQk5YVF9LVExTX1RYX0JZVEVTXSAmIzQzOz0gYnl0ZXM7CiYjNDM7CWlmIChvb28pCiYjNDM7CQlyaW5nX3N0YXRzLSZndDtjb3VudGVyc1tCTlhUX0tUTFNfVFhfT09PX1BLVFNdJiM0MzsmIzQzOzsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgYm54dF9rdGxzX3ByZV94bWl0KHN0cnVjdCBibnh0ICpicCwgc3RydWN0IGJueHRfdHhfcmluZ19pbmZvICp0eHIsCiYjNDM7CQkJICAgICAgIHUzMiBraWQsIHN0cnVjdCBjcnlwdG9fcHJlZml4X2NtZCAqcHJlX2NtZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBibnh0X3N3X3R4X2JkICp0eF9idWY7CiYjNDM7CXN0cnVjdCB0eF9iZF9wcmVzeW5jICpwc2JkOwomIzQzOwl1MzIgYmRfc3BhY2UsIHNwYWNlOwomIzQzOwl1OCAqcGNtZDsKJiM0MzsJdTE2IHByb2Q7CiYjNDM7CiYjNDM7CXByb2QgPSB0eHItJmd0O3R4X3Byb2Q7CiYjNDM7CXR4X2J1ZiA9ICZhbXA7dHhyLSZndDt0eF9idWZfcmluZ1tSSU5HX1RYKGJwLCBwcm9kKV07CiYjNDM7CiYjNDM7CXBzYmQgPSAodm9pZCAqKSZhbXA7dHhyLSZndDt0eF9kZXNjX3JpbmdbVFhfUklORyhicCwgcHJvZCldW1RYX0lEWChwcm9kKV07CiYjNDM7CXBzYmQtJmd0O3R4X2JkX2xlbl9mbGFnc190eXBlID0gQ1JZUFRPX1BSRVNZTkNfQkRfQ01EOwomIzQzOwlwc2JkLSZndDt0eF9iZF9raWQgPSBjcHVfdG9fbGUzMihCTlhUX0tJRF9IVyhraWQpKTsKJiM0MzsJcHNiZC0mZ3Q7dHhfYmRfb3BhcXVlID0KJiM0MzsJCVNFVF9UWF9PUEFRVUUoYnAsIHR4ciwgcHJvZCwgQ1JZUFRPX1BSRUZJWF9DTURfQkRTICYjNDM7IDEpOwomIzQzOwomIzQzOwlwcm9kID0gTkVYVF9UWChwcm9kKTsKJiM0MzsJcGNtZCA9ICh2b2lkICopJmFtcDt0eHItJmd0O3R4X2Rlc2NfcmluZ1tUWF9SSU5HKGJwLCBwcm9kKV1bVFhfSURYKHByb2QpXTsKJiM0MzsJYmRfc3BhY2UgPSBUWF9ERVNDX0NOVCAtIFRYX0lEWChwcm9kKTsKJiM0MzsJc3BhY2UgPSBiZF9zcGFjZSAqIHNpemVvZihzdHJ1Y3QgdHhfYmQpOwomIzQzOwlpZiAoc3BhY2UgJmd0Oz0gQ1JZUFRPX1BSRUZJWF9DTURfU0laRSkgewomIzQzOwkJbWVtY3B5KHBjbWQsIHByZV9jbWQsIENSWVBUT19QUkVGSVhfQ01EX1NJWkUpOwomIzQzOwkJcHJvZCAmIzQzOz0gQ1JZUFRPX1BSRUZJWF9DTURfQkRTOwomIzQzOwl9IGVsc2UgewomIzQzOwkJbWVtY3B5KHBjbWQsIHByZV9jbWQsIHNwYWNlKTsKJiM0MzsJCXByb2QgJiM0Mzs9IGJkX3NwYWNlOwomIzQzOwkJcGNtZCA9ICh2b2lkICopJmFtcDt0eHItJmd0O3R4X2Rlc2NfcmluZ1tUWF9SSU5HKGJwLCBwcm9kKV1bVFhfSURYKHByb2QpXTsKJiM0MzsJCW1lbWNweShwY21kLCAodTggKilwcmVfY21kICYjNDM7IHNwYWNlLAomIzQzOwkJICAgICAgIENSWVBUT19QUkVGSVhfQ01EX1NJWkUgLSBzcGFjZSk7CiYjNDM7CQlwcm9kICYjNDM7PSBDUllQVE9fUFJFRklYX0NNRF9CRFMgLSBiZF9zcGFjZTsKJiM0MzsJfQomIzQzOwl0eHItJmd0O3R4X3Byb2QgPSBwcm9kOwomIzQzOwl0eF9idWYtJmd0O2lzX3B1c2ggPSAxOwomIzQzOwkvKiBNaW51cyAxIHNpbmNlIHRoZSBoZWFkZXIgcHNiZCBpcyBhIHNpbmdsZSBlbnRyeSBzaG9ydCBCRCAqLwomIzQzOwl0eF9idWYtJmd0O2lubGluZV9kYXRhX2JkcyA9IENSWVBUT19QUkVGSVhfQ01EX0JEUyAtIDE7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgYm54dF9rdGxzX3R4X29vbyhzdHJ1Y3QgYm54dCAqYnAsIHN0cnVjdCBibnh0X3R4X3JpbmdfaW5mbyAqdHhyLAomIzQzOwkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgcGF5bG9hZF9sZW4sIHUzMiBzZXEsCiYjNDM7CQkJICAgIHN0cnVjdCB0bHNfY29udGV4dCAqdGxzX2N0eCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBibnh0X3Rsc19zd19zdGF0cyAqcmluZ19zdGF0cyA9IHR4ci0mZ3Q7dGxzX3N0YXRzOwomIzQzOwlzdHJ1Y3QgdGxzX29mZmxvYWRfY29udGV4dF90eCAqdHhfdGxzX2N0eDsKJiM0MzsJc3RydWN0IGJueHRfa3Rsc19vZmZsb2FkX2N0eF90eCAqa2N0eF90eDsKJiM0MzsJdTMyIGhkcl90Y3Bfc2VxLCBlbmRfc2VxLCB0b3RhbF9iZHM7CiYjNDM7CXN0cnVjdCBjcnlwdG9fcHJlZml4X2NtZCBwY21kID0ge307CiYjNDM7CXN0cnVjdCB0bHNfcmVjb3JkX2luZm8gKnJlY29yZDsKJiM0MzsJdW5zaWduZWQgbG9uZyBmbGFnczsKJiM0MzsJYm9vbCBmd2QgPSBmYWxzZTsKJiM0MzsJX19sZTY0IGxlX3JlY19zbjsKJiM0MzsJdTY0IHJlY19zbjsKJiM0MzsJdTggKmhkcjsKJiM0MzsJaW50IHJjOwomIzQzOwomIzQzOwl0eF90bHNfY3R4ID0gdGxzX29mZmxvYWRfY3R4X3R4KHRsc19jdHgpOwomIzQzOwlrY3R4X3R4ID0gYm54dF9nZXRfa3Rsc19jdHhfdHgodGxzX2N0eCk7CiYjNDM7CWVuZF9zZXEgPSBzZXEgJiM0Mzsgc2tiLSZndDtsZW4gLSBza2JfdGNwX2FsbF9oZWFkZXJzKHNrYik7CiYjNDM7CWlmICh1bmxpa2VseShhZnRlcihzZXEsIGtjdHhfdHgtJmd0O3RjcF9zZXFfbm8pIHx8CiYjNDM7CQkgICAgIGFmdGVyKGVuZF9zZXEsIGtjdHhfdHgtJmd0O3RjcF9zZXFfbm8pKSkgewomIzQzOwkJZndkID0gdHJ1ZTsKJiM0MzsJCXBjbWQuZmxhZ3MgPSBDUllQVE9fUFJFRklYX0NNRF9GTEFHU19VUERBVEVfSU5fT1JERVJfVkFSX0xFOwomIzQzOwl9CiYjNDM7CiYjNDM7CXNwaW5fbG9ja19pcnFzYXZlKCZhbXA7dHhfdGxzX2N0eC0mZ3Q7bG9jaywgZmxhZ3MpOwomIzQzOwlyZWNvcmQgPSB0bHNfZ2V0X3JlY29yZCh0eF90bHNfY3R4LCBzZXEsICZhbXA7cmVjX3NuKTsKJiM0MzsJaWYgKCFyZWNvcmQgfHwgIXJlY29yZC0mZ3Q7bnVtX2ZyYWdzKSB7CiYjNDM7CQlyYyA9IC1FUFJPVE87CiYjNDM7CQlyaW5nX3N0YXRzLSZndDtjb3VudGVyc1tCTlhUX0tUTFNfVFhfT09PX0ZBTExCQUNLX05PX1NZTkNdJiM0MzsmIzQzOzsKJiM0MzsJCWdvdG8gdW5sb2NrX2V4aXQ7CiYjNDM7CX0KJiM0MzsJaGRyX3RjcF9zZXEgPSB0bHNfcmVjb3JkX3N0YXJ0X3NlcShyZWNvcmQpOwomIzQzOwloZHIgPSBza2JfZnJhZ19hZGRyZXNzX3NhZmUoJmFtcDtyZWNvcmQtJmd0O2ZyYWdzWzBdKTsKJiM0MzsKJiM0MzsJdG90YWxfYmRzID0gQ1JZUFRPX1BSRVNZTkNfQkRTICYjNDM7IHNrYl9zaGluZm8oc2tiKS0mZ3Q7bnJfZnJhZ3MgJiM0MzsgMjsKJiM0MzsJaWYgKGJueHRfdHhfYXZhaWwoYnAsIHR4cikgJmx0OyB0b3RhbF9iZHMpIHsKJiM0MzsJCXJjID0gLUVOT1NQQzsKJiM0MzsJCXJpbmdfc3RhdHMtJmd0O2NvdW50ZXJzW0JOWFRfS1RMU19UWF9PT09fRkFMTEJBQ0tfTk9fU1BBQ0VdJiM0MzsmIzQzOzsKJiM0MzsJCWdvdG8gdW5sb2NrX2V4aXQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKGJlZm9yZShyZWNvcmQtJmd0O2VuZF9zZXEgLSB0bHNfY3R4LSZndDtwcm90X2luZm8udGFnX3NpemUsCiYjNDM7CQkgICBzZXEgJiM0MzsgcGF5bG9hZF9sZW4pKSB7CiYjNDM7CQkvKiByZXRyYW5zbWlzc2lvbiBpbmNsdWRlcyB0YWcgYnl0ZXMgKi8KJiM0MzsJCXJjID0gLUVPUE5PVFNVUFA7CiYjNDM7CQlnb3RvIHVubG9ja19leGl0OwomIzQzOwl9CiYjNDM7CXBjbWQuaGVhZGVyX3RjcF9zZXFfbnVtID0gY3B1X3RvX2xlMzIoaGRyX3RjcF9zZXEpOwomIzQzOwlwY21kLnN0YXJ0X3RjcF9zZXFfbnVtID0gY3B1X3RvX2xlMzIoc2VxKTsKJiM0MzsJcGNtZC5lbmRfdGNwX3NlcV9udW0gPSBjcHVfdG9fbGUzMihzZXEgJiM0MzsgcGF5bG9hZF9sZW4gLSAxKTsKJiM0MzsJaWYgKHRsc19jdHgtJmd0O3Byb3RfaW5mby52ZXJzaW9uID09IFRMU18xXzJfVkVSU0lPTikgewomIzQzOwkJdTMyIG5vbmNlX2J5dGVzID0gdGxzX2N0eC0mZ3Q7cHJvdF9pbmZvLml2X3NpemU7CiYjNDM7CQl1MzIgcmV0cmFuc19vZmYgPSBzZXEgLSBoZHJfdGNwX3NlcTsKJiM0MzsKJiM0MzsJCWlmICghaGRyKSB7CiYjNDM7CQkJcmMgPSAtRU5PQlVGUzsKJiM0MzsJCQlyaW5nX3N0YXRzLSZndDtjb3VudGVyc1tCTlhUX0tUTFNfVFhfT09PX0ZBTExCQUNLX05PX0hEUl0mIzQzOyYjNDM7OwomIzQzOwkJCWdvdG8gdW5sb2NrX2V4aXQ7CiYjNDM7CQl9CiYjNDM7CQlpZiAocmV0cmFuc19vZmYgJmd0OyA1ICZhbXA7JmFtcDsgcmV0cmFuc19vZmYgJmx0OyA1ICYjNDM7IG5vbmNlX2J5dGVzKQomIzQzOwkJCW5vbmNlX2J5dGVzID0gcmV0cmFuc19vZmYgLSA1OwomIzQzOwkJbWVtY3B5KHBjbWQuZXhwbGljaXRfbm9uY2UsIGhkciAmIzQzOyA1LCBub25jZV9ieXRlcyk7CiYjNDM7CX0KJiM0MzsJbGVfcmVjX3NuID0gY3B1X3RvX2xlNjQocmVjX3NuKTsKJiM0MzsJbWVtY3B5KCZhbXA7cGNtZC5yZWNvcmRfc2VxX251bVswXSwgJmFtcDtsZV9yZWNfc24sIHNpemVvZihsZV9yZWNfc24pKTsKJiM0MzsKJiM0MzsJcmMgPSAwOwomIzQzOwlibnh0X2t0bHNfcHJlX3htaXQoYnAsIHR4ciwga2N0eF90eC0mZ3Q7a2lkLCAmYW1wO3BjbWQpOwomIzQzOwomIzQzOwlpZiAoZndkKSB7CiYjNDM7CQlrY3R4X3R4LSZndDtuZXh0X3RjcF9zZXFfbm8gPSBlbmRfc2VxOwomIzQzOwkJa2N0eF90eC0mZ3Q7cGVuZGluZ19md2QgPSB0cnVlOwomIzQzOwl9CiYjNDM7CiYjNDM7dW5sb2NrX2V4aXQ6CiYjNDM7CXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFtcDt0eF90bHNfY3R4LSZndDtsb2NrLCBmbGFncyk7CiYjNDM7CXJldHVybiByYzsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RydWN0IHNrX2J1ZmYgKmJueHRfa3Rsc194bWl0KHN0cnVjdCBibnh0ICpicCwgc3RydWN0IGJueHRfdHhfcmluZ19pbmZvICp0eHIsCiYjNDM7CQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IsIF9fbGUzMiAqbGZsYWdzLCB1MzIgKmtpZCwKJiM0MzsJCQkgICAgICAgc3RydWN0IGJueHRfa3Rsc19vZmZsb2FkX2N0eF90eCAqKmtjdHhfdHhfcCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBibnh0X3Rsc19pbmZvICprdGxzID0gYnAtJmd0O2t0bHNfaW5mbzsKJiM0MzsJc3RydWN0IGJueHRfa3Rsc19vZmZsb2FkX2N0eF90eCAqa2N0eF90eDsKJiM0MzsJc3RydWN0IHRsc19jb250ZXh0ICp0bHNfY3R4OwomIzQzOwl1MzIgc2VxLCBwYXlsb2FkX2xlbjsKJiM0MzsJaW50IHJjOwomIzQzOwomIzQzOwlpZiAoIUlTX0VOQUJMRUQoQ09ORklHX1RMU19ERVZJQ0UpIHx8ICFrdGxzIHx8CiYjNDM7CSAgICAhdGxzX2lzX3NrYl90eF9kZXZpY2Vfb2ZmbG9hZGVkKHNrYikpCiYjNDM7CQlyZXR1cm4gc2tiOwomIzQzOwomIzQzOwlzZXEgPSBudG9obCh0Y3BfaGRyKHNrYiktJmd0O3NlcSk7CiYjNDM7CXRsc19jdHggPSB0bHNfZ2V0X2N0eChza2ItJmd0O3NrKTsKJiM0MzsJa2N0eF90eCA9IGJueHRfZ2V0X2t0bHNfY3R4X3R4KHRsc19jdHgpOwomIzQzOwlwYXlsb2FkX2xlbiA9IHNrYi0mZ3Q7bGVuIC0gc2tiX3RjcF9hbGxfaGVhZGVycyhza2IpOwomIzQzOwlpZiAoIXBheWxvYWRfbGVuKQomIzQzOwkJcmV0dXJuIHNrYjsKJiM0MzsJaWYgKGtjdHhfdHgtJmd0O3RjcF9zZXFfbm8gPT0gc2VxKSB7CiYjNDM7CQkvKiBTdGFnZSB0aGUgYWR2YW5jZSBvbmx5LiAgdGNwX3NlcV9ubyBhbmQgdGhlIGNvdW50ZXJzIGFyZQomIzQzOwkJICogY29tbWl0dGVkIGJ5IGJueHRfa3Rsc194bWl0X2NvbW1pdCgpIG9uY2UgdGhlIEJEIHJlYWNoZXMgdGhlCiYjNDM7CQkgKiByaW5nLgomIzQzOwkJICovCiYjNDM7CQlrY3R4X3R4LSZndDtuZXh0X3RjcF9zZXFfbm8gPSBzZXEgJiM0MzsgcGF5bG9hZF9sZW47CiYjNDM7CQlrY3R4X3R4LSZndDtwZW5kaW5nX2J5dGVzID0gcGF5bG9hZF9sZW47CiYjNDM7CQlrY3R4X3R4LSZndDtwZW5kaW5nX29vbyA9IGZhbHNlOwomIzQzOwkJa2N0eF90eC0mZ3Q7cGVuZGluZ19md2QgPSB0cnVlOwomIzQzOwkJKmtpZCA9IEJOWFRfS0lEX0hXKGtjdHhfdHgtJmd0O2tpZCk7CiYjNDM7CQkqa2N0eF90eF9wID0ga2N0eF90eDsKJiM0MzsJCSpsZmxhZ3MgfD0gY3B1X3RvX2xlMzIoVFhfQkRfRkxBR1NfQ1JZUFRPX0VOIHwKJiM0MzsJCQkJICAgICAgIEJOWFRfVFhfS0lEX0xPKCpraWQpKTsKJiM0MzsJfSBlbHNlIHsKJiM0MzsJCWtjdHhfdHgtJmd0O3BlbmRpbmdfZndkID0gZmFsc2U7CiYjNDM7CQlyYyA9IGJueHRfa3Rsc190eF9vb28oYnAsIHR4ciwgc2tiLCBwYXlsb2FkX2xlbiwgc2VxLCB0bHNfY3R4KTsKJiM0MzsJCWlmIChyYykKJiM0MzsJCQlyZXR1cm4gdGxzX2VuY3J5cHRfc2tiKHNrYik7CiYjNDM7CiYjNDM7CQlrY3R4X3R4LSZndDtwZW5kaW5nX2J5dGVzID0gcGF5bG9hZF9sZW47CiYjNDM7CQlrY3R4X3R4LSZndDtwZW5kaW5nX29vbyA9IHRydWU7CiYjNDM7CQkqa2lkID0gQk5YVF9LSURfSFcoa2N0eF90eC0mZ3Q7a2lkKTsKJiM0MzsJCSprY3R4X3R4X3AgPSBrY3R4X3R4OwomIzQzOwkJKmxmbGFncyB8PSBjcHVfdG9fbGUzMihUWF9CRF9GTEFHU19DUllQVE9fRU4gfAomIzQzOwkJCQkgICAgICAgQk5YVF9UWF9LSURfTE8oKmtpZCkpOwomIzQzOwkJcmV0dXJuIHNrYjsKJiM0MzsJfQomIzQzOwlyZXR1cm4gc2tiOwomIzQzO30KJiM0MzsKJiM0Mzt2b2lkIGJueHRfa3Rsc194bWl0X2NvbW1pdChzdHJ1Y3QgYm54dF90eF9yaW5nX2luZm8gKnR4ciwKJiM0MzsJCQkgICBzdHJ1Y3QgYm54dF9rdGxzX29mZmxvYWRfY3R4X3R4ICprY3R4X3R4KQomIzQzO3sKJiM0MzsJaWYgKCFrY3R4X3R4KQomIzQzOwkJcmV0dXJuOwomIzQzOwlpZiAoa2N0eF90eC0mZ3Q7cGVuZGluZ19md2QpCiYjNDM7CQlrY3R4X3R4LSZndDt0Y3Bfc2VxX25vID0ga2N0eF90eC0mZ3Q7bmV4dF90Y3Bfc2VxX25vOwomIzQzOwlibnh0X2t0bHNfaW5jX3R4X3N0YXRzKHR4ciwga2N0eF90eC0mZ3Q7cGVuZGluZ19ieXRlcywKJiM0MzsJCQkgICAgICAga2N0eF90eC0mZ3Q7cGVuZGluZ19vb28pOwomIzQzOwlrY3R4X3R4LSZndDtwZW5kaW5nX2J5dGVzID0gMDsKJiM0MzsJa2N0eF90eC0mZ3Q7cGVuZGluZ19md2QgPSBmYWxzZTsKJiM0MzsJa2N0eF90eC0mZ3Q7cGVuZGluZ19vb28gPSBmYWxzZTsKJiM0Mzt9CiYjNDM7CiYjNDM7aW50IGJueHRfa3Rsc19hbGxvY190eF9yaW5nX3N0YXRzKHN0cnVjdCBibnh0ICpicCwgc3RydWN0IGJueHRfdHhfcmluZ19pbmZvICp0eHIpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYm54dF90bHNfc3dfc3RhdHMgKnJpbmdfc3RhdHM7CiYjNDM7CiYjNDM7CWlmICghYnAtJmd0O2t0bHNfaW5mbykKJiM0MzsJCXJldHVybiAwOwomIzQzOwlyaW5nX3N0YXRzID0ga3phbGxvY19vYmooKnJpbmdfc3RhdHMpOwomIzQzOwlpZiAoIXJpbmdfc3RhdHMpCiYjNDM7CQlyZXR1cm4gLUVOT01FTTsKJiM0MzsJdHhyLSZndDt0bHNfc3RhdHMgPSByaW5nX3N0YXRzOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7dm9pZCBibnh0X2t0bHNfZnJlZV90eF9yaW5nX3N0YXRzKHN0cnVjdCBibnh0X3R4X3JpbmdfaW5mbyAqdHhyKQomIzQzO3sKJiM0MzsJa2ZyZWUodHhyLSZndDt0bHNfc3RhdHMpOwomIzQzOwl0eHItJmd0O3Rsc19zdGF0cyA9IE5VTEw7CiYjNDM7fQomIzQzOwomIzQzO3ZvaWQgYm54dF9nZXRfcmluZ190bHNfc3RhdHMoc3RydWN0IGJueHQgKmJwLCBzdHJ1Y3QgYm54dF90bHNfc3dfc3RhdHMgKnN0YXRzKQomIzQzO3sKJiM0MzsJc3RydWN0IGJueHRfdGxzX3N3X3N0YXRzICpyaW5nX3N0YXRzOwomIzQzOwlpbnQgaSwgajsKJiM0MzsKJiM0MzsJaWYgKCFicC0mZ3Q7a3Rsc19pbmZvIHx8ICFicC0mZ3Q7dHhfcmluZykKJiM0MzsJCXJldHVybjsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IGJwLSZndDt0eF9ucl9yaW5nczsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCXJpbmdfc3RhdHMgPSBicC0mZ3Q7dHhfcmluZ1tpXS50bHNfc3RhdHM7CiYjNDM7CQlpZiAoIXJpbmdfc3RhdHMpCiYjNDM7CQkJY29udGludWU7CiYjNDM7CQlmb3IgKGogPSAwOyBqICZsdDsgQk5YVF9LVExTX01BWF9EQVRBX0NPVU5URVJTOyBqJiM0MzsmIzQzOykKJiM0MzsJCQlzdGF0cy0mZ3Q7Y291bnRlcnNbal0gJiM0Mzs9IHJpbmdfc3RhdHMtJmd0O2NvdW50ZXJzW2pdOwomIzQzOwl9CiYjNDM7fQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9ibnh0X2t0bHMuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dF9rdGxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAuLjNlYzU2YjhmMDhkNDliCi0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9ibnh0X2t0bHMuaApAQCAtMCwwICYjNDM7MSwxNzQgQEAKJiM0MzsvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5ICovCiYjNDM7LyogQ29weXJpZ2h0IChjKSAyMDI2IEJyb2FkY29tIEluYy4gKi8KJiM0MzsKJiM0MzsjaWZuZGVmIEJOWFRfS1RMU19ICiYjNDM7I2RlZmluZSBCTlhUX0tUTFNfSAomIzQzOwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC93YWl0LmgmZ3Q7CiYjNDM7CiYjNDM7LyogQ29udHJvbCBwbGFuZSBjb3VudGVycyAqLwomIzQzO2VudW0gYm54dF9rdGxzX2N0cmxfY291bnRlcnMgewomIzQzOwlCTlhUX0tUTFNfVFhfQUREID0gMCwKJiM0MzsJQk5YVF9LVExTX1RYX0RFTCwKJiM0MzsKJiM0MzsJLyogRXJyb3IgY291bnRlcnMgZm9yIGRlYnVnZ2luZyAqLwomIzQzOwlCTlhUX0tUTFNfRVJSX05PX01FTSwJCQkvKiBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlICovCiYjNDM7CUJOWFRfS1RMU19FUlJfTk9fQ0FQLAkJCS8qIENhcGFiaWxpdHkgbG9zdCBhZnRlciBGVyByZXNldCAqLwomIzQzOwlCTlhUX0tUTFNfRVJSX0tFWV9DVFhfQUxMT0MsCQkvKiBLZXkgY29udGV4dCBhbGxvYyBmYWlsdXJlICovCiYjNDM7CUJOWFRfS1RMU19FUlJfQ1JZUFRPX0NNRCwJCS8qIENyeXB0byBjb21tYW5kIGZhaWx1cmUgKi8KJiM0MzsJQk5YVF9LVExTX0VSUl9ERVZJQ0VfQlVTWSwJCS8qIERldmljZSBub3QgcmVhZHkgKi8KJiM0MzsJQk5YVF9LVExTX0VSUl9JTlZBTElEX0NJUEhFUiwJCS8qIFVuc3VwcG9ydGVkIGNpcGhlciAqLwomIzQzOwlCTlhUX0tUTFNfRVJSX1NUQVRFX05PVF9PUEVOLAkJLyogRGV2aWNlIG5vdCBvcGVuICovCiYjNDM7CUJOWFRfS1RMU19FUlJfUkVUUllfRVhDRUVERUQsCQkvKiBSZXRyeSBsaW1pdCBleGNlZWRlZCAqLwomIzQzOwomIzQzOwlCTlhUX0tUTFNfTUFYX0NUUkxfQ09VTlRFUlMsCiYjNDM7fTsKJiM0MzsKJiM0MztzdHJ1Y3QgYm54dF90bHNfaW5mbyB7CiYjNDM7CWF0b21pY190CQlwZW5kaW5nOwomIzQzOwomIzQzOwkvKiBXb2tlbiBmcm9tIF9fYm54dF9vcGVuX25pYygpL19fYm54dF9jbG9zZV9uaWMoKSB3aGVuCiYjNDM7CSAqIEJOWFRfU1RBVEVfT1BFTiBjaGFuZ2VzLCBzbyBhIGtUTFMgZGVsZXRlIGNhbiB3YWl0IG91dCBhIHJpbmcKJiM0MzsJICogcmVjb25maWd1cmF0aW9uIGluc3RlYWQgb2YgcG9sbGluZyB0aGUgc3RhdGUgYml0LgomIzQzOwkgKi8KJiM0MzsJd2FpdF9xdWV1ZV9oZWFkX3QJb3Blbl93cTsKJiM0MzsKJiM0MzsJLyogQXRvbWljIGNvdW50ZXJzIGZvciBjb250cm9sIHBhdGggKi8KJiM0MzsJYXRvbWljNjRfdAkJKmNvdW50ZXJzOwomIzQzO307CiYjNDM7CiYjNDM7c3RydWN0IGJueHRfa3Rsc19vZmZsb2FkX2N0eF90eCB7CiYjNDM7CXUzMgkJdGNwX3NlcV9ubzsJLyogdGNwIHNlcSBubyBpbiBzeW5jIHdpdGggSFcgKi8KJiM0MzsJdTMyCQluZXh0X3RjcF9zZXFfbm87Lyogc3RhZ2VkIHRjcCBzZXEgbm8gKi8KJiM0MzsJdTMyCQlraWQ7CiYjNDM7CXUzMgkJcGVuZGluZ19ieXRlczsJLyogc3RhZ2VkIHBheWxvYWQgYnl0ZXMgKi8KJiM0MzsJYm9vbAkJcGVuZGluZ19md2Q7CiYjNDM7CWJvb2wJCXBlbmRpbmdfb29vOwomIzQzO307CiYjNDM7CiYjNDM7c3RydWN0IGJueHRfa3Rsc190eF9kcml2ZXJfc3RhdGUgewomIzQzOwlzdHJ1Y3QgYm54dF9rdGxzX29mZmxvYWRfY3R4X3R4ICpjdHhfdHg7CiYjNDM7fTsKJiM0MzsKJiM0MztzdHJ1Y3QgY2VfYWRkX2NtZCB7CiYjNDM7CV9fbGUzMgl2ZXJfYWxnb19raWRfb3Bjb2RlOwomIzQzOwkjZGVmaW5lIENFX0FERF9DTURfT1BDT0RFX01BU0sJCQkweGZVTAomIzQzOwkjZGVmaW5lIENFX0FERF9DTURfT1BDT0RFX1NGVAkJCTAKJiM0MzsJI2RlZmluZSBDRV9BRERfQ01EX09QQ09ERV9BREQJCQkgMHgxVUwKJiM0MzsJI2RlZmluZSBDRV9BRERfQ01EX0tJRF9NQVNLCQkJMHhmZmZmZjBVTAomIzQzOwkjZGVmaW5lIENFX0FERF9DTURfS0lEX1NGVAkJCTQKJiM0MzsJI2RlZmluZSBDRV9BRERfQ01EX0FMR09SSVRITV9NQVNLCQkweGYwMDAwMDBVTAomIzQzOwkjZGVmaW5lIENFX0FERF9DTURfQUxHT1JJVEhNX1NGVAkJMjQKJiM0MzsJI2RlZmluZSBDRV9BRERfQ01EX0FMR09SSVRITV9BRVNfR0NNXzEyOAkgMHgxMDAwMDAwVUwKJiM0MzsJI2RlZmluZSBDRV9BRERfQ01EX0FMR09SSVRITV9BRVNfR0NNXzI1NgkgMHgyMDAwMDAwVUwKJiM0MzsJI2RlZmluZSBDRV9BRERfQ01EX1ZFUlNJT05fTUFTSwkJCTB4ZjAwMDAwMDBVTAomIzQzOwkjZGVmaW5lIENFX0FERF9DTURfVkVSU0lPTl9TRlQJCQkyOAomIzQzOwkjZGVmaW5lIENFX0FERF9DTURfVkVSU0lPTl9UTFMxXzIJCSAoMHgwVUwgJmx0OyZsdDsgMjgpCiYjNDM7CSNkZWZpbmUgQ0VfQUREX0NNRF9WRVJTSU9OX1RMUzFfMwkJICgweDFVTCAmbHQ7Jmx0OyAyOCkKJiM0MzsJdTgJY3R4X2tpbmQ7CiYjNDM7CSNkZWZpbmUgQ0VfQUREX0NNRF9DVFhfS0lORF9NQVNLCQkweDFmVUwKJiM0MzsJI2RlZmluZSBDRV9BRERfQ01EX0NUWF9LSU5EX1NGVAkJCTAKJiM0MzsJI2RlZmluZSBDRV9BRERfQ01EX0NUWF9LSU5EX0NLX1RYCQkgMHgxMVVMCiYjNDM7CSNkZWZpbmUgQ0VfQUREX0NNRF9DVFhfS0lORF9DS19SWAkJIDB4MTJVTAomIzQzOwl1OAl1bnVzZWQwWzNdOwomIzQzOwl1OAlzYWx0WzRdOwomIzQzOwl1OAl1bnVzZWQxWzRdOwomIzQzOwlfX2xlMzIJcGt0X3RjcF9zZXFfbnVtOwomIzQzOwlfX2xlMzIJdGxzX2hlYWRlcl90Y3Bfc2VxX251bTsKJiM0MzsJdTgJcmVjb3JkX3NlcV9udW1bOF07CiYjNDM7CXU4CXNlc3Npb25fa2V5WzMyXTsKJiM0MzsJdTgJYWRkbF9pdls4XTsKJiM0Mzt9OwomIzQzOwomIzQzO3N0cnVjdCBjcnlwdG9fcHJlZml4X2NtZCB7CiYjNDM7CV9fbGUzMglmbGFnczsKJiM0MzsJI2RlZmluZSBDUllQVE9fUFJFRklYX0NNRF9GTEFHU19VUERBVEVfSU5fT1JERVJfVkFSCTB4MVVMCiYjNDM7CSNkZWZpbmUgQ1JZUFRPX1BSRUZJWF9DTURfRkxBR1NfRlVMTF9SRVBMQVlfUkVUUkFOCTB4MlVMCiYjNDM7CV9fbGUzMgloZWFkZXJfdGNwX3NlcV9udW07CiYjNDM7CV9fbGUzMglzdGFydF90Y3Bfc2VxX251bTsKJiM0MzsJX19sZTMyCWVuZF90Y3Bfc2VxX251bTsKJiM0MzsJdTgJZXhwbGljaXRfbm9uY2VbOF07CiYjNDM7CXU4CXJlY29yZF9zZXFfbnVtWzhdOwomIzQzO307CiYjNDM7CiYjNDM7I2RlZmluZSBDUllQVE9fUFJFRklYX0NNRF9GTEFHU19VUERBVEVfSU5fT1JERVJfVkFSX0xFCVwKJiM0MzsJY3B1X3RvX2xlMzIoQ1JZUFRPX1BSRUZJWF9DTURfRkxBR1NfVVBEQVRFX0lOX09SREVSX1ZBUikKJiM0MzsKJiM0MzsjZGVmaW5lIENSWVBUT19QUkVGSVhfQ01EX1NJWkUJKCh1MzIpc2l6ZW9mKHN0cnVjdCBjcnlwdG9fcHJlZml4X2NtZCkpCiYjNDM7I2RlZmluZSBDUllQVE9fUFJFRklYX0NNRF9CRFMJKENSWVBUT19QUkVGSVhfQ01EX1NJWkUgLyBzaXplb2Yoc3RydWN0IHR4X2JkKSkKJiM0MzsjZGVmaW5lIENSWVBUT19QUkVTWU5DX0JEUwkoQ1JZUFRPX1BSRUZJWF9DTURfQkRTICYjNDM7IDEpCiYjNDM7CiYjNDM7I2RlZmluZSBDUllQVE9fUFJFU1lOQ19CRF9DTUQJCQkJCQlcCiYjNDM7CShjcHVfdG9fbGUzMigoQ1JZUFRPX1BSRUZJWF9DTURfU0laRSAmbHQ7Jmx0OyBUWF9CRF9MRU5fU0hJRlQpIHwJXAomIzQzOwkJICAgICBUWF9CRF9DTlQoQ1JZUFRPX1BSRVNZTkNfQkRTKSB8IFRYX0JEX1RZUEVfUFJFU1lOQ19UWF9CRCkpCiYjNDM7CiYjNDM7c3RhdGljIGlubGluZSBib29sIGJueHRfa3Rsc19idXN5KHN0cnVjdCBibnh0ICpicCkKJiM0Mzt7CiYjNDM7CXJldHVybiBicC0mZ3Q7a3Rsc19pbmZvICZhbXA7JmFtcDsgYXRvbWljX3JlYWQoJmFtcDticC0mZ3Q7a3Rsc19pbmZvLSZndDtwZW5kaW5nKSAmZ3Q7IDA7CiYjNDM7fQomIzQzOwomIzQzOy8qIFdha2UgYW55IGtUTFMgY29udHJvbCBvcCB3YWl0aW5nIGZvciBhIEJOWFRfU1RBVEVfT1BFTiB0cmFuc2l0aW9uLiAqLwomIzQzO3N0YXRpYyBpbmxpbmUgdm9pZCBibnh0X2t0bHNfd2FrZShzdHJ1Y3QgYm54dCAqYnApCiYjNDM7ewomIzQzOwlpZiAoYnAtJmd0O2t0bHNfaW5mbykKJiM0MzsJCXdha2VfdXBfYWxsKCZhbXA7YnAtJmd0O2t0bHNfaW5mby0mZ3Q7b3Blbl93cSk7CiYjNDM7fQomIzQzOwomIzQzOyNpZmRlZiBDT05GSUdfQk5YVF9UTFMKJiM0MztpbnQgYm54dF9hbGxvY19rdGxzX2luZm8oc3RydWN0IGJueHQgKmJwKTsKJiM0Mzt2b2lkIGJueHRfZnJlZV9rdGxzX2luZm8oc3RydWN0IGJueHQgKmJwKTsKJiM0MztpbnQgYm54dF9rdGxzX2luaXQoc3RydWN0IGJueHQgKmJwKTsKJiM0MztzdHJ1Y3Qgc2tfYnVmZiAqYm54dF9rdGxzX3htaXQoc3RydWN0IGJueHQgKmJwLCBzdHJ1Y3QgYm54dF90eF9yaW5nX2luZm8gKnR4ciwKJiM0MzsJCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgX19sZTMyICpsZmxhZ3MsIHUzMiAqa2lkLAomIzQzOwkJCSAgICAgICBzdHJ1Y3QgYm54dF9rdGxzX29mZmxvYWRfY3R4X3R4ICoqa2N0eF90eF9wKTsKJiM0Mzt2b2lkIGJueHRfa3Rsc194bWl0X2NvbW1pdChzdHJ1Y3QgYm54dF90eF9yaW5nX2luZm8gKnR4ciwKJiM0MzsJCQkgICBzdHJ1Y3QgYm54dF9rdGxzX29mZmxvYWRfY3R4X3R4ICprY3R4X3R4KTsKJiM0MztpbnQgYm54dF9rdGxzX2FsbG9jX3R4X3Jpbmdfc3RhdHMoc3RydWN0IGJueHQgKmJwLAomIzQzOwkJCQkgIHN0cnVjdCBibnh0X3R4X3JpbmdfaW5mbyAqdHhyKTsKJiM0Mzt2b2lkIGJueHRfa3Rsc19mcmVlX3R4X3Jpbmdfc3RhdHMoc3RydWN0IGJueHRfdHhfcmluZ19pbmZvICp0eHIpOwomIzQzO3ZvaWQgYm54dF9nZXRfcmluZ190bHNfc3RhdHMoc3RydWN0IGJueHQgKmJwLCBzdHJ1Y3QgYm54dF90bHNfc3dfc3RhdHMgKnN0YXRzKTsKJiM0MzsjZWxzZQomIzQzO3N0YXRpYyBpbmxpbmUgaW50IGJueHRfYWxsb2Nfa3Rsc19pbmZvKHN0cnVjdCBibnh0ICpicCkKJiM0Mzt7CiYjNDM7CXJldHVybiAtRU9QTk9UU1VQUDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGlubGluZSB2b2lkIGJueHRfZnJlZV9rdGxzX2luZm8oc3RydWN0IGJueHQgKmJwKQomIzQzO3sKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGlubGluZSBpbnQgYm54dF9rdGxzX2luaXQoc3RydWN0IGJueHQgKmJwKQomIzQzO3sKJiM0MzsJcmV0dXJuIC1FT1BOT1RTVVBQOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW5saW5lIHN0cnVjdCBza19idWZmICoKJiM0Mztibnh0X2t0bHNfeG1pdChzdHJ1Y3QgYm54dCAqYnAsIHN0cnVjdCBibnh0X3R4X3JpbmdfaW5mbyAqdHhyLAomIzQzOwkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgX19sZTMyICpsZmxhZ3MsIHUzMiAqa2lkLAomIzQzOwkgICAgICAgc3RydWN0IGJueHRfa3Rsc19vZmZsb2FkX2N0eF90eCAqKmtjdHhfdHhfcCkKJiM0Mzt7CiYjNDM7CXJldHVybiBza2I7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbmxpbmUgdm9pZAomIzQzO2JueHRfa3Rsc194bWl0X2NvbW1pdChzdHJ1Y3QgYm54dF90eF9yaW5nX2luZm8gKnR4ciwKJiM0MzsJCSAgICAgIHN0cnVjdCBibnh0X2t0bHNfb2ZmbG9hZF9jdHhfdHggKmtjdHhfdHgpCiYjNDM7ewomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW5saW5lIGludCBibnh0X2t0bHNfYWxsb2NfdHhfcmluZ19zdGF0cyhzdHJ1Y3QgYm54dCAqYnAsCiYjNDM7CQkJCQkJc3RydWN0IGJueHRfdHhfcmluZ19pbmZvICp0eHIpCiYjNDM7ewomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGlubGluZSB2b2lkIGJueHRfa3Rsc19mcmVlX3R4X3Jpbmdfc3RhdHMoc3RydWN0IGJueHRfdHhfcmluZ19pbmZvICp0eHIpCiYjNDM7ewomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW5saW5lIHZvaWQgYm54dF9nZXRfcmluZ190bHNfc3RhdHMoc3RydWN0IGJueHQgKmJwLAomIzQzOwkJCQkJICAgc3RydWN0IGJueHRfdGxzX3N3X3N0YXRzICpzdGF0cykKJiM0Mzt7CiYjNDM7fQomIzQzOyNlbmRpZgkvKiBDT05GSUdfQk5YVF9UTFMgKi8KJiM0MzsjZW5kaWYJLyogQk5YVF9LVExTX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dF9tcGMuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dF9tcGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMC4uNzFlYmViNmZmMzNhMTUKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibnh0L2JueHRfbXBjLmMKQEAgLTAsMCAmIzQzOzEsNzgzIEBACiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seQomIzQzOy8qIENvcHlyaWdodCAoYykgMjAyNiBCcm9hZGNvbSBJbmMuICovCiYjNDM7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3N0ZGRlZi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC90eXBlcy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9rZXJuZWwuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvc2xhYi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9ibnh0L2hzaS5oJmd0OwomIzQzOwomIzQzOyNpbmNsdWRlICYjMzQ7Ym54dC5oJiMzNDsKJiM0MzsjaW5jbHVkZSAmIzM0O2JueHRfbXBjLmgmIzM0OwomIzQzOyNpbmNsdWRlICYjMzQ7Ym54dF9jcnlwdG8uaCYjMzQ7CiYjNDM7CiYjNDM7dm9pZCBibnh0X2FsbG9jX21wY19pbmZvKHN0cnVjdCBibnh0ICpicCwgdTggbXBjX2NobmxzX2NhcCkKJiM0Mzt7CiYjNDM7CWlmICghKGJwLSZndDtmbGFncyAmYW1wOyBCTlhUX0ZMQUdfQ0hJUF9QNV9QTFVTKSkKJiM0MzsJCXJldHVybjsKJiM0MzsKJiM0MzsJaWYgKCFicC0mZ3Q7bXBjX2luZm8pCiYjNDM7CQlicC0mZ3Q7bXBjX2luZm8gPSBremFsbG9jX29iaigqYnAtJmd0O21wY19pbmZvKTsKJiM0MzsJaWYgKGJwLSZndDttcGNfaW5mbykKJiM0MzsJCWJwLSZndDttcGNfaW5mby0mZ3Q7bXBjX2NobmxzX2NhcCA9IG1wY19jaG5sc19jYXA7CiYjNDM7CWVsc2UKJiM0MzsJCW5ldGRldl93YXJuKGJwLSZndDtkZXYsICYjMzQ7VW5hYmxlIHRvIGFsbG9jYXRlIE1QQyBpbmZvXG4mIzM0Oyk7CiYjNDM7fQomIzQzOwomIzQzO3ZvaWQgYm54dF9mcmVlX21wY19pbmZvKHN0cnVjdCBibnh0ICpicCkKJiM0Mzt7CiYjNDM7CWJueHRfZnJlZV9tcGNfcmluZ3MoYnApOwomIzQzOwlibnh0X2ZyZWVfbXBjcyhicCk7CiYjNDM7CWtmcmVlKGJwLSZndDttcGNfaW5mbyk7CiYjNDM7CWJwLSZndDttcGNfaW5mbyA9IE5VTEw7CiYjNDM7fQomIzQzOwomIzQzO2ludCBibnh0X21wY190eF9yaW5nc19pbl91c2Uoc3RydWN0IGJueHQgKmJwKQomIzQzO3sKJiM0MzsJc3RydWN0IGJueHRfbXBjX2luZm8gKm1wYyA9IGJwLSZndDttcGNfaW5mbzsKJiM0MzsJaW50IGksIG1wY190eCA9IDA7CiYjNDM7CiYjNDM7CWlmICghbXBjKQomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBCTlhUX01QQ19UWVBFX01BWDsgaSYjNDM7JiM0MzspCiYjNDM7CQltcGNfdHggJiM0Mzs9IG1wYy0mZ3Q7bXBjX3JpbmdfY291bnRbaV07CiYjNDM7CXJldHVybiBtcGNfdHg7CiYjNDM7fQomIzQzOwomIzQzO2ludCBibnh0X21wY19jcF9yaW5nc19pbl91c2Uoc3RydWN0IGJueHQgKmJwKQomIzQzO3sKJiM0MzsJc3RydWN0IGJueHRfbXBjX2luZm8gKm1wYyA9IGJwLSZndDttcGNfaW5mbzsKJiM0MzsKJiM0MzsJaWYgKCFtcGMpCiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsJcmV0dXJuIG1wYy0mZ3Q7bXBjX2NwX3JpbmdzOwomIzQzO30KJiM0MzsKJiM0Mztib29sIGJueHRfbmFwaV9oYXNfbXBjKHN0cnVjdCBibnh0ICpicCwgaW50IGkpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYm54dF9tcGNfaW5mbyAqbXBjID0gYnAtJmd0O21wY19pbmZvOwomIzQzOwlzdHJ1Y3QgYm54dF9uYXBpICpibmFwaSA9IGJwLSZndDtibmFwaVtpXTsKJiM0MzsJc3RydWN0IGJueHRfdHhfcmluZ19pbmZvICp0eHI7CiYjNDM7CiYjNDM7CWlmICghbXBjKQomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwomIzQzOwl0eHIgPSBibmFwaS0mZ3Q7dHhfcmluZ1swXTsKJiM0MzsJaWYgKHR4ciAmYW1wOyZhbXA7ICEoYm5hcGktJmd0O2ZsYWdzICZhbXA7IEJOWFRfTkFQSV9GTEFHX1hEUCkpCiYjNDM7CQlyZXR1cm4gdHhyLSZndDt0eHFfaW5kZXggJmx0OyBtcGMtJmd0O21wY19jcF9yaW5nczsKJiM0MzsJcmV0dXJuIGZhbHNlOwomIzQzO30KJiM0MzsKJiM0Mzt2b2lkIGJueHRfc2V0X21wY19jcF9yaW5nKHN0cnVjdCBibnh0ICpicCwgaW50IGJuYXBpX2lkeCwKJiM0MzsJCQkgIHN0cnVjdCBibnh0X2NwX3JpbmdfaW5mbyAqY3ByKQomIzQzO3sKJiM0MzsJc3RydWN0IGJueHRfbXBjX2luZm8gKm1wYyA9IGJwLSZndDttcGNfaW5mbzsKJiM0MzsJc3RydWN0IGJueHRfbmFwaSAqYm5hcGk7CiYjNDM7CWJvb2wgZm91bmQgPSBmYWxzZTsKJiM0MzsJaW50IGksIGo7CiYjNDM7CiYjNDM7CWlmICghbXBjKQomIzQzOwkJcmV0dXJuOwomIzQzOwlibmFwaSA9IGJwLSZndDtibmFwaVtibmFwaV9pZHhdOwomIzQzOwkvKiBDaGVjayBib3RoIFRDRSBhbmQgUkNFIE1QQ3MgZm9yIHRoZSBtYXRjaGluZyBOQVBJICovCiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBCTlhUX01QQ19UWVBFX01BWDsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCWludCBudW0gPSBtcGMtJmd0O21wY19yaW5nX2NvdW50W2ldOwomIzQzOwomIzQzOwkJZm9yIChqID0gMDsgaiAmbHQ7IG51bTsgaiYjNDM7JiM0MzspIHsKJiM0MzsJCQlzdHJ1Y3QgYm54dF90eF9yaW5nX2luZm8gKnR4ciA9ICZhbXA7bXBjLSZndDttcGNfcmluZ3NbaV1bal07CiYjNDM7CiYjNDM7CQkJLyogT25seSAxIHJpbmcgd2l0aCBpbmRleCBqIHdpbGwgdXNlIHRoaXMgTkFQSSAqLwomIzQzOwkJCWlmICh0eHItJmd0O2JuYXBpID09IGJuYXBpKSB7CiYjNDM7CQkJCXR4ci0mZ3Q7dHhfY3ByID0gY3ByOwomIzQzOwkJCQl0eHItJmd0O3R4X25hcGlfaWR4ID0gaTsKJiM0MzsJCQkJYm5hcGktJmd0O3R4X21wY19yaW5nW2ldID0gdHhyOwomIzQzOwkJCQlmb3VuZCA9IHRydWU7CiYjNDM7CQkJCWJyZWFrOwomIzQzOwkJCX0KJiM0MzsJCX0KJiM0MzsJfQomIzQzOwlpZiAoIWZvdW5kKQomIzQzOwkJbmV0ZGV2X3dhcm5fb25jZShicC0mZ3Q7ZGV2LCAmIzM0O05vIE1QQyBtYXRjaCBmb3IgbmFwaSBpbmRleCAlZFxuJiMzNDssCiYjNDM7CQkJCSBibmFwaV9pZHgpOwomIzQzOwljcHItJmd0O2NwX3JpbmdfdHlwZSA9IEJOWFRfTlFfSERMX1RZUEVfTVA7CiYjNDM7fQomIzQzOwomIzQzO3ZvaWQgYm54dF90cmltX21wY19yaW5ncyhzdHJ1Y3QgYm54dCAqYnApCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYm54dF9tcGNfaW5mbyAqbXBjID0gYnAtJmd0O21wY19pbmZvOwomIzQzOwlpbnQgbWF4ID0gYnAtJmd0O3R4X25yX3JpbmdzX3Blcl90YzsKJiM0MzsJdTggbWF4X2NwID0gMDsKJiM0MzsJaW50IGk7CiYjNDM7CiYjNDM7CWlmICghbXBjKQomIzQzOwkJcmV0dXJuOwomIzQzOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgQk5YVF9NUENfVFlQRV9NQVg7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQltcGMtJmd0O21wY19yaW5nX2NvdW50W2ldID0gbWluX3QoaW50LCBtcGMtJmd0O21wY19yaW5nX2NvdW50W2ldLAomIzQzOwkJCQkJICAgICAgIG1heCk7CiYjNDM7CQltYXhfY3AgPSBtYXgobWF4X2NwLCBtcGMtJmd0O21wY19yaW5nX2NvdW50W2ldKTsKJiM0MzsJfQomIzQzOwltcGMtJmd0O21wY19jcF9yaW5ncyA9IG1heF9jcDsKJiM0Mzt9CiYjNDM7CiYjNDM7dm9pZCBibnh0X2NhbGNfZGZsdF9tcGNfcmluZ3Moc3RydWN0IGJueHQgKmJwLCBpbnQgdHhfbnJfcmluZ3MsCiYjNDM7CQkJICAgICAgaW50IHR4X25yX3JpbmdzX3Blcl90YywgaW50IHJ4X25yX3JpbmdzLAomIzQzOwkJCSAgICAgIGludCAqbXBjX3Blcl90eXBlLCBpbnQgKm1wY19jcCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBibnh0X2h3X3Jlc2MgKmh3X3Jlc2MgPSAmYW1wO2JwLSZndDtod19yZXNjOwomIzQzOwlpbnQgbXBjX3RjZSwgYXZhaWw7CiYjNDM7CiYjNDM7CSptcGNfcGVyX3R5cGUgPSAwOwomIzQzOwkqbXBjX2NwID0gMDsKJiM0MzsKJiM0MzsJaWYgKCFCTlhUX01QQ19DUllQVE9fQ0FQQUJMRShicCkpCiYjNDM7CQlyZXR1cm47CiYjNDM7CiYjNDM7CWF2YWlsID0gaHdfcmVzYy0mZ3Q7bWF4X3R4X3JpbmdzIC0gdHhfbnJfcmluZ3M7CiYjNDM7CS8qIGRvbiYjMzk7dCB1c2UgbW9yZSB0aGFuIDgwJSAqLwomIzQzOwlhdmFpbCA9IGF2YWlsICogNCAvIDU7CiYjNDM7CiYjNDM7CWlmIChhdmFpbCAmbHQ7IChCTlhUX01JTl9NUENfVENFICYjNDM7IEJOWFRfTUlOX01QQ19SQ0UpKQomIzQzOwkJcmV0dXJuOwomIzQzOwomIzQzOwltcGNfdGNlID0gbWluX3QoaW50LCBhdmFpbCAvIDIsIHR4X25yX3JpbmdzX3Blcl90Yyk7CiYjNDM7CW1wY190Y2UgPSBtaW5fdChpbnQsIG1wY190Y2UsIEJOWFRfREZMVF9NUENfVENFKTsKJiM0MzsKJiM0MzsJYXZhaWwgPSBod19yZXNjLSZndDttYXhfY3BfcmluZ3MgLSB0eF9ucl9yaW5ncyAtIHJ4X25yX3JpbmdzOwomIzQzOwomIzQzOwlpZiAoYXZhaWwgJmx0OyBCTlhUX01JTl9NUENfVENFIHx8IGF2YWlsICZsdDsgQk5YVF9NSU5fTVBDX1JDRSkKJiM0MzsJCXJldHVybjsKJiM0MzsKJiM0MzsJbXBjX3RjZSA9IG1pbihtcGNfdGNlLCBhdmFpbCk7CiYjNDM7CiYjNDM7CS8qIFRDRSBhbmQgUkNFIGFyZSBzaXplZCBlcXVhbGx5LCBzbyB0aGUgcGVyLXR5cGUgY291bnQgaXMgYWxzbyB0aGUKJiM0MzsJICogTVBDIENQIHJpbmcgY291bnQgKG1heChtcGNfdGNlLCBtcGNfcmNlKSkuCiYjNDM7CSAqLwomIzQzOwkqbXBjX3Blcl90eXBlID0gbXBjX3RjZTsKJiM0MzsJKm1wY19jcCA9IG1wY190Y2U7CiYjNDM7fQomIzQzOwomIzQzO3ZvaWQgYm54dF9zZXRfZGZsdF9tcGNfcmluZ3Moc3RydWN0IGJueHQgKmJwKQomIzQzO3sKJiM0MzsJc3RydWN0IGJueHRfbXBjX2luZm8gKm1wYyA9IGJwLSZndDttcGNfaW5mbzsKJiM0MzsJaW50IHBlcl90eXBlLCBtcGNfY3AsIGk7CiYjNDM7CiYjNDM7CWlmICghQk5YVF9NUENfQ1JZUFRPX0NBUEFCTEUoYnApKQomIzQzOwkJcmV0dXJuOwomIzQzOwomIzQzOwlibnh0X2NhbGNfZGZsdF9tcGNfcmluZ3MoYnAsIGJwLSZndDt0eF9ucl9yaW5ncywgYnAtJmd0O3R4X25yX3JpbmdzX3Blcl90YywKJiM0MzsJCQkJIGJwLSZndDtyeF9ucl9yaW5ncywgJmFtcDtwZXJfdHlwZSwgJmFtcDttcGNfY3ApOwomIzQzOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgQk5YVF9NUENfVFlQRV9NQVg7IGkmIzQzOyYjNDM7KQomIzQzOwkJbXBjLSZndDttcGNfcmluZ19jb3VudFtpXSA9IHBlcl90eXBlOwomIzQzOwltcGMtJmd0O21wY19jcF9yaW5ncyA9IG1wY19jcDsKJiM0Mzt9CiYjNDM7CiYjNDM7dm9pZCBibnh0X2luaXRfbXBjX3Jpbmdfc3RydWN0KHN0cnVjdCBibnh0ICpicCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBibnh0X21wY19pbmZvICptcGMgPSBicC0mZ3Q7bXBjX2luZm87CiYjNDM7CWludCBpLCBqOwomIzQzOwomIzQzOwlpZiAoIUJOWFRfTVBDX0NSWVBUT19DQVBBQkxFKGJwKSkKJiM0MzsJCXJldHVybjsKJiM0MzsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IEJOWFRfTVBDX1RZUEVfTUFYOyBpJiM0MzsmIzQzOykgewomIzQzOwkJaW50IG51bSA9IG1wYy0mZ3Q7bXBjX3JpbmdfY291bnRbaV07CiYjNDM7CiYjNDM7CQlpZiAoIW1wYy0mZ3Q7bXBjX3JpbmdzW2ldKQomIzQzOwkJCWNvbnRpbnVlOwomIzQzOwkJZm9yIChqID0gMDsgaiAmbHQ7IG51bTsgaiYjNDM7JiM0MzspIHsKJiM0MzsJCQlzdHJ1Y3QgYm54dF9yaW5nX21lbV9pbmZvICpybWVtOwomIzQzOwkJCXN0cnVjdCBibnh0X3Jpbmdfc3RydWN0ICpyaW5nOwomIzQzOwkJCXN0cnVjdCBibnh0X3R4X3JpbmdfaW5mbyAqdHhyOwomIzQzOwomIzQzOwkJCXR4ciA9ICZhbXA7bXBjLSZndDttcGNfcmluZ3NbaV1bal07CiYjNDM7CiYjNDM7CQkJdHhyLSZndDt0eF9yaW5nX3N0cnVjdC5yaW5nX21lbS5mbGFncyA9CiYjNDM7CQkJCUJOWFRfUk1FTV9SSU5HX1BURV9GTEFHOwomIzQzOwkJCXR4ci0mZ3Q7Ym5hcGkgPSBicC0mZ3Q7dHhfcmluZ1ticC0mZ3Q7dHhfcmluZ19tYXBbal1dLmJuYXBpOwomIzQzOwkJCXR4ci0mZ3Q7dHhxX2luZGV4ID0gajsKJiM0MzsKJiM0MzsJCQlyaW5nID0gJmFtcDt0eHItJmd0O3R4X3Jpbmdfc3RydWN0OwomIzQzOwkJCXJtZW0gPSAmYW1wO3JpbmctJmd0O3JpbmdfbWVtOwomIzQzOwkJCXJtZW0tJmd0O25yX3BhZ2VzID0gYnAtJmd0O3R4X25yX3BhZ2VzOwomIzQzOwkJCXJtZW0tJmd0O3BhZ2Vfc2l6ZSA9IEhXX1RYQkRfUklOR19TSVpFOwomIzQzOwkJCXJtZW0tJmd0O3BnX2FyciA9ICh2b2lkICoqKXR4ci0mZ3Q7dHhfZGVzY19yaW5nOwomIzQzOwkJCXJtZW0tJmd0O2RtYV9hcnIgPSB0eHItJmd0O3R4X2Rlc2NfbWFwcGluZzsKJiM0MzsJCQlybWVtLSZndDt2bWVtX3NpemUgPSBTV19NUENfVFhCRF9SSU5HX1NJWkUgKgomIzQzOwkJCQkJICBicC0mZ3Q7dHhfbnJfcGFnZXM7CiYjNDM7CQkJcm1lbS0mZ3Q7dm1lbSA9ICh2b2lkICoqKSZhbXA7dHhyLSZndDt0eF9tcGNfYnVmX3Jpbmc7CiYjNDM7CQl9CiYjNDM7CX0KJiM0Mzt9CiYjNDM7CiYjNDM7aW50IGJueHRfYWxsb2NfbXBjcyhzdHJ1Y3QgYm54dCAqYnApCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYm54dF9tcGNfaW5mbyAqbXBjID0gYnAtJmd0O21wY19pbmZvOwomIzQzOwlpbnQgaSwgcmMgPSAwOwomIzQzOwomIzQzOwlpZiAoIUJOWFRfTVBDX0NSWVBUT19DQVBBQkxFKGJwKSkKJiM0MzsJCXJldHVybiAwOwomIzQzOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgQk5YVF9NUENfVFlQRV9NQVg7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlpbnQgbnVtID0gbXBjLSZndDttcGNfcmluZ19jb3VudFtpXTsKJiM0MzsJCXN0cnVjdCBibnh0X3R4X3JpbmdfaW5mbyAqdHhyOwomIzQzOwomIzQzOwkJaWYgKCFudW0pCiYjNDM7CQkJY29udGludWU7CiYjNDM7CQl0eHIgPSBremFsbG9jX29ianMoKnR4ciwgbnVtKTsKJiM0MzsJCWlmICghdHhyKSB7CiYjNDM7CQkJcmMgPSAtRU5PTUVNOwomIzQzOwkJCWdvdG8gYWxsb2NfbXBjc19leGl0OwomIzQzOwkJfQomIzQzOwkJbXBjLSZndDttcGNfcmluZ3NbaV0gPSB0eHI7CiYjNDM7CX0KJiM0MzsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IGJwLSZndDtjcF9ucl9yaW5nczsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCXN0cnVjdCBibnh0X25hcGkgKmJuYXBpID0gYnAtJmd0O2JuYXBpW2ldOwomIzQzOwomIzQzOwkJaWYgKCFibnh0X25hcGlfaGFzX21wYyhicCwgaSkpCiYjNDM7CQkJY29udGludWU7CiYjNDM7CQlibmFwaS0mZ3Q7dHhfbXBjX3JpbmcgPSBremFsbG9jX29ianMoKmJuYXBpLSZndDt0eF9tcGNfcmluZywKJiM0MzsJCQkJCQkgIEJOWFRfTVBDX1RZUEVfTUFYKTsKJiM0MzsJCWlmICghYm5hcGktJmd0O3R4X21wY19yaW5nKSB7CiYjNDM7CQkJcmMgPSAtRU5PTUVNOwomIzQzOwkJCWdvdG8gYWxsb2NfbXBjc19leGl0OwomIzQzOwkJfQomIzQzOwl9CiYjNDM7YWxsb2NfbXBjc19leGl0OgomIzQzOwlpZiAocmMpCiYjNDM7CQlibnh0X2ZyZWVfbXBjcyhicCk7CiYjNDM7CXJldHVybiByYzsKJiM0Mzt9CiYjNDM7CiYjNDM7dm9pZCBibnh0X2ZyZWVfbXBjcyhzdHJ1Y3QgYm54dCAqYnApCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYm54dF9tcGNfaW5mbyAqbXBjID0gYnAtJmd0O21wY19pbmZvOwomIzQzOwlpbnQgaTsKJiM0MzsKJiM0MzsJaWYgKCFtcGMpCiYjNDM7CQlyZXR1cm47CiYjNDM7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBCTlhUX01QQ19UWVBFX01BWDsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCWtmcmVlKG1wYy0mZ3Q7bXBjX3JpbmdzW2ldKTsKJiM0MzsJCW1wYy0mZ3Q7bXBjX3JpbmdzW2ldID0gTlVMTDsKJiM0MzsJfQomIzQzOwlpZiAoIWJwLSZndDtibmFwaSkKJiM0MzsJCXJldHVybjsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IGJwLSZndDtjcF9ucl9yaW5nczsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCXN0cnVjdCBibnh0X25hcGkgKmJuYXBpID0gYnAtJmd0O2JuYXBpW2ldOwomIzQzOwomIzQzOwkJa2ZyZWUoYm5hcGktJmd0O3R4X21wY19yaW5nKTsKJiM0MzsJCWJuYXBpLSZndDt0eF9tcGNfcmluZyA9IE5VTEw7CiYjNDM7CX0KJiM0Mzt9CiYjNDM7CiYjNDM7aW50IGJueHRfYWxsb2NfbXBjX3JpbmdzKHN0cnVjdCBibnh0ICpicCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBibnh0X21wY19pbmZvICptcGMgPSBicC0mZ3Q7bXBjX2luZm87CiYjNDM7CWludCBpLCBqLCByYyA9IDA7CiYjNDM7CiYjNDM7CWlmICghbXBjKQomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBCTlhUX01QQ19UWVBFX01BWDsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCWludCBudW0gPSBtcGMtJmd0O21wY19yaW5nX2NvdW50W2ldOwomIzQzOwomIzQzOwkJZm9yIChqID0gMDsgaiAmbHQ7IG51bTsgaiYjNDM7JiM0MzspIHsKJiM0MzsJCQlzdHJ1Y3QgYm54dF90eF9yaW5nX2luZm8gKnR4ciA9ICZhbXA7bXBjLSZndDttcGNfcmluZ3NbaV1bal07CiYjNDM7CQkJc3RydWN0IGJueHRfcmluZ19zdHJ1Y3QgKnJpbmc7CiYjNDM7CiYjNDM7CQkJcmluZyA9ICZhbXA7dHhyLSZndDt0eF9yaW5nX3N0cnVjdDsKJiM0MzsJCQlyYyA9IGJueHRfYWxsb2NfcmluZyhicCwgJmFtcDtyaW5nLSZndDtyaW5nX21lbSk7CiYjNDM7CQkJaWYgKHJjKQomIzQzOwkJCQlnb3RvIGFsbG9jX21wY19yaW5nc19leGl0OwomIzQzOwkJCXJpbmctJmd0O3F1ZXVlX2lkID0gQk5YVF9NUENfUVVFVUVfSUQ7CiYjNDM7CQkJcmluZy0mZ3Q7bXBjX2NobmxfdHlwZSA9IGk7CiYjNDM7CQkJLyogZm9yIHN0YXRzIGNvbnRleHQgKi8KJiM0MzsJCQlyaW5nLSZndDtncnBfaWR4ID0gdHhyLSZndDtibmFwaS0mZ3Q7aW5kZXg7CiYjNDM7CQkJc3Bpbl9sb2NrX2luaXQoJmFtcDt0eHItJmd0O3R4X2xvY2spOwomIzQzOwkJfQomIzQzOwl9CiYjNDM7YWxsb2NfbXBjX3JpbmdzX2V4aXQ6CiYjNDM7CWlmIChyYykKJiM0MzsJCWJueHRfZnJlZV9tcGNfcmluZ3MoYnApOwomIzQzOwlyZXR1cm4gcmM7CiYjNDM7fQomIzQzOwomIzQzO3ZvaWQgYm54dF9mcmVlX21wY19yaW5ncyhzdHJ1Y3QgYm54dCAqYnApCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYm54dF9tcGNfaW5mbyAqbXBjID0gYnAtJmd0O21wY19pbmZvOwomIzQzOwlpbnQgaSwgajsKJiM0MzsKJiM0MzsJaWYgKCFtcGMpCiYjNDM7CQlyZXR1cm47CiYjNDM7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBCTlhUX01QQ19UWVBFX01BWDsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCWludCBudW0gPSBtcGMtJmd0O21wY19yaW5nX2NvdW50W2ldOwomIzQzOwomIzQzOwkJaWYgKCFtcGMtJmd0O21wY19yaW5nc1tpXSkKJiM0MzsJCQljb250aW51ZTsKJiM0MzsJCWZvciAoaiA9IDA7IGogJmx0OyBudW07IGomIzQzOyYjNDM7KSB7CiYjNDM7CQkJc3RydWN0IGJueHRfdHhfcmluZ19pbmZvICp0eHIgPSAmYW1wO21wYy0mZ3Q7bXBjX3JpbmdzW2ldW2pdOwomIzQzOwkJCXN0cnVjdCBibnh0X3Jpbmdfc3RydWN0ICpyaW5nID0gJmFtcDt0eHItJmd0O3R4X3Jpbmdfc3RydWN0OwomIzQzOwomIzQzOwkJCWJueHRfZnJlZV9yaW5nKGJwLCAmYW1wO3JpbmctJmd0O3JpbmdfbWVtKTsKJiM0MzsJCX0KJiM0MzsJfQomIzQzO30KJiM0MzsKJiM0Mzt2b2lkIGJueHRfaW5pdF9tcGNfcmluZ3Moc3RydWN0IGJueHQgKmJwKQomIzQzO3sKJiM0MzsJc3RydWN0IGJueHRfbXBjX2luZm8gKm1wYyA9IGJwLSZndDttcGNfaW5mbzsKJiM0MzsJaW50IGksIGo7CiYjNDM7CiYjNDM7CWlmICghbXBjKQomIzQzOwkJcmV0dXJuOwomIzQzOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgQk5YVF9NUENfVFlQRV9NQVg7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlpbnQgbnVtID0gbXBjLSZndDttcGNfcmluZ19jb3VudFtpXTsKJiM0MzsKJiM0MzsJCWZvciAoaiA9IDA7IGogJmx0OyBudW07IGomIzQzOyYjNDM7KSB7CiYjNDM7CQkJc3RydWN0IGJueHRfdHhfcmluZ19pbmZvICp0eHIgPSAmYW1wO21wYy0mZ3Q7bXBjX3JpbmdzW2ldW2pdOwomIzQzOwkJCXN0cnVjdCBibnh0X3Jpbmdfc3RydWN0ICpyaW5nID0gJmFtcDt0eHItJmd0O3R4X3Jpbmdfc3RydWN0OwomIzQzOwomIzQzOwkJCXR4ci0mZ3Q7dHhfcHJvZCA9IDA7CiYjNDM7CQkJdHhyLSZndDt0eF9jb25zID0gMDsKJiM0MzsJCQl0eHItJmd0O3R4X2h3X2NvbnMgPSAwOwomIzQzOwkJCVdSSVRFX09OQ0UodHhyLSZndDtkZXZfc3RhdGUsIDApOwomIzQzOwkJCXJpbmctJmd0O2Z3X3JpbmdfaWQgPSBJTlZBTElEX0hXX1JJTkdfSUQ7CiYjNDM7CQl9CiYjNDM7CX0KJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBibnh0X2h3cm1fb25lX21wY19yaW5nX2FsbG9jKHN0cnVjdCBibnh0ICpicCwKJiM0MzsJCQkJCXN0cnVjdCBibnh0X3R4X3JpbmdfaW5mbyAqdHhyKQomIzQzO3sKJiM0MzsJc3RydWN0IGJueHRfY3BfcmluZ19pbmZvICpjcHIgPSB0eHItJmd0O3R4X2NwcjsKJiM0MzsJc3RydWN0IGJueHRfcmluZ19zdHJ1Y3QgKnJpbmc7CiYjNDM7CWludCByYzsKJiM0MzsKJiM0MzsJcmluZyA9ICZhbXA7Y3ByLSZndDtjcF9yaW5nX3N0cnVjdDsKJiM0MzsJaWYgKHJpbmctJmd0O2Z3X3JpbmdfaWQgPT0gSU5WQUxJRF9IV19SSU5HX0lEKSB7CiYjNDM7CQlyYyA9IGJueHRfaHdybV9jcF9yaW5nX2FsbG9jX3A1KGJwLCBjcHIpOwomIzQzOwkJaWYgKHJjKQomIzQzOwkJCXJldHVybiByYzsKJiM0MzsJfQomIzQzOwkvKiB0eF9pZHggbm90IHVzZWQgb24gUDVfUExVUywgc28gc2V0IGl0IHRvIDAgKi8KJiM0MzsJcmV0dXJuIGJueHRfaHdybV90eF9yaW5nX2FsbG9jKGJwLCB0eHIsIDApOwomIzQzO30KJiM0MzsKJiM0MztpbnQgYm54dF9od3JtX21wY19yaW5nX2FsbG9jKHN0cnVjdCBibnh0ICpicCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBibnh0X21wY19pbmZvICptcGMgPSBicC0mZ3Q7bXBjX2luZm87CiYjNDM7CWludCBpLCBqLCByYyA9IDA7CiYjNDM7CiYjNDM7CWlmICghbXBjKQomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBCTlhUX01QQ19UWVBFX01BWDsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCWludCBudW0gPSBtcGMtJmd0O21wY19yaW5nX2NvdW50W2ldOwomIzQzOwomIzQzOwkJZm9yIChqID0gMDsgaiAmbHQ7IG51bTsgaiYjNDM7JiM0MzspIHsKJiM0MzsJCQlzdHJ1Y3QgYm54dF90eF9yaW5nX2luZm8gKnR4ciA9ICZhbXA7bXBjLSZndDttcGNfcmluZ3NbaV1bal07CiYjNDM7CiYjNDM7CQkJcmMgPSBibnh0X2h3cm1fb25lX21wY19yaW5nX2FsbG9jKGJwLCB0eHIpOwomIzQzOwkJCWlmIChyYykKJiM0MzsJCQkJZ290byBtcGNfcmluZ19hbGxvY19leGl0OwomIzQzOwkJfQomIzQzOwl9CiYjNDM7bXBjX3JpbmdfYWxsb2NfZXhpdDoKJiM0MzsJaWYgKHJjKQomIzQzOwkJYm54dF9od3JtX21wY19yaW5nX2ZyZWUoYnAsIGZhbHNlKTsKJiM0MzsJcmV0dXJuIHJjOwomIzQzO30KJiM0MzsKJiM0Mzt2b2lkIGJueHRfaHdybV9tcGNfcmluZ19mcmVlKHN0cnVjdCBibnh0ICpicCwgYm9vbCBjbG9zZV9wYXRoKQomIzQzO3sKJiM0MzsJc3RydWN0IGJueHRfbXBjX2luZm8gKm1wYyA9IGJwLSZndDttcGNfaW5mbzsKJiM0MzsJc3RydWN0IGJueHRfY3BfcmluZ19pbmZvICpjcHI7CiYjNDM7CWludCBpLCBqOwomIzQzOwomIzQzOwlpZiAoIW1wYykKJiM0MzsJCXJldHVybjsKJiM0MzsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IEJOWFRfTVBDX1RZUEVfTUFYOyBpJiM0MzsmIzQzOykgewomIzQzOwkJZm9yIChqID0gMDsgaiAmbHQ7IG1wYy0mZ3Q7bXBjX3JpbmdfY291bnRbaV07IGomIzQzOyYjNDM7KQomIzQzOwkJCWJueHRfaHdybV90eF9yaW5nX2ZyZWUoYnAsICZhbXA7bXBjLSZndDttcGNfcmluZ3NbaV1bal0sCiYjNDM7CQkJCQkgICAgICAgY2xvc2VfcGF0aCk7CiYjNDM7CX0KJiM0MzsJLyogQ1AgcmluZ3MgbXVzdCBiZSBmcmVlZCBhdCB0aGUgZW5kIHRvIGd1YXJhbnRlZSB0aGF0IHRoZSBIV1JNX0RPTkUKJiM0MzsJICogcmVzcG9uc2VzIGZvciBIV1JNX1JJTkdfRlJFRSBjYW4gc3RpbGwgYmUgc2VlbiBvbiB0aGUgQ1AgcmluZ3MuCiYjNDM7CSAqLwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgQk5YVF9NUENfVFlQRV9NQVg7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlmb3IgKGogPSAwOyBqICZsdDsgbXBjLSZndDttcGNfcmluZ19jb3VudFtpXTsgaiYjNDM7JiM0MzspIHsKJiM0MzsJCQljcHIgPSBtcGMtJmd0O21wY19yaW5nc1tpXVtqXS50eF9jcHI7CiYjNDM7CQkJaWYgKGNwciAmYW1wOyZhbXA7IGNwci0mZ3Q7Y3BfcmluZ19zdHJ1Y3QuZndfcmluZ19pZCAhPQomIzQzOwkJCSAgICBJTlZBTElEX0hXX1JJTkdfSUQpCiYjNDM7CQkJCWJueHRfaHdybV9jcF9yaW5nX2ZyZWUoYnAsIGNwcik7CiYjNDM7CQl9CiYjNDM7CX0KJiM0Mzt9CiYjNDM7CiYjNDM7c3RydWN0IGJueHRfdHhfcmluZ19pbmZvICpibnh0X3NlbGVjdF9tcGNfcmluZyhzdHJ1Y3QgYm54dCAqYnAsIGludCByaW5nX3R5cGUpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYm54dF9tcGNfaW5mbyAqbXBjID0gYnAtJmd0O21wY19pbmZvOwomIzQzOwlpbnQgbjsKJiM0MzsKJiM0MzsJaWYgKCFtcGMgfHwgcmluZ190eXBlICZndDs9IEJOWFRfTVBDX1RZUEVfTUFYIHx8CiYjNDM7CSAgICAhbXBjLSZndDttcGNfcmluZ19jb3VudFtyaW5nX3R5cGVdKQomIzQzOwkJcmV0dXJuIE5VTEw7CiYjNDM7CiYjNDM7CW4gPSByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpICUgbXBjLSZndDttcGNfcmluZ19jb3VudFtyaW5nX3R5cGVdOwomIzQzOwlyZXR1cm4gJmFtcDttcGMtJmd0O21wY19yaW5nc1tyaW5nX3R5cGVdW25dOwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBibnh0X3N0YXJ0X3htaXRfbXBjIC0gVHJhbnNtaXQgbWVzc2FnZSBvbiBhbiBNUEMgcmluZwomIzQzOyAqIEBicDogcG9pbnRlciB0byBibnh0IGRldmljZQomIzQzOyAqIEB0eHI6IE1QQyBUWCByaW5nIHN0cnVjdHVyZSBwb2ludGVyCiYjNDM7ICogQGRhdGE6IE1QQyBtZXNzYWdlIHBvaW50ZXIKJiM0MzsgKiBAbGVuOiBNUEMgbWVzc2FnZSBsZW5ndGgKJiM0MzsgKiBAaGFuZGxlOiBOb24temVybyBoYW5kbGUgcGFzc2VkIGJhY2sgZm9yIHRoZSBjb21wbGV0aW9uCiYjNDM7ICoKJiM0MzsgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byB0cmFuc21pdCBhbiBNUEMgbWVzc2FnZSBvbiBhbiBNUEMgVFggcmluZy4KJiM0MzsgKiBUaGUgY2FsbGVyIG11c3QgaG9sZCB0eHItJmd0O3R4X2xvY2suICBXaGVuIHN1Y2Nlc3NmdWwsIHRoZSBIVyB3aWxsIHJldHVybgomIzQzOyAqIGEgY29tcGxldGlvbiBhbmQgYm54dF9jcnlwdG9fbXBjX2NtcCgpIHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIGhhbmRsZQomIzQzOyAqIHBhc3NlZCBiYWNrLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiB6ZXJvIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIGVycm9yIGNvZGUgb3RoZXJ3aXNlOgomIzQzOyAqCUVOT0RFVjogTVBDIFRYIHJpbmcgaXMgc2h1dHRpbmcgZG93bi4KJiM0MzsgKglFQlVTWTogTVBDIFRYIHJpbmcgaXMgZnVsbAomIzQzOyAqLwomIzQzO2ludCBibnh0X3N0YXJ0X3htaXRfbXBjKHN0cnVjdCBibnh0ICpicCwgc3RydWN0IGJueHRfdHhfcmluZ19pbmZvICp0eHIsCiYjNDM7CQkJdm9pZCAqZGF0YSwgdW5zaWduZWQgaW50IGxlbiwgdW5zaWduZWQgbG9uZyBoYW5kbGUpCiYjNDM7ewomIzQzOwl1MzIgYmRzLCB0b3RhbF9iZHMsIGJkX3NwYWNlLCBmcmVlX3NpemU7CiYjNDM7CXN0cnVjdCBibnh0X3N3X21wY190eF9iZCAqdHhfYnVmOwomIzQzOwlzdHJ1Y3QgdHhfYmQgKnR4YmQ7CiYjNDM7CXUxNiBwcm9kOwomIzQzOwomIzQzOwlpZiAoUkVBRF9PTkNFKHR4ci0mZ3Q7ZGV2X3N0YXRlKSA9PSBCTlhUX0RFVl9TVEFURV9DTE9TSU5HKQomIzQzOwkJcmV0dXJuIC1FTk9ERVY7CiYjNDM7CiYjNDM7CWJkcyA9IERJVl9ST1VORF9VUChsZW4sIHNpemVvZigqdHhiZCkpOwomIzQzOwl0b3RhbF9iZHMgPSBiZHMgJiM0MzsgMTsKJiM0MzsJZnJlZV9zaXplID0gYm54dF90eF9hdmFpbChicCwgdHhyKTsKJiM0MzsJaWYgKGZyZWVfc2l6ZSAmbHQ7IHRvdGFsX2JkcykKJiM0MzsJCXJldHVybiAtRUJVU1k7CiYjNDM7CiYjNDM7CXByb2QgPSB0eHItJmd0O3R4X3Byb2Q7CiYjNDM7CXR4YmQgPSAmYW1wO3R4ci0mZ3Q7dHhfZGVzY19yaW5nW1RYX1JJTkcoYnAsIHByb2QpXVtUWF9JRFgocHJvZCldOwomIzQzOwl0eF9idWYgPSAmYW1wO3R4ci0mZ3Q7dHhfbXBjX2J1Zl9yaW5nW1JJTkdfVFgoYnAsIHByb2QpXTsKJiM0MzsJdHhfYnVmLSZndDtoYW5kbGUgPSBoYW5kbGU7CiYjNDM7CXR4X2J1Zi0mZ3Q7aW5saW5lX2JkcyA9IHRvdGFsX2JkczsKJiM0MzsKJiM0MzsJdHhiZC0mZ3Q7dHhfYmRfbGVuX2ZsYWdzX3R5cGUgPQomIzQzOwkJY3B1X3RvX2xlMzIoKGxlbiAmbHQ7Jmx0OyBUWF9CRF9MRU5fU0hJRlQpIHwgVFhfQkRfVFlQRV9NUENfVFhfQkQgfAomIzQzOwkJCSAgICBUWF9CRF9DTlQodG90YWxfYmRzKSk7CiYjNDM7CXR4YmQtJmd0O3R4X2JkX29wYXF1ZSA9IFNFVF9UWF9PUEFRVUUoYnAsIHR4ciwgcHJvZCwgdG90YWxfYmRzKTsKJiM0MzsKJiM0MzsJcHJvZCA9IE5FWFRfVFgocHJvZCk7CiYjNDM7CXR4YmQgPSAmYW1wO3R4ci0mZ3Q7dHhfZGVzY19yaW5nW1RYX1JJTkcoYnAsIHByb2QpXVtUWF9JRFgocHJvZCldOwomIzQzOwliZF9zcGFjZSA9IFRYX0RFU0NfQ05UIC0gVFhfSURYKHByb2QpOwomIzQzOwlpZiAoYmRfc3BhY2UgJmx0OyBiZHMpIHsKJiM0MzsJCXVuc2lnbmVkIGludCBsZW4wID0gYmRfc3BhY2UgKiBzaXplb2YoKnR4YmQpOwomIzQzOwomIzQzOwkJbWVtY3B5KHR4YmQsIGRhdGEsIGxlbjApOwomIzQzOwkJcHJvZCAmIzQzOz0gYmRfc3BhY2U7CiYjNDM7CQl0eGJkID0gJmFtcDt0eHItJmd0O3R4X2Rlc2NfcmluZ1tUWF9SSU5HKGJwLCBwcm9kKV1bVFhfSURYKHByb2QpXTsKJiM0MzsJCWJkcyAtPSBiZF9zcGFjZTsKJiM0MzsJCWxlbiAtPSBsZW4wOwomIzQzOwkJZGF0YSAmIzQzOz0gbGVuMDsKJiM0MzsJfQomIzQzOwltZW1jcHkodHhiZCwgZGF0YSwgbGVuKTsKJiM0MzsJcHJvZCAmIzQzOz0gYmRzOwomIzQzOwlXUklURV9PTkNFKHR4ci0mZ3Q7dHhfcHJvZCwgcHJvZCk7CiYjNDM7CiYjNDM7CS8qIFN5bmMgQkQgZGF0YSBiZWZvcmUgdXBkYXRpbmcgZG9vcmJlbGwgKi8KJiM0MzsJd21iKCk7CiYjNDM7CWJueHRfZGJfd3JpdGUoYnAsICZhbXA7dHhyLSZndDt0eF9kYiwgcHJvZCk7CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MzsvKiBSZXR1cm5zIHRydWUgaWYgdGhlIHJpbmcgaXMgc3VjY2Vzc2Z1bGx5IG1hcmtlZCBhcyBjbG9zaW5nLiAgSXQKJiM0MzsgKiBtZWFucyB0aGF0IHRoZXJlIHdpbGwgYmUgbm8gbW9yZSBNUEMgdHJhbnNtaXNzaW9ucyBhbmQgTkFQSSB3aWxsIG5vdwomIzQzOyAqIGNvbXBsZXRlIGFueSBNUEMgY29tcGxldGlvbnMgb24gdGhlIGNvbXBsZXRpb24gcmluZyB3aXRoIE5VTEwgaGFuZGxlcwomIzQzOyAqIHRvIHNpZ25hbCBhYm9ydC4KJiM0MzsgKi8KJiM0MztzdGF0aWMgYm9vbCBibnh0X2Rpc2FibGVfbXBjX3Jpbmcoc3RydWN0IGJueHRfbXBjX2luZm8gKm1wYywgaW50IG1wY19yaW5nKQomIzQzO3sKJiM0MzsJc3RydWN0IGJueHRfdHhfcmluZ19pbmZvICp0eHI7CiYjNDM7CWJvb2wgZGlzYWJsZWQgPSBmYWxzZTsKJiM0MzsJaW50IGk7CiYjNDM7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBCTlhUX01QQ19UWVBFX01BWDsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCWlmIChtcGNfcmluZyAmZ3Q7PSBtcGMtJmd0O21wY19yaW5nX2NvdW50W2ldKQomIzQzOwkJCWNvbnRpbnVlOwomIzQzOwkJdHhyID0gJmFtcDttcGMtJmd0O21wY19yaW5nc1tpXVttcGNfcmluZ107CiYjNDM7CQlzcGluX2xvY2tfYmgoJmFtcDt0eHItJmd0O3R4X2xvY2spOwomIzQzOwkJaWYgKCFSRUFEX09OQ0UodHhyLSZndDtkZXZfc3RhdGUpKSB7CiYjNDM7CQkJZGlzYWJsZWQgPSB0cnVlOwomIzQzOwkJCVdSSVRFX09OQ0UodHhyLSZndDtkZXZfc3RhdGUsIEJOWFRfREVWX1NUQVRFX0NMT1NJTkcpOwomIzQzOwkJfQomIzQzOwkJc3Bpbl91bmxvY2tfYmgoJmFtcDt0eHItJmd0O3R4X2xvY2spOwomIzQzOwkJaWYgKCFkaXNhYmxlZCkKJiM0MzsJCQlicmVhazsKJiM0MzsJfQomIzQzOwkvKiBNYWtlIHN1cmUgbmFwaSBwb2xscyBzZWUgQGRldl9zdGF0ZSBjaGFuZ2UgKi8KJiM0MzsJaWYgKGRpc2FibGVkKQomIzQzOwkJc3luY2hyb25pemVfbmV0KCk7CiYjNDM7CXJldHVybiBkaXNhYmxlZDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgYm54dF9lbmFibGVfbXBjX3Jpbmcoc3RydWN0IGJueHRfbXBjX2luZm8gKm1wYywgaW50IG1wY19yaW5nKQomIzQzO3sKJiM0MzsJc3RydWN0IGJueHRfdHhfcmluZ19pbmZvICp0eHI7CiYjNDM7CWludCBpOwomIzQzOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgQk5YVF9NUENfVFlQRV9NQVg7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlpZiAobXBjX3JpbmcgJmd0Oz0gbXBjLSZndDttcGNfcmluZ19jb3VudFtpXSkKJiM0MzsJCQljb250aW51ZTsKJiM0MzsJCXR4ciA9ICZhbXA7bXBjLSZndDttcGNfcmluZ3NbaV1bbXBjX3JpbmddOwomIzQzOwkJV1JJVEVfT05DRSh0eHItJmd0O2Rldl9zdGF0ZSwgMCk7CiYjNDM7CX0KJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgYm54dF9jbGVhcl9vbmVfbXBjX2VudHJpZXMoc3RydWN0IGJueHQgKmJwLAomIzQzOwkJCQkgICAgICAgc3RydWN0IGJueHRfdHhfcmluZ19pbmZvICp0eHIpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYm54dF9zd19tcGNfdHhfYmQgKnR4X2J1ZjsKJiM0MzsJdW5zaWduZWQgbG9uZyBoYW5kbGU7CiYjNDM7CWludCBpLCBtYXhfaWR4OwomIzQzOwl1MzIgY2xpZW50OwomIzQzOwomIzQzOwltYXhfaWR4ID0gYnAtJmd0O3R4X25yX3BhZ2VzICogVFhfREVTQ19DTlQ7CiYjNDM7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBtYXhfaWR4OyBpJiM0MzsmIzQzOykgewomIzQzOwkJdHhfYnVmID0gJmFtcDt0eHItJmd0O3R4X21wY19idWZfcmluZ1tpXTsKJiM0MzsJCWhhbmRsZSA9IHR4X2J1Zi0mZ3Q7aGFuZGxlOwomIzQzOwkJaWYgKGhhbmRsZSkgewomIzQzOwkJCWNsaWVudCA9IHR4ci0mZ3Q7dHhfcmluZ19zdHJ1Y3QubXBjX2NobmxfdHlwZTsKJiM0MzsJCQlibnh0X2NyeXB0b19tcGNfY21wKGJwLCBjbGllbnQsIGhhbmRsZSwgTlVMTCwgMCk7CiYjNDM7CQkJdHhfYnVmLSZndDtoYW5kbGUgPSAwOwomIzQzOwkJfQomIzQzOwl9CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIGJueHRfbXBjX3Jpbmdfc3RvcChzdHJ1Y3QgYm54dCAqYnAsIHN0cnVjdCBibnh0X21wY19pbmZvICptcGMsCiYjNDM7CQkJICAgICAgIGludCBtcGNfcmluZykKJiM0Mzt7CiYjNDM7CXN0cnVjdCBibnh0X3R4X3JpbmdfaW5mbyAqdHhyOwomIzQzOwlzdHJ1Y3QgYm54dF9jcF9yaW5nX2luZm8gKmNwcjsKJiM0MzsJaW50IGk7CiYjNDM7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBCTlhUX01QQ19UWVBFX01BWDsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCWlmIChtcGMtJmd0O21wY19yaW5nX2NvdW50W2ldICZndDsgbXBjX3JpbmcpIHsKJiM0MzsJCQl0eHIgPSAmYW1wO21wYy0mZ3Q7bXBjX3JpbmdzW2ldW21wY19yaW5nXTsKJiM0MzsJCQlibnh0X2h3cm1fdHhfcmluZ19mcmVlKGJwLCB0eHIsIHRydWUpOwomIzQzOwkJfQomIzQzOwl9CiYjNDM7CS8qIENQIHJpbmcgbXVzdCBiZSBmcmVlZCBhdCB0aGUgZW5kIHRvIGd1YXJhbnRlZSB0aGF0IHRoZSBIV1JNX0RPTkUKJiM0MzsJICogcmVzcG9uc2VzIGZvciBIV1JNX1JJTkdfRlJFRSBjYW4gc3RpbGwgYmUgc2VlbiBvbiB0aGUgQ1AgcmluZy4KJiM0MzsJICovCiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBCTlhUX01QQ19UWVBFX01BWDsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCWlmIChtcGMtJmd0O21wY19yaW5nX2NvdW50W2ldICZndDsgbXBjX3JpbmcpIHsKJiM0MzsJCQl0eHIgPSAmYW1wO21wYy0mZ3Q7bXBjX3JpbmdzW2ldW21wY19yaW5nXTsKJiM0MzsJCQljcHIgPSB0eHItJmd0O3R4X2NwcjsKJiM0MzsJCQlpZiAoY3ByKQomIzQzOwkJCQlibnh0X2h3cm1fY3BfcmluZ19mcmVlKGJwLCBjcHIpOwomIzQzOwkJfQomIzQzOwl9CiYjNDM7CS8qIE5vIG5ldyBETUEgdG8gdGhlIENQIHJpbmcgYXQgdGhpcyBwb2ludCwgYnV0IHdlIG5lZWQgdG8gd2FpdAomIzQzOwkgKiBmb3IgYW55IGluLWZsaWdodCBOQVBJIHBvbGwgdG8gZmluaXNoIGJlZm9yZSB3ZSB6ZXJvIHRoZQomIzQzOwkgKiBjb21wbGV0aW9uIGVudHJpZXMgaW4gdGhlIENQIHJpbmcuCiYjNDM7CSAqLwomIzQzOwlzeW5jaHJvbml6ZV9uZXQoKTsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IEJOWFRfTVBDX1RZUEVfTUFYOyBpJiM0MzsmIzQzOykgewomIzQzOwkJaWYgKG1wYy0mZ3Q7bXBjX3JpbmdfY291bnRbaV0gJmd0OyBtcGNfcmluZykgewomIzQzOwkJCXR4ciA9ICZhbXA7bXBjLSZndDttcGNfcmluZ3NbaV1bbXBjX3JpbmddOwomIzQzOwkJCWNwciA9IHR4ci0mZ3Q7dHhfY3ByOwomIzQzOwkJCWlmIChjcHIpCiYjNDM7CQkJCWJueHRfY2xlYXJfb25lX2NwX3JpbmcoYnAsIGNwcik7CiYjNDM7CQkJYm54dF9jbGVhcl9vbmVfbXBjX2VudHJpZXMoYnAsIHR4cik7CiYjNDM7CQl9CiYjNDM7CX0KJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBibnh0X21wY19yaW5nX3N0YXJ0KHN0cnVjdCBibnh0ICpicCwgc3RydWN0IGJueHRfbXBjX2luZm8gKm1wYywKJiM0MzsJCQkgICAgICAgaW50IG1wY19yaW5nKQomIzQzO3sKJiM0MzsJc3RydWN0IGJueHRfdHhfcmluZ19pbmZvICp0eHI7CiYjNDM7CWludCBpLCByYzsKJiM0MzsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IEJOWFRfTVBDX1RZUEVfTUFYOyBpJiM0MzsmIzQzOykgewomIzQzOwkJaWYgKG1wYy0mZ3Q7bXBjX3JpbmdfY291bnRbaV0gJmd0OyBtcGNfcmluZykgewomIzQzOwkJCXR4ciA9ICZhbXA7bXBjLSZndDttcGNfcmluZ3NbaV1bbXBjX3JpbmddOwomIzQzOwkJCXR4ci0mZ3Q7dHhfcHJvZCA9IDA7CiYjNDM7CQkJdHhyLSZndDt0eF9jb25zID0gMDsKJiM0MzsJCQl0eHItJmd0O3R4X2h3X2NvbnMgPSAwOwomIzQzOwkJCXJjID0gYm54dF9od3JtX29uZV9tcGNfcmluZ19hbGxvYyhicCwgdHhyKTsKJiM0MzsJCQlpZiAocmMpCiYjNDM7CQkJCXJldHVybiByYzsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogQ2FsbGVkIGZyb20gYm54dF9zcF90YXNrKCkgd2l0aCBuZXRkZXZfbG9jayBoZWxkLiAgSWYgdGhlIGRldmljZSBpcyBub3QKJiM0MzsgKiBvcGVuIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG86IHRoZSBvcGVuIHBhdGggd2lsbCByZS1hbGxvY2F0ZSBhbmQKJiM0MzsgKiByZS1pbml0aWFsaXplIGFsbCBNUEMgcmluZ3MuCiYjNDM7ICovCiYjNDM7dm9pZCBibnh0X21wY19yaW5nX3Jlc2V0X3Rhc2soc3RydWN0IGJueHQgKmJwKQomIzQzO3sKJiM0MzsJc3RydWN0IGJueHRfbXBjX2luZm8gKm1wYyA9IGJwLSZndDttcGNfaW5mbzsKJiM0MzsJc3RydWN0IGJueHRfdHhfcmluZ19pbmZvICp0eHI7CiYjNDM7CWludCBpLCBqOwomIzQzOwomIzQzOwlpZiAoIW1wYyB8fCAhdGVzdF9iaXQoQk5YVF9TVEFURV9PUEVOLCAmYW1wO2JwLSZndDtzdGF0ZSkpCiYjNDM7CQlyZXR1cm47CiYjNDM7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBCTlhUX01QQ19UWVBFX01BWDsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCWZvciAoaiA9IDA7IGogJmx0OyBtcGMtJmd0O21wY19yaW5nX2NvdW50W2ldOyBqJiM0MzsmIzQzOykgewomIzQzOwkJCXR4ciA9ICZhbXA7bXBjLSZndDttcGNfcmluZ3NbaV1bal07CiYjNDM7CQkJaWYgKFJFQURfT05DRSh0eHItJmd0O2Rldl9zdGF0ZSkgIT0gQk5YVF9ERVZfU1RBVEVfQ0xPU0lORykKJiM0MzsJCQkJY29udGludWU7CiYjNDM7CiYjNDM7CQkJLyogUmVzZXRzIHRoZSB3aG9sZSByaW5nIChib3RoIHR5cGVzKSAqLwomIzQzOwkJCW5ldGRldl93YXJuKGJwLSZndDtkZXYsICYjMzQ7UmVzZXR0aW5nIE1QQyByaW5nICVkXG4mIzM0Oywgaik7CiYjNDM7CQkJYm54dF9tcGNfcmluZ19zdG9wKGJwLCBtcGMsIGopOwomIzQzOwkJCWlmIChibnh0X21wY19yaW5nX3N0YXJ0KGJwLCBtcGMsIGopKSB7CiYjNDM7CQkJCW5ldGRldl9lcnIoYnAtJmd0O2RldiwgJiMzNDtFcnJvciBzdGFydGluZyBNUEMgcmluZyAlZCwgcmVzZXR0aW5nIGRldmljZVxuJiMzNDssCiYjNDM7CQkJCQkgICBqKTsKJiM0MzsJCQkJYm54dF9tcGNfcmluZ19zdG9wKGJwLCBtcGMsIGopOwomIzQzOwkJCQlibnh0X3Jlc2V0X3Rhc2soYnAsIHRydWUpOwomIzQzOwkJCQkvKiBibnh0X3Jlc2V0X3Rhc2soKSB3aWxsIGNsZWFyIGV2ZXJ5dGhpbmcgKi8KJiM0MzsJCQkJcmV0dXJuOwomIzQzOwkJCX0KJiM0MzsJCQlibnh0X2VuYWJsZV9tcGNfcmluZyhtcGMsIGopOwomIzQzOwkJfQomIzQzOwl9CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgYm54dF9tcGNfcmluZ19yZXNldChzdHJ1Y3QgYm54dCAqYnAsIGludCBtcGNfcmluZykKJiM0Mzt7CiYjNDM7CXN0cnVjdCBibnh0X21wY19pbmZvICptcGMgPSBicC0mZ3Q7bXBjX2luZm87CiYjNDM7CXN0cnVjdCBibnh0X3R4X3JpbmdfaW5mbyAqdHhyOwomIzQzOwlpbnQgaTsKJiM0MzsKJiM0MzsJaWYgKCFtcGMpCiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsJaWYgKG1wY19yaW5nICZndDs9IG1wYy0mZ3Q7bXBjX2NwX3JpbmdzKQomIzQzOwkJcmV0dXJuIC1FSU5WQUw7CiYjNDM7CiYjNDM7CWlmICghYm54dF9kaXNhYmxlX21wY19yaW5nKG1wYywgbXBjX3JpbmcpKQomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CiYjNDM7CS8qIENvbXBsZXRpb24gaGFuZGxlcyB3aWxsIG5vIGxvbmdlciBiZSBwcm9jZXNzZWQgYXQgdGhpcyBwb2ludAomIzQzOwkgKiBmcm9tIE5BUEksIHNvIHdlIGNhbiBjb21wbGV0ZSB0aGUgb3V0c3RhbmRpbmcgY29tbWFuZHMgYW5kCiYjNDM7CSAqIHJlbGVhc2UgdGhlIGNvbW1hbmQgY29udGV4dHMuCiYjNDM7CSAqLwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgQk5YVF9NUENfVFlQRV9NQVg7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlpZiAobXBjLSZndDttcGNfcmluZ19jb3VudFtpXSAmZ3Q7IG1wY19yaW5nKSB7CiYjNDM7CQkJdHhyID0gJmFtcDttcGMtJmd0O21wY19yaW5nc1tpXVttcGNfcmluZ107CiYjNDM7CQkJYm54dF9jbGVhcl9vbmVfbXBjX2VudHJpZXMoYnAsIHR4cik7CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyogSWYgdGhlIGRldmljZSBpcyBnb2luZyBkb3duLCB0aGUgcmVvcGVuIHdpbGwgcmUtYWxsb2NhdGUgYW5kCiYjNDM7CSAqIHJlLWluaXRpYWxpemUgYWxsIE1QQyByaW5ncy4gIE90aGVyd2lzZSBkZWZlciB0aGUgcmVzZXQgdG8KJiM0MzsJICogYm54dF9zcF90YXNrKCkgdG8gc2FmZWx5IGhvbGQgdGhlIG5ldGRldl9sb2NrLgomIzQzOwkgKi8KJiM0MzsJaWYgKHRlc3RfYml0KEJOWFRfU1RBVEVfT1BFTiwgJmFtcDticC0mZ3Q7c3RhdGUpKQomIzQzOwkJYm54dF9xdWV1ZV9zcF93b3JrKGJwLCBCTlhUX01QQ19SRVNFVF9TUF9FVkVOVCk7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztpbnQgYm54dF9tcGNfdGltZW91dChzdHJ1Y3QgYm54dCAqYnAsIHN0cnVjdCBibnh0X3R4X3JpbmdfaW5mbyAqdHhyKQomIzQzO3sKJiM0MzsJaWYgKHR4ci0mZ3Q7dHhfcmluZ19zdHJ1Y3QucXVldWVfaWQgPT0gQk5YVF9NUENfUVVFVUVfSUQpCiYjNDM7CQlyZXR1cm4gYm54dF9tcGNfcmluZ19yZXNldChicCwgdHhyLSZndDt0eHFfaW5kZXgpOwomIzQzOwlyZXR1cm4gLUVJTlZBTDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGJvb2wgYm54dF9tcGNfdW5zb2xpY2l0KHN0cnVjdCBtcGNfY21wICptcGNtcCkKJiM0Mzt7CiYjNDM7CXUzMiBjbGllbnQgPSBNUENfQ01QX0NMSUVOVF9UWVBFKG1wY21wKTsKJiM0MzsKJiM0MzsJaWYgKGNsaWVudCAhPSBNUENfQ01QX0NMSUVOVF9UQ0UgJmFtcDsmYW1wOyBjbGllbnQgIT0gTVBDX0NNUF9DTElFTlRfUkNFKQomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwlyZXR1cm4gTVBDX0NNUF9VTlNPTElDSVRfU1VCVFlQRShtcGNtcCk7CiYjNDM7fQomIzQzOwomIzQzO2ludCBibnh0X21wY19jbXAoc3RydWN0IGJueHQgKmJwLCBzdHJ1Y3QgYm54dF9jcF9yaW5nX2luZm8gKmNwciwgdTMyICpyYXdfY29ucykKJiM0Mzt7CiYjNDM7CXN0cnVjdCBibnh0X2NtcGxfZW50cnkgY21wbF9lbnRyeV9hcnJbMl07CiYjNDM7CXN0cnVjdCBibnh0X25hcGkgKmJuYXBpID0gY3ByLSZndDtibmFwaTsKJiM0MzsJdTE2IGNvbnMgPSBSSU5HX0NNUCgqcmF3X2NvbnMpOwomIzQzOwlzdHJ1Y3QgbXBjX2NtcCAqbXBjbXAsICptcGNtcDE7CiYjNDM7CXUzMiB0bXBfcmF3X2NvbnMgPSAqcmF3X2NvbnM7CiYjNDM7CXVuc2lnbmVkIGxvbmcgaGFuZGxlID0gMDsKJiM0MzsJdTMyIGNsaWVudCwgY21wbF9udW07CiYjNDM7CXU4IHR5cGU7CiYjNDM7CiYjNDM7CW1wY21wID0gKHN0cnVjdCBtcGNfY21wICopCiYjNDM7CQkmYW1wO2Nwci0mZ3Q7Y3BfZGVzY19yaW5nW0NQX1JJTkcoY29ucyldW0NQX0lEWChjb25zKV07CiYjNDM7CXR5cGUgPSBNUENfQ01QX0NNUF9UWVBFKG1wY21wKTsKJiM0MzsJY21wbF9lbnRyeV9hcnJbMF0uY21wbCA9IG1wY21wOwomIzQzOwljbXBsX2VudHJ5X2FyclswXS5sZW4gPSBzaXplb2YoKm1wY21wKTsKJiM0MzsJY21wbF9udW0gPSAxOwomIzQzOwlpZiAodHlwZSA9PSBNUENfQ01QX1RZUEVfTUlEX1BBVEhfTE9ORykgewomIzQzOwkJdG1wX3Jhd19jb25zID0gTkVYVF9SQVdfQ01QKHRtcF9yYXdfY29ucyk7CiYjNDM7CQljb25zID0gUklOR19DTVAodG1wX3Jhd19jb25zKTsKJiM0MzsJCW1wY21wMSA9IChzdHJ1Y3QgbXBjX2NtcCAqKQomIzQzOwkJCSAmYW1wO2Nwci0mZ3Q7Y3BfZGVzY19yaW5nW0NQX1JJTkcoY29ucyldW0NQX0lEWChjb25zKV07CiYjNDM7CiYjNDM7CQlpZiAoIU1QQ19DTVBfVkFMSUQoYnAsIG1wY21wMSwgdG1wX3Jhd19jb25zKSkKJiM0MzsJCQlyZXR1cm4gLUVCVVNZOwomIzQzOwkJLyogVGhlIHZhbGlkIHRlc3Qgb2YgdGhlIGVudHJ5IG11c3QgYmUgZG9uZSBmaXJzdCBiZWZvcmUKJiM0MzsJCSAqIHJlYWRpbmcgYW55IGZ1cnRoZXIuCiYjNDM7CQkgKi8KJiM0MzsJCWRtYV9ybWIoKTsKJiM0MzsJCWlmIChtcGNtcDEgPT0gbXBjbXAgJiM0MzsgMSkgewomIzQzOwkJCWNtcGxfZW50cnlfYXJyW2NtcGxfbnVtIC0gMV0ubGVuICYjNDM7PSBzaXplb2YoKm1wY21wMSk7CiYjNDM7CQl9IGVsc2UgewomIzQzOwkJCWNtcGxfZW50cnlfYXJyW2NtcGxfbnVtXS5jbXBsID0gbXBjbXAxOwomIzQzOwkJCWNtcGxfZW50cnlfYXJyW2NtcGxfbnVtXS5sZW4gPSBzaXplb2YoKm1wY21wMSk7CiYjNDM7CQkJY21wbF9udW0mIzQzOyYjNDM7OwomIzQzOwkJfQomIzQzOwl9CiYjNDM7CWNsaWVudCA9IE1QQ19DTVBfQ0xJRU5UX1RZUEUobXBjbXApICZndDsmZ3Q7IE1QQ19DTVBfQ0xJRU5UX1NGVDsKJiM0MzsJaWYgKGNsaWVudCAmZ3Q7PSBCTlhUX01QQ19UWVBFX01BWCkKJiM0MzsJCWdvdG8gY21wX2RvbmU7CiYjNDM7CiYjNDM7CWlmICghYm54dF9tcGNfdW5zb2xpY2l0KG1wY21wKSkgewomIzQzOwkJc3RydWN0IGJueHRfc3dfbXBjX3R4X2JkICptcGNfYnVmOwomIzQzOwkJc3RydWN0IGJueHRfdHhfcmluZ19pbmZvICp0eHI7CiYjNDM7CQl1MTYgdHhfY29uczsKJiM0MzsJCXUzMiBvcGFxdWU7CiYjNDM7CiYjNDM7CQlvcGFxdWUgPSBtcGNtcC0mZ3Q7bXBjX2NtcF9vcGFxdWU7CiYjNDM7CQl0eHIgPSBibmFwaS0mZ3Q7dHhfbXBjX3JpbmdbY2xpZW50XTsKJiM0MzsJCXR4X2NvbnMgPSB0eHItJmd0O3R4X2NvbnM7CiYjNDM7CQlpZiAoVFhfT1BBUVVFX1JJTkcob3BhcXVlKSAhPSB0eHItJmd0O3R4X25hcGlfaWR4KSB7CiYjNDM7CQkJbmV0ZGV2X3dhcm4oYnAtJmd0O2RldiwgJiMzNDtXcm9uZyBvcGFxdWUgJXgsIGV4cGVjdGVkIHJpbmcgJXgsIGNvbnMgaWR4ICV4XG4mIzM0OywKJiM0MzsJCQkJICAgIG9wYXF1ZSwgdHhyLSZndDt0eF9uYXBpX2lkeCwgdHhyLSZndDt0eF9jb25zKTsKJiM0MzsJCQlnb3RvIGNtcF9kb25lOwomIzQzOwkJfQomIzQzOwkJbXBjX2J1ZiA9ICZhbXA7dHhyLSZndDt0eF9tcGNfYnVmX3JpbmdbUklOR19UWChicCwgdHhfY29ucyldOwomIzQzOwkJaWYgKCFSRUFEX09OQ0UodHhyLSZndDtkZXZfc3RhdGUpKSB7CiYjNDM7CQkJaGFuZGxlID0gbXBjX2J1Zi0mZ3Q7aGFuZGxlOwomIzQzOwkJCW1wY19idWYtJmd0O2hhbmRsZSA9IDA7CiYjNDM7CQl9CiYjNDM7CQl0eF9jb25zICYjNDM7PSBtcGNfYnVmLSZndDtpbmxpbmVfYmRzOwomIzQzOwkJV1JJVEVfT05DRSh0eHItJmd0O3R4X2NvbnMsIHR4X2NvbnMpOwomIzQzOwkJdHhyLSZndDt0eF9od19jb25zID0gUklOR19UWChicCwgdHhfY29ucyk7CiYjNDM7CX0KJiM0MzsJYm54dF9jcnlwdG9fbXBjX2NtcChicCwgY2xpZW50LCBoYW5kbGUsIGNtcGxfZW50cnlfYXJyLCBjbXBsX251bSk7CiYjNDM7CiYjNDM7Y21wX2RvbmU6CiYjNDM7CSpyYXdfY29ucyA9IHRtcF9yYXdfY29uczsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9ibnh0X21wYy5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9ibnh0X21wYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwLi5iMGIxZTc4M2NkYzc3ZgotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dF9tcGMuaApAQCAtMCwwICYjNDM7MSwyMjcgQEAKJiM0MzsvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5ICovCiYjNDM7LyogQ29weXJpZ2h0IChjKSAyMDI2IEJyb2FkY29tIEluYy4gKi8KJiM0MzsKJiM0MzsjaWZuZGVmIEJOWFRfTVBDX0gKJiM0MzsjZGVmaW5lIEJOWFRfTVBDX0gKJiM0MzsKJiM0MzsvKiBNaWQgcGF0aCBjaGFubmVsIChNUEMpIGRlZmluaXRpb25zLiAgQW4gTVBDIGlzIHNwZWNpYWwgVFgvY29tcGxldGlvbgomIzQzOyAqIHJpbmcgcGFpciB0byBzZW5kL3JlY2VpdmUgY29udHJvbCBwbGFuZSBkYXRhIHRvIHRoZSBUQ0UgYW5kIFJDRQomIzQzOyAqIChUcmFuc21pdC9SZWNlaXZlIENyeXB0byBFbmdpbmUpIEhXIGJsb2Nrcy4KJiM0MzsgKi8KJiM0MzsKJiM0MztlbnVtIGJueHRfbXBjX3R5cGUgewomIzQzOwlCTlhUX01QQ19UQ0VfVFlQRSA9IFJJTkdfQUxMT0NfUkVRX01QQ19DSE5MU19UWVBFX1RDRSwKJiM0MzsJQk5YVF9NUENfUkNFX1RZUEUgPSBSSU5HX0FMTE9DX1JFUV9NUENfQ0hOTFNfVFlQRV9SQ0UsCiYjNDM7CUJOWFRfTVBDX1RZUEVfTUFYLAomIzQzO307CiYjNDM7CiYjNDM7I2RlZmluZSBCTlhUX01BWF9NUEMJCTgKJiM0MzsKJiM0MzsjZGVmaW5lIEJOWFRfTUlOX01QQ19UQ0UJMQomIzQzOyNkZWZpbmUgQk5YVF9NSU5fTVBDX1JDRQkxCiYjNDM7I2RlZmluZSBCTlhUX0RGTFRfTVBDX1RDRQlCTlhUX01BWF9NUEMKJiM0MzsjZGVmaW5lIEJOWFRfREZMVF9NUENfUkNFCUJOWFRfTUFYX01QQwomIzQzOwomIzQzOyNkZWZpbmUgQk5YVF9NUENfVE1PX01TRUNTICAgICAgMTAwMAomIzQzOwomIzQzO3N0cnVjdCBibnh0X21wY19pbmZvIHsKJiM0MzsJdTgJCQltcGNfY2hubHNfY2FwOwomIzQzOwl1OAkJCW1wY19jcF9yaW5nczsKJiM0MzsJdTgJCQltcGNfcmluZ19jb3VudFtCTlhUX01QQ19UWVBFX01BWF07CiYjNDM7CXN0cnVjdCBibnh0X3R4X3JpbmdfaW5mbyAqbXBjX3JpbmdzW0JOWFRfTVBDX1RZUEVfTUFYXTsKJiM0Mzt9OwomIzQzOwomIzQzO3N0cnVjdCBibnh0X3N3X21wY190eF9iZCB7CiYjNDM7CXU4IGlubGluZV9iZHM7CiYjNDM7CXVuc2lnbmVkIGxvbmcgaGFuZGxlOwomIzQzO307CiYjNDM7CiYjNDM7I2RlZmluZSBTV19NUENfVFhCRF9SSU5HX1NJWkUgKHNpemVvZihzdHJ1Y3QgYm54dF9zd19tcGNfdHhfYmQpICogVFhfREVTQ19DTlQpCiYjNDM7CiYjNDM7c3RydWN0IGJueHRfY21wbF9lbnRyeSB7CiYjNDM7CXZvaWQgKmNtcGw7CiYjNDM7CXUzMiBsZW47CiYjNDM7fTsKJiM0MzsKJiM0MztzdHJ1Y3QgbXBjX2NtcCB7CiYjNDM7CV9fbGUzMiBtcGNfY21wX2NsaWVudF9zdWJ0eXBlX3R5cGU7CiYjNDM7CSNkZWZpbmUgTVBDX0NNUF9UWVBFCQkJCQkoMHgzZiAmbHQ7Jmx0OyAwKQomIzQzOwkgI2RlZmluZSBNUENfQ01QX1RZUEVfTUlEX1BBVEhfU0hPUlQJCQkgMHgxZQomIzQzOwkgI2RlZmluZSBNUENfQ01QX1RZUEVfTUlEX1BBVEhfTE9ORwkJCSAweDFmCiYjNDM7CSNkZWZpbmUgTVBDX0NNUF9TVUJUWVBFCQkJCQkweGYwMAomIzQzOwkjZGVmaW5lIE1QQ19DTVBfU1VCVFlQRV9TRlQJCQkJIDgKJiM0MzsJICNkZWZpbmUgTVBDX0NNUF9TVUJUWVBFX1NPTElDSVRFRAkJCSAoMHgwICZsdDsmbHQ7IDgpCiYjNDM7CSAjZGVmaW5lIE1QQ19DTVBfU1VCVFlQRV9FUlIJCQkJICgweDEgJmx0OyZsdDsgOCkKJiM0MzsJICNkZWZpbmUgTVBDX0NNUF9TVUJUWVBFX1JFU1lOQwkJCQkgKDB4MiAmbHQ7Jmx0OyA4KQomIzQzOwkjZGVmaW5lIE1QQ19DTVBfQ0xJRU5UCQkJCQkoMHhmICZsdDsmbHQ7IDEyKQomIzQzOwkgI2RlZmluZSBNUENfQ01QX0NMSUVOVF9TRlQJCQkJIDEyCiYjNDM7CSAjZGVmaW5lIE1QQ19DTVBfQ0xJRU5UX1RDRQkJCQkgKDB4MCAmbHQ7Jmx0OyAxMikKJiM0MzsJICNkZWZpbmUgTVBDX0NNUF9DTElFTlRfUkNFCQkJCSAoMHgxICZsdDsmbHQ7IDEyKQomIzQzOwkgI2RlZmluZSBNUENfQ01QX0NMSUVOVF9URV9DRkEJCQkJICgweDIgJmx0OyZsdDsgMTIpCiYjNDM7CSAjZGVmaW5lIE1QQ19DTVBfQ0xJRU5UX1JFX0NGQQkJCQkgKDB4MyAmbHQ7Jmx0OyAxMikKJiM0MzsJdTMyIG1wY19jbXBfb3BhcXVlOwomIzQzOwlfX2xlMzIgbXBjX2NtcF92OwomIzQzOwkjZGVmaW5lIE1QQ19DTVBfVgkJCQkJKDEgJmx0OyZsdDsgMCkKJiM0MzsJX19sZTMyIG1wY19jbXBfZmlsbGVyOwomIzQzO307CiYjNDM7CiYjNDM7I2RlZmluZSBNUENfQ01QX0NNUF9UWVBFKG1wY21wKQkJCQkJCVwKJiM0MzsJKGxlMzJfdG9fY3B1KChtcGNtcCktJmd0O21wY19jbXBfY2xpZW50X3N1YnR5cGVfdHlwZSkgJmFtcDsgTVBDX0NNUF9UWVBFKQomIzQzOwomIzQzOyNkZWZpbmUgTVBDX0NNUF9DTElFTlRfVFlQRShtcGNtcCkJCQkJCVwKJiM0MzsJKGxlMzJfdG9fY3B1KChtcGNtcCktJmd0O21wY19jbXBfY2xpZW50X3N1YnR5cGVfdHlwZSkgJmFtcDsgTVBDX0NNUF9DTElFTlQpCiYjNDM7CiYjNDM7I2RlZmluZSBNUENfQ01QX1VOU09MSUNJVF9TVUJUWVBFKG1wY21wKQkJCQlcCiYjNDM7CSgobGUzMl90b19jcHUoKG1wY21wKS0mZ3Q7bXBjX2NtcF9jbGllbnRfc3VidHlwZV90eXBlKSAmYW1wOwkJXAomIzQzOwkgTVBDX0NNUF9TVUJUWVBFKSAhPSBNUENfQ01QX1NVQlRZUEVfU09MSUNJVEVEKQomIzQzOwomIzQzOyNkZWZpbmUgTVBDX0NNUF9WQUxJRChicCwgbXBjbXAsIHJhd19jb25zKQkJCQlcCiYjNDM7CSghISgobXBjbXApLSZndDttcGNfY21wX3YgJmFtcDsgY3B1X3RvX2xlMzIoTVBDX0NNUF9WKSkgPT0JCVwKJiM0MzsJICEoKHJhd19jb25zKSAmYW1wOyAoYnApLSZndDtjcF9iaXQpKQomIzQzOwomIzQzOyNkZWZpbmUgQk5YVF9NUENfQ1JZUFRPX0NBUCAgICBcCiYjNDM7CShGVU5DX1FDQVBTX1JFU1BfTVBDX0NITkxTX0NBUF9UQ0UgfCBGVU5DX1FDQVBTX1JFU1BfTVBDX0NITkxTX0NBUF9SQ0UpCiYjNDM7CiYjNDM7I2RlZmluZSBCTlhUX01QQ19DUllQVE9fQ0FQQUJMRShicCkJCQkJCVwKJiM0MzsJKChicCktJmd0O21wY19pbmZvID8JCQkJCQlcCiYjNDM7CSAoKGJwKS0mZ3Q7bXBjX2luZm8tJmd0O21wY19jaG5sc19jYXAgJmFtcDsgQk5YVF9NUENfQ1JZUFRPX0NBUCkgPT0JXAomIzQzOwkgIEJOWFRfTVBDX0NSWVBUT19DQVAgOiBmYWxzZSkKJiM0MzsKJiM0MzsjaWZkZWYgQ09ORklHX0JOWFRfVExTCiYjNDM7dm9pZCBibnh0X2FsbG9jX21wY19pbmZvKHN0cnVjdCBibnh0ICpicCwgdTggbXBjX2NobmxzX2NhcCk7CiYjNDM7dm9pZCBibnh0X2ZyZWVfbXBjX2luZm8oc3RydWN0IGJueHQgKmJwKTsKJiM0MztpbnQgYm54dF9tcGNfdHhfcmluZ3NfaW5fdXNlKHN0cnVjdCBibnh0ICpicCk7CiYjNDM7aW50IGJueHRfbXBjX2NwX3JpbmdzX2luX3VzZShzdHJ1Y3QgYm54dCAqYnApOwomIzQzO2Jvb2wgYm54dF9uYXBpX2hhc19tcGMoc3RydWN0IGJueHQgKmJwLCBpbnQgaSk7CiYjNDM7dm9pZCBibnh0X3NldF9tcGNfY3BfcmluZyhzdHJ1Y3QgYm54dCAqYnAsIGludCBibmFwaV9pZHgsCiYjNDM7CQkJICBzdHJ1Y3QgYm54dF9jcF9yaW5nX2luZm8gKmNwcik7CiYjNDM7dm9pZCBibnh0X3RyaW1fbXBjX3JpbmdzKHN0cnVjdCBibnh0ICpicCk7CiYjNDM7dm9pZCBibnh0X2NhbGNfZGZsdF9tcGNfcmluZ3Moc3RydWN0IGJueHQgKmJwLCBpbnQgdHhfbnJfcmluZ3MsCiYjNDM7CQkJICAgICAgaW50IHR4X25yX3JpbmdzX3Blcl90YywgaW50IHJ4X25yX3JpbmdzLAomIzQzOwkJCSAgICAgIGludCAqbXBjX3Blcl90eXBlLCBpbnQgKm1wY19jcCk7CiYjNDM7dm9pZCBibnh0X3NldF9kZmx0X21wY19yaW5ncyhzdHJ1Y3QgYm54dCAqYnApOwomIzQzO3ZvaWQgYm54dF9pbml0X21wY19yaW5nX3N0cnVjdChzdHJ1Y3QgYm54dCAqYnApOwomIzQzO2ludCBibnh0X2FsbG9jX21wY3Moc3RydWN0IGJueHQgKmJwKTsKJiM0Mzt2b2lkIGJueHRfZnJlZV9tcGNzKHN0cnVjdCBibnh0ICpicCk7CiYjNDM7aW50IGJueHRfYWxsb2NfbXBjX3JpbmdzKHN0cnVjdCBibnh0ICpicCk7CiYjNDM7dm9pZCBibnh0X2ZyZWVfbXBjX3JpbmdzKHN0cnVjdCBibnh0ICpicCk7CiYjNDM7dm9pZCBibnh0X2luaXRfbXBjX3JpbmdzKHN0cnVjdCBibnh0ICpicCk7CiYjNDM7aW50IGJueHRfaHdybV9tcGNfcmluZ19hbGxvYyhzdHJ1Y3QgYm54dCAqYnApOwomIzQzO3ZvaWQgYm54dF9od3JtX21wY19yaW5nX2ZyZWUoc3RydWN0IGJueHQgKmJwLCBib29sIGNsb3NlX3BhdGgpOwomIzQzO3N0cnVjdCBibnh0X3R4X3JpbmdfaW5mbyAqYm54dF9zZWxlY3RfbXBjX3Jpbmcoc3RydWN0IGJueHQgKmJwLCBpbnQgcmluZ190eXBlKTsKJiM0MztpbnQgYm54dF9zdGFydF94bWl0X21wYyhzdHJ1Y3QgYm54dCAqYnAsIHN0cnVjdCBibnh0X3R4X3JpbmdfaW5mbyAqdHhyLAomIzQzOwkJCXZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBsZW4sIHVuc2lnbmVkIGxvbmcgaGFuZGxlKTsKJiM0Mzt2b2lkIGJueHRfbXBjX3JpbmdfcmVzZXRfdGFzayhzdHJ1Y3QgYm54dCAqYnApOwomIzQzO2ludCBibnh0X21wY190aW1lb3V0KHN0cnVjdCBibnh0ICpicCwgc3RydWN0IGJueHRfdHhfcmluZ19pbmZvICp0eHIpOwomIzQzO2ludCBibnh0X21wY19jbXAoc3RydWN0IGJueHQgKmJwLCBzdHJ1Y3QgYm54dF9jcF9yaW5nX2luZm8gKmNwciwgdTMyICpyYXdfY29ucyk7CiYjNDM7I2Vsc2UKJiM0MztzdGF0aWMgaW5saW5lIHZvaWQgYm54dF9hbGxvY19tcGNfaW5mbyhzdHJ1Y3QgYm54dCAqYnAsIHU4IG1wY19jaG5sc19jYXApCiYjNDM7ewomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW5saW5lIHZvaWQgYm54dF9mcmVlX21wY19pbmZvKHN0cnVjdCBibnh0ICpicCkKJiM0Mzt7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbmxpbmUgaW50IGJueHRfbXBjX3R4X3JpbmdzX2luX3VzZShzdHJ1Y3QgYm54dCAqYnApCiYjNDM7ewomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGlubGluZSBpbnQgYm54dF9tcGNfY3BfcmluZ3NfaW5fdXNlKHN0cnVjdCBibnh0ICpicCkKJiM0Mzt7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW5saW5lIGJvb2wgYm54dF9uYXBpX2hhc19tcGMoc3RydWN0IGJueHQgKmJwLCBpbnQgaSkKJiM0Mzt7CiYjNDM7CXJldHVybiBmYWxzZTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGlubGluZSB2b2lkIGJueHRfc2V0X21wY19jcF9yaW5nKHN0cnVjdCBibnh0ICpicCwgaW50IGJuYXBpX2lkeCwKJiM0MzsJCQkJCXN0cnVjdCBibnh0X2NwX3JpbmdfaW5mbyAqY3ByKQomIzQzO3sKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGlubGluZSB2b2lkIGJueHRfdHJpbV9tcGNfcmluZ3Moc3RydWN0IGJueHQgKmJwKQomIzQzO3sKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGlubGluZSB2b2lkIGJueHRfY2FsY19kZmx0X21wY19yaW5ncyhzdHJ1Y3QgYm54dCAqYnAsIGludCB0eF9ucl9yaW5ncywKJiM0MzsJCQkJCSAgICBpbnQgdHhfbnJfcmluZ3NfcGVyX3RjLAomIzQzOwkJCQkJICAgIGludCByeF9ucl9yaW5ncywgaW50ICptcGNfcGVyX3R5cGUsCiYjNDM7CQkJCQkgICAgaW50ICptcGNfY3ApCiYjNDM7ewomIzQzOwkqbXBjX3Blcl90eXBlID0gMDsKJiM0MzsJKm1wY19jcCA9IDA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbmxpbmUgdm9pZCBibnh0X3NldF9kZmx0X21wY19yaW5ncyhzdHJ1Y3QgYm54dCAqYnApCiYjNDM7ewomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW5saW5lIHZvaWQgYm54dF9pbml0X21wY19yaW5nX3N0cnVjdChzdHJ1Y3QgYm54dCAqYnApCiYjNDM7ewomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW5saW5lIGludCBibnh0X2FsbG9jX21wY3Moc3RydWN0IGJueHQgKmJwKQomIzQzO3sKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbmxpbmUgdm9pZCBibnh0X2ZyZWVfbXBjcyhzdHJ1Y3QgYm54dCAqYnApCiYjNDM7ewomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW5saW5lIGludCBibnh0X2FsbG9jX21wY19yaW5ncyhzdHJ1Y3QgYm54dCAqYnApCiYjNDM7ewomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGlubGluZSB2b2lkIGJueHRfZnJlZV9tcGNfcmluZ3Moc3RydWN0IGJueHQgKmJwKQomIzQzO3sKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGlubGluZSB2b2lkIGJueHRfaW5pdF9tcGNfcmluZ3Moc3RydWN0IGJueHQgKmJwKQomIzQzO3sKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGlubGluZSBpbnQgYm54dF9od3JtX21wY19yaW5nX2FsbG9jKHN0cnVjdCBibnh0ICpicCkKJiM0Mzt7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW5saW5lIHZvaWQgYm54dF9od3JtX21wY19yaW5nX2ZyZWUoc3RydWN0IGJueHQgKmJwLCBib29sIGNsb3NlX3BhdGgpCiYjNDM7ewomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW5saW5lIHN0cnVjdCBibnh0X3R4X3JpbmdfaW5mbyAqYm54dF9zZWxlY3RfbXBjX3Jpbmcoc3RydWN0IGJueHQgKmJwLAomIzQzOwkJCQkJCQkgICAgIGludCByaW5nX3R5cGUpCiYjNDM7ewomIzQzOwlyZXR1cm4gTlVMTDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGlubGluZSBpbnQgYm54dF9zdGFydF94bWl0X21wYyhzdHJ1Y3QgYm54dCAqYnAsCiYjNDM7CQkJCSAgICAgIHN0cnVjdCBibnh0X3R4X3JpbmdfaW5mbyAqdHhyLCB2b2lkICpkYXRhLAomIzQzOwkJCQkgICAgICB1bnNpZ25lZCBpbnQgbGVuLCB1bnNpZ25lZCBsb25nIGhhbmRsZSkKJiM0Mzt7CiYjNDM7CXJldHVybiAtRU9QTk9UU1VQUDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGlubGluZSB2b2lkIGJueHRfbXBjX3JpbmdfcmVzZXRfdGFzayhzdHJ1Y3QgYm54dCAqYnApCiYjNDM7ewomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW5saW5lIGludCBibnh0X21wY190aW1lb3V0KHN0cnVjdCBibnh0ICpicCwKJiM0MzsJCQkJICAgc3RydWN0IGJueHRfdHhfcmluZ19pbmZvICp0eHIpCiYjNDM7ewomIzQzOwlyZXR1cm4gLUVPUE5PVFNVUFA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbmxpbmUgaW50IGJueHRfbXBjX2NtcChzdHJ1Y3QgYm54dCAqYnAsIHN0cnVjdCBibnh0X2NwX3JpbmdfaW5mbyAqY3ByLAomIzQzOwkJCSAgICAgICB1MzIgKnJhd19jb25zKQomIzQzO3sKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOyNlbmRpZgkvKiBDT05GSUdfQk5YVF9UTFMgKi8KJiM0MzsjZW5kaWYJLyogQk5YVF9NUENfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9ibnh0X3NyaW92LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibnh0L2JueHRfc3Jpb3YuYwppbmRleCBlZGNjMDAyZTRjYTM1OC4uZDU3MDU5NzIyZjViYjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dF9zcmlvdi5jCiYjNDM7JiM0MzsmIzQzOyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dF9zcmlvdi5jCkBAIC02NDAsNyAmIzQzOzY0MCw3IEBAIHN0YXRpYyBpbnQgYm54dF9od3JtX2Z1bmNfdmZfcmVzY19jZmcoc3RydWN0IGJueHQgKmJwLCBpbnQgbnVtX3ZmcywgYm9vbCByZXNldCkKIAkJdmZfcnhfcmluZ3MgPSBod19yZXNjLSZndDttYXhfcnhfcmluZ3MgLSBicC0mZ3Q7cnhfbnJfcmluZ3MgKiAyOwogCWVsc2UKIAkJdmZfcnhfcmluZ3MgPSBod19yZXNjLSZndDttYXhfcnhfcmluZ3MgLSBicC0mZ3Q7cnhfbnJfcmluZ3M7Ci0JdmZfdHhfcmluZ3MgPSBod19yZXNjLSZndDttYXhfdHhfcmluZ3MgLSBicC0mZ3Q7dHhfbnJfcmluZ3M7CiYjNDM7CXZmX3R4X3JpbmdzID0gaHdfcmVzYy0mZ3Q7bWF4X3R4X3JpbmdzIC0gYm54dF90b3RhbF90eF9yaW5ncyhicCk7CiAJdmZfdm5pY3MgPSBod19yZXNjLSZndDttYXhfdm5pY3MgLSBicC0mZ3Q7bnJfdm5pY3M7CiAJdmZfcnNzID0gaHdfcmVzYy0mZ3Q7bWF4X3Jzc2Nvc19jdHhzIC0gYnAtJmd0O3Jzc2Nvc19ucl9jdHhzOwogCkBAIC05MDMsOCAmIzQzOzkwMyw4IEBAIHN0YXRpYyBpbnQgYm54dF9zcmlvdl9lbmFibGUoc3RydWN0IGJueHQgKmJwLCBpbnQgKm51bV92ZnMpCiAJCSAgICBhdmFpbF9jcCAmbHQ7IG1pbl9yeF9yaW5ncykKIAkJCXJ4X29rID0gMDsKIAotCQlpZiAoaHdfcmVzYy0mZ3Q7bWF4X3R4X3JpbmdzIC0gYnAtJmd0O3R4X25yX3JpbmdzICZndDs9IG1pbl90eF9yaW5ncyAmYW1wOyZhbXA7Ci0JCSAgICBhdmFpbF9jcCAmZ3Q7PSBtaW5fdHhfcmluZ3MpCiYjNDM7CQlpZiAoaHdfcmVzYy0mZ3Q7bWF4X3R4X3JpbmdzIC0gYm54dF90b3RhbF90eF9yaW5ncyhicCkgJmd0Oz0KJiM0MzsJCSAgICBtaW5fdHhfcmluZ3MgJmFtcDsmYW1wOyBhdmFpbF9jcCAmZ3Q7PSBtaW5fdHhfcmluZ3MpCiAJCQl0eF9vayA9IDE7CiAKIAkJaWYgKGh3X3Jlc2MtJmd0O21heF9yc3Njb3NfY3R4cyAtIGJwLSZndDtyc3Njb3NfbnJfY3R4cyAmZ3Q7PQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9ibnh0X3hkcC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9ibnh0X3hkcC5jCmluZGV4IDllNTAwOWJlOGU5ODk4Li5kMTg3MzEyNDg5M2E1ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9ibnh0X3hkcC5jCiYjNDM7JiM0MzsmIzQzOyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dF94ZHAuYwpAQCAtMTksNiAmIzQzOzE5LDcgQEAKICNpbmNsdWRlICZsdDtuZXQvcGFnZV9wb29sL2hlbHBlcnMuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9ibnh0L2hzaS5oJmd0OwogI2luY2x1ZGUgJiMzNDtibnh0LmgmIzM0OwomIzQzOyNpbmNsdWRlICYjMzQ7Ym54dF9tcGMuaCYjMzQ7CiAjaW5jbHVkZSAmIzM0O2JueHRfeGRwLmgmIzM0OwogCiBERUZJTkVfU1RBVElDX0tFWV9GQUxTRShibnh0X3hkcF9sb2NraW5nX2tleSk7CkBAIC0zNTEsNyAmIzQzOzM1Miw3IEBAIGludCBibnh0X3hkcF94bWl0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBudW1fZnJhbWVzLAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmIChzdGF0aWNfYnJhbmNoX3VubGlrZWx5KCZhbXA7Ym54dF94ZHBfbG9ja2luZ19rZXkpKQotCQlzcGluX2xvY2soJmFtcDt0eHItJmd0O3hkcF90eF9sb2NrKTsKJiM0MzsJCXNwaW5fbG9jaygmYW1wO3R4ci0mZ3Q7dHhfbG9jayk7CiAKIAlmb3IgKGkgPSAwOyBpICZsdDsgbnVtX2ZyYW1lczsgaSYjNDM7JiM0MzspIHsKIAkJc3RydWN0IHhkcF9mcmFtZSAqeGRwID0gZnJhbWVzW2ldOwpAQCAtMzc2LDcgJiM0MzszNzcsNyBAQCBpbnQgYm54dF94ZHBfeG1pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbnVtX2ZyYW1lcywKIAl9CiAKIAlpZiAoc3RhdGljX2JyYW5jaF91bmxpa2VseSgmYW1wO2JueHRfeGRwX2xvY2tpbmdfa2V5KSkKLQkJc3Bpbl91bmxvY2soJmFtcDt0eHItJmd0O3hkcF90eF9sb2NrKTsKJiM0MzsJCXNwaW5fdW5sb2NrKCZhbXA7dHhyLSZndDt0eF9sb2NrKTsKIAogCXJldHVybiBueG1pdDsKIH0KQEAgLTQxMCw3ICYjNDM7NDExLDggQEAgc3RhdGljIGludCBibnh0X3hkcF9zZXQoc3RydWN0IGJueHQgKmJwLCBzdHJ1Y3QgYnBmX3Byb2cgKnByb2cpCiAJaWYgKCF0YykKIAkJdGMgPSAxOwogCXJjID0gYm54dF9jaGVja19yaW5ncyhicCwgYnAtJmd0O3R4X25yX3JpbmdzX3Blcl90YywgYnAtJmd0O3J4X25yX3JpbmdzLAotCQkJICAgICAgdHJ1ZSwgdGMsIHR4X3hkcCk7CiYjNDM7CQkJICAgICAgdHJ1ZSwgdGMsIHR4X3hkcCwgYm54dF9tcGNfdHhfcmluZ3NfaW5fdXNlKGJwKSwKJiM0MzsJCQkgICAgICBibnh0X21wY19jcF9yaW5nc19pbl91c2UoYnApKTsKIAlpZiAocmMpIHsKIAkJbmV0ZGV2X3dhcm4oZGV2LCAmIzM0O1VuYWJsZSB0byByZXNlcnZlIGVub3VnaCBUWCByaW5ncyB0byBzdXBwb3J0IFhEUC5cbiYjMzQ7KTsKIAkJcmV0dXJuIHJjOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9ibnh0L2hzaS5oIGIvaW5jbHVkZS9saW51eC9ibnh0L2hzaS5oCmluZGV4IDc0YTZiZjI3OGQ4ODhjLi4wMzQ0NGI4MWJlYjBmMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9ibnh0L2hzaS5oCiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvbGludXgvYm54dC9oc2kuaApAQCAtMzgzNyw2ICYjNDM7MzgzNyw0MyBAQCBzdHJ1Y3QgaHdybV9mdW5jX3B0cF9leHRfcWNmZ19vdXRwdXQgewogCXU4CXZhbGlkOwogfTsKIAomIzQzOy8qIGh3cm1fZnVuY19rZXlfY3R4X2FsbG9jX2lucHV0IChzaXplOjM4NGIvNDhCKSAqLwomIzQzO3N0cnVjdCBod3JtX2Z1bmNfa2V5X2N0eF9hbGxvY19pbnB1dCB7CiYjNDM7CV9fbGUxNglyZXFfdHlwZTsKJiM0MzsJX19sZTE2CWNtcGxfcmluZzsKJiM0MzsJX19sZTE2CXNlcV9pZDsKJiM0MzsJX19sZTE2CXRhcmdldF9pZDsKJiM0MzsJX19sZTY0CXJlc3BfYWRkcjsKJiM0MzsJX19sZTE2CWZpZDsKJiM0MzsJX19sZTE2CW51bV9rZXlfY3R4czsKJiM0MzsJX19sZTMyCWRtYV9idWZyX3NpemVfYnl0ZXM7CiYjNDM7CXU4CWtleV9jdHhfdHlwZTsKJiM0MzsJI2RlZmluZSBGVU5DX0tFWV9DVFhfQUxMT0NfUkVRX0tFWV9DVFhfVFlQRV9UWCAgICAgIDB4MFVMCiYjNDM7CSNkZWZpbmUgRlVOQ19LRVlfQ1RYX0FMTE9DX1JFUV9LRVlfQ1RYX1RZUEVfUlggICAgICAweDFVTAomIzQzOwkjZGVmaW5lIEZVTkNfS0VZX0NUWF9BTExPQ19SRVFfS0VZX0NUWF9UWVBFX1FVSUNfVFggMHgyVUwKJiM0MzsJI2RlZmluZSBGVU5DX0tFWV9DVFhfQUxMT0NfUkVRX0tFWV9DVFhfVFlQRV9RVUlDX1JYIDB4M1VMCiYjNDM7CSNkZWZpbmUgRlVOQ19LRVlfQ1RYX0FMTE9DX1JFUV9LRVlfQ1RYX1RZUEVfTEFTVCAgIEZVTkNfS0VZX0NUWF9BTExPQ19SRVFfS0VZX0NUWF9UWVBFX1FVSUNfUlgKJiM0MzsJdTgJdW51c2VkXzBbN107CiYjNDM7CV9fbGU2NAlob3N0X2RtYV9hZGRyOwomIzQzOwlfX2xlMzIJcGFydGl0aW9uX3N0YXJ0X3hpZDsKJiM0MzsJdTgJdW51c2VkXzFbNF07CiYjNDM7fTsKJiM0MzsKJiM0MzsvKiBod3JtX2Z1bmNfa2V5X2N0eF9hbGxvY19vdXRwdXQgKHNpemU6MTkyYi8yNEIpICovCiYjNDM7c3RydWN0IGh3cm1fZnVuY19rZXlfY3R4X2FsbG9jX291dHB1dCB7CiYjNDM7CV9fbGUxNgllcnJvcl9jb2RlOwomIzQzOwlfX2xlMTYJcmVxX3R5cGU7CiYjNDM7CV9fbGUxNglzZXFfaWQ7CiYjNDM7CV9fbGUxNglyZXNwX2xlbjsKJiM0MzsJX19sZTE2CW51bV9rZXlfY3R4c19hbGxvY2F0ZWQ7CiYjNDM7CXU4CWZsYWdzOwomIzQzOwkjZGVmaW5lIEZVTkNfS0VZX0NUWF9BTExPQ19SRVNQX0ZMQUdTX0tFWV9DVFhTX0NPTlRJR1VPVVMgICAgIDB4MVVMCiYjNDM7CXU4CXVudXNlZF8wOwomIzQzOwlfX2xlMzIJcGFydGl0aW9uX3N0YXJ0X3hpZDsKJiM0MzsJdTgJdW51c2VkXzFbN107CiYjNDM7CXU4CXZhbGlkOwomIzQzO307CiYjNDM7CiAvKiBod3JtX2Z1bmNfYmFja2luZ19zdG9yZV9jZmdfdjJfaW5wdXQgKHNpemU6NTEyYi82NEIpICovCiBzdHJ1Y3QgaHdybV9mdW5jX2JhY2tpbmdfc3RvcmVfY2ZnX3YyX2lucHV0IHsKIAlfX2xlMTYJcmVxX3R5cGU7CjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzExIDAyOjA1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDU4ODgxCgkJCQkJCQlvdXRwdXQ6IDEyMAoJCQkJCQkJdGhvdWdodHM6IDE2MzgKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHlzaXMgb2YgdGhlIGJueHQgVExTIE9mZmxvYWQgUGF0Y2gqKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggZm9yIFRMUyBvZmZsb2FkIHN1cHBvcnQgaW4gdGhlIEJyb2FkY29tIE5ldFh0cmVtZS1DL0UgKGBibnh0YCkgZHJpdmVyLiBNeSBpbml0aWFsIHRob3VnaHQgaXMgdG8gZmlndXJlIG91dCBpZiBpdCYjMzk7cyBldmVuICpyZWFjaGFibGUqIGluIGEgZnV6emluZyBjb250ZXh0LiBXZSYjMzk7cmUgdGFsa2luZyBhYm91dCBrVExTIG9mZmxvYWQgaGVyZSwgYW5kIHRoYXQgZ2V0cyBtZSB0aGlua2luZyBhYm91dCB2aXJ0dWFsaXphdGlvbiwgd2hpY2ggaXMgY3J1Y2lhbCBmb3IgbXkgd29yay4KCkZpcnN0LCBpdCBhZGRzIGEgYEJOWFRfVExTYCBLY29uZmlnIG9wdGlvbiwgd2hpY2ggbWFrZXMgbWUgY2hlY2sgaWYgdGhlIHJlcXVpcmVkIGBCTlhUYCBhbmQgYFRMU19ERVZJQ0VgIGFyZSBwcmVzZW50IGFuZCB0aGUgc3RhdGUgb2YgYFRMU2AgYW5kIGBCTlhUYCBLY29uZmlncy4gSXQgYWxzbyBhZGRzIHNldmVyYWwgbmV3IGZpbGVzIGFuZCBtb2RpZmllcyBleGlzdGluZyBvbmVzIHdpdGhpbiB0aGUgYGJueHRgIGRyaXZlci4KClRoZSBjb3JlIHF1ZXN0aW9uIGlzIHJlYWNoYWJpbGl0eS4gVGhpcyBkcml2ZXIgaXMgZm9yIGEgKnNwZWNpZmljKiBCcm9hZGNvbSBoYXJkd2FyZS4gU3l6a2FsbGVyLCBteSBtYWluIHRvb2wsIGRvZXNuJiMzOTt0IG5hdGl2ZWx5IGVtdWxhdGUgdGhpcywgYW5kIG15IGd1dCBmZWVsaW5nIHRlbGxzIG1lIHRoaXMgaXMgZ29pbmcgdG8gYmUgYSBwcm9ibGVtLiBNeSBpbml0aWFsIHRob3VnaHQgaXMgdGhhdCB1bmxlc3MgdGhlcmUmIzM5O3MgYW4gZW11bGF0ZWQgZGV2aWNlIGF2YWlsYWJsZSAobGlrZSB3aXRoIFFFTVUpLCBpdCYjMzk7cyBhIG5vbi1zdGFydGVyLiBCdXQsIGlzIGl0IHBvc3NpYmxlIHRvIHJlYWNoIHRoZSBkcml2ZXIgdGhyb3VnaCBmdXp6aW5nIHRoZSBQQ0kgYnVzPyBUaGUgc3l6a2FsbGVyIFBDSSBmdXp6ZXIgY2FuIHNpbXVsYXRlIFBDSSBkZXZpY2VzLgoKSSBoYXZlIHRvIGNvbnNpZGVyIHRoZSBwcm9tcHQmIzM5O3MgaW5zdHJ1Y3Rpb25zOiAgJiMzNDtDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzLi4uIGFyZSBub3Qgd29ydGggZnV6emluZy4mIzM0OyBTbywgSSBuZWVkIHRvIHNlZSBpZiB0aGVyZSBpcyBhbiBlbXVsYXRvci4gTG9va2luZyBmb3IgYGJueHRgIGluIFFFTVUgaXNuJiMzOTt0IGZydWl0ZnVsLCBhbmQgdGhlIGRvY3VtZW50YXRpb24gY29uZmlybXMgdGhpcyBpcyBhIFBDSSBkcml2ZXIuCgpUaGUgc3l6a2FsbGVyIFBDSSBmdXp6ZXIgZG9lcyBleGlzdCAoYHN5el9wY2lfZGV2aWNlYCksIHdoaWNoIGluaXRpYWxseSBnaXZlcyBtZSBhIGdsaW1tZXIgb2YgaG9wZS4gQnV0LCBjYW4gaXQgcmVhY2ggKmRlZXAqIGludG8gdGhlIGRyaXZlciYjMzk7cyBkYXRhIHBhdGg/IENhbiB0aGUgUENJIGZ1enplciBwcm9wZXJseSBlbXVsYXRlIHRoZSBjb21wbGV4IGZpcm13YXJlIGludGVyYWN0aW9ucyByZXF1aXJlZCB0byBwcm9iZSB0aGUgYGJueHRgIGRldmljZT8gTXkgZXhwZXJ0IGtub3dsZWRnZSBhbmQgZXhwZXJpZW5jZSB0ZWxsIG1lIHRoYXQgZ2V0dGluZyBiZXlvbmQgYmFzaWMgZGV2aWNlIHByb2JlIGlzIGEgbG9uZyBzaG90LiAgYGJueHRgIHJlbGllcyBvbiBpdHMgSGFyZHdhcmUgUmVzb3VyY2UgTWFuYWdlciAoSFdSTSksIHdoaWNoIGlzIGFuIGV4dHJlbWVseSBjb21wbGljYXRlZCBmaXJtd2FyZSBpbnRlcmZhY2UuCgpPa2F5LCBsZXQmIzM5O3Mgc3RlcCBiYWNrLiBEb2VzIHRoaXMgcGF0Y2ggY2hhbmdlIGNvcmUga2VybmVsIGxvZ2ljPyBOby4gSXQmIzM5O3MgY29uZmluZWQgdG8gdGhlIGRyaXZlciBhbmQgaXRzIGRlcGVuZGVuY2llcy4gQXJlIHRoZXJlIGFueSBvdGhlciBhdmVudWVzIGZvciByZWFjaGluZyB0aGlzIGNvZGU/IE5vLCBJIGFtIHNlZWluZyB0aGF0IGl0IGlzIG9ubHkgYSBwaHlzaWNhbCBOSUMuICBJJiMzOTt2ZSBjaGVja2VkLCBhbmQgdGhpcyBpc24mIzM5O3QgYSB2aXJ0dWFsIGRldmljZSB3aXRoIGEgZHVtbXkgb3IgdmV0aCBtb2RlLgoKU28sIEkmIzM5O20gY29uY2x1ZGluZyB0aGlzIHRoZSBkYXRhIHBhdGgsIGluY2x1ZGluZyB0aGUgY3JpdGljYWwgcGFydHMgb2YgYGJueHRfa3Rscy5jYCwgYGJueHRfY3J5cHRvLmNgLCBhbmQgYGJueHRfbXBjLmNgIGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGJlY2F1c2Ugb2YgdGhlIGxhY2sgb2YgZW11bGF0aW9uIGFuZCBoYXJkd2FyZSBkZXBlbmRlbmN5LgoKSSBuZWVkIHRvIGNvbmZpcm0gaWYgYW55dGhpbmcgZWxzZSBkaXNxdWFsaWZpZXMgaXQsIGxpa2UgbW9kaWZpY2F0aW9ucyB0byBkb2N1bWVudGF0aW9uLCBLY29uZmlnIGZpbGVzLCBvciBjb21tZW50cy4gVGhlIHBhdGNoIG9ubHkgY2hhbmdlcyBgZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vS2NvbmZpZ2AsIGRyaXZlciBmaWxlcywgYW5kIGFuIGluY2x1ZGUgZmlsZS4gTm8gY29yZSBrZXJuZWwgY2hhbmdlcy4KCkJhc2VkIG9uIHRoaXMsIGFuZCB0aGUgcHJvbXB0JiMzOTtzIGV4cGxpY2l0IGd1aWRhbmNlLCBJJiMzOTttIGNvbmZpZGVudCBpbiByZXR1cm5pbmcgYFdvcnRoRnV6emluZz1mYWxzZWAuIFRoZSBSZWFzb25pbmcgSSYjMzk7bGwgZ2l2ZSBpcyB0aGlzOiAmIzM0O1RoZSBwYXRjaCBhZGRzIGtUTFMgb2ZmbG9hZCBzdXBwb3J0IHRvIHRoZSBCcm9hZGNvbSBOZXRYdHJlbWUtQy9FIChibnh0KSBFdGhlcm5ldCBkcml2ZXIuIFNpbmNlIHRoaXMgaXMgYSBoYXJkd2FyZS1zcGVjaWZpYyBQQ0kgZHJpdmVyIHRoYXQgcmVxdWlyZXMgY29tcGxleCBmaXJtd2FyZSAoSFdSTSkgaW50ZXJhY3Rpb25zIHRvIGluaXRpYWxpemUgYW5kIGJyaW5nIHVwIHRoZSBuZXR3b3JrIGRldmljZSwgaXQgaXMgaW1wb3NzaWJsZSB0byByZWFjaCB0aGUgbW9kaWZpZWQgZGF0YSBwYXRoIGFuZCBUTFMgb2ZmbG9hZCBsb2dpYyBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgd2l0aG91dCBhIGRlZGljYXRlZCBzb2Z0d2FyZSBlbXVsYXRvci4gVGhlcmVmb3JlLCB0aGlzIGNvZGUgY2Fubm90IGJlIG1lYW5pbmdmdWxseSBmdXp6ZWQuJiMzNDsgVGhlIHByb21wdCBpcyBhc2tpbmcgaWYgdGhlIGNvZGUgaXMgdW5yZWFjaGFibGUgaW4gUUVNVSBvciBzaW1pbGFyIGVudmlyb25tZW50cywgYW5kIEkgaGF2ZSBjb25maXJtZWQgaXQmIzM5O3MgcHJhY3RpY2FsbHkgaW1wb3NzaWJsZSB0byByZWFjaCB0aGUgZGVlcCBkYXRhIHBhdGhzIGFuZCBUTFMgb2ZmbG9hZCB3aXRob3V0IGEgY29tcGxleCBlbXVsYXRvciB0aGF0IGRvZXMgbm90IGV4aXN0LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzExIDAyOjA2PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogW10sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogW10sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggYWRkcyBrVExTIG9mZmxvYWQgc3VwcG9ydCB0byB0aGUgQnJvYWRjb20gTmV0WHRyZW1lLUMvRSAoYm54dCkgRXRoZXJuZXQgZHJpdmVyLiBTaW5jZSB0aGlzIGlzIGEgaGFyZHdhcmUtc3BlY2lmaWMgUENJIGRyaXZlciB0aGF0IHJlcXVpcmVzIGNvbXBsZXggZmlybXdhcmUgKEhXUk0pIGludGVyYWN0aW9ucyB0byBpbml0aWFsaXplIGFuZCBicmluZyB1cCB0aGUgbmV0d29yayBkZXZpY2UsIGl0IGlzIGltcG9zc2libGUgdG8gcmVhY2ggdGhlIG1vZGlmaWVkIGRhdGEgcGF0aCBhbmQgVExTIG9mZmxvYWQgbG9naWMgaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIHdpdGhvdXQgYSBkZWRpY2F0ZWQgc29mdHdhcmUgZW11bGF0b3IuIFRoZXJlZm9yZSwgdGhpcyBjb2RlIGNhbm5vdCBiZSBtZWFuaW5nZnVsbHkgZnV6emVkLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IG51bGwsCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogW10sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggYWRkcyBrVExTIG9mZmxvYWQgc3VwcG9ydCB0byB0aGUgQnJvYWRjb20gTmV0WHRyZW1lLUMvRSAoYm54dCkgRXRoZXJuZXQgZHJpdmVyLiBTaW5jZSB0aGlzIGlzIGEgaGFyZHdhcmUtc3BlY2lmaWMgUENJIGRyaXZlciB0aGF0IHJlcXVpcmVzIGNvbXBsZXggZmlybXdhcmUgKEhXUk0pIGludGVyYWN0aW9ucyB0byBpbml0aWFsaXplIGFuZCBicmluZyB1cCB0aGUgbmV0d29yayBkZXZpY2UsIGl0IGlzIGltcG9zc2libGUgdG8gcmVhY2ggdGhlIG1vZGlmaWVkIGRhdGEgcGF0aCBhbmQgVExTIG9mZmxvYWQgbG9naWMgaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIHdpdGhvdXQgYSBkZWRpY2F0ZWQgc29mdHdhcmUgZW11bGF0b3IuIFRoZXJlZm9yZSwgdGhpcyBjb2RlIGNhbm5vdCBiZSBtZWFuaW5nZnVsbHkgZnV6emVkLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8L3Rib2R5PgoJPC90YWJsZT4KCgk8ZGl2IGlkPSJsbG1fc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPkxMTSBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIFRva2VuczwvdGg+CgkJCQkJPHRoPkF2ZyBUb2tlbnM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0ibGxtX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0idG9vbF9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+VG9vbCBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJ0b29sX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0iZHVyYXRpb25fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoJPGRpdiBpZD0idG9rZW5fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vanNhcGkiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCWdvb2dsZS5sb2FkKCJ2aXN1YWxpemF0aW9uIiwgIjEiLCB7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pOwoJCWdvb2dsZS5zZXRPbkxvYWRDYWxsYmFjayhkcmF3Q2hhcnRzKTsKCgkJZnVuY3Rpb24gZHJhd0NoYXJ0cygpIHsKCQkJY29uc3QgcmF3RGF0YSA9IFt7IlN0YXJ0ZWQiOiIyMDI2LTA3LTExVDAyOjA1OjU2LjcyMTkyNzA4M1oiLCJTZXEiOjAsIk5lc3RpbmciOjAsIlR5cGUiOiJmbG93IiwiTmFtZSI6InBhdGNoLXRyaWFnZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIwODM3NTUyNzkwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IG51bGwsXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBhZGRzIGtUTFMgb2ZmbG9hZCBzdXBwb3J0IHRvIHRoZSBCcm9hZGNvbSBOZXRYdHJlbWUtQy9FIChibnh0KSBFdGhlcm5ldCBkcml2ZXIuIFNpbmNlIHRoaXMgaXMgYSBoYXJkd2FyZS1zcGVjaWZpYyBQQ0kgZHJpdmVyIHRoYXQgcmVxdWlyZXMgY29tcGxleCBmaXJtd2FyZSAoSFdSTSkgaW50ZXJhY3Rpb25zIHRvIGluaXRpYWxpemUgYW5kIGJyaW5nIHVwIHRoZSBuZXR3b3JrIGRldmljZSwgaXQgaXMgaW1wb3NzaWJsZSB0byByZWFjaCB0aGUgbW9kaWZpZWQgZGF0YSBwYXRoIGFuZCBUTFMgb2ZmbG9hZCBsb2dpYyBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgd2l0aG91dCBhIGRlZGljYXRlZCBzb2Z0d2FyZSBlbXVsYXRvci4gVGhlcmVmb3JlLCB0aGlzIGNvZGUgY2Fubm90IGJlIG1lYW5pbmdmdWxseSBmdXp6ZWQuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0xMVQwMjowNTo1Ni43MjE5MzM4MzNaIiwiU2VxIjoxLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6InJlYWQtcGF0Y2gtZGlmZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEwMjMyMDE4MDMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIlBhdGNoRGlmZlwiOiBcImNvbW1pdCBlYTgyM2Y1MTVhZThjZTM4MDVhZGIyMWMzMjk2OWM5MWJjNzMyNTAyXFxuQXV0aG9yOiBzeXotY2x1c3RlciBcXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cXHUwMDNlXFxuRGF0ZTogICBTYXQgSnVsIDExIDAyOjA1OjU0IDIwMjYgKzAwMDBcXG5cXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XFxuXFxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL0tjb25maWcgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9LY29uZmlnXFxuaW5kZXggZjBiYWMwZGQxNDM5MDAuLmIzM2I2NmYwMzhiODgyIDEwMDY0NFxcbi0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL0tjb25maWdcXG4rKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9LY29uZmlnXFxuQEAgLTI1NSw2ICsyNTUsMTUgQEAgY29uZmlnIEJOWFRfSFdNT05cXG4gXFx0ICBTYXkgWSBpZiB5b3Ugd2FudCB0byBleHBvc2UgdGhlIHRoZXJtYWwgc2Vuc29yIGRhdGEgb24gTmV0WHRyZW1lLUMvRVxcbiBcXHQgIGRldmljZXMsIHZpYSB0aGUgaHdtb24gc3lzZnMgaW50ZXJmYWNlLlxcbiBcXG4rY29uZmlnIEJOWFRfVExTXFxuK1xcdGJvb2wgXFxcIkJyb2FkY29tIE5ldFh0cmVtZS1DL0UgVExTIG9mZmxvYWQgc3VwcG9ydFxcXCJcXG4rXFx0ZGVmYXVsdCB5XFxuK1xcdGRlcGVuZHMgb24gQk5YVCBcXHUwMDI2XFx1MDAyNiBUTFNfREVWSUNFXFxuK1xcdGRlcGVuZHMgb24gVExTPXkgfHwgQk5YVD1tXFxuK1xcdGhlbHBcXG4rXFx0ICBTYXkgWSBpZiB5b3Ugd2FudCB0byBlbmFibGUgVHJhbnNwb3J0IExheWVyIFNlY3VyaXR5IChUTFMpIGhhcmR3YXJlXFxuK1xcdCAgZW5jcnlwdGlvbiBhbmQgZGVjcnlwdGlvbiBvZmZsb2FkIG9uIHN1cHBvcnRlZCBOZXRYdHJlbWUtQy9FIGRldmljZXMuXFxuK1xcbiBjb25maWcgQk5HRVxcbiBcXHR0cmlzdGF0ZSBcXFwiQnJvYWRjb20gVGhvclVsdHJhIEV0aGVybmV0IGRldmljZSBzdXBwb3J0XFxcIlxcbiBcXHRkZXBlbmRzIG9uIFBDSVxcbmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibnh0L01ha2VmaWxlIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9NYWtlZmlsZVxcbmluZGV4IGRlYmVmNzhjOGI2ZDY0Li44OGU2ODI0OGFhZDQyMCAxMDA2NDRcXG4tLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibnh0L01ha2VmaWxlXFxuKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9NYWtlZmlsZVxcbkBAIC01LDMgKzUsNCBAQCBibnh0X2VuLXkgOj0gYm54dC5vIGJueHRfaHdybS5vIGJueHRfc3Jpb3YubyBibnh0X2V0aHRvb2wubyBibnh0X2RjYi5vIGJueHRfdWxwLlxcbiBibnh0X2VuLSQoQ09ORklHX0JOWFRfRkxPV0VSX09GRkxPQUQpICs9IGJueHRfdGMub1xcbiBibnh0X2VuLSQoQ09ORklHX0RFQlVHX0ZTKSArPSBibnh0X2RlYnVnZnMub1xcbiBibnh0X2VuLSQoQ09ORklHX0JOWFRfSFdNT04pICs9IGJueHRfaHdtb24ub1xcbitibnh0X2VuLSQoQ09ORklHX0JOWFRfVExTKSArPSBibnh0X21wYy5vIGJueHRfY3J5cHRvLm8gYm54dF9rdGxzLm9cXG5kaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9ibnh0LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibnh0L2JueHQuY1xcbmluZGV4IDc1MTM2MTg3OTNkYWYzLi5mMDg0YzE5ZmZkZGQ4ZiAxMDA2NDRcXG4tLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibnh0L2JueHQuY1xcbisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dC5jXFxuQEAgLTc2LDYgKzc2LDkgQEBcXG4gI2luY2x1ZGUgXFxcImJueHRfaHdtb24uaFxcXCJcXG4gI2luY2x1ZGUgXFxcImJueHRfZ3NvLmhcXFwiXFxuICNpbmNsdWRlIFxcdTAwM2NuZXQvdHNvLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcXCJibnh0X21wYy5oXFxcIlxcbisjaW5jbHVkZSBcXFwiYm54dF9jcnlwdG8uaFxcXCJcXG4rI2luY2x1ZGUgXFxcImJueHRfa3Rscy5oXFxcIlxcbiBcXG4gI2RlZmluZSBCTlhUX1RYX1RJTUVPVVRcXHRcXHQoNSAqIEhaKVxcbiAjZGVmaW5lIEJOWFRfREVGX01TR19FTkFCTEVcXHQoTkVUSUZfTVNHX0RSViB8IE5FVElGX01TR19IVyB8IFxcXFxcXG5AQCAtMzkyLDcgKzM5NSw3IEBAIHN0YXRpYyB2b2lkIF9fYm54dF9xdWV1ZV9zcF93b3JrKHN0cnVjdCBibnh0ICpicClcXG4gXFx0XFx0c2NoZWR1bGVfd29yayhcXHUwMDI2YnAtXFx1MDAzZXNwX3Rhc2spO1xcbiB9XFxuIFxcbi1zdGF0aWMgdm9pZCBibnh0X3F1ZXVlX3NwX3dvcmsoc3RydWN0IGJueHQgKmJwLCB1bnNpZ25lZCBpbnQgZXZlbnQpXFxuK3ZvaWQgYm54dF9xdWV1ZV9zcF93b3JrKHN0cnVjdCBibnh0ICpicCwgdW5zaWduZWQgaW50IGV2ZW50KVxcbiB7XFxuIFxcdHNldF9iaXQoZXZlbnQsIFxcdTAwMjZicC1cXHUwMDNlc3BfZXZlbnQpO1xcbiBcXHRfX2JueHRfcXVldWVfc3Bfd29yayhicCk7XFxuQEAgLTQ3OCwxMyArNDgxLDE1IEBAIHN0YXRpYyBuZXRkZXZfdHhfdCBibnh0X3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldilcXG4gXFx0ZG1hX2FkZHJfdCBtYXBwaW5nO1xcbiBcXHR1bnNpZ25lZCBpbnQgbGVuZ3RoLCBwYWQgPSAwO1xcbiBcXHR1MzIgbGVuLCBmcmVlX3NpemUsIHZsYW5fdGFnX2ZsYWdzLCBjZmFfYWN0aW9uLCBmbGFncztcXG4rXFx0c3RydWN0IGJueHRfa3Rsc19vZmZsb2FkX2N0eF90eCAqa2N0eF90eCA9IE5VTEw7XFxuK1xcdHUxNiBwcm9kLCBzdGFydF9wcm9kLCBsYXN0X2ZyYWcsIHR4dHNfcHJvZDtcXG4gXFx0c3RydWN0IGJueHRfcHRwX2NmZyAqcHRwID0gYnAtXFx1MDAzZXB0cF9jZmc7XFxuIFxcdHN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gYnAtXFx1MDAzZXBkZXY7XFxuLVxcdHUxNiBwcm9kLCBsYXN0X2ZyYWcsIHR4dHNfcHJvZDtcXG4gXFx0c3RydWN0IGJueHRfdHhfcmluZ19pbmZvICp0eHI7XFxuIFxcdHN0cnVjdCBibnh0X3N3X3R4X2JkICp0eF9idWY7XFxuIFxcdF9fbGUzMiBsZmxhZ3MgPSAwO1xcbiBcXHRza2JfZnJhZ190ICpmcmFnO1xcbitcXHR1MzIga2lkID0gMDtcXG4gXFxuIFxcdGkgPSBza2JfZ2V0X3F1ZXVlX21hcHBpbmcoc2tiKTtcXG4gXFx0aWYgKHVubGlrZWx5KGkgXFx1MDAzZT0gYnAtXFx1MDAzZXR4X25yX3JpbmdzKSkge1xcbkBAIC00OTUsNyArNTAwLDYgQEAgc3RhdGljIG5ldGRldl90eF90IGJueHRfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KVxcbiBcXG4gXFx0dHhxID0gbmV0ZGV2X2dldF90eF9xdWV1ZShkZXYsIGkpO1xcbiBcXHR0eHIgPSBcXHUwMDI2YnAtXFx1MDAzZXR4X3JpbmdbYnAtXFx1MDAzZXR4X3JpbmdfbWFwW2ldXTtcXG4tXFx0cHJvZCA9IHR4ci1cXHUwMDNldHhfcHJvZDtcXG4gXFxuICNpZiAoTUFYX1NLQl9GUkFHUyBcXHUwMDNlIFRYX01BWF9GUkFHUylcXG4gXFx0aWYgKHNrYl9zaGluZm8oc2tiKS1cXHUwMDNlbnJfZnJhZ3MgXFx1MDAzZSBUWF9NQVhfRlJBR1MpIHtcXG5AQCAtNTI0LDYgKzUyOCwxNCBAQCBzdGF0aWMgbmV0ZGV2X3R4X3QgYm54dF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpXFxuIFxcdFxcdFxcdHJldHVybiBORVRERVZfVFhfQlVTWTtcXG4gXFx0fVxcbiBcXG4rXFx0c3RhcnRfcHJvZCA9IHR4ci1cXHUwMDNldHhfcHJvZDtcXG4rXFx0c2tiID0gYm54dF9rdGxzX3htaXQoYnAsIHR4ciwgc2tiLCBcXHUwMDI2bGZsYWdzLCBcXHUwMDI2a2lkLCBcXHUwMDI2a2N0eF90eCk7XFxuK1xcdGlmICh1bmxpa2VseSghc2tiKSkge1xcbitcXHRcXHRkZXZfY29yZV9zdGF0c190eF9kcm9wcGVkX2luYyhkZXYpO1xcbitcXHRcXHRyZXR1cm4gTkVUREVWX1RYX09LO1xcbitcXHR9XFxuK1xcbitcXHRwcm9kID0gdHhyLVxcdTAwM2V0eF9wcm9kO1xcbiBcXHRsZW5ndGggPSBza2ItXFx1MDAzZWxlbjtcXG4gXFx0bGVuID0gc2tiX2hlYWRsZW4oc2tiKTtcXG4gXFx0bGFzdF9mcmFnID0gc2tiX3NoaW5mbyhza2IpLVxcdTAwM2Vucl9mcmFncztcXG5AQCAtNjcyLDcgKzY4NCw3IEBAIHN0YXRpYyBuZXRkZXZfdHhfdCBibnh0X3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldilcXG4gXFxuIFxcdHByb2QgPSBORVhUX1RYKHByb2QpO1xcbiBcXHR0eGJkMSA9IGJueHRfaW5pdF9leHRfYmQoYnAsIHR4ciwgcHJvZCwgbGZsYWdzLCB2bGFuX3RhZ19mbGFncyxcXG4tXFx0XFx0XFx0XFx0IGNmYV9hY3Rpb24pO1xcbitcXHRcXHRcXHRcXHQgY2ZhX2FjdGlvbiwga2lkKTtcXG4gXFxuIFxcdGlmIChza2JfaXNfZ3NvKHNrYikpIHtcXG4gXFx0XFx0Ym9vbCB1ZHBfZ3NvID0gISEoc2tiX3NoaW5mbyhza2IpLVxcdTAwM2Vnc29fdHlwZSBcXHUwMDI2IFNLQl9HU09fVURQX0w0KTtcXG5AQCAtNjkzLDkgKzcwNSwxMCBAQCBzdGF0aWMgbmV0ZGV2X3R4X3QgYm54dF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpXFxuIFxcbiBcXHRcXHR0eGJkMS1cXHUwMDNldHhfYmRfaHNpemVfbGZsYWdzIHw9IGNwdV90b19sZTMyKFRYX0JEX0ZMQUdTX0xTTyB8XFxuIFxcdFxcdFxcdFxcdFxcdFRYX0JEX0ZMQUdTX1RfSVBJRCB8XFxuLVxcdFxcdFxcdFxcdFxcdChoZHJfbGVuIFxcdTAwM2NcXHUwMDNjIChUWF9CRF9IU0laRV9TSElGVCAtIDEpKSk7XFxuK1xcdFxcdFxcdFxcdFxcdCgoaGRyX2xlbiBcXHUwMDNlXFx1MDAzZSAxKSBcXHUwMDNjXFx1MDAzYyBUWF9CRF9IU0laRV9TSElGVCkpO1xcbiBcXHRcXHRsZW5ndGggPSBza2Jfc2hpbmZvKHNrYiktXFx1MDAzZWdzb19zaXplO1xcbi1cXHRcXHR0eGJkMS1cXHUwMDNldHhfYmRfbXNzID0gY3B1X3RvX2xlMzIobGVuZ3RoKTtcXG4rXFx0XFx0dHhiZDEtXFx1MDAzZXR4X2JkX2tpZF9tc3MgPSBjcHVfdG9fbGUzMihCTlhUX1RYX0tJRF9ISShraWQpIHxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgKGxlbmd0aCBcXHUwMDI2IFRYX0JEX01TUykpO1xcbiBcXHRcXHRsZW5ndGggKz0gaGRyX2xlbjtcXG4gXFx0fSBlbHNlIGlmIChza2ItXFx1MDAzZWlwX3N1bW1lZCA9PSBDSEVDS1NVTV9QQVJUSUFMKSB7XFxuIFxcdFxcdHR4YmQxLVxcdTAwM2V0eF9iZF9oc2l6ZV9sZmxhZ3MgfD1cXG5AQCAtNzQ4LDYgKzc2MSw5IEBAIHN0YXRpYyBuZXRkZXZfdHhfdCBibnh0X3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldilcXG4gXFx0cHJvZCA9IE5FWFRfVFgocHJvZCk7XFxuIFxcdFdSSVRFX09OQ0UodHhyLVxcdTAwM2V0eF9wcm9kLCBwcm9kKTtcXG4gXFxuK1xcdC8qIENvbW1pdCB0aGUga1RMUyBzdGF0ZSBub3cgdGhhdCB0aGUgQkQgaXMgaW4gdGhlIHJpbmcuICovXFxuK1xcdGJueHRfa3Rsc194bWl0X2NvbW1pdCh0eHIsIGtjdHhfdHgpO1xcbitcXG4gXFx0aWYgKCFuZXRkZXZfeG1pdF9tb3JlKCkgfHwgbmV0aWZfeG1pdF9zdG9wcGVkKHR4cSkpIHtcXG4gXFx0XFx0Ym54dF90eHJfZGJfa2ljayhicCwgdHhyLCBwcm9kKTtcXG4gXFx0fSBlbHNlIHtcXG5AQCAtODAyLDkgKzgxOCwxNiBAQCBzdGF0aWMgbmV0ZGV2X3R4X3QgYm54dF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpXFxuIFxcdFxcdFxcdC8qIHNldCBTS0IgdG8gZXJyIHNvIFBUUCB3b3JrZXIgd2lsbCBjbGVhbiB1cCAqL1xcbiBcXHRcXHRcXHRwdHAtXFx1MDAzZXR4dHNfcmVxW3R4dHNfcHJvZF0udHhfc2tiID0gRVJSX1BUUigtRUlPKTtcXG4gXFx0fVxcbitcXHR0eHItXFx1MDAzZXR4X2J1Zl9yaW5nW1JJTkdfVFgoYnAsIHR4ci1cXHUwMDNldHhfcHJvZCldLnNrYiA9IE5VTEw7XFxuK1xcdC8qIFVud2luZCBhbnkga1RMUyBwcmVzeW5jIEJEcyAqL1xcbitcXHRpZiAodW5saWtlbHkodHhyLVxcdTAwM2V0eF9wcm9kICE9IHN0YXJ0X3Byb2QpKSB7XFxuK1xcdFxcdHR4X2J1ZiA9IFxcdTAwMjZ0eHItXFx1MDAzZXR4X2J1Zl9yaW5nW1JJTkdfVFgoYnAsIHN0YXJ0X3Byb2QpXTtcXG4rXFx0XFx0dHhfYnVmLVxcdTAwM2Vpc19wdXNoID0gMDtcXG4rXFx0XFx0dHhfYnVmLVxcdTAwM2VpbmxpbmVfZGF0YV9iZHMgPSAwO1xcbitcXHRcXHRXUklURV9PTkNFKHR4ci1cXHUwMDNldHhfcHJvZCwgc3RhcnRfcHJvZCk7XFxuK1xcdH1cXG4gXFx0aWYgKHR4ci1cXHUwMDNla2lja19wZW5kaW5nKVxcbiBcXHRcXHRibnh0X3R4cl9kYl9raWNrKGJwLCB0eHIsIHR4ci1cXHUwMDNldHhfcHJvZCk7XFxuLVxcdHR4ci1cXHUwMDNldHhfYnVmX3JpbmdbUklOR19UWChicCwgdHhyLVxcdTAwM2V0eF9wcm9kKV0uc2tiID0gTlVMTDtcXG4gXFx0ZGV2X2NvcmVfc3RhdHNfdHhfZHJvcHBlZF9pbmMoZGV2KTtcXG4gXFx0cmV0dXJuIE5FVERFVl9UWF9PSztcXG4gfVxcbkBAIC04MzMsNyArODU2LDcgQEAgc3RhdGljIGJvb2wgX19ibnh0X3R4X2ludChzdHJ1Y3QgYm54dCAqYnAsIHN0cnVjdCBibnh0X3R4X3JpbmdfaW5mbyAqdHhyLFxcbiBcXHRcXHRoZWFkX2J1ZiA9IHR4X2J1ZjtcXG4gXFx0XFx0c2tiID0gdHhfYnVmLVxcdTAwM2Vza2I7XFxuIFxcbi1cXHRcXHRpZiAodW5saWtlbHkoIXNrYikpIHtcXG4rXFx0XFx0aWYgKHVubGlrZWx5KCFza2IgXFx1MDAyNlxcdTAwMjYgIXR4X2J1Zi1cXHUwMDNlaXNfcHVzaCkpIHtcXG4gXFx0XFx0XFx0Ym54dF9zY2hlZF9yZXNldF90eHIoYnAsIHR4ciwgY29ucyk7XFxuIFxcdFxcdFxcdHJldHVybiByYztcXG4gXFx0XFx0fVxcbkBAIC04NDUsMTMgKzg2OCwyMiBAQCBzdGF0aWMgYm9vbCBfX2JueHRfdHhfaW50KHN0cnVjdCBibnh0ICpicCwgc3RydWN0IGJueHRfdHhfcmluZ19pbmZvICp0eHIsXFxuIFxcdFxcdH1cXG4gXFxuIFxcdFxcdGNvbnMgPSBORVhUX1RYKGNvbnMpO1xcbi1cXHRcXHR0eF9wa3RzKys7XFxuLVxcdFxcdHR4X2J5dGVzICs9IHNrYi1cXHUwMDNlbGVuO1xcbitcXHRcXHRpZiAoc2tiKSB7XFxuK1xcdFxcdFxcdHR4X3BrdHMrKztcXG4rXFx0XFx0XFx0dHhfYnl0ZXMgKz0gc2tiLVxcdTAwM2VsZW47XFxuK1xcdFxcdH1cXG4gXFx0XFx0dHhfYnVmLVxcdTAwM2Vza2IgPSBOVUxMO1xcbiBcXHRcXHR0eF9idWYtXFx1MDAzZWlzX3RzX3BrdCA9IDA7XFxuIFxcbiBcXHRcXHRpZiAodHhfYnVmLVxcdTAwM2Vpc19wdXNoKSB7XFxuIFxcdFxcdFxcdHR4X2J1Zi1cXHUwMDNlaXNfcHVzaCA9IDA7XFxuK1xcdFxcdFxcdGNvbnMgKz0gdHhfYnVmLVxcdTAwM2VpbmxpbmVfZGF0YV9iZHM7XFxuK1xcdFxcdFxcdHR4X2J1Zi1cXHUwMDNlaW5saW5lX2RhdGFfYmRzID0gMDtcXG4rXFx0XFx0XFx0aWYgKCFza2IpIHtcXG4rXFx0XFx0XFx0XFx0LyogcHJlc3luYyBCRCAqL1xcbitcXHRcXHRcXHRcXHRjb25zID0gTkVYVF9UWChjb25zKTtcXG4rXFx0XFx0XFx0XFx0Y29udGludWU7XFxuK1xcdFxcdFxcdH1cXG4gXFx0XFx0XFx0Z290byBuZXh0X3R4X2ludDtcXG4gXFx0XFx0fVxcbiBcXG5AQCAtMzExMyw2ICszMTQ1LDkgQEAgc3RhdGljIGludCBfX2JueHRfcG9sbF93b3JrKHN0cnVjdCBibnh0ICpicCwgc3RydWN0IGJueHRfY3BfcmluZ19pbmZvICpjcHIsXFxuIFxcdFxcdFxcdFxcdHJ4X3BrdHMrKztcXG4gXFx0XFx0XFx0ZWxzZSBpZiAocmMgPT0gLUVCVVNZKVxcdC8qIHBhcnRpYWwgY29tcGxldGlvbiAqL1xcbiBcXHRcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0fSBlbHNlIGlmIChjbXBfdHlwZSA9PSBDTVBfVFlQRV9NUENfQ01QKSB7XFxuK1xcdFxcdFxcdGlmIChibnh0X21wY19jbXAoYnAsIGNwciwgXFx1MDAyNnJhd19jb25zKSlcXG4rXFx0XFx0XFx0XFx0YnJlYWs7XFxuIFxcdFxcdH0gZWxzZSBpZiAodW5saWtlbHkoY21wX3R5cGUgPT0gQ01QTF9CQVNFX1RZUEVfSFdSTV9ET05FIHx8XFxuIFxcdFxcdFxcdFxcdCAgICBjbXBfdHlwZSA9PSBDTVBMX0JBU0VfVFlQRV9IV1JNX0ZXRF9SRVEgfHxcXG4gXFx0XFx0XFx0XFx0ICAgIGNtcF90eXBlID09IENNUExfQkFTRV9UWVBFX0hXUk1fQVNZTkNfRVZFTlQpKSB7XFxuQEAgLTM2ODQsNyArMzcxOSw3IEBAIHN0YXRpYyBzaXplX3QgX19ibnh0X2NvcHlfcmluZyhzdHJ1Y3QgYm54dCAqYnAsIHN0cnVjdCBibnh0X3JpbmdfbWVtX2luZm8gKnJtZW0sXFxuIFxcdHJldHVybiB0b3RhbF9sZW47XFxuIH1cXG4gXFxuLXN0YXRpYyB2b2lkIGJueHRfZnJlZV9yaW5nKHN0cnVjdCBibnh0ICpicCwgc3RydWN0IGJueHRfcmluZ19tZW1faW5mbyAqcm1lbSlcXG4rdm9pZCBibnh0X2ZyZWVfcmluZyhzdHJ1Y3QgYm54dCAqYnAsIHN0cnVjdCBibnh0X3JpbmdfbWVtX2luZm8gKnJtZW0pXFxuIHtcXG4gXFx0c3RydWN0IHBjaV9kZXYgKnBkZXYgPSBicC1cXHUwMDNlcGRldjtcXG4gXFx0aW50IGk7XFxuQEAgLTM3MTcsNyArMzc1Miw3IEBAIHN0YXRpYyB2b2lkIGJueHRfZnJlZV9yaW5nKHN0cnVjdCBibnh0ICpicCwgc3RydWN0IGJueHRfcmluZ19tZW1faW5mbyAqcm1lbSlcXG4gXFx0fVxcbiB9XFxuIFxcbi1zdGF0aWMgaW50IGJueHRfYWxsb2NfcmluZyhzdHJ1Y3QgYm54dCAqYnAsIHN0cnVjdCBibnh0X3JpbmdfbWVtX2luZm8gKnJtZW0pXFxuK2ludCBibnh0X2FsbG9jX3Jpbmcoc3RydWN0IGJueHQgKmJwLCBzdHJ1Y3QgYm54dF9yaW5nX21lbV9pbmZvICpybWVtKVxcbiB7XFxuIFxcdHN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gYnAtXFx1MDAzZXBkZXY7XFxuIFxcdHU2NCB2YWxpZF9iaXQgPSAwO1xcbkBAIC00MDc5LDYgKzQxMTQsOCBAQCBzdGF0aWMgdm9pZCBibnh0X2ZyZWVfdHhfcmluZ3Moc3RydWN0IGJueHQgKmJwKVxcbiBcXG4gXFx0XFx0Ym54dF9mcmVlX3R4X2lubGluZV9idWYodHhyLCBwZGV2KTtcXG4gXFxuK1xcdFxcdGJueHRfa3Rsc19mcmVlX3R4X3Jpbmdfc3RhdHModHhyKTtcXG4rXFxuIFxcdFxcdHJpbmcgPSBcXHUwMDI2dHhyLVxcdTAwM2V0eF9yaW5nX3N0cnVjdDtcXG4gXFxuIFxcdFxcdGJueHRfZnJlZV9yaW5nKGJwLCBcXHUwMDI2cmluZy1cXHUwMDNlcmluZ19tZW0pO1xcbkBAIC00MTUzLDcgKzQxOTAsMTAgQEAgc3RhdGljIGludCBibnh0X2FsbG9jX3R4X3JpbmdzKHN0cnVjdCBibnh0ICpicClcXG4gXFx0XFx0fVxcbiBcXHRcXHRxaWR4ID0gYnAtXFx1MDAzZXRjX3RvX3FpZHhbal07XFxuIFxcdFxcdHJpbmctXFx1MDAzZXF1ZXVlX2lkID0gYnAtXFx1MDAzZXFfaW5mb1txaWR4XS5xdWV1ZV9pZDtcXG4tXFx0XFx0c3Bpbl9sb2NrX2luaXQoXFx1MDAyNnR4ci1cXHUwMDNleGRwX3R4X2xvY2spO1xcbitcXHRcXHRzcGluX2xvY2tfaW5pdChcXHUwMDI2dHhyLVxcdTAwM2V0eF9sb2NrKTtcXG4rXFx0XFx0cmMgPSBibnh0X2t0bHNfYWxsb2NfdHhfcmluZ19zdGF0cyhicCwgdHhyKTtcXG4rXFx0XFx0aWYgKHJjKVxcbitcXHRcXHRcXHRyZXR1cm4gcmM7XFxuIFxcdFxcdGlmIChpIFxcdTAwM2MgYnAtXFx1MDAzZXR4X25yX3JpbmdzX3hkcClcXG4gXFx0XFx0XFx0Y29udGludWU7XFxuIFxcdFxcdGlmIChCTlhUX1JJTkdfVE9fVENfT0ZGKGJwLCBpKSA9PSAoYnAtXFx1MDAzZXR4X25yX3JpbmdzX3Blcl90YyAtIDEpKVxcbkBAIC00MzI0LDYgKzQzNjQsOCBAQCBzdGF0aWMgaW50IGJueHRfYWxsb2NfY3BfcmluZ3Moc3RydWN0IGJueHQgKmJwKVxcbiBcXHRcXHRcXHQgKCFzaCBcXHUwMDI2XFx1MDAyNiBpIFxcdTAwM2U9IGJwLVxcdTAwM2VyeF9ucl9yaW5ncykpIHtcXG4gXFx0XFx0XFx0Y3BfY291bnQgKz0gdGNzO1xcbiBcXHRcXHRcXHR0eCA9IDE7XFxuK1xcdFxcdFxcdGlmIChibnh0X25hcGlfaGFzX21wYyhicCwgaSkpXFxuK1xcdFxcdFxcdFxcdGNwX2NvdW50Kys7XFxuIFxcdFxcdH1cXG4gXFxuIFxcdFxcdGNwci1cXHUwMDNlY3BfcmluZ19hcnIgPSBremFsbG9jX29ianMoKmNwciwgY3BfY291bnQpO1xcbkBAIC00MzQ1LDYgKzQzODcsMTEgQEAgc3RhdGljIGludCBibnh0X2FsbG9jX2NwX3JpbmdzKHN0cnVjdCBibnh0ICpicClcXG4gXFx0XFx0XFx0fSBlbHNlIHtcXG4gXFx0XFx0XFx0XFx0aW50IG4sIHRjID0gayAtIHJ4O1xcbiBcXG4rXFx0XFx0XFx0XFx0LyogTVBDIHJpbmdzIGFyZSBhdCB0aGUgaGlnaGVzdCBrIGluZGljZXMgKi9cXG4rXFx0XFx0XFx0XFx0aWYgKHRjIFxcdTAwM2U9IHRjcykge1xcbitcXHRcXHRcXHRcXHRcXHRibnh0X3NldF9tcGNfY3BfcmluZyhicCwgaSwgY3ByMik7XFxuK1xcdFxcdFxcdFxcdFxcdGNvbnRpbnVlO1xcbitcXHRcXHRcXHRcXHR9XFxuIFxcdFxcdFxcdFxcdG4gPSBCTlhUX1RDX1RPX1JJTkdfQkFTRShicCwgdGMpICsgajtcXG4gXFx0XFx0XFx0XFx0YnAtXFx1MDAzZXR4X3Jpbmdbbl0udHhfY3ByID0gY3ByMjtcXG4gXFx0XFx0XFx0XFx0Y3ByMi1cXHUwMDNlY3BfcmluZ190eXBlID0gQk5YVF9OUV9IRExfVFlQRV9UWDtcXG5AQCAtNDQ3Nyw2ICs0NTI0LDcgQEAgc3RhdGljIHZvaWQgYm54dF9pbml0X3Jpbmdfc3RydWN0KHN0cnVjdCBibnh0ICpicClcXG4gXFx0XFx0XFx0cm1lbS1cXHUwMDNldm1lbSA9ICh2b2lkICoqKVxcdTAwMjZ0eHItXFx1MDAzZXR4X2J1Zl9yaW5nO1xcbiBcXHRcXHR9XFxuIFxcdH1cXG4rXFx0Ym54dF9pbml0X21wY19yaW5nX3N0cnVjdChicCk7XFxuIH1cXG4gXFxuIHN0YXRpYyB2b2lkIGJueHRfaW5pdF9yeGJkX3BhZ2VzKHN0cnVjdCBibnh0X3Jpbmdfc3RydWN0ICpyaW5nLCB1MzIgdHlwZSlcXG5AQCAtNTU1Myw2ICs1NjAxLDcgQEAgc3RhdGljIHZvaWQgYm54dF9pbml0X2wyX2ZsdHJfdGJsKHN0cnVjdCBibnh0ICpicClcXG4gc3RhdGljIHZvaWQgYm54dF9mcmVlX21lbShzdHJ1Y3QgYm54dCAqYnAsIGJvb2wgaXJxX3JlX2luaXQpXFxuIHtcXG4gXFx0Ym54dF9mcmVlX3ZuaWNfYXR0cmlidXRlcyhicCk7XFxuK1xcdGJueHRfZnJlZV9tcGNfcmluZ3MoYnApO1xcbiBcXHRibnh0X2ZyZWVfdHhfcmluZ3MoYnApO1xcbiBcXHRibnh0X2ZyZWVfcnhfcmluZ3MoYnApO1xcbiBcXHRibnh0X2ZyZWVfY3BfcmluZ3MoYnApO1xcbkBAIC01NTY2LDYgKzU2MTUsNyBAQCBzdGF0aWMgdm9pZCBibnh0X2ZyZWVfbWVtKHN0cnVjdCBibnh0ICpicCwgYm9vbCBpcnFfcmVfaW5pdClcXG4gXFx0XFx0XFx0Ym54dF9mcmVlX3BvcnRfc3RhdHMoYnApO1xcbiBcXHRcXHRibnh0X2ZyZWVfcmluZ19ncnBzKGJwKTtcXG4gXFx0XFx0Ym54dF9mcmVlX3ZuaWNzKGJwKTtcXG4rXFx0XFx0Ym54dF9mcmVlX21wY3MoYnApO1xcbiBcXHRcXHRrZnJlZShicC1cXHUwMDNldHhfcmluZ19tYXApO1xcbiBcXHRcXHRicC1cXHUwMDNldHhfcmluZ19tYXAgPSBOVUxMO1xcbiBcXHRcXHRrZnJlZShicC1cXHUwMDNldHhfcmluZyk7XFxuQEAgLTU2NzUsNiArNTcyNSwxMCBAQCBzdGF0aWMgaW50IGJueHRfYWxsb2NfbWVtKHN0cnVjdCBibnh0ICpicCwgYm9vbCBpcnFfcmVfaW5pdClcXG4gXFx0XFx0XFx0XFx0dHhyLVxcdTAwM2V0eF9jcHIgPSBcXHUwMDI2Ym5hcGkyLVxcdTAwM2VjcF9yaW5nO1xcbiBcXHRcXHR9XFxuIFxcbitcXHRcXHRyYyA9IGJueHRfYWxsb2NfbXBjcyhicCk7XFxuK1xcdFxcdGlmIChyYylcXG4rXFx0XFx0XFx0Z290byBhbGxvY19tZW1fZXJyO1xcbitcXG4gXFx0XFx0cmMgPSBibnh0X2FsbG9jX3N0YXRzKGJwKTtcXG4gXFx0XFx0aWYgKHJjKVxcbiBcXHRcXHRcXHRnb3RvIGFsbG9jX21lbV9lcnI7XFxuQEAgLTU3MDMsNiArNTc1NywxMCBAQCBzdGF0aWMgaW50IGJueHRfYWxsb2NfbWVtKHN0cnVjdCBibnh0ICpicCwgYm9vbCBpcnFfcmVfaW5pdClcXG4gXFx0aWYgKHJjKVxcbiBcXHRcXHRnb3RvIGFsbG9jX21lbV9lcnI7XFxuIFxcbitcXHRyYyA9IGJueHRfYWxsb2NfbXBjX3JpbmdzKGJwKTtcXG4rXFx0aWYgKHJjKVxcbitcXHRcXHRnb3RvIGFsbG9jX21lbV9lcnI7XFxuK1xcbiBcXHRyYyA9IGJueHRfYWxsb2NfY3BfcmluZ3MoYnApO1xcbiBcXHRpZiAocmMpXFxuIFxcdFxcdGdvdG8gYWxsb2NfbWVtX2VycjtcXG5AQCAtNzI1NywxMCArNzMxNSwxNSBAQCBzdGF0aWMgaW50IGh3cm1fcmluZ19hbGxvY19zZW5kX21zZyhzdHJ1Y3QgYm54dCAqYnAsXFxuIFxcdFxcdHJlcS1cXHUwMDNlY21wbF9yaW5nX2lkID0gY3B1X3RvX2xlMTYoYm54dF9jcF9yaW5nX2Zvcl90eChicCwgdHhyKSk7XFxuIFxcdFxcdHJlcS1cXHUwMDNlbGVuZ3RoID0gY3B1X3RvX2xlMzIoYnAtXFx1MDAzZXR4X3JpbmdfbWFzayArIDEpO1xcbiBcXHRcXHRyZXEtXFx1MDAzZXN0YXRfY3R4X2lkID0gY3B1X3RvX2xlMzIoZ3JwX2luZm8tXFx1MDAzZWZ3X3N0YXRzX2N0eCk7XFxuLVxcdFxcdHJlcS1cXHUwMDNlcXVldWVfaWQgPSBjcHVfdG9fbGUxNihyaW5nLVxcdTAwM2VxdWV1ZV9pZCk7XFxuLVxcdFxcdGlmIChicC1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBCTlhUX0ZMQUdfVFhfQ09BTF9DTVBMKVxcbi1cXHRcXHRcXHRyZXEtXFx1MDAzZWNtcGxfY29hbF9jbnQgPVxcbi1cXHRcXHRcXHRcXHRSSU5HX0FMTE9DX1JFUV9DTVBMX0NPQUxfQ05UX0NPQUxfNjQ7XFxuK1xcdFxcdGlmIChyaW5nLVxcdTAwM2VxdWV1ZV9pZCA9PSBCTlhUX01QQ19RVUVVRV9JRCkge1xcbitcXHRcXHRcXHRyZXEtXFx1MDAzZW1wY19jaG5sc190eXBlID0gcmluZy1cXHUwMDNlbXBjX2NobmxfdHlwZTtcXG4rXFx0XFx0XFx0cmVxLVxcdTAwM2VlbmFibGVzIHw9IGNwdV90b19sZTMyKFJJTkdfQUxMT0NfUkVRX0VOQUJMRVNfTVBDX0NITkxTX1RZUEUpO1xcbitcXHRcXHR9IGVsc2Uge1xcbitcXHRcXHRcXHRyZXEtXFx1MDAzZXF1ZXVlX2lkID0gY3B1X3RvX2xlMTYocmluZy1cXHUwMDNlcXVldWVfaWQpO1xcbitcXHRcXHRcXHRpZiAoYnAtXFx1MDAzZWZsYWdzIFxcdTAwMjYgQk5YVF9GTEFHX1RYX0NPQUxfQ01QTClcXG4rXFx0XFx0XFx0XFx0cmVxLVxcdTAwM2VjbXBsX2NvYWxfY250ID1cXG4rXFx0XFx0XFx0XFx0XFx0UklOR19BTExPQ19SRVFfQ01QTF9DT0FMX0NOVF9DT0FMXzY0O1xcbitcXHRcXHR9XFxuIFxcdFxcdGlmICgoYnAtXFx1MDAzZWZ3X2NhcCBcXHUwMDI2IEJOWFRfRldfQ0FQX1RYX1RTX0NNUCkgXFx1MDAyNlxcdTAwMjYgYnAtXFx1MDAzZXB0cF9jZmcpXFxuIFxcdFxcdFxcdGZsYWdzIHw9IFJJTkdfQUxMT0NfUkVRX0ZMQUdTX1RYX1BLVF9UU19DTVBMX0VOQUJMRTtcXG4gXFx0XFx0cmVxLVxcdTAwM2VmbGFncyA9IGNwdV90b19sZTE2KGZsYWdzKTtcXG5AQCAtNzQ1NSw4ICs3NTE4LDcgQEAgc3RhdGljIGludCBibnh0X2h3cm1fcnhfYWdnX3JpbmdfYWxsb2Moc3RydWN0IGJueHQgKmJwLFxcbiBcXHRyZXR1cm4gMDtcXG4gfVxcbiBcXG4tc3RhdGljIGludCBibnh0X2h3cm1fY3BfcmluZ19hbGxvY19wNShzdHJ1Y3QgYm54dCAqYnAsXFxuLVxcdFxcdFxcdFxcdCAgICAgIHN0cnVjdCBibnh0X2NwX3JpbmdfaW5mbyAqY3ByKVxcbitpbnQgYm54dF9od3JtX2NwX3JpbmdfYWxsb2NfcDUoc3RydWN0IGJueHQgKmJwLCBzdHJ1Y3QgYm54dF9jcF9yaW5nX2luZm8gKmNwcilcXG4ge1xcbiBcXHRjb25zdCB1MzIgdHlwZSA9IEhXUk1fUklOR19BTExPQ19DTVBMO1xcbiBcXHRzdHJ1Y3QgYm54dF9uYXBpICpibmFwaSA9IGNwci1cXHUwMDNlYm5hcGk7XFxuQEAgLTc0NzQsOCArNzUzNiw4IEBAIHN0YXRpYyBpbnQgYm54dF9od3JtX2NwX3JpbmdfYWxsb2NfcDUoc3RydWN0IGJueHQgKmJwLFxcbiBcXHRyZXR1cm4gMDtcXG4gfVxcbiBcXG4tc3RhdGljIGludCBibnh0X2h3cm1fdHhfcmluZ19hbGxvYyhzdHJ1Y3QgYm54dCAqYnAsXFxuLVxcdFxcdFxcdFxcdCAgIHN0cnVjdCBibnh0X3R4X3JpbmdfaW5mbyAqdHhyLCB1MzIgdHhfaWR4KVxcbitpbnQgYm54dF9od3JtX3R4X3JpbmdfYWxsb2Moc3RydWN0IGJueHQgKmJwLCBzdHJ1Y3QgYm54dF90eF9yaW5nX2luZm8gKnR4cixcXG4rXFx0XFx0XFx0ICAgIHUzMiB0eF9pZHgpXFxuIHtcXG4gXFx0c3RydWN0IGJueHRfcmluZ19zdHJ1Y3QgKnJpbmcgPSBcXHUwMDI2dHhyLVxcdTAwM2V0eF9yaW5nX3N0cnVjdDtcXG4gXFx0Y29uc3QgdTMyIHR5cGUgPSBIV1JNX1JJTkdfQUxMT0NfVFg7XFxuQEAgLTc1NjAsNiArNzYyMiw5IEBAIHN0YXRpYyBpbnQgYm54dF9od3JtX3JpbmdfYWxsb2Moc3RydWN0IGJueHQgKmJwKVxcbiBcXHRcXHRcXHRcXHRnb3RvIGVycl9vdXQ7XFxuIFxcdFxcdH1cXG4gXFx0fVxcbitcXG4rXFx0cmMgPSBibnh0X2h3cm1fbXBjX3JpbmdfYWxsb2MoYnApO1xcbitcXG4gZXJyX291dDpcXG4gXFx0cmV0dXJuIHJjO1xcbiB9XFxuQEAgLTc2MTcsOSArNzY4Miw4IEBAIHN0YXRpYyBpbnQgaHdybV9yaW5nX2ZyZWVfc2VuZF9tc2coc3RydWN0IGJueHQgKmJwLFxcbiBcXHRyZXR1cm4gMDtcXG4gfVxcbiBcXG4tc3RhdGljIHZvaWQgYm54dF9od3JtX3R4X3JpbmdfZnJlZShzdHJ1Y3QgYm54dCAqYnAsXFxuLVxcdFxcdFxcdFxcdCAgIHN0cnVjdCBibnh0X3R4X3JpbmdfaW5mbyAqdHhyLFxcbi1cXHRcXHRcXHRcXHQgICBib29sIGNsb3NlX3BhdGgpXFxuK3ZvaWQgYm54dF9od3JtX3R4X3JpbmdfZnJlZShzdHJ1Y3QgYm54dCAqYnAsIHN0cnVjdCBibnh0X3R4X3JpbmdfaW5mbyAqdHhyLFxcbitcXHRcXHRcXHQgICAgYm9vbCBjbG9zZV9wYXRoKVxcbiB7XFxuIFxcdHN0cnVjdCBibnh0X3Jpbmdfc3RydWN0ICpyaW5nID0gXFx1MDAyNnR4ci1cXHUwMDNldHhfcmluZ19zdHJ1Y3Q7XFxuIFxcdHUzMiBjbXBsX3JpbmdfaWQ7XFxuQEAgLTc2NzgsOCArNzc0Miw3IEBAIHN0YXRpYyB2b2lkIGJueHRfaHdybV9yeF9hZ2dfcmluZ19mcmVlKHN0cnVjdCBibnh0ICpicCxcXG4gXFx0YnAtXFx1MDAzZWdycF9pbmZvW2dycF9pZHhdLmFnZ19md19yaW5nX2lkID0gSU5WQUxJRF9IV19SSU5HX0lEO1xcbiB9XFxuIFxcbi1zdGF0aWMgdm9pZCBibnh0X2h3cm1fY3BfcmluZ19mcmVlKHN0cnVjdCBibnh0ICpicCxcXG4tXFx0XFx0XFx0XFx0ICAgc3RydWN0IGJueHRfY3BfcmluZ19pbmZvICpjcHIpXFxuK3ZvaWQgYm54dF9od3JtX2NwX3JpbmdfZnJlZShzdHJ1Y3QgYm54dCAqYnAsIHN0cnVjdCBibnh0X2NwX3JpbmdfaW5mbyAqY3ByKVxcbiB7XFxuIFxcdHN0cnVjdCBibnh0X3Jpbmdfc3RydWN0ICpyaW5nO1xcbiBcXG5AQCAtNzY5Miw3ICs3NzU1LDcgQEAgc3RhdGljIHZvaWQgYm54dF9od3JtX2NwX3JpbmdfZnJlZShzdHJ1Y3QgYm54dCAqYnAsXFxuIFxcdHJpbmctXFx1MDAzZWZ3X3JpbmdfaWQgPSBJTlZBTElEX0hXX1JJTkdfSUQ7XFxuIH1cXG4gXFxuLXN0YXRpYyB2b2lkIGJueHRfY2xlYXJfb25lX2NwX3Jpbmcoc3RydWN0IGJueHQgKmJwLCBzdHJ1Y3QgYm54dF9jcF9yaW5nX2luZm8gKmNwcilcXG4rdm9pZCBibnh0X2NsZWFyX29uZV9jcF9yaW5nKHN0cnVjdCBibnh0ICpicCwgc3RydWN0IGJueHRfY3BfcmluZ19pbmZvICpjcHIpXFxuIHtcXG4gXFx0c3RydWN0IGJueHRfcmluZ19zdHJ1Y3QgKnJpbmcgPSBcXHUwMDI2Y3ByLVxcdTAwM2VjcF9yaW5nX3N0cnVjdDtcXG4gXFx0aW50IGksIHNpemUgPSByaW5nLVxcdTAwM2VyaW5nX21lbS5wYWdlX3NpemU7XFxuQEAgLTc3MTMsNiArNzc3Niw4IEBAIHN0YXRpYyB2b2lkIGJueHRfaHdybV9yaW5nX2ZyZWUoc3RydWN0IGJueHQgKmJwLCBib29sIGNsb3NlX3BhdGgpXFxuIFxcdGlmICghYnAtXFx1MDAzZWJuYXBpKVxcbiBcXHRcXHRyZXR1cm47XFxuIFxcbitcXHRibnh0X2h3cm1fbXBjX3JpbmdfZnJlZShicCwgY2xvc2VfcGF0aCk7XFxuK1xcbiBcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgYnAtXFx1MDAzZXR4X25yX3JpbmdzOyBpKyspXFxuIFxcdFxcdGJueHRfaHdybV90eF9yaW5nX2ZyZWUoYnAsIFxcdTAwMjZicC1cXHUwMDNldHhfcmluZ1tpXSwgY2xvc2VfcGF0aCk7XFxuIFxcbkBAIC03NzUxLDYgKzc4MTYsMTEgQEAgc3RhdGljIHZvaWQgYm54dF9od3JtX3JpbmdfZnJlZShzdHJ1Y3QgYm54dCAqYnAsIGJvb2wgY2xvc2VfcGF0aClcXG4gXFx0fVxcbiB9XFxuIFxcbitpbnQgYm54dF90b3RhbF90eF9yaW5ncyhzdHJ1Y3QgYm54dCAqYnApXFxuK3tcXG4rXFx0cmV0dXJuIGJwLVxcdTAwM2V0eF9ucl9yaW5ncyArIGJueHRfbXBjX3R4X3JpbmdzX2luX3VzZShicCk7XFxuK31cXG4rXFxuIHN0YXRpYyBpbnQgX19ibnh0X3RyaW1fcmluZ3Moc3RydWN0IGJueHQgKmJwLCBpbnQgKnJ4LCBpbnQgKnR4LCBpbnQgbWF4LFxcbiBcXHRcXHRcXHQgICAgIGJvb2wgc2hhcmVkKTtcXG4gc3RhdGljIGludCBibnh0X3RyaW1fcmluZ3Moc3RydWN0IGJueHQgKmJwLCBpbnQgKnJ4LCBpbnQgKnR4LCBpbnQgbWF4LFxcbkBAIC03NzU5LDYgKzc4MjksNyBAQCBzdGF0aWMgaW50IGJueHRfdHJpbV9yaW5ncyhzdHJ1Y3QgYm54dCAqYnAsIGludCAqcngsIGludCAqdHgsIGludCBtYXgsXFxuIHN0YXRpYyBpbnQgYm54dF9od3JtX2dldF9yaW5ncyhzdHJ1Y3QgYm54dCAqYnApXFxuIHtcXG4gXFx0c3RydWN0IGJueHRfaHdfcmVzYyAqaHdfcmVzYyA9IFxcdTAwMjZicC1cXHUwMDNlaHdfcmVzYztcXG4rXFx0c3RydWN0IGJueHRfaHdfY3J5cHRvX3Jlc2MgKmNyeXB0b19yZXNjO1xcbiBcXHRzdHJ1Y3QgaHdybV9mdW5jX3FjZmdfb3V0cHV0ICpyZXNwO1xcbiBcXHRzdHJ1Y3QgaHdybV9mdW5jX3FjZmdfaW5wdXQgKnJlcTtcXG4gXFx0aW50IHJjO1xcbkBAIC03NzkxLDI1ICs3ODYyLDM4IEBAIHN0YXRpYyBpbnQgYm54dF9od3JtX2dldF9yaW5ncyhzdHJ1Y3QgYm54dCAqYnApXFxuIFxcdFxcdHN0YXRzID0gbGUxNl90b19jcHUocmVzcC1cXHUwMDNlYWxsb2Nfc3RhdF9jdHgpO1xcbiBcXHRcXHRod19yZXNjLVxcdTAwM2VyZXN2X2lycXMgPSBjcDtcXG4gXFx0XFx0aWYgKGJwLVxcdTAwM2VmbGFncyBcXHUwMDI2IEJOWFRfRkxBR19DSElQX1A1X1BMVVMpIHtcXG4rXFx0XFx0XFx0aW50IG1wY190eCA9IGJueHRfbXBjX3R4X3JpbmdzX2luX3VzZShicCk7XFxuK1xcdFxcdFxcdGludCBtcGNfY3AgPSBibnh0X21wY19jcF9yaW5nc19pbl91c2UoYnApO1xcbiBcXHRcXHRcXHRpbnQgcnggPSBod19yZXNjLVxcdTAwM2VyZXN2X3J4X3JpbmdzO1xcbiBcXHRcXHRcXHRpbnQgdHggPSBod19yZXNjLVxcdTAwM2VyZXN2X3R4X3JpbmdzO1xcbitcXHRcXHRcXHRpbnQgY3BfcDU7XFxuIFxcbitcXHRcXHRcXHRpZiAodHggXFx1MDAzYz0gbXBjX3R4IHx8IGNwIFxcdTAwM2M9IG1wY19jcCkge1xcbitcXHRcXHRcXHRcXHRyYyA9IC1FTk9NRU07XFxuK1xcdFxcdFxcdFxcdGdvdG8gZ2V0X3JpbmdzX2V4aXQ7XFxuK1xcdFxcdFxcdH1cXG4rXFx0XFx0XFx0dHggLT0gbXBjX3R4O1xcbitcXHRcXHRcXHRjcF9wNSA9IGNwIC0gbXBjX2NwO1xcbiBcXHRcXHRcXHRpZiAoYnAtXFx1MDAzZWZsYWdzIFxcdTAwMjYgQk5YVF9GTEFHX0FHR19SSU5HUylcXG4gXFx0XFx0XFx0XFx0cnggXFx1MDAzZVxcdTAwM2U9IDE7XFxuLVxcdFxcdFxcdGlmIChjcCBcXHUwMDNjIChyeCArIHR4KSkge1xcbi1cXHRcXHRcXHRcXHRyYyA9IF9fYm54dF90cmltX3JpbmdzKGJwLCBcXHUwMDI2cngsIFxcdTAwMjZ0eCwgY3AsIGZhbHNlKTtcXG4rXFx0XFx0XFx0aWYgKGNwX3A1IFxcdTAwM2MgKHJ4ICsgdHgpKSB7XFxuK1xcdFxcdFxcdFxcdHJjID0gX19ibnh0X3RyaW1fcmluZ3MoYnAsIFxcdTAwMjZyeCwgXFx1MDAyNnR4LCBjcF9wNSwgZmFsc2UpO1xcbiBcXHRcXHRcXHRcXHRpZiAocmMpXFxuIFxcdFxcdFxcdFxcdFxcdGdvdG8gZ2V0X3JpbmdzX2V4aXQ7XFxuIFxcdFxcdFxcdFxcdGlmIChicC1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBCTlhUX0ZMQUdfQUdHX1JJTkdTKVxcbiBcXHRcXHRcXHRcXHRcXHRyeCBcXHUwMDNjXFx1MDAzYz0gMTtcXG4gXFx0XFx0XFx0XFx0aHdfcmVzYy1cXHUwMDNlcmVzdl9yeF9yaW5ncyA9IHJ4O1xcbi1cXHRcXHRcXHRcXHRod19yZXNjLVxcdTAwM2VyZXN2X3R4X3JpbmdzID0gdHg7XFxuK1xcdFxcdFxcdFxcdGh3X3Jlc2MtXFx1MDAzZXJlc3ZfdHhfcmluZ3MgPSB0eCArIG1wY190eDtcXG4gXFx0XFx0XFx0fVxcbiBcXHRcXHRcXHRod19yZXNjLVxcdTAwM2VyZXN2X2lycXMgPSBsZTE2X3RvX2NwdShyZXNwLVxcdTAwM2VhbGxvY19tc2l4KTtcXG4gXFx0XFx0XFx0aHdfcmVzYy1cXHUwMDNlcmVzdl9od19yaW5nX2dycHMgPSByeDtcXG4gXFx0XFx0fVxcbiBcXHRcXHRod19yZXNjLVxcdTAwM2VyZXN2X2NwX3JpbmdzID0gY3A7XFxuIFxcdFxcdGh3X3Jlc2MtXFx1MDAzZXJlc3Zfc3RhdF9jdHhzID0gc3RhdHM7XFxuK1xcbitcXHRcXHRjcnlwdG9fcmVzYyA9IFxcdTAwMjZod19yZXNjLVxcdTAwM2VjcnlwdG9fcmVzYztcXG4rXFx0XFx0Y3J5cHRvX3Jlc2MtXFx1MDAzZXJlc3ZfdHhfa2V5X2N0eHMgPSBsZTMyX3RvX2NwdShyZXNwLVxcdTAwM2VudW1fa3Rsc190eF9rZXlfY3R4cyk7XFxuK1xcdFxcdGNyeXB0b19yZXNjLVxcdTAwM2VyZXN2X3J4X2tleV9jdHhzID0gbGUzMl90b19jcHUocmVzcC1cXHUwMDNlbnVtX2t0bHNfcnhfa2V5X2N0eHMpO1xcbiBcXHR9XFxuIGdldF9yaW5nc19leGl0OlxcbiBcXHRod3JtX3JlcV9kcm9wKGJwLCByZXEpO1xcbkBAIC03ODgwLDggKzc5NjQsOSBAQCBfX2JueHRfaHdybV9yZXNlcnZlX3BmX3JpbmdzKHN0cnVjdCBibnh0ICpicCwgc3RydWN0IGJueHRfaHdfcmluZ3MgKmh3cilcXG4gXFx0XFx0fVxcbiBcXHRcXHRyZXEtXFx1MDAzZW51bV9zdGF0X2N0eHMgPSBjcHVfdG9fbGUxNihod3ItXFx1MDAzZXN0YXQpO1xcbiBcXHRcXHRyZXEtXFx1MDAzZW51bV92bmljcyA9IGNwdV90b19sZTE2KGh3ci1cXHUwMDNldm5pYyk7XFxuK1xcdFxcdGJueHRfaHdybV9yZXNlcnZlX3BmX2tleV9jdHhzKGJwLCByZXEpO1xcbiBcXHR9XFxuLVxcdHJlcS1cXHUwMDNlZW5hYmxlcyA9IGNwdV90b19sZTMyKGVuYWJsZXMpO1xcbitcXHRyZXEtXFx1MDAzZWVuYWJsZXMgfD0gY3B1X3RvX2xlMzIoZW5hYmxlcyk7XFxuIFxcdHJldHVybiByZXE7XFxuIH1cXG4gXFxuQEAgLTc5OTUsNyArODA4MCw3IEBAIHN0YXRpYyBpbnQgYm54dF9jcF9yaW5nc19pbl91c2Uoc3RydWN0IGJueHQgKmJwKVxcbiBcXHRcXHRyZXR1cm4gYm54dF9ucV9yaW5nc19pbl91c2UoYnApO1xcbiBcXG4gXFx0Y3AgPSBicC1cXHUwMDNldHhfbnJfcmluZ3MgKyBicC1cXHUwMDNlcnhfbnJfcmluZ3M7XFxuLVxcdHJldHVybiBjcDtcXG4rXFx0cmV0dXJuIGNwICsgYm54dF9tcGNfY3BfcmluZ3NfaW5fdXNlKGJwKTtcXG4gfVxcbiBcXG4gc3RhdGljIGludCBibnh0X2dldF9mdW5jX3N0YXRfY3R4cyhzdHJ1Y3QgYm54dCAqYnApXFxuQEAgLTgwNTMsNyArODEzOCw3IEBAIHN0YXRpYyB2b2lkIGJueHRfZ2V0X3RvdGFsX3Jlc291cmNlcyhzdHJ1Y3QgYm54dCAqYnAsIHN0cnVjdCBibnh0X2h3X3JpbmdzICpod3IpXFxuIFxcdGh3ci1cXHUwMDNlY3BfcDUgPSAwO1xcbiBcXHRpZiAoYnAtXFx1MDAzZWZsYWdzIFxcdTAwMjYgQk5YVF9GTEFHX0NISVBfUDVfUExVUylcXG4gXFx0XFx0aHdyLVxcdTAwM2VjcF9wNSA9IGJueHRfY3BfcmluZ3NfaW5fdXNlKGJwKTtcXG4tXFx0aHdyLVxcdTAwM2V0eCA9IGJwLVxcdTAwM2V0eF9ucl9yaW5ncztcXG4rXFx0aHdyLVxcdTAwM2V0eCA9IGJueHRfdG90YWxfdHhfcmluZ3MoYnApO1xcbiBcXHRod3ItXFx1MDAzZXJ4ID0gYnAtXFx1MDAzZXJ4X25yX3JpbmdzO1xcbiBcXHRod3ItXFx1MDAzZWdycCA9IGh3ci1cXHUwMDNlcng7XFxuIFxcdGh3ci1cXHUwMDNldm5pYyA9IGJueHRfZ2V0X3RvdGFsX3ZuaWNzKGJwLCBod3ItXFx1MDAzZXJ4KTtcXG5AQCAtODE1OSw4ICs4MjQ0LDEwIEBAIHN0YXRpYyBpbnQgX19ibnh0X3Jlc2VydmVfcmluZ3Moc3RydWN0IGJueHQgKmJwKVxcbiBcXHRod3IucnggPSBicC1cXHUwMDNlcnhfbnJfcmluZ3M7XFxuIFxcdGlmIChicC1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBCTlhUX0ZMQUdfU0hBUkVEX1JJTkdTKVxcbiBcXHRcXHRzaCA9IHRydWU7XFxuLVxcdGlmIChicC1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBCTlhUX0ZMQUdfQ0hJUF9QNV9QTFVTKVxcbi1cXHRcXHRod3IuY3BfcDUgPSBod3IucnggKyBod3IudHg7XFxuK1xcdGlmIChicC1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBCTlhUX0ZMQUdfQ0hJUF9QNV9QTFVTKSB7XFxuK1xcdFxcdGh3ci5jcF9wNSA9IGh3ci5yeCArIGh3ci50eCArIGJueHRfbXBjX2NwX3JpbmdzX2luX3VzZShicCk7XFxuK1xcdFxcdGh3ci50eCArPSBibnh0X21wY190eF9yaW5nc19pbl91c2UoYnApO1xcbitcXHR9XFxuIFxcbiBcXHRod3Iudm5pYyA9IGJueHRfZ2V0X3RvdGFsX3ZuaWNzKGJwLCBod3IucngpO1xcbiBcXG5AQCAtODE5Nyw2ICs4Mjg0LDkgQEAgc3RhdGljIGludCBfX2JueHRfcmVzZXJ2ZV9yaW5ncyhzdHJ1Y3QgYm54dCAqYnApXFxuIFxcdGlmIChibnh0X3VscF9yZWdpc3RlcmVkKGVkZXYpIFxcdTAwMjZcXHUwMDI2IGh3ci5zdGF0IFxcdTAwM2UgYm54dF9nZXRfdWxwX3N0YXRfY3R4cyhicCkpXFxuIFxcdFxcdGh3ci5zdGF0IC09IGJueHRfZ2V0X3VscF9zdGF0X2N0eHMoYnApO1xcbiBcXHRod3IuY3AgPSBtaW5fdChpbnQsIGh3ci5jcCwgaHdyLnN0YXQpO1xcbitcXHRod3IudHggLT0gYm54dF9tcGNfdHhfcmluZ3NfaW5fdXNlKGJwKTtcXG4rXFx0aWYgKGh3ci50eCBcXHUwMDNjIDApXFxuK1xcdFxcdHJldHVybiAtRU5PTUVNO1xcbiBcXHRyYyA9IGJueHRfdHJpbV9yaW5ncyhicCwgXFx1MDAyNnJ4X3JpbmdzLCBcXHUwMDI2aHdyLnR4LCBod3IuY3AsIHNoKTtcXG4gXFx0aWYgKGJwLVxcdTAwM2VmbGFncyBcXHUwMDI2IEJOWFRfRkxBR19BR0dfUklOR1MpXFxuIFxcdFxcdGh3ci5yeCA9IHJ4X3JpbmdzIFxcdTAwM2NcXHUwMDNjIDE7XFxuQEAgLTgyNzgsNyArODM2OCw3IEBAIHN0YXRpYyBpbnQgYm54dF9od3JtX2NoZWNrX3ZmX3JpbmdzKHN0cnVjdCBibnh0ICpicCwgc3RydWN0IGJueHRfaHdfcmluZ3MgKmh3cilcXG4gc3RhdGljIGludCBibnh0X2h3cm1fY2hlY2tfcGZfcmluZ3Moc3RydWN0IGJueHQgKmJwLCBzdHJ1Y3QgYm54dF9od19yaW5ncyAqaHdyKVxcbiB7XFxuIFxcdHN0cnVjdCBod3JtX2Z1bmNfY2ZnX2lucHV0ICpyZXE7XFxuLVxcdHUzMiBmbGFncztcXG4rXFx0dTMyIGZsYWdzLCBmbGFnczIgPSAwO1xcbiBcXG4gXFx0cmVxID0gX19ibnh0X2h3cm1fcmVzZXJ2ZV9wZl9yaW5ncyhicCwgaHdyKTtcXG4gXFx0ZmxhZ3MgPSBGVU5DX0NGR19SRVFfRkxBR1NfVFhfQVNTRVRTX1RFU1Q7XFxuQEAgLTgyOTIsOSArODM4MiwxNCBAQCBzdGF0aWMgaW50IGJueHRfaHdybV9jaGVja19wZl9yaW5ncyhzdHJ1Y3QgYm54dCAqYnAsIHN0cnVjdCBibnh0X2h3X3JpbmdzICpod3IpXFxuIFxcdFxcdFxcdFxcdCBGVU5DX0NGR19SRVFfRkxBR1NfTlFfQVNTRVRTX1RFU1Q7XFxuIFxcdFxcdGVsc2VcXG4gXFx0XFx0XFx0ZmxhZ3MgfD0gRlVOQ19DRkdfUkVRX0ZMQUdTX1JJTkdfR1JQX0FTU0VUU19URVNUO1xcbitcXHRcXHRpZiAocmVxLVxcdTAwM2VlbmFibGVzIFxcdTAwMjZcXG4rXFx0XFx0ICAgIGNwdV90b19sZTMyKEZVTkNfQ0ZHX1JFUV9FTkFCTEVTX0tUTFNfVFhfS0VZX0NUWFMgfFxcbitcXHRcXHRcXHRcXHRGVU5DX0NGR19SRVFfRU5BQkxFU19LVExTX1JYX0tFWV9DVFhTKSlcXG4rXFx0XFx0XFx0ZmxhZ3MyIHw9IEZVTkNfQ0ZHX1JFUV9GTEFHUzJfS1RMU19LRVlfQ1RYX0FTU0VUU19URVNUO1xcbiBcXHR9XFxuIFxcbiBcXHRyZXEtXFx1MDAzZWZsYWdzID0gY3B1X3RvX2xlMzIoZmxhZ3MpO1xcbitcXHRyZXEtXFx1MDAzZWZsYWdzMiA9IGNwdV90b19sZTMyKGZsYWdzMik7XFxuIFxcdHJldHVybiBod3JtX3JlcV9zZW5kX3NpbGVudChicCwgcmVxKTtcXG4gfVxcbiBcXG5AQCAtOTMzMSwxMiArOTQyNiwzNSBAQCBzdGF0aWMgaW50IGJueHRfaHdybV9mdW5jX2JhY2tpbmdfc3RvcmVfY2ZnX3YyKHN0cnVjdCBibnh0ICpicCxcXG4gXFxuIHN0YXRpYyBpbnQgYm54dF9iYWNraW5nX3N0b3JlX2NmZ192MihzdHJ1Y3QgYm54dCAqYnApXFxuIHtcXG4rXFx0c3RydWN0IGJueHRfY3J5cHRvX2luZm8gKmNyeXB0byA9IGJwLVxcdTAwM2VjcnlwdG9faW5mbztcXG4rXFx0c3RydWN0IGJueHRfbXBjX2luZm8gKm1wYyA9IGJwLVxcdTAwM2VtcGNfaW5mbztcXG4gXFx0c3RydWN0IGJueHRfY3R4X21lbV9pbmZvICpjdHggPSBicC1cXHUwMDNlY3R4O1xcbiBcXHRzdHJ1Y3QgYm54dF9jdHhfbWVtX3R5cGUgKmN0eG07XFxuIFxcdHUxNiBsYXN0X3R5cGUgPSBCTlhUX0NUWF9JTlY7XFxuIFxcdGludCByYyA9IDA7XFxuIFxcdHUxNiB0eXBlO1xcbiBcXG4rXFx0aWYgKEJOWFRfU1VQUE9SVFNfS1RMUyhicCkpIHtcXG4rXFx0XFx0Y3R4bSA9IFxcdTAwMjZjdHgtXFx1MDAzZWN0eF9hcnJbQk5YVF9DVFhfVENLXTtcXG4rXFx0XFx0cmMgPSBibnh0X3NldHVwX2N0eG1fcGdfdGJscyhicCwgY3R4bSxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgICBCTlhUX1RDSyhjcnlwdG8pLm1heF9jdHgsIDEpO1xcbitcXHRcXHRpZiAocmMpXFxuK1xcdFxcdFxcdHJldHVybiByYztcXG4rXFx0XFx0Y3R4bSA9IFxcdTAwMjZjdHgtXFx1MDAzZWN0eF9hcnJbQk5YVF9DVFhfUkNLXTtcXG4rXFx0XFx0cmMgPSBibnh0X3NldHVwX2N0eG1fcGdfdGJscyhicCwgY3R4bSxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgICBCTlhUX1JDSyhjcnlwdG8pLm1heF9jdHgsIDEpO1xcbitcXHRcXHRpZiAocmMpXFxuK1xcdFxcdFxcdHJldHVybiByYztcXG4rXFx0XFx0bGFzdF90eXBlID0gQk5YVF9DVFhfUkNLO1xcbitcXHR9XFxuK1xcdGlmIChtcGMgXFx1MDAyNlxcdTAwMjYgbXBjLVxcdTAwM2VtcGNfY2hubHNfY2FwKSB7XFxuK1xcdFxcdGN0eG0gPSBcXHUwMDI2Y3R4LVxcdTAwM2VjdHhfYXJyW0JOWFRfQ1RYX01UUU1dO1xcbitcXHRcXHRyYyA9IGJueHRfc2V0dXBfY3R4bV9wZ190YmxzKGJwLCBjdHhtLCBjdHhtLVxcdTAwM2VtYXhfZW50cmllcywgMSk7XFxuK1xcdFxcdGlmIChyYylcXG4rXFx0XFx0XFx0cmV0dXJuIHJjO1xcbitcXHRcXHRsYXN0X3R5cGUgPSBCTlhUX0NUWF9NVFFNO1xcbitcXHR9XFxuK1xcbiBcXHRmb3IgKHR5cGUgPSBCTlhUX0NUWF9TUlQ7IHR5cGUgXFx1MDAzYz0gQk5YVF9DVFhfUVBDOyB0eXBlKyspIHtcXG4gXFx0XFx0Y3R4bSA9IFxcdTAwMjZjdHgtXFx1MDAzZWN0eF9hcnJbdHlwZV07XFxuIFxcdFxcdGlmICghYm54dF9ic190cmFjZV9hdmFpbChicCwgdHlwZSkpXFxuQEAgLTk2ODUsNiArOTgwMyw3IEBAIGludCBibnh0X2h3cm1fZnVuY19yZXNjX3FjYXBzKHN0cnVjdCBibnh0ICpicCwgYm9vbCBhbGwpXFxuIFxcdHN0cnVjdCBod3JtX2Z1bmNfcmVzb3VyY2VfcWNhcHNfb3V0cHV0ICpyZXNwO1xcbiBcXHRzdHJ1Y3QgaHdybV9mdW5jX3Jlc291cmNlX3FjYXBzX2lucHV0ICpyZXE7XFxuIFxcdHN0cnVjdCBibnh0X2h3X3Jlc2MgKmh3X3Jlc2MgPSBcXHUwMDI2YnAtXFx1MDAzZWh3X3Jlc2M7XFxuK1xcdHN0cnVjdCBibnh0X2h3X2NyeXB0b19yZXNjICpjcnlwdG9fcmVzYztcXG4gXFx0aW50IHJjO1xcbiBcXG4gXFx0cmMgPSBod3JtX3JlcV9pbml0KGJwLCByZXEsIEhXUk1fRlVOQ19SRVNPVVJDRV9RQ0FQUyk7XFxuQEAgLTk3MjIsNiArOTg0MSwxMiBAQCBpbnQgYm54dF9od3JtX2Z1bmNfcmVzY19xY2FwcyhzdHJ1Y3QgYm54dCAqYnAsIGJvb2wgYWxsKVxcbiBcXHQgICAgaHdfcmVzYy1cXHUwMDNlbWF4X3ZuaWNzICogQk5YVF9MQVJHRV9SU1NfVE9fVk5JQ19SQVRJTylcXG4gXFx0XFx0YnAtXFx1MDAzZXJzc19jYXAgfD0gQk5YVF9SU1NfQ0FQX0xBUkdFX1JTU19DVFg7XFxuIFxcbitcXHRjcnlwdG9fcmVzYyA9IFxcdTAwMjZod19yZXNjLVxcdTAwM2VjcnlwdG9fcmVzYztcXG4rXFx0Y3J5cHRvX3Jlc2MtXFx1MDAzZW1pbl90eF9rZXlfY3R4cyA9IGxlMzJfdG9fY3B1KHJlc3AtXFx1MDAzZW1pbl9rdGxzX3R4X2tleV9jdHhzKTtcXG4rXFx0Y3J5cHRvX3Jlc2MtXFx1MDAzZW1heF90eF9rZXlfY3R4cyA9IGxlMzJfdG9fY3B1KHJlc3AtXFx1MDAzZW1heF9rdGxzX3R4X2tleV9jdHhzKTtcXG4rXFx0Y3J5cHRvX3Jlc2MtXFx1MDAzZW1pbl9yeF9rZXlfY3R4cyA9IGxlMzJfdG9fY3B1KHJlc3AtXFx1MDAzZW1pbl9rdGxzX3J4X2tleV9jdHhzKTtcXG4rXFx0Y3J5cHRvX3Jlc2MtXFx1MDAzZW1heF9yeF9rZXlfY3R4cyA9IGxlMzJfdG9fY3B1KHJlc3AtXFx1MDAzZW1heF9rdGxzX3J4X2tleV9jdHhzKTtcXG4rXFxuIFxcdGlmIChicC1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBCTlhUX0ZMQUdfQ0hJUF9QNV9QTFVTKSB7XFxuIFxcdFxcdHUxNiBtYXhfbXNpeCA9IGxlMTZfdG9fY3B1KHJlc3AtXFx1MDAzZW1heF9tc2l4KTtcXG4gXFxuQEAgLTk4NzEsNiArOTk5NiwxMCBAQCBzdGF0aWMgaW50IF9fYm54dF9od3JtX2Z1bmNfcWNhcHMoc3RydWN0IGJueHQgKmJwKVxcbiBcXHRcXHRicC1cXHUwMDNlZndfY2FwIHw9IEJOWFRfRldfQ0FQX0JBQ0tJTkdfU1RPUkVfVjI7XFxuIFxcdGlmIChmbGFnc19leHQgXFx1MDAyNiBGVU5DX1FDQVBTX1JFU1BfRkxBR1NfRVhUX1RYX0NPQUxfQ01QTF9DQVApXFxuIFxcdFxcdGJwLVxcdTAwM2VmbGFncyB8PSBCTlhUX0ZMQUdfVFhfQ09BTF9DTVBMO1xcbitcXHRpZiAoZmxhZ3NfZXh0IFxcdTAwMjYgRlVOQ19RQ0FQU19SRVNQX0ZMQUdTX0VYVF9LVExTX1NVUFBPUlRFRClcXG4rXFx0XFx0Ym54dF9hbGxvY19jcnlwdG9faW5mbyhicCwgcmVzcCk7XFxuK1xcdGVsc2VcXG4rXFx0XFx0YnAtXFx1MDAzZWZ3X2NhcCBcXHUwMDI2PSB+Qk5YVF9GV19DQVBfS1RMUztcXG4gXFxuIFxcdGZsYWdzX2V4dDIgPSBsZTMyX3RvX2NwdShyZXNwLVxcdTAwM2VmbGFnc19leHQyKTtcXG4gXFx0aWYgKGZsYWdzX2V4dDIgXFx1MDAyNiBGVU5DX1FDQVBTX1JFU1BfRkxBR1NfRVhUMl9SWF9BTExfUEtUU19USU1FU1RBTVBTX1NVUFBPUlRFRClcXG5AQCAtOTk0Myw2ICsxMDA3MiwxMSBAQCBzdGF0aWMgaW50IF9fYm54dF9od3JtX2Z1bmNfcWNhcHMoc3RydWN0IGJueHQgKmJwKVxcbiBcXHR9XFxuIFxcdGJwLVxcdTAwM2V0c29fbWF4X3NlZ3MgPSBsZTE2X3RvX2NwdShyZXNwLVxcdTAwM2VtYXhfdHNvX3NlZ3MpO1xcbiBcXG4rXFx0aWYgKHJlc3AtXFx1MDAzZW1wY19jaG5sc19jYXApXFxuK1xcdFxcdGJueHRfYWxsb2NfbXBjX2luZm8oYnAsIHJlc3AtXFx1MDAzZW1wY19jaG5sc19jYXApO1xcbitcXHRlbHNlXFxuK1xcdFxcdGJueHRfZnJlZV9tcGNfaW5mbyhicCk7XFxuK1xcbiBod3JtX2Z1bmNfcWNhcHNfZXhpdDpcXG4gXFx0aHdybV9yZXFfZHJvcChicCwgcmVxKTtcXG4gXFx0cmV0dXJuIHJjO1xcbkBAIC0xMTMyMSw2ICsxMTQ1NSw3IEBAIHN0YXRpYyBpbnQgYm54dF9pbml0X25pYyhzdHJ1Y3QgYm54dCAqYnAsIGJvb2wgaXJxX3JlX2luaXQpXFxuIFxcdGJueHRfaW5pdF9jcF9yaW5ncyhicCk7XFxuIFxcdGJueHRfaW5pdF9yeF9yaW5ncyhicCk7XFxuIFxcdGJueHRfaW5pdF90eF9yaW5ncyhicCk7XFxuK1xcdGJueHRfaW5pdF9tcGNfcmluZ3MoYnApO1xcbiBcXHRibnh0X2luaXRfcmluZ19ncnBzKGJwLCBpcnFfcmVfaW5pdCk7XFxuIFxcdGJueHRfaW5pdF92bmljcyhicCk7XFxuIFxcbkBAIC0xMTUwOSwxNCArMTE2NDQsMTUgQEAgdW5zaWduZWQgaW50IGJueHRfZ2V0X21heF9mdW5jX2NwX3JpbmdzKHN0cnVjdCBibnh0ICpicClcXG4gXFx0cmV0dXJuIGJwLVxcdTAwM2Vod19yZXNjLm1heF9jcF9yaW5ncztcXG4gfVxcbiBcXG4tc3RhdGljIHVuc2lnbmVkIGludCBibnh0X2dldF9tYXhfZnVuY19jcF9yaW5nc19mb3JfZW4oc3RydWN0IGJueHQgKmJwKVxcbitzdGF0aWMgdW5zaWduZWQgaW50IGJueHRfZ2V0X21heF9mdW5jX2NwX3JpbmdzX2Zvcl9lbihzdHJ1Y3QgYm54dCAqYnAsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdCAgICAgIHVuc2lnbmVkIGludCBtcGNfY3ApXFxuIHtcXG4gXFx0dW5zaWduZWQgaW50IGNwID0gYnAtXFx1MDAzZWh3X3Jlc2MubWF4X2NwX3JpbmdzO1xcbiBcXG4gXFx0aWYgKCEoYnAtXFx1MDAzZWZsYWdzIFxcdTAwMjYgQk5YVF9GTEFHX0NISVBfUDVfUExVUykpXFxuIFxcdFxcdGNwIC09IGJueHRfZ2V0X3VscF9tc2l4X251bShicCk7XFxuIFxcbi1cXHRyZXR1cm4gY3A7XFxuK1xcdHJldHVybiBtcGNfY3AgXFx1MDAzZT0gY3AgPyAwIDogY3AgLSBtcGNfY3A7XFxuIH1cXG4gXFxuIHN0YXRpYyB1bnNpZ25lZCBpbnQgYm54dF9nZXRfbWF4X2Z1bmNfaXJxcyhzdHJ1Y3QgYm54dCAqYnApXFxuQEAgLTExNTM4LDcgKzExNjc0LDcgQEAgdW5zaWduZWQgaW50IGJueHRfZ2V0X2F2YWlsX2NwX3JpbmdzX2Zvcl9lbihzdHJ1Y3QgYm54dCAqYnApXFxuIHtcXG4gXFx0dW5zaWduZWQgaW50IGNwO1xcbiBcXG4tXFx0Y3AgPSBibnh0X2dldF9tYXhfZnVuY19jcF9yaW5nc19mb3JfZW4oYnApO1xcbitcXHRjcCA9IGJueHRfZ2V0X21heF9mdW5jX2NwX3JpbmdzX2Zvcl9lbihicCwgYm54dF9tcGNfY3BfcmluZ3NfaW5fdXNlKGJwKSk7XFxuIFxcdGlmIChicC1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBCTlhUX0ZMQUdfQ0hJUF9QNV9QTFVTKVxcbiBcXHRcXHRyZXR1cm4gY3AgLSBicC1cXHUwMDNlcnhfbnJfcmluZ3MgLSBicC1cXHUwMDNldHhfbnJfcmluZ3M7XFxuIFxcdGVsc2VcXG5AQCAtMTI4MDEsNiArMTI5MzcsOCBAQCBzdGF0aWMgaW50IGJueHRfaHdybV9pZl9jaGFuZ2Uoc3RydWN0IGJueHQgKmJwLCBib29sIHVwKVxcbiBcXHRcXHRcXHRcXHRibnh0X3VscF9pcnFfc3RvcChicCk7XFxuIFxcdFxcdFxcdGJueHRfZnJlZV9jdHhfbWVtKGJwLCBmYWxzZSk7XFxuIFxcdFxcdFxcdGJueHRfZGNiX2ZyZWUoYnApO1xcbitcXHRcXHRcXHRpZiAoZndfcmVzZXQgfHwgY2Fwc19jaGFuZ2UpXFxuK1xcdFxcdFxcdFxcdGJueHRfY2xlYXJfY3J5cHRvKGJwKTtcXG4gXFx0XFx0XFx0cmMgPSBibnh0X2Z3X2luaXRfb25lKGJwKTtcXG4gXFx0XFx0XFx0aWYgKHJjKSB7XFxuIFxcdFxcdFxcdFxcdGNsZWFyX2JpdChCTlhUX1NUQVRFX0ZXX1JFU0VUX0RFVCwgXFx1MDAyNmJwLVxcdTAwM2VzdGF0ZSk7XFxuQEAgLTEzMTcwLDYgKzEzMzA4LDcgQEAgc3RhdGljIGludCBfX2JueHRfb3Blbl9uaWMoc3RydWN0IGJueHQgKmJwLCBib29sIGlycV9yZV9pbml0LCBib29sIGxpbmtfcmVfaW5pdClcXG4gXFx0XFx0cmV0dXJuIHJjO1xcbiBcXG4gXFx0Ym54dF9hZGpfdHhfcmluZ3MoYnApO1xcbitcXHRibnh0X3RyaW1fbXBjX3JpbmdzKGJwKTtcXG4gXFx0cmMgPSBibnh0X2FsbG9jX21lbShicCwgaXJxX3JlX2luaXQpO1xcbiBcXHRpZiAocmMpIHtcXG4gXFx0XFx0bmV0ZGV2X2VycihicC1cXHUwMDNlZGV2LCBcXFwiYm54dF9hbGxvY19tZW0gZXJyOiAleFxcXFxuXFxcIiwgcmMpO1xcbkBAIC0xMzIyMiw2ICsxMzM2MSw3IEBAIHN0YXRpYyBpbnQgX19ibnh0X29wZW5fbmljKHN0cnVjdCBibnh0ICpicCwgYm9vbCBpcnFfcmVfaW5pdCwgYm9vbCBsaW5rX3JlX2luaXQpXFxuIFxcdFxcdHN0YXRpY19icmFuY2hfZGlzYWJsZShcXHUwMDI2Ym54dF94ZHBfbG9ja2luZ19rZXkpO1xcbiBcXHR9XFxuIFxcdHNldF9iaXQoQk5YVF9TVEFURV9PUEVOLCBcXHUwMDI2YnAtXFx1MDAzZXN0YXRlKTtcXG4rXFx0Ym54dF9rdGxzX3dha2UoYnApO1xcbiBcXHRibnh0X2VuYWJsZV9pbnQoYnApO1xcbiBcXHQvKiBFbmFibGUgVFggcXVldWVzICovXFxuIFxcdGJueHRfdHhfZW5hYmxlKGJwKTtcXG5AQCAtMTMzNjMsNyArMTM1MDMsOCBAQCBzdGF0aWMgaW50IGJueHRfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KVxcbiBzdGF0aWMgYm9vbCBibnh0X2Rydl9idXN5KHN0cnVjdCBibnh0ICpicClcXG4ge1xcbiBcXHRyZXR1cm4gKHRlc3RfYml0KEJOWFRfU1RBVEVfSU5fU1BfVEFTSywgXFx1MDAyNmJwLVxcdTAwM2VzdGF0ZSkgfHxcXG4tXFx0XFx0dGVzdF9iaXQoQk5YVF9TVEFURV9SRUFEX1NUQVRTLCBcXHUwMDI2YnAtXFx1MDAzZXN0YXRlKSk7XFxuK1xcdFxcdHRlc3RfYml0KEJOWFRfU1RBVEVfUkVBRF9TVEFUUywgXFx1MDAyNmJwLVxcdTAwM2VzdGF0ZSkgfHxcXG4rXFx0XFx0Ym54dF9rdGxzX2J1c3koYnApKTtcXG4gfVxcbiBcXG4gc3RhdGljIHZvaWQgYm54dF9nZXRfcmluZ19zdGF0cyhzdHJ1Y3QgYm54dCAqYnAsXFxuQEAgLTEzMzgxLDkgKzEzNTIyLDIwIEBAIHN0YXRpYyB2b2lkIF9fYm54dF9jbG9zZV9uaWMoc3RydWN0IGJueHQgKmJwLCBib29sIGlycV9yZV9pbml0LFxcbiBcXG4gXFx0Y2xlYXJfYml0KEJOWFRfU1RBVEVfT1BFTiwgXFx1MDAyNmJwLVxcdTAwM2VzdGF0ZSk7XFxuIFxcdHNtcF9tYl9fYWZ0ZXJfYXRvbWljKCk7XFxuK1xcdC8qIFdha2UgYW55IGtUTFMgZGVsZXRlIHdhaXRpbmcgb24gYSByZWNvbmZpZyBzbyBpdCByZS1ldmFsdWF0ZXMgYW5kXFxuK1xcdCAqIGVpdGhlciBrZWVwcyB3YWl0aW5nIGZvciB0aGUgcmVvcGVuIG9yIGFib3J0cyAoaWZkb3duIC8gRlcgcmVzZXQpLlxcbitcXHQgKi9cXG4rXFx0Ym54dF9rdGxzX3dha2UoYnApO1xcbiBcXHR3aGlsZSAoYm54dF9kcnZfYnVzeShicCkpXFxuIFxcdFxcdG1zbGVlcCgyMCk7XFxuIFxcbitcXHQvKiBEZWxldGUgYWxsIGNyeXB0byBjb25uZWN0aW9ucyBhbmQgS0lEcyBvbmx5IG9uIGlmZG93biBhbmQgRlcgcmVzZXQsXFxuK1xcdCAqIG5vdCBldGh0b29sIGNvbmZpZyBjaGFuZ2VzLlxcbitcXHQgKi9cXG4rXFx0aWYgKCFuZXRpZl9ydW5uaW5nKGJwLVxcdTAwM2VkZXYpIHx8XFxuK1xcdCAgICB0ZXN0X2JpdChCTlhUX1NUQVRFX0lOX0ZXX1JFU0VULCBcXHUwMDI2YnAtXFx1MDAzZXN0YXRlKSlcXG4rXFx0XFx0Ym54dF9jcnlwdG9fZGVsX2FsbChicCk7XFxuK1xcbiBcXHRpZiAoQk5YVF9TVVBQT1JUU19NVUxUSV9SU1NfQ1RYKGJwKSlcXG4gXFx0XFx0Ym54dF9jbGVhcl9yc3NfY3R4cyhicCk7XFxuIFxcdC8qIEZsdXNoIHJpbmdzIGFuZCBkaXNhYmxlIGludGVycnVwdHMgKi9cXG5AQCAtMTQzMjAsNyArMTQ0NzIsNyBAQCBzdGF0aWMgaW50IGJueHRfaHdybV9yeF9yaW5nX3Jlc2V0KHN0cnVjdCBibnh0ICpicCwgaW50IHJpbmdfbnIpXFxuIFxcdHJldHVybiBod3JtX3JlcV9zZW5kX3NpbGVudChicCwgcmVxKTtcXG4gfVxcbiBcXG4tc3RhdGljIHZvaWQgYm54dF9yZXNldF90YXNrKHN0cnVjdCBibnh0ICpicCwgYm9vbCBzaWxlbnQpXFxuK3ZvaWQgYm54dF9yZXNldF90YXNrKHN0cnVjdCBibnh0ICpicCwgYm9vbCBzaWxlbnQpXFxuIHtcXG4gXFx0aWYgKCFzaWxlbnQpXFxuIFxcdFxcdGJueHRfZGJnX2R1bXBfc3RhdGVzKGJwKTtcXG5AQCAtMTQ1MzcsNiArMTQ2ODksNyBAQCBzdGF0aWMgdm9pZCBibnh0X2Z3X3Jlc2V0X2Nsb3NlKHN0cnVjdCBibnh0ICpicClcXG4gXFx0Ym54dF9od3JtX2Z1bmNfZHJ2X3Vucmd0cihicCk7XFxuIFxcdGlmIChwY2lfaXNfZW5hYmxlZChicC1cXHUwMDNlcGRldikpXFxuIFxcdFxcdHBjaV9kaXNhYmxlX2RldmljZShicC1cXHUwMDNlcGRldik7XFxuK1xcdGJueHRfY2xlYXJfY3J5cHRvKGJwKTtcXG4gXFx0Ym54dF9mcmVlX2N0eF9tZW0oYnAsIGZhbHNlKTtcXG4gfVxcbiBcXG5AQCAtMTQ3NjgsNiArMTQ5MjEsMTMgQEAgc3RhdGljIHZvaWQgYm54dF91bHBfcmVzdGFydChzdHJ1Y3QgYm54dCAqYnApXFxuIFxcdGJueHRfdWxwX3N0YXJ0KGJwKTtcXG4gfVxcbiBcXG4rc3RhdGljIHZvaWQgYm54dF9tcGNfcmluZ19yZXNldF9zcChzdHJ1Y3QgYm54dCAqYnApXFxuK3tcXG4rXFx0Ym54dF9ydG5sX2xvY2tfc3AoYnApO1xcbitcXHRibnh0X21wY19yaW5nX3Jlc2V0X3Rhc2soYnApO1xcbitcXHRibnh0X3J0bmxfdW5sb2NrX3NwKGJwKTtcXG4rfVxcbitcXG4gc3RhdGljIHZvaWQgYm54dF9zcF90YXNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaylcXG4ge1xcbiBcXHRzdHJ1Y3QgYm54dCAqYnAgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGJueHQsIHNwX3Rhc2spO1xcbkBAIC0xNDg2MCw2ICsxNTAyMCw5IEBAIHN0YXRpYyB2b2lkIGJueHRfc3BfdGFzayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspXFxuIFxcdGlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoQk5YVF9SU1RfUklOR19TUF9FVkVOVCwgXFx1MDAyNmJwLVxcdTAwM2VzcF9ldmVudCkpXFxuIFxcdFxcdGJueHRfcnhfcmluZ19yZXNldChicCk7XFxuIFxcbitcXHRpZiAodGVzdF9hbmRfY2xlYXJfYml0KEJOWFRfTVBDX1JFU0VUX1NQX0VWRU5ULCBcXHUwMDI2YnAtXFx1MDAzZXNwX2V2ZW50KSlcXG4rXFx0XFx0Ym54dF9tcGNfcmluZ19yZXNldF9zcChicCk7XFxuK1xcbiBcXHRpZiAodGVzdF9hbmRfY2xlYXJfYml0KEJOWFRfRldfUkVTRVRfTk9USUZZX1NQX0VWRU5ULCBcXHUwMDI2YnAtXFx1MDAzZXNwX2V2ZW50KSkge1xcbiBcXHRcXHRpZiAodGVzdF9iaXQoQk5YVF9TVEFURV9GV19GQVRBTF9DT05ELCBcXHUwMDI2YnAtXFx1MDAzZXN0YXRlKSB8fFxcbiBcXHRcXHQgICAgdGVzdF9iaXQoQk5YVF9TVEFURV9GV19OT05fRkFUQUxfQ09ORCwgXFx1MDAyNmJwLVxcdTAwM2VzdGF0ZSkpXFxuQEAgLTE0ODc4LDExICsxNTA0MSwxMSBAQCBzdGF0aWMgdm9pZCBibnh0X3NwX3Rhc2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKVxcbiB9XFxuIFxcbiBzdGF0aWMgdm9pZCBfYm54dF9nZXRfbWF4X3JpbmdzKHN0cnVjdCBibnh0ICpicCwgaW50ICptYXhfcngsIGludCAqbWF4X3R4LFxcbi1cXHRcXHRcXHRcXHRpbnQgKm1heF9jcCk7XFxuK1xcdFxcdFxcdFxcdGludCAqbWF4X2NwLCBpbnQgbXBjX3R4LCBpbnQgbXBjX2NwKTtcXG4gXFxuIC8qIFVuZGVyIG5ldGRldiBpbnN0YW5jZSBsb2NrICovXFxuIGludCBibnh0X2NoZWNrX3JpbmdzKHN0cnVjdCBibnh0ICpicCwgaW50IHR4LCBpbnQgcngsIGJvb2wgc2gsIGludCB0Y3MsXFxuLVxcdFxcdCAgICAgaW50IHR4X3hkcClcXG4rXFx0XFx0ICAgICBpbnQgdHhfeGRwLCBpbnQgbXBjX3R4LCBpbnQgbXBjX2NwKVxcbiB7XFxuIFxcdGludCBtYXhfcngsIG1heF90eCwgbWF4X2NwLCB0eF9zZXRzID0gMSwgdHhfY3A7XFxuIFxcdHN0cnVjdCBibnh0X2h3X3JpbmdzIGh3ciA9IHswfTtcXG5AQCAtMTQ4OTIsNyArMTUwNTUsNyBAQCBpbnQgYm54dF9jaGVja19yaW5ncyhzdHJ1Y3QgYm54dCAqYnAsIGludCB0eCwgaW50IHJ4LCBib29sIHNoLCBpbnQgdGNzLFxcbiBcXHRpZiAodGNzKVxcbiBcXHRcXHR0eF9zZXRzID0gdGNzO1xcbiBcXG4tXFx0X2JueHRfZ2V0X21heF9yaW5ncyhicCwgXFx1MDAyNm1heF9yeCwgXFx1MDAyNm1heF90eCwgXFx1MDAyNm1heF9jcCk7XFxuK1xcdF9ibnh0X2dldF9tYXhfcmluZ3MoYnAsIFxcdTAwMjZtYXhfcngsIFxcdTAwMjZtYXhfdHgsIFxcdTAwMjZtYXhfY3AsIG1wY190eCwgbXBjX2NwKTtcXG4gXFxuIFxcdGlmIChtYXhfcnggXFx1MDAzYyByeF9yaW5ncylcXG4gXFx0XFx0cmV0dXJuIC1FTk9NRU07XFxuQEAgLTE0OTE4LDggKzE1MDgxLDEwIEBAIGludCBibnh0X2NoZWNrX3JpbmdzKHN0cnVjdCBibnh0ICpicCwgaW50IHR4LCBpbnQgcngsIGJvb2wgc2gsIGludCB0Y3MsXFxuIFxcdFxcdGh3ci5ncnAgPSByeDtcXG4gXFx0XFx0aHdyLnJzc19jdHggPSBibnh0X2dldF90b3RhbF9yc3NfY3R4cyhicCwgXFx1MDAyNmh3cik7XFxuIFxcdH1cXG4tXFx0aWYgKGJwLVxcdTAwM2VmbGFncyBcXHUwMDI2IEJOWFRfRkxBR19DSElQX1A1X1BMVVMpXFxuLVxcdFxcdGh3ci5jcF9wNSA9IGh3ci50eCArIHJ4O1xcbitcXHRpZiAoYnAtXFx1MDAzZWZsYWdzIFxcdTAwMjYgQk5YVF9GTEFHX0NISVBfUDVfUExVUykge1xcbitcXHRcXHRod3IuY3BfcDUgPSBod3IudHggKyByeCArIG1wY19jcDtcXG4rXFx0XFx0aHdyLnR4ICs9IG1wY190eDtcXG4rXFx0fVxcbiBcXHRyYyA9IGJueHRfaHdybV9jaGVja19yaW5ncyhicCwgXFx1MDAyNmh3cik7XFxuIFxcdGlmICghcmMgXFx1MDAyNlxcdTAwMjYgcGNpX21zaXhfY2FuX2FsbG9jX2R5bihicC1cXHUwMDNlcGRldikpIHtcXG4gXFx0XFx0aWYgKCFibnh0X3VscF9yZWdpc3RlcmVkKGJwLVxcdTAwM2VlZGV2W0JOWFRfQVVYREVWX1JETUFdKSkge1xcbkBAIC0xNTY0MCw3ICsxNTgwNSw5IEBAIGludCBibnh0X3NldHVwX21xX3RjKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IHRjKVxcbiBcXHRcXHRzaCA9IHRydWU7XFxuIFxcbiBcXHRyYyA9IGJueHRfY2hlY2tfcmluZ3MoYnAsIGJwLVxcdTAwM2V0eF9ucl9yaW5nc19wZXJfdGMsIGJwLVxcdTAwM2VyeF9ucl9yaW5ncyxcXG4tXFx0XFx0XFx0ICAgICAgc2gsIHRjLCBicC1cXHUwMDNldHhfbnJfcmluZ3NfeGRwKTtcXG4rXFx0XFx0XFx0ICAgICAgc2gsIHRjLCBicC1cXHUwMDNldHhfbnJfcmluZ3NfeGRwLFxcbitcXHRcXHRcXHQgICAgICBibnh0X21wY190eF9yaW5nc19pbl91c2UoYnApLFxcbitcXHRcXHRcXHQgICAgICBibnh0X21wY19jcF9yaW5nc19pbl91c2UoYnApKTtcXG4gXFx0aWYgKHJjKVxcbiBcXHRcXHRyZXR1cm4gcmM7XFxuIFxcbkBAIC0xNjU0Nyw2ICsxNjcxNCw4IEBAIHN0YXRpYyB2b2lkIGJueHRfcmVtb3ZlX29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldilcXG4gXFx0YnAtXFx1MDAzZXB0cF9jZmcgPSBOVUxMO1xcbiBcXHRrZnJlZShicC1cXHUwMDNlZndfaGVhbHRoKTtcXG4gXFx0YnAtXFx1MDAzZWZ3X2hlYWx0aCA9IE5VTEw7XFxuK1xcdGJueHRfZnJlZV9jcnlwdG9faW5mbyhicCk7XFxuK1xcdGJueHRfZnJlZV9tcGNfaW5mbyhicCk7XFxuIFxcdGJueHRfY2xlYW51cF9wY2koYnApO1xcbiBcXHRibnh0X2ZyZWVfY3R4X21lbShicCwgdHJ1ZSk7XFxuIFxcdGJueHRfZnJlZV9jcmFzaF9kdW1wX21lbShicCk7XFxuQEAgLTE2NjExLDE0ICsxNjc4MCwxNCBAQCBzdGF0aWMgaW50IGJueHRfZ2V0X21heF9pcnEoc3RydWN0IHBjaV9kZXYgKnBkZXYpXFxuIH1cXG4gXFxuIHN0YXRpYyB2b2lkIF9ibnh0X2dldF9tYXhfcmluZ3Moc3RydWN0IGJueHQgKmJwLCBpbnQgKm1heF9yeCwgaW50ICptYXhfdHgsXFxuLVxcdFxcdFxcdFxcdGludCAqbWF4X2NwKVxcbitcXHRcXHRcXHRcXHRpbnQgKm1heF9jcCwgaW50IG1wY190eCwgaW50IG1wY19jcClcXG4ge1xcbiBcXHRzdHJ1Y3QgYm54dF9od19yZXNjICpod19yZXNjID0gXFx1MDAyNmJwLVxcdTAwM2Vod19yZXNjO1xcbiBcXHRpbnQgbWF4X3JpbmdfZ3JwcyA9IDAsIG1heF9pcnE7XFxuIFxcbi1cXHQqbWF4X3R4ID0gaHdfcmVzYy1cXHUwMDNlbWF4X3R4X3JpbmdzO1xcbitcXHQqbWF4X3R4ID0gbWF4KDAsIChpbnQpaHdfcmVzYy1cXHUwMDNlbWF4X3R4X3JpbmdzIC0gbXBjX3R4KTtcXG4gXFx0Km1heF9yeCA9IGh3X3Jlc2MtXFx1MDAzZW1heF9yeF9yaW5ncztcXG4tXFx0Km1heF9jcCA9IGJueHRfZ2V0X21heF9mdW5jX2NwX3JpbmdzX2Zvcl9lbihicCk7XFxuK1xcdCptYXhfY3AgPSBibnh0X2dldF9tYXhfZnVuY19jcF9yaW5nc19mb3JfZW4oYnAsIG1wY19jcCk7XFxuIFxcdG1heF9pcnEgPSBtaW5fdChpbnQsIGJueHRfZ2V0X21heF9mdW5jX2lycXMoYnApIC1cXG4gXFx0XFx0XFx0Ym54dF9nZXRfdWxwX21zaXhfbnVtX2luX3VzZShicCksXFxuIFxcdFxcdFxcdGh3X3Jlc2MtXFx1MDAzZW1heF9zdGF0X2N0eHMgLVxcbkBAIC0xNjY1MCw3ICsxNjgxOSw4IEBAIGludCBibnh0X2dldF9tYXhfcmluZ3Moc3RydWN0IGJueHQgKmJwLCBpbnQgKm1heF9yeCwgaW50ICptYXhfdHgsIGJvb2wgc2hhcmVkKVxcbiB7XFxuIFxcdGludCByeCwgdHgsIGNwO1xcbiBcXG4tXFx0X2JueHRfZ2V0X21heF9yaW5ncyhicCwgXFx1MDAyNnJ4LCBcXHUwMDI2dHgsIFxcdTAwMjZjcCk7XFxuK1xcdF9ibnh0X2dldF9tYXhfcmluZ3MoYnAsIFxcdTAwMjZyeCwgXFx1MDAyNnR4LCBcXHUwMDI2Y3AsIGJueHRfbXBjX3R4X3JpbmdzX2luX3VzZShicCksXFxuK1xcdFxcdFxcdCAgICBibnh0X21wY19jcF9yaW5nc19pbl91c2UoYnApKTtcXG4gXFx0Km1heF9yeCA9IHJ4O1xcbiBcXHQqbWF4X3R4ID0gdHg7XFxuIFxcdGlmICghcnggfHwgIXR4IHx8ICFjcClcXG5AQCAtMTY3MTMsNiArMTY4ODMsNyBAQCBzdGF0aWMgdm9pZCBibnh0X3RyaW1fZGZsdF9zaF9yaW5ncyhzdHJ1Y3QgYm54dCAqYnApXFxuIFxcdGJwLVxcdTAwM2VyeF9ucl9yaW5ncyA9IGJwLVxcdTAwM2VjcF9ucl9yaW5ncztcXG4gXFx0YnAtXFx1MDAzZXR4X25yX3JpbmdzX3Blcl90YyA9IGJwLVxcdTAwM2VjcF9ucl9yaW5ncztcXG4gXFx0YnAtXFx1MDAzZXR4X25yX3JpbmdzID0gYm54dF90eF9ucl9yaW5ncyhicCk7XFxuK1xcdGJueHRfdHJpbV9tcGNfcmluZ3MoYnApO1xcbiB9XFxuIFxcbiBzdGF0aWMgdm9pZCBibnh0X2Fkal9kZmx0X3JpbmdzKHN0cnVjdCBibnh0ICpicCwgYm9vbCBzaClcXG5AQCAtMTY3NjQsNiArMTY5MzUsOCBAQCBzdGF0aWMgaW50IGJueHRfc2V0X2RmbHRfcmluZ3Moc3RydWN0IGJueHQgKmJwLCBib29sIHNoKVxcbiBcXHRcXHRibnh0X3NldF9kZmx0X3VscF9zdGF0X2N0eHMoYnApO1xcbiBcXHR9XFxuIFxcbitcXHRibnh0X3NldF9kZmx0X21wY19yaW5ncyhicCk7XFxuK1xcbiBcXHRyYyA9IF9fYm54dF9yZXNlcnZlX3JpbmdzKGJwKTtcXG4gXFx0aWYgKHJjIFxcdTAwMjZcXHUwMDI2IHJjICE9IC1FTk9ERVYpXFxuIFxcdFxcdG5ldGRldl93YXJuKGJwLVxcdTAwM2VkZXYsIFxcXCJVbmFibGUgdG8gcmVzZXJ2ZSB0eCByaW5nc1xcXFxuXFxcIik7XFxuQEAgLTE2Nzc4LDYgKzE2OTUxLDExIEBAIHN0YXRpYyBpbnQgYm54dF9zZXRfZGZsdF9yaW5ncyhzdHJ1Y3QgYm54dCAqYnAsIGJvb2wgc2gpXFxuIFxcdFxcdGlmIChyYyBcXHUwMDI2XFx1MDAyNiByYyAhPSAtRU5PREVWKVxcbiBcXHRcXHRcXHRuZXRkZXZfd2FybihicC1cXHUwMDNlZGV2LCBcXFwiMm5kIHJpbmdzIHJlc2VydmF0aW9uIGZhaWxlZC5cXFxcblxcXCIpO1xcbiBcXHRcXHRibnh0X2Fkal90eF9yaW5ncyhicCk7XFxuK1xcdFxcdC8qIFJlLWNhcCBNUEMgcmluZyBjb3VudHMgYWdhaW5zdCB0aGUgcmVkdWNlZCBUWCByaW5ncy5cXG4rXFx0XFx0ICogQW55IGV4dHJhIHJlc2VydmVkIE1QQyByaW5ncyB3aWxsIGJlIHJlY29uY2lsZWQgb25cXG4rXFx0XFx0ICogdGhlIG5leHQgb3Blbi5cXG4rXFx0XFx0ICovXFxuK1xcdFxcdGJueHRfdHJpbV9tcGNfcmluZ3MoYnApO1xcbiBcXHR9XFxuIFxcdGlmIChCTlhUX0NISVBfVFlQRV9OSVRST19BMChicCkpIHtcXG4gXFx0XFx0YnAtXFx1MDAzZXJ4X25yX3JpbmdzKys7XFxuQEAgLTE2ODEyLDYgKzE2OTkwLDcgQEAgc3RhdGljIGludCBibnh0X2luaXRfZGZsdF9yaW5nX21vZGUoc3RydWN0IGJueHQgKmJwKVxcbiBcXHRcXHRnb3RvIGluaXRfZGZsdF9yaW5nX2VycjtcXG4gXFxuIFxcdGJueHRfYWRqX3R4X3JpbmdzKGJwKTtcXG4rXFx0Ym54dF90cmltX21wY19yaW5ncyhicCk7XFxuIFxcbiBcXHRibnh0X3NldF9kZmx0X3JmcyhicCk7XFxuIFxcbkBAIC0xNzE1NSw2ICsxNzMzNCw3IEBAIHN0YXRpYyBpbnQgYm54dF9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudClcXG4gXFx0ICogbGltaXRlZCBNU0lYLCBzbyB3ZSByZS1pbml0aWFsaXplIHRoZSBUWCByaW5ncyBwZXIgVEMuXFxuIFxcdCAqL1xcbiBcXHRicC1cXHUwMDNldHhfbnJfcmluZ3NfcGVyX3RjID0gYnAtXFx1MDAzZXR4X25yX3JpbmdzO1xcbitcXHRibnh0X3RyaW1fbXBjX3JpbmdzKGJwKTtcXG4gXFxuIFxcdGlmIChCTlhUX1BGKGJwKSkge1xcbiBcXHRcXHRpZiAoIWJueHRfcGZfd3EpIHtcXG5AQCAtMTcxNzYsNiArMTczNTYsMTIgQEAgc3RhdGljIGludCBibnh0X2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KVxcbiBcXHRyYyA9IGJueHRfZGxfcmVnaXN0ZXIoYnApO1xcbiBcXHRpZiAocmMpXFxuIFxcdFxcdGdvdG8gaW5pdF9lcnJfZGw7XFxuK1xcdHJjID0gYm54dF9jcnlwdG9faW5pdChicCk7XFxuK1xcdGlmIChyYykge1xcbitcXHRcXHRibnh0X2ZyZWVfY3J5cHRvX2luZm8oYnApO1xcbitcXHRcXHRuZXRkZXZfd2FybihicC1cXHUwMDNlZGV2LCBcXFwiRmFpbGVkIHRvIGluaXRpYWxpemUgY3J5cHRvIG9mZmxvYWQsIGVyciA9ICVkXFxcXG5cXFwiLFxcbitcXHRcXHRcXHQgICAgcmMpO1xcbitcXHR9XFxuIFxcbiBcXHRJTklUX0xJU1RfSEVBRChcXHUwMDI2YnAtXFx1MDAzZXVzcl9mbHRyX2xpc3QpO1xcbiBcXG5AQCAtMTcyMTgsNiArMTc0MDQsOCBAQCBzdGF0aWMgaW50IGJueHRfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpXFxuIFxcdGJueHRfZXRodG9vbF9mcmVlKGJwKTtcXG4gXFx0a2ZyZWUoYnAtXFx1MDAzZWZ3X2hlYWx0aCk7XFxuIFxcdGJwLVxcdTAwM2Vmd19oZWFsdGggPSBOVUxMO1xcbitcXHRibnh0X2ZyZWVfY3J5cHRvX2luZm8oYnApO1xcbitcXHRibnh0X2ZyZWVfbXBjX2luZm8oYnApO1xcbiBcXHRibnh0X2NsZWFudXBfcGNpKGJwKTtcXG4gXFx0Ym54dF9mcmVlX2N0eF9tZW0oYnAsIHRydWUpO1xcbiBcXHRibnh0X2ZyZWVfY3Jhc2hfZHVtcF9tZW0oYnApO1xcbkBAIC0xNzQwMCw2ICsxNzU4OCw3IEBAIHN0YXRpYyBwY2lfZXJzX3Jlc3VsdF90IGJueHRfaW9fZXJyb3JfZGV0ZWN0ZWQoc3RydWN0IHBjaV9kZXYgKnBkZXYsXFxuIFxcbiBcXHRpZiAocGNpX2lzX2VuYWJsZWQocGRldikpXFxuIFxcdFxcdHBjaV9kaXNhYmxlX2RldmljZShwZGV2KTtcXG4rXFx0Ym54dF9jbGVhcl9jcnlwdG8oYnApO1xcbiBcXHRibnh0X2ZyZWVfY3R4X21lbShicCwgZmFsc2UpO1xcbiBcXHRuZXRkZXZfdW5sb2NrKG5ldGRldik7XFxuIFxcbmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibnh0L2JueHQuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dC5oXFxuaW5kZXggNjMzNWRmYzE0Yzk4NWIuLjcwOTQ3YmNjMzExNmVkIDEwMDY0NFxcbi0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dC5oXFxuKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9ibnh0LmhcXG5AQCAtNDcsNiArNDcsNyBAQCBzdHJ1Y3QgdHhfYmQge1xcbiBcXHRfX2xlMzIgdHhfYmRfbGVuX2ZsYWdzX3R5cGU7XFxuIFxcdCNkZWZpbmUgVFhfQkRfVFlQRVxcdFxcdFxcdFxcdFxcdCgweDNmIFxcdTAwM2NcXHUwMDNjIDApXFxuIFxcdCAjZGVmaW5lIFRYX0JEX1RZUEVfU0hPUlRfVFhfQkRcXHRcXHRcXHRcXHQgKDB4MDAgXFx1MDAzY1xcdTAwM2MgMClcXG4rXFx0ICNkZWZpbmUgVFhfQkRfVFlQRV9NUENfVFhfQkRcXHRcXHRcXHRcXHQgKDB4MDggXFx1MDAzY1xcdTAwM2MgMClcXG4gXFx0ICNkZWZpbmUgVFhfQkRfVFlQRV9MT05HX1RYX0JEXFx0XFx0XFx0XFx0ICgweDEwIFxcdTAwM2NcXHUwMDNjIDApXFxuIFxcdCNkZWZpbmUgVFhfQkRfRkxBR1NfUEFDS0VUX0VORFxcdFxcdFxcdFxcdCgxIFxcdTAwM2NcXHUwMDNjIDYpXFxuIFxcdCNkZWZpbmUgVFhfQkRfRkxBR1NfTk9fQ01QTFxcdFxcdFxcdFxcdCgxIFxcdTAwM2NcXHUwMDNjIDcpXFxuQEAgLTEwMCwxMCArMTAxLDE4IEBAIHN0cnVjdCB0eF9iZF9leHQge1xcbiBcXHQjZGVmaW5lIFRYX0JEX0ZMQUdTX0xTT1xcdFxcdFxcdFxcdFxcdCgxIFxcdTAwM2NcXHUwMDNjIDUpXFxuIFxcdCNkZWZpbmUgVFhfQkRfRkxBR1NfSVBJRF9GTVRcXHRcXHRcXHRcXHQoMSBcXHUwMDNjXFx1MDAzYyA2KVxcbiBcXHQjZGVmaW5lIFRYX0JEX0ZMQUdTX1RfSVBJRFxcdFxcdFxcdFxcdCgxIFxcdTAwM2NcXHUwMDNjIDcpXFxuK1xcdCNkZWZpbmUgVFhfQkRfRkxBR1NfQ1JZUFRPX0VOXFx0XFx0XFx0XFx0KDEgXFx1MDAzY1xcdTAwM2MgMTUpXFxuIFxcdCNkZWZpbmUgVFhfQkRfSFNJWkVcXHRcXHRcXHRcXHRcXHQoMHhmZiBcXHUwMDNjXFx1MDAzYyAxNilcXG4gXFx0ICNkZWZpbmUgVFhfQkRfSFNJWkVfU0hJRlRcXHRcXHRcXHRcXHQgMTZcXG4tXFxuLVxcdF9fbGUzMiB0eF9iZF9tc3M7XFxuK1xcdCNkZWZpbmUgVFhfQkRfS0lEX0xPXFx0XFx0XFx0XFx0XFx0KDB4N2YgXFx1MDAzY1xcdTAwM2MgMjUpXFxuK1xcdCAjZGVmaW5lIFRYX0JEX0tJRF9MT19NQVNLXFx0XFx0XFx0XFx0IDB4N2ZcXG4rXFx0ICNkZWZpbmUgVFhfQkRfS0lEX0xPX1NISUZUXFx0XFx0XFx0XFx0IDI1XFxuK1xcbitcXHRfX2xlMzIgdHhfYmRfa2lkX21zcztcXG4rXFx0I2RlZmluZSBUWF9CRF9NU1NcXHRcXHRcXHRcXHRcXHQweDdmZmZcXG4rXFx0I2RlZmluZSBUWF9CRF9LSURfSElcXHRcXHRcXHRcXHRcXHQoMHgxZmZmZiBcXHUwMDNjXFx1MDAzYyAxNSlcXG4rXFx0ICNkZWZpbmUgVFhfQkRfS0lEX0hJX01BU0tcXHRcXHRcXHRcXHQgMHhmZmZmODBcXG4rXFx0ICNkZWZpbmUgVFhfQkRfS0lEX0hJX1NISUZUXFx0XFx0XFx0XFx0IDhcXG4gXFx0X19sZTMyIHR4X2JkX2NmYV9hY3Rpb247XFxuIFxcdCNkZWZpbmUgVFhfQkRfQ0ZBX0FDVElPTlxcdFxcdFxcdFxcdCgweGZmZmYgXFx1MDAzY1xcdTAwM2MgMTYpXFxuIFxcdCAjZGVmaW5lIFRYX0JEX0NGQV9BQ1RJT05fU0hJRlRcXHRcXHRcXHRcXHQgMTZcXG5AQCAtMTIxLDYgKzEzMCwxNiBAQCBzdHJ1Y3QgdHhfYmRfZXh0IHtcXG4gfTtcXG4gXFxuICNkZWZpbmUgQk5YVF9UWF9QVFBfSVNfU0VUKGxmbGFncykgKChsZmxhZ3MpIFxcdTAwMjYgY3B1X3RvX2xlMzIoVFhfQkRfRkxBR1NfU1RBTVApKVxcbisjZGVmaW5lIEJOWFRfVFhfS0lEX0xPKGtpZCkgKCgoa2lkKSBcXHUwMDI2IFRYX0JEX0tJRF9MT19NQVNLKSBcXHUwMDNjXFx1MDAzYyBUWF9CRF9LSURfTE9fU0hJRlQpXFxuKyNkZWZpbmUgQk5YVF9UWF9LSURfSEkoa2lkKSAoKChraWQpIFxcdTAwMjYgVFhfQkRfS0lEX0hJX01BU0spIFxcdTAwM2NcXHUwMDNjIFRYX0JEX0tJRF9ISV9TSElGVClcXG4rXFxuK3N0cnVjdCB0eF9iZF9wcmVzeW5jIHtcXG4rXFx0X19sZTMyIHR4X2JkX2xlbl9mbGFnc190eXBlO1xcbitcXHQgI2RlZmluZSBUWF9CRF9UWVBFX1BSRVNZTkNfVFhfQkRcXHRcXHRcXHQgKDB4MDkgXFx1MDAzY1xcdTAwM2MgMClcXG4rXFx0dTMyIHR4X2JkX29wYXF1ZTtcXG4rXFx0X19sZTMyIHR4X2JkX2tpZDtcXG4rXFx0dTMyIHR4X2JkX3VudXNlZDtcXG4rfTtcXG4gXFxuIHN0cnVjdCByeF9iZCB7XFxuIFxcdF9fbGUzMiByeF9iZF9sZW5fZmxhZ3NfdHlwZTtcXG5AQCAtMTYwLDYgKzE3OSw3IEBAIHN0cnVjdCB0eF9jbXAge1xcbiBcXHQgI2RlZmluZSBDTVBfVFlQRV9SWF9UUEFfQUdHX0NNUFxcdFxcdFxcdCAyMlxcbiBcXHQgI2RlZmluZSBDTVBfVFlQRV9SWF9MMl9WM19DTVBcXHRcXHRcXHRcXHQgMjNcXG4gXFx0ICNkZWZpbmUgQ01QX1RZUEVfUlhfTDJfVFBBX1NUQVJUX1YzX0NNUFxcdFxcdCAyNVxcbitcXHQgI2RlZmluZSBDTVBfVFlQRV9NUENfQ01QXFx0XFx0XFx0XFx0IDMwXFxuIFxcdCAjZGVmaW5lIENNUF9UWVBFX1NUQVRVU19DTVBcXHRcXHRcXHRcXHQgMzJcXG4gXFx0ICNkZWZpbmUgQ01QX1RZUEVfUkVNT1RFX0RSSVZFUl9SRVFcXHRcXHRcXHQgMzRcXG4gXFx0ICNkZWZpbmUgQ01QX1RZUEVfUkVNT1RFX0RSSVZFUl9SRVNQXFx0XFx0XFx0IDM2XFxuQEAgLTY4Niw2ICs3MDYsNyBAQCBzdHJ1Y3QgbnFlX2NuIHtcXG4gI2RlZmluZSBCTlhUX05RX0hETF9UWVBFX1NISUZUXFx0MjRcXG4gI2RlZmluZSBCTlhUX05RX0hETF9UWVBFX1JYXFx0MHgwMFxcbiAjZGVmaW5lIEJOWFRfTlFfSERMX1RZUEVfVFhcXHQweDAxXFxuKyNkZWZpbmUgQk5YVF9OUV9IRExfVFlQRV9NUFxcdDB4MDJcXG4gXFxuICNkZWZpbmUgQk5YVF9OUV9IRExfSURYKGhkbClcXHQoKGhkbCkgXFx1MDAyNiBCTlhUX05RX0hETF9JRFhfTUFTSylcXG4gI2RlZmluZSBCTlhUX05RX0hETF9UWVBFKGhkbClcXHQoKChoZGwpIFxcdTAwMjYgQk5YVF9OUV9IRExfVFlQRV9NQVNLKSBcXHUwMDNlXFx1MDAzZVxcdFxcXFxcXG5AQCAtODk2LDYgKzkxNyw3IEBAIHN0cnVjdCBibnh0X3N3X3R4X2JkIHtcXG4gXFx0dThcXHRcXHRcXHRpc19wdXNoO1xcbiBcXHR1OFxcdFxcdFxcdGlzX3N3X2dzbztcXG4gXFx0dThcXHRcXHRcXHRhY3Rpb247XFxuK1xcdHU4XFx0XFx0XFx0aW5saW5lX2RhdGFfYmRzO1xcbiBcXHR1bnNpZ25lZCBzaG9ydFxcdFxcdG5yX2ZyYWdzO1xcbiBcXHR1bmlvbiB7XFxuIFxcdFxcdHUxNlxcdFxcdFxcdHJ4X3Byb2Q7XFxuQEAgLTk1MSw2ICs5NzMsOCBAQCBzdHJ1Y3QgYm54dF9yaW5nX3N0cnVjdCB7XFxuIFxcdH07XFxuIFxcdHUzMlxcdFxcdFxcdGhhbmRsZTtcXG4gXFx0dThcXHRcXHRcXHRxdWV1ZV9pZDtcXG4rI2RlZmluZSBCTlhUX01QQ19RVUVVRV9JRFxcdDB4ZmZcXG4rXFx0dThcXHRcXHRcXHRtcGNfY2hubF90eXBlO1xcbiB9O1xcbiBcXG4gc3RydWN0IHR4X3B1c2hfYmQge1xcbkBAIC05OTEsMTIgKzEwMTUsMTYgQEAgc3RydWN0IGJueHRfdHhfcmluZ19pbmZvIHtcXG4gXFx0dTE2XFx0XFx0XFx0dHhfY29ucztcXG4gXFx0dTE2XFx0XFx0XFx0dHhfaHdfY29ucztcXG4gXFx0dTE2XFx0XFx0XFx0dHhxX2luZGV4O1xcbitcXHQvKiBpbmRleCBmb3IgdHhfcmluZ1tdIG9yIHR4X21wY19yaW5nW10gaW4gc3RydWN0IGJueHRfbmFwaSAqL1xcbiBcXHR1OFxcdFxcdFxcdHR4X25hcGlfaWR4O1xcbiBcXHR1OFxcdFxcdFxcdGtpY2tfcGVuZGluZztcXG4gXFx0c3RydWN0IGJueHRfZGJfaW5mb1xcdHR4X2RiO1xcbiBcXG4gXFx0c3RydWN0IHR4X2JkXFx0XFx0KnR4X2Rlc2NfcmluZ1tNQVhfVFhfUEFHRVNdO1xcbi1cXHRzdHJ1Y3QgYm54dF9zd190eF9iZFxcdCp0eF9idWZfcmluZztcXG4rXFx0dW5pb24ge1xcbitcXHRcXHRzdHJ1Y3QgYm54dF9zd190eF9iZFxcdCp0eF9idWZfcmluZztcXG4rXFx0XFx0c3RydWN0IGJueHRfc3dfbXBjX3R4X2JkXFx0KnR4X21wY19idWZfcmluZztcXG4rXFx0fTtcXG4gXFxuIFxcdGRtYV9hZGRyX3RcXHRcXHR0eF9kZXNjX21hcHBpbmdbTUFYX1RYX1BBR0VTXTtcXG4gXFxuQEAgLTEwMTQsOCArMTA0MiwxMSBAQCBzdHJ1Y3QgYm54dF90eF9yaW5nX2luZm8ge1xcbiBcXHR1MzJcXHRcXHRcXHRkZXZfc3RhdGU7XFxuIFxcbiBcXHRzdHJ1Y3QgYm54dF9yaW5nX3N0cnVjdFxcdHR4X3Jpbmdfc3RydWN0O1xcbi1cXHQvKiBTeW5jaHJvbml6ZSBzaW11bHRhbmVvdXMgeGRwX3htaXQgb24gc2FtZSByaW5nICovXFxuLVxcdHNwaW5sb2NrX3RcXHRcXHR4ZHBfdHhfbG9jaztcXG4rXFx0LyogU3luY2hyb25pemUgc2ltdWx0YW5lb3VzIHhkcF94bWl0IG9uIHNhbWUgcmluZyBvciBmb3IgTVBDIHJpbmcgKi9cXG4rXFx0c3BpbmxvY2tfdFxcdFxcdHR4X2xvY2s7XFxuK1xcbitcXHQvKiBQZXItVFgtcmluZyBrVExTIGNvdW50ZXJzOyBhbGxvY2F0ZWQgb25seSB3aGVuIGtUTFMgaXMgZW5hYmxlZC4gKi9cXG4rXFx0c3RydWN0IGJueHRfdGxzX3N3X3N0YXRzICp0bHNfc3RhdHM7XFxuIH07XFxuIFxcbiAjZGVmaW5lIEJOWFRfTEVHQUNZX0NPQUxfQ01QTF9QQVJBTVNcXHRcXHRcXHRcXHRcXHRcXFxcXFxuQEAgLTExNTcsNiArMTE4OCwyMiBAQCBzdHJ1Y3QgYm54dF9jbW5fc3dfc3RhdHMge1xcbiBcXHR1NjRcXHRcXHRcXHRtaXNzZWRfaXJxcztcXG4gfTtcXG4gXFxuKy8qIERhdGEgcGxhbmUga1RMUyBjb3VudGVycyAqL1xcbitlbnVtIGJueHRfa3Rsc19kYXRhX2NvdW50ZXJzIHtcXG4rXFx0Qk5YVF9LVExTX1RYX1BLVFMgPSAwLFxcbitcXHRCTlhUX0tUTFNfVFhfQllURVMsXFxuK1xcdEJOWFRfS1RMU19UWF9PT09fUEtUUyxcXG4rXFx0Qk5YVF9LVExTX1RYX09PT19GQUxMQkFDS19OT19TWU5DLFxcbitcXHRCTlhUX0tUTFNfVFhfT09PX0ZBTExCQUNLX05PX1NQQUNFLFxcbitcXHRCTlhUX0tUTFNfVFhfT09PX0ZBTExCQUNLX05PX0hEUixcXG4rXFxuK1xcdEJOWFRfS1RMU19NQVhfREFUQV9DT1VOVEVSUyxcXG4rfTtcXG4rXFxuK3N0cnVjdCBibnh0X3Rsc19zd19zdGF0cyB7XFxuK1xcdHU2NFxcdGNvdW50ZXJzW0JOWFRfS1RMU19NQVhfREFUQV9DT1VOVEVSU107XFxuK307XFxuK1xcbiBzdHJ1Y3QgYm54dF9zd19zdGF0cyB7XFxuIFxcdHN0cnVjdCBibnh0X3J4X3N3X3N0YXRzIHJ4O1xcbiBcXHRzdHJ1Y3QgYm54dF90eF9zd19zdGF0cyB0eDtcXG5AQCAtMTI0Miw2ICsxMjg5LDcgQEAgc3RydWN0IGJueHRfbmFwaSB7XFxuIFxcdHN0cnVjdCBibnh0X2NwX3JpbmdfaW5mb1xcdGNwX3Jpbmc7XFxuIFxcdHN0cnVjdCBibnh0X3J4X3JpbmdfaW5mb1xcdCpyeF9yaW5nO1xcbiBcXHRzdHJ1Y3QgYm54dF90eF9yaW5nX2luZm9cXHQqdHhfcmluZ1tCTlhUX01BWF9UWFJfUEVSX05BUEldO1xcbitcXHRzdHJ1Y3QgYm54dF90eF9yaW5nX2luZm9cXHQqKnR4X21wY19yaW5nO1xcbiBcXG4gXFx0dm9pZFxcdFxcdFxcdCgqdHhfaW50KShzdHJ1Y3QgYm54dCAqLCBzdHJ1Y3QgYm54dF9uYXBpICosXFxuIFxcdFxcdFxcdFxcdFxcdCAgaW50IGJ1ZGdldCk7XFxuQEAgLTEzNTUsNiArMTQwMywxNSBAQCBzdHJ1Y3QgYm54dF9od19yaW5ncyB7XFxuIFxcdGludCByc3NfY3R4O1xcbiB9O1xcbiBcXG4rc3RydWN0IGJueHRfaHdfY3J5cHRvX3Jlc2Mge1xcbitcXHR1MzJcXHRtaW5fdHhfa2V5X2N0eHM7XFxuK1xcdHUzMlxcdG1heF90eF9rZXlfY3R4cztcXG4rXFx0dTMyXFx0cmVzdl90eF9rZXlfY3R4cztcXG4rXFx0dTMyXFx0bWluX3J4X2tleV9jdHhzO1xcbitcXHR1MzJcXHRtYXhfcnhfa2V5X2N0eHM7XFxuK1xcdHUzMlxcdHJlc3Zfcnhfa2V5X2N0eHM7XFxuK307XFxuK1xcbiBzdHJ1Y3QgYm54dF9od19yZXNjIHtcXG4gXFx0dTE2XFx0bWluX3Jzc2Nvc19jdHhzO1xcbiBcXHR1MTZcXHRtYXhfcnNzY29zX2N0eHM7XFxuQEAgLTEzODksNiArMTQ0Niw4IEBAIHN0cnVjdCBibnh0X2h3X3Jlc2Mge1xcbiBcXHR1MzJcXHRtYXhfdHhfd21fZmxvd3M7XFxuIFxcdHUzMlxcdG1heF9yeF9lbV9mbG93cztcXG4gXFx0dTMyXFx0bWF4X3J4X3dtX2Zsb3dzO1xcbitcXG4rXFx0c3RydWN0IGJueHRfaHdfY3J5cHRvX3Jlc2NcXHRjcnlwdG9fcmVzYztcXG4gfTtcXG4gXFxuICNkZWZpbmUgQk5YVF9MQVJHRV9SU1NfVE9fVk5JQ19SQVRJT1xcdDdcXG5AQCAtMjQ1Miw2ICsyNTExLDEwIEBAIHN0cnVjdCBibnh0IHtcXG4gXFxuIFxcdHU4XFx0XFx0XFx0dHBoX21vZGU7XFxuIFxcbitcXHRzdHJ1Y3QgYm54dF9tcGNfaW5mb1xcdCptcGNfaW5mbztcXG4rXFx0c3RydWN0IGJueHRfY3J5cHRvX2luZm9cXHQqY3J5cHRvX2luZm87XFxuK1xcdHN0cnVjdCBibnh0X3Rsc19pbmZvXFx0Kmt0bHNfaW5mbztcXG4rXFxuIFxcdHVuc2lnbmVkIGludFxcdFxcdGN1cnJlbnRfaW50ZXJ2YWw7XFxuICNkZWZpbmUgQk5YVF9USU1FUl9JTlRFUlZBTFxcdEhaXFxuIFxcbkBAIC0yNTM4LDYgKzI2MDEsNyBAQCBzdHJ1Y3QgYm54dCB7XFxuIFxcdCNkZWZpbmUgQk5YVF9GV19DQVBfTlBBUl8xXzJcXHRcXHRcXHRCSVRfVUxMKDQyKVxcbiBcXHQjZGVmaW5lIEJOWFRfRldfQ0FQX01JUlJPUl9PTl9ST0NFXFx0XFx0QklUX1VMTCg0MylcXG4gXFx0I2RlZmluZSBCTlhUX0ZXX0NBUF9QVFBfUFRNXFx0XFx0XFx0QklUX1VMTCg0NClcXG4rXFx0I2RlZmluZSBCTlhUX0ZXX0NBUF9LVExTXFx0XFx0XFx0QklUX1VMTCg0NSlcXG4gXFxuIFxcdHUzMlxcdFxcdFxcdGZ3X2RiZ19jYXA7XFxuIFxcbkBAIC0yNTYzLDYgKzI2MjcsOCBAQCBzdHJ1Y3QgYm54dCB7XFxuIFxcdCgoYnApLVxcdTAwM2Vmd19jYXAgXFx1MDAyNiBCTlhUX0ZXX0NBUF9TV19NQVhfUkVTT1VSQ0VfTElNSVRTKVxcbiAjZGVmaW5lIEJOWFRfTUlSUk9SX09OX1JPQ0VfQ0FQKGJwKVxcdFxcXFxcXG4gXFx0KChicCktXFx1MDAzZWZ3X2NhcCBcXHUwMDI2IEJOWFRfRldfQ0FQX01JUlJPUl9PTl9ST0NFKVxcbisjZGVmaW5lIEJOWFRfU1VQUE9SVFNfS1RMUyhicClcXHRcXFxcXFxuK1xcdCgoYnApLVxcdTAwM2Vmd19jYXAgXFx1MDAyNiBCTlhUX0ZXX0NBUF9LVExTKVxcbiBcXG4gXFx0dTMyXFx0XFx0XFx0aHdybV9zcGVjX2NvZGU7XFxuIFxcdHUxNlxcdFxcdFxcdGh3cm1fY21kX3NlcTtcXG5AQCAtMjY0NSw2ICsyNzExLDcgQEAgc3RydWN0IGJueHQge1xcbiAjZGVmaW5lIEJOWFRfVEhFUk1BTF9USFJFU0hPTERfU1BfRVZFTlRcXHQyMlxcbiAjZGVmaW5lIEJOWFRfRldfRUNIT19SRVFVRVNUX1NQX0VWRU5UXFx0MjNcXG4gI2RlZmluZSBCTlhUX1JFU1RBUlRfVUxQX1NQX0VWRU5UXFx0MjRcXG4rI2RlZmluZSBCTlhUX01QQ19SRVNFVF9TUF9FVkVOVFxcdFxcdDI1XFxuIFxcbiBcXHRzdHJ1Y3QgZGVsYXllZF93b3JrXFx0ZndfcmVzZXRfdGFzaztcXG4gXFx0aW50XFx0XFx0XFx0ZndfcmVzZXRfc3RhdGU7XFxuQEAgLTI4NTYsMTQgKzI5MjMsMTQgQEAgc3RhdGljIGlubGluZSB1MzIgYm54dF90eF9hdmFpbChzdHJ1Y3QgYm54dCAqYnAsXFxuIHN0YXRpYyBpbmxpbmUgc3RydWN0IHR4X2JkX2V4dCAqXFxuIGJueHRfaW5pdF9leHRfYmQoc3RydWN0IGJueHQgKmJwLCBzdHJ1Y3QgYm54dF90eF9yaW5nX2luZm8gKnR4cixcXG4gXFx0XFx0IHUxNiBwcm9kLCBfX2xlMzIgbGZsYWdzLCB1MzIgdmxhbl90YWdfZmxhZ3MsXFxuLVxcdFxcdCB1MzIgY2ZhX2FjdGlvbilcXG4rXFx0XFx0IHUzMiBjZmFfYWN0aW9uLCB1MzIga2lkKVxcbiB7XFxuIFxcdHN0cnVjdCB0eF9iZF9leHQgKnR4YmQxO1xcbiBcXG4gXFx0dHhiZDEgPSAoc3RydWN0IHR4X2JkX2V4dCAqKVxcbiBcXHRcXHRcXHUwMDI2dHhyLVxcdTAwM2V0eF9kZXNjX3JpbmdbVFhfUklORyhicCwgcHJvZCldW1RYX0lEWChwcm9kKV07XFxuIFxcdHR4YmQxLVxcdTAwM2V0eF9iZF9oc2l6ZV9sZmxhZ3MgPSBsZmxhZ3M7XFxuLVxcdHR4YmQxLVxcdTAwM2V0eF9iZF9tc3MgPSAwO1xcbitcXHR0eGJkMS1cXHUwMDNldHhfYmRfa2lkX21zcyA9IGNwdV90b19sZTMyKEJOWFRfVFhfS0lEX0hJKGtpZCkpO1xcbiBcXHR0eGJkMS1cXHUwMDNldHhfYmRfY2ZhX21ldGEgPSBjcHVfdG9fbGUzMih2bGFuX3RhZ19mbGFncyk7XFxuIFxcdHR4YmQxLVxcdTAwM2V0eF9iZF9jZmFfYWN0aW9uID1cXG4gXFx0XFx0Y3B1X3RvX2xlMzIoY2ZhX2FjdGlvbiBcXHUwMDNjXFx1MDAzYyBUWF9CRF9DRkFfQUNUSU9OX1NISUZUKTtcXG5AQCAtMjk1NywxMSArMzAyNCwxNCBAQCBzdGF0aWMgaW5saW5lIGVudW0gcGt0X2hhc2hfdHlwZXMgYm54dF9yc3NfZXh0X29wKHN0cnVjdCBibnh0ICpicCxcXG4gZXh0ZXJuIGNvbnN0IHUxNiBibnh0X2JzdG9yZV90b190cmFjZVtdO1xcbiBleHRlcm4gY29uc3QgdTE2IGJueHRfbGhpbnRfYXJyW107XFxuIFxcbit2b2lkIGJueHRfcXVldWVfc3Bfd29yayhzdHJ1Y3QgYm54dCAqYnAsIHVuc2lnbmVkIGludCBldmVudCk7XFxuIGludCBibnh0X2FsbG9jX3J4X2RhdGEoc3RydWN0IGJueHQgKmJwLCBzdHJ1Y3QgYm54dF9yeF9yaW5nX2luZm8gKnJ4cixcXG4gXFx0XFx0ICAgICAgIHUxNiBwcm9kLCBnZnBfdCBnZnApO1xcbiB2b2lkIGJueHRfcmV1c2VfcnhfZGF0YShzdHJ1Y3QgYm54dF9yeF9yaW5nX2luZm8gKnJ4ciwgdTE2IGNvbnMsIHZvaWQgKmRhdGEpO1xcbiB1MzIgYm54dF9md19oZWFsdGhfcmVhZGwoc3RydWN0IGJueHQgKmJwLCBpbnQgcmVnX2lkeCk7XFxuIGJvb2wgYm54dF9ic190cmFjZV9hdmFpbChzdHJ1Y3QgYm54dCAqYnAsIHUxNiB0eXBlKTtcXG4rdm9pZCBibnh0X2ZyZWVfcmluZyhzdHJ1Y3QgYm54dCAqYnAsIHN0cnVjdCBibnh0X3JpbmdfbWVtX2luZm8gKnJtZW0pO1xcbitpbnQgYm54dF9hbGxvY19yaW5nKHN0cnVjdCBibnh0ICpicCwgc3RydWN0IGJueHRfcmluZ19tZW1faW5mbyAqcm1lbSk7XFxuIHZvaWQgYm54dF9zZXRfdHBhX2ZsYWdzKHN0cnVjdCBibnh0ICpicCk7XFxuIHZvaWQgYm54dF9zZXRfcmluZ19wYXJhbXMoc3RydWN0IGJueHQgKik7XFxuIHZvaWQgYm54dF9zZXRfcnhfc2tiX21vZGUoc3RydWN0IGJueHQgKmJwLCBib29sIHBhZ2VfbW9kZSk7XFxuQEAgLTI5OTAsNiArMzA2MCwxNCBAQCBpbnQgYm54dF9od3JtX3ZuaWNfY2ZnKHN0cnVjdCBibnh0ICpicCwgc3RydWN0IGJueHRfdm5pY19pbmZvICp2bmljKTtcXG4gaW50IGJueHRfaHdybV92bmljX2FsbG9jKHN0cnVjdCBibnh0ICpicCwgc3RydWN0IGJueHRfdm5pY19pbmZvICp2bmljLFxcbiBcXHRcXHRcXHQgdW5zaWduZWQgaW50IHN0YXJ0X3J4X3JpbmdfaWR4LFxcbiBcXHRcXHRcXHQgdW5zaWduZWQgaW50IG5yX3JpbmdzKTtcXG4raW50IGJueHRfaHdybV9jcF9yaW5nX2FsbG9jX3A1KHN0cnVjdCBibnh0ICpicCwgc3RydWN0IGJueHRfY3BfcmluZ19pbmZvICpjcHIpO1xcbitpbnQgYm54dF9od3JtX3R4X3JpbmdfYWxsb2Moc3RydWN0IGJueHQgKmJwLCBzdHJ1Y3QgYm54dF90eF9yaW5nX2luZm8gKnR4cixcXG4rXFx0XFx0XFx0ICAgIHUzMiB0eF9pZHgpO1xcbit2b2lkIGJueHRfaHdybV90eF9yaW5nX2ZyZWUoc3RydWN0IGJueHQgKmJwLCBzdHJ1Y3QgYm54dF90eF9yaW5nX2luZm8gKnR4cixcXG4rXFx0XFx0XFx0ICAgIGJvb2wgY2xvc2VfcGF0aCk7XFxuK3ZvaWQgYm54dF9od3JtX2NwX3JpbmdfZnJlZShzdHJ1Y3QgYm54dCAqYnAsIHN0cnVjdCBibnh0X2NwX3JpbmdfaW5mbyAqY3ByKTtcXG4rdm9pZCBibnh0X2NsZWFyX29uZV9jcF9yaW5nKHN0cnVjdCBibnh0ICpicCwgc3RydWN0IGJueHRfY3BfcmluZ19pbmZvICpjcHIpO1xcbitpbnQgYm54dF90b3RhbF90eF9yaW5ncyhzdHJ1Y3QgYm54dCAqYnApO1xcbiBpbnQgX19ibnh0X2h3cm1fZ2V0X3R4X3JpbmdzKHN0cnVjdCBibnh0ICpicCwgdTE2IGZpZCwgaW50ICp0eF9yaW5ncyk7XFxuIGludCBibnh0X25xX3JpbmdzX2luX3VzZShzdHJ1Y3QgYm54dCAqYnApO1xcbiBpbnQgYm54dF9od3JtX3NldF9jb2FsKHN0cnVjdCBibnh0ICopO1xcbkBAIC0zMDM1LDEwICszMTEzLDExIEBAIHZvaWQgYm54dF9zeW5jX3Jpbmdfc3RhdHMoc3RydWN0IGJueHQgKmJwKTtcXG4gYm9vbCBibnh0X3Jmc19jYXBhYmxlKHN0cnVjdCBibnh0ICpicCwgYm9vbCBuZXdfcnNzX2N0eCk7XFxuIGludCBibnh0X2RiZ19od3JtX3JkX3JlZyhzdHJ1Y3QgYm54dCAqYnAsIHUzMiByZWdfb2ZmLCB1MTYgbnVtX3dvcmRzLFxcbiBcXHRcXHRcXHQgdTMyICpyZWdfYnVmKTtcXG4rdm9pZCBibnh0X3Jlc2V0X3Rhc2soc3RydWN0IGJueHQgKmJwLCBib29sIHNpbGVudCk7XFxuIHZvaWQgYm54dF9md19leGNlcHRpb24oc3RydWN0IGJueHQgKmJwKTtcXG4gdm9pZCBibnh0X2Z3X3Jlc2V0KHN0cnVjdCBibnh0ICpicCk7XFxuIGludCBibnh0X2NoZWNrX3JpbmdzKHN0cnVjdCBibnh0ICpicCwgaW50IHR4LCBpbnQgcngsIGJvb2wgc2gsIGludCB0Y3MsXFxuLVxcdFxcdCAgICAgaW50IHR4X3hkcCk7XFxuK1xcdFxcdCAgICAgaW50IHR4X3hkcCwgaW50IG1wY190eCwgaW50IG1wY19jcCk7XFxuIGludCBibnh0X2Z3X2luaXRfb25lKHN0cnVjdCBibnh0ICpicCk7XFxuIGJvb2wgYm54dF9od3JtX3Jlc2V0X3Blcm1pdHRlZChzdHJ1Y3QgYm54dCAqYnApO1xcbiB2b2lkIGJueHRfc2V0X2NwX3JpbmdzKHN0cnVjdCBibnh0ICpicCwgYm9vbCBzaCk7XFxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dF9jcnlwdG8uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dF9jcnlwdG8uY1xcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggMDAwMDAwMDAwMDAwMDAuLjI3YTk3OGJkMThlMjAzXFxuLS0tIC9kZXYvbnVsbFxcbisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dF9jcnlwdG8uY1xcbkBAIC0wLDAgKzEsNjE3IEBAXFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcXG4rLyogQ29weXJpZ2h0IChjKSAyMDI2IEJyb2FkY29tIEluYy4gKi9cXG4rXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9zdGRkZWYuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3R5cGVzLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9rZXJuZWwuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3NsYWIuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3BjaS5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvYm54dC9oc2kuaFxcdTAwM2VcXG4rXFxuKyNpbmNsdWRlIFxcXCJibnh0LmhcXFwiXFxuKyNpbmNsdWRlIFxcXCJibnh0X2h3cm0uaFxcXCJcXG4rI2luY2x1ZGUgXFxcImJueHRfbXBjLmhcXFwiXFxuKyNpbmNsdWRlIFxcXCJibnh0X2t0bHMuaFxcXCJcXG4rI2luY2x1ZGUgXFxcImJueHRfY3J5cHRvLmhcXFwiXFxuK1xcbitzdGF0aWMgdTMyIGJueHRfZ2V0X21heF9jcnlwdG9fa2V5X2N0eChzdHJ1Y3QgYm54dCAqYnAsIGludCBrZXlfdHlwZSlcXG4re1xcbitcXHR1MzIgZndfbWFqID0gQk5YVF9GV19NQUooYnApO1xcbitcXG4rXFx0aWYgKGtleV90eXBlID09IEJOWFRfVFhfQ1JZUFRPX0tFWV9UWVBFKVxcbitcXHRcXHRyZXR1cm4gKGZ3X21haiBcXHUwMDNjIDIzMykgPyBCTlhUX01BWF9UWF9DUllQVE9fS0VZU19QUkVfMjMzRlcgOlxcbitcXHRcXHQgICAgICAgQk5YVF9NQVhfVFhfQ1JZUFRPX0tFWVM7XFxuK1xcbitcXHRyZXR1cm4gKGZ3X21haiBcXHUwMDNjIDIzMykgPyBCTlhUX01BWF9SWF9DUllQVE9fS0VZU19QUkVfMjMzRlcgOlxcbitcXHQgICAgICAgQk5YVF9NQVhfUlhfQ1JZUFRPX0tFWVM7XFxuK31cXG4rXFxuKy8qKlxcbisgKiBibnh0X2FsbG9jX2NyeXB0b19pbmZvIC0gQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgY3J5cHRvIG9mZmxvYWQgY29udGV4dFxcbisgKiBAYnA6IHBvaW50ZXIgdG8gYm54dCBkZXZpY2VcXG4rICogQHJlc3A6IHBvaW50ZXIgdG8gZmlybXdhcmUgY2FwYWJpbGl0eSByZXNwb25zZVxcbisgKlxcbisgKiBBbGxvY2F0ZXMgdGhlIG1haW4gY3J5cHRvIGluZm8gc3RydWN0dXJlXFxuKyAqXFxuKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGR1cmluZyBkZXZpY2UgaW5pdGlhbGl6YXRpb24gd2hlbiBmaXJtd2FyZVxcbisgKiByZXBvcnRzIGNyeXB0byBvZmZsb2FkIGNhcGFiaWxpdHkuIElmIGFsbG9jYXRpb24gZmFpbHMsIGNyeXB0byBvZmZsb2FkXFxuKyAqIHdpbGwgbm90IGJlIGF2YWlsYWJsZSBidXQgdGhlIGRldmljZSB3aWxsIHN0aWxsIGZ1bmN0aW9uLlxcbisgKlxcbisgKiBDb250ZXh0OiBQcm9jZXNzIGNvbnRleHRcXG4rICovXFxuK3ZvaWQgYm54dF9hbGxvY19jcnlwdG9faW5mbyhzdHJ1Y3QgYm54dCAqYnAsXFxuK1xcdFxcdFxcdCAgICBzdHJ1Y3QgaHdybV9mdW5jX3FjYXBzX291dHB1dCAqcmVzcClcXG4re1xcbitcXHR1MTYgbWF4X2tleXMgPSBsZTE2X3RvX2NwdShyZXNwLVxcdTAwM2VtYXhfa2V5X2N0eHNfYWxsb2MpO1xcbitcXHRzdHJ1Y3QgYm54dF9jcnlwdG9faW5mbyAqY3J5cHRvID0gYnAtXFx1MDAzZWNyeXB0b19pbmZvO1xcbitcXHRzdHJ1Y3QgYm54dF9rY3R4ICprY3R4O1xcbitcXHRjaGFyIG5hbWVbNjRdO1xcbitcXHRpbnQgaTtcXG4rXFxuK1xcdGlmIChCTlhUX1ZGKGJwKSlcXG4rXFx0XFx0cmV0dXJuO1xcbitcXHRpZiAoIWNyeXB0bykge1xcbitcXHRcXHRjcnlwdG8gPSBremFsbG9jX29iaigqY3J5cHRvKTtcXG4rXFx0XFx0aWYgKCFjcnlwdG8pIHtcXG4rXFx0XFx0XFx0bmV0ZGV2X3dhcm4oYnAtXFx1MDAzZWRldixcXG4rXFx0XFx0XFx0XFx0ICAgIFxcXCJVbmFibGUgdG8gYWxsb2NhdGUgY3J5cHRvIGluZm9cXFxcblxcXCIpO1xcbitcXHRcXHRcXHRyZXR1cm47XFxuK1xcdFxcdH1cXG4rXFx0XFx0c25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCBcXFwiYm54dF9jcnlwdG8tJXNcXFwiLFxcbitcXHRcXHRcXHQgZGV2X25hbWUoXFx1MDAyNmJwLVxcdTAwM2VwZGV2LVxcdTAwM2VkZXYpKTtcXG4rXFx0XFx0Y3J5cHRvLVxcdTAwM2VtcGNfY2FjaGUgPVxcbitcXHRcXHRcXHRrbWVtX2NhY2hlX2NyZWF0ZShuYW1lLFxcbitcXHRcXHRcXHRcXHRcXHQgIHNpemVvZihzdHJ1Y3QgYm54dF9jcnlwdG9fY21kX2N0eCksXFxuK1xcdFxcdFxcdFxcdFxcdCAgMCwgU0xBQl9IV0NBQ0hFX0FMSUdOLCBOVUxMKTtcXG4rXFx0XFx0aWYgKCFjcnlwdG8tXFx1MDAzZW1wY19jYWNoZSlcXG4rXFx0XFx0XFx0Z290byBhbGxvY19lcnI7XFxuK1xcbitcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgQk5YVF9NQVhfQ1JZUFRPX0tFWV9UWVBFOyBpKyspIHtcXG4rXFx0XFx0XFx0a2N0eCA9IFxcdTAwMjZjcnlwdG8tXFx1MDAzZWtjdHhbaV07XFxuK1xcdFxcdFxcdGtjdHgtXFx1MDAzZXR5cGUgPSBpO1xcbitcXHRcXHRcXHRJTklUX0xJU1RfSEVBRChcXHUwMDI2a2N0eC1cXHUwMDNlbGlzdCk7XFxuK1xcdFxcdFxcdHNwaW5fbG9ja19pbml0KFxcdTAwMjZrY3R4LVxcdTAwM2Vsb2NrKTtcXG4rXFx0XFx0XFx0YXRvbWljX3NldChcXHUwMDI2a2N0eC1cXHUwMDNlYWxsb2NfcGVuZGluZywgMCk7XFxuK1xcdFxcdFxcdGluaXRfd2FpdHF1ZXVlX2hlYWQoXFx1MDAyNmtjdHgtXFx1MDAzZWFsbG9jX3BlbmRpbmdfd3EpO1xcbitcXHRcXHR9XFxuK1xcdFxcdGJwLVxcdTAwM2VjcnlwdG9faW5mbyA9IGNyeXB0bztcXG4rXFx0fVxcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgQk5YVF9NQVhfQ1JZUFRPX0tFWV9UWVBFOyBpKyspIHtcXG4rXFx0XFx0a2N0eCA9IFxcdTAwMjZjcnlwdG8tXFx1MDAzZWtjdHhbaV07XFxuK1xcdFxcdGtjdHgtXFx1MDAzZW1heF9jdHggPSBibnh0X2dldF9tYXhfY3J5cHRvX2tleV9jdHgoYnAsIGkpO1xcbitcXHR9XFxuK1xcdGNyeXB0by1cXHUwMDNlbWF4X2tleV9jdHhzX2FsbG9jID0gbWF4X2tleXM7XFxuK1xcdGlmICghYnAtXFx1MDAzZWt0bHNfaW5mbylcXG4rXFx0XFx0Ym54dF9hbGxvY19rdGxzX2luZm8oYnApO1xcbitcXHRpZiAoYnAtXFx1MDAzZWt0bHNfaW5mbylcXG4rXFx0XFx0YnAtXFx1MDAzZWZ3X2NhcCB8PSBCTlhUX0ZXX0NBUF9LVExTO1xcbitcXHRyZXR1cm47XFxuK1xcbithbGxvY19lcnI6XFxuK1xcdGtmcmVlKGNyeXB0byk7XFxuK31cXG4rXFxuK2ludCBibnh0X2NyeXB0b19kZWwoc3RydWN0IGJueHQgKmJwLCB1OCB0eXBlLCB1OCBraW5kLCB1MzIga2lkKVxcbit7XFxuK1xcdHN0cnVjdCBibnh0X3R4X3JpbmdfaW5mbyAqdHhyO1xcbitcXHRzdHJ1Y3QgY2VfZGVsZXRlX2NtZCBjbWQgPSB7fTtcXG4rXFx0dTMyIGRhdGE7XFxuK1xcbitcXHRpZiAoQk5YVF9OT19GV19BQ0NFU1MoYnApKVxcbitcXHRcXHRyZXR1cm4gMDtcXG4rXFxuK1xcdHR4ciA9IGJueHRfc2VsZWN0X21wY19yaW5nKGJwLCB0eXBlKTtcXG4rXFx0aWYgKCF0eHIpXFxuK1xcdFxcdHJldHVybiAtRU5PREVWO1xcbitcXHRpZiAoa2luZCA9PSBCTlhUX0NUWF9LSU5EX0NLX1RYKVxcbitcXHRcXHRkYXRhID0gQ0VfREVMRVRFX0NNRF9DVFhfS0lORF9DS19UWDtcXG4rXFx0ZWxzZSBpZiAoa2luZCA9PSBCTlhUX0NUWF9LSU5EX0NLX1JYKVxcbitcXHRcXHRkYXRhID0gQ0VfREVMRVRFX0NNRF9DVFhfS0lORF9DS19SWDtcXG4rXFx0ZWxzZVxcbitcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4rXFxuK1xcdGRhdGEgfD0gQ0VfREVMRVRFX0NNRF9PUENPREVfREVMIHxcXG4rXFx0XFx0KEJOWFRfS0lEX0hXKGtpZCkgXFx1MDAzY1xcdTAwM2MgQ0VfREVMRVRFX0NNRF9LSURfU0ZUKTtcXG4rXFxuK1xcdGNtZC5jdHhfa2luZF9raWRfb3Bjb2RlID0gY3B1X3RvX2xlMzIoZGF0YSk7XFxuK1xcdHJldHVybiBibnh0X3htaXRfY3J5cHRvX2NtZChicCwgdHhyLCBcXHUwMDI2Y21kLCBzaXplb2YoY21kKSxcXG4rXFx0XFx0XFx0XFx0ICAgIEJOWFRfTVBDX1RNT19NU0VDUyk7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIGJueHRfY3J5cHRvX2RlbF9hbGxfa2lkcyhzdHJ1Y3QgYm54dCAqYnAsIHN0cnVjdCBibnh0X2tpZF9pbmZvICpraWQpXFxuK3tcXG4rXFx0aW50IGksIHJjO1xcbitcXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIGtpZC1cXHUwMDNlY291bnQ7IGkrKykge1xcbitcXHRcXHRpZiAoIXRlc3RfYml0KGksIGtpZC1cXHUwMDNlaWRzKSkge1xcbitcXHRcXHRcXHRyYyA9IGJueHRfY3J5cHRvX2RlbChicCwga2lkLVxcdTAwM2V0eXBlLCBraWQtXFx1MDAzZWtpbmQsXFxuK1xcdFxcdFxcdFxcdFxcdCAgICAga2lkLVxcdTAwM2VzdGFydF9pZCArIGkpO1xcbitcXHRcXHRcXHRpZiAoIXJjKVxcbitcXHRcXHRcXHRcXHRzZXRfYml0KGksIGtpZC1cXHUwMDNlaWRzKTtcXG4rXFx0XFx0fVxcbitcXHR9XFxuK31cXG4rXFxuKy8qKlxcbisgKiBibnh0X2NyeXB0b19kZWxfYWxsIC0gRGVsZXRlIGFsbCBjcnlwdG8gY29ubmVjdGlvbnNcXG4rICogQGJwOiBwb2ludGVyIHRvIGJueHQgZGV2aWNlXFxuKyAqXFxuKyAqIERlbGV0ZSBhbGwgY3J5cHRvIGNvbm5lY3Rpb25zIGFuZCBmcmVlIGFsbCBLSURzIGZvciByZS11c2UgZHVyaW5nXFxuKyAqIHNodXRkb3duLiAgSW5jcmVtZW50IHRoZSBlcG9jaCBjb3VudGVyIHRvIGludmFsaWRhdGUgYW55IG91dHN0YW5kaW5nXFxuKyAqIGtleSByZWZlcmVuY2VzLlxcbisgKlxcbisgKiBMb2NraW5nOiB0aGUgY2FsbGVyIG11c3QgaGF2ZSBjbGVhcmVkIEJOWFRfU1RBVEVfT1BFTiBhbmQgd2FpdGVkIGZvciBhbGxcXG4rICogaW4tZmxpZ2h0IGtUTFMgY29udHJvbCBvcHMgdG8gZHJhaW4uICBVbmRlciB0aGVzZSBwcmVjb25kaXRpb25zIHRoZXJlIGFyZVxcbisgKiBubyBjb25jdXJyZW50IHJlYWRlcnMgb3Igd3JpdGVycyBvZiB0aGUgS0lEIGxpc3RzLCBzbyB0aGUgbGlzdHMgY2FuIGJlXFxuKyAqIHdhbGtlZCB3aXRob3V0IHJjdV9yZWFkX2xvY2soKSBvciB0aGUga2N0eCBsb2NrLlxcbisgKlxcbisgKiBDb250ZXh0OiBQcm9jZXNzIGNvbnRleHQgZHVyaW5nIHNodXRkb3duL3Jlc2V0XFxuKyAqL1xcbit2b2lkIGJueHRfY3J5cHRvX2RlbF9hbGwoc3RydWN0IGJueHQgKmJwKVxcbit7XFxuK1xcdHN0cnVjdCBibnh0X2NyeXB0b19pbmZvICpjcnlwdG8gPSBicC1cXHUwMDNlY3J5cHRvX2luZm87XFxuK1xcdHN0cnVjdCBibnh0X2tpZF9pbmZvICpraWQ7XFxuK1xcdHN0cnVjdCBibnh0X2tjdHggKmtjdHg7XFxuK1xcdGludCBpO1xcbitcXG4rXFx0aWYgKCFjcnlwdG8pXFxuK1xcdFxcdHJldHVybjtcXG4rXFxuK1xcdC8qIE5vIGNvbmN1cnJlbnQgYWNjZXNzOyBzZWUgdGhlIGxvY2tpbmcgbm90ZSBhYm92ZS4gKi9cXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIEJOWFRfTUFYX0NSWVBUT19LRVlfVFlQRTsgaSsrKSB7XFxuK1xcdFxcdGtjdHggPSBcXHUwMDI2Y3J5cHRvLVxcdTAwM2VrY3R4W2ldO1xcbitcXHRcXHRsaXN0X2Zvcl9lYWNoX2VudHJ5KGtpZCwgXFx1MDAyNmtjdHgtXFx1MDAzZWxpc3QsIGxpc3QpXFxuK1xcdFxcdFxcdGJueHRfY3J5cHRvX2RlbF9hbGxfa2lkcyhicCwga2lkKTtcXG4rXFx0XFx0a2N0eC1cXHUwMDNlZXBvY2ggPSBCTlhUX05FWFRfRVBPQ0goa2N0eC1cXHUwMDNlZXBvY2gpO1xcbitcXHR9XFxuK31cXG4rXFxuKy8qKlxcbisgKiBibnh0X2NsZWFyX2NyeXB0byAtIENsZWFyIGFsbCBjcnlwdG8ga2V5IGNvbnRleHRzXFxuKyAqIEBicDogcG9pbnRlciB0byBibnh0IGRldmljZVxcbisgKlxcbisgKiBDbGVhcnMgYWxsIGtleSBjb250ZXh0IGFsbG9jYXRpb25zIGR1cmluZyBzaHV0ZG93biBvciBmaXJtd2FyZSByZXNldC5cXG4rICogRnJlZXMgYWxsIGtleSBpbmZvIHN0cnVjdHVyZXMgYW5kIGJpdG1hcHMsIGFuZCBpbmNyZW1lbnRzIHRoZSBlcG9jaFxcbisgKiBjb3VudGVyIHRvIGludmFsaWRhdGUgYW55IG91dHN0YW5kaW5nIGtleSByZWZlcmVuY2VzLlxcbisgKlxcbisgKiBMb2NraW5nOiB0aGUgY2FsbGVyIG11c3QgaGF2ZSBjbGVhcmVkIEJOWFRfU1RBVEVfT1BFTiBhbmQgd2FpdGVkIGZvciBhbGxcXG4rICogaW4tZmxpZ2h0IGtUTFMgY29udHJvbCBvcHMgdG8gZHJhaW4uICBVbmRlciB0aGVzZSBwcmVjb25kaXRpb25zIHRoZXJlIGFyZVxcbisgKiBubyBjb25jdXJyZW50IHJlYWRlcnMgb3Igd3JpdGVycyBvZiB0aGUgS0lEIGxpc3RzLCBzbyB0aGUgbGlzdHMgY2FuIGJlXFxuKyAqIHdhbGtlZCB3aXRob3V0IHJjdV9yZWFkX2xvY2soKSBvciB0aGUga2N0eCBsb2NrLlxcbisgKlxcbisgKiBDb250ZXh0OiBQcm9jZXNzIGNvbnRleHQgZHVyaW5nIHNodXRkb3duL3Jlc2V0XFxuKyAqL1xcbit2b2lkIGJueHRfY2xlYXJfY3J5cHRvKHN0cnVjdCBibnh0ICpicClcXG4re1xcbitcXHRzdHJ1Y3QgYm54dF9jcnlwdG9faW5mbyAqY3J5cHRvID0gYnAtXFx1MDAzZWNyeXB0b19pbmZvO1xcbitcXHRzdHJ1Y3QgYm54dF9raWRfaW5mbyAqa2lkLCAqdG1wO1xcbitcXHRzdHJ1Y3QgYm54dF9rY3R4ICprY3R4O1xcbitcXHRpbnQgaTtcXG4rXFxuK1xcdGlmICghY3J5cHRvKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcbitcXHQvKiBObyBjb25jdXJyZW50IGFjY2Vzczsgc2VlIHRoZSBsb2NraW5nIG5vdGUgYWJvdmUuICovXFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBCTlhUX01BWF9DUllQVE9fS0VZX1RZUEU7IGkrKykge1xcbitcXHRcXHRrY3R4ID0gXFx1MDAyNmNyeXB0by1cXHUwMDNla2N0eFtpXTtcXG4rXFx0XFx0bGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGtpZCwgdG1wLCBcXHUwMDI2a2N0eC1cXHUwMDNlbGlzdCwgbGlzdCkge1xcbitcXHRcXHRcXHRsaXN0X2RlbChcXHUwMDI2a2lkLVxcdTAwM2VsaXN0KTtcXG4rXFx0XFx0XFx0a2ZyZWUoa2lkKTtcXG4rXFx0XFx0fVxcbitcXHRcXHRrY3R4LVxcdTAwM2V0b3RhbF9hbGxvYyA9IDA7XFxuK1xcdFxcdGtjdHgtXFx1MDAzZWVwb2NoID0gQk5YVF9ORVhUX0VQT0NIKGtjdHgtXFx1MDAzZWVwb2NoKTtcXG4rXFx0fVxcbit9XFxuK1xcbisvKipcXG4rICogYm54dF9mcmVlX2NyeXB0b19pbmZvIC0gRnJlZSBjcnlwdG8gb2ZmbG9hZCByZXNvdXJjZXNcXG4rICogQGJwOiBwb2ludGVyIHRvIGJueHQgZGV2aWNlXFxuKyAqXFxuKyAqIEZyZWVzIGFsbCByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIGNyeXB0byBvZmZsb2FkLiAgQ2FsbCB0aGlzIGZ1bmN0aW9uXFxuKyAqIG9ubHkgd2hlbiBpdCBpcyBpZGxlIHdpdGggbm90aGluZyBpbi1mbGlnaHQuXFxuKyAqXFxuKyAqIENvbnRleHQ6IFByb2Nlc3MgY29udGV4dCBkdXJpbmcgZGV2aWNlIHNodXRkb3duL3JlbW92YWxcXG4rICovXFxuK3ZvaWQgYm54dF9mcmVlX2NyeXB0b19pbmZvKHN0cnVjdCBibnh0ICpicClcXG4re1xcbitcXHRzdHJ1Y3QgYm54dF9jcnlwdG9faW5mbyAqY3J5cHRvID0gYnAtXFx1MDAzZWNyeXB0b19pbmZvO1xcbitcXG4rXFx0Ym54dF9mcmVlX2t0bHNfaW5mbyhicCk7XFxuK1xcdGlmICghY3J5cHRvKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcdGJueHRfY2xlYXJfY3J5cHRvKGJwKTtcXG4rXFx0a21lbV9jYWNoZV9kZXN0cm95KGNyeXB0by1cXHUwMDNlbXBjX2NhY2hlKTtcXG4rXFx0a2ZyZWUoY3J5cHRvKTtcXG4rXFx0YnAtXFx1MDAzZWNyeXB0b19pbmZvID0gTlVMTDtcXG4rXFx0YnAtXFx1MDAzZWZ3X2NhcCBcXHUwMDI2PSB+Qk5YVF9GV19DQVBfS1RMUztcXG4rfVxcbitcXG4rLyoqXFxuKyAqIGJueHRfaHdybV9yZXNlcnZlX3BmX2tleV9jdHhzIC0gUmVzZXJ2ZSBrZXkgY29udGV4dHMgd2l0aCBmaXJtd2FyZVxcbisgKiBAYnA6IHBvaW50ZXIgdG8gYm54dCBkZXZpY2VcXG4rICogQHJlcTogcG9pbnRlciB0byBIV1JNIGZ1bmN0aW9uIGNvbmZpZyByZXF1ZXN0XFxuKyAqXFxuKyAqIFBvcHVsYXRlcyB0aGUgZmlybXdhcmUgcmVxdWVzdCB3aXRoIGtleSBjb250ZXh0IHJlc2VydmF0aW9uIHBhcmFtZXRlcnNcXG4rICogZm9yIGNyeXB0byBvZmZsb2FkIGJhc2VkIG9uIGN1cnJlbnQgbWF4IHNldHRpbmdzIGFuZCBjYXBhYmlsaXRpZXMuXFxuKyAqXFxuKyAqIENvbnRleHQ6IFByb2Nlc3MgY29udGV4dCBkdXJpbmcgZGV2aWNlIGNvbmZpZ3VyYXRpb25cXG4rICovXFxuK3ZvaWQgYm54dF9od3JtX3Jlc2VydmVfcGZfa2V5X2N0eHMoc3RydWN0IGJueHQgKmJwLFxcbitcXHRcXHRcXHRcXHQgICBzdHJ1Y3QgaHdybV9mdW5jX2NmZ19pbnB1dCAqcmVxKVxcbit7XFxuK1xcdHN0cnVjdCBibnh0X2NyeXB0b19pbmZvICpjcnlwdG8gPSBicC1cXHUwMDNlY3J5cHRvX2luZm87XFxuK1xcdHN0cnVjdCBibnh0X2h3X3Jlc2MgKmh3X3Jlc2MgPSBcXHUwMDI2YnAtXFx1MDAzZWh3X3Jlc2M7XFxuK1xcdHN0cnVjdCBibnh0X2h3X2NyeXB0b19yZXNjICpjcnlwdG9fcmVzYztcXG4rXFx0dTMyIHR4LCByeDtcXG4rXFxuK1xcdGlmICghY3J5cHRvIHx8ICFCTlhUX1NVUFBPUlRTX0tUTFMoYnApKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcbitcXHRjcnlwdG9fcmVzYyA9IFxcdTAwMjZod19yZXNjLVxcdTAwM2VjcnlwdG9fcmVzYztcXG4rXFx0dHggPSBtaW4oQk5YVF9UQ0soY3J5cHRvKS5tYXhfY3R4LCBjcnlwdG9fcmVzYy1cXHUwMDNlbWF4X3R4X2tleV9jdHhzKTtcXG4rXFx0cnggPSBtaW4oQk5YVF9SQ0soY3J5cHRvKS5tYXhfY3R4LCBjcnlwdG9fcmVzYy1cXHUwMDNlbWF4X3J4X2tleV9jdHhzKTtcXG4rXFx0cmVxLVxcdTAwM2VudW1fa3Rsc190eF9rZXlfY3R4cyA9IGNwdV90b19sZTMyKHR4KTtcXG4rXFx0cmVxLVxcdTAwM2VudW1fa3Rsc19yeF9rZXlfY3R4cyA9IGNwdV90b19sZTMyKHJ4KTtcXG4rXFx0aWYgKHR4KVxcbitcXHRcXHRyZXEtXFx1MDAzZWVuYWJsZXMgfD0gY3B1X3RvX2xlMzIoRlVOQ19DRkdfUkVRX0VOQUJMRVNfS1RMU19UWF9LRVlfQ1RYUyk7XFxuK1xcdGlmIChyeClcXG4rXFx0XFx0cmVxLVxcdTAwM2VlbmFibGVzIHw9IGNwdV90b19sZTMyKEZVTkNfQ0ZHX1JFUV9FTkFCTEVTX0tUTFNfUlhfS0VZX0NUWFMpO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IGJueHRfa2V5X2N0eF9zdG9yZShzdHJ1Y3QgYm54dF9rY3R4ICprY3R4LCBfX2xlMzIgKmtleV9idWYsIHUzMiBudW0sXFxuK1xcdFxcdFxcdCAgICAgIGJvb2wgY29udGlnLCB1OCBraW5kLCB1MzIgKmlkKVxcbit7XFxuK1xcdHN0cnVjdCBibnh0X2tpZF9pbmZvICpraWQ7XFxuK1xcdHUzMiBpO1xcbitcXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG51bTsgKSB7XFxuK1xcdFxcdGtpZCA9IGt6YWxsb2Nfb2JqKCpraWQpO1xcbitcXHRcXHQvKiBJZiB3ZSBjYW5ub3Qgc3RvcmUgdGhlIElEcywgdGhleSB3aWxsIGJlIGxvc3QgYW5kIG9ubHlcXG4rXFx0XFx0ICogcmVjbGFpbWVkIGJ5IHRoZSBGVyBkdXJpbmcgcmVzZXQvcmVpbml0LlxcbitcXHRcXHQgKi9cXG4rXFx0XFx0aWYgKCFraWQpXFxuK1xcdFxcdFxcdHJldHVybiAtRU5PTUVNO1xcbitcXHRcXHRraWQtXFx1MDAzZXN0YXJ0X2lkID0gbGUzMl90b19jcHUoa2V5X2J1ZltpXSk7XFxuK1xcdFxcdGtpZC1cXHUwMDNldHlwZSA9IGtjdHgtXFx1MDAzZXR5cGU7XFxuK1xcdFxcdGtpZC1cXHUwMDNla2luZCA9IGtpbmQ7XFxuK1xcdFxcdGlmIChjb250aWcpXFxuK1xcdFxcdFxcdGtpZC1cXHUwMDNlY291bnQgPSBudW07XFxuK1xcdFxcdGVsc2VcXG4rXFx0XFx0XFx0a2lkLVxcdTAwM2Vjb3VudCA9IDE7XFxuK1xcdFxcdGJpdG1hcF9zZXQoa2lkLVxcdTAwM2VpZHMsIDAsIGtpZC1cXHUwMDNlY291bnQpO1xcbitcXHRcXHRpZiAoaWQgXFx1MDAyNlxcdTAwMjYgIWkpIHtcXG4rXFx0XFx0XFx0Y2xlYXJfYml0KDAsIGtpZC1cXHUwMDNlaWRzKTtcXG4rXFx0XFx0XFx0KmlkID0gQk5YVF9TRVRfS0lEKGtjdHgsIGtpZC1cXHUwMDNlc3RhcnRfaWQpO1xcbitcXHRcXHR9XFxuK1xcdFxcdHNwaW5fbG9jayhcXHUwMDI2a2N0eC1cXHUwMDNlbG9jayk7XFxuK1xcdFxcdGxpc3RfYWRkX3RhaWxfcmN1KFxcdTAwMjZraWQtXFx1MDAzZWxpc3QsIFxcdTAwMjZrY3R4LVxcdTAwM2VsaXN0KTtcXG4rXFx0XFx0V1JJVEVfT05DRShrY3R4LVxcdTAwM2V0b3RhbF9hbGxvYyxcXG4rXFx0XFx0XFx0ICAgUkVBRF9PTkNFKGtjdHgtXFx1MDAzZXRvdGFsX2FsbG9jKSArIGtpZC1cXHUwMDNlY291bnQpO1xcbitcXHRcXHRzcGluX3VubG9jayhcXHUwMDI2a2N0eC1cXHUwMDNlbG9jayk7XFxuK1xcdFxcdGkgKz0ga2lkLVxcdTAwM2Vjb3VudDtcXG4rXFx0fVxcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rLyogTm90ZSB0aGF0IHRoZSBkcml2ZXIgZG9lcyBub3QgZnJlZSB0aGUga2V5IGNvbnRleHRzLiAgVGhleSBhcmUgZnJlZWRcXG4rICogYnkgdGhlIEZXIGR1cmluZyBGTFIgYW5kIEhXUk1fRlVOQ19SRVNFVC5cXG4rICovXFxuK3N0YXRpYyBpbnQgYm54dF9od3JtX2tleV9jdHhfYWxsb2Moc3RydWN0IGJueHQgKmJwLCBzdHJ1Y3QgYm54dF9rY3R4ICprY3R4LFxcbitcXHRcXHRcXHRcXHQgICB1OCBraW5kLCB1MzIgbnVtLCB1MzIgKmlkKVxcbit7XFxuK1xcdHN0cnVjdCBibnh0X2NyeXB0b19pbmZvICpjcnlwdG8gPSBicC1cXHUwMDNlY3J5cHRvX2luZm87XFxuK1xcdHN0cnVjdCBod3JtX2Z1bmNfa2V5X2N0eF9hbGxvY19vdXRwdXQgKnJlc3A7XFxuK1xcdHN0cnVjdCBod3JtX2Z1bmNfa2V5X2N0eF9hbGxvY19pbnB1dCAqcmVxO1xcbitcXHRkbWFfYWRkcl90IG1hcHBpbmc7XFxuK1xcdGludCBwZW5kaW5nX2NvdW50O1xcbitcXHRfX2xlMzIgKmtleV9idWY7XFxuK1xcdHUzMiBudW1fYWxsb2M7XFxuK1xcdGJvb2wgY29udGlnO1xcbitcXHRpbnQgcmM7XFxuK1xcbitcXHRudW0gPSBtaW4zKG51bSwgY3J5cHRvLVxcdTAwM2VtYXhfa2V5X2N0eHNfYWxsb2MsICh1MzIpQk5YVF9LSURfQkFUQ0hfU0laRSk7XFxuK1xcdHJjID0gaHdybV9yZXFfaW5pdChicCwgcmVxLCBIV1JNX0ZVTkNfS0VZX0NUWF9BTExPQyk7XFxuK1xcdGlmIChyYylcXG4rXFx0XFx0cmV0dXJuIHJjO1xcbitcXG4rXFx0a2V5X2J1ZiA9IGh3cm1fcmVxX2RtYV9zbGljZShicCwgcmVxLCBudW0gKiA0LCBcXHUwMDI2bWFwcGluZyk7XFxuK1xcdGlmICgha2V5X2J1Zikge1xcbitcXHRcXHRyYyA9IC1FTk9NRU07XFxuK1xcdFxcdGdvdG8ga2V5X2FsbG9jX2V4aXQ7XFxuK1xcdH1cXG4rXFx0cmVxLVxcdTAwM2VkbWFfYnVmcl9zaXplX2J5dGVzID0gY3B1X3RvX2xlMzIobnVtICogNCk7XFxuK1xcdHJlcS1cXHUwMDNlaG9zdF9kbWFfYWRkciA9IGNwdV90b19sZTY0KG1hcHBpbmcpO1xcbitcXHRyZXNwID0gaHdybV9yZXFfaG9sZChicCwgcmVxKTtcXG4rXFxuK1xcdHJlcS1cXHUwMDNla2V5X2N0eF90eXBlID0ga2N0eC1cXHUwMDNldHlwZTtcXG4rXFx0cmVxLVxcdTAwM2VudW1fa2V5X2N0eHMgPSBjcHVfdG9fbGUxNihudW0pO1xcbitcXG4rXFx0cGVuZGluZ19jb3VudCA9IGF0b21pY19pbmNfcmV0dXJuKFxcdTAwMjZrY3R4LVxcdTAwM2VhbGxvY19wZW5kaW5nKTtcXG4rXFx0cmMgPSBod3JtX3JlcV9zZW5kKGJwLCByZXEpO1xcbitcXHRhdG9taWNfZGVjKFxcdTAwMjZrY3R4LVxcdTAwM2VhbGxvY19wZW5kaW5nKTtcXG4rXFx0aWYgKHJjKVxcbitcXHRcXHRnb3RvIGtleV9hbGxvY19leGl0X3dha2U7XFxuK1xcbitcXHRudW1fYWxsb2MgPSBsZTE2X3RvX2NwdShyZXNwLVxcdTAwM2VudW1fa2V5X2N0eHNfYWxsb2NhdGVkKTtcXG4rXFx0aWYgKG51bV9hbGxvYyBcXHUwMDNlIG51bSkge1xcbitcXHRcXHRuZXRkZXZfd2FybihicC1cXHUwMDNlZGV2LFxcbitcXHRcXHRcXHQgICAgXFxcIkZXIGFsbG9jYXRlZCBtb3JlIHR5cGUgJWQga2V5cyAoJWQpIHRoYW4gcmVxdWVzdGVkICglZClcXFxcblxcXCIsXFxuK1xcdFxcdFxcdCAgICBrY3R4LVxcdTAwM2V0eXBlLCBudW1fYWxsb2MsIG51bSk7XFxuK1xcdH0gZWxzZSBpZiAoIW51bV9hbGxvYykge1xcbitcXHRcXHRuZXRkZXZfd2FybihicC1cXHUwMDNlZGV2LFxcbitcXHRcXHRcXHQgICAgXFxcIkZXIGFsbG9jYXRlZCAwIHR5cGUgJWQga2V5c1xcXFxuXFxcIiwga2N0eC1cXHUwMDNldHlwZSk7XFxuK1xcdFxcdHJjID0gLUVOT0VOVDtcXG4rXFx0XFx0Z290byBrZXlfYWxsb2NfZXhpdF93YWtlO1xcbitcXHR9IGVsc2Uge1xcbitcXHRcXHRudW0gPSBudW1fYWxsb2M7XFxuK1xcdH1cXG4rXFx0Y29udGlnID0gcmVzcC1cXHUwMDNlZmxhZ3MgXFx1MDAyNlxcbitcXHRcXHQgRlVOQ19LRVlfQ1RYX0FMTE9DX1JFU1BfRkxBR1NfS0VZX0NUWFNfQ09OVElHVU9VUztcXG4rXFx0cmMgPSBibnh0X2tleV9jdHhfc3RvcmUoa2N0eCwga2V5X2J1ZiwgbnVtLCBjb250aWcsIGtpbmQsIGlkKTtcXG4rXFxuK2tleV9hbGxvY19leGl0X3dha2U6XFxuK1xcdGlmIChwZW5kaW5nX2NvdW50IFxcdTAwM2U9IEJOWFRfS0NUWF9BTExPQ19QRU5ESU5HX01BWClcXG4rXFx0XFx0d2FrZV91cF9hbGwoXFx1MDAyNmtjdHgtXFx1MDAzZWFsbG9jX3BlbmRpbmdfd3EpO1xcbitrZXlfYWxsb2NfZXhpdDpcXG4rXFx0aHdybV9yZXFfZHJvcChicCwgcmVxKTtcXG4rXFx0cmV0dXJuIHJjO1xcbit9XFxuK1xcbitib29sIGJueHRfa2lkX3ZhbGlkKHN0cnVjdCBibnh0X2tjdHggKmtjdHgsIHUzMiBpZClcXG4re1xcbitcXHRzdHJ1Y3QgYm54dF9raWRfaW5mbyAqa2lkO1xcbitcXHRib29sIHZhbGlkID0gZmFsc2U7XFxuK1xcdHUzMiBlcG9jaDtcXG4rXFxuK1xcdGVwb2NoID0gQk5YVF9LSURfRVBPQ0goaWQpO1xcbitcXHRpZiAoZXBvY2ggIT0ga2N0eC1cXHUwMDNlZXBvY2gpXFxuK1xcdFxcdHJldHVybiBmYWxzZTtcXG4rXFxuK1xcdGlkID0gQk5YVF9LSURfSFcoaWQpO1xcbitcXHRyY3VfcmVhZF9sb2NrKCk7XFxuK1xcdGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGtpZCwgXFx1MDAyNmtjdHgtXFx1MDAzZWxpc3QsIGxpc3QpIHtcXG4rXFx0XFx0aWYgKGlkIFxcdTAwM2U9IGtpZC1cXHUwMDNlc3RhcnRfaWQgXFx1MDAyNlxcdTAwMjYgaWQgXFx1MDAzYyBraWQtXFx1MDAzZXN0YXJ0X2lkICsga2lkLVxcdTAwM2Vjb3VudCkge1xcbitcXHRcXHRcXHRpZiAoIXRlc3RfYml0KGlkIC0ga2lkLVxcdTAwM2VzdGFydF9pZCwga2lkLVxcdTAwM2VpZHMpKSB7XFxuK1xcdFxcdFxcdFxcdHZhbGlkID0gdHJ1ZTtcXG4rXFx0XFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdFxcdH1cXG4rXFx0XFx0fVxcbitcXHR9XFxuK1xcdHJjdV9yZWFkX3VubG9jaygpO1xcbitcXHRyZXR1cm4gdmFsaWQ7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgYm54dF9hbGxvY19vbmVfa2N0eChzdHJ1Y3QgYm54dF9rY3R4ICprY3R4LCB1OCBraW5kLCB1MzIgKmlkKVxcbit7XFxuK1xcdHN0cnVjdCBibnh0X2tpZF9pbmZvICpraWQ7XFxuK1xcdGludCByYyA9IC1FTk9NRU07XFxuK1xcbitcXHRyY3VfcmVhZF9sb2NrKCk7XFxuK1xcdGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGtpZCwgXFx1MDAyNmtjdHgtXFx1MDAzZWxpc3QsIGxpc3QpIHtcXG4rXFx0XFx0dTMyIGlkeCA9IDA7XFxuK1xcbitcXHRcXHRpZiAoa2lkLVxcdTAwM2VraW5kICE9IGtpbmQpXFxuK1xcdFxcdFxcdGNvbnRpbnVlO1xcbitcXHRcXHRkbyB7XFxuK1xcdFxcdFxcdGlkeCA9IGZpbmRfbmV4dF9iaXQoa2lkLVxcdTAwM2VpZHMsIGtpZC1cXHUwMDNlY291bnQsIGlkeCk7XFxuK1xcdFxcdFxcdGlmIChpZHggXFx1MDAzZT0ga2lkLVxcdTAwM2Vjb3VudClcXG4rXFx0XFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdFxcdGlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoaWR4LCBraWQtXFx1MDAzZWlkcykpIHtcXG4rXFx0XFx0XFx0XFx0KmlkID0gQk5YVF9TRVRfS0lEKGtjdHgsIGtpZC1cXHUwMDNlc3RhcnRfaWQgKyBpZHgpO1xcbitcXHRcXHRcXHRcXHRyYyA9IDA7XFxuK1xcdFxcdFxcdFxcdGdvdG8gYWxsb2NfZG9uZTtcXG4rXFx0XFx0XFx0fVxcbitcXHRcXHR9IHdoaWxlICgxKTtcXG4rXFx0fVxcbitcXG4rYWxsb2NfZG9uZTpcXG4rXFx0cmN1X3JlYWRfdW5sb2NrKCk7XFxuK1xcdHJldHVybiByYztcXG4rfVxcbitcXG4rLyoqXFxuKyAqIGJueHRfZnJlZV9vbmVfa2N0eCAtIEZyZWUgYSBrZXkgY29udGV4dCBmb3IgbGF0ZXIgcmUtdXNlXFxuKyAqIEBrY3R4OiBwb2ludGVyIHRvIGJueHRfa2N0eCBrZXkgY29udGV4dCBzdHJ1Y3R1cmVcXG4rICogQGlkOiBLZXkgY29udGV4dCBJRFxcbisgKlxcbisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBmcmVlIGEga2V5IGNvbnRleHQgSUQgd2hlbiB0aGUgb2ZmbG9hZFxcbisgKiB1c2luZyB0aGUgSUQgaGFzIHN1Y2Nlc3NmdWxseSB0ZXJtaW5hdGVkIG9yIGFib3J0ZWQuICBJZiB0aGUgb2ZmbG9hZFxcbisgKiBjYW5ub3QgYmUgdGVybWluYXRlZCwgdGhlIGNhbGxlciBzaG91bGQgbm90IGNhbGwgdGhpcyBmdW5jdGlvbiB0byBmcmVlXFxuKyAqIHRoZSBJRC4gIFRoZSBJRCB3aWxsIG9ubHkgYmUgcmVjeWNsZWQgYnkgdGhlIEZXIGR1cmluZyByZXNldC9yZWluaXQuXFxuKyAqXFxuKyAqIFRoZSBJRCBpcyBtYXRjaGVkIGJ5IGl0cyBoYXJkd2FyZSBpZCBvbmx5IChlcG9jaCBzdHJpcHBlZCksIHNvIHRoZSBjYWxsZXJcXG4rICogbXVzdCBlbnN1cmUgaXQgaXMgdmFsaWQgZm9yIHRoZSBjdXJyZW50IGVwb2NoLlxcbisgKi9cXG4rdm9pZCBibnh0X2ZyZWVfb25lX2tjdHgoc3RydWN0IGJueHRfa2N0eCAqa2N0eCwgdTMyIGlkKVxcbit7XFxuK1xcdHN0cnVjdCBibnh0X2tpZF9pbmZvICpraWQ7XFxuK1xcbitcXHRpZCA9IEJOWFRfS0lEX0hXKGlkKTtcXG4rXFx0cmN1X3JlYWRfbG9jaygpO1xcbitcXHRsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShraWQsIFxcdTAwMjZrY3R4LVxcdTAwM2VsaXN0LCBsaXN0KSB7XFxuK1xcdFxcdGlmIChpZCBcXHUwMDNlPSBraWQtXFx1MDAzZXN0YXJ0X2lkIFxcdTAwMjZcXHUwMDI2IGlkIFxcdTAwM2Mga2lkLVxcdTAwM2VzdGFydF9pZCArIGtpZC1cXHUwMDNlY291bnQpIHtcXG4rXFx0XFx0XFx0c2V0X2JpdChpZCAtIGtpZC1cXHUwMDNlc3RhcnRfaWQsIGtpZC1cXHUwMDNlaWRzKTtcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdH1cXG4rXFx0fVxcbitcXHRyY3VfcmVhZF91bmxvY2soKTtcXG4rfVxcbitcXG4rI2RlZmluZSBCTlhUX0tDVFhfQUxMT0NfUkVUUllfTUFYXFx0M1xcbitcXG4raW50IGJueHRfa2V5X2N0eF9hbGxvY19vbmUoc3RydWN0IGJueHQgKmJwLCBzdHJ1Y3QgYm54dF9rY3R4ICprY3R4LCB1OCBraW5kLFxcbitcXHRcXHRcXHQgICB1MzIgKmlkKVxcbit7XFxuK1xcdGludCByYywgcmV0cnkgPSAwO1xcbitcXG4rXFx0d2hpbGUgKHJldHJ5KysgXFx1MDAzYyBCTlhUX0tDVFhfQUxMT0NfUkVUUllfTUFYKSB7XFxuK1xcdFxcdHJjID0gYm54dF9hbGxvY19vbmVfa2N0eChrY3R4LCBraW5kLCBpZCk7XFxuK1xcdFxcdGlmICghcmMpXFxuK1xcdFxcdFxcdHJldHVybiAwO1xcbitcXG4rXFx0XFx0LyogV2hlbiBhcHByb2FjaGluZyB0aGUgbWF4LCBtdWx0aXBsZSB0aHJlYWRzIG1heSBwcm9jZWVkXFxuK1xcdFxcdCAqIGFuZCBleGNlZWQgdGhlIG1heC4gIFNvbWUgbWF5IGZhaWwgdGhlIHNlcmlhbGl6ZWQgSFdSTSBjYWxsXFxuK1xcdFxcdCAqIGxhdGVyIHdoZW4gdGhlIG1heCBpcyBleGNlZWRlZC5cXG4rXFx0XFx0ICovXFxuK1xcdFxcdGlmICgoUkVBRF9PTkNFKGtjdHgtXFx1MDAzZXRvdGFsX2FsbG9jKSArIEJOWFRfS0lEX0JBVENIX1NJWkUpIFxcdTAwM2VcXG4rXFx0XFx0ICAgIGtjdHgtXFx1MDAzZW1heF9jdHgpXFxuK1xcdFxcdFxcdHJldHVybiAtRU5PU1BDO1xcbitcXG4rXFx0XFx0aWYgKCFCTlhUX0tDVFhfQUxMT0NfT0soa2N0eCkpIHtcXG4rXFx0XFx0XFx0d2FpdF9ldmVudChrY3R4LVxcdTAwM2VhbGxvY19wZW5kaW5nX3dxLFxcbitcXHRcXHRcXHRcXHQgICBCTlhUX0tDVFhfQUxMT0NfT0soa2N0eCkpO1xcbitcXHRcXHRcXHRjb250aW51ZTtcXG4rXFx0XFx0fVxcbitcXHRcXHRyYyA9IGJueHRfaHdybV9rZXlfY3R4X2FsbG9jKGJwLCBrY3R4LCBraW5kLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgIEJOWFRfS0lEX0JBVENIX1NJWkUsIGlkKTtcXG4rXFx0XFx0aWYgKCFyYylcXG4rXFx0XFx0XFx0cmV0dXJuIDA7XFxuK1xcdH1cXG4rXFx0cmV0dXJuIC1FQUdBSU47XFxuK31cXG4rXFxuKyNkZWZpbmUgQk5YVF9YTUlUX0NSWVBUT19SRVRSWV9NQVhcXHQxMFxcbisjZGVmaW5lIEJOWFRfWE1JVF9DUllQVE9fTUlOX1RNT1xcdDEwMFxcbisjZGVmaW5lIEJOWFRfWE1JVF9DUllQVE9fTUFYX1RNT1xcdDE1MFxcbitcXG4raW50IGJueHRfeG1pdF9jcnlwdG9fY21kKHN0cnVjdCBibnh0ICpicCwgc3RydWN0IGJueHRfdHhfcmluZ19pbmZvICp0eHIsXFxuK1xcdFxcdFxcdCB2b2lkICpjbWQsIHVuc2lnbmVkIGludCBsZW4sIHVuc2lnbmVkIGludCB0bW8pXFxuK3tcXG4rXFx0c3RydWN0IGJueHRfY3J5cHRvX2luZm8gKmNyeXB0byA9IGJwLVxcdTAwM2VjcnlwdG9faW5mbztcXG4rXFx0c3RydWN0IGJueHRfY3J5cHRvX2NtZF9jdHggKmN0eCA9IE5VTEw7XFxuK1xcdHVuc2lnbmVkIGxvbmcgdG1vX2xlZnQsIGhhbmRsZSA9IDA7XFxuK1xcdGludCByYywgcmV0cnkgPSAwO1xcbitcXG4rXFx0aWYgKHRtbykge1xcbitcXHRcXHR1MzIga2lkID0gQ0VfQ01EX0tJRChjbWQpO1xcbitcXG4rXFx0XFx0Y3R4ID0ga21lbV9jYWNoZV9hbGxvYyhjcnlwdG8tXFx1MDAzZW1wY19jYWNoZSwgR0ZQX0tFUk5FTCk7XFxuK1xcdFxcdGlmICghY3R4KVxcbitcXHRcXHRcXHRyZXR1cm4gLUVOT01FTTtcXG4rXFx0XFx0aW5pdF9jb21wbGV0aW9uKFxcdTAwMjZjdHgtXFx1MDAzZWNtcCk7XFxuK1xcdFxcdGhhbmRsZSA9ICh1bnNpZ25lZCBsb25nKWN0eDtcXG4rXFx0XFx0Y3R4LVxcdTAwM2VraWQgPSBraWQ7XFxuK1xcdFxcdGN0eC1cXHUwMDNlY2xpZW50ID0gdHhyLVxcdTAwM2V0eF9yaW5nX3N0cnVjdC5tcGNfY2hubF90eXBlO1xcbitcXHRcXHRjdHgtXFx1MDAzZXN0YXR1cyA9IDA7XFxuK1xcdFxcdC8qIE9uZSByZWZlcmVuY2UgZm9yIHRoaXMgY2FsbGVyLCBvbmUgZm9yIHRoZSBoYW5kbGUgc3RvcmVkIGluXFxuK1xcdFxcdCAqIHRoZSBUWCBidWYgcmluZy4gIFRoZSBsYXR0ZXIgaXMgZHJvcHBlZCBieVxcbitcXHRcXHQgKiBibnh0X2NyeXB0b19tcGNfY21wKCkgd2hlbiB0aGUgY29tbWFuZCBpcyBjb21wbGV0ZWQgbm9ybWFsbHlcXG4rXFx0XFx0ICogb3IgYWZ0ZXIgdGltZW91dC5cXG4rXFx0XFx0ICovXFxuK1xcdFxcdHJlZmNvdW50X3NldChcXHUwMDI2Y3R4LVxcdTAwM2VyZWZjbnQsIDIpO1xcbitcXHRcXHRyZXRyeSA9IEJOWFRfWE1JVF9DUllQVE9fUkVUUllfTUFYO1xcbitcXHRcXHRtaWdodF9zbGVlcCgpO1xcbitcXHR9XFxuK1xcdGRvIHtcXG4rXFx0XFx0c3Bpbl9sb2NrX2JoKFxcdTAwMjZ0eHItXFx1MDAzZXR4X2xvY2spO1xcbitcXHRcXHRyYyA9IGJueHRfc3RhcnRfeG1pdF9tcGMoYnAsIHR4ciwgY21kLCBsZW4sIGhhbmRsZSk7XFxuK1xcdFxcdHNwaW5fdW5sb2NrX2JoKFxcdTAwMjZ0eHItXFx1MDAzZXR4X2xvY2spO1xcbitcXHRcXHRpZiAocmMgPT0gLUVCVVNZIFxcdTAwMjZcXHUwMDI2IHRtbyBcXHUwMDI2XFx1MDAyNiByZXRyeSlcXG4rXFx0XFx0XFx0dXNsZWVwX3JhbmdlKEJOWFRfWE1JVF9DUllQVE9fTUlOX1RNTyxcXG4rXFx0XFx0XFx0XFx0ICAgICBCTlhUX1hNSVRfQ1JZUFRPX01BWF9UTU8pO1xcbitcXHRcXHRlbHNlXFxuK1xcdFxcdFxcdGJyZWFrO1xcbitcXHR9IHdoaWxlIChyZXRyeS0tKTtcXG4rXFx0aWYgKHJjIHx8ICF0bW8pIHtcXG4rXFx0XFx0LyogVGhlIGNvbXBsZXRpb24gd2lsbCBuZXZlciBhcnJpdmUsIGRyb3Agb25lIHJlZmVyZW5jZSAqL1xcbitcXHRcXHRpZiAoY3R4KVxcbitcXHRcXHRcXHRyZWZjb3VudF9kZWMoXFx1MDAyNmN0eC1cXHUwMDNlcmVmY250KTtcXG4rXFx0XFx0Z290byB4bWl0X2RvbmU7XFxuK1xcdH1cXG4rXFxuK1xcdHRtb19sZWZ0ID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KFxcdTAwMjZjdHgtXFx1MDAzZWNtcCwgbXNlY3NfdG9famlmZmllcyh0bW8pKTtcXG4rXFx0aWYgKCF0bW9fbGVmdCkge1xcbitcXHRcXHRuZXRkZXZfd2FybihicC1cXHUwMDNlZGV2LCBcXFwiY3J5cHRvIE1QIGNtZCAlMDh4IHRpbWVkIG91dFxcXFxuXFxcIixcXG4rXFx0XFx0XFx0ICAgICooKHUzMiAqKWNtZCkpO1xcbitcXHRcXHRibnh0X21wY190aW1lb3V0KGJwLCB0eHIpO1xcbitcXHRcXHRyYyA9IC1FVElNRURPVVQ7XFxuK1xcdFxcdGdvdG8geG1pdF9kb25lO1xcbitcXHR9XFxuK1xcdGlmIChjdHgtXFx1MDAzZXN0YXR1cyA9PSBCTlhUX0NNRF9DVFhfQ09NUExFVEVEIFxcdTAwMjZcXHUwMDI2XFxuK1xcdCAgICBDRV9DTVBMX1NUQVRVUyhcXHUwMDI2Y3R4LVxcdTAwM2VjZV9jbXApID09IENFX0NNUExfU1RBVFVTX09LKVxcbitcXHRcXHRyYyA9IDA7XFxuK1xcdGVsc2VcXG4rXFx0XFx0cmMgPSAtRUlPO1xcbit4bWl0X2RvbmU6XFxuK1xcdGlmIChyYykge1xcbitcXHRcXHR1OCBzdGF0dXMgPSBjdHggPyBjdHgtXFx1MDAzZXN0YXR1cyA6IDA7XFxuK1xcbitcXHRcXHRuZXRkZXZfd2FybihicC1cXHUwMDNlZGV2LFxcbitcXHRcXHRcXHQgICAgXFxcIk1QQyB0cmFuc21pdCBmYWlsZWQsIHJpbmcgaWR4ICVkLCBvcCAweCV4LCBraWQgMHgleCwgc3RhdHVzIDB4JXhcXFxcblxcXCIsXFxuK1xcdFxcdFxcdCAgICB0eHItXFx1MDAzZWJuYXBpLVxcdTAwM2VpbmRleCwgQ0VfQ01EX09QKGNtZCksIENFX0NNRF9LSUQoY21kKSxcXG4rXFx0XFx0XFx0ICAgIHN0YXR1cyk7XFxuK1xcdH1cXG4rXFx0aWYgKGN0eCBcXHUwMDI2XFx1MDAyNiByZWZjb3VudF9kZWNfYW5kX3Rlc3QoXFx1MDAyNmN0eC1cXHUwMDNlcmVmY250KSlcXG4rXFx0XFx0a21lbV9jYWNoZV9mcmVlKGNyeXB0by1cXHUwMDNlbXBjX2NhY2hlLCBjdHgpO1xcbitcXHRyZXR1cm4gcmM7XFxuK31cXG4rXFxuK2ludCBibnh0X2NyeXB0b19pbml0KHN0cnVjdCBibnh0ICpicClcXG4re1xcbitcXHRzdHJ1Y3QgYm54dF9jcnlwdG9faW5mbyAqY3J5cHRvID0gYnAtXFx1MDAzZWNyeXB0b19pbmZvO1xcbitcXHRzdHJ1Y3QgYm54dF9od19yZXNjICpod19yZXNjID0gXFx1MDAyNmJwLVxcdTAwM2Vod19yZXNjO1xcbitcXHRzdHJ1Y3QgYm54dF9od19jcnlwdG9fcmVzYyAqY3J5cHRvX3Jlc2M7XFxuK1xcdGludCByYztcXG4rXFxuK1xcdGlmICghY3J5cHRvIHx8ICFCTlhUX1NVUFBPUlRTX0tUTFMoYnApKVxcbitcXHRcXHRyZXR1cm4gMDtcXG4rXFxuK1xcdGNyeXB0b19yZXNjID0gXFx1MDAyNmh3X3Jlc2MtXFx1MDAzZWNyeXB0b19yZXNjO1xcbitcXHRCTlhUX1RDSyhjcnlwdG8pLm1heF9jdHggPSBjcnlwdG9fcmVzYy1cXHUwMDNlcmVzdl90eF9rZXlfY3R4cztcXG4rXFx0Qk5YVF9SQ0soY3J5cHRvKS5tYXhfY3R4ID0gY3J5cHRvX3Jlc2MtXFx1MDAzZXJlc3Zfcnhfa2V5X2N0eHM7XFxuK1xcbitcXHRpZiAoIUJOWFRfVENLKGNyeXB0bykubWF4X2N0eCB8fCAhQk5YVF9SQ0soY3J5cHRvKS5tYXhfY3R4KVxcbitcXHRcXHRyZXR1cm4gLUVOT0RFVjtcXG4rXFxuK1xcdHJjID0gYm54dF9od3JtX2tleV9jdHhfYWxsb2MoYnAsIFxcdTAwMjZCTlhUX1RDSyhjcnlwdG8pLCBCTlhUX0NUWF9LSU5EX0NLX1RYLFxcbitcXHRcXHRcXHRcXHQgICAgIEJOWFRfS0lEX0JBVENIX1NJWkUsIE5VTEwpO1xcbitcXHRpZiAocmMpXFxuK1xcdFxcdHJldHVybiByYztcXG4rXFxuK1xcdHJjID0gYm54dF9od3JtX2tleV9jdHhfYWxsb2MoYnAsIFxcdTAwMjZCTlhUX1JDSyhjcnlwdG8pLCBCTlhUX0NUWF9LSU5EX0NLX1JYLFxcbitcXHRcXHRcXHRcXHQgICAgIEJOWFRfS0lEX0JBVENIX1NJWkUsIE5VTEwpO1xcbitcXHRpZiAocmMpXFxuK1xcdFxcdHJldHVybiByYztcXG4rXFxuK1xcdGJueHRfa3Rsc19pbml0KGJwKTtcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuK3ZvaWQgYm54dF9jcnlwdG9fbXBjX2NtcChzdHJ1Y3QgYm54dCAqYnAsIHUzMiBjbGllbnQsIHVuc2lnbmVkIGxvbmcgaGFuZGxlLFxcbitcXHRcXHRcXHQgc3RydWN0IGJueHRfY21wbF9lbnRyeSBjbXBsW10sIHUzMiBlbnRyaWVzKVxcbit7XFxuK1xcdHN0cnVjdCBibnh0X2NyeXB0b19jbWRfY3R4ICpjdHg7XFxuK1xcdHN0cnVjdCBjZV9jbXBsICpjbXAgPSBOVUxMO1xcbitcXHR1MzIgbGVuLCBraWQ7XFxuK1xcbitcXHRpZiAobGlrZWx5KGNtcGwpKVxcbitcXHRcXHRjbXAgPSBjbXBsWzBdLmNtcGw7XFxuK1xcdGlmICghaGFuZGxlIHx8IGVudHJpZXMgIT0gMSkge1xcbitcXHRcXHRpZiAoZW50cmllcyAhPSAxIFxcdTAwMjZcXHUwMDI2IGNtcGwpIHtcXG4rXFx0XFx0XFx0bmV0ZGV2X3dhcm4oYnAtXFx1MDAzZWRldiwgXFxcIkludmFsaWQgZW50cmllcyAlZCB3aXRoIGhhbmRsZSAlbHggY21wbCAlMDh4IGluICVzKClcXFxcblxcXCIsXFxuK1xcdFxcdFxcdFxcdCAgICBlbnRyaWVzLCBoYW5kbGUsICoodTMyICopY21wLCBfX2Z1bmNfXyk7XFxuK1xcdFxcdH1cXG4rXFx0XFx0aWYgKCFoYW5kbGUpXFxuK1xcdFxcdFxcdHJldHVybjtcXG4rXFx0fVxcbitcXHRjdHggPSAodm9pZCAqKWhhbmRsZTtcXG4rXFx0Y3R4LVxcdTAwM2VzdGF0dXMgPSBCTlhUX0NNRF9DVFhfQ09NUExFVEVEO1xcbitcXHRpZiAodW5saWtlbHkoIWNtcGwpKSB7XFxuK1xcdFxcdGN0eC1cXHUwMDNlc3RhdHVzIHw9IEJOWFRfQ01EX0NUWF9SRVNFVDtcXG4rXFx0XFx0Z290byBjbXBfZG9uZTtcXG4rXFx0fVxcbitcXHRraWQgPSBDRV9DTVBMX0tJRChjbXApO1xcbitcXHRpZiAoY3R4LVxcdTAwM2VraWQgIT0ga2lkIHx8IGN0eC1cXHUwMDNlY2xpZW50ICE9IGNsaWVudCB8fCBlbnRyaWVzICE9IDEpIHtcXG4rXFx0XFx0bmV0ZGV2X3dhcm4oYnAtXFx1MDAzZWRldixcXG4rXFx0XFx0XFx0ICAgIFxcXCJJbnZhbGlkIENFIGNtcGwgMHglMDh4IHdpdGggZW50cmllcyAlZCBmb3IgY2xpZW50ICVkIHdpdGggc3RhdHVzIDB4JXgsIGV4cGVjdGVkIGtpZCAweCV4IGFuZCBjbGllbnQgJWRcXFxcblxcXCIsXFxuK1xcdFxcdFxcdCAgICAqKHUzMiAqKWNtcCwgZW50cmllcywgY2xpZW50LCBjdHgtXFx1MDAzZXN0YXR1cywgY3R4LVxcdTAwM2VraWQsXFxuK1xcdFxcdFxcdCAgICBjdHgtXFx1MDAzZWNsaWVudCk7XFxuK1xcdFxcdGN0eC1cXHUwMDNlc3RhdHVzIHw9IEJOWFRfQ01EX0NUWF9FUlJPUjtcXG4rXFx0fVxcbitcXHRsZW4gPSBtaW5fdCh1MzIsIGNtcGxbMF0ubGVuLCBzaXplb2YoY3R4LVxcdTAwM2VjZV9jbXApKTtcXG4rXFx0bWVtY3B5KFxcdTAwMjZjdHgtXFx1MDAzZWNlX2NtcCwgY21wbFswXS5jbXBsLCBsZW4pO1xcbitjbXBfZG9uZTpcXG4rXFx0Y29tcGxldGUoXFx1MDAyNmN0eC1cXHUwMDNlY21wKTtcXG4rXFx0aWYgKHJlZmNvdW50X2RlY19hbmRfdGVzdChcXHUwMDI2Y3R4LVxcdTAwM2VyZWZjbnQpKVxcbitcXHRcXHRrbWVtX2NhY2hlX2ZyZWUoYnAtXFx1MDAzZWNyeXB0b19pbmZvLVxcdTAwM2VtcGNfY2FjaGUsIGN0eCk7XFxuK31cXG5kaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9ibnh0X2NyeXB0by5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9ibnh0X2NyeXB0by5oXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwMC4uZDQ3NTkwNTlhNmQyMzBcXG4tLS0gL2Rldi9udWxsXFxuKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9ibnh0X2NyeXB0by5oXFxuQEAgLTAsMCArMSwyMzAgQEBcXG4rLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seSAqL1xcbisvKiBDb3B5cmlnaHQgKGMpIDIwMjYgQnJvYWRjb20gSW5jLiAqL1xcbitcXG4rI2lmbmRlZiBCTlhUX0NSWVBUT19IXFxuKyNkZWZpbmUgQk5YVF9DUllQVE9fSFxcbitcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3JlZmNvdW50LmhcXHUwMDNlXFxuK1xcbisjZGVmaW5lIEJOWFRfTUFYX1RYX0NSWVBUT19LRVlTXFx0XFx0MjA0ODAwXFxuKyNkZWZpbmUgQk5YVF9NQVhfUlhfQ1JZUFRPX0tFWVNcXHRcXHQyMDQ4MDBcXG4rXFxuKyNkZWZpbmUgQk5YVF9NQVhfVFhfQ1JZUFRPX0tFWVNfUFJFXzIzM0ZXXFx0NjU1MzVcXG4rI2RlZmluZSBCTlhUX01BWF9SWF9DUllQVE9fS0VZU19QUkVfMjMzRldcXHQ2NTUzNVxcbitcXG4rZW51bSBibnh0X2NyeXB0b190eXBlIHtcXG4rXFx0Qk5YVF9UWF9DUllQVE9fS0VZX1RZUEUgPSBGVU5DX0tFWV9DVFhfQUxMT0NfUkVRX0tFWV9DVFhfVFlQRV9UWCxcXG4rXFx0Qk5YVF9SWF9DUllQVE9fS0VZX1RZUEUgPSBGVU5DX0tFWV9DVFhfQUxMT0NfUkVRX0tFWV9DVFhfVFlQRV9SWCxcXG4rXFx0Qk5YVF9NQVhfQ1JZUFRPX0tFWV9UWVBFLFxcbit9O1xcbitcXG4rLyogTWF4aW11bSBrZXlzIHN1cHBvcnRlZCBieSBuZXdlciBGVyBhbHdheXMgbXVsdGlwbGVzIG9mIDEyOCAqL1xcbisjZGVmaW5lIEJOWFRfS0lEX0JBVENIX1NJWkVcXHQxMjhcXG4rXFxuK3N0cnVjdCBibnh0X2tpZF9pbmZvIHtcXG4rXFx0c3RydWN0IGxpc3RfaGVhZFxcdGxpc3Q7XFxuK1xcdHU4XFx0XFx0XFx0dHlwZTtcXG4rXFx0dThcXHRcXHRcXHRraW5kO1xcbitcXHR1MzJcXHRcXHRcXHRzdGFydF9pZDtcXG4rXFx0dTMyXFx0XFx0XFx0Y291bnQ7XFxuK1xcdERFQ0xBUkVfQklUTUFQKGlkcywgQk5YVF9LSURfQkFUQ0hfU0laRSk7XFxuK307XFxuK1xcbitzdHJ1Y3QgYm54dF9rY3R4IHtcXG4rXFx0c3RydWN0IGxpc3RfaGVhZFxcdGxpc3Q7XFxuK1xcdC8qIHRvIHNlcmlhbGl6ZSB1cGRhdGUgdG8gdGhlIGxpbmtlZCBsaXN0IGFuZCB0b3RhbF9hbGxvYyAqL1xcbitcXHRzcGlubG9ja190XFx0XFx0bG9jaztcXG4rXFx0dThcXHRcXHRcXHR0eXBlO1xcbitcXHR1MTZcXHRcXHRcXHRlcG9jaDtcXG4rXFx0dTMyXFx0XFx0XFx0dG90YWxfYWxsb2M7XFxuK1xcdHUzMlxcdFxcdFxcdG1heF9jdHg7XFxuK1xcdGF0b21pY190XFx0XFx0YWxsb2NfcGVuZGluZztcXG4rI2RlZmluZSBCTlhUX0tDVFhfQUxMT0NfUEVORElOR19NQVhcXHQ4XFxuK1xcdHdhaXRfcXVldWVfaGVhZF90XFx0YWxsb2NfcGVuZGluZ193cTtcXG4rfTtcXG4rXFxuKyNkZWZpbmUgQk5YVF9LSURfSFdfTUFTS1xcdDB4MDAwZmZmZmZcXG4rI2RlZmluZSBCTlhUX0tJRF9IVyhraWQpXFx0KChraWQpIFxcdTAwMjYgQk5YVF9LSURfSFdfTUFTSylcXG4rI2RlZmluZSBCTlhUX0tJRF9FUE9DSF9NQVNLXFx0MHhmZmYwMDAwMFxcbisjZGVmaW5lIEJOWFRfS0lEX0VQT0NIX1NISUZUXFx0MjBcXG4rI2RlZmluZSBCTlhUX0tJRF9FUE9DSChraWQpXFx0KCgoa2lkKSBcXHUwMDI2IEJOWFRfS0lEX0VQT0NIX01BU0spIFxcdTAwM2VcXHUwMDNlXFx0XFxcXFxcbitcXHRcXHRcXHRcXHQgQk5YVF9LSURfRVBPQ0hfU0hJRlQpXFxuK1xcbisjZGVmaW5lIEJOWFRfTkVYVF9FUE9DSChlcG9jaClcXHRcXFxcXFxuK1xcdCgoKGVwb2NoKSArIDEpIFxcdTAwMjYgKEJOWFRfS0lEX0VQT0NIX01BU0sgXFx1MDAzZVxcdTAwM2UgQk5YVF9LSURfRVBPQ0hfU0hJRlQpKVxcbitcXG4rI2RlZmluZSBCTlhUX1NFVF9LSUQoa2N0eCwga2lkKVxcdFxcdFxcdFxcdFxcdFxcdFxcXFxcXG4rXFx0KChraWQpIHwgKCh1MzIpKGtjdHgpLVxcdTAwM2VlcG9jaCBcXHUwMDNjXFx1MDAzYyBCTlhUX0tJRF9FUE9DSF9TSElGVCkpXFxuK1xcbisjZGVmaW5lIEJOWFRfS0NUWF9BTExPQ19PSyhrY3R4KVxcdFxcXFxcXG4rXFx0KGF0b21pY19yZWFkKFxcdTAwMjYoKGtjdHgpLVxcdTAwM2VhbGxvY19wZW5kaW5nKSkgXFx1MDAzYyBCTlhUX0tDVFhfQUxMT0NfUEVORElOR19NQVgpXFxuK1xcbitzdHJ1Y3QgYm54dF9jcnlwdG9faW5mbyB7XFxuK1xcdHUxNlxcdFxcdFxcdG1heF9rZXlfY3R4c19hbGxvYztcXG4rXFxuK1xcdHN0cnVjdCBibnh0X2tjdHhcXHRrY3R4W0JOWFRfTUFYX0NSWVBUT19LRVlfVFlQRV07XFxuK1xcbitcXHRzdHJ1Y3Qga21lbV9jYWNoZVxcdCptcGNfY2FjaGU7XFxuK307XFxuK1xcbitzdHJ1Y3QgY2VfZGVsZXRlX2NtZCB7XFxuK1xcdF9fbGUzMiAgY3R4X2tpbmRfa2lkX29wY29kZTtcXG4rXFx0I2RlZmluZSBDRV9ERUxFVEVfQ01EX09QQ09ERV9NQVNLXFx0XFx0MHhmVUxcXG4rXFx0I2RlZmluZSBDRV9ERUxFVEVfQ01EX09QQ09ERV9TRlRcXHRcXHQwXFxuK1xcdCNkZWZpbmUgQ0VfREVMRVRFX0NNRF9PUENPREVfREVMXFx0XFx0IDB4MlVMXFxuK1xcdCNkZWZpbmUgQ0VfREVMRVRFX0NNRF9LSURfTUFTS1xcdFxcdFxcdDB4ZmZmZmYwVUxcXG4rXFx0I2RlZmluZSBDRV9ERUxFVEVfQ01EX0tJRF9TRlRcXHRcXHRcXHQ0XFxuK1xcdCNkZWZpbmUgQ0VfREVMRVRFX0NNRF9DVFhfS0lORF9NQVNLXFx0XFx0MHgxZjAwMDAwMFVMXFxuK1xcdCNkZWZpbmUgQ0VfREVMRVRFX0NNRF9DVFhfS0lORF9TRlRcXHRcXHQyNFxcbitcXHQjZGVmaW5lIENFX0RFTEVURV9DTURfQ1RYX0tJTkRfQ0tfVFhcXHRcXHQgKDB4MTFVTCBcXHUwMDNjXFx1MDAzYyAyNClcXG4rXFx0I2RlZmluZSBDRV9ERUxFVEVfQ01EX0NUWF9LSU5EX0NLX1JYXFx0XFx0ICgweDEyVUwgXFx1MDAzY1xcdTAwM2MgMjQpXFxuK307XFxuK1xcbisjZGVmaW5lIENFX0NNRF9PUF9NQVNLXFx0XFx0XFx0MHgwMDAwMGZVXFxuKyNkZWZpbmUgQ0VfQ01EX0tJRF9NQVNLXFx0XFx0XFx0MHhmZmZmZjBVXFxuKyNkZWZpbmUgQ0VfQ01EX0tJRF9TRlRcXHRcXHRcXHQ0XFxuK1xcbisjZGVmaW5lIENFX0NNRF9PUChjbWRfcClcXHRcXHRcXHRcXHRcXHRcXFxcXFxuK1xcdChsZTMyX3RvX2NwdSgqKF9fbGUzMiAqKShjbWRfcCkpIFxcdTAwMjYgQ0VfQ01EX09QX01BU0spXFxuK1xcbisjZGVmaW5lIENFX0NNRF9LSUQoY21kX3ApXFx0XFx0XFx0XFx0XFx0XFxcXFxcbitcXHQoKGxlMzJfdG9fY3B1KCooX19sZTMyICopKGNtZF9wKSkgXFx1MDAyNiBDRV9DTURfS0lEX01BU0spIFxcdTAwM2VcXHUwMDNlIENFX0NNRF9LSURfU0ZUKVxcbitcXG4rc3RydWN0IGNlX2NtcGwge1xcbitcXHRfX2xlMTZcXHRjbGllbnRfc3VidHlwZV90eXBlO1xcbitcXHQjZGVmaW5lIENFX0NNUExfVFlQRV9NQVNLXFx0XFx0XFx0MHgzZlVMXFxuK1xcdCNkZWZpbmUgQ0VfQ01QTF9UWVBFX1NGVFxcdFxcdFxcdDBcXG4rXFx0I2RlZmluZSBDRV9DTVBMX1RZUEVfTUlEX1BBVEhfU0hPUlRcXHRcXHQgMHgxZVVMXFxuK1xcdCNkZWZpbmUgQ0VfQ01QTF9TVUJUWVBFX01BU0tcXHRcXHRcXHQweGYwMFVMXFxuK1xcdCNkZWZpbmUgQ0VfQ01QTF9TVUJUWVBFX1NGVFxcdFxcdFxcdDhcXG4rXFx0I2RlZmluZSBDRV9DTVBMX1NVQlRZUEVfU09MSUNJVEVEXFx0XFx0ICgweDBVTCBcXHUwMDNjXFx1MDAzYyA4KVxcbitcXHQjZGVmaW5lIENFX0NNUExfU1VCVFlQRV9FUlJcXHRcXHRcXHQgKDB4MVVMIFxcdTAwM2NcXHUwMDNjIDgpXFxuK1xcdCNkZWZpbmUgQ0VfQ01QTF9TVUJUWVBFX1JFU1lOQ1xcdFxcdFxcdCAoMHgyVUwgXFx1MDAzY1xcdTAwM2MgOClcXG4rXFx0I2RlZmluZSBDRV9DTVBMX01QX0NMSUVOVF9NQVNLXFx0XFx0XFx0MHhmMDAwVUxcXG4rXFx0I2RlZmluZSBDRV9DTVBMX01QX0NMSUVOVF9TRlRcXHRcXHRcXHQxMlxcbitcXHQjZGVmaW5lIENFX0NNUExfTVBfQ0xJRU5UX1RDRVxcdFxcdFxcdCAoMHgwVUwgXFx1MDAzY1xcdTAwM2MgMTIpXFxuK1xcdCNkZWZpbmUgQ0VfQ01QTF9NUF9DTElFTlRfUkNFXFx0XFx0XFx0ICgweDFVTCBcXHUwMDNjXFx1MDAzYyAxMilcXG4rXFx0X19sZTE2XFx0c3RhdHVzO1xcbitcXHQjZGVmaW5lIENFX0NNUExfU1RBVFVTX01BU0tcXHRcXHRcXHQweGZVTFxcbitcXHQjZGVmaW5lIENFX0NNUExfU1RBVFVTX1NGVFxcdFxcdFxcdDBcXG4rXFx0I2RlZmluZSBDRV9DTVBMX1NUQVRVU19PS1xcdFxcdFxcdCAweDBVTFxcbitcXHQjZGVmaW5lIENFX0NNUExfU1RBVFVTX0NUWF9MRF9FUlJcXHRcXHQgMHgxVUxcXG4rXFx0I2RlZmluZSBDRV9DTVBMX1NUQVRVU19GSURfQ0hLX0VSUlxcdFxcdCAweDJVTFxcbitcXHQjZGVmaW5lIENFX0NNUExfU1RBVFVTX0NUWF9WRVJfRVJSXFx0XFx0IDB4M1VMXFxuK1xcdCNkZWZpbmUgQ0VfQ01QTF9TVEFUVVNfRFNUX0lEX0VSUlxcdFxcdCAweDRVTFxcbitcXHQjZGVmaW5lIENFX0NNUExfU1RBVFVTX01QX0NNRF9FUlJcXHRcXHQgMHg1VUxcXG4rXFx0dTMyXFx0b3BhcXVlO1xcbitcXHRfX2xlMzJcXHR2O1xcbitcXHQjZGVmaW5lIENFX0NNUExfViAgICAgICAgICAgMHgxVUxcXG4rXFx0X19sZTMyXFx0a2lkO1xcbitcXHQjZGVmaW5lIENFX0NNUExfS0lEX01BU0sgICAgMHhmZmZmZlVMXFxuK1xcdCNkZWZpbmUgQ0VfQ01QTF9LSURfU0ZUICAgICAwXFxuK307XFxuK1xcbisjZGVmaW5lIENFX0NNUExfU1RBVFVTKGNlX2NtcGwpXFx0XFx0XFx0XFx0XFx0XFx0XFxcXFxcbitcXHQobGUxNl90b19jcHUoKGNlX2NtcGwpLVxcdTAwM2VzdGF0dXMpIFxcdTAwMjYgQ0VfQ01QTF9TVEFUVVNfTUFTSylcXG4rXFxuKyNkZWZpbmUgQ0VfQ01QTF9LSUQoY2VfY21wbClcXHRcXHRcXHRcXHRcXHRcXHRcXFxcXFxuK1xcdChsZTMyX3RvX2NwdSgoY2VfY21wbCktXFx1MDAzZWtpZCkgXFx1MDAyNiBDRV9DTVBMX0tJRF9NQVNLKVxcbitcXG4rc3RydWN0IGJueHRfY3J5cHRvX2NtZF9jdHgge1xcbitcXHRzdHJ1Y3QgY29tcGxldGlvbiBjbXA7XFxuK1xcdHN0cnVjdCBjZV9jbXBsIGNlX2NtcDtcXG4rXFx0cmVmY291bnRfdCByZWZjbnQ7XFxuK1xcdHUzMiBraWQ7XFxuK1xcdHUxNiBjbGllbnQ7XFxuK1xcdHU4IHN0YXR1cztcXG4rI2RlZmluZSBCTlhUX0NNRF9DVFhfQ09NUExFVEVEXFx0MHgxXFxuKyNkZWZpbmUgQk5YVF9DTURfQ1RYX0VSUk9SXFx0MHgyXFxuKyNkZWZpbmUgQk5YVF9DTURfQ1RYX1JFU0VUXFx0MHg0XFxuK307XFxuK1xcbisjZGVmaW5lIEJOWFRfVENLKGNyeXB0bylcXHQoKGNyeXB0byktXFx1MDAzZWtjdHhbQk5YVF9UWF9DUllQVE9fS0VZX1RZUEVdKVxcbisjZGVmaW5lIEJOWFRfUkNLKGNyeXB0bylcXHQoKGNyeXB0byktXFx1MDAzZWtjdHhbQk5YVF9SWF9DUllQVE9fS0VZX1RZUEVdKVxcbitcXG4rI2RlZmluZSBCTlhUX0NUWF9LSU5EX0NLX1RYXFx0MHgxMVxcbisjZGVmaW5lIEJOWFRfQ1RYX0tJTkRfQ0tfUlhcXHQweDEyXFxuK1xcbisjaWZkZWYgQ09ORklHX0JOWFRfVExTXFxuK3ZvaWQgYm54dF9hbGxvY19jcnlwdG9faW5mbyhzdHJ1Y3QgYm54dCAqYnAsXFxuK1xcdFxcdFxcdCAgICBzdHJ1Y3QgaHdybV9mdW5jX3FjYXBzX291dHB1dCAqcmVzcCk7XFxuK2ludCBibnh0X2NyeXB0b19kZWwoc3RydWN0IGJueHQgKmJwLCB1OCB0eXBlLCB1OCBraW5kLCB1MzIga2lkKTtcXG4rdm9pZCBibnh0X2NyeXB0b19kZWxfYWxsKHN0cnVjdCBibnh0ICpicCk7XFxuK3ZvaWQgYm54dF9jbGVhcl9jcnlwdG8oc3RydWN0IGJueHQgKmJwKTtcXG4rdm9pZCBibnh0X2ZyZWVfY3J5cHRvX2luZm8oc3RydWN0IGJueHQgKmJwKTtcXG4rdm9pZCBibnh0X2h3cm1fcmVzZXJ2ZV9wZl9rZXlfY3R4cyhzdHJ1Y3QgYm54dCAqYnAsXFxuK1xcdFxcdFxcdFxcdCAgIHN0cnVjdCBod3JtX2Z1bmNfY2ZnX2lucHV0ICpyZXEpO1xcbitib29sIGJueHRfa2lkX3ZhbGlkKHN0cnVjdCBibnh0X2tjdHggKmtjdHgsIHUzMiBpZCk7XFxuK3ZvaWQgYm54dF9mcmVlX29uZV9rY3R4KHN0cnVjdCBibnh0X2tjdHggKmtjdHgsIHUzMiBpZCk7XFxuK2ludCBibnh0X2tleV9jdHhfYWxsb2Nfb25lKHN0cnVjdCBibnh0ICpicCwgc3RydWN0IGJueHRfa2N0eCAqa2N0eCwgdTgga2luZCxcXG4rXFx0XFx0XFx0ICAgdTMyICppZCk7XFxuK2ludCBibnh0X3htaXRfY3J5cHRvX2NtZChzdHJ1Y3QgYm54dCAqYnAsIHN0cnVjdCBibnh0X3R4X3JpbmdfaW5mbyAqdHhyLFxcbitcXHRcXHRcXHQgdm9pZCAqY21kLCB1bnNpZ25lZCBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgdG1vKTtcXG4raW50IGJueHRfY3J5cHRvX2luaXQoc3RydWN0IGJueHQgKmJwKTtcXG4rdm9pZCBibnh0X2NyeXB0b19tcGNfY21wKHN0cnVjdCBibnh0ICpicCwgdTMyIGNsaWVudCwgdW5zaWduZWQgbG9uZyBoYW5kbGUsXFxuK1xcdFxcdFxcdCBzdHJ1Y3QgYm54dF9jbXBsX2VudHJ5IGNtcGxbXSwgdTMyIGVudHJpZXMpO1xcbisjZWxzZVxcbitzdGF0aWMgaW5saW5lIHZvaWQgYm54dF9hbGxvY19jcnlwdG9faW5mbyhzdHJ1Y3QgYm54dCAqYnAsXFxuK1xcdFxcdFxcdFxcdFxcdCAgc3RydWN0IGh3cm1fZnVuY19xY2Fwc19vdXRwdXQgKnJlc3ApXFxuK3tcXG4rfVxcbitcXG4rc3RhdGljIGlubGluZSBpbnQgYm54dF9jcnlwdG9fZGVsKHN0cnVjdCBibnh0ICpicCwgdTggdHlwZSwgdTgga2luZCwgdTMyIGtpZClcXG4re1xcbitcXHRyZXR1cm4gLUVPUE5PVFNVUFA7XFxuK31cXG4rXFxuK3N0YXRpYyBpbmxpbmUgdm9pZCBibnh0X2NyeXB0b19kZWxfYWxsKHN0cnVjdCBibnh0ICpicClcXG4re1xcbit9XFxuK1xcbitzdGF0aWMgaW5saW5lIHZvaWQgYm54dF9jbGVhcl9jcnlwdG8oc3RydWN0IGJueHQgKmJwKVxcbit7XFxuK31cXG4rXFxuK3N0YXRpYyBpbmxpbmUgdm9pZCBibnh0X2ZyZWVfY3J5cHRvX2luZm8oc3RydWN0IGJueHQgKmJwKVxcbit7XFxuK31cXG4rXFxuK3N0YXRpYyBpbmxpbmUgdm9pZCBibnh0X2h3cm1fcmVzZXJ2ZV9wZl9rZXlfY3R4cyhzdHJ1Y3QgYm54dCAqYnAsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdCBzdHJ1Y3QgaHdybV9mdW5jX2NmZ19pbnB1dCAqcmVxKVxcbit7XFxuK31cXG4rXFxuK3N0YXRpYyBpbmxpbmUgYm9vbCBibnh0X2tpZF92YWxpZChzdHJ1Y3QgYm54dF9rY3R4ICprY3R4LCB1MzIgaWQpXFxuK3tcXG4rXFx0cmV0dXJuIGZhbHNlO1xcbit9XFxuK1xcbitzdGF0aWMgaW5saW5lIHZvaWQgYm54dF9mcmVlX29uZV9rY3R4KHN0cnVjdCBibnh0X2tjdHggKmtjdHgsIHUzMiBpZClcXG4re1xcbit9XFxuK1xcbitzdGF0aWMgaW5saW5lIGludCBibnh0X2tleV9jdHhfYWxsb2Nfb25lKHN0cnVjdCBibnh0ICpicCxcXG4rXFx0XFx0XFx0XFx0XFx0IHN0cnVjdCBibnh0X2tjdHggKmtjdHgsIHU4IGtpbmQsXFxuK1xcdFxcdFxcdFxcdFxcdCB1MzIgKmlkKVxcbit7XFxuK1xcdHJldHVybiAtRU9QTk9UU1VQUDtcXG4rfVxcbitcXG4rc3RhdGljIGlubGluZSBpbnQgYm54dF94bWl0X2NyeXB0b19jbWQoc3RydWN0IGJueHQgKmJwLFxcbitcXHRcXHRcXHRcXHQgICAgICAgc3RydWN0IGJueHRfdHhfcmluZ19pbmZvICp0eHIsXFxuK1xcdFxcdFxcdFxcdCAgICAgICB2b2lkICpjbWQsIHVuc2lnbmVkIGludCBsZW4sXFxuK1xcdFxcdFxcdFxcdCAgICAgICB1bnNpZ25lZCBpbnQgdG1vKVxcbit7XFxuK1xcdHJldHVybiAtRU9QTk9UU1VQUDtcXG4rfVxcbitcXG4rc3RhdGljIGlubGluZSBpbnQgYm54dF9jcnlwdG9faW5pdChzdHJ1Y3QgYm54dCAqYnApXFxuK3tcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuK3N0YXRpYyBpbmxpbmUgdm9pZCBibnh0X2NyeXB0b19tcGNfY21wKHN0cnVjdCBibnh0ICpicCwgdTMyIGNsaWVudCxcXG4rXFx0XFx0XFx0XFx0ICAgICAgIHVuc2lnbmVkIGxvbmcgaGFuZGxlLFxcbitcXHRcXHRcXHRcXHQgICAgICAgc3RydWN0IGJueHRfY21wbF9lbnRyeSBjbXBsW10sXFxuK1xcdFxcdFxcdFxcdCAgICAgICB1MzIgZW50cmllcylcXG4re1xcbit9XFxuKyNlbmRpZlxcdC8qIENPTkZJR19CTlhUX1RMUyAqL1xcbisjZW5kaWZcXHQvKiBCTlhUX0NSWVBUT19IICovXFxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dF9ldGh0b29sLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibnh0L2JueHRfZXRodG9vbC5jXFxuaW5kZXggNjJiYzljYWU2MTNjMzguLmNlZTc0Mzk5NmQzZjIzIDEwMDY0NFxcbi0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dF9ldGh0b29sLmNcXG4rKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibnh0L2JueHRfZXRodG9vbC5jXFxuQEAgLTM3LDYgKzM3LDggQEBcXG4gI2luY2x1ZGUgXFxcImJueHRfbnZtX2RlZnMuaFxcXCJcXHQvKiBOVlJBTSBjb250ZW50IGNvbnN0YW50IGFuZCBzdHJ1Y3R1cmUgZGVmcyAqL1xcbiAjaW5jbHVkZSBcXFwiYm54dF9md19oZHIuaFxcXCJcXHQvKiBGaXJtd2FyZSBoZHIgY29uc3RhbnQgYW5kIHN0cnVjdHVyZSBkZWZzICovXFxuICNpbmNsdWRlIFxcXCJibnh0X2NvcmVkdW1wLmhcXFwiXFxuKyNpbmNsdWRlIFxcXCJibnh0X21wYy5oXFxcIlxcbisjaW5jbHVkZSBcXFwiYm54dF9rdGxzLmhcXFwiXFxuIFxcbiAjZGVmaW5lIEJOWFRfTlZNX0VSUl9NU0coZGV2LCBleHRhY2ssIG1zZylcXHRcXHRcXHRcXFxcXFxuIFxcdGRvIHtcXHRcXHRcXHRcXHRcXHRcXHRcXHRcXFxcXFxuQEAgLTM1Myw2ICszNTUsMzAgQEAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGJueHRfcmluZ19kcnZfc3RhdHNfYXJyW10gPSB7XFxuIFxcdFxcXCJ0b3RhbF9taXNzZWRfaXJxc1xcXCIsXFxuIH07XFxuIFxcbisvKiBrVExTIGRhdGEgcGxhbmUgY291bnRlciBzdHJpbmdzIGluZGV4ZWQgYnkgZW51bSBibnh0X2t0bHNfZGF0YV9jb3VudGVycyAqL1xcbitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgYm54dF9rdGxzX2RhdGFfc3RhdHNbXSA9IHtcXG4rXFx0W0JOWFRfS1RMU19UWF9QS1RTXVxcdFxcdD0gXFxcInR4X3Rsc19lbmNyeXB0ZWRfcGFja2V0c1xcXCIsXFxuK1xcdFtCTlhUX0tUTFNfVFhfQllURVNdXFx0XFx0PSBcXFwidHhfdGxzX2VuY3J5cHRlZF9ieXRlc1xcXCIsXFxuK1xcdFtCTlhUX0tUTFNfVFhfT09PX1BLVFNdXFx0XFx0XFx0PSBcXFwidHhfdGxzX29vb19wYWNrZXRzXFxcIixcXG4rXFx0W0JOWFRfS1RMU19UWF9PT09fRkFMTEJBQ0tfTk9fU1lOQ11cXHQ9IFxcXCJ0eF90bHNfb29vX2ZhbGxiYWNrX25vX3N5bmNcXFwiLFxcbitcXHRbQk5YVF9LVExTX1RYX09PT19GQUxMQkFDS19OT19TUEFDRV1cXHQ9IFxcXCJ0eF90bHNfb29vX2ZhbGxiYWNrX25vX3NwYWNlXFxcIixcXG4rXFx0W0JOWFRfS1RMU19UWF9PT09fRkFMTEJBQ0tfTk9fSERSXVxcdD0gXFxcInR4X3Rsc19vb29fZmFsbGJhY2tfbm9faGRyXFxcIixcXG4rfTtcXG4rXFxuKy8qIGtUTFMgY29udHJvbCBwbGFuZSBjb3VudGVyIHN0cmluZ3MgaW5kZXhlZCBieSBlbnVtIGJueHRfa3Rsc19jdHJsX2NvdW50ZXJzICovXFxuK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBibnh0X2t0bHNfY3RybF9zdGF0c1tdID0ge1xcbitcXHRbQk5YVF9LVExTX1RYX0FERF1cXHRcXHRcXHQ9IFxcXCJ0eF90bHNfYWRkXFxcIixcXG4rXFx0W0JOWFRfS1RMU19UWF9ERUxdXFx0XFx0XFx0PSBcXFwidHhfdGxzX2RlbFxcXCIsXFxuK1xcdFtCTlhUX0tUTFNfRVJSX05PX01FTV1cXHRcXHRcXHQ9IFxcXCJ0bHNfZXJyX25vX21lbVxcXCIsXFxuK1xcdFtCTlhUX0tUTFNfRVJSX05PX0NBUF1cXHRcXHRcXHQ9IFxcXCJ0bHNfZXJyX25vX2NhcFxcXCIsXFxuK1xcdFtCTlhUX0tUTFNfRVJSX0tFWV9DVFhfQUxMT0NdXFx0XFx0PSBcXFwidGxzX2Vycl9rZXlfY3R4X2FsbG9jXFxcIixcXG4rXFx0W0JOWFRfS1RMU19FUlJfQ1JZUFRPX0NNRF1cXHRcXHQ9IFxcXCJ0bHNfZXJyX2NyeXB0b19jbWRcXFwiLFxcbitcXHRbQk5YVF9LVExTX0VSUl9ERVZJQ0VfQlVTWV1cXHRcXHQ9IFxcXCJ0bHNfZXJyX2RldmljZV9idXN5XFxcIixcXG4rXFx0W0JOWFRfS1RMU19FUlJfSU5WQUxJRF9DSVBIRVJdXFx0XFx0PSBcXFwidGxzX2Vycl9pbnZhbGlkX2NpcGhlclxcXCIsXFxuK1xcdFtCTlhUX0tUTFNfRVJSX1NUQVRFX05PVF9PUEVOXVxcdFxcdD0gXFxcInRsc19lcnJfc3RhdGVfbm90X29wZW5cXFwiLFxcbitcXHRbQk5YVF9LVExTX0VSUl9SRVRSWV9FWENFRURFRF1cXHRcXHQ9IFxcXCJ0bHNfZXJyX3JldHJ5X2V4Y2VlZGVkXFxcIixcXG4rfTtcXG4rXFxuICNkZWZpbmUgTlVNX1JJTkdfUlhfU1dfU1RBVFNcXHRcXHRBUlJBWV9TSVpFKGJueHRfcnhfc3dfc3RhdHNfc3RyKVxcbiAjZGVmaW5lIE5VTV9SSU5HX0NNTl9TV19TVEFUU1xcdFxcdEFSUkFZX1NJWkUoYm54dF9jbW5fc3dfc3RhdHNfc3RyKVxcbiAjZGVmaW5lIE5VTV9SSU5HX1JYX0hXX1NUQVRTXFx0XFx0QVJSQVlfU0laRShibnh0X3Jpbmdfcnhfc3RhdHNfc3RyKVxcbkBAIC01MzUsMTIgKzU2MSwyMSBAQCBzdGF0aWMgaW50IGJueHRfZ2V0X251bV9yaW5nX3N0YXRzKHN0cnVjdCBibnh0ICpicClcXG4gXFx0ICAgICAgIGNtbiAqIGJwLVxcdTAwM2VjcF9ucl9yaW5ncztcXG4gfVxcbiBcXG4rc3RhdGljIGludCBibnh0X2dldF9udW1fa3Rsc19zdGF0cyhzdHJ1Y3QgYm54dCAqYnApXFxuK3tcXG4rXFx0aWYgKCFicC1cXHUwMDNla3Rsc19pbmZvKVxcbitcXHRcXHRyZXR1cm4gMDtcXG4rXFx0cmV0dXJuIEFSUkFZX1NJWkUoYm54dF9rdGxzX2N0cmxfc3RhdHMpICtcXG4rXFx0ICAgICAgIEFSUkFZX1NJWkUoYm54dF9rdGxzX2RhdGFfc3RhdHMpO1xcbit9XFxuK1xcbiBzdGF0aWMgaW50IGJueHRfZ2V0X251bV9zdGF0cyhzdHJ1Y3QgYm54dCAqYnApXFxuIHtcXG4gXFx0aW50IG51bV9zdGF0cyA9IGJueHRfZ2V0X251bV9yaW5nX3N0YXRzKGJwKTtcXG4gXFx0aW50IGxlbjtcXG4gXFxuIFxcdG51bV9zdGF0cyArPSBCTlhUX05VTV9SSU5HX0RSVl9TVEFUUztcXG4rXFx0bnVtX3N0YXRzICs9IGJueHRfZ2V0X251bV9rdGxzX3N0YXRzKGJwKTtcXG4gXFxuIFxcdGlmIChicC1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBCTlhUX0ZMQUdfUE9SVF9TVEFUUylcXG4gXFx0XFx0bnVtX3N0YXRzICs9IEJOWFRfTlVNX1BPUlRfU1RBVFM7XFxuQEAgLTY1Myw2ICs2ODgsMTYgQEAgc3RhdGljIHZvaWQgYm54dF9nZXRfZXRodG9vbF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LFxcbiBcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgQk5YVF9OVU1fUklOR19EUlZfU1RBVFM7IGkrKywgaisrLCBjdXJyKyssIHByZXYrKylcXG4gXFx0XFx0YnVmW2pdID0gKmN1cnIgKyAqcHJldjtcXG4gXFxuK1xcdGlmIChicC1cXHUwMDNla3Rsc19pbmZvKSB7XFxuK1xcdFxcdHN0cnVjdCBibnh0X3Rsc19pbmZvICprdGxzID0gYnAtXFx1MDAzZWt0bHNfaW5mbztcXG4rXFx0XFx0c3RydWN0IGJueHRfdGxzX3N3X3N0YXRzIHRsc19zdGF0cyA9IHt9O1xcbitcXG4rXFx0XFx0Ym54dF9nZXRfcmluZ190bHNfc3RhdHMoYnAsIFxcdTAwMjZ0bHNfc3RhdHMpO1xcbitcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgQVJSQVlfU0laRShibnh0X2t0bHNfZGF0YV9zdGF0cyk7IGkrKywgaisrKVxcbitcXHRcXHRcXHRidWZbal0gPSB0bHNfc3RhdHMuY291bnRlcnNbaV07XFxuK1xcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBBUlJBWV9TSVpFKGJueHRfa3Rsc19jdHJsX3N0YXRzKTsgaSsrLCBqKyspXFxuK1xcdFxcdFxcdGJ1ZltqXSA9IGF0b21pYzY0X3JlYWQoXFx1MDAyNmt0bHMtXFx1MDAzZWNvdW50ZXJzW2ldKTtcXG4rXFx0fVxcbiBcXHRpZiAoYnAtXFx1MDAzZWZsYWdzIFxcdTAwMjYgQk5YVF9GTEFHX1BPUlRfU1RBVFMpIHtcXG4gXFx0XFx0dTY0ICpwb3J0X3N0YXRzID0gYnAtXFx1MDAzZXBvcnRfc3RhdHMuc3dfc3RhdHM7XFxuIFxcbkBAIC03NjMsNiArODA4LDEyIEBAIHN0YXRpYyB2b2lkIGJueHRfZ2V0X3N0cmluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIHN0cmluZ3NldCwgdTggKmJ1ZilcXG4gXFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIEJOWFRfTlVNX1JJTkdfRFJWX1NUQVRTOyBpKyspXFxuIFxcdFxcdFxcdGV0aHRvb2xfcHV0cyhcXHUwMDI2YnVmLCBibnh0X3JpbmdfZHJ2X3N0YXRzX2FycltpXSk7XFxuIFxcbitcXHRcXHRpZiAoYnAtXFx1MDAzZWt0bHNfaW5mbykge1xcbitcXHRcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgQVJSQVlfU0laRShibnh0X2t0bHNfZGF0YV9zdGF0cyk7IGkrKylcXG4rXFx0XFx0XFx0XFx0ZXRodG9vbF9wdXRzKFxcdTAwMjZidWYsIGJueHRfa3Rsc19kYXRhX3N0YXRzW2ldKTtcXG4rXFx0XFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIEFSUkFZX1NJWkUoYm54dF9rdGxzX2N0cmxfc3RhdHMpOyBpKyspXFxuK1xcdFxcdFxcdFxcdGV0aHRvb2xfcHV0cyhcXHUwMDI2YnVmLCBibnh0X2t0bHNfY3RybF9zdGF0c1tpXSk7XFxuK1xcdFxcdH1cXG4gXFx0XFx0aWYgKGJwLVxcdTAwM2VmbGFncyBcXHUwMDI2IEJOWFRfRkxBR19QT1JUX1NUQVRTKVxcbiBcXHRcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgQk5YVF9OVU1fUE9SVF9TVEFUUzsgaSsrKSB7XFxuIFxcdFxcdFxcdFxcdHN0ciA9IGJueHRfcG9ydF9zdGF0c19hcnJbaV0uc3RyaW5nO1xcbkBAIC05NTksNiArMTAxMCw3IEBAIHN0YXRpYyBpbnQgYm54dF9zZXRfY2hhbm5lbHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldixcXG4gXFx0c3RydWN0IGJueHQgKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTtcXG4gXFx0aW50IHJlcV90eF9yaW5ncywgcmVxX3J4X3JpbmdzLCB0Y3M7XFxuIFxcdHUzMiBuZXdfdGJsX3NpemUgPSAwLCBvbGRfdGJsX3NpemU7XFxuK1xcdGludCBtcGNfcGVyX3R5cGUsIG1wY19jcDtcXG4gXFx0Ym9vbCBzaCA9IGZhbHNlO1xcbiBcXHRpbnQgdHhfeGRwID0gMDtcXG4gXFx0aW50IHJjID0gMDtcXG5AQCAtOTkzLDcgKzEwNDUsMTIgQEAgc3RhdGljIGludCBibnh0X3NldF9jaGFubmVscyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LFxcbiBcXHRcXHR0eF94ZHAgPSByZXFfcnhfcmluZ3M7XFxuIFxcdH1cXG4gXFxuLVxcdHJjID0gYm54dF9jaGVja19yaW5ncyhicCwgcmVxX3R4X3JpbmdzLCByZXFfcnhfcmluZ3MsIHNoLCB0Y3MsIHR4X3hkcCk7XFxuK1xcdGJueHRfY2FsY19kZmx0X21wY19yaW5ncyhicCxcXG4rXFx0XFx0XFx0XFx0IHJlcV90eF9yaW5ncyAqICh0Y3MgXFx1MDAzZSAxID8gdGNzIDogMSkgKyB0eF94ZHAsXFxuK1xcdFxcdFxcdFxcdCByZXFfdHhfcmluZ3MsIHJlcV9yeF9yaW5ncywgXFx1MDAyNm1wY19wZXJfdHlwZSxcXG4rXFx0XFx0XFx0XFx0IFxcdTAwMjZtcGNfY3ApO1xcbitcXHRyYyA9IGJueHRfY2hlY2tfcmluZ3MoYnAsIHJlcV90eF9yaW5ncywgcmVxX3J4X3JpbmdzLCBzaCwgdGNzLCB0eF94ZHAsXFxuK1xcdFxcdFxcdCAgICAgIG1wY19wZXJfdHlwZSAqIEJOWFRfTVBDX1RZUEVfTUFYLCBtcGNfY3ApO1xcbiBcXHRpZiAocmMpIHtcXG4gXFx0XFx0bmV0ZGV2X3dhcm4oZGV2LCBcXFwiVW5hYmxlIHRvIGFsbG9jYXRlIHRoZSByZXF1ZXN0ZWQgcmluZ3NcXFxcblxcXCIpO1xcbiBcXHRcXHRyZXR1cm4gcmM7XFxuQEAgLTEwNTEsNiArMTEwOCw4IEBAIHN0YXRpYyBpbnQgYm54dF9zZXRfY2hhbm5lbHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldixcXG4gXFxuIFxcdGJueHRfc2V0X2NwX3JpbmdzKGJwLCBzaCk7XFxuIFxcbitcXHRibnh0X3NldF9kZmx0X21wY19yaW5ncyhicCk7XFxuK1xcbiBcXHQvKiBBZnRlciBjaGFuZ2luZyBudW1iZXIgb2YgcnggY2hhbm5lbHMsIHVwZGF0ZSBOVFVQTEUgZmVhdHVyZS4gKi9cXG4gXFx0bmV0ZGV2X3VwZGF0ZV9mZWF0dXJlcyhkZXYpO1xcbiBcXHRpZiAobmV0aWZfcnVubmluZyhkZXYpKSB7XFxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dF9nc28uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dF9nc28uY1xcbmluZGV4IGYzMTdmNjA0MTRlODEzLi5iNGMzN2E2YzlmMGZhOSAxMDA2NDRcXG4tLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibnh0L2JueHRfZ3NvLmNcXG4rKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibnh0L2JueHRfZ3NvLmNcXG5AQCAtMTY4LDcgKzE2OCw3IEBAIG5ldGRldl90eF90IGJueHRfc3dfdWRwX2dzb194bWl0KHN0cnVjdCBibnh0ICpicCxcXG4gXFxuIFxcdFxcdHByb2QgPSBORVhUX1RYKHByb2QpO1xcbiBcXHRcXHRibnh0X2luaXRfZXh0X2JkKGJwLCB0eHIsIHByb2QsIGNzdW0sXFxuLVxcdFxcdFxcdFxcdCB2bGFuX3RhZ19mbGFncywgY2ZhX2FjdGlvbik7XFxuK1xcdFxcdFxcdFxcdCB2bGFuX3RhZ19mbGFncywgY2ZhX2FjdGlvbiwgMCk7XFxuIFxcbiBcXHRcXHQvKiBzZXQgZG1hX3VubWFwX2xlbiBvbiB0aGUgTEFTVCBCRCB0b3VjaGluZyBlYWNoXFxuIFxcdFxcdCAqIHJlZ2lvbi4gU2luY2UgY29tcGxldGlvbnMgYXJlIGluLW9yZGVyLCB0aGUgbGFzdCBzZWdtZW50XFxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dF9rdGxzLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibnh0L2JueHRfa3Rscy5jXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwMC4uMGNiNDM4YzVjNTA5MThcXG4tLS0gL2Rldi9udWxsXFxuKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9ibnh0X2t0bHMuY1xcbkBAIC0wLDAgKzEsNTc4IEBAXFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcXG4rLyogQ29weXJpZ2h0IChjKSAyMDI2IEJyb2FkY29tIEluYy4gKi9cXG4rXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC90Y3AuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY25ldC90bHMuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2JueHQvaHNpLmhcXHUwMDNlXFxuK1xcbisjaW5jbHVkZSBcXFwiYm54dC5oXFxcIlxcbisjaW5jbHVkZSBcXFwiYm54dF9tcGMuaFxcXCJcXG4rI2luY2x1ZGUgXFxcImJueHRfY3J5cHRvLmhcXFwiXFxuKyNpbmNsdWRlIFxcXCJibnh0X2t0bHMuaFxcXCJcXG4rXFxuKy8qKlxcbisgKiBibnh0X2FsbG9jX2t0bHNfaW5mbyAtIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGtUTFMgb2ZmbG9hZCBjb250ZXh0XFxuKyAqIEBicDogcG9pbnRlciB0byBibnh0IGRldmljZVxcbisgKlxcbisgKiBBbGxvY2F0ZXMgdGhlIG1haW4ga1RMUyBjcnlwdG8gaW5mbyBzdHJ1Y3R1cmVcXG4rICpcXG4rICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZHVyaW5nIGRldmljZSBpbml0aWFsaXphdGlvbiB3aGVuIGZpcm13YXJlXFxuKyAqIHJlcG9ydHMga1RMUyBvZmZsb2FkIGNhcGFiaWxpdHkuIElmIGFsbG9jYXRpb24gZmFpbHMsIGtUTFMgb2ZmbG9hZFxcbisgKiB3aWxsIG5vdCBiZSBhdmFpbGFibGUgYnV0IHRoZSBkZXZpY2Ugd2lsbCBzdGlsbCBmdW5jdGlvbi5cXG4rICpcXG4rICogQ29udGV4dDogUHJvY2VzcyBjb250ZXh0XFxuKyAqXFxuKyAqIFJldHVybjogemVybyBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJvciBjb2RlIG90aGVyd2lzZTpcXG4rICpcXHRFTk9NRU06IG91dCBvZiBtZW1vcnlcXG4rICovXFxuK2ludCBibnh0X2FsbG9jX2t0bHNfaW5mbyhzdHJ1Y3QgYm54dCAqYnApXFxuK3tcXG4rXFx0c3RydWN0IGJueHRfdGxzX2luZm8gKmt0bHMgPSBicC1cXHUwMDNla3Rsc19pbmZvO1xcbitcXG4rXFx0aWYgKEJOWFRfVkYoYnApKVxcbitcXHRcXHRyZXR1cm4gLUVPUE5PVFNVUFA7XFxuK1xcdGlmIChrdGxzKVxcbitcXHRcXHRyZXR1cm4gMDtcXG4rXFxuK1xcdGt0bHMgPSBremFsbG9jX29iaigqa3Rscyk7XFxuK1xcdGlmICgha3Rscykge1xcbitcXHRcXHRuZXRkZXZfd2FybihicC1cXHUwMDNlZGV2LCBcXFwiVW5hYmxlIHRvIGFsbG9jYXRlIGtUTFMgaW5mb1xcXFxuXFxcIik7XFxuK1xcdFxcdHJldHVybiAtRU5PTUVNO1xcbitcXHR9XFxuK1xcdGt0bHMtXFx1MDAzZWNvdW50ZXJzID0ga3phbGxvY19vYmpzKCprdGxzLVxcdTAwM2Vjb3VudGVycyxcXG4rXFx0XFx0XFx0XFx0ICAgICAgQk5YVF9LVExTX01BWF9DVFJMX0NPVU5URVJTKTtcXG4rXFx0aWYgKCFrdGxzLVxcdTAwM2Vjb3VudGVycylcXG4rXFx0XFx0Z290byBrdGxzX2VycjtcXG4rXFxuK1xcdGluaXRfd2FpdHF1ZXVlX2hlYWQoXFx1MDAyNmt0bHMtXFx1MDAzZW9wZW5fd3EpO1xcbitcXHRicC1cXHUwMDNla3Rsc19pbmZvID0ga3RscztcXG4rXFx0cmV0dXJuIDA7XFxuK1xcbitrdGxzX2VycjpcXG4rXFx0a2ZyZWUoa3Rscy1cXHUwMDNlY291bnRlcnMpO1xcbitcXHRrZnJlZShrdGxzKTtcXG4rXFx0cmV0dXJuIC1FTk9NRU07XFxuK31cXG4rXFxuKy8qKlxcbisgKiBibnh0X2ZyZWVfa3Rsc19pbmZvIC0gRnJlZSBrVExTIGNyeXB0byBvZmZsb2FkIHJlc291cmNlc1xcbisgKiBAYnA6IHBvaW50ZXIgdG8gYm54dCBkZXZpY2VcXG4rICpcXG4rICogRnJlZXMgYWxsIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGgga1RMUyBjcnlwdG8gb2ZmbG9hZFxcbisgKlxcbisgKiBDb250ZXh0OiBQcm9jZXNzIGNvbnRleHQgZHVyaW5nIGRldmljZSBzaHV0ZG93bi9yZW1vdmFsXFxuKyAqL1xcbit2b2lkIGJueHRfZnJlZV9rdGxzX2luZm8oc3RydWN0IGJueHQgKmJwKVxcbit7XFxuK1xcdHN0cnVjdCBibnh0X3Rsc19pbmZvICprdGxzID0gYnAtXFx1MDAzZWt0bHNfaW5mbztcXG4rXFxuK1xcdGlmICgha3RscylcXG4rXFx0XFx0cmV0dXJuO1xcbitcXHRrZnJlZShrdGxzLVxcdTAwM2Vjb3VudGVycyk7XFxuK1xcdGtmcmVlKGt0bHMpO1xcbitcXHRicC1cXHUwMDNla3Rsc19pbmZvID0gTlVMTDtcXG4rfVxcbitcXG4rLyogQ29weSBpbiByZXZlcnNlIGJ5dGUgb3JkZXIgKi9cXG4rc3RhdGljIHZvaWQgYm54dF9jb3B5X3Rsc19tcF9kYXRhKHU4ICpkc3QsIHU4ICpzcmMsIGludCBieXRlcylcXG4re1xcbitcXHRpbnQgaTtcXG4rXFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBieXRlczsgaSsrKVxcbitcXHRcXHRkc3RbYnl0ZXMgLSBpIC0gMV0gPSBzcmNbaV07XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgYm54dF9jcnlwdG9fYWRkKHN0cnVjdCBibnh0ICpicCwgZW51bSB0bHNfb2ZmbG9hZF9jdHhfZGlyIGRpcmVjdGlvbixcXG4rXFx0XFx0XFx0ICAgc3RydWN0IHRsc19jcnlwdG9faW5mbyAqY3J5cHRvX2luZm8sIHUzMiB0Y3Bfc2VxX25vLFxcbitcXHRcXHRcXHQgICB1MzIga2lkKVxcbit7XFxuK1xcdHN0cnVjdCBibnh0X3R4X3JpbmdfaW5mbyAqdHhyO1xcbitcXHRzdHJ1Y3QgY2VfYWRkX2NtZCBjbWQgPSB7MH07XFxuK1xcdHUzMiBkYXRhO1xcbitcXHRpbnQgcmM7XFxuK1xcbitcXHRpZiAoZGlyZWN0aW9uID09IFRMU19PRkZMT0FEX0NUWF9ESVJfVFgpIHtcXG4rXFx0XFx0dHhyID0gYm54dF9zZWxlY3RfbXBjX3JpbmcoYnAsIEJOWFRfTVBDX1RDRV9UWVBFKTtcXG4rXFx0XFx0Y21kLmN0eF9raW5kID0gQ0VfQUREX0NNRF9DVFhfS0lORF9DS19UWDtcXG4rXFx0fSBlbHNlIHtcXG4rXFx0XFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xcbitcXHR9XFxuK1xcdGlmICghdHhyKVxcbitcXHRcXHRyZXR1cm4gLUVOT0RFVjtcXG4rXFxuK1xcdGRhdGEgPSBDRV9BRERfQ01EX09QQ09ERV9BREQgfCAoQk5YVF9LSURfSFcoa2lkKSBcXHUwMDNjXFx1MDAzYyBDRV9BRERfQ01EX0tJRF9TRlQpO1xcbitcXHRzd2l0Y2ggKGNyeXB0b19pbmZvLVxcdTAwM2VjaXBoZXJfdHlwZSkge1xcbitcXHRjYXNlIFRMU19DSVBIRVJfQUVTX0dDTV8xMjg6IHtcXG4rXFx0XFx0c3RydWN0IHRsczEyX2NyeXB0b19pbmZvX2Flc19nY21fMTI4ICphZXM7XFxuK1xcbitcXHRcXHRhZXMgPSAodm9pZCAqKWNyeXB0b19pbmZvO1xcbitcXHRcXHRkYXRhIHw9IENFX0FERF9DTURfQUxHT1JJVEhNX0FFU19HQ01fMTI4O1xcbitcXHRcXHRpZiAoY3J5cHRvX2luZm8tXFx1MDAzZXZlcnNpb24gPT0gVExTXzFfM19WRVJTSU9OKVxcbitcXHRcXHRcXHRkYXRhIHw9IENFX0FERF9DTURfVkVSU0lPTl9UTFMxXzM7XFxuK1xcdFxcdG1lbWNweShcXHUwMDI2Y21kLnNlc3Npb25fa2V5LCBhZXMtXFx1MDAzZWtleSwgc2l6ZW9mKGFlcy1cXHUwMDNla2V5KSk7XFxuK1xcdFxcdG1lbWNweShcXHUwMDI2Y21kLnNhbHQsIGFlcy1cXHUwMDNlc2FsdCwgc2l6ZW9mKGFlcy1cXHUwMDNlc2FsdCkpO1xcbitcXHRcXHRtZW1jcHkoXFx1MDAyNmNtZC5hZGRsX2l2LCBhZXMtXFx1MDAzZWl2LCBzaXplb2YoYWVzLVxcdTAwM2VpdikpO1xcbitcXHRcXHRibnh0X2NvcHlfdGxzX21wX2RhdGEoY21kLnJlY29yZF9zZXFfbnVtLCBhZXMtXFx1MDAzZXJlY19zZXEsXFxuK1xcdFxcdFxcdFxcdCAgICAgIHNpemVvZihhZXMtXFx1MDAzZXJlY19zZXEpKTtcXG4rXFx0XFx0YnJlYWs7XFxuK1xcdH1cXG4rXFx0Y2FzZSBUTFNfQ0lQSEVSX0FFU19HQ01fMjU2OiB7XFxuK1xcdFxcdHN0cnVjdCB0bHMxMl9jcnlwdG9faW5mb19hZXNfZ2NtXzI1NiAqYWVzO1xcbitcXG4rXFx0XFx0YWVzID0gKHZvaWQgKiljcnlwdG9faW5mbztcXG4rXFx0XFx0ZGF0YSB8PSBDRV9BRERfQ01EX0FMR09SSVRITV9BRVNfR0NNXzI1NjtcXG4rXFx0XFx0aWYgKGNyeXB0b19pbmZvLVxcdTAwM2V2ZXJzaW9uID09IFRMU18xXzNfVkVSU0lPTilcXG4rXFx0XFx0XFx0ZGF0YSB8PSBDRV9BRERfQ01EX1ZFUlNJT05fVExTMV8zO1xcbitcXHRcXHRtZW1jcHkoXFx1MDAyNmNtZC5zZXNzaW9uX2tleSwgYWVzLVxcdTAwM2VrZXksIHNpemVvZihhZXMtXFx1MDAzZWtleSkpO1xcbitcXHRcXHRtZW1jcHkoXFx1MDAyNmNtZC5zYWx0LCBhZXMtXFx1MDAzZXNhbHQsIHNpemVvZihhZXMtXFx1MDAzZXNhbHQpKTtcXG4rXFx0XFx0bWVtY3B5KFxcdTAwMjZjbWQuYWRkbF9pdiwgYWVzLVxcdTAwM2Vpdiwgc2l6ZW9mKGFlcy1cXHUwMDNlaXYpKTtcXG4rXFx0XFx0Ym54dF9jb3B5X3Rsc19tcF9kYXRhKGNtZC5yZWNvcmRfc2VxX251bSwgYWVzLVxcdTAwM2VyZWNfc2VxLFxcbitcXHRcXHRcXHRcXHQgICAgICBzaXplb2YoYWVzLVxcdTAwM2VyZWNfc2VxKSk7XFxuK1xcdFxcdGJyZWFrO1xcbitcXHR9XFxuK1xcdGRlZmF1bHQ6XFxuK1xcdFxcdHJldHVybiAtRU9QTk9UU1VQUDtcXG4rXFx0fVxcbitcXHRjbWQudmVyX2FsZ29fa2lkX29wY29kZSA9IGNwdV90b19sZTMyKGRhdGEpO1xcbitcXHRjbWQucGt0X3RjcF9zZXFfbnVtID0gY3B1X3RvX2xlMzIodGNwX3NlcV9ubyk7XFxuK1xcdGNtZC50bHNfaGVhZGVyX3RjcF9zZXFfbnVtID0gY21kLnBrdF90Y3Bfc2VxX251bTtcXG4rXFx0cmMgPSBibnh0X3htaXRfY3J5cHRvX2NtZChicCwgdHhyLCBcXHUwMDI2Y21kLCBzaXplb2YoY21kKSxcXG4rXFx0XFx0XFx0XFx0ICBCTlhUX01QQ19UTU9fTVNFQ1MpO1xcbitcXHRtZW16ZXJvX2V4cGxpY2l0KFxcdTAwMjZjbWQsIHNpemVvZihjbWQpKTtcXG4rXFx0cmV0dXJuIHJjO1xcbit9XFxuK1xcbitzdGF0aWMgYm9vbCBibnh0X2t0bHNfY2lwaGVyX3N1cHBvcnRlZChzdHJ1Y3QgYm54dCAqYnAsXFxuK1xcdFxcdFxcdFxcdCAgICAgICBzdHJ1Y3QgdGxzX2NyeXB0b19pbmZvICpjcnlwdG9faW5mbylcXG4re1xcbitcXHR1MTYgdHlwZSA9IGNyeXB0b19pbmZvLVxcdTAwM2VjaXBoZXJfdHlwZTtcXG4rXFx0dTE2IHZlcnNpb24gPSBjcnlwdG9faW5mby1cXHUwMDNldmVyc2lvbjtcXG4rXFxuK1xcdGlmICgodHlwZSA9PSBUTFNfQ0lQSEVSX0FFU19HQ01fMTI4IHx8XFxuK1xcdCAgICAgdHlwZSA9PSBUTFNfQ0lQSEVSX0FFU19HQ01fMjU2KSBcXHUwMDI2XFx1MDAyNlxcbitcXHQgICAgKHZlcnNpb24gPT0gVExTXzFfMl9WRVJTSU9OIHx8XFxuK1xcdCAgICAgdmVyc2lvbiA9PSBUTFNfMV8zX1ZFUlNJT04pKVxcbitcXHRcXHRyZXR1cm4gdHJ1ZTtcXG4rXFx0cmV0dXJuIGZhbHNlO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBibnh0X3NldF9rdGxzX2N0eF90eChzdHJ1Y3QgdGxzX2NvbnRleHQgKnRsc19jdHgsXFxuK1xcdFxcdFxcdFxcdCBzdHJ1Y3QgYm54dF9rdGxzX29mZmxvYWRfY3R4X3R4ICprY3R4X3R4KVxcbit7XFxuK1xcdHN0cnVjdCBibnh0X2t0bHNfdHhfZHJpdmVyX3N0YXRlICp0eCA9XFxuK1xcdFxcdF9fdGxzX2RyaXZlcl9jdHgodGxzX2N0eCwgVExTX09GRkxPQURfQ1RYX0RJUl9UWCk7XFxuK1xcbitcXHR0eC1cXHUwMDNlY3R4X3R4ID0ga2N0eF90eDtcXG4rfVxcbitcXG4rc3RhdGljIHN0cnVjdCBibnh0X2t0bHNfb2ZmbG9hZF9jdHhfdHggKlxcbitibnh0X2dldF9rdGxzX2N0eF90eChzdHJ1Y3QgdGxzX2NvbnRleHQgKnRsc19jdHgpXFxuK3tcXG4rXFx0c3RydWN0IGJueHRfa3Rsc190eF9kcml2ZXJfc3RhdGUgKnR4ID1cXG4rXFx0XFx0X190bHNfZHJpdmVyX2N0eCh0bHNfY3R4LCBUTFNfT0ZGTE9BRF9DVFhfRElSX1RYKTtcXG4rXFxuK1xcdHJldHVybiB0eC1cXHUwMDNlY3R4X3R4O1xcbit9XFxuK1xcbitzdGF0aWMgaW50IGJueHRfa3Rsc19kZXZfYWRkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBzb2NrICpzayxcXG4rXFx0XFx0XFx0ICAgICBlbnVtIHRsc19vZmZsb2FkX2N0eF9kaXIgZGlyZWN0aW9uLFxcbitcXHRcXHRcXHQgICAgIHN0cnVjdCB0bHNfY3J5cHRvX2luZm8gKmNyeXB0b19pbmZvLFxcbitcXHRcXHRcXHQgICAgIHUzMiBzdGFydF9vZmZsb2FkX3RjcF9zbilcXG4re1xcbitcXHRzdHJ1Y3QgYm54dF9rdGxzX29mZmxvYWRfY3R4X3R4ICprY3R4X3R4O1xcbitcXHRzdHJ1Y3QgYm54dCAqYnAgPSBuZXRkZXZfcHJpdihkZXYpO1xcbitcXHRzdHJ1Y3QgYm54dF9jcnlwdG9faW5mbyAqY3J5cHRvO1xcbitcXHRzdHJ1Y3QgdGxzX2NvbnRleHQgKnRsc19jdHg7XFxuK1xcdHN0cnVjdCBibnh0X3Rsc19pbmZvICprdGxzO1xcbitcXHRzdHJ1Y3QgYm54dF9rY3R4ICprY3R4O1xcbitcXHR1MzIga2lkO1xcbitcXHRpbnQgcmM7XFxuK1xcbitcXHRCVUlMRF9CVUdfT04oc2l6ZW9mKHN0cnVjdCBibnh0X2t0bHNfdHhfZHJpdmVyX3N0YXRlKSBcXHUwMDNlXFxuK1xcdFxcdCAgICAgVExTX0RSSVZFUl9TVEFURV9TSVpFX1RYKTtcXG4rXFxuK1xcdGt0bHMgPSBicC1cXHUwMDNla3Rsc19pbmZvO1xcbitcXHRpZiAoZGlyZWN0aW9uID09IFRMU19PRkZMT0FEX0NUWF9ESVJfUlgpXFxuK1xcdFxcdHJldHVybiAtRU9QTk9UU1VQUDtcXG4rXFxuK1xcdGlmICghQk5YVF9TVVBQT1JUU19LVExTKGJwKSkge1xcbitcXHRcXHRhdG9taWM2NF9pbmMoXFx1MDAyNmt0bHMtXFx1MDAzZWNvdW50ZXJzW0JOWFRfS1RMU19FUlJfTk9fQ0FQXSk7XFxuK1xcdFxcdHJldHVybiAtRU9QTk9UU1VQUDtcXG4rXFx0fVxcbitcXHRhdG9taWNfaW5jKFxcdTAwMjZrdGxzLVxcdTAwM2VwZW5kaW5nKTtcXG4rXFx0LyogTWFrZSBzdXJlIGJueHRfY2xvc2VfbmljKCkgc2VlcyBwZW5kaW5nIGJlZm9yZSB3ZSBjaGVjayB0aGVcXG4rXFx0ICogQk5YVF9TVEFURV9PUEVOIGZsYWcuXFxuK1xcdCAqL1xcbitcXHRzbXBfbWJfX2FmdGVyX2F0b21pYygpO1xcbitcXHRpZiAoIXRlc3RfYml0KEJOWFRfU1RBVEVfT1BFTiwgXFx1MDAyNmJwLVxcdTAwM2VzdGF0ZSkpIHtcXG4rXFx0XFx0YXRvbWljNjRfaW5jKFxcdTAwMjZrdGxzLVxcdTAwM2Vjb3VudGVyc1tCTlhUX0tUTFNfRVJSX1NUQVRFX05PVF9PUEVOXSk7XFxuK1xcdFxcdHJjID0gLUVOT0RFVjtcXG4rXFx0XFx0Z290byBleGl0O1xcbitcXHR9XFxuK1xcbitcXHRpZiAoIWJueHRfa3Rsc19jaXBoZXJfc3VwcG9ydGVkKGJwLCBjcnlwdG9faW5mbykpIHtcXG4rXFx0XFx0YXRvbWljNjRfaW5jKFxcdTAwMjZrdGxzLVxcdTAwM2Vjb3VudGVyc1tCTlhUX0tUTFNfRVJSX0lOVkFMSURfQ0lQSEVSXSk7XFxuK1xcdFxcdHJjID0gLUVPUE5PVFNVUFA7XFxuK1xcdFxcdGdvdG8gZXhpdDtcXG4rXFx0fVxcbitcXG4rXFx0a2N0eF90eCA9IGt6YWxsb2Nfb2JqKCprY3R4X3R4KTtcXG4rXFx0aWYgKCFrY3R4X3R4KSB7XFxuK1xcdFxcdGF0b21pYzY0X2luYyhcXHUwMDI2a3Rscy1cXHUwMDNlY291bnRlcnNbQk5YVF9LVExTX0VSUl9OT19NRU1dKTtcXG4rXFx0XFx0cmMgPSAtRU5PTUVNO1xcbitcXHRcXHRnb3RvIGV4aXQ7XFxuK1xcdH1cXG4rXFx0dGxzX2N0eCA9IHRsc19nZXRfY3R4KHNrKTtcXG4rXFx0Y3J5cHRvID0gYnAtXFx1MDAzZWNyeXB0b19pbmZvO1xcbitcXHRrY3R4ID0gXFx1MDAyNmNyeXB0by1cXHUwMDNla2N0eFtCTlhUX1RYX0NSWVBUT19LRVlfVFlQRV07XFxuK1xcdHJjID0gYm54dF9rZXlfY3R4X2FsbG9jX29uZShicCwga2N0eCwgQk5YVF9DVFhfS0lORF9DS19UWCwgXFx1MDAyNmtpZCk7XFxuK1xcdGlmIChyYykge1xcbitcXHRcXHRhdG9taWM2NF9pbmMoXFx1MDAyNmt0bHMtXFx1MDAzZWNvdW50ZXJzW0JOWFRfS1RMU19FUlJfS0VZX0NUWF9BTExPQ10pO1xcbitcXHRcXHRnb3RvIGZyZWVfY3R4O1xcbitcXHR9XFxuK1xcdHJjID0gYm54dF9jcnlwdG9fYWRkKGJwLCBkaXJlY3Rpb24sIGNyeXB0b19pbmZvLCBzdGFydF9vZmZsb2FkX3RjcF9zbixcXG4rXFx0XFx0XFx0ICAgICBraWQpO1xcbitcXHRpZiAocmMpIHtcXG4rXFx0XFx0YXRvbWljNjRfaW5jKFxcdTAwMjZrdGxzLVxcdTAwM2Vjb3VudGVyc1tCTlhUX0tUTFNfRVJSX0NSWVBUT19DTURdKTtcXG4rXFx0XFx0Z290byBmcmVlX2tjdHg7XFxuK1xcdH1cXG4rXFx0a2N0eF90eC1cXHUwMDNla2lkID0ga2lkO1xcbitcXHRrY3R4X3R4LVxcdTAwM2V0Y3Bfc2VxX25vID0gc3RhcnRfb2ZmbG9hZF90Y3Bfc247XFxuK1xcdGJueHRfc2V0X2t0bHNfY3R4X3R4KHRsc19jdHgsIGtjdHhfdHgpO1xcbitcXHRhdG9taWM2NF9pbmMoXFx1MDAyNmt0bHMtXFx1MDAzZWNvdW50ZXJzW0JOWFRfS1RMU19UWF9BRERdKTtcXG4rXFx0Z290byBleGl0O1xcbitcXG4rZnJlZV9rY3R4OlxcbitcXHQvKiBUaGlzIEtJRCB3YXMganVzdCBhbGxvY2F0ZWQgd2hpbGUgaG9sZGluZyBrdGxzLVxcdTAwM2VwZW5kaW5nLCBzbyBlcG9jaFxcbitcXHQgKiBjaGVjayBpcyB1bm5lY2Vzc2FyeS5cXG4rXFx0ICovXFxuK1xcdGJueHRfZnJlZV9vbmVfa2N0eChrY3R4LCBraWQpO1xcbitmcmVlX2N0eDpcXG4rXFx0a2ZyZWUoa2N0eF90eCk7XFxuK2V4aXQ6XFxuK1xcdGF0b21pY19kZWMoXFx1MDAyNmt0bHMtXFx1MDAzZXBlbmRpbmcpO1xcbitcXHRyZXR1cm4gcmM7XFxuK31cXG4rXFxuKyNkZWZpbmUgS1RMU19SRVRSWV9NQVhcXHRcXHQxMDBcXG4rI2RlZmluZSBLVExTX1dBSVRfVE1PX01TXFx0MTAwXFxuK1xcbitzdGF0aWMgdm9pZCBibnh0X2t0bHNfZGV2X2RlbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LFxcbitcXHRcXHRcXHQgICAgICBzdHJ1Y3QgdGxzX2NvbnRleHQgKnRsc19jdHgsXFxuK1xcdFxcdFxcdCAgICAgIGVudW0gdGxzX29mZmxvYWRfY3R4X2RpciBkaXJlY3Rpb24pXFxuK3tcXG4rXFx0c3RydWN0IGJueHRfa3Rsc19vZmZsb2FkX2N0eF90eCAqa2N0eF90eDtcXG4rXFx0c3RydWN0IGJueHQgKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTtcXG4rXFx0c3RydWN0IGJueHRfY3J5cHRvX2luZm8gKmNyeXB0bztcXG4rXFx0c3RydWN0IGJueHRfdGxzX2luZm8gKmt0bHM7XFxuK1xcdHN0cnVjdCBibnh0X2tjdHggKmtjdHg7XFxuK1xcdGludCByZXRyeV9jbnQgPSAwO1xcbitcXHR1OCBraW5kO1xcbitcXHR1MzIga2lkO1xcbitcXG4rXFx0a3RscyA9IGJwLVxcdTAwM2VrdGxzX2luZm87XFxuK1xcdGtjdHhfdHggPSBibnh0X2dldF9rdGxzX2N0eF90eCh0bHNfY3R4KTtcXG4rcmV0cnk6XFxuK1xcdGlmICghdGVzdF9iaXQoQk5YVF9TVEFURV9PUEVOLCBcXHUwMDI2YnAtXFx1MDAzZXN0YXRlKSkge1xcbitcXHRcXHQvKiBEdXJpbmcgaWZkb3duIG9yIEZXIHJlc2V0LCBhbGwgY29ubmVjdGlvbnMgd2lsbCBiZSB0b3JuXFxuK1xcdFxcdCAqIGRvd24gYnkgYm54dF9jcnlwdG9fZGVsX2FsbCgpIC8gRlVOQ19SRVNFVCwgc28gbm90aGluZyB0b1xcbitcXHRcXHQgKiBkbyBoZXJlLiAgT25seSBhIHJlY29uZmlndXJhdGlvbiBpcyB0cmFuc2llbnQgYW5kXFxuK1xcdFxcdCAqIF9fYm54dF9vcGVuX25pYygpIHdpbGwgc2V0IEJOWFRfU1RBVEVfT1BFTiBhZ2FpbiBhbmQgd2FrZSB1cy5cXG4rXFx0XFx0ICovXFxuK1xcdFxcdGlmICghbmV0aWZfcnVubmluZyhkZXYpIHx8XFxuK1xcdFxcdCAgICB0ZXN0X2JpdChCTlhUX1NUQVRFX0lOX0ZXX1JFU0VULCBcXHUwMDI2YnAtXFx1MDAzZXN0YXRlKSlcXG4rXFx0XFx0XFx0Z290byBmcmVlO1xcbitcXHRcXHQvKiBCb3VuZCB0aGUgd2FpdCBzbyBhIHdlZGdlZCByZWNvbmZpZyBjYW4ndCBibG9jayB0aGUga1RMU1xcbitcXHRcXHQgKiBkZXN0cnVjdCB3b3JrIGluZGVmaW5pdGVseS5cXG4rXFx0XFx0ICovXFxuK1xcdFxcdGlmIChyZXRyeV9jbnQrKyBcXHUwMDNlIEtUTFNfUkVUUllfTUFYKSB7XFxuK1xcdFxcdFxcdGF0b21pYzY0X2luYyhcXHUwMDI2a3Rscy1cXHUwMDNlY291bnRlcnNbQk5YVF9LVExTX0VSUl9SRVRSWV9FWENFRURFRF0pO1xcbitcXHRcXHRcXHRuZXRkZXZfd2FybihkZXYsIFxcXCIlcyB0aW1lZCBvdXQgd2FpdGluZyBmb3IgZGV2aWNlLCBzdGF0ZSAlbHhcXFxcblxcXCIsXFxuK1xcdFxcdFxcdFxcdCAgICBfX2Z1bmNfXywgYnAtXFx1MDAzZXN0YXRlKTtcXG4rXFx0XFx0XFx0Z290byBmcmVlO1xcbitcXHRcXHR9XFxuK1xcdFxcdHdhaXRfZXZlbnRfdGltZW91dChrdGxzLVxcdTAwM2VvcGVuX3dxLFxcbitcXHRcXHRcXHRcXHQgICB0ZXN0X2JpdChCTlhUX1NUQVRFX09QRU4sIFxcdTAwMjZicC1cXHUwMDNlc3RhdGUpIHx8XFxuK1xcdFxcdFxcdFxcdCAgICFuZXRpZl9ydW5uaW5nKGRldikgfHxcXG4rXFx0XFx0XFx0XFx0ICAgdGVzdF9iaXQoQk5YVF9TVEFURV9JTl9GV19SRVNFVCwgXFx1MDAyNmJwLVxcdTAwM2VzdGF0ZSksXFxuK1xcdFxcdFxcdFxcdCAgIG1zZWNzX3RvX2ppZmZpZXMoS1RMU19XQUlUX1RNT19NUykpO1xcbitcXHRcXHRnb3RvIHJldHJ5O1xcbitcXHR9XFxuK1xcdGF0b21pY19pbmMoXFx1MDAyNmt0bHMtXFx1MDAzZXBlbmRpbmcpO1xcbitcXHQvKiBNYWtlIHN1cmUgYm54dF9jbG9zZV9uaWMoKSBzZWVzIHBlbmRpbmcgYmVmb3JlIHdlIGNoZWNrIHRoZVxcbitcXHQgKiBCTlhUX1NUQVRFX09QRU4gZmxhZy5cXG4rXFx0ICovXFxuK1xcdHNtcF9tYl9fYWZ0ZXJfYXRvbWljKCk7XFxuK1xcdGlmICghdGVzdF9iaXQoQk5YVF9TVEFURV9PUEVOLCBcXHUwMDI2YnAtXFx1MDAzZXN0YXRlKSkge1xcbitcXHRcXHRhdG9taWNfZGVjKFxcdTAwMjZrdGxzLVxcdTAwM2VwZW5kaW5nKTtcXG4rXFx0XFx0Z290byByZXRyeTtcXG4rXFx0fVxcbitcXG4rXFx0Y3J5cHRvID0gYnAtXFx1MDAzZWNyeXB0b19pbmZvO1xcbitcXHRraWQgPSBrY3R4X3R4LVxcdTAwM2VraWQ7XFxuK1xcdGtjdHggPSBcXHUwMDI2Y3J5cHRvLVxcdTAwM2VrY3R4W0JOWFRfVFhfQ1JZUFRPX0tFWV9UWVBFXTtcXG4rXFx0a2luZCA9IEJOWFRfQ1RYX0tJTkRfQ0tfVFg7XFxuK1xcdGF0b21pYzY0X2luYyhcXHUwMDI2a3Rscy1cXHUwMDNlY291bnRlcnNbQk5YVF9LVExTX1RYX0RFTF0pO1xcbitcXHQvKiBUaGlzIEtJRCB3YXMgYWxsb2NhdGVkIGJ5IGFuIGVhcmxpZXIgYWRkIGFuZCBtYXkgaGF2ZSBvdXRsaXZlZCBhIEZXXFxuK1xcdCAqIHJlc2V0LCBzbyB2YWxpZGF0ZSBpdHMgZXBvY2ggYmVmb3JlIGRlbGV0aW5nL2ZyZWVpbmcgaXQuXFxuK1xcdCAqL1xcbitcXHRpZiAoYm54dF9raWRfdmFsaWQoa2N0eCwga2lkKSBcXHUwMDI2XFx1MDAyNlxcbitcXHQgICAgIWJueHRfY3J5cHRvX2RlbChicCwga2N0eC1cXHUwMDNldHlwZSwga2luZCwga2lkKSlcXG4rXFx0XFx0Ym54dF9mcmVlX29uZV9rY3R4KGtjdHgsIGtpZCk7XFxuK1xcbitcXHRhdG9taWNfZGVjKFxcdTAwMjZrdGxzLVxcdTAwM2VwZW5kaW5nKTtcXG4rZnJlZTpcXG4rXFx0Ym54dF9zZXRfa3Rsc19jdHhfdHgodGxzX2N0eCwgTlVMTCk7XFxuK1xcdGtmcmVlKGtjdHhfdHgpO1xcbit9XFxuK1xcbitzdGF0aWMgY29uc3Qgc3RydWN0IHRsc2Rldl9vcHMgYm54dF9rdGxzX29wcyA9IHtcXG4rXFx0LnRsc19kZXZfYWRkID0gYm54dF9rdGxzX2Rldl9hZGQsXFxuK1xcdC50bHNfZGV2X2RlbCA9IGJueHRfa3Rsc19kZXZfZGVsLFxcbit9O1xcbitcXG4raW50IGJueHRfa3Rsc19pbml0KHN0cnVjdCBibnh0ICpicClcXG4re1xcbitcXHRzdHJ1Y3QgYm54dF90bHNfaW5mbyAqa3RscyA9IGJwLVxcdTAwM2VrdGxzX2luZm87XFxuK1xcdHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBicC1cXHUwMDNlZGV2O1xcbitcXG4rXFx0aWYgKCFrdGxzKVxcbitcXHRcXHRyZXR1cm4gMDtcXG4rXFxuK1xcdGRldi1cXHUwMDNldGxzZGV2X29wcyA9IFxcdTAwMjZibnh0X2t0bHNfb3BzO1xcbitcXHRkZXYtXFx1MDAzZWh3X2ZlYXR1cmVzIHw9IE5FVElGX0ZfSFdfVExTX1RYO1xcbitcXHRkZXYtXFx1MDAzZWZlYXR1cmVzIHw9IE5FVElGX0ZfSFdfVExTX1RYO1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgYm54dF9rdGxzX2luY190eF9zdGF0cyhzdHJ1Y3QgYm54dF90eF9yaW5nX2luZm8gKnR4ciwgdTMyIGJ5dGVzLFxcbitcXHRcXHRcXHRcXHQgICBib29sIG9vbylcXG4re1xcbitcXHRzdHJ1Y3QgYm54dF90bHNfc3dfc3RhdHMgKnJpbmdfc3RhdHMgPSB0eHItXFx1MDAzZXRsc19zdGF0cztcXG4rXFxuK1xcdGlmICghcmluZ19zdGF0cylcXG4rXFx0XFx0cmV0dXJuO1xcbitcXHRyaW5nX3N0YXRzLVxcdTAwM2Vjb3VudGVyc1tCTlhUX0tUTFNfVFhfUEtUU10rKztcXG4rXFx0cmluZ19zdGF0cy1cXHUwMDNlY291bnRlcnNbQk5YVF9LVExTX1RYX0JZVEVTXSArPSBieXRlcztcXG4rXFx0aWYgKG9vbylcXG4rXFx0XFx0cmluZ19zdGF0cy1cXHUwMDNlY291bnRlcnNbQk5YVF9LVExTX1RYX09PT19QS1RTXSsrO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBibnh0X2t0bHNfcHJlX3htaXQoc3RydWN0IGJueHQgKmJwLCBzdHJ1Y3QgYm54dF90eF9yaW5nX2luZm8gKnR4cixcXG4rXFx0XFx0XFx0ICAgICAgIHUzMiBraWQsIHN0cnVjdCBjcnlwdG9fcHJlZml4X2NtZCAqcHJlX2NtZClcXG4re1xcbitcXHRzdHJ1Y3QgYm54dF9zd190eF9iZCAqdHhfYnVmO1xcbitcXHRzdHJ1Y3QgdHhfYmRfcHJlc3luYyAqcHNiZDtcXG4rXFx0dTMyIGJkX3NwYWNlLCBzcGFjZTtcXG4rXFx0dTggKnBjbWQ7XFxuK1xcdHUxNiBwcm9kO1xcbitcXG4rXFx0cHJvZCA9IHR4ci1cXHUwMDNldHhfcHJvZDtcXG4rXFx0dHhfYnVmID0gXFx1MDAyNnR4ci1cXHUwMDNldHhfYnVmX3JpbmdbUklOR19UWChicCwgcHJvZCldO1xcbitcXG4rXFx0cHNiZCA9ICh2b2lkICopXFx1MDAyNnR4ci1cXHUwMDNldHhfZGVzY19yaW5nW1RYX1JJTkcoYnAsIHByb2QpXVtUWF9JRFgocHJvZCldO1xcbitcXHRwc2JkLVxcdTAwM2V0eF9iZF9sZW5fZmxhZ3NfdHlwZSA9IENSWVBUT19QUkVTWU5DX0JEX0NNRDtcXG4rXFx0cHNiZC1cXHUwMDNldHhfYmRfa2lkID0gY3B1X3RvX2xlMzIoQk5YVF9LSURfSFcoa2lkKSk7XFxuK1xcdHBzYmQtXFx1MDAzZXR4X2JkX29wYXF1ZSA9XFxuK1xcdFxcdFNFVF9UWF9PUEFRVUUoYnAsIHR4ciwgcHJvZCwgQ1JZUFRPX1BSRUZJWF9DTURfQkRTICsgMSk7XFxuK1xcbitcXHRwcm9kID0gTkVYVF9UWChwcm9kKTtcXG4rXFx0cGNtZCA9ICh2b2lkICopXFx1MDAyNnR4ci1cXHUwMDNldHhfZGVzY19yaW5nW1RYX1JJTkcoYnAsIHByb2QpXVtUWF9JRFgocHJvZCldO1xcbitcXHRiZF9zcGFjZSA9IFRYX0RFU0NfQ05UIC0gVFhfSURYKHByb2QpO1xcbitcXHRzcGFjZSA9IGJkX3NwYWNlICogc2l6ZW9mKHN0cnVjdCB0eF9iZCk7XFxuK1xcdGlmIChzcGFjZSBcXHUwMDNlPSBDUllQVE9fUFJFRklYX0NNRF9TSVpFKSB7XFxuK1xcdFxcdG1lbWNweShwY21kLCBwcmVfY21kLCBDUllQVE9fUFJFRklYX0NNRF9TSVpFKTtcXG4rXFx0XFx0cHJvZCArPSBDUllQVE9fUFJFRklYX0NNRF9CRFM7XFxuK1xcdH0gZWxzZSB7XFxuK1xcdFxcdG1lbWNweShwY21kLCBwcmVfY21kLCBzcGFjZSk7XFxuK1xcdFxcdHByb2QgKz0gYmRfc3BhY2U7XFxuK1xcdFxcdHBjbWQgPSAodm9pZCAqKVxcdTAwMjZ0eHItXFx1MDAzZXR4X2Rlc2NfcmluZ1tUWF9SSU5HKGJwLCBwcm9kKV1bVFhfSURYKHByb2QpXTtcXG4rXFx0XFx0bWVtY3B5KHBjbWQsICh1OCAqKXByZV9jbWQgKyBzcGFjZSxcXG4rXFx0XFx0ICAgICAgIENSWVBUT19QUkVGSVhfQ01EX1NJWkUgLSBzcGFjZSk7XFxuK1xcdFxcdHByb2QgKz0gQ1JZUFRPX1BSRUZJWF9DTURfQkRTIC0gYmRfc3BhY2U7XFxuK1xcdH1cXG4rXFx0dHhyLVxcdTAwM2V0eF9wcm9kID0gcHJvZDtcXG4rXFx0dHhfYnVmLVxcdTAwM2Vpc19wdXNoID0gMTtcXG4rXFx0LyogTWludXMgMSBzaW5jZSB0aGUgaGVhZGVyIHBzYmQgaXMgYSBzaW5nbGUgZW50cnkgc2hvcnQgQkQgKi9cXG4rXFx0dHhfYnVmLVxcdTAwM2VpbmxpbmVfZGF0YV9iZHMgPSBDUllQVE9fUFJFRklYX0NNRF9CRFMgLSAxO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IGJueHRfa3Rsc190eF9vb28oc3RydWN0IGJueHQgKmJwLCBzdHJ1Y3QgYm54dF90eF9yaW5nX2luZm8gKnR4cixcXG4rXFx0XFx0XFx0ICAgIHN0cnVjdCBza19idWZmICpza2IsIHUzMiBwYXlsb2FkX2xlbiwgdTMyIHNlcSxcXG4rXFx0XFx0XFx0ICAgIHN0cnVjdCB0bHNfY29udGV4dCAqdGxzX2N0eClcXG4re1xcbitcXHRzdHJ1Y3QgYm54dF90bHNfc3dfc3RhdHMgKnJpbmdfc3RhdHMgPSB0eHItXFx1MDAzZXRsc19zdGF0cztcXG4rXFx0c3RydWN0IHRsc19vZmZsb2FkX2NvbnRleHRfdHggKnR4X3Rsc19jdHg7XFxuK1xcdHN0cnVjdCBibnh0X2t0bHNfb2ZmbG9hZF9jdHhfdHggKmtjdHhfdHg7XFxuK1xcdHUzMiBoZHJfdGNwX3NlcSwgZW5kX3NlcSwgdG90YWxfYmRzO1xcbitcXHRzdHJ1Y3QgY3J5cHRvX3ByZWZpeF9jbWQgcGNtZCA9IHt9O1xcbitcXHRzdHJ1Y3QgdGxzX3JlY29yZF9pbmZvICpyZWNvcmQ7XFxuK1xcdHVuc2lnbmVkIGxvbmcgZmxhZ3M7XFxuK1xcdGJvb2wgZndkID0gZmFsc2U7XFxuK1xcdF9fbGU2NCBsZV9yZWNfc247XFxuK1xcdHU2NCByZWNfc247XFxuK1xcdHU4ICpoZHI7XFxuK1xcdGludCByYztcXG4rXFxuK1xcdHR4X3Rsc19jdHggPSB0bHNfb2ZmbG9hZF9jdHhfdHgodGxzX2N0eCk7XFxuK1xcdGtjdHhfdHggPSBibnh0X2dldF9rdGxzX2N0eF90eCh0bHNfY3R4KTtcXG4rXFx0ZW5kX3NlcSA9IHNlcSArIHNrYi1cXHUwMDNlbGVuIC0gc2tiX3RjcF9hbGxfaGVhZGVycyhza2IpO1xcbitcXHRpZiAodW5saWtlbHkoYWZ0ZXIoc2VxLCBrY3R4X3R4LVxcdTAwM2V0Y3Bfc2VxX25vKSB8fFxcbitcXHRcXHQgICAgIGFmdGVyKGVuZF9zZXEsIGtjdHhfdHgtXFx1MDAzZXRjcF9zZXFfbm8pKSkge1xcbitcXHRcXHRmd2QgPSB0cnVlO1xcbitcXHRcXHRwY21kLmZsYWdzID0gQ1JZUFRPX1BSRUZJWF9DTURfRkxBR1NfVVBEQVRFX0lOX09SREVSX1ZBUl9MRTtcXG4rXFx0fVxcbitcXG4rXFx0c3Bpbl9sb2NrX2lycXNhdmUoXFx1MDAyNnR4X3Rsc19jdHgtXFx1MDAzZWxvY2ssIGZsYWdzKTtcXG4rXFx0cmVjb3JkID0gdGxzX2dldF9yZWNvcmQodHhfdGxzX2N0eCwgc2VxLCBcXHUwMDI2cmVjX3NuKTtcXG4rXFx0aWYgKCFyZWNvcmQgfHwgIXJlY29yZC1cXHUwMDNlbnVtX2ZyYWdzKSB7XFxuK1xcdFxcdHJjID0gLUVQUk9UTztcXG4rXFx0XFx0cmluZ19zdGF0cy1cXHUwMDNlY291bnRlcnNbQk5YVF9LVExTX1RYX09PT19GQUxMQkFDS19OT19TWU5DXSsrO1xcbitcXHRcXHRnb3RvIHVubG9ja19leGl0O1xcbitcXHR9XFxuK1xcdGhkcl90Y3Bfc2VxID0gdGxzX3JlY29yZF9zdGFydF9zZXEocmVjb3JkKTtcXG4rXFx0aGRyID0gc2tiX2ZyYWdfYWRkcmVzc19zYWZlKFxcdTAwMjZyZWNvcmQtXFx1MDAzZWZyYWdzWzBdKTtcXG4rXFxuK1xcdHRvdGFsX2JkcyA9IENSWVBUT19QUkVTWU5DX0JEUyArIHNrYl9zaGluZm8oc2tiKS1cXHUwMDNlbnJfZnJhZ3MgKyAyO1xcbitcXHRpZiAoYm54dF90eF9hdmFpbChicCwgdHhyKSBcXHUwMDNjIHRvdGFsX2Jkcykge1xcbitcXHRcXHRyYyA9IC1FTk9TUEM7XFxuK1xcdFxcdHJpbmdfc3RhdHMtXFx1MDAzZWNvdW50ZXJzW0JOWFRfS1RMU19UWF9PT09fRkFMTEJBQ0tfTk9fU1BBQ0VdKys7XFxuK1xcdFxcdGdvdG8gdW5sb2NrX2V4aXQ7XFxuK1xcdH1cXG4rXFxuK1xcdGlmIChiZWZvcmUocmVjb3JkLVxcdTAwM2VlbmRfc2VxIC0gdGxzX2N0eC1cXHUwMDNlcHJvdF9pbmZvLnRhZ19zaXplLFxcbitcXHRcXHQgICBzZXEgKyBwYXlsb2FkX2xlbikpIHtcXG4rXFx0XFx0LyogcmV0cmFuc21pc3Npb24gaW5jbHVkZXMgdGFnIGJ5dGVzICovXFxuK1xcdFxcdHJjID0gLUVPUE5PVFNVUFA7XFxuK1xcdFxcdGdvdG8gdW5sb2NrX2V4aXQ7XFxuK1xcdH1cXG4rXFx0cGNtZC5oZWFkZXJfdGNwX3NlcV9udW0gPSBjcHVfdG9fbGUzMihoZHJfdGNwX3NlcSk7XFxuK1xcdHBjbWQuc3RhcnRfdGNwX3NlcV9udW0gPSBjcHVfdG9fbGUzMihzZXEpO1xcbitcXHRwY21kLmVuZF90Y3Bfc2VxX251bSA9IGNwdV90b19sZTMyKHNlcSArIHBheWxvYWRfbGVuIC0gMSk7XFxuK1xcdGlmICh0bHNfY3R4LVxcdTAwM2Vwcm90X2luZm8udmVyc2lvbiA9PSBUTFNfMV8yX1ZFUlNJT04pIHtcXG4rXFx0XFx0dTMyIG5vbmNlX2J5dGVzID0gdGxzX2N0eC1cXHUwMDNlcHJvdF9pbmZvLml2X3NpemU7XFxuK1xcdFxcdHUzMiByZXRyYW5zX29mZiA9IHNlcSAtIGhkcl90Y3Bfc2VxO1xcbitcXG4rXFx0XFx0aWYgKCFoZHIpIHtcXG4rXFx0XFx0XFx0cmMgPSAtRU5PQlVGUztcXG4rXFx0XFx0XFx0cmluZ19zdGF0cy1cXHUwMDNlY291bnRlcnNbQk5YVF9LVExTX1RYX09PT19GQUxMQkFDS19OT19IRFJdKys7XFxuK1xcdFxcdFxcdGdvdG8gdW5sb2NrX2V4aXQ7XFxuK1xcdFxcdH1cXG4rXFx0XFx0aWYgKHJldHJhbnNfb2ZmIFxcdTAwM2UgNSBcXHUwMDI2XFx1MDAyNiByZXRyYW5zX29mZiBcXHUwMDNjIDUgKyBub25jZV9ieXRlcylcXG4rXFx0XFx0XFx0bm9uY2VfYnl0ZXMgPSByZXRyYW5zX29mZiAtIDU7XFxuK1xcdFxcdG1lbWNweShwY21kLmV4cGxpY2l0X25vbmNlLCBoZHIgKyA1LCBub25jZV9ieXRlcyk7XFxuK1xcdH1cXG4rXFx0bGVfcmVjX3NuID0gY3B1X3RvX2xlNjQocmVjX3NuKTtcXG4rXFx0bWVtY3B5KFxcdTAwMjZwY21kLnJlY29yZF9zZXFfbnVtWzBdLCBcXHUwMDI2bGVfcmVjX3NuLCBzaXplb2YobGVfcmVjX3NuKSk7XFxuK1xcbitcXHRyYyA9IDA7XFxuK1xcdGJueHRfa3Rsc19wcmVfeG1pdChicCwgdHhyLCBrY3R4X3R4LVxcdTAwM2VraWQsIFxcdTAwMjZwY21kKTtcXG4rXFxuK1xcdGlmIChmd2QpIHtcXG4rXFx0XFx0a2N0eF90eC1cXHUwMDNlbmV4dF90Y3Bfc2VxX25vID0gZW5kX3NlcTtcXG4rXFx0XFx0a2N0eF90eC1cXHUwMDNlcGVuZGluZ19md2QgPSB0cnVlO1xcbitcXHR9XFxuK1xcbit1bmxvY2tfZXhpdDpcXG4rXFx0c3Bpbl91bmxvY2tfaXJxcmVzdG9yZShcXHUwMDI2dHhfdGxzX2N0eC1cXHUwMDNlbG9jaywgZmxhZ3MpO1xcbitcXHRyZXR1cm4gcmM7XFxuK31cXG4rXFxuK3N0cnVjdCBza19idWZmICpibnh0X2t0bHNfeG1pdChzdHJ1Y3QgYm54dCAqYnAsIHN0cnVjdCBibnh0X3R4X3JpbmdfaW5mbyAqdHhyLFxcbitcXHRcXHRcXHQgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgX19sZTMyICpsZmxhZ3MsIHUzMiAqa2lkLFxcbitcXHRcXHRcXHQgICAgICAgc3RydWN0IGJueHRfa3Rsc19vZmZsb2FkX2N0eF90eCAqKmtjdHhfdHhfcClcXG4re1xcbitcXHRzdHJ1Y3QgYm54dF90bHNfaW5mbyAqa3RscyA9IGJwLVxcdTAwM2VrdGxzX2luZm87XFxuK1xcdHN0cnVjdCBibnh0X2t0bHNfb2ZmbG9hZF9jdHhfdHggKmtjdHhfdHg7XFxuK1xcdHN0cnVjdCB0bHNfY29udGV4dCAqdGxzX2N0eDtcXG4rXFx0dTMyIHNlcSwgcGF5bG9hZF9sZW47XFxuK1xcdGludCByYztcXG4rXFxuK1xcdGlmICghSVNfRU5BQkxFRChDT05GSUdfVExTX0RFVklDRSkgfHwgIWt0bHMgfHxcXG4rXFx0ICAgICF0bHNfaXNfc2tiX3R4X2RldmljZV9vZmZsb2FkZWQoc2tiKSlcXG4rXFx0XFx0cmV0dXJuIHNrYjtcXG4rXFxuK1xcdHNlcSA9IG50b2hsKHRjcF9oZHIoc2tiKS1cXHUwMDNlc2VxKTtcXG4rXFx0dGxzX2N0eCA9IHRsc19nZXRfY3R4KHNrYi1cXHUwMDNlc2spO1xcbitcXHRrY3R4X3R4ID0gYm54dF9nZXRfa3Rsc19jdHhfdHgodGxzX2N0eCk7XFxuK1xcdHBheWxvYWRfbGVuID0gc2tiLVxcdTAwM2VsZW4gLSBza2JfdGNwX2FsbF9oZWFkZXJzKHNrYik7XFxuK1xcdGlmICghcGF5bG9hZF9sZW4pXFxuK1xcdFxcdHJldHVybiBza2I7XFxuK1xcdGlmIChrY3R4X3R4LVxcdTAwM2V0Y3Bfc2VxX25vID09IHNlcSkge1xcbitcXHRcXHQvKiBTdGFnZSB0aGUgYWR2YW5jZSBvbmx5LiAgdGNwX3NlcV9ubyBhbmQgdGhlIGNvdW50ZXJzIGFyZVxcbitcXHRcXHQgKiBjb21taXR0ZWQgYnkgYm54dF9rdGxzX3htaXRfY29tbWl0KCkgb25jZSB0aGUgQkQgcmVhY2hlcyB0aGVcXG4rXFx0XFx0ICogcmluZy5cXG4rXFx0XFx0ICovXFxuK1xcdFxcdGtjdHhfdHgtXFx1MDAzZW5leHRfdGNwX3NlcV9ubyA9IHNlcSArIHBheWxvYWRfbGVuO1xcbitcXHRcXHRrY3R4X3R4LVxcdTAwM2VwZW5kaW5nX2J5dGVzID0gcGF5bG9hZF9sZW47XFxuK1xcdFxcdGtjdHhfdHgtXFx1MDAzZXBlbmRpbmdfb29vID0gZmFsc2U7XFxuK1xcdFxcdGtjdHhfdHgtXFx1MDAzZXBlbmRpbmdfZndkID0gdHJ1ZTtcXG4rXFx0XFx0KmtpZCA9IEJOWFRfS0lEX0hXKGtjdHhfdHgtXFx1MDAzZWtpZCk7XFxuK1xcdFxcdCprY3R4X3R4X3AgPSBrY3R4X3R4O1xcbitcXHRcXHQqbGZsYWdzIHw9IGNwdV90b19sZTMyKFRYX0JEX0ZMQUdTX0NSWVBUT19FTiB8XFxuK1xcdFxcdFxcdFxcdCAgICAgICBCTlhUX1RYX0tJRF9MTygqa2lkKSk7XFxuK1xcdH0gZWxzZSB7XFxuK1xcdFxcdGtjdHhfdHgtXFx1MDAzZXBlbmRpbmdfZndkID0gZmFsc2U7XFxuK1xcdFxcdHJjID0gYm54dF9rdGxzX3R4X29vbyhicCwgdHhyLCBza2IsIHBheWxvYWRfbGVuLCBzZXEsIHRsc19jdHgpO1xcbitcXHRcXHRpZiAocmMpXFxuK1xcdFxcdFxcdHJldHVybiB0bHNfZW5jcnlwdF9za2Ioc2tiKTtcXG4rXFxuK1xcdFxcdGtjdHhfdHgtXFx1MDAzZXBlbmRpbmdfYnl0ZXMgPSBwYXlsb2FkX2xlbjtcXG4rXFx0XFx0a2N0eF90eC1cXHUwMDNlcGVuZGluZ19vb28gPSB0cnVlO1xcbitcXHRcXHQqa2lkID0gQk5YVF9LSURfSFcoa2N0eF90eC1cXHUwMDNla2lkKTtcXG4rXFx0XFx0KmtjdHhfdHhfcCA9IGtjdHhfdHg7XFxuK1xcdFxcdCpsZmxhZ3MgfD0gY3B1X3RvX2xlMzIoVFhfQkRfRkxBR1NfQ1JZUFRPX0VOIHxcXG4rXFx0XFx0XFx0XFx0ICAgICAgIEJOWFRfVFhfS0lEX0xPKCpraWQpKTtcXG4rXFx0XFx0cmV0dXJuIHNrYjtcXG4rXFx0fVxcbitcXHRyZXR1cm4gc2tiO1xcbit9XFxuK1xcbit2b2lkIGJueHRfa3Rsc194bWl0X2NvbW1pdChzdHJ1Y3QgYm54dF90eF9yaW5nX2luZm8gKnR4cixcXG4rXFx0XFx0XFx0ICAgc3RydWN0IGJueHRfa3Rsc19vZmZsb2FkX2N0eF90eCAqa2N0eF90eClcXG4re1xcbitcXHRpZiAoIWtjdHhfdHgpXFxuK1xcdFxcdHJldHVybjtcXG4rXFx0aWYgKGtjdHhfdHgtXFx1MDAzZXBlbmRpbmdfZndkKVxcbitcXHRcXHRrY3R4X3R4LVxcdTAwM2V0Y3Bfc2VxX25vID0ga2N0eF90eC1cXHUwMDNlbmV4dF90Y3Bfc2VxX25vO1xcbitcXHRibnh0X2t0bHNfaW5jX3R4X3N0YXRzKHR4ciwga2N0eF90eC1cXHUwMDNlcGVuZGluZ19ieXRlcyxcXG4rXFx0XFx0XFx0ICAgICAgIGtjdHhfdHgtXFx1MDAzZXBlbmRpbmdfb29vKTtcXG4rXFx0a2N0eF90eC1cXHUwMDNlcGVuZGluZ19ieXRlcyA9IDA7XFxuK1xcdGtjdHhfdHgtXFx1MDAzZXBlbmRpbmdfZndkID0gZmFsc2U7XFxuK1xcdGtjdHhfdHgtXFx1MDAzZXBlbmRpbmdfb29vID0gZmFsc2U7XFxuK31cXG4rXFxuK2ludCBibnh0X2t0bHNfYWxsb2NfdHhfcmluZ19zdGF0cyhzdHJ1Y3QgYm54dCAqYnAsIHN0cnVjdCBibnh0X3R4X3JpbmdfaW5mbyAqdHhyKVxcbit7XFxuK1xcdHN0cnVjdCBibnh0X3Rsc19zd19zdGF0cyAqcmluZ19zdGF0cztcXG4rXFxuK1xcdGlmICghYnAtXFx1MDAzZWt0bHNfaW5mbylcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcdHJpbmdfc3RhdHMgPSBremFsbG9jX29iaigqcmluZ19zdGF0cyk7XFxuK1xcdGlmICghcmluZ19zdGF0cylcXG4rXFx0XFx0cmV0dXJuIC1FTk9NRU07XFxuK1xcdHR4ci1cXHUwMDNldGxzX3N0YXRzID0gcmluZ19zdGF0cztcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuK3ZvaWQgYm54dF9rdGxzX2ZyZWVfdHhfcmluZ19zdGF0cyhzdHJ1Y3QgYm54dF90eF9yaW5nX2luZm8gKnR4cilcXG4re1xcbitcXHRrZnJlZSh0eHItXFx1MDAzZXRsc19zdGF0cyk7XFxuK1xcdHR4ci1cXHUwMDNldGxzX3N0YXRzID0gTlVMTDtcXG4rfVxcbitcXG4rdm9pZCBibnh0X2dldF9yaW5nX3Rsc19zdGF0cyhzdHJ1Y3QgYm54dCAqYnAsIHN0cnVjdCBibnh0X3Rsc19zd19zdGF0cyAqc3RhdHMpXFxuK3tcXG4rXFx0c3RydWN0IGJueHRfdGxzX3N3X3N0YXRzICpyaW5nX3N0YXRzO1xcbitcXHRpbnQgaSwgajtcXG4rXFxuK1xcdGlmICghYnAtXFx1MDAzZWt0bHNfaW5mbyB8fCAhYnAtXFx1MDAzZXR4X3JpbmcpXFxuK1xcdFxcdHJldHVybjtcXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIGJwLVxcdTAwM2V0eF9ucl9yaW5nczsgaSsrKSB7XFxuK1xcdFxcdHJpbmdfc3RhdHMgPSBicC1cXHUwMDNldHhfcmluZ1tpXS50bHNfc3RhdHM7XFxuK1xcdFxcdGlmICghcmluZ19zdGF0cylcXG4rXFx0XFx0XFx0Y29udGludWU7XFxuK1xcdFxcdGZvciAoaiA9IDA7IGogXFx1MDAzYyBCTlhUX0tUTFNfTUFYX0RBVEFfQ09VTlRFUlM7IGorKylcXG4rXFx0XFx0XFx0c3RhdHMtXFx1MDAzZWNvdW50ZXJzW2pdICs9IHJpbmdfc3RhdHMtXFx1MDAzZWNvdW50ZXJzW2pdO1xcbitcXHR9XFxuK31cXG5kaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9ibnh0X2t0bHMuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dF9rdGxzLmhcXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxcbmluZGV4IDAwMDAwMDAwMDAwMDAwLi4zZWM1NmI4ZjA4ZDQ5Ylxcbi0tLSAvZGV2L251bGxcXG4rKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibnh0L2JueHRfa3Rscy5oXFxuQEAgLTAsMCArMSwxNzQgQEBcXG4rLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seSAqL1xcbisvKiBDb3B5cmlnaHQgKGMpIDIwMjYgQnJvYWRjb20gSW5jLiAqL1xcbitcXG4rI2lmbmRlZiBCTlhUX0tUTFNfSFxcbisjZGVmaW5lIEJOWFRfS1RMU19IXFxuK1xcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvd2FpdC5oXFx1MDAzZVxcbitcXG4rLyogQ29udHJvbCBwbGFuZSBjb3VudGVycyAqL1xcbitlbnVtIGJueHRfa3Rsc19jdHJsX2NvdW50ZXJzIHtcXG4rXFx0Qk5YVF9LVExTX1RYX0FERCA9IDAsXFxuK1xcdEJOWFRfS1RMU19UWF9ERUwsXFxuK1xcbitcXHQvKiBFcnJvciBjb3VudGVycyBmb3IgZGVidWdnaW5nICovXFxuK1xcdEJOWFRfS1RMU19FUlJfTk9fTUVNLFxcdFxcdFxcdC8qIE1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUgKi9cXG4rXFx0Qk5YVF9LVExTX0VSUl9OT19DQVAsXFx0XFx0XFx0LyogQ2FwYWJpbGl0eSBsb3N0IGFmdGVyIEZXIHJlc2V0ICovXFxuK1xcdEJOWFRfS1RMU19FUlJfS0VZX0NUWF9BTExPQyxcXHRcXHQvKiBLZXkgY29udGV4dCBhbGxvYyBmYWlsdXJlICovXFxuK1xcdEJOWFRfS1RMU19FUlJfQ1JZUFRPX0NNRCxcXHRcXHQvKiBDcnlwdG8gY29tbWFuZCBmYWlsdXJlICovXFxuK1xcdEJOWFRfS1RMU19FUlJfREVWSUNFX0JVU1ksXFx0XFx0LyogRGV2aWNlIG5vdCByZWFkeSAqL1xcbitcXHRCTlhUX0tUTFNfRVJSX0lOVkFMSURfQ0lQSEVSLFxcdFxcdC8qIFVuc3VwcG9ydGVkIGNpcGhlciAqL1xcbitcXHRCTlhUX0tUTFNfRVJSX1NUQVRFX05PVF9PUEVOLFxcdFxcdC8qIERldmljZSBub3Qgb3BlbiAqL1xcbitcXHRCTlhUX0tUTFNfRVJSX1JFVFJZX0VYQ0VFREVELFxcdFxcdC8qIFJldHJ5IGxpbWl0IGV4Y2VlZGVkICovXFxuK1xcbitcXHRCTlhUX0tUTFNfTUFYX0NUUkxfQ09VTlRFUlMsXFxuK307XFxuK1xcbitzdHJ1Y3QgYm54dF90bHNfaW5mbyB7XFxuK1xcdGF0b21pY190XFx0XFx0cGVuZGluZztcXG4rXFxuK1xcdC8qIFdva2VuIGZyb20gX19ibnh0X29wZW5fbmljKCkvX19ibnh0X2Nsb3NlX25pYygpIHdoZW5cXG4rXFx0ICogQk5YVF9TVEFURV9PUEVOIGNoYW5nZXMsIHNvIGEga1RMUyBkZWxldGUgY2FuIHdhaXQgb3V0IGEgcmluZ1xcbitcXHQgKiByZWNvbmZpZ3VyYXRpb24gaW5zdGVhZCBvZiBwb2xsaW5nIHRoZSBzdGF0ZSBiaXQuXFxuK1xcdCAqL1xcbitcXHR3YWl0X3F1ZXVlX2hlYWRfdFxcdG9wZW5fd3E7XFxuK1xcbitcXHQvKiBBdG9taWMgY291bnRlcnMgZm9yIGNvbnRyb2wgcGF0aCAqL1xcbitcXHRhdG9taWM2NF90XFx0XFx0KmNvdW50ZXJzO1xcbit9O1xcbitcXG4rc3RydWN0IGJueHRfa3Rsc19vZmZsb2FkX2N0eF90eCB7XFxuK1xcdHUzMlxcdFxcdHRjcF9zZXFfbm87XFx0LyogdGNwIHNlcSBubyBpbiBzeW5jIHdpdGggSFcgKi9cXG4rXFx0dTMyXFx0XFx0bmV4dF90Y3Bfc2VxX25vOy8qIHN0YWdlZCB0Y3Agc2VxIG5vICovXFxuK1xcdHUzMlxcdFxcdGtpZDtcXG4rXFx0dTMyXFx0XFx0cGVuZGluZ19ieXRlcztcXHQvKiBzdGFnZWQgcGF5bG9hZCBieXRlcyAqL1xcbitcXHRib29sXFx0XFx0cGVuZGluZ19md2Q7XFxuK1xcdGJvb2xcXHRcXHRwZW5kaW5nX29vbztcXG4rfTtcXG4rXFxuK3N0cnVjdCBibnh0X2t0bHNfdHhfZHJpdmVyX3N0YXRlIHtcXG4rXFx0c3RydWN0IGJueHRfa3Rsc19vZmZsb2FkX2N0eF90eCAqY3R4X3R4O1xcbit9O1xcbitcXG4rc3RydWN0IGNlX2FkZF9jbWQge1xcbitcXHRfX2xlMzJcXHR2ZXJfYWxnb19raWRfb3Bjb2RlO1xcbitcXHQjZGVmaW5lIENFX0FERF9DTURfT1BDT0RFX01BU0tcXHRcXHRcXHQweGZVTFxcbitcXHQjZGVmaW5lIENFX0FERF9DTURfT1BDT0RFX1NGVFxcdFxcdFxcdDBcXG4rXFx0I2RlZmluZSBDRV9BRERfQ01EX09QQ09ERV9BRERcXHRcXHRcXHQgMHgxVUxcXG4rXFx0I2RlZmluZSBDRV9BRERfQ01EX0tJRF9NQVNLXFx0XFx0XFx0MHhmZmZmZjBVTFxcbitcXHQjZGVmaW5lIENFX0FERF9DTURfS0lEX1NGVFxcdFxcdFxcdDRcXG4rXFx0I2RlZmluZSBDRV9BRERfQ01EX0FMR09SSVRITV9NQVNLXFx0XFx0MHhmMDAwMDAwVUxcXG4rXFx0I2RlZmluZSBDRV9BRERfQ01EX0FMR09SSVRITV9TRlRcXHRcXHQyNFxcbitcXHQjZGVmaW5lIENFX0FERF9DTURfQUxHT1JJVEhNX0FFU19HQ01fMTI4XFx0IDB4MTAwMDAwMFVMXFxuK1xcdCNkZWZpbmUgQ0VfQUREX0NNRF9BTEdPUklUSE1fQUVTX0dDTV8yNTZcXHQgMHgyMDAwMDAwVUxcXG4rXFx0I2RlZmluZSBDRV9BRERfQ01EX1ZFUlNJT05fTUFTS1xcdFxcdFxcdDB4ZjAwMDAwMDBVTFxcbitcXHQjZGVmaW5lIENFX0FERF9DTURfVkVSU0lPTl9TRlRcXHRcXHRcXHQyOFxcbitcXHQjZGVmaW5lIENFX0FERF9DTURfVkVSU0lPTl9UTFMxXzJcXHRcXHQgKDB4MFVMIFxcdTAwM2NcXHUwMDNjIDI4KVxcbitcXHQjZGVmaW5lIENFX0FERF9DTURfVkVSU0lPTl9UTFMxXzNcXHRcXHQgKDB4MVVMIFxcdTAwM2NcXHUwMDNjIDI4KVxcbitcXHR1OFxcdGN0eF9raW5kO1xcbitcXHQjZGVmaW5lIENFX0FERF9DTURfQ1RYX0tJTkRfTUFTS1xcdFxcdDB4MWZVTFxcbitcXHQjZGVmaW5lIENFX0FERF9DTURfQ1RYX0tJTkRfU0ZUXFx0XFx0XFx0MFxcbitcXHQjZGVmaW5lIENFX0FERF9DTURfQ1RYX0tJTkRfQ0tfVFhcXHRcXHQgMHgxMVVMXFxuK1xcdCNkZWZpbmUgQ0VfQUREX0NNRF9DVFhfS0lORF9DS19SWFxcdFxcdCAweDEyVUxcXG4rXFx0dThcXHR1bnVzZWQwWzNdO1xcbitcXHR1OFxcdHNhbHRbNF07XFxuK1xcdHU4XFx0dW51c2VkMVs0XTtcXG4rXFx0X19sZTMyXFx0cGt0X3RjcF9zZXFfbnVtO1xcbitcXHRfX2xlMzJcXHR0bHNfaGVhZGVyX3RjcF9zZXFfbnVtO1xcbitcXHR1OFxcdHJlY29yZF9zZXFfbnVtWzhdO1xcbitcXHR1OFxcdHNlc3Npb25fa2V5WzMyXTtcXG4rXFx0dThcXHRhZGRsX2l2WzhdO1xcbit9O1xcbitcXG4rc3RydWN0IGNyeXB0b19wcmVmaXhfY21kIHtcXG4rXFx0X19sZTMyXFx0ZmxhZ3M7XFxuK1xcdCNkZWZpbmUgQ1JZUFRPX1BSRUZJWF9DTURfRkxBR1NfVVBEQVRFX0lOX09SREVSX1ZBUlxcdDB4MVVMXFxuK1xcdCNkZWZpbmUgQ1JZUFRPX1BSRUZJWF9DTURfRkxBR1NfRlVMTF9SRVBMQVlfUkVUUkFOXFx0MHgyVUxcXG4rXFx0X19sZTMyXFx0aGVhZGVyX3RjcF9zZXFfbnVtO1xcbitcXHRfX2xlMzJcXHRzdGFydF90Y3Bfc2VxX251bTtcXG4rXFx0X19sZTMyXFx0ZW5kX3RjcF9zZXFfbnVtO1xcbitcXHR1OFxcdGV4cGxpY2l0X25vbmNlWzhdO1xcbitcXHR1OFxcdHJlY29yZF9zZXFfbnVtWzhdO1xcbit9O1xcbitcXG4rI2RlZmluZSBDUllQVE9fUFJFRklYX0NNRF9GTEFHU19VUERBVEVfSU5fT1JERVJfVkFSX0xFXFx0XFxcXFxcbitcXHRjcHVfdG9fbGUzMihDUllQVE9fUFJFRklYX0NNRF9GTEFHU19VUERBVEVfSU5fT1JERVJfVkFSKVxcbitcXG4rI2RlZmluZSBDUllQVE9fUFJFRklYX0NNRF9TSVpFXFx0KCh1MzIpc2l6ZW9mKHN0cnVjdCBjcnlwdG9fcHJlZml4X2NtZCkpXFxuKyNkZWZpbmUgQ1JZUFRPX1BSRUZJWF9DTURfQkRTXFx0KENSWVBUT19QUkVGSVhfQ01EX1NJWkUgLyBzaXplb2Yoc3RydWN0IHR4X2JkKSlcXG4rI2RlZmluZSBDUllQVE9fUFJFU1lOQ19CRFNcXHQoQ1JZUFRPX1BSRUZJWF9DTURfQkRTICsgMSlcXG4rXFxuKyNkZWZpbmUgQ1JZUFRPX1BSRVNZTkNfQkRfQ01EXFx0XFx0XFx0XFx0XFx0XFx0XFxcXFxcbitcXHQoY3B1X3RvX2xlMzIoKENSWVBUT19QUkVGSVhfQ01EX1NJWkUgXFx1MDAzY1xcdTAwM2MgVFhfQkRfTEVOX1NISUZUKSB8XFx0XFxcXFxcbitcXHRcXHQgICAgIFRYX0JEX0NOVChDUllQVE9fUFJFU1lOQ19CRFMpIHwgVFhfQkRfVFlQRV9QUkVTWU5DX1RYX0JEKSlcXG4rXFxuK3N0YXRpYyBpbmxpbmUgYm9vbCBibnh0X2t0bHNfYnVzeShzdHJ1Y3QgYm54dCAqYnApXFxuK3tcXG4rXFx0cmV0dXJuIGJwLVxcdTAwM2VrdGxzX2luZm8gXFx1MDAyNlxcdTAwMjYgYXRvbWljX3JlYWQoXFx1MDAyNmJwLVxcdTAwM2VrdGxzX2luZm8tXFx1MDAzZXBlbmRpbmcpIFxcdTAwM2UgMDtcXG4rfVxcbitcXG4rLyogV2FrZSBhbnkga1RMUyBjb250cm9sIG9wIHdhaXRpbmcgZm9yIGEgQk5YVF9TVEFURV9PUEVOIHRyYW5zaXRpb24uICovXFxuK3N0YXRpYyBpbmxpbmUgdm9pZCBibnh0X2t0bHNfd2FrZShzdHJ1Y3QgYm54dCAqYnApXFxuK3tcXG4rXFx0aWYgKGJwLVxcdTAwM2VrdGxzX2luZm8pXFxuK1xcdFxcdHdha2VfdXBfYWxsKFxcdTAwMjZicC1cXHUwMDNla3Rsc19pbmZvLVxcdTAwM2VvcGVuX3dxKTtcXG4rfVxcbitcXG4rI2lmZGVmIENPTkZJR19CTlhUX1RMU1xcbitpbnQgYm54dF9hbGxvY19rdGxzX2luZm8oc3RydWN0IGJueHQgKmJwKTtcXG4rdm9pZCBibnh0X2ZyZWVfa3Rsc19pbmZvKHN0cnVjdCBibnh0ICpicCk7XFxuK2ludCBibnh0X2t0bHNfaW5pdChzdHJ1Y3QgYm54dCAqYnApO1xcbitzdHJ1Y3Qgc2tfYnVmZiAqYm54dF9rdGxzX3htaXQoc3RydWN0IGJueHQgKmJwLCBzdHJ1Y3QgYm54dF90eF9yaW5nX2luZm8gKnR4cixcXG4rXFx0XFx0XFx0ICAgICAgIHN0cnVjdCBza19idWZmICpza2IsIF9fbGUzMiAqbGZsYWdzLCB1MzIgKmtpZCxcXG4rXFx0XFx0XFx0ICAgICAgIHN0cnVjdCBibnh0X2t0bHNfb2ZmbG9hZF9jdHhfdHggKiprY3R4X3R4X3ApO1xcbit2b2lkIGJueHRfa3Rsc194bWl0X2NvbW1pdChzdHJ1Y3QgYm54dF90eF9yaW5nX2luZm8gKnR4cixcXG4rXFx0XFx0XFx0ICAgc3RydWN0IGJueHRfa3Rsc19vZmZsb2FkX2N0eF90eCAqa2N0eF90eCk7XFxuK2ludCBibnh0X2t0bHNfYWxsb2NfdHhfcmluZ19zdGF0cyhzdHJ1Y3QgYm54dCAqYnAsXFxuK1xcdFxcdFxcdFxcdCAgc3RydWN0IGJueHRfdHhfcmluZ19pbmZvICp0eHIpO1xcbit2b2lkIGJueHRfa3Rsc19mcmVlX3R4X3Jpbmdfc3RhdHMoc3RydWN0IGJueHRfdHhfcmluZ19pbmZvICp0eHIpO1xcbit2b2lkIGJueHRfZ2V0X3JpbmdfdGxzX3N0YXRzKHN0cnVjdCBibnh0ICpicCwgc3RydWN0IGJueHRfdGxzX3N3X3N0YXRzICpzdGF0cyk7XFxuKyNlbHNlXFxuK3N0YXRpYyBpbmxpbmUgaW50IGJueHRfYWxsb2Nfa3Rsc19pbmZvKHN0cnVjdCBibnh0ICpicClcXG4re1xcbitcXHRyZXR1cm4gLUVPUE5PVFNVUFA7XFxuK31cXG4rXFxuK3N0YXRpYyBpbmxpbmUgdm9pZCBibnh0X2ZyZWVfa3Rsc19pbmZvKHN0cnVjdCBibnh0ICpicClcXG4re1xcbit9XFxuK1xcbitzdGF0aWMgaW5saW5lIGludCBibnh0X2t0bHNfaW5pdChzdHJ1Y3QgYm54dCAqYnApXFxuK3tcXG4rXFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xcbit9XFxuK1xcbitzdGF0aWMgaW5saW5lIHN0cnVjdCBza19idWZmICpcXG4rYm54dF9rdGxzX3htaXQoc3RydWN0IGJueHQgKmJwLCBzdHJ1Y3QgYm54dF90eF9yaW5nX2luZm8gKnR4cixcXG4rXFx0ICAgICAgIHN0cnVjdCBza19idWZmICpza2IsIF9fbGUzMiAqbGZsYWdzLCB1MzIgKmtpZCxcXG4rXFx0ICAgICAgIHN0cnVjdCBibnh0X2t0bHNfb2ZmbG9hZF9jdHhfdHggKiprY3R4X3R4X3ApXFxuK3tcXG4rXFx0cmV0dXJuIHNrYjtcXG4rfVxcbitcXG4rc3RhdGljIGlubGluZSB2b2lkXFxuK2JueHRfa3Rsc194bWl0X2NvbW1pdChzdHJ1Y3QgYm54dF90eF9yaW5nX2luZm8gKnR4cixcXG4rXFx0XFx0ICAgICAgc3RydWN0IGJueHRfa3Rsc19vZmZsb2FkX2N0eF90eCAqa2N0eF90eClcXG4re1xcbit9XFxuK1xcbitzdGF0aWMgaW5saW5lIGludCBibnh0X2t0bHNfYWxsb2NfdHhfcmluZ19zdGF0cyhzdHJ1Y3QgYm54dCAqYnAsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdHN0cnVjdCBibnh0X3R4X3JpbmdfaW5mbyAqdHhyKVxcbit7XFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitzdGF0aWMgaW5saW5lIHZvaWQgYm54dF9rdGxzX2ZyZWVfdHhfcmluZ19zdGF0cyhzdHJ1Y3QgYm54dF90eF9yaW5nX2luZm8gKnR4cilcXG4re1xcbit9XFxuK1xcbitzdGF0aWMgaW5saW5lIHZvaWQgYm54dF9nZXRfcmluZ190bHNfc3RhdHMoc3RydWN0IGJueHQgKmJwLFxcbitcXHRcXHRcXHRcXHRcXHQgICBzdHJ1Y3QgYm54dF90bHNfc3dfc3RhdHMgKnN0YXRzKVxcbit7XFxuK31cXG4rI2VuZGlmXFx0LyogQ09ORklHX0JOWFRfVExTICovXFxuKyNlbmRpZlxcdC8qIEJOWFRfS1RMU19IICovXFxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dF9tcGMuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dF9tcGMuY1xcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggMDAwMDAwMDAwMDAwMDAuLjcxZWJlYjZmZjMzYTE1XFxuLS0tIC9kZXYvbnVsbFxcbisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dF9tcGMuY1xcbkBAIC0wLDAgKzEsNzgzIEBAXFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcXG4rLyogQ29weXJpZ2h0IChjKSAyMDI2IEJyb2FkY29tIEluYy4gKi9cXG4rXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9zdGRkZWYuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3R5cGVzLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9rZXJuZWwuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3NsYWIuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2JueHQvaHNpLmhcXHUwMDNlXFxuK1xcbisjaW5jbHVkZSBcXFwiYm54dC5oXFxcIlxcbisjaW5jbHVkZSBcXFwiYm54dF9tcGMuaFxcXCJcXG4rI2luY2x1ZGUgXFxcImJueHRfY3J5cHRvLmhcXFwiXFxuK1xcbit2b2lkIGJueHRfYWxsb2NfbXBjX2luZm8oc3RydWN0IGJueHQgKmJwLCB1OCBtcGNfY2hubHNfY2FwKVxcbit7XFxuK1xcdGlmICghKGJwLVxcdTAwM2VmbGFncyBcXHUwMDI2IEJOWFRfRkxBR19DSElQX1A1X1BMVVMpKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcbitcXHRpZiAoIWJwLVxcdTAwM2VtcGNfaW5mbylcXG4rXFx0XFx0YnAtXFx1MDAzZW1wY19pbmZvID0ga3phbGxvY19vYmooKmJwLVxcdTAwM2VtcGNfaW5mbyk7XFxuK1xcdGlmIChicC1cXHUwMDNlbXBjX2luZm8pXFxuK1xcdFxcdGJwLVxcdTAwM2VtcGNfaW5mby1cXHUwMDNlbXBjX2NobmxzX2NhcCA9IG1wY19jaG5sc19jYXA7XFxuK1xcdGVsc2VcXG4rXFx0XFx0bmV0ZGV2X3dhcm4oYnAtXFx1MDAzZWRldiwgXFxcIlVuYWJsZSB0byBhbGxvY2F0ZSBNUEMgaW5mb1xcXFxuXFxcIik7XFxuK31cXG4rXFxuK3ZvaWQgYm54dF9mcmVlX21wY19pbmZvKHN0cnVjdCBibnh0ICpicClcXG4re1xcbitcXHRibnh0X2ZyZWVfbXBjX3JpbmdzKGJwKTtcXG4rXFx0Ym54dF9mcmVlX21wY3MoYnApO1xcbitcXHRrZnJlZShicC1cXHUwMDNlbXBjX2luZm8pO1xcbitcXHRicC1cXHUwMDNlbXBjX2luZm8gPSBOVUxMO1xcbit9XFxuK1xcbitpbnQgYm54dF9tcGNfdHhfcmluZ3NfaW5fdXNlKHN0cnVjdCBibnh0ICpicClcXG4re1xcbitcXHRzdHJ1Y3QgYm54dF9tcGNfaW5mbyAqbXBjID0gYnAtXFx1MDAzZW1wY19pbmZvO1xcbitcXHRpbnQgaSwgbXBjX3R4ID0gMDtcXG4rXFxuK1xcdGlmICghbXBjKVxcbitcXHRcXHRyZXR1cm4gMDtcXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIEJOWFRfTVBDX1RZUEVfTUFYOyBpKyspXFxuK1xcdFxcdG1wY190eCArPSBtcGMtXFx1MDAzZW1wY19yaW5nX2NvdW50W2ldO1xcbitcXHRyZXR1cm4gbXBjX3R4O1xcbit9XFxuK1xcbitpbnQgYm54dF9tcGNfY3BfcmluZ3NfaW5fdXNlKHN0cnVjdCBibnh0ICpicClcXG4re1xcbitcXHRzdHJ1Y3QgYm54dF9tcGNfaW5mbyAqbXBjID0gYnAtXFx1MDAzZW1wY19pbmZvO1xcbitcXG4rXFx0aWYgKCFtcGMpXFxuK1xcdFxcdHJldHVybiAwO1xcbitcXHRyZXR1cm4gbXBjLVxcdTAwM2VtcGNfY3BfcmluZ3M7XFxuK31cXG4rXFxuK2Jvb2wgYm54dF9uYXBpX2hhc19tcGMoc3RydWN0IGJueHQgKmJwLCBpbnQgaSlcXG4re1xcbitcXHRzdHJ1Y3QgYm54dF9tcGNfaW5mbyAqbXBjID0gYnAtXFx1MDAzZW1wY19pbmZvO1xcbitcXHRzdHJ1Y3QgYm54dF9uYXBpICpibmFwaSA9IGJwLVxcdTAwM2VibmFwaVtpXTtcXG4rXFx0c3RydWN0IGJueHRfdHhfcmluZ19pbmZvICp0eHI7XFxuK1xcbitcXHRpZiAoIW1wYylcXG4rXFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXG4rXFx0dHhyID0gYm5hcGktXFx1MDAzZXR4X3JpbmdbMF07XFxuK1xcdGlmICh0eHIgXFx1MDAyNlxcdTAwMjYgIShibmFwaS1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBCTlhUX05BUElfRkxBR19YRFApKVxcbitcXHRcXHRyZXR1cm4gdHhyLVxcdTAwM2V0eHFfaW5kZXggXFx1MDAzYyBtcGMtXFx1MDAzZW1wY19jcF9yaW5ncztcXG4rXFx0cmV0dXJuIGZhbHNlO1xcbit9XFxuK1xcbit2b2lkIGJueHRfc2V0X21wY19jcF9yaW5nKHN0cnVjdCBibnh0ICpicCwgaW50IGJuYXBpX2lkeCxcXG4rXFx0XFx0XFx0ICBzdHJ1Y3QgYm54dF9jcF9yaW5nX2luZm8gKmNwcilcXG4re1xcbitcXHRzdHJ1Y3QgYm54dF9tcGNfaW5mbyAqbXBjID0gYnAtXFx1MDAzZW1wY19pbmZvO1xcbitcXHRzdHJ1Y3QgYm54dF9uYXBpICpibmFwaTtcXG4rXFx0Ym9vbCBmb3VuZCA9IGZhbHNlO1xcbitcXHRpbnQgaSwgajtcXG4rXFxuK1xcdGlmICghbXBjKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcdGJuYXBpID0gYnAtXFx1MDAzZWJuYXBpW2JuYXBpX2lkeF07XFxuK1xcdC8qIENoZWNrIGJvdGggVENFIGFuZCBSQ0UgTVBDcyBmb3IgdGhlIG1hdGNoaW5nIE5BUEkgKi9cXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIEJOWFRfTVBDX1RZUEVfTUFYOyBpKyspIHtcXG4rXFx0XFx0aW50IG51bSA9IG1wYy1cXHUwMDNlbXBjX3JpbmdfY291bnRbaV07XFxuK1xcbitcXHRcXHRmb3IgKGogPSAwOyBqIFxcdTAwM2MgbnVtOyBqKyspIHtcXG4rXFx0XFx0XFx0c3RydWN0IGJueHRfdHhfcmluZ19pbmZvICp0eHIgPSBcXHUwMDI2bXBjLVxcdTAwM2VtcGNfcmluZ3NbaV1bal07XFxuK1xcbitcXHRcXHRcXHQvKiBPbmx5IDEgcmluZyB3aXRoIGluZGV4IGogd2lsbCB1c2UgdGhpcyBOQVBJICovXFxuK1xcdFxcdFxcdGlmICh0eHItXFx1MDAzZWJuYXBpID09IGJuYXBpKSB7XFxuK1xcdFxcdFxcdFxcdHR4ci1cXHUwMDNldHhfY3ByID0gY3ByO1xcbitcXHRcXHRcXHRcXHR0eHItXFx1MDAzZXR4X25hcGlfaWR4ID0gaTtcXG4rXFx0XFx0XFx0XFx0Ym5hcGktXFx1MDAzZXR4X21wY19yaW5nW2ldID0gdHhyO1xcbitcXHRcXHRcXHRcXHRmb3VuZCA9IHRydWU7XFxuK1xcdFxcdFxcdFxcdGJyZWFrO1xcbitcXHRcXHRcXHR9XFxuK1xcdFxcdH1cXG4rXFx0fVxcbitcXHRpZiAoIWZvdW5kKVxcbitcXHRcXHRuZXRkZXZfd2Fybl9vbmNlKGJwLVxcdTAwM2VkZXYsIFxcXCJObyBNUEMgbWF0Y2ggZm9yIG5hcGkgaW5kZXggJWRcXFxcblxcXCIsXFxuK1xcdFxcdFxcdFxcdCBibmFwaV9pZHgpO1xcbitcXHRjcHItXFx1MDAzZWNwX3JpbmdfdHlwZSA9IEJOWFRfTlFfSERMX1RZUEVfTVA7XFxuK31cXG4rXFxuK3ZvaWQgYm54dF90cmltX21wY19yaW5ncyhzdHJ1Y3QgYm54dCAqYnApXFxuK3tcXG4rXFx0c3RydWN0IGJueHRfbXBjX2luZm8gKm1wYyA9IGJwLVxcdTAwM2VtcGNfaW5mbztcXG4rXFx0aW50IG1heCA9IGJwLVxcdTAwM2V0eF9ucl9yaW5nc19wZXJfdGM7XFxuK1xcdHU4IG1heF9jcCA9IDA7XFxuK1xcdGludCBpO1xcbitcXG4rXFx0aWYgKCFtcGMpXFxuK1xcdFxcdHJldHVybjtcXG4rXFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBCTlhUX01QQ19UWVBFX01BWDsgaSsrKSB7XFxuK1xcdFxcdG1wYy1cXHUwMDNlbXBjX3JpbmdfY291bnRbaV0gPSBtaW5fdChpbnQsIG1wYy1cXHUwMDNlbXBjX3JpbmdfY291bnRbaV0sXFxuK1xcdFxcdFxcdFxcdFxcdCAgICAgICBtYXgpO1xcbitcXHRcXHRtYXhfY3AgPSBtYXgobWF4X2NwLCBtcGMtXFx1MDAzZW1wY19yaW5nX2NvdW50W2ldKTtcXG4rXFx0fVxcbitcXHRtcGMtXFx1MDAzZW1wY19jcF9yaW5ncyA9IG1heF9jcDtcXG4rfVxcbitcXG4rdm9pZCBibnh0X2NhbGNfZGZsdF9tcGNfcmluZ3Moc3RydWN0IGJueHQgKmJwLCBpbnQgdHhfbnJfcmluZ3MsXFxuK1xcdFxcdFxcdCAgICAgIGludCB0eF9ucl9yaW5nc19wZXJfdGMsIGludCByeF9ucl9yaW5ncyxcXG4rXFx0XFx0XFx0ICAgICAgaW50ICptcGNfcGVyX3R5cGUsIGludCAqbXBjX2NwKVxcbit7XFxuK1xcdHN0cnVjdCBibnh0X2h3X3Jlc2MgKmh3X3Jlc2MgPSBcXHUwMDI2YnAtXFx1MDAzZWh3X3Jlc2M7XFxuK1xcdGludCBtcGNfdGNlLCBhdmFpbDtcXG4rXFxuK1xcdCptcGNfcGVyX3R5cGUgPSAwO1xcbitcXHQqbXBjX2NwID0gMDtcXG4rXFxuK1xcdGlmICghQk5YVF9NUENfQ1JZUFRPX0NBUEFCTEUoYnApKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcbitcXHRhdmFpbCA9IGh3X3Jlc2MtXFx1MDAzZW1heF90eF9yaW5ncyAtIHR4X25yX3JpbmdzO1xcbitcXHQvKiBkb24ndCB1c2UgbW9yZSB0aGFuIDgwJSAqL1xcbitcXHRhdmFpbCA9IGF2YWlsICogNCAvIDU7XFxuK1xcbitcXHRpZiAoYXZhaWwgXFx1MDAzYyAoQk5YVF9NSU5fTVBDX1RDRSArIEJOWFRfTUlOX01QQ19SQ0UpKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcbitcXHRtcGNfdGNlID0gbWluX3QoaW50LCBhdmFpbCAvIDIsIHR4X25yX3JpbmdzX3Blcl90Yyk7XFxuK1xcdG1wY190Y2UgPSBtaW5fdChpbnQsIG1wY190Y2UsIEJOWFRfREZMVF9NUENfVENFKTtcXG4rXFxuK1xcdGF2YWlsID0gaHdfcmVzYy1cXHUwMDNlbWF4X2NwX3JpbmdzIC0gdHhfbnJfcmluZ3MgLSByeF9ucl9yaW5ncztcXG4rXFxuK1xcdGlmIChhdmFpbCBcXHUwMDNjIEJOWFRfTUlOX01QQ19UQ0UgfHwgYXZhaWwgXFx1MDAzYyBCTlhUX01JTl9NUENfUkNFKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcbitcXHRtcGNfdGNlID0gbWluKG1wY190Y2UsIGF2YWlsKTtcXG4rXFxuK1xcdC8qIFRDRSBhbmQgUkNFIGFyZSBzaXplZCBlcXVhbGx5LCBzbyB0aGUgcGVyLXR5cGUgY291bnQgaXMgYWxzbyB0aGVcXG4rXFx0ICogTVBDIENQIHJpbmcgY291bnQgKG1heChtcGNfdGNlLCBtcGNfcmNlKSkuXFxuK1xcdCAqL1xcbitcXHQqbXBjX3Blcl90eXBlID0gbXBjX3RjZTtcXG4rXFx0Km1wY19jcCA9IG1wY190Y2U7XFxuK31cXG4rXFxuK3ZvaWQgYm54dF9zZXRfZGZsdF9tcGNfcmluZ3Moc3RydWN0IGJueHQgKmJwKVxcbit7XFxuK1xcdHN0cnVjdCBibnh0X21wY19pbmZvICptcGMgPSBicC1cXHUwMDNlbXBjX2luZm87XFxuK1xcdGludCBwZXJfdHlwZSwgbXBjX2NwLCBpO1xcbitcXG4rXFx0aWYgKCFCTlhUX01QQ19DUllQVE9fQ0FQQUJMRShicCkpXFxuK1xcdFxcdHJldHVybjtcXG4rXFxuK1xcdGJueHRfY2FsY19kZmx0X21wY19yaW5ncyhicCwgYnAtXFx1MDAzZXR4X25yX3JpbmdzLCBicC1cXHUwMDNldHhfbnJfcmluZ3NfcGVyX3RjLFxcbitcXHRcXHRcXHRcXHQgYnAtXFx1MDAzZXJ4X25yX3JpbmdzLCBcXHUwMDI2cGVyX3R5cGUsIFxcdTAwMjZtcGNfY3ApO1xcbitcXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIEJOWFRfTVBDX1RZUEVfTUFYOyBpKyspXFxuK1xcdFxcdG1wYy1cXHUwMDNlbXBjX3JpbmdfY291bnRbaV0gPSBwZXJfdHlwZTtcXG4rXFx0bXBjLVxcdTAwM2VtcGNfY3BfcmluZ3MgPSBtcGNfY3A7XFxuK31cXG4rXFxuK3ZvaWQgYm54dF9pbml0X21wY19yaW5nX3N0cnVjdChzdHJ1Y3QgYm54dCAqYnApXFxuK3tcXG4rXFx0c3RydWN0IGJueHRfbXBjX2luZm8gKm1wYyA9IGJwLVxcdTAwM2VtcGNfaW5mbztcXG4rXFx0aW50IGksIGo7XFxuK1xcbitcXHRpZiAoIUJOWFRfTVBDX0NSWVBUT19DQVBBQkxFKGJwKSlcXG4rXFx0XFx0cmV0dXJuO1xcbitcXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIEJOWFRfTVBDX1RZUEVfTUFYOyBpKyspIHtcXG4rXFx0XFx0aW50IG51bSA9IG1wYy1cXHUwMDNlbXBjX3JpbmdfY291bnRbaV07XFxuK1xcbitcXHRcXHRpZiAoIW1wYy1cXHUwMDNlbXBjX3JpbmdzW2ldKVxcbitcXHRcXHRcXHRjb250aW51ZTtcXG4rXFx0XFx0Zm9yIChqID0gMDsgaiBcXHUwMDNjIG51bTsgaisrKSB7XFxuK1xcdFxcdFxcdHN0cnVjdCBibnh0X3JpbmdfbWVtX2luZm8gKnJtZW07XFxuK1xcdFxcdFxcdHN0cnVjdCBibnh0X3Jpbmdfc3RydWN0ICpyaW5nO1xcbitcXHRcXHRcXHRzdHJ1Y3QgYm54dF90eF9yaW5nX2luZm8gKnR4cjtcXG4rXFxuK1xcdFxcdFxcdHR4ciA9IFxcdTAwMjZtcGMtXFx1MDAzZW1wY19yaW5nc1tpXVtqXTtcXG4rXFxuK1xcdFxcdFxcdHR4ci1cXHUwMDNldHhfcmluZ19zdHJ1Y3QucmluZ19tZW0uZmxhZ3MgPVxcbitcXHRcXHRcXHRcXHRCTlhUX1JNRU1fUklOR19QVEVfRkxBRztcXG4rXFx0XFx0XFx0dHhyLVxcdTAwM2VibmFwaSA9IGJwLVxcdTAwM2V0eF9yaW5nW2JwLVxcdTAwM2V0eF9yaW5nX21hcFtqXV0uYm5hcGk7XFxuK1xcdFxcdFxcdHR4ci1cXHUwMDNldHhxX2luZGV4ID0gajtcXG4rXFxuK1xcdFxcdFxcdHJpbmcgPSBcXHUwMDI2dHhyLVxcdTAwM2V0eF9yaW5nX3N0cnVjdDtcXG4rXFx0XFx0XFx0cm1lbSA9IFxcdTAwMjZyaW5nLVxcdTAwM2VyaW5nX21lbTtcXG4rXFx0XFx0XFx0cm1lbS1cXHUwMDNlbnJfcGFnZXMgPSBicC1cXHUwMDNldHhfbnJfcGFnZXM7XFxuK1xcdFxcdFxcdHJtZW0tXFx1MDAzZXBhZ2Vfc2l6ZSA9IEhXX1RYQkRfUklOR19TSVpFO1xcbitcXHRcXHRcXHRybWVtLVxcdTAwM2VwZ19hcnIgPSAodm9pZCAqKil0eHItXFx1MDAzZXR4X2Rlc2NfcmluZztcXG4rXFx0XFx0XFx0cm1lbS1cXHUwMDNlZG1hX2FyciA9IHR4ci1cXHUwMDNldHhfZGVzY19tYXBwaW5nO1xcbitcXHRcXHRcXHRybWVtLVxcdTAwM2V2bWVtX3NpemUgPSBTV19NUENfVFhCRF9SSU5HX1NJWkUgKlxcbitcXHRcXHRcXHRcXHRcXHQgIGJwLVxcdTAwM2V0eF9ucl9wYWdlcztcXG4rXFx0XFx0XFx0cm1lbS1cXHUwMDNldm1lbSA9ICh2b2lkICoqKVxcdTAwMjZ0eHItXFx1MDAzZXR4X21wY19idWZfcmluZztcXG4rXFx0XFx0fVxcbitcXHR9XFxuK31cXG4rXFxuK2ludCBibnh0X2FsbG9jX21wY3Moc3RydWN0IGJueHQgKmJwKVxcbit7XFxuK1xcdHN0cnVjdCBibnh0X21wY19pbmZvICptcGMgPSBicC1cXHUwMDNlbXBjX2luZm87XFxuK1xcdGludCBpLCByYyA9IDA7XFxuK1xcbitcXHRpZiAoIUJOWFRfTVBDX0NSWVBUT19DQVBBQkxFKGJwKSlcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgQk5YVF9NUENfVFlQRV9NQVg7IGkrKykge1xcbitcXHRcXHRpbnQgbnVtID0gbXBjLVxcdTAwM2VtcGNfcmluZ19jb3VudFtpXTtcXG4rXFx0XFx0c3RydWN0IGJueHRfdHhfcmluZ19pbmZvICp0eHI7XFxuK1xcbitcXHRcXHRpZiAoIW51bSlcXG4rXFx0XFx0XFx0Y29udGludWU7XFxuK1xcdFxcdHR4ciA9IGt6YWxsb2Nfb2JqcygqdHhyLCBudW0pO1xcbitcXHRcXHRpZiAoIXR4cikge1xcbitcXHRcXHRcXHRyYyA9IC1FTk9NRU07XFxuK1xcdFxcdFxcdGdvdG8gYWxsb2NfbXBjc19leGl0O1xcbitcXHRcXHR9XFxuK1xcdFxcdG1wYy1cXHUwMDNlbXBjX3JpbmdzW2ldID0gdHhyO1xcbitcXHR9XFxuK1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgYnAtXFx1MDAzZWNwX25yX3JpbmdzOyBpKyspIHtcXG4rXFx0XFx0c3RydWN0IGJueHRfbmFwaSAqYm5hcGkgPSBicC1cXHUwMDNlYm5hcGlbaV07XFxuK1xcbitcXHRcXHRpZiAoIWJueHRfbmFwaV9oYXNfbXBjKGJwLCBpKSlcXG4rXFx0XFx0XFx0Y29udGludWU7XFxuK1xcdFxcdGJuYXBpLVxcdTAwM2V0eF9tcGNfcmluZyA9IGt6YWxsb2Nfb2JqcygqYm5hcGktXFx1MDAzZXR4X21wY19yaW5nLFxcbitcXHRcXHRcXHRcXHRcXHRcXHQgIEJOWFRfTVBDX1RZUEVfTUFYKTtcXG4rXFx0XFx0aWYgKCFibmFwaS1cXHUwMDNldHhfbXBjX3JpbmcpIHtcXG4rXFx0XFx0XFx0cmMgPSAtRU5PTUVNO1xcbitcXHRcXHRcXHRnb3RvIGFsbG9jX21wY3NfZXhpdDtcXG4rXFx0XFx0fVxcbitcXHR9XFxuK2FsbG9jX21wY3NfZXhpdDpcXG4rXFx0aWYgKHJjKVxcbitcXHRcXHRibnh0X2ZyZWVfbXBjcyhicCk7XFxuK1xcdHJldHVybiByYztcXG4rfVxcbitcXG4rdm9pZCBibnh0X2ZyZWVfbXBjcyhzdHJ1Y3QgYm54dCAqYnApXFxuK3tcXG4rXFx0c3RydWN0IGJueHRfbXBjX2luZm8gKm1wYyA9IGJwLVxcdTAwM2VtcGNfaW5mbztcXG4rXFx0aW50IGk7XFxuK1xcbitcXHRpZiAoIW1wYylcXG4rXFx0XFx0cmV0dXJuO1xcbitcXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIEJOWFRfTVBDX1RZUEVfTUFYOyBpKyspIHtcXG4rXFx0XFx0a2ZyZWUobXBjLVxcdTAwM2VtcGNfcmluZ3NbaV0pO1xcbitcXHRcXHRtcGMtXFx1MDAzZW1wY19yaW5nc1tpXSA9IE5VTEw7XFxuK1xcdH1cXG4rXFx0aWYgKCFicC1cXHUwMDNlYm5hcGkpXFxuK1xcdFxcdHJldHVybjtcXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIGJwLVxcdTAwM2VjcF9ucl9yaW5nczsgaSsrKSB7XFxuK1xcdFxcdHN0cnVjdCBibnh0X25hcGkgKmJuYXBpID0gYnAtXFx1MDAzZWJuYXBpW2ldO1xcbitcXG4rXFx0XFx0a2ZyZWUoYm5hcGktXFx1MDAzZXR4X21wY19yaW5nKTtcXG4rXFx0XFx0Ym5hcGktXFx1MDAzZXR4X21wY19yaW5nID0gTlVMTDtcXG4rXFx0fVxcbit9XFxuK1xcbitpbnQgYm54dF9hbGxvY19tcGNfcmluZ3Moc3RydWN0IGJueHQgKmJwKVxcbit7XFxuK1xcdHN0cnVjdCBibnh0X21wY19pbmZvICptcGMgPSBicC1cXHUwMDNlbXBjX2luZm87XFxuK1xcdGludCBpLCBqLCByYyA9IDA7XFxuK1xcbitcXHRpZiAoIW1wYylcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgQk5YVF9NUENfVFlQRV9NQVg7IGkrKykge1xcbitcXHRcXHRpbnQgbnVtID0gbXBjLVxcdTAwM2VtcGNfcmluZ19jb3VudFtpXTtcXG4rXFxuK1xcdFxcdGZvciAoaiA9IDA7IGogXFx1MDAzYyBudW07IGorKykge1xcbitcXHRcXHRcXHRzdHJ1Y3QgYm54dF90eF9yaW5nX2luZm8gKnR4ciA9IFxcdTAwMjZtcGMtXFx1MDAzZW1wY19yaW5nc1tpXVtqXTtcXG4rXFx0XFx0XFx0c3RydWN0IGJueHRfcmluZ19zdHJ1Y3QgKnJpbmc7XFxuK1xcbitcXHRcXHRcXHRyaW5nID0gXFx1MDAyNnR4ci1cXHUwMDNldHhfcmluZ19zdHJ1Y3Q7XFxuK1xcdFxcdFxcdHJjID0gYm54dF9hbGxvY19yaW5nKGJwLCBcXHUwMDI2cmluZy1cXHUwMDNlcmluZ19tZW0pO1xcbitcXHRcXHRcXHRpZiAocmMpXFxuK1xcdFxcdFxcdFxcdGdvdG8gYWxsb2NfbXBjX3JpbmdzX2V4aXQ7XFxuK1xcdFxcdFxcdHJpbmctXFx1MDAzZXF1ZXVlX2lkID0gQk5YVF9NUENfUVVFVUVfSUQ7XFxuK1xcdFxcdFxcdHJpbmctXFx1MDAzZW1wY19jaG5sX3R5cGUgPSBpO1xcbitcXHRcXHRcXHQvKiBmb3Igc3RhdHMgY29udGV4dCAqL1xcbitcXHRcXHRcXHRyaW5nLVxcdTAwM2VncnBfaWR4ID0gdHhyLVxcdTAwM2VibmFwaS1cXHUwMDNlaW5kZXg7XFxuK1xcdFxcdFxcdHNwaW5fbG9ja19pbml0KFxcdTAwMjZ0eHItXFx1MDAzZXR4X2xvY2spO1xcbitcXHRcXHR9XFxuK1xcdH1cXG4rYWxsb2NfbXBjX3JpbmdzX2V4aXQ6XFxuK1xcdGlmIChyYylcXG4rXFx0XFx0Ym54dF9mcmVlX21wY19yaW5ncyhicCk7XFxuK1xcdHJldHVybiByYztcXG4rfVxcbitcXG4rdm9pZCBibnh0X2ZyZWVfbXBjX3JpbmdzKHN0cnVjdCBibnh0ICpicClcXG4re1xcbitcXHRzdHJ1Y3QgYm54dF9tcGNfaW5mbyAqbXBjID0gYnAtXFx1MDAzZW1wY19pbmZvO1xcbitcXHRpbnQgaSwgajtcXG4rXFxuK1xcdGlmICghbXBjKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgQk5YVF9NUENfVFlQRV9NQVg7IGkrKykge1xcbitcXHRcXHRpbnQgbnVtID0gbXBjLVxcdTAwM2VtcGNfcmluZ19jb3VudFtpXTtcXG4rXFxuK1xcdFxcdGlmICghbXBjLVxcdTAwM2VtcGNfcmluZ3NbaV0pXFxuK1xcdFxcdFxcdGNvbnRpbnVlO1xcbitcXHRcXHRmb3IgKGogPSAwOyBqIFxcdTAwM2MgbnVtOyBqKyspIHtcXG4rXFx0XFx0XFx0c3RydWN0IGJueHRfdHhfcmluZ19pbmZvICp0eHIgPSBcXHUwMDI2bXBjLVxcdTAwM2VtcGNfcmluZ3NbaV1bal07XFxuK1xcdFxcdFxcdHN0cnVjdCBibnh0X3Jpbmdfc3RydWN0ICpyaW5nID0gXFx1MDAyNnR4ci1cXHUwMDNldHhfcmluZ19zdHJ1Y3Q7XFxuK1xcbitcXHRcXHRcXHRibnh0X2ZyZWVfcmluZyhicCwgXFx1MDAyNnJpbmctXFx1MDAzZXJpbmdfbWVtKTtcXG4rXFx0XFx0fVxcbitcXHR9XFxuK31cXG4rXFxuK3ZvaWQgYm54dF9pbml0X21wY19yaW5ncyhzdHJ1Y3QgYm54dCAqYnApXFxuK3tcXG4rXFx0c3RydWN0IGJueHRfbXBjX2luZm8gKm1wYyA9IGJwLVxcdTAwM2VtcGNfaW5mbztcXG4rXFx0aW50IGksIGo7XFxuK1xcbitcXHRpZiAoIW1wYylcXG4rXFx0XFx0cmV0dXJuO1xcbitcXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIEJOWFRfTVBDX1RZUEVfTUFYOyBpKyspIHtcXG4rXFx0XFx0aW50IG51bSA9IG1wYy1cXHUwMDNlbXBjX3JpbmdfY291bnRbaV07XFxuK1xcbitcXHRcXHRmb3IgKGogPSAwOyBqIFxcdTAwM2MgbnVtOyBqKyspIHtcXG4rXFx0XFx0XFx0c3RydWN0IGJueHRfdHhfcmluZ19pbmZvICp0eHIgPSBcXHUwMDI2bXBjLVxcdTAwM2VtcGNfcmluZ3NbaV1bal07XFxuK1xcdFxcdFxcdHN0cnVjdCBibnh0X3Jpbmdfc3RydWN0ICpyaW5nID0gXFx1MDAyNnR4ci1cXHUwMDNldHhfcmluZ19zdHJ1Y3Q7XFxuK1xcbitcXHRcXHRcXHR0eHItXFx1MDAzZXR4X3Byb2QgPSAwO1xcbitcXHRcXHRcXHR0eHItXFx1MDAzZXR4X2NvbnMgPSAwO1xcbitcXHRcXHRcXHR0eHItXFx1MDAzZXR4X2h3X2NvbnMgPSAwO1xcbitcXHRcXHRcXHRXUklURV9PTkNFKHR4ci1cXHUwMDNlZGV2X3N0YXRlLCAwKTtcXG4rXFx0XFx0XFx0cmluZy1cXHUwMDNlZndfcmluZ19pZCA9IElOVkFMSURfSFdfUklOR19JRDtcXG4rXFx0XFx0fVxcbitcXHR9XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgYm54dF9od3JtX29uZV9tcGNfcmluZ19hbGxvYyhzdHJ1Y3QgYm54dCAqYnAsXFxuK1xcdFxcdFxcdFxcdFxcdHN0cnVjdCBibnh0X3R4X3JpbmdfaW5mbyAqdHhyKVxcbit7XFxuK1xcdHN0cnVjdCBibnh0X2NwX3JpbmdfaW5mbyAqY3ByID0gdHhyLVxcdTAwM2V0eF9jcHI7XFxuK1xcdHN0cnVjdCBibnh0X3Jpbmdfc3RydWN0ICpyaW5nO1xcbitcXHRpbnQgcmM7XFxuK1xcbitcXHRyaW5nID0gXFx1MDAyNmNwci1cXHUwMDNlY3BfcmluZ19zdHJ1Y3Q7XFxuK1xcdGlmIChyaW5nLVxcdTAwM2Vmd19yaW5nX2lkID09IElOVkFMSURfSFdfUklOR19JRCkge1xcbitcXHRcXHRyYyA9IGJueHRfaHdybV9jcF9yaW5nX2FsbG9jX3A1KGJwLCBjcHIpO1xcbitcXHRcXHRpZiAocmMpXFxuK1xcdFxcdFxcdHJldHVybiByYztcXG4rXFx0fVxcbitcXHQvKiB0eF9pZHggbm90IHVzZWQgb24gUDVfUExVUywgc28gc2V0IGl0IHRvIDAgKi9cXG4rXFx0cmV0dXJuIGJueHRfaHdybV90eF9yaW5nX2FsbG9jKGJwLCB0eHIsIDApO1xcbit9XFxuK1xcbitpbnQgYm54dF9od3JtX21wY19yaW5nX2FsbG9jKHN0cnVjdCBibnh0ICpicClcXG4re1xcbitcXHRzdHJ1Y3QgYm54dF9tcGNfaW5mbyAqbXBjID0gYnAtXFx1MDAzZW1wY19pbmZvO1xcbitcXHRpbnQgaSwgaiwgcmMgPSAwO1xcbitcXG4rXFx0aWYgKCFtcGMpXFxuK1xcdFxcdHJldHVybiAwO1xcbitcXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIEJOWFRfTVBDX1RZUEVfTUFYOyBpKyspIHtcXG4rXFx0XFx0aW50IG51bSA9IG1wYy1cXHUwMDNlbXBjX3JpbmdfY291bnRbaV07XFxuK1xcbitcXHRcXHRmb3IgKGogPSAwOyBqIFxcdTAwM2MgbnVtOyBqKyspIHtcXG4rXFx0XFx0XFx0c3RydWN0IGJueHRfdHhfcmluZ19pbmZvICp0eHIgPSBcXHUwMDI2bXBjLVxcdTAwM2VtcGNfcmluZ3NbaV1bal07XFxuK1xcbitcXHRcXHRcXHRyYyA9IGJueHRfaHdybV9vbmVfbXBjX3JpbmdfYWxsb2MoYnAsIHR4cik7XFxuK1xcdFxcdFxcdGlmIChyYylcXG4rXFx0XFx0XFx0XFx0Z290byBtcGNfcmluZ19hbGxvY19leGl0O1xcbitcXHRcXHR9XFxuK1xcdH1cXG4rbXBjX3JpbmdfYWxsb2NfZXhpdDpcXG4rXFx0aWYgKHJjKVxcbitcXHRcXHRibnh0X2h3cm1fbXBjX3JpbmdfZnJlZShicCwgZmFsc2UpO1xcbitcXHRyZXR1cm4gcmM7XFxuK31cXG4rXFxuK3ZvaWQgYm54dF9od3JtX21wY19yaW5nX2ZyZWUoc3RydWN0IGJueHQgKmJwLCBib29sIGNsb3NlX3BhdGgpXFxuK3tcXG4rXFx0c3RydWN0IGJueHRfbXBjX2luZm8gKm1wYyA9IGJwLVxcdTAwM2VtcGNfaW5mbztcXG4rXFx0c3RydWN0IGJueHRfY3BfcmluZ19pbmZvICpjcHI7XFxuK1xcdGludCBpLCBqO1xcbitcXG4rXFx0aWYgKCFtcGMpXFxuK1xcdFxcdHJldHVybjtcXG4rXFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBCTlhUX01QQ19UWVBFX01BWDsgaSsrKSB7XFxuK1xcdFxcdGZvciAoaiA9IDA7IGogXFx1MDAzYyBtcGMtXFx1MDAzZW1wY19yaW5nX2NvdW50W2ldOyBqKyspXFxuK1xcdFxcdFxcdGJueHRfaHdybV90eF9yaW5nX2ZyZWUoYnAsIFxcdTAwMjZtcGMtXFx1MDAzZW1wY19yaW5nc1tpXVtqXSxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgICAgIGNsb3NlX3BhdGgpO1xcbitcXHR9XFxuK1xcdC8qIENQIHJpbmdzIG11c3QgYmUgZnJlZWQgYXQgdGhlIGVuZCB0byBndWFyYW50ZWUgdGhhdCB0aGUgSFdSTV9ET05FXFxuK1xcdCAqIHJlc3BvbnNlcyBmb3IgSFdSTV9SSU5HX0ZSRUUgY2FuIHN0aWxsIGJlIHNlZW4gb24gdGhlIENQIHJpbmdzLlxcbitcXHQgKi9cXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIEJOWFRfTVBDX1RZUEVfTUFYOyBpKyspIHtcXG4rXFx0XFx0Zm9yIChqID0gMDsgaiBcXHUwMDNjIG1wYy1cXHUwMDNlbXBjX3JpbmdfY291bnRbaV07IGorKykge1xcbitcXHRcXHRcXHRjcHIgPSBtcGMtXFx1MDAzZW1wY19yaW5nc1tpXVtqXS50eF9jcHI7XFxuK1xcdFxcdFxcdGlmIChjcHIgXFx1MDAyNlxcdTAwMjYgY3ByLVxcdTAwM2VjcF9yaW5nX3N0cnVjdC5md19yaW5nX2lkICE9XFxuK1xcdFxcdFxcdCAgICBJTlZBTElEX0hXX1JJTkdfSUQpXFxuK1xcdFxcdFxcdFxcdGJueHRfaHdybV9jcF9yaW5nX2ZyZWUoYnAsIGNwcik7XFxuK1xcdFxcdH1cXG4rXFx0fVxcbit9XFxuK1xcbitzdHJ1Y3QgYm54dF90eF9yaW5nX2luZm8gKmJueHRfc2VsZWN0X21wY19yaW5nKHN0cnVjdCBibnh0ICpicCwgaW50IHJpbmdfdHlwZSlcXG4re1xcbitcXHRzdHJ1Y3QgYm54dF9tcGNfaW5mbyAqbXBjID0gYnAtXFx1MDAzZW1wY19pbmZvO1xcbitcXHRpbnQgbjtcXG4rXFxuK1xcdGlmICghbXBjIHx8IHJpbmdfdHlwZSBcXHUwMDNlPSBCTlhUX01QQ19UWVBFX01BWCB8fFxcbitcXHQgICAgIW1wYy1cXHUwMDNlbXBjX3JpbmdfY291bnRbcmluZ190eXBlXSlcXG4rXFx0XFx0cmV0dXJuIE5VTEw7XFxuK1xcbitcXHRuID0gcmF3X3NtcF9wcm9jZXNzb3JfaWQoKSAlIG1wYy1cXHUwMDNlbXBjX3JpbmdfY291bnRbcmluZ190eXBlXTtcXG4rXFx0cmV0dXJuIFxcdTAwMjZtcGMtXFx1MDAzZW1wY19yaW5nc1tyaW5nX3R5cGVdW25dO1xcbit9XFxuK1xcbisvKipcXG4rICogYm54dF9zdGFydF94bWl0X21wYyAtIFRyYW5zbWl0IG1lc3NhZ2Ugb24gYW4gTVBDIHJpbmdcXG4rICogQGJwOiBwb2ludGVyIHRvIGJueHQgZGV2aWNlXFxuKyAqIEB0eHI6IE1QQyBUWCByaW5nIHN0cnVjdHVyZSBwb2ludGVyXFxuKyAqIEBkYXRhOiBNUEMgbWVzc2FnZSBwb2ludGVyXFxuKyAqIEBsZW46IE1QQyBtZXNzYWdlIGxlbmd0aFxcbisgKiBAaGFuZGxlOiBOb24temVybyBoYW5kbGUgcGFzc2VkIGJhY2sgZm9yIHRoZSBjb21wbGV0aW9uXFxuKyAqXFxuKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHRyYW5zbWl0IGFuIE1QQyBtZXNzYWdlIG9uIGFuIE1QQyBUWCByaW5nLlxcbisgKiBUaGUgY2FsbGVyIG11c3QgaG9sZCB0eHItXFx1MDAzZXR4X2xvY2suICBXaGVuIHN1Y2Nlc3NmdWwsIHRoZSBIVyB3aWxsIHJldHVyblxcbisgKiBhIGNvbXBsZXRpb24gYW5kIGJueHRfY3J5cHRvX21wY19jbXAoKSB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSBoYW5kbGVcXG4rICogcGFzc2VkIGJhY2suXFxuKyAqXFxuKyAqIFJldHVybjogemVybyBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJvciBjb2RlIG90aGVyd2lzZTpcXG4rICpcXHRFTk9ERVY6IE1QQyBUWCByaW5nIGlzIHNodXR0aW5nIGRvd24uXFxuKyAqXFx0RUJVU1k6IE1QQyBUWCByaW5nIGlzIGZ1bGxcXG4rICovXFxuK2ludCBibnh0X3N0YXJ0X3htaXRfbXBjKHN0cnVjdCBibnh0ICpicCwgc3RydWN0IGJueHRfdHhfcmluZ19pbmZvICp0eHIsXFxuK1xcdFxcdFxcdHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBsZW4sIHVuc2lnbmVkIGxvbmcgaGFuZGxlKVxcbit7XFxuK1xcdHUzMiBiZHMsIHRvdGFsX2JkcywgYmRfc3BhY2UsIGZyZWVfc2l6ZTtcXG4rXFx0c3RydWN0IGJueHRfc3dfbXBjX3R4X2JkICp0eF9idWY7XFxuK1xcdHN0cnVjdCB0eF9iZCAqdHhiZDtcXG4rXFx0dTE2IHByb2Q7XFxuK1xcbitcXHRpZiAoUkVBRF9PTkNFKHR4ci1cXHUwMDNlZGV2X3N0YXRlKSA9PSBCTlhUX0RFVl9TVEFURV9DTE9TSU5HKVxcbitcXHRcXHRyZXR1cm4gLUVOT0RFVjtcXG4rXFxuK1xcdGJkcyA9IERJVl9ST1VORF9VUChsZW4sIHNpemVvZigqdHhiZCkpO1xcbitcXHR0b3RhbF9iZHMgPSBiZHMgKyAxO1xcbitcXHRmcmVlX3NpemUgPSBibnh0X3R4X2F2YWlsKGJwLCB0eHIpO1xcbitcXHRpZiAoZnJlZV9zaXplIFxcdTAwM2MgdG90YWxfYmRzKVxcbitcXHRcXHRyZXR1cm4gLUVCVVNZO1xcbitcXG4rXFx0cHJvZCA9IHR4ci1cXHUwMDNldHhfcHJvZDtcXG4rXFx0dHhiZCA9IFxcdTAwMjZ0eHItXFx1MDAzZXR4X2Rlc2NfcmluZ1tUWF9SSU5HKGJwLCBwcm9kKV1bVFhfSURYKHByb2QpXTtcXG4rXFx0dHhfYnVmID0gXFx1MDAyNnR4ci1cXHUwMDNldHhfbXBjX2J1Zl9yaW5nW1JJTkdfVFgoYnAsIHByb2QpXTtcXG4rXFx0dHhfYnVmLVxcdTAwM2VoYW5kbGUgPSBoYW5kbGU7XFxuK1xcdHR4X2J1Zi1cXHUwMDNlaW5saW5lX2JkcyA9IHRvdGFsX2JkcztcXG4rXFxuK1xcdHR4YmQtXFx1MDAzZXR4X2JkX2xlbl9mbGFnc190eXBlID1cXG4rXFx0XFx0Y3B1X3RvX2xlMzIoKGxlbiBcXHUwMDNjXFx1MDAzYyBUWF9CRF9MRU5fU0hJRlQpIHwgVFhfQkRfVFlQRV9NUENfVFhfQkQgfFxcbitcXHRcXHRcXHQgICAgVFhfQkRfQ05UKHRvdGFsX2JkcykpO1xcbitcXHR0eGJkLVxcdTAwM2V0eF9iZF9vcGFxdWUgPSBTRVRfVFhfT1BBUVVFKGJwLCB0eHIsIHByb2QsIHRvdGFsX2Jkcyk7XFxuK1xcbitcXHRwcm9kID0gTkVYVF9UWChwcm9kKTtcXG4rXFx0dHhiZCA9IFxcdTAwMjZ0eHItXFx1MDAzZXR4X2Rlc2NfcmluZ1tUWF9SSU5HKGJwLCBwcm9kKV1bVFhfSURYKHByb2QpXTtcXG4rXFx0YmRfc3BhY2UgPSBUWF9ERVNDX0NOVCAtIFRYX0lEWChwcm9kKTtcXG4rXFx0aWYgKGJkX3NwYWNlIFxcdTAwM2MgYmRzKSB7XFxuK1xcdFxcdHVuc2lnbmVkIGludCBsZW4wID0gYmRfc3BhY2UgKiBzaXplb2YoKnR4YmQpO1xcbitcXG4rXFx0XFx0bWVtY3B5KHR4YmQsIGRhdGEsIGxlbjApO1xcbitcXHRcXHRwcm9kICs9IGJkX3NwYWNlO1xcbitcXHRcXHR0eGJkID0gXFx1MDAyNnR4ci1cXHUwMDNldHhfZGVzY19yaW5nW1RYX1JJTkcoYnAsIHByb2QpXVtUWF9JRFgocHJvZCldO1xcbitcXHRcXHRiZHMgLT0gYmRfc3BhY2U7XFxuK1xcdFxcdGxlbiAtPSBsZW4wO1xcbitcXHRcXHRkYXRhICs9IGxlbjA7XFxuK1xcdH1cXG4rXFx0bWVtY3B5KHR4YmQsIGRhdGEsIGxlbik7XFxuK1xcdHByb2QgKz0gYmRzO1xcbitcXHRXUklURV9PTkNFKHR4ci1cXHUwMDNldHhfcHJvZCwgcHJvZCk7XFxuK1xcbitcXHQvKiBTeW5jIEJEIGRhdGEgYmVmb3JlIHVwZGF0aW5nIGRvb3JiZWxsICovXFxuK1xcdHdtYigpO1xcbitcXHRibnh0X2RiX3dyaXRlKGJwLCBcXHUwMDI2dHhyLVxcdTAwM2V0eF9kYiwgcHJvZCk7XFxuK1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rLyogUmV0dXJucyB0cnVlIGlmIHRoZSByaW5nIGlzIHN1Y2Nlc3NmdWxseSBtYXJrZWQgYXMgY2xvc2luZy4gIEl0XFxuKyAqIG1lYW5zIHRoYXQgdGhlcmUgd2lsbCBiZSBubyBtb3JlIE1QQyB0cmFuc21pc3Npb25zIGFuZCBOQVBJIHdpbGwgbm93XFxuKyAqIGNvbXBsZXRlIGFueSBNUEMgY29tcGxldGlvbnMgb24gdGhlIGNvbXBsZXRpb24gcmluZyB3aXRoIE5VTEwgaGFuZGxlc1xcbisgKiB0byBzaWduYWwgYWJvcnQuXFxuKyAqL1xcbitzdGF0aWMgYm9vbCBibnh0X2Rpc2FibGVfbXBjX3Jpbmcoc3RydWN0IGJueHRfbXBjX2luZm8gKm1wYywgaW50IG1wY19yaW5nKVxcbit7XFxuK1xcdHN0cnVjdCBibnh0X3R4X3JpbmdfaW5mbyAqdHhyO1xcbitcXHRib29sIGRpc2FibGVkID0gZmFsc2U7XFxuK1xcdGludCBpO1xcbitcXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIEJOWFRfTVBDX1RZUEVfTUFYOyBpKyspIHtcXG4rXFx0XFx0aWYgKG1wY19yaW5nIFxcdTAwM2U9IG1wYy1cXHUwMDNlbXBjX3JpbmdfY291bnRbaV0pXFxuK1xcdFxcdFxcdGNvbnRpbnVlO1xcbitcXHRcXHR0eHIgPSBcXHUwMDI2bXBjLVxcdTAwM2VtcGNfcmluZ3NbaV1bbXBjX3JpbmddO1xcbitcXHRcXHRzcGluX2xvY2tfYmgoXFx1MDAyNnR4ci1cXHUwMDNldHhfbG9jayk7XFxuK1xcdFxcdGlmICghUkVBRF9PTkNFKHR4ci1cXHUwMDNlZGV2X3N0YXRlKSkge1xcbitcXHRcXHRcXHRkaXNhYmxlZCA9IHRydWU7XFxuK1xcdFxcdFxcdFdSSVRFX09OQ0UodHhyLVxcdTAwM2VkZXZfc3RhdGUsIEJOWFRfREVWX1NUQVRFX0NMT1NJTkcpO1xcbitcXHRcXHR9XFxuK1xcdFxcdHNwaW5fdW5sb2NrX2JoKFxcdTAwMjZ0eHItXFx1MDAzZXR4X2xvY2spO1xcbitcXHRcXHRpZiAoIWRpc2FibGVkKVxcbitcXHRcXHRcXHRicmVhaztcXG4rXFx0fVxcbitcXHQvKiBNYWtlIHN1cmUgbmFwaSBwb2xscyBzZWUgQGRldl9zdGF0ZSBjaGFuZ2UgKi9cXG4rXFx0aWYgKGRpc2FibGVkKVxcbitcXHRcXHRzeW5jaHJvbml6ZV9uZXQoKTtcXG4rXFx0cmV0dXJuIGRpc2FibGVkO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBibnh0X2VuYWJsZV9tcGNfcmluZyhzdHJ1Y3QgYm54dF9tcGNfaW5mbyAqbXBjLCBpbnQgbXBjX3JpbmcpXFxuK3tcXG4rXFx0c3RydWN0IGJueHRfdHhfcmluZ19pbmZvICp0eHI7XFxuK1xcdGludCBpO1xcbitcXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIEJOWFRfTVBDX1RZUEVfTUFYOyBpKyspIHtcXG4rXFx0XFx0aWYgKG1wY19yaW5nIFxcdTAwM2U9IG1wYy1cXHUwMDNlbXBjX3JpbmdfY291bnRbaV0pXFxuK1xcdFxcdFxcdGNvbnRpbnVlO1xcbitcXHRcXHR0eHIgPSBcXHUwMDI2bXBjLVxcdTAwM2VtcGNfcmluZ3NbaV1bbXBjX3JpbmddO1xcbitcXHRcXHRXUklURV9PTkNFKHR4ci1cXHUwMDNlZGV2X3N0YXRlLCAwKTtcXG4rXFx0fVxcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBibnh0X2NsZWFyX29uZV9tcGNfZW50cmllcyhzdHJ1Y3QgYm54dCAqYnAsXFxuK1xcdFxcdFxcdFxcdCAgICAgICBzdHJ1Y3QgYm54dF90eF9yaW5nX2luZm8gKnR4cilcXG4re1xcbitcXHRzdHJ1Y3QgYm54dF9zd19tcGNfdHhfYmQgKnR4X2J1ZjtcXG4rXFx0dW5zaWduZWQgbG9uZyBoYW5kbGU7XFxuK1xcdGludCBpLCBtYXhfaWR4O1xcbitcXHR1MzIgY2xpZW50O1xcbitcXG4rXFx0bWF4X2lkeCA9IGJwLVxcdTAwM2V0eF9ucl9wYWdlcyAqIFRYX0RFU0NfQ05UO1xcbitcXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG1heF9pZHg7IGkrKykge1xcbitcXHRcXHR0eF9idWYgPSBcXHUwMDI2dHhyLVxcdTAwM2V0eF9tcGNfYnVmX3JpbmdbaV07XFxuK1xcdFxcdGhhbmRsZSA9IHR4X2J1Zi1cXHUwMDNlaGFuZGxlO1xcbitcXHRcXHRpZiAoaGFuZGxlKSB7XFxuK1xcdFxcdFxcdGNsaWVudCA9IHR4ci1cXHUwMDNldHhfcmluZ19zdHJ1Y3QubXBjX2NobmxfdHlwZTtcXG4rXFx0XFx0XFx0Ym54dF9jcnlwdG9fbXBjX2NtcChicCwgY2xpZW50LCBoYW5kbGUsIE5VTEwsIDApO1xcbitcXHRcXHRcXHR0eF9idWYtXFx1MDAzZWhhbmRsZSA9IDA7XFxuK1xcdFxcdH1cXG4rXFx0fVxcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBibnh0X21wY19yaW5nX3N0b3Aoc3RydWN0IGJueHQgKmJwLCBzdHJ1Y3QgYm54dF9tcGNfaW5mbyAqbXBjLFxcbitcXHRcXHRcXHQgICAgICAgaW50IG1wY19yaW5nKVxcbit7XFxuK1xcdHN0cnVjdCBibnh0X3R4X3JpbmdfaW5mbyAqdHhyO1xcbitcXHRzdHJ1Y3QgYm54dF9jcF9yaW5nX2luZm8gKmNwcjtcXG4rXFx0aW50IGk7XFxuK1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgQk5YVF9NUENfVFlQRV9NQVg7IGkrKykge1xcbitcXHRcXHRpZiAobXBjLVxcdTAwM2VtcGNfcmluZ19jb3VudFtpXSBcXHUwMDNlIG1wY19yaW5nKSB7XFxuK1xcdFxcdFxcdHR4ciA9IFxcdTAwMjZtcGMtXFx1MDAzZW1wY19yaW5nc1tpXVttcGNfcmluZ107XFxuK1xcdFxcdFxcdGJueHRfaHdybV90eF9yaW5nX2ZyZWUoYnAsIHR4ciwgdHJ1ZSk7XFxuK1xcdFxcdH1cXG4rXFx0fVxcbitcXHQvKiBDUCByaW5nIG11c3QgYmUgZnJlZWQgYXQgdGhlIGVuZCB0byBndWFyYW50ZWUgdGhhdCB0aGUgSFdSTV9ET05FXFxuK1xcdCAqIHJlc3BvbnNlcyBmb3IgSFdSTV9SSU5HX0ZSRUUgY2FuIHN0aWxsIGJlIHNlZW4gb24gdGhlIENQIHJpbmcuXFxuK1xcdCAqL1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgQk5YVF9NUENfVFlQRV9NQVg7IGkrKykge1xcbitcXHRcXHRpZiAobXBjLVxcdTAwM2VtcGNfcmluZ19jb3VudFtpXSBcXHUwMDNlIG1wY19yaW5nKSB7XFxuK1xcdFxcdFxcdHR4ciA9IFxcdTAwMjZtcGMtXFx1MDAzZW1wY19yaW5nc1tpXVttcGNfcmluZ107XFxuK1xcdFxcdFxcdGNwciA9IHR4ci1cXHUwMDNldHhfY3ByO1xcbitcXHRcXHRcXHRpZiAoY3ByKVxcbitcXHRcXHRcXHRcXHRibnh0X2h3cm1fY3BfcmluZ19mcmVlKGJwLCBjcHIpO1xcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFx0LyogTm8gbmV3IERNQSB0byB0aGUgQ1AgcmluZyBhdCB0aGlzIHBvaW50LCBidXQgd2UgbmVlZCB0byB3YWl0XFxuK1xcdCAqIGZvciBhbnkgaW4tZmxpZ2h0IE5BUEkgcG9sbCB0byBmaW5pc2ggYmVmb3JlIHdlIHplcm8gdGhlXFxuK1xcdCAqIGNvbXBsZXRpb24gZW50cmllcyBpbiB0aGUgQ1AgcmluZy5cXG4rXFx0ICovXFxuK1xcdHN5bmNocm9uaXplX25ldCgpO1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgQk5YVF9NUENfVFlQRV9NQVg7IGkrKykge1xcbitcXHRcXHRpZiAobXBjLVxcdTAwM2VtcGNfcmluZ19jb3VudFtpXSBcXHUwMDNlIG1wY19yaW5nKSB7XFxuK1xcdFxcdFxcdHR4ciA9IFxcdTAwMjZtcGMtXFx1MDAzZW1wY19yaW5nc1tpXVttcGNfcmluZ107XFxuK1xcdFxcdFxcdGNwciA9IHR4ci1cXHUwMDNldHhfY3ByO1xcbitcXHRcXHRcXHRpZiAoY3ByKVxcbitcXHRcXHRcXHRcXHRibnh0X2NsZWFyX29uZV9jcF9yaW5nKGJwLCBjcHIpO1xcbitcXHRcXHRcXHRibnh0X2NsZWFyX29uZV9tcGNfZW50cmllcyhicCwgdHhyKTtcXG4rXFx0XFx0fVxcbitcXHR9XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgYm54dF9tcGNfcmluZ19zdGFydChzdHJ1Y3QgYm54dCAqYnAsIHN0cnVjdCBibnh0X21wY19pbmZvICptcGMsXFxuK1xcdFxcdFxcdCAgICAgICBpbnQgbXBjX3JpbmcpXFxuK3tcXG4rXFx0c3RydWN0IGJueHRfdHhfcmluZ19pbmZvICp0eHI7XFxuK1xcdGludCBpLCByYztcXG4rXFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBCTlhUX01QQ19UWVBFX01BWDsgaSsrKSB7XFxuK1xcdFxcdGlmIChtcGMtXFx1MDAzZW1wY19yaW5nX2NvdW50W2ldIFxcdTAwM2UgbXBjX3JpbmcpIHtcXG4rXFx0XFx0XFx0dHhyID0gXFx1MDAyNm1wYy1cXHUwMDNlbXBjX3JpbmdzW2ldW21wY19yaW5nXTtcXG4rXFx0XFx0XFx0dHhyLVxcdTAwM2V0eF9wcm9kID0gMDtcXG4rXFx0XFx0XFx0dHhyLVxcdTAwM2V0eF9jb25zID0gMDtcXG4rXFx0XFx0XFx0dHhyLVxcdTAwM2V0eF9od19jb25zID0gMDtcXG4rXFx0XFx0XFx0cmMgPSBibnh0X2h3cm1fb25lX21wY19yaW5nX2FsbG9jKGJwLCB0eHIpO1xcbitcXHRcXHRcXHRpZiAocmMpXFxuK1xcdFxcdFxcdFxcdHJldHVybiByYztcXG4rXFx0XFx0fVxcbitcXHR9XFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbisvKiBDYWxsZWQgZnJvbSBibnh0X3NwX3Rhc2soKSB3aXRoIG5ldGRldl9sb2NrIGhlbGQuICBJZiB0aGUgZGV2aWNlIGlzIG5vdFxcbisgKiBvcGVuIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG86IHRoZSBvcGVuIHBhdGggd2lsbCByZS1hbGxvY2F0ZSBhbmRcXG4rICogcmUtaW5pdGlhbGl6ZSBhbGwgTVBDIHJpbmdzLlxcbisgKi9cXG4rdm9pZCBibnh0X21wY19yaW5nX3Jlc2V0X3Rhc2soc3RydWN0IGJueHQgKmJwKVxcbit7XFxuK1xcdHN0cnVjdCBibnh0X21wY19pbmZvICptcGMgPSBicC1cXHUwMDNlbXBjX2luZm87XFxuK1xcdHN0cnVjdCBibnh0X3R4X3JpbmdfaW5mbyAqdHhyO1xcbitcXHRpbnQgaSwgajtcXG4rXFxuK1xcdGlmICghbXBjIHx8ICF0ZXN0X2JpdChCTlhUX1NUQVRFX09QRU4sIFxcdTAwMjZicC1cXHUwMDNlc3RhdGUpKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgQk5YVF9NUENfVFlQRV9NQVg7IGkrKykge1xcbitcXHRcXHRmb3IgKGogPSAwOyBqIFxcdTAwM2MgbXBjLVxcdTAwM2VtcGNfcmluZ19jb3VudFtpXTsgaisrKSB7XFxuK1xcdFxcdFxcdHR4ciA9IFxcdTAwMjZtcGMtXFx1MDAzZW1wY19yaW5nc1tpXVtqXTtcXG4rXFx0XFx0XFx0aWYgKFJFQURfT05DRSh0eHItXFx1MDAzZWRldl9zdGF0ZSkgIT0gQk5YVF9ERVZfU1RBVEVfQ0xPU0lORylcXG4rXFx0XFx0XFx0XFx0Y29udGludWU7XFxuK1xcbitcXHRcXHRcXHQvKiBSZXNldHMgdGhlIHdob2xlIHJpbmcgKGJvdGggdHlwZXMpICovXFxuK1xcdFxcdFxcdG5ldGRldl93YXJuKGJwLVxcdTAwM2VkZXYsIFxcXCJSZXNldHRpbmcgTVBDIHJpbmcgJWRcXFxcblxcXCIsIGopO1xcbitcXHRcXHRcXHRibnh0X21wY19yaW5nX3N0b3AoYnAsIG1wYywgaik7XFxuK1xcdFxcdFxcdGlmIChibnh0X21wY19yaW5nX3N0YXJ0KGJwLCBtcGMsIGopKSB7XFxuK1xcdFxcdFxcdFxcdG5ldGRldl9lcnIoYnAtXFx1MDAzZWRldiwgXFxcIkVycm9yIHN0YXJ0aW5nIE1QQyByaW5nICVkLCByZXNldHRpbmcgZGV2aWNlXFxcXG5cXFwiLFxcbitcXHRcXHRcXHRcXHRcXHQgICBqKTtcXG4rXFx0XFx0XFx0XFx0Ym54dF9tcGNfcmluZ19zdG9wKGJwLCBtcGMsIGopO1xcbitcXHRcXHRcXHRcXHRibnh0X3Jlc2V0X3Rhc2soYnAsIHRydWUpO1xcbitcXHRcXHRcXHRcXHQvKiBibnh0X3Jlc2V0X3Rhc2soKSB3aWxsIGNsZWFyIGV2ZXJ5dGhpbmcgKi9cXG4rXFx0XFx0XFx0XFx0cmV0dXJuO1xcbitcXHRcXHRcXHR9XFxuK1xcdFxcdFxcdGJueHRfZW5hYmxlX21wY19yaW5nKG1wYywgaik7XFxuK1xcdFxcdH1cXG4rXFx0fVxcbit9XFxuK1xcbitzdGF0aWMgaW50IGJueHRfbXBjX3JpbmdfcmVzZXQoc3RydWN0IGJueHQgKmJwLCBpbnQgbXBjX3JpbmcpXFxuK3tcXG4rXFx0c3RydWN0IGJueHRfbXBjX2luZm8gKm1wYyA9IGJwLVxcdTAwM2VtcGNfaW5mbztcXG4rXFx0c3RydWN0IGJueHRfdHhfcmluZ19pbmZvICp0eHI7XFxuK1xcdGludCBpO1xcbitcXG4rXFx0aWYgKCFtcGMpXFxuK1xcdFxcdHJldHVybiAwO1xcbitcXHRpZiAobXBjX3JpbmcgXFx1MDAzZT0gbXBjLVxcdTAwM2VtcGNfY3BfcmluZ3MpXFxuK1xcdFxcdHJldHVybiAtRUlOVkFMO1xcbitcXG4rXFx0aWYgKCFibnh0X2Rpc2FibGVfbXBjX3JpbmcobXBjLCBtcGNfcmluZykpXFxuK1xcdFxcdHJldHVybiAwO1xcbitcXG4rXFx0LyogQ29tcGxldGlvbiBoYW5kbGVzIHdpbGwgbm8gbG9uZ2VyIGJlIHByb2Nlc3NlZCBhdCB0aGlzIHBvaW50XFxuK1xcdCAqIGZyb20gTkFQSSwgc28gd2UgY2FuIGNvbXBsZXRlIHRoZSBvdXRzdGFuZGluZyBjb21tYW5kcyBhbmRcXG4rXFx0ICogcmVsZWFzZSB0aGUgY29tbWFuZCBjb250ZXh0cy5cXG4rXFx0ICovXFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBCTlhUX01QQ19UWVBFX01BWDsgaSsrKSB7XFxuK1xcdFxcdGlmIChtcGMtXFx1MDAzZW1wY19yaW5nX2NvdW50W2ldIFxcdTAwM2UgbXBjX3JpbmcpIHtcXG4rXFx0XFx0XFx0dHhyID0gXFx1MDAyNm1wYy1cXHUwMDNlbXBjX3JpbmdzW2ldW21wY19yaW5nXTtcXG4rXFx0XFx0XFx0Ym54dF9jbGVhcl9vbmVfbXBjX2VudHJpZXMoYnAsIHR4cik7XFxuK1xcdFxcdH1cXG4rXFx0fVxcbitcXG4rXFx0LyogSWYgdGhlIGRldmljZSBpcyBnb2luZyBkb3duLCB0aGUgcmVvcGVuIHdpbGwgcmUtYWxsb2NhdGUgYW5kXFxuK1xcdCAqIHJlLWluaXRpYWxpemUgYWxsIE1QQyByaW5ncy4gIE90aGVyd2lzZSBkZWZlciB0aGUgcmVzZXQgdG9cXG4rXFx0ICogYm54dF9zcF90YXNrKCkgdG8gc2FmZWx5IGhvbGQgdGhlIG5ldGRldl9sb2NrLlxcbitcXHQgKi9cXG4rXFx0aWYgKHRlc3RfYml0KEJOWFRfU1RBVEVfT1BFTiwgXFx1MDAyNmJwLVxcdTAwM2VzdGF0ZSkpXFxuK1xcdFxcdGJueHRfcXVldWVfc3Bfd29yayhicCwgQk5YVF9NUENfUkVTRVRfU1BfRVZFTlQpO1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4raW50IGJueHRfbXBjX3RpbWVvdXQoc3RydWN0IGJueHQgKmJwLCBzdHJ1Y3QgYm54dF90eF9yaW5nX2luZm8gKnR4cilcXG4re1xcbitcXHRpZiAodHhyLVxcdTAwM2V0eF9yaW5nX3N0cnVjdC5xdWV1ZV9pZCA9PSBCTlhUX01QQ19RVUVVRV9JRClcXG4rXFx0XFx0cmV0dXJuIGJueHRfbXBjX3JpbmdfcmVzZXQoYnAsIHR4ci1cXHUwMDNldHhxX2luZGV4KTtcXG4rXFx0cmV0dXJuIC1FSU5WQUw7XFxuK31cXG4rXFxuK3N0YXRpYyBib29sIGJueHRfbXBjX3Vuc29saWNpdChzdHJ1Y3QgbXBjX2NtcCAqbXBjbXApXFxuK3tcXG4rXFx0dTMyIGNsaWVudCA9IE1QQ19DTVBfQ0xJRU5UX1RZUEUobXBjbXApO1xcbitcXG4rXFx0aWYgKGNsaWVudCAhPSBNUENfQ01QX0NMSUVOVF9UQ0UgXFx1MDAyNlxcdTAwMjYgY2xpZW50ICE9IE1QQ19DTVBfQ0xJRU5UX1JDRSlcXG4rXFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXHRyZXR1cm4gTVBDX0NNUF9VTlNPTElDSVRfU1VCVFlQRShtcGNtcCk7XFxuK31cXG4rXFxuK2ludCBibnh0X21wY19jbXAoc3RydWN0IGJueHQgKmJwLCBzdHJ1Y3QgYm54dF9jcF9yaW5nX2luZm8gKmNwciwgdTMyICpyYXdfY29ucylcXG4re1xcbitcXHRzdHJ1Y3QgYm54dF9jbXBsX2VudHJ5IGNtcGxfZW50cnlfYXJyWzJdO1xcbitcXHRzdHJ1Y3QgYm54dF9uYXBpICpibmFwaSA9IGNwci1cXHUwMDNlYm5hcGk7XFxuK1xcdHUxNiBjb25zID0gUklOR19DTVAoKnJhd19jb25zKTtcXG4rXFx0c3RydWN0IG1wY19jbXAgKm1wY21wLCAqbXBjbXAxO1xcbitcXHR1MzIgdG1wX3Jhd19jb25zID0gKnJhd19jb25zO1xcbitcXHR1bnNpZ25lZCBsb25nIGhhbmRsZSA9IDA7XFxuK1xcdHUzMiBjbGllbnQsIGNtcGxfbnVtO1xcbitcXHR1OCB0eXBlO1xcbitcXG4rXFx0bXBjbXAgPSAoc3RydWN0IG1wY19jbXAgKilcXG4rXFx0XFx0XFx1MDAyNmNwci1cXHUwMDNlY3BfZGVzY19yaW5nW0NQX1JJTkcoY29ucyldW0NQX0lEWChjb25zKV07XFxuK1xcdHR5cGUgPSBNUENfQ01QX0NNUF9UWVBFKG1wY21wKTtcXG4rXFx0Y21wbF9lbnRyeV9hcnJbMF0uY21wbCA9IG1wY21wO1xcbitcXHRjbXBsX2VudHJ5X2FyclswXS5sZW4gPSBzaXplb2YoKm1wY21wKTtcXG4rXFx0Y21wbF9udW0gPSAxO1xcbitcXHRpZiAodHlwZSA9PSBNUENfQ01QX1RZUEVfTUlEX1BBVEhfTE9ORykge1xcbitcXHRcXHR0bXBfcmF3X2NvbnMgPSBORVhUX1JBV19DTVAodG1wX3Jhd19jb25zKTtcXG4rXFx0XFx0Y29ucyA9IFJJTkdfQ01QKHRtcF9yYXdfY29ucyk7XFxuK1xcdFxcdG1wY21wMSA9IChzdHJ1Y3QgbXBjX2NtcCAqKVxcbitcXHRcXHRcXHQgXFx1MDAyNmNwci1cXHUwMDNlY3BfZGVzY19yaW5nW0NQX1JJTkcoY29ucyldW0NQX0lEWChjb25zKV07XFxuK1xcbitcXHRcXHRpZiAoIU1QQ19DTVBfVkFMSUQoYnAsIG1wY21wMSwgdG1wX3Jhd19jb25zKSlcXG4rXFx0XFx0XFx0cmV0dXJuIC1FQlVTWTtcXG4rXFx0XFx0LyogVGhlIHZhbGlkIHRlc3Qgb2YgdGhlIGVudHJ5IG11c3QgYmUgZG9uZSBmaXJzdCBiZWZvcmVcXG4rXFx0XFx0ICogcmVhZGluZyBhbnkgZnVydGhlci5cXG4rXFx0XFx0ICovXFxuK1xcdFxcdGRtYV9ybWIoKTtcXG4rXFx0XFx0aWYgKG1wY21wMSA9PSBtcGNtcCArIDEpIHtcXG4rXFx0XFx0XFx0Y21wbF9lbnRyeV9hcnJbY21wbF9udW0gLSAxXS5sZW4gKz0gc2l6ZW9mKCptcGNtcDEpO1xcbitcXHRcXHR9IGVsc2Uge1xcbitcXHRcXHRcXHRjbXBsX2VudHJ5X2FycltjbXBsX251bV0uY21wbCA9IG1wY21wMTtcXG4rXFx0XFx0XFx0Y21wbF9lbnRyeV9hcnJbY21wbF9udW1dLmxlbiA9IHNpemVvZigqbXBjbXAxKTtcXG4rXFx0XFx0XFx0Y21wbF9udW0rKztcXG4rXFx0XFx0fVxcbitcXHR9XFxuK1xcdGNsaWVudCA9IE1QQ19DTVBfQ0xJRU5UX1RZUEUobXBjbXApIFxcdTAwM2VcXHUwMDNlIE1QQ19DTVBfQ0xJRU5UX1NGVDtcXG4rXFx0aWYgKGNsaWVudCBcXHUwMDNlPSBCTlhUX01QQ19UWVBFX01BWClcXG4rXFx0XFx0Z290byBjbXBfZG9uZTtcXG4rXFxuK1xcdGlmICghYm54dF9tcGNfdW5zb2xpY2l0KG1wY21wKSkge1xcbitcXHRcXHRzdHJ1Y3QgYm54dF9zd19tcGNfdHhfYmQgKm1wY19idWY7XFxuK1xcdFxcdHN0cnVjdCBibnh0X3R4X3JpbmdfaW5mbyAqdHhyO1xcbitcXHRcXHR1MTYgdHhfY29ucztcXG4rXFx0XFx0dTMyIG9wYXF1ZTtcXG4rXFxuK1xcdFxcdG9wYXF1ZSA9IG1wY21wLVxcdTAwM2VtcGNfY21wX29wYXF1ZTtcXG4rXFx0XFx0dHhyID0gYm5hcGktXFx1MDAzZXR4X21wY19yaW5nW2NsaWVudF07XFxuK1xcdFxcdHR4X2NvbnMgPSB0eHItXFx1MDAzZXR4X2NvbnM7XFxuK1xcdFxcdGlmIChUWF9PUEFRVUVfUklORyhvcGFxdWUpICE9IHR4ci1cXHUwMDNldHhfbmFwaV9pZHgpIHtcXG4rXFx0XFx0XFx0bmV0ZGV2X3dhcm4oYnAtXFx1MDAzZWRldiwgXFxcIldyb25nIG9wYXF1ZSAleCwgZXhwZWN0ZWQgcmluZyAleCwgY29ucyBpZHggJXhcXFxcblxcXCIsXFxuK1xcdFxcdFxcdFxcdCAgICBvcGFxdWUsIHR4ci1cXHUwMDNldHhfbmFwaV9pZHgsIHR4ci1cXHUwMDNldHhfY29ucyk7XFxuK1xcdFxcdFxcdGdvdG8gY21wX2RvbmU7XFxuK1xcdFxcdH1cXG4rXFx0XFx0bXBjX2J1ZiA9IFxcdTAwMjZ0eHItXFx1MDAzZXR4X21wY19idWZfcmluZ1tSSU5HX1RYKGJwLCB0eF9jb25zKV07XFxuK1xcdFxcdGlmICghUkVBRF9PTkNFKHR4ci1cXHUwMDNlZGV2X3N0YXRlKSkge1xcbitcXHRcXHRcXHRoYW5kbGUgPSBtcGNfYnVmLVxcdTAwM2VoYW5kbGU7XFxuK1xcdFxcdFxcdG1wY19idWYtXFx1MDAzZWhhbmRsZSA9IDA7XFxuK1xcdFxcdH1cXG4rXFx0XFx0dHhfY29ucyArPSBtcGNfYnVmLVxcdTAwM2VpbmxpbmVfYmRzO1xcbitcXHRcXHRXUklURV9PTkNFKHR4ci1cXHUwMDNldHhfY29ucywgdHhfY29ucyk7XFxuK1xcdFxcdHR4ci1cXHUwMDNldHhfaHdfY29ucyA9IFJJTkdfVFgoYnAsIHR4X2NvbnMpO1xcbitcXHR9XFxuK1xcdGJueHRfY3J5cHRvX21wY19jbXAoYnAsIGNsaWVudCwgaGFuZGxlLCBjbXBsX2VudHJ5X2FyciwgY21wbF9udW0pO1xcbitcXG4rY21wX2RvbmU6XFxuK1xcdCpyYXdfY29ucyA9IHRtcF9yYXdfY29ucztcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG5kaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9ibnh0X21wYy5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9ibnh0X21wYy5oXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwMC4uYjBiMWU3ODNjZGM3N2ZcXG4tLS0gL2Rldi9udWxsXFxuKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9ibnh0X21wYy5oXFxuQEAgLTAsMCArMSwyMjcgQEBcXG4rLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seSAqL1xcbisvKiBDb3B5cmlnaHQgKGMpIDIwMjYgQnJvYWRjb20gSW5jLiAqL1xcbitcXG4rI2lmbmRlZiBCTlhUX01QQ19IXFxuKyNkZWZpbmUgQk5YVF9NUENfSFxcbitcXG4rLyogTWlkIHBhdGggY2hhbm5lbCAoTVBDKSBkZWZpbml0aW9ucy4gIEFuIE1QQyBpcyBzcGVjaWFsIFRYL2NvbXBsZXRpb25cXG4rICogcmluZyBwYWlyIHRvIHNlbmQvcmVjZWl2ZSBjb250cm9sIHBsYW5lIGRhdGEgdG8gdGhlIFRDRSBhbmQgUkNFXFxuKyAqIChUcmFuc21pdC9SZWNlaXZlIENyeXB0byBFbmdpbmUpIEhXIGJsb2Nrcy5cXG4rICovXFxuK1xcbitlbnVtIGJueHRfbXBjX3R5cGUge1xcbitcXHRCTlhUX01QQ19UQ0VfVFlQRSA9IFJJTkdfQUxMT0NfUkVRX01QQ19DSE5MU19UWVBFX1RDRSxcXG4rXFx0Qk5YVF9NUENfUkNFX1RZUEUgPSBSSU5HX0FMTE9DX1JFUV9NUENfQ0hOTFNfVFlQRV9SQ0UsXFxuK1xcdEJOWFRfTVBDX1RZUEVfTUFYLFxcbit9O1xcbitcXG4rI2RlZmluZSBCTlhUX01BWF9NUENcXHRcXHQ4XFxuK1xcbisjZGVmaW5lIEJOWFRfTUlOX01QQ19UQ0VcXHQxXFxuKyNkZWZpbmUgQk5YVF9NSU5fTVBDX1JDRVxcdDFcXG4rI2RlZmluZSBCTlhUX0RGTFRfTVBDX1RDRVxcdEJOWFRfTUFYX01QQ1xcbisjZGVmaW5lIEJOWFRfREZMVF9NUENfUkNFXFx0Qk5YVF9NQVhfTVBDXFxuK1xcbisjZGVmaW5lIEJOWFRfTVBDX1RNT19NU0VDUyAgICAgIDEwMDBcXG4rXFxuK3N0cnVjdCBibnh0X21wY19pbmZvIHtcXG4rXFx0dThcXHRcXHRcXHRtcGNfY2hubHNfY2FwO1xcbitcXHR1OFxcdFxcdFxcdG1wY19jcF9yaW5ncztcXG4rXFx0dThcXHRcXHRcXHRtcGNfcmluZ19jb3VudFtCTlhUX01QQ19UWVBFX01BWF07XFxuK1xcdHN0cnVjdCBibnh0X3R4X3JpbmdfaW5mbyAqbXBjX3JpbmdzW0JOWFRfTVBDX1RZUEVfTUFYXTtcXG4rfTtcXG4rXFxuK3N0cnVjdCBibnh0X3N3X21wY190eF9iZCB7XFxuK1xcdHU4IGlubGluZV9iZHM7XFxuK1xcdHVuc2lnbmVkIGxvbmcgaGFuZGxlO1xcbit9O1xcbitcXG4rI2RlZmluZSBTV19NUENfVFhCRF9SSU5HX1NJWkUgKHNpemVvZihzdHJ1Y3QgYm54dF9zd19tcGNfdHhfYmQpICogVFhfREVTQ19DTlQpXFxuK1xcbitzdHJ1Y3QgYm54dF9jbXBsX2VudHJ5IHtcXG4rXFx0dm9pZCAqY21wbDtcXG4rXFx0dTMyIGxlbjtcXG4rfTtcXG4rXFxuK3N0cnVjdCBtcGNfY21wIHtcXG4rXFx0X19sZTMyIG1wY19jbXBfY2xpZW50X3N1YnR5cGVfdHlwZTtcXG4rXFx0I2RlZmluZSBNUENfQ01QX1RZUEVcXHRcXHRcXHRcXHRcXHQoMHgzZiBcXHUwMDNjXFx1MDAzYyAwKVxcbitcXHQgI2RlZmluZSBNUENfQ01QX1RZUEVfTUlEX1BBVEhfU0hPUlRcXHRcXHRcXHQgMHgxZVxcbitcXHQgI2RlZmluZSBNUENfQ01QX1RZUEVfTUlEX1BBVEhfTE9OR1xcdFxcdFxcdCAweDFmXFxuK1xcdCNkZWZpbmUgTVBDX0NNUF9TVUJUWVBFXFx0XFx0XFx0XFx0XFx0MHhmMDBcXG4rXFx0I2RlZmluZSBNUENfQ01QX1NVQlRZUEVfU0ZUXFx0XFx0XFx0XFx0IDhcXG4rXFx0ICNkZWZpbmUgTVBDX0NNUF9TVUJUWVBFX1NPTElDSVRFRFxcdFxcdFxcdCAoMHgwIFxcdTAwM2NcXHUwMDNjIDgpXFxuK1xcdCAjZGVmaW5lIE1QQ19DTVBfU1VCVFlQRV9FUlJcXHRcXHRcXHRcXHQgKDB4MSBcXHUwMDNjXFx1MDAzYyA4KVxcbitcXHQgI2RlZmluZSBNUENfQ01QX1NVQlRZUEVfUkVTWU5DXFx0XFx0XFx0XFx0ICgweDIgXFx1MDAzY1xcdTAwM2MgOClcXG4rXFx0I2RlZmluZSBNUENfQ01QX0NMSUVOVFxcdFxcdFxcdFxcdFxcdCgweGYgXFx1MDAzY1xcdTAwM2MgMTIpXFxuK1xcdCAjZGVmaW5lIE1QQ19DTVBfQ0xJRU5UX1NGVFxcdFxcdFxcdFxcdCAxMlxcbitcXHQgI2RlZmluZSBNUENfQ01QX0NMSUVOVF9UQ0VcXHRcXHRcXHRcXHQgKDB4MCBcXHUwMDNjXFx1MDAzYyAxMilcXG4rXFx0ICNkZWZpbmUgTVBDX0NNUF9DTElFTlRfUkNFXFx0XFx0XFx0XFx0ICgweDEgXFx1MDAzY1xcdTAwM2MgMTIpXFxuK1xcdCAjZGVmaW5lIE1QQ19DTVBfQ0xJRU5UX1RFX0NGQVxcdFxcdFxcdFxcdCAoMHgyIFxcdTAwM2NcXHUwMDNjIDEyKVxcbitcXHQgI2RlZmluZSBNUENfQ01QX0NMSUVOVF9SRV9DRkFcXHRcXHRcXHRcXHQgKDB4MyBcXHUwMDNjXFx1MDAzYyAxMilcXG4rXFx0dTMyIG1wY19jbXBfb3BhcXVlO1xcbitcXHRfX2xlMzIgbXBjX2NtcF92O1xcbitcXHQjZGVmaW5lIE1QQ19DTVBfVlxcdFxcdFxcdFxcdFxcdCgxIFxcdTAwM2NcXHUwMDNjIDApXFxuK1xcdF9fbGUzMiBtcGNfY21wX2ZpbGxlcjtcXG4rfTtcXG4rXFxuKyNkZWZpbmUgTVBDX0NNUF9DTVBfVFlQRShtcGNtcClcXHRcXHRcXHRcXHRcXHRcXHRcXFxcXFxuK1xcdChsZTMyX3RvX2NwdSgobXBjbXApLVxcdTAwM2VtcGNfY21wX2NsaWVudF9zdWJ0eXBlX3R5cGUpIFxcdTAwMjYgTVBDX0NNUF9UWVBFKVxcbitcXG4rI2RlZmluZSBNUENfQ01QX0NMSUVOVF9UWVBFKG1wY21wKVxcdFxcdFxcdFxcdFxcdFxcXFxcXG4rXFx0KGxlMzJfdG9fY3B1KChtcGNtcCktXFx1MDAzZW1wY19jbXBfY2xpZW50X3N1YnR5cGVfdHlwZSkgXFx1MDAyNiBNUENfQ01QX0NMSUVOVClcXG4rXFxuKyNkZWZpbmUgTVBDX0NNUF9VTlNPTElDSVRfU1VCVFlQRShtcGNtcClcXHRcXHRcXHRcXHRcXFxcXFxuK1xcdCgobGUzMl90b19jcHUoKG1wY21wKS1cXHUwMDNlbXBjX2NtcF9jbGllbnRfc3VidHlwZV90eXBlKSBcXHUwMDI2XFx0XFx0XFxcXFxcbitcXHQgTVBDX0NNUF9TVUJUWVBFKSAhPSBNUENfQ01QX1NVQlRZUEVfU09MSUNJVEVEKVxcbitcXG4rI2RlZmluZSBNUENfQ01QX1ZBTElEKGJwLCBtcGNtcCwgcmF3X2NvbnMpXFx0XFx0XFx0XFx0XFxcXFxcbitcXHQoISEoKG1wY21wKS1cXHUwMDNlbXBjX2NtcF92IFxcdTAwMjYgY3B1X3RvX2xlMzIoTVBDX0NNUF9WKSkgPT1cXHRcXHRcXFxcXFxuK1xcdCAhKChyYXdfY29ucykgXFx1MDAyNiAoYnApLVxcdTAwM2VjcF9iaXQpKVxcbitcXG4rI2RlZmluZSBCTlhUX01QQ19DUllQVE9fQ0FQICAgIFxcXFxcXG4rXFx0KEZVTkNfUUNBUFNfUkVTUF9NUENfQ0hOTFNfQ0FQX1RDRSB8IEZVTkNfUUNBUFNfUkVTUF9NUENfQ0hOTFNfQ0FQX1JDRSlcXG4rXFxuKyNkZWZpbmUgQk5YVF9NUENfQ1JZUFRPX0NBUEFCTEUoYnApXFx0XFx0XFx0XFx0XFx0XFxcXFxcbitcXHQoKGJwKS1cXHUwMDNlbXBjX2luZm8gP1xcdFxcdFxcdFxcdFxcdFxcdFxcXFxcXG4rXFx0ICgoYnApLVxcdTAwM2VtcGNfaW5mby1cXHUwMDNlbXBjX2NobmxzX2NhcCBcXHUwMDI2IEJOWFRfTVBDX0NSWVBUT19DQVApID09XFx0XFxcXFxcbitcXHQgIEJOWFRfTVBDX0NSWVBUT19DQVAgOiBmYWxzZSlcXG4rXFxuKyNpZmRlZiBDT05GSUdfQk5YVF9UTFNcXG4rdm9pZCBibnh0X2FsbG9jX21wY19pbmZvKHN0cnVjdCBibnh0ICpicCwgdTggbXBjX2NobmxzX2NhcCk7XFxuK3ZvaWQgYm54dF9mcmVlX21wY19pbmZvKHN0cnVjdCBibnh0ICpicCk7XFxuK2ludCBibnh0X21wY190eF9yaW5nc19pbl91c2Uoc3RydWN0IGJueHQgKmJwKTtcXG4raW50IGJueHRfbXBjX2NwX3JpbmdzX2luX3VzZShzdHJ1Y3QgYm54dCAqYnApO1xcbitib29sIGJueHRfbmFwaV9oYXNfbXBjKHN0cnVjdCBibnh0ICpicCwgaW50IGkpO1xcbit2b2lkIGJueHRfc2V0X21wY19jcF9yaW5nKHN0cnVjdCBibnh0ICpicCwgaW50IGJuYXBpX2lkeCxcXG4rXFx0XFx0XFx0ICBzdHJ1Y3QgYm54dF9jcF9yaW5nX2luZm8gKmNwcik7XFxuK3ZvaWQgYm54dF90cmltX21wY19yaW5ncyhzdHJ1Y3QgYm54dCAqYnApO1xcbit2b2lkIGJueHRfY2FsY19kZmx0X21wY19yaW5ncyhzdHJ1Y3QgYm54dCAqYnAsIGludCB0eF9ucl9yaW5ncyxcXG4rXFx0XFx0XFx0ICAgICAgaW50IHR4X25yX3JpbmdzX3Blcl90YywgaW50IHJ4X25yX3JpbmdzLFxcbitcXHRcXHRcXHQgICAgICBpbnQgKm1wY19wZXJfdHlwZSwgaW50ICptcGNfY3ApO1xcbit2b2lkIGJueHRfc2V0X2RmbHRfbXBjX3JpbmdzKHN0cnVjdCBibnh0ICpicCk7XFxuK3ZvaWQgYm54dF9pbml0X21wY19yaW5nX3N0cnVjdChzdHJ1Y3QgYm54dCAqYnApO1xcbitpbnQgYm54dF9hbGxvY19tcGNzKHN0cnVjdCBibnh0ICpicCk7XFxuK3ZvaWQgYm54dF9mcmVlX21wY3Moc3RydWN0IGJueHQgKmJwKTtcXG4raW50IGJueHRfYWxsb2NfbXBjX3JpbmdzKHN0cnVjdCBibnh0ICpicCk7XFxuK3ZvaWQgYm54dF9mcmVlX21wY19yaW5ncyhzdHJ1Y3QgYm54dCAqYnApO1xcbit2b2lkIGJueHRfaW5pdF9tcGNfcmluZ3Moc3RydWN0IGJueHQgKmJwKTtcXG4raW50IGJueHRfaHdybV9tcGNfcmluZ19hbGxvYyhzdHJ1Y3QgYm54dCAqYnApO1xcbit2b2lkIGJueHRfaHdybV9tcGNfcmluZ19mcmVlKHN0cnVjdCBibnh0ICpicCwgYm9vbCBjbG9zZV9wYXRoKTtcXG4rc3RydWN0IGJueHRfdHhfcmluZ19pbmZvICpibnh0X3NlbGVjdF9tcGNfcmluZyhzdHJ1Y3QgYm54dCAqYnAsIGludCByaW5nX3R5cGUpO1xcbitpbnQgYm54dF9zdGFydF94bWl0X21wYyhzdHJ1Y3QgYm54dCAqYnAsIHN0cnVjdCBibnh0X3R4X3JpbmdfaW5mbyAqdHhyLFxcbitcXHRcXHRcXHR2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgbGVuLCB1bnNpZ25lZCBsb25nIGhhbmRsZSk7XFxuK3ZvaWQgYm54dF9tcGNfcmluZ19yZXNldF90YXNrKHN0cnVjdCBibnh0ICpicCk7XFxuK2ludCBibnh0X21wY190aW1lb3V0KHN0cnVjdCBibnh0ICpicCwgc3RydWN0IGJueHRfdHhfcmluZ19pbmZvICp0eHIpO1xcbitpbnQgYm54dF9tcGNfY21wKHN0cnVjdCBibnh0ICpicCwgc3RydWN0IGJueHRfY3BfcmluZ19pbmZvICpjcHIsIHUzMiAqcmF3X2NvbnMpO1xcbisjZWxzZVxcbitzdGF0aWMgaW5saW5lIHZvaWQgYm54dF9hbGxvY19tcGNfaW5mbyhzdHJ1Y3QgYm54dCAqYnAsIHU4IG1wY19jaG5sc19jYXApXFxuK3tcXG4rfVxcbitcXG4rc3RhdGljIGlubGluZSB2b2lkIGJueHRfZnJlZV9tcGNfaW5mbyhzdHJ1Y3QgYm54dCAqYnApXFxuK3tcXG4rfVxcbitcXG4rc3RhdGljIGlubGluZSBpbnQgYm54dF9tcGNfdHhfcmluZ3NfaW5fdXNlKHN0cnVjdCBibnh0ICpicClcXG4re1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rc3RhdGljIGlubGluZSBpbnQgYm54dF9tcGNfY3BfcmluZ3NfaW5fdXNlKHN0cnVjdCBibnh0ICpicClcXG4re1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rc3RhdGljIGlubGluZSBib29sIGJueHRfbmFwaV9oYXNfbXBjKHN0cnVjdCBibnh0ICpicCwgaW50IGkpXFxuK3tcXG4rXFx0cmV0dXJuIGZhbHNlO1xcbit9XFxuK1xcbitzdGF0aWMgaW5saW5lIHZvaWQgYm54dF9zZXRfbXBjX2NwX3Jpbmcoc3RydWN0IGJueHQgKmJwLCBpbnQgYm5hcGlfaWR4LFxcbitcXHRcXHRcXHRcXHRcXHRzdHJ1Y3QgYm54dF9jcF9yaW5nX2luZm8gKmNwcilcXG4re1xcbit9XFxuK1xcbitzdGF0aWMgaW5saW5lIHZvaWQgYm54dF90cmltX21wY19yaW5ncyhzdHJ1Y3QgYm54dCAqYnApXFxuK3tcXG4rfVxcbitcXG4rc3RhdGljIGlubGluZSB2b2lkIGJueHRfY2FsY19kZmx0X21wY19yaW5ncyhzdHJ1Y3QgYm54dCAqYnAsIGludCB0eF9ucl9yaW5ncyxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgIGludCB0eF9ucl9yaW5nc19wZXJfdGMsXFxuK1xcdFxcdFxcdFxcdFxcdCAgICBpbnQgcnhfbnJfcmluZ3MsIGludCAqbXBjX3Blcl90eXBlLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgaW50ICptcGNfY3ApXFxuK3tcXG4rXFx0Km1wY19wZXJfdHlwZSA9IDA7XFxuK1xcdCptcGNfY3AgPSAwO1xcbit9XFxuK1xcbitzdGF0aWMgaW5saW5lIHZvaWQgYm54dF9zZXRfZGZsdF9tcGNfcmluZ3Moc3RydWN0IGJueHQgKmJwKVxcbit7XFxuK31cXG4rXFxuK3N0YXRpYyBpbmxpbmUgdm9pZCBibnh0X2luaXRfbXBjX3Jpbmdfc3RydWN0KHN0cnVjdCBibnh0ICpicClcXG4re1xcbit9XFxuK1xcbitzdGF0aWMgaW5saW5lIGludCBibnh0X2FsbG9jX21wY3Moc3RydWN0IGJueHQgKmJwKVxcbit7XFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitzdGF0aWMgaW5saW5lIHZvaWQgYm54dF9mcmVlX21wY3Moc3RydWN0IGJueHQgKmJwKVxcbit7XFxuK31cXG4rXFxuK3N0YXRpYyBpbmxpbmUgaW50IGJueHRfYWxsb2NfbXBjX3JpbmdzKHN0cnVjdCBibnh0ICpicClcXG4re1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rc3RhdGljIGlubGluZSB2b2lkIGJueHRfZnJlZV9tcGNfcmluZ3Moc3RydWN0IGJueHQgKmJwKVxcbit7XFxuK31cXG4rXFxuK3N0YXRpYyBpbmxpbmUgdm9pZCBibnh0X2luaXRfbXBjX3JpbmdzKHN0cnVjdCBibnh0ICpicClcXG4re1xcbit9XFxuK1xcbitzdGF0aWMgaW5saW5lIGludCBibnh0X2h3cm1fbXBjX3JpbmdfYWxsb2Moc3RydWN0IGJueHQgKmJwKVxcbit7XFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitzdGF0aWMgaW5saW5lIHZvaWQgYm54dF9od3JtX21wY19yaW5nX2ZyZWUoc3RydWN0IGJueHQgKmJwLCBib29sIGNsb3NlX3BhdGgpXFxuK3tcXG4rfVxcbitcXG4rc3RhdGljIGlubGluZSBzdHJ1Y3QgYm54dF90eF9yaW5nX2luZm8gKmJueHRfc2VsZWN0X21wY19yaW5nKHN0cnVjdCBibnh0ICpicCxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0XFx0ICAgICBpbnQgcmluZ190eXBlKVxcbit7XFxuK1xcdHJldHVybiBOVUxMO1xcbit9XFxuK1xcbitzdGF0aWMgaW5saW5lIGludCBibnh0X3N0YXJ0X3htaXRfbXBjKHN0cnVjdCBibnh0ICpicCxcXG4rXFx0XFx0XFx0XFx0ICAgICAgc3RydWN0IGJueHRfdHhfcmluZ19pbmZvICp0eHIsIHZvaWQgKmRhdGEsXFxuK1xcdFxcdFxcdFxcdCAgICAgIHVuc2lnbmVkIGludCBsZW4sIHVuc2lnbmVkIGxvbmcgaGFuZGxlKVxcbit7XFxuK1xcdHJldHVybiAtRU9QTk9UU1VQUDtcXG4rfVxcbitcXG4rc3RhdGljIGlubGluZSB2b2lkIGJueHRfbXBjX3JpbmdfcmVzZXRfdGFzayhzdHJ1Y3QgYm54dCAqYnApXFxuK3tcXG4rfVxcbitcXG4rc3RhdGljIGlubGluZSBpbnQgYm54dF9tcGNfdGltZW91dChzdHJ1Y3QgYm54dCAqYnAsXFxuK1xcdFxcdFxcdFxcdCAgIHN0cnVjdCBibnh0X3R4X3JpbmdfaW5mbyAqdHhyKVxcbit7XFxuK1xcdHJldHVybiAtRU9QTk9UU1VQUDtcXG4rfVxcbitcXG4rc3RhdGljIGlubGluZSBpbnQgYm54dF9tcGNfY21wKHN0cnVjdCBibnh0ICpicCwgc3RydWN0IGJueHRfY3BfcmluZ19pbmZvICpjcHIsXFxuK1xcdFxcdFxcdCAgICAgICB1MzIgKnJhd19jb25zKVxcbit7XFxuK1xcdHJldHVybiAwO1xcbit9XFxuKyNlbmRpZlxcdC8qIENPTkZJR19CTlhUX1RMUyAqL1xcbisjZW5kaWZcXHQvKiBCTlhUX01QQ19IICovXFxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dF9zcmlvdi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9ibnh0X3NyaW92LmNcXG5pbmRleCBlZGNjMDAyZTRjYTM1OC4uZDU3MDU5NzIyZjViYjAgMTAwNjQ0XFxuLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9ibnh0X3NyaW92LmNcXG4rKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibnh0L2JueHRfc3Jpb3YuY1xcbkBAIC02NDAsNyArNjQwLDcgQEAgc3RhdGljIGludCBibnh0X2h3cm1fZnVuY192Zl9yZXNjX2NmZyhzdHJ1Y3QgYm54dCAqYnAsIGludCBudW1fdmZzLCBib29sIHJlc2V0KVxcbiBcXHRcXHR2Zl9yeF9yaW5ncyA9IGh3X3Jlc2MtXFx1MDAzZW1heF9yeF9yaW5ncyAtIGJwLVxcdTAwM2VyeF9ucl9yaW5ncyAqIDI7XFxuIFxcdGVsc2VcXG4gXFx0XFx0dmZfcnhfcmluZ3MgPSBod19yZXNjLVxcdTAwM2VtYXhfcnhfcmluZ3MgLSBicC1cXHUwMDNlcnhfbnJfcmluZ3M7XFxuLVxcdHZmX3R4X3JpbmdzID0gaHdfcmVzYy1cXHUwMDNlbWF4X3R4X3JpbmdzIC0gYnAtXFx1MDAzZXR4X25yX3JpbmdzO1xcbitcXHR2Zl90eF9yaW5ncyA9IGh3X3Jlc2MtXFx1MDAzZW1heF90eF9yaW5ncyAtIGJueHRfdG90YWxfdHhfcmluZ3MoYnApO1xcbiBcXHR2Zl92bmljcyA9IGh3X3Jlc2MtXFx1MDAzZW1heF92bmljcyAtIGJwLVxcdTAwM2Vucl92bmljcztcXG4gXFx0dmZfcnNzID0gaHdfcmVzYy1cXHUwMDNlbWF4X3Jzc2Nvc19jdHhzIC0gYnAtXFx1MDAzZXJzc2Nvc19ucl9jdHhzO1xcbiBcXG5AQCAtOTAzLDggKzkwMyw4IEBAIHN0YXRpYyBpbnQgYm54dF9zcmlvdl9lbmFibGUoc3RydWN0IGJueHQgKmJwLCBpbnQgKm51bV92ZnMpXFxuIFxcdFxcdCAgICBhdmFpbF9jcCBcXHUwMDNjIG1pbl9yeF9yaW5ncylcXG4gXFx0XFx0XFx0cnhfb2sgPSAwO1xcbiBcXG4tXFx0XFx0aWYgKGh3X3Jlc2MtXFx1MDAzZW1heF90eF9yaW5ncyAtIGJwLVxcdTAwM2V0eF9ucl9yaW5ncyBcXHUwMDNlPSBtaW5fdHhfcmluZ3MgXFx1MDAyNlxcdTAwMjZcXG4tXFx0XFx0ICAgIGF2YWlsX2NwIFxcdTAwM2U9IG1pbl90eF9yaW5ncylcXG4rXFx0XFx0aWYgKGh3X3Jlc2MtXFx1MDAzZW1heF90eF9yaW5ncyAtIGJueHRfdG90YWxfdHhfcmluZ3MoYnApIFxcdTAwM2U9XFxuK1xcdFxcdCAgICBtaW5fdHhfcmluZ3MgXFx1MDAyNlxcdTAwMjYgYXZhaWxfY3AgXFx1MDAzZT0gbWluX3R4X3JpbmdzKVxcbiBcXHRcXHRcXHR0eF9vayA9IDE7XFxuIFxcbiBcXHRcXHRpZiAoaHdfcmVzYy1cXHUwMDNlbWF4X3Jzc2Nvc19jdHhzIC0gYnAtXFx1MDAzZXJzc2Nvc19ucl9jdHhzIFxcdTAwM2U9XFxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dF94ZHAuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dF94ZHAuY1xcbmluZGV4IDllNTAwOWJlOGU5ODk4Li5kMTg3MzEyNDg5M2E1ZiAxMDA2NDRcXG4tLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibnh0L2JueHRfeGRwLmNcXG4rKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibnh0L2JueHRfeGRwLmNcXG5AQCAtMTksNiArMTksNyBAQFxcbiAjaW5jbHVkZSBcXHUwMDNjbmV0L3BhZ2VfcG9vbC9oZWxwZXJzLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9ibnh0L2hzaS5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXFwiYm54dC5oXFxcIlxcbisjaW5jbHVkZSBcXFwiYm54dF9tcGMuaFxcXCJcXG4gI2luY2x1ZGUgXFxcImJueHRfeGRwLmhcXFwiXFxuIFxcbiBERUZJTkVfU1RBVElDX0tFWV9GQUxTRShibnh0X3hkcF9sb2NraW5nX2tleSk7XFxuQEAgLTM1MSw3ICszNTIsNyBAQCBpbnQgYm54dF94ZHBfeG1pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbnVtX2ZyYW1lcyxcXG4gXFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuIFxcbiBcXHRpZiAoc3RhdGljX2JyYW5jaF91bmxpa2VseShcXHUwMDI2Ym54dF94ZHBfbG9ja2luZ19rZXkpKVxcbi1cXHRcXHRzcGluX2xvY2soXFx1MDAyNnR4ci1cXHUwMDNleGRwX3R4X2xvY2spO1xcbitcXHRcXHRzcGluX2xvY2soXFx1MDAyNnR4ci1cXHUwMDNldHhfbG9jayk7XFxuIFxcbiBcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgbnVtX2ZyYW1lczsgaSsrKSB7XFxuIFxcdFxcdHN0cnVjdCB4ZHBfZnJhbWUgKnhkcCA9IGZyYW1lc1tpXTtcXG5AQCAtMzc2LDcgKzM3Nyw3IEBAIGludCBibnh0X3hkcF94bWl0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBudW1fZnJhbWVzLFxcbiBcXHR9XFxuIFxcbiBcXHRpZiAoc3RhdGljX2JyYW5jaF91bmxpa2VseShcXHUwMDI2Ym54dF94ZHBfbG9ja2luZ19rZXkpKVxcbi1cXHRcXHRzcGluX3VubG9jayhcXHUwMDI2dHhyLVxcdTAwM2V4ZHBfdHhfbG9jayk7XFxuK1xcdFxcdHNwaW5fdW5sb2NrKFxcdTAwMjZ0eHItXFx1MDAzZXR4X2xvY2spO1xcbiBcXG4gXFx0cmV0dXJuIG54bWl0O1xcbiB9XFxuQEAgLTQxMCw3ICs0MTEsOCBAQCBzdGF0aWMgaW50IGJueHRfeGRwX3NldChzdHJ1Y3QgYm54dCAqYnAsIHN0cnVjdCBicGZfcHJvZyAqcHJvZylcXG4gXFx0aWYgKCF0YylcXG4gXFx0XFx0dGMgPSAxO1xcbiBcXHRyYyA9IGJueHRfY2hlY2tfcmluZ3MoYnAsIGJwLVxcdTAwM2V0eF9ucl9yaW5nc19wZXJfdGMsIGJwLVxcdTAwM2VyeF9ucl9yaW5ncyxcXG4tXFx0XFx0XFx0ICAgICAgdHJ1ZSwgdGMsIHR4X3hkcCk7XFxuK1xcdFxcdFxcdCAgICAgIHRydWUsIHRjLCB0eF94ZHAsIGJueHRfbXBjX3R4X3JpbmdzX2luX3VzZShicCksXFxuK1xcdFxcdFxcdCAgICAgIGJueHRfbXBjX2NwX3JpbmdzX2luX3VzZShicCkpO1xcbiBcXHRpZiAocmMpIHtcXG4gXFx0XFx0bmV0ZGV2X3dhcm4oZGV2LCBcXFwiVW5hYmxlIHRvIHJlc2VydmUgZW5vdWdoIFRYIHJpbmdzIHRvIHN1cHBvcnQgWERQLlxcXFxuXFxcIik7XFxuIFxcdFxcdHJldHVybiByYztcXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9ibnh0L2hzaS5oIGIvaW5jbHVkZS9saW51eC9ibnh0L2hzaS5oXFxuaW5kZXggNzRhNmJmMjc4ZDg4OGMuLjAzNDQ0YjgxYmViMGYzIDEwMDY0NFxcbi0tLSBhL2luY2x1ZGUvbGludXgvYm54dC9oc2kuaFxcbisrKyBiL2luY2x1ZGUvbGludXgvYm54dC9oc2kuaFxcbkBAIC0zODM3LDYgKzM4MzcsNDMgQEAgc3RydWN0IGh3cm1fZnVuY19wdHBfZXh0X3FjZmdfb3V0cHV0IHtcXG4gXFx0dThcXHR2YWxpZDtcXG4gfTtcXG4gXFxuKy8qIGh3cm1fZnVuY19rZXlfY3R4X2FsbG9jX2lucHV0IChzaXplOjM4NGIvNDhCKSAqL1xcbitzdHJ1Y3QgaHdybV9mdW5jX2tleV9jdHhfYWxsb2NfaW5wdXQge1xcbitcXHRfX2xlMTZcXHRyZXFfdHlwZTtcXG4rXFx0X19sZTE2XFx0Y21wbF9yaW5nO1xcbitcXHRfX2xlMTZcXHRzZXFfaWQ7XFxuK1xcdF9fbGUxNlxcdHRhcmdldF9pZDtcXG4rXFx0X19sZTY0XFx0cmVzcF9hZGRyO1xcbitcXHRfX2xlMTZcXHRmaWQ7XFxuK1xcdF9fbGUxNlxcdG51bV9rZXlfY3R4cztcXG4rXFx0X19sZTMyXFx0ZG1hX2J1ZnJfc2l6ZV9ieXRlcztcXG4rXFx0dThcXHRrZXlfY3R4X3R5cGU7XFxuK1xcdCNkZWZpbmUgRlVOQ19LRVlfQ1RYX0FMTE9DX1JFUV9LRVlfQ1RYX1RZUEVfVFggICAgICAweDBVTFxcbitcXHQjZGVmaW5lIEZVTkNfS0VZX0NUWF9BTExPQ19SRVFfS0VZX0NUWF9UWVBFX1JYICAgICAgMHgxVUxcXG4rXFx0I2RlZmluZSBGVU5DX0tFWV9DVFhfQUxMT0NfUkVRX0tFWV9DVFhfVFlQRV9RVUlDX1RYIDB4MlVMXFxuK1xcdCNkZWZpbmUgRlVOQ19LRVlfQ1RYX0FMTE9DX1JFUV9LRVlfQ1RYX1RZUEVfUVVJQ19SWCAweDNVTFxcbitcXHQjZGVmaW5lIEZVTkNfS0VZX0NUWF9BTExPQ19SRVFfS0VZX0NUWF9UWVBFX0xBU1QgICBGVU5DX0tFWV9DVFhfQUxMT0NfUkVRX0tFWV9DVFhfVFlQRV9RVUlDX1JYXFxuK1xcdHU4XFx0dW51c2VkXzBbN107XFxuK1xcdF9fbGU2NFxcdGhvc3RfZG1hX2FkZHI7XFxuK1xcdF9fbGUzMlxcdHBhcnRpdGlvbl9zdGFydF94aWQ7XFxuK1xcdHU4XFx0dW51c2VkXzFbNF07XFxuK307XFxuK1xcbisvKiBod3JtX2Z1bmNfa2V5X2N0eF9hbGxvY19vdXRwdXQgKHNpemU6MTkyYi8yNEIpICovXFxuK3N0cnVjdCBod3JtX2Z1bmNfa2V5X2N0eF9hbGxvY19vdXRwdXQge1xcbitcXHRfX2xlMTZcXHRlcnJvcl9jb2RlO1xcbitcXHRfX2xlMTZcXHRyZXFfdHlwZTtcXG4rXFx0X19sZTE2XFx0c2VxX2lkO1xcbitcXHRfX2xlMTZcXHRyZXNwX2xlbjtcXG4rXFx0X19sZTE2XFx0bnVtX2tleV9jdHhzX2FsbG9jYXRlZDtcXG4rXFx0dThcXHRmbGFncztcXG4rXFx0I2RlZmluZSBGVU5DX0tFWV9DVFhfQUxMT0NfUkVTUF9GTEFHU19LRVlfQ1RYU19DT05USUdVT1VTICAgICAweDFVTFxcbitcXHR1OFxcdHVudXNlZF8wO1xcbitcXHRfX2xlMzJcXHRwYXJ0aXRpb25fc3RhcnRfeGlkO1xcbitcXHR1OFxcdHVudXNlZF8xWzddO1xcbitcXHR1OFxcdHZhbGlkO1xcbit9O1xcbitcXG4gLyogaHdybV9mdW5jX2JhY2tpbmdfc3RvcmVfY2ZnX3YyX2lucHV0IChzaXplOjUxMmIvNjRCKSAqL1xcbiBzdHJ1Y3QgaHdybV9mdW5jX2JhY2tpbmdfc3RvcmVfY2ZnX3YyX2lucHV0IHtcXG4gXFx0X19sZTE2XFx0cmVxX3R5cGU7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTExVDAyOjA1OjU3Ljc0NTkzMTk3NloiLCJTZXEiOjIsIk5lc3RpbmciOjEsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MTk4MTM1NDA3MTcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogbnVsbCxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW10sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGFkZHMga1RMUyBvZmZsb2FkIHN1cHBvcnQgdG8gdGhlIEJyb2FkY29tIE5ldFh0cmVtZS1DL0UgKGJueHQpIEV0aGVybmV0IGRyaXZlci4gU2luY2UgdGhpcyBpcyBhIGhhcmR3YXJlLXNwZWNpZmljIFBDSSBkcml2ZXIgdGhhdCByZXF1aXJlcyBjb21wbGV4IGZpcm13YXJlIChIV1JNKSBpbnRlcmFjdGlvbnMgdG8gaW5pdGlhbGl6ZSBhbmQgYnJpbmcgdXAgdGhlIG5ldHdvcmsgZGV2aWNlLCBpdCBpcyBpbXBvc3NpYmxlIHRvIHJlYWNoIHRoZSBtb2RpZmllZCBkYXRhIHBhdGggYW5kIFRMUyBvZmZsb2FkIGxvZ2ljIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyB3aXRob3V0IGEgZGVkaWNhdGVkIHNvZnR3YXJlIGVtdWxhdG9yLiBUaGVyZWZvcmUsIHRoaXMgY29kZSBjYW5ub3QgYmUgbWVhbmluZ2Z1bGx5IGZ1enplZC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyLlxuWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmVcbmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC5cblxuSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluXG55b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHlcbnVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSBhbmQgY29uZmlybSBhbnkgYXNzdW1wdGlvbnMuXG5cblJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6XG4tIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIEtjb25maWcgZmlsZXMsIG9yIGNvZGUgY29tbWVudHMuXG4tIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLlxuLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuXG4tIENvZGUgcGF0aHMgdGhhdCBhcmUgaW1wb3NzaWJsZSB0byByZWFjaCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBHQ0Ugb3IgUUVNVSxcbmV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS5cblxuSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaFxudG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuXG5cbldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOlxuMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy5cbiAgIEF2b2lkIGxpc3RpbmcgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgdG8gcHJldmVudCBza2V3ZWQgdGVzdCBkaXN0cmlidXRpb25zLlxuMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuXG4gICBHbyBhbmQgbG9vayBpbnRvIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBjaGVjayBmb3IgaWZkZWZzIGFyb3VuZCB0aGUgY29kZSwgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuXG4gICBEbyBub3QgbGlzdCB0b28gZ2VuZXJpYyBjb25maWdzICh3ZSBhbHJlYWR5IGhhdmUgdGhlbSBlbmFibGVkKS4gT25seSBsaXN0IHRob3NlIHRoYXRcbiAgIHNwZWNpZmljYWxseSBjb3ZlciB0aGUgbW9kaWZpZWQgY29kZS4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzIG91dHB1dCBhcnJheSxcbiAgIGFuZCBETyBOT1QgYWRkIGEgJ0NPTkZJR18nIHByZWZpeCAoZS5nLiwgcmV0dXJuIFwiTkVUX0lQVjRcIiBpbnN0ZWFkIG9mIFwiQ09ORklHX05FVF9JUFY0XCIpLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgZWE4MjNmNTE1YWU4Y2UzODA1YWRiMjFjMzI5NjljOTFiYzczMjUwMlxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBTYXQgSnVsIDExIDAyOjA1OjU0IDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vS2NvbmZpZyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL0tjb25maWdcbmluZGV4IGYwYmFjMGRkMTQzOTAwLi5iMzNiNjZmMDM4Yjg4MiAxMDA2NDRcbi0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL0tjb25maWdcbisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL0tjb25maWdcbkBAIC0yNTUsNiArMjU1LDE1IEBAIGNvbmZpZyBCTlhUX0hXTU9OXG4gXHQgIFNheSBZIGlmIHlvdSB3YW50IHRvIGV4cG9zZSB0aGUgdGhlcm1hbCBzZW5zb3IgZGF0YSBvbiBOZXRYdHJlbWUtQy9FXG4gXHQgIGRldmljZXMsIHZpYSB0aGUgaHdtb24gc3lzZnMgaW50ZXJmYWNlLlxuIFxuK2NvbmZpZyBCTlhUX1RMU1xuK1x0Ym9vbCBcIkJyb2FkY29tIE5ldFh0cmVtZS1DL0UgVExTIG9mZmxvYWQgc3VwcG9ydFwiXG4rXHRkZWZhdWx0IHlcbitcdGRlcGVuZHMgb24gQk5YVCBcdTAwMjZcdTAwMjYgVExTX0RFVklDRVxuK1x0ZGVwZW5kcyBvbiBUTFM9eSB8fCBCTlhUPW1cbitcdGhlbHBcbitcdCAgU2F5IFkgaWYgeW91IHdhbnQgdG8gZW5hYmxlIFRyYW5zcG9ydCBMYXllciBTZWN1cml0eSAoVExTKSBoYXJkd2FyZVxuK1x0ICBlbmNyeXB0aW9uIGFuZCBkZWNyeXB0aW9uIG9mZmxvYWQgb24gc3VwcG9ydGVkIE5ldFh0cmVtZS1DL0UgZGV2aWNlcy5cbitcbiBjb25maWcgQk5HRVxuIFx0dHJpc3RhdGUgXCJCcm9hZGNvbSBUaG9yVWx0cmEgRXRoZXJuZXQgZGV2aWNlIHN1cHBvcnRcIlxuIFx0ZGVwZW5kcyBvbiBQQ0lcbmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibnh0L01ha2VmaWxlIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9NYWtlZmlsZVxuaW5kZXggZGViZWY3OGM4YjZkNjQuLjg4ZTY4MjQ4YWFkNDIwIDEwMDY0NFxuLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9NYWtlZmlsZVxuKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9NYWtlZmlsZVxuQEAgLTUsMyArNSw0IEBAIGJueHRfZW4teSA6PSBibnh0Lm8gYm54dF9od3JtLm8gYm54dF9zcmlvdi5vIGJueHRfZXRodG9vbC5vIGJueHRfZGNiLm8gYm54dF91bHAuXG4gYm54dF9lbi0kKENPTkZJR19CTlhUX0ZMT1dFUl9PRkZMT0FEKSArPSBibnh0X3RjLm9cbiBibnh0X2VuLSQoQ09ORklHX0RFQlVHX0ZTKSArPSBibnh0X2RlYnVnZnMub1xuIGJueHRfZW4tJChDT05GSUdfQk5YVF9IV01PTikgKz0gYm54dF9od21vbi5vXG4rYm54dF9lbi0kKENPTkZJR19CTlhUX1RMUykgKz0gYm54dF9tcGMubyBibnh0X2NyeXB0by5vIGJueHRfa3Rscy5vXG5kaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9ibnh0LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibnh0L2JueHQuY1xuaW5kZXggNzUxMzYxODc5M2RhZjMuLmYwODRjMTlmZmRkZDhmIDEwMDY0NFxuLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9ibnh0LmNcbisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dC5jXG5AQCAtNzYsNiArNzYsOSBAQFxuICNpbmNsdWRlIFwiYm54dF9od21vbi5oXCJcbiAjaW5jbHVkZSBcImJueHRfZ3NvLmhcIlxuICNpbmNsdWRlIFx1MDAzY25ldC90c28uaFx1MDAzZVxuKyNpbmNsdWRlIFwiYm54dF9tcGMuaFwiXG4rI2luY2x1ZGUgXCJibnh0X2NyeXB0by5oXCJcbisjaW5jbHVkZSBcImJueHRfa3Rscy5oXCJcbiBcbiAjZGVmaW5lIEJOWFRfVFhfVElNRU9VVFx0XHQoNSAqIEhaKVxuICNkZWZpbmUgQk5YVF9ERUZfTVNHX0VOQUJMRVx0KE5FVElGX01TR19EUlYgfCBORVRJRl9NU0dfSFcgfCBcXFxuQEAgLTM5Miw3ICszOTUsNyBAQCBzdGF0aWMgdm9pZCBfX2JueHRfcXVldWVfc3Bfd29yayhzdHJ1Y3QgYm54dCAqYnApXG4gXHRcdHNjaGVkdWxlX3dvcmsoXHUwMDI2YnAtXHUwMDNlc3BfdGFzayk7XG4gfVxuIFxuLXN0YXRpYyB2b2lkIGJueHRfcXVldWVfc3Bfd29yayhzdHJ1Y3QgYm54dCAqYnAsIHVuc2lnbmVkIGludCBldmVudClcbit2b2lkIGJueHRfcXVldWVfc3Bfd29yayhzdHJ1Y3QgYm54dCAqYnAsIHVuc2lnbmVkIGludCBldmVudClcbiB7XG4gXHRzZXRfYml0KGV2ZW50LCBcdTAwMjZicC1cdTAwM2VzcF9ldmVudCk7XG4gXHRfX2JueHRfcXVldWVfc3Bfd29yayhicCk7XG5AQCAtNDc4LDEzICs0ODEsMTUgQEAgc3RhdGljIG5ldGRldl90eF90IGJueHRfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KVxuIFx0ZG1hX2FkZHJfdCBtYXBwaW5nO1xuIFx0dW5zaWduZWQgaW50IGxlbmd0aCwgcGFkID0gMDtcbiBcdHUzMiBsZW4sIGZyZWVfc2l6ZSwgdmxhbl90YWdfZmxhZ3MsIGNmYV9hY3Rpb24sIGZsYWdzO1xuK1x0c3RydWN0IGJueHRfa3Rsc19vZmZsb2FkX2N0eF90eCAqa2N0eF90eCA9IE5VTEw7XG4rXHR1MTYgcHJvZCwgc3RhcnRfcHJvZCwgbGFzdF9mcmFnLCB0eHRzX3Byb2Q7XG4gXHRzdHJ1Y3QgYm54dF9wdHBfY2ZnICpwdHAgPSBicC1cdTAwM2VwdHBfY2ZnO1xuIFx0c3RydWN0IHBjaV9kZXYgKnBkZXYgPSBicC1cdTAwM2VwZGV2O1xuLVx0dTE2IHByb2QsIGxhc3RfZnJhZywgdHh0c19wcm9kO1xuIFx0c3RydWN0IGJueHRfdHhfcmluZ19pbmZvICp0eHI7XG4gXHRzdHJ1Y3QgYm54dF9zd190eF9iZCAqdHhfYnVmO1xuIFx0X19sZTMyIGxmbGFncyA9IDA7XG4gXHRza2JfZnJhZ190ICpmcmFnO1xuK1x0dTMyIGtpZCA9IDA7XG4gXG4gXHRpID0gc2tiX2dldF9xdWV1ZV9tYXBwaW5nKHNrYik7XG4gXHRpZiAodW5saWtlbHkoaSBcdTAwM2U9IGJwLVx1MDAzZXR4X25yX3JpbmdzKSkge1xuQEAgLTQ5NSw3ICs1MDAsNiBAQCBzdGF0aWMgbmV0ZGV2X3R4X3QgYm54dF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpXG4gXG4gXHR0eHEgPSBuZXRkZXZfZ2V0X3R4X3F1ZXVlKGRldiwgaSk7XG4gXHR0eHIgPSBcdTAwMjZicC1cdTAwM2V0eF9yaW5nW2JwLVx1MDAzZXR4X3JpbmdfbWFwW2ldXTtcbi1cdHByb2QgPSB0eHItXHUwMDNldHhfcHJvZDtcbiBcbiAjaWYgKE1BWF9TS0JfRlJBR1MgXHUwMDNlIFRYX01BWF9GUkFHUylcbiBcdGlmIChza2Jfc2hpbmZvKHNrYiktXHUwMDNlbnJfZnJhZ3MgXHUwMDNlIFRYX01BWF9GUkFHUykge1xuQEAgLTUyNCw2ICs1MjgsMTQgQEAgc3RhdGljIG5ldGRldl90eF90IGJueHRfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KVxuIFx0XHRcdHJldHVybiBORVRERVZfVFhfQlVTWTtcbiBcdH1cbiBcbitcdHN0YXJ0X3Byb2QgPSB0eHItXHUwMDNldHhfcHJvZDtcbitcdHNrYiA9IGJueHRfa3Rsc194bWl0KGJwLCB0eHIsIHNrYiwgXHUwMDI2bGZsYWdzLCBcdTAwMjZraWQsIFx1MDAyNmtjdHhfdHgpO1xuK1x0aWYgKHVubGlrZWx5KCFza2IpKSB7XG4rXHRcdGRldl9jb3JlX3N0YXRzX3R4X2Ryb3BwZWRfaW5jKGRldik7XG4rXHRcdHJldHVybiBORVRERVZfVFhfT0s7XG4rXHR9XG4rXG4rXHRwcm9kID0gdHhyLVx1MDAzZXR4X3Byb2Q7XG4gXHRsZW5ndGggPSBza2ItXHUwMDNlbGVuO1xuIFx0bGVuID0gc2tiX2hlYWRsZW4oc2tiKTtcbiBcdGxhc3RfZnJhZyA9IHNrYl9zaGluZm8oc2tiKS1cdTAwM2Vucl9mcmFncztcbkBAIC02NzIsNyArNjg0LDcgQEAgc3RhdGljIG5ldGRldl90eF90IGJueHRfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KVxuIFxuIFx0cHJvZCA9IE5FWFRfVFgocHJvZCk7XG4gXHR0eGJkMSA9IGJueHRfaW5pdF9leHRfYmQoYnAsIHR4ciwgcHJvZCwgbGZsYWdzLCB2bGFuX3RhZ19mbGFncyxcbi1cdFx0XHRcdCBjZmFfYWN0aW9uKTtcbitcdFx0XHRcdCBjZmFfYWN0aW9uLCBraWQpO1xuIFxuIFx0aWYgKHNrYl9pc19nc28oc2tiKSkge1xuIFx0XHRib29sIHVkcF9nc28gPSAhIShza2Jfc2hpbmZvKHNrYiktXHUwMDNlZ3NvX3R5cGUgXHUwMDI2IFNLQl9HU09fVURQX0w0KTtcbkBAIC02OTMsOSArNzA1LDEwIEBAIHN0YXRpYyBuZXRkZXZfdHhfdCBibnh0X3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldilcbiBcbiBcdFx0dHhiZDEtXHUwMDNldHhfYmRfaHNpemVfbGZsYWdzIHw9IGNwdV90b19sZTMyKFRYX0JEX0ZMQUdTX0xTTyB8XG4gXHRcdFx0XHRcdFRYX0JEX0ZMQUdTX1RfSVBJRCB8XG4tXHRcdFx0XHRcdChoZHJfbGVuIFx1MDAzY1x1MDAzYyAoVFhfQkRfSFNJWkVfU0hJRlQgLSAxKSkpO1xuK1x0XHRcdFx0XHQoKGhkcl9sZW4gXHUwMDNlXHUwMDNlIDEpIFx1MDAzY1x1MDAzYyBUWF9CRF9IU0laRV9TSElGVCkpO1xuIFx0XHRsZW5ndGggPSBza2Jfc2hpbmZvKHNrYiktXHUwMDNlZ3NvX3NpemU7XG4tXHRcdHR4YmQxLVx1MDAzZXR4X2JkX21zcyA9IGNwdV90b19sZTMyKGxlbmd0aCk7XG4rXHRcdHR4YmQxLVx1MDAzZXR4X2JkX2tpZF9tc3MgPSBjcHVfdG9fbGUzMihCTlhUX1RYX0tJRF9ISShraWQpIHxcbitcdFx0XHRcdFx0XHQgICAobGVuZ3RoIFx1MDAyNiBUWF9CRF9NU1MpKTtcbiBcdFx0bGVuZ3RoICs9IGhkcl9sZW47XG4gXHR9IGVsc2UgaWYgKHNrYi1cdTAwM2VpcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fUEFSVElBTCkge1xuIFx0XHR0eGJkMS1cdTAwM2V0eF9iZF9oc2l6ZV9sZmxhZ3MgfD1cbkBAIC03NDgsNiArNzYxLDkgQEAgc3RhdGljIG5ldGRldl90eF90IGJueHRfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KVxuIFx0cHJvZCA9IE5FWFRfVFgocHJvZCk7XG4gXHRXUklURV9PTkNFKHR4ci1cdTAwM2V0eF9wcm9kLCBwcm9kKTtcbiBcbitcdC8qIENvbW1pdCB0aGUga1RMUyBzdGF0ZSBub3cgdGhhdCB0aGUgQkQgaXMgaW4gdGhlIHJpbmcuICovXG4rXHRibnh0X2t0bHNfeG1pdF9jb21taXQodHhyLCBrY3R4X3R4KTtcbitcbiBcdGlmICghbmV0ZGV2X3htaXRfbW9yZSgpIHx8IG5ldGlmX3htaXRfc3RvcHBlZCh0eHEpKSB7XG4gXHRcdGJueHRfdHhyX2RiX2tpY2soYnAsIHR4ciwgcHJvZCk7XG4gXHR9IGVsc2Uge1xuQEAgLTgwMiw5ICs4MTgsMTYgQEAgc3RhdGljIG5ldGRldl90eF90IGJueHRfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KVxuIFx0XHRcdC8qIHNldCBTS0IgdG8gZXJyIHNvIFBUUCB3b3JrZXIgd2lsbCBjbGVhbiB1cCAqL1xuIFx0XHRcdHB0cC1cdTAwM2V0eHRzX3JlcVt0eHRzX3Byb2RdLnR4X3NrYiA9IEVSUl9QVFIoLUVJTyk7XG4gXHR9XG4rXHR0eHItXHUwMDNldHhfYnVmX3JpbmdbUklOR19UWChicCwgdHhyLVx1MDAzZXR4X3Byb2QpXS5za2IgPSBOVUxMO1xuK1x0LyogVW53aW5kIGFueSBrVExTIHByZXN5bmMgQkRzICovXG4rXHRpZiAodW5saWtlbHkodHhyLVx1MDAzZXR4X3Byb2QgIT0gc3RhcnRfcHJvZCkpIHtcbitcdFx0dHhfYnVmID0gXHUwMDI2dHhyLVx1MDAzZXR4X2J1Zl9yaW5nW1JJTkdfVFgoYnAsIHN0YXJ0X3Byb2QpXTtcbitcdFx0dHhfYnVmLVx1MDAzZWlzX3B1c2ggPSAwO1xuK1x0XHR0eF9idWYtXHUwMDNlaW5saW5lX2RhdGFfYmRzID0gMDtcbitcdFx0V1JJVEVfT05DRSh0eHItXHUwMDNldHhfcHJvZCwgc3RhcnRfcHJvZCk7XG4rXHR9XG4gXHRpZiAodHhyLVx1MDAzZWtpY2tfcGVuZGluZylcbiBcdFx0Ym54dF90eHJfZGJfa2ljayhicCwgdHhyLCB0eHItXHUwMDNldHhfcHJvZCk7XG4tXHR0eHItXHUwMDNldHhfYnVmX3JpbmdbUklOR19UWChicCwgdHhyLVx1MDAzZXR4X3Byb2QpXS5za2IgPSBOVUxMO1xuIFx0ZGV2X2NvcmVfc3RhdHNfdHhfZHJvcHBlZF9pbmMoZGV2KTtcbiBcdHJldHVybiBORVRERVZfVFhfT0s7XG4gfVxuQEAgLTgzMyw3ICs4NTYsNyBAQCBzdGF0aWMgYm9vbCBfX2JueHRfdHhfaW50KHN0cnVjdCBibnh0ICpicCwgc3RydWN0IGJueHRfdHhfcmluZ19pbmZvICp0eHIsXG4gXHRcdGhlYWRfYnVmID0gdHhfYnVmO1xuIFx0XHRza2IgPSB0eF9idWYtXHUwMDNlc2tiO1xuIFxuLVx0XHRpZiAodW5saWtlbHkoIXNrYikpIHtcbitcdFx0aWYgKHVubGlrZWx5KCFza2IgXHUwMDI2XHUwMDI2ICF0eF9idWYtXHUwMDNlaXNfcHVzaCkpIHtcbiBcdFx0XHRibnh0X3NjaGVkX3Jlc2V0X3R4cihicCwgdHhyLCBjb25zKTtcbiBcdFx0XHRyZXR1cm4gcmM7XG4gXHRcdH1cbkBAIC04NDUsMTMgKzg2OCwyMiBAQCBzdGF0aWMgYm9vbCBfX2JueHRfdHhfaW50KHN0cnVjdCBibnh0ICpicCwgc3RydWN0IGJueHRfdHhfcmluZ19pbmZvICp0eHIsXG4gXHRcdH1cbiBcbiBcdFx0Y29ucyA9IE5FWFRfVFgoY29ucyk7XG4tXHRcdHR4X3BrdHMrKztcbi1cdFx0dHhfYnl0ZXMgKz0gc2tiLVx1MDAzZWxlbjtcbitcdFx0aWYgKHNrYikge1xuK1x0XHRcdHR4X3BrdHMrKztcbitcdFx0XHR0eF9ieXRlcyArPSBza2ItXHUwMDNlbGVuO1xuK1x0XHR9XG4gXHRcdHR4X2J1Zi1cdTAwM2Vza2IgPSBOVUxMO1xuIFx0XHR0eF9idWYtXHUwMDNlaXNfdHNfcGt0ID0gMDtcbiBcbiBcdFx0aWYgKHR4X2J1Zi1cdTAwM2Vpc19wdXNoKSB7XG4gXHRcdFx0dHhfYnVmLVx1MDAzZWlzX3B1c2ggPSAwO1xuK1x0XHRcdGNvbnMgKz0gdHhfYnVmLVx1MDAzZWlubGluZV9kYXRhX2JkcztcbitcdFx0XHR0eF9idWYtXHUwMDNlaW5saW5lX2RhdGFfYmRzID0gMDtcbitcdFx0XHRpZiAoIXNrYikge1xuK1x0XHRcdFx0LyogcHJlc3luYyBCRCAqL1xuK1x0XHRcdFx0Y29ucyA9IE5FWFRfVFgoY29ucyk7XG4rXHRcdFx0XHRjb250aW51ZTtcbitcdFx0XHR9XG4gXHRcdFx0Z290byBuZXh0X3R4X2ludDtcbiBcdFx0fVxuIFxuQEAgLTMxMTMsNiArMzE0NSw5IEBAIHN0YXRpYyBpbnQgX19ibnh0X3BvbGxfd29yayhzdHJ1Y3QgYm54dCAqYnAsIHN0cnVjdCBibnh0X2NwX3JpbmdfaW5mbyAqY3ByLFxuIFx0XHRcdFx0cnhfcGt0cysrO1xuIFx0XHRcdGVsc2UgaWYgKHJjID09IC1FQlVTWSlcdC8qIHBhcnRpYWwgY29tcGxldGlvbiAqL1xuIFx0XHRcdFx0YnJlYWs7XG4rXHRcdH0gZWxzZSBpZiAoY21wX3R5cGUgPT0gQ01QX1RZUEVfTVBDX0NNUCkge1xuK1x0XHRcdGlmIChibnh0X21wY19jbXAoYnAsIGNwciwgXHUwMDI2cmF3X2NvbnMpKVxuK1x0XHRcdFx0YnJlYWs7XG4gXHRcdH0gZWxzZSBpZiAodW5saWtlbHkoY21wX3R5cGUgPT0gQ01QTF9CQVNFX1RZUEVfSFdSTV9ET05FIHx8XG4gXHRcdFx0XHQgICAgY21wX3R5cGUgPT0gQ01QTF9CQVNFX1RZUEVfSFdSTV9GV0RfUkVRIHx8XG4gXHRcdFx0XHQgICAgY21wX3R5cGUgPT0gQ01QTF9CQVNFX1RZUEVfSFdSTV9BU1lOQ19FVkVOVCkpIHtcbkBAIC0zNjg0LDcgKzM3MTksNyBAQCBzdGF0aWMgc2l6ZV90IF9fYm54dF9jb3B5X3Jpbmcoc3RydWN0IGJueHQgKmJwLCBzdHJ1Y3QgYm54dF9yaW5nX21lbV9pbmZvICpybWVtLFxuIFx0cmV0dXJuIHRvdGFsX2xlbjtcbiB9XG4gXG4tc3RhdGljIHZvaWQgYm54dF9mcmVlX3Jpbmcoc3RydWN0IGJueHQgKmJwLCBzdHJ1Y3QgYm54dF9yaW5nX21lbV9pbmZvICpybWVtKVxuK3ZvaWQgYm54dF9mcmVlX3Jpbmcoc3RydWN0IGJueHQgKmJwLCBzdHJ1Y3QgYm54dF9yaW5nX21lbV9pbmZvICpybWVtKVxuIHtcbiBcdHN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gYnAtXHUwMDNlcGRldjtcbiBcdGludCBpO1xuQEAgLTM3MTcsNyArMzc1Miw3IEBAIHN0YXRpYyB2b2lkIGJueHRfZnJlZV9yaW5nKHN0cnVjdCBibnh0ICpicCwgc3RydWN0IGJueHRfcmluZ19tZW1faW5mbyAqcm1lbSlcbiBcdH1cbiB9XG4gXG4tc3RhdGljIGludCBibnh0X2FsbG9jX3Jpbmcoc3RydWN0IGJueHQgKmJwLCBzdHJ1Y3QgYm54dF9yaW5nX21lbV9pbmZvICpybWVtKVxuK2ludCBibnh0X2FsbG9jX3Jpbmcoc3RydWN0IGJueHQgKmJwLCBzdHJ1Y3QgYm54dF9yaW5nX21lbV9pbmZvICpybWVtKVxuIHtcbiBcdHN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gYnAtXHUwMDNlcGRldjtcbiBcdHU2NCB2YWxpZF9iaXQgPSAwO1xuQEAgLTQwNzksNiArNDExNCw4IEBAIHN0YXRpYyB2b2lkIGJueHRfZnJlZV90eF9yaW5ncyhzdHJ1Y3QgYm54dCAqYnApXG4gXG4gXHRcdGJueHRfZnJlZV90eF9pbmxpbmVfYnVmKHR4ciwgcGRldik7XG4gXG4rXHRcdGJueHRfa3Rsc19mcmVlX3R4X3Jpbmdfc3RhdHModHhyKTtcbitcbiBcdFx0cmluZyA9IFx1MDAyNnR4ci1cdTAwM2V0eF9yaW5nX3N0cnVjdDtcbiBcbiBcdFx0Ym54dF9mcmVlX3JpbmcoYnAsIFx1MDAyNnJpbmctXHUwMDNlcmluZ19tZW0pO1xuQEAgLTQxNTMsNyArNDE5MCwxMCBAQCBzdGF0aWMgaW50IGJueHRfYWxsb2NfdHhfcmluZ3Moc3RydWN0IGJueHQgKmJwKVxuIFx0XHR9XG4gXHRcdHFpZHggPSBicC1cdTAwM2V0Y190b19xaWR4W2pdO1xuIFx0XHRyaW5nLVx1MDAzZXF1ZXVlX2lkID0gYnAtXHUwMDNlcV9pbmZvW3FpZHhdLnF1ZXVlX2lkO1xuLVx0XHRzcGluX2xvY2tfaW5pdChcdTAwMjZ0eHItXHUwMDNleGRwX3R4X2xvY2spO1xuK1x0XHRzcGluX2xvY2tfaW5pdChcdTAwMjZ0eHItXHUwMDNldHhfbG9jayk7XG4rXHRcdHJjID0gYm54dF9rdGxzX2FsbG9jX3R4X3Jpbmdfc3RhdHMoYnAsIHR4cik7XG4rXHRcdGlmIChyYylcbitcdFx0XHRyZXR1cm4gcmM7XG4gXHRcdGlmIChpIFx1MDAzYyBicC1cdTAwM2V0eF9ucl9yaW5nc194ZHApXG4gXHRcdFx0Y29udGludWU7XG4gXHRcdGlmIChCTlhUX1JJTkdfVE9fVENfT0ZGKGJwLCBpKSA9PSAoYnAtXHUwMDNldHhfbnJfcmluZ3NfcGVyX3RjIC0gMSkpXG5AQCAtNDMyNCw2ICs0MzY0LDggQEAgc3RhdGljIGludCBibnh0X2FsbG9jX2NwX3JpbmdzKHN0cnVjdCBibnh0ICpicClcbiBcdFx0XHQgKCFzaCBcdTAwMjZcdTAwMjYgaSBcdTAwM2U9IGJwLVx1MDAzZXJ4X25yX3JpbmdzKSkge1xuIFx0XHRcdGNwX2NvdW50ICs9IHRjcztcbiBcdFx0XHR0eCA9IDE7XG4rXHRcdFx0aWYgKGJueHRfbmFwaV9oYXNfbXBjKGJwLCBpKSlcbitcdFx0XHRcdGNwX2NvdW50Kys7XG4gXHRcdH1cbiBcbiBcdFx0Y3ByLVx1MDAzZWNwX3JpbmdfYXJyID0ga3phbGxvY19vYmpzKCpjcHIsIGNwX2NvdW50KTtcbkBAIC00MzQ1LDYgKzQzODcsMTEgQEAgc3RhdGljIGludCBibnh0X2FsbG9jX2NwX3JpbmdzKHN0cnVjdCBibnh0ICpicClcbiBcdFx0XHR9IGVsc2Uge1xuIFx0XHRcdFx0aW50IG4sIHRjID0gayAtIHJ4O1xuIFxuK1x0XHRcdFx0LyogTVBDIHJpbmdzIGFyZSBhdCB0aGUgaGlnaGVzdCBrIGluZGljZXMgKi9cbitcdFx0XHRcdGlmICh0YyBcdTAwM2U9IHRjcykge1xuK1x0XHRcdFx0XHRibnh0X3NldF9tcGNfY3BfcmluZyhicCwgaSwgY3ByMik7XG4rXHRcdFx0XHRcdGNvbnRpbnVlO1xuK1x0XHRcdFx0fVxuIFx0XHRcdFx0biA9IEJOWFRfVENfVE9fUklOR19CQVNFKGJwLCB0YykgKyBqO1xuIFx0XHRcdFx0YnAtXHUwMDNldHhfcmluZ1tuXS50eF9jcHIgPSBjcHIyO1xuIFx0XHRcdFx0Y3ByMi1cdTAwM2VjcF9yaW5nX3R5cGUgPSBCTlhUX05RX0hETF9UWVBFX1RYO1xuQEAgLTQ0NzcsNiArNDUyNCw3IEBAIHN0YXRpYyB2b2lkIGJueHRfaW5pdF9yaW5nX3N0cnVjdChzdHJ1Y3QgYm54dCAqYnApXG4gXHRcdFx0cm1lbS1cdTAwM2V2bWVtID0gKHZvaWQgKiopXHUwMDI2dHhyLVx1MDAzZXR4X2J1Zl9yaW5nO1xuIFx0XHR9XG4gXHR9XG4rXHRibnh0X2luaXRfbXBjX3Jpbmdfc3RydWN0KGJwKTtcbiB9XG4gXG4gc3RhdGljIHZvaWQgYm54dF9pbml0X3J4YmRfcGFnZXMoc3RydWN0IGJueHRfcmluZ19zdHJ1Y3QgKnJpbmcsIHUzMiB0eXBlKVxuQEAgLTU1NTMsNiArNTYwMSw3IEBAIHN0YXRpYyB2b2lkIGJueHRfaW5pdF9sMl9mbHRyX3RibChzdHJ1Y3QgYm54dCAqYnApXG4gc3RhdGljIHZvaWQgYm54dF9mcmVlX21lbShzdHJ1Y3QgYm54dCAqYnAsIGJvb2wgaXJxX3JlX2luaXQpXG4ge1xuIFx0Ym54dF9mcmVlX3ZuaWNfYXR0cmlidXRlcyhicCk7XG4rXHRibnh0X2ZyZWVfbXBjX3JpbmdzKGJwKTtcbiBcdGJueHRfZnJlZV90eF9yaW5ncyhicCk7XG4gXHRibnh0X2ZyZWVfcnhfcmluZ3MoYnApO1xuIFx0Ym54dF9mcmVlX2NwX3JpbmdzKGJwKTtcbkBAIC01NTY2LDYgKzU2MTUsNyBAQCBzdGF0aWMgdm9pZCBibnh0X2ZyZWVfbWVtKHN0cnVjdCBibnh0ICpicCwgYm9vbCBpcnFfcmVfaW5pdClcbiBcdFx0XHRibnh0X2ZyZWVfcG9ydF9zdGF0cyhicCk7XG4gXHRcdGJueHRfZnJlZV9yaW5nX2dycHMoYnApO1xuIFx0XHRibnh0X2ZyZWVfdm5pY3MoYnApO1xuK1x0XHRibnh0X2ZyZWVfbXBjcyhicCk7XG4gXHRcdGtmcmVlKGJwLVx1MDAzZXR4X3JpbmdfbWFwKTtcbiBcdFx0YnAtXHUwMDNldHhfcmluZ19tYXAgPSBOVUxMO1xuIFx0XHRrZnJlZShicC1cdTAwM2V0eF9yaW5nKTtcbkBAIC01Njc1LDYgKzU3MjUsMTAgQEAgc3RhdGljIGludCBibnh0X2FsbG9jX21lbShzdHJ1Y3QgYm54dCAqYnAsIGJvb2wgaXJxX3JlX2luaXQpXG4gXHRcdFx0XHR0eHItXHUwMDNldHhfY3ByID0gXHUwMDI2Ym5hcGkyLVx1MDAzZWNwX3Jpbmc7XG4gXHRcdH1cbiBcbitcdFx0cmMgPSBibnh0X2FsbG9jX21wY3MoYnApO1xuK1x0XHRpZiAocmMpXG4rXHRcdFx0Z290byBhbGxvY19tZW1fZXJyO1xuK1xuIFx0XHRyYyA9IGJueHRfYWxsb2Nfc3RhdHMoYnApO1xuIFx0XHRpZiAocmMpXG4gXHRcdFx0Z290byBhbGxvY19tZW1fZXJyO1xuQEAgLTU3MDMsNiArNTc1NywxMCBAQCBzdGF0aWMgaW50IGJueHRfYWxsb2NfbWVtKHN0cnVjdCBibnh0ICpicCwgYm9vbCBpcnFfcmVfaW5pdClcbiBcdGlmIChyYylcbiBcdFx0Z290byBhbGxvY19tZW1fZXJyO1xuIFxuK1x0cmMgPSBibnh0X2FsbG9jX21wY19yaW5ncyhicCk7XG4rXHRpZiAocmMpXG4rXHRcdGdvdG8gYWxsb2NfbWVtX2VycjtcbitcbiBcdHJjID0gYm54dF9hbGxvY19jcF9yaW5ncyhicCk7XG4gXHRpZiAocmMpXG4gXHRcdGdvdG8gYWxsb2NfbWVtX2VycjtcbkBAIC03MjU3LDEwICs3MzE1LDE1IEBAIHN0YXRpYyBpbnQgaHdybV9yaW5nX2FsbG9jX3NlbmRfbXNnKHN0cnVjdCBibnh0ICpicCxcbiBcdFx0cmVxLVx1MDAzZWNtcGxfcmluZ19pZCA9IGNwdV90b19sZTE2KGJueHRfY3BfcmluZ19mb3JfdHgoYnAsIHR4cikpO1xuIFx0XHRyZXEtXHUwMDNlbGVuZ3RoID0gY3B1X3RvX2xlMzIoYnAtXHUwMDNldHhfcmluZ19tYXNrICsgMSk7XG4gXHRcdHJlcS1cdTAwM2VzdGF0X2N0eF9pZCA9IGNwdV90b19sZTMyKGdycF9pbmZvLVx1MDAzZWZ3X3N0YXRzX2N0eCk7XG4tXHRcdHJlcS1cdTAwM2VxdWV1ZV9pZCA9IGNwdV90b19sZTE2KHJpbmctXHUwMDNlcXVldWVfaWQpO1xuLVx0XHRpZiAoYnAtXHUwMDNlZmxhZ3MgXHUwMDI2IEJOWFRfRkxBR19UWF9DT0FMX0NNUEwpXG4tXHRcdFx0cmVxLVx1MDAzZWNtcGxfY29hbF9jbnQgPVxuLVx0XHRcdFx0UklOR19BTExPQ19SRVFfQ01QTF9DT0FMX0NOVF9DT0FMXzY0O1xuK1x0XHRpZiAocmluZy1cdTAwM2VxdWV1ZV9pZCA9PSBCTlhUX01QQ19RVUVVRV9JRCkge1xuK1x0XHRcdHJlcS1cdTAwM2VtcGNfY2hubHNfdHlwZSA9IHJpbmctXHUwMDNlbXBjX2NobmxfdHlwZTtcbitcdFx0XHRyZXEtXHUwMDNlZW5hYmxlcyB8PSBjcHVfdG9fbGUzMihSSU5HX0FMTE9DX1JFUV9FTkFCTEVTX01QQ19DSE5MU19UWVBFKTtcbitcdFx0fSBlbHNlIHtcbitcdFx0XHRyZXEtXHUwMDNlcXVldWVfaWQgPSBjcHVfdG9fbGUxNihyaW5nLVx1MDAzZXF1ZXVlX2lkKTtcbitcdFx0XHRpZiAoYnAtXHUwMDNlZmxhZ3MgXHUwMDI2IEJOWFRfRkxBR19UWF9DT0FMX0NNUEwpXG4rXHRcdFx0XHRyZXEtXHUwMDNlY21wbF9jb2FsX2NudCA9XG4rXHRcdFx0XHRcdFJJTkdfQUxMT0NfUkVRX0NNUExfQ09BTF9DTlRfQ09BTF82NDtcbitcdFx0fVxuIFx0XHRpZiAoKGJwLVx1MDAzZWZ3X2NhcCBcdTAwMjYgQk5YVF9GV19DQVBfVFhfVFNfQ01QKSBcdTAwMjZcdTAwMjYgYnAtXHUwMDNlcHRwX2NmZylcbiBcdFx0XHRmbGFncyB8PSBSSU5HX0FMTE9DX1JFUV9GTEFHU19UWF9QS1RfVFNfQ01QTF9FTkFCTEU7XG4gXHRcdHJlcS1cdTAwM2VmbGFncyA9IGNwdV90b19sZTE2KGZsYWdzKTtcbkBAIC03NDU1LDggKzc1MTgsNyBAQCBzdGF0aWMgaW50IGJueHRfaHdybV9yeF9hZ2dfcmluZ19hbGxvYyhzdHJ1Y3QgYm54dCAqYnAsXG4gXHRyZXR1cm4gMDtcbiB9XG4gXG4tc3RhdGljIGludCBibnh0X2h3cm1fY3BfcmluZ19hbGxvY19wNShzdHJ1Y3QgYm54dCAqYnAsXG4tXHRcdFx0XHQgICAgICBzdHJ1Y3QgYm54dF9jcF9yaW5nX2luZm8gKmNwcilcbitpbnQgYm54dF9od3JtX2NwX3JpbmdfYWxsb2NfcDUoc3RydWN0IGJueHQgKmJwLCBzdHJ1Y3QgYm54dF9jcF9yaW5nX2luZm8gKmNwcilcbiB7XG4gXHRjb25zdCB1MzIgdHlwZSA9IEhXUk1fUklOR19BTExPQ19DTVBMO1xuIFx0c3RydWN0IGJueHRfbmFwaSAqYm5hcGkgPSBjcHItXHUwMDNlYm5hcGk7XG5AQCAtNzQ3NCw4ICs3NTM2LDggQEAgc3RhdGljIGludCBibnh0X2h3cm1fY3BfcmluZ19hbGxvY19wNShzdHJ1Y3QgYm54dCAqYnAsXG4gXHRyZXR1cm4gMDtcbiB9XG4gXG4tc3RhdGljIGludCBibnh0X2h3cm1fdHhfcmluZ19hbGxvYyhzdHJ1Y3QgYm54dCAqYnAsXG4tXHRcdFx0XHQgICBzdHJ1Y3QgYm54dF90eF9yaW5nX2luZm8gKnR4ciwgdTMyIHR4X2lkeClcbitpbnQgYm54dF9od3JtX3R4X3JpbmdfYWxsb2Moc3RydWN0IGJueHQgKmJwLCBzdHJ1Y3QgYm54dF90eF9yaW5nX2luZm8gKnR4cixcbitcdFx0XHQgICAgdTMyIHR4X2lkeClcbiB7XG4gXHRzdHJ1Y3QgYm54dF9yaW5nX3N0cnVjdCAqcmluZyA9IFx1MDAyNnR4ci1cdTAwM2V0eF9yaW5nX3N0cnVjdDtcbiBcdGNvbnN0IHUzMiB0eXBlID0gSFdSTV9SSU5HX0FMTE9DX1RYO1xuQEAgLTc1NjAsNiArNzYyMiw5IEBAIHN0YXRpYyBpbnQgYm54dF9od3JtX3JpbmdfYWxsb2Moc3RydWN0IGJueHQgKmJwKVxuIFx0XHRcdFx0Z290byBlcnJfb3V0O1xuIFx0XHR9XG4gXHR9XG4rXG4rXHRyYyA9IGJueHRfaHdybV9tcGNfcmluZ19hbGxvYyhicCk7XG4rXG4gZXJyX291dDpcbiBcdHJldHVybiByYztcbiB9XG5AQCAtNzYxNyw5ICs3NjgyLDggQEAgc3RhdGljIGludCBod3JtX3JpbmdfZnJlZV9zZW5kX21zZyhzdHJ1Y3QgYm54dCAqYnAsXG4gXHRyZXR1cm4gMDtcbiB9XG4gXG4tc3RhdGljIHZvaWQgYm54dF9od3JtX3R4X3JpbmdfZnJlZShzdHJ1Y3QgYm54dCAqYnAsXG4tXHRcdFx0XHQgICBzdHJ1Y3QgYm54dF90eF9yaW5nX2luZm8gKnR4cixcbi1cdFx0XHRcdCAgIGJvb2wgY2xvc2VfcGF0aClcbit2b2lkIGJueHRfaHdybV90eF9yaW5nX2ZyZWUoc3RydWN0IGJueHQgKmJwLCBzdHJ1Y3QgYm54dF90eF9yaW5nX2luZm8gKnR4cixcbitcdFx0XHQgICAgYm9vbCBjbG9zZV9wYXRoKVxuIHtcbiBcdHN0cnVjdCBibnh0X3Jpbmdfc3RydWN0ICpyaW5nID0gXHUwMDI2dHhyLVx1MDAzZXR4X3Jpbmdfc3RydWN0O1xuIFx0dTMyIGNtcGxfcmluZ19pZDtcbkBAIC03Njc4LDggKzc3NDIsNyBAQCBzdGF0aWMgdm9pZCBibnh0X2h3cm1fcnhfYWdnX3JpbmdfZnJlZShzdHJ1Y3QgYm54dCAqYnAsXG4gXHRicC1cdTAwM2VncnBfaW5mb1tncnBfaWR4XS5hZ2dfZndfcmluZ19pZCA9IElOVkFMSURfSFdfUklOR19JRDtcbiB9XG4gXG4tc3RhdGljIHZvaWQgYm54dF9od3JtX2NwX3JpbmdfZnJlZShzdHJ1Y3QgYm54dCAqYnAsXG4tXHRcdFx0XHQgICBzdHJ1Y3QgYm54dF9jcF9yaW5nX2luZm8gKmNwcilcbit2b2lkIGJueHRfaHdybV9jcF9yaW5nX2ZyZWUoc3RydWN0IGJueHQgKmJwLCBzdHJ1Y3QgYm54dF9jcF9yaW5nX2luZm8gKmNwcilcbiB7XG4gXHRzdHJ1Y3QgYm54dF9yaW5nX3N0cnVjdCAqcmluZztcbiBcbkBAIC03NjkyLDcgKzc3NTUsNyBAQCBzdGF0aWMgdm9pZCBibnh0X2h3cm1fY3BfcmluZ19mcmVlKHN0cnVjdCBibnh0ICpicCxcbiBcdHJpbmctXHUwMDNlZndfcmluZ19pZCA9IElOVkFMSURfSFdfUklOR19JRDtcbiB9XG4gXG4tc3RhdGljIHZvaWQgYm54dF9jbGVhcl9vbmVfY3BfcmluZyhzdHJ1Y3QgYm54dCAqYnAsIHN0cnVjdCBibnh0X2NwX3JpbmdfaW5mbyAqY3ByKVxuK3ZvaWQgYm54dF9jbGVhcl9vbmVfY3BfcmluZyhzdHJ1Y3QgYm54dCAqYnAsIHN0cnVjdCBibnh0X2NwX3JpbmdfaW5mbyAqY3ByKVxuIHtcbiBcdHN0cnVjdCBibnh0X3Jpbmdfc3RydWN0ICpyaW5nID0gXHUwMDI2Y3ByLVx1MDAzZWNwX3Jpbmdfc3RydWN0O1xuIFx0aW50IGksIHNpemUgPSByaW5nLVx1MDAzZXJpbmdfbWVtLnBhZ2Vfc2l6ZTtcbkBAIC03NzEzLDYgKzc3NzYsOCBAQCBzdGF0aWMgdm9pZCBibnh0X2h3cm1fcmluZ19mcmVlKHN0cnVjdCBibnh0ICpicCwgYm9vbCBjbG9zZV9wYXRoKVxuIFx0aWYgKCFicC1cdTAwM2VibmFwaSlcbiBcdFx0cmV0dXJuO1xuIFxuK1x0Ym54dF9od3JtX21wY19yaW5nX2ZyZWUoYnAsIGNsb3NlX3BhdGgpO1xuK1xuIFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgYnAtXHUwMDNldHhfbnJfcmluZ3M7IGkrKylcbiBcdFx0Ym54dF9od3JtX3R4X3JpbmdfZnJlZShicCwgXHUwMDI2YnAtXHUwMDNldHhfcmluZ1tpXSwgY2xvc2VfcGF0aCk7XG4gXG5AQCAtNzc1MSw2ICs3ODE2LDExIEBAIHN0YXRpYyB2b2lkIGJueHRfaHdybV9yaW5nX2ZyZWUoc3RydWN0IGJueHQgKmJwLCBib29sIGNsb3NlX3BhdGgpXG4gXHR9XG4gfVxuIFxuK2ludCBibnh0X3RvdGFsX3R4X3JpbmdzKHN0cnVjdCBibnh0ICpicClcbit7XG4rXHRyZXR1cm4gYnAtXHUwMDNldHhfbnJfcmluZ3MgKyBibnh0X21wY190eF9yaW5nc19pbl91c2UoYnApO1xuK31cbitcbiBzdGF0aWMgaW50IF9fYm54dF90cmltX3JpbmdzKHN0cnVjdCBibnh0ICpicCwgaW50ICpyeCwgaW50ICp0eCwgaW50IG1heCxcbiBcdFx0XHQgICAgIGJvb2wgc2hhcmVkKTtcbiBzdGF0aWMgaW50IGJueHRfdHJpbV9yaW5ncyhzdHJ1Y3QgYm54dCAqYnAsIGludCAqcngsIGludCAqdHgsIGludCBtYXgsXG5AQCAtNzc1OSw2ICs3ODI5LDcgQEAgc3RhdGljIGludCBibnh0X3RyaW1fcmluZ3Moc3RydWN0IGJueHQgKmJwLCBpbnQgKnJ4LCBpbnQgKnR4LCBpbnQgbWF4LFxuIHN0YXRpYyBpbnQgYm54dF9od3JtX2dldF9yaW5ncyhzdHJ1Y3QgYm54dCAqYnApXG4ge1xuIFx0c3RydWN0IGJueHRfaHdfcmVzYyAqaHdfcmVzYyA9IFx1MDAyNmJwLVx1MDAzZWh3X3Jlc2M7XG4rXHRzdHJ1Y3QgYm54dF9od19jcnlwdG9fcmVzYyAqY3J5cHRvX3Jlc2M7XG4gXHRzdHJ1Y3QgaHdybV9mdW5jX3FjZmdfb3V0cHV0ICpyZXNwO1xuIFx0c3RydWN0IGh3cm1fZnVuY19xY2ZnX2lucHV0ICpyZXE7XG4gXHRpbnQgcmM7XG5AQCAtNzc5MSwyNSArNzg2MiwzOCBAQCBzdGF0aWMgaW50IGJueHRfaHdybV9nZXRfcmluZ3Moc3RydWN0IGJueHQgKmJwKVxuIFx0XHRzdGF0cyA9IGxlMTZfdG9fY3B1KHJlc3AtXHUwMDNlYWxsb2Nfc3RhdF9jdHgpO1xuIFx0XHRod19yZXNjLVx1MDAzZXJlc3ZfaXJxcyA9IGNwO1xuIFx0XHRpZiAoYnAtXHUwMDNlZmxhZ3MgXHUwMDI2IEJOWFRfRkxBR19DSElQX1A1X1BMVVMpIHtcbitcdFx0XHRpbnQgbXBjX3R4ID0gYm54dF9tcGNfdHhfcmluZ3NfaW5fdXNlKGJwKTtcbitcdFx0XHRpbnQgbXBjX2NwID0gYm54dF9tcGNfY3BfcmluZ3NfaW5fdXNlKGJwKTtcbiBcdFx0XHRpbnQgcnggPSBod19yZXNjLVx1MDAzZXJlc3ZfcnhfcmluZ3M7XG4gXHRcdFx0aW50IHR4ID0gaHdfcmVzYy1cdTAwM2VyZXN2X3R4X3JpbmdzO1xuK1x0XHRcdGludCBjcF9wNTtcbiBcbitcdFx0XHRpZiAodHggXHUwMDNjPSBtcGNfdHggfHwgY3AgXHUwMDNjPSBtcGNfY3ApIHtcbitcdFx0XHRcdHJjID0gLUVOT01FTTtcbitcdFx0XHRcdGdvdG8gZ2V0X3JpbmdzX2V4aXQ7XG4rXHRcdFx0fVxuK1x0XHRcdHR4IC09IG1wY190eDtcbitcdFx0XHRjcF9wNSA9IGNwIC0gbXBjX2NwO1xuIFx0XHRcdGlmIChicC1cdTAwM2VmbGFncyBcdTAwMjYgQk5YVF9GTEFHX0FHR19SSU5HUylcbiBcdFx0XHRcdHJ4IFx1MDAzZVx1MDAzZT0gMTtcbi1cdFx0XHRpZiAoY3AgXHUwMDNjIChyeCArIHR4KSkge1xuLVx0XHRcdFx0cmMgPSBfX2JueHRfdHJpbV9yaW5ncyhicCwgXHUwMDI2cngsIFx1MDAyNnR4LCBjcCwgZmFsc2UpO1xuK1x0XHRcdGlmIChjcF9wNSBcdTAwM2MgKHJ4ICsgdHgpKSB7XG4rXHRcdFx0XHRyYyA9IF9fYm54dF90cmltX3JpbmdzKGJwLCBcdTAwMjZyeCwgXHUwMDI2dHgsIGNwX3A1LCBmYWxzZSk7XG4gXHRcdFx0XHRpZiAocmMpXG4gXHRcdFx0XHRcdGdvdG8gZ2V0X3JpbmdzX2V4aXQ7XG4gXHRcdFx0XHRpZiAoYnAtXHUwMDNlZmxhZ3MgXHUwMDI2IEJOWFRfRkxBR19BR0dfUklOR1MpXG4gXHRcdFx0XHRcdHJ4IFx1MDAzY1x1MDAzYz0gMTtcbiBcdFx0XHRcdGh3X3Jlc2MtXHUwMDNlcmVzdl9yeF9yaW5ncyA9IHJ4O1xuLVx0XHRcdFx0aHdfcmVzYy1cdTAwM2VyZXN2X3R4X3JpbmdzID0gdHg7XG4rXHRcdFx0XHRod19yZXNjLVx1MDAzZXJlc3ZfdHhfcmluZ3MgPSB0eCArIG1wY190eDtcbiBcdFx0XHR9XG4gXHRcdFx0aHdfcmVzYy1cdTAwM2VyZXN2X2lycXMgPSBsZTE2X3RvX2NwdShyZXNwLVx1MDAzZWFsbG9jX21zaXgpO1xuIFx0XHRcdGh3X3Jlc2MtXHUwMDNlcmVzdl9od19yaW5nX2dycHMgPSByeDtcbiBcdFx0fVxuIFx0XHRod19yZXNjLVx1MDAzZXJlc3ZfY3BfcmluZ3MgPSBjcDtcbiBcdFx0aHdfcmVzYy1cdTAwM2VyZXN2X3N0YXRfY3R4cyA9IHN0YXRzO1xuK1xuK1x0XHRjcnlwdG9fcmVzYyA9IFx1MDAyNmh3X3Jlc2MtXHUwMDNlY3J5cHRvX3Jlc2M7XG4rXHRcdGNyeXB0b19yZXNjLVx1MDAzZXJlc3ZfdHhfa2V5X2N0eHMgPSBsZTMyX3RvX2NwdShyZXNwLVx1MDAzZW51bV9rdGxzX3R4X2tleV9jdHhzKTtcbitcdFx0Y3J5cHRvX3Jlc2MtXHUwMDNlcmVzdl9yeF9rZXlfY3R4cyA9IGxlMzJfdG9fY3B1KHJlc3AtXHUwMDNlbnVtX2t0bHNfcnhfa2V5X2N0eHMpO1xuIFx0fVxuIGdldF9yaW5nc19leGl0OlxuIFx0aHdybV9yZXFfZHJvcChicCwgcmVxKTtcbkBAIC03ODgwLDggKzc5NjQsOSBAQCBfX2JueHRfaHdybV9yZXNlcnZlX3BmX3JpbmdzKHN0cnVjdCBibnh0ICpicCwgc3RydWN0IGJueHRfaHdfcmluZ3MgKmh3cilcbiBcdFx0fVxuIFx0XHRyZXEtXHUwMDNlbnVtX3N0YXRfY3R4cyA9IGNwdV90b19sZTE2KGh3ci1cdTAwM2VzdGF0KTtcbiBcdFx0cmVxLVx1MDAzZW51bV92bmljcyA9IGNwdV90b19sZTE2KGh3ci1cdTAwM2V2bmljKTtcbitcdFx0Ym54dF9od3JtX3Jlc2VydmVfcGZfa2V5X2N0eHMoYnAsIHJlcSk7XG4gXHR9XG4tXHRyZXEtXHUwMDNlZW5hYmxlcyA9IGNwdV90b19sZTMyKGVuYWJsZXMpO1xuK1x0cmVxLVx1MDAzZWVuYWJsZXMgfD0gY3B1X3RvX2xlMzIoZW5hYmxlcyk7XG4gXHRyZXR1cm4gcmVxO1xuIH1cbiBcbkBAIC03OTk1LDcgKzgwODAsNyBAQCBzdGF0aWMgaW50IGJueHRfY3BfcmluZ3NfaW5fdXNlKHN0cnVjdCBibnh0ICpicClcbiBcdFx0cmV0dXJuIGJueHRfbnFfcmluZ3NfaW5fdXNlKGJwKTtcbiBcbiBcdGNwID0gYnAtXHUwMDNldHhfbnJfcmluZ3MgKyBicC1cdTAwM2VyeF9ucl9yaW5ncztcbi1cdHJldHVybiBjcDtcbitcdHJldHVybiBjcCArIGJueHRfbXBjX2NwX3JpbmdzX2luX3VzZShicCk7XG4gfVxuIFxuIHN0YXRpYyBpbnQgYm54dF9nZXRfZnVuY19zdGF0X2N0eHMoc3RydWN0IGJueHQgKmJwKVxuQEAgLTgwNTMsNyArODEzOCw3IEBAIHN0YXRpYyB2b2lkIGJueHRfZ2V0X3RvdGFsX3Jlc291cmNlcyhzdHJ1Y3QgYm54dCAqYnAsIHN0cnVjdCBibnh0X2h3X3JpbmdzICpod3IpXG4gXHRod3ItXHUwMDNlY3BfcDUgPSAwO1xuIFx0aWYgKGJwLVx1MDAzZWZsYWdzIFx1MDAyNiBCTlhUX0ZMQUdfQ0hJUF9QNV9QTFVTKVxuIFx0XHRod3ItXHUwMDNlY3BfcDUgPSBibnh0X2NwX3JpbmdzX2luX3VzZShicCk7XG4tXHRod3ItXHUwMDNldHggPSBicC1cdTAwM2V0eF9ucl9yaW5ncztcbitcdGh3ci1cdTAwM2V0eCA9IGJueHRfdG90YWxfdHhfcmluZ3MoYnApO1xuIFx0aHdyLVx1MDAzZXJ4ID0gYnAtXHUwMDNlcnhfbnJfcmluZ3M7XG4gXHRod3ItXHUwMDNlZ3JwID0gaHdyLVx1MDAzZXJ4O1xuIFx0aHdyLVx1MDAzZXZuaWMgPSBibnh0X2dldF90b3RhbF92bmljcyhicCwgaHdyLVx1MDAzZXJ4KTtcbkBAIC04MTU5LDggKzgyNDQsMTAgQEAgc3RhdGljIGludCBfX2JueHRfcmVzZXJ2ZV9yaW5ncyhzdHJ1Y3QgYm54dCAqYnApXG4gXHRod3IucnggPSBicC1cdTAwM2VyeF9ucl9yaW5ncztcbiBcdGlmIChicC1cdTAwM2VmbGFncyBcdTAwMjYgQk5YVF9GTEFHX1NIQVJFRF9SSU5HUylcbiBcdFx0c2ggPSB0cnVlO1xuLVx0aWYgKGJwLVx1MDAzZWZsYWdzIFx1MDAyNiBCTlhUX0ZMQUdfQ0hJUF9QNV9QTFVTKVxuLVx0XHRod3IuY3BfcDUgPSBod3IucnggKyBod3IudHg7XG4rXHRpZiAoYnAtXHUwMDNlZmxhZ3MgXHUwMDI2IEJOWFRfRkxBR19DSElQX1A1X1BMVVMpIHtcbitcdFx0aHdyLmNwX3A1ID0gaHdyLnJ4ICsgaHdyLnR4ICsgYm54dF9tcGNfY3BfcmluZ3NfaW5fdXNlKGJwKTtcbitcdFx0aHdyLnR4ICs9IGJueHRfbXBjX3R4X3JpbmdzX2luX3VzZShicCk7XG4rXHR9XG4gXG4gXHRod3Iudm5pYyA9IGJueHRfZ2V0X3RvdGFsX3ZuaWNzKGJwLCBod3IucngpO1xuIFxuQEAgLTgxOTcsNiArODI4NCw5IEBAIHN0YXRpYyBpbnQgX19ibnh0X3Jlc2VydmVfcmluZ3Moc3RydWN0IGJueHQgKmJwKVxuIFx0aWYgKGJueHRfdWxwX3JlZ2lzdGVyZWQoZWRldikgXHUwMDI2XHUwMDI2IGh3ci5zdGF0IFx1MDAzZSBibnh0X2dldF91bHBfc3RhdF9jdHhzKGJwKSlcbiBcdFx0aHdyLnN0YXQgLT0gYm54dF9nZXRfdWxwX3N0YXRfY3R4cyhicCk7XG4gXHRod3IuY3AgPSBtaW5fdChpbnQsIGh3ci5jcCwgaHdyLnN0YXQpO1xuK1x0aHdyLnR4IC09IGJueHRfbXBjX3R4X3JpbmdzX2luX3VzZShicCk7XG4rXHRpZiAoaHdyLnR4IFx1MDAzYyAwKVxuK1x0XHRyZXR1cm4gLUVOT01FTTtcbiBcdHJjID0gYm54dF90cmltX3JpbmdzKGJwLCBcdTAwMjZyeF9yaW5ncywgXHUwMDI2aHdyLnR4LCBod3IuY3AsIHNoKTtcbiBcdGlmIChicC1cdTAwM2VmbGFncyBcdTAwMjYgQk5YVF9GTEFHX0FHR19SSU5HUylcbiBcdFx0aHdyLnJ4ID0gcnhfcmluZ3MgXHUwMDNjXHUwMDNjIDE7XG5AQCAtODI3OCw3ICs4MzY4LDcgQEAgc3RhdGljIGludCBibnh0X2h3cm1fY2hlY2tfdmZfcmluZ3Moc3RydWN0IGJueHQgKmJwLCBzdHJ1Y3QgYm54dF9od19yaW5ncyAqaHdyKVxuIHN0YXRpYyBpbnQgYm54dF9od3JtX2NoZWNrX3BmX3JpbmdzKHN0cnVjdCBibnh0ICpicCwgc3RydWN0IGJueHRfaHdfcmluZ3MgKmh3cilcbiB7XG4gXHRzdHJ1Y3QgaHdybV9mdW5jX2NmZ19pbnB1dCAqcmVxO1xuLVx0dTMyIGZsYWdzO1xuK1x0dTMyIGZsYWdzLCBmbGFnczIgPSAwO1xuIFxuIFx0cmVxID0gX19ibnh0X2h3cm1fcmVzZXJ2ZV9wZl9yaW5ncyhicCwgaHdyKTtcbiBcdGZsYWdzID0gRlVOQ19DRkdfUkVRX0ZMQUdTX1RYX0FTU0VUU19URVNUO1xuQEAgLTgyOTIsOSArODM4MiwxNCBAQCBzdGF0aWMgaW50IGJueHRfaHdybV9jaGVja19wZl9yaW5ncyhzdHJ1Y3QgYm54dCAqYnAsIHN0cnVjdCBibnh0X2h3X3JpbmdzICpod3IpXG4gXHRcdFx0XHQgRlVOQ19DRkdfUkVRX0ZMQUdTX05RX0FTU0VUU19URVNUO1xuIFx0XHRlbHNlXG4gXHRcdFx0ZmxhZ3MgfD0gRlVOQ19DRkdfUkVRX0ZMQUdTX1JJTkdfR1JQX0FTU0VUU19URVNUO1xuK1x0XHRpZiAocmVxLVx1MDAzZWVuYWJsZXMgXHUwMDI2XG4rXHRcdCAgICBjcHVfdG9fbGUzMihGVU5DX0NGR19SRVFfRU5BQkxFU19LVExTX1RYX0tFWV9DVFhTIHxcbitcdFx0XHRcdEZVTkNfQ0ZHX1JFUV9FTkFCTEVTX0tUTFNfUlhfS0VZX0NUWFMpKVxuK1x0XHRcdGZsYWdzMiB8PSBGVU5DX0NGR19SRVFfRkxBR1MyX0tUTFNfS0VZX0NUWF9BU1NFVFNfVEVTVDtcbiBcdH1cbiBcbiBcdHJlcS1cdTAwM2VmbGFncyA9IGNwdV90b19sZTMyKGZsYWdzKTtcbitcdHJlcS1cdTAwM2VmbGFnczIgPSBjcHVfdG9fbGUzMihmbGFnczIpO1xuIFx0cmV0dXJuIGh3cm1fcmVxX3NlbmRfc2lsZW50KGJwLCByZXEpO1xuIH1cbiBcbkBAIC05MzMxLDEyICs5NDI2LDM1IEBAIHN0YXRpYyBpbnQgYm54dF9od3JtX2Z1bmNfYmFja2luZ19zdG9yZV9jZmdfdjIoc3RydWN0IGJueHQgKmJwLFxuIFxuIHN0YXRpYyBpbnQgYm54dF9iYWNraW5nX3N0b3JlX2NmZ192MihzdHJ1Y3QgYm54dCAqYnApXG4ge1xuK1x0c3RydWN0IGJueHRfY3J5cHRvX2luZm8gKmNyeXB0byA9IGJwLVx1MDAzZWNyeXB0b19pbmZvO1xuK1x0c3RydWN0IGJueHRfbXBjX2luZm8gKm1wYyA9IGJwLVx1MDAzZW1wY19pbmZvO1xuIFx0c3RydWN0IGJueHRfY3R4X21lbV9pbmZvICpjdHggPSBicC1cdTAwM2VjdHg7XG4gXHRzdHJ1Y3QgYm54dF9jdHhfbWVtX3R5cGUgKmN0eG07XG4gXHR1MTYgbGFzdF90eXBlID0gQk5YVF9DVFhfSU5WO1xuIFx0aW50IHJjID0gMDtcbiBcdHUxNiB0eXBlO1xuIFxuK1x0aWYgKEJOWFRfU1VQUE9SVFNfS1RMUyhicCkpIHtcbitcdFx0Y3R4bSA9IFx1MDAyNmN0eC1cdTAwM2VjdHhfYXJyW0JOWFRfQ1RYX1RDS107XG4rXHRcdHJjID0gYm54dF9zZXR1cF9jdHhtX3BnX3RibHMoYnAsIGN0eG0sXG4rXHRcdFx0XHRcdCAgICAgQk5YVF9UQ0soY3J5cHRvKS5tYXhfY3R4LCAxKTtcbitcdFx0aWYgKHJjKVxuK1x0XHRcdHJldHVybiByYztcbitcdFx0Y3R4bSA9IFx1MDAyNmN0eC1cdTAwM2VjdHhfYXJyW0JOWFRfQ1RYX1JDS107XG4rXHRcdHJjID0gYm54dF9zZXR1cF9jdHhtX3BnX3RibHMoYnAsIGN0eG0sXG4rXHRcdFx0XHRcdCAgICAgQk5YVF9SQ0soY3J5cHRvKS5tYXhfY3R4LCAxKTtcbitcdFx0aWYgKHJjKVxuK1x0XHRcdHJldHVybiByYztcbitcdFx0bGFzdF90eXBlID0gQk5YVF9DVFhfUkNLO1xuK1x0fVxuK1x0aWYgKG1wYyBcdTAwMjZcdTAwMjYgbXBjLVx1MDAzZW1wY19jaG5sc19jYXApIHtcbitcdFx0Y3R4bSA9IFx1MDAyNmN0eC1cdTAwM2VjdHhfYXJyW0JOWFRfQ1RYX01UUU1dO1xuK1x0XHRyYyA9IGJueHRfc2V0dXBfY3R4bV9wZ190YmxzKGJwLCBjdHhtLCBjdHhtLVx1MDAzZW1heF9lbnRyaWVzLCAxKTtcbitcdFx0aWYgKHJjKVxuK1x0XHRcdHJldHVybiByYztcbitcdFx0bGFzdF90eXBlID0gQk5YVF9DVFhfTVRRTTtcbitcdH1cbitcbiBcdGZvciAodHlwZSA9IEJOWFRfQ1RYX1NSVDsgdHlwZSBcdTAwM2M9IEJOWFRfQ1RYX1FQQzsgdHlwZSsrKSB7XG4gXHRcdGN0eG0gPSBcdTAwMjZjdHgtXHUwMDNlY3R4X2Fyclt0eXBlXTtcbiBcdFx0aWYgKCFibnh0X2JzX3RyYWNlX2F2YWlsKGJwLCB0eXBlKSlcbkBAIC05Njg1LDYgKzk4MDMsNyBAQCBpbnQgYm54dF9od3JtX2Z1bmNfcmVzY19xY2FwcyhzdHJ1Y3QgYm54dCAqYnAsIGJvb2wgYWxsKVxuIFx0c3RydWN0IGh3cm1fZnVuY19yZXNvdXJjZV9xY2Fwc19vdXRwdXQgKnJlc3A7XG4gXHRzdHJ1Y3QgaHdybV9mdW5jX3Jlc291cmNlX3FjYXBzX2lucHV0ICpyZXE7XG4gXHRzdHJ1Y3QgYm54dF9od19yZXNjICpod19yZXNjID0gXHUwMDI2YnAtXHUwMDNlaHdfcmVzYztcbitcdHN0cnVjdCBibnh0X2h3X2NyeXB0b19yZXNjICpjcnlwdG9fcmVzYztcbiBcdGludCByYztcbiBcbiBcdHJjID0gaHdybV9yZXFfaW5pdChicCwgcmVxLCBIV1JNX0ZVTkNfUkVTT1VSQ0VfUUNBUFMpO1xuQEAgLTk3MjIsNiArOTg0MSwxMiBAQCBpbnQgYm54dF9od3JtX2Z1bmNfcmVzY19xY2FwcyhzdHJ1Y3QgYm54dCAqYnAsIGJvb2wgYWxsKVxuIFx0ICAgIGh3X3Jlc2MtXHUwMDNlbWF4X3ZuaWNzICogQk5YVF9MQVJHRV9SU1NfVE9fVk5JQ19SQVRJTylcbiBcdFx0YnAtXHUwMDNlcnNzX2NhcCB8PSBCTlhUX1JTU19DQVBfTEFSR0VfUlNTX0NUWDtcbiBcbitcdGNyeXB0b19yZXNjID0gXHUwMDI2aHdfcmVzYy1cdTAwM2VjcnlwdG9fcmVzYztcbitcdGNyeXB0b19yZXNjLVx1MDAzZW1pbl90eF9rZXlfY3R4cyA9IGxlMzJfdG9fY3B1KHJlc3AtXHUwMDNlbWluX2t0bHNfdHhfa2V5X2N0eHMpO1xuK1x0Y3J5cHRvX3Jlc2MtXHUwMDNlbWF4X3R4X2tleV9jdHhzID0gbGUzMl90b19jcHUocmVzcC1cdTAwM2VtYXhfa3Rsc190eF9rZXlfY3R4cyk7XG4rXHRjcnlwdG9fcmVzYy1cdTAwM2VtaW5fcnhfa2V5X2N0eHMgPSBsZTMyX3RvX2NwdShyZXNwLVx1MDAzZW1pbl9rdGxzX3J4X2tleV9jdHhzKTtcbitcdGNyeXB0b19yZXNjLVx1MDAzZW1heF9yeF9rZXlfY3R4cyA9IGxlMzJfdG9fY3B1KHJlc3AtXHUwMDNlbWF4X2t0bHNfcnhfa2V5X2N0eHMpO1xuK1xuIFx0aWYgKGJwLVx1MDAzZWZsYWdzIFx1MDAyNiBCTlhUX0ZMQUdfQ0hJUF9QNV9QTFVTKSB7XG4gXHRcdHUxNiBtYXhfbXNpeCA9IGxlMTZfdG9fY3B1KHJlc3AtXHUwMDNlbWF4X21zaXgpO1xuIFxuQEAgLTk4NzEsNiArOTk5NiwxMCBAQCBzdGF0aWMgaW50IF9fYm54dF9od3JtX2Z1bmNfcWNhcHMoc3RydWN0IGJueHQgKmJwKVxuIFx0XHRicC1cdTAwM2Vmd19jYXAgfD0gQk5YVF9GV19DQVBfQkFDS0lOR19TVE9SRV9WMjtcbiBcdGlmIChmbGFnc19leHQgXHUwMDI2IEZVTkNfUUNBUFNfUkVTUF9GTEFHU19FWFRfVFhfQ09BTF9DTVBMX0NBUClcbiBcdFx0YnAtXHUwMDNlZmxhZ3MgfD0gQk5YVF9GTEFHX1RYX0NPQUxfQ01QTDtcbitcdGlmIChmbGFnc19leHQgXHUwMDI2IEZVTkNfUUNBUFNfUkVTUF9GTEFHU19FWFRfS1RMU19TVVBQT1JURUQpXG4rXHRcdGJueHRfYWxsb2NfY3J5cHRvX2luZm8oYnAsIHJlc3ApO1xuK1x0ZWxzZVxuK1x0XHRicC1cdTAwM2Vmd19jYXAgXHUwMDI2PSB+Qk5YVF9GV19DQVBfS1RMUztcbiBcbiBcdGZsYWdzX2V4dDIgPSBsZTMyX3RvX2NwdShyZXNwLVx1MDAzZWZsYWdzX2V4dDIpO1xuIFx0aWYgKGZsYWdzX2V4dDIgXHUwMDI2IEZVTkNfUUNBUFNfUkVTUF9GTEFHU19FWFQyX1JYX0FMTF9QS1RTX1RJTUVTVEFNUFNfU1VQUE9SVEVEKVxuQEAgLTk5NDMsNiArMTAwNzIsMTEgQEAgc3RhdGljIGludCBfX2JueHRfaHdybV9mdW5jX3FjYXBzKHN0cnVjdCBibnh0ICpicClcbiBcdH1cbiBcdGJwLVx1MDAzZXRzb19tYXhfc2VncyA9IGxlMTZfdG9fY3B1KHJlc3AtXHUwMDNlbWF4X3Rzb19zZWdzKTtcbiBcbitcdGlmIChyZXNwLVx1MDAzZW1wY19jaG5sc19jYXApXG4rXHRcdGJueHRfYWxsb2NfbXBjX2luZm8oYnAsIHJlc3AtXHUwMDNlbXBjX2NobmxzX2NhcCk7XG4rXHRlbHNlXG4rXHRcdGJueHRfZnJlZV9tcGNfaW5mbyhicCk7XG4rXG4gaHdybV9mdW5jX3FjYXBzX2V4aXQ6XG4gXHRod3JtX3JlcV9kcm9wKGJwLCByZXEpO1xuIFx0cmV0dXJuIHJjO1xuQEAgLTExMzIxLDYgKzExNDU1LDcgQEAgc3RhdGljIGludCBibnh0X2luaXRfbmljKHN0cnVjdCBibnh0ICpicCwgYm9vbCBpcnFfcmVfaW5pdClcbiBcdGJueHRfaW5pdF9jcF9yaW5ncyhicCk7XG4gXHRibnh0X2luaXRfcnhfcmluZ3MoYnApO1xuIFx0Ym54dF9pbml0X3R4X3JpbmdzKGJwKTtcbitcdGJueHRfaW5pdF9tcGNfcmluZ3MoYnApO1xuIFx0Ym54dF9pbml0X3JpbmdfZ3JwcyhicCwgaXJxX3JlX2luaXQpO1xuIFx0Ym54dF9pbml0X3ZuaWNzKGJwKTtcbiBcbkBAIC0xMTUwOSwxNCArMTE2NDQsMTUgQEAgdW5zaWduZWQgaW50IGJueHRfZ2V0X21heF9mdW5jX2NwX3JpbmdzKHN0cnVjdCBibnh0ICpicClcbiBcdHJldHVybiBicC1cdTAwM2Vod19yZXNjLm1heF9jcF9yaW5ncztcbiB9XG4gXG4tc3RhdGljIHVuc2lnbmVkIGludCBibnh0X2dldF9tYXhfZnVuY19jcF9yaW5nc19mb3JfZW4oc3RydWN0IGJueHQgKmJwKVxuK3N0YXRpYyB1bnNpZ25lZCBpbnQgYm54dF9nZXRfbWF4X2Z1bmNfY3BfcmluZ3NfZm9yX2VuKHN0cnVjdCBibnh0ICpicCxcbitcdFx0XHRcdFx0XHQgICAgICB1bnNpZ25lZCBpbnQgbXBjX2NwKVxuIHtcbiBcdHVuc2lnbmVkIGludCBjcCA9IGJwLVx1MDAzZWh3X3Jlc2MubWF4X2NwX3JpbmdzO1xuIFxuIFx0aWYgKCEoYnAtXHUwMDNlZmxhZ3MgXHUwMDI2IEJOWFRfRkxBR19DSElQX1A1X1BMVVMpKVxuIFx0XHRjcCAtPSBibnh0X2dldF91bHBfbXNpeF9udW0oYnApO1xuIFxuLVx0cmV0dXJuIGNwO1xuK1x0cmV0dXJuIG1wY19jcCBcdTAwM2U9IGNwID8gMCA6IGNwIC0gbXBjX2NwO1xuIH1cbiBcbiBzdGF0aWMgdW5zaWduZWQgaW50IGJueHRfZ2V0X21heF9mdW5jX2lycXMoc3RydWN0IGJueHQgKmJwKVxuQEAgLTExNTM4LDcgKzExNjc0LDcgQEAgdW5zaWduZWQgaW50IGJueHRfZ2V0X2F2YWlsX2NwX3JpbmdzX2Zvcl9lbihzdHJ1Y3QgYm54dCAqYnApXG4ge1xuIFx0dW5zaWduZWQgaW50IGNwO1xuIFxuLVx0Y3AgPSBibnh0X2dldF9tYXhfZnVuY19jcF9yaW5nc19mb3JfZW4oYnApO1xuK1x0Y3AgPSBibnh0X2dldF9tYXhfZnVuY19jcF9yaW5nc19mb3JfZW4oYnAsIGJueHRfbXBjX2NwX3JpbmdzX2luX3VzZShicCkpO1xuIFx0aWYgKGJwLVx1MDAzZWZsYWdzIFx1MDAyNiBCTlhUX0ZMQUdfQ0hJUF9QNV9QTFVTKVxuIFx0XHRyZXR1cm4gY3AgLSBicC1cdTAwM2VyeF9ucl9yaW5ncyAtIGJwLVx1MDAzZXR4X25yX3JpbmdzO1xuIFx0ZWxzZVxuQEAgLTEyODAxLDYgKzEyOTM3LDggQEAgc3RhdGljIGludCBibnh0X2h3cm1faWZfY2hhbmdlKHN0cnVjdCBibnh0ICpicCwgYm9vbCB1cClcbiBcdFx0XHRcdGJueHRfdWxwX2lycV9zdG9wKGJwKTtcbiBcdFx0XHRibnh0X2ZyZWVfY3R4X21lbShicCwgZmFsc2UpO1xuIFx0XHRcdGJueHRfZGNiX2ZyZWUoYnApO1xuK1x0XHRcdGlmIChmd19yZXNldCB8fCBjYXBzX2NoYW5nZSlcbitcdFx0XHRcdGJueHRfY2xlYXJfY3J5cHRvKGJwKTtcbiBcdFx0XHRyYyA9IGJueHRfZndfaW5pdF9vbmUoYnApO1xuIFx0XHRcdGlmIChyYykge1xuIFx0XHRcdFx0Y2xlYXJfYml0KEJOWFRfU1RBVEVfRldfUkVTRVRfREVULCBcdTAwMjZicC1cdTAwM2VzdGF0ZSk7XG5AQCAtMTMxNzAsNiArMTMzMDgsNyBAQCBzdGF0aWMgaW50IF9fYm54dF9vcGVuX25pYyhzdHJ1Y3QgYm54dCAqYnAsIGJvb2wgaXJxX3JlX2luaXQsIGJvb2wgbGlua19yZV9pbml0KVxuIFx0XHRyZXR1cm4gcmM7XG4gXG4gXHRibnh0X2Fkal90eF9yaW5ncyhicCk7XG4rXHRibnh0X3RyaW1fbXBjX3JpbmdzKGJwKTtcbiBcdHJjID0gYm54dF9hbGxvY19tZW0oYnAsIGlycV9yZV9pbml0KTtcbiBcdGlmIChyYykge1xuIFx0XHRuZXRkZXZfZXJyKGJwLVx1MDAzZWRldiwgXCJibnh0X2FsbG9jX21lbSBlcnI6ICV4XFxuXCIsIHJjKTtcbkBAIC0xMzIyMiw2ICsxMzM2MSw3IEBAIHN0YXRpYyBpbnQgX19ibnh0X29wZW5fbmljKHN0cnVjdCBibnh0ICpicCwgYm9vbCBpcnFfcmVfaW5pdCwgYm9vbCBsaW5rX3JlX2luaXQpXG4gXHRcdHN0YXRpY19icmFuY2hfZGlzYWJsZShcdTAwMjZibnh0X3hkcF9sb2NraW5nX2tleSk7XG4gXHR9XG4gXHRzZXRfYml0KEJOWFRfU1RBVEVfT1BFTiwgXHUwMDI2YnAtXHUwMDNlc3RhdGUpO1xuK1x0Ym54dF9rdGxzX3dha2UoYnApO1xuIFx0Ym54dF9lbmFibGVfaW50KGJwKTtcbiBcdC8qIEVuYWJsZSBUWCBxdWV1ZXMgKi9cbiBcdGJueHRfdHhfZW5hYmxlKGJwKTtcbkBAIC0xMzM2Myw3ICsxMzUwMyw4IEBAIHN0YXRpYyBpbnQgYm54dF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpXG4gc3RhdGljIGJvb2wgYm54dF9kcnZfYnVzeShzdHJ1Y3QgYm54dCAqYnApXG4ge1xuIFx0cmV0dXJuICh0ZXN0X2JpdChCTlhUX1NUQVRFX0lOX1NQX1RBU0ssIFx1MDAyNmJwLVx1MDAzZXN0YXRlKSB8fFxuLVx0XHR0ZXN0X2JpdChCTlhUX1NUQVRFX1JFQURfU1RBVFMsIFx1MDAyNmJwLVx1MDAzZXN0YXRlKSk7XG4rXHRcdHRlc3RfYml0KEJOWFRfU1RBVEVfUkVBRF9TVEFUUywgXHUwMDI2YnAtXHUwMDNlc3RhdGUpIHx8XG4rXHRcdGJueHRfa3Rsc19idXN5KGJwKSk7XG4gfVxuIFxuIHN0YXRpYyB2b2lkIGJueHRfZ2V0X3Jpbmdfc3RhdHMoc3RydWN0IGJueHQgKmJwLFxuQEAgLTEzMzgxLDkgKzEzNTIyLDIwIEBAIHN0YXRpYyB2b2lkIF9fYm54dF9jbG9zZV9uaWMoc3RydWN0IGJueHQgKmJwLCBib29sIGlycV9yZV9pbml0LFxuIFxuIFx0Y2xlYXJfYml0KEJOWFRfU1RBVEVfT1BFTiwgXHUwMDI2YnAtXHUwMDNlc3RhdGUpO1xuIFx0c21wX21iX19hZnRlcl9hdG9taWMoKTtcbitcdC8qIFdha2UgYW55IGtUTFMgZGVsZXRlIHdhaXRpbmcgb24gYSByZWNvbmZpZyBzbyBpdCByZS1ldmFsdWF0ZXMgYW5kXG4rXHQgKiBlaXRoZXIga2VlcHMgd2FpdGluZyBmb3IgdGhlIHJlb3BlbiBvciBhYm9ydHMgKGlmZG93biAvIEZXIHJlc2V0KS5cbitcdCAqL1xuK1x0Ym54dF9rdGxzX3dha2UoYnApO1xuIFx0d2hpbGUgKGJueHRfZHJ2X2J1c3koYnApKVxuIFx0XHRtc2xlZXAoMjApO1xuIFxuK1x0LyogRGVsZXRlIGFsbCBjcnlwdG8gY29ubmVjdGlvbnMgYW5kIEtJRHMgb25seSBvbiBpZmRvd24gYW5kIEZXIHJlc2V0LFxuK1x0ICogbm90IGV0aHRvb2wgY29uZmlnIGNoYW5nZXMuXG4rXHQgKi9cbitcdGlmICghbmV0aWZfcnVubmluZyhicC1cdTAwM2VkZXYpIHx8XG4rXHQgICAgdGVzdF9iaXQoQk5YVF9TVEFURV9JTl9GV19SRVNFVCwgXHUwMDI2YnAtXHUwMDNlc3RhdGUpKVxuK1x0XHRibnh0X2NyeXB0b19kZWxfYWxsKGJwKTtcbitcbiBcdGlmIChCTlhUX1NVUFBPUlRTX01VTFRJX1JTU19DVFgoYnApKVxuIFx0XHRibnh0X2NsZWFyX3Jzc19jdHhzKGJwKTtcbiBcdC8qIEZsdXNoIHJpbmdzIGFuZCBkaXNhYmxlIGludGVycnVwdHMgKi9cbkBAIC0xNDMyMCw3ICsxNDQ3Miw3IEBAIHN0YXRpYyBpbnQgYm54dF9od3JtX3J4X3JpbmdfcmVzZXQoc3RydWN0IGJueHQgKmJwLCBpbnQgcmluZ19ucilcbiBcdHJldHVybiBod3JtX3JlcV9zZW5kX3NpbGVudChicCwgcmVxKTtcbiB9XG4gXG4tc3RhdGljIHZvaWQgYm54dF9yZXNldF90YXNrKHN0cnVjdCBibnh0ICpicCwgYm9vbCBzaWxlbnQpXG4rdm9pZCBibnh0X3Jlc2V0X3Rhc2soc3RydWN0IGJueHQgKmJwLCBib29sIHNpbGVudClcbiB7XG4gXHRpZiAoIXNpbGVudClcbiBcdFx0Ym54dF9kYmdfZHVtcF9zdGF0ZXMoYnApO1xuQEAgLTE0NTM3LDYgKzE0Njg5LDcgQEAgc3RhdGljIHZvaWQgYm54dF9md19yZXNldF9jbG9zZShzdHJ1Y3QgYm54dCAqYnApXG4gXHRibnh0X2h3cm1fZnVuY19kcnZfdW5yZ3RyKGJwKTtcbiBcdGlmIChwY2lfaXNfZW5hYmxlZChicC1cdTAwM2VwZGV2KSlcbiBcdFx0cGNpX2Rpc2FibGVfZGV2aWNlKGJwLVx1MDAzZXBkZXYpO1xuK1x0Ym54dF9jbGVhcl9jcnlwdG8oYnApO1xuIFx0Ym54dF9mcmVlX2N0eF9tZW0oYnAsIGZhbHNlKTtcbiB9XG4gXG5AQCAtMTQ3NjgsNiArMTQ5MjEsMTMgQEAgc3RhdGljIHZvaWQgYm54dF91bHBfcmVzdGFydChzdHJ1Y3QgYm54dCAqYnApXG4gXHRibnh0X3VscF9zdGFydChicCk7XG4gfVxuIFxuK3N0YXRpYyB2b2lkIGJueHRfbXBjX3JpbmdfcmVzZXRfc3Aoc3RydWN0IGJueHQgKmJwKVxuK3tcbitcdGJueHRfcnRubF9sb2NrX3NwKGJwKTtcbitcdGJueHRfbXBjX3JpbmdfcmVzZXRfdGFzayhicCk7XG4rXHRibnh0X3J0bmxfdW5sb2NrX3NwKGJwKTtcbit9XG4rXG4gc3RhdGljIHZvaWQgYm54dF9zcF90YXNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaylcbiB7XG4gXHRzdHJ1Y3QgYm54dCAqYnAgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGJueHQsIHNwX3Rhc2spO1xuQEAgLTE0ODYwLDYgKzE1MDIwLDkgQEAgc3RhdGljIHZvaWQgYm54dF9zcF90YXNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaylcbiBcdGlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoQk5YVF9SU1RfUklOR19TUF9FVkVOVCwgXHUwMDI2YnAtXHUwMDNlc3BfZXZlbnQpKVxuIFx0XHRibnh0X3J4X3JpbmdfcmVzZXQoYnApO1xuIFxuK1x0aWYgKHRlc3RfYW5kX2NsZWFyX2JpdChCTlhUX01QQ19SRVNFVF9TUF9FVkVOVCwgXHUwMDI2YnAtXHUwMDNlc3BfZXZlbnQpKVxuK1x0XHRibnh0X21wY19yaW5nX3Jlc2V0X3NwKGJwKTtcbitcbiBcdGlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoQk5YVF9GV19SRVNFVF9OT1RJRllfU1BfRVZFTlQsIFx1MDAyNmJwLVx1MDAzZXNwX2V2ZW50KSkge1xuIFx0XHRpZiAodGVzdF9iaXQoQk5YVF9TVEFURV9GV19GQVRBTF9DT05ELCBcdTAwMjZicC1cdTAwM2VzdGF0ZSkgfHxcbiBcdFx0ICAgIHRlc3RfYml0KEJOWFRfU1RBVEVfRldfTk9OX0ZBVEFMX0NPTkQsIFx1MDAyNmJwLVx1MDAzZXN0YXRlKSlcbkBAIC0xNDg3OCwxMSArMTUwNDEsMTEgQEAgc3RhdGljIHZvaWQgYm54dF9zcF90YXNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaylcbiB9XG4gXG4gc3RhdGljIHZvaWQgX2JueHRfZ2V0X21heF9yaW5ncyhzdHJ1Y3QgYm54dCAqYnAsIGludCAqbWF4X3J4LCBpbnQgKm1heF90eCxcbi1cdFx0XHRcdGludCAqbWF4X2NwKTtcbitcdFx0XHRcdGludCAqbWF4X2NwLCBpbnQgbXBjX3R4LCBpbnQgbXBjX2NwKTtcbiBcbiAvKiBVbmRlciBuZXRkZXYgaW5zdGFuY2UgbG9jayAqL1xuIGludCBibnh0X2NoZWNrX3JpbmdzKHN0cnVjdCBibnh0ICpicCwgaW50IHR4LCBpbnQgcngsIGJvb2wgc2gsIGludCB0Y3MsXG4tXHRcdCAgICAgaW50IHR4X3hkcClcbitcdFx0ICAgICBpbnQgdHhfeGRwLCBpbnQgbXBjX3R4LCBpbnQgbXBjX2NwKVxuIHtcbiBcdGludCBtYXhfcngsIG1heF90eCwgbWF4X2NwLCB0eF9zZXRzID0gMSwgdHhfY3A7XG4gXHRzdHJ1Y3QgYm54dF9od19yaW5ncyBod3IgPSB7MH07XG5AQCAtMTQ4OTIsNyArMTUwNTUsNyBAQCBpbnQgYm54dF9jaGVja19yaW5ncyhzdHJ1Y3QgYm54dCAqYnAsIGludCB0eCwgaW50IHJ4LCBib29sIHNoLCBpbnQgdGNzLFxuIFx0aWYgKHRjcylcbiBcdFx0dHhfc2V0cyA9IHRjcztcbiBcbi1cdF9ibnh0X2dldF9tYXhfcmluZ3MoYnAsIFx1MDAyNm1heF9yeCwgXHUwMDI2bWF4X3R4LCBcdTAwMjZtYXhfY3ApO1xuK1x0X2JueHRfZ2V0X21heF9yaW5ncyhicCwgXHUwMDI2bWF4X3J4LCBcdTAwMjZtYXhfdHgsIFx1MDAyNm1heF9jcCwgbXBjX3R4LCBtcGNfY3ApO1xuIFxuIFx0aWYgKG1heF9yeCBcdTAwM2MgcnhfcmluZ3MpXG4gXHRcdHJldHVybiAtRU5PTUVNO1xuQEAgLTE0OTE4LDggKzE1MDgxLDEwIEBAIGludCBibnh0X2NoZWNrX3JpbmdzKHN0cnVjdCBibnh0ICpicCwgaW50IHR4LCBpbnQgcngsIGJvb2wgc2gsIGludCB0Y3MsXG4gXHRcdGh3ci5ncnAgPSByeDtcbiBcdFx0aHdyLnJzc19jdHggPSBibnh0X2dldF90b3RhbF9yc3NfY3R4cyhicCwgXHUwMDI2aHdyKTtcbiBcdH1cbi1cdGlmIChicC1cdTAwM2VmbGFncyBcdTAwMjYgQk5YVF9GTEFHX0NISVBfUDVfUExVUylcbi1cdFx0aHdyLmNwX3A1ID0gaHdyLnR4ICsgcng7XG4rXHRpZiAoYnAtXHUwMDNlZmxhZ3MgXHUwMDI2IEJOWFRfRkxBR19DSElQX1A1X1BMVVMpIHtcbitcdFx0aHdyLmNwX3A1ID0gaHdyLnR4ICsgcnggKyBtcGNfY3A7XG4rXHRcdGh3ci50eCArPSBtcGNfdHg7XG4rXHR9XG4gXHRyYyA9IGJueHRfaHdybV9jaGVja19yaW5ncyhicCwgXHUwMDI2aHdyKTtcbiBcdGlmICghcmMgXHUwMDI2XHUwMDI2IHBjaV9tc2l4X2Nhbl9hbGxvY19keW4oYnAtXHUwMDNlcGRldikpIHtcbiBcdFx0aWYgKCFibnh0X3VscF9yZWdpc3RlcmVkKGJwLVx1MDAzZWVkZXZbQk5YVF9BVVhERVZfUkRNQV0pKSB7XG5AQCAtMTU2NDAsNyArMTU4MDUsOSBAQCBpbnQgYm54dF9zZXR1cF9tcV90YyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCB0YylcbiBcdFx0c2ggPSB0cnVlO1xuIFxuIFx0cmMgPSBibnh0X2NoZWNrX3JpbmdzKGJwLCBicC1cdTAwM2V0eF9ucl9yaW5nc19wZXJfdGMsIGJwLVx1MDAzZXJ4X25yX3JpbmdzLFxuLVx0XHRcdCAgICAgIHNoLCB0YywgYnAtXHUwMDNldHhfbnJfcmluZ3NfeGRwKTtcbitcdFx0XHQgICAgICBzaCwgdGMsIGJwLVx1MDAzZXR4X25yX3JpbmdzX3hkcCxcbitcdFx0XHQgICAgICBibnh0X21wY190eF9yaW5nc19pbl91c2UoYnApLFxuK1x0XHRcdCAgICAgIGJueHRfbXBjX2NwX3JpbmdzX2luX3VzZShicCkpO1xuIFx0aWYgKHJjKVxuIFx0XHRyZXR1cm4gcmM7XG4gXG5AQCAtMTY1NDcsNiArMTY3MTQsOCBAQCBzdGF0aWMgdm9pZCBibnh0X3JlbW92ZV9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpXG4gXHRicC1cdTAwM2VwdHBfY2ZnID0gTlVMTDtcbiBcdGtmcmVlKGJwLVx1MDAzZWZ3X2hlYWx0aCk7XG4gXHRicC1cdTAwM2Vmd19oZWFsdGggPSBOVUxMO1xuK1x0Ym54dF9mcmVlX2NyeXB0b19pbmZvKGJwKTtcbitcdGJueHRfZnJlZV9tcGNfaW5mbyhicCk7XG4gXHRibnh0X2NsZWFudXBfcGNpKGJwKTtcbiBcdGJueHRfZnJlZV9jdHhfbWVtKGJwLCB0cnVlKTtcbiBcdGJueHRfZnJlZV9jcmFzaF9kdW1wX21lbShicCk7XG5AQCAtMTY2MTEsMTQgKzE2NzgwLDE0IEBAIHN0YXRpYyBpbnQgYm54dF9nZXRfbWF4X2lycShzdHJ1Y3QgcGNpX2RldiAqcGRldilcbiB9XG4gXG4gc3RhdGljIHZvaWQgX2JueHRfZ2V0X21heF9yaW5ncyhzdHJ1Y3QgYm54dCAqYnAsIGludCAqbWF4X3J4LCBpbnQgKm1heF90eCxcbi1cdFx0XHRcdGludCAqbWF4X2NwKVxuK1x0XHRcdFx0aW50ICptYXhfY3AsIGludCBtcGNfdHgsIGludCBtcGNfY3ApXG4ge1xuIFx0c3RydWN0IGJueHRfaHdfcmVzYyAqaHdfcmVzYyA9IFx1MDAyNmJwLVx1MDAzZWh3X3Jlc2M7XG4gXHRpbnQgbWF4X3JpbmdfZ3JwcyA9IDAsIG1heF9pcnE7XG4gXG4tXHQqbWF4X3R4ID0gaHdfcmVzYy1cdTAwM2VtYXhfdHhfcmluZ3M7XG4rXHQqbWF4X3R4ID0gbWF4KDAsIChpbnQpaHdfcmVzYy1cdTAwM2VtYXhfdHhfcmluZ3MgLSBtcGNfdHgpO1xuIFx0Km1heF9yeCA9IGh3X3Jlc2MtXHUwMDNlbWF4X3J4X3JpbmdzO1xuLVx0Km1heF9jcCA9IGJueHRfZ2V0X21heF9mdW5jX2NwX3JpbmdzX2Zvcl9lbihicCk7XG4rXHQqbWF4X2NwID0gYm54dF9nZXRfbWF4X2Z1bmNfY3BfcmluZ3NfZm9yX2VuKGJwLCBtcGNfY3ApO1xuIFx0bWF4X2lycSA9IG1pbl90KGludCwgYm54dF9nZXRfbWF4X2Z1bmNfaXJxcyhicCkgLVxuIFx0XHRcdGJueHRfZ2V0X3VscF9tc2l4X251bV9pbl91c2UoYnApLFxuIFx0XHRcdGh3X3Jlc2MtXHUwMDNlbWF4X3N0YXRfY3R4cyAtXG5AQCAtMTY2NTAsNyArMTY4MTksOCBAQCBpbnQgYm54dF9nZXRfbWF4X3JpbmdzKHN0cnVjdCBibnh0ICpicCwgaW50ICptYXhfcngsIGludCAqbWF4X3R4LCBib29sIHNoYXJlZClcbiB7XG4gXHRpbnQgcngsIHR4LCBjcDtcbiBcbi1cdF9ibnh0X2dldF9tYXhfcmluZ3MoYnAsIFx1MDAyNnJ4LCBcdTAwMjZ0eCwgXHUwMDI2Y3ApO1xuK1x0X2JueHRfZ2V0X21heF9yaW5ncyhicCwgXHUwMDI2cngsIFx1MDAyNnR4LCBcdTAwMjZjcCwgYm54dF9tcGNfdHhfcmluZ3NfaW5fdXNlKGJwKSxcbitcdFx0XHQgICAgYm54dF9tcGNfY3BfcmluZ3NfaW5fdXNlKGJwKSk7XG4gXHQqbWF4X3J4ID0gcng7XG4gXHQqbWF4X3R4ID0gdHg7XG4gXHRpZiAoIXJ4IHx8ICF0eCB8fCAhY3ApXG5AQCAtMTY3MTMsNiArMTY4ODMsNyBAQCBzdGF0aWMgdm9pZCBibnh0X3RyaW1fZGZsdF9zaF9yaW5ncyhzdHJ1Y3QgYm54dCAqYnApXG4gXHRicC1cdTAwM2VyeF9ucl9yaW5ncyA9IGJwLVx1MDAzZWNwX25yX3JpbmdzO1xuIFx0YnAtXHUwMDNldHhfbnJfcmluZ3NfcGVyX3RjID0gYnAtXHUwMDNlY3BfbnJfcmluZ3M7XG4gXHRicC1cdTAwM2V0eF9ucl9yaW5ncyA9IGJueHRfdHhfbnJfcmluZ3MoYnApO1xuK1x0Ym54dF90cmltX21wY19yaW5ncyhicCk7XG4gfVxuIFxuIHN0YXRpYyB2b2lkIGJueHRfYWRqX2RmbHRfcmluZ3Moc3RydWN0IGJueHQgKmJwLCBib29sIHNoKVxuQEAgLTE2NzY0LDYgKzE2OTM1LDggQEAgc3RhdGljIGludCBibnh0X3NldF9kZmx0X3JpbmdzKHN0cnVjdCBibnh0ICpicCwgYm9vbCBzaClcbiBcdFx0Ym54dF9zZXRfZGZsdF91bHBfc3RhdF9jdHhzKGJwKTtcbiBcdH1cbiBcbitcdGJueHRfc2V0X2RmbHRfbXBjX3JpbmdzKGJwKTtcbitcbiBcdHJjID0gX19ibnh0X3Jlc2VydmVfcmluZ3MoYnApO1xuIFx0aWYgKHJjIFx1MDAyNlx1MDAyNiByYyAhPSAtRU5PREVWKVxuIFx0XHRuZXRkZXZfd2FybihicC1cdTAwM2VkZXYsIFwiVW5hYmxlIHRvIHJlc2VydmUgdHggcmluZ3NcXG5cIik7XG5AQCAtMTY3NzgsNiArMTY5NTEsMTEgQEAgc3RhdGljIGludCBibnh0X3NldF9kZmx0X3JpbmdzKHN0cnVjdCBibnh0ICpicCwgYm9vbCBzaClcbiBcdFx0aWYgKHJjIFx1MDAyNlx1MDAyNiByYyAhPSAtRU5PREVWKVxuIFx0XHRcdG5ldGRldl93YXJuKGJwLVx1MDAzZWRldiwgXCIybmQgcmluZ3MgcmVzZXJ2YXRpb24gZmFpbGVkLlxcblwiKTtcbiBcdFx0Ym54dF9hZGpfdHhfcmluZ3MoYnApO1xuK1x0XHQvKiBSZS1jYXAgTVBDIHJpbmcgY291bnRzIGFnYWluc3QgdGhlIHJlZHVjZWQgVFggcmluZ3MuXG4rXHRcdCAqIEFueSBleHRyYSByZXNlcnZlZCBNUEMgcmluZ3Mgd2lsbCBiZSByZWNvbmNpbGVkIG9uXG4rXHRcdCAqIHRoZSBuZXh0IG9wZW4uXG4rXHRcdCAqL1xuK1x0XHRibnh0X3RyaW1fbXBjX3JpbmdzKGJwKTtcbiBcdH1cbiBcdGlmIChCTlhUX0NISVBfVFlQRV9OSVRST19BMChicCkpIHtcbiBcdFx0YnAtXHUwMDNlcnhfbnJfcmluZ3MrKztcbkBAIC0xNjgxMiw2ICsxNjk5MCw3IEBAIHN0YXRpYyBpbnQgYm54dF9pbml0X2RmbHRfcmluZ19tb2RlKHN0cnVjdCBibnh0ICpicClcbiBcdFx0Z290byBpbml0X2RmbHRfcmluZ19lcnI7XG4gXG4gXHRibnh0X2Fkal90eF9yaW5ncyhicCk7XG4rXHRibnh0X3RyaW1fbXBjX3JpbmdzKGJwKTtcbiBcbiBcdGJueHRfc2V0X2RmbHRfcmZzKGJwKTtcbiBcbkBAIC0xNzE1NSw2ICsxNzMzNCw3IEBAIHN0YXRpYyBpbnQgYm54dF9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudClcbiBcdCAqIGxpbWl0ZWQgTVNJWCwgc28gd2UgcmUtaW5pdGlhbGl6ZSB0aGUgVFggcmluZ3MgcGVyIFRDLlxuIFx0ICovXG4gXHRicC1cdTAwM2V0eF9ucl9yaW5nc19wZXJfdGMgPSBicC1cdTAwM2V0eF9ucl9yaW5ncztcbitcdGJueHRfdHJpbV9tcGNfcmluZ3MoYnApO1xuIFxuIFx0aWYgKEJOWFRfUEYoYnApKSB7XG4gXHRcdGlmICghYm54dF9wZl93cSkge1xuQEAgLTE3MTc2LDYgKzE3MzU2LDEyIEBAIHN0YXRpYyBpbnQgYm54dF9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudClcbiBcdHJjID0gYm54dF9kbF9yZWdpc3RlcihicCk7XG4gXHRpZiAocmMpXG4gXHRcdGdvdG8gaW5pdF9lcnJfZGw7XG4rXHRyYyA9IGJueHRfY3J5cHRvX2luaXQoYnApO1xuK1x0aWYgKHJjKSB7XG4rXHRcdGJueHRfZnJlZV9jcnlwdG9faW5mbyhicCk7XG4rXHRcdG5ldGRldl93YXJuKGJwLVx1MDAzZWRldiwgXCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBjcnlwdG8gb2ZmbG9hZCwgZXJyID0gJWRcXG5cIixcbitcdFx0XHQgICAgcmMpO1xuK1x0fVxuIFxuIFx0SU5JVF9MSVNUX0hFQUQoXHUwMDI2YnAtXHUwMDNldXNyX2ZsdHJfbGlzdCk7XG4gXG5AQCAtMTcyMTgsNiArMTc0MDQsOCBAQCBzdGF0aWMgaW50IGJueHRfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpXG4gXHRibnh0X2V0aHRvb2xfZnJlZShicCk7XG4gXHRrZnJlZShicC1cdTAwM2Vmd19oZWFsdGgpO1xuIFx0YnAtXHUwMDNlZndfaGVhbHRoID0gTlVMTDtcbitcdGJueHRfZnJlZV9jcnlwdG9faW5mbyhicCk7XG4rXHRibnh0X2ZyZWVfbXBjX2luZm8oYnApO1xuIFx0Ym54dF9jbGVhbnVwX3BjaShicCk7XG4gXHRibnh0X2ZyZWVfY3R4X21lbShicCwgdHJ1ZSk7XG4gXHRibnh0X2ZyZWVfY3Jhc2hfZHVtcF9tZW0oYnApO1xuQEAgLTE3NDAwLDYgKzE3NTg4LDcgQEAgc3RhdGljIHBjaV9lcnNfcmVzdWx0X3QgYm54dF9pb19lcnJvcl9kZXRlY3RlZChzdHJ1Y3QgcGNpX2RldiAqcGRldixcbiBcbiBcdGlmIChwY2lfaXNfZW5hYmxlZChwZGV2KSlcbiBcdFx0cGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpO1xuK1x0Ym54dF9jbGVhcl9jcnlwdG8oYnApO1xuIFx0Ym54dF9mcmVlX2N0eF9tZW0oYnAsIGZhbHNlKTtcbiBcdG5ldGRldl91bmxvY2sobmV0ZGV2KTtcbiBcbmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibnh0L2JueHQuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dC5oXG5pbmRleCA2MzM1ZGZjMTRjOTg1Yi4uNzA5NDdiY2MzMTE2ZWQgMTAwNjQ0XG4tLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibnh0L2JueHQuaFxuKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9ibnh0LmhcbkBAIC00Nyw2ICs0Nyw3IEBAIHN0cnVjdCB0eF9iZCB7XG4gXHRfX2xlMzIgdHhfYmRfbGVuX2ZsYWdzX3R5cGU7XG4gXHQjZGVmaW5lIFRYX0JEX1RZUEVcdFx0XHRcdFx0KDB4M2YgXHUwMDNjXHUwMDNjIDApXG4gXHQgI2RlZmluZSBUWF9CRF9UWVBFX1NIT1JUX1RYX0JEXHRcdFx0XHQgKDB4MDAgXHUwMDNjXHUwMDNjIDApXG4rXHQgI2RlZmluZSBUWF9CRF9UWVBFX01QQ19UWF9CRFx0XHRcdFx0ICgweDA4IFx1MDAzY1x1MDAzYyAwKVxuIFx0ICNkZWZpbmUgVFhfQkRfVFlQRV9MT05HX1RYX0JEXHRcdFx0XHQgKDB4MTAgXHUwMDNjXHUwMDNjIDApXG4gXHQjZGVmaW5lIFRYX0JEX0ZMQUdTX1BBQ0tFVF9FTkRcdFx0XHRcdCgxIFx1MDAzY1x1MDAzYyA2KVxuIFx0I2RlZmluZSBUWF9CRF9GTEFHU19OT19DTVBMXHRcdFx0XHQoMSBcdTAwM2NcdTAwM2MgNylcbkBAIC0xMDAsMTAgKzEwMSwxOCBAQCBzdHJ1Y3QgdHhfYmRfZXh0IHtcbiBcdCNkZWZpbmUgVFhfQkRfRkxBR1NfTFNPXHRcdFx0XHRcdCgxIFx1MDAzY1x1MDAzYyA1KVxuIFx0I2RlZmluZSBUWF9CRF9GTEFHU19JUElEX0ZNVFx0XHRcdFx0KDEgXHUwMDNjXHUwMDNjIDYpXG4gXHQjZGVmaW5lIFRYX0JEX0ZMQUdTX1RfSVBJRFx0XHRcdFx0KDEgXHUwMDNjXHUwMDNjIDcpXG4rXHQjZGVmaW5lIFRYX0JEX0ZMQUdTX0NSWVBUT19FTlx0XHRcdFx0KDEgXHUwMDNjXHUwMDNjIDE1KVxuIFx0I2RlZmluZSBUWF9CRF9IU0laRVx0XHRcdFx0XHQoMHhmZiBcdTAwM2NcdTAwM2MgMTYpXG4gXHQgI2RlZmluZSBUWF9CRF9IU0laRV9TSElGVFx0XHRcdFx0IDE2XG4tXG4tXHRfX2xlMzIgdHhfYmRfbXNzO1xuK1x0I2RlZmluZSBUWF9CRF9LSURfTE9cdFx0XHRcdFx0KDB4N2YgXHUwMDNjXHUwMDNjIDI1KVxuK1x0ICNkZWZpbmUgVFhfQkRfS0lEX0xPX01BU0tcdFx0XHRcdCAweDdmXG4rXHQgI2RlZmluZSBUWF9CRF9LSURfTE9fU0hJRlRcdFx0XHRcdCAyNVxuK1xuK1x0X19sZTMyIHR4X2JkX2tpZF9tc3M7XG4rXHQjZGVmaW5lIFRYX0JEX01TU1x0XHRcdFx0XHQweDdmZmZcbitcdCNkZWZpbmUgVFhfQkRfS0lEX0hJXHRcdFx0XHRcdCgweDFmZmZmIFx1MDAzY1x1MDAzYyAxNSlcbitcdCAjZGVmaW5lIFRYX0JEX0tJRF9ISV9NQVNLXHRcdFx0XHQgMHhmZmZmODBcbitcdCAjZGVmaW5lIFRYX0JEX0tJRF9ISV9TSElGVFx0XHRcdFx0IDhcbiBcdF9fbGUzMiB0eF9iZF9jZmFfYWN0aW9uO1xuIFx0I2RlZmluZSBUWF9CRF9DRkFfQUNUSU9OXHRcdFx0XHQoMHhmZmZmIFx1MDAzY1x1MDAzYyAxNilcbiBcdCAjZGVmaW5lIFRYX0JEX0NGQV9BQ1RJT05fU0hJRlRcdFx0XHRcdCAxNlxuQEAgLTEyMSw2ICsxMzAsMTYgQEAgc3RydWN0IHR4X2JkX2V4dCB7XG4gfTtcbiBcbiAjZGVmaW5lIEJOWFRfVFhfUFRQX0lTX1NFVChsZmxhZ3MpICgobGZsYWdzKSBcdTAwMjYgY3B1X3RvX2xlMzIoVFhfQkRfRkxBR1NfU1RBTVApKVxuKyNkZWZpbmUgQk5YVF9UWF9LSURfTE8oa2lkKSAoKChraWQpIFx1MDAyNiBUWF9CRF9LSURfTE9fTUFTSykgXHUwMDNjXHUwMDNjIFRYX0JEX0tJRF9MT19TSElGVClcbisjZGVmaW5lIEJOWFRfVFhfS0lEX0hJKGtpZCkgKCgoa2lkKSBcdTAwMjYgVFhfQkRfS0lEX0hJX01BU0spIFx1MDAzY1x1MDAzYyBUWF9CRF9LSURfSElfU0hJRlQpXG4rXG4rc3RydWN0IHR4X2JkX3ByZXN5bmMge1xuK1x0X19sZTMyIHR4X2JkX2xlbl9mbGFnc190eXBlO1xuK1x0ICNkZWZpbmUgVFhfQkRfVFlQRV9QUkVTWU5DX1RYX0JEXHRcdFx0ICgweDA5IFx1MDAzY1x1MDAzYyAwKVxuK1x0dTMyIHR4X2JkX29wYXF1ZTtcbitcdF9fbGUzMiB0eF9iZF9raWQ7XG4rXHR1MzIgdHhfYmRfdW51c2VkO1xuK307XG4gXG4gc3RydWN0IHJ4X2JkIHtcbiBcdF9fbGUzMiByeF9iZF9sZW5fZmxhZ3NfdHlwZTtcbkBAIC0xNjAsNiArMTc5LDcgQEAgc3RydWN0IHR4X2NtcCB7XG4gXHQgI2RlZmluZSBDTVBfVFlQRV9SWF9UUEFfQUdHX0NNUFx0XHRcdCAyMlxuIFx0ICNkZWZpbmUgQ01QX1RZUEVfUlhfTDJfVjNfQ01QXHRcdFx0XHQgMjNcbiBcdCAjZGVmaW5lIENNUF9UWVBFX1JYX0wyX1RQQV9TVEFSVF9WM19DTVBcdFx0IDI1XG4rXHQgI2RlZmluZSBDTVBfVFlQRV9NUENfQ01QXHRcdFx0XHQgMzBcbiBcdCAjZGVmaW5lIENNUF9UWVBFX1NUQVRVU19DTVBcdFx0XHRcdCAzMlxuIFx0ICNkZWZpbmUgQ01QX1RZUEVfUkVNT1RFX0RSSVZFUl9SRVFcdFx0XHQgMzRcbiBcdCAjZGVmaW5lIENNUF9UWVBFX1JFTU9URV9EUklWRVJfUkVTUFx0XHRcdCAzNlxuQEAgLTY4Niw2ICs3MDYsNyBAQCBzdHJ1Y3QgbnFlX2NuIHtcbiAjZGVmaW5lIEJOWFRfTlFfSERMX1RZUEVfU0hJRlRcdDI0XG4gI2RlZmluZSBCTlhUX05RX0hETF9UWVBFX1JYXHQweDAwXG4gI2RlZmluZSBCTlhUX05RX0hETF9UWVBFX1RYXHQweDAxXG4rI2RlZmluZSBCTlhUX05RX0hETF9UWVBFX01QXHQweDAyXG4gXG4gI2RlZmluZSBCTlhUX05RX0hETF9JRFgoaGRsKVx0KChoZGwpIFx1MDAyNiBCTlhUX05RX0hETF9JRFhfTUFTSylcbiAjZGVmaW5lIEJOWFRfTlFfSERMX1RZUEUoaGRsKVx0KCgoaGRsKSBcdTAwMjYgQk5YVF9OUV9IRExfVFlQRV9NQVNLKSBcdTAwM2VcdTAwM2VcdFxcXG5AQCAtODk2LDYgKzkxNyw3IEBAIHN0cnVjdCBibnh0X3N3X3R4X2JkIHtcbiBcdHU4XHRcdFx0aXNfcHVzaDtcbiBcdHU4XHRcdFx0aXNfc3dfZ3NvO1xuIFx0dThcdFx0XHRhY3Rpb247XG4rXHR1OFx0XHRcdGlubGluZV9kYXRhX2JkcztcbiBcdHVuc2lnbmVkIHNob3J0XHRcdG5yX2ZyYWdzO1xuIFx0dW5pb24ge1xuIFx0XHR1MTZcdFx0XHRyeF9wcm9kO1xuQEAgLTk1MSw2ICs5NzMsOCBAQCBzdHJ1Y3QgYm54dF9yaW5nX3N0cnVjdCB7XG4gXHR9O1xuIFx0dTMyXHRcdFx0aGFuZGxlO1xuIFx0dThcdFx0XHRxdWV1ZV9pZDtcbisjZGVmaW5lIEJOWFRfTVBDX1FVRVVFX0lEXHQweGZmXG4rXHR1OFx0XHRcdG1wY19jaG5sX3R5cGU7XG4gfTtcbiBcbiBzdHJ1Y3QgdHhfcHVzaF9iZCB7XG5AQCAtOTkxLDEyICsxMDE1LDE2IEBAIHN0cnVjdCBibnh0X3R4X3JpbmdfaW5mbyB7XG4gXHR1MTZcdFx0XHR0eF9jb25zO1xuIFx0dTE2XHRcdFx0dHhfaHdfY29ucztcbiBcdHUxNlx0XHRcdHR4cV9pbmRleDtcbitcdC8qIGluZGV4IGZvciB0eF9yaW5nW10gb3IgdHhfbXBjX3JpbmdbXSBpbiBzdHJ1Y3QgYm54dF9uYXBpICovXG4gXHR1OFx0XHRcdHR4X25hcGlfaWR4O1xuIFx0dThcdFx0XHRraWNrX3BlbmRpbmc7XG4gXHRzdHJ1Y3QgYm54dF9kYl9pbmZvXHR0eF9kYjtcbiBcbiBcdHN0cnVjdCB0eF9iZFx0XHQqdHhfZGVzY19yaW5nW01BWF9UWF9QQUdFU107XG4tXHRzdHJ1Y3QgYm54dF9zd190eF9iZFx0KnR4X2J1Zl9yaW5nO1xuK1x0dW5pb24ge1xuK1x0XHRzdHJ1Y3QgYm54dF9zd190eF9iZFx0KnR4X2J1Zl9yaW5nO1xuK1x0XHRzdHJ1Y3QgYm54dF9zd19tcGNfdHhfYmRcdCp0eF9tcGNfYnVmX3Jpbmc7XG4rXHR9O1xuIFxuIFx0ZG1hX2FkZHJfdFx0XHR0eF9kZXNjX21hcHBpbmdbTUFYX1RYX1BBR0VTXTtcbiBcbkBAIC0xMDE0LDggKzEwNDIsMTEgQEAgc3RydWN0IGJueHRfdHhfcmluZ19pbmZvIHtcbiBcdHUzMlx0XHRcdGRldl9zdGF0ZTtcbiBcbiBcdHN0cnVjdCBibnh0X3Jpbmdfc3RydWN0XHR0eF9yaW5nX3N0cnVjdDtcbi1cdC8qIFN5bmNocm9uaXplIHNpbXVsdGFuZW91cyB4ZHBfeG1pdCBvbiBzYW1lIHJpbmcgKi9cbi1cdHNwaW5sb2NrX3RcdFx0eGRwX3R4X2xvY2s7XG4rXHQvKiBTeW5jaHJvbml6ZSBzaW11bHRhbmVvdXMgeGRwX3htaXQgb24gc2FtZSByaW5nIG9yIGZvciBNUEMgcmluZyAqL1xuK1x0c3BpbmxvY2tfdFx0XHR0eF9sb2NrO1xuK1xuK1x0LyogUGVyLVRYLXJpbmcga1RMUyBjb3VudGVyczsgYWxsb2NhdGVkIG9ubHkgd2hlbiBrVExTIGlzIGVuYWJsZWQuICovXG4rXHRzdHJ1Y3QgYm54dF90bHNfc3dfc3RhdHMgKnRsc19zdGF0cztcbiB9O1xuIFxuICNkZWZpbmUgQk5YVF9MRUdBQ1lfQ09BTF9DTVBMX1BBUkFNU1x0XHRcdFx0XHRcXFxuQEAgLTExNTcsNiArMTE4OCwyMiBAQCBzdHJ1Y3QgYm54dF9jbW5fc3dfc3RhdHMge1xuIFx0dTY0XHRcdFx0bWlzc2VkX2lycXM7XG4gfTtcbiBcbisvKiBEYXRhIHBsYW5lIGtUTFMgY291bnRlcnMgKi9cbitlbnVtIGJueHRfa3Rsc19kYXRhX2NvdW50ZXJzIHtcbitcdEJOWFRfS1RMU19UWF9QS1RTID0gMCxcbitcdEJOWFRfS1RMU19UWF9CWVRFUyxcbitcdEJOWFRfS1RMU19UWF9PT09fUEtUUyxcbitcdEJOWFRfS1RMU19UWF9PT09fRkFMTEJBQ0tfTk9fU1lOQyxcbitcdEJOWFRfS1RMU19UWF9PT09fRkFMTEJBQ0tfTk9fU1BBQ0UsXG4rXHRCTlhUX0tUTFNfVFhfT09PX0ZBTExCQUNLX05PX0hEUixcbitcbitcdEJOWFRfS1RMU19NQVhfREFUQV9DT1VOVEVSUyxcbit9O1xuK1xuK3N0cnVjdCBibnh0X3Rsc19zd19zdGF0cyB7XG4rXHR1NjRcdGNvdW50ZXJzW0JOWFRfS1RMU19NQVhfREFUQV9DT1VOVEVSU107XG4rfTtcbitcbiBzdHJ1Y3QgYm54dF9zd19zdGF0cyB7XG4gXHRzdHJ1Y3QgYm54dF9yeF9zd19zdGF0cyByeDtcbiBcdHN0cnVjdCBibnh0X3R4X3N3X3N0YXRzIHR4O1xuQEAgLTEyNDIsNiArMTI4OSw3IEBAIHN0cnVjdCBibnh0X25hcGkge1xuIFx0c3RydWN0IGJueHRfY3BfcmluZ19pbmZvXHRjcF9yaW5nO1xuIFx0c3RydWN0IGJueHRfcnhfcmluZ19pbmZvXHQqcnhfcmluZztcbiBcdHN0cnVjdCBibnh0X3R4X3JpbmdfaW5mb1x0KnR4X3JpbmdbQk5YVF9NQVhfVFhSX1BFUl9OQVBJXTtcbitcdHN0cnVjdCBibnh0X3R4X3JpbmdfaW5mb1x0Kip0eF9tcGNfcmluZztcbiBcbiBcdHZvaWRcdFx0XHQoKnR4X2ludCkoc3RydWN0IGJueHQgKiwgc3RydWN0IGJueHRfbmFwaSAqLFxuIFx0XHRcdFx0XHQgIGludCBidWRnZXQpO1xuQEAgLTEzNTUsNiArMTQwMywxNSBAQCBzdHJ1Y3QgYm54dF9od19yaW5ncyB7XG4gXHRpbnQgcnNzX2N0eDtcbiB9O1xuIFxuK3N0cnVjdCBibnh0X2h3X2NyeXB0b19yZXNjIHtcbitcdHUzMlx0bWluX3R4X2tleV9jdHhzO1xuK1x0dTMyXHRtYXhfdHhfa2V5X2N0eHM7XG4rXHR1MzJcdHJlc3ZfdHhfa2V5X2N0eHM7XG4rXHR1MzJcdG1pbl9yeF9rZXlfY3R4cztcbitcdHUzMlx0bWF4X3J4X2tleV9jdHhzO1xuK1x0dTMyXHRyZXN2X3J4X2tleV9jdHhzO1xuK307XG4rXG4gc3RydWN0IGJueHRfaHdfcmVzYyB7XG4gXHR1MTZcdG1pbl9yc3Njb3NfY3R4cztcbiBcdHUxNlx0bWF4X3Jzc2Nvc19jdHhzO1xuQEAgLTEzODksNiArMTQ0Niw4IEBAIHN0cnVjdCBibnh0X2h3X3Jlc2Mge1xuIFx0dTMyXHRtYXhfdHhfd21fZmxvd3M7XG4gXHR1MzJcdG1heF9yeF9lbV9mbG93cztcbiBcdHUzMlx0bWF4X3J4X3dtX2Zsb3dzO1xuK1xuK1x0c3RydWN0IGJueHRfaHdfY3J5cHRvX3Jlc2NcdGNyeXB0b19yZXNjO1xuIH07XG4gXG4gI2RlZmluZSBCTlhUX0xBUkdFX1JTU19UT19WTklDX1JBVElPXHQ3XG5AQCAtMjQ1Miw2ICsyNTExLDEwIEBAIHN0cnVjdCBibnh0IHtcbiBcbiBcdHU4XHRcdFx0dHBoX21vZGU7XG4gXG4rXHRzdHJ1Y3QgYm54dF9tcGNfaW5mb1x0Km1wY19pbmZvO1xuK1x0c3RydWN0IGJueHRfY3J5cHRvX2luZm9cdCpjcnlwdG9faW5mbztcbitcdHN0cnVjdCBibnh0X3Rsc19pbmZvXHQqa3Rsc19pbmZvO1xuK1xuIFx0dW5zaWduZWQgaW50XHRcdGN1cnJlbnRfaW50ZXJ2YWw7XG4gI2RlZmluZSBCTlhUX1RJTUVSX0lOVEVSVkFMXHRIWlxuIFxuQEAgLTI1MzgsNiArMjYwMSw3IEBAIHN0cnVjdCBibnh0IHtcbiBcdCNkZWZpbmUgQk5YVF9GV19DQVBfTlBBUl8xXzJcdFx0XHRCSVRfVUxMKDQyKVxuIFx0I2RlZmluZSBCTlhUX0ZXX0NBUF9NSVJST1JfT05fUk9DRVx0XHRCSVRfVUxMKDQzKVxuIFx0I2RlZmluZSBCTlhUX0ZXX0NBUF9QVFBfUFRNXHRcdFx0QklUX1VMTCg0NClcbitcdCNkZWZpbmUgQk5YVF9GV19DQVBfS1RMU1x0XHRcdEJJVF9VTEwoNDUpXG4gXG4gXHR1MzJcdFx0XHRmd19kYmdfY2FwO1xuIFxuQEAgLTI1NjMsNiArMjYyNyw4IEBAIHN0cnVjdCBibnh0IHtcbiBcdCgoYnApLVx1MDAzZWZ3X2NhcCBcdTAwMjYgQk5YVF9GV19DQVBfU1dfTUFYX1JFU09VUkNFX0xJTUlUUylcbiAjZGVmaW5lIEJOWFRfTUlSUk9SX09OX1JPQ0VfQ0FQKGJwKVx0XFxcbiBcdCgoYnApLVx1MDAzZWZ3X2NhcCBcdTAwMjYgQk5YVF9GV19DQVBfTUlSUk9SX09OX1JPQ0UpXG4rI2RlZmluZSBCTlhUX1NVUFBPUlRTX0tUTFMoYnApXHRcXFxuK1x0KChicCktXHUwMDNlZndfY2FwIFx1MDAyNiBCTlhUX0ZXX0NBUF9LVExTKVxuIFxuIFx0dTMyXHRcdFx0aHdybV9zcGVjX2NvZGU7XG4gXHR1MTZcdFx0XHRod3JtX2NtZF9zZXE7XG5AQCAtMjY0NSw2ICsyNzExLDcgQEAgc3RydWN0IGJueHQge1xuICNkZWZpbmUgQk5YVF9USEVSTUFMX1RIUkVTSE9MRF9TUF9FVkVOVFx0MjJcbiAjZGVmaW5lIEJOWFRfRldfRUNIT19SRVFVRVNUX1NQX0VWRU5UXHQyM1xuICNkZWZpbmUgQk5YVF9SRVNUQVJUX1VMUF9TUF9FVkVOVFx0MjRcbisjZGVmaW5lIEJOWFRfTVBDX1JFU0VUX1NQX0VWRU5UXHRcdDI1XG4gXG4gXHRzdHJ1Y3QgZGVsYXllZF93b3JrXHRmd19yZXNldF90YXNrO1xuIFx0aW50XHRcdFx0ZndfcmVzZXRfc3RhdGU7XG5AQCAtMjg1NiwxNCArMjkyMywxNCBAQCBzdGF0aWMgaW5saW5lIHUzMiBibnh0X3R4X2F2YWlsKHN0cnVjdCBibnh0ICpicCxcbiBzdGF0aWMgaW5saW5lIHN0cnVjdCB0eF9iZF9leHQgKlxuIGJueHRfaW5pdF9leHRfYmQoc3RydWN0IGJueHQgKmJwLCBzdHJ1Y3QgYm54dF90eF9yaW5nX2luZm8gKnR4cixcbiBcdFx0IHUxNiBwcm9kLCBfX2xlMzIgbGZsYWdzLCB1MzIgdmxhbl90YWdfZmxhZ3MsXG4tXHRcdCB1MzIgY2ZhX2FjdGlvbilcbitcdFx0IHUzMiBjZmFfYWN0aW9uLCB1MzIga2lkKVxuIHtcbiBcdHN0cnVjdCB0eF9iZF9leHQgKnR4YmQxO1xuIFxuIFx0dHhiZDEgPSAoc3RydWN0IHR4X2JkX2V4dCAqKVxuIFx0XHRcdTAwMjZ0eHItXHUwMDNldHhfZGVzY19yaW5nW1RYX1JJTkcoYnAsIHByb2QpXVtUWF9JRFgocHJvZCldO1xuIFx0dHhiZDEtXHUwMDNldHhfYmRfaHNpemVfbGZsYWdzID0gbGZsYWdzO1xuLVx0dHhiZDEtXHUwMDNldHhfYmRfbXNzID0gMDtcbitcdHR4YmQxLVx1MDAzZXR4X2JkX2tpZF9tc3MgPSBjcHVfdG9fbGUzMihCTlhUX1RYX0tJRF9ISShraWQpKTtcbiBcdHR4YmQxLVx1MDAzZXR4X2JkX2NmYV9tZXRhID0gY3B1X3RvX2xlMzIodmxhbl90YWdfZmxhZ3MpO1xuIFx0dHhiZDEtXHUwMDNldHhfYmRfY2ZhX2FjdGlvbiA9XG4gXHRcdGNwdV90b19sZTMyKGNmYV9hY3Rpb24gXHUwMDNjXHUwMDNjIFRYX0JEX0NGQV9BQ1RJT05fU0hJRlQpO1xuQEAgLTI5NTcsMTEgKzMwMjQsMTQgQEAgc3RhdGljIGlubGluZSBlbnVtIHBrdF9oYXNoX3R5cGVzIGJueHRfcnNzX2V4dF9vcChzdHJ1Y3QgYm54dCAqYnAsXG4gZXh0ZXJuIGNvbnN0IHUxNiBibnh0X2JzdG9yZV90b190cmFjZVtdO1xuIGV4dGVybiBjb25zdCB1MTYgYm54dF9saGludF9hcnJbXTtcbiBcbit2b2lkIGJueHRfcXVldWVfc3Bfd29yayhzdHJ1Y3QgYm54dCAqYnAsIHVuc2lnbmVkIGludCBldmVudCk7XG4gaW50IGJueHRfYWxsb2NfcnhfZGF0YShzdHJ1Y3QgYm54dCAqYnAsIHN0cnVjdCBibnh0X3J4X3JpbmdfaW5mbyAqcnhyLFxuIFx0XHQgICAgICAgdTE2IHByb2QsIGdmcF90IGdmcCk7XG4gdm9pZCBibnh0X3JldXNlX3J4X2RhdGEoc3RydWN0IGJueHRfcnhfcmluZ19pbmZvICpyeHIsIHUxNiBjb25zLCB2b2lkICpkYXRhKTtcbiB1MzIgYm54dF9md19oZWFsdGhfcmVhZGwoc3RydWN0IGJueHQgKmJwLCBpbnQgcmVnX2lkeCk7XG4gYm9vbCBibnh0X2JzX3RyYWNlX2F2YWlsKHN0cnVjdCBibnh0ICpicCwgdTE2IHR5cGUpO1xuK3ZvaWQgYm54dF9mcmVlX3Jpbmcoc3RydWN0IGJueHQgKmJwLCBzdHJ1Y3QgYm54dF9yaW5nX21lbV9pbmZvICpybWVtKTtcbitpbnQgYm54dF9hbGxvY19yaW5nKHN0cnVjdCBibnh0ICpicCwgc3RydWN0IGJueHRfcmluZ19tZW1faW5mbyAqcm1lbSk7XG4gdm9pZCBibnh0X3NldF90cGFfZmxhZ3Moc3RydWN0IGJueHQgKmJwKTtcbiB2b2lkIGJueHRfc2V0X3JpbmdfcGFyYW1zKHN0cnVjdCBibnh0ICopO1xuIHZvaWQgYm54dF9zZXRfcnhfc2tiX21vZGUoc3RydWN0IGJueHQgKmJwLCBib29sIHBhZ2VfbW9kZSk7XG5AQCAtMjk5MCw2ICszMDYwLDE0IEBAIGludCBibnh0X2h3cm1fdm5pY19jZmcoc3RydWN0IGJueHQgKmJwLCBzdHJ1Y3QgYm54dF92bmljX2luZm8gKnZuaWMpO1xuIGludCBibnh0X2h3cm1fdm5pY19hbGxvYyhzdHJ1Y3QgYm54dCAqYnAsIHN0cnVjdCBibnh0X3ZuaWNfaW5mbyAqdm5pYyxcbiBcdFx0XHQgdW5zaWduZWQgaW50IHN0YXJ0X3J4X3JpbmdfaWR4LFxuIFx0XHRcdCB1bnNpZ25lZCBpbnQgbnJfcmluZ3MpO1xuK2ludCBibnh0X2h3cm1fY3BfcmluZ19hbGxvY19wNShzdHJ1Y3QgYm54dCAqYnAsIHN0cnVjdCBibnh0X2NwX3JpbmdfaW5mbyAqY3ByKTtcbitpbnQgYm54dF9od3JtX3R4X3JpbmdfYWxsb2Moc3RydWN0IGJueHQgKmJwLCBzdHJ1Y3QgYm54dF90eF9yaW5nX2luZm8gKnR4cixcbitcdFx0XHQgICAgdTMyIHR4X2lkeCk7XG4rdm9pZCBibnh0X2h3cm1fdHhfcmluZ19mcmVlKHN0cnVjdCBibnh0ICpicCwgc3RydWN0IGJueHRfdHhfcmluZ19pbmZvICp0eHIsXG4rXHRcdFx0ICAgIGJvb2wgY2xvc2VfcGF0aCk7XG4rdm9pZCBibnh0X2h3cm1fY3BfcmluZ19mcmVlKHN0cnVjdCBibnh0ICpicCwgc3RydWN0IGJueHRfY3BfcmluZ19pbmZvICpjcHIpO1xuK3ZvaWQgYm54dF9jbGVhcl9vbmVfY3BfcmluZyhzdHJ1Y3QgYm54dCAqYnAsIHN0cnVjdCBibnh0X2NwX3JpbmdfaW5mbyAqY3ByKTtcbitpbnQgYm54dF90b3RhbF90eF9yaW5ncyhzdHJ1Y3QgYm54dCAqYnApO1xuIGludCBfX2JueHRfaHdybV9nZXRfdHhfcmluZ3Moc3RydWN0IGJueHQgKmJwLCB1MTYgZmlkLCBpbnQgKnR4X3JpbmdzKTtcbiBpbnQgYm54dF9ucV9yaW5nc19pbl91c2Uoc3RydWN0IGJueHQgKmJwKTtcbiBpbnQgYm54dF9od3JtX3NldF9jb2FsKHN0cnVjdCBibnh0ICopO1xuQEAgLTMwMzUsMTAgKzMxMTMsMTEgQEAgdm9pZCBibnh0X3N5bmNfcmluZ19zdGF0cyhzdHJ1Y3QgYm54dCAqYnApO1xuIGJvb2wgYm54dF9yZnNfY2FwYWJsZShzdHJ1Y3QgYm54dCAqYnAsIGJvb2wgbmV3X3Jzc19jdHgpO1xuIGludCBibnh0X2RiZ19od3JtX3JkX3JlZyhzdHJ1Y3QgYm54dCAqYnAsIHUzMiByZWdfb2ZmLCB1MTYgbnVtX3dvcmRzLFxuIFx0XHRcdCB1MzIgKnJlZ19idWYpO1xuK3ZvaWQgYm54dF9yZXNldF90YXNrKHN0cnVjdCBibnh0ICpicCwgYm9vbCBzaWxlbnQpO1xuIHZvaWQgYm54dF9md19leGNlcHRpb24oc3RydWN0IGJueHQgKmJwKTtcbiB2b2lkIGJueHRfZndfcmVzZXQoc3RydWN0IGJueHQgKmJwKTtcbiBpbnQgYm54dF9jaGVja19yaW5ncyhzdHJ1Y3QgYm54dCAqYnAsIGludCB0eCwgaW50IHJ4LCBib29sIHNoLCBpbnQgdGNzLFxuLVx0XHQgICAgIGludCB0eF94ZHApO1xuK1x0XHQgICAgIGludCB0eF94ZHAsIGludCBtcGNfdHgsIGludCBtcGNfY3ApO1xuIGludCBibnh0X2Z3X2luaXRfb25lKHN0cnVjdCBibnh0ICpicCk7XG4gYm9vbCBibnh0X2h3cm1fcmVzZXRfcGVybWl0dGVkKHN0cnVjdCBibnh0ICpicCk7XG4gdm9pZCBibnh0X3NldF9jcF9yaW5ncyhzdHJ1Y3QgYm54dCAqYnAsIGJvb2wgc2gpO1xuZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dF9jcnlwdG8uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dF9jcnlwdG8uY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAwLi4yN2E5NzhiZDE4ZTIwM1xuLS0tIC9kZXYvbnVsbFxuKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9ibnh0X2NyeXB0by5jXG5AQCAtMCwwICsxLDYxNyBAQFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcbisvKiBDb3B5cmlnaHQgKGMpIDIwMjYgQnJvYWRjb20gSW5jLiAqL1xuK1xuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L3N0ZGRlZi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvdHlwZXMuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2tlcm5lbC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvc2xhYi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvcGNpLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9ibnh0L2hzaS5oXHUwMDNlXG4rXG4rI2luY2x1ZGUgXCJibnh0LmhcIlxuKyNpbmNsdWRlIFwiYm54dF9od3JtLmhcIlxuKyNpbmNsdWRlIFwiYm54dF9tcGMuaFwiXG4rI2luY2x1ZGUgXCJibnh0X2t0bHMuaFwiXG4rI2luY2x1ZGUgXCJibnh0X2NyeXB0by5oXCJcbitcbitzdGF0aWMgdTMyIGJueHRfZ2V0X21heF9jcnlwdG9fa2V5X2N0eChzdHJ1Y3QgYm54dCAqYnAsIGludCBrZXlfdHlwZSlcbit7XG4rXHR1MzIgZndfbWFqID0gQk5YVF9GV19NQUooYnApO1xuK1xuK1x0aWYgKGtleV90eXBlID09IEJOWFRfVFhfQ1JZUFRPX0tFWV9UWVBFKVxuK1x0XHRyZXR1cm4gKGZ3X21haiBcdTAwM2MgMjMzKSA/IEJOWFRfTUFYX1RYX0NSWVBUT19LRVlTX1BSRV8yMzNGVyA6XG4rXHRcdCAgICAgICBCTlhUX01BWF9UWF9DUllQVE9fS0VZUztcbitcbitcdHJldHVybiAoZndfbWFqIFx1MDAzYyAyMzMpID8gQk5YVF9NQVhfUlhfQ1JZUFRPX0tFWVNfUFJFXzIzM0ZXIDpcbitcdCAgICAgICBCTlhUX01BWF9SWF9DUllQVE9fS0VZUztcbit9XG4rXG4rLyoqXG4rICogYm54dF9hbGxvY19jcnlwdG9faW5mbyAtIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGNyeXB0byBvZmZsb2FkIGNvbnRleHRcbisgKiBAYnA6IHBvaW50ZXIgdG8gYm54dCBkZXZpY2VcbisgKiBAcmVzcDogcG9pbnRlciB0byBmaXJtd2FyZSBjYXBhYmlsaXR5IHJlc3BvbnNlXG4rICpcbisgKiBBbGxvY2F0ZXMgdGhlIG1haW4gY3J5cHRvIGluZm8gc3RydWN0dXJlXG4rICpcbisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBkdXJpbmcgZGV2aWNlIGluaXRpYWxpemF0aW9uIHdoZW4gZmlybXdhcmVcbisgKiByZXBvcnRzIGNyeXB0byBvZmZsb2FkIGNhcGFiaWxpdHkuIElmIGFsbG9jYXRpb24gZmFpbHMsIGNyeXB0byBvZmZsb2FkXG4rICogd2lsbCBub3QgYmUgYXZhaWxhYmxlIGJ1dCB0aGUgZGV2aWNlIHdpbGwgc3RpbGwgZnVuY3Rpb24uXG4rICpcbisgKiBDb250ZXh0OiBQcm9jZXNzIGNvbnRleHRcbisgKi9cbit2b2lkIGJueHRfYWxsb2NfY3J5cHRvX2luZm8oc3RydWN0IGJueHQgKmJwLFxuK1x0XHRcdCAgICBzdHJ1Y3QgaHdybV9mdW5jX3FjYXBzX291dHB1dCAqcmVzcClcbit7XG4rXHR1MTYgbWF4X2tleXMgPSBsZTE2X3RvX2NwdShyZXNwLVx1MDAzZW1heF9rZXlfY3R4c19hbGxvYyk7XG4rXHRzdHJ1Y3QgYm54dF9jcnlwdG9faW5mbyAqY3J5cHRvID0gYnAtXHUwMDNlY3J5cHRvX2luZm87XG4rXHRzdHJ1Y3QgYm54dF9rY3R4ICprY3R4O1xuK1x0Y2hhciBuYW1lWzY0XTtcbitcdGludCBpO1xuK1xuK1x0aWYgKEJOWFRfVkYoYnApKVxuK1x0XHRyZXR1cm47XG4rXHRpZiAoIWNyeXB0bykge1xuK1x0XHRjcnlwdG8gPSBremFsbG9jX29iaigqY3J5cHRvKTtcbitcdFx0aWYgKCFjcnlwdG8pIHtcbitcdFx0XHRuZXRkZXZfd2FybihicC1cdTAwM2VkZXYsXG4rXHRcdFx0XHQgICAgXCJVbmFibGUgdG8gYWxsb2NhdGUgY3J5cHRvIGluZm9cXG5cIik7XG4rXHRcdFx0cmV0dXJuO1xuK1x0XHR9XG4rXHRcdHNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgXCJibnh0X2NyeXB0by0lc1wiLFxuK1x0XHRcdCBkZXZfbmFtZShcdTAwMjZicC1cdTAwM2VwZGV2LVx1MDAzZWRldikpO1xuK1x0XHRjcnlwdG8tXHUwMDNlbXBjX2NhY2hlID1cbitcdFx0XHRrbWVtX2NhY2hlX2NyZWF0ZShuYW1lLFxuK1x0XHRcdFx0XHQgIHNpemVvZihzdHJ1Y3QgYm54dF9jcnlwdG9fY21kX2N0eCksXG4rXHRcdFx0XHRcdCAgMCwgU0xBQl9IV0NBQ0hFX0FMSUdOLCBOVUxMKTtcbitcdFx0aWYgKCFjcnlwdG8tXHUwMDNlbXBjX2NhY2hlKVxuK1x0XHRcdGdvdG8gYWxsb2NfZXJyO1xuK1xuK1x0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBCTlhUX01BWF9DUllQVE9fS0VZX1RZUEU7IGkrKykge1xuK1x0XHRcdGtjdHggPSBcdTAwMjZjcnlwdG8tXHUwMDNla2N0eFtpXTtcbitcdFx0XHRrY3R4LVx1MDAzZXR5cGUgPSBpO1xuK1x0XHRcdElOSVRfTElTVF9IRUFEKFx1MDAyNmtjdHgtXHUwMDNlbGlzdCk7XG4rXHRcdFx0c3Bpbl9sb2NrX2luaXQoXHUwMDI2a2N0eC1cdTAwM2Vsb2NrKTtcbitcdFx0XHRhdG9taWNfc2V0KFx1MDAyNmtjdHgtXHUwMDNlYWxsb2NfcGVuZGluZywgMCk7XG4rXHRcdFx0aW5pdF93YWl0cXVldWVfaGVhZChcdTAwMjZrY3R4LVx1MDAzZWFsbG9jX3BlbmRpbmdfd3EpO1xuK1x0XHR9XG4rXHRcdGJwLVx1MDAzZWNyeXB0b19pbmZvID0gY3J5cHRvO1xuK1x0fVxuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgQk5YVF9NQVhfQ1JZUFRPX0tFWV9UWVBFOyBpKyspIHtcbitcdFx0a2N0eCA9IFx1MDAyNmNyeXB0by1cdTAwM2VrY3R4W2ldO1xuK1x0XHRrY3R4LVx1MDAzZW1heF9jdHggPSBibnh0X2dldF9tYXhfY3J5cHRvX2tleV9jdHgoYnAsIGkpO1xuK1x0fVxuK1x0Y3J5cHRvLVx1MDAzZW1heF9rZXlfY3R4c19hbGxvYyA9IG1heF9rZXlzO1xuK1x0aWYgKCFicC1cdTAwM2VrdGxzX2luZm8pXG4rXHRcdGJueHRfYWxsb2Nfa3Rsc19pbmZvKGJwKTtcbitcdGlmIChicC1cdTAwM2VrdGxzX2luZm8pXG4rXHRcdGJwLVx1MDAzZWZ3X2NhcCB8PSBCTlhUX0ZXX0NBUF9LVExTO1xuK1x0cmV0dXJuO1xuK1xuK2FsbG9jX2VycjpcbitcdGtmcmVlKGNyeXB0byk7XG4rfVxuK1xuK2ludCBibnh0X2NyeXB0b19kZWwoc3RydWN0IGJueHQgKmJwLCB1OCB0eXBlLCB1OCBraW5kLCB1MzIga2lkKVxuK3tcbitcdHN0cnVjdCBibnh0X3R4X3JpbmdfaW5mbyAqdHhyO1xuK1x0c3RydWN0IGNlX2RlbGV0ZV9jbWQgY21kID0ge307XG4rXHR1MzIgZGF0YTtcbitcbitcdGlmIChCTlhUX05PX0ZXX0FDQ0VTUyhicCkpXG4rXHRcdHJldHVybiAwO1xuK1xuK1x0dHhyID0gYm54dF9zZWxlY3RfbXBjX3JpbmcoYnAsIHR5cGUpO1xuK1x0aWYgKCF0eHIpXG4rXHRcdHJldHVybiAtRU5PREVWO1xuK1x0aWYgKGtpbmQgPT0gQk5YVF9DVFhfS0lORF9DS19UWClcbitcdFx0ZGF0YSA9IENFX0RFTEVURV9DTURfQ1RYX0tJTkRfQ0tfVFg7XG4rXHRlbHNlIGlmIChraW5kID09IEJOWFRfQ1RYX0tJTkRfQ0tfUlgpXG4rXHRcdGRhdGEgPSBDRV9ERUxFVEVfQ01EX0NUWF9LSU5EX0NLX1JYO1xuK1x0ZWxzZVxuK1x0XHRyZXR1cm4gLUVJTlZBTDtcbitcbitcdGRhdGEgfD0gQ0VfREVMRVRFX0NNRF9PUENPREVfREVMIHxcbitcdFx0KEJOWFRfS0lEX0hXKGtpZCkgXHUwMDNjXHUwMDNjIENFX0RFTEVURV9DTURfS0lEX1NGVCk7XG4rXG4rXHRjbWQuY3R4X2tpbmRfa2lkX29wY29kZSA9IGNwdV90b19sZTMyKGRhdGEpO1xuK1x0cmV0dXJuIGJueHRfeG1pdF9jcnlwdG9fY21kKGJwLCB0eHIsIFx1MDAyNmNtZCwgc2l6ZW9mKGNtZCksXG4rXHRcdFx0XHQgICAgQk5YVF9NUENfVE1PX01TRUNTKTtcbit9XG4rXG4rc3RhdGljIHZvaWQgYm54dF9jcnlwdG9fZGVsX2FsbF9raWRzKHN0cnVjdCBibnh0ICpicCwgc3RydWN0IGJueHRfa2lkX2luZm8gKmtpZClcbit7XG4rXHRpbnQgaSwgcmM7XG4rXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBraWQtXHUwMDNlY291bnQ7IGkrKykge1xuK1x0XHRpZiAoIXRlc3RfYml0KGksIGtpZC1cdTAwM2VpZHMpKSB7XG4rXHRcdFx0cmMgPSBibnh0X2NyeXB0b19kZWwoYnAsIGtpZC1cdTAwM2V0eXBlLCBraWQtXHUwMDNla2luZCxcbitcdFx0XHRcdFx0ICAgICBraWQtXHUwMDNlc3RhcnRfaWQgKyBpKTtcbitcdFx0XHRpZiAoIXJjKVxuK1x0XHRcdFx0c2V0X2JpdChpLCBraWQtXHUwMDNlaWRzKTtcbitcdFx0fVxuK1x0fVxuK31cbitcbisvKipcbisgKiBibnh0X2NyeXB0b19kZWxfYWxsIC0gRGVsZXRlIGFsbCBjcnlwdG8gY29ubmVjdGlvbnNcbisgKiBAYnA6IHBvaW50ZXIgdG8gYm54dCBkZXZpY2VcbisgKlxuKyAqIERlbGV0ZSBhbGwgY3J5cHRvIGNvbm5lY3Rpb25zIGFuZCBmcmVlIGFsbCBLSURzIGZvciByZS11c2UgZHVyaW5nXG4rICogc2h1dGRvd24uICBJbmNyZW1lbnQgdGhlIGVwb2NoIGNvdW50ZXIgdG8gaW52YWxpZGF0ZSBhbnkgb3V0c3RhbmRpbmdcbisgKiBrZXkgcmVmZXJlbmNlcy5cbisgKlxuKyAqIExvY2tpbmc6IHRoZSBjYWxsZXIgbXVzdCBoYXZlIGNsZWFyZWQgQk5YVF9TVEFURV9PUEVOIGFuZCB3YWl0ZWQgZm9yIGFsbFxuKyAqIGluLWZsaWdodCBrVExTIGNvbnRyb2wgb3BzIHRvIGRyYWluLiAgVW5kZXIgdGhlc2UgcHJlY29uZGl0aW9ucyB0aGVyZSBhcmVcbisgKiBubyBjb25jdXJyZW50IHJlYWRlcnMgb3Igd3JpdGVycyBvZiB0aGUgS0lEIGxpc3RzLCBzbyB0aGUgbGlzdHMgY2FuIGJlXG4rICogd2Fsa2VkIHdpdGhvdXQgcmN1X3JlYWRfbG9jaygpIG9yIHRoZSBrY3R4IGxvY2suXG4rICpcbisgKiBDb250ZXh0OiBQcm9jZXNzIGNvbnRleHQgZHVyaW5nIHNodXRkb3duL3Jlc2V0XG4rICovXG4rdm9pZCBibnh0X2NyeXB0b19kZWxfYWxsKHN0cnVjdCBibnh0ICpicClcbit7XG4rXHRzdHJ1Y3QgYm54dF9jcnlwdG9faW5mbyAqY3J5cHRvID0gYnAtXHUwMDNlY3J5cHRvX2luZm87XG4rXHRzdHJ1Y3QgYm54dF9raWRfaW5mbyAqa2lkO1xuK1x0c3RydWN0IGJueHRfa2N0eCAqa2N0eDtcbitcdGludCBpO1xuK1xuK1x0aWYgKCFjcnlwdG8pXG4rXHRcdHJldHVybjtcbitcbitcdC8qIE5vIGNvbmN1cnJlbnQgYWNjZXNzOyBzZWUgdGhlIGxvY2tpbmcgbm90ZSBhYm92ZS4gKi9cbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIEJOWFRfTUFYX0NSWVBUT19LRVlfVFlQRTsgaSsrKSB7XG4rXHRcdGtjdHggPSBcdTAwMjZjcnlwdG8tXHUwMDNla2N0eFtpXTtcbitcdFx0bGlzdF9mb3JfZWFjaF9lbnRyeShraWQsIFx1MDAyNmtjdHgtXHUwMDNlbGlzdCwgbGlzdClcbitcdFx0XHRibnh0X2NyeXB0b19kZWxfYWxsX2tpZHMoYnAsIGtpZCk7XG4rXHRcdGtjdHgtXHUwMDNlZXBvY2ggPSBCTlhUX05FWFRfRVBPQ0goa2N0eC1cdTAwM2VlcG9jaCk7XG4rXHR9XG4rfVxuK1xuKy8qKlxuKyAqIGJueHRfY2xlYXJfY3J5cHRvIC0gQ2xlYXIgYWxsIGNyeXB0byBrZXkgY29udGV4dHNcbisgKiBAYnA6IHBvaW50ZXIgdG8gYm54dCBkZXZpY2VcbisgKlxuKyAqIENsZWFycyBhbGwga2V5IGNvbnRleHQgYWxsb2NhdGlvbnMgZHVyaW5nIHNodXRkb3duIG9yIGZpcm13YXJlIHJlc2V0LlxuKyAqIEZyZWVzIGFsbCBrZXkgaW5mbyBzdHJ1Y3R1cmVzIGFuZCBiaXRtYXBzLCBhbmQgaW5jcmVtZW50cyB0aGUgZXBvY2hcbisgKiBjb3VudGVyIHRvIGludmFsaWRhdGUgYW55IG91dHN0YW5kaW5nIGtleSByZWZlcmVuY2VzLlxuKyAqXG4rICogTG9ja2luZzogdGhlIGNhbGxlciBtdXN0IGhhdmUgY2xlYXJlZCBCTlhUX1NUQVRFX09QRU4gYW5kIHdhaXRlZCBmb3IgYWxsXG4rICogaW4tZmxpZ2h0IGtUTFMgY29udHJvbCBvcHMgdG8gZHJhaW4uICBVbmRlciB0aGVzZSBwcmVjb25kaXRpb25zIHRoZXJlIGFyZVxuKyAqIG5vIGNvbmN1cnJlbnQgcmVhZGVycyBvciB3cml0ZXJzIG9mIHRoZSBLSUQgbGlzdHMsIHNvIHRoZSBsaXN0cyBjYW4gYmVcbisgKiB3YWxrZWQgd2l0aG91dCByY3VfcmVhZF9sb2NrKCkgb3IgdGhlIGtjdHggbG9jay5cbisgKlxuKyAqIENvbnRleHQ6IFByb2Nlc3MgY29udGV4dCBkdXJpbmcgc2h1dGRvd24vcmVzZXRcbisgKi9cbit2b2lkIGJueHRfY2xlYXJfY3J5cHRvKHN0cnVjdCBibnh0ICpicClcbit7XG4rXHRzdHJ1Y3QgYm54dF9jcnlwdG9faW5mbyAqY3J5cHRvID0gYnAtXHUwMDNlY3J5cHRvX2luZm87XG4rXHRzdHJ1Y3QgYm54dF9raWRfaW5mbyAqa2lkLCAqdG1wO1xuK1x0c3RydWN0IGJueHRfa2N0eCAqa2N0eDtcbitcdGludCBpO1xuK1xuK1x0aWYgKCFjcnlwdG8pXG4rXHRcdHJldHVybjtcbitcbitcdC8qIE5vIGNvbmN1cnJlbnQgYWNjZXNzOyBzZWUgdGhlIGxvY2tpbmcgbm90ZSBhYm92ZS4gKi9cbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIEJOWFRfTUFYX0NSWVBUT19LRVlfVFlQRTsgaSsrKSB7XG4rXHRcdGtjdHggPSBcdTAwMjZjcnlwdG8tXHUwMDNla2N0eFtpXTtcbitcdFx0bGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGtpZCwgdG1wLCBcdTAwMjZrY3R4LVx1MDAzZWxpc3QsIGxpc3QpIHtcbitcdFx0XHRsaXN0X2RlbChcdTAwMjZraWQtXHUwMDNlbGlzdCk7XG4rXHRcdFx0a2ZyZWUoa2lkKTtcbitcdFx0fVxuK1x0XHRrY3R4LVx1MDAzZXRvdGFsX2FsbG9jID0gMDtcbitcdFx0a2N0eC1cdTAwM2VlcG9jaCA9IEJOWFRfTkVYVF9FUE9DSChrY3R4LVx1MDAzZWVwb2NoKTtcbitcdH1cbit9XG4rXG4rLyoqXG4rICogYm54dF9mcmVlX2NyeXB0b19pbmZvIC0gRnJlZSBjcnlwdG8gb2ZmbG9hZCByZXNvdXJjZXNcbisgKiBAYnA6IHBvaW50ZXIgdG8gYm54dCBkZXZpY2VcbisgKlxuKyAqIEZyZWVzIGFsbCByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIGNyeXB0byBvZmZsb2FkLiAgQ2FsbCB0aGlzIGZ1bmN0aW9uXG4rICogb25seSB3aGVuIGl0IGlzIGlkbGUgd2l0aCBub3RoaW5nIGluLWZsaWdodC5cbisgKlxuKyAqIENvbnRleHQ6IFByb2Nlc3MgY29udGV4dCBkdXJpbmcgZGV2aWNlIHNodXRkb3duL3JlbW92YWxcbisgKi9cbit2b2lkIGJueHRfZnJlZV9jcnlwdG9faW5mbyhzdHJ1Y3QgYm54dCAqYnApXG4re1xuK1x0c3RydWN0IGJueHRfY3J5cHRvX2luZm8gKmNyeXB0byA9IGJwLVx1MDAzZWNyeXB0b19pbmZvO1xuK1xuK1x0Ym54dF9mcmVlX2t0bHNfaW5mbyhicCk7XG4rXHRpZiAoIWNyeXB0bylcbitcdFx0cmV0dXJuO1xuK1x0Ym54dF9jbGVhcl9jcnlwdG8oYnApO1xuK1x0a21lbV9jYWNoZV9kZXN0cm95KGNyeXB0by1cdTAwM2VtcGNfY2FjaGUpO1xuK1x0a2ZyZWUoY3J5cHRvKTtcbitcdGJwLVx1MDAzZWNyeXB0b19pbmZvID0gTlVMTDtcbitcdGJwLVx1MDAzZWZ3X2NhcCBcdTAwMjY9IH5CTlhUX0ZXX0NBUF9LVExTO1xuK31cbitcbisvKipcbisgKiBibnh0X2h3cm1fcmVzZXJ2ZV9wZl9rZXlfY3R4cyAtIFJlc2VydmUga2V5IGNvbnRleHRzIHdpdGggZmlybXdhcmVcbisgKiBAYnA6IHBvaW50ZXIgdG8gYm54dCBkZXZpY2VcbisgKiBAcmVxOiBwb2ludGVyIHRvIEhXUk0gZnVuY3Rpb24gY29uZmlnIHJlcXVlc3RcbisgKlxuKyAqIFBvcHVsYXRlcyB0aGUgZmlybXdhcmUgcmVxdWVzdCB3aXRoIGtleSBjb250ZXh0IHJlc2VydmF0aW9uIHBhcmFtZXRlcnNcbisgKiBmb3IgY3J5cHRvIG9mZmxvYWQgYmFzZWQgb24gY3VycmVudCBtYXggc2V0dGluZ3MgYW5kIGNhcGFiaWxpdGllcy5cbisgKlxuKyAqIENvbnRleHQ6IFByb2Nlc3MgY29udGV4dCBkdXJpbmcgZGV2aWNlIGNvbmZpZ3VyYXRpb25cbisgKi9cbit2b2lkIGJueHRfaHdybV9yZXNlcnZlX3BmX2tleV9jdHhzKHN0cnVjdCBibnh0ICpicCxcbitcdFx0XHRcdCAgIHN0cnVjdCBod3JtX2Z1bmNfY2ZnX2lucHV0ICpyZXEpXG4re1xuK1x0c3RydWN0IGJueHRfY3J5cHRvX2luZm8gKmNyeXB0byA9IGJwLVx1MDAzZWNyeXB0b19pbmZvO1xuK1x0c3RydWN0IGJueHRfaHdfcmVzYyAqaHdfcmVzYyA9IFx1MDAyNmJwLVx1MDAzZWh3X3Jlc2M7XG4rXHRzdHJ1Y3QgYm54dF9od19jcnlwdG9fcmVzYyAqY3J5cHRvX3Jlc2M7XG4rXHR1MzIgdHgsIHJ4O1xuK1xuK1x0aWYgKCFjcnlwdG8gfHwgIUJOWFRfU1VQUE9SVFNfS1RMUyhicCkpXG4rXHRcdHJldHVybjtcbitcbitcdGNyeXB0b19yZXNjID0gXHUwMDI2aHdfcmVzYy1cdTAwM2VjcnlwdG9fcmVzYztcbitcdHR4ID0gbWluKEJOWFRfVENLKGNyeXB0bykubWF4X2N0eCwgY3J5cHRvX3Jlc2MtXHUwMDNlbWF4X3R4X2tleV9jdHhzKTtcbitcdHJ4ID0gbWluKEJOWFRfUkNLKGNyeXB0bykubWF4X2N0eCwgY3J5cHRvX3Jlc2MtXHUwMDNlbWF4X3J4X2tleV9jdHhzKTtcbitcdHJlcS1cdTAwM2VudW1fa3Rsc190eF9rZXlfY3R4cyA9IGNwdV90b19sZTMyKHR4KTtcbitcdHJlcS1cdTAwM2VudW1fa3Rsc19yeF9rZXlfY3R4cyA9IGNwdV90b19sZTMyKHJ4KTtcbitcdGlmICh0eClcbitcdFx0cmVxLVx1MDAzZWVuYWJsZXMgfD0gY3B1X3RvX2xlMzIoRlVOQ19DRkdfUkVRX0VOQUJMRVNfS1RMU19UWF9LRVlfQ1RYUyk7XG4rXHRpZiAocngpXG4rXHRcdHJlcS1cdTAwM2VlbmFibGVzIHw9IGNwdV90b19sZTMyKEZVTkNfQ0ZHX1JFUV9FTkFCTEVTX0tUTFNfUlhfS0VZX0NUWFMpO1xuK31cbitcbitzdGF0aWMgaW50IGJueHRfa2V5X2N0eF9zdG9yZShzdHJ1Y3QgYm54dF9rY3R4ICprY3R4LCBfX2xlMzIgKmtleV9idWYsIHUzMiBudW0sXG4rXHRcdFx0ICAgICAgYm9vbCBjb250aWcsIHU4IGtpbmQsIHUzMiAqaWQpXG4re1xuK1x0c3RydWN0IGJueHRfa2lkX2luZm8gKmtpZDtcbitcdHUzMiBpO1xuK1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnVtOyApIHtcbitcdFx0a2lkID0ga3phbGxvY19vYmooKmtpZCk7XG4rXHRcdC8qIElmIHdlIGNhbm5vdCBzdG9yZSB0aGUgSURzLCB0aGV5IHdpbGwgYmUgbG9zdCBhbmQgb25seVxuK1x0XHQgKiByZWNsYWltZWQgYnkgdGhlIEZXIGR1cmluZyByZXNldC9yZWluaXQuXG4rXHRcdCAqL1xuK1x0XHRpZiAoIWtpZClcbitcdFx0XHRyZXR1cm4gLUVOT01FTTtcbitcdFx0a2lkLVx1MDAzZXN0YXJ0X2lkID0gbGUzMl90b19jcHUoa2V5X2J1ZltpXSk7XG4rXHRcdGtpZC1cdTAwM2V0eXBlID0ga2N0eC1cdTAwM2V0eXBlO1xuK1x0XHRraWQtXHUwMDNla2luZCA9IGtpbmQ7XG4rXHRcdGlmIChjb250aWcpXG4rXHRcdFx0a2lkLVx1MDAzZWNvdW50ID0gbnVtO1xuK1x0XHRlbHNlXG4rXHRcdFx0a2lkLVx1MDAzZWNvdW50ID0gMTtcbitcdFx0Yml0bWFwX3NldChraWQtXHUwMDNlaWRzLCAwLCBraWQtXHUwMDNlY291bnQpO1xuK1x0XHRpZiAoaWQgXHUwMDI2XHUwMDI2ICFpKSB7XG4rXHRcdFx0Y2xlYXJfYml0KDAsIGtpZC1cdTAwM2VpZHMpO1xuK1x0XHRcdCppZCA9IEJOWFRfU0VUX0tJRChrY3R4LCBraWQtXHUwMDNlc3RhcnRfaWQpO1xuK1x0XHR9XG4rXHRcdHNwaW5fbG9jayhcdTAwMjZrY3R4LVx1MDAzZWxvY2spO1xuK1x0XHRsaXN0X2FkZF90YWlsX3JjdShcdTAwMjZraWQtXHUwMDNlbGlzdCwgXHUwMDI2a2N0eC1cdTAwM2VsaXN0KTtcbitcdFx0V1JJVEVfT05DRShrY3R4LVx1MDAzZXRvdGFsX2FsbG9jLFxuK1x0XHRcdCAgIFJFQURfT05DRShrY3R4LVx1MDAzZXRvdGFsX2FsbG9jKSArIGtpZC1cdTAwM2Vjb3VudCk7XG4rXHRcdHNwaW5fdW5sb2NrKFx1MDAyNmtjdHgtXHUwMDNlbG9jayk7XG4rXHRcdGkgKz0ga2lkLVx1MDAzZWNvdW50O1xuK1x0fVxuK1x0cmV0dXJuIDA7XG4rfVxuK1xuKy8qIE5vdGUgdGhhdCB0aGUgZHJpdmVyIGRvZXMgbm90IGZyZWUgdGhlIGtleSBjb250ZXh0cy4gIFRoZXkgYXJlIGZyZWVkXG4rICogYnkgdGhlIEZXIGR1cmluZyBGTFIgYW5kIEhXUk1fRlVOQ19SRVNFVC5cbisgKi9cbitzdGF0aWMgaW50IGJueHRfaHdybV9rZXlfY3R4X2FsbG9jKHN0cnVjdCBibnh0ICpicCwgc3RydWN0IGJueHRfa2N0eCAqa2N0eCxcbitcdFx0XHRcdCAgIHU4IGtpbmQsIHUzMiBudW0sIHUzMiAqaWQpXG4re1xuK1x0c3RydWN0IGJueHRfY3J5cHRvX2luZm8gKmNyeXB0byA9IGJwLVx1MDAzZWNyeXB0b19pbmZvO1xuK1x0c3RydWN0IGh3cm1fZnVuY19rZXlfY3R4X2FsbG9jX291dHB1dCAqcmVzcDtcbitcdHN0cnVjdCBod3JtX2Z1bmNfa2V5X2N0eF9hbGxvY19pbnB1dCAqcmVxO1xuK1x0ZG1hX2FkZHJfdCBtYXBwaW5nO1xuK1x0aW50IHBlbmRpbmdfY291bnQ7XG4rXHRfX2xlMzIgKmtleV9idWY7XG4rXHR1MzIgbnVtX2FsbG9jO1xuK1x0Ym9vbCBjb250aWc7XG4rXHRpbnQgcmM7XG4rXG4rXHRudW0gPSBtaW4zKG51bSwgY3J5cHRvLVx1MDAzZW1heF9rZXlfY3R4c19hbGxvYywgKHUzMilCTlhUX0tJRF9CQVRDSF9TSVpFKTtcbitcdHJjID0gaHdybV9yZXFfaW5pdChicCwgcmVxLCBIV1JNX0ZVTkNfS0VZX0NUWF9BTExPQyk7XG4rXHRpZiAocmMpXG4rXHRcdHJldHVybiByYztcbitcbitcdGtleV9idWYgPSBod3JtX3JlcV9kbWFfc2xpY2UoYnAsIHJlcSwgbnVtICogNCwgXHUwMDI2bWFwcGluZyk7XG4rXHRpZiAoIWtleV9idWYpIHtcbitcdFx0cmMgPSAtRU5PTUVNO1xuK1x0XHRnb3RvIGtleV9hbGxvY19leGl0O1xuK1x0fVxuK1x0cmVxLVx1MDAzZWRtYV9idWZyX3NpemVfYnl0ZXMgPSBjcHVfdG9fbGUzMihudW0gKiA0KTtcbitcdHJlcS1cdTAwM2Vob3N0X2RtYV9hZGRyID0gY3B1X3RvX2xlNjQobWFwcGluZyk7XG4rXHRyZXNwID0gaHdybV9yZXFfaG9sZChicCwgcmVxKTtcbitcbitcdHJlcS1cdTAwM2VrZXlfY3R4X3R5cGUgPSBrY3R4LVx1MDAzZXR5cGU7XG4rXHRyZXEtXHUwMDNlbnVtX2tleV9jdHhzID0gY3B1X3RvX2xlMTYobnVtKTtcbitcbitcdHBlbmRpbmdfY291bnQgPSBhdG9taWNfaW5jX3JldHVybihcdTAwMjZrY3R4LVx1MDAzZWFsbG9jX3BlbmRpbmcpO1xuK1x0cmMgPSBod3JtX3JlcV9zZW5kKGJwLCByZXEpO1xuK1x0YXRvbWljX2RlYyhcdTAwMjZrY3R4LVx1MDAzZWFsbG9jX3BlbmRpbmcpO1xuK1x0aWYgKHJjKVxuK1x0XHRnb3RvIGtleV9hbGxvY19leGl0X3dha2U7XG4rXG4rXHRudW1fYWxsb2MgPSBsZTE2X3RvX2NwdShyZXNwLVx1MDAzZW51bV9rZXlfY3R4c19hbGxvY2F0ZWQpO1xuK1x0aWYgKG51bV9hbGxvYyBcdTAwM2UgbnVtKSB7XG4rXHRcdG5ldGRldl93YXJuKGJwLVx1MDAzZWRldixcbitcdFx0XHQgICAgXCJGVyBhbGxvY2F0ZWQgbW9yZSB0eXBlICVkIGtleXMgKCVkKSB0aGFuIHJlcXVlc3RlZCAoJWQpXFxuXCIsXG4rXHRcdFx0ICAgIGtjdHgtXHUwMDNldHlwZSwgbnVtX2FsbG9jLCBudW0pO1xuK1x0fSBlbHNlIGlmICghbnVtX2FsbG9jKSB7XG4rXHRcdG5ldGRldl93YXJuKGJwLVx1MDAzZWRldixcbitcdFx0XHQgICAgXCJGVyBhbGxvY2F0ZWQgMCB0eXBlICVkIGtleXNcXG5cIiwga2N0eC1cdTAwM2V0eXBlKTtcbitcdFx0cmMgPSAtRU5PRU5UO1xuK1x0XHRnb3RvIGtleV9hbGxvY19leGl0X3dha2U7XG4rXHR9IGVsc2Uge1xuK1x0XHRudW0gPSBudW1fYWxsb2M7XG4rXHR9XG4rXHRjb250aWcgPSByZXNwLVx1MDAzZWZsYWdzIFx1MDAyNlxuK1x0XHQgRlVOQ19LRVlfQ1RYX0FMTE9DX1JFU1BfRkxBR1NfS0VZX0NUWFNfQ09OVElHVU9VUztcbitcdHJjID0gYm54dF9rZXlfY3R4X3N0b3JlKGtjdHgsIGtleV9idWYsIG51bSwgY29udGlnLCBraW5kLCBpZCk7XG4rXG4ra2V5X2FsbG9jX2V4aXRfd2FrZTpcbitcdGlmIChwZW5kaW5nX2NvdW50IFx1MDAzZT0gQk5YVF9LQ1RYX0FMTE9DX1BFTkRJTkdfTUFYKVxuK1x0XHR3YWtlX3VwX2FsbChcdTAwMjZrY3R4LVx1MDAzZWFsbG9jX3BlbmRpbmdfd3EpO1xuK2tleV9hbGxvY19leGl0OlxuK1x0aHdybV9yZXFfZHJvcChicCwgcmVxKTtcbitcdHJldHVybiByYztcbit9XG4rXG4rYm9vbCBibnh0X2tpZF92YWxpZChzdHJ1Y3QgYm54dF9rY3R4ICprY3R4LCB1MzIgaWQpXG4re1xuK1x0c3RydWN0IGJueHRfa2lkX2luZm8gKmtpZDtcbitcdGJvb2wgdmFsaWQgPSBmYWxzZTtcbitcdHUzMiBlcG9jaDtcbitcbitcdGVwb2NoID0gQk5YVF9LSURfRVBPQ0goaWQpO1xuK1x0aWYgKGVwb2NoICE9IGtjdHgtXHUwMDNlZXBvY2gpXG4rXHRcdHJldHVybiBmYWxzZTtcbitcbitcdGlkID0gQk5YVF9LSURfSFcoaWQpO1xuK1x0cmN1X3JlYWRfbG9jaygpO1xuK1x0bGlzdF9mb3JfZWFjaF9lbnRyeV9yY3Uoa2lkLCBcdTAwMjZrY3R4LVx1MDAzZWxpc3QsIGxpc3QpIHtcbitcdFx0aWYgKGlkIFx1MDAzZT0ga2lkLVx1MDAzZXN0YXJ0X2lkIFx1MDAyNlx1MDAyNiBpZCBcdTAwM2Mga2lkLVx1MDAzZXN0YXJ0X2lkICsga2lkLVx1MDAzZWNvdW50KSB7XG4rXHRcdFx0aWYgKCF0ZXN0X2JpdChpZCAtIGtpZC1cdTAwM2VzdGFydF9pZCwga2lkLVx1MDAzZWlkcykpIHtcbitcdFx0XHRcdHZhbGlkID0gdHJ1ZTtcbitcdFx0XHRcdGJyZWFrO1xuK1x0XHRcdH1cbitcdFx0fVxuK1x0fVxuK1x0cmN1X3JlYWRfdW5sb2NrKCk7XG4rXHRyZXR1cm4gdmFsaWQ7XG4rfVxuK1xuK3N0YXRpYyBpbnQgYm54dF9hbGxvY19vbmVfa2N0eChzdHJ1Y3QgYm54dF9rY3R4ICprY3R4LCB1OCBraW5kLCB1MzIgKmlkKVxuK3tcbitcdHN0cnVjdCBibnh0X2tpZF9pbmZvICpraWQ7XG4rXHRpbnQgcmMgPSAtRU5PTUVNO1xuK1xuK1x0cmN1X3JlYWRfbG9jaygpO1xuK1x0bGlzdF9mb3JfZWFjaF9lbnRyeV9yY3Uoa2lkLCBcdTAwMjZrY3R4LVx1MDAzZWxpc3QsIGxpc3QpIHtcbitcdFx0dTMyIGlkeCA9IDA7XG4rXG4rXHRcdGlmIChraWQtXHUwMDNla2luZCAhPSBraW5kKVxuK1x0XHRcdGNvbnRpbnVlO1xuK1x0XHRkbyB7XG4rXHRcdFx0aWR4ID0gZmluZF9uZXh0X2JpdChraWQtXHUwMDNlaWRzLCBraWQtXHUwMDNlY291bnQsIGlkeCk7XG4rXHRcdFx0aWYgKGlkeCBcdTAwM2U9IGtpZC1cdTAwM2Vjb3VudClcbitcdFx0XHRcdGJyZWFrO1xuK1x0XHRcdGlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoaWR4LCBraWQtXHUwMDNlaWRzKSkge1xuK1x0XHRcdFx0KmlkID0gQk5YVF9TRVRfS0lEKGtjdHgsIGtpZC1cdTAwM2VzdGFydF9pZCArIGlkeCk7XG4rXHRcdFx0XHRyYyA9IDA7XG4rXHRcdFx0XHRnb3RvIGFsbG9jX2RvbmU7XG4rXHRcdFx0fVxuK1x0XHR9IHdoaWxlICgxKTtcbitcdH1cbitcbithbGxvY19kb25lOlxuK1x0cmN1X3JlYWRfdW5sb2NrKCk7XG4rXHRyZXR1cm4gcmM7XG4rfVxuK1xuKy8qKlxuKyAqIGJueHRfZnJlZV9vbmVfa2N0eCAtIEZyZWUgYSBrZXkgY29udGV4dCBmb3IgbGF0ZXIgcmUtdXNlXG4rICogQGtjdHg6IHBvaW50ZXIgdG8gYm54dF9rY3R4IGtleSBjb250ZXh0IHN0cnVjdHVyZVxuKyAqIEBpZDogS2V5IGNvbnRleHQgSURcbisgKlxuKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGZyZWUgYSBrZXkgY29udGV4dCBJRCB3aGVuIHRoZSBvZmZsb2FkXG4rICogdXNpbmcgdGhlIElEIGhhcyBzdWNjZXNzZnVsbHkgdGVybWluYXRlZCBvciBhYm9ydGVkLiAgSWYgdGhlIG9mZmxvYWRcbisgKiBjYW5ub3QgYmUgdGVybWluYXRlZCwgdGhlIGNhbGxlciBzaG91bGQgbm90IGNhbGwgdGhpcyBmdW5jdGlvbiB0byBmcmVlXG4rICogdGhlIElELiAgVGhlIElEIHdpbGwgb25seSBiZSByZWN5Y2xlZCBieSB0aGUgRlcgZHVyaW5nIHJlc2V0L3JlaW5pdC5cbisgKlxuKyAqIFRoZSBJRCBpcyBtYXRjaGVkIGJ5IGl0cyBoYXJkd2FyZSBpZCBvbmx5IChlcG9jaCBzdHJpcHBlZCksIHNvIHRoZSBjYWxsZXJcbisgKiBtdXN0IGVuc3VyZSBpdCBpcyB2YWxpZCBmb3IgdGhlIGN1cnJlbnQgZXBvY2guXG4rICovXG4rdm9pZCBibnh0X2ZyZWVfb25lX2tjdHgoc3RydWN0IGJueHRfa2N0eCAqa2N0eCwgdTMyIGlkKVxuK3tcbitcdHN0cnVjdCBibnh0X2tpZF9pbmZvICpraWQ7XG4rXG4rXHRpZCA9IEJOWFRfS0lEX0hXKGlkKTtcbitcdHJjdV9yZWFkX2xvY2soKTtcbitcdGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGtpZCwgXHUwMDI2a2N0eC1cdTAwM2VsaXN0LCBsaXN0KSB7XG4rXHRcdGlmIChpZCBcdTAwM2U9IGtpZC1cdTAwM2VzdGFydF9pZCBcdTAwMjZcdTAwMjYgaWQgXHUwMDNjIGtpZC1cdTAwM2VzdGFydF9pZCArIGtpZC1cdTAwM2Vjb3VudCkge1xuK1x0XHRcdHNldF9iaXQoaWQgLSBraWQtXHUwMDNlc3RhcnRfaWQsIGtpZC1cdTAwM2VpZHMpO1xuK1x0XHRcdGJyZWFrO1xuK1x0XHR9XG4rXHR9XG4rXHRyY3VfcmVhZF91bmxvY2soKTtcbit9XG4rXG4rI2RlZmluZSBCTlhUX0tDVFhfQUxMT0NfUkVUUllfTUFYXHQzXG4rXG4raW50IGJueHRfa2V5X2N0eF9hbGxvY19vbmUoc3RydWN0IGJueHQgKmJwLCBzdHJ1Y3QgYm54dF9rY3R4ICprY3R4LCB1OCBraW5kLFxuK1x0XHRcdCAgIHUzMiAqaWQpXG4re1xuK1x0aW50IHJjLCByZXRyeSA9IDA7XG4rXG4rXHR3aGlsZSAocmV0cnkrKyBcdTAwM2MgQk5YVF9LQ1RYX0FMTE9DX1JFVFJZX01BWCkge1xuK1x0XHRyYyA9IGJueHRfYWxsb2Nfb25lX2tjdHgoa2N0eCwga2luZCwgaWQpO1xuK1x0XHRpZiAoIXJjKVxuK1x0XHRcdHJldHVybiAwO1xuK1xuK1x0XHQvKiBXaGVuIGFwcHJvYWNoaW5nIHRoZSBtYXgsIG11bHRpcGxlIHRocmVhZHMgbWF5IHByb2NlZWRcbitcdFx0ICogYW5kIGV4Y2VlZCB0aGUgbWF4LiAgU29tZSBtYXkgZmFpbCB0aGUgc2VyaWFsaXplZCBIV1JNIGNhbGxcbitcdFx0ICogbGF0ZXIgd2hlbiB0aGUgbWF4IGlzIGV4Y2VlZGVkLlxuK1x0XHQgKi9cbitcdFx0aWYgKChSRUFEX09OQ0Uoa2N0eC1cdTAwM2V0b3RhbF9hbGxvYykgKyBCTlhUX0tJRF9CQVRDSF9TSVpFKSBcdTAwM2VcbitcdFx0ICAgIGtjdHgtXHUwMDNlbWF4X2N0eClcbitcdFx0XHRyZXR1cm4gLUVOT1NQQztcbitcbitcdFx0aWYgKCFCTlhUX0tDVFhfQUxMT0NfT0soa2N0eCkpIHtcbitcdFx0XHR3YWl0X2V2ZW50KGtjdHgtXHUwMDNlYWxsb2NfcGVuZGluZ193cSxcbitcdFx0XHRcdCAgIEJOWFRfS0NUWF9BTExPQ19PSyhrY3R4KSk7XG4rXHRcdFx0Y29udGludWU7XG4rXHRcdH1cbitcdFx0cmMgPSBibnh0X2h3cm1fa2V5X2N0eF9hbGxvYyhicCwga2N0eCwga2luZCxcbitcdFx0XHRcdFx0ICAgICBCTlhUX0tJRF9CQVRDSF9TSVpFLCBpZCk7XG4rXHRcdGlmICghcmMpXG4rXHRcdFx0cmV0dXJuIDA7XG4rXHR9XG4rXHRyZXR1cm4gLUVBR0FJTjtcbit9XG4rXG4rI2RlZmluZSBCTlhUX1hNSVRfQ1JZUFRPX1JFVFJZX01BWFx0MTBcbisjZGVmaW5lIEJOWFRfWE1JVF9DUllQVE9fTUlOX1RNT1x0MTAwXG4rI2RlZmluZSBCTlhUX1hNSVRfQ1JZUFRPX01BWF9UTU9cdDE1MFxuK1xuK2ludCBibnh0X3htaXRfY3J5cHRvX2NtZChzdHJ1Y3QgYm54dCAqYnAsIHN0cnVjdCBibnh0X3R4X3JpbmdfaW5mbyAqdHhyLFxuK1x0XHRcdCB2b2lkICpjbWQsIHVuc2lnbmVkIGludCBsZW4sIHVuc2lnbmVkIGludCB0bW8pXG4re1xuK1x0c3RydWN0IGJueHRfY3J5cHRvX2luZm8gKmNyeXB0byA9IGJwLVx1MDAzZWNyeXB0b19pbmZvO1xuK1x0c3RydWN0IGJueHRfY3J5cHRvX2NtZF9jdHggKmN0eCA9IE5VTEw7XG4rXHR1bnNpZ25lZCBsb25nIHRtb19sZWZ0LCBoYW5kbGUgPSAwO1xuK1x0aW50IHJjLCByZXRyeSA9IDA7XG4rXG4rXHRpZiAodG1vKSB7XG4rXHRcdHUzMiBraWQgPSBDRV9DTURfS0lEKGNtZCk7XG4rXG4rXHRcdGN0eCA9IGttZW1fY2FjaGVfYWxsb2MoY3J5cHRvLVx1MDAzZW1wY19jYWNoZSwgR0ZQX0tFUk5FTCk7XG4rXHRcdGlmICghY3R4KVxuK1x0XHRcdHJldHVybiAtRU5PTUVNO1xuK1x0XHRpbml0X2NvbXBsZXRpb24oXHUwMDI2Y3R4LVx1MDAzZWNtcCk7XG4rXHRcdGhhbmRsZSA9ICh1bnNpZ25lZCBsb25nKWN0eDtcbitcdFx0Y3R4LVx1MDAzZWtpZCA9IGtpZDtcbitcdFx0Y3R4LVx1MDAzZWNsaWVudCA9IHR4ci1cdTAwM2V0eF9yaW5nX3N0cnVjdC5tcGNfY2hubF90eXBlO1xuK1x0XHRjdHgtXHUwMDNlc3RhdHVzID0gMDtcbitcdFx0LyogT25lIHJlZmVyZW5jZSBmb3IgdGhpcyBjYWxsZXIsIG9uZSBmb3IgdGhlIGhhbmRsZSBzdG9yZWQgaW5cbitcdFx0ICogdGhlIFRYIGJ1ZiByaW5nLiAgVGhlIGxhdHRlciBpcyBkcm9wcGVkIGJ5XG4rXHRcdCAqIGJueHRfY3J5cHRvX21wY19jbXAoKSB3aGVuIHRoZSBjb21tYW5kIGlzIGNvbXBsZXRlZCBub3JtYWxseVxuK1x0XHQgKiBvciBhZnRlciB0aW1lb3V0LlxuK1x0XHQgKi9cbitcdFx0cmVmY291bnRfc2V0KFx1MDAyNmN0eC1cdTAwM2VyZWZjbnQsIDIpO1xuK1x0XHRyZXRyeSA9IEJOWFRfWE1JVF9DUllQVE9fUkVUUllfTUFYO1xuK1x0XHRtaWdodF9zbGVlcCgpO1xuK1x0fVxuK1x0ZG8ge1xuK1x0XHRzcGluX2xvY2tfYmgoXHUwMDI2dHhyLVx1MDAzZXR4X2xvY2spO1xuK1x0XHRyYyA9IGJueHRfc3RhcnRfeG1pdF9tcGMoYnAsIHR4ciwgY21kLCBsZW4sIGhhbmRsZSk7XG4rXHRcdHNwaW5fdW5sb2NrX2JoKFx1MDAyNnR4ci1cdTAwM2V0eF9sb2NrKTtcbitcdFx0aWYgKHJjID09IC1FQlVTWSBcdTAwMjZcdTAwMjYgdG1vIFx1MDAyNlx1MDAyNiByZXRyeSlcbitcdFx0XHR1c2xlZXBfcmFuZ2UoQk5YVF9YTUlUX0NSWVBUT19NSU5fVE1PLFxuK1x0XHRcdFx0ICAgICBCTlhUX1hNSVRfQ1JZUFRPX01BWF9UTU8pO1xuK1x0XHRlbHNlXG4rXHRcdFx0YnJlYWs7XG4rXHR9IHdoaWxlIChyZXRyeS0tKTtcbitcdGlmIChyYyB8fCAhdG1vKSB7XG4rXHRcdC8qIFRoZSBjb21wbGV0aW9uIHdpbGwgbmV2ZXIgYXJyaXZlLCBkcm9wIG9uZSByZWZlcmVuY2UgKi9cbitcdFx0aWYgKGN0eClcbitcdFx0XHRyZWZjb3VudF9kZWMoXHUwMDI2Y3R4LVx1MDAzZXJlZmNudCk7XG4rXHRcdGdvdG8geG1pdF9kb25lO1xuK1x0fVxuK1xuK1x0dG1vX2xlZnQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoXHUwMDI2Y3R4LVx1MDAzZWNtcCwgbXNlY3NfdG9famlmZmllcyh0bW8pKTtcbitcdGlmICghdG1vX2xlZnQpIHtcbitcdFx0bmV0ZGV2X3dhcm4oYnAtXHUwMDNlZGV2LCBcImNyeXB0byBNUCBjbWQgJTA4eCB0aW1lZCBvdXRcXG5cIixcbitcdFx0XHQgICAgKigodTMyICopY21kKSk7XG4rXHRcdGJueHRfbXBjX3RpbWVvdXQoYnAsIHR4cik7XG4rXHRcdHJjID0gLUVUSU1FRE9VVDtcbitcdFx0Z290byB4bWl0X2RvbmU7XG4rXHR9XG4rXHRpZiAoY3R4LVx1MDAzZXN0YXR1cyA9PSBCTlhUX0NNRF9DVFhfQ09NUExFVEVEIFx1MDAyNlx1MDAyNlxuK1x0ICAgIENFX0NNUExfU1RBVFVTKFx1MDAyNmN0eC1cdTAwM2VjZV9jbXApID09IENFX0NNUExfU1RBVFVTX09LKVxuK1x0XHRyYyA9IDA7XG4rXHRlbHNlXG4rXHRcdHJjID0gLUVJTztcbit4bWl0X2RvbmU6XG4rXHRpZiAocmMpIHtcbitcdFx0dTggc3RhdHVzID0gY3R4ID8gY3R4LVx1MDAzZXN0YXR1cyA6IDA7XG4rXG4rXHRcdG5ldGRldl93YXJuKGJwLVx1MDAzZWRldixcbitcdFx0XHQgICAgXCJNUEMgdHJhbnNtaXQgZmFpbGVkLCByaW5nIGlkeCAlZCwgb3AgMHgleCwga2lkIDB4JXgsIHN0YXR1cyAweCV4XFxuXCIsXG4rXHRcdFx0ICAgIHR4ci1cdTAwM2VibmFwaS1cdTAwM2VpbmRleCwgQ0VfQ01EX09QKGNtZCksIENFX0NNRF9LSUQoY21kKSxcbitcdFx0XHQgICAgc3RhdHVzKTtcbitcdH1cbitcdGlmIChjdHggXHUwMDI2XHUwMDI2IHJlZmNvdW50X2RlY19hbmRfdGVzdChcdTAwMjZjdHgtXHUwMDNlcmVmY250KSlcbitcdFx0a21lbV9jYWNoZV9mcmVlKGNyeXB0by1cdTAwM2VtcGNfY2FjaGUsIGN0eCk7XG4rXHRyZXR1cm4gcmM7XG4rfVxuK1xuK2ludCBibnh0X2NyeXB0b19pbml0KHN0cnVjdCBibnh0ICpicClcbit7XG4rXHRzdHJ1Y3QgYm54dF9jcnlwdG9faW5mbyAqY3J5cHRvID0gYnAtXHUwMDNlY3J5cHRvX2luZm87XG4rXHRzdHJ1Y3QgYm54dF9od19yZXNjICpod19yZXNjID0gXHUwMDI2YnAtXHUwMDNlaHdfcmVzYztcbitcdHN0cnVjdCBibnh0X2h3X2NyeXB0b19yZXNjICpjcnlwdG9fcmVzYztcbitcdGludCByYztcbitcbitcdGlmICghY3J5cHRvIHx8ICFCTlhUX1NVUFBPUlRTX0tUTFMoYnApKVxuK1x0XHRyZXR1cm4gMDtcbitcbitcdGNyeXB0b19yZXNjID0gXHUwMDI2aHdfcmVzYy1cdTAwM2VjcnlwdG9fcmVzYztcbitcdEJOWFRfVENLKGNyeXB0bykubWF4X2N0eCA9IGNyeXB0b19yZXNjLVx1MDAzZXJlc3ZfdHhfa2V5X2N0eHM7XG4rXHRCTlhUX1JDSyhjcnlwdG8pLm1heF9jdHggPSBjcnlwdG9fcmVzYy1cdTAwM2VyZXN2X3J4X2tleV9jdHhzO1xuK1xuK1x0aWYgKCFCTlhUX1RDSyhjcnlwdG8pLm1heF9jdHggfHwgIUJOWFRfUkNLKGNyeXB0bykubWF4X2N0eClcbitcdFx0cmV0dXJuIC1FTk9ERVY7XG4rXG4rXHRyYyA9IGJueHRfaHdybV9rZXlfY3R4X2FsbG9jKGJwLCBcdTAwMjZCTlhUX1RDSyhjcnlwdG8pLCBCTlhUX0NUWF9LSU5EX0NLX1RYLFxuK1x0XHRcdFx0ICAgICBCTlhUX0tJRF9CQVRDSF9TSVpFLCBOVUxMKTtcbitcdGlmIChyYylcbitcdFx0cmV0dXJuIHJjO1xuK1xuK1x0cmMgPSBibnh0X2h3cm1fa2V5X2N0eF9hbGxvYyhicCwgXHUwMDI2Qk5YVF9SQ0soY3J5cHRvKSwgQk5YVF9DVFhfS0lORF9DS19SWCxcbitcdFx0XHRcdCAgICAgQk5YVF9LSURfQkFUQ0hfU0laRSwgTlVMTCk7XG4rXHRpZiAocmMpXG4rXHRcdHJldHVybiByYztcbitcbitcdGJueHRfa3Rsc19pbml0KGJwKTtcbitcdHJldHVybiAwO1xuK31cbitcbit2b2lkIGJueHRfY3J5cHRvX21wY19jbXAoc3RydWN0IGJueHQgKmJwLCB1MzIgY2xpZW50LCB1bnNpZ25lZCBsb25nIGhhbmRsZSxcbitcdFx0XHQgc3RydWN0IGJueHRfY21wbF9lbnRyeSBjbXBsW10sIHUzMiBlbnRyaWVzKVxuK3tcbitcdHN0cnVjdCBibnh0X2NyeXB0b19jbWRfY3R4ICpjdHg7XG4rXHRzdHJ1Y3QgY2VfY21wbCAqY21wID0gTlVMTDtcbitcdHUzMiBsZW4sIGtpZDtcbitcbitcdGlmIChsaWtlbHkoY21wbCkpXG4rXHRcdGNtcCA9IGNtcGxbMF0uY21wbDtcbitcdGlmICghaGFuZGxlIHx8IGVudHJpZXMgIT0gMSkge1xuK1x0XHRpZiAoZW50cmllcyAhPSAxIFx1MDAyNlx1MDAyNiBjbXBsKSB7XG4rXHRcdFx0bmV0ZGV2X3dhcm4oYnAtXHUwMDNlZGV2LCBcIkludmFsaWQgZW50cmllcyAlZCB3aXRoIGhhbmRsZSAlbHggY21wbCAlMDh4IGluICVzKClcXG5cIixcbitcdFx0XHRcdCAgICBlbnRyaWVzLCBoYW5kbGUsICoodTMyICopY21wLCBfX2Z1bmNfXyk7XG4rXHRcdH1cbitcdFx0aWYgKCFoYW5kbGUpXG4rXHRcdFx0cmV0dXJuO1xuK1x0fVxuK1x0Y3R4ID0gKHZvaWQgKiloYW5kbGU7XG4rXHRjdHgtXHUwMDNlc3RhdHVzID0gQk5YVF9DTURfQ1RYX0NPTVBMRVRFRDtcbitcdGlmICh1bmxpa2VseSghY21wbCkpIHtcbitcdFx0Y3R4LVx1MDAzZXN0YXR1cyB8PSBCTlhUX0NNRF9DVFhfUkVTRVQ7XG4rXHRcdGdvdG8gY21wX2RvbmU7XG4rXHR9XG4rXHRraWQgPSBDRV9DTVBMX0tJRChjbXApO1xuK1x0aWYgKGN0eC1cdTAwM2VraWQgIT0ga2lkIHx8IGN0eC1cdTAwM2VjbGllbnQgIT0gY2xpZW50IHx8IGVudHJpZXMgIT0gMSkge1xuK1x0XHRuZXRkZXZfd2FybihicC1cdTAwM2VkZXYsXG4rXHRcdFx0ICAgIFwiSW52YWxpZCBDRSBjbXBsIDB4JTA4eCB3aXRoIGVudHJpZXMgJWQgZm9yIGNsaWVudCAlZCB3aXRoIHN0YXR1cyAweCV4LCBleHBlY3RlZCBraWQgMHgleCBhbmQgY2xpZW50ICVkXFxuXCIsXG4rXHRcdFx0ICAgICoodTMyICopY21wLCBlbnRyaWVzLCBjbGllbnQsIGN0eC1cdTAwM2VzdGF0dXMsIGN0eC1cdTAwM2VraWQsXG4rXHRcdFx0ICAgIGN0eC1cdTAwM2VjbGllbnQpO1xuK1x0XHRjdHgtXHUwMDNlc3RhdHVzIHw9IEJOWFRfQ01EX0NUWF9FUlJPUjtcbitcdH1cbitcdGxlbiA9IG1pbl90KHUzMiwgY21wbFswXS5sZW4sIHNpemVvZihjdHgtXHUwMDNlY2VfY21wKSk7XG4rXHRtZW1jcHkoXHUwMDI2Y3R4LVx1MDAzZWNlX2NtcCwgY21wbFswXS5jbXBsLCBsZW4pO1xuK2NtcF9kb25lOlxuK1x0Y29tcGxldGUoXHUwMDI2Y3R4LVx1MDAzZWNtcCk7XG4rXHRpZiAocmVmY291bnRfZGVjX2FuZF90ZXN0KFx1MDAyNmN0eC1cdTAwM2VyZWZjbnQpKVxuK1x0XHRrbWVtX2NhY2hlX2ZyZWUoYnAtXHUwMDNlY3J5cHRvX2luZm8tXHUwMDNlbXBjX2NhY2hlLCBjdHgpO1xuK31cbmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibnh0L2JueHRfY3J5cHRvLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibnh0L2JueHRfY3J5cHRvLmhcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwMC4uZDQ3NTkwNTlhNmQyMzBcbi0tLSAvZGV2L251bGxcbisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dF9jcnlwdG8uaFxuQEAgLTAsMCArMSwyMzAgQEBcbisvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5ICovXG4rLyogQ29weXJpZ2h0IChjKSAyMDI2IEJyb2FkY29tIEluYy4gKi9cbitcbisjaWZuZGVmIEJOWFRfQ1JZUFRPX0hcbisjZGVmaW5lIEJOWFRfQ1JZUFRPX0hcbitcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9yZWZjb3VudC5oXHUwMDNlXG4rXG4rI2RlZmluZSBCTlhUX01BWF9UWF9DUllQVE9fS0VZU1x0XHQyMDQ4MDBcbisjZGVmaW5lIEJOWFRfTUFYX1JYX0NSWVBUT19LRVlTXHRcdDIwNDgwMFxuK1xuKyNkZWZpbmUgQk5YVF9NQVhfVFhfQ1JZUFRPX0tFWVNfUFJFXzIzM0ZXXHQ2NTUzNVxuKyNkZWZpbmUgQk5YVF9NQVhfUlhfQ1JZUFRPX0tFWVNfUFJFXzIzM0ZXXHQ2NTUzNVxuK1xuK2VudW0gYm54dF9jcnlwdG9fdHlwZSB7XG4rXHRCTlhUX1RYX0NSWVBUT19LRVlfVFlQRSA9IEZVTkNfS0VZX0NUWF9BTExPQ19SRVFfS0VZX0NUWF9UWVBFX1RYLFxuK1x0Qk5YVF9SWF9DUllQVE9fS0VZX1RZUEUgPSBGVU5DX0tFWV9DVFhfQUxMT0NfUkVRX0tFWV9DVFhfVFlQRV9SWCxcbitcdEJOWFRfTUFYX0NSWVBUT19LRVlfVFlQRSxcbit9O1xuK1xuKy8qIE1heGltdW0ga2V5cyBzdXBwb3J0ZWQgYnkgbmV3ZXIgRlcgYWx3YXlzIG11bHRpcGxlcyBvZiAxMjggKi9cbisjZGVmaW5lIEJOWFRfS0lEX0JBVENIX1NJWkVcdDEyOFxuK1xuK3N0cnVjdCBibnh0X2tpZF9pbmZvIHtcbitcdHN0cnVjdCBsaXN0X2hlYWRcdGxpc3Q7XG4rXHR1OFx0XHRcdHR5cGU7XG4rXHR1OFx0XHRcdGtpbmQ7XG4rXHR1MzJcdFx0XHRzdGFydF9pZDtcbitcdHUzMlx0XHRcdGNvdW50O1xuK1x0REVDTEFSRV9CSVRNQVAoaWRzLCBCTlhUX0tJRF9CQVRDSF9TSVpFKTtcbit9O1xuK1xuK3N0cnVjdCBibnh0X2tjdHgge1xuK1x0c3RydWN0IGxpc3RfaGVhZFx0bGlzdDtcbitcdC8qIHRvIHNlcmlhbGl6ZSB1cGRhdGUgdG8gdGhlIGxpbmtlZCBsaXN0IGFuZCB0b3RhbF9hbGxvYyAqL1xuK1x0c3BpbmxvY2tfdFx0XHRsb2NrO1xuK1x0dThcdFx0XHR0eXBlO1xuK1x0dTE2XHRcdFx0ZXBvY2g7XG4rXHR1MzJcdFx0XHR0b3RhbF9hbGxvYztcbitcdHUzMlx0XHRcdG1heF9jdHg7XG4rXHRhdG9taWNfdFx0XHRhbGxvY19wZW5kaW5nO1xuKyNkZWZpbmUgQk5YVF9LQ1RYX0FMTE9DX1BFTkRJTkdfTUFYXHQ4XG4rXHR3YWl0X3F1ZXVlX2hlYWRfdFx0YWxsb2NfcGVuZGluZ193cTtcbit9O1xuK1xuKyNkZWZpbmUgQk5YVF9LSURfSFdfTUFTS1x0MHgwMDBmZmZmZlxuKyNkZWZpbmUgQk5YVF9LSURfSFcoa2lkKVx0KChraWQpIFx1MDAyNiBCTlhUX0tJRF9IV19NQVNLKVxuKyNkZWZpbmUgQk5YVF9LSURfRVBPQ0hfTUFTS1x0MHhmZmYwMDAwMFxuKyNkZWZpbmUgQk5YVF9LSURfRVBPQ0hfU0hJRlRcdDIwXG4rI2RlZmluZSBCTlhUX0tJRF9FUE9DSChraWQpXHQoKChraWQpIFx1MDAyNiBCTlhUX0tJRF9FUE9DSF9NQVNLKSBcdTAwM2VcdTAwM2VcdFxcXG4rXHRcdFx0XHQgQk5YVF9LSURfRVBPQ0hfU0hJRlQpXG4rXG4rI2RlZmluZSBCTlhUX05FWFRfRVBPQ0goZXBvY2gpXHRcXFxuK1x0KCgoZXBvY2gpICsgMSkgXHUwMDI2IChCTlhUX0tJRF9FUE9DSF9NQVNLIFx1MDAzZVx1MDAzZSBCTlhUX0tJRF9FUE9DSF9TSElGVCkpXG4rXG4rI2RlZmluZSBCTlhUX1NFVF9LSUQoa2N0eCwga2lkKVx0XHRcdFx0XHRcdFxcXG4rXHQoKGtpZCkgfCAoKHUzMikoa2N0eCktXHUwMDNlZXBvY2ggXHUwMDNjXHUwMDNjIEJOWFRfS0lEX0VQT0NIX1NISUZUKSlcbitcbisjZGVmaW5lIEJOWFRfS0NUWF9BTExPQ19PSyhrY3R4KVx0XFxcbitcdChhdG9taWNfcmVhZChcdTAwMjYoKGtjdHgpLVx1MDAzZWFsbG9jX3BlbmRpbmcpKSBcdTAwM2MgQk5YVF9LQ1RYX0FMTE9DX1BFTkRJTkdfTUFYKVxuK1xuK3N0cnVjdCBibnh0X2NyeXB0b19pbmZvIHtcbitcdHUxNlx0XHRcdG1heF9rZXlfY3R4c19hbGxvYztcbitcbitcdHN0cnVjdCBibnh0X2tjdHhcdGtjdHhbQk5YVF9NQVhfQ1JZUFRPX0tFWV9UWVBFXTtcbitcbitcdHN0cnVjdCBrbWVtX2NhY2hlXHQqbXBjX2NhY2hlO1xuK307XG4rXG4rc3RydWN0IGNlX2RlbGV0ZV9jbWQge1xuK1x0X19sZTMyICBjdHhfa2luZF9raWRfb3Bjb2RlO1xuK1x0I2RlZmluZSBDRV9ERUxFVEVfQ01EX09QQ09ERV9NQVNLXHRcdDB4ZlVMXG4rXHQjZGVmaW5lIENFX0RFTEVURV9DTURfT1BDT0RFX1NGVFx0XHQwXG4rXHQjZGVmaW5lIENFX0RFTEVURV9DTURfT1BDT0RFX0RFTFx0XHQgMHgyVUxcbitcdCNkZWZpbmUgQ0VfREVMRVRFX0NNRF9LSURfTUFTS1x0XHRcdDB4ZmZmZmYwVUxcbitcdCNkZWZpbmUgQ0VfREVMRVRFX0NNRF9LSURfU0ZUXHRcdFx0NFxuK1x0I2RlZmluZSBDRV9ERUxFVEVfQ01EX0NUWF9LSU5EX01BU0tcdFx0MHgxZjAwMDAwMFVMXG4rXHQjZGVmaW5lIENFX0RFTEVURV9DTURfQ1RYX0tJTkRfU0ZUXHRcdDI0XG4rXHQjZGVmaW5lIENFX0RFTEVURV9DTURfQ1RYX0tJTkRfQ0tfVFhcdFx0ICgweDExVUwgXHUwMDNjXHUwMDNjIDI0KVxuK1x0I2RlZmluZSBDRV9ERUxFVEVfQ01EX0NUWF9LSU5EX0NLX1JYXHRcdCAoMHgxMlVMIFx1MDAzY1x1MDAzYyAyNClcbit9O1xuK1xuKyNkZWZpbmUgQ0VfQ01EX09QX01BU0tcdFx0XHQweDAwMDAwZlVcbisjZGVmaW5lIENFX0NNRF9LSURfTUFTS1x0XHRcdDB4ZmZmZmYwVVxuKyNkZWZpbmUgQ0VfQ01EX0tJRF9TRlRcdFx0XHQ0XG4rXG4rI2RlZmluZSBDRV9DTURfT1AoY21kX3ApXHRcdFx0XHRcdFxcXG4rXHQobGUzMl90b19jcHUoKihfX2xlMzIgKikoY21kX3ApKSBcdTAwMjYgQ0VfQ01EX09QX01BU0spXG4rXG4rI2RlZmluZSBDRV9DTURfS0lEKGNtZF9wKVx0XHRcdFx0XHRcXFxuK1x0KChsZTMyX3RvX2NwdSgqKF9fbGUzMiAqKShjbWRfcCkpIFx1MDAyNiBDRV9DTURfS0lEX01BU0spIFx1MDAzZVx1MDAzZSBDRV9DTURfS0lEX1NGVClcbitcbitzdHJ1Y3QgY2VfY21wbCB7XG4rXHRfX2xlMTZcdGNsaWVudF9zdWJ0eXBlX3R5cGU7XG4rXHQjZGVmaW5lIENFX0NNUExfVFlQRV9NQVNLXHRcdFx0MHgzZlVMXG4rXHQjZGVmaW5lIENFX0NNUExfVFlQRV9TRlRcdFx0XHQwXG4rXHQjZGVmaW5lIENFX0NNUExfVFlQRV9NSURfUEFUSF9TSE9SVFx0XHQgMHgxZVVMXG4rXHQjZGVmaW5lIENFX0NNUExfU1VCVFlQRV9NQVNLXHRcdFx0MHhmMDBVTFxuK1x0I2RlZmluZSBDRV9DTVBMX1NVQlRZUEVfU0ZUXHRcdFx0OFxuK1x0I2RlZmluZSBDRV9DTVBMX1NVQlRZUEVfU09MSUNJVEVEXHRcdCAoMHgwVUwgXHUwMDNjXHUwMDNjIDgpXG4rXHQjZGVmaW5lIENFX0NNUExfU1VCVFlQRV9FUlJcdFx0XHQgKDB4MVVMIFx1MDAzY1x1MDAzYyA4KVxuK1x0I2RlZmluZSBDRV9DTVBMX1NVQlRZUEVfUkVTWU5DXHRcdFx0ICgweDJVTCBcdTAwM2NcdTAwM2MgOClcbitcdCNkZWZpbmUgQ0VfQ01QTF9NUF9DTElFTlRfTUFTS1x0XHRcdDB4ZjAwMFVMXG4rXHQjZGVmaW5lIENFX0NNUExfTVBfQ0xJRU5UX1NGVFx0XHRcdDEyXG4rXHQjZGVmaW5lIENFX0NNUExfTVBfQ0xJRU5UX1RDRVx0XHRcdCAoMHgwVUwgXHUwMDNjXHUwMDNjIDEyKVxuK1x0I2RlZmluZSBDRV9DTVBMX01QX0NMSUVOVF9SQ0VcdFx0XHQgKDB4MVVMIFx1MDAzY1x1MDAzYyAxMilcbitcdF9fbGUxNlx0c3RhdHVzO1xuK1x0I2RlZmluZSBDRV9DTVBMX1NUQVRVU19NQVNLXHRcdFx0MHhmVUxcbitcdCNkZWZpbmUgQ0VfQ01QTF9TVEFUVVNfU0ZUXHRcdFx0MFxuK1x0I2RlZmluZSBDRV9DTVBMX1NUQVRVU19PS1x0XHRcdCAweDBVTFxuK1x0I2RlZmluZSBDRV9DTVBMX1NUQVRVU19DVFhfTERfRVJSXHRcdCAweDFVTFxuK1x0I2RlZmluZSBDRV9DTVBMX1NUQVRVU19GSURfQ0hLX0VSUlx0XHQgMHgyVUxcbitcdCNkZWZpbmUgQ0VfQ01QTF9TVEFUVVNfQ1RYX1ZFUl9FUlJcdFx0IDB4M1VMXG4rXHQjZGVmaW5lIENFX0NNUExfU1RBVFVTX0RTVF9JRF9FUlJcdFx0IDB4NFVMXG4rXHQjZGVmaW5lIENFX0NNUExfU1RBVFVTX01QX0NNRF9FUlJcdFx0IDB4NVVMXG4rXHR1MzJcdG9wYXF1ZTtcbitcdF9fbGUzMlx0djtcbitcdCNkZWZpbmUgQ0VfQ01QTF9WICAgICAgICAgICAweDFVTFxuK1x0X19sZTMyXHRraWQ7XG4rXHQjZGVmaW5lIENFX0NNUExfS0lEX01BU0sgICAgMHhmZmZmZlVMXG4rXHQjZGVmaW5lIENFX0NNUExfS0lEX1NGVCAgICAgMFxuK307XG4rXG4rI2RlZmluZSBDRV9DTVBMX1NUQVRVUyhjZV9jbXBsKVx0XHRcdFx0XHRcdFxcXG4rXHQobGUxNl90b19jcHUoKGNlX2NtcGwpLVx1MDAzZXN0YXR1cykgXHUwMDI2IENFX0NNUExfU1RBVFVTX01BU0spXG4rXG4rI2RlZmluZSBDRV9DTVBMX0tJRChjZV9jbXBsKVx0XHRcdFx0XHRcdFxcXG4rXHQobGUzMl90b19jcHUoKGNlX2NtcGwpLVx1MDAzZWtpZCkgXHUwMDI2IENFX0NNUExfS0lEX01BU0spXG4rXG4rc3RydWN0IGJueHRfY3J5cHRvX2NtZF9jdHgge1xuK1x0c3RydWN0IGNvbXBsZXRpb24gY21wO1xuK1x0c3RydWN0IGNlX2NtcGwgY2VfY21wO1xuK1x0cmVmY291bnRfdCByZWZjbnQ7XG4rXHR1MzIga2lkO1xuK1x0dTE2IGNsaWVudDtcbitcdHU4IHN0YXR1cztcbisjZGVmaW5lIEJOWFRfQ01EX0NUWF9DT01QTEVURURcdDB4MVxuKyNkZWZpbmUgQk5YVF9DTURfQ1RYX0VSUk9SXHQweDJcbisjZGVmaW5lIEJOWFRfQ01EX0NUWF9SRVNFVFx0MHg0XG4rfTtcbitcbisjZGVmaW5lIEJOWFRfVENLKGNyeXB0bylcdCgoY3J5cHRvKS1cdTAwM2VrY3R4W0JOWFRfVFhfQ1JZUFRPX0tFWV9UWVBFXSlcbisjZGVmaW5lIEJOWFRfUkNLKGNyeXB0bylcdCgoY3J5cHRvKS1cdTAwM2VrY3R4W0JOWFRfUlhfQ1JZUFRPX0tFWV9UWVBFXSlcbitcbisjZGVmaW5lIEJOWFRfQ1RYX0tJTkRfQ0tfVFhcdDB4MTFcbisjZGVmaW5lIEJOWFRfQ1RYX0tJTkRfQ0tfUlhcdDB4MTJcbitcbisjaWZkZWYgQ09ORklHX0JOWFRfVExTXG4rdm9pZCBibnh0X2FsbG9jX2NyeXB0b19pbmZvKHN0cnVjdCBibnh0ICpicCxcbitcdFx0XHQgICAgc3RydWN0IGh3cm1fZnVuY19xY2Fwc19vdXRwdXQgKnJlc3ApO1xuK2ludCBibnh0X2NyeXB0b19kZWwoc3RydWN0IGJueHQgKmJwLCB1OCB0eXBlLCB1OCBraW5kLCB1MzIga2lkKTtcbit2b2lkIGJueHRfY3J5cHRvX2RlbF9hbGwoc3RydWN0IGJueHQgKmJwKTtcbit2b2lkIGJueHRfY2xlYXJfY3J5cHRvKHN0cnVjdCBibnh0ICpicCk7XG4rdm9pZCBibnh0X2ZyZWVfY3J5cHRvX2luZm8oc3RydWN0IGJueHQgKmJwKTtcbit2b2lkIGJueHRfaHdybV9yZXNlcnZlX3BmX2tleV9jdHhzKHN0cnVjdCBibnh0ICpicCxcbitcdFx0XHRcdCAgIHN0cnVjdCBod3JtX2Z1bmNfY2ZnX2lucHV0ICpyZXEpO1xuK2Jvb2wgYm54dF9raWRfdmFsaWQoc3RydWN0IGJueHRfa2N0eCAqa2N0eCwgdTMyIGlkKTtcbit2b2lkIGJueHRfZnJlZV9vbmVfa2N0eChzdHJ1Y3QgYm54dF9rY3R4ICprY3R4LCB1MzIgaWQpO1xuK2ludCBibnh0X2tleV9jdHhfYWxsb2Nfb25lKHN0cnVjdCBibnh0ICpicCwgc3RydWN0IGJueHRfa2N0eCAqa2N0eCwgdTgga2luZCxcbitcdFx0XHQgICB1MzIgKmlkKTtcbitpbnQgYm54dF94bWl0X2NyeXB0b19jbWQoc3RydWN0IGJueHQgKmJwLCBzdHJ1Y3QgYm54dF90eF9yaW5nX2luZm8gKnR4cixcbitcdFx0XHQgdm9pZCAqY21kLCB1bnNpZ25lZCBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgdG1vKTtcbitpbnQgYm54dF9jcnlwdG9faW5pdChzdHJ1Y3QgYm54dCAqYnApO1xuK3ZvaWQgYm54dF9jcnlwdG9fbXBjX2NtcChzdHJ1Y3QgYm54dCAqYnAsIHUzMiBjbGllbnQsIHVuc2lnbmVkIGxvbmcgaGFuZGxlLFxuK1x0XHRcdCBzdHJ1Y3QgYm54dF9jbXBsX2VudHJ5IGNtcGxbXSwgdTMyIGVudHJpZXMpO1xuKyNlbHNlXG4rc3RhdGljIGlubGluZSB2b2lkIGJueHRfYWxsb2NfY3J5cHRvX2luZm8oc3RydWN0IGJueHQgKmJwLFxuK1x0XHRcdFx0XHQgIHN0cnVjdCBod3JtX2Z1bmNfcWNhcHNfb3V0cHV0ICpyZXNwKVxuK3tcbit9XG4rXG4rc3RhdGljIGlubGluZSBpbnQgYm54dF9jcnlwdG9fZGVsKHN0cnVjdCBibnh0ICpicCwgdTggdHlwZSwgdTgga2luZCwgdTMyIGtpZClcbit7XG4rXHRyZXR1cm4gLUVPUE5PVFNVUFA7XG4rfVxuK1xuK3N0YXRpYyBpbmxpbmUgdm9pZCBibnh0X2NyeXB0b19kZWxfYWxsKHN0cnVjdCBibnh0ICpicClcbit7XG4rfVxuK1xuK3N0YXRpYyBpbmxpbmUgdm9pZCBibnh0X2NsZWFyX2NyeXB0byhzdHJ1Y3QgYm54dCAqYnApXG4re1xuK31cbitcbitzdGF0aWMgaW5saW5lIHZvaWQgYm54dF9mcmVlX2NyeXB0b19pbmZvKHN0cnVjdCBibnh0ICpicClcbit7XG4rfVxuK1xuK3N0YXRpYyBpbmxpbmUgdm9pZCBibnh0X2h3cm1fcmVzZXJ2ZV9wZl9rZXlfY3R4cyhzdHJ1Y3QgYm54dCAqYnAsXG4rXHRcdFx0XHRcdFx0IHN0cnVjdCBod3JtX2Z1bmNfY2ZnX2lucHV0ICpyZXEpXG4re1xuK31cbitcbitzdGF0aWMgaW5saW5lIGJvb2wgYm54dF9raWRfdmFsaWQoc3RydWN0IGJueHRfa2N0eCAqa2N0eCwgdTMyIGlkKVxuK3tcbitcdHJldHVybiBmYWxzZTtcbit9XG4rXG4rc3RhdGljIGlubGluZSB2b2lkIGJueHRfZnJlZV9vbmVfa2N0eChzdHJ1Y3QgYm54dF9rY3R4ICprY3R4LCB1MzIgaWQpXG4re1xuK31cbitcbitzdGF0aWMgaW5saW5lIGludCBibnh0X2tleV9jdHhfYWxsb2Nfb25lKHN0cnVjdCBibnh0ICpicCxcbitcdFx0XHRcdFx0IHN0cnVjdCBibnh0X2tjdHggKmtjdHgsIHU4IGtpbmQsXG4rXHRcdFx0XHRcdCB1MzIgKmlkKVxuK3tcbitcdHJldHVybiAtRU9QTk9UU1VQUDtcbit9XG4rXG4rc3RhdGljIGlubGluZSBpbnQgYm54dF94bWl0X2NyeXB0b19jbWQoc3RydWN0IGJueHQgKmJwLFxuK1x0XHRcdFx0ICAgICAgIHN0cnVjdCBibnh0X3R4X3JpbmdfaW5mbyAqdHhyLFxuK1x0XHRcdFx0ICAgICAgIHZvaWQgKmNtZCwgdW5zaWduZWQgaW50IGxlbixcbitcdFx0XHRcdCAgICAgICB1bnNpZ25lZCBpbnQgdG1vKVxuK3tcbitcdHJldHVybiAtRU9QTk9UU1VQUDtcbit9XG4rXG4rc3RhdGljIGlubGluZSBpbnQgYm54dF9jcnlwdG9faW5pdChzdHJ1Y3QgYm54dCAqYnApXG4re1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK3N0YXRpYyBpbmxpbmUgdm9pZCBibnh0X2NyeXB0b19tcGNfY21wKHN0cnVjdCBibnh0ICpicCwgdTMyIGNsaWVudCxcbitcdFx0XHRcdCAgICAgICB1bnNpZ25lZCBsb25nIGhhbmRsZSxcbitcdFx0XHRcdCAgICAgICBzdHJ1Y3QgYm54dF9jbXBsX2VudHJ5IGNtcGxbXSxcbitcdFx0XHRcdCAgICAgICB1MzIgZW50cmllcylcbit7XG4rfVxuKyNlbmRpZlx0LyogQ09ORklHX0JOWFRfVExTICovXG4rI2VuZGlmXHQvKiBCTlhUX0NSWVBUT19IICovXG5kaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9ibnh0X2V0aHRvb2wuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dF9ldGh0b29sLmNcbmluZGV4IDYyYmM5Y2FlNjEzYzM4Li5jZWU3NDM5OTZkM2YyMyAxMDA2NDRcbi0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dF9ldGh0b29sLmNcbisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dF9ldGh0b29sLmNcbkBAIC0zNyw2ICszNyw4IEBAXG4gI2luY2x1ZGUgXCJibnh0X252bV9kZWZzLmhcIlx0LyogTlZSQU0gY29udGVudCBjb25zdGFudCBhbmQgc3RydWN0dXJlIGRlZnMgKi9cbiAjaW5jbHVkZSBcImJueHRfZndfaGRyLmhcIlx0LyogRmlybXdhcmUgaGRyIGNvbnN0YW50IGFuZCBzdHJ1Y3R1cmUgZGVmcyAqL1xuICNpbmNsdWRlIFwiYm54dF9jb3JlZHVtcC5oXCJcbisjaW5jbHVkZSBcImJueHRfbXBjLmhcIlxuKyNpbmNsdWRlIFwiYm54dF9rdGxzLmhcIlxuIFxuICNkZWZpbmUgQk5YVF9OVk1fRVJSX01TRyhkZXYsIGV4dGFjaywgbXNnKVx0XHRcdFxcXG4gXHRkbyB7XHRcdFx0XHRcdFx0XHRcXFxuQEAgLTM1Myw2ICszNTUsMzAgQEAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGJueHRfcmluZ19kcnZfc3RhdHNfYXJyW10gPSB7XG4gXHRcInRvdGFsX21pc3NlZF9pcnFzXCIsXG4gfTtcbiBcbisvKiBrVExTIGRhdGEgcGxhbmUgY291bnRlciBzdHJpbmdzIGluZGV4ZWQgYnkgZW51bSBibnh0X2t0bHNfZGF0YV9jb3VudGVycyAqL1xuK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBibnh0X2t0bHNfZGF0YV9zdGF0c1tdID0ge1xuK1x0W0JOWFRfS1RMU19UWF9QS1RTXVx0XHQ9IFwidHhfdGxzX2VuY3J5cHRlZF9wYWNrZXRzXCIsXG4rXHRbQk5YVF9LVExTX1RYX0JZVEVTXVx0XHQ9IFwidHhfdGxzX2VuY3J5cHRlZF9ieXRlc1wiLFxuK1x0W0JOWFRfS1RMU19UWF9PT09fUEtUU11cdFx0XHQ9IFwidHhfdGxzX29vb19wYWNrZXRzXCIsXG4rXHRbQk5YVF9LVExTX1RYX09PT19GQUxMQkFDS19OT19TWU5DXVx0PSBcInR4X3Rsc19vb29fZmFsbGJhY2tfbm9fc3luY1wiLFxuK1x0W0JOWFRfS1RMU19UWF9PT09fRkFMTEJBQ0tfTk9fU1BBQ0VdXHQ9IFwidHhfdGxzX29vb19mYWxsYmFja19ub19zcGFjZVwiLFxuK1x0W0JOWFRfS1RMU19UWF9PT09fRkFMTEJBQ0tfTk9fSERSXVx0PSBcInR4X3Rsc19vb29fZmFsbGJhY2tfbm9faGRyXCIsXG4rfTtcbitcbisvKiBrVExTIGNvbnRyb2wgcGxhbmUgY291bnRlciBzdHJpbmdzIGluZGV4ZWQgYnkgZW51bSBibnh0X2t0bHNfY3RybF9jb3VudGVycyAqL1xuK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBibnh0X2t0bHNfY3RybF9zdGF0c1tdID0ge1xuK1x0W0JOWFRfS1RMU19UWF9BRERdXHRcdFx0PSBcInR4X3Rsc19hZGRcIixcbitcdFtCTlhUX0tUTFNfVFhfREVMXVx0XHRcdD0gXCJ0eF90bHNfZGVsXCIsXG4rXHRbQk5YVF9LVExTX0VSUl9OT19NRU1dXHRcdFx0PSBcInRsc19lcnJfbm9fbWVtXCIsXG4rXHRbQk5YVF9LVExTX0VSUl9OT19DQVBdXHRcdFx0PSBcInRsc19lcnJfbm9fY2FwXCIsXG4rXHRbQk5YVF9LVExTX0VSUl9LRVlfQ1RYX0FMTE9DXVx0XHQ9IFwidGxzX2Vycl9rZXlfY3R4X2FsbG9jXCIsXG4rXHRbQk5YVF9LVExTX0VSUl9DUllQVE9fQ01EXVx0XHQ9IFwidGxzX2Vycl9jcnlwdG9fY21kXCIsXG4rXHRbQk5YVF9LVExTX0VSUl9ERVZJQ0VfQlVTWV1cdFx0PSBcInRsc19lcnJfZGV2aWNlX2J1c3lcIixcbitcdFtCTlhUX0tUTFNfRVJSX0lOVkFMSURfQ0lQSEVSXVx0XHQ9IFwidGxzX2Vycl9pbnZhbGlkX2NpcGhlclwiLFxuK1x0W0JOWFRfS1RMU19FUlJfU1RBVEVfTk9UX09QRU5dXHRcdD0gXCJ0bHNfZXJyX3N0YXRlX25vdF9vcGVuXCIsXG4rXHRbQk5YVF9LVExTX0VSUl9SRVRSWV9FWENFRURFRF1cdFx0PSBcInRsc19lcnJfcmV0cnlfZXhjZWVkZWRcIixcbit9O1xuK1xuICNkZWZpbmUgTlVNX1JJTkdfUlhfU1dfU1RBVFNcdFx0QVJSQVlfU0laRShibnh0X3J4X3N3X3N0YXRzX3N0cilcbiAjZGVmaW5lIE5VTV9SSU5HX0NNTl9TV19TVEFUU1x0XHRBUlJBWV9TSVpFKGJueHRfY21uX3N3X3N0YXRzX3N0cilcbiAjZGVmaW5lIE5VTV9SSU5HX1JYX0hXX1NUQVRTXHRcdEFSUkFZX1NJWkUoYm54dF9yaW5nX3J4X3N0YXRzX3N0cilcbkBAIC01MzUsMTIgKzU2MSwyMSBAQCBzdGF0aWMgaW50IGJueHRfZ2V0X251bV9yaW5nX3N0YXRzKHN0cnVjdCBibnh0ICpicClcbiBcdCAgICAgICBjbW4gKiBicC1cdTAwM2VjcF9ucl9yaW5ncztcbiB9XG4gXG4rc3RhdGljIGludCBibnh0X2dldF9udW1fa3Rsc19zdGF0cyhzdHJ1Y3QgYm54dCAqYnApXG4re1xuK1x0aWYgKCFicC1cdTAwM2VrdGxzX2luZm8pXG4rXHRcdHJldHVybiAwO1xuK1x0cmV0dXJuIEFSUkFZX1NJWkUoYm54dF9rdGxzX2N0cmxfc3RhdHMpICtcbitcdCAgICAgICBBUlJBWV9TSVpFKGJueHRfa3Rsc19kYXRhX3N0YXRzKTtcbit9XG4rXG4gc3RhdGljIGludCBibnh0X2dldF9udW1fc3RhdHMoc3RydWN0IGJueHQgKmJwKVxuIHtcbiBcdGludCBudW1fc3RhdHMgPSBibnh0X2dldF9udW1fcmluZ19zdGF0cyhicCk7XG4gXHRpbnQgbGVuO1xuIFxuIFx0bnVtX3N0YXRzICs9IEJOWFRfTlVNX1JJTkdfRFJWX1NUQVRTO1xuK1x0bnVtX3N0YXRzICs9IGJueHRfZ2V0X251bV9rdGxzX3N0YXRzKGJwKTtcbiBcbiBcdGlmIChicC1cdTAwM2VmbGFncyBcdTAwMjYgQk5YVF9GTEFHX1BPUlRfU1RBVFMpXG4gXHRcdG51bV9zdGF0cyArPSBCTlhUX05VTV9QT1JUX1NUQVRTO1xuQEAgLTY1Myw2ICs2ODgsMTYgQEAgc3RhdGljIHZvaWQgYm54dF9nZXRfZXRodG9vbF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LFxuIFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgQk5YVF9OVU1fUklOR19EUlZfU1RBVFM7IGkrKywgaisrLCBjdXJyKyssIHByZXYrKylcbiBcdFx0YnVmW2pdID0gKmN1cnIgKyAqcHJldjtcbiBcbitcdGlmIChicC1cdTAwM2VrdGxzX2luZm8pIHtcbitcdFx0c3RydWN0IGJueHRfdGxzX2luZm8gKmt0bHMgPSBicC1cdTAwM2VrdGxzX2luZm87XG4rXHRcdHN0cnVjdCBibnh0X3Rsc19zd19zdGF0cyB0bHNfc3RhdHMgPSB7fTtcbitcbitcdFx0Ym54dF9nZXRfcmluZ190bHNfc3RhdHMoYnAsIFx1MDAyNnRsc19zdGF0cyk7XG4rXHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIEFSUkFZX1NJWkUoYm54dF9rdGxzX2RhdGFfc3RhdHMpOyBpKyssIGorKylcbitcdFx0XHRidWZbal0gPSB0bHNfc3RhdHMuY291bnRlcnNbaV07XG4rXHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIEFSUkFZX1NJWkUoYm54dF9rdGxzX2N0cmxfc3RhdHMpOyBpKyssIGorKylcbitcdFx0XHRidWZbal0gPSBhdG9taWM2NF9yZWFkKFx1MDAyNmt0bHMtXHUwMDNlY291bnRlcnNbaV0pO1xuK1x0fVxuIFx0aWYgKGJwLVx1MDAzZWZsYWdzIFx1MDAyNiBCTlhUX0ZMQUdfUE9SVF9TVEFUUykge1xuIFx0XHR1NjQgKnBvcnRfc3RhdHMgPSBicC1cdTAwM2Vwb3J0X3N0YXRzLnN3X3N0YXRzO1xuIFxuQEAgLTc2Myw2ICs4MDgsMTIgQEAgc3RhdGljIHZvaWQgYm54dF9nZXRfc3RyaW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgc3RyaW5nc2V0LCB1OCAqYnVmKVxuIFx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBCTlhUX05VTV9SSU5HX0RSVl9TVEFUUzsgaSsrKVxuIFx0XHRcdGV0aHRvb2xfcHV0cyhcdTAwMjZidWYsIGJueHRfcmluZ19kcnZfc3RhdHNfYXJyW2ldKTtcbiBcbitcdFx0aWYgKGJwLVx1MDAzZWt0bHNfaW5mbykge1xuK1x0XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIEFSUkFZX1NJWkUoYm54dF9rdGxzX2RhdGFfc3RhdHMpOyBpKyspXG4rXHRcdFx0XHRldGh0b29sX3B1dHMoXHUwMDI2YnVmLCBibnh0X2t0bHNfZGF0YV9zdGF0c1tpXSk7XG4rXHRcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgQVJSQVlfU0laRShibnh0X2t0bHNfY3RybF9zdGF0cyk7IGkrKylcbitcdFx0XHRcdGV0aHRvb2xfcHV0cyhcdTAwMjZidWYsIGJueHRfa3Rsc19jdHJsX3N0YXRzW2ldKTtcbitcdFx0fVxuIFx0XHRpZiAoYnAtXHUwMDNlZmxhZ3MgXHUwMDI2IEJOWFRfRkxBR19QT1JUX1NUQVRTKVxuIFx0XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIEJOWFRfTlVNX1BPUlRfU1RBVFM7IGkrKykge1xuIFx0XHRcdFx0c3RyID0gYm54dF9wb3J0X3N0YXRzX2FycltpXS5zdHJpbmc7XG5AQCAtOTU5LDYgKzEwMTAsNyBAQCBzdGF0aWMgaW50IGJueHRfc2V0X2NoYW5uZWxzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsXG4gXHRzdHJ1Y3QgYm54dCAqYnAgPSBuZXRkZXZfcHJpdihkZXYpO1xuIFx0aW50IHJlcV90eF9yaW5ncywgcmVxX3J4X3JpbmdzLCB0Y3M7XG4gXHR1MzIgbmV3X3RibF9zaXplID0gMCwgb2xkX3RibF9zaXplO1xuK1x0aW50IG1wY19wZXJfdHlwZSwgbXBjX2NwO1xuIFx0Ym9vbCBzaCA9IGZhbHNlO1xuIFx0aW50IHR4X3hkcCA9IDA7XG4gXHRpbnQgcmMgPSAwO1xuQEAgLTk5Myw3ICsxMDQ1LDEyIEBAIHN0YXRpYyBpbnQgYm54dF9zZXRfY2hhbm5lbHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldixcbiBcdFx0dHhfeGRwID0gcmVxX3J4X3JpbmdzO1xuIFx0fVxuIFxuLVx0cmMgPSBibnh0X2NoZWNrX3JpbmdzKGJwLCByZXFfdHhfcmluZ3MsIHJlcV9yeF9yaW5ncywgc2gsIHRjcywgdHhfeGRwKTtcbitcdGJueHRfY2FsY19kZmx0X21wY19yaW5ncyhicCxcbitcdFx0XHRcdCByZXFfdHhfcmluZ3MgKiAodGNzIFx1MDAzZSAxID8gdGNzIDogMSkgKyB0eF94ZHAsXG4rXHRcdFx0XHQgcmVxX3R4X3JpbmdzLCByZXFfcnhfcmluZ3MsIFx1MDAyNm1wY19wZXJfdHlwZSxcbitcdFx0XHRcdCBcdTAwMjZtcGNfY3ApO1xuK1x0cmMgPSBibnh0X2NoZWNrX3JpbmdzKGJwLCByZXFfdHhfcmluZ3MsIHJlcV9yeF9yaW5ncywgc2gsIHRjcywgdHhfeGRwLFxuK1x0XHRcdCAgICAgIG1wY19wZXJfdHlwZSAqIEJOWFRfTVBDX1RZUEVfTUFYLCBtcGNfY3ApO1xuIFx0aWYgKHJjKSB7XG4gXHRcdG5ldGRldl93YXJuKGRldiwgXCJVbmFibGUgdG8gYWxsb2NhdGUgdGhlIHJlcXVlc3RlZCByaW5nc1xcblwiKTtcbiBcdFx0cmV0dXJuIHJjO1xuQEAgLTEwNTEsNiArMTEwOCw4IEBAIHN0YXRpYyBpbnQgYm54dF9zZXRfY2hhbm5lbHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldixcbiBcbiBcdGJueHRfc2V0X2NwX3JpbmdzKGJwLCBzaCk7XG4gXG4rXHRibnh0X3NldF9kZmx0X21wY19yaW5ncyhicCk7XG4rXG4gXHQvKiBBZnRlciBjaGFuZ2luZyBudW1iZXIgb2YgcnggY2hhbm5lbHMsIHVwZGF0ZSBOVFVQTEUgZmVhdHVyZS4gKi9cbiBcdG5ldGRldl91cGRhdGVfZmVhdHVyZXMoZGV2KTtcbiBcdGlmIChuZXRpZl9ydW5uaW5nKGRldikpIHtcbmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibnh0L2JueHRfZ3NvLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibnh0L2JueHRfZ3NvLmNcbmluZGV4IGYzMTdmNjA0MTRlODEzLi5iNGMzN2E2YzlmMGZhOSAxMDA2NDRcbi0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dF9nc28uY1xuKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9ibnh0X2dzby5jXG5AQCAtMTY4LDcgKzE2OCw3IEBAIG5ldGRldl90eF90IGJueHRfc3dfdWRwX2dzb194bWl0KHN0cnVjdCBibnh0ICpicCxcbiBcbiBcdFx0cHJvZCA9IE5FWFRfVFgocHJvZCk7XG4gXHRcdGJueHRfaW5pdF9leHRfYmQoYnAsIHR4ciwgcHJvZCwgY3N1bSxcbi1cdFx0XHRcdCB2bGFuX3RhZ19mbGFncywgY2ZhX2FjdGlvbik7XG4rXHRcdFx0XHQgdmxhbl90YWdfZmxhZ3MsIGNmYV9hY3Rpb24sIDApO1xuIFxuIFx0XHQvKiBzZXQgZG1hX3VubWFwX2xlbiBvbiB0aGUgTEFTVCBCRCB0b3VjaGluZyBlYWNoXG4gXHRcdCAqIHJlZ2lvbi4gU2luY2UgY29tcGxldGlvbnMgYXJlIGluLW9yZGVyLCB0aGUgbGFzdCBzZWdtZW50XG5kaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9ibnh0X2t0bHMuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dF9rdGxzLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwMC4uMGNiNDM4YzVjNTA5MThcbi0tLSAvZGV2L251bGxcbisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dF9rdGxzLmNcbkBAIC0wLDAgKzEsNTc4IEBAXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seVxuKy8qIENvcHlyaWdodCAoYykgMjAyNiBCcm9hZGNvbSBJbmMuICovXG4rXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvdGNwLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NuZXQvdGxzLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9ibnh0L2hzaS5oXHUwMDNlXG4rXG4rI2luY2x1ZGUgXCJibnh0LmhcIlxuKyNpbmNsdWRlIFwiYm54dF9tcGMuaFwiXG4rI2luY2x1ZGUgXCJibnh0X2NyeXB0by5oXCJcbisjaW5jbHVkZSBcImJueHRfa3Rscy5oXCJcbitcbisvKipcbisgKiBibnh0X2FsbG9jX2t0bHNfaW5mbyAtIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGtUTFMgb2ZmbG9hZCBjb250ZXh0XG4rICogQGJwOiBwb2ludGVyIHRvIGJueHQgZGV2aWNlXG4rICpcbisgKiBBbGxvY2F0ZXMgdGhlIG1haW4ga1RMUyBjcnlwdG8gaW5mbyBzdHJ1Y3R1cmVcbisgKlxuKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGR1cmluZyBkZXZpY2UgaW5pdGlhbGl6YXRpb24gd2hlbiBmaXJtd2FyZVxuKyAqIHJlcG9ydHMga1RMUyBvZmZsb2FkIGNhcGFiaWxpdHkuIElmIGFsbG9jYXRpb24gZmFpbHMsIGtUTFMgb2ZmbG9hZFxuKyAqIHdpbGwgbm90IGJlIGF2YWlsYWJsZSBidXQgdGhlIGRldmljZSB3aWxsIHN0aWxsIGZ1bmN0aW9uLlxuKyAqXG4rICogQ29udGV4dDogUHJvY2VzcyBjb250ZXh0XG4rICpcbisgKiBSZXR1cm46IHplcm8gb24gc3VjY2VzcywgbmVnYXRpdmUgZXJyb3IgY29kZSBvdGhlcndpc2U6XG4rICpcdEVOT01FTTogb3V0IG9mIG1lbW9yeVxuKyAqL1xuK2ludCBibnh0X2FsbG9jX2t0bHNfaW5mbyhzdHJ1Y3QgYm54dCAqYnApXG4re1xuK1x0c3RydWN0IGJueHRfdGxzX2luZm8gKmt0bHMgPSBicC1cdTAwM2VrdGxzX2luZm87XG4rXG4rXHRpZiAoQk5YVF9WRihicCkpXG4rXHRcdHJldHVybiAtRU9QTk9UU1VQUDtcbitcdGlmIChrdGxzKVxuK1x0XHRyZXR1cm4gMDtcbitcbitcdGt0bHMgPSBremFsbG9jX29iaigqa3Rscyk7XG4rXHRpZiAoIWt0bHMpIHtcbitcdFx0bmV0ZGV2X3dhcm4oYnAtXHUwMDNlZGV2LCBcIlVuYWJsZSB0byBhbGxvY2F0ZSBrVExTIGluZm9cXG5cIik7XG4rXHRcdHJldHVybiAtRU5PTUVNO1xuK1x0fVxuK1x0a3Rscy1cdTAwM2Vjb3VudGVycyA9IGt6YWxsb2Nfb2Jqcygqa3Rscy1cdTAwM2Vjb3VudGVycyxcbitcdFx0XHRcdCAgICAgIEJOWFRfS1RMU19NQVhfQ1RSTF9DT1VOVEVSUyk7XG4rXHRpZiAoIWt0bHMtXHUwMDNlY291bnRlcnMpXG4rXHRcdGdvdG8ga3Rsc19lcnI7XG4rXG4rXHRpbml0X3dhaXRxdWV1ZV9oZWFkKFx1MDAyNmt0bHMtXHUwMDNlb3Blbl93cSk7XG4rXHRicC1cdTAwM2VrdGxzX2luZm8gPSBrdGxzO1xuK1x0cmV0dXJuIDA7XG4rXG4ra3Rsc19lcnI6XG4rXHRrZnJlZShrdGxzLVx1MDAzZWNvdW50ZXJzKTtcbitcdGtmcmVlKGt0bHMpO1xuK1x0cmV0dXJuIC1FTk9NRU07XG4rfVxuK1xuKy8qKlxuKyAqIGJueHRfZnJlZV9rdGxzX2luZm8gLSBGcmVlIGtUTFMgY3J5cHRvIG9mZmxvYWQgcmVzb3VyY2VzXG4rICogQGJwOiBwb2ludGVyIHRvIGJueHQgZGV2aWNlXG4rICpcbisgKiBGcmVlcyBhbGwgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCBrVExTIGNyeXB0byBvZmZsb2FkXG4rICpcbisgKiBDb250ZXh0OiBQcm9jZXNzIGNvbnRleHQgZHVyaW5nIGRldmljZSBzaHV0ZG93bi9yZW1vdmFsXG4rICovXG4rdm9pZCBibnh0X2ZyZWVfa3Rsc19pbmZvKHN0cnVjdCBibnh0ICpicClcbit7XG4rXHRzdHJ1Y3QgYm54dF90bHNfaW5mbyAqa3RscyA9IGJwLVx1MDAzZWt0bHNfaW5mbztcbitcbitcdGlmICgha3RscylcbitcdFx0cmV0dXJuO1xuK1x0a2ZyZWUoa3Rscy1cdTAwM2Vjb3VudGVycyk7XG4rXHRrZnJlZShrdGxzKTtcbitcdGJwLVx1MDAzZWt0bHNfaW5mbyA9IE5VTEw7XG4rfVxuK1xuKy8qIENvcHkgaW4gcmV2ZXJzZSBieXRlIG9yZGVyICovXG4rc3RhdGljIHZvaWQgYm54dF9jb3B5X3Rsc19tcF9kYXRhKHU4ICpkc3QsIHU4ICpzcmMsIGludCBieXRlcylcbit7XG4rXHRpbnQgaTtcbitcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIGJ5dGVzOyBpKyspXG4rXHRcdGRzdFtieXRlcyAtIGkgLSAxXSA9IHNyY1tpXTtcbit9XG4rXG4rc3RhdGljIGludCBibnh0X2NyeXB0b19hZGQoc3RydWN0IGJueHQgKmJwLCBlbnVtIHRsc19vZmZsb2FkX2N0eF9kaXIgZGlyZWN0aW9uLFxuK1x0XHRcdCAgIHN0cnVjdCB0bHNfY3J5cHRvX2luZm8gKmNyeXB0b19pbmZvLCB1MzIgdGNwX3NlcV9ubyxcbitcdFx0XHQgICB1MzIga2lkKVxuK3tcbitcdHN0cnVjdCBibnh0X3R4X3JpbmdfaW5mbyAqdHhyO1xuK1x0c3RydWN0IGNlX2FkZF9jbWQgY21kID0gezB9O1xuK1x0dTMyIGRhdGE7XG4rXHRpbnQgcmM7XG4rXG4rXHRpZiAoZGlyZWN0aW9uID09IFRMU19PRkZMT0FEX0NUWF9ESVJfVFgpIHtcbitcdFx0dHhyID0gYm54dF9zZWxlY3RfbXBjX3JpbmcoYnAsIEJOWFRfTVBDX1RDRV9UWVBFKTtcbitcdFx0Y21kLmN0eF9raW5kID0gQ0VfQUREX0NNRF9DVFhfS0lORF9DS19UWDtcbitcdH0gZWxzZSB7XG4rXHRcdHJldHVybiAtRU9QTk9UU1VQUDtcbitcdH1cbitcdGlmICghdHhyKVxuK1x0XHRyZXR1cm4gLUVOT0RFVjtcbitcbitcdGRhdGEgPSBDRV9BRERfQ01EX09QQ09ERV9BREQgfCAoQk5YVF9LSURfSFcoa2lkKSBcdTAwM2NcdTAwM2MgQ0VfQUREX0NNRF9LSURfU0ZUKTtcbitcdHN3aXRjaCAoY3J5cHRvX2luZm8tXHUwMDNlY2lwaGVyX3R5cGUpIHtcbitcdGNhc2UgVExTX0NJUEhFUl9BRVNfR0NNXzEyODoge1xuK1x0XHRzdHJ1Y3QgdGxzMTJfY3J5cHRvX2luZm9fYWVzX2djbV8xMjggKmFlcztcbitcbitcdFx0YWVzID0gKHZvaWQgKiljcnlwdG9faW5mbztcbitcdFx0ZGF0YSB8PSBDRV9BRERfQ01EX0FMR09SSVRITV9BRVNfR0NNXzEyODtcbitcdFx0aWYgKGNyeXB0b19pbmZvLVx1MDAzZXZlcnNpb24gPT0gVExTXzFfM19WRVJTSU9OKVxuK1x0XHRcdGRhdGEgfD0gQ0VfQUREX0NNRF9WRVJTSU9OX1RMUzFfMztcbitcdFx0bWVtY3B5KFx1MDAyNmNtZC5zZXNzaW9uX2tleSwgYWVzLVx1MDAzZWtleSwgc2l6ZW9mKGFlcy1cdTAwM2VrZXkpKTtcbitcdFx0bWVtY3B5KFx1MDAyNmNtZC5zYWx0LCBhZXMtXHUwMDNlc2FsdCwgc2l6ZW9mKGFlcy1cdTAwM2VzYWx0KSk7XG4rXHRcdG1lbWNweShcdTAwMjZjbWQuYWRkbF9pdiwgYWVzLVx1MDAzZWl2LCBzaXplb2YoYWVzLVx1MDAzZWl2KSk7XG4rXHRcdGJueHRfY29weV90bHNfbXBfZGF0YShjbWQucmVjb3JkX3NlcV9udW0sIGFlcy1cdTAwM2VyZWNfc2VxLFxuK1x0XHRcdFx0ICAgICAgc2l6ZW9mKGFlcy1cdTAwM2VyZWNfc2VxKSk7XG4rXHRcdGJyZWFrO1xuK1x0fVxuK1x0Y2FzZSBUTFNfQ0lQSEVSX0FFU19HQ01fMjU2OiB7XG4rXHRcdHN0cnVjdCB0bHMxMl9jcnlwdG9faW5mb19hZXNfZ2NtXzI1NiAqYWVzO1xuK1xuK1x0XHRhZXMgPSAodm9pZCAqKWNyeXB0b19pbmZvO1xuK1x0XHRkYXRhIHw9IENFX0FERF9DTURfQUxHT1JJVEhNX0FFU19HQ01fMjU2O1xuK1x0XHRpZiAoY3J5cHRvX2luZm8tXHUwMDNldmVyc2lvbiA9PSBUTFNfMV8zX1ZFUlNJT04pXG4rXHRcdFx0ZGF0YSB8PSBDRV9BRERfQ01EX1ZFUlNJT05fVExTMV8zO1xuK1x0XHRtZW1jcHkoXHUwMDI2Y21kLnNlc3Npb25fa2V5LCBhZXMtXHUwMDNla2V5LCBzaXplb2YoYWVzLVx1MDAzZWtleSkpO1xuK1x0XHRtZW1jcHkoXHUwMDI2Y21kLnNhbHQsIGFlcy1cdTAwM2VzYWx0LCBzaXplb2YoYWVzLVx1MDAzZXNhbHQpKTtcbitcdFx0bWVtY3B5KFx1MDAyNmNtZC5hZGRsX2l2LCBhZXMtXHUwMDNlaXYsIHNpemVvZihhZXMtXHUwMDNlaXYpKTtcbitcdFx0Ym54dF9jb3B5X3Rsc19tcF9kYXRhKGNtZC5yZWNvcmRfc2VxX251bSwgYWVzLVx1MDAzZXJlY19zZXEsXG4rXHRcdFx0XHQgICAgICBzaXplb2YoYWVzLVx1MDAzZXJlY19zZXEpKTtcbitcdFx0YnJlYWs7XG4rXHR9XG4rXHRkZWZhdWx0OlxuK1x0XHRyZXR1cm4gLUVPUE5PVFNVUFA7XG4rXHR9XG4rXHRjbWQudmVyX2FsZ29fa2lkX29wY29kZSA9IGNwdV90b19sZTMyKGRhdGEpO1xuK1x0Y21kLnBrdF90Y3Bfc2VxX251bSA9IGNwdV90b19sZTMyKHRjcF9zZXFfbm8pO1xuK1x0Y21kLnRsc19oZWFkZXJfdGNwX3NlcV9udW0gPSBjbWQucGt0X3RjcF9zZXFfbnVtO1xuK1x0cmMgPSBibnh0X3htaXRfY3J5cHRvX2NtZChicCwgdHhyLCBcdTAwMjZjbWQsIHNpemVvZihjbWQpLFxuK1x0XHRcdFx0ICBCTlhUX01QQ19UTU9fTVNFQ1MpO1xuK1x0bWVtemVyb19leHBsaWNpdChcdTAwMjZjbWQsIHNpemVvZihjbWQpKTtcbitcdHJldHVybiByYztcbit9XG4rXG4rc3RhdGljIGJvb2wgYm54dF9rdGxzX2NpcGhlcl9zdXBwb3J0ZWQoc3RydWN0IGJueHQgKmJwLFxuK1x0XHRcdFx0ICAgICAgIHN0cnVjdCB0bHNfY3J5cHRvX2luZm8gKmNyeXB0b19pbmZvKVxuK3tcbitcdHUxNiB0eXBlID0gY3J5cHRvX2luZm8tXHUwMDNlY2lwaGVyX3R5cGU7XG4rXHR1MTYgdmVyc2lvbiA9IGNyeXB0b19pbmZvLVx1MDAzZXZlcnNpb247XG4rXG4rXHRpZiAoKHR5cGUgPT0gVExTX0NJUEhFUl9BRVNfR0NNXzEyOCB8fFxuK1x0ICAgICB0eXBlID09IFRMU19DSVBIRVJfQUVTX0dDTV8yNTYpIFx1MDAyNlx1MDAyNlxuK1x0ICAgICh2ZXJzaW9uID09IFRMU18xXzJfVkVSU0lPTiB8fFxuK1x0ICAgICB2ZXJzaW9uID09IFRMU18xXzNfVkVSU0lPTikpXG4rXHRcdHJldHVybiB0cnVlO1xuK1x0cmV0dXJuIGZhbHNlO1xuK31cbitcbitzdGF0aWMgdm9pZCBibnh0X3NldF9rdGxzX2N0eF90eChzdHJ1Y3QgdGxzX2NvbnRleHQgKnRsc19jdHgsXG4rXHRcdFx0XHQgc3RydWN0IGJueHRfa3Rsc19vZmZsb2FkX2N0eF90eCAqa2N0eF90eClcbit7XG4rXHRzdHJ1Y3QgYm54dF9rdGxzX3R4X2RyaXZlcl9zdGF0ZSAqdHggPVxuK1x0XHRfX3Rsc19kcml2ZXJfY3R4KHRsc19jdHgsIFRMU19PRkZMT0FEX0NUWF9ESVJfVFgpO1xuK1xuK1x0dHgtXHUwMDNlY3R4X3R4ID0ga2N0eF90eDtcbit9XG4rXG4rc3RhdGljIHN0cnVjdCBibnh0X2t0bHNfb2ZmbG9hZF9jdHhfdHggKlxuK2JueHRfZ2V0X2t0bHNfY3R4X3R4KHN0cnVjdCB0bHNfY29udGV4dCAqdGxzX2N0eClcbit7XG4rXHRzdHJ1Y3QgYm54dF9rdGxzX3R4X2RyaXZlcl9zdGF0ZSAqdHggPVxuK1x0XHRfX3Rsc19kcml2ZXJfY3R4KHRsc19jdHgsIFRMU19PRkZMT0FEX0NUWF9ESVJfVFgpO1xuK1xuK1x0cmV0dXJuIHR4LVx1MDAzZWN0eF90eDtcbit9XG4rXG4rc3RhdGljIGludCBibnh0X2t0bHNfZGV2X2FkZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc29jayAqc2ssXG4rXHRcdFx0ICAgICBlbnVtIHRsc19vZmZsb2FkX2N0eF9kaXIgZGlyZWN0aW9uLFxuK1x0XHRcdCAgICAgc3RydWN0IHRsc19jcnlwdG9faW5mbyAqY3J5cHRvX2luZm8sXG4rXHRcdFx0ICAgICB1MzIgc3RhcnRfb2ZmbG9hZF90Y3Bfc24pXG4re1xuK1x0c3RydWN0IGJueHRfa3Rsc19vZmZsb2FkX2N0eF90eCAqa2N0eF90eDtcbitcdHN0cnVjdCBibnh0ICpicCA9IG5ldGRldl9wcml2KGRldik7XG4rXHRzdHJ1Y3QgYm54dF9jcnlwdG9faW5mbyAqY3J5cHRvO1xuK1x0c3RydWN0IHRsc19jb250ZXh0ICp0bHNfY3R4O1xuK1x0c3RydWN0IGJueHRfdGxzX2luZm8gKmt0bHM7XG4rXHRzdHJ1Y3QgYm54dF9rY3R4ICprY3R4O1xuK1x0dTMyIGtpZDtcbitcdGludCByYztcbitcbitcdEJVSUxEX0JVR19PTihzaXplb2Yoc3RydWN0IGJueHRfa3Rsc190eF9kcml2ZXJfc3RhdGUpIFx1MDAzZVxuK1x0XHQgICAgIFRMU19EUklWRVJfU1RBVEVfU0laRV9UWCk7XG4rXG4rXHRrdGxzID0gYnAtXHUwMDNla3Rsc19pbmZvO1xuK1x0aWYgKGRpcmVjdGlvbiA9PSBUTFNfT0ZGTE9BRF9DVFhfRElSX1JYKVxuK1x0XHRyZXR1cm4gLUVPUE5PVFNVUFA7XG4rXG4rXHRpZiAoIUJOWFRfU1VQUE9SVFNfS1RMUyhicCkpIHtcbitcdFx0YXRvbWljNjRfaW5jKFx1MDAyNmt0bHMtXHUwMDNlY291bnRlcnNbQk5YVF9LVExTX0VSUl9OT19DQVBdKTtcbitcdFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xuK1x0fVxuK1x0YXRvbWljX2luYyhcdTAwMjZrdGxzLVx1MDAzZXBlbmRpbmcpO1xuK1x0LyogTWFrZSBzdXJlIGJueHRfY2xvc2VfbmljKCkgc2VlcyBwZW5kaW5nIGJlZm9yZSB3ZSBjaGVjayB0aGVcbitcdCAqIEJOWFRfU1RBVEVfT1BFTiBmbGFnLlxuK1x0ICovXG4rXHRzbXBfbWJfX2FmdGVyX2F0b21pYygpO1xuK1x0aWYgKCF0ZXN0X2JpdChCTlhUX1NUQVRFX09QRU4sIFx1MDAyNmJwLVx1MDAzZXN0YXRlKSkge1xuK1x0XHRhdG9taWM2NF9pbmMoXHUwMDI2a3Rscy1cdTAwM2Vjb3VudGVyc1tCTlhUX0tUTFNfRVJSX1NUQVRFX05PVF9PUEVOXSk7XG4rXHRcdHJjID0gLUVOT0RFVjtcbitcdFx0Z290byBleGl0O1xuK1x0fVxuK1xuK1x0aWYgKCFibnh0X2t0bHNfY2lwaGVyX3N1cHBvcnRlZChicCwgY3J5cHRvX2luZm8pKSB7XG4rXHRcdGF0b21pYzY0X2luYyhcdTAwMjZrdGxzLVx1MDAzZWNvdW50ZXJzW0JOWFRfS1RMU19FUlJfSU5WQUxJRF9DSVBIRVJdKTtcbitcdFx0cmMgPSAtRU9QTk9UU1VQUDtcbitcdFx0Z290byBleGl0O1xuK1x0fVxuK1xuK1x0a2N0eF90eCA9IGt6YWxsb2Nfb2JqKCprY3R4X3R4KTtcbitcdGlmICgha2N0eF90eCkge1xuK1x0XHRhdG9taWM2NF9pbmMoXHUwMDI2a3Rscy1cdTAwM2Vjb3VudGVyc1tCTlhUX0tUTFNfRVJSX05PX01FTV0pO1xuK1x0XHRyYyA9IC1FTk9NRU07XG4rXHRcdGdvdG8gZXhpdDtcbitcdH1cbitcdHRsc19jdHggPSB0bHNfZ2V0X2N0eChzayk7XG4rXHRjcnlwdG8gPSBicC1cdTAwM2VjcnlwdG9faW5mbztcbitcdGtjdHggPSBcdTAwMjZjcnlwdG8tXHUwMDNla2N0eFtCTlhUX1RYX0NSWVBUT19LRVlfVFlQRV07XG4rXHRyYyA9IGJueHRfa2V5X2N0eF9hbGxvY19vbmUoYnAsIGtjdHgsIEJOWFRfQ1RYX0tJTkRfQ0tfVFgsIFx1MDAyNmtpZCk7XG4rXHRpZiAocmMpIHtcbitcdFx0YXRvbWljNjRfaW5jKFx1MDAyNmt0bHMtXHUwMDNlY291bnRlcnNbQk5YVF9LVExTX0VSUl9LRVlfQ1RYX0FMTE9DXSk7XG4rXHRcdGdvdG8gZnJlZV9jdHg7XG4rXHR9XG4rXHRyYyA9IGJueHRfY3J5cHRvX2FkZChicCwgZGlyZWN0aW9uLCBjcnlwdG9faW5mbywgc3RhcnRfb2ZmbG9hZF90Y3Bfc24sXG4rXHRcdFx0ICAgICBraWQpO1xuK1x0aWYgKHJjKSB7XG4rXHRcdGF0b21pYzY0X2luYyhcdTAwMjZrdGxzLVx1MDAzZWNvdW50ZXJzW0JOWFRfS1RMU19FUlJfQ1JZUFRPX0NNRF0pO1xuK1x0XHRnb3RvIGZyZWVfa2N0eDtcbitcdH1cbitcdGtjdHhfdHgtXHUwMDNla2lkID0ga2lkO1xuK1x0a2N0eF90eC1cdTAwM2V0Y3Bfc2VxX25vID0gc3RhcnRfb2ZmbG9hZF90Y3Bfc247XG4rXHRibnh0X3NldF9rdGxzX2N0eF90eCh0bHNfY3R4LCBrY3R4X3R4KTtcbitcdGF0b21pYzY0X2luYyhcdTAwMjZrdGxzLVx1MDAzZWNvdW50ZXJzW0JOWFRfS1RMU19UWF9BRERdKTtcbitcdGdvdG8gZXhpdDtcbitcbitmcmVlX2tjdHg6XG4rXHQvKiBUaGlzIEtJRCB3YXMganVzdCBhbGxvY2F0ZWQgd2hpbGUgaG9sZGluZyBrdGxzLVx1MDAzZXBlbmRpbmcsIHNvIGVwb2NoXG4rXHQgKiBjaGVjayBpcyB1bm5lY2Vzc2FyeS5cbitcdCAqL1xuK1x0Ym54dF9mcmVlX29uZV9rY3R4KGtjdHgsIGtpZCk7XG4rZnJlZV9jdHg6XG4rXHRrZnJlZShrY3R4X3R4KTtcbitleGl0OlxuK1x0YXRvbWljX2RlYyhcdTAwMjZrdGxzLVx1MDAzZXBlbmRpbmcpO1xuK1x0cmV0dXJuIHJjO1xuK31cbitcbisjZGVmaW5lIEtUTFNfUkVUUllfTUFYXHRcdDEwMFxuKyNkZWZpbmUgS1RMU19XQUlUX1RNT19NU1x0MTAwXG4rXG4rc3RhdGljIHZvaWQgYm54dF9rdGxzX2Rldl9kZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldixcbitcdFx0XHQgICAgICBzdHJ1Y3QgdGxzX2NvbnRleHQgKnRsc19jdHgsXG4rXHRcdFx0ICAgICAgZW51bSB0bHNfb2ZmbG9hZF9jdHhfZGlyIGRpcmVjdGlvbilcbit7XG4rXHRzdHJ1Y3QgYm54dF9rdGxzX29mZmxvYWRfY3R4X3R4ICprY3R4X3R4O1xuK1x0c3RydWN0IGJueHQgKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTtcbitcdHN0cnVjdCBibnh0X2NyeXB0b19pbmZvICpjcnlwdG87XG4rXHRzdHJ1Y3QgYm54dF90bHNfaW5mbyAqa3RscztcbitcdHN0cnVjdCBibnh0X2tjdHggKmtjdHg7XG4rXHRpbnQgcmV0cnlfY250ID0gMDtcbitcdHU4IGtpbmQ7XG4rXHR1MzIga2lkO1xuK1xuK1x0a3RscyA9IGJwLVx1MDAzZWt0bHNfaW5mbztcbitcdGtjdHhfdHggPSBibnh0X2dldF9rdGxzX2N0eF90eCh0bHNfY3R4KTtcbityZXRyeTpcbitcdGlmICghdGVzdF9iaXQoQk5YVF9TVEFURV9PUEVOLCBcdTAwMjZicC1cdTAwM2VzdGF0ZSkpIHtcbitcdFx0LyogRHVyaW5nIGlmZG93biBvciBGVyByZXNldCwgYWxsIGNvbm5lY3Rpb25zIHdpbGwgYmUgdG9yblxuK1x0XHQgKiBkb3duIGJ5IGJueHRfY3J5cHRvX2RlbF9hbGwoKSAvIEZVTkNfUkVTRVQsIHNvIG5vdGhpbmcgdG9cbitcdFx0ICogZG8gaGVyZS4gIE9ubHkgYSByZWNvbmZpZ3VyYXRpb24gaXMgdHJhbnNpZW50IGFuZFxuK1x0XHQgKiBfX2JueHRfb3Blbl9uaWMoKSB3aWxsIHNldCBCTlhUX1NUQVRFX09QRU4gYWdhaW4gYW5kIHdha2UgdXMuXG4rXHRcdCAqL1xuK1x0XHRpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSB8fFxuK1x0XHQgICAgdGVzdF9iaXQoQk5YVF9TVEFURV9JTl9GV19SRVNFVCwgXHUwMDI2YnAtXHUwMDNlc3RhdGUpKVxuK1x0XHRcdGdvdG8gZnJlZTtcbitcdFx0LyogQm91bmQgdGhlIHdhaXQgc28gYSB3ZWRnZWQgcmVjb25maWcgY2FuJ3QgYmxvY2sgdGhlIGtUTFNcbitcdFx0ICogZGVzdHJ1Y3Qgd29yayBpbmRlZmluaXRlbHkuXG4rXHRcdCAqL1xuK1x0XHRpZiAocmV0cnlfY250KysgXHUwMDNlIEtUTFNfUkVUUllfTUFYKSB7XG4rXHRcdFx0YXRvbWljNjRfaW5jKFx1MDAyNmt0bHMtXHUwMDNlY291bnRlcnNbQk5YVF9LVExTX0VSUl9SRVRSWV9FWENFRURFRF0pO1xuK1x0XHRcdG5ldGRldl93YXJuKGRldiwgXCIlcyB0aW1lZCBvdXQgd2FpdGluZyBmb3IgZGV2aWNlLCBzdGF0ZSAlbHhcXG5cIixcbitcdFx0XHRcdCAgICBfX2Z1bmNfXywgYnAtXHUwMDNlc3RhdGUpO1xuK1x0XHRcdGdvdG8gZnJlZTtcbitcdFx0fVxuK1x0XHR3YWl0X2V2ZW50X3RpbWVvdXQoa3Rscy1cdTAwM2VvcGVuX3dxLFxuK1x0XHRcdFx0ICAgdGVzdF9iaXQoQk5YVF9TVEFURV9PUEVOLCBcdTAwMjZicC1cdTAwM2VzdGF0ZSkgfHxcbitcdFx0XHRcdCAgICFuZXRpZl9ydW5uaW5nKGRldikgfHxcbitcdFx0XHRcdCAgIHRlc3RfYml0KEJOWFRfU1RBVEVfSU5fRldfUkVTRVQsIFx1MDAyNmJwLVx1MDAzZXN0YXRlKSxcbitcdFx0XHRcdCAgIG1zZWNzX3RvX2ppZmZpZXMoS1RMU19XQUlUX1RNT19NUykpO1xuK1x0XHRnb3RvIHJldHJ5O1xuK1x0fVxuK1x0YXRvbWljX2luYyhcdTAwMjZrdGxzLVx1MDAzZXBlbmRpbmcpO1xuK1x0LyogTWFrZSBzdXJlIGJueHRfY2xvc2VfbmljKCkgc2VlcyBwZW5kaW5nIGJlZm9yZSB3ZSBjaGVjayB0aGVcbitcdCAqIEJOWFRfU1RBVEVfT1BFTiBmbGFnLlxuK1x0ICovXG4rXHRzbXBfbWJfX2FmdGVyX2F0b21pYygpO1xuK1x0aWYgKCF0ZXN0X2JpdChCTlhUX1NUQVRFX09QRU4sIFx1MDAyNmJwLVx1MDAzZXN0YXRlKSkge1xuK1x0XHRhdG9taWNfZGVjKFx1MDAyNmt0bHMtXHUwMDNlcGVuZGluZyk7XG4rXHRcdGdvdG8gcmV0cnk7XG4rXHR9XG4rXG4rXHRjcnlwdG8gPSBicC1cdTAwM2VjcnlwdG9faW5mbztcbitcdGtpZCA9IGtjdHhfdHgtXHUwMDNla2lkO1xuK1x0a2N0eCA9IFx1MDAyNmNyeXB0by1cdTAwM2VrY3R4W0JOWFRfVFhfQ1JZUFRPX0tFWV9UWVBFXTtcbitcdGtpbmQgPSBCTlhUX0NUWF9LSU5EX0NLX1RYO1xuK1x0YXRvbWljNjRfaW5jKFx1MDAyNmt0bHMtXHUwMDNlY291bnRlcnNbQk5YVF9LVExTX1RYX0RFTF0pO1xuK1x0LyogVGhpcyBLSUQgd2FzIGFsbG9jYXRlZCBieSBhbiBlYXJsaWVyIGFkZCBhbmQgbWF5IGhhdmUgb3V0bGl2ZWQgYSBGV1xuK1x0ICogcmVzZXQsIHNvIHZhbGlkYXRlIGl0cyBlcG9jaCBiZWZvcmUgZGVsZXRpbmcvZnJlZWluZyBpdC5cbitcdCAqL1xuK1x0aWYgKGJueHRfa2lkX3ZhbGlkKGtjdHgsIGtpZCkgXHUwMDI2XHUwMDI2XG4rXHQgICAgIWJueHRfY3J5cHRvX2RlbChicCwga2N0eC1cdTAwM2V0eXBlLCBraW5kLCBraWQpKVxuK1x0XHRibnh0X2ZyZWVfb25lX2tjdHgoa2N0eCwga2lkKTtcbitcbitcdGF0b21pY19kZWMoXHUwMDI2a3Rscy1cdTAwM2VwZW5kaW5nKTtcbitmcmVlOlxuK1x0Ym54dF9zZXRfa3Rsc19jdHhfdHgodGxzX2N0eCwgTlVMTCk7XG4rXHRrZnJlZShrY3R4X3R4KTtcbit9XG4rXG4rc3RhdGljIGNvbnN0IHN0cnVjdCB0bHNkZXZfb3BzIGJueHRfa3Rsc19vcHMgPSB7XG4rXHQudGxzX2Rldl9hZGQgPSBibnh0X2t0bHNfZGV2X2FkZCxcbitcdC50bHNfZGV2X2RlbCA9IGJueHRfa3Rsc19kZXZfZGVsLFxuK307XG4rXG4raW50IGJueHRfa3Rsc19pbml0KHN0cnVjdCBibnh0ICpicClcbit7XG4rXHRzdHJ1Y3QgYm54dF90bHNfaW5mbyAqa3RscyA9IGJwLVx1MDAzZWt0bHNfaW5mbztcbitcdHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBicC1cdTAwM2VkZXY7XG4rXG4rXHRpZiAoIWt0bHMpXG4rXHRcdHJldHVybiAwO1xuK1xuK1x0ZGV2LVx1MDAzZXRsc2Rldl9vcHMgPSBcdTAwMjZibnh0X2t0bHNfb3BzO1xuK1x0ZGV2LVx1MDAzZWh3X2ZlYXR1cmVzIHw9IE5FVElGX0ZfSFdfVExTX1RYO1xuK1x0ZGV2LVx1MDAzZWZlYXR1cmVzIHw9IE5FVElGX0ZfSFdfVExTX1RYO1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIGJueHRfa3Rsc19pbmNfdHhfc3RhdHMoc3RydWN0IGJueHRfdHhfcmluZ19pbmZvICp0eHIsIHUzMiBieXRlcyxcbitcdFx0XHRcdCAgIGJvb2wgb29vKVxuK3tcbitcdHN0cnVjdCBibnh0X3Rsc19zd19zdGF0cyAqcmluZ19zdGF0cyA9IHR4ci1cdTAwM2V0bHNfc3RhdHM7XG4rXG4rXHRpZiAoIXJpbmdfc3RhdHMpXG4rXHRcdHJldHVybjtcbitcdHJpbmdfc3RhdHMtXHUwMDNlY291bnRlcnNbQk5YVF9LVExTX1RYX1BLVFNdKys7XG4rXHRyaW5nX3N0YXRzLVx1MDAzZWNvdW50ZXJzW0JOWFRfS1RMU19UWF9CWVRFU10gKz0gYnl0ZXM7XG4rXHRpZiAob29vKVxuK1x0XHRyaW5nX3N0YXRzLVx1MDAzZWNvdW50ZXJzW0JOWFRfS1RMU19UWF9PT09fUEtUU10rKztcbit9XG4rXG4rc3RhdGljIHZvaWQgYm54dF9rdGxzX3ByZV94bWl0KHN0cnVjdCBibnh0ICpicCwgc3RydWN0IGJueHRfdHhfcmluZ19pbmZvICp0eHIsXG4rXHRcdFx0ICAgICAgIHUzMiBraWQsIHN0cnVjdCBjcnlwdG9fcHJlZml4X2NtZCAqcHJlX2NtZClcbit7XG4rXHRzdHJ1Y3QgYm54dF9zd190eF9iZCAqdHhfYnVmO1xuK1x0c3RydWN0IHR4X2JkX3ByZXN5bmMgKnBzYmQ7XG4rXHR1MzIgYmRfc3BhY2UsIHNwYWNlO1xuK1x0dTggKnBjbWQ7XG4rXHR1MTYgcHJvZDtcbitcbitcdHByb2QgPSB0eHItXHUwMDNldHhfcHJvZDtcbitcdHR4X2J1ZiA9IFx1MDAyNnR4ci1cdTAwM2V0eF9idWZfcmluZ1tSSU5HX1RYKGJwLCBwcm9kKV07XG4rXG4rXHRwc2JkID0gKHZvaWQgKilcdTAwMjZ0eHItXHUwMDNldHhfZGVzY19yaW5nW1RYX1JJTkcoYnAsIHByb2QpXVtUWF9JRFgocHJvZCldO1xuK1x0cHNiZC1cdTAwM2V0eF9iZF9sZW5fZmxhZ3NfdHlwZSA9IENSWVBUT19QUkVTWU5DX0JEX0NNRDtcbitcdHBzYmQtXHUwMDNldHhfYmRfa2lkID0gY3B1X3RvX2xlMzIoQk5YVF9LSURfSFcoa2lkKSk7XG4rXHRwc2JkLVx1MDAzZXR4X2JkX29wYXF1ZSA9XG4rXHRcdFNFVF9UWF9PUEFRVUUoYnAsIHR4ciwgcHJvZCwgQ1JZUFRPX1BSRUZJWF9DTURfQkRTICsgMSk7XG4rXG4rXHRwcm9kID0gTkVYVF9UWChwcm9kKTtcbitcdHBjbWQgPSAodm9pZCAqKVx1MDAyNnR4ci1cdTAwM2V0eF9kZXNjX3JpbmdbVFhfUklORyhicCwgcHJvZCldW1RYX0lEWChwcm9kKV07XG4rXHRiZF9zcGFjZSA9IFRYX0RFU0NfQ05UIC0gVFhfSURYKHByb2QpO1xuK1x0c3BhY2UgPSBiZF9zcGFjZSAqIHNpemVvZihzdHJ1Y3QgdHhfYmQpO1xuK1x0aWYgKHNwYWNlIFx1MDAzZT0gQ1JZUFRPX1BSRUZJWF9DTURfU0laRSkge1xuK1x0XHRtZW1jcHkocGNtZCwgcHJlX2NtZCwgQ1JZUFRPX1BSRUZJWF9DTURfU0laRSk7XG4rXHRcdHByb2QgKz0gQ1JZUFRPX1BSRUZJWF9DTURfQkRTO1xuK1x0fSBlbHNlIHtcbitcdFx0bWVtY3B5KHBjbWQsIHByZV9jbWQsIHNwYWNlKTtcbitcdFx0cHJvZCArPSBiZF9zcGFjZTtcbitcdFx0cGNtZCA9ICh2b2lkICopXHUwMDI2dHhyLVx1MDAzZXR4X2Rlc2NfcmluZ1tUWF9SSU5HKGJwLCBwcm9kKV1bVFhfSURYKHByb2QpXTtcbitcdFx0bWVtY3B5KHBjbWQsICh1OCAqKXByZV9jbWQgKyBzcGFjZSxcbitcdFx0ICAgICAgIENSWVBUT19QUkVGSVhfQ01EX1NJWkUgLSBzcGFjZSk7XG4rXHRcdHByb2QgKz0gQ1JZUFRPX1BSRUZJWF9DTURfQkRTIC0gYmRfc3BhY2U7XG4rXHR9XG4rXHR0eHItXHUwMDNldHhfcHJvZCA9IHByb2Q7XG4rXHR0eF9idWYtXHUwMDNlaXNfcHVzaCA9IDE7XG4rXHQvKiBNaW51cyAxIHNpbmNlIHRoZSBoZWFkZXIgcHNiZCBpcyBhIHNpbmdsZSBlbnRyeSBzaG9ydCBCRCAqL1xuK1x0dHhfYnVmLVx1MDAzZWlubGluZV9kYXRhX2JkcyA9IENSWVBUT19QUkVGSVhfQ01EX0JEUyAtIDE7XG4rfVxuK1xuK3N0YXRpYyBpbnQgYm54dF9rdGxzX3R4X29vbyhzdHJ1Y3QgYm54dCAqYnAsIHN0cnVjdCBibnh0X3R4X3JpbmdfaW5mbyAqdHhyLFxuK1x0XHRcdCAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgcGF5bG9hZF9sZW4sIHUzMiBzZXEsXG4rXHRcdFx0ICAgIHN0cnVjdCB0bHNfY29udGV4dCAqdGxzX2N0eClcbit7XG4rXHRzdHJ1Y3QgYm54dF90bHNfc3dfc3RhdHMgKnJpbmdfc3RhdHMgPSB0eHItXHUwMDNldGxzX3N0YXRzO1xuK1x0c3RydWN0IHRsc19vZmZsb2FkX2NvbnRleHRfdHggKnR4X3Rsc19jdHg7XG4rXHRzdHJ1Y3QgYm54dF9rdGxzX29mZmxvYWRfY3R4X3R4ICprY3R4X3R4O1xuK1x0dTMyIGhkcl90Y3Bfc2VxLCBlbmRfc2VxLCB0b3RhbF9iZHM7XG4rXHRzdHJ1Y3QgY3J5cHRvX3ByZWZpeF9jbWQgcGNtZCA9IHt9O1xuK1x0c3RydWN0IHRsc19yZWNvcmRfaW5mbyAqcmVjb3JkO1xuK1x0dW5zaWduZWQgbG9uZyBmbGFncztcbitcdGJvb2wgZndkID0gZmFsc2U7XG4rXHRfX2xlNjQgbGVfcmVjX3NuO1xuK1x0dTY0IHJlY19zbjtcbitcdHU4ICpoZHI7XG4rXHRpbnQgcmM7XG4rXG4rXHR0eF90bHNfY3R4ID0gdGxzX29mZmxvYWRfY3R4X3R4KHRsc19jdHgpO1xuK1x0a2N0eF90eCA9IGJueHRfZ2V0X2t0bHNfY3R4X3R4KHRsc19jdHgpO1xuK1x0ZW5kX3NlcSA9IHNlcSArIHNrYi1cdTAwM2VsZW4gLSBza2JfdGNwX2FsbF9oZWFkZXJzKHNrYik7XG4rXHRpZiAodW5saWtlbHkoYWZ0ZXIoc2VxLCBrY3R4X3R4LVx1MDAzZXRjcF9zZXFfbm8pIHx8XG4rXHRcdCAgICAgYWZ0ZXIoZW5kX3NlcSwga2N0eF90eC1cdTAwM2V0Y3Bfc2VxX25vKSkpIHtcbitcdFx0ZndkID0gdHJ1ZTtcbitcdFx0cGNtZC5mbGFncyA9IENSWVBUT19QUkVGSVhfQ01EX0ZMQUdTX1VQREFURV9JTl9PUkRFUl9WQVJfTEU7XG4rXHR9XG4rXG4rXHRzcGluX2xvY2tfaXJxc2F2ZShcdTAwMjZ0eF90bHNfY3R4LVx1MDAzZWxvY2ssIGZsYWdzKTtcbitcdHJlY29yZCA9IHRsc19nZXRfcmVjb3JkKHR4X3Rsc19jdHgsIHNlcSwgXHUwMDI2cmVjX3NuKTtcbitcdGlmICghcmVjb3JkIHx8ICFyZWNvcmQtXHUwMDNlbnVtX2ZyYWdzKSB7XG4rXHRcdHJjID0gLUVQUk9UTztcbitcdFx0cmluZ19zdGF0cy1cdTAwM2Vjb3VudGVyc1tCTlhUX0tUTFNfVFhfT09PX0ZBTExCQUNLX05PX1NZTkNdKys7XG4rXHRcdGdvdG8gdW5sb2NrX2V4aXQ7XG4rXHR9XG4rXHRoZHJfdGNwX3NlcSA9IHRsc19yZWNvcmRfc3RhcnRfc2VxKHJlY29yZCk7XG4rXHRoZHIgPSBza2JfZnJhZ19hZGRyZXNzX3NhZmUoXHUwMDI2cmVjb3JkLVx1MDAzZWZyYWdzWzBdKTtcbitcbitcdHRvdGFsX2JkcyA9IENSWVBUT19QUkVTWU5DX0JEUyArIHNrYl9zaGluZm8oc2tiKS1cdTAwM2Vucl9mcmFncyArIDI7XG4rXHRpZiAoYm54dF90eF9hdmFpbChicCwgdHhyKSBcdTAwM2MgdG90YWxfYmRzKSB7XG4rXHRcdHJjID0gLUVOT1NQQztcbitcdFx0cmluZ19zdGF0cy1cdTAwM2Vjb3VudGVyc1tCTlhUX0tUTFNfVFhfT09PX0ZBTExCQUNLX05PX1NQQUNFXSsrO1xuK1x0XHRnb3RvIHVubG9ja19leGl0O1xuK1x0fVxuK1xuK1x0aWYgKGJlZm9yZShyZWNvcmQtXHUwMDNlZW5kX3NlcSAtIHRsc19jdHgtXHUwMDNlcHJvdF9pbmZvLnRhZ19zaXplLFxuK1x0XHQgICBzZXEgKyBwYXlsb2FkX2xlbikpIHtcbitcdFx0LyogcmV0cmFuc21pc3Npb24gaW5jbHVkZXMgdGFnIGJ5dGVzICovXG4rXHRcdHJjID0gLUVPUE5PVFNVUFA7XG4rXHRcdGdvdG8gdW5sb2NrX2V4aXQ7XG4rXHR9XG4rXHRwY21kLmhlYWRlcl90Y3Bfc2VxX251bSA9IGNwdV90b19sZTMyKGhkcl90Y3Bfc2VxKTtcbitcdHBjbWQuc3RhcnRfdGNwX3NlcV9udW0gPSBjcHVfdG9fbGUzMihzZXEpO1xuK1x0cGNtZC5lbmRfdGNwX3NlcV9udW0gPSBjcHVfdG9fbGUzMihzZXEgKyBwYXlsb2FkX2xlbiAtIDEpO1xuK1x0aWYgKHRsc19jdHgtXHUwMDNlcHJvdF9pbmZvLnZlcnNpb24gPT0gVExTXzFfMl9WRVJTSU9OKSB7XG4rXHRcdHUzMiBub25jZV9ieXRlcyA9IHRsc19jdHgtXHUwMDNlcHJvdF9pbmZvLml2X3NpemU7XG4rXHRcdHUzMiByZXRyYW5zX29mZiA9IHNlcSAtIGhkcl90Y3Bfc2VxO1xuK1xuK1x0XHRpZiAoIWhkcikge1xuK1x0XHRcdHJjID0gLUVOT0JVRlM7XG4rXHRcdFx0cmluZ19zdGF0cy1cdTAwM2Vjb3VudGVyc1tCTlhUX0tUTFNfVFhfT09PX0ZBTExCQUNLX05PX0hEUl0rKztcbitcdFx0XHRnb3RvIHVubG9ja19leGl0O1xuK1x0XHR9XG4rXHRcdGlmIChyZXRyYW5zX29mZiBcdTAwM2UgNSBcdTAwMjZcdTAwMjYgcmV0cmFuc19vZmYgXHUwMDNjIDUgKyBub25jZV9ieXRlcylcbitcdFx0XHRub25jZV9ieXRlcyA9IHJldHJhbnNfb2ZmIC0gNTtcbitcdFx0bWVtY3B5KHBjbWQuZXhwbGljaXRfbm9uY2UsIGhkciArIDUsIG5vbmNlX2J5dGVzKTtcbitcdH1cbitcdGxlX3JlY19zbiA9IGNwdV90b19sZTY0KHJlY19zbik7XG4rXHRtZW1jcHkoXHUwMDI2cGNtZC5yZWNvcmRfc2VxX251bVswXSwgXHUwMDI2bGVfcmVjX3NuLCBzaXplb2YobGVfcmVjX3NuKSk7XG4rXG4rXHRyYyA9IDA7XG4rXHRibnh0X2t0bHNfcHJlX3htaXQoYnAsIHR4ciwga2N0eF90eC1cdTAwM2VraWQsIFx1MDAyNnBjbWQpO1xuK1xuK1x0aWYgKGZ3ZCkge1xuK1x0XHRrY3R4X3R4LVx1MDAzZW5leHRfdGNwX3NlcV9ubyA9IGVuZF9zZXE7XG4rXHRcdGtjdHhfdHgtXHUwMDNlcGVuZGluZ19md2QgPSB0cnVlO1xuK1x0fVxuK1xuK3VubG9ja19leGl0OlxuK1x0c3Bpbl91bmxvY2tfaXJxcmVzdG9yZShcdTAwMjZ0eF90bHNfY3R4LVx1MDAzZWxvY2ssIGZsYWdzKTtcbitcdHJldHVybiByYztcbit9XG4rXG4rc3RydWN0IHNrX2J1ZmYgKmJueHRfa3Rsc194bWl0KHN0cnVjdCBibnh0ICpicCwgc3RydWN0IGJueHRfdHhfcmluZ19pbmZvICp0eHIsXG4rXHRcdFx0ICAgICAgIHN0cnVjdCBza19idWZmICpza2IsIF9fbGUzMiAqbGZsYWdzLCB1MzIgKmtpZCxcbitcdFx0XHQgICAgICAgc3RydWN0IGJueHRfa3Rsc19vZmZsb2FkX2N0eF90eCAqKmtjdHhfdHhfcClcbit7XG4rXHRzdHJ1Y3QgYm54dF90bHNfaW5mbyAqa3RscyA9IGJwLVx1MDAzZWt0bHNfaW5mbztcbitcdHN0cnVjdCBibnh0X2t0bHNfb2ZmbG9hZF9jdHhfdHggKmtjdHhfdHg7XG4rXHRzdHJ1Y3QgdGxzX2NvbnRleHQgKnRsc19jdHg7XG4rXHR1MzIgc2VxLCBwYXlsb2FkX2xlbjtcbitcdGludCByYztcbitcbitcdGlmICghSVNfRU5BQkxFRChDT05GSUdfVExTX0RFVklDRSkgfHwgIWt0bHMgfHxcbitcdCAgICAhdGxzX2lzX3NrYl90eF9kZXZpY2Vfb2ZmbG9hZGVkKHNrYikpXG4rXHRcdHJldHVybiBza2I7XG4rXG4rXHRzZXEgPSBudG9obCh0Y3BfaGRyKHNrYiktXHUwMDNlc2VxKTtcbitcdHRsc19jdHggPSB0bHNfZ2V0X2N0eChza2ItXHUwMDNlc2spO1xuK1x0a2N0eF90eCA9IGJueHRfZ2V0X2t0bHNfY3R4X3R4KHRsc19jdHgpO1xuK1x0cGF5bG9hZF9sZW4gPSBza2ItXHUwMDNlbGVuIC0gc2tiX3RjcF9hbGxfaGVhZGVycyhza2IpO1xuK1x0aWYgKCFwYXlsb2FkX2xlbilcbitcdFx0cmV0dXJuIHNrYjtcbitcdGlmIChrY3R4X3R4LVx1MDAzZXRjcF9zZXFfbm8gPT0gc2VxKSB7XG4rXHRcdC8qIFN0YWdlIHRoZSBhZHZhbmNlIG9ubHkuICB0Y3Bfc2VxX25vIGFuZCB0aGUgY291bnRlcnMgYXJlXG4rXHRcdCAqIGNvbW1pdHRlZCBieSBibnh0X2t0bHNfeG1pdF9jb21taXQoKSBvbmNlIHRoZSBCRCByZWFjaGVzIHRoZVxuK1x0XHQgKiByaW5nLlxuK1x0XHQgKi9cbitcdFx0a2N0eF90eC1cdTAwM2VuZXh0X3RjcF9zZXFfbm8gPSBzZXEgKyBwYXlsb2FkX2xlbjtcbitcdFx0a2N0eF90eC1cdTAwM2VwZW5kaW5nX2J5dGVzID0gcGF5bG9hZF9sZW47XG4rXHRcdGtjdHhfdHgtXHUwMDNlcGVuZGluZ19vb28gPSBmYWxzZTtcbitcdFx0a2N0eF90eC1cdTAwM2VwZW5kaW5nX2Z3ZCA9IHRydWU7XG4rXHRcdCpraWQgPSBCTlhUX0tJRF9IVyhrY3R4X3R4LVx1MDAzZWtpZCk7XG4rXHRcdCprY3R4X3R4X3AgPSBrY3R4X3R4O1xuK1x0XHQqbGZsYWdzIHw9IGNwdV90b19sZTMyKFRYX0JEX0ZMQUdTX0NSWVBUT19FTiB8XG4rXHRcdFx0XHQgICAgICAgQk5YVF9UWF9LSURfTE8oKmtpZCkpO1xuK1x0fSBlbHNlIHtcbitcdFx0a2N0eF90eC1cdTAwM2VwZW5kaW5nX2Z3ZCA9IGZhbHNlO1xuK1x0XHRyYyA9IGJueHRfa3Rsc190eF9vb28oYnAsIHR4ciwgc2tiLCBwYXlsb2FkX2xlbiwgc2VxLCB0bHNfY3R4KTtcbitcdFx0aWYgKHJjKVxuK1x0XHRcdHJldHVybiB0bHNfZW5jcnlwdF9za2Ioc2tiKTtcbitcbitcdFx0a2N0eF90eC1cdTAwM2VwZW5kaW5nX2J5dGVzID0gcGF5bG9hZF9sZW47XG4rXHRcdGtjdHhfdHgtXHUwMDNlcGVuZGluZ19vb28gPSB0cnVlO1xuK1x0XHQqa2lkID0gQk5YVF9LSURfSFcoa2N0eF90eC1cdTAwM2VraWQpO1xuK1x0XHQqa2N0eF90eF9wID0ga2N0eF90eDtcbitcdFx0KmxmbGFncyB8PSBjcHVfdG9fbGUzMihUWF9CRF9GTEFHU19DUllQVE9fRU4gfFxuK1x0XHRcdFx0ICAgICAgIEJOWFRfVFhfS0lEX0xPKCpraWQpKTtcbitcdFx0cmV0dXJuIHNrYjtcbitcdH1cbitcdHJldHVybiBza2I7XG4rfVxuK1xuK3ZvaWQgYm54dF9rdGxzX3htaXRfY29tbWl0KHN0cnVjdCBibnh0X3R4X3JpbmdfaW5mbyAqdHhyLFxuK1x0XHRcdCAgIHN0cnVjdCBibnh0X2t0bHNfb2ZmbG9hZF9jdHhfdHggKmtjdHhfdHgpXG4re1xuK1x0aWYgKCFrY3R4X3R4KVxuK1x0XHRyZXR1cm47XG4rXHRpZiAoa2N0eF90eC1cdTAwM2VwZW5kaW5nX2Z3ZClcbitcdFx0a2N0eF90eC1cdTAwM2V0Y3Bfc2VxX25vID0ga2N0eF90eC1cdTAwM2VuZXh0X3RjcF9zZXFfbm87XG4rXHRibnh0X2t0bHNfaW5jX3R4X3N0YXRzKHR4ciwga2N0eF90eC1cdTAwM2VwZW5kaW5nX2J5dGVzLFxuK1x0XHRcdCAgICAgICBrY3R4X3R4LVx1MDAzZXBlbmRpbmdfb29vKTtcbitcdGtjdHhfdHgtXHUwMDNlcGVuZGluZ19ieXRlcyA9IDA7XG4rXHRrY3R4X3R4LVx1MDAzZXBlbmRpbmdfZndkID0gZmFsc2U7XG4rXHRrY3R4X3R4LVx1MDAzZXBlbmRpbmdfb29vID0gZmFsc2U7XG4rfVxuK1xuK2ludCBibnh0X2t0bHNfYWxsb2NfdHhfcmluZ19zdGF0cyhzdHJ1Y3QgYm54dCAqYnAsIHN0cnVjdCBibnh0X3R4X3JpbmdfaW5mbyAqdHhyKVxuK3tcbitcdHN0cnVjdCBibnh0X3Rsc19zd19zdGF0cyAqcmluZ19zdGF0cztcbitcbitcdGlmICghYnAtXHUwMDNla3Rsc19pbmZvKVxuK1x0XHRyZXR1cm4gMDtcbitcdHJpbmdfc3RhdHMgPSBremFsbG9jX29iaigqcmluZ19zdGF0cyk7XG4rXHRpZiAoIXJpbmdfc3RhdHMpXG4rXHRcdHJldHVybiAtRU5PTUVNO1xuK1x0dHhyLVx1MDAzZXRsc19zdGF0cyA9IHJpbmdfc3RhdHM7XG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rdm9pZCBibnh0X2t0bHNfZnJlZV90eF9yaW5nX3N0YXRzKHN0cnVjdCBibnh0X3R4X3JpbmdfaW5mbyAqdHhyKVxuK3tcbitcdGtmcmVlKHR4ci1cdTAwM2V0bHNfc3RhdHMpO1xuK1x0dHhyLVx1MDAzZXRsc19zdGF0cyA9IE5VTEw7XG4rfVxuK1xuK3ZvaWQgYm54dF9nZXRfcmluZ190bHNfc3RhdHMoc3RydWN0IGJueHQgKmJwLCBzdHJ1Y3QgYm54dF90bHNfc3dfc3RhdHMgKnN0YXRzKVxuK3tcbitcdHN0cnVjdCBibnh0X3Rsc19zd19zdGF0cyAqcmluZ19zdGF0cztcbitcdGludCBpLCBqO1xuK1xuK1x0aWYgKCFicC1cdTAwM2VrdGxzX2luZm8gfHwgIWJwLVx1MDAzZXR4X3JpbmcpXG4rXHRcdHJldHVybjtcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIGJwLVx1MDAzZXR4X25yX3JpbmdzOyBpKyspIHtcbitcdFx0cmluZ19zdGF0cyA9IGJwLVx1MDAzZXR4X3JpbmdbaV0udGxzX3N0YXRzO1xuK1x0XHRpZiAoIXJpbmdfc3RhdHMpXG4rXHRcdFx0Y29udGludWU7XG4rXHRcdGZvciAoaiA9IDA7IGogXHUwMDNjIEJOWFRfS1RMU19NQVhfREFUQV9DT1VOVEVSUzsgaisrKVxuK1x0XHRcdHN0YXRzLVx1MDAzZWNvdW50ZXJzW2pdICs9IHJpbmdfc3RhdHMtXHUwMDNlY291bnRlcnNbal07XG4rXHR9XG4rfVxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dF9rdGxzLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibnh0L2JueHRfa3Rscy5oXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMDAuLjNlYzU2YjhmMDhkNDliXG4tLS0gL2Rldi9udWxsXG4rKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibnh0L2JueHRfa3Rscy5oXG5AQCAtMCwwICsxLDE3NCBAQFxuKy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHkgKi9cbisvKiBDb3B5cmlnaHQgKGMpIDIwMjYgQnJvYWRjb20gSW5jLiAqL1xuK1xuKyNpZm5kZWYgQk5YVF9LVExTX0hcbisjZGVmaW5lIEJOWFRfS1RMU19IXG4rXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvd2FpdC5oXHUwMDNlXG4rXG4rLyogQ29udHJvbCBwbGFuZSBjb3VudGVycyAqL1xuK2VudW0gYm54dF9rdGxzX2N0cmxfY291bnRlcnMge1xuK1x0Qk5YVF9LVExTX1RYX0FERCA9IDAsXG4rXHRCTlhUX0tUTFNfVFhfREVMLFxuK1xuK1x0LyogRXJyb3IgY291bnRlcnMgZm9yIGRlYnVnZ2luZyAqL1xuK1x0Qk5YVF9LVExTX0VSUl9OT19NRU0sXHRcdFx0LyogTWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZSAqL1xuK1x0Qk5YVF9LVExTX0VSUl9OT19DQVAsXHRcdFx0LyogQ2FwYWJpbGl0eSBsb3N0IGFmdGVyIEZXIHJlc2V0ICovXG4rXHRCTlhUX0tUTFNfRVJSX0tFWV9DVFhfQUxMT0MsXHRcdC8qIEtleSBjb250ZXh0IGFsbG9jIGZhaWx1cmUgKi9cbitcdEJOWFRfS1RMU19FUlJfQ1JZUFRPX0NNRCxcdFx0LyogQ3J5cHRvIGNvbW1hbmQgZmFpbHVyZSAqL1xuK1x0Qk5YVF9LVExTX0VSUl9ERVZJQ0VfQlVTWSxcdFx0LyogRGV2aWNlIG5vdCByZWFkeSAqL1xuK1x0Qk5YVF9LVExTX0VSUl9JTlZBTElEX0NJUEhFUixcdFx0LyogVW5zdXBwb3J0ZWQgY2lwaGVyICovXG4rXHRCTlhUX0tUTFNfRVJSX1NUQVRFX05PVF9PUEVOLFx0XHQvKiBEZXZpY2Ugbm90IG9wZW4gKi9cbitcdEJOWFRfS1RMU19FUlJfUkVUUllfRVhDRUVERUQsXHRcdC8qIFJldHJ5IGxpbWl0IGV4Y2VlZGVkICovXG4rXG4rXHRCTlhUX0tUTFNfTUFYX0NUUkxfQ09VTlRFUlMsXG4rfTtcbitcbitzdHJ1Y3QgYm54dF90bHNfaW5mbyB7XG4rXHRhdG9taWNfdFx0XHRwZW5kaW5nO1xuK1xuK1x0LyogV29rZW4gZnJvbSBfX2JueHRfb3Blbl9uaWMoKS9fX2JueHRfY2xvc2VfbmljKCkgd2hlblxuK1x0ICogQk5YVF9TVEFURV9PUEVOIGNoYW5nZXMsIHNvIGEga1RMUyBkZWxldGUgY2FuIHdhaXQgb3V0IGEgcmluZ1xuK1x0ICogcmVjb25maWd1cmF0aW9uIGluc3RlYWQgb2YgcG9sbGluZyB0aGUgc3RhdGUgYml0LlxuK1x0ICovXG4rXHR3YWl0X3F1ZXVlX2hlYWRfdFx0b3Blbl93cTtcbitcbitcdC8qIEF0b21pYyBjb3VudGVycyBmb3IgY29udHJvbCBwYXRoICovXG4rXHRhdG9taWM2NF90XHRcdCpjb3VudGVycztcbit9O1xuK1xuK3N0cnVjdCBibnh0X2t0bHNfb2ZmbG9hZF9jdHhfdHgge1xuK1x0dTMyXHRcdHRjcF9zZXFfbm87XHQvKiB0Y3Agc2VxIG5vIGluIHN5bmMgd2l0aCBIVyAqL1xuK1x0dTMyXHRcdG5leHRfdGNwX3NlcV9ubzsvKiBzdGFnZWQgdGNwIHNlcSBubyAqL1xuK1x0dTMyXHRcdGtpZDtcbitcdHUzMlx0XHRwZW5kaW5nX2J5dGVzO1x0Lyogc3RhZ2VkIHBheWxvYWQgYnl0ZXMgKi9cbitcdGJvb2xcdFx0cGVuZGluZ19md2Q7XG4rXHRib29sXHRcdHBlbmRpbmdfb29vO1xuK307XG4rXG4rc3RydWN0IGJueHRfa3Rsc190eF9kcml2ZXJfc3RhdGUge1xuK1x0c3RydWN0IGJueHRfa3Rsc19vZmZsb2FkX2N0eF90eCAqY3R4X3R4O1xuK307XG4rXG4rc3RydWN0IGNlX2FkZF9jbWQge1xuK1x0X19sZTMyXHR2ZXJfYWxnb19raWRfb3Bjb2RlO1xuK1x0I2RlZmluZSBDRV9BRERfQ01EX09QQ09ERV9NQVNLXHRcdFx0MHhmVUxcbitcdCNkZWZpbmUgQ0VfQUREX0NNRF9PUENPREVfU0ZUXHRcdFx0MFxuK1x0I2RlZmluZSBDRV9BRERfQ01EX09QQ09ERV9BRERcdFx0XHQgMHgxVUxcbitcdCNkZWZpbmUgQ0VfQUREX0NNRF9LSURfTUFTS1x0XHRcdDB4ZmZmZmYwVUxcbitcdCNkZWZpbmUgQ0VfQUREX0NNRF9LSURfU0ZUXHRcdFx0NFxuK1x0I2RlZmluZSBDRV9BRERfQ01EX0FMR09SSVRITV9NQVNLXHRcdDB4ZjAwMDAwMFVMXG4rXHQjZGVmaW5lIENFX0FERF9DTURfQUxHT1JJVEhNX1NGVFx0XHQyNFxuK1x0I2RlZmluZSBDRV9BRERfQ01EX0FMR09SSVRITV9BRVNfR0NNXzEyOFx0IDB4MTAwMDAwMFVMXG4rXHQjZGVmaW5lIENFX0FERF9DTURfQUxHT1JJVEhNX0FFU19HQ01fMjU2XHQgMHgyMDAwMDAwVUxcbitcdCNkZWZpbmUgQ0VfQUREX0NNRF9WRVJTSU9OX01BU0tcdFx0XHQweGYwMDAwMDAwVUxcbitcdCNkZWZpbmUgQ0VfQUREX0NNRF9WRVJTSU9OX1NGVFx0XHRcdDI4XG4rXHQjZGVmaW5lIENFX0FERF9DTURfVkVSU0lPTl9UTFMxXzJcdFx0ICgweDBVTCBcdTAwM2NcdTAwM2MgMjgpXG4rXHQjZGVmaW5lIENFX0FERF9DTURfVkVSU0lPTl9UTFMxXzNcdFx0ICgweDFVTCBcdTAwM2NcdTAwM2MgMjgpXG4rXHR1OFx0Y3R4X2tpbmQ7XG4rXHQjZGVmaW5lIENFX0FERF9DTURfQ1RYX0tJTkRfTUFTS1x0XHQweDFmVUxcbitcdCNkZWZpbmUgQ0VfQUREX0NNRF9DVFhfS0lORF9TRlRcdFx0XHQwXG4rXHQjZGVmaW5lIENFX0FERF9DTURfQ1RYX0tJTkRfQ0tfVFhcdFx0IDB4MTFVTFxuK1x0I2RlZmluZSBDRV9BRERfQ01EX0NUWF9LSU5EX0NLX1JYXHRcdCAweDEyVUxcbitcdHU4XHR1bnVzZWQwWzNdO1xuK1x0dThcdHNhbHRbNF07XG4rXHR1OFx0dW51c2VkMVs0XTtcbitcdF9fbGUzMlx0cGt0X3RjcF9zZXFfbnVtO1xuK1x0X19sZTMyXHR0bHNfaGVhZGVyX3RjcF9zZXFfbnVtO1xuK1x0dThcdHJlY29yZF9zZXFfbnVtWzhdO1xuK1x0dThcdHNlc3Npb25fa2V5WzMyXTtcbitcdHU4XHRhZGRsX2l2WzhdO1xuK307XG4rXG4rc3RydWN0IGNyeXB0b19wcmVmaXhfY21kIHtcbitcdF9fbGUzMlx0ZmxhZ3M7XG4rXHQjZGVmaW5lIENSWVBUT19QUkVGSVhfQ01EX0ZMQUdTX1VQREFURV9JTl9PUkRFUl9WQVJcdDB4MVVMXG4rXHQjZGVmaW5lIENSWVBUT19QUkVGSVhfQ01EX0ZMQUdTX0ZVTExfUkVQTEFZX1JFVFJBTlx0MHgyVUxcbitcdF9fbGUzMlx0aGVhZGVyX3RjcF9zZXFfbnVtO1xuK1x0X19sZTMyXHRzdGFydF90Y3Bfc2VxX251bTtcbitcdF9fbGUzMlx0ZW5kX3RjcF9zZXFfbnVtO1xuK1x0dThcdGV4cGxpY2l0X25vbmNlWzhdO1xuK1x0dThcdHJlY29yZF9zZXFfbnVtWzhdO1xuK307XG4rXG4rI2RlZmluZSBDUllQVE9fUFJFRklYX0NNRF9GTEFHU19VUERBVEVfSU5fT1JERVJfVkFSX0xFXHRcXFxuK1x0Y3B1X3RvX2xlMzIoQ1JZUFRPX1BSRUZJWF9DTURfRkxBR1NfVVBEQVRFX0lOX09SREVSX1ZBUilcbitcbisjZGVmaW5lIENSWVBUT19QUkVGSVhfQ01EX1NJWkVcdCgodTMyKXNpemVvZihzdHJ1Y3QgY3J5cHRvX3ByZWZpeF9jbWQpKVxuKyNkZWZpbmUgQ1JZUFRPX1BSRUZJWF9DTURfQkRTXHQoQ1JZUFRPX1BSRUZJWF9DTURfU0laRSAvIHNpemVvZihzdHJ1Y3QgdHhfYmQpKVxuKyNkZWZpbmUgQ1JZUFRPX1BSRVNZTkNfQkRTXHQoQ1JZUFRPX1BSRUZJWF9DTURfQkRTICsgMSlcbitcbisjZGVmaW5lIENSWVBUT19QUkVTWU5DX0JEX0NNRFx0XHRcdFx0XHRcdFxcXG4rXHQoY3B1X3RvX2xlMzIoKENSWVBUT19QUkVGSVhfQ01EX1NJWkUgXHUwMDNjXHUwMDNjIFRYX0JEX0xFTl9TSElGVCkgfFx0XFxcbitcdFx0ICAgICBUWF9CRF9DTlQoQ1JZUFRPX1BSRVNZTkNfQkRTKSB8IFRYX0JEX1RZUEVfUFJFU1lOQ19UWF9CRCkpXG4rXG4rc3RhdGljIGlubGluZSBib29sIGJueHRfa3Rsc19idXN5KHN0cnVjdCBibnh0ICpicClcbit7XG4rXHRyZXR1cm4gYnAtXHUwMDNla3Rsc19pbmZvIFx1MDAyNlx1MDAyNiBhdG9taWNfcmVhZChcdTAwMjZicC1cdTAwM2VrdGxzX2luZm8tXHUwMDNlcGVuZGluZykgXHUwMDNlIDA7XG4rfVxuK1xuKy8qIFdha2UgYW55IGtUTFMgY29udHJvbCBvcCB3YWl0aW5nIGZvciBhIEJOWFRfU1RBVEVfT1BFTiB0cmFuc2l0aW9uLiAqL1xuK3N0YXRpYyBpbmxpbmUgdm9pZCBibnh0X2t0bHNfd2FrZShzdHJ1Y3QgYm54dCAqYnApXG4re1xuK1x0aWYgKGJwLVx1MDAzZWt0bHNfaW5mbylcbitcdFx0d2FrZV91cF9hbGwoXHUwMDI2YnAtXHUwMDNla3Rsc19pbmZvLVx1MDAzZW9wZW5fd3EpO1xuK31cbitcbisjaWZkZWYgQ09ORklHX0JOWFRfVExTXG4raW50IGJueHRfYWxsb2Nfa3Rsc19pbmZvKHN0cnVjdCBibnh0ICpicCk7XG4rdm9pZCBibnh0X2ZyZWVfa3Rsc19pbmZvKHN0cnVjdCBibnh0ICpicCk7XG4raW50IGJueHRfa3Rsc19pbml0KHN0cnVjdCBibnh0ICpicCk7XG4rc3RydWN0IHNrX2J1ZmYgKmJueHRfa3Rsc194bWl0KHN0cnVjdCBibnh0ICpicCwgc3RydWN0IGJueHRfdHhfcmluZ19pbmZvICp0eHIsXG4rXHRcdFx0ICAgICAgIHN0cnVjdCBza19idWZmICpza2IsIF9fbGUzMiAqbGZsYWdzLCB1MzIgKmtpZCxcbitcdFx0XHQgICAgICAgc3RydWN0IGJueHRfa3Rsc19vZmZsb2FkX2N0eF90eCAqKmtjdHhfdHhfcCk7XG4rdm9pZCBibnh0X2t0bHNfeG1pdF9jb21taXQoc3RydWN0IGJueHRfdHhfcmluZ19pbmZvICp0eHIsXG4rXHRcdFx0ICAgc3RydWN0IGJueHRfa3Rsc19vZmZsb2FkX2N0eF90eCAqa2N0eF90eCk7XG4raW50IGJueHRfa3Rsc19hbGxvY190eF9yaW5nX3N0YXRzKHN0cnVjdCBibnh0ICpicCxcbitcdFx0XHRcdCAgc3RydWN0IGJueHRfdHhfcmluZ19pbmZvICp0eHIpO1xuK3ZvaWQgYm54dF9rdGxzX2ZyZWVfdHhfcmluZ19zdGF0cyhzdHJ1Y3QgYm54dF90eF9yaW5nX2luZm8gKnR4cik7XG4rdm9pZCBibnh0X2dldF9yaW5nX3Rsc19zdGF0cyhzdHJ1Y3QgYm54dCAqYnAsIHN0cnVjdCBibnh0X3Rsc19zd19zdGF0cyAqc3RhdHMpO1xuKyNlbHNlXG4rc3RhdGljIGlubGluZSBpbnQgYm54dF9hbGxvY19rdGxzX2luZm8oc3RydWN0IGJueHQgKmJwKVxuK3tcbitcdHJldHVybiAtRU9QTk9UU1VQUDtcbit9XG4rXG4rc3RhdGljIGlubGluZSB2b2lkIGJueHRfZnJlZV9rdGxzX2luZm8oc3RydWN0IGJueHQgKmJwKVxuK3tcbit9XG4rXG4rc3RhdGljIGlubGluZSBpbnQgYm54dF9rdGxzX2luaXQoc3RydWN0IGJueHQgKmJwKVxuK3tcbitcdHJldHVybiAtRU9QTk9UU1VQUDtcbit9XG4rXG4rc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqXG4rYm54dF9rdGxzX3htaXQoc3RydWN0IGJueHQgKmJwLCBzdHJ1Y3QgYm54dF90eF9yaW5nX2luZm8gKnR4cixcbitcdCAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBfX2xlMzIgKmxmbGFncywgdTMyICpraWQsXG4rXHQgICAgICAgc3RydWN0IGJueHRfa3Rsc19vZmZsb2FkX2N0eF90eCAqKmtjdHhfdHhfcClcbit7XG4rXHRyZXR1cm4gc2tiO1xuK31cbitcbitzdGF0aWMgaW5saW5lIHZvaWRcbitibnh0X2t0bHNfeG1pdF9jb21taXQoc3RydWN0IGJueHRfdHhfcmluZ19pbmZvICp0eHIsXG4rXHRcdCAgICAgIHN0cnVjdCBibnh0X2t0bHNfb2ZmbG9hZF9jdHhfdHggKmtjdHhfdHgpXG4re1xuK31cbitcbitzdGF0aWMgaW5saW5lIGludCBibnh0X2t0bHNfYWxsb2NfdHhfcmluZ19zdGF0cyhzdHJ1Y3QgYm54dCAqYnAsXG4rXHRcdFx0XHRcdFx0c3RydWN0IGJueHRfdHhfcmluZ19pbmZvICp0eHIpXG4re1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK3N0YXRpYyBpbmxpbmUgdm9pZCBibnh0X2t0bHNfZnJlZV90eF9yaW5nX3N0YXRzKHN0cnVjdCBibnh0X3R4X3JpbmdfaW5mbyAqdHhyKVxuK3tcbit9XG4rXG4rc3RhdGljIGlubGluZSB2b2lkIGJueHRfZ2V0X3JpbmdfdGxzX3N0YXRzKHN0cnVjdCBibnh0ICpicCxcbitcdFx0XHRcdFx0ICAgc3RydWN0IGJueHRfdGxzX3N3X3N0YXRzICpzdGF0cylcbit7XG4rfVxuKyNlbmRpZlx0LyogQ09ORklHX0JOWFRfVExTICovXG4rI2VuZGlmXHQvKiBCTlhUX0tUTFNfSCAqL1xuZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dF9tcGMuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dF9tcGMuY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAwLi43MWViZWI2ZmYzM2ExNVxuLS0tIC9kZXYvbnVsbFxuKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9ibnh0X21wYy5jXG5AQCAtMCwwICsxLDc4MyBAQFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcbisvKiBDb3B5cmlnaHQgKGMpIDIwMjYgQnJvYWRjb20gSW5jLiAqL1xuK1xuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L3N0ZGRlZi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvdHlwZXMuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2tlcm5lbC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvc2xhYi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvYm54dC9oc2kuaFx1MDAzZVxuK1xuKyNpbmNsdWRlIFwiYm54dC5oXCJcbisjaW5jbHVkZSBcImJueHRfbXBjLmhcIlxuKyNpbmNsdWRlIFwiYm54dF9jcnlwdG8uaFwiXG4rXG4rdm9pZCBibnh0X2FsbG9jX21wY19pbmZvKHN0cnVjdCBibnh0ICpicCwgdTggbXBjX2NobmxzX2NhcClcbit7XG4rXHRpZiAoIShicC1cdTAwM2VmbGFncyBcdTAwMjYgQk5YVF9GTEFHX0NISVBfUDVfUExVUykpXG4rXHRcdHJldHVybjtcbitcbitcdGlmICghYnAtXHUwMDNlbXBjX2luZm8pXG4rXHRcdGJwLVx1MDAzZW1wY19pbmZvID0ga3phbGxvY19vYmooKmJwLVx1MDAzZW1wY19pbmZvKTtcbitcdGlmIChicC1cdTAwM2VtcGNfaW5mbylcbitcdFx0YnAtXHUwMDNlbXBjX2luZm8tXHUwMDNlbXBjX2NobmxzX2NhcCA9IG1wY19jaG5sc19jYXA7XG4rXHRlbHNlXG4rXHRcdG5ldGRldl93YXJuKGJwLVx1MDAzZWRldiwgXCJVbmFibGUgdG8gYWxsb2NhdGUgTVBDIGluZm9cXG5cIik7XG4rfVxuK1xuK3ZvaWQgYm54dF9mcmVlX21wY19pbmZvKHN0cnVjdCBibnh0ICpicClcbit7XG4rXHRibnh0X2ZyZWVfbXBjX3JpbmdzKGJwKTtcbitcdGJueHRfZnJlZV9tcGNzKGJwKTtcbitcdGtmcmVlKGJwLVx1MDAzZW1wY19pbmZvKTtcbitcdGJwLVx1MDAzZW1wY19pbmZvID0gTlVMTDtcbit9XG4rXG4raW50IGJueHRfbXBjX3R4X3JpbmdzX2luX3VzZShzdHJ1Y3QgYm54dCAqYnApXG4re1xuK1x0c3RydWN0IGJueHRfbXBjX2luZm8gKm1wYyA9IGJwLVx1MDAzZW1wY19pbmZvO1xuK1x0aW50IGksIG1wY190eCA9IDA7XG4rXG4rXHRpZiAoIW1wYylcbitcdFx0cmV0dXJuIDA7XG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBCTlhUX01QQ19UWVBFX01BWDsgaSsrKVxuK1x0XHRtcGNfdHggKz0gbXBjLVx1MDAzZW1wY19yaW5nX2NvdW50W2ldO1xuK1x0cmV0dXJuIG1wY190eDtcbit9XG4rXG4raW50IGJueHRfbXBjX2NwX3JpbmdzX2luX3VzZShzdHJ1Y3QgYm54dCAqYnApXG4re1xuK1x0c3RydWN0IGJueHRfbXBjX2luZm8gKm1wYyA9IGJwLVx1MDAzZW1wY19pbmZvO1xuK1xuK1x0aWYgKCFtcGMpXG4rXHRcdHJldHVybiAwO1xuK1x0cmV0dXJuIG1wYy1cdTAwM2VtcGNfY3BfcmluZ3M7XG4rfVxuK1xuK2Jvb2wgYm54dF9uYXBpX2hhc19tcGMoc3RydWN0IGJueHQgKmJwLCBpbnQgaSlcbit7XG4rXHRzdHJ1Y3QgYm54dF9tcGNfaW5mbyAqbXBjID0gYnAtXHUwMDNlbXBjX2luZm87XG4rXHRzdHJ1Y3QgYm54dF9uYXBpICpibmFwaSA9IGJwLVx1MDAzZWJuYXBpW2ldO1xuK1x0c3RydWN0IGJueHRfdHhfcmluZ19pbmZvICp0eHI7XG4rXG4rXHRpZiAoIW1wYylcbitcdFx0cmV0dXJuIGZhbHNlO1xuK1xuK1x0dHhyID0gYm5hcGktXHUwMDNldHhfcmluZ1swXTtcbitcdGlmICh0eHIgXHUwMDI2XHUwMDI2ICEoYm5hcGktXHUwMDNlZmxhZ3MgXHUwMDI2IEJOWFRfTkFQSV9GTEFHX1hEUCkpXG4rXHRcdHJldHVybiB0eHItXHUwMDNldHhxX2luZGV4IFx1MDAzYyBtcGMtXHUwMDNlbXBjX2NwX3JpbmdzO1xuK1x0cmV0dXJuIGZhbHNlO1xuK31cbitcbit2b2lkIGJueHRfc2V0X21wY19jcF9yaW5nKHN0cnVjdCBibnh0ICpicCwgaW50IGJuYXBpX2lkeCxcbitcdFx0XHQgIHN0cnVjdCBibnh0X2NwX3JpbmdfaW5mbyAqY3ByKVxuK3tcbitcdHN0cnVjdCBibnh0X21wY19pbmZvICptcGMgPSBicC1cdTAwM2VtcGNfaW5mbztcbitcdHN0cnVjdCBibnh0X25hcGkgKmJuYXBpO1xuK1x0Ym9vbCBmb3VuZCA9IGZhbHNlO1xuK1x0aW50IGksIGo7XG4rXG4rXHRpZiAoIW1wYylcbitcdFx0cmV0dXJuO1xuK1x0Ym5hcGkgPSBicC1cdTAwM2VibmFwaVtibmFwaV9pZHhdO1xuK1x0LyogQ2hlY2sgYm90aCBUQ0UgYW5kIFJDRSBNUENzIGZvciB0aGUgbWF0Y2hpbmcgTkFQSSAqL1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgQk5YVF9NUENfVFlQRV9NQVg7IGkrKykge1xuK1x0XHRpbnQgbnVtID0gbXBjLVx1MDAzZW1wY19yaW5nX2NvdW50W2ldO1xuK1xuK1x0XHRmb3IgKGogPSAwOyBqIFx1MDAzYyBudW07IGorKykge1xuK1x0XHRcdHN0cnVjdCBibnh0X3R4X3JpbmdfaW5mbyAqdHhyID0gXHUwMDI2bXBjLVx1MDAzZW1wY19yaW5nc1tpXVtqXTtcbitcbitcdFx0XHQvKiBPbmx5IDEgcmluZyB3aXRoIGluZGV4IGogd2lsbCB1c2UgdGhpcyBOQVBJICovXG4rXHRcdFx0aWYgKHR4ci1cdTAwM2VibmFwaSA9PSBibmFwaSkge1xuK1x0XHRcdFx0dHhyLVx1MDAzZXR4X2NwciA9IGNwcjtcbitcdFx0XHRcdHR4ci1cdTAwM2V0eF9uYXBpX2lkeCA9IGk7XG4rXHRcdFx0XHRibmFwaS1cdTAwM2V0eF9tcGNfcmluZ1tpXSA9IHR4cjtcbitcdFx0XHRcdGZvdW5kID0gdHJ1ZTtcbitcdFx0XHRcdGJyZWFrO1xuK1x0XHRcdH1cbitcdFx0fVxuK1x0fVxuK1x0aWYgKCFmb3VuZClcbitcdFx0bmV0ZGV2X3dhcm5fb25jZShicC1cdTAwM2VkZXYsIFwiTm8gTVBDIG1hdGNoIGZvciBuYXBpIGluZGV4ICVkXFxuXCIsXG4rXHRcdFx0XHQgYm5hcGlfaWR4KTtcbitcdGNwci1cdTAwM2VjcF9yaW5nX3R5cGUgPSBCTlhUX05RX0hETF9UWVBFX01QO1xuK31cbitcbit2b2lkIGJueHRfdHJpbV9tcGNfcmluZ3Moc3RydWN0IGJueHQgKmJwKVxuK3tcbitcdHN0cnVjdCBibnh0X21wY19pbmZvICptcGMgPSBicC1cdTAwM2VtcGNfaW5mbztcbitcdGludCBtYXggPSBicC1cdTAwM2V0eF9ucl9yaW5nc19wZXJfdGM7XG4rXHR1OCBtYXhfY3AgPSAwO1xuK1x0aW50IGk7XG4rXG4rXHRpZiAoIW1wYylcbitcdFx0cmV0dXJuO1xuK1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgQk5YVF9NUENfVFlQRV9NQVg7IGkrKykge1xuK1x0XHRtcGMtXHUwMDNlbXBjX3JpbmdfY291bnRbaV0gPSBtaW5fdChpbnQsIG1wYy1cdTAwM2VtcGNfcmluZ19jb3VudFtpXSxcbitcdFx0XHRcdFx0ICAgICAgIG1heCk7XG4rXHRcdG1heF9jcCA9IG1heChtYXhfY3AsIG1wYy1cdTAwM2VtcGNfcmluZ19jb3VudFtpXSk7XG4rXHR9XG4rXHRtcGMtXHUwMDNlbXBjX2NwX3JpbmdzID0gbWF4X2NwO1xuK31cbitcbit2b2lkIGJueHRfY2FsY19kZmx0X21wY19yaW5ncyhzdHJ1Y3QgYm54dCAqYnAsIGludCB0eF9ucl9yaW5ncyxcbitcdFx0XHQgICAgICBpbnQgdHhfbnJfcmluZ3NfcGVyX3RjLCBpbnQgcnhfbnJfcmluZ3MsXG4rXHRcdFx0ICAgICAgaW50ICptcGNfcGVyX3R5cGUsIGludCAqbXBjX2NwKVxuK3tcbitcdHN0cnVjdCBibnh0X2h3X3Jlc2MgKmh3X3Jlc2MgPSBcdTAwMjZicC1cdTAwM2Vod19yZXNjO1xuK1x0aW50IG1wY190Y2UsIGF2YWlsO1xuK1xuK1x0Km1wY19wZXJfdHlwZSA9IDA7XG4rXHQqbXBjX2NwID0gMDtcbitcbitcdGlmICghQk5YVF9NUENfQ1JZUFRPX0NBUEFCTEUoYnApKVxuK1x0XHRyZXR1cm47XG4rXG4rXHRhdmFpbCA9IGh3X3Jlc2MtXHUwMDNlbWF4X3R4X3JpbmdzIC0gdHhfbnJfcmluZ3M7XG4rXHQvKiBkb24ndCB1c2UgbW9yZSB0aGFuIDgwJSAqL1xuK1x0YXZhaWwgPSBhdmFpbCAqIDQgLyA1O1xuK1xuK1x0aWYgKGF2YWlsIFx1MDAzYyAoQk5YVF9NSU5fTVBDX1RDRSArIEJOWFRfTUlOX01QQ19SQ0UpKVxuK1x0XHRyZXR1cm47XG4rXG4rXHRtcGNfdGNlID0gbWluX3QoaW50LCBhdmFpbCAvIDIsIHR4X25yX3JpbmdzX3Blcl90Yyk7XG4rXHRtcGNfdGNlID0gbWluX3QoaW50LCBtcGNfdGNlLCBCTlhUX0RGTFRfTVBDX1RDRSk7XG4rXG4rXHRhdmFpbCA9IGh3X3Jlc2MtXHUwMDNlbWF4X2NwX3JpbmdzIC0gdHhfbnJfcmluZ3MgLSByeF9ucl9yaW5ncztcbitcbitcdGlmIChhdmFpbCBcdTAwM2MgQk5YVF9NSU5fTVBDX1RDRSB8fCBhdmFpbCBcdTAwM2MgQk5YVF9NSU5fTVBDX1JDRSlcbitcdFx0cmV0dXJuO1xuK1xuK1x0bXBjX3RjZSA9IG1pbihtcGNfdGNlLCBhdmFpbCk7XG4rXG4rXHQvKiBUQ0UgYW5kIFJDRSBhcmUgc2l6ZWQgZXF1YWxseSwgc28gdGhlIHBlci10eXBlIGNvdW50IGlzIGFsc28gdGhlXG4rXHQgKiBNUEMgQ1AgcmluZyBjb3VudCAobWF4KG1wY190Y2UsIG1wY19yY2UpKS5cbitcdCAqL1xuK1x0Km1wY19wZXJfdHlwZSA9IG1wY190Y2U7XG4rXHQqbXBjX2NwID0gbXBjX3RjZTtcbit9XG4rXG4rdm9pZCBibnh0X3NldF9kZmx0X21wY19yaW5ncyhzdHJ1Y3QgYm54dCAqYnApXG4re1xuK1x0c3RydWN0IGJueHRfbXBjX2luZm8gKm1wYyA9IGJwLVx1MDAzZW1wY19pbmZvO1xuK1x0aW50IHBlcl90eXBlLCBtcGNfY3AsIGk7XG4rXG4rXHRpZiAoIUJOWFRfTVBDX0NSWVBUT19DQVBBQkxFKGJwKSlcbitcdFx0cmV0dXJuO1xuK1xuK1x0Ym54dF9jYWxjX2RmbHRfbXBjX3JpbmdzKGJwLCBicC1cdTAwM2V0eF9ucl9yaW5ncywgYnAtXHUwMDNldHhfbnJfcmluZ3NfcGVyX3RjLFxuK1x0XHRcdFx0IGJwLVx1MDAzZXJ4X25yX3JpbmdzLCBcdTAwMjZwZXJfdHlwZSwgXHUwMDI2bXBjX2NwKTtcbitcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIEJOWFRfTVBDX1RZUEVfTUFYOyBpKyspXG4rXHRcdG1wYy1cdTAwM2VtcGNfcmluZ19jb3VudFtpXSA9IHBlcl90eXBlO1xuK1x0bXBjLVx1MDAzZW1wY19jcF9yaW5ncyA9IG1wY19jcDtcbit9XG4rXG4rdm9pZCBibnh0X2luaXRfbXBjX3Jpbmdfc3RydWN0KHN0cnVjdCBibnh0ICpicClcbit7XG4rXHRzdHJ1Y3QgYm54dF9tcGNfaW5mbyAqbXBjID0gYnAtXHUwMDNlbXBjX2luZm87XG4rXHRpbnQgaSwgajtcbitcbitcdGlmICghQk5YVF9NUENfQ1JZUFRPX0NBUEFCTEUoYnApKVxuK1x0XHRyZXR1cm47XG4rXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBCTlhUX01QQ19UWVBFX01BWDsgaSsrKSB7XG4rXHRcdGludCBudW0gPSBtcGMtXHUwMDNlbXBjX3JpbmdfY291bnRbaV07XG4rXG4rXHRcdGlmICghbXBjLVx1MDAzZW1wY19yaW5nc1tpXSlcbitcdFx0XHRjb250aW51ZTtcbitcdFx0Zm9yIChqID0gMDsgaiBcdTAwM2MgbnVtOyBqKyspIHtcbitcdFx0XHRzdHJ1Y3QgYm54dF9yaW5nX21lbV9pbmZvICpybWVtO1xuK1x0XHRcdHN0cnVjdCBibnh0X3Jpbmdfc3RydWN0ICpyaW5nO1xuK1x0XHRcdHN0cnVjdCBibnh0X3R4X3JpbmdfaW5mbyAqdHhyO1xuK1xuK1x0XHRcdHR4ciA9IFx1MDAyNm1wYy1cdTAwM2VtcGNfcmluZ3NbaV1bal07XG4rXG4rXHRcdFx0dHhyLVx1MDAzZXR4X3Jpbmdfc3RydWN0LnJpbmdfbWVtLmZsYWdzID1cbitcdFx0XHRcdEJOWFRfUk1FTV9SSU5HX1BURV9GTEFHO1xuK1x0XHRcdHR4ci1cdTAwM2VibmFwaSA9IGJwLVx1MDAzZXR4X3JpbmdbYnAtXHUwMDNldHhfcmluZ19tYXBbal1dLmJuYXBpO1xuK1x0XHRcdHR4ci1cdTAwM2V0eHFfaW5kZXggPSBqO1xuK1xuK1x0XHRcdHJpbmcgPSBcdTAwMjZ0eHItXHUwMDNldHhfcmluZ19zdHJ1Y3Q7XG4rXHRcdFx0cm1lbSA9IFx1MDAyNnJpbmctXHUwMDNlcmluZ19tZW07XG4rXHRcdFx0cm1lbS1cdTAwM2Vucl9wYWdlcyA9IGJwLVx1MDAzZXR4X25yX3BhZ2VzO1xuK1x0XHRcdHJtZW0tXHUwMDNlcGFnZV9zaXplID0gSFdfVFhCRF9SSU5HX1NJWkU7XG4rXHRcdFx0cm1lbS1cdTAwM2VwZ19hcnIgPSAodm9pZCAqKil0eHItXHUwMDNldHhfZGVzY19yaW5nO1xuK1x0XHRcdHJtZW0tXHUwMDNlZG1hX2FyciA9IHR4ci1cdTAwM2V0eF9kZXNjX21hcHBpbmc7XG4rXHRcdFx0cm1lbS1cdTAwM2V2bWVtX3NpemUgPSBTV19NUENfVFhCRF9SSU5HX1NJWkUgKlxuK1x0XHRcdFx0XHQgIGJwLVx1MDAzZXR4X25yX3BhZ2VzO1xuK1x0XHRcdHJtZW0tXHUwMDNldm1lbSA9ICh2b2lkICoqKVx1MDAyNnR4ci1cdTAwM2V0eF9tcGNfYnVmX3Jpbmc7XG4rXHRcdH1cbitcdH1cbit9XG4rXG4raW50IGJueHRfYWxsb2NfbXBjcyhzdHJ1Y3QgYm54dCAqYnApXG4re1xuK1x0c3RydWN0IGJueHRfbXBjX2luZm8gKm1wYyA9IGJwLVx1MDAzZW1wY19pbmZvO1xuK1x0aW50IGksIHJjID0gMDtcbitcbitcdGlmICghQk5YVF9NUENfQ1JZUFRPX0NBUEFCTEUoYnApKVxuK1x0XHRyZXR1cm4gMDtcbitcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIEJOWFRfTVBDX1RZUEVfTUFYOyBpKyspIHtcbitcdFx0aW50IG51bSA9IG1wYy1cdTAwM2VtcGNfcmluZ19jb3VudFtpXTtcbitcdFx0c3RydWN0IGJueHRfdHhfcmluZ19pbmZvICp0eHI7XG4rXG4rXHRcdGlmICghbnVtKVxuK1x0XHRcdGNvbnRpbnVlO1xuK1x0XHR0eHIgPSBremFsbG9jX29ianMoKnR4ciwgbnVtKTtcbitcdFx0aWYgKCF0eHIpIHtcbitcdFx0XHRyYyA9IC1FTk9NRU07XG4rXHRcdFx0Z290byBhbGxvY19tcGNzX2V4aXQ7XG4rXHRcdH1cbitcdFx0bXBjLVx1MDAzZW1wY19yaW5nc1tpXSA9IHR4cjtcbitcdH1cbitcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIGJwLVx1MDAzZWNwX25yX3JpbmdzOyBpKyspIHtcbitcdFx0c3RydWN0IGJueHRfbmFwaSAqYm5hcGkgPSBicC1cdTAwM2VibmFwaVtpXTtcbitcbitcdFx0aWYgKCFibnh0X25hcGlfaGFzX21wYyhicCwgaSkpXG4rXHRcdFx0Y29udGludWU7XG4rXHRcdGJuYXBpLVx1MDAzZXR4X21wY19yaW5nID0ga3phbGxvY19vYmpzKCpibmFwaS1cdTAwM2V0eF9tcGNfcmluZyxcbitcdFx0XHRcdFx0XHQgIEJOWFRfTVBDX1RZUEVfTUFYKTtcbitcdFx0aWYgKCFibmFwaS1cdTAwM2V0eF9tcGNfcmluZykge1xuK1x0XHRcdHJjID0gLUVOT01FTTtcbitcdFx0XHRnb3RvIGFsbG9jX21wY3NfZXhpdDtcbitcdFx0fVxuK1x0fVxuK2FsbG9jX21wY3NfZXhpdDpcbitcdGlmIChyYylcbitcdFx0Ym54dF9mcmVlX21wY3MoYnApO1xuK1x0cmV0dXJuIHJjO1xuK31cbitcbit2b2lkIGJueHRfZnJlZV9tcGNzKHN0cnVjdCBibnh0ICpicClcbit7XG4rXHRzdHJ1Y3QgYm54dF9tcGNfaW5mbyAqbXBjID0gYnAtXHUwMDNlbXBjX2luZm87XG4rXHRpbnQgaTtcbitcbitcdGlmICghbXBjKVxuK1x0XHRyZXR1cm47XG4rXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBCTlhUX01QQ19UWVBFX01BWDsgaSsrKSB7XG4rXHRcdGtmcmVlKG1wYy1cdTAwM2VtcGNfcmluZ3NbaV0pO1xuK1x0XHRtcGMtXHUwMDNlbXBjX3JpbmdzW2ldID0gTlVMTDtcbitcdH1cbitcdGlmICghYnAtXHUwMDNlYm5hcGkpXG4rXHRcdHJldHVybjtcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIGJwLVx1MDAzZWNwX25yX3JpbmdzOyBpKyspIHtcbitcdFx0c3RydWN0IGJueHRfbmFwaSAqYm5hcGkgPSBicC1cdTAwM2VibmFwaVtpXTtcbitcbitcdFx0a2ZyZWUoYm5hcGktXHUwMDNldHhfbXBjX3JpbmcpO1xuK1x0XHRibmFwaS1cdTAwM2V0eF9tcGNfcmluZyA9IE5VTEw7XG4rXHR9XG4rfVxuK1xuK2ludCBibnh0X2FsbG9jX21wY19yaW5ncyhzdHJ1Y3QgYm54dCAqYnApXG4re1xuK1x0c3RydWN0IGJueHRfbXBjX2luZm8gKm1wYyA9IGJwLVx1MDAzZW1wY19pbmZvO1xuK1x0aW50IGksIGosIHJjID0gMDtcbitcbitcdGlmICghbXBjKVxuK1x0XHRyZXR1cm4gMDtcbitcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIEJOWFRfTVBDX1RZUEVfTUFYOyBpKyspIHtcbitcdFx0aW50IG51bSA9IG1wYy1cdTAwM2VtcGNfcmluZ19jb3VudFtpXTtcbitcbitcdFx0Zm9yIChqID0gMDsgaiBcdTAwM2MgbnVtOyBqKyspIHtcbitcdFx0XHRzdHJ1Y3QgYm54dF90eF9yaW5nX2luZm8gKnR4ciA9IFx1MDAyNm1wYy1cdTAwM2VtcGNfcmluZ3NbaV1bal07XG4rXHRcdFx0c3RydWN0IGJueHRfcmluZ19zdHJ1Y3QgKnJpbmc7XG4rXG4rXHRcdFx0cmluZyA9IFx1MDAyNnR4ci1cdTAwM2V0eF9yaW5nX3N0cnVjdDtcbitcdFx0XHRyYyA9IGJueHRfYWxsb2NfcmluZyhicCwgXHUwMDI2cmluZy1cdTAwM2VyaW5nX21lbSk7XG4rXHRcdFx0aWYgKHJjKVxuK1x0XHRcdFx0Z290byBhbGxvY19tcGNfcmluZ3NfZXhpdDtcbitcdFx0XHRyaW5nLVx1MDAzZXF1ZXVlX2lkID0gQk5YVF9NUENfUVVFVUVfSUQ7XG4rXHRcdFx0cmluZy1cdTAwM2VtcGNfY2hubF90eXBlID0gaTtcbitcdFx0XHQvKiBmb3Igc3RhdHMgY29udGV4dCAqL1xuK1x0XHRcdHJpbmctXHUwMDNlZ3JwX2lkeCA9IHR4ci1cdTAwM2VibmFwaS1cdTAwM2VpbmRleDtcbitcdFx0XHRzcGluX2xvY2tfaW5pdChcdTAwMjZ0eHItXHUwMDNldHhfbG9jayk7XG4rXHRcdH1cbitcdH1cbithbGxvY19tcGNfcmluZ3NfZXhpdDpcbitcdGlmIChyYylcbitcdFx0Ym54dF9mcmVlX21wY19yaW5ncyhicCk7XG4rXHRyZXR1cm4gcmM7XG4rfVxuK1xuK3ZvaWQgYm54dF9mcmVlX21wY19yaW5ncyhzdHJ1Y3QgYm54dCAqYnApXG4re1xuK1x0c3RydWN0IGJueHRfbXBjX2luZm8gKm1wYyA9IGJwLVx1MDAzZW1wY19pbmZvO1xuK1x0aW50IGksIGo7XG4rXG4rXHRpZiAoIW1wYylcbitcdFx0cmV0dXJuO1xuK1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgQk5YVF9NUENfVFlQRV9NQVg7IGkrKykge1xuK1x0XHRpbnQgbnVtID0gbXBjLVx1MDAzZW1wY19yaW5nX2NvdW50W2ldO1xuK1xuK1x0XHRpZiAoIW1wYy1cdTAwM2VtcGNfcmluZ3NbaV0pXG4rXHRcdFx0Y29udGludWU7XG4rXHRcdGZvciAoaiA9IDA7IGogXHUwMDNjIG51bTsgaisrKSB7XG4rXHRcdFx0c3RydWN0IGJueHRfdHhfcmluZ19pbmZvICp0eHIgPSBcdTAwMjZtcGMtXHUwMDNlbXBjX3JpbmdzW2ldW2pdO1xuK1x0XHRcdHN0cnVjdCBibnh0X3Jpbmdfc3RydWN0ICpyaW5nID0gXHUwMDI2dHhyLVx1MDAzZXR4X3Jpbmdfc3RydWN0O1xuK1xuK1x0XHRcdGJueHRfZnJlZV9yaW5nKGJwLCBcdTAwMjZyaW5nLVx1MDAzZXJpbmdfbWVtKTtcbitcdFx0fVxuK1x0fVxuK31cbitcbit2b2lkIGJueHRfaW5pdF9tcGNfcmluZ3Moc3RydWN0IGJueHQgKmJwKVxuK3tcbitcdHN0cnVjdCBibnh0X21wY19pbmZvICptcGMgPSBicC1cdTAwM2VtcGNfaW5mbztcbitcdGludCBpLCBqO1xuK1xuK1x0aWYgKCFtcGMpXG4rXHRcdHJldHVybjtcbitcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIEJOWFRfTVBDX1RZUEVfTUFYOyBpKyspIHtcbitcdFx0aW50IG51bSA9IG1wYy1cdTAwM2VtcGNfcmluZ19jb3VudFtpXTtcbitcbitcdFx0Zm9yIChqID0gMDsgaiBcdTAwM2MgbnVtOyBqKyspIHtcbitcdFx0XHRzdHJ1Y3QgYm54dF90eF9yaW5nX2luZm8gKnR4ciA9IFx1MDAyNm1wYy1cdTAwM2VtcGNfcmluZ3NbaV1bal07XG4rXHRcdFx0c3RydWN0IGJueHRfcmluZ19zdHJ1Y3QgKnJpbmcgPSBcdTAwMjZ0eHItXHUwMDNldHhfcmluZ19zdHJ1Y3Q7XG4rXG4rXHRcdFx0dHhyLVx1MDAzZXR4X3Byb2QgPSAwO1xuK1x0XHRcdHR4ci1cdTAwM2V0eF9jb25zID0gMDtcbitcdFx0XHR0eHItXHUwMDNldHhfaHdfY29ucyA9IDA7XG4rXHRcdFx0V1JJVEVfT05DRSh0eHItXHUwMDNlZGV2X3N0YXRlLCAwKTtcbitcdFx0XHRyaW5nLVx1MDAzZWZ3X3JpbmdfaWQgPSBJTlZBTElEX0hXX1JJTkdfSUQ7XG4rXHRcdH1cbitcdH1cbit9XG4rXG4rc3RhdGljIGludCBibnh0X2h3cm1fb25lX21wY19yaW5nX2FsbG9jKHN0cnVjdCBibnh0ICpicCxcbitcdFx0XHRcdFx0c3RydWN0IGJueHRfdHhfcmluZ19pbmZvICp0eHIpXG4re1xuK1x0c3RydWN0IGJueHRfY3BfcmluZ19pbmZvICpjcHIgPSB0eHItXHUwMDNldHhfY3ByO1xuK1x0c3RydWN0IGJueHRfcmluZ19zdHJ1Y3QgKnJpbmc7XG4rXHRpbnQgcmM7XG4rXG4rXHRyaW5nID0gXHUwMDI2Y3ByLVx1MDAzZWNwX3Jpbmdfc3RydWN0O1xuK1x0aWYgKHJpbmctXHUwMDNlZndfcmluZ19pZCA9PSBJTlZBTElEX0hXX1JJTkdfSUQpIHtcbitcdFx0cmMgPSBibnh0X2h3cm1fY3BfcmluZ19hbGxvY19wNShicCwgY3ByKTtcbitcdFx0aWYgKHJjKVxuK1x0XHRcdHJldHVybiByYztcbitcdH1cbitcdC8qIHR4X2lkeCBub3QgdXNlZCBvbiBQNV9QTFVTLCBzbyBzZXQgaXQgdG8gMCAqL1xuK1x0cmV0dXJuIGJueHRfaHdybV90eF9yaW5nX2FsbG9jKGJwLCB0eHIsIDApO1xuK31cbitcbitpbnQgYm54dF9od3JtX21wY19yaW5nX2FsbG9jKHN0cnVjdCBibnh0ICpicClcbit7XG4rXHRzdHJ1Y3QgYm54dF9tcGNfaW5mbyAqbXBjID0gYnAtXHUwMDNlbXBjX2luZm87XG4rXHRpbnQgaSwgaiwgcmMgPSAwO1xuK1xuK1x0aWYgKCFtcGMpXG4rXHRcdHJldHVybiAwO1xuK1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgQk5YVF9NUENfVFlQRV9NQVg7IGkrKykge1xuK1x0XHRpbnQgbnVtID0gbXBjLVx1MDAzZW1wY19yaW5nX2NvdW50W2ldO1xuK1xuK1x0XHRmb3IgKGogPSAwOyBqIFx1MDAzYyBudW07IGorKykge1xuK1x0XHRcdHN0cnVjdCBibnh0X3R4X3JpbmdfaW5mbyAqdHhyID0gXHUwMDI2bXBjLVx1MDAzZW1wY19yaW5nc1tpXVtqXTtcbitcbitcdFx0XHRyYyA9IGJueHRfaHdybV9vbmVfbXBjX3JpbmdfYWxsb2MoYnAsIHR4cik7XG4rXHRcdFx0aWYgKHJjKVxuK1x0XHRcdFx0Z290byBtcGNfcmluZ19hbGxvY19leGl0O1xuK1x0XHR9XG4rXHR9XG4rbXBjX3JpbmdfYWxsb2NfZXhpdDpcbitcdGlmIChyYylcbitcdFx0Ym54dF9od3JtX21wY19yaW5nX2ZyZWUoYnAsIGZhbHNlKTtcbitcdHJldHVybiByYztcbit9XG4rXG4rdm9pZCBibnh0X2h3cm1fbXBjX3JpbmdfZnJlZShzdHJ1Y3QgYm54dCAqYnAsIGJvb2wgY2xvc2VfcGF0aClcbit7XG4rXHRzdHJ1Y3QgYm54dF9tcGNfaW5mbyAqbXBjID0gYnAtXHUwMDNlbXBjX2luZm87XG4rXHRzdHJ1Y3QgYm54dF9jcF9yaW5nX2luZm8gKmNwcjtcbitcdGludCBpLCBqO1xuK1xuK1x0aWYgKCFtcGMpXG4rXHRcdHJldHVybjtcbitcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIEJOWFRfTVBDX1RZUEVfTUFYOyBpKyspIHtcbitcdFx0Zm9yIChqID0gMDsgaiBcdTAwM2MgbXBjLVx1MDAzZW1wY19yaW5nX2NvdW50W2ldOyBqKyspXG4rXHRcdFx0Ym54dF9od3JtX3R4X3JpbmdfZnJlZShicCwgXHUwMDI2bXBjLVx1MDAzZW1wY19yaW5nc1tpXVtqXSxcbitcdFx0XHRcdFx0ICAgICAgIGNsb3NlX3BhdGgpO1xuK1x0fVxuK1x0LyogQ1AgcmluZ3MgbXVzdCBiZSBmcmVlZCBhdCB0aGUgZW5kIHRvIGd1YXJhbnRlZSB0aGF0IHRoZSBIV1JNX0RPTkVcbitcdCAqIHJlc3BvbnNlcyBmb3IgSFdSTV9SSU5HX0ZSRUUgY2FuIHN0aWxsIGJlIHNlZW4gb24gdGhlIENQIHJpbmdzLlxuK1x0ICovXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBCTlhUX01QQ19UWVBFX01BWDsgaSsrKSB7XG4rXHRcdGZvciAoaiA9IDA7IGogXHUwMDNjIG1wYy1cdTAwM2VtcGNfcmluZ19jb3VudFtpXTsgaisrKSB7XG4rXHRcdFx0Y3ByID0gbXBjLVx1MDAzZW1wY19yaW5nc1tpXVtqXS50eF9jcHI7XG4rXHRcdFx0aWYgKGNwciBcdTAwMjZcdTAwMjYgY3ByLVx1MDAzZWNwX3Jpbmdfc3RydWN0LmZ3X3JpbmdfaWQgIT1cbitcdFx0XHQgICAgSU5WQUxJRF9IV19SSU5HX0lEKVxuK1x0XHRcdFx0Ym54dF9od3JtX2NwX3JpbmdfZnJlZShicCwgY3ByKTtcbitcdFx0fVxuK1x0fVxuK31cbitcbitzdHJ1Y3QgYm54dF90eF9yaW5nX2luZm8gKmJueHRfc2VsZWN0X21wY19yaW5nKHN0cnVjdCBibnh0ICpicCwgaW50IHJpbmdfdHlwZSlcbit7XG4rXHRzdHJ1Y3QgYm54dF9tcGNfaW5mbyAqbXBjID0gYnAtXHUwMDNlbXBjX2luZm87XG4rXHRpbnQgbjtcbitcbitcdGlmICghbXBjIHx8IHJpbmdfdHlwZSBcdTAwM2U9IEJOWFRfTVBDX1RZUEVfTUFYIHx8XG4rXHQgICAgIW1wYy1cdTAwM2VtcGNfcmluZ19jb3VudFtyaW5nX3R5cGVdKVxuK1x0XHRyZXR1cm4gTlVMTDtcbitcbitcdG4gPSByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpICUgbXBjLVx1MDAzZW1wY19yaW5nX2NvdW50W3JpbmdfdHlwZV07XG4rXHRyZXR1cm4gXHUwMDI2bXBjLVx1MDAzZW1wY19yaW5nc1tyaW5nX3R5cGVdW25dO1xuK31cbitcbisvKipcbisgKiBibnh0X3N0YXJ0X3htaXRfbXBjIC0gVHJhbnNtaXQgbWVzc2FnZSBvbiBhbiBNUEMgcmluZ1xuKyAqIEBicDogcG9pbnRlciB0byBibnh0IGRldmljZVxuKyAqIEB0eHI6IE1QQyBUWCByaW5nIHN0cnVjdHVyZSBwb2ludGVyXG4rICogQGRhdGE6IE1QQyBtZXNzYWdlIHBvaW50ZXJcbisgKiBAbGVuOiBNUEMgbWVzc2FnZSBsZW5ndGhcbisgKiBAaGFuZGxlOiBOb24temVybyBoYW5kbGUgcGFzc2VkIGJhY2sgZm9yIHRoZSBjb21wbGV0aW9uXG4rICpcbisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byB0cmFuc21pdCBhbiBNUEMgbWVzc2FnZSBvbiBhbiBNUEMgVFggcmluZy5cbisgKiBUaGUgY2FsbGVyIG11c3QgaG9sZCB0eHItXHUwMDNldHhfbG9jay4gIFdoZW4gc3VjY2Vzc2Z1bCwgdGhlIEhXIHdpbGwgcmV0dXJuXG4rICogYSBjb21wbGV0aW9uIGFuZCBibnh0X2NyeXB0b19tcGNfY21wKCkgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUgaGFuZGxlXG4rICogcGFzc2VkIGJhY2suXG4rICpcbisgKiBSZXR1cm46IHplcm8gb24gc3VjY2VzcywgbmVnYXRpdmUgZXJyb3IgY29kZSBvdGhlcndpc2U6XG4rICpcdEVOT0RFVjogTVBDIFRYIHJpbmcgaXMgc2h1dHRpbmcgZG93bi5cbisgKlx0RUJVU1k6IE1QQyBUWCByaW5nIGlzIGZ1bGxcbisgKi9cbitpbnQgYm54dF9zdGFydF94bWl0X21wYyhzdHJ1Y3QgYm54dCAqYnAsIHN0cnVjdCBibnh0X3R4X3JpbmdfaW5mbyAqdHhyLFxuK1x0XHRcdHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBsZW4sIHVuc2lnbmVkIGxvbmcgaGFuZGxlKVxuK3tcbitcdHUzMiBiZHMsIHRvdGFsX2JkcywgYmRfc3BhY2UsIGZyZWVfc2l6ZTtcbitcdHN0cnVjdCBibnh0X3N3X21wY190eF9iZCAqdHhfYnVmO1xuK1x0c3RydWN0IHR4X2JkICp0eGJkO1xuK1x0dTE2IHByb2Q7XG4rXG4rXHRpZiAoUkVBRF9PTkNFKHR4ci1cdTAwM2VkZXZfc3RhdGUpID09IEJOWFRfREVWX1NUQVRFX0NMT1NJTkcpXG4rXHRcdHJldHVybiAtRU5PREVWO1xuK1xuK1x0YmRzID0gRElWX1JPVU5EX1VQKGxlbiwgc2l6ZW9mKCp0eGJkKSk7XG4rXHR0b3RhbF9iZHMgPSBiZHMgKyAxO1xuK1x0ZnJlZV9zaXplID0gYm54dF90eF9hdmFpbChicCwgdHhyKTtcbitcdGlmIChmcmVlX3NpemUgXHUwMDNjIHRvdGFsX2JkcylcbitcdFx0cmV0dXJuIC1FQlVTWTtcbitcbitcdHByb2QgPSB0eHItXHUwMDNldHhfcHJvZDtcbitcdHR4YmQgPSBcdTAwMjZ0eHItXHUwMDNldHhfZGVzY19yaW5nW1RYX1JJTkcoYnAsIHByb2QpXVtUWF9JRFgocHJvZCldO1xuK1x0dHhfYnVmID0gXHUwMDI2dHhyLVx1MDAzZXR4X21wY19idWZfcmluZ1tSSU5HX1RYKGJwLCBwcm9kKV07XG4rXHR0eF9idWYtXHUwMDNlaGFuZGxlID0gaGFuZGxlO1xuK1x0dHhfYnVmLVx1MDAzZWlubGluZV9iZHMgPSB0b3RhbF9iZHM7XG4rXG4rXHR0eGJkLVx1MDAzZXR4X2JkX2xlbl9mbGFnc190eXBlID1cbitcdFx0Y3B1X3RvX2xlMzIoKGxlbiBcdTAwM2NcdTAwM2MgVFhfQkRfTEVOX1NISUZUKSB8IFRYX0JEX1RZUEVfTVBDX1RYX0JEIHxcbitcdFx0XHQgICAgVFhfQkRfQ05UKHRvdGFsX2JkcykpO1xuK1x0dHhiZC1cdTAwM2V0eF9iZF9vcGFxdWUgPSBTRVRfVFhfT1BBUVVFKGJwLCB0eHIsIHByb2QsIHRvdGFsX2Jkcyk7XG4rXG4rXHRwcm9kID0gTkVYVF9UWChwcm9kKTtcbitcdHR4YmQgPSBcdTAwMjZ0eHItXHUwMDNldHhfZGVzY19yaW5nW1RYX1JJTkcoYnAsIHByb2QpXVtUWF9JRFgocHJvZCldO1xuK1x0YmRfc3BhY2UgPSBUWF9ERVNDX0NOVCAtIFRYX0lEWChwcm9kKTtcbitcdGlmIChiZF9zcGFjZSBcdTAwM2MgYmRzKSB7XG4rXHRcdHVuc2lnbmVkIGludCBsZW4wID0gYmRfc3BhY2UgKiBzaXplb2YoKnR4YmQpO1xuK1xuK1x0XHRtZW1jcHkodHhiZCwgZGF0YSwgbGVuMCk7XG4rXHRcdHByb2QgKz0gYmRfc3BhY2U7XG4rXHRcdHR4YmQgPSBcdTAwMjZ0eHItXHUwMDNldHhfZGVzY19yaW5nW1RYX1JJTkcoYnAsIHByb2QpXVtUWF9JRFgocHJvZCldO1xuK1x0XHRiZHMgLT0gYmRfc3BhY2U7XG4rXHRcdGxlbiAtPSBsZW4wO1xuK1x0XHRkYXRhICs9IGxlbjA7XG4rXHR9XG4rXHRtZW1jcHkodHhiZCwgZGF0YSwgbGVuKTtcbitcdHByb2QgKz0gYmRzO1xuK1x0V1JJVEVfT05DRSh0eHItXHUwMDNldHhfcHJvZCwgcHJvZCk7XG4rXG4rXHQvKiBTeW5jIEJEIGRhdGEgYmVmb3JlIHVwZGF0aW5nIGRvb3JiZWxsICovXG4rXHR3bWIoKTtcbitcdGJueHRfZGJfd3JpdGUoYnAsIFx1MDAyNnR4ci1cdTAwM2V0eF9kYiwgcHJvZCk7XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rLyogUmV0dXJucyB0cnVlIGlmIHRoZSByaW5nIGlzIHN1Y2Nlc3NmdWxseSBtYXJrZWQgYXMgY2xvc2luZy4gIEl0XG4rICogbWVhbnMgdGhhdCB0aGVyZSB3aWxsIGJlIG5vIG1vcmUgTVBDIHRyYW5zbWlzc2lvbnMgYW5kIE5BUEkgd2lsbCBub3dcbisgKiBjb21wbGV0ZSBhbnkgTVBDIGNvbXBsZXRpb25zIG9uIHRoZSBjb21wbGV0aW9uIHJpbmcgd2l0aCBOVUxMIGhhbmRsZXNcbisgKiB0byBzaWduYWwgYWJvcnQuXG4rICovXG4rc3RhdGljIGJvb2wgYm54dF9kaXNhYmxlX21wY19yaW5nKHN0cnVjdCBibnh0X21wY19pbmZvICptcGMsIGludCBtcGNfcmluZylcbit7XG4rXHRzdHJ1Y3QgYm54dF90eF9yaW5nX2luZm8gKnR4cjtcbitcdGJvb2wgZGlzYWJsZWQgPSBmYWxzZTtcbitcdGludCBpO1xuK1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgQk5YVF9NUENfVFlQRV9NQVg7IGkrKykge1xuK1x0XHRpZiAobXBjX3JpbmcgXHUwMDNlPSBtcGMtXHUwMDNlbXBjX3JpbmdfY291bnRbaV0pXG4rXHRcdFx0Y29udGludWU7XG4rXHRcdHR4ciA9IFx1MDAyNm1wYy1cdTAwM2VtcGNfcmluZ3NbaV1bbXBjX3JpbmddO1xuK1x0XHRzcGluX2xvY2tfYmgoXHUwMDI2dHhyLVx1MDAzZXR4X2xvY2spO1xuK1x0XHRpZiAoIVJFQURfT05DRSh0eHItXHUwMDNlZGV2X3N0YXRlKSkge1xuK1x0XHRcdGRpc2FibGVkID0gdHJ1ZTtcbitcdFx0XHRXUklURV9PTkNFKHR4ci1cdTAwM2VkZXZfc3RhdGUsIEJOWFRfREVWX1NUQVRFX0NMT1NJTkcpO1xuK1x0XHR9XG4rXHRcdHNwaW5fdW5sb2NrX2JoKFx1MDAyNnR4ci1cdTAwM2V0eF9sb2NrKTtcbitcdFx0aWYgKCFkaXNhYmxlZClcbitcdFx0XHRicmVhaztcbitcdH1cbitcdC8qIE1ha2Ugc3VyZSBuYXBpIHBvbGxzIHNlZSBAZGV2X3N0YXRlIGNoYW5nZSAqL1xuK1x0aWYgKGRpc2FibGVkKVxuK1x0XHRzeW5jaHJvbml6ZV9uZXQoKTtcbitcdHJldHVybiBkaXNhYmxlZDtcbit9XG4rXG4rc3RhdGljIHZvaWQgYm54dF9lbmFibGVfbXBjX3Jpbmcoc3RydWN0IGJueHRfbXBjX2luZm8gKm1wYywgaW50IG1wY19yaW5nKVxuK3tcbitcdHN0cnVjdCBibnh0X3R4X3JpbmdfaW5mbyAqdHhyO1xuK1x0aW50IGk7XG4rXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBCTlhUX01QQ19UWVBFX01BWDsgaSsrKSB7XG4rXHRcdGlmIChtcGNfcmluZyBcdTAwM2U9IG1wYy1cdTAwM2VtcGNfcmluZ19jb3VudFtpXSlcbitcdFx0XHRjb250aW51ZTtcbitcdFx0dHhyID0gXHUwMDI2bXBjLVx1MDAzZW1wY19yaW5nc1tpXVttcGNfcmluZ107XG4rXHRcdFdSSVRFX09OQ0UodHhyLVx1MDAzZWRldl9zdGF0ZSwgMCk7XG4rXHR9XG4rfVxuK1xuK3N0YXRpYyB2b2lkIGJueHRfY2xlYXJfb25lX21wY19lbnRyaWVzKHN0cnVjdCBibnh0ICpicCxcbitcdFx0XHRcdCAgICAgICBzdHJ1Y3QgYm54dF90eF9yaW5nX2luZm8gKnR4cilcbit7XG4rXHRzdHJ1Y3QgYm54dF9zd19tcGNfdHhfYmQgKnR4X2J1ZjtcbitcdHVuc2lnbmVkIGxvbmcgaGFuZGxlO1xuK1x0aW50IGksIG1heF9pZHg7XG4rXHR1MzIgY2xpZW50O1xuK1xuK1x0bWF4X2lkeCA9IGJwLVx1MDAzZXR4X25yX3BhZ2VzICogVFhfREVTQ19DTlQ7XG4rXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBtYXhfaWR4OyBpKyspIHtcbitcdFx0dHhfYnVmID0gXHUwMDI2dHhyLVx1MDAzZXR4X21wY19idWZfcmluZ1tpXTtcbitcdFx0aGFuZGxlID0gdHhfYnVmLVx1MDAzZWhhbmRsZTtcbitcdFx0aWYgKGhhbmRsZSkge1xuK1x0XHRcdGNsaWVudCA9IHR4ci1cdTAwM2V0eF9yaW5nX3N0cnVjdC5tcGNfY2hubF90eXBlO1xuK1x0XHRcdGJueHRfY3J5cHRvX21wY19jbXAoYnAsIGNsaWVudCwgaGFuZGxlLCBOVUxMLCAwKTtcbitcdFx0XHR0eF9idWYtXHUwMDNlaGFuZGxlID0gMDtcbitcdFx0fVxuK1x0fVxuK31cbitcbitzdGF0aWMgdm9pZCBibnh0X21wY19yaW5nX3N0b3Aoc3RydWN0IGJueHQgKmJwLCBzdHJ1Y3QgYm54dF9tcGNfaW5mbyAqbXBjLFxuK1x0XHRcdCAgICAgICBpbnQgbXBjX3JpbmcpXG4re1xuK1x0c3RydWN0IGJueHRfdHhfcmluZ19pbmZvICp0eHI7XG4rXHRzdHJ1Y3QgYm54dF9jcF9yaW5nX2luZm8gKmNwcjtcbitcdGludCBpO1xuK1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgQk5YVF9NUENfVFlQRV9NQVg7IGkrKykge1xuK1x0XHRpZiAobXBjLVx1MDAzZW1wY19yaW5nX2NvdW50W2ldIFx1MDAzZSBtcGNfcmluZykge1xuK1x0XHRcdHR4ciA9IFx1MDAyNm1wYy1cdTAwM2VtcGNfcmluZ3NbaV1bbXBjX3JpbmddO1xuK1x0XHRcdGJueHRfaHdybV90eF9yaW5nX2ZyZWUoYnAsIHR4ciwgdHJ1ZSk7XG4rXHRcdH1cbitcdH1cbitcdC8qIENQIHJpbmcgbXVzdCBiZSBmcmVlZCBhdCB0aGUgZW5kIHRvIGd1YXJhbnRlZSB0aGF0IHRoZSBIV1JNX0RPTkVcbitcdCAqIHJlc3BvbnNlcyBmb3IgSFdSTV9SSU5HX0ZSRUUgY2FuIHN0aWxsIGJlIHNlZW4gb24gdGhlIENQIHJpbmcuXG4rXHQgKi9cbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIEJOWFRfTVBDX1RZUEVfTUFYOyBpKyspIHtcbitcdFx0aWYgKG1wYy1cdTAwM2VtcGNfcmluZ19jb3VudFtpXSBcdTAwM2UgbXBjX3JpbmcpIHtcbitcdFx0XHR0eHIgPSBcdTAwMjZtcGMtXHUwMDNlbXBjX3JpbmdzW2ldW21wY19yaW5nXTtcbitcdFx0XHRjcHIgPSB0eHItXHUwMDNldHhfY3ByO1xuK1x0XHRcdGlmIChjcHIpXG4rXHRcdFx0XHRibnh0X2h3cm1fY3BfcmluZ19mcmVlKGJwLCBjcHIpO1xuK1x0XHR9XG4rXHR9XG4rXHQvKiBObyBuZXcgRE1BIHRvIHRoZSBDUCByaW5nIGF0IHRoaXMgcG9pbnQsIGJ1dCB3ZSBuZWVkIHRvIHdhaXRcbitcdCAqIGZvciBhbnkgaW4tZmxpZ2h0IE5BUEkgcG9sbCB0byBmaW5pc2ggYmVmb3JlIHdlIHplcm8gdGhlXG4rXHQgKiBjb21wbGV0aW9uIGVudHJpZXMgaW4gdGhlIENQIHJpbmcuXG4rXHQgKi9cbitcdHN5bmNocm9uaXplX25ldCgpO1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgQk5YVF9NUENfVFlQRV9NQVg7IGkrKykge1xuK1x0XHRpZiAobXBjLVx1MDAzZW1wY19yaW5nX2NvdW50W2ldIFx1MDAzZSBtcGNfcmluZykge1xuK1x0XHRcdHR4ciA9IFx1MDAyNm1wYy1cdTAwM2VtcGNfcmluZ3NbaV1bbXBjX3JpbmddO1xuK1x0XHRcdGNwciA9IHR4ci1cdTAwM2V0eF9jcHI7XG4rXHRcdFx0aWYgKGNwcilcbitcdFx0XHRcdGJueHRfY2xlYXJfb25lX2NwX3JpbmcoYnAsIGNwcik7XG4rXHRcdFx0Ym54dF9jbGVhcl9vbmVfbXBjX2VudHJpZXMoYnAsIHR4cik7XG4rXHRcdH1cbitcdH1cbit9XG4rXG4rc3RhdGljIGludCBibnh0X21wY19yaW5nX3N0YXJ0KHN0cnVjdCBibnh0ICpicCwgc3RydWN0IGJueHRfbXBjX2luZm8gKm1wYyxcbitcdFx0XHQgICAgICAgaW50IG1wY19yaW5nKVxuK3tcbitcdHN0cnVjdCBibnh0X3R4X3JpbmdfaW5mbyAqdHhyO1xuK1x0aW50IGksIHJjO1xuK1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgQk5YVF9NUENfVFlQRV9NQVg7IGkrKykge1xuK1x0XHRpZiAobXBjLVx1MDAzZW1wY19yaW5nX2NvdW50W2ldIFx1MDAzZSBtcGNfcmluZykge1xuK1x0XHRcdHR4ciA9IFx1MDAyNm1wYy1cdTAwM2VtcGNfcmluZ3NbaV1bbXBjX3JpbmddO1xuK1x0XHRcdHR4ci1cdTAwM2V0eF9wcm9kID0gMDtcbitcdFx0XHR0eHItXHUwMDNldHhfY29ucyA9IDA7XG4rXHRcdFx0dHhyLVx1MDAzZXR4X2h3X2NvbnMgPSAwO1xuK1x0XHRcdHJjID0gYm54dF9od3JtX29uZV9tcGNfcmluZ19hbGxvYyhicCwgdHhyKTtcbitcdFx0XHRpZiAocmMpXG4rXHRcdFx0XHRyZXR1cm4gcmM7XG4rXHRcdH1cbitcdH1cbitcdHJldHVybiAwO1xuK31cbitcbisvKiBDYWxsZWQgZnJvbSBibnh0X3NwX3Rhc2soKSB3aXRoIG5ldGRldl9sb2NrIGhlbGQuICBJZiB0aGUgZGV2aWNlIGlzIG5vdFxuKyAqIG9wZW4gdGhlcmUgaXMgbm90aGluZyB0byBkbzogdGhlIG9wZW4gcGF0aCB3aWxsIHJlLWFsbG9jYXRlIGFuZFxuKyAqIHJlLWluaXRpYWxpemUgYWxsIE1QQyByaW5ncy5cbisgKi9cbit2b2lkIGJueHRfbXBjX3JpbmdfcmVzZXRfdGFzayhzdHJ1Y3QgYm54dCAqYnApXG4re1xuK1x0c3RydWN0IGJueHRfbXBjX2luZm8gKm1wYyA9IGJwLVx1MDAzZW1wY19pbmZvO1xuK1x0c3RydWN0IGJueHRfdHhfcmluZ19pbmZvICp0eHI7XG4rXHRpbnQgaSwgajtcbitcbitcdGlmICghbXBjIHx8ICF0ZXN0X2JpdChCTlhUX1NUQVRFX09QRU4sIFx1MDAyNmJwLVx1MDAzZXN0YXRlKSlcbitcdFx0cmV0dXJuO1xuK1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgQk5YVF9NUENfVFlQRV9NQVg7IGkrKykge1xuK1x0XHRmb3IgKGogPSAwOyBqIFx1MDAzYyBtcGMtXHUwMDNlbXBjX3JpbmdfY291bnRbaV07IGorKykge1xuK1x0XHRcdHR4ciA9IFx1MDAyNm1wYy1cdTAwM2VtcGNfcmluZ3NbaV1bal07XG4rXHRcdFx0aWYgKFJFQURfT05DRSh0eHItXHUwMDNlZGV2X3N0YXRlKSAhPSBCTlhUX0RFVl9TVEFURV9DTE9TSU5HKVxuK1x0XHRcdFx0Y29udGludWU7XG4rXG4rXHRcdFx0LyogUmVzZXRzIHRoZSB3aG9sZSByaW5nIChib3RoIHR5cGVzKSAqL1xuK1x0XHRcdG5ldGRldl93YXJuKGJwLVx1MDAzZWRldiwgXCJSZXNldHRpbmcgTVBDIHJpbmcgJWRcXG5cIiwgaik7XG4rXHRcdFx0Ym54dF9tcGNfcmluZ19zdG9wKGJwLCBtcGMsIGopO1xuK1x0XHRcdGlmIChibnh0X21wY19yaW5nX3N0YXJ0KGJwLCBtcGMsIGopKSB7XG4rXHRcdFx0XHRuZXRkZXZfZXJyKGJwLVx1MDAzZWRldiwgXCJFcnJvciBzdGFydGluZyBNUEMgcmluZyAlZCwgcmVzZXR0aW5nIGRldmljZVxcblwiLFxuK1x0XHRcdFx0XHQgICBqKTtcbitcdFx0XHRcdGJueHRfbXBjX3Jpbmdfc3RvcChicCwgbXBjLCBqKTtcbitcdFx0XHRcdGJueHRfcmVzZXRfdGFzayhicCwgdHJ1ZSk7XG4rXHRcdFx0XHQvKiBibnh0X3Jlc2V0X3Rhc2soKSB3aWxsIGNsZWFyIGV2ZXJ5dGhpbmcgKi9cbitcdFx0XHRcdHJldHVybjtcbitcdFx0XHR9XG4rXHRcdFx0Ym54dF9lbmFibGVfbXBjX3JpbmcobXBjLCBqKTtcbitcdFx0fVxuK1x0fVxuK31cbitcbitzdGF0aWMgaW50IGJueHRfbXBjX3JpbmdfcmVzZXQoc3RydWN0IGJueHQgKmJwLCBpbnQgbXBjX3JpbmcpXG4re1xuK1x0c3RydWN0IGJueHRfbXBjX2luZm8gKm1wYyA9IGJwLVx1MDAzZW1wY19pbmZvO1xuK1x0c3RydWN0IGJueHRfdHhfcmluZ19pbmZvICp0eHI7XG4rXHRpbnQgaTtcbitcbitcdGlmICghbXBjKVxuK1x0XHRyZXR1cm4gMDtcbitcdGlmIChtcGNfcmluZyBcdTAwM2U9IG1wYy1cdTAwM2VtcGNfY3BfcmluZ3MpXG4rXHRcdHJldHVybiAtRUlOVkFMO1xuK1xuK1x0aWYgKCFibnh0X2Rpc2FibGVfbXBjX3JpbmcobXBjLCBtcGNfcmluZykpXG4rXHRcdHJldHVybiAwO1xuK1xuK1x0LyogQ29tcGxldGlvbiBoYW5kbGVzIHdpbGwgbm8gbG9uZ2VyIGJlIHByb2Nlc3NlZCBhdCB0aGlzIHBvaW50XG4rXHQgKiBmcm9tIE5BUEksIHNvIHdlIGNhbiBjb21wbGV0ZSB0aGUgb3V0c3RhbmRpbmcgY29tbWFuZHMgYW5kXG4rXHQgKiByZWxlYXNlIHRoZSBjb21tYW5kIGNvbnRleHRzLlxuK1x0ICovXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBCTlhUX01QQ19UWVBFX01BWDsgaSsrKSB7XG4rXHRcdGlmIChtcGMtXHUwMDNlbXBjX3JpbmdfY291bnRbaV0gXHUwMDNlIG1wY19yaW5nKSB7XG4rXHRcdFx0dHhyID0gXHUwMDI2bXBjLVx1MDAzZW1wY19yaW5nc1tpXVttcGNfcmluZ107XG4rXHRcdFx0Ym54dF9jbGVhcl9vbmVfbXBjX2VudHJpZXMoYnAsIHR4cik7XG4rXHRcdH1cbitcdH1cbitcbitcdC8qIElmIHRoZSBkZXZpY2UgaXMgZ29pbmcgZG93biwgdGhlIHJlb3BlbiB3aWxsIHJlLWFsbG9jYXRlIGFuZFxuK1x0ICogcmUtaW5pdGlhbGl6ZSBhbGwgTVBDIHJpbmdzLiAgT3RoZXJ3aXNlIGRlZmVyIHRoZSByZXNldCB0b1xuK1x0ICogYm54dF9zcF90YXNrKCkgdG8gc2FmZWx5IGhvbGQgdGhlIG5ldGRldl9sb2NrLlxuK1x0ICovXG4rXHRpZiAodGVzdF9iaXQoQk5YVF9TVEFURV9PUEVOLCBcdTAwMjZicC1cdTAwM2VzdGF0ZSkpXG4rXHRcdGJueHRfcXVldWVfc3Bfd29yayhicCwgQk5YVF9NUENfUkVTRVRfU1BfRVZFTlQpO1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK2ludCBibnh0X21wY190aW1lb3V0KHN0cnVjdCBibnh0ICpicCwgc3RydWN0IGJueHRfdHhfcmluZ19pbmZvICp0eHIpXG4re1xuK1x0aWYgKHR4ci1cdTAwM2V0eF9yaW5nX3N0cnVjdC5xdWV1ZV9pZCA9PSBCTlhUX01QQ19RVUVVRV9JRClcbitcdFx0cmV0dXJuIGJueHRfbXBjX3JpbmdfcmVzZXQoYnAsIHR4ci1cdTAwM2V0eHFfaW5kZXgpO1xuK1x0cmV0dXJuIC1FSU5WQUw7XG4rfVxuK1xuK3N0YXRpYyBib29sIGJueHRfbXBjX3Vuc29saWNpdChzdHJ1Y3QgbXBjX2NtcCAqbXBjbXApXG4re1xuK1x0dTMyIGNsaWVudCA9IE1QQ19DTVBfQ0xJRU5UX1RZUEUobXBjbXApO1xuK1xuK1x0aWYgKGNsaWVudCAhPSBNUENfQ01QX0NMSUVOVF9UQ0UgXHUwMDI2XHUwMDI2IGNsaWVudCAhPSBNUENfQ01QX0NMSUVOVF9SQ0UpXG4rXHRcdHJldHVybiBmYWxzZTtcbitcdHJldHVybiBNUENfQ01QX1VOU09MSUNJVF9TVUJUWVBFKG1wY21wKTtcbit9XG4rXG4raW50IGJueHRfbXBjX2NtcChzdHJ1Y3QgYm54dCAqYnAsIHN0cnVjdCBibnh0X2NwX3JpbmdfaW5mbyAqY3ByLCB1MzIgKnJhd19jb25zKVxuK3tcbitcdHN0cnVjdCBibnh0X2NtcGxfZW50cnkgY21wbF9lbnRyeV9hcnJbMl07XG4rXHRzdHJ1Y3QgYm54dF9uYXBpICpibmFwaSA9IGNwci1cdTAwM2VibmFwaTtcbitcdHUxNiBjb25zID0gUklOR19DTVAoKnJhd19jb25zKTtcbitcdHN0cnVjdCBtcGNfY21wICptcGNtcCwgKm1wY21wMTtcbitcdHUzMiB0bXBfcmF3X2NvbnMgPSAqcmF3X2NvbnM7XG4rXHR1bnNpZ25lZCBsb25nIGhhbmRsZSA9IDA7XG4rXHR1MzIgY2xpZW50LCBjbXBsX251bTtcbitcdHU4IHR5cGU7XG4rXG4rXHRtcGNtcCA9IChzdHJ1Y3QgbXBjX2NtcCAqKVxuK1x0XHRcdTAwMjZjcHItXHUwMDNlY3BfZGVzY19yaW5nW0NQX1JJTkcoY29ucyldW0NQX0lEWChjb25zKV07XG4rXHR0eXBlID0gTVBDX0NNUF9DTVBfVFlQRShtcGNtcCk7XG4rXHRjbXBsX2VudHJ5X2FyclswXS5jbXBsID0gbXBjbXA7XG4rXHRjbXBsX2VudHJ5X2FyclswXS5sZW4gPSBzaXplb2YoKm1wY21wKTtcbitcdGNtcGxfbnVtID0gMTtcbitcdGlmICh0eXBlID09IE1QQ19DTVBfVFlQRV9NSURfUEFUSF9MT05HKSB7XG4rXHRcdHRtcF9yYXdfY29ucyA9IE5FWFRfUkFXX0NNUCh0bXBfcmF3X2NvbnMpO1xuK1x0XHRjb25zID0gUklOR19DTVAodG1wX3Jhd19jb25zKTtcbitcdFx0bXBjbXAxID0gKHN0cnVjdCBtcGNfY21wICopXG4rXHRcdFx0IFx1MDAyNmNwci1cdTAwM2VjcF9kZXNjX3JpbmdbQ1BfUklORyhjb25zKV1bQ1BfSURYKGNvbnMpXTtcbitcbitcdFx0aWYgKCFNUENfQ01QX1ZBTElEKGJwLCBtcGNtcDEsIHRtcF9yYXdfY29ucykpXG4rXHRcdFx0cmV0dXJuIC1FQlVTWTtcbitcdFx0LyogVGhlIHZhbGlkIHRlc3Qgb2YgdGhlIGVudHJ5IG11c3QgYmUgZG9uZSBmaXJzdCBiZWZvcmVcbitcdFx0ICogcmVhZGluZyBhbnkgZnVydGhlci5cbitcdFx0ICovXG4rXHRcdGRtYV9ybWIoKTtcbitcdFx0aWYgKG1wY21wMSA9PSBtcGNtcCArIDEpIHtcbitcdFx0XHRjbXBsX2VudHJ5X2FycltjbXBsX251bSAtIDFdLmxlbiArPSBzaXplb2YoKm1wY21wMSk7XG4rXHRcdH0gZWxzZSB7XG4rXHRcdFx0Y21wbF9lbnRyeV9hcnJbY21wbF9udW1dLmNtcGwgPSBtcGNtcDE7XG4rXHRcdFx0Y21wbF9lbnRyeV9hcnJbY21wbF9udW1dLmxlbiA9IHNpemVvZigqbXBjbXAxKTtcbitcdFx0XHRjbXBsX251bSsrO1xuK1x0XHR9XG4rXHR9XG4rXHRjbGllbnQgPSBNUENfQ01QX0NMSUVOVF9UWVBFKG1wY21wKSBcdTAwM2VcdTAwM2UgTVBDX0NNUF9DTElFTlRfU0ZUO1xuK1x0aWYgKGNsaWVudCBcdTAwM2U9IEJOWFRfTVBDX1RZUEVfTUFYKVxuK1x0XHRnb3RvIGNtcF9kb25lO1xuK1xuK1x0aWYgKCFibnh0X21wY191bnNvbGljaXQobXBjbXApKSB7XG4rXHRcdHN0cnVjdCBibnh0X3N3X21wY190eF9iZCAqbXBjX2J1ZjtcbitcdFx0c3RydWN0IGJueHRfdHhfcmluZ19pbmZvICp0eHI7XG4rXHRcdHUxNiB0eF9jb25zO1xuK1x0XHR1MzIgb3BhcXVlO1xuK1xuK1x0XHRvcGFxdWUgPSBtcGNtcC1cdTAwM2VtcGNfY21wX29wYXF1ZTtcbitcdFx0dHhyID0gYm5hcGktXHUwMDNldHhfbXBjX3JpbmdbY2xpZW50XTtcbitcdFx0dHhfY29ucyA9IHR4ci1cdTAwM2V0eF9jb25zO1xuK1x0XHRpZiAoVFhfT1BBUVVFX1JJTkcob3BhcXVlKSAhPSB0eHItXHUwMDNldHhfbmFwaV9pZHgpIHtcbitcdFx0XHRuZXRkZXZfd2FybihicC1cdTAwM2VkZXYsIFwiV3Jvbmcgb3BhcXVlICV4LCBleHBlY3RlZCByaW5nICV4LCBjb25zIGlkeCAleFxcblwiLFxuK1x0XHRcdFx0ICAgIG9wYXF1ZSwgdHhyLVx1MDAzZXR4X25hcGlfaWR4LCB0eHItXHUwMDNldHhfY29ucyk7XG4rXHRcdFx0Z290byBjbXBfZG9uZTtcbitcdFx0fVxuK1x0XHRtcGNfYnVmID0gXHUwMDI2dHhyLVx1MDAzZXR4X21wY19idWZfcmluZ1tSSU5HX1RYKGJwLCB0eF9jb25zKV07XG4rXHRcdGlmICghUkVBRF9PTkNFKHR4ci1cdTAwM2VkZXZfc3RhdGUpKSB7XG4rXHRcdFx0aGFuZGxlID0gbXBjX2J1Zi1cdTAwM2VoYW5kbGU7XG4rXHRcdFx0bXBjX2J1Zi1cdTAwM2VoYW5kbGUgPSAwO1xuK1x0XHR9XG4rXHRcdHR4X2NvbnMgKz0gbXBjX2J1Zi1cdTAwM2VpbmxpbmVfYmRzO1xuK1x0XHRXUklURV9PTkNFKHR4ci1cdTAwM2V0eF9jb25zLCB0eF9jb25zKTtcbitcdFx0dHhyLVx1MDAzZXR4X2h3X2NvbnMgPSBSSU5HX1RYKGJwLCB0eF9jb25zKTtcbitcdH1cbitcdGJueHRfY3J5cHRvX21wY19jbXAoYnAsIGNsaWVudCwgaGFuZGxlLCBjbXBsX2VudHJ5X2FyciwgY21wbF9udW0pO1xuK1xuK2NtcF9kb25lOlxuK1x0KnJhd19jb25zID0gdG1wX3Jhd19jb25zO1xuK1x0cmV0dXJuIDA7XG4rfVxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dF9tcGMuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dF9tcGMuaFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAwLi5iMGIxZTc4M2NkYzc3ZlxuLS0tIC9kZXYvbnVsbFxuKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9ibnh0X21wYy5oXG5AQCAtMCwwICsxLDIyNyBAQFxuKy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHkgKi9cbisvKiBDb3B5cmlnaHQgKGMpIDIwMjYgQnJvYWRjb20gSW5jLiAqL1xuK1xuKyNpZm5kZWYgQk5YVF9NUENfSFxuKyNkZWZpbmUgQk5YVF9NUENfSFxuK1xuKy8qIE1pZCBwYXRoIGNoYW5uZWwgKE1QQykgZGVmaW5pdGlvbnMuICBBbiBNUEMgaXMgc3BlY2lhbCBUWC9jb21wbGV0aW9uXG4rICogcmluZyBwYWlyIHRvIHNlbmQvcmVjZWl2ZSBjb250cm9sIHBsYW5lIGRhdGEgdG8gdGhlIFRDRSBhbmQgUkNFXG4rICogKFRyYW5zbWl0L1JlY2VpdmUgQ3J5cHRvIEVuZ2luZSkgSFcgYmxvY2tzLlxuKyAqL1xuK1xuK2VudW0gYm54dF9tcGNfdHlwZSB7XG4rXHRCTlhUX01QQ19UQ0VfVFlQRSA9IFJJTkdfQUxMT0NfUkVRX01QQ19DSE5MU19UWVBFX1RDRSxcbitcdEJOWFRfTVBDX1JDRV9UWVBFID0gUklOR19BTExPQ19SRVFfTVBDX0NITkxTX1RZUEVfUkNFLFxuK1x0Qk5YVF9NUENfVFlQRV9NQVgsXG4rfTtcbitcbisjZGVmaW5lIEJOWFRfTUFYX01QQ1x0XHQ4XG4rXG4rI2RlZmluZSBCTlhUX01JTl9NUENfVENFXHQxXG4rI2RlZmluZSBCTlhUX01JTl9NUENfUkNFXHQxXG4rI2RlZmluZSBCTlhUX0RGTFRfTVBDX1RDRVx0Qk5YVF9NQVhfTVBDXG4rI2RlZmluZSBCTlhUX0RGTFRfTVBDX1JDRVx0Qk5YVF9NQVhfTVBDXG4rXG4rI2RlZmluZSBCTlhUX01QQ19UTU9fTVNFQ1MgICAgICAxMDAwXG4rXG4rc3RydWN0IGJueHRfbXBjX2luZm8ge1xuK1x0dThcdFx0XHRtcGNfY2hubHNfY2FwO1xuK1x0dThcdFx0XHRtcGNfY3BfcmluZ3M7XG4rXHR1OFx0XHRcdG1wY19yaW5nX2NvdW50W0JOWFRfTVBDX1RZUEVfTUFYXTtcbitcdHN0cnVjdCBibnh0X3R4X3JpbmdfaW5mbyAqbXBjX3JpbmdzW0JOWFRfTVBDX1RZUEVfTUFYXTtcbit9O1xuK1xuK3N0cnVjdCBibnh0X3N3X21wY190eF9iZCB7XG4rXHR1OCBpbmxpbmVfYmRzO1xuK1x0dW5zaWduZWQgbG9uZyBoYW5kbGU7XG4rfTtcbitcbisjZGVmaW5lIFNXX01QQ19UWEJEX1JJTkdfU0laRSAoc2l6ZW9mKHN0cnVjdCBibnh0X3N3X21wY190eF9iZCkgKiBUWF9ERVNDX0NOVClcbitcbitzdHJ1Y3QgYm54dF9jbXBsX2VudHJ5IHtcbitcdHZvaWQgKmNtcGw7XG4rXHR1MzIgbGVuO1xuK307XG4rXG4rc3RydWN0IG1wY19jbXAge1xuK1x0X19sZTMyIG1wY19jbXBfY2xpZW50X3N1YnR5cGVfdHlwZTtcbitcdCNkZWZpbmUgTVBDX0NNUF9UWVBFXHRcdFx0XHRcdCgweDNmIFx1MDAzY1x1MDAzYyAwKVxuK1x0ICNkZWZpbmUgTVBDX0NNUF9UWVBFX01JRF9QQVRIX1NIT1JUXHRcdFx0IDB4MWVcbitcdCAjZGVmaW5lIE1QQ19DTVBfVFlQRV9NSURfUEFUSF9MT05HXHRcdFx0IDB4MWZcbitcdCNkZWZpbmUgTVBDX0NNUF9TVUJUWVBFXHRcdFx0XHRcdDB4ZjAwXG4rXHQjZGVmaW5lIE1QQ19DTVBfU1VCVFlQRV9TRlRcdFx0XHRcdCA4XG4rXHQgI2RlZmluZSBNUENfQ01QX1NVQlRZUEVfU09MSUNJVEVEXHRcdFx0ICgweDAgXHUwMDNjXHUwMDNjIDgpXG4rXHQgI2RlZmluZSBNUENfQ01QX1NVQlRZUEVfRVJSXHRcdFx0XHQgKDB4MSBcdTAwM2NcdTAwM2MgOClcbitcdCAjZGVmaW5lIE1QQ19DTVBfU1VCVFlQRV9SRVNZTkNcdFx0XHRcdCAoMHgyIFx1MDAzY1x1MDAzYyA4KVxuK1x0I2RlZmluZSBNUENfQ01QX0NMSUVOVFx0XHRcdFx0XHQoMHhmIFx1MDAzY1x1MDAzYyAxMilcbitcdCAjZGVmaW5lIE1QQ19DTVBfQ0xJRU5UX1NGVFx0XHRcdFx0IDEyXG4rXHQgI2RlZmluZSBNUENfQ01QX0NMSUVOVF9UQ0VcdFx0XHRcdCAoMHgwIFx1MDAzY1x1MDAzYyAxMilcbitcdCAjZGVmaW5lIE1QQ19DTVBfQ0xJRU5UX1JDRVx0XHRcdFx0ICgweDEgXHUwMDNjXHUwMDNjIDEyKVxuK1x0ICNkZWZpbmUgTVBDX0NNUF9DTElFTlRfVEVfQ0ZBXHRcdFx0XHQgKDB4MiBcdTAwM2NcdTAwM2MgMTIpXG4rXHQgI2RlZmluZSBNUENfQ01QX0NMSUVOVF9SRV9DRkFcdFx0XHRcdCAoMHgzIFx1MDAzY1x1MDAzYyAxMilcbitcdHUzMiBtcGNfY21wX29wYXF1ZTtcbitcdF9fbGUzMiBtcGNfY21wX3Y7XG4rXHQjZGVmaW5lIE1QQ19DTVBfVlx0XHRcdFx0XHQoMSBcdTAwM2NcdTAwM2MgMClcbitcdF9fbGUzMiBtcGNfY21wX2ZpbGxlcjtcbit9O1xuK1xuKyNkZWZpbmUgTVBDX0NNUF9DTVBfVFlQRShtcGNtcClcdFx0XHRcdFx0XHRcXFxuK1x0KGxlMzJfdG9fY3B1KChtcGNtcCktXHUwMDNlbXBjX2NtcF9jbGllbnRfc3VidHlwZV90eXBlKSBcdTAwMjYgTVBDX0NNUF9UWVBFKVxuK1xuKyNkZWZpbmUgTVBDX0NNUF9DTElFTlRfVFlQRShtcGNtcClcdFx0XHRcdFx0XFxcbitcdChsZTMyX3RvX2NwdSgobXBjbXApLVx1MDAzZW1wY19jbXBfY2xpZW50X3N1YnR5cGVfdHlwZSkgXHUwMDI2IE1QQ19DTVBfQ0xJRU5UKVxuK1xuKyNkZWZpbmUgTVBDX0NNUF9VTlNPTElDSVRfU1VCVFlQRShtcGNtcClcdFx0XHRcdFxcXG4rXHQoKGxlMzJfdG9fY3B1KChtcGNtcCktXHUwMDNlbXBjX2NtcF9jbGllbnRfc3VidHlwZV90eXBlKSBcdTAwMjZcdFx0XFxcbitcdCBNUENfQ01QX1NVQlRZUEUpICE9IE1QQ19DTVBfU1VCVFlQRV9TT0xJQ0lURUQpXG4rXG4rI2RlZmluZSBNUENfQ01QX1ZBTElEKGJwLCBtcGNtcCwgcmF3X2NvbnMpXHRcdFx0XHRcXFxuK1x0KCEhKChtcGNtcCktXHUwMDNlbXBjX2NtcF92IFx1MDAyNiBjcHVfdG9fbGUzMihNUENfQ01QX1YpKSA9PVx0XHRcXFxuK1x0ICEoKHJhd19jb25zKSBcdTAwMjYgKGJwKS1cdTAwM2VjcF9iaXQpKVxuK1xuKyNkZWZpbmUgQk5YVF9NUENfQ1JZUFRPX0NBUCAgICBcXFxuK1x0KEZVTkNfUUNBUFNfUkVTUF9NUENfQ0hOTFNfQ0FQX1RDRSB8IEZVTkNfUUNBUFNfUkVTUF9NUENfQ0hOTFNfQ0FQX1JDRSlcbitcbisjZGVmaW5lIEJOWFRfTVBDX0NSWVBUT19DQVBBQkxFKGJwKVx0XHRcdFx0XHRcXFxuK1x0KChicCktXHUwMDNlbXBjX2luZm8gP1x0XHRcdFx0XHRcdFxcXG4rXHQgKChicCktXHUwMDNlbXBjX2luZm8tXHUwMDNlbXBjX2NobmxzX2NhcCBcdTAwMjYgQk5YVF9NUENfQ1JZUFRPX0NBUCkgPT1cdFxcXG4rXHQgIEJOWFRfTVBDX0NSWVBUT19DQVAgOiBmYWxzZSlcbitcbisjaWZkZWYgQ09ORklHX0JOWFRfVExTXG4rdm9pZCBibnh0X2FsbG9jX21wY19pbmZvKHN0cnVjdCBibnh0ICpicCwgdTggbXBjX2NobmxzX2NhcCk7XG4rdm9pZCBibnh0X2ZyZWVfbXBjX2luZm8oc3RydWN0IGJueHQgKmJwKTtcbitpbnQgYm54dF9tcGNfdHhfcmluZ3NfaW5fdXNlKHN0cnVjdCBibnh0ICpicCk7XG4raW50IGJueHRfbXBjX2NwX3JpbmdzX2luX3VzZShzdHJ1Y3QgYm54dCAqYnApO1xuK2Jvb2wgYm54dF9uYXBpX2hhc19tcGMoc3RydWN0IGJueHQgKmJwLCBpbnQgaSk7XG4rdm9pZCBibnh0X3NldF9tcGNfY3BfcmluZyhzdHJ1Y3QgYm54dCAqYnAsIGludCBibmFwaV9pZHgsXG4rXHRcdFx0ICBzdHJ1Y3QgYm54dF9jcF9yaW5nX2luZm8gKmNwcik7XG4rdm9pZCBibnh0X3RyaW1fbXBjX3JpbmdzKHN0cnVjdCBibnh0ICpicCk7XG4rdm9pZCBibnh0X2NhbGNfZGZsdF9tcGNfcmluZ3Moc3RydWN0IGJueHQgKmJwLCBpbnQgdHhfbnJfcmluZ3MsXG4rXHRcdFx0ICAgICAgaW50IHR4X25yX3JpbmdzX3Blcl90YywgaW50IHJ4X25yX3JpbmdzLFxuK1x0XHRcdCAgICAgIGludCAqbXBjX3Blcl90eXBlLCBpbnQgKm1wY19jcCk7XG4rdm9pZCBibnh0X3NldF9kZmx0X21wY19yaW5ncyhzdHJ1Y3QgYm54dCAqYnApO1xuK3ZvaWQgYm54dF9pbml0X21wY19yaW5nX3N0cnVjdChzdHJ1Y3QgYm54dCAqYnApO1xuK2ludCBibnh0X2FsbG9jX21wY3Moc3RydWN0IGJueHQgKmJwKTtcbit2b2lkIGJueHRfZnJlZV9tcGNzKHN0cnVjdCBibnh0ICpicCk7XG4raW50IGJueHRfYWxsb2NfbXBjX3JpbmdzKHN0cnVjdCBibnh0ICpicCk7XG4rdm9pZCBibnh0X2ZyZWVfbXBjX3JpbmdzKHN0cnVjdCBibnh0ICpicCk7XG4rdm9pZCBibnh0X2luaXRfbXBjX3JpbmdzKHN0cnVjdCBibnh0ICpicCk7XG4raW50IGJueHRfaHdybV9tcGNfcmluZ19hbGxvYyhzdHJ1Y3QgYm54dCAqYnApO1xuK3ZvaWQgYm54dF9od3JtX21wY19yaW5nX2ZyZWUoc3RydWN0IGJueHQgKmJwLCBib29sIGNsb3NlX3BhdGgpO1xuK3N0cnVjdCBibnh0X3R4X3JpbmdfaW5mbyAqYm54dF9zZWxlY3RfbXBjX3Jpbmcoc3RydWN0IGJueHQgKmJwLCBpbnQgcmluZ190eXBlKTtcbitpbnQgYm54dF9zdGFydF94bWl0X21wYyhzdHJ1Y3QgYm54dCAqYnAsIHN0cnVjdCBibnh0X3R4X3JpbmdfaW5mbyAqdHhyLFxuK1x0XHRcdHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBsZW4sIHVuc2lnbmVkIGxvbmcgaGFuZGxlKTtcbit2b2lkIGJueHRfbXBjX3JpbmdfcmVzZXRfdGFzayhzdHJ1Y3QgYm54dCAqYnApO1xuK2ludCBibnh0X21wY190aW1lb3V0KHN0cnVjdCBibnh0ICpicCwgc3RydWN0IGJueHRfdHhfcmluZ19pbmZvICp0eHIpO1xuK2ludCBibnh0X21wY19jbXAoc3RydWN0IGJueHQgKmJwLCBzdHJ1Y3QgYm54dF9jcF9yaW5nX2luZm8gKmNwciwgdTMyICpyYXdfY29ucyk7XG4rI2Vsc2VcbitzdGF0aWMgaW5saW5lIHZvaWQgYm54dF9hbGxvY19tcGNfaW5mbyhzdHJ1Y3QgYm54dCAqYnAsIHU4IG1wY19jaG5sc19jYXApXG4re1xuK31cbitcbitzdGF0aWMgaW5saW5lIHZvaWQgYm54dF9mcmVlX21wY19pbmZvKHN0cnVjdCBibnh0ICpicClcbit7XG4rfVxuK1xuK3N0YXRpYyBpbmxpbmUgaW50IGJueHRfbXBjX3R4X3JpbmdzX2luX3VzZShzdHJ1Y3QgYm54dCAqYnApXG4re1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK3N0YXRpYyBpbmxpbmUgaW50IGJueHRfbXBjX2NwX3JpbmdzX2luX3VzZShzdHJ1Y3QgYm54dCAqYnApXG4re1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK3N0YXRpYyBpbmxpbmUgYm9vbCBibnh0X25hcGlfaGFzX21wYyhzdHJ1Y3QgYm54dCAqYnAsIGludCBpKVxuK3tcbitcdHJldHVybiBmYWxzZTtcbit9XG4rXG4rc3RhdGljIGlubGluZSB2b2lkIGJueHRfc2V0X21wY19jcF9yaW5nKHN0cnVjdCBibnh0ICpicCwgaW50IGJuYXBpX2lkeCxcbitcdFx0XHRcdFx0c3RydWN0IGJueHRfY3BfcmluZ19pbmZvICpjcHIpXG4re1xuK31cbitcbitzdGF0aWMgaW5saW5lIHZvaWQgYm54dF90cmltX21wY19yaW5ncyhzdHJ1Y3QgYm54dCAqYnApXG4re1xuK31cbitcbitzdGF0aWMgaW5saW5lIHZvaWQgYm54dF9jYWxjX2RmbHRfbXBjX3JpbmdzKHN0cnVjdCBibnh0ICpicCwgaW50IHR4X25yX3JpbmdzLFxuK1x0XHRcdFx0XHQgICAgaW50IHR4X25yX3JpbmdzX3Blcl90YyxcbitcdFx0XHRcdFx0ICAgIGludCByeF9ucl9yaW5ncywgaW50ICptcGNfcGVyX3R5cGUsXG4rXHRcdFx0XHRcdCAgICBpbnQgKm1wY19jcClcbit7XG4rXHQqbXBjX3Blcl90eXBlID0gMDtcbitcdCptcGNfY3AgPSAwO1xuK31cbitcbitzdGF0aWMgaW5saW5lIHZvaWQgYm54dF9zZXRfZGZsdF9tcGNfcmluZ3Moc3RydWN0IGJueHQgKmJwKVxuK3tcbit9XG4rXG4rc3RhdGljIGlubGluZSB2b2lkIGJueHRfaW5pdF9tcGNfcmluZ19zdHJ1Y3Qoc3RydWN0IGJueHQgKmJwKVxuK3tcbit9XG4rXG4rc3RhdGljIGlubGluZSBpbnQgYm54dF9hbGxvY19tcGNzKHN0cnVjdCBibnh0ICpicClcbit7XG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rc3RhdGljIGlubGluZSB2b2lkIGJueHRfZnJlZV9tcGNzKHN0cnVjdCBibnh0ICpicClcbit7XG4rfVxuK1xuK3N0YXRpYyBpbmxpbmUgaW50IGJueHRfYWxsb2NfbXBjX3JpbmdzKHN0cnVjdCBibnh0ICpicClcbit7XG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rc3RhdGljIGlubGluZSB2b2lkIGJueHRfZnJlZV9tcGNfcmluZ3Moc3RydWN0IGJueHQgKmJwKVxuK3tcbit9XG4rXG4rc3RhdGljIGlubGluZSB2b2lkIGJueHRfaW5pdF9tcGNfcmluZ3Moc3RydWN0IGJueHQgKmJwKVxuK3tcbit9XG4rXG4rc3RhdGljIGlubGluZSBpbnQgYm54dF9od3JtX21wY19yaW5nX2FsbG9jKHN0cnVjdCBibnh0ICpicClcbit7XG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rc3RhdGljIGlubGluZSB2b2lkIGJueHRfaHdybV9tcGNfcmluZ19mcmVlKHN0cnVjdCBibnh0ICpicCwgYm9vbCBjbG9zZV9wYXRoKVxuK3tcbit9XG4rXG4rc3RhdGljIGlubGluZSBzdHJ1Y3QgYm54dF90eF9yaW5nX2luZm8gKmJueHRfc2VsZWN0X21wY19yaW5nKHN0cnVjdCBibnh0ICpicCxcbitcdFx0XHRcdFx0XHRcdCAgICAgaW50IHJpbmdfdHlwZSlcbit7XG4rXHRyZXR1cm4gTlVMTDtcbit9XG4rXG4rc3RhdGljIGlubGluZSBpbnQgYm54dF9zdGFydF94bWl0X21wYyhzdHJ1Y3QgYm54dCAqYnAsXG4rXHRcdFx0XHQgICAgICBzdHJ1Y3QgYm54dF90eF9yaW5nX2luZm8gKnR4ciwgdm9pZCAqZGF0YSxcbitcdFx0XHRcdCAgICAgIHVuc2lnbmVkIGludCBsZW4sIHVuc2lnbmVkIGxvbmcgaGFuZGxlKVxuK3tcbitcdHJldHVybiAtRU9QTk9UU1VQUDtcbit9XG4rXG4rc3RhdGljIGlubGluZSB2b2lkIGJueHRfbXBjX3JpbmdfcmVzZXRfdGFzayhzdHJ1Y3QgYm54dCAqYnApXG4re1xuK31cbitcbitzdGF0aWMgaW5saW5lIGludCBibnh0X21wY190aW1lb3V0KHN0cnVjdCBibnh0ICpicCxcbitcdFx0XHRcdCAgIHN0cnVjdCBibnh0X3R4X3JpbmdfaW5mbyAqdHhyKVxuK3tcbitcdHJldHVybiAtRU9QTk9UU1VQUDtcbit9XG4rXG4rc3RhdGljIGlubGluZSBpbnQgYm54dF9tcGNfY21wKHN0cnVjdCBibnh0ICpicCwgc3RydWN0IGJueHRfY3BfcmluZ19pbmZvICpjcHIsXG4rXHRcdFx0ICAgICAgIHUzMiAqcmF3X2NvbnMpXG4re1xuK1x0cmV0dXJuIDA7XG4rfVxuKyNlbmRpZlx0LyogQ09ORklHX0JOWFRfVExTICovXG4rI2VuZGlmXHQvKiBCTlhUX01QQ19IICovXG5kaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9ibnh0X3NyaW92LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibnh0L2JueHRfc3Jpb3YuY1xuaW5kZXggZWRjYzAwMmU0Y2EzNTguLmQ1NzA1OTcyMmY1YmIwIDEwMDY0NFxuLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9ibnh0X3NyaW92LmNcbisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dF9zcmlvdi5jXG5AQCAtNjQwLDcgKzY0MCw3IEBAIHN0YXRpYyBpbnQgYm54dF9od3JtX2Z1bmNfdmZfcmVzY19jZmcoc3RydWN0IGJueHQgKmJwLCBpbnQgbnVtX3ZmcywgYm9vbCByZXNldClcbiBcdFx0dmZfcnhfcmluZ3MgPSBod19yZXNjLVx1MDAzZW1heF9yeF9yaW5ncyAtIGJwLVx1MDAzZXJ4X25yX3JpbmdzICogMjtcbiBcdGVsc2VcbiBcdFx0dmZfcnhfcmluZ3MgPSBod19yZXNjLVx1MDAzZW1heF9yeF9yaW5ncyAtIGJwLVx1MDAzZXJ4X25yX3JpbmdzO1xuLVx0dmZfdHhfcmluZ3MgPSBod19yZXNjLVx1MDAzZW1heF90eF9yaW5ncyAtIGJwLVx1MDAzZXR4X25yX3JpbmdzO1xuK1x0dmZfdHhfcmluZ3MgPSBod19yZXNjLVx1MDAzZW1heF90eF9yaW5ncyAtIGJueHRfdG90YWxfdHhfcmluZ3MoYnApO1xuIFx0dmZfdm5pY3MgPSBod19yZXNjLVx1MDAzZW1heF92bmljcyAtIGJwLVx1MDAzZW5yX3ZuaWNzO1xuIFx0dmZfcnNzID0gaHdfcmVzYy1cdTAwM2VtYXhfcnNzY29zX2N0eHMgLSBicC1cdTAwM2Vyc3Njb3NfbnJfY3R4cztcbiBcbkBAIC05MDMsOCArOTAzLDggQEAgc3RhdGljIGludCBibnh0X3NyaW92X2VuYWJsZShzdHJ1Y3QgYm54dCAqYnAsIGludCAqbnVtX3ZmcylcbiBcdFx0ICAgIGF2YWlsX2NwIFx1MDAzYyBtaW5fcnhfcmluZ3MpXG4gXHRcdFx0cnhfb2sgPSAwO1xuIFxuLVx0XHRpZiAoaHdfcmVzYy1cdTAwM2VtYXhfdHhfcmluZ3MgLSBicC1cdTAwM2V0eF9ucl9yaW5ncyBcdTAwM2U9IG1pbl90eF9yaW5ncyBcdTAwMjZcdTAwMjZcbi1cdFx0ICAgIGF2YWlsX2NwIFx1MDAzZT0gbWluX3R4X3JpbmdzKVxuK1x0XHRpZiAoaHdfcmVzYy1cdTAwM2VtYXhfdHhfcmluZ3MgLSBibnh0X3RvdGFsX3R4X3JpbmdzKGJwKSBcdTAwM2U9XG4rXHRcdCAgICBtaW5fdHhfcmluZ3MgXHUwMDI2XHUwMDI2IGF2YWlsX2NwIFx1MDAzZT0gbWluX3R4X3JpbmdzKVxuIFx0XHRcdHR4X29rID0gMTtcbiBcbiBcdFx0aWYgKGh3X3Jlc2MtXHUwMDNlbWF4X3Jzc2Nvc19jdHhzIC0gYnAtXHUwMDNlcnNzY29zX25yX2N0eHMgXHUwMDNlPVxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dF94ZHAuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dF94ZHAuY1xuaW5kZXggOWU1MDA5YmU4ZTk4OTguLmQxODczMTI0ODkzYTVmIDEwMDY0NFxuLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9ibnh0X3hkcC5jXG4rKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibnh0L2JueHRfeGRwLmNcbkBAIC0xOSw2ICsxOSw3IEBAXG4gI2luY2x1ZGUgXHUwMDNjbmV0L3BhZ2VfcG9vbC9oZWxwZXJzLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9ibnh0L2hzaS5oXHUwMDNlXG4gI2luY2x1ZGUgXCJibnh0LmhcIlxuKyNpbmNsdWRlIFwiYm54dF9tcGMuaFwiXG4gI2luY2x1ZGUgXCJibnh0X3hkcC5oXCJcbiBcbiBERUZJTkVfU1RBVElDX0tFWV9GQUxTRShibnh0X3hkcF9sb2NraW5nX2tleSk7XG5AQCAtMzUxLDcgKzM1Miw3IEBAIGludCBibnh0X3hkcF94bWl0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBudW1fZnJhbWVzLFxuIFx0XHRyZXR1cm4gLUVJTlZBTDtcbiBcbiBcdGlmIChzdGF0aWNfYnJhbmNoX3VubGlrZWx5KFx1MDAyNmJueHRfeGRwX2xvY2tpbmdfa2V5KSlcbi1cdFx0c3Bpbl9sb2NrKFx1MDAyNnR4ci1cdTAwM2V4ZHBfdHhfbG9jayk7XG4rXHRcdHNwaW5fbG9jayhcdTAwMjZ0eHItXHUwMDNldHhfbG9jayk7XG4gXG4gXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBudW1fZnJhbWVzOyBpKyspIHtcbiBcdFx0c3RydWN0IHhkcF9mcmFtZSAqeGRwID0gZnJhbWVzW2ldO1xuQEAgLTM3Niw3ICszNzcsNyBAQCBpbnQgYm54dF94ZHBfeG1pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbnVtX2ZyYW1lcyxcbiBcdH1cbiBcbiBcdGlmIChzdGF0aWNfYnJhbmNoX3VubGlrZWx5KFx1MDAyNmJueHRfeGRwX2xvY2tpbmdfa2V5KSlcbi1cdFx0c3Bpbl91bmxvY2soXHUwMDI2dHhyLVx1MDAzZXhkcF90eF9sb2NrKTtcbitcdFx0c3Bpbl91bmxvY2soXHUwMDI2dHhyLVx1MDAzZXR4X2xvY2spO1xuIFxuIFx0cmV0dXJuIG54bWl0O1xuIH1cbkBAIC00MTAsNyArNDExLDggQEAgc3RhdGljIGludCBibnh0X3hkcF9zZXQoc3RydWN0IGJueHQgKmJwLCBzdHJ1Y3QgYnBmX3Byb2cgKnByb2cpXG4gXHRpZiAoIXRjKVxuIFx0XHR0YyA9IDE7XG4gXHRyYyA9IGJueHRfY2hlY2tfcmluZ3MoYnAsIGJwLVx1MDAzZXR4X25yX3JpbmdzX3Blcl90YywgYnAtXHUwMDNlcnhfbnJfcmluZ3MsXG4tXHRcdFx0ICAgICAgdHJ1ZSwgdGMsIHR4X3hkcCk7XG4rXHRcdFx0ICAgICAgdHJ1ZSwgdGMsIHR4X3hkcCwgYm54dF9tcGNfdHhfcmluZ3NfaW5fdXNlKGJwKSxcbitcdFx0XHQgICAgICBibnh0X21wY19jcF9yaW5nc19pbl91c2UoYnApKTtcbiBcdGlmIChyYykge1xuIFx0XHRuZXRkZXZfd2FybihkZXYsIFwiVW5hYmxlIHRvIHJlc2VydmUgZW5vdWdoIFRYIHJpbmdzIHRvIHN1cHBvcnQgWERQLlxcblwiKTtcbiBcdFx0cmV0dXJuIHJjO1xuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYm54dC9oc2kuaCBiL2luY2x1ZGUvbGludXgvYm54dC9oc2kuaFxuaW5kZXggNzRhNmJmMjc4ZDg4OGMuLjAzNDQ0YjgxYmViMGYzIDEwMDY0NFxuLS0tIGEvaW5jbHVkZS9saW51eC9ibnh0L2hzaS5oXG4rKysgYi9pbmNsdWRlL2xpbnV4L2JueHQvaHNpLmhcbkBAIC0zODM3LDYgKzM4MzcsNDMgQEAgc3RydWN0IGh3cm1fZnVuY19wdHBfZXh0X3FjZmdfb3V0cHV0IHtcbiBcdHU4XHR2YWxpZDtcbiB9O1xuIFxuKy8qIGh3cm1fZnVuY19rZXlfY3R4X2FsbG9jX2lucHV0IChzaXplOjM4NGIvNDhCKSAqL1xuK3N0cnVjdCBod3JtX2Z1bmNfa2V5X2N0eF9hbGxvY19pbnB1dCB7XG4rXHRfX2xlMTZcdHJlcV90eXBlO1xuK1x0X19sZTE2XHRjbXBsX3Jpbmc7XG4rXHRfX2xlMTZcdHNlcV9pZDtcbitcdF9fbGUxNlx0dGFyZ2V0X2lkO1xuK1x0X19sZTY0XHRyZXNwX2FkZHI7XG4rXHRfX2xlMTZcdGZpZDtcbitcdF9fbGUxNlx0bnVtX2tleV9jdHhzO1xuK1x0X19sZTMyXHRkbWFfYnVmcl9zaXplX2J5dGVzO1xuK1x0dThcdGtleV9jdHhfdHlwZTtcbitcdCNkZWZpbmUgRlVOQ19LRVlfQ1RYX0FMTE9DX1JFUV9LRVlfQ1RYX1RZUEVfVFggICAgICAweDBVTFxuK1x0I2RlZmluZSBGVU5DX0tFWV9DVFhfQUxMT0NfUkVRX0tFWV9DVFhfVFlQRV9SWCAgICAgIDB4MVVMXG4rXHQjZGVmaW5lIEZVTkNfS0VZX0NUWF9BTExPQ19SRVFfS0VZX0NUWF9UWVBFX1FVSUNfVFggMHgyVUxcbitcdCNkZWZpbmUgRlVOQ19LRVlfQ1RYX0FMTE9DX1JFUV9LRVlfQ1RYX1RZUEVfUVVJQ19SWCAweDNVTFxuK1x0I2RlZmluZSBGVU5DX0tFWV9DVFhfQUxMT0NfUkVRX0tFWV9DVFhfVFlQRV9MQVNUICAgRlVOQ19LRVlfQ1RYX0FMTE9DX1JFUV9LRVlfQ1RYX1RZUEVfUVVJQ19SWFxuK1x0dThcdHVudXNlZF8wWzddO1xuK1x0X19sZTY0XHRob3N0X2RtYV9hZGRyO1xuK1x0X19sZTMyXHRwYXJ0aXRpb25fc3RhcnRfeGlkO1xuK1x0dThcdHVudXNlZF8xWzRdO1xuK307XG4rXG4rLyogaHdybV9mdW5jX2tleV9jdHhfYWxsb2Nfb3V0cHV0IChzaXplOjE5MmIvMjRCKSAqL1xuK3N0cnVjdCBod3JtX2Z1bmNfa2V5X2N0eF9hbGxvY19vdXRwdXQge1xuK1x0X19sZTE2XHRlcnJvcl9jb2RlO1xuK1x0X19sZTE2XHRyZXFfdHlwZTtcbitcdF9fbGUxNlx0c2VxX2lkO1xuK1x0X19sZTE2XHRyZXNwX2xlbjtcbitcdF9fbGUxNlx0bnVtX2tleV9jdHhzX2FsbG9jYXRlZDtcbitcdHU4XHRmbGFncztcbitcdCNkZWZpbmUgRlVOQ19LRVlfQ1RYX0FMTE9DX1JFU1BfRkxBR1NfS0VZX0NUWFNfQ09OVElHVU9VUyAgICAgMHgxVUxcbitcdHU4XHR1bnVzZWRfMDtcbitcdF9fbGUzMlx0cGFydGl0aW9uX3N0YXJ0X3hpZDtcbitcdHU4XHR1bnVzZWRfMVs3XTtcbitcdHU4XHR2YWxpZDtcbit9O1xuK1xuIC8qIGh3cm1fZnVuY19iYWNraW5nX3N0b3JlX2NmZ192Ml9pbnB1dCAoc2l6ZTo1MTJiLzY0QikgKi9cbiBzdHJ1Y3QgaHdybV9mdW5jX2JhY2tpbmdfc3RvcmVfY2ZnX3YyX2lucHV0IHtcbiBcdF9fbGUxNlx0cmVxX3R5cGU7XG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0xMVQwMjowNTo1Ny43NDU5MzM5NjZaIiwiU2VxIjozLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxOTgxMzUwMzk4NywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXNpcyBvZiB0aGUgYm54dCBUTFMgT2ZmbG9hZCBQYXRjaCoqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggZm9yIFRMUyBvZmZsb2FkIHN1cHBvcnQgaW4gdGhlIEJyb2FkY29tIE5ldFh0cmVtZS1DL0UgKGBibnh0YCkgZHJpdmVyLiBNeSBpbml0aWFsIHRob3VnaHQgaXMgdG8gZmlndXJlIG91dCBpZiBpdCdzIGV2ZW4gKnJlYWNoYWJsZSogaW4gYSBmdXp6aW5nIGNvbnRleHQuIFdlJ3JlIHRhbGtpbmcgYWJvdXQga1RMUyBvZmZsb2FkIGhlcmUsIGFuZCB0aGF0IGdldHMgbWUgdGhpbmtpbmcgYWJvdXQgdmlydHVhbGl6YXRpb24sIHdoaWNoIGlzIGNydWNpYWwgZm9yIG15IHdvcmsuXG5cbkZpcnN0LCBpdCBhZGRzIGEgYEJOWFRfVExTYCBLY29uZmlnIG9wdGlvbiwgd2hpY2ggbWFrZXMgbWUgY2hlY2sgaWYgdGhlIHJlcXVpcmVkIGBCTlhUYCBhbmQgYFRMU19ERVZJQ0VgIGFyZSBwcmVzZW50IGFuZCB0aGUgc3RhdGUgb2YgYFRMU2AgYW5kIGBCTlhUYCBLY29uZmlncy4gSXQgYWxzbyBhZGRzIHNldmVyYWwgbmV3IGZpbGVzIGFuZCBtb2RpZmllcyBleGlzdGluZyBvbmVzIHdpdGhpbiB0aGUgYGJueHRgIGRyaXZlci5cblxuVGhlIGNvcmUgcXVlc3Rpb24gaXMgcmVhY2hhYmlsaXR5LiBUaGlzIGRyaXZlciBpcyBmb3IgYSAqc3BlY2lmaWMqIEJyb2FkY29tIGhhcmR3YXJlLiBTeXprYWxsZXIsIG15IG1haW4gdG9vbCwgZG9lc24ndCBuYXRpdmVseSBlbXVsYXRlIHRoaXMsIGFuZCBteSBndXQgZmVlbGluZyB0ZWxscyBtZSB0aGlzIGlzIGdvaW5nIHRvIGJlIGEgcHJvYmxlbS4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRoYXQgdW5sZXNzIHRoZXJlJ3MgYW4gZW11bGF0ZWQgZGV2aWNlIGF2YWlsYWJsZSAobGlrZSB3aXRoIFFFTVUpLCBpdCdzIGEgbm9uLXN0YXJ0ZXIuIEJ1dCwgaXMgaXQgcG9zc2libGUgdG8gcmVhY2ggdGhlIGRyaXZlciB0aHJvdWdoIGZ1enppbmcgdGhlIFBDSSBidXM/IFRoZSBzeXprYWxsZXIgUENJIGZ1enplciBjYW4gc2ltdWxhdGUgUENJIGRldmljZXMuXG5cbkkgaGF2ZSB0byBjb25zaWRlciB0aGUgcHJvbXB0J3MgaW5zdHJ1Y3Rpb25zOiAgXCJDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzLi4uIGFyZSBub3Qgd29ydGggZnV6emluZy5cIiBTbywgSSBuZWVkIHRvIHNlZSBpZiB0aGVyZSBpcyBhbiBlbXVsYXRvci4gTG9va2luZyBmb3IgYGJueHRgIGluIFFFTVUgaXNuJ3QgZnJ1aXRmdWwsIGFuZCB0aGUgZG9jdW1lbnRhdGlvbiBjb25maXJtcyB0aGlzIGlzIGEgUENJIGRyaXZlci5cblxuVGhlIHN5emthbGxlciBQQ0kgZnV6emVyIGRvZXMgZXhpc3QgKGBzeXpfcGNpX2RldmljZWApLCB3aGljaCBpbml0aWFsbHkgZ2l2ZXMgbWUgYSBnbGltbWVyIG9mIGhvcGUuIEJ1dCwgY2FuIGl0IHJlYWNoICpkZWVwKiBpbnRvIHRoZSBkcml2ZXIncyBkYXRhIHBhdGg/IENhbiB0aGUgUENJIGZ1enplciBwcm9wZXJseSBlbXVsYXRlIHRoZSBjb21wbGV4IGZpcm13YXJlIGludGVyYWN0aW9ucyByZXF1aXJlZCB0byBwcm9iZSB0aGUgYGJueHRgIGRldmljZT8gTXkgZXhwZXJ0IGtub3dsZWRnZSBhbmQgZXhwZXJpZW5jZSB0ZWxsIG1lIHRoYXQgZ2V0dGluZyBiZXlvbmQgYmFzaWMgZGV2aWNlIHByb2JlIGlzIGEgbG9uZyBzaG90LiAgYGJueHRgIHJlbGllcyBvbiBpdHMgSGFyZHdhcmUgUmVzb3VyY2UgTWFuYWdlciAoSFdSTSksIHdoaWNoIGlzIGFuIGV4dHJlbWVseSBjb21wbGljYXRlZCBmaXJtd2FyZSBpbnRlcmZhY2UuXG5cbk9rYXksIGxldCdzIHN0ZXAgYmFjay4gRG9lcyB0aGlzIHBhdGNoIGNoYW5nZSBjb3JlIGtlcm5lbCBsb2dpYz8gTm8uIEl0J3MgY29uZmluZWQgdG8gdGhlIGRyaXZlciBhbmQgaXRzIGRlcGVuZGVuY2llcy4gQXJlIHRoZXJlIGFueSBvdGhlciBhdmVudWVzIGZvciByZWFjaGluZyB0aGlzIGNvZGU/IE5vLCBJIGFtIHNlZWluZyB0aGF0IGl0IGlzIG9ubHkgYSBwaHlzaWNhbCBOSUMuICBJJ3ZlIGNoZWNrZWQsIGFuZCB0aGlzIGlzbid0IGEgdmlydHVhbCBkZXZpY2Ugd2l0aCBhIGR1bW15IG9yIHZldGggbW9kZS5cblxuU28sIEknbSBjb25jbHVkaW5nIHRoaXMgdGhlIGRhdGEgcGF0aCwgaW5jbHVkaW5nIHRoZSBjcml0aWNhbCBwYXJ0cyBvZiBgYm54dF9rdGxzLmNgLCBgYm54dF9jcnlwdG8uY2AsIGFuZCBgYm54dF9tcGMuY2AgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggYmVjYXVzZSBvZiB0aGUgbGFjayBvZiBlbXVsYXRpb24gYW5kIGhhcmR3YXJlIGRlcGVuZGVuY3kuXG5cbkkgbmVlZCB0byBjb25maXJtIGlmIGFueXRoaW5nIGVsc2UgZGlzcXVhbGlmaWVzIGl0LCBsaWtlIG1vZGlmaWNhdGlvbnMgdG8gZG9jdW1lbnRhdGlvbiwgS2NvbmZpZyBmaWxlcywgb3IgY29tbWVudHMuIFRoZSBwYXRjaCBvbmx5IGNoYW5nZXMgYGRyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL0tjb25maWdgLCBkcml2ZXIgZmlsZXMsIGFuZCBhbiBpbmNsdWRlIGZpbGUuIE5vIGNvcmUga2VybmVsIGNoYW5nZXMuXG5cbkJhc2VkIG9uIHRoaXMsIGFuZCB0aGUgcHJvbXB0J3MgZXhwbGljaXQgZ3VpZGFuY2UsIEknbSBjb25maWRlbnQgaW4gcmV0dXJuaW5nIGBXb3J0aEZ1enppbmc9ZmFsc2VgLiBUaGUgUmVhc29uaW5nIEknbGwgZ2l2ZSBpcyB0aGlzOiBcIlRoZSBwYXRjaCBhZGRzIGtUTFMgb2ZmbG9hZCBzdXBwb3J0IHRvIHRoZSBCcm9hZGNvbSBOZXRYdHJlbWUtQy9FIChibnh0KSBFdGhlcm5ldCBkcml2ZXIuIFNpbmNlIHRoaXMgaXMgYSBoYXJkd2FyZS1zcGVjaWZpYyBQQ0kgZHJpdmVyIHRoYXQgcmVxdWlyZXMgY29tcGxleCBmaXJtd2FyZSAoSFdSTSkgaW50ZXJhY3Rpb25zIHRvIGluaXRpYWxpemUgYW5kIGJyaW5nIHVwIHRoZSBuZXR3b3JrIGRldmljZSwgaXQgaXMgaW1wb3NzaWJsZSB0byByZWFjaCB0aGUgbW9kaWZpZWQgZGF0YSBwYXRoIGFuZCBUTFMgb2ZmbG9hZCBsb2dpYyBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgd2l0aG91dCBhIGRlZGljYXRlZCBzb2Z0d2FyZSBlbXVsYXRvci4gVGhlcmVmb3JlLCB0aGlzIGNvZGUgY2Fubm90IGJlIG1lYW5pbmdmdWxseSBmdXp6ZWQuXCIgVGhlIHByb21wdCBpcyBhc2tpbmcgaWYgdGhlIGNvZGUgaXMgdW5yZWFjaGFibGUgaW4gUUVNVSBvciBzaW1pbGFyIGVudmlyb25tZW50cywgYW5kIEkgaGF2ZSBjb25maXJtZWQgaXQncyBwcmFjdGljYWxseSBpbXBvc3NpYmxlIHRvIHJlYWNoIHRoZSBkZWVwIGRhdGEgcGF0aHMgYW5kIFRMUyBvZmZsb2FkIHdpdGhvdXQgYSBjb21wbGV4IGVtdWxhdG9yIHRoYXQgZG9lcyBub3QgZXhpc3QuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjU4ODgxLCJPdXRwdXRUb2tlbnMiOjEyMCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE2MzgsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0xMVQwMjowNjoxNy41NTk0NDEzOTNaIiwiU2VxIjo0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjI4NzMwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW10sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGFkZHMga1RMUyBvZmZsb2FkIHN1cHBvcnQgdG8gdGhlIEJyb2FkY29tIE5ldFh0cmVtZS1DL0UgKGJueHQpIEV0aGVybmV0IGRyaXZlci4gU2luY2UgdGhpcyBpcyBhIGhhcmR3YXJlLXNwZWNpZmljIFBDSSBkcml2ZXIgdGhhdCByZXF1aXJlcyBjb21wbGV4IGZpcm13YXJlIChIV1JNKSBpbnRlcmFjdGlvbnMgdG8gaW5pdGlhbGl6ZSBhbmQgYnJpbmcgdXAgdGhlIG5ldHdvcmsgZGV2aWNlLCBpdCBpcyBpbXBvc3NpYmxlIHRvIHJlYWNoIHRoZSBtb2RpZmllZCBkYXRhIHBhdGggYW5kIFRMUyBvZmZsb2FkIGxvZ2ljIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyB3aXRob3V0IGEgZGVkaWNhdGVkIHNvZnR3YXJlIGVtdWxhdG9yLiBUaGVyZWZvcmUsIHRoaXMgY29kZSBjYW5ub3QgYmUgbWVhbmluZ2Z1bGx5IGZ1enplZC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogZmFsc2Vcbn0iLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogbnVsbCxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW10sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGFkZHMga1RMUyBvZmZsb2FkIHN1cHBvcnQgdG8gdGhlIEJyb2FkY29tIE5ldFh0cmVtZS1DL0UgKGJueHQpIEV0aGVybmV0IGRyaXZlci4gU2luY2UgdGhpcyBpcyBhIGhhcmR3YXJlLXNwZWNpZmljIFBDSSBkcml2ZXIgdGhhdCByZXF1aXJlcyBjb21wbGV4IGZpcm13YXJlIChIV1JNKSBpbnRlcmFjdGlvbnMgdG8gaW5pdGlhbGl6ZSBhbmQgYnJpbmcgdXAgdGhlIG5ldHdvcmsgZGV2aWNlLCBpdCBpcyBpbXBvc3NpYmxlIHRvIHJlYWNoIHRoZSBtb2RpZmllZCBkYXRhIHBhdGggYW5kIFRMUyBvZmZsb2FkIGxvZ2ljIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyB3aXRob3V0IGEgZGVkaWNhdGVkIHNvZnR3YXJlIGVtdWxhdG9yLiBUaGVyZWZvcmUsIHRoaXMgY29kZSBjYW5ub3QgYmUgbWVhbmluZ2Z1bGx5IGZ1enplZC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0udG9rZW5zIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnVG9vbER1ciA9IHN0YXRzLnRvb2wuY291bnQgPiAwID8gKHN0YXRzLnRvb2wuZHVyYXRpb24gLyBzdGF0cy50b29sLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCgkJCWNvbnN0IGxsbVN1bWFyeUNlbGxzID0gW3N0YXRzLmxsbS5jb3VudCwgc3RhdHMubGxtLnRva2VucywgYXZnTGxtVG9rZW4sIHN0YXRzLmxsbS5kdXJhdGlvbiwgYXZnTGxtRHVyXTsKCQkJY29uc3QgdG9vbFN1bW1hcnlDZWxscyA9IFtzdGF0cy50b29sLmNvdW50LCBzdGF0cy50b29sLmR1cmF0aW9uLCBhdmdUb29sRHVyXTsKCgkJCWNvbnN0IGxsbVN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbV9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJbGxtU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IGxsbVRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJbGxtU3VtYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCWxsbVRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCWxsbVN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKGxsbVRyKTsKCgkJCWNvbnN0IHRvb2xTdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b29sX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQl0b29sU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IHRvb2xUciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCXRvb2xTdW1tYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCXRvb2xUci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQl0b29sU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQodG9vbFRyKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgZmlsdGVyZWRTdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gWyJsbG0iLCAidG9vbCJdLmluY2x1ZGVzKGQuVHlwZSkpOwoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdEdXJhdGlvbicpOwoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOyAKCgkJCWZpbHRlcmVkU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCQoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7CgkJCQlsZXQgdG9vbHRpcCA9IHMuTmFtZTsKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iICYmIHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCQkJCWRhdGEuYWRkUm93KFtgJHtzLlNlcX1gLCBkdXIsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUaW1lIENvbnN1bXB0aW9uIG9mIExMTS9Ub29sIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0vVG9vbCBTdGVwcycsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdTZWNvbmRzJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkdXJhdGlvbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgbGxtU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IGQuVHlwZSA9PT0gImxsbSIpOwoJCQlpZiAobGxtU3RlcHMubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdUb2tlbnMnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAnc3R5bGUnfSk7CQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOwkKCgkJCWNvbnN0IGFnZW50Q29sb3JzID0ge307CgkJCWNvbnN0IHBhbGV0dGUgPSBbJyM0Mjg1RjQnLCAnI0RCNDQzNycsICcjRjRCNDAwJywgJyMwRjlENTgnLCAnI0FCNDdCQycsICcjMDBBQ0MxJ107CgkJCWxldCBjb2xvcklkeCA9IDA7CgkJCWNvbnN0IGFnZW50TExNQ291bnRzID0ge307CgkJCWxsbVN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQlpZiAoIWFnZW50Q29sb3JzW3MuTmFtZV0pIHsKCQkJCQlhZ2VudENvbG9yc1tzLk5hbWVdID0gcGFsZXR0ZVtjb2xvcklkeCAlIHBhbGV0dGUubGVuZ3RoXTsKCQkJCQljb2xvcklkeCsrOwoJCQkJfQoKCQkJCWFnZW50TExNQ291bnRzW3MuTmFtZV0gPSAoYWdlbnRMTE1Db3VudHNbcy5OYW1lXSB8fCAwKSArIDE7CgkJCQljb25zdCBsYWJlbCA9IGAke3MuTmFtZX0tJHthZ2VudExMTUNvdW50c1tzLk5hbWVdfWA7CgkJCQljb25zdCB0b3RhbFRva2VucyA9IHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnM7CgkJCQljb25zdCBzdHlsZSA9IGBjb2xvcjogJHthZ2VudENvbG9yc1tzLk5hbWVdfWA7CgkJCQlsZXQgdG9vbHRpcCA9IGBUb3RhbCBUb2tlbnM6ICR7dG90YWxUb2tlbnN9XG4oSW46ICR7cy5JbnB1dFRva2Vuc30sIE91dDogJHtzLk91dHB1dFRva2Vuc30sIFRob3VnaHRzOiAke3MuT3V0cHV0VGhvdWdodHNUb2tlbnN9KWA7CgkJCQlpZiAocy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoKCQkJCWRhdGEuYWRkUm93KFtsYWJlbCwgdG90YWxUb2tlbnMsIHN0eWxlLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVG9rZW4gQ29uc3VtcHRpb24gYnkgTExNIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0gQ2FsbCBTZXF1ZW5jZScsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdDb25zdW1lZCBUb2tlbnMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rva2VuX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgkJbGV0IGFsbEV4cGFuZGVkID0gZmFsc2U7CgkJZnVuY3Rpb24gdG9nZ2xlQWxsRGV0YWlscygpIHsKCQkJYWxsRXhwYW5kZWQgPSAhYWxsRXhwYW5kZWQ7CgkJCWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2RldGFpbHMnKS5mb3JFYWNoKGQgPT4gewoJCQkJaWYgKGFsbEV4cGFuZGVkKSBkLnNldEF0dHJpYnV0ZSgnb3BlbicsICcnKTsKCQkJCWVsc2UgZC5yZW1vdmVBdHRyaWJ1dGUoJ29wZW4nKTsKCQkJfSk7CgkJfQoJPC9zY3JpcHQ+CgoKPC9ib2R5Pgo8L2h0bWw+Cg==" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,}